pax_global_header00006660000000000000000000000064152172337210014515gustar00rootroot0000000000000052 comment=9b7ee8ec8c06e8f35a9e7fb437c6fb2f552108bf pydantic-httpx2-9b7ee8e/000077500000000000000000000000001521723372100152715ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/.github/000077500000000000000000000000001521723372100166315ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/.github/CONTRIBUTING.md000066400000000000000000000200261521723372100210620ustar00rootroot00000000000000# Contributing Thank you for being interested in contributing to HTTPX. There are many ways you can contribute to the project: - Try HTTPX and [report bugs/issues you find](https://github.com/encode/httpx/issues/new) - [Implement new features](https://github.com/encode/httpx/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) - [Review Pull Requests of others](https://github.com/encode/httpx/pulls) - Write documentation - Participate in discussions ## Reporting Bugs or Other Issues Found something that HTTPX should support? Stumbled upon some unexpected behaviour? Contributions should generally start out with [a discussion](https://github.com/encode/httpx/discussions). Possible bugs may be raised as a "Potential Issue" discussion, feature requests may be raised as an "Ideas" discussion. We can then determine if the discussion needs to be escalated into an "Issue" or not, or if we'd consider a pull request. Try to be more descriptive as you can and in case of a bug report, provide as much information as possible like: - OS platform - Python version - Installed dependencies and versions (`python -m pip freeze`) - Code snippet - Error traceback You should always try to reduce any examples to the *simplest possible case* that demonstrates the issue. Some possibly useful tips for narrowing down potential issues... - Does the issue exist on HTTP/1.1, or HTTP/2, or both? - Does the issue exist with `Client`, `AsyncClient`, or both? - When using `AsyncClient` does the issue exist when using `asyncio` or `trio`, or both? ## Development To start developing HTTPX create a **fork** of the [HTTPX repository](https://github.com/encode/httpx) on GitHub. Then clone your fork with the following command replacing `YOUR-USERNAME` with your GitHub username: ```shell $ git clone https://github.com/YOUR-USERNAME/httpx ``` You can now install the project and its dependencies using: ```shell $ cd httpx $ scripts/install ``` ## Testing and Linting We use custom shell scripts to automate testing, linting, and documentation building workflow. To run the tests, use: ```shell $ scripts/test ``` You can run a single test script like this: ```shell $ scripts/test -- tests/test_multipart.py ``` To run the code auto-formatting: ```shell $ scripts/lint ``` Lastly, to run code checks separately (they are also run as part of `scripts/test`), run: ```shell $ scripts/check ``` ## Documenting Documentation pages are located under the `docs/` folder. To run the documentation site locally (useful for previewing changes), use: ```shell $ scripts/docs ``` ## Resolving Build / CI Failures Once you've submitted your pull request, the test suite will automatically run, and the results will show up in GitHub. If the test suite fails, you'll want to click through to the "Details" link, and try to identify why the test suite failed.

Failing PR commit status

Here are some common ways the test suite can fail: ### Check Job Failed

Failing GitHub action lint job

This job failing means there is either a code formatting issue or type-annotation issue. You can look at the job output to figure out why it's failed or within a shell run: ```shell $ scripts/check ``` It may be worth it to run `$ scripts/lint` to attempt auto-formatting the code and if that job succeeds commit the changes. ### Docs Job Failed This job failing means the documentation failed to build. This can happen for a variety of reasons like invalid markdown or missing configuration within `mkdocs.yml`. ### Python 3.X Job Failed

Failing GitHub action test job

This job failing means the unit tests failed or not all code paths are covered by unit tests. If tests are failing you will see this message under the coverage report: `=== 1 failed, 435 passed, 1 skipped, 1 xfailed in 11.09s ===` If tests succeed but coverage doesn't reach our current threshold, you will see this message under the coverage report: `FAIL Required test coverage of 100% not reached. Total coverage: 99.00%` ## Releasing *This section is targeted at HTTPX maintainers.* Before releasing a new version, create a pull request that includes: - **An update to the changelog**: - We follow the format from [keepachangelog](https://keepachangelog.com/en/1.0.0/). - [Compare](https://github.com/encode/httpx/compare/) `master` with the tag of the latest release, and list all entries that are of interest to our users: - Things that **must** go in the changelog: added, changed, deprecated or removed features, and bug fixes. - Things that **should not** go in the changelog: changes to documentation, tests or tooling. - Try sorting entries in descending order of impact / importance. - Keep it concise and to-the-point. 🎯 - **A version bump**: see `__version__.py`. For an example, see [#1006](https://github.com/encode/httpx/pull/1006). Once the release PR is merged, create a [new release](https://github.com/encode/httpx/releases/new) including: - Tag version like `0.13.3`. - Release title `Version 0.13.3` - Description copied from the changelog. Once created this release will be automatically uploaded to PyPI. If something goes wrong with the PyPI job the release can be published using the `scripts/publish` script. ## Development proxy setup To test and debug requests via a proxy it's best to run a proxy server locally. Any server should do but HTTPCore's test suite uses [`mitmproxy`](https://mitmproxy.org/) which is written in Python, it's fully featured and has excellent UI and tools for introspection of requests. You can install `mitmproxy` using `pip install mitmproxy` or [several other ways](https://docs.mitmproxy.org/stable/overview-installation/). `mitmproxy` does require setting up local TLS certificates for HTTPS requests, as its main purpose is to allow developers to inspect requests that pass through it. We can set them up follows: 1. [`pip install trustme-cli`](https://github.com/sethmlarson/trustme-cli/). 2. `trustme-cli -i example.org www.example.org`, assuming you want to test connecting to that domain, this will create three files: `server.pem`, `server.key` and `client.pem`. 3. `mitmproxy` requires a PEM file that includes the private key and the certificate so we need to concatenate them: `cat server.key server.pem > server.withkey.pem`. 4. Start the proxy server `mitmproxy --certs server.withkey.pem`, or use the [other mitmproxy commands](https://docs.mitmproxy.org/stable/) with different UI options. At this point the server is ready to start serving requests, you'll need to configure HTTPX as described in the [proxy section](https://httpx2.pydantic.dev/advanced/#http-proxying) and the [SSL certificates section](https://httpx2.pydantic.dev/advanced/#ssl-certificates), this is where our previously generated `client.pem` comes in: ``` import httpx ssl_context = httpx.SSLContext() ssl_context.load_verify_locations("/path/to/client.pem") with httpx.Client(proxy="http://127.0.0.1:8080/", ssl_context=ssl_context) as client: response = client.get("https://example.org") print(response.status_code) # should print 200 ``` Note, however, that HTTPS requests will only succeed to the host specified in the SSL/TLS certificate we generated, HTTPS requests to other hosts will raise an error like: ``` ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'duckduckgo.com'. (_ssl.c:1108) ``` If you want to make requests to more hosts you'll need to regenerate the certificates and include all the hosts you intend to connect to in the seconds step, i.e. `trustme-cli -i example.org www.example.org duckduckgo.com www.duckduckgo.com` pydantic-httpx2-9b7ee8e/.github/ISSUE_TEMPLATE/000077500000000000000000000000001521723372100210145ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/.github/ISSUE_TEMPLATE/1-issue.md000066400000000000000000000011171521723372100226240ustar00rootroot00000000000000--- name: Issue about: Please only raise an issue if you've been advised to do so after discussion. Thanks! πŸ™ --- The starting point for issues should usually be a discussion... https://github.com/pydantic/httpx2/discussions Possible bugs may be raised as a "Potential Issue" discussion, feature requests may be raised as an "Ideas" discussion. We can then determine if the discussion needs to be escalated into an "Issue" or not. This will help us ensure that the "Issues" list properly reflects ongoing or needed work on the project. --- - [ ] Initially raised as discussion #... pydantic-httpx2-9b7ee8e/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000007731521723372100230130ustar00rootroot00000000000000# Ref: https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository#configuring-the-template-chooser blank_issues_enabled: false contact_links: - name: Discussions url: https://github.com/pydantic/httpx2/discussions about: > The "Discussions" forum is where you want to start. πŸ’– - name: πŸ’¬ Join Slack url: https://logfire.pydantic.dev/docs/join-slack/ about: > Join our Slack community to ask questions, get help, and chat about HTTPX2. pydantic-httpx2-9b7ee8e/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000010401521723372100224250ustar00rootroot00000000000000 # Summary # Checklist - [ ] I understand that this PR may be closed in case there was no previous discussion. (This doesn't apply to typos!) - [ ] I've added a test for each change that was introduced, and I tried as much as possible to make a single atomic change. - [ ] I've updated the documentation accordingly. pydantic-httpx2-9b7ee8e/.github/dependabot.yml000066400000000000000000000006351521723372100214650ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "uv" directory: "/" schedule: interval: "monthly" cooldown: default-days: 7 groups: python-packages: patterns: - "*" - package-ecosystem: "github-actions" directory: "/" schedule: interval: monthly cooldown: default-days: 7 groups: github-actions: patterns: - "*" pydantic-httpx2-9b7ee8e/.github/workflows/000077500000000000000000000000001521723372100206665ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/.github/workflows/benchmark.yml000066400000000000000000000015241521723372100233450ustar00rootroot00000000000000name: CodSpeed on: push: branches: ["main"] pull_request: branches: ["main"] permissions: id-token: write contents: read jobs: benchmarks: name: Run benchmarks runs-on: ubuntu-latest steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Install uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: python-version: "3.13" enable-cache: true - name: Install dependencies run: scripts/install shell: bash - name: Run the benchmarks uses: CodSpeedHQ/action@9d332c4d90b43981c3e55ae8e38e68709996240f # v4.17.0 with: mode: instrumentation run: uv run pytest tests/test_benchmark.py --codspeed pydantic-httpx2-9b7ee8e/.github/workflows/main.yml000066400000000000000000000050541521723372100223410ustar00rootroot00000000000000name: Test Suite on: push: branches: ["main"] pull_request: branches: ["main", "version-*"] permissions: contents: read jobs: tests: name: "Python ${{ matrix.python-version }}" runs-on: ubuntu-latest strategy: matrix: python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"] steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Install uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: python-version: ${{ matrix.python-version }} enable-cache: true - name: Install dependencies run: scripts/install - name: Run linting checks run: scripts/check - name: Build package & docs run: scripts/build - name: Run tests run: scripts/test - name: Enforce coverage run: scripts/coverage check: if: always() needs: [tests] runs-on: ubuntu-latest steps: - name: Decide whether the needed jobs succeeded or failed uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2 with: jobs: ${{ toJSON(needs) }} docs-cloudflare-preview: name: Docs preview (Cloudflare) if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository runs-on: ubuntu-latest permissions: contents: read pull-requests: write environment: name: cloudflare steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Install uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: python-version: "3.11" enable-cache: false - name: Install dependencies run: scripts/install - name: Build docs run: uv run zensical build --clean - uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0 id: deploy with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} command: versions upload --tag pr-${{ github.event.pull_request.number }} - name: Comment preview URL uses: marocchino/sticky-pull-request-comment@0ea0beb66eb9baf113663a64ec522f60e49231c0 # v3.0.4 with: message: | **Docs preview:** ${{ steps.deploy.outputs.deployment-url }} pydantic-httpx2-9b7ee8e/.github/workflows/publish.yml000066400000000000000000000044551521723372100230670ustar00rootroot00000000000000name: Publish Python Package on: push: tags: - "**" workflow_dispatch: permissions: {} jobs: build: runs-on: ubuntu-latest permissions: contents: read steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false fetch-depth: 0 - name: Install uv uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0 with: enable-cache: false - name: Set up Python run: uv python install 3.12 - name: Install dependencies run: scripts/install - name: Build package & docs run: scripts/build - name: Upload package distributions uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: package-distributions path: dist/ - name: Upload documentation uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1 with: name: documentation path: site/ publish: runs-on: ubuntu-latest needs: build permissions: id-token: write environment: name: pypi steps: - name: Download package distributions uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: package-distributions path: dist/ - name: Publish distributions to PyPI uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # v1.14.0 docs-cloudflare: runs-on: ubuntu-latest needs: build permissions: contents: read environment: name: cloudflare url: https://httpx2.pydantic.dev steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Download artifacts uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1 with: name: documentation path: site/ - uses: cloudflare/wrangler-action@ebbaa1584979971c8614a24965b4405ff95890e0 # v4.0.0 with: apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} command: deploy pydantic-httpx2-9b7ee8e/.github/workflows/zizmor.yml000066400000000000000000000011211521723372100227360ustar00rootroot00000000000000name: GitHub Actions Security Analysis on: push: branches: ["main"] pull_request: branches: ["**"] permissions: {} jobs: zizmor: runs-on: ubuntu-latest permissions: security-events: write # Required for upload-sarif (used by zizmor-action) to upload SARIF files. steps: - name: Checkout repository uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Run zizmor 🌈 uses: zizmorcore/zizmor-action@71321a20a9ded102f6e9ce5718a2fcec2c4f70d8 # v0.5.2 pydantic-httpx2-9b7ee8e/.gitignore000066400000000000000000000002031521723372100172540ustar00rootroot00000000000000*.pyc .coverage .pytest_cache/ .mypy_cache/ __pycache__/ htmlcov/ site/ .wrangler/ *.egg-info/ venv*/ .python-version build/ dist/ pydantic-httpx2-9b7ee8e/LICENSE.md000066400000000000000000000030651521723372100167010ustar00rootroot00000000000000Copyright Β© 2026 to present Pydantic Services Inc. and individual contributors. Copyright Β© 2019, [Encode OSS Ltd](https://www.encode.io/). All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pydantic-httpx2-9b7ee8e/README.md000066400000000000000000000132451521723372100165550ustar00rootroot00000000000000

HTTPX2

A next-generation HTTP client for Python.

Test Suite Package version

HTTPX2 is a fully featured HTTP client library for Python. It includes **an integrated command line client**, has support for both **HTTP/1.1 and HTTP/2**, and provides both **sync and async APIs**. > [!NOTE] > HTTPX2 is a continuation of the wonderful work started by [@lovelydinosaur](https://github.com/lovelydinosaur) and the broader HTTPX community. We're enormously grateful for everything that has gone into HTTPX over the years - it has been a foundational piece of the modern Python ecosystem, and this project would not exist without it. > > With HTTPX itself seeing limited activity recently, Pydantic is picking up stewardship under the HTTPX2 name so that users have a reliably maintained path forward - including timely security updates for a library that sits in the critical path of so many production systems. Our aim is to honour the original project's design, keep it stable for everyone relying on it, and continue evolving it carefully. Thank you to [@lovelydinosaur](https://github.com/lovelydinosaur) and every past contributor for laying such a strong foundation. πŸ’™ --- Install HTTPX2 using pip: ```shell pip install httpx2 ``` Now, let's get started: ```pycon >>> import httpx2 >>> r = httpx2.get('https://www.example.org/') >>> r >>> r.status_code 200 >>> r.headers['content-type'] 'text/html; charset=UTF-8' >>> r.text '\n\n\nExample Domain...' ``` Or, using the command-line client. ```shell pip install 'httpx2[cli]' # The command line client is an optional dependency. ``` Which now allows us to use HTTPX2 directly from the command-line: ```shell httpx2 --help ``` ## Features HTTPX2 builds on the well-established usability of `requests`, and gives you: * A broadly [requests-compatible API](https://httpx2.pydantic.dev/compatibility/). * An integrated command-line client. * HTTP/1.1 [and HTTP/2 support](https://httpx2.pydantic.dev/http2/). * Standard synchronous interface, but with [async support if you need it](https://httpx2.pydantic.dev/async/). * Ability to make requests directly to [WSGI applications](https://httpx2.pydantic.dev/advanced/transports/#wsgi-transport) or [ASGI applications](https://httpx2.pydantic.dev/advanced/transports/#asgi-transport). * Strict timeouts everywhere. * Fully type annotated. * 100% test coverage. Plus all the standard features of `requests`... * International Domains and URLs * Keep-Alive & Connection Pooling * Sessions with Cookie Persistence * Browser-style SSL Verification * Basic/Digest Authentication * Elegant Key/Value Cookies * Automatic Decompression * Automatic Content Decoding * Unicode Response Bodies * Multipart File Uploads * HTTP(S) Proxy Support * Connection Timeouts * Streaming Downloads * .netrc Support * Chunked Requests ## Installation Install with pip: ```shell pip install httpx2 ``` Or, to include the optional HTTP/2 support, use: ```shell pip install httpx2[http2] ``` ## Documentation Project documentation is available at [https://httpx2.pydantic.dev/](https://httpx2.pydantic.dev/). For a run-through of all the basics, head over to the [QuickStart](https://httpx2.pydantic.dev/quickstart/). For more advanced topics, see the [Advanced Usage](https://httpx2.pydantic.dev/advanced/) section, the [async support](https://httpx2.pydantic.dev/async/) section, or the [HTTP/2](https://httpx2.pydantic.dev/http2/) section. The [Developer Interface](https://httpx2.pydantic.dev/api/) provides a comprehensive API reference. To find out about tools that integrate with HTTPX, see [Third Party Packages](https://httpx2.pydantic.dev/third_party_packages/). ## Contribute If you want to contribute with HTTPX2 check out the [Contributing Guide](https://httpx2.pydantic.dev/contributing/) to learn how to start. ## Dependencies The HTTPX2 project relies on these excellent libraries: * `httpcore2` - The underlying transport implementation for `httpx2`. * `h11` - HTTP/1.1 support. * `anyio` - Structured concurrency primitives, used to support both `asyncio` and `trio`. * `truststore` - SSL verification using the operating system's trust store. * `idna` - Internationalized domain name support. As well as these optional installs: * `h2` - HTTP/2 support. *(Optional, with `httpx2[http2]`)* * `socksio` - SOCKS proxy support. *(Optional, with `httpx2[socks]`)* * `rich` - Rich terminal support. *(Optional, with `httpx2[cli]`)* * `click` - Command line client support. *(Optional, with `httpx2[cli]`)* * `brotli` or `brotlicffi` - Decoding for "brotli" compressed responses. *(Optional, with `httpx2[brotli]`)* * `zstandard` - Decoding for "zstd" compressed responses on Python 3.13 and below. *(Optional, with `httpx2[zstd]`. On Python 3.14+, `zstd` is supported via the stdlib [`compression.zstd`](https://docs.python.org/3/library/compression.zstd.html) module when it is available; the `httpx2[zstd]` extra installs nothing there, so decoding falls back to `zstandard` only on 3.13 and below.)* A huge amount of credit is due to `requests` for the API layout that much of this work follows, as well as to `urllib3` for plenty of design inspiration around the lower-level networking details. ---

HTTPX2 is BSD licensed code.
Designed & crafted with care.

— πŸ¦‹ —

pydantic-httpx2-9b7ee8e/docs/000077500000000000000000000000001521723372100162215ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/docs/advanced/000077500000000000000000000000001521723372100177665ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/docs/advanced/authentication.md000066400000000000000000000206131521723372100233310ustar00rootroot00000000000000Authentication can either be included on a per-request basis... ```pycon >>> auth = httpx2.BasicAuth(username="username", password="secret") >>> client = httpx2.Client() >>> response = client.get("https://www.example.com/", auth=auth) ``` Or configured on the client instance, ensuring that all outgoing requests will include authentication credentials... ```pycon >>> auth = httpx2.BasicAuth(username="username", password="secret") >>> client = httpx2.Client(auth=auth) >>> response = client.get("https://www.example.com/") ``` ## Basic authentication HTTP basic authentication is an unencrypted authentication scheme that uses a simple encoding of the username and password in the request `Authorization` header. Since it is unencrypted it should typically only be used over `https`, although this is not strictly enforced. ```pycon >>> auth = httpx2.BasicAuth(username="finley", password="secret") >>> client = httpx2.Client(auth=auth) >>> response = client.get("https://httpbin.org/basic-auth/finley/secret") >>> response ``` ## Digest authentication HTTP digest authentication is a challenge-response authentication scheme. Unlike basic authentication it provides encryption, and can be used over unencrypted `http` connections. It requires an additional round-trip in order to negotiate the authentication. ```pycon >>> auth = httpx2.DigestAuth(username="olivia", password="secret") >>> client = httpx2.Client(auth=auth) >>> response = client.get("https://httpbin.org/digest-auth/auth/olivia/secret") >>> response >>> response.history [] ``` ## NetRC authentication HTTPX can be configured to use [a `.netrc` config file](https://everything.curl.dev/usingcurl/netrc) for authentication. The `.netrc` config file allows authentication credentials to be associated with specified hosts. When a request is made to a host that is found in the netrc file, the username and password will be included using HTTP basic authentication. Example `.netrc` file: ``` machine example.org login example-username password example-password machine python-httpx2.org login other-username password other-password ``` Some examples of configuring `.netrc` authentication with `httpx2`. Use the default `.netrc` file in the users home directory: ```pycon >>> auth = httpx2.NetRCAuth() >>> client = httpx2.Client(auth=auth) ``` Use an explicit path to a `.netrc` file: ```pycon >>> auth = httpx2.NetRCAuth(file="/path/to/.netrc") >>> client = httpx2.Client(auth=auth) ``` Use the `NETRC` environment variable to configure a path to the `.netrc` file, or fallback to the default. ```pycon >>> auth = httpx2.NetRCAuth(file=os.environ.get("NETRC")) >>> client = httpx2.Client(auth=auth) ``` The `NetRCAuth()` class uses [the `netrc.netrc()` function from the Python standard library](https://docs.python.org/3/library/netrc.html). See the documentation there for more details on exceptions that may be raised if the `.netrc` file is not found, or cannot be parsed. ## Custom authentication schemes When issuing requests or instantiating a client, the `auth` argument can be used to pass an authentication scheme to use. The `auth` argument may be one of the following... * A two-tuple of `username`/`password`, to be used with basic authentication. * An instance of `httpx2.BasicAuth()`, `httpx2.DigestAuth()`, or `httpx2.NetRCAuth()`. * A callable, accepting a request and returning an authenticated request instance. * An instance of subclasses of `httpx2.Auth`. The most involved of these is the last, which allows you to create authentication flows involving one or more requests. A subclass of `httpx2.Auth` should implement `def auth_flow(request)`, and yield any requests that need to be made... ```python class MyCustomAuth(httpx2.Auth): def __init__(self, token): self.token = token def auth_flow(self, request): # Send the request, with a custom `X-Authentication` header. request.headers['X-Authentication'] = self.token yield request ``` If the auth flow requires more than one request, you can issue multiple yields, and obtain the response in each case... ```python class MyCustomAuth(httpx2.Auth): def __init__(self, token): self.token = token def auth_flow(self, request): response = yield request if response.status_code == 401: # If the server issues a 401 response then resend the request, # with a custom `X-Authentication` header. request.headers['X-Authentication'] = self.token yield request ``` Custom authentication classes are designed to not perform any I/O, so that they may be used with both sync and async client instances. If you are implementing an authentication scheme that requires the request body, then you need to indicate this on the class using a `requires_request_body` property. You will then be able to access `request.content` inside the `.auth_flow()` method. ```python class MyCustomAuth(httpx2.Auth): requires_request_body = True def __init__(self, token): self.token = token def auth_flow(self, request): response = yield request if response.status_code == 401: # If the server issues a 401 response then resend the request, # with a custom `X-Authentication` header. request.headers['X-Authentication'] = self.sign_request(...) yield request def sign_request(self, request): # Create a request signature, based on `request.method`, `request.url`, # `request.headers`, and `request.content`. ... ``` Similarly, if you are implementing a scheme that requires access to the response body, then use the `requires_response_body` property. You will then be able to access response body properties and methods such as `response.content`, `response.text`, `response.json()`, etc. ```python class MyCustomAuth(httpx2.Auth): requires_response_body = True def __init__(self, access_token, refresh_token, refresh_url): self.access_token = access_token self.refresh_token = refresh_token self.refresh_url = refresh_url def auth_flow(self, request): request.headers["X-Authentication"] = self.access_token response = yield request if response.status_code == 401: # If the server issues a 401 response, then issue a request to # refresh tokens, and resend the request. refresh_response = yield self.build_refresh_request() self.update_tokens(refresh_response) request.headers["X-Authentication"] = self.access_token yield request def build_refresh_request(self): # Return an `httpx2.Request` for refreshing tokens. ... def update_tokens(self, response): # Update the `.access_token` and `.refresh_token` tokens # based on a refresh response. data = response.json() ... ``` If you _do_ need to perform I/O other than HTTP requests, such as accessing a disk-based cache, or you need to use concurrency primitives, such as locks, then you should override `.sync_auth_flow()` and `.async_auth_flow()` (instead of `.auth_flow()`). The former will be used by `httpx2.Client`, while the latter will be used by `httpx2.AsyncClient`. ```python import asyncio import threading import httpx2 class MyCustomAuth(httpx2.Auth): def __init__(self): self._sync_lock = threading.RLock() self._async_lock = asyncio.Lock() def sync_get_token(self): with self._sync_lock: ... def sync_auth_flow(self, request): token = self.sync_get_token() request.headers["Authorization"] = f"Token {token}" yield request async def async_get_token(self): async with self._async_lock: ... async def async_auth_flow(self, request): token = await self.async_get_token() request.headers["Authorization"] = f"Token {token}" yield request ``` If you only want to support one of the two methods, then you should still override it, but raise an explicit `RuntimeError`. ```python import httpx2 import sync_only_library class MyCustomAuth(httpx2.Auth): def sync_auth_flow(self, request): token = sync_only_library.get_token(...) request.headers["Authorization"] = f"Token {token}" yield request async def async_auth_flow(self, request): raise RuntimeError("Cannot use a sync authentication class with httpx2.AsyncClient") ```pydantic-httpx2-9b7ee8e/docs/advanced/clients.md000066400000000000000000000263621521723372100217620ustar00rootroot00000000000000!!! hint If you are coming from Requests, `httpx2.Client()` is what you can use instead of `requests.Session()`. ## Why use a Client? !!! note "TL;DR" If you do anything more than experimentation, one-off scripts, or prototypes, then you should use a `Client` instance. **More efficient usage of network resources** When you make requests using the top-level API as documented in the [Quickstart](../quickstart.md) guide, HTTPX has to establish a new connection _for every single request_ (connections are not reused). As the number of requests to a host increases, this quickly becomes inefficient. On the other hand, a `Client` instance uses [HTTP connection pooling](https://en.wikipedia.org/wiki/HTTP_persistent_connection). This means that when you make several requests to the same host, the `Client` will reuse the underlying TCP connection, instead of recreating one for every single request. This can bring **significant performance improvements** compared to using the top-level API, including: - Reduced latency across requests (no handshaking). - Reduced CPU usage and round-trips. - Reduced network congestion. **Extra features** `Client` instances also support features that aren't available at the top-level API, such as: - Cookie persistence across requests. - Applying configuration across all outgoing requests. - Sending requests through HTTP proxies. - Using [HTTP/2](../http2.md). The other sections on this page go into further detail about what you can do with a `Client` instance. ## Usage The recommended way to use a `Client` is as a context manager. This will ensure that connections are properly cleaned up when leaving the `with` block: ```python with httpx2.Client() as client: ... ``` Alternatively, you can explicitly close the connection pool without block-usage using `.close()`: ```python client = httpx2.Client() try: ... finally: client.close() ``` ## Making requests Once you have a `Client`, you can send requests using `.get()`, `.post()`, etc. For example: ```pycon >>> with httpx2.Client() as client: ... r = client.get('https://example.com') ... >>> r ``` These methods accept the same arguments as `httpx2.get()`, `httpx2.post()`, etc. This means that all features documented in the [Quickstart](../quickstart.md) guide are also available at the client level. For example, to send a request with custom headers: ```pycon >>> with httpx2.Client() as client: ... headers = {'X-Custom': 'value'} ... r = client.get('https://example.com', headers=headers) ... >>> r.request.headers['X-Custom'] 'value' ``` ## Sharing configuration across requests Clients allow you to apply configuration to all outgoing requests by passing parameters to the `Client` constructor. For example, to apply a set of custom headers _on every request_: ```pycon >>> url = 'http://httpbin.org/headers' >>> headers = {'user-agent': 'my-app/0.0.1'} >>> with httpx2.Client(headers=headers) as client: ... r = client.get(url) ... >>> r.json()['headers']['User-Agent'] 'my-app/0.0.1' ``` ## Merging of configuration When a configuration option is provided at both the client-level and request-level, one of two things can happen: - For headers, query parameters and cookies, the values are combined together. For example: ```pycon >>> headers = {'X-Auth': 'from-client'} >>> params = {'client_id': 'client1'} >>> with httpx2.Client(headers=headers, params=params) as client: ... headers = {'X-Custom': 'from-request'} ... params = {'request_id': 'request1'} ... r = client.get('https://example.com', headers=headers, params=params) ... >>> r.request.url URL('https://example.com?client_id=client1&request_id=request1') >>> r.request.headers['X-Auth'] 'from-client' >>> r.request.headers['X-Custom'] 'from-request' ``` - For all other parameters, the request-level value takes priority. For example: ```pycon >>> with httpx2.Client(auth=('tom', 'mot123')) as client: ... r = client.get('https://example.com', auth=('alice', 'ecila123')) ... >>> _, _, auth = r.request.headers['Authorization'].partition(' ') >>> import base64 >>> base64.b64decode(auth) b'alice:ecila123' ``` If you need finer-grained control on the merging of client-level and request-level parameters, see [Request instances](#request-instances). ## Other Client-only configuration options Additionally, `Client` accepts some configuration options that aren't available at the request level. For example, `base_url` allows you to prepend an URL to all outgoing requests: ```pycon >>> with httpx2.Client(base_url='http://httpbin.org') as client: ... r = client.get('/headers') ... >>> r.request.url URL('http://httpbin.org/headers') ``` For a list of all available client parameters, see the [`Client`](../api.md#client) API reference. --- ## Request instances For maximum control on what gets sent over the wire, HTTPX supports building explicit [`Request`](../api.md#request) instances: ```python request = httpx2.Request("GET", "https://example.com") ``` To dispatch a `Request` instance across to the network, create a [`Client` instance](#sharing-configuration-across-requests) and use `.send()`: ```python with httpx2.Client() as client: response = client.send(request) ... ``` If you need to mix client-level and request-level options in a way that is not supported by the default [Merging of configuration](#merging-of-configuration), you can use `.build_request()` and then make arbitrary modifications to the `Request` instance. For example: ```python headers = {"X-Api-Key": "...", "X-Client-ID": "ABC123"} with httpx2.Client(headers=headers) as client: request = client.build_request("GET", "https://api.example.com") print(request.headers["X-Client-ID"]) # "ABC123" # Don't send the API key for this particular request. del request.headers["X-Api-Key"] response = client.send(request) ... ``` ## Monitoring download progress If you need to monitor download progress of large responses, you can use response streaming and inspect the `response.num_bytes_downloaded` property. This interface is required for properly determining download progress, because the total number of bytes returned by `response.content` or `response.iter_content()` will not always correspond with the raw content length of the response if HTTP response compression is being used. For example, showing a progress bar using the [`tqdm`](https://github.com/tqdm/tqdm) library while a response is being downloaded could be done like this… ```python import tempfile import httpx2 from tqdm import tqdm with tempfile.NamedTemporaryFile() as download_file: url = "https://speed.hetzner.de/100MB.bin" with httpx2.stream("GET", url) as response: total = int(response.headers["Content-Length"]) with tqdm(total=total, unit_scale=True, unit_divisor=1024, unit="B") as progress: num_bytes_downloaded = response.num_bytes_downloaded for chunk in response.iter_bytes(): download_file.write(chunk) progress.update(response.num_bytes_downloaded - num_bytes_downloaded) num_bytes_downloaded = response.num_bytes_downloaded ``` ![tqdm progress bar](../img/tqdm-progress.gif) Or an alternate example, this time using the [`rich`](https://github.com/willmcgugan/rich) library… ```python import tempfile import httpx2 import rich.progress with tempfile.NamedTemporaryFile() as download_file: url = "https://speed.hetzner.de/100MB.bin" with httpx2.stream("GET", url) as response: total = int(response.headers["Content-Length"]) with rich.progress.Progress( "[progress.percentage]{task.percentage:>3.0f}%", rich.progress.BarColumn(bar_width=None), rich.progress.DownloadColumn(), rich.progress.TransferSpeedColumn(), ) as progress: download_task = progress.add_task("Download", total=total) for chunk in response.iter_bytes(): download_file.write(chunk) progress.update(download_task, completed=response.num_bytes_downloaded) ``` ![rich progress bar](../img/rich-progress.gif) ## Monitoring upload progress If you need to monitor upload progress of large responses, you can use request content generator streaming. For example, showing a progress bar using the [`tqdm`](https://github.com/tqdm/tqdm) library. ```python import io import random import httpx2 from tqdm import tqdm def gen(): """ this is a complete example with generated random bytes. you can replace `io.BytesIO` with real file object. """ total = 32 * 1024 * 1024 # 32m with tqdm(ascii=True, unit_scale=True, unit='B', unit_divisor=1024, total=total) as bar: with io.BytesIO(random.randbytes(total)) as f: while data := f.read(1024): yield data bar.update(len(data)) httpx2.post("https://httpbin.org/post", content=gen()) ``` ![tqdm progress bar](../img/tqdm-progress.gif) ## Multipart file encoding As mentioned in the [quickstart](../quickstart.md#sending-multipart-file-uploads) multipart file encoding is available by passing a dictionary with the name of the payloads as keys and either tuple of elements or a file-like object or a string as values. ```pycon >>> with open('report.xls', 'rb') as report_file: ... files = {'upload-file': ('report.xls', report_file, 'application/vnd.ms-excel')} ... r = httpx2.post("https://httpbin.org/post", files=files) >>> print(r.text) { ... "files": { "upload-file": "<... binary content ...>" }, ... } ``` More specifically, if a tuple is used as a value, it must have between 2 and 3 elements: - The first element is an optional file name which can be set to `None`. - The second element may be a file-like object or a string which will be automatically encoded in UTF-8. - An optional third element can be used to specify the [MIME type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_Types) of the file being uploaded. If not specified HTTPX will attempt to guess the MIME type based on the file name, with unknown file extensions defaulting to "application/octet-stream". If the file name is explicitly set to `None` then HTTPX will not include a content-type MIME header field. ```pycon >>> files = {'upload-file': (None, 'text content', 'text/plain')} >>> r = httpx2.post("https://httpbin.org/post", files=files) >>> print(r.text) { ... "files": {}, "form": { "upload-file": "text-content" }, ... } ``` !!! tip It is safe to upload large files this way. File uploads are streaming by default, meaning that only one chunk will be loaded into memory at a time. Non-file data fields can be included in the multipart form using by passing them to `data=...`. You can also send multiple files in one go with a multiple file field form. To do that, pass a list of `(field, )` items instead of a dictionary, allowing you to pass multiple items with the same `field`. For instance this request sends 2 files, `foo.png` and `bar.png` in one request on the `images` form field: ```pycon >>> with open('foo.png', 'rb') as foo_file, open('bar.png', 'rb') as bar_file: ... files = [ ... ('images', ('foo.png', foo_file, 'image/png')), ... ('images', ('bar.png', bar_file, 'image/png')), ... ] ... r = httpx2.post("https://httpbin.org/post", files=files) ``` pydantic-httpx2-9b7ee8e/docs/advanced/event-hooks.md000066400000000000000000000045711521723372100225610ustar00rootroot00000000000000HTTPX allows you to register "event hooks" with the client, that are called every time a particular type of event takes place. There are currently two event hooks: * `request` - Called after a request is fully prepared, but before it is sent to the network. Passed the `request` instance. * `response` - Called after the response has been fetched from the network, but before it is returned to the caller. Passed the `response` instance. These allow you to install client-wide functionality such as logging, monitoring or tracing. ```python def log_request(request): print(f"Request event hook: {request.method} {request.url} - Waiting for response") def log_response(response): request = response.request print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}") client = httpx2.Client(event_hooks={'request': [log_request], 'response': [log_response]}) ``` You can also use these hooks to install response processing code, such as this example, which creates a client instance that always raises `httpx2.HTTPStatusError` on 4xx and 5xx responses. ```python def raise_on_4xx_5xx(response): response.raise_for_status() client = httpx2.Client(event_hooks={'response': [raise_on_4xx_5xx]}) ``` !!! note Response event hooks are called before determining if the response body should be read or not. If you need access to the response body inside an event hook, you'll need to call `response.read()`, or for AsyncClients, `response.aread()`. The hooks are also allowed to modify `request` and `response` objects. ```python def add_timestamp(request): request.headers['x-request-timestamp'] = datetime.now(tz=datetime.utc).isoformat() client = httpx2.Client(event_hooks={'request': [add_timestamp]}) ``` Event hooks must always be set as a **list of callables**, and you may register multiple event hooks for each type of event. As well as being able to set event hooks on instantiating the client, there is also an `.event_hooks` property, that allows you to inspect and modify the installed hooks. ```python client = httpx2.Client() client.event_hooks['request'] = [log_request] client.event_hooks['response'] = [log_response, raise_on_4xx_5xx] ``` !!! note If you are using HTTPX's async support, then you need to be aware that hooks registered with `httpx2.AsyncClient` MUST be async functions, rather than plain functions. pydantic-httpx2-9b7ee8e/docs/advanced/extensions.md000066400000000000000000000223621521723372100225140ustar00rootroot00000000000000# Extensions Request and response extensions provide a untyped space where additional information may be added. Extensions should be used for features that may not be available on all transports, and that do not fit neatly into [the simplified request/response model](https://www.encode.io/httpcore/extensions/) that the underlying `httpcore` package uses as its API. Several extensions are supported on the request: ```python # Request timeouts actually implemented as an extension on # the request, ensuring that they are passed throughout the # entire call stack. client = httpx2.Client() response = client.get( "https://www.example.com", extensions={"timeout": {"connect": 5.0}} ) response.request.extensions["timeout"] {"connect": 5.0} ``` And on the response: ```python client = httpx2.Client() response = client.get("https://www.example.com") print(response.extensions["http_version"]) # b"HTTP/1.1" # Other server responses could have been # b"HTTP/0.9", b"HTTP/1.0", or b"HTTP/1.1" ``` ## Request Extensions ### `"trace"` The trace extension allows a callback handler to be installed to monitor the internal flow of events within the underlying `httpcore` transport. The simplest way to explain this is with an example: ```python import httpx2 def log(event_name, info): print(event_name, info) client = httpx2.Client() response = client.get("https://www.example.com/", extensions={"trace": log}) # connection.connect_tcp.started {'host': 'www.example.com', 'port': 443, 'local_address': None, 'timeout': None} # connection.connect_tcp.complete {'return_value': } # connection.start_tls.started {'ssl_context': , 'server_hostname': b'www.example.com', 'timeout': None} # connection.start_tls.complete {'return_value': } # http11.send_request_headers.started {'request': } # http11.send_request_headers.complete {'return_value': None} # http11.send_request_body.started {'request': } # http11.send_request_body.complete {'return_value': None} # http11.receive_response_headers.started {'request': } # http11.receive_response_headers.complete {'return_value': (b'HTTP/1.1', 200, b'OK', [(b'Age', b'553715'), (b'Cache-Control', b'max-age=604800'), (b'Content-Type', b'text/html; charset=UTF-8'), (b'Date', b'Thu, 21 Oct 2021 17:08:42 GMT'), (b'Etag', b'"3147526947+ident"'), (b'Expires', b'Thu, 28 Oct 2021 17:08:42 GMT'), (b'Last-Modified', b'Thu, 17 Oct 2019 07:18:26 GMT'), (b'Server', b'ECS (nyb/1DCD)'), (b'Vary', b'Accept-Encoding'), (b'X-Cache', b'HIT'), (b'Content-Length', b'1256')])} # http11.receive_response_body.started {'request': } # http11.receive_response_body.complete {'return_value': None} # http11.response_closed.started {} # http11.response_closed.complete {'return_value': None} ``` The `event_name` and `info` arguments here will be one of the following: * `{event_type}.{event_name}.started`, `` * `{event_type}.{event_name}.complete`, `{"return_value": <...>}` * `{event_type}.{event_name}.failed`, `{"exception": <...>}` Note that when using async code the handler function passed to `"trace"` must be an `async def ...` function. The following event types are currently exposed... **Establishing the connection** * `"connection.connect_tcp"` * `"connection.connect_unix_socket"` * `"connection.start_tls"` **HTTP/1.1 events** * `"http11.send_request_headers"` * `"http11.send_request_body"` * `"http11.receive_response"` * `"http11.receive_response_body"` * `"http11.response_closed"` **HTTP/2 events** * `"http2.send_connection_init"` * `"http2.send_request_headers"` * `"http2.send_request_body"` * `"http2.receive_response_headers"` * `"http2.receive_response_body"` * `"http2.response_closed"` The exact set of trace events may be subject to change across different versions of `httpcore`. If you need to rely on a particular set of events it is recommended that you pin installation of the package to a fixed version. ### `"sni_hostname"` The server's hostname, which is used to confirm the hostname supplied by the SSL certificate. If you want to connect to an explicit IP address rather than using the standard DNS hostname lookup, then you'll need to use this request extension. For example: ``` python # Connect to '185.199.108.153' but use 'www.encode.io' in the Host header, #Β and use 'www.encode.io' when SSL verifying the server hostname. client = httpx2.Client() headers = {"Host": "www.encode.io"} extensions = {"sni_hostname": "www.encode.io"} response = client.get( "https://185.199.108.153/path", headers=headers, extensions=extensions ) ``` ### `"timeout"` A dictionary of `str: Optional[float]` timeout values. May include values for `'connect'`, `'read'`, `'write'`, or `'pool'`. For example: ```python # Timeout if a connection takes more than 5 seconds to established, or if # we are blocked waiting on the connection pool for more than 10 seconds. client = httpx2.Client() response = client.get( "https://www.example.com", extensions={"timeout": {"connect": 5.0, "pool": 10.0}} ) ``` This extension is how the `httpx2` timeouts are implemented, ensuring that the timeout values are associated with the request instance and passed throughout the stack. You shouldn't typically be working with this extension directly, but use the higher level `timeout` API instead. ### `"target"` The target that is used as [the HTTP target instead of the URL path](https://datatracker.ietf.org/doc/html/rfc2616#section-5.1.2). This enables support constructing requests that would otherwise be unsupported. * URL paths with non-standard escaping applied. * Forward proxy requests using an absolute URI. * Tunneling proxy requests using `CONNECT` with hostname as the target. * Server-wide `OPTIONS *` requests. Some examples: Using the 'target' extension to send requests without the standard path escaping rules... ```python # Typically a request to "https://www.example.com/test^path" would # connect to "www.example.com" and send an HTTP/1.1 request like... # # GET /test%5Epath HTTP/1.1 # # Using the target extension we can include the literal '^'... # # GET /test^path HTTP/1.1 # # Note that requests must still be valid HTTP requests. # For example including whitespace in the target will raise a `LocalProtocolError`. extensions = {"target": b"/test^path"} response = httpx2.get("https://www.example.com", extensions=extensions) ``` The `target` extension also allows server-wide `OPTIONS *` requests to be constructed... ```python # This will send the following request... # # CONNECT * HTTP/1.1 extensions = {"target": b"*"} response = httpx2.request("CONNECT", "https://www.example.com", extensions=extensions) ``` ## Response Extensions ### `"http_version"` The HTTP version, as bytes. Eg. `b"HTTP/1.1"`. When using HTTP/1.1 the response line includes an explicit version, and the value of this key could feasibly be one of `b"HTTP/0.9"`, `b"HTTP/1.0"`, or `b"HTTP/1.1"`. When using HTTP/2 there is no further response versioning included in the protocol, and the value of this key will always be `b"HTTP/2"`. ### `"reason_phrase"` The reason-phrase of the HTTP response, as bytes. For example `b"OK"`. Some servers may include a custom reason phrase, although this is not recommended. HTTP/2 onwards does not include a reason phrase on the wire. When no key is included, a default based on the status code may be used. ### `"stream_id"` When HTTP/2 is being used the `"stream_id"` response extension can be accessed to determine the ID of the data stream that the response was sent on. ### `"network_stream"` The `"network_stream"` extension allows developers to handle HTTP `CONNECT` and `Upgrade` requests, by providing an API that steps outside the standard request/response model, and can directly read or write to the network. The interface provided by the network stream: * `read(max_bytes, timeout = None) -> bytes` * `write(buffer, timeout = None)` * `close()` * `start_tls(ssl_context, server_hostname = None, timeout = None) -> NetworkStream` * `get_extra_info(info) -> Any` This API can be used as the foundation for working with HTTP proxies, WebSocket upgrades, and other advanced use-cases. See the [network backends documentation](https://www.encode.io/httpcore/network-backends/) for more information on working directly with network streams. **Extra network information** The network stream abstraction also allows access to various low-level information that may be exposed by the underlying socket: ```python response = httpx2.get("https://www.example.com") network_stream = response.extensions["network_stream"] client_addr = network_stream.get_extra_info("client_addr") server_addr = network_stream.get_extra_info("server_addr") print("Client address", client_addr) print("Server address", server_addr) ``` The socket SSL information is also available through this interface, although you need to ensure that the underlying connection is still open, in order to access it... ```python with httpx2.stream("GET", "https://www.example.com") as response: network_stream = response.extensions["network_stream"] ssl_object = network_stream.get_extra_info("ssl_object") print("TLS version", ssl_object.version()) ``` pydantic-httpx2-9b7ee8e/docs/advanced/proxies.md000066400000000000000000000070171521723372100220060ustar00rootroot00000000000000HTTPX supports setting up [HTTP proxies](https://en.wikipedia.org/wiki/Proxy_server#Web_proxy_servers) via the `proxy` parameter to be passed on client initialization or top-level API functions like `httpx2.get(..., proxy=...)`.
Diagram of how a proxy works (source: Wikipedia). The left hand side "Internet" blob may be your HTTPX client requesting example.com through a proxy.
## HTTP Proxies To route all traffic (HTTP and HTTPS) to a proxy located at `http://localhost:8030`, pass the proxy URL to the client... ```python with httpx2.Client(proxy="http://localhost:8030") as client: ... ``` For more advanced use cases, pass a mounts `dict`. For example, to route HTTP and HTTPS requests to 2 different proxies, respectively located at `http://localhost:8030`, and `http://localhost:8031`, pass a `dict` of proxy URLs: ```python proxy_mounts = { "http://": httpx2.HTTPTransport(proxy="http://localhost:8030"), "https://": httpx2.HTTPTransport(proxy="http://localhost:8031"), } with httpx2.Client(mounts=proxy_mounts) as client: ... ``` For detailed information about how `mounts` routes requests, see the [Routing](transports.md#routing) section. !!! tip "Gotcha" In most cases, the proxy URL for the `https://` key _should_ use the `http://` scheme (that's not a typo!). This is because HTTP proxying requires initiating a connection with the proxy server. While it's possible that your proxy supports doing it via HTTPS, most proxies only support doing it via HTTP. For more information, see [FORWARD vs TUNNEL](#forward-vs-tunnel). ## Authentication Proxy credentials can be passed as the `userinfo` section of the proxy URL. For example: ```python with httpx2.Client(proxy="http://username:password@localhost:8030") as client: ... ``` ## Proxy mechanisms !!! note This section describes **advanced** proxy concepts and functionality. ### FORWARD vs TUNNEL In general, the flow for making an HTTP request through a proxy is as follows: 1. The client connects to the proxy (initial connection request). 2. The proxy transfers data to the server on your behalf. How exactly step 2/ is performed depends on which of two proxying mechanisms is used: * **Forwarding**: the proxy makes the request for you, and sends back the response it obtained from the server. * **Tunnelling**: the proxy establishes a TCP connection to the server on your behalf, and the client reuses this connection to send the request and receive the response. This is known as an [HTTP Tunnel](https://en.wikipedia.org/wiki/HTTP_tunnel). This mechanism is how you can access websites that use HTTPS from an HTTP proxy (the client "upgrades" the connection to HTTPS by performing the TLS handshake with the server over the TCP connection provided by the proxy). ### Troubleshooting proxies If you encounter issues when setting up proxies, please refer to our [Troubleshooting guide](../troubleshooting.md#proxies). ## SOCKS In addition to HTTP proxies, `httpcore` also supports proxies using the SOCKS protocol. This is an optional feature that requires an additional third-party library be installed before use. You can install SOCKS support using `pip`: ```shell pip install 'httpx2[socks]' ``` You can now configure a client to make requests via a proxy using the SOCKS protocol: ```python httpx2.Client(proxy='socks5://user:pass@host:port') ``` pydantic-httpx2-9b7ee8e/docs/advanced/resource-limits.md000066400000000000000000000011271521723372100234370ustar00rootroot00000000000000You can control the connection pool size using the `limits` keyword argument on the client. It takes instances of `httpx2.Limits` which define: - `max_keepalive_connections`, number of allowable keep-alive connections, or `None` to always allow. (Defaults 20) - `max_connections`, maximum number of allowable connections, or `None` for no limits. (Default 100) - `keepalive_expiry`, time limit on idle keep-alive connections in seconds, or `None` for no limits. (Default 5) ```python limits = httpx2.Limits(max_keepalive_connections=5, max_connections=10) client = httpx2.Client(limits=limits) ```pydantic-httpx2-9b7ee8e/docs/advanced/ssl.md000066400000000000000000000071311521723372100211130ustar00rootroot00000000000000When making a request over HTTPS, HTTPX needs to verify the identity of the requested host. To do this, it uses a bundle of SSL certificates (a.k.a. CA bundle) delivered by a trusted certificate authority (CA). ### Enabling and disabling verification By default httpx2 will verify HTTPS connections, and raise an error for invalid SSL cases... ```pycon >>> httpx2.get("https://expired.badssl.com/") httpx2.ConnectError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: certificate has expired (_ssl.c:997) ``` You can disable SSL verification completely and allow insecure requests... ```pycon >>> httpx2.get("https://expired.badssl.com/", verify=False) ``` ### Configuring client instances If you're using a `Client()` instance you should pass any `verify=<...>` configuration when instantiating the client. By default the operating system's trust store is used for SSL verification, via [the `truststore` package](https://truststore.readthedocs.io/). For more complex configurations you can pass an [SSL Context](https://docs.python.org/3/library/ssl.html) instance... ```python import ssl import truststore import httpx2 # This SSL context is equivalent to the default `verify=True`. ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) client = httpx2.Client(verify=ctx) ``` Using [the `certifi` CA bundle](https://certifiio.readthedocs.io/en/latest/) instead of the system trust store... ```python import certifi import httpx2 import ssl # Use the certifi CA bundle. ctx = ssl.create_default_context(cafile=certifi.where()) client = httpx2.Client(verify=ctx) ``` Loading an alternative certificate verification store using [the standard SSL context API](https://docs.python.org/3/library/ssl.html)... ```python import httpx2 import ssl # Use an explicitly configured certificate store. ctx = ssl.create_default_context(cafile="path/to/certs.pem") # Either cafile or capath. client = httpx2.Client(verify=ctx) ``` ### Client side certificates Client side certificates allow a remote server to verify the client. They tend to be used within private organizations to authenticate requests to remote servers. You can specify client-side certificates, using the [`.load_cert_chain()`](https://docs.python.org/3/library/ssl.html#ssl.SSLContext.load_cert_chain) API... ```python ctx = ssl.create_default_context() ctx.load_cert_chain(certfile="path/to/client.pem") # Optionally also keyfile or password. client = httpx2.Client(verify=ctx) ``` ### Working with `SSL_CERT_FILE` and `SSL_CERT_DIR` `httpx2` does respect the `SSL_CERT_FILE` and `SSL_CERT_DIR` environment variables by default. For details, refer to [the section on the environment variables page](../environment_variables.md#ssl_cert_file). ### Making HTTPS requests to a local server When making requests to local servers, such as a development server running on `localhost`, you will typically be using unencrypted HTTP connections. If you do need to make HTTPS connections to a local server, for example to test an HTTPS-only service, you will need to create and use your own certificates. Here's one way to do it... 1. Use [trustme](https://github.com/python-trio/trustme) to generate a pair of server key/cert files, and a client cert file. 2. Pass the server key/cert files when starting your local server. (This depends on the particular web server you're using. For example, [Uvicorn](https://www.uvicorn.org) provides the `--ssl-keyfile` and `--ssl-certfile` options.) 3. Configure `httpx2` to use the certificates stored in `client.pem`. ```python ctx = ssl.create_default_context(cafile="client.pem") client = httpx2.Client(verify=ctx) ``` pydantic-httpx2-9b7ee8e/docs/advanced/text-encodings.md000066400000000000000000000071131521723372100232450ustar00rootroot00000000000000When accessing `response.text`, we need to decode the response bytes into a unicode text representation. By default `httpx2` will use `"charset"` information included in the response `Content-Type` header to determine how the response bytes should be decoded into text. In cases where no charset information is included on the response, the default behaviour is to assume "utf-8" encoding, which is by far the most widely used text encoding on the internet. ## Using the default encoding To understand this better let's start by looking at the default behaviour for text decoding... ```python import httpx2 # Instantiate a client with the default configuration. client = httpx2.Client() # Using the client... response = client.get(...) print(response.encoding) # This will either print the charset given in # the Content-Type charset, or else "utf-8". print(response.text) # The text will either be decoded with the Content-Type # charset, or using "utf-8". ``` This is normally absolutely fine. Most servers will respond with a properly formatted Content-Type header, including a charset encoding. And in most cases where no charset encoding is included, UTF-8 is very likely to be used, since it is so widely adopted. ## Using an explicit encoding In some cases we might be making requests to a site where no character set information is being set explicitly by the server, but we know what the encoding is. In this case it's best to set the default encoding explicitly on the client. ```python import httpx2 # Instantiate a client with a Japanese character set as the default encoding. client = httpx2.Client(default_encoding="shift-jis") # Using the client... response = client.get(...) print(response.encoding) # This will either print the charset given in # the Content-Type charset, or else "shift-jis". print(response.text) # The text will either be decoded with the Content-Type # charset, or using "shift-jis". ``` ## Using auto-detection In cases where the server is not reliably including character set information, and where we don't know what encoding is being used, we can enable auto-detection to make a best-guess attempt when decoding from bytes to text. To use auto-detection you need to set the `default_encoding` argument to a callable instead of a string. This callable should be a function which takes the input bytes as an argument and returns the character set to use for decoding those bytes to text. There are two widely used Python packages which both handle this functionality: * [`chardet`](https://chardet.readthedocs.io/) - This is a well established package, and is a port of [the auto-detection code in Mozilla](https://www-archive.mozilla.org/projects/intl/chardet.html). * [`charset-normalizer`](https://charset-normalizer.readthedocs.io/) - A newer package, motivated by `chardet`, with a different approach. Let's take a look at installing autodetection using one of these packages... ```shell pip install httpx2 pip install chardet ``` Once `chardet` is installed, we can configure a client to use character-set autodetection. ```python import httpx2 import chardet def autodetect(content): return chardet.detect(content).get("encoding") # Using a client with character-set autodetection enabled. client = httpx2.Client(default_encoding=autodetect) response = client.get(...) print(response.encoding) # This will either print the charset given in # the Content-Type charset, or else the auto-detected # character set. print(response.text) ``` pydantic-httpx2-9b7ee8e/docs/advanced/timeouts.md000066400000000000000000000053241521723372100221650ustar00rootroot00000000000000HTTPX is careful to enforce timeouts everywhere by default. The default behavior is to raise a `TimeoutException` after 5 seconds of network inactivity. ## Setting and disabling timeouts You can set timeouts for an individual request: ```python # Using the top-level API: httpx2.get('http://example.com/api/v1/example', timeout=10.0) # Using a client instance: with httpx2.Client() as client: client.get("http://example.com/api/v1/example", timeout=10.0) ``` Or disable timeouts for an individual request: ```python # Using the top-level API: httpx2.get('http://example.com/api/v1/example', timeout=None) # Using a client instance: with httpx2.Client() as client: client.get("http://example.com/api/v1/example", timeout=None) ``` ## Setting a default timeout on a client You can set a timeout on a client instance, which results in the given `timeout` being used as the default for requests made with this client: ```python client = httpx2.Client() # Use a default 5s timeout everywhere. client = httpx2.Client(timeout=10.0) # Use a default 10s timeout everywhere. client = httpx2.Client(timeout=None) # Disable all timeouts by default. ``` ## Fine tuning the configuration HTTPX also allows you to specify the timeout behavior in more fine grained detail. There are four different types of timeouts that may occur. These are **connect**, **read**, **write**, and **pool** timeouts. * The **connect** timeout specifies the maximum amount of time to wait until a socket connection to the requested host is established. If HTTPX is unable to connect within this time frame, a `ConnectTimeout` exception is raised. * The **read** timeout specifies the maximum duration to wait for a chunk of data to be received (for example, a chunk of the response body). If HTTPX is unable to receive data within this time frame, a `ReadTimeout` exception is raised. * The **write** timeout specifies the maximum duration to wait for a chunk of data to be sent (for example, a chunk of the request body). If HTTPX is unable to send data within this time frame, a `WriteTimeout` exception is raised. * The **pool** timeout specifies the maximum duration to wait for acquiring a connection from the connection pool. If HTTPX is unable to acquire a connection within this time frame, a `PoolTimeout` exception is raised. A related configuration here is the maximum number of allowable connections in the connection pool, which is configured by the `limits` argument. You can configure the timeout behavior for any of these values... ```python # A client with a 60s timeout for connecting, and a 10s timeout elsewhere. timeout = httpx2.Timeout(10.0, connect=60.0) client = httpx2.Client(timeout=timeout) response = client.get('http://example.com/') ```pydantic-httpx2-9b7ee8e/docs/advanced/transports.md000066400000000000000000000337031521723372100225350ustar00rootroot00000000000000HTTPX's `Client` also accepts a `transport` argument. This argument allows you to provide a custom Transport object that will be used to perform the actual sending of the requests. ## HTTP Transport For some advanced configuration you might need to instantiate a transport class directly, and pass it to the client instance. One example is the `local_address` configuration which is only available via this low-level API. ```pycon >>> import httpx2 >>> transport = httpx2.HTTPTransport(local_address="0.0.0.0") >>> client = httpx2.Client(transport=transport) ``` Connection retries are also available via this interface. Requests will be retried the given number of times in case an `httpx2.ConnectError` or an `httpx2.ConnectTimeout` occurs, allowing smoother operation under flaky networks. If you need other forms of retry behaviors, such as handling read/write errors or reacting to `503 Service Unavailable`, consider general-purpose tools such as [tenacity](https://github.com/jd/tenacity). ```pycon >>> import httpx2 >>> transport = httpx2.HTTPTransport(retries=1) >>> client = httpx2.Client(transport=transport) ``` Similarly, instantiating a transport directly provides a `uds` option for connecting via a Unix Domain Socket that is only available via this low-level API: ```pycon >>> import httpx2 >>> # Connect to the Docker API via a Unix Socket. >>> transport = httpx2.HTTPTransport(uds="/var/run/docker.sock") >>> client = httpx2.Client(transport=transport) >>> response = client.get("http://docker/info") >>> response.json() {"ID": "...", "Containers": 4, "Images": 74, ...} ``` ## WSGI Transport You can configure an `httpx2` client to call directly into a Python web application using the WSGI protocol. This is particularly useful for two main use-cases: * Using `httpx2` as a client inside test cases. * Mocking out external services during tests or in dev or staging environments. ### Example Here's an example of integrating against a Flask application: ```python from flask import Flask import httpx2 app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" transport = httpx2.WSGITransport(app=app) with httpx2.Client(transport=transport, base_url="http://testserver") as client: r = client.get("/") assert r.status_code == 200 assert r.text == "Hello World!" ``` ### Configuration For some more complex cases you might need to customize the WSGI transport. This allows you to: * Inspect 500 error responses rather than raise exceptions by setting `raise_app_exceptions=False`. * Mount the WSGI application at a subpath by setting `script_name` (WSGI). * Use a given client address for requests by setting `remote_addr` (WSGI). For example: ```python # Instantiate a client that makes WSGI requests with a client IP of "1.2.3.4". transport = httpx2.WSGITransport(app=app, remote_addr="1.2.3.4") with httpx2.Client(transport=transport, base_url="http://testserver") as client: ... ``` ## ASGI Transport You can configure an `httpx2` client to call directly into an async Python web application using the ASGI protocol. This is particularly useful for two main use-cases: * Using `httpx2` as a client inside test cases. * Mocking out external services during tests or in dev or staging environments. ### Example Let's take this Starlette application as an example: ```python from starlette.applications import Starlette from starlette.responses import HTMLResponse from starlette.routing import Route async def hello(request): return HTMLResponse("Hello World!") app = Starlette(routes=[Route("/", hello)]) ``` We can make requests directly against the application, like so: ```python transport = httpx2.ASGITransport(app=app) async with httpx2.AsyncClient(transport=transport, base_url="http://testserver") as client: r = await client.get("/") assert r.status_code == 200 assert r.text == "Hello World!" ``` ### Configuration For some more complex cases you might need to customise the ASGI transport. This allows you to: * Inspect 500 error responses rather than raise exceptions by setting `raise_app_exceptions=False`. * Mount the ASGI application at a subpath by setting `root_path`. * Use a given client address for requests by setting `client`. For example: ```python # Instantiate a client that makes ASGI requests with a client IP of "1.2.3.4", # on port 123. transport = httpx2.ASGITransport(app=app, client=("1.2.3.4", 123)) async with httpx2.AsyncClient(transport=transport, base_url="http://testserver") as client: ... ``` See [the ASGI documentation](https://asgi.readthedocs.io/en/latest/specs/www.html#connection-scope) for more details on the `client` and `root_path` keys. ### ASGI startup and shutdown It is not in the scope of HTTPX to trigger ASGI lifespan events of your app. However it is suggested to use `LifespanManager` from [asgi-lifespan](https://github.com/florimondmanca/asgi-lifespan#usage) in pair with `AsyncClient`. ## Custom transports A transport instance must implement the low-level Transport API which deals with sending a single request, and returning a response. You should either subclass `httpx2.BaseTransport` to implement a transport to use with `Client`, or subclass `httpx2.AsyncBaseTransport` to implement a transport to use with `AsyncClient`. At the layer of the transport API we're using the familiar `Request` and `Response` models. See the `handle_request` and `handle_async_request` docstrings for more details on the specifics of the Transport API. A complete example of a custom transport implementation would be: ```python import json import httpx2 class HelloWorldTransport(httpx2.BaseTransport): """ A mock transport that always returns a JSON "Hello, world!" response. """ def handle_request(self, request): return httpx2.Response(200, json={"text": "Hello, world!"}) ``` Or this example, which uses a custom transport and `httpx2.Mounts` to always redirect `http://` requests. ```python class HTTPSRedirect(httpx2.BaseTransport): """ A transport that always redirects to HTTPS. """ def handle_request(self, request): url = request.url.copy_with(scheme="https") return httpx2.Response(303, headers={"Location": str(url)}) # A client where any `http` requests are always redirected to `https` transport = httpx2.Mounts({ 'http://': HTTPSRedirect() 'https://': httpx2.HTTPTransport() }) client = httpx2.Client(transport=transport) ``` A useful pattern here is custom transport classes that wrap the default HTTP implementation. For example... ```python class DebuggingTransport(httpx2.BaseTransport): def __init__(self, **kwargs): self._wrapper = httpx2.HTTPTransport(**kwargs) def handle_request(self, request): print(f">>> {request}") response = self._wrapper.handle_request(request) print(f"<<< {response}") return response def close(self): self._wrapper.close() transport = DebuggingTransport() client = httpx2.Client(transport=transport) ``` Here's another case, where we're using a round-robin across a number of different proxies... ```python class ProxyRoundRobin(httpx2.BaseTransport): def __init__(self, proxies, **kwargs): self._transports = [ httpx2.HTTPTransport(proxy=proxy, **kwargs) for proxy in proxies ] self._idx = 0 def handle_request(self, request): transport = self._transports[self._idx] self._idx = (self._idx + 1) % len(self._transports) return transport.handle_request(request) def close(self): for transport in self._transports: transport.close() proxies = [ httpx2.Proxy("http://127.0.0.1:8081"), httpx2.Proxy("http://127.0.0.1:8082"), httpx2.Proxy("http://127.0.0.1:8083"), ] transport = ProxyRoundRobin(proxies=proxies) client = httpx2.Client(transport=transport) ``` ## Mock transports During testing it can often be useful to be able to mock out a transport, and return pre-determined responses, rather than making actual network requests. The `httpx2.MockTransport` class accepts a handler function, which can be used to map requests onto pre-determined responses: ```python def handler(request): return httpx2.Response(200, json={"text": "Hello, world!"}) # Switch to a mock transport, if the TESTING environment variable is set. if os.environ.get('TESTING', '').upper() == "TRUE": transport = httpx2.MockTransport(handler) else: transport = httpx2.HTTPTransport() client = httpx2.Client(transport=transport) ``` For more advanced use-cases you might want to take a look at either [the third-party mocking library, RESPX](https://lundberg.github.io/respx/), or the [pytest-httpx2 library](https://github.com/Colin-b/pytest_httpx). ## Mounting transports You can also mount transports against given schemes or domains, to control which transport an outgoing request should be routed via, with [the same style used for specifying proxy routing](#routing). ```python import httpx2 class HTTPSRedirectTransport(httpx2.BaseTransport): """ A transport that always redirects to HTTPS. """ def handle_request(self, method, url, headers, stream, extensions): scheme, host, port, path = url if port is None: location = b"https://%s%s" % (host, path) else: location = b"https://%s:%d%s" % (host, port, path) stream = httpx2.ByteStream(b"") headers = [(b"location", location)] extensions = {} return 303, headers, stream, extensions # A client where any `http` requests are always redirected to `https` mounts = {'http://': HTTPSRedirectTransport()} client = httpx2.Client(mounts=mounts) ``` A couple of other sketches of how you might take advantage of mounted transports... Disabling HTTP/2 on a single given domain... ```python mounts = { "all://": httpx2.HTTPTransport(http2=True), "all://*example.org": httpx2.HTTPTransport() } client = httpx2.Client(mounts=mounts) ``` Mocking requests to a given domain: ```python # All requests to "example.org" should be mocked out. # Other requests occur as usual. def handler(request): return httpx2.Response(200, json={"text": "Hello, World!"}) mounts = {"all://example.org": httpx2.MockTransport(handler)} client = httpx2.Client(mounts=mounts) ``` Adding support for custom schemes: ```python # Support URLs like "file:///Users/sylvia_green/websites/new_client/index.html" mounts = {"file://": FileSystemTransport()} client = httpx2.Client(mounts=mounts) ``` ### Routing HTTPX provides a powerful mechanism for routing requests, allowing you to write complex rules that specify which transport should be used for each request. The `mounts` dictionary maps URL patterns to HTTP transports. HTTPX matches requested URLs against URL patterns to decide which transport should be used, if any. Matching is done from most specific URL patterns (e.g. `https://:`) to least specific ones (e.g. `https://`). HTTPX supports routing requests based on **scheme**, **domain**, **port**, or a combination of these. ### Wildcard routing Route everything through a transport... ```python mounts = { "all://": httpx2.HTTPTransport(proxy="http://localhost:8030"), } ``` ### Scheme routing Route HTTP requests through one transport, and HTTPS requests through another... ```python mounts = { "http://": httpx2.HTTPTransport(proxy="http://localhost:8030"), "https://": httpx2.HTTPTransport(proxy="http://localhost:8031"), } ``` ### Domain routing Proxy all requests on domain "example.com", let other requests pass through... ```python mounts = { "all://example.com": httpx2.HTTPTransport(proxy="http://localhost:8030"), } ``` Proxy HTTP requests on domain "example.com", let HTTPS and other requests pass through... ```python mounts = { "http://example.com": httpx2.HTTPTransport(proxy="http://localhost:8030"), } ``` Proxy all requests to "example.com" and its subdomains, let other requests pass through... ```python mounts = { "all://*example.com": httpx2.HTTPTransport(proxy="http://localhost:8030"), } ``` Proxy all requests to strict subdomains of "example.com", let "example.com" and other requests pass through... ```python mounts = { "all://*.example.com": httpx2.HTTPTransport(proxy="http://localhost:8030"), } ``` ### Port routing Proxy HTTPS requests on port 1234 to "example.com"... ```python mounts = { "https://example.com:1234": httpx2.HTTPTransport(proxy="http://localhost:8030"), } ``` Proxy all requests on port 1234... ```python mounts = { "all://*:1234": httpx2.HTTPTransport(proxy="http://localhost:8030"), } ``` ### No-proxy support It is also possible to define requests that _shouldn't_ be routed through the transport. To do so, pass `None` as the proxy URL. For example... ```python mounts = { # Route requests through a proxy by default... "all://": httpx2.HTTPTransport(proxy="http://localhost:8031"), # Except those for "example.com". "all://example.com": None, } ``` ### Complex configuration example You can combine the routing features outlined above to build complex proxy routing configurations. For example... ```python mounts = { # Route all traffic through a proxy by default... "all://": httpx2.HTTPTransport(proxy="http://localhost:8030"), # But don't use proxies for HTTPS requests to "domain.io"... "https://domain.io": None, # And use another proxy for requests to "example.com" and its subdomains... "all://*example.com": httpx2.HTTPTransport(proxy="http://localhost:8031"), # And yet another proxy if HTTP is used, # and the "internal" subdomain on port 5550 is requested... "http://internal.example.com:5550": httpx2.HTTPTransport(proxy="http://localhost:8032"), } ``` ### Environment variables There are also environment variables that can be used to control the dictionary of the client mounts. They can be used to configure HTTP proxying for clients. See documentation on [`HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY`](../environment_variables.md#http_proxy-https_proxy-all_proxy) and [`NO_PROXY`](../environment_variables.md#no_proxy) for more information. pydantic-httpx2-9b7ee8e/docs/api.md000066400000000000000000000115121521723372100173140ustar00rootroot00000000000000# Developer Interface ## Helper Functions !!! note Only use these functions if you're testing HTTPX in a console or making a small number of requests. Using a `Client` will enable HTTP/2 and connection pooling for more efficient and long-lived connections. ::: httpx2.request ::: httpx2.get ::: httpx2.options ::: httpx2.head ::: httpx2.post ::: httpx2.put ::: httpx2.patch ::: httpx2.delete ::: httpx2.stream ## `Client` ::: httpx2.Client options: members: - headers - cookies - params - auth - request - get - head - options - post - put - patch - delete - stream - sse - build_request - send - close ## `AsyncClient` ::: httpx2.AsyncClient options: members: - headers - cookies - params - auth - request - get - head - options - post - put - patch - delete - stream - sse - build_request - send - aclose ## `Response` *An HTTP response.* * `def __init__(...)` * `.status_code` - **int** * `.reason_phrase` - **str** * `.http_version` - `"HTTP/2"` or `"HTTP/1.1"` * `.url` - **URL** * `.headers` - **Headers** * `.content` - **bytes** * `.text` - **str** * `.encoding` - **str** * `.is_redirect` - **bool** * `.request` - **Request** * `.next_request` - **Optional[Request]** * `.cookies` - **Cookies** * `.history` - **List[Response]** * `.elapsed` - **[timedelta](https://docs.python.org/3/library/datetime.html)** * The amount of time elapsed between sending the request and calling `close()` on the corresponding response received for that request. [total_seconds()](https://docs.python.org/3/library/datetime.html#datetime.timedelta.total_seconds) to correctly get the total elapsed seconds. * `def .raise_for_status()` - **Response** * `def .json()` - **Any** * `def .read()` - **bytes** * `def .iter_raw([chunk_size])` - **bytes iterator** * `def .iter_bytes([chunk_size])` - **bytes iterator** * `def .iter_text([chunk_size])` - **text iterator** * `def .iter_lines()` - **text iterator** * `def .close()` - **None** * `def .next()` - **Response** * `def .aread()` - **bytes** * `def .aiter_raw([chunk_size])` - **async bytes iterator** * `def .aiter_bytes([chunk_size])` - **async bytes iterator** * `def .aiter_text([chunk_size])` - **async text iterator** * `def .aiter_lines()` - **async text iterator** * `def .aclose()` - **None** * `def .anext()` - **Response** ## `Request` *An HTTP request. Can be constructed explicitly for more control over exactly what gets sent over the wire.* ```pycon >>> request = httpx2.Request("GET", "https://example.org", headers={'host': 'example.org'}) >>> response = client.send(request) ``` * `def __init__(method, url, [params], [headers], [cookies], [content], [data], [files], [json], [stream])` * `.method` - **str** * `.url` - **URL** * `.content` - **byte**, **byte iterator**, or **byte async iterator** * `.headers` - **Headers** * `.cookies` - **Cookies** ## `URL` *A normalized, IDNA supporting URL.* ```pycon >>> url = URL("https://example.org/") >>> url.host 'example.org' ``` * `def __init__(url, **kwargs)` * `.scheme` - **str** * `.authority` - **str** * `.host` - **str** * `.port` - **int** * `.path` - **str** * `.query` - **str** * `.raw_path` - **str** * `.fragment` - **str** * `.is_ssl` - **bool** * `.is_absolute_url` - **bool** * `.is_relative_url` - **bool** * `def .copy_with([scheme], [authority], [path], [query], [fragment])` - **URL** ## `Headers` *A case-insensitive multi-dict.* ```pycon >>> headers = Headers({'Content-Type': 'application/json'}) >>> headers['content-type'] 'application/json' ``` * `def __init__(self, headers, encoding=None)` * `def copy()` - **Headers** ## `Cookies` *A dict-like cookie store.* ```pycon >>> cookies = Cookies() >>> cookies.set("name", "value", domain="example.org") ``` * `def __init__(cookies: [dict, Cookies, CookieJar])` * `.jar` - **CookieJar** * `def extract_cookies(response)` * `def set_cookie_header(request)` * `def set(name, value, [domain], [path])` * `def get(name, [domain], [path])` * `def delete(name, [domain], [path])` * `def clear([domain], [path])` * *Standard mutable mapping interface* ## `Proxy` *A configuration of the proxy server.* ```pycon >>> proxy = Proxy("http://proxy.example.com:8030") >>> client = Client(proxy=proxy) ``` * `def __init__(url, [ssl_context], [auth], [headers])` * `.url` - **URL** * `.auth` - **tuple[str, str]** * `.headers` - **Headers** * `.ssl_context` - **SSLContext** ## `EventSource` ::: httpx2.EventSource options: members: - response ## `ServerSentEvent` ::: httpx2.ServerSentEvent options: members: - event - data - id - retry - json pydantic-httpx2-9b7ee8e/docs/async.md000066400000000000000000000144341521723372100176660ustar00rootroot00000000000000# Async Support HTTPX offers a standard synchronous API by default, but also gives you the option of an async client if you need it. Async is a concurrency model that is far more efficient than multi-threading, and can provide significant performance benefits and enable the use of long-lived network connections such as WebSockets. If you're working with an async web framework then you'll also want to use an async client for sending outgoing HTTP requests. ## Making Async requests To make asynchronous requests, you'll need an `AsyncClient`. ```pycon >>> async with httpx2.AsyncClient() as client: ... r = await client.get('https://www.example.com/') ... >>> r ``` !!! tip Use [IPython](https://ipython.readthedocs.io/en/stable/) or Python with `python -m asyncio` to try this code interactively, as they support executing `async`/`await` expressions in the console. ## API Differences If you're using an async client then there are a few bits of API that use async methods. ### Making requests The request methods are all async, so you should use `response = await client.get(...)` style for all of the following: * `AsyncClient.get(url, ...)` * `AsyncClient.options(url, ...)` * `AsyncClient.head(url, ...)` * `AsyncClient.post(url, ...)` * `AsyncClient.put(url, ...)` * `AsyncClient.patch(url, ...)` * `AsyncClient.delete(url, ...)` * `AsyncClient.request(method, url, ...)` * `AsyncClient.send(request, ...)` ### Opening and closing clients Use `async with httpx2.AsyncClient()` if you want a context-managed client... ```python async with httpx2.AsyncClient() as client: ... ``` !!! warning In order to get the most benefit from connection pooling, make sure you're not instantiating multiple client instances - for example by using `async with` inside a "hot loop". This can be achieved either by having a single scoped client that's passed throughout wherever it's needed, or by having a single global client instance. Alternatively, use `await client.aclose()` if you want to close a client explicitly: ```python client = httpx2.AsyncClient() ... await client.aclose() ``` ### Streaming responses The `AsyncClient.stream(method, url, ...)` method is an async context block. ```pycon >>> client = httpx2.AsyncClient() >>> async with client.stream('GET', 'https://www.example.com/') as response: ... async for chunk in response.aiter_bytes(): ... ... ``` The async response streaming methods are: * `Response.aread()` - For conditionally reading a response inside a stream block. * `Response.aiter_bytes()` - For streaming the response content as bytes. * `Response.aiter_text()` - For streaming the response content as text. * `Response.aiter_lines()` - For streaming the response content as lines of text. * `Response.aiter_raw()` - For streaming the raw response bytes, without applying content decoding. * `Response.aclose()` - For closing the response. You don't usually need this, since `.stream` block closes the response automatically on exit. For situations when context block usage is not practical, it is possible to enter "manual mode" by sending a [`Request` instance](advanced/clients.md#request-instances) using `client.send(..., stream=True)`. Example in the context of forwarding the response to a streaming web endpoint with [Starlette](https://www.starlette.io): ```python import httpx2 from starlette.background import BackgroundTask from starlette.responses import StreamingResponse client = httpx2.AsyncClient() async def home(request): req = client.build_request("GET", "https://www.example.com/") r = await client.send(req, stream=True) return StreamingResponse(r.aiter_text(), background=BackgroundTask(r.aclose)) ``` !!! warning When using this "manual streaming mode", it is your duty as a developer to make sure that `Response.aclose()` is called eventually. Failing to do so would leave connections open, most likely resulting in resource leaks down the line. ### Streaming requests When sending a streaming request body with an `AsyncClient` instance, you should use an async bytes generator instead of a bytes generator: ```python async def upload_bytes(): ... # yield byte content await client.post(url, content=upload_bytes()) ``` ### Explicit transport instances When instantiating a transport instance directly, you need to use `httpx2.AsyncHTTPTransport`. For instance: ```pycon >>> import httpx2 >>> transport = httpx2.AsyncHTTPTransport(retries=1) >>> async with httpx2.AsyncClient(transport=transport) as client: >>> ... ``` ## Supported async environments HTTPX supports either `asyncio` or `trio` as an async environment. It will auto-detect which of those two to use as the backend for socket operations and concurrency primitives. ### [AsyncIO](https://docs.python.org/3/library/asyncio.html) AsyncIO is Python's [built-in library](https://docs.python.org/3/library/asyncio.html) for writing concurrent code with the async/await syntax. ```python import asyncio import httpx2 async def main(): async with httpx2.AsyncClient() as client: response = await client.get('https://www.example.com/') print(response) asyncio.run(main()) ``` ### [Trio](https://github.com/python-trio/trio) Trio is [an alternative async library](https://trio.readthedocs.io/en/stable/), designed around the [the principles of structured concurrency](https://en.wikipedia.org/wiki/Structured_concurrency). ```python import httpx2 import trio async def main(): async with httpx2.AsyncClient() as client: response = await client.get('https://www.example.com/') print(response) trio.run(main) ``` !!! important The `trio` package must be installed to use the Trio backend. ### [AnyIO](https://github.com/agronholm/anyio) AnyIO is an [asynchronous networking and concurrency library](https://anyio.readthedocs.io/) that works on top of either `asyncio` or `trio`. It blends in with native libraries of your chosen backend (defaults to `asyncio`). ```python import httpx2 import anyio async def main(): async with httpx2.AsyncClient() as client: response = await client.get('https://www.example.com/') print(response) anyio.run(main, backend='trio') ``` ## Calling into Python Web Apps For details on calling directly into ASGI applications, see [the `ASGITransport` docs](../advanced/transports#asgitransport).pydantic-httpx2-9b7ee8e/docs/code_of_conduct.md000066400000000000000000000110321521723372100216550ustar00rootroot00000000000000# Code of Conduct We expect contributors to our projects and online spaces to follow [the Python Software Foundation’s Code of Conduct](https://www.python.org/psf/conduct/). The Python community is made up of members from around the globe with a diverse set of skills, personalities, and experiences. It is through these differences that our community experiences great successes and continued growth. When you're working with members of the community, this Code of Conduct will help steer your interactions and keep Python a positive, successful, and growing community. ## Our Community Members of the Python community are **open, considerate, and respectful**. Behaviours that reinforce these values contribute to a positive environment, and include: * **Being open.** Members of the community are open to collaboration, whether it's on PEPs, patches, problems, or otherwise. * **Focusing on what is best for the community.** We're respectful of the processes set forth in the community, and we work within them. * **Acknowledging time and effort.** We're respectful of the volunteer efforts that permeate the Python community. We're thoughtful when addressing the efforts of others, keeping in mind that often times the labor was completed simply for the good of the community. * **Being respectful of differing viewpoints and experiences.** We're receptive to constructive comments and criticism, as the experiences and skill sets of other members contribute to the whole of our efforts. * **Showing empathy towards other community members.** We're attentive in our communications, whether in person or online, and we're tactful when approaching differing views. * **Being considerate.** Members of the community are considerate of their peers -- other Python users. * **Being respectful.** We're respectful of others, their positions, their skills, their commitments, and their efforts. * **Gracefully accepting constructive criticism.** When we disagree, we are courteous in raising our issues. * **Using welcoming and inclusive language.** We're accepting of all who wish to take part in our activities, fostering an environment where anyone can participate and everyone can make a difference. ## Our Standards Every member of our community has the right to have their identity respected. The Python community is dedicated to providing a positive experience for everyone, regardless of age, gender identity and expression, sexual orientation, disability, physical appearance, body size, ethnicity, nationality, race, or religion (or lack thereof), education, or socio-economic status. ## Inappropriate Behavior Examples of unacceptable behavior by participants include: * Harassment of any participants in any form * Deliberate intimidation, stalking, or following * Logging or taking screenshots of online activity for harassment purposes * Publishing others' private information, such as a physical or electronic address, without explicit permission * Violent threats or language directed against another person * Incitement of violence or harassment towards any individual, including encouraging a person to commit suicide or to engage in self-harm * Creating additional online accounts in order to harass another person or circumvent a ban * Sexual language and imagery in online communities or in any conference venue, including talks * Insults, put downs, or jokes that are based upon stereotypes, that are exclusionary, or that hold others up for ridicule * Excessive swearing * Unwelcome sexual attention or advances * Unwelcome physical contact, including simulated physical contact (eg, textual descriptions like "hug" or "backrub") without consent or after a request to stop * Pattern of inappropriate social contact, such as requesting/assuming inappropriate levels of intimacy with others * Sustained disruption of online community discussions, in-person presentations, or other in-person events * Continued one-on-one communication after requests to cease * Other conduct that is inappropriate for a professional audience including people of many different backgrounds Community members asked to stop any inappropriate behavior are expected to comply immediately. ## Enforcement We take Code of Conduct violations seriously, and will act to ensure our spaces are welcoming, inclusive, and professional environments to communicate in. If you need to raise a Code of Conduct report, you may do so privately by email to hello@pydantic.dev. Reports will be treated confidentially. Alternately you may [make a report to the Python Software Foundation](https://www.python.org/psf/conduct/reporting/). pydantic-httpx2-9b7ee8e/docs/compatibility.md000066400000000000000000000233161521723372100214210ustar00rootroot00000000000000# Requests Compatibility Guide HTTPX aims to be broadly compatible with the `requests` API, although there are a few design differences in places. This documentation outlines places where the API differs... ## Redirects Unlike `requests`, HTTPX does **not follow redirects by default**. We differ in behaviour here [because auto-redirects can easily mask unnecessary network calls being made](https://github.com/encode/httpx/discussions/1785). You can still enable behaviour to automatically follow redirects, but you need to do so explicitly... ```python response = client.get(url, follow_redirects=True) ``` Or else instantiate a client, with redirect following enabled by default... ```python client = httpx2.Client(follow_redirects=True) ``` ## Client instances The HTTPX equivalent of `requests.Session` is `httpx2.Client`. ```python session = requests.Session(**kwargs) ``` is generally equivalent to ```python client = httpx2.Client(**kwargs) ``` ## Request URLs Accessing `response.url` will return a `URL` instance, rather than a string. Use `str(response.url)` if you need a string instance. ## Determining the next redirect request The `requests` library exposes an attribute `response.next`, which can be used to obtain the next redirect request. ```python session = requests.Session() request = requests.Request("GET", ...).prepare() while request is not None: response = session.send(request, allow_redirects=False) request = response.next ``` In HTTPX, this attribute is instead named `response.next_request`. For example: ```python client = httpx2.Client() request = client.build_request("GET", ...) while request is not None: response = client.send(request) request = response.next_request ``` ## Request Content For uploading raw text or binary content we prefer to use a `content` parameter, in order to better separate this usage from the case of uploading form data. For example, using `content=...` to upload raw content: ```python # Uploading text, bytes, or a bytes iterator. httpx2.post(..., content=b"Hello, world") ``` And using `data=...` to send form data: ```python # Uploading form data. httpx2.post(..., data={"message": "Hello, world"}) ``` Using the `data=` will raise a deprecation warning, and is expected to be fully removed with the HTTPX 1.0 release. ## Upload files HTTPX strictly enforces that upload files must be opened in binary mode, in order to avoid character encoding issues that can result from attempting to upload files opened in text mode. ## Content encoding HTTPX uses `utf-8` for encoding `str` request bodies. For example, when using `content=` the request body will be encoded to `utf-8` before being sent over the wire. This differs from Requests which uses `latin1`. If you need an explicit encoding, pass encoded bytes explicitly, e.g. `content=.encode("latin1")`. For response bodies, assuming the server didn't send an explicit encoding then HTTPX will do its best to figure out an appropriate encoding. HTTPX makes a guess at the encoding to use for decoding the response using `charset_normalizer`. Fallback to that or any content with less than 32 octets will be decoded using `utf-8` with the `error="replace"` decoder strategy. ## Cookies If using a client instance, then cookies should always be set on the client rather than on a per-request basis. This usage is supported: ```python client = httpx2.Client(cookies=...) client.post(...) ``` This usage is **not** supported: ```python client = httpx2.Client() client.post(..., cookies=...) ``` We prefer enforcing a stricter API here because it provides clearer expectations around cookie persistence, particularly when redirects occur. ## Status Codes In our documentation we prefer the uppercased versions, such as `codes.NOT_FOUND`, but also provide lower-cased versions for API compatibility with `requests`. Requests includes various synonyms for status codes that HTTPX does not support. ## Streaming responses HTTPX provides a `.stream()` interface rather than using `stream=True`. This ensures that streaming responses are always properly closed outside of the stream block, and makes it visually clearer at which points streaming I/O APIs may be used with a response. For example: ```python with httpx2.stream("GET", "https://www.example.com") as response: ... ``` Within a `stream()` block request data is made available with: * `.iter_bytes()` - Instead of `response.iter_content()` * `.iter_text()` - Instead of `response.iter_content(decode_unicode=True)` * `.iter_lines()` - Corresponding to `response.iter_lines()` * `.iter_raw()` - Use this instead of `response.raw` * `.read()` - Read the entire response body, making `response.text` and `response.content` available. ## Timeouts HTTPX defaults to including reasonable [timeouts](quickstart.md#timeouts) for all network operations, while Requests has no timeouts by default. To get the same behavior as Requests, set the `timeout` parameter to `None`: ```python httpx2.get('https://www.example.com', timeout=None) ``` ## Proxy keys HTTPX uses the mounts argument for HTTP proxying and transport routing. It can do much more than proxies and allows you to configure more than just the proxy route. For more detailed documentation, see [Mounting Transports](advanced/transports.md#mounting-transports). When using `httpx2.Client(mounts={...})` to map to a selection of different transports, we use full URL schemes, such as `mounts={"http://": ..., "https://": ...}`. This is different to the `requests` usage of `proxies={"http": ..., "https": ...}`. This change is for better consistency with more complex mappings, that might also include domain names, such as `mounts={"all://": ..., httpx2.HTTPTransport(proxy="all://www.example.com": None})` which maps all requests onto a proxy, except for requests to "www.example.com" which have an explicit exclusion. Also note that `requests.Session.request(...)` allows a `proxies=...` parameter, whereas `httpx2.Client.request(...)` does not allow `mounts=...`. ## SSL configuration When using a `Client` instance, the ssl configurations should always be passed on client instantiation, rather than passed to the request method. If you need more than one different SSL configuration, you should use different client instances for each SSL configuration. ## Request body on HTTP methods The HTTP `GET`, `DELETE`, `HEAD`, and `OPTIONS` methods are specified as not supporting a request body. To stay in line with this, the `.get`, `.delete`, `.head` and `.options` functions do not support `content`, `files`, `data`, or `json` arguments. If you really do need to send request data using these http methods you should use the generic `.request` function instead. ```python httpx2.request( method="DELETE", url="https://www.example.com/", content=b'A request body on a DELETE request.' ) ``` ## Checking for success and failure responses We don't support `response.is_ok` since the naming is ambiguous there, and might incorrectly imply an equivalence to `response.status_code == codes.OK`. Instead we provide the `response.is_success` property, which can be used to check for a 2xx response. ## Request instantiation There is no notion of [prepared requests](https://requests.readthedocs.io/en/stable/user/advanced/#prepared-requests) in HTTPX. If you need to customize request instantiation, see [Request instances](advanced/clients.md#request-instances). Besides, `httpx2.Request()` does not support the `auth`, `timeout`, `follow_redirects`, `mounts`, `verify` and `cert` parameters. However these are available in `httpx2.request`, `httpx2.get`, `httpx2.post` etc., as well as on [`Client` instances](advanced/clients.md#sharing-configuration-across-requests). ## Mocking If you need to mock HTTPX the same way that test utilities like `responses` and `requests-mock` does for `requests`, see [RESPX](https://github.com/lundberg/respx). ## Caching If you use `cachecontrol` or `requests-cache` to add HTTP Caching support to the `requests` library, you can use [Hishel](https://hishel.com) for HTTPX. ## Networking layer `requests` defers most of its HTTP networking code to the excellent [`urllib3` library](https://urllib3.readthedocs.io/en/latest/). On the other hand, HTTPX uses [HTTPCore](https://github.com/encode/httpcore) as its core HTTP networking layer, which is a different project than `urllib3`. ## Query Parameters `requests` omits `params` whose values are `None` (e.g. `requests.get(..., params={"foo": None})`). This is not supported by HTTPX. For both query params (`params=`) and form data (`data=`), `requests` supports sending a list of tuples (e.g. `requests.get(..., params=[('key1', 'value1'), ('key1', 'value2')])`). This is not supported by HTTPX. Instead, use a dictionary with lists as values. E.g.: `httpx2.get(..., params={'key1': ['value1', 'value2']})` or with form data: `httpx2.post(..., data={'key1': ['value1', 'value2']})`. ## Event Hooks `requests` allows event hooks to mutate `Request` and `Response` objects. See [examples](https://requests.readthedocs.io/en/master/user/advanced/#event-hooks) given in the documentation for `requests`. In HTTPX, event hooks may access properties of requests and responses, but event hook callbacks cannot mutate the original request/response. If you are looking for more control, consider checking out [Custom Transports](advanced/transports.md#custom-transports). ## Exceptions and Errors `requests` exception hierarchy is slightly different to the `httpx2` exception hierarchy. `requests` exposes a top level `RequestException`, where as `httpx2` exposes a top level `HTTPError`. see the exceptions exposes in requests [here](https://requests.readthedocs.io/en/latest/_modules/requests/exceptions/). See the `httpx2` error hierarchy [here](https://httpx2.pydantic.dev/exceptions/). pydantic-httpx2-9b7ee8e/docs/contributing.md000066400000000000000000000200571521723372100212560ustar00rootroot00000000000000# Contributing Thank you for being interested in contributing to HTTPX. There are many ways you can contribute to the project: - Try HTTPX and [report bugs/issues you find](https://github.com/pydantic/httpx2/issues/new) - [Implement new features](https://github.com/pydantic/httpx2/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) - [Review Pull Requests of others](https://github.com/pydantic/httpx2/pulls) - Write documentation - Participate in discussions ## Reporting Bugs or Other Issues Found something that HTTPX should support? Stumbled upon some unexpected behaviour? Contributions should generally start out with [a discussion](https://github.com/pydantic/httpx2/discussions). Possible bugs may be raised as a "Potential Issue" discussion, feature requests may be raised as an "Ideas" discussion. We can then determine if the discussion needs to be escalated into an "Issue" or not, or if we'd consider a pull request. Try to be more descriptive as you can and in case of a bug report, provide as much information as possible like: - OS platform - Python version - Installed dependencies and versions (`python -m pip freeze`) - Code snippet - Error traceback You should always try to reduce any examples to the *simplest possible case* that demonstrates the issue. Some possibly useful tips for narrowing down potential issues... - Does the issue exist on HTTP/1.1, or HTTP/2, or both? - Does the issue exist with `Client`, `AsyncClient`, or both? - When using `AsyncClient` does the issue exist when using `asyncio` or `trio`, or both? ## Development To start developing HTTPX create a **fork** of the [HTTPX repository](https://github.com/pydantic/httpx2) on GitHub. Then clone your fork with the following command replacing `YOUR-USERNAME` with your GitHub username: ```shell $ git clone https://github.com/YOUR-USERNAME/httpx2 ``` You can now install the project and its dependencies using: ```shell $ cd httpx2 $ scripts/install ``` ## Testing and Linting We use custom shell scripts to automate testing, linting, and documentation building workflow. To run the tests, use: ```shell $ scripts/test ``` Any additional arguments will be passed to `pytest`. See the [pytest documentation](https://docs.pytest.org/en/latest/how-to/usage.html) for more information. For example, to run a single test script: ```shell $ scripts/test tests/test_multipart.py ``` To run the code auto-formatting: ```shell $ scripts/lint ``` Lastly, to run code checks separately (they are also run as part of `scripts/test`), run: ```shell $ scripts/check ``` ## Documenting Documentation pages are located under the `docs/` folder. To run the documentation site locally (useful for previewing changes), use: ```shell $ scripts/docs ``` ## Resolving Build / CI Failures Once you've submitted your pull request, the test suite will automatically run, and the results will show up in GitHub. If the test suite fails, you'll want to click through to the "Details" link, and try to identify why the test suite failed.

Failing PR commit status

Here are some common ways the test suite can fail: ### Check Job Failed

Failing GitHub action lint job

This job failing means there is either a code formatting issue or type-annotation issue. You can look at the job output to figure out why it's failed or within a shell run: ```shell $ scripts/check ``` It may be worth it to run `$ scripts/lint` to attempt auto-formatting the code and if that job succeeds commit the changes. ### Docs Job Failed This job failing means the documentation failed to build. This can happen for a variety of reasons like invalid markdown or missing configuration within `mkdocs.yml`. ### Python 3.X Job Failed

Failing GitHub action test job

This job failing means the unit tests failed or not all code paths are covered by unit tests. If tests are failing you will see this message under the coverage report: `=== 1 failed, 435 passed, 1 skipped, 1 xfailed in 11.09s ===` If tests succeed but coverage doesn't reach our current threshold, you will see this message under the coverage report: `FAIL Required test coverage of 100% not reached. Total coverage: 99.00%` ## Releasing *This section is targeted at HTTPX maintainers.* Before releasing a new version, create a pull request that includes: - **An update to the changelog**: - We follow the format from [keepachangelog](https://keepachangelog.com/en/1.0.0/). - [Compare](https://github.com/pydantic/httpx2/compare/) `master` with the tag of the latest release, and list all entries that are of interest to our users: - Things that **must** go in the changelog: added, changed, deprecated or removed features, and bug fixes. - Things that **should not** go in the changelog: changes to documentation, tests or tooling. - Try sorting entries in descending order of impact / importance. - Keep it concise and to-the-point. 🎯 - **A version bump**: see `__version__.py`. For an example, see [#1006](https://github.com/encode/httpx/pull/1006). Once the release PR is merged, create a [new release](https://github.com/pydantic/httpx2/releases/new) including: - Tag version like `0.13.3`. - Release title `Version 0.13.3` - Description copied from the changelog. Once created this release will be automatically uploaded to PyPI. If something goes wrong with the PyPI job the release can be published using the `scripts/publish` script. ## Development proxy setup To test and debug requests via a proxy it's best to run a proxy server locally. Any server should do but HTTPCore's test suite uses [`mitmproxy`](https://mitmproxy.org/) which is written in Python, it's fully featured and has excellent UI and tools for introspection of requests. You can install `mitmproxy` using `pip install mitmproxy` or [several other ways](https://docs.mitmproxy.org/stable/overview-installation/). `mitmproxy` does require setting up local TLS certificates for HTTPS requests, as its main purpose is to allow developers to inspect requests that pass through it. We can set them up follows: 1. [`pip install trustme-cli`](https://github.com/sethmlarson/trustme-cli/). 2. `trustme-cli -i example.org www.example.org`, assuming you want to test connecting to that domain, this will create three files: `server.pem`, `server.key` and `client.pem`. 3. `mitmproxy` requires a PEM file that includes the private key and the certificate so we need to concatenate them: `cat server.key server.pem > server.withkey.pem`. 4. Start the proxy server `mitmproxy --certs server.withkey.pem`, or use the [other mitmproxy commands](https://docs.mitmproxy.org/stable/) with different UI options. At this point the server is ready to start serving requests, you'll need to configure HTTPX as described in the [proxy section](https://httpx2.pydantic.dev/advanced/proxies/#http-proxies) and the [SSL certificates section](https://httpx2.pydantic.dev/advanced/ssl/), this is where our previously generated `client.pem` comes in: ```python ctx = ssl.create_default_context(cafile="/path/to/client.pem") client = httpx2.Client(proxy="http://127.0.0.1:8080/", verify=ctx) ``` Note, however, that HTTPS requests will only succeed to the host specified in the SSL/TLS certificate we generated, HTTPS requests to other hosts will raise an error like: ``` ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: Hostname mismatch, certificate is not valid for 'duckduckgo.com'. (_ssl.c:1108) ``` If you want to make requests to more hosts you'll need to regenerate the certificates and include all the hosts you intend to connect to in the seconds step, i.e. `trustme-cli -i example.org www.example.org duckduckgo.com www.duckduckgo.com` pydantic-httpx2-9b7ee8e/docs/css/000077500000000000000000000000001521723372100170115ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/docs/css/custom.css000066400000000000000000000002731521723372100210370ustar00rootroot00000000000000div.autodoc-docstring { padding-left: 20px; margin-bottom: 30px; border-left: 5px solid rgba(230, 230, 230); } div.autodoc-members { padding-left: 20px; margin-bottom: 15px; } pydantic-httpx2-9b7ee8e/docs/environment_variables.md000066400000000000000000000054521521723372100231450ustar00rootroot00000000000000# Environment Variables The HTTPX library can be configured via environment variables. Environment variables are used by default. To ignore environment variables, `trust_env` has to be set `False`. There are two ways to set `trust_env` to disable environment variables: * On the client via `httpx2.Client(trust_env=False)`. * Using the top-level API, such as `httpx2.get("", trust_env=False)`. Here is a list of environment variables that HTTPX recognizes and what function they serve: ## Proxies The environment variables documented below are used as a convention by various HTTP tooling, including: * [cURL](https://github.com/curl/curl/blob/master/docs/MANUAL.md#environment-variables) * [requests](https://github.com/psf/requests/blob/master/docs/user/advanced.rst#proxies) For more information on using proxies in HTTPX, see [HTTP Proxies](advanced/proxies.md#http-proxies). ### `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` Valid values: A URL to a proxy `HTTP_PROXY`, `HTTPS_PROXY`, `ALL_PROXY` set the proxy to be used for `http`, `https`, or all requests respectively. ```bash export HTTP_PROXY=http://my-external-proxy.com:1234 # This request will be sent through the proxy python -c "import httpx2; httpx2.get('http://example.com')" # This request will be sent directly, as we set `trust_env=False` python -c "import httpx2; httpx2.get('http://example.com', trust_env=False)" ``` ### `NO_PROXY` Valid values: a comma-separated list of hostnames/urls `NO_PROXY` disables the proxy for specific urls ```bash export HTTP_PROXY=http://my-external-proxy.com:1234 export NO_PROXY=http://127.0.0.1,python-httpx2.org # As in the previous example, this request will be sent through the proxy python -c "import httpx2; httpx2.get('http://example.com')" # These requests will be sent directly, bypassing the proxy python -c "import httpx2; httpx2.get('http://127.0.0.1:5000/my-api')" python -c "import httpx2; httpx2.get('https://httpx2.pydantic.dev')" ``` ## `SSL_CERT_FILE` Valid values: a filename If this environment variable is set then HTTPX will load CA certificate from the specified file instead of the default location. Example: ```console SSL_CERT_FILE=/path/to/ca-certs/ca-bundle.crt python -c "import httpx2; httpx2.get('https://example.com')" ``` ## `SSL_CERT_DIR` Valid values: a directory following an [OpenSSL specific layout](https://www.openssl.org/docs/manmaster/man3/SSL_CTX_load_verify_locations.html). If this environment variable is set and the directory follows an [OpenSSL specific layout](https://www.openssl.org/docs/manmaster/man3/SSL_CTX_load_verify_locations.html) (ie. you ran `c_rehash`) then HTTPX will load CA certificates from this directory instead of the default location. Example: ```console SSL_CERT_DIR=/path/to/ca-certs/ python -c "import httpx2; httpx2.get('https://example.com')" ``` pydantic-httpx2-9b7ee8e/docs/exceptions.md000066400000000000000000000033101521723372100207210ustar00rootroot00000000000000# Exceptions This page lists exceptions that may be raised when using HTTPX. For an overview of how to work with HTTPX exceptions, see [Exceptions (Quickstart)](quickstart.md#exceptions). ## The exception hierarchy * HTTPError * RequestError * TransportError * TimeoutException * ConnectTimeout * ReadTimeout * WriteTimeout * PoolTimeout * NetworkError * ConnectError * ReadError * WriteError * CloseError * ProtocolError * LocalProtocolError * RemoteProtocolError * ProxyError * UnsupportedProtocol * SSEError * DecodingError * TooManyRedirects * HTTPStatusError * InvalidURL * CookieConflict * StreamError * StreamConsumed * ResponseNotRead * RequestNotRead * StreamClosed --- ## Exception classes ::: httpx2.HTTPError ::: httpx2.RequestError ::: httpx2.TransportError ::: httpx2.TimeoutException ::: httpx2.ConnectTimeout ::: httpx2.ReadTimeout ::: httpx2.WriteTimeout ::: httpx2.PoolTimeout ::: httpx2.NetworkError ::: httpx2.ConnectError ::: httpx2.ReadError ::: httpx2.WriteError ::: httpx2.CloseError ::: httpx2.ProtocolError ::: httpx2.LocalProtocolError ::: httpx2.RemoteProtocolError ::: httpx2.ProxyError ::: httpx2.UnsupportedProtocol ::: httpx2.SSEError ::: httpx2.DecodingError ::: httpx2.TooManyRedirects ::: httpx2.HTTPStatusError ::: httpx2.InvalidURL ::: httpx2.CookieConflict ::: httpx2.StreamError ::: httpx2.StreamConsumed ::: httpx2.StreamClosed ::: httpx2.ResponseNotRead ::: httpx2.RequestNotRead pydantic-httpx2-9b7ee8e/docs/http2.md000066400000000000000000000050201521723372100176010ustar00rootroot00000000000000# HTTP/2 HTTP/2 is a major new iteration of the HTTP protocol, that provides a far more efficient transport, with potential performance benefits. HTTP/2 does not change the core semantics of the request or response, but alters the way that data is sent to and from the server. Rather than the text format that HTTP/1.1 uses, HTTP/2 is a binary format. The binary format provides full request and response multiplexing, and efficient compression of HTTP headers. The stream multiplexing means that where HTTP/1.1 requires one TCP stream for each concurrent request, HTTP/2 allows a single TCP stream to handle multiple concurrent requests. HTTP/2 also provides support for functionality such as response prioritization, and server push. For a comprehensive guide to HTTP/2 you may want to check out "[http2 explained](https://http2-explained.haxx.se/)". ## Enabling HTTP/2 When using the `httpx2` client, HTTP/2 support is not enabled by default, because HTTP/1.1 is a mature, battle-hardened transport layer, and our HTTP/1.1 implementation may be considered the more robust option at this point in time. It is possible that a future version of `httpx2` may enable HTTP/2 support by default. If you're issuing highly concurrent requests you might want to consider trying out our HTTP/2 support. You can do so by first making sure to install the optional HTTP/2 dependencies... ```shell pip install 'httpx2[http2]' ``` And then instantiating a client with HTTP/2 support enabled: ```python client = httpx2.AsyncClient(http2=True) ... ``` You can also instantiate a client as a context manager, to ensure that all HTTP connections are nicely scoped, and will be closed once the context block is exited. ```python async with httpx2.AsyncClient(http2=True) as client: ... ``` HTTP/2 support is available on both `Client` and `AsyncClient`, although it's typically more useful in async contexts if you're issuing lots of concurrent requests. ## Inspecting the HTTP version Enabling HTTP/2 support on the client does not *necessarily* mean that your requests and responses will be transported over HTTP/2, since both the client *and* the server need to support HTTP/2. If you connect to a server that only supports HTTP/1.1 the client will use a standard HTTP/1.1 connection instead. You can determine which version of the HTTP protocol was used by examining the `.http_version` property on the response. ```python client = httpx2.AsyncClient(http2=True) response = await client.get(...) print(response.http_version) # "HTTP/1.0", "HTTP/1.1", or "HTTP/2". ``` pydantic-httpx2-9b7ee8e/docs/img/000077500000000000000000000000001521723372100167755ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/docs/img/butterfly.png000066400000000000000000024674021521723372100215420ustar00rootroot00000000000000‰PNG  IHDR£ŒMJViCCPICC Profile(‘c``RI,(Θaa``ΘΝ+) rwRˆˆŒR`Θΐ„Ό b ‰ΙΕŽ>@% 0|»Ζΐ’/λ‚Μ:%5΅I΅^ΐΧb¦πΥ‹―D›0Υ£�”Τβd ύˆS“ ŠJS€lες’»Θ): Ȟb§CΨ@μ$ϋXMH3}ΘVHΞHšΑψΘΦIBOGbCνn—Μβ‚œΔJ…c�%”€V”€hηό‚Κ’ΜτŒG`(₯*xζ%λι(š30€Β’ϊs 8,ΕΠĚο30Ψξ����n„˜Χ~†@\;b ‚ά 'v$%‚…˜˜)-αΣrήHα @=ΡΕiΖF`yF'Φ{��Vc``ŸΜΐπwΒ��Ώύ��w1Pσ†y!eξ΄ωι pHYs  šœ%iTXtXML:com.adobe.xmp 2 0 72 1 72 1038 1 675 2020-11-04T11:11:96 Pixelmator 3.9 BύW¦@IDATxμέ`\Ε΅πρΩή΄*–d[ξV―V΅δ"χŽΖΨΈaΐτJσA" !„HBy “<Β‹L 9”`š\q—¬.­Άίο\ρxΟIθ–₯έΥ£-wηΞόξjuηά33JqC@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ΰ(΄Ί:‹¦ΥΫ4M3E1Ό@£ΰΠQρρf@@ χ$P`ψΥ―»ώ{—ŸΤΪξμŽwΏίP[ϋΰΰ3:{o”ˆ €ΐ 8ψb^E@ϊT@όΰκs όΉΫ|ΰ,«Ε¬όΑPσ^xβ-©Θίϊ΄2μ @0’€ € zΠΰφλ―Θόύ�|gg·o–f0*ΝhQ«5ηt#£–Τ@`  8hGœφ"€ €@Δ όδΊK3ξ�Νξνκκžf²Ϊ”ΡdU&³,–χϟ΄3b+NΕ@bZ€ΐAL^‡ €Ρ" 5~ΰ~τ©η�μμμœa2Ϋ•ΑdVF³Y%Ήγ:²GψEBΡΒΆhi υDˆ-ζ8ˆ­γIk@@ ΄;ν NXqΖ‘†ΖuFΙ0! Κh0+»Ν� ’όΛ~οŠ? †p6*#€Δ€ƒ8ˆ4@’Y@3\vΓΪ‚έϋ^f²:l%™&“2ΙΏAρξί―9αψ†wEs ©; €@t 0T!Ί΅G@(Ψϊμ#I›_yνۚ2 3υk:šdΨTRΌλοs&U]3{Ν™‡’Ό‰T@ Κ Q^ͺ €D­€¦m΅Ξš°ϊ[{5ύΠl±™ ²Š‚ΥjUρNWύΔ’ό3~ψ‹�x™! Q{x©8 3 Uˆ™CIC@@ ͺdιΕ Ο^“ΎχΠα3Μf‡IΣΒΚl6)—Γў?vτw%hπ Aƒ¨:’TˆY†*Δμ‘₯a € ΙΫ·<ΏωΕΏ]�Œ9šœ‘™e…8§K₯$Δ�ςžήςΈ B‘\κ† 0pΘ88ǚ–"€ €@„h΅΅ζEW^Ήάο.·Θ|J”U~Ίœφ�^4gΪ­†±c½RUͺ €€"γ€ € Π‡²Τ’αφ�~xμξέ{/4ƒ l2―ΓnoΜ9β{g\qνΎ>¬»B@ΰKΘ8ψR"6@@zQ q³λ7=y l*1Λ’‹ Ψ,-9>ξޟ]wΓλ2DAλΕ½Q €G-@ΰΰ¨ )@ψjšΆΙtβόοΞkνπ¬2Ϋμς&’`Ά¨D—σεΥsάcΘΚς}΅’Ψ @Ύ`¨BίY³'@ΰίΉsΘΦχ?ΊT–]tΛ0e4”Ρ¨5fŽρύUW\qp€σΠ|@ γ B ΥB@ΨΠ꟢MZ~αڐΑ8ΡζpHΐΐ€άqNZjΒMηύgΝ ,½[Η›Φ €±$@ΖA,MΪ‚|E}r6mΟ«ωi•¦―ψ66Co( �Ξ]ω£r[ΪΟ2™-=hΰtΨTZrΒݏ<υΰ=†�7,š·!€ pΜΘ88ζΔμˆ4ΝpγU«²ž|²φ;Α°Α”>zτk΅O>ψЌū›dΌ5“²EΪα’>±!pθηm~ν£Ω–i4™•ΙdTn—ύΥγf—έj0 σΔF#i €@¬ q«G–v!€Ÿ+`ΠšΊ³άΙCΧ9βΦ||ΰπOoύΙOξ~θ�F(₯>χmΌ€ίH@««³Μ:ώδΥίZ³Ε¦Μf³Šw9χgΎζ΄KΌχΚ›@θC�Sϋ›]!€‘"°ϊ„jΫΎ}-KΊ<ώxΙ20ψό‚ν;wŽΉω-/=ό‡η;"₯žΤXh3·εlyσΓ;$h0Τ$A‡Γζ-ΘuΙ<ϊ'ζ5ˆ…#L@Ψ γ φ1-DώMΰ[§―ά™ηϊ«IR¦ƒΑ€ςωΌκpsσ²ίώφ5ZΣkLΰ†½! νΩγxiσίΞ …BΩF“IΩlV•š”πΫԜρΈ ‚½±Κ@@ΰX 88ΦΒ”D €aΘ\OFϊπ»μ6λA‹Υ.KΒYT0VZO>χΒλΦkΪVkV›*!UšVk^΄vٜΦ6ΟZ«έ©œN»œ�ϋ«NYwUjξR2{’κhRY@`` 8ΨǟΦ#€ΐ@0΄knώξkι#†άο’+ ‘PP…dzΗgΫξ7}η� %³ΐTڍ@oάvέ¦QνήWc±Ϋ“νv»ŠsΎpόŒκ+'―?·‘7Κ§ @ϊJ€ΐA_I³@ Β †,ίκΥw¦ Nω“Γ'3˜%€Vννν#^ώ떍u›Jް*S’F@ΣvΪσȟΟ�”±ΤιŠS’έ³½*?cγYίΉyGΤ4‚Š"€ π?ψ( €X`κΙW¬Θ]“ηψXΖ[+e4φdhhXxǝ�qΆ¦ΥΫ0MGΰ hšf\·xύδΆΞ�SνN§2›ŒM£‡§^ώƒ{Ϊ"Ώg,yϊTy €@ 8θO}φτ»€A»`Ν·ί)ΞqS|œ«]˜,v%‰¦vμώΦ%g_5[ου{5©Q$π·�Ύ+鍷߿�b± ‰sΪ½c�έπЏ.yšΙ£θ RU@@ψgmΟ&ǚγg^[Uš.-ΘԊ²Gheڌ ₯[~rΕΕyJ1ίΑ?‹ρΟΠΎν*ΙsSΖ¨΄`qažΆxφ”[΄ύuΞΟޚg@ˆ�"EΗq’– €ΐ10Œ\Ω½nΝμ»“βŸrIj΅ΙhR€W΅w΄•=ϋςK?x�ω_:¦ pb@@«―·MœΏκό.��Έψ“Ϋiς΄εKn1 «πΔ@σh €ΐ p0€>MGŽ8nε�;<‘ΌψJWœsK|B’²XΚη󩆖ζ%Χήv�Y2d%γ>GΘο‡ωΈ³Ο˜ΩpΈυ2‡ΛmNpٟ[9·ϊ’ΞΉ¬ρˆΝΈ‹ € €D·€>ŸAΝ*fWWΌ9Ύ8W+Κ₯eΧJσΗ:uε‚γυuι£»…ԁήΨ€i¦ΥΛfWIKΪQ”›₯M›XρΚ―nΌrŒό>±€iοsS" € €τ·€<ΈβΒυ•3&•ΎY^”­Hΰ  #M›X’»}γyλ&Ρκο#Δώ#I@�}Έω[k²²‡ z%{τ0mrωΈΟ^·dΎώ{Iυ€. € € €@― 蝞«%x0­ͺτMΙ6Π ³†k%yιΪΤΚ’§vΎY›Ψ«;£0’X@«-Ύ8sΤο²ΗŒΤΚ‹ςœΊtΑbωύ!3'Š)UG@@―( �Ήp}iυψΒΧΛ υ•FkγrΖϊL―ΌžYβΏ""›Ε΄€ΆηUΗ”qΩWe*WΠΉrαμ šVg‰ιFΣ8@@@ΰHM«1~ϋ[kΚ+ΛrλŠrΗjωô⬑]ηoXΉR ¦#·ε>I@«Ϊ6srι99ι£Ϊ%hX<§z£¦ΥΫ’mE@@zτΜƒΛ/^WVUVψV± 2†Λ8ξΒ·�<χ”ryΙίψœ 8ύwbυ’Ys²Ζ?T\­-œ9ιvνΰΫ�Aƒ@@@OτŽ�™'/›6©Όh[Qφ(™ο S›>±τΕMχώpΤ§Ϋπ  ΛΎsΩc³G~]_Aa ήyι·I‘ν΄@@ψBι0™ΦŸΈl‘d|\Z%σŒΡζN.Ώ…τμ/dγΕxτž{秏|"?kŒ6oζΔ;κ럎±&�@@@ΰ› HπΐΌfΩό¦T•ͺ*ΙΧWZhZΒ’“τηΏy©Όθhόΰewy^φ}EΉΩα9S«ξάϊμ/EGΝ©% € € Π‡zΰμuΗ―–₯υΜƒͺq9».ΗΑ�g€Ά"€ € €ΐ±θ ,˜yqΩΈ|߸܌Χ�\2YžcLψ±#§δ^h�«K˜PXπpuΙΈ¦‹Φœ΄‚ A/S € €  i;νΗ͚viΩΈ‚�’Βœ\|ΖΙy�ωbz>/ ν―sΞ¨¬ΈA‚ί>eΝZM«c�Žˆ?jT@@’R@«ΧlKΜ^_U\΄·ͺ0―φΒΣΦζ“y•‡rΐTΊN&τ\2{Ϊ™•γ ƒwΏφφΫ�ΣxŠ € €τ‡€žβ½aε�Ωγ σwKύΖiK<θΑ>ΏT@ψΉΰ¬΅EeEy;Lτ곷ޚω₯ob@@@£™iΝ�ωσ* ς”f₯�ντεKJ7i›˜0ρθi)‘~X³qTyanνŒ γ·ά]sΥ8=Π‹ΕS € € €ΐ Τj΅ζυΛ/šVUΆ«²0ο½SΟ―Ύθ=Ό†@_ ΘgΡ^•ŸuKεΈ‚ΦλΎuΦ yΜdž}…Ο~@@@Oτ@Α•ί:·|~υΔ'δ|x✩sε9–ΈϋˆŸύ"P'“Ξ¨(]^’Ρ|�’ω7κssτKEΨ) € € €€R(0ά]seϊ‚κ ΟM.)άώ­u'N�³°A ?τΟγ†Λ&–ζη˜;mβŸλž|0₯?κΑ>@@@ސΞΪΧ_=|Veω£Šσ?:yΩ‚™�#5όH#ξχ‰@탦Θπ„η§MΏύφ―)퓝²@@@―&πӚšQ³ͺʟ­.)xﬓ—Υ<ψjplΥ+¬rL*χ£‰₯Ε­—mXΏL3ηF―ΘR € € Π[’ypΧυW\<³ϊ‰Ι…/œ»aMΊž:ή[ΕSŸ' Ÿ3σq“*N.ΛΝκ>yΙqίΡvξ΄ήΆ< € € ΠΟwέX“9½ͺμ­ΚβœgoΊβŠa2Αƒ~>&±Ό{=8uρygδ•ζfΤ/š9υΡζνu ±ά^Ϊ† € €D½€>Dαάυ+gO,.80±0χΟ?ϊhrΤ7ŠD¬ΐۏ>:Έ’0χΏfV•o½ο{ΧDlE© € € €ΐ� θγΛΧ.]pRυΈ‚–ΗW³$ή�ρp―—4mΏsκΈ‚Ϋ&ζ΅χΒΣΚηŒI9{Ι–b@@@c. mέj]1oζSˊ>>iώ¬UZ­Ζ2Η\}ΰμ@‚ζeU«ΖΩ½zΡά›΅={§υ΄@@ˆιάΩ—Ο™�_ή½aΩβj�Ηȁνηfl�6™.^{Βδ²Ρ#·/™>ε‘–7ίLμη*±{@’N€4½¨;dTˆMƒΑΰ-­Μ½%lΠv½»}ΫΟ.ΏθŒ| 0Yblξ>k•ιΎϊΑ―ώύέ1¬ϋԏΏ6©΄΄΅ΟvΎ@@@zW@œ»~υΈςΒάϊκͺςη~~ΫmCzw”6΄ƒ]“‹ oŸ^QΊ�;gŸ:Ÿ,–tτi+ € €Δ¬€tξL'7{iYQ^Η¬κ ?•ΗŒGΩ£}μ¦ν¬΅/šPqνŒ’q­WŸzςΙZ]εΨ퍒@@@ϊT@«Χlσ¦MΉb|anϋ�Y“Ο–ΰΎ>=Ρ½3ωΌΞ9~Ρτͺ‚άΦΣΜ½E{υU‚OΡ}H©= € € ποz¦ΑœΙU?«(ΘjX9κqςΨτο[ρ �,  ΎsωΩY₯ΉΩ=�zβ3―=ψ Γ]ώ™ˆG € € €@μάuσΝC§M(΄4gτ‡§―YT)B&υΓ{LZς›ΫkF”dόeϊ„ŠΪ?όδΖt₯˜`σ˜@S( € € šα‘;nVQύ|EAΞίΏόŒȨ΅ˆD¦ϊΧβ'e�η€²Β·~φ£�—―X•#uB@@zW@O=Ώtú⊜Œ&>ϊfνc‰½»J‹νΰΫ�•Ε·N«*9xΩ™kf“ G•6 € € €_Q@:¦³W/›3©€p۬ʊ›4mΏσ+Ύ•Ν€€¦ν΄O-/Ψ8Ή’¨ϋΌuΗ_ i¬ 0;MD@@ώY@ΣjΝ+Ž›·¦47ηπΤρεWjυυΆή‚GQ@‚JζΉS'œRUœΧΌξψyίΣ΄=¬ 0?΄@@Π€“h›7eΒU…Yc›ζN|RΛ4θ†V§YN˜S½¬$?³qέρ³οΦΆΖ h € €  T½L€7±(�—™£χ-œ=cž¦mb™ΖψΑΠη0ΈhΝ’©e9ι‡–Ν›ϊτ‡΅O¦ @šŒ € € πY>ϊ@ς„²βίεdξX±lqυ&™α³ΆγΉΨ α�+/Ι¬,Θ©›[=ώυ‡οϊ~^lΆ”V!€ € €|cΫoͺQ]QϊτΈμτχΟYΏͺTΏύ γQ#  ~qύΥ£+ςσžŸ>Ύόϋ�ΩX ?5  ’ € € €}# woΎόςŒ²‚œ—ŠΖŽώλ…§–Oπ oμϋs/uO>˜R–=ϊъœΦ+7¬Z¦mb¨Jφ € €D΄€(Έτœυ₯₯yζωϊwΞ>;‹«Ο}ȎͺrZγξ …χ”ηguŸ³jΙMΫj=ͺy3 € € €@μ θσœΆzΕΜβΜτ=EcF<~�ν·§Ζ~«^ % d›^^xΩΈœ±ΎuKη]₯νάix ΄@@@ΰ H§�΄jΙ’%₯ωΉΛς²~YϋΨc‰ί¨ ή‘šVk>yεΒy…ΩιM‹§W�LϋΰewDV”J!€ €@ο θι€€”φΎ+%"€Q@ώž˜7¬Z±€,/gi^φ/jkk ΔΐA?O8�ΜΥEΉ™οΜ™\υά‹Έ7-šE@@ΰλ8ψ:Zl‹ πEΪΦ­Φε fŸ•;jxWYnζυυυρ_΄=―EΆ€~Žpε%ηeζŒώjueωφ[―ΩX€δΉΘ�5΅C@@ˆhMΫiŸ>‘ςκΜαCƒŠςοh” υ"ΊΒTξsžήtjAζΘ'J r;ΎuζΪeH0}ξΖΌ€ € € €ΐW¦sςψ�3‡€„&ε}_Ϋ³ΗρUίΛv‘! 5lŸ?φGy#΅5ΛnΤκλm‘Q3j € € pO©,�Ό±£<³'?M‚Φ¨jΐ¬¬#γιkN˜š›>²±Ί²μ©ΊΪ'S MF@@θ+»ξΊyθΔ�qfŒi™_=Q'oξ«}³Ÿ―+ ξΌώκΡΕyΩ―L�,έqΓUϋΊ%°= € € €_O@S†_υΘ�‚μ粇έ³xζΜ™›˜dολφΡΦΫλώœP–Ÿσ»²’<ΟE§�Y‘ΥΦδι#{vƒ € € hΙ20άxε%ιγr2ήΘ5lηΙΛ—Vι)ρ%Β―i{ soΘK8~ξμοθ«cDX© € € €@, 聂3N];‘8'σ£Βτ±ϋgž™]SCπ Žy­ YX]Ύ’ slχΌ©“ΠXB3 u@@ΰΈΪςΏάAˆeƒΑžϋ«ίΌ1i|ΕιN‡}θ³/Ύp·9πνα±άζhiΫί6^œ±cχάξ­'.ž_cHΝνˆ–ΊSO@@@ΜӚ% WζdvζgŒ|μΆΫn’d(CŒ53jš£i]γsΣο—Lφ 7¬[Γ’¨9vT@@ˆYzM³MŸXq~ζ¨αΑβμŒM›ξΏ?5fΑ Ϋͺm΅Ξ›9εΜΒά¬Ž‹η_©ΥΧΫ"ΈΊT @@@` h{φ8¦N�ύœ‘Γ΅Κ‚Ό›%Ιψϊπ Ο9qΪΙ+¦ζf4Ο™>ε©–7ίLμΓέ³+@@@Ύ\@:―Žςœ¬[²F€uM_ΆV³όί—³υΚO>ω`JNϊ°ηˊσv]σν‹Ζ‹=ΓEzE–B@@@zU ρƒ—έ“ΚK~žŸ9vχ’ΉΣζHΦΤ«; °Π‡Šgωnζ˜aή5'-Ρ6˜�›O € € €DŒΐƒ?ΏmΘĊ’Ν2aβŽ3Χ¬(‘Ž,«£££/yςςΉU£‡œ9mβ―υɏΡ�(@bA@NΜ̚Vg‰…ΆΠ@θΏG†³N[W&Yυ9Γ†Ύτύ ΞΛJ ΗζxΎ)s”d>=±²xλm·}?ηΨμ…R@@ fτ+:ςτĘ9’4ˆ^ύοΡ²γf-Κ1΄5oψΠM΅΅΅LΦΧΛ‡³Ύ^³Ν¬�ά8±|ά‘‹Ο=}!η½ Lq € €}'°g뫃φΧΥ9ϋnμ "A@ΫΊΥ:s�„sΗ Nξ*Ι{½tlYi‘—ŒXWΞ›>»47³iυ €νά‰m/ΩR  € €@?¨1΅©©>ΎvΝ.@ Ÿτ`ΑΈ±Γo“’θ™]Y±^«cH]o’MχߞZ8:ν₯YU₯―?Ήια½Q&e € € Π, Φφ쁨ϋ󦄒μŒΗ njΪ{Ϊς₯Uϊ„~P­¨­‚c¬r3―ͺ*Μρ\΄α”%ς˜₯£φhRq@@@₯OŒxΕyηεeeξ(Hύ�υ—^:’ΙΏΩClXr\EiΖθ'-œ{—¦νq|³’x € € €$ Υ֚ηΟ¬^–5|θα’1cί΄iSjU/jͺ’|ΫU–5ϊ‘™Κ^yω ‹šŠSQ@@@ΎL@�–[fU”�ΚNΪ>y\ΡOδ1WΛΏ νˆΧΕΛΌdjΥ†©ε….=ϋΤγτμƒ#^ζ. € € €Ρ/ ]ΫΔάμ+3‡¦vΝ­žΈA«Σ,Ρίͺcί=HpΩ9§N)+Ϊvκ‰KοΤ4VQ8φκμ@@@ _ΆΧύ9‘,;σα‚Q#φŸ³fE%WΞΏό0θCͺ‹ Z0uβGάωγμ/[ € € € ΕΧ_}υθβτ±―ηρ—{nΉep7ε˜W]+¦ΕΛΧTζgwnXΉδœZ²pΜwΚ@@@θO=ΛΰδΕ‹gεf.-ΜΉGΫΏίٟυ‰δ}�pγE£ŠΖ{ιάι46~ΰŽδΊR7@@@zM@ΫΊΥ:«zβω9cGwV~[Σκm½VxŒ$kuyρUΕΫo©Ήj\Œ4‹f € € € πΥ4m£Ό(χφŒi- fN[ §ε΅wΖώVzVΖ™kO_Q”ΏντΥ'ž-’ϋ‡"€ € €ό«ΐΟo»aHQvζ ΩcFΎ{ΩgŒύΧΧκγΪΪΗΗη=Ίtή¬΄††Έκ@»@ˆ5c¬5ˆφ € p¬φ΅^ΥXRV|… ٟωΣ³ΧioΏν:ΦϋŒτς5m«υΧήrΊΥf―œ8±βη†Αƒ;#½ΞΤ@@@c& Q˜=₯raƈ!ϋ¦T–ž3 ΣςeˆΒΕ§�)_»οΔγfί₯νΩγ8fπŒ € € €@΄H°ΐ:Ύ8χΫ™£†νZ0u�\=˜-uοΝzJ»εω™Ώ™ZQϊώ/o»)§7Λ¦,@@@’Z@Χ_œŸσlξ˜žΏzyt’ Qέ ―Yy­F3.;sqYANσ)+–œ%νgBΔ―iΘζ € € €1,  Ύ}αΩωycGό#δ°Η_{ϊιψnξΏ5M–¨Œ+Νσ§YΥžhnޞπoπ € € €]@‚¦Ε³ͺe§ iŸ~<Ά i§eήδΚ &Ές‚s¦λA”Πnڈ € € €ΐא+οΦ©ε%—εή9JΥͺZ­6¦Sφυ Αi«Nœ4Ύ0�Њγζ�BΫΏ6o@@@@` ΤύωΟ eΉΩΟδ^ωΩk²bω |cγξ�όΜΗ§Œ/ίwγ5Χ”€γL[@πr’cΤ� x@ψš5ςχsΓͺεγrΗΎ_’=β±o»aΘΧ,"*6—σσό‰§eŒςmX{βΕZ]%**N%@@ wτ«#zΗ’R@ž€ό 5­;aήΒ’¬Qž‰ιwjΪG¬)όόφ›FωΉ“*_όϋ‹O§ΖZϋh € € €ΗT@ΣvΪ§Ž/Ί³`τΐά %§H0!fζ;ΆXf••]U]RάΆρά3Θc&D<¦Ÿ& G@@ˆIŸΦ\4ͺ$}ψߊF§ν9wΕΒrι`Gύ0@=HpΙ†  φ�š7οmOμeSΔ䇑F!€ € €Dž€(8yٜiγ�G4•§{ξωξLŽΌZ~½i q³'Tnš5‘jΟ­Χl,ϊzοfk@@@ψ'­[5λΒ)U—d T—δ^+ΑΫ?mE6Ιά 'Ο}BuΙ8οš₯ oΠ—ŸŒ’κSU@8 ˜syΌ@c"PP`πkΪώϋ&δNέΦΦ~ъy³·HπΰƒΑ:&;<†…Ϊz(eΟΎύ—;]�½“'T�ΚPPΰ?†»£h@@@Žΐ¦»nZ‘7ϊŠ‚¬χ―8hkΉ;ΜΗΝ™rNuE©�ΤOΈP›’­ Τ@@@ˆΠ;ΪΛgOXYœ12X•7ζνΰAWΔVφ3*vΧυW¬,Ξί:oZυ_Ά>ϋμ ΟΨ„§@@@@ΰh΄ύϋγ³Gί™34Ω7ΒψSλdYΓ£)――ή«gΜ™6ι�ΙγK›/9ο¬Ής˜εϋ Ÿύ € € € ,�Όχ'iUω9/₯>xϊΚ&ΧDΑ55—fWΤ?Ξƒ,Ώ8°>―΄@O’~MιOΒO@"]`ϋY*-+ύŽΕn3½ωφ[ί_πߏ%Er%»ΐφμ“�΅Αh21lΨΓjΔo$Χ—Ί!€ € € υ�·,7λό�Ό¬ΐœ εεqD.k¨I8eΝρ噣‡6Μ™^ύςσ>šυψ4@@ φτΧΨk-B.P_�Zό΄Κ²'Κσ²ŸΊκΔι‘8dAΎγrΖήU”—α;λδ5+δ1YŠύƒKϋ@@H p‰G…:!€ΐΡ θίmŸ±nϊ„β‚Ξ²œŒusΝΠ£-³·ίφIˊ‹2G\8{Ϊ¦h[’·-(@.ΐΥƒώ ˆπφ -Β«Hυ@―- ·ύδηΧώ599ωžp8<εώG;W‚ 3d‘^«·½·cϋIqξWή،ϋԐ!ž―έHή€ € € €G'πΠ/ο6«ͺό₯ρωΩMη­[5)R²¬ΎΕE9•EΉ;–Ξ™ώ+}Ι£k%οF@h γ ڏ υGˆZU.8P9q╇3πφ»ο^ϋΦ[›ϊ»1Ό°όεΟYiRΖ΄Q#‡?dHΦέίub� € € € X:­Ξ²hΖ΄K+²3ƒ &UU«iζώΔψρΥWŸώΑόκ‰ΟΦ>φXbΦ…}#€ € € €€ΌσΤSI²ΚΒ•ηf|xω·ΞΞRύ΄’Œ΄˜S]qώ”�q¬[΅$R†Nπ!A@ώ`¨B�ϊ³w@TΡΒ…­ι™™·Ί%¬{γ͍2+¬­?X:ο»/±£«{½;)ρ•λ�½x3ΤφΗQ`Ÿ €Dž@ŸΈzyj„ ΠΏzύώίήτBBΌλ~oΐ»vε�ΩΣkj΄>ύ­�}ώΥcΏŸb΅9�Η¦Ή{ΠoŸνμ_φŽ €‘"Π§'%z£Ώθκ…œ΄ ,DΚGƒz €τ₯€Α0Φ[QQρSωΓΌkΟήƒWTϋuR_ξ_φekιh=Ρn³ΎρΖσj 55α>ή?»C@Ύ\€ Α—± €@μ ΘίAΣϊ΅'œTQZΨ9{ϊΔ‹εqŸM”xΕ…§WΟ9εΠκe‹.Υλ»Κ΄ @Ύ�@Ÿg|QΏ(α‹ήΗk €Δ‚€ό =p˝ONIyΈ½½ύ‚Ÿ—Ρν�κλmοΎχαz“ΡΠ>}FΥυzτΕ~Ω €D‡@D’ƒŒZ"€ pμ Γ†y*+Κo5L¦ΊΊ-ΘΥ�c>Qβυχέ1ͺΉΉm‘Λι|δ¬ ||μZGΙ € ’ρ¨Qg@˜Έφ?ϊhθΑ·{½ΎU§―]>I‚†cΥΰM2,α΅ΊΊ9‹Εž“™υˆΑP8Vϋ’\@@@θ%Ϊ'L™VUφκŒI•KΰΐΡKΕώ[1šΆί9©¬ΰσgV�ZΣvΪ�mž@@/@ΖΑ€�€ ‰Σ­n––vw(¬^{βρSUΦΑ™λ.…+F ώ€AρE’uB@ώ pΠΏώμ@Ο Γ+֟ώŒέnϋ ±ρΠωοΌσŽσ37<Š'%aέ»χγn·;œ‘υެ™¬EqΌ@@@ϊR@:φΖ΅+―™5q|ΫκΕΗ-ον¬ƒϋ|ύΘIγ2?\>Ζο4mΟ1Ρ—fμ @z_€Œƒή7₯D@zE@Ο:8γΌ O;φ7[[›Ο}ζ™gά½R°RS£�ψδ3“\ΞΈΤ̌1*5ΒΫ[eS € € €τ‘€župκͺ₯kζM­κ\Ββ55ςψσv½UΫjΥ‡|ήλG>―o7k|ξ½λ–Ξ|^kͺ?ς5ξ#€ €G |ξΙΗ‘q@ϊG@Ο:Έζ†kώ6j›χ5:g֟ώ”πY5iͺ-ώΜΒ…—f Ώϊžλ―�>k»OŸ»νΊK†Ν†ΙCΣRWƒ2;?}žŸ € € € e0œΦΙUΥUΕ;V.›{Κ¦MšιΘ&θΛ(–Ž|͘k03Ν­₯vΏrΞιΛKυαGnχι}=¨°fρ€SW̟τΑοuGξ§Οσ@ψ,Ο<‘ψ¬ y@ϊG@²΄;ούυ›©ΙIO·n>#Νω§�Z ]X6γδ MΝ—$j²;\Κb΅NzγΥ7ΎŸŸ�«δΟ¬ρή½ΆφΆΞEIƒ·,?υ‚ŸΉ O"€ €�#@ΰ€ €Q Α~aήo¬Vσȟέηt= A―φ΅JY?ψθ£5Iƒ‡$Yq*ΤTΐTf›kαή{ί™²ω_›wϋ½·Œ°XmγRS’Ÿ•Χό�ϊ:@@#©Α}@"Xΰϊs―xKώp?ΰΐώRM›^ΥΣV.Μ2Ω¬σγβ•IpΉ”έ§ŒF“κκςmψΙu—ŽΡ·ϋτ¦Άnϋp|Zjjϋβωσjυl†O_γ' € πY>K…η@ˆ@Ø1Ύ·ύ7~Ÿ·δτΦJ6Αϋ[ߟk΅YGšΝ₯΄°2[ΜΚdΆͺP(€άNwΖϋονZ.Α‚#ηD°6jœν΄Ϊί©Z°Ά1›I•@@ ΒDΨ‘: €|�€dάzί¦:‡Λu ~ϋŽ5Σ•rΜφYρ Κοχ+WœK;FI ‡5ΥΡΡ©jXΈλ­ΝξOΛΌξ’Σ�TH›βŽwm½ξ:ψτy~"€ €Ÿ'@ΰΰσdx@ΨΊ5Υ›6,ν ƒΙ°rΝρsnK?Q2 ”ΙdTϊ΄‡7)w— ϊό* +ΐ?ϊΡMΟ ξiŠlPΏυΓR›Υn1bΤ 55†p6‘*!€ €@„ 8ˆ°Bu@ψ"3 Αͺ©³•α -­mmλmVK’E†'θsθŸΧ«Œ2فKbAΓZΪΗvλeΦmQζ€?4%Νπχ 'Ÿ�ήν‡Χ@@O|*ΑO@’D �ΌK$§&? {2 ,f³ ΊTΪΠTuΚΊ5jδ˜tεioW­-Κλι²t΄wMΡκκ,ΨόήξβAI‰u*-­;JšK5@@ Ÿτσ`χ €|]C° ·ΰ©P(pΐ+‰HΆAPΕΉj\i‰,ΗΨ­Ό>― Λ‰Z8€ššVεε–?�φ±t«Σgw €τ†@γα=n›Νβ6b”ςΘdˆ²Ž‚όSΚe·©ιΣ§ͺάό\ΥννTm‡«p ”¨].£¦•;�Χ g­nκ:P € #Χu-¦• €Δ€ΐ€Š²α--‡O³Ym�ŽφΙ*0)ΏΧ§r²²•ΥκPή@§jοjSM‡ΪUΐ«βήάςZΌέiš›“υxε΄yš€ €}$@ΖAA³@zK ΆV3ΏύχΏ•νΪΆ#Ραpͺ8· MpΕ©άΌlυήo« »T|‚Kd•‹Ε’< MΊγ’FώfoΥƒr@@``ΘtJά@@ š²†ώ-aΗφΧ[νK@–]”4H575ͺ!C«»Ά«†Γ Κb³+“dΓ₯Or”q £ν£ά’ΡΤVκŠ €ύ/@ΖA�j€ €ΐW¨Υ4σyΞ_ΪΦά6ιΠΑf΅cΫεU� $ΥΦΡ₯Ϊ:½jΛ;�U4)SS]²Ί‚>χA\|’2Ϊ]₯—Οφ|坱! € dπ1@@ Ц:d»ΰ£—Ω¬FK·?€ΆοΨ©Ζ¦RΝ Υ+―Όͺ>ΪΉW54P&ΓΚΧαQ&£I…M&Y²Ρ’όώ~Α@#pC@Ύ²ƒ―LΕ† €τΏ@cS“‘ΛŒχB*Φ”W‚£YΩνnυΖ–:΅ο`‡�δ―ϋ–ΖwTΌ]_kΑ€’RSdœ‚AuxΪG7o{έ.­πχK¨ €D‹ƒh9RΤ@HM•�Θ€‡α€¦ββljTϊXεtΖ©.W%Ζ'(2(§Λ₯<^κκξ–ΰK=R™LΥΦrΈδŽΫξΜ”XUO €|e_™Š @θGώ£Γgu¬ζ,X€&M�ΆΙp…έΟ>«��«ΒόlUPP(AŸzσν¨Γ ΚίνQ­Νa•2(!9=kμ)―=χێͺ9kΆ †p�·ˆ € €@€ 8ˆτ#Dύ@8B`ηήύ–W]f.―¨T£QνΩ·[½όβ_”§«S$@°«ρ°κhnSAΝ >ή·W&40¨–ζfω―QM˜4^΅΅7]πΘΓΏ�ψhχŽuR,+,aΛ]@ψlŸνΒ³ €D€@|Bό ›ΩšZ�Α?d©Ε zύ―/«—7Ώ Λ/ΊT{{—Šs:ΥΏ)_ΐ―R'ͺτ¬|υΡ{渚Ζ&΅₯ξuοτΗ€τ^έλσ4Mϋν3ΏΈ9αΕ7ίI xΫmξ!)Ν₯E“š–¬>£ύ:₯|5d$Dδg€J!€ ΠΧϊZœύ!€ pϋχlKhn°'n: 2³Η¨8‡MΉ,VuΈ±U™ν65mή,Υ|θ°¬°π²Μ{ ΓήxSyBeqZUAn�š=oždLS·ήψ½KK3†O±YLEM�ΜΖ°%yP|Χ3Ώyδπ­Χ^³eΨΨQO<ωδ“//Z΄¨™! Gqΐx+ €1 @ΰ "M@ˆMM3^«”γΎ›�Kή}`G’έδ0μΪφξΌξŽNGΥ„R΅|υz5hπp•0Dύψ¦{U—?¬žyφ9e3•ΥnUΑ€AydΥ…€U©$·[ MIUΣη,TΞx·1blΦG»ώ”•:t°ΰi2ί’Auv΄@p˜Ώ«c\·oϋκ;j.}γ/?p·d&ΐbwΔ«Ιθlχ*―/¨ ~Ÿjiν”·δŸ[57·(ΏΧ«lV³κ ψ”U†%h«lλU&«E™τ©&΅χγκΏ�½Zκι*$Λ9šerΕ°Ω.a}G“2še{YΆ1–)eΙǎ�.πώ$οΕw�ψͺΑ<Έ˜ΰΑ§GŠŸ € ηXΣR@Π΄¦ψ•³Η]άtθπ·6s|w«Gω4%K)Rέέ! U—1¬Lf³ΪίΪ‘ΪμWq 2<ᏏK¦A·ςMΚn3«°ί#%Vv‹ό™7iͺ;Ro‡rΘŠ}ι™λ PνόθCe5λA H ,ϋΡο[m&φω•9,A=Έ ονhmVv“aΝύwΦ’ΐΖΥ2l‘;Β)© €τ’€©Λ’(@ψ†MMυρ—¬[ycWkΛeݝ]φVY!! WώΛπnoH™,’7 “ v…ύ*(9™Γ`τ¨1ꍗ_T?�Ε’5`V>Ωήd+‹Ρ O[ σΈ$σ@“|2ίAP9%ϋ@¦?Pο½σŽzλοo©€"$ ZP ‘žΩ^ώίσώd4˜%Hη²φΜ›ΠΡΥQψΑ[oόcϊλo΄ωΊλτ­Έ!€ €ΐ p02MDˆlϊzΝvΧχNΉ aχŽN«Γ€Νͺ©½Su…”j—@ŸΌP2Β�ΉΧ$5 ©Ι68°―Am–₯λχRšBT0[l=Ω“C²L²½OL0HPA² :w¨έ7¨ξ`PΩά&ε•,ƒ`P†(H΄ ”Ή ΜF .˜•Αf”€BXaε°ΪT‚Σ­―ή` ϋBCOOσԝ<ΐd‰‘ύ±’v €τš€\wΰ† €ύ' ^όέΕγ[ΈΔεt›ΏA&E΄+™w@ΩνςštώυϋY5Α§I  ,Γβ\Κ(Kœ[ω%ΡΨ�’,ž―.½τrU^2NY$Έd·¨α©)*Nήo–€]†> ’χΉ%Σ@“ύ$ανφJ!hmiiž½s—²ύk[xŒ €±)@ΰ 6+­Bˆ ΝπΠί«΄YΒσβγU|κΙ0©n@�τ$H`WA― ) Arb²¬x`QFY*Ρ"–/Vη_tΆδxd……Vε•U,f«2›Μ’i`—!2Τ@² V«ςψd *dδδ©”ΑΓTjZŠ:νμsUaΩD•ŸŸ«¬2pΡ,ed�—Γ’ά2§Y†.θεΈ₯^�x Bψ<Κ" ξ„D=ϋ €ύ£Η⣂˜J"€ €ΐQ °ͺΒQR@t h2ƒXΟ4`� Ή_£ 5G6θΪOl}D ήSZΝ΅rŽ.οψΏχΉ1χ@―'°i«²μΌoΫ|ƒ!oI�―^β@IDAT½έ>ε—‰ 5™kΐ"s Ψ%k [†θ3Ά<€lqNεδV6·šP5^Ν;ώDΥΥΩ¦~tχύ=ϊj š_ζB,· ¬’‰ αε“2B2δΐλχ*ƒ”k•I“SdΞƒD5uΖLuοέχͺΔ€$ew:dΘƒSζE+d>υ!έesΘΔ‹R·.™ΡŸ(#!Œ#ίyχέ4ΩIΓΧk1[#€ €@4 8ˆΖ£F�O@ΣτŽΎ!_ώ­ fκΐΉnΆ_©΄ςπΆmJΛΜάk|θΎ_ΊφνΩξΆΚ\γ‡š\žξfcJjŠY–3΅ωNKx±Ανr;ێιΩΩ5Τ«iFO·Φ�Μν‘‚N«Υθδσ‡χŒη ΅VxΫ|ž2ΏΩΆΫβ4@rxεί¨±iΉΰgji8θH1ΌuŊϋs&/ νR*,ωΌF9Γm–�X)ΟΙY>3’�ί‘δR`†ιCΫN·Δ*Λ&ΆuuΘό^q(“Μo6λΉ]Κδ0¨xGœό2ο€|mΘόΖ.£J4X9“ΣΤΖk―ToΌσ–zλΝw%°ΰVνžNeqU0Τ.A«d(XTb’tφ%θ©g#΄΅·ͺnͺπ›Ÿ�\mόލj{ύv•— t0ɐ§K†3x<²βBP†(ψ₯,Ι>Œ‡8W’r8l2ic«d·ZΫ»»\ς Ρh@ ƒxΠ£’ɐΣcύΪΎφJ@ΰα©'ŸR»›v8Ί:·΄΄:»½>cۜ,Χv³{θΑ€„ŒM cBαpjJJ‚Λλ ΆY5k›ΡlκtΨ’γγέƒ‚Α %Π퍳›γL» ‰ƒ”C.Ο•ίΰσzΓ.w’3!)EΛ,ζ~Υ�ξ•‘ΌSΌ;Nyδ$Zͺ”eΛα ίoˆΣη3h]MK¬iaΓ{οoσωύF}²ΈχwΌάφϊλoμ ϊ.i2™MνννN‹1άοH> ižS%Ό?jύςfι„­Ξ„Ξ�’±Ν�΄‘š’tγn‹)\2sR0-mˆΆyσ_Mͺ±QeŽ( ˜8±ηΠI@$lΞ” Ο(cKš ΦH0B=’Τ ‰œ<"?‘ΜΥ“A`"*>λTr@ ΌρΪƒ½^_†UζpΛ—ž£Kζ+0ϊ•[{exO2 τΞΎ·³CΕɐ“ΜOΰιh•NΎCνΪ΅KUΛW‘§«S₯ ’v$μU™ι™ͺΣ»U6 •Ζ©Άζ6Ι>0(«M†+ΘvŸ_₯ JRΆπΔWC†ŽP?ωρ­JΦc €Μj`q¨B½έ=£ΑΤ³O‡,λ¨Ο±’μ“”§ΟΦ(Ι ά@@`@τ$]ˆ–�ȈΞ·Aϊ·Fιη·ΙΏL避ςΔύ–η_yΕνντ;;Ϊγ»Ϊ[“½έ¦‘ε)τϋ΄b›kuΗ»Βξ—KϊιΓ₯KΧήΦ%Ω²F³Υε΄Η%$™Γ’ZΫ-)΅&9Ι–ΕΔδκœΜL.γ{Ν²φΉΎΔ˜tξ{Ζ›dΦqΏ\E Θβžqΐα€ΜB�O�O&ζRέ]]²VΊL4fuΙϋύϊD`’P ΫHHΐ&'Οϊ~lr�­ίτ2ό^Ÿ²Θςgn·[Šψd…S=˜`‘+ˆ_§€wͺΆΦΓ*(“Š»ύRGŸ²š]’μλξφ†₯^-lh0›δ„\–J3šμ!)6`²Β6‡Νμνξ6Θ„gΑPX ‡|ήφ '°G&;7<�.ohw\œ³Ι&㚍F›r&XΫ₯�‡|ΑŽV£ΑεqΕ'…Lv‡!)9Ρg Ϋƒ‘ΩŸ˜Ψ&c€ƒωωή‚Εg^n‘%ασ₯Χ ·χ62ck£� VHBn5Χι�‘υΨΈ!€@― άΓωeΫίωλ³�8KͺΗλW{uͺ=»TS‹G…ŒzΏό“ΡQ‘PXΎdyEyάέή!Ώ¨V5xXŠš{Ύ·4™Ώ`ς€j%“¨¦†΅ν£mς}μ™7aψ0™·@ζ0p9\p°τ|½žžy,2i’ž±`·Ήδ;Ξ―βν*qPJSΥΤ9 WŸ}ω뽎B € q"ξΔF…j$έš¦Kfμ–η±=φπ%jένIΪڜ]žζΔΞ 6ͺ£½u˜ΓeL4lCδjΦPYχ+Α刏σϊΊ].—ΓlqJΈΐbΤ'γ2ΙϊδfI£m—4^Ιρ—“W­§Σn‘‰Γτ[g{›\ “ΐ€τ¨₯Ο.γsε¬YΖζvΙ6=ΰ”€€ΎD™I_]οΛU»O—(³Jω’Π³\™Π;ό™$L¬—§o§G’%7Α(ηάΎO–6“ta½lƒΜj�/q¦ΧΟ,'ܝžžqΕf“ώzPΟ*V.9ρΚc«Ԑηυι€Έ�ΩoPžΧC~e3ΙU?§]…z-υφ(©\έ“™Λ<έ]r₯QΚ–:xΪΪTwk‹²ΘψεΔ”A=3©ϋ$€€ˆ„όƒ1’ i@…Χίιυz‚nί ©ΖΝ�€`ΐ―uΛ’n­αΆU*Υd4ΛThΤ‰‹“ΰ|{‚šίλχ‡4aσ₯$Ζwœ.£ΫH™½ί™π{Ϋ<©­M).G\σ†Uημ6gNχm‘zOGn K₯ηΎώ˜ό»ΐέלQ~pϋ;Ϛ­‘”Ξ.―j>P ΝUΏm—²Η9δ[@N—²Κς‰ΕTωΡ3ός‹)ί[»₯C―ΤΘαΓTςΰ!jφΒΕκύ­[Υ³zVΦp4¨Δό8ΠΏs|‘œ=gΊ�τύ΄4©ύϋΙ<]ς~·<4AŠ—ο6 Ύ&J6–ώ}ι•ο}Ž›L–(™S*Ρ%Α—E% NPC�†ΥΝ]ΆvIΕΤωώ½U<ƒ €±&ΐP…X;’}άιhšΤ6Ήζ~Η|χΟ~γ�ί΅k¨Χγςα’κ„ΏΆ΅½ήΧ‘=8!5Σv€Κ©gŠ/”΅ΒμVgœΝ78U�Φ{Τ ™)ά-€i�›Υ;ήzηΧ YA™ά«ΫηUέ�i7JΆ€O2τ@€ήΉ·Ϋυ€Qi�)‡Œ2—€ƒνI½τΧ=žnε”΄Ϊ„AC• ±Ύz恾„™”-ύZι$ΛΙ΄_ΖνΚ>%H|rbέ3cΉ,fρΌΑ@Hωυ‰ΔτH„άτ°OF96ΙzθϊδarJ�Β²­& }νu‹,‚z@AώΒ!e•7IVΜBž νL’)φ)‡&ΜςB—LΝδ³Ίμ©N›1)΅ΏπZέCΘΏΝb3Χ»Μφζξ�PΣ―-ζΓληOσ$'ξ’’ΤV2Ή²ΣΧΡu‡¬‹ί°hΩ ‰%kjˆΎΣ!:―^a΅Y/\§Β5’ε 2�»Nζ°ΘW†χ$’FoΑ‰[Œ˜Cς₯b0„»:Ϋ%HθR)Ι©2ΌΰrΙο­ID΄;eυ *ύwΣ’4%³Ιθ΄ͺ€G4°Ήβ•έš šφξSύ X:zΎΏ|ώJ`θωΞ²ΘχΦaϊΤέ��vξωXyε{ΐ$ίcρqς]'ίΕ=Wς½ΰΥ'C”@…=.NΎeM=ίS °Ϊe……xYžΡιthΙC†>R>e#ΖΘηf € πeŸτˆΎl+^G@.WΥjΚ4]Ξ[Ÿ{μgξΏ½φF�ήC‡‡t{ۊΫ: šq”Eσ•AšA3'XεRΌΝa7;eœ�ήa—kη=p™Τ[�ήUPŸάdΉ1ύ ΌtΞΓ’Š’“V} r‹,&Ι΅r…L†H‡<>>AN†e‰²�6χ+3ΚI΅]Ώ§wη5™φP�τυώ½~R’ A§tΚυΧ���δ$Χ©κλλ%θΠ%γ‚υύ„dŒ�£§γο—+pš”/=YιPΛ}y—žΉ''Μzg»M�ΈιmJπB“€AŸ$L‚ϊMίVRHXCLͺ£Crb-νΦgΆθ)ΐfΙ&s—C%§$©CM{&+*ΘWε%j�Α½� P�YH–±Ιι=Ι³PΓ%x §&+ ˜Νz„ε“=Jώ±&ιΚ=ΏΈϊΑŽ ntKΦƒ ŸΞƒ5.UΪγ•eΩ:εy}97ι“HΖ,.zΰE†=("„nΥΪt¨gφφψδΑp‘₯Φ€γΠΪά Ί=]’qαθ‚‘/g¨]‡φ+ΧͺΛΪς ¨΄I†ƒ>φZέ%mΧ'uΣ‡€θ£f’$Œ°_Ž₯p»:=νΝ29DGb\Ό?θ ΨΜ† Α(ρYΎU(dώ5±2>–‘'96FeٚœœΤΦ�|ΨiuΨ>Ηm ™:Ν[Ϋ Α)]VwB§3.A0[\ΐΕl %ZύΪΚUkΊRr&ϋKzaάΆMφfͺΠ§yŽ%πΒCw|ιΩ‡Ÿio9T ΘΚ^£κθ–~S§κ’ί1[‚[ye�D=+Κ.σ­θϊBω~L(ωι‘ίι°|�θί6ΙLJšͺΆΎ³]ž“‰%0ι7diGM₯$ΉΥμκ •”'Ω-κ±'^ο؞A]ςœMΕΛϋυίηDή `Νς+φT»|OθΩI²£]ΎG�†U ƒ_XtόΊ“+ηΏ'’0©  €3žώΗ1+‚£V@Ώ�»e‹2——ο5?ψγo©{-Σθ*hnm*·Έά£5Υh΅$i&“[Ξ6%Σέ(WοεͺΏ\­ωzHVοZk2Όΐ#Wε₯S/'¦‘ ήΡ7τœ�κpΉ€άΣΧvχL@¨ηΠˌβςšΙ)ιψκ:d‰0ύ€Φ/sθοΣ‡ X%Έ �ΣΧ-�$;ΐ/WΧυNΌœPKΐAΏι??™Ÿ@Oϋ7*›Ε κn™Ϋΐ&'θޞ C@†8%XV聃τδυ}ιϋpθ)O?iΘ?³€λοΥƒϊ| ϊ 2©bO0Δ' zJ±>™YzΓΑžl£’Qς~όσ*§[Ά—ωlR—Β’\ΥΥέ*ε~�ΑΧΧM;z”ΚΝΞ“@H@Ζ;Tʐ4Ι.ΩΝ»+KΒ`er§HE0₯Γ θ2D(ΘO ²‚ό”ΧτϋzX£'SB~ΕυŸ=#$ΰa°ώΟ6z†…τ­eIψd{i§€a(™όQ‚VٍώΌ”%Η±mοv΅]zαέ^‹ϊΗϋ;Υ?>xO…$SCΟίΠgƒΧΝτ£­—τ,Ϋ&wδX™zόBœ1˜4™^ΏŠͺΟ?–‘’p ήϊρ֏“ŒrL=ΟiZΘ'χetG— SSrԍΑ€Aϊ:’ �ΦΥΥξρZΝ&ƒ9ΰυ…,&-θ”Ά'&Ί[όπ{qngSΐvHμΒhuXœΞ„w%₯6[­-9-±Σr΅Δ§&ω”ψ2+J%uDΟ|’Γι‡πζΝJŸ“R{OŸhRnzφƒώ“½-P―iΆ'ΟYx ·:­Σ#s Θ„OHu‡d.ωm Ι0¨n_wO°OΟqj–ΰž9>�'(ι“ο .ω~τx%Μ*ŸάΙS*TϊΨt΅gΟ^΅cΫ~΅C~†-•ΐjPΎΟL©RΛ–-Tž&uχ]�©κχHV“dœL±Κ°ωqΗΙ|ξxUVY¦.>^΅·6«ώρ–z�έ·%¨,™Q©žΌ‚όUλ/Ήώ)ωnιωύθmΚChU�j$CπZeHί’Œ’hiτg~ς7ToœQ2υύeο^γa{—Ή‘!€εηηχξέkhnn6ξΫ·ΟΤٹǐš:Ψ0Β‘φ»έαξύϋMol{ΛΦ~¨KΏjc ΪδϊDΨΤvΈΙjkΦΈδdΉζΰτΘwY Ψάl±ΗΗ-fΉœe‘Hͺ~¦$W%Bf³ηrψ§Œ dwΙ>υ&ύφ?'L=υκιΙΉ―φΤS*$m‘ο7Ύγ>aβΏ|"ΠσKƐ |;šδ‹άςΨS»ίΫΉ#½‘αγ1Ν:σεRρX3_&A‚QΞ8gœ~Υ]&Ϋ“NΈ\Ή—©Ρ,'€�)ΤΣβυ+τ ‚dpιPλHύ tHΆυΛλϊΪα!»―ΟΪ₯χeυϊžΎ­ώΥ,wτΊώO/+$gΑaΉ$­1πΛδ^ϊλzΈ!,'ΣςC:—ϊΌ²4™\3HXFςφ\‘Χ z'_οτλοωtξύΫdVq»Uκ 'Ηz&ƒS�ϊΫεκ&υΤ;²&Ήͺ/UνYŠLŸ\ͺΥΣ½ }θ>ΟA§L¦ίτ₯Ιτi τΐ‚A:γϊsƒ —Π‡GH?Wκ'W υύIύτμ鑆$Ψ!Ο•Ž+Q>Ɉxο―K¦AΌEδD]ΆqχόŒW))C$ˆrX NIQcΖ€«€δ!�Μx—,;—Ίμϋ@yZ(³,ζSšΨH%υκr“Ž�'ΫΘÞηυΛλ= Χ�ήΚ} i]r…³γ°:Έ―Q†Ztͺϊ©C’‰ΡΨζSΛΠ ³ž‰!W7υYτc%GVώgι)RΆΘP†žΞOP²'τ½›υΰNΟηDŽΪ�gο=€$=ΟϋΞ·s˜žžw6ηΕ‹ .ДH‰”Μp€IY%Ÿ%ϋN’}ΆK'«κ�ωξ,ΫUΆΚ±xΆeVIΆd΄,S”i&pI€Θ‹Ό μbvwvwvrNf¦ϋ~Ώ·±’J� :+0ΜΜΞtχΧ_xίχ{Β�ω?ΟΓΪg‰kΗKδ±Π£L‰x5o_―i!Σ?δjΈ_ €#G툊9ΪP°σ|žaMΙ8ρ&"K„υTΐΩΪjΦΆ¨LΩ€Aα‡5N»;₯ž/΄Qr{λXίn²Cms¦―»k5“N€jl“Ι²Π¨Χ›½Γε��\�Θΰμ½·ΏcίwΠκσΠΦy Zή4†Š¦‘έ˜ϊ ‰ΚhHΖ£'ν4~ϋη8Š|εΜ™ΤΔμVj`(ŸDεGζΜόLzeu%yεεs‰\­7™Mul #λuΤ_j+W[Ϋ(――�χU7λύ‰F’[Ž2JP"1αd0 rΝΖf"›# ΣV.δ‹tΖήZΔfΜ€’‰vμTyσ­‘DGcBlΧ`\ &δSΐ…Ά2u₯9�7jλω ΄Ζ υ™6V[Ρς…RG†4T’1μ@΄[•πBπ Ε•41κ/=MjžƒW*›΅₯•ΥυΪ6&6e¦^έl” Ω…bΎp kw¦§Pšοθ.V;Ίͺλν™Lb¨oOύϊP₯ϋΠ!#TΏ§�ω[³p'’ΨΩΎsG@;~gϋnΗ9C—Ο>ύ―ώΕΠΉΧ_ί3»±vο‰L2}€˜+j4©d&Υύ]ηQηng΄ΊAΤΌΨ�όrώΓ�‹΅πρKaYζ3ύ=rδγηΈz`DΰρΒ²:ΩœZ‡σ' @ͺy¨cΐrH Wθ�|ΦĈΥω_₯ ™Ξ ,μW>ێ9·(ΊΎ—ΓθMŽ Cˆšs=1΅}€<0x€Šl}Ÿ€=e-ΌωΖXxε7CΗπ~Ϊ>t„/~ρqνv'­„η-—+2>žšοςΪypbkDMekΈΕρdœύ,¦70Ž7η©“0ν&βxm΄ρ¦ƒ\Yλ[p™«Α8§ΈGΧ†d„Φ¦γdΝ %ηM°Θω”‘΄‹`SgWwX‘’ό2…5-―`ϋ:―+Λ5Λ‘P\c}ye“ E’‚UΫͺ,Q\r–ή\«y5S(Ζ@έV�[λ…ΆΞ©ΎώΎ…|Ή΄>0Τ±Φ;ΠΉή ρΗ‰S'ͺ|δΗ+œd›HF"άΒe–ΧΓ`o܈Kmgϋ.ζΔDροώςΟόmžύΏΆ±²™^˜[ +²8»zϋΓ‘#ΗΒνχήώσg ε«‘FϊcX�ρQυYψώ½/όΰ}ˆ5žgŸ{.όΖ―�‡°¨Φ„ΉEΥS–+¬)Ί6œΎχžπžξ ΗNάώή/�ΓπόkηIsΚ‡"sΠ†Μ₯D*ά:1ΐΓP=}ƒQήbτ‡6:+œΈυψυŸώ‰‡~ΰΤ~μυοςiΫΉύψ|O΅ΒΕζyϋ}>zΝ|ΗΫ^ξ Ž~ςΝ7Ÿ+�^Ύšiτt7³xρ“SΣ©±λ72ٍ₯τ[cWϋ*«eν‡­ϊF©™HφU*υl­±M‰£F7:r¨RΫ4‘3C!ιδ恗Πμ&ΪΣŸMe“ωνν*Σt‚TΒ©‰©ΝΝj.™IwηhjΥL¦΄™F‘m#jRdΆ§΅³Τ�Ϊ@ގEZMGmΥ§�΄ Ύ ²Jϋ%Φ›βoΏΓ'Q†Ή―ΰ΄a8rZf£Ά(ϋ(ό2Θ+k―€šk‘δ+‚:²TbZ«vY�šTθt RšSi>D†)ΐB¬‘₯-›δ8ώΦΆ(ΕRΨή�o§6VΉ&LΏ5ŠEΧ·b@ c8[Μ-Τ6·Ζ Eκ}ƒΚV+υqjfMφφ¬υχχMzz–ΪΣ=•‘[?ϊ£]Ψζ²ηθ`υ°`Γ5Ώ\ΤΞΆ3ί#ΰσ³³}‡ΐ /43¦<ω»ίΘ?ρψηϊ&ΖWoέ¨TO―­¬ά™Θen5›}ΩrZ7AiςΩ·(˜e9AEn6!ΤNeŒφ"΄³8‘ΒΟΈι4Κx*ŽN5¬/0»0K}ƒ‘·Ώ?LΟΞP€°ZώFΏ>υ9Μf'΅lJE‘ ύWα¬αh¦P :₯¦#Pߟc―GcΦ: ψ¦N#G°£N¨Χ%  σ@°AgΤΧώΨή΄ΛB«X`lΕΘωk\O†ΟM3p‹u<6²έ֌όi΅(¨ΰuι\Κ„°…c“kλhoΥh Dλς½ ‘;ΞΑ1SŒ§4ΰvRŽ3�Ϋa�ΑCax ' Β68rp_8°§‹ύΆC۞#M‡†e,`ΰΌ  πTzωχύL&Eg8~¦αίΡcη}£ #@ΰρτO}ΪέΟτ Τ>ΰΔL:ΰϋB€κpzφA™ l™KΝΨΞ‘ηό�ΩηΓΣί|:¬mfΓ:»„l/) Χ©w°V——¨ Ρ•wŽ ν+‹€:ρώS‘y�Fnv:O œ%Ξ‡L• Sž˜&˜ϊ·ŸE`Εoν‰hπηΫ9@p?ΣE20)²9€'ΪXšκReό\³qmy¬Λ$Μ •}ŠΏ LPh²ϊ)DΉ{Οώ°°²Ζ�\ έ=€6υηΪδ˜υΠέΥ ΐs<\~λλέλ δχ„‘=»ΓΤδL˜™žŽλΛk‘ Q―T!­46‰–TpώΦδ5:h¬WλΥ4-9—ͺ^M&ςKΨ4€ €Sm&ή*wo œ96ω ηοHΥ`BBγ,³qω1€…‡)š·³}׌ΐΤθ+ύ�ψο�άLΤ2χ'°‘Φ7Γχίσΰaxί~ŠΞ…GώΖߏ�η/Πgω₯'ςΊͺύο?††ΒΛ/ž Oœ9&'VB–τ§dNΦ5N!*λžf8yκDθ)v†—Ÿy>”;ΪBΧPψ0μΪΗς\mZ―9_d±¦dq!vοέ[οθκ~掻οϋην/ςσ‰ΑS¬σmgώlGΰ:8ύbK»ύΑ If–€Νποmΐκ�δo%²ž_$X†ΒW\™Ϋx챐xˆH<«xΗ θ a2¦ρZ¨NFšPπ’:jC^·6 ΆΙΟ₯Ÿ}κ©βΐΠP"ΧΡ±E€0ΑΟ*ΟXͺ^Οΰ…&–––•P K+™KoΌVήΨJυlmV‹DΒ)§”ͺo7°Π{Ψ3 B)XΙνz%Y­¬τW«υct?κάάά #―Qμο=‚σ^Μe³TIν‰ŽpΖΔ΅k“αυΡρπΒ«―…™™―ώ §Ά ;©*ΫB“uΨ@€rσηes~Lc$I2_^XΈŽrgGΌN TZΨ��‚?ƒƒƒaοή½ρ½Λ—/‡W^y%t—Ϊ#0££οά‰{ΈVΰGrNΣ]Η·Χ\š‚ tωd½k4΄j*΄S)žξQωq²ψμ©L;UδY·ΰ)ΦHωέ‡Yλ�‘kWFΓόβRμ ±gο�ΠΧέ­σ±Ά Νœ’•΄½δZΆbͺJ•:FA܌άbθ4X΅νffζ™ΣυZm6WΜLA¨\.Λ \ίΕΆŽΆ™R{ΟFηpχ‡~τΓΛwέušE6Β …Έπ6ka\p<Ύ6ŒΡ�ΐ‰›ld?ZΘ „΅₯»«k¨?Όϊ ΟΨψυpczΰ @’:K0€2€υχw³Άͺaim©eό³ΫΚe VΒό�Ο‚­b[rQ#ΊŸη¨»§;,ML‡k»‡’‰}CαΤ½w< ‡σ―Ό^zςiΦ=]xΏX.P§%ξΊητgώό_ώιΏυιOœ{d§ζΗwΒ’ϋΣΉŽρD8Cl-aί:s<‰o�ίkŽρzšν±_ϋ΅Ž‹Χ/¦·ΆΦ3Χo€Χ7ͺ9lPZR;L^O΅c3δ––;ζζ‹8ΝΙb—B­LG>ιΖΉNΰΚ%ΪΡο8‹Ι©Eω-k1›M�j8‘ΔAOαπAŒίΪΚΫ&›©άL­Ά‰κέ쁫3@mή :°±V©d7Φ7ΊΠ[αuΪoςΉtwW'YΫήjΡ™nR#h{m+΄mΥΧχPοhο&*PθeΖi“΄ΡAj»±™ακ)6μς‰ό·‘š»ϊϊzΣ 7σ…b³³άΙ(°ΝDLΧ«�‘LιφŽ�„μ9Β!ƒ�ξολGίθΨΒ²ψη“4ηΓyΆR;ΟΉ "qŽΕφ6LˆΫSζŸv’#[bίΕP£3ŽŽ�l¬’¦°Š₯NdG_<­³ι΅–C8g6O'lΈ±kΧ£c}ΰΠ±055ζΒΎύ‡’ŸΈ~ƒ4«5l†it;χ U/YV”Χ&“Κ°Q—c?hη jz?²’MΓ—tάA;0ηΠΣκ~>£0s΄Σ¨χ=³Λ}bσΕy—UΚw±EZ€?φC.Fϋ–kp…jσΘͺΝ‚τΠΆΈY$[S`†±RΗc+c³ωη€ͺΐεaw8Ώ^ƒs‡šή&³ΑxeΐΫΝΝε΅Z£ΊέX¦υψωL‘p™yZηnΛε {ΈzΟΙ[ηό/ lƒE j5~‰K{DjεΞΆ3†#ΰΈ³}›ΐ£pΓHWKύσ�ω'Ί_9�Φρ₯ΥΚ „Τ=ΰ¦'qώ%�™•€`€Ηΐ΄ΕEŽRΈkθ:ŠΦˆ_VF“Τ±T#Oϊͺ:a ήs7…q†H¬*_jy74ϋ™©©pρΝ7B[Ύˆς‚>–€2?J`…£“ͺΏ†’ΰ­PΘ‹�K/£ …=ζze…’`ΊΌhδζb — ŸΞ!¬Υ47‘_Ρrˆˆ2σΫϋρGTXε‘βρoξϊΖb|­ΐχ~ΤΕφΨ΅Τ·ΈΏ Κ‚PΌ¦^ (GD¬‘ϊ1v(œj΅ ϊ9Rδ―YνœkΓΈo’,Άˆ P4E*5ΊΊ» χ†ε©₯`β]ναΨmw£τCgΉzθ�ΠΥEέ‚bžϋ£m#Nγ€ΫΐdβZ0 Hμ‹Μ 0XQ~ˆ“ ―΅’λŸ8¨iβ\³ΧŠVγ΅cΗ•Ζ{gwΗR>2TzόxS~°�€(ck-‹”‘„™@Ξ"_Ϋ"σVxϊΉ³ακψLΈty"‚=³Σ³81053“dύhάΤ¨ο8:ΞOV¦cY&¬M."‚5‰:LKΩb}Φ™ο ŽΛ§εΟ½»~«!u†ͺ 6L™™$[rήD«£‡C sap`νδm°ΊΒΒ�-V1ŒZι²&dΑHΣΤ0‰`ίΨ pδv½Ί†νAbzHN%Ϋ{ΌΔ=ΝU6ΆΆσmνK0-Fqτf‡Ζ‡ϋ,|κ'²Φ{τ¨Vƒ”ˆΈέuΖΖ/ΡΖrΗΡk Θ·πΏSΝ©ΆΏϊΎw�ΛρΛӟ¬AΚZ_¦c λ›ΗWΩ’ƒU-‘RΐΪJ…ύΗφ…‡ Ώ―\λΛka߁ƒ }t„)‡γ'�‹>ψ±ŸKττ#΅³}·Žΐ#Dψ?|6€:ξ ΙCqQM&Ÿ|ςΕάκ[3ι…΅Ωά΅Ιλ₯Χ―·π½7ρΩ‰Vwα΄%a6nnW«ω΅υ΅ϊ•z·λΓ©|ϋ ~fBΓδ½£…z‡m‘�Φ7λΝδ^σ1Ψ�ΓMšε�ytιΖΖ2κ?Χ†ΜLq9ψδhiΦ2šXαRά‘ν8�{ε5:C³ £Ξ.N°ΓZv€€—²}½ΆAΊ€ωϊΤQj’'P½κΞV”YPX½§-’DOj§˜·]Yζ˜œ]μVλ $κ#�9α0z/CΦͺm}θfήkRK³IzdŠZIΙ,S­γaΥ0€’‹Zl:ώαΗΝ œam)‚νtƒΩ P΄ήΊx%\›έ΄άf(` .ΕtΧ₯yj5y\ξ}]Έ ΎΘg ΤΧκiνƒV[ƒχΤ©ώ8ΏΪΚBχΧVΝp,›°ˆΩΔV˜)1Ϊ~ 'Jέν‘`…ΉY#@΅jΑG‚ή‚#ŠΗhb―ε9†) ώdΈn6ϋ΅3{ϋB6š©"σ‹σ|“‘a-ΈŸ:\ΑypΌΌώ(`εψŒ£rΝΨ&œ‡4‘t,ˆC[Ε¨dΑQ/·•ψIΥ+ksΩFs₯XκΪΘڟ޿wο«wάyη�zΘH„'2}Β“ξl;#π§2>/;Ϋ·Ω<ςΤΌΏςjα�ΕΏ7Œ“ΆgeeγπΜόΒ©|.wμ#©\Ύ­X,£fq^Q*ΈϋΚi„˜2GΑ₯Σi`G…pЬ«S;2Η-XαgΫ=+γΗbs8TY’°›DΤ+Τ h&A½qάΠόQz¦Z…#pl&4+ .2“₯K!μ&έ6F£UPΞυY#Ϋ€γ[KA₯nš„ŽΏθm xe£bM Γ₯’ρ΅ΞŸŠE…αώ^³Βά}’QΑΑӐσ’bb ω‰Λ1E”ΊQΊMφ]αzω8"ΙRχΌL•­7Ω:ΟνδΛXΘαpFΠ@Ph©Α0θΛn‘Ώ€Jƒΐ[Ξ·e°C¬υ°γ€ΧTχBilτβΖR5΅Cοs/ΚΒ4όxνbΚB‘ϊ˜ήŸEαΟoΗΈeS΄φυ}t\άάΟΏƒBχ7sΤ\_ σ“Χ°Χ8OWο0¦E{΄ί�\£££ŒΑΜj ­VΒ›ζ©έ²Ύ±––WΠ‡°/Ϊ{(έΊΡ{Χ�] ΛΨ^ŽvΫMG\])˜ξλ›φC΄YqϊSΙb΄ΣdΜ κθ¨η,,,Ri%ž“―ΕωLJΞ§=’mλXi· Εασ5ΊξVΦWXΣ€‡°ή\Γ†ž΄'•·l…hgπžΜΧδvΕκd=lLςΌlΎBžލ„Ρ (θ€φvqΎtχ.ηηΨ T}=]?�ΪQΦ8‘tX† ?Ηψi0™·lJGθco] έT° ϊ·£΄u¨“˜†^Ϊ-Pˆ›w>#„ΡRθTσ΅~ξzF lΰ<\ƒΝw˜7©}MΪKΊζ8P4φͺ8.\LΊ:>žzζlxμ·Ώ¦ΦPψ°#²8⎹sη|ωΣ„jhτ_ΰΐχXDiΠΕΟuφoΞ©ΐsλœϊžΖŸμ‹FTEεΚ{qqνR1ιŸ Ρ€ΒgXrU"­kυά’%Κ³–ν�‘δ˜=ΜI�Po(αή5Μ:₯怕ι$ΆKσ³ŒeΛΰ”]“δΨλ€h«±Ώέ<�&χΉΫΖΤE―Ρ<σφ.ŒΔ�ώ˜Σ₯³Χ τΘ‘a‰œP©”==½tήθ DʞώΩ8VƒΜ³,œ%’ΜRneΥ97υ020Z�<Ρ%!C� š•υΥmΦυJ³Q™!jV%’2•ΟdήW8Αr₯»Ώ3P2{ˁγWoΉχήζέ|Έ�°ΐ₯cs|Λ8�°6Ϊ?χλ�μ?|γΜΧΎwb|ΓΊ#LO‡ΉΙqŒF)δTΉά`™Ϊr¦κ[ΚΎzΈ6¨eΚ’ΘB`RnυέxsωKφIocύ`kSγ₯:ϋψ ΧΗXΛσ‘Yό’Ψi LqοΑ‘π�ήήύξοθιμύφΜΏ:|ψ;μƒ?<ΈίB―YO¬‚€€”’&«Ζ@c!ΜΥ.d>χΝ/·ΏϊΒKν7F―Œ¬¬O!pG²QTΚ�RΉΎ±ΆΩQ*ε K6 �§‘τ£υς‰t’ƒrχdoΔΓΌ2—<’ £lS§o"{ΣΤΗP7θδλx)›¬3Γ[θτ ςΪθπ6*Δ:΄»‰r�}s+¦1r<=ςτ£TυΨ[«°aŒό·Ha,.Pδ˜zμ[A 3―ciiΉ₯3° | μφδ1eŽyόη-4oΠ2ڈΌϊYω Ξ‘ΰ‹χƒfBΧΓ6ΰ·Χ―½δώMμ˜Ξrw₯qζψzύ€j`SxΝκ©X€/2‘ΥάΎ,6υ6„Ί!Ν9M_0`ΰυυφυRxg•ρ=θΦ㇙8κκrΠφ§Dκwδ]pο«υ·cΜνӍ^ˆϋDΞŸή˜―[6Mό;NŒϋ{,ΏΞη�ƒΫ9Γ–1}Ρ`Ccƒρ^ž‡ΔX Uζ�Ζύ;?lΩ KΜ‰‡΅γ�$ΨbΆI₯†ηŸ)ΌjZki½{H}θπ―… /D¦i¬ ύCAζ9t. ζZ½―ŽpY{ΚΟ,R­m©£ο¦n¬Ρ>0RC »E›Ξ^^Ÿ—σkΨΦΝΊLπϋюπΞ‘kΛύMαΠξ1ˆ°…=&‹Δ`œ B――&‚΅5ύΡVqώ΅©‘ΕΔλΰ&#λ,DC,^ŸV΅Ί_πΐζN™�ΉžζΑŒŽ^z[2₯ς¦+ΧΙZεώH!Დ΅Ju’V]ΏTξ輞Θ$_ΪΥίϋΖ'μ‡―ž>ύ3gΒΦƒ°PvtΉ3»³ύ7Ž€bagϋGΎΦL�αLώΝΙ―θοξΏ?›λΊϋΧ.Ύ�‹gžά{cf&dQš…Ž�°„R�ν(₯� HΆQF μ)τ Y[A‰Ξl= aφc_ dτEl Œα|ppl7pϊ d)J£ΠD$#ψI ΐ1‘σΏ)tSΕ‰)·pŽR€±²Φθo£�‰ΉgHΌL1St\#……/=L₯‘2. 0„ΆνΛŠΌηg*/ƒH[3ςB֘(PqΈω;ΗχςσΠwu8U4²ήRέƈυxo3*Δt(QˆSεχΡκ2χUόΛ Ο}Q±¨ŠΣF΅‰κFΕΏ½zΞy›DΤ³°6‰δ;φ:κ x‚Β|oƒ‚{ύ‘fG° w°Ÿ¨v'gm€Ά›*AρE,όN@–~ ?χœXoaen&Œ]x= ο>DDz άΈz1,ρžŒ(° ΊΓββTŒ†Wq"61ˆΚYΨ\k‰γvC―«s―Ξu{#ΐ‚tΖώα½Ρ)Νj¨‘œή»`IšΉGd�7«Μ; Š(7ΜLjόύΆψˆΖ‰F ΅)6–Ι½^εΊRα 5ώα?ϊGαιGqhH@ 3”Lρޜ³vΖΛΞ�EA. Ύͺ)NΕ«�]$BΰfŠ‚s~<π½­u'œcώKrΌΔλ1Ξsΐ³ΰzqoΆ4·‚kTΦυΞ;‘VrƒY)ŒΈ^ΐ–$ΰΝρ[‡α‘Αpϊ{ήˆΣΗΊZΟ>ύkKΪi΅‰±Ι:»~m Ίε<λ‹"Jœocyφΐυh|ζˆΉŽ4ΧθΎ‘Γ&π$ΐ°fdJ$Γ¬Θ3†]ΧΊ†$„άψ=S Ί˜«%Zb²c8xθhΨCΤΓυ,έQφΚ�ς"yθ‘L‡Μ˜%Ξ_€0έ%‡al»Q©―1§“ρχΩ£₯–λ˜€F…6Yu 7¦§κP2ω=AΣ7Κν]η‡{Ϋ§Jέ …tϋΥϋx φŸψDKe“ͺbš–"bΫ?μ‚ΠEέΩώ[FΰάΉG³Σ—6~ƒϋŸ]Ί<:πς‹ηΓψΥq­Τ£SΖ:2oΉ\΄ΛH#²V«oΦ�RΞ'λHΈ–\#Hε’ψ˜£aΘwtEΉΞǏμl„½Šΰσ>1~5\»ΖyγΝ7‰6ΟG}Z’ΐhƒm™"»F§Η•ρ[ Ψ`ŠΟ¬:Λs2|\Œ…LsŒ <Χ!ί †�ψΨQτg€«΄_–αΩήPB=“5zQΏ§ο{G8D­€6>SoώGoR=‚Ξΐθhιf°„<7Ž}„mΒΐΖ@@Π©4p"±υβΖΈE}ξά’sγ7αχΠΗάH z#dμwA?ΗvΙ\7Έ½N(}�ΦV1TΌΎΑαθ`/ΞA―“‰!X‚‘dDόκ₯+1οyq~ŽγΞ‘F²ΚλΞ0Όg/η―…ΡΧ^ Ξ½„QVe|6ΓήC§@ύ͝ΔQΰžWζ§£#ΪΡΑ}”Κ|ο@8pψDθξˆF γ#=T…I­¨ˆ’οΌbŸΚΖ§ζΒγgž�ι‹_ ΧΗIg˜'½ƒ}ΌfΧ¨JΪσύxSυΙ:€ "s�ΦYŠ•άEάUΐVd–¨ƒ―σ―Ρ§γ/ΈΞD@IDAT�’ˆcK„H½‹‘£j·‹ε₯Ε’Hh|ͺ]c΄‹u¦rΦHT[…6©±QdΎΆyέ#hΣΩh?yςŽ#a�‘½€ŠtquΝ0<4Μύ6IΝΈφcΌm°ζηg8λCΠt„N’a²Y^{ω₯pαΒa•T οΑ5¨PΕιw=o±r ]σ;½―*Ο ρ:žWkch€ θθs±Ρhκ…nισc1NŸ©CGΖ5ίGχ’c>–1Ά69Ž`›)8νD¦�^»ΜλV€cμΚεhΌX°΄k6κ%TΓC¦ Δ<…«r)€‡4ιΎΫ |‚υ©b1_«¬U�ΓͺgσιυΞΞσ8ΧΫ ]ΥR1UωιŸω+Χn}η‡Μ½΄;„'­­ Ή³ύΏŒΐ™ΟύκχoTΧ?C1с—^~%œyόλ#CN3| ‘Ζj/yΊ5ά?܏γezΟ -n]“γΧgΛΰ•υ-ψ¦\™Φ₯ΟOϊ ΑšD† n;t$|ό#νέ·?―ΏφRΈ~}Γz3<ρ΅§pbRατ»χί��0@Dππα#ΚΔΟο:ψ‰Δΰ IΠ;Ϋχ΄�˜I0οιιτo}ω?•/^ΊR½t‘Ψ¬Υ‰τχΞΝΟτΐΣλ/3ωΖΦf?κ`o3›κHlΔN Η˜utθd'ς½ˆ΅r–k@YήV­"o4T9»ΈŠ0£ΈοŒ1)τžυŒ¬;4‹ώ1ͺ:ˆCύ�οyO,ŒχΕΕΏ}>wρ3Nx³ξV(F}cμ-t%΅H]]^έ’pφε0>N$tt[w/#‘ 7(ΊΌF‘-ΐ g,Œ­ŽVŽιΛΡ Χ‹ ο{Ιη�_Ω,^š`W‰βΚ2IoΆyφ²k΅υΦ7` @‘βυͺ�<†—�\ΤFΡφΣ>‘QΐΧωiΥ/πswt ω·σ›aΝ™bιzΝΪE¦ΩΆΦ,΅½Π«~Ÿ3Δοy‘°vΞ‘2χ^n―ƒunκ‡Εγ½b'h/m2Φ]€6šΒ³ ³΅Jκ$τ[αό�W―ΩΝbΡ1e‡gΌ!ƒ†γ`'o�ΝΒž«nΤΞχt½Ψέί36ΠΥ{εδ©SΧ~ΰ‘‡–Γ�xxŽcΈσΟ�ύ°zwΆ?λΰaΟό“_ώ«Ο}γλ§»JΉτγŸΏς�0…πφ½z~<Ρšϋπ'~ ₯“Δ€;ήΊ4^9w!B€'.Lα•7cΞ==`@ΑηP¨œΩ•…eœDiœk½ŠsŽΔαΨΖ©’Χιwž·QΏt„YΊv{9x'ζ&ΖβώΆWœΊ1υμ-"ξaχα“αβk/`ˆABΟ€¦R@η�΅ρπκΛol „υMy"ΡΪ>k(« N4H�zbtPΒpΚo* BM\ x;”{�Šθ€¨₯ Ζ°βΎ‚[Fν‰PQ8ω| —UrνS )~ίc6ΑC+HU, s ˆωžhΆ”s,ŠxlǎTŽ =f4‰π{Ž±Ήώ¦p€‰R˜—fΔά3 sSά TH’)"έ«Πm‡dJΕΉ—žŽΖS¦Šυ ¬0\ ωtτs2�›ˆ5C™Κ‘žBΦ>Qr/λ*σ­ϋ†w1~ΒDρςή*‘§ —FΓΉ7/‡gž§ b“( Η—R¨AjʌJ^΄έh<ͺτνϋΓpΤ‘V cP¬ƒλ₯1k₯D4TEνZ·Ϋ‚KΎ‡ήŠ•LAm^Ϋ$αŸ2ή·kĜI»c‡5έEͺ’Œ?σXRΑ‚Nώݎ£Ÿ’Υφ6m8©I‘£₯]ŠuΨΕΈkΐ”`Œ_Ϊ 5qοΎ=(dkΤΒ‘#G#πdΞ�η”;~γ:…λfiΈΰ@ρΠΛη/°φ`¬p,Š„«WiΩE Œ™Zδ˜'1¨¦’!³½MΔcPbΥτ£V¬'ζέg&’  k±8€ΟΞŒ„2λΦjΪ²odΎlΑ9|θ(Ρΐ]alμrΈxαΝΘΠζσVdεϊρ8·: vFq[#’'}RPHγΨ{ΥΘ2u'+ ‰¨JŸΥϊz₯F!3ό€ΪΡκ‹₯β2uΝ¦Ά™ΡύM΄wη'ψΐkΈ»a‘Ά˜xθΓ?΄zΦ~i'3Žs³9_~ζ+Ώϋ―W—ζ?ΎHΊΟθθ΅π΅―~ϊξ5@Ažeδv¬iΛƒ+ά=�φ^]xεε°�Θ-›λajϊF8wώzxφ₯Kazq:Κ¦Ψ5ΔGK?n³““aΟ^¨wͺQσφVW—Β+―½ˆ³-Ÿθ3Ρw��³Ξd…ΘπH’|₯3/Ο-ΓP©Αhg@Ϋ‰‚¬ΐtX’†Γz=&n,ρš±!�ΣΔΖ₯²6.P Ν)Ο’kξΆθ»μ +ηUΔ]'VPIΐΑHBŒ„1Ž—i)†� -jYδψŽzNJ«Qτ¨δ™_ Wތ¬ί(pή™ΰΘΦp z,#W\lTκ,ΦλœΚ_ru«+�ΟkœυsΖ(Cη½L} λ ο‘ΫΒ5&Š€9썹¨:αE�I42�_½#-²DΦY““7θDrρb,ψ(»ΐb_Uκ˜r°Ι˜mTΨΟ5ορ0BβΪ­o9F]lsjΑNΦχΝAύLig½H­ά€…ι/»0Δqόd°f]ίΆνΑ(q}œ}ι…HΫ”*jΧλ<Ž£Žy£Ξ‡€„±γGΕ¦ψœ8ΞYΦ‚9§1²ΑoŸU‹Z΅ήΨ¨o�b-ςɍՅυ&]:(ΉΡΈΪ^.½ΠΩΣύςή=»/9:σ�ΈzϊGa+μs)†³gC“�ڝX…ZΈί™[³9Qόζο>ώσΟ>ύ₯Ÿ}λΥάF6Iία�•9¨½‹ΡΑ2υ©«»;μί7ήωΞϋΒέχœ²]̘Y ξj§¬λo<ω|xϊμ›αΟ<ƒ£œπq»iXκ% vΆΙB«2―ΌΞg6Γ-Γα“?ς €€!ž7ZŠ"‹¬Ήy€£³Ο>Ύό»OΔZ >³{ξ C{z'ΩO8|δΘΏyοG?υ“8~osŸΏ3ηι�χ]΅κ „G™Υ[pΏNπ3wαBϊσ_ύ\ΫSί|jp~nζΠϊ�lοκZ½1Ώ•?ΆLŒlΧΆΚΉl³€ΣŸΆ;‹ŸνηTQNΆκ!ιT]gjΜž"ϋLSΩό4ΞΩΰ$ΠS²οy™ƒέ86Όo^Ώ ]'ΝϋTUO”a!NΟΞ(6‘ύαυσηΒΩη^ˆ@­ikKΘxŠ/Ο-„vd†zr‡UΩ`ήyCωΚυ4 PŠyΝkEžGωΛΪS^E›‚Ο”ΌΕ½]κu?ΆŸ +Γl[ά…ΌνΰΙ¨ »J΄ϊ‹oΕ5+ˆξΎ�_Οξχ3Θ6νΞPbMϋ,Έ2OAhaΑnž­Ϋo»y΅Sμ"’ tp1;€Άb Σ$z‘Š.죝ιϋΏοΓ€²sα‰oœ ³‹¦Ω΅ξΥγjδa^:puVmΣτ2θ‘mδ¨,‘"cΑ(–΄³ήΎ�{?φπ Va±-ΟΟ`dH ΐaμΜΘ&Ўι‚€ΞΪ(π†βkμ3#ώvA�ρLΠ~sŸ8"όβžρy)Ïΐ?:Ύ*žρί$<i˜ΦρΠmρψ @—Γ�¨2)X’Ν) ΄AD|βΪ4 Θɐc=₯°aΖ‘c/Ό|!\Ηd\ΧylO™fύɌ“uPG& ŒDΰ…㩬[ έFkM^jFρžΜ>m=Χ‡Œνυ»υΆœkpHγ5έΆLI¦αŒοΝ:•¬Wdš¬·₯ΏΞ=ςΣ ˆΟE1ΥΧΪL8φΈξg ƒΊ?Ϊ¬Ψ©‘ΘdΣ !s+ε}ˆNΆHc  πτΨ’¬CmJ™.°ƒ`·‰ ΊUΒ†¬‚‚ až!axx(άwΧ=’°₯δ.^ΈΐT£Ϋ �1φ>§+δφ9rfSΗCΦ„)κqŸ±Xیq΄0£7Η΅(Έφ˜λάgAy²ΖΊ' ΉVίXK4šΟχ υ?30ΨξΆwΌλςΑ}lα0Kš“π₯ν»y”&;۟Φ΄h‡ιίόG�Sχg�ΣWήGA·–Ϋ{ξ§ζαpw79bDπ Γ‡Ο<υυγ‘ξ+τ…ϋ)sjΨwhxΫ/_/UZΖ!KΩΆŽΌΑy"Ξ ˆ†ΏωΛΆυΣ w³ˆŸΕxpϊΙ§KβxžΡξ%šŠ²νDΒqBΛ:ήΐ™#R\§EO©7"Μ-$™!ͺ¬rQ!€Ά§–iΦΆiί7=9ŽΑΉ¦–«α™gί€e£W―‡ΕUR#:ϊ@A…‘pKI\N¨Ε Qΐj΄hhDλίΆ²ψΚ· 8ΡΚe£W9F•mΣHC£’Ή gQjσΨλΠγΪ κhΌ ό[ϊϊ:Ё†1J«Σ·†³¬BlΖ]ΗΥGcζ h Κ f¨%3Κρ¬rn:GΛ °Άl…›ηα»FA>’δB–&J³Œ·Š―ILŽη*hr>S₯ξ K3ΠΪQP*Pσ;Ψθ$Πϊ7Κl#2H»A B™nΦw0‚΄ΕœmόΨSyπmΗuy~ ]Όη?m€!”Ia°5•Q£rUϋ‡#8 ρ°κγk5œύY¦{Ϊώύœ1ŸΎP 4ΗΧΰJ4qΆ+[α�θωπόS_gέI‘ Ψ‚)ΐν/›Β΅ιΐΪXP%Υ„΅ΰΌ8^ΐ,#?Ž{ϋI­Ο‘Βς΅ψ Jά16 !Ij€²ξ4(Zΰ’F )0Δ�ΌgΔJϋ(=Œ‘ύνΤι{5>·]¨i.¦(˜σθζ±:;yΩhV  λzuŠ�,pd˜,Ÿ/sL«a\°ΌβΪ0ma™5―ΡΈ΅.ˆ*€Žφ‘cΗ`μΖΨΕΩ:|(ΦQ0’§!ο8\»v=ΌDΔξυΧΕà ¨θΩDŒCˆŒFΟ€9―‚>Ϋ� .#ޏΐ5MŒΤ$d!Τ Όη簝f†gVƒ©ΓDš¦λZγ§LtyρC�Ԙnd―jŸk ²εERψ-h΄Ζw=·`žΰŒ] Šω0 πTη>]7λ¬λ4ΐ‘Χε˜GH8νΞI{`žXϋ)Φ­γ·σŎ ›5šœooΟy\fζ/q« „a³”ΟΏY,f{Ί»ηn9~όϊC?ό‰™§oa‚G4\΄ΚύϋΫz;�Μ~ΗΩηžωόΧΎτٞε'E³Υ Ρ(D-124ΟΟ�νwά~β/~*twŽ"34n;q’*Dν€ςε/~#όϊ―ύvXΒ έFŸ€ι‚‡Υ2"Y›­\jjδXSu@Mjk€Re<¬ώS…»ξΉ‡Ήςyb[~ιΕ—ΓΧΎπQAΨ δg:v |δcΤξŽ5n Ω썑ΎΎž|ΰ‡ž�Άžˆ?Ž‹GΗ?ʔ݁+vhn.ϋΧαgF¦Ζ'#gσ+λΛe�Ί†N¬�­φΰδβxτϊχδ )S³<)Ÿ}ž±<ςU™cΝυ£iDXI€Eωfη™ ²±gάΟuztpn½νTŒΖΟ#«mΛgTrgWy»Βs¬Žοο'-› Φ β ž˜g₯₯_ŽueΪsᄍg*•έhͺpϊU€SΟEφuΞΖΡ%U–ιΨ©ƒ#t‹h€”6>g_όπg;CϋΐΆΞiΑφUΨΒU―UΚΏ-8Au#ψ£Ξ¦]£Ž±iKΤϊ©a{.ΣξucV+2ήb—�_O©Λσ€�4ΓΜi�•f˜_‚‰N(ΐ¦$ZŘ`‹qUkχ€xΝ ΟΝ΍:F†ŠΧηšήfΫX{±6οΙΥ602―SμΊk8œϊο¨gΪν›dCξή·ŸυU½¦ι€ΰύ€ΉάΤνΪyλΘΎV`η‹λˆ&֜zΦg(²Ψί}-NL _ό�λίk€ŠΟ"γfΠCΐ_pΞΗ rΪc˜v†Γ\sŸ|.§U›Δ QBSY͜X7Dωžem›¦k`!Λύ dΈn~ν ^Ζϋχ^n2w=―kΘΝ  œ�ωœ΅ ³–'qœ―d|�\«Ψ½q °V± -^]_]J2W©©p&‘Ν=Ω7²{τ}ίϋ³~θ‘…_Βyd‡‘Ηψ»ιVΣΞφ'=­ΪγΉΏπ‘έΒψ‘Ε΅Υ‘ήΡΣ;DπΣ">8NF>Q2 SIoΣΘ/ς^'‘§[Ož [6άrκD˜έαωo†σ―M„‰ΩJ€JχŽwέ^!§ϊςεKQ(‰ͺJ―RV”‰4₯Œ¬…£Η…|!ΒΜ•·Bua2άvτ€Δѐƒ>ŸΐA -ε„Β@ωΆŠϋ!ΨQ\x­‘B€+„’RA€W�½jK³‘£gw¨¬@™'E’ΔρΆmα±�ωπΫ�ρ+aj ₯έΥΚ}C°ͺΠΧ"κ[G9XMXδSΕo$Yεaτdem5�ufŒF)ΆΣƒ„…ρ …ψ¬Λ`ަF΄Ž‘NtAtzύ:FŽΐAkC!aΔβp8΄%H…ΉΡlΰο¨h,XT„Ί―Βς|RιUv(ˆΘ·Ή‰Β%.H±ΙΉϊ^«,šΚˆ4ƒ…{Δ©ηPfξ%»Jߊl8ˆ^«΄πD–́§£5Χ π‡‰  Λfd " ϋΩZΚ ΑΌΠ€e*rN”rξΪ$½›1(ΧAχ5¦²DN ΊΘO¦₯6ŠΕ₯‘š‹© ‚\εΊΦ-¬Χίφ<•χάΜ$εΎpΧ½οθY ³P’m}d΄€"λadίΑπψ—?ΰ΅5 †”/Κ―Iq@kU ¦ˆfsά”Ήω*(ο,΄© Ο›ω©IŠ(mΧQΊŒu“Ή^ΡΖΓ±f½Ή6TΠqΠ‹v•PΡn2.hŽ•‘…[μ(Αχ4Dχ}nβ(h€*ζ‘±₯±²D—1²γRΙ5bΡH[D5 ]Ά΅§Γƒ~icq>1όTΞKNŒk œ rΜ­ ‹-AΡάΒΠ©ΰHΣ·œuΨ 7& ₯Rί‚’—λΠP­&~τθΡpθΒ…‹oDp¦`Α. O5ξινǏ$’υd˜š˜(a@φXd0ƒΗτ)ž FKΫ4ZlK_Zas›bcŒMž{λ–ΩΈ'½3šβϊ'£ Z=šjΤ·‹h3,"#A=€ΡŒΨΣ‰V1vfιΰ Amτr‚ΓΏχΘ«ΌΑsΊkhu%–Γ NoG5ΟωΚ1Œ0λl…ϊ'¬Yζ^Δt―ΥαŒŠΤb>3Ο뾊!ڐY‡ΉR―Wš€-[€ζΒ5Š>NP‘z₯\jέ½oΰ…ίχ±sρ‡x1ŒŒD ©U¬ρΫ«Pί“_ψυΏ<5>ώι5j₯,SσdrςyΐηΒ₯Λ3δ3>¬ΩB¦ƒ’h#α=܏>8B5wh½Μ‡ΟƒσQgνYΜτ΅scα3Ÿώ7€ƒ` R'&Ρ$*φφσ"H«lΧ„dƒ’ͺ87 Z1�"·ΉνhψψC�]θιfn“!œ?�FψΒo}ζΡrθ„υvϊw…CǏ"οIΥkkΫΞ&Ÿ<|ίχ=ζ3ω·ύΖΐa4FQ4$žώβ‹/{‘mqb2ΉˆCQ½ΞJυ€[_₯Ίr€ξ-°2·Ά‘FD‰€|B9-Ψ―Šτ|δbŒςΡΕs!K„όΔΌižΑκξΖύΣόmΫLΏ/ΠΩMήτ‚ δuHˆΚχΕγ,eGHCκ`ίρΙ žΒ©ό£ξ€ήΪ“ΠžΫνΒ2=¨a}˜Z₯Œ΅s5c6±%’#ΔAΪ‘ORͺMÊΥζ9�2ΖN@ΚA^u'·…ώGβx(7”΅�ΑΈχφuQ¬ΨžΠθkQ§I‡4BgμπΑ#8Π₯0»@tο§n€HΚ`ΰ½~c6|α @Ή.O\ ›tν)Žu2r±Ξ>‚ϋή₯ΰ…ϊUύ-“PΩ¨C§R?¬Ρ*PΉZD8p>Œ$»ŸŒEu «©y)ΖCC΄EΈ'“F�{lΣη”iΪ[Œ©sdΗ-�ηοχ¬ΓΰΘα0Τ_?ψαχ…“Gχρ,Zλ :‘ρYjSΕ/ς]Ω2£-’“ύ Ϊ‚ŒŒ Ρ  ήf„Bγc&ΐ�Ho) rVV x―ρήkξΤ δΜ°FV‘=σΥ�2υ­S@ϋΜ:Lt恸nr_~σRXœ±v̐nΨK�ΕGφf<ςtΈXΔ.«S·`6Μ.QD’pΛ"5fζ'Β,i-«Μq‰ΰ…©²² Τ™λ¬1‹v;a¦άΤqή΅½VΗ~‹υfΫcAε™λΜ G=*ΰδ{O|ΓtΞΥλΓzNM@ψ$k[ύgZ‹ϋΈ†erWXϋΚSJ >βœq<}‡—-φikM΅ wΆ€σ;7Χ“kΕη@]η΅LΈΏΑ/ί— psŸ-�U5L1Τα7₯&ΡD6Γ(*Ϋe‰λ²Ϋυj|9Ο½³c΄‰ f•q]k�9ŸΉ›LO€~€r³^„Ά±ηΧΓί‚ώΈiγςΐs€<Ρβ\iν[岆`dν.�.ƒ…5ηΣωό©7ί$5κργǏ=χs�Ϋߟ@χΦ~ψΫKχΖΨωη<­•σGώΪΞώΏŒΐ /43ɍΟtώλϊOή}ebυυdξύΩB{gš—ŠΐV|λ(rXαMl„¦Ρψ,ύi3<Δϋ` 8Ό?άvϋ!πβ₯³Ο…Χ«αΩηή uΟf’œz„RΒΫc)”¦ˆΜθHQRγ 9hκδC”^?Υγο?ύ@X˜ΊNεήT8x”¨}‡PD‘’΄Uϋς>‚K‹…΄IΡ›TΌ;� 8™-τr1~ΘρGαm!?–§ΗΓ™―<~σί™ ϋ³!M5�πμμrޚ9�•hK˜Šˆκτp žΉ˜^ƒJWΑj½‚vΊ-DEΐXι κˆX\¨ˆ1Μ­Η’xΛΘm ~SAšO―bΉu°lc&؜\+gεΥb³ͺΈΖ”σ‘G™‹|ϋ=Α Θ&C^)θo«ψŒ…|Μ±o΅ηΐΘjšάαyΦφQM#JΞY’θœsXδάή‡¬Ϋ~j@;6uΐ‘:γi!ΝυmΜΩՍ+ωLϊ&βQΛk»‡:ί8|θΘ›οzΟ3ύ•ΏΎHΖΝΟ³΄O°φiψd(Θ8ΐΩω©‰ρύ£0wζg'Βtί^ 8α΅RWtŒJIGΓ½wο{�{° XΟe‚—ΚΰΧΟ_ Ÿύ·ΏΖή’•'ΰ— ΄‘Κ ’Τ2L"kŠ΅[,Σ±#SIF‹r@ΙuθyvSλζχΎ Θ”j±°V¦¦fΓSO<�Ž^ ŽŸϊψΗΒ�έ»’ŒοΓqν(΄M³©φΉχe–Β·νφ(B62X+}ζ3νS7.—/_=—ΨͺW{««•njέ’λ,ζˆ,ηΧV–3ςύ΄ΩMٍ€e]@,χβŒα·6£ΞΘ!•Ωκ0‹Œδ™U1_Κ@εNtv{2Έά1ΓsΪF«ΊΟg8άκbοΛυθgˆ{t_1~ΧΟl;0Π‡ΝqŽ€2$=ΔΪFφαόκTɎp\‚ρu]:6χ>Τ?υξ δΨΥιπό ―Η:η―\‚MΕ2¦�okt,’B‘fLŠθ/Y}1RΜ΅{/2"θΑϋ�Υ½/f„1’mθ5bSp,―έΟ¬5€½1ώΆ.“ϊGΆ£Ÿ·ζK†€²Έ•sn0’Βσk[ύ:in‘ρ{-‰¬οD§œΎοdψ Ÿό(ι \»5e:±ύ°wœ,ξ>Φ%@ŠΖ…#PΰϋœΧH{v›bL}…΅Α5σφ’AŠzxύ<Λ³Ξ7€φΞzu²J0Mμ”Β2¦B<0Ž4²'ΜM݈ ";K΄‘—Λ]ƒ1ψ@ΐ™Ο― Ώ£qπΥ#₯’6{ΒΑƒBΠ8πθGΣg)œ½ PœΙ3@ϊσsαβ…VΗΓY\ΥMΣ M‘-‡Ψ>3Ψ*k¬);p¨jؘnΪƒή;ŒΦH݊­Β8˜‚ ψξšΰp_ο)Rσy–ΙΘΐγΣdW±΅—ζ΅₯ τ0ΦθeαDΝΪ ΐ Χ^½δΡωg,ϋ„βϋ7λhcΈ <ˆπ9φœΪ#‚γ�ηCϋ’hέ,ΎΧ5#ΦI‰Ε™ω\ΦΚ]±Ψ­E™&Ψ"m€ WΨ0ΰ!³Œ"έ.ύΕΤ"©e€Ζ-‚]œΣ`–€]ηΞ ‹…R|>½�nΨ 1ˆ†ΠŠe0xΟZ­VΎ<σ0σά“γΏΕΨΤhοΚNρ{ 3Ν.Ξ^e|Ÿ(wΆ}ύΐαΓ/ύƒό«—H3¬έ}7 {gϋŽŸ³νyšW�δωŸό­=gžzϊƒλ΅Ϊ':»{οJΪ³Φ>“f˜ύUπ(„Œκδϋ3g˜‡ΣπΡ~ιD‰ό€hΟ>ψ^ϊ,τTŒΈ§ž&ί­?όΖc_€ν<Η<,Χam +#Ϋ8HΉ… οάBqΔΎ‘ά5 eωžΣ!…ΒˆΉoˆΔm1§ jρΆEΫH5HˆDΟ£¦.‡\χΞl ξgωϊ¨|œΊ/L‚bΏyαZxςω7ΒKη�†Εu„7Θσόl«]’d"c@ΑŽδ�pP¨YΜMΑ¦€j'S‡LεσΛjΣ±:²=ƒcA9„­yωΌΡӐ1—κkpM 8Ό[ŠΘd „³ž Εή@@[XQΗň†B]al1>§#£φΪ,X(`aΤΑŠτΞ]ΜCΰΆhάΜcŸTΈrΡK0σQz:CζνSƒ&‹Pξ$βbž[‚‚81Β„#o~ηΎΓG1θΦ©”~ΦτΗ(ςe>Π{˜χODχWq˜½Fη]$OnίΠȞ¨ΗFίβsj=°–€’ ΔF~’ΜΆ:2Κcͺ†ͺ­Q Sezjγs’<»y‚ΪΜF]Υzm6�ε[’ω8xμoΑ'VuŒlδr€TˆOP„i•βšΨ£΄ΙZ Λ(Η$ηL=Λ¦urQ²Μ³Ά Οƒυ9ΓuΎ˜Γα1R�j‡’ΤŒ 82»ά/J�N½ >ӘΣ`pLwΡψποh΄s|¨‘§ΈΚ\c€η­“υΌŒ#κZΡwΞ3%"ŒΗργGθ ΈLΫΘ�|؍³tϋΙSά7F"ΧucόNo«v†sΟΗ²ΥΠ0ΝΓΒ-Ηo…9�]Ή νΆι3³s+αςΥk6¬ Ψ WYŒoσEιΕΦ—xF1ψM§Y˜d8a”™σƒuΪ-ͺ‘¬ρhWκ0ΧPF1|ϋ;»PτtX˜Ÿa}P<Y ρ±ΒΨIWΝ“ΏŒΉΝΉθΊΒxά8ΖI ŸKQτ@ι Fƒλg`ΒH£Eΐn»ο�0ΠΫεΨ kfcΉΔ~4s>ΗoŒΗxΗα²ΐ›ΨΖ‘’Κieφ<ΧΞicm6ηΓu¦SγάΚ*ڈ―TX2·Ώ<Ÿyδλ‹΅cjŠJΜωέOκˍZŠ!™-dKη“υ­gφŒτΝQ¬±˜Ie―έ}χνoύΘ§~vϊΚ‘C•»ί†M³y½πΪΣ―ώΦτΤυ^»†‘>^yρ,ωεγtΕ©BχΕI«a<³�ΊJ‰π—ώ‡Ÿ χή�˜jλΜ1Εa‘½kκ_ώκSαλ_ϊ2JΆ²‚””$ΰӍιΙΈ_”‚žx‰%ΐƒl. ˜΅A΄š¬5:±,%(|x:Φ»Ψ½?L υΥΨΝAv��‘@‘ύ°z¨Œ’ίάΫ·ο#ε£G)ˆρ­ΎaϊJΒζγΙΡ3/δžωβ7Ίη§'ϋΞΏqώΦ•₯Ή[‰L ξ~hΫΓΕrW ΠΎs�Y;ώiζΡΐ6C 1Οσ( j™N¬ES Τƒ[ε8#[<1²ΘΊNQ¦HdيόΚλ2Nœ…wτϊθR`-fˆτ‚AΔh»Œ5uΠ›/ Ÿ�‘Ώ³':q«_k4μD/|υˏ‡+/…΅R¦τ#qLn�«u‚”yΆΎΣIΦΙεθ¨y}Q–ϊšηS@ί(°qu’’�Ϊ ήί6χ%'γ τψYφS—E]ˆvLlχ{λνwΒ€θχ―ώuθϊϊ;Β�αaδ#I0@` Β^κ¨�IαssθŽ©<Ί6v5LO„ί—UΆν4 σe”όωι<Ά΄]†1`ΞΈ¬υΆς%)H€^ӎπώZχŽŽF�l¬ΛLDΆdŽ‘η–ƒ¨ύU!mqάΨύ€ϋσώΨ›τ> Νaφ=χOΐ € sζζΈΔ1ΕιŠι£θΊΑOy―mDζw…wžΎ;Όϋώ;CO'Ά u¦r8Ω‚Ϋθ»ϋΔΦΜCΙϋŒ;‚Rφ‚j xΚϋ¬¬*’¬C$`Q&x΄Mšίτδ5j ΐ­a�αp«οmΟ»{ίqφι 3Χγ<φνΪ m U3–K ΄N$T‘»»[Š�Rθ!»jaΊ€†Α]{βά’ώQ“ρθξŒ6γβ�ΊΫT‚<Λ€ΚXΘ1$)j qcj&<ύΤY˜Tθ�ΥT›”sƒ>u><3Ϊ­^˜Ο”L>"2He@ΰXζYμ Χ΄ϊP»AύοzΦμQ8�#ψ4@ω χa«bΣ΅Ϋ]σ8p_Y3¬uuΈŸiiο T8�„τΨ;ƒΉΡu9�ΰQ�h#šιΉ΄ad<ΊζπύŽ?άΗΰ†ΟO–}|ߎ ¦°j³ͺ31s9 Ο‚φ€I†λάF‡z=[όφϋv©Ί|Ω Lρ°D°l°έΞ ‚½―3ιυ2iώVVΉ>‹Θž˜VD—ƒ)^·€”ίqΝ•Έ.ν†:Χ²ςvа!#/”1ΡΆŽμ ζ5�  δ$φά+V}ύΨ‰c_ΏνΔρ³'ξωKK‡sΓθέΩΎ#F@›kgϋchδ~α/ύΉγOΏ|φGšΙΜG(dw —£5 —ΖΉx¨, „„J›‡!¦ΒυAWhΩΞmab' 'φοΰσπƒc{½RG!L‘8›…ήπω3ΟS§Γ!¬1γƒm"nˆ™]ƒβf_α ©γ°§Kj>("ˆςώ]·ή…!nv‰ΌΘ[By¨&ΰΒ8M�}Ά«―52\ηφό4ŸAe؁Σκ“WWζκC΄Έ³ΖΌTχΕ9 ήεπκΉ‹αρΗΏJ+>ξ΅4H•nRΦP((= ~ΫΨX-Ωj³Žuj�iΞά€€‰&λR۝{Pπ΅œ‚?Oj-u΄T2ζ•GeΙX(4=žΏέŒ©Œά΄UQsΟξηλθ’„ ‚ ΌφΊTLFcΪG݁Pi!μ›nξk¨TE[2JΟb„΄s¬:ˆΌQΤ6 Žτu†Ϋο<«'« k•–²φ*])#'ο ŠX.^y­Υ&ε¨γΫMΎφΎaœR¨ΖθΨΉ© h†δΔsO=€H)δfQ­T‹iUQb%:`τνf�ρh€YtqΝVV9œe ΓEPs4­�kQΌ5"Ω"m‹˜#Sga™ΨφȞΜ�£₯ζQΘ±»„@”χjݜ\’—¬ι&ΰ3JQD"ΜΜK” ΣrDO9EtJΑ²y1Λ*k~f6^OžyΆ€ΰ Ž6Qe’nD›q·ΈΗ&J7Šζ’γ<Όm8Έ&TΚK…¬"ԈpόΨ%�#ΰ₯RwL10`#έUΠͺ£·L΄΅—pItPΨί•q£."C#aζ-κ¬3ΐ\­c,h”Ί6†w@9mΓxZg_Ϊ2ςμΉ,e�‡ωΐΉ|e*Œ‡W^=‡ƒΘσ” RΑn)Ά-3Ν_τ:b±"ξΑθ…τJ£Ž{k=ΒΑˆ/uΆ†‰c’Α’aβόδ`Κ κ ‘[)’₯F#+>goGgΦ18=ΎΜ˜-ή‹νΞXS5ζnϋ«b€Vγ˜κ$h0·(Ή2n\7ƒϋFΒΎ=ϋ’μκμ�Ή|u<^«γξΖI0Š8 σΐΒ«>7£—i?Šhοr‘y�―ŒΪXσau cY893Α‘,Θ›…KgYηkΤ‘(]΅hYcωΉΟmΌ7ξem‡ŠœiΖL€ΗΝvŸIΦu*‰ΝΖ\©½/΅}ιžΣ'?χ³Ώϊθ΅Ρ3aσΑŠ[σΡGSOκ?΄ΊΎό^½Πχ]^ιdt^ΦΠ Ώ'ͺτYo9Άϊ0΅JLAf[gΉ»£�uN΄ΧΧoԞλZ0XΓYsΒnI‚» �‘ ͺ› o`Έε,sξ΅5κ$q]½ύ{±η°K°A»H½λΖ¦[˜£z?ιp·ž’8ς~τφ  αΔυ1dθr dX;'Φπώ΄c°­Ό7Ζ΅EΪΏn¬’FΧΙZ’P26‚]΅ΊzvΑt› η^P[&¬>˜*Ξω«―\3΄–fήjŒgŠ9tψ=Μƒ΄8†žΓυιΨ;ψ)R+™Pζ‹”=Ϊ‰š�#γ&�QφW�;[κasτ]Ÿ~7‚8Œ+{’{αX4ΦƒŠsΞ9"Θ\ϋΪs©O V©Γό‘ ˜Θ1%Έο› šc ξϋ>g�Ώλu{ύκVŽzeͺ¨Σ}S_©ΣMΑν€ρZ 4Y/!H�{ofιyΥwΎu—ͺΊ΅ο{WWUοέκnΙ’- y‘-Ϋx‹˜`BB 3f 扝g Ψ&1!0„-1ž3²ΓγΫ’Z›΅t·ΊΥ­ή»kίχύΦvλήωύή«&<“™δaΔ<θΪ­κ�Ίυέο{ίσžεώηΦ†7Ζ@Ώ Ρi±€Ω[ό½4 F¨'ŠgΓηεzΚ`ας3Ο†,š {Ž„L™(θpΰϋ€‘92²ϋLZ‡(u΅Θ“% žEϋμp/ώ1Ρ©œ{ώ•M.ž๻WœU7’žDΘή ώ2Ί¦§²°(―T4Τ]†Yϋθρ;οψΖOύΤΟM}μcaλ£}DP4ώΆΎάύW_�+P( –θ~ςΠ₯ η~`9»ωυMνU(e§Œπr§H F©IΉΥΐŒ©hDάU$:ν8ƒ"¨£ΓUd5ŒuΚϋ»CGkcΘ.Ο‘$P(ΟΣo…S/\₯ΥAΑ0P«ͺ‘Ο θTFy= ±¨κΉfŽ^scuΨΣƒaOGh#κΕ©ŸŒYΦφΊ.sθλΘ0m―/P“}=4χ ε-}<θζΒDXΈZŽ=’Ν½akбr Κ™½ΗhΐCψ…ρpξΙ/„ΑΑΤ=c@JͺÍ~­Dθ’Γξτ3°&=WYKW]:UΦ�¦ΛΙFkψUΚ:[Z€M5xK4*Θϊ:²”(%λ ύw QbΦ{κόš1φ{J›Ώ¨ΐTl·Y8³~Ζ.ne€u‘iν;ΰΨ9―.:QJ`Μ(°–6fͺΐ›qυ₯Qp‰E’ωhφΜΊ6� •½`Ÿ«‘T·61ˆwivšž‚©&φΆŒ¦Oέμι,4ρfA²Dd†­Ω3³«sΣ°ηuΚaζϊι(+e₯1Cxšφ„Βμ`ΘβLθτ™1�g/ΜZοfΙR“ΑXžŽka0Yɚ7υ>g}iaΚ#Ι,³{ΰϊTΪρ‡»Ρ‰kOΖΜ F§ͺΊ!~goΰΦU¦7`’%·QΫΦ@γφΦyο6ε*ήC@d‡lΞVκΎΧs―ν£ s΄CΌVKYΔν@_c΅‚C]lΞz Έώ³–mπ‡δ<Χ#[Κ5σŒˆτUΜΎλ„ι‡fΝΌ¦ίw�=cΎάί£ŒΈ{Δ q­c“,kύq�-KqΧήύναψέ‡ΒΡγb`? ``�Έ'-t|‡wY΄.Ωf―zzzψ<2>3S\w;YηOŸίχ?�SšžžW/_Žο‘αΑIBΖ±#€\Žš­B³²SXΏu3΄8Ήl 2ˆ£ΜwΣ)š‰Ά5…Χήw_xλ[ίώ‹ίώνο�…ιώΙΖχQόό?ΰHp Ντ ¦/^L}φ˟m=}ϊΜΑ™‘‰C[;›ΗaΜ€+;ΠjKQ€’Ϊ†44 hλω³β‚•–†ι`λΜK·,Λ@ΐΐ{[6 4Ύ :€¬�…Τlc“" ΐ^ Τ3ΉF ±Φ gΝ€Ωž-fγΫΫ)α‘ κ4 Y:g/ΐš²ΌCλΦ­²‡„¨Π΅ΜΞB9?sξLlŽΦΩΪE Λp tμ‰ Π‰κpj%ήΜ)μΞ€£ uς΅10ΰ¬Ε€ ]βWƒžΫ:Qϋε™)'Xέa’Νγždσil༌ήΰ4lξ‰Ο*θ·Ώ―+τξνˆA�1I;;»:£άΪ„N΅μ‚YΚΧΜ6 Šώ^DΎV9σlaΝ �τ{"ž«RŸρ\)Φ{—Ζœ‚\9β~Υ€ΪΑΜzE›₯MxφYb–—ηΈ]Γ};ƒlφΩiGκ™LΎ]+±s‚%κΨ?Λ $pJξ'“aβ_8'Ψ€AXdgΰo‘§,SWsϋρ:fŸeVθ rΰ621ΙςΆD½™_ƒζίκ™ς΄K)– ;QΪί¨@6½±Ή+>“΅ώ9Ξ΄ ‰šκΦ0‚™ώQΘ€Snκ`=Vc?›θ»γϊla�—±'λ¬Ή#₯+§{Ίχ"‹uΒS$dBh·L,Ιμͺ£Œt•ς‘™ρ1t‰}� Ζ-νƒ6ΟΟU€²-]Λ@,υCugdε5¦3­Q†·Ξm)Cτ2*ΰ+Ψ/Ιη�©s�P.,1’QD΄3ښό< @f^’¬»ζ2#-u=d-n΅@IDAT]ο€T#χh*e1SΑyΓ.h=Ηϊ\‚~‘₯€|hϋ=―χΚDœΐ8‚ϋƒ|}eΏ―Ÿƒ^lΆςαΏ•{eΠuρŒx­2q–=cΪ(Ωqδ#ώi‘Ι~΄ € "θcͺ3υ3<‹Κ\Ρ7)Wφˆ’•d–[ψ°~�@ŸΙ{g°ωȐΜWΛHΠρœ;¬EWWG葌p™έΘπ(tΧi<™XkΗ’IY>“@r IWʐœ_VΖ(ΏΕ6¨s"+9°”³€?Vξ=Όr±'Οͺξσδ?ΪM'?PVU»'*v‡ΕΉΕ΄Δζ"*‡ Y;”{ΈTθ*d³x·U߁££<Π?ΔA€X²Ύ6τ€Nίqδ0£An‰WΫ»:‘’Ο„ΟόΡ�ž8}=d@_₯ ν’)0ΐΪ˜Uθ. xlpRΗαm�₯½©žξ½‡C{CUh£~²²Aš τ³Jυ4Ωμ„0xΉMƒšτδq!Ζ~v8$φP(‚ς’―Uζ:Aκ΅—Ÿu^ £S‹α‰gž%kHˆKV…)ΎŸͺ€Φ˜§&‹¦‰�Ι<Ž„ΚΩ@!IP₯3‘…B₯αE§Ξ C¬β5¬«ηχuτπPβ”•-ίtP©«ψUΌά\Ψ ξ_@ΖΛ?―Γ―ΆΐΡ°ϊ ›κ³ Ō… „χ¦‘a6}TšE'†ε(*ο˟ΨΔΨςPH+B#Τjq²+Ε ·ƒμ΅τj¨μΙ‘–‚ι ν˜ΥβοEΗDš„b7νz΅φή “ΐη Αϋ d0l —ΖˆϊŒ•M]4Έη{ώliό&FCF` +£yίέ{ χΜΧγ>y^Y"ql$`Tͺ–’œ›ΥΙώ0qν2›i4qΥΘF0ΰ ΥΠxQ0gcηΟ6ͺ|UΰŒι€-aӌΖπLi€”χ�ΆΡwu,”� !σίΕ—u±Ή’™>ΛbŸeΣ²2JHκZ+CΟώ�Π�ΡͺΉmzqΨΟΒ>m4„΄όΒ> :9»10XŠAϋ‘££38t >Ιτd25œΣ:κ<'ΒSOη.‘γ^‘G°Œ@Ό�^GŽμζΫτgeΉ‘ž:υn˜™εΜgτYs:^<££L•[uΚς2ύΠέ{¨'~ΰήπΰ›ίH^œΰΰ99σμSαΚε‹8:ρ¬¦ΠΥžEύ cν&Ώu₯?SψΟ�6�s₯^ΆΙ�eAm_YMΣ€+œω·ΏιM€£3ρ³μ%xΉΙYš"@Ϋ’―ΝJθιι‰I5tK*τ"ΊZΫ›£$Μυ·χŒsξcΗ455Δ@ΨϋωΓ4=vύΦΘ,o�ΑH`I3%d:46™t6΅γ`Η³oίυqŠύH£³dXW ^ŠΊs{g_)υ…2ജ˜αF1θDΑή&0pκV&³ΕFΡ†°§ϊVΕ΅ρ™^af°φκa_+°ΓΜ<—P*‡²Œf‚qzVa žΙ°9€~§‚ς²*lD} .qφτA6ΡφS²9q%6ά†³ΤΛ”˜™ύ·Δ²Ž³ZG/,zΘΒ\ΜFp]φΙό ,ΦdueŠžŒdφCΤΫhm M1ύek6γz]ί—Ν.ΗR‡μϊzΡΥ€SΪοϊ.k+ΌceŠίίX!@v=‘Λ]|!'[xοΚ—ϊΨ ·Ώ8ϋ@–ˆp�#˜ °]σUzRdρΓ*xŸίdΖvSŽSΨ§˜(ΰΝ”;uθΉF††βωΉΥ?B3i:θ žΥ›Ψ”ݝΫ,τ€…MšΧρ)6yύl_�‹:Ρϋ6ρΰΏ‹>ε Ψ ŸΥ}ρ™lŽj9�>ΪmΏx‹ρ μΣ ͺφ+΅55_ό�αΛν½wρ˜Τ›W_+V ž­ΏwϊMt“7 …²�σΗΎλδεσΧΏgfqω=4 Ϊ—‘λoE©©j₯₯+ Ε"… Γ#šŒΕ‰²ΚE'YφΑ§ΞΛΓ?Μy‘ζ?c[hY4O¬‡)ΠΧΩΊ:ΙΤγΔ΄v΄…‘Απ~�σαϊέΩAŸΛ0@%1’Γ‰βΟ!udRL©υ�δ›ψ~+τψƒϋ{BO[cxγ›ήZzl0 pf$TΦ·„TSΪΝ₯‚�μrΏ6©αρ)W ϋπ'Ύ .P”yκί&―ΌHf“ωΓM­a5—?�ΙO„[ƒ3�|˜[ΕA©$k ²Ά "0 U:WΛ`ΤΞΓ³:cΑ±°#:(5½<6 Γ‘•q`Pβ:ŠŠͺΘTNΎT\–-lΌjμ5ͺ*ιΨ ‰‡3ΠςύηΘΞΐ¨ΜγΟq<|P뀋ΌͺμΝbψyεdδττDΕ5N:d¬@ό―iπ―‚—–™B)Χσ<]ν Π6xp–ψw �HK³ξ™daP“"@Χ±‹u‘Ρ1%γ’ [@ΉΚΤΐL€-°2;‚“‹AE₯EVˆ†hΑώ€SB"vΘ֚΄9γXϊX-ΐ@άgΠ₯%:™s€ 6Nͺ¬oG>οΖz–bh ΜbΎ~‡™€žlˆhϊ.Χ4ƒQ ΐTUΗ8/œ‚α‘μΞ-΅ϊ/]€^;Ν¬α!¨~Оiž4χ>:‹ΫŽXδ;Pav Τ ŽmΡΨS@ͺœΑθΈpCeͺAγ0NbŠσd³PkjΑr #d™α~kœ�³γ#Ι�ά ά'ΈξQ4π\CgPΰ ΚŽKkkKθδœmΕ΅~Ό ΠΞ&|™œYοΗΖYΦαz ·2j••;3LφμΘ“Νnm«@¨ΐω(βχš‘!·Υ©ΌqγVψςWΎ^87@Ήƒ Ξ#ύ8ΚΞμE±Ki‰ Š|?Γ}Υ‘¨o€ )βmpν9‰ ‘λΐϋt„oY1ƒχΏ„³[]ƒώ8Έ/άϋ†yΘ σύ6F²z~�_Ήͺ¦qκ^:ž{Η𠍏Ž@cŸ&Δ9Πq!۟§―Ε&2m½£}BtΝešΑΡyχ,Dΐ ω΅©:O*i<7Θ™υ•Ϋ¬kŸm¦Ζ€"…~κ‹ŽM#™V~%Ɍ1�xZ끃‡"+aœ,XSSλΒυ«WqVΘ0P$}ΉNώ°x₯΄YΟ|ΤΕ8«‚{ίRξS0ΝZX›3κπI…]Z₯»ψββB&Ή{©ΎΊς‰#G=ροώφ‹}ί―ς¨z|Ψ�«°°P{ϊτc�ϊΕ—�>ό5/œ />ύlX€ mY‡ŽOΙ’Ψ|² |rΞ- e9ίwtέ*qΉ4ԝ-³£ΘŽΌΟΖ34ΧWGfΣδδ%de‘°fŠΈgGXvOg{X€α‘Ί«ž@Δq©“£œ1²n‚l5ηάζrθ(δ-Žšό[“aΖ­F_οίΟTz δ`:ΠCΌσδέΧ¦§'�Ώεοψψϋώ§Ÿ8�W΅VήMα,ΡNχlΩ—?χ{UŸώμί1ΏΆ|(»ΉέA–ωξ�ςτ‰d‘€žΞρε Ν”Ώ W)l„ϊ|°€Έ@φ]š�ηΧ†]t΄ZΫ¦ κx·Φ̘S ΪχξA? „DS?¬ ςΪwD+!0εQ―*}LFq-Όήΰπ ΅β;±ŽίyφAHμηΉK(Ρ[‹€γ]w‡™7L3Λ뜳₯x^jiΪ‡=ΑyPΔΆΰΘ―cwc£^l•“pV‘UϋχΘJŠΑ‘z‚{“Ρ@ΨUŸC†cŠΟ5xUηιΨk—;N&ΰοκ2υŒe…s€Vσ°uψAweVΆnKΡ‘N`*eδ3„}ͺ„Mf}vςΨΖueBU‡Φn›ΪUΖIκƒπ.ΨΣ°ρΌΟ@ŸKΦίςΖς K7ΛβV P''–聰Ωgs3€\œ_υ…λμwd ²² όΝ΄»:κQTυ” ’l A±jόͺ-φ̟Λ@πxmb0Ηις¬ΈfZŽŽ―“©b`\ˆΰtΛ ά+ο_ίΖ5“ ˜ΐN•’3-‘ΘpΐdΦ‘Έ©#[-;¬ͺΊ6{e‘†Σμ ’ηψ~m›λoVzr|„χ,πœΘ*χc―£5@υ‰ΜΝG»dς€­GB3gS°TΥ< £,Λΐ‚ ‰Ÿ{ηpΏ–Υ Ζ†€ΌvζΧ'3ΙΔx‘γ±ΐ±dƒϋps/΅NΘq:RlπΛη φF ZΩγ:²v°yκd{Ερ±θ6}“Υ•bŸ˜ν6 Αg›4²<Γ>ah>φΐ‚΅Rφω•(γŽtVvέsύ?Ωu2�¬«e›ϊ2‚E Θs`|yV=?ϊEP‘8JΡ»―²ZvΠ%Κƒo£H‘σϊ‘κΧΕ—gΖ$“Ν³θHƒoΛ”Kύζ±Ύ‚TϊZώ…nŠΎΊl@ΟT¨0>4€nY½½m0χκc’qG†Π‘“χ0ρ€=ξΓόΨ`μΡΨٍο[μ_Q‚ΎXΎΞ•™΅΄FΟ₯!ΐ…Ή(3LYbτ)Μβό”MŽW)+Ξ”Χ¦ΐ…uX/Κb` 2ly>ν«e­ϊt¨Έη<I2όUφΧoΚ°6&ϋΖ—,!uγ]Yγΐλ+”Z?vηΙΧ<ρΓ�όGΟφτάΉΒΩQΎϊϊ&]WΔϋ›τξΎΙnλΤ©Bjk췚?ϋ™_�σσΛ?RΧ�Ή΅Β *#8¦ζ�C…©ŒA ŠNE3]('S^ τE³œO?υ$ΞH2΄42ξξ5χ„ηΎρ ‡ Z ²‰Lυ‘ΎΎ h–΅½«#Œ@[ό4έ³§‘†₯+[Q¦8Α%3›(Κ%2"ϊν­ α…Π@Ά³§“q9tπ=ΖHΖ",f2O―uN¨©x™XCcόρL‰Κ8Τ³(*2ά­=τ5ΐIŒ–†ς…’ρ=|x(€HK‹ulΠ ŸΖgWΓοόΦo†Ήl2ŒŒΞ…k·ΖΙ(R—ˆΏΖ˜°< ²Œΐu{“,+¨#ެ?Σ‰Ρ8«d5> ‚tM/NΡ\ΦΠ;Φψ@™)Q!ϋΗG1λiχcλΠν+(γK €):hv$�θόωΉ~–χ Qφ±+2?7άMσ{f8F"©ξ‘e‘’ε΅‘φ±φ|:F€H§3li5n‘ŽΡ΅oƒ6^+`ΐ½ „Π{νJ²­v^¦±Τ± .ΓhΜ_wqΨ ΰJͺlxφΈU쉔λ]Γ­Υy~n0™bD�(Χ-ΗI!h₯3»¦# "ΗΤQ{Ν}ΗC’R‡έΕ‰0Χ�2NN‹κ=Υ�θhc”$(ΣIZ˜Ÿ‰NBKΟQφ„NΤσ¬ŽkΟ±Xφpσό£‘~šF`šœ~ιFψβ—Ÿΰ ΰόΡGΓZΑdΜκΨ5πGΙμ έΌΛlΕύΩ4TŠπ:,SUJΠΈŸŽΠ3Œ9œŠγό"uΉ\Z ΰ4 bm‹Ξ02ΐ5•‰b mgQΗ@η4žΕ(5ˆvt ‘€ΟΓΐ™υΜjηtά₯`žΈσH< vJ�-`ƒ$ΛξΫ§* aΔ1e Ž›Ώγm-bμ€Ψθ}s΄ήΡ#Ηp’Ι€ΨΨπftdœlΡf8}ϊ,ύ?ž#8ΐ‘δάιx€Ιδδ r–Sβ!=aΐ…Ωy3ςΚͺN―ΞH+]οΝ¨­‘­1’£ξ:”pΖRT³ξ54γZaDjvg zu1έΫΧŽ»ƒZω“EΆN•Œ’ώώ[”3΅rήrαΟΎςΞ₯e3 8͎;ΓΑ‹YξL‡/{»ΡŒ'e-RC9#–9Θ²”Φ-eqχ9']αΥΉ§ =2ύ=ΔΑ²fVͺ lGWCΨ³·;ξ›NXgΧ¨ψcΘ4%?djΝ IožF6Vιj}ΎŽŸϊΑΡTκkŒ}eMOΦΨi8�γ%;φ›)·G χ@£ξ/ΟX1p²o;<ŸA4ŽυκάμΜ…ϊϊκΗξ8|δ±ίώμΟ}Qω.Τ?υγώ�―Gωhir±ξ§&GF>ϊυ/ό§tmcS˜d΄YΩΓφXΒ580f)‡ΩeO-Ɉςͺ+₯ΏJ35œΨθ Ύ6ΎšΩ}0�:ZΓ;ήωΞ08p3Œ §c¬ΊZ¦” ‰ο‰.5ΧRτ! G />χ<μϊ–πσ]t‰E΅εdCrw‘“X(kqβKΊ¬JzAγHεF‡ϊΓΛ/žC—μ†w>ό�_ύ₯O�ΙG8‹Ε:’Ώμ { ¬§ΣΏφ±_�?υβιžαα±{6Χ²―t„Δή±ŸΡ�c3-E0ΩM3λΪ•Υςͺe‹ΎΛš)° Ϊmν‹kbgΠς`³d'/Ψ―Δ¦œŽ΄ΆΌMΏI _Fc9 ‚Va6%΄-ΚϋA~>GŸ)m†™ύρž΄Κ�vΣ³#o]lςLŸ&²;σi²βŽ?$hvΝωθkπ,�χmhyšr,` 8‘=ρ¬ΚŽπτ»LΊJk{}―`Ή:R¦Α½ΆΘ{Q7θΫZΫX€ΠΛΐ±ά"^ηzEφM6°`¬aΡΦ Άως«gFB»ζώ¬σ™ž/hοEy2Σ�ρ\π—Έ~&C,₯υη6 Ά?lYϚ>‹ίΧoq8�Ό΄Kθ2?wQ‚ςŽ·Ύώf+ϊ`’Lζj―wœ8= °cΩΎ1LS6‰_Uγ;xί‚hνxpaZΡ‰™ς=ΞBŽrVK`r€LΛs3| „Ÿεόr{œ‡ηq†’ \˜ZXW�^Γ.!‹$‰άΫυxƐwΞ—~w” ˆkRΤ ¬rΛB’ό»‰Aύ{}*™!>·ϊ@Ν^―.�,υ΅Ωtλ4"ŠΞΟ,:\ΥΌ‡λΘSO·‹q+ΑΨ¦ΏΔΚΰ%�‰1ΰσJAΤ½g{0hkΎ))±kχβΒL(,δ‘έCyμΨΗ4†¨λΉ­!φ–X ΣCY .§aΦ@s»‘œŠeΘ΅†3‚\― 6‚JίΪι ½κa&l#7³WΟΔΟ«„^Ή+ŽΏ*ƒΆΌ%θ€άUΡΐK£•Ό!­%[—ƒcPZ‚LΰΛќ κ"“>τ΄vhάι”γ1α&JknτχGΓ¬Œ6ΝlP.@™ŒΞC ―σbpD p4ήόLΉς₯γ?σ₯sαΏgDΧOg!χU]1o°`Όž­.ΘLΉxωε°§«;Rlm,%u>•€ίε(f©tδu,§›ζžt6ΝΪΛψΐ )d[K7 ”rf•ƒ}^N=φLόΉˆtι‚7ςλ�u@klΌίEΞ—¦Ο“CΡΜΞ@ƒ&@ γ9_ž’α:&CPž Ψ‹χnΦ­­}OθμeΠgyv†LΓάTψΪW¨7~CnΓΆΎψ°—ZilvμΨρpΰΨaΚ�’ωŸ‰ 'Ÿ₯B§ƒs₯³Ÿaέ+hΪεΏe萭ΒTaΧωΎg αΡy(k.23ζΉο γ@–ρC›Ϊ³šώ'yΦ WŸ/#Œ cJψ:ΑHΊΪΠQθΪ$έΤvΆp―7oτGGΡ…ςœκΚτq½μ­ΰΛϋ"‚ˆςayRτšψVμΓ%z?ΔΪtΓbΞΪ&zO†A©ε'“ΥM―_[Zxύ>ω£wνmϊBG{Χγ?ϊέG~υΧηΟ¬‘aν£ΙμΘkφ½©ϋ‡>πί»4Ώ^e_ιŸ<ήό�χΠuΎ%Rά_Ύp1 ΡQ~œυš‘΅ƒ3˜JΔ  wS4²Dύz�f₯ dεž^jΝ{ϊxφͺπžΏχpxφΩ§ΓΨτWBΙ¦™Ξ^tL }Έ²fΨΟZο₯‰έ›ίώΆpϊω§F9[¬?[§!γ* v L‘Œ°Fμ–6(°4τ£7€#f›9ed•₯‘[Z2=5^>ώίόΔ‡οϋ�#Ώqυ]�ƒΣœ5?ςΏωΒYΗΐΜ–χ;ί|ΟΙk7δμ(―�8Œ.νΘ—”Φ�5±„BέQΚ^ψ_5ά„‹Γ­'w±clςΣΨ —OV&œF’]©ΗΆΪ³Ε kω«D7ՐY3pρ|Ι(2K„±f†U:Όu2εqδΓ€v_Ο>�Ι:’§¦ ‡;Ϊ΄ζޟ~ιKα©o<όν2u’ŽΰFΒΤψ%|”\![‚'gΣΧΐhSͺΚ .Ψgν_Pf±­+7P΄ζ^ 8 ΩlΉAΏυ«>‚ΑKqΚ†qε%;ψ\Γ Ζ²ŸΛ¬·₯>6idU`‡έ sΨΡ9b6£ˆά £�}7³,X3¦0@ΚΘ~»žκOυΊ#ςb·{Ω”¬±©χλ¦Ι²³‘Ύ΅&tw·Q‡hσP€t0qšI6οSxζZΐΑCφSZΩ�^ΏΔtjςΉ₯I€ι|"PUϊ3u†:"AŽ[ƒτλAί;ϊxCφΰΎΊXΐC[ΎΑ“/“1G֝-¨ώΫg˜£ω’ϊWκ{Q•W޽–}ν א]°ΞΊ"^n±φJp6°°YΈ/τ­v ψk―ƒύMφΚ€ŠφΔ ό>G Ι“YΎW‚.Ϋ`ΞP’ͺ?c¦VPx–ϊμ&εΌW{o�™<οίΝSχμλΟ1Υ;ΪR]™ZJ,7ha„s >e­ao?χJC-£=κ"Γj Ή2QΒ"Π‘C’ƒΩΠ ‹N–ΎVϊN¬]±–]V'ϊŸŸf‰›κK9‘Α{”9’|²<Θ%ΆšuΦ―㿠ܚΌ°―Ρ:%X +ΫqΔλ₯.y>KP Οώo!Λe»d€Ή'k�} LΡΗcΕŽ„ ψΖςΎi‹UUtG MŽ;»‹ώHθΨ’Β–zT?ϋ‡nŸΟ†ΗN=žξr" Ί’9Κ—ΰGœlΔsͺ;₯Δω½]Ξ€ΰ¦{?š΅•­Bo ΎΨL‚g΍ΥΦ�_₯š½xηφΖΦ۞{φ‰‘χΎν‹θͺ�ύΤ©?}κΑ߳ʞ@%|υυΝ°E‰ύfΈ“o�{(ζkώεχΏλαΛ·†~0›Lί›�mA�Q‚ΠC ±¦šYU—Τ%wš΅vv(τ+Φέ’ΡΒΉκΐθιΨ_Ώ~ΪέΞ¨@2› „ρΪ;ΈΙΠΩi½Zο†4σCqτ,phμ?Ύ½¦5άϊυίζΒΠίq|4ΥdSpΩc6 �ξ9˜e(Τ ΐΜ†Ϊσ&š°υνΫڎήΙ›i|ΓA/`³ξ7‹Ό;²IΦDΧ6ϋlεu²˜v2ί SΐdBJQ�¬λ]αuχέM­ρd8ώL\�e‚„ΩΉιπβωηώζjšΡ-G9Λ€Oš–‡άyς.ŽϋΟ=Ζ=R―‹μΦα,f‘ΑβT δ9p ‡—-Π‘ζ‡Θš%>…@G‹i΅:\)dΞΜW�xŸΐŒλ`Σ7υ¦cL£“Ξω­DG5ΤΡΰnblœŒγdTU–X›ΉαΠςφΓθννε^Θκ²>fœ Μr˜AuJπ΄•kχΞ΅”2Ίΰ’`ΟνcΆHG7e¬₯tnΧμύ_š*ΆΧ—Ώdbφφ_ο_ΎσŽƒ<άϋ™‹Oριk―χΚw‰dύW^θ—τεgNύ½ίώτ‡F‡¦YΓ½‡�#wΑώΈσχi66Kc΄špίƒίΊ&zΓιN‡…³ 1{›@ aρ\8ΚfΡΆwΙΒhzθ]ο ½υνΘ|Jσψ+=G^δ9Υ-E°L]θŸΫηΑ3jΝμΨo|σ›cFΠΰ8A3ΟuΦΐ( ͺ~χ ½…PΗύͺDΗΤcsl fΟ ›ΐn¨gΠ-νέ”ΐ\ΊσΤΧ�쏏M�#€ƒŸdIώ«ΜΧεεWšή|τθ»fηζήW’)Ώ?C4d³BiλΪž-oΫEO[²–Lτœͺ{jV�Ψ-ΛTJΠ#5M Θ#ΩO@<›*–Ω˜)Ξq¦MΜ© wΈζc‚-Γhδ3ŠTbcΦFPΊ‚ Ήžλ΄656Υ†)JΤΪψS?Ί)oZη,]<σ"²” 7Ξ]%(¦οAS g3ΏΊn _‰:ΡΒΝ”)·‘]ˆŽRN=ί@ΰQz4CκJΟN”CΎ[ΞxMί“#€΄dBφa;TŽP?±ρ¬Ώ#€fΒ‘Ϋsψπ1dœ1Ž—―ΕL·λeR’··/\Ίt@}Ž}§Q^ύjVέψέτ›“S€sΗΜ<λ¦mτ<:©D;j–z‘RŒyϊ±$mΨ¬έ$p/CΧϋ„J««Λ`΅tα›”3Ύv:΅d+bƒ9Ÿ±ϋχΒYXdVνε21=AIUq‚rΊΊ;ƒ d‚F’–hΘ¬Μ�@°έϊύ‘qցu$ψ’N-Λ!Ν:Ι„(f€Ω+ώ­=ψW7ͺŸ]gu’τ}ώύŸY[εb5?ŠΟ1φΩ9Uθ^―³DgώیΉώ‡=?Άixh©@Κχσήλ$kΑΖ΄�Χ«jΘpŠΔ,7η4Ε΄›Œτ}Φ@ΠFbƒd t'|:@ϋΦfΐυFXP$wb J»δs-ΞΣH–³zθŽ;b@«O° –.Τ„Cϋ;πs PΝΦ»ηU‘—^KΚΣ kl@―ŸjΏK<ΏmŒjllο [4\–)ΰΈf± mω.³}YϊH‚k‚fκ”%­έ”3ΝR5uG% ϋNφ4…ΞUΖ¦¦—θ‡ΕZ ³�€ί-ΝL4ΒO2ΞqŸ‚-id£ζ•ηΘR^εΞλ{F₯{θθλaSέ·2TœΐzVP§Πυ•$Aίτc<γ2+ΆΈ&· CίL™ μ€3�<πQLςωl‚~ξmΰ`@* ϋc€mv‰eb%\ΜQά^S¦‡v;K&ΡbΝ,EΆ€‘r(Ξ‘£)mlm’Βe33ɚΠζ“=·–`�°)7Ϊ²9Ζυ^»ύ­JlFKυkzl °Jπݢ熴xFžŠ�γ³s.£“­œλ pΩͺΓμΘ5τ"ΆŽ·ηψΟφΆΝͺυί賃^Ό1Ά“Œέ S364%ήα2&ΘΤT₯κO‘₯§yŒ”8ή@d΅hCL²₯θoβ(xΑ/GHkSό\CuΛ*RLtΝΙ—Uχ!γ}λKλoϋωω³—>Υτˏ}ςγώΓ�“O†‡±^ρΘϊ8―ΎώζWΰUΰΰ�cΝϞ-€G_όΕξ‡ξ8ρ!\©ο―nmΟHέ]ƒ^˜“Ώh6_gt—ls _υκD�ΝΈΖ '!IŸΞOThΝdaο»�~(ήψGNnjΊή=4`# PΒl*uyΛl4ACYΧN€†ώλWAΖ§Q@«ϋ…0±H†œZρ NJΗ{Ρ ,Φ%£1"i%(Ακ:Ίρ£Θ Ί +hRγlφ$Κo+jΜ”A» odπ XΎΕWŸνΐ@ΊΣ#Οιώ<65D)Ž«/ƒ Θh ΗKcΎΝ΅D‚K1ςv—Z)μο–ΐ[―YΒzι,ψ" € Ζ(=ΧΙΓΠhΎνΡoIϋβzIœ�Ξ.hΒύΠP‘ψΡl2ƒ#+³€ Πh:β:[e &ωr�tlΦΉί$Š4–žM±Άά5XY$»Μ½•γ„*ώnQ¦ Uς>QpλΧZ:qr”=L"< 2h½ ΖΙη5KWN fΠι‹ šζ6Ί` o\ω^»οΗr =lΦ�ή܏½bΦ‹©7 ΠCZ»JΈ– §„™ΟWΧQ‡έl¨kcνΎ†Q§“να{6nά₯αS-}šOΆΩφz{xμρ―€ξ†žž6Ξχƒ|ŒŽΡ�c€}*}P1ΧΧupΉ�ΐ€Ή\Ι=χgρΕcdXCG59*s+EYςR‰ƒVA&Υ}χάj,cΆƒg’ᙬ’ΎΤρ—•”Ϋx¦Ϊ™΅Ύ@Ή)²«Υ¬‰½l�θZΫO‘œ~-8Γ$vUƒqά`UyCxώΟΛ.~ύlο;ζœΗΒ+Tb\o~WηΗ.Χ8_λq8IΦ€*Ή™WΗ*ΊGΖ­fŽͺ *ΧWgγ9ΡΩΚm rP‡³oY)GΏA7D^\Ÿσηι«243+ΤυΤ—i’·ΐψΦΆπΐύo GγήvΓΘ­ajΉ[pfuκ6 J Ύ=W΅1™24tο^!ˆ’Ε27˜€¬ΦΩήbόϋR@/ΩΈQΉζ-\π Q}Ω ΐΆL―]Αύ·AΞ"ΩέΩ…‹α�εKΡ‰[ΰh‡m%•HΡsuS'tΓρ,Ϊ“‘φR%΄[ƒHA†l[[5τπ@ E‡’kΑ%Φήρ7¬­‰CCΈΨ%έ ”υ1;΅u3Α}:’@­€€.W·Ί8υΎ‘ρΙwύΘδΉΎžσkΘΫWy��kΜΟ8-Ώφ˟όW“£γοι=΄Ÿs²ΣμΠ=iδΩMΎdp£b²ˆmΫ;ΫCςόΕ(Λh7t2αvΖυ4p�i¨ ϋŽ‚ Cηr‚†gŠ>9§±θaΤ—λl=Ά/u¨―ΫηΒ“ασ+ŸΧ�^ε>φ…Μρcαό‹gΘ~A{F^8œήΗΖZΑX™!3Β=―½ ‰Ύ8œfwΓΰ`L,6,Kΐ΅οΐATnIεoxό‹ŸiΰΧ‰$ώΛΧ#PλΦ�ύ'χΌύuGΏmvjα{Κ+[ξ©λθN$)°ΡZ€aγό«o<YiΧˆ2,d©š"RΓcΩ 8ΝYΠ5«˜GΧΒ†J¨­sήΧ‘šmrH³gu˜«ΥΘ¦φFŸ4‚›\=…Στψ±O‰Yη‘‘!X“Pε―3Α†σI0ρ ςŸ#tœ­Α[^=:£ͺZVA$ŸWʞΉ―‚ –#YBΗ·B ΠYYά%θ6λ͎ρΎb&<ΝΩX+ξWˆ³7‰ Π |m^ιΉw΄iiχ jΰƒ5 M]Υα5wήήύΞw”·Β.:Ύόg_FwβψO­†—^z)ŒŒ¨GΛ"υZΚΌ#wIlVεž5ηDDζΏ V§&f9 ΪŒb0u/`Ό œΰ…@Ζ* 7ηΧζCswS8rˆ~τp¨kπΰή&ρ}nάμGš΄χi@\zuvΖ΅―…ηt™Γ°aΊχμ‘It ΊvY„’ŽήY†₯3Ώ1C@εΛ€εκ 흁œΊΤι0lλ‹ ρ3ΧΡ— €Œ§Α=ΟaΏύ‰™r§Ϊψ―τpa83fΒ­�.°?›Œϊ~υukΫ‚%|xŽΈ­–€l+zN’š―ΝUH“’ώ|b)`ŽTοJYjftνϋTBoή”¦ΦuοΎήπΊϋ}ένθ;AΠΜOq�(%™c0ŒFBVί{aΛR&•Ψ― λPӁ}ΰŒlPŸ‚εRφ9±#ϋ1­w•4βΝ@o/…E(π‘¬HκΚμΠί‡QŸ”S oΪ06_ŽΖΘ0½θ/ρζdΫϋ¨ φ‘c7W&1μψΘΨβΚήτλ6Ω³RΚδM,p^vv–u-Y#@]|G+Κo\gB .Aμ}=φL{n’©"ΟΘml«₯ϊm¬jτ½,=C²ΛΈίλΰ[jͺŽsίν§c"gG°9•=“)ˆΔ� `₯ewHΠ”žΥœ‰βD' iΟwΠk^O}iΩͺ,’΄qό£2RA‹(»φ|p ŽU’:Φ₯λlx6A•-Ι@("Χ€&v́ͺeƒL;Η�ι΄e¨AυCΧΙDšσ\(P>w‡iG’ε˜Π8cX&ΖG@ΗβLϋ&ΡΘ|@ΩλΘ»_ξ‹,Απ+!S\›,L“ΕΉΡψ>k­”Ρ²Ν~‹ΘW΄ϊοbύ"e›bm,Eω`%β{ ΰa hΘβχωœbcIΦ•}x-7ˆ0¨Τ˜ XC¬cΈ ]jάFφShU<;1Ξ^ΡΔh~•`o”q›k8”;μ‡Yw2ΦeΘ°¬"ιςα18θ‘M“―g½$ΏμRB#›πΠΎ=¬)Θ<ΩsΙ ϋφˆMίΦθτ\ΒΊ•Ί/d@΄ʈFΨϋ4Θ0sΝΕ΅τ{ρπqŸe2‘ Ν(ϋΎΨμ ‡fqi6ώΫχšuΤΡR4V¦0¦ :svH·n΄ πΝλhδψsεΙ࣊ZV3hΦ̚Ρ9|θœΰα"Lƒ'{ =AΦGΡ}τεύ+ ξOμαΫΛΗρ€Βρo�“·rLX(–aXƒ병₯’³3ˆ72ŠΡζ¦όΎ#Ά._x)τξk ΗͺLκH3VΆ…ΐηώƒ/{ @¨g%±OΚΤθx’fϋIδŸQZŒέΜ$+ΙVMσ¬ J₯:iπ6Δώ,ΗXχ@Κ�.μ„H3ή―SVbζ$Σ@¦„™ΜΞ·Yš¨^9½%qΈŽτlƒή%šΫ­ω2ΰp�Eš½y‹ί%#Η^θψΕ’0�!ϋb`h0~OΠαΘα#1š%{–%¨Άsϋ₯^‹ΠΙΝ–ΘφI& ©γGΖςΘSΊ{ €ΞΊY$Ο£γl=ΌŸ@ ³Ή€H5ΥϋψΜ|&ί~Λ•›Χξ~ψ‘Χόϋ§žzδ—ήψΖ›ϊώσλ?χ£ΗΤ>1:xγ‘wίPΠC*KOJ€΄ `J{]εώRά_\n p―ˆ-b’Ύ$έ‘K=OΝy] -”–?q’ΐLZͺc-‹}μn�§ π)_Ύ΄ρ₯γ*¨0΄Ρpλαοόn—Χ„Ο|ϊι»ψΘρ10rΟν„Ύ†~kΎλxF½’³αc 9ΊΖb­ή�υ«/`WU–½…C�_Ύy€|ιGώρΙΟ}ώσΏΩΠΦvoηΡ£ΨR³½Δ¬ΧSΩΨΦFυ,Β&ηΟp‹η7舺'^‘M σ >Υ θιmΨMΦ+…\y>ΛΡλU‚r(DuœεIL³re\S'Φ23©ΤΥΘεύχάΕάyF‚ε‘�ΙϊΑZ=υΜ7e£Ρ׈i2νΝΡ^oθ$kmœJF@›e:Έ:Πμw>(ϋp­έ{,˜8πεΩ‘½£¬Ή?σκ0Α K ΤΣκ~€sŽNGGiuΧ½BΙ†ƒ‡ϋΨ£&܌r|xΗ·~kθΐ§Xĝ#3ύτϋα™gŸ 4�­€™!HΡΡΡΞ^δεȊ3ύ? ΐZμ˜t*‹ξ±χe λ§mΰhWUͺ±4’,β:vΣ^Y$4ύ˜o±¦ŽφΌκ:2R_g‡΅T°L$Ρ)ά<φ‡2bY“b½²BЌ *>ϋ2χn0ΰΨNz•-Μ…·ΎώΠ πύΒγ_aMfΒqτR]S_<e–vΚ4[‹L•ΐv*Ci© ^dΑσZdπLI »+$jγώΩ47ΑϊαœσΥύ彌aί’�τδ8=rϊaEόuτ„Bν6₯L Ό?;εΉB;£cYg€(υŽ=[τ‹ύ{‘e*ΠYLšΘUkŸΠ!›€“›€βφαpΤ#Ρητ~8§ΡάI|ωΣXF‹όdh�θγ[}“γγ�άOδJkkΫgOϊΓ?|πΑο^Boz€_}ύ ­šΰΥΧνΐ@–ώκΗ~όΰ#ό…Od··ί]]ί–¨ΐω_G d9Ԝ34w %^$Κ¨˜Ρ©Ϊβ@­£Έ2ΤmΫ`M΄΄ΆAcύ>E”;Vr;ͺ[χ“@ρ qh¨adrw�ΠεWŽγWbYBϊΆw�=ŒEIVM¨ †ΐμτ?A ˜qͺ—P�:M»ηoo¬SAP«±�"{%ͺνg`α0F Ώ ij£λΤ‚lφ©\E 8 †R(r4u|Ύh 6 ΰUΎ_₯Žϊήώ—―„ΗŸ~ 9leˆξRμZ»M³ΈG’`§Šώ ι4”1·Κ,£Pΐ9Φ°«L"jΞ5cMŠΧ¦)K"1Cΰϊ²ξ%D ¨œ/”1κ*EP¬C£SŸLƒ\Ώ―�0ρšRWΉοgPf"ΦhͺθΰڈΟ:B«t)›α†F‡@₯θLθυ]ŽuŠNet@pvςΕLTžϋ!.Γ9πΧtͺ 8‰6b2#―ƒ`χ}B™u^^˜%;2ΛΊγόΒ8ΨPAςή"ΞηΡi%ϋ…3¨C΅½Mp)‰ƒXΧ}0”Ρσ ;=HŸ˜ %+νmhλ‘σ;Χ$˜—%3@¬©5dξ‘ΐΜι|f5uΝΕϋεiγWΏp�:[ΕζH> ¬τά]©kό―#©HΗςΠ+•&¨«Š‘[€ sŒΘ£qΟ @ΦεSΌGgΧ •€ƒύΛCΙ“ž* ;Y³vλΤΥΊMι2dYιινΔBUgδ“Zι*\…Ό“ ΰ+Ά1M­ ί8φ<{416² jς8:™μΟΙZβg1Nʝ|FΟ›χΙχ™a6s£ƒΰΪΘNρω­ΉΧpyηΙzΝ‡9ΞϋΕ»¦Χ¨Ήgν'‘ƒžδ:² ΆΦ`_ΰ,Ί¦5u:+Πfq,t¨!εΟ΍σͺ?Ξήςηpƒυζ~•)‘>‡FT―Άœ΅0Rήά/›1mσY‘‰2ˆ5Έ0θ‰|ήd€‘E&jθ)²‘-²u”g+/ΞM„ž{ §†�ΜϋF§[Pd‚ΰh‡jwwOhλ’Y>gt/ΞΝ‡±ΡΡ024гNŸΨNΌχΒΉ=l@IDAT3g)A"ΐf±6p 2€₯ijΰ]„%HΌΦ7Β¦μA3Tο:€3εu“,0>Ο…Γ‡³oζΡ,F)™bG‚,…6P—[¨$ΐ’%σ#[ΗΉεNipœ”Ίwe~%L–2Αee“ϊΩ…XΓmkυν=wΏ.LΜN…«Χ�ΐVŠ:qPœsΛ²θI‚JΦ‘E‡.Τ6°’�£ΰŒ8WUΌ΅'JΚΈΐP SfUs!xChνΜμό‡ε�zοιS_ϊg―{σ»§Έ@|}τ£«πžΣO|ύ=έ}Γ‘Η©GnŠ ¨ ΧWYŸFΦf &ΧΤΤ ‚pτ_%¬šb'k'eP–„ cKζeέapνηv…ΡŸQ·ςΜvxw²Ž/u§}‹–ͺ;xŽεEL’ί’½&(“b©’χ�-œΡVΗ ‘5΅ί”χ*¨ιϊώyM<Χ.ΕWšœ“MΞENΚX[ —,,ϋΰ^uΤλ?OΰΉƒŒ;>s‡> 3ؚf~nσΔ*@EϊXΨ�‰Dψ+Ÿ·‚LΤΣίΑΖ›š’ež» ‚-”ΑΘͺ£‘mΰ›vΔ&˜±/A=§³ΆhϊΘf‰Τzν Ά!·±rΛΘ0ώU2�ψn€φ΅ψ"εNΏβ>Φ–fΠ·λόΘb,Γο¬NαΛʌƒΐ3mΑ>ΛrfΤ²Vτ‹ΌŽe›μι&A€!ς.=<;Μ)jγeWΨΰΪΎP ΒβDdda&žY`u0Kj9Ά`λ¬α‡--ND£O <₯­W‘h`Iy~μ ΟΛ9‘ΩΆ»DΘ΅Αg‘Ι‡οkКθβZρl°ηIξCζj’σd‰‚\―ώ£˜ζίϊ0yd:2t‘)Οd Ν@ŒvΐΦno"sεΘ�ςο”q> τπw”CΧ²4ϊ8\σ,Σ₯ Ά‚V:&τ~n‰ˆe³›$8Τ ξ©‰’uO0Κ²”g$ΠJΟaZΦ vŸϋϊΡ―…Z؝ΫτŽ’΅‘ή�c΅ ©:°‚‰[₯\³¬ͺ=”TAξ‚e% …Mαΰ*·Ώ0ΦG.ΫπΎή»u.Biχq~ζg£ΨγWΦ ”υo„Χ0I³TΦ­ )‡ΞίΐμNχΐ4Ζ³vκιθrqG‘ωΕΉ–‰-πb)―`œ :-SIW”b³ΈΎ~S=~‚e"²9΄υΡ,3ΤΎ:ΕC�ΐ—ΐ‚ε׏�Ή½ΚΤ9U•u5ψ§χ-/―ίσΛΏπίώoρS_ϋΘ‡~μk?�oώνΞυŸΫ›x‘W�σΧ²„¬―Ύ\{όΐwΎνύηϞώ‰ϊ–Ž£΅MdΚΘ~ΰΌHC֐₯i " ½MΖCγ.‚m“ŠΙfSR(+0Pi(¨Ε°W…&”ε­[a ΏεˆsΔ‘KΪ™ηΣfIfŒ=\£γŒΩΓHκΥXŸuμ@/œ(‘—£3"=Υζ46�±ώή1‰ϋΪΓΩ[£|Ÿ –ΩΐvM�€‰aεΩ\ϊˆ3$zίc!β˜‚ύ ͺν˜ΕΪfΖkqr„`€Š²”ŽA Ο‰Χƒ` ΥγΉμξΚΝΖηΫ@ɜΏz-|ώOΎN?w‹5 @Ήl±•ηS2xbYΚŒ†5ΞΝθθ�†¬ν†χ½ο½αΙǟ /Ώτ2λ̌yz$xl¬Ι3pΆγΈc+1¨ŽόσܚM28 Ρ½― ;9)"ϋΓ¬„FMGR ς@³�<8XFM½U €€…r Φ7ΟΊωΉυμίϋͺ577R^ΤΞUX~/Φ ΣlλΰΑCԚυ‡ΧϏΩ]{YTιtϋ 8Έe(ΜUd·G'ΑŒΡ³υLχΫ_>ΓΔtλ Yssg«™°,�o­YάZ‡FΎ°8Ηdτ,ΰŠQN’NΦφ‘ΕVΤ­U}ÎΆ–πώού~²yœXh­umαρ―>ιG"vΘ λεΉF<ψZ Z_ωaQ΄Xo΄Χ§Αgbzv<Μ0¦±έ]Γ9pΰ€ϊW…YτΛ*λ%#₯¦©Yf_q°uŒλΙ;iCΰΡnε·n\Ϊ:“άπeσt^)�‡ίϋϊχ^Ώ|γ{ς%%›Ωݝ;¨λ«₯œG6’™g»�gp’sά»μΗήIΌχš[<Λ–ΪΙΐVΡ'ǚrΟ­g!·lAšΛ’GJa₯!IΌG ”Ÿωπό�6GgΆ’s/θ±Ώ―σMσM@9£©ωiœbΊΪ£Σ[ϋφQJτ<ΰθtθΏu3΄@ι.`gfG§Βζ`±a"ž/> ξ‹–ΙŒ’ ~ΜΟeπ>δX:Ϊ&ξΧΰΧή=Λ·ΗΔή Š₯#2]°r~ί©BκσRφ„ƒŠzΐ–j²Ξ�ΫyΨDc§n ’σςf‹m°ΫΧΫήχπwDύW[Ω>σ{ž}ζY.‘œšγ3ίι[Αύ¬oϊ\ά'φΒ5ΫΔΏΘ³ώκ.iΨR³ΛΛΡ±GφsT°δ¨F#*Œ³l/‚Fw�ΨΔxqu.|KΧ½œ%@$ΐˆJžΧ rυ�‡•d’–―θQٜ6;ž₯Ÿ~‚κΦ);‚ϊG‚w–ξίKΩCύ`xω�5ΎgSNΑϊμ9ό˜;όžTjA3ΏE€ Εϋ"q±0Α­xΨΟ‡Ωhφp“ΟŠίΨ"‹�MΤ¬„Ρ²Ζ½ �ΫόΆ�Ξ—tω–Θ­έ€�Α2=Jπ·a&js.΄L‰�ˆgmjΒώ1»‘Άΐ f›ϋΩ…‰RŠž΄΄Νgͺ΄Θρμφ\°ΰπIΒ`Cμkž �²²RJΐΠ·Ήe€tŒίkΝΏ£ω"pΞζT0ΖYv•‰υμ ‰}#χz;A?μ–cJυ;¬3₯₯θ卹τ²R\™(�©Ι)jΦV ςc�E―μ Hqla�ΆD9Ξΰεgηθ―Pΰκhτ»Έ2JγWτ3gkQہ Icvy–@Ψ mνΝ”¬Lr π<Κ΅28Ά8φoΨ†FPΩ0cI~¬Σk©ŒiNφχΑ1h€5X…^–ε!σM-€(=^†œΐ€v7Epλ3F›=Ρ—τμ ˆxΖ¨ω₯ΏV1Ρΰ" ά‘œ±}ΕΔ_ ΧIβFΐ‚ίρlλwΚ¬ά@?:αΘϋΝlq6ΧWΉν£Ώƒ½ζύήǚώχWΜχνν ΥθβΕ€}tέaz’½ώ oAώQ§€A)€Žφ4‘�Ψ™ »Ψ΅JΔΘώŽόTΤ‡Lϋ‘xΈiφŒŸ­£·β{Ρ5œP…&8S4k•™“œ›§*Žž<Αϊ›7G(K¦tPΛΔ=`Ρϊ9l„Ά»ΩXβω, 6Ί»€wEπ09W<3ώI @s³„‘Νμmy‰‰"φi{‹ΨΓ=a”ιZΐ#™Ζ;μ©Q5ϊΫύTM‘Dz@ύΑσ/œωΰ·½ύ-όΜΟ|δ?ώρŸΏŒ½Γ(ΏϊϊλZ$λοφ‹Γšϊμ/ύόώ7Ώλ'ΦsΉο«nνΘ€ °6Qώˆn4¬Ε3Χ6š@α˜\ΕΝγΐ&pΈuμ€lΗρ27m- €ψύ�Ζ'ιLξΈΉJ'– @±Šh& Ϋ́υ]₯P08‰νόώu²d�QΊ_ϋβŸ„{x+ΖŒYοήΎpux’.½&ϊH©7Γι‘\ΕkΰDk‡ϋϋq˜[Cgk΄ϋχ£!‘ ΛΘήM±n.;rϊ” 43z—g4¨6ΐΫFι– ΰf³ωpκω—Βΰ4Α(TΘmz>d1„Rw+νϊŽςΤΙ)�cQx‡Υ2v(vf­λf–b™†Q�…½ 4jvΕΞ²~›86=3K!.Kb›ο«lΆaz˜α•ήεΛlL€’tl #ZνΜc:Œ΅Ζ_ ϊttžcG`Ύ–΄IΣu?Νμ`O£Γgΐ°π9|vNΐƒί‹Žο»`?Ν’“Eρ΅Σ΅ ίΚNΤσt‰ξ"3₯1_¦T  pΖzp½,ˆ5(—…Wce@EΉEcDQZΓ ΨlΐX Ρ–ϋ3τ‹pμΡ”ΐψ»ό²ͺ“€~ߌΞΝ2†ήJ₯RΦpό›ι ˆxΗ :ŽZ]GOœ–!ˆ#Ϋd{qŠ-½xž• φiΉ�ž?ύ2”Ι•pώάζΜSƒΈ†’'`o"RΥ³7μέΟ¨F¦qœ}ρB«mζ>Ωά2œΦ0ΚΟΗy)ΓΥ)°[΄ΩΤΎ>Œ/3ΐ\›$5S ασΞΝΝ!»½ΡpΨ4hŒfœݍ8±'Γω—N“ŸGdšΰδ‘©4ψτΟ–4kniΞ€”7›ΟiˆΌ�S<œ`=N²α:Έχ2 ”Mw©ŒΚŽπmtάsl­ή’ϋΗgΘτ1ˆΧΙkˆtΧ ηTYhΗΡΘΓΞπ.ΌΜϊ&cΆnΩΡρPΆΌήνR{~°eΡΑFpή20Ϊ£AŽΩ<œjGt™ύZ‘Y€Ω?‘w\•½ΨJσoΖuOOo,«P6•ηK—/ςΉ”Σΐ¦23ͺ^S� /ž;Y½€9δΐ ϊz�ΥΨΝώψ‘“αD†Σ₯²¬΅?ϊlΎ9ˆlΥΜs8<έNσ:ϊ§’b%žΛ,Y&ΟΆ₯lXηψDοG–ηΝ,�ŽΎHt:|d‡,§`άE―δω]©ͺφi’ί‚ηŸ%ΓΡ•)CΗrφdy€TOΜΝRϋ‰Ό! 9Η&9{e0vb «C)(ͺ¦Ϋ‚"o©E–u4›-ĠŎε##C±±m,calžζΕ]bMd4’JZ™YϊόΗ?”ό�#Ώϋ‘wΧ?BΙ6oξ&R+λ;ΎƒΒθ�ΑΑΠΉ—& L‘Q8 F6 ›©θn³»χz%έ�F”#Ω.»ΌOΩT.m`g“ΈΎε <λJ8ϋάΩπμΣO‡�zzπΎψ6ήιύωοΫ/�ΏΗZR)Β‹k‘ԈΗΒ4χ2ϊά؞Hηn¬gŒήήΞ8‘clξχ@+xΚ~mr.nάΌŽ=iŒΞ£T|.`ή€<ζΓΑcw…—ΞtΎεώ;?±Έ ©zc½ΑIš/ΦΤΐ¬hnιai䉩Ιγ„Cλ"5_Αv°§œiΧωƐD›βη«γ l¨ι$υ½ηyyΕ¬'Α$Ί�½·α­υΘfβ;`ΒΨΏ?Ε+”ΑUΈ \»r•~%‹2—`ηtP‚sνVμW ³d/Ž΄=zaΨ Νϋtτ›χεΩ΅ΉΛρχX†,k{,›+QRŌΊˆgυv·υΫφ+‚θxmΟ₯ Ή/W―Αε’n1‰aπ*™ΊYhΜeθ³m‚�uXn5΅ε4ΔΫŽν?ΐΨΨΎp*»K c6o€<㦀̒1GΎγρ ‹τ3©ΐΆgΉΟ“%\)JΆέR^d ωΎχ^€εSΙVŸrΩbLΰWΚϊlωοΩ Τ{“€Ώ]ϋΊ~ΆC`Ν& ‹oυί$‘B�ηρYν"€ΠŽ< hλ=λkÌ%ΠR'¨ΤBμq£~>|p?ϋΏCvϊΜ%ΐ6GRr=AΏM|–›}ΒwAω;α"�ϊΝ „ξb«ωA”“4ςb£ΎΨ!–Ν˜5%Qΐ�λ n6r.μΊ²—DΧa«Z±ρk°?W±―&ƒjπΕ΄~fHaό£ΏΆJ2΄Τ’œ΅4«ΊƒΝ(ƒ�_^UΟ© |%εX6 ŒΣ]xŸλ(³„ΜΎI”ς€ΝΚΓ°‡QΉS±ΑέΥρ˜μ˜ΡXšα=Ϊ)= dmXhΞ ŒμΌτ}~Aύ­ŸrXN…4Ɋ$ Ε&ΐΟ&gB]δϋ”χ¨σΨή_�©ηΛ2ΗL(-"ΨχΛϋQ†”λ,ϊW‘L† ‚ϊ‰‘[ψŽΙ€B΅u¬ Vl[Ζ§¬°=|θWK†q.₯έ1΅R?Ξ³Α]“όρYΩlf½+kšFš‘uΚyΚR!~ƒΟ΅QΉŒϋZ”p?+«φ#3ΰ} ˜ΰ‹γΫ§)a-εϋ‚κ26»@Κο NhλωEd ]ΛuΆψl›žZβͺœ™Lp-ΤEymšD‘Œ_AhΧo—χ–,Q%€Ο„όΒ-’/œ.φΏΘόŽw \ωΓ…DκDΊ t#²LK !f�hςDΐ¨S"‰ψ9† έKΰ=‘­±Ž]4ΟvοκωΜlΜγ”\Ό|eA³€ΩΕR�½rf“hΕb½Ώ™œύ]q”p;#ΞκuΥέΫVνž9h5Ÿ=?'ε ĜϋΊqΧ0~'ρψγ4ΖΑɈ¨&λ“#ν[€ϊΠ(.(*ο_žgF2ŽƒYφήgΟ�Š*‡Ψ‘i_灨έ‚QBΑYβ`7λ‡ dΚύՁαpφΒujΧ1.΅κR kb n™… ƒŽžλ£‘’Q‘ ζΜnΏή—u}*�¬‘$rΥΛdψ1Τk8°Ϋj IηΔΐ­8vQεί:&*|1ι_Ό�’Σ¬C‡O`0e¦VΗVzi±>«iΐvQΞ: 7Rq‘mߏ‹ Κ+ͺ^Τ9f’tέA‘2λΙΤή€KΓPΉ­ ΝαiέΊ5Ρt=σΐ"»πΆΰTΰΈφ�άe3h¨|NŸ'-|ώ�τϊ›€Ύ‘‰ΰr‘`}>ώ,’4cin¬§Οiύ‘k»�b,γχςnvΛμ/QΜΒƒx3+K(β€Ν1H»UΙ�EφP‹ OŠκTτe¨ics«a–Ώ άΒω‰ο/¨n€&σ@u8„QοŒͺ@φ "i”C/\Ψ808:54SΔEΓΑ²S7²­a% TŠl‹ΐ8/ZgΤNώGŽ₯l€˜!]x<°Ÿ‡#%+ΘzΛtH· ² uξ!gΪΒΙ»Ž…sη.…'Ÿ|ššλ ~ΪNށa>––ΩEƒ;Y+ £ŒΫ;Bg$:ωΚΌFΥGΓh‚―θΌΕϊ;žΗ^yδΈDA`Ο8tΡΗ°PΧΤuG‘c€Θ¦uΛΠ½gΖηΓηώγ—p0€G+OΈ |–μ` $ΟήΦ";œOκΫ:Ϊ’�Xžœ­Nβ9%˜ΟTgξQ€ίJ粄�ΥεWŒΊgta7Ω½ͺVΈOfkhŽzνΖUœ=22€›P–·βμζޚ뚨ΉεLσΏ%²d0dH{ρωΠΫ»ϋΙ…=•>8'wΏζ΅αwώέ§pϊiΚ†S½ έήϊsΰqΈVpb62·Νžsn’tΙ_a&t-Œ*ε–'0‚‚Γ•Š.찁ž[#«αΘ:ΩD¨γ˜qΝ�ΈΛ°«y²žΡiEGΘ+3fΝ0Oά³Ε™ytAXK+ٝΰ•0C½ΐΊΛ†Ϊb28ψuυœ}ΞO[{Ω­!dΗ}ŒΗΝωΌδσ]ηuΦ©Ζ²3ΦΝρ~¦Žd,] ΰΡ‘MΣη₯–FŸSΓύίσ‘}8|ψƒ?ψŸό?9uθΨ±σ££S+˜€¦F‚XΕG‡M=63=K07Λ"ͺΉΎγΎ6ΜψrFRζμψ=‚DmΛΟΫ΄3γόw(ηƒγŒΥmi σc5§ŽχΈ�ώQΆΤΎόϋ_|©d²μ›eκ’Σ/\ ¨Κ‡“wξ'Ž½ΧϊΓΩσ·PΊΪ0τ_EηΦ(4·Ώ–€ΣFœ«ΘΧ(g 2#0Τ€ΫτDωςjξ{V7n†$Ν%«™T.]– 5‹N€-βb˜ΡB1Έ`Ι½Ϋh›œpΰlpί%d’­©‘ς?j―Ρ'κdΘ>ΐKn0,šͺη±u6 mdO»θΡΨΠΖΞΣ0ς2‹ίˆlΞ„§N}χΰ[γθΦθΌςy6Ύ¬ ΰY†uα8΅₯ιa¨ΤPϋ3Ψ³‘Ϊˆvu‡L¦ Ξ™�ΑΆγRWΠ―υŒΧ“]g`욧` ©_"Θ…Ξw?™"Φ·XΔΦY¦§^Έ“μž#5_<}>ΚΙ:q‡?‡m00�BgUΥVπ,4al©φ¦ ›ώΪ»ο¦ολ‚ž]‘·Α{$γp`D†ά'S67^ψΖ t/—υ¨MH%P·™γ€›½’6 ά�”λJ@V™ψΚ“vEΧ^Ϋ¦œ Bϋ,‘Αs©σ<r<4Χ\ΐί¨͝-ΘΣΖΖBΩωVμΓl%{Ι4Qvi³Θ%dY¦Ω.}\HHaψΠVξΈnΘ«Άw 8ΑαΉYκκ9ϋ Τ„Gϊ8χ#:‰]σήkπoμ€―ώχΜζΧpφΓ‰P(I>μ›A¦{b"'f�ΝϊšΠ@· ΅j֐5·Χ‡έ­θΙκψ=‰ϊδΫKν\O y Κ{>ΑBlιΨΨD” χY0’„ΐ}=ιΕ€ˆ@ΥσΡ£=Α$’ψΩβ<™dd]Ώ€Ψ4NFΎŠΣqψάd”P†h ςΙύšdπiΠΧλfY6ŠΗΔ�ΰ ΟW Νt)Χ«-+NwρœθΛ₯ˆœ³ ™!‰gcG§˜΄³™«Φw“l?V1‚<@ΈzυVΊ Κ±ίΟήοΖ&Ζέ$(V˜Θ5Ν^’ΈΔo*iκα652ή―_γΚ H4¬Ύ ¨c+υaωFό?Ω*bˆeτšŒτ=ŒΥUJ³ΠΡΚδŒ Υ³ΐ€¬žc›―iδR­P|buεΕ’Χn}a\$ψΏ@_F― ―χφτΠ¬3ACΖkašσί{Πr}cχP}Ύ 3Ω8VΟ©½DHbΒ‘υ“‘•eMlΒMϊN€°φ§Ο|ΰνέ�tcKσzτΡG{葇fΡ_.Δ«―Ώ‚ψ; |τ£…Δ»ξ�Zη{xθγ3Σγο―k�ΛΔ¦};ŒΞα/ƒ7@ΣΈ¬ :Η,²HI͘νKƒΐε8¬6Σiii"{VNžΈ+fa—Ιv Œ  ₯²DsD„ήQ6–)H‡•ͺδ‘2 ΆΚ¬—‡ΡξΘιέ©1β*ΉΊΆ²y/„Fa[Χ>*}8l6Ν+ΕP,-Μ†jƒ[νΩ™i6sxQP6eΤYZš‹_�oφή;XοτΊο{nο½Wάΰ’/°Xlg'—aL[N$ΩNbΟΨJδ8.JΜI4ρh&t&ΆOB'ΞΆ%R"Y‰b•ΈδrX.v»θΈΈ½χήΫ›ΟηΌ„f2Ηρδ/Iϋ’w/ξ½oωύžη<§|ΟχœSQΣH–\ϊ"μ(€ωΛιόε+©ζτeŒΖq φ†<:VσΉrΑ€΅½œ42>Ύωο¦·�έ…~ΏG@Θ4 Δ™Ld`…L βτx˜ε.άΌ— q‡HΗ)�]”Υ̝ ?‡FzvŠΟΦυ dšy°›ψ8ΨfpΚΈgxUάκT½ΗO ]τ4οe£<)­‚RΦ0^”‘Ρ&P*€^‰ͺ ₯γhΉ#¨Ϊ]΅₯τς Μ‘JΦ½”ΰο1rΩ_(Q~žN“Ζ`Λ z8;²LvQž"ΞΦΝ©Dσdmπ‰ΩZΡ՘{ή}Ό/Œq]­c₯rTξXQή`ΖΔ/d. Ό’cά8€ΠkŒ|½u&:BhχΫG F˜3w²TΆšpΑiΉ!\Ζκς4ς½ζ™"Ξ–‚(7Σ°.ΒyΓapyμχTVήNœΰΕΥΧ―₯ၠΦα žWΟWdΙ LΝp—v±NŽ/4[wΐyΘΦ΄f3eΑrα\zΞ£dAπ€/―Az£rβώ”DhmT 5‡™@�n3ΉZΦ'ϊDp(ΆYŸoγ[ιΡΓq^΅YΣxλΪuΨύρ!X‘Σ­Σ+@ #?“‰Οε³:ΊΊβ>ΆΙΎψ»½YxdΧlJΖ¦£œΣrhˆε8σ όfkE ³sž%Ψ=+§Οj#€ά\hꞁm‚#Λ‚|^Y|doY.Β_p΄ΥŠe<θ.K5 4”§Γ9Ιαω»ΨŠ]Ώ%,‡Όn† Ξf˜χ²sζzL ޲ο0Γh\jΓIƒΎ΄ΕΪYΖ• ͺPΎΥ_κsY‡‚ΚΏοΙvάΏkŸdΐ¨Gγκ^*G–Rh+G»¬‰= (#|Ύ Ž,-DίV51 Z{ooOκ;q](ψp%Q­‹9ΕΝχί£τFΈ– ϋ71’Ν=ΑφΑ‹ 'Χξ“ΝcMmNkfΣώ$–„Zχ.CΑr &@GΩtφ3ˆd{ΰu+/Κ“ ώ2l``OmL8ό,€Ο³ρq-ηΐ†’˜–H^ < ΦήΚ{³& σ‹4#€€ηVΦ‘:ϋΨ±žΤλ�.σ2ξ ΒΆρΉ“S!G±¬χ•Λ|³1₯kl—@oΛ\[^,A™\ŽITΠΐ{m#w‚R,"�g0Mώμ@Χ―rΞΦΤΒ$COœ8ήFΰΓ{f6βμξπy τ’©@ΖVURΎ6 h΅„Ξ]¦©oΤx£ΚxύΩ§»θ™vφΎΨΫ^‹˜ε° ρ73NW h’…©Ž�½δ€€‚bζ±.«Λ$d."ω–›EΐΖ}νS&‘c€ΞΉ28ΧφδρZuΑ.v"‡ϊ|“Pκ]ύŠπ3Έ*A‘G.]w?³ŒζΨ2-άc�WJ鬌Dϋ (―κμ"|@ΰτ¨ύ™œ€`y•ϊKΖλΥvξ0ρG…Α«Λ\„.+Α^a§ΪΪΫΣϊε@ύ·ρyΦ_ £™ώFφ2rΒΜΎεžl\#ύ26ρλ6(λαΰuqSr�β+˜t΄Σ§Μΰ μρnY¦‚2ΰ9ζώ–ΆVB·˜(ͺ�ηκv ^οs„ 8ρKySŽωuΘ•>βΎMyEaPη¬ΫΓDΣuό<�ϋ»'KŽηΛbΠW³šΰŽλ[£Yέη„Η{`Ÿς°a;θtγ„Pr{,TΪmQrPIΙFηEΟΔδχ²‘.?χ<:§" <ΐχ€igMR;Ψb φ†:#d™‹R?= „Απ'Γ‰F߁πtPP ΈNγrΟ@’ΗYie{*i#Α„ά9ŠΈbx*5ο%¦™J##ƒΊ4„E†νοbο} n/δqƒXE¦—φX?jέ[ ΨγΎ φ™xq φ(gέΒΆα+6ΰGZЦOΏΗ>aϊnH†°vEψ‡¬ϊΕ²!υ‘γše«UΓς–A΅I<�A½+ Π�άΦΒGώ @ε—ώΙ?ϊ―_�νίώΝ_yσΝ7_~ρΕm€θ–~τψ�±J՟©ΗT&Sz�GηΚ?ϊΗ�νWWWη~Ί¨²€ ₯ΝρΕΡDh9\f€υΏ vX€H»‚,*­’5ψ9α¬!Σ] ₯R…:7·Š>#e&&`¨‚Ό–•Πΐ¨ŽL-‡p€U₯ΰ*ά16ΦΨ΅΅΄…r”\…SbΓ0Ξk―Ύ–^y™μ €₯ΞΖζ6@ Η'™%Ν!;6в$Έ#ψ*¦T ζμb8 yO)ΚψdθŒL8@νmu©ƒμΛ©Ύι‰+/ΔT€©½ςΉ/QU Ε.χ1³½Ι}~Ψ?•Ύφ?�―ιϊ‡L²CΥυ–ͺhZΣέΫŠz Ί¨₯:ΡRUή+8"σsΤ\qί6|2€·yRΈJ`Ž΅�…Ξn%AΙ1Ί/ΏπΒsΤ³C•ιμξnG fθΈkπjc0Fςi1¨\’ΦΙί9 Ηfx:|f}7qd βϋ?k¬lJησt΄ό½ήŽŠMgŽΒpθ”rΏ$�3²Ρμ'" ι|Z�ξ{θ䨀0-μ' ‰ͺˆ ©$[\I†Ε'/ΜMβPŸ‰’vZΕςΒ ΟΖως=Έf:+άς~"¦UmΗCΩ‹>W�σ „}ιέ%sofΚ�ˆͺ¦nξ»„€t5dΡχˆPFh€οΝ4~~˜ί n0ͺk+0  d=σμμtΠΝτhxœ™ΨSihtΠ@„ŸYΪ΅UιάΕKιD_7ϋΦΜ€ƒζΤήΪD––Z8zμ‘ύ•R™ψ@ :2MΜ*vα K•΄6έZ_Ρyi¨^—Žvs{[κ>ήΓλa`<\+iΧΤ Ϊ‘‡SUX�0Tυu5δIΓn³LkϊSξίΏΓΩ$Θg_€ίnCα—ͺoξ½kό7|Μδ8nΜμjLΟΐ iάb­Ό.�QηΜ³mFSγ§γιΪz&ΝΊD ΐυΫ…YΩυήeD6)ƒΚτΐ£DΑ·"'Β>:2™ξέ»ƒXΰΨ<)+yΚ�χ8{ΚtE4�τ:φpEά₯λΩ·ΔfmκGRω₯σ£�ςΎ€ϊ:R­”±g…dοkj�₯§žaοNΒΜΈŒŽι`tκHΤy:2vsέχ”‚f,Υosm“kΜœε‹‹KQ²0CηψΙρqΨNΠVω½΅―u°DΦq4ί§Tdgζϊ[―§ή~Ÿ›Μογ¨3G#:υΓϋ²9£™™J�Qύ`ι•NRθTξΩ³©�Ϊ=Ψ$ΐ,O=ΘΔg_ϊlzι /₯‹O]„Ϊ<ΜšΙΨG0«Θ KQήf²΄vΦύ‹Γg™Σ±ΰ(ασru@A}σ­5Υ‘b ‹&ˆΫ νωΜω3©»§+fέwλH]]]±ΧŽά$Š`M³·%WΚ•ΣΤK•6žM}4υ‘₯χ‘Ε δώœκόκ探Κξž9dΤ–qώ Π€L/”™M¬ͺ &ΡΙ<ΒH˜%½{�!Ÿ)£…³„lω`†Ά΅­Ϋ@†fRω°?ŒΞΥ㦈Ϊ-cυ:β_κ₯ sύ9―Y?ŠΛΝώύ'zl»2?΅ξάΊΙ)ΫYg“FlvόDv ΉΔαΕ!υ^l*[ «g;xνΪιέko£[ΙP²'EΘAύͺκκΨϊ°?2<«κDεW[a“C/Fκψk~VQΰ™“~"“Œc c†ώTΊtα Άp)uΣ¨±u¬CΦΚ�禦ӛ―½ž†‡rχΣΤψ²ξ¨IY/Τέ’›φXg ₯HεTΓλMx}–ˆIYXhji„%ΓΨQ�³Ϋ’.Σ dΜfδ½l$³ξ˜8ΟμνŸiύΎ ©Αν φRͺ{εθ;ά δP0Z?BΫT @�άސϊNχ¦'―<‘>ϋΉO₯Οώ3€½”Ϊΐ΄ΟΘγΜφ§Ραμ]Λ‘λ@VcΑυ‚ύtμƒ’Ώ  pοΓχπ; m:Ω„9粊λΜεp•s6m¨΄}diŸEΖ…zFΊ½Ήϋ‘~’ε½)ΈWoʜvQ}ιYu4j'η*κη±―–·΄·Ά‡ώR·κϋD—k±‘Mϋ¨O•ƒ4V4τ²eMŽŸΦ.{λ?ΎςJ²•κŽ"―RΣ •€…λ!`θΩυx&β ΧƒΡ‰�ΠΞ«‡΅A>Κ™~PBΩΙΑ}+ΊτςgιgP_%;ƒ¬(οΣDYNWKKZ˜„5i?}‰Π‘6N= ΘΥ^Έ&~—±δUIΕ0šΜrΰ˜%…₯4ύ΄™u>€c{" εT€ΠΫν»²47ŽέΖDΎη­ί˜½Kο €eGx³v²΄ά\άk)ύ•—M@`Ώ‹?ιšln0mΖΰΡλb±³ςό?Ευυoώί>:ξ½ώH)lSmς ‡]¦7θ“˜8ΚΗ')(©"c½ΐ1 ½ΆΣΧy}&ΫL|XΐΕ  ―Ά©™kτε~ΥSΦΝ€ΖΥ5Υq†Τ-EΘF=Α³SOΤ‰N-³lΔ3΄Α™²’:ΤΐsΧ³DΖ^y-CΧ{ žAe­}›΅νά#2 sI°ϋαΊΖXJΥrυ°οοΊ„ΐηy2”YmN`ς!ΰWΓυΪl[Ά­ΣqŠ ϊνυ’Ο~μq]φψ²ΤΛιa»ψA6Xwo·ΉOΒP€ίίΨ>ŸηiSly=(Ίt"ƒ@\ι’ŽqάΔh¨ΜΤΕ’ΓεΤ•Ο†[dF Ba[$X#›‹Cγ΄-Ή‹Ο<JLcV�έnΞu/ΜCw"[λx VFjυkN—―œIg.Gyᐑ”šP€E©­³‡Šr :νY.νpΤv–`ra™ωφ{i‚�οίώΡkιζG^2d q`΄"p�(%3φ@λ<h©P­]ΣHͺˆθR.5Ό%Q ύΔιcιγŸ~‘μΩ@Σtα‰3ιβ• ιΩOΠFšAέͺΖA«ΔPŸ9{"]&x¨¨Βqεmνl₯[sF‰,,Ζ«…δΨ―bOedΓ»NKΟ½πtκκiGφ³ΐS!gΚΪ΅)ήΣΰΤ ™'Α¦  ™ƒ !›9)—58ΏρžΕιΉe,ΰη¦κPH£+‘#Ύΐƒ�6ψ³O€`—N†»ο~H³i€FNƒ‡ˆqΏ �ΐƒ{1pSΖ ²Ώαχ4GΪ(Λ&©²&Ζ&�ΠΠχΔ$§nθX{i€£\{uΑ* ώ'Α¦TG”πθ¬ H8ζj'ΨYρΛds-m@5αh`bq:χ(o(δd:»:xŽ©χ444ΜψΔατπΑC²°6V‚ΐΊΨWΔ{χΌ­ΦC2+dB]'kΊg(•(£ρgy4i(–u΅ LYXMoΎώjzp«ŸΧ ΐΙq —ε\6ͺΖθ+«qκETΛ iΨZWN_–Bf΄γŒΛΰ@αθ•rΞϞ»€Α¬iτdΫ1ΊφΘγ†po°#Ψχc*¬―Bƒ#τ˜ϋg£sζΎV9²°”χu¬Ÿΐ£˜@V!%κ―5‘oΎŸͺ`RΥΒ3p0Ϋ*CŌΨ!gkaq‡•ZKΦΕΰ5‚[Ξ¬Ξpθ:Oμχ)υΦ3¨.”QJYΘ!ο9E–tfr"‚Ζ��Ύ΄†”B)υšq²K ¦;b½&{€ŒlΚ4ζ‡ο‡δ½θ©γ€λξR^@!ϋ'0Ί‡X_—ΪΝΗ#·ό—λClιό:¦κoΖ)“ˆG› A¬ ›―Ÿ)ΨηοvΈ΅]ϊ₯M³λύ!Ξ 'ήe9™ηŒu΄ $fsQ6¨΅ίˆΊsϋ69{ ϋmΦ†Α΄΄]ύZ5ΑA!zΖ¦™,A;A3«σN9�φDΚvτ p•σοΎD ΚΉ³}[[eϊψ‹—�Η^xг¦<3VQ‰y‡…47Ό–n}pζΔ8ΰθkΕ{Aό­¦†»Œ=4@­dύk j( “‘RΑΨ:›ΤΦρ³#•Y―» ‚‘WΥ θϊσwεΜ‡`‘«ξΟ‚f?gΠ©+«5~6€’Ξ?Ν&Ί{…Œ΄φFΗ·‘Ύ†sY©‡έΣ�Ρ’žΔ.ž:םNŸο °_`ΫώF£CΑ’0(@6fιΣ~ŒΜξzΊ}οvdμΛ±7Νά‹ϋj-ς>λϋVW�›œ]ϋΖ,†ž―­₯tϋΩ{ŠΖi‘)&XΒ9ίζΜˆ­.:(ΨA–°¨‡³ύs8kΌΦϋΝε΅ω°μςπ‘d”θSxΨ£ζdΟFό“}§R-¬‡ lΰθΨ8Mېuϋ€ΨΣ±ΡŽUΘΎΐ­ΆB`Wω±ΗŒΊh‡kr‘3Θ§['ΏΨΰTz}€9ΌΟ*τt§XYŒL ςZ‚αx8Ή‡ž…rμση_[VI`βΉ29`cΧ*τ›Ν₯3τehk«N …WURfX[’.0Š΄ণ­ ½ΚΉž0ΏΟΉD'άrŒ%Ycύ8mˆΑ§Αž²ŸΟΉΛ—NΟοσ1&κx·NMN¦-K·H:΄°>5σy€φ*Z±\‘ϋΟE·ζρ•΅1Yζ€n9ey”΄C' »μ$Κ mŠG)V.Ύ[.Ί;― } ‹LΩ‰sŒ,jϋbOy―θ—Δžκkhώ<“~^€D€ž‡B2Δ6ϋ<ΐΎ9Υ‘=YPή„jiв7ΧΚ΅Mo«jΙχ’MEΥΝ~{?7=ŠΣG_|žr΅±‰ X&“0g£y ₯σ֌‡Ζ_5¨ίBχEI—΄cœ²";u‹΅·τA0ΏvœφΏ=+«Γ]AΘedέqφσΙEν’O-‘iRŒ\{FmπlYƒΐ“k"π$P‘?ΆύΑΊ`Ÿd;Dy•―°CŽΡ…ΕdτM8.Τ/Τ7ϋa/ 7vΒ):΅4dχΜ:Dέ’<”πš ώζκΦΌΖ3p½>{NΠ�7‘Y‡Ώ\@ιFښα})y4;Ιτ•0Ίκ|˜F‡sƒŒJ΅€†䞸Xœ`δά½\¦tΐƒΝ `α€uΫΣη€Ε΄F „Jٞ ί ½ˆί);Πr Y~M¬av"€uβ 1…ΘŒ­<‡b�Υ&ΦΉ”μpa1‚ΤqεΌ5ΆΏ"’•υ©΅»“¦ΰ°|ˆ‰zιγΐ!&ή�kΟ‹½*‘όیΛ.Ά•„UBOπ&ž({oϊEϊq–ŠΪˆ_ΘͺσΛKσρ{ΏϋΫgί}�ΪψυλΜ°=ώmW€έύ³ρΘd6šΏό·~ώ_ήωπξΏWZ^WQΑΒ\ϊ䒹ʐŠΤIΠaT©0b @Ο€ΐ κΘ’A₯T¨.χBŒ€N‚ˆ·πUq^Ÿη{­€ IϏ‘k <ŸašAΉ l`Φ Τh’Hp;?3‡±ίKWž}gs:¨{ΦM�d ‡λ0›ΙgΌυΖUγ]œŸBθ}MΠΌΚ�…‹}8u\d½©νΌ�ˆμJΆΙˆχ9:<Ɂ�H·nέOτν’1|/έ†ζύφ;·�ούώw�·�πuF-^K3εκZΨωf«QςvΒGr8mθ]΅Q 6<ρΆ#ΎΤH³2ΌΖzΐ‹OžM§OŸ +l/F`ΪΕυτάΣΟkA€φδΙ“‘MΓ™°Ή\skkj$³έΣ{Œύ Λ5Τ΅cBυΝuΜ,?•._~"=υΤ%θΛ3AmZΕθŠϊnbxΠ°θ1UͺΝ� φPΖ"ΛE ₯Mθ~ΡɏAC.ΰžˆΔ['¨ h0 N ‚‚ς�‘5Υ™5ˆΠ`θΤθΰh0₯€JYW)WSwκ,γ:X)�‡Y¬-XRΠK‘ŒŒ g₯Jgγ»;;”6Ι.,ςεzάν#'²!j[σΩωifδΐθs-NYΛ δ£'…RuδΰςΞΞ΅–sι>`Φέ»#ιΑ:ΓOΠ?ΑΊphΥ\s='ZΫΫΰ;:Ϊ�™s')h%TΓυ”ρχ<‚ ―Ε54Θ:8Λ αΞ�:ΑΠόΒΧ•=ONs°tCΤ]κ£NŠ΅•fkΘβXGΊu[Ηά†gΌ·ΤΡ*œGΧή5£f€Hz/ΐ’λŠp0€Ύ-R8>>ΒƒΞΤΫ}’L\7ŽΨ6cΣϊΓ‘t€e.ΩΜ<Ξ—j=Ÿ#₯Ωμa8όΘ†Nq”hθπDΎγώΈWΑΑώ‹‡k&¨”uβΜΤπG�Ο€ΑΧGΙŸ-Ϋ₯£ν ΝΝτ”*lRΊ‘¬°’ρήΚ™ŸUΕhkk ]Ϊ0J‰η rm8#‚e¬•Žq]#³kΙ†„l`ΩΧΓnΨf”*`Š<ρΔΕ8‹CƒΡ=˜•Ή dM9:NΐKΉ Q?ωoG4ZNem΄Ί”M³χ€°‰iϋ dνn‡2Œ1θέ«‹:$–^°nœ –6ΐ1Ϊ5kJΥ)w_νbYE‹εUή_ς “dza:=|ΈuZζ8χ A]Eϊδg>EΓ½Σι b/ςYίΩB³hκϊΡ‡e° t°XKƒi‹ΦS$»Ο6‹,ΌN²dKŽ ς₯…Κζz8>₯'fω 1Ό–’ΘŸε1λμ]”)ACuœœα{Gΐ˞ϋ]πΐΟV6μϊ/;,z5DXs|ˆlΊ­ι™η? tΝLO°�Νμ�Ήk§£ŠG$sγ& †zΚG8σΘc<MχJfˆnο5ϋ=ϋ<Χ_‡Y„zΡΟΝ‚ΥΩ—Τ=KύΫ€ΰ@IDATr�όϋ\ ε]/ Bd_σΈ°Žά³eζ΅ηψIΚκψ|d]Š΄Ο·dΑR#vkΘ2‹ζ8ΆZοΖ D™B eiπzΦΫύQΟ ψyfPeοXb6ΟσU-‘eO?u!}κγ#`sdMα°™ΤηΟΟ,§χίy—{Ήd}pϊ ς±γžYε3Χ`SGΩJfθΥ)><γ,Θ$΄‘™% >[ I¦“6NΐX:ΉgΔχ΄i‘ε–ŸΘt ’.Χ…δže—ηW"y •Ύ]TΓ¨‘/B)ϊθzγρ}¨ΓΞu£  δxW7\ΚΘh½?a“ΤKϊ ΫΩQ°Œτdlβy°„qπo~b’rD»ωΕhΊ\BP±‰?°ksUκιiK&πM­�UΧs‡yŒΌεχΑώ°ξO­‚β=+«όumΐVϋλΛwεΘfuލ›™Km]1ρΕ€ΡρΤε“6\€I©Α‘Œ$A (AKWVΈΑ1Ο•l.e*D‹τcPV”Ϋ°ίl¨2cπ Λ’‚liΊΛζΚ636+­ηiwΚ±7ή›gΨΧ©ϋ΄»€e²596Ψ”ΞτΣ_ϊΎΖ“τ7hδΌBρΧΗ@χΕZPΪΨ c’»χ$~Sͺ8Ώ+”χΝ‘E P—Ο(�fι‡˜φL#„Ώ‘€2γœA¦Ζ>LΓ·?H³ΣL˜¦άΑΐFΤ΄ΩδœZRΗYxVž=;φΒ±ΑϋΝρςΨΧb�ΕPαKͺψ�O²»†?I@ŸE Θ“+ΐ†Ν–šŠu`_ ρλ――{iΰοϊz½κ$Χ{χ8„₯?ϋZ>Σξψy£}dΘɜΣουc,₯Σvοn|Γ6°&]9q?-A4{] λ·0ZΪΏ%€›œcY‘λdΈ§­΅7«k+θ΅ΙߝχP'ψ]&O#Ί₯ ΏQ[―Φ—P‡Ήί^Ν6ϊΑF’‹Γs«0.—³ ©ξΣςΒς`©I‘ ξ?KdC–ƒλbI _ TκΎΚ°z &θ[Ș\₯!γ q€ΫΒΦρF‘€:pMΈ_„•σÏΪKΟrΠMκN™₯μaŒ,e}wθ‘εy° bFί@ΦηsΆΗ½›ο₯Α7Σφ�QU€©GΤϊ±–Ή€DYΠ€›‘Œ„L!L+kΪ Σp†±ορ…>΅΄!₯JiβzZοGWΰ[σy•5τ\s_ΠΣ0ˆ ΜΡζ{©œl¬«O-υ΅©½ϊRΨ8u4kδ8u΄i/φ]ΩΖ‡•yδt Α4YM1JΉšΕ�Ψ@Fdˆ Έ™hέH—ΉyβD:‚~bγcΌ–ϋb_ ύ%'ΩCdŸ΅ΡfΈoξ!Β€ϊ! SνŽΙ£¬ψΤάάμ~�ΏSύχώζϏόύ�βευ_�υ―ΔK|ΩGσ d-εΏωybŸRΙωΫγ§Zξ§��9>9υΣ₯₯ Ή»ΤΥoB—Ω! ‘Ο₯γ`f•¬©u8Φ]*|*�M†ΚΪ¨­6œG 1 ƒP΅.}HGΤC―RΟ61ψΐΉΒˆIo5¨T...ଃšγ@ͺΠΦ1˜y|^ ©žΰ²ŠΦπƒGŒ+bV9YϊcΗO€,’υγΉv"ζkRq–‹q–5Twοέω±„²YΏOΦώxԟOŒNΔh�ί�W`/¬qΗ }ίΎ{ϊλPΊqσAzεo§Ϋ·F¨ΛΫIύΣi|-:fΕζ% ΣdŒŽ¨υ΄ΊΞ'Λ Ϋ�š}‘Β¨0«™WL ΓY\‚}α΄wΆal ό[+SWw3χGσ(¨q�m3?.A—Yδ(» ˜wΌ‘—―…ΕuTœε›OπκΘΎ}X7>Ό–ήΏ}“ΰ™τΒs/2Φ¬9 s]20F8΅�³T` ΈΑWvr‚ΖΟ¬ΰ έμΏτj3ϊ�θ³viPŽΚ3λk@"έΦχΫ‡Žf (xχΖ†α ³>[ ρααθΛq2j`€Τ7· SΠ½€j‘ΚtάκΪ;RaΣ1z+Ν†Α*,ΕωΓ8?Ξ<^s³λ9(]Gm`ψ ή₯Ϊiτ}†qΕΩ‚†»²=vj“Ωυƒ”Μ€ ³Ž‘ΥΨd1@U8«υ dAŒ-aικm’Aa/™ήnΐ°F²χR7©%ΫZL&X:η! Fd~\«pΆ4˜€ixlI€v…ϋš£YΤγπ̈+σޱΜΕωld0[Z†#nώRͺΈcKk‘ήΙΆq³tβ|dw–†¨…ΥwD€Ω2Ψ2εH§™”²–AΣΔa(FφlŒVK&ϋΒΩ3Ρ-|‡K”]c₯/ό]* S7φΉ/A©σŽgΣAhŠƒν#œSdVΉυάλTθ¬h€tΪ›ΨSχΫ ΝqfQͺ ŸΊNΧίΊš^ύα01μ‚nf‹ΟδΉf,t"Φ*Έ³\₯v2Ηq*₯iœγ+Ν– TΚ&ΪΑi2ΫήΤޞΊϋhJΕuΚ\qΆ΅c₯Μp™y°Qktmά]ε„3₯‘��fd*ίu°Μ *·Έ"~Ή~Wƒ}›x ςμQΧ‘v ̍VV!θα™Κ¨αs;eTMŽ|ρΦΜϋΆ?Eπ’υBΝ½.ΜLΡΡ{)΅΄·F`oΉ#ίvqF{Ž·§ΟSšΠwΆ=L0ΑΩ|„~ϊ€ϊm&= Φ7ΐ<α’BζΙ.}ξΣ/EFabd”LŸ<šEΚ:άΑΊύbtŽ θƒ�Κ}Žϊ]'Τ.Ψœzκh₯‹z�‚λpˆ:©Ρ’Ÿηγœ Κ^Py―ʁJ–²*΅Z*«rβZιtΚ~RΦψpξOΦG–~―όt£λutΑΈxΰLsm:Ω€`f όΰίbί΄;ΐ~ΞΊ. κsŒ|.�Π)GJYk2gξ76JΞλυo\›πŠ Nόƒ³ξ‰Vί(Ώ~r{ρ:eΦΒ̚ϊοτ9Υρގ ,3$Θλι:NΓιτΪΥ7Ρ›~¦gΗ ΑΡΎZ*Γ5²^^Ӟ†˜χΆΎ[ζ€N’ΰΧ’³ΎE΅”Ζͺ ΅L+©cDθΉΤ ˜l�ƒ#GXήώπfz�έΫιΧ―[¦„χ*& ψˆLΧ*ΐe_θ2ρNΊ€ ΏΘφ>•y³λ.„ΰDŸ―£[L¦Ή€[ύεΧN―Ž�{`I”λ¦"ΫμΥμ.,ΑjqjAο6ΰlΓ[¦œcŸfu+³Σi{½ΚHΑM²ˆumœUκv `Υ&UΨωr3„8Λ–gέϊΰ=,{ΕΟ‹ Ω›Ξ«―¬–β½pΣwˆ< š)VΆήΉ›¦FΖX‚2:Π―θΜοsΟʁ3Ϊ/ξ!KΕ68Sζ•ΧEΠΣ€ΜοNΚCWΙΎq¨Π‚6ƒ v@έfuκ%ΧΡ© f{Νjύθ1γg+�6Θάw½ΝλΓ­£ 9�\,<@§2”ͺΛW½ώΩ(A`o;ΐΛΖ’OΐzJΌw›ι$°yΨ ΟŒM eUΤγG5ΓW Q΅ΎΘϊR†`s>X©{‹–Q,β7p�θΩƒmbxُξ₯ΰ¨ΧcχΪ1’ϊ›dœ]+Ο§Ί*t&ko–[­‘Ύ³€βΟŠ>MθAΡΟ‹s.€ΰ—lCΟΨ2a0[-HTy.υim*ΌδΈW}ιο–X4·œa†§ΖΖΆ(•# . ·‚:Eίn{ζ{9u‘χ zύξψk>„δ’Ν0ϊ)³βK8KeΘ³ŒΣξΏBπ'ςΔ’°†4κΔ/Υn�―S*H=Ύ ε‡·#ˆΦτΪaI!{ΪU“…‘«8;‚‘ή―₯rΪG!Nrxά'Ι΅ yΰwk°#+(ΤΈχB‚ϊπ©‘ν<ό"}¦ ,VοΑΖΐ({Fπ,f6Ψ§ϋ^»ώ„γ'‹Žτ‡9<±Wό#εΐ:A˜vžΛb°_,ς‹§q]9Nΰ¨Φ7w�‡L2@Ξθ ³η`F/θ¬κχ£ –aw-P&‘ƒŸxόDw°ƒ›iŠkΛϋ’ΑβG nqξ³Ιt‹Vœkε[Ψf7RπY�KY›G/DiΧ4 x0΅ΰT:§†‘Oΐd<Ϋ§Γ=vt»λ |Θε{.ΈOd eΗdΌGΘ°ΊCPΗ+“°0+Ψӏݽχ“Ύ»ϊώw‡aθ¬|τψ�°�ξŸΪΚ₯μϋ—_ύμοόΖ―ύΒΪ�φ'kλ©­£;«T'λίt¦lnf}¦.”₯ ‡Φ;'WfAowΊŽ‘E(’|xƒZ€Nϊ,t^kͺ«Pθ₯8CHg:(±9Ω>Cϊ΄SVqήuΚ―η‘Qΰ5Μ�ηlN΄Up@™ΐ tς#ΐ8ΰ g n�ξoώο•(Ο&œ˜ 8Μ‹8Ec%§ s&ττt±g]ιφ£μ€ nb»8rfΩUtΌ9 d?Fαθτ|©εt$}Έ―‚:ϋ8`:ύώέ`RjšΤE1 p�Ρ ”½V9©qΝc]•―2όΞž9oooδslξB Ξϋ�$τCΑwΆς6LΦΫΉΛY‡Zcdπ†aΒAΡΠκDψaΚγSfη1ΈtΗ[HƒƒγμΙ&k» ςΓ€Η~X‡γΫL"hΠΦΪ†|(@Μc>±M>+1tfχΜ¬4™E0 tοœ1oπο}ΊZΑ’Mΐ7�BPς μ:†EΗ͟±¬ Ω”'π\pW¦'Ά§Ϋς‚ΆΞ–tξάy‚\hΐψηJ™4�Ott–#Ϋ̍ζ?fΏοή»ƒ³…s6ϋε>œ:u: :Ÿ5Pέ>�η>“ΖΙ‚(Τƒ„ΟAiυΊf‘θ۟α°ψyL`uέ-Α ˜Χ¬—‚ρΡυ¬„Σ„s`iΔ.ϋ σ``£bΐ’a5’‡ρ+Γ©0Θ¬ν»€‰ξω9dH^}ω:—IΧλM3¦6Τγ@QΦι6s1Β½δQΦΣΦފq„ς½D–�u –4h›SΩ,Π©£ƒλ¨vιάέW‡r{Α`›a^\ OΆ7Ÿς*G šq10²§N­°™!›7Υjι€?ώΩ5vT£μƒ#dX£\ˆlφίΉŸξίήNΟ<σΙΤXΣ@CΚ‡LΨ8…“Ώ•ή~υ*υ˜€EΘ‡{KGGztχχjφ˜šRœ¨ΐΥ 2Ÿλθ|Ά˜ΓΎ³I?…GιΒ…cι/<›ž‘¦{Gqxx8=θOcΓι7―¦Χ�₯^�C¦ξγΗΣΥύ(κ?;ΙΰOŒ³†².2Π―–ξxMY€†s, θΘοpo9~8{g•k«‚½pκΤΩhžWN&]trr4€Ή&¨ΦO=u9Xs3KιΥW^@ ”Μιcπ@9υKŠ·©Ι5uu‰τ’Ψ`ήΉLY)Ϊ3ιˆ·OœbΜ%:f`Υfh‹ΠάoΎσv”axάΨ†?~x&sω¬bφR0DŒΛ€ΐŸέ§Τ#χ.(¦5j³Eϋ1m ’€(ύ2)`柳£�ߊςΠn—²ί³Έκάjόρ:}^ΦΧ}W—iΗWρKΨuJ°›ΌV†°2ΎΓϋeΠ{Κ’ηή0Tί°;Yލ‘DVΩ3—ο₯Ÿ)¨ΐΞπ”P °ρΪ ‚kΌΒ Λ«Γ-ΰ9bM”;Λ(ςΩ3νΉΰš6ΡΟ|ά¨S=%kAΆο£˜«D ΅¬ŸΏ~°‡Lb΄ηΡͺ}ŠHΦ‘‹H64UUMs^e€ΐSΑ>ε ¨@)‡„ 9Ž›Τπy³¬=B‰²ϋ‰A�E@¦₯ρG4_LύC3ιΡδρCΊ›3SH6Υ>ΐΩ}ϊcΝ5ΓΚ©F–τmWHν.[‚d―ΑχΒ³-Π’-ο₯Η”μl΅kΰ:ηΖ$•Ύ¨,€rJLVw_‰]Μι£QgŒ^­,e ˆχoά ksUΝ+2n±ϋν§₯Ο†°WΘ �uJ“ΐ—rh—κŠΚ 3Σ“ΏόWώ�Ώψ΅―ύγ_ω…_ψΕ·�HŸ~τψ[MτŸΚGfq±ςΏϋoώξΟ}λ;ίό7ΆOΣ-4‡.:nΦΝ @C‚ωCΘ ₯s€ΓP’άtξ|θXƒλE(f Xλ,ؚ τΐ‹ΦE”3(=Π@ΐμŠΘ€T‘s m|ηrΜάEπΙgΪ¨₯΅% R(lŽΩa(9A©θ£υΈ›άιιqN‡ ƒ™n›ζPŸEΠb3>³>œ]jbg‘€ήS.PKgιΊ–T"^Mΰθ¬εΆŽv·±ŽTBΖΉ�©&­l�t‡kΙπΦ²Jχ5σo'q3*^‹μ>ψβUƒΖ7ƒΔ?yƒ&šH­`MWWkXH=Τοε=’y½v=}χ»˜�^�1ΗCX@—r Βښ3ΣΙΤ`, 8o(ά#S>ΣBέ6MΦ^‡ƒΛCω2ς²΅+ΜόΒtzώςσPΌƒ0Φeά›td3κη/^&#O@”Ώ ‚5ΠK)Ÿλλ‚$*2•³Ž«₯ͺ†ADΩa 1JR…ΝLxώμw3kƒ63’ŽQΣY4θF$bο”!Ω*Ž'ΪAaMONQH―γ?ά7΄²:€CkΜΘ>dr²kd©,iΨ!λ¬LXs*›Α`Φ‡λ$UsƒΐxύΓοΎ‘�ΏρFΠ»)Ϋp*†ήλΧΩ}β8Mtz�‰ήΆtž~έ]­8ΌΤΣα•K'Υ1ζ +v@i“<ΈFΕ,ί>†/ΌRŸΗ5θhGžE[Γi7Χ)¨%σ1IΆδκ›Χy_κΙΙ*X²²E½©΅~ΑA7ΧΈI]}u£Τ·s[ˆ^8‡>k€Qσ ³œSΗ[e3ύξښFθΟtφΗ ]™γ» A&;xοq­‚Ke‡;ιΞέ›ιϋ/�:μ,χγ}š1; FŽ ‘FΜ^Yζ„™Τ,νQ0^'IΣ½Œuη~Ν\ Œιθjπ }θ”8&²žlh9N‹σΌχ 3yιξ­G4y€GŸη#‚[M™‚‡―–Ωζ5o8Z&–X3κuHΫΫ%λqΪ©C¦ΡέΣΙBždXΈΧͺCS€γQAo…ΛWžd€ή%ΐΏvδ?mΓά2 ‘MPξω|εYΦΕΘS Όλ"œ4;ώλπš= Σ‹~‹&p¬εΤΔ,Y°GτLθ‡Š<ƒ‡ώΚλμ…`mၡΔ8;Θ·cΚΜΦZςR ³Β¦²~Ροδp‡Qc•%€�›τΕ0Σ�ΤΣΟ€K—.§§―<΅ΏsN‡υΉiF„ΞΓ‘ΗΩBg άΏŸ†ξ= ηy–” l™$Qjβ#ΫfpάLΟΈgΚ3{„|ζq�mr›δ6ωΉI6φ ¨C>Ν*‡²\lήeζϊβ—‘;ξΰo‡šΟ('α3έΟ†οoι…ΚK ΛΧ.  FΊ}ήΒ=YB1::ΐšδ#Ώ2Ω²?Ί‘ΰϋλoE©G‚σΓ}όδΑGρyd΅ΠA~n]Cc8Β:³UξY+ΐΰS”ƒ5«ϋF‡E¬`ΆJ,7_ŸηAq½ότsϊ}Œξ„έ1χ¦μ?ώς£΅u†>φv`Ϋΐϊιλ;Ιudν Mψ¦'¨C§ω&Ωβ}œ|GX¬:IGΐzΣ5κώ7 ~md˝°_Θχ―žv}€0심Aν͝ετμ³Σ'>ω,ΊMέ­m•Ab― l³–λΡkγτ:ε- ν”ŠΈf¬UΨvδEΉ―αΌ θΈψ†σΞUδ‘!φηΕ˚DΠΚΩ�™mνhMα/~1=ϋόΣιζ­χ‘Ela_γ–oS†τ―>β3§ΠA6|,εΛ>§θWPG©βθdΚuv 0s1id7uΒf`X#ŒΚΫήΠΩ”κ[š�‹/Ό˜ήϊ2 Α΄ˆ«§αˆ5Y€u΅Š?ъœΪ,pbl,ΐbjάmόθψ_οC<· ›²HΑΞ`)L3Β΄Τ‹ζDίΩτΦ›Wƒήέ`†ς₯Ι2Ν›q>McsΝ"οq-φ°νκrυ·Ÿ[Ζω+€Γ~4ϋΕ~γ΅tΆ„޲T�FœŽΑ”Ήa ,ϋ΄Šζ•sNQQΖ†θmu+\'±lD \4E‚ ys΄wγ}αpbCΠ]==ι“Ÿ~!=qώ$₯5Θ‘Ν!sQIΨ~Lυh±;dŠ©Xύ0Fn§Ι‘ϊ]ΨσΒ21θ�ȏ”mΡς�,LdŒ{+€ΗAe‘ϋ°#AΔΪ¨# ² ͺZS.“Hr΄ ΉΨG8ΐ‘Ι&Η{"€†•‰d@^€„v™ςwΦώd+sκ%›ωΕ™βήυqe«­γΟϊΛ4ˆf¨¬€A^χmγWήΠ pPx»63O‰ I‘%δΩ{Ϋ’ΧௐυΆw:\ @yfgZΆ’²gŸ΄1:›Ο`ί–d$*πgd‹žRμΉ₯ κœ’£Ρ7θHϊ†Ω5Ε–¨π |�:ήΏι{Ε=sŸ €kͺμ bκ«;•CΫΊ…έΈε­Γζψ\_§άt«_Υο�ώy:KφnόŽFmΕkΥ1θqRυ•Ž8g›χΐ“¦ο8׎Ά“°δΊH@ρό½eϊOP²ΐ^ΗρΩloΘπƒ8slrφί`ξύ0HTΚΦ›[KΧoίJΣψλ‡y°oxšΐD ¬η”ΫˆώQŠ<ΝΊqŽCp¦Πϊφx³¬@?Ϋήj¨V.=ξοpύ6Q"Βw!‚„ξ—ϊώΙKη`1ΧΰΟ41έδd:}ͺdR{NΎσΎ!½=χޘL©rέά7�-3Εiuό)ΐ,™!€5τ;‡ό©χήy«ς­?zεΖWΎϊUΣGΝ d#‘Ν�€ώ:“Y­ύΟ�φφ‹―όθϋ«ͺ�Άμˆ¬’ žΦi�Ά‚ρ–BδA—‹DPω»‡D·ξ@Σ8DŽ«FΚw8μ{8Š>ςpόvxN)A‘ΐΊ‘Ώ ζδjΘDbχPN0Π6£�AΉ4§œƒBAgΒxνσš Α›Mιάϋ0η}”x=‡ΕYξ£#ΓατKkΖ­ηΪΙ~ζΐ2πnr}Ž,ΛΙ'8)#“cύ$Ζ-›α"°k¨€n²‘MΗΡ#κ8nο½�"΅ͺΤοk0IΠ­ ‡­­Œ…„φ€γ± ϊΨέ} {7υΣά3Κ­Ε»LπφBχ³4=:‘ξLAIτω_�έ―ΣέγJζn‚ ’·«'kG‰r θN―½zίF^™tζδιΘ~Ο‚ώ荷P¦S>·¬ͺ§½hUM£”fš€λ,Ÿ?�Ζ‘@γ"‹ͺK šο₯¦š–τϊ«―§_ώε�)hl•%4ad/€ΝkPU)‡Τ V°8›Ά4·™(i_eŒ„Λ!]ΗP‰Άο�\Q#!΅ΙΈ₯ΖΚ‚ ‘ςΧF2Z&λgxŽuͺy8Κ”J֏ή]·_~gnaψ[q2ΙLMΠγ˜ΤΥΡDHδγ-Έ΄ΓΘ¬]ƒφCPκe2‘sŒγ¬�mDI€Ϋ·ο#ΛΤςο!²λεΘ€ ½κλ«�Ω‹ŒΪ$ϋθ»ΝηΘΠIίΟc„Yg!/CΣ­5³Š]eΞύ䨔mπΉ�ZΜπθ8c>Kc6;Ž8aF|+ ?ΑΘ’YŒΠxnΣ¬M–JYΉA9ϋΤέ{ωΩRξηΠΐLal™½,ςž]0)ΨEv`vGwΧρτ±½˜ξά»{£όΨaΩΜΈ(½–u|ν+QY ΝΉ;~φ‰τώζο€ž―PώƒafDΉλ›k½Xά£Εͺ*²ΡΌΗΧ₯\†F_?SΙ1γeΖ.ς:F:.f-ύχ2Δr’Θ―\Q»ϊπΑέτƒο�( <¦q Π£ΰ©, 0Yw[(g#V™έC2ρ”š˜Ν,Θ—‘”Ν†Ϊ³A `]λ8ΤMύ 5TκΜZO―Qή%£οϋ�r-Ή PšοέΑ˜Οΰ΄ζpν°@Xu³ε:ΞΈθƒ_ΐJ=` 87£ά ΰθΈ;–4| ώ΄OΠ~ˆώ2 0p++UΗpθŸ”‡Y]eΩ¬™ @3μ oΜΠ<άίΧ»»Α>Ρ4³΄± š#Ά6\JΝgυ[„―~σw˜�πfjι‘WKοΙtαΚY¦+\ ηI7Mήξ₯z�3Ϋά1T…œeN[Ϊ†rdcL<7�Βρε~ Y‹ x²�•_f!₯S*οRΤέΰͺϊBτ\ xξEζW"»TIωH-φΐΰTφJ=qΖΗΗΣƒ‡w8g0KΈ΅m²?EEΤ7³φ�¨Λx~8Β6–³tCVrAXΠ<:l7Φ7Ρ‡β φ™ž8¬£Ο°\Σω΅,I}₯γhγH4}VωΎƒόͺΧt,ΥΡ‘UΗ”xΞ9Έ'NΠCα™9.pτ§o}γ;‘Σ‡-aN’#ΠίhΐτπώνΨϋ}JsJ(ρκάI'› “c~g1« ،�pδ΅ M¨ΦΓάj€ GΟJœ“ Χ™'ΞaSe:RΖΠ±6»Ά±y[ΘΈΣGφ˜TβΊ;ΦΝk$T3“Γ M³tg¬?Ϊζe,ρwvLWd‚8Ζ,˜ δ”σF�€`sZϋ86―ΎZΆ½|ζ pΙ\Ίθ„CψRY0G½£Œ‚λ έbύψΦ6φyŒΠ0cγMžχ@Γ„‹™PΛμτ³l4*`ΏΊδYΈ ]¨ΒϋΆ!―­°Ρ¦¦'θ)α$§œ4Ώ2ΓԌΚtςΜ)Ύ[‰―ƒ½°ΫΟSNςεΣ�χΩ² #{{Τ¬ΪΟΞάAg'g¨C£δ…Χ¨_M™/ΰuθlΦ«ˆŒ*ψβοxQ°k�}x3Noτνβ|gkš`š�Κ½6-Υ’”art&UΣζψ™½T5ΕΨYξ‘”iG‚ρ₯₯ψΊθ±j,–2 Λ�¦|6{%pŽHφμN<ΰΪ½3ώ†;­ΑŸφφ³£TYm‚Κ²TYω0vs)_Ν,™1ΦOΡ'b©�`¬A€Α€ε–ΦpΏΤx°+η#ΈσάΈ…¬‚ g‚,²³ΏM Ύν(%4�Η%ωUτc"ΡΗΩΨEŽΦΦ¦ƒ1 _wΘ=™°ͺ$ΰΦ_0[/XlŸ± tγ6zΎ»¨ŸΝν₯*|ŒL–Μž€ΣϊΔDœγd#–―ΆΔΖ΅ϋ!C\3ύLгΉCσa=υx!BξˆΘžc#D6Ξt\1€Χ?,Γ&ͺ»m2λΩ*-εZX+Zύ«R@τmlƒz<Ÿ=ΕΈƒOnςΛΌ£,žςj&αWΙ�³Tΐbύξ"Ζ'ηR–ŸΗ™ζ"R1³FΆ£ά ~uκΌn4ue׌΅υυ͌6­ŒΉφζ+LG FΖ8³UΑ,Xƒ₯$˜)3@ϊ‰ α6¬ς½ά›ry83€Θ9kdΗt' �¨3³έώq¦xNυ�χη8Ώ›d™œD"=WyΚ:αŒHδάΫ}Šue,_ΕτtΘE/ή»s7 χ?€Ιfθ€ίH$0±SΌ¦γέ]˜=¬εcœqΟ{dBΩWKΓ€‡[KkCΣ€ gΕ;Ξυ‹sΜ+ΐŠΩ'υŒΟ›dr‚:ˆΐͺ΅Ή9τΊ2b@+SDέmC·m‚‘~ΐ˜cΘU[[',’ κίνŽ|­ΒX‡ f³ΊUτ³6EΉ•…`ΐnS6υ†MΠ”)uΏ―Gοη²Ύž'κ°―@ι΅iε>g@R}€Κ *8{%π'}V9±Τθ,zϋΚ•§(ωj`΄ν‹aO|Ν= œΜ“K0h]t8nΘ—ϊ0‡ΐκxί‰tކ³ŽsΚΐ":Υ9πmΝm¬'½@8;άWPΒY©¬\(:‹ΰœϋ‘9δ©‚u#`dCHτ‘ώΑ3ƒ'iαAΧεœGsBξS¦‚Y%§…ΨΔSYφš=c1/}αΣιηώΖ_§wHε$€$ά³`‰΅Γ2v&Ζιδ ¬£›1n­‘ξЦ]fBm*φ˜žn?ƒbA ΩEΪ_~f°ΥΈ7‘3ú΄₯³gNΖޞ―%«_ΖΎ:’oθέ›dz nΡ�ΉΨ—2ΐRθ5·uw!χ°Φ(™”IδΩ­b ΩΗ^ϊ,“D:BΙφ-ΝΑ XBΗγ«ˆ ·“ΉΚ:Ωΐ~'1©†ηXJζhEu–ύdrp›©k\¦θ}8ϋχ±'[°al¬[ΚΉ)£©ͺ‚α‡�ί³¦“]PIyN΄«ώΫr wG;gP2χ=5°§κςŠJΛh¨IΧΦγ;ΐib‚eδθ;Ə‘ƒXΜ½gψ†E[€ΜΈΏ‘Α…‘`O"Ο =οgš€£ε΅±‡φ βςxήv“ \T—ς;m—υe„μr–:Ϋm> š=ifbΎz’ΦX#ΊΣ€Ο 'ύ{ΩΘnσaiZLΘbέ”#YqΥ€GΪ©e�λK ϊΥ±žgυw>χ’e‡8qν6m,Ζη; 9TGrδΕgŸJ­ψh, >—φ™xu¬»;šϊ–SΚΣ„~mio£T‘ΥΧﲆŸ~λΤ…O/§ι‘Ή4­|‰OίͺΦ€ ψ2ΜOe†ŒJωFξ Ξ8ž½,“ϋΐujΤιΫ”.μ`'χπΑdΚΪt7Ώσ`e:νQ–€ ςα^q1ϊkKuŒiC.τ‹²,/ΧOΜZ|YΡ@_‚³―žSΚμk°00 “m]―ΟΎΏ“–¦q΅ΫΌ·lΘMu;�“υ’έS¦‘Φ�£Ÿl€'λΜςG z6bΌ+gpΫιΨRΏ΄ž�yΞ—$W«ΙEψAsWzEΙ8uΟυYήΫΠ–�‘Sς‘S9[ψ˜Κoτp!Π–΅PHς.|Ξζλ-‡Οd‚e1ΫvQi6 ΐ)dW;ξυ¨›Υι6ηcCΏΚ °Me?+΄"ρψϊeΌŽ‚'^—‘ό5ω³ηΨ >χλG·c�Ekgcχ<εEέ튫XσΨ,ֈ  Ȉρ ½–&G)ΫΆa<Ι|7ΩΪ‡|ŽΧ₯­rο²`Ό}°>[YςK‘PφYδTίC@Α{T“ΈŽ>33‡ΧΚq$½λ.X½Θ~ΩΓ@&‰ g`˜ΪoB?}|ŠrΖ‰QΨΠœ XΫ0ΈυSΈ�πQωx{ρθαΛrpχw‘qΧ@ωΠΣngχDϋΚμ“Γƒ'‡~qπύ·sήΌϊ½[_ωΚ?ΝfŒyΥGμ d5αŸ’ΥΘdΦκώ£ŸύΒίωπƒχΎ\Uߚ· »@Υ c!‰%„:šuΨγΐs„�W‘‹Ό9ΦE:ΌK§Ό Tο1*f½±(©ŠPΓ¬Ρ�XZ οί¬•wξq+ΩL3r:P…lήΟNΕCί#ήΓΖ,^)[ώ½…€ΎƒbF«½£5$ˆnnoΗΐu’uΈGύP[R.?ΧΧzx6 Q;Z‚^$έ–ƒθύ©Μlf½Χ©“=©žΉΔ­ΤΠUTRC…!ΞΑhuvτD >ΖgζβΔΩΩάq@u41,}…^\ΓΨ΄Όό¦X—θ؎ΣV΄Gz„CΩΐΔ…›οΎŸ~ύ7~‹Ο₯ΞΓν,υ}”~ Ζ‰’2σ1f tΥP,ω8TN©λΉΠΈ₯mO€τ{­[[χΒ‰�Δ©·ΙΚ™SΗ‘ΎΪ‘{»kα&ŽfNκ>֝1lS3ΓιtίΉτ©Ο|–,Sϊ –ώ4 2™ZγYX/)Jο:?»E( ²a¨•ζ\€λ56«¬₯œ2¨ Šj€αxEυ Y#¬α:@ωK)·'DΜMζύ•ƒΞ₯m6ξMj@kηz_S†ƒQ›ΒΏ ŒHwkΝgh`ψU– 0"x€ρΨΘI“#cG‹ΨdΩtΡa˜ΤΰĜ;!@­f€žŽvz`-*aΓ! ΰΩa,O)h±Y•vYΟ|Ιƒƒ¬‘Φy =2€ ZΤκ-~Ρή2^«œGΣ$(…^R}5τ:ΞYΧΘΟLΣΉ™Ώ•V΄ €uBΘ^™ΝγšlδXJϊ)ΓοΧ‘¦lh +WydVΉαl ςΎoΘ…ηΗ3fΆIΞ k!xdp^ΗTŸ# ₯ŽϊtλόΝN™Ω1Λ»mmƒt C³J-tη d†L½Ν.Lˆ…ι]ζ²Σ€ §!¨Θ"g―ςaeEC'ύΏΗΔ}�ΰΔ7�εs/"eͺΉ4¨ύΰ6c€Ÿb²‘’κ—φ>1H΅_ꀬ§BΛΣ°WΐΠY#ΦY‘Ζ­3μ#Κc0Τ~–샃žž.Φ-@»ŸάdgΨc§WΘ~RG™υo {…ΖcPχdmcI"\³Ω eΤμ³{f0ζZzΏGθΒƒ䳂Œ±ŸΝeαΘσ?ο9(–\—ΰAΟθ±l’ Ήt¬hΧΩΎ4H`σΞ›Ζ}’ 1Ω‘‡$Κ¨‡ŸFΜω*†Ž½:¨CFΗ¨‚:η�Σ§Σ₯σηΙ†Χ€χήΈF}γLΙ%Θ§Li…†_νν¬£ΓφX^€L9~� Υ½%k+³,ۘKέIƍ³¬ό{ώmβXΙΩΈλ—ώΣΏŸ>σ…Ο₯η>ΝΏ½ž:W€@Ι‚<Ψ6،w―½™φ=κ»�ς$υvGw=³Σio™λΰάΨIZΗΝή8–(AfΨtΊ&¦&#hƒΒm†—εEΎiώ„“³ƒœΆwφ¦[7ο²G‚'Žύ$SΞkmΎi ˆr( θlζκΒωKιγŸόΊ…μ4χcΰΦ,₯}±ω Ζ>+³0% œ†RơʞΡi›Μ@/ˌ²ŽΑf„ηΟ^‘WΞ‡ά3eI؜]φˆ#Η#—Ψ½ααa¦�\ppά%SƒXSλδ‘ΖT2ΙΈug!Μ/'!xogϟόvb * tr:φVsVΡ7£.=z4H6κέΤXۚ§‘msΖζ u+Σvš/ΐΉήgίsσсȗλeΐhFpη>ρdΞ²`²…�Ω£tH§yχ`)žgΙ]=%^.<_ Œο¬― ½lΉΙ?όAΊυύΧx�λ‰ή„iPŠB«cίt’ ό*šj�₯V9€εμ·ϋyˆά𬍆‚ϋρΟ|.u΄΄§ξg€^.%<§gs™²=“o+³3ΨεlsOK 9Λ- Θ€ ζ ("ΐεή6ι=Σφ©eŠΓ&έΥηhz87Η矼”^Ύχ>#”zΥΦΑ8 Ργα2Ie¬Σ. ͺŽ΅šϋζBXPBΰ₯_$θ­²ΛΪ±ΌΘΆ”=5!Σ�Ϊ†MΘNa@ΥΰS”0δˆbΛ,ް£2™ΖbP¨,„OΕϋhk•,½¬pΟΤ±Κτ6vZ9Rg©�,Χπ»Ÿr’LΫ€Ρknmjΰ=±›άƒφή vπH™ΌywŸ¨„ΙΪθC˜ίΨ�Èλφ(ο<΅ oxx€r’ϊwX7Ος96snii ύ·Dΰtμ‘IƒR›ύΙ–tν•s}ΆψB· ξΑΚσgHyκ]φlΕ=n―εΜ kc°-ώ»[4‰ζΊ+™nTƒ²±�*ν΄Ά€�.sΛΜ9ΘkG‡G#-]+₯7‚% Γi|`†ιT­θ9οDPF޽ΑΪ³Ψ¬(·Eoϊ}PKϋf §ώβŸμ«χ`#8~šS†Ÿύάt™‡ή§ΰ�΄œͺZF?VxM–X΄λ+ψ^φ4±™ςz_ŸLΣi2OPoΫ>69B³ξ%ΐ&P±'2ΦdΨΪK©�†ž |ΞΜ‚Œ€@Ψ~6Φ:ɌΜφ-αΈNuΌ”χBl’MXGΐω<|d'Ϊ\Β8έ+ήN‹θ+¨Ή‡Ψ @%^Β} ΚS‚ͺ~β,Ϋ‡ay:¨5@-"Γml°Λύ¨ƒ] ϋpΩTΌžkψNPύΧ7Πwψ?”M³Ύ‡©‘x#0Αu0KΎŒm֞ r–ΰ{›€4~p½ν΅f9²,”TΪΒί”Ή²‹Ÿ"¨―ίXΒπ·Jxό{z™pύ#cλιΰ•kιΨΨ%«'SSOoΚ­mfŸ  Y#Kάk/֊™Λd:dŸ-ιμ9֌ν-Hoπ@“Ψ‰ΧρLΨΎ0GYzm¨΄%vφΟRŽτλ,Q· 8p[b9ύΜμΩ$Μ6₯΄lPY°π&2gΓΛGύ“Θ66=Ω‡Ιw°Γφ Λ`V/�ίΛΆμ«ϋΔ ˜ΎUτšŠΟ\’dM[ρΨΏ=doη:vωύzΈX]Γ—£έχaѸΎV{�?ό�ƒ�ΈϋκΥ—�α /|nš½ε•=\}‰?mΥ_ύ Ÿύ»ο½χώ/5vwη,#|�«61p›f$ ΕAtdŸTY B"•ΙΜ‡‡~λμ;Ο‘2¨ςATe�βύ‚a€Ζ3ƒ€BΙΑn€Μn’$J80"XjJ l|~Όζ'H—΄±uœmΑƒ ϋ,J]½–Ϊ2ŸγŠκΙ¨ή|οέh,΅JφΑ Α@�£σθκFͺ jψ Ba%%ΞƒP\κ‚άθ–lζhiEΊQ FzŽݘΖΖyφˆΉq¦ŒαX–3ω Ζc=ΡdnΊϋ&L[�έ™νŠΚ­{χΘΌά ζΖ2hvU PΛ2ά흎@dm\“ƒbΤΩ=MgαC `fΤœ=Αš"Φ΅ƒŒρΨψ$έΦiœ„±]aLΑ1…bn&‚Ύ\šχ9έ›žyςYΨΌ/ΞηηΨ;)žΕ1βCœώνUœ»ϊVfΦO pŸχΙe]_3*ε]2@ֈau™=ή ”Ÿ5έ”m(Π²MvQπ{Ό^*­Θ|^!H< [δw~‰ϋ.cο ZΛ Ϊtf¬Α·ΟƒJέ}Θ₯ζΛ{6Έ™FΧ5LΤς­’eΞ―a\β ΰΠDj=v<τE}ψΡ�Ӂ’}.²Β8A3€Τ‡·΅·₯γ½P΄0‚…μ•tJkϊ1“Ž4Ι„τQΘ%γ£Ί‹†›?qHΤ~ΦJA¬!ΛTmtmΙΪ4i˜ Άκ ²γ˜zύ2ά—ƒƒU;œ^Π�εΐΞ€₯%: 4›±N§a,ΙRh€Y3ηKq]£±g€£κ<ƒŽΪ«ΐΰY“ΞΑ4ŸΞy„Z§‘Α€:’I§�L«Y{RΝ½.λq«Ή6›˜Νΐ81£T‡†½vBy=Y�ͺRht,͝[�ΰ…£ΠX½prΝρa@<·‚€‘}a―Ν&ω7©₯‚Ka-ωΞͺ6Φ1“›Ϊ²σ,τ L‘*κFλΪΣxΡρ‰OcΙ)>H4ky₯S/}φίI7ΎχZš%±•W@IDATΚfΥ;Π—°NjΠ΅Α²47SσΩδ“€�cμρ*z°€Šf΅\³ε‹7~|=Ν.Σ»E] @h)K g€Ή­#JΝδΚ0ψΐzPR‡\a―,ρθΆq(� ½m ² ˜{Ίz >ͺ�[?~‹dD~D;Kή§;)ΐ ς«φμ?>˞‹@OA^»{FZxΝˆ CΟζΕ>’ΫW±έNT�ΞΙF˜ΖΗ0`ζœ§ώg ˆΤidŸ)1΄«=,QγΒμρΒ#Ι99"³iπ'ˆ0zΟ‡Œ0ΑdO^Αη 2θΟφdΘcj–ςΡρ9LϊK!σNdZS7reμmί‰NlQSA=Œ-•1UBi� }{ee φGŸ–¦zό”½²24>Δ™ήgO'lƒMιύ”9` —ζa)L²?Ψ>šC:{^ϋιy1ۜ]φάpξvΉ>άl3χEΉΠ ο=91„_ΐt€J‚Δθΰœ‘%@R“S‚Κšχ/Ϋ’» qя5”6€�”w ζηH�`š…Ν!{kbŒQ€uοΝ¬w#Σ›κ*rJΒw*Ζ―©(c½ν₯g@�ΐ&Rk^‰O•Oίƒ#ΐ3Η–Τ’C˜Ξ°<ƒΐW™τ,kΓΥw‡f¦Γ&ΰ�aΤ κŸI"­€$Η Ί€³Œ2–ƒύπμA6m¬\Vϋ"gͺώ\€:κžΛ=ήW’Œ³Uϋmfΐΰ€φJ:;.HΨcΩF�U{΅M!`£w– βgj`L,p?άGœ©ΞΞ6τ-¬1γuzoΩo‰•¦g‹`3χ}ϐβ”&x¦£(3Ι‘ό3ζ­% N«zαγ°{±υC“£ιπΑv‚ •uͺΓίl‘ν’›‡ΚΎΫP�ZϋR9‚Χ5ζvC7*[ΪνC;Xu9άs†xΕ„\>ς�2·ΩW’ς |σ Άchk”6DŽΚ[SmΗ)δr½–.γχ΅u“ΠΔΞpψL=ΑZ œ³[�Ηίl9q>5χ [ΠA›·nΡΈsΠ ϋOΉε(GάG0̝T‘=Ϊ ΄¦˜΅,�ϋπ^ `–Z£}4~±ΔΑιN\Ι£ŒΑ³.Hd�¦ t­Ι³2β7™Ϊ&݊ε‰ς‡ρ1άG[+6h?}�‡Wρss™+£A»φΦζͺUθތ@± ~“bόgΓpΛ^ˆrπϋΩΨπy]{YNτςΌ“ *d �Ονψο›nέΊω‹_Οd~&G ϋθρ'8ΐΐεlΝτ?υεΏφS_~�Ζ»žΜ`˜άιxΐHYΚΑΉ4[‘ν5>"cvHε“‚n° ςikCα;�Q€΅Γ©S£γŒ4q@�ψ½¨°M² ψžΗkνž_ˆ�Ο!³g™B3ί·@c†aΥX”rŽμΒΏEvΐ ’Βμgκΐλ|(Τ4Δ37Ψ‰ρ1²π5d[Pp4CΡΜS—ΨΦvŒŸΝVšΡ¬ 6‘₯ε %X ]JcΊk`†ϊΈΊœs”‰Χ=>>“ή½ρ!NŠ@γ‡2²ΫΎ#u�Τ'ɘ €‘2Ά4TZX\K?ΎΡΟa6‹M „1 ’CGxQB/άδ@οΆΙ�•�€Ο V'$œ]ΦOzΠ:K=κλ‘�‘Υ…<Βα1H¨YΔΙΧ™<Ϊ…�„am?F“ΏŽγΠ@kQμ(”Κ΅‘« ύU(@ΗEή½�0½ό­Fΰ―sΝE…jdω€Ξ”λ§AΛ ΰκ(Y@πw»μ΅ ƒ]Πg΄κ‰�θΈ }wqπςm>ύ―…fF±ΑΛφ{N*bΝ~Ψ{ί$V•+ ΄…oΈ»ΩΈΥ%:fταHϊήο}T7‹Κ μ˜™„ΊIχ�¦ΦΊτΜ‹Ο³ΖτB}¬¬».€ŽΡz_–₯H-W¬]Φ —re^3—:κ=ξλ š.�Œ‡έE0σjFΪ‡k£²ά_°”„ZS2|!ΚΤ.θ:ρ6°ΤQr4“χ’‘ΐΔσoqœΙ E¦€ςΠί\�[j#( �ώ ά°³WΒΑ�υvτ…@.vq ΘlP{lPA6ΧΜϊPΩU0[6€ΕκŒϊy�ΟtN––qΠ¨υμμμ1¦)Ψ4 χm½ι2_ω†@Ξ§¦Ξ,ς>3Ε΄Ύς³€°2ΕάΰΊ•“9σΤ“Α4‘FɎΕyw±\ŸCŒΊΰΝ>Ν2¬© ΜΜ¦œ4“-΄4 •(όκ―ύ/iζΡdjΐ,β\mg`Nδ3>U`ύ]ΌŠl(ςQ„άΘ Šk­ž(@ΞΌΟpWϋ¬Xbcΰο1ΚΉάC—Hc?`έ άΝ8vφv‘ mLCΓƒΠW'©΅1kΆ‘kΘΒxσY–d›EaPΩ³”RcΩ'=3|foό.0VĞ 0˜©3ΓΎ°™­Ww ΰ)²A\D΅°VΖ‡F#c΅.ΦAίGwΜ�%œΉuζ‘38FHŸAw›Nΰs"Ώω/~%˜JΝNsφ!ΩέήΚξΟώϋ9ύψΪ[‘a”"©rd§ϊΤlfr΅kG‘Ό›A¬,Ϊ„ϊ¨sˆ~°\Ν yΖ’ΧΌŠμmί —I7ύγ8ƞ—όΤ�^ϊƒτMt1MΡψͺD'«γv)‡0fFΟFRΊΦ²ξγμ=ξΩ±`–‘ž΄„kTv¬Ώnλ芾ΚΑ2Ω|™g²°T.ώύƏœ–'ΖΉV9tˆ¬C…c“›·ΗgQoΜοO�θξi! n£―/₯~c�ΣΟΌ^ύΑu䊌-ΝPΝσvρVώG}lνΈ%vU4ͺ¬α¬Ι$RΠϝ?ƒΓ9Ÿ�_½ŽΞ<Γ€ΩW‡DeV‡ ϋL‘A20πF[=ΧE¦ί9 Αnλdh=ΧΕ8ˆφ?‰~θ_ƒ"ν‚₯j~ΆφU`NΗ=l€52C€ϊΟΏϊO ŒΤϋ”€ K–Ύšχ2ΑΩ;ΞΊAdΞΤnL…ŠΪ†΄Œmˆ²0εΉ΄΄f�@Φ&—ήΎYΌσΙ<™Ι¬`ΟςΈA#œQ3¨–θ5P’W”‹ (€Ρwλξ4ΠE―ύπ>μˆUΐμΣ0ξ`NŽ΄šΓŽ03^HΈOŒ<τΏ€ηζ3Ιρ 28τÏξ0K~'5χφ¦g_ϊwΡω”ά₯Ύz5’Ž8΅‡Ίo€κ~�@ψ₯μ}!ΛϊHOΪν= Όξr€“bκhžI™ΚΧ;o߈.ϊ“ΠΦe\P–ŸΪΡΟ|ϊΣicb‘Ρ}€l€me•4&δ<θig Ύά΄‚9–B)ΓΚG ϊJuΔΎnοΝΕωΡ2F 8ˆ_“eύ₯»·οpοΥ©·²‹³ιΨNΊΥs†ζm6+` »‚€HFƒΘΆς]€o¦|„ΏD@-( ^V₯@ƒ‰ύG;gG2₯ °Τ/_`( )Ή΄Aλ!%ΛηΝM?ϋ₯Ÿ £±$ ΊΫδ‰ °ιϋŽu3cŽ’"΅Rώ²˜πΪ? 9?G₯&Ζf+;~6³BΌεtΘΎθ7τtwΣΧ½3Οhn2αŒΜ6ΞΫbύϊKΠ₯²γ–8“f±νMΤΧ Έ`’ƒ ηώΩHΘp=ڞΘςδxώπωlΠmp[A�¨Ίζ05κ­βΥΧU¦)&5(NG²ζΫώδΘ¬°’ΤΠڈΡˆΞαυψ4 θ½JΟJψb2U,ηΙΪΊ₯iδz~ •}W [LΪ·{ PΓΘΰφΑ©OŽœί£g-'ΩƒΉ!h BpH`ΎN½ώ6YΖR!všνΕW'ˆ$Pώ¬Μ+›ψ‡τ[ί§Ή"‰Ύ5όqφKίυ ]jπΚ9ΦΧ2™PΒ³ξβ—ΊWΪΊbt“²&(΅½ρ‘χžO–§Χ}ίΣ9έ·sΞ“gv6ΜΞΞξ ‰$‹€-Κ₯*±D‰R•\eΩo\� š2 T°Kb•ΚeZ%H©d³¬²H‚D,�b›fvςNžΞy:ηp;ωσ9wΗƒΈ‹Fχtίπϋ=ΟyNψžο9‡‘Ν°p Π#ΚλΕιύΉ}σAšaŒ₯,‚|Ωκδ"G7.ο1Ρ€ύ,$HοΒήαΝΟ…>~ϊτ)Ύ 0ώj֞D‡λΘγ=_€y,=žΖ)!Q…Λ�”²%›+Ρ+HύΎ†�<„Q±B²LΖd‘ύzؚθK“`xαχΔ Ϋ{Δ΅ οσ₯O`r$όMε"@ƒn=$0Ξ }xγVψπNN©gΌθάΒϋL@OƒƒŒ­¦”™Ύ8²xΛkι‡BI‡$Ξ6ΏLΕ¬Ο!ε:σΣ#μύn0\ΛΉ»aNYr±CBl€‘ζΘ:‚λ,£μp ϋεώψP—λΧΛ4ΦΡΠ�‘m λΐk–₯ηί}ΊΜKz΄ϊ ιλh#J‘y‹ξΑ «xΙ ―{ΝΆέR£UDτ7L-udΨƒΨ@γΣψΨψF01τΏe‚ι hJΥχψ"Q‡ψ2τ}3‘k?Ώ£Eγ:‚ms°�Λίόγ?νκΏ}χ�ΰzώ?μζΟφγ3P€Χφ›�Λoώ³―_{³νδΙ΄Œσθˆ"‘―‚kΓ9ΑΰԁJε0ά:OϋU�’+ €5όFΐ2 Ζe€p{ ΜzrΨU R>χ‘ό­α`#baHωk:έ{ ϊ0FpzΖ&»Π(‘Ή"ΈŽβΣQΏ`(£–Nε¦&…ΩΪj³zΞ©ίFΙΜ}ωΔW�λ―�9œΎοτ7px@šqζ&q&‘NJœΩδ/Z ­ ΄Ž@Η�άΞΆqc$SAIBG+τΆξŽΘϊ>xπ0r°ΚitSΚΪl2£zamŽ{…Υ΅άBgςα£ιtυΖνδθ“»ŸLta*©Ϋ δtmm/Νο¬Π€ͺŽu\‹ o‹ϋ7,­"Τιπac9ΡGΧ ‡K`Εlΰƒ{By¨ B‘0ΖΕηeΙΈVTΦαθKGuF·Οr�)ΚΗ†ŒYΗo=yB³΄EαθIyΝΠ`Πf΄­‘3H`ΣΓ]φΏov0$Χ§ωίCαεpBuͺέ– ”“=#ŽXίCha₯42σβτ'IΨΰΛ@Ι2 ¬AHK‚Κ‰ΦYŽ rβ�U�3_'gF§ˆϊΞ*œ½ζήnΠb”& λ₯ΐ6΅βΜf˜“>؊cΣ”NτR:€LεG ΡPαΡI/$Pρšύ2ΘΫ!°R!Η(Sƒ!-Ž�£"Φ¨WΰH™)Π!³C―5dώ-žΓ:θ$Ζ<^δήΐ)ΡZψβ5d<1`165F&b' ΰœΡ8j·5 9ίƒ³( P`FjXMžΏE`Xƒq]Y˜M΅YΜzŒYΰFg‡Ί: DΕ kΛωω-ΗY΄¦Ξ€ΤŒv @ΑϋχξEπjΝσ<™H23δMMRΥ‘΅b€LŒ “±§y[)k#₯t•ώ"ό{[Gijd"v‘™Γ°D–‹½uίΜ<tX’β(T:¨ή�k½¦bΐBiゐΫ8i΅sΎUGαR ’³ΥΦά³†Θ–}©η€g= ΐI…·TF   37t€AS쿎»λYDΖI½Γsζq\9Φ?ΪΞ_ΫάάE–RΦLZ₯Ω;³:ŽAGεlzιzKο΅Ή©TΞRWA³΄Φ–ξ²ΎŠˆ²}ΜηpΣΘ8L)ΦK ΑŽθeœΕ Sue-”ξ~Q^8?=•–ΩY’‡œ­3$‹KyΠ€Ο)ΥΒrτl){PZˆΣLΰ³°;•κ¨�ΝαX}πύw"p?ωΒKιεΛ/‘UJ³S3ά7e3‹c¬™4ΖF.Ίnβ8’©8@"ΛΝ>κ°Π/..θβ½δλgqτΈ?©Œ<Ξιυόέ―:vηA'˜μΦ:κόΜBμ•l?‘4φ²’¦”θοJ°3:»f χΉ{htlμwQI`?xφΧSL‰K7ϊƒΜ˜ηYΊsλϋ$ΕSƒL g ˆ@± ηu™.£ά¬½§'½pρε8£―Όr)ϊœLΎ₯BzΙπtθ’Ψ>φZ:ς%ϊΥΌυg?Β°l Œ±wΕ»κ·c2Qs°žΖ(ΏΈ€.³Χ΅ΰw¬•rwζμΩΤNΣΓο|σ›Ψvνηzxβ 4?ϊθjLρpYmΦμΧ~τ i Aξ1Aε;7S)A@1Ζθ{ΒΘWΞP8τ€fj(εagσ½Ld2θ˜ή\R1Νd[S}΄~l{‘“‰ΤedάΠ‚€{…Όoτ“αg› ΑύΙN«@‡„ͺγ-?ϋ΄›v*ΐWV6νΒοΘYΩVφ ) ‘lΧΦ�œM=ύƒΔ<€=-νΘΝγ§"(\rνο¦kG?„ •`°Ž@ο˜{-Qζ9#fΉ«›Ηw'l‚W70'0€―=›.}ι«ψϋ1]Γ>B•Pmκd2šαeu’Ή2φ’Šr‚jœν(ΑΰœΨϋ©c ‰ φΨ`Ϋ¬ž z@’ΩΌ…Ιδ­0N2Ωƒψ…—/¦o|χwΗ‡/ƒΝ‘χ}­IŽdΨ§0©›7θΩαTώ%֚%δ2Κqw퍠£ϊ‘„ΰIίκκΗ·pΰΉtΔΙSƒΘ Ύ¦ £“6|?―½H–υ,SŸ»―φV±†>œ RmšgVΫξΩp2Žζ όy›§Ν“ω7πrtbϋξ˜;{“€1§ΆžΦtεΥK°+{Yc3θ]μϋΪ3J=35Θ}DdAΆ›};:[‘CΞƒ~QJσ$†U-ΠΑύΫ/ͺž²ΑAΚFΧטz΄`yiK@ΙαΜ8B* -x/ΛΜ€)ί„·œ‰C%εeτZ 7DL!P2ΨUWɈQ&dΙ`{τ— †”CτΟΑη=έάD� bΝ-0X›M˜ 6±[§ΐYηωΙi>ΡΠcsŒμ†š_l`LŸό¬“ψΟ=μƒlΞ]z‰0αΐή r!φυΑ9 Œ@ΛΰW ³Šλ₯ΐˆΟ`(ΟTm–·C³ΎόJ6Š`@j|²*ΖLΛ,X"›�ΰΡ &ι߁ž<΅ΙœΘvΚχS—AΛ8`οΦYχζvϊw`»΅Y‚Ψ–jsexuχπΨ”r#2Ζ–+ΙΘΣΦyτ+£·Ί=ϊOagšKšπ΅Θόaƒ° $δΖF‡cŸ%6Ω£ͺ Κ eZθ½ζζr@šΚ4ΠίOΏž(ε5IYίB―—BF§7wPvάΞΩGSξ•…εcf|αόμ‚ΦŸΛ*ήi™^ά_owkΊr=jέ:€AΛ#dٟΘζˏ'§°Ώ{ŒNt2ΙΒωЏ³l'‡<Θ*FwˆMt.-aΚΒς-ƒGRΡζŠCΓ³|Ωύέα3Κ�Ιώζτ΅_ό‹€c”IξLΓ|‚…Jrɚ΄S&³2χ”μώTώ¬sŽvω$‚}όŒρτΖ2,5&ΉνS²gLaΰ­o­?kKˆψ}˜Ρ_ƒ±'2΅Ž]7a&Ϋ8K&Ÿ±W[36Ω0‘jiŒς½ [Pέ^z‚ΧΑμ±oIccφ·>=|ψ8Δ]δBίΕ¦βρ€­ 0ϋ.π¦o’ΟΌG|Ζ…ΰ·ζΑl“GQ–‰ΞŽρ©\Ÿ6Χχ•ωΉωω—�›―½Ί|Όό?ΧΤϊΖω·�Yϋ΅όgφq�ψΈτο�υΏϊk?~χ_ί+ͺ 4©ΠƒΆƒΐα°9© Ÿ)ΥΩΡ‘’7ΖŎ‘�Φ€ Š�ΛΦ)½�‰0H­ή c ’Brδ“Ξ]ŽŽχΞ{6λ‘Q+ΞΊb•Ί”!#l­r ½NŸ=‰²dδI%$ϊ₯#jVN«A²Ηζ� Τ€ΉλdbΘμs ³: tΣ'“!Ϋ¦d[Œ-ŒΌλmœuŒƒιο=T:`5(l+ΰA6θ`Vp{(bΐ‘Qκίζζ  pΌHΏ—Χ؈˚�3ϊFŸ¦3axŒί 0 "₯HΦCΏ@ΆEΓ‘Η‘\T’ΨύwΎ ½ D…±γω»R.Κ Λ^Ž?χηDξŸl˜λ%"μΛ1uϊ2 Μ‹ sdMΣπΣ‘4γŽΧτ@(do₯―vvtAGo₯Φ ͺλχ²eyy‰Ε98ΐ~s%θTώ/hΔ( ‰nέCλ׎Ή>�τYφ_ΝΙ±‚:1%(ω†¦ϊΤέίc-₯)Ξbˆg§Ηb¬_τC| ƒh₯ m2θΤνεdΜhόŠ‘M©εž΅ %μuݝY²|' O’ΕꆑέMl κφ,―ΓΡΦiΰϊ4΄ή‡A†5έRouΒuJDώ½ˆΈWΦΐϋΦΡΚg,]Yά;r¬όλ| X£§θ5Kυ²ι¦ΞΚsg΄6T;Α‰M²ˆΤπYj129›ξ?yJΓΖ!φœζqξ+k‰9Γ Πμ §ήώ!f|5tv½v’ƒeˆϊΖΘ�Ο?›OCτ·C=Sf6EΐΝT�EƒmŒ£ΣRhoƒaΦΌ‘ΎΖLNΜEΟ’ °Λώ φ =xDi 5΅υό° Žς( n°mπ¨ΐ4ϊžς@"Σξ»YY£1ƒ¬+Δk |ΌΎ]dÌςzgŽΊκ�τ�ώί¬ΕD|Ά5¨6ΚβvιxŒQώτμ75S’„‘Ϊ!λ/ˆε™ΧˆŠŒλ£OΆΘžY§m γ~‹Œ[v“_ d•uπΉΡEœ,K9,Ρψ–ŽŽtJu3Μ©}ξY#\¨1TwΙ’¨%¨­μs–·ϊNLΨrXXσ`zhΜω›μ {0(Uώ§>5R熽őAr ΘgΜr•αΘΨΛ…εό1αvΆ€d†—θxΜ(\ υtœ=κ8iΠΆ‹3βΨΟ|φ(<IŒgό€ζμψtϊδ£ tιΜΞ=vwχΐ,X§΄αΝόΪ‘κ½§©‰δ\ ΐHS<€έ³MŸhŒΗ1q*…μ plβήΠΘB°�ΥdAΥ‡5dρšp[pϊΚΡη,Lܟ~†Ν±Κ)·©ΔΩφ<šJšD@UfFΩ‹ρΆ¬BΒΪ#―άnPsΡΩ::»ο8α\Ώl§UJΏξ”»™ιΙt•`άΊΛ#tœSZ¨p‡Ζ̞!C‹Ψ“W^½œ~ρ/ώ2 i'�χΎχη€ΰ 0Ξ¦6΅%ƒLzŽ�ψ›Š3ΕZΙ¨‘™pΔ{–Yƒ.(\>GΖMΆ…ΐŠŽ”NVτοαΪΈ5~6“֐†‡GΠ‡κ!τ>6TpfπεK—"ˆu’‰ ΣάΜ4£-m£δ Ξΐά`μΩδ$Fp�Χ Jψεz¬g&ΩΘΡ=2š¨)‡i`ΐoCK–‘ΰΉ8J'Z:;™Aγ‚υβ�p Τ±£Ϊ|BΪBNpκxχUG½}€ν„δ€@άξ¬r>*έΖρΡ�δ«αki`p{Wš–(k{xλFzαάKœεέ4;AΖ”ι kτvq­0Ž„O\:΅fLI)¬ΞM1λάλΘΜb3“ŠJχ’*JtΠuθΪ%¨φ2³°<LͺŸνω°CGχmδ΄ l€Ž°|’I‰Λ3€μlv‹-՞‘�₯O#vθ νY^§xJ�-aΟ�\y‘Ε/„½"‰`IŒ‹»―π}B.ω, nGw7Ύ2ϊΤΕ6;ί3ΠGγΎ^>?`P–³osM}K- άΐπόkχgiXθxΣώώA¦6uE|–ξωα¨ ίΥ·2ςό2ΰtB‰ϊ§-’κ(τƒΝΣμ{γΓ S=,γJP_=gŸ>ƒΧΒG;ηψόΕσL•8KΩΡi€ΞΥΡvΨ=K7°Ρc!2,π ‚�Zμ7ϋ€o&xj³6ύυE09Q–¬ ΘΩD¦œcVm(βL_'šΔΤ›aΈήş’εTTJ@KΦSΎ‘¦8΅62Ξ·ΰΩuΪ“₯‰!Χ(–Δ’ωf6•υφ{žYbRΓ Ίu’QΎ@έΜY“ei‚O3ΝML[r„vG7Ν;œώ(ΗηΠC�Ξe¦LŒ>„Ως Sš†hX=O Μυβσm ‹œ �™3Ε=( Ό j+Ήπ;r6}Ζ^ρΏό”7bGn.Ω<{fŽΎT+iΠβΡγᘞ° ΠYŽ]Ξ�΅_Η&©S“θ½όgι;Κ¨@ͺa�θjχ|¬PΚ$­ί θ-φA6B€mœGφΙxž΄ 6&ΧkβΐΎ&z¦ω¬YX!‚ +cφA0Ή#($H―/δ{ο’hxύs�/|εJzσΟ½œ^}εΕD†Ζ†ΨK(aj ϋQ½­ΓGul΄ΎC{{gŒΜννκM'ϊΤaz°φ2Γ hΫλρTΡ%«σ$Œκ�K―žeά+v‘”‰°]6q j₯ Β+ψrŒ [€„qΟ•€θCδn›W ŸΕyuƒυ»τ™d[8΅«πq›ςζUΐ-ύκ]Κ—Άh¦ψ ΐ^—Qφπυ+υ­ΪιN²sΌ’κˆρ΄­œδ±` ϋΥ„>±±g3g¦0ηB›θΩΣθ όِPΏαεΊt‚Κ�lYC‚CϋΌ―€΅‰&Ο‘χ‘O+cNvE(Žtfά»ρoS‹δ',•©ιYφs–XΔ2 ›ΫΏk;ΤφPβʌψB.”£hˆο)γΊό™R–ͺ"Ό\ *ς ¨i₯΄π�χώθ;Υ�ψϋ›ψ‡Έύυ―έ·ψ™{°ͺŸΝΗρρΣ²ίψύΚ‡}ψ?”V7€{YΓ†γ« α$θjΰ‹4bŒ¬ΘΈ!ΘŠ*5ΗΚb[”`‘ͺΑA!3ς‰<+²ΥŽ{ΫΓ±3`«ͺ€ΰ -mΤΡw‡8:ξψ$©žLy+yA_"ΐx:TΗͺP£ 3°­mς³5k λ(fG½H·Ί~γ:”›ŽtφΒΛαΈ#ϋtθ\ «₯8?O=αPΠhηΒΡ‘φ"π νqh9t6ρ)’”Ms†μ¬AΚPK€Σj·`Ιέƒ­ βΥcTϊOΠ…Ώ:½ύφΫihd ’-΅ΥAΏcWQλ8ˆΟ–Ή>š.bπ <ˆ*κ ώΜΦ΄�r �•�Ε:‹ΰM‰{Ο+njΡtμ˜BΘζ‚>oδιŠ‚;yG‘ E`Iƒσ’{:{Pž4€7€tχ*Ω�ό<ίΧ —½Γ>Ϋ_ζZqdpKΘXκHl£4¦Vƒ‘l„Χ)*™ΓpœJΜ‡NA9™Λ‚œ#wξ$œΞ}τƒκκp"ΚΩƒ%™ι)‘‚pΨ3Υ:f]Θ‘%>t*τΥm€'S€£U’plοQG ΙΩ3­ιΥ—_&ˆ’σ6—tΤ=κςœΞ;Χ)"ξcΏCϊ³JX#Ί§ά°'Φό8G0OSI£Έ1f² q²< '½ ‚τΒ¨Kγy“‘ΥΰΎ ¦\hΖFfΒΩή«λϋd–—ƒ1ςπΡ0έm0Z€(Χ=œ$/³\:*Ψ”J3Cώ�€bGΨη°/›½Βαdd*YΌ9œϋ‚4S7}Κ$±z‚@›ξξα pΝ Mόz\ιLu.²~kz)κφόΫωάm•--m¬ ΅�Τ5ώδG?fΦφx€8fF+« r .BΓ.Ž‚vN³1;―Ώ${EΩεΒ’άIiyŸ: o3ό }σ|h“ZΖΏπ₯KιΜΛ½i �²˜^=½©ΖE°zκٟc˜ΉχΒWI£γγα‹4ΰŠ*˜ �Π–˜Σkƒ1•βž†Ay”¬„λίΓ)γ’‰3¬…4hΫK>ΰl0 Ø!½Hζ‘―ƒ Ψ±ψŒZG­lM™0bΧ�ήDA”Ζ!GŁr"ΓΩ+ˆψ€8φθ"©iφsp”Κ{αLδrΚ )£&πσ₯βrVΙΦαδšA²φNŠ’ŽU €ˆFBgUΘζ3ε¬C5θ:†Ε ³Έcˁnέ­εώΛKΫ�Ÿ�Ϊ/Cσœ"6…£X�%«L*Ά‹#Ϋ€££ελeΘπk ν5ˆ˜‹ZΪΘΘ.λκ fm'βœw2E�AΝΧΣμΌ}'κ�&Ω8Sd‘ Ε“aX!(’‰ ₯*ίeή –VΜ1€uMŒ‹o€eQΞ[SS}ͺ'ϋ±·1—N¦‰Ν$½]z σy,O\γIΜ,�o%0©…–=ƒΡ[‘ΦΊ>eΊO„­bHιS€#c:+^ΙλΉξO‹χb–Ω€PΊ΄AΌϋ©δΓηζ7 ‹γœc=ό½ •gd…ZΨ[7›7Ά­ο  %/�ψ ‘?ƒ°ŒYΨE₯€¬«(ΎNΊŽ_ή’—ΖOΓ6™ΦbΞ‘MJΣ}ΊΘNŒ€ΣηO₯Χ―΄G6Y½žσf“v‹3�όβtt–₯6‚2³r+4ΣΉ³ŽΆ#ο:K5[ΫZLΩvPόΧ_O7?Ό K3Ί™ϊj¨ΘRϊ€η[:QI92όΌΏU™3:w"ϋμ§A=€αα ΈδZφ‘*σy˜EH·hΠ99Α$@½qiμΚ—_v�vm Ό5X�gc'’νˆΕmΞͺ{SΌο“…P_θΐ"‡Ύ&Ψ%ξρΉ³˜ΘNrV-»P7|αΛΏ²=#SO‚ϊx@Ν΄²'0VŒ€#‘MT‡xφ–P―(£GŒšΙΧΤ“•€μ Φ@ΊΏsάuώΝκzŽlDkΏΌ“\ΜJo»ίρW‚�Σ€Lj½/‘­#KCΰ­„_”rN-91@X&Έd±€ΘwίΓ!*F^όΌ#�9Καψ>Π?wx€³/‹ΝΈόΰ»?t[ΐΆψ<>C‡PJq'Α΅Ω°yhσ–Ά½ρΖηΙjuĈSuϋ¨“ζ™KްД‹³ΘΡ),ˆοK²π݌#χΑOήƒΆώγ/s]{€(ξ΅χhΓΥ“§O¦)‚ρW/Ώ–ήη'A»7cδY¨“ιQ†τse9Ό:==Iφr]Ž�&`©λΔΎa›l",­ΦEυ| xL°Ÿ7†a/±KH6|υŒnβτ�,pΎYΏ2tœηΔ)5²v Ά½F{Ν¨§ΒΉ =Ÿ/[�ΡTημ²'9=^δMVΗ@f jΫUŒξ<= Κ d<ΘψΛqN«) ϊκW~‘ι@ΓiψΞšvAk– ’tPΈ‚m)'xrڌ,��₯†�𰨦Ψe?n°ΨΝ'θ?2ΐΨ°l;kŠδΪ«°”AΈŽ–-εiο©₯ GX†£ύ&XΗ6kΗB‡«““μe<ΏήχsGΨΫ€Ώ‘Σ«ίaΦ9潜hΤΣΥKrœϋ6(ψ΅ψθΦ6XX¬kθ•Σ}5ξAkYO%DKd‹žΚ*°£¬©~_ Άˆ[ Y7Λ_Δ4™}£r�Φs©B©ΰ9UYlΗ A5«ψ {i(–/ΘF($€—ΰžxBΛ?&Ξ 0вšςςώtv `ΊLΦ €ΘytΖΎ',‚%Οί ύFЍ;ΧΏiΐO*…1QDsΏF’eƒ0ίυ©yR&Κ`1d8Σϊ…σ+”§Q�ΊΞή,.ΣΙ~Ο›„νp6O’}‘ν°,CΖή#ε`ΨCκΞmΌ,‘Ξ· yŠdC^Φ-Ρ«Κ¦:Η2/Ε]6�rlΒ³οΟΚ”ςcΜπΠx€ ΅$m΄WGΫιιC˜œΜQ*gOVš°x—’J»Ϋθ―³ήRŽΪ,-‡EGιIm ϋn£F΄Sϊόη?_ΎC’ποEΜ@†a›Βυ5SΚR‹omcζ•Ϊ…4ώh"΅ŸκJ½§…ρ•I^Τ·PΒΎφ0F?Χ&’wοέ„™θλKνgOΕΩήΪz πdFΧ#ξ =ΜY™·DGπ[φ.@/²‘έ/E^Φτ#Y›ΐΣcΦΨFΉΗPΕ蜱ͺerH,.¦ΩΕΗ”NŒ£+9Ϋ؁ ρLM―{`ό\lφi{mς&{θˆR€bblφΙbdžšt8Δ ±J�'Ν’=ˆ8οΘΎ ΎΎ=ί,+±\c™ΈK@^†·ϋ%θ•ΕΦ ωΚΉg<€ΐό§†±‘e$Š(™dΝσ=Ì) EW– gμ½gKŸbYΚβ�ΊoΎ‘ @^ΟpΛΌ�ϋgRΟ©W‚ώ–κξ ΜπΉκ@ΟSm]ι—ξήϊ€c}ύoό]τξ[œI©Ύ?3Οpΐ&ώπ?�αΏϋgί�βΚΪφ½"?Ω‚ x)ŽqtRU™(Εdg CΚ†[σ¬²έφηM ₯Μ�ΞφP:Ξ ]_€‰ƒ&ν  ϊΉžw³‚z'#GΰΥͺΠ8θ(edΩ[zz:εš†b¬΄�μγ›χ΅ΟR/¦#71I­H‘Ω₯­e(³8&:ηzΞ ΗcFωϊ3uΨ‚¨ΡΑΙ.ΞR†[ښ‘s-§‹/½’ή�ΙOζHΜV’„ηˆ9Ώμ>+m³—zX3χήγώ ΚAΙxΦΡ@¦žR†ιΉΩτΓ:Ι4Λ!Π=αL�’HuRΡ`¬0Ξ™ZίΡKϊΤrΙπ€Š„KΟή„ςXΝJ:’Χδσ4°t›δH[“J„RπgΗ½<§α«ό=Πfo{{Ίq<Ÿς\ θΖ›(’ξώVhYdƒ‰IσπΡέτΦ[ίgτ“Spts’›�DQδd6 lT^@ρa˜Ό¨™Vƒ:―:XΞԍ, βεJŠ{²I–Ω(³€hί›lΜ΅I†)·rΩ ƒΘu[¦±‰δN‘vY+‰'0mh¦#kα8™   mά UΧ§ΦΊΟ£t«Ν>cάr88Y€(244’ΰΔ²Όd珐?nΊ^'²-ύ:_ΗξZmθτ…“ˆŒΩgΓυτ€”K·ΚΠΠHω3¨0»¬δkuBTš|Z±&œGrΉ_Ύ†'Dά±‡£<5Ή”�οbniЊ@€έ{d°~Ώ˜`Ωƈf ZpZpBKŠη#Γμ0α~ Ω6φ,±―Ν-BYEΆt8J©qί΅^₯p|€„zuλ˜KPΰ֎ΘθΤA65παάhx’g~fv6Θ$ΐγFY/ϊΘBΦω(γυfxNš+²f4Μ¦yχΡ9δ»`JΑ‡λPΝλόB�GY@θύμμY“u@jŸ¬έCΗ KΓvύ͚9v­– ¨Ή½ YΞ12k‚‘σΤΑ³~‚ƒ1* ½`³=ƒ_>σFΖ†ΧλόΈ‚ Q)ˆΕ|ώ>™,}K¬Γ•2άHf¨ˆ‘€sγ”eŒo‘I’£AœΣ1wlšϋαΔƒ±:²ήσξ§™5ά­`ט –6l s4¨δΎtju"e$°°xΘ$Α³rJpn‘ΰ§ΊT½ Ν!9[[τΨ!;TPh¬δ‰xΑΨΤ Ξ-ΧΒsdh¨Λ·‘G� ;KΊ}ζδ€rF{Ξ,2γώζu(ς―~Ύ Μ΅k€œϊ^²ρœ{¦e¨―‡8'Α¨α^}Ο’jœxφΠ,‘NΆΑ˜;­“κzM‘λΆFΈΌΉBΗQίP™o’KμΝYg$(Yοg3Σiέ,Νί 1·χ yfJAYΉ":λ³ηΘ�φg‰ϋΨLP:*υδΙ3©――?ϊ-,./’“Ι’c7²$gw.€[·oρ7§0ΈΖψ•¬‘% 2dφΠC›ε\‡Χ―ž›œš'Hyr==ΫNTXc­ƒ φ©ΎSVά7―Γ™φV]oBΏσγ2v‹l8ηIqmΤα2ΎΨ¨gN-§wτN4Λλ~Ξ+₯}Μ‚Ά΅Ά‡ƒ&›BPΰ=?xβ™ι&2±ƒ€ζ4ψ°‚λh¦H€ρΤΰ©4ττIΤ�[ΣjΐbΖάΫ2ΑPΧ,`¦,…ή4h$ΟΘcΫ”SΩA² ‚‹n7s} �©Μο]έΕv˜AΆ‡M!gθˆΐΜς’eθ»MυŒD¦0ŒΆkοώ$έχTOM»zΘ{ίΘΞ— ΠtΡ:$φ‘Δ`uu"‘εY;ΫΤ•£cs8Ε›¬ $Uuφ!ΓΦ΄‚s-v€ί·” �Ώd‡slpz/(εΈ‚xυ³@‰t|\’pζ΅·Ϊb!:³κmZuΊΩ3Οά�£ζΠavτ_Ύο˜I³ΞΝθ†f·‘ΡtΙaϊ―~ι/₯ολ[€\‚φ|χ‘ώρύ ΜΧ pG©?++6{τ3ΥGŽ�@pΧ—hκha: €Χ-S@PβΏΈH–Ή=σπξ=δη(ύ£O»ϊ�“§CΨ?Λ2Έ”œε%ΤΚWdΨΉD6y}+mdό¬―65έ0Ί½^†}ΫBα―@ύ.cjΔ—ΏxPώn �ΣόY Kζ₯χ§Ύ:ζsΚ2[ψ\Κϊ� ΔΜμξ�ŸΎνΟ2hdM,!/Ύ#^k&ΣSsμΜΜ:D'Φ—” ]Cl³ϋ₯Pζ<»»€XΪϋ,ώ~ Χ‰WΫΧ(ΚQ8Σ>|½φΙr&ΧG†g^pΙηψ»"`ΊGκ`m—‰#―YΠΕ³―ώΞ"wΑή Α¨έΎr–g;Œ½EόΜ|�Ν5Ύ…LΓΗ-’^γ#S¨QWYΆECΰΚikaϋ*Α$ίβBκαΌ— p+Ρ‡KΩ;Βfmηhrj!―Ÿλ23]I"�Δ3Θο\»¦ςΘ†Πο°«lεΝsΰήΛ΄άζ ΩΫ œ²A5χΝϋPηνρe2ίG>‰IV·Σ@_/χ£Ο2ΓFγ)αΗ ΛJ3c�ΨHΟ}’2ΦxŸμξ'�μΚƍ­hƒAF¬019†Οr`�yΐΨV’[[+Ϋ©…uhnGΦπ[τ•υMυg\X{1Ψ+DϋΒ�7“@h°φ:Š‘»ΌΙ—ΨȐpŸ|ΔΫ§h‰ΈΔίwωάBl³qTŸyΘϋάΈ ‹�mƒvSƒ&°dC .Ϋ€Ϊd‹c¦•'Ω™‘m§<Έ‰‘±ξ(v{Δν`HΣπ|_μMιl.t» ¨Χξ50žώΤΔΠΨΏϊο~ν/�6ηκί"{6@ω™x|怃ّχ;�Ι?ϊ‡�pii΅�¨ D™ ’γTEZjyΤθœ‚c”Ι.‡G*™J]£S!Κ…΅‚†WΪ₯N½ΖW…+εY§O#(₯O;X™Ξβvtυ’!n䝎�εW©ι8¨„ͺ4mΰ€aΏΙx£UΠΣl Mβψo‡²‚lΕΐΕKΜώηk)MA{Δ^†cf§S§6XKŸWf%ΙƊ })―υgΗ’9žw$$¨�YΡ9κιοM†‡pTP¬:€Ό±Ÿλ!11³€™iυP5rL„Ψ!VΆ„Ο™ΔsΛΟ�χίϊfj(kMΩ*κ—x/»;ξLƒ##ΓŽŒ1Λb§Γaν˜Y•Έ6)K-Ά ΪΦ捖ϑž'5Šτ2λO&½±LΕScύ47•½«γ―*1$N¦p|ΝΔΧ‚cZά�Οο€²ra¬FΎ«Ξj9 QGΫ ΐ.Αd@‘―xL£c.QζΘBΑ1ΞκΑ·ί€ΰ…‚ X¬?}ΎMΊ+ΔήƒtΒNΆwv§αΗ X—gΓ 'λω#ΤDύ\ G‡Νόx P¦šR2―ύm ²‡©…U]wό]ΤόπˆΡnΛsAo–&,ΐ#ΕQ]Ed" h@·=y?mΞ σ96Θ’Ο ω˜ΐ{ΰ"2Sn ίϋŒρpμ½ονο4Ί|‹ο86Q4Λ“ŸΆΰ>ΫHΛuΑθ"—9Φ&={ §Α&‘Φ5/­€p€{w†Ή&šθ C8άεtε5γλ9›§^p©ΕΜW·s6W³…†?‘9ΔωEž5ξ6΄CΓ"Θ'@&+†ΥΰσΛ�?ώqΊyυΐ ύ *©ΟɞžΑ!\8{12―kτΦζo8°ΕŒQΒ1=ζΌΰ |²rη@�ƒτρΥoό¬„ΣhΠT‚ƒi#>3Jžƒr²fϋ‘%ϋB/ΦBΕ‘L˜χ,±Lρ]§ΥΜΕΕoΦ{9gΖ‡»ΝΪZ Όη΄D―„ L9ΪΖZGm9˜8AΡv,‘5Ψ~�Yw3α6L5˜·…5ωyy ΝBbu… “28¦ΈϊqΎvp\ ΚΦΠωΑφύ4ƒQχZ₯₯²w θm δΩ6λε½ν“εΪη½”-©ΙftŽ}Žk€E €Ÿ5±τΛr‹=j„σŽ4F§pŸ¬n9υς–cqM…ΔT|6ϊΦϋΫ†±bvΙf°χ ··tοgμm+ΰk) Ϋ: ©½0Jh6†„`τΧR†,_Wο ©†φΒεΛμηR€§^ΈΝjuœ‘ΙΑ ηcŸΣΆ‘υcδRƁTHΑ7‡ΒXcΧW½γψ1Α4k]u:`6p‚‹Θ©CšΩkΖuΰe�Ψ©ήfwκuΞ"Φ©Ή«»—ΊΫFξ{‚ήΪΆωϋΫΡΩIΆͺ=#Ϋd:Œ=ΑAΩNΏϊλ›`½&`Šνυ@IDATΊD«ΧeSάψψjj­―‡5Fέηΰ$kπβ₯Λ°Π₯[» ΐ#Ž`Γn\ύ02υ·ο_2€/ΌY7{+ŒC—υαΩW*½ξΏC”½π; 3ΞΐqΊη> μŸ₯sη/`Ϋ‚Ω3kYctςͺήτ,ΨI[PFω?ζήœtϊ«’‘½rς„:Ύ]n™Υ`A zΐ&¦W`�Έʁ—δHΰg€ν³“3@0ψ₯λγθJKΡ28ΘRx‹ΠΏvώθ[]`Τ)Ο)”Β«ώεZν₯aΠ¬nw΄a‘œ³ΚYœθ}3‘θ‰*{Vπ6/ll₯\‹`₯½~„ΝΧv ²QR+O4ΐ¦iσΤβ;CάF{Υμ Bv°Šπ;Φ±iΞ[?"CΊ:ΏΫ)—ji|ΫΘϋ2ς7™…Τγ—ŠΤ”0 y¬£wϊA�Σ­sκΞmρήϊ'U”A„-εοfgeνψH¬βΜΔyγϊ}N<1{κ/εΕ:e†½ΩJο}π^z-]AoqFYΛblε"χαž{fΠ\­«o ½dŸ K�ϊœΖΑ/GΙ΅R?ΚeιE€ί0ˆ=ΐΑ6»ΎI³6ƒΐ–φFώ]œΙp£Sώ A(~K5ΐHG{;΅ΙΜ^gέƒEA0v‹ΕxήsHƒ ΄`©ΆJΰS9ΆΗ0Ϋ<€Žγ U`Žt+Η�( αΘαΆΞ–Bfΐ^θΔ[rdΙ"I†Ψr¬}ΌΖFήχs»πl.ξe›boƒΘKXGΧHΏc ֟“}ͺΡu–β¬#—{ΨoΗΕMΟNg Ης3ίϊκƒyχΪq„«�σΡnΉΎTq?ϋ›mlηω”Κ.Ο#kω)ήΪμ=„N:Rι―ʚτzΥ΄―κjύ3š ΧSlΓM” gB½ξ— ^ŽΧζηZ†iπήάL³Ld+˜°ΘΧ2₯[χξ< !υ8ϊ–σΙ}μlUN�3>vœΐωaΨΒκšζ4:-5€›FΑ„Ηθ€ŠλM{Ρݍμ«ώ¬₯ °μbΆzf\O�λψκ”p�ƒΊy• s@Ρ‡% ΔΗμώ)ΰ«#.υ#GΫIΧtΑ€:Ψ?G»4οF7/Π+ζ?₯lkMϊλΏφ7 Θ=gŽίΖλυ›Ÿ0Ec6]8s1m¨§§ΰ²=Μ?ύ$½χα{ΰΘ °_ž°Χθ€ΊV€W(g{.€αΡρτξ;Χ�μΤb”ƒ�J£³“Fe©o ŸγH=OmΪŸ έΗGγ›%Γ έPW…QΖρΐω²T‚’¨"HΦα2’ƒ α/Β ΙgσŽ£ΖJzZ1ϋŒ °yd8 ‡yΓq„¦…… κŸN₯'££θOR#‹ŽΖθ[Αd)Αœ–H”μήέ»ό₯@f£œΊ?;*Kαoδž tξή½γ�‰βΘ`€U²dl8PκαητΟb·ΖRϊ΅λ­±qŠ]r« ŠλΈΟUhyycES‘Θ±:¬΅³Ν*hμΞΡΟγ½y½»†ΤΐJ™”1ΎH(ξ©iea4TΠ²':ΊZPV+ŒιΒθ�Ρ�ϊυψμΊτWώΫΏ™~�χ�ušŸ"HqDi8uŽ Bc†2ΖΖl‹οe£QΡ‘�v¬Υ΄nͺί ·”b`HΨ†γοΈΛΦ΅’Lά€Θύ;wAΥΙΒ@/,BΙdk[ψ, tCαπƒγvηՊg6)Ihg―Ϊ’€™½1) Gƒ …?ΰΓ4Ž5œRΦ§€’’Άoz,φ…—"£(KjŸ φD{ewXζ" P\LΉ ,˜«e#Ÿώ‹50SαuCs‹ ™,ΦI΅±Ψ!†Ϋ ϘώψιTš$γpλγϋ©¦£dŸ=P]Ωg)Kυ―όβ›ι½wί&ΣkŸΛηDgx6΅žΐΑ~"Ϋ6ςYΖΙ*€ώx„>vξ5Ο™‡&9CQFK_,•Yγμ¬Q?^KΰX‡C³-3ƒσ_[YŸ= djΕqdyƒΝE©yJCZ(Ά‚%±Φ7pg›ι ΚlC–‰Nγ>Μ*χ y(δ}"£…\Έ©E6@Šοg1eΆV‚5‡ξmYQM₯^ΤNό² Ψ^‹LΙ β<9–Μ πc%ΓΕ ΝfmR"²`Μ΄Θ8ʞ'Κθ!{ΊΑ^n£—Με³Vœcœ£ ΄ψχ·@Νδυ�²ήτ 8›J%d“xYώn‚‘NƘΦ%’#ξ[`,‡l8ξ’·δž1ΐ8q6ρΣy P’ηh[šΑD>K0�Η¬“K ‚€ςfΨ_el—λκ¨ϊŒ{,η\fj Σγ9ΡΥXše°“xΝχoπQΔϊdΨγcφ ‘lοω—_ŒQ΅Žv¬€½ΥF°±…S5ΝXΞΓ{:υuήρή“G‘νμHRτΧΧ Ÿς{μ“:簐Β}Π aοχ Y θxΫho—μc ŽŠΤέ ™λ}k²Ν8RΤ�Ίν8›6œ§¬`¦VKƒRΛͺφ€΅`”γR@—ͺV2Ρ:χ–Ωό―ŽNφ�ίΨΠC˜Jt_˜76₯ŸG–ΰSΦ”Kz8™£Πk‹šΰ²}…�ŒΉ‡ήώKPfa.ь΅BπΈ[gqy!½τΒετο�ύοΓh’A#2.=ηPυ�؍GΖ:ΰΣq3θXŽθυšs«{tZ#ΣOΣ«ήΐΨOόΎΆ¦&ΐ=d[ˆYΝ}s\‹N²|IVΓ€@–ρd²a@eilφ΅ΑηήσŸ{#˜1JΙΓλ!ΗχοΣ—=ΰηLNO€ϊ\ΐkk}gΞp>Ιlθm²V�ΐƒ-ΰΓσš|φT§QJι™Lƒxƒ$―Cΰ@`ΗΏG&S€ŸsؐȈ‘[χΜΫxν _ψrM–‰σπδρ#μΛ5q~„ ­BU§Ÿΰ₯]ΌeΣΨ(ΜnυU¬M=vΡΫ$ ΦηθL’9 ΜTϊΟ2’֚φYΣY΅ίˆ6Γϋφ>vy/§Η(—e�—Ύ†ί—`ΝψέsjπΎFΦr—5U&]ϼ큉ΑžZδΩ E+„’ΑγW°H ˆΈΦ‘ΗOΣ+W.P“(ΐ†TΒ °cyΤσJ› v--δΑ εΓ�Fxύ%³Χϋb6Ÿ”-'«©X»ΕΟ»dksθΒΊŠΧy&Μπ…>!ΓΌ  ’ά_βλ@―rό‡υ-_μ[4λE·:j—s[(λ½ϋ{χF[wˆπ8ΊynƒΡ}ά«‰ηωύ‡zg­‘ŽΏώfκ£l`FJce}œΕ’K-λΡχͺFΞk>eΨsΓμΆΐΑ:T}'t)?²cμΩ OΑje'CδzύBό*³§~Σ»Ι32EŸδl·Ι1ϊ. Ο³Ά x ώ,ˊΚΨέZ&1šΞž l"Αΐ=n(Ξύ±o|ςΎ :T�e 0M@O›ασ?@VφDΰyΰγο–Γ(–S9₯Ζ`]=°O’B9σα{σ’83‚MŽ―ΤΞi/ͺΉώBzΊψ~Pζ„«Σ…NDγΠFzσ”cΜΟQWΎM9-ΎΡΔ,₯9ϋ3t:Ϊ1{ ?©n=f₯ΥKk?$I`―''…p“LΙ²~Θr}€/œ/-cΪΰr›v²9£{γωQ‡[Ηn'™½2WυιMιš9yˆΫ⹞ƒ<€ΰ=ΫA€Ο³h“ΛT@CΝ#Y’„σRύ ΎΡ EΘrΟ‰τΖ—ήŒ¬ύέ§w�Δν‰HLΎϋƒοaΛ¨«?^©§ρ#―‘—Γ…S�”ΙMΞ-`σhŒ ςlf)όΟgœaN*}ΒVawYRpL)†ηkžΏen=‹δΖς�¦ζœΊD?Ž›5£a²°Τφ`άέŸ_‘¬ϊΚko0‘§-υŸθŒδ&ΫΕΉΨ…1ΥC@»] ΨΨΨ Ϋ”_ωlεΌžLε$�fθ+!(Δ΅– c+Ρcg_>‡ŸD)e$—² $}XΣ}ΚΌλZπαv’ M++"IΤ°ŸΕfl I(°Ύ6q΄dϊs,ψjL°ŽN³Λ@fρν8O–<Ϊ�F?O`Α†ͺϊ΄2iμ1e2ΞΔ’ ½~};YΗ‡θT TžU²Η{λγΛlCΌBήυUμ“Δ ‹Θ~E‡~Ž:‘ηX&Α39ΠGŒh=&NlΖoVcά+Ο“dδkMŠΨΙΡΫ–ρqβ±iΪ ή—Έ¨ϊς³……�υΏ�[₯ϋςŸπ@�π3ρ`CJώ§ΏϊK�υΠΠΓ@“©rA* Λ_TΗ^‰Ό* nΌ¨d½x· ’θ€Y‰jΠ4- gΗiŒ4­ΡΧ©Z;ί₯HJiιξκ §4€`Ά»§Ζδ):³ΧΠ­vfιYZΫ]£©M uY( Cg;#mΞ{ξ3e„ΐk!MNNA[²2£ϊx‘5VΡMU»)ΫΔΠQA"�†²(Uξ*κwΘφ s#³Ό>KΆ¦¬”Ρ->iο‚#§<θ|XίΎJ3»-Œ³]Š—λΓΟ²+ύ"ΑΤψδ3‚¨qτ(π@±dαDθ<"X―¬“£"{@°@4Z#ƒMΰ%:>7‘f¨‰R1uN½Χ<υŠΚ±S‘k€Όw‡ί5p’‚��πΜU tuw…1ΈςΖeΧΊΘά[f0<ς‡nƒθt:wφΕtϋΦΝ4=ώŒχ³‘ΐ —T :T=+�C΄5Œςap§L…ŠΟγ‚B>Μ Ό²ΗL,Ed=*QΔΕΌfDzƒiŸŒ€Ÿhr HΖ­#W ₯ΨΖxaXDκ©βΰ‰"CY@ž:g‘έηύƒvΘS₯‘{ίωž ηΛλ>"K΄= Ž`،²λYJ`o”‡λ*KΑ€EtMmΞ²‘)d³†�±2ξ}›σsbDQ¬Ω#œΗYΐ±m›91²m}§˜:ΕΓtσΞm28€c0uι΄Ο|βnκιOχυ Π©Ÿ&|§OŸβ³k�Σ'χ1°τς₯*ήκœϋ‘αc#$ƒ*εΐ=2Έ0se j& ‚**F *±ΞΰΑΕ™Z32²‚VΙF τYnSΓΩλλν#Π‘†ΔΞ<ˆi7‡»~ο~z44Ν{Φ _œ+dΓ{τZœnΰh χpDpΎ¬uuμͺr’σύœ²ν›yΖΕ^[3μzmγlίΉ}7ύΙ�)ΧΔωΗ `c’&Φ¬Ž}μθ-Δ{Υτ‘œhΕ=μ¨Ω¬Hͺ©φΞ+捀\έ₯©Cωn)‚μ†|ΓFu_a‘%YD₯Θ<ϋƒσ/Ψc4Ωcu‚—7ΰlΔ€2Iv€@Ži3ˆ²ΜκZjc―,kΞ "γ�Ή„(t«{ιšΔΊ¨0Έ�*’:œ rΈΟYΚq/ΰ˜dγΠok8ε|_Ar][0Zt x½²ΊƒƒϋMπHvΈ "ΊO ₯τΦŽσθun!ίκK]d˜}ϋ[‚cΗ‡ΊΗ{7 ω“υζμƒ3$hς±~:θ}eH+&hCP~D‡μz²£œ|— €#ά7ΰD96Τ’6fg0Μu³LF0Ε^#Uœ?3ΉN>œmjmcόΫIΊQw ›νyΜα˜φ ‘^'ΤΧήMWΠ+�©γwGΙx?ώδς ;Λ`‡k{o3uPΎΥH64ό„E₯$‚¬πΩSg�Η½Ÿ&‡hΘυˆ¦UμΫΓGOhΐυ˜ Ζλ£ΧιVΧjKςΤ_ξ[c u�ΚŽMΞΥττTšΰϋΝμξR/SZΥ•~πΦ[WdSaƒΨe|“ΰAΐr=²Ηΐ Ξ~²΄ΗΒ΅΅1K{d8‚Q3Ευ8₯Ν4+½τκ«aoίΌΕDœιφικϋο mkIύ€Η‡zRύ#΅ήΏY2δ~€Θ=¨[bμ‘Oζ=ΝσVόθωTΏ¨±χκ}!  Eμ³ βd©ƒμ¦ώ½oΏ…ΟBθMσC3δϊDŜaiςΑ΄±¬Rgό_ΐΟ«ˆΘΠή ˈT'ZV8ΦκflΔ"™Ξ½6,AΌ·Εrgy‰S[Ό_M±χ`ΒΑΖqʎ~GψuάK$wΨΛ` ΌA°}υ …YΣπI`W` ΛιP?Ϋ‡f―ψ'�άΧΖΖΡ#¬u₯ 2οXgϋNyvΚω\ΧOΐO»e[~&ηΗ>Ρό?ΜQ₯6 •Ii ±CO­OξŽs›Ks$Œ±«Θ‹U°_ °ƒμ•χͺqqO=³‘ϋ‘_e[ͺw―Υoξ‰Ά*~F΄'›ψ.ξΟs_@ GΔΧδm?ϋαϋςo―Νή$*ΑCΦΑƌ2r”Εd'ΛuΆα·3R΄³—Fĝ°CIFΙZh5!`��:όΞ§,ƒMJΤΉ(#Ο΅΅„}›ό<ο3μ!νΨlΑhGΫhΦΔƒχgP·‹~ό4ρ§>ПΧ(πԟ±fψ–‹hσBVgkθ}Κ‘λ¨�VA3=m=lœΆΈœϋοΔnΏψΚK\ Λ0’η4Σ.ΗθΫl}Εx Φ>�ΝΟPfgaeLMΟΕgΙͺ[₯q£lšυUqš2λ#Ψ·KA6λuξάY�³$}Βd*§ν£{f¦Ÿ!C£Q�•ƒUιΤΩΜ& J`ΈxFk`;7ΰ |ZςΨΚΟ=]νœD€Uψα6i·Ÿ‡e_γ“±6uθ#A·bδ�!šΖ²;ΔCU4ζ|O ³Α§Τς*‚U›aιόιΠϋ\–&@L}¬S%¬”bhΪ==mΤΜς…q=CV‘‘Μƒ£'qBζφ1ΚΕ8+φ ωβCX†A«mιΑΐ/N’#u @PΩΧ<„΅$s%Qi—’ξΓΞσ[λt4ηy:ΟS³Ψ>Χ†Š―εΌ·”UΖωΐ‡3%€& 3Ψ5FΟ‹;·₯ο~ηmF$Ν₯:ΖΣy–ZiΤΫۜ^|ι<σέ³A,4Ϊ‘F=CКεΉΟΨ§ε]Ξ™JΫζ’:ξΚΊ4x]cΩtΚ u4Ν0ΗdΉίen(Š6Φ΄{ΉY'œ86ιτ™ΣΗ6ξ ΐΝΚEμKίιs©½�5�΅œj ZσŽ΅r‡SΜσ­2:\“ ³νV�~=k�±ί•ΛηΚςΩNΆϋόΩ³!_³ΣσιαύΗ-τhΐd9ξˆͺ@#Ξ2.xΠΪ�FF9Œ:TφQV‡ε861*@v<―–ŸH �β λ0ιlϊ{‡kι6Αr `)•™βcΞ‰Y$AT©β• …d=^{ύ΅t†΅ρΪχΘZΊcΆ΄nΩm]dmPaO!Σfg Φt~”³�Κ4’\š βœΰψξB›vύόέ1Μ#? ΨKΐΡΤ aί9_²)Rd˜;βu²ˆ€G’G€‘—’%6ΐσLξπό³Ί«€=Κ‘³'pΔmδΧέίgί`΅o`0υυ @(HΨIp»8K‡t€¦&(’–άΈζ¦œ}m`�Sγ)Ρπϋί>Ω°:θ™…θύΪFšIθ9rΐ f›ŒΛ>J€}άFy’T^ΎΠΩP\:θ²N€έηtTa'9ͺQ*δω‹/…ώ•Ϋ?p"½Iγ,€‡Κ|NgΜΎ;ξQΦΒχ)KΝR©ρ‰˜ψ Ž�q΄ΑεΩ—.2ζ·=�γν·ώszηo!q”†Π\3ƒΜ?£Σύ� ™™kδοιθ(r¦žαN‘9χM§,ΰ±φμ +�vΡK£7²΄±ΊπΒx[œτ τΐׁ™Μ‹_ Φ΄ ΦύΨ_©›_ϊω―¦³8ΐ*o›BΦc§&ΖΣμψηΩTN7Ιvw"{f ?Ή};š�Ϊ½ή†₯‚<:©κ_ν… ¨Τt.9κydŸqν‘Α „e€5ΖŽήsΰK!  xΞ{κ¨oΤ֏Ÿ=wc–ΰξYL‚XcύόeτQ{w75Ϋ_L/Ύv%™ac9ƒ8ΓΎΓ0:FΩkS΄…%μΩeχέƘ›”ΥXφr„~+α<:~ΧIΥτ™)f<;φπPΧ+ƒ8¨ Μͺ―ύςZΥΟ>Τo&ά/Ο΄χδZϋwί'œož“v €x­~†φ-J0yŽ>N`’£΅Ν;d}ΝΒΫω£w>ΰlΓ(<΄ζΒZΘ(ΫΛεy‰™tiΟ³«οοdτΩƒBί£{°›υ|BΧΊςΘΦΪCΕshπoo€†Yiθ―_y#€Η@?Χ·Ό=·'#ƒL)Χ! v {¦Ψj =‹κ-K΅ό|z³—ΝτΚΒ†‹rξρμΗ۝ΐ·“εΑϋ²6κψ: D;9bίΞυiΣ–Ζu Χ�Ή`•Ύ6ΊDΊŽ3 cω΄7Τ£‡O˜^5šnίΎGi₯#ΤΉl8Ζ[—΅θκVχCύαΎ όh{ͺ  τ―Π3τ£ΐ—Ιƒ²&OD{£ΌύλΓuρ=,SWz­Α A@†1W΅»‘«Ρ­γΚ[j¬ΐrλσ"Ή€_#Žω[¦Ά¦cν(<Ψ$μ«=—ψ>_ω—ΑZ?ζθZν§>`ψp0<ˎηεdΓ Όym8η+FcΧΦΨ/υGΤ’cƒΤOφΣPoΫ_"κάωLΏΛ*xͺYΖ';5―Ώ jσgD Ε挞ƒΤX�Ak”c»Øα< *°¬ +Η-Β8ΜT‘L!‘§ύ^^ZL~όAΊzύjšž#sߘ^xιcΦ|I fY#§―™…ΆψΡγΗ41\€α)¬HήίΡ›‚ΟΪ·BΞ”ύ,,‘xαΒYV‘^“›$†‡ιΒyΚ°•ΌŸ Ί£Y;6va»+ ‚dQwG2Ϊ‘NŸ„νΐ~ΩΓσ§Ÿ191#Š ΝœQzŽ sLR.β�ΫwΝυRG�%φͺΎ’Zt† °€…vfvq €k3Ζ:;2\9— ΄ ΈfiΚ:Χ‹—Γy†•τl˜¨5v)c} μέ“Š[θ€MΨY–&_F²Ζej[#Ι%�O2±«ΎΝ³±ρε‘]žς‘Ώ¦ξΡ3ΩαsυΩ|ul§eϊ€‘Πd=”'/ϊθΪ‹EdΛI ‘TΞ+δŸ‰5Θ’Χο{ζύ’8ΌŸ6F�AΖ±½ό 5K~΄£8žŸ/ωEVAοΆΟΏυέ?ΩΈuϋΗχΏώυί™ϋι||&€ƒγΥΥμoώΦoόφθΨΨWŽ©E֐μ?#ƒ,b©A²ρ™τ?ΐŒjž*_γ> ΄v+(π:Π· Ζjv†¬Bηˆ- ŒHp# 4ŸZ ₯4PΟCi,j\ Π0:ΤEΪΰηκΝλ4ο’Α γΖ™K»Mfzμ{οu Ω<)ΊiΕ©π*k‘Ψ"γ‹‚S!:>Λ€J”₯žsΰD«‘AIΫΆΌsyGΘAאˆΆΪ™}xdηk‘Z:‚Cœηα9Šη|κ0¦€&Ρ€-œβԍq!½yχ“τπιȦ,†Lg­Ή΄wkŽ’ΑολΦΡRi”t*TΖΦGμΠZ£†Ί—MR Ά8ξ|η ρSΤ\qbšμ Χΐο‚œ+ƒ7‘N<N-ΝυJ4S£~Ί­­‹Ί¨m€™œ‹ιΖυλib|C 5e¦"0‘QDύ“—l˜wBY7uφ_ Iγνη;nΙ‡ O%eΆ%j|EώYCgτVƒ�ڈΜμl#† ŒM| u1g5¦›:€WνšΛG Έ+ ’΅"s%4A¬Nƒύ°'ΨΛ=θΫ9”³ϋ€€³₯±σ+Ψ3^Ά¦‘%UtŸCt1„ΛsΟ�;ŸA2π,Γ‰�YΦiΜ;Cyz�ŽE'CΗ"G]‘Œ“ητyηQΗZπf ΖsΠdEqρι ^Q―MӞΩ₯\ΊuύIΊ{sˆσ•#TίPž.½|!½tώ4 Πn2•dΉΑŒCΜƒΌρ³9bCc3œ5sšb”£3 <ΖgE'ή^ 27dΑμq:9fpΝdθP)7ή‡¨uD"`Γ1Ψa�Χ‘³Ο$Mƒ€ΫΐΙΙΰΑη<œ|‚&Ηγ0uTΌςΚεΘ m"NeW‡Π&UΚ Β gω5Hyφ‹jQ§ΉαΌωž"φ  ey€ 5Γ΅ίΏχΖΑΠ9ΚΫkGϊs^¦C¦X[kƒe>΄DζΚϋΗi)$+ he)D> γΔπ|εΚ`ߟlκ^όSι΅½p-ʊ93©w` uχφ…μδθ\ΰΧ θh³ΊΎ~³n–•Τρσ@θ‰G"ΗΚΩŒΌηΑsa€gS£aΈ3‚e8-(VvυΓΰM”qn4žή›‡ϊR0k§ͺηΖr kωνκ^ΖΙή)αΪά_§Γ˜­7 ₯L06<ή_μ_½)Θp@’Αž™"[°8H3 P"Ϋ‰ΰΰ³ώι£Ηιξ­Ϋi Ρ±’Φ›56[Ύ‚S&ύ^6Gi†ώ.Ψ ©’ωσL-7υΩΥ°Η 9Η%”Q”U Θ€7?χ:γpO˜φc[ & Γ²‡A₯τσΉ&ƒŽU¨¦κ*Ϋ]f#ξ\ϋ8lΛΰΙ©½Qw[Άfs@uΎκ"L°dΙ΅SVΩ›ΗΙΔ_Ώž@G {2nŠ)=k°’Zιϊ?ΔφΜ“ΩΊOπ}ϋγ«Τy?M³S±N:Ν²Δ8#:`Όmμ©ϋμΎ›}CΥροπ}b―-9²ΉΏΧX >μSZ'{nΠE9ikkΒU§σ/Όf§h Xnvθs_ώk »Ωy2>œOžL 8Φό‚’$μχ'ΐξΉv:Κυ«‡}u’6Ÿƒ₯nσ:΅Ώfc‚…ΧŽ³ΦΪΡσ=Ξ‹΅ή6(³άΛRV–5Ϊ!¦�W¬γ}t‚υΨτΊ4Wυ²Om°―K—.v>£ŸΠΎΞasŽ�Η·ÈOaΙΝ½[7 9L¦ο`ΪΟ5ͺCg™u–V½)8…ύ°pŸ…'ΟEi Ν±qξC4DD�(C‹#~―^!ΰήe!z ΐ΄·~ωw§Š΅Π^π?ΧGϋ‘žχ΅Ϊ^Α-νΨŽΎ”ό°)θ›χτcίQ8§K€Λ•μGΆ²†€m“e)²φgxk�­Θ—{βy 6cμΙ’kΫ$;Ψ^X©BΟ/…N±YσΆeMέ―lάψΠ/P—θ3œ9EχΥK‘ϋ?yŠύΙ7LΦ™Wά/νbώsΑΌ¨ηz:Ώ>¨i|ΊrXŸ°D b«kbX e±’{Σ·Zb_=yΜwe‘€—G€{>IΓγ#θΕ,ώΆ§½#tZ4δeν-adπΉ iCΊΊϊΨ“”ξ}ς4=Ό7ΔY˜Π‡yΑ!ί ”ΧMœΩΖϋπΘΊgξ‰φΨ5΅‘\5χκΞ9t›c [=+‘WΛ=w�=§νΚE~Ψ»η‹½η}υ”£2φ[‹ΣxΨHm“`½LΓ22ވOμƒοͺŒω^>Ϊτ‹·aξ9ΉΙΤΪiΑ”J�1CΒΔχr?γΠΫόˆ�Ξ}·bχ;ΫRs=ctI*ΘΪ΅4F;›‘ˆφΒO2${~ΪCAν?Λδρ )σPήK€eΨ[οUωΦ† ‚˜δRζ 2 Νϋϊp΅$0τ½5Ο@{'λŠ/Œ* ?°»§Δt,Ξv3>ζηΎψ|œΊ(uΫA¦υ“ΞΌp>}υk_KρΕg§Ρm‘<ΘΤJ‚£†3±FΙΛ&ΐF{3ϊ™²…gτηp“`)H4eΗ*κΗyώ7νœά1­2Vq΄+εœ'-Ίv{di2θΈJ’>¬8ΝuW£‡ΒΤδ,ϋ‚�ΐ¦9qalx‚>θΨ •|ώ$ώπΗΧο¦kc>ΉΟΎ0.Ί‡‰.€Σnšεφ‘q΅k6Œ—ΡΰXψΐK΄;z{ΡηUωΰ9DΓσΞσX—%z@l�η“ξ‹ϋccδ=ΐχ#@’Εκυ6|>>‹} Nžμc΄'¬=β˜]€ΦΕΙ Θ†@„±˜φ^{Εvσ•O:9‰ΑčΎžώƒ₯ ‚ωϊΡφ'0Θw­ΥΖ‡Κ‰ώZΘ:Œ(ΧΪ$³`Ώ2c9ŒρœΏEΐ8>Π;0&Ω* αΪΛh7ξ±Ώ₯.κm?7t7kΰg{†Ρ+VWWΎψƒοΏ]�/Ύρ»7οχώ]ž^Δ{ώ4=PΉ�e?،’ρώ“Ώτν?ύζoU£‚œZvΝΞκ˜36ΙΠΈu΅�xαnΔAρΐΩTDυά‹²ΫWηΨο:B !B ¦5Ξ Y P8νωΖ1Βi}š©βί $;‘#3=†σφρ'ιΖ‡Χ�“‘˜Ž‚ΊYS‹CΓ2 Jοόθγ4Gƒ£ΚΪN¨‰ΥŒ§ͺM}έΝicΫ…cΕA¨±ήΓΈ[ǎTF 3Τ±ΪρΧ£ΉΑgŽŽF†ΥšυφJy1ΈS ΧpΩTΜ –ηΛΪqλžΝμlFΐ‡£γu8C:r2?μΎAί…5Œ�>ΈLCΝ31†Λ&œ˜pή΅”,M3²S‡u6{n}wΗ¬rb³ΑΘήΰ )ΫώO‡C'ίΜ„²Ρ€|��wdCϋ­ο|;F0j\x^1A—ΣLNs.Ϟ=ŽΒA0›Θΐ‘{tˆ4t:’Λ$lΆšmdΈ―Z2$ϋœ1ƒD3}²1¨ΪΫb–ΆΩ[Y!α$Œy~t’”Γš .ΜΟS&Λ€¦dΓc’ΤιΔΐI…ΔhZΙσqgG½πκPΌl)[ϋΌŸΩ€Αώ#—d4CοξιεμΩ,σ˜¦“4Š…zΜkͺ,c@*ΓIΜ°>½'N2vΆ#Ι΅χυ¦F&ΑT"Ced πΤ@Ά¦οδ bS(•jn9 ;·rλ½z–Xe`Ζ(G₯¬‹zΈ |M#£Ώ ―Ϋ΄sjjJόdΊyνFts_˜fΚό₯WΟέεh347³'�u�Αi±—…ϋjσ₯cFaΩΙΎ­―-ύΚ―όR:yͺ]Ά›.Ώφ χΩλ+[Ag4Ÿ™‘ά‚f· dq Š>-)SΏψƒΞ°Ωa=ϊφ�•+Q⦓lέΌ½ζiH;NpmωΔ…W_Mg_Όuμκ?θ)šΎχφ;i‡> fδ‰_zνUμY3N³ΡqΔΊ[SkjSY!;C[Wn�<§pΈž9t‚nQήΑΛy¦+Β>Jέv bœCΏƒ,³ά‘GmX» ­³E¨†μ�D¬΅ΦC3}snaοž"?ޜaΒAξ΅%φΙl£S ,ŸX‚yΔ“X‚!Θ½ μ™`ί °5šMͺ‹΅Ώ^Έz@;:71ΚΩΖYCΎNž9EγΖ³€mιςε+IPΜ―ƒ#@\ΦΔ‘lf€Υ‹>‹rΨaδηU{Ύ…m[έ^DWγ ³«33“ζ9;+dΥΖ'†aσυE€^ŽM²μκό… ‘³¦Έ§ZTq-ν­„­ΐθ‘ΫΜ¦§κ7ƒσμnΧΙ~hάdn‘ ™?‡œ]*ΑΤΐ˜θq¨“+H@χ­�Q§Έ‚φω J›σiΰΕ‘πoΪcχQ‘^σόκ[Ό (ΓΊΊΆ²3Φ}nOW7})ζR–@°`θ½wίO3³$άBTΨ^ϋ0 ^+κυMΘΠ§πϊ‚ζΝ5\Φΐ�Λ�Low‡i θ-2Eτ…ΰεμ;Μ δηωύΈ?– ΤΪ€οΤ`0,αΔηΝΈΐu*Χ’ς|…RCΉV 4sσLδΰί|ށ«£NΊ‚U/F?Φ[?dŠ~(3Ο&Fmj›o^¬^vδλωσ£$Λς΄ϋ?I³Ψ Η-ΚξΤ’ωbΉΐ" _ Ce'ο§ήΏ•ή�: 4Ι#ƒl?@ωJ4΄uΪQ‘Μ�έύ _Ÿƒ΅31₯=+­2ύ)P75:JžΚbΪςΆž{Ψ'‘£>VΏ„ύB.\χ]PΜ ^½, τŒΎ°€³ςα>ε8^ΐωš|ΑναΏ@ŠΧ&KΖί)GΎ.Sל²]g8ΫM(Eœ/υ“‰εέΧ±ςdώΜ€#τk~Aύkͺ^pF—+7φ SGΨgΚζ»ϊξ‚k² d§ν°GʍΊίuϊbΚ¬2cOYͺω ΄ŸŸ/ι1¨σσ½χΈ/φ'XGά·ΏΣ§.η¬z/^³ Ί�,Έ …λc/Xwb°Ÿύ§΄^{n’ϞJLιYΰšžb`―zνΈΏφ—{œ�}τcΚ"gb"Ω¬/Η$Ϊ;mΐ—Έ˜³Ž?ŒiζΊίh‘—žN0“Ήε:κ£εΑce™ΣΒ>ΉoΈ’έ»:t‡ƒ€Ωΐς]XΆ48„ι81>CΙΧ“4ώdšΖ‡ θζ§Ψš³�KΜΎcφDρ ŽŽ ›Œ—……ιώeρ?[9oŽΐ‘€z–~ °%μ5@½ΙXΛIν“P [‡}6a67½ŒΝ6ƒIΜΪZŠiο―½‘u;ξLμe°Ήψ`±'6cΆΜYv•Ψ–aL"�6\wό‘ ‚>™™^·± GχC·#K²οJΩKΛ­΄UN3Σ—2Π·άΒΓ±Ιψ€P†μ`IΓ&ŸλY4fΩΐoUnψ??ŽΟ‘<³Γ|―ΐW€�6>S ²Œ 6δ` hMJ n²Ρy°P2“)x|νξέ›υπo~οΓo|γΆγ~ŠώοΏxΰΰ/|ιΞίόνίϊΉƒΑ²:.#πG΄=„? ŠRΥJΐPJ+2ν‘ΣQ²“°mΐ€ςPXύššš"PΔ ρnεd¬*qNUδ3Ξg<žSžr(vƒΨΟ½ωFγkœŽΙPo@ΣwΧ¨e$ί’ιG#™Ό ^�ΨL ξψ,³½}½ώϋΩ*)ŒΧ£Όš‘Ь5‡Γ`HΑ-‚ή^]λˆ²ν ΫέPV•Ρ΅΄om~:εB:qκ|8“χξίEXEΠ @₯6ψπή9^_AfΈ£?xΪ2Žα._ΒA’)e¬™h€VF₯δ!ΣVϋ³,Q_—EΡΡ(Zγ]œ@)θ%Τ–hΫIΥǍ*«4t¬ΏMMd€ΈΖ:ͺf’Uδ:9ŽΖΙ+$ΨW™ͺˆ§X—-Mύύm`ƒ4†cΕΤdd―οΠΛΰΖ΅#@~<ŽρžHScS° WΗj0₯VU  Γ˜p­ήC>8bQ m¨χ'TΑlή�*λd‘‰InΒ`hΰ؏<₯12ΔΆ‚Φ"G(TL%F 6 ΐΛVkkγv0>8Ηέτ8Ί7 Π`,γδ ²…TŸ%27ί—²‚�Vš�4!+^¬—ΐΟώ.΅€Ÿ;uΝ=!—BA6Γςυ‘ζb¬ ίΪb ™λH°k¨�³+q:[Ν{J™'~ތ7ͺ ŌγͺΜTS! ”ΐ‚ L 4έc<ΰΝ›�ΥέαΣͺR;Ν+¬£k©H/]Ύ@·ΰN@9P|dZΗTe­qwDPnŸ3†#d'ρt{θ\·γΨΟβ°m―K_— L]#]–—pΝjΉ‚\ΦJOto �ν n†§Ϊ΅™Z's~<―ϋ\�g― g«š3Ώ΅Ξt©θΤ3ΪU2λ1'ή†Lž5λ—aCΨppbn*€ΐ₯•‘`ˆ1Χ Σζψ=Ο€λk³5§4H/m$#qφ _,xϊ7�ΧΏεiΊI€`U‚N²‘’tΨ"Ξέ³Ήq‚ΚiξQ-³‹΄δϋ1ΐ—αΘγlηG©Β°!°�amνοο6t|qπt�2ϊ:ΐP»έ_xρ%dΚ ™ξc�»…ŽL “G°ψΪ^'ΨηoεeRa«8ί›8Σ«ιΘ t¬‘·—Dƒ+ϋΨΧίY�@TΞfd u•ώkφ~ZόztH”yQ»΄UφγΩ7ƒ+i~™–Ζ¨S7Π0`³“~WOo| VΤψ >Τ O₯εηXσέΖΔ-π!RήΝμY‘Sm:KjÁ� mmλCΦK�2NΣφ₯Z”‘)ϋϋ8œ–»”sΝφ‚hοξ°η"C¦Όš€^Ϊψ²Ž;S^I_†ΦΚtωυ—gœ(/‚ξI#Δ-2©Cφ ±|•f…£O‡Λ‡Γ)t £υCd$‡M1λ,Xρa0ΫΘΟO?‚²9”ν{·oΈ Apb_~ν΅pͺ Z `V(§›ΐ‰!;j“]ΛBμNŸ=Η;Ϊe‹`�‚Ι#, �?{ai“šΧο:ώf•cΦ•ΊnθυvΠ•‘©}ύ‚šc@μ‚abΛFt¬ ’ΐ\ϊc&­πt‚K˜_d’ ΡΟƒQ–!8uBš°:wsk5΅φ΅¦ήή~‚Μ,Χ‚²ΔŸŽ YΑ ŽάψΨ(A6΅��wοΥci–ινπή{ο3#}eyoΊ«¦› g‰’#@€ζVHΠ…�tΓ™+AΓ  Μ@D@βh(Ž4›l²ͺ«ͺΛ₯―τ‘™‘α½χήθyΦι”ώBΥDutfFœσοΫ{νeήυ�΅( ΄Kψφ6 4=gΨϋΠHν-An7¨₯­ƒ:ΎHSYUšώπŸό~κκlˆFΑttF#3ΞΙnπίΪ]̘Εω]Γ?&Πg[;zΙƟK³°8,+yΞ}ˆ•’}«γΟώυ�gͺEuΪ3£P‹«kΟ΄ΙYεΖSΟ₯ώΤΨ_Œs|ξε+ιύώο“ι/%@‘όyΥ‘Ξf/Ψ2ξί,+tft€b&KŒ“rO]³L?$;>ΔύTAμΉO]Lrήςp,�ράHHΓΩ»DG»Φ΄sƒv]ς€F(©†ΰαα­ι>'τ*:AgΩ„ƒ2γYΦ_©βܘ‘6Θ3ω± IΎV LJji\[ΜΩ>¦άΡ ΕΟ,@xNȎZN&#ηݝ ƒ m‰oF·ύ‰Ή4Œ_΅k¬€3}εβEtο) θl¬‰#»Μω&ˆς^ςψ.τOδG(…·Μ Α½°9Ίš:tKxZnΞŸν‘™] εuŒnE—-šθw”π{;Τ›yΝηL:efršq„6­fΜσbτ-ψώφύ(έ±N}pόλ/�₯Ο?ύ"Νΰ{¬Π·Δ€ wPopφ{dˆclC.z£ΖΦΑώ:Kqͺd¬VόT ΐcχς°Ν$Τύ= ;₯Ν7 gkδdͺ!ˆ\ύ@6Ο―Ώ[„?α—r#˜'8_Δg•U’i§δA{ΙA{εΘ΅|QŽιzDπ„ώ2AQVέΔ΅Ν]0κr @Θΰ™΅ά-Ζ=σ[ύ9ε ΅ƒ~δ³±ΣYȐŒm‡e'§»”/Νh¨ΌΡ‰—CJŠτ’ΤέE0°Kσ)Mƒ5ΊOiΔZŒxΧΙ=ΖΖ[W†O6Ώσ“fΑ#Γc0Τ`HcGΤω6‰>ΔFΘΦΛΑ‡7‘0Ιk©-3�£G‰>ŸΙ7Αώ\˜ŽΣ3τzaOdJ¬Κ ϊμx=!.ΦN3AjvŽ�Aτ�½ϊWdi΅―ρœϊ œΞ<2ΓQ/*&‰ΓΝ\ΨcΜ&οφLs Ψβ*`URV¨Ÿ‘ΛλŠ8G6’WVΰ?ΰ+Sβ4zL~k3Œφ™-Εφωρ±—qI0ω½₯q#ξύEέllΈβΙσ=QL�m�Sž3Ÿ{Ι>:ΉϊΰξΝζ?ω_�δ«�ύωσ―ΐƒ4p@ΰWτG�ψώW³ΛK�q>3ste4€G@Θv;‡AΦ8:r-j•)Œ dςœαmν©΄3ΛdΆbά ΅’,Y”œΖ62“5P«9(u‘¨hPHP$*m&ΐξΤ7�݊χΪΤuNΓΖ.¨|ˆu ΑΆ³SuLhœNU(e„�ϊIΡ;…Υω½*zq΄|K΅€θ¬‚zυκώA՝ιl υ­Ϋί§_‡αή¦ΡV{:G?€‡!¬‚sοI'<ζ—rω* esKΖy5MLOsXͺ υΩ%ΓΖύ£l Pώ‚r:$/Œˆ‡ΫC% LΚΠΧΟ ‡6/€˜/½ˆ›λ} xN©Gfυ4b("ΐ�^ΎΡxŠu ‡‰ϋpœ¦¨¨X§£ΞΌuY““cΤ•·βΜw§ΞφŒz'ήF§‹6ͺ&Ό-Ύ< D Δύ~‚¨Ά‘Λ7όςYu΄D’5ήήk9JIGXdTƒΒ£cόŽ™ΦX`[ΗeΓ2λ˜E§₯οΣύ»ˆ@£ EVY–} κ‘©}Κ6€gaΘvpP¬ΒδnΎGPΏ³6C³/ϊdT™B†rY„ͺΖnι]ΡπΉΞxw_e;”2�g—lό>A’_*HοΣΎΚƒN§σΏ·WηΣΒΘΓp–EYύμ,œόT}Όnώž•nfv#έΈ>Ύόυ׌b―aΐ°&N"ι=ӎ#έD“ΠZ¨xd p€½>A�%œ«‘„e3:: EsŽŸε¦�³η‘Όυ`w1$dΝA·q€Ž˜L`γΩ@Φ„λ Š˜ρπ7°ίe:ι8KŽvΣθ`le Ω―Α–… Q^qrŠΌaeŒΣpΝ¦ŸRT•σe‚ΨΎΞ^œ›,šh2RˆΜh[[KtθVμ# ΓεKΓ―# ΄l©0IG€‚΅0π”–νύ~σΝ·ι”Ÿμ˜²€aGξάϋ¦l�ΣqgΕR3²Φ!κΪθMέΐκqν:2¨ηR�… Πξi ΙΪΌσώΘ!:™·yα…K/α< &bŒΨϋ‘‘!J †ΘšΝ’‹Θ:s―fΨΤ%σACv-7rŠΖ6Ω}Λrθ©₯ΞxΦ鲉¦cf=Χ6³3ΘπΦE @™5�fΝ₯ΧέΩ•ZZZCKΩ]~‹ϊ^o›Η–WΧE₯ηΚ,RuCŽG,zV°·R,­4S32ςγΑ^ψώŽϊ}$½Zσ/Ώ3XB–ύYxψ!3Šΰύ”«ξηf‘{œ)ξί 8FΒBczς8«†ζ@Ολ$ΛΜΠ6Ώς“YςE§Bο(»›Θμlš-[Ž_KάC½2jΨGΩ γΟGψ|¨£¬― ‰Μ›mVφqξt89[fK"8ΐ+Σ‘DCQΪ_ΒlŠΝ‚¬λ5㨜ων4Œθb―π u|σ)§\ΈxGΝ~ωΨ•*ΚGfBΖuΞ›hdΫΦ�žfH,{(A'L \YζCν0Ο«Œκ° BΩ (ε‚‚κ6˜³€NΆ‰, Aω₯ι%žk€•1yΤ/,Lα<ζΠόρI―ξ·£ΥIOŸ<#8μβž3IMGmyΏΚ¨_ΑΖΒQ-ζ\ ΚΠρ<•Tμΰπ3Ζ'Δ^=ˆΡ»6g-& Χ�ηsfl°gvOŠ,υσ&ΞςΆͺΜRAgž‘½ƒυ \kπΓ’œ u3x²<œ‘K½1ŒM”―@ΙXy Cj Ύ ·‘s'-Ξο" FΦΜ¬jΗς¨+ΟηχfΒΝl�[BɚΈΗf¬έχ<‚‚>θή3=œ’ΠΗΧ―]€Γqk6}‘ }’Ξ)P�ΦiΛ›ΡύμΏ΅ϊ<ΈρΘ %’؊�ξXbΣ4ZœB6Η Ϊψ\ Ν ϊQΙ�)K?'Iψ1φΏaŸΒfiΚY€–ΰζύElΈi¦PύμΉ>J£υΡ₯¬―LAϝ%ͺkΞ"=|ΠΫθ?K–Π:z²₯΅1}πώ;ψ ΝG‡σΑΆpνΞβ9ΥΧRG*�ξ]c}+ΧΩ₯ΗΟγτοώŸ_€O±”$€ί(ΠmιTτaUτq K`RρLϊb;ψQΖΒ}πYξfb₯0%Γ†‡ϊ…Ε”.ΔϋΠ[ό>δ ‘ϋ°K°Ό=_EŸE?M_K[g’K*ΏϊΩ3α™ΣσχfkΓfρ3Α\tζ’Τ@@#~y•lDΐ§Cν'ύxJ-Ÿΐ6zŽόrΜ Χ7Υ°$Wͺ�πωd ψsm–~�rα™ρώ|&η^Μiοό½ϊ_ϋn3`ƒy5&Θ|ζL“r'0˜”a½Μ>PΗo`|ας…hˆk‰A%φίή-φ8²ΧLkk'ώ€ Z§7΄Β4lΖVΓΰXγΨY g'¦œ ‚,iΰ²a·΅E2OeΜΚ–5Vpν,R~–Υ=ΫϊΎ'aψΟ’σœΖBM͎{€\½ασλΧY²GΒd?"Ÿ@όΒΩ³\{χΑƲʘM,Mžϊ3Χ^Φ�ŒS{Aω³t’φxkwϋ�ΐγ‡{χξ^ϋχ©aβ8`£²ώΛ�τχ_68ς/6wφ+°5!@§€‡�ΰ‘C™ιCjœ 3ΐ Α²Y½CEχΉiΊ€’%S‘8樘¦5 „¨Um% Q ”4έή/5]τXK€"9EQor46Ξκ%Τ 0ΑC’³vššγ)2%§gͺ« ͺ#Αwd†ψSa΄�~f~!G‹B0»κ—ŠΞƒε}˜arz‚ΚnGΖn¦Χ�•ΎώΝ7¬oCQΆ΄u�l―3„yŒΜυ`ϋ8ΓΦ%›)²>Ν¦jΝ­­A1\Ϋ€ | RŽ‘·ώM„Σlρϊ*R‚"H4Xnΰ¨Ε œD)₯:’…Ο*UiCJg° ŒD7ΤX+(^n*”ΔΑΡΑQQ¨=pf\€_ Dψ»JB)GfTΉτ(«€4GΡ΅Ϊš:œHΨ8E:‹χο>Δ€?‘ŽΛ�� \Kϊ€]%¬#₯“hΐi§ZBcθΑΌQY{ ¬]Ον!ΰJ?κ§ΨχΛzpΑ<―‘ΒEGΤΘκ’yEΜΏν!j¨.J=ΧϋΟ€ϊZjoχΙRX"b#!οK'·¨>8„fΑlwŠsU^Σ”²ΚjΣΞκ\šaμ5' πΚ…ΝŠ¬W!½ Jκ»A©9FΎe=ψ~Μ(·NX_›ΗHIΟεfY_#U5‹ΐm²[ϋ Žξ,Aήη_]O˜Xp@Ÿ φζ¦Μ6KuP³X³ΓšpΟ:H6Χς…‘Ε‘ΠΠnob–Σcj>w˜Δ° σ` c€SxΚ3ŒOΐ2Ο&²n@�c¨…πΈΉ?6te%d ΠΡαΧΪn³7:œŽ:+ΔΩΨή€ρ Dn}OΘ˜©ΨΰΪ‡ΜΡ™ƒvWO β™3ύ™ΐlmνˆΰkrj22Ž;"c‘)ΙPAu(4bώ¬――7½ώΪ+μ}Nt‘6λ.%]ΖΓ£ο�‚Œ5•™ΊJψz Ÿ²– ‡BƒΘσ±Zfͺ Z.Β°α©Nέωί|χΘΘK‹μ;w>ϊi¬³/² T|³ΰˆϋ¨γ#TPf• ή,9pόV¦ς³ΨkΚJδWέσδώ=F•ŽR~ƒξCmμ ϊO@4:ό]³Ds―giπι3τέz.u<―gίύ±’C‚sά§==A³ R™=υ° *Ψ›»wnυΫΰP§²Ι£ut±ΐ‹χ_Ο΅ΚuφΡ…ό€q€;|ŸΩ¦k>“NžΩ–˜AΞT֎Y;u“lJΙpϊΩφ q’­gF9 ˆώΨ|eώ�ŸζΎΠΡ"Cfs»±)™ΩIzΧΤGFΉΆ‚27t―΅ŸϋσΣ‹Œ6MwΎ»I  ˆ:Ξ3Žkv„£uΔ}e²£°(γqΣ(hvJΌυξDuPΌσΡG0$μ·!‰!xY…M²‹�Z†)ΟΓθΉξXO?Lοή‹ζ–³d~ ςΙΪ±ž~©ϋ:»Ο5ΣΓΊF`‰Α6dy~YΫ p²gΚ‘ “ηΩgΘΕΩ΅Ύ6 ›h³6Ÿ36ύΚiμOΑp€η<ϋ –Τr– gξbjoο„‘Α¨;tP5ϋσ|ΰi8ΞF‚Ά²_΄:λξΗ,τKtΎέάχ}^3ŒΚ8(ΰΌ©―fqϊ—RNp1zdδωsφV λ€ΐ('�‹ S=£&Φ ·±έ‚žQεJ9Α•eΟ3έέא{ΖΉ©yή�„u6Δ€I,NώΨσα4MF<‹χ Ί V-/HΗ'Β`α|πž9 a稦Lνθ™±αη‘΄0ƒ«ώtΣΖΨ1^6ž]Ζ·vΦ3 4dTf• Ύ χ_ηYύθ:„žΔv lo°Ζ6~Sn²Ρcˆ€U)ε$0²‘Ωe2†μm#΅έ6uk$Θhλ&ΐ‘Ρp{[gΉ†I$›6η΅%v}gκφC!qZ@12%₯žHΥΥLaA†,sπlfi2‘ΐŽYFG&’$uΥrdƒZVŒ3,8‚Δ3Dφ•3η>dN'18Φ3φš=sΕ,>’Τγ�‚2Ψf1Ÿ‘^DμMzPΠΐ¦²2lΒf°˜|yΞ^ιΏθ‹tdLΝ.aW§'�Χί~Nt*;s–Ωτ½‘LΙL™™@> πΡ‰œΫ0&&Ff’AπΒ£™OΏ»‚ήΰ©ͺ•bXq–·`― h2j&(ς,ΊW�Έ›(‘­­Χ)αΉo’^ω…Η0Ψϊ�‡ŸΌŸ.ΑRΙ`v‡LŒ]¨μΩ9L�š™›Βίΐw;„ΡQgΗΟςΪ™†ΜθΆL_Βί Lœ3"*γ΅1݊׫ƒ Š,UPχ»^η€ΟuZ”_ϊE‚[ψ7&'"€β…2ƒ”?υD ~Œ³\z!3ρ{dΪZώΜ³›EΏ€\=¬«fzΙΤαΣ15t₯‰ͺ˜[κ$ΓΉlΞΎ%I™ΗςUοΥϊχŒo?lU>K&«ΐ„ώΊ υ‹ί–ˆTbc½/’Ο’<ΊWϊ κΑύ<_g ^€?!("P7JιΑ­[7ΣkΪΥΩ•Ζ&ŸΗ­\Χ)`Mλ v"υΓΖ²ˆVm�ύΙ¬+Α+ΆAΪ³ΰ}(·>—šΡ'ˆ„?Σ—πΨGLVlž �9VŸ’{ΦΏ3Y'θ°Νkυ{}&uŒ―я˜ '‚% gl€:8<ʞ₯ΤΦ\¨p.š7[BRž¬Β‡$؁½`…uτŸ•μ)!ΕrΌKΓΙ‡GbΦ2€MτwΎkXΜύz_ή“ΰY,.W�Ηx¨Ζηη§θώŸΧΫ;ΐς�²RΐRžΕυ`’4ΒD₯q]ΔF‚ΐ\wv‡λb¬Tkgu˜€Ρ,/{μgi―,yΣ‡Χ�’y!χΞδ²Ρυ πωμ'd�ΞdŒLvΉ°Κ’wβ=ϋή²€^ΡV„Nδ,_š<ŽΖ²θ§,ž™νT³(©½ςΩηΏΏ{χΙΐςύW&βψ>ΖΤT*œ½�GωΩG­Rfc�¬«ΕY„feύTi+ˆ>Α€Ž€Œ™ΘŽ�ξ48τŒ?οΩ†JlΓ7΄ͺœš-3,ΘM:O΅A‘ζΠ5₯aγδ(ƒŠ¦žlš]O­/ΦΘμΪ £°‘DΊ³}Œ‘R«T€»¦uq*œ�‰™ ηšwb ΝCΥΦ±50T,U"ψMœυ(σύϋχQ:Ϋ©₯ΉŽ¦‘P•dΟpw‘D‘ΪH³Ÿ}tλ ωt™Ž¨εЏͲΨ0¬ŠRkwK:xΆ‚SΧΕΜσΩ@o/_Έ@Θσ§+|ž X"(Λνgi0Τ7 ™uKRζΝ<£Π7hώθAσΎχqΠ€\δ°<|KΕμρΆY83‡ΦbžBΉ«τ=„P_kƒ)»τΫpΠί΅·5bά²pκSOoT°§irκy4{™_ ‘ΩnKΦxώ,5[�” €„oΑηFr`5|Rϋ‘d˜]τ3=Ψ"–�χd…ΘΜ°/₯$hyφ#γ|kΝΐ*Rku8ΝΖιΰh˜Άpnv†D.σΡ"Ε%§4+%›]ΕΈ¨ΨM8P8PΫΉ8Št]ζΩe0¨©χwQ4P‹ƒήG €Ρ+clβ1ΝΦπ]7κ¨Q+‡(αγγ…xŸ3£5‘)Θ©neώ;1`Yeή Ρ@wm‡ I…f½g&ƒKtΤΊ5Q8ψ(JΰβκΖ΄²3—~υχ�.=]†iΡ›šjΙf¦dύμ™σQœ1–Η¦”ffU’HE8I*ovV•€€l4ε\€Ν¦δαψVπ,ŸάKγΣOΣFσΞw` ±fzE£#;ΐkντq”ΏYBΟΈΖΟ}“Ϊ|Yž#Φp†v)|Η8λ€X‡dN³£‚p>·Τ?ϋ»―™‘ΌDπA7εj’ ΊryΟkοΌECEJpŒryŸ­2’.P.”…œαΑαd—~ηfΦΘ²<"(Γxς₯€@ΘwdX_.Αgc@pbό28=/‘›zmC¦Άszδiœq§ΜL }ψΥΧ_'ΰfξ=Ξ‰g¦žΟslŸ_3YκΆφN²‹Τ5ތώ9[υD6Aύ`(ۊ,J^ΔΤαΰνπό'PDs²iΦΙηk4·¨uœ X T†3ωψώ#γ!Ξ�\8,:1υ-Π Hptν/0>τέ@φ— @gΡ F§’Œμ¬΅’›PKqžΜ?yŠ ہuRqJ χœιjnξL4ŽΚEfu‡ί{ϊΰπ˜υ+γΩνE±ͺαζ>Μ:{6l`ΈΗωuf}…φψόSCξŸ‡  @]λZxN}―ΞΩ:tMξ‚aχdQ–γaq|·˜GΆRϋΊG�€«ιόε3diΤ(…¨-Gθ鉁:L›K‘½QΏlpέ­₯lAc4 •Ž)+"gξΑφb°³~}@JΛΥΘιTδτθp‡›‘�8ψΕE6|΅™²4lH;f¦ΧΚ.η―1}»τ)kψΙuμς`‘9QCΖ‡ΕmtΕΣ‡wvΜ0Ϊ7=ΛY4Šxx—Οe}Crƒ„5Ν€Σ²BΤ2k€οz]ώιgŸa†©³X?Ηm)_24μΟ2 PέΉΨCΙΞK€ζ8\8T;8p'θΒIφsσ ΅½Ϋ›”7ΥΓΌ‚aΓzοζαŒω%€μd{eq!ΐMό θ±§tΖT_ηIl©γΑY φwχ²θQ2›έ£s9L„2U΅5ΝQR°‡675™ίΎƒσΘI€₯ώ±h6™ψ5tΆ:½οCR½² paY—}DɌ—"WΣΓ“”‰Œ„σj³AaNφгf�Η—ζθ44Τ²ο0Ω rWΤ `•§ϊΦζTΧ�LU Ž)ϊ$€t;)]›.{ΐ,¬ œA·γ�φφ7©©§.lΐω9ΨtΘn6²mr:/vUπ%¦„ΐ·”j]Ko$‡]€©6τ›ε5θξ–ζš¨εS~F­<œ_g”q__OœOν„Ž² Ί₯0Ασ3 ΑV \ψšbφCtk @S@ζ&§£ίŠ}Xœ–bƒZc%ε‚|€‡τΤ©Γ+OγSО9‹FύφBpl­Ž΄ΰž4γ%‚Ω•5”7ΩChu‰k‘ vιΝ2;1–ΞžλI~όqM²>τύ’c;ΰ±6( !]ή� »μ/ώ¬aԟž)ωŽ$5˜mοmAw“)₯ΜΠ�MτA+}‡κψlϋΝ`Η)A‹ŒΎμ΄/ύοb«±§Ή©‰†…Νψwžρ5‚lϋθ8FVλgπ  0 tR‚ΊK™φOmG€¬γ.`Ž%xeψRέ½=ι­·^γά·dΐΩ½φT…Ό¬±¦ΪΆιΙEž^Ω4^€$sp>U”<dΈ Πή‚χψ>žγψ)aOs93žΙr|ΕςΦ~Φ‰$Τ2ςIJxο–Ακθ;p{qή•-ύΩn±ΓCYLψθ_m£AΌΑudόΥ#κ[”…ώ‘e‘:R– ΔΔΦΑgsΝΦ&J€ΘΆ8V­›Ξt6S†Ϊ‡ΎΔΩό"ΝΓΛcΈΊN}mCύ²ωΜMμ΅²ΖΫ8«όœ}χ~ύΑ&2e™„Μ}3u˜λξ3Ψ”Q_5γΗΙ&”ΙθΤ²Ε¬ƒA₯―³Ώ˜―Λ$ΆL2Ρc²JΧ&Fs +θg°Ι˜ΝoRy=¬ CK;q{Ύ `,ΐ―ίkΩK6τhw4-¬r�ΦΪ ¦±aL^#˜eΏ vύ|{Ρ€λ―yσ–w8”Α|6071ι:šέ€$;Αwό_ί”ΎΟτη±α‚`e™^j?] χ°‚ϋίeύΑ]ΰNXπ€±Σˆ―„(¨%η VɞxιetμγτΕά7ψt¬ϊ�φΗψαKκΨGͺ‘s€ΩEαϋσgl–>a᜼_-C/ƒί�­ ͺ/,{:ž=μ95ž�ΩΟΐFΫ«€΅‚ΰ_гν™6φ2ρd―\l#{³‹‹4γތ˜°Ώ·+=Ÿœ <Θ3“Γο(£CFKρ«dJ’μŸPBy¨l)q,'φ ۊΜ8ͺΎ‚λG‘;΅αΈΆB LέούαΉ—ΌΟχxΎeώdbφ“=+ΐw49§lzΦ}κΖΊΦJμΕΏό/ώΩ?]ϊ·§§ŸώA–<”χ—§ηωυ_�η?λ½χσ?ήέή―²Ζ]�Ɓh9»rαrκαΰv5·�8γθ½|εbΊΤίOΦbŠα5‚ œιΎ]pE“ °₯ΆΨˆKtύ‘S©ψZ$•œυnμ=_ΦίdΠMΡ�<ŸŠΤζ8Ži¬©ηgα£ή£lΰYΠbΊ>;sš(PT— οѐLˆ°͟ηΡ PI©τ šύ»,»–ϊ³©©]z1»ΥΜt%υΒxF�lIί�ȟ€~Ϋ .š“p4μΥ8γYd>O³·˜υ]œήxεΥt¦½΄§�ͺG£ £!ΝR›•νΈ•Ω\; <zΠ=(f ΝzjPdTˆŽZΚ`°uŒ3€Άf6Ζ/₯Ο)"¬qw=O¨oŒZfΦRV„ΤDΧ‘Žυ…Ώr΅g’ˆ¬7iεΦ¦™ΡΐŽ% KΖψQΫ`&݌‡Ÿ%V΄V HΑ D£Θ€”(ِ†_γΎ¨/Œ}Θτ†PΒθ"'613cifGgΠ€�ӁΞΖψŠ„7ΡΈ² πLiJ‰΄ ¨™V9ζp=QL³,"Ψv°u=uώΓ(ϊo€P =ΠΟSΝxΟΎ§Έ:½Ž ωrpNP²'8›§τUπ=ΡΈodΑ&šώq=J¦ι–έ‡‘r±G; Υ3dΨΖΘ>?z2œ~ύō4<ΎŠSHjckκμ¬MύL~8Ϋٝ:š¨gμ_!%#.FZ6JΣΘ©P]Η,<ΰ]Pμ9:r/―όγhR— κΫΤΥJ†°Y΅d ;Ξδ,¬ƒΓ ϊ¬SbF°–@cΉ“i ❐έ]”ΌYΞΞ:υε3c“4ΉBĎ1¦l`€\Ω΄M=’\d‡ζEλλσd½ΘzB›Ϋΐ1δX·“tŽŒ¨L³”/_Ύ:ΐ€ΣδZ(”ξyL ‘�@3ϋͺœσk ώ zί―~ω7ιφυ›P8€pšX06ξAΠE={ΤϊVVSŽό)o-]©½³ q)n-ΞpζΈuΩ"f"-!RΏ(³fŽ€—WαψD ².64’ά€σjύα:ΕΟSn¬uΆ»ΏrΘ:Nάq8,8ˆ8r:όκΎM�ωΙ9JFXdeŽΎ+ρfύ›šZ1zυ΅Π‘»E@‹©‰Ιtη›ί€ΑGΤζsξζœP@C¦'ιΛΟΟIfozt„©γ0*ΨœσU–NŽΠ);α ¨·Όgλ͐ϊ™κβ@‚ξώ.nΪζΤ}™k8t‡θλΡe˜Ψ€Jz�$=@"ƒΑω•*jωΘέΫw‚ι₯ΓsΘZκ&3€��™ΙΗ9ΊG]ΊΒ—CΐŽI §�Pβ„sβU@‹ήεόθ ΩΓG&έ²₯υμšΑDu £ψ7"8Y€C*θl™†TάjμœΝΰtΐ Χyή>+›ζ³½g’!ΨΔΔDΪ`ν „Ν@©o―ΎϊZ”~ύλΟ’ωžTγ_RΉ= +«-XP\_η1ͺ³?°Φ)/ψ¨ H’ν’G―“mκΦ-OΛe ‘RΛL20to]ϋ62δv³ΟΣργΩ΅©™&°τ8Θd€}μ[χk)”¬•,‘UGgO@ΐ�\}φΤSΞΟq tτ υ WΆΒ E‡Τ’…(jΔ/ωθg� ½χαG©gΆσB?ε(WR=ΝMOΠ30ΩRφ’€P²παΝ7^{ϊΊ"zH[%# jΕYΧ}2΄θ”κjzΑΊΠ>χŸ=ƒ>9>IwOGκ9.€Λφx½ lM]Mκξκ„iPG5ύš>ƒγvŸ‹az†Œ_βΏ΅ƒΚξ6ΐ‰–ΏSžtg-o2Ήc`ΐΤo―‹†α3τSPΨμ%3Ϋ°eΡϋ[ΫKμ,gΎ€3n’0μAΎ£gί»uΚ•»�βΛΞυO™Ί&\{ο#Γ(Џβσω2{ύVO +oΚ_-ΰ•ώ–:\αΤ>hG,?σ™τ|Ώς΄ ·Έ"?α,παOœ8Λ6Φ΅τ-λnld8­ψΙ`β²Δ5Ψj› ͺ;ω7Ά!kωyϊΪDA ŸG°N�ΘrIοΑ TŸX Ζ½’I£Ÿ%5ΓχλzŸjͺwtΊ==ee!ψYρ,άH8žΐ }aβθΟΛX₯―Π:μΜbΐΤGΟ�ύ§ιή£'La —Ο0;A™7`ν±ώ{&m‰.8‰i=ϊPN+Κε™il¨ξη›±w’_– iΉQΦ ί}ΰΎω όˆk“°Ε'%wγ£Αΐ_@·ψ|‘�†i€ΏΝšG6rϋȘΙ2uV> "&g]}Ι+ΖΈΝ³ηˆp›Ω'Y‹φ<πuNΝσΦ(€°ΞžγΨ³E†ˆˆ}­Œρl,ΓΖήmκGθ+cŸΝgv}½gA4οmŸχΊ2‘X¬BdX{Γ&Ί₯Ϋ;›«ΧFΏωΫΏώͺχϋK©ϊΑ}±Θy―�κ'++ τπρΣ‚3›]TΉ«ΰ@Y³γμψΪ:fC@«ΒXuuw£rΣ§χΧ ΆΤ#λ .ΞΪoΗο(¨Θ‰ΎS}η’ͺ|6ΘτK΄VV‹T|B(©a:]Φ’ P–,Ψattό%Xΐ½ŒN₯Α烁¨Ο/,€ί|σe μω|Ύ‡%”ΫiŸ­@Q―ΓM¨ \8έA'£Tδ:rRή€L›ΥΞΤGKΣ5°ΥAΞ¦–ΡΊΉ2>;k ž©λ‘"֐~½xΎͺυΥτ�ωσdGq„!Άώ �©c&؞žGYγ”ν�πΌf¦‘ ‘q«ͺΒa§#֍ϊidΚ,~Ω[‘4)•ΗOƒBΞUθ8Lœ3›‡Ι¨v χΩTς"Δ–GsόθΌKF ±„Ιuυ•©:₯λ·©!œšLΧ―έ ˆ‘ξŠ–�RG‹ρτTΊΦn{₯ΈͺΔ€Š©hE³aƒœ}�§AŸˆΤK›΄Έ―’ΠvΤΗe‘ΒQiX κύ0†S@d yα±6€$‘ EλΤΔ΄ήΎ’Ί:šPŽrΑαDaκΨͺ<Uό»€ΙφΑ ΩΨRδ2œ#eΐΜ‘$ΪiT€‘«κΊ�ΛϊsRž·qφθŽΟsŸ6T9σ;2ŽiΦΔκψ�ŒΊGήχŽσ>ZnFΒ½ϋΣW7₯;ž£°νXά@0[FΠX‘Ξυ�ΘΩ)/ΝMεE’½2j¬υhΛϊ* |΅PΪ6‚s²Ε «ν#FƒŽ₯Ή…ζ£τ‘λvν€Αh4kmτΛW^‘AΨvλˆmΜ©!₯<ΐ©ϊ³λ‘“οˆFΧDΗIGo�iz‡0²pN=Sϋ4ς:Aώu8€žπ3:3νUj'θξ«ΆŠΉΕœ«gOθaPEΆ§•³‹S†σfΗσ.ξ‘ n λQKA§t΅wF¦kbzΩgζ7Ξ¨δ>ε Γ7RK”Jω{ N�1zBF†{kFMγe±ŒοΘ6§i#—|fss+gžΖ\Φ‚³c�;₯ΊOv?xφ d™k· €Šr'0zΘ²Η³Ÿ}άCŽqΟΣk²Γs;ϊ)ΰ Ώ¨*:Œοpg)ߚg½iBƒΐ¦Zdάq|fg§©]\ kOo֚,lΤΨΘHΊsγ&ΩΨ§8Ž „έβ= £Χg3»ΪJ&Z₯2 ³Ρj ΩΣRκuc4"5Λ‚@κ½Sδt YΜœȁ¦\Ζ9¨„Ξ[ŒΑ/!H)Βι6v’Bχ°CωΙΟcΑƒ=ΐfG/ΉNψ{μ·€!gΫ3ΞWnσ©=Œ�δ|’ΘCSδœΪω»ŒζŸ=έ=Πuχ�_ύω� ‰ΑΞ<’ΖGΖΣύwΣθƒ'ifxŒΜŁ,΄Y(^ά>z(›=°Ι§3'`ΝύDβG3•‘ ;€“Ζ=ΫΫΓ2/Οιϋ£nzν­·‚ε‘³ϋΏχρι/‘>JυΠzC΄:Ϊ:˜έ}žQynG{²ί8-Η8†‚j*α#‚Ε\hΦ€o:24θ³YΣ"ΝΐŽttψO6ŽY£ γњΣ -#“n#9G΄ξS�F ΩψOώ0M,Œ쬄Nd ΨΛzAΠh�«==xψ˜ήΣ4©Cο‘ύLƒ¨+W^βΜ~άA~ ’žMŒ!o{βΦ™ύΤΡ�Α]«¬+δόΨh±‚~*ΉΨs3R‚ϊ,WdSΧιΗςδΙγθ_€nΣA3Hρ ι?+c—’/JΈ§œbu‡u�Έ{a',w�v:έe“Zbn@€Μ:YF]d μΩ3²οP†•Ζϊ±ήκ%™ΦΦλ` ναGtχχEβΦζfΐ΄Iša>γΧβΎκ™"� ˆZOߊΘΝ;I―Όt)Uόν"C ­νζi°μ:) ήnFΉ uυκ«ΑB’‘°Έ:^νJοΎ�~κκκ"Ψ*Dίβ³`Σ œ:Κ8Σ#₯LμaΟ—+ΆX“Ηwο§qΏ_ύέ/°‘”’‘E}<”Nθg/ΠQϊ@‚`S)φ%]ξž•2R²V«€χΦζzψ^ΩYΐάλ[ ”›Πĝk)ˆζ�†iœω\ ΌV Θ¦βμ“ gF=ΰ—λΕγω7ό” ΈαΨ]ύ§ίΎ"l˜ΟiΠmπͺ~ςLy]bΪ-ν°Χ7σΑ»υχάc}iυ­ ϊ‹²›CΎ Ά !mή(@QVUn€±ˆΟ’­4A'Φd•ί&ͺΚΩ}<1…|  œŸΜΊG2LΥ�q|�Α�Ώ ΨmJi_ϋc”€Z¦–Νšg‘;φΠαΐϊ³ϊ§™ι™ςU}#a²œτ+,+±!σ�β,Ο@―’κz@¨1’Zs‘p” ΤΩΪIίŠΧ£Η†½\;GΛZ,�OΕkΓ]Η‡:Ή!JŽΠγΚ‹:šΣ€G¦μ@?ΙxδΟͺ}3ψΧΗα�θμ h ,7θg―£3{Ι¦kY‡CFN¨ͺΐΏ'Žp/‹Ωυˆ=ΤΉ&αlB-»—MδžΙ7’Œ‘7μ=`ΠltΎSdd mρZ<šψ‰²kžsίυδΩκ΄Ι³-ΰs²ζ8‘‡θM›RΛ¦πQΎΡΥg(τώ½ίq1€>― op)2Π`;Λώ€5��Τ χ.MΊΟŸΏs‰ώYŠξνcEMθΩ ZfΕχXPn\g‰Ί%žΪ"m’>§>>£ΆΪŸG947δΩQ–86ρZeά�I_γ4ΑχR€C&Nf΄(ϋ†έyάΈ<3_xοΡΰg”,Έ’?Ϊ/γ€άΧόΑ…άΖƞ΅‘§Ξ>x<Ϊ―\‰ψΪ΄fei΄›ξΤΤ΄xθtΤ―Υ�֎+LS#�Aβ0ν!₯P­Ν)8`―qθl‚BGΰ p͌«8=܎•ΣHlAΑ‹F>ˆ‹΅�flŽ R©ζ¦UΡσΘVu΄…�h†b:GχRΩ"Ω’ΚMU­ƒr@†Teνθ?&a³υ’‰‚:ƒ*Ω8@h•­χμŒzςpΌq£‹>»—Η}½ύξΫ<Ϋ,‡ΉuVΚ„€sύέιe eυ.YŠc€Γύ-ΆςΤ‚ƒ�ρ:š[ΕΪυtuβ<@­α0VahϋΟφ4u€Λdβ*1^6±nάf€ec(g…;[žsΚΚ€NΞΓ•]—QΠ2 ‘Γ‘π«1ž­­4+ϊΰ=F ešu2ξζ•W―`€ν² ΰ[cŽfΔώή u¦›θr=VΦΜZε]Γ ¨΅΅ΘfEΗΝ½Ψ_»Σc,”goηZ‹,5—½τ€ ΫΥZŠΟ₯*‘θU€™F)ώN§ΨμAέκ‹y_wK5τώB(ŒŒ‘3Κ^˜EΚByTV€΄τ’a-€Ξ»6UΌ¦X^h³Κg•ηέ$ηϋ‹ΙBκU˜΅<@ΞΡ8~d›h>e ­ζR~7‘Ϋ[ς"ͺYΣΠ†L”N[ “’³£‹lΦ:Ηο¦…©Ι(΅QΖ΅mΪ??:&Σ3ΫΨB³8$>»ϋΜ9ϊΠ”֐rΘ…iΚHf ω²€€Žη^@I kbπy_εZŒ…h/š²ιΚο‰eaκ*φ—qΪƒ¬Ω~Ύ€Α:u»ΦΛ 33šaqΡ¨¨ύor GۏͰ—Š™χΜA>(Έμϋ&υ³γά—zΡ±₯‹ψCΟΣ―?�U$\hχψρύ;Ψ―tω�K‘«˜J Σ/Έb�₯%τε ²Οτ_\‹g0{¬Ι�Ÿ�g¨2 ˆζšj‹s‘v(Iz2π„Iχ±ι”pL#OΧΣzbμΨ9}§�κȚ όωi,ςrιXδΊzξ“s²2=8 Η\ΗηΫEfSl AΌΠS^~σI”“Τy¦ wcίς‘η²h²WΜY(FŸ�fl(Κ'q]{άμmο.ΨlΨ #6’ε#bΏ.^ΈˆΓO9(koΠb©ˆ` ,:Y*u5ua¬Υ)Ο°‚M”QY]›–ρ―μ)POIΒU΍`Β ΣΝ7(ϋΊενι΄ΒHίgO‡a5ΐΕ^:ζΧ±™f"<β‡ίΕu=/κ}}Ο‘ »»Ί‚Yΰ})3²JνSδ€”#�©2œ�SF°ΦΧΆg3WΡ�[ _ǚκ<ΐΔ,ΐΒξΔ“&;œbCζdΉ²žΨ$Pe n e&Lb­ ޏπΝΤύΪ~n5τ‘:0§G="`>;ώΞ~ βωPΚΌuύϊ 6]p— ) α3k/=q†ymPΈEFω­>–>‡ΎΧžΰ?Ο�ΟZΦΞ³/Vjωe”ϊά6Π>$ΰΚGΏ<’Ύy v  ΥŸk§΄Ϋρz^Vϊ(Y΄ηsύŒR@>A5›I ξιΛ[Žχoθ}•ΚΨτUŸ@Ÿ\_9¬–α£-QΉκAu‡e–GΨίΚZzώgCƒ°7g`λ΅Dγlƒ�ώ —Ψ·B²υ“ιΑ£4d†•ΓώΫμQߞ.‚κγu·Ύ•ΰO&Ή–ρ]gύVΧάψγΐ œ±Ž[τ±d νϊ;½MίΪΰzγu,έάζΌ ΐ¨³0£ψΉ§ °%τ˜²Ÿ@κΐ΅šΪ’Τ ό2 ) ˜Ψ€ι’±.L;@ΧΔ’κ όˆ]ύndʞ0�ΏTbzΒyŒ1Άq‘ΤΌ=`o Nr[ΐy–UbBU;.ΣΉ+3qΖΩ_eΟΰέgρ\…žΖ†ιΜ+Gju�ΰe€�ΎGύhί7“‘φΔ8ΣΥΛΩkc}XSφT»Œ`Λcτ/e+›…ΰΉG\ΨΦ3|ξWΖq°XΠώΞ²ŒΈ·žΩΛ‡ϊ"ξ;Ηoε ΆΜξΞΉ/?ύ«ƒ›χžή<$ψ£όϊAϊ§qό'�έΏΘ}pϋwΟx`(3μ}gΞ¦�ΞΞΘJ_}ν5(…ŽŽ)&SD™{1Λ)d²­»`@ΪΘ1UΤd#D6OB/£ ‘1!XΑfE: AΙζf•ˆV%(υΟ‘$Pk”Z ΄._Ύ˜ΪZ[Ή†š,΅δwΎΏ“θN*Β$’‡’ 8Ψd9,@ω4˜ΜPAθX#c(?S4Aε³3Ÿ§S©rΟάwŽ yf ΝP�|ΪhΞΊ�MPζΆ(¦4HjmkŠZΩS<Φ@ή;X·Y> ™s‘Σz([MŒ`³FzΧ‘`(-©“ο³ΠΜ5’Ο‡žαPγtρμ*ΏΩΈžEEμΪζΡ•ΩζQ>Ÿλhί©:fd’)΅εB b�šΊΪX“²Š"PΠ²3 χ6iІ‡\οΫ―Ώ![5Ž!Gρ°W»όNGΧZnMdΨuφ0JΗθΚΝηˆ€£οp(2%’˜*7ό]κI}Ώλ+ΥΟ¬}l7―qΣoΒΨ Π τΝρη λ»λpžΊZkΣ›―]$πn‰ΞΆ�νχ`$bx*ιΚlΐΈ‚\ΊŸŽΤ ©ΠtȐMΒH―“}•ž§α6(W‰mSΛ¬Φ`1mΑΤ) „Ο9;ȚyQ� vXΗ"Ο!½±„ΰΜf^4·9Ν©Hξ?MŸύϊΛ42 c£€ΡBV*+u7V₯—.υ¦3½­4Κaœ) A!Έiϊ 2τa3ΰ…άΏNEUCY‚J.(F”πŒ‘ašŒAΝsΌaUCUzϋύw�ΉKΜ€&Σdΰ«Ω½z•μηTThdƒkΟ l)εΚ•r­Μ76sŸτξ·ηD§Ϋ}�Y(π,rΝ,Φm§_ω•Φ¦ο…ͺΐpΨθS#–…‚�ΰΕ$ςo&ς„Lε-œ<ΐŽ Αρώm2τ65΄ρ₯ηUCϊξΑξiz>HsΌλ·ΙΞOΓΐPθ\9ή&€�υμ ο8-8 Ÿz7NΧ «ο ΅Π€8Α‚ €FLηQΚςοeΈ£D­ν« h­ΑζΆ z6cdί,ηΒΜ{2ν¨,YQΊΤ*DεX}rΐΩΩ 0“γHV3'uλO£O ηΩη” ƒ»3‰Žωe5ΡY9`Bf͜dœD;ΘkΨΛ(§ΘΑYΛΑ°AλτδYG '@O>SnS˜_ΜVžΛξΣUΘ“S9dqε’—³(Ε�ω818$;ΌΓA @FɁιmCτ¦+hηtƒvŸ?ΞξL2蝑0ςός˜lΉMCΝ΄»·6ύ E݁S+λ耕\ј΄ŠΊl(‚6%t:^ƒΣΨΰ0„Αή›5γ!YŸ SΜ @†K[OWϊπgŸ€¦Ξv‚WΚMpV‹ŠνΘκμtšI\Η‘Ι‚~³­3μ΅ ©»δυ–¨l¬,E}Ή£΄ήΉ�σuϊβο?v‚LN/Ÿ σ™΄ζUϊψ›dš›[Ϋ�ψΨsY>βœV…>0ˆΩ<ΦQ[GwΩxσ£χBU‘>ώδφη„Lύ3Ψfœœn°ZXασ.§�ΰώ£τΑ'₯Ÿ�ξο†·Fž6Pκχ§*2§oΌω6z΄š_s‡³.ΏΑAζš–φυυ’mβΣΉ{j*ΝL <μrO6Χ¬₯y_cΘΝ!ΰK>εP­”{6 ˜©©U}Ϊφqμω(’HVyΣωήCŽsΡCΩ΄�ΩΕI_˜_AΖ*β |υ›ίD0-hΰΩ7ΨΚC>uόΜδ)(Ϊ±¨ΫF/ΩΒL‘ε}²Ρd8)ηG8Νψ Ρ{Γ,87]šλΰΤj σ9Ώ:„&4l–ƒ>Φ‘/ε>ε–— B Μ—Y£E2ώΟ‡±Ρ4kjππΣ§θΫΚΤΣΧΛήͺ#γUPζΏϊΝηQ–gΣ°λΗM(-,ΜaΣ-J€6Λu Ξ~σΕ§Ό§*5γ(o„άaςΣυί|EI�<₯8»”Θ¬q†η`ώ¨γz{h;Ώ‘¦₯§·I°ξH/ΰΩ7θUΐYF˜π κ£f52”ƒB‹ςοwςQΝΘΥkοΌ–^{χΝΤyΆ;ό²–φV2}LΠ‘eV’Mζκ:——\cAwυ» 8½¦¬Η�*ΥΤM Π—b<+O KŽ•=„mΣ–�Ύt•IMμ)ΰzξΜ™>ž‰Zfΐ……Ξ Οβήj³ΛΉΏή³½ι�ω³hοΠžuζσ 4ŠB"|K}Bƒ~»Δp(+/ό³Θr’W΄Ι*UύΆHJvJDφ©ϋ#‹ΤL· !™e�ό5t_]#‰Ξ©φ―•gy…R3ξ7� «r‚rχΘ¦Υ&π5Ή™.•θϋ_Τ:ΐ~θŒ]Ÿε˜~Τ«Oq>ζ9'€ϊ ™�δ™ΧΣV ψL2^Αΰή]#�.ΰzœ+Ϋ/Ψ‹<,gφWUsΨ~–•=Λτ9P�j‹}―:Y€?;M@rδ�υΜβ’μ;Ύ/φZC¦₯~­Σ’ΤηπΚ½ε+θ—d Ζί²«/Ν'DΠκήf|>>—χdφF�ΪQΕLλβ,jrPω€π=΅η`ςfυε”AήΟΘ!eYklžΩvϋpψmπ½ΑYQ¨Ώgl #Ά_Α’/}Ή‘ηΓiΎ)YψΠ~¦Χ―'η3λ ̏3E™ίGΏΊ •‚‚ΕΨήtˆ ₯ Juη!φ„ϋ.4;�΅G‰οWΠΨΐ\ΰ]fc,°ΤI_63₯̘D`\€Αoο#Xɞkξa—3”‹=τyL “’©_ ²@2φlgκ…q*Έ₯ά fOQšη€,Λ�lΎκ”(ΑŒ`|°ηΖJžŠbΚq Ψ ωBb ' ψ¬N½ΫδY³ψ|6’΅ οkk―"(jq?άRΘ–gL%@©ί^[π #JH(Ώχσ\3�f’Χ‘ο~φŒΛΒ-?¨ΜΣfkίέ_εΟ)5ϊΨύΉ=ΦX@TΖw”πzΛΫυ»•5™Ά–S)ΔΚx”₯’{8qξgΐ΄ c?„”)eάW ¦‡.AΦβΌ‘Gˆrιqτϊ½ο>ψɍOΏόη�άGϊΡ}ω„?Έ―Σ•Ϋ ήi"γσΑÏ.¨€­ί-Gtuw#dŒD�ΣέήήΙ€Η |γγΟ1DΜ οθΓ ια%„²!β“vφ‡…)Œ:Μn°_"X ‚ΞƒJΖΊ-WΜ!΅�¬œΜR�ŸώτΓ¨oΧθ«DuRζi6:ψTAς~ŒΎsY³π¬€@[’ ’₯•ρΰ΅B’I΄Κo†Βθ½Iς™ύςο:{fώUςf΄-xε₯+ΡiΏ¬”.ΘtKm¨£ƒ3аcU€£[C&΅Žξ―΅­½ ΄4Αΐ; X%c0_5Ϋ9΅ψΖ έΠ4iΐ436B ΔΘ,”σm'¦§Byx�+ΝλXκδf㘨Ό­ υ°ZΫ§"ΡڐI₯'pΰ2kTΧ~fa,-Ο`xœΡ;½(δ]œθα§Οiζ6A7σY”]Žqκ‚RΚύΪ$)2C8δ)E88f…ͺp¬Ν²Ϊ€I₯+₯²„gYVΩ—AίΝά/‹)• )Ÿk–Ϋ€H…ΰG²©ΘD9BS'€TΘ ΉΞΆΚΤέAc§r©rΤήβ¬ΫθΚ΅qMV@£—fΖΨg9Κ$‚^Y ΓρCRΨs �ΦWι ₯Π†eώΞL›ίV‘)3 Ώ Σ`›  ²Fe�•©―ΒΈ"K4‘άδZbΠ«kα8eσ [”z &σ‘Ίbfb½l¬δšIa··FP‹Ή'6λ²wΉ–CΚfPΦ£S|ιΙƒρ€Γ#Ν|jϊA\Nkμz–"464sFGΉΏt‘�bμ‘™9ΑLŸΜθm4΅±Iΰ"M=u<œΛn'cgΎ«μΝϊ”¨8Ω@GΞ™αΉ§d]ΜΨ$ΈŽfσΛpΊμ /°ΰϊ ϊ9fŒΚxN;Q{ޚ4μ1 U―`¦ ωZ!e‡χS ΥΜδΩ{ΡSΑ„kŒ™ŒΜ₯ηs--S„]„\Γlf  ΈrΤΥέsƒΝ~©Η,Χ°§ˆΩE΅©C¦§'ΡφΡν;·'Ϋ•c@IDAT@Ο©ymŽoŽNsd’χ; hΰ(>ΧΥ΅±F™X…ήΐ9ΡIt� χ—…sωTΠΡπŒ’uΒιΥρ+ζό„H7―“™½}ω‚}UDCHY(”IDW~0+u [Γu8η”‚υ^觇ΗΨτvXικλ ΏMI†rš}Ϊ'θ?„ραΙ‘όKΗΘ²œSd$ΠĚώ1IλO]6=°bCƝ$φvœrΡΦέΓΪ2!yέŒ•ξψΏ]Ψd°|�Ό|™’ KιƒχήEͺσpβQΊ“”9 `ύj_š pσ{νΎΐ‘#7--bψ»ΰ}F'{έ2’φ\ΩZgοx―λθ^ϊ»Μ:β«²?�­ο5b–Ω’Q_S}vς”‰>5’FK3“D“°e 0}―rΙνr|sm˞σ³ά+U�|GYθΧΓζ|–{XRθ3Κφ2”ΉMleύž AZΏe¦nlΘ"δΎkƒΎ΅ωμψVV—ωs πηΥτ“>FΧ^I=Ψu{©+'†Ÿ§Ω± �μΰ ««³`^ΪΤόΈ` ™|eΕ§1±%P‘©}ΦΗΣWδ„zXB%Ϋ@τ}ώ)X ° =χyό³š�ΠΘΞ€θΟψΐ»Δ9(ύ7U˜%¬ΊG–NΨPQσ˜‹ΪŒϊtiK—V˜²4>Ί/—3xσ@ΰΝ΅²ΕΙlNΉπ\λ{™΅¨θQY ΎN6…~Έ »π§Ωg{΅μΐnȁ₯”ƒN±ΌX:�Χ· (SΎŠίΖ^y]ΟZ0ƒ}@=³ΩτΣΪ ωIshφΕδ“ρ”ΜΘΥ9€zVΞ¦€6fά!αf«>μ¦%SΟ°K₯œ7}NΑ5yηυΫ«»€,z?Ϊ.Ϋ?.“°πτΓY@e{Tζ½OΛ!Mϊˆλ±L!&ŸΤυ;M€——•δοooΆ�Ό ΰo�μΟ�Βf!?Ί―ί†£?¬ϋώγ�ζͺΛύο�ΥϋOGG¦ΫuŒE&ν\][‹‘³&§Κξ$Α:¨>yo]»F™ΐΩ‹sŒ<{‹ %ΫDφhll‘ξΝŒ4�™'³?1‘oΏE»< ΑΌί*ΰxŠQBŽ‹ojcŽ+5fs‹4υ"[¬bΝ|Ξάι9ϊ1  iv——ΦλΨι=KΤ°Ϊ‰4„ΟQ‰*„π@e―R Žˆΰ6ƒ,’HP"vWΥΤ±7Γ―ΑlΚΦHfΉk¨‘{ύ΅7S €J#¬KφιύP€`Ϋ€Ι2…ωια΄H€Ή]Vτϋ~φ FΑhZZ’‘ލMqο(-λτ n‘+Άwχ’MMε½Ή9BfηνœjΉAgΟυ‹’ξ9zŒ¦JHτ·$Σ†;8Υξ…Ξ’]T«hψΤήήFyΔωhyϋΦu‚6γνیhƒΟ’·υ:TGχζ&νΫFƒf™€(GΝ„1Τ8π:@7 ’ΐ‡Y6χΞ‰*)QP›UΨΘα}~ιμΈ* K²Ώξs-YωβœCΖ.φ¦ΛΟ’‘€~Ž‹Ι ο^Gϊ³₯γΕμD/›@–ΩZ>(2ΣKs“aΠuΌW·?X P<ΛΙ>i\• �w£τ½ˆs=»έτΝOO΄β|°œˆct7‰xνϊτΛ_|N­3} ΨKι#ΡTSNc¦Λ©³«‘}&γŽ|ΨΝuQΊP¨e|Άe3‚d�ύ| oŒ„3 ΐκH%›žIίΜ>…ςJR(ψ‚δ¬"ΆΎ,fΊ—„±ήμχ�ΰΦ2dΧ06dΌw΄ΐ‹kfΠθ:¨”γ,²O:+fŠuΖ£¨αΥΙ;"o‚tϊl2( ݏΨCχOϊ\<F–‹p~Βp�Ά6v2ς;ύ_jΈkΌ‰qφdΗξq}>­υVzϊΰ~{†Σ 8SNC°|63f–#Y—ͺ#πδ³ψfΚuΠ%ά»]αέί@θy&)–™YšΒ2¨m shS4ŸYq’}u€’ς¨γ2ΐύ<½�,͎“ύ%ΈΈ‹gCΖντ|Θ=—²iΈφL]–qsθ―b†Μ1ˆ–'πb‰ž'0ͺO<;fΜ€l:}BVBNW1ΐOFγŠ~δLpYφ ΰΐ�‚(=ΐΩ·\#¨‡ΈZΞpnηΧ"0vΜ“τΗΦΜ!�Ηfs=‚l圡Աςfθ,›PWύέ™ΦΡΡ„.&ΛKΖ FηL&N3ιΉsύ8�›ικ+/σ¬Ή°•FβstΔ >K}ίxχύΤΩΣ ϋ‰Μ΅Ό}ƒ‰³f.)I@V‹θ+"έYΠ)UQΐΣ‹ŠΚi. Σθ΅·ί€YTEω΄Ί kΚΊ£ ²3hGN”*MiΘkMΐP‹έhlι@^σ5£­5XDŽp’S¬«¦‡,˜` {Λ9BύΓΆ’' ”ΨŸώμw"ψξμλK—_~%}πΣOR ,†ώσŒΦjjIW―\εŒPa¬§•sοξ]8^α¨ΚΣ1R`SuN·έ“¬m2OηΡΡ€όg£>ιυ:Υ”!,--…ΥωΤΩΫBώ•q©ΖΦΜŽŒ"€UQn΄F/υ–gRFŽ΄ΊΩlžςd@Λc"S$ 8£₯ΜiW·ψƒ&ΛdΌ˜­—±&EH'd©=οQ~Γ3ζ’“Œ\ԟ‚F–Gψ΅FpλYΚ4ZΐrΜΩ:ύlΆΙϊ’WΖι{rλ9G7ύυE|…™ͺΆ†#:91NΓΎο�W_|—Ʃɏ €�ΰνχQŒ}ιD�ΠΎ”ΦLR·?Jφm6MU¬ΟΔΠPΈy- ?|Nπ.«υέ9Θd†βp©3xnιά{³»μΗΖΚΰΦ> ©ϊTJ"ΒŒ₯•$ώζ―ώ"ΝΞM4υCa‡ύ^ZXLύ=ηP<Dtd7aRM–―₯¦lύ%ΧR™\]Yΰ³Ά¬Χβ<6pόe.9υ¨½$˜a§vk·‘ύ\φ΅‘.^Ίε‘Ν­­€EMiy}2ϊ,}φνη$7&Δ_J―Ύ~ ‚Ύ.¬Σ΅oo‘Γ₯G†ρuΖS΄8ϋ_ΨPΡ)?�ρ™υχΒή’ΫX >‹Ίz’κFύ.�΄ιšΣfμ“b—Œ¬ hϋ{<ƒƒtΛ'· 4waΧδͺ£‘Y―νxιόΦlξ£­Ή•DD'ŸΗηPz—Η ”iِ– h»‚1‰ Wρ\»±ΔiΗvŸ<|J9�Ο’ “–"γ3‰$–ϋΧ~*³ϊ2²τ©ωA螌Όš=ζΖψ½²›ρEω7―ρžmeΚζΫ/`HL�Ο€=€x’qϊZ^CΐBΫνZΘ&ΤφΥ4u!ψΔ°|[žaΰ¦O­omάΰΊ’„’"KOdΠb'p#‚I€?₯�₯ο—ά ¨Bπ/ΐ*0l0μCΦJ;*Pc’ΠğjΚϋ6‰_œΦƒgΦ/_'ΫΜ_8·A­‰E™\₯~YΎlO‰θyBP©Ž€²?–e 6F|φπ!ύD6ΠaN[“ Αd Φ`›σ0Cb±έΕm²§&Υxώ�?l)˜ώŒ=FdΝΈΟŸΖ&₯ψΝ²­½Ÿu|}WγΩϊΠ›24(©πΛgT'j―υοέ{'ςΨO@?ΨR­XBn"ό=χ‡ή°_'I¨,dGΠ9κ�ΊZd=h?Σ@]_?“l•Ρη²Δ&Θ„Τς,Ή¦‚.²‹M*°Φ%4Žu«"vhβλo.βYώf² mœ+ξ_c9Ή } εo‡„“φΪΧϊ(cεΙ{(ρœyώc3°�―ϋμ™:αωΜ^ΑelΩXYήόό»;ίQ²ΐo\_<υολ�Ω‡Ε s�ψζ7χώπιΠlρ!cš @UŽ �Yš‘–@`έ!‹₯³²-jE ϋŒ@ψΣΏ�gιI‰Y=³\2°Τϋ ­γ&8‰ΓΚ €ˆΐΔ?ΥCψΝ~±Λ! J‡œPν2J<ά:—Ž7±™Φυ[ όΦ| œ~ΉŽό‚&h †‘A@U!p’N›¬§=ψ:©φΘ¨kΟa HΉTαŠδοαŒΚ8¨«eόY%)Œ₯d�¬Sο'#°05c ΄―Ι‘GA ·+ϋΞκΘΠτ#θ„8aΞ¨ή Φ|gU,VQ„Β΅α‹4Ύ§ ύΟG-L 5„γfqΜΊDp’RεοBο;?ρΰ{ΐT"’ΙώΥΜΈγcttΊ»z‚εΘ²žž�Pώ’φξ?δΎζpJΒxpΈbAνoπ]…#cφΟF+faΆ5‚kά 8¨"…P�Ώ'ΕR‡’v« ŒΞ]8Ovͺ/²σλtυDPΑˆ·ΆPfΐ5mβΓ‘ΘΐδώsΝΆ•ε§ΞƚΤAΠέF†k›l†{€AΣπeϋ Κ¨ΘqP,ζH‘βK…²KΠ¨4nΌΟfifψ«a”·t‡"ήFfόRaz/Ύ4ΠώL'] ž@8ΓΈŽγ3‹ΜζώeΊ«“ΔX,AƒκζΦ-/uqί}mtmΆŸnDΘ‰LΣHΊ—[P¬χΈΟP~€G: ž!ŸΕ¦tK€:‡μωήq1e πRθΤΦΣ™ϊΞ’…ŐβeΏžN»™NkΡ`gΎ/pf·8ΏΚ†tIΑ@ƒŸΫ€ΫΜ·gζyΥѐ©c]«‹α”_'gƒ)ƒΆ]ΞΔ!υl‡w²Io§σ©3œΕZeΕΩΦΰΌ$λ¬N< ›€œŠl'ΕΫ·ξBƒ²ώ$={τ0&¬σZ"Ήpθrpφ2pΪΈNŽΑ�Ωiί€Ψ₯} ˆvd0RN$°›΅ΜYΞ6£�ˆ±3Pφœ{†"ϋ#ΊΈ΄Yε%2ΆHx#ω φ: 8YRη1¦>«υ£Aΰ‰a( t4Αdό‹ΈΎΒ:¬, uOd–ΌoŒΌt}8Ωθ’\ξΩ@R³ΠΆˆμi)ϊ"œΣpήPO ²0�ζ§EC#Jύ8r²-pqͺ(r–a‚ yFAεz½,λΙϊκ"ξߚΥ‚"D; ――ΣaΊόςΩτΪv©§qΩ•ΧήxŒ5NO�ΉθœώψΙΓτtπ1ŒŒ₯θ,ί…Ί™{οΓ™¬q g•Q]ȏ%–άΌy§ΣΆ Ύ₯ς;šS}XŠ=-E—^ϋϊ’€½€ΣΟΗά; P€�.ΜvΜet†τγτHzA`Ύ0ΜΩεΩμaMK+λ@i( Q}K[€aφPιθιI³«³τ A' Μ.lηΛ7ρΛ6ψάj|π’8N―r*”cN—Ω7υ•Ed ηœ>0<1g¬,‰η€,€|'t·Μ3AΩQΊΐ5θ±qι₯ΛΨJώq9Ψ£:J-ρΔ ·˜Ԟ.ŸΏLΟ«ftοaϊ?�Ν�M‰kiab²š™`εfKlžuΧθlm ώšf»Όλη£RП.œυ© ›JΞA`ͺQ)gCίΝsb +ϊAͺ>&=™<ίμi E ‘απ₯K—�[oΏK€VΟΊΖy¦.›ƒ}Bπh£ΎbŽIυ>2ΣΏAdƈΣP¨b@�&€O‚Iz|9žΫ³°�έζοm]gΩGn[υοΨ!ύTu˜’ΒΚΟ°ŠρwΟ¨ΐ€Ώd χ’½χΫλšVΒh)¬jJω”: ΰ^Θ–άƒ]θ{΅ν� ·Ν­fb!“)‚vy”ΛΘ€“• xΰλ �ΛΪϋSQϋ9š1x&°CτX0ᲃn^†‰Κ&gξ—{ΡΣΎ €5ω�ŠλYGο<Εvθ³iŸ^ΠσΓ§ΰίΪI™}λψμ6BW‡‘ŏδα#Π‡οΟ‘MΚψoκcƒt˜¬œ#νƒ~βώτΠΔPš@“Ναω3)'ψtφάΕ`!ΈΔ”›œ5ΑߏΔqΟΨM„Μ’Aύ9mίΰΟ`ΐk†γ΅6Ԍ�%€5'(¬–$DY 뻨¦/ Ÿ!XγίύLυ”ΟκZ`Χ·Ί€”ΩYRΰ“ΗΈž–ά c[Hb”U£̎ΠΊΉRΧ¬±§¬/²*˜±Λ³  X&`CpeH@±¨ΐR8“³2a`ͺˆ`ΠHΨIse0™_~ιLz�½ΧόΫy›•’SΔ3λŒptMθ­e³c\6dΫ²\"γγ±oφ»2eί|¦vΗ³iΜζθIχ_Y–‘όlψyjD/5�tΧϋ–IŒτ–e9N�‘ΉξΟμΟ`Ή‰₯+\‰sΝ:G¬†οΛ^ΓΉw!1|�λ*ΰcYƒΏχDωε©Κ|±.<Ώϋr„NSFτρT799ΗY[­΅ΥeΏψίώμ�Z}ρŽ˟<Βολ?ϋOώAk}cοξƒwΛΖ&&―“υΙ'Π©Ε12€1smgθeΠφΊζvšςœηBy" l‚ŠΏE£Ά'g1φŒ/pπΛΰν£œ…Τ@1ŸχˆΪЉR³ϋ� αœΏΟΈ;ζ>Ψ/λ`ΧζŽ[₯crCm#h/Νήζ–�ύ{χ‘+.’›."΄‹πnBM²1[° κ¨ργΨ“A€UΕ¦R΅ šΒ₯άBˆ2πOGςTXΫ¨Ιs"p8AΨP_—Ϊ β[1šηιθάG¦% jxK³υ=ΰΒΤΥ)ŠΙTΫVγ\’‹6BIΠψ&“( ƒ°]”ΏΠœ—όœΪΩ‰‘§0œ€|E^BΖHƒ�ήΡΚϊQ«ΎEΠ†…,`-­'ΥLΨ”Θ5Sκδ{˜μj¬£γœ@ΟOρV­Ω– [‹ηlεΉω±4::ˆσΡJwοZθ^γiy "FΠyΩ: v ·Ϋk>Ζ%—ƒ­sΖΐ(3z §= ‘ΧεΉuf‘aΰ1Θ¬—{κh+gΉ[žQŽ<υΰX.¬Ξ§…@ j,­7ΣhY%z¨α^P+ΊYa†“lK€ΑΩΞ&κχϋΙ�£$qΪt0€«1 uMX�ΈV1χ,=Ομ*° 0„ ΈrΟc――Δ η—Χ§₯)Œ.ώ“bθ‹JΜpκPπ`ιΞΦlΫLΞμΕ}ΊB�εΏύ›4τ„Q9λtU/`¦8μβ�,²0�«Ξ¦nf(€πΡ²XA֌ ‘ggΓx~‡Rž=ΗRΰ@}Š˜‡N:E7ξiζΫ―­99%σN=z>Žη{�45Πϋ‘ž¦‘:ΪBY "”Β’Ρ Τ±ΦYV‚[FσFκ�p&vΘ‚@ktΝPzf z,Θ#ΊΘ¨’~θšXͺ’“­’Ά\ Έ gŸsMΩρIΞ>†1‹}–Qφ‹’Άi%οA.σ(-ς”ΧδαΘ`h–pvUΎ‰άΩθo›sΎLΕ.gDΊwt]±±›œ8·YΘΛςθlk �adΘΔγόTΌ8ο�k―§—_ƒ€‘ ΡΩΓ8؜Οs=“¨ ’Y x³ΦμκXŽQˆΓΡHπeWπΥεِΟz²mœΫ}€eΒχϋ‘¦±KΏ¬Μ? KΒύ›…υΊ7�Κ՘G (*㦌sdΉŠž`ή:_=` `A|€!«` ‡Oy­€Z3w6~U—Ϊ ’-FηαΨπuŸϋXΘY©X�ΘΖςηŒϋΤΙx±ω™Žˆ �Λ6{T -Ω ^)ΏλιkΓι¦[g.B·T’ίβ¬ΞΚZš˜KΣ8rύՍεΤΦΩ‘ήύΐ²²ζΠ#C8‹—ήΤX£ζω1,¬ΉΘ@žB�ΝgŒ₯fχ F­­W?ZΗ_FiΔε7―¦ίωέί₯ΖYζη: ύgΞ₯7^}“{‡ύCYΝΛW_%#Ϊ…ΌΰψYC³Š7o}‡nX‚ιSγŸ>}ΞYFuς`mΑθP7^yεjͺ¦η‰Nj[[;A΅›d‘X#Ωsό•ωήO�Ν/Ώƒ&J`*(‚,xY]αT�ξ;οαx–0Y`ΚΔs€šΝ”Ξ]ΌΨ<`o±M29Μͺ#΅Ιf ϋϋ/ΐvθOΓ؝ρ‰ξQG~COΣ, ΛνΫ4Δ֊ͺζP;ο8Ζpπ°5hYZ§#ώΔΔs΅τJh&0%ΓΗ΅r‘?A*C(©Ό »T3ο­χίŸ‘ž™q?̞ͺ[c¦:ŸεΪ¬Ϊ™5²ΦΨ¦Š6†<ΐ‰t!}oτLΐ@[&gΰuŠάΈχNθΙC~,30¨r•ΤωNrQ7Xr  * $KγΩ½κ‘•Ή ίD„–Τ`g„ b!μ=‚-ΠΩΒFάΙ ΄ƒ@…IΩ=–Ι βf@W@ƒεmhφ8ΤΘ§8Ζ½υ]M€Ύ}ψ#dHYΟlξ=‹σ}9Πϋv ·ΤάΖRτfxιΒe”[‘“–a p^+°Οή|]]c€Γ=}}μα>%+θP€9>†ήϋΖ=ΒnάίYπ�˜Fͺ]Τώβ7Αvaέm˜iΰfyƒΐq{(Όσύ ϊΟΠGa9έΈ₯]Υτ’†ήΫΕ©«o²<ΩΘΠεGΟ(=Jsγ±V₯ψY€Χ»œ1ν».Ϋ…@‡!¬Πq†9aCr)ΠΞ˜h#«aM˜Mχμ΄j£ΤQ’†ŒΩPΡ^4#Xgξ�Ω> ΨομjI?�=ΗtΎœδ3d”χF3G'[-ŒM₯bμm)Υo₯θ=e$ίΟ³ν ’K­/DnτGšΚ4)`ώHώl¬η¦Aΐ¦‘‘1Φ™ž$M ΄αSr)―Ζ™ΣGσόEΛύζ<*Y™€_Ώ‰€/+γ·jλπ5φ7—S=’φwΦ"‘εϋ ΞνΡ€f€.;ŽfMΝΦ; Y΄A7οWN½ŽϊΩ`³:«ΖkχVιΫΐٟ™£t–ζ�υΥΌ~+o;0³ ’eΚδγχ 8κgϋlϊΑΠψΰŒ›ˆη2u™Οζ�™Mη(σφν΅KyŒΪuτ½ €χ ήηΨυwD’ΧΞ§71CΎ»ΜΛxς;ς‰EϊΊΊ‘ƒL" ‹3ΨJ°­κΆg†IŠFμθ6²žIψδ”γŸ°OλdΫ”ν%’―­œι‡pƒ‹4lυΎ6–Ό_νk¦€!SZ•ιe σ@φ„Yω ΣE;αηX μŸξu±“Ί£;aγλM¨ͺ» ˆ/²xΏμ}υΦz€!@‡I| šΛV±72vζI^ΨWKέV¨ήAΧΪF©>*B—b!X+‚oτ”kmΟΈ#„Η1š6aV.ͺΣΗΏ xίΛyhηΌvΨΧΕΨ_Χ¨΄ŸfΏ Ο’6BΏΣ¦χŽψΜ˜²―•ρ†%‘&+Ppό#Ž=ΟΘ~ρ³μ²ΣŒΚρ›-±\˜_¨[_J } ›2:>Ύ˜}Œ”{{¦ψΉ‚‚No‘έ°ΚτGH»Ά&{)”u}e�ξ=i3Hu£ EηΟ‘Ω§φr ΒνΪ/†άηdΏjj|lσ/o=Ίρ―~dS~ΐΑΏόΣΏ\Οϊ“ΦΙtςoΞ<ωxe}—Μq ΘQ3‡„±}8K–(ΜRΨ@έΎ �μΪΪΣwGp ]g―Œ¬/Λ%gΣϊ2T{ q6όbŸΙRAχC0l!€S«RΘΌΑα qΘ’vƒm°―cΩ…GGβΫo―§ΫΤ{ͺ([TŠΰš8E˜E“₯Ϊi\œΙ�@λΨ© "°Dΐ<ψΨ/„N#’ζgΦ/IαQ1σO�!r• Fpσ b«RwgϊŸ}ŒΙ£ηΗΜΖ&λdΑ σ"C`#m½�΅]Λ�κ4• M–όΞ ™ΐ‡Φ±k :ΊΟ¦Λ―Ό…‘ΒΩ^m―!H—j0“ΒπωΦVeΞ!β0™au4ύ Πσ8vδ— €B& kmϋ©{― ΝΣ,?λMoΎτ>σKοΚWWUϋž³cv΄bvY  „Ρ "„.Lμ Δ… 6Έ`YR°°»Ϊ!±«u3Σ==ΣΣέΣ]ΥεMVzŸ•ή{Ησœoš+Pθ¦φλΙ©4Ÿω�ίχΌΗόΞοœΣ…σ�6i0˜½)Ί#½Σ£“Œ]’7ΐδL:¦{~ϋ„FΆ_‰³i¦»€uΡΙφa οš(ΔRΏw<ό"’xoάK 0œ–£*²Τπnn-‡‚tή΅Γζ+ίdΝΦ£f<œk‡1 ½=]Qs,%Ρ`΄YκοjafμU©J…ȴŚ۬M£Av\!k$²YΧΘzcpΌT(ό…"‰<`œtΎΝ4γy€­Ε)(’Kμw�Σ»ΚΛη˜U?¦/…―υofͺ ¬_ž€Tη~ϊρϋθrŽ“  Υ�I9 βΰΕ>Ζ �ΉΩh!0¨!³ KhΠ-5\Η�Ύ9�ŸΖ]Γ&kβœλ¬&3 CΗNΊΫ8ο[P―gη©oύπ“4<<Αbφ|πςεΘςΝΝΞroŽ€)'Mη4ψf› tΟ6ν|́~ώ<}τηο(τs_*c4 ” ƒNΧΠN�ΗdU5JΚ©{¬άzV|±Ξϋ9_6*;l‰QP±¬‘λ¬sœƒ\¬ΓΞ‘ΫaˆΘ.μ’Ε“E sya1βΔΚξY^| €#M•Ήΰ:ƒLoϟ0 μ‡ @'Λ.Ύω|Ÿ«kε ržΤ<Ž΄;z-_�€mj}žN‘Ξ‚χ�nΣΈXλ{Ωƒ‘ †Ν�<3Η‡‡£ρ’¬η_;΅ApCΐ#ŒΤOγqυ{wΒτšUή@ό%t–ΆΦ€@'ΚlŸ�ΚζΡP«Ϋά³dG–:K]i¦UO'Fp ή‹οeHaτά먨Γ¨²~††SΐΘ2&―Σ{…υ€ξž^>gΦΡ ‚ΟŽ?yφ €Ζφφn5Ξ12嚽ρϊ»τY˜cέ6°-φ_έ’M5[‹BPήΤ…A»G֜R31>φ‘`Ιr4ο³»·'υςυΦ;o‘ίΡ)œ?dΌ_>η„lΨM�­YFηaͺ ΧΓκλθθ L£y>Lsd� ΡΪ�Θ4©£pά΅ΟσΉς>t £εZqΕϊθCΛ£μ” ¬@Ώ3H=„)iΒΡmŽ]sriΛ^€Ϊ:]H½–Lζ¨°ψ΅œ3υ™,,Οο½V†žӌw9-LM£lΎ@Š\Ϋoˆ£Ν=Q‡n9P,mi]CIϋ, Ψ|v�‰ΤϋZ2ϊίό…_ˆ�χˆS #₯5έΌz‹Yι°J:²€rYΎoΑΣ&•sκχi>ίλ³Dos»p΅B)˜ž”Ο-Gv+Πk~Žuξφ9‘AXG2d PVΊΛΡ29ΑTΟ�S1£7ί~#-‘Σ‘muΉA«M#[Ϋ£θϋο½—ά{ΜθX¦χ¬s�ηmυςLεΕs€μδζ‚.ušΆΕG%Ύƒ€₯ΜuφΔσ%“D›²ž²—…Μ1ΟXψμ‡ Υoρgη”:ζ΅g›Σλ―½uρ(€wFήJ[΅²N2Ίδ!Ÿΰ¬;* l‰”Ϊ£Α ²e²Μδ₯nϊ@κZ.9Ξ zΫ5ρΜΘjہ?54K€<±ΆŽ‘•Υͺ3˜Χυ^} G8η³pή΅½ΪXmΏΊ;œΟ·{kΠo`ͺ/‚ΣH€Ο{{�•vΫsηC=_¬_ϊΔu·Yb™rPX0~΄N©zΕϋUΗ€yv·W¦° 'Bκj€–Žh�ύW;€}ρ}ψ$CKΪΊΊQYΜCQ ΚΜ$1PΆœKΦJžΑ°ϊ5τ˜ξ Φ…‰0όuΞχ&²(cYP*FrbΥe$u΄dΣ;oΎMi0‰5ώ»vε&’υE ωπΡg°η°SŽ₯?=€²Ω�X“ΪT.ΜωzK- Vdζ½ΊήΫ° v)ιτμ zŸ7°‡κ Ω½9ύ“[7*Λμσ9&Λμ{ +ŽράΖfZζi#\΅1 YSw­ΣΧiiΖ/Ν 34?¬p|―ρ Λlύ$εύ]cŒ£M°ŒΤςlΑYΑ.³ψΪBΛ§Ϋ±s2t7π]Zhœz‘�"ς‚"'κ»Mϊςώ<ίDfΨ;ΐ χ¦Œ{ςμκϋ)£žOΛ -ίΤ^“‘ϋΆQ΄Ι‹-ΐƒω•e}Ζ’k:ΠWΥΘΥ:c+°q2Θ΅a^»Χ‰B Ω3ρςΔΪ"UαΫΛWw+ŸΑœδτkόήdd >²IJΟD½œύ%cmvΕλq@&}©ieμόΝιGŸμώ/?όΗχ~γ;Ώ3ϋγ‘ΌΎtj>ΞΣΏžώΪ/ώ³¦‡ΟΖ…ΰΏΐΜρšc“ h�-“œ›c“Θ΄ςύ*Ȟu€O‡GY4-ǟ3)°ΰΜiή"›J Α‰΅ͺ\>\^)Τκ΅@Sbπ§�3cω‰ηT`*z›Ί™E GAαc0Gf™Q2θѐXv`W`ΏΧauΚ€¨¨QA(T]Š’Ÿ#β₯RΩVCΩSi•—λRQͺa€`£wΝ‡ςvŠy΄ΞλhBjhο³·œδn©C?KJrƒμ© ZTM(=xk° wΙ x0₯ˆ[ΊA€'Zά`3H6οζ­ΧΓA:4ΜsμžέGsΌ;Τ2Œ/C­�XΕΙC½ρ3škΦ9vΚ…tΟ*Θ-p‘zg*οRŸzχ1ΰγK0(fΉ­―�&+”‘!Ίk"pPNΉkdFΉ₯RΞTΗꝒΚ‡ΒmΓ­<²W.υ§·ΏτΩ¬~²Y4Λ€ωP 5Ξ›dMŽXK;[c–Gΐ@ϊ›3Ί+Νg„Ӎ[1–κˆ Ή]φ‹κωΜRξiw‘Ζ1 γΡΈPΕ[RNΦ…nπgφX„V-a§‘έg_287κ>ΗR˜ϊFκ΅YoΧ_GB§)dMFΑ.―΅1Q,.½f]ΪΪΖΪ6=>ΩE¦α}¨˜OΪ8 fLnNTkUzηΧι*ݏCκJfέύΨεόc΄Ψ”,S0Ί˜κpˆt€φw7Ή>d”³ς§²CyjΘwq�/΄ š½Ό ύ|0 ƒŸil§© ™Ό&Κ7pχa‘,©ƒγπ{o Ϝ³Ά=γ‚…ϋLΑ M½C\Sι~Rη€γ³<Θ/oδg±§ψt0~0|NƒiΖ€%Ϋ™.\½Fΐ�:%‡>Ρ7a y΄Β‘PN –mˆ*»d`rr‚ΐg4@η ΟσσξΪ*N?4uςTθ'τ†ί²(―K#eyεP¦‡5–u4>5Ψ/j)΅«Υ—f™€Υ 6^²£l�<ΎPAεσ&ƒMΐϊαί„γ· p"  P¨ƒeν­k'>€Uτ§zDΓ«Α·v9ζΓ³7R ƒΊΗώ D¨/—`lm"SX\ςt‚ƒ4΄¬¦Ÿε6Μΐf©e4ΰϊΞ YN|’GΜBϊω§ιρση‘Ώϊϊ0ήθτ«ΰ§ηHΠe²ΎΊΜ–E2Έά£9ηNZ&‰TΤ"9η ΖVαG=%Χ.mRΰΘ{iνΚBΥξ†"܌è^ΕYBξ\;Ϊ;Σ£ΗχΓ‘οο³9Ÿ”pJ«¨₯μ/ΔΫ<κ=Ύ»EΣPώVHΦάI4fΠχψŒ«·`½ωAFkŒτΊeœ±Ω‘£Ο`“εœ^ŽH†F€fξΝ€ιΛ$ŒR­ΡΨJb΄έΐ₯;ΰƒ~ΐ»Μj,Ά�s_d}ΩHφϊΝWZ ώ8�‚tf¬ΕK�ΰο�Ο-/`)pM|žŽcl<οΫ„6’/Fω^€8AΏήΏs/ΞL9Œ.KkDa=~]½<;a#V8{:^Bάg¬ΉΚE–——™°CωΩ’ @Χ >ν΄ίH™Η<lς§sμψΐΔδ( ‡Ρ΄Η΅ΎK&Ψ=ΆάΚRŠΛ―\KWYϋΆΌυξΫιΛ_�jΜ8ΟΤ–s^i †­΄¬Cvˆ­:β˜,έΦ*ϊ=κο,QΡΡχα9ˆΎ'όΛ“ύMƒž—bμΪL=Ηκθξ geΣg–­Y·4OΠ\`AΖ–4b›‰ι―`gχωΎ€ d-ΡLX°B° )›ε(Lpώ,ΑrR‘:O@�,aeUA€ 81A0ΜZσΎΞ}―ΝXE°919ταρqϊ!=β°ΓŽ“IΕgpώζfcί²mνά{T‡φ£Ι O 'ΕΔΡημO3zQ ΪλΨ Εf—ψPSγΣia–~UΦ‡Σπ±€ΧŸ Υs–”j ΦV±=KCλ!ΏYξ―¦CΰbI؊KΤ’ΧP:±—f&ηΉ§MΞ!tzΞ³Μ uUL=`΄kΚΈ6ΧΣΊoυ–lƒ`επ{�f3Ύ`dϊzΩ]2^l°§όyΞ VΥεžυθoEΘNΎ‰#~―]ΏŠ�¨HS330TηΓχμκκŒu°Ϋ»₯t[ΤΛΫΘFΥ•²(⨑‘Ǐs=s δ)dJ]―zpμ%ε•ν­4Ώ¦' 2d£Τƒ-š�±_cΨ“‘ΘδΚβα]8‡x|žύCν§€6C]ηgω0θΣ')ηšΉ·η‡Ο Πκ§ΟQίĘTšΘJeχ’,Χ v$ο­]Χώ\ΊNε€₯ξ/―σslœέ‘Bπά3ΦΩυV~eΖ©±ρ_·[v.(;.‚IΌ³c„šνυ¬ι· κΘρά}Q.α~ͺρdΏYb~$ϋ(ƒƒΗWΞΞYF  ΅dE |f•Aaμ7zΪ³d¬`0~οeί€RτλμΜ\Δ!2Ž(%ΆaΉγΕυ;;:Ϋx>ξs€=ό6€;²ωˆs[J γθθZό“Z–ήnΘ(’ξ`<gYβα²i?s‚@— ϋΗΊΛ<°L‘_ΨžX(φNω₯! KLθ)Ό‘ΏYϋέdΓ k⽡ÎνΕ‚Qεs°%ψ+Ζj6»T&œΊ$pq kΘεΧΘrf<-ϋνT8K‘e‚YΙ&}TήΣΔu%gΙλτl«ΔhΆ_sζrΕήΩΏϋ�d>·Λ/��ληΎ€ο€�―�Bُ?ΌϋK 3•nšΑ€υŠŽς:…^ζ<πrr΅f;’±Η:Aρΐ€t»r2l ŽΫ©'°•jmkZlj�_ΙfkΖΞΟφΗN*l\³ΩIΡ"6fΐ*‘<ΑbS3ƒ{;˜ͺόΜΰy(Βΰu*tƒNέO…Α:7Ψ юœϋ2k– Ας…ί¨ ΥόηΑΠieυ@ΨΨΕΐέ7=GΩIόΪυKŒΠ»@ηdζΎγΔT}Κ£#κ9‡u‚€Ό΅RǎΣU†B/DˆΟQΌ5uΝα”Ϊh¨T»šΐEΊaŒΕΓι4dVΕl¦]ζgΗ§˜7}— }d)%x™a‡Εf23dŽYŒ<J³“2%κbFpœQ[‹!2σ”s^¬Ή24@UJχ0χvu»ΘJ„Ί43έ*˜ Έφn²O޲΄ΔΖLM]R2u-ΠήV1ZΉ>D•Ύςd‡y³ΫH±·‡Τ|ͺleKΨ„ΚfDU8ΕΘw4#/‹ύΧYA’ψ ZΝδr½tͺήΪΑA9,HCΟG�ύϋO φmαΔTΕͺv¦%τςuεΔώ.‚X•:΅ώ(p½ŽŸrB‚β…ΣƒΜr]qΝ|^!N‚Ζ^:ΆtΒsΞάυΨKP_X¦ – ZΨ¨yσKo§.2PRu,²ΩvδΧk|Žό`€ ‚YWǘΏοβ4=Ι¨ΆΙ…~)4|-‘εΐ‰0saζsλΕr¦" pόΐ�[Jΰ9σ€²cΘ _*΅rt€Ξ:nžσ–3Œ:-15ύ£ΰυκΨυ8z)π†f"tH¬w.ΕΈ˜ΉΦφΉ*~AKΑ„ ’;*|MlΛ 1:ν݌Ž…Ξ[‡ƒ«s`–Z#hO©Τ6ρ‘I%`!σH‡KΊkc}S°?žθnΐ‚ΘC―ι\:s~°TΠΝLΊΖ?šCαdpAΌ,ŒSCKK8}Ύ― `9Af9`[%gΎ–�»ΚσΡ2.0Έ―CτŽ‹“ψŒd ‡Μ½,°³Ό DΤv{ξΉϐ€Αœ{�ŽΣΈͺ.Pc!Kό‚λfx_χ@–%_Ί³κGΧfR[W ΧqžzΊh„v1=~φ˜ŒΊ4R›‚`-YΊcχvυ§ Ÿ™Ι@— ‚L³δo:ΔΞm�HΠQXd·wι1Μ–£ρΉ#ˆβγΡ RŒ+p28ω,]ίκ\Wΰ p[881Τ.磋ζζghΦ· £Λή%ˆ΅·u„N·Ϋ»ς!“F›u‚ ˜1ψ2«Lffc=Λ½œBaή68Κ¦o~ϋgb?2θ“\#YCξΓ‡}ήΓ’(ƒBΧNPΛΪρ™9J3¦©Ο¬'Ν5τΜΕΎΨΛ¦·{0M–Όχ½Ε>Κώβ~Ξ)1�™d;)«ΫMέύθ1δ\ηΙ Ψ@\F†£λΞ I²q�άϋZ4ΰš»Z²σΧ�]ΖΡ²¬@zzŒ αm±ΌθΔ2@@aƒϋžΘρ|ͺΧ΄Χ~―mu-CͺΝΡΞΞΜL§>ώ€>5ΝΨ₯τˆΎEfΞb”p}c=_uœςœνŽξρμ™:DΩπώmζ¨&…ηYΩέ·ΟΘNΤΎ6‘» ^€ W.‘™z B,½}¨Ηt9›2=7ΰN3 θ•+—ΣέΫχΨ›ντo~5kΣSγ}Υ€ŽS—h ΥΫ�Yν6ξωˆ ŠkvΌ΄ΩPƒνƒχ\Œmt]mκ+€`―”#K%eؕΣΚ¨9“Κ‘ΟΨ[@<ΦfΠ 4ο ψχZ‚Ι#ϊCΦSLC8ϋ-LΆΈΪΟͺΠΩΨCχ9 Qΐ “§ηβΕ€Ύ5KΆ‰,:%GΠ·‡ a=ΜGk|ςΊ;Ÿ}Β„‡Qό&(ΨΌΎΎ‘ †ΩCC6ΑN―?ƒŸcŸeή†~R‚±Έp°F"ΖΖcŒ’hτΥ―-Ζt Τ¬ΐžιθμ¦gΕ+±φ&½UG ₯�ŽM¦�υώ6=kf°)°mΞΥc‡4/&"³ζUmkΘ=K:Κ±Εφ[¨BGjQaθ.|Ÿsϊf±‡θeΟ‘‡QΪΘ~EΰΖυjίΥ‡ξ!ιDΐ΅ct­>ΊΡ·ž™&ΞE[{{d ύ¬rΐέlG{°%Ρ)Ϊ2εH@―¬Ήf,3‰Ί}ΦS…€GvW½i―GkΧ˜y¬ιŽήqΞι7žšœ˜§D§I�‹ΰΜΡΡΚ¦γγ ΒΤSκg―?|ξΟ{·@]κuΩoE]―hη|φ‹)pίYυ1xĎϋ<63φ<€|>ΛημΫg=•Τά<Ϊ€Iτ 2ζg[JzJ@pΛdβ ƒqΔLf…Wπ=OΞ�κ―8ΉL�ά„T)>ŽΣΈδŽχβώLΜιKρ½O=›ˆξH�‚`Ψs*‹#Ψ%ψiήΏ²μHNΗ'Κ3«νΝ`Ήr/2ew™ΐ012CΌා?<Νu0Ϊp€Z”-°ΧŸφθ˜ 0>dδ°A'f,‚K“‰Ϊϋ+WισΐΏ‡ΛΠμ=σ–dλ7kGuξϊψ%Ψ₯}ΥΧΦΦϊ―` € ώτQdΔΩγ@Φ±6DΰΕΑ²lέκΖΖڟϊeτ?βsj“J}ί hp_okκΚΦΣΌΌmDΗ3 Άγ k.›T"¨‡ƒΝZ89Β>tœ1φΦ2¬˜Z€ YΒ ΄ΌNŒ±΅ Žoι”+§JΝΞ-₯§C£°γYχ ΦJΆ@#kͺ#©ΑήŽ(G‘CՁμσλ$Ϋ*FAr–| †UqνΫΨ­ φM©ŠΟγQšw¦n$IqΚuZͺΎΊDς ½y’Œ�ίλ›σOΨΨΕG²7Œ2cΈ`+‘/d„ΤΣlόέ[O²²½θΘlŸ#ƒΨ†±Β*NΡ²·1¨²ˆιGόΡλθ?ξ¬ 6ΡΘΏσύO>ύƒΏ γΩυ—χρυΏό­₯ίϊΝ?Xœ››n³;΄n{Ά›9Εσ(:›’Q#Άτ‚ΞδσԌ0£ΆΌ΄ ¨Ψ“%š†€ΐ�ΧΤVΝUΧTίΌyεονν\!½χwώΞύ7σ·~λ?‰Ξ£do¬[ΜcΆσeuΜD‹€₯8xP*€ΞΝ†ΪΰKΊ£ΏWq#ЎWέή&;ˆΚU/aΠU~ΉΓmΉƒŽ‘Πθ˜Ε“‚δ¨Ή]t™A‰Α­JΫlσ15^y0%μκιd‚bπόƒυT]J°Γgא©΄Λ»AΜ[o}�Κfž7Cΰ—X—rje'ƞ‚ξ/‘™kΰ€.€ξξ«d{–p²—ωΊϋi§qάΡ)J„ζ”�Νζa|UT;·ϋ}uU't;œΨ�ξŽτΦ—ή Γ1M)ΒΘ³qΚθH{Μ΅bΠΛB[Ϊ8D £dT�υ8Τ:›Φ–Ω$N:žΤΎCݚB²u‹�v« Fu@tl Κ DͺX†ξ>œaŒ‡θ«”6οΣ,]-(vο« BŸ™ž Γ܎ί#³©³²Ά‚σ(@…Α- ΕΦkσάΠ @IDAT ½SCΎa…ƒΕ ΙβΫ@Gƒ¬3¨qR>*¬γΓA^^˜D@—Όœ/οˆ8“š6¨m(Α-¦^¨<­³E―ρΐXρ�‘ΐΉ-―lŒΉΊχŸ|Ncžiξ0Κ³ΕήOΦΨΰχΊq?σ«{©5ΛKMΘ‹tηΨ:I–<ΔΏ ±y(Ά¨‰gŸDΪύC8ςτYI;†/@έ$θY„aπby%Ο23Τ_π,Y (ηϊ­CG~ζζfhΜ`]Σq€mmι2xYœΥqΦyxδ Ÿ3ΌΝΠ_§ΖΖXC΄|8mœλΕΈŠΘ2h8<#~ ,Ή>›dUuΤ T]cm*Β~ Νω1θσK„ήlΊζGωΠθκ„Q`Ÿ|N8|’ΰΩ €΅Ώg<Α0ΠΛƒ― E9λSB€Ή‚Ё(₯+ΈŒά/δ‹ύBN\s ₯…2iυB›4VE iπΠ,0Fΰ;66ΚuΡy©‘q4Ϋ2ϊLΪ› Α6`mΜͺ@Htτκ>ŸQKΖ¦cŽŒ΄Ιa†΄ '¬ƒ½@(νaQΈOuIΞΡ8'»-ˆ€δΦΛύf=ρp�Ν σ3:6¨›B:ζ–Ιˆ˜οΰ’£ iX ΅žΏœχŒ Ι7e½£! ί›ύ ˆύ0ˆG ¨iΖσy¬«ε':šξ‘‚4Fμp8~g°Ύψ:ϋ.Pί\—.Λ:™$ψsžω†>OΖΊg’LΎ3μΝJΪ«ΕwG­ϊ™ξŸϊe fi~–φ4ΐ€‡…%d–e8šΣ²)¬6ν:ΒY:Ψΰwf 8—[d³ΜΖΕΔ™Κκ2α/ͺJ�WzΎΞρ}@ε%WP”ξάΏ5ΕφpܞL‡2ΨΚΧΞΙΑY1τΎ€η–lό§‚46TBσο@7¦¬�’£ut—½γ~eΙ©€I«Ϋ”[½ΑΎ’<2«Kλ4”Ρ`Ξ7+θ92ϋήsfvšqvΰY6’ f=οκ~ƒ!©±N5Έ}ηs˜Jνθ cFZδ,,M§ϋ·?§ί μΦ+δ ω(Δ.iπ6§œλn‚δEΗsbμ9SZΣ«oΌš¨3i“Μώ WX‡]tΓp/=ƒΊlPΘηόΨ0±­­ }[ 2~τΡμύ\ΊΠgωI_z–gοιλ! Ž¬--QΛχΉρfͺ±\&ψF‘Μ„`�αΠ{φoτφD0³Ξτ KΝΊΊΊιsCέ+23>>FoŠ[ΘΤ4A-`1r`ˆb’Yp}dΤ²ηoΌuƒ@a-JίΎϊ΅/³~ŒI|6Νώ’ιBΖeHC�Γ97q pΰΎ)οβάH•)6»κζΖδΞ‰ε Ύ‡―ΟΣ†ΦΪ΄7wNqΏ‘Ιηω+ΧDΠUΏΗ™�‡―W§ Z’ΰ’~ΡΐΨu“‘£Ξ·„Η2bΆY T8z p=‚&ΰΦΦ–‹ŠΤT­7λ4bž˜§Ωζ:kΌehΉζ„PρaJ(Γ0“NšωΣ•PZΕ„7JTμ#Պ½w,€ε`/f7#©!ΐ²Ά²ƒ0€Žn1Ύ0»n?Ÿ(‹`μ‰%ΘxŒ%‰ ΦQΏ§ Φ…ΐfŠλ6ΙȚȢb?΄%ΚoΙ6Gs βdΫ›bτe3eHΑ’.‘©xψΊΚη»OL Œsψ3_ωJκιa½Χρσ`D’ έbΝΗ›kΈ� Ζ‘β³ΐΨF· ΛΌϋ΄ΈŸπ‚{œi…ώ=ΗN‘ϊΓη™I 5ιίϊ*Ι šŒwμQr·“&'iΈΞϊFI0οeI΅:ΒΐΪ=ΩΖn„ŸΕΩ,Q?κf˜% ‚W5Ϊαf€ΰ-JΌ{±™3°―μ?·΅Ό ΐnεΪΚΠ™"εϊΈΫτ Βi;«m΅•ΊUΓ"σο=Φ$JnψΎ&@Eš°˜Έ� Η§ψjwύ€ξΚΑ.ηap`0ΰΫΩ§fw‚Rž-ύy“Ι6 ΧN  P9νl||όέΏ•��ΐ“@:_ώΗK mΜΥνm·œμBΓΈν¬.2ωCΠyκ1 ֘ŸβΦΡ±­½']|εΖu¦1ΎίΛΆuόYOΧFe¦n―γBέVšά=Ιλια„«ί&JεΎγο}/=zBΠΒg8p „Δσ‘υ’€vνι πhΒΘ1ˆ—δ T{4�BΰΜlΰό¨˜ z₯ηIAŠXΠ³Tςhκϊ8Τ(Oƒ΄2 …†ΐ€ˆ”Μ:5QΞF²ζgtΧ�ΑΘ\DΡΧΧ0Ύ§•ΊΛ,Ž&b=;ρͺ�nt@>ΐωkΑρZYΚΥηZΟtr–ΛFοΟΝa\ ο|�¬ΜΕυμΡΰF4ς1ψομ IΦ;4˜μTX!YM΅§­Τΐξ§9ht(1k2₯u©π¨<΅ΤWΡ­� * ΅³€ed–2όRα›ΘvTΧtr€gΓΰJšg ίm 6lr,u�₯+Π[ Nq 7Θ*vπ»κcΙώ°'γdμνδx$λν· ƒ7>1Κ~”Σ μbμΟ&τ*ιΉΠ5”^[ϋ5ŒN ϋX adŸ¬ mΔα•±Ι(΅Λ1¨MA“ΆΎ©Œϋ¨¨‚R\ m°υΏΪίGZN[JC'ϋ7ψAύΧ¨7·‘α§#νΖΚί^6a"#DcJGςαμέ€AŠΉ3@² Ά—FC�Npμb_Lv&‚Y�ΝzD©_‡§LLXbNφ£‡8ζλd‰03Μ-Ώ|‘Ο„�K‡ ²Υ€|¨ScmuこΙk€-νˆŸΟΜ(z�dψ$σΉφ:P–έƒBΐ£X#(τJ"ŽQΖgω₯iΚυμΒΖ–ΩΩM Θl†kšΰuT€<4cγŒ8λΨ½3`νΒΙ4‹ηDΠβgž€Ρ‘±hΌ³ƒγ­ƒcœ0Ψ1gΩVaﲏ64ΰΚΛΓ/Τ±αΉώkδ£γ„ ΖtαHδθώʞ΄9)ΗΊŒ‡€.‡ˆzδ˜Ο‹‰š6‘3‘cŒ ΒΡ Ž #G‹Š–ΘψψZNιό^‡τΏŠ’ϊ8³yΥΤό1ΌΌ¬–αM&Mh΄Ρ œB;‚Φ™ΘΎŠŽΟLL„sdΦΦLΩϊfδωs2υ0[Ψ3­α€Π˜•³_fhu ¬=V–4€₯ fO£v*K`W+―θ{=θ4 lζ‹Δ£_t”ΞQH\ަm¬­½ΜnJkԐ–#φ²΅±«€ηΥfJ6ƒ<¬9ΐ!7[POfD–•Ž·`ι Y~Α2A™"ΔόΦkpŠΓΡq¬3ϊεŒk δžηIvl-*HΔΤXφ΅Bΐ˜‘.³­½-=}ϊ,=} ¨ ΕηΫJž²€ޏ’΅WoΎΚ™gΌ%r{Δ™c τλΣ“;OӝݎυΧωTΪ†α`P\ΫΘ¨¬ρ\(η€›Α7°³α‘Ξ°Μ0 •εy~ή…Φ=YΟ!»VFAΦP/eέ©9ΨΐQVδζCs£5[;ΣΘΣ'$d€oζJ3π�Σ.²!5έzRA„―έ Af=Ž2M˜–8.^Š3ωbe-=~4Α§λm D8ά4ΧrL`>²&λDΊθγO€©ΙΙτ―ώΥ=2ŽeτΙ§Ψ¬Ohx�φƒT˜˜>s%Κς€’ ψιΐjζA₯Oι/η1§LΠYά‘τΰ“;ΎϋΘ@7ΩοBtΧ)ŽW~ ½!ό^�κW‘Β#ƒθσ"ήospŸ272lθfΥ-₯Ψ³τ‡†Ί……θMτΔΣǏ�νŸό˜&’}XΧΔΪΪgoЏγΟq"ιcΑhΏWo}νJA†b b1 ΰ” )h¦cn@#ΩΣfΓΚ)σΰX!a9ΣςόtΊ‡žΎxνjΌv ”cΡd)lφ{@°2h76=ψ₯ )AΙ†mV_T�䓏�σηOΣ7Ώώ³θFΞηΕζƒΩŽN¨αd˜`ς­,ΚRA¨ ”Τg@<9ΰŒr0œυjΟΩRγ­=ήγς—hφ…�p“3’έ·μ«ˆ}³‰iψ ›˜œ©Ψ5Α/dΊ¨ˆ�FdCFˆvυ”ϋ<2θ"»wΜ„L†’μ³ T ="JΉc}Αη<τΜ•[·pώΡ%¬pUŒΉ\δu‹»λιΥΧί‚αψ*ϋ“Ητ‘ΣΨΔ0ΰτUt#ωŒ}an}£|Ο ΧQެtSv² 539ΞuSΣNiε:¬A/Α žΘςΝ±/H (z±0™υ\:fr‰χf1Βœ29«‘ΰ-ςΈ΄ΌnŸp›¦Ο ζθΜN³Ή«Ρ³%ΕτΰŒeΈ#ήΓsϊw00Ψ"Xρ$o°ν²ς±)NΙ…:y{<Χ§σ°Μ$ΐFτΏΊδ`Θ‘Δ{<ΧπΛ;βœ“ΩΑV”η₯ώΛ4k|χυ˜F³…=zπθ^ϊφd”Χ�Wήx'ύkε―°Ής΄*τwο+7X›œόʜͺ―‘\€β>Ώ|D^΅ΥΪG{_‘ρΟG/;!δh“ώH‡2υh.Ι…Ω˜p,ζW€™c€vCιυ[Χ�k―^EχεFΊŽŽ>cΎΏZA»‘Ύ5λ­}– γ㛭館”*ίφEΠΟͺ*¦'Um 2HO€5|’—-)-e�Ζde7ΊΦηΨ §_°Όa»2ψφΥܟvelΙL 9ΫeM‹OS ‰’bcmτΩC—¬ΡλΜ€π Π†F֟σ£?π“Ο΅�ΒzΑΓBwβα'«+\Ώ3δU?[}³Λω³άE=`“Buκ3D μmΰ·ΠtΩΧ*>”aƒtΕ½‚τΫθΌ]ΞΥ¬ΉšpΜ¦βCΖ__M―\ΉLσ[ες»£½|’ ° ΈξύM˜‰¬i$RΈ6>3Β]9ΰί†kΝΤΛ€δσν7@P. ²ŸOΉάEΆΆ8+2ŠY™?«ϊ„Χ―χΚZ2dυΜD½�>ώF]£μκ³4p©-].κ€™kCpΞM!`ƒ Ί£—άςT°„χΡ±ΘH]Me¬wιqͺγœνΐD΅ό`{π …[šzΝ΅76‘έ€%–8X§ηȏBΣlΖ…_ye€€ŒhμΓ{PHOφ:φP{©Ÿc"H±—ΨύuϋŽ˜ψpν ΡΫMΐO€π¬šDMmŒΟΞZY«ijh_ƞ²&ΩCφKΖS9CέKgί’˜ †�PtύmŽ%θ$}$Ο\‘ώ8}Q*a6 44’(ΐξ­Γjμνι{§l˜X*η^vΆρΑ8G‚Uψη²]e!rs(tI―½Σ·ώα�τ—­Ϋ!`/ω�½ΤΐAqMγF]}Υάκςf+{ΥΆOv Η@«ΆΉωτ΅·.446<ξκιΠάΪφα…W.=ͺͺjί@©‰ΓύΏ<Κ Z[[ZίyηmΠτIh‘ΰŒρμ "τ:"fΊE45* �™$›£νρ³3ΗΟQnώΝΓa7π3ΊR€XΊφ.θ“tβςΚ"œΚ,‡€ηQΧtNΝ’Ÿ£ 0ۭК!*Ρ‘Δ©ˆ5Κώ[CΓaΡκ.jkΏΒ²"Β“Cκs0PΧ―ίLuΤ�>yπΡNzxχS¨³ΩΘ`ΞM“Ρ§St)Tk[' ©"θ…RΟ 8*͍uh©΄νMξ…`kzr˜Οn"h$8ζQE?Ν^z¬#œΐOοήOΫ'γͺjθΊN—Xβ3 @šy_―Ϋ‡– ΰΪΥλd›oœoΡΙόaš‹Œ‡MV4 ₯¨¬T.U�•λΧ‘ΌχβT›΅°™VBΩ,s½8ͺ(]c{Ά=φF'δϊυWY?8—‚Τ\FΣJξ­Έ˜`Ί’'”³ΐŠq'@HΙω–¦ηθ·–FšΧ€ς·g»�βΪ2ŽD5‡}=‘ΐΑδήϊSΗ§ΝΪΓΊ iϊω=φ~8s=ε(c©Εφˆ@Λ„+€dT€Cξšh,}X{½Jζ�L­Ξ€ς³Ά”£D»�"NQz‚šE3’`iDΈ°†#?B¦žŒ u›…EuLι$ͺM=½ν|Α Žl#Ω!Η9ωΦf€4θΦ–tŠ,o��FΐW]ΧrΎCφ&džΏi-Ρ1K₯ Θ§4ΥŒ�1 έzg{, ­­Ržr­Ωkl­%¦Ž &…MΕϊΝoό›Κν>ΝΖ½ΞΩύ?eΩΑ:χ΅€Ν·6Σƒ;�‡οΏ‡Γ½ˆ3¦ρΓ)*Ήa—ΛρƒΦ­Ρ&›‡²΅œG ’ωΩƒŽVΘΟ6> "ϋ©k%($ΑQ]ΦZŸ˜:ΛWͺ·ΖE¦…έ²c‰e|ρ:>,28xj:EaP8·Φ°EšŸcAΟΙ.Ω/ �'™ΐ`σj5u‰ϋ;Gκ•—jr ηqΚχΖq&ΞΘόN!…μ?£[?ω!¬―\ΖΏ   †μz!P-ΐΒ1ϊAgQ§¬˜=Μ±@`?Pϊb#H|Hζ 0ΰp!ΣT ΰ@IΙS7٘OfΪTΒ±o�7‰μX‰>ΒQΫ¦ρ₯ ‘piΝHSMGΞQWΙηΆR§lφtjj6€Οrφ\@Β ά&G�·dVe_'Gͺ½YͺpŒψ|GaY£θ=eȎIΛΦΉ±cφk>GPSΓΐς—RŒ{Gk'Ν•j \ ό³w6Ϊ|ϋζ[Ρ΄ΚσΣΜΩ|›κrP!\@9X˜α:ΉƒϋΉ(ΧfWΌfεΖ/³Δž¨uD?¨ο#CΖ΅“Σ!ofέ+Ѝ8zΕ 8N›“[œΉ gβr[ ;f' ‡˜³Rγ^So™A5Χ-ƒλήe―]k2%8ΈΝΝθφΞ.�!@}ˆμΛ<™μϊ²\KMtΛ_˜_I₯”6!ΏAσ†�-σ€έiP©1λ―Γ?ΓⓏ?I_�ϊ·ΣG£§wΏόe˜RτZ\M{ΘB9"“N°Œηœ 4Ph›ž \LΨ£Ν₯Υτޟ?ϊΟ8m&ΫΦ Λ‚Ρ‘Σ aΛtͺ vsFΉ†Ξ–l™"k»dώΟ­ ™t(«nΒY '―\Η™X\Xΐ©kPXB_R΁u„e •ΘΒ)z^{!“Ι^κƒ˜Ί:ϊZ°π>>Ώ ι Pί‰Φέ«WiHL)Z+λΕΗΟ#χfΥ{πkΎώΞΧΣ¬‹cάμO±±M³Qφ8ΫέΒg–φ,.§ξ^ϊZLγ ˆιλδ!§dl8η&2¨<‡X»δC6βΗΩ$°O‡_Θ–‰)]τ‘Κcίy‹πy”c“rξ†@„ŒΜJΞZe“dΦΥΨzώσžL–HΥ—iε|¦χΤάt–ΪΫπ)F™ΈΕY°<‹‚"σ _=€4όkmγO6)vΏMζεl:z™I¦ώρ&pT‘­RF-§Ugr»ή–” θ'zŠ ϊPΎ(]Φη P‡Λ1cΉ`:_φW1eΊ—.Π4Ίžζ°ρ™k$V`I―ΝΖ^Ω,φ˜’±<εˆ]§GGμΉ $:_φb>‘`7Ώˆ5ΧnEσtτ¦ρŠ ΏπkΈ―hp W�YŸX }cXOΡee2cOιEΣ²\R0ΐgΒΦ5!W™ξδί…ρζ~Α0(!‘€Νrƚϊωά‚΄΄·žnDd2 ιΊω“;0Ρhb^Œά!7² -­R~ΤqfXOD’{c±‹φb³iόwΏ�aΊύω=&)΄…OR.Ro«Λ\K–>μ³ΰŠΊΚ³ΧPo’Ά&… XΰςΦ‘mcldwC/=|ϊ”δh&υχΪ/‡„β…>Ψn‡ι>χ·‚}4‰±[ΜkPe“«›Γ'β,Π έ€r/άc}uΉq'ˆ;q¬"ήΗ’υ…εpκu^+ ZΧ½’kθθΘ’CmtN�&<)†c§œΚβ9°Dϊ˜ϋ‘<² φρ»ψœwSVμε~Θΰ{iύΏων£§ίύέA"½UŽ#RΝα«ε«»η hΥkλW�ίόOΏύ­_ψΟ��ΏςΧ~ϋw―άψΰ―vχOώέΏϋίνGsΕΞ]ύΗλovNLMό[Ώσ;ΏΧ2·HV–ΰ\§_ΗXaΡ‹�ωΆV΄gΡ ’7^JU Β½ @ξΜhœ!ΠΦϋΩ•ήC­ΓPL«ͺ–,.ήʘΔ\ ΣVΩλ—|�5@‘pQšflΏ@5υ 5hfcyŸAFι•ΑZH’Š`δι”τ>uMdΘWp`Ν’gqDΘΜΩTΚώ*…ίΡZ' ™ŽϊΡq‘Rh½₯=#Dς6 έ 40–εΖk_"0Ν‚¨f&QDΦƒeh>9’nctΞh:Y…σškξ&(‡°yDΝβω¨₯^�`ixh(Žβp-’€AΙΉ/Η―eΐlT₯cTO‚#€‘Ε΅EΊφOΠkŠugάο7=C)χζzψ;©έfψŠΉv•ͺΧas0Ώ }ž=Μζκ 9“v‡ΔΩΨs³œg6£΅Nƒš<œ"-Š5‚ιpΪqp—θˆ{бKИ[(7` ΡφΖ2Κ„LˆŽ*{kžfB@ΐ=xβll¨1UŽ4XRε " *ά#φfύsl˜(υΨ.ψRR7‘[UΥfΣ4£ΏϋέχΙΞ= ψZ°±ž―΅½>]Ύάƒb·ΞΣkj) …€ ά+£4AƒZΥ�…€ΩXe\γ’εθM@³ά*y  ΚΤyυΦ3ζiQŒ˜y‚_j‹7\–©η+c__§Λό•λa–PΏOπΠBπ62φ<ΐ٠ֈ 4θΈf­(#•V·Γ{M“‘2°ΪAn@}“zgΓΘB³π*τ#”k ί{­Φš TθΨ•ψ˜ΡNJuτ0+bl똝]νx/7Fγͺ3�S ΏΕ\I#Γ Bf”‘sΐIμ?cΞ9Τ‘ˆF©8ιΌE.PΑHͺόΓ &γΌ•ϋ„Ο:ΔΩ³α’ΤΗ>Δ¦m³²6v=!8ΆΌ‡•=HεœΫ ϊ "Αι\X�PΕΟ² d5فΊˆ½\η}Σ”Ο93cΙ%qO�„qξC€ΘNτQΎEΗ`�UWΩ₯έ{ζΈs~r޳†R:ΊΤf{dΫ³d˜ B†AyΥQ©©Λ°§‚VΖ½q6Ÿ,ηύ ΨtΛ€μ.Ӝσˆ5ΡHšύ΅†}b ών β^k₯’Ϋϋπ½i™Y.PWο±08βμDΘα!Œ‚6Η %V‹§³³³dJΗΫJm-χ>G°�ίΫAή£‡¨‡­‘yξz~Ζ$˜ωΕhzιϋκq™ΙTdkθ|ω½™…΅ε•p\νΏ`PχmΡz�hΖv8χ=φ‘,²ο‡ΑC&CοφΰΞνΟΡ)€e£œ*2kiOξ}₯t Œ§{ώt$Ϊœ£jޏ1Ξ\?ŽN©cc]§EueccΧG-,NKΆ½“υ>ƒ½ΐ>*«θ�Ω,™ϋu­"–υ( 6x²g wΛg“Ωz‘ώδ�ψC˜R8mΘzA₯},λͺεΛ`-Ξ™2‰LŒq'5£+Ψ;Ψ…ΐy’Œ–ΞΩVΝς•3Ξ_[Gηˆ ϊ¨‚3‡₯β^JΣτθ§χ±6μ5φF™αXΰ%ν|ΐ2<7εdΓm.)υ_FΞ>ΰϋ!c^F+ςƒ^ˆnCNσZ@d˜ςΨVχEVCτ,alΖe©‹gYέGoΝΠ±Ϊεήf ²\l�θDi§fΊ½Hk^7° K{¬I�Y€Ωh4t‹υϋ/¦–i‚H3AhΙή—€Ρ>gDfΖ�ΌφΩ¦,Δq€κ%S{Aζˆ9VΟ΅Ψ%@Κ#8”ζkΆ³;α„K ,Β|Gΰ΅Ϋ,ΎΣ,lTgέχ·I¬―7Πφμπ»"œXύ£ύ— jœ(€ύA§œ  [Λmκ6Χn0s[Y pYŒ·ί‹,¦Ύώά΄›6šυ54΄ΐώ«Ϋ½²²F)%2WΈ&U»(…`$‚@d^Ή�¦·Šg]]+“*”ϋbΆά΅P'l°¬‘%8ςθ:ƒtΟ₯ΐ§ώ…F“%Ψψ‰‰)τΙ)Tφ6φ(Ώ[6PNωΙ!ϊW]η{¨‹4nΪbΛ|/ΏΈs6‚ΟΧψƒ_ƒX_§½τš<σκ K χΣΐ&[εύ•‘}Φ@Τΰ8Ή€£³½€ω*ŸΌ‰_²cΛFŠ‚κυΨLY;=oΠ θ㟼OŸ†‘Tψ\KΒθ&P({Β³ηC="ςhSe'jν�/Rκ@Ζ8όl<—μϋϊπ«ρω2•΅¬;Τz@ΫΉΉi@XΕ9�ΌŸ5£ΆœΟ?₯ ΄ΉsΉdΓ*ϊ�& CD‡�’έf/’Jšd’œR�ΫsFV”ε6Φ;„λΉΎ~ρ>Ό§ηVίCβ{k¬όΧυ΅Ή€φΫ3λ}*+_L—RίκΫ“‚…aI"°2­_?ηυω¬‹ώ|€γθ%X¦_%‘/―ώWo &ιcΞT §’"ο[ΒŒΥ―S§XΒ‘ά:"ΤυPΏΘΈ 9ρ\}Yν‘eR�cΆwφπρύ,sπΈ—Ζ(OkGTΐ8"ΰFών3³³FΏΐu ‘γω–F„o‚κΗ«ϋ”G3ζ^_ξ!8Š?)ΛΫPΖ}ОγΟφ€W�_ „�±C'Σoj‘‡"εθ£sφ|o—©`U€ΌΊaϊΒ²­« ‡εLiή*λP’zS[gPHπaΟ {˜ΔΩbέβl£k£‚$ψ§n�ΦSΙ:)7ζ8ΞγΌ##€ϊK6…΄\Α3SΪΨ{™ γ>2a?ˆ ϋM>ω2'`Ό@²λq…>O_O}π‘γ,Β€ ΘΧ―*bΏ–iŽΌIιΐ1―±΄Fv‚`{Ί™ύΪβοφ{po½^υk/³Ψk’‘ge€-ΰAΙ ₯]޳ΧΞ5Σ[ξΙΟzuAυ°}ΘN±²Œ|»/²O];}‘c|\ΔO=sήΣΫϋη�τίόμƒΎ“{λx�—σ�^jΰ φkΏžζ~�͍­ν―W6Eσ(β;ΝmΩΫύƒ�Λ_ύ·�Ζ?hΘfW N>ψ�ΠTβίό7~νΧώϋ�φ7ώΖ�ιw9άRΎ€%KΛ%ΨΒΩP±&ΈΉφ@PYxθCαpΐ DμΔΏM Z‚RΟG_ט!£^S E¦ΞPiΜη€ΦlSP˜ΧΘΦrΰΝ.ˆNϋŸ–¬ΛU HK·ώH:± upς;Σ` u€,Ζ4…έtωκΝ0^ b ¨Ύ‘ αΛΓιY@εώ폒³=:€€ ƒjS0‘jΗvχ]$σΉΑƒŸc©„FG糑̂tπB”¬lM³ΤΨ‰ΙAOcŠR@…ρ~th=Dα0Ik“’©V3Ά Μά=žΣΤκ‡ ΏFc‘!‘ζΪvφv£¨<ΊιZήΦAΦnΰ,uf{PF4�›Γˆ* @‡@:η‘§5\ΞΟΝΗh#<Χql|OpF§ς˜u’mGwCτ χ‰βZ�Ππxϊ'Ώ�Η”Μγ€χD/‡² Τ~“) λόΕΑΎΤΣΧOPMέ%Ξ‡ΐUttǁ Π€―/ΞΠ¨Šƒ˜$Ž%ξ™kμλφΈ'ΎF'λKp@Ζ‹q€«›:kΠ…Ÿq�Τ²SΞπϊ—Ώ”^yύZjηzdWH/ΡI+'#^Ι>7°‚U*^λ–p=G›μΛ ΥΩεφ³?‚©‘α9AΟαA²YΘCΦFΓ`ά_‚±D%{{ΘX’Gf–Σ5χ3 c½ΉGοΙ―=φFΗΪΏ»φ8f―4 ²yT€εGτΨΧ ωόΘ½!sc_Œΐ„|2lΧ—λ’+ΘΈΙ΅θΪ| /γbM¬MyΘͺ΄Θ(TΣν³DΕYηU”³σ»Ίϊœ9Ζ‘³ B§ΘύρžωxΦΚζd|ƒQXh 1 Α{F:ŸοΘr9oΩ§@E^^XMKs5kf‘EξΟpDΆΙ‚οΰTLκTHˆžpΊ /5BBqœ¨€ξ°‚‰?ϋ­wƒΞZ‰uΌ₯Α–`£ ‹#“V OpT¬TζΚqΌΜΨ�QSθ$eέ/AΙξqύ₯vzvJΈuΕΪΝ’p¬'`R‡™ΥR••ΎΎ>>7η 5γ\κΏΐžε§>ό!MίΘ>ΝΞ²ώΤ β€ ₯;ŸάK“Ώ’Žͺ 'λσ_υ· {­ΖˆΖ΅8π>ΒQε3 ΘΌΟ¬`Χκ2]άΙ$T⌸Ż€†²ΖΠ%+”؁ϋ£?α|ΠCGz –Wg{wzφδq}ς (‰v%_ζ=–y~n_sM¬ςΠ±«K”‘½ίΕΙV‡Ϊ0rnš�.Ξ„£<-)αυ– ¬Π6ΠΛΕϊ_3EvΐW‡rM»Πw·iΊh—oΙΝΐΨψΑŸ}7έύμ3ΏYTΣ2¬@Yxce&Β"ϋͺΓ+ΫΝ=SgᐒΌ0ˆ~ϊ<‚Jυδœ7l—@Ϊ+d‘/^½Š ξˆ£ΎΣy΅†™ΖD‘Sμ»αο ΆΪu�Νΐ{έ†›Θ‘2ΎD?eθ#eΡ撚Ϊΰ6{Λt,ǚžXΐ W><ό$>Ω' �έ3¬πΪ Τ­y5Ψ(GnR<Χ>Gw©η΅!©α&‚]' ͺ#λk@ΆŠΟ4ϋTK ŽΆδΞΎσ#k€sΝ 4$Πq‰Τ�ΫτWκ{kΰ'²δ΅Xe`Σπ'\ϊ.ΐ0)€3ΈΛ΅ΫΓ‰γ A)ΐ‡™΅->Ϋ2bœ{;’ΧΑdΤ~šŒ}S/xέΘ΅r+;’ 9Gαγdγ΄ ΣΫ’}ηgΫΤΝl¨{ΊGوٷ£#X@¬£ΌG’©ί/^¦Ωn?™3ΗΚQž…Œ¨ο/_Ό–zΊϋω,d™sΪ–m'™RšΖΩ#ύΑΖ Ψ* ”ε!λ€>pνYbS:K+l³UOδ‰?Γ MYθρžέs›άζΖ‘p+‹e:υ Ε ϋ'°‚ ²ή@ ¬ηύe;ƒίΛ $κϋ8ςZ?Ε}R–�­‹?Ζ2ˆTΈ―‘iηZ΄λϊ�Mόλkx/iγ- ι΅7n![Mτ)(ήέreoƒαΡ1tΔ"ΰj@Ώ v…Δ― )δ«$mζ`G‘ΧAάβΘφ6Rξ ΫλRž ( Π"H“‘ 3F]ε¦ΤΫπΩ.‚\ώΞηyNϊq-Τžέ<Κ ±Lψ8»iœΙF«€φ‚ye”±°LάΈw6ηm~ϊ™όACG„ uBΒ€*Ώ€ΚΣ&GŒrΧΙ.yΦΓ¦ΉΖœS6J9TfeY˜άρωώΞ‡%œ�­ /Ο€œ‚erΙδKφ―qeež1ή±Η[0΅θ»…ίrΚή^μ£Υ™Qϊ©_ΐ9PGhϋ[ΐ£ν2°σηrΐ}~»ψΫΔR{εΔYtIΛ)T;ΘΪΖΖbΣεθ†bNm°”z;Ϊ°aL8ΫH/fΖ‚U,%³Ψσ5μŽΑϊ»±³QφdXƞx%žc§ΝΙΚήĎY,ψ'ΐΘ―’TΫιTφ ӎ οσ³S.ΞvπeNπ΅v°?=–‹λk›θt=dΐ«›#a‡l-㣃ΫΘψΧRζxleuμ§ΆZφ·μ‘™…yϊ|p/€Φ‚§–Ω#IY ‘χ–AfrXytΏ•™œΜJΔ²”άR4|wύE�²­·Xcΐ+W�†~1ξωδ'‘_6џ=τ=θpΪiκ?KΩ‰ζ€l`qΝ4η?ψ_ΐ^ϊ‡’χR?ΘβˆnV·΄¬WΧ7ύρ…ώ ΏχΛ?χ˟ύ½ώώΥ_όη–#ό?ίΒPρλϋί»πέ?ω.ΤΖrmbΌ+1&*^‡ {V΄Ι@ߍV·© ­³L–ΔF6Ζ«ƒTΣ@½~Ψΐ@hs…_Ι(Γ72”9ι4 €ϊΓLA-A=YυY3ίΉμΘ–Κ¬Ί†XW__—_�Ρ^—Zλ1{«Τ<ΣYw―}σWΣξΒTϊώώ6B[’zϊ―Ε6““Ÿ'KBκ°cΗ…Ω Η mΫ€‘U%νγ&ΨP[ί”nΌωUOŒ―ΡΘ/’`v#;3§?{υν…ε xœYš”ΒͺπZmΜg@bφ*—Ω$¨Α)0p(AΑ τφGY€{'p— ₯WVP{gΨ5Ϋ£ηοΤ ΞOΝ»�Pλχ‚NκΘ%Zζ@ίυtχήgιΡ£§4FΒρΓΉ΄ƒλΔδHP• .: ²ΝβκXXφaγ€,½ύ0Μπ;6Ιμd_Χ`l y)ΑGGΆ4ϋ-Πΐ―–`±½1‹r «9ΞUˆ½FYE¨A‘€ΔɁNϋΚƒ‘ ε†!±žE#«cnICJ�RŠŠ'’ˆr}jpXK½ΖIΝΜ,§©‘)2wd�pθΊϋPκΤxΓ*θθC1ιl0©±³>΄­Ϊ¦�tΊΗxN”YχΈMp·ΏG–e„Σͺcν:Xa€ Ή~$•€r’‚tzΓMvQ„Gτγ˜™^$’i†F‘ν ©€F‘΅d ¨ ­Α‘΅~˜ΉΩΝΘΡΰΰ•Pτρž(lΧΐŒ™‡GTΨυQqJc΅€ί‡₯ a…Ύ³GΑkδΊε·μΉ:Εΐ Š˜Υ8#Cn}qΟCTB^u4Β9`Ν^’ύυ701ϋθg“’ΰ{ ―ς/Ÿή ‚KΛέ;Ο•Νΐ& υσŸ¬κ9Q“ΜeΥχ3ZqΔΞƒίσφRTΖr£Γ[ιΤ(Ρ‚1ηq- 8/ρ<'Ξ:ΟχΓuD=s₯81yNαgΑΔJ g@³r[[GΌS‰ ΆΩ:GΛZZ³ΏEΠΖ~˜«#ΪμΒ.Wp‹.λP¨»ϊ9“@$ές)OΪvkrΞ½θ Yz’‘6sbvΨ¬Xgο@ϊΙΗ·a1J2θνPφθτΌAΰo4l6Βu$p,ͺ σ2ήkΫ-3β…8,»8HoθΝj‚q6υž’ 8ΰ–Ž:hΡΨ£aκέΗS!ΥήΑvj¨e:g§§»;ήœѝ»σ!ΑfkΆ}ΗZαPπRΖW�‡³ΐknivέ‡KεΚ¦WΉ³ ¬ΓίΜtωΕFΔσ¬ΫtM¨pŠΰΉ’ΰmοx'}�ϋd.Θ šmθκμg/bifΈIωΒ΅Ω³ΣL£Ήϋ9}_¨$ψ_…u#ϋΕ¦Q�Π·Ιj˜9Aπ=«Λ=ω+%ΡΔ±“σήJYž ’lkΦΈ‹ί-ύή?’‰,Θ•ύ΅JΙͺΠcτ©AΣιΤZ†R„n:$0πk§qœ ¬bqZΟ�,“5d�Ο=+λœΫ3^cp‘OO‹ό3t™ jΗ_Μΰ`hxNΌnΧγ˜σ£Cn€²ατ„,SC¦?¦·ΞRL―8Δ‰΄±ίχ{k@»ΰš›MSχγΕ…,ΘΆ[^δΌΣΔyπ`ΰκμΚbZϊp =ŽΎn’\GΆGl›}.†ͺΏnšcϊ� A‘y?C&’_Ή¬ες2λIPRΖuVRrη,υ“³ |yNvΣΤσn‹ς© JŠΣ·Ύύν|”Α„ι™y&Ρ8»ξYΨY˜KC#ΟΙhυ₯£φέtο'Ÿ₯S@»rμUF0 j€,Δ0+H95δpIΐ3νZϊ½`ή@O=χ·‹�5QYΑλΉ―œ\;ž€ tΦ)ˆά!5Α™Xσ”�5tJ‹₯κ uP)ϋ¨_’“―“lŒ|τ–τω9;J*ρ>°t‚iωT€Λ„Κ§mχ›Œ^(@ώτόϊϋ�†ŠYρ|lΟl^μ§UτΒ‹Π_•θν}d{{cΫ|)]½ώJοΛ¬ίΤ³1ΐβ&ŽI>zkƒ½ƒN¬ά)‡eτ6Ÿ–ᕏμ;‚4t9W₯π‘ξΆί“›.θ»eΰΗΏwηsξΗ�Hj`… $€ΠΪ)γZ9ﲫγ=kžw}Iε%0d_J²²³Ί* °ϋ¨.P§ω{―W5S.»ΐ&”‚MΪD pΟγΛ)7_�co­ ΗΆκ34±kyNh"IΓ^οlν§‡«4ŽΛOoΏρjκ h»FΠQΔίF랦e€ΏχρJβ©±ξF*Γζ”Κp\6{Ή4O~6Ϋλz©�’Οg IΑŽH!—αΐsXŸZ²Ο—a£’tq2�³ηCœ‰ΐo€Ψο=…k΄“nάμ‡υ&\Ν„M›Ϋ”π!•ο\Κƒ–f‘ΐPφ3τ)zIΏM0ΙΎn¦μ™•65vυh‘‡εjΕ¬Mq)ϋA ‘~0ΰW?{>-Υ*αώβ{/3Δ {ŸcmxyjΒ78@7όπ'Ÿ�O’‹~cψ με2‚.EθΑφŽvή;₯Ω%&)ьχlω³¬€$ΛΛNXλϊΊ Θ±™κ ϝͨmΟ�Εύ¨ή+ρ]dσΣ¨�^,M¦Ο>�$l“:\=―Ο‘οο>ΩkBF•~ν!:Ffo@₯μ }ƒw΄uΎ@ΆPQ(š—όρRΏώ΅tϊ½™―ύŸM]+MΥ ύ�ΚΏϋύ)‹Š'σ·��/λΑFΓΔτδ:qΥΤκδαθJ₯Ρ·—@i KήKΙJ™Τ¨δζv‚άbάΧ‘a Τt+&›YG†�„πœΊ ΛŒ@#υ‘Γu8έΦH즙ωΡ@—;ί·Ϊ'ͺ¨q:ΕQ“:_@£΅}š"’νͺškRGO–9πέ©ΰfMtα&ΠμιΊΑ΅W§SιδΠ}Ύ―₯[/YE¦TQοegΡζΗ:ΪeθΩc:s ‡˜ιkΝΖNCΓΟΘΘ­§KW_Iέ=Μ¬~7εa(ζŸά-Ηh²ΒδiR=γΡπ8ν(wW:€[μη>GyσŒ’σ :•4pŠΧ0Ff‹qΜ€Σ²Ζz Τΰ욱ά0€ΰ?ΧV΄{‡μΜ.tͺe‰†gh>=Έύ˜Cfwnϋ’q™)˜Ε(Kƒ## ΣΨažo>§ψΚε‹(”<ΖLN±GdΎ—6Ω―sόΌatμ `Nκζ> \,ΗPY,¬.§ϊΦφΤ{ι4ω% Οth€IqBV½“ζŽƒ03&©=ΆqZ Ρμ­iΝ΄τ H πίη^@aQ"ΝRI₯ϋν°o½s"λ*!³ΎΧ",€\§d²`(ϊ šΝάΉ};2|Ξβ>+€„#ΓXΕF>RλέLΓ—’ςcœ`PΠ‚jhg4€3³“Οq’@ώ1�v9φ+Ž–°A¬Aφ9/JnΝ;Ϋ…ΓΙοpκνΌ«ρΣΑŒΐ‰Ώα‹pύ4ί€όelΘq9€#8‡G₯dVY/F pŸΎ] a+, ηu/Ύ ¨!0²1’ϋ¦Σ�cγδ‘‚!α‹BX9»dνl<™1^o¦HGkCΓ["ƒ8Ωόώˆ` ]›ŽPΊ²TΜά[Χ]ΜΎŸP±1]ώsΜ|a֝™Γ`Ξ—Yv³ο‡y8…8>ΦPŠŸΰœϋ³“6Ϋ₯±.– γβόP€ΔS.΄G4Ρτ,£€U-Ξ©{~N@”)­D.0.8 Q„£μž£³b½‰mv\Œ—εRτtύYΝ�ζΘΚ&υΧnut²›.4@"(΅™Ÿηυ–@ƒ4ˆZa›¨ήpδR%M£xRš†¦^ΈJ6Œ=ΐοβžOȘδΪΨ©„ϊξΑ¨9ϐά£±ks3M­°Ί{Ϊ9w$œΡΆl–ΊωΫ©‚ }Ζ 3—§‚dΞ{tΖZ˜m( –κ)P …�ZsqΛ{μ "sis‰Μ9g«ηtΗ`’›0spΘΈΓΎ’Μ‰λΕd§Γ˜:φA+γ4nβϋΫοŒ^% œO‰Λς.ΰ.Ξ ?Ά)‘!p:sί؏sdή&IRΎpDDϋχΠ‹Ά CνΈgΟ0VΧǞΉΎμŸ;`χqτ38"χτα‡? pΒΜΗ£Υϋά_~d.NΉ‡Bκτgίη,(ΰ––Φ€ΠΪηθ¦m§λeHγ”ΕΛΛ£ Φϊ#p©u.bmχ`β€ Πf—μϊσΐυ©¦Ύ!]~ν& ‚O[aΐ CχY;7:Žg―›£N@% s[ΞΛj‘Y·FπiY†΄X€šΛ&sƒΜs묕zΩΜ)Ωaΐ±Ω™qNμ2œ;εΣΰ‹mŒΟО]Ήv9uΠKiΧ•u"Θ%lœOιΨR…αΫ`Ϋty-�―ύ:€Φή±Ÿ•|Ž™5`ŠhH(@­Ώ΄Α¨Ω*φLω~ϊτIJΟNΣΤΔ {cΆΗBhά”'…žg¨¦άlλW΅‚ ηdήvΠ³ω€%;K4Ϋδ΅"”œlΞ•€UœnƒΒ<>/br|:ΐ Οα§ΫŸq-θCμσϋ|0Ήͺ/?@_σ³S¬χΘ˜'’φ€½wΔ²€°.SsΩ[Ψzθ² gΝς©]ΐΨ"|‹-�ΩF\ΡKΗΩλ·Ρ‡–χ^’<¦ύΎαž›™ŠPΖΎΈρ6ήi¨΅oz‚LΧε?Φμfh,*θΰΩ£„X2#Ψ όΗKY{ύCΥAγwssΐΎMŸςιp\ΐ΄"�“>ε°.ςa7 €X^Θ›§‡€Ρ�ω΅νk-λ©΅³'Τ9Αˆ>Aυέθ@€Š²#Φ]ΠIͺ–‹]γ£·rd ›gЍB Αώ/–d”"«ŽΠ”Α’Ώ`ΊŒζΛjκ‡wνJ ΙV•υGn ‚‚Οοuώσ©O‰ •5Rp"΅?1 �(’؎2€Κ#€j™?6£¦zΚ(οyŠTvΏθCŒ‚F퉙EeΩ¦|ΡNέ9¦γ|1ώN)ώ!|‰tu°‡–rνΩ˜C&7ǘΑ(Oτ₯Aj1 ϋΊΫΙ‹ή\c€;―‘δΘΠ7h‡ ξΕόKτώLQ1 ½o¬Υ7icC\}©R»L0ƒΩzΦΧ›‘φΜ™-Θd 3¬1U—όλΓλi@cjt*­sW oτΦ‰(!�\6Ιυ ²…Μ«d �ΰύE�!‚iφE PşsΩyϊtdΪhΊ(΄μ)%ƒμ4,>Ξ λγ=¨Ώ΄‘ ₯:Z’aΖ!v�hq ΰvΟ="{ϋbf”²&J‚™rSI�0{O΅δΕ0ωŽΘT— 3Eτΐ¨d|;¨<£1ψΰΕ,α:�Δ�›1•Œ_A?ρ:±”sR ΓΣζ΄ϋ0ŽŠΡιηκόοA 9Χ122B‚p:ut€wήzvΟ&χšb\ukK¬Ύ$\&βΌ_ΌDi@/MHοΡ¨p9΅Σΰχ Ω]E6τM¬Ώ—S‰ »Nθ’nο~ΧΠ°°šίW5–“υ€^_τΛh’ͺ΅Κ<Χr‚.:!‘`\απε…©tαΪ›©Ύ­3-M<#a5žζ&Πœ½ΚΤτ%λHΜ5Α@ΦηΖTΊμ@IDAT.$±SΣU•κ——aΠ-§sΚz³œσsήk‘˜‘™θgΚqO ΌYŸβ2쏌όsΞ™½Ζ,8AžŽ8«₯¬g%ηA€λΰφ gΚ‘ΗΫG¬» wΆrxΜ-šY’4ΧsXƒΣΧΡ«’ΙT$�zzh”₯ΔΦŸ_Ζ™\Εξ5pgκ`HŽN¦‘α!l5Ί�½¦φ= ŒrhΦUΠΰy°tβ0Γυ.&ή³ΊηJvGτŠAΚXίΝ-ΟΖWF±–so_?c·Xλ΅υeμΝ>2M=™ TS.£Ί3υ^ΈϊOnέϊ™�κΪ­wŸr ‡œ>ιεΌΤΐžΔ·ΞΟ‡XΙ�μ§‹ΚΞό >Jkfώ�Ού�1ς|ψοQ#νΊ`¨œ�šU1°ΉΥ€it ni9§s%kr€say'©Š Θ?Fφζ[d(–θͺ»OΏM–ωΒ€;(;‚86ν[_ϋ9^»“~𽑭½@yLΣ‡ ˆf&fΣ₯wC�ρκλξδΰ”¦ιΙ©σA1e-δ•1fΚZ‚–‘ŸΠ±Ÿ&Vν=©ΜζI2'μ&ΐ‹V”Ϋ­tΪ]LMŽ>Ηi-H]mdp8) ½4κJ=½ύιΡν₯±§ΓΈ–ς™ϊζ( ©―ρEYι|Τγ¬φωC²oKΠ7Ϋ8fͺ £VRdUΥoP¨±΄Ω”tP―%hbœOo3₯‘‡mΠύ@>QήR~σ1€' iž έ6¨4ΐΣIΡa� JΫ3Ϋj—�Θ΄‘%ΜƒFξˆΖΖ‚MŒN€ν£ΒττΡc(—€tε5ƒΥFΐΨ@ω‰3Œ»²-8ΝE©£Ώ ζM–lκBZΓAΔ!Β‘c‰ †Άψ—γΑΪΊ¦Zͺ"2Ifj4ΔφOΨ£ŽΡΏ»W:P‘Aΰ{Ζl/.LKΣ#Υ5κƁ~ΒρB‰fΜp‘²*€φ(ŠΌΑ~šιˆrδZG[7Μš�©–)dΖ©P.œ ³cΕΘύώΡ&Α ”rδDΗrz|Œ &G3-`έ£σ,?Ki󦔍œ Α…3’ΣH]Μ³>œ� ,φhκS…ΒvΔέ ΞZ”ήS‹œ8»ŒλΨ謈Bδ²Οή[Gy³φΌ¨=EœeμυDχz�ΰ”μό=.ʐί‚bλ(‹1lE­ T�¬υο…, _ψ¬�ΗuzNNΙώβ0ŸkŒΈuΚ:L#Ÿ’c\ΪN$2Θ@Α@pˆ΅ρύu˜}ΈwΞ[ΟγσΈe²Ω€9Θ3ζf5Μξ€™ πw :φ�½‹9kxƒ„>ΛJdИΉ:n]£kšβ«^=D«ƒνi2 Yο˜›\A@Λωα(δYnΕωΠη:ΞΉΧ}Š^»Π7 Εp( ΪΒPWžwA;ΛNΡ΅6λsΏόLΟΨ΅ή”CΧX€s©Ύ4[[Pš»φM@‘B·Cdhdx ω‡!Υ‘Εi.K—Yw?#‹sτ£χ@PΞ(NξŸ�οA—dΝ@™sMt�<{2T °Υ :+;dnm ζ‰qš†ΟΩΔ©9ΰΪŽΩΧ=ι·vαWp²Ή3Ηgνγ(v BΛ~§χid°,_ρwΩοaŸϋ>/F9ƒ:yθpΛ!ΫΦΗ¬Ό]φ‘Άœk₯™Zs½±η�Ωγ'μ£Ωtƒ>ξ‰sγ}yΟnΐ {¨0€ΤωgS#Xr\˜χΆ‡ύ°TΕLΠ2Ξo @Ν XT?Β”rK–ϋg–pym=?-LήNΟ…£ψ½?ϋnθΕ2κΊIηTQBΔΡDβz›azXή΄²J_Φώψ9` ΟYϋΚ­•_Ew:1Ι,‘₯‰OžZžΒY%Ψ­ Υ‰΅―B₯€ϊ%ŽΊ΅p =ί‘mG?o€gΨσJ2»E¦§\Λ>%Sφ5(ε> ΌGΗ_Π Σ:nZ½κZΞ)O62=Γ–Ϊ€˜ε&¨@'±Ε0Ιάws:£“½ ˆϊ‰ ŸE=χbd;Ύh=β~ φΤ_u8Ζ–’­`ΫNΟΣ3θS|Ο3ΟΫ$pͺΔ7’AΈo’ ζSΡ݌e_’Y'χβ½δ)3n³ HψΘΪϋ³εH:κΪ9Ο™η_\vQ₯ΜM΁―αΚγσžjψ:=₯ηY'|ArQϊ�»7`GβW±θ|Ξ9Ÿη9Ϋflι(δΌ φ»ηχ‚³~•ΘR�ZXL“QJτΤGΪm‚%Α²˜@ύ ™ϋ3Ck`λΎKρds@ˆμVΟӁλΙΈ­ν³΄B―€UXK6ΜΣ�ν£ƒA6ψz+C" Άθ`;zΰik”δU£OΣ“αa|Š£TX©μ­Ρ«ˆΕΓΏΓ¨)ΔNβχ…ό£‹τ΅²Έd‘Ϊewω9tTb’Η)Σμο`CΦΚc˜Ζψ;[k0e³OLτ9κ4‡ΨΞe\saAI£Θύ!Έχ'£#0՚Π!εŒ‹$¨ ϋ£ͺCSq\?ϊe‘Ž(Φ6ΩOΝfΒ«€!£cΟΣ ²ξW_{;m‘ΔΩ£Ώ€ύ�F—q?M-©Έa0ύδχΣθ3˜SΚϋQΙY<$Ά/Sψόμ‰χ½±Ίhώ)&»΅μ2­ŽFέΟΓΗρΕV�κ AT]έ$Ka°•jΩ―jŽΘ{°ς>[ŽNτ>N±ϋψT²μνbIže₯²,,ƒΦρ> ΠMz…l!Κ—M0υ1djϋj4<2ŽFζΟΎΈDLΤBO<Κ@Ρ…%$.3°Tχ�ηZΝή‘gΑ{8ΐΊr&`CκΪτsIY5³7•6HF‚ΆV»―άZ’½OLΛteZλso"[‹Ψ–©™)φ£‰Ζ˜¬3{#yΉΏ2ΐ…Lu! Ξ–τΪk·Ξϊ.]ϊίΪϊΎόΉzβ/�ƒ₯{ΙίωN’‡Α1_xό�βήηόΪΝ?šόφ·�ψΓϋχΏŽeΒƐ™Α0Ψuv΅ ŸlΞeVZηi΅α_ΗxŒη²φ|ƒΆŽφT€qΞG‘HaξhΛ�¬«ΑΒ±Π L:ίΪC;39™~ψƒχΘ›½e|Ωz!d[Ά•ΧφΒJ ΉAI#Β1 ¨Šΰ¨…_‚E[$`4›dΚλ€ŒT©Lή&T@†‹€QkhΝF`e3 X;©Π+)‘•ΠΫΧ—Zψ̚ζNήw€!έ€f—©Βπρ^£Μoήΰ°UΦRJη) j ης₯—a½Du@GrΟR’uΕ‘�ανιλA9·π·=Gj΄„‹Γ‘FYktβΆPώRΠƒΖg°ƒQr4‘Α›5GŽΚ¬¦lέΌΤΌ3Nύ�uέdηfhHuJΖ-²oψNΎΰ"qJ¬ŸσώmΔ΅•††“q[ Šγ Ϋ,XggOμ³ΖΏC'­TΔΤΩΚσΣS(άf΄@Γμ‡NuBpέΕ=γ΄ΓΩ!θ;Ә`όtˆΝ$šm²  ΆŠ£�œ‰m¨‘χ_Rθφ9Ζ}ˆ’cΖ85šγbh‘° n\N7^ΉJσΓ 8ŽΚ` :6Ρ4Ηysyκ7cϋΨg›Ο8jK E#n͘ ΧaoεQ€’’ΰΚf”"dƒeEηC£$:jύόuΨ+4ΜZΧ(³· /Φ�δδ –°@œ5d‚(EUΤ#Χΰp&mUŠ£]Ι=–β ς;�˜½°ω³Γ‘kCx;―Ρ Ν¬UΞωΖθπ9JfξtΤ½—�ΕΐΣ^Ί^Ž ΤQ6 ζN§N·N«Νe(O8±š[0| ό%,ŠΨ§Ύ>ΑNJspˆΤ ΠΉ Θ+Ι@4Ε΄ζάσUύW―\’μ§9ΞJ>@©T½:2΅uȍŽΪΘEΞΝ žm£d—¨ϋlΚj₯ƒmŸ”:j8e pσ$τ&Nη_{ ΥzfέLΧ �±ύ ΰž={Vu­Υg:Ό² tŠlθ¦ιCB‡ΑF†�{ο€iv₯ηέτή{ο³2ΛW΅«vhΠ0 91�‚ m΄ΦJ{`‘ (Q‰ Š!i1£…b$*8†3 0˜Fh΄«._YY•ή{η|†ΦR@Ω™•ωηχί½ησžχœΓ₯8¨PΧ~ώfοGRΪό₯I:Υ–dy]οŸΣ†SIPΛ½„ΓΚ΅#­Ζ:{62Ɓg†{°ˆ΄iΏGΫάΰΖ(€|†l9Fw!UθgžϋPΎ€Ξj?Εhƒ%ο�°Θς{ΐuέkΒ$ξέr6’CΘ΄9a¦«―'l ϊόT6‡θJgP[ʁ8Χ�x†VΝ.:Χάgφ½βΎa°DIχκ{”›ρL‚žκ:ν‰zZύ΄nzl¨ Τ=χ2ή ώέѐSΎq{ρg?Ki<Ÿax­}’dPΕ‡τ΄Π+μ³ςΚ’Ψς„OΟΊ²,ˆ ~UηΚdΐ4„ό md%ΡΛΌ³ϊΪσͺO2λΕ‘IeM“έβΉυC°G€B}οِaΪ@9a%ΑΫ!Ν;"Πjγ7υ¬6pyίƒ Ά=:ښxƒd2Ό€‘λdε»»:SOwΆΐ›±1O/€­r&lθoZΊjΠ$ͺύ Π…5σŒ«‡Μλo &¨[υL„ιx�= <%vŝΠσ �λ¨ —j£Α†ΜYε*μχ‡πQVf9Ϊr4*,β~'ΖFγΊΕψhε$Όͺ‰3 ”ν $(‰Uε\³ΗΘ„ΐžώ© —‘ŠvΪ^‚«|υΏ‰“Dϊ6&\9ΊΘ2λ7|hO”eΔfΧ�…2­ΪCΟ ΪΤΏ˜ ΑUω+zlȁMΠ> �Ξy•q² s²ž€š}Ώ’GφYΜς4ν…z'l(η,z‘/Έ΅ˆιŒKτWφ]Τ©nΛυk7γ>'§Ux‘φΛ~xφΣrΜζ %₯y4¨ά[EKν\Ύφ§�ό_όογρGΏF�QγώΖ}Ψ΅ς_όΛοΟξl>ίyςδ+ωωεyUdρŽ’ΪΓρΰ?A £¬”Ω—¬Σ3A �+$–Tΐžwυφ±ΏPΑ Φ̐V"{w^{ƒ1…£Y;ΧτΎep•αTηGi”΅ΧY0eΩr¦¨+EG:ͺΚΎ!σΘƒΰΙ6:Νσ₯γ―™  p­λ΄Φσ’#δž ~XŠΤ0XΞ9œ{‘¦GFS1Ρmc…š]70–’oΐˆ@Η:»ovχΧq4σδ‡{λϋΊ–ΌEφΕ?Τ!�φ  #xV!™ ήcvMƒΩ(σžƒΐΠŞwœ@χΟ&gΞ?χœλ FΚυΥΦεϊPeΘ +€`ώ^βϊ " ΨƒΗYζŽAtή»ΤuιQ‚!€VΓΊFΘΐ°œFζB•” SϞ}CμΡ φˆ ’ΠeވΆ¦�<}ύχΎœZ`$ τ΄aχk‘ρ μnS4u{όδ~Ίqω2΄s€Lμο—ΏόnθιM?ύΰ32N3`έC€Ÿ› Ϋ&P²™η2ŽΏΝΖ t΄x΄t‚ΏRW‚opΒσπ,%θΐBtα©t]}€ΉΨZ?}]1ΏΟG6  «»άCχΖΎ€¨kΆdΕZs§-‰)πFP-πωmΆvJ f@ιΪyφ @-!Υ– >T*πrS›<Ώy”S’^Θ°Wμ­‚$H ~UfmΌjyƒ™ΤLΈŒνΈήs`’Eέ/’_  ό*σ^―»g°’L 손~ώ7κΩu$IJeο=ύ$=zρYκDΦaγΚXσ©ι „œΪψbσΨΊg#izόŒδP%]Ψ/ΓpΌ}±ͺ—ΚHŒ½˜Jc0Ύ”Λl”« ΨZ*ŸΩ&Ž04`ŒΡˆœΑn+dM›ιk�/t\>~ͺϋβΉ4‘₯ *ΖΫΎΫW…½9`άwn.εJSSτςψΝΆηiv‰ŽΥ°LP /δ_ύ)ꂍώkxa³\cο͌³gS©n―|7I ^ΰΙ΅€‘λΊΆ‘tαkv]Ω°zaŽ™‚XΗ—Œύ ^f]· ΜJρΏeΑU3*χνwξ€/½ϋ`{τπw°*ΆWΈyγvψΗψ―fš-ΙΪΩ₯€¦HFΰˆJ]=~<¬§C]Ζώ½ωΪΚzΫ8§²₯KsΕr@;!›:βe•ΕΈUVZ–±z鐒²υΖαΒRΥΦ)pvίμ΄Ρ¨ ²e6ΣtΌημτ*z_Ώ[†΅ΰ)λd�­Ιš€rVέWeTπ2+A%aΛyhhrJ›&fz4·Fφ|vβ9 Ε9|=ωΪ°•ΉλςRXΖ|Zb₯@!N²ΔP«ΔN„Ύέ'>Ψ#QhK—AH’Aό1Ο!o£ΐ|ν%˜ΠΉ<‹rάχ`  OσγΜq6υχ-UΈSΟzΆυ!‡…βα³QΡ22/žN€ηΗh Έ‡Β]EikΌ4”�ŸD±=tνm­d›‡1^»©³Ή)]Η¨t΅·¦’zκ�Νψ0£Ψ‘CΠl2Ί΅ο₯ΣΌ4? %Ÿš9‚8»Κ.1|yq&‚Ϋ ΔκκB~ι‹v]ηp©ΘUΐR—Ο |¬έεΜ/¨IŸr–υ(0ΈΜ­Ÿ‚ γΦUκ  `LmΎ™ŽΜŒ±73š^C'Ϊ’;4ϋχŽιZ€²72:—^ΜΜΡ”g±ΰ€ Γι8ΧΩ2λFeiο―Ν‡*[r@›WVVpv-γ€Ξ‹3gvΡ朎Ν[_fΤkεάz$5«ΞΆTΣm©b:‘J{ͺC§ρ2H ηY=!XΝ!ΛdΕuβΠΜ€η|šέ‰YΟdur1Κ::χΜrο2zΞ.__ΕΉGήsoϝ]~έΏ˜μΐ:"@αΌΚ/έ\Y ηΩ³’ρςŸzB,Ρ±fΦ:Nυ“Ξ’•cŽNV)P.aπ‚‚ΗϊJvνq¦,‹Ί4ˆC΅Ϋͺ‘€i|–‰%Ԍ"#\,h�R’­υ.g͞<αlΩ@(kΖ&Xš§Tk‘ϊ:J$.‚~ ν1ΟgΦΓ έ,ƒ;yξ @Œσg#K³w‘9fΏ²q`YΠθYe58CθHφΑ½·’Ÿϋχ\?šEςUyφ= ₯}ΊΆv_Žƒk(ƒ:Ν²"ωΤQΥ ΉB \GƒE?\σ @ΑσčΗΟέΫΨ&ώeCBίO:>žbΝ½σo3">Ÿ]\Hu›,[8zΊ$ώ&έeσ0žyηήϊτ€υΤ uŠŒλέΡٝ>όιOamΠu“ρk”±ΰ‰­”m3fΚƒgf›υX­ε<°ΕœKsΡ—ΪhφϋΒ�τΔϊΊΞ¬…¬¬sΩϋθoΔΪω5φƒηtοퟣ/ΰ™ *Ό–Ο€.―β,)Γ₯^Cέ’4‘,%@!#~ζρ$Θ’ΰΒ<3αgޟAŠ š:Mf•ΐA5‰Ηό5€—³–Ύo5AV)[3I•ŽΞΞΤΚTB Ήωι41Eγa]–kΈ�™tο™1φ›�G@Χ�h· @A} ~Κ@·L7ω,ΪΌ°γθAυŸ_exNln* #xζ>zoΑDΰο €,»-§oŽ€|9@EQimš]X₯Φxztο Ι@Hz/Τh™Θ4 ¬�₯δ† )ξΩς½όt] ϊc1ω―gF=λύϊ³Π§,―ηΟόAγνΨ�νήϋ7²Wβ~Υ΅μ— ˆ-μΘ`Α!I2Λ°\ΟJ|Ύ/|ε‹ΡϋΐΡ§U₯¬yΊ(—s3ŒβΛΓΧ) i’ά–zslƒ“·6 †m˜¨ž­ΕώΛώ-‹²:ΚLϋ‚okσ—ΧaP�ΩΫӁŸή¨ΧΜΨrt^oߜ@Xύ '(hAŒSρA>¬~’}Σffθ§B²¦›zλφK©§»'lΖ³±ρτ{kV ςεt ν•Ι MG€a<» °ς*;LŸΫu\4‹~B9 ύ6VιγΕήT€ΒLvwyΖε…iΚG›’ΧΪφβxθΖ=lχΔ‹‘+Eœ2vογχ`θΩTάώΐk)λ‰Ο„Š•)Σ6τZjιH‚ŽΨ°›Rd΄†υ;deη‘X;άΛΌg3Ψ <:Ϋδ’ ―ŸώNΏΏ„σκΩφ ϋ3}?―UŠNΦμ‘—΄–˜μβϋΘXr d`¨ΧeUOTs?²"-S0y2‹¬<α¬-#­¦GχŸ₯mΞW9ϋ’¬8溌ύΠ/TŸ°z#‚3Ύ‡€B°b/Q4NFSg{Ο5$ϊπ)T*ώΟΩδΌΓ^WΗχtu +όyΕ�sί_ަ_ƒŒ<Ι/?КΏ™ϊ§ίΚyώτ~ργϋχίmmm«�‘Z$˜A†Q&Qώgƒ©œΘC84KΜ8ž`¨N Άh,&υ>Ÿ¨¦§―j“}DΔ₯©9’HŠγƒΟ€~�Η\GTΜ¬*FΕL — λΐnΙ:4ϋ4�X#˜Οε°6 Θd2ψήG6ΠB€­•pD *boP‡o ‡bav2Œ…QGΫ`e :‘’φpfy ©]žO%½Μ{0Js΄Ιβ)NΠ6‡x…€ω4fa3MLΜ�τιd-6 Fklτ¦ρ―««ηY KsBθxΛKΠΣ8¨Žσκd#5Ձ�θΐy5@f#P4fΊ-«PQKa²ΩŒcΐD’Α™‡{e揫sg°-ΠλΉgβJ\%%Ž”qœΧ.ΩοMϊΌhΉίΧA•UVU’ Λ©‡V1κΎ;:­†Μr_�pάΧ ϊ©ηhτΈ‡σ°ςΨ@ Ϋ/`{o#hΕΥ5ƒdαal΄-.,ρ:ž £1GμΟξ>NώβιΣOοGΉΔΤό’ΌRΠα[ι₯—†`i0²₯――•μ@ŽuΤ™’syKΦOˆΰ�Ή ΐΞ2Γl)΄6΄ιž―sEBuό³ ²†Œ‰ώ<zμαT²(όŒι"{ΈυSΨ&kιξG�μ⚝S9™άPꎾޘ‘½Α3Ύ›`ύ¨k'π“₯cS3Ηΰι”ΔΌά@m½Κ@(3‘*)έ}ΦΕ1gΜ R2Qθ–‡”οa€ͺE£1žΙͺλ€Γ EΧ€b(NI“ιτη΄Μ ΐ³ŠάtY7+ψ`ΰ “"€daδdΘ"ikλJ½ύύ|(s:•f3 τ2†Ρe03izfωŸˆ&Ef�ηgf9s‹d‰ «η<βξΣ’©��ΏFίnάye]Ο•�@M‡ΜΞ‘ΐ_Vσo§c2™¬₯¬„Θϊςz3”²Z Xkiͺ₯8(^‡Έ�ΩΚ ž™'?₯Frέz˜!‚"ϋ[‚'™9޳’݁F@€n‘yUm}Λm‚.A0ΗΎͺϋΙ2:ΣΪΐΙ¦I6 ΣωU½?�/4ι˜*"" /Λ“H3|Υ€Ή&N;±<ΕΏQΞιδ)~׌ —°”εœώΡΟΐΘ‡uͺΞΈŽ©χμWχ/ΐΟζYŠΐεsΰ ώ�δ³–PαΘ¬0μή'ΐ<φί,lφ �Ρ3gΘΏŸσ+™@α#fΣsq Pρθ20θV½ΛΈ9ώ}ΚωψΫΏψsΨ$φΖΑ¨_ωjν~2œxΘ1zΤ›κ 4»ν7wt K ΘΎ―ηδ^.¦ΜD¦΅gε~ šύv$ϊΟ°π~:lΪG LŽ?{ŽsH¦ˆμέΝ£1ϋ+xrΞΑπL†嚞Υs\Ω§DP8τ‘KΔο€�ΪlΨ φΊ|<±φžυυκ8vγάϋά|ϊαsDΰΘϋ+vw]tςvuω»m Nΰ!λ±ΛΩά±Η… “ΧΡ±00aΰυ d€¦²΄Όΐ– 9C6uLω&δΓ€ΪOƒpeΓ.Ωf τe J-Grή‘k2e20ΜΚ»–ιl–pn³¦RvŸ~ΉΏYά g‹gΑ9δvε·A££½b4χ.%·]σύούMϊ·?όAϊωOο§VΐπφZǑā ±η”2œb©Σ6΄$sι"ώm π6ΊΩf£–™y΄\SYx\B,γgξ©geύΆ±£ε …Θ” –SνΟ-μf―-+αŒW˜κ`ο‘qšŠΓΡ΅Δξθ1›ΘΰΚ–@ΝLsΠuŽΤΤ?) Ή!,c;β{XΟo0°}aχΨν§₯χͺlkhασxfBς@ŽΣ/‘eFXΠΝQ³ˆRš”�‡ε=–ZXrŠ.;“ρ†₯) I›¬‘ΆΞ6²Ϋ_ŒΞω 0Ίœ˜%ΥΩλzVΧ8#OΗΠ_Ϋ₯‘μ΅k·‘�_£€H`-Ο°m}B†ΖX7�OΈΉ‚Ÿ‡\£ϋΎ}fŒOd–Ώ±TΡΜκ…­ρlΔδ$^cΰ’Lλ'ω!ψμ·‘„Θ~Βίσz�_߈Ό΅vŠΌ„M>5Χή;^p“€΄k96(—gΆω’ΑΎ5ϋNΡΡvκCqˆγ9]kν΅zHαρ=τΗΌo]]“8S‘ωαύάsζίϋ<ό?žM Ηο3έΕϊ#ΏK+Q&7pmkΔ§όžIλΫ‹ψoΤ΅Σ{f}} έW‚ήΆ4Ξ9:jΐΌ»_Ι™©d+(γb7η:@ί@dqe!=|ς4Νσ΅–fwτ39ΈK―€}Ψ‡™Ίžά";/YΝΉwn1ς]Ουlz»C_σ ό)kβηΈ'·Rο_ŒO€فœSΩ’%Θx°X-‘:ΐ:{ΧA¦?Ž5ΔT.7ρ³ΛHlΌ—‹tL© Ζ3μ0OΕXΫDΝ}Π“SF©eίί€}ΐ3^ΝLLrN`Zψ |j§eIιšΊτκR-SΝ[»bΝΞ8Η–R[Ξ[†jO€<Ξ‚ύdv+hώΘΡOΖ άϋ ž|rΫw‘εώ-±Νl§₯ΨxΩ<_X&`.ΏΧ¦ς—* žΰ™ΚÎΘPΝF΄fΆφ˜koq_ξ©ΰΛ)χΏF’d  ]ŸΘ‘ϊ¨Ϊiϋ8U*`ω‘ΨΜή!Ά±·ΊAΠΒ3¦ Xƒ�Φ§S�Xκ¬-ό=~ŒνbΩ{§,Θ|πά[^ΊB2Rζ·@©ώb0Ώ νϋSΖ蕝Ν₯«�ΥΧρ?ό―Ύ@}œΔ_‡�d–χΧαN�?ΎG{όεw0�μΙ½)BΨWQΔΥcγS ‚ˆΡ2@P`t~l°QBΗ €ΜOÁˆc²0kΤκϊΙw’qWΎEΘ€Ζ¬,ΐX ήoJΜ�"ΏF‘sޱT=‡«€V'UΪ£΄&ίsBG#VcP¬_₯‘Ι'2λƒΫ–"Λ79J¦|f:2•Γ¨ŠΰόŠdVN`s3S[�έ‚@ Ÿ±­³;υ ]EYΦΰ˜.G-σΤ¨i:Τή{|?=~ϊœΞμ+ij@A§ΎŒΜ³Ωt©Ι‚� ΛΑ‚.K0*ε|žY©¦|F™I‹EAθlθ„še”y Γfζ#££5n8r^S'Πυ>ε5ŽΦΫαoœ!~qΘ­ uά‹ΣξιU(ikΎϊz:)ω ‹0b­Ϊ<(kF‘½£3(YuPΊ"¨Ζ±α4°|==Ξ1ΤΟiφ§³υ”ζ_ω>??—Αa_‰v Pο%@'Τ†aK+€ψ•[»Τ‚‘©05Ή˜&'�ΘΓϋŒ5œ5­£?@_Ίqϋ(ŠW0dŒc‘ANΖŽ™5€p±?�ad{XsαJώ#”ΉΜ ―αΤ™=0Θqέ€Œκh‘ΛX ύαL»/•4‡¬‘ŒΑά†Q*3ε[E˜$ޏύYέάO‹kGt:_LΣγ«γ Ι κ—oά‚q-hΣ;ξι: g{ƒ˜UΡ ΗH/2}vη5ψ5@φ94ς:η:λ3/˜œ\½ρŠ =ošϋʐt•�ζQ((—5ΗΔπΥΐ€{63¦%ρ64^\�ŒσΝξ<³¬Υ ΧΜgVu!kRC©F=ΑoW7MD{T]ӈЈ¬0„`U§q‹@]Λ’©™)Ί[Σ€ ΙΙ$YIŠχ’e*Ν8˜A;‘γ΅gέr Όe^sΐ‰ Ρ—ώ-UV™HδrŸ ΜT@x;ΩΒ3αžF„lŽ:Γgf ΘNϋ¦ 0γ+ϊ)ΫoΎ‰s%mή@ΪRΟ•£₯όΫ3Ξ§+τ•εPo½y'ύΑοΩήNwο~œ^Ίu+½|σεΤΣΣΛgοΙυdeΦؘMdvvž �²„^”­βμH-܁…ΣE&­I]ΖύIή$Σ­Σ^JKcz‚Ξρ<‘ΣtΰΘ"x4£ΪI/YJGΘΎŽ§AΎFVΊ‘Ο8£AΗ™6šP>jpΞJš¬GT�*C²_tBΒ‘ε\ΘΪ¦) “@<γεfΟyΩN6crk”Χ‹Χ܏μL Θd\8γ‘•ΤLΌ†/¨"œgΞ°vP:·=uςpΒ₯±ζp}›Κ†Qp\“Zhκ‡\wέ³Ηύ•ΩΠΣ Ε^<γΣγ1.Σ:gχU6έΠ°ύvϊb/ώϊ;†νŸMύν—ι½D}²ψwΡ―θXλ΄mκhΖxN.}ŠŽΝ#8‰¬-gAΉTΓœ Φ:1fπΐ1u6†δζm(gΓoΉγœ{hϋx]θR{»°^ΚI φΣr²8ΜΘ x²rό Y;~wΒz1”Šΰ›Ÿ±.EΨ·|μ…#zΒZ¨Οτ…΄Rž LΡ9ΐ‚γΩΉ²Œ!Λ|8Λ»HΕΧȈ³ί6eωΒ–ž"ξ‰ Žςΰ:˜u6ˆ»Ψ’ ΑŽrh9’{₯Ž)Η;γίnϊYgΩ&Ž|ΡΦ Γmν`μβΦ2ςΠΐΊh_½ eFζΓ†`r½HMΉL΅Ιιη7¬d±J•u=η}γ—πΓv™“ ΠcŒ]Κ;Ί;π9°©€ΑΰβϊYοŸ•Ύ$θfϋ¦p‡ψ^φέ©αuψ<§kΊσ’όš™ύεΟn>“ŠΈr‰<•eŸΥ�Γ*)'η$Αy855C0H“Xήο„ύΪεΜθw0E‰ΓΨqυLφμž―,0ΦΝ:x}Aν Γσz₯1Ξr’•(dΆΠg3μGL"γάΈuu-œ]ƒs²ό­­”vpξ�\’^}ύ5˜»WΒ/4¨m&ψUω}4_&Θ,g�l\iMš@ŒQμŸαr`YS ˜B9J#=d‘Γά‘Β-ό��…*€ΓϊƎVΠΕ¦BΩ}J•ςa/”α_˜ΡΦΜ8~†Δ }ΊV±—W�\I·�ވu][hG?[Ί#ψ₯šn²¬ή²΄ϋsŒ°‹ώ]έ‘ Θ呁τςν«<o qΈ§Ο†Οeˆrϊx™5·Ό6ŸsVΦ  όyy\gOOκdξ"Ξh k+gή2;δ“R™dSL^ΐ;D'¬LO±#Y‰v ΏZ ω&f;@š2±ύΪΰύwθ”ΈΗ4΄Btό1v\Y)Δ~ςXœΙ6ΐ›AοzΖ‘Uφ σ…9Ώϊ[θ@ΑΑYά";Ξ°L>ύα`“rΝ]φ­žDB.Ίξαγga«:[:R{X¨_ŠΞ(£Ο˜₯s°cΖ^Y―!δ‹uΡ_²”>nΨηXsΩΟxκΞ¨qIΨ2žέήB6o.BMLZ a|£�±²lς›†Ϊƒ ’m(°qͺΞ–Ν”gš ΚKΫκ�Ώφ½φ톃σλρ‘φ�ύ<8}�ƒOG榟οI뜚/aό‰β,Ž9υι6 *Η!CJ‚ς’πκ€λΔ~.¬*—¨;–$|πσŸ§{OFΘ¬ˆο1ΊλƒτΑϋ?OO>α0Ρ\EjS3ΐeθMν©»›fˆ5 Œ3±!_Š3’‡O%±HŸΡσΆΞ>+5_ξ9P5κ a<ΨΝ»³›Ρ­ξΣ ·ˆΧΩQ;ΧW"ΐσgcτ>―λŒ …ΥΜ©tΞKW_I}Γ706UPκgiv7JΚH;:ώ― ŸπΌŽΦ«c°Y-»&κxue¦€ΩQA£O?z>ύδk^‘*Q‚½—ΣΰeϊV@ϋŠλ£X•GχΫ Ξ3‘β½­ΫΠ /%Οΐ„ΰχΤε4šU_˜MΣ/žSͺ°Dˁ=�™Ϊ!¨ΆG…Ž–τ�vuΜYΟ„tgΡgεΖΎR0€φ Dw|dλ”(€¬Ό'ϊ FΎ«»+Ζ9ε„A` !›‹σΛΠ†Χω€ι}#œIoΆFέ40PΡΡ$°ΞVg�uσύm�fΙ‘=:GAg/4.φ 0M*›% BuΪ 4²ΰC*Ύϋͺγδ{ϊŒ±gžΞK- mPT#+†ΐ9Yπλdψ₯–W‘}œ‚Ήa“8YξΏ™T›ΩΫΐ±zκ0D=ξ!ΟΞ>ϋ&ŠοήΝˆ™I>ΐ‰Ζ"Cζy3Pσ­;4ν^-›4β"XJ3œϋΌ˜qΦ€λι„ιTΫwΔΩΠvΑΘ ϋΆ XΊΎ²ŒC€Ι³UγX8VUΰ‘ΛϊΙFΙδJΐ@YΉ˜LβZk€Ν8OZ”ΎηΕσΊGμ„ ©2aΕΙ6¬0N7ΞŽό*ηΗΙQŒu­uδΝ„™E6Ψύχ \τ�Χ‡ςνϋ^|^€™“ΐ‚ςw~Xec₯ΈH.¬A³nφ�Œυ)`ρ]�<ώsN0fζWξ—ο)S!Ÿ{ Ϊ0ο2Α‹ά/ύl5’ησ˜ΏχΙΌΨ%#β-ΘvSχ©3Μn8q$‚δz,‹YΘZθ’6AτŒ(κ_υ‰ΊE\€KΰΟ€-ϋ9<Χγω―3ˆτή‚ΐίψ\g.Ž£“2οdNo,Φ•}χ|zσω.2Ž“Ωy^œEDŒuβYYƒ|cQk�= ηπ»sžΩχΥως…ΌΏAO8{θ ΩξQ1AG>ϊO€©MŠΏαύ­…e‘Σ‘3Έ�‰TW�£άšy,\ρυ>«£D³ ΅Ή>τ―ΧRρL�—ͺ{"ΐ§Œθάͺ‡ �’L@V™Θ0XΆ,Α@¬ ›ηέg+ žΪ�€M€=Η‘γlΦΚxΓρ”³Σΐ{ko£yo[eCΣ1αa|ό95Λ4c­ nΔ«Eί}χk 0Ή(‘³¦ψˆ50Π( ±”Ο$–(xΏΪ οΛηr*‰=<‰κ^Y&κ5$Η€)χήΛ: α"gyƒ¬©?³ΝΟ‹]ΝΚ�`sπό‚†Ό=Q²\²³ΝD".3χ‰²!΅χΉpŸ\’Μ! !£1ύ«,*—Κ―΅ΛΎ^Χφyά77D{. š”}d3BίΩcEέ+ΓF½+ j�' Ο€Ο^ΔύΉwQΞˆ«EΠΤΉ�—Ά`–€Μ’"dΨQΫœC¨‚Φ*@P™af,+Π£‚že―#0*λΞΩς΅0=7²€,©΄ρgoίξj~†OΐϋYς3KΙΨΣ£+{(ΕG['Σ� ƒ› ς½dsΊ‡�‰6Ι½ Vk§ ΓΛ5qSψ`ΧΏP‡{ώ•aί3š ²n>§―u|¬eϊ}–’Pnι4³©ιyδ’’©]ΞΎ‘}�Ξhδ0cO]χθm€ύ ΩW;°gξοΟ?ΔΤ€ͺΘh·ΕWΧΚrΟ΄rζk½_§ί+£~Lw”@΅ό*}nΖΫz� °Χ–’μ€°»`3Tτ#ΟΉΘ΄'Α‘jμς΄²Ί 8@3a©…“·‚Α»°՟~d©Υc΅όܚxύKiρΪ1ee‡ιΩρ¨Αo‘ω^66υY¨Œ§RϊΛY·–J;‘[Κ’εΟc]½ Ys²›¬=΄ΎΗοΝϊΕΎ„ŸΖ~²OeΔqζwρε’‚R ˆ£™Qλ¨8uwVΓNκΐ?oΕχb<*ρ…`• QKBWa{N§eό±όρ:€‚ΝΕ1|‘iΞ }YΪzΡ…”ͺS°»–[Ν̎>K#§ΙQbYŸ33Σ$ΕFΩ]Fάσž νWw7Οή £ŠΖ›&ΨC§ι±―6›u*1ŽΊΫώ42V”;Α$ΗΦ³Šυ²»·ώ­ΧRΞσvύά~ΗAy³ώƒ[߈�#εάαršc–c„ν'` €Γ/T0Mjν6ΑΧu}ͺ#ŒΉχΧ΄‹Ό*³ ¬©‚ͺͺλA†YG[~y‹`1qO‘orK¬=N1›ιΩ΅g{TΘήιτD# ~§εΏcέpΰ΅:"#•�pDΓΟ«9š©+†5³OΖf—΅6S³ Έ±ΒύaY+xˆ�1PklnHύ—zaHk7ψ�Xσϊœ%mΫ½$p„άAαυ�Χo^£Ιk™²Φτυoώ>zZ<Ž—’ΐ©½C²fͺ1⨻£=έΈv%½υΦkdΨϊ£UnAV›ΚάwΩ?jžXΛ―ΜΪΥΣKΒύt]Βqg±ŽΤ{�ή«:E6πςœ»n–AωχpfΟύŒ™&2H₯μ³L­3 χq>γ$λk�΅W_‚%s 8Ω_2\δΧCtΐ˜ίlν½ΰΏ�{ΖΟέΟYΆgΩ=(“όŸŸeŽ―£mnσθp^ΐWΛœθγΟ ƒ�NπΛ½θ€fY]¨έΨ2/FΰΘϋ~29i¬ηŸ2«">›;›Ή‘ qϋ}o3κʟ€§@¨gΗ3-˜ςŠ>3KoOλ”=³κ&υ«LmUΰΌ DΆΎP¨Γi’�λ{•Ρ±Ύž¬λˆ˜TΧU₯¬AΧΐTb_Υέξ{]Ρq(�’:YΑ‰:ΦνVaΛΌΰž;;₯LSKNZ¦ϋγηιΞe-ΑΚ μ HFƒΝΉ5Φ•έ@v}Ο—χ₯\Ζ^ρ;ΒR‡Ύ©<³~Άχβ=ΨΠΤgΆόP°P!ӁdQ Ά d Ά·μο€sέ�yOgͺsψΡ™d°ΡΧ6nΆa’lu¬k)ΰlc8ΑoLΉΛΐ…LŽlΖͺέ‰Ryτ…ΆΝΐL›< ―(#Bχ τšIvb‘vΕηp_CVψΛG7λyΠΦψ;ƒ~ƒΏΏa―Ν2Φ“„PΥ²?6šζ"μaz©‚Œκ6Ι†jϊM "'܏gΩQfτηΤ'‘SΈ7ٚM$!’„Ήξlο Ζ†r+x*¨=12Ny¨μ6Ξ#(Ϋ!ΰ{ύjκj‘m™φΦΒ'%ΈΥ»Ώž2ύ-ƒΜ‹xV³Ο³ ξ6ZΏΐ²Χ!‚ξWΐžF‡gχ�?¦Μ55�Ήš~g#dS‚2ϊ μ0‘^8ΫψΓ^ΫυpoΥ‚Ž–‚:ΡσbBA[Δ€λ3ψ`ύ4ψ·qσΝ€wȎ_€Κgτ?`ΟL‚ψ7ftέeΐd’l Η2ξξQ6Έ¦ΰZ€¦›”ž’΅_>ύ&ΨόrzI ³ξ Œh€ ¨c?�»}šξώτC˜Β4¦YUe]…eα NbϋqŒ�Ο>ψ έ»�€Rβ¬_€ηόβlšŸ›Αo¬₯DΆ=€„+d~nmDΟό…νΣΖjΧ vΰλΫΘŸ{>9>Γη4>}Ux^ΡΥMξUίg[=ΒkτlΔ.H†—σ$+Smh¬N€$M5e©·»ΩͺD˜ύ/ΝΚg=£ά‹ώou]ΎΞΑ�ΣΠνΨώšVϊα³ΫOL„c㟎Ό Ρκ"zΠ^”β7ΩG₯’’ω‹‚1aθ€νSIšπCΒ6‚A#p$ ‘Fκ“IFcοΟπ©,‰*ΐfΤ’ΓΥ·2šm-5ЎΨ?D†\ŽΜ Ξ’2TΘλʐRβ±’a€ΖΚ…2μKΠ%�ŒΧ8“] n  :Φ&Ή9ΨN}@fΩ–l)mjτOπΈ�~’ηύ’\ΑsŒ5Ξ¦q‚φB½§0δΉR9ξTŸΙι)Y‰Xqΰt”¨+ΪγΚ¦GΘh€ ςΌϊΪΪ‘Ϋ�νŸ<όΧ0α/Ξν―ςΧΟ5ν―ς-ώ�oόν?>ωφ?ύη»ο�θo§ώϊ―ώβmΊP·�š;8©[|b#8ͺƒ j0Δhζ�V9Ϋ$Ρ1E[ž8ψ6)5«’†QzpψΑ MV0ΓCΓP’g�ΚΪϊ›ΚRΩ*ςγ₯$;ηuvfφ)†’Μ+Κΰ ”°H6€‡dg_γhΝOY ;J 6 ]œŸŠ ΡZ­ν©�κK©{ψztz΅Φη;ίω«4JΣJγΩδ\Z'Ζά0PQJέ”†zāΣΒJˆξΓa oS52g�:Ήΐ f 4NΈπΦ‡z ₯Ω¨{ΰln$�ν§Y]χ&4k)xΎ ¬/u¦+kΝ!υS'΅Œg²©ŠAΣ)ο]μκ<ΫϊΊF‚ifŽh©Εxσ^θ7nήζ™ΜΊΐ<εϊ:>Ήn°μ† ΦΑμΝaμU°ΊΈΖuψœ&Λ΄ƒ>"yŽαζ"¦v0ί†"Ό’+ άΜ<οΑ‘�4tΉ+uw3ρ‚I uU(2/γ PlšzeΗ±‘YƏ5DΤ[[ζΓλ`©¨ �²μ a0μ‡₯'i �•NšN”`—ΞžΚΜ΅7‹kΉ€ΣuπzQgˆ"“-₯Ώ}f4β”fF€Ϊl..ρa£†lβ¦s&UΪ=υΎΝΞ;�Oκϊι8c‘CΙκΌπ£Θ xn€Ή‰D/ƒόλ ΩxPJ΅ΰ… φX%Ξ=K«³Yη\ζŠJΩΛmπ4£ΗH%ΐCc+θ­ΥΛJplE{Ν* rl‘!�:Fπ”{ρ;|Ίήp1›Y~œNΉο§‘0Ϋδ}fFΠ€υ7@pŸt2tϊ\gqŸΫί뀉 λιL)g�ΟηΌy3Dώ,‚DΦBCγΎUbh”}γnτDθ1k]V_—jiΒδ’&–θ/ h²ƒŽQIΘ0°†ΨΜ ΉRt5;#g£-½/εΤ)~/v‹@Π:ϊ·_…) o³ΠΩΡScq> ΩwΗ‘*G�‰#Χr Φp^lt)‹ΓkPΖγ9v’ŠηΪg#±3Β³OΉCΑZ ¬•Fœk³�³AΘη]k€Β‘FλoξΉN‘Ž�χpŠμZΊεžDC;ώ]ΕωΆ!§”ΏΥυ-˜Sd½^y9}είH₯υUilή!N­ θZΫEωKΨΨ¬•A¨amΘ%οδ‡gC™φΩόήO†‹μ[λΛιI�<"3RλY©Ιœ™|ΐ ASƒ>K[*ΙT9VJ ώϊ‰νγΩ}ο8.ΌOŽ‹?η:μ­Ώtδ�ΐžΆch―πœδαΉRG½?χH™q]l`NVέΩͺ-±;ad§Ψη΅9»‚YΡk#{Ξ³"έΪ†\Y€γζΜq>Τ�φ“1@w —υ¨fΎ{ϋΊΣΫ_ψB¬GΘ‰<λ)εκh‚ΰ SΔΑιβoYSžέ¬>.{8uΑ–@9Ώ^g»” Q`AφHƒΑ’ύxή“X ž—UρϊθMΏ&’4ς-ΖΚΥ’KF^Œ³oά'~‹ ”ΕŒ±…Mεžu~/œZ5’N΄N²ΟisΏb‚Ύ}Κΐ|m³4ΪΩ™mα £«}f�­μΈΑfluόšκ{‡ Δ!>Σ&ΎΒ2ό*ΐ­ύ'ΐΓBδ―ζ€M= `Ζ>kΝZ#Λ6¬3θtυw|zΗ΅4p Ν½ΙςPώ=\±†:κώήσθt™*κœBΞdœoυŒg5±SΏ{ξžς¬Κ€›ΝΥ žu“ XΘθΠ‡€œ ωΪ­›ΰ€mπΎ=ακ Χ;τ k¦ν4θS8σ}vvΫDv›€FΓχV†μ³·–dά€|4z‚` mž-βzιώϊbϊuκT0χΣΤ―ž9oΐζ…2qυ2šuφ^ϊώLEc -;U"dΓίρ7ΉœΓ‚?3ψ­M΅<›% Gœ¦iμΑΪΓΎ.-4Α―³LΕμ½™zY.ΘΠ!ΐ±ϋΔc±"( >Τ?>«eM™>β7Όΐώ –Ή˜D‘Uΰ}ψ™ω†kό1ΟdΠ(σν„@SΚώyn)ΝC·Σ [‰„¦φφ`plF A2’υ5eΪΊοΝ4oμ¦� e0Ω§-ό³βσ09τZ¦ΤΕ{ΨΚoΜΪ OdgWŒd€―$IŽχ`Α²»υςuX΅–R€/ ž’‘ΤXWΟ^β~aV’48†ΑΣΠΨ[ΉF»6Y·΄­Ÿw%½χ£χ"™b η :έώ]ϊν2«Ό*‰iζζΖ°Ω‹‘―,WRξ–OΏ©<)ίΣΣϊ�ΟΨμ»OžΐœbΪY "Ξ³ϊ5ΚOx^ΛΚ΄1•°G,#VJL‹X*nΒJΏΚ„ŒΊΣ¦³φΐ©”5Δf Ί tΘH<ΓΖκwΪWΒr:Λfχ‰Τaž_Y#zdyθC–=ƒEρŒ£'τ“!½Γši§‘h/‘ΌΌ&ηVύ¦ŸƒŠ‰Ž½B ζg^PΐQf‚ηy~–’Ψ6œ7± ažA_FΐΒ~M‹SσιΕ“'ΕΛ “/umŒ=ό“?ϋw–ΡσψΏ�ڌί~|Ύ7�λ�n―fvro||όξξδ$-!ff‡νΨ‚Ω`0₯cεW3ΖΡIίCȁέPΰ9eex »ΏλX…ΓΒaVΡσg .†ΐΰC'HΐDΗΐ Gγο…K{6…�ΪηώΧVpτVX#i‹ΉΤ荃<Ο‡1²”Ζ%ξυφ@[f‡x ›πMOΟ†SΎΆAπc'kY6ΟΜΩrφχZ(˜±'χΉ'Q €Χή†ς=ΠFΐ•c—κ@ξƒ %έ ₯mVPυ蚸>κ"ώπ\:ΧN‡Φ5ΥΉΧν6‹(²/ `9Ζ6r ς“²ηWŸXYkΙΌ_Y(6φΤι³οAYG38ήE~QEzςπQΊϋΩcbrΡ9sa¨΄QHΠ·‡“ηވ’ςΠ\#3θΦνJ-+ � ™m�‰ ΗΑ‘Mΰω!Βΰς=ΖΟ2… >Wθq°ΒΧcδ^§BΪ›ΖŽΔ>;θ3°οά»7 Q�ΞΚΆcoGχ‹C'·%Ν’ Ÿ8[(b3ζ*n)Qzg;Jm οήϋιϋτυ€�9‰$ƒΰθ5ΟΣ<% \w` '½zηNzσν·I§ι2A»ΐ¨ΞΏ`ƒχcέp>ϊΝqj15‚}P–€¨κπΪ1ίυ΅~ΪGx9bΦζ fprpds`΄χ_J―}ρ i‹i$�ςOώΊh+žσΛ_ωZzυΥΧhLφ†ΛK!ύΡή$—ΌŒ:Ζ3¦~πk8Όg€όήυD.‚l zω� k‚μq††‡ΣΐεΛP2+SMτ@Ÿ±-mmPΙΪγ΄Y»ξ”eϊ\J£Ž‹Ο‹Σ«όΛ€ίςοΙgΖ΅ŽuΈtωjzιυ;8”ϊΜΟ“ΔB—β¨ΙάΠρ’qaω…ŽR54hkWΥ%Ρ,{/rύ”ϋΤ]—‘‚šΜOyܐm3Ÿίησ{νΣ:”{.³Ό�ε<ϋ5ϋW�\M/Ώό ₯b€Ρ4ΆΟE#ΆNΰ,²Ρ›κJν&A{š ¨.TaΜΗ>VΑ|1ΫηψΥBQΨC…¬•ϊ[·€K5ΫφΈ‘΅!π’5+Ξυ˜ΦΓΖιZzA@RσωgΚΊ~’C½*ξΩQ”s”ωX2cΏšω•εpB³2#3X ¬«Šη&@.ή_9PFΒ]#ΛͺΤ{Α²β2eβ5θw°‘_z^€άlr^lZͺ=6P 8`Ά₯9\Η);­ *ΙΒπzŽslζό·Π;duώπΡ£τΰρΣ΄@Ωΐ`�naϊΡ{ Ϋ±?ΗP΅ιΙc‡¬ ͺ¨…Θδn˜i³μJnΙ–ΟdΰΥ@©SΎOi†―έ#―Σ�΄i±‹΅ΰΤ{ΧΑ>N‚#ΪOη‡69t$?ίD�―‘©,Έ3λ£|hΓχ°σϋ؊Ζ’y•εN€5 (‘sYcf+π™,Ν”J­,M9qO|vƒAΏ„€TΫ‘•cΰ² τπόɞ<ΦA:X/‚03αžϋμΜΛ`4(…Α§=Ό§=ΦΔsθλeπE° ΄4ΐΙ6JF&9‹€©Ωžν‘½!’~ŽεCκ6 žϊK» €~„Όψ>ϊ1Κ³rxΞyYδΌkίCW°6Φ„WUΧ±ογΣ†ŠΪwK;CίσLfr=Ϋfͺ,±Yͺε έ™oι- άΉŽ6«nν΅Αd–ΐΠ’ψ?oια°υ°};°- λaΚΤΧΰ‡`G°ι+GiŽδΦόςt$ ΘHΫB;>!xeΓ,‰υΩ|vύΑΏ ΨLCAτŒ‡Nζuʌοοži―Υή―€Ύe¦φΜP?mΓΘ\`JΥ½ΔΤ­­ύa›e£˜ (&ΡvψΉύu­λκ¨uG^Η'_°—k܏>QCMsΊzιVΊrγ&ώΫ0ΆΕ}Α0Ήi~aΏ“­(ӘZΒη·lŒq€ OFžP�ήά™fό�ώ§?£xP21ΦΤ$†~8s$F’Ώzi—D>Š2θ~Ϊέ_ noYž!e\ΏK™Φ^κχΊ&8θc·’wΨηh Μrι™ΡΣΣ‡ύι i‹/ΓΙ²Rέ‘z`!sBCŽ ΤϞ>MŸ}ό1εγ¬q>Ο σ²Ή1£œwφY΄/Θ)l‰]&}_δCΣO7N²ΩxτL@Ύj`j–Α€ΠŽ”βczΊ)ΏΜƒ}»ACΨSϊ°˜”³ΌEF–Lžau‡:Ισͺ_¬ŽΦδ±9O»fυ °Z”m$&­}\•›{Τϊϊλo|οΫ�τ„Vϊ«ύΑJώφγbώυ·Ώ•Ύώ₯Ά>yϊτrŠ‹σK  qV *μmσ›qδ™©ΜΓκ•"Lg(9Ή—:΄Ёdu··₯«Cƒ4,ιOƒ½8Ζ8ƒ8»ϋRϊv’nπ>θ%)EΨ 4ΩΑ,§Εa3*Ρb”ΚαΙ.‚‹3ΐΟΦ )Lub 'QrG(GΉp("‡ΖΖξ@5hEMGβ=:’Ζ¨‘›ZΨH�φ—ξ>ƒ&DΖ‰ςΰVΩ˜Π< ΩŒŸ4oλ«ΠΏ<›Ν£p©Λl¦Λld48”ΦͺG† …§s©PΔSxŒufψ/k jΚ'‡L'mΗΧ&K* ΏŸΎRšœ‡ΣηŽf6|/dβΑ•ΎlŠΘˆaˆu²p|ΜZkΤ­ά'€(cD2kΪ·³»•�\Ύ#’%œπ‰‰q:2σ\{jr>MNPσŠ\W+ —R’ηcΠ³ Παψ‰ϊž².άA8Œϊ*LαQΣ40”ϊŠͺktΨPLμ8g…ΘŒ]‹›Z»ω{&JΟ΅Π`jU6:cΡ e₯γjν²Ώ8�π\λ|šY§yŸ‚5_�‰Žƒυ‰φ1 ‹ο!Ο‚Ρ6`9μ°Ϋ�Ν¦€αϋΌ‹dέlΈΕ³b r«ΣίύπΗL™ηZ”m°G�Fϋ.!SΘo9ϋδ=ΚΒ‘R'm™9CΘΖ6TiKFTςmΞw°6…ΌA΅[ΓivχΣ΄“Γ1Jη;XvP™AΊb�tΈ«λ)?€ŽΫΪΡ Υ­9ΥΰdW}:Η|‘­«Δα­i¨%„Κ Κή0gφR‡Q€[ΔΩ M9ΩΌκ†Jφ…žέ­μ9ƐL`)₯ žΡΧl’Σ5*kaκVšEb¬ΡΤPD)Ζ\GΣLfόی›΅2` zΓIDΎ ŒΛ©.½’†ό³\ρΊrΦJτΊšlN TΓΚ �ΏΚœig»“5oPΫ%³SJ€ζX(KΖf–ΈNR{υ—τ@m­P€±ςLy†Μ΄ιΤΫΫ£ΈΌΩΡ4x"1p�2ΰf?+«h"uηeδό)¬€ΦΤ}ιRj ΄©‘ŽŠFZGς™#Yg¦ *J–S;r=AͺσμKp»;Ϊ�₯‘ΎtνΖev³]ις•kιζK7ΰχ�{?y?τYCs}d+w:‡z#σg@(;JΛ Sύj―ƒbιŽ�ώ"[ˆσn =u„₯]Εdkx�"Γf˜=[8Ϊ§Ό�υα«ι«_ώjz1G―Κ±~όο~4{Ου!†\gΌ„Œ¨΄Pu‘τj3:φ\|ξP„«Ζ›|ηR 1D‰Ζ«ΜτngξΆ ©Ξμ_1ŽU#Αs3ςΊ…ƒΰώV ζ±Ξ:φ_±žύ9,ˆ3λΉ)Σ±.G?Τp­|ξ­g7]?xu(]½z%ΐ°Αα+dOpΠ™Εm/AΘU(΅‡ΥηΉΩΈ,ƒͺΌ@ŽRBμMF6ΘQΰψ9οA28tκŒYΑ©lόžMώμΈΆ‘4rΩHΉηPtuƏΘj΅υ΄ΆGc1kΎGGΒ4YEΏιθž₯yΐY& 3ΥKySΞc0ΒΑ«9«₯%<+Žu5ΩAAmοϋœ€ωδάώgι�εkιΚΝΫ€ΰm”`\P†TΗZιŒΪΛ@56φ@f…Οm£ΎΞk{KκΗΟ€9fy ²œ¦„τ�QΊσ֝4ΓD‘#Ψ;κNŸ hω*޲4ε%ˆuSŸδν@Ώg±‘CΟaΗ 8ͺ΄-2(3π”•bߐ3φήr¦VX9‡°ΘŽ`Φ ¬ 4nk1αυPŒϋ: Š`Ξaλ‡œ^ΓΨ֝΅%ΑΒ»χ>%=HΏσΞ—£Ω/ώΫ·n₯©Y)ΕP«‘‚φ&9ηω󸄍5bUY3©Κ2\\»°5Θ;Ρhٝ0›ςa<Μ°FΫ°ΡG‚Αδeatώ‚$ )[#dω2 ͺŽψˆ²ΦΟI6ό˜ϋΒρg…­Evt¦Ÿκ-' φμ4fz*Ω\X{»Ηkԝ‚Ι–ͺŸ€a—*λHΠ¬žΥφ 4yΚ‚š>=NHPDΐL2d9€pΊ½† ΔdαΥΰσ@άoΖp“=<”ε1žmνγ)ς˜sΆΜπrζωίΫf—$mψμJόΨ?0ˆΟUλδœW&‚9Θ³(3ΞfW« œΝδ R8’Ρ5ΈmίΨgTΰΖbŒσKΉόŽ=—Άo_ ΦΫΔχ‚fŽp•™©%;Hύ―>ӎ›Ψΰφϋ_�{Χ‘ ŽΥG„4ψ  Βΐoσί‰6qεR)ڈΨp(!H”uΊ‹_›˜|`ζWΦ@u1ϊDT†^€ˆ^›Ev ΙλΙγDo³^X&�―™εεΗ±ό'ώΞΜ�―UξšRώ²Ηž/ΣƒΚΖΩΕψ²9$ώζ`ν¬¬Ι~i„9ι=lα›ΤΨσΜ«k)Υ5Α ΛΔ„Šξ44ύ±qšDJΠΨ―�\Φ’¬Τ=ό'Οβμ"ϋƒΜlΓφ"bH€4΄aτϊ³) &€ΡοJΗΖβ>ίΔδ Ά]ΏΜ;+pVˆκδ.Ο‚=GΤ;ʌg–wη>a˜θZΒ¨Ώ—ΗΩ6ιT ;m2;χŒwυ _zύ΅Τέ?ΘY£Τ_+σ³ι!„�?8ΐͺ>J;Δι…όΦΒ oeͺΘx.…5}€oΈE¦½Φ±#1ŸΦ/3ήϋ„υqJΧύ₯NρEΟ`ΟΘ.Ρ��— f²(ΫΨg΅όGpIO²[θxL§™TRκ{h!“ΰ?m‹=΄�–=δψC^ƒ~6�@ί+U¬{1ς’ λ ΌΘ$°<"Ξ…‚†LΘξ(δžCΦ&bέy=}2μΝ#œζXtύƒ •EΞ›‰"ž7χ˜ίƞΙ:4(½±ΎΓxdl³%66^=#Ξ*ΓnŸo₯k·‡ο_�ΒP­π߈€ώJό8ψχΆη|λ?«ϋΩϋ?ύ/ξ~φΩK%ΜxΕ;EY[ EG hlΆF@EιaΟ'°ςπo€‚�£όt>›kλRtž6¨ICƒ}ι:™G΄4‚Κ™±5s|φΠ»`jr6hšΦ\τ*ˆ‡ΎŸ₯Θ&<3(2λt¬ί«6ΐΈ~=υp˜;AH뻆ΘΚφΰΜS� kcr{8W4;q1λ[ιη?ϋ;>ί'Ϋ²Ητ„IΖΐ€Φσ&η B—υ`cu–£ŽΟVe_ΐϋ:MUΔ‘tό‘΄νCœ;ιε,h4�Β¨κ„J+S)E ΕZE7zΦΐξ·f7ΘZ˜±φ@jΐut«P2Ό;Ϋ›΄1«ζ‡t»ιP:φΦ* |Y―ΛΓ—Έ&Ω+ fG{;kΐ>œx΅v6œ©aύ4}³n}διXϊΰg?α_ *¨Y’²«φ58Ϊ‡κΣjΦ .ΚƒωΫ(M ;)σΣc‘ΡΙnΐ t¨¬Δ™ xi Ψ­'Έ•aŸ@ΜΕΤHθXθΜιpκȐhΜƒΖ‹C!xλ‰AΥXϊχ:Ν^@₯Ž u4°₯·!QJ*u~WŒΦB&ΌξΨ³§τ² 6vt&}ψ“ŸΕˆι)Œ$Ωy2œz'H”c@"°`₯\)›δ:Yq [ΠΔxx Έz³‰άϋκς2tΖ9φ†N 체aŸΙŒ\y ύΘ�ΰ|™]w�Έΰ±μτ/3?ΦvΛ<― X΄I”ΰ@™™ΔJ‚M)ΕRΣwΈ₯•ΧΤ7U¦›7―pfhφ7H'aΚZ&''0 ΤΤ‘UΧΦςχ·ΙΈ_ΎtΪύ3&]}c|#s­ηηfγμ[Ίΰz‹x›­‰, rHπ"¨–ΙfvŽΝ�˜†“ΖήζpFΜVI“«"ΛZM@_Κ|δγ@Ά2Υ ₯½ ‡€š@} csχΑΗΣ©§₯“η,ZIσRΞΝ4¬ΞH»ϊCέT ΐ`yŽ ίW}ΣΠXΓ€ς¬ΦΰΝγLΝΓ ˜[˜’β°cήL7οΌJ}ξ%fΖ?MŸ|ς1Žπ,ϋI%Φvttκ驪χο!χQœϋ]ξA§β€ύ�AοIΗΌ~ε{­₯ξ™ι)œ-Νr :L³W 8ΨoΌωNκιλK£0’ΤΓ+Έ€ξ°‘œe+ΞSά& ΥΩ―F6,GHtύΜ€λ$W ²4·Τ^½ΞΦί~YΩK�αΣ,μ’ώž>j„q’pm’wŽs`@βΩπΡ±³ΣΏ>„ϋι:F€δQΓ9“Yΰ^sL)½ †φdm²ηΠ&-4ŠU·•£‹"HC-Α8E�«‘!υγΑ£Y¨]τΉτpYf†aά”mcΨ<—ϋ_Šyυ·θCq+τ*7”._Ώ‘FγˆΑ2©Cf€ƒ–S+/5“Π°IΦ {ΞzΛf0{/H+k)@Jυ0ίgΐΩ-Ξ±kXJΰαY6K$€gˆ%εΣΰ€‡mοxηŒ‘^ν5ι:ΣU΄eȀΏeiUΨKƒ Χ��χžΕ2ΞΈ}b›Θ\54IΑΗΙk�γ{ kλΠΠkμ“@L-ηΎgh8κ[e–¬�� £©k…BΜR‡>³„Ι’A­� ϋVLΐ›λτžLŒςŸό“°»8η Œ(œ%#ίΦց#}ƒΡiΫάsCϊψΡ}‚χfnχγ8S&ƒ+Π¬ QoͺK΅;Ϊ ƒ0ŸMΊͺA¨{£L όΤC¨Ό%Ο›₯c*-KΝ€#νmΑΖ8b­΄•εαK—Xwλf‘–¨ ₯ψ΅―₯‰©)~ωι΅;―§Χ^}•žCσ0ήψ2β{=γΝ8Γ”|-―Πδ‹ e• ^ 2iΟ=υ³λ .jœ΅A²iν§Άέώ?ϊ7[;0νœ^TGΠΫ€#^†~sLvU€” !SœήΫ΅0¨Ρx^²OΨ ΘΈησβΓ@PyςηϊIEμ»UΟ–?†� ’‡4`ωeΦΆ˜2βσ­Q^Ά Λ³ Ή*‘i£%Ž:�φ ¨Ηx6΅₯Ω‡@-Α.�Τ hϋ‡ eXšψ[χΐ籉€v+³«&5μiEΟ΅c΅kNαρωlΆθ¨?j •wp_Ύrΰj(zOŒ*;N 0γο½yž Φd₯ «—erαCySOMψΎ—r‘οδ½c SΌŽDΣΆSΖƒΙ³£6ξφ ΩΗ"&{p―‚f6€ΤπΓu7«κ97Ρ >Θ~ΘΔ{θoj«Ν\k«όˆο9lφΘόήlΏB7 ½w-žΣ0œfU\žς錌ν6 ‚›³gθ9™$6†,†&i²Νηu} μG…Ÿc™„e—²Β Ί΅‚gmkkO Œ^όΰΗίe ΩC@Π 4�,Ο!«0SΈg{UTΧΡ›BΊ?²Z@―+χͺ›Ή/�ά֊οάΖχ4Jvš<&Κ3œ”€T˜cEkp‘d‹Μ‰Δ™ύ–κkS}SFu>μ�d@©Ϋ˜M'8§‹sΣόIAjlλ‹lΛςΖJΚEAν ,?%Λ~RJGWΠٝœ΄²cΗbξ#ο¬qτU 4wžY›�˜Ιώjζ@ͺN–TΌ3g.χsΔasά�)λγψ©PМ* ’υ‹¬H½ί€Εβ:�­ΞŒΤ¨εU‚vSGΎq�plcγέ\θΤqŸω4=1Ryj|’V˜W@r‹fΦίΫ1ά–+«3ilμ)]΅@ίZ€IΞN™υŒ¦?Ό ƒcΠ’BMvԜoΉ2Ϋ%“n-ΥαώkQρ$$; %ΪΙΔ‹VΨMdi* Xλ™Η ΣT"£8 ±Όq‘u7 ΡίqŒά›J?HηYέ&ΠγΥΥ:ᜠΧM½γυ 4}²‘]=ǞY�οkυ ԍdΪθΜΟ’•iΟK SΨ”Όώ„@CΐU@ξbJ’¬DϚΑ²ϋαΧ¬+=oπQ ±QΑΠό<8±7Κ±χΕ=:Ρ!&*p ζΩb­8�š4Yfό8’&Ϊa?τε§[Ě9Α§p0ΐKJVΡ+ 3αο\ψŒϊ6‚.κΟ°Šk$ Ί}δσ $ψ3Y©f{½WK[ͺ˜žas^{p8žΟ~C5θ’b^׌-β™•cž!pή«e‰Ό-ΟHžYφj<?T,QΠ±”!€.¦σoLndM›3¦Ώb&YίD`W0«„³+˜@@Π~ΐϋλ3νά-Ν/α£RR‹΅B0Ύƒ-)@“XYΫΜ{©o3&£vUϋιύν€*ΑrpΑω0σn©‚ ρq¦ΐŽΩΜΓ—ωδΙhšaέgWhHŽ―ΣΩΩη¦�Π{~…Œ‘|dK_z“Μxdκ[)¨ΆΎΎ›Vi ŽΟb©EΩω]ΨN 2y·_8Ι”,Ω+6²΅―ƒε{$[ΚxO“Lφ8SΖ-?Τ'U>§)ž˜œη:dœIBΩ„PΖ…²©Ο~•%€z‘ž± ΞΏεpξΙ6ΐ„rcV]�£Œυwτ•ΥYž'KDΨ²qͺ[qF'^Œ2ωλiάΟυΫwΠ;έY’LwCcGvΩgcmΣ €φυΞΫ_ˆ‰i³“γ°&fθqΐ½/N±ξ”uς{ Γ�Λ(ΧFοΥΤ6°ΣΏΠ›Ϊ™½-κ6lH5z© ͺ4ΊΦ6vΙ&沎‚yΔωΤΦw°™m ΐΉ nWW[κξnO]=€š”ι s]=ψ-ψϊy2::Zπ»νύ!(*‹PΏππVY²,Jπƒ£οi’ΐXν‚Y陀q$ͺΊ*φŽΧψz~cΗ8«›ψežxΎ<'ΖzξG8ΐ~dθ2&s\=«=ŒτpτγΨxΓΟ=€‘χΆo}εo�φσηΏ�lΥo?\o}λ[Ήώδ{_y�οτŸζAΆEΙ“)²9I0”ŒΨΜ› ^…i€'ή`36#iiΓ ‡†ΚŒgyEvΠu4#ύwŠ ‚Bl=χΟρ!ŠE ‘Σ¨αRZUΨQγŽΠz(–φΰbιpBwΘ|ΡU ²εΤ‹8–06§ŒΓ%‚ ":M]χς³tδ)ηnϊδ.hκg#ΡoΖΑΉω%‘~ηs+ν"~: R¬5,*5Ρν*LKQΖrΦAΤ\Egτ˜@UŠΆŒ-¬MMΠсψυττ@�―',€ ŽΟ©²ZΕωQ•B/*θ}d΅«™‘0£$"ξ!u]μξ]šY;λ\'΅…JT% ½―)΄¨εγΩΊqΐ―_»†£Ε™‹XcdΏ‚©™)z`ΰgVYOEκiu€νhΖΞ:HΫX/�o€σν«€O0H° Κ:Ϊ[κ�ε«ύ0Mκ™ζΐΌ_ισμ?q_ι"³gΦOD}[‡˜λI]Τ@ˆG$2όά&N[fYσ"‘h~Ωu@ΫΔ>ΨLH6Œλjp§²τ{;TλΨd G~Pσ6p2₯η™υ9ŸžY!γΎ–~φ Ζmž—£Œ;._Nύ/ߎ�eγΓ§rΤιρ~½� „rαޘνŽ]`νόw88Z³Σ“ιώ§Γ4 “Θ^οΥZεt8Μ…αŒ–DΆφPΧΩ€€i’<φ±XELjf§Ζ†_c2rΙΖcΜ‚j–C‘ρΈΚ=Χΐ ΨέΫ"{M JΌ»»;œ:3Έ5υΥιϊιΚΠUΚVͺ)fߊh|Ɉ’uƒΗ”ξΌω* Η"υ“«Œ NΧ^z™¦tΓd/E½ρ1ΖH‡reqŽΧφαTٚέːvXG"Θͺ`JHt¬[ΆW�[Κaž2³‚ΟvΚ‹ΚpbΚ ŠσpΪβϋ―\J]υ5ΦπΠY£νλ•·ήξ^lvEvί€ΉEƒfΉ@?ΑS/†U£·†sΆ΄„L£»tNέŽ,A=A1η²―Ώ=ύα~“`°;=#pΙηΜ�ίώo�wΎχ—t“&‡½t‡FlCΓΓ¬5¨8£�±ιζ¦θΌœnΧoέ¦α6R :Δκ% $Ÿ<}œžO=ž Φ½ ά nΝ“ω©5°‰C¨.l˜°œ€―§ £εΑΚ\œ{ Τ€ΧΔyVό4cnVD:tœœέ]@Ή%œ„>59™~όޏ�“ΡGP†/₯―|υχtxΘ±‡ήΝ{u &'ΟΌρΚk8JK8sfΘ΅΄lY:γπ χ+ΛpΘY#GΦΓλμ’1Vο¬ ’G,1ΠͺdΝ”aƒχήΑ‘¨+•Q₯~rOω-•L‘‘Μ­j@ΰ��|‚ΎLolΐxΌ:L¦…ŽνeŒΑEηH!ΦΩ@Ζ>»ϋYΊ{¦ϋΚ mΤΣvϊ[dώΘσ>Ϋ»Μ¨fM*Κ£–eh•Α"φIΐ κ?9Ϋ~¨‹Υ£t(·ΟG'gηκυ›° �£`p]»B£Χ~@b2JΪ!‚θ‘Ÿ@ ŒdΐτΠYtbCϋl!ύ4t΄N:l΅•JzΠ‘υ”ŒCζK‘υφήtσν7™>s•,ϋ Άχ8 t –1δγ€π,-.:‘gθbd9—lΨ΅Ϋ·ψ»α`²¬ζ²Ώ‚Ϊ»‡Ϋ4Cόrή“Cz.υGω5βΓθ‹�ŽŽt“ΜœγŸ—χ$ίO³^Οη0Έπυϊ}Ω.ηΘ¬¬~@L‰ͺ(Imνa?½ω1Φ$φu&Φ’Ω’5¦ξ’ ήzκ·h?سf�³ss‘ρŽ΅CODcjD�QgLtβμΔ$ PδLί¨€†^Z=e?Δ¨¬)ΆS€{Χ/ˆ=ζ=΄ρΎˆπ<ά Kχ£oa‰€μ}“ D†μ �α: ςΔ5I°aΔο{ψ;"φZΠ?¬Ζ–553¨ι!ΌΙκΒ,Ά’>Ssk°~`{q½=ŠΊ₯~kKP O·N’Η¦z‚HhψmlΰͺOa#\Λ"dΊ €δΠ0ΌΈ€ °›ύ‚A9NΐΜζσώœΛCsc}Λl~&HεxΧ"τΩβ giY#{r'ΨΚ2Τ2%›Gv :–ύPoλγν„€₯άoxΖ•S„+˜H“γγLΌgdα=›�\Ή‚Oσ":”Lϊϊ2ϋΘ{ sž›LΛΚͺ π?>Έ{–Ζ L±Fc°x^Αϋ&€ͺͺΪ�»‡οešΘ€Ί―–kΨ-³η–ΉF΅μΓρζFξ›~pψe;$Mφ`&δΰGgΰσLλ€ν―_•aγ�-cΧήnξο.’η"Cό‘ϊP�N! ΜF(*qΥΓό„ΏWŽΈUq±1”ldlužθϊW_ΎόΥΫιώˆW�bpϋΏϊpμdωŸ�“΄·ΎΆύ…©ωω¦9k~NwŽp"F…Δb`ΞLΊ¨™^2²ΘY…ΑœΝ5ΊN΄!،‹C©zΈΝΊΫ)ωΑ㇩‰Ž¦Ž…[‚‚9Nc™h€¨AFξΌΆ‚jfΚ>Žϊ±&(Ί§£ΰ« ’’[8΄YGΩι(Z»€βyψω ζͺR‚zϊνΏϊ^’[λό6”ΰ‘1ϊ‘σ1 ˆ°Κ?v‘ΣooQ›e† ΓΟί‡ρη`�’-”’c@`ΞY΅ Qν@ΰ8”"woj�Θnθ:’N4Τ‰u‘kBqΜ£L4:MΝΝΠϊZ85œ>€o†f;Ξ‰•²$zoΩƒΐ‹FU΄_…λ‘VQdθ{v&γΔΟ½'χD ¦ϋ’m4θ(9΄a§›Cϊ jΩΡYTis:ςΓdσΖΖ‡ΙΔ’ŒEΩWGΘΩ,Κ½‹Pd#σ‰‘Q‰KΆ›Ώχq eκLjΧβΫ±c8₯(J²]EΌ_ΜRš�Α@IDATF.jqώ]7΄Ÿ644»δΘGΧZκ‘?ό’>\CmΠζC>?ϊ&dΓ†”;ƒqΛ# R͌ς…ŸI-₯«+€ƒΖέ{5Γ 2¬’—jZΘ5² ΙZŽ3RθA:έ-oοJ›Ωιxw'YΏ�Β4ΰή·Qp@·Ϋ·λμΟ•5=)ivŸaDhOOμή'ι<|?Πθ9œ}3€,2χσg§jηρ¦Vhζ΅aά<#>“(PWN°δg1²δXίoO'‡Œ‘\μΉc’ΚζjpL υENγ΅ �SYsηλΜθΨ­½’χ6Έθ£αIΊ}γ-‚™ρΙK—aXPηkfΧ[°ΗΏΏ�ωντ“7ή Π›K+4Η΄L§ z¨]Έ₯#š©Σα�`αJ‡¬D‡οxNχ­3§ŸXHV¨†ΰ³s C¨T€@τΙρ‹g › •]N—ΖNΠ­œB'…8Ši‰υnΕ§~³ήgηΪ6G³9Υ:™kΦΝΠι”ΊGξ;π_¬‘³Ω P]«Ρ©Ρ4Α|η…™…΄Η8XΓαΗ1Ήϊ…«Πζ.ΔωΊ�ψ>ϊ₯™]Mο½υ&#Βϊ8KœνζΤCΔ¦sƒ}=ιƒwgχqg'!ΰ Ο²ΫΥΩ‚½5ž‘€@=:OΐύώΟήNχoέ$c4‹ˆbYO#zβςΥ—ΣτΔΩ€ ­Y0PέΞ7²±ΆŒώͺ£†ό•«―†a7£}ω�‹¨ΝιΩXΧ} ύc–ΕŘYX0ŽΞP¦48D=.λω»Œ’ό/…‘΄wΈTΞ ώ€rΣ*ΰƒ¬"ΟUΓ~Τ,rΨΘL‡ΒršM²Υ£€³žέ–ξΡ{Γ&lꚎnšα"GΞD¬eŒ£ΰΛYoƒΎKWžΆŠΞt7ύDͺTJ+u0`DPή³Œ*γ:γ#Γ$YΛ>5μލ€�€Zύ§3΄w3—mœ«sgΟθΈ  ,œA›xj'Τ₯69t)Β)Bn=':3φ€‰Μ4ryφΒ3ι2ΐΚΥW―dΡ7π gOπΣLΰ»?}“ή8υxy2Š€$ΫB‡μi£ΐmlVd€©F…@UBΗρ<ΧΪi₯€ίKWRΛ©ι8ΐ—ΰΩ.ς§~¬₯KߍΟ�cΗΑ^‚žJ΅ΘœϋΞ€š§ΟII:δΩ‘q_`΄θ1ΞΚΝ»Ÿ‘“»ΠuΤΛr>wpΨkιΙΡάΪL8B-ϊ†₯ όh2έψμ3g·©Q6{Λ= _#˜ε Œ Ϊgl}ΖΡ ΫΜsJo·4@6LSKηE}IXχ΅Υ… Ϋμρ΅/~ϋΩΤq’;Ψ(΅ddΞΤG―½ςο‘£}σ>5?—†ΗFΣ'·?#œIΞKηϏ nžί™½~�σ8}ϋ{ίIνέQΛύγ·”Ύτκλœυ‚τγ7ί"Γ8ΜϋΛ αAyFŸ%DbƒH†D­9Ώ3{­ŽπEB›œ Ω‚Η±υσ0!υ~=sΪ+3Χή«₯ŽIvLš¨ί2ΰΔΟƒml°ώ‰A»vZ§ώσ5Ϊv»α›…•9)ΰ`@e·xεџϋ:ϋIxv?e¨/L`(ΛκQ4χΒΗˆρ?3Λ2 Τσ±Ό·`BψdΨkύ3u–ΆYb NπΑi–bi‡,‘τ«ΊSΫι‡AŸΆlA3τ›Ψg©ξeθή"JΚ* p-‡i:NΠ€ΝTw©K\_ηί».>―>γ>>€ΟΛε~`ΦΑrση²(m$YVD!M.aΧvakUa7kJiπΙtpBτ 57–nθ ι•Ιˆ1αα}πŽ<‹!Œ’‘‘ Ώ*�›~,―uŸdψόqΟ€ώ­VΔ)‚V�“)3ΐ¦(ΔH‡9Ϋ)pͺ½|(ε[[0·L #87φbΙAΆΆ%³Τ‚Λ&Ζ,G՟qoΤKή»ώ ·FF7€Σ}ϊdΓ8ΝΠ=ΐ.2Žq›Ρ+…°Ÿ΄?2Dl 8-ίχ;�Μ³±–ΑTŽ †-·λύϊίςmθJeiUΉ›%?2Α=£2ΆΤ2LΛsŒ’φV΅�NΥZ§‘‘ KIš ”=±° Π†ΏzΈο¨aδHš―χ5‡”VμlΛ¦ΙψΆŽH6˜W1EOήλ†œ°GΚΎMWQ3ϊ{€θ ίΣ{uO\O¦\Π@Χ2brž**ς#φX[Own\ηό’ΐΐnΩ[h|_ˆGPP†½?θwԈζΪσ”ΘΣΪ΄c2oυ–νί02’―ξΔ’Ξ‚Ύ΅>γ* ΞUdΦoΤNkΚ%p.BVζXχQ &υcqπœ(™ζύ‘WΛ 6aZ^a©šΝa8ښ[Ρ²lͺΎΑτ˜^ξQ†R),9|#­+°Qd¨©ΩbD6W.ßrL± ¨ς°ŠξS=ΥžQΛyL›ΌτCPΙ³!Π:Œ½Ω"fς—bΛƒyΛϊψ!€ν‹2·Ÿϋ\ΚHœ�N#�6~Θ4WΔnqlœοˆΙClWύ±Š+―Ύϊ'�ϊΤ΅‘Έΰ/ψ�αΞύκγι όχίψ_ΆΎϋίΊ<8<ώάγnD3)ιˌ_SύΞ|ͺ@D+©%³T ϊΥq:![Ώ?81Ά5œ π€ „ΪŒŽ·cNFΖ†AΤ ΅γHP‡άύΒ3©˜―“�‡π€M>T$«+άθpS+3ž9œλ*k«©ΫέO#8A·?ΏΛλQJGe ₯ΠΙΠμ•bp yͺ pƒWA£Νξa€BΩ Δμ΅ -1Œšiƒ€@ƒnύΰS ŽF}ηΖϋ΅άΐ€§‘₯ vΣ ΆeD—Kz ϋyΓt69›G¨€ž―ν.ƒ Ϋαφ m”rŒω>k"H±'σ‚u—Β%ˆ`fFqf š•CŒŠAr]ο\Π=ς D¨€θ‘¬£Oκ0�₯”yΤ74’4 �Δτ0ΖKΪρcΝθ΄|‚;�γΈ €pp t"tlΘtb¨rQtΕ€e ―žG(.ηΛΦΰάWΤΧ”BΗ%Σ0ΝλmTƒΑγ>ν!γ`…:―UG+ςQ‚²VyiΨ 2Ζ‘ηˆΔ :)!8RRΉ,p€€Κ ‹Β³σ‰1ΩΑ9*Ζ X#΅OΓΜC@ ŸΫfEfήeΓؐ�� iν’«~`Δ¦hψ36L Œ²Ν)­Kυ'ŸKΗΘ€Wΰ€Hϋ- έCΆe“Ψp,0ΒFd*Hι’Λiδm``Z@;Nεθ}tηΏ“FξχP›NΐˆnΆN΅„¦hεdϊ¬Α.#0*'ΞΗ΅1”(³Τ[Ρu΅½Ξ 5"½O§>8@§eΗ 7—½«f2]ŸλLέέν 5ͺ₯hbZA–υ5“}œ¬― ’ŒΟ.Žž€PoΟCΦ}+2Β:π-dϊϜ £ΧyκTzφΕ‹ΠΰήYƒ‡χ”’I‘‰λ9Λ{Υ8֎m:ΔΡζ rvΘJ‘ωuΤ‘MΙ²ωYŽ”j%‹ŒΓξΡ.A#²ˆT4m²Ϊ8U•-Η�™ηΞ¦.kΙΠ�ΦΛΖB‚>�½d²ΐFrίύιΫσFj>ΦMΗδΦΤ?>Κ9?‚0•ζa‰Xδ@Ν¦αT6Hž]‹³ΘΫ1›¬N4­δΌh„'& OQZLΫ/₯T@PΚ),ˆ�ŽPM7�τ {ό¨&λΞψ¨3gι�pφjq�;oύZϊ$FΉ,έ#[z޲/υΛιΜ™“©9Ÿ£^tld”€u©£ύ$λ—KFu” Ÿdixp8ώπSœ½uJP˜θΐy\­ΰ³ ϊ―τOΈ ΐΟΦN 8_e”δXUK’‚Ώimο½$-ωύςζχ�.=Ήχ9gm2ε±ε0ΑfG7H€‘|μμΡ9\ω.ΙK_Ή–šOuΒ6ΘK]°[Ξ:“N2τb{©�βμ1ΗΉ/T•ℏ?ώ-{”Ύσέο€'8ΝK‚R}Ο£Ύ‡Π,ϋ6Α”™1™7yΨ(™ΚΦeLωΌηk\wΌ"¦εY�TA™IMƒpŽgΡ―«1Ϋ<€Klˆa{ˆP²c£―ΆΞ’ ]©w@Ž εάΙs‘‰,τprΗΏτ:e5•ιoςF&Ψyξό³μYvtoΏχψ1υ�=τΜ¨H�Ρο�Η€΄+ιΡγGφ‚1ˆ7ΑMημ¨?΄ �± \ ²ύ°nY?βω/€3ϜLmM€ξei²2lAΫ ΐφ¦cȎ0ΐ"“ύ,dM̌ζa#8bθnΦ‰ηΡ:4«ΘΊ©Ξe7˜xΡq6Έ1ˆ•=₯J3‹Θ‘Β>p?ψ#f°7Χ™V„ύ4;šΕΧ~_΅έΏΫ¦kόΛΒΩ+υ_5΅σφ²Σ»ΙšR2“ϊσŽΓ4η]‘Kδm³fuY@}…"tŠ ŒαΧΩmέ†©GθœŸ‰gΔΑΟÎF¦—ΐ"‚Ÿυ΅,p]²Hd™N{[μ‘ζ0퉔Γz[a½ΊΜΒ]VΠηxΗ~σoΏH4jοΥu{، #ΛS³ΈΟΦΥ)AΣ θι:l°ΝghΘJ送‰©jJ°  <Ӎ˜ϋf‡ 2q@\�Θ¬οӐ5μ΄ΌDT„Μu{) ιΦ� 0ιJχ΅vˆ!ƒ6…ΰ8ZΌφ#“‘ιW#šAgΌ‘slϊΩ‚ΟZS[ΘΨΝ"lρ&z¦�£ Κe9G…τeΡίAG—£Ÿ"θζ}ΊL 8;‡�œ[ [3‰M9ΐιΓ9 `£›w§ΗΣΨ΅CMJnxΎ‘A'gΝ‘_/ρy°EΪϊV4ΰ)‚Θc1S:œZf`ο3Ά£“Ξβ°WΓƒ£i{έΗ·q] VΑ£X6π3¨άbL°8†‘Cΐ~ΛΦδ–= ¨Γίδrζ7Χρψ/Βϊ~ϋ�X§kΚ.¬W{@*π;�M9ΐμaΛϊ ˜Λ±m–©μ1 ˜αš{ϊ4Pϊ”ωΤΫο‚Μq�ƒγi‹r»iϋρΡq֏ƒψΟ\ΎΜΤƒRϊ%=ΐΦΤΠϋ4ΎπdœΡŽNμ2~ΤΒΎ+ Ιͺε₯)ό ‘Υ°¨N£λπ‰8λ3νAα+ğ>"nΨΰ|σ”Μ¬.QΓ¨Νβ<ΚΕΈG§ΡMΰCΨψ;@%ΦT€KPΌžςLΗ†n³_ϋΖhd{υՏ‚ύ"SΩPŽ·wά+τ:χša&£ο‘)uΦΪŒЈ`Θ€ ΧΥ};$=7Ω€2κ1TZ€αΛ *°qž {_θkλ«Gβyp€΅Ι_ΰtΏ 1ε›Ψ²ΊΚΩ‹—^ώWϊηߝε€ύΒ¨~υΑ ˜e}ώ³7_ύ‹?ύ³�η΄ΜμΩ ƒΈyΟFΒΓι‡ˆ°�–žb#Bξχ’ά­8 'Oœe«p€{Xηι&λ³OιΠ?—ξήΎAΥ<™»„97ې­@‘ύV#ΜCC)ΟR‰Υ ς)ύY°β8‹JpX’8΄ΒxΔ§γ�V0\;Τ‘MŒΝπ9›>zšNMΥ΅H>ξΗ.Ŏ°1s‘Ι€Kg··BΝ3zXφψ?ΞA~)JΙ€@BЦC$• ˆCHφΩ±‡―ΌzωΕX―?5Eέ(ω'LΓhζ�,nSCsš„vΉD-ξ"ΞΥ.‡Έ,‡­8@̘^ΐΊΎDfQCΗϋΙ °ŒAΓ`M‘#™*3α’―’ξ\+cΰEΫΙγhΫΔΗϊΗhˆ†’?ΰp/°KP»· ₯œ―RF°DFCΝs‚TN�eE¨πs1 ΰ$ιΉ ©c-€.Wt•sŸ™‘~"£™LЁ‹ΖΦΜtM΅wΜeΗ‘][€ Β ‘ίϋα΄eΙgΜ€μ1Οφ}τωΠΥ86¦Δ‰ζwŽζ”pμΌ‹‘tΟBƒžj 3ㄬӛΓ`Ο,B±Ζρ9Μ«†J{2κx₯}©0l:;N<ΠΩ&μΏΧ›¦ΖΘ¬€;ήHƒ”3�]­ΩαΙ4ήίΟ¨FNαό—“M3k^Μ>•F(² 8œΦ³«„•5 ŽHΈŽΰ–ΩΎ ¦ψ|Ž NsυŽΏΣ9²Ρ‘τΦ5œGiΨ#z(ΰf}/<σ΅ ΰσΙ­OΠο…Α:θhλLgNœXH½σ³”‹�-ΠΒ]ζω(!K²Η9q-λΘ’{/�ξ?ŒυΊφS°V½λω‹©σς ©•Œ=Aμ1˜6ϊ|pλ  ΐ&ƒ2›—©fΖ8·ε!Χλλσ‘Η ht4¬λƒΑ³ ΨΌJζw0Ιq}K8q»8V \_`τΞ§ΧcVΈ™ ¨›[[Z)Ι9‹^>–ΎφΥίΖ1·ΟGEΘ΅Œ”ΥeΪ("κΛ}‚΅mœΑ&Φι<,“šγUς­Έ\6ƒνƒ,Λ| 爌Ϊ6@vί£'iθξzLG6( ήΧΥ°oΗšYk�οθΪιρa\01μρΠ `` R]SC°D²©utνG£^V¦kkECMυΒ‹Χ^Dκ&›΅œΖ‘Ÿ€ �c˜™Ώr@‘–Άvjk‹γSΌn y`tθ@_ϊτ€ Οιs”^uuΈό)™ό%Κ@ξήΏŸΎύ·“ΞvœJ_|ω5€_l š@±, ϞVIυˆ6ίχ;FIΒ?ψ‡Ÿή”ϋ±“'YΗΊι0ŒŒ ΐV₯―|ε·£ΞΜ�O–‘:ƈQͺvτiα> „d88₯δζΟι;3p~'Λ° BέoFMDŸCζŽe6υ:KYΡ½‡b B¬ΗΓνΰ4› Ά//ΒΑE7 ’3»q%Ί=J=ώλ_Ύr1ύφΧΎF\ΰ6Ιξq¦Z „iH†εtλπše·΄¦½}€Νt‚‰ΰf(ήγii£6$Η±W�₯εEΪ1ο_}(5\&2«|―ΞQŸ»Φή”ΆO}οYΠΧΦΫcG0ά3βΉ΄Y°g1 ?I*'ΗF~ψ`­Ψ‚�c™φΎ`^; CPΪqwω€mžΏ’2lφΗΎTΈϊιHTR° [m9ƒŒ:Œ)ΆΘ O&ΟΒ§ ŒμŒΰŒcP[Ϋ:BΧ pΝ�lnl|$ΛΚdΘ0# xυQ^s¬λ σύ”oΦ‰νˆCτ²z[ Α³jRbYq€ρ.Β> ©Pp?V$ ڎ8ΗΩ(U*Βφt’ΕeP)=^ ³ΎΚΆώ#>ογ~ۈον‡TAY€ Ž=ά7ΟBμrεΪL8δΛuq�ό½k’μeΨžσ‚uε ’—Žάωžγτ" DTπxj|2ΦDΖe€ΒθF™΅%μYμλ4=6θ!°ΐήΝβ«εΓZ:βηOž €‘ι΅4΅@Ωβ–=΄ΨKtF]cϊ €RC› €Ύ‰Ξ ΰδ¬YvRC Τ1μ­Ύσ4z6SΘ•Yδu|€"�Ή™EX§τΫΩΦηc‰Y―hμΘΧ=~¦˜Ϊ¦ƒωm}TΖωΖ7εYέ?'6d;Ο!§‹Ή¨―ΰΉ`Ε `+ρ ΌžΰƒΎ¬¨ohΎ_œύ]φΐ�?™ sAΉ!ηοdY~lΣΝ Ο>‹ύ£ρ&ςWΟy�-DΟ \{h νGΰ=¨k`Œ„Γvγ}LΞΤ6Ά€˜£)ι@υΫ2Νηρ£θaΓύ ώθΧ©J”�½Θ1:A ϋ†εαΔ{Ž)UœˆΖΊ<ΟΎο6€LφΌœΏΫΓG°1³πόβB°-šZ±KͺUNΫΈZΩSv-#s\λςΒZ°‘iΕΊ²ΎΚΊΝ•}Λ’ZήΫ&αΘ>kcΉ+χΖQ΄ξ™=”œd c ƒ�W$2΅:$,ΆϊIƊ ŽzK 'JψέΣσ¬/IP5«?δάΘ:EοxnJf―½ςλίό�ς/qζ~ρ?~°G‚λ S§�‡φΟώΕΔΘθ)δΑaiV[SJA’η‡Νε<°~Dΰ‡ΰ+PΈUPRi…  —yiΰI?MΏ–SE13d©K[š#σ9‹£"θη6†^Ryͺ&˜Κ!jΏχ~ΪYbΜ–θ₯F‹Ο(wΐ°–Cι %…Chύ”}m8Rb¨@Ω�η@Ξθθδ΄Σζgv>ίΔ1Ϊyv¦k1΄e³f¨>=ΘP΄yv…©¬2_²E((]ϊ‘FP*·θ½θλ|ds)©ΐ™Q™Ψ8σ‘—1`gf'J@³ζw’ �©O[C0ωά…gΩ=άβ±V"Ήf€qz3vν•η}š™v΄^44a=tδέ―λaΥΉυgx£ U¦;»26Έ}@λΔϊϊϋ˜ πqΊyλ6Ζη γCœο™ ž»:υ:{:‹*=•°J[₯`–$"€7ΗQ0fΉPϋTΑ’hnfv;,•™@MΠΡ�ί  ˜Kͺ©Ϋ%K»Θ-λΑ2ο₯χΓ}.’ŠVFЁ„Q�xDΙοY3Λ4²Ϋ° €όΩ„ΕζCAγΣaέpΙbdΠ"²<Νx {“•£žœΜ6εHN0.{fΕnΘιαώAX £ΠΝ‡X―�½λ^4ΟΑy; rFaP•QA3;*S³:Φγε`p|&χΝQt68Tβ΅ά·Ο€²ζOβΓs&x䇣‚ά/žyD‰γh,qΏ]—B˜2‚U ŒΤqKHš J@¬E^‡V$‡άΊVΚΈ²A9Α˜™ΑƒjqΒEœα»χn€‚ηO―ί@FDφά±wΗό;Otσήλ˜υρχΞ#χ4&R-Ÿ�Β§™…1� ¨’Ό ˆσS€aΞCΎͺBΜ?Cπ|,&˜¬`\ΧaXϋ_K θlχ?yπm!›Ψ% ο―T[ϊsηξ=€ (v6Φίζƒq6uΘ‰”UΗι< œ>fΗtœΎς•/Q7έuƒNU(£9ΪηnΣ•ω,�nϊΫο~/]�ΰ:ώ3Ξ-ηkš:ώ>ό0έ»wΟ‡Δ©˜xƒF8³ΞwYτ'τ64ψΐacu3(ƒSγcdlŸVC½ό%ή‡–sΥΦΡA6’†ρLό†ςn³£f@¦ύΰ¨―>€Ϊ9�Ο¬mt�ε!ΊC'bcύƒŒΘ„ ΓΝ™wŒ#³°ΔdͺαXmΈo¨='Σ¨6†γ²+Ε̍A”Μ Ύc >>όρ›i’$Υ`”Π»P}BΘΩΧ Ν­ζηίΨnι}€(­έθŽi‚Œ½tωυ/₯–3Β©Σ‰Ψ !ΨέλΧΣ$Aζ³η/μ�Ο&B>YΡ²Γk€Β³4Z^œdLkG8>Eθ†]2ΎSΠl#{ΒΥ•9#MΫΰ! »`ιE%ηi¨οώ½B:p–‘Ω³žΫd_λa>lSs―κDŒFφΘΡrΓƒγ\Kpσ€μϋ0@ςYΑιύd')΄…υ˜Π~uΌŠ(mΪ‘φw²( =μO}w°+NŒ `a9Іl"ΤSΦWϋ遰'Γ&χ+…vqn‚I.�X�k3A'HΏΆK~ϋεθͺΞ4JŸ^�ςίK ŒΗ˜"γ²8[fvdσεGsΐe@Φ‚Eτ»Ψ ηζόΩσιΪ‹/ΈŸ&π=Ξώ‘—ΏϋwΘΦΘPjmhIΥ¬s7}>όΰ#ξCκΥI―UΧ«� eŸ-!7Λ:š›d½7yΟe&Z86Ά€H›04όω\€$‚ή%ά‹Ž£aηηfYK(νθ;ΟΦΚ4`ω΄Μͺχ̌NrNΚ|Ν9ύnέΎ‘žώ9δ;Θ‹šΠ;Ÿ|ςΐΔkUX5‚ύ|6tρ›?}/έΉ KcjέZΧ’%€ ϊS«kέ±γύ™:C}a‰^Οΐ#S―§ΐΌYžkFΕ΅+—�+/_# nBŸ2Αc‹Yτœύφ½–²*ύ']ΨθΤμ™ΊFΫ:‡kfϊ‘AΗκˆΫΘΝηΝÎD3Ý©sVN `ύ[_“arnΰΨˆQΝ8Ϊv-―¦‘€=kά#'T°aόή .Υα―°}TŒΝΞΒH!€L$LΞΡέΫgFzŸg0΄‡Šžϋ&Ί§€χ5΄4 ’ œη=d3:Ϊ³nΤΪsoΞ`Ϊ{χ½υ?j`‘UΔHΛ$˜E8ν$2Ό·Ο₯‘¨ΝT/λ�( r6ψ62 Ϊ₯θ ΟύΔ{qΞe—°U%κΩjΤeOؘηzώήΰΤgά9δύBφ^ΫΑrj?¬5zςx―2 ,ύHΊν{ΨΗαii‚χ!uί±‘ή›=τΜͺϋUΏFζ “LΟ=˜}>—}M©ν½F ΏΜ.ζδš�e ΧϊΪeX•©λτiΞpV^€JWΐΠyμ·I­Et’Ττ ˜¨ΫθδΨ^‹‹4H%œ…5;Z‚ύ6Γ�‡ΰp~ ŸvOφΝ³΅0/›Ϊj(• &ΏΊ}K#ΐ‰L΅ ψ±ΞZ`& Ψρ Λ£iαΗψ6#£3ψ°k©7 ‹O¦ƒSYlnb-Q¬²’~Ό:B�Λτ=Ρ –Φl 3[ŒΚ ΏŒ§‹˜±w&Π2 Ζρ3XΫΚZ‘¨GΑ<}p}};ΑE–3RRFο·Ν΅6;Λ‰<―²3«Π1‚N)πlρ§Θΰ~ηHΰΐοΖF' |UH<ξ\šπΫζμ:�;[*€η9ΝΘ2ž5| “ ―Ύύ IΖΤΥQ2‰²ΟΗBŒw#vaΚϋ[Šό?wε΅Εgι)Hpf(;π\c·gZ ϋ++Ο’_e―{zΈΧL ς˜ίžι‹ΓΣMž+J–xOΗ/S‚Ϋ�܁Ήςe\$;A€!Uκχ°WŽ–E€}ίδωM>­3έAYLΕ`ύΦτ+ύ½‹χΤ_²,ΚrRΖY�‘%α‹³_[μ…{θ$ΛΩ21 b…\ƒC˜€ŠsΟ= ’Θόdu?#Γžηs­*τXGgΗύ—―½ψνώ?}sΓ²yήζϊγWΐΫσυ―�Σ†ϊ_�ςαΫοΌ*Ν²κ’NcӎΡΕXΗK @j“(Ή@N„ŠΨο €ƒωaΩ4 Ά™ψžρ± M‚‹Σ†±7KhΧWμΖ‚`δ[$kokΓ?νχTY„ͺp kπ©Βˆρs:ή•€½νZ�±Ϊe6kSR\Z»Eδ=.Ωώ E} b5J„z:½eΦ†C#Ϊ$+Έƒc5wά·M9F ΖpΞ‘sXΡOΒ8`gkU<;(Mƒ˜ρρ)hπΣ0 f‚�i°§γ Vv…AΎu‘~­$ϋΑΔθ�σn·X_©yG"«¬%‰¬,‹π›"»`V+*š-γΠλ5ΑΤ°›Ύ‡φ©“RHGVξΑd=5‡ΤH­ct;΅„Sο¬κ=θa�¨Γγ^ΝΪ»ΐΐΦ=D}€Bqε}3 βA4Ik�c$ ΅–ϋd‡J\j˜/λ¬φM^ιf’$dž¨Δ€ιΪπp‘ζ_Kγ€dΓ κUςΚ‘χΰ‡½ d’ˆRβšΔ^H)f[BΑ©X8φ0κ7u¦Βͺ:)ξvτ-& ΕΑXfv,FGmΞQ6°Εj€ξ½χ?IMΑ#@Xގ¬όYΘΩ…1h»ΙL₯ήΟ�¬n&κ δΚ¦T PΞΘFV―‘ϋc*Η™Μ₯9gΞJΝέr0rXHθΌf„PΪ(KƒχΚP―3ΤtξΙZTeΧgw}lΎd·π§£€”oΧάΜͺηOϊψψψhκxΔ™‚NΧΚ‚“ω₯+ΊR§CζΉψΒ«―Σ«£5 I) ˆΩJίί¬«2γΩΦΨXϋ›_ Ψ€‘m@@”‹Σξ¬ιEξ…Γ η:»:‰:—χ?‰³^ΟΤ4ΉQP�{ξ€jώΎˆΞΣ~t=}xγFΠπ«‘Σ,‡=εM`0˜ Ω<FΝ,ŸΞcWw{ϊ�—^Γ±+`ΤΤΞΡ6zh9± f‡r©Ρτ£Ÿόˆ1oC”T€Ÿ|–~φΦ»θ―f¨¦ΦxSσΙήΜ“©UWmhJ'-Pιΰ,NŒ₯Gξ/…3›Ž*\†³JπjO‹jΐœΐ_ΪΚ) ­νm¬£bγΫg‹Οͺr:Y―ξ€ή½PE—£THpΘΊΜmτC>Vvvλ™Υ}‘υ7Kgζω�ΡF ϋ μ†�γϋ�6τLQ^qΊώٍp$€²’ν0σ'«δξΓϋιϋίύλt@gξ2›Jθ‘Ε”Ήώφ˜€Œ4ΘΙ…±!₯³‘©³;XC9؁m‚ίαΑAκΣ'�ϋo½ +§?=‘–tψφνTƒμη<Ϊ/E&‹`–AχΨΠΟ½ @χ€ Ώ“μh+ςH€.Ewqšsƒ³Βnξ!ίφΰν‘`2ΓYήdZDξlhVFpδΘΚd¨±±)™‘ή†yαzXgν΄Ϊ+cttPzΣΐΧΦΰ‚ΐΪ΄ͺγΤ€'ΆcφŽg{Ÿπ5Λheb!έ|ο# K²t„Pλκka,ŽŽέ�3ΝΊ€ΠΒ‚*G'{φ‘υj�ΛNS »¦©)τφ@6>!k7€s;L‡1ΐ…>€ eΗΟoϋΙΟ~F“΅�γΈA›^αΌ£”τ5‚…ΞΪ‹/½ Š,�S'N†l©pΘx6Κ5‘ρ±Id51ύ¦™ώBιΐώˆυΫΒ.΅Α”p­,ϋ±k½ΆέOƒ\SΩžιv’Χν‚i. .²ŽνΘρIΚ$Ϊ;»Έ—«iŠΰΡ&Όφ#θθ‹DΒ0@Ύς‚άi2Θ=D'­¦�ΰϋΑ.Ι’δζΙCFm� τωgΟ—§Gΐ–bJ}b jOŸ<ΐί1t„φD=1#e Μ—΅!ΘΐΏ0hΠq >†C‡Υμ™ΑŒTgΤBθVb} 3ecηϝ‰>Σ³γΨβ-;t+§KL’@_jΚ8ΫΚ‘grΝΛβηκmυ¬Ίάu2qΛIƟΉ†™δC†Aΰk=σφi²GDe'œ5ότ¨z_™ρu&kd5·4²Ζm©££™ϋΑχΩYRž.^¦)(ώ ’€Ž©Β œ’―ud·νsQίx,JΕτ#ojŽQJƒOPί\Ÿž½τgΛ¦Κd(9ή;‡ΰ©_’Η?›ϋ°6Ω`Β€ΨQΒvV7›ΉΉFΚλy·ψcY‹4xkΌ­}wt±Ν€…ζηsΜΟτ+\Ά‘3cγAPήάEΛcά§°QαCΡŽηqμͺTn™;φBΓV―S Y[W†ΎΖFΐ&3cμT6ž–DΖYE_›ΈάΦOπΣ ³υηΪ5ν«2ο½YNYFΛ`ɟyŸAΑFΪ³F@A½αΤ”8+Ψ›b²ΗΪι²ΎωdμXηaI`“9ͺό^fzίh@Ί6Δλ+²ΚΓΚ]X#ΐ;²o€‚l+tΔ8Ίgnq=-cS—‘υ-nl²GβΩ(`RfZνμSTΚΟμU5:>Θ5f8nn’+?  ΟLΔ'œΛ‰ρEΚ-aθŽ€νΨΫΚq¦œtΓ4€Mθι²/ ΄ν–"¬ΰCΙ(°EΟβkΐ˜4ˆ2žΦΞmΥ?]Y’Ÿˆz„3γΩσΓ)kŽ,ΒN«Νd½;h»›œ  8aήGœ!TύJΆΰ˜]γS₯%Θ?ΰžΠiΨkώK˜ΎN€K²›μId�«ΡΡA·„‰HτT‚qηhr\}RY―«ŒK.…‰ΣΦΥMφŸΎ‚_΅·:•Fz9§” #KˆSΔ–φnΨ ·šΨgΏqll:ϊ Ν(ΫWkvak†Ζ°4„uς„€κγ'ƒψ cόΫ\ήΈΙsZ…�΄!¨'ΒsΰΟSrfκδHF_ΎΉ γe€ί!X±θ₯Ί²Κ΄4³ΐ(G¬φ�²šOς=ΛF™!%)œ;G~;‘‘ onŒ±Ε§gDPH¨D9ζ�‘Mu]kcχΕψCp6bHΦίlκ?υˆ_±ΤK²·KΠ5Υe/\~ρ~ώjη{)}DΏ½οό\BΈψ/θ‡Ούου/ο[φ'�ψ―ΎυΏ�“‚όbϊ€–:^Q%X_υƒ ­π˜5V!hΠ‘%o([”Xζί€ εψθθ)Κωι4†8ΜΔWv Υ1Υ·1ί�Ω/”ΥβΞ9w™ΐ6g„PCfQB΄P(Cλ#jˆPΒυ8Av—ξλ ξ|&υχυ]t$vn%ΐσTμ’¨z³(§ΟœŒ.σ6­ΫEAZ―βUΣ Ϊυ6ƒ[‚ςΚ(7žY%¨αΣ  τTdΔβάFΘύ†ΒDρ9•Βͺ*KΛ=Μθj ER§g‘έ’ΩΎqλσ οr]°’@fΙ.ξαθIjTAEŒ{θψ_8¬ώάϊ=gΦΧ“eΆ«΅†έ Їέρ;.œ…Άxœΐ©%(ŸRοάz΅[άοϊ A«h5χhεσ?₯VYΆ‘azPσˆ‘ƒn“C©¨ΝΌ_9FΌo£˜¬E5lƒ<‚}Ρu ‰HΌ”ΐ»νΝjoF!œ)ƒ ·r \DS-P_i~yu"οCΠ�m³ QKχED{$�ˆZ�ŠΪfz-ΓΨΑ:Y8Ψ,XgMζIzϋιq§/}r}ˆμŸυ_Θ ŽΏ΅ε–%87Ύ…YU™™—[‹c,εΦ&uvmoh>bM-ά‰NΦ΄“n½g ŠaΠ¬-bx¨[ηY”οsΗΨ½–Ή!ΰ‡Ž›Ν΅Μ0zV ήTȞχΟpΘR9ΧΡ ‡…η@Σ€˜�Ι™#“'έ.δ·q›Μ‘ˆoYA”Χ�ΙQVΌ”‹sXYE�WIπκžΨπP*k5Α�γςN€–³0>>2b Y³.Β>11Jνώ`”΄΄vEΠ%XΠΝ³K1ΜtΟ#­…žήΤ�ΐBiΩCε3ηΞ…‘΅‘#ǟ ‡lχiS@λ�\#Ko΄B–άœθ<™.={…q§ €ΜcΔ©e/HX$ΓxH}₯ς#ͺο,s¬ƒk�cγΗύϋxζ5Ξƒ³μΟqZ`žΠƒ`”fIŸέ₯”ŠUσ»ιΖυ[Α*Νe<™€θ­Β½Iwwςpf##Β^’έΞΓϊN„) Ω•“'ϋιΘ8ί£GΞ‰–JuQcπ`FIφ Λtž'&Ζbύ­γ΄β₯C=°¦(α5f²€.!Γ;θΖ}:q{fς8³ΚΜ²γY°g‹έΐ-ΡzΨOž rΗ±ͺ΄;3ΡA Ώ@A΄βj@βu@: }uvQb$kοuϊΜ3LJ ρ2lΦ=Ζ”y�Ψί]‚›Ω© jh{\ΪζΌ‡ά x½ϋ€:oήJ=L―Y›NΩ8RM΅‚šP†¨lβΨσψŽδ*λό„±Ήd>λι·A ˆ>uڝin0ηznR–‘³m_už2ξΤƒΪ�Γ†£tφMχG�ψ€πfΊψμ₯%ΗlΩ»š{XΕΑzς€'œ/Οέ™{O/Ύx5˜:§E̞ »ΡΑC½=iΐ&{3'ύΰ[“–¦—R{wο Π†<εζ‘EΑ–m΄7pv Ž'ȊΫy:²Na#3Α Dtζ€WW2�‡ΰΉ–{λλy”>ϊθ}(¦ƒ4αόIλογ~Z‚‘ΠΪΪΜuG:+ΊCη™p Μ₯W·yζ,zQ­°‰†F†#•epσώ]hή”νέ{HiΝυ`�uv1Y£±)έψτ2ΖΝ`φPΞΠΕ�'α8 ˆ ͺgή  ΛΡ"°`ΪΕι�τ�΅«ιβ ιޜ69�lk¦-΅QίμΛ0qΜb+Ÿκ’YXBθݜγ>xŸιF·ΓO8ΩέΝk:xŸΓ.Κκ{αΕη’μβΞg7ɞ=o πNΫ[ΟϋΘikmΗ‘GΐΠ}F ˎ‰f˜œQXΧJ‘`P§pΨΓAj²ΆM&E&(ΜNιΕ‹ ~™IOύΏϋ΅’GΠuΛθ'&ΩτλάΞ™^žHŠ/!³Μ AٍOƒ Ί,!Ώ’šψ7e(₯2 +Γ‘ˆΡ.κΣΌςκ΅τΚ�€Lσ3užcDƒI)σP6‚™vAͺκΪ’τϊ―½–.ΏψΊ}Dƒ“§N²�§^HΟ_ΎΔt₯«/ΏΜ9>ƒn3ή’ΤΕd‹ ηΟΓ°ͺH³GX�6ml˜‹­1Π–-M?›gBrͺμάΟδΦR›dβF€Ψς={’Έ¦ŽH5{hβΘ€S_Ηών§c©œΎβ©Sη"ΐΡ7 &ΧT& Ϊ] LΦίΜ7Ύž>.Bgb žοa/�M£ΟΖ‡I@0₯c�ζKcIΚM—Ο΅y~ž±§ϊ!²œΊ$pnR#˜œ<“ώ¬`…ϊT Ηύ$υί™¦C†ΒSYρΌOυnό[;Γί:!FH4šΤς,¨+9U”Acή@Ȋγz-νt―I - χW9‹«Œq¬il(EoβΫ5ΆF°.+RŸ6φι>~M6Y|3ςΌςΕ›'Jρuρ‹Χ±YήήΛζ½"Πq•ΘšμUG»οsτŽDOc³Iρ³±€θ¦Α8P†γdξzίψλθ‰-PΆλ�)ο‚$~εΪlAψ/yQΞ O€IMΏd Y#‹΄­–˜€πC_9€8φ„gβφˆ "lβh�*XΨΎ`ϋρπe<‹~hߊX g›)·t€½›ς*φQrkL3�†ύ*'ΡrςτωΤyαΨnσiaτIΪZšα=�š8ΩΔWαkh—ωΛJœx΅…ν]†αœ‡γΤ²Iz*,φμfΡΈΖΛGid˜I^γ2fθ+Ě-Σ΄½€ zɎ-―GΟ©_d\κΝ‘g”YΧQV΅IΧ¦•Χ΄2--γϋe½Δoψk“©�ρ“4^,ΉΓ{`Y‡ &υΟΈΖ'Λ…Ž0¦#–ΰwξ•��₯W‚ο顏’r,#IπUέit™Ω‚Ω&Q=^ίοΡήp²t[#ιΐ94ι¬όXA &{΅57ώρWΏτ›΅Ύ›³^^ώeά/όGF:αoσίι ζ χT²‡τκ#ϋΘαZaD‘ }ΐvzr(Υγψηηr€VQήf Ϊ‰ΘtM‚ΞF…n›^ žΚ_…jγ‹Œ'+ςςίe8y’X˜ Ξ/‡ΟΩΤφΩ4·έ.‘IΩ>Θς!–OΙD>AέAͺΞ±sVqΌΑΞΘ€‚ލπβ˜wq8WΘ†OSΤ…ΝΜbώP°v(?ΒΈ©uDΗu$7θ {ϋΦξŸzH½H‘FΉυΘn©ΖJ0 …:#Πΰ²όϋ#˜€cM ’K4κ™ ͺf=ΰ&=Λd΅Σš΅@6)σύ(_ ,ΓI@Ηΰ`A€yΘ6ώ=VR™]wςρά/%tΰΕι<Β©₯Κ2B"¨N�p™/ Αš l8zΛΪ¨=²l(©π·q khŠΔB*Τztha‚R υTΔΨρp*\χŠ7‹kη˜E₯‘\ΜΤͺMQϋicΖ|žΝΩ΅yttΩY†YRGsK²ξ26DαΤπ € ttΨtj €¬‹]έ'ΣΗξ;λέ†P:‚Tv`/-Ν'X!Fj”5±Škr?[ ϋΦZΥ`ˆζ›ι΅΄ΐυ«m{Žϋe¦.F7―°"Ν±‹0@>όΩ'Τ–Ρov! ‚ͺCΎBV0 PMm6w¬©₯‡βΕ)1“myΆαfkgWτ¨°ƒ―ταžy|rœϊ@\ΐezT47Φγ$Σ΄ζGΪχΒ�l*ζyΓα"`ΦΩ΅ŽΧF@Φ»“|:QX"ž=“…p,`w!ˈRFaσŸkU„3‡½Ž@sŽ}Ά�½’χΑιΨhlž₯AN=ηc™Μα4ΑR AΓ RCΪΚ₯‘‘Αηڎκ:Σ€7o^:Ή‚lΜ6BRMύž΅�³σ4|Δ Ϊ­VE6?+)’#<Οb7βyXŸίΏΪΫ-_X G²€lu)ŽβNΑτ|jκkk�!ί—Π_₯χm¦K}Ε1K:qŒΘΜπΎvΣLτq·pΒe Max jφPΗ> Κκ¦]X3λ«m8LŽ>Υ ε#²Κ‡ ₯rκΉσμyaK¨όμξn νγ›EέaΩ›D™} žΏΔ›Z¦Ž6φ‚ύ" €λ$Λ�p„—M“B·©£bν0œ<χ™‡ΝηqΎ7w39#:CΩdι7(§Πq3QΞ€κo²&6)μοOΗΙJž?ϋ\ϊύ/�hSΊG€Ϊή�NWώ!Φώtε�— @ΗcŒŸ<•Ύ5φΏ₯eάB~Φσψ>Ξ½CX7³‡ωe2^ΘVp6€,šα˜™χ!iΨε8ΧYJYfB¦qΥS-ˆΝ¨pC²&*ύ=Σe@3•χoήΆ%EτΜ¨¨@>8Λ[Ks©[†™ρC'C/ΞΞ;HUυe‚’μώϋRSΛ:X/pνΕ±1tά4«g6Ώ6mΞ-₯ρΎžΤ@’Λ$['Gf­½½½L†¨L ΉΤο2YGΉ9άΖ竍�ΜπΫΣcz|<΅6΅₯φ½οήΝ”M ρ"ΤΦl…>ϊΡϊd»še6=(Šl™ΐ@ο&CœΑ©$«γνΐΪ SπPƍΩ>zιΖϋo§Νη/KxH?ϋΑιIΓAΖΓ�ΨTρΪ@έωቴΜ9^ 40Ёܣ—N~1ΏgίkšRΣω ©ϋτ©Θ dΔΨWμι·~ό½tΦΘvœτ¦―}αKιζʍτζΫo₯��δ?ΓN6€wόfΘ¨ ηgwo±‚ΧΨn|‘ΙT8b PH…κoΦζG?ό>A Αΰ@¨σ―^ΉŠ^ΝβΌN₯ž‘ήtŒδΔ‰6ޟςŸϋŸ£a§ttΠ”σBNHTš‘ΡŽvΑ!™a2θ–&“yΟa]ί~σ&Ώ `Ÿ ΔΆ�_Nό[šbC`v°ζgOœ'S:J—sΚ0Τ₯ΘεΒ#p°O9RΆ~›i@N• ‚+ΎΟΑF’F`Bc.3Ιϊ½ϋά¨%‡epΌ­.lX)¬­3μe{ΦΘΩ΅t§€ ΐrΚη_zΐγ“t€σΌΝΟσ)Ψ†Ι"a‡λ P\¨ΧdKΨΏbΚωΦ ΟΘfͺΫWΥΗ}Π0S!φΈώΔ{mΐΰ,¨“›ηšΠuP’ΩΟ‘vx„Œιάβ D'υΫηBΎdθ·UΦ Λ`ΙΈΥU—XS&τ©SԏΓSŒtΔ_«…‰PNcγRm7+4;2M}|sj€ΉσΆBh γΝQeέc;7ωέμ«#μβ>ΜYςM²Π«|ΪΫG}TŠΏfpZUeφ›†Γ€.~έ³A!λε˜dYxk«d½3Lˆ`š±¬ί&e‡f’υ'œ¦ “Ηr˘NtœJ[σ·ΣΤb?vQή3¬mηέ&~Ϊ[GgaCKΨΏW6 ”(θyŸ\~.˜λχ[ά‹χ–ΞP8b­σy?Cθuτέή¦ύvτo σ°ΟΚ μς8-)m9IΑv%Fz5­Ρ„ΜΆΑ_!―±Ρς6Α€ΐ³έηK‹ρm³vxˆ'θIbΒ’Œ¦�σ0Ϋf³?%€†Ρ θΣΪήΑΩ£Ό±yΜ& ½oBj?Ά&’6gŸλΝ­LαήNηΝΑO:§H“O‚RμυOl(«-?§§6dnEκy2ɚΣ|pE@ΘΖ†…¬©A¦Ωη Π‘φΠGV_ξ£·³±Gτ<»”Είθ§!€μW†Ύ�νΥF—ςGό»€€3τ ώ―ϋSLςΙdΤΩ³'ι±Γ˜έƒΨ֝kL€\:ŽΩr>3α6gβ~L.δ 2mˆl#ΖCΚΜrП{«FΔSΆΟς NΐλΚΣΓ‡}ψ?žiJŸξP’9Ψƒm숳e9ζβΦJzφω—�3/|ύϋ0•5t²Ηeiiψ!=Ϊ&dΘΕ²_Σδ8I¨yJ±ΚQ‰¬δρ,›·uΞψμ2Ά{…r—¬U˜@4ϊ=δμΞ�βS�#”HαΏΫόΨη�OΡM₯°MŽψ~�˜ύΧOž‡APB|vΘΑΗ.ό`υ (K€„§±Kki`”ώΔ_ΫΘΓΔδ$%–φ•’Δ™΅Π―QΧΔZΰΓΨΫΰΘφό% &?ω_ΖO Ÿ”)LΔQ”jXφΆΖΤƒdˆ φ±:‰Γ‹ΔY&U‘šθS%»a~}Αύν?Xξ΄ΣΝΎ"6JΟ#™…ϊΠΎRŽˆ-θŒ�l@IDATδΉμ}ΥΦΪωiΟδΥώ׏=ΒΑϊεψΘh€_Ž{ύwr—Τ“μ��όΏ»;20]‘WPxη~£γDWossλ·kŽΥ}xι…ηί=αΒOAΈ/¬­¬¬‘[‹MΔRJΆ™LλfŸf3ύΉ΅5Ρ }‘ΐ(kDvΛqά€3ι€kΧΘ oQ‹o§hQ\ΗΕΨ€(œ~~–²)C©Zj 5η€ΐɌ­ 8lZ€r3σ.:ίF&-‡ΦΫ7D0C˜Vp>vΈΟ¨Γα~6¬«΄I˜A›ΞΈ=73λ₯oιRΈ Xσ‚ΗΗΰΰ)π5θ\2zεLQ°±„L’υ“"―Φ¦‹ͺ‰p›Ι–'’n͐觠„ΤIε­a°"«L ±Αα“š χt„"VρF`€ΒT™δͺΉ‹ψ7ΙNΦ‘ N₯£{$HgeSΑŒ†υws(α>f>-ˆ€\™΅P§ j‘Γa€n€s’rχΝ0XcΝ·ΤsΒEΆ5\±¬Ιΐί~6?»υωηθœ Ύή#ΠΓ8ρo3σfΚ”S…AE¦”™‘ŒNβ¬"‡κŸΜΩ³φr“‘ƒw�ŸβXσ: %―qKΘΑž²ΖΌuτ °ΓΌu~&^«N"³Žπ=uΒΥΦ&ϊ^Ο1{Ρ}κ$ϋBωΡeψ ϊ,œŽΰΕnηύC=ΘB6LŠ“qζ½.ېξίΎŸ¦qβ₯σoTsφ7pΥ_:ΦMϊ<κΟiθήΧί…3•-²‚�ΝNUžKo½χ ΣΑΐB:Υ}ΐ¦ΐu0ŽΥ€“Y‚c½†“ξΖK™ΦI7X4τs_9²‰λΤϊVΑ ]VϋΜΑδΩΙμς_d~ωΊΑυgι�ΟίX:ΔzΌρo㍳Wdq˜•½Ή2ΟλΡ?€'vR·œΙ3ΏώΚΑQnl;…Ÿb,8Ύ &ν£Σ]sGŽέRχX»έ�ў.α‹‘™jP3CeΩΑ.ηδˆύX[ή"`%+ƒ³˜ΓΩ ά’� ΐΆ³ΟΣp±=Eν+™ο‚mρήy/ χ)b„”ΣA₯?DG—PnπβΘ0AX©έξΏφ/“Ρ&λΕήmrΆ'·ι=αλ€aoSήεάzΜ·¬IυgΡΔžξ±λ'ΰZJΖ΅ b³7™EžηbΦ³›`|`p«�V>[[ΫS/₯°—ž½–^zζυμτδΑ#Si Ϊo?ΞΤYφ&c‹8ŸxΦA'E—X F<„Έ°©žΆΡF›}υ�s”€κ֝ۑQ­δl\)sLPλΒ…ηθΪ] @�‘o€·~ψVϊόζτ€―7¦ΟΎa yφ>Φz†ς>uΪ‰nJ`xfˊ­k0g’Eœν�ούΞίOνM팻}ΐ3ϋe"rN΅ϊξ‡:‰½ ³ΐιKΪƒ ƒž-dΘ³“k¬cφVΩW?443υƒϋxζ™3Ρ#B„~‰α ΞΝβNNΠόΟρyGsG΄εΒ’eΈ πYH°u„Ξ@)hŽCvlΜ,Ο-η\ ΐμϋιAΒ5Ολ.ω8Ω§OŸ&–ε3–}ΚnZ‡ΦξY*§ω]  μ³Ο>Λ/ žbιΑ„ίbΰΡ“žτΰα“7ƒ’Νύ…�ΐsΤ!³2™<Δ–˜Ψ­=‡‹ 8͝ψΔ š3ο‘ύ9¨―g’Β€YΫeωϋl—¬›ZnS‚YΘY6`W€ZTWKC:«pΨ±YΡ¨ΟnνN± ΄ς« κδ»j£ŽμΦvψν™m•NΎŽ­²WU6 ηXr Œ‘$Ι€ίζY5ƒkO•ΪΖnzμΤΈ3z€ΘΑ_Ο ;ί›‘WΏψ<&` n*˜:uˆ�’g •Ο€ώ,―Υ7σg~Sͺΰϊ0Ilύ¦>–έ―αωd=ΈŽκH ΩSωψ·ΚΧ1X³Εψ…°5ΤyΫλ0ΜζVΣτΠTιPf—χΥξλcf£Στ‰l`—‹οΖςSFbΩ�ΐŒύ`ŠΡυ‹ι>e~Nκ8yύBΓn&Ωƒ–ϋ±g·„Ο4\νF)žL­lmΡo VͺεʚMId!³ΪBλβ΅±>΅I™�Nγπf�MΙ‚σω£!)―ε—&δ>‡-F6 9&‘žΉp2΅ΐ¨\`„Ί@οΑΫeτς”Ή>ίσ^–O[B¨oa–\?P;XΔυ;™ŽΥLζ^uΊΈ%Ξ>cWνŸ₯ΏlόΡ ``yMΆί&š##Cι8ky’>?θabŠ<Ψ47H[‹ΣΘ(Ύ=Aσβ"“…Xgυmlσ>eVΛ2‘ΝŠκz|Ξετΰl5zTμα―NSr2‹z¦Œ}vdα θ(Σ>§Œš (ό|›η=†ΚGGΛ Š1ΘŒ 3ΧΟς°IΞόΐύƒή˜³θF¨[ΪΒ rͺ[ϊuf΄•2^]£XWΦE°WΈI€―ΆtJY)ΐ;GΆ-ύΦoώ=^O$b%Ο“2ο8l69ν±~Θ}5` @±Μs'7ΨIΖ5ίβμ=‘Ώb“πύ~―˜δΓxκœΐUΘ7Ό>λό³ιϊ WιΒϊΛρρο=pΰ6}γ΅υ—ϊη3 δΙΕ+ΏρΫΏχϋ�λϊ�ΛούΞούώOϊϊ—ίωΓκμžμμό�ηXίŒc_¬)’&£³žω*m c£Q@xTψQΊ*€Œ3`ΜΑŠ0Fΐ`Ρ&D"ŸΎYF΅₯‘Β- (d•΄4¦NΩ§ ϊΠ‰�3ΖΎΰTΔD”†΅ΠεdΣ9ο(ukΰldC6…/H`6d‘@Θlΐ((ΰϊ‘„ εg§[ι*šΦHG†!Λ€: ` †5χ>››ΫΚ"Xxτθqϊμζ½404NƒJgS?…ZΞ§΅pΗΙ¦4©6CΝeω `γλΙH9“Y꽡Š@^4Mƒ…αˆ&ιτ6žΣΓΞ†JuςΜYΦ hVa γnm½#³Q(:Τφ0Πθg”€ JΗdqv”€p …’[s CΏŠbvήΆ”3ϋQU…iφάuβœ_Jσέχ>NoΎy3ύυwήK·L’Ό1dEu©° ‡΅(C&J*‘ƒΡΩεύ€BΓαuoUͺλήΚά™sηQΎ«ΡXn—{j§>]Ϊ£R 5ΠR'’`ΚΙ‰©θ~Ώˆβ>Ϊb�xnΐΩ`ΦHρ΄Άή έΖ4ŽX2‹b)‚A§ΖKφTl3ω"Γο6+τη*d_ηΊ$I³Tžm©‘)Γitο "ΊαWY?NL’'+ΘF?ΚΉΞΎTa)εkœ=4ι·‚‚>›`‡μεΤΊτ.κα TέΡg›^�μcφΊH¨Œ‹€%%€›dg7Βi&ΰΤyCVŽ({’ςM’8―ΉP+| SΗϊ• Vbwτ‘^έ¦£Žζ’Ε!’= Ÿ—]H}�“‘ΤέHgc�316N£wŸE@PΗJcπ¦sΰ§ηέ gVΫΔ‰γηy:Ü3{>θόΈΈΦθ?mŠ₯l­{NΌgΓ΅ΤxΐΗχ]�·Λ½ξr~Ν¬$Mκ$ΐΪ²Λ~™˜;wnέe]OπœΠk›ψ[xŸέΌEϊ~κΗ°Γ½™K$‡Τ 9A|oυ˜ϋ¬£νGŒ΄7a€dY BNVr@k}λ„³τϊ΅—}5™ίsP˝p–Ζ†Σ‡·>Iέ ­iδQošAgξδΊodW-έ‰χηώ\W{˜ΕTν΅"eSyU«?‘ΤΞ%'¬ΗaΐYf?†FΣοΎΓ+(Ml2s·²°€Ϊg.{- Χ]]€Ήΐ~Xz¦¬KΫε dέιΎΟš-δχ:Wϋ8Rf7|SAj{u˜Ÿ%0–Š|B]xxˆΡŒΘ¦πϊΟΌύγΖΉsΝhKCn‘„ε7Ύφ5š΅.Σc Ÿς„½tζ±· χΛζςM ΙτBθΜ?rœk„ό"Λ €―€�žItƒΜ*εFΗ\ύy„ξς>ΥYκv³ΉS؈‚fχ$ΖΨ’ΠDμ' ΦΏΉ‘z›‘ΙŸΛ1:h}  …ΐ`Gt˜ύΛbΏξΜR[ϊ’cojωLλρΦΘ 2ύ₯―w˜₯—έ„ž]˜#ΰŠ Φ`@{θς¬„Sν=#σεφδQ)η‚τΫλβμΥσ/2…δΕ(Gς>οέ—]АΊ;:qZiβΛΪΤUΦ₯gΟ^`―M·?ΊΗΉΘτ"zύυ_‹΅{rχnœ» <:§κΌ‘Α’_η–8@ΪΈΟΣ'OΡ°²1}σίdϊ #N©Ÿ6ΣΥ«/¦/½ώJzόΰ1η ›ϋ5Xp• ΎΔ§»χκωΥΖ ¬ΫsΑΎ&Κά…υΙΟNϜ= €fγΡτήldΖmy�ώ=ΞΥlΊϊβ•τμΉ³ΡTq™ΐΫΛΦΫ½ήΗ@άs�μΈ›@πž,Ϋiοlη^ΠœkΎ3%0|φI2‡«ΊœΗΧ€._Δ֞LνF/^Ήε–e0΄‚0ξŸzάƊΉ€bΕ°Όb&Π΅EμEsS γxOŽg–³ΔzΨlRY°\TΜE°Ψ–Ό²ΛœŠbB¦  7ΐgήG;Ύ§ŸΒΉ7°*Qg€ �‚κΎ=φ`ΝιF³₯ψ²ήζιΉ2 ΈŽxsvχƒ‘csQ”2ω,ss"Π,ν,(¬29bG|Α[υP5½}ZΪθmΔ΅Χ`:lΖ�-a€φŽ‘S�ciΗ> €μET2簁}΄ΌJ…@eΞ&λλϋ…νΔί+ΔJ­.mμJΝ')±« †�Ή\ΐœ=V‡io, φ#φk“+Ϋ4@]'¨TŽ=χϊs,%�“1 =Q€Εΰ8ϊ0π/ŸΙ ±ω#/E6}5e …$Ψ`ψ..ΰΔ£‡b‚:@ίΡΧFί1ήΗ2b5›znΝ {¦_„ τΒε«)—oƒ=YŸ§§AO½w¦ .η­―„pz‚c‹)άAl=,°Χ™ΤΰΟ ζyϊ2άΟ:F½ΗR¨MωF=’~τη&}½Tw?’;?{¨»Ε=NsŽz†Έ'2Τθν žΕΐ�?vΟγ½Π7Y¬²ΉΝσν‘/°2ΌΫXV‚@B5₯Ο=s>…ϊA66ˆvκή�Ύ§ |"tΨ:l§˜LΈ�oΆ€_97:‘ΞŸ8Λδ#Xœ•βγν€LβšLE0@κN‘Λκ[Σ2£υkΛ«κ#‘±†΄³PΎŽαήVΙRΟ,Υ€Šϊ6¦_,ΠΓ{Μω0ΙjΟ΅θoΕή©ψ,•ΆΔ§½LVΐ³Ξ₯ŽJ½Ϊ€Πƒμ‘¬)ew“½ΚΤ]ƒa° Ο©‰'žA/κ~ε@ωae| ψφΤ@*ΓO,P:«e`«λοcSηH0,­’Ο-0bϊLͺ"9Έ‹ΖΘ>³yLUΈ‚R^3δ—�WΗYͺ`iκ7@{npSόy@Α*Με ΅wt,Ÿ8}ζ�όγ?ώΖ/ p 7ω«Vΰά΅k‹_?:ϊΦ%Τϊ�ϊψo¦ϋϊή>Όsϋ3ΠGs6άRDooOΆŠT–š#)2Γ™Ο4²Α•Ž‚+pΰ§ο 4_3Σcs(² όgΖΡΐ·%§γi‡kλσ ΐzΥ©ŠHκ½ηζ:QιώmvDE§Αd\žΖΠμ’N‚tb³Τ₯Εq(€Ά?uŽœͺ\’M EƊσ„ςΑqθ­λˍCfUχg°gٌU6ΚXδ�π‚q²Iš”A ‘„}‡ΜΥ(ξ€D³¬©Ύ’Z:γ$Ygpγ₯tη₯φφφ0Ϊ�Pgf§θπKM�0ͺDη'¨t=ΆΉΗ’ςc δd4))ΙΕA98€aQχΉTΦzzvŒΡ“;M aLTΞ"οΡ™…³©ΡΒI6;¬ϊW|Ό�‘,KΑ`Χϊ1ΧMb‰ΊΖκᜧ½ΕlχCθΑλ€Mƒ“wq@ΨΏΝ£τƒοΏK•,zI}Κ« ;€Η]\Kc« d$Zω΄ΐ‘Rd'Š‘½–”Iω(Θ-ΘNΗ06υ0 jŽjSχ£"^–ά˜ΝbOf¨D�Y=œθs¬“ VΰΙ:ΫrωBχ΄³}cscΤ�ŽŽ.Rgځ{Oood¨,K0ΠΠ‘(!0ΦρS€"Φ£θΊxΚΎ`ŽŸnΏΟDΆ~šχ*‰¦²ζhμεkΜλpΩέV‘"ιυ=K~z^<q^xίW†gPC&d`t8ΨI#•Ž₯όδϊ‡Ρο•—ΪάpκΏ�¦HΦ�ͺΆ6Ψ+–δΰfD¦§ΣZ8-τΌ”žτφ₯Z^ ―ΝqςΆΩΖΛ Ω5΄X_[ #Υ³LVEMQκ';l6§Ζς¬βR^ ϋ[]ΏI΄”>xγϋιΖOί‚vJ¦Ζη·Οˆ ­Y$u°ŒˆQX—Ν­ωpά²awYJ²DφCͺΎλ«ήT1(0#¦xh 0?Ι p…€b1B_εs/Ή΅6Ν½­€ΚΖ6φγ02 sσd)ΣΨγΪ<6nJƒφ,kΚΎ5Ϊ°ΐ ]�ΥW<ϋμΨ42³€₯fΦA}8†{θΒ…½θκ>I­�`όν5'…ό›ς/9£'β O§Ι‘‘­šΣΊ‹MßΠ΅ˆg>€fU�ςά¬$fr—ΰ˜Α’*δY–Ρ{2ΦqΎbΒΧ·oμ6£ΰM¨έΆ�ΌχxΎgφ'ύmχie‘€fϊΞ‘hκwAt7χ$Σ‡/dί[�σΟ<—³Η–’ΌpιrΊχδ!:š°³œ1τ―gn•F°6O,£|ΔFΔyθ(Α�+ˆξυ΅ΝώΫύ—‰°}XΰB}βδΧ»0`zr6}vύf:uφ Μ–ΚΤ7ά›^ϋΒk8Ύ²Αφ)gψ1 π|¬QeΛ4G[œY SΚλοFN‚`<ρŒ«?οSbπxˆLXmο£ΟŸ‚€ŸέΈ™nέΈψa—ς„’+Κ;ώ�αο|-­~m!}YvzɎΐυM€λΤϊ0κ;ƒl?α,Λ€[€όΕ^GMd>ZΣΐΞΝ›χ‘0ӝΎν8̌I€δ~tjy”χ؏₯ϋDG”=uΐ΄*dΏω―�œ�‹tΌ¬Ώƒ•L­λζϋ›PqM9JΡυ\πK@!ΐ.Κέ|έk―ΏΫ‘‰#bYΜRϊψϊιΜιΣιXsKS8ϊΪ…žήΌgΏŽ 5j“fl”¦~°Αͺ>€ΑΎ ξdνΨφ` "/?›θ^‚°μz&μ:σοzϊŒΨΰyll"utt¦]ΞοΠM ‰Ήλh,šŸΕ9BNs‘Ε<φΜυC4ηu�‡ήW-)@F_ιFξ2,¬-§‰‘Σ£[χπ9ΜΊΣ+©±)<Ϋ ƒ"]TŒͺFΗ;6UVœvφH_M›€ώΰœ"ͺ˜7W²�”#F‰)ΊΣ^Q#ΫΛ¬-TpluοΰcjΔΛ ’π#ο{”ƒ--n :yK†Ÿ>Ζ6ΰš“7 ν ŠB!™Ϊΐ½Υ锃 ξ¬8"t-@fΑ탙TοI\[Γ³Ξ2ŽΌGΑRžΫΐ{X­]Κ̎°λκρξΧσl)ν2`Υ<@`ώΙͺ"υ"‰6@›κzJIΉμ ύ2lre`Ϋϊ–Εi·ςΡ©κhˆbμ©² Wžσώ£Ύ4=7—Žw³Οθ•|ό¦¦ΖΞTŒΏΛωD<ΡM­<γΐo§Ύton:<₯¨Έϊ 2j+ωo½…ϋ…ž`Ο±>wφΙσ€ ’θ�s–ΏWζ•?e̞ ;Ό–ŠΐΡFœ‡Ό~Πl‹ΔΚ.51ϋ؟\¨τ;\;.~ΏΝx6uΒ:Ύšφ;z:°φ΅ψΧ|‰ΛfΠΗoΌρ@倂²m’)£σ€ΐή²gY`σ³°(ΆηRίΰXκκ`όρΛ—Ψ³Φ ;<6•Ϊš8;Œ&Ώw=¨φΫ؟γ$cκ:°a?Oφ‘#r‹VSYM}ZښΑΖmz0©o(υσ,Œ―ΚJc½ƒ”Πμ—…ΛΕχŒλpΔz)KΑαš‚ςzς»““mΝ0Ά`Mc“ Rχ9zΑΐΊsϋΐ?r§ιΐw.Π^4�ΰΏYiψn+ψ£Δ1Φy¨PΞeVγ³Ϋ3.it#ην£6>πI|Χ)}xrμY g½­΅ Fis4_ν4I₯œΓb ›xn"›φ S'Ψ΄²Δ’Ο–aέΰo±�ž1ύ€θƒ…Μbυέ le½Υέ}eΚ³σΛςΑςόκγι όμ�c cήήξβΥΏώ›ούΑOίy―ό Ϋ1V6PT(θj™ΚB�―α\£TulkpΈU ށŒίλΠ˜ν‘²ULμ8ƒT³ΠŽr*!©`t ˜8”KK€nf|–JΚ’6εuHςšΩ)tΈHλάΒ\Μ*=u¦9Z2Σχχ>ΌG ( χ«α2ƒkF@΄ήχ1c±F'p†=¨q{GΜέ&θ©ojJU3fεj ϋiLdθ°κŒ|`€pΚΜθZίjVΩ†o…Τ{JΧ”Zž Θ!cΘΏ7{ε4…ž½«tΊ£’&‡»τΉ¨b}Μ�/ιtΩ%x™:ϋήŒ.“X>§‘Ϊ{oΏΤHRd˜Ž Χξs l¦#‘ώΠpΉž:'Oe/Φΰ@*j¦q¨Ώ—½Τ£ΖvR²΅”ΚŒ—kε΅όuΧ°WΑްt@ΕΜΈΏ“₯"²―!4° ͺ:λΕσ?֍³�s§³΄q…LρΉσgSgw7{OΩ Ξ½Ω―Uw~ψ“tχ#¦GT7F6n D§—(}Ιu$ρƒ·gύexe@Y–$ž]pK] —£Ζ³ΫOFQF•b>»w7z³ά}xη’ϋ½�θ>•™΄#)‡ϋ.A X ϋ¨ηηY#ΠβΜDΙΞΆ A�VΆΧ¦hΎ_όP·ΤόZίθϊΩω)'x!“ΒYΦG€Κb%ςκZξ)ί… RI™5²=Λ8C[η:°(^Ξ,₯iqmt²ς' Q^S΄Ω°¨…f�rqFp±‰,ύNβ<ž9už,.Ν0?ύ gΠύυ9,³!3E²uηψ—ηΓ½όΥΗ�Ο }ύλΩ«§ε7Ύ�g�ζίόEγEεhΝ‘†WΑg%¦֐ιxˆ|zEσmxθλtwnο[Έάe%’"E…’-  'J„ q,@@`8NBJRm J‚DA€8J,(PbD‚LK‚-—Ϋ—»{wo;½χή{>Ÿσξ6`ύJό-‡wζ7Ώyίη}Κ)ίσ=ηΔόzψ׈lΠ�gΑncciwεm‚žΛ>ο:#₯(«bwtvρχΗέ•~l€Γλ)Ξ£ΚV#Hc[sΖ› ŠšGκ—…R.΄ΆΔ|Ύφg’½�KqκΏΨΛϊ�a$ΫMΒd f…€ͺ lDA2£Ο\D‘tŸ_„> fΖm] ­Υ=¨Ζ[Dp¦Η�Θ¨¬>‚ζΌGd΅œͺ�mVδΤ7Ά“χ[OŽ7θΈ ©£ζ―•²�:ΥRHu†t4°ŽΝŒ_ΗΎ·Ώϊηeφ‰)"ΠKQ”ƒΰF»;z˜Γ*!б€˜ΫηύwίƒΦΌω^�zmef/{k›Η―BφkJR=3§΅Ž[H«7jŠσ‘ΖΩΠΈρ{YŽΝΉ—šηώ₯vξύވ‰ΖŽgmGΞ=k%wΣ!<_‡:ω\KηΐBvfӏΌNώήσ$hζ½dδhΠyJpώ54dU˜¦2Ρh£ήeκΒΘμιξΓq:€Ρ2Fp3@†œ0ŽΩΏΆ΅U™σ―C‰‘ά> 5S‹€bttwwG―y/χ°σ(ψ•‹Bφ†•e€Υ°ΞΆp3άβb$ΩaΰH³―Ÿ{FcJytώςύσŸOˆΌω ηƒΟϊ²PŸ”Y£—F΅Ψ|‘Μ8%±ηΑTB Ϋd—L°»†Ί–Ÿϋ 3ηWώσΜήTP¨gH9!c© (75[^‹σo*Œϋa“(Σ[�ο«iβΩη™ΐίHo6—Ϊϋ yώ=�xέŒ*Ύ—�n”ίά\Α™RR”έ+ξεL9{ΟΌΔ]žΡ]Υ€Κ²p€s‘OλΘΉ3Φρ€΅ŸΓpjΜδDΘc[ΩrOφΡ.ΐF±):cEηͺζο―έ·‡”ΘrΦΤ: ±―9Σ�Ox1š Π8˜"DΟ„άƒi²Θ«§Μ7š.Χ*φλ€:‰Lt8ΌΚΟ’υM€ϋΊG·‰ςϋ·GTφίΦpεϊVΛΆυ™…tΙ?=@ΧXΆ₯Ν£ιΩγ'Μρ)‘;ΐ@θδ³�vΛzΞθX1ς³0δΈΤσŒf;Is�ηζζ0ΤLR@VcdžbθΉ^¦`ώy «“«kφΡM&mxޘrΖ ΓCυ€΅`ΣΙPξσ€œQŒpž]ΤΞ9υu„.ΠΨ6ΪζKCžC‘°₯1’αΥμ΅ €ac““ιρΰΣτ7Ύρ³€Έ30΅ORWK©3³<+Τέ= _r?υ‰gD`φTσ_εpφbO±Χ-θ΄evΞ6s‰‚d_ΡϊŒ΅ Ήx©—Άeθ˜GOqΎΡq³-ρ •†¬²Θ~αw_ΈNκ$cŒσ†μ‘:¬γλΎrύj3>Α7ΩW2 2y'θ―ΜσΠg ZξΕω`.§gfHΝ£%{�š%Φλρ:�―:Μλδ ŠΠ¦χYΰRΦ•€Ψˆ”y¦€Έ τ‘Ζϋƒ(d Qm=μ:t†vŽ bt‡`Β³§ƒΑxΠxήDo–²~•8¦γΪκ3Ω€ ƒ1ΑXΔP&jθ8e Φ+ψΦ_�˜~ΛιΡΠC’Š]©Šι/}κ31–c’ΤV|o’OMm}Θo:Ω#:SyΨ<ΚeP {@a7ƒfjΙ΄�š―”TΉh=Kd[YQW[Ηώ±m©‘ϊ——ΐ0Βώ™<c½¬=²‹a§™ΝΣυ((ٰΔ>Χ’ν¬Jή³,G”ωtΊ‡t汏XcƒA•€ΕΨ"₯8-ΉΨ.;θ}ιηΆ…Ά°ΪΠγατΞχίKΓό;όt8=€ΦΛΠκhT[ΟFPθιΣgι{o|b―ΠmTΉ,Ί ««*uuυ†ΑΨδ½±’XΛ’ή[8Θ[R±±―ΤΘ!εu)΅r ν?.:₯Όρy‘’ΔΛΤσ"ϋΜν.ολ¨/Τ«αP#ΧdζψwΪ•+0«Χ`Ό­ΚveR'¬½[€_m ·½O%υ2·l` “φ΅BibfηVσuKωmλΌs¨›ΒΛΆΕ†ΪΖv5mΐ9Ԟr7ioΐ†νΔ΄q°Ÿ{L;=Pdφ―{Ψ΄›ώ‹€MnυψŒΧΠ.^!θ°ΐ^Ž_,~―ΟbΊΆϋΜ½(Ψh]Œ=φ‰ΎςA]ΰϋΣ ¦~V`Œ€Flα–– ©žΐ†ΊΑ ›λ!aχ«Ξ­φi.�―¬X)Ϊλ½ψηφX)ςTΖ―Ά~^ϋ\ωΗ}°πRWwο?ϋ…_όχ�Χο|η;ηJΗCς�ϋΣρ£Χ_4ίώ'ΏUωxxθΏϊΟύΏΈ5<6Kϋ˜fŒ σΥΩ:’ˆB³YΟ# ".[χΉ;D ˆΚκδϋ+‘ΝsΰαAλ”"&UL…hžΉt1Ρ�„RF`ΞX#θg3Υ@/_Ί”zŒρ‰9h„T€ηpˆΎΚ€XΕpΘG©ΪΟV!uΞ&°E‹J$-Πp„aw†‚Π‘τ0Ι2h„A ‚t|FݍVͺl¬š{†3]‹�k¦ΘΟ(ζ‡G»$ ΞΕ₯ω(ξ΄B$¨ J\w ½²Ϋ[SG[kz2ψ$šH³h£¬‚Ζ††θΧ:;ΏBEm+*Xΐœ‰F0†Bk.–>ί³¨Λ σ%H§ΪωτyŽJlξbu­σ7*‘|κD˜§œ‹ΐΣXΟe^·θρ¬»†8C1ͺΡΙ) I> ƒθbίΕ0Η§0κ˜†©BA₯‚;Ɛ5·Ρθ“ͺŽ‚`‰Δ§TΗ6 7�ƒ₯>Œ^‰JYD—GRqM’€3”ύ�™Ζ1Χ—κWγo~πŽΥ ΓR›QIινΧΎŸή}ύQΪ‚Ύά€γώʏ�XϊϊίψVzρ‹ŸaΈΠ4qΆ‰V,,/¦}ΠM Q)γΔ :Γ΅o¨»ΉœΞ]8w¬ΉΆx=(ό=€sλrœΰφΦΎGρ²―.’χ&-έ9Qθ>#ϊiŸΘxCν…¨°ΖΎ.€±`εm#yΊ‹ζuNNzbΜ\΅·wΎΧD>έδΤ(ηC 1ϊΚς"3j«Fέq d!x6β|(Ε™Lλ,Ψ N#@ @z΄54p-Φ8>nη% Ίrφ Œˆ“9–RκΝ…ΥψΆ―― ΪψΨ8«q>ύŸΉŠe…k SάΕ$kƚ-έι�•+μέ¦τθώhaHΡ;} ;YΌΙhb>sΐtπ€s-Ϋg•9 dœyύΝY\ΊL5εΦθΉΜνTλŒηξξ‹©žά@ƒ‡?¦V…E!I#jνΔ #j»Ι™δw**‹F$‚5t ˆψε+{€σ›'ι&Σρπ|λ Ι”PΉjδ5“Ipΐ\Κ�`ZcNΝ5·θ©/ #\γLΗ†=Λ—c4kŒψ{ eaЇμ₯;wn‡έ“z{Ϊ�O~ν+μΉΌΤΣΥtΒ>x7hŒΤmΘ=#bΕη—0πtΆ=k 1ǝe xξu •‚!�n•aϊs<'rΦόVLηΐ1α`κΘ²›F λkaΜ D—Η¨ΒύθiΊ�φ»!JΨ^L#5aΝφFlΖ–N€ŠŽWΖ:PV›�Mc΅ pΞ½Έ) ψ“λΐΩδ#FΛ4ISΠ0υ‘Γ8ή¬CΚσR¦Μh°€ΤβΖ γ/QΞαŒΪ‚Kaθ9—ΗW’gl•›Ζ?€²@9k Θc.λ«$ͺnj šgš#ψˆrσζ.«‘+Fš>~ψ(jk|πή‡ijt’’ˆƒ0ΑΖάΐΜ―‘x"qa<(/ηίσ’νFν†B0J—ΆΚωχ5ͺΔq― ƒ6Ÿk­…Μαoύ·}§άWWiξ"¦¦§’¨κδΨέ[fΝ0 OΓβcm-Δ»±‚‡νt¨ΜaΡκξˆs€δŽ=₯cd4Τv‘΅ΥYkŠΨΙ T+φy.rώχΥ:Χl0ΎgΓσχώώώ<ΰsξΥ"OAχψ”ΞΆςI@5‹ͺ šr φŸλ¦γͺ� ΩΙΩΌ;a?‹†{uΦU^X·ΙĜZR7IšύΜNΑ‹ρ•Θ*ΐ1gΛ!—‘©|ΦοηME50%ˆaΡΞBδϋڎBΪή�…㛃}²J]νšlΟTP τr꒚Ύ2vuƒ@ yωk€P»|~Γkρ .w_Ψ9Γξ*ΐ~€‚~κO;λ.T0Φ�΅C€} Ϊ’Ή'€3L[κξo‚ΕYŞ;ˆ΄’›ΧaΖψ˜ώZ…έ^‰ΓY‹ύ_ Έ\[mΑr$<·g|Θgτ€„cΧ17 Ιw.{žοkυ‰kɞτ7Κ Ηξ�o­ω<ΨΪΪψΨΡ…<ΟΆšυ‰zο^όμQΣ %μΐΊεΌωό%εΤυ¨ιd'€†μhΨF―”QŒx†”„�––#ֈΰ³CWqbWρήΫ­΅GAΚ-dγ’Φ°§» Ξ3ίΎs›š$ΝθάΤΩΫEz­ΑΡέηADӌτ v©Ω £XΖ‰-ΤWΚ@SIŸ �κD &Η½kΛlΣ N)ceσU0Χ]ν¬WE3)V ³Ζ=h;Ξ3tΎϋ¨‘€˜άΎξnφΡaΤ¨8Ε—*VΞ°oΞχΈv™ΌΜΩ=ΞuΘ δ†lijz­χυυ�§·ξ½ψ4₯ο°*?χΩW8€EQYurr 6τF£”₯Sζy‰!A~ B Cϋ ‰�ΰή*#² 9ΗͺΡ₯"}l…h‘ e!”ƒπl a‹’ κC𨼟 Ž ΎaA*ΐΓγ^¨3BNRβχ εrιΝDΉ^J•7’fd[#H#’CɜΆ@k R•`θα ”•IA¦ΆNŒΧ’d% έΦ dg;0꩐³΅mŽ4-2&KasϋŒ Ξ‘ˆU*‘[4ξαϋΓ©P¦±AJ+©ή+}©­‹j·\kzb„θΔŒςω9γΑ6oF•5�ΠDθ�€AaBz•gVΡΈ> \’…ΒsiΙ π\of*φk{Νyrώe°Œ“ οŒ‚F1cwO[ŒKΓή}hM'Uι(;)“~N#Yblt8 (#γΫ(} ₯ι€TΑ–ΡQ<Τs-U�ζZš>γ~–e’Ρ X°ΖΎΊ@ŽΌ•ω= ϊ38ˆB…v @υΞ―‘7>DΤ‹(²@dŠ}δίΓΑΠ€SΉ!Τσ<χuwa”f²ΐ&Ν¬!.mμo ™ž€Γ€εΖ«gΛ(iγ+εο·q`§F&p~kΈ—Ξ$Nη]GΦω�˜Ξœm>fΰ'Γψ3²š9γρ&ΏΒΏδμΕ ³·ψΌσς€ γί;ο1G(A[J†C ΨεzωΦΰ‹œA―Β€Ύ Fšκ΄MTrumPk-υφ^€―}ΰQ{ΠR'pκFž²�¦a‘Β²΅ΖOVuό8τ–ς‰-ΑΞ ^Φ—ϋb]rŸlϟΛq:Ο£_Ξƒ†ιωωπ=_ŽΡ—F³rΜsβy© B¦S콬ƒβηόΑ/„2žωδ³ΚXu—΅HS0²΅΅…½ΟήφΎΨ2Ε~”M ƒ g|‹ϊ₯Τ—κ,[Ωξ!η΅œq‹z~΅™tψΥι2+9nα|]ζlΪVχΑˆ•UkθP`z’=Α_σ¬§[ 3:9Βώ@Π‘EχσΩeήWΎ#ƒ1*C ‚D©σ™Jt$:‚s€ξ‘M915MAarš± Iμu>ΟΎ§ωδό‘5Wμœa@šςη~έ$ΐe οΟ+χχμf«€ΔdžN|vΑh™AΦ£°K–©}ύ©³«›όιV:5L·ΓL¨E7΄€φŠl²nκ­J@UYUθΰ ν �5ϋl(c[νc{,M/€ό` ₯Α€[,jΑRΨθΨ#UαŒρž ί΄Ÿςς˜XBΦ–rl―mJ€φΒΐ΄ΟηώWfFpuΦ)u/ΊWA.+ΛRq­·R‚άoιΎΐυ™ψ{Ο’α°ΞSc™TήΓζδχžEu±€‹Ο—k:£If’)―§t„ZΐZ'—Ό„€†-/­α%P€ΌbΧs+Ύ8«Ϋ8χ�Ηvτ²£ŒgLv€NŸ@Ύ¨Ο‘Œκν鬁%ΖΩΑ~Τ^ή@N"CF')0½ύΙvm YOΝ6£θ¦†©s8o΅χΜI³χ}―_E°ΟήξUVΟ‘²{xΰς@0Wdοΰ™ΆΤ³nZƒ}O`Ϊ”“Ώoϋΐ lmυš  €L0ψϋΝN ,<ξžG=ρΜΚ7#κά”y·#Wtόαo<�€ ‡ίΈžΦxBς£[pΈ·(ˆ-Y2lj€­§χ)  ΄šš€λ•UΤkhΐΞocίπ­₯ω™e�¦(ཟ±kΛΩ―Ϊ�ΏςWί΄jΩ{»θ›.žϋε—^$%’4'Μϊωμχr:Ά΅Zόšσo`J_KV³6³ΰί~@�δ1•-žQν}Ο±>2MŸBΕ5p?—XΓύΐ³ –€²ν§ϋ]±ˆ-&ƒij~*-�.@SΒz–ζ’qΝΦήbιυΥ0F™yOΚbυ’²GpΓ97UΛΊaht~’ώώ]4άCΡ₯€χ�υo�νΏϋί|η; ϊ?d―Α‚­TώΧΏϊkη�ίϋκΆωyRS@ρΞ"x"Yn΄›”hΌ•2EΕ?KJq|AΛL8Q7Ϊ₯‘γ&3β΄LΑ+η[}_ž Œ„rPTFΈzs;…½88Fά₯ΊιθX}wΗ¨½­#}p�Γ ―Eζ\ΰln±ωΟ φ4F₯‹²mβl/ΰˆš7Y†ρλ!%4 Ή™ΛίλxπlU¨θ°cχΖaΓ—ρ j( OεϋΑ_<(Ÿ@IDATύ0D7ˆts€λk=pt–Ι54Κc ©™™‡ή,_Σb˜g Α‡PΓ BnB{’‚‡Rχώξ*‰m—€ηg,Š\(>;RΔ0ACΘ…!ΓaUαkΔsψu„₯ ’nμP˜ΦHegNΧ™Y §(˜b”£B΄#·CHΒg�–n²ΠX=„τ¨Œ¨MξQΉ„ϋKŒ>¬ΜΚΗŽ•5(Β“ΤέKΑ¨‹½·DTˆD6R «vΖΔθ#f›οδοσlζ G!Gή•ΑPI^dT=&ΪVLα$Ε·>όπ~zσ5*›Ώ~ŸΒc9΄ΈH7ž#²Υӎ²―ΓYΗ¨…Κ§’²%S½tΫ )šrdTΫΞΉKΧt*)ιύ:!y ¬ uœy?}Lώ·Β4�4ψnjj*r(Uΐ=DΑ5ΌŒΒΌχΪiƒΘ‡]% ΩΏ%TeΠN+‰Rq4Ro_wκκι edœκ Ζ¦‡ƒ=8τ$XFlΤΡΡ•ϊzϊΈ#†υš4I:†ŸŽ„‘τ΅θΛƒhˆθ,hX«tΔ₯όχα0lbΔΝNM„rd³v…ŠΑ}βυšX‡(x¨gV²’<žYλyμsG‡f›οm½hδ2 Π;oΏ|5HϋL·_�~΄Ak¬₯}&ŸΣ±>ςκM2vBsheγ˜&α~TQ|υK_"οΊ @9uξθhγ<ΰ\!Δ©#‚lhPβw�wqJaR¬H‡§Ώ5Τηc ›M"κF―p£Γhρ¦h Α ²τdgΡe”Ζ»Qh_ž!ο0 sΙaŠˆ°†gέ]―©$œ ΔΏc΍\z/£ΚΚΟ›Χt=κa+Ύ4β€MhA͚š²τ΅―5}κӟηƒHεANίύΟΎϋέ0<σ‘,.0ΟΫ:‘^G£ΪVyη”rΘο}ιܜΏ|ΟρωL~ΖΊ@κ²,σkWΣO|ι‹ιώδ»idθ2€2=wλv€-|ψΖ›iVLΉ ’Ο…ΆώΘ!ΖΣ―‘C™Ξ…ΉΎ~iY�ϋψ¬Q°ω°cJ”Γ’n.Ž­Ί)#xηδy“jΔύϊ―^Η‘hg?Y$5mί³Λή3F_Κ.;:™F8’Ί4ΐρ©C¦˜ΓκυmλΖ>ηΜ=)xi‹*κ]ꑨόK(νΝ Z­F§΄ΰ rqλ9‚i[Θwχy=M†ͺ ™\VXSΞA‘²‹WƒΘžgcy‘Ώ5ͺ±KΤ :GTΧ(5’λCĚς·ξOeΊipN–υ"‚‘ΐDiψζ*«μsu#ΧΟ)‘;θ«m•<Ξ{4τ‡OŸ€ιΉy’ίPF •Z£ώΛE*­ΰοŽΫ—sFσ'gΓχΒtΨ«ηΕUέχ‚Q:₯F·,Θjξϊ!τε}jˆ8υ<�ΘΰΣ431™Ύϊ•―‡Γ524̐»\Oͺ²)n†(=?™:ε¦ Έ§–eƝΏάλΞ“―ΠΟ¬Ηω™8�Ωίϋεωυ,ϊ}ζΠHa`gηί §ότei >³ηόŒ9ΚΗ)πΊEλ…»7�_MOhοϋΦύ·˜ Ba{:<Qڊ2/‹ΑΤNΓT,eDJςaχƒωpmχΈ…αp~ΠΟ¦‹yV}�ξžN�gšˆΐΫnνc|‘ 6‘εδαΰƒNΈlŠή7ΚΨέΫ‡^k §Ρk‘7ΥSηSJG�}§³.ΝΨZ9:)V“Ο‘Ž€,Λy€™jIXœ Αη@0AR B5Φ€™r<ηL‰SœSΩ΅0|lsgΎ»Τλ ¨νˆΝΠS²-έCΡ:=ZDΉ}₯σZ ;Β–Π5kLιθκ8hΑ“*έL'ζΡ‚ŽΈχά½Τ S%§©MDΕ‚šΥμυz€Χ�€/¦Šρ›ϊ’«r-?'Ζη°ΏV(°§όB>AΝa―Ήvt΄Υ·­_MA�&Ω衞’Lž(ήΙ^ΡΖ °‡5ŠΘ\ksΈ6†(σΒ&cŽ,�jϊŸσ€ŽuΛΌH1ςΟW5¬Šb€λ$(]/Α8ε‚l­m‚nSΣgž8 ³Μ–ΐ»zύcκŸ24Ά/ο)—ΒF`ΐστ˜5=5ηέb²s=οξ'[|ΪΦ΄fAυ2*±…<ΟžΤܘ‘~‚{« »ΫΥ0ψ7ΫюFΦ ωΜv ξmλhkΚς9?·¦ ΙV’‘£]rΘό—λΔY6εΕΉλξ «Ο쨑ΑHλ΄vSϋcv‡’ώΚΕΛ‘ϊΉDΐΕ9 š=gΞΘΉuLI†dΤy²C–σsΞςΑσΰ³2alyζ|ΠC6œϋΥΞΦ+# 4ΏΈξ+›Jω]O ΑlΩ΅;«s¬Οcž£Fΐ%δΫIzλϋo§ΙρE֊Tžm:ې2lέ­MR<;ΖsξΆΦI`vέˆΑ0QQΙ™ΓΖ6Ίζfη’€=κΨ<›Φ �άδ>ܐI ύ› ˏ½Νξ)ΤV¬“,έ0(Κ]™}Ξ‹ΔΟYpD–rMΩ!ΐd Θ½&l²:�t― \`/„-φ Ÿe%-²GlΗ-#ΆίM})ϋΨN ¬J¬‘μ=&Εθ_k.εpέΊͺΚ³ώΎΎmν=ίΉtνφ¨gβ‡ν₯νπ£ΧΏb~ρoώόΝ�ώ7ώ»�rrf©¬ AŸ‡ρoςaZArˆRqΧ’χβλΑQŠβΚC[VcxW²ιUΈU ‡j €· hŽpD‘u£,VpŒ’…•:§Ή―Pg3cZb°J&Y‚±†±-b3ΚD§sžΘ΄ΥO§ΐˆθ‚�β‚­€S<‡’Ήsχ6νzΪQJ5&Y^^Ή„‹�ŠpŒr9ˆζ29Pܚ“ΣΦΦŽ–E£T ’΄ŽCεi1‘5?Q_Ϋ0I—“ήz†"ήΕΉ_ΐPŐ- ·°%γ©ρY’³ ςκ².vχ)ΊC²@!ΚOͺ¨•nβRΒΰLe†’ΚΕΈ6uυ_G†cΞ\rΘ‘†*#}GΞ=‘6ͺ*Γl°m8ƒ^ 0ι(ΰΝϋΪCωωχ’*z?'Β­rσΨWDu)Μ‡b±&„ΥˆΡiAΟ΄j ™Μ•N΅7-Β˜έ…‰ EF&‡ ςo4θg'ΗBΈ± ΄H£π9έe({{!‹>* ₯ΥΧΦQˆ²ͺ€e™¨7tώςΖ4G€ΰ»πgP@η0ΚJΣελ—�ν—n§η^Ή‹n&/š{h©³φΖκb\·ͺU+†ΖκβkkΔυά‘φxΒCzΰ‰XμΜΦTΪ°Ξ‘4Ύ5ςΕ,eίj&u£59όTm%Ίρφ;ίg](˜¨Sν:δb4ΆΆF΅ΩhwPκtvŽO†hλΙ>[CΙμΠΔ¨C4WύΎ."LαΘkD­4ΙμΠ¨u�yιΧρΦπΜ„:H1ΧsŽέŸηEΨTΛK‹ilθi΄Κl$ν’₯•6‘=½€½DΈ;bŸW ¬]ksUB›μηm”fD\{3§N€…E·?yΚύr@ΒBI-JΙeί΅atδΉ"GgKηLVJ μ dΡu»ŠΨigY–‘ΓΈ%’pŒRΡ0ΣΠo@.μΧ θ 5αή•ΫΠq ΖΛ1Q‘\ζήόpΩEdFΕxœOΎΗ˜ΐδ ψŒ΅΅5\·–Ug,άΗσβά:FNψ& c šˆ>²w«Μ&9? γ³K†N½Ζ—F€λ γωΣ!PN¬# L²ƒƒ_'€„uͺ0|ŸO}όazςψ1ω‘»…Š ΄�‹€§­άŒ¨;ώ,θψ§_ŽΩg�ς9œ[ 7§ŒrΞύ²˜˜Ÿρε>8Z@^MMMSœs.υτφ€+—ˆn"ηwώ—΄81EW"b° ά{N²κΓΧσ)hΔΕшϋπž…šόέ>μ;ChΈΨAƒΫΪΗ8S�•Ο«0>dfμ0o@|–5Β™·₯XΟ¨qQ,ȌAZ>¨8l§fΖte Ϋξή."±XWΏ· ¦dYχ‘μŒθΧσ1'P 08mc) ΩTοQŽ£§ά2lΫό�Κ~gά�3σ‰4–²Mt$܏‚±¦΅YGDBσ!λ`΄΄j?‘ φ—yκνFξ.΄ σVΣŽŸμ£Σ2I€t(‘ΐ`Ψ§v±<‘Α a«#ΐD₯"ρΘε²Ο₯a'‹i«†�λlΗsbsŠp€Œ’ς,Jάe―Θf0ΧVt¦*ν±g'¦S=Βrζ–¬ηώ„(Χ>T}υž/Χνό†)kκΛ΅³ŽZΞυr―Ή=?:<Μd%ΟSΑ^Јόΰƒ·�ΥΛW�—μΗcό�ψ‡�]ΎT»°›ω]Ά§5R?ƒ€Ώ�šκ`ΛKY^ώώ||ή�œυΰψάγξEρvˆ?;~φ}εœιUT¦A0ϋ˜eΏΡM―είψlhξΕ| Kͺ  ϋޝηξΐκAF·E½Ω\ΘήΓ~ιsσδ9R½ωζ›ιώ K‰¨ ϋΘ1»ά„rξ<8~ΑŸΙβy;θoU‹G³SӍΧ±?ڐǛCζ°fθmίvOO_κ0hψ…m₯¬2‚Œ3φ„ίΥεMT^¨π,+dlΒ΄[·ώ β2Ίu °ΓΊ8ΙζΜ ΜΉ?Œ:#ξηή1kŸΉ/•ƒ^_†—uκΛ[aHȜS/ ΆρG|!CψΊtιιh}Aρ”`±Y׈ϊSΤΆiζyΤSϋD�ψ*‚Φ.ˆ`ϋbs²7±ΦaΜ�Ρ’‡ηΏσβέΤ?ΠOM£K©»»šΒœLx`wφ)Ίθ0ΰP₯нe·§�Ώ ?{:‘&Η)hGgνu'rΏΪ6ΩΨ]5Ϊ‘Κ/χ€Ύν}`ΟBθζ ˜Rμ?£γ―#*C*>Ηϋ2ό¬1£ €‚ΰΨ†L·ƒƒr%�VX/λ―Tt¨`_y-χ„)=`ωΜwL)ρ₯Σ“Sόu΄φpΪ妦X?ΨΘ eE)Ο"[ cλ`ύy#λ:ŠΪŸ² +‘ ΈΦΛ0ΝXT°+ΞkΊEjΒG=ˆt9οuΟeO%Ά[•Ξ<qƒώΡ"‘ΰR)2[;9ΣGΪ©μMξinΎŸaμ+Ξ¦ΑOyΘp[σšϊ;>‡ˆΝ£U+ΓUΖέ Άš•�/υTSO†θΆ-&—ωœΞ·s%X,[νΫ;lΟ�“έ«žΤ)φK»IΐΕ}βgSΜ~ζ3žE΁pΠ–:K!cu¨‚Ł΅χαiΆΛ,ώΖk1ΗY?’νψ=δq5BΫID|οazηυρ²@μδΰ¬`ο87:ΞEœQώv–L6ˆiΩH{C»bϋΗΆŒ‘6ΝYК6₯ΟΞ2ΪΞ>Σ³‘‘42BΫr:@XΧ­Š΅¨TGμ#›}6νr}4Σ·e)·ͺΡσΑ4ΰω26‘ Œ1μΑ˜ δ„Yg³Ώ―+έΎu»Οβδϊ)ψrΘΖSκˆT ±`�v�‰29°Γ9= h½2λqžχχaΆrL':ΓΞ+A_j‹!σΦϊ/]ό›ίψk�ζΤ6ΰψ^?ώkφmΒ“�γoάωΣ?ώ“_Θ/―’«(!‡YΉ_AΤζ£L‡ C16Ω°EΥRE%Ž[‰ΤX6Όθrί@Ζ6U€‰&�ωΧqA€+€5«ά%8©*ΉNZ˜/)LƒΌ�bJ’/Ψ[ ζ‰I+2Gά*η�š=Ÿ‡rΗe9mjͺΗ₯Z4Κ` €oŽκψΦ"xξήsa(θΗ ι`qνŸυ>ΥHυ€©0Eγ5Άp²#Η3‹f˜hψπe5vΡdn0ΛP<{^sV( ež4>ώ Nyx˜?»*((ν—KΟ£TDA΄‚Sι κ]λ/ΘάΑΉc| Αrζτ<�ι:|ψ;…‹yκω|/rhn³ΉXR‚-ζ ΚE€ƒiχŸO&‚9hR7Κ(Π65€œ Ϋmžίq[9Ί£xlt$ „P_Υ{ά�’g9WA~Ν’ˆΫ(’(² ό»Βz–ͺŸ‡³o«–J’k³²7F§¦£hΩ�β Ξω‡ιO�τΝ΄Ά°žϊϋΣ½—>•>�•ΟC…mŠИ5— ΪΖ…ΰΘ Βή|­‹—�DΩQΐΉΓ†.gA]χ ΟkQŸ]œOνw ωh„Χ7Φ‡b‘DP[kσp’μ$1ƒ<91Ί H„ (s—ύ΄Fx'IJ4„Ό;Rϊ.]L]ύέ2μŠϋΤΤ�„ρ΅·ΆAυ'75ͺΗ!R‘ •„±!₯Μ½ζa/,Ξ=QΔ^‘οό[”HƒX₯γKͺZ)χSσ™6‘αλ 5Žž‚½ΎΆ>έΎ}7œϊŒͺžQ{₯" ζi΄Ί§Ο μ5�4oe<~,pƒ³gεeAŒ‡Gaͺœ*ΫNΞƒ΄o2UDL’ ο[u°A%Θ5η@gΨρΊ,z¦Ρ΅‡ΓΏΈΘYeξdξEpެ΄\Γ^hΗh6 HPπώǏ J>ΓΠ›Lή}?2Ž# Ιξ'•τˆ½Š Œ‘�€C ‚ κ!?k83²3T” Άum•-ώή’‘Κ²0Œψ¬gβάAς{―y^P-Œ �žB΅3ηz6•­ŠweŠ?»dΞc{{Q±�tϋξτtl0=}ς0ΓOΖ� {]9©, ±G9JZVkG;U–ββ8\t 2οιsYΐ�—kιšϊ<Π±3ύ† ηqD4›ω·Ζ…EήΞΫU*W¬ϊƜΰMbΰ€q )ώηΤYŒ}ΎϋŽΛB¦ ±?kԘϊ’εθ“oΟυ"ίŠ­ιl:ž�tu ³χdrt<•Χ:ΞΡΡΒ΅BΈŒZδ3¦rφλόψ3ι}φn{K£γBΘ΄ώΛWq0κRkWwPžoΎπΡͺ (giΰΖmώ–ΟsvΈ1@)]Θ&Σ.ŒΨ e η€Ήβόhpœco˜Ύ`οω2h˜2ά+2Ύόo¦ηaxφΚΨ§§€mέ±gx<"Dν8½ @ΗDVži;θ2J(KΠΐ54ͺn1΄Ψ£\_ ζόLΛ6πy­O£ΓYˆΑXŒΡξϊοA Η F‚=ԍΆ©˜s”ωœ±kΧnPάͺ1=xο ^n£#™sŒb>‡ϊl;Ce‹ΧtΏλ<ψςίl‚P\šΏs ža?λ΄‘v?ζπσ±),fΐ‘Ξώ(Ptˆ₯Q7“,%{™9‹>4Κ·zTο#"‡¬™€™σΞΣ„,ς/ŽΕq:ΖsyθΟ:½ΎΫω˜Ÿί+wwΠ·γZ‚ ΩωVίΕΨωœŸwώ#m½aΑαj β ΤQjmo‡υ6ηΠ.9FΰL#j&ύ’‘–2΅ E?…Πκ«λ8σAdo(;Υ« Λ+Ψ ΜNR9gͺ–Ο«eUpΞ•u«ΠK€ςλ»k±&·n܊“oΎσzΊ2p5}ώs_8 υΊ·έvΩ:Pά>»ηί’w²Ur ¬8οφξUSΐΤ_ΛΛιΡ£ΑΠέέ*"ˆ­-m!vpj­αΠΪ�©~Κμ*�Υ@`G-ΐi½›LΏK9Η)GΜ ά§:ŸQΫ°έ”Nν“=@Wλ¨8Η8pSέΆΖΏKύŸC€/»’š·΄šΖWƒƒd0!KQ~,L±ξΤ!η7ΦXr{f 5vEwWo<•ω΄ŒΓY̘)K™‹2œΞ’2l ΞΩ{ < "?­Μ€…Ω X1#iŠυ՞*.� ύ&€`ς(°έΨÞΉŒ½αsϊ³u~<ΏžeηFY©ήσ”'ξΣjζΝBΚκu‡»;cdΧ�ζˆΤξuNΩ’ά“Οqc P–¨―VmνŠξ;ΕyΝ§nΚ.2V}}†νλ:yž΅]¬bšŒlΣΒ’²2FΉΞ˜ͺΤ)ΪΥΆ(Ÿb ,ΐn@λ?~»rƒΪN]­œ=ƒΏτcŸ₯Ά«Χλον…ι‘H S{Ϋ`ž l°»X»|>S‰­#›‹v’ΤΞ=ώΏ―ί{ώuvXΐι‡ςΕ‰�Ρλ_šNΨ―ώρο\�­�αώ—6ϊŽŽ rθj? s+ƒž"qlEI R(7aKg+E~jΘA―MΧo]£MVEšZ ₯ΫΥu16½θxg/Φ.ƒώBίΧ(€ΆŒA<"$ΩtlψάPΤJ6« Ρ¨₯©’\ _‡ £ι0ŸΓ5­–~έDyΫΪιLΔC£SͺšΚHA¦BΊΒΚBDˆxO“Ehrƒς-‚ΏJž’T;‹g%T٘ˆ˜@rOwΩUΑΉΥΠωΧ /΅ ¦ η‚Γ½OKEiτ^ΤV…“ƒπG«D€ΝvWvΰέ5Μ…’*¨°±€KqY†kδVΐ ‘νγ[]ά14¨φωΦΰ?eNTΤR"7ΙϋΪΕψΩ[[€uΟ‡R(¦B�††Ζγ8­€¬ ‘‡UΆ΅Ά“ΗΨΛά—c€L#δςӡ۟ a·47šμΠ49;ADt8=zό(=œ ΄ϊΞέλιΞ§ž£^ΐm {°‘© Œ\^ΖnA6lW€(o(Ÿ¦ΐ+ X(΄PεμΧl΅gσH5Bf‰am# ™}ζΒάμ�"ύζνΫIΒu6gμ0C‡ψω²ΨΥ†·+"šŠΊ"ί.‡΅ΏeΤΎΫWoίBZM>‹`π¬X\MΓ"Fώ;؟εδύ5QνΪ½iεχˆl0ni¦•ΜaWGWδΜΉl­ΥΖq ά 櫉ΊKΥ3l‹­eΐ1 ΟΙ2ΖθθψpP^q\κ(2ΈPφ”Ήέ0Β{ξσνb ₯gΟψ<Š{`etl$  •šŠ:se%Ψ(Eo[,ΫΘzIχΆ […³C΄AεΝ;) Z)’M°t.t4"yμ& C*=ΩΦpν-1ώο}�UΪΊύ 5;6Σ½ΛwSCY}Z‘ Ž˜‘YΑDF:Qnͺ“-˜Β¬cΠΣϊ”οΧH ²ΪtdΘ‘-œή5Α˜,FΈ4΄;‰Ά·βμπ»u~gτŽι 9$ΫΒκπΦʈΘ4Ώ³½Σ)ηpc}—(“N?η“+}ηΉ»ŠŽ8›[eœ™;gDˆ€ˆ72��ΎξτΪ›―Q)ό Ξ-€ˆb˜Ϋ~Jš’asS'ϋ 4ΦiΰΦ•τŸϊ©4?9k ˜8…™/Ιg•Fwe˜ˆpΈ8³F(L½±¦Β1ω»Ψ"|ήh,Œζ7°ν ζƒU“kψl{g’n!GΦ€Ιε ηcΤΩ>�›žBAvˆp.νe›hΓΛΟΕπΡ@΄œF«t~)Ι‘Βΐx=ž#:ζR^σ˜ΗSδ§?ŸαΉ:6l’:¬r‹@yΚ m“1’bEtb~vœσJΤ‡Θf…|ίΞilƒΑ†\•Ξ<<ψyŠΜcήϋ―]OΟΏς9€ΖΫiPΉΨv‡όN ±„# hoΚ“…œQΆ9―Εε€L₯Β7vΊ)%Ϊgt_°ΘΦƒ‹€™™.V‰C`‹;εY3 ƒΐΗH­c�픐‡El³ηVΣ22ΫΆbl‹pΠά7f~)k₯Η ψ P **ƒύ:ΰΩΥ³κ₯k2#¬†.[A¦Š�ΈΔ™`DKWڍΑpšεwΕΘ³u˜+D’Ή~!{Λ.₯F ω;‹Υεqoe†ΞΎgEηYg\ Ι3Ga'°»ωYGœ5ςΎΜ³Ζ9«ΑυΡΙό[N]Ιkχΰαύ0ώ₯DταϋΤ\xghyi™?π2ζω4š†΄E¦ZžΘ+r]₯θύύržŸ�ž: η/ΏWgjψŸƒώϋλ”|ϊlό܁”ΟƒΟJ‚ Ξ ‘ΉΨŒƒϋZ”s†|ωϋΤaψΰα{AŸ–ύ3άΥ֝z:Θ‡GΞθΌϋƒχθ05―½³ [Εν8‡ΘξbΊJ(Γuμe7Š#δ χwύuͺμcίΥΫ•žρ…t�Αύ¨O3pε*m‡�›οΏhνtΐΈΉj82φΡQΦ° `seΏšS―C==5Ž]†C^oΰ(�ڏŒŒ₯Ϊ_ΞΓ<βα™WκΈ`Ωρ₯™\VNΛΝ:ΖΚ™d7ͺ«sε~08Β±Φΰ{Μωz~“ΟzΎΤ ΚΜζ„šRΜΓγtρλptΤ2tβφψ;m*―_M·,Ω{μ_Ό:N©ΊvηΌ™ οVξw 2σfgg|PΞXαΫ`zaϋΒϊBZ†ίΆ―Ϊ€Ε8q2Β¬Σ£3—Γί2 yR!9"t ™%ΒΎ‰γdΔ™ΞόΈ½O`W₯V1π2h%pΜ τ±λ{‰Q™β™Οžœ΄CA8λ£βvšΡqt?hvgHSYΫΘAαchίŸ4�~ˆΐp?j+ΰœžδS›ˆ±Ω)KΚ�“£¬œ·π«v§μ‚Π―ž]t@΄Bd―(+\Gk0ΈΆ²eΈ"5΄*ώμ‘ΣV˜Sv@ΞC%©ΑΥ|™Šͺ£+›h6f1η\€ΠNΏ@KΝΛηFΎΙζd Ϊ%E€¬»Ώ Ζ™ΜrMΝΩaΟΪu@{KΚ»ΊΫ₯Ε죨M…­"Ho=ž-ΐνoκωVηjW 8 κψΌΆπΦ.΄nŽΨϊž{Y%Γ)x4�Ώ«Ζ=ŽxΟ΄έ=χ₯υΈrΠm›€Χvv±%arΔωD6HT/X³cΫs.Υ―˜ž₯Ζ Η›=ƒ†ξΌ?a’ςΥq/‚„Θ΄ \ΈΐΟΧ™�„Yε>γK›d °Θΐη :δR�%֎΄›‘1tw]°΅D­Γeύ ™U¦Joa*?Yd :ŸΛ ή²_τYd κΈnΚ>m5ηC[μ„ίη£οΛ°i΄ΡVX ™ŸΕŒΧz]₯.χ_DNSπύc2ύ‚ϋ�€9Rj&&FIν˜γzY;I–„λr΄‰Ωv?»qτÁώ�©υrχίύΚ�Ϊκ+Ϋ€)Cžύθυ/Νΐ�ίϊzσ―ό[�ήKρ½Ο/ͺΜ)CyνV”†²Γ‘B8”IΟE @])α"šβ((Τίίχύt)Rs3γQ<$Zεtχ†Χƒ~?β€Π6 £FΕ΄ }€a©jeΟ dΧ�]dƒBχfσΊqΝO΅€ΫΤΘbϊ?�Ρ€χπ˜±ηЏ½‘<υzθ·έΡΣή ₯Fα­¦/mSγφΩΘ0Κ”| ”γ΅K©H±€AΉLΣ Ρ’έ�«’°P©z°όΩb‰*9rP™r ;•°/ιw 4QU£΅« τΖP€ωωPZ|ΤVU:ζ’ƒJ`�ΖβX|Η5uΈ8δ($…‚Ώ—JΘG™g I_²JQε£@¦Κ‡•ˆό“₯'π( z ΄BKښŽ»t§κά3 /aδϋσ,εΜ±τD«2λˆν" l·ΟmΉΆƒαaώy15ΡYδL€ ;PΠχ‘ hT±;Βx1€Ή΅e„dδ²65΅υ Ph¬ p=“ΒAρ(ό½n9Κΐί \i|¬Γ"ΠpτouΨDηλjˆ–ρ\œcŸgt !Oj•�e¬*Α1Τρ ₯Εψ—ΝέT hee?ˆζ΄m£¨Έ|TΟη=‹ζI₯s5Ρ1ΫΒω·`§Ρ±5˜7FyύU)U‹oίΊJ‘Δξ½Ε«–ˆΤ»M͘œOw―yc<Cγ80>˜―/νήΝ΄‚4Ψ"GXGδ‡Ζτ!΄F ,JQW^…‚f| u©³›άtΦm‹žΔ'};Ϋ΄%‚˜²�SδΊ ”ƒψ―Π©Tσ₯ρ³‡A’sξΉχΛ—ŠWΗCVΙ2 ¨’ΐS %(ώΎΈΌ0Z�͍Ρ™βBe¬ϋ€‰Q_‹m�ό>Ÿώ΅ŸωfzϊμQκξλ‰λ|L}cΦ!dX}’mR.-¦lŽόI~fΌImwžM1€€μ�hπ|—a @ZΫ@piZ�²ςΓΆF#wω£ ‘Φ―1Ίζœθ°Λ$0MΚH²2IκΑŽ,0:pΦLSuξŒ„ηI[fήd†ΤqF-^(΅w›{Ÿκ„²_¨Δ(2zd=ΣLΠ±ͺ"šΡΪΥΕx¬ypΘϋ¦N8VΧΥΘ’λgρΡKΧ�!›χ[ΒH.#—ό)ϊE°K @Π@š0G=Œ|9©�|y¨0β¬Ι“σΛτ Aͺ֞‹ιύη¨eC«H ζυυ₯ΤΩΣηM―­­+ $:/ZQUΎͺάλσΣD3™Ks»Ρ\sO9ΐœ{N4ϊέ»ασΜ¦Sω{ΧΕs$PλοφΠ=:De€Κ[Ο›F™ΞΏUι2Ήn²Ω]γS‘R±9 θk@Ψγ»8τG1Ρ¨už]'–σΓ΅Ό§ηΕ—k«Q©όπ}Ώη�ρ~Œρ˜~α3(\4¬Mι8"/[—^’μ‡Ω±ΡhΘŽβZ:žΤEΒ ΥΙ�ΐυlœŸ#ολΟδ9ϋžUΐύΩ—χ?›/�u,ΎόΧ―σkω½ΟδίϋsΛ5�ΕΟωž?{ΗƏάC  Φg²ƒάk)ϋίϊΦOS΄¬‹‚m]ι捛DΎ/„Εθη€n ΎcW¨ίmx‘Ύ ΉB€©ΩpИ€kΦΕ1―Y₯ΎΠ™�ƒΞ§4Œψ·΄Άς.φ@‘ν«°[άΫv*±0‘υA΄ ‘υ¦ρχ¬ΝS�ΙSΨbΘk‹άZΑέΘ! ›L6zuηΈ‘ρΙ4 ₯b1Νj~V&”Auθ0UmMvΦ'ϋΑωw¬ξiVχ‰zE Ι(*ӈώ5"ΞΏό Όœv^œηLYKucόαΘrυƒŒΞ:Ξ²rΧ/#εkΨώ]Υ'Ρύ,}€}ΗZY�£ έΠΒYo¨'œη³ΘB_ΠΖ”gzΐ[ΗF=θ� ΠάπbXnžCΓcœξΪΧNΝΜ¦‘‘α΄D»_άuΔ§ΐYΦέΐz ‘ξΙί©Ά{ŒAλj9FLž§ ιΫξY_¦Aς=uΉ‡Iωjg—ι‰a’Φ„ABš€¬ΈhϋŠMlM•m(ρ[['œg�0­­?±ƒׁΥ)Τ΄π£φέ‘Ο ([Š]ΕTρ·΄χk―Ότƒ?Μ σΘ‰ϋΡΛ`σζ|ϋΫΏRχ·~β›�αΖΒςΏ^^Nν2΄=•‡‡Ϋς›]$» Π‚ ‘_UJ@gΊtΉhPF&»‘2;7Π&?κdK3ω{:2όξρ“GP£>FaY‘ΒSC[QF•"ob,­n :<4AžΌ½~· N/€οώ“?O»λ D’ƒ•©§·’U `€ΝDwEß<{F^ΫΣθΩ=OQ΅ux9ΩZζΫZΤπΓϋPΐ8 [–!)·€Ζ²ΧΠΐτZΥήΆ‡x”TŸ Η\Γ0 ‘,G[£2Ί€PšΏ†‹’α°Γ{Π*P:d‚`fLΞAΞθW @k¨ :ξ­’χΎ�œ5ή5ŽBas ˜r½(ΗZ¬RA‘ΰi”ΰΑηLMΰθΗΌ‡’G WθšrbΑ>�EΩιh­b@o@iΣϊŽ~νVΠΥh8CyκΒIφw*²cώVΘt!@¬P»ŽΓ\ςΩH£:EΕa]λ{―BƒΔθohM- 5ιΚ΅ικ-Œ4’ΆG«Ζ@pOl.Q-¦ƒŽ²QJ˜Ρ�²ϊ6”Ζ ‚ΣΟ9¦=ͺ؍7BaIvgVPcŸškP’7V)Έ‡σκόρgaΘιψ©\6©,l Eνuן=’P5S‚ Ν•­*=P%e‚U"eΜ‹ JJ€›Β» JkDτ0p\s ’,~'Š-MM_#TΖ€=η₯�i˜¨0λκ >β8D€a�³�Ζί•«WpbtΒW5š[Σ΅«7βo­`sΑ;—+W�‘wz™±ν…d^ΈΘy΅’Q+kΤ‘τ+:^θp}εΜω`*΄θQTDτ·t<ωžs°ΡμώΜΑ™wμF^¬α>0 ΖΚ؍ΘaokJ3ilz" ύ₯εΕUŒΞδ²ۚΪq˜4Q>D^*¨₯β|.Μ.±Ž�Du”u"₯k;‡}vΪθlΓΐ|³ΐ—~"ŒΕΌαMφƒ9xΦ=i$­ι[?ϋ³©�±–άΞχc� ΄™>εωΤΨ·ΈΖ² €gνά‰q=}.»«,ΒU†Ϋ?½Ÿhυ>¦wΤ‘’AϋCάεT€lλξοIZZω™Όt€Ο©9’…K³ι•—?›&ΗΖΣ;o½Ζ³ιάΰπΓLΡ¨2—χΗ€q–5\`T°/˜W e«i\₯DυTώηX5ϋ€pˎF’Œš !‹3ΚΟ»€n:²�ησX+©Ά@¦$iΐaxθΔ²Α²b>Z€žΨ @V‰Ρ―}½sŒξWΎϊ5Z/2ηcΰ!eqθπjΈ;ΩώΞ¨πΚ e Gψ2@@M•ͺ©&έΤ�σͺ•’ιs9'>«Ζœ¬‡;χž‡EBίμΡAœ'Œ]žCJψΐΐ•΄S`uiŽη²ϋQDΖba4§ΡC/#¨ηR―εΒgΦΐ¬ΐAλκ!Τέ ψ7₯*K/Ύόr8Ά:–5œΧΓ•kŽΡ2Žξ1²cašzDƒ€mPoœmζΟΟ+fΒHc Qεš=¦Φω(p>"άo:Ψώ,``TYGΞyVwΉ>Ρ“=�>š8BOΩf6γ #ΏΗΖβΐ‚Δž£(p†γa-Ÿ#RSd)‹b›σλΛσtώrŽW9γ—ΊΚ9σL½μΧπάα_uK]½…hq¦ύΞλ:μ—ώέΏΰύλί{3 |£˜‘bδdπςœΈ½v΄ γω‹γ8��ϊ^Μγ9�ώ|�8F―αϋώλΛuX}�ŸσΊ~ΞίeN±ϋOY›Ν·ςVΐMš}3ύΣe( ΨΛΠ3•Q£ΊΩθ‘ταUtÍ+Χ‘³[ι΅7ފeͺ©£΅iH8#MΨQ‚σ›Σ‚’Zϊ‚ΘRΨ­όο™Ζ5ε=ΣnΣfΣ‚Άτέ€½¨ν ΰ'0'ψg™nu΅Φ‚& @4vΫ κ@©Μ·now?«Γ­Ήώ.φάL4€δ}ό€άφ₯•ψ�ΡrάκAηΜ΅ΩD‚4³»wn³(Fh°‡σ§ύΒƒDPΕ:ΆΞ=oύj]ŸH™Ώ“\kΪΰ$oόS§Γλœη:«οƒδžπηZΈVΚ8™Ft O-Žύlt„½Gq96ξkdΨΘΊΑ™}t’5¨β\“2(›L‡Œ r†lέjJ A¨χ²-κΉ4EpΜ”χ³€­Ϋ5δc(πΜσy<=† p„«stΊά[κ A‡Ψ7θMΧάσΎe} ΖxŠΎ΄Ž` ί…ΦφxξIΖς6κΚ*g»δϋlΓ�΅ 뱌�±H“Λ³fho*=wΣe€Ιυ^!˜ΦF‡q+Ϋ]ϋ#ΗΛ―1/¦Θ*ίά¦uzΎ­5#»UYŒU6πΤδ2΅ΰ5Χg½ πΉ―|&χˆσcτ1QΪKΨOΞΙ¦5 �σ�πfΆto™-#,sθ ‚ cbήXC#τΆAφΛΜΌuύ s�Ν “j‹±ρ�`3e9ΊΏ0ί[ΆρΊ―šV^bώ=οsΌ– Δ@4eX&#,μ�½ŸeI::ΰϋθ m'"K½lc,₯0Y­?c] ‹…€WΓμ°ά₯Ζ «Oκ06‡vc.ΰ“ ’-μ1†ΙΪZΠ]δήb6±M eΓ†Μƒqφ‰|’±€²ΓvYNž ’^3ŸςοΠπϋe{h9.ΠCΑDΦS9Α&�kκ†@L?Ÿ5R9Πu>ŸmƒΟ[«ƒLgp_Ϋ…ΉΒu]C•5l�αΑ!ΐ …Θ*μΩ¨3€€2Ι"Έ ŠΝβ”²ό0άHi―)9K·.u�ΦΟύΏτKttωύƒ³αίώνίΛPj7ΕιλGΐ Η¦*ώΗΏωŸ}σο�;ΏόχηF'~ξBkg~>‡byu)M φ`*€Fέl1XŽQ|εjoϊΤKwΙ«ΎIεύ‹8π{«'=dQηΖ\«ΥΆ΄¨|K#oyž|n)υuˆτΟαHЬβd£xB±a1pŒπŒ O¦ΑgΣ°h»36uw.½�ΑCΉu�‹a[–Ÿz�v¦ή‹ν©ˆ΄†zΒKOηέ·©’OΔ‰6~yPΩ#Gk aΉœε%}πaά{e/ƒAaΡœ)K²ΒωFi‰ϊΫϊΠΓζ!�ΉIe¦ΓΔΟ>«9Φ8Ξ‘…φT„ζθ9q‚�5ςπͺ)FV…ΰ=‹œo­GΊͺBNΑ …Žγςžώήh«ΒK%‘rRΠλ8©,™<„°‚ΐΨ5ZΚ†;§ͺŒνψΐ0`"‘p‚u9τRΜΈjΈ+8Τγ#ciaŠͺ© ΰ7΄ΐ —ΰž*a!Q)�Nΰ@oT„aE£~”ηŒΫ³E`ά±„~)Ξ‘Sφ½ωΖ{›8Χ­Μ£ΡsΧΘ舲Tͺ½ We/eηΪ’ΉΟ>~ΐX S{wWΜΙΉμυ,Ψ₯ΕzCΚΛ γ„SΙͺΞ•`:ΜKT’_˜›ΕY[ηϊJΚJ n֎]Ζ―œΡy#u³ MδT7΅"χט§�ΤEݝMt‘Itž= Κ…mdΌ)όr5#[‚'Fθͺλ©²œε™ςω)̝c5βζœi0–"N0ό-(jn¬ΰ€2HL#Οg5R§ό0(ζώt<ΠN“ώn{FΟ·z�€„bŞUφŠΊ+ξ Ξs#EΆŒσβΛ{©[όΧΉt޽§2ΗοΥmηŸΣον"20Π_V�n¨?d/¬Ζκδ ΒXlυ€ύ£ClτΛθι.gΐύdΛ3υ§χτΩ:²>;―σ19ώCηη|ί1ψ:�[Ώχ½σ±ϋ―ΏσuώžΟδΛh»ΏσωόΧί;?y8Ϊž~/8₯ρ¬<ΦΰWάΈq#υυυ‘R+ΠΕ³₯ NΣrEΧ Ζ[‘~ίάoΞ§:άuχ9Λq²λqΤ›:ϋ²£ψ λaGAΑ+α»6Κή‰ΙIδ―Ξ�QzLZΡgΝ*σΠ±•7v/°@§ωςλ²LWpόέ]έΡφ΅'™‡cΏ˜ΠՎBΘυθβ2m2#Ή΅K̝—ˆ Yg ”Ξ^μΖjqέbjΨΩΙBΦΆωu~γΌL»³₯ΰφΖ²z‡Γ Bo_Wϊμ^B―STk­­,Α0Β‹B˜ f—SΟκu`|6Χ-Ϋ'j$+ςΧ="Θ²ν68ψ, b§Œ‘{ΎBgμΘ`pi�ΚΝrΑ9uοY°/X †ζ{»Ζ\yθ�Κ RY§£=˜ΤΦz6N #nԁœ7οŸ+πΑύc3%¦λz ΩJ1g|Œρ μΚhΚμΪμ.νNTθKκΥ2κΕΈS'Σώ燀ΧφΌHEׁ…Ϊœg9δlŸ’swΠΕ:˜‹Ρ�y(sDY‘K°e•ŽN·οέJŸ�βη"ζ4Βο™<±“IPτY__•¦>χ…t±·?Ψ)«+ΜρΣ1ΐSRŠΙA± £²ΕgρŒœ3΄5΄Uk|Ζ€yyœ/mU―]rύˆ‘yΔ| `Κ€kABAΪ₯2ε#ωž‘ZBJI�“©SBGξ�ζtνJzώήΝτ� ΟΕώ]X\ ζgΞυχ|—±ŠΪ\£ ’k(Θcimee€g>=κVt­ΊD9UΔώ]#Πδσh“ԐΎΡ K�ύYŽMsλξέTu‘1 γΐγΗ ™R‡°;½GM}C,WΧ„*ΌΧRι0Aρ”ΓΉ±htλ„΄‰‹8k‰\*r‚ΣJfu �j�£@ H’θ₯‡Jf€�jΌK=Tψω³ŠL‘©cβ!wΐ’‡η—T΄€3ϊλ5wp`5`5γ°ς ΒEcΓ9VH!cbmTζΖr-–‡1gΖ›-pόΫ<ιωΒ0ΆσPš\» @ zΗr5QxiΊ˜KaΜjπ1ξ Œ™r’΅"ϋ‚γO¦ήό(M.0?{i*ώ)s_ R‹<θ`jB“‹ς^YšF™’Κ(PΚή;Ε)XY˜ΞŒžΥ0zΉŠ»υv—Β,:sRž€Z€ΚΒ?φxΖϊΓ­£·—k’ΐήΛ/―%W „šΟ»6§VΦφ_s� QΞ*©ΚFœό]1Οm1Ώ|A”Ο¦ΒγIŠ%S€�P9SwΑΑ θsˆΧΗh·s―Ρ"Σ`Ή5M@gL₯oŠ‚9ks΄xœ™6e“9σ³Z*žyͺx鈍λ§αc Πΐ…5TύάQ0Α,’FυLˆ< ΤJXD}ψ ŠnoC3["…Ÿ P†Ε"ων3 ! ‚ΥΠ0ΓΞ �ƒBήή'­Œ―3­β�xΠΧ@Sy•WR­-K!bz12_ˆ>p-ΆbΊ~υ:-$-|Z XRK‘Sœ<"ΓO'¨ π>μ’Ή(0)‚ξΈŒNxžΚΙkonkN—n^‰x`έ&ڝΓx-΄h; ΄Ή72�ΦΦJ‡†fΐ©Ά0ϊ¦xΟΒ”e|i|³?pVmο΅@­£] W±VΘ‚p0XG•³/�=�>’Ε<»ΡΟ$Ϋ)"^Ά4χ½Œ56�;'xΧ_²Ωm›χhδYμ™Ϋ€&g΄h‘πΪΫž&σμτΛ©ΆΞ~1Β)ΰW†ŒMΊΧ@@OoOΊγΖ4‹Ρ.ΪΫ’"U3ΗGΜŽ΅i2?ŒZg-yϋ’ό Χƒ~†GŸEtY37Χ4@͌UYΟξlo%¨ƒcb½›s{Γ΅ά(ρψ7R2Ά‰zfxt”χh΅ŒŒΌsϋNY΄†Œ3,ΏΧN’–mqΠABτγ]Ž”+‚ͺ3γ8[D'χ‘ΖoξS3 GY†λwDΊlAAηΠϊL�Τ]?sS KΎƒφύu„­~bΓΫByiϊ¦,Suβ_d<“³.sMΫT/·Π€ ½—:�₯«ύΜc9΅E@φs�ΒΔJ~@E€η“ΣMt‹|tφ‡«Ηω2Θ—έ[J)υ€sλx#•€ΟΚxι&m P‘˜ΎΊ γο”ωΨά$ΰ΅Έ`—%μ›#μ)jΪπa/ΙN8eΏκP‰Φ&Ώ~ύjκκξ §o…υY…1±~_#X692§—3ω‚œρ₯Mb„έ35RΨ—[Θ±%t†{ξΡ㧬[[d:cίξl°Χ}Ψ~N5²–yŽ+ͺφR_pKΨw¦α$σaƒ^~―=₯Ndψ±·ͺ¨χT…^n³K˜{ή"ΎvΨh fYN. bj¦]hδL!‡K.vc; £[Β.|φ,ML³o°KΉŽ v±:]ηWF΅8vτd]ΘΜΏΚ_Α Oš"mwΧK9ΰΌψ@²΄˜@ 4Ψ‰ΘΊF ¬_ΎlBτx1²υD]“VΆr Ÿ9$€a-SΌ”gίY1•Tφ–zΜEy΅¬FX;Θ¦jjζΨ9m‡s₯­(μio[cEΉ(ΈξίGΧ�«Ό2%ΐΕΜrΌ�‹²Ξ”κ:φ†²Ζΰh€•¬»sRΖ‰Lθ»π4Θ#%ΛAέ#θ₯~±kχ΄0ψ‘]%#τ Ά½ζ³Y]­ΎŠΏγΒΥ€pμβ“Ύ�ͺοώδWβ?ψύούβΰ«―~‡‘ύεyύ•nτ΅4�ϊw~υ7W·Ά~₯³�bΥ (₯›ΙΆ†qΉ‘±*ςŽ€ΓP"ΘENwNΞ Ίh?qύκOqΤΜΣI4:ΈΌ=D؜ιΖ τ?¦`ήΜΜXκξ꣊π}ᧉρ6tχOΠXοFΞΕΎŒ‘@ϋ•žˆτΡ¬-U Ewχ…tϋΉ; ~·ΘkΕΈΰPΫχ•K€ζׁV©ρ΅Odf ΖʞΉqY^ΩA°J±E3Φ¦ΦvΪ—a¬χφ¦KΧ―‘–’s׎Q‡A`ύζIΈEΎγ6Κp…²ΛόWΒ±+˜u4ΐΜ/6ΪUGυu+KߎBˆ <’G~~nj…nhΙ΄΅ͺ²‚*H Ý�ώ'J)zΒΕ'κ,˜₯³rFτΩξvžXΑXV™γΫεόΖ΅λ"eœͺΓ#luLl±ευ,J¦£n]£‡*ιk2{DwuT­^½@=iςξG£A‘ΚΒΌΎλ΄Y*ΐ Œ£άUB‰8•9Xh-*-χ§³ ssg8O«€q+KT}η³~~‰Ÿ‰Žƒ*ŸςΌga[ϋδ˜rT€ΖΪΒ‡/ζΐ¨»cίΧ°Γψχ9·Q‡ŒKγ˜Gp ”œUΥeQ [#k•gΪdOiDθΨ• €—8—…€-τυυpvΜ½,ΰΜΧs’τΰΡλcR)H£πœ @ν€Y―Ή£•Ϊ°#ͺ Σ½OέHΧoχc`Q{ƒghmlΎθ'μΧ•Υ9œ«RΨP=αhζέG§KW�¦—?σ™Τ;ЏΣV” >!mιΓL,άvOaS ‘ZΐgjaAδγ°ε½=₯Κ²†k.ŠUΰLm­Qΰ~=<1g™TΞ^=Ε“¬ηRF§S Κ–’55·₯½3η�$½xο.X#kf'"Œ›Œυjϊά+ŸΟr(‰3}ληKΪ#kΞ:Xs’ˆvI¦ς,㜾χρG© Ά‚Ή€Δ° €0σ1ͺγ3:"Υ8½F™t4]G-? λmp�•%Vί,ŒHš{#hnfšσ` €@— {M€d`j“ΟΘώ¨ΰΎkόΎˆ‚ŸΟιΛ鐍“£|Γ©ΉΥzω(PPΐΥΐ³Ρ6 c’hΎ­=ΐΚ@&/ς,σ0,q†tlΝ•¬&½I†νw•ΆΠςΜW¬XΣ$ΐR�£Σ(#§π’Ή•,죴}t€H΄‘ΰ!²πyεΪϊ}gΊ†–Š5uΝΰΞOŽσΰςΥ«αŒVRΥ3ξUXX:š„žη 29i B¦Ε* Ά9Θ:«Θͺ•Ε4Mw]ZΔΎ£EΌΏηΪgΆΝqΞq^ίΥ+©‘ˆV'Μ½›Οέƒ•CΫS]eσ©Q{ΚΫA.KΣŒv½Œ$νqΐΟ„­@e#(gΤ§yΘ ό‹0feΚ€8aώebΙHΥτιO=}!¨ΰΦ΅ΆH‘μ% B»RQpνΙࣴ»ΈL7xσ7ΒPώ™Ÿύ™Τ†]πό‹χHΏi¦-#X;u…άc‘‘_�eʏŽΏŽ~¦σψ λi½σσ•ΑU€τ΄Ά’Ϊ€»KtkΟ(>k%hξ+‹:«+3©Œ1Ε@9αuγχœ lοα\˜"•΅Γ1εο|ωYlΑbσΊ~ςcŒ'φ§ui3½�ξϋΤ)OΟέΎ‘ώœ…Z€ΙRΊθΘ‚|λχ)Ξ܈AN1γΪ8†0Ί½6 .₯?Ί§ c΅%tNLνΈΰ½f€ΠZ4μ£;…€†xΛΉ�lƒyPό£¦{ΚTλCω|§Κdœuφι6kŒΫΚ^$xΑίι”SθΜ:~Ώl·' �Β43EΓBhζ`Λ ΄Ύ‘ϋJžkεKΰΦVͺκC~…όFΆ±we4ω»Ο'ΆγΘΨ3˜¨2Z Sϋα�₯Nt1,…rΖB Σ0€tf. ³š±ΟX"Ž?φŸΆ7ho‘qXΗ9‘1‰­Γ\ZƒΕW2άfa)�£pu ^ ΖΫΕΙ‚†²$ μςLσPΉχΠ#΄Ε΄ηg'‡kœΞMkΤΈ:ΑN, ’ck iΥ€edD¦6Χ†ν»ΆΌO”έ/vYs˜ΘχΙΙ ΫΗ ‘‘tν@χ“)dξ5 YטσέΔyζ hsš9‹¬™J= €<σψ±ΫLiX„α΄H€ιΉMŠ>²~Ψ”Ϋθ—3 ξ1{F‹‰Ξs8?)€Κώζ<Ο/Y^aΎhυˆΌ·Έ4rS--~‘­…βα€=0_ΨzΤ¬ΓJdmΒY&ΒoΞϊ25Wh…ΉAtœϋΈ'eΚͺηψΉ ˆΑ‚eέ’\Sež²π}hκ„…uHMΰ7ŒWΆηΰDΗ^•€Τseλιηξά™»LΊMaqNΊNΚs7`w}u!¬ζžtσΞ ˜VδτΓ΄›– · R‹�­�Ύyœ”Χ�ΐ>Δ>˜ƒωγψά�ΨοΚΗ`©χ˜3ν"YoŽ#XΊ\ΟύωŒgΨγLκLΨύ$—½%#mš~χΏgb½»Δ9mƒ™ΦΧΥ{x›Υ΅+Ε?ixοιξ&+‡΅uό·ξή ίhύαΪYxx ΫOΖ€θκjKΨΓ¦F°±ΈŸ2Ě0žyε§€‡οi šŠqlΰ“/}5;΄ν²v{ ‘sΘ^‹‚zž”ΓΊ1‚'κ‘CτΆl˜Bτ'υpΓ�±Ά —{ΉYθœY@r»uƒ±ΊΖ‡Gψ?1·Θœέ]Ψ9舳ctςαϊό΅‹έίώOώή―�ZλνŸ}υU7Θ_�Χ_Yΰ`θl¨θώΏχΛ;{Ώ΄΅Ώ—WCΛΒ«Χn‚΄€Τ�x°8g ˆs…ƒ B,―,ΔΨx!]Ώr™ΐΖΘΆ(™ΞP{k'”Ί&ξνˆJθΠΝIΥIͺ«mŠ‚†³skΫ³ΰ|rDU~*y£«"Φ:O›•‡U…Λ…†Fr£[πΆW|”Žκη8‡[Λ'κ]Œ8…Ϋϋχίcƒ₯Oέy‘Κ cΞMŽ(RCˆ §\cΣάh�έηp5’ŽSCΨφUVB–’¨°Ρ9ΝΙ,Z¦ργΨ}> ΡT‘ΥU5z‹ LA#…ΚΓ/*οKQ‘ΰψuE1Rβ܈όUΆΘ‹Ž’σdTPcRpA4RΐΕρiŒͺdύŒ�~.ηΥφ=�ιŒFkˆ*x,nR ΛΊ"α˜•‘;Ά‚Α»…3‘U`uvΤJδ}vΗ§R4�”E²υ*Eqz?ηΓρϊ9+p‹κ[³b c›5( š] O}K+δξt Ϊψ»›δž1�+sΠ>ƒ9€#Š`ς™€0zm /λΨφΜθΏΖ–θ° FM••0:|_ΦΑ&N†κ©QM€ΌŽ½{…?zΖηqψ¬σΖ‹pΚp‹Β >η'Ρ}η]cΐkΩζS:�ΉΧΞGfΐβHςœ€Y42�©8‚IζƒΩΫyŒNΎ΅8’ξ}kgςœˆ²7²·ΫΪ:0Όͺ˜sχ@ ‘1A+χŠη+’EΌw±�"Κ΄šΟ,“#jΥuσm-e�œ­&M…0ŠΫΪή{fjr:MR4Ν½iΔ4ŠςΟ₯―G,¬fNΎ΅tΌΚpڌ²jœmp/gΑ*ϋ(πZ’pF€έί±�˜j1A˜Q#ŸΝ3m”ΦbLLZTΩ΅XŸΛ+—/³~F”ψΩωϊήλoPΕ‹_ ΆηWkυCΫΎΔΩzΧςŒ•ι2©R5DˆΔ˜�αxΙ’Xž_bŠs³3Ρ�ΓD6ŽωΖ‚i‚fΜ‰]@—˜Sځ΅XKЌ³žχβΐ@΄΅λδs›’ύ‰&ŽΣ³ΤGζB‡Μ=Κ·°sΨ�(}#JΕ¦•P'‘9RΜzYπL;―€ΦzΧ(Λν›Χa>ΝSΨμη“Βr읖 ­αΘ51‹¦-l²wž >ΔΈ5M¦Ά”ψO�$YdMwW}ίχΎοσœη,χΉΟ9d‘lΆh žvA;αYΤ.αLΩp²σε{Ζ&&ΨΛΒτυ_ω{|˜ΎρΝoboΙx―-αڌ‹ζ~tΌ_!ΣVLΠ/Rσ‘­7�‡<ͺ«,kY^^HώΑ‡kτOb-» ΐ=γΪ{ϋ( Rπƒ\¨'[VFfΤΏ«γ#PΰΙeΨ¨Kτ?LΈx&bμ+ςnRΖ Β,όΐΐ…vŠέ²΄Ι€ω‹ϋwa lΠΜΈ8(,bw ηZΨο*ΐθ͈Χ)'Ω$ΰVΎdψά¦Α:°)υχT"Kφπž ΅ƒΪ>ƒ}K<ϋ&4ΚفE™bφAz[‹ώ·D’²ͺ(uАΆ§― pΈ€Xh—/b'λͺRGWߝΎGΖ“ΰΗ Χ}mαΌkw z–ΙΌNΠU~ϋ5 #ΟF†ό}r:|ƒ›―ί gjr&ς.ŽοsfΆΙž`ΞHpe"[κ$žl+π˜!Ω©΅‘‚)U©³₯€S·hZ ;μ Ekssܟ ?­,™ŸeΝaKΚ>±§υΦ> Έ\ΫΡ?ό lŸ`”ΤΊ` !cžC”2r‰_†žMς5κ)�ž QTY‹]'1„ό­‚,,RΒ¨ΒB/8:©bΐΦζ}ΦΕ;R[ͺΰ»@΅»5ψ–-x_Ύ»ά›“Yzϋϊ"iΆF?…#τ"¨G”°IG7λlpzH£ΏmGΈςαϊ’–κω§>΅ϊFΦ’ς`F\Β€Ηω”ν‰ίΑ-™@τΪ–lšν.G.,MˆsΖ:Θ<πΎWρ—W6dθSξ’€iP;ΕoD)”½ZNN,’4 @A@Δ Fy eFΓ#μI¦¬GΰS&ΞϊR&‡>ƒ:AFŠϊ2μ ο· ’ε>£φά�ο ϝύTd­|.Ά†kλgτ¨@бΚμΑΑ›0p` ΅ΠTu?Φ€ƒM₯τλWΌμ²J‰A·λ#xSΦdJΐΟk<?W'»‡ϊ~ΎΦ)e₯Θ‹ Ÿ]9V� θ θK»^‚bΘ�ϊφϊbξ•zKέ±ϊN–+V¦dρώΥ+]�ωΏϋ·ώΟXΣήΊώm~ϊσχ…ˆόb~ύ�ιVφίώΏϋ;Τvv9’ζΙΠ Σζ8Έ< Z‡άŒv!H°θSB¦ λΥΤ§7ήx4~6 >ΉOPΈΩ,ι�"¬Q3Qk€Ζͺΐ <|–nίώœoσ?υv‘xqJ«ΉItd Θ’^‰ƒo^£Œμ¦4dΑλψ­7k¦σkiΖk’lr™FwŽ )O¦ηΟΗ4yϊ‚‚ͺP8 žΏ]Λ T*8ύ:NiβΛvsηΩY]ηηe3΄Œ£c“·LΦΐ,·ΞŒΚΕ¦vήΕλADq>\CΚEt^Ε+ϊ’UΰαpΆ^ΠΧΛFπ`J…τΠκπ¨lό™h΅Ώχ*mZGiϋhκ¨aΧ™ΡˆYηΞ ―W 9Yc&¨ βQ!­Bί ΨfΖ­fw½”‹Ÿιλ4θ: ή‡»ŒŸ]Δ=θθXΓ\@ͺ‘’–oη_G΄ΜκμβΫ― A{¬’ +b”Y%χ¦<ΊnZΓs€…‚f.EΕKΌχƒΝ΄Έ4Ι™ΙЧ°‰ Œ·vΦ†λqόZΰ8O`vH¦vf~:dg~i."ΗVκ}W)™BΦjjkΙ Όš::˜”γ:6Ζ³Ρ1Q²G2 8ί1}Yπ™ŽN3£λ̈©WόŸη›[Ι’Χ“½ ;Ž3έ@Fktθ€»z₯Ÿΰ₯< ?'»ΥF ΠΫυ'₯Ο[+<<<œζpΚ‹ΠSoΎύ%ΞU1ŸΩ@έLY@#Οy^ _ϊ�—‚΅`°j`»ŽσmΟυ• Υ§«Ξ©ojnζ\`μ |Ρ>‹ΑτώU¨ͺsΣrΊφ…ELqαύRήΝμyt„#€ κ‚B¦3—Y²0₯8m]Œ¬3°ζu�όΟΎ›–—�₯ήφ•ωΨd.œ R€3‹x’½`U"hδoκk^•Ω ή»ε1κ�MJnΤ32ŠΌ‡MtV5{ζ» pΝψθI›ŸeJŠ4JrόωθΰSgΘ :7zΰt’rΙπœΑ €–Ο>ω$=Έs;φ‘’ΊŽ½Ηρ(α^§'°'θ‡ϋŸή Oš²Σ\ζ¦FΡcΉPœ ςόό=ΟeTf―‚₯βτ)y&υ΅zώ˜³pεΖ Φ·(έϊμ6R~l‰ρ©ΙԍL8ˆή�ΩΤΜ«Ζξy/žU3Z/Χάg€ΤUΛZvΐ΄ˆ`„ΐβ>6₯„ 4J¬#μ^ΉφJϊυΏφλιλίx/κυg°ŸκͺΟ>�ŒsVΎώή{8ϋτ‡aοσ·~ FUSΘωΣ`N‘ƒ―~ύ=ό€7Ση�ο}υλPˆ/ρ9”ΰ`7σ Όž�π€7˜ΠΦ τdϊαKΤ οΨηu²ΕΌΞ _‡Υ†Δυμ[ gŌu̝2Ψ7�ώoύ{αμRJ)-Ήœ²0νΐ1~‚T;VΑgvSgSˏΊ»ϋZU”Οΰά·wt`£ΑΘύ°ia€tMJΑ=r3Ά;†œΏ�ΑχXOϊ<ΐθ²ΦWp£›a½q€|Ψ>W1yu<αbM&&" G^φ7`G7ΫΜ̞T*ΕD‘,|ƒ—lφF;fΰ%¨ΫΧΣΆhnvŽωφ30V¨=¬š"π‡UGγC²&EΩ7GFΐΛΏΟγοΥ•η°ΑΨ+Ψg\S?ͺ—σ¨NΦw²�\{γσbΛ@πw–1–r.ςΙ^ͺέυŸbŒ5zΟ’QΛΥc…ΩŒZHέ]?Ϋ§RμU->! %cB-+νμlgέ ±ΑϊŽQ…Εή:&Ωs‚ϊΗ0Ήάσh–Θ:ΞQ[οHΈ ‹φΡΩ€œn@ŒtΜ€Ξ�:ΰΪ LŠ΅ΠGξαΑ΅`A1ϊΌ„³–ΟZζ°ξlόXΛ™xw@mρκΆτΥΏr3υš­ε^K‘Β—π,ePπΝ—3²„ΜvUA"Ώ/ψ™δžfWœtH>ΰRΊΒ&2έξν[’‘!VΉζ?Θ¦ ϋΛΊΪ›  =F?1ό;¨ϊθAbwžg;8EV'{*Ώ²υlpꑐ» dάgπΓ4$±_¬Ÿ, §;θπΉŽ<ζuR!έCχS°BZ§ύ²³vSKcmΊΨΧ ½S'‡I͌U$γηuΝjCkv=ΝΚH·ύ”Šiπ²C°ΉA¦v“ŒΧLλŠ]WoL…χςΛϋց*!ƒo`—Q¨cȝ₯qPnœ_^o¦j—2™v%w͏³ ε±Ξ�c(KΦ_§έ@ gϊ:θ±τJ»_4›1Z]¬!Υ(`π₯,kFAΓ%0&rο¬aΡhλŽύΣ`Ϋ{‡Βιηk»γz�hξμΉ―:΅fψ•CΧά΅΅.Π€{Ž`Ocθ{# βZΞ<€[$˜\5˜ΔQ΅§‚†Ošωμτ ―—rhέ­Œ— s&§€pΞ‘ΗBωa}ΥcδΖl” Ÿ >'λ#=ƒj;m"šέq―Κ‹4G ›i™υVŽ5d3‚ty«ΚgύΕ%Ζϊ 32•ξΨ”Dν™#ο>GΩ1CUAΆΤZνŒόmγ Tαμ�P˜)j$πjLλ{+©ζ£8Ι(gΰΤU¦§£ΟiXT“�Ώq=Ά�φ ΨšΩ?β^ΜJΩ·.}l|,έ½K¬uΚ8¬#δtΕ>³ G;tη&.Ξ„΄hΟ™eO‚<f§θ K« xNθ½±ΉHyΒ5ΐδ,ζΥ‹WΩcjYqΦkΉ·iφ2ςm­$ή|λ­TŒCŸ#+ΐ;4=–²ΡΏρ�Ÿ·‰3[&¦§Σ�ρ§;ίΒ™ΐΩΗΩ¨X2Λλ^”QKjyMΧlοΌœΰΑ`A€6#wΚΌσΥΙήsŽK81κ }kfΝρ}첇6κsœ™Œ„]δ©Ί½%΅C½LΌΞΙ“ΑΑ8/6_Λ&ßΕgΞ ­°νΣy:r h$1AC'[ΗU Γΰ„μΆŽ.KJ]7vΟ!`ΦΤΨπ ΐ:F™sΖVΩΛΖΈ/ΟώΜδΆ‰>5:NP‘_Δ\ϊθƒ2Ÿœž<Λά™6ν ΑšN1DožWgψ€©&CdΚι•Β/Wƒ4ψψ)η—R(ξΥΐ«²Ί>}ώα'iΗΥΜΦŒ‘C‚ςΘήa‡t6?v†ΞΨD'lκdρΓx>³“ Š@αλΣΥwn-ŽλIκμκŠ)«¬™eέ]=ΡH–ƒ “",K’Z¬hFX{a'cD;Z;Α3�ώΠΉ,|T�yŽ έίΥmΚz‹X9Κ½Ξξέ{χ"Ψt*GζΎόξ»ιΡΣ'¬ϋh0/.]ΎΜΉψœd±½…θΙ™ι΄€okiMί{�ϋ°xV"{έ�Ρ–ξ?z€ƒΟΈ2Ξ‚`²L›ΜR‡‘*ŸΡΩ€�¨Λ3 8ν”%ŸE{e]ψ.₯S5Τ<�Ϊ―}&Πžή0A–W¦�λΧ―¦χήϋ:Œ£ °κU‚wμB5g~anΪps4sφ™”ο,Φ‘‹u 5€QGn°�Ύ ΆVZλΟYΪ°u2f:{:b eΰ,.¬ΐΫΐλκθNτyς8}ρΰ |Ή=tτ³(Q˜žΨ^εωm4lι™Ύ\i\#3ε�>ΆΕ€U@*+Ξ£YVύ '�(?Žέnkm€pκ γ·˜ΌΕT-;ήWa7τΙτΚaH6>ψΩω²Jί¨œ L=ωΰι#δΰ(5Φ5qM˜y/τC2εn(;φΠ£ͺ½ΠΙZnqώ,έΣήΚ¦;ζ^·Έ’/kK=Ž+ΞY$ΰΘ1 Ζ°Θ2ετgΚ:Ϊ&ΘΩ†iP�^jK7―_¦'Δ9‚R’7P€ΦΫ» W0ό {ϋ8=’jζ»�‘Ύ*”5νpΎηπ–(™Xc]Bδ€υŽώe°>\μ{`‰™=΄œ`εοέλ N© ο[Γη|Ğ}φS9˜vFΉΦΟ³*Θ„\ ΰϋ™ωκT“aΪiVˆύηœk[³Ήw{θθσΎ@Oλ/¨•#Σ‘Kν²ŸΕ3θGˆšPρύϊY~˜:]ϋν†ΨƒΛr/ƒ[§¨?ύΌj‘`²ζΚ�_ϊ2OμΎ―Ώ�―¨―ληoQΊε3¬κ{νψ;νIyS7ωΊ( 5`ώ΅_{γΆ9&Ÿμύ$xobO–€ώ•ΑoUy εs;Θψ`ρ|œΓτ­}υΛ ·r©•φliγόφώrι}L^Y~τ”―16ρlϊ<ϊ¦φʐ )θ-σFφ’2ςπΩ“42>’ž GΉ°ύw,ͺΑNiΫdΘ΅G–{iωŸύrh ~λ©Ώ«οyΘΎψ§λjVΏΒ=V‡ΛhΚ°”3χ%Έ�΅ύτŸ΅ΠŽO¬† ₯Z UΩ·KΉtβ9¦tχφΠH§Ÿcφ”s_�Κ5j­ μ�ΖΡ±ώAωLͺ$γ-¨κπ΅ΠΥβάο£gΡ4ΈξqN——34tKo”‰ >·ٚΗΩάη~`œ°oλ\Cu£C’Mp‘ ‚$Α%#ƒ4ϋ¬₯·‹ρTEΘ‚ΝκhΠθΪ še#Χ‚χ>ΉvΡ?6[=£ΐΦ¦ά2޲At†�}ͺσOvΩ^, M>ηQYYš™ŠΪfHΞ:n«�λ8WΚϊμτ(S}a±Xwn–>ώ󏒦ϊ˜ @fŽ;΅ΈD?>z—ΟΡMVΧΪCGjΊουKgΦίFΦ›Ξβ–/ °h{΄³γγΡA†gΪΨΔ9'ˆΙΑ‰²<ΛLœeoΤ,s’ό%2Άόά�) ξK%”ωž‹ύιϊΝ7#Έ9ΡΣΫ u7ΣXW'XΠΕ`ΙI0v¬–™°Ύ΄™+iμ/³P:β5UΥ©§Τzιcτ„ϊΚ}΅�Ϋ2Žrθ�Φ²V0 Ζu¨EΟ:ZσΣ;Ÿ3κk!κθί¦ƌ΅₯ 6]λ=9+KΓϟ§‰ΉΙL'f'i V”Ξχχ§ΞΞ�•σέ½Ψ²rήϋΪ{.*Nr:Ύ™LΫJθQeIύfpžσ3v«Ξ­Ίζ„}ojiΒ�7…ΓnV―„^)Ώύ7�CdΈ1Ξ^UMyššxΚxΣFcΆ“αύ'ι΅Χ^η^Ϊxέ9|…ͺ˜”²G ϋ.ΒW`Bœ?!=zB°?C0 …Ύ£ E¦“υ”’ΝшΠS›g)‚L3%φoάώΝίϊ͘€R]YCd8=xx7τΏ”θ§ΟŸE–_πΩμΉτα΅5J>y”Fψ²ŽΠ•6I”)aΈ₯�–ρ¨όYolP,_uΏ"΄Ρ φ 9ΜΖ'³A[1zΈ§η<,4&ΒΐBΈϋΰ.zfΩ,€8~PCCS”%μΐΎ<‰E(I`L°Ι> γύΣHɘ>„zO[™)ΝπEή”!©ͺ =oΧηκ©�GΗεbG œ K`~�-Ρσ1@6ΰ™Xυ‡}MtΈl†ύΫ΄ƒ°Σ½ύ!Œe…žγ>;^VV¨Gπ >-_¨BΗY:#Ѝ‘bω9zρŸΞΐΧΟΧή-Q »ΖΉΨ‘ήύΤ`‹ηΪ=ήeνySC-:Sfг΄*hΪ+§›)>°Όͺ Ά& Θ΄‘`ΕE0ΡΑΉθ`eV�ΙI">·‰±mlGΧ=Ε¬sέι {›œΠ? ΛβYabσ£4?‘ŽηU@?Ma‡ω9{i-Ή ™„ϊIE…4½Lœν-ϊ•Π7aΖΗkv‚¬šΎ9ζlθσZ†$‹€γ …ώβώΒΰώ’Ό†=……]•} ζΨSIy>E•}-ύŠ=δKۍχ³Œl*3™ž2NMΡO0¨υ»πG@Αμ9Ηοx/η˜�σΌ2 2T{νFŒζΗϊβ²ό”ηB>MuΘShq�J{>ΰΈ~°Μζ‚bFΊ3ΗiMY”Ή?»0Ί<ΗNM¨―i!‘³“ωNš˜QIP―ΟƁςΉΓ―Β‰©P�χ΅οssO»<―Ί_ΩGΠ­ΪKΚ'θιuΖ’ΪΐυωΞ}ς~΄σ9–œUΐ(±DΪΙnύ½°˜gΩV–EΚΒiki‹^FUό{ϋ©ό²ΆφhR/ΈFόω|v―ΧOς^ά Λĝ’άyΏ&o’ϋ/ΨβžΙž6ΩŠƒ?|fAVχ!šβoΎά7Y‚�/Λο-cζϊΔs~†Χ`πΛםxx]Η›°uyΨί XαΫ¬ώDpG`7ϋ@½ΰp�Ko_ύoΎώ7ώ‹χ‰-}ΧΟυΧ/,pΰ�ώΡ}ϋτΖϋ?™ϋύzοΑ#Œ2Ό\_SW­°Y[™ΰ„L‘˜Θ9ӐŠμ)Κ«ηγϊυλR όΩ|λω“‡8*•‘ ;{.θΧ«ψ³ž ³mLƒσ•l τKEd€€ΠώBΖ½)ΌJ­sg χυΡιšΪ’,œu•³AτƒGӝ{wiζ·Ε΄†ζ8͊f"θγX LΜψ‡ΛŽβ±Ζ…ΏTς<&‚υΖΗP† Am9;MuKeιΪ+WQ”•(σ5#Φp0 lΖe&Υηπ~ όΦΰθd0ΐ‹ `P+0κu(΅£pf ζl`rO§Α² Υι:†EGUΕαηͺπΜΤ¨l£$‚%j„έ‡Σn½§ŠEQΰΐ Ή 'c1z($kσΆΙ^hˆ£ΖŸΟUE”³Ξ―VNp„u.€όjάηE[�d ΛΒa²Ω †O4IAΡͺ ͺq©΄6­¬€.¨V„­dΓ¨ρ/§k;₯52 aͺq λ{―€<:FŸ’964XΚοkΪ‚ πbFaόΟϊζϊ†VΦ.γ`Υ΅υ₯²κδY/τ:&άJ8//3m™Ÿ£ˆUΆ|s­\θπ…•(Jžβ!Ÿ@!Ω’"ΑŒ2V³OΡ%’πfψDςέ©l‘{ƒJ+{tμH_E€εZW[ ΐ‘3dfΚFC2]¬I‹ζσΌΧ˜§ΤΥΡ¬³&]ω%?:τνμa†Ρ&@f‚έߎŽŽpvuςνnvHC—)cΠ‚΅?C^-ΕxA6ΚIžΘ” ΓRΛ--1Ο•C€2Y岌μ’₯lΩXš0‘d=-Ψ„ ςιr| \³V2΅ž>~Ξ0CϊόΦ§ιρΣηiθΩλCΰΓ^fΑ²ZX‘Ϋ8οsΊ->¬„¨ΐP~qΜ·ΡΏpˆ’’η’Ά)ŸΨ0ΤIŽf]œ[ΖΑ§”3d&άOi@Oς^δήRœΚεΦδΦΘ F¦G<—ηΤω7€3ΐΎώΞ;°bΘv⬠Țω΅€Γ2Η—Z:b—pΟλΰθ0Νj9kΌ_Π·œg7›™‡σ©σ¦.·Αύˆ·OŒΣ‰dη`z#ΘDέ`«Oؐ}A*�U K§―§›¬k;uεMΠΪshδυ L™lz=4₯ξάb·ις™ϋjM­­m靷Ώ”^}ύgβ(ύΙχ�μ*ΩIΩιƒO~”¦ΖG9om^v8•γ­7nF6ϋΨl1λMχ8ηΉΪ6¬<WΛ¦Lq&qARkG€!N;ςΆMI[5Ο3FYΘΠ8λs―cρCμ  lY26?Ηδ¦υ%ž©-ΞΥ&%4κ­l‹ «`\2kRj �Bϊζ7Ώ`ηZ}g—?QNθ� Μσ/ 422ΚΊΣdtΛΎ%²G|θλS (”ΒB ‹Χλ;Ζ ϊK‘GΛΨ¨Β-Dη‘‘G™ξ’‡•ƒeύφ˜,€|λΤ{VNΕψΎ­cLσ@A―�νΠ,y4Κ+IΤδΓθH?€·Θ8 ΙΝΥέ431ϋ―nqΤγ‚!α»κ­ςμdœeΟ³ ‰ΰ₯ύŒvπq%&”@Q)"7ΰx•­₯ΞnζL\»Τ‹lΧΠ'�™½³JΰcŽ}·ar#6\΄³Ο™A�ζβ3Ι"³qψ œ9ΐbβˆ=όZKΉΩxΨΈ|XΈΖ>3Ώˆ†τ'ψΚ_€œMb6&UΧ™xρ΅ΨNŸΝψBYΰqγΏliΘΜ ’NΜ°γTŽδRVZ‚QγΎλ Ί»›q�zq’pΘpĜރXαυ¦½υEsΊ΅ΣΪι2Μορ3GͺL[XΥΠkqŒ–vyΌ΅JgΣ€’=5ίΪ²Ή˜"‚ABρJ“•")-°κγφD ε98™ΓPA‘«SŸŒΑΪ\_ζ™QΘ¬.Ρu›SϊpRΖ0(f�νέaKϋΘD°a›―ŽΖ1FE`AGΟ,Ξτ ₯ dδψ5λ†ΤqŸ„rΝ€s!ξEΝ^IΑ³μAcκYӈ�€ΛV‘ς/¨0:2ΆχΉaΆuvϊκ ˆ7Ζw MͺžοσΛr ³8KξΣ6‰†5ζΧ“ς5C.@PNF½³ΰ$}‹F\f]ύω ΖΒsk γ³;nΤΊa§„μo#TŠθ„m,m@g΄ Γ‹< κ(Ζϊρ<žGΧŽόy©ωΚ·΅ΒžQ ]�k—RGow\yc1ƒ}νέ/“ Λ!Σ0‡ !\ΧΐΑηO‘&›uΨ\jŒs5=3I–ώ1₯©³³“Œ ύPΠ5f…ήγN"ςη–94H Νot‹©1ύ靿ςNP@­‘ΆώQΖ@€ Δ[χ_M°n2zU’epœ—σΛ——W‘5/²ηκ¦ΰQoίω0ώ– ˜ν(’•b@?Ν>{>DΟ…•ĝίLΐ-ΈUO=¬υ„ήOWη4‡’jΌΙ2–Bέ­φώ°€Φ^B_™‘άΔ±Σ1³Όκ<ΐ‰"Η6ΤΦGΖ6 ±c«‰¬ύ>ϋZΔgΈfM�“ΥMžoΗ£κhA[ΰ,©Πgόϋˆ½­lmLgμ₯ΞNW{μFι‘…q­Μœ›M΄±Φ–YA@'υ±§Ψ':πR§œςs§Ÿμq.Nk�Έ³°fΩ‹όd³9ϋ<›σlgκ§μΩvΪIA›€h‚"²βΥc$λψ ιΠάΤλp‚?$rύšxχ.ς*₯F–ϊ˜ h”iέ τ€ Uϋ<κ,ΑoΛaφN(™AΏζ“ *§―A{g3ςΣC&˜ή U™²M푁™ΉΎFΠζyvƒj}Q}†θ ›¬ΰ£±ΧΌΤ““”©V'Σϋ O“Μψvy<ΝL-a ‘΅ §Ι‰qΚϊ¦¨ί§6ϊI[½Κ8»₯ε48>–ΗΖ`ΡΡs M Ο z[AΠΕDƒΆQ›mˆ(!dΤυΈμϊί-z ΌδΝ ͺZΪlυ Χήδύϊ˜&?΄ (!φBLWη+ ϊ°ΪlύH;ι ¨£}-2l™—ŒΡ‰>Q ~€Ύ‡6¦ˆδ :™—ϊΧΡ”›}SΧκ ΨΛ¬ύ%{ΒEUκ«λ‡z-!ŸaӜġΖ:9αa•ѐƒ£Σi~f‘ '+Θ? Ν“)ψ7t5|X§ψ¨Ϊ+ΩΛϊ‹‘έGΨ΄όƒλdΚE|�5Θ#0Εα„žΕ$ŒŽ™vδT±,ξ‘Τxw�X]C9Ν»aηΤQ�πΝΊi'μ² P£^<mVIcΝ��ϊ,!ψU’{ΟwφυǚNSήβϊۘΠ₯–œf&ΡΟ½ˆHΖ~»ŽεϊτΈγq�d²„!§2Uy*֞ύ`έ=Sž‰ˆxV™κϋxξά7ίq{+£O{¨ώρO'Oθ Ț0ξΚτ΄3†al0{VHUg/ύWb|Vrΐ°žj~π»�Υo�NAέυŒΓΙu~ήΏΨ’_~Ή²ώΧτOΏχώ?šyτ‡όΒWΏϊ•λ[ίϊ› M΅χŽŽχN@¦›ηgζ —hΖ1=5Bΐ΄ΑX.ι ‹+ΣΏόα0ιΡΓ‘τƒούd^Jy(ΰ~ƒiQ•ˆΚȉJάϊO•–ΒlΖ[eθΈΖbΨ=Œœ¨p3Ž‹hΫ ^€˜΅·wβ@τ¦α± δft»U)Ζ!ΰPYŸκΣΉ*Φqβšf^ ϊͺqžPSQλι1jΆάYΓλwΝ$KZ`ŽΈγ“ϊϋϋ#ΐ2gFΕCΏ„sμΙΥωPAl�ξ—FΚzG{IΨ(GΗYJ€ Ωγ‘AαΤxΣ604€T© ˜3ϋ¦‘\'0v“e fO7ω·θ¦&?”ΈƎ�g(J<wιΥ:ίω<Ώh�χκ}ιω¬‚>οχw�ZεΑρ7žMX2hΌ/χΖg”5"jν>Ψ,*‡η°ΆΝ½ΆOhl%Α}5†ϋ|o d_Ίrν2?΅$0aυχpΘW(i!`—Roc!!ξ‘4ˆΎ ¬”χ¨QΫέυεηfd"8~Ξi Gd‘w\;οΝμ@Ζ)VΪ}x°±Πςβl”Σπ‰ό[κύ9>™’q'OCNz‚ημ€ρu/,ΧΜ5RFuŠ5¬a0YΣpέ{dΝΪ6λτ#ΖΔ9Όθξι cυlό,Ψ7Όίζ{φXXDΖff§γy€p^μΰοElΛ²ΡiΠΠΠ“AC«Œ[δyr|γ4ΞΙμΜl°φ8kž)©Α–QΨΤΚϋ6³ν³ΐWΰ(4TΧFαˆΓ7ήyQ‡dL@Αικξn§ϋ�ΞVM₯•ε5Λ™Θ 5‚Δ;–lγŽ8„sbvBdΎΤΐGCκ$'9ΐYε&pΦΗ,–Žƒk%•o‰ΐOJ¦Ad3½™)39G‡ΩŸ’tύ΅k°hNΕϊ{ξΘ"ΞΰW—§‰ρQΞδ Ί�`3‘€qL£Όorf"š(vttA�#†­!Π¦¬―@|Λ2πί6Γ\#ˆͺ lAΰE§ρΚΥkΙu8 υaŽΨœ€qAށY &‚-|ΈKt¨*ɘ*�θN‘hMπ―Ύχ«ŒkJŸ~v+-"·6uu¦rΊKGd–Ÿ|~;ΎΞŽξtk[’ώι ˜¬!@Œ2Ϋ甇۷?McΟ‡�12Φ ;₯ έ`*}πm†}Šl˜Œƒ‰ΙQΐˆ¦ Ύ«“Ώψ¬,†C­rφΫ „qGgwμ§ΣάϋX»Εη τ$πη±WεΠ–λhΪhΠ .R?«g'θΌ?4<„γsΕ€]l7σΩρ1t&”eΞt>ς“Ο~όš S/& ΰωU€< ΠE—ŸE¦Ξϋε=«"sΘγυgaά†!ΘgD³ζ₯Κ›γ§TΑ͟}iόϊ‹όμŸd¦ψΡΛΧΕoyί‘6 ]ΈΗϊžθΐȚӲΘ:£Š‡ηηΟ–Έ*ς”ΓΠ‘²ΈMt²L7uJ.keΏkdξν/a“Q'Υ( ΐ‚φNQ^?Ήυ1znƒ5’\=+¨ζ{lv™™C°Δ9Χ~©CΤ•»Ψ·ΘPwχ"›Ε8‹dϋ~A=ΛIlŒηX±)7›^Ήr%}zο4ΚΘ”Ν[ /‘ΎΞώΟ9kί�αŸb3§�»oΎMχω&Ξ2Νb‘‘αG‘„—€Υ…}-ΐvΫ¨Υζfs3i=‚€ t₯εNκΞ$΄ω'<“Ξς!v-Ψ\<ΣμμΆΐ,§ /:gά νm©ζŽ L :λΰ”υ@/ΑqkŒ θ:]3)ύ–1Yš$#m›PNΔz>τ,Ψ\2j›[š)E„δŒ4άEΦ–=”υcι‘eΪδζζV^ΫFΉ$ΟPτƒΓ#θ‡YοRd“d19ˆ!AδN4άΛc δdρ\»‚jΨR3’6l» Έ ΓΣs£ΛοΩϋβ1%3œ-λ¬·Μ€R^ΉFύ*`Α š,”€<2ϊŽŠG63uΦKΛΛΌΘD“Q€@„‘δ‘Wv:v·a%Ήώ/vΘ`“¬«―Τj`tΆ’ε|žw™™=pˆlyv Ϊ¬/χΊξ‹υρKa+τdΈ�ΰaΊuηsκΒ‡±Η°ΞVΩs² œk}’ΘHH²/9ΘΐΊn΅ά…©‡” ψ\τΏΣ]ŽΤ[ΘͺgLφAQe ”Σ•Αd„ΩΨJ†φVŒY„½VUN£Ήΰž-u”=‘�’Ώ`p+xΟ»₯­Σ™/ŸΗskoΧΜς ΑuU9rΦΠΨN†)=€’τGΗf§²Nlά9`�`’: ·˜„ˆAΪ φ­Cϊ#Q’77ΙAn°˜ω>& ήEN]SY{ώϊΎϊA&Έe΄D’K΅Α{°2·_jB―ηkάgG?nΊΎΌIίG=θe[ΊϊQJΛΊ ±0x­A¬ΑkL•α~];t ΛΗ|ŸE6’ς‚ηΟχYB Σ§Žεμ™υG–Π­g€­[›ΘVγ¦ΖήΊŽuΚζηΖΎΦ‘Ο‘8CζΉ?ϘLFοW—eΠΓ~αΧqΣ₯εΘf!₯:ΘΓ•^Κ›Gi M"ζmΖΚΎύΞu|‡|b¦ήτΐΘj;—::θ‘„,Y8·ΌΞy€όkȜ,cι—ήz“3BI*%UϊPyŽ8Ψ€s|©eOΚΪΤΜ6ζ(k-hb’O&” ΝΚ ώΥ…²8τ§ν{ΐƒψ�ΨOυ¦εάY€99Ύ¦ώfμ3ΟξxpO>―ο‰fŒ\ΧΈΐΡνφΰωK;Βϋ‘_§˜ˆΡ–{„/Ο~ΪοΒρΡe6 ΅œΔXΕϋm‡kun”n“ks�8ΧΎΗuΆVΠ Ζ5Φ Ψ&ΫΓ 5[‘rFLx?†ˆϋԁ–}pΘηm³w²D΄R1Ϊvo^Kξ!Λ ΌΘ@>r­͘r<Ž{jG Ÿ;Cη&K’~ΉίaT#θ}XJ`ΰιοlU/ƒΰ+JΨƒ< ΏΝΛ²’*΅5υΑb0g¨‘—5pη7€¨hdΈ}†`'prpRύYŒε~ b]7›ηE―œεΐ58ki‘ \D <qkN šν�@ΆΙZaΗ͍�N#Q\X Γg‡r‹kqVqv7i@ηόdƒ'Ο―'Ψ& ŸΏ¦¦,κh ͺ d”£p„8+λ|žNbY)=κθΟzΏΰLλΨπ~3£ 2;>‘ωίΓ»�ς4  uβΛΚΰ#ΣΝ›oZœ#Λ9>όπ§aD―ίΈ ˜p-dt WPΒL Ϋςγ LΝLs†νaΰXΠ“τόιcδήqw§i#ΏIζά²ο_έγPΟo3N‚ Tu²ŒΝΓρrΜδΰπ(c!—#hΩ§ΦΪ`Π Υ!ΊβωΘ3ΐ…dΎ1uvφD)‚ηU²©©%j“―]ΉŠ.]JχΏψ‚Ρ²χθ3Œ¦ΫŸή¦!ΰ™œO~τΊ…“© «c―,°³ΎΦ]3:φ”uκΝdρϋ.°7ΚLΐΦ΄·’6Q!? ^ Ψϊ�€ ιϋ€ήUfΚ±_Χ_υ)₯Ν>&μ­ώ‰rγ— “λ₯O€ͺ#Nd΅#›ŒL>|‹δ ΑQ$ψ\LΧ7@šfGs+ φΐt•γ Ρ3ȎΰΩ_ΪB}ό!ξm–ή#«ΛΠΈι_Έ8kcIdœΐ― €~Ό‘{ΰ<ς<‘­f―\—c|<0‰”Γƚ"ς;_csΦ-¬?™O¦I4ZΦB&4›Μq =S._θ£—ΑωΤήBsKJ*:iˆ[ήήK :$ξmΛp‘M`i‚@0L τΎ†™kΏτA π΄κ’ΏψFHk7hsκhΜ{–εΨC¨εΘχ>uί/θΕSΜ9/Η�ΤΦ6¦λoΎΛ}τHcωEI)χΦΞ4τΈ€΅¬ Η1ΪδpƒDΑ*Sa’ρ*λ#xλ(ΨmΚHΤr‚έφUtŒnόάΏΎsθ8”˜ Άϊ$9�μυ τ-• ν�Α’ϊΞυΞ$σ2Ωt{΅x*ΤMAΟΧοβZ‚ώΌζ…ώ;ΗΟυ΅Ή?μβφΑk†^εN•MYΚΦπΫ [½c YW2 ,ƒpelˆŒœ Φi‡d†š,Ι<δ6ΓnλωέίΒΗβώνΟ°»2ξŸηυ¬±δGd²po>ΏμΗΖ¦όψvl=&(qi\κθhα,Σ›r4ψυ7―§^’\έ}έ${:š±Σ6τ€€�ΦοCt¨I›r@B'©Μ/�£ƒiX‚u€Βφъ²1φSΏh½33;ΨΨ#HydΞ* :Ύ· υ·r¨ΥNρξέXϋΜ˜xrέέ7ύ #cΧFΩE΅‡ΏΚ¬‘2 pξEX5νiΨNφQ°�u2ρL~/X ˜ΰ˜φ2τ‡€˜“τμKf2bŸ€ά!6ήi#ΥLΙƒu`ΣλΖΖκCΞ՟ποΗΏ�?όO#ίωΞw4ΏΏ_¬ψ/ΏώΥ°ΉΕ?ψ_ώρΖwώη�ΝφΛ)}ϋΫό�χχG·»Ο֞ΝM\έ~±R/zw�₯ΪΜuΠι9‚…γ4Γα‘�™π¨U@­³Ό`'Πpš›Pdκ«pl9Ιμ Ό†ώ₯bς˜)1Ϋhπ˜0¨ΨUBfμtLμ ¬V1«iφUI₯…~Β!Uφ0bxy‘NQ-]`PDIB ¨ΉΜ‰:‚΅P΄\ΛZr—έάu̜M|υκe20E‘ lάΆBΗϊ­¨­γ2Α8ΧΰΊfXΌ¦†ΣNΛ*<Ήω€ΐ ε¨BӁձσδ Έl―% Π{‘Žf=φ"Ψc ;$‘XCΑΘ†π~©Μτœ722"JX'›©5ΤΦqM²]\3‡,γ8k,3MY ° ό \σΈ_ξ'hfhpΧܚi)OΞΝΆ‰₯Κλ {6Ÿm-«υΆΥ(Ν ²YΕ Ν…4jflίΉ:²§[(₯fΥΧS£[υeU΅MΌΎ @€ΗeεΔ>F`ώ&.i=\'›Jϊχ@UYKΧΣ@Γύ–ΙαZk¬¬‡τί*ZΧU#₯�ΜΌeo4pLήήώγΓFΣ½;ΟQμΠ―1ήΒVkΤ�Yς’1ˆ‚:¨dΓX'^ΛDΣuΤΜπ*?Ω(k•Ώ†�,o₯6!΄ζSΤ[ek¦έ YT£šξΕΐΫΜΜό<γτΘ2�QV291׈&xτ°�Φq\dΩPΦ `EΥ•οO§G‡οˆμŽ΄s3F&­NXλωRJ4Μψ•βPΧγP9~ƒ ρ‡Λ™Υ�i=<ΛOʏ%υΥυPΕ-Λ`%+£ ½ΐٌΰ’,ςƒθΗΌtDΫ₯¦ς+?ΐAήL dH™“•°‰γcߏϊΪΪX{$HI ΘΒΘΙ|0ς|8M Ep²ΏΝώμλ¦ΊwkŒ.΄)ΥΠ0₯'Θmtfδcjr<œKƒά\„s„ŒΨ Mκ¨LAΚΡΡη8»Rμ ΈΖ�}Ÿα‘ Ύ‘”’%* CήέΫΩ.ϋ…8Σ{›5Χy6Ki£83/]AEhξOθ"^O6ƒoGfeΦC=Ά‹³Q,ƒ&X2˜tΒd95γn8tut‘i+L}έ½ιΦ‡§5jνY3)YnΤ ₯]ΆN©Ί—u~σΝ·bJ„Ξ—[1Žύδθ0€F~¬λŽλ>κ! ΐ!²{ŠΞή’¦T£Žυs�…g`§Η Ϊ �g‡΄;η·4]|ν•tρκ@ŒΕmtT$½%ΡΐΡ›=°ςp€[6Ν’Zν=9ψ<νψ!Γ6³3Ί`ΰYdΡOκ@ΟzPjω»eYl„`θ―όΕΖƒΩ �Ϊ}VΑbΤϊΘ±ΑL-Ag ω~υ�υΦ ƒ3e ϊ8ξF‹π�όŸŽV¨πε,6ρε{γρK�Γύ8‡[`)‡²Š<�νΜ²9α0r±{™œ`CpxΉΑπ )­0λs~`κκεŒcŽ\€γπΠ›κ-KE,q²Δου«―¦‹η/D€ΕιiτN8zΫΙ6zΥαΟΕΙs6Ζ3eAιΎΐ3²Η¬gPq‘Ψ2²υš±“΅”κQΟΤgE £ίοas憆ψ³GÁσΠ£'4VΝI €έντ)β½ϋVΨμyΡ �ή½Oƒ΄ίΗ©£«3ύ[ΏρoΗΧT–ΦΰΠSΚ€–Y«jτγ(Ίϋ9φƒΞε<‹γ„έ4ϋ˜¦/S‚c@WBζXΉ΅7Œ£ϋVιSΤΤnΔ_‡-Τ6­g^=�Σ_LPπι½[²ŸΡ+Νilv2ΐϋμVs{3½–ϊcšΜΰˆ%ndΑ ΄p—-Q1cΓΩU‚˜μώΆZŸHϋc&έ3- 0ldr‘Γ�ύ¬`bD;μ�š ZΆρκk―r6�Η·n…Ξ8σKŸ(Ÿ=1ˆΥή±­aμƒ$+ ~ΐ=8S}»vΜg—ΑΦ Ÿ Τ† ΰΚΜτ^ Ž-_)$Υχ1 ΜYψΘrτ6@_ZΪ'ΰn#Ω~‚8κκ§&‚[ούiύ·gSω[BOέϊΙgιιέ‘΄:Ο8XΚ΅Ι¦->Χ~G΅5Ζ=ΧΞϋ2π;@oj³ fΤŸζΎ•ŽSΞ™rb°©oφb™f§”_ζ‘@ xr);-Ζξτ΄6₯W�\NέηΈ&Α½�LGK>r«›SnΝ0A2πMݟL›)Ν²dD Ψμs†m€ΟΔ}ΈŽ@|θ4S²d;Νπ²"g²u<7ϊφ_X€βΠΣ‘΄05Ητ‡υ΄€›Ύ±2d£@Ÿ_'%ΞΑ6λ¬6”ˆΥgOά_m–κ¬Ή*‡n/{Χ52€Χξg|oΥŸ}Selτ–ΧΡ—Φ_ΆΜή=PΆE4‘Ε'FPΞ6#W;2ͺΈ>kα΅•}MD žϊo—ύ/*Β?#Θv‘Šωώ,kaaι�ιYvž aζ8„ΞF>ΔY)ξΙ3 ͺ34P¨Β£·81‚…+xpόΉAE(4–™(₯AΩ[ΏUnfi?ΦzIυQΨ5œ~™u†­ušΗω―u0¬OzγυW"°K“dΤžΛ™ψΠwώŠΪ_‚Μ:NU† ΟjPΩZφQΝ9Α/μƌ,²V"־ƎΖΦM»ΟΪ#m65uτŸO½8‚ύ}νL•a ΦΦ–x)ςΦΪ΄[:θ/>ΐπ„ό{mmm©›Ρ2˜(³‚žG/ΊΝM)“4χΒyV6K8—Φ"j ²}Ξ-€Ο«ηίl’LdΆΩ{G Y*275CΗνyœf(2C vkΈ/^GLΗΚ@Αμ½έ»έA€ζζΦΨΓuσι$:žQI&†rνGQ{ο»”uΉIΠ]VZC9= œ>; •lŸ΅ρv Μ\δχ›€)/ΠwωxiΓ‚›–  K₯UΦ ΄΄΄Xα[uΠΰΘNώ0F`†sfΣ΄ιΉ™¨ _%Π1@lljNύηϋΣΔθxΊχ靴0:ESC@)¨Ή:‚‘uν:f€© ‚τδŒ¦»·?žmΰ„c35Ι,f-)A7Y‹ΖσηS ?›αΪkΠ�₯ΆoREέ1ΊApAφgΗyΩ{μ…₯ PλΡΕΡ\ ™;T΄)eΫΉζpD„ ζΊ;Ί�ΒτTΊσ㟀|ΐ“mΨ Ξ0+>ΛΜΥ Ž’zR�`Ο ŸFFZGώ”΅?ΰϊ«ŒΫG—ψεΊ{Xuzu|Τ₯―]Ήˆcή“&(e‰SΛYTξ«&¨(ΛΟGΫhύΐ=«sΝjq=Ώ=Ώώ̏Ο%Ϋjΰΰ½ψm†ˆ#G‚nΗQ+BqΡΣΨξΫς’˜!²#8q“‚Άž>ΟΊL&δ •”'2J±ή₯rλΒ NvπΗ:6<Β4ΖΎΑb1c'8Ί‹\μbc ͺ\;A|KλΜΦλ,vtt ·Μ;ΗFΉ.κqί£ά6HΡ‡έUΛήkqήK-͎-lD'N₯‡ΟŸ₯2ΨŸ=M�μϋίKΟF‡SgKcμ\xςτaϊ•/� N,oK{z�ƒ?KC£#ιˆσ<ώθ!Άζ6qjd,εΰΔ_~εΥτ ΞΠπx+U•޳<¬μ@ΝF@ΩM€KιήφΗ°)ͺξ£'wcšŒηθΪ+―₯&|,Ο“€‹ Gθ_tΏz^¦’ϋdiΤŽ»·"Ξƒΰ­e"Y(G―+P�2;¦φύIξ~q7Ψ2žG뾝:πΞ[o‡£l’'RΜŸ·` ζSΔlΗz³€6N΅D‘ =d’`}±M³>ƒ½ΈΨa)ω;φΊQƊ j¨»�ς—Ώ”ϊ:; —�cΦύ! £γ>[°«f%.τυΚ\g_Ώ?-ι)£DI*΄2a―—ΦΒΙ'Κl=Y ^2εm€έΘ¬ςg ‡%pΪ7§(h―Q!χκQ™ Β> ~n%`Ο7ή€,΄F&ηΒO['po`jοBχΤ³βuχ16ɘO<›M/ζ΅»NH‘ ίΪ§ μ ;W¨œ$`©„ ­G©ϊᘳ*h–Γ΅pΉ-Ο’>‚c) ƒ>­]ίΝζή/_H½dσ·IRΠ#𧀃κΩ–ύ΅ΗH\:N¦:ςη•Υ¦3J°/Ω‹κΑ„šP.κƒaύžLrB‚«C“ΧUΘήσ\ (gΉΘDvS‹“ €ΣθΉ}ε  €ιξΗ?%sKσӊΊτψΙcJ{οNγ?³€π;θd'ΛjdΡDژΥς9ά�Ν~1fXί2¬}δLΪόϊ}Ž2L!^†―ƒžc•{FGmΚ$ΣΟ΄ςK?Λΐ\ω,Fχθ3ν±fκυƒ•U?#Xύ²fτ…|½₯~–`ŒΪMƌ ‘-½±ίX$mψ½ϊ}MΫ›‚φ)RΟΩ΄ΟώϊN&ŽN`ϋ"‡ωψ,φ3Ÿ?ŒŒ|>ϋΙJ 0αΧHKAS;ΑI°ΐ½°œB_Φμ=G¬›R ²ε΅4σννν YŸ›[ ΠήRήε•E| )Φv|j,όžb&k}τρGι1`ΈSoΆI”{X",γΧ{^^\Kσ0VΧWπ½W![RSk“Ί�FtΉΙS|TΎό΅Αϋ?»χΰD9`I1Ύ &eM“₯b=‘y^―]w=Ά`+wθ+W‚θ»OΖ2&πύΚՁ>―«cΩ·μ#Ω‚ΑQnΜ½{ξτ]ΟXL{ΔBπZυ¦ρΜ±·6χ6αŠˆ+¨ηΉώο!3ŠR†μωΕω;�ζ·ώΦ‡55}™ϊB…κΰΛσυΛ―�+ατ�α�ΎrηιßΞόŒ<Ύο•Ս­Κ-κ�ν<}’EΠ”Γ΄‚#t4t ‚kˆRβpθG‰tYΏ'MM₯?Gθ5^ώ]ŠΈCƒ§!­ήϊ²#€3•±S19WΦ:eƒ]ƒ‚|ύ†9,Q#,»Nο’­œ'b]˜τΌP^ °έεmžb6±ˆμc †€O”v“<Γ8ψjΞ*–κ©±Πψ[[νΈΗΌ•–§†ͺtz€NΩ}Š*JΜ&mΚKSο«©€γr:y8²:‡L@“fjœ—νυkΐ€ΧZζ`¦M+Λc…TΆ"«₯qγ‡ΡΓ‰.eΎϊIϊπ³OΣΣιωtš_½ηu<γΙœJφSπΰ„χ; φƒ­Θϊθœλ4ω%έΨ¬W€^\Kω=¦“π)NQK[#χYZ;·`L{d#ΨθΙ  „€R¦ˆŽ¦σ¨ ¨…¬…‰‘쒝œ˜ζΩψ<„m²Žtl„–ξΑrΎϋλ ›@=πφΔ­ΗX kωτ9α~w΄œ£^O\ŒCΪάΥ•jΓΜ¬@Ϋ<;‘Ώ2³΄4C—πΕ0ΎˆΦΛkΐt^E‘5ΒμΟΐٜΞΞȎ?}N­=χγ΅Oΐ$ ²Λ=‹rης<f²u› Z£Ώ4‡Lΰ ΅¨„…ac= ’Ÿ]— (,̞­/S_ΝΎyΆνQQΖωtΎ·4Ωζ&2‘8š(ςšι©™ά:Ϊ;blαΑχγ'‚ L{V§§§μα$ exey…ƒA;AY#»ϊ�λ?:2kιŒς2Ήc©ϊΤ¨ ŒμβΨζYΧ°ηΰτI΅ΜaQYΗψ•WάΑ @Θ`PΎ―τΓ^’„ΰΩΨγœϊΣΝΧί„I²ΙσAνΌ!@˜γΜΆžc:k�ρrCο�ρŸ€C€‰rΞ`ϊΓ,Šr³…£»Β>IΕ–αb©ΒΨσΑτΡϋο§Ι'ORχΆƒcΎΑ3:™πŠμί,Ν—a›ΠΨ‘σyΌ―Ήpτ£ŽΞ†2tŒ ηΠύΚ2ΣΟ4’ʟJh2Ζgε²·Γc8/d‚λ¨Ά\ίD9ΟH0Η™αtτίΠƒiδώΓTΞ~I °Ι©ί9κ<ttK|‚MFž‹�εQqΤ`Σΰ¬ΩθP»ΒKγ>uΈX ‰‚TY„cΓωoΤr„ΰŽZθYi0+ψ D g`XPœmr|qτ›[i|¦ΖΩ¬Ρα΄ΡΊeΟρv\N[•Q‰–*ž’QμCbγ7³kgojW›'ζαΠ"Z€<Θ1:Έ»―7œ@iζUd³-λΨ¦žά‘¨EȊ€θ{Ί‹N^”;θ<΄ξ› ΣΎΝz °z΅tΆΗΈΤM˜:”gΨΝ₯ΉYΨ]•Aν7Έ­d"ΐ6YP½πrμ˜4Τrττ!TymΐκΚR4 &@/δΥ“‘£ }[wϊΡOnΑ*\ŠώιιqFͺφ�±-ύτ'¦»Ÿ}ΞΘε2}Θoφ™ϋ4X—iΰ$  ;œ© ¨Ίkm³ ₯₯θ5t.λ”ŸΕ`o·fΓ­"Ξ†Ακλ±!ΨθΡά�J0΅˜Γžΰ++²…Φ‘uΩv>Ÿϊ^pl™ώ ₯Ψ mΘίρ±qμveBΟi�YHƒ�>�]G.—9Τmτ₯ULλhψšƒ=yπΦςυD-]ς§‘�?žβ:¬ΟhάΰEΠ4fΝδψ91υ½"ΓOηی©γ’s\ιάωΘFi™υΛ›idz$ q†ΚYƒhšΖσΆ³ξ'ΔΞ“Λ ψy©­³;2Ώ›€f2G tτ€ ‘ |%Ξ ’zρ€¨υ*Άχ±GΗρ =.ˆ�Ξ0˜3ΐrΝNF΅‘Ή 1\Ο™e‹ώ.8bg-ύrڌQ ΖЁ”χ“)#‘>Πdnj¦ΜSQ ΰσΪM|°(—αυΘΙ% «3€ ™ϋ°Š ςφΠ±€ζlP$qrΡ«`χSΦΐ^;;k°V”W£/Ϋ(5y5ο�O]Ντξ)υ”[NJ“>>³ΉQOΞeA”₯\ΞNψnρΑόG`B[Ξ….ζΞY'–‚ƒo²D= dά€^ύα�- γ—ΑΖ#ŸΊλfƒ~EdζS!Œ«ƒτπώ½4ότ,RΖS�΄¨²ΛZo :ξbϋόΆ”W»Νy7)£½�ί<ƒfοΏσΈVIY 1šρŒ;Νd…ϊ@Ϋ­6ΥίφΎœΘ’Δ’i h€–Φn’K G;o`ͺl8™‘œσ“O"NŸ'WyΡ±`Mσ τΆΡgφt±AΆλβ8gY6EΤt Β'(!HΝγ–ŸΨok’σ©YΣ·HΘΓpXŠjr'ΉtΊΨ&ώ½₯>(Oυ―IHμΈ?F–ϋΨdέ‘¨–z�άHψzβyLχr|ιΎΰk»†+dΝμ§QT›“k�Δ—#9‰F]ΎΈ€„NπΚ>°QtŒeE”AύLΟο.~ρ@7ύΑϊ/fφπ”DΝυ+τιμ{–Β‰‡ΓύِWΠΔΝ�—ΟβglSτ‰+Μπ³³ Ι9Ω!36?€¦xa^{Έ;ͦΎFΆ pS'd49ύF΅°ΉΧx�ρoΏωυw�Q[}σ·•΄_˜/#€_~ύk¬€₯ �δ�x8ϊΡ�ω•²²Ί+$NΙ²ΰ(£ΐOQ‚Ε©Τ`™‡Ž�c€°†|E6WcƒΣ2i tύφ½*fƒψr‚•�ͺΩ`=^3ΗΑ±σg²T.fΤ5ΤRzTΆδ\2Œ€HΫ:tI;«hΌ'ΏΧΦ`ͺˆύΉΤV»εζγDΪLδΖλ―GΖ\d°―§'θ’ΊΙ‰‰4‹�9Dρο’ετή3(-ΞΟ¦9ŠN«ΥΐΥl₯₯A5D1šyNάnΊkβ³ϊό*cW29’Jκ›™Q©γEh3Τ�- 0)§QœΏΚ±€ Κ#ŸΩw•-Οd`λϊΎΌžl`ωKu(Θμ™ΰθs&£/ΕLκόŽΎ7"kfNGΥ†Mvl/aν Q:ε"£<γΎ<.̘υQ‡ͺεη:Ψ¦αœ} ‘ ϋaζAΤ{ή™M§»›©²©…Ν(NœG3Σn¬Ηu²ΔΑg©ͺ©υŒqηEΝ₯ώςOξΩ�Λ ΪP‹·AΤG¦θΕρl Φ‡Ϋέ#d/œ+Œkt€sηg»‚ή‹ŽΆF4¨“¬%?ΰ~5€¬FήuΣ¨ζ³Gjt©Δ«²šΙΦ”ΣuךSŸΓl˜cΩ ’χ1^‹d] ψ:Ι|γτΞΜΞΖgμz�΄»8ΰ‚#ΡΤ“5[_¦ί hj{<œψBΖ½ ΒVY»&#‘쎎vhf€omΤ{JmάΫ_…>\š�ΑΤχΥ@Ω³^_Ί|W{'Χ’―20G��Θ8+† Ά92Σ££c4d€D ΠE2†›σ£LxIžnA7wΧlΌ†9S—©<0dhŠώ™ΩW‚;³¬‘₯:Ο:l–�ω3ƒύΉΉ©ΨwΩ=‘DΒlξ©|ϋϋ‰±‰4ψt(ΒfΨNI0Σ62:‚c·ψPGecjj*ήΧTίF–ιƒ}Α�ζšu�:M<gΞΡ©™ζ¦^ˆ6(όr$\<�΅žRωΔ4€AJxu ?Γ½�ψΩύ92Š€kPΡe.(³ο�πύtϋ³Ο�³'Ο’ργzeψωΣτ/ώΩ?;J ΞηΊ^;zvpVΤ©Ž[Έtω¨ƒIa-ϋ)NWΩ_iϡЌke ‡‡£VspζΪ{{" ™\˜%πo Γ‘§„ ήXμ΄KΩ…’J δ ‘{€―>UA7΅·Ν ξΆ"{Τ��€ΧΩ²©ρIt’ηΨu@sΝB„bμύ#iG z~νs£�4˜Κ!8qή5/ε�€ κSVΞOƒ₯7ˆ5Œ ¨»œW·Ζ8(z€ΐΩΧ)­mΘ#κ LΧ]άTu•vι(Ξ5{ΰαsΫ`jTη£±₯Λ‘&Φj— ^@ΚΆε@^{ Mxqήz:ιšMœ&J°H,UsΌ—Ž·ϊvΠεrzΖΏ£hŽσ—Í–„`᐀WpΰςUd”» ƒϋ<›N» 1ΞXτ~PžjΨλ/ι]ΞT¬ƒ1©αpΛ¬Ρ^81α%*ž»σӍ7 Θ@5Β(°λΏτς —X$mqQjε6…ρY|¦Ν( ˜‚^-Ϋ’³!Mέ Τι %θzΑεm>ƒ˜�χqoσ¬υ@€ό%2²ο`•9sΎ­ `L:άHWΞ§K7˜rρ²Ϋ$²x³e ~ :;–πνŒ6…,Αg•Ν(ΛΗ’Λ2€#G‚ΚVSFΌΎώH&ŒήΰGκv0Λ¬#ιϋζg�όμ(kΨNΐ|pΘΩΗnŸ‘ƒM€ΙΔ#QAy#Ο³°£oQΔ(j^w|Ζω ` ί—΅—!δ^θwΚξ0ΐTΗ©[τsm�Λ™ŠrUφ?ΚN°9\;?eΝ‘bM ™(r!Υ�>W”hΰŸšΐ΄χίξe”1βwr³qŽQlΌώ-Ÿ©Ο�eRμi24x4˜‰¨Rt\>Χpj˜ΰ«Ο ί�Ÿ!Έ—Χ֟ςϊ&”Χ}d;e’ί}½%ΆN�*@ΦΝφλί{ΞΔΰί�•GΝλΛΰυ~χψΰb|s/~†e‘ϊΕk” cKΈ ξΨD‹ε<–ΥΩ΄’žcόn`ah?=>:V„Ÿ-« `βšΝYΫHθΡC₯Π"+ΚΙiφ H6>=‰œ΄ρΩSθJ'™4ŸkCΦ,W3ηc{Ϋ²WτχgςI†¨ ΟUΔ@œ ν ž0 ŸWgΞδ΅,bž"zGJ8εΔζΜ&PlΚ¬�Ή°ˆθs²(ξ‘ΆΖ²:ŸUΰ†“Δσ’:𳹎2κ«9Β·[*f‚Ο©gK–ˆ2‘]li•)Ή9[Y]ρχ~χw~οΪκ{iZχm>αλKχφ—_�š+π|λk₯χξ~όΫέ=ΪuW‡c€S ν˜ΰΛoEUƒf0η‘3@W`ήΏό3pΡ8 *A₯‰ŠΛTPπ °qΔΫγpΈ«(ΈoQHΏ­ΛξjoBΠνΊͺƒΕυωXηλψА/0.Jƒh@ˆ-‡GΚ³j› ΣφφφbDŠΣΤβ$†v” ŠΥ‘[ϊΞLjΖΩ9:ΧOM μ@ TS¦>6 Ÿ›FAϋo°£“Š‘Κ΅§Άff˜γ€λ΄ϊl~Ω¨F‘ΘμΙΥ€²&*ΤΘΦpπ½―5(xγΡ¨Δ†R6β�Ψ ς4ή‘fπ)Θ΅σE㝅­κsnαX…Β`ύ ^\KˆύΘ¬}€Θoƒ>K1|ΏΜψεeΤ ·Ρ‹YgšΩ`ɚΠR§YC@γθ/BMNviζ„ΫœΚ[L0ΰ4Ššte“I±6�ϋςλ©ͺτ”Ο\§LΑς *vυ\δσpΔγώ "PΪRΥ*šz xiJ5A½,ŸΐRIΦΩ | Fˆ_y(iί/έΠΧψL‚"˜O$―Γ(a Θ ώδΣ;ιΙ(5άΉŒΟEέ₯᠁†Ζ1F σ~eΦ΅TG3‘R2ΐ–†ΤΟχ:hiL7$GΉ„{)Ε .Bž[[�ΉΦ&όf‚.F³ˆ�Ψ rEͺ x Μ­/'X’ηΑ“MlΪΫ:‚’ΏH―ƒ]φΤƟ�K-M8ΖΑ²3½υpf4‚–²μ#˜£¨}ΞMφpfͺzŠ ·κά8^ΎΠ΅³½Ο°SΚ –::ΊSΞ³T8eF‡EΪσσΑη|>Μ „ρρqΗ¦uaΰa:ΰxΆωŒ<L/ΰO{ήy~\G©~κ;₯ Ξ`¬μΜk9‡FOηΜ3 |ιΤzξkaύ +“fΗt’ό}4TeΟG†GΕ8¬ G’U’Aόση:­fρWM©Œο―«‘;¬ kΩ2;€g³ΑŒ9죟ΐNϊι?M“c‹|Ο ¬πόfΘ  tΙϊroޏΐ£ΟδΉ5HP†’‘)¨| Ο©Γ`_ ΛlŒ·h²ΘΎ•ΑΜ±GΔχ9₯ή†˜ŸΠό¨Šμ4™Z�ΫΦ؜j(Mšœ<"SΧΫ�•²p¨Ω” εάΖ…fϋ’Ώ 2`ΧζΩΩι J Β*ιQΫlσ�DgϋuXkœ§‚Τ‰N+bύ Θ:ορeœm§Υd·πϊ>ΓΙ ž9k<ϋΆLηπ]ΞGΨpΖq Z��ΜmΰβΣmΖ εΦˆΟ“΅­ ‹“ƒƒ4ς„ΐs|,Ξi)Ν"Υ“Φω*―Ήœs!δdΕρPG€tώιδ‘m7fϋX_ΛΌΞ‘ Χ9­δΊve ½υΦ4Η|#]θ [\‰~J½`•=4d—΅΅Ά… ›| fj“μ—`,pV†<τxd’ΩsδΩηχ‚₯U€_2>3ŽμΣg‘χβχω9ϊxψ€Ϊ[ν8ΐ‰},#υ^μ'ULv΄€σ\’ ψW’:{S5 x^# ηŠθœ(9^«;›_l―υΓ�Νή{ΖXšfχ}Ο­œγ­ΊRWΗιžιΙ»;šδR%ِ!Bϊ H6`Ά`x-Š’Έ°,›X›Β’>P”–i "΅Τ.‡z'φtOOηT9ηœne�~ηnΫ– Aah}0ϋjΊ»κΦ{ίχyΞsΒ�όΟ9€©ϊ•�ŸŸoΒΔ/_Ϊ%ύ hΎηS|›γ c§XS ΩΨ€Je�ΨΣ¦°κνΜ&½rτUζIΫψΛ€ …ΘΘ ώΗουg6 ŸΥ©Σ@IDAT…λFΙΊUΝο©gυΑό›Ψšα·i²‰)A~Y�cω�ΰ–λeΦΩuΧΏSΣ‚{ςLΛΰτΛ=_EΞΧ‘iεTίΠίσK––zΓF†ΪMA;ύŸ"?Ϊh―Λκ°θl™$ϊη1ΑΜ½βηϊH~FψέόΎgoΗΪYΖ%˜ecοUτ³ΐ†#7KΡE²o=3–Ϊ/FYρwƒω‰n΅ηˎ±ΏsΚΏm긏=ρOΑ~ŸΧ€ά¦Ρϊ2άBθ#“O>§LAοΩεΪπΝš„�ΓβC'Θξq,u%gΊ―‡$ 2?ΏΌΔ„”˜πb2Β‰^Nhθξkγ{•€GτD(ΪG—ŽOŒ¦τIg¬ΏdΒiO”€,\˜θ,'frlΉƒΎ²qΌ )ύrΤ£Œ8Ο²ϋοθˍUβ—’\zσ­—ΣΉ‹gi`K�0z„Ψp{` Π«ŒdβH0!,™@,cέeBͺ�σ kγ~σSK©<E€φ€°!’£ι«ρ[Θχ€,~’=Rbδ4φ‹�Αi€εΧzΟτύΒ/όΥ_ϊ§μιβ?œ―|Ττ‡σΩΏπS�Ν�ϊΟ>ο…šφfŽ‘Šc †vA©GEY:�Γ?E)­MV¨„ύžΑ¬€Κ$ƒϋz�d τΒ›/EQ˜ΡD'‡"p.k(5Œ’ŸpxSΊφςEF’•�,― gΝSSS‘‰0{o=ΎΑ•`†h ‡Σ ζ„k•Ωˆrk|lΰtώμ ”μKD1G­\dV‡ΕΖ„‡u²ΔsΣΜ—]^Δi 3Κ][shλωlη8΅ζl iͺΚ#ξσ¨Ψ8³Z«€Už‘ΨUvj8ςm,vO5ΓdΆg *ε£χ1Κ jEmœgΏ†FŒŽ2¨½Š^…£βp=#Ž#a“§6YC…‘B™ψs�τί’Ά"ΪΎt. H4δ^Χυrζ6Yo³Άa„ρζ5$ε¬a–ZΣ:ϊ0τv·BομΓΰ“uΛΑ,€’ίήΥ *M θ³AΰΒΖΤΣ45ϊ˜{ΧY~ΞppŸσ³Κ½n5 HM=ξΉοΩg·+φΚ φ ©ζΤΨs°‰NΖdjμΡ€’φ…΅‹6ζΜ Έ)ΩΕ(oBͺ\M\Ώ‡‘°ξ‡Ή:†ZŽξΘ}&Xπ‡=�ΒI΄γ·ύ2μΞŸi·bC5k›5DeήλU€‘ͺΰ:ŽG*―e<e9fΝ*‘ kτ£€ ˜°&o†`MgYV …΄yYίkΠc#αα‘(MΠΙSFŽωή)ˆΌM%qΉV…5ΰ·Ψt -₯BΛ2Œ]z 4ςƎ¦˜n6Λf7η16η0~ΠeδHJAπ E³6=3Poll λTŸ~ϋ[ΏM¦όN”ŒΡΌQjό<†Ρμ¨žfW"H6‘QΆ–Ρί·Fq›μwn―”ΊΤJδARΞΥ ²†ͺ€’ΫμTΗΐ}–}"Jžw<¬5₯β₯15K`‰ΕŠλθμlΕY'[μχmώ8xι`Q&j?][I–5^6DΜ64(.†γe¦υΓχ?HsSŒ^­ƒIC¨ΐKΕγΈFC'Η!Ϊ—A@ΐ=τώm‚θX²ΦΥζwΗό»Ž€]'άsd“SfΫ.θΎzνΞΰ'Ž€ΪπθkdGφΦtiπe τNΑΑŸeςΑg g’3p€Όπχ2- =@ίJqΤ™›™›šIv–¬΅c\^°Lπ(x`?…9ΐ©FΨœ/Α¬3όθβ=@§œe›νU&™Mμ|vϋ6ΐQκHς<šAΪVgx†δ˜ψ}<½tνυkPϊ€ φT ?~φ2Mλό~ŽlδΝο?°?:±G<³ϊ‡ηξ˜ύάcνrd|tβ\σ‘ε1Ωψ3Cώ+θί:F•΄χχ\φ�ΗαAΝύ8#θΗ…ΉΙτΖ—Ύγ'gΡύ,眺v‘,kQ@€ΏK)b΅Ύ<]Ύr%]Ύzj)rNYB+ϋ0x~…m0…(‘ώ§> ν”ύ²\§ @²1\·‘οο£;Fž²pΠ£άz”‘q„γωšΘhZzDύ�™$B–}Z»Κe)=2s:53‰\Μ /Œ<~š†?KŸέψ4¨¨²ΣFΝ*+ΛΫό� k°�Ψ—FΨ_6έ\A§š–₯!˜=H°,ΣΔ5•ήίΦف.wΩsώt?2fMτ’”Z³—m4:μ?;ξ<|”ΖffSύWΆa‡Η&Γ²Μ/,.Y{Θω3SjεΡ$¨ΰZfόd9ZΩ?²ΤœSΛ0|ζrδH]‘­�/¨"(έΕi/EΦ€Ν 6ξοn2ρδvΊK›nvwχΖyŸβΛδ­V§φœ±ο ΧΖ6wτ2ώt‡ύγ ιΑ9°ΤΝμβγΗχΣΓ·±±4Νΰ,SΣάΧ;¦'gΩ@‚,|Ο‘}NΉμσ"(om·A―b`YJ—u§—ε*fzsθΊ]ΎμIƒβŠg–v΄[`BΕσ/ΣIΖΔ?½N†r4½ϊκλψ)‘˜Nχ}ž>ύψ¦=<ΞΐΠ2˜Ρι)p€.@θλΑς’ςΆΑ ui1Ν•όO�AωΠ–θ{y.Γvs/²S΄ώ[ίMFwΏ/(iγΛelΑτά%ˆ6.*/¬φφQ―HΫvTκ, ͺuΐŽφ^Ϊnΐƒ€ΆjK_%ΣΌ‹οC©(XŸG]­Πvj�ΨγB½�ήΘ·δE&„zVV‰AΊ™Τ:Κ†ͺ°­E<‹uδ-τˆh¬£lQΐ/υc«ŠΘι[C+ύ¦Γ5ϊ`eΎΉ�€E0ΜsσΉ2 τ<›κsΏlόlΰ VΙΙΪ$WΫuτ3™ΰ9”y`β¬Ώ¨Ά�)Ψ2Νm₯UΠΜ—L’pFJε]|"Ηήn#¦BΎοοΤ9JTyΡ§ρΊžΩ°fΌρHβΦMΠ™T;€ž―O«9ΣΞZ«άu₯l2ΩΆYΛeJαΌί`βr�Α`ƒ‘‰ 0ΡeO!AρΧΠǐqβΏ΅3Ny`_χ?ΨάWΘΊΗs«α½Δ~꟠oͺ±‹Κ—ϋΛ₯BΞ΄ε>‡ I"{ν<99#Ÿ¨@δε‘ψΕ²J±ŸŽyVŽMœΉΐ»\#φϋE°|]3Ο™{₯NΩα=ψδφ ρ³΅9ΑZε™υ'υ±x>NΟ©gΌŠ}1†‘½W]·sεwŽΤD°­FΆ½K–m&ͺ)ά?ΪK£Σύ>?~# P#Ύjο™ήHnΨ<ρζΜ`‡Ÿεž¬8†Μ±ζ’ήΛ&~% ψ^/]Ώ€œ2„—bi!uΚΘ ŠΏŠzζΞΎ�ΤBέΆ£΄ΞžνC– Ϊ0Λ0>Ζ\#{ΕC›q^¦�ΨZ<¨U˜:\6²Ο‚ηΫlQ5™‹τŸ ³o7hk…\s?6ήQΆlψgm?p _4ˆΒ©1Θυ9<γ�ƒD냕G8Afj”_{’¨ϋ₯ΞPn=ΓφΗ°φQ}ΠΩΩ…ΜΑ’ΰ,΅΄Σ ½»#š©šA“ΕόΐΎτ!#Κw=@`ηΙ€bvz†{σŒΣ΄, Ku·�€4d³jήgžͺ‰¬ρή»™:&ω,[” ©[|ω<ΡΗAγΞZθp­°ΏOF˜χNzŽΰΞFU6ρϊcτgdλ�ύ»ŸΓΔ‘$g7CΦKΪ§ϋ!εVΩwΥ]ŽδΫζzϋΒ{86�3p9ζ>«8W²›ΜΔΪ›a=±Ο^lLυτQ–Boˆm²mΚ ξ&e>Ω`_5Σ<κAω£;w�0Ν0uY«€ς‚•άηyνΣRJ¦O½n—ηZ¦zΣAλτ`ΨTΩω‘ƒξ{6ωϋNα ŸΏΖh>eY=ΒΓΰ0“=Eή jwqfNΉΆΏƒ(ΑrbΉ?i½ψ80ΥιOύ©Ÿc/86ΜωΑ',fO;»:‘ΙZœ€4xa rkvαΒ9Ίo3rΐΰe˜^§υQ6T, £©œσ�‚cWΓ™.€ξ³ƒ}hο Q Τs–ΏmΣ@man:šςωs!οΛ ΖΜo5²3><Μ{aΖTψ3“?+ ϊK•·t€}ؐv|b£Αψ€κX•ͺjfKϋ7CvωΩΠΣt €†•J€–¨ϋ3Κ&kψCƒDδPΆQ ΧΐωsτΓΘΘ)v¬Ÿ{<Œ }#ΐuŒ)δώ₯*¨dPe°PΛύ#¬'-‘‘TV œ€ ―1 δˆ5’•ς³_ύ©4G©Γ4Y3ƒΉ €γmώτOύ: έ¬5gUq—Œ›@Vδ„σΉ θ–·λθItƒΐΏA£6jΐ¦YPyΎδˆ‰:¬’σοάΏΛe Ό³Ο―]y%½ϊς—‚/₯·ΗΩϊ_2φz[ΒσΘ„™ ŒπώΓ»?ƒ”d‘W9Ϋ5½°mΆ―dyκ›hΐK‹”θH/ΣOe…{Υ6ͺ·΄2‹¦mζ9°Ι_)gYΥ―¬.‘%΅œJ aj|šλ&G@bM±΄_ΛdEj£Ά`.ν( όΝoΜ₯"|˜Χ―Q¦ΐy’zldKμI3˚{οΎϋ.#<Ρk‚sK¬•:?τ J§W§Y›n€’c/’†šϋέdOφ Š(ΥςΩ”7}…žžžπΕΜΌ»‡ΎIπΙ,χvtƒ3`“hϋλhϋWa~CtΜ3(/­ΝΘά Y%μ΄1ϊaL§—/Ώ@Ήςβά Ί!ί£ΓΟφŒKυ·¬Γ½0#L2Φ±C @ΎwͺΜ"Ÿž}@›]dΧuŒr ½�ΎΠ†Ι1ένyΘV†„g±ŒŸVΦ#o?<QEϋ‰fγΆ`|ΨΒ½V~*κθυΒ½kΈ|¬©6‡[eσkΟtψKΚ+_ϊfήe˜hγλOOaP2³˜Ά ψbΛΞ^|B&T:Ϋ”·@ς*ΣΑ³‚ΉƒΙβT£ί@°_�‰χ!«Δ³ΕΝπ;€ €w…ψ­ϊIϊ‘άαύ&Ζ\ŸH qών©€.΅l+X₯‚Ÿͺ'ή#θl"Θqέξy#ΊάσΊ‡mρ³CX;}wύnύ�. £ύŸƒλθ›{ί‚�²pΜβ—βΊ.�W$ΙΈ�~FλȌ™n'R βεΨWυƒΔ&gSvY=χbi“ΆΖz›D‘©gΏ><�-)QH½Ά7X?3’ψ–ŒΚ<°³lδω½{^μqΒmϊψ�χΊ[BYΞ:κ‡nΠGczp’uκ& (ΛΕ΅6Ρ$X顁F976l¦Μ@x9Χ'ΫΖΎΝΣh$μeεŸί½°ΆγΙIIΥ$WήzνΥ`4tQ"πζ›‹—/” a&Ÿ§£Λυεˆ5ϊ{{σ½`u­ΚΊ‡²"ςΐX$4i$+ΒE-*^`―X³’RτΧ±ο„“vkvχ7Κ«+Ύωφ;oώΥΏτώΚ φR8ψύ οεΕ달ΐΧι—φίϋ­ί½ρρ@5ίρ$\!vΑρVa”`ELΝd hδtDνu><�a8 Ύόž™C₯Œ ‘6£'΅ZΗΩ™�:τ’d­νυ©··-ύ±Ÿύi(u’‰Ÿdlέ|ΤόΨ Mύ«ςΣ8zπŸ- =2ς|ψ6ΚψεkfXtΟfpλP₯‘K“2Γ€!±ρΣ2οάω<}λ;� °”ΙΆžl‘•�n$³ “ƒ~@‘Zθ� .^ΈΔ½WB\B)8ŠΖ[ωξ₯Ε<V<(y’ŸΦό™‘qΝΜ ¨ 8\nΞ E §#< m}•ϋtτŒέζWCY«$ 1P*ΒMŒŒέt₯L«dA΅·£μ\|^RΆΓxρ³R³^D₯ζοͺμ ˆ‹1§tmΪί#εykhšRFΰβύΒ:VO–�‰Ο9@qξ@i=! =DςsΔ Υ SCΈΏ:KΗeh\T¬ψΆ5ί–:Ωά¬•:~Ωb[4=ύ8lL& δ9hd‡όJ³n’χΓ³‡wXgdj©`βΜάd:dM-ΏρΜyuŠ‹Κ(Πϋ6”έ΄)ΑβΚκ"tvφjvf&vΗ%Z’¦σ] λΛμΤΖΚ ™W&ΧπGκ0Ηθπ9Ρ€Š™υ8v–3d +š’fέΎH–X�2Υ¦^φ³ΩE–,Θ`K1όN=VηG^z�±Ά μ„1s%œο#²D§θͺ6²Quτ(Γω΅‡‚ΰΉ ‚w`'ؘŒ‡ΰά£Λ`e φZΫ:ΩΤbMhΈ„X=ζάΌ£ηrΘέzη+_y'2ϋ7?ω4υ"Pα5°�W/_L·(  ΰ™άΓNiΡΥr¦β¬†Αζpq^₯S#4¬cA2Ylmξœ§9½€ΐ2τŒ ¨Λ/]!γΩ³’Κ>Κ±gI@ΕϋΤV{›‹@—3?l«�,`ތύ¨d_ωLY 'μ‰~S `~δ(r}ωθ…ΤXrc€­Ÿ-{@'’0₯―ϋ|ZΟ†΄Α’`ε>ͺ ¦zO7ΡΎ2R*Ρw²,ά Ωš~Η³κTΛβ6΅Υ·Κp¬β₯έFυD�ŸC0UpΙC†ϋ�εA@»·‚εβΈVK=Ο,s0u Ό“œF‘ϋΥ5Ψ‚ΘιόΔχ Δy/ΰžWh}ÁGžΠμƒLιzμ#zίΚ©Q'4•wŒd)zΠρ³σ«sι½―#[ &@Ο¨?³ΗΩpΆ|Οu+SΗ²Lξ?’|ω)1Ύλ£}²ό@ζ† SΔaΨ ύ_Ά…—¬“=&weΞ– πQŠΚ> ηΞΧΎφί�οΏϊ•·_Ÿ„e ’yρbbΩ^¬Δ[―γ|ς½[ΧπƒΓέ흯4·΄κ0š‘5pΦΙG�#xWΙδ‘Q:_*•·FD%˜οΞ«R΄ώˆ±„80*5ƒJƒ`3τfXΊΟ΄Aο»Lφ¬™ŒS{3œ-Ννιφη7�½»wq ρ“z1XP1"–"Ύ|©>U(z.MOγάαμ \€qYΫΈG†w™ΜKŽ?Υ�@0R“ΥΣι v-=Σןή|ϋ-“f‚Ο¦ ƒΪ¨©½΅=2φh•΅¦Οf€ΦΫTKj―ˆ²FΣgԈDξ‚±<r#ͺ6xž%²"»‚ °0*@9­»΅’k§!4‹βKhΆ]šg?Waͺγ=?rςœϋ@aͺΨ‹Ρ4"Ρ:�ϊ#:}r�aύ{ ₯38ufμδͺA�₯3y%ͺ΄ίσƒ ž€EŽYlλθL—�^CchQζ:Xf]r«3J+8΅ΩhLTΣ{5ΈεΙ'ψ+μ; ͺ‘£ΦΘͺΘτβ†ό»ΤΐRhΓΫ4kr\]1―FlηΦ—Ο‡OΓ Δ›,棐fΉxλΦΓ45ΎΘ΅€·γœ’kU¦l ©A¬©Α8’±θθοad7H/#»(£0C`3%gλp–Γͺ¨ΰY›:Ιp4RK‰·@¦²cμ‘£uzJpp+j‘Ώτ•52’,«g@gDl—{ΆfWYyΒχ2ι•W^ 0όl„1•”-π½-(ί;dΛά§pΉ†šΦΠAίGžΝθCS³b©Ω`ε³ηp8›qφ˜� ζθk –€ΫDΦ`[vΝ:Ÿa9Ž± eν�YŽ9žο YΠιi2jΘμΜδ4H2s܏  Sžg@O?φΕnϊΚ€`{)x§“hCb•αœϊ{:ef[4τΚ›χ£³$8Θ>אu€ό+Ο‘©δwΜ€yoΌ3ΦTυZQ/Œ|K΅1pšžžF>€[z^ͺΣg·ο₯οώήPΫg’½ ††'Β€G“>nƒqK&œΪ’žD‘νΤ€α6ƒ―)₯•ZZ)Λ��E©€-{ΞΤgf'|ΏΟ.ψ`/”ώ>²OΚRχ«C[ˆΪgΝξέxŸ©τ!¨“βθ:¬/#³|^ΤqΟθΟ³ΐΉΙžιl¨GmPYO  Ξς>―½ώv|v Œ)ΑΦOϋvŠΆΒ:z©ΎŽ\•1 ¨ͺ£‘Ύ‘NςΑΝ[8:{!GfΊtΊB ¨ ?ζ,q.ŠϊZ{»¨Χ₯ηzχώ½\{1u@ιμοιηΖD©ž¦ž>N+“ΣœzgπŸ ]Η ξ±ΗΟυΆωΑ»tQ(――t|΅τ�K˜@Ά›ϋ1藝σ²εp˜—a;˜έΣ1RΖZΫ;Ι"B%εw©šq„f ΩλάέΉχ0=£©'²a3»M‚ΏΡΡρ4 »ΈΊϊ³»χ,²ƒΰμ5$77Ά³OΘOΧδUp`� Α-άM@ΈΕ₯δV ?7ΣF¬8ΐs λ[šdX©› σ8―-ιΪkoΔ΅σ§žw4ckΑiˆ³ΩŠ^°™oΗήξ�kμ» mœ§ίΡΆ•θKȚڻ�@’½zpς«qδχFOφ|¦ΞεEϋ0ƒ;螚=ˆh’ι•:f|,­ž5ΐt²‚ί4[e«ς3x6₯γO†`—Ψ“ζnΨͺλο{i#=MΚώ,/}eTΆH�Ÿ©^0+©xfΓά,³ŽΎΟϊ™­„ξmΚ d�|8‡mμe+rj°kΉα μuXž1uκχεΊyΖ΄c>«t5|Ά}μ€νXgM'¦ΖΉ>€7{™DNΖ°›zHΰ@`_}§ή±i’AU₯HYΚ‚ςσΝzϊϋ²>΄ωR�ΧΉW‡xVTŒ²κΚ›ŸέLΧ?ψAθNmϊμΒ,μ‘!ό§HN:Ψ,[cΤ/Λθ›.Λ³ςYδi €KœΎu°nu±'Η�Ημ”ϊsˆδΜ˜G‚qξχIG—2Ν„`ŠeδΩΡw¬kτ\ΰΎ}6TΧD»‘.Σ*Gώ Μυ‰"ΐwέY§rμ–}•΄₯l'6#‡|WPVڏ¬pOžϋrόuˆwMC[Θά‰ŒθΙ€<i[”?ΛυŽΠ§»KΣ$tπΑ‚‘‚έΧV#Fˆ-rΛ—lύIΛπ]•\―Α+Λ’ϊf΅uΝΘ gŒ@Ϋς²jΫwΆI4‘Ϋύ<v€ιϊ²�ƒΎ—ΊXω Œ‡OΗ5]gΟ­ HL3σž#ν’2Η[βž»uςϋ�ΟmY “(Έ9―₯Ώ#`cΏ!}MŸG}kΣB<3ύr'B�r₯˜ˆ„=±œ «ΰΚΎ,2\»H€hλX#…ϊ2ρdfςγΠ ΪzΑoΟB– S}°MΐΥ>ΫΣ7GOtIdπ1 ϊI,‹λoRQΫ&[Ν3YŠ� m³_“‰#εΪ‰Ž Θr=ݏ=~o_Ϋσ›/C „χ°»Κu%χ£Ž –Ο’―αωυ³_ΉΖΘηŽζΤ‚]s»±ƒ,JKΌŽ`©Λl(mί©ΗχŸ‘ ΑΟ<ӟ±g[9“ΡΈ%֍π”-Ό+ŸκQχ™Νg Ω/ή»‰M+ ρbΓX›χκoXξ%Έ†Ψ(dΩ„>¬ςj"q]οOR{ m’c|ΖS˜»ψ~–° ΆΈŽN³p tͺβd{ωμMMΝ�δ§~ςώ�Υ_ώonVWΣερΕλ_ZΆζΕλbœ²πι­G·n}ϊύc¨€ηΚJ «cͺ™GηH‘ηώHΩJ)Άn^p€@cζΑVˆ†j ¬oRŠΌkμƒΪŠΡ‘ξi°QG†βΥΧ/§Λ—Ο₯ޞ�Pš>έΤ>tΗKʟΑ£5?fl¦bP£r—2±g�ς%�Ga�@>ƒefΡΒΤb€χώΕο€ΎϋΑ ίpD'&ΗΙ„aμ0^P{/‡ΎΛXBq₯Ν{=~΄Qœ³}ύd ιdΜ3hœ-=°‹΄tΡ0Œ<»ŽYΠxΉ/•�7'ͺo–D-aέζΒγ#YKQdΛ 8Un�§υzΧKg)ZΠ»"ΘΓQC‰i8|Ÿ/ύσ—…�yœ±_Hλ ₯Ώi €ƒ³m(w)4^*;Ε 4R’pP]H'rK³q8ΙTRΈ Vμ^‚³VBζΊ‚ΞυΉuF‘eΧ™“Ž]Δψ»}²§6DllνJε-}Λ‘πͺΘΤqo6+R™»4 kδvQ¬Ύ4ξgΞXCŒ”Y΅ΨΟF–�ΗοίƒnF]ϊ)Ξ&Ÿ₯SYΒ}Zk]MΓ7μ΅τΥ?ρΣ¬‡γ΄(ΐωΩ‘a•4 Œ^¦q°Φ.[MΆ:UΤγ°γΜ�βdν6ηΗI偲jΝ,'©Δ‰k₯φμΰ£EΣ$χQzJ HΊ©”?‹,g—Ϋ±�μ οΛ€'ž1Φ‘ύƒQ²“ƒξΝοoGζ™³ΒuΜ"J%ΥρHrΖ})HKGwj “ΩA–¨­»#5Sr#ΐ°²Έ„³°ζ^(wŽ2ljjdmιΪK‡υu²±fK9(­ΩΙε”=XοΏƒ“,hcΆ*‡σ³Šs�CJ ΙΊcĐkε\ΗΦ3hC"Ω5>‡Ž ™3)Ξ”7ΫεXΆbθx~Άς¦Χe K[dd˜%ˆzGΦΗΜ­:"o,1†<«2l–Z@Kc―#PE@κΪŽΑi4oΜ66ΠΦS5ͺΙ° 3λ>Ž&₯€³OΘ*ΘΪ('(”²Α YH›y ψž[3Ση/Π@ ‘ϊEpΑ,»½– ’Θΐ–SφdDΟ€ŽΨ·/ψsƒΡσΔ²3;d›g&GΘPm€Rτ‚ΩfΧ_0ΕΙλθ3‘=؈,Φ"}φσ}²ΊκXŸWy’ώn?‰Z@')³Φ+N: <χϋ+%WύΠBύΎε «+¬ χ4G AΑ˜΅Ω ΣσiθΑCφmΐώΨTt“Γ,‹ ΅ φY¦Nkog:ΰF+Πš:αU€ €#2£v)o ω;bΏ–§¦Θ„Λδ‚}‚½ΙύmYcι Žœrͺc~BΤmί™8χlΑ ζ£§P:ΏŽiGG%]da»‘7ƒJΦΊmτW…ΞΟ™%fΝάΉξάψ,έψδ³t�ΙӘ¦’γϊ2ha%6ΒΪΕaΣy^EΏΟB)έ [eΖ9ZCŠJ›;: :aμ₯ι‰qx6Χ^Ίtc;ΗBΙRͺ7ϋž47Q›Κ½//Ξ� “ς9tΟΐy¦|ΰδZΚρ­χ~—FZΣθ`dΨΖ†mπ›d±ΟΎŽl8vΣμœΞͺel6΅ίΞž:ηχΪ«―GcΖ}ΐ„V²ΨΚΚ&L(χEpΚZGιΥb§²Ω,χ{ Λδs¦ΨΠE”qί2€lΈM€zŸ3c νΙόΔ,'}^ *PŠ6άΪ܍»f�g6άs½  –Ο�2¦l‘šzτΈ™ΊΘnr>|VΟ2X]8΄:φ¨”p�7B T&YYžΑ ΐΗ–δ1z&α@ΟQ[ύ‡ί…Ω7Μ4’{”Ν£ΓΉ&Α›ΊLζ‰LŽE˜6ŽΉDόρ5tͺσS=ΪΡƒυυΡσa‹}Οδ:¨$& Dό@FΗάσΰ= θ«ψ< θ.j_{ŽŒ΄hhΔ΅Ι�—M–-54(’ΝggviΪ2 ¬|>$9jΉηVΐY5ŽˆT’½53;͌y²šΊVΛ€B‚Ϊ?σΥ―chVPΞΙ.PΛφAdHΚ(σ<·ΝZ-½β!±£δtΙΐω9²%,ωicğv[πΧQ―‚Β²Τ±κgiΨ65mfβ†λ`3ΪΐΈΥ b°δ,—™ššP€ovΙqΊ�ε,�qQψ²^AωηΟ Ω³ΎϊJϊhξ‘ΆU%’(ψC κ¦C²�RΡ 8›`nΤΠ$‘εεΊ―θΐZ2ύΪ`―]TQ‹ή £Οψ:@/Εψf�εzι‹Ζgλ’WΛZϋR!μ’°$yΖ 4ΉΠρ%°-ΨA†^ί„s.X¨|hOxfYi–Llm1ςv`b€j†ή‚π9δΆ ?€„3λ³iGw}ζQx.?Ηΐ^φ’6>ΦByΒ�“j/Π«,ͺ�Ό?AKGΥκ;kWέAeΟ”v"½œ1­5¦β˜ˆΣŸ’ε+ΨI*|€όD“=eΘ‡e‚&ŸLLΎΚ ΄ό¦}b‰ƒύτI ΎΥ݈[~Mπ=½ψŸο~³DαγΧβ*‹2H΅λ2 π΅γφ ‹ϋΰΉτ!Zτι\cχ_ Δg€WΜ^ο³ξΕψκ…ά«²P6�0w-£ά RξΨvdπwν(_`ΌΡϋΌφΥυΔτsηηβάΙ.),dƒ%‰`'ψC;”Ÿ,γ—;Ž΅„8czt–ηΝ62Ӑωη@JŒde?₯M*¬£3΅―φ6Πί—Ι'dΓ²μ}  Α 2o“υ·ί|Π₯ ’3ΨγUl§ Α"ŸΕύ‰Cψ’mϊΘΑγGynμΑ[ώ-xmCZFΦ �Lό`œΓύζώ§ξ―όΙ?ώ'η`πσ―uςZδ_ύξ‹�­Bvψα'w?]]™ΌΎ²4Ώ±0?ΫΝ䁚f «NΜji€b4J$t4;_#βKEͺρ•*θVι9ΔξμΦΞs0:VAωη €K«SX‹ζ©€D�kΝή ΐ77¨Ÿ‚Ζmc �25+΅ ε:+΄ΑYAV3™5(’Pβν/ππ‘•Ξ+…΅Š,Ή4£}”K5�_y'}ω?y—ϊΧNΦΪθbν|T©ΐ…΅}νtGηοf€JeΙt€.؁•gt–ͺΑˆΑ―Οƈυ8!`� „cΑοmPš ΐ"Zh`oCΕ0¨όΎA–¨¦`JD�.C™«PJ € Ϊβ(ηŠ:mξUΓ šΟ3@sύ%ά“ξQvνΔλ¬w&½D’3”‰4TΓΚhkJ_zλ5ζ'wΑ(°†5ΕX wΘ:κD6˜™'Ψ(’“q†λbLZΞΰ<|ρY=G²ŸUŒ>Λm�ΰpηRu�Λ©φ Ξ5ΞλιAœ lςευ8,uηL9ΰ,A?δ4žRΦtŽDswp¦gΦΣυοίN‡¦S¦ j&Μ‹ έ—N7‘jB†aΠΪNΖ¨ ΉΤQB4#ψ³GC)Α‹S!κ©)ΛνmβTΡ8ξ ½/¨“Ά‘Y+›:ΎnŸΰYΪ{+ξ©ΰ yšžX©ΑΉ,ƈh譟“R*³ΔύΠ8uuδΣϋ‘±‘ gm;έΉ{?ΝΝθ�‡§΄ –C1%5›R >aΩωYLœ‰c(·e<6AΜvt¦¨η§œ ϋj³7{l!C΅Ž5| = £β€†¦¬u€Ο δA‹Ζyζϋi†΅chφ™Ž3#šbΡΝΐlκiΆΝK‘ΥΫZΪ«ŽΉh»΅Η6φ”Ab@ZΈΖ?§³†Μ*c:�%£w‘(pnu]SK$‚=@°�¬λ xMχ]pGg�Y‡–εŒ³ήΥΩ•^’ΖvGνιγgirt‰~inj:QόΞΘτθΘθ¬lβθX{Ύ”cΟ’ΰ‡‰ΜŠ5jψuΊύ»£”\―?έΪmG�.ψi°hζΤ€T‡Υυυ,Ϊ™ύ3φwiq9½qυkEΰʈΈfΐ΅N²©•l9τ†οi˜#ΠΤ)ΪB�δ4d9n ΥΖ³�?YƒoΟΎΰ¨ηΜ ]ΐΤ3lc�Nmk€½G³σfxΰτ^ΊG™ΐ*€`7:p™Ϋ§^΄gΰΑ\%C€«α|Y‚cY‚ΞeΘ5ϊΖ2LυΏ2^Βχe.}}[0`Ι™ε5O=JΏϋΫΏ EΝΊΫθRFΦ ™Ÿ±±QΜ}†Ξ%xE7¬Τ™I—έΰˆD66Κk!/€ΔίΪ9FoМpt„¦·4Ÿeonc&Pku)Δw˜€1O¦Ϋ°Cω4xž˜"¨@β\zλ‚εΤ‘6g™€c ΖΟmDYuΉ Π�†@r2>5ΑϊŒF#Φ)D&GξŽQήaIηΠ@MŸοδ‡"μ@[e΅Α>wυIgοfί‹£TΟϊqΗ$ŽΔ b΅ —βπ£ίΦΡ»+νύύƒa3‚Ł<. sf-}‚.―-ε N ν£Λ₯�ځœΔΨR¨Οœƒ­YΨ<,'ΟZ‚^Jj¬ύIΜΖqΫΌpŒ±Ή‚ώS Z} >άc2€Y8›ϊC™ ‚”R§Ώn`Άυ\}if]`#Θ‡οΕΪ—Γlάb΄o_Ο9’ Νιρ@’αaΞΪ2gXv’ ͺΩlΧi 2Vμ[ΠΔΤ‚,ς½ «ΐL΄ύpdI>†˜at-ΥωUΦΔ BΠ�,JŸ„ΰ3 [κ· τ4ΛΒΊμρw˜’Ό_[ _ ΄97Ϋ<<¬™€–„a/Π –2½tρr+R‘e�θ§ΘRΈtώb0'eOY πθαCδb99d—ώ΄C‹|69CΦMp έBBΐΔΟ0X²f9ώ†>Š`ns,BL[οϋld;GM·γR}ρΐO|"ΚΗ¨<ΨηC}f–΄π©˜“λθΞ₯%τ ςaφv—ŠΞ±‡NŠΐΜϊiO ΎΧ yQ¦ŒΪ£J9b…ΒΟ1ΠσΒς}Η„Ί fRέK°G–ΰ4S6x†�ΌJ؎² ˆ ιq@³K/ƒύ-(σ=“Xφ+ΠO°ΏŠ j<#{jƒnm’,$%²‹`Gjs Έc‚!Κ}DΆŸίΠ³a’vY}ΏΗύνPFeο˜ΔUΐ_žΓ�/ ύλΜ‹™YC}Α}@mš₯ʘ€œΆI`έs-5έ>3,k. U– GΎ Π͎@•έηϊοy†}mr€_ďΉ6oΘό[C ‰υvKπu΄gΎWz»>€,\Hζπ»dXθkk½7AuΟ–ηU}'ϋG— ‚Ά³›%hα}ΐ&ΤχVV zΝz Lx>ττ‹ Φ}ιοj'Υ N¦πOeΣ8ΑχZΖθQiΑ�ξN|xϊ GΤ?Κ°ε·–-;„ߏ{βF+Έ§bR¬‘��H8ιƒh§kBV±;ξ'ί₯ΟϊθΝLΞ§?ϊ,έ»g‰lQŒ@Ώsη ΖΫi_p†(ήwάί ί.2&ΐΰZϊ �WτTΰγœLζί¬Τ%o)Dl”1KRouΒ³/|�(Χb‡WV`82E§σL°˜]ΏόΘίΔχιΕΉ9 Twj|:ό1§ΙQζ΅ί°—NY§r@’2β•ήΞ6Jp §™ΰςw~ώk�νίό�kοBs|ρϊ7­@^R�M?}ρύο<8ϊo}oϊΣۏ―?{x{†nαoεrΫ5§X±²6Φ&ΰ©tž#·ά‘T@˜†Dϊ½°š SΟAΓωΕι©!«ύΖ[4 ΑHΟ”š]πpJu�^'Z>Ε䁇žπ»(œqL³P6:R™‡�Es6SχmX¬Έs266Β\ιšΘ0ΟOa@1Ό³σ“izi CΕBŒaχΦώ\ΊpιΚšΜ Ω •Ήͺ<ΈΟ_Εy££X“MΠaΗ).,`ΜPΔΦ…κψΉ>o(+Ύο=‰ξΪ`ΝlͺH°Y……ΩUŒV”½Ο™ΝZs.?–š1π:f ςΙΌ²Ν£β6?<ΐ˜HE7cηKε«‘Tαλτψϋ(DA£—Εy1ΘΥ°™Α°Fϊ”μygKCj†�_mͺ›μJ–•έgΟ_ƈaά@Ψ­Ι· ‘ŸνοJη+n=“Ž1β+3CaΘφpHl~˜[[H΅ m}ι”Ÿ‡DSο.Œ§ω‘ΟΈ7ύ •¬‡cξ&R΅dXa(‘ΡρMή§k²‹ΑαAΣΝ›Ÿ¦Οo₯B2§<Ο1e){ϋ”I0ν‘1[K³2;5©§F˜•Œ%phΒ™kkΑ©ηΩOqΠΪ*\ΧΣy½œμ†ε½G‡…iޱ][vΕΕYsέ r πmˆδ ηv2»½ηΘRS]Kν΅`ŠςΰΎ{ŸΞ[—Φivdœ¬ΝθpŸœIϞL¦½% Ξ TΈ€š4-—Ξ —7,όi†Ω ω„>ν0o:{@¦μΗRkg{4ΐcaΘ΄> ηέIΑvΑ‘p΄P#Tq3€Kd΅k93:Υ:Σ:ϋ嬕Y|3Џ<$Xُ Εβ#Ρ`@Μ#Η„¨ΘY Œ}qq…½ΖqCvά³'Κ²Œ~Šχd€ΛSΔύHρ―Β᳴FΆ2hgdF3y‡A9”ΐaΠΠΑΠ€[ί,kC'E#κχuώΦ Ά[ΘΔλH=˜Žl‰,’ (΅ž-UΩrΜM€ %Ο…ςδu<‡:ΫφY±δΘσ«σδω‘fμΏσYœƒΈW[οίᦩσ„βŒž giŽυ^eέν^Ό‚3°FΖ½‡>ŽT*Η‘΄nΪρz2RN`8CΫgίγή ΊΆqΒmζZ*e‘g$=w6ŠsΘ}Ɓsη¨Ο| `ƒŒQl#ƒYΞσVSϊεΟaxΖ{Ίz AΆΔT‚gχ₯©g£©€fvͺίΩ π*€^Νσš±tυλ„―žž^2τkιΞ“Η4‚εΚ)ΥFp]ΜϊνPΣ[‡ή}™�'\ =Όkͺ/uυœE'“™C€­&%«―mήΞ8Ο·ΓΊΊffΈbαvιЬΙ6”ec·>ϊ§fPECPΦ=|˜π$έΏs/ŒΘ>•1έBPzy*,`E ?mY2§dθD–Ρ©ζ=†‚XΦz fL¬e²ΦΈ�τϋm8VpLΠγΞΝO�δδB8ΗΪΤCή)'xk„Jέέ׏Ž-`}ΦhΉ›κθ_ ¨°―•QΐκΙ'Γd’f±%£Ψ Gwμε›­žΰF}Έ‘+ηΓfVœ5;w[Α�8Έψ�žFΞ£kT‹<Δ¨Bυ_―^Mύ½Ψ²yρΤƒγιŒτ[τ՘K»ŠΣμτ€²ŒcΞό!Α4‘rτ6F9Ψχ ·­‹&΅œ“y2nNi₯lP½&Έ"½Y_'άσα}I•7`τœΔ‹ί5λ]>φχԟξyχΌη˜Ο8E_zՐ ? <‚βμ ―ΰ8ο°φΞRœοιˆΐn0~}¦±0 ζϊX{Yvύ7CWŠ�-g�¬ †œ(c‰RlŠŒƒ9ΐ§"τ…#Že|hke�mΔd3ΓLεΰ>Υη'Ψ°#ΎΚ ͺ ξ)1°w’jBύ‘]υ#ΜίΝπ[Ώ‡co‚£ΣƒtεΥ+œ‘š8“Uišώ?+”νυtu#‹R‡#Λ^τΆ“MlΞΆΔlν6δςΕΛιΒΉ Ψ#>°1š1ΛΊ“}aΐ­žv― Pμ2™[φBζ¦ †U2ΠΔYI/_l χ°π…?“δκμθ"θ’)‡νε šΕΨwήΙϊVs―ΩΨηΧΫ Pΐη”%'[Ισν(_u>—­cnΥΕΪ ν£½cΤ―QBΠ©΄t)ώΎ”+νT  χ!6com’ϋj A‘ΕηβlΈξNε1χ3+ι]QVΣΔg:Ζ–1³κxΏχ•g»ζυ›Œ=όkΜ_sψ#>«  ?Α™π7ψm?ΓΜt!φΧkl G6ެĞ zo¬.!'ΨIZό»„~AN ³Σ.ώjΘ=gΔ}ΦfxχA6ώ― ‡ώ`>!†C«³jΠξ‘@„₯›I�ΝύωTΨν·χ*g^}1:`fώ„΅u"†kζ>zoΟ§)¨gόLmO”-ΕZι»δΟ„Ÿ!¦ŸΉdin૟! 2|φΡR³ξΎ/@gφ·αsx}UX&μ£φLΫ« wΏυgŸΫX+Ύ|&ν±ΝΗ{{Ο€Χ_{%zmqζj±Υ–% ξϋY&€οg‰NYkΗ۞°fN‹ ‹{δώ]7α¨žΧΧ½pOά+AΜ5γ–2’γDΗ]šLiAχНU€�ηΞ3 0K^Π²EDΞMAφLB°G<Ÿ ΐ`₯πY{œΡ ξ‡ecmΥζτ?ΑΏ�ΕoΜΡHΡ�fϋ–Xͺ76ό }HΘ½vvt²N]¬›LNeŽΛ¦οό‹oΓ²\M‹4f\ž‡uˆ^=Fχ² 隆 §EΤ! -Ω†νHcψ―ύό_ϋΕ_ollΝΣx]μ―ν Όώ΅ΛςΕΏ €p|ύ�ζP¦�ςχ–槏θψύ"#Ϋ ί%—†u\žΐςrάHP5K t υΪΌO₯dfo%κ κhU”‘ξ‘q;mdΉ[ €ΏϊΪα™Ωw”Ϋ:¨MŸJq >όθs~u€¦YΖ(ΪYY ’.™#Λa]{wέ™Q:6k2;9::™z2x"�Χ?Ίžf‘ς––Y‹?{ώ|(ˆ:θ¬6�ΩΕ©¨xόδa:Χ;z ΰDιE~ΝΒYγg@ψdhυΠdΔΜJγ²–w0CeX‹qV{ˆΎ™%^^΄;*?UΆέ:m}ƒ2»£ŒtL ,|―ΖG0BEδK§³–#“αθ/•»(Ήntt­·΄€†Y)3ε*P9½ ₯¬y%ΤLvYψ38ρd}Z1ς8?μ`%Ξ�ŽηΝzΪC‘I{5cUVGf‚QM€sC‘H».})φ5gD£€+Z#«yz΄•Φ¦žpη&0¬―ΜG€–₯χυ€»μχ�™Q€#Ω@ƒbοtεt,ω̍έΒτα'©]¦ωAAic5ε$0pR›)MιlnL/Ώ|žωσέ4=$³c6„kYo^ΙΏΝΒι€βŠ_υΐ¨θ?{cEcF+{8zg η�@X§Wp¦ΡΊw²Ί:Ό�Ή£ω ,6Ι@ΤΣΙΓŊ…@IDAT_mFΨlG=¬κψψhPθ 3Π�Ιά―/ΣS¦vvΧΕOΑQΣ~hs:hi°φyΖΣ"άx=‚(ƒε\g!J9>‹Šσ£S!₯M‰χu$ϋTX$[ΐΰZ‡†°·�aˆB)+K+ιΡύϋ μοs>¨OOžMsοωnγΦ=O48pDYt7CAλ~Γ‘ΖΡ²ƒ΄ƒτJ塚μ@KΜΦU` οL[Η‹PΔc–ό‡ Ϊ?ΐ†}¨†§'�TφMτξχ»££ΔωΨ"»ΎΓ—ΊN¦Š7A'kχΧηBΡ›ΰ¬;κΕνΙ�ɏό» ΙόӞΫ8…Λdw͞;βqj`Žς&.AvΦ ήσ±ι5�/‹‘γLΆGU€ΰ‘ΫHη.]N+€C«ΠΡ+ΨγΉeΚ ΘšΏϋεwωpφ™u±—Œ%C–mΨ!“ή¬ΐ¬g‘ŒΜ 5΄NxΡΉ5 ΏώU><:υf²Νΰϋ;μWA‘v©³©“υ-вgχξl"Ͻȏ™ϊ�”{v ƒ“+hjΓ΅xJΎζηηψ{Yϊ Ψv2mΖΗ§ς ‹ΉA½Ύž ξŽΊl@AΧZgήk#(€πτΖAζWeΦποM ?;δσψΈR~_{d`)ΰ/Γ‘ »~JΦ~nrš:βjŽ›ΣΉsƒQ³ΑϊŒ­ΐΠ Β{9Λf駦¦Ψ_2Γ¬»X$8/RŽ Θ–•Ρψσ88t *l‡ςš*μΟ³Ύ>ΛοΪX@ƒgw^z%‘Aάbok³Ψμ·₯dΛΛφ2Ϊ :αΥM@z‚±:ω27šHXΈϋ4ΨλμξHoΎφZL.0.ΡftwuRSή πΩϊΘ‰φΡπώ‹aX¬βGXJcΣOAηΕ Ιr‘¦ˆL<ΰ=ŸoΙ�9J:ƒΧ¬MCKπΜω{±ΗΖM1νbΰQOUΛI:;;π­sΙχe₯]}ωeΌ5ΚσHŠiΫςMT8½Α>/eΕΨ�t6λ°8Η4τΎΗ.ε|�[ŠŽ†VŽn`?Δ+‘I[9λΰ—2Χ$h£΄ˆ³tjΦJωΌqίπv’„A΅LΦτΝ&@‘λΪL/Ÿ*|ϋZ)γΚΏώ‡~η.Μ§τ£Έ/Η5??ώfψ΅76�SfΌηγΓ½T™νd­y?φΦrχ�Τ³�N— g) ΡίΔ2ΚrξΙFΥ΅€σή‡{1e»Ž+έΖ_΄Ε$“?Θ;Ύ―λ©ΟΐD §?ηηyή½™R²bοψeΑύ\υ„`‹S<žκή"�εΏυiΝ6k3έ++lp>0GωL¬­Χ<δyΆ8g‚a&ΧlF^θ)谐`ΏΓυ²΄Νς%“x'κΦ”›<эΐv²~–vQ;딨^{Θ’+§=΄dGMέ$Ψ T�-Κ7ε›Ό ΚHζp•`)ζΨ�ˆ6]ί)Ϊ'ιW—�]£Οςr„o;ΨΟΤ‘K6‹+”Ί²χ¬‘Σ %‚YΓΥd&›τΠ―0Λϊ}€‡Bͺ β}Κ„,Χ=K~[ˆ�°ό*γ @`}‘i4›<£εϊX–χ’$Άw±mh―Μ°6ξ9†•οYŽΝS!'8™¬Ÿ¬Ω©MφMΑθ˜x@(Y…y…ΏAυgr-’ŒNζš °I‡u3˜ϊΟ\IOž<’IςlΨΩ=μC1ώdΚ‘­�šύϊoύTXΊfS“δ7, «ΣβεS•κd›u“;8ε*i;‹ J•>|σΦ Ζ--aτ)ChlaΎχEΖ6^`6ρΛQϋoΐ`ƒ;λ=τ8―6 KC8”t& ‡ξΣ[Ÿσ=j <28§Ξ™U5=g8^+”&ŠΣ€ίϊκ9θ²6˜�XpI+¬!T1ΩiΉ42@œZ5ΨffΜφˆΤΫ°Ζ{�ͺύΣΪJ†ͺΚΧΟ¨B”ΒhVKjΉμ€bˆΖ‰e tC“+>³ '^Z`…ΖŸλφaΟ#Κή�w)m,ΝM`<μήms!ƒ2Š χΥΠ όχCΓ"i|ΞHoθH…μίζδθ―3(sκ�ή %»u�ϊsL Ξtq2G(CƒuμΧ�ΙΐY⹏©/»Cmσ―σw�Σ‘ΥΤ�Ϋ½'²Πƒ/ 2Ϊί,δ›λ+‘ί·βBίΗ™Φ™Γt†Ξk €XwξΒΉtώ�y¨οW»A­€οοzΠΈ1uΛB°q‘Žξ>ΟW ΰQM=Z3₯ k4rœšeu ς4Ό@³‘‡1deŒ€(@S3ΒZϋ²eΗΡ±YGOCn0uŠ£‹‡gΖΡfν·qpΘΪAύnμh§|†R ΦMlLιNΉ¨»²­δΫΫ!b‘±ζWω<{6jZΝ¨7BΩ΅ΔGΊ² έέ{w‘(€0mJΛλznΰ₯,I54’βΪfζ|Ώ_v7φ t†”I)::Κ)Ώ€\ΰ<ι€`,Y£15³fθt0 64�fσ"3Ε―κHψ³εαΌTD€―8 ¦Iι Ξ 'ZΑόΜNμ oAV0ΪΞΫ. ηˆG@fΌw›¨zFΜ|!Lq2<ŸΚΐ™Α»™Ω58§ή[5@[Ά™zUΏ“γΚ•—¨‹„2O ζΈBƒοΩgρί_~γUJG–‚:XOφ?›m`”XgμΕ‚%2β³U.sοf•ωΌc‰.PΤ9“Š(«%Œq―�-η.J Ψϋ-θθ‹4TdΙΊ�–’˜yCΆ]kΐΞΏΠΨ?ΧΓ-Ϋ‚‰Θτ–έΠuj8‚�“=vYξ½ Ή8jFv+3%°‰fτζ‘P/₯wή}—ή Œ6δΜαΜ4ς³žk«4’ΒΡrΟˆνΑ€.π°O™R!ς.•΅š;ύdΗtӈ±€.�“ω‘žκάϋ€YΎ5t ΈC8Yα$"{–“xί~ΰ<ω7ŽιΏτϊ�ΣΏ?��uΧ›ςύώ,£ήpθτ1evdalΨ1n‰ιαHώςώz²Fυ ”έP—Θ\^Q sd›8C½€SΣSιή£ϋi,σβΤ<ΩkXsd…Ϊ;;ό2“`(5`­GΥΓ{όϋˆΐΖ2ΩE8�ρ£S£±Ω`y˜Ξٷ钁‘YwƒιΫΈ�iŸΐφφ'7)έ™ 0Cl_'HŸ΅ώ:=dpQ€£}ΒϊΫ_'”ηdqq9l«`·Ά'τλd&UΠM{¦Œ P;Ϋέ3*�ν·_P₯<ˆσ'hP&θν9–Υ`¦LBΩΞ—ό\rχ΅œokΎ] ,Kφί}˜f°±₯εΘ²#‘₯ {Ž e ωg’°χ’/ λ§J2Έ±ΤO@Η1Γ²ΘZVΣΐπόμ;¨Β@ #οΓΩ₯ž\Ω5kip�¬Ψ0neFςμT‹‚~K§μbpi@¦>ρe ₯‚|U«λωŽ}=;€Oλάπg crBfΪ{[ΐω²‘š₯“0(Vmf `ο€ρΙ©Πεθ„θΝ‚―£ΜΘθμημVY@gα π³ΎΌ›¦Iο–ιaΏ Ω‹Rσ=36v53νϋζέ»Ό:‡œ¦!€;Λ|v;ΚΫ‡`θΩXΊyγ>Λ@Δ k³`b&Φ>�—οƒγ…υAd—ρG°[ͺπ΄(Λ ‹ž=¨XGξŸeZ”΄8ΪwΙ έ Nέ“Ϋb4-ώΕΖΖ ΣZΉζΊjœg§ΑcmCV2j› vgaq΄ΊO§œΔj³έ} m:NݞΫXDΞςmžg •}&ƒcAύ„ŒŠ!pΌ‘ «ϋ�` –Όk7ΤE‚j2N:»˜T1Π‡Œ˜aκ ώ°₯2Žτ{’δ”kz2ΰdg*¨Ώ}.λά=Κ’ώ A§‰Α}\AφΈ!tU< Ÿού™ιvΟΌwvΛ Έϋ`ΔδψΑ-›)Ί?‚gηi¬μίΥ«―`Χ:IGτ»pœ 5₯ρl1Ί5Σnι―ͺνΰYkΞΦγ_‘ά I`^L›°μ6τsŽ}­Bψ28αγ�&6xexΖxkLΐj qU\U˜ώψΟόd”ζ"αa’‘>5ψΜ[$Υ,Ρμq‚„χ€�Qβώr�Y“σFŸ½)όYΧHάSήeξδ8ϊH.ž Hυΰœ•§]@δpr…3<·ΌN)Ρ\šΔn³Ν°aˆdΩ7K-‹±έκ�ΟΕg95Gθ>Y>"#XόhσΑmcχΥ9θ§-3τ°εiϊέ†Ο_e―Ib Σ·ιήΞ liδb”?έ{H¨ l |Ευž�–�συk�ΧώξΦuΩκ»W_yωη�ςχ΅_ηΗήy` ΐΌxύ;�ΐ ΰΰίq‘ΎΘΫΎώ·�φΞoώΓo^Ώώώ{•”Ό.ς―ζ¬t θφ6‡Nο¬'HΕlΖΟΏγ)cL]} Ζ‚l7Θώ�ΔOAλ!ϋ b':iy€ΚΫΰΣnίw‘x~ψΡ§ŒA‘¦ͺ©M|TZ…:Ϊ(PZb‰†•{Q‘–σ{67²;ΈYNv”؈©½­‹` \Ά9κj«ͺ«Ι E’ΛυΚή NLMεV§Ηζλ";Β€ε€:0ΑQαhžDQkθσ…žΆt‘―Π€LΉ΅:ƒ&θ‹g/Q³Ϋ•Vζ¨+%@φωΚ`Zp✻m0s‚Σ/`}–kvΈ`‡ΰ–ΑWSQC[:\%θ˜|ΔΊ΄€*Ϋš¦n30*kdΖμQŽ XϊΆHͺτK•¨TΑνmθ΅j™τ½ού0-4ΦpOMmm©£x°Ι w;ϋWI¦ƒ]Η%9 @Ζn΅Ρ0‰m0P’β&­Ρ±{-ΩΖ0xŽΤϊψƒλι?ψ>Fm_'\εΦ0Λϊ(ŘW}―¦‰§ΝΝΔWΡΈPηCΛζdά~C“ΘMEyMκeζψ A„μ;ψΞΞLτA)†"�\8Β"œC>Θψ ­€ˆι dž³ν©œ·†ΒΪΞfΠώ2¬—Ξf?·΂”Me¬c¨=4 Κ.=Z‡PΓ―Γ/ΐαY�(54!f-m‚TG‡Ν‘Μ0ι€(?Κ“b§ƒQC lΆ,FUyΖωž2ͺΣ)ͺAΏ΄Dε%š±=‘9jΆΩK{cΠdΰšRh5ΪO3 α p]e} ΗήΉλ�νβgZΦc“9»ΠΫlJ™σZE\‘DVΫhΗΓomԉցυ}Ÿ`–ΞΊAΎμοIφͺμŒ€ ―+ΫB'H PЧ™”ehσw?……²Ξχχ²§A}ξ @φd―  σΉ¬%ŽΌ2§£`Ζcye‘3OsC(ΩΦρλŒ?}νšΰ€Ο1KΗ’·ή™Q%κ@3'–8HΈάW‡±Η:Φσ–BxήΥΉ6β4X©«…­ Ι3YjcΉ ΐ«ίϋη�œχΡXœ@Δ:]…Δf_:―�*mΰi €BM…ΘzscgΗIgσ° ΨιΘ?'EΕ™Le_o@ΡvšBηD ‚Μ±–ΫΘφkεθY-ϋ[@)@žpgΩ‹zΦ¨Ή Ίtν• γoβ|;Js;a&n JΆΣ] ίΤωrέLοέ?ΏψKώςΌ1RTωΠΑ·ΏMd1ωήά ψβήy ~©NΫF@#ϋΖι φA™Α&΄#Ό—Q°L‰Οότlμμgο ΚOΝΐ·df—€z€E›Ά‰g6¨χsŸΧl['(&PΫ΅ύεW_£ϋ:A:—­NΣ³ΘlKΘ“ΑάYηω Κ‘P‚D|H)ήη%Γ½‘13ϋ¨ϊ”b΄O΄[›Λθσf�OΣ9φGκvΟ!/‹KyR… …ήζ‰Νdef(g¦ QŠΒ 2ΞΒp‘ΞnɊM€Λ±Ο:χ’aο n*#xa"HγΝ$–D›εΕi~όω=¨Έθ šΉš@ +8€-ε d½5\3υš_‚˜‡ήs|OφΊΐΟςάμνΰGcGRf7 Ά€·ή~ƒ}`‘tŒ[EήΠAξ Χ8ΐNξ�ΔmίίεK]Uˆ�RΑΛhX‡Α£Ž{ηH|ŽL υ�gώρ³§€“θ§‘Ugάو—/CΕώ6_³Κ:Ο?22N© e­uθeŒŸ–bΟR:Τ‘_vGϊ5ΐΪΒ†Ψ�Δ ΙϋΤFLϐ ΰ>ήzσνtρβεθΗS »“υ­f$ζΒΙτ‰ΊEφ>‹I™σRΟΪ|V]λž €Z:’ χΜ ΖΨ?‘@άπ`©`ƒeGμ"²ήκYΗR;βΧΜ΅‰%Χ@FΖ‰Λ&μώ_Νzςν쬱Wlk~@ŸŽSzne­‹hΤ|²·…€΅δBπ²τΗΏ»žφR>ό^4lεή£„†Ο6 υYd›jKlώ[ΐ~kmη:YgrH _?*§ΝƒUΤΡέK€οe�ΊyŠrΗ#φΥr―B:υ;Q#Ψ\ίΟ—M``©v5tώΊ#ΟL΅'₯Θ‡v`}!B MΫυ\'r›ΨΞηΠ{η†8ΦVl tuΆ§~s–ξΜ“xTPΫ`Ο’Ή(ηχθ`‘ύθA‡΅ΡΜΡΜ+€Ϋλμ»zCΐnΕ³�φUΙͺ΄ŒQ»-Θ©όλf &Ίτ1ŠPΝoxo”κγq–” οQίΚ� Gς657ΐ4:“�]½Βχ°ε쑬²QtŽOΖZ…m@¨c=λ)σ‰Ÿ%2Rl$ksαCeύ$Π¦¬F³etŽ@΄Ÿλ={₯Ϊ'>[ΐΛ₯)ε‚ŒΝ%«YXΓ‘±Ώόγ�)ͺ§o,Ε4�ρ.χJŽ‘(ͺΞ›Ήˆυmξ>G1—Nf‡ψYš oρPΡU΄ŸΣdw˜έφw&tL€{IύsΟ,uΆ3‹ ΎSSirŽlGM tΟt6ϊΠη₯ΰp=1 £ €ŸΩΤ+Ο§M& ”"Սυ88*ΐ%d―Ž`g Ί3S €9ΪΙ|ˆ±‰¬α1NΘ1HyΆΦ Δσ ΅”E0q’Œ�Žl“Σ¨½;Υ‘Η“8pŸΆΘjšιϊ=B=66B“O1Bh{jήμšnƒ½©g#¬1J2hMρ){m°RL˜Aώ38Β|_GΦWN82%Ρϋƒ,"–Η@£Vƒτ||:ΡtŸ ‡†μπΐ@?%d‡ω™₯BNΈΒ8Ν\Ώž&zNX±rΣq_'μ…e6β*Δα)O”ΈΰΛxH‰ΐ‚ϋ4+cC@Η‰IY6 NV³C^M― Ηš₯ˆ2n`ίΓ Lλ8;�J£kζάkΫ½_g'h†|Ύ².»ΐIΕφƒΰeo³αχ’ΖWz%ΧΥρ4pΡΘλΘθθπ rœ/ς €”Lα~₯/ο™+‚Πΐ’ Η¬[.&­Μ―POHσ-΅�ϊAξΕ€Η³Τ3¨΅i–5«τ’YzͺηΜ₯ΠI:ύRΜ·‘«›α3λ/ύΌ„ϋ™™KΓχ‘£«Ήηϋ}ΊP‘“ όe˜…2³$πN7ηΧσ chΓLGά9ςΤ,ώ2mCc“>8ΣLth`*ΊkŸuψμΩ €œ%δΰrέ`…lύ0+dš�2žΛ^‚Έ|œ'jσΗ&’³Ύ€#*άΚ« ΟΦ‘»sσVγα‘§|φ|jΉ|'�΄™ΆωŒC7Ξ�αΩ ‚α’?ϋ ¦©†΅oοθ`νpœYη'n3ဃ³λΡ�@9-ΐQΓ7N O‘aYi�pόΩx›΄q»ΰ/DЦωnc΅ύ³ιχΏύέyΪBsΣfdyn@—³θzΨθΤR<ƒoKA’)ΑŒAΊ}EώιoόS€L¨`ƒΚ aΥ6Μa>�όσ°‰6Ύ2t;΄*€΄i3{Η²ΗΗRΚ)γόI'7πΫ#0ΊxαRP·₯‘»-ΪCwΦ“ύΔf±½9t™ϊHΩqRF| ±½[Ϋ”HΰXϋΛ0?φaχ "΅6ΧCΏšή�πS`n2ΑΕι §ilb=�ΐϋqΐ °Ά΅Ρά“Ασΐ@,”·�7�ρoΊ}4Βέ₯!-6ΈL'š /ηQκs!l@iΟ‚@φ†ΘƒžθSdCύαΏe+±^ωΐMη[; ϋO°₯VΆC{gΨ O’>‘Κn0³`fΤΐΝ3Δ-pώ gXΚ€Π½sϋ3@pJ:»�“Ρ܁zΙϋ0 il#ΠF.o€`yΜήi*<± ”Δ όH¬Γ$T·LΨCϊρ ‰ιζ1 ]Ζ;™Π•4ωsν—exεY‡εip`€ρ‡γθθ\τ6°,EΠ€QΨαcΤSQ<1ΕωJcνdY™%-Ηώ«CXCΑ³Τ�…}n NύΩ4–:E]₯tμwd‡#xt$ρIϊθ£χΡse©Ώχ,ε έψT4m&³ΪŒμ΅Α²ψφwήK‹Σ[θ΅έ(}8*FV½›δiΏύr KX§τ𑬀‹Ί XHP\z πΞα†5΅Ϋμ‹{GGΨ9φL秬[U›ΕΧƒ!πٍ{4™mO_Ί†cέΚ,ϋŽ Γ†,`dŸΞ°ίͺ2Vς‘:θΰGς₯ Υ_юΙB qRCY[?ϊŠ E³Γρ^χ\_Π3­_bο‹²LEόžM5MFθ·πφŸνΗήq6πΩl€ΊΌΫ’ύ;FŸ—(ο°jχ‘%εͺ‚g’ι'Λ@yί΄Λρ§   }-ό7}VeJR?Δ΅Υ—U_βΘθΣVΙ’ϊξ½δν¨λH’ƒχ[2P- ΞΟFΖ†ψ7‰’fΨQ€Η2Ϊ*ZΜw˜ΔΓhσbJlX/™ϊ|"Άι>χΙ=‘ΈΥ Ϊh ΚΠ [%{ο3X ((/#σύ°_X!6ΐ‘«ή—¬[K+ Pκ>ƒΜZΚJυυ,Ώ9ڑQηΚβaΨ΅€£V|( qyιχεΔ-hωœ!ϊbΞ½‰ ε}R`·’ΘR.3ωτ HLΖβ<hι_ο ^΄αΪΦ2όξSPΰ]ξy‡gάΔ3²GπnΓAχΚη­$ic/K¬”£}™(…<·>—gΝΊΑΌβ³•ž1‹‚ίa)₯2Θ“―*ΨΎ–˜ žh ke”ΐȐIμχ;Σπ–^gE\Ÿύ­¬.=\ΑΖ―γt1ΎρΓ7ήΌϊkφ/ώgί�j}g»ΘΙ SNπβυEVΰ�·β‹άΞ�ΏχW�ήίίΊυώοψΑGοΧΡδθ5άeKbyBΠ�0"�‹σ# uό©ΗDGΦ„Ω8ηηΊ½£eZγΈφpD9₯W£LλpΈ~ψώϋι“Cγgφ3Ρ:&¨5Ϊ�ΊΜ„θ`h踋▁xoaόTT*Ο}� g„`ΝlQ_?³�λiΥNζΥ›W’RΑΝܚ)΄‘ΦSšψ΄nkZ Ι ΰTXΓ/Κ/p]εGaΤΧ lβ³F“8kίΝ΄`Plτ"Πh‘θ,0°Ρπi €dEέ¨ŽΚΩfGΧ0b<ƒ·Ο{€>a₯π�tά0“8hdXψΌΞ[I)ŠμΕ…—^JοΠXΟ@ΓζZε8j|lgG-“ͺιŒή�^| DΪ‘0ŒμΓ ”“}:% _§<Α5°\‘FN u8^%”C”ς�1¬kjΕ@9†G΄ž{&8ΪΕσ¨μc$ύΊfξEpdΟΚ΄ζUž“gBΫH ΔξΗ�Tχa­,I«ŸZ†�ΉHχs&@={Ά']ΊΠOπζ˜+›JΦ²ίvδI=j†· γ'P΅‹1rύεΦp―]=dϊΙΡ‹‡b Ϊπ8ΞΩΣ œϋ(’6»Qv’3ΞΠχlcA½Ύ±™ Σ0<Λtμ7ΐ­«Λ²ςdΕ‚B»|ΟLΟ€Ξq�{‹ΣλoΌEIJ{š&`”Ύ ¨wόgι˜@‘ΚRX9Νέ9ΖcŒ}94NΡ|e‰Ήs$š žh.ΔΟlTZΖ}J‘œ°φ]Ηbj»œΌgιΝSS3ι½ο� έΌ}'MAΑ³ƒ΅NΫ:Aς&l'Ji7sd6m‚p)§vC‘λϊ<‹0 Žlψ΄Δ=₯†}|ŒfͺμK}cK°EΆ8²ψ0t’ΏΤͺQ>>ΎBpώ€ώg@[†ξΏxε2zolΝ6‘£WžY.ΆΌ΄Δς#»dΠΕνϊνX�*ΐfŸ₯%²²8©�σΥηu ΟuΘω>M u0ύr’‰uύžYjΚ€�dΐZΟͺI:ν ΞΠ)l2Œώ ΰyΦΖl=C£`lΧΜμ £ ο#kŒeε,>}πΰΖ’―-:…ÔÆ±/άhΘqŒ$δ*fEmΠXŠΫάΪΕ3~–€¬dΥ^Ηθ€eβϊyΤΘδveΡΘ½ςςKΑ¬[XX Η][<ƒ^Q_jƒ=�‚βN ΡiVG(ζ‚œlzŒ§ζKαŸU“κ�Π�ΌΡ©ž7kζ πj8§¨gΖX�π3³ΈŽ[΅<"ί@8φΑ@ήΙ,N;²―’ξ©ϊ•ύ€-)%Ρ@$Kί–θ‘²°Θ™™w NI μvX»šοHo I–‘½΄rΥ‡ή“Œ:IPΪ 2fεK£―‘Ωξϋc€τΞ—―₯θφGμecΆ Y™ΟΛ4‹ΊΊΆΜ΅6.ςdΈWΙ*θ4bo<±NΙζ*μfBKΨΆvνS³³ (Šτ,¨K ef)«²&μk³x l,//SήΆξ«ˆFžΣΣӌ·žε½PΓρ_ΞœEguΖχŠΠ­mάK@ k¦ž˜žžLk$dQyw XΣ£„=μp*ƒ+?ΚϋE“ώ[½n6U y}%ΐ6: »³_ΓΙM‚4₯ΆΑ«Χ>V/γχβglm-…¬:ώ4‹faa†σ΄ θI9‹&eή²,'_92X°@?P!S–βOdΏ�©#ό G �ωχ¨ŽiOž?mhIKO*j€δR‘ rœ_XΞiθd—‡~n―΄Y~_}/ΐγ΅N9―�ƒ ΄ϊt¨Νv_œ`@―Mϊ₯žυ­Μ,uΉ½ΉdθΊ·ξWΆ³‚eΩfτx6_ω¬yžΩ¬�η5ΓΗA Œ}>Αw?Η€–ί—ζšΘ¬@‰2Ψ;KVΪΫ:ψ₯θ‹γΟn3mf ω€s<ΈφΖQΒ 0CΆ8Σ^D°Y?ΥΧsŸVΦPœc•€ΟΚsΜ;ΡͺŠ`έυL Ή`Τ–xU$€«cτ‹M:ΈF²NL(Τς»&7Ό_{lμΓH“ ’}pm|J&cςά°[x―ΐ˜‰§ΦΘ@6Α&γA6‡χjYŠΧΦΆ°lσL»μ»Λ§ΩΧ§Ξ) ψ“Έ–θόό:»χϊ$|{kr­f}<Κo€Εμ§φX–”LkΑ‡:τ€οίE xΘP=…‘W-˜‰“α£ΔύΪ�‘ Ÿο€=³‡V%₯}νΩΉξΆΖ_ψ[Ώό·ώϊ—�ğ�΄΄ΊgfΗνΕλh<9/^�Wΰλ�σ�ΆχΟΎυ>½ρώΗυ(§WΝŠθ ˆ ωŠZ^κϋΚθΠ_ˆ\ Ε[  –ΰξμΐΉτϊ«o€žώ^)Ž—ΠμΒwΎσ»”(ά…ͺσΕ˜d2O2ΘZ  ˆ B puθTΌAIζz EVmjΣ�_oΣΡzλΎχ‘m`ΠΟ] 'D§ΨHjee>½�Γίηz9J&ι�³Γΰkέ½’N–Χ₯΅»ΎŠY*«Ξ‹c―aX[‰#ΰK#ΥL5E» λBκΰ™q eŽβΣΰΚ€ΠΑ$Π00Σi)eυ%Έ‘##­=ˆR—peSθ_!fwύϋξsΝ ΝԚȰΠ8­‰μ² =Νι,5ΖΫ+ψ<³ ƒυœNNpά‘AΖΩ­Sκή,Q`ρSi}ŸŒσ΅8Ζ2Ρ°©…'ν J7S*φ@ώs Ψϋd΅ φ€QΧρ³κΕfΡqϊr3O�όδSφ Ž«™‘ά…–ζ~ΕΟqΌ΅LΖrjy7=Γ ή§τ’§”ŒΏ€A{«YWšƒ‘u�Αθς|±¬hRN‘/E ₯˜}ΐ λϊΛqz˜ωήβΒ*cΖ°—8X¬έY�M’Υ5‚€+ΩBΦ:N0Η2 V²f<μ/πδιSž!‡ρ7“βŒξƒtŸμςΘΘ0λJ@ˆ΄ΆP^AΰtλζMν©@Έ Ω§“SšΘ•Χ1*‘ŒΆΩ‹2 €ϋͺCmc,kήνΐ.t |E6#ΆC°"ϊnFDπΘΐ» sooŸ‰#8³Ώ…²Μ•gk¨[iΞ΅NpΧD†Ϊzσ©™Ψ3_z η!ΞpΤ…rΦΜ(Ψ9Ϋ@UFKh&ΠΫƒ{TΞdŽhPu¨ ¬WW†m€¦σ"`σ:Όυ―v’.Ζ3›8Ξ„³f0€ ·Ά7q.™ͺΑD ΏmtJjάΌΞ–γ””νj2lNb‘ξ[ΑϋΪŠ#kCφΑϋ5€ͺ€!dε<ΝMtοΖω±)‘šΞ½g½†³ίΔ~it\›€:bλΒΉ‹μ_Aš’Ξ}A{�Ω4O€o“Ώ 2{Δ™:ΰΉO‰Šd ΨZ‡I‚¬ϋ­#€lϋo‹λcΰ8ƒΚ²₯H:�ž₯-‚;©Ζ‘ΕF_ά όΉο–*ψ}―kΓωΣ‘W6ηRw Ψ:ή­B`ΉΤ}*ε=:zœQΟ�Ÿα^Χγόw΅uC‹'Ψε~mΜΩHωΑ.ςψ±χζ1–¦Χ}ή[{Υ­}ίχ­«z™ξž}γ ΙR4΅P²%Kˆƒΐό‡&J‚A` ‘@„ K²%‘βr"Ι#SΆ,Q€8δpz–ξιuΊ»φ}ίχ5Οs.;A; Š”ΎdOWWΥ½ίχ½οyΟς;ΏsŽk»At(ΠΑΒ’/‘ΠΑ N�±cψ–�­»Σέ±9d Φ! Œtα'žƒψ–³CΖBϋά~ˆΕK5ύƒzωQlλAf€p™$;δ‚+tΑ/Ν₯Η‡Ι&Κ‰ Œ«q)S±'‰ΐ”ι Ξ³ ·₯4ά1²sˆ?¨.tO”§ΘΨ ΘxΡV ‚ko«Νμy† pΥρŽ-μ,AΎ«μ³2 Ψ_{)([6†<8ά&+ˆLπύ*ΚHš©‡v΄‘AzΤMs›€BމσV±Ρ%xΩΪςΕ₯φ3˚ ˜Q=P‡p=ν:ŠΏ±mQΞΒ~ςόΪiƒ½φ97uΨFepΫQΑΉσ=Ξ΅?"ˆτe΅ΨιZ˜4XRη˜ιTζΤI&6Um2œ-CΜ'‹¨μ ,Ϋ ξ”Žyθι"X‘‚Ά¨™ΨWu€ηΧ΅±YœΊΣ'ΑEK 6iΜ*³IΐQ;•ƒΌd`•!Ž¬!ϋ)νgfAUMIzξΉΛ©«›^4Χmiiг$Ώ·«'δgl|Š€‚ΰ’{–’n ?#JVΧ)ηzt|ßt‰vQpΟΎ<­­-œ F”rΟέν]4Lμ£Q"=ΛX'ΑΨW‘[gΙj/Κ`-ysίΌχH8pžeΰHκ‹8%Ι=‘±aΙΠ2lΰ―^”s?ŠY�ξΧ>ήw¬AΦ9ξŸφY=# γ&λ›Δ  UνK‘Μρ1!›ž?―obΥηΟΪΑ•μgΈž20< ωΜ*>Ο₯!nζμ΄½₯φŸΏtυ…�τ�›ίψ½βΚΆν§€Kόgπz ό,κ�ΫGώς/�Ζή―}υ—nŽOOuP·ΩIηΫΒZ(εEΤ�ηœΣ˜ΪΒ Sρ31Ξd51Γy(‰΅•Ε42ώ(½㽘E―›\Jyλγ›ι£χo‘™6p�Ω‚FΰθŸΚ8›΅ΰ¬q¨#°ζΓ5 fγ€ Ω)Ω NCˆbSΡε‘`€‹ΚrŒ1θPΪ8δσΤ-CS΅F�ηŚύjjζd5l¬μ@…Κ€9 Γ »ΙJ�5ψ/Ε8«DT¨ΛdaœΖ° ­Τ¦w:"K"•f¬σQΜ’Ζ:c‘iRιsmΌ`Dπ\f€rЬfΑ,“Ή-Κ¨ΔDη24†\‹ηΥθΛτp=Β]Γ‘ͺ©-/†’> ς 2%°(j'€ θbξΌψΙ‘GιΞGίƒ~<τA BgΟ@87…“ʁη¨ΩΓ‘½ϋm\cωsκ’gPr…©’Ή?ΦΏCZBζ½�χ2Ψ(°Œτ‚ξ[B©ΒΡζ"λ¬­&XAιkpqμoΰΌmσ}ψύ‘ΉtϋαtϊψρLš$^C·πŽ6€œK›9JΤ(6Χא±€z‰Σ’†Φ)0Θ‰Ϊ5œθ x!”JWƒ€¦Ξ‘TΩάEVό κπ71Jα�Ρzym7έxο&NλGΰ€ #½‚ψ’Nπ\λ�3ΟD½ζ ΝιΜΆ45G@�³²‹58—Ύ,“ažiΣSΣΑ€°Σύ>Τα{wn“Ω_‹Ο4»˜Λϋr Ψ•Α`¨€΅G‹ΝΟaœjg^Ÿβθ;ΆΗLΉ BX#3hάƒžΤD©�ξ � Ή°iš†Jƒk―Η—φ†ƒΨAΖ΄†=}�c?–.]"Pη™-X^Z£qίHΘ±ϋ’ƒΠΪF,޳η±Π‚Έ,Ζ²Ϊ”ͺš?:).ϋ€‚f32τ*ijk¦‰`Ω±]Ξ΅½R*ΤA썍¦κ8�φ@p‘I�Ν½:_Ύύ΅Αš½�]žƒυ€„ο”Ί/ ₯2δΥ~Ημ— TφΩ―|hλ(BδΝfsžα˜ΫΞϊ˜Œβ’θ2΄d‘OuμYͺšϊ4°Ά&•ž½Άή)„zτ%YΔqc8Ÿ»”cYz%pΰΜ™.μcΤ[²6,uV§rŽΚœπœβJ‘{)σa±4<Ÿ:Jy9†μ›ŒƒR€΄Rd02 ››Κ˜0σ·‰ΌρŽμ*γ9Λ2YtΊ§€A:ωΤβv0|d;δ!·Ό‰gΞNΩYοΈΘ<£Α4·Μ3s“Oξ3ϋεδΏ~¬λΪH›|δzpD°Δ±--uιs―ΎΚx°—qψ˜<°D–lμ4K¦dΔψYΧ“6,2r'€’uώΥΩ2—κ8KžNiΣξ΅°Χ΄ φ.ρό˜=³“ΎΪ;[S#€ν!2Α-ΑŽr„μ@ς5=Όu/ή{@πKΞη8Ά,Ÿ=1°4ΠΦX«vQΐ^±¬Ό{Β}™½­τ‘^mt›ηΩCP$[NFΠΖηρϋ‚fGG™$»Av…g8Ξ+rδΉ@€g2£§*π9² 9.Κ΅Ό6ΛΝ )α=‹ΪΌe7ΑO{ώψσ#ΐν…₯:f6m|‡5%Θaϊ`­ΩCΧUέ«ΎΕ2rް―όΎυΑ6>SΎZT-Κ%Kξ¨ΊBdU°ώάsΐ™ξ@Χ/Y‘§‡χdΰk0,>֎k™Α΅‘½OF- �nΫHM‹ήˆ;ΐ79К:{Γd(iΙIƒΕνmmόšΎ‹ ύD‚ΫZΪ $ΜJVE@/θ!ΡQΟ�΅—aμcΧdnƘ=’fρkx6x φL5k!ˆ`y„6@pΒΤLV’΄nu¨L4ΐMdΦ`8_  ¬©₯1ξCΠXE-x’ΏtΘZ^ŠΌ BΞΟΠِ] |ύ�mΨ6(ΝN)KνΝ‘j‚ΑU‰ΟΧH«Ί›ΖV’3³} ˆέι©ΔΟiς–Z›j §άΘZΐτa_«2”³’ ωUƈξ§9˜I‡¬έ}©€˜γƒnΘAΞͺ°‘–ΕšΔΠ4ΘΦΐ`!sΪ&δ{άπœΘUVΥεg{μ;Κ)‰’γ]ρ`¬Λ*Q�’ā}³?€dšΊ–ϊ>–�| x­mτ_)v¨υlΑFTαΪΛΰύ™hδ<όOξ[ΩΆηŒώœΣ‚*a«θχ©Ο=WΎŠ™Ί#[—ηώνcΐYΖNϋ”{P¦Τ'6Τ° Ύϊ2@Ξaq΄Ώ6υV‡³<ά§)€M|YiόκμΞζ¦δΤE°=1A2aaP—Dύd­˜Lp,¦ oeΛ`Ω^IΡΧΗ΅ε^v¦ΩΟ«ΚCg–#Οζκ₯ώΧΐšŒ<  § Ρ=Φ½»·3υφuŽ1]kΐ%Ξ+ΣΎΫdP�!―1ω„3ζ*n½AΙ3{‘MWΗμ!³<0Wν‡ΏΓΦΕΟτQŒΤ…ΪΆ*€ υ΅6Ξ±šΕ°―Τ§›€ ψ[εϊNAώάur}}ς~Ώφ9Τ•�³¬ εžνBNdwr|†ΆΦ?κ·�Θک㍠ϊέZ-o _XΆg?G€ζʚ=AΣξβ΅«�ε―ώέΏσ_\yρ§<ν][πgφTΙΣ׏bώώoύφφή|ϋ'¦&ξP'Jƒƒγ–Βœόzψz2vŽΟ±–³ε·΅ΆH¦c&ΝMŽ¦Ε™Ir}θγK4W›"Λ?E}}εLπϊ|ή,f4™Α˜eλ€UΔb°Z ίΧΨh( .UΪQŽ’(!Ζω1+ΏK`i€$ΥπΑfO3~lΜ7Ζ ρžjξfΖ–•q‹dUθ± ΗΗηx­rx ³ΑœΝ°tΝZΔDŠΘ¦χ’ς°Y€J^fχv –txœ;«5‹#\…d gA%εοω·Y‰@61Ρa™§Φ‘ΠyΛ:8-εΌΧ¬s’ ¨€­λ(X·uŠR5›λΌi{L±˜{•v—ρPŽiΒ±eφ~₯¬g©Α� W'F­ŒN»τΨ&k~Qΰύa4PΆεdΝΛ{R!Αy1M «;c­V&ΈήR*�n‘�«.mϏ1ž&•}P¨›λαFΗςΚ ΑhzχγOθd zυΌšΖNƒWR3c6ΫΘ¦g rE}<{—Ou¦ΑˆΉFϋ$k<ΘΆ„-EΉΧ·u§ς–~œeFΏέω0œί ΦTšΪΦuΌ3`P EεΨΛ#²Σ1Νr�’:Σξo±n)±λRfνkΐ-ΰ`ΰyU‘ω•6¬aΊ|ρϊF™Hτc(ƁMΗΗό,ΜW!”φ*›tΚ`ΡɈ}δsd›Ψ³ ²™\KC¦C“­I01� ”(ο‡Α±Nψ =~<‚ρŸΐ^κα<_{―~ζ‡οS26KΝκFΊ ={νjŒγlmmHWH– ’|r!ΠΆŠc/r_E6_ΐJηΛZKrΤρsΟ62»·]ΣμŒ€ κΈ@D6ŒίχwΒlΠ§ƒ$αg˜·a ST ’Μ&n!»œ‹\τF Ξr†{’Mqυy‡Ή”2˜9ϊI8а§«‡ζdR,μ~\Αuλqήd5ΰΦ™Eΰ‚ρ;ωxfΥ5ζφ/9β|8ΒΚf\ν0.C]4:ΖΩ9¦ρ!½CxΣΣ²¦Κή€ΥΚ(²ηŠΩeed{Ψ4؟›I₯8™(±έΧ�₯bξ£³―ΆΝLš˜ΐ™ Ή~ν1Ξ’ΑŠ™(―£^ ™EΗΨ/μ+>_GQ€Σ θ‡Έ„³j³±=κθː5?ƒ[΅±ά@  ˜¬žŽοΪύLλΝ£<…υσϋΦA+?κΥpvψƒPηΔG0Β}κ„Ϋ$S§άF—Ή¬₯YΙ¨YgΟj`�˜Ν4™G�ΠΑFV4¨βžŒαΩΩΣ—�ΏπJ€0[P°Λ μψΟq£fήλfƒΕWί|ƒ³OŸ3ρdx €uH~Π/]Bα”? +mœ °ίCD�₯žŽτsιη’—ΕΘΨ#@…΅aΫ::–אͺ(0ƒηθΏ#ξ3@TΜ#m€ηF“%’έwθΓθm™0Rό³g=T,θΤJρ-bMlΤ;š>y@`» XΪBΓΕΓtσύΣΗ⦅֐wυ]½7ΜRK‹Žr1φS›$CDύ όψ·ΊK;ͺ=2λšΟ™(E–*‘ZژjDΦ9šΗρ^Χ[½κΏw9S%諦Ϊl#Ρ- εE¦›΄‡Ο’ϊω2θ΄=Ωχgm–#l­wV ΨΈjο|eυ/?S/ΜXΚκ2(•εYLδUYΠΦ>Ι€«— l”cοΙΠΑ`Z]¬`/―γ4Ψ°›Ψυ“φΣΈZdΨΖ‡άT Ν~u€ΕR§eFΈw‘ΥεkχSQ¬841p”΄|Β5Ύ4>ϋΦkgι֝‘ˆ¨©#«ΝΊ8΅β@ΟΜ γˆY7n!φX€ΥΖΝ6AΤφZΆ`†Υ`£­… ;ξ‘αkA#g ŒQ<gΘǚύΖ6|έΥΣU‚ ά―εfsήoooOκξΖβθ§W«O₯R›˜‰dϊ}jƒ††f.@p‹�9¦Τc ]πΓ½vί”ίly‡vΛ’`κ³ϋ{ZRGs5ΎTulhϊ±Π¦B:6€E μƒzκΦλ)ϋ*£�AΆA=γo[aήΥ@Χ gkωϋψΘ&‰ΨτΚΪά$₯ τ?@―£«HPκΘόQ§ΩΡ—rξs»g² ΌGA Π!¬“kαΪ*cψ ‡τΨƒadYγόΪTΤ―eΜΠ[€Œeπ#)ό|εLj"A_3C’’ Έΐ·­EnKΆvΚΥί–0ΉΗ~²²›ν»€Ο‚q7‹6έ―Μ ~ΐ—Χ~EωΧՎ€ͺc΄Γ>“ςνΉΧCΠ7σάρ�`tΚhZ“Α£>PΏ›2ψχόx#Έ‘ ²La“η4aΣΏ!Ήψ0MέδZξτ[‚¬ύt�‡Mύ`πμŽλ€`ΪρΔ~τ>%&³:[›c2}‚Ί c™@IDAT Α ξ(ΏNˆiB±V0χd]Ί|™σWΓ«œσΚ}cƒϊ{(1Ε?’™lιΰ¬g9φKΙ^ΊQΎΗZ!Ρ υZCG»†‚Š1}ƒύτ±πdΔjkνy xΘοΩAlΒR;θηΊ/[τqΡFψοuž[`Ž €k£¬ΘΖ²DΗυ‹Qτ|-sα}$=ΩΣrξλΤΖ3Ψ ΟsB η �¦`ωΗ?�™�δgαο�fmm΅4Ά§―?γ`[žΎ~+"–ΎςΥ―ξΏϊΟ<ψχzώΪο/-Οέ;;ή�=;ήo!#™“‘•½]^e!P ΣL 3Κκ€5ƒ‚.ΝΠ`‹Ϊ₯iΞ™ :ρ/QcD¨š₯ήγXB‰4`—"NTΓ―‚Μ:Ω ΏΖLE’b Γ€ς¬0«Γ9ΪFα‰μͺΆQ¦fuν~Hmੁ5=xH™�Ψγ©τˆ?ΫΜλud‹YύJ=³ά[, JE' ΰΓ+Ϊ­C�‚)΅ξ0ƒ²“Κg&Q !ηm:“dTό[O$ak•• ˆΰ‚ΖJ#ˆ%ΦEEυDωG 3Ο' β5³AΟ [@†ƒ‡ΓQΗα%€«%0έ¦i^]žkiΒWΜύ4’Ε· ΄Hψ6Νή¬»ά&ΰέd<’Ž­ΞΕόόtΊσ{PiPHUBv€ˆ:HQξΐž’JjŸΙrε˜έg/YμXίΘζ³gωΖνC4ό£^η�5“βΌMΉmΠfƒ™Ό’Xcι›ο|7-Α°(Μ―‡�—yυ8heΠ›œΕMΦh{Í‘Εω+ζZYy0ΣΞΧqφBγ‘Γ'Σΐ{.*¬jL{ cΠ{Η¨5ίH«δ›Π|Η&gΣμΒ οqύ°‘ ΟηR£ΞC' Ž]Υ?&+�#ΩLŠβΫ„Η`άŒ7>x7MMSΆl τ “iκ€>s9}ψΑMφ‡2 Φ šΌYΦ@–vΐtƒζq6Όgε@0’€―Νhšυ/f�ƒ ΰjnyŽŽ£Nƒ™:ZΩώ½Nω…e'::R%«hˆ₯Sε8Αƒ©™ιp$ŽγrxK΄RG.¬- [:0yόœ8η:5–lτυχβθP’ςoV%θ–|¦™))Μ>³:SOƒle›£†_’σ‘hΰμpΟ[\3"f«DσμXΣΝχΆtpη׍§ dˎΣ›~PΤp�ύ|ŽΜΊΤψΩΩΉτψαϊc&Τ_k!C Ž²–ϊP˜ΙΣa$?€“ΐhE2­­©±­ PΒζHt±§«΄5ε‹+«°P²£Ψ XGDY:ΠH9@Ύΐ¬εεY8ΠؚJxΆΥ™ Ξ#χˆc|^ΜΦo‰LϋςΚJšO{€0ι'βŒΐŠΜ†gαœ}³K€’Οο’ηΒ1…!€s'-ϋ 8c­ΫΊzΣ6έέOpΞBFψQ—₯™Ω Ήλ‘lp¦uσ‘΅b@§•˜™ΤY4+-9Qή³Ί‹­‹s#Σ 0u,z(Kχπ<ˆζs8r»”]ΠG££·Ÿ’€μ„e˜6²UΨKWڞ0žŽƒ•{υϊυtύΕ#ϋ:3…R―m ¨gιz�›o0h–{€BΧyŸΩΙ/ους£$˜β¬JUέΩ³#{Φ)<ΐΚ9ήI~οOΣ>Ο ΒPA ’Ž_&¨k όhΐm䇲·#x³ ά€¦=  rιUβλVeΉεΰ ζ’kΜXjΣ<>£AE4$Γ~ρ]ΆΗy0Έ•υΠΦ�‘ζο?ώϊΧιΑ°λΦ%SfΑ΅ lXπ:ςφŽq‘”ϋ}τœΟισ©Χ–Œ;λλΥ!Ϊ&#ŸApδŒυχΪQųŘ5~_�™χϊ‘溎€:|ξ›Η§~šgτίΪpM ΟσL›λ»1ŽWύd€ ΝU†½`θ1u”εK�§ΐ²γqύΉ, �ΠΓ}΄–{Ίϋ)Ίuzfΐ±‚k°ύ/ΐmΈγΩ >+δ™Δ40PU—ZŠΟ�έΩΕ΅ΣύO>α9ρψZ½°ΞΩPVόΪοϋά–ΏxONPΟ\Φ`Λ63˜”Qη bi+=ϋΚ»Θό�κB\ί@*J›ψ,υM1μ©"˜†ΏφVgοw§τ±”%u†―Z+v%”–A?/${ZΐD•*Xbΐƒ"lvg’ΰΐι4dX+‘+KΚάόS‚~Ν%Π¬ƒΊξ$…ϊF›UΫ4™υΗΪ}~©[³³3ψRΎΙ|³ήΫ”Rθ3ιϊ=Χ%ό6Υ2Ο–ΑΎ?@ί€³ΕΪ¬,/ '4)υL²vΪΝΚy�l-Ώε2:Νά_?`ΣΒ�Δ– (λ$q^9λ»L Ÿ›a*}Dd%δ‘4Π:ΑΗ΄€TyΨPΟΙTRΞΥeα9ϊΤιBφ<αVCv²¬³ύ‚–ις<£Aρ>,ώ–ο"©†Lf™©|&ϋ%cCρe°oΩA0ΗπOΉ,χΖ9βgΚ Z"ΐ}}³δ|@ˆeBκtj�―QV˜N‘g™.,zƒΊ~ΚIΛͺ˜˜ΠT™^|αZ0χ6ŒΗ§Ζ)…>؍ώΗίDW(G,D$�a#š°Ι6tΥΗςZ&lμ#c)~]W{'²IΉ2=88, MΨ:ρβχ*žϊϋ8– Θ² I-χ ]|†^―’Y»r6M3ΉdIb1ΑΎ ¦e�]L΅bσ•­ Μ<Χ$¦�°ώžAeAΠΖ8Η„ˆ/›?ΊF₯°FNmŠh³δ"Ο ηDIψH¬1βIς//]½zαϊιŸ�•_ννΝUxϊϊa¬ΐSΰΰ‡±Κ�ΧψζWΎyώίύƒ°�wΎw―΅±μ_r€ΎU[[�υ²²ςSΊrŸ΅Ά΅–>ϋμ‹΅5 ΏΏ2?ϘΫCJυ+)Θ‘β΄Cƒ:' ~8 fΝh D6O】缇UQšαΤ{€Ea=¬*π,`€ΓS†L’Ϊ^*βΖΟOq œ¨’™ιkΎη%�Χ7ήxν ΐ(σwξ�Έk %u”Ÿ›Q¨Β0+d‘ώ•fk]·ΤmοIΤTδSΠ@Αχψ=π#Κμ./:Κ‚οIΗUΑλxΩIΩΜ«ω@ J˧֘9?9‹8‹nσ]�k}˜ΐ„‹’q0b#˜R£3—jΠϊRθέ’ίη§Φ¨mr2FC)ήΦϋ?ΎGν�TSΧ³€ mθΦΓ¬Υ5h­©mψΕTΡw%•Π‰Έ„†B™ΦΑ”‹ †‰9”vxΏGKS1†«ƒ“Gpαp™ζwΎ]Š!kΉ½jp8©3©Υ@βTΤγψ’­πyΜΒΈ\kυTάΨZΈprjΘ–΄ ½ λΊπ•©­c΄δuΜ««4,²·Α윣@ b ώιΈ‡AΖH"K:φ~VvŽ=ο·cySs {J_ €Žc ΖμόB°C._ΌTSk–Ο  ~Wa¨ΰ/Σd &ΝD�Μ~Οf:œ†0ΜN8XZdJ tΠmŒ’Ω ³܏ΎΓšY¨-CΞ€΄λπh΅Ρ¦Ω’ι"ꞁ&XJΐ½Cm¦ϋ£cεˆΕfŒwwwkκνjƒ’\†}θΒΘx²φ6ϋ³ω Νω··cHT|k“`Dκ"ΝΘ0ΆΚςϋ,ƒΐ3§³νσθ¬Ω1^Π ΰΟ�η�ή}‚Νu²¬™Ογ�β€³uΞ’> SΏΓžό΄u΄“υ£‹4ς_Β9ΚC.eJqτΌχττ #υμ'ljελ ϊ#Ε™|3`²Qβ΅η―₯‹Ο\JΟΎό|Ϊ?g-1ΰ2ιŸύόη�ΜκbΊχΰ@4Ζί]]@ƒ8ΐύIŸΆYZ αφv¨“€H2  ¨Ν°-LMΠuκ%Ξαϊό,ϊ„m Γv‚£\P^Ÿv8—ϋ#κμξΊΙΖ2xtwxοϊ_κΉŽ’t±³ΜΟέΉEَΝei*ŠŽΣF)›{Θμ:ηΒΜ΄΅ΐž}mE-ΐ‘4ωΈ2­ώ7ck/!Gμ}φӟ’yη,zΘ [°PύSoΌkο$υG AΓ@½ ˜A 1o›κύDσQΜ9PXε½(;κυ@#zA¬^tΚ‰}’dςi§}I �θΛσ9N΅  Z½$KlƒLν.:[;k£Hm°™L―cVΦ@Κ΅~�wΘΖΖ@"ιΚπ3Ψθ2’ kΞ>xOθ™ž�ntW]œ Λΐn~όq¬Mƒ³€ώ‚³η½†‚Δ}iηecΉ―΅Ξ‚FΦ‚Ÿr/ΪΑΧl3:K=a} l…Ο­N^'³ΎΌΌBω_%\M4 ni'uM<₯ ΨA―'­Ϋq΄7oί‘Qρ} $Vw°/ϋ°τ ϊPEdC Βύ,')‘αω₯•—±–2Ξd>:ωEŠL’RΦ­­ςΓ+ΟXfRΪqΐӏΨCƒΆ£3DΨ{›f(M“±j ²½'§d} ͺΕς|?Ηυaθ}Γ9ŠΐŸ†fέθbφ΅ ˜�ώτωƒ1ˆœω΅ϋζ^ΛΊ©oξL5έ—c½Ό°gκP‘Ύ‚ξo`Κ^θ—c[ £A#ί8PwλSΙ0YYΖ†|„�5ψΥο”ζ¬ήλg Έ~Κ₯€Ν~-4€ό«Έ}ώΦζ ]xvΛh ύKΤ1˜ΐxmi !λόόL=%x$_`O?X–Š{mɁk’?~†φ…ϋσLš°I‘~jψΏΎ—+ρ…­το&Κ *«˜�SY�_½~φ§Ώ^xώrΊpq Υ6"΅œ£ΊLzφΩλ0Nad œ ³†6::gφ…εΝ3o0φΦgΥΡΞΉΖ–}:νΓQθ*n5–τψ{s€ ‚ ϊ*Δ}Ξm0Ώψ‡gUΠ3JL-¨mďηΧμλtš{ΔύfR¬ΐ=|ΪΚr@­C}7ΦX?*ΐ\εS9β�Ÿ0ΰ~xι‡ ~κ#ε¦{›@=ωŸ S} m�{ͺ<Ψ'B–Nyy! Iγ?ϊβί~ΟdμΣΧg˞Ύώ¬‡IίaΦ?<ΤΚϊ?ƒΏZψOΏφ;―@iψkΏψ�ΓνωέάΏχGMΏώί��΅΄°ψw ŒΦ78¨9db9ΠΤKεΡψœ£\Eϊuždν ήΛθ¬(/FΡNGXμΧθ=”‹΅E8΅(ZΞg(­Ρ11Ω>³Œˆ©¦R5£―@ ηA΄­#nΕΈ―,Κ£ TmΚζG¬9OΈœΖH[λf•TΎY΄Ϊ Μnκό ³Ηύc€ABΝ0£'+κγ• ΎόΎΚFJ’ugAgγύvΛw¬‘JPϋ%n'τF‰¬ƒŽFL₯eC§@Ϊy>Ÿ«ΰΐ¬Λ)ΘΞ|E%`΅ŠvY·v>,λdŸ…ώ‘g�3/Ύcάςp š.§ξ–ΞΤΦ7ΰ“§|”vΌfˆ¦¨] ΣBπ$Ψ±Γ8£m°CJ4¦UόξΦcΔZzΓΰμ¬-¦Ή{οŒΐ’\;ΊϊΨK ΩΧιG˜Wϋ†g „μ“έ΄ Ιܚω7›b6πδ„Ϊs:³ΫœLηΖс:όfNt40RΨ δλš™ΔΠ%εlœƒlIaΜq0‘‡惽ϊΜ€Τσ9dδlΊ·2Dtμ5ζ*~ Dd}¨φ~Ά t(r¬MΟ΅‡tCφm‡χVΰ(֐α·aάHΊc6ί»ρϋBƒIφΟϊγsžiΓ]‰A¬§ƒ°‚(sD'`›3 Wx(mhΙ6^3ΈVφεΔϋΣ)Ο §¨ r‘[οWbΟްNe ίΟǍT3›0O^}ε₯GhΛ "€τρύ{4Lz•ΈΩΖA$ΐΥΪή²OAAθιLέ§Νijb½FE;sŸ»ΣG7o1ζμY#�ΣY™ ΗC9΅Eww7%?‹ιΡΓѐŸ…LCq$ž…ύαΘ.Ξ9 “ ΐ έϋsΞ«υΰ2*Λ—.&v g†i”²|γOΎcU;9―Ν--4ŸœOwnέ ‡ ‰Ze<ž{##P*SWOwOkΘίw>ΈςP3‘„³�ΡNp†�Y‘\£„`‘”λpŽlθXΈ§γΕ&Α}κa’Ρ6·A‰ T  αΨΈφΉ€:d³ < xφpH₯αGύ>gΩ²›Σ"~Ο@@ΗέμΎΞΑ½η=?2†θ+œuG§v›€\&E6s«ŠυOL4 ‡n`ΦȞ -ε›ΤI[κ±G·fϋTrO:΅κJN{ΘθTgi™B΅μ‹ΩΠ<(Ϋμ©©:0²wόΤY4Δέ†Ν‘£^Ι~lŒ3–“™χΫθ`Ξi-έΣ+9vKŸ¦'S,GsΆ5?ώ?œ―uθ€δp€swΘz¬³Ϊ.kαWΘΌ‹‚Pω— j_ψwφεΟΓρ}ς�ΛίΎΑ'ΘΎbέψς˜3#€YƒΞٝžζΎXKJΎξL§Αα~–R&ΓΫV;wΘΎ„#»μηW‡‡›― dδ2ŽΞΣω–!ζνλȟ (m²ί„ϋΓΆFcJ3Εκ2G¨©Se&A�@WD/’ς ƒζ,3δ@ΫA0΅w²ϋΆEo#V|υ’“T3–€j2§‰hZ(}†c+#μ 'pδT @ ›οίΰ–Oƒφ”χν£w‹Π[6»Μ@kioDΈτω8‡όNΜ°Ω™ωΠ=� τ Θ��Οόdϊ“oΎΫw‘ϋghψξ;\Γ­d ‚oάψ(‚nο#‡uΈ’αεy5hŒΐΙ=eŸeήjguεΧaΖ…\πsu΅»+‘=ή!{o?—W^ΊœnόΞˆ I•%ώ'0oyΧQ)ηΎο™υwj­ΆSώ.:³Œ Η€ ™Χ‡0θ,>+JλΧ–¨–wΘ7hiN9ΐκβ<Ν39ϋΟWΏ ΑŒΖΌθΐoήI—. s6΅‘;0Όh(ΚύΨ ~ηεΒ\$ψ4ˆSφΥ‘.± ΪA V*εψω4Ξ|ίeƒ,+RΈ&6@έ!ι2Ώ΄D#\'M˜Ή‘ΧQ3ΜAƒΧRΚεe;θ³κκH‚Κ,RNj™€ΑΎΚ½IάΩ†ω&ΜΊ²‡! μ©χrŽΌsΟόΜ‰TΚ tpmςΰT.Χ°Σ~Β–Τs((EΨYF'±£œ9›XΫKΐυεΓhl¬H»}θeF?xH τξψμj:4c hΗ�*πΜβ˜ŒJPΌΚ *)›ά&“Ό+!€ΦTuαY󜜝ΙκΒδΊ«3ˆΦ—4΅:I½¬NΙΣ—dmw6₯ΘϊΩEEδyt-‘»<ή§SΘϊ΅α;εΣ«±•χV§nQ¦@–Γy;>%e_•imH ςfcέβξ‡ΟpŸ΅6¨τ2‚ΜڐΠ;챆rπ@ Aίΐ‘±'ωΨl}Aώ­ηΑρ’Κ§ ψ”)“[Γλ0Μ�kk‹9η&νΜ¨{₯ν[>¨"ΐ©�uδs.Ώ_‹ΎP €e=φυ·₯ΑΎ.Φ€‘}v•ΟςhΈKRι ‡€ŒΎC僩­“²X,ϊ6η½³{7 \HwΞξί°\ΕίlcόvIjιιΑ&(£gΥΥœ™'ϊa3$j,Ž5δξ<»Κqžg†5€Ά4A[ζIΙ)>ύ4―τ‡Ο±‚ͺ~½<4œZΪR�`Oϊ­ίωZZYdΪ`;{-Π��―’ ψY–α Θ»GΖN{σάmSΚsŽnς$*”’0˜)£|Θβ αΓem™k]@’Œ�š–—drΏ58xαŸaΓ\μ§―� d-ΩιbO/σ�m’Œα+σπ+_ύε½ίώέ―?όΟώΖύqcγ{»Ε/νώγίώέε?όΓ+οNMŽξNΟΞ_f1MK‘%Cχt|’€AΠ₯QxΆΦ½κΈͺΔ4τ±,­NΗ‰,ΚU§ΐμG!= Μ¦ΡOδΤzi~!ΚPˆͺΑi(L―ΏόBτA˜œgΰc~Οl+ΩqΖsΥβdŸC=‚—ƒa³φΞΖ1*+Τid^ ˜mv‚ށΪGΆ0”ŒYW¦?I+³Sι½o;έΏύ ύ³νi‚ΔϋŽ1β‡8UŽΚΓωήΓ ΣhκΫΪ•:¨Ÿuœ)Œ7‡”Ϊˆ–ΫO1εΕfrvƒ6σ~γΖϋ8?U”HS_Jγ3Œuγ3J3¨<Ώ5κϋ�•DG mGύœΞ?S l.ˆυ+αηžΛ@ΓLψΖ\q²τD–₯ζsœΆ@­!₯ασΎ,σ„­EΠ,mPΡΑUΑ ι™A"ι{œL°ΆΊ8ПžΏv:άIΞ�1₯8œ!ƒηφŽf²(ΤΠDβ|XoθθDk«₯²κX;::³φπˆΪ?ž«ƒ=½6w5# ―Xt…ŸLaΤΣ¨�•.ίvvφ\αϋPζΒHH²O²@,e("Γ==;“Ύυνο¦Yhγ/ΏώrΊpυba{z�sd-&NwžΜ4δ„ΝI£4θθJ/=�"υ”f―Ξ�sמeNxkšΖ Y'Θz‡@gnj§Ψής Ξ7Žo5Ν£.^Έΰ3½nίΊsf‘g°Ρ+Ž)Ξ]>tφS€“=€4 SΧΨLmqηy+­Bm_[^6ΊŒ2ƒΛj”e½ΔczdAA¦)ΑΑρvl§e4Ή8’‚\RΏ½nΤα"“:Όž‡*(ΐU΅”eπΘΘΗ!Μαο}Ί½ΰ€lʘ‘%¨)εΣ~v7¨ro£8ŸwBσT_θ©σ3:|θ.Nνrqjνθ ΗQ€IΚ&³›‹‹@° (αΠρΨrμΰ SSζ‘³C> υ Ϋ €rΉpΞ^}γ 7τΒΤN[Ύodb·nU™f²s€>³€Dνfœω°Π…ΊΚ�ϋŸ`vπ^�6ΣΗQ ν;=ƒm­miŸ@N¦LNΰ ΧΫΩ°gcάhό:39KάRΟ(9Μ‚δρωyΞ%6Α4 {Ν½'œ\V4œΝlΨΛΟpDuτ ₯ ¬ga1pL–+Πmφ#ϊΖpΆ‡ΤE{ȍ%p:²Sc#΄ GθKA ΘdŒν£Σϐo( αΜΛ °Μΐ H‡7Ÿ`œp?μŽϋ,°3ι©Ε7s7|ρ2:ƒQΖ]κO{Up–;»»ŒnΒΆΨ$Θ"¨nͺOέ”&Θ8Ζ>ΝΟ-Ε3εΒΌ#8TΨάΟ±°6Sόθή=¨η΅ς0~pόΝή;O}sR/ΦΓΊe3|ψ EFΖ@τ€5Ϊ’ΜPšqΧΈ΅—‰™RY ‚RΧeΘ ¬Ϊ“ΓλΟΝΝˆ ΟΑQηeΠΪιέΰ(Ϋ4`†,δšN=±ΌF½δΈΤj˜n2( Ό₯DΛ:�6eΑlY‘{f­3 ]jΉ±uθό€Μ—_{FŽThϊΧ°§²$,MXAΧx/ΚΙȍjΧmΐJφšDBv¨¬'Ήm::!|†l9’Ÿe^Ϋ€X":ώŽ#7Yˆοχ#ΡβΌΰ‹TΤ–qžV’ωš# 3mε°¨WΣύ{·‘ΡΟ‘–?A+ϋ ™\03m™‰η7°Υ iέuφύD‰¬/rΒM"οUŒY”y”`¦?rHic1χ“‹oQΒ>p~ ŸΜ3t€σμΟš6–œΠΓΡ,”ί1€­oνN΅ό©3π¦ΌΑk*Έ\Ž,1{O Ή ƒRzωΠπΕΠκΞ ΟΕ!@#›<ΒΟb Ρ5Ÿ~† ˆgέ Χd’ƒΏ†Θ}μτkγeΤyn|Ÿηχ™―¨fj͟νΙrBιšΧ|•εe@_ 0_!ΐ„œϊo99ΘΔ aχπύμ+`ζ�Iη3ΰ.zρ‡ρΚ΅+θνͺ°Ήυ&e,wςλΧjs,‘ΑdΰC0φT€™—1 ž4θWο †©(λ1ž—ύπΎψ΅ψlνώ g@πz]λ”›†ψ A=Α―­άͺΫ˜wX~?«Ώμ•/�iŸ[Mz ‘‹£‰ψΎλΞ9ς3μU`³O4Α­»χθ·45ΚΚγ3τ/.Μ¦‘G) �D·t„¬­qʈ:k•†ΟΣ3ΣψUzάΊ� &Ž Ai†P!Ά^Ϋh―ΛέsχY6’:’Ζν•k—�Π3C©o¨7²H+λ(kΔχ˜§‰β­ΐ£„{€L}ެͺۜN$Ψηͺ«,Wuδs¨γυ·eΛ“’Τ±ΔYp―&~§’ΫΨκ4°σ�_½τώόΟ�ϋŸΓΓ’‘ θμƒGχcwwgΚ€Œ8TY "hQαtnβ”8‰` ¨E[OΖ�f*j•8NR³5@*`!Ω©ΩLŠΩ'•JΩg³~Σ,²FMΚYΗΞ @G\z©/•Έ³ΣΝͺ©Πl΄A † Μ4Š5dΈ%Œ4 Œkš��Ž4x‘/υχw£°iTΣفCΙ$2Έzs³£Žm>£:έόξ7�Ηο'² Σ“Π‹§ρGpΔԈ8 MΤMŠΌŸ2Vν”>SAŸΚ̘Ϋ$NΚ4¦›½ ρ »μF/c8·AΒ«jš@œ/Δ>MO.€©ΩΝτΰρ<Ζƒ²‘φξήΤήڍŠπ¨σΈžγoZ[Z1:αdίωžŸνΨΗ ƒ[ ƒΞb#}j:‡S^]–ˆ εΡ-d"7Œ€ΙρqŒΑ;χάΩΣΓοvcΠiΗ~iŒ—‘븚%T^β…)μγ«£(E»œ΅ΦI)6 γ—Ωf�μΞλΜ\˜,{8ΊS Τΰo0ΡΑ˜ΰ^t[H#βΚψ·{ΆŒ*'RewƒEΒή!ύΞ7Ά3Ώ4αpp1@‚d:Κv¬χ=ώΫ`/Ψ,xΆfX‡ ωΗ)•ϊ)9z"°/ΞMξξκbMΫ"ψž…zνhΡ:(η:+}=kΠSοΠό`χBŸΩΜ Cۈ΅83—ȞLΞΜ„ Kη?ΑΉΪΑ±TπLNMΟρ|8\82ψΗ0[<³–νθΔp˜y6ka9Š™˜z‚|²ΐό{›σΧΪΩ+¨2έaνΡ`wω> j~xxˆρt#±/SCΏb#VXyθŠc ~Ÿό"γ.+’tΰΓΫw,Α)VvΎυή rURΪ@Νc%ΐ€Z@d[yˆs,€tγοΌϋN8ΪN0Γy£θœ§θC@³J:όξYXχΫ`bavY&@ΐ©tμ’Ω*kΩ]ΦC²tfΜ,…8eΡ ό”GεΫ QYυ~”O›xύ΅T]ΣΖΦΦψώϋZΔ^’sς Ϊ© mbό¦Ω2 ³ΆΚŒ€ˆΝξ<¬:‚:άvρ>9fδχ`€ν΅ƒ^uoΟYOϋ§Ψ«ŠuΆ‰¦οq�8₯θ.‚n:“ΧΤΥf›7²[8|Λ8…fsWΆxV’nθ ƒ#υ&8 Yί —―•ωώ]€Kœ=©ί:γ²0†qχ|<”δΰΈ;Ν Ϋ9%v•yŽλ@ͺλΨ`Gν)7U8’‚₯vΘξΌ€£J3Pΐ1ι·ψ|6ϋΟ:”“ΡŒζ§<›χbZο…etŸk6΅&BƁηZω‘kPδ=$ͺV ΉΝχ‚νƒœ"±wΨπ΅Ξ―ϋ\P+³Μ\™”]%Pp‚ξWFPγσYwί« °œ±&Κ†ΟYAΞΎύ&Τ%φ°@` “ΓŒCzωš>v`'–m²aazρμƒΠij|4tΚ!χΒΓ#7(zΈ¬€»wπqθ!ξ{``0uuu‘?€iΖ½ν‘ν”ξ―ά4ΥΤ¦δσ™g.aOσ�Γ‘ΡΠ₯—― m~žk;NΥ"–ιΘrΨǎςO˜W¬ΣRφψcο±x`Bφœφ=šήaW μ βΩ@_� ;šp–Σn€—όŒYηό ΔIΧ.ΫXΥ©E>Ώkhfί,ΊφΎζΑ†η†7Κ’Z·ϋŒΠΈ6ڊ]μ‘··X'Π άψGY°Vq }:ƒƒPLΒδ `�‡Y^Z₯ “^Έ#�νY°ΟK0ρ%ΤνQηlf¦Ψ 46y³g}M�Ύτ!όš-dΗ{75Ω'θ­Αξλ τ§ŽΎ.–yb•K3Θκ4 @c,ΉχΚ(YμX.ΐ›‰{ΘθΗΔ³#§ϊ!2,Κ* iXNΧ2 ώZΎ€­ς•,vR~–›sΆ–§`΅ΆF­Š€g *9{]QK9`Ο@Ψ&ΡΠ§]#ΐ(;ο`e‘3·ΓKmςαCΞ:—ρŒ;€WΌŸ�„bΡ�ςlοΠΨΤ―=κ¨}�φϋʌ½_μ’Ύχϋn€6Ο{R§¨ύχ1Χp€§cŸ=GΪ–τ¦½”Š\›Η’ψ_ŸͺΉΉ#Ξ―3ߍ=¬„vo?Y1š7l£ν±Α±ŽpςΑ Ο.Π”A=Ϋ³ξΩ{²Ÿ9οq$.ή1ώbμ!€a| AΦJ|•`@‘«œ”=_ξ‘6Z?Βζ“κ.ύTŸΗ ΨΟ,Βή+Λ6sΥ PŽχϋ₯$<3G&L’o�t[sc‡άχ ²³€.€’Νiω‘ ŸC D`�šR0GΓς©¬+Ύ4:eŸυ™šK65hͺk’δE½ΐ$£ϊ†hΰΘΫSwWo0Paϊxeƒžα§ RXx ž5–“υ5fΨ€έΨgδ'Ι“ |ΈZ€ώBμ°:ΒηQŽΡΛc›5©Βι―|ΫπP€+ΉπωƒΑΑύ D�τŠŸ―=΅”I²`Ψώ0Κ#ήiτρ(F—θγdX‡FΚ,’€΄8η;Ÿ}ϋS_ώωŸϋ>dΌ‹§―β <~ˆ‹ύƒΌΤίώΫ_9ώΝίϊr9πΏͺZVˆ3£ z "FIyΰpΨU‚4s ₯ζκΙΟμζ�ΡσP«˜€‘εαΌοκ b”tΰΝ²K‘¬%Έ~λ³―¦Χ^}‡Ί™@ΐ E…Cm1Ώ;1Ι”… šθ­,GΗΧΛ—ιœIΣγL >{Ÿl₯F†,¨σ‰­Ye·Τ‘½΅%½I–‘ ϊχ.ƒ7Σk†I§B€@κ»ΚLz°(x&³Ώ•žJUG%.β κ@ύη2["ςκs«€tΘ€QkΤ4ŽX²Δ£‡«Ίšέ}›©ω<>pΤΠ2b;T­ηΘΨl¦±G#tΧΕ(Uρώ’tχƒwA|§£α\S:ς»ϋ/‡q΄)GyŸŸ’Y&4²3ϊ6ŸaΣ5~D )Ž@B΅uνΦg:[ά±ƒRz@΄—0ψdVΆi„92Ήes,}χ;·Y2θ­m©³—nΟ4κΓ+0 ‹ΔCΩέφŒHŽͺ)μ9βŽA�Αo$kb/§ŽΊωΒs8Pq,φΧ¨;‡ͺΉΞžΝMΝ°ΆτΓ(%πηχ§Έ„C1«ƒ†σΈLΖyvЬ4N™£‚rΙμœ) 31ύ8n\):Ο1‹`ΛŒyd8κψμευ46:(`=(F±Šϋ=`‘GχXGΐώvΆ;ΉΩ† Ÿ«Χy%nΒΩgl²"”ƒŒ•šQΰϋfΜlD&uT:‘,_f°μ¦μΨ5©Ο½¬νkŸz•Ρ‹Œ—¬εq²ύ3YŸΉ98-/Σί`£9–FFGBΖχθ—ΰ5Λ0°Κx]­r΄G}ϊj�—qΨ¬σ$ϋN((f}΄ΐ„Ÿε$†+W.ρ½ͺ•.@«W_•@ΩQ£Y ·h}ŽŽ#kΩ.αs,A©…N[ΛlοLu ΰV%_+Qy8₯Γ=½\C‡Δη=O38d+�\ΎΞK5NԌτπήCη©ζθgΠ;ΨΟΩHiš&‘Ξ¨”“™Ρΐωhͺ� P°GΖΊm³ηή›+ΕΩ…5΄MBΛ-‘:²sΰ'D™yΕτςΰο}kΩ6…dφt$ *u"¬;�&`•N+΅όύ¦_ΟοπφΘwίqΨTbΗ8Zω8²–ž8�ʊΊ°Œ{τ₯S₯θ€™‘©i¬ @b&ΤM#k˜’ΡΐωοΊ@σ2žŸ€˜²œeφΞμu5mΒ|Ξ΄7 Ε=ͺW| Ω£D‡9²C\K`Ξ 0η27Ίz1»ψs―dΕjuΈ ΜͺΨ«‘ §Μi-Α›+σΙ‘­Ηs”+œΘ0β1D–Ώu\«Ή�ΑΛΓQ�d»ΌΊLvΏ&½ςΪ›ιyΨR―‘W-3zx�ΎKηBYBιΔ=»NώωΧ½žwŸώτι:½,ŒŸ}ώ:²Ve*fάνc–ΪLžΟ‘#ιžμσ\‚·ΚΌΆ"Ÿ1^›ΘžAKNe3p+ξ‰MFUςΗθ“pΦΉ-YΪ4Αν›eQ–«4–ζ οΊϊϋΠ 4ECΟZΏΕ:šYς‘ʈgV Γ9ΖμΪ{ΕΟ`ςόϋs;ΈK—ŠΜξm‡™±.ά'₯I¬a±ϋΚΪΥ7w Χeœšix²ˆœγrΞ9ϊa™υΨ {οΘΫξΥ\Z\Jσ°- ΔΨ{ϋΊ±£eτšΐP‡ΫΓf~e3ScˆΚ�Ƿwο+uΘkmzύW°&gια£Η΄’ΫΜΜρ·σ&ϊ¦ €Ϋώ=ΪGΩφ Β}p±™lˆΟ©―δ38VP–Μ�ΚΣ‚Π]^ρΜΦΙL9±"{³ –Q5ΟΧΩΦB`ζύKH gKmνΧυυ•”"Ά°Vud»mΆΘ\γΨ+τ {δ½ζF‰6}SˆξΚŒœ΅Λ:Aιω)ΊŒς ³ΑΥΨ A\χ̌?’gΧ”ϋo‚Α>-1–‘Οφ>iNκΟγΪΘ‹oC8βoΆ8φٟ[�SVΣΘϋισ³²ΐ/’r½}˜m2ψL*²φǜaεRfηΊΎœ€Χ,³|DΓ[oεΕ°vΗΏωό-ξm€]ζ£½ € ΒFH•Οφ@@ο#―Αΰy΅ΚJ°°BMŽ9Ψ z—κAό{γ˜ή*zΘhc• eEυVΔzω 0‘5:β|™€‘‰ ¨-lΰΌƒ£,Κ€R–<4&ΙΡj’Λ1Š&χμγPΙσκ+ŒŽO†h�kdνέΣ,hζιΣΎ €:qΗ�A' 9e?~ŸFPλ[œ4ܛCΧ¬Δ};­—δ’#i?gν'hLΊΈ΄Βxeξη>EέCυR>»Ίkΐ²¦ΘzΐqžLN:Aχ.Ο/ΒT ΄½αΈe'<˜Hik¨IΌwrz†χ9)Rό?}4_ΪefKΠ]ηΧŠτ{qdκΟb#D™Νy^�56XEz‘6m@z1ΏΰόΫןyζΛΏπ—�ϊ-φS!yϊϊ!―€rρτυoθ |ωΛ΅qnrϊ―@!/·Aθ’ˆkK8πΦƒΪαܚ₯˜wΞΧΡI,” {xΓ±Bahτ,s@νaDqΒρ� ˜€šZ3wυκ5’ό†Lƒ8 ΐ p§uΓTΡ©Bχvw€ΪΜγO¨‰€qJ―Œ Ό’Ÿ·@s�&ΤΦΧs=²ˆΗ<Ξ•JZc½…B5€πk­Hφ‰ £agqGœό됻"βξLG³GK¬ρπT,.^%Κηυ½Φη‚W½Ξη>3ΓSœ―΅Eœ<‚ѴΆ°ΜθΊ•tο₯P�1| PΚ;’X),§MΜLD@Φ`Μj„.ΝNΫBgΑ¬ΑΦςl8•8Σ„WάŒ ­u~Ω@§°ƒ€‹KwΘNέΔyX!KΌHfZΐ^Φ%šGCL e QΫ �#ΟθR\so-j%8§T˜τ^~‰ŒN?AKσ…ηSuη`šΌύ§iδ£wθ”ΎgΜY₯φΜΊ΄S‚Ξ­ΚͺηΙ¬ΟdΝ1ta]¦ ΓΐϊDŒ&g•5F�DͺΫ_ZΪΪΓ€ΉŸ1:νΡ†δŸ �½»#ΘυᬉّdL:d6λH]$†Ty΅[·λθπ˜e²4Ε�WS‡N+o—f3‘ ΠB₯Ώωεέ—_{ίφW0›` cφβDpίΕηŠΐ>`fqe‘,iήΫPΫ€γΏ“ή�ΰ= #υΜό’ευ€+ύ½ύ©ΞŒ'?·ΑΨΜΜ 4Af©σ{­mιΕ—^BvqPΘΎ τq�κp λq,ς1ζ‹d—Ϊr ΙψlD“Sšž�ΞtαΒ(±0]`-Ηπό9αΨψl—T–€ΚFœξΞFΐ‡!ξFgΚμˆΣ5 ¦>~Μ³Ž„#“55υ|½‚‘©(|ϋ#žΉ0½υ…·�O~ι‹Π#σΙ(ύσή‘ΤΟ}Όω @ l3£Scγ8¬¬3λζηλ€ΛŒπpΫ€«©…Q•Χ―rjpX<£@6Γα·opτΝ¨˜=‰Ύ&œk³ΛΞγΎϊΜU“Φθ\Ώ41Εωδ σΜβRα2π·ΧŽr$φ@ΘςŒ(ΝβΎ±hwnuƒύ te'¬sͺ8λ{0>Μuφ§WΏ”©‹ξ<Έ]Φe’ŒMLDΦ£‹2ƒ•UBεŒΰΫ¬tX]fΩmŠ₯sϊ$λfV­ˆ Kπθi-ˆ- Žz¦{hSOƒaλŒ3ε4Μc=X+Ω:ΛΫ»\ψ"ŸuΝƒ�[Dι…\…2²c—―_c=eχΑt{ί"°|#ύδO}‰ύ­‹‰!ŸχWMφ΄«Ϋr?ΈΦpn¦O Χ” ΐ`γφ9Ϋ¬U›Y*ΰή»F/6oΛ(8¨Ϊ&ΫX8”½•lΙάΘ–~h' �³ž²*ή/Ά™jb λ3Θ0‰ήܟL•,σ$»‡€CfΠΤ ‚μξ§,;ˆP©Κ%ΠtΜ_9χ1“ zω§ίώ YρzF΄Ξϋcϋ§ŽΒvΠΏƒ½Ύx‘`›ΕΠΫ+p�}Žc²ϊ9tΟοιοΑ>5¦ΐW|mέηΎπιΤ�L_zαS/RžVœn‘7Z8Oyi0ΎΡ'cγ°gdFƒΝ†ΝˆΫw€‘Μ΅Μ8” Ϊ‘£W<›εœΖ rs&"˜b=|ωοzCΡ@Yέ―½±Β}DMΖ΅d;)£κΩ¬Νη<»^θ™bΞ–Œ=ύ%Αuηή΅Μ6°Δ/ζšΚ“ώ¨_+k[ψ@>ͺ@ω1ΐE%Cρ sΦ­ΉΘΉώž­x�εsySžτάύ– -φ:1A„Ύ¨g<χΞά{Drj’ޏ�7ήύ.odŸ` VΊ2dt£οΦΨίωLγ�¨�§ωšΟ›_εo|σΕ՘ τwo€©©’LX|–#Νγ—Γ0β}ޏΊΟJΉ.΄ε&2Κ,›„|σΝOΩ„ΠMN€+ψι²―,ί³D§‘)\”fξ"NMΞ“Dα\²/‚°D6υ,šάQ–\SΟ€ηΜ\ߍ—φ£ ‚ŠΦ Π?½šI5Œ…ρΜ²n}­΅«αΏόΧ�Ζφ’OzϊϊQ¬ΐSΰΰG±κ? kώΚ―όΖΦϊςΤlEYν]ŸKΙ,4iΰ£bG]³ΜΡ<ε¦a7Ϋ΅ƒ‚Υ€iΝ¨L ² ΎE„w1Έ₯:£Φh5άττΆ€‘‘N2ίkί¬³ε (N‘ǁώaκž;‚&Jΐ΄Ό4GηΧΩ΄ ΥΆε]F–΅™Ξευ8Jύ}ιΚΥg0Hz=3²γc(Έ₯p@DΐCyρ�’’Ζ‡Ϊ¬š,œžψ΅‘2ςYt4T>£ IEˆ=²ΰ„΅TΦ’‰L‹ ;Οv�ƒC›Ρε#β¬Ψ3G³Ut§―"ΘζΣέ›·Ιš�δ“~D¦A„ά ‘οΒpΤίobP€Kša<ƒ½ΠΩ3€ςΥpΩ›χΝ› ΅œμg]}sP¨wpͺurͺκš[Γ‘‰šg‚» fqŸ¨Σ°i…†P[�-€hj4‡))9%°Ρy&+Kš]šέ)χ%› kfLσi˜©#ˆ¦ζ90¬›Λtzž'θTΏ¨±= Nmk?Nfw{p‡ u=΄“Λγ~­+\ƒ-±Ί?OŸ³Ÿ�λέηΘά~?1ΨΦΉ΄4&;2γΞ~ΑzπW”GϋPdδ#:16³†‘ƒιΐs:>JƒθAYRρςAΛmμAN”Ζ\ K-'K‡/Bt΄žPΥΛ+`6hΐ‘y3ΥYfelά₯h΄C(-ΠύΆ�ΐ9Ξ΄Ÿν$*²φ-m͜ ƒά}k’3»Fΰ95=Ιϊ₯�,ό…ώ˜Π°ΒΟ61θž;k‘5ΆΘZvz~&hΓεd'ν\½F†Τ€bŽLδ:]Ιλ€ͺΣ«bτΑΓh`xŒmΤΩxψΰ1M1RΞf’eœ£@³7Π#KqΒ(!:Dͺͺc”Σ³ΧΣπΰΞΧkhΣσ8²3Dψλνԏlΰd¦Χ_{% ^Ό~ςg~'ώ ½�ΡϋιρΔ£hξvϋρ#2μ3{jέμNΗγ{Ÿ€=@ΑSΟŽΑΞ‡>›TnSοξΧυdδzϊΊSWoW8½έέ€ §€jSœ3ƒ:ƒY–” ŽΚ)ΞόΉΡ ― ˆb‚™EθΙ‚~‡°.Φ‘‘pΔΠI:ΗΚŽkE8χΉœIZe^Z«Ž–Ž’Ξ¬Α— œε ΚP5ϋ$lΓ4¨fM2ΤOf¬―ΓΑ½0x §“LέF€�”ϊ ή .Μδš1S@ΜZ Xͺ ΔνrΆϋΘΌθ(«gΠ«�L½Ύ2e@«ΞRι€ ψ‹“ΩΛFF7^`e78G‚h<Ώ/e)έΦιBzαεW8λ΅PΒχι9Π,'GΥ™eάεŒΦΐ YΖΉl"(q 6Y»υΛ»Κ]@χνΙήk„οœΤςώΑa˜GN" Λgͺ#μ�`ηπ]ζjœξΉI·ς\:�L$Šχ "”ΖrΤξ‡A°ΐ²e,2ΝΊ™eσΎ8o6+΅.Ή8ˆΐgœdx~ULίΩH¬DμI£ύΡ&ϊY‚�φΑ°ηΖŸαXAmλ%€λšζ « #—VW�{ο~H@‰~ζڎtu:Jχ`7ϋ `‡<5ΠΑζ†žEœuGŸ–’›^yαωτφgߌ`g jιNoWzωΕη#Ph\ȐΥΠ�ήθΜο`…Μ~ͺw΅ΩΥ€ ε|–A½Œ0Ω]ΩRφŠϋ18r- π Ύlj�@}*sΟΪ™ u€aM€τ–™I+φ=όJLkhfLΰ4A΄ί°¬B Ν�Ÿj@eΘ�ΏJΞ”Ωmχ¦G ΟΩ�άŸQΙΎ›π˜ε΅ν½”`q“^qœσΠAθ!ΟΊ>EL3±€ Άά1ϋκωΚΘ�—‰Μ-{‘­*  ΄γpmΛ6υόΪ# P₯l €LLM–1ΕΈMž;‡ΘΖr &΄ €@IDATΖWΑZφΌ–6ΧΰΨ€p‰Œ+Α`6ΰΈEaνμ�dΏΘθ°ΆœΫAO oN2Υμo€€Bowόb†ΟCΗ0vρ wg‡ΎH�&{γ}ϊŸlnœΠ ΗRͺ-؍6•έCw*οω…ώ\λœuΨΘή… ‘ΜρΑψX&ΘfcۊΠΝΫ4άiΩγ™|FΟj!Ί)xΏϋδύ«·βψΉΏ™yl °ς’� fŸ)Ας�Δ―–΅#;]Σ€@ŸξΧ&Θ›²NΤπ κΛl�-s_™ΤΪ*ÇћȍΣMΆΡωημ;7ƒο˜ΥW±’τ–q )…`«)2²:ΕΜ½:Yζ3Ÿθ_}_ν–Λ-€m)š ― 8-_‘RΏΕyφŒΘH”ύjΌ¬kͺΝQbΣ”3ήʞΒ"Τ’-d©―ΣΈ|ΏeRϊ²�G”b� ΧΙFΪΟ#μψγG£μ ₯Ž0YΘΚ[*#Σ²Ή;Πήμ+οMήη^f\ΫΟΏ<4”�^ΎΔημΞ`χa pg$΄`©~t'ϊ’€Uh�ςυzτP)ΒΦͺ³\'J°φnΘ–ΠΪ+Ϋw@“α”©Α'βό« a¨κΫ8} §‹{LAˆη'f)=₯ιχ&ΐ,²^ͺŎ;ϊ�j,ΎooΟQ->–JYY’|(γ\ڏ'ƒŽt,: ωyEYζ»-νν_ύ·ώΚ_ύ›?υγ�Ξ4= ܁§―Ρ d½΄Ρş^φ�ί pxNώρ?ωΫΏϋϋπΝ“ΝΥoΜLŒa]Ξ�νΑ.οΔPκΛ‰Z;₯(G³Ι*=g(OŸ‘ƒ�ίΒy1`λλn'Θ¨f€U5s±―π=ƒTs ‚_ͺ›’©Η•:ιεUΤ†vš§M2Ս8}CΓΠχ‡P¨ Κ86ΘZ§αΫΘψc‚’Νθ(||(x!#ΐeδθ>ι‰��¬=Τθ"Μg¨OQDΦ€θi|Ο™*!ψ‘ΡUy—cl±š‘Δ5`§‘πEώνNύΝŒt©βfUς1ˆXΖ1ROE-w ±‘μGSK[4:Β' Ϋ-¨7FΒ,ζK―}& ΗXFƒ}ύ_;¦WΧ4²N₯|nΤi’$;Ÿ!;Xb}Ω‚Κ²½8Ÿ’λω4’Σ)7“±A0ιLφΔ=ŒΚ. 'G'�δψ2™–ωtN¦«š Qφ†J!k �[Ζ~Uq½jκ§Y ‚δLtE6P,Π°1”A’σ}­W,Ζ™φŠͺꁇƒ_ZΆgΖΣήζ{D- Š5qW6Pƒw˜馽‹3$š.%Ο,Ώυy0Ft§dLΈTiΩ RΏŸΛΏΟ1 .Π4uδχ<ŠΏTλ7>6Ηώr―'G˜~FHE%μ=œDΗ,J«ΛΧρΦρ£‹v.Ν ŠC–SŠBέ†tQGΚﳆ8ΌeμΕ™&›YUα ΪΩZγX.bŽ3΄Γϋ—‘οIW4aCΙj¨Οe8Z2 Μ~ζ8%Δ~v7Άa߁χΔ90πέ ¦’I'iσˆΟ�k Ί@V±/-Γ0YaZΔ λ΅K ι,ySζRp₯.Μ�₯ι ²–x/ΦΝZχx†%ξι`~w;Α-†{‡ΐ³fγ*Α΅Cœ ΎH—Ί�Π΅!€½^š$ΆP LIΟ}Lσγqšu’]ΪΐιmΖ�‰/ώXϊΤ§^γάm€;χoλαΉη^ @iΐψŸ§ωνo€BξΏ G/OΠƒλ=;|9―œ�#Νœ©*Α)tX³ΊΦΌ π6Ί,s©Qeftt@σ‹pLh<ΪΘηε±ΛφC)aŒ¨Y”#Νς¦“ zΞQ8¦HG-gi ½²ϋ§€Μ ‰k¨SxΖ}θρι¨EM%Ξϊ!²θιUD€Δ=œœΰΌ#ΣΉ9ΦQ�#jy)a-zMΠpϋ`=5’IoοοMu]-œ½Φ “`\fg[+)χOζtzrMG–riέΖ₯d ž8ƒΫ¬±U€ΖQœϋ|ΞA ηΫ΅8§L‘œ ^§I0ƎρY‘φaΠyX(4Ϋβ³y6x™²'h#ΠLι ‘Ÿ­›υ"εϋΉΘW/sΉ©©GmRWˆ>�2ێΌ―LΟ¦™ρ‰τ�«―‘Γ›aί 8?‚ΩyA˜ολώ' zJ-DG6Ršφ3?υdΟ{ɚχΐ>ϊΌ΅AΦΩƒ΅AζΥ�Ρiu φδŒ`Vΐ ς΄½Ηώ#Λ9rfϋάϋ¦Ί�ί•N6gΧ¬Ÿ2d#FƒEϋΗψ;έ°x΅=ό„μ{;ησE¦waΖW]]κεωe¬-‘ISN2¬§ΰΕ ‚εy:Ω!q�m7 ΥΪAl‘¨1ΟΕi= 6x(b―Τ”€s@Xίݘ†―]K—�\g*Σƒϋ€lΌίŒl4Šΐ)“Α ŽDί:ޱ&‘ΝΔμΩα… «Zl…},ΙY£�A†x3­.­§ώΚ…^αY€Ό�ŸΎσέ4LpπS?ώΕhβω›�σ?²� ύrΚh";‹.―€iι3ι“Η£”³}œ>ψθ}WΦcœͺO­Sž€τŒ Έ€λ³±…θ;©�XUŽC€…=3{.°%@ΰχ{iΣΓ6Ξ…μG±Ωό΅π •φTΠEΆ  RmrϋxdΔ₯F·‘qΔ hΙ&:Žf}4Ÿμ‘΄ζ%δψ‚@£‘₯•³ θ€ή€1’|uΆ·sV`n°NVv½·‡Ž6Œ©½PAΌ9ΪM¦Žό τ0τΑ4Φ‡°ν„χQώΗ-…-Τ²t©ˆϋ28ΦwΠηΘεdΊiξ‹~ωόΫo35δ=EZΓG‘yΔshΊΆ«»kŒoά&Ψ΄—Εγ²Υ…ΉθΆH* 'ω]εΩ— 5χτ₯ͺXγBeJΟ.+wTc96Κ¬8φ=γ¦,ΓΩ‰€œό9χΕ3π|ή³A―`š�ηΘI6ω4Ήvͺΰȍ[±0ά+ύS΅}xxN)ΕΓ»Ά’›"<Β7ΨΪ Œ©JκTSΊfRζ|tG‚Šu΄Œ!ΛB0;ΝBq]υB°ΰ`—ΪtΦϋ;B§ζΰoyΖ2M]© ¦‰ΗπίYg―œΘQΗηžΣz6ξΡEw‚€Οjpκhα\l‹ΐjwogκθaν`ΐR‘胻b‘-+ζqv‹ΉΧhPŒ�cbZΰM= ‡Υ,Ή6D@Ροgϋ7˜„ΈΒΎF;†ZH­ΰ~iO,χt4δ.:^»Ÿƒί)ΰγPBŽθϋΑΎ λΛͺ+Ο  :1 ΗFΞΗ”šΉV$Ÿ΅²Έ `aΜ†ημ{z£ Τ‰·œAF…ΐ{τ=ΐ[εω΄©ιόςΐ,Ω~€ͺΖeͺlΐAΉδqR.½m<3'jφ69Δ*ΛΤ";”φpMΩ(-γoΌ<oR|<νιθJνψσθ›‘‘‡©QŒΟY‚άͺkM–LŒΝ.°�΅$d|Ϊ€έ$/QNνΧάC {%[£˜Ώe͊‘†žα4ψ*ΚΟΩ«­©ώ₯/}ιώσΏόo�»ZWΧΊττ??�ΰ?}ύ›Ύg�Λ?ύΪκ~λϋΦGοΎΧHpέηb�˜E0ƒ₯r΄ϋ³Τ‡\‡Lηά?*EA‘Sγ Κΐff­-PΥRεd:Θ`TutΚ€\šiQ‰ Ω‘�έϊΰ½ΛVWUGφžΞȌ‰«&8u>ό.ŠX£fgώ5œ<›Τ8 Β±/Ρ5ΨܟNŒ₯ 3Ν؈@‘u`¬ η‡a0χ1Ό!ƒ©b�Ω=›cY++’jΆΗ~ °Z(λώ­’Τ9 §ˆEΦ’£άŠπh·bu+ω‡χοπ¬Μr'ΠUrΩ0Ž–iόΙΏψ½tϋ£οπ9tbgMe46C7ηή‡q,νmΠ—©j„β @ ΥΨήFeV†θ±J9<HM™ƒATY#_O@‘ž₯–•qJλ6žͺ"ΣHνzz‚~ΐ†˜"œτœι¦A΄γ` Hg΄s±ΐ‹”:kο£3:Ω¬S1Y£Ίφ”=ϊl†ˆwίO7ΎυGiτρΐz20Ιΰ”δζΗw¨‡§ζΗμŒμΊΘ΄Žš²dζΘ@γ΅Ο΅ό>ωŒ “λH9bΚ RswuϊΘ(,aΰ€ϋ΅4΅2  Ω9L?iί΅š]Πuܐ Œ@ξ“;"ϊΦ]žβ€XΧΌ…ΫɚΌΕή+YŠoδ&μzν 8sΫ°6ώΟ °C†jccΝϋΚΘπΥ“©¬!&�`ƒυ­mm4"πΠ@κμ+ΦΥΎώΪ‘ ­# άΖi“YΑΧ�“uLl�dS/|Ξt>:ό{=›)ΉZϋϋΤΒ"α—ƒ.,5˜S…“a †Yήd­έ%›t£Η2lFBp/§’&£ΠΕauΠ(Ω±c΅ΐΨ €ΣxšΒ&°ϊάg?Nˆg|—¦ž–΅·vΡ¨q.­xuΒάΗηMŒŒΜCΙΕY+cίνΜΎΎΌ ˜ΒemΈΝ(ΐΙιφ₯=δ³H ?ΜΫƒRήΩ֜ΦfgR.{΅%σ˜}ΘΑωά;’Cώψμ“ιpΰ|xŸίηQΟ’ 9GόA�2°">σΩ·ƒzoύz‚·ζΦΆθ)a©Ξ‚fu<`ΪτΜTϊ˜ώžΧZ}Όƒ~΄A[@ˆ₯f™ nω΅xΩ Ρ—gΕ�υuœw�Yx ¬ΫΤΡμ©Ωlki-ΑπO=“μΡΪ Έ†œ ŽψDΛ€αδγ΄;•CSŠΎ`Μ4εΚZxPξ}WΤεΡΈο³W–ˆE°©¬£l¦Ό‘y»ϊόΛd“—‘:ΚΞ–6¬(›…μ»Ϋρ|’_ϋΘD%€ŽΩϊ¨Kζ¬NMNL΅ΣxΧ@¨]?φΛ>7³Σ3ιΡγOBUΥRZ†½ν€₯v@ΰ£ΫwΣ§^%χfΩάΰL-Μ/Ε³$ŽΕζZ§]@ΐςόsΟ§GScΆ#k>³Ώ°Šv<6J%fΛΥeώ[]lέ· uJ!°Ο,Υ*Γޜ²—τ–™m—y ½π{3ˆΤώz-Y κ ΑΡ€Λ}2Ν� e Κ€vΊŽLŒ³§!»†κΑnήD`9θ�gd€�‘˜,�›ϋ*λ Ϋ& νuΥ',J˜μ=νΎrξgmoR^„=—a!h¨Μdu ΏwμˆΛ2l[)εdυ©·§/@ΔSδΪ²Žc‚.AC§¦Έ>φ2ͺeŸš(+AŽ•*ƒr{ΫiB}λΦ-λΨPζ Ί ”jΠ5φW2ΛZBΐh_€2οR“!54Έ«hλOΜ[ΖδxGY\2΅ €-;(%«/Κ^ φΡ`ΉCΪoΔ ί†’{[φϋΨœDͺ£DΤ€ωŒkζ°h²"άo΄||�@¬ €Yuƒ|ΟQ¬ϋ¬ΟΓ�y™Y?S‚ϊΧ{’ α™.‡½©Ž“ι©rN€ν{LGΦlβXI¨jΦ»F‚μͺr€Γ–φnžϊώΓ{0ι7ΥL‰™(€ρ<Ÿ₯šξ½μΖ,{- Ξ°Ή<½mχήηπήν…b© φBΏ0ΫX[™e�‚μ ­ŸFΰXωπΉΥΩ’8ω H3Οΐ2n’ΞΎ ϊ,ZοF*ΊΎΧi6’VNАω±«RΓΙoBd›€r[ή.ϋ/xζȞώnτ\U0hΦ`―Ωλiž²¨G#œ_S€BœcG7ΧB.€Ξ2‰j‹ώ–Vl`Η9&αΟλ§’όΡ‡UΛ€ΚΕVnn{mu.`ϋV…ήΧ�q½\ νκώŽL†‘Ǐ�όΤdΪΖ†’“…,7a£,΄)¨˜ΪδΌyqφΕ΅H8f„;“WΠΏ‚O•τ-¬ΆΟ™MU•A}Z'+Ts¦ rΟ`8όκτk�π—.χυ­?e xN^Oƒ?'ρƒΈΏυ·ώΫΓτ?ώΪϋ㏔α pf‹T€6d±2jqQ΄"¦W*_*Tl‘Qiε}]ι3oΎž�]€Άš1?ΠαOqΆΝ¬…ƒ‰ΑΠ(ΘΠjΨΜΛ†:§d•ά½Ζ΄·qw‘bν2Ϊfz„c!εΟΡLE8O6Taκhoγ€xhH½’ΏΘ{”Β€6ΥθθΔμiˆ£$C› #υΞ”U ΏόDzY]t5Υf> ΠψόF©ΌlδβYg ΑΎήͺ“―{c&Ή3«vB�* ΗΖΚ<ΩΟ-FΥvΈJ$KΐKD]yΐAε4„φεπ3ΈEφ€ ηU/b³:ΛV άSoΠn .d·0ψlψYαΨ6Rƒ* `'ΫρezcΦ:LΩΘs–ΑΒ�"ήρœ™έΨ}τρGήΘ9υ’8½žAΛR6` pY>ΫϊMRxFη²ώ =”π\"¦”2K_Ά(Ÿ°qβ) eχ΅ϊ­΅Υˆ|+κ‘λζz2Gϋά6.MLOα¬@E6F§'‘ύ’%½0L°~@IQفšR~ISsι>ΰΝώώYzσ₯ΧβΉ}φάΠΕt‚Γ°DΙQY΅s„hΕ‚fɎζŽΘ^Pκ€ΩpΜ ΚΊη\䲆η23t²€ΖκΪτνρiŸ5Τ)“Ίcγˆ€j… ω„u±&\–”gάϊv3xΣ<Η$ε:–άΏ/Ί ΓtΞdΏΎΙπ Ϊ,Χ΅Λ·4τ#Ο*ϋμΛlrkœΓΤΦΫgό€Ο‘rn�ιΣΧίKσt¨–rxήΏ}'d»WKm“¬°zi'Nηwpp· η“υ­bΝ‹PRΗdV+Π7η8e»>#2hi„Yjƒ|p3w€A:ήv 7ΰ_Εœ'pln%«FfjuΩς0Ώžϋ–Eeπ=22JΘ…ps�π†³ΊJ[8*ΰhΠkζqƒώ�ξ₯5χ ’?t’ν+CΖ‹ϋυ ψ™φu1ΨΏqγFΨdςγΘΕ½œtτ²�8G\GηXύ«ΓΞ£hBxhς}ΧT‡U]Ϊ`# λκ΅ηb½ΜŽ»fέ=}8ίd%ΩcΛwtμΗ'Η Ρ₯œa§pXz—­η"^ˆkf)ή:―ΘουyT#Ίύ‚Ž”ε3•qF,;°Y―Ήlΰ‰ΝtιόΉ@sXΗ±Ϊl6)ξΩ Φ쬣Ή{\‘/Ξ`ώ™]Ψmio£”f›ΌΛ±°ž—=@ΆόΚ"lΙEφŒ©8­Mi°³+u³nWŸ}6J16–VΣk/ΏM›i==Π—Ϋ�?χΉ κ PN˜\½r1ύ…Ο½EŸS3κϋ�;{ο«yzέχ=·χή{›;½ξΞ6Φ%eŠbqœ–Λ€ „A ’rΜ•‘81aΔ©΄eΕ€€D’%ΛjT‘H.Ή«]ξrwgwfξ”;·χώήήk>Ÿσξό @κ,sΙ»3sοϋώήίοyΞsΚχ|Ο9iJ½Ου�"φGP―Y_½½iI…e°δ8WζνυςΧώΪηΉ�lΫ*>(ucΟ³£φp“ΟΦ�ϊlG²gtν2/8£έnΖ¦ΪOGΫ.KΗ’Λ―ΞΘ€oΑ°+¨okmJΧ�]‰ΖΓW―ΓͺA­ΗwάδζΞVš_ZIά{H€UlxNκδ΄y�£z‹ 8CŒδ΄°Ι„έ°Ÿ/£¬}4y²°μ ›χ� *τY�Db_ ώ-£8F§©cυGN΅{ȈΣQ.s―gψ'χήc<+Œ0ϋπI°),…Β`‰> Φ.F†§  Θ@£η ~Υ邝Ϊ'}?ΫΏ;�Y»#pΠέέΖΏ9·ΨBΧ$[³ήŽ Ν§DΓ�ΑCX‚΅ mόΐd{ƒ}fΟ΅,‡Τξ ήΨlΆˆ$zR0²₯±=:ςΛ$°Μ1—d…½f=τͺ¨₯—ωU„N‡β ζΗιΰΓ·βzž &=dž˜k‡ρ«ή±GLS­jρ++ω§Ϋ”ŠΚ˜,Ρ_±%R‹―ˆΏ°˜-“Μqμ(ΰΔ>Χ=„iΰ™Πgtίυ‡Ύs|”m"«sν™n‡y(xΰšΈΏHhμg¬#χ]ΛΉώΤΛ/ΒFξ ?¨Ή΅5| 6>Φλ ;k05Aι₯ΰϋlI―@F” ©�9 ώŒ³ξsGi(ΰΊLζrδ΅™2ǚΚͺ½²ͺβ―��πί�GjZ@–ž}ύ(­@Ψ»₯zv/�ίVΰώηΏΎύφo.Ξ½ Uς”fQη �―BMΥ€ τrΘdJmΣ!33ΨΡWΡ%Ί²ΊGΈ€Ζ>YGgk~큯“ϊn h64Ψ  ·*—©Yš₯@‰ζγ?‘02%PFq†sPΈ`ϋ‘Y<Γ±7K²†#½IΠ­2wrΓ>JWε’’1ˆ3ππώtΠΝ„5₯·]ΤΩΥƒ*:ƒ†Rκ e·z¬{‡*)S ‘5Vά2ΰŽ$ΧΤ`kdfH―΄aZŠέ^Υ6ά:δ3Tτf¬ΌV!udYγXΜίνψ^βΪήΩΝ―6‚ι5¨Š:€-Π-Ν"¬ρ΅!Π1†ίΧ4œ»…#Ί•f&EV₯…o–daήςΪ2²X#ι}κ±Ρ)œ%jΙ‘ώΦ‘ΠΝΘ”RͺΰD 8\hο4¦!πi‘ VΜλΞέ' eͺ–Žnœkχ Ζ¨ζYŠ€ZΪ{p8ΦΣέ~#lLঀꦞ4Op—!`:Ν‡zZ„A€C˜¬iΤ:f΄mvΖGΏ]³ψΘUNM Ÿ�ΩΧ’22β8šΟ,―Dη8FΛ–‘œ.-¬$YKG JΠ–qxtL• œτΓ˜α¬‘!θ'^ΐA8€^lldΨYs‘A@NLqp-Yœ[� Ÿ0~/0 {o‘YO;Γdλμ°€\+[ ’μHg߰ɚB„p++]ˆ ΄T:ργΨ4Cυ4°μ$€ΌvνΟdO š(˜έw­€’[’²½mΣΜ₯?Υu%ισŸ� μFF".άΔΑk^K4 \\сU^ ΄lΙ’E€²NtΪΨٜ>ϋΩO“™ΏF·z{jdǁYΫΪ €qλΪ d˜ΰMg['Ζμζ0870‚Μ’¬f6bτ£αQΖ½ § ž·η~jx0αΔηœqΦΈv;τ}3:³f'6Φό<vΜ€%<{:`:J՜“6ϊšταdŒ ₯™±qœ –—χΐbdt"ΤZΪdEZg%z!ΩQeIͺ³@’ i W�\£Ξύ"Ί€fO86«Σ­q?œΊ`y ·ΑN“1%8mp€SfΌ”,j€Q0*ΘΒκŒκ°‘S#`\EMάp‚ζaΙμ0£Ϊ@ρξύ{tE§Μ™Qώ₯τNo ˜²|©“η+#8RΏ^还ʐΣΜΤ :)›ε&½†ƒg]5ϊ§L±π&h ΨXŒ³ο—Yp―9?C38Φ²Ρt ―`šŠϋ pG�βŒVς™_ώ7�™ΜΊΠΝ-PO .Ρήτ8Ω¨žξnφύ$ύΙοώΛ4ώd^ g©Ž² xŒϋ#«Š,6“kDχ’§ͺΠ-%€ Ε'œ χ‚57@›™Ž Έ„λοαX�,ΓAίΤΒ�± `’2 ’*φ“ύ TΑ2›ΨυBmpf7)1p·lB‡^‡SΠWΗέΡcΡ-%·ΰΛ ͺ­­=€&Χλ7n{BT§ίf„�‘Ξ}PδΙ„ = §Τ€R`ΑΎ/Y š³δΎ±ΌΚk4QγΪ^Γ{;Γ‘@0›+@%hSΙ΄‹tA)kώΰZ#=ΦΡ“Ϊ'›©J·••`™Š£ό2°Œ΄{U΅υ\w_<Aψzf&ΪUΚMtώr€=κ†%‚μeφΪ†©ΪƒŠ„kbzω(εL€?ψΧDΰG‚οΗCΓ¬yqš₯7Š�ε ύ$=wϋΉθ0 B`τϊk”8œ§ŸΒrΤ‡—Π�Σ£fέRˆ ”#{RΡm\κg,RΒ²ΓzmΠΛf΅Ό“εg $`γ\0š°+Ό��$qΰq(•jŽ©W._Š^FήΓ‰z°—%EΓ~Έ ‡ϊsց€ŠAς ₯zW―\arΙΰ;aIκΆczsΠRΗ§(Χ+€‚―ήςފΤ?ά—c”ΠXς‘,ΡΉ΅μΞ&:y³{|ŒŸΔ9‘9¦ h ΩlΖθ³ΪόΨ`ίFŠάYZ ΐ΅ΔΞυτ{ͺ£7DLžFξσksςdJ!Ώφ–r\β<Νι&ΖfΈ3υΘ²(θξyΠηŠ`‘5o$H Ωεw π¨œqt²= " 0w°Ρ2a ΐvπαφ)ρά$ˆΦϊΛ’qš‚ςοΩπί–T©»lvW ΓJω6Ω#θ*8!σπ½cƒΩ~—sJ?*J—jͺΕ�^ΎφΠ}³OŠ₯‚―~ωwA{?/ώ͟ϊ–,šEv Τ•ΕΨΒjΚ‰ΒΟ$¬κΌH ‰ z4γ°w'°ρΦ˜ƒ.·g’ηΙΎ.Ž v�Rd�ΉVK+]ΓΐuΖ@ϊΚ*,L±Nέ_GυšrZ‚ϋ’q37yBάώ1κν>�fœ[2`.�—Ά_ί“eG&π%\žG@3¦+π:οΏ­ΩWΩπ�‰&φ·Q¦’A7 ’k,Φ>ωίέ!ƒΟgθ³VWWp]jδSS†/Ή½F8>”rtΖg(£|k¨O­Α^δΡc’}(Όivn™&-E)“s4sޝ,°§/%RŒν(*αsξ‘ ύώrΓύϋΩκv“ηQήΓhCPΑ}φ—Es2M5LΟαsα >Љ(Q.­�Εζ7ΦΤ\ΠD|ΰ η ΆΟο΅Mλ˜RM\)U—⏛΄Ι~Ά“,`7“ˆͺ«©^nl©�επ΅�ϊŸ΄< ΨΏ½/uλ³―Ÿ°€�sψ'ρΖθξ|χ;o½ώzΑΚςΒ§Λ8Τfjmv©β7ΘΠxαHA‘.ζ WΠ=Ϋ€ š*$ۈ­ŠYγ$Šm#©lΖ]ŸΗ…a†O*ι*YΩΩ…™tγ&ˆ$Ž’σ„νr~DζύŽ£€€“fΘfNLL„QQ©™m³ϋΈυU U š=έέ({_œ°Pr(m3vλ« Α8 f8όŽϊ;”(΄=€Cκ Κ¨Pyϋ%mQ;—ut€ Pl^ ΐθp±ηp-Cΐ†αΨ$3£Α—=ΠΪΩJ_ƒOΓ–8Ψ «w=έΌύrψθ=j|@τ…σΏΌ8K&₯%|š¦‡Ÿ`ΐΙ°£ΐ…žFνρΌˆϊ<ΏΥΙH8H4,dν©KΫ¦&²¨€JζcΊfSQyC¬ye%΅Λ΅₯8€d1iΌh&S#V(ΛηΟ~F©π{{dΦAF†9΅p,Žkέ‰~ 8δοΏχWi~v†ΐ·•υΙ¬ψ+‚Πxλ§χΩοFW™eΰŸ±ξ‚){³›d tΖd΅ΈΞ�+^² ΙΨ^£Ό‰ΓYœΆMm¬ΡψG 'Ω ο „@V'GΘ Ή*0‹Aφ“=pt”™,ΘcΚ²Begη½²ŠΌ―Ψc3ρ8r2”Ϋθι€σ’.(‘γζuex(Krp)Χ‚>6‰’�mP{ %UYi¬§χ*ΒΏƒ#—ϋΣA³Έ…`�2‹UhΙ½]½<=L#ΐ†iΦw½­#S�κg?EπΫΠS+‘-ΞY[ &2='uk˜Ώ<9;•Π€p}‘ΖUœUΛ^Φ‰l(ϋ³Λύϋχ"2”%4€μ„κ,}VΕϋsTb ΩΖΊ:0λm<’·Δ ΑPbJΒdϊσΧ� ‡q•μ8μuη87!_―Ός<ΞΕVzrηέΤNΙS`Y έ&‚₯ΉΠ4λυlmβ™MSpΦ½IGyΟfΗΨΗu2αΌσv”άΌ|3ΝNΜΐ€ DΕ{3Πw€"DhfΝ“‘qz„AŒ{imΨj¦η§κρΐ]2γΟ8:ώdατ+Ÿ–ιΰΚ�aD¨ €DP.l §Bh)EΦ?σ3?CsΘ«Q?ΏœYL>ˆR…€>kά;Ϊ:ȐΆΑΦ8HψšΊϋϊ‚^n‹ω•eΖ“.€χή%x» °R™οΌ— m ss‘{πkF dšΝΓαεzf€}Qv‚€Nž_œ=d]*φάθXθmNB:8=aσ¬—©²\š­U§.ώΝDNOΟ0±Ξ8Υ5Jƒ~�χ~‡ς£|άο©€3e―‰6dΤQdη`„τχχ°φ�Λΰ"Ξ_ΆΞ₯Ϋ7�€&ΐ£₯Ιρ”AW Αέ&YON}… ¦£O|2Όα΅ ^τmzΖNy&jŽτΕϊSθŒ…*ΕΏpλ:ΐ /�Ϋ³SΦΩΔΖγ'4‡Ϋ‚EBωέξM™ωŸM’ p ’Τ—5˜εθ‚+™μA/gyΝ“΅ƒ­BŒb]k8_ž} Α-GWΧφ\NΕMέ”―ρΉτ υεD`υ_&βΛ=9φ9 †ξ:Urώ-}ρw²{؝-Jζf'ηΡ‘›ΡΙΎPZ  r]@Ύ³£Ή#>_]«ξΥζ{υœΊYƁI kμ½>VU=ύ (‹, ˜Ο₯LΞ>[Γξ§=l@Ι ά7πχf§f‘ &`;——ΨϋeφΟf…τ+Αg(αΩqŒŽρΝ`'κη9•Θ½1"ΓGπ%šcsΆςΉ'}V}BΛB6IVΈFϊ Ϊ}ύ&Οn€θALj*Ύ^ί4�Ž_«εΉwψδZ‚Τ1ξ“~φύΘ₯O–S2vaίΊχΑΪ€O” *ύ–0ϊήϊ6fΰ‹ωΉ₯¨ηΊX—\¦M’hYΠζΌONΑ ΰ¦,ιΝ¬γΊY‡Ψ#UΓcΣ4χΝ„¬;…Γd‡χ/%΁ϋδ~mΪmοfٚ&Wμ³α=-:l°ώ[ψG»œ!ΛIN°σ–jf240ίΓ'Η/*'‰ λr¦Ιτ$ŒZtΥΐ μhˆΑJ�š‘6s-+@«fΖCc�a·6NG₯ˆ}fιώ;‡<‡}΄)fžϋŸmί±LΩIάΧ+Θsί`‘t”< (�ˆΟυ»'C'{Žΐ1ΟhS$Λ#²Ξ υΏ‘eμ…uρφLP�μd_SΣƒœθpΰC±—τ0 λϊϊ―Sχ=Έ4κRh¨–ΘŒOއ±Τ‰Ι π<Κ¬xπ0m:jθνβŸ!cUΘ~<Σ!Ω²\5@8ž™χqΟ%°Nii³²ΞŽ6ΐ (Œ6Σ€wφΙX!8θlξΤΑ!#;γ8&›]:j΅pη₯λ7�Žˆ£}�²_Ž?j€)ψΘγŒYrΐζΗ<σJNξ?˜ΰ:dΔΠ ²άcƒ  ϊ5dιٜC ΧoΓ†Š‚”kΘe>λ±c�œ’CφAΙ1²:€:ρ •Ξ€ΧιͺBΉ9Kθ ϋAΣ Ε!ΚNbPJφpN Ύ€fpΓωηηYv•0Ξ"g―š§λuzjY΄udΈ�ޱͺμΟΐƒ{άwΝΟ±œ‚ˆξNΚ΅`ΞΨρތΣΛ/½L“&ξ—, ο™…U΄™η­hΛε o²š€Qy€);dΦNΦΉšs*«‚³…0ChΰaySKG'τc§;PΚΑοO?pN—ηdx^Pp‘—t’ν±`Fq‰ΜΣο�φΏL―Ώώ½tχξGΛιώίM“Ά“ƒΣΒθ`y0@ΣΧμ9hοξNudNŠV.—˜ΙLGcΎ₯™EΚAV ι³θθΖB³fΘχηtt" ܐf}λ45΅χΉΆγFοQ‹žΥ΅:�œyή's':‰σΝ-­ #œaΐΞ©K%jœgυεΕΛΠι Rθ­±Iφ]ΐ«JϋΠΘ#EœY‚U°“ΠίΞy—v¬ξ±LΚI&ΥόL€‘£½“½>Ns€8ξž 'ξ#/ΪΈ"J>Y;υ‡Mvσ-·αμjCv;ˆ }žY}‡œJα— "[M]\Ν™έdͺˆΝ΅U20r±_˜Wφυ4θυ»³61κC Ρ~+ϊϊ8BςQΉΚ€ΰ‡l:AχJd²ποώέΤΟγoηΒπa―όq€&Z°NΔ&―7Υ‚°/ΞFφ€·ξΌ˜ΥkmύΆη₯– Gj³Mˆ?ϋ2γQ‰o½�NΘk g,Ÿη/@&ΡyΘ΅£΅ράqͺ§ψάή³gR撍…Χ°…N‚9doeFΨPΫw:�S&k4Wdύ,Oε¦`Θq’ }]l±~‰ο΅χ“₯ˆΚŸΣ“j(οεx‘TdΡRξCL;₯[œΎW]¨iuА7œΈΆΗ:9…I?J SF�Ν—ηΠ‹‚bφ•(YXd}φ™Ή=Ÿe G†α »~Ί%;φω2sΐ^+�ή³gY�MF‰eΪZ} m/[ΜΞNΔΘe? irhΩg=e°}½έQ‚΄ό9κΪ΅KαŒ Γ!ΕgBžσ:`L::{Z1χnΒ²°8'Υr}ν·~{>F `~m₯`ziαwΟΏτŸώΓ�δΏόŸ^ψόKOH~²{ΟΎ~TWIzφυ“Ό�μ_όζΦ7ώΙΧΜΟM7­,-4ΰ”–I;?D9©ˆ₯’Q1_6ϊ�ŽQuΆt#¬Ω•Ο>št+τ †'Š I¬³ "΅;ΌΩ`ηšχ’uλθξ‹@y ε?ƒσ½γϋύ7Ύ—ή'3Ώ0MM΅~fςΌFP°ρ¬4ζΞΦΡ1hŒμ΅ͺ_E§Fσ^¬‘D�Η½YΏ§�ΆI6EMGάhτ¦~ΜR+ι—Y3˜ψ‘¨&lεΈΔ5ΊήkΜ­“Φι™Η0Υρό u8στhΔy2ϋ΅‡qέ\_ΑAΙΠΐ©uΩNγ8ε­½8”΅(wΊη―,D]žŽΡ2T³C”fί…k©šQ‡2¦Η‡�δψ841ζšG"‚X·bšnΠΤζΞϋ¦?’š!CQ‰γ\NŸYͺzT”+Ω™όΤΫ›­o]ΟΨ3@λh¦Λz53Ρ0H9ΖΚ:Rf…ΜΪΦΤ6ΰΌ·γDΠΔ†/3ρΫrl, {SRI¦ι0M-mrοϊΠ’1›: .Ύ€%){<Ώυ¨ξc?Γ  άΟ κ ²b)ψ€ƒaiˆYžlv…;Η±ΪΕq-¬YΦρΏw"„F5(»8‰:wώ¦Τ)Ππ(‹άFZ7Wͺ+ΩMΠmƒw™4ςfλύ*pPΝβΪ΄ΗyΚή³§ΜξΘ6Πρ“~―Œ¬‘‘0 € ΐL§`Œ‡`ΩηΦΦVdUΗωΓϋƒ}Υ‘“nλ}ψλ€Ω²ŽΪώ>φλςεK ρσil|,uΨπόŽoυΤSΞ3OΌUœƒdoΡΪM•2δϋˆΎά  žΎΠ βΑ |ω.‚VΞϊΘhiBFέ�9(ΏΧpΠ/υ^LΌ“J،r|ƒ}Y :d:-΅8ΆΞŒž˜’yϋZD0jfO'Ι>6‰dr<MuΦΜΔUΣδιΦνηiΗΔI9`―¬½tΙΜLœ  Κ€Δφ²Ffb\Wvλν‰r‰τD4TcΏ"»Νt†‚‹RΦΊΈΤi~&ΤZš{<Υΐ@`υN™€χΛ*1HΚΓ9�‚[B nωAt N·ΞšςΛXΎ΄N4h‘3iP67GF”ϋ1pP\ Όa ΆOL~ˆνλ?O)™X)ώC°k/[h―dL 6Žh&Θιy�‘νκνηs₯Π61œ‘^}ΩΛγίΑζ@4ΞBΦΠΘ€ΤΨ)€Ÿ{~D Kΰΐχ)kΏ<07—–Ζ§` £8₯%μy₯CRι— θ–aI,ΑP°—… °ΊΧ~ΫΘΘϊ*ηκͺΑŸ:ο17‚DΞ!gΚ‘f]ΐ£€ΐ³2==g�Ln@·ηΠsfΉΠ"ηAzΆϊ5] x{ȞΫΘUΠΨΖzζfςeO\₯)ζ5€­5šθ Ίo}¬‘=,m2(4Γ* TΟ²¨BXΓy΄‡Ζgi0€°TmmXΘ[.vŒ^.Ύ_Ν‘OfΧΊΪvς ¦¬‘w‘λRΦ+‡gε΄₯b^cΝyMC]ΊύύlΝ§_ΓΆσΔ�<#Κ‘Τ\§·θԟq&lΈ'Γ€Όš†u :ϋ%=Έr„j^{Ύxζό ]ӁάTwξ�ΘΏ·“ytΒG>$B“Σ³d&ΐΈηn^‹ς5©σ%’ά6YXJΠΝ5b²ˆžƒ‘�Λ³5σl–S B/Vξ ψνe‘ 8ιΖνάWAO–Ά~Θ9΅��ςΕ °ώ¨‘ΗFΌψ�mžέΟZ*·ΚS$θ$`^0€˜Λzzα…ηΰΊC7Γΐύ5{έ @Ζ=«η—2&06¬O¦4πU€63Ψ%ΥΞ—_‡Ξ-γ*ΕkA3‘ƒfs² ΨNt7Ί‡λ(ƒ‘ΰ [£i²―S€»ΌΠΡƒώ̌°εm‡€ο¨‘wψ½Ίά‘Υ>‡ …ΊΗэ޽kF_(ΓcSœφΦ…Ωα6μκ<=/¬ ·χΣΊg‡ζtϋθ6KPφ6ΕΚu#ΩΒ™0@ΥΦ8©§¨’±›υΚ-ΰφO ΌPΆ“Μ�:1H=aOA1{8© °+Y*ͺiαΥ4“ΔΞUΆvT2 e_Ω &EHΞ$Μ.l·Κχˆgw|²™mχέ~ŒάΫ‘½Π»•‰δ‰υτʊk€r―\t―g9ΓΣ’†`₯²–‚-₯0ΚaΠερ^V5νgfΡϋžžE&ΨΚ2ΊHΆΤΜLš›¦'L©r€¦St†vC�NX_hIμ)vΡ΅ τ³D?„ΚΐY9s½°γφ\”y Œj3-ΰRά³ΜΖ ~ƒfο7ΚYΩ_`ΟF0=x>u—_‚“›”«E?ώ­Ύ˜/g?”{ΩLΚRτAα ΙlΤN „κ_Ω3F`]™±—„Œ1χΠ’[Λ!ν»€bBΑ1°>Ϋ�ΪRz<1  ί”^|ώΨ¦q=Λ:-ݝ Υ ω;ώ ›ϊG_ωΔ½ε|P ˆιΩ VΙ3!f²‚ΗŽX*ŸH }ίBθη…ά«²<'€–ϋν§ψ γ£€7μΗΰΛQzDIΒβ\†{μΐy�…¬Υ¬˜xψΓκΊo§Ίͺb¦2΄€zτ’{ΩΪΦΔ³2m裎φφoόυ/υο�νΏυ·ξΌφυΧxšg_?κ+€xφυ“Ύίψ_~sωΖΟ}ζ/Vǟ<œ™™ζUΥ…( i‰*œθmPFι†R¨€ΠΩάθ:ό*Ž%φ.ΠAgR[ž₯xΡ‘c(�U•�oc)k#‡‡γΤR ŒΒ}ΝυρΐΓT²]zlV^Η[£ αQΉaβΪ:t~²z  ψ•c‹ΠΦ:χ8τέΡ;*§Φ`ΰτhŒu(uΤ &Uς­Ϋ8Ζ*m©νh⼘Ή\ ΐ>αΎe4HS4˜ΦŽγ8ψ$c VHΆ·3άgΖΈ>uwŸ#`“vœEž·Ι©€ϋΞ]‚NΫKF@vσ§'ž€εΩ1¨\Λκκ1t»ηyωεL X#ˆ£ !ΝrF‘™½υφ» Œ.¬‡Z 6lzΚi‡’[„£P†"·rΖ¦žL¨4gƒyi_[fεΠφv&Φ;� ΫΊ§§Jϋ9žρ,¨φ-­νzŒPbsŠω|"©tξ⠜¦#²Φ+8j41Β€:γ[‹Ο§Ρ€0cd―3 3ωφ]p½’V™½Ž}Ζ‘tr‚ž.φ6yNˆNγ₯ ΫTΚl›χy³,nˆΦ.ΖL>+�«VLγ―§?GΤ?½f9N”Ν’¬_°Π9Φi‰ΟBFμ9`ΏŠ>Έ3<ΦΝ"&Θ•Α0ƒϋtR0L)+5Ρ¬(;=A°ΰα ΤΑωF‡υΰ:qΛ>Y�ΰηtΆwΕ™³±\%Ωη|³‰>‘ž™VG)­@·'+Ί…γ)]Χ@³šΡG‚fhΝnJ!Φ±6ΎKξϊ4 Β”±;ϋ₯ξ~jσw�ύρŸΣ¨” „ΰΗΡ₯i€\•|ΎΟκμε«ηϋp–Σχί|3±OΥ8tφ«°~V'Uΰ¦�\dŽί΅Sζ$3•ž1”5‚Nε₯€l²δΠ n„Μ©™ώ•8Ɵ€sW.§Ϋd@Χ(Ÿ!Ϋ*…:›1󦻧c©Σ‚ΤΕ^θ9%d }TΟΉ²f0«¨€".ι«eRX‘θζπΩ@ κ³ <·‹!μ3ε.μŸσΔ«qΖ._ΨΓω³'„g(ƒΣmmΌ@j+e(κœ•••μžσώ&9›KϊŒŽ–‹ξη8·ήωσ7žOίωφ_hΠD±:7΅κ1Ω†kη Χ|Ά3c§?q6ΙZBφyθργΐ3KΛ€—ΣqQj κŸ―Π›1“ £?f“S³_E\StNg+ς²LΏΐζυe<ƒΐŒΩVΫ2ψ·@ΝLΝfΩίN)ΊΛLχΖ“œ˜i„Ωg_;Ξ a‰;β,Κ8:#ψ²Α£ΩBiμΚy ¬žάΨτx:@IDAT8Οiτ*ακzο»„ϋ±|θYD¬CΆ”γξž>ή#‰ΐ G&Ξΐƒbθ°·axΌπβ+α€Ϋ4Ν ‘€΅υ莿Υf¨‹Ό—dĞS“γ!?;θdWΘ^νσƒ'•*θΔϊ €9 ‘½§;φs–³c@ͺΒ£5P*A;)GΩjλξH—�^aofΣ M:ύdΙ‰ ·n=ͺ½³J €�L0Ο.ηa©`ύ:λR�…Π‰Ϋά―΅όF‘]ΕΦΊ?Žx΄ΔΠA₯ž·«œΩ©i¨γ€ΥΫΘ«{θωF(£’ύvd»Έί+W.ΰ40RΝ θβ…σ ΅ YΟΌFφΫ„€ΥκκΆ² Α)MB94Gδyͺt›`πΩ?fVΖΚr†RHƒ]@TΜ |χh}»ώK_κpεΘΰίσ)γ—2θgΚ>πO}Œ`&πyΚiΆSέ…oΑ·“z °€oΛJ3iq€Νφ³š9�γ―•ΖΡη Γ’η>8οm­‘M>’‰ΛΥr1³Pob©”ΆΚ@ΤVn£e,T’§μ+Υΐw9k–ώ trKBx^AŸΙž2žW“6θύ•™¨]ΟεL–΅τ¦Βjz UΡ' ‘5ϊ•γG;HπΎA―” φΡR‡¦–Ž( ΰrϊU.Χυόνo£swY?όŠζN䯁�ό§x�ΪEKσ²²ΕΒ+—>_ϊsΡ‚Š[ΎΗΫ+ιx‹?ajΘ†X^˜NK³3dΖ)ε}6?41d9₯@ͺϊ£³·#uχ1-Ή¨#a²  »€>”εsFΏ§zΦ_›²\4ΤΥ�»§+ν-Ψ-Ό2°N2 ŽΈ_K,P‘|©—(;α|ρKΎ³²a?εΖ’} G.ϊoΑrΑϋB !ψo“»°[μkΐK,¦qN•A'Žό»Η^Λή[ώΞiHYΰ&'ώΘ“-”eeΡήb�«ςͺ]‘‰Α»ω@41ο-C6τ•[M›IκuΆuΩ߁Α;Ιu·‘Va}ι+7bΛμη Όš„3ρΑγ°ψYθlu‘k�οώtdι!z@ίcY°ΞEwμ“xςΪ–dnΒfX¦9i.ϊΛ²mρ ύ1(•Ψ€yΆNο;οάMoόεw�tΫ�� ΟΑωGΎ;)<‡ξ,/+9AmΦ7ΥN /ΎΩΪΪςυ[·nύ£_ϊ₯_ϊ“e¨Λ|φυγ²qœ~\nφΩ}ώΏ[ ”*n󃳳oζόύ� |ΰήΰ7*‹ŠΛr0KΤ‚ͺ0Τ<’΅f±&ΖΖP@+d§E8«�₯σψGΒ@…f-‘u\ŽυSαΡPkyy*ΥVΠ`ŒΰΰΓ29&mŠΜΧ^€zΩPΦ@ΐI`_„ΓN0gέΆύ Dΰ£ΞemΒ?Q¬PθPπχοσœj΄ŒQ.ΚωcnδrΛx0…#%Š©$γ ›Pད8ΝΒκ”9K}€ύπˆΖ†Τ*Φ˜Ϋ‘v‘`ΟqEf~mΖehDΉ£§‡Ά+έ½χFP ¨›¨knhκ &ϊ9ΰ–4pο£ΘβΫ)ΆšΐΝ€cτΙ£΄΅ΊΩΙΆφΆΤΪΥ ­@cοΜο2^‚Σ”>ΠdŒyΫ»ΦύςλΫ–‘­ilο ϊjY�<θΆ§° –9J£3wŒσΟΏ­�©m§«¨ΈEϜζPόœk€ςŠZŒo4θs©¦χ‹…ƒ�>“ΖΏ81>v‚uΔΐ@‰ίή>NγΜ—^XUSΖ½0I€ŒƒΰˆΑŽh²Ξ‹{ffΓfL:�65Tt’νƒ–™4|^;’+}f¬Ž‘�™ Ω:xΦε—e³B:R–T8Ιυ6ωφ0@:ΰΫΧψ-Ϊo­¨ΖP ¬c(=Ξ,’?Χ`k4₯ƒϊ~)ΉΑbΐ@ž\ιŒκ@rΉ φι,X–³ ΡχλDΫ-Ή΄œ.Σ\WοAg[‡_ I™,αwvφGh…’g&W9v½¬Ι4ϋτ4“h9†Ο?‹Ό™εY%ΠΞ¬μRΣ ]œ³Pƚ‘–fίαxnοΟΩΩz™)ŽA%ήβe8PMάΦΨμδ\ϊ �M2[�Δ“©τυo€RžΩΜbiu!ύ ‰"›ΗΤ;&Μs“c"]uθώC’{©Ά,₯Ψ5D†tμh'}λ™ q�]x™ͺ#C�»œΑϋlΠδ'Εωτ²Dt–]_Οπj†ξ�υΉiœι ƒ“γd/ �s|†γ,‰t χι•ΝΐΨwυηA GΥY›9ε„ΜL¬#σ©εφσιZGŸΌΡ„•L:μ•=φd0δ‘G­°Eq;Ψ3L’€6œ‹SvzLv³”FL8�K™t\ΏΡEZ’Y^skKf`mxΩB]©@Tu3aΛdΚ\Οf&X˜m_ »έΦΤ¬%Αœ\ΐΜ*Ύ΅ιrœg+d³6²²s˜e­-� gLz(€—ρ2  όlΆ½ŽΞD^e;( eΨ wπΘ§₯•8ύωεΘ}XφvρΏΪ ͺΈR αΤΩ>;½vH7³t˜ŸΝΆΙπ8TΈΈΞΙA&κ3‡sΎkΘ2BόίSœπuda‡{Ν9ήIλh–ZYommsΈ‚ƒ_H€AΤvAατ| j nU²Φ:ί�ΩOΝΘσ;υmΰΜεkΧ‚ŽϋπΑ@zΌ‘zέQΚ¦˜:Cΰδt‹y¨ΊO†S7γl/φ_"ŠΰΏ’ζ€wξ|@@ΧLI]ϋ±/η/\J8kKΣ“Œ&Nƒ΅Ν⍴͙=AξΑίp‘+ΐ’]³θBSUœ«<ΑfpTόx”qΞjΠϋέ½2ι*‚%ΠDΩ…χ%MήRZό˜rΒϊ�’^ @h$#}ΐΎωy5ΘΔΘΔHγ,ΐ”±Ιΐ@€πύ9‚α±›·r  §Ξσ=τ£hHϋΘ” y‡₯*Α¦|πΓΗωBzτpε&Ψ#HΊ~ω2e$+ιΝw~ήύθCΦ«5=£?2°HPMΨ#@)’?Κς�zœ_{ DPΝΊkΛNΧιHχϋ�ꂁσε/}9ŸN³°θ‘( mπαΈRχψb;v·•� Λ�NμC¦2³Ί”nί~.-?zό8Ou�·YTQΑ³YXP{fGΘο¬DiΦΚ/ϋaΝΊ`sƘvΑ¦‡%κEΞ·Š½Ό+3Ώ‚½κΩPωΘ­?ΣWα­Qηmπζk<―5€.3S3‘;j FM2hSό=·_φΨ;άDgPŽΈ²˜:»Ιt3Nxx2Υα;Τβ›?«·W ΄μ-QJF·œΟΞ;6ΫKΠ +%tWTwζPzήΪΞΈMt‰χ§¦P< {,H “Cΐ}Η©:{²ω>n.‡ž”½±ΏArG}Mωb`τ.λν½;"y{€«„yšdXB6ςi’™KΒHΫlΥF؏ω؞΅₯ =˜˜¦²CFφsƒFšΗm ”T /eΙ²ΠM gΑν¬ΊI›'˜`Ii¨œŸ*Œ|Ξήηί=Ž> ΌΟχXrQΧܞϊ/\`ͺbzΟ΅ρ3irτ λh,ϋ†žΆaj!ςVΘ(ΙΊϊ.˜˜°3ZΈίβθF€ 2έeμ'Φ3΅·vrΕ€Ψ[0z244ΘΗFρ;Α&ΗZŠΰΪλ/¨”!eG9Ά„²@r‘Cΰ^Κ>ϊ™t CŒˆβ5˜pμ­ώΛΟύ θkΏΈ_μφŽΙdΨΟpέ›`¬Α@ZྜJ$ϊk3μΉΩEτ4 ;@£Hx©ο•kΞr5~H²92>J£ε₯τ•/~1"2Z―]>ΠώΚ ΧX[₯±)Ύλ6Δ³)πu‚ήζ�ψ^φ#b<7�ΰcΓ¦j―=#²†τ‘·3τ'd„`ό™Ι ₯^ μ;ΐ*ll.χW€>†­κhτrΦi~l ν“$,ďhhͺΙτ_ΏϊνΒ†κj+j?‡ΌΏSXτ€2½ί‘\σ^{{χβWΎς•9ό8€�Ω׏γ RΟΎ~ZVΰW_{ντ[ίotyjtdee±ysm­£”PΊšY`�έ¬§;J{ρ�₯τ™ΗΖΥBŸρ4k7άe2Rš€›ΩQΎ ΗΊ£₯Τ“`₯}°ƒL–w ΆυΥθi”R–¦hΖVEfΆ�̍‹N¨ˆ³Ζ:~NfΕ DΓ'­3ς™q'K\ ΥLg:ΨΎ'b(΅XΝX‚Σε—―uΧψ›Ν΄™–κššλ1Ψ-ͺGΡ\Kcc-Ί΅₯ό0²MΞ^ξΒ!ŠΖiέη0ls8Š›uΨd^†Ÿ0z’,σTεΙ‰‘ψŒΦΆN‚jΠ{ο ΕΫ{ρZjικO#ξ₯ΏόΣ•†FGp>iΘ4..―’ΨΗΩΝc=Y7κΤς˘]NΟΕ ”rAA@Ή”z\{Φ»”€Θ%ρΪW�½@]πMό"@…y€Š*¨«Lxΐ· ±vcS+†Ž ά―™I©ΥΣO>0˜βυ5τ$hKM]�"ΑΣ4ŽΫ ŽεΖ�Gƒˆ‘€ƒΜσζ[ŽKˆη₯ƒ aΣ ›§‘Υ)ΩL™Žι!7‹* Ζ™ A:TΏ-: ›•j§γ`πκ>JŎΞμM9ΖL‡€'xπΓΪ_y-)ˆΞ/₯ΐfYRf\sƒμ§€€ΰΜ1@ŠΰΒ6FQGΑM�ΐؚI·ΦN€ίμ™=,ΌŽ !ύ`ThΛ{¬/nCΏΦpzΜFIt ζιηK_΄qdY  EΚύ�Y nƒΪM{|¬ΰ”Œ-’mΩ’?Μθ‚gϋ8π”TpΫά¨ΉQœ Φΐ’’ψζάWλσE� H₯�ΦSΦ²J°NMτρA ΘF†€XgZΠΗ�Y žλ3Ÿx1uP†300ͺΉ^N…cΚlt™#'M–{h€\gy‹ρl°[Ίϋz�ψψdΊσΓΞ‚ϋSΑϋd₯XΓ)U§Kg)Ξ«Ω[άΆ ΨŜqΧμ°BΠ£˜ςΧiΡŸψΤΈ Lκ|š Φ‰Rιθd:ΠIΝmνL2ιΐΩ§γ>‚₯xn“³4^δΜz>+k―‹2€}Φ»h5Α> Λ>@g)4λ>‚ΟJ�»ΝPOLŒEΆΆο\_XN9 λ2>6žήΏϋ~Μ—o“ΣiΨTŽ*Τι΄όd¦}·n<P„#Θή–qώ`‘d–ρβμΏΑ“!_:¦'ά«cΥφΈ/―ŸC)Cvή·rWŠώ¬;FOx6,ύ ΑeMΝδ©s(ΝL[Nα$“3Ες&€JB²bn;Ÿw rΘu  a/˜U΄AΧ)= J­m?&€πχΗyόύΨ{…5rJŒ‹_αΘUδe•,32�Lgυυ΅<{4zδLΪψQ—Λώ Y V rͺlΤrlZ*8¬.ικκŽ κχ½»§']Ί|52Ž6ωsjΜY4Λ ͺΠΟ–ο8‘ε\�ω8[κ>σΤ‹φΪQ JΠ«σwX�t˜U_g $π#τΛ©=ΐ4ψCΚjΜ΄;’e“ ‘ ” ΦCσΏr“fœXΦqο~Ž6Ε½Τ¦Έ)πΕYΘNi0 %8ΓΆ]Ώ}“ΙΝ©RŠ2χ§­υΜοo’υ|Ϋ\q…ΐ=φ‰oٝ‘KΟψ{fe¨4!ΓVιΨΧΎT° *mςOGΝσ—~ξ ‘‘ŸšΎς�K©―›΅₯$€h‰ΐs'|Κ.S?pξ Psι ΒšΨ ΛwΆx‚ ‘ΰ ϋ$X¦Ž³―‰}…6·6Πk€wψ>Ώvσ\_/A 6ϊΎ―·†ύ€sfŸ‹O~βΣLΕhα}£₯œwδ@έzσΖ %€OφΔ³Έ]];sαόyzTt±ž€MθTΩ;ά'2+ Ά6O™# hn¬W6ΰSχX†€b ™Τw°μΟ’υqΠηΡgϊ+κNuΌ₯Œΐ–Hdύ,KAkξ΄EνŒφΖ+m£Š2 @O8§© & e%στyτPh|&̝P¦p‚N?c͏ΉΆB)@-x§žtJ“έε=3–P”³6Ήτβΰ²ρΨ]~ŽŸΝ>}ε™κAϋ°Θ—:ή󇱋$ΒγWη&¬σμi‹}VN™Z²\|fΧ«{μΩ[]q ‡€oyΘτ2dcΌ]^'ψ]§ Μ‡ΛΕ—¬χRΠ‡GβwόΧ΅e Π-‡“Š_UKSΗφ‹©°©“Τφϋ²W†ΆTπIy›ζ³υ+Jd}Ιv°§„λϊ…? `F"%Ώ=l9Λ1gΈ¦Ί>‘σHψ!sμΑk{Ξηoαc>•`_°OύAΛ‚ |.χYφ€Ι&u[–9`ƒn9ΪO†'ΰ}­z_AŸΒs™ 3Ι/`vԍ—Cfe-p–πXŒΨχ<šs‘°‘|ΆΎ‡Σ„‚q€mπϚF§ψέΣs³ijfš³Ϋ’z³XlΞLφΘΒκ<λPΞc―lt{Βω]Η‡ΤΡwͺ@*kŜCn τ"Ι9ΠFβ3σ;§@‰―9V6ΥΝ²= β}&­B™|¬ιΙ©}Ηπ±χ°ωJ ‘›όγ³Ζ†Š‘?υςΏώόWΏπχ~ω?�Ώϊ₯Ώω‹oVη~ΆγβσŸόΥ_ψ…ΏσΦ /Ό4ύ[Ώυ[kτ0`Ǟ}ύΈ�@VΪ\οώΩ}�?^ŒΝΞΧΎvφΫ�ΞΏχgο�ΖoόΪ?₯^쓝-…Η(>GD ύHfršαe2κ΅([Œ0Ν‰ςς ί‘”€‚W€ž:6IE· μα£ΗΠ&χ�›?x'έΏ�ˆ€eLVΕ¦7ΞΣ₯žΏΪ='Φλϊo•ΉŸi—υcŽ’bΛΛΥA‰l4ΚΝ>‚Ϋ2Ppή²b²yθ½ @ ›Ω˜υqfυ ™ˆ-‚a•€A³©ϋνlϟ+’σf―Qθf@5„8ς’4€JΛ¬mͺNΙ„­ ¨UͺΉ(β½wΓ¨σ―TƒρύΜη_εΞNq˜p·™=M€ΣΣ`w3M>Ή›€ m>Ζ�ξΜe,­ωΥiym¬Ο“6 *ψy=]ίy―3ΈΚša9υ¨(j\Œ,MψΘRΟΟΎIπ]Nσšž‡�δ=4Šf‘4πΫdΞ,5Ρ€³Λ<;”r^'½Zƒi‡m©‰ήΧYm-s!Ÿ‘ƒ“z€b³Φ+�RΗ>•;ƒΌ1:'wzz0d=2©Φ7Α8°ιΰ!ΩK ΪΫ:8ΤZS˜ ³sŒ3ΚΘ,δӌΐ±Y2ΞA…΄O3ύ8L380^ΥΧ©$(.ˆΜŽ.Οc₯u”§8™ΝΏ<κγ;ӍΛ7�Ÿ~λΫιύαϋ©Ž{«D– ž₯šK΅/+— b¦ϊ$΅Όπό­–FΗ§Ζπαξ0"‘k»–¬Eζ½�9ΌηJzι•›©½½3½υ½ο€±‘T‹£³AΆ|Yd­9^±ž9dΨt6tΪ Iβ Θ2αήw‘“rΚlΦ)Έχα=ξ:ϊχ rΰιx_§Œϋe}L…9Ε@©Œ,οΧh!λΫΘXRζuΐGΧεΉs·ƒππρž— 6€χ`*±ž²tΆp²ϊ/υγ0Ιθ!pδόΆs6 œΉ­p€χΙΚ7“ύ¬%0[ΑωΤtbΐΒΜLͺΑi^%X4 _Y^’ΑΫEΐ˜(8ΤΦ7qO>`7Νι‡l.»NψΒψxΚEχD€γuΖ94Œ© <ƒΜv³Bލ*DChβσ²αlιψ+ƒA7ƒ&¨·l πΐρΉϋ G©­Ί2 "i¨gθL¦ζžΡ?uθ­`OΩ[Δsf‡~³ŽΉ4Ω”9d r4Ιγ^‹Α*s Ί— Μξ[Ё­ŽxtyG_0J·ΩY4όΞ Ε¦r*qƒOAaŸ£ r†υδ₯Δ΄Qά“MŠΘ.ΦθΪ¨Τ¦qΈΈœ­ztηChΦ‚€L¬«SΖFF�—Ύό‚Έ%ΚsFΩG΄/ϋkιΤ₯Κά>ΰA]s[Ϊ@—iKͺJΙ’ο‘ΏΚ°3Ž;ξD KŒρ(’„¬ΠvΩ­|­l¨ pα ©₯­-Ξ‘—Σ6–θΩ Ν’n]9e~6>ΈͺδΩKΡCŽΛCF('œYšܚICFΣό4c{Ι ;Ι'JH‘”›α ξ˜ΚY(GηνΡΌ�ξ‚LΖο"/§hλ`uΨΒραΡτkΏώΏ€ΏM`ί½σQ:ίΧYήQe}gσΚ ½ηpς©ο�ΑΞΐP›fjOi—Μ!�e5Β™>"ΰ£DΖ@A½z4‚φΞ¦ 6v³ Νσƒ…Ž>/7θ₯ΰΔ Αs}}d@aα0]ΘF—‘‚₯}ηΞq�ι)ΔΏ­±·tcq‰f’”ynΎϋζw9OΜ«―k‰&Ήϊy€@΅φ‘Rξœ{VζΔΫ Χj3ψ~ašyVΐ6Βχ˜΅Q_”£ £Lˆθ»HγΆΏ‚ ’Μg �!Œj,ΦΎŒsγί]7ƒ;νŸΑyΜƒKYQ™%4°a6χ ΩƒΡρτδΙ`S#Zy_aš₯~Ÿf~¨ϋΌ.ωτ³-Ρ“ !E½‘¦se$eEη<{m‘Ύ#]=Ϊ�<μ’Ω_Α”h€Η>ΩT³½ϋVœ™ρα‡Θ$ tUe[_€;€‚ eτω1ά@gžΔXκVŒ?f)βΪέουY97ΈGΟQ>ΰ”œ}€αυΜQzςhΖ|3c=k9Η, zΔ@>NΑ±wˆ‰υΤΐR>λfγOνπ. �έΗ?δ3ΨφE?�₯΅–$ΙJ”S _Λ‹o’ΖŽκƒΝΆΞ}―�,·Ρ/«;ΚUͺι΅dσΙααAτ$ώ̈UF†ξxŸŒԎγJRbbIυ @ {ΨΔv ’Va±,γ[V›¬ΰg–0Έ―%ψ˜[ψκ&§uTG3Ο¬ ³‘₯²!H+ΐ`ΙΩ!{ηHl�­Ÿa ‡rκ—LΑηΩ―μϋ²>Kz-ϋΠHΏ?O€CΰΑ&ΏϋΛ$I#}{οh‹ϊΞυΠ?«…Ζ�&ή\βYKhj>9= (΄›�\θ₯i―#/SzoδA0™lBXJ μ:ΰš‰1|θU†μΫ‹Κ�›`Žrž²“Μ|V&β?α£ n*#ΐK�ή†ζ~Ιά©+ Βήν‘—˜Βvάu�γύλΧ―ώξ§?ϋszσ3_˜εe{ΨM«_sΗ?žύη'c΄ΩΟΎ~ΚVΰϋίνμŸ�ϊ�ΆzΎ―ϋ»;뙁“γƒώžΎήΖκͺͺυρ‘ΑΌυ•5,H½%ϊBC– ΪψΡ=z<~‚ρΞΞu~JΙ6‹ϊξ;oAι‡ŠnYΤ=(½'(t!š%³Πl΅3ν¦nΜ'DO4WE¬ςΦΘE§`؟댊zZ—ͺ‘q·ΓΎžΗc^kp²2lF)š—‰c̞"¨’ΰ5{C³sΣut&`Ύ�Bzs#£i“LK9ΝΏς‹q|yν*†¬‚Dέη―θS³‡CW€‚uϊ‚₯BŒ¨†Sj `ƒ΄Τ@²#Π ‹ΟϊlbΈΚͺ1ΘPΊWΙŒ‘΅x0Δ}π;jυŠp˜ςpœsyΏ΄΅"ζ9Ϋ}ΫΐΙU²ΛrCNI{;Ά€Μ0†H§ΥΪPio;0!\;�g£- έ"@A3kΫΟe)Τs™ΦΧU�ψΘ‘;G8ί‹ιΑΐŒ©Œ„š@«₯ΏλPH…ΤιVΜ.›±;! ά‘ρe>ž ΖF©t<=vΚΖϚ °!Ν~j¦γςΉΧΧ(œ6jp ΰp”ΆΌuS,RNέD©Ώ%ώήΜƒγωμσΛ b6wY`�₯cηΫAηL±«ΊŽb9΁ΐΡ ΅ΜpX·*5―Gά.ίft†ΝN€9ςŠ8KˆŒRίM  “˜“O λfo›‰m†ƒOafΩr…¦†ξ₯ηe3>Ϋ£–»HΉ7λθϋ­«τψacΦΘ@r­Θ^ψ:›aIΑ΅ ΈŒοMπΑl¦Ž°5•:•Φ?ΊΈ*ρ¬εΤ_ΫqωξGS αhόΥRΖ³Λ9Ωζ»‚@v›�–šΖΚtγΦEΊ!_N˜~ψΓ4c¦YαSxΆbbCΜMg-ƒl8uξΪ₯Τν|σ#Siκξ Ll‚‘-Ζ|2no gΛuΡΉ-`pεγœ™=΅ζUGΞ3kV½z΄―3`�«g]Yjkiά &ΰ’~°:2τœ3χΗςŸΩgu”έ Αˆ΅ ‘υδμ.@‘/C†*kaO1Ω`ηd–DsjΕњ#ΐΤΙkΰί«œέdΓΟ(°„;έ“ό±ώojngZ6c‘’'Δ:ŽšΜ‚VΚκυΌχ£cœχp.‘ασ~3Ω­°2Ί{»#Σ:3= pH`@ Ε>}&ς±¦œ8 Wf ~ͺ>-ŒδέΖR<Τ ²gYΊ9ΒΛΪ±/θEeޏlœ¦@@Œδuo‡¬‡`½μA`OB>ί:ϋ\Bz;¨«³]»ύ"ΞΧ]#h4ΐ?EζΤω2tˆyN€5φλ€Œ΄Nξ. —·p`tΖkνArF†«[Μ�₯.Tχι°  Jλχ κˆΚό±9ž¬!υώ!Ÿ]N†ΏWn0mλDΏqώ]iπRag @‡‡OJ·πžžσ貦;mν1₯d’ύr\f€„zΧ^3φσπΎΜdξ±Φqpφvjq€ ζŠH2Oh4šKί;Uœ€_ΐςΘγχΥ-NΉ€",dΌ�Ξ;°ΓζBίϋY‡€ϋœ=5Σ₯"fΪ‚oΠ-­,F·y)ΧfGΗ9C«”›kθlδΔΰuQ°cs φ¬OΞœ3ˆπ,ΘBZ]Z†ΑG)N½`Œ΅ΧΚ‘Ίy›υΎKΉΛݏ`Ÿœ€Iz5Ψψχήΐ½θ‘ΣSͺ·³'&؏d–LŸu‚Eug) ΗպϘUb3¬¬ λfPc9ηΞS�ή•Auσκυl£Bt–ceŸq΄`Πd’ŒR«—iΈ(XOIOίω‹Ρ,²Œυ(2³k&?μηmPΘρ‰μαS03Ν,EšΖξπ•”:ΩθνF€a-C†] `Ι3(γκ’|žύ”5 @ »₯ž± "°kP«LbG=‹ΦΒ ΊLΙ^@ΥΔ· άδƒL4ΟμZ υά‡�EΎxΨRφη˜Ο;=ΝΕ‡ΈDVΈ‹Ζ¦”tπά6}επŠYWiίΪsYΪ2ξ΄«·9ΨΠΕΠσ %τ¦‘ά“=Χηi€Χ„Œ)υΥκ* >„™βλOaXFΊB0ύYΣΤ�$ΑhB2q‚I΄ΐmσIŸ¦¦6Κ΅΄[QΎq€μ�Χκ”ηrΆιίν0{g7ΓyPΈ²·‚gΜ3LΕ«+Θy皬£ϋ₯?f ώθ! ³cό‰“„Α˜2Έ£.xAΖΤL­ŽψPȐ`—AŒΏΧY΄9‘gΓ΅,#@³Y›!Λ]ζ‘ϋ©ι)ξ‰ͺKδn†,γΘΰ“4τh?.Ο8λ F6Θτ~ΓI!ΐ η„ϋ4Pn½=i–Κ™Y*ωeFCVͺπ:ςdS6K9|ŸΩΤ  Ί ¬Ή›h›‹YšΟ5Τ CNž ³2ŸσφwΎƒ3 =ω9c2KΜBw―ωX;bΛΩ£&7¬›”M(BKE ―‚~fύj‘Sέζ±Ρ1>›,|eΚηQΗtΆwD¦�ζkθΛzz{\Q?˜ιΦω­‡pŠΌT‘Α»qγfzεφ‹α$ ~ψŒ€6δΙYΦ¬+χ(VΝ€»‘Άž€³› Ναr€:6˜joi§gAk”ZΉήΥ5 qξΚΠ!‹Ff‡P!Y*5ηmžR‘oχ[ΠjΙ€•VρώŽ”™¦ϋ=ϊΔΐPpA½gΖΚ¬΄Œ“MKΜj–’_d=ΩωZͺΊ΄\ςB>OJ°tcΛ5 ά{³AΡ€ έ㗁€ϋ-θd !pΑ₯Xiτ©ΐMΝηό±NŽˆuRŒM;—ΠΏ (!°&γμ™ ZήX—.ίΊŽSΎ‘VΡ99:Υg§²ΟBƒ«`}¬Σνc£Μ*Όf±Ό³ZN ]“λ9«cέ9COΑ53ϊ•H‚7 –)œ§A€ΐxΠ΅-—R·ο’‡œEοη¨3;θAqˆμ{&3=τ~;UΖFΆΗμkzHPdΣΏS‚β\SχΎ₯£‡`ˆΡŽΤ‡Ϋ$XΫSMk2�I_Έk%ψ¨ΨΔ™ƒaφΏΨ`’'UlΑΈ³£ω χζΉτTΖΦΙΐΦ0νγ AΆuΙS“Σd§'ΠA³œ΅‚—3ΦΣ>ϋœtΟ‡φΠc�l«sΤoώL9ΝG�}υ«_DιJςΥEθ‹‚^zρ]„ΝYOƒ3“°˜ΤYμ9L’‚ΩGƒΦJ―Qβ0Γyc9£2%v³ "’χ ²©m>d1:"`7«nΤΐ³Δuο?€Ο ΐΨFΘφΑή σ+―Ό‚ά�΄—5΄δ`ΝΧ°‡ °rΜ {ζΗ'†©υίC§PHζhMΟz1ύXvaͺ ΟΘδ’νD0Ν"ĈHξQ[― qk!ϋ5vοwΝd HΘφ±Δ@rŸJ»ο³άρWΞΰYαUτ¦ΰ„zΥμσŸ+›ΔύWgeΨΩD†A}T,%�ώ­b3μΧ`ώm@gί ²ΟŠeaκw™φbΘ§μ%Opέ罚eφΈXΦb \ @F k`_…–σwn˜Μ8Μ1yGι9I†ƒΓ�ρ{Β1£/Ž|s]ΟΏ:v†άz°s�Π�Ε=l§ω™)t2rYdΦΗΰά$B-%n”7Ί8²Ξ·™JƒΪΰšτu°Dμζ9ιΑ=Ψ6ΰt³%T&•<ώΐόΕΟ«Δ/ͺ₯ׁΰ…`‘S)ΦΡ)+™֝FΙ”PΩπ1cλxΟ2ΐ‰2ϊ,9 rώ +0ΫVI¬*°–§dΏν£s†Ρq$γ!kX QΈ·‡Ξ1ΩdCdνΚ"ϋσxh$l²lΑUΛ/ΨέGΑ‘Π£€dž;ο[f“ϊY90Ϋξ΄u˜ύ ” °Y<χΪiϟ>ŒφW6Yc΅‰e€\…Π ZθG�ΫΣΝΟθ[Βο Κ½Άkζ— ?ΓW–lZbΠΡήΐΉ:@�ϋp ¨d’SΐΆΩΣ£(zπ4Φ7β«oaΏΧθ—„ΏΒΟυmlτ¬N�ώ •ω9ξŸϊ2�‡=d΅Ή£%Yl?2@Ι„ΟΚύ:ΆΌ †nψ€|Ά#n;ΊZaν5 »ώhaλΏyυ*ώρΧ3ΠΰιJόδώ©ΆyφυSΌUbΈ³ΜΟίω°₯εω=‚£Ώρλ�cΓΜτΜ/¬Μά-<>hEGC9œ%ˆnOΧn^A遢cΰφ@Fί{οtχΞ²G4<#H̐Qr‘†hÝΥήQ:”κ:™ K₯)�i©Γ"ςλο ˆa£‚Άœ†[ΓŽΜΗ NΤsƒΰ8,P›ί0eE'Zl) lPx:�/U―Ž» …Ω‡p4 iz£'6ρ›ΒāΙ7[nν₯†Ρ 1}‘  ]ΘUΌ₯ΤΜjh Θ(;»vnn&²{#\Cη2κ?qΨΚ1hΞIŸ#+zBGΰ32y<+Œ9P\�G­*θΡfD}FΗ΄ fHΛ–jΉ±LΓ(Φ«0ζŸB‡τϊ+8!‚0=H„έύ—#PΌχΡ»άυξEixt D»#zœή}ύΙАQ¦�Φ=:εVpvφTCS€mF1‹ΧZKŠCΓήš°ξΦ0Jγ$(eέό]> A”s`ψΞ"pΰ9pxΜ‹ΆοΝΊ¨ο°Ό1OPBΠ—uΕ0e'rδ€^ζ„ UγX˜%2xv’‘ ‘CVMΦ<œrδ¬c\Oc&žΫΊξR(«:΅²άg³¬U”Ν Κ‹ς&`²*``ΧκlέͺuΚτ±Lpι˜υT�5Ιχ3‚ί 2θ–Tœ@ε-Θ$NΩQψ*j†‡&ΨSΊ¦··Β"yΔΎ†£\‚+λήύ†MΘΘλο“Ϊ€!’#ϊjpƝBb­uΖG8™fF5Ψώ)γ9±Gv}" †ƒ§nfΐ>":A€ώ9§Ό‡*(œ›ΆξΆΤB‡κE:sΧ’”zόd0ν-ΰX°#Ώ58Ϋ,9”ZχΤ:Fξ₯�Ϋ‘~ &Ε)ϋo}iΗ.AdMCsj$ΓqrHcG€1\5φ Ά ²%`p+…«°8^8ΛυυdΏyο&ύJŠθ£Μ-2λ7π΅Κ·4Ι]²ϋޏTI§b˜m5#ζ3Π{Ÿ;ώζB ΩΩ:έR€/\:OPΐ‚Xš˜KοΌρkκs©-·DA`IL#μ\2(,#λJvΠ§ΉΎ…½ΪFL ηωiŒ=•½΄²@9Ω²kXΉ±ξήε|Υ€ΦΝ–TtDBδnq‘2φ�ͺΌ–ΰΡw ΞπXφ)…9CHωg bK¨s7ΛyH@% �SΞσ J †d0Ψ™]Š―ϊ!‘ͺ€₯'όŽ@W ˜s�*f–ΜR ΄\ΘΞϊ5–Ηφ‰Ω(ξ‡ΧΆ΅uΡ΅Ό΅ƒ’›ΙΆ8Y‘»y‹1zΟs3Ζ6α v₯oώΡ{ ΟΆ z ηC¦˜rv|’!υw‡LP’uΐd¬X=/~ϊεΈοGχSy.ΣΠ/ŽΠΫ"p]¦ΓΊS‡jfμ‰Τ�ޜn>w“Ύ>~ A€Βψδ8�…Ό"OKΨGeΧuoomM£― Λ4]dMφΡΗ–Žb«DR΄ύž#{ύ¨―vaΟ™Ό8TŸa7ν΅“Ο3ΩΟ%+“ΔΚ†€@/Œφή’H.zήμ³:J]λ—ύ²‰ Κ||~^ΈAΠj YYφΑϋ8νΩ„ΚΏY†@&ΦζΣθΠTwΨwθ ›λ¦2Φn_ ~ vΦsΎϋ)PΚ”’•¦ ikw±;fΟ ΠύUM–ξΤ€ύ)¦[‘`Ψ@�Λi₯\€™υ.’<³v'ΆΪ„Š―ϊbvv:ϊF˜ε~Τ @ξβ3•–zOOަΡαΤM9£¬―υM2χΘ°Τ{ο+'ΰVΠέσG†–°už7€Κž&š`V «6>uΜ ²R„.RqσύΉSΞ†@’ώΨΖΤ82\„�8ζ,ڈ³0·Ί‘€e> >€νˆ]w\t,I¬YΩ σSξ#$d «Θ°ΧϋŒŒυ5ΗειΠσφΰκξμFoο¨Q6 x¦‰gt‘₯¨mΜΰ­μ;₯“Ι5ΨO~Έ†}±Ο•LkόmΜ[ˆ*KM`@ίΜrŸΛΰΪλیΪρŠ‘½Η�ΨαμΤ6Šyž‘·ΠˈΦΊ@ΫκνΘͺ΄Σ);ϊ‘φπ³κ820Ω|ˆΊ444˜zO™0A .KΖ·[bΕ-D£CuƒΐΥΤ £@ΡIνŒ9ά^έHcΓ³Ψ}aG‰’“8Gʞπ™>”ΊΡDœ‹μKGf—¨λQΚμ9γήe+\ο\UŸ’CJ4ΚuD*kOͺͺ*ξWT½χσ?οiaž}ύ΄¬@VSώ΄<ν³ηό?]Β³όυH€π_όζοl}p�ƒΧήݘϋδϊκRAŒΟΒ1Ά³z‰τI”ŠNυδΔ΄Λ'8jΠ4Οͺƒa°G0N-m HD1ͺ%5ΌfΛνΖ΄( Έ™B Ύ_"π’ν~i°Νϋ: Ό ZGWΕν— €ω BПΜ@&(βϊf‘ΝT`ωΉ:ΎN£dί�mV›†<ϋ9ΤPs=₯6(ͺ#›UAΰσ_ψY2Kalάτό‹ŸN/}ςΥ43CΖ$ά2 —�¦ —―γΠ>NŽ [#γε³ε`@ b\%Ο:k΄o“2Š NΡ"΄;ιx"ν6ΜR©kus upOpžχwΘκ’Δw ΜYV‚ΔπšέφΥλdsζatΜΟ/±γΠΙ�`E ΠΦ(ΓΠΩ?ΐι²AΪι0ajΤΚ^Ώρ†šLΞ[Ο'•ΣlŸτGg€›αΟ§]Xοκ|iœ‚aρe~3{6s+ΧΙ’mCuΆŸ…°Λͺ W–ž˜’ΞΓqtοΜ ™6θ“bjXΔΪ[ƒ* 5f8γ\\8ZŸ‹ϋ#3Nm�cΥΜώh8 pΰ δ5Ζ2>κω¬]‚A³Έf ΛΘϊΗ‚fƒεΓυ ŠΰΔ „kͺxςηω0 YΚ½HEΖ@4ΓΙk¬Υ]'6€5[cφa…}εQ(2ΔύS[‰\F‘YΙ`ό‘₯704OM(Ξ] gΛ8”O{ Ψ…Ϋ R‘Φ°λ΄*«‚!ΚFφΌΉΗIΡΩ°ž�3 PcσΏΘ<±0�ŠχY;{”SξΠ `Ρμ|Ί�Ξ»izhj5υ‰¬£u΅:ξΛΛL@AcνXOμΞ‚ΤξήώήΤέN7Α­«`ε¬ΰqΘ9[šΆ†§Žγ©LςΦ&Ζk!hhΞϋ”½RlpΆΝΌθLΊΖx2<²#a:¬BεyxI˜ ‹‹Pη"€@X&(,λθhGΦ-žΩž�U«mjYοΌύvψα6+©™nŒ€fK'W]Δ°>Ϋ,Ό»ΩΩΩΘΈ”ΰ8­,0Ω€σbiΚ ‹•Ω<{W³ή:b―Ός‰Θ ΅΅΅Η:ΝB7 Άc·μ3δ³8ΛΣd¦ 8‹m›!: A'’Ϋt΅A+ΟWA€U‰,˜TT’‘�"π:@/"Ό™χxmu χbΧϋm©τΘσ.κ|Ζυ2ΞΊ},XΓ]Ξ―vήSΞ]Ύœ�ίΌ“@0‘Ή½2Š�τΡΓϋΐœΰcτksW'γ ΙΓς‘νΤ°Ϊ\Ο¨ΟαVτ6Ο‘˜ζBSΙfdY�ΟΛŽ΅ϊΫο�g6kΉ7«ζ&•ςg.¬�ζŽ�ΉΘ‚URŽδυ₯Μϋ9,ΐ֐!¦£«³_cγ/TBjkπd²©N�€Ω+KKF‹¬²ΏΚφκ°W‰,‰`°&;ξSg§G–ΟΨζφͺiτ[ ƒHfTχυ+Yzl}m½|9�YτhΪΖηΨhΞ†˜»œc6A“  £/ϊϋ/Δyϊπƒχ±³œ³Ld€Ν€›Eu]ԁ‚^gžyΩ9Nί°ΙcgΑO³―f5]Ώ  ν³ž‘υα9‹YΟ εuJ–ΊD½‘�h@Žθ²?;A·u‹52Ά0€ Ί‹‘ ιΫ§|Ά>Ώε#–upyώΜ^#+d^y•±  wρsΡ»fE_|ρ6ύh|!ϊ{Τc‡hXZž6Έ²AoWGGŒ–4S²‰μXΒ"‹Η3] θεσΫ|QΕ7Bί… ΟΐY ο‰~GdŠν―άΉFκƒΈ %>ͺ²7²₯’¬ Κk©―υ\7ί'#L;[κzX*"L!#f^ ξ}m¨*pγ{ύΣΧθ©(Kό—@“1Ά”½ψΓ<„f₯'θλ$—  φ/ˆ^ μ‘`+ŒœdϋH¨―Πΰ~όΜ:€t`°"‘…,ˆ.dx C^]ξ΄(Ξ“gχ٘w yίAφΦ ¨ΛΔRΗπ l9²ΝΩΰ³€Ρς ™’–?ωΉφj‰l<7"#GΣbΣJΗPΫ]ί±Ι&$ςIžπQμ³2*³Œ² Ψ–N‘ρ[φ]²Y$(‰ξV?Ιμ‹΅ζN΄m�·²δT)ώ�Ή%N*£4³ΫΌΔΎ;ζο€G¦D ΰ₯›Ϊ'@ bX);L›ΪίΟψ>—Ω|Ÿa€P½PΙυΐ]£ΗՁσ`’gΤ1΅κcΩ&'Έ |GΪ’rύΓdΨχ_ΐΐζ£ϊŠϊ&\Χέs©\»n%μ3 ͺ"‘­TFLL©»y―λα/M2y]ύ’ξOτyΧΞWŽ–Ψ!οΗεˆuΪ˜/"1ΠΫΫΕwwκh#»ίΡ °@9 °ŒGmžχ.˜P‡m’‰§νvοgζHς1ρΛ’”|e‹KΗ~X6μΘX_§i1ωeVd}Œ#tΆI&ΧΘT qΰW1ΐ©¬ΝŽNόšŠΒƒξή��κoώβΏϋŸνώ?�αU‘Δg_?U+ΰ©φυlώ+πΪk�ΝΑοΌq�Ώό^ΡΔπτ'ςrKsTς-mΠ†ϋΟδ₯' Ίγ8’eΠr #%rf~ … J‰‘W±9ΊN&Ώ“ :;A“QnQsŽΣΤ©ό ΄³Œ]u»P6k¬±σߍΠf ήΜώ˜ΠA2Ϋε½§(A38Η:ΎΌΟo^Ν—”m4Œ`A-Nͺ΄- ί#EΪZΘ:¨μ‚]8΍…μθœI23� Ϊ ϊ€3=ˆϋ”2ͺ_Εΰ­σ§χYΘ:Yί†7a‚I½¦ΩŠ5€ƒ#,ƒ΅ΑmΆΡ&OUu (βlgc’֍`Tš¨#™,§0Koΐ+P C²{ΑfafΩKΙϊ\iΘ]s»;ΟΖEH“Ιάa¦τΤΜ\Τ»nς]=ύΌ�8 4Ψαί¬“ŽakcνΈ]ΘmΔ£Q1(πήN1Z{ž�«Χe#²vϋ&ΞΣ–A°œupœl3/ΦPBΐ g\gXΆ›Γ� Κ­ιΝΦΩ΅·Ά€h“i%ΰ±ΤZZf�’Ω‡†Θw§R¬¦Ζ <`_:ZΥόΜ뛝Φ0<ΘXͺ¨A΅¦P™|Z‘t$δ€λ*wg�Wu’ΝFλθœπΌω8(G\§ͺΐ‹½wo-ΡαP&}υ¦#γO7~hP]§e…r%ΦΞ¦Fƒdψ'&G"Σg ©δˆ �ΖΈ› 1‹f·rΏt6”qΛ ΐό ρKΦΊϋφX‹mΆΒl‘Qt@L2΄KPZX�Σέ°1wώκ­Tΐ™¬ p²�ΦΛΪ‘^ΰaΟ4ϋb“I;f—p>¬νΆkσ«ŸϋΰΚtχΓχΣ<Γθι°έtjtΗjt5Ό³²2KζΨ ΝΟΣΉΫΗ©·ΌΔIR νπΉW?ωuΩ'œυE!²ΙφιΩγ–’id=€K›QΌύβ‹©§§8Ξ%₯ υυα8dUEεiπΓϋι£·ίD¨4hŽΰξ€=’ΉΡ�ΡΝ½¦y@>kύΝΒιΊ�J<€AFΜlΗ™΅Ή_9SwwW,��σdO�ByΠ±΄Œ¦‘†€ΦΨ;Β�&€›8θ–MΩέ Iφ‰Ϋη# T©c2ϊ¨™ΐάΏ+—9Θ© λ6§ΨR^KΠΓ} *Ψb“`4EuN?ώk8θfUuή]Ώ<Χ;:Ί|Ύυς?χ₯―₯~>•ΓΒθb Ηg§�ΐ_„ ±#ιˆΧΟΜ\Ίt&V;g΅‚†dΓ4‡}˜ζ ~ }υŒOγ³`ω埞eΖγqN uσ-•6œSœer›» Έύ[?� Ό†Nιθ²Κjτ;2gΖΫoΧG]+€©~+@―ΜΙͺ!’’9¨ΝΞθQΓον± ΘjφΝ ΕΖ…OK^²,²μ'œ° π“©.‘NϊζK/3ͺ�>@ΎZϊT4PΎQΣΕΖ�M€'E€Γ>έ†,tΗλ½M f·{’m‘Α’Ό�―¬„œ:₯ΒζŠξcKk:g†\~Κ„ŽIj»'«§ BΑΎϊήQ>όσ ]n°€ιX@IDATξˆ6™X– ²|Œ6»ΐkΞΚ©=Z2ά_>θ…Kύx0"ΦφΣ?χ™TMΏΜΦ\zXΜ₯ρZ gΕώ€"ΐ|Ά,2e]ι�Ճʝλ'CD9 f gΉ”g>FG@]Όt1μ•½~mςgΏ '&δrΚ O[ͺ± Π.p°Ν>EƒXΦΧ ZΆΟAβ}²Ξ3άγ>λ"@°ΘTπ^„¦ΨTϚχ"bΉ™²�―‘n7[λΏΝΠ«7=Kgμ³Iްa<£_Κ(Π2£�E"Θ!#όά@ήΧ1+�¨Œζl©Ύ.–ΐk` (s,ί±κΪ_hTA˜mτ½« Ÿ�!WŽk«ίƒe€όΫ$Ο5ΧfΙ0©β,ΘHΚ8Ψg‚Σ&Ύό„xƒz}ο1³‘=ˆ2AφGΆ•w’Ϊ Ιώ@φ ŒεΠwrmφ’+Ί ¨γFM‚Ύ[₯έΞΓ†8Eb›ΟVoeξΨX”ύ«¦μΘϋ *!ϋμϋ‚A ΰYΈς>³v2�Ε Υψ:ΘΑΜμΐ;M%ς8ΣN2ilξˆklοl„έΔXÎZr3:4Νώ|6ϯ́΅-J½4€Nυςσ,{°Tr~i%φU ΥNχΙ/ί/ϋIyΡ‡{δή\K d#θ뀫§,iQ”�| D)λω¬gί₯± D¦‡ΧTwωom΅% ΪXύ Α.εΒΟfEψ™¬9‹μ₯ο° K‡Mš'π_^£y*> Y}�YH#pυ ΧMπLήB~=ϊ2›Ξ¨CžΏ�ο"γh9Aip ]ƒ¬X’ (ύΈ‡)yŸώdχ!'hYEŸ Ο†½'ΕDMM `Z ϊ1'χx£·―ϋWώ‹Ώχw�»ζζΎ•ί#ιΘΗ<ϋϊ)[gΐΑOΩ†�ί}άΧ^ϋϊαοόφ?ύα›o|–zΑ–3²Θ:€š½σƒ·ι΄Λ4j‘>ŠΡP£ΤnΪ96τwŸZΐSΠe5Š€€ΖDj †X*˜AόSpΐ?U°*e�ž₯νβhc¨ dUœj<Ώγˆ#*;ώηaνH-ΝΠ¦„1>γFi©μ¬lΣ9΅ϋ>₯Ω/3•f9₯SZ~Œr–>liΒ�άϘLqͺ»BWq–'θP/8’S11‡Ϊ*£ †:Nοe{{-θe·_ωTjύίΩ{ΣKΣλΎοΉ΅ήΪχ}ιͺ�κ½{fznCJ#š’eI):@ FŽ#(‰₯@±œΨNdDd³ $A+6βN ;’2μ₯2Ι’Cr–žžήkίχ½ξ­{kΛοwήι0‰ιH‚Ύ™u‡Ε�εήχ}ήg9Λ�όΟ9Γ#yΧh� Θ‘§¦'@Σ7’Pΰ!Ξ•ˆs}3Ξ. ‹¨ϊΐp*ž  ‹•’eΨΩΒΆΞKoί ΦNι:ϊΚ—ϋ½fbL*s[ε΅½θΏ4B�ψN"Πa177ΙάζσPΪ€#Ϊ'{cc+MΟΟ²†V‹·v€B�20ζ ϋpΊiGF€±šuuξΜρ4ΧSδ\ͺ^gp jΰ.τAΜ8 `"W\ΏvŠΒ>eνͺ0ͺu„Μ»ΤΨ¨@ιΦAιμpνΝέ@j"šg₯ν-£=Ώ Μ—·&\T‚ΗaoΒ‘=c�(�ŸPdi„άύ…ω™`CΤα�‡φnD›3Œ΅6�Έ@ΔM#XΠB₯/ς�‘hΑ°Œ‚(»§‡qωŒrw™»« Ÿ;†’Ά₯œ”Š@ž2Η:Ν³σ‹δaβμ²θοbhΩΦΛsΆ Τ8o  ζο?₯{EϋWŠ» Œ/χΉω•ζέ:6\ΗζάcIΛβ98b*Γ)ι•<2'²‚ž:_}©g¨—ρqͺ�·€9Ώ…‡`bγΠψζγŒη΅ –FNλŽ*Ο+I΄Οτ}μ«—q”Ιόή½hwvZζηΦ�€X5Ζm¬†Sr{MM:`œe"rφqΟA―¨dΏ':Iœ<βΉ8Έ‡μ‘F�‚>NΤ�*ώΦB™ŸŠg7’-•Σϊ!9œΡΌ-I5ς0ΞχqΪVΧ–±\₯s� ƒF'ϋ«_ωέτήΧΏ–&Ύσ9ηtCιtV1œ8γ›VQ?‡²mα?#`Ν8Σνδ�Φz6ψ-/,³· Ωs»8€{Πv9ήhtt4ΝTεN `™EVζ·Εiް…,–νqΖ4"ΚΩώpeqž4jεϊ3Yμƒ�Ϋ;Τ’^|εNΊσβ->_ΟΎ|Δ(Υ™1Ψ"“�ύQ9e­ΞŒzG;-Ξ‹lDtε“{Ί c½—lί&ŠZŸ#d7rCgΆΘί*μ§M"`—†)ΌWŒωΔΜG&e5Μ7Ÿœ™Iίϊϊο§w`©ΜLN±‡Ω«μ;#σξYK_ΩΏYUoAm#Ώ·ϋC8Ψq₯ωΒb¬ΥΉRzν―πσyzόθ!Nδ ςfPGpDJ?—bTια½tqAώ°o‹t Ω#5ΐN(νΘ§mz{Δ“ #`ΒόͺG¬‘³5 Lύ8ΤdΞj8ΧηŠxaag‰ εάlδΏLΑG;μU?$Wύœ΄‹χΪeΝ5θNQ¦y žhyˆA£2j 7ς!š/²4^Pyλˆ sm�&0€±±Ξ“†οά"κιΪο3gΆiλa]€αYίͺή�©}œKx~ہ’XΝΊž¨a5Ρ!s¨]wϋG+,Ύχy­Ϋ“Θό]π{£Ξ) ~‚¦/^―:ύ~Fc[κc(Wž'’|VCΑϚ.sNd@fΖ㎜}ž­’I—ξ.κmΑΘ"΅Γ7VsΖMΩp.tΊ<'ΦR0 X)€ε7 bT#αfΓΉΚδI_Ψ‘ΪΡ”^ύΤ+鳟ωLκ£²ϋ½ο}/mCηΆ BŸ9Αa΅†„©,‰€_`8ρ|ΥQά΄κ”υΒθθfŽ+μάΤΣT‡W„"}�­w(j΅O$ψ(Šp剬α|ΰ$­>`μQdΛ=ΞάκtXLΣS'ΔύmΤΨΦ}g/L-ΞΗ<Ο ψ‚q¦9ˆγkkˆ3,›d‹ _‘‘X?χ�ν;wΨ i™δ9½G!ΔΥ‰§8¦Jγ|V±u5¦μP XvŒΓh]%¦šhdΞΟ/αΰΠq5Θr˜kH»Zb υΫH§ςΚ9σ™dhθ=”³ΤΕzξ¬l]ΝΈΫg yΔ% Λ₯‰gAΧ7ΝAΦ€ττJφεΗ?σJϊٟϋιtύφUφkΉκΣΜ—Ž6Ζ2ΧbκpˆMSΒIωΘK1ϊδϊ;qš4ΚΚ0fέ;€.p†t,Ξb―’sΟΏF¦,ΦχΑ½{8œλ΄7mHKtw±KŽHΞί2σ©γy}όυ:ξ§…‰Ιˆ”εα4Pέγˆ��,ϊΑΛy$φ₯S₯ΩhΨΚΠA?0„Ž£·ηUPP0=1ΕΩΕQgΌ=DοkΑ‹_ΞΜLΕsmγxaΤP�ΰ,4S¬λˆk7B1 ΩE&ηFœSYΜΕΆeίΗΌs杝cKS!LΉrm»‘υ΅Λ:ΛR§myΩΦΡŽK ¬)6¦©X`ΣΟ—qŒ4¬ΌΦzͺΎ,Ε”Œ]½ι0E"ι­Μη»μΙ‰'O#ϊ|ˆd— ‹z=χΈ οk§ε¬_Κ'ε^5ι~ξ‘*XD‚θ]|Μί:c<Œtν›[qŒ8CΆςόS?ύyΞP  z&R”σž΅SΑI)d—ϊ€Š³fΧ„"gΨΪu,³7€πglΣ;JyŸŽŽΰͺλk JΗΟΈM[²πεζκ&2{#ŠΨΩς±ΐΩ]LX[_ Gζ{ίϊl•χΣΘΘ•˜ke[υQΪθR4??ηr°‡–TjΚΚP7›vΰ ψ›Ύζœ[ΔΆzΑ8ΰL8&™€ž+Χ�tΣeώZ?F0LκsΈ”1¦ε‘γ\ρ˜ρ¬Qη€=l„Ω36ˆι\Π�+q•υξpυΊ�@…Œ΅θόΔΩΠ;΅$+€qΉ�±Άώ±©΅sœΣˆ `oυΑκnk=θlkϋοoίΎρ[―ΏρϊoύΒ—ών―ΆI+ΎxύHΟΐpπ#½ό��oνƒ�γkoΟηΞ‹ί~χw�――nŽθT1€¬ |Lq Σcιfaq§@ΣRη5όΏό›9ψ�fC#΄Γ 0§e©πφύ€ έ#͟5VTΔ~ι gT/-BXδXΰ!θόMƒ_ƒ@…ΕόPθϋDΟ#:‚2ρΎFr-0ur_cΤƒΰˆ~οΦΰcU"^Π‘ΜPύV—f!hλΦ7Q0 Ρ)ψ₯ω7CE•Ζ§SΪͺCˆy�ώύτή{ο†Q359CΗƒ X€&μΰΌ[«ΐόΦF’Ξ­m1'·‡Πσ4Θƒ£ΰ?ηYNPΤ%cΖƒ5όœ”^σώM±¨� ΑΑ;GQj$ΪΒΗώΘ*_)}E"lŸN‘Q’DYUάU(†ξξώ4:v•HxV9ΧͺδFXJ(±ΘK…–mΔοwΎγ6opŸΩ ’΅*ΆX«αE%»ΔΛ F­ΓXb=­zœΓY²•žsλd1AιΙζζΉΐβqνΜyGΗ²‚ζπΧS$ ZŸ˜ž£NTΗΕ}.coΐ80]E#Ζ57w�ΤσΧ[;aKτwˆ…#¦¨Γ%uZΓΖ”ŒppΈk(iΖ€ΰϊ[ΙΚάκRλ+ψw£@ξ»='ύΓ[ƒc›φjŒO:bG\ΆΰͺƒωΠUXφ†©0ζE›Vaq*a ˜(xΙΏŽΓHΆQφΜhaoG—˜μΰT₯s"-=Π’}gηhϊ?ωFΊ}ϋ:E ΣΧχχ�κτTκ‚ΥbκH% }¨’ΣΣO16Œ^Ω-–œΉ•5zΟSΡZ–lƒ:Œ�:’’-PQ{{Ϊ1"zΣμ“™τδέ‡Λ8‘*D‘ˆ‚:?Υ€oFΦpRU8D™ι{a΄`ϊ:Χ55πR0ΎrΘ‹¨¬CF)¨βmο„‘ΑΌξ‘ŠΡΞJΫ–ήΜVHWΖ�°O3ηΖβ—]žc•[Υg΅Έg84yŒδ*ζΧ|ύΜp«Δ0ΖΉ:,uW'Μ†ωπ‘ZΔώ�yΥΰt?Y‘]yβΉtΟy~έ«}DβάΏ£:œI7―Χί?€L" ‡Αmq±I|λ­t‚γΗΖΈ­R~@θωie>?�3Šb³6Εh›YNSSsΎ5œ;@ηQˆQπ­ y‘0Ρ 7FGyδΛ³"mΩ=eΪ‹rIƒΥητ}‚6Κ`[2q©D^ρςάlE4blυύzζί½Λq&Β°α³[9=.„-5Y…θ�γεϊ8/Ž#[w™Ξ Γώˆώ‹ΣF4γQΎW#Γ­ΓRĈΟΧΑ@ΐR ΰ<”£ΰ¬ΞϊQιmSjΠ:ξώΞ₯|LsΧ @}Άλ‡‘sΑ δί.2Œ†#jεvTS8ΠΆ<[Zš£γΘ>Kη)Cδ~„ίΟ§gŸ +ΆΩ'«€8Φ€‘5c8Ε�Ψ:ZA:₯Šζ7!|rο>K:ίτcnŽ.:A&ZGε°S½Η�bM” ΧΙωvޜΣ³t,+ΨwVR728L:Œ d¦@‰ΒužSΉROlWϊ±W_ ΐrnn)b²DL°.Œ“§τήκdΧK֝Qo‹* Œθ­}ξθ†ΓΝx,˜gύ)†g‹#˜ΟxΠ·>†…d]Σ%Ξd2²‰³ΈGDz )•|yΝ{Ψ“tuόzPΡ ­e°DΗ#~o-‹θζΰ>Εω<βY]GOƒ΅\HΧͺ…’u€DXœΥBΊq�„ΞΌgD]―ΎΡVπT0e˜σZ�τ\ewπΛΘλΆ―οέήFΧ3gU|2-Z(ε›Εαωv˜»uΩHή¬A_Šh§,ΈΧœG净ƒΐ΅λ9Ž£,Α+?Ÿ‰ωŒpν}o–jaρg@zξ72:Œ§@p0S3€εξ0¨UΤι•�k« œ/ΐ―N@aφημ’€Ρ=φa}mM‘:νX|ΦΊ ¦όXSΰ€ ŽN₯ELΧX';¬�ΘTΨΔ‘ΎM‰ω;΄²έ«‰½βAΎTlΥ¬38αΝΠΐύFdCθœΛz 6ΘSΓ9lλθζοžόMEK»ͺj°Qnπχ^˜΄ „Uf0ΐ3ζޘGvM={ ;»oϋˆΉ6H£ά¬gέL…2…UD \y&CΐύdΚ‰ωϋΦ²xΟjgdzί΅—AΰZψ¬E~φ9’~ λυƒ³ΪΚSυ€ί{fM«8 ΐ„9p£ͺσά/2ce%zΖ΄?΄·ξΎt{«&=˜ομI/½τ"vPsΘΨYΧ"vi?vΏΫ…a-A0Ω=֏2‘|UnX‹‡Ό1€α­Mγɏg³3iΦ†`@Β4ΚuI%6p ,ΔκFφ!U[; ΊIUΨڐ_ΊϋΒ υ?ώO~γΏzν΅O½σw�Ξ?XΦ'ΰκ―ρΈ~Δ7ΐτψ ŠίώίΏΊςŸ�Ζ~ρΓϋώάϊΚnE-Šέφ€‡’Άg2ŸCHIiWX)|5€4ΪuT„:ϋFχDλUŒΘΪx)\-ŠεοTΌ \―σό=ώλυŒvηP:’Υ|Œ{©¬½n–“.]�Ÿ—ηΙEΕXγsC•ΘRl!½ϊκKι…―f&qaͺœc|iΫϊΘ"g%¨ΌCδΏ b~nFM²‹¨X? a^LPδŠ Π8]O=M?c<Ο‹ΦaVζΉ7τx”‰cא­«§_»yz<””γ})Ιζ’’k$ νΈP‚qκ|Ϊ«Y'Ι–:΅yθbΧέτυΥI™~ς G…u„2„bˆ‘d6+JΟ/­¦œ‘Uh½ !�4άuϊQxξ;Ő :*σ©RΣIΒ8i†Z»F„vη1 œ- ¨ΑIΚΪ4†Α˜«ΐ‘CΝX„I”άT ’3"G¦aHοsνΒ feέRwQ„*^kθDI±.E-†šQw (nF±mZΧΧΰX"w9ΪPB μΠyωΕ—XΟD€φiδCΫͺ¬EkκǍ�₯Ϋ―άf笕”Gre1±Β°Τ`riXJ/5β(ΓECΟό?ι|‚m¦Κπ½ωω:-�›V‘†¬­χ1ΚζW"UΈ„ƒ"0€‘qΜ|Z]ίt )ρnvΩξus«Ν½•ž­α<πwΎOƒΨT„0L‹€Εœ,v'Ϋΐ’Što‚yΡF�$Ή‰Ÿ}γ3ιΞΝδ„>JΏύ?�ύT’0γm ¬)€+ΟŒvΥ¨Š·g""$œW#φFχ)΄j%-€’„hv)ŸΛa$¦ϋο=„6ΏΛύΝΝ”F{Œƒu) _ΉžΠ&σ\Β(ρ°i8 p α›`άΠaοΤς·zζ±ˆΞsR•άΌMΐ#uΖνgγΩ:Ώ2pFFF#ΊωΝ7ΏTΜ€{Φ°†`Ο¬@}Υ�¬9·ξ s/ΨTΙ94Ÿzΰ@ΓΩ V·ΗάΒIΑxznLqOu@–!ώmZ1|•aŽΝ*Ωž?™¦ήLMM…qΧLξZ)HwƞšΉχnj¬–RΞζμT±ΟYkΑ:ιΑ¬λΒμdzοϋο�ήn YAŽwΆΘ™{Γ½XΑ€Ι’<τž‘·ΤyUΎιjΈΚZ�© F›5˜6|VΊ½ϋΧ υ™VΩΦΑ�βΘ/œ OυƒYΨΓ4…Σε?•€ΓU¬ŸΞο�χ₯lWζ+Γ³”g˜λσ~#λln~ˆfΜΝν €Íb£5š—Xί©gO�Γχ‘i{ΤxB]arζ‡ha8•φt:”˜8Ξ2Ϋ9ΰ9ϊ,F» h€ZΓ\y+ψηsϊΕm©Y@1Uδ‹’rΑ”Š8Lγ—©џf”;‚&³“OΓΘφYtŠ<ϊ‚ƒx€€€0GpGΌΧΆw;0»:R,…ΗοΌ“Φˆgqχ³2ΑΘΉEξœuχΪsΪ²)‘zΒήτYœC» Κa�“Κ�ΐϋλ�(Σt$2GšΟ Ώ*ΞΛι&ηήͺνM|Ζg{σ­ο†Μ²›ˆ,0Τ±jώOŠ{ wΗά 4[X‡GΗ6κΓ §\OeOΉΡrΞ[œ©_Ξ§μŒVΐaT£Gž‚qύ°ό:ΙΏ§Υ(g€«½‡@j?pL][Y³ϋΔqšX?ψ8£ΛΓγ§O•μ9kΎ˜R$α €ˆΛˆlxžffZAD«:ΝuΤθ₯ ½ϊΑβΘ‚_,Œλ—gά6|g7ž•žRϋ›ed©;'‚pŽΆuΘHgΛF±e% bΊNΚΟZR§p΅N»υLA`’#ΜΟθ”š’iηΥ"–�w£L(φ&vQ 6‡so8]iem;Ω8žΨ¬«‘ϋTбy�+΄_|V™22Έ]œ-Π5Xΐρϋl])θJqP‹1o<*Β2€ JηŒ6κudΊgω_Τ}jAWjϋΚ8SΞΩΉΛ βžqγ;Ξ,Vƒ@Ϊί₯ζΟ ΐ‰‹mΨ‚–5iδYOΠΙ5U€•Ο3Ϋ«ƒ”9~LC=o~ώs?ρ—ώάΏωΛΏΝ½z―‹ψΑ \?˜‹‹ο~Θ œŸ�~Υ―�ωΒΰίόοώλ_BΘΏŒ9š3z‘ΡjΏ46s+uˆ|© UΌFGž ;ΏNΟΣ©Ος_1*„δ~Φχ*π3ZΡŒM‘k5›NžΚ;Α―€F‘bΘϋ9Ρa)βFl₯Θ)ΐνο|Ž`•Ζͺσ«έzHΔθΕn―ΫuΪ~ΩBΊ^‡‡@aΪEšC7 φΝ�Ν€ SΟ�½wήTegΎˆν&Ζf8Υ–2†cBξ_žβlΈγŒ‰ ώDOdcX@�\GF–ηI!?Ζlš€…Υ£5ΜμUίBtQ4XΊ]=tΓ&¨‚ύ»‡»(PwO'FΕιΘ]­¬„’]ΒΓ€12PΙJΤ|ί#ςΦΊpBͺ�ϋοΏΓϋPœ΄?…ŽΙe�^½"4*H{="©*έ¨γ:Ϋφ]>Ζπ“Z¨qmν‚0ˆ1,[ΜΛ0Z©ΰϊx/# ήί/ΑχΚθΘχBρbΨFΎ sb Α Hκ4Y_N‡3œ– Μ�`Έ”qΦHτΗΉ ’5υ*Μα½4>ώ‘L°Ί5]L^{…[b=,όΤ…Cζ>X#ϊ+°΄΄Έζg¦wΪ�χήz+}-ΌR§ ·’–v©‚hΤa9`ΟZ”Ε%rίς’fƒs©ƒ¦1j±Inv?(K4"M­:4�pum•A›Μ‡ΤΪ6XGΆ ‡žΉλ£₯ͺmYωL™ϋ• 9ζOΗΩsyΞ„Τ‘\‚zJ?@R1F ­°=  “:ΐ1eμ�PMΫπ~aΎβ\vρά²“”…q=Ο;ηAω:ϋΪ¨œΊŽΊ)c!C™}ŸΕ½€c μ1ΕΗxeDdΩ^§D~«­ uάΚΦJφͺΰΛΉχαΊxZAU?ΣϊόθΧE~E10Ζ’λ\*�rΩϋζΚ (ϊή_g€„ΰlmοŽάK—ΗΑyͺa^LΰΔτΠζ°Γ 22βˆg_ΐΡ¬RΖp½rΘάδ¨�¬η^―ήW‡CRΟώή#iEœγ,o=ƒ“xΞΧ΅RΏτχ}ΨUk»k©‹z΅0/L‹:αΌ Jšο,«Ε—N’skΚΜ ΄pΣ‚‘Δ{Ύ±oFpΰϋψ۞ ž»@ν=3ΫΘλ€ΈVPΧΙΡΩΔ2Δω㟻Έ¦;8ίΛ€ε"K'K­9N“R­p]·2²o“Nφν&ΰiGGgτ��μOόXDΒηΡΘήSΊα 7ΐ]C�±-cOο“Ά υ_¦—2[ΠςΉ©>ϊ/`’“€μ،L ΚβΪ;°ΰ!ϋr‰Ά¦ ςˆBϋivz>䌎KEfχΡa“X=§PΖ&2gΉl}Q­jτI`b{‡θ3ηL&…:(@φŒΑ#τκkŠ˜ήΰgM{.G½dšβp’±ΐzωL|ΟυΌςΤΦ±m€,έ=²έ|fu‹4ok ­\Ζ9΄iν€υCΚs`+=ΣMφ(Ψγ:©FžeυXH€FGN»$φ;ί{L§LpTκ YpΒΊΚάΡ9δŒς·rψ˜=ΕO¬qJ/B·Ώqmέ θNA¨[°dFΗΖΥωυTγii:4”^Έs7dΏφŠ΅ ”'΅<§/Α[ΩlΞ‰)+€Žx ψΈ�NΑ:£›BvΨ2»}`Ρeκ˜0K€Oξσ³gΈ…. ’ξGΧΗ”AΫθξPδo#Aƒ>~ŒY#5b{‹  `ο άΉψ sΛμ+W§YMX+ΦΘpŽχxΟ6ΰΐ:)AΞ©v•r@A‘σ·‘ ΄v„ d?Ίopp �“mν­-pDί½vΚό©Ϋ<Ÿ¦ήϊ¨o]Ϋˆ,œfτ· ½vaΟ%³P;ΐΟ»€�gςΦ/χŒgΖ€—:QΠ–7†μ·8φ--‘Wφ iƒ|&OJ$S F*(kΊΆΉk` Χ]�κΉNgo7ϋ ²άυ:β¬kGhOٚU恌 YdμNaΊ§6š@Ωgl©΄§cd†lα0yNλtΑΨ©…YΨ π4ˆ~₯>Τρπΐΰ�τ«ΏψΛρΣoόΜ;Θ€z7ΟΕλb˜Œηx13π/˜\zƒ�ˆ'==£5«ϋΉφN”$ΚέVH•8’'3‚e~Vα8d@ΊaΪ *‘w τfW €μ [τΨΏϋ*ƒΊϊϋŒ�Q�4�t�βΊ(V[ζ4 hpΰz RL‹8°/­1Φυ]F1#Σ* cm��ΜΑFF9ΕFδΟž;8RωPrι)ŽΧύχήΑ9 O2)³SO1hφΣάμŠ *3Vώ.FBŽˆRsΫ F…ΥN ϊ‘μΟω{ %j/c]΅ ”$Š­TŸ^D=4ΒΞ γU <Κ0jΘ-Χρ2αΉp-XΗΗ₯Ω--Μ’Rf–'C‘―ΣiΑϊε£ΜΩV9νΣKy GLC³ΪQ[¬«Jz4λΌ·JsK*Ϋ0FtLp$PVυZ䁬γޝdFΝ\γR c€£Cξ FΧάHŒΚΥB—a|ρ»Z4� ΤΡ>πZΊ3΄ΰ€šΣnT©€!3¦c΅ŽωΙ·Πci›¨άAj"š’S,hS"UEΓ=£πbHcθ iσ^FΫέΏ^Χ‘ΰ™žG~ "j•£ιΈQ«Zj,ΓV@ S€Y\X ϊ¨³Ζ•”G6‹CRlŒθχ>”OΗ ―ΡkΤ4Λ±t/νΐ±02vTMδdΘσъρ|λφ­τς'^εΪτ &βy+cζαύΤΔ8*1œχY―CφΪ.Žq-Ή¨;zœ˜x›η€κ†yσBDΌ-ώXΗ|rώ:qnH'u8@‹iβ·�ž»2 �‹|n™t2yϋΘ”†vd₯L,’§Dκjt|‘³pž©er6sΚzσϋΖ$ˆa—™=E"ο˜t/Ψϊ윳{L”‘mI‘@ΖZί”Κ|ξ”vm| 9‡aέΘyΜsF*Ia”ΡX4RmޱΤς±Δ²6I%_ΚS4ͺr8‰8>ό{Š_`$ψŽ:η”Ιa=00Jέ§:]�υœΥ6 *n~ιΡδΡi•Μζ 5€G9ϋEœƒ] χnζΧΒqλΛμΙ"Ξ+l�Hμ—ZdΑΚΣΩTΪ„Μ½šΣΚMFžΝ/gβY€ΞΌύjR„ρ�ΔeΏΛ˜DΘ…™ DμΰΌρά�η-j*PζάΆχu±VviXg?΅ΰLΰ\ΰl ŽˆΎ–ηΡ?u<`s±GdΌ₯½+ΓŽͺγLu]ΰ¦%@¬  827Œo…η9.›ͺ‚£‚?Φcc>ΥLώηk—3 C@} Γ¨|TζΛΎ/α0!Γ*YΜαnjj‹z:Vξ3€}›FdΝρ1ΐτ& (NΣφπλ―Ώ–F�_Nύc°5S &†&Έ82€R@Qy&?�Ρ}ƒυΔΠκ)\j “Eq Υ­L:.Ό?@Φgo/:νx! ϊ{Ώχ τM:˜:ϋλ©ύ3DzE3Œ‘ωEζ—βΙ}­½iΣ”φΏ2ͺΜ΅—I1E‘ΘΨΌ—ι+‚V•θ₯κ:@<φΎιKuœY?Φ&�a?ΐސ€~“ΑΕ ΡC²Oθ$$ΨΑΑί£½_gή.'Uμρc¨πυ|€€Ύ··3΅—›Cζh{œζ+Πœmk£s rθˆωꄁΖ^45ͺi¨>Ρη=XόΝgm%­‹…D^Ψ�8λv�θ9‘έ ˆΘ-Έ?­}yž“¬$S*|^Σό*9η‚μ Μ«ΰˆ:n‰΄ΗΪ]€IΣΞ`EΒο ΉP‚Ν₯“ήKϋ [QμξώώXΓ]ΞΛηd‘†­­υ4zι2© 9dγλ°‘†ΖΗ)κ|•T΄ϋ€ @ί­‘ΚtΐUŸ² q6eAqœR‹ι'œε†–:ϋ SΧΦ±ΟS'ϊ(UšˆN!^ƒ7€>§Žμ;Α»ιΙg!Kƒ1˜Πľ؞]„•Ι|q†gžΝ±MέΛGGŸ=R-^Ν‡CFV1ASΣ[@°Σ•*dͺut¬%κ`Γ^₯Ά΅ͺdΙΊ4ΤμDMzπdšυ5υΖ}-΅έ€<υ tΫK}ZΙVOΪmζœ}PΡMχ θn»TlΒ\‘VηEΩξΛqFxŽ#@ΑΪ«;ς΄4τδΛΣΦ­�ΥB6s":₯ 3 "‡VΡ#ΝWΖR/Kΐ<2οŒ1ΜObwΒ>Θ³―e‚h cοHY…LkGg;οη!6΅«ήzW<γi /ήK__y“”-:Y0ΨVj+X€ς΄Š6²0pkΨk”Ό 5‘~wτ�₯ίόεηΧ~‹6ΌγΊx]Μΐ ΖΑ–‹_ώί3πε/':,μ�Ωνg–ζζ~ΆΉ½«Ι^φggΠΦ¬‚F6ΚRak!y…’Ξ£ίkPΉλ ͺœ|ΘDˆ\F„�9g‘΄l’Ί~οgD˜ύ—ΛˆΏ‡Q Rυ'#Ε*iΟΏtΰ£έφŽr£ΫV�ΕX>Αα89ΕAΒ‘–:WɘŒ@g‘ ’δSVΚ6η·τI‹ΪF „λεΘΝΫ‡.™ΓΪL˜Ÿ[@"π·RJ8S€*yΣψœύι₯—‘™PΔYτY E₯²²Š±ΔΞ‘‹cͺ¬ΪF–ζˆb�pςιpΠ (Ι"Š©hec˜y"@@–“�ΉJž¨ωϋΗΜ―-Βd‡pζO#1c6θ˜ΐˆΨ$Ψ†Ψ =n0ςŸ­V?Λbfφ—Ε ΥαΡΒΨΠ9Ζ°1ΟΡΘ§ci‚Š_E�\De(*&ΘΓv`’ΈMΓΠ�t^ψ>ς=qʍΖP₯—}’)Ps―U¬Ξ‡JΧw’…ζύΫMjΰΥρ«3§5Ο;W�ύ9ΐO5ΟΊΓηζg£Θ™cνm뎨ΚΣΗO‚_Δ@Ι3Χ ŠJΘX―ŒΥύε+ΐ)~αžŒ2ΏcΚ F†c3G]@GΧ8μ!N΅Œ #G͌-ώΖx݈„°9 ¬¬o^½k" ΥH…TJ R#Ϊέέν8P ±¦VΝΦθυ\΅π―υŒϊ™FqιςHϊδ}šΘHkT|ŸΈχ =yηέt°ΉΚ>'ŸΪξ2@Β]@ΜΓn¦Ζ![’²λ|ΎΗz€μ1 ΨTϊΣ_ψBΊqσzZ_™'ΥΞ΄€©$–'Ί³ŒAiŠΝ1 Ξτ`Rtv0‚ldrΨΦΡη΅’ΎsζαΥ8©Γπ3χTΊΊ΅tόΜWΝα„5Λ`ΪσήΞ\ζœo)°?.\NWΖ―D§e ,jPy}/­Ξ/΅λf¨B SΗtΟ²+ž`ž·E-#šπamΧά΅3b₯¬‰¨/{I‡@‡3¨ΰμWχ8φΖj&ΛZ§ŒZ ς8ΦMζvΠC§€‰Κζ‹ St™`ώΗD€―:θ·•ZάΌΒ!ρ,²žΆ#σ˜xΖ•ξ!Α‚Zΐη<ΐE?δaRΈπRΖγ€9όižΥτλ_ΨΊ³…τ Σ™φ1(Ys‹ξE}Ξ–ΐ‘ηIΠ >Ώgί1e±ŽO·‘ϊ/(g‘Ÿ3»° =§5ŒΓΟΨ"υ―όε�(ύɟϊ|΄ζ»uϋE"Κ“€°##²'@…δΎΟ`QL hοoŽν?‰φ‘EvΩ΄±Ž“D4�œϊ<σΪEΤ]FjM•,°U­ϋʚΈcŒ ‹βižmSlΫΖ&Λ"ΦΚt‚²‰°m₯ ς½2(w˜ €Cεiαi~ώ Œ΄e¨Δv±Π‰QΟ4[­^G@vscƒ:Τq#ΧΘj[•9>λ Έ§ϊCΝq-; f;縎œ枟Υ3ΞΏΟΰšz^<+Κ ώ5\JθΗ§17ΫV�έtύ±  Œ»νΈNή[&I:KΩ5LKαΡ+—£ϋLΧ`oΊO B˜YBGιt±gx[Θ4™:Ά~N™©Ός₯ώ4Ν^¬syΖYR¦ϋ}Œ•τ{‹βE5ϊ+θλ|Ωή8κΓΰ›*&πͺμπ¬™O/ψκs{^ΥaΚX†Χ;ηyΟ‘‘b?²\‡"@“`sαύ<ƒ²΅l}¨<΅+…E�¬6o‹ΓΨίΘψΞ―zRjAΫό ζ8nσοό›¬#ρuAό²νΠΥνωLwgg<[V…sε5LχQΞ{¨yΐχώͱ؝(l XOA}rΤΩοƐyžβ5::iχΛ\›�ζQηƒ1>Ž%?ϋ¬θ{ΨFΆ‘φΜΫ ͺxDZ’ΚλlΪL±I&$5Π—³³σiƒzD7–HΥ[Ϋ،@€9�ΚNΔNRΌϊΆ,ΊϊFXΙ �ξζ8ΧΪR8ΜΜyΖd` ,Œ I™~Ξ½έ,-_G°.Μ φ5’}…}Δ&—Œ³Eη£+Χ’³išΥ—Μγ‘{ €½Γ6Μ9ε\Χ!ŸσθD£ι7nέI#γcŒE6"EͺYλ6XlY ί"Ό‚iL+k/ ΰΙ™*1_κξCƒmΨDΦW˜[^ˆT…Λc〝€b’ϋd±„Κ^r? N :+Kb�cWΕΉ$εQΉRΕ{ΞXί²D}νΛ9r�|Y«c °q‡υwƒωΒ~ »‚ōV«Κ€l1mΣ£θθ-€œΩ§CΧκΚbV5₯ΙΦ₯Ά]E9ίΪZ9€ΧAR™ϋ²ƒ©£$؁-œΪΖryy;—ΒΖΣ3ιέοΎ θ}uR‘ϊζ/±ζCύݜM 8Ύ4p†z»»ξ½ϊςkΏϊο�Ϊ—ώA}}oF±Š'ΊψΏ‹ψηg Ϋω�όο/~s1�―ψΗ_ωζφΫ�μŸ^^ί\}e“ι9ύΫ­’Κ'Fš©‚+{©1κό¬ςT8gC₯h ςg ?’ΰφ}$�ΌT ™#§a› w― ƒFΡθnŒd•p ƒHΗ~ye3ώ5‚#θπœΎg΄J,εφŒH†ΞE£νeˆΠε1�ΖƒC—’™ν½ϊ0ϊTΤί{ϋΫαxυυ}Ί›…p‘#Z]Fimα07�&ζAeΙ3 X Ψm‰£qi/ Ο(h£c‚a €’αe$±edkΎ“Œ]Ψ*€.’–¦LOOE‘A.,«Β;ύ›u^4Έ¬6ΌΆƒβRαθπΥ;W2¦†„ΓŽA�±*Β�¨BΤx²sOo8GVgΑP3’ˆΕ}·‘Ήϋσ ;?§ΛeΊˆ‘S*L±ΠΉ­Α©Υasu¬΅Dβγ9ΓP†Ά�‚fύωΎc Ku`5θ  θμ}­ςΣ™i…‚ξύΜ_Œ½ΔΌX›@J�ϊϊ½Ώ?HkΛkρL—1’»ˆ  �˜�½₯YΑŸ% ₯u: hŒζŒvΨͺ ϋΠ–ˆζ¨JEΥ 7ΚΖΠΨΑ8[Κ¬‘ΐ“ϋT »†’\€Q›Ξλ�Sιίς¬‹sXŸEΖ…ΧtξέΛ¦·Hη¬πpφ‘*ž`dYί@¦ƒΤQι“-Œ©ͺd%{Ύz¨_yς―ήΌJ«Έ�ΤΫίCκΝτΞ[ίH«P˜sDšxο9‘ΗΪc°=σ�κεoλ Υ# W‰΅―S;0bΆ …O=}Θ\§λ\Ϋ"›Άς*1g<+Y”ςhΔ0σΧuD?χ‰0oΓL8BœM΄”4P#¦�»ŒŸΧ³η|jθŠΨBQ]§]τ?ΛWOΠL{#γgςι³Ηρ~‹�on€‡ŒQ]Ÿs?u�Γ΄/˜"Π•ΗΡ(Ψ1 ‘†ά_Y :œξp’L”Ρj#Ω‹x=ηWZά΄k@–u@±ρξΛ€ŸΌοY]‡mΑΩ,°rΊχ·θμΫΩjμλΜπm<{D?yOΘώu―k ηΕbŒ2%ΒYD&XLΡΉy ΆΛKw_Œ}8@„σΪΥk»j=|ΐΝ+s*έ?Nσ₯L‘ Ϋެ57p€¬ε"``Ετ]Ξ†l[Y†j‰:ΆWE731κItαΤˆΤφ’[dτ "€πά0i<ΰσ�€ξ•ρ7Z:Τ>³6ŽΑ AΧZ–˜6Pθ>ΟΟnϊƒ f–ΊΖΊ³_-fwχΕblΦQj ¨a-Žu%uo+Ά’kι]ei(O¬;°Αω™šήHί}ηύ4;·ΒΎοlνηܐΪφQΊε{Σ6Μ¦l©Of¦�ά£ήΔ$œVCΚ6¨…ηΨdd)—bs€Uμ3γ]tΆ-r;‘½#*/ΐ66’ιdΦΏ,o‡‘cι�όBμqf>�½AJ₯ιL΅€ƒ¦υ ’ΨΥΤe·φD›Až΅₯½= ]C–Α’ˆͺζ3ΤUg―…?!½C$Ϊ^ς;νΞξ.@„2Œ5ξ ;§…Σ¦Ν1υ€υ:‚A#ˆΔ3V°L)σ*δΌΎ5]Ž8kμnHWθ6ΐ•c” gΣsμ:{`­f BDŒRο Θ’π=Α`dΔ $Ήoμ:vΚσŽ€fζwκ4θ¬2¬J­aaDJεj^9IΌό¨ήZh·υP›ϋ†FɏΒω₯;Μ”Ό="VFΉqHΜ- Τ Pΰθy ' Χ €£�<ΧφQ‰Z‹ό=i•*#φ\ŠλΚ„πyΏbP ™ Λ3X8Pέ_lΖ1ωΰ½χ0Pd0TŠ[0J ΖζnWγZΛ@ε¦ρgα fŽΟƜG4EhΔͺ–HžΡ_FƒΡ3aΠAη+ :§ν ϊφZξBΩΪΪqn»΅@IDATa.ζLζƒcΜ5sΎ½O¬ŸcAαZνWkKΗΐ—σα§™η r<:F Uζ:.D΄ΈΜΫNZaήΌδ]ΐ©E’uSԜΠΐ7ΧXJ·υ%ζˆFξσ³¬ΥΨ5Œ:šόςK―ΐLΈΘ`4fŽ΅]"™Η¨…�—κυtL²η±ύ_Ζ ŒUΎ―zŒXχ¨ϋS0ΚW8[~ƒ±QUφ¨‡ΡX {kBΈOk‘Lj4rŒT|RοW‹ΡWCQ©ŒfšνUls>GA4A>'h SUΗ³Io�Ζ �"Smώζ ΧΣ'?σqΐ!’o~γ+€aλΟ5m»¨αzυ΅„φYίœ₯}όγQΤ"z««[iέ΄Η¨ Η>ΞQ¨W_{ §©%=~ψύON3QVχΖ>̚ ΌΞ|ΟiK�e"»'ΌηŒh_Žfρ�qcz8σξσ0τΩλˆŠ €ˆ"bˆyΚaLιxθ¨ipYk€š½‰C-Έ`θŸzŠ%΄~φΟΦϊ x. M.NΤΡ₯JΞC^§f€-χ tͺμwoŸτͺœ \ΜΨ 2W„ Œ¦UΰωTβ”›σjt[Ω‘Η": ΛBΠIY'S€‡Ώ‚ˆΦTΩ]ΫΔ1¦…(ΪΒΔ#X¬7 XΎ‘n-8‡€xqςœ³z¨¦ž Η`KV s»>DMζBƒ>Ξg<=ζ�ˆZΦ»™Λχφ€—1vε*€ΑkμΖXξŽTŽρλW’ŽΙδΔdΘΫpϊyοwŽΌ6*§C#ιŽ,{”1{n”-ξ\Α ejž³.K¬™6m~5α}κυ§Ϋ/ήΖ(&zHJ‚5)<ΎΟΪ ΒξbΨ!Λ₯ϋ<§€$9Φ¨‡«¨§σXπwάkgσ ŽήώA@˜EΌ{Ι1\ΰ$¨#μ\‚λsb΄X'Tΰ'X@κ�mW�‚ΏηLΧp�SV9†:δ†ςKζŽΐC€b#ε"Έ[θ”δˆ²Λ‚ΉΆƒ5Rkύ‹αzM?/[Λsκ½.Œ€ώμΓiou3¨qpj$‘ρJRJœ‰3dΈ:ΝΉ~~.2§#+Bιού2΅I&ψ$kΠa_yώ{X'ώ�Θe’ΈγDΑ"_\ω.‹ΓΦjΐTοmΓ(;η―ίΎ™†B� \Ήr™”$»†0‹μcλ°X�E°Le$ί±ΰ;Fε·rQφ™ “²l—Bk‚τΦmρ―EτΈcœΚχ‘ t°`˜35G-ϋR@4cU8+Ψ%μ•ΨdžC‹@ͺcœΫmΖQδY#-’wZW’ *;^rz1Ϊ‚κ8Ί¦F”™δšŒ₯ρ±1δ8υ˜mœχj@Λj˜ˆ΅y“-€쀇ž&λ\θ[Σ鐳ζ>lλ Εq―LΓbz›t―Ϊ^»ω Ÿ―Έ‘tΙ6t„έ£3\)ηΐσ“αθξŒΐ#m@…œUκ«°œGZ`ƒ™2hΧƒ©oeή[d�‘@—νiϊ§¬. š—ΏΌΆΖ³“–ΙΧ>χΪH‚5\ύœΌL‹gZχΐBΌ‘†L«rύΡmθ‰kΧoΐ&m°°— ˆŸH[[ΫM‹db)KΚά[ϋΠZZξΙ"φˆϋ*oΚ ί™&(tηΖυΤ„ό2Λ:YΦ7Q^E €kcν"ΧΕΉρZ8ΆηΖ=Δό©ϋœCχŒι”Q€šSSΛ\ψΖη”ύ»…ύŒa‰ύ#£Β’½±η9»‚§ώ'Π- ¦‘Q&Ψ[ƒΌyςαΓ4ρΰ!΅O6�!A€cΐMΚr`GΡ†Σ YmΥAk[ΣίΏuσΪoώ»ΏπKγŏ½>™�—ΉώΕλbώΰ ΌqρΊ˜?ά όάώο|νΝ�σλ…άΟ,―PωŸάε3S ζ12ίU£³U†Fραo�Ϋtξ k4i€κ4ψ;_:™*‹Ι *8Ζ‚BRΠ!SΊ) 0ηZΧ–„ΣΠρD½Ζ° A Ž–tn)ƒ^o΄:œ-€tτD²1ƒBQδ4πfηa€˜w΅ς,(ŒI#œέ8^:ΫEœU 9ύΚΪΡ€Ε΄tΆ}±+Ή―–‰ίn{ iœ_€Zœosi{η\Ηθ΅Ήu§De"…ΎQ ’ §’9υYR‘]Akί(Εξ–�Κζ “D€eQπ‘4PIσa+C[yšθ¦Χΐπ1ϊ€29Ζy�±Ρ™Λh±LΧ·˜ŽσxFʁ‘ŽΕΥε49?�_Ώλ’‘w`/iΎšκš™†Xͺˆβr:Γgg˜‡\Ηω±Ψ”†Ή²Έ#mΠNٚΔγρq )«–2ί�εi5iΡςΒ1ΉΚΠoχˆrΧΉΆΒ°JΨq]Οι΅pΗhψi�e½u�OΙ›―αΩΟpπV1ςž<ψε Π‚±»…cΜΕΰΩAž&Ζ3Δ”(Ή›ϊ³ΰ––₯Uχ₯ΣJ#TΡΛ$8£š) QЁΏλδZΨ*>‹(«c'½y°υ‘χΩΑyˆ9bΏy=ށ`‘O€ζ /bΐ<˜χΨΑσΩΥ£ΎΎ•n«Y$ͺ Š4Ο—ΰ²βύπθ`ΊύΒ- C’�¬ο&lŠŽT{Ckκ‡ήΕω¬0|υzͺX™Γ@ήN=Ξ'|ξ#’ηύƒ{ί š’Ζ+0Έˆe₯v Ό©GΓQξμdM2Ϊ†Ž3ΐ\`―λYΫ‚*Ή½ζnSδ“θ �Μm†kδωΣ°Χ8φΉYͺ0ώ ¦~ΰΠKγ΄*»Ξλ.4q2s‘₯%K)WF΄Vΰ rŽžMNDŠJ3ΏŸ#"ρ8ΞS?”μξυΥυphΘNΝD`ΚΠtΥqŽθό’3^*QyΠέO^*,†χ4’λX„l±ζΉΠΈΧ „9…]#βa]ε•ϋ"ΟωήΩ§žφ`q7m΅“σŽCΑ�ΔΓ‡©ΈΡ@Ζsκh˜zMΑ8Ιβ2 jZp„Ψί{€:ΨUPΑ‚Š5υ΄ΜˆυoM€6ŒVν―Β±•uΰ>5hM DηnδςHϊΒΎεQ'εεπΘοg¬Dΐ,�jTT§^ŠςϋL°LΰαΉΡι{uάΌΆ2œ„C.ΫEy”Q€Ιeo7Χ΅ΐθΰμΓtΰ890|pVNyV1W�]MƒƒΑrΖλœΝ' %λΠL ΧFq8ζv ΐαέ›™AΦe₯ Ω 5€βΊ>ώΝn3Ά»s €εδ*€Σ* ω©ρoAH wε›{MΠΗgqάq–ύ› !?{]CΧ£L=ΫΙU#“χq–kXγφ�ΡW!}·nSwнΉϋΡ¨Gςτ�εΛ8&³AvZ•ϋ†΅(Γ2iά­#Κ[%ϊΡΔΣ "ƒ]Ή,ρΚbη[2™ί:6_ξCe‹ ‹Ϊ*Ÿ•tt46ςϋ‘)xO&Ÿl€ΆG ζpβ7qœΪ’Ε³–XηFAύΜυάγg©h ˜yΘΗjTpft¬NHpX΄ZŽyQΖ1°UŽ…o‹ΐυΨ—΅ΘnΟ±ΰ‰}=`&� / 8q΅€BQε…Ή@o�u¦’9jlΰΖiΦα/π,•ΘΏœFϋΟΛ°Ω£ξŒχp.B/ς™rPΑ3ΫΎ�6–¦Ύ`ϊ9uΎΜ%ΧΪθ­l‚Ρ‘~Ξ7ΰ ©~ΫDΣk]]d΅Α―ίM‘9;κš|ςγCfί‹τ΅Γ"ݝ%ρΪ0²Ϊtξϊ%ΟξάI~ψ„5Σα§εs0±ΊIέK²YΟ9>cνκqb]η ξ«Σούe�ΡUB°Ρ/S¨Ό―…e3tb4³ŽΉ*Ψσ¨žTαœΚŒ¬§&J'r~ͺΉ6΄ΐ_U©gλσιήƒ79_mŒ{vCΑ•!@y׏ZKλG€)θκ,�΅iŒΪΪ*D±Ρ-‡ŒSέ‹Ώϋ±QΝΪ$zƒ ϊ6 ΛΣ3ΐ΄3#ε[€vFtξ>š€Ή]ΆφŸϊάφκηjlA/Σ"ΧΉΧ  Α^θzjF΄uΕy8‚‘—Μ°σΖοޏkŒΉ~γττ(γhΤ[ά›&νΝ-< ΛW€ Ώ›[τc.φa8^e‡‘}χΏ6TN›Aωμl[Φ­Δ:iG-Σ₯Jΐ]֚)  bak4Ž©'ΤνŽΫuΞ€sSΓͺΩCΪHξm¦3lΑwYsgά¬ΔsY/jgK¦%ΰ€oξ@†Ψ Ά yΣMŠFV°βςε±8kλΨ9«θΒΝJ‘Ψ7²ΛΪI‹Ϋ€9535Ι^5(cΧlΐζκ4:68wσφ‹� uP†i½ψkΏώεΏΕύ)ύ{ΜΐΕλbώπ3€½x]Μΐn~γ―ύjξύχά^^^~έHq‰D PQpg|ι”Ω?YαX!EΕhwi‘‘~)X5”4J|©€55.54^tȚˆΘiΦΤ!8₯”e*#P5¦uT5~m±§@φZ~V"θ§ό9ΪD²νΏm4EΕέ‚‘q₯QBz+&:4iŒPŒHs³Uθ‚ζAW£ΐ₯»YΥ\GψΡ’°%ΆRQψ,hψˆ’+π5blVa-k‘£Ε'Rζu4X³ρa΄bδ”ˆθΜιΕ•±ΠίqjˆθPΤΘΕΥu‹¬™ J”Μωaά^Oΰ@EΌ€b‘:\TQΖX2N‡₯τΪήζš7ζžc‰χΟ,˜QΡ�ĜŒ�¨Š'=‚Ήn™";ϊ(Šττnz�ά=<φ9ke…rηHš΄‘<ΧLg "·Μ£Ž σβΊ:7ζ‡Jϋ7iτΕC£;‚ϊΡi<Θœ{([ί3 GΞι"Ρ@{>ε±%¨ΌuŠZιF1¦ €΅΄8ΛN9‰|Ύ6"Χƒ2~°ΎnŸpv8€&ΜO¦$ΏžΛ±OeA°γtXΏN•Šί ¦A‘Sι˜4€Νs6oΩη:[απΨ�QŒ•φ­ΰl4DΓ―#Ψhˆ/«Ρk|»ΗΝ‹=bέwhƒgαN[’5@―=Δ—Š*°aDΣ–TRω΅:�^»Β|Σ’ŠάΕΙ?LΟ<$ZJξ"Fρΐΰ †e> Ž ύ§Ε€ΐg?χyŒ {€OcxαΔcέ�ÈΩΑΪPa¬;`ώ·œΖŸlžz}εθ$σpΐXΠΤbδY—Ÿ mΞ ¦1ΧgŸ;f Cι£ΜieψEHΩ1‚΄PNΎ „F ¬ΡΌ½Τ72˜κZ1ιO_%Υ ³=}ο^8g»Q‘³ΰ~ˆξ%\ηθ£άι3€€Φ. �6Rϊθ!€“¬”<ŽLC½ΞXCŒ7ηΤ½δ7²E€±+[4ϊ"…q Œι@η)f©|ͺl׏-€½cΦͺž΅lΘ[Ÿ›KGΠGσμΛfb TΉoσ E\Γ’_³‡0%˜3FύOxfΧΖκ%œPeY5Ε Νω•š*MXGRZΊη^pIΦP‘z'΅DŠ―έyΘ�§CΫΪ�ΘΎyπΈξαω…ε`Q˜ƒn$Tg axBm˜Kώ+•�ΉΜ°γ‡8 xΘzΞ3ﱓA"“₯ΒYzρειςΨ₯ˆΦ Φ*wM±²NΚ[ίωηŽ+°―ΞΥχž�:φ€i:Γ—―Žq&Ιŝ]ζκ ΑdŸίn΄be2,ΰjΊ†π� yΞ=u~ƒY€ό‹Κπλ2¬ — 9dΕχzζN!Ηܝ0Ο-ξ €‹3.ˆ[ΕΉ|ΜρΉsZ6Ήμβ Ce½ Μ=s―Ύ1 hsCϊ8{‰ύ³ΌΈξΏύ6ϋ'˜ΚεMt!Gύ΄ΆƒCΕ³€­ΒΕησψz ”)'u¨ΤκΔSRΓPqΌΤ‚²Np² Φ‹1J)ƒΖχΥ™ΕΏΞσ :βθ Α.MΞ€gŸQ»d•ξ)·Πmuιύ�€YΰM€ΦvlΘ2žΓίλ0ΛμΡ₯ͺbό-μ1·1ηψ;Ξ*s¬9φE™sΐf‹hlΦF˜}ξΒiϣ㔣V}/βΪ©$Nχώζ„ϋάΞC–κ—E‚M9p’Ϋ1z³Φ‘-;Ο’­*zΟηUη·υαlNxN‡.Qp` �±”±F eSτRXU]kΕϊΗ“œEτo"0aΗ–2ΰim-/E˜"Φ·X`MΥΩmΤΨe)‹«|vφC8„θ[¦8lηΗ=κΌX<ӚO9άψ»σ(Xwh!sθlb¬²,]ΧdTχϊ±«»%]½2–ϊ(4yϋζ-@€Ζ@+Kœ^Σ*‘υ•UWΒώ’5pz©μF«I‹s+ιιΣI A›’€ΜFžόο³7­ςo’CRCμ*°»#σŽqs%rγ·9;«†΅₯σŸ bεΩ³€ίΜ‡Ω>³λ γν™ά£ήι”5άO€ˆ7π~κ3‘Χw8Ο²Ή,θ*³Δ΅«y΅•v ή³Αί#λ-΄ίj'Κ>iώ¦€ΪbτζΝ°YμΊΡ3άO«ΑE'ν―Α »ΖΈΚι½{ο³7™žame¦δΰσ<ϋBΐ1«έΰήr-Lμ{Ζ­P`οWςœ²wd½΄bC"8~ΩIgμ[e`Ξ‰μξg ΐ±Μ;ΖΟ¦ ΪI‘Ζ‚>¨Π‘Χvπ| 0δ™NL`μέ8KθSλ=νB,Βn˜šH³σSμWd&σ)Λ!B€ π–ϋ�RΔΪ4™WΪ` *κ2M>›\3貁,hZωόŸόΙ―ό+_όβοόβ―όΉΏωΖηώΥίύΔ§GΏ—Λ΅φ»x]Μΐ}΄˜.^3πΊ‰ΊUΩ”ο{τΑϋochήΘγΘξcKΨkMΆ“€Ξœyέ<Ζ€4’ ΡYK•_'ϊ€WζLFΔ!ͺπΆ8 Ζ” ‚ƐJΘώεRΫ€£ϋ;••-ε,e^`Dδ|ƈ­εC”ƒω˜ζ™s©―G«ΖQŒΚΆ ΕA¬₯b�t4Ίqφν!^$z¦±―3ΉmΞ<ΝU f‘κ‘�Έ‘TΗo5ΫZΖ­Qd~YeŒ•‰1@„ Η0{1uΐgz4 Š P‚ΟθΌθ4©“Z©"–Ά―’΅"τ 4=QτS½@· ZŠ}°0ΚpπΦQ.‚0^ΟF¬σmϋ6#B:σvx‡™χi‹VβŒ5c0έ½{7ζb…ˆ-SLυhœrwνPΠΡή™z:ϋP΄ετδΙ$‘| Z‘\Ήf†N ‘Zζ]§A‡JcΚ5―‘Œ…ςdΝTrV!v,‚Vα3π�΍ό²hΖ†Χ6‘έΈJ�bUR}^#ψ¦n0ί0 δ¨φ₯+cc¬UW 3sΣ8ΔDwYO#G‚(tηDuŒnΪς _3Ύ9�_ η]›ρ`ΓΗ^:ΡΙb^ rduΈμ}w ˆΏ9/` ΏςςŸJŒs�ϊ»(ΘΩFζN"†δΛ6S[w[ΊqϋVΊvϋF’Z~εΖΥ¨†}σΖuNϋ–ωκ‚jyυΞUR0^ CΨVKΟξέO‹Pό±5 Œ^b͏ΏϊxvεΑ‘! ΄FF#ΟӜn]Ώ‘Ι‘ώ‘4žΣχΈ/{ μ΅mœG«£λpΤ󾍹y"ρ8Ž‘χοο{α8YΓΓλϋ MΌά5c/ΑΌ»ŒΣ½Βš1G�ΘLsŽΥαΐ"“ezΉί|žVb»BDνφ“2Σ΅ς_ε΅γ3m!œožΝΚM«‘Wς†sΜzVp-hη_0§Š΅-£3”Mνύ΅άf}„]0-›Cΰ\—ΐ {BGoΆΦ" ‘�dM9Ά-$kmq#‹N«€$·SψΖ:=Uu~ŸΛoΏwμH"–ΰ!Σş Z) ZΠgTT™E5‘gθƒkΧIIΰμΤΑ2Π!ρ~"ΈR¬7Y›yͺΦΏώϊλΑ=Α@ΊΰŒΩρηŒ‰ΠΙΆΰγ‘g”Ώ �KŠψ¬Λ92Μ—ϊT‡X@‰‘γ(>ŒͺX;Φ‘‚αΗ‘ π²™ˆp=²R6‚Ξ: YXG =ς‚υF[ς[Ο@†˜΄ν‹uΪ#MŽχhθhΪ‚V r6ƒΥΊ4dMF»YΨφ�֚°θ΄he;sΆ‹Ω8«Bη 7XsΩHΦ"ΆΖΒμό< ύF8ΉŽINΪ‘]eLgφ"σ Μ·y-ŠΉgέgυRςC"ή,š[…ύc‘VΩX­€Μκ.ΟTδΙ3ξ žΉΠBέκšƒΝ›ΓΦΡΎO0DPΊ‡:& ½ΑT’•fOa>M33β”Ιυ�η¨P‡ΈŸ΄+,†λ~ρ{λ‰,Ψ³Ά$¬W)—eZω”η‘!κϋ­ο`”άΟ£βΛmjΚEœEŸ])°`:¦v—@P‰³οάh¨ΛΈ^Μσ… ™gSML±Ί<~…ZK΄ΌFFȌ †kμ•)g_3kΠ„}²Kϊα&l‚"²TΠBy²Α™“1ε)3=cŠvΥܞ‚€Ν—ριžQΦk¨» ΈxξC oο”ω2EK€•gL‘‰zάΨ°Έ–Ÿ}Ύ,­A€ΑΤA!Am²l##ώΚΧΑ³ Χcƒ†ŒmΰΜXcAYϋΨϊ5€ΠΦR€Υu˜ž›βoΕtφ“²ZΫθα£GρeΎΩKηά�ˆΊ!v㸏n|σΝ7Σ7Ώρυt°ƒ¨Έ•F/wξ�[Ώςη�ƒ_ώ³Ώπ_Žέ}ρ» §--ΓG_ώς€ηωβu1ΤΘ,ϋ?κ§.ή�#79¨\ΨΙ)Ν|�λΏσοό»ΝS³‹?ήέΩT]Z“V§#Œ!ƒ�Μ‘+0ΐ: ΪQδH㠁­π“‘ ΐΦ™P κΤj΄ϋ}™©Κgο0ΎHdώgΛ™V’@Π�1ψVqtWV7Β ÐkΥ=ΠΑΜ!°Ο‰N>wb½�Ÿq jVθ€K“¦¨―σ940D5βT-Ε2ίD…χ9 ιΜ¦½τ*τΫ!œœY8–GΠܚŒPYœzςˆόά]œΡLΝCy”N( 9©³ζ�k*0™M ό + σ₯qb―ίύ}Š‘ΐ`6TΨV γT@EƒΨŒΣψ< Κί›[]ΓΌV ΙύW*ιιGNNDέPbFK4rόΝv 4h ³Ή™E”‹{(¦3Z5υqmPy’&«D¦& ?Ύχεήˆ,χ§ΔΖY E"³žΪŽ=6γΑ²f 2€HΈC0Αη – γ ΗJͺH} #ˆ>αΨλ°4AρΥHτεόΉŽώλpΏxAΎc=)tˆ!SAEt#°«+³)HŸΌϋ Fy4Ύ―5_ dΌϊJzφl:­¬ΠβcT©±΅+rK΄νͺ6©’#"€*kͺαγέ‘45Έš :ςy‹ΣΉuZΪRϊ‡ϊΣΐ₯’Zχ1ΎΣ΅Dd»^ƒ2Ή5�]»Nͺ@1νžο₯Λ/₯—ξΌ@›ϋ~–}ζυ«χ�“gO�&ΰBΕ Η�&τ‰ΐX†ΦΈλΒΌE«#·°Ÿνin/ζνc(νDεZˆd72O~€!yœξΎόμ ŠDa˜΄Œσ\t`ŽS4laz–\l EŽπΙ©ΞW%Ρ>€€ ",? ΫΒ ž—T @sƒ—‘ Br_κκθΕYΙ₯οΎωVZ|φ,]»r+ͺko±6ϋ�]λaV9{™Pv”8$ϊZ !Qϋͺ=Ξ…ΐVςή ϋƒ³Τ\wηςˆhm#χC‚Ρώo=s.m=¨S·i{@’c^K°KŽE·4 Νσξμθ‘πή(½Λ§ΉŽσyΔάV:ζ€ν./d@!ϋπ˜kXΟ€‘ό_;Lh€³ΦΘ0<4’(xΆFχŒ$ΗΊ‡³a{H₯f7ωά_ό⟠γjςs»Κrε₯ΑS/€χΖ³σ½σ© œ5pΎΉŠΏΣΙΥiφόUΣNQΆ— žέƒετ;�τŸ€ΛΗp”W£φΛϋS‘E+\ζC*²cΛ BεΖq9₯¦‹ηZ€Qγ_Ά…υtz-€)σλ}’A­όjΐ±RFμΡR΄ƒήσφ9&ζHƒkδΪΤΧJ‰&ΒΛzθX™ζa‹Λ:@bŸCΆΛε›sάsξΩgXΰ vrΨΒ—0�d|U6Ÿ";ά124Ί;;"΅gck(u ηΖγzkK| j(tΊ«Ό`εHίhδΉΘ:‡₯SLλ8+ž‹η―˜Ζεyρ˟…lœkWŸ‹?³š£θ)@MSUtpbwΟ—Ο>B΅γΌ^Δ™ζΠ`Y¦ε£Ÿ)2§οΎσn%2ϋ Šύm¬m€ο? Ήώ°ϋ,ŒΘMΨkθWLœwΫhVσ}žH6ήeΜqΰΙ‰Τ~φάΤጳکͺΞ>ρ)ͺ{†¬+‘ξ•§π ϋ_§λ`‹Β°΄ί£°j ΊΪφΐυTΧοl€+Ι*χηD!Ÿ­°Ηωf‡„Œεa7-�JŠθ9OΆ΄έγάΛiB/\bΦsΆϊΨ3₯‘Χ(Θτ‰χΣ u(n½τρτΙW?l> (μT€seSΔ9(£‡ϋz©Γω™₯ΰιAeX#νuŽΝgΧΡn"U£šh½ϋΧZ�›E Ο›pΚλ œ ΪΪZΰ¬ Y'― �¬&““>ƒvA²H “‡bίηӍ«Χ±7z`΅P/ λh�ΐs5ρμΎ£Πi Ο«σΫLP₯–4‘rΙbͺΰ)‹dŸ=αxΫi%)XκyT°iϊ; ;»·ξά― β£3™κΚ.;‡t‘C,Jμ5\σXA==8ρ° d‘T:Ήg-τ§μΨ#SΕΪ |ωΥa«‘+uͺ•{΄C―‘ΰΩgM7¬Ηf4—εΔ_�ΐΠ@Pτ­΄²ΪX]J—ΖΗ±Ϋ±ιZ�ΆΚ£Gϐ§‹“n†…›χw±σ`· [Χ, xЎ‰b–3Χ-δ; †/eMS#φ*{ΚΏε9²MŽζ Š1?Ύ‡y«E~52χG'ΆΛΕήβχΦΔ’m₯ Λc8oΦ3ΐ1EΦAv¦σμ'�Υf°_lc-σRΐ[ˆ,’Ž�‰~l υ <Ϋ"•θ5Kl‘m-¨Α6φŸ·CΡΞV!=z8™ž>~ΜΔRo(σL-“αΩΟό‰7ώ‹?ύΖOόΓ\χ-Πi·—}ρΊ˜?ή \Όωϋ—κΣ •‰‰‰šρρqlU3φ~ψλ•ϋιϊϋΎτΧ~σ―�Ε…₯΅�°»΅±κπ<+|·B―³"₯V₯hnΩ άΚOEgtCGK,ώωU¨κ€ψ¨J„¦¬σXuk1Žπ*‰²I΄β±ΘάΜΘ«(/jE ’U‰¨ΟS €·chhι,Λf¨#GMγ2’ρ(0iξίψζ?Cΰ^‹ΘΒ&•iΝ½1v#Œ΄}’uΆ�;„YΠΫ’š‹χΏ�vΪΖ)΄�―EΑN0(4΄yςp’U”R�X5·DΩΌgλ ˜ο+ύΜω 0₯ΒΞφί-`<ŸΣgΛ-ζM:ΕΚ 08ήν (ξh}?οί€YGή*Ζψކ2sνσš3[­’Ζψ­4²Jγ>*μ”Ύ9“|2]@ΪbŽχ,Ν/§{ογόβPνΟNΞ!ΒjrεΌw£ΞϋΊvŽGg&Φ”ŸuΠΌ― …JΩΏι”Έ>‚�» ˆXBΚΏ<)†FΏ5ˆνv‘’ΥΉ±>… ]ΆτΦf’LRӍ`˜ ΠΟΤQPͺˆm&—¦’š³…μΔΘ€Ο\JuB;­§·xWWΖ#ιΠI?ϋƏ±GͺΣNr”ΧSθ‘Πά1v¦ˆ-ΰ„]½}3έ}ι.Ÿi ‡aku%-`Δ.γμtΜ5t΅@Η§bu…ά0―@α΄+I†ψά,9γŒ/_{)ŒΑ†έβ³§¬§Ή«)-m,ψ%mΏΐ·[υͺqŠ%EžΓjJάά& pρΏoοigΛ±Ύξ!£άώλϊV`y g½ι\j„EQJ�kt[GΡ”k+ δ.k!0ΎΚ½W™+ΞΣΨΘ•8―ο½ύ]’(Ϋ€£ά X_D€°J 4ΪGΎXX³»›Ί€υ<Η1y½{δΛ{‰)Έo-ω²ξKΧ΅’H°,#χŸΐ’"βΗΈƒ5Γ³ιq7άο�΅ež˜_KτϋƒΟω‚‘0XΞ1|y4/r‘q²S‹嬑@�sX(ΆΣΨμ$2OΤcYTΔ«ΖPd¦X7ξ €ͺΑ*πΘΞ£KoDγN €I ΏυζΧ©/Νωzϊθ> ’W0ΨΣ7ίzΆΖ.χΖ.ˆΞ₯}Ξ\η»PΓ3©<ρμΈ~:¨ό:Χ~ω;Ÿ7“Υܝίω~Ο…sε{K€.ύ“τυ—R||ΧY‡ jυIΡ‡°$ŒZVΜyŠ κ4[[¦{ ;€o|ν[ρμj偠g_ΐΞΟΘPΎqCM�ΔΧΟ&ΥΫά^Y!>BΫQͺkΈh*°Gάb~ή/ˆ£ΣΧWVsνͺpڈ–γδZΡMψo2ˆ·hMϋα=ΦyΞΉ·ΐe'N¨yύΞƒΊCά"„P ˆθn€=τ?η‘ΉD^ΖΪ0¦œ½�™K­vηΝgπεοόY*¨ώέ(˜ŽπεΞ§«”Ώ8ΤΎ½Ό―@‚TwsϊM±q<ϋμΕ¨‚l<¦VL{ߚ1|nςΙ#ŠΆ¦±ρ1œλμ¬²——ΦΣΜόb8±uΜΐC%ΕY†@Ϊ {²­£)m‘£ͺσv‹Ι#Kqκٟ₯}Šb1«uŒ™b˜ψŸτTδ›δ^ΐω/ŸαπwΒCgwBvοςRΔQ―(8%rlΪΨπHOΜ‡Ί[fΣ9s ΏαΈ„œGήKƒίβΎ κ”νΓ=š¨%Rί@g|…š.eτΩIŽ–¨ ή―Υ΅U�y’FG.„O¦I,` *؏BRˆύ‚¬Hmj­Ks‹σΑ€S~Κ\·΅δ ‘p£εΙ―‘yƒώT_ZλAy `ΟdF»JΑχ±φͺ ω޳ΙX6ο`7T0ηώ=ZΏ²'M…άΕΡ €ξρ£'izβϋ­ 0|(“UΚHe%ϋΞΆ₯£Γ#θZ�ͺΨ{5¬Ο9Μ žxU°,Ά«3j―o0@0Fέ'S τ³@�3Μx<ΥΕΚθ2—2ϋ�Hƒ νδΨ·’²±½pΘuL±fJ[G7vΦLμkν9eˆ²α=³.Ό’\,²/LI°R-ΰ‹iœ­θqψA0f},μZ‘./¦"ϋ·`«΅‚ΒΤάί=x wJαέ1Φp“³ίήώYδ―5΄Žh­ΈΙs—ΩΓKl<�yΨO}νΤ@§ν«Ηo‘gQžš6#;G=― R`~”kΪiΪ&±Ž¬Ή²VΉ―-ځΜR―S‹λΡ+²¨,ž{Δ|±SaŒeΊ·b8ΚyΟ“€±rΩ3ž�ό ή΄˜θξΑJ0οLγ\_bOΧΔΥRΏbaj)MSFfŽgοΫGίIc7n#ΖτΒνuX!œ‚ΝΥε4<ΦϋήΟ�λ?�~κη��Ϋ<ŸˆVΌψ^1xρΊ˜?Φ \¬ιϋ—λΓ5w—ΫŸΌυ‹7Q ι‡Ώ>>λΕνεΏύ›�Ω—�Μ½ϋ�YAήLη#θ�EŸˆ9‚[ΫάΎŒ―(·JόΉ€a(ΥNΓ©BΦ€%/sΔEbw‰D5#δΫk‰’aR/¬,D—Tvl΄ˆi š›­ΆCέΗθρ =j[0΄€μ΅bœΎƒόϋ^•p%V₯Κ›ΌιΕ•Ξ0β瑞2.[ΰH‹Χ Ά²|ΉΛ›K+ιΩϋχR#DŒ8ž‘(D’ —:Q¦}¨υ�lΡδ(UOΘύμεnώνΉ€~ρ> ”j‰χνμ-"VID]FyΠ„™ηΛλθŒρπYZ NJΧ7Z-υPފ²³ς·‘6B–ρμR|-ͺΘTeTO�Σε»›ΚζKDλ5°:Ϋ w£ΨΧθχ|ώεο@ΏX+ŒFd\;ΠZ uV`Έ—)˜Θ xN�ΝΎp*•σD!IKΰ섁ΚY€Uη/AμQ2Dξ,±¦ν€™Μπ̝QΆΕd#ς¨‡η>_cΏ";¬πoΏ°―~e!}�[ί‡Sν­Zn1Α-ζ \ YHρ.dš²ς¨†½Εsκlu—οtdύς ZοΔΌ^�ξϊ:^o Οφφ:σc{1"cΛΝ<�‘N"{©Π@0j›ϊ,ξίx1�ζ »+aŒͺŽŒs- Yκόλ‘9Ηό]WΖ9VVJ!Ξ: dΰh­o4uΰςε˜ΣUAk€Τp>xFΗ©Ό�Q1₯Λ3.°'X%ˆ4ωZ‡€Hͺ D†€&ΏCŽpV€ΧηλZΣ.…Ζ–ΩG-€/θ@ΩΖ�Ώ0ΙΘκδΔtϊ€΅‹ηοΆ NΜα!N^˜«sj ₯ρ‘ν)Κ-{ηΠ9Q.fϊZ;k‘όsΜ:z�{oci–άχ\o�7χ}©\+k―κ��^g#{Θ‡&₯1Ι0όδ'Ω~°aϋΕ†Ρ0m –’8cR–¨•†-� ‘’3δμ=½UwΧ^YΉοϋΎέ\ύϋŝ€ί ž@˜Ό=9™•yοχοœ8q"ώρŸUΩh%E`\°,:εp&ωl2Hάc:$ΞC΄ξ»/Ώžϊz;�wΏύ'0ƒEpΒ·ο*j~πύο±οΣυλΧγμ™„Ψ!bJ‘ΥpΒ+�KΝC©hˆJύ€™‹μχεe˜r¬NEK-οΓMB―d-MΏ)�„’ΗƒΓ&#ξΖΖΏ/dm |ΡY€|Y€―ZZΞNΟnBΙ.₯8₯μ9ΜΛ>{ε=iΘ₯�φ΄Nυϋ]‚"2O9³•5ηΗΘsΎp²Ί»τ;OδAΜ&Ξ‚Ϊζ�wœΪ. 00ΠICΧ�„ώ~c=WYΧ΅ω X#δ\τ|›™J―wέMM7o€%ž[Šώ4Ώ›Ÿ§²?2!¨jŠ_^.­ύ€ΎΩΝΧ 2ΐdΛ�΄Ά3dΝ󭜳ʴ ±Rδώ Β‚¬):SΩ–₯­ Θο>ΧFx΅ζΙ.ŒΉΖFΊκp=μ*?ΣΔωW³±F§j*οoΠ’ζΖζ¦ιg™RΆΗ\Ωuθ΄‚σ™„,΅ 5b“Žx―6ZI‰,L95_?κ™π3»†_RloŠΒΟκ΄kq†m2O ΗΒυ;˜»0‚οξ9Σw‘klΑ,χ₯ς_κY4;›6H -šΤώδeλ1yΆBvΈόΞ} ›―°nΝΦˌq•=θzΆ5΅Qί`%MŽς¬°X™wYμέ=�:š°έ(ψΛ8¬q³L­A&MμQž0€δ “a`Η.OC§œρθ0g² ά£κ"χœίX ΣΌJa1­ΰτ#›EθοΞλU2Ηe€ ΨΝc•σΔs°]ηu-w8K¬΅m>#HζψO`λΪ�Z2Ψ εœΙ‘>¨ƒ‘SΣΒ5Š ‹ή¦Ζ POjklJ SӜ™Τ\UΟZΑp,YϋΪίψχ~c»ψΏx½G(c–/ώοb~:3π“Sύ§s±‹«ό[>οΌ“ώγ�τΏ<Όz·όψw~[ξ�υυϋΪi¨.yώΌouu­ˆZΊ‘}QΤC”­Eqμko C§°yv��8]Γ‰”Vη+’Z8˜2’‡=Ÿ—–hE`―ŸΑ`ž›ŽPΫ w£RNKP°ΆY27ԚVξ§?ω?ώ ­<#ϊCͺŽAΖ·UΌ+pX΄0—Η0q–f¦Γ‘4oΏΔθ ΰΔΒΤTϊθ;–f=Nε€YλΓbŸFΜΖζ—Σ ΉΏ§Μs) “­8}^ΗεΪ ˜o|εΕΉ „*�ζ�NA'^Ζ™(ΓΐqžΞY#Κ°u9ό½λ]Ž|”ρŒ:n²^Β‘g/ΊgDJ§­@œ�I·γ΅D–W"ΚψδΡ“τι‡χ£Ώο΅�JΟBv,ΐεxe θPμ…έƒ5“ہ€·|t–§ Z|Ρ4  F¨•ηAμ9―ƒ)°₯Μ œ˜0Ωoʌ²(γiUGΒχΙ±3„ΐFω>ωΏ¦Ϋσ·mΰ1zΘΙ(©’θY=l«ˆ[δJφUgίQί‘΄‹dynΐ cYγ•=^M΄ΜΞ(Ψ—ΘΔv0 Œl‘"#h;G‹“šς ±k6Ζ]tΦθθxšž˜α™dkεˆ\-’ίvbΏεˆtΚ”Έkοθ =$8β>q�ιTΈnκ΅nΊΚδΣPhoH„έίωwSͺΞΤ/°(ΌžΞόγ΄(Δψ-’ξΟ3¨λάο^Σ¨šΜu‚Μ³ ›JΕ~φt”Ώ³ίΈ�ιήΘΔΉE§E�³�Β�μL!Θ�…ΌpΜ 3€€8^[έ¦ž<3?ŸE @Β΄H'Υˆ^¬Œˆ)ƒ{2$δ–2νΊ©›}6[ Ξ=€9q‰υ*Gκ€~Xwzr*M§]hΠ5t1X¦ύτxe(κ~p_4D€ΈΠδdγ°pHηΕ5=Δ/£%!αΏ! Π­έΜΰψ ΄΄w΄EΑΌc™…θ'ί'sΞσΛΓΚσςφ½—CWnΡMεύι–Bm}X;MLŽEdύΝ{―…Ξ~6:†cΝ¬BξQK€(!Ÿθ‡%΅8Ϊ0[H΄š:$ °ŽΞ5œίςšςTίV—:ϋa0ΐ²j€kIw²#X ”q‘έc�΅-,O“υ'β¬bNuœ—HCΜ2†jr½KΈΎΤuŸίT AΙθϊυ΄Œ- ±Vi Νυ©ΏΏ'έΌq=یm0‰9 Γΰ™˜¦8€­ϋϊϊB–θ„«-ˆŠ3ΎΞ™q`ݐΣ\ššOγcΟIOœ‚ΉΆΞ¨Ή?kcqΎMl 5ZTΡ³B9“�ξzΉwtJΛ)φ§mγsZ_ΓZOξ/"0ΰΛ³/yφƒAχ…ΐŸSχY°’Bφ QύΪΚHEs «<Ήw ΆˆŒσ™Yλ•§ΡρžwPΉπ<³–Ξ¨Ο5 Έοy=~`©v†²c«Zm!χœLχΌΰƒ]ƒt˜ΑjΈΟΐlψœ~i»Ή§ΆG‘DޟOeR/ε;v Ω°μκΜsΪA@GΑzCv#Ω@ιΉX(ͺ>2]Π{˜’‘ eŠh_OΪ'psψ`Ϊι gΐΒ4Ο Ϋs s™†fΌaSΑΑ©N“qb*v)­θŒ&@oεΘ4QλS9/β–‚ Ϊ~ΖšŒeΓοvO²ή2§l―θω΅‹n•εj= k+™�`Z‚Α $ον=Υ;€~—ύ ½«ξQ&φψ·€m±­`qN:nxΧΓ"γή³}Ί Ϋn™/kh9^Y³K ΣΜοnΪ¦ΆΓ1σYyΊ—zzšΞ~ρ—ίώ»oνΏύΧ_ΗΨΌx]Μΐg0ΐΑg0©�6_ςλ_�ϊΙ�Πΐg|ηwNΏρΏό‹ηΏ;πoή�ΰΗY(lw¨‚k:j:ΪαΠ"·�¨­Ήpϋ�Π5jΓY14rL+ݚ_wDtΦƒΡΓάCVγΎ΅c…�³Q=Υ4‘Σ]¦aΚο54v¦ ΈmξΥεχPkΔΡ©¬3B ϊ!QBZ…ŽscΡ*’ΏΆΕ³xT5@#ΠώFψΛ084r<@j`LqPΝΞL ‘εΩ& N©ŽΛΒβl*˜h0ǘλmm�FΡ°"Εψ!ΖΆ £�9‘κβ up>σΖ”4δ<œ/ΙΨp8Ί@ήe/”1%GRΪa1Ο\€1VΘΑžε~εΠ5Μ‘i!ž|…‚D/9|t ’Ψςʈ•‘ΟR��!ΖαΕcΕ!fυ©mσYi#&»ΐΓήz+Ζ²FLˆΆy<›έ€νι”™&ΐ‡βp΅ΪσNΣ‘έ) ςΫͺ¬Zκγ:fμ:ωœβΜ ‘!ŒŠQi¬::%Y:ΦΒΚΥ‡ΆΞc.Ό~8l:'8μX QuYωΠ‰σΐΥ±X[§=ηsNͺ«c” ςZ‘,cα8"Z²ΉAk.ŒηΒ2’φ€έΤ™―&―»˜ϋMφΐ:Q6[Jž1ί¬‹…β¦σƒO§r7i‘ft?�\OδΚ/A°�–ŽN©ΞηΚΘGmc#·ύ<:Γ?tυσΤΨβ£:DΚ40R˜oΕΩΪ!:MζŠ?yΚάala0ξkΠ"O�§Ή${9οhΩΚTCΫΉ¨@V^Ή λωΖΈ'Σ±Π°Bδ«€Ε# 6χ�u/N‘Θ䩇t(ε`qi…η!Ο—–Ν†Ϋ)¨*φ’QBdή"§:gd2’έΦ €F]RΜ—μ"#OΆ—37·―ŸθΈΙ‘aƁs©ρˆn°ˆάΟXψeύ³ReƒΦωŸ:g] .ϋ<ƒ�²΅€@™N­Οc/z3Νr0™Τ]₯¬©c–TiΦœ‚hώ~ωμΣhΧ uοœ;ώNYΠ!Ρ±‹n0|^]m­ ŸΥNMθΓ% –Eg�{€c nΦψΦ!9¦.ƒλ•ΕA-"…ΓZ KΠlΧpl5jϊ“ώε)ϟγ3…¬‡zΝη p™ƒ#ΛΙb” b Ο–( »ΏDTš9g›λ[δΦτ"»$œ k›’U©Ž$’†Ξ³K`«Sΐϊq.xF•0§Ά£SΨοΌηVB{ίNs}Τ 0}j‡΄ΌολOΒ±­<υŒΛ³±L@0‚ιskD–€ώG‘ησpΐQn O«AAΗ_}ξ‡@¬Ψρsήεˆ&–ElL7(ϊΪkwιΠDΕuΞ;£(:‰μXCH&[ΐ‡Τz Ύ�n-qŽ”’¦�ΧόΤXμ'4©5[Τ ΨˆΊ<—ˆγ”‘X²œƒΆ?­GΟ»ΦΟ&Ζ™ηbΝ ς_›φN/‰μg³€cœ§kθŸCΖ_αν/ΎŽΞg¬δ½_½2 Z8ŽΦΦ:ηΜσ�slύ"εΚ‚Œ‡¬—ΐŸ{™:ΔΦK8Α쀦ίήΩzΆ˜}g žH{bνμ,S‘†)L@IDATJΒύ"σΚΐxww[t&°¦Ν1i%:mOžΣRs‡30³±π—7? ηΛn50gαM}so[˜q“τ¬-Ψ69ΐφ‚3.`Ή§#Θώ4²Ž„ϋBQ6S°Bx.4eά. ž)@‘”M¬·3ή‡9@ΏzΕβ§�™m΅…΄κλΛa^Πe‘’:8–ϋŒQ›EΦ›gj†ϊ&O‡ΗΣG^P Ά *1θχάΛtΗ£lϋ»=ζΧ‚°vΡ9ΖAXXkΊ4ρ<:§Ξ½L>ΒύL%5•BPG0‘λ³MŽxvgPhω8αύ‚˜n!­ mŒC�EgYŸe‡s>Ο α όΟ΅V…Ÿ"呂:Ÿ~Eκ"ς?o »Εωυμ5υυ4ΟΞςρ™IŠ .‘Γ*)܍^‘+²ΥΠΦ“₯‘θv1ͺCχ8ΣR­Eg<9ϋΝW ϋrΨJʁ ‚οΠQ^νώ’2ˆP›ͺ₯.u½eYW§Tέοx―Α^‚Hʊΐ„ΑΟΣܜμφΠΫΎ<‡|fλ+ٍ¬„³:RK`) Λάο’όέi9«¦!Ÿ%g›©­Ήτω—ω�αWΏφW�Qkw/Ή†―‹ψlfmvρΊ˜�3πNJο�dλγούψΓϋΦνεΆοZcΰ ‡U‡C)Κέbeeε*m#?] κ8) δ*QQιrώ�6# Ω’o===qΨ ΤαxΏtυ 9‰8φ―ΏϊFTgšΓx§ΦΚYjΊωϊΥ|Άš¨…ΡB‹οYxΘbƒ ΐ:eω YΌΆ8€Λ˜ ,Ω7�έ_Fl$ |ι{FAΖΙXίX₯g6­˜h=ΈFDbΣθχ²6BUe6’IΟ1(Χ—ΜmΟFapaι$itDδσ߈FjχΒΐ¨†}!Π!蔣k‡Ό· —[«†B`ε8«k+ΤZ˜I—ϋ/“vPŸ~τγχ‘QV¦ZDYGΒg0ςv¨sΚ{›4jYγYΖ[ށ½­ψρίM‡¬C=UΑ&#ΨΆQάp!Š~@Tμ`›θ7σπςko₯cεxŠβš7«33PC‰.š΅[Β,ξ@ˆ5 kh”β$R²²ψ6Χ£ΥjDB°Q1Z«Η rυnΐ«…n?ρb,ΖΰΟ.p€λLδΪ:EεEe@½΄B3‚Έ :ͺω#£ΚR9σΞ*ϋΜ΅ΧP¬”*G?Tso[ΞLN`ΐ[€Š5xΐ°T.r#:Μ›ΡB‘οFΊŒUWbΏώΚΥτζ½;ιφΗ,rЇ Q…½fkS¨‘Θ— ›ra|DΊΉ~9cνθμ`Ύ,i=Œ|υ”ΡuΠ`.aδIλeωΒρ8#Ί*_ΐεX=ιz ~ #QgΏΫ6«¨θΐΰeΦΌ)MŽQ\υq8<Q8fR˜`μ° ©- mcgT‘ W8Ήe�F�ulYΛ2δu(ϊQ=[Œ3d”^—Νγ|εyŒ^’o~ΉŽ~7βθΛ¨—οq]ρuteλhDv€Α?#Ϋ44�ν}lUθ^•JošƒN‰χP+Λ›‘²Εn‘ο s£>ЌvΎe2 ΌΖs²6‚Υ<’’}tduψΊ_FΗ†m ‹Μ*ΣMPάΛ²pŽI½R(k²ΐόYgΗ‰3•Eά3Jφ–τϊh ˆάΨϊRΪyί•«Ρ:ο3ΏTz―K?}€# Ζ8•ΩcζP§A'Σ5pΟY�  Η<—tκ¬μoλ766 ΊΌ&>(f;;ΤΤU¦;woΒh’cŒΐ©5‚ΫΆ Uδp₯ƒϋœΟ3ϊ«s€Όφ^κqΛp&Pψ‘οΆφs™†g=Ÿωυ7_‹HύΞςτάlZ”Διrά5oΛΒφκ’ρpΉΌ‡Ωpm¨GΌ’λΡg½kχ–ΎΎœτν¨ΒΏΕ΅·`�Tΐ˜3x`wžΦΝΞρ΅ά�\�”Oe#qτƒmtΫHΑ2  hnZƒQλ΅-˜s€ΐœ²^:Ζεθ‹σ’†εΠΖ+—•EAΛ"C™e«€h”RΧd›\χ@¦cRIΦ‘ϊ[…_ω·%iDτ9w}^eΗR‚ΞΙα”Ί {₯wM΄G”5`Ί˜{ƒž->§ο1*νR+‡>‡}Y.…ιΚΠ`tΗ)αΉ_ηi2ξs[Sξ£^ŒN‘G π» ϋŒΰž „�- Ω΅Α‹ΏχFώl ϋ9ˆƒς―ξ8ίγκχ‚ς€?«›£FBθχ©)Ε¬· cfŸΚ*seρ™^f' m akΧΈ―ΤDΪ\ŽΗϋTL!uΘ|»�‚/]€�΄W£0ΛωZێG"°˜8«vΆ�26δ&@ΓΒβ*€<ϊΉΥφq8χ™/™J�Σ! R Λ5π™ό½ Y~k”·Y¬Ρ#‹RΠΣ=„ός¬m€BzνΦ€aΎH˜χdΎ b;(ΞΏ]Q΄u€ε>κ>Y+2ΤuΎ|ί!χ(η}`seI€2l!nz„χ{ΞΙͺυL΄j�nk�L7οάϊί~ρ―�£Ώέε4ˆI½ψΏΟl.€ƒΟljΎ.ό[Ώσ/χ~χŸ�“ΗϞ}tdzۈ’†―­œΒAηΠ/ΖQ°°‹ύΒTδ"Β²¬ό¦:¨`Uڍ8αF”sDςΚ)ΌΤAΑ΄7�¦ήΎΤy0}LΕχύ?%b;ՊΈΘp(Χhτ SŸshh\ιX°εœˆ�‡‰ŠX#Γƒ3Ϊ‘„ω•œ‘a 5_VΒθΘ *Χ>Ε1ƒŠŒ!oŸζU ͺpΦpˆΤγθhtυtγΐέM=½}Mkυό�/|ΓγNΊΤΣA³'΅a€±ίάΐ‘‘(TŽΌΞr£=Τvˆ5Τ】3{˜P€gD*—γg€-Xqr2?:νώσ{”ZO«™  Δ‘Ι‘¨1mN₯ΡslΞ±­=$‰NΟΜΜF1£TCZ —p›(AFg£5ΫT‹Ζ]΅Ha)¨bΈΩό½”Χ)ΘυkWӝΫ7{* !.3‡DΑ§Ζ1Φθ‘Ž±oˆ<έTΐ(OΉάŒˆ9Ρ7ζπά© #+ž `ƒίk\ι8eqȍbhT„σ‘γ‡Γd0\£ΩΒR=TΥ–ώX ΠS[ېzΊϋΒ8]§Ω₯�~ ΰΊ0\>}π(ΝS‰Ύ˜Όy nΫεqψΫξΣΆF,•§=ζ¬P@¦ C©#ΪβJόF6χ¨ έAΗƒ:jXΏ@ΠKΉ-Γ¨Ο`άm‘aν±‰YςD§#j`݁W�Η\λLΎςκkα@έΊv½…ρa°.―¦ίωΰ F“Οj ΉCdtwΖ k\ŽΑU3fΑ§3"2«PwωœμiβgF5q4‹#εΓ‡θΕΜ’`,Y3FυmGj$πP:5λ †ςpύφυˆ,·°ΆΆb•9ΰž�Π΄f‹yώΘ‡Žb–Zg8D[+Kaž’o‚Ν‚jτέ[Eθ5[ :o:U8σ„λ�<ΰΞΨσg±οͺΛZ ³…Ε%­³‘žR'™WΞύΓ)`Ύ€ KΝΧθυωeϋΨ²PΗΪύ"Ψe[3£m™ »λ¬ ŠζS Τ{ŽΕ—Ξ›Άrΰ—/Ώ»ΥΕ~ε©δκ!dD#Z…6Ήμθ`ΐ~P'ΉκκΉ7ϋU`Ζλy€$LεϊΊ¦­«s±Ί 3„ης%Xΰ==7œοψβχΗӈΟΒόθtiio˜#=‡φ€A©VίsΞψς^Ά²“i @ (˜4Τθvm|ΉηfΝ•οξΏ½–…U/;ΓΡ(cfz=O΅~φ€νM%«`o<ζœg8/Κƒ¬: `:IΡ=ηr.uΆ\ˆZy Q�bΩStŠ`ŒϋBL#.εg6CδΎ₯­!΅v41Wεirb, ΏxŽž°ζ]λ€IzX@ ΦΘ§σ>teˆ�z~hΎωςΐξoDaŠΘ·ι8Woήmbv.RΎœ'εγ<IΊ~Ώ}λ{’G|ΐ«6€ό*j«X<ΞΪ?€³θ‰Kέ]8}Φ’)M>AŽIŸCνψŒΨ¦ΡΈΆ§δ«‡NGΟ°ΌςΡη]t\6Ε�ψh€ΪΘ ”ύ‘NΛΦ· Ys'’ύΛομπsy°9Gη¨xž j™‚ΨL|cC+gΓχ¨xlΦ;ΖλΨ»ή:ΎΎdΡΈ7¬„/ εΊ .zŽͺŸ¬δυωu|N‘4P^„‹dφω<ηN«�’ξ/i4ί½,λ@jΊ;\ί1 €μ˜Ά˜£³Τκ‘u˜ŠUœ©2zΜ•4'^#‡ώgΚϊΊlΏCRΘζΔI@O >šφι9ο5MιΩγ>το2§΄½lQhͺΆ#βΩqς­€#―ƒoΑηs°6"ᜠQ»{#@φ•g²μ!υΏvŸΕ9 €„ϋ[L؟cΝ·cr_εc¦ZhŠMbJ‰”~ώΞρ&Οβs� Ic]”#;―¬Qά²₯λR³cΣμlχχχ‰¬―ΰ^πef—¨}θ6ζ?ίε χ“ϊu*β}ΨΘΌ:DpA°4t†¨ƒMυ@-ΒΦaύ8Bν0FΧΩΪ6ΪΆκεI΅–Εnπ)$a·†’#ό»²γK@Αkyo?γy£­lͺ­σ'θη ΄‹ά›vͺ)η½™’}ڎ6:”Φo�}4όΗφΓIΨΐy%WΎψΏ‹ψιΞ»πβu1?ψΖ?όΗ�λΏhyψΰ“…žΦΩΖ΄†›‡�— Q4ΨBM¨*t•¦jSΕ|Œ£aκο5$j 8GŽiuMέϊ’“•Ιu†'ggpj pqΙ7΅ΈN N[9‡[)‡tτlηο:'₯Φ3Ωΰa’’Φ9ς€Ρa7ς«CͺΑ$ϊλ!j4Μ±Ι–0oUζ„ˆ²ΖεΎΖοΝ;…©“ΚΗw_Ή—zΙνŒjΨ:­­΄ΐΫΫΒΙ)†ŠήBDš’lϋŒί’<΅8>΅8δΩJ(‰°(¬ΘΫ��Εk`_¬Μ<'Ϊ9Ÿ)ΓQ_™Ν+ΤψΤ -’?Ό‡μ‘ΨK€)•Z&ӈ¨ΟζΑcτTc#o΄γ3v©ό»PL1} €’ sΜtώdŽΆβ°Τι.§ΒtE]yκ»:ξΎϊ2y«]ιΖνkΟu\[MΧ1LϋJ€σ τEͺb]uH4Τ#©' λnmKδLaπ7bψλΰΝ±~eY|ΦN Dβ‹― dΓ|B;n{©F,5Z¬­PΚ—uvΜ1‡ΡΠΦΦω’kDρη NΟ Œΰxu²Κ΄₯-κTL[LΫRΚ(‘a13ο«!a”Σθ λοά•k°qΘλy‚kΌuv΅“§ή@LOW'Μ’θ²]Ρ7άhλ1FΨ8‘αα1hώ΄C~Μωo$:'°519}«;/uG#«3s€:LΟί/ν@Ω΄Θ‘ωεLA€/;°kN0�jp€+‘ξK―,&R™‘βϊ1€ .Αή¨a,[»k©‘–�ΑGž?IK¦žPύ|gόΪ8nλ�1k„,o\]:Β•™’cε^ΤμκμDN³hc€W΄ϊbO LΈΆ~Φ9 ΓΉ/€mdAΞrφ?œꌘ^qΜ:ΜΠΒΝ” !Φ�ˆͺ6“φσνϊΧ ~iΨ ψ½‚Ή”6Ό‘(hge~ GJ»Υˆ:`OcΞΕu0·Ψ[,ΡΞ4-qΌΚk�Σ©%2‹pΌyGGΜZΆ’”e P€‘k:‰ϋΉ€Κ4]�¦Ί.uΔm:Ω_ή±n`|K!-eØΫͺ£¬…+ Έ”k NΚjς₯ξ Π^εe<‡μηsκϋ‹§Ά‚{NΊ%Ζ€S‰L™•Βk΄ΑBφθς€<θzηΘύp†³neυΌΣ‚SŠξr­ΜέύΛυ@GY;‘Š\~Χψ|o靳 Φ0Ύ4ΰο£�η―p¨}Α#£…ξ ��ξ\ͺwΝG'Š΅”M₯³!Pΰ{uΊΤFhΥ­^Ϊ±νcΌΫ–. ƒE™ac§υεž‹9 |£ŸκnίγžμsXΉχwœh㨙:†˜Η΅ΦX§ρρQ€λ‘tηΦ]δs#}οΟΎE)?κUYœvuδπge*€ žί3Ξ:6Φ­°�ˆ¬—Zκ›)ͺiΑ6Φ™Υ…Ν₯·5ͺ³ΡL[ΎW_π­‡Φ€0λΟH_³ŽPŽ6ΉFiυfΌ_žœ Π»'YλtΣ΅›Wa¦qΞ’Ώ ˜�Τ>uάσα'ivVo_€ žʝ$]i‰uQW·΅Q„šχŸ±‘--"<;‘ΗΝ3Eω±ž†μ" ΧΔ<ξΐJ_ Κ(/,£\fΫ›Ϋθ: j)›jY"gQΚΧ>χYΩXΑI£π/`„­νuu £8ΟΥ¨�@αΦ-Φ² Πέh— 45rJ=φ­N›ς₯,ΛΞS‡9o‚ΐΪ:ˆ¦ΣΉώ…ΠΏ;L]ρp\’�WL}‘‘‘ k{hŸhΛ¨CdwTΒδ0R¬ Οεί”e>‹J†ƒ £μ—±΅)φΤ/ώέΧc/5Γς2Xr@ZΤ!ΐ gžσ¬Ιήi₯ k2&bΊ‡zΝ€μ‘R‡c.cΐξ"v0QVdΘτ2=�ω1ΒmJb€Qpo>c“}fGΧ(l"δEZfυ]܏^{ίtΦΔ½Ξ¬ΕΎΚ³τLƒβrώώ'{Ξ=yt@«iδΑ3\@38ίωτU?:†y,δύ6[Ȉνη—Ραœo¦fՐ�gͺ�:²–c__ωe€Δΐ λI1θA]_ΡIŽωv.|Ω ω5Ο>¦“ψRΦhdϊ Κ£zUpΝu1’ž±·έjœk;eisΕxO‰Ί‹΅pΞ\cΟη�η–9β³ ³ήŒA-n€‹χ–eλY*Έ)₯ BΐΓί[όX« * ¦@diYGΧŽ7_zε€γRߏšΫͺŸ�ΏσςOvρ3πӝN―‹ΧΕ ό΄fΰτχσŸ�μn-ΜNŒŒΌš‘ιρ ΄J£άτρṕ*0LV ΈhΞp€Pΐώ§R¬Δΐ―"wΡ>Κυ΅A―!Χ/ƒ�!VA΄kEηήώκW/Σ@¦(�QB[˜ΕaOΓ{yh¨Θ5}i eτPσpχ%ψΰΑ˜γPτΠ0§Μλη8€<ΰ 0ͺt:l³€³{σφ- ΊKq θHSΝ]ZλΞ~†Γͺj΄ι"�©· Ξ_κμNϋ©ΖPͺ…²ΩHT€­νRΠF½‡”ΓJ{Y“CΪΦΩ–nή}5’₯ιEZβAYη°�π(#z_£΅ SΑ~ΣV4Π8ρ σΠςΐ Cφ‚Q©ι¦XΫΦ–υΡj0β)Ν_ΗΌZ‡঄œύrς|«(�t©§3 Ϋ…υœΠ…ΤΕsuπ|νPΡ-Ί₯/(㣊H§L‘fŒΛΎŒsƊΠΩΡN5ν©τΰΡ§8τ3ΡOΉ*ΌΕŽ4^4<σ(\„q§γωαFοxΙ 1UΑυΙ?%Π†)°ˆŒetκ/α„›φ ›aƒ/ιΠ,yΪ«τΤM#£cΎ ϋ–ς…ΉF«²‘ΰόθhΐu‹9θ5(”!«i;ήκ:€ŸΪ2žΣβœ[Πς[‰pϋ ‹ Kιώύιω³8I*Τ4Ρ€{ΑψVCξzϋRι5»·οώɟ¦•#‚Ϊ "3 ’#gΧ―} ¨- υc(·XΰΘ© 9ڜ– ΣΘVςxύζντΚ›oQΠm$΅"c%T†όΙƒt€³^„ccM摁°fy§Ώ CίΝy©Θ‚2£Œiψ‘‹(6�žš gIj¬9Ϋ§  h0ϋ]0_ Î*„MSEͺ‹-ΞdXέ|Ϋ= H‚νaΰ)/ύδώΔEαx'*f„O‘wμσ¨€�£cΔ�u±H²=7=χ=pΝtζ,ͺ1žΉg 5BŒLE•τ ζG³yΦ0”Qaa.. Υ]Bσβχ‰ϊ[₯€bnvdBxk:κ,T_œi#<Ÿ²€γΓ\X_AΩ4’¨ΑŒ’Š}ZŠάtj°VβΔ Να(ίΚeDυ\ίγšX—DπR o%{Ιί«Ÿ”½ {EΗΧ4)Dχ­ŽϊωώcjγΊ:ρ»θ\©ΤΡ9ƒU§ΙH, Χ\=±Et—ΑθΏΗη\KΧ�¬^Ήw"s³α ρVτ#ΟΜ> j-rξžuoΤYΤ`V§ϊ\‚tαΔ;¦―Μ"dπμX‡š±³–¦μγPHΥηŠύη½|εί”ކT‚ ]ΝΤnReΎ“Ί Λ8tκτ�ξžΠΑ2œΩ)ηώœΓiψ΅V‹/e( φΨΜσj±QηΩχ β8ώ<πƒΚΨ2”΅R_€έ;φGέ'υηŠu:@ζqFΈžα€ςευψ―<rq¦‘“cΠ‰bœ kΩTq� ζ˜OžbC¦P–=ž·οήnI£/&�»?xω₯K‡»>—/^QQ;eA=μ8vhq˘l₯jΊ›υ;κΩOΦ΄Ι°ηw9γ¬=QΖ>ZG·LΑ>³.@g�,ξ)κ-­.8�€‡¦ξV˜]ΑtΨ·Lƒ�F²μ)χ₯…Me=Τ³η)vh€Wpΰ€ρxφ›ξw¦ˆΝ‚Μ°W ψ%pa*Ÿ:H*ψ)ηo! ―ωγ›8οξϋrRηR)η {—&P(‰5ΐ‚YX«€<³Σ“ιɳ眍€ ΝμΝbώΎ²U‹VK:Γ žΐ–p Κ—ΰ‚©1ξ�χ¬ψo°ΑsΑ}κ3ZŸ)ΖΝμ}½¨΅€ΫλάE+hχ?rοϊ "ϊ~υ‚`‰6J ΟΏ…Ξ½©άq]™n\l"ΘΠΦޜξΨ@-HSl=ΈΚώu(².ΖΖga³ΝΠϋƒ{&šͺθήTg(Οκ`m ;&8υ­Ο*hkί{Έ—d/䝑νΰώL–] }αœxλΘpŒ}Ξψ•Γ¬ϊ ΉΧΆs»‚@Tί‚Σ=ΌΞΆ gΉ:Ψω΅Ξ`2ΰϊΛ.‰}Ȟ?A±Z¨΅«Π›ƒ³z†Τ»δΌ¦‘>RMη�"'κ ν#ΧJe LA$uS«Ν=¬SΟΌ³F2<χ\a ZϊŸΩωΣ\p|!όρ§ŸΗΊΎŽ[€7ΊNpόœŸ�ݝ/K  @Oΰΐ9=―‘ œ©+MgΈ’ς—sΔϋμX%¨!€a@Ζ±*?EΘ}†ξm¦!’ήRYση�Ιφ_�χ••M"Ήx]Μΐg7ΐΑg7·?—W–"υ{π§Οχ—Ζ¨v}ZdS1ΪΉΧBŠό~Œ’5 vΩ8o*uoi]Fο,"ΨDT¨ΏΏš1Ρz߁ώήh½—G‰QδπD#<6ίΊvšMš οΥό―9Z'zˆzΩώμKγΨΓΐƒIΓ<ΟDπ ΟSΡΒϋ!‚j€K4Ϊ1vοΥB•τkΧ―§^¨ρ9"λ+::0jl‹…‘ΔΑΥAκF"φ‚ί>·<;Ξ0ŒJ9(‡Δ‘LJœ ιΙΉ½υΤΗ΅ͺ`d‘6΅Σ% ­=έ ²uB-€~λ»©˜βu5ΜO‘Ns&€PLΚΐ €bœg ξξαpm#’ΠOIu8Β±)γp1ͺnλ@ΫΆαxΠq$²ΰ ½2’S€QT=Ά³»=]½q…¨z/яfz”oΠλ{<θς/C«―΄pMΚIaξmU| QΧMΰΗ"[Ίjo₯•Ρ›ŒOi¨:Ι=—xvΪ„q@G»"ΒP˜ω&±D‚"Ω,•– ¨να| 1²qƚΪZŽgξΐ‘Η8…»lΥ¨ΡυπΡ}ι3�'nq¨2_3#/&Ή>‘θϊ1Σ`°b³E�Œ( ~χeDE£Α\m£“VΓχΛ¨K1k#=Ν­Ή1ΏΊHž+•Η1T­?ΰυvΙ{}ο½χ‘‘/Cγm‚…Πm˜2t»΄ΖλκνI=½τ£^^&rNT Cδi7σcDσq‚΅ ΛpNlS¨±S‚A³Ά4™±±NΖ‹Š4֐•ΪϊΚΤΩZ€“₯uβUXυ8εΤvXΊΊ’ž?™Β&"…³»Ot©£[§σ‰ΧΓΓ4KD1·(‚hτπŠη°“”νF€£΅V–7ebmqΚ/ © Ζ� ΞXΨ㑃ΡW@šBΏ+εΉt°³ΘZI9 i":±κ‚"j=”¬ιΘ ψ2υΐΒ_`ΞA=F’ΤίΝUΖF”_+€ χ#NNF…00άΓκbΦ­†WAρ<’»|ςˆ:μΐ»ΦȊτ:ΉkT’ΦΈVώ0q1ROΣ•Λύ€sPΩ―Fww«­ομ0ΰ=φ(Šj4²s—wnNqrά/2JŽtώ#ΐΦR„`Lv­ΠšVΟΒ¬*ΗΙ*Α9,gmτ?dF!_D›ee•ΰ8–±Τ>{`žϊJPΣμΨp xžˆhsu ί††¦ 4z5œ·—Œ43:NPG…=f‹Ε]�iAΞ_ύυ_άlID–ΧpΖ½f baTν­_ϊ…TΣ�*pb�½|;]μcνqvά£ε‚dηΖτ)^ς!n+γΜ;ΰ, cG7σλ"φž5F”iχΎN…zόΌ±ψ›² ƒΘη$,γšuΜUί­›ΡŠΣϊ _ύ+±ώ³θӁ~)Ίr]ŽVμ³ώ> z"83'Aγ]Η@=•±ζξ}ΗmR#Ι֏1ΒξΰΤ³Υ²£s1Ÿ±£L-,[ΐκό/ΝΞsœ-τ‰s­3fΪ…²iΣ)λα=ΝM7=E6ΚŸS0O¦Ρ™²·‡«" ΗϊΩΕI.*Ε©Y¨@ζΪ;ΪSŒ6sǟ}ό8MAO0„ρ:Φ&XvQtΙVφ,ζfDά…΄ΰct(°q LˆtU†€ξ5RΤ/ΚeaTxXX:؍Y7ιε{―°š%ι )Jk€ζύΫzS°wzrf†Ήˆ(/$μζΜ¨Β©―’˜β6ηΠΨΤ8υθxΠΫΝΉ^°y}Γ*!·‡F΅zNΠ#εU€Iξ�ωΰ,PNtFZ gΗΰaVaηB6ίώΙ~ԟ°ΕΠ•^tίPS •Γ±YƒΒ΄©M‡Μ«Nπ>{_V„lƒpЁe AΡi‘ε&…ίt“¨Q‘ή€ξD³Εy.ΔˆήσέVληˆ Ω2z�|ΛDΠYP’ΉECP g½ 8ε—Eο =Ώqv½W†3¨‚ ΑiAΎζG6€¬8χ¬i₯ΘΕδΤi3t˜^ŸPa²Η¬{δϊ˜baW(νt[ Λ¬)δί΁LΐηΣhάκSŸΒ³QΙ}ōωœΏ3ΗΪηL# ¨a}|}₯”o—ŒlΨϋ€ΉŽ&• Α$οiW£uΖWOŠIm ΊŠ"ƒ€2쳊*ž_ ΔΤσχζVΞvl©.‚Ϊ:Ά­Ά£‘Œ±&ΦΔOΕ€ΩΫ[‡i}FkgAfτ|κ@(g�1η{NF* ƒ~f~tΖ™³`}P;Γ`“:Π”MΧPΐ3κΒΈyΟxΑ9AζφqLΏ9L!τΎ^ΗuχΛgUίx.ΊΞό’ϋμAt‚²ͺ^ί$…ΖύοCQzΖ œ; ΦέΌΪeœnεζ” Ε‘΅•Z›©1RE]Ϋξv^ώη³SŸ�συ―ήΙί$ξtρ3πӟ ΰΰ§?§?χW<8ύύ?όΦ‹…ΉΡχi7v”ΊMCA%]F=iς*dσ”5άΜΔ„βpeζπΘG}9¬q,Œ ·uΡIͺ%Β›εσ{8‚FŽGΈ”½FŒPξ-V ύ "ο:E2rμK!�’ŽΑ%uΟ΅N₯FjΪ(ς@ζQψ�ΖtBνf|ΈFͺ<@5 Μ;?γύ#ΓΓδu�…ƒœ%±žšG$9 Φeq jQκυ<η1Œ½œ5֌ryΊ†‘YŽό)Lx±©κ�Πυ‘τς+χhΫ·†Υάδ՝9€(°wΚ<ψΒα`‡>‡1eeξ2ςΚEΡ₯ΘρβŒΓQŠs4QΞ%ξ)υ<Ο¨ΰΌ §ΝuΩaήφHγ8Γα;%ΪΦH[ށžt©Ώ „Ϊ|v‡W£ΤθΪ)ΤXsΨmk…νϊ-8B[*ώ³°“y KͺF1§€†¦χ�a,Ύ΄&ƒΥρMΡAlˆ‘‹wM/_‹‘±žœtΜVe$ψΑΡΐ *@I}―§ΜH/g‘ˆ ‘Ρ>33Εϊζ0¨)Κ‡‘126ŠAƒαCΆŽƒ H”?€ql™Γ0π0ΰ ŒT("ϊ:FΚ‡†ƒ70²cD=¨];,|ٍ|jΌ”‘{lUωrζx ω³υ_y¦*έΎ} «ŽΘΧ3Œ?Zβˆχ_»ΉΉ9Œϊ"°Ο>ΌŸžόq:ΪΪ¦kHs…cη9αϋς ΗaZeUΪenz:RGwkj&ΊώςK/ΑόhΕΩ©’Εβ^ϊΆΓΗ=˜‘ξLή6Ξ//‹Έν"…ΘΜ’Ρgs…q λκfϋ˜³Νδ 'FXΘΕI”eγ^α-μUθωG8š±‡5nψύ2Yΐv(Β_Φ!_€@a9ΤtlάΘK5§Τβ’§�­s­q­μΈ7ό¬Ξ₯”ϊpξyŸŽ:Δρiάi‡£ΛΨ₯`k(!χυI»Μυ2NΡ"yΐ[%ΘF €Iΰ’2dΔΏθ«2d„-’SΜΡ@†jcjƒ&όΉ7ήL·―ߎgΎvυ\n§gO†1μ¨k@A8 !jlΛ’8Εy,ΐΠ-e³υ?Έ+f\vώΠ€Œ|UΖ²Ζη’ FͺNζ2`N ›ηΠu·πUΠΝkδη£KFφ‘λ*‹n‘‹7>ΐ<ε žΚΦ‘9δK§Ε΅u~§£)Vw_»—ώκ―ώ:ΰy/_N/α6uuDρWι³Xζ=}QΔ7:½υΖ[€` Α€Y€6ˆΕυO8άߟ5‚έ;:+ώœ�wΠΡ)ςίFΝt`Υ2ƒŒFšoŽg€�½λ―�uΜ±Ύqϋ%žc=΅ ΰ|eλΖmt�UΦ₯ͺόσηΓ1‡^³Ύ‘Ή@^xn‹ˆ– S”/€.‘ Xdδγόωbjς2ΕXWPθΡKΏ­;·ΘΗ ΠUΊ8?™Φ–©}ΐΨ솳BD=ΗzΛΠρ0J,€iDέ―_ΛΈόέ>Nΐ zΟϋΔ}ΩKΗθοtͺ D‘ϊG= ± P[ θφΚηί’BΜ‘'|B4œ”+dίkθΕΟάW <’ϊ:1¬‡¬s!@o”r~f6½xς<Hάί;ϋOye�ΡZδc6tϋ₯œ3δYk¬oŒ.0Φvio&%Β} Bn#‹¬%.XΊuύF0Κ’\·bζ_Padd CgΊ:t5τ†Μ©Φ³Σ qDYoΑn/Ξ•i<-fΜ¦<‘:1"γμ»E±Dήo—%kπ\LŸλσ‘ξΆλnτ�`Σρό[θS©�ž[ϋΆT”e„KΟsΎrΝulυ™2λW8|ȞηΎc‰(4λ'ΐ©ύ‘εΩ`Ιψ^e^;ΒΫΨϋ‚h¬q>Š―/μ~Ο3όΐΎΞ±c—ΑΔ s’‚–Όo[石έρΥΑ¬τ\;b ςG›>δf~~ύΐηLΥ™’H μFφ¬rΰ=΄It6Δ`y˜₯Cκ>ε Š'k0ΐΌ œψœκP_FώC?1χκΩΠY|@’ŽΏi]²x‚BΟϋσΰ¬6ŽΙ‚”κζdSΰΒ—©A9δΫ½_…}β\;'2~ΤO„φšΪ‚ΎGY΄+A umά[eœΏwξά¦KΗ@¬M�ΏFν(k*W“B·Λ:LŒO¦%ΐ`€H‘ΡŽπ~ -07ΡέαuVœν@νΑqλ(ψ;υΓμό ¬œƒ`έp‰°KΌr”Ÿ'ΐ%�οΉ#£Α Œσιs ψΏΈR§ ˜Ζβ|Λ>°°�σ,{«‚ϋϊ9ΟήgŒg€5Τ…ž%ΎN 2¨²°pGs6E₯ω&Ρπίώ₯ίψ΅―.Δ/ώοb>ΓΈ>ΓΙύyΎ4ΰΑΩ½Χώbώ—ΎxϊρϊϊJ?j³§œžeFŠˆT‘¬ν?o…£»•9˜2WW₯�γv©·= ^¦Τβ‡hδα©.�“ΩΎκυ–ΈŠΓΉ†£žΡΪκ2΄βUŒ€�‹½ΗAμααα„^ζεΑΏΎ��1TρkthΤϊ7Ώ4Δ5Uώ8ζ§•”JWγΠαΐΣθ4œΪ»§χΒqy CόκΠPΪΫZ†AP”†�Q4–S‚ϋlΠJo&’Π΅ Δ[°%nέϋ\Ίωζ/§ hgλΛsΪ«8ήil”όg]Κ²κ&ͺ@C_Η‰5�θo%Ζƒ†‚y³:AΕX:ςVύ5/άη°˜†¬ΉΊ:�:g>“…)!ώ¬!@‰}Œq[F6D±G«o@a~6ϊ"=ΆΈ'9œsDo 6‰<.-Rα'½’ΒyΆ|4οw›xΫXΩΖnΧ(ΖΐΞΖ!tϋ.¬‚Tƒγύκ―₯JŒΰG�šπI8aF.N™Γb°ςL5)�FNL§]β‘jυuν Ά‡mkΓhΛbl—αtΟΞΝEQ¬Zω™ιI蝴ΥΒXθΠVŒμI±7wΪ\ΔΘ§Δ1"ηό…ρΐΪz£z΅v„°εž'Ω-K<“Q²nVύΖS‘ )] ¨δmϋ±B Ο/Θ^Šλvφt₯"y«€M͍Mi 9]M €2`�F ŽQ�膁Α1χόYZβy²Ω6Z“uᜲntηΘ6^47€v˜8W/γμς]ƒβργ'izqΦ”΄Ε£mb© 9φ€ΰk_AšΕN³Ρ ©―a(aάd½«mοt>ŒIοήdŸβ(―±–ώξ•Χ_gO0 Ξx�3šΔžΞ·Zc˜;‹bi¦―�žτ€fg�š-•Ύu�YKj:ΑεZYΤιh&υE€λ*œ"sΈc²^:άΚ΅ωΉY‹²·•―’6Rpυ₯2οZν³Ξ°N0Ύ’ς9Τι&(�FzjI½ιλλ…ξήIΊi 9�©ͺyˆ΄v΅‡¬MNL„“{�γΣχΎχ}κUŒC'Ψΐa/ΙΎ} γP Θρ€τ k]†zM;ZcΫ¬Ι@*Ηπ•epΈe §ΐŸΥϊωhΤ}p"dΫρ΄3€ΖΈNŠE?#2Ε5ψ|ιPοRj°ξ³Ο5N5J£Ψ¬±5ZŒͺ—b`Χ.ύϊ_ϋkι΅Ο½…ύ½ΰg�_|ο»θ€Εtύς•X“E˜0ηΏiH²Όξέ»Λ«ΊJ§έλ™jSŽ>)AώlΕx ϋύ6σγ†cΓί©“ƒΛ¬ bi5―§ž«—Σ_ω2 ₯^@ρτδώCtlήΑv~t8έ?;θeA )žΏ `Έ{œ―μ#�.»GkΔ’"�ά»†φœ‚'θΨR@₯ϊ|βΣGi½_ ΫΒ�ϋœFš+yυyT8XF^W)Κ،ΞΘ"Ώ Λ‹©›<›ΘχζήB즡Qjv–bƏ’Ώ@²g™σ©gt?°ΐV€\θ\«μαχ–ι0²>ς©Œ°˜3χ•r£¬AΝ_\YENd†@1FΣt@ΉX8οΚ΄€΅wόB=J:ζόw„1Mτ±mc΅wt*kxt0-rz £Šωw,:εO¬ϋ²ΝΩΊK= K»ˆ0<ΐŠŠ2G§<‡η†ΡjΕΛ΄*ϋ"ώ&ΫΕΪ(ΓΨΥ†ε@cP ”);εŸΫωΟοA�†iη—ίη>¬ˆ½ΟΓ½WΞζΤΝΌ=˜5q–σ~1ώέ³Φ=§-εΎsΜ{ φ˜γ+&ŠΏ'S P ±΅ΐQ k·Ϋq"t›k"ˆo*Œ¬AT-k½E€`VΥnΨξίγYζϊUΓvρ\W_ ϋ L|μ S/¬%$xΠ ³�ŸՌΩN!‘#Έ§λ,SΓyυω<ŸIάχώΒ:Φ1ˆ½ΙυpόΉ�3™πœ0έR]` ί£¦g§Α,ΧJcχ―8CœΖο5œ/‹ Ÿο3.©œχ-M5©΅½ –ZqΊφυ�oώ‡ΏgΠΞ‘]Ό.f೜ΤΩΕλb>›ψΞwή9ϋέ�ύζzϋ›ώtόΕpΡιρξ+ΤE…Σ²³cΗ·Υφ�ŸŠϋΆnΒθEνΑΑͺ‡&θ;ΡΩΙΩ)5slQβ8ePλ0ΗΗ'’½ž-z>ύδch§ζ½’€Qβ�Ί,ΠewiΓ'ζ”‘CA h,ζS8”4ό9 dψΚhδsς{ έ4ΩaT’Τ©ΰΞaΡŒ™J"ο]νT”&笱‘Š―Ί΄HΓZ"ΤΥFΓqφΝΓΆ�z€ pπyΨL>�4­ΟMΉšcN,žΈ?ω! š�θψSͺΠƒ‚Ρο ·Ο©Ž0redHνΛ09Œ z£KΞiŽŒ0οιαfρ%-ŸMγV#]'θψ€χ0Œ±�δVlσΑ…3œ_Aεω刬¬�ζI£Ιθ/†‰&Ω‘γ8υφτΠVν₯`\ΤhL`D=}οΗι§H£F*²tυ#’Η|v›¨ζ.c²ΉΤάκ‚”-έ'2™pšp� φ3o™cά DΟΎωνo§‘qΪOξΣυ#σPηVC+ƒ”`�q�±κiίχ¬LΦ₯‘‘.Θ…N«‚kWNδπˆ(‹{.‹| ]ΏσΌAαBόφξ.�00f™#eλGέ\]#jXެΡQœ‡#zoo3_8Λ6ξ7ΫZjΈ*K|˜©§ EΨdθ˜ΙxΨe]dιu<–2Μηό�εΧk'AgEc–‰bίÐΰ’@#<ΧxseXOΩ.Άμ4eͺ Ύΰ·pΌwq‚dP¬ :$#£Γ΄`ΑH­L£μ%Aœ*ζLyΤ9lΓxk€ΦΗϊβ|:3ς„Œ8ΗϋΦί`>ƒ’‹n(Bf23ϋ€‡emθ"­<σ₯u„Kω›QUχ€ι#»μ9sΏ™@ƒσ4š|½τΏ―sΗοʚrdJƒ`ϋ]½±‹sΦΪΡ‘Ύϊk�NΪ„Ο"…Qϊɏ?L+3€&u₯O>ύ”½�“Z ΜυkCι: (iϊ‚΅8§K€ }ψq|V£Φ{ΊWόYΐΰόί:ν~ω³ΏΨθΣΡπχQ©ή5FN·™/S°Όαμ΅hIƜγ₯P ޽v₏Aα@ώ=7?,#?#­{τ΄υ΅•₯­­s€£‡,ΙJ9/‘yt’ΊΓq[|Υ1T €B+W:~28φ‰γΔΖ=™[ΣL[²ΐγ>υFxδžρ ˜€Xυ�Ž•υqZ‘›+σ[Ϊ2rŒΠK΅4pέ•Α±:ΐ»λCύ©ͺ˜5'κ�ΖΫo§‘Ϋ·�ΔΜd{2œΆΧBΆ]OηΕθ€­_!3Ț@‚ ŽXw†RΑΉ€£Δ‡<§J�ŽqN&GG�&ϋx}–ω"WΎyΚ�4Γ΅·˜Ώ]€ΘZφŠΜΆKΘM†5°Ο:ΐ¨IVds ΖΌ™βπΰΡγτtx„=y(5ψΜy†“mΔϋΟRδn0…=Ι^#Ιϊ%žFΟMo“‘ž-‚zvc§˜SбΛΜ8  ΞΉ{Ο"»²5sΟaφι@AGgg8~m8ϋ[2!θUΔή΅ζ?» ΔιΔΩMζέαΊ+«€U–}Ήοt]OŽ-@JΣΌJΉ¦ΰk™Pώ³Œί4D»:•±wŒ {ΖΚ3π`½§*ΦXΉΧ‘/ΰώ±WΉΆL]FŸ­=a Rvw΅“Μ4θηaS}όπ£42΅Œ<N€`Ζ<±ΎΦ!P6ΜΣ—ρηs–q?ΑοcXΠIB –δΑ=©ψ€‰0Nƒ(²ρ΄W,ƏΟθπϊ7SH₯ς Ž)ΟΚ”g “οΥπ½2LΗ±€₯ri;Β›œ¦> ΊA<#€ϋŸ2²θΌ†gŒT�[―\KƒW)Τ 3―oτMt΅)>vŒr-,΄μΧβΚr9.DV”4@�Ά€VHλPίςΜξσΠ5Μƒ€‘νm»­}%­Σ=θz;Ξ½ LYηl… l&/�czŠϋZv@ Ÿ•‘ΰ™¬“˜OΝηΰ=κζ<($£"ζOΆƒΰ]ήή,ζ Ι^w…L{έM‚WΞM0_ψ·η†kh½(u&"ϋΤ€Σ:κ+UV²φ2o*ͺ~τφ—Ώόίυφ-…ΐ^όίΕ |Ζ3p|Ζόσ~yΠτ›Ώω;;?ϊγί{χ£O> P{|·πτŒTVZvαΈUqή€Π!J[c odJ1KύΛBΫ&©¦v6ΖΖΞ³§Οˆ~5€Ύήή0R>Έ�aš"BxΖΑ…†APpΘ›yy@Υςž%8α:η¨Ί gUΌ'ίo\ΤXγΕ(_žB­C‡€”;’b΅ΡΐԐbΧ UΆŠϊ'‚΅΄₯ΚVSλ΄£ΆžΌν"±=«—―n¬,Nη*�Η©D° co#h/]Ήσ*•φ)¦˜Ε‘kΐ©^ίƒqΡ”ξ½ϊ΄τžτδΑϋŽ‹ 8šσV™·Βφ6sβ₯αθα�mτΑˆˆ†’…Ž‚kΔ,3PξΟΑjiEpςHϋFw‚a`εηJrξλpΊ{ϋRw{ύ£G£ε’μkWΜ@‡°MΒΕΙ9ΐςτq<|&&Ƙ_‹ψtFΔ»c΄™\~ίΪ^O/†ŸRYΌ!}α­ΟΡ»ϊ2ƈΰˆP~ύŒhW’7kUafeΑά`#Η:‹φˆφ°έ†šjŽ΅ŽΗ>Χ6cμΩ]–©Αωڏ|BηΔy²ZΌ†Μ†„Ρ&» Cb +°Κ=Μ™LoiœεHƒΜ9τ3 Σiπj•‚ˆR«-gσ(Ηu³Œ»Ž(k?s§±­\­aT?ψΑR †³zpΛ\Ού‘ Ρ%­±" ΛΛ€5©±μ,υPϋβΝW_MWz{θtΠAΤ‘Žά^ŠΰaΏύŸίϊNzH!ΐγ@ Чε0MA(C‹ΨGY(Η-8υ̻ΟtLΑ€[w^”κ f‹ŽkŽu—ZmΆ΅ιΉ΄K”ΝH­μ[ΡΥ‰Όrύ:ΫξFWŸΛW�ΰbl4ΜΣΞS„ς@BŠŽ•²WΎt&4¨txΞ«Tk(ιjΩώ΄±ƒρι¬YύNp’§]—SΰIΐ-δ™kpΖά)χaŒ3•<λσΖ›`Pόηςω°ψΰN·ι_ψόQ΅|–Hθ㧏ZlΊ�—δ1·±w#,΄¦±zϋζK΄ΆkΐP,"ΪΣ’tD‘ΝΑ‘AΨk3Q΄ς γSŠΊέP2€ƒρŒatS81τ+ΨίΚ‘, £’g‰Εθ&‡8[€M2ž’›r.ΰ…t4tR¬CΒ`ψ9δχ΁i:‚:Q8‘χ L/Έ-Ό(ΣΔ²ΰ‰i2™UŽLާϊͺΪ(©“€Œ·³GΉ‘f γ]vύr8Ύχ!>'bΝwuM8ίόμ\ιtƒξ3v|Ž[£yOF'%rλ™>ΪψF΄ΤΚρΎΒηs`‘y EZq%¬™F:ΘXαέBq2§tΰκ‘ΩϊΌΧ7έέ ]š6…ŒW'G€J°T'Βy#΄α2Ω­ν!Wξ9'ΦτNν>:C=€σ¬“Υφ@,Ξ‘ΡK†¨MΑzMu’ΤβPΨΕ8‡gœ7FΞƒm€<žΰTYψΝ½ΖΕcΘDKŠ«^’νb'σ.@ΉσX΅•⃣χ?M›σό›=`ϊΛΉ�―bŒ” •1αή’ή.ƒη]¨Œκ€ 2O,κμ�βrDœχqφŒ` τy^T°†EŒ{‡Ή››KΕ8‹U€Ι₯όή’‰“S3€ΫΠΛΉΎ·ΐCi=¦lY€ψώ§I«M½€ sλ•i `'Λ5^Ώϋ2Α€Ίράΰ|«‘ΛΚ@.ϊ�‚ω͎œs/«ΞTu”²¨θK'9|Ξ?£σ2Mi“™£#Ί ƒQέ"HdG„••@8Ξ<"ϊ‚J:υž^Η9τg;0 X˜6'po€Α(ΙΗ·@IDAT±ι5ΎΗΉuνM ؁I§C(“$ŸβHνΖ’œ;_μqNyΎΈ|&e½št6ΔY²(-υΠσ:αQ™�'ΆΟ.ΏΣ‘5mΑšΆΌ5j�lδ)5 ¦Roχ@z™Έk€λ;ά—{+šΪ(j?οzV"%Θ�ν€90γYtδηžc“αΨ•cwΑ8ŸΩ=k5ίΛ£ΰl“g(ͺΰίάσξ9m₯'τz€X1ε?ΐ�λωYL gAΟν]‹L Π©xo₯Ίƒο‚ΐΚ“γ©m«€Ί0V0J`ί΅¬\ Ρ/Σ–fζVΠI€Tœ½d2arȊkCC‘d)―ΌτΩ¬e‘ςά‰±ς<>‡Ά„b&CLV€AY+‘xΟͺ­°™΄ΌΝhJ-uΓωzsιψYΫ�"‡¦)XάλξΗΨςς¦όππθ'1ΦMΘ[ž5eϋf2?γό8>k~x―Β’SφιGt»"Ά†j]cγά―ώΪΏϋ·Ύς•―έg9/^3π3™ ΰΰg2Ν7yηόϋΉοΏϋΰύυε鉽­΅.ωΦΖ†fšXεe‘½ŽCΌ[ ΓΉN U΅Fώ 9l¨άŒ²·Ί†ΡθΘ‡ΞlY–VRcDΙ>AΑ―C\Ε‘6Β††C,TŠΆ= ΐs8EhνoξŸ½‡ΏΉ°‡…_V¬*a‹ή„‘ASΞan»-»I#ζ˜ʐ}P#‘‰ΒR…7* ¨αΡL[y™λAl²ΦŽ.�O1©‘[©σ₯―ςο6θr΄ΌκΏ•ŠμΈ !315†aItu£νb5ΕΫθ:]„ρRJ$ώδˆT„cϊNγόx k,†QΓύ·F…‘¬UεΙ,ΒxΤ–ΎiΑ©Rœ]»(˜K-…wάH Ήή ŸΣh°ϊΉβκ2QrlηSΓο„ —qQΛ،"zΐΞγœZgΒVzFŒ‡n܈ΟΟ�,€ΚΖΊΔH�kΎΆJΞ4Q Σ6‘π―γπλΠbμžPHN§½˜CΣ6_‚φ1ί‘NF!Ζ|‘)D§,ΤHά#Œ\ΙHs¨€:ΫƒσCΤ †„ΖξN€/)ŒnR™e4°$±ώ-ΎN0Ν׌β€Zφ:lF+Œ"9‘'1ŒKγΥ–g‡U'Dtv ϋξb|:ηΦ›0j ΣϋΚ«χp|1Πp+Οόΐeκ"ΰΰ&½<,Ω‡{΄λ| Βθ’‘99Εet΄hN7/w€ΏBςκΠ@jΐˆ7*$ΰ0ΕZ|‹Jλί�π#nJju `ιsW֍hG)_WξάŠΘ†tΨE ω₯ΉYώ@@”ύΦέW�΅[·‚»ΗΎ„š™„@MMXΗD‰‘‘�@ξ5F€τ�Ίf»g”ΡŠ΄#έΐ˜ό[eνqπŽ0«0¨e UΓΌΡπto9¦¨ŠPΙάcΤΚ–©ε=mμ)η‚Μ§†Χ!λ|‚CΉ>5Ιf…˜—#A­ζ6Œp~^'Βz ό9A@£lΆ΄’»τR)νMΤ₯°@ηϋ³'Ν"v‡θžšCυ N₯ΞtE9?ΑY›|σ*>ϋ…Ο�BΘΎ©Q;μΏcΦΝZ {{TzΗH—Ω°»³‰Γfjς€1ͺ.�ΙτN>ς&{‘©½•=ʜ�­,Ζ~3ίΧ|`ηCπL%p`{1 g™ωœθΜpm`O-Φcӈ₯ΤύŒyηX±΄„ι‰θaΌςεϋΰώϋ¦]€©}‚γˆ!Ž}χέΣδY³^WΗbnΣΣ8Δψ8€: ίόγo¦οΟ£ΞtώΟ_>Ÿΰ―cτUTDz’e:…�½ΊH'ώŒhz!Fom–΅¦ΆΛ ΕίxσUŠά °/>ΕΙd€¦lUG£ψ¦­X#₯’y³+A@^–hsϊφ*Ž‘©d=}}Ψ#…gνΑÏ)Ϊ ήκΖ9:Hΐ‰£¦²‘ݟŒW0‘φ“‘ιX:W¦ JIζ3>S‘>Y=ΦΙTr�π_읕₯™ΨΏžcžœ5§° ’pβΠ2gq‚€[―νγ|pFMΗ]G�BίFΏQΠφ†«€€Ή�γl© Kc•”¨eΖUZNMˆ .Ÿ/戣MαFλ ΤSWΦRDH§Ž―sζž0°ŒσDϊ?KΐΫύ€³λΩΕοy:_§Y Ν³θ+-sχφQ€]& WpqŠΞΩ’έ1€3δ2 «ξ}Ν§%–�Α¬θ‘˜γ(L‰Qτψ2gΰ8ϊζφ΅«œ‘UΡi¦₯±9ٍh Jϊ.ϋΕξ1ΚzDζ‘ι}�-Έ²ΟzΡ/DΦ’ΖQUΝ™Η{εΪ`PψΞ}¦,Šέ(67Χ¨Υ0“ž ?JΣάSPΗ΅·Ύςjύƒ-ΦΦΘ²λΤ7F˜sμŸ%ā`Gπy欔†©€‚Οv0ο>΄›…MβΌ ™ΒA>-ΰ|`χ™μψPaQ?Ο8dΞ{s’E(Θ`τΐζΰw¦uxWΩH>ΰlζΏY2HRΒZ[ˆ²‘±°V ΐP η2*%δt °5οτΡΊN LŒΐ†Λ9‡ά Έή>―0¨X§ΧDηΤg΄X©€˜Ž΅ϋG σ½ ]ΎΉ> hzV©SK°ͺψ=S²(kAώ�_6·°νψΟŽ+Š,b‹l"ΫGȍ2ηΝoΐ˜γYJ¨χζ©υ4 p@»κΡγΗ™ΜC–Χκ6I³μ‘9κθpyδΓ5έŒl#Cκ:NπT0)X@θ,Α7ν§ u&Gζ‹ν’•#Σ= =ƒ“]lΤt@–sΐ@’ΰl#,½S&Κv—κh¦'Ζ_ π¬Ξ�Ξp?x=»"(7’0 Ω“Φ—’1…Eλ³πuBύ&Α–θTe ‡€@X—BͺpšvQTž­ήψΕ/�ΚΥΣσόΡo�φ;,μΕλb~63€*Ήx]ΜΐΟf`ύα}ϋα@oΛ‘“ΈBΑ¦ Œ… ”l…JX*\΄7;3‡«…ƒ€$ƒV’H‹Ϊd8Π3˜†ϊ―Πξξ“4ό|4�ν’4ΜZšΦQ5N`Ρ3£ZFsƒΆMSCVΛ1ˆŠcΐα, $ˆΌ{ϊ …–boDB4ΌŒΐ’xζkl—aμΨ^'w’£}CΐJΤ΄(loδΰ ›@{7N8U«AΧZ‰HΞ…£‘6‡ΞΑ›ig‘Βy°φ κ�Œ?Βy) ͺβΤδ΅Ϊ)RxqAΖqΊyηŒΧݘ{{Ψξο¬Ε3dΚΘωΖτΠΙ•nŽtT¨η‰L]°°”α;Σ4‚4ΐΠ©¨’p$SF‚Ζ›F€©$§΅φzή ίΐ)ZΗa2Oέu°ώΗožnˆqq#v ?K^Η€Τ¨0’d°ŽΒZDmΧIo€ P…±=ŽA ^Cώ΅ΐΰΰeάLϊΡ~ˆ™§}JΗ3ίX½–ωΓ‘ΥI΅πUΖ"J<«FσΊ‰γγommƒ…@‘&Œ™ F’€²p¨Δƒrψ۟9δ„±W`LWix³ήQ$ γFvG-U ƒ―CGn₯τν»― 7Λ.Ψ—a”ρ8δΊ'*}_ cQ° šy^ňn#΅fknGx*•π :"FžiΉ4MtφΝ)9ζΨ8{G3Υ’)ΦΧΫݘΎψ…/&�’Ο'M𣀆όαΏω7ι»ο?#χ›Tϊv–ΨΞFX}k;,`œ λ]XPμκλaόœ2Ζ^L[¨Εs|ΟχΏση€)C/νNΛΣ3ΌΓ‘ω+!š¬Γ³° όx; φ…CΏNlfq†t"@ ή#;Εb›₯°XΆ‰άX9ΏΠ˜#Δξ©k#P%EΉγΩο�΅C΄†u‚1€φ1ž5¬Ϊz{bοΊ7[›x>dŽΙ–ΖΏAκJ}#]50ͺŒΌVα\ΚΠ –κntYJΈΜ χύΑαv–ZΖi7Rm ’ώ>hβθ ρ±±p’›"ΊŠ!zϋ֝Φv!{GŠ―Qb,Νpl΅ζϋK¬ωμ|Ζ4LqEθRk‚θψ�AΆΥm{dtx$ ?}ŠaM>ΎΞχτ:ΎŽ‰‹¦W―…‘ϋˆ²‘|χcςK§Β}Α@Π=κM’οȟϋV 4"¨θ"υ‚Ί΅ηZQ™U€Αƒέ-:t 8eΎΗΪh©4τ*φ–LŸ υ μ…N"ۀƘ‡l ΑΩ)mνΘ97eνlοΈΌ΄ΒΪΐ΄"]ΙωΤyΦ9c%bΜ:₯Α@`]\£{:J:F­eXΔ5"Ψόή+εΑ όξ«σα8·qt*l§Š>΄]Τ΅@w9'Ύ›²˜Λ�νVμHΑ™dύ&κ,SƒJ˜Γ Ύf)ςΏŽ£Τ °T[oϊ…aœ‘ΗBAΑ5Ζ^θΤ‚ξ‘₯1ο•…£SV€#άBʌs`[HΑΘΨov—Qφ• 5f‡EGΠUΓ1rBž)0oδέ9πύ́ΓiU€2…μG .ZXovΘ<Ϋ‘δϊΥ!t8kDtφΕΨhδ}o2&>]Ύ|%}ιMΪΓ²Ο>xπqzψδ9lΑaj„LήΠ΄ ‘σo:˜:ΧCrAWsΐσηn{šΒΊΠ»Ϋ;š`ω΅2Fd•A ž0·ΛμΛ‚Wϊ/§ξ~ “ͺΖ>©γ|;α0o=R›ψξ˜ΨΞ·‡”₯‡CΙ³εpΘΧ–7C/Λp‘rN42lΡGoχ Κ:Ί°8c_}Nέι„χ`X τHα~ΪGΦλ�½»w8η΅ΫiΕL�zWw{ͺΈG‘Y™,θφͺ` ZΘ¨PΏ<1’=}‘V7`QαXηΑ Ο|δyQΙΛg4΅B4Υσ�υ>b½sΤ)βm¦q:ίΚuθΟ Ζκ›”%7ŒΧφWƒ₯μΝ}φί:Ωϊκ[»š –Œ3έ‘£ΨD$ρ»Fφ­¬ΈE™P¦Κ 4ΰž3j―σ�.4Xc $ZΣόnm£< CΦ]hΓxˆ•#€“ΙxεyϋεΟ}&dΊΌ!δh ΆΞΨθ89ݎ{RYηΧσ‰mιŒrasΕ:"sΞ?{FϋiŸρœ‘ίv8gKyΖΞ§²ΠΙΪ‹ω’Ίϋ²V(yΐ5LIˆ γb¦2¨?*ΌΏv₯ S€σiO k‚Iž‰Ξwςd²e—δ™·2Aό,rΖ{enT±χj`ΆΥr ˆίΈρ�Χ�£ΏυŸ�ݎŽ@©ΈχΕλb~63pόlζωβ.?™ΐƒ³π?�³νo}ούχZ»[ώuEaϊφ)Ψ²β³ήΆΦζrςJw7ΦŠP˜…Ή΅œ-"υDΫ7pΐm]χϊ«ob؏§ύπ‡” α(π'ΓOψ;ΤnΎ9|FΑ4ΘD{Ο£_A―σχD¨5z£J]ΧχωͺΓ1τπ 7jPΊΛŸqhy�ιS /N •*ŒΚΊϊšt…HY|jˆ†΄αθ56ΡzNEO$_c¨�©œΘ$Ξ›Ž’‡”H#^­]}izψS:(ΜΫb~vŠt†… ΩWBή$2X…αΣΦAQ=œ@σp₯_zPoRXΡφ:G•`G>�§s`"sμ#RΙxJ‹6ί�Hϋ Ο$š.Λ@£Ηg�`9g+xπ›Ηi~o)ΟmNζ6ΧΣX6·σŒƒίάΪC¨›ΖΦ 0Ά ˜{iΪΦr‡˜¬`… ‡‘†PΪ ‘φ*ŒςjŒW¦‰”Žφ“ι uP¨Ÿ?{Κmέœ,@š0ζ™�₯εuŒRj`δΨΟήΕ)fμ>»ŽΛy‘'bΫι-ΓςΆλ—ΰKžFh •°1X”£…`*4HAN tX9ΞΓ`ς%[Α5ΤHp^-NfQ()‘‘ή! ‚,ZΜju‰ϊ°(Η©0ώιΗι`£Š9Ω…ΞΚϋφ¨ΏP@^ρΖ�Zšz~†yo!ΚΠΣY—:+Rs-FζPLG3—v˜ϋe žοΎχAzτb"Ν.΅#YέΨΛs`¬DTj'Εγ°^gͺ˜Ž`$mFdξ5 ^½z5’¬Ά'[^6WG“ηY€£FΦxδ?ώ˜^c>ώsxDT¦DΉ&2sωJ?5LX7Ά�λd�nα�3Φ`Ž:Άβ³IS cǍ|lζ[pΐ½k”§G¨ŠΌZϋ―’a€\Φ‡…6•%ΫσeξΌΤξϋœˆE–:Ψ tΣP3b¬γ‘ΑεΟ¦‚e‘YφΈΉ­M΅‘;¬Ό;?MPί;;/…,Hη~φό{·<½υΦηΣKw^†jš£("Nή&9Ζ�ž[ψΜ.zΗHβΜΘpšzώˆhΞ¬#Ν5§·<†° #SΜ―ιKιW~ύ+€Œi~n*-R8³°fSοlš² S΄h"teD••qυšLœ|+[*―3W°`ʈμ»4|•= ρ•¨˜_.ΞηΠΚ/λ’£/ˆͺž΄m]΄zTdTϊεΛΉ³Θ₯]lΦ ήϋΰ}Ψ8δκCήγΎq―»‰G<‚a%‹*τ$σκ}ΞA„0€Ρyπ€ϋ£?Υ+ŽAπ§go›ΉœŸ Η΄y©ƒ¦/σEH9 n; ‡ΉγW©².{D=�nΛΊ‡Rτ)z5G΄pŽ}ΆΝ—m·a«),pL�Ϊ• ŸA&V]Q,bjZ…Ι”©]>λX#ΒΚΈeΊ ΚΨGώ@ΜΪ2\2"[°llšAY|4(ίΚ0*βŒσΖ^χζ]οα@δΠ“*U•0ΥHί±θ]SsTMŒkπ֍Τύ{™³ΣΜƒG€~Ν�²η=±Ϋ¦’ζL'ΞΦΏ €+ν²ŽξΐΝ•5Nͺσ£wΏλ΅DΨπ45! B²V‚³�£`‡2ͺΎsMƒa‡>·SΓΒΔ EfgS!Ο)o+«ΛDI‰ξ²~œ_Έ“υ΅Œήπz­œy ‘C—c¬-ΜοΎϋgj8λj(βšO†I‡ΐ·˜¨_N7"«yηΥ(s {_fZ`9r~©·+τ‰Œ«…ΥΉτα§λζ笚=»±HgœΉtˆuR––`AgίEߘg�™pŠ~Χ™Άν¨ΐΰο.{FΠΨ9“ΏAŠ›² «Οn8‚ςž#LOδΐΟΙfαQW¦<笩 ΐhQJ―ίέ�zΊHχ:ή‰b~΄γ΄¨₯ΰRxιθΕ]dWpΠb½²A…Χa;μΑΌD8Ζa—E*cΔ·ΦΖ6d%Γ±¦¦©5γΗβΜιΕΘ8)r‹€sΜΒ�œδΜlH½έ!ίΦσ(ΰz•Ψ ‚lι3  Ύ9ž=%G΄EκXMΆ–΄ΈŠ0ϊϊϋωϋqZΖ)ΘυY^’ ΦΣκ%TΘξ‡V{9 ΥΥ₯ι4πmΒ8Θv1୎žεΰ«=/εyŒ�nqθNOŽmιŽθπΨψc&RSBΡ"Ζf„Q£GΓοΓH£2οDcΔλ`πhP–b\Y„¬‡Әƒ_Z«9Πyζ…6€ΦQŽƒΫ(ΌΖΈQ [0ωpκTVD.ΐ86·PγήκΝ‡"̝` iLπ?; Xξ γ!ΛΏ7(`¦S ϊ―cg~³β%@")ώFμub#κ‰ρΆΗ{•H+Ρ/ςcΎ°:Μx(λ€hάxh1τgN π εΩ$Τ}d}=μ-΄g§)Χ—ΖυŠΈΉΕ9uNu„${š;©ΡΤΕάχττbΰδsŸ—7θ!]Χ(λ  Ζθ>Οuυκu"!Τ°h#†’ς†Υ”Ξ˜»}~œΗc  Z(Η-u)}ρν7Σλoή¦0έ r#JϊNYyu’ζaΑ`}χƒΣσ)j+¦μ`bŒ[@ι#¬Œh-y“Νν©­³ƒ1wΒhΨͺ¦ι�­-a±ϋG£ΟbPί/Ί<̍M2ξέ¨Aa‹Ζ ¨CδΚpRϋ°9�α~,@ϊτΡΗΜΆrlTΐΗΐi'ϊkΔaijή~Ξ­F’†š‘,σΓq;S[wΖ5A¦PΗ\cNcΛ}©λ §SM 4»!˜Σ�“ισΝ•Q£\(7VΓχΪ:B2t–tjάvL1}ΒκΣu€@]’³Ε΅kWHUhaͺΧvδΟF.dΡύέ�LКμێNLŒ£[¨+ΡΙ8pd˜7Ω‹ ³zΝμWΊU W₯Θ%KDώœCηW¦Œ©RFEνσ+_ϋλΜΞ+χ₯ω©4ϊβ1ΉλT—ΥΑC+‹¦˜β`q½σά_ηEλΤ=i² œ(#zε’¦cΉρjƒ>kt<"£Θ¦Okθ$D―£ό ŒG} υž{Hƒ6"Μ›γ€Όΐ]At,f�°ορ:~Ή·0-ώVΖ%<¦ψ’ΰ€›C]šaΩsbα<ηάη>χL’’ž!λ=pq6^Wzσν‘«JΆBl 6$SIφΞ,Ύ<²³Εθ.lqήlρΗμŸ<Ξ³CΞΘ\Ζ€h1ό„φŒ·c"X-ΠνΊf©3†¬Ο˜…�qΟύSΎJ ζ—UζΣͺuΖSyκξifmVc_Ξα Pv˜‹Ψe m2Ϊ;ΪB$°™LΉdηeŒ(Άιη¬qΏkΨe…σN#eΎsΣ�2e^μγΚ-Μ֟Hδ>σ±5»Μ₯v2ΐ!Φ—{Tϋΰώ^AΔ1Ÿ΅gωŠλ6£„ΥψρyNr vKΆ‡ηfvOs,ρo_―/a}½bYΫ  %šΌ¦”=κ˜ψ:ύΟxΏͺyϊRΊ]œ|ξ'n₯›/]a­‘pΊ£«'’ʝm^΅Α³c€%M˜ƒX7Φ,φƒΓΎ”½δΊΨΆ³Τ*€­ΰΞΣΡ1|$ΚωμSό}{νŸ@ bΎ[\σΐυ@΄{8ΓΪ †c£Ώ }θϊ5Hίbύp¦X"΅›C’…λ―kF„±VρΫκ`:,Γ|όt4Ζ^ΝΛ\΄­2Y΄Ύ·ΚsCDmA(Χ“u[τϋτMφπ“²άΪcAa’μεπ 8b€-»‡Tpφ΄0Ρά�rχσŸ�ΒΏ�Ϊk?ύ‘‰Έxγ³�;�G@��μq6?�xύWώλύίώέ?œόύoό£\Ίώ•_ωΩ?�ξ΅λ0φδYξβςτΝς;ΙhgοέΎCνί&5|;,[σWNpθΑ)²k°Y9^ΟƒQfΒδ8h βoόNC , BpΜ°ϋfˆ αά6ㄉj›Ν΄O<Αmφοvm°N½–€jq+k;Ι —A]5;&υρργ»0 ζp–Λ©±Ζ‘’£ΐ6΄� θ•G„™AΟdͺΰU«nοAlΠ•αPSδΟϊΜξξ>j"{�[o}‡ρεϊ²©D7Xφϊ" αpΟΙ³#K6ƒjφ0~fœφΜZq@…pYΙJœ*³.\ŽΗq€(‚0ŽEd"ψ"R2 €) ή(Γaέr χ*«Bet0΅& škλιϋMΆ)κœύ„΄Φ`TLέΏG&h.4 μλήGΰ°E ₯’u†c#(~“9Ϋ –ΦχUυϊ`H…Žpώ9lwΜω�±tt’73)ώΞ ΑC\gΨ'K40ύ?Ι%˜b> f|/μΦ›4XŸoξΨψͺΣ^”€}ΖͺgUΗ>jVuΪxNKoΊxύZzι3―€¦ι“υτOHF•` D‡K‡8Ÿ΅£(€Μ•ΕΡ2@Ή¨ό7₯ =U°0ͺΙ°Τ ¦’’,'λzn&M.�€;ÏΣψ"Ω:¬mΒ*)!;‰s―£WeΑ\Œi"›%¦Žΐ<Η goΗt νΙπΓ΄Amςμ}Οs=]Ύt…‘$έ½ϋQ ηpL¦5¨7_Ύ‰CΊš~ψΓw‚iΡΒυ4ΆY§\ =aKφ€λFA½ 4ϊ\3ͺ8‹Ή¬΅ΌBζ…LΨΪ²,Ɓ ηρ£Η©ΰσPSφΑ§ΜΗΪ=+=ΦΗsT±8mƒ{ΪΜ7o₯Xeΐuυ@Ρ& Ί†€f)ޱ«Κυ‘AΖ5030r¬άλξ\~w»ožgΑT'·³ƒΩz3˜^�΅8ψ|Α·/ωKά Ί€,•Τ[>$uίqπά�Hˆf4ύ\Uϊ-G”λ€M"­zτΡΏl3`Κ£\¦κψ=±^š’tWrˆνPSŠΐYk€€\€)€ƒ2~χβ­›h\ζ5dz©‹/AWβχΜΑΞi7μFdfW­υΕΤΥΧK “ƒΗΣ(Ο+±‘5dϋ Ό2e|y―ΞωT ¨η„=θ³σγ�ΎqoάΏΐƒBŠΦΤa₯cφμ>c“ΙA΄†D{W;cέ‘ζΥͺα¬Λ`Kν^Ίώb0Œ>@d‹žρ™qζ“ϋεά›‘¬ͺ[˜α½Ζ&¦‰)`ύΛ‚”•™a§"Ωm‘EAε2λ˜Κ6Ϋ%;Ώ λa€Τ2“ Cη/¦žφnXlhΌΗ16 ›w‰2ˆ —―ς°l\†ΜMdιYΓξ)9ΆΣ#VŒλp,Š'mΌk΄œΦk—β/ΐu€ΞΛΙ‰:9ž1‡©§§Π°>Ζk°`š±· ]€‘Ψu―Ν²&<ΕHy#~‡Γξ‡Έ&σͺ­:–f^θ }y…²ΛmΦ@¬72Υ°Ιφw²₯fίd|Pΐν0F&>Ά9Ϋp6ΏΈOjE νͺ’P•e$Œ 1Ύ²ΥΧ‰NήYœ©Re4MμΖ)žΛο£�ž}₯�vΈ€°Ό’υ‹M‘†ΤΫۜΪAΎX#υ°ζ._"θ�J˜-+ͺe]�±GO9Ÿ�vς-#΅4ΓLΎŒ”SZβœ8 xΦ›΄π^–Ρ*R+Η²ِLFμUΝ—Μ,׈~A‘ν~ω]%Τ¬‡rΞ¨‹W/ΰfw>2JυoΤά‘y·€’(TΙuσΩ;2λ–±αOžΑ8ΠN”“ΔQόW+“KΡβ‘ρV“Η‘πZ|_AΑ»η@₯Iχ˜ΏΫ τΣδ“€€ώͺγ� “)©Ÿβϋ$’Œͺ‚έΡ h ˆfcCΣ{?υڟό+_όςŸzηυΧ1τg³ψŒΐpπ#τ³ό—ΐλ―�7Η2ψ:ϊ΅�ιwVήόξοŒέΏϋΡOνl¬Φos ŒNM’oΦΜ€‘CγlζJηΘ,Š4±�Αϋ;έuτιΡΠλ,Yͺ`έ’ŽŠ§c8ΰ;Mpζη΄ŽaqήE*b(ε’‘Ι#0W|Jz₯uΆΦΎ›έηCpΚ q˜VqΦ·pb—�v"CΎ‚“εηIuέΩ‘&{UzΈ}ΝkΈ†2κd‡C昬³œ�Λ�έ•$KΑ3€‚ŒμΑ χΒΎuν±ψ^„ ¨ŒŒ΄κκk” Ώ�A”@΅tυ+i{‘B{ λ·‚L­ϋ\ΓθΨSl*₯.ά‹Z»°¬κΨ-ννizφA½€‘�mΐ& -ΰ.8Α \�6FΫ^�Uטφόˆ gyΩυD[^XaΨS²ΜšŠx�RrΒ™σύ»a’bLxσ4H°vV‚μƒ~l*�mΆΦξξΩb²ήΜ₯O�d―™u~:ό(JN˜+ΟΊJΐϟΩΫB� Muœ[»+˜™.β½γŒal€εο>xO2Ž gά±Αφ»½ηzgκΈΫκNρΪmΐ„�—#ξε„{=†³Ξš4XΥ_q-™A_αL·dāΪGtTΆ_ΐ¬Οι”iΓ©‚‡ΨνuΚ…\˜«Υ€Ÿ�έ ΄·YcΑ’C/5OΗάρu ZΞϋoٌ;ebψ5%ΠέM¨ΘtroΈ–ƒ΅ΗΟ`]ό(Dωُυυ&² �QΛšZΨ{΄n₯¬h°"Ύƒη{�΅+C©«†ΒΉλ«‹Œ'€x7@γh·!KΆY‡3ΨPΩ“]€ΜEŒ‘ko!^.u`©“ /L5ΐZΤRμe¬ ΗΤsZŸN»,`εY―Ε ͺ?χκΏ#‘P@4μPΧ«Α½~ˆš :F‰γep/x°‘Aϋύœ.€Lύ±ζα|oΧ:—πέJnoo�'_ύΕΏτK·>σΪ½3Π€α;{όΘFΰ 8ψ‘ ύΩ�λFΰη�ξ―mΤoMϏ=›Έ0=;ΫXBΆΒRLUdƒ]Eωψg‚ήΦCœ€:Φ\Β&Δ™ƒΆ,rΝαdnφΛ£ΕΓFRXΐΐ‡ίrΘ2hΫΝͺι H¨R\B h› ϋ|M³šΕ8ΖfαΧѐe υvGb“μckkG$S“#αt·#άdfΜΓJ'/Ϋ_Ϊ¬™c>§§o€CœSMKJqς€{BYΓ;o—λΐο:‡ -§8œ½³|žR•US ωG8y~…{αΘκς”"œŽRhο:Pή―— ‡ž΄ eƒΈ`mpΰyϋΖ�Ν¬›]²ώ_‡«§ίΊ{―uƒΩίJ2Δ’ψΑόΐω�σ€=‚²xH-gτwιΉ»fΥjQΨVΈΞήΥoΎρFZ§U χ’ ^Nζ)mΉ28‹:΄ΎOdxO―EΐCϊ½΄ο•_ΚΞ£ηΧϋπž ό}žΧ•YπqάΝͺ¬™aR,Κ;V<̎Ύ‡ν+ΝΨ™•½’C)›$Δη;ά„lJΰ:pυr*‚v<°³c=$ΐΑ"tv¨Μβ—rί­Τd—’eΪFPq~τqZxφ„,Mε ―¦[―ά ώ*<τΔdifWΆT;JžŒ"<ΈŒc>“VqP*^¬K mΦiemŽ*γΜυ”B™ν’žΦΆe:“«#£©goθΒυTίΦ™zΞ¦ŽξnV‚π%Ψ˜+8³Χ.\E|1CBS˜ጯϋΛ죊φΦ Ÿ’9Υ-.·�7/uυvrO-6P…ΩΦχW’ΟΡΡήΕ>₯~`d fΠ&u©~wφχα˜1'‚0 o>ί_:ƒ;8ωpPS3Ξg{%d¬r υΧΤΧ₯W_ϋ”dkΪ›Τe˜Lμ ZΧλ<)„i¦Ι^ιΆb<)ζήJ`C˜©•ΩbΐήΜ{ΈfζaΨa—�ƒκw?x—ξ[΄Z€,Kw?ΊC=-ƒ,Μ!– ^Χ�Μ:έ€Φ•ξ μOmF)@7Ζ½CgίYΕ>EpΙϊΕ9.(₯Δ '|Γ:l^ ΐ3Ú?%JΣ ΗA0–)λ†ξ¬Ϋ ˜[’§|6@ίΥ(c=ύΜO�ιs?ωb3γq”nάΈcβrt&yόδ%>AŒ΅Ξ©5Ύξnvά|ψέ/χ‹_&0�Αbb/:–!ΎΖί€wλ¬[p@P°Ηž‘�ώ s[{φλ›5@8F`[ƒh˜TtΓλRRvŸQψ/“2XϊβΧ�_…Q2ž •¬m`w©knm‹>¬λjfN) W½6C…{Ι ›Κ’’œ‰Lδ*mΣ`ΊΨ‚�Œ¬ΰG!6β” S{'ΐ¨ΈβΆφŠ5ϋΩΟΏΖΟEPuυtΗϊ³έ�υύκ—μj΅Ν2…lυ&x™\6‚ο@,Έ°Γσ™²θΠ‘ι±O{L–άξ/‚\–E`—½ός‹|f}’ικ —Cx7«½“&†'�δπύ4ώΰ^ΨΒ Ξ2–DΨ¨φž>Φ+μζΪs°` ύΒW�€M k‘A‚γb¬F2ΰv‹0°χΪέšςmΐm ι ³zΩL³gj–±uΔ=ψoK‚w=eμe3δ@“Ÿœ™Žρκι9‡μ Ω•4> ‹£Wΰ–Lˆ9T‚{—i± Έ0;K;b€B™kμ{H!9:ν‚Ÿj†(ںÞ5­@€e'Ά τΩ"ˆ§¦γΗη<η&€ΞzσσΆ^ΰΕ"gƒ�ΦΨ6n‹¬{Œ5Α—©Ξ›η=�yFΨy%ΰAΦ”σk†½œ2Δφjgo[κινA‹£πΎ‹½Φ Š!aYeφ°Y“Ьͺk$%€TΒΊ‘JΦΙΔδ4σWE‡„Z| Αμ<6ϋჇιΩ3DU9sΚ n@·ͺvezf.ή#@ύφžσ²]ήΔrΨωž›a»—Ω³2Žl΅Y8ϊ μ}Ym2 =CϋX%&'΄#Q²/c— τ#&²˜Ξ²'Τ΄ΰάΘΖ‰“€h₯쩊 ΕΉ©Qθkύ=ι 5ŽŽΡ5ΨΝ¬†‘ϋ„Ο67λ B€βήύn"ά θ�Ϋƒ«Θξ-jwΈWΏ΄•ςžθ4φΠyάfΏ:žžuKΪΒπIΈί#φ»φJ»ΜΖπσ) ΚsΘulREφ�ΤΤtzžη~ω’`½πž2aτ4v >κXpΟηϝΰlVk£�3²Cνφεy#kD0L6€ο©Q“ΛχXΗΞ[!sΖ6›ϊ/>MΦ…γϐ²Fl?*γƒλΞCL›IΫ±(Ολκμ~ΦέΫσϊŸώΩ?υ·―_�τ$‰5^tφ8έœ?Ί±?ϋδΝόCΨ�ΑΧΏχψjUΑ²Ÿ_Z_Ν”-a„Uz™ k+²μαf₯ޱY3ΑΏλλψ]稁Ήητ1θ°υ8‡ >Wd:¨�q@rHbέu€Ν°pΰ^γ β(²{tΎH�Δ{TM.&ΰ«E,�Z­ŽΈeΣPΐ=π,+(†VnM�ΜδΧD0Λ³ \ ΐΦL°t^Nœ*ۚFΆ)˜›'s²‰@­*«šq†ΘΎuΰˆβμƒ{¨^VjΖΆ!²wՊ¬ετE©πš‡œA±θΌAΘσϋΦΧ©P@* ξΤL~ΤGγfΈn:²η™E£ΖΗH=iθ Όεθεϊγ€Cέ†œPιv 94BU·Ν'α λ˜γ/B―23I™…Ž•χ€ "~DdΥ½–˜OζΪΉ΅/΄AƒΌΏχ χΊ¬5χα|(ώδs½GYlπzηΩΏηAίfψ{ΆTAκ , Φ"κ\)ΐφ\γ@Ηή6%¬‘P»ΗK¨ΐao¦n~Π`‹9›‘­άχ�8€€L ?WαΚJœΒήξh©8S“>NE¬Ÿk/½œκ‘w·6£°™ZμδΆ§ο=Jο}xΦ–+¬™Ω΄Πzξ<Χ†r>R.λΫCΖλqΌ~Šξν�ζS!sSΜs6Ζ'‚Ιb ν1μΠε+iδΩ³4J½¦™ρ&‚Έ—―§σ$98A*Ρ—Aϋ-ζ=ΛΠΟ(7θΓ©έ2£ X‘Θ LŒσύη(Ȝγ`Ϊ[:€ Φ‡NšAξ8YbJx¨QyϋvΪZ ¬…ν†6¨ύd±ΜήnAuŽšrφζTPkW-M)CλΑ� ƒCƒ©•Ο8eΡT@“V+ΐšrE³€²Ϊj‹šO¬JΚG²cΒ| " τω0“dXQD0ΰ}Ψ“^6ΘψΨ(N-Χ²AΦΩu/ΛG–Ε}ΚK&&ΖΊdνΫ&4¨φ8±Υ\‹”x3‡Š!>y2b’ͺΫοn!ΖΗϋlS’jQQ9ΰšYE�‡5eΆX±C™@V¬χτӏ|ΰa#ΦqΑωB€.^Γ=Έ6žƒ`�uA0ΥδΏψ…/¦[·>…]CΉœ ŸφhΉœρ}%e|“/)υY Πμ"Œl`ΐ̊:^ώΞ‡{δΉ`—D€μΌ›mΕplE>tρ*ΦΏ½δ_€�-sDΗΎ“¬©κΘ£ϋ΄)eί2ξ‡ΐ;‡)ηΛn‡,ευτΡο³wζ°« @�ΨΧΆŠmhoΗξΘQ"ÚΑ ͺ;{γΖ‹€-΄z#ΐς<!“ "€+c_έ#QFΔ‡y]–-d…ξΰπ³{ά¬»€U_{γ#£(Œ�σgΧ©] ²%IŽ£χγΉ’Λϋj/Ke\§ž ΆΤΦ ²–Γ «(­Δ&Σ¨χΪO½š^Έ `ΠHΛRΨΨ=nuΆ™F§νΕεtΒ^’‚ύ§όR—›K€Qμc―©”σ,G°Žqθκξ zφτψXZ_^N““Ο$–9ΑSCΜMε!ͺθ«Γcu†ύΰAqk0γΟνd υyN1f~΅§2…ZZΫΥ�)H—.\Lƒη£TeŸωΦ�{Ύ™I—ν%Pΰ{Η΅$Εg$ρ^v1πί�υ,uΞΪ7[^v³$(κ’•Ϊ^σ“­½―.«’vώΆΓNC֌ϋZΊˆ.SN499Γ=pμeλΜ™5ζ}ŽΏeYDœη\€°sT°PΒψ|Ÿ@?ζ|Ψ€DAΠήλ·¬πDPΐόΒΥK°¦Ξ €ΈjgΎϊΆJ^₯Œf`dzύ %Ή9f€χyŸ‚B„8k貴ΐΎδš]5UμηjZ‰>L?xϋ‡vτΐ6©«ΔΖ`!&5‚™Α=°na·’υϊωN9S7°ίž³:%Ϊu6L4€yώΙπLίcš—E$dPˆΏs„6QtCa5μp…ΜŸb²¬ςŽŒ¨€³Om5ctΈ–Ϊ �ΐ²Kϋtφ θ>FΣa~v[Έ¬§ΦξΨ—€Γ$PδXή¦½ΈxιJθ4•σ~žγ2Vή½Θ:j£•κ(bΒ^w\3­ wn›DykQ₯―’MtώόΩR–h³Ι½ͺ“ Ώ¨’υL Έv}#»tUSΎΰœΊΆeXΆq. ©}£}s•`›ΟυvΓT¦ŽΎώα,e–³σ¬!|”2ξa…}š#²Ηz)ΑΏͺόHVΆ€©αΊ±΅\¬φ\›’^ΰ’>Œ,η·pK?‘η²φέ…‘Α;?ύ•―όβWΟ]ωύφW>*yφ8ύ°œΟg#πɁ₯ ΅prrόΟ--¬W-,n„QφΆ]˜BO"½:‚: q@p[,Ωls–ώ¦Cμ‘Tl$»†ήηωz υ Βy†2'’ν{7€Ϋ’¨_ΩAΛtN₯}Άpΰˆ2Χ5yψAO_².š E‘Χ AΤ“Ηχ"°?" ‘’WE†^tΌμ§υ¨³3“q¨o£ΖŸƒ#ΠΦG»ηm²"‡8€3³Λ“‹‘ΑYXXαπƒfΙΉAveΆΑ:Tρb=Ε”ΜxΫo[ΑΆκuς;iύ:fΞ²‡‡)|΄0”‰ξΌΏc’γb`mwŸl‘κάήΏΞ²z΄»ΉWΩ¬dΩJΚμ8PB1«Zd°²;΄xξΏ›ΜU4ψ±‘§F!t₯“΅ŠC{ŒΓup ‚λΞαsμqξ<˜jθ‘kP%υΠΟΟ‚ :ΎY1C†M΄Όξ¬Γ$E'²ήO(»σ]ΰ)hΙ\³”Ng3Ο:ΆPρz†Χ°Ύtͺω|ΫUvvt₯s†R;Ywƒ)‘₯™47ρŒ΅PΐM#Yι’zzΜΣ5©Ύ‘3¨0Η8i‡.!€8@²ŠΜ~Z €.‚A%”°άώΰ^ϊώ;gζΒ„`܊¨Ή�€2*b΅O0AJΦΒϊL*2D/ΌςRϊΒOžl:ε+dΩε<υr‚#™bόlz’>ς»Q�jPY©3­sΟ½šuœdό—Ρ<F^ P ΣH›ΖF–@kx‡³U•ϋaƒΦ‘§χ*†[ͺ"…UπΛ}₯²Ώυ΅Φ‘ο›˜ΦG§�! κ:ZɌσ·U2ώ:Ύ²‚o’2²|›I»ΫkQ«.eWφ‰ϋg› άΰL0Ζήν«ΛKάo- ™VξMϋΧ@Πuͺ~Β ΏΏSχa¨=Ρe·Τό;Χ+€}2vZΘφULœ²o f€›Ϋ_=kT‘/eb―˜*š˜$›ΖU¨»ώ3π΅εE‚™EφAIφ˜|R 4—λ*ΐvXΪΰ>Ppl9²€χ-km‡ZηΨΐVϋΰ9>¬κq”Ό dŽ>ζ^aBAΥ_ηΎCξί»ˆdwκhCH•k›ŸΖΙ%0dΏ;/‘e>Ϊ9―ί€ρΉνtέ;Φώμσβ‹Ο6s―½t*ΖαύΜ­[©½•qΓ ¦ψ>φ;—…2|χašαzTp·΄I0ΐμ½›Μ‘ΐ­mW�^Iίϋφ·ΣΚΒzθ^x=ήo5΄πσC£”ΰζg>ΐAOouδ1NΥΨNYBYΑ±β(ϰӊsΉh'K$€φ«cλ=x?Ϊ‰ΟEΦN†±ί€!΄ŠύT„V€DΝƒMνζ`d°i°Ηv ‘ν¦Mχμ =f�Θ|’q΅«FΠJΫ.\ΆD JΑ₯β~�Ήr―‘+ύ€`E¬ήΛ,±­oG''ΡόXΔ˜Πq½μ)»N(z[ΕϊkξlΗε₯σ€5m=έι½ο7}πξ›\*¬1Aη~ƌΚ�•k΅ u0†, *f―h?΄iΨ@A-Χ§ΆΤ�ΉΜ“I_…qmIg°/%₯ΌΠkΐ{}Σ†¦O5ϋEΰ(βΧ@IDATΞsLπ8Jo,9$ ₯”αΔ*l•eu₯2kΩσ‚+Ϊe†2�%ΦγΖ€3l€Ψ K*:\'4_ {a%_O½Όφcbbš¬5vχ]A€ryΰ˜5P °ζ:0 ”…b«^A%€ύΌ§LΈOƒΟ"ξy΅λZͺFŒŽŸ*Υ-*ΰ ν€χ·XλΜsώjlω!Χ)ΰ¬">K½mΟμΨμΔ§ι©Εtηވ©ύΤ¨ΏΙ5ή Ύϋα0Μ΄ 4*8/¦J^cνl!x9—žμ0χ‚ΜŽ•λ£»ΏNΉΗ&k±ΉΪ<Ϊem!nΜ}Ι@΄μQα^Λ=;τW²sαy€έ ;n§…A™―SφΎχ,Σ Ώ― Ζ^λ½k/Ύπ7~ζηώνoεττpηg³ψdŒΐpπɘ‡³«ψWŒΐŸϋΉΟ·�ϊ�ψ~&'Ώ¨!ŸŒύ6YJΕ· ž¬WΦΙτaΣ ±―¦‡„Ξ9ΤSƒ½hǁ4x!Ώ€‘ιœθΘx˜πΏ¨ύ·ύ£φ˜€”¨υΖ¦FΔ’¨‹ΎL摞ΊΣΆ62£ς₯8Τf§¦ΖΖ8%rψ[k8™:Ÿf,₯Ύ—’]πΰμνDλ:W�HΧŽ_βo8a5©©»‡;Kύž›z΅ £cSꨑ—Φr@V@eœ…nM›'₯e@ λ%O‘Βκ sΎΖgΰ’ΕϋK;Τω΅-–T@i2%QPƒ₯\iƏ‘`L Α\²,ŠχHY>α ηΧήd’p@ύλQγύψάΘj€)¦X¬γθMφ †Δ*`J” aΟkˆ¬ϋδCS{[A‘­οΛΣI ·G)€ekaUη_ΓΉw�₯Η{ΰΛ6PwβyΠεό|8χΞ‘Ω³y:2$ς‚aΝ’tC…ΉtšE�}}63@"ΑΑΐ;Β‘Ρι–ΩbΙΜωΑ‘Tέ�°‘ Σςψhš|ϊ˜ΐI΅τ*2η8mώ{¬Ω�ΤQ_Η|•u„©ΰςAΗ2ν6ΫΣ…_E0l= “½^C λνwξΰ'‘G3^NέxοΰE2zθ ΈŽ!~ο3¦¬rƞrΡκt`*Œ=Ί›r¨ΥΈΐZj‹ΪΫEΚϊoάL9ЍοCνœΨeόSύ\΅ηPψζšνKΑιΗcη½Έκ”.R)ςζ_UΟΔΐ―³»;ϋœΏ"²&Σ“SιΓχήOoζ}Ǐi'Vƒb|ŒŠCφδ6Nυ.Α²4RA&ΙΞή.AŽM‚‘Š ήο gKW�Εͺq `΄@Ν©₯G β=}ό˜ΰo1Ί 贇ΈŽ%ώλΗήΞάƒb–ΙPX'ό"ΦV°΄΅σ €&Ε€)yfύέD<)θ–Pcn ωκ+―€›7_&‘ Θυ�Gΐ411¨EI c΄Gpv`γ΅G_rZιiΌ6ŒU*c.‰‘X�%2ξSΒ331ΓzΞ:—–/`šΒαtΫωΑΥ ΞugΠ_Ζ½³μΙX�‘N2lΝΆp*π#@ƒg€@sΜΑνί–’™:ϋ�›QΆFΨZ―ΙΩ`Ϊ΅ ϋŒ‰ίύ›6Οοαh<ςoŸk–ŽX7‚·¨‹W/Θ4‡ΒΉL-iΦΣ*χξ~ήώ£οoF†Ϊμ³Y^C6,YΉΪ°”ιτ°~Ύωϋ_TDp³― ‹Φ‚ΨμR€wΕa›Ϋι΄ΐή«dTΈuzhm©lg°{d:νx644Qz³Ωwγ₯XŽ₯6ΎŒΰގΪ Εζ,!°5κ&TwΧ}ΟknG»’Ο’2ΦΖβr’q°&\Ζ:Ζ‚΅,‹+€ Ψ�8ξˎ/A[&X–ϊ^,@E–|ƒ ΌŒμmiEaΊώςe‚nƌ1έcήΥ‡™G<π[ίϊ£4<>¬αœ%a흐ιΟ‘e'Ο+,cβ)ΫXήƒωΦCiˆυΨΞΏΦΕ+—fύ4£ ΐLΟŒŒ‚Ϋq*piω›AΊΧΖ� Οs'p₯�;ցφ@„χmζ™ayΓg΄Ÿο™`Φή󒳓ΰpω€sμΖΥ+©�δΣgΙΞ3%©[%6ƒΝΈsο.s~t<-rkW΅mλ¬Oρ*u&HpYœ_‘Kg5kU:ώ_vš°,ApΓkπΪζƒž₯m―Ιˍd‰ln"–ΙEo`½N―ί{)Β� tΛ60`φ},Ω%¨¬rkΛ³8#ΟΈ¨[RΝύ8¦ά~°πN*ιŒΠw�›&¨tC`?£π‚Ή‡avΔvε"€9ΰ'υ‘”qξσŠNΆ΄t€–žO)Β1% %tγ`λ‡’ZMLh―±ΆX·–„O ώ¬~Ζςη{&τ©adμٍ$ΐA�έΞ%>,ΧP‹Iΰί5dΫΒ*Φ΅>Š@�ϋΚPך~Ÿ]΄LŠΈ�ύ›ΰf$“°ϊ‰Ž‘kΖ³ΘdD!Ύ]|lυ$΄‰²mZΘgΩ …%™Άv7’₯ζP_'k‘ΗαλgηlEΜ±ƒοΧ+jΓύhƒ-υjx―JΞ=mŽ  r¬…σύνισ_ψΏωοώ{ι«Χ^ώΙwΈ‡€ΦβΞώοl>#p|&αμώΥ#π«νo¬m,Ν-Ξ~anq•ΨEd ινΩ`ΡΧ©>m&ΣzPk*m5g+0ΞΚ’ΤMΆΉ‹ ˜€4ωΉ©)TτdEί¨…33ΥήuGΉα‚|�έοA½ε°�y-¦ξω§Zg�‚.�yu tή§§ιυŽΓ‘ Ε΅ͺQΑ²Z‚€š¨‹žž!ΣHΫ'PmşJŠ+ΉY+2«�PΝΊΩΒP ΐχτž₯Νgi~ΈŒά› JΪtΟiκ6θˆο€z+ώθAnFΩΜ”²‡― Α!NΌ™Ÿœ|―W}$9Ϋ£†ΣΊΗf€©€Žν>ΤE_oΠ’Ο­Š΄‡Ώ*ΝKΛ Ί vΠ;qV ‹‘yγγ˜{Έ;Ύή‹t Ό/ηΤη{ψW1†Ya?¨…:M Ξ‘sξCJ|8Œ{Аyν©BήΛ±pέxφ”ΆΧΆ¬4\΅,Z`tχφ₯*ξ‹ŽέΎ�½43ό€u‰Β{[ε-©₯£5υœ?GΟΚT‹;υΑ[i‹ ρ`WwzAΐho#egyΏn2YUidb2ύήΧΚκύ45½I=9ΤΠζΞsŒ5bƒκδTγκKΛ<d*.ΝMύƒ©΅XK0ΥH@,•έςŽIΦc ™.žD_j¨’<Wžr…'!"VΘΈ4‘1>eΞΜξχ8 #p�ΞνSyηΗΟΫΗΑ9Θ±]ρ0N>c eOλQR_'›ΆM§‡…ιZ;ς51›·C,²�­ (Χ8†Ϋd‹ά3λΠy πGλLυ“*©ρ,B?αΒεKιΖ§nμTRŸ:{Ϊ,³e&=έέ¬Ρ“4όπI¬%Χ’²Av0|ζΜjZΪ$ΔREFή¬«ζΡu°wϊξΥ χ\Νώτ> 595D ¬eίφ Œ‡θYOΠ 'uυΑZ­ςš«W―G`Ύ@v_ή μokIοyS– ϋ£„l©”imΙω~:O8WdFy]ΠkΉ6ƒ¨ €ςu.έ[:ΑfŸ‹YΟ2κ¨!.₯Ž{‹¬Ϊ6{f†�ŠCΨDf ­Γ•ώlKΎ¬RΎβtΤ&sO�²Υ)‘ξΨP js?ιΈ:Φώ^›αώqΟϊuΌμ χβ:ΙλλΩΘHΊϋƒτΖ·ώ λDZœLίό§Ώ Dty±΄ΛΉ8$π5\4-cN l-hΐρ/Ύυλ2N!Z•¬αœλŒΜXC‚ΔŠ»ZšeιΜ*oχ§tίωΉY˜λ€eΏŠ†ͺ]<둍ΔΟμilϊ‘h(χuΐΉΪAΌΗΎ:μu;λψάMΞ±YΣFΐ’}l€­SΛK΅σŒ›λΦυ’=g=Σ'ώ9ep{Δ=n1�ZΟ_ Εν²aZά`@œˆ(#@Υζ B)ώYD0+ψνΊ-G‘ž 8?Φpύ|^0[ζάΫ±žΉΟ4―Q–Œ8―QO‰}_B Ξ§n½Μώ�ˆ@ύςωΊG”§@έ1Φv�Π… « 9Έ)ϋzšr˜£Ε™™ρvJ]—²Wά§v°] μ<Αω|ζœΫ ]…]l)·{―rFΗOΠ΅€ΆvΓ‡"Ό²"uΐ‰Mμ¨YxχΊώuχ§ε^ WXFP₯ȞΏHς»c£θm@όsΛΠ(kΩ^†@Ώ¨φKf}Z"ŠΉ±:e<]m¬­ν©&Χϊ Ίž?Ψ³ >Γ–Ρ]½ƒμ‘ @5l φ\?BΠ�³bΖDΥάϋ& ΄7ίz+έ4 h€OFφ¨‘QΗά£§£±Θη:mlή™²…$yδ™_pδšΡ—q|C·βcΏO-΅H—‚eΐίeΊVτe+:̍€Κ σ’ι‡ΙΗϊM!¨ CΐnΪ¨Gl@z·΅ΪjΝSnΆ΄Hω{F;λ9³LΗ΅ΕΠΗ—vΗλ•ΚMΰQ‹xcša2TU—,ΎςιWώJχΠ΅Gθπμ³ΗΩ|²F k‘>YΧtv5g#π�Χ�ώί?ώίήό?g¦ξά­έXYΉuгsˆυƒΓ�Ϊo1A†΅–ee8£dgƒβ\ΰu‰σ܏Λ€©ϋΥCΐEA-ϋΫ9€s:Ύό½‡*Άα¬ΫfΡφ^ΦΏΩ«žw–ΓΑΑŽ΅ϊό�–:q­­ ξ t+h±VSΧΩͺ5t 6 PV ΟΝΐυlKηϊ†‚jνΣάήΛg XH_ƒβϊΚ*ΒySγά΅œΠφ?#•ηZ=ςδiΊwοadΪΝ4-“ωΙ�? ΪΙFfp>­ν”BιiuŠs4r΄Θh…Ζί’’Q°0;oWOo―7ڍqηΰœHWΟͺϋf•ο# ζZΓQΕyΠΡ΅Ÿx-υ"zΛο‘9Ι!³…S$…·₯E~ήzGέΗ—�¬[ήά!° μ€Z†ΣωGo~?j4-OPˆ§ξΖqŠƒ›ΓVTί @ΐ"9^ μu$₯v›‰τωφ[7ΰ’b.]RgΣvg֜K“TŸAGCG֌¨οούGTΑοψΩι(υ8:ΐ΅΅edzRe=¬zΨ#8K“SιΡνwY3=€D]Τ-7¦ΦΎ >ζ §‰·Σ*ŽηΥ‘«ιϊ‹—©“·cυ»ΤκNγpQύΓχί„ήHMs1:•N8dfάWθU3ί'PVmZησϋ0ϋUL qαjzαΕλ8‹0ZΤ28X:1χο>œiH|”έ‡Ρ0—Ϋλ³C8ξΤμέ) ΰ~ϊU‚*ΐ+ΙωiZ4T­²φΩθRE6Γ8μΒrΠ‘/ΒA―i Κ^²%Ϋ2Ÿ•Gέρ1Α�$š Pu§Η§‘’fΠθhHe¨Υ ΰΔα0ͺσqt²Λψ›οΔαΓSΫΒ©,&{ν…‹ιӟy9ΦDc8O=ιέ;₯12z­\λ /^IC΄™|ςψ~ϊί�ηίΔin€§ϋ@¬―5Μέ‡v―(fO³T’ο» œ‚kκw5ΆΩΆ¬–μ[k{0_@ξίΏŽdW‡ ―mˆ–j:Ϊ¦ΩνŸ_”C{¬&ξaΰˆΰŽ@Mηυ˜`fΗΊfΚρ:εDιΔ`Ιε0ΒΊT¬‹(<θζ•Π‘eυφτΑ`’n™ΰn@̌eε*ͺΗοfh?‹€X΄ΘΣρη=μ³ΟZΗ‡eο•³›ˆ_ωVΘ€Κπ‘Ν 3@uku‰ ΎΊ Θ’•Sm~‹2#[ώΕϊηy±ξ}^χ‚_Ως φηϋΞ11Έ3N>€ω”Η>έY^I;kh4`a+G‡� ‘6—₯Π©)ι*-·Ό‡=Fύ3a˜ Ψ±ΛJ8_Έ~ͺφlϊθ½χV«QiΗqΗcWͺa2Θfͺ`ž.h‘έ@΄“ΝΔΔ³θυ^ =?[WSQ–aΒh'KκΤ\Yaμ’Ÿ`AˣȚ@«Œ’j(ό–*¬,.Pώ5‘zXG―\‚Ν°œή{ο2ΞΗμΥλ<Τ­Γ‚*ε Ψ&X°Œΰ—`ΝοΨKη |k\·$“φl[˜GΫΞΆξJiΉΛyΔ Fΐ’ vMΞ‘]C””¬,΄v[{39\;Ϋ>lΨ1ΰΛ!’|ε€Φ }0ήt (‡³ov’Œ7ΰΣώΡΑmoΠ­—Ζ)—γ½ώΜΟ�[ι2χΆ΄ΌΜΎ(1(η½φιˆΐΌ ΫΊpwKAΞYΧm.›”ΑŸΰa ₯Aό…σuŽ%μύXt8`^ΰkgφΓ–ΓF,,,°n™{ή€νΖXe΅:݊ψΠBp1#@ΒΟ₯œM–O(f˜ΛυΡψoσwΛΤΔΨυΉό>Ί&18;0Š6ΠΜ±»ΑΕ,» ηŸν>`{Πlgχ„ϋUSοZΆυ� “%ZΡ‚˜ίy�<Tμ€–ί8,˜%#byq…ύΉLύyΧ…Ζ`RW=έpϊΣ%ΨgQZ n©7Όυ~‚S²ςκkXϊ±…ύΫΐfΚΈ`΅pXφHω»CΐΖ/A~.=φΆΐ{OƜ`GΓόμβ°€A­A@K…£Τ%E @(θγpOš>\΅°uΪΆ@Ά2-5κξjHƒz ‘Κ“δh­―K—†±‘-ροRμ}#Άό{Ρΐω{Έ²<ΓοΔ’«1> x s‡Ή+όxoT˜©©#iΐnnλ €τύχίζ|’kk‘eΖλσ`i0ž;œϋQΦΒZ“w€νuΟrsœ1Μ™spRΘύU³ΗL<ΓeŽ ψε™"σTL`₯”kεWψ¬aΖΟ1qίξΐ[e―œοaύP Έν>{†+€dȁΐ�•±6'��³]ΨOŽύΨΘXzFΙ‰:ΆΠ”I"P R ΣμTYV–ΠYς( _ {‘‚�Ό–F|EΉω§“]ƒηεηα«ί4p*Οg#π‰3ΰΰ7%gτ/Ώυϊί:όώΞίΏ�πή+δ 3XΦι“1ρ ˆ>6֞yJΨgΧƒBDXνHa>Ÿo΄‡±}Θ Δ †uEΞύ»�6(ηcΆ‚=@π¦ζ‡A‚fvP0Ψ0ϋύδι(ΧlϋšΉέη9ΓOžΔ{¨Ω°AζPškoΟ9V2_ΜΫλά3ΟvgΨζ=₯%w·w₯Ρ‡΄†LΙηύOΈ΄%αΔbKφ/;Mψ\ΤλQonn gτξν·ΣΤS²—vS1lΠ›žβΪUΛuqΦΖ.N―A‘A“€˜AζΪ ΅ς�«CX[]*ΎšQ‚ύP\ύ–±Y£e¦s‘xŸmu’΅…²tά_ΪIΑ@KΌ‚το~hi£ ‘ΥVΠA$ΏνTΦΘH6Χ7’¬ΒΦ΅α —D γ΅ ζπͺ{’C4έPΫΔΏ³"eŸΎυjϊώwΏ-7Ίνι鏬ψsάΗF!膽Σ� ³δu4ξM5g œG[΄Ξkr˜χ"JΌ-'CΛ†Λ6³ώY�fM΄χχ‹½�©·djj*ΆΏ@¨λ¨›kΨ&(˜P4ρχfΛΥ₯Θ–n±W T\ΛD=±f/ηʎy(5”aΜlΌΘR)…E΄ΐœ½ϋήmζφ˜Ξ°o°”"X.` • 5>[`œθ¬εrφΐBˆ)’>ΝΓ4±ό¬Œ5Σϋm@V‘Ώ θγl―e� 6ΐ�² ΌΟόBμ2NMΨ1RζWe?(ŠθΎ‘mα™1/Ž0v‘=ΗΆȝ`4ΈTφμ'Μ™ΑΑΈ�μθ §Φ€Άl$(iΫ„Ε±¦ˆ=Κ ώ¨°Cέze‰ƒƒ¬G€L'mw9Oyύ"].v¬˜΅φε@#₯‰ΡQΨw#1 KCš½{Ν3GFΔ6ϊFkΨUK*l©jkΛώ&ΓM₯ϋΛυXKΦΫVˆΪV”κ.(¬'Θθ ΌxΘκώ˜Mwμ΄mv%1˜φs=(ΦΈΰ εw–†HbˆΑ?πgΕ ‹Έž“cDiύΟΣAβ"»�ϋVt›κ,Βl/ώΒ6Yηœx‚]™ ›²–’ΧmKα�ξ>ήP�λ*ΐ_}ΰχβΚFΨ ¬ƒΪΦ`j)Ic<._ΊΑΨW€'#γΨdζ’{²4,�—΅nΩEdζ™―Rμ~vŽ΄cvΙ|ŠkW;+κ¬6‚₯j€δzω³_:ΛF†>Ο |Lžθ½c‡΄Ο©φp'ΎΜGDh›ƒEαͺω™I>›φD=ΖDLtŒŽ C?£ύΕωIΠχF2œuΈm4Rμg¦'AΧKΙQ�ΜAΏNύjΆοϊ -ΝΖ9ι9|ΘΜMΜ₯ε%κR}-η.Ξ]ovOη$Ψά»Ay9‡—Πΐΐ ΰDθήΘƒ•l'3ψ]Ά]+aά<œΛΈ¦@Ξ₯2€fκŸ-j¨η¬&(WqHΗ[‘0ϋ_,(φσΐϋ ,ψο;Ϋ©Oο"8œD^Τ…l±λΆΑ^)@‚4[«Rd³΅ž™…(αϊ ½~ΑƒzΈ#Ε$;iΤ:§ΞƒΧ„:U%8t*'λ€ͺι σΤyχ`¬B½6γ)`P³Σ?ΠΦΑ²ΰ‰ΚήΦ€/OO“‘Ωa½ΧFbπ%ΥΣ{l6tlΑ6Ξ₯:W―_ΑΡ£Ÿ;σ»΄0Ξ½Σb”ltίω‘ΤΧw.²4~–€ΑπΧάΩΩΗz-¨" ³ΔΜ!σ₯β»N² €ή‘gƒ3{UΑ.BΛct1žd·νS UVΦ€::RΤΔŒV=XηΪ m†»ήώ~φzŸO°gp@ΧΡ֐΄šήϊηoΰΕ¨°‡΄?:υfBIΠ³΄Cl‰4χϊ:t`§¨Β]€Z]˜KΨ‹f¨ί-¬±Υ•%τ¦ώμγz :P\§ΌΖ Β²‡]Ώ3Ο|֎@«Z!؟(ϋ‘­‚C~Θό[C―πcϋΑύγό8ξma=Α€ …% ΚΪNmŸˆΪχsYš/fΛΨ�!έ”dΑ΄’₯c9Τφκ"Βƒ«AoΟ5mΑ@ϋ©¦ΝzκξξM=ηzΣ�μλΤqΫ//uΞ„z:cšƒ #ΔΓΖ4D‰…Žύμ …-CΧ P펱0b₯ήρ3ΧWΑΓ €eTΘf΅|Ž‘vMpΡΙΡ~7’m48–dΝΎΦ9&ΖΖbn[]㎹c%`j‡ Α<n Η.A7vHΥφΏ{¬%χΜΠ• ‘Ψ. m'Ρy€ΐχ£§‘‘)‚ΖΊpe•Ή―Μ‚3%\#Aφͺ©­χfμkλ͏vΦΨ�—RρI>εAΣ0* FΩS”Έ€•Sͺ²·½ΗΉC+Tζatμ)eυιΦOΌŒm….Ύβω!ψŽν ΜH&Q1žϊ‚©jXΞa {Δw]°&\Ογϋ€WŽη’œŠ8 L”q*φϋ:νσψl*ΐΕhσΉfο'/·φέxOƒLEΩ Ί‚Φ΅ο˜ϊplrφ«Ά@1‘h›ΘC‚ΡbZ oqξŸΉ±Όƒ! €P†ƒώFkG?>ΏηQΞά0A’P!hθ=¨΅‘ύ΅5η)qπmnΦnΜκΙΖ/ Œ’C€MσΪΈΙX–0hΫΏ{Ž· Δu€1Ηe›χΨή΄T„‹cSnlΈ^ռʎC¬5μ¨Ά\FΖ. —GOΠ―tεί2”σΨ³‡X—0<<‹Y“vΨRŸηιΣ§‘Λ4ϊd„r ;°Ί,ΰžρ“*8σžk2˜˜¨x,ΜώŽ2KX†…΄±,aμkj*ŽΊ{:�ΑΝO}κ?ύOώ³―ύ–l·ˆQ:{œΐ'wΞ€ƒOξܜ]Ω�g¬χϊύoόK>|oˆΪ‹‡:ԊO‰{*N&F[Z�Yηη’8Οdc�mγwφpΦ1–eΰΏύ½]!ΎŽDYρ:œf©Α”5΄ YCΫ₯ΦΊzX3k-‹Ιθx› \ΓΑ]α°Τoλθε@…šGΤΨάNFΎž  0‘©₯-„ež―“ΡΦΡGz=ΩΝuΕΏt°t¬�ΥF0@DΩ"x΅^rΗFΤή~Μf�€₯—2FΆ ΨΐΣγπΟ’ω’ΗŠ¦q­R~ q6N ydιτˆ΄gpΊ¬ρ•ήΏC³½Χ^ΗΩ¬Š€‚ΤΧ$»½Y!vz©�9•κ8 ^(|χ�Ν[‘εύ½ίϋ§8>8AΌƒ™Iu&!G¦(v$³> φ ŸTYΐ(λΈΘ™΄^TG—k `“‹b ΜΨΤfιœϊ;:Df Λqže5EφΜ9σoέx ₯1#Oξ§wΘ’f~Ž,«ΙΪ‘ΐDέ‹σύiŠψ4 ˜‹/QΛ~-hρΥώf½g`ŒŒB©έΖΩ3;c+1ƒα 2ύ»»8κά’σͺ›˜ΓΊ)†ΦjΐapSΛ ‡zi[HI�Ώ{ηC²&s©�!9’u‘Λ—_ˆη/3gƒƒv”3,‘‘΄ƒ‚*ς§8ρfθΆCΫΒ‰ήg|Νξα΄ω”J2$f*έκ&Tμpο‡ΌΏŽ’βS+dμuΊ[€΅v΄Ɛ p]#:τ‚gϋPuγTWBJηΩυ‰ΙQΐˆ‘ώΰηϊ»x©bY‹μ!:(Œθ™ΩΔVμ‘g#£!*λMΒ`ΟΟ2ρσŽX»φkΧIά²†1φ³ͺν5u“κθψΩ£{‡,ΤΆA [ΕΜR{ώΒΠΕXΟwοΓβX^ˆςχ²tΦ‹/Η½:Œωάδ,Ω9Zg²,Ÿ² ‹ϋΫ=rJΐ£Xˆ‚­έμεήˆV‰p¦5Ηκ Tr–!μ’�JπΤG;η;ˆΟΉ–] γ‚–A™Ω53Γ+μΡYœήΎΆΘfnΤيΟ/žmμΪ*ϋOaXY${5χ>c€ 4+xΰ—{F–Ηβ"υΚΌΖϋ {hθbŒχ° EΪ쌡ο+h l²ΐ΄Ž»»Ӂ@φ{)„¬€t«πLAΤ ύή―ίΌAκίϊf€­°΄,9`m(BΊΓλ ±Ρ%Ψ\[šΉΉiœv€Φ�"@‚tυυ ΨΙ%ζ1Uζά€4΄Qηφy· )Ξξw…*ΝψΧς:mX΄a8πσ ΠΥ•0ΐ¨Qχ‚uΡAφUΣΉ λΜ€H΅ό'l›A™γβz“ dΗ+‚]μΚ@pW?bs€dZ§ιi:¬­!²ΫΒ™�&ΗΉ²τώέližφΜυΆΨ¨{¬ύ₯y¨ςd7·”:{{Sw±9kι'Ώπ•ΤPέΐg’=¦L§κ|wO/ϊ!+:¨Τξν�!dy…λΓΖc£ΦX w~πa:„ιΐΐ1ζΤ» Τp>Θ¬pίjg Θωχ°£mΐn (¨· >€�ZkˆϋΝLSχNt)‹O†Z{{kκ‡φΎ0Ό £Ξ=Z(Ί·ο™“fX[^Y0€g¬₯πs<h²9‹*³ΛΪ #*χs`9ϋj‡5½!ψShΞσΐr5u’kCΜMv]\ .m² ͺO׈Αελ\έ„μWII!Ω`μgWσ،>…εtΡ ;+˜m]όότ Ι‚Y˜=Gq%Ž=Μ.λΚ V<kIΐΝG!ώ‰v[PΫΟ·β(Χ‰7Λ\Δ €,’˜¦œq_Β1χ·Έ§ Ξ3Χ²7JAbŸrΟΌŸ@Žσ΄KΦ]††η™{:Ψ Rώ±Ξk‰ƒ<Κ,Rό°ŽΐΆ«£έ › ]M( i�…΅(%~ΒΊp% ^dŸsέ6­m]”½άF₯έBJYOΛ€δv’Έ©ͺoa-ΦβP�IYT V†σb‹�+Ηϋ0Όž2UΎmΚ1—–·"pχΌ±lΖn‚2 a ’)ϊ|°‡-Ο°>Ψ‘)"ΐλ|»i¦ΓΊyxΈ Ϊ₯ΔΔ‚ σ²ˆζΩηΐΥ e2ž Ο힏ϋΗ™ΫΓχΒφτtw8¦Τ;LΏΛs‘·½;ΥcΓ§¬VW&Φ.Ά”• Έ PΝΎΡ‡|Xψ=@¦‰ς„ƒ’’œΡΑΑΑ�ώΏψΪυΛΧ�½8‚«3sφ8OόœŸψ):»ΐ�η|νkΏΌ_”{8όxψΑ‹d_Ϋjλš"˜β€ΰΠαΕ±NνAbλΑ2 f#ΧΘιΘΙ 0Xφ‘γηαΟ~—e``TRžoΩB!ˆ·έjΙ°5’E.Ε‰΅x�ωΎη‘ΙΠ€C¬ Έέl+Ω ƒ§φΞn˜BΑpˆ Ζ=T«Z"ΠΫ€F\ΚΟ;‚ h·j§΄!άΒΉ_E8ξ‡o½π@{«=Πq}ξAGή,›YQ³;ΆaΛxέάaPΘΜδαπυ«Θ~©�nΦΕ`^GQ₯`Aά †21?zC34Λλϋλ(ΪV2ƒΣe$ μ>CΔ ŠN˜tNW­[οΝzb�>«΅­-??ΐ˜AHι‡τ»ΌΗϋγLqΨ›‘:ᚳŽ΅ba ΞIEΗtρBA―OηHpB„ίL„Lι₯Š3ωp^"ΠcMΰr8ω8&PλjΙdpΨ3�ψ‘8SΠ㚳”"|eΠ±tZψRaygk-ύΡ·~—Ο ‡ψyθώ­Μ!"Ž8ffί*ͺΠ-XžO£ό UΰόtΆχρ{œ5>»Α5ƒλ_gΙξΰΈ¬ρzZ=™‰\^†ϊ8Eφ ‡XM΅<ΜΉ. L€[;��ωΚ!κ›hϋˆ—=3=e΄…`•1'D¬―™ς„;·?L‘Πσό«Χ.²nΟE€ΧΨIŸphυή~— ŽΊύώ‘Tra:[bI³6xΤᱞΥq—>k@‘!sŒΫ!«έBΤ0ΐ°t’Ό­œΝ<ΖψΪ -(MmeχKΜHΊώN˜'τ²0­mυι‹_ϊBΠχ[Ϊ@pT·q>kλκƒiπμΩ3@ŠU~—Œ = Χ₯ !‘Mμ]ηWΡNY2δτX–μaœg�. ȍ„€›4iiχŠψεΒ΄°Ζ΅ 6‡ϊ²g,sro ΊW₯‘Φ(υœ;Χoφlmy‰}O2ΏG8Η%Ό�ζ l(‚ƒχβΣάϋd^₯IdHkWEš(]ΡΙΧΩά{λ;˜ΝLYE0H ς3ŒΑ6ΰ‡5κ§–}ͺ.YΆS汆7A0ƒdπ~,ZωACηž†!φ‹ŸeVί½#φόαΎsξu|w―-ΐ7φxΨjμάgΏnSκd)M€ΓϋΥΑxXά;‘�NΠΙ<(’&«Δϋί&­kjN/ΏςjΊw�nzχέhνμξ Π ΦΫƒy£#k@!>χΆε_υ³SΣLξ)?w`�Φ’ͺν»z‘Ldς7;"8ΟAη¦3ΨΝ l`(ζc70΄‚Ό%+±vάPΛDΡ4νee°;d,(’iDk;Ή–ΆΦΈΟ•Ε₯8;΄/v[π‘Cr9`ότ3Ϊ&Σ Α*ε€ΌΗ_Μ™m  φ9[ά=Ÿ>nΚd‚g•KΧ֏·Ι ΥWπ^+Β΅‡a§΄ΉμAυΌnή>Φ~96ˆ·[ΰ›ϋZλώ}žƒτηŒΰsη{° γ>eΪ•Όhpφρ9Jι|PI²γ j°ŸvŠ$s³cΨιMΨC ½tJ‘γΞ;½εθ€άˆρΙ£UcεBŠχ Μ¬a ΅–GZNκ:«jνOe ύ\{.ŒΙ±¬lwλ΅ΝΞM₯ξάf/,pΐ@a i£gΐ7Β?;Τfς\)oΟ5 œ;5— aMh;χ2dŸ ΘΜσΜ,b^ΛGόlν˜,«]JΈ|Ξ`…λΚχ*΄ˆΨΕζ,³οζΠlΑή<›žN/q―υ”ŒFί>Qu0Ε2}ά·%g=Α>ΐΎΑζΘ(PΗΐ€”η΄η΅¬ˆZή£€˜Άέo_Ί|α―Ύψ�‹�έ—ώςΟώAMNΝsφ8›ψΏ=…›K>»Π?Ξ#*›:~ύ·–ΏœsψΞΨψπEΔφΊΆpό=mkT ½]š¨5Š�μw jDΰq.Ž8œ#(ΕΡV₯]ρ=3T2%B›Ιf€ν˜ΠP_T²|κΠ―ιλλΕ™ΒΑα ςΐ²ξ· !CVΟ@\%υuO;άΌυc™ε(i˜ζ0ΕΡβΪͺ¨ν-#svώΚK(kS ς/υьŒN’΅ΥEP/—pοέύ(½σΦχΣδτhόΰνΘΐU•#r7@kKΐ k₯\z°ΗΈΰlY2ΐ[‡#eozL•ΦuŒΜΒθΰόIΕT€ΡΆV‘mΐ)Μ'8<₯nυ`£‚½–€ΧζZ–p|JV”l\>σ|UΣχ ύφ ξλέwΎOvp%uχŸ'p§«Np^>€F τ]κ5q$s™ΣrΉ–z˜8ΝΎ΅πμ!ΖYLΩΓ>Χx@ΊFπ;=1‰Sm©H%¬iZ1hK 'pΐI.&Π9Φι‰ΐGΨυZΫZ•^Έy5‚zιτœχ²Κϊ4ΟZ±λ†YηοέN°ŽJbTί€rΪBΐ¦\ΐβsΣθ*,/“Ν ‘*‚z‚¦B�M₯μ|ζΜl²Α΄^ΊTl(–Eœ"Œ΅K@§,HΤΡ—Ν¨nh™Χ‰eψΩ_ŠΌαt³6Χ©α>";#€ΰ *εγόmoΡΦ­Ή6½ός‹˜7κ|QFojk¦Ά½‘y, Ž‡«,NIτA_&² \cY«θ*μ“rM$štM[sj;3ƒΘ*2kfηΑt6CΫΒ=ΐσ}] ™MΓ¨9fŸ RIǟ'«m Χλ2Π°QpΤΨζα·C²†lT,•Ή'OȌe':pέω8π:όΞ₯t|ƒƒ"kνK)Χp¬š[Ϋ"¨•V?79My�(šŒ1χ° ΕLχ1ΑΘ1YΊSE( ΄)Ω΅-Xͺϋ’ΐΔίÁy“V/ΏΨ9 Ϊ9?ㆧ\ΨΨΛ+χŒŽΞυs°ΐ19yα5~ΛεgVD<“‰­!˜ς³wθ:“aη‚Πb�CNKŒHgΓΘσΠσΐœͺ�ΐ’·Ν’3ͺλaΏμ£A±¦fΒ₯Μ V‘ϋJΐ>~6E­ίQ‰ΰΎ²Νς.u�Φ¦™p0–νΓ2ΫΌβσeζ°'xΉ£χ ΝΨΆ; °  Έ5�ώlλwΗΜΉs† $ΰƒ ΊIsε €YVϊYμΩΞύE<;°³_όό«©§―‰Œ΄!%α148ΐΊ/Os3ic~.pN?}Ϋ€ύ75ΐ°@ΰΪ:₯“Ίb )υ<ΰϊǝž˜a―Μ@½ ³²¦Ή+m.ΝΠη%9#ΜΊ%h�φρpϋ±-{Ε}Šmΐ^ΞΛΰΑs―ζκ±Velα“δPϊ ³΅Εύn ^˜Αf˜Ό•§mx±ΜP6¦Ί6."‚U«h e“Fœ4ΜEΨ?>—R@mσ)ΰΑΐΈ k>φvž†Q@“RφhKc+kFΝ›Υtχφϋiv|φΣημ;؈››²­θ0xή xf’©²ΊτΈ€’θρΕΙφΆζπŸ{υWώΒ/όΕ7/_ΈΆτχ^�{|βΩγl~ΌFΰ 8ψρš―³«eΎKΙΒoόΦ,ύυݍ­ΗΓο%'ΈqΞB ƒ©γ:a fΉ+2»hδe aΫΎ¨{τπΕPΟϊ]i–:–’νώ�§§7]Ί|)c³μ’ΝΦΨ*fhMΉ-Ζf9X8•θ”0ύ΅6½χφ›ϊ―CW·Ζ‡Ο–F™u΄€DΞLA΅†Ž¨˜ΞRUΦΨ5p8-“Α|t�!έ†q&ά‹Κͺ©α.γB‹CΥl ‹#›8uq�€Ξ*UΔXsΕ8ΊΦ);αδμ΅vvϋΐΆdΦ‚zή3ΓγΒa8Η«ϋό2‡ΏΩΞ¬£©•†¦¦,3»OΐΚ#K€€S”!€ςϋ<υ t‚ύl�­sUŒ£ΧάΦύ·=^ΣNVΌ›ΎΟγ8ΎΖƒέ^Ξ0~yM:Ξ:ϊ~ιŒ™³§»ΑŽ/Γ‘ΒAΰsΜΠτΈz_’ύρœB)K6ΚΙΚπ0CώŽ…š U84—�½ΊΟυ₯.ΎTΞΆV΅‘w)�οώπΠ£› φΘ†sRKΉοϋ1ηόε!ώTMΆͺˆΉθƒζ~αΕ›Œ8WRHΆš<*—Σιoώ3θΦfJo= CΊž ₯GΜ•ρ]Jw68Γ‰ηήΥz(ΐK+Μͺ££C=Ξ�ΐΔΑΒάΚJτ1Ο'€ΊχΰA~Bf±΄¦Άt€Σͺ Ÿέ‘ξΐ2˜"¨zxη>΅ζ¬I2f�½IjΒΝΦζSGmΐ`Π%{ΐ £P:…΄œiΠ λU΄•ΣNΚ1_‡ΖΏK°lVΚ2![½Ιφ) 3ΰ€S—ΐμl)™¬|Φ§e=΅ ΥΤ•RjΐΟR:Ue7TM Ok«k₯ΗσQzp�>[˜kδΪ&FΗΙr­Β AAŸ΅hM¬ΤR˜ΦŽ6:I ‰°U–€΅ΉΥΩ'“ LκΊL έ™εs)’gφ�:z;HΉ6ΰt½ΨΛ^—ΦΞ2IφqͺkͺΉΖΆŽK[ΐq6Λ ‡p₯K8»ή»‹lŸΰZFˆύ!kΔ΅ͺ#lΰ#EΊϊ_�=lΑ³΄`X§‘ 9 ζ"g;±η-QeΔΪfΰ¨=·'Ξ£ϊ2rΤ,;p—θL£dn0,θ‚‹Ύ/vRϋαZ“Ϋλή’­δžγ6’CezΑ‘‰v“ρωfž³‘BeΤoσ΅§σh‹Ο1θ#ΘΔ\+x™₯Ÿ¦ψΑ lφφ^œwΔ+ΙLοb7σ˜›ϊΆ6:xΤΗXIΆΓΑάτt*ΑΡ/-F/€ λ@Pΰ:&&Ζ*Φ’œΐ€*κΜY+‚ͺΞ½BJΪΟΦφφΈ Σ­ΉΥ΄ xλsŸ‘ί§Έ¦|lΡZœ�—#n’±ΟOΥrιιλM—Ρ昝šβ=xμ»γ€-ς�,SΘQFNΦΑ”bLCιaoΞ“e5h1Θλ’C]‚E3φΨ+™q2�,_²Ύz—�G=g‹± [δJ΅—Ζ~Δ«π�-ήDΐ.°Ν–‹“ΟbΊW ΥΝ9ΰ½Φ±eή,ν€7v šγZΘΰrί'dξ=?K¦M|ΌΦk¬Ub”efή5�ΨN›a˜Iy0ρΤ XcόeŒ΄Ud ΰΜΈyΨ9†� \ά‡φ;ο°#v TˆΥξ)‚άlΟΤCΩJOG'Wˆέ$Yfζςρ½ϋdΞ₯§©B–KWw0=ίύLηΤ’>χUœΥŒ]œ€γ ¦&ΔPΛ鈣 m +—Š, ο½°a�ΓχcΩΓΜ λΗ5€Ώs]ϊ{%AQφ,CΜσ7›u/dζCζ€€d@IDAT‘=νΪΨ©‘αεO½Δώf^ ξkiYΚEΤκ+0VΆ‘miλ€-γNZ0;DOΙVΆœΥΆ‰Τ Άr —RŠPΞkά‹Y–ε,…qξŠ?΄@ž₯Rω€υΝ΄d/i―Ӂ ŽzSθΌ ήκzΆ\,Φ5ΆJ- >6Ψ_§a“X3ϊLŒΉI—ƒ@™Β’fύ(qEΜDZ »NΕ_Šyžο΅EϋLηΗχ*˜“e¦–7(-iaqz1MŽŒ₯'œ―+“tR κΆΉ’3λφ•͍U3.fΊ:Ϊ1’'σC‡N@ΏLgŽ_}ιζυ_ϋ~ι?ώ'ƒύηL€=ΞFΰΗuΞ€ƒΧ™ϋγ~έήίϊΥ�ejψΩGΣλk»έωΉ…Mͺ“[{š£-Ϋΐ썁�·�N‹5¦:Ρ’ς�q’rΠxhθT{Π{Π­ΣάR‡ā€LΔaDπaΖΡΎδ[d λCάμ¦ΗΏΉ₯9½υζ·ΓΩ«©!Kψ ₯·η«(θΉ]έ½Qf`φŠh‚ΓŸCϊ£�ή'c/rηÏpΎ hο’U‡ZW•]•}λ?  Ψl7₯ƒt~�Q§?�•ϋ«%˜©ͺ*†’ڞϊΣ�*™¨˜mνŽˆ‡‘-ΪζϊΚ*Κ8ΐν�   ΜδκοηγΔ™qςs ΞͺΙΎΥ@ρΧ‘‰~Σ8e:+ΟΊZ‚Y£oΔͺ- l‘§3WΘ�K7oΐΤ°;uυo««˜Ϋ|m‘yΝ~–S'ΘΜ¦€@dƒqxΌ?λDu$Μ(˜‰‰`gR@G 2ΚX7)°: >ΌF�iζIOC:τ².Ξvu­ώΝ{μ½t‘€ΰΖ…zd~ œΞΩάΜTϊήwވ@ΦLi ’€vg(Δ!Ϋ#.ζσJŒ©ΤlD\ͺ ©5ψœμ\U£·Τ+€%2|� ΅¬σν•°8Α;fUXr,ǐ† …gO]ϋm{O…¨¨ΧtŸ# ‹ˆV%Ί`ΜAKl–JΤ«qΙT.Α6Α‘mξLεP!Ɵ<­‹CΖν£>‚UQπΠ  : j»)ΜΡͺGΜΰΨΜ©Ž’Y:[f²C)ž{S€SΕώm²β9Ζ¬—zθ«²=,½°›…™p‡ΕšmkŸupσ@ΜW›έ­ζžZΫ›ƒ‚]^U–††Βy3C;>6Š£k“�ΑsN-3οΉJpνΕprέ·κ?X σΔΜ½{ΊΉ΅Ά‚™ X 썁A,NΪΫ`/ΰh#žƒS�ΕΨ@2=vs΅Έgΐ΅± ΰ]Φ, —W ΆΚ"8*d¨‡1βhμ#Ζ‡K90\yΝ5ζ`‚—–Lψ™Ά‹-η5;hbhd -α„ή{ο‡dΠ§ωY-˜@°PXΐά'k™5±YϋlVXΰΔυξ—c£= \ {ηζπί.jΫ” „„@(kί`υΒΠ₯”1¨%’Ίv!‰½ΪΚ2‡=$8uΚΊ |L0°d8Ε+§ c:bΡ€ΔΣ#°13+0δo³’ΨΆΘψψΕ{3ΚΑzνrpχφmΨΨZ>·”}Π@‰Τε[«ΛΣά;₯UΥ0ΏhΫΨήΫ‹ΰτ~ƒŠ}X§Τ;η`ό�np­2»=μ¦mλφ0¬BΊ΄ D όd§I颜k{žξۈNζe5§[\‘=β(φͺ&<{ŒFΝ|z峟Ε$‘±ΖŽ°Φ—η ,Š±Ο–“XήΰΓΟ�žΚΊ*b?ΐςέv΅ττ%σMΪ|Ά‹ŽεφzgšΔ ϋFλϊm!μ—Ί;ΞCCYbwΛ_Nm™ΈΗώ”iQDΰUΑhΩY&ƒΨAΫ† Τ€}`�)υ^Έœ―\ €,s”νΎγzPόUšώ"1³Ζόx²6²Ί μ]>ΫϋXg?—V‘ΐ`Ι<¨‡ΕTΛ{Τ°οG΄Ν^Ά£‘¦>]Ύv•�)˜¬'KλV:ž4A0Ζ-bΉqΏ3–ΈW}k>ΦƒπV$Oΰy“ ’—²v.xΡ6瑬ιωλœ—|Χ˜ξ:η9fΪύ›β·в|dΓωzל”~ν…»Ϊ> $Ό†RΖ·Ο­4lιh φ„g’jϋκzΜ“M6#s~σΔ5_ Π{Δ™i‚ΒŽ+Ϋμm>šσ) ’λ‡$ΩNšKδ<‚́‘hžΏI}kεΉC―ΙsΜsΝqρ}νά$ΫO°#˘’¦ΟΉΕΟKρώŒ‰Α³ ˆ ŒϊNΡ•€ύκš,άΑ�ΩυIaεt†Ξwsο΄>­D”3§p@ζΚ“ϋΠΠ (φTk ŸVΒMνS6΅JrΓD„7YHi��μ4"»Πω₯B0”3[@WHaίmΦKΎeWμΕRΨ[‚vΆγ}xηAzϊπ1‡•Δ},Pž©Ζ‰γ*C€8�{κ(snž8w–lΙζy~Ύ;N�wy$R°'Ψ$ΗΣ–Ϋ[P‚‹Ž³ŒPAw}KŠΡ-²΄M0§©™Ž%¬ΑcΖ\ΏEφΑαΰο΅G9XFΏ ΰk›r†#Ξ�Όc‡kJŸΌtλ₯Ώσ—ρ/~νΥΧ^ϋ_Ϋښ{θβΐ?όwώό/ύϊ—ώδ—ίυ3?1ϊ;Ώω»‹NπΩγl~¬Gΰ 8ψ±žΎ?ή�ϊίό›�ωyηξKJ�ωςβτ�Εή›>Ω™žη}O―§ϋτι}ίw ± €ΜBΐ‡ΤbF₯H–T‰­�UL9’³T%•8•RρƒνεŠΚͺDq$ΛUD›U‘(Ε–iQδgΑ f°oέθ½ο§χ%Ώί}:βόD7‰Π8}Ξϋ>ο³άΧu_χu7οm._Θβ8#[.σ½HΆ«~ O₯ΘD‘υ!(PΖΔ  f+Be•Φ=d¬#·ΛcκS‚d-ˆ"P~ψπ5‚ R2¨8f8Z½$ΑBHδ#ΨΣΑ³,ξΩ Ay!ΤΕΌ`βg°d}όnpa`λ4iό�ηΑ`Ψ±³uε1%υ¨Μ%Έ¬ζzΘ"θ (h·ψJ ½ž{Έ. /cRΜΕV”βjΝυrΜ$ΑΥ™“tζά0휨]XJχΗαe°’ž ±ŸA~όΑϋ7BaQ’΅΄†.Ϊs^s²<ΎΰΥL©5νΊΘ+ƒ.ηϊΉ}ξΓΜcŽ{!ΛΘ_Z;» ώ„HΥm’7ΙΚf ΠξQ?=ρi(A·e4ΆΝΊϊρ§ W_„4‡L[ι�ΰE²GεΩωC23Κ‚% BjΟIάXϋLTΕχΚSm;-% fσ€t’C$ΐ”ν0­Μ{³`kΛŸA„U‘qΤ£`:ΚΟ|^Γ=‘L˜’½W€θω«W�₯K—Πψ;Υ•°{ψΆ†ΈeΧ7΄ψ]X\BE@kFΖΊRΰ ¨ΠβšάjζhНa­«t1ΓjΟτEžJ ύH4₯ΤΛDΧrΞΉbΠiΖΣΆŽAF07,‚z 4―,u’Y΅#‚F}Ν(-*ː̫rΐ‘Ωω<γ· ‰"HuώΝM!εε½Νfϊ| nEŒ§Ωo U0ˆœ™ΐ©Ц$eλ[y?\ΙωΉΦΫχ ± q Ht#'`ž@H‘νΆ¦Xpε\–,5 μΌΥœΡŽ3�WΛ«r'g―<—†/žM?ϋ³?ʌ›·ξ±Αfιl—ημΥ_ΔΔ°°ΌΕqΒψΊη*YΎ$ζ–{ˆ‰uΙzΈ);–p঴Ή§šω<δ}φ h·˜§«΅΄pΜ1—υžΨ€lΐΐ½υWP$έ!wwž†8@Φ\k‘y ~šΎ™y—,°Ρ£Δφ|�!k¦·!46•豄€ͺ€Xλb@πB–ΐ|μZ#—FRIΆ Πϊΰ½·R�@zρ•—ρ8i‰ŸQξάΩΥ‘�@,ͺΘp­Έί/Ν­@*ΥC€ΡΕΰθ@ψ,4;΅l€@βsˆ˜d:OW ψ$μΆX‚pΏη`ι­‘·Dλ•ž£$‹}2K@X‹y]†ς3ϋΫρήΕ¨ΠςΌήr§’bΘq”•<_Ο7•_~•3γ8Ήx₯0X'�R㔉eXσž�Χ!ξ΅·Ώ%†›Έ¨ωg ΕΜΧΏ₯-*ΆΩc$»3Œ©l-„£Yω6ΖFΣNŸί mpͺαc-€|KΐȚΌx~$ BΜΦΐ•μKΐtδψY•?ΊJP³έΖψyh μΪ΄ό$Οϊ±lDc@ΟΙκ0!e.zΟΙ}5©O <»yΞΟX_Œ�₯^³ΟΞb)sα›EΘvΥE!JZV’,‘δDΏ }ͺH|0εcO³k‹ϋΛ›9ιΊ�ως�σΣsΞ@*°η1Ύ%\ksC †Κ¨$4΅w’P Τ`šμϋ8±Ιcφθiή„R HQ•—’άP5αβΊ“DlΒψσόεψ½ƒ±Δ·‡½{޲‡ΖΗsΧ‰₯©ΰΒ“%Ό1ζ(±[L“¬£ˆ5· N,ιh䬓,‘Δ7Άρύ#>?‰χ:‰Vχpc1U0�!ύ φbΏTΝΐkμΖΖzΎqa%6ξ£ώΩ/χjύ<ίέ/ΩΕΠ³r9Ό—λ€Šγ‚D}}φή‹―}μωΩΏω7~σ�Ε�τ篜aφώπΛs_ώ6ρε/mρ‹_όβή©Ί †υτ??B#pJό=ΜgρVΎτ₯/ιΛ_Yωκ?�Ηί½o²ψψ Iv³4a35R2N4œΑβ›yΈ<¦Ž›RΥF²θœ7ρ:λ N”\GΫ-³ΪΌΖμ¨mΩtα^1«@δ„­SΉrήw…z7XθΪΚ,$™E2νΊg[γnFΖΠ d†Ό¦‚‘ϋ·np°ΥD°T]Cέ)Ι‡F1ϋ†»  AJ)�‰ΑΧζ=˜ύΐŒ™mΠΤQyΆ†ŽΆΓ«&Σ_Trˆ!ΥXx\Ίt9΅πωχξ…q™-ΞTh€5?3΅˜ Yt3’;ΘdאRnΌ™αΫ‡¨P²^ΔΨI˜WΞͺΣ²€œ?|ιM€Kpf&7KφIEƒχk½΅5ŠυΧ;€γǏρY‡ib²ΰœίΨ8T( £Ež—RHƒΑ€Δ,Œ Ω7ΛTHdΔ3δ³}-K Εσ ˜ΙαR AΧwH¦SpwΐX™•>"{(πlλμ2Θ`T� MΤl9i†γΑ[Œ*€%‚’Θ¬μ–ATRΣX*87ΤΡε ―�aΉΔ™%ƒ²J  }‘:z‡SM['[j5μCR‚‹4ΦΐJX›IΌsΘΜΘ.οiΟt]·λRυHϋQ2Tv rv@ς―*de…– edwφΘή9Σω€gα}2§ϊΣΗ^{ βb*­γvo­ζΐpbQP Aθ–kΆ—­ŠοAL0Γ46uό½†#ήK#ΙΞΞξ €ŽpM?9`/`_ΠMxΠr‰œb %έτε°¬Α½Κ=ΑΉfy K'@)ΑΠΩV‘*­΅ιεΧ^I—_\«Χζ*NΈ·ΊFΑ1ͺ3Ό^–μCΨ-,ΞR&σ―έΗΝ<δY†Γt[kοώb’₯>:ΛΗgςΊrΚ:$VΌχ<γΘρ§Βr™ξήΗ£γρ~Eoζ1Ϊγfˆ! 3”8Po.A΅Γœ΄»€­³ŒƒeΦ«¬₯…I€/σόΙΔLœ ½”ZΨέ₯‚Χ �ά£l‰η»2Ώ !̞1α‘|sρ†ρ λ˜ο9‡T’e“[žη:#*αΆ^4«\IΉΠώθƒw�ŸΫψ<`Žl°n³l}”¨Ψζ³44^ε5ŽΌ&ˆ›μW’aa Θσ“4Λ,¦άc];d–βxVKΗ&ΖuκΝ°οuς:Ο ίC`νƒς‘ uΎomPΫPJHp{ΖΈή]g'(»Ί{ΊΣσ/ΌeYˆ „ΗccΘΡ[Qϊ©6YŒλΥΧF΅OπΊI)aai_o�&˜#Œ_E¨8z Ή6ζP-ͺ*ΛCμΈΒ π€ωbί–\Ψ₯4ΡRΑ”θq…¬8Ο‰{$›$°Υ°ϋ{aΰξλ5ρ”1ΆΩε~τγ`›0©`_Άγ―Σ Φη*‰ΧP]ž.C b DI (ζR­Kϊ)»€lRΒ‘ˆ£’sΡ� šH{]ϊκTe«9‡ρVbνͺ.ωϊ‘ύ(δΣzOŒŽ�–‡fr*Ψ€)Λ5€ρpφZΝ^ΦŒlζΧόŽ!$0ΙC [OFQΉρΜδ"5ε gFQΚΒ#ƒ ΐχΊ Ž‚;YAšΑ wh@ρ=ώ`fšω#Ζ9Zί fψž’†^ΚDΉ ΘΖ(QF‰2έf²@CgΈ&HƒšU2$ώ~λ&ŽοC”ΓYQ?fG‘ψxu9ί_[J$ΓΓΘ9‡©‹Η‹π>gϋ§22ΈΛ7@”T‘iD~^A€fœ[Φ½[Žψ›€ Wo₯Υ¦‚ͺm$ΝεHσ«*δ”ΝfμZp+ό€ά9Ώti�ΰνwΣ j§Χ<€[‰i%χzζό AΨVš'sd+7Ι…5T9’#k鎿μχpͺͺ š{+.ζσL#« @sm—6$±Γ’ΖΝbpXSΌO6΅ΠΏAFFŸΜ0«ξΩž+D˜ΩΥ ³3o­/§—_y1œΙ«°Yΐ΅Ύν€ Œ4KK0CP˜νԈςrΓΞ$>Σ‡PϊO ϋρ‰q�‰GˌΨ¬8wœΘMΪF*MΥSCυ§¦A‘O2Lβΐ9RGΆΦΉu °ηύ¬Α•ψj‚΄Ω€Lb’‘ωυύ‘φRΆ`Ζ»i―ΰ%ωcζsΠcΖQUŒΈ—ͺiWmK7›ζ2Оϋ£•‘ΧΚ|νΖ\’lœ H£WMλ¬'7«¦ηžυΉάo)ϋDτwπ,Δ‚3Τχ7A‘΅Ωx�Ξ2…Ήπ₯βΐv“³…ξݏzϋG(~ΆXσρzΦ•]F ŠΗ€.½ς�Ki‚�ͺՍu.�8MNLΕxωηr�Υμ¨mψ‚,ΰ3όέ_šJJ$YΖdFωt\ IB€�ZFU‰5ηΖξGΜ΅φLAΊ†šΚšm[ιΌΜζ cπ”ΑqK?Α)ΰΒω*!©œH¬o—ά’D’DY§ ΒR―EEj¨fφ‘mΐ«Ωπ6Κ. r9ι9,m¨P¨e^Zΰy7ϋR3ͺΟ…π²α}TiY57«ε(δδκϊ"`e“ηR‡l°e>ŽΎJ6‰OU:LΏψ»™λζ―–ζξYyΦ6!TA³gωΛ}Oƒ:½VηY―t"‘ύo1`Σφš]έ©oΛ˜Κdv[Β·εrΑggaMεφτΥ<χAD1ΧΤ‚’Γ�[Μ­hοΛ^47>δΛϋFΒzζ3‡4ζ,AŽ.("†9·Λ½Wς=3Ό{%α•A Υ¦–FΘΞ8ΐ¦eμoγ₯zφΌJώm ¬Œ4Έε,v©“ EwΔΨ…3>Ÿ!!e{ΜC» xή2»(·bMq―‚�θά§j”~ΖΉ+yδ\43ΐ¨νZ„— {‹ΐ³‚sΪΧ ύώ&eE+ΜΧ­©δŽg­₯;Cg£dίτΤd”;θ ΰžΨƒ’p†χƒdΑΒ#-CώΈGYΚ•πϊœWXOš35)mbc}•HοZ7g(!“ά‚HXΑgfƒΆ˜»ΙϋάΟί:ξY?$ χ3‘¬`ί2 γΙfI6ΙΧ~μΟܟsί³Έί‰_kΰ:φ$φ=χsc9•‘‘‘44<†³mύ¨,ΰTLH£ˆͺΐ‹¨‘„I”gR�°GgΙΝKU%ΝNOFyO]}3e1-(χFb^~tύtηφ Κ—Q¦4…�Θ裇Μ/Φ8„Ηθθνο§ bŸ –y–dJ\©ځLqΟtθγΰ³soζ―±wΊο3?<σ|ΎΦ_ή·^ΆΧάboήΪ€Œ`�ψό 1Δ:& Ρ²‘1΄…’cœ•\φ=ψzϊY‡œΫμ%%»GU#g{ώθσϋΧώ‡‹/ώΤψiωA Υιž‘8%ž‘‡ύ£~«nΰςΥΏ˜�/ώχoNLL4"aΌ°ΎΉVlΟhε’²D .ό]pΜωrJ‹ΘN,Υό3?f°jxBŹsρω+‘™V6ίE}w{ =$ύ}Ά5"[Θ‰ΆΊΆΈkKηž{‘ΜB ΅²£Θόf‘l6σΎΩ¨Ήγπτ{J~Χ–(SO³HW«•φΆς˜Hw"«€7Ν›Κ^·†|‘±βg•IWTΊ=θώ]Fΐh�tεͺηΞ_ Σ<„±_k€S˜8Z¦@Z° 0QJn`b­Ώ$‹R_A²Yc υNοE|F–CΨΐ[S·c²·J0•X:N%\[‰ΐΖCπ§‹Ύ,½ ΖΆ˜flΝLζΦκυ֌Sχ>ρ˜ΊnJ2Άz· 4Δβh­7…‡ΌTM½’Τ„ρ5˜·³€A@ήοϋΛ?ϋ3,‚2# n_dΟ81΅dNJβGέ‘~48Ά6Ω{YCΒξ|˜žŠφSsO¦ π*"π6 2ƒg©΄:ƒA`ΰb>4R3ΩέG{&žΑ& `Œ ό ωΏfˆ€S«šΣέJΧή}ŸV{ ¨S£‡σN £ϋΆR;¨;Μτ@֜8Ξ\Q `§³±)ΥεεΈo‰’žmοπ€.„’ίξ„τέz^]ύ'>Δ΄ _ €|[[Sκcž6ΰ+!6;1™�½u !²% °�{ Νμ „½xΞΛ@rdŒ”K~“ *ή#ΰ&V+?ΩNƒ ιόό;(3˜Βψm•Ά’ε5z/, "=3}<Κ|―Žξvζfw”)HVΩεΒ,¦Ω΅‰Ιι0Όqλ6ςΦ…0Α3/εΪs4ΞΥ%€ο­χή珠αxeρΣΤQ@$Α$i%¨U†ϊ…NΜ9εΝ�|%χ‚?F`‘Cadι‹δ–σHΤ€J§²b@YŽι§jƒξΞ�.ώŒ'%šΝΉΏ¬`†ΊL[2jζ&θ8,λ‰ΒΓ1nε³(‘)ηšρ Π€OR©g '½ˆ!ŸŸ­1κΣ>χ�%ΗΟμ«@Ϊ5/ΙθZdV�ΰ�Ή…,«ΌrvI5ͺΰΤωe½�Љ<‰ƒ#‚ς<χQΜ7»Φ$[�₯9\―Ω[K[$YθJηάۊqŽΉ;δΨLi©oʚsΝθŸΕΟxΝ~ΎχwX %V’ιe5k$μ ΅ΦIU¨Rκ0ΪltŒŒΫ•o±πσG'?›[5Ι>ŸUΘY`φΡkρ³υMYΗ§Ζλ)¨0 υσA$±ΖχH�²Gω‰YφΫw―γžώ„ς¬EΊΊ4¦^€‘ŽσΡϊ/Ζ‹A“4‘,΅Σ‹>9\>Ο―ΰwpH&V©;ΓΟΟ,iϋ¦υαUόΜ�xΫςμ|ΆηmeŸ9wŽ:σ%Φ{…kβw›ηΦΨή©†G «ΊΞ�”ƒτΦ‰_σΧ,g�1ΰk’­xŸa―dŠϋκb‰ŠYςc֊ijξJցγξ™a©ŽνpάΧ?ΐ8βηY&Ρ–‘Τnš3°ΐέέ݁Δ0.n v_Θ�Γ’Š½Ά†χ,b.JΖg!ί$„% *™Ϋͺc$·υ¨ ςΩξρ;Σ€ω(αΟΨ+α—€χYωΜ% UppΦH`y†z.©ΞsΏqΎIΉόš(ηzω*χ\θ^Γ‡Δω°HI! ;HNηφΤ ε„”ΑaΪκB΄Žξ„ψΏ°οq¦0‘!’4�DqΒ\>a ή6λk΄­œ§ΜηKΒϊ�˜‘λ±£ΚΥFžmαΓυΈ―ΥPrPπB9I –AqςK€+qd:?#q₯o† ΝcO€8*gάΚbJ’Ct@ΠeQ!¬.Ν¦υ₯™Τ°WiΆ<υΔΘ4κF…λ.§}΄ϋχαcΐXYr•#°DΕV–ψc¨Π›{‚ϋžέuŠ9―ZΫΊƒ —lnν聨οˆύβ΍k”PNρΜhΚ43»L‡φa sΦ‰f½–lHφ¨€Pε~y€ΛxΟξ‘DΰyH< •Rb‹_W™[™$­Ύ4Άϊυό6NP‘ϊτKc^“OIΙb»~87MΖxΏk΄`�”Έ――L?ρ㟜όΝίό»ΏΦΦϋςψΣχ8ύύtž₯8%ž₯§ύŒάλ~ω_mΌχΦwΏ{νϋίΛα6ύRY¦¬Θ¬….γ:φΦUnWπ„Z,€αDn’ œ―!I-ζf@ smŠ{dL88ϋ{Ί: ²‘›#25ΕιΏ•“n Φ]ƒΈyȁχή~+ΪΊι(oΦΠΊRΞyΚΖ9œ‘ϊ"w\£m�ύGΌ zΜς:IλU‚Ή}ΐΊθ!Y 8’< ΒΙ_FjvJΓ7\|5νŽHZ_ψΰΡύΘΐK>(lGΈ†gΓ.Aju=]"([θ eπo$ΏJΐXPM`@Rαa]�Aτ*.'e¨Eώ₯΄ϊ3M£C Α­&“JU‚ ξ͚šUΡΘλμˆ]'p οκ„° SΛΎF6fq~ΰ‡ŒΩ]€¨…6θ!#§σ·@wqŸ•ΰH€%™πτ°χߟ~ΰ.―$ΡvxΕbaΖg$Πx�‚pθιν-šΌ—­³|?³dΰ,A΄†¬εΎ% ΰ3Ό&γŸyŸ]‚q₯ΑE€�Z@†Ο]ΰ/ؘ';»ΐ8•Τ4ΰΪ]Li‹*�Δ8m;ΙDιΈ~ˆ’ 1•4°λ‚F™ͺ*$ͺŠ1t�ΜJ)`fd˜2ΖΓq-βϊ›{‡P/ ₯•ητΜσi/ α« ¨₯fw@)0ωAΣ±Xή“/½ρ/ΏN€7C\[Ε³΄¦ŸςληY#J`Ν�*³ΦΙ: Cω=ZΊ±f *3LEež΅›εωTs΄žΞτΆθ§©©ΗΤ\kRH}9¦ν75νR1`­w%™«K/\„\kJccχΈ†C‚ΚvήŸΦ“\γδδ4ΟaυG+Ω°η˜ϊh?†d€x€π>λKZ>C>A †ƒΜ*:0,$]—fΫΧ! T-8wΝΏ�˚œ`ι"ΪAΥαڊΜλ܌”Χ­"ΙήδϊFTQGލe�fKqάH¬›Χ lft4Ό>τŒΠG Ϊβ κΝ ΩώυεΕXολ �3Ή’{EΆVδZΝΒΏτκΗΣλ?υ9€lSΊ�y qN τ£L!€$²_A”ρο’dJΆύ½ reΦlά ¨Μ2J D‰ΟΨΧϋgοΫ5jΐ@Ξ5Β—„ƒΧZ zv0ςΌΔζόΤ,ζ`ψO0OKP˜mζΏ\k‘4ɟuό\Ÿ‚2š*(ΏBΑue @ͺ0B,!U«K;t_΄u�ΧΪζgΗc½ξ±~— kZΪq¬oξπ±Αά”8 h½~Χ —BυΖS�‚oA~aVΘ?ϊ,«Ϋϋ¨ljθHR‰βΑ½Σ_9ϊ­Όό�+μ ΄ή=Γ5–¦›Ό—�}ϋ―Θ¦“EKBMO<BΑ5k•ρšš‚f]ΊϊJz‘χ°3Β{¨ΟVw&ΗΑu�©‘mH]WnYž/ξa–΄HI`zoδEΙσ"ΙgoΩ8šΝjΤ«ΜZrˆύuΒjςΰ„qπCJΉ–Υ₯ω4Ν^Ώ’'[™ƒ`ͺγύ™Gr{Σ;ο+1Νν;7Έ-΄ͺsό›™wΎΟ&Yt;*l,�„ρ "{ϋ•{u9cYΒ~z«E-¦‡†ͺ»ͺsύ’g3½ώœ-ι<7£Vœ΅¨jΰ΍[(hwΜe1`ΫsΉ–r Ϋl�cxκϋ[Rΰάχ—σIPRΨ8ύ,Cρ™ % ξΝUΜ!³�Ξ_Ι2ύ$U ͺsΜΧΉλ:Η^*θu°$f³Πgδ^Qς¨――‹5΅Ωσ‘’[rΨ τuJτ-{QS™WΖθ|ΤΌrƒ=GsQ;ΑD›DΦΧΡ>χ“π³Α£cΧoP3―‡ Λ’³QΟH"Ι/ήΫ{σL΅μ%ƒ‚Nςœ»k·Ν§~Ζ*g’Έ�_ώZ{ΖΘxΖ$ΘΐŸ‹ …]%Ÿeω₯%[– yΈ³‰yr_”&ΌϋφwXγc¨AΈ~’³ ƒΠ»οS†FιJΉΉ±Ϋx…ύ¬”σ.Kie kΖ{�k`�Η$ΤΟΆLΛ�γ‘!Z,χSΒ ojš29HυΧ>υ™4xφg%Ÿ€Χͺ’ek“uΝ³υ�ΓΙ=Ϋδ€λΕRLοΥu(ι(iδž �Υ6Ωξ‰’¬Ž—Δ­₯ΖYΎΆ’n ­mu,HΞ^cΧžε ’JvΪςη<O'¨μό™*Θβb”t ΔzΥ΄¦F*ΣήΦυηπ₯―Œσ±§_§#π̍ΐ)qπΜ=ςgγ†Ώπώη?ώ'Ώ{zκρ+dΝ» p”μ[Ÿn†_I›Αœ‡‡]8UΤBXναbύΎ&yJ #β΅‚θζfϊ3(kNΗ‘Aβ@Ρμ£ΰQ`~ζ<�ΧφNΜέξ§} ƒJδ’ύƒgγPϊΰΪ{ΙΊμ9²¦λL[—MΝ`Z\'ΠΩεύ¨ΦRš-Π–"ν4“b�Τ;2ρ¨Jωe}΄Ω ƒ¬VZ%ž;žC”Cΰh`»Šΐ¬ ™­ ύY΅f<<ΈΧ¨^^œkψnΣZr"\ό؍<ΓgΧ64΄x€ςy7[f¦ zOR$όβΐfΤπΞκΘ€d©{4λπέNΰetsDŠz™£#oΠd&qΜϊj|IA’<…ƒ\ΰƌŒ‡aO=œβŒƒΚ³³¬|—q •`ΪL?B@€άΙ;υ₯ƒύ!Φσ, �Qύ61z�«Α’“•Ε'i``˜±l#KUPXd ΌΈ¦‚•-δϊEΜΙ^ύ$―) ΫνS }Βύ›ΝυΪφ™§¦@ΉZζ9ΰ‚? xŽω·ŒˆϋwLlW ƒ{2{*ι©)₯  &%ζ—χnα žy'ίΗ΅cן±¬Λ‰ι>ι= ΌΛXί£ .£œ?ϋϊ0oγ=bΝρzχΧ¬Ώ?|Oχ{ΎΞΏ«.Pβnφ“IΑ:€΅- Q`_α₯Y€ΟξΨω‰š€�‰:kΊ€Έχςφ¬›ΝΘ΄Ίϊw―Σ@_�ΐ/Ώί qλέi*ΘΚ’ˆ’μ8 °Τ“)­EέbΛ“jΩW†!ζΊXC‚TίΨΞ!:»·΅u!M€ΔιΖ»o)ΥΥΧOYXƒ·n½0eΝ@X67΅¦;ΧοΠŽηΜsρ~xώ­σͺz ™{Ÿ™ώ5ͺ&ΚϋΦςoρσμŽά—� +‚@Χ€V}ξfQ—˜ΣΞKΟχ=Q(φ ΤφY―m}μ½edt—�Dc@°½³“A@”V3ξΆ’užnl­Η5²Σ±’΅ζΝ’œ„ηWιe§½@ψηθ.‘―εvύ¨δ}U✿xυ ©Α:4+��B2xŸηqχΑ#Ζ�‘±’Ε&Ĉj7Uk½¬-ΫNc”Κ5¬ T"Βyε<τύΒ—Ή³ΛΎη:g;ŽyPΕF«XώmβΞω ™™ϋί―†,ΙqžΉ¦œΌ‚ϋΈrŽσ³fΛGη&PtrNτAΎp\_λ§Ά₯Hή»Ι,<«fr&Κaͺxο:φ€:ʍl%¨‚� ’‡Οœ/œP�uD'ƒ<Ζzeξ?\ό!Δg‹η¬ε~^SdΌ!$ͺ!ΆΞνIΓƒΐά―Ι€cμ\WΞo―wα3Q‰±χΉΥ³OzvήΨα —θ8a fPw@¦³ΟΡوVŒλ¬acnZr>a>ΰΔ\lλι‡`«Α°y‚ω5“ΛΜΕ{ί8ꀩΨWj! Jπ%ZηΜ4qPOΩ\�š�JΜ#Λμ$γ[Α:1–<±A„‘bηλ9�#Zο’ θ’δΑ5£J#Ο9`ω‹₯hΘJ.Yvͺ:Κ½Δ3ηƒ*οΣ/Οr©Φ°“^¨M?Žηω ΄ΥΎ8ΒίK0·€,ˆ½Ε/χ2§—Δ–{gΜ5φdP- ΙΦΥ–‡·P¦‘Μ±―ΏτΚ+_ύ½?ψ“₯xƒΣ�œŽΐ36§ΔΑ3φΐŸ₯ΫύG�ϋlΜ>ΎqldΖ\gΜ:/­Ϊ3ΕaK&a ΣΊA©r\Φύ2λ]Ε‘mVΪΜRcΛ4bΜτ ]k™•RšΉΤ[―ίBbΝ¨ άς€e 'Τ**Ρ³ΓΓϋwQLEWΎΧΙήml$ ΔμΩΎF Z\��AY7H4˜/ε…CΞkΧ1ήοym*'JΙ`ͺ’q_X@ΒΊ²@fσ<@·³Πϊ4˜­L(Sœ››!˜$ΐ’νυχΚ^'“δΪ»YyΊY© Ω0ί=ΑΑΛ>YlNν ²Uudž0Y$ ρ \)mΥ”ΝΨΝοs.3e»‘6(&3mvΤς†[7ο¦λέ‹¬>±%Ÿ±Γ}›eπŸJq‚UΎ§ςBc_c†Σ’Θ.θτT$•aΝ$Ζ…Υdμt‹ξFΡ†KΊΩ(ΗΔLΏ�kΗUe— Ψ묕!{`K"”qSEΆδ:::Z­.7’)e’ ”!7π<t=x8ΐVωΎ2pƒFλ�ŽfωC’#©¦Τ€0©·Α.fz4ΨΦ¬λόΉTψήζYΤπ―*E&PUJ~σύλiμΖύ΄FMτάΔlΪβ3ΆŸ“ςκ΄N–p…ω…„ΐ’žηsD…‰ΐςΓJ]π³Μ_‰ ΧΆ›ͺQB"ο`σ$š`FυλΑbͺ+ΫJ—††�Ωη.¦[wξΠ»}6νU¦Ύσ !›˜ΫΦΜ°νΠσ³J›»ΊΫ 6‹SO΄•¬4/“‘2pΝ“Ή‚b^κ&o―s[Ÿ*=ξμμΔt ΅ ₯γάΩΣ΄NζY‚άŽŽξΘ4:ŽώΌA‘χ)`·½¦J ΩΜZΉ8n… ™υ«…€ΪΧH"dΘξSΗa{ΧeHΆ-ζωτΤdΛA1&e›ΌήΜ»Χ'θx21 I$I0λΝW– άΘ(C.2™›ό χ�΅g`q�%SΌš–π˜XeŸ*bp}¨"2³Άƒ,Ϊλα‡ωπsΰsb�i¦/|5ΟMC°‘ΑaKT[†αΪP6lΫ΅h9Jty`= θΜ[.#jqΏρ}#ΰp\?/Žη.χί]‹Ύφι—ίΐΊOψY…`ή5ZPpψ» ½'X"`N@έGκΘT�σ—�ݏ�Ǟ£ϋΎ»ΧΙRΖ½Ά‘` pgΦQΚϋrŸH†9c`fΩ5,ΐXZ\Žχΰe1·­;³ή*«!™Θά f¦ΗQ’τFφα½;Μ»Κ4=>–?zHZΨ²ά»ω!ΏS~βϊd?Χh0CΉS#efdm―›ŽΚΣ»ί{;έx�#’<[ηϋ›ΩmF>Hj7C?GEŒ‹sΤ3Η¬ηjΧ eŽ«¦ŽΘβQ·9]\'ξν ldD£Tˆgο8k4jι–J'χ%ύ=½©gψ-ς¦ΈΆ]ΜL[x„”pH"Chil'ΉrΔηOάΏΗ³c�σόT>-/2WyΏjˆΑΈFHUϊXRQ.Λ5…).ΧOŽŸοΡ}€χžΦ—Γ²εάΏJ½B©2rζ³jžίϋ0κα%τ%�ŽύΌΎmυ8ΨIόΙΖ ΈN-Cπ|ΪfμT ”5&¬(;NϋK50‘cΌ-+‹½²F#MלƌΫΚΡΉN¦₯S Ϋ¬m‰f΅—ΫTzζ¨f²Œλ„뱡μ2π΅wo@&έΗ“„�f,αšQαδώjw M5MTAΰ/‰{׈χ!Έ•μΡ°YJ— ~cO’l�Žλ―bLά+,£“ΰŠ}™1΅Ε£ή'ήν6οο{iœαYxz―Έ>h1Ε}²―{€σœyN£1uz4£>™šΔλδΑζλ c�W#ΰŽž~F’ςAώΌΓ=i,άDفνN%Ά–—ΦΓ#gβi"ύΡƒ{A@G©{I-η''y¬ΓUφ΅‡œO¨Œ!Τ%οVηΗι΄0ΕΣγ΄ΐžzΜσ9δ5ΆΔfŚΰcό%IT8ξΡέk(#έ ϋΉκQcˆ.žƒ?WE,’Ι‘dB‡n>Mξi>σ-mξ>gγ=UFΎ—kͺΊ ²ήŸΙTHdR¦ΔU•₯o}ώσΏφk/Ύϊο=Lι O·ΏΣίOGΰ™ŽπΣ―ΣψΡ<�W�ΥOώθ�Ι7οήω¨ μ�6‡ΏςEΓΝƒΥ By½ς½jδΘP5X’ΦΐjΦηΉ^Kϋ€ήήφ`’sC[ Ω5‘‘€·‰μj3ΩP]δ 搆Μ8UίΎuƒμΔ85�b€C[O�νζ4AΝδ$C8‰s�””ΰ@Ψΰ�iFΤΐ�`¨ŠΜƒ€΅{:@dYg:08HvΏ³£3όζΠ5ΰL‘Ρ+εύ$tDWΪDΰ`IΒςβ"™€9@,rA‚γΐ›ΖUdP R•νΗο0i3dYD%Τ™5SuωfKΑ‚`ZπcK2ά­Σ=Žμ?όξ½G!W4σ!T±;…΅ηυ΄Ώ3Π )[Av”+π™A"¨P | °ψ+�NΦIa3Ω‘j>³‡’’³φΩξ£ X FˆH βW ’wρ*8˜iXεχΪu΅π1Wώτoπ>¬΅=„L9¨—Δ…œu¨'‚Λ),³Πρ˜`£³·ωUNk,3θΤΨ>Ÿζm彐Τ@/δ©H—˜_»SΏ%dαKQJ­q-”,`ΜD‹:εχΩF:@œ=Λ|©'€³Ξ#EΑ? α;ίϊFz2>“Κ­'›O°x `ΛσyΫcεΘΓΝh.£0΄(ƀΌ«j¨‚S ŠΘh[^�D{5kΞνΞ‘ G2§£…Ύς€Tkηο>LΗλΣ©―©†n ?†!βRϊΖ7ίH•”΅4v 0.·|Ά H7τ"ζΐ&γΉ‡?C†`ωΪ̍cp¨)UOWWΘ{א­ °ΝD:iΓ$ ²I°`6ΥΪaΛA ‚Ώž•%HΕ5₯λιξ+τ'ϋ&If;D“Χ ©e;ΚΘΦ >yBΪXσχgk}`]šκXfίΝ”€| Υ„J’ $ίkΛψ•y³}γj3²”N‚\΄π_π_M6«³―/u175U›ž^H«λgφώΟυ“MδωΊ/θΜ`[Ϊ‘α„{ΪάΩJ?ύο.ύδO|6υχ₯O|ϊ“iδόM)$Δrάƒ¦o’˜f½έSΐ$š’2`Ÿ±œΚq ±š Reηγηšdωy₯μT|.£"Ρ`'…ΨKΜ‚ͺζ*BIδό-w–c@"²^UHμϋΉξ[ΥHƒ+>€ΧlUIΊrυJϊθ½kΡβ/C6{#ΆΝ5ΐ{t–¬~ie‘ν?ΞgKjΠ. βΘ’‡Μ�`‚{ΘB Έ' xi*,σ°SC„©`ΐŸγΡΕ8ΆΆ·EYΛ:Δ•?ΫΥΥΝΏ†1κδψxΗω²aΙ‚ ±–ηΠΐJήx�T@ό.#ΙΧπR%†{™σEΒΨ²Gθέ‚*p• σΛ΅¬Ώj§%΅ϋ*†h₯Κu;n 7ο€eQ[AM%!]Κ|ΤσΗύΙ9&IX†Ώ’~ ή§ϋ—~1ŸΈ_q”j0OΘ/€3(�†{»ƒΩ±τ±–œYΕΏ&ΞFΞ$ 5€ε£π@νΓη<Hγ! ψ>kΊŠ³M:Τ^3((gη&ΩίBwΒ¬γ2Ž{tωΡ€‡Bη(Κ<ߜ›ž7�“1ƒ{Β:η€~Υu-¬J6Q΅­,-Y’GEίΰpͺbΜͺͺP §7!ήζf(±Α8ژʲ$ 3)Ύ·c!ρι>€q¬δ₯{–Ο�η&™FΏœMΞQΗί8Οr”&Ξ¨=Ξ‘'³OœFΡBΣ›Rέ£�*k9‚qq‰₯(ϋμ―–©τk ΩΠ�TKη¬Άoύ΅ΏφΣ�Ω7^�™ϋo|Α]ρτλtžΝ`Ϋ9ύ:νψGΏϋϋ[Ώχ»_όώΪ�μ,™ƒ=Ψζ3Β$‚Pp ΖaΔ‘S†IŽmαίεμλΆ]Rΰ‘ήΧί 0η&σlΝψ6˜™Ϋ:΅"ιΦmϋΡC| žΰ΍zΑl§Rr3=ΆH»d³Λ šΜ°nR_«ϋv΄Ϋd|Ž¨ί·ε›χžΑ&@p‡λ.Cnj]d mp¨%mΙ”™ά%‹Ϊ°ξ@,Ω$Έ[ΨΟ�fj›€žΑŒ¬εΚό,―'ϋΞ΅›ΑΫΛ#oη^…fe΄«δϋ˜ψΥ– xTy”‘ξ(§t"ΧΥ ΥΘxΫya'΅Q[Δ\$²#KΤ›ϊ!IJ¬ημξΑ‘-]{�Zšž_ 0΅…,ZΠ]’$φl&A¨S3=ΦσPqΗ§Χ<Ÿέiα<[|nb(gpέ‰°c{i υΕJjgώ|κS―smUΜ}˜Φθͺκš™»¨0₯:bG‡ ΐζ<ΩτΚšͺ‘ΰφρ¬*�«ϋx!cΕCÚsbEδ‚ΡŸtΟ@Ή±Aί.θΜ¨�@IDATŒ%:ΛK‹Πή½uΰΉ Ά”f0₯Μ2oΛx� emK ¬Ιννοcά1#c4)θΨΕB-e²&fΞuL~Ή§:†–(TfνH±z‹5ΞσΎuν6ΆEAT]¬υU;ξaΐΩέ-7τXς΄˜+^fwΝΰzΤ`qώŸIΦΠΦtθ Dv£’ϋί{Γ�ύυ΅…™ͺil©_Le¬Ž4vχϋ.Δϋ΄ϋ91ΏΟ]ΌvΌ-ρ±Ά~}άoZwνΎͺ)ž΅ΔΑSπϋƒαˆZoΏ―•π¨οJ·L<ασ’΅€ž>:ΧRZ\Ÿ€I₯ΔΧ ›f~σ‚λσyz. ŽΚ e \)•ΑS0I+{@6Δ „›ν›QΗΩ.―£—²­¦T.μ΄ώ΅TηΙΤΰg"ξX†³JC<ηœΓ2ώχο:Ν°$Ϋ5!ζFΒtwˆrͺ³g†ΨsQK±FŠ({Ψζά³―ηƒ%;zšwυυρώ€j~ ΨcwQ,L/Μp&ζ¨~ͺΘςΌΗ@³Ž1;fl,§a*™t @iF[”\(I°μˆ3$Ξ ˆ[Ξ`I—jyη°d”sTWώhΚ>ΕΚƒΘέM]πέݝ§z―Xb·ΙΚo“nŠ� ‚u–‹KKŒ—l‡χ·ΗCΣWD�­Uε‰εW ηD‘δЍNŒ$[(‰IΨξ ₯\—* M8w ¬l3ιυͺΈ3NΨΰLX‚xqu²Wkΰ©Ό_΅Ε:ΎFΎΦn:’†y’v8‘HΥOΐr‡X§œ-ͺc$Ά˜{r_+α±<7M»ΩτΒΥ—ΓΨΈRΆ’vΈͺ‹T₯Ω–Ά™ύoƒη»ˆ±¨ΧΪήٝΊ†!)ΧΣ‡Χή‚˜˜L޳Ζπhl'ViΈo…l ά9T /coΧί©΄MσHJ•ŒqŒQTδiΨμxJ"θ“ΰηΈΖ%άGU[˜ΐQ-ηs”ψq_χί’₯(σ琽ScEΝAΧΦhJ,!‰ΗζgDM1ͺΝ~•’ˆΡ'Kό”#v©F½ΨΦάό~ο`ίσ‹�αίΊώΊ�ΏΣ―Σx†G p’?ΓpzλΟΖό―ΏχΗ[�ζΫοΏσιW�ώΥ½;χ2•e'έε%ΗΥYƒ!―JH'³lœέ$―Νvr˜Β�λlΐԏDΊ‘‘– 0Λa₯;ΏΑ’¦LυH₯kψ»FHΰ% Κ`ά§''Θζ9ŒkΚΛ‹kΤ™*E^ ι±ξίσ‹Τσ‰ςdίw <—JιΧ.±`μ²`Ž> $0DP‘ΝγΊΛΙͺX#Ύˆ²Ύ~‰ΐϊΞƒΫ!C· γμΠ0‡feϊωγ¬j boίΎγ ²ε’twώEjGοή‹»ΰdηƒBΑ£.φΆq|Jr ^ƒ^E¨$Β¨)2ά $”so ΆdΑ �₯7ΗΆ Ȟ{»ε9ξ r―ΰaι…kΖ ¨™ν5Θ"ˌtlΨΰύUο4p:‡η+ €“Α±‰@ύ€#AΗw˜G…I­,ΐNsDKL)ځ@ …σv υΞ`WΕ…€€ά�μ$σYƒšqYήΒ³ @Ά[A#ύΝ/^ΎŠ"d=aΓΉZ†Ν™ΞJ10&–œπw£*œVT!ύη.9Γ1 .¨©Ό+‰8Ι’(±έ¨κ λΎ55΄s‰k« `(xΈή\λρYμiώ»co™ ί―Ζ;?Ϊ Τ[Ό�GλWbZͺqnδ ¬&ΜT•γXͺΘqND›GΞ,χη†ζΖtε₯ΩEΚP’eNΠ©cκ1ϋ ρ½Β.A*Θ2μu9jΫ[{Υ΅ |†χRΗλ*ιφΒΌήfCpΒ9θ™S/DtΩ`οςσT«Xή"αaΡPΒπΊ(υaάύ< ³±GwXJz΄E‰Œ?£Ρ-ˆ=a/Ν |«"Λ¬Ω¨cνΊ«&ΠΪΕ¦Ρ ν'«'A‘Ωσζ‡�|³ρŒ2sχ/�. ”86‘¬δΔώΑu;fOKwψφΚ˜‡’>–8χ]'sϊ`x~6†r ƒWώMu{Τ^ M Ν¬ΥφTίg-!γ�€ͺΐσQRΡ{Σo‰x›ƒΒ�ΐMζGKΖΖ΄³œššεσ!Α]·¬Ο*@rU¬ H �Ϋn$Ρ”χvMΧ²υ•|σΩƝS&TdžPς‘gnΪΡ@’^uδκ<η ~š�gθ•a'©5ΞƒUg\4SOΎώ P’ά₯‘πžπΌ%ό| ½y'#ŸCe�œ&gfΈž ύQ¦²ΐΩl9‰ζΠ–†4ς,T^Vq&HτpΙ‘ tsŸ²$&ώLό¦ŒΟXEšί3‰PEِτ)Α0ž@ΘcΜϋΉ�J°0ΤόΚζ‹ώ@ξ0-”ŽΥΥ»ώφ§�\~ξ7ώφό_‹½ΔΗsϊu:Οτx"~Žΐ31”.œόƒψ;ω7ίyοΫ';o­�Μ]<ήέιT'3oF‚£ΗhΜ„ψ­ΙίΛ#λd9ψ;Βε­JΨ Ύ<¬ΜnΘ>Ψύ ΰ;πY MŒq�Β§΅‹ƒ“€γ63.φ—αΟSsΎN»¦z@C=2M=tδΞ"ύ�œμ8xθ²ΔfΠ d Ά5CgΞ€ΎΑtξάy@{G˜φ]Ί€‘Α—AΕΜδ$œυΞͺBKΣχήϊfΈ2ΧΰŒ\Βΰ―ώβΟΙ”�Iƒ£rAY7ŸΐVS<Βj2ΰd7”�Φd θ•:jό΄G@}ˆ\Ω GGGkŠ=2πΤ±ζp2Ÿ\υ Pƒ=ςν*Κφ!Φ › Ό%Qˆ-"˜4@φήͺ Ό?ƒτRΖC`PL`Ȑx0ΑQ>Qh¦Ί‘’SΉuνf›¨[ ^‹ΛΈ!ΩGΌΗxL€MLζ…J,c]π‹ωŒ—_~…vƒ;ιΑϋο€C²9YΚ8ͺk³Τy6 Sξg\lυ1ˆe―Z…†š\\1»4ƒ2‹'a$9³ ‘ qQN€¦Μ^P‘’ΓzaeΆmI}=ΜΘ–ΆΞ.ΫUˆT0άKΗΩ3© Π,Έ€έ€/!#ΉM†ΑL‰’CˆΩΝ›·�\'pD}@¦ΗqS*ί’gγiΉ΄€"‚ψ2ζuŽ€U(ψ#-8‘œ† ΪQZΖΔσ„`? ΰQΩ°Ξs¬ηy‘]κο#kԜξήΏ›ξ= sΔΑfŽΉfψe”eWΒΨ™)“d@₯ΡΣΩN¦ 5ΰνώ͏�όΜsί†¨&`ζΩο“Ι*ηΉ(/Ξπ»ε!>MI·)γ`j¦«WH¬±[·oGΐΌŽyγ½ x%τ¬―΅W}=sΐv† v$`€’ΕgΎJHDFG‚GΧ™σΟ₯ϋ‚Xƒ]3Ξ’5¨Z ¨nΖΕs¨ZΣG‚PλσσdΉ?K $ͺ)ƒΩDEdiŒ>!¦ Χ±Βύδ Kl ­d4oΰα€WΟΞ/₯μ±ήƒ|ŸΏο‘Σ{WW'ώχ�$&f3˜«Zχ«ςβ›ί~ƒΰ}'ΦρΟ|ξ§©1~^b^"οf. Š$Yός~Ÿ’βήΏλΑ?ϋ=ωεχW³Ά¬FΦμnΊ|ωbϊ±Χ_MW―^Jύ]ι ΩζφΆζtύϊ‡ρ3ώ'€.ο ΚςW?ω σχΆš7ΓΧC `”΅aYMEΗvφŸuΙͺH”‘suΆ“ψβy;ίκ>K?ΛλsΟ*ΤI ΒΜdͺxPΑγ:)C‰PΓΌονWύ’γš)SςσΈg½5vΘP²'οBΞ"�ή&φhKg$JlyΊΗΪήΔY_’P―Uۜ*A$ $ΉvΗόΊwCUΘYχ{eύ’Λ*)9- ;Au"ψΏ0ŒBΔ2• θΏ ώς―�κ―ώ—_η=ŸN8^}ϊu:Οξ?ž~Žΐ35‡CώtϊsŸΞΏΑψˆƒvΥΑΜt�±.Wf–χxŸZPzˆ―β&œΝΠ…Αƒ›ΓV£C³\{ϋk)GPoζΗβI‚΄'–)@˜α6βPe05ρ„ΐ~šΐΙφtΈΔ#ε5“TTJFΰ`V³½«’]˜v3“!qδP5yZΧoψ៣’CNΆ f†lΉΞΕ«d`Ν8 twΦΈQ©ψΜΞΘ€†ΐzs3’`δe‚ λϋ•θί¨μAbTžλ›Ιb4ΉvƒCYd2χ΅Υ‹f`+†σ˜φ•!ε+GŸk¨N-ΝΘN; .Z Ofjdlρ[;¨¬±›:nAŠΧ± €Ύvν$»dτωl•ӌ[9γ[ΒkBI -Ι‘% 22xˆžΛΐf»ρ.¨˜e:w&9G£•„cβϐθ˜ιŸ|τ³χ’ήΣ€S™n[g€­™@{6dΒe΄bͺδj8ϋψ ‘*5΄5¦Z‚ο"” yb[²iΆ·qb–Λφdv·¨ σ>Ώ°Θά cΑp~`ˆΐr¬ŠςW½Μx僧“Σ»πί†W[kJ‡½,m§6z�QΪζ1δx�Κ.κY+™‡kΣ“ιώ‡οbήΈž:ΪΊx+U@ΔμτtΊyγf˜?e1Ϊ$gd…`Λ¬šΩ~I �ΐp—ΜP dHmƒuΆJΕΧ œω\ΡWfω)8ΟLώ"Χ_ž^ύμgR+Οσ„mrv"έΏ{—Lj™bδάΘυ‰Ί˜#ΖΧrAIA΄¦ˆy�Ή φΪkŸδχκ4}�AΚQ2ΡΈ―gξ–0·«˝•ωԌRQiΚ2㝘ί°Ά��λ$έ»s‹ ΟΛς ²½~Yz’™˜Šƒ<σbΖΰΈQ�„ωkfPπα"ʌοΠώΞΥς}Iλx?ώ¬L\₯†u�5?ΘV)k—ό0£ήΰ‹Ÿητ8°%¦% yΙGΦ[MJ$½]…,Ύ~1Κ₯Χ’M]ݘEΡ’r<­0FŽmΕΓ^·k'D>ΓΉfϊGΗ�½{χΣ(5Λ·nά…DΉ›nήΊ…’c&}xλ&YlεΛNΨφημΌβΧΧgνρ} ΆύεŸύ%iπτϋ��ξuπ#ΌN’θ(]Ή|>}β―rνΝ¨™4 Τ_€5Α d… b6ΖΗ1ͺe±Μη₯‹$ΐλŸύTΊ Ή0ύh’ΚΆkυPt±Ά—Ω:TK*ΣΉg9‡χ2–]yέqνΜiKMσyοO― A†@i ir ΰΣu'h«Όœ1Η؟κk�εηŸg_„εί7(ΛypηCή“Pΰͺ‰ΌO}j*ωχbΎ){�ώ­lΧ³'κoΣ€OΝά`₯M9σc{“n mcϊzΘBcΔΈ ΠeN©μX'σ_Ϋ�…‚ ]HΟ]Hπ<`±2d{_”\.ό sΐ—ΎeΎ0ΞNKzTθyγΉ LB₯ΠΘμχcϋ\(ΏZψŒΩιρPX΅΄ΘYq\LΝ$λRŸΫΐήν<·Ž_RΟΏ φΗY7ωx/‚Z ΛΎ|ώ¨�”™»¦ψ|!•§±Vc­ψ*�ӎΞΏheΙΉ­‡‚e Ϋ(/8Ηάf¦έ<;•υoBšΨΕgrv*}σϋίBΡ·z:ΊιΚSΟΈhτΊ&Η“γΣ”c@�@˜κuSRͺbΠ’3μ’‘” @^¨a�ΕuρO±–$EU’ψ:Η-ƒ�‘–s§ΘςΖ”-‹±…Θδόl Τοη›ε?νσ]m¨5žιΡ ™άΫΩ y‘sέ_0Ϊ!₯Œ³2§ς’T’Γ3=@_C9@›'ͺΚΒξ[‰ŒO�‚α •—ήAOf§ƒ€ΤψΩφΞ>λˆΙχ©©qb¦40|>Όπk/'ΔBlσΣΔθ8 ΄yζ ’ΒηXkvτπά…π|aΰ­ςΑη  σκ… —―€Χ>Ιϋρ<Q”m3ή…ύ΅H,€gžγ«zΟN 9ΦB΄�e<I(I 5=/\ϋ~†Ÿe$Œk%σ’„5]Δ8ζՌwuuΙqssύŸύτ�Ζ/ύ�η%  Ογτλtžυ(DEΟϊ(œή�37oΌρ…“φώιςη�Ξχ�ύ§�ΥΟόYcEιWΙ<}·ΉΉ‘3½·zϊ:ώ€±�ϊω­ƒυ³ε0­­§΄#βPΤhH&(n£wlμ>™‹,Ωύξ4Cΐ�iΠΩs—"ρπή*δ•0ΆI4ka»1λWσ[Ρ2o’ *ΟϋžD`C@Εk (dΫ tBςΚο‚ΰΘδD-zWG8ε�ΦMΜ±rΗ©ι‰ΘfΏω½Ώ’{ΑϋΚ( ΖDfE`³Cτ!ί·ζΫ{P’«΄Z'g ³[fΗΜβλ• 4ߌ“@ΎΫQ…ιΟ5V§.€λ-ν΄vB±΅‰`‡7‡ρΠΰpͺEE‘ά܌Β†Ι±Ηιφ΅dυ”'Π>=άΝήψ%I!;$“lŠ ˜* eυW�ΎrΘ5λ‘”6œšA’4aΣμΜ“h‘₯Dciο€ς4qλvZž˜J­ 6«"!H2R~‚ΓbΪeρΜ£Υβ! Πρ―δΉΧ’œ0Σvβ:QB@JψoΝ<�!δΩφœ7Mzω0FΰONΟξC€„₯šF*―Α Jc7£*UΦRφαp]‹²a1­†D ΠΩ]Em€Lβ‘Ύ½;(> ̐Υ2£½OφuBΧ‚”rgjz.}�·!u0tjιΘOwξ|@C_ŸΚχγ‡Θ€/qοt'ΐt±³9½τρWRί`?ΑŠ˜υ₯xΥdΓΈ±ό°ήJ`ΝλΙr•Π’B’­Ή•ΗΆyydΪfœͺΘ’λχ ΰ6sΖ›Ψ„ΛN―Ύϊ ρΞ4υΠ.³dCΙΤE”¨–,ζ eφΘ�—ρΜ*PœώΝΣηev <7c>:6ΚΊ¬KύύÐ ­¬+^H)�dŸ=Α5°³ώZ²@—vƒN"Λπ/RΚkΠ^oc±ό2Ν@[?nVΨ¬Xžk1ϋ¬2Βa3+ P5‚s­nΈ žOΈε€ŠέΘ­ί‡Π*ΟϊΌΰbΦS” ·LžΏϊ"s¨8έ@EaŸvΑ�Ρύ Ϊω h‡IEΙ”—Sσ Σ―Δξ�Υrφ•“γ¬/Χrά#Ώ«6ˆ1bΐόέkyͺ,πχ³κά·¦lΒ@Μ>Δόχs‹ρThI?ω“―§_ΊJ&0Αάτ}κλšΟέτΝo~‡2ͺΦ�c· €]ˆΒώώτ�K—Σ_�zZ{²Ζ> 0²Γ—H3€ε’ ¦˜eφ©PπΨτ—ρΛηδΈΩYΑλ1κkΌFeΘfΘΝ,—Μ°WΣύD5ƒ­D­Ρn| ‘ω\‚ΜκΖτΆŸ=I6kjϊn6Ɛ~χŒ… g'ΏYΪΓ-₯ιŽ#Wΐυ™ΣήΎΎ˜s7―³Ÿ3 k$Λ)Mp―πfΛ ‘χ©ƒηηυVιξμF5D˜³ΑΟf0/ΩγψLΙO3Π'z¬ςζgΉΧ–²j ³εmfv„πϋ‹ψ§`mσΉγ½fΙl3ΗΆQWeYλlAA *%²Ucβ}}>07¦*3 ΘΨ“T–•AΠr)9ΘόŸχ�ΑωΔοΎ‡$’ŠŸ‰J3ΉM­‡‡yρΩΘΨ»_ς“d’k  �9U―”B’—ρΉσ oAΨ·P‚SΚ΅²i8«ΏOwW'ώ0{”፲‘-œsΏεΜ;Ÿ½€Lp�ΗΦ›vL‘θσ:]Ώf˜sœΚώ}ž–Όd«,ω@a0P1Wά§lYΗ™3>ύ°[Δ^ΪΒ™OΧ Φp;€Ϋ&„Γ{\‹³£ Bpfj@ʘ;F(±^ωlΝύσ.e6 –G˜tπϋΌ5�ζnH‚η*¨WQ"a‘―’Oύ„ε™Ώ–Œœΰ�hλ₯iϊx,]Ώ{'Φ²ο=‡akksκοι)\δšΨ€Μ eϋ0_Ζ^S-kΒδ‚„†δ“g³™ϋ}T–�©Z`ςς^tηam‚\³όΒΑΧwvτ°£Žkla?ΐK’@[’c‹`Λ3œ ΖͺN)₯ΡKΐgUΧΤ*FγΟΦZ $64δΝ°†Sσ¨τ4VάaΟ°|ΑυFΝ ρΜC―‘wdμQK±‡ϋeΩh=žU*η\ΓήΉδzΔ χ�ΆΩ–7ϊμ:ΪZ ¬ρŒθlώgΏό+γΧΏϋγ?wκi£yϊŸΣψ·#pJόΫ±8ύΣ38_ωΚNP όώyγ+_ϋΧώ―�ϋ_όε {ώ/^ωΔΟgωsΏπφ�ψΧ?υ퇣wφζ/ε·ς™΅ΝEnj’ΧΆiΓDΦ΄Ά…Γθ8½‹LUΉέ˜ρ―ίN"ιύΰ@— ‚ …^ y>Υ‹M+9kww©#-’”‘‚~Θ•Υ€i"ΕαFPi@ΙΉHcŸg²zςž—Ζε›m”'μ“y[ε½Ι¨NŽ>Lχoέ€E―A^ή2ζ­ukύ‘š#-άΟΰ�ό‡lΊ'π)Ή·φ786˜ΪEFxH CΌΓ/€ γάωˆŠΎt©³J€₯³•  Α">‰`a2ΕΜζ;o~+έ~�ϋi}~1­ρˌ{£ Οb °ια:.ΪΕΌwο•kKsarΨ ±ƒ4ήL&Vΐ ₯₯^Ξ½ύ­Nν0‘΄|l‹ί€\eŸ‹%ψS.n— ƒ@fF¬1�$ΣUJΦΆˆ Ώͺ ‡ωRž5 °³μQΟpz<3&‘Pϊ <›ΟΛZΚ@πVŸ†Ο©k`(•ςlΆxή*Y2HJ›ΪzΣΘΰsΘ=gΣΫΧΏΗ΅Ζω9λP]σS[”Mh*VK;ΌΆξ―Ζτά₯ηΨά½σ>Ÿ‰AοΥL›Ξj„‘+Σ™σg�6ξσ‹c”ΐζηɌg T.G'΄R4ηϊΒ΄ „aM4N`Ωƒ[‘„[=Š= V‘ω>ΉŸ²jpΉG―ŒA΄Δ sώˆ ~•η (*aMΨχϋnU&Κ�§©νό¬ςœΣ©©ιPό ΎΜ|n’Ω KVΑŸ5½3sΝ΄Lςζ³sΜΪ]Ι�,‘ πΙSJ$Π."Hζ‘1g₯‰DGŠΎYͺφ‡ΧΣ OyΕ*΅»€φcW£B˜y<Ζ\ΰ½ψwKq΅WQ£!¦YlΧά{C=f|9ΐΚ…KSWOc€zβ«”υsL6YB+R§rΐ©J„Už£Ωw.˜ΉhηT.(ˆ$ DwΦ’›1gΆ†όX+q ΈWυΰύJDϊ}ϊ}ΗΝ`[�ΐLmΘΐ™σŽ/οUUΉ‘`Ÿκοδ½Ψ‹(ιYYΪβylATήLίύώ›\w‘Ό+ )©<½Œ5¦ΩθΗ(βΦ�_~νΟΐ(μμA‚0ΌΥt»œM¨Έχθ;γ<Π�ΐ’«b₯2φ ¬uΠ–p<έy#”μ»<'φ χέJωݍ“·#άΎnHΜyΌ":SkgGZFr}�£Ϊϊœ@ $n4-cXΫe@r,‹qΪ‹-ηy•°g¦fg�μ$ž-˜ΌmΣν"•Ή±·V&Θ4T=μ0B©ς’ Ώ•†h” ²ηa¨)h=ΐΡφžΘζ“₯bδŽS0v `IœnrfŠν`™›¦™Ž›κ²<{N%dή1€«π]ΔX6’ψjκΰUHίωLU›xΌT`ŠXΝu¬Q’ *G9ϋ“Ι‡iΕQ5ϋš†ΊUdsχωUCG¨Ρ$tτ°Ξ]Pκυš5χσ%°0dΎbˆάŸ}"%$νžEΜΧƒ ,‰ ž0γYI)Γƒρ‡)ΟώΣ1Ȝb;°­±ϋy {§dO½ΧŒ*d΅ΆΟϊΨ›=Φ<3ΓΉd[� Φ°`ά�ƒJ挝.<35ΣeΆDωΘΔ«ž{έζ—ΩφέP5HD‘ώ²Ο‹W―2·ρ΄a[ͺ ΑδΟ+‡οολΓh8�λΙτδ» CƁ±“¬Τ„V²%ˆ,ΖΞσΨl™L = Λ1Jͺͺχ\?’υNJφt‘�Rϊeφ! f}v™#m­”ΫΉ%1§Zπ.aOκ’Δ¦b₯˜ΚχjΔηFv‹ β•b9ΦϋΧXmέ?λD2΄ˆ±(ζWŽ5jμ‘9’ϋC”uIl0n9ΞΥ%=½}όε((ΑZΫΊxΖ™PΆΨέe›9m$”kFΖvΞεl}Y˜ΏΦςͺ�–YsΣsStϋΩŜΉ?]xξ „9κ"ξsΕ‹1Ες±Τ�ήwβΥ9–^HτP"Θ|’(πΛ’�μζΊ·έ¦ ž3ξλŽρ&Ο¦œοε8Η<‡±e’¬’²�‘·€$†�ΛφšΚ’Gυ 5_ϊμO}ζ·?ϋٟƒςΦψΣ�œŽΐιόp Τά�zϊ‡ΣxΆG ¨¨tΠΏ”§Ν,,œό½ϊ;�ΙΨυ·ίύυΡΫχ.΄un–gιq]RԘn}t0I‡Ωε K+γΘ ‘�―“Ή 'ΠΤ±|‹ΊL3CD|όŽω»νϊL9δHΜ Ϊ"OΐςΓ'{(@7sβ‘h] 3Žώn‚Ο #η‚iŸŸά Ό?ž‘0ο"€>Ά“ZΠΛιδή-�Υ:Uέι_„f"ΛΗϋ;Άq{χ­7‘M ήΙ~‘%—ω/C²]lpG»*κZ;ΫΣΘΘzLO§Fπό^>w>€«σd°”£ΘTΙ—˜RˆΊb3ΞΚΫ †Μ2D›ΥšGVYE 9xv$ξWR`wŒžΫdϊ3d"4p¬ ³~΄ƒ”—{ΩXiL#Ξ“AŠΞϋOOŒ‘Ή#脦’,ͺ“.©7A΄Ξΰ3Σטe­YeΉ‚ΰΪ²‘]” Φ…wπ^�Μ«˜—N§™yηD)³i|br'ΝcžHP.81³m;Xv³x*ς%~I’˜₯ΦΘΞ8[2@rΐ½C %‰ )ΰλž’±WYRSσC A֟αγψ φ'~ώϊϋ7χ�9ΑˆςΕp~qi1κδsc³ΓφL―Κ0—ωl»mdNέm«· 3y.±ήGt/ΰ3,8/ω @0Ϋ2h)φ=ΰ-”!<œMΗ<#“ ξΥ�?U’£«‡tδ ΅’{œ_«Λ”hp6ΰ\„b‰Χr>.,rΏάγγ‰IΘ Ύ lƈ6X/’Eΰ*tΜ©ŽΎN”inβVZ™Ÿδ¬eŒ!Ê;$œά/D₯qϋΓ>D jŽm’ ¬_ύbVHZ΄A΅Άt§Γo½—η§Ω?QΠ0n¦vΖ°tA"Σg¦JΓ€Ψ�„:”2>σ9’ξν>Οgχ:Ώ²¬ΏCΖ―UC� β7WΉ>4ΨϋΫ΍|ω—ωΧΗ™+Άs:ύ:Σψ�χαΣ―Σ8�Ÿψ­ίϊΒώ_~ϋέ›Ώψ‹?�§cwn,ΞL<ώ±ŠΚ²RΟΝξm“΅ΟΔπ-X!.£­PMŽΰ ™Ί5œRΦ{dΤΝR[«»΅‘RΕC΅ˆ΄y¦iJk 4=ˆ ΐ=ό”ψz(ϊσJŠCRȟC Rΐ 5άλΡ&Κ,–†O‡|Ά2ιςI3ψ‚MόΘΩ Ίς[i@ΎB­!\†Ό�Ύ™ϋΘ‘ Ζ@Ž Q2cy³€ΒμV=Aν₯η/Σ†pVd8ϊ{�ύΡ»d6Θτ pΠwθQO ˆUNΫήήΞ(―…Xαΐ^^@Α@ ’»τ<¦]ΫH7ΝPjώX,Ήgο,ΧAώŒμ=΅ΏΤ9Άw·€!ψ6";Ιq Ζk:埐m°ζΏœ`a‘{Ήwο6υ�¨«ΌOi-2©½Όσrψ‘ρι 466ΗύΐΑHΨε`+?ή!@�ŠŒM=„ƒ`Σ±:{1΅#ύ΄6rΒDΠQΛΏK΄4%>Βkbf6Ϊop/vQΘ@ΞNN3? -Žg γͺ‹φ™-λΞ7Qn­€†ΞτΚ<5h+AΖώζo₯…uŒ'O& ztF7λSlΗu­Qc]‹ΰ>ΩFΦkP‚-œφχu…/˜²ιޟυθ:Ω†Έ‘„ιθM­€£ €ΜΝd:oίΈ·„ΚϋˆΖ¬: Ϋ‰Aπ¬όwŸυΆJTQAR*υΧtNΕ€;λΧ�η§e ͺ)ό|ZήΰΏ{=OlΗΕΏ?ύεΏ Δ˜Oϊ+„ ϋΓά“E³'όš£s‹j+χ.ϋ  Ηl}€(ΖC£ΑΛxeXϋώΟΏτGHλW ΐŸq0sΝFcο•ρΌTŸhr¦ςhkUζ cζ…δδ� ΐε<σzΓό °$Y₯ˆG{a―<Ή—Ϊ^―„ωΤΫΧǞφ|”RLc.ωζΧ� šΓ€P#ΩΆmεΙ ™v„\²�j@Y-{₯ �*’fΦZΩύ­M;Ζ¬³ΧQ·Ν^QĜ°†Ξ+ˆ=ͺΨ7Μ†3�O]λ«•Ϋšx�.R*ΤΛΏ—₯9@™rω–¦¦π€@άΠΊ/Yχ>¦νC5ΣuξbJH4{Ž˜΅ήcŸE‘=Ο ΌΨέB1ΡΡΣΗ{@б~“υ€βk~­’(ς=T0ΥπkŽφ¦+”nΑxζΤ@,¬H:pφ(;K²9―vΘ:»f-'2+­ ?Ρ₯ymί0ϋ4{k[W;gΔ6myωs7ΰ‘’ΥyΞH£S“©"`UU^žΫΆ%vΤJRΖήΒώXOG¦*ΘάHμMŸccsήΧΈο†ΒΟ}Θ�χ ^_YZΑ΅45€PψΥaž[Κ™�IΠΜܐ΅M€σ\mcZηψΘcΘ½uŸ’4‰Mφ%Ι¬CήΫ=JRSe„mmΉν8οUGx†P^§™`¨& χσΫ…¬~η^gwW(TΓΔΨ±wΨΗ3g‹9/πί€Ό”όΣXτξ­kq+¨D4ϋμ€;UχΤ90™Τ¦QωlsŽωŒΦ9CνέΜ‘š(½[ •±*£5Ί€x}{(τ$yƒœΫP@μƒxΘ»xOŽAΔMŒ=~f5Μ>σΖuQΛ\ΝρŒ- ln sΡΑήΚsηΟ�·�ούφ?Ύ|ωε9¨e§_§#p:��8%ώ]#sϊύΣψ‡Ιρώώom½ωαύΫ“£–oνlŒ,ΝOgwT[kŒαA-1A²C]Ώ δ „­­&²εPΖ ›ˆdŸ€Χ€]εc²w‚=Ώ4;4ΰ)<��;΅m *lΓ5œΌO%fXT;θn¬ΉΣ�Γή›I–ηy'kΛͺ¬}ίχ₯—κevΜˆ…"ƒ’LΛ :h› FPλ‡lΩ²²lch…HΪ iŠ)J€‚ .¦Hс0ΐ`€™ιι™ξιι­Ί»Ίφ}ί²*³ͺ²²ό<§0!ϊ‡,‘DdΦDOwUeζ½χάsΞύήχ{Ώχλοι€αLŽ#7ΏβMΖ•ΰ€”ΰuhπ\¬;œΗ(qyžΊk@†NϋπΥΪ hγ σsafj*fδP–˜ά­`Ζ€"@§λω2 d‡FΞΗ έΐQ`&’Μ�φ”Jž .Φ֐&ΞΞαμέFf£*ά½{Ÿs$#³ΖU§εbƒ($’ƒ£}α‰g.†#άΗΘτ δωLέm-4*>Ϋρ}p�>~355€‘$H+0ž–κ"R(:vΦΦ1%\ŒΑ��^cufω>ψ‘>’8ͺb ΦάΎ&> #·Ξω�Ϋ‚7B€πdΑKΟΣ¬ „"‚·zTγSΣaΰv g¦5M€£”υ˜:�kš¨©ΤΨ±˜ŒΑΡ Αsͺ萬JA>ΘΫ ΐnέ οaˆxRΦΐL‘ν™σ†vŒyΤ dα”s¦*j Φ¬©”“uœ™YJQOjp―’d6ήΗΩpνί 7^{#Όωυ―‡ΩqόR΄’"θӝώ” :A&‡Θ‹,& Ζξ�₯§c›Ώˆώςj/k!Θdά•¬Ά‡sO<… •qΔ,.,Δ:A iΐJ³RfσενϊΡy?νqο­o†τΚ<„ χŽΉ“Ez¬tV€d+IζuΩ»1 "DD™7ώ$Χςά˞gŸf~W„;7ίEΡQΗ›}ΡΝμP;�μi�‘—j ₯ς‚βΘη₯$‚(ΐ€Τן™!€sƒίΟ>σΎ3σ0Φ©€kΡ²=yV2�Θ‘­ϋ$Jdε b­Γ·€‘ ΌΑνςvό,%°+„�ZΙ2¦U4Ύ‹k•΅–dœZ:»h£ΧΝΊΞpΝ5kα[/Ώz–)En�)™Γ+ΨOr\Ά€ώΠΜ"₯³Ζδ³FJf2% ήWHκΫΰ^#ΈŸ$xίSD#u=KΈΗψoΏά³$$νj’Ω Δ ΐD>MΖΨΓ[ϋJƘm ^{q<Ÿ³φ[ρEωώ“ΏΜωdΓoόΚΏd’$Iι t ΝΉ μτ¨lnнαm+Aι~aϋKkΤΛΩ‡H^»%$z�ΔRη?œ“γ;Δ°Vœχ$++ ό>†GΞ‘:cψ…Μ>z ή`~AΆ’Υ¬cίΣ•ώ”`Ώ.αϊ>₯€bεύ»ΘϊOkη1q»tε �‘:ΌwλYSL !(”Ι»_«xRmΰ>^θΣY߁²F]oŒμώNτ}žΔ’#φWU/•ˆŠΈŸe«(ŒwšΉά€ΐ)οuԟƟI|H€θ~ο|-†(ΰ/ΆNεϊ₯΄j„³οπQρπθ₯ψZΗΫV·–A΅ΠoΏ{#LΰΩcš{ρ,ϋΪήςς΅9�…Οβ:4&΅–?ρ΅Θ΄ αΜ5sΣPch ZO\/ =Γ}ΝγyΦZZa{Φ σ·Œ½ή  ž9Y͜RΥc9RΖv΄œS{ž m-΄8Šλ~ay)LΝΟDRκ"Η9ΡΗ5k|ynxΦΛƒ\Η1™φHBΈ7,³DU±₯B�ŽΛΟ8Ždfτΰ^»z|χ_η-Σ3ξσϋ”z=ϊ2ΕΟrνqn•Μ‰ΛΞ††/ΠUa˜±‘5­~ΜΣΝΝeξ51Έ?%Œ½‰ ―ηβΥKνΆRήˆΧ dχ₯8’›:ͺ`μ-νμ>Χ�ΏC‡žuζ•ͺžq”,$ υ�”ρς“š’ΖΔσΐς»4Y’α9Ά’h°œΕ5_Ζυ‘†”­ εΕ‰ΗΟ~ΰ©�εG�‹ŸόυϊzΪΓΎ #Pοˆƒο^P;‡―ΌρΚ5ΊΌ΅<»tΊ½ΉΫƒ‚ bix–‡«Z·Ι € Jτ28ΐTΝ,Γ)ΐQγ#4›2Σm¦AΩ―D_oΆΜΟΰ^ hΐnβο.Κ uŏ½ –@ΙΧΫnMVέσy‹<QνφHΌwλ&%³ΛΜΩJ>'eΆ‚B€ΰgDεΰ¦…AϋκSWΙ 4α@^G†jCΊυψ _[·6Έƒ HC$ ζΦρkN(σ/XΡ‡AδF²άf ―Ώ}-Œέη3 Θδν©\— xραόε‘Π?ά p’Π0ΠΧz» R‘ά¨\ιn}σϊ[a _<7œιΙIdΉ©°Ά8+ϊν°Cφ[E…’Dƒ"λy v !ͺ!?tΒίhΐ4vo,œΠ _ ωA2α!Ω&₯ίι°Ί8KJx‹ `5eKƒί2Ț}~žε>rϋ ΰχΒΦΚ:J ϋΧ—!₯%Uy™=£Ωn©5–Τ9Β!ŸΩ t(Έϊδ(δΛθ‡EΝκ>Y:@P”“Ε²mgš,K†{“ερΚλ¦+ΒδΔ$ υΔƒ²ςrnc˜ŸŸc.3;aβν{a›ΰ+ BAΤIΠΛ\‚Pͺ$σ­1c9„Δ χΫΞ ΚUU―œ’"Υ ²@W X₯iΫӏ…¦φ�Π58ƒί,'τxς1νΆA³Υdq˜Σ‚'Œ@Ά–920ԏ™^[8α<ε<Iχnb€*†>ί)J�¨J’€E²―ft•«€θ$ψ,/Ÿ==ν°dΆNπν(0l,―…•ρiŒΥΐ$Ž$Šλ)φzl‘ε3 ₯½ ΤŒ•uΝΦ^λ οz{_Y#4Έ&£$ž™š¬σ‡ΥΙ³b±M*sάV•±γs h9`>2†J­ki3*Ψ΄½θs±Χt½ĎEc?ΞΕσΈ™1Oο­ α­ƒ##9τRGaA\L«ΏΜ―D*ξΣQΖχžΝgΦΎ{„² †-LΗH¨ΉηπβΈΎΤ’έέέr25ΗsOΡ3@Rΐw‰k!ψ#±πΎRΑί»ί.τͺ0›,Ω ¬^³I ΑπΩGpLH/λΎ-Oɟ"Ÿ'³™γž~ό{?>ςβ αΝΧΏ�_»Ιυ1ή₯Ό—΅užTΕ\±l@0Q†�ƒ₯ΟQrΤ9­$ή/ _ξYh0AΔ–ηc=ΉλΤ� 3μ^Η}dd(<σά³αέ›o`fΙϊ€t¬,‡¬γήXZ¦)_‚ύVπkVΣ}Rƒω…©°4?O­6{-„fϋHž[&>|4@ΜGΏ„-Jτ˜π,•�GCKΦ—cκ›G=rŒ ˆ³uK κ‚μ-[gΒ…+O²�Ά °9 l`;μm¬Eζ<Τ‡Αtӏώ9’tϊ;Δ¬:ΓξάuΎžβOΑρςμ[% E€Κhκ}g_tΦ°―»Oι9PΩΫκψυχ ‘ Z › ³tYΐ―J³Hž/šΧΉ¦w™λϊ„ΈΟ«€�π3v\ό©žͺ¬`²OU5V⽂Α-ΗTQΙ~XΖ^;;9ίϋ  rŸ`ŒQH±!±OΉή [Ÿ—Ύώ}�Qωώ4έLv ‹ŽΘΚ;gγ3Τλΰ€vR‘#H?`ŸΠμQSDΆD_ΚiXO5`μ ’C׌λTb—G† ‹Fžs•6σtΙX <ΓσΌΐ~Ϊ‘.‰ŸεΜ#KsŸ4ΎHΆιΤ0qΕω}xΆŸρΡ E’q¦f­άLΗxͺ¦\χ%Δ(Ξ) ]VAΨeEίx˜MT–›¨R4ξ ΣP$88Ϋ-κ5SM"Βύ5‚dπάΕHžZ~c{Iη&Λ ΒΎŠ’ΫΠRšΓ3Έ„ϋΰ³ΛDK3†ΗMtμ©ΰ™ΆO‰Σβμk€X†5$yαώ’*Μ9‘ε}@IDATγ~εή#ιζΏ“Œ™&•͍΄cF½XΑš΅�ŽUέέχΠRŒ2zi?�ά�έ�?Ότk�œ…―ΒFΰ?` ΔΑΐ ^R?</½τύλ/Ύ:υήψmuv|nvnό{··6Λ0Σ*6ψ P> 0UMΐΣ8>πΜ.˜�Γ–- §ό“ >B³‚Κ£uŽ;τ!<αα~€$»˜ίΩΝΰ˜  «nφΞ~+κσΙτ (ŠqͺΖ+αPEs Ζ‘–�4B™ρj€ Κ0Ηo½f§&B+Η#ξω™T>Δ"{¨oΌχM”¬¨p±ί»0…)]/†._Dερ"χn%\{ω�„Ί²[ΖΞΊά<5°’Ο<χj'¬1—%•:ϋ;P€<šiGΙ²ιΉvθ΅έύ‘ˆ [ΣQοχ(XZ‹ς˜@]_Χ„7ΐ.ωψΙJ2Θ’JƒΉτ˜Ρ²E— .Ι›%jξwΜΎ μ]ΗΝ=υ"8„40s�ΑaσwŽψo£o;^ΗR@ΐΔμΈPC²ζέ©2aIΗΘ~jκU?’ άe³”8νG‰x5γvˆšδ]:LMOΔ,x-EA3Χε�ιœ{)ηkI‚€’J$₯―#P&Cjζ»‚,πs/~0Όpχή*Αξλλ¦}γ-φš«2LΠ �ž:γσΘ£Yla…ΉΝξ ”8ΉoKοχ€€„{Šγθ~–(Έ“Υ,ΞQ�50Π~ΰ?3¬�τ ΏΦΧγ=eXΛD¨!Λί !•ΖΣΐy^ΒάΦy? $a A’Α$ΏŒΏWΥ!α™eξΕς.Φ¬―S‰± ΑΉ…τΏ RΖL§Λ½£ͺεk·w  ΒB’) Qd‡ezjœD·η¦γ˜ξo“εo#kή³’^§j,f sΠ aXE;ΖαΡ dTG)Ϋκ’-ζx$‹3–(CdCζκΏrΒz­D�-Ω‘r¨ΉU’€’=䈹uΒu4r¬ΝωΉ%cΌ ΐπ·@¨Ή₯9ΗXΦ&ˆ―‡,αs%6Žο%xm$HžΆ΅χF �k}3„’Ύό{E•Κ‡^ˆ“j:7π3Mw6™ŸΜχNˆZΥ,tc±V>ƒRFΒ«³ozφEŽ‹oϋ‘mgλΘ&§!ΙNΈ*d\Cz|θc‘ζžY!)₯’`}eo€•ΨMΑ¬zσ[ΐkη‡cH”^EΜAΛm’Žη¨%?'{2λ „ͺz$²$χ|ΎXjeφ»šjζφ.抝‹§ŒΥm‘ΎΆ%dBΖύ;λΠΙάς ]…"ιΜΈVQΟ;ξ³H=HH ΄±χuu‡Ν0»4•»Μ9A�Ο± dψ«σ+ς5±ΟX ρ «tΕ‘ΈΣW²'Α=ˆK¦kψ©Iυƒ$B­Οv³εώΜ}@Β<–<1.;¨˜�Sπcν­­RΦΕ₯T[¨ΆΠ3GUΰ1λόώ”s<γκ!„zP$8WΧvιϊƒRΚ2.‰ΛΜ–~ͺ°,1±΄‘gΟD9χ=ζvšύηΠuΞfc� †­>λ8-φΤ H Yη‘|ε½Ϋ›ψαpί²άΧχeΞΉ΅΅•δŸ©2γbΘkŒΖάΟJΝΌFΩοg1χ6Α½˜™ o½ώ.σ†’<ƒ$.TIl$!!Tm•«Ž(Ž-,«kx~smΤAl‘Πσ>s)+ΫE½Ζ|AAIχ'(ΠωκΪΚς7όΗώyccΗ™!Μς �.Œ@aώ#P ώCSψEaώ�Fΰ₯€ϊΰθŸ�³ŸIΠvπ?Ε”0₯0v'ΰ!¨qQ¬‘& 2ˆΧ…Y49‚ΐ ΦΤ1ςγ1ΗCWžA±`žΦ\<ˆ£—₯ο506Σ^GΫρo›Ωίkΰ�†΄;³·¨‘D,ΨΔΐ›�Ε`@σ!A³w‰­`ΛΆMA’c;,-Μ‘₯J…ΎZ?‹Yά`{|›A±vΥ`Ό€rpˆ‹g―α,kCΐh ,ΰβά*ςwί»ή~ύΑςe;1»QMΝw ΐdˆ+8υw’ FF{Bΰ°J­k Ω-[ήivΈ@ππuB5ΑυYζ6Ώ{­»d=ΜbΤC΄μ��‡Ι{χΒδκχo\§Ž’ „-τʐΕ70&˜τ!ŸΝo’ΉΫ"ΈΩc &Ž…wί~;Μ“υΚ"4ΰU%P)`φΦ?fp Θͺ–kt !%οL –ΰ'¦ΆΩ:B&9K-πΪς2cY†*‘)Τ463>*r%‚"ΝΠφ!+­ƒpQ’+Άή―λΥ°Ε‘ϋ΄2’–'h–§™₯ε$’D9ξk&Φ‘�rί˜ ΰχή͐{ΏW—Χ³α›_ωJxνε―Ε σ'|κBcgGu:Έ' ξ5;Ϊ^Ε?€Ά’΄Oμλ‹rΧ}<’9β ’βGοέ γοή +™Ρ'ž =ƒ#Μ±cξ©Κq±� 3Ζγ8Δ,?sB²ΚlrύξaœάΙ”—§8₯uΌΎˆ9gωH‚`=ƒ9₯}ί0]žŒ oζρ$˜]Œ­Υ8ΗΉρ[d�F”΄σΊζαΑPNΆ·π�†ŒΉΰ κΰϋΰ‡βZ�ΫΑ˜ωωi²₯Φ¨HT˜‘v܊ XΈJά“€8Η―ŠΰήΪb₯ΆȎ§ ΩΏ]NεΌ&šΐπ„δUό�P.‰ΐμηu– lAφ1/˜o“ΦSžcp»Γά0*·w>χ^ώΑΟ �OJ!¬ι%ΖTqcc7ΌόΕCJΞΧ€Ϊx8Οη)ΓuΙ²VνvχΑ•_‘``ρίΑ6~Όζκ3O‡ωΟ$œΓδ²ΥM·ςoΦτ·�ΏΙy–Ή'JΑύ,ΙΑοωδ'ΓgΎ�/Ε–§kHv5ζoe-Ά£D² ˆΧTΟ»‡xMο+gχ˜ Sμκ�…Ϊδβ₯‹αŏ~(Όφυ―‡WΎYΗzSν"‰"Iͺͺͺ /bώ–l9αz5ΝSaγΈESAnjλwο³tDBΠ/‰ύ[ŽπΨX (OΔ‘|eL”k${J&ή–+W/�V(U’Ĉyφ„έu=62ΤΎ£„βΎZ–UΚίnrΚάν=oχ”} Ξο>ίΜ�€m΅ί¨‘ήxσ:ŠŠλQΡSÚ?J6αί‘GY‘wB„μϋ- ¨ šΩ—Q)ξΊG.’V‘mSΠLm{…> ‘PΔη rŠΥήΓ²ΨGψc@&±�Gb™ΊόŠΐ²³όμ Ο³NGΦOC[Ÿ‘p/c� K³¨ (ύigΝ�,BZ ž;ρ2w‹μΜ?eήW5­¨°Q;m… ˆgΛn\λ 9XΘ�΄a=h‹1l 4Ξμ΄D™xžšπ=¬MΧ1Φsspp τ ¨±+Ρ*dϋT/~;†£‡Yx[υr=Ρ―ƒΉγgV8χ$ή3ηΡ> έ¬ŠσwΎkL A!™ΫΚΦ2OUΩΥPBWOIš ΣVOΰέΡΤRpN³ΟpΟΈV3α*$Ό7IΞΛγI H=Ή^½7>ϋυΆ¨ζžΨιΐηηxž»|Φ"$±DΛSW―„η�\Ε€p.ΜγΏΡ„2,–oπ™ž§ͺ±Ύ�^φMΫs*”£[f–vζ°CF)ϋF’u™§଍%{Κwξ‰ŠF[tJpθ… y` CΧ^ ϋezΆ7t―τ|έ�?žΐΘw6>ηΚx.Ίι9TΕ/i47?ΑΨpΏΨ'œ³iT8‡ά―Ν.)–ΆP*¨ΪΑ1ς|U5,-Π‘daσfόΈ&ΛSvvT•Ψ:Ίόb9ΗcŸˆ{ϋ­{°sŽλ֘ΕλSi�‚rγψψ`όSŸϊΨίψ‡?ρΉi δ§πUΒόF @ό«π�ΒόαψμgO‹ΪκΏέ@ΖmΉέυy­Ε’NHb‚‚¬7–"PΦ©9•ν½Κ0��|Θ‡¬_ΎΞLš~ƒΣ(·είfCΝπ`Β:lKψžχRΘΞΓ[“˜έ#θ7pΆvΥχY ‚½Kx@·ΖΆΐΙƒ³2lή³L­‘Η7›ΦHP$ Ϊαœ{P›…\ —gϊΎώX»OΆfui)LL<Δ4p= ο&3cvaff6ΌφW_"ύ':Fw)07ψW’8ЏΙb{ΐ—k'Π4£[ A ”•g?jI¬Υ_Δ<Ιϊέ‰ρϋόΞ:ώTΈjΑLΧΏΛ2c.ςΰ0Δv<¨ε*:fυ @F©Ϋώη—‘Ψgš5n-oˆ˜‰ΰž Ÿ,#±#„ύΎΝšQΦ«Α~Χ§dδ·Oλ˜Πα 6k}¦Οbΐψ€@›žξ›8T§0k‹Nψf�Αœ fl>ΦΕ—#έZš ½}d5ΙέΈΖ'&ΘςPž@›L³’2³‚ŽΉ`Q/ƒc²_ΦΗ›Ds»]H*˜‘<δ~�"Iε[Τ%αΪ«ίScΆ9ΔC�‘˜ΰάNΕdcNΙξεvC Αj-Yεc‚�ΖfδΒU2TΥ‘…ΪΟ^ΆMΣs`2fωΑέP Ρuα�3(,κΙ¦άm’Ϋ"˜�οή ³wο@#e–ό’¦wˆ H•6+˜«•NμΎ<9NY9rε efΛf§h[ JͺΜ¨6YœŸ%p\dcp@ΨΕaώ`WU !)ΣΡΣΖiΫvL Y‹,UΩττΒ,ω€ χp€φY@[ΞiΚΕι0φΆ'Έζ>¬©΅•`Α>1+c QΗί9j˜–Έ“ΧσZΑ‡Α~1λUπŸγΎΌ�}oζ ZOω η­™Ž5ΦάU’q’ ›¨-T©?ρ #ɏc˜^ HΆ΅ Jƒ²€ΣSavvެ εJσ�NΚϋuΞ¬ϋyf!c&’ωΎΓο_βš› δ]3^“Ω՜„ ·e50³ΜoΌρmΐ'+8ΗN9CΝ.Oxέ‡^όp,sŠeAÐgχί»%χ1Xησ=žηβ±<�νf²Εμi-έ †GzΓ%J‘όϊ…Ο�<Ώ+Ζο‰ ζ7΅ΠΗ6ύάμ’\+ψΰˆb�Έ'2¨βΈΊο \$ƒD†¦¨f₯%UXB’€c{ιιη!>Λ,+H2&žS#†³μ«K¬UΖ³ εΑξΖ] P aT§ͺ©”ύi›cΉ5΄wΗ6Ά3ΖX³˜rl6IΖ‹ν‘s8εσ–K0Αγ9a”¨'H#λU�[ΥΦ±?ν@Ψlπόrε輚ϋ6ψΘx�χΨwσdΌ›ΉζHc=’<γΚΨWτΈa&Δηi”Ψσ»f Ν…ηyV-ΜαΫ3=Ν9œyq�4›UPΟήlΙ–{€¬5¬χΘΰcˆ4ΫϊιM‘Ίnuc5ΞνΡσ—π jδ5γ,AΙ7Ί„NdΆσ(ήKΛιΦ‚bƒ‹fέ4œ;μΫfΛkω<χ7N¦ͺH$”%₯j™—οͺ%Ǝ| ηe&Ύ„οK™O;ϊ₯°6«ΨSJΨ°Z(W˜™cο3Φ`kφͺ—‹$> ͺ$BΪQ‘™ι·ΤΕ­cI ΧΗzΝZ"!Α“b½ϊL>d/΄Ό0ξ  ϊH¬ͺVτήu@Θ4A"i<15ύX ―ΊˆŒ’Š,――D�Ύž8‚kZXšcn@°Cf«˜΄Υ¦Δx,΅c’―­AΟΝs\ˆΗJ/˜Η^«-P9]Ϊ£h`ήKζΈ°τf²|ΚψHΥ¦%±lŠίymϊω”σώƒμΞ$ϋΠ�ϊχώξO|‰Έ¨PžΐθΎ #πGqπG±Βλ #πxυΥ—NιWgν―ώί/ϋ{κξ>x0ώ œΖΫ‹Νt76FΉ₯/5θ4H?° δcM³Š—3`€Κό[²ΐm,Wΰ=„Ι1Ϋ ™α!©gGΦ_§wž‰1˜0ΘU.¬aρJΜήZ2a ~Ζβ€y8ΫZ@ A“²v {S›ι°FQ Ν–*ΡLX_ΈHoο¦pχφ-ΰ{αiά*€£Gƒweƒ1θγΪΪΪ:1PZ Kd{—θל l“9\ΐ\K¨}Ύ ”¬Eξ@iPƒ€Πο7ΦW �Ιf†LU¬-.ηΌ:P& ˜θ% ƈΕϋ™©‡οπgΙ€ΩN‹μŸ€–Ξ^aΣ1ρ#ϋ₯ΛΎ­ π4ΝJ’Ε·`”ΨΜηq‡7Λipaλ«RƒΖγt jυžΠHΞ Ί‡D‹’ΗM²_žq‰™ΩyκW¨wފ@YBηi¦ς4o=&5Π”%Τc0¨ΓΏΖ€₯DΦ'ϋΫkaŸ²…Ι©°GPvΐυj• ͺ$P—d2(RfZIp ψΉͺ ΜXΪΉBΒHrΑ. ’SYσχή�Pjΐ]‚ή22‘I€„χΈˆΉ“$γZMΖ{p�ΡEfqn ΰG xZœ{0₯o6δŠdO�PX|H<θ]PLVwbζq£^‘ΰ‹Οhp0 !‡;K‹Δr^Δ;fƒ‡ζLŠϊναΡ‹½Γ°τx<δ8–¬ΖΆφp4δμ!ΓΜ|h,Bκ,“yO2ΉEΆι¬iβψxOξί½MUI2tΣρΒΰφϊ›ίΖΧβ~ΜΤ₯Θΰv0§5k,ƒό:8e‘Ηe#P—ΐ‘¨³5Z)@ͺpk^3ΕΨΪZN±�kA˜eC’p‘8 ΈgΨ"1‘FCFtΖΟρωΌ“9±©sL3Ϋά=₯τ’hΈΩRΧζ>sY 2Kœ=ΐύY͟<χή€Λ¨^¨ΊgΤ4΅cΠ (,ΜλH>ffXͺΰωQΪΓq$�\ωϊ% "ˆγ@„Η qI―χXΗ―σ5ΪΞEuΓ!`yμξύΨαΔ΅μgIψ9�‡K££ŒŸέπνΰ<ίyλ-ˆ²{ρχœγ– wŸσ$*ί"§yΚ.*‘bοn°Ž›ΒΗ>ρρπείύ½pηνχ\ζœο gωFΝ Khqj›ΉrΘI—c Θ”SΗ’(qύjtθ9z�]Ώ$ ]Η�?Ο {*Fjμ;ž›ΞςήΟfDš¦ΩB2φ»ε¨SΟ³e1 έX@}…‡‰{V‚l“N HΖ¦ŽŽd5/¬€Ψ¦΅΅³ƒ 3ͺ€Έή)Θ�εNΆΠd�“e†¨rnq~ΆυλθuοKQχίΔόΘrO·ΩkP4 BΞ]†λ”3�Ή εκΪ•Y'P °ŽΊ†FP@5Cξ-³6HΖ.Ρ ’AβNΙΆνκz{’™γ& ·½£›²0T:<7Žx.€ΨΓ-‘³Ζ\™ό€�yΌΛ΅NŽί‹ε"IΖn%E–=ϚρcΦΪκό<ϋΞ*eΤ’·u1–˜…r²μ’8šψͺ�(a‘τ’€Σ#D…ˆυιυ”?ι/³¨‚ΑgΧkΔrΌ η―±„G"HΒ«„σ+K°!·¦Σ’”±/alψ-γ ±Δϋ£Έžgh\Ϋn�5φΠ7oΔ{Ξͺ›<zιΣΛψ2Aβ:q�JF/‘Γ=ΜPΎbY‘δ΅*― φPΏ5ό;€dΥ"’ΆΛ<3kΟz”MψEUΪ₯Ρ aš1J³f{ΊθDCχ‘jΖZ’5₯²Γ…ΛWΔ°{ϋκ*F†μuή>ΧΉνžaφί—ξ2/Λfѝοϊ\,Bθ¨μ³SC„W)ϋbΡwˆ΅ H»eΜΞcVΛ³·ž=τάΰPζήϋ|@ωΪ�-PΩ;τUΠ@r@υRŠ’ ͺ�R(ˆ₯vQdΨ―c<Γkν(”CSΜf,βδWQK Ι1―Λδώ;ο27(νj+θ*ςΫ—G‡�φ?xιsί`pκΎ #P?Ζˆƒ?Ζ ήR?<ΏυΩΟ†_�₯όι₯Ε…C.Zbπšζ!˜"SmΛͺ}Ž’3 13‡\Upλ’±_Ωχ(Χ%Ϋ­„Ϊ€Wΰj�ϊ(½ε+²e’A†²Γ"’’±₯Ύ ΔΆ]1GΠz@@G @P_F I›0H 3Xf‚  w©'Άλlƒ¦VΥu<υC3u½KΘΏοέ%λTE;D\€Ώ“₯²%œΗ΅ ΐθ‘`[+ΥΣI ³4=Δ1ΰ)η~αΒ9Z,b¨Hν:!? Ž($΅π–<¬ΜΜ†;o½VfgΒτΓϋaqr"tbξΨE­δΔΨύππξ ²ί˜ šq@Φ›ηφΘ²jNf&Ιv€JtΘx[/{L¨C»™Υ².:bkœEά3›Υd¬%\μΞ3ΠμŠ \Ώ&pΚJK9'βG|θ|@@Ϊα2΅Ξτ?o…HH1Ž€ΫήLc· 2‰J(«p―.§ ©p²μβΰL–™%XΞΠJ m(†Μ8ΰdvΉ/ ~ŸΥp’(pi £TYE€GΠi+�}‚+e΄YŒΥ)9°Ž˜α42v’)S΅!˜2ΰ¬`¬•ςšω¬ΰ8υ«mœgOOžΫaiβ>“ς,ϋ]G°gφ- )dΖwy†Φzλ(ψ™YξmDΧokC[Q6όΝ^ηtco½J•ΨΣ&rγΈuξ‰-°Ι|\Έžzφό%–Βφό\8ΐtm2Β51υπ.γDηζAšσήζxξCψP‚ΣEό_ PΩΑ€’,!χ’”ραφ…ΗΟ1ζΧήΊΖnέéϦk(JΗf!F‘ω#?'»ΝμŽυψ Α�ςΦbξg‚΅RΙ:;s7§$&’|ˆtYw +ΐO€Ξ±Νj�%i Ί θ› 'ϋ S"¨ˆλέ…Ηg¨8`�tBvmφ4Nυώ”πϋϋˆό όΉ.Χ‚€bv3 BΪ5wubΊwy9dkR €ΩZtψgΞG9=Ÿε^#q χ‰ GΒΓ΅‰ΞΗ΅‘ys% £Ω Rκ@ι$$˜{‰λ4ξόν5§ΉίfΆ]_7�ΏΎώε―„ΗΗρSAIΐ˜ Ϊύγž:c㞠@1ϋWŽι‘ͺ˜€Π˜¨d�Αo�>Ωq2ž€•"Φ‡i?λ¨Ή½QP[‘$>ͺ€tiίGΖn)ζhq―dέJ<κ ξuFΒ„=Χύ3ΓBvΦ³¦·4Sδ ώΜπΛ£dΎ»ζM%Y՞ήΞ\f&[?|[:Žfω5Έmδs<ζ­U ό•ζ«‚RΥ₯i¬―MaξφΙόΑ0‚!\kssšc°—ΞNMq/1Όγ:s¬A3£MM΅€|Pvb„–Ύk‚'ΑΏ΅ΩYŽ_Α:…₯b©ϋ¨2μυmm‘�½…ΏΫ# ,¬p’π€\e�ΐVu€¦ƒ-]-˜Ϋ>ɁΎήAΘLι8ž%μ-΍συ�ciόqΨa―οθ:kY»l‡ƒΩαD₯άφΪ&Ζ―tŒΑΰ΅�Y―Υ![ΔŽS€»# 3€yxy’vξΑ(» σ{ŸλVqΡ yν|ζ†γσΠeλ₯Μ‘b.θΔϊzΦgNΰ »up6ͺtΦYΣϊ@l³OΊΞnπŒ™f_id‘@uύ™e―\Ο,Πύ‡ύσ©gž„¨΄}.Ο”ξ‰YΖΙcϋR=z²Νc”e’ΦgΟΘ$Ι*Ζ ZEše3€ΰN2νψέTͺ$β<μ~�.‘Δ\·lΛξ?χ™SΩϋΩg;;[ΓόΪ"{|:*΄|–zΆψeΑ±^Ξ€ψΩbœPjψ³}ž₯GμΩ’€–3˜•·K’%Œώn=½ξMM†EΌBlΉΨΘσ‘’ίηψΓ‰ΙpνΖ;αζύ;ϋ›ςχσ?�ΛοcϋδŒ²ΈθΒWa #πΗŸ …―ΒFΰO0°Χ§_ϊ­_œ~πθΡRΕςβ";fΙ([Gλ’fΦ ³Η,Ÿ3ΫA–ι|@ γ/A`{$ΫO  dΜ4I ˜Ϋ&«kf‰ƒm―|Ω€WΫΑΌΙšγŠ²Ζ˜!ΤPhŸyb‡`ŽΰΫ‡qΜΘ ž   FΔBJ2ύ·²ie Κ?ΫP5f3£ίΨ7‰ ͐ς[§HAΫ0ž’Ό(‚Tτlh[ωΚ©5Ț™žŠAY;²ΡΛO^  ΦV™©™Ώ,ΩT;P(ω>^§Ν΅o½ών0E ΰΌUQˆ€šZ:CY[YfΆΧC1ΑaUτBPΎ^B§|>Kfc—¬θυμϊ œxnf½Aؘ.Μν’p°^΄Ό�…cΠA€ŒΌ%%fxKΙΰε Š*•Γς³,²Σ5 ΑŽŠΑud)›Z»ck2ΑΟ 5˜§9ZΞ©Žσ(―β^Q‡<8l)Ηε�“‰±Τ ˆΦ‡Θ™7P`ψ•Δρσj­Ν�tτ “±Ω λTψ$F°ZF^ 9T@hλ ¨Z + ΛΡLyA’€)ρ•΄ΚΆ’y₯d<Ν�ξPPƒβα˜ϋVy£l]ΠΊΆfΟ³Œ‚σ/Η…?΄Ν0aVYτ₯ίύ"^΄Χ$[h‹½σΣ� ±ŽšΛΡΫ IŸχq€’C΅€™$£ηεήα?ΞR"‘JΑ�ή@&[ω�6™aΙΒ#ԍ”ιΠR¬I»m”Bκ^e@ŽcλΈ΅εUZώ=`εχdAΊϋΒ1€�„{YN E rοτmVΣΊVζ ]y 污2ˆŠŒέJ!a1±Ϋ οΎK)fΉη†/²^vΒΤ£i2ͺ”.ψ2Ήύ099†α^€Θ*ꦆΠ7z%τ £πιαΎFpnΛΉ*|;τ£iξκ 3γQ5`T˜©gώ­RŠ“¦£ΘRΜδφZ#“Ϋ»5”c±αKΦyšΜIτO˜^˜ ίσ‰ο c·Γƒ‰±PΧ\ΗLΚ…]Φίφδ£p ™„ΣGX›_dλ l¨&,M>Žέ.2»Hβ™PΖ>_Ω€νςqXœ˜βzlΓ©�„Œy &¦ΘΦWζζyφΠBο”±*α~p?•ΘKΐ‘Β*e~dχr‡”Β΄πωoՏŠ»]μ‘Mχά‹©9ΕΠΡ2«3γJΤ ”XEο ζθβ$Ηg/κν†γs�ϋΑ7σΔΞ*³>ω™OQ‹ΏΒ3’6 γ?QΉX…Ί εϋ’fŠG””θ‡ΠΕΎ~RNΩεoΥ™BYύ鏄γ�£Bΐ–1ψΨ‹οΰsi„NŒ‘¦ΑΆNώθǞη§ΓτΤLTΤθΕύˆ’…ς”GΗ€g/nŸυZǜP QW‡Š«΅«=μρό˜ž_ΒΏa"vΣωθŸχ[?‚b”5s³QϊΏŠΡΰϊΒΔ e,¬*|�>σK²Εf%t,ρ9b?ζ’!H8žεϋ¨0ͺͺP’Ρe(“eΘρ= :KεζΩGΆy6W’υojnη‘ό LNA@9₯H9βŸΩΕiJύ6xΞV’n\ CCB/χξ‘ ζ—?―䡐ΘξΡ7ίΉF<GD'BΩ1JMΛ©TοPρΗ>€*‚„ D‰ε{vΔ¨­Ρ0Ί˜R―ƒΓTEΙW;Ϊϊ�―ŸόΙ/|“ύ!ΓΎ #P?αyΎ #P?Α₯KΌό{ΏρδζΖΖ »»{GHκͺνR ¨W2l&Ÿη`̐i\€δ°,C€gΐά ΤΉ`]ηeύ r@"τΘφ[f`i«¬h‚Ζ3ΤΕΪZeΤΝ͞zϊY€u˜‹d€ΘΈ5΄†Ύ‘a[Oθν$ΘΆn|ŽΜf|ͺp~Hn%ωΆβ2Ϊ"Ϋl-�1€Βπ0’X²no΅X™E°λ‚Ηχ-Λ«6ΦVοP]{σuڜ½‹ϋηS†Ξ‡η_ψ׈a|ε㇨ό¬[·oΔφgΆσzDf5MΆΝσA†>0x.ΡΊΨO’>˜Ό;νΚ[ϋ ϋΟGy�δδdlΉ§,V©�™eϊΚ9¨ρμκι#ΓHΐHv^ΒD£―r|l}η— †c›<η€B °UEΰ, ΡὌ’Š62G΅€ΌbΖΫ:ρk―ΌΖο=`σ{q}u―ήξ!Έ,Ι΅Γx-Ί•±“” ›‹σ˜ŠQCΜ=Ϊ§ŽvcVk€t?―Iz/’�r>kq~ IΠˆήc χvΫ»ϋQΗς=#΄Jj €J+jΉn₯ί€wΑ¨qxohΑσ›F2—DίΜ»=?.κ€Hη^#²ΦŽW$Ά»dŽ’σ;s’š^UfήlΛΆ4? !Βx΄w‘XH£ ™'£ΦF? s‹ΛΫ4š΅²v:E–3†Ο …ωχΓYΈ>Τξ½ !ά)A΅’ˆ5!ΠΜrœ>³’Ί<΄’‘ŒY:£RΔ(‘Tρ”s.MMακ³O‘$iΏυkΏ�_�F4pdθ˜'”°67tUεΙPηη9²W�Mns8εwŸ©”BΌxΡ)�œš)›‰?†ΰ;εΌJH‹WT‘iψckϊ ’]‚±ΟA ρΦ^Κ$Xp¬?2Ξ|ή!j. ΦεϊωL²(νV%a)’Jη―λζβΟ†ΫΒΜγ‰3pAΈ 1SΚωξγτ―ΪH’¨ΓΝ†ζκpυκeΦE_Μ:J&\zςΙp�αCΜ3χβθ㾝₯BΕvl–>Υbπ¦ΪΗ½Ε/Α—σΒ¬lŽl§εU�wχ/IΛRΖ(ΞΖΡ�†(Iχ}!Q}ΐIθe™OΌ#f�€)a�K7ω@=ήσ¬ >ˆλΒ2’ŽΕΘφYSΞρ#@› ‘ˆŒ΄™qIUAš)Ί•°/ΕL7ηξ9jΜηšPΰϋ”»›)—όJUλƒ H€O<™ηΜοA0ePU¬ΝO Q’μμΗ€ˆΌˆ€PV8oφφΠ>4€Ή`3Χ›ˆΉˆϋ œτ’~βΏ €cχM—}½6T=Έ7’šP/0ζΗˆ€iSS#γωΒΈ ?.^Ή [½ ΚΈΖ*ˆΛrΦφξϊΖ™3=Κ†ˆΨ•ΉJd¬Ε§\Œ,νδ½q*)†π3KϘ$ΨΘΖ«ˆ°½’%i“s˜φ’(θfΎC‚1χ–Ισ3CsM#έbϊ ήΘΠBE/ž<[2μηϋΑϊΛ¨zρΉ#ΘΌΨ Ρ#!‚]ζR‚ϋT AθΊ³$ΒϋU ­βΓg μZ„Β1B[7q:ši»ιΪGν1Ύ>5Λ~̚α4Δ-βœN˜ϊ%ΐΖ±†5ε3\Oάλκ¦ϊ¨žRβZ5‹ο<�ΰΎ[J"‰%Y½ŠΒiΐ―ΟΘΠ`@4 `Ψε"Γ#}αβΉαX―Ÿ–leμμΞ M!‘χ ±Σϊ–ϊ0CYάΏT78ηUΪY�£χΟΥ žm[=­YΆa\AΥ—εωΒ’‘D/ φuΛT·Ψ‘ΑΏmI˜ƒhq^ΨUΒ`Οέ†”·”ΟŽ ј“ΏυЍfάz }m=κ˜LΟΜ‡|‡’‘0„{?χ|Έ �ϊΌY˜Yη38yŽΑ–Ο»HcΘ\.tς(amΐr„Ρˆ—Ÿ0Ο2‘"›-‚yJLΓΌˆeJμ+v)ΩΖ y~n …Ω₯‹+‘v?©αyΛ `LOΉgƒ$&ΪxL„ΫοŽρΜXβ½(6˜7�oŸ©p{¬½J~P½ρŒ`ρΌ€έ.s‘ •΄A΅5oog k5E‡:+•δg ²~£Ά‘φs?όΧ�ϊητG�«»/½Tπ3πξΎ #π݁³(α»ρI…Ο(Œΐ_Π@ϊώΕ/ώκRw�ΐiύτ›”ΐΰ?•"KξφF-^Φ=x¬@Ϋ ΏΞγ')υSznYq#}‡{c`₯Έ0ΫΤ κτnΠηϋΜΎ)=ξθξŒnρϋG/΄Pϋ J°UI·ή{‚ΜΡζϊ&<Α*•Ν‹z:–,˜}7ΰφη‚+εΏi€­ν-ʈΪ8© G—n>g… r5rΥ)ΔkΧήo_Ώ‰ŒpzΘgρ3“­Γ&΅¨†‹z/Μ/-`ͺψˆΰ§ Ιp¬‰½ςdΈpυ ²υηβdŠηgΒ,¦ˆ‹[m‚θΠEέZeΞžλ± ¦˜ΉΤΜuRςAVκ0§£xoο%σ0Ž!mC¦KζhμQ Zw“d5$Ύ²wϋΗonΜ…]“j²x@l²§c˜ΐiκ‰zcδz`$ςάSάΓ5zλα’α²Ž›Ρ�!'w{hŒ[ ²€£ˆΑή’|tρΒd,¨ Μζ«ΚΩάBnΡ }Γ|žνΩκ4Άˆ+g44TcΠFΐ‰ΊA oηΥή£cJ,ΝΟΘ|βlΧΡAY -ΐ\»»¬ΗdTιH’1^€‹Οφʍ•Ή¨ΘΘ@"ξς;(΄φ‘Nƒθ8b�λO‘DΝβZ”¬rώ8fΦ­―@$)αjlΕτ”9TΑsrib2Ξ!^}7Ή/±‚`�=ž}ί}‘βΠς};Ȏ;·υeΡ PΒt}L_ Λw$·$ΰcηžΞY±ώ’°‘αΉλ#}žΈnͺcΛܟ<―©’^ƒέ‹fζwJ½ZΎΧ@ϊK’t†gΣΟΕφίUΚ0²œϊωrξΚς· <_ːbΩχSΒbccbΊ+ 9δΎΥsΌŽ1)±Α3‘Ώ£+ΖͺωφPj•³ηͺΊS tΚυd/}+τ}‘³Τ"ΛXDΑ”>›Ÿν:U°¨Š”βМ*j3Mp£™+Ÿ·΅Ν’9AM©:ΰˆ{½Έ±Α2$AC] €Όd>¦ΝΌ�ώ‡h€πΰœTލSuχφ]’ρšL3 σ!K(*μŽ$ρΚpdʊN¦{Zλ�Γέme- Υσ•Ιƒ–ζΊρ�ΞΆ_Έ|qτ³�γί�©ω½ŸψΎ;ΏόΛƒ\ΜKœqα«0…ψn@8ψndαsώBΐ�ώ³?{ψKΏϊλΏ�•o¬όӟϋGwέύ ΑJƒ.Ι2νf/•WΠΐηψž€™‡w” “ω4“₯μ7AΐP VCΎθNΞθΪΚH…‚†BfXΜ¨τ ˜•γj<³Hz¬#­}8ύˆγ!lππ°�Δ8Πγ ί7 σΟΜ}π 4/%Ί³Ο̐αΒKEwgWl‘h ΅e~&xΩΫMσί&pΟ…—Ώτ•(;,!@6@΄.SRδκΥ§ΐ{Ci5@• ί:�ά�%1Ί::# mš±·΅š€†@xaj2Όώς‘z3&\³/ΔΡ\#₯8λ+ΓΛF,2°²…Z©Η|ςιπτ³ΟPOΎ  Y4θ"ψήΐ[�ͺςΐΰ5Oϊ«’%IYˆνΝͺ †Νj šνΞ oC=uϋ;€ΒΊφΞ0ϋx&ά~νzΨ[τ5Ρ Sƒ)eœ•HΘψ“JYsnϋ*VΞsώΡ#:9,ǚ{ς€€"ο)3 ,Y (ΘdfΖ§”QΰŽΝ8sΟκ;oΕlϊ‘Ατ™™#™7d šHe nΣ̏JΐσЁ"μδ vυt„ΎžnͺόΑ#G«Škc`!I™έ¨(§Ht’3šX9ΰ‹Σγa‘Ή₯o„ Œu ί– 6NϝΤΫ> γ½Ϋ·Γ2ΧUF[Ησ(`*‘BOσΊZˆ”ΑΞ6Κ˜W('4έά„ °ύŸ΅Δ‚ζ Β μνΆ˜TQnΙ@tά„ >\K»¨XΘΦ·€vΣd΅λ˜;]]dΪ‘Jk²ι|κ/²EφkΙz ~UάKΛkŠ8NΧVΑΊ«P ™’E9²nK„\%dΌŽi‘YBΉ…ΔŠYΰ‘sƒό9‡"d!GΝڊΌd²mΝ§ΡgŽρŽ-9ͺoŽ™5Ω1 φΊ #“NδK�1Θq=ζ˜‡I²Ÿλ92 Ξ } zπi ³{�ξMξ3ΩTˆAΥΝ|f9χξC/~8|β{? ‘ΣΒ’Pb.ΊΗTS 2ΟyΎύφ5Ύ§λrmI> r$υΠΛΓϋμ—„Αϋ‹’ώ'9‰6Χ`Ξ`>f,aFΊγΓΓΤ"SώCωH©p;†‚Χ|_9χ]χ�DH–=%KƐ% Pƒ€A?’„] AQ ΠΝaωΓΑΨ }Ώζ€Ί½‹X$$+$ν Ω*ΰ±ά‘Θ�$Θ•vF±Λ…―ρ΅’5utS(.ΟNΖη|/ebNaφΙΌ)Γ[ΑΦ„uΆΈƒό+OΊίœΰƒT3ΑεΉ™°ΎΌΙι‘`πœΈο#££‘δU)’’»§/ΞA³κψ}μnβ;ΒZw”σ';αΕOΙ{ϋΐBτΦΠθΠR–ΎώΦ&Š ²¨ͺy–&'Β&λϊΒ,„Š%0Jt™Ίύ.%Ji�·’,?'ʜ9°9–PϋͺQŠγ§ϋ½_‚eοCK+†€ΜΫΟ&’š�¬m„ε…²Τν |ŸΜ‘rb °vΘΚ³–dFγ1ω{/š€�Ν˜�±—Wρ‡©η΄κΊ&Θ" 1η ίΉu€Tύ;I8OK!­ΪΨšΙ<σ–Hϊ�Ρζqΰ«Io5€­ΐT�Λ½Μσ΅TOςΐgσ$Γ8ΨΎo ’€%‰ΖΏΑZC―�€_–ΧYFΰ~ύG‹J@&f§˜‡΄ƒ…Œθλ–«€μc\™3vdΩ€@qmBnεω¬duE8n$Ά|ΠΫe jΛη�₯�Ÿ£ξUςž‡,Et―ΧΨ±ο φγJψά“šP|-¬­ψWŽp‰²†ΖΕ�ΒJΚ•ŠΨ{υ�Q! §oΓΕ^ǞΚ€―^ {€π>W{ ΛΪ4K|τθq˜Ÿ]¦cΖ:χ—yΔuͺβ±όᘱp­ϊ3Η3&.ΨӌE4q½Ήψά-‰<‚ψs½f8¦λr—RΉ#J+··2μwtq�εœ“ ϊ+ ΖŒ{4Šωl 8%#[1)}φωη χRμWΣΗΫqώMC kX©BŽΪdIΊΏ·ύ^xαι�ν‡�Ϊ_ύι+££ΏyιςωλωΘ‡&YYσkηϏόʏ�ΝΏσςOΏ°D2‡7Ύδ­/|F 0ίε ΕRψ*Œ@aΎ›#ποϋkξ<~π3wΗξόCΪͺ•ΧΥVΟØ—š½AΖjζΕή/eŸ”¦¨υ1ΰyƒέ4“γωΉXgo-ωIΝ)`Lλx l β5οκιλwξάΒ…~…ΰ\—oZk•ΰ)pωj ψvφ;bfί*b•‰κΜ/Q ·–vŒ‘Χf55d^”Τ65 Ο…˜ŸΕΫƒ)κT§'ζΙςά̐v.€ΤΦR' I’ΔΨ¬’ΖEJρ‡GBg_+ٍ£θΖνunRiG5εJa—¨56[sχέ!K–bo•ο Ξσ[ΔΓύgΰ±ͺΎ9‚ωC‚½t�‚Ο΄U•FX‰RΌΧ­Υ΅τ”yΞΝΰΒMΦy{ν ‚6λmmύfI) ?C`�N½θΟ<ε’χnszdYhU‚πmΣ$$NšzΣ»ίx3¬OsnδZ2ŒΊ’'yΘ=λkΛΘPa––‘k@7 °+#@OAϊt‘ ―ijCΞ�ΖΟΜ™ΔΩ@$Ψi{cκρZHš~’=ŽŸ_C@^jc‘μŒfd6™+ηΎTNo fΗO3Έ9œέKτEΜ•ΖVZŸ!+έ^!ƒQb ~E%Y0~¦7ƒe }Γ-³ΛΝ ΖN)© ΅ƒΜαΝ7_…xΚ†ZH™ΡΎ'άΎsωυΓΠή7ϊ/^BŽΛ½_Zf hοXA–‘yσ/…ϊ\³Κ§dσΙ¨£ψΨYš ω}Κ: –r›-dΔw ‰rο”y—ͺM„:ζΙβό"υΫγ€Ίΐd•ή M?ΐ]ͺ#$ΞF/\ A"ηgJΥ<ΜwΝ5ςl`žoξBRΈ ˜½�ΊΆkXΘς3ΐ'j˜#ξY@ψΩ"|υί|5ά~o‚ "δΖjDΓΜΝT˜›œ kψK€9g]γKȊfπaήΧrρ9«½EφΛο̘'!irŒ}ΰOΠv VHVir‘“(ΦP/\L†SŽ©Ι:?ΖXοsοΉΠ?Πp"‹0/’E™V’1 >ςϊxύ’IΌ@T¬a:4π—°«Š]]J˜§GŽ7 Ο1Uv,°€ ’ή'£ς€=I1Ύ?σ{ @š) Y>ςΡΒΉσηΓΝ›a,‚οS@ΥωπΦ›oPοu €Ρ|�ˆΟ�”Q’Tσ'ΗpΒά©†\(E#uΈ—ΆμŒύ‰ύL‰»Š/3Υ±› {¬-tk―* Ά™šΞ¦ž±7on 7_œ -ύƒφ�₯t%λ SC?=ͺΏX“ ν]*”% `�_b›±Υ‘ž�“T;Ά>,-C ΐ|ΫρaU*θ�ΥKanvΕjžnQά―Ρ+α„ιΟ#kτ-ΑcΑs½iΞ`Κ~ΟπγOCWΘ‘ �kδςhΨ„ŒΈ{ηNψTΫ'#ωη>α|Π,Ψ5Τvˆ@IDAT "’‚œχ €XsLM %cϊs=¬›RζAχ”R-žg”άΏσ0Όφ s9Ξ!T& _{ύuˆιKα…<»”'΅BόxŒ5�» \’D²@EA€‹σ/Γ<^‚΄φΩ_‹Γ²Ά5”RL¬πΑ矏%_ώϊ+œWeάGNΩVyn%™0s6’jΫ„˜έΜ‘ά“”Θq^ *ΗΠgeγ₯ nb+‰na’5Οϊυy y.‰κβ―«C‘qsβFΐž™GiPΕ\:Νγ'Β'δπž`gdύSžΔiŒ’9€ΏΤΗ`7*\Xγ(ΊL”q?,Α³λΔ)Uq–?U«�β>ρxœ=δ$\†dΫbΩ.΅Ι±*9€Pο ££—“Txω7�y֚₯]ΜΰΣpαβΰΫW�Žώδσw�ΫW^jJ�pB=WόϋΞίίωλ?ϋ�~[ψ�0…ψ�@Aqπ]�ΒώE]{ξΎπ¨(ς­ΦΦΦqΜ�ΞιOS? TΚγ2gΎΐ™ίμ˜Α°F‰“ρTŽΩAkμΟΪ7&π) 0αtt+5υ=γΊζ‚>²AΓCƒ<˜―Εͺγ3ΚQŒ…woΌM˜T ψp—HBDP›‘²DAΑ.™ή-pn‚F φ±Ϋ€δαƒqj‚ΗΒ:Y΄‰‰)ή³ Θ€₯ζRf1” š_”*’"‚ΐήL²Α�ΪΒ\Ηφ’ΎqνZZέ]έΡκ«_ώbτhάμ,QI@o°RΐŸ™‘‚rAzM}ί“ι!ΐι¦�»…,λ.„’SεŸD8wq¦·5�Ζκ­•όb4~”8©Β|ΚΧΆχZσ‹œZΣ=ΖΒZjΗΑ ο0kϋΚCˆšΞΑ!€O&Μݝβθ8S�ΚιqQ+T†^€g 5­zX«i―ν΅ΩΉ˜i5ƒ~σνw L( ¬€ ΰιύ­ρ[;΅ό{dmΙvE@ΥΜ^�|Υ%kkσFa!ΨJXνŠ!(οnjνΥ0*γΌ¦L”Τγ6aH&6KΝφΞΥ9ΖC‰Z‚ЁσΓΌŽ2ˆudΨ�3! ,I(˜kBΆFΆs{ki}5Η₯Τ•(«=I2Žά“3`@ΙψN=€�uβԊ>J8‰2ζty’@=½ Ύψ9ΧΞηHTμΦΥ`ζΗ+cT‘‘ξθδΊ‹q?oδ^€Y‘n­£υΒTD˜εΛμB�Ν}©#kΥ ’ ₯‰Œκ­w�Εut ‰±CΩΓ*s΅ jFΩ€’z;fh΄Y‚‹Ί�ξr²‰š‚mPS.pΘ#§.#sΟ b6Έ”ΰ_ΓΒ-H­Ψ²Œσ6`Ξ1o*Ι– ρ8`žqο”λ[oΑ8€PcUΚωKœp­εκΉξ]g‘Μ€@R$˜�D)ΰυf!>MFCηFΓ΅oƒ{m»2Iΐ˜j.FΔϊί[7o‡;οέ‰κ„]^·H ςsΥ τ‚M % T•θΏ!Ω’T;vdLΫs^€ ‰=Ab;Oβu G1EΤ?ϋάsψ«<ϊϊzQ’|ψT9Oχ“dε7ψK0ΗD©³N&ω„Ή‘A` ΠηόΪCώοy”³ŸY6SιΉΞΛ ^![”ŠsRŒ+*ΐfΔΨ€‹κ A η.‰sΜΟμ-/˜�[ΐΜ¨{b)γ©‹�πΆ’³ΰςε+Φ' wΓγϋ·ρ―Ψ Χ‡ κΒqŌjˆ­9ήƒ!l3@’�»·μ`θΗZΫ§#DχΆ΅“Ά«HxjΉχIΜ"c–›ω-9kΦ›IP#ƒΑΫή&^$ά§,ηiYSΟP/*Ί°ΗΪ΅˜M€­³ —1 Σtΰeq€ΧLrΛϋ·»ΉΚβz˜“Υ”ΑeΘΪς^IG―Ϋ²ͺ}ˆ >%χ™?UψiΔL?D„νiέKά3œ[zAhΆkW–}Θί}HQ?oγ:kϋw˜«ξγ] 'ΜΥrufŠ9„΅F†ωΎ:7%δφ\IžrL|I:³ΜŒ > \7ίqQlPφΐνŒ >Α½5Ϋ-y=M)š.ͺ νά²ρ§,]oΧ“|TH0ϊ½€€»λCSά9Ζ>d{9sy’h‹}Vγ]Χ „η༎ΦrΟΞjž–½X&£z ��MΗν‰K—!>«Β€ΈγμΎ³Γ\ά†Δi‡<ΰύšCςhŒΘωμPιM ™Χο“r’]v|iDεyS>h9Δ$‰έœ7;ά‹©ωΏυy°ˆί柬Yήΐ~YŽ’ηˆ±ΑυWb‹^I?;ΕΎ˜Ν¨j‘€WΒuε ξ©ϋ¬%2œ›% Ϋ–…’5œ*ΧGι"sB՜%U–‘δH ¨ͺPiζη»nMhXbΉ€Œ?,ς%β«½χ$ TgΕ�*¨΅|&IBޘ‰A@t}'6Σ&°j#ψliG*Op18Ψk. ‚Φ6‘γσ ή4ΝΟΜΕ K $8΄j4…‹#ξύ›˜εό[4L‚@“αύΔh<τsd.cΆJi�-»lΑ”B=‘Ω8LKΔ^Ϊ:»ΗL.ΐLWs"0E‚ΐΙǏΉι§χΙΒm΄GΙϊ›οD·ϊ*�iƒŒL±΅”ΨΆύς\4Α«€PHb2θ˜(–!!�oHQ6π f4Λ©Χ7π;\$‚ΗΤeZ—―ΤΡμΰ!ANΩ/[d:ώ]Κ’�|_ψήΟ|TQ¬Σι`kΣΤ««8ϋ»Ÿ2n €ΡnεΕ©E‚ȝP Π¨mθ0Φ­””ΤwΥ‡nΡ;Qη• h^OpՐ4y€π^χΩ·"Ξσp₯€5άΊσ7]Ύx―‡.Z*NaΐF‰Ϊ6�ƒ1ΞZFPΖ± |U`œ2FΚ^5½, Ÿς9Ά_γ@dΡŒ7/RόC€QŽρh¬£•Ÿ›'CZK›*ΝΈΜΨο“Α\ζ˜χ�;‹φ“Xμ*N™+ut<Θ!=]^€ΏϋF@Oΰhέ­―υΏu¨@6ΘΆmmΨσpΜΉ‰’³ͺ0ΠΥ8Φ6,:@ΩY�¬£ΖžΗdμu»·ϊD…@ͺͺΊ>ΔυγΚ·•.›₯Λrm**λψžΐvϋΌKF5Ί`‹Ϊπ[ο½ΰ9ζύΆ\£Ζΐ¬ΜΫΉT g§1^"5€χ:#AW†yJJ>C^,c &P°#Γ?Ks½kΤzd[Pος:eιΙJ€ „Č’πδ™ΏEΜοTGό¬š6qmέ}1€6γkϋOΘΔv­υ7€ΟπΩ€&Νΰͺ jM^·Χράσ ΗξθΒλ“Λ *Ι,[œ!K:5kύ½Ϋwιr1ηŠ?ϊ+ ΚYΧΞ›2ώV] ?ή�Q#i’9[0ΰ<Λ±†m XΒυΨαΔ/₯dy@»#~Ž`ͺ―·—΅AΩ[P9ζμμΤ-5Q*Β΅ς™Ν ­! !XΔΉJΔ(ε>:€HBy’1)GΔ1�'\Χ³Rzυ­ ΟAl•CτΥΣ²/Ιߚ0Φ”,7:βυΏ<„X’k2s\ pQ‘$σ$сέBθκξ\―‡o}νεΠ38UV« 1DœU,Ϊ4@so‡ύ‹,Ώ&‘ff]χ*ΌŽY«Œύrμ²*)Ε<*¬†Έ·Π%‘‚2₯ˆ»D“2ή#GΓη―°nΦΒj'δ)Κ€}Φ_vŸ½Boey:zθΡΒΪ4›»85EIϋσ< ™¨"Con^xpο}VX�Ζ&+f¨b2Ψ±±Νδσι8ΑΥG_†Δ!Ο–<~d‚έΟφψ°νxž¬¬P \Α<Ι³Ž$5₯–YYζΉη“…<Κ2gŠΈ'5u- Μ©Ψ&²‘ΉJΞOΨs’Μ₯΄Ύ*΅ β’UΕdνυPQa"!ΓΎ' Γ½Ϋ•”ΐwess/r yž1Ž]Ο°M>»„ωYε} D ΉδsΕ�.’ͺb6ŸΟΡηERWζyRoϊΞ^+‹ΜY²ίόlμα£pcbœr³�[c`^Οr?uΏτoΎW΅b6ήΏ+ 0T¦π$βζ†-Q‘01)aΒz€ΈΫ]ί +ΘώΫPiuv‘Šb?’Ψ—ˆΆ¬BOŽ2ζžv €ΆΉŸ{,‚fω%,μbΣΧΫCYWάƒ|―@Z–²ώλΰ*)؏τ4‘‰ηΘ9ΧFSBU4d�9ž—Q…*Cc`χ£ΘΪ@̞ |ͺbSxJSΞVN›B‰6Iv=:4Α΄‹ΟiKΎά„2ά $s~Ά>ΤcAμ”ω!%aj‰'tφRή[ΟEΖΆͺ|Κ;Θ]ζ€j ύ1|H¬•PjΕΠpήωΈΗ₯άoxΏeo볐ΤΜ­C&BKgγ?ψρώO�υKŸύ?kΫώφkΟ}τά ™aΐΨΎ #π§=βΰOϋŽ�ηz~ξeο—ώΩoΜ}ώσ�$ύ[ΏσιΧΏώςΠζϊΪSΤς&€Φ’¨δj&–G‹>d%”Ύ/±ΤDN©cμ™L iΦ`hx8<υμ3daι ¬u‘Φ1Ϊϊu_»CXO¦³œΜυ’Η¨^`΄]Ά'Σ0ΚlqS \Μ©.0@‰.κ όیΑͺ`�ΐΔј-DβΚ§ρ^2΅/³―λˆc+D ?[.Z+°�(±•:Ϊz8%�f†ΛBO>υ\τB0ψήΒΔq‹l‰ύœk[ψtu€PQnkΆΤ ‡ΈΩζ2ώz_{νε˜ ΦΨ¬†lžΩΚ]2΅¦%Y^»6=Ί;ΑgŒA<Τ6ά6₯mΟ¨ι$ε%3ο^ΦtB�Ψς―2ann†`9 ώΌ7 €¬θ*�τχ…η?τa˜$θοΚχi•Up3σ>₯*1T#pΧδ1 Ψ7@έ#(΅Ν§ΊΉfœfΖT$VsH^5 ΤXm{e…{Ε±²#—ždόP›LOEωp%ΧέH›In8J #£Ρ*Z$ΩΈ#Μ=& [Γ½`žœr[l¬ .4L\ί\γ=?ƒGΛjκYO­‘εsjΙ<%ΜΪΖN1–BεΛh5Ψžϊΐ•05~›ο³tpx"‘;”έTVΡ'ς`C j¦bXΒk!ΛΉUΪͺPc(>βφ΅χ~ξ‘1έ₯δC�₯ΛΟr>Τ'1K—aœrΣνΚ΄+˜ϊ$Μή£IQoά=2J»½κ0=»Θ½?ΛΎιΰ-`ΐ2Ξ²—Δηι|ŸγΊͺθΊΑK ΐδΉ·'K€X$9ΐΩΡΔ¦iΐέ1ΔE ΐ „yν«ΐh�„ ,ψ'šZ�mνs†l€ή&O>χA¦x)φ»ΌΆ²g°˜ŒuΙΎ ε@ ΝKΝΘΟΞL†»οΌ³–‚€=@Ι:eyΐžͺA$ΈH ³)If/`!'8Ÿ(Ι]%˜+IΦ3(„Ώ©‰‡QΠ±ΈŒϊs²Γ�ΓώώώΠΑψ«*š\™žGφ�πή}ήGέ>ΔB’ξγ2?ΧωΜqlύv(ΥX2*ςωΆœ=Dν!ΑSCfήv¨Jΰ¨jZέt5ˆsœύLU•χβ”σtœNβΏqšΊ’αZ”okΩΨάΐo€ΣŽ«ΜUη‡FPΌgό, ΫζΨdssΘφOQ$˜ίϊp*wπΚh`fάώŒ_λu‰Œ{FŸϊVζ€Nς@Ά0Ώ‚)ν.`žμ7ηaŸω2�ΙV˜'y 8!œ[,bφσσQrΎ>?Μ9;BhV˜dν–σ' ΄<'M›ίͺš²Κ΄Je\(ΧΚc”YTJ ?sc‡Φv'¬ΝΣ ΜF½–hp %A­ακ*₯EvN8dOZηίYʍlךgέψG₯“]LΩ•Ή31’J­\C<•Y($d:zϋ˜ΧΈΫqΖωœeŸ�αgΝŒyS}₯yΦ™KBΟ›rΘB›[((x½„Šή;vWiλn£Ό­²…½{œaL0r¨Ε̚λm`Λ]³βŽέ†T΄1(―€€δχIΖs#ΐ}”p'Ζ<’h[ΨΓqXσEμ“Œ#ŸΔV{Ηη>ς’¨πΉΟ5«ΜQ=0=3nί½Ξ Δr„•₯Υ°Ν#ή€Tf|r2΄ΡΖύTUNΖ="cž{ψpόaόΉΟZο±€\Ό|�Ο\η©{€eΆ(A8dŽΩ%¦žgx'ε€uΜω¨ΰTUOHJφ'Τ- ˆΐ›σW1ΐncI€{šδ–χΝΑΡΓ isfrŒ§ϋ΄ͺΝQ±L‰1QuT yξΪ9‘L‘Ψαί�οΧ&1ηϋ|ήKP°ϊv]ρ<μΐc·iκgJθKΞς”\{|–„‘τ €ΐδχ7Wy8μθιΊφδsOόΤΟόΪ―όΤ‡>ώ#ο}ξsΏϊ«/yi…―ΒFΰΟΘˆƒ?#7’pώG೟ύlώιη―ήZš™\έK―vσ0₯\Q²„šek}\ψG@TΕΓ[i½ΰEΖ^@`‰B- ΜώίΦπf Oyx·R/ΨNF.M6Η¬ζϋψ£ΗdΞφ£ςΐ΅ε ΆŽςAo€`¦Dΰb‰„έμUξ{ Ά%|π{<³Κ�='³;§Έ'λβ ήΜ ή ΔxQ¬1φά%$jB#κuό+ΘζηΆu+'xάΤ¬jη Τ6Ι€Ω ΒVb\ΗJ$­ΙΉpŽσ$ΣGϊs`h(Œ\%@m /]αΤerΚ’Ÿ~αΕ03ρ(άο²^Ϊ Hο.4{σ<D”ŒΫ_{i~ΪΡWŸy°VK»ͺ9HH2!’r;L-ΰSq€„³„ΰΌΆ½†�ΖΠΩΣ(‘O7γWΙ½Ι9Φ”Fθήέ I’l~jβ>ςώΘ‹Œ,/D�b—¬Z­eΤQ/Ο>Š ti~*άΉy2•0υπ!Α.�ά� Y!¦ γŸ³Hz%, αζ1֐3d+“ά]ηOA€΅²ώ2ΞΫց)‚ΖR€I€P]PY“ —žx&tυφ‡ρ»·P¬Δ9ΠΨ˜¬ @5αάA-qHp*YYX,œ;Μ fόqQη\μnεΔΦ©Kf˜•Rv�ϊΰβFβ@€zΘ`fφO¨•¦½!ή½Γ΄SΌΆ–§ιΡK" 4 Ύ ώέ»bfŠ,* \r₯΅«;‚3τͺc.=υ4χ )9s΄\β @44|1*Xφ TœζΚ ΉR�!ζh2Ξc@‘JκwO p�Ηv­8’–U „$ˆjηc˜A―sΫy­ΟΘ)Η¬₯Θζi²—‡ΐ³¦ί9-i`†�ˆγ©*°έœ&Ža’3�GΧWόβο¨φTς3nΜ|@cΝ±Ϋ;{hΧχdψκ| ° 9Γ=:k₯ˆ³:F“;€ΙMΘɎ4ʏ…ι Ξ%Kvx•¬λz¬?B| (:⏠7'°fέqή Ιθ!Ν<½¦S@\ η[ D*Έ―5\G9k’˜5€ό?’3“ΣαέwπΏo~σUσ:kΎœ2«^²η^κ•ΩK EŒνZ#V@˜”pύƒ6š°ξρ>PaΜ`jFhΛΖΌ{DEη47;Š>iΚ0low“Ι@Έ2ow «ΦΚ!Nπ)Ž 1‘fΧ³NŸ₯.½Β΅―‰9σ8³΅Šψ‰kŒŸΚ�K$—ά%έ+7ρA°5¦s'ξ―½‘TLo�C*°Qri`™e-J<΅υ„‘KΆp­gο•Δ¦ά‚΅’ηM/†jΊJˆέ}ž[ϊ2HμBΟ²Άi Ϊ\Cg‹μwΕafz*ΦΑ'xΦΨeΕ�ξϊxΔ|e1ΜηNŠυeiT‚s‡W‡„„PΩD]±ƒ�ƒ±ΉzεJΨ„ϊΦΫ7)1h‘ΎΏž+IΊΖΞ’τρyΗyΪ=ΐs¨CιvΔ5ZŠ0ΒΌ/ŠΟHξ v˜˜a>ͺ|‘xjn’%―ογY§bKoχΑj”II0ˆΎu `π3ξŽρλ»380Θσ€9L?žS< U+€!O$,υςΡ�‚‘δΟZœ{ž�)₯�ΥΥ”Z€Βέ/| 3ύ‡ΧBRπ^“ *G�μm‘PƒρΩπΎβΒ€CΥ‘”agY£š±ΎŸlP΅$ 9"‘kΥ₯λί²DοοKρlŽδ8σ,ƒρŒ>,λ”5Χx�$½υΫp Gψ„μ/oβӟώϋ�ΰ§�Ρ�\ΦπcoτχΧβΚω#Sψ*Œ@aώ¬@8ψ³vG ησηv”ΪύτO!ϋ΅ΧώΥݏ|ψΕ?˜ztχβξΖκω6�ω ”“]3#.Ψ–$π‘nφίnό" ˆ@’a ύ˜ H σΑN€ΈΊζ+ŸJ²;k«λd_’ⱓ@ɚEAμBP`0OfU€ζˆ«žŒ� †Μ4H\(IUŽXM$­ΓΈ™PƒΫ}YΟhΰΑ›c†Ι¬ α7YU‚Š MΞ€ΦqŽ~x�~τ^PΚ]CφW‡vKfgΊΖ#s4 Υ‘½ Pa· ύμ)}Bζ³…Φ]FΟs>f„‹θ-aζρX%ƒ>rώ΅ή7Β­·―‡w―ΏEΜX%hδb–±Β₯g`0’.{$E|ΎΩMΑ™™8kC­Σ="ΐέ%πΙ ΩvκΨq¬w`dvώκ@½�zP²–Ζο(T ‹3j–}бwά‘ν9θƒρZδWρ Hc 6ϋ˜.σ“x H–ͺΜ2EΫ2-‘Λ’%KeΊd‰"Λ ‰° ;i'χLOηœΟι“ϊ΄Ώ§‰ΏAΨέΣ@οΜt8η}ŸτήΧu_χusdS!₯τ§hc]˜νbιΐͺΨ#yΖJcΘ,DΠθΨλ>ήώώŸ°­PL°^5`;Dz­δΫί«³¦³Œ7Γά"w—8`~ θσ¨4UP˜]¬£4pOΖ6y–Z˜ �Κμ©YΌξ>T*€Ϊ*κ‰ /Ν ΗL-― nδz©£&“hŸŒψηξΦZ$¬V2,θΡΕΧΰΖβ$m]ΗύuϊΓ'ήψ‰0ΏH ΐ£ϋdυΞ)Ρ(q}²εm4Ύ?9ͺγΔΟΧ¨“ήΫ\'PΗΫ@”HОƒΘύH™ζEo±v–†”‚Οή0ό Φϋ½ΗHΞOK’‚Ζ“ΥΪΩ‡ Κ_N8o6ΨΣ·πƒπ>{ny~!’‚k‹σ}ΩΠ܎Bςμm>ΐsΆqΆι΄ˆNχ²I’ΎύΔΤχъAΰ2οaιωĞνΒΏ"ρ΄ˆΩ€·’*šAβm;9�} ˆ±£…ξ:€i>&ϊμmCAfͺbΰ:dψ'¦Ζ ψΨοœ―[ίό%8ύCl’AnγΜ˜œdΎPd‘Y†}›Ύ8Ζ(!²œhsc‰±μ +ΟQ° ¨TFπZ)qE²Ζέƒμ²Ρέ#ˆ±σg·Οj}`$δZ�t7ΰ θΟӁ‚Φ�-`5,Τΐς`‹. ˜]vδzρX krœDΣΒ4kΩ5οΎI1&vΝΙp=½¨ΨξάζΜmgM FRHί!- ‘”°Ε{βͺ”έlΎ-Gm/―qοt‘^RΥtˆϊK₯YMRA�:k΅ΐλ«J’΄.ϊβΎβ±ΒY»¦.AεQ&p>LŸC!Β~URƒŒ8VeWγ„‚tIs]ϋ”D2ƒ[ͺ‘@©·QΣΟ3<Δ˜Σ‰G€ϋδΡ#ΖEg};Ο“NΘΙEΧ©ΟΘX*ΘMp}�ωμiηάγG’bBΖs} γ_ΦέΩΡα02ΫiβιΣ§΄*< YΚ¬Y__¦ηω>­ΖΈW3}�υNα±ž>š ]gΞ‘#{OV¦ΐ±„3Κn HυCH0ΆΓ:c!Ad&° YtA»cιZ#�α\šyQ_b«« mP\@ζΜ5Τb–l{ /}κ'—Z¬-ΔΉ5“Ώ\Έ@6Ρ~ν›+σ€ιΆ0qώ`U ₯3-€ͺ4™ΎNˆ=¬Ϋ ³‚;.7faσ€ΗvΦΪδG CiGp‚ίdškf=ΕΉ|“μ` μ„υЏιdΰ`… ΊŒ±ά:&έψ1TΛ”Ϋΰυ`‹=ΫνzB±F›ΐΖρ²~Χ¬Χύ{·Ή&p§cΜ:έ$ζ‚Aψ”ο$4*¬ΰφέΥ[“£#1 ΆΔFPQ„piƒ@r\4ν³~YௌΊ³Βi|(ΦxΫρΰ˜{g #¨°Οό±ς`ζ! ΄LΖς Υ=v>qŸ�°ΝDs5ρ5$40ΝΔ,¦©Cήr§?\Ώρ*δΦXψ“―�1%”Αp JDHΤTQghr§s½1Ύueάλͺ#\χ’yΦϋ ΎyΐFP! J’Κ Ω‰Γ(fžQ7˜ρΞπ‚ΦT„C›ύΈ­[RPƒŒρbΑqΌ•ΟomΠaƒ}㞞šœŽ€» Q¦Α)0!Γ�UlΐšaŸKZξ’Zeνkκ/Πƚ«1‘ύ΄–fοr†XŽqˆΙšν χλšyfρ�Θp6ꃑԻ5ΟΖ‚­€ιΔ]9OΒ ͺjΖkθΪΥK±$Οη₯xvψˆ?ψν}ΖVTΥͺΙ$ε%e$bU)h~ΈŒ―ΚzΦ_Γ½IYbŸ―z³˜HΨλΫ³�œiϊ>pDρŒ#ΑΐΉklP†Dτμ†bGίΣcERΕg΄Οl‰Ό�ΑkΡΟH³ΡΚ}/i_^2žyρ/ΠΌžž{>gβYβ Bn˜xΠη&ΓX™ŒΠλA5‹J„Ψ*’B’@Υΰ©±3η₯a9ΘkJΗ^ΊrεΑ/ύωΏπΌ~ΌyηΧ�ώομ7½ ψζGs~„G IόONσ�>Ί#πζ›ΏΥψ—_ϋΣG_ό…oΎΏγ;Έ~oVJϋ‰Ξlj|τL/ 7 Μt€Η½šLZ;FRE‚ύz½ϋ½*ΩΎ* €@¦ΦžF‰9ώ fρzQŒNPJ�΅»ΉI§dΕ'¨�ž€]9·™�uΚ.2(ς…”+,–˜φP°»ΎΎϋ­o’‘Ε m@SQVΰέ#SY† °G€Ω5€ΜΰO9y΅’"ƒl7κΑ„-Ξΐ_!ΓίΫPXΓNJ8f"[Ϋ‹7ι<$ OσEΥ-έύHžΙξ/<£!ϊF' ¨ςt₯X_|)ŒΝ\χοΌ¦ΘφCΰ¬..„VH(γλVΐ€`γ€:λ ͺέ% ΌΔ±q-ψfΤω-Ξ/’mΆ“WLφBšΰž¬κΑ‘νΎ;Μ%ϋϋ»Γ+?φΉ0sιzxςπΦ©©―›κ’ΝfšΆ–ΜYh» $X{ϊzX“νϊφ{!\³‡x7τΞ°¬Γ΅ ˆΐŠƒ_%ˆ…ά0λ ‘ν/PΕqΜ8�γžϋ³|$B7ΰ>ƒirΰƒΙ25Χ€ΥΨ—m°^™<Ύƒd‹• Σόl­†ΒΉ κ˜6ΐaμЁR<@ŸΔΪΒm‚ƒ£γ8<$vv­Υ/α^―μΌX¨@φmν”"”JuΠrξ*²�±p‹Μώ*e3μ›V|"ZΣ2N�’Fͺ{$ͺdw» )ZΉΞD‚―36ΪeδΜ>r�ΩN³ΟdšI&…l/YA}<X�5ΐO;_γςC'昝:‹ŒεΘΐBH%!Ή^εγE:%ΈΧά―ιv\Տ8 ,wΈqγ% W?λμ‘#9›Hϋ)uHr=9Φlwg*z~1·«ρz(ΊγcΑxeΙLΏtγeΦή/,pΛvάΜkŠ�“ZΡΜ*>d»a#„d€! Μ|ΆNιŒΠ?=FwЁπ™ΧoH΅ωΠ^Α`Ze―.o Πΰ}wΈŸζS•ΞϋΥμξ 덚2H#€ψάη½{!�0σ佩΄8-©DR, κδΌN°9̊λ»"ͺAڜ°'ӜιΩ\+`:^ϋΜ'ΓΥ^„,¨„Ϋ¨cŽ¨έ―“εoΰ±ΰΌxη …29JΦθΈρW+γ’ίՎ!.†zξ!ήC ΈΆς(ξ…4ΔΒΦgRi'*ž²Œ›ΫkyΞlΞβ–=Θ²γψPŠ₯dΌ…?k€σ*?§ΗσQ%O‰1ΤTTΟΏ――`ίͺdΓΜ…«ΡXΆ…½$QVαΉ²IƁ±i:g 4‚Μ‹Οφi‚½§JΜκΓ.T)E2s/aήA΄††Ύ;¨e\ϋ”.=|ψ΅Ζ:%/œγ\‚½£qͺΔε1Ο$"*β,Π(pRΣLΎλEχcΒ¨ ϋpŸδωΨ ΓΏΆ΄žΞΞ‘–ΑΗ†gΠπψΈ―Ξ=ϊ\ΓsΕ„ηˆͺηQԝ„œjg]΄2F›¬ΏIH iΫωͺ8(ΡbPsDύDζ–ζ(γ:Œκ Ÿ·’μͺŠξ=‰…}žmyΚiά³–ΝI|n’jΨΩ¬†=žSfμ5XΤKF ίΔΛ&d—$‡ ά}"©έFœP£›$ΐ.ο±ΛΉίΙsxŒΞz"δ!VQ ’8ΰ¦8 ^<7C;Υ3π^tKyιΈήλœ�{―Ε΅’γg$FL>Ψ:ΦN*±BˆjΛ8˜-ε –Nπ΄O£xπυόΎ„b³ΰΦl"ΌψΒΜύ_ύ~υ?Ε$ς;{‡΅ΎΑΙ½&qΰ@5?š#π£;Ζ͏ζ4GΰίΒΐΪέψx}ψ•““Ώυή{οwΎϋΝ―�―tAψ™Nπyo:—2xL8Ώ0σc‘c΅oώι·Β»ο|—ΰaG6˜μ�.-ΒJcγc€γSΩιK/έίψΖΧΙ¨“₯XθDmРȌΜ\£$= μomΦΐ@Ι DΙͺ-c™ΏK€k=ΝV΄G“8‚A36±ΔΔ%'€GdˆKτ©΄δHF€‰βŸέρ֜kθ–6‹L0”¦.·…Lηt?YθV@‹Ωΐ‰ c€f¦xcy o€…Πsa*τ’L]y!ά›{v«Ό'’X.!Υb–ΧΖ°ΜlT ‚ΐ`ΨΐΣ,»=€§)ΟΈ‹Τϊ& ‰Ίwο“²Κ„φBηrω]‚ζ ™:{6zAό(-’-«aΥ){ I€ση>uζΦΐ α‰‰C&ΥΊaAMŽΆsf›“ΘζU@Ψ_^‰m¦`ώY.νΆΆyo; 9„T!«o_s³yΦ�ΧΈF»o€xm[–ΚΘΖ‰Τ̐iŽΛ8˜ΛEb‡ξ+ΝΧ; ΰ/_ΏK™γ3O>Έƒ¬έ22¨ψObΐ§EΩΏ1»-hώΥΣ3Φ—"IafΞ Ί\γ}YΖ:ž»~\c'fθ °•fμT08–T(E>`ΪAMρμήΓ¨ΨP@ό@a"<½χ7y93MK²· μΙ&sŸiΛ()pρ8~ȁΪ9Ž\ž ž>Ϋ€ϊρσηc`šB¦­D’e+ΉvP›1ƒMπΛΖΎζ]΄ΚtUψ5ΥΑ=H΅}}°λ―/ρΎνίkΕ°ΑόY£ή ΑΒq²Τ¬Νΐ¦z ,‰5V¦ώ»Jύ½dB�O#> 43r*em¦?ρ-ρΆψΟΣΙc’u§rδΜ>€ό2‹hέΏΚ”›οΎ}1μ‹žƒψΘR7]"SΛ˜;Ɉ�ΝΊγ.7k“U$”RKΚΉ7¬ΙΎΛh4Κ4KΫžn@Ž1yqΎμκ’Q[ΓΚ6φz+χΤ`N²ϊ{ΰ’ίΚΊΜv9­�±¨ΑHB:VΚΫ±|‘ωL“•ΦΌTUS9ώφζ χ.™Bωuχ ΤAώΫΜd‚ο˜l½¦ι[zΪ™ƒrΖ-ŚΦίepofφ“BΟE?”�ΫύΒ%)ξ1Ιωg«QMθvv4=dΉ7³ρGR~χOώ8δNΈVΞ΄”‰σΓ^υa¨>Α(pŸ5Ev΄~}ΖμfΫ€ XYX€ΠΊΜ5Rφ„RΗqΙ&;cƒ”``8‰|ίΨdί3ΞΣν0ήyŠ’…9<08mπ:ͺ]*μ+ O»(M*`Vͺ)^‹�Ξ™U…08ͺ“yF‘a,ι  ‚dhϊγŠ’€μ8nσ(sΖkΚUhRˆ" eκ­d+νώπr(A‚¬={Ζ._ƒŒ�wΛLjd€XΊΰώv=Ίo•™{φΫN/ΙάIvA‚,>|ΘxγQp¬ΚΜ8ίλ„νλν ί}+μ±W:»&)/ΒΜ–ύΥI}ΎεrΛϟѾvŒΧΐ‘Ή‹:μ%ύXΠ‡„χοΜRΞΑ>¬#³‡ψ,CRž0φ˜²0Βdͺώ0:ϋ«Œͺ”iνΙώΞ�ͺTεN₯|YB ηJdκ+J.GœUΞy3ι©δu²λJ‘·•ψ�mE#9ΝΗ¨ —_¦ $Δ>Žςη―\§}αU²–­8€“Ρ4σΜkεκ²Νš*-W[η3–yI~tχτ1Vλαζ{ο‘Y_Š-Ν~ΩήΟ~αφhqF‰eYΛ@©₯ ­ά{‘r‹δ ηyv²Ž<&KΦmqξYΜβ ΰ[kn΅―”Ί^ΗU3PόŽ2�VJJΊ ύΤΐχ1§ΫΤό?…}!Π'ΐˆΈš`‘y’,CΩ©-ϋN0¨σZ•΄V4°c{‘τ[γ­I₯9RdΞ2nΒυ4`γσ?ϋη1»n}�OΓθΩσΈM„ο}γkaί…AžŽΨkd³‹OρηxaξΑ}Ζ`Df퐡Pδώ—ΧΘZrοό\Šχ΅τΔ2–d„ςX3‡ͺWΊ‘ΕW@;1Ϋ¨ό·B0·ΛΌ­Ο/JΘ€‘οΘγ~ί7LL†Žuζ½ z™ΛS‰/Α4χ+Tzny†΅ΜΫΌώ:Fde^§ ψΩαu‹;ΪBΤuΏΓ°’ ζ~Ά;ή–8 PZ“X. SΖ¬�,πg λ ―kΧC‰r!I ΆU”‹ο²VΆ1άίeύzNpΘδKd£λ$φτ1o£ƒ1Ώ”΅@J>2ΗψQβΡ ©»Ι™₯AηΘτ(χOu·΅‰%{ζ‘ωfόψ,a*Χωpfdš‡aααƒΠΒ8n,Ξ“$g½3ζΚΎχ˜c3ΫvzΙ˜=§lΫ?Β8ωA†BΜξ―EΒύ·½Ί@7™™0Θ:Σ ags rt‚ =χΗυ΄γ{’dΏj*Q Άύήg’Ωg½"‘άkΎ+™«ΤήμΆ ž…uΘΐ:ΰ·β ‚š’ΘkφAξͺ²9,ƒDSΕsΒλ¨8qmξο�s±Žy­ƒ½­ΈΧΨSG(’(γ$‹}iτK™³δ#gΟ…iΐόθδνӌΟ"W@gݚι?AYU&»ή†oƒf“*Ή”ΠCρzϊΏH€κΘΑkO�œVξΕ¨(C–‡!₯x+χŠ™-κ5ΖΑ²0Χ—^žυηΨzM*P4_ΥlP#Y}K,‹YρΉ ο³�1ψΔ«―P&x™uY‹ώ –Ω΅¨’Δ–žaͺƒr ± {½‹—#/”B/σl;„‘΄'ˆ$b$-Έ6Χ­žz ¨΄²δarηϊΥ™πσ?χωπ*ΊΛΞΗgυwίz'* Ulnb”Κώμ(/’‘bl«ΜZΣ3Αη΄έ|,uς|r,,Ϋp|,”ΘτΌςš$Ό[#{ΦI.δ!I»Q†ιΝΰϊυ:kΜΏ~z/¨Ž΄4*Ί(‰z¬„ΩθΪς�]8ξwχw�™υI͏ζ4GΰC0MβΰC0IΝKόψŒΐ?ύύ΅v㍟|ηόKŸΈ��θούρgΏτΣ�ΟΓO~ρo~kcyα‹W.^lϋόΟ~9|ζs.\ ›°³ρ<,Ξή oίKn§ϊ-θ.Α„Y2%…%Yj°(Y`ΰILDPH@HpΠ Qaΰοψ3A ”όμ @²vXΙ¨’δœΜ΄˜5ρίΊF€i”δ{f Pυj°ύ—ΐΕΧPVn₯Aš`Λ Ό‚\t#,,>?•ΌCFDŒηTR¬αz~ŒVWΓΠΨd˜:)‚^Ι€Ξ^z„σ;G"JΊPQ΄Ž”²Τ λŠοϋ4:Ζ½'d%%‹:P(h:iϋ?ϋ¦[z‘7€'R dx Lέ&ΞMF’ΑϋωΩGx*,„²ŽζχY;‚?^‚Œ[ƒ.gΘ~ϐuŽrνθIQ,Φpnί'Έ΄dΔ`\§pƒlBΝ(₯–4hQφk€iKOjΤ·£Ž�|β\KJ₯SvOΘ"ŎA5-3uίX¦"ι‚gj‘²» ψr —xξ«ΜX•»λ΄ΏΟά.Bz$ΙΨ₯W’VS“ηΒλ―�xτ°c‡šy3y'ǚ*δ΄UΪ¨u²& �p··ή֌ύc€άH²qΚ_μ Pβ^ΛqؐD`nΉY³c3―”3θΗPAI`ω‚Άζ°’£� ΅Ρ5‡—²βvΊž GΣΖγk  β Φm!ΨΙώ[\x•8–₯θ£ΰ?4Ι”‹έ)XŸΆ5έc-)Φœz" Iζ\ς&q%°7ψψ΄!›H°ψέήCŁκAZ‚ϋ΅sE•9°l€…Ε•žώ,˜“=@ސΎ ιcέϋ Ί|εΧ‡΄"5G•ΐ1�χrlφy kΪφsxiL͜ΓTpœχ ν"€ΰΞζηΥJ‹Γ}Ν �Μ…=&0–@ΎFΨIYPwŸλ›υΓuνAfJ6Ω�џYz:\‰3’‚ DcΎ|Ά…Χ’½έΚs2χ΄€ςό%ΘΒ_»zŒ/Κ#^K+9Ά‹δ]B±…ύ΄Γωa‰@YχTAdσ»(ν) ρn`¬θ>³ ’ku0s”Ώ@XL_ΑŒ)ψ:­.π™‘δΖlmύ$‰οΚzΜφZΫ―‚AΕ•Šœ-Ϊ31.«¬υg (‘4/ΜAΠΉ"© ’Ζ²ƒ₯ω59ΰ|h”Μ;€-2vλτ=Σ4΅Λ£,Q‘¦$ά9Φ—Ζίλ=3ΒωΥ›Λ‹μ=Τhgg8Ή_Φ\k”²uͺͺ�Τγΐ֜f²5˜΄ΤgΒΦ=14e‰ θcH.{JlΩΫΟ>ΐlP΄©J’‹ύ3uξ<’w2�t{±b~{užίƒˆ©H’‰f½Hͺ©x9αlΤλ©α΅HμSϊ”θ —nΌrv­αΜX™η^’UHŠ-Θχ dN ‘΄˜”Φ8N˜'}VΜΘΫήW˜Κ•ΘΰX–x=†Ψˆ-;ΩΫλ¨Ζ,ΧΫgώgΝ†GOŸQ�C Χ΄ΕϊXίDeΒωοsn 2ΡόΏ\2 -YXaώέΓ)Ζδα£§α& ¬ϋ³ψ.”$*ΈξHϊ³7yo‰ΐؚ–uΞ?yžΫœ―�γNΌ ά�βϊ"Ωt8{α,ρyή�8δ#mέόhŽ@s~TF€‡2!ΥιΗΰΰu�§χονfίΎυ½w–ης5ΕΑσ―…/Œž―ύψO‡Gwή ίό�ΎΎφGί!Pξ§ζcC€•™ά(©'K₯έ wΉEωxΘ.NLOFΐ΅°0• ‚TeΗ‚Υm₯χ€S3Eΐ†€[δΟ+ŸΆ4Α Œ¨ΫΜD7’]Νμ”κ+#VέΰοΤ•ΘPΪνΑl‰€ΞΊG†}‡M@IDAT™ΑW A‹ƒTq‡>€Φπψ$ΰ{+fh^|ω±¬`#�ρΡι˜MΥaΎώ-2?εδ:2V²“o nHό·V Ξj:ˆ%²tυ°r€!3Tz"€Ι ώ0ƒBˆ³m!ΓΓ£aζ…«1Σ¬ΧƒA!‘¦ŒIˆ‘δξ:‚/-?fb²±Yΐ .μ—Ιtσ½#ƒcJJρΐZ ”ΙΩκ*…OΒC2“˜27νε #Ρϋa{2<-NΘΖ $3†1βšρ·Θ+7Φ(PPgK₯Ak�-\87ΖP,,―,„3gΆ+ρތίτθv¨Δ=›{Κxv„‹/½ζξά&=ψ`Nν�ƒ`Έ�ƒ·(’\£¨θΒ ―_%kΪΞ5)73ό§Y4. l(L=.$ΠA~½²Ή_'ώgpJ?'ο~οO’œ|˜V}ϊATΧΉ' >‹«{αΛΏτ₯0zξBψ�―ί'+1°Ρ’αž¦›νΛβ‘@ k«/ZΒ"έΏ 8ηπΑHw(78ΊˆΧ‘ ”¨τQǞ"`€¨vˆfo€³ULΣrΈωydηd—ΣfΜ,k1ΰ_AΡ‹2€C98λtΣΕ �σ—/P BΉΕΞjcMn²ώφ₯¬“�!λ›ωs~T\XΠ§Ί‡½₯rΗμΊ™~ƒsΥΙ>eΐ4(kΜά6Έoƒχ-HΊΣR*=΄ά‹ΪQΑmέEΆήΆkI€5o B± κ‡΅ν>΄…£ςαvΧ+Ώ Ω£€DΧ=fOZΧ�<Ω}χ/dΐμΓϋԐUΐ‚ή}iΜνJEΦ\Z…eΤ~Χw‘†'»hΥΙϋAπ΄ΰ§akΧ‘€«˜π=­Ξͺ²ΞΪΨCz$ �Rœ ή―u�ŽQ„LΎΆx-1ΎiL­Ή›˜Šγεz“Κς;›Λ“nΐι}©^2Sž'σ)Qt"IΙ>ιββ{vΑˆYS‘+χk‡„Σ€u2ρT[΅²Ξz ”;”;Tr”φτβ� ±y7τϊ12£”#Y˜‰�«Q₯Tc=NΠNrώρ|x~™ώ₯‹ΌLΩ£τ‘8Ω¦ƒΔΑ!jŠΧݍja™2ˆηV!1ΑΣYBΕΒ.λ…©€₯FGπyΪ>Βq~"ψC譒ɝΓS#μIZνΆΠ`r†5ΘΉΑΩZ€Τ½xωξp�cψcL…₯ΰ³ΛZEuψU‘%™ εUΑ@Ζ’Ο5―„��m‡χRf†½otβ‚Χί‡Tc~Πm Θ‘|©q‘6MwhG{‘Φ‘]œ špB$l¬π�yΦΟ%ηΖ�6ΟΨ Δ…ώ$9ˆC»DΕΣcΟ>ΩΓG£‚r#ΥΑΓ³γ˜ϋb,’g-'¨F€/Η=¦’‘ΜΤa£ 'hΌΆ6@p o›"ε>k,₯ETΌΟΜb;ϋΰH‹ˆΑΕ΅FXXYaΉpm*]˜W׌Fύ άω ”ρVθSƒΚηΖ{?xύ{n|βα<Κ�6JKα|&»Ζχ!<$σ-«adxλξΓ¨DΙxίψXΌFžgHg{ŽσA…š^ώN>L#ΠT|˜f«y­ΫψŸσ«ε/}χίτln,ώΉ=Œ½R­…)wL`*w–­ˆCτ#ΐ{7ςp2>˜¨u s·6±ΓμΏFQdk’΄ˆJ‰ΉuΠ}dΙΝlξ“E“0p3‹’‚’fI~‰M�ΜΪ›9πλ9δ£f<:”ΒΌؘa0 'ΕΨ,&Ι~ŒαVfkϋJτ]8@Φ½M†GΉ 3+(©ŽHR{¬ˆB2Ζύ…σd)ΘΊ ν‚²;82“Α h!ψzX΄mž�~κDΞFQ’μu[—|L½φΚ�bΜώ'ގ,u€Œ΅RR'Œ*ο™±FΗφh3η/„‚@Ϋ‚ϊ !4ΐ�˜ŒΧgόuVχŽΝ›α˜vσi‡‹ωΕ…hrΕ€aψw9L“ω³ωdΓ3[u)γ&0KΰY �=AVλ\†Θ±ζ6fɜί…`5a&ιk ΈE“@Ύž³…`Žy“―ΰsζ�%”˜ bήWηΎΏχξΧcvn„LδΦfi\Ώ}ξΫβ[ @-iQ†ίƒNΐ!χl°»ΐQZl­*LG4{l}ΚΘZΘΦ*3>€)?/²�ΰ ’£Ή~ IZΐΠƒ £%"ĎΌοQxpσϋ΄�DΦϚ¨T>(??ΔΕ]’λΚ‹Ά‡œ ψϋ�†l;DbM·)™eξ:ΛγρgX„˜!{ �†Ba›2Υ$1Ου›![|ΎH¦L‚ hsŽ„qJD€ϊΪg? y6…)%@ŽqΩX)χο!cέψb’£Ώ„Ry%Ήvαh@ 5 [ψι‘\KRPŒŽŽ²O:™―0F€g~ΞL^'kΧ�!ώ]IσθΔdcDό€©‚’ΐ¬j;λ^� ƒtχžέΪΛ­6ι ˜ϋ�"Ε―U0Ieύ “έbŸ DεK#�'€Ψ˜―Ipπ ά/{”Ok΄­/‘2±Mi"¨ phT€ίIŸ†ξ“Ύ―'hP΅±FUίηθβώ΄ η ―ΩžΒȍ½`'„ ηΒ κš6H™"{]Ε$€Ω}J¬GςύHΆ;»ΙŽ ‘Ωέ…δι` ˜Ω“ƒcΈρ P_ŽΏ5ϊ3W.³Ύΰd=}$ξ5΍2kΤΦ€‚ΑvHž4>rœG;œͺμ‘B½pΉ£ά½ΔXmo’ε)[η}LY Η«†Υg«Ό΅χΑHΉΓ YZ_k“>• C“gY‡Gΐεά“₯°{ΐ,°ϊsμΧYΪΚ‘8HνBΪJRXΦeV6Gω‰k^€+Έj i΄κ0λk` »J›2cΤΚ^mo)Bτqmœ )ΘΖν5²Τdκst₯8Ζ ²LI‹ XQ~ί0’&sC°v X[x‚κˆυΒλΨ…g{{%–―TΩ'ž·ω\?λ ?ŒVΦ£€jΜΦ·qξ’v°t%ΝΊmc}AΤIΩ:βehtˆaύsώ ¬3ΩVΞ²¦ •˜όrN±V m O¨Ήd¦3΄Bε«;xt²ry2φμIK!φ5εlgyE?Š-*Ζ§€Κ£λTY²ΈΊΆQ«•3XΟͺ π]ΘΖΧJAJφΥωY ΙΞ2%F ΖΥ9°ΫFD²PΒDObouc‹ύ©•dΠ!׏ ‡gΞ…Œ‚πc>ΊT―@ΈΜΟS©Υ�i“gΡ*ž±|€5~Œκ/Γ<μA&¬piζΑ}•g-iŠΨ α”„δY„¨hΑ(₯’ξ2jiq5tςήGψS²~λμΫΤͺ²|^KœXR`=lτάΟR“η¬νβ}κx΄CŽopŸ Ξτ<_b―½πκ Μ.|πδATdYƒEξM�}g,qΉΥΉΤψάτ™ήΰLη'ΈξvˆI|A8=›²<7Žy”S‰UQv?*ψμΰš«¨%(\μ�Š)h'ε ΜU!΄žOOύοώΛ_ϋ‹�g"1ΑΑΤόhŽ@s>l#Π$>l3ּޏη εϋΟ�Κ―lb66U-/TθuΏ2w—ΐ™μΑΒϋο}— ;nΰFQ ²&Ϋ”*Μ(ΰ•€l?CΦ”lvš lW/yΜ½Θ ”£y£zZjŽΰ(Άl$PΖ«ŒΪ–RΚ|ύSβΑO3˜M’“#zI…c�ΐΣ3g!5&cΠcpΆ΄Έ (# !πQF-‰$ψ‰2R2ΣΚΥ?σΩΟΗ2[Š΅·tύλ‰ΩΓ~d«Eœν zŸάΏKۯ՘u[˜%3 x[η΅―^{™ &ζήεηȎ‚ ¦½Η™‹—!CθWMΈ¨§‚¬²€J@fFΦϋLz―š6…^ό0΅�ε}{y=d ήF1άδ3OΥ|VB¦•ΐT‰fž,}Α½€@χμZkε‘­k&ΦΑ‘<΄Φm–r<ώΰ` ¨ °1ϋš t†x- ”fΎΆΦφ·]rCι»­ ι&΄₯£λV@kγƒ+ώLAΎh²826Α5ΒΛHΝΧΓ5ΙΕυυπδύwΒπΰ(ΰl;*<Ωxω#ΖΣ@ΠΜ¬΅ΧUξΉΒk_xω΅HΜ=}ΈΑπŠ:Υd»Χ• ›TzX›αυkdkŽ:`QoΛQ„7\kυ5ΚΌΧ EΆqΟίZΓ?ƒχVA° Ψ7ϋY’C…*Ž©™¦)ξέ΄­¦kΜN˜TœZŽQC"έEφ¬Δz:\΄f$“‰3Θ•sκΤΜ*S.ϊη)!+wLΰέΞθ$ΨžAΒώΚ+au{#|ύΫ_SdδΨΗ]’f” k7ΏΩϊpk‚yoύTΕ”x-.‰.HχΙ΄vξu|'\ŽdlĚ&˜8€C°ΈO$βτ&τX+ξJœ@―s/™§Ωh†΅y"9Η{ Œϊ‘«1ΦγϋfΤ§Ξ]δΪ§‘�c2Θ΅ �§/\‚ τA`₯¨QΦ(Tΰa7 2δ Yϋκλ!«ŽεfΠεΠt¬7«(²²φές†v”=”ŸXίJw€*+2΄κPχ`|g— 3έ‘„ „\_šcή9c@$G(-Z₯œ€PγΎΜ(²¬§jφαέ+4½Όž΅γU€Ρ_+²Ÿ$ZΜ@[ξR„Ϊ‘ 0μ εσΞC†n,½ΤάοR.dϋΎcφuυϊiˆŒι‰ 0%*(ξaŸφ©9LWck?χTΉœ#Gΐr’ω>¦γB¦–½dΛΧ–wΓ³Η+±i+ͺ’}άω7ΦπEΨγ γμμ0υ¦Ίh…ΈQh'”8ΘΝwΓ-Τΰ—9oSΑxCΖ�ά³Ωh_�CΎιι± qΉΊ{xOό.X{:ηŒN8i5ΪΒ^λ8ρΫ–°‚ΟΓ1gpεXΥD*Χκ8%ΙkθΎΙQͺΠ < υ$œ[μtγYa· Έ3φg™ρ„Έ:Úeί±_υ‰i@Pž œ’ψ°œF@ξΩ«Κ¨B·rn‹’²ζ+Ά‡d„ΆQή$h}ΉΙκΈ©ŠI²Ž4܁ΐ°$Mί‘$g "z–©gΈj6φγ)Έ=BωRF©R�κΙ‘ΐ{Η¬8―g·‰ΜSbΞϊ}Tμρ-φ)Λ–σ₯½Sž-.Ζη™ηΩsΞ­!ᦫοΌϋ~Έχΰ1mJՐGvύj*5ƒ±“€”λ΅•R;Λσ2ΜΩ csΐXKμαEτπQxώ”ΦŽ[΄Ώ…Ω΅«>’Λv9(s~Y‚½Lx&™,πΓΞsiξ[ΣΓΥ•e:Δt‡ρ‹3(ΌΊPO­Η"’Iˆ™*#Γazz<\<>lξaόΙΟx~z ρ :„Ό• Ν2Φ*˜FΞC¨i~FEœΟWηΝƒA•”ePݜσΤ*ˆlΏlyƒέΈlb|+ψτ²[ΪNΎώβ΅ώκ›_ω;�:‘θρ•›ΝhŽΐ‡pšΔΑ‡p�š—όρ―ώΣΉύ�Ε_μF%π³έΟϞ>”τDιAΛΛ―}:Όρ9½ΓyΊ LO…‘adΪΈΥΧΙϊ4pζ.° X”>‘$lžEe™ ,%ŠJ¨u…Vr¨tΤ@Λ¨J`με.|[: $ΜΜΌtγ•0ŠΫx• υ½wߊ-δφΙ€`π§ΑP'™Ή™§.H!ΪΰυχŸΦ—©£.ΝΡT©F­q@l[­ΐ›ΰl ‡~Ϊ€‰Η·οŠάc”3L„‘Ι©ΞΗρ9ΠcAe7Φ¨%=ύ;’x’"-‰‚γ§?ηύz�ΦqΆΣΣ={|'m ΫΉp?3Dιxo[˜ ζ™Π›ΐ–,'A!Q& e°UŒέπΔ9”{aƒΊϊΎ‘ ΐy·’c-TiJΧ ΰΫ;Πc`ŒqUb_ θ™œ‹ΟžΕ@W9Ά„‚υ΄ŽkKˆί%ΓXΤόPlΧb:Ϊ{½pω…λ¨ pσΖα½@φ)ǜφ^ͺΘ€‹䇔lbΧ?>�½ϊzΈϋƒ·QR…D>έ7<^όδ‘τ˜#¨νΐ=‡Ÿ7σ¦ΑdJ"p «xh·<bΰ ›?³§ϊ™6{6\_t'“'ιςeΜ!px$…% E�ΛNš"ZsŸοΞ²f*α½?ύv ’­έΆυb+ -G―χ–VjmRιv€ (™ξŽ ΝNYΐ`T0°&φ!^»„₯Ψ‰Y8€Όk­’cΩϋύ§Ο’Ή’ηΜΠ(γςlΈ5πIφG—sΧ�σΥFPΜ&‰΅δ}K]dςZP $$STѐ‰ 6όΘ’I·VίΊpσΔ³dHOγΒθQ@™„NξŽ9Ϋ“{ŽΊ‰D�Μy>έ°"€HPf΅@+Σ‘ρi€–πώ;ί‘ ΐσP83Ι¬υληQ>u›?UI�@m@€ΈΤφq―vtˆFg\w €Θ5η~ΧPŽΨ?J¦I ΖλV]#Ωf‡Oα§Γ'>υ©pξΚUξ3ƒίΚ;Œ Š ΦL Α6}ξuFŸs‘"Œs‚7 z υEK;&y€•θ Ο=iW*νΕυνJ œ ΟfgρI@&ΟΎvέΔς(VΫ>¨ `νZӍ'|δΉ— HΏ†>φΟώϊ2σΙΌR«žxq�gEΪZp–ΦŽτπ¨…ρ³QΖ`ΊΘΉ`{Δ2ώΦΦ‡°XS•$0š>{6‚yU3k«»Œ7ν5[iΣ‰ ‘…ύ{ˆ²F¬RDb0ώi½?γ{ΜX¦8ΫZηΦwgη ZΈξ©KWΨ›σB,ωI²ο+•νpξκ%ΖƒZ€ΆΔ['^ŠŠ|χ@$,œs;a¨f*#νεTyΔ=‰λΨFΥƒ(‘뱄§“6·½μυ6�Οzn€G[·*_o°g΅ͺ�j D`Ξ·™[χcιυd ±z!JmnkΉ‹­c ¨ΧSΗΆΑ>Kτ/hηχ4”Έ*ρ|ΪcnOΘάΗ½ƒrΝ©ž7OŸ<γ}ΩƒΞΏl»Q k%.,—μ)ρ±œ+ )μωh«ΖΈ·τ"`μΪ9#$π,ΣGΰ” ;%;SΜΏΟ/U@^‡—šϊŽa~Ή…²`gc'L…+(ΗNθ˜qŒˆ‘%Œ15�λγ¬ί TDr@•GL,›ZYZΰώ ͺωίνΫ„oη»\ηΚ9ʘ ΰc’š§ΖY�Ξ:vλ5ΰ>τSBΑN%Ξ’Έ7»vζ'Νω�ͺN₯ΦΩΛxKPΪ£LD₯;zΚψŒwlΊxΦϊœςϋ/`Ž q©eΟcMν�α§₯6νœΧ>γ5C΄‡>‹-Ω“ΌΙϊLFeΤρΨΕ{©¨8ΓkJ"tA$Ά@Ύ%“­•©ΙΙίωΛι/ύυ_ώε_Ήχζ›δ͏ζ4GΰC;MβΰC;uΝ �Έΐκκ­ά“›wΎ (~λ½·Ώέωψώ­2Γ€νΕo„lίE2 ‘Ήςψ(Ως6ꇺÏ�δηΒ$Rlέ²“Θ‰«Ρίl#ΰ† @c03ζJΥhό·@ΪΊz3PέdN³d ‚=‚d%ζfςΜ> jΦ565�]‘§Ύσ­o„χΏ�}Hε°Θ―•±(Ϊ›ΫžκέΛyΐW„©’8ARuzž‡ϊ!@0˜X•φ€y²rU²ά‚š.Zr @RΨVΟlΙμύΒάμγ žDΞ\·­ιJƒ¨,ν _οI$£’ ©vd―™-€UZM˜πY Κ'‘^Zζ <ω½½-€¦Ί‚)^`ήΆTΤ)σΪΛK("φŽΘ !ΖΜμΌ Νρ$σ3yαBΈ}λ=2©HΣiΘΨa„»;ΡP ©1£²γ gΑ�m�Žwy² Ά 3°Υ°­5†ΐΕων%h€MgΞΪX‚Μ6ΎŸαώN7—bΐNϋ«0}υ:b²’�KPνΛx�6Θ(ή}ηmœζ7γ΅ΥΈ&™Vy=Μw%μ�Μ„ΧΛ¬Ÿ¬΅Ι ™}οWWν*YωVΚ1γΌξo­ΗϊnΫώ!  aψδOύT¬wήήΑ'ΐ $sP&pΞ")·+ΐ>Ζ zœ@ͺ$˜γl'¦›τ<7C90ŒΡ σ§ΩAyp.ΘH§ΈkλΫYΫ§],π€`έρΕXŸcό„qΊtγ7Π  on`ΤΉΨ&kiέυ(2ω3φ"kfei‘D-&_έJšU€Έφέ 2ͺl¨ΈΖέ3ϋΤΫ ΐ=d j–sεΜδKώ\4fσg%K6Q~t0Ξ+«΄Η„ά*’™Δ�”ΛƍΉύ?!Ή\Σ ΐn ²alj†rŒYΤ8·(8Š―#σ;€0ςcΦ”t*;*dΨ5�Ω}φS£§Ύ ΨαΛΌώ©Ιj›RjΎ’<؏½ L�ˆ3Γ4K}ικUΤEη’F@ρΕOž{ao#₯η΅,™2»₯ρμ}―Ώˆ&Aλ½dΩ>mΝh βU' `@€€Όxγ“ΜM/Ίp°†mMy@iƒs/Ȋ-YSξΙT z–,ΜΝ‡$k¨O=²yzΟS¦0{ϋν°‚F §Ι¨,j•?vΓ°ΎΏ ULU` yQc,_‡;( –Χ`Ωhˆ;’υήa½'πtΘp¦φΡA"ˆ…‹ k»ΜΦσΫQO‡#²ξz3΄°o$*%M<χpr!C‹J’―Ε]eβ]xCμnl‘ΠZC%IΨ³JσΥgOΡ"tˆλ&‹ Y—d― Žž΄s«ΰΜrΞn1ΆaΕCΫΊϊž€d€ €₯ Eκκλ|= Ψ8',υAι£J§§_2Ε‰*9<ήτε°ΓJ%LκΦ6—™§"σuZΗ.hίZ™Xr.Έm£zΜΈ'X»IΖ�. ϊY¨’‘Δˆd+{€ƒΏΚσΘ2ϊέμYžν­δd!vΆ0Λ£-W ΖΜ₯ΑŽΑ½>’v+°γΑΝ“vΏόœ v4z�_ΐ~ΨJ§Ν�ΘθP�⍑ϊχ†y²ηίόW’f(ZI5Z ³³ΰ- @°bllPπ<~}hd$ŒS½Dy|bŒ6ˆ—bfԚΨ52…άΉCyΎχoΕΜώJάέ›?ˆ5γs„ΩΔ§P’83ͺˆ=Ϊ­%COφΨ,s<„Ώ@ΧΫΞξΎ¨€8Ψ€- ₯Β @ΛΙ‘)κη riΫdϋT«`i-Ύ΅ΑmdΫ‘'0k΄Wω&@¬L’ΛLe€eΦ³•χλDf­Β {°S~%ΫΒ ’©>Cΰ½ ΄ψμ)k†}ύ²ιr^_©�}β] 7Y‚±†[Ÿ»JtCpΨjP‰ΈF’ϊB˜ύKσ:*;ΛaΜ<2ίYΦ‘�ψ‡”τqU2σ ֌©dΙ‡χΫ…*E,ΊΟGΞξ '‰ΐΐΔƒ%+νψX�ΝάP“XζαœY€�A I©šΔ™z§q_DkΛR"ή‘ϋBΝ«§9άέ]ˆ*²μq‰-Λ€ΌΦXr8τ¬XžD†~ήΟkp BT]δPξ³νε₯˜d1/EΪYgΈ¦f²51U†Ύ9ηž4γ\Ez^-α€/*gμ; ŠbΗˆsjΩI°ΊKfΈπΡΣ!GΖ;vNΈΆ4@.ΟΊhg-$@bš”&Q1³Η7!·(X4Π¬q¦uBRI ­=[d―QώΑZι€}g‚ŸNΤ9] aΣ΅01„ΊdΚθςϋ-α1]Yηz2˜=(M κŽP|Y*"9"Λ¦R‘‚MŸ3Υ’“;σ+HΚz ˜ φ3mL›έԍο’"Xγ₯™γΝpώκ q¨Ύ¨”ΙΜγYΰY�Κ|΄0Ύ}”#­�qΗωOX’Γ{šΑ>ΐσBΒΐ�ΜXJί1ΐεώ=»%—¨πwMHwOΛ <‡8χύ]n�LΖξ˜5Ÿ†ρ”΄‹:Ψ<‡ζ9ΕΩΘQˆ‘‘foXŠΓG’ΠΧ³|% ™Ms~’οίC!eΝθ”giΰξmH€3Cd²Β³gs‘τεθ�α„΄ν£]ErœƒΡνŸλΆ$ζ„r9ΛΒΊ!›9žY3μSh•D’mΰl+ΐn⚡Ŀυο‘ΰœ[ZΣΑΊIJ ΨƒΉΚπ~E”Ο1^][Y€‚j$Nπ˜Υ—τ\h'ΉχΧ©g†DŠeB*ŸŽ9cm[*1κ:Ά4Ξr•}š-VρhπίG₯"©cΙ”₯– ž–’ΰΰ΅εBφά_G³³αΩζ ͺ•Nˆυ_6�ΛΈnAŸόwΟςwίy2c‘σ‡ωεί±μ ΒΜR6I†xŽr^θρPελޟ-%ϊ£²bNσCŸγ- JUz3αΚ•™�‘»ϋ›?ϋs?ϋώΪ_�―ώΩg>σΉχΩ�MΔ8‹Ν�4GΰΓ?MβΰΓ?‡Ν;ψ˜Œΐί�‡�€ςόώΝώs’''οώΡΥ£Rω Y€μII$έκ‰Λ;§ΑP+d’ ‚5ΐ ΙΣΗ7©A?5©Ίw�.YɍθΌmΒs2!f4’!‚�F «»=ΆŽ¬TωuF̊4ιR&ΩNvl‚:b`ΐ΅ΰ\xό„€x‰ΆΘ 0¬Χ4›/Y`g€$ιz]Ÿχ€ΦG++Ν“5ά@¨rΖ=zψ0” d‡šΚοΕγ oHZς S`()@ΜcЍσχ>Αυο]gžΊζΜ^nΝΝ…’$ΐόσ˜}Λ±VœKkTp;C==ύdiFή€ΉJΎœϋΐžœ:uηΎΏέόσ}»ΚδΝΚ [g₯σd±  ΑΖ1N’ŒΖά�›9Wφp9νUˆ˜‘>ΪMޱj0ΠδšRd7Φ^χ7bχ ΛMΊ½(4T΅²¨`Hb­BvXsΙ…ωΗ€Ζ ΰkPύ©Ο}2ƒΆΜΉ3*`’δ2γkύ4Βπd˜ZTBN­}Wy μω„υˆp=τp7°%%Xk%J0ΐ2Τ €Ώ}‰ .Ζ2«Α΄ΐΑu€™BΘ<^ +Α"ψΥΤsok+f7;!%!Š”ηΌ›”�XΗ―ςΑς‚}ΐ—υβΌ3'ΆX4{ήO ‚ΩZzΝOI,ˆΖκT-p9dM!±τσ`½:6ΎŽT³ς‚}[FZη­Qb•ρEΈ3”-ό]Uνήϋάί³C†{±lFγTλ %% Ξ]ΌD‘Γυ™±~i—Bι‘fŒΊΈOΝ=Wz‡#¨ΊσξwιyΏΕ:$Σ‹j‘?€`Wl·ͺ@ «OG{±5)#Λ±Ά&! !;΄$Τ"MF· «xʐ-iΐžΩΤ"ͺS\λή;γ�Γ|Š5™gxΝ*k¨R܎χbI‰]?l ΨN…α‰~ΎΑψγ5q΅Ώ‹χϋitf°vJ^΄Έ%2ΝΜΫ›~y}žφ¦:όS‚΄W†<Δ±ΏAM;.�»μ£ΔSχ«Ωi "Bυ‡%Nϊδι–‘d< αSflςœsτu$πΖRβI�f“ξŽuΐ‹–°χn?D5΄DyΚ™pιΕWx�:’œ#η.QrDDφ€†ziΐβ χ^wqB&ΆςŒHΐά΄qΘIl¨TTΊ―Ν> b§ώ;‹’B’Ro‘:‚ή!–Ht1ξWΟpΟnύ,T βG“fo[>•ε{m–Δ1ŸΦΐ»f]Ÿz«˜‘ί\]d.Θ"η‹uΩ IΉN‡œ:€Y©XŌr―‰Φ3Oφ™Χ$ΡΫ«²�UΕ©PΡ₯Αθq$Xƒ9ό¬J4Ι;KZX ’±’‡>l*ζ†"Ήm¦ΰ @f|7X#쁌>¬a ]㠘6UMκqvQqζ[uΜY#YΙt�£Ξί=οΛ�šΝhŽΐGdšΔΑGd"›·ρρϋ�sΔ�ψ·�αΦόΣg―n�/hŸŸ9¨$›ΊA;>jZωι„£Νyd— ΟάόΓrN{CΧ£ρ›ΰϊιμγ°΅N].@ΛΜύ6Α»Šƒ‚�ΪfδK€[kέOΫΘ™½%ˆ"YbνΉRd{~_½z-τL*I5cΣN]f‘@Ÿψƒ ‘ A™₯ j»1Ψ™Α`ς'ϋc‚¬,™*ςˆθΒ΅—_ξόήΗTq‡ @€Ξ½^5b_θS}³Υm;fh% Ž*φ/¦ΛoDˆ( ΰPW”‘θ΄E?€W0a©‡Χn[Ck?m»—°wπφQ/ZπkG΄; “ι!˜ͺ‹€ν+dΕΆ¨©ή&Ϋ Ϋ΅ 8άψΩF”`lGΠJΖ9°Š�Τμlso#lPΛN :26M@K&˜1]\ΈΔΫ[έ`RΤ€ipύœώ­[­rΉγP σ3ŒtY€½ΉΈΐ;ρ}{˜�Κ6΅Ηό.―η όœ™νΥ2‘%‚έVΤ E άς˜ *ί%ΰί/νΆhΓ—ΙnjŸua”Ύπ¬…ΥεΥΈrdOΈ·|oΎ= λ ”(dΣν=d ϊ)1±\Bp`6rkΕςΝpξϊe~eΑπH Όo½ύ@b3šω™a[]~J Š™uuœh0…Φ―γΰ2βp—� Ϋλ‘ΤκΒP�΅Ί°4›^)`¦š!.³φΚ|―•`ύ@§βDΣΛv€ΟYJOzΘτΪΟ=ΓάhX₯)―hLX_ή Q2@‰‘ό»Βϊdε’Ξ0›ύό1Ύ|6j:ύ;†P”>VŸsΜcb6SSΏcœκΑŒuυvΦPζνψ,<Χ ΓΕ½ΥP~#‚ύ*€· ±vφάEφχΛΪΦ°Μ=ζϋΧΘ o ίw­0 qύ»GNεϋάB<tΑοΑ5 θVς>Hη χΈΧh&=9 »ςkΙΈBWίL?)Gρ,Ή0“―Μ_ΥN,Iœψυ$dArοζ{‘$±Žύλ”hθμ郀λ C΅ή[Α—YΧVόDZx»;3_Ϋ(œ˜οdJ+σ2}ρ2DζŠμ5Χ‘eFGͺ'˜f’μ/%JΛw!έΊΐÚhΪ2ΉFυ�ΰšά Jβi:ΪπK!Νϟ €_ΒGeHkacΊd;$ήΛ‹³XgH¬₯c@,m!ι «zžΩD}₯ZFςFΐšCΕU‹€ΈΡ€ ‚HΫ‘SC/ {²Ζy�Λθσ!ι#‰d†Yω=jpφ=χΞΉg+Λ8 Ϊ~Τ5ېx2*έ―ž“=dΟ€΄υ�•CΛJRόž~zj°6Ή§η P ERRb�²�!ώ¬9ΙMχ‘άsη˜ύYCΩQ(ξp�`UΦU"ξ•–dgαΠΨ ].Ζ U X ΐ$ajœyΆ€4έ]θζ^Θ΄s_>+τ9°uŸ5ςǜ“ώŒεg,²ΈWύ>oΥšΪΝa_E…s² ™™–xfξΩ~‘#ΌΘš)— !lTμΟY'V‰U”.zXԀ»›Ž¬)ΛfZy/ΗEΛ η6›—k³―TNTτ’’–ŠXnα„Kτ₯™Ÿ’Š3g™k³ϋž-±3_ƒζ½SH ΥΦΜI0Ϊςς+Χbw-=$G=$»]³Άͺ½wχΆΟR ΎY^P%“°€`$φˆTHΩj²ƒΉLsκ�ϊqυ�βΰΰΐWϊ _όοΟ_~ωΎqJσ£9ΝψhŽ@“8ψhΞkσ�>β#+όο»ΧfΒ νI̜φ‘νξ˜&$γG@Ί5π[_NTNπΝΧt~Ώ0s‰šO�LaΖr δΫ ~NΐX%c§TΣ{¨aΣ΄Ρ{ΜA$ΈΖΐ3KΜeΖ=τ¨/ΰπw|„QΑ’΅ͺ ΖH˜‰< l¦)Φ!ΔJ₯AΝ:οtΤ”™¬!›-E={.Φμ*)ήc4Ή¬L>yτ0,?�ΎΛ=j2hkB Όb>³Ν,ΞΧ₯dXd d{iΉ56Κ=P2Θ‰­·!3"8#`­}«PςΒ«―Σoœ1΄νγξξ^VͺZπ_�άΟDY΅Α¦m/£‰Rβ]ΘKW:Z iPhέrΰL©| Π]'λv‚‘»»Wv ο˜ ³R)ΖΒχΞQ{ι•—ECΌνβ€nσg!ž’tΕx…€ίΉ? η/’u-PVq"iƒρ¨°· 9’€– Ωμ;z$ Θ” ΚΫ³˜Χ " ¦•„³˜gΫ3κ ‘&cΧΣpζ>Σf Α‚X� .g?2κŒνΙ‘ŒυΑάλZ/‡`π€ΧQΖoh/α3Ÿό^‘u&8’lKpΟϊ_h<κΎ°\F ΅ ©‹Zύ#�U©ΆͺKGφPOœš—ΥQΪ¬ρuΤB φYΒΞ5Ye½Ϊ©dςάe| ½Ν€Lˆμo`ά©4Ώ°Μ½γWΐϋ›­–H±žΌp,‚[Υ½½ύ”6E¨<»“}³‹άQg_ΧΧ3•ύd―ψμƒΜ6Ί=€�λΥ AЫѝͺIAΥ –ί<ψΰVΜ Ϋ Αš‘lΌΪ’t%ΘΪ�ΈΠΗ}EθwΒΟ¦ΨWͺVμ¨ ZIω{žs$Α3�θNΜXƒΓπΤ9²θ«΄Ίƒ@ $ –'H*°ΐ’‚β`�Ž{/ †ξ· 2c{ !‘?‰g™„€dB₯ƒκ;T²ΆΆΧφΠ[\7j Ζ#ΟuX§_FΙ΅}ΈU ΐcZBTTWοp,…PEΕ+Γ’₯%ξ·Ζ™’S•ΊͺaNXυ|ΰό±τΘ΅¦…H`n½9JIIΫOMsk–np/[n.’M]½(E˜ΓMΪW’ΤθB9�ΚοΔ�Γ2Ÿ*%U»›a`rš£‘Ζ½lp¦ŸŽη_†u"ΰυ¬;aί6X―*τΠ™ΏΑšb±Ε,Ήσ§ς£ εΫ ΅R{χ”π“ΐKp΅a4aΗΗΡv©ΆΈΫυDR[EZΆ&dΧΧ§?'αWf¨82»­2$‘y!†Ώα δ‡k_OKΆκΐUkj#Λ.ταPνK…˜_=k$Ώ}/AΉε^*roU|#’Δ’ ͺœ sΝB3dζ-wxαϊ΅H€7ό>Χ�:ŽA‹Χ�‘€εI’ΦωKNΤ! |&:_Φ�;―š{¦ qτ’ΤtΧυξχ$…,-γ―ρχόSEˆΒ?%Ι1ό‹λ―@Vσz²ρ+*ˆ$Κ(½ΰ9₯μ Δ5oA  χ‡)Τ�5ο3Ε=X’cά]£kx6XΚP…θ+3FϊΥX•Mœ=~/O‰‘₯Iφ§‘½œέI”Z¨vwθW‚εαFΉ·Π}οΎό‹�Ω―ύΪσΞž½ΈΨ$ ˜žζGs>Β#Π$>Β“ΫΌ΅ξ|σ›ožΜό΅―-Ύ˜|ˆgVοgBYd°mΤ +C%ύ@lavOdχEΜΐ43Ϋ&Έ―P^Ύ~#¬ ΏωoVΜ8w8Ρ’ °cνx?Αl(1Κΐi{35Τ¦’u°5”fƒ©ΑαΊ9\€Ύώq”xk§χ$ΧgFFcVG0dV₯‰σψδD L•ΖΫ/έ‡Ar…,ΎΑŽΐήΆ]fΜ’ή:SΥ �w™ϊϊ¨­E%` vΞΰ“¬ €ΣDμڍ”7|{O AΰΌ.½ΪΙΆ[ηj'kEmνgΜg&&:΄°΅Rφ‘)b'ςΜήήiL�ί>αHRπ3Κη•’χB΄θŸ%‹»MV/PI";KV»;Κbν”Pθ§= ؞κ}(C—žGΐ3<2I¦y6<Όs—μ@„Μ½�άV‚Λ\ΝχB9Rείϊ¨hμšν·}εΩ‹Β+Ÿό±’ξ΄08@Ορ™°ρ|!<Όy S²SW{3iώΌ€Ž}3N%‚Kο₯B°mϋΉ‹/½kθσ…«Χ_"ΣyκmρΖηΏ= λŒ[‘μ‘€ά:heΗΌlTIΈΛΓ²σu.k¨ι·ύΨ. U‰j{§χ’½<ύ*K4A ³5”.λx1Μ†Sσ‹§…�υΛΧiˆ|yχp'J‘fοGΟƒ|WχLKμ―ΡΰθΨ$]FœQΓ WΟuBšI.ΨP΄BnhTyDπ]ζSΒ!A½qsαv­+mχκUΜDγ>Μ%¦ΪQ„Ν1Sΐ"@¨”'y‚׌%;ΊgKξ‡C€ YTχmL«Όω΄ •όλ’f'γ’€TΨηw‚ ΠD ‹pg G³’₯ϋØ#Ϊ†Su‚mϊ$cΊθͺph{Bˆ€±δKwδ`ά6 f@aVΉI@ε8(:$Mάg5H%œΟΩSݐ‹tΦ€ κβΪ»Ά[vΓιΡΜBΫης,ΧΦ.*½"*ΟͺώΎNΞ‰?»,<8²F(όΈ/• mtακΓ…Kg7>ύϊλož:ϋ·~ωίϋΥ›"μΘζGsš#πQ&qπQŸαζύ}dGΰ�ψ+-ΗϋΛ�ώώξΖΛΊeγΈžο#.%Šˆ] w"hΠ3ΰΩσ9$€ψόŽ@?xΎρ΅?!0& άΩ>Ν–ŠΊιοHhΰζΗ6mθta6δuΞώΠ₯€9K a°s†μδ@τwήϋ™-ΝΜR� Ιγ.΅­Τ„'οΌ‡B‚–vžv\³ΐό)΅ι:^%θ%ψ?!N2ώ}{{ €Ρ& g•ΐsqφ!™LΪ/€v·πAΰšzϊzC`>,GPΪ…ωœςY³zfΛ ˆ­6ϋ™l5π„ΨΊdHΔ‡§§B–ρ\ Σ„F~€¬α‘ρžηž=D…‘©€™ά€A1<|pPΕz&ΖUN\E[ͺτ·ΈπΒu�@IΧE ?ζ@o f’ξ fSyΔ �Έχ=€Ύ±>ŸΧ/0Ž�yη^Α"°8`λΌΆΔAY€PipAΆW³&Ω e+Ώ'04°7ȏ¦’|h€lΝ:‘?kΌΔ8τrߐ ¬gΗF2ΐΎοf]•οno†^Μ.νn PΆΪ¬€}ξΏΑ`ωC9y m|ϊd[/ΓuƁ¬y ί€Ίf’GnύˆBΧH¦›’‰ŒΐΈ�2FΘ<—)₯Ωί€Σδ^”'dš‚ ξ’‘)€Υ²¦­εE^�…λΪd¬Νšλƒ`YΠ―±Ό°ˆ΄’ΒFBJ_χ˜£œ3ΌʟΜΖͺRΠ?šφ6ΦvωΎ₯$:π›Α•,Τ\•‘b=1'dSΑŸϋx‚Ε.Ξq‘ŸΔϋ;‡›Ά3NνœIΦέ―ΜΟΗ9Ϊc-ˆηH•@eϋΙΧOŽω³›3`yiΉ+Avb,ˆ ¨²ϊ!₯Z¨ύ©Χ1~M2ofk™Χ|†�ΖΌƒ³­ΰ[gΞι°³o:DNŠΎΏƒœ%KιΘn:ξ=³Νͺ₯R±#kΑΆ³GΊCΓρ|[6;G!ϋψZdŽ-eϋPκdς½¨4xΟΪ>ΧΠφ8C7ωήέ.ψΉΙKΧBδd‚©3)ž—Xˆ₯έ…ε΄SΌ«$μαePΖ@ΤrŽΊ°˜�$*+‰h;쓉�ά+HτΡΖ+R’£#ό«ΥJβ-!πΓ}ͺJΓΞ/fν]ζE“^»εΔ6Œ…δ‚έ ̊λY!¨΅ό F©GΚ |έ―i^k—2œ kA…€.`:˜HV‰ίGΟχ%/Ο–6ϋO7€x>Ρ>3Ÿb¦8ή*X€q/Άq―ݜ*€μΪ"‘“g\0–KIŠ1&*d�-υΠΫΒί·“…~ §Œ§₯’ŠœΛGξ_�9’œΫ!±<³’‹γwU)œžAή+_d«H‘°G‘Ε:‘p”„π‹v€πwμd?%mπ°D©Œ"a²•CK²ψί€‘η‘ž+‹ QΝ7;;–0&}’ϊνwί [ ‹(ΣTRH8fx]χ†λ½ uVJ– ΔDš2Ο­vΎ.YτβυΎwεΚ₯Ώό‹�ξ—ώΰκυO―’2p‹5?š#ЁΑψΨj~4G 9ΒψωŸ�Jλ½·ώΑ•ΩGw’§w ₯ Π(�Ο‘ιh΄…ςζ³Π–ΖŒ‹ΰmγΌ ϊ‘WρxDiΒΝχo…n?¬ξ#­νށI™€ε4{CΆU C n¦¨ƒΜ₯2Ο|‘·‰a δΡ7YX‚e2MΦDλΤ|ωΕΓΨ…σ±£Ξκάϊ2εUb ›’@IDAT Γ-€[Έ)Υ4PΉϊΒ΅0:> š ³ξ£<Ϊ–Ι.υ0Ώϊڏ‡Α‘1jŒq<§ζv  ~ξμ…¬”aŸ9ΣO@΄ρ2\Jϋœ™|AΩ[όΗΕ-A ͺϋΊrπ<&ƒf™c@D΄T€Ι!Ώ<Ψ�ί ¨²ξύ¬Μόpo‹°.Χήσd‚ŽιOŸ<ΐq%l Ε’ƒ₯J(ΦΘA@ΐΫ}b{e‰`φԘπ0‘|½)ξδΜκhΗΒe&;›:κ“='΄ –jo E@žLdŠl—_W�\W―\d"ε^Μ.>}aπnΨCPTYΏmk¬±sc8°_!0W² y‚*Bς@0['ΊΆ„ΎΖhZ&"¨QΎΏΡtqšρΖTŽ΅˜šxζΤ1KΠg|G$•"I€ε"Ύ)1―“Ρλ0»ΕΨG'pd�‡·…­%€A?™­3Έ{Σ· ©"₯ 6̘B,}β΅Ο„—^ω_G&k72αςΛ―ΡζoŒρ\@|‚δvy.Νiάρλψ_μA|ν‘±΄Ό ‰„ί1ΌπΒ•H Μ=‹Αvλ]Χ~=6zw°―ΘζuήGυψ�%χY‘A½Ζžά\¨pCΆrΣΜΠ_΅ #zp,Ϋ`‰׊YΫ,ΧνψΊό·Y‰1³+¦{]Μοή> J¬-ϋX{ώ˜ύBΆ•}™bM–Y‹9ξ“½}60‹[]d]©Hΰs}ƒM”]˜ΫΕΝΛΧxΞμ¨ΖqŽQ™3Κφ‰ρ>·c3»άwDΜ Χmλ½V²ΞΡGΒ0‰Α)£zφžvY¨qΟ/Ώφˆ}aku `Ξή†ΰͺQΊS°υ ΐ± ™}‰ͺCKZς\�qΨΨZΣ/ΌΞB^½τΙΧΓΜεΛa~φx€Κω°ΗήΪ†€m`’X―C8Ή6”(5ε+¬ορ΄U$ œkμd,₯JξSŽ`VΨ’‘³Χ�E’ΰ ϋcϊ₯λ¬Sδξœ•ύ…π“_ώe&u¬Ω=|S$ ςVx&HΞθ‘αϋμm�'±dIRΩΧFΑqάB&œρΜ²Φι£Ηz£*η@Š3ς"¨l†ΧQqΥ‰ŠΘΦ‡« Ο8'(Q€H ^ljv(Ωe—λ ƒ?Œd’W3ΠzγS„ϋ†Π=@a΄ΑsΙv’ \$γƒŸΔ©e/z\h6™ƒΐθ£Τ%ΆΊεΪ$ΙυQυΕQχ™^ξΉ$―εω΅Ο½{|ͺ\"a)VbΎ%¨Š¬œgΛpΈϊ�΅0Mϋ`Ϋz }CCœ›*Ζ$jσaΨ5ˆ5(‰m+ΝH†2¦ž#‚ϋΔ›οcρ„s+I¦2IQ~Νηd€εrΫ¨kby?'ΩQδ|ކΔx‰ψ:?_•Δαυ$D8V!Θ4^UΘF#Π$>F“ݼՏΦόΦo½ΩψυΏσ7gη–ζ^'x[|Nf°X!@ί]zίzƒ΅53κ„η—ιέ]!PΫ_GepλΡBX@&^!@œξ‘-5 kpι`ΐ©΄vΐΊ0Ά~_c2kΠ{²€Ζ.²Η– llΠ†νΑ&R]‚Λ]΄Ϋο½ž=Έ«+ΘίΟ]š η/αAΐ4¨D›Œ’φΖ�Οή›=Iž^ηy_feεRYϋΎwUWοϋ6Γn €¦HIΡ’MST„|ηπ…/ta›€#²#LΪ¦d)δ,Ϊ–i6C%’H0 0ƒžžžι½φ}_³²2³2ΛΟσFΎπΐ™, ¦»«rωύΎ-ΟϋžχΌG"ΥA&w‚\Ί‹ΐ0,c wΨΪ₯Γΐ�ΒR‚©} 2γκs Hv�ςί ΌχιφδΘFΈ�½ο‡/&c ςΞΦΑœ± =―Q,PΏ~κ δB…μ―žu’˜C΄°κ’3EνI'Κ,‘υΐΗ5jwύ1`ΫΔ o±Cwjζy›LxΊ²t�=ΐ1ζ|‚-­ΆlλŒ!‹&s†Δ‘πΊ(cΈ|η^τ”Ψ#87+5ύ:Ω @UpΟ ¨Θ\CΠ΄βM€ O3UI‚Ο•0ΨΣV&Ÿ‡ηίόZH�ždςi9ΖrWΟ‡{Ÿ{GςGΔ9|ή—,cψ–1$[…œy—5rHπhΐΪ qφβEΖ‡Φ€Œ΅ΩξLN·ξ~‡ŒP ¦‹κ΅p€δ›yi0ΨΥŌΏ[%S‘&?ΗjΔ5y»ϊ�Λa`U#ψTiqσφ½θwρμαχΓϋίώ*€‘‘ΪϋaΫύdιΞ"O= +άη+?ϊ…Π92B¦5L#Κe ΗΞ' L7(₯Α,ξΤ‘Ψ°i`%!Pž>‘>vΆ4ι4cX ‹Ίƒ―†šΙΠ3<€rZ82‰fϋ“'d[X7)²εμ+Λ|,(0gf6{ρKΘ@ˆ’„Π=>‰ΤWςDΖΒuύ7=4ΊΤ‘™–”ΖΥ ξηθ�ώνPpŒ·Ob|Γ6Š €‹AΕB/ -Ϋ:{ ŽιŒρQβ-(Zά“ϋˆž><@‘{“Š`Νλ4πoη};Ϋϋγ”ψ°~T•’<ΆQŠqŒ3ΐ2”#ŒO-)H5UΝ(K@ψŒ=�v|’Τ„'πPQ:^ »ΙϊϋρiO„‹(†FΖΖ) Α„σ€Κ}[6qΰΎeexcΜύθsA"‡ 6Ο^‚πΩ¦ 6 Κ²N�‹*(žz‘()4z&™8O } Œ²φψήζ^m }-˜'IΠΆΑ‘Hpι5RΒ<΄›Ξ:Δc΄y„?B¬kϞ„—^ΏΞνΗdπ9οΛyXΖΟ„užg˜˜†)‚΄kΗHς,ΠWΞΊ`Π—λ8SVaό«R;zl{ŒΉe7[+΄–€΄)g–3ŽsΛ�Ÿ2Ѝλζ„ύ¬‰£σΞνΖξ&ιΑ‰1ΚnΘΖ6ΧP|5u§Β�όΟ‡€™q‹‹3ρύ:!‰‡ΞŸ ƒ—Ψ³Μο"ͺήήV ― H’ε=ΦΘVhιΣ,—7Π„±ΈΗ΄Κb―r6VͺΆv”rΦ$˜σD’>/I�M%€₯ΚͺZ c›Ί-+αzk…XV’£\’ƒ3Ξύ”b=ωωΡ ΨΤ‰'ŽcΗYVβ΅τ‰Δ …ΩxΛζR¨T‚Ήήνψ"³vΜ<₯ΈH`„¨ίe@ώΐ`?c†W ν„ΆPΒHdk˜Κ΅³Nψ ‘μμδZ€ν<·Ž η’όށ•΅ύj7%η�έ‹­ešTZ@ζrFt’ό�·gb,G¦}xbœ2΄Ύ°Η|πζεο9ΡυMόHΚx€�;™ς}ι�Qš£l.Ν~fιpΡ3†΅Μφ‰$eέ«€ΰwώ�#’œ žεŽ}…΅,Ιβ―£jq‹ώμE},%Œ*'ΟΒaΟϋαζ9ƒ·„Ό­,Yώ|SjuB)ŸΧΝά·ΥPψΈ€r ߜͺΔχԘ,„nψšK#½‘‹³kΓZ�ζ3ebt(τAœU«’‰‰¬#Θ —ρ‰ρBoΟWŠΕ»ίωΚWκJnύ«>Ÿ©¨Ÿ©ι�ίμ§mΪώΡο.<~ξ½wώόκq©6$Ϋ΅½F0ΰβΚKoΘn‡ωωEΐ6nοCgΘNΠ–P7ξFŒΙ@ΨΚ0A`ev4fΑπT΄Q{=08HΖ©_ˆ.ξfdu£ΆFϊΝ»±Ζώ -�ΞΔχ‘°Οχ ΗΞfiW¦§ΑΤΜ‡Θ&PZ³k–UGχe$’šœŽ^@�?FΟ`|Ά°Ύώ΅?ε=—ΖkΘ WΒ3d•e@“&Y{>κ„Ϋ±vτ©¨΅ά{‰«PΐέΚΖF8„Ω'#ͺ<ΊL-gΕ χJ G°FtΖWχdΘ,Z΅ˆ?B5ϋ]1KNPo;ΕΡ±sα�υ;aŽ{zςπƒp%l%ΰ h·wa–λΣSd:1\λT@X‰²WΊ²υcΐ΄Rnsˆγ—�@’\1¦ƒθxAkΑζl/­½Nx^•׏ΔΑ~ ’EB‘Φ;Ά¨£Ζ4 λP?>υΰA8€ΨΙ17f™Μ΄šωΥτq�`yξEœ_�ΉΛ7#!P`�ΊϊΟ@$€bΏv3ύέύCdώ0μCώΎ03πΐΰΐΰH9ζΚ~%^”�π›αΏεg‚΅"ζv;ΈΝλBήΐ˜F‡~DΗP_Έ„ E³½³η�Ϋ1‘[fμΘςώλσsԏC$t ₯^ k“/ΒΚΜLxώθQX˜ž γη.R =_ϋύwΎ€[}²ξ\XπqΈ˜€μfsΖ†lΎkΩ\ή dQ·>fψ$ͺ¬%έfΞ$”87C Нoύ¬ΡneΞΫΙ7CτBŽΩ /f»ΉO YΡΣ@ΥΈ!$ςI2ΡfŠ™$φ³ŒͺΓL¨Ζ€J­qhl{›’LH?• ϋΜ֘[( l7ii–% –†BJΕR6>«cΛ‡ό¬r½©œQ™ q£­,SΌo3ηΜ(cϊς«―ΡΝf„ΆΔK˜Pn`κΫΙYΈ^L=ƒ:Žήυψ¬€Ÿπυ―ϊΤGΰ―θ|ƒΪΒKχΎ9σ…·�_›|ρμμφΞΦE₯Ί­ΤωξξlAμ…ηϞlΣήjŸ C¨LGxψd:’ΐŽήhV i§@/„o‘½^Ϋΐd {D€^%‚©Ψ)—ϐ Σ aΧ·»ƒL—’u%Δ-»Ε/Θ7Δe f­“6[±IΉΒGχΏ&ŸO’\¨ζΈZ>ΐ󩰊CωŸύΙΧΓs~/Xœο½ύ.Α9ΰp`Π—A�e­KΆΥ²NΌ@P(ΑQβϊ ¨j₯Ω›ΣλVΜcΙΔΔWS­G%Ά/δWQb[!ΣjΛ)’뀑b@’ڌ|ΣΎγΝHΔν001P4π*Ήτ¨Q·ŠŠΰχ;3ω4Φ¬·δ»ΒΥ»―eΓΐ €΅h¨+9ΧπΠzn{Ίϋg™1ϋψγGΖΝ‘9ΣΦ–VQ,Mc C5Κ~ €^Ϋ|5&Q Pά :wvœ@΅5μ6–ζΉ Τ“f΄;˜�Ρρsq̝_#νγ.8ή$PΦTΟ,γ&Ο΅<Α–Š–§,ΞNΒ?€lȏ° xK@5ό1μ«ΎO΄B6L†ζ!ƒM ³Θ”{\fΘ~υ P§ŒR"AέpίΘp”Σ^<QͺρΑ»ί}Y*CΒ*‹Α}ž΅uL`½C=|Lη²ηΡλ7Η#QΞ�όωΗμλ”v rPΏQΣμξ•Β�έφP Η>²Ζ©ΣΏ€ΝA™.ΜQΉx3ε’+-˜Ifλΰύ›©sM(‘§yhΣ¬Z Γƒxh\Aτ€ψ�ώ€½*σΛ Dc9ΫΑij-»ΩO°ψω΄\‘%‡γh-±cί ΐwlc›)reκΥ-ƒiεύ4q,³§[Q΄AlBŒY6�zΑlς怇ηFΊ0œμ5ˆφ|‚tSεοΗ¬Ϋβ>D{jlt όΔO|‰{G­Γσ%ςRμ§ba3\ΌωJ螸бg"<}π~ΌΏLšϋΞ43βΆΥ+�‘Γ£^ΌzrB:‚½Φ6ίΜ_4<δΊύ3“²&yKξŠsΑ’˜]‚‘3#¨$Rb�zӽĘͺž°Όξ - `λQ=_,-z�;ߊ­…OΘή,ωŠ{…ηŸ%€ZVΠiΡ…ΟΙ,ηwžs>Ε} ό-ApŸJ¨²όλYPε•Μτ:‹ά·΅ΜCΕR %G$Δ·{—χQ΅ !"‘―G‹οε9οω’D’F9g£6Ξ»6όpz! φΛ_�ρίϊΥπ+�Α/‡ŸωΏ^ϊ܏„αρ«Ζg ŸΞ‡αn”¨ΞŽSšΑύ./¬Η’‘Ν­ΥΈΦ]—ϊutu}σsŸ��ΏΒΧ€;―ΥG >Ÿ΅¨Ÿ΅―ίο_ι89ωύ†_�ε�:}υ7ΒWΎςγŒ`‡…�εχ�εφίϊ΅_^X]^ϊΙα³Νη�^% •χί�.^dΜ'πΎ…™™ε°ΌΉpΈΕΧ-ή€ͺl°@tB¦„ š@Q ΊO°�IΠ£‹³.Ρ·#2Q ‹σσusΌD2ΌϊΖ›ας΅d…vΓΜόYaΐ9Aά™%Οdξη–ΦΒ Aΰή!Š@Ρ½ΊΧΙOΟΝ„εu� cev&,ΜΞΐŸΦ~rQ "•%Ϋ;p™Md@•2› ±¬ΐlq…€ςˆ€R’ΒΰΌQ…™“ %ήš„δϋθ#E'k$XΦΧ K†G ;4†χεΎΦδGΨι�€Z]^Ž€ΟŒχ>~�ν¨:ŽτŒ/-L£Δ ž€δ{N\Ή¨βϊ rΓ Hσ±ώώ‘0KΦ|ƒ� 5�λιφ h£Ή—zljθΝκ^<|ΉCY�”d“³Iφdš5~ Β0?04Υ-«¬'‰½P…P%ΔyݎŠΑ�0j€š~Ύo#οοΉdϋΙkΧ.mΜό2a€x%ν‚^Λ\βY !ΨAyHG—]/Z!αš9�ϊ’²cμ�εΠf”n1σΈχλ]°ΜYΆ ωE©D“Γ|ΠΆ“=6ξ7‰εU�ί6”ό0šušΑ·sH ²Gύ@[/%ǐGΦJπω΄±ΉqΓΪ—ˆ…;‹™ϊ&Ξ΄Se';λŽ€ŠΧqc Oζ|~e6 R‘Αη2Š˜ι™t΅YD)E+BHκDC'l篝¦Ÿ>‰™xΟ Νӌ©ˆŸ=ޏϋ_SΝ:O ΅U €ΉΦ*Λ$$ $ TDƒF�ΩσR_Ώ% M’žO'όξ2Ϋ³@RS³JώΚ=£΄@Νζ}$`.6(‘©R³Σ†―D€R?mWΉφnΟ ζ­�οΝWξ†Ο½ς ŸΑΆtmεy*’Œ ψ�ν£�’ Š’‹*κΛρ6Q+κ‘ͺ"ΓΌI<΅΄uΤξάyωΏrύφ»nΕϊW}κ#π:qπ›πϊνώՁ““_O>όφ™ΆΝβ‰–ΚείύέίυS�ί}ύΑ�ω{GϊG�Χ—η¦ – ή?ϊΜx##Δf3“Sxl† AΉαU• &ρƒoγˆ$5šdΙχΙ²e Ψ‡†q±Ώ³οfκ•—σ€/1< JJ�ΑΤδΜdxόόQ4σ�₯_Gπ™ω™°ˆ˜t―oQ7I–«X"ΣRΕ1žΜ΅A5ί οe‚ιbšhMξ@J‚�άΔ5ΪSŽ)9`πi{―"A£†U^Œ™˜F‚³<ΏΎΑxέGdBmŸeΆ]©½-΅”₯›Ι1k΄˜α"Kΐ·Π,κΝ­!‘%ί%‹·J`ζrG€ λ¬}Ύ‘A2š” Vθ„ iΓπ/Jώ ψfŸc·zόΗnύΓ°)ξk;‚τ4Ρ¨ΡΜ`gGxψξϋ˜GΈW ‰(CšΜtžgΗϊΓέ["bξΆΎ4I6Ά–g§‘τC6πψ475SNq;Ά{œ›|FΌ@ΰg Ίu°€p€�ηήϊ`«J&ηδ;Ή—Γ(§έš5ξθ7m/ςϋC€ElγG\xά«ςΨE] ΰiξB– ΄ ι“θ΅"*€m3ο@qνμR€τ3W.E5Α`κ€ς”v‚n&%*�PώQfήkά―s—%ƒΉG6¦$tP“£‡|ϊε&ζ>΄όΒ₯aφΩ£°67άΏ“υΐ΅Q―ΎgG ΪΓe³< Ι=›}ːν`ŽΦ(Q^l‰JGGs$]Μ�ά „Yό 5λ+ƒOΔ΅Λ\­a‘Μo² ΅΅μ‡ +»GX†‘FbKHˆYy³τ�GkέmνxZϊƒR" ΛΌD™2€™w•Φ’€ΘλΩ^œ`œΚ·3‚M֘βͺ7’pεώΤwA…‡%!‚ΟΎ!€$YωX3 ΔJ2>Χ/giσοώ”PΕ— 2γE™Œφω–V;’­ΗΡV‰IΖABMcN―CΠ ‚@ιυ@«ΰ±ΜLλqΡ ρ5rfŒίAR6Ρέ‡*„΅UR Δψψˆc₯^’ΜpZBζ�Ϋ•A)v>ώ^—~HTK"₯•{ί2(σΗ*ή7b²±dΕ!± œ_v|HϊT(UO0wΙVΫΨQV΄9–§ΐύαΪ˟‡$¬b�nR»~�;ί ?xŸ} o~ρηΒΥ;―Pz0CΙ aΧՈGI*Ϋ!εφ Έ$Βv2Ης„΅ρό£‘τ…MˆΡ4gTΊ‹&₯9ΤKΆλS‘eΖΉΖ<ˆŸΉ=Κ£8Γπ Ιπz‡Θζ Eυ1η―_ oόΔ_cŒι�@)K³& A΄1=MΫ[ZΞ²>ΊΘ(7qξi’™…@Ϋ[Εc‚χε"0�m!‹<Άρ1i‡ljÏE2ΧRωΕ@'ϋυ#9'ΘQΒ™hι ”})ib.ZϊπlaOHDΨV²=ϋΞKΡh±Ζy)™ΠήΩΗΌΘ{Ω]Δυ!­§Α>R�ώ+§€ «+~ή@μmΐπ|Τ)eΞ ‰–<ϋέ2#^ �γ"€]‰�€X rΓ�8zŽ$ν’j­œC%T‚σΣΦΏ¬Ξ/ΗΦ}‘aύΫ†QE‚„*wλ‹/D5“„ι8@4œC‘w@)•Š–Φ¬ή‹γgπΥΰώΆ!kφ0!tΗ/Œ·D°ηˆ%%φT"λ“3ΗzθxΞh*Ψω=@ΫܞΪ€ςYΣΥmKMφ>κ [ [¦Qd-ΈΆ%λ‹<ί²�]@‘Y§εj±³Χε³KC%8Ž ~‘l¨έΉ€ToρžΉΧ kiϊΙ‡aƒ.K#ψe4£ς΅ΒΡ*ğŒa‚Χͺ’LΑ !Μβ•ρ½ocΆΛ}π-Q’‡„€(_Ό{η•ί›Έ°ΞΚ­ΥG >ŸΑr¬ΥG >F ‘ψuΊ.μDό/Ÿ'?ψ“�γ^c2³΄…OΪΫοΎΫBˆ‡-Ϋdσ~UƒσFd£:I/Ξ‘­ΐΘΙ¬Α―΅Ωθ vΜπ™‘e Ϊc ΛλښOιυ0`9Λλ’™°ω/ΎφM²\d–b^zωs1;dfυΜ­ΘύΏϊ'eίW΅5χΕϊrU 9ΟJΩlu«{Τ ¦ΊxύfJ΅m9Α@sd„Ίq‚MkD“d\ZΫ17€_ωΜ‹η€€Φpρκπμιcκ{χ"iP ›MT‰όœ2ρQΎOšj“ψ@Β]ΠΛ€LW^ƒ°O)Ε. jm‘s'9ΘW‘@Ά…Ύz(;€έΪΒ`k+τ„8θη½ΫΉχξ0rώJŠΓπ―�Υd7`ζv–ϋ«†GξΗl(²:l„\ίNΈrν-ΐqμXΖА yLΠNZψ9’ω…EΌGαΒψA6uά€’lΤ8` @Ω�eσMΒsΜΩ:ζΞ’Ϊ,³ζwȈΫZϊBq»f C\t Ώ¦D`tώζ«4+«F30[V@NXχ›'«N0‹Όν )F.€-Ζ‰ §ξ.^ηˆ,d/γ9ˆΑΨ…«΄ςZ¦ e₯ΛφΦZ(χS‰O@›sϟB–`ψί\]Ύ-{GΟ…σ/ΏV ZΙx§Ιψή££‚1ξΑj!,u�!„1TaPa^’xvΤX£™veώ,nΠ2p|‚Ίck2‰yΟ°�Α€‚―*οq(qΩ "Cgx[žY_ža|puc€›‘u³&wΘl&³vnΐ=ΗE§s@xl;ΘΊ ¨$Q)P7¨ΙΌ'ΙX Ύ“€8•Gύ’ϋΒ§Sy:t ‡ΒΦ:%.Λ(?Έv$ΰ”(‹Ϋ€φ,>²§εΎ(–ΡQ‰²™ΡNbIηxkγw)k΅°WΘ F‚ŠΪ@?€p±Οώd"!ˆP'€ΉvΑ«ΰ}ί62Θ<£°XAuQk‡FΖQΐC²»•] :;x>*%φ§χΠ ΙS­5±u‹§έί.@ί‹‘Ρ+Hυχ#©’―„ЉθKAp\δLaM7Ρ-!‹ΟJDΖ—‚ ˆ·3ςxπZ<₯ؚ‰&c]ΕΘr#5&˜ ρAΎd e6 Τ- 'μ³C@xτ;ΰ=š97ŠGEΞΌj{WHQΚρδΡχPCPŽ4A¦y2¬.P"±ιή ©φπφΧ�(όΔΟύb Ο>Ύ�έ|5δΧίΐJσ^eˆ–ηF ΦŠ—ξΉ›2€”7;vΆΑlc=¦–‰)λ#ΑY*ͺ’ΘPsνϊŸ4jrΗڌ΅οΜU’υxΐ9dφ7CιΐπΉs¨6ˆ=¬—Άπψώ{xjTiwyžq£ύλγa‘Χ³cHgG_XΟSŠΑYΧ”K²VΓcΜ7-ΝΩ]X }Χ{Xσ΄L„zλΝοη„ΙyΊΐZy΅’ΧJ›"eΘ`)β@3³Ρ–lPξοδZΩ^CU@gΫdΊο,[kΕΣCsΘφ('Π―#ߌμŸr‚ΧΫF©ΦrŸ‰­;·Φ.Κ`φ5€\ ‰­ –$ΔsνxΖ. ΌžΔ•D"œ…œq―JθQΎ‚Wͺ‹‘³caβό©Okηγ–χ η6CRWSΐ$ΑψΉσ¬=ίǏ 9CΨ[ό.ΓΉ—@υ$ιiY„„ŒW”gπκ�ΠVe_–³΄‰υ%±…A dΌ­7ΣџΗr$Λ›$U4ά lOr© Ή(Y·Ιx΄w²Ά8{2Ό—ή-|NΔΦ—¨τα±DBu€ΔTš5wΒ’ΜΟb)©~ύ�%ΦιnPΟ―Όάμυό &”Œΐ±Χ»†Z&†A£c£‡φo‹τbμi`¦ƒR�A&™ςεωΩ(>­–P:&«…l•L™²aΑΝΖβ<υΣΘί ZΛ^ί-Θ°·φ·’BΔvcΦ‘—†5ʊ’{ΖR} ˆγιψo‡·Φo91dJ™ΐ Α�€ AΣΌN ΗΘ8œ_Ύ™²IΉΖθνpα²ΕάY "ιdΠ―Y£έ 4?kκ@Q` ―ΒEγ΄₯…yδΌ-¬₯'1§�oKlε €ηX’†ϋΣg€9&ΠŒZ;¬ο„†t)‚l •ŒΑ:7ΛͺD?EΠίΒΏ!9ΆτKά³Λ”(AR9v’0ΘOρ€‚zΧ‘e:9Kό-A86;ΘΨΊΜcλιυ°Φ>Mμ”`` vc<8;ω”γk idy ―w@³€Κž*aάk΄yE³ο<ίΆ†Ά…Τ4Ι Z²ΰψ©rύΔv‘¬v φΜξκζ―™ž€Y©ŒΌI΄*ΐζ͟όIζΉωθ8%,Caqe p…Ϊˆυf Υ’#~ hdU4οS’eου ŽD_kςUΊΈώl©Y€΅Ϊ~oς~Ž›‰dΥͺ‹’μγkos½ΑcZWIχ+Ώ·‹‚¦rq>ΘS©7YQΖ³Βϊ?Ζh°δŸ‘μ€"­u„2γ˜Η˜=·ΦΌ„‘Ζψw΅7†!²½­kfƒυΩbννBά$ΩhO ζleͺΫcξm.E ψγ?χ…ζ‚&¬);Χ€ύcφyΠΪΝY0ΔΉΰ΅-ΜΞD/θνL ₯GΔA‘Œ|‡ωeLΉeξzzH†ΊNZρέ8sv”υˆΗF/ΩgJ$ϊGF SJx0܊ Π.9EΞH׏ϋ’‹³Ά½«'l.ΡQbX½©€‘¦κΛ=4”hT}² ΠχΝ¨“ΟŸEσΘ~ΘΩΩZs2v\0Ο‘”2;λΠfΣV ΞΑ.ύcΦPΙϋβ,ΠλΖξ –ΔΨ.Q’@? ίΣς„H KUl»uπrDΙ”έ,Λh`ŒK(QΪ ΗΜ΄³˜ψSΙΎ "Ό~ž½§q«2ύ*$`‚³r/“}ΖΝL}΅άΞ¦¦š§^žc‘ΰ?ͺ­\ŸŽ³jΚψIωŒdσ0I<ΛΌaΪ«jΟ’<>v)idݏœ;Ιν0ms{QB‘ [\χίωΛpΌK9sh)Μγ£·D3duнΗB?έσq sροSΕ$לε>ύœΫ…όΆJDϊη>�Ϊ Θ4φ•qοKήYͺPbWQzxΞ”ω{–Οڟ@­rχޝ0†jνβωsœy¬7J†τ%’ό=I°!?ψ@€¬‹³„shmi>|τπCΆ)ΞϊD$/έΈIΧ”Ώumόεwypύ«>υψŒŽ@8ψŒN|ύΆ?]#πώΩ?;mν›ϋηΏωάμΜΒ―fςύ (Œϋ~ΙϊLΟΝ†™™y1™ZΜmfΰeϋ=k‚'§¦κθsnΦ’1{8°&Ϋ`ΏΒλμ‘ν³­šΟΣΥ9O€#pzΎ ΚΒ•ΕΪ]A³Da<―)γυΖ K'{Χn;Ύ*χΦθ@>ΪΗ·z3O?Š€ΘzVK ‘™ξ‘ύn€qٞŸ ½d.*;iiplοο·Ύτsaβ�pαΦ²XΒwΎω'Θ€Χ_ΫeιŠO\ ¨,‘Րνˆ/C(<'€ρτYΜXΩ9BΣD‰”=Δu0ΏŽzb5Γήξ&¦“p‰?γηΓΕΛΧψΩVLΊΠŸp βΣΤb[†a Y!Μžz aΌίε₯9œΙΧψ{- s7‘kλƒpΔψν‘eUψΏVάθ»;{p§4ƒρ΅\λΡ7P”ωG ςθk€P€»ΊΓ”5Μά©u�ΐ’p·ξVκm[™SɀǏ>ΰAι°aPΌPabΰ«‘‘άyΠϋΊ€ΚMΘ…ι©η¬RζP„ Κ�χΘζJ6€4‚%πeξߌ½ΰ^‰…œ7Ζ Ά΅Ηm\‡@ΘL>—qToΜΗցόŽ� PJex―J’dΦΡ4D@―Wΐ {"fsηΙ½ ¦˜έψ!δΒ.¦ ( ”JKΰΜ;J–H.X¦ ΩΦ ΅€g UI‘켁ΏjΏ4w4;A1cRe~%C€…ρ=5FΤyΏτ~cΉΰΙϋΦ›B2Η±΄μ@Γ:Ϋ„ςͺ\³ Θ¦B"\Ή{7ΌςC?ΔqAU‚H°w5r[ž~ΖϊΡΗb‚ρˆ> ¬χ¦$lλ81ΈΟϊYœ~ ‰³}Φf™λr>w釀J―΅DWχ‘Κ =C΄\Y˜eK£Fΰ~uΤ―2]pΞ­D‰ƒ+ŽΎžG(J\S­Α�(\ΧγySfŸI>f άkξ·υP’Ώ·u€CO> mL_ qlKϋαμ₯›'£lάh]ΊΉΎ„\}'–ΩŒO\ K³Σψ<9½OΤ �λ₯AΞα:ΰuˆ�šF�Eˆ9Ι •R*ˆb§ ξλsΡ-ZΔJΪxVš‘€c!Τ֚£;M ’uΞ*Αg\Φ¬2λjψΒΰΌ'4ˆ§ χ₯αͺλœνG€γ^ί=ύghu+ΰ΅$Ee™ϋ‰mĞsύ�λ€^£=Ι*Τ#|VΩxrͺͺƒ]Ζ΄ΐ½Y«*¬$]<ο,kρ³Κuΰw4Geο9>ΣΜΞλΝΓρΰƊίm(sτπ}φ ΉτΏ9€m…Ο©}ή§‰9δq_­qNNό�σB†χPΟ^ΛΞ: |%�’eγ©2₯HΩΌŠC‘ίaxζ΅υ΄c4ΨΓΉήΗZΎ&)‘‹:ΘΟ`οEΒC…‹―+Aο:O1§±σ?σΊ]Θ‘;ζŒ‘\(·η™“₯δδμψ₯v!)F“Δ᱋‘δ³λΕIst{:4BΓ΄20Ά>εuQ¨¬Μ―°ή>‚kΒ σήΙΐΨΔϊΐΘΔ�τ�ροΞρΐϊW}κ#π:qπψϊmΊF@%Bβ·~«Φπσζώaιί£7wΒV2B‡ˆu‚ib²ŽRqmΤΝtθ6�bj…™ΰ1ϊOΤρχ›<πM2πΗόΎL@uBπ¨ΔΩΐ/g–„ΐ^p`¬ Meϋ�#€Β½dŒ _Β,ΐxςΑ‡dΘ ΧΓ΅W£ωΦύχήGzkeΝz$IttΣ.μ[0ίΙίuŒ/W ”"τ†‰‹°›Γ_~γ«ae‰Μ] Μfj˜„τ’’θDΪ‰‹8€?‹£΄κλΟ Q£[w ’ $@'πΞqέY$₯T‡a|*#s/l#37'xλtwρY~ρ$” όͺΘrk€ΦU²ϋι\ ΰl ₯½<μ<.Υ�’]₯­ΰς<σ,½ΑO Ϋ”+«6hΥ‘ύΔsz-Θ�ω€W~oΉˆ�χDˆ±uލ«Χ@²GaŒΐ\Σ΅Ȉfάήσ€CΝΠωžzPOLπiΛD3„Φί ΆΜ‚.­.…²HeΐΘ1 …t2μσ±n:PήΑ0Y³}”+Σ³ψ'ΜAAρ3MΛΘλΛ!d†Fc—�‚M¨½%Θ/“ΑKQž oFՁυΝ­}@L¦ΙβΩ%A'ό'”jμb�Θ"Œ’z!-OΘ `΅!knAξlVΌrζ€υΉA6Z5ΙDΝθψD4Θ<5ή£ε&ΰ4 ‘e` ,r™Σδ‚}}1šzVͺSd0UŠS‚,o_#ͺXˍ p}ήi3xγQQζ†kMp�‚4οY ΫΚSΟ Α‰–€Iΰ_β»i&RI’�Δ=Άeπ{mήσ>YKΫ$ΪMa}y6ΩΨξPfg…5ϊfaUυ”¨y·³…ŠŽΧα}· W `ΙL$‡ύηΝk˜hίv 7%4α³₯@§ y(H±EιΘΕσαΖKχ"i`ΉΗ γ—‡€ �-,Fπm7‰•ώ^€Υ†β@iΆ{όΖσί‹κΙ;ΟUBž#ώ~cy&�Η¨¨ {œ§TΑ֏'Ψ"s-iΥĚִ ΑΓP£€”a\5qσΪ]£–ίΤ›δ.EΦP…oοI`j‡ŠΒξ>ΣΙ9Fk”fΞ8‰`έ'0“μ -ε J/μΤ’…`TQBYcf» 0wαΖ5ΐι.`x)f‘σ­]΄ž}•se˜zϊ¦οߏ φ•‹ν3ο«7οqŽRΦ„‘\7kΤ΅nΛΐ6ΤΛΘξ;Ι`—(ϋ‘4ΨΨ ΄ˆv­Ίυ»¦ύr]δΈ/AˆH-φK°_υώY—iΞ°fjα[μΔΑ�ցϋ?ΜΒσ§μΩ"€‚r Ο4Θ`φ~T~qώzώ[ΖβΪΠ%ίsΒ3Ο³BsΙH]Aω:κ*I½ΞkW›Ό.rφGI²‰υ"Ι‘μLChψ:‚pΏ=σ£k} )Ώ―‘Jiyq>vŠpμU 4pΆmT₯ΐ!Ηxσ<ό Ψ„ΧρΊ$ˆά�ύT _Šκ” λ(άV9O‘‘’c•Οƒ}”΄Ώ-Cπœpf{ΏŒ…Ζˆ’ά‘ΰ:]ŸzsψYg �g‡δ’ίΫ£Οž=ηQR:Aδu³V[ t_πχΌΪγ^Ω^‡ y>‡— ¬«CήοˆΣ—qΤdψΤ³BΡ΅αζφ³�χτkxΘπ±gCΏrΟ σαφ­¬‘LΨ„X;wn"Ά,žs’ι―kΙWΩ‘ο…$Ή*£ ϋAΣβΞ;qθ%‘_G‰ΟhχύιyFϋKJΕ,ΓD­ΠΟyΊΛ¨�~Ά©ψΙ’φ Œ02όΙn9©qΦ¬Ο²f+”π<Χ^zmηξoύ”ύύKWFΎϋΫΏύON₯GqυΦ�Sϊ|ΦF N|ΦfΌ~ΏŸΪ°5γ―ό�—žοK@΄Ύrj(ΥN€oΞΜ½Α:M‹ΩνMnΆ\Rαυz‹μϊ~˜~1ήϋΛοΠl€Πκβ~ΪBC8=–0`D9•:… rˆΞ#)rŒΤΎQ°ΑsˆxC+οΥCf?Cpu΄‰ χμ#υ[Z:’*@WςάΒ!J ΦρρKΌp-μ›湚*…MS‡kIΕΒΜT”ζN=}LΦ—žπ( ¦.gΫΊciWΑvΜά2Ύφ ο¦{ΓΨx Ψ B½‡Ψλ›ϋΟ“οT>|ϋ[aρΕSδώ¨BΘ$―@(QU–LŠ9Ρ#‚Ίtπ’\½)Rx%dP €7PΑ˜™‰vΞΦΆςξGIχ:�tλlυ΄8B>kvΪΉeΨbu²Δμ΄­-•ρͺ2Ÿ˜ΘŒK�o²g—―\Žΐ‡[£ΥΧ™ΔΊΐόή{‘L ΞF˜œ,·SMς¬=ΑŽχ2~υ:ώ·ΙŠ.³žΣ―a˜G6ςΦ½W!˜:PΠ°žΉΟ?ΔΈ B‘rα˜5¬/G“Ρ0‘@]ΕAΌO”&š’ιcPbΎk¬ο �Άλ@T²„{£’δYΥΠ‰ΡΥF&“ϊί oR§ΨδΩQFΜnԐ$C©κA-E‰™Δ²^\K‚{aΒγΟ>i=hΆΠ 0Ϋ1^o;ϋΗyΆk€D•­’›C€cθΌ?o{J¨Œ€(g6C¬Ή’-ξšΠ~Ρ–Ÿ­ΘΦ-S0m»Τ2T‘(αfwŸ„Μγ1`+f»°”NdΩηQ΅ΐΈ5#…N°ΏσΝo…}kΨ]KhΨ*HΖΜύ―ΉžΧ³½ΉΑή4“œg(9'3Ϊ’W‚V3Ύε#ˆ8Φc#RsΧhš5ά?p&4p­“S΄gΐζ‘[ΞΑπDEΛ`sš9±Ζ²"†ύTέΒX§!(μξQ4k&Λ;pͺΚ5dΪ8ΜgΘAΪτ ϋFBϊ··½ζˆ[( v6V™Σv€Yν›―½Ž*₯ “CˆΞ %C¨cΝ;ΟΫΣι5ΤδΜs€ι© «EΞ kx‹ŸΫ]`rς1g\7ϋή9ά„θƒ@\\’ρgΜXGΗgΞ”X¦ΐΨψ§_Š5“€Τι ­πΩt:ξOΆS[>¨τΜ–0h—`BυT€ΜDT‚Ε΅[@qeY“sΔ±ΗωηHZ#%μ‰_€,λR�€›kτΉΩ„ˆK¬Ϋ]J;ιxγψT-χjΰώ5δ³s€dŽδ›g»DίΠPΈrηNθΓϋer²€’¨Ο<Ώwgi|ΛVgίqΎ ζΙ²6zϋϊY?œΟͺ˜Ο}ΐσΚμ4{ΐ�Φ%ϋURΐs‘ΉΫ�ΩχmSΓžϋ›Œ|άg\(k«¬w ϋΖφΏή£†›MΒVεΓ1ΧίΡΫ₯‘"ώ ”ΨHθ¨JΩX…ψY†4΄oAξ΄β tΜY9?3Γψ²σγ2€έςΜ"^ .PYΎμ<α~Pι⚏$cΣ†9‘κ©FΞ›HHr‘pg,²¬ύœ€ψΞ]I&Υ~>ό0ΎΞ:čvΆ™Ο-Κθ8λ%βl­μΏ%}τAPat⟐2mΆΌ”΄ΤΘr;UΨΥax„ŽόΌk`ε$|ŽΟ£”*ΦbœhΖ†:­8Žl4ΞHΊν $Ϊ^Η±±ρρψwώ³Ώ{νξX' β΄Χ�SΟτΤ‰ƒΟττΧoώΣ4ΏŽAbψκΏxcauύ―ηΪΪ{d™t΄N% BΙ\ͺyMΒτ‚pΑ1‘iZ‚³“Xσ₯£DŒΚͺŠ{d):7vΘV’‰θ‘k€rȜΎT›7“€΄Η�F€‘ύ֏x=ψ Pƒk¬Ώ5k$(ΪΑθi›:yΣGݏYδασΣ/Βςό rOΜ²”cvΖλβ½’‰ΐsui5‚_λKν―ž&»l«Ε,ž lfσύΆΆΩπ%Ϋμ [ΈiŠ.—οR�|ρ<γ€R„u©:aaj&Όϋ­oβύ±Oyƒ²'Φ— 8OάrˆcχD‰σ’ΠQ•ΠE½Ώ$š,˜=ίBρ’Iͺ­Νt7ϊ[,[`pE[(@tόΫ ΑίI<¨δ(5P,3>EΦο1ΧΘNόMާΎͺGJμWΧ{F@Κό+_/Qš“…ΨI–vP5dΒYˆ€‘3cdGεΓΨεΫ6JΈ*‡t™ΖΫ€‡ΕhhιyρθIxp�ƒπώοэ†½ιf½όΰψφgŠΧE©· ΘΓ8’λ[_^ŠΧe©CμLΐ=Π�³ˆ™η‘@ή€*$Οψ©�κοο-τ k F_²Θ”O\»wυ D0^'~%‹“Ο£ς¨‰=.(.An:ΐlYŽΞ}K s;’€ΩΗφϋ d˜d« ZZγ Ό€BŽLύ"*£Ϊ1j4e”WvΘ©±†c—Φadaž½‰aζΩύ’‡œ9ν*J«‹‘‚W?™§Oιτΐu6rΆΈ�T©ξ‰-2ωœρμΪ^Γ«„=ΧΛy–‚Πογ˜’’•Ι¬WΦ¦½ξ‘}:.XZΤΞgI‡5@oς•d8ϋ™Ž0l+χ―D©R bΣ³O₯»›σ›•ΛY�Θ½”)Sp�xVΊά—ͺ„μd£?A•³©Y΄½ΌEΩΠΏ¬β±ŠmΒ`žυΙ½peφžg•ŸU’xͺ^쓃ΈVEΆ΅A9ΓcΙ]’υ§κAbœ‡A©,;Ušν3gΟ(ΓΜίΎu;Μ³–YΣΜkί3J΅†$Bl‡ΙΈXΖΰšKπbmƒKΎœxVθΙy£ D5‘₯(¬΄πν‡œ‘{ΛΞr8wžΞ„ιΞsΎ(y}>Όε—Έ_H’ςvؚ}6f^„©ΗiyΉ³>tώ�o^~ν‹Ά_δ κ_υ¨ΐg}8rκ_υ¨ΐ§aTό½Ώχ_<{1σ…₯ΥURάK Ώ*όf'Μ΄μ“%-yRφ[CβkζΔμ·M΄šqrεΤωφχv†A€«έ@νˆν—.]‰lΌ‚  ΣθΏψ‹ΏH·ƒq²7XD³&³#ν˜:Εf›r΄uκξgΘΙv!!_˜›¨Ϊ:Ί#Π2C–€δ0'Ψ.\$Γ& T‘ΔωΤσ€Μ¬Ÿ†Ψ˞{4`²Χμ»υήΟ‚½ δ‚a5Jε˜κjN‡¦*ςHš ςϊ:ΫΓφ)h#Λ²Ž|Ώƒή‘Όέϊάη#ΦΧVΘXQRq˜=�O0RkονΦssφ7Kά5Lη²5οΏC Θ‹άμJXŽa0 Ϊ30Ώϋϊη#ybƒoύΟΘ`!a¨εhΝՏQΪΰ™α˜Ω.Œ“œΩ&Ρμͺnέ‚ΥΚΓ‡,7@ΆΚ?Θ*[ŸΌi…ΔΈzχ5ζ €Ν2cC&–Œ› R‰­Ω�vˆ‡Ρ‹—ΓΝΧ_ ˜Θho­Πή„Ί΄ΌΒl1‚άƒ„‘lτΠq?ΗΪ0 Θ‹“m€ƒ`δ% 7»»‰ &CΆ_p{jΠΖ~S* ¬±^?Ί°šlc) ²μ§ IΊΐAίΛ\”{Ϋ†0Ι5'’?¨gέ#]f_7Cd™έ?€<θŠ5ώŒ0ͺH֍₯k;;tΠ‚Ό ΐ}οΘPΈyο% ‡β5>ϊ4| #Υ•©ιΎSΘίUM¨0,YΠqŠ€Υ2ŠmΤ:ΦΉF}³έMJZ­‚ΆΝ₯y²ΙΈδΣΣ–{QUΐΠ,�Θ5€υ%poϋΥy"Q"Α–δš]Γ ͺFJpο[Ό–λWχβ\ |φ! œg3Υ)cΫ–~‡»toΑh6A�­Κ^ΦΠNΩ£Κ�ΑΥ fŸ Œ‰&vl ₯,ЇŒϋe}CswΘ ΗίZGΞΟkXΚ”cώK”Ά4Κ›ΨS ¬£�Ξ^@Χ*s•Β•�Τ{eΙ�Ϊ&”YH”!σΌ§ΰΩ—fμs{λ('μuT(*{.ήΎςψtΜ<^<|Y3ŒΓ!ΧPγJM‡όIΈKTτvH±,!¨0%²αI֏ž$�#[¦yώ{ύˆ5–£δdόΚuˆ1<_8§ςσ-o�1ζ€ϊ§mU΅BF™ΑΞ3/Ϊ<ωωˆͺ ΏΌΌh.ΕΆ½-쩎¨a)a,YιωμZwΝΈΖ‹ΤΦοRΪ‘*£)―²"Œs戡ZB‘ ²MσMΙLIεϊz‰θΑpΐ8ξ2v{Œc"FsΜ4s}ڝε˜sΊ$™„ΊAΕM#λ²I ϊΤT’V„ΌžϋA@SVU2� Υ<ΐΫR+?TrωΊ{tηYžcΞXΣμΦΈ›­0υ�ΰωβξψy‘Ημμ�Δυ¬ΚF’B"Τ5mɈή[쏑3cα֝;aΩN&άƒΖ₯«[qMͺp±s‹Šύ v9“r(γc? €/HθKdπwξGBΦs[Š„; σt=Œ�2t„οή0摉Ο¨5.9ǟΖ\;λBΣDwα>»<9σΎύ �ιίύΝD"D―ώUϊΤGΐΘ’ώUϊ|jFΰώΟ�Όψgό� ‘(x™ΨD‡v2#¨‚iƒ›uΜνNΑ"ΐ…@�LP;ςIίrΟAΧΘp_ Ό5qKσσ+W�’Ω6ΓBΦ‹Ίs3’=ƒ�&j…/]Ύkpί{χκƒ5™ΚĚl]ΛTJc͌Ÿ9;²(Ϋζ}Χ 4₯λV¦M–R°α—‘ΌAχΐΠp FΧ©7².άzUΏ ή4Ρ²―Ά`rα,6qΟδHU†±Œ‚ŒRc ι(Αu=΅ZΉ―;·�†3gFρ/ψ˜ δΓπ”:νMκD @5ύΊtηnΈNΆoš~ιλΛσ\£ώ }΄°\Ζέ{?δyΟ$@pπΜ9ΖWs€€ΗŒίζΪ"­επFθ «ΘΦ [ο%ωά‡DΝΠΩ³ψ#ά fkΐαόyxŒ<:Ejφ― ιs?uοαS<λΣ“§j3ε<ί Φ,–ύΛ­SVΚjG "ύ]l1Θ}š Ψ;:zγ\o€j΄gWΐY@.뚐τ ΘU›¬“!^§{ΓΒδ,χ½ξRŠkΖr…S€^ψ‘I>ρwhE‰ 3³ΫO=y?žΚυ—Ιΰ�p³&2άg’9ͺ l±˜p~ŒΝώYb OEς„kC c¦-"‚ŽYG!q =8d?xϋ[a{e;€HdhΚΌ¦q| ζ}]Ύ-½πΊΝdZ―o¦Zσ0₯Ξ–΅¨ˆ-SΘ—ΧK30ΰ;i ή\@ΛΟXΐ< >ΑΌςiήΝψρώΤΨ‘υ@²¦]ΩK ²™zNΈQσ3ΗΎJΗ9 eiΰΘyqOωe›7Χ?O`.Ι&²wmqgiΡ ΐΓ{3Σ/ΘiοΖΥ »δŸ]+fφ‹HχΝ Ϋ!Δr³‘Ξw…±Žm,ΩCeΖ΅m}Ί₯Fša>{τqΨ }qγΌ4 Ο0–17„xH” /μΒΡΩΡΓ}Rz±m§2ΕΜ₯%Ÿ”’δ¨έηνP βZ\λlXΌΦ’΄έ–«CvR±.ά’‰*χsΰ;νοΗ\A\ h#ƒ δaψ4˜E‡ˆ`Ibo€’ 3ΰ§₯DŽN!„έ ₯/μΩΈFX{”,Έ/ΣΞ₯iκΑαρπ�›Φ‘αΕ³iZv„£$­Nw(±βL³Ϋ K9–x4κU]Όr3|α‹?Kη9JΦ1}5œ»x…{γΌ„d:Α/c›TybΛ³ΰˆω–<ςΌpΆS–Τ�Δƒ•iΞΓ$U^Ÿg\lY€Τ,n@@phzθ8Έ6ΚΌ~ρ€r*Ξ»‹¨ΣψΥv©š]³&]γ~3έ€m|J˜o ΐωωΩΐΒC—/‡ξ₯q«±αΎ„k%ΝΌΛ›υφμiηyžο7oίd/q†/†2ΏίαΪΆΧ¨νg�σάXjΰ›ρ%Ρ) œ1»Ν>Ρ‡BUή]˜> °]ΣώΉΗΪ‘U9“p{Ά»ίT’€ΨƒGμ‡>7*ΛN¬λS‚Β2 ;”Y³HβΈDΧ\γŒ�Pυšcλ>‹₯Rά“η gf< `UεU0hŒf¦.XζΩ/Χy‘1—ΨRα:Ž'\³ώ/Ϋk‘΄”œΣ P^^圀HT@1)ζ₯³«£]φ+ΠΟM½jτu°cΝζϊ·Diοχ‰?ˆκ‰Cζ[ΑN ž?ξ;‡XBΕ@Ηυλ{ω™ΰΎφsQ/‹ ͺ†Vφέώ;|Ξ5AVλƒΠΡ7β€ψ.|sŒΟί!vΆVΒΓοΏξοΟ!ΑΟ�λ₯_ϊ·�όw~γτ`Š¨�§>υψ,€'Gύ«>υψ”ŒrΒΚ?ϊο�»fηf�ΡqΰB©°S¦NfIςΐ ΅€ΔΐΓ@Γ`¬#ρ#-₯Θ@p4ς�Ndίkz‡“ΓŠύ¨­7ϊΡEΪ p κμT`@ΫέMopξ‡ΌΟ{,‘Ή#(48ΣyΫ,€#Ψ7ΧυWXA�ΉF‡λ8sυόJΏ+BΝdΌΜ’KnXn°6+§ΔΦl}”&D)?5Γο—=ζ»ΎΦξ °Œυ”[ž8Λ'Άf—B ΩyΩAKζ8 t"υ¬’Ή’YS±Ύ‘ ‚?@¨'£&Qš+&$ θc½C?τ Ρ`ŠΰrΥφqψŒNœ£—ϊ-ܐυRW~”¦„Fo+^‚ϋƒαΒJ.ƒjAAYFۘύαο…ΧGJ°k$»«|΄ot(œ ›³‹Τ3oGcGkUΝΎΩjΛΰΥ π'ή–›pšέ *Οmο$«]Π8ΦΐΖzp~'©£βD‰|ΐyξβ%Κ^„‡ο½KΏΕΥ°”3f gΆ°τοf}3d[,ΧB+ΐo„υK?ωΕθόώήΫίΟ~ΊΫ»ΙtΜ395²όM€iE9n“YpmΩƒFLΡ4�3XΆ­ζk@ “εΪq­ίΨ’¬‚Œq_�P˜EN»τƒ8ΛnΘϊiˆXΨG•λNiv–.’[ΖͺT XΒa �ω§{α΄•#χηˆ8\©7ΐ�ΜΈ€hπ₯Μψ”¬r\£,œύΡΐœΫΝΒUxϊ>ώ…{$Σ§ω›†eό‚½Έ {Qή‘`Φ³36χΠi‰ΣvΊ¦εe׊mAwώΕ{σ:܏ΐ@X&H0[?€βdΧύΚ{”+±θœZ¦£ΩήHΐp Ά§tΜ bl¦πθΑGΡ¬±J¦vΐlΛΆ,υΞ’Ovφ·c J ™h3�^ͺ ΫŒͺ5ω{Ό�.-7££=Χ$ΑΈM)‰€£εΝqΗΥsΐς© *EΞ₯„[sͺY¨$b<[ΌΗS5 η γ`Ž+[pe»>AΰsΙ p-‰xνΆ·;ƒRgβ�Eˆ³έΈ³MŒrn;l fΗάΟ!k+Α=ePei}˜Β³$lΎΖΎ/!‰oδZvρ%Ψ€,Ψή+“妀D9»η ;Γ6­ΆΌ,p†‰Ζ£“?{�r£rM=±Άμ”Όͺβ·°WDκΞ8›αՐ0’FNbΕ5')εΈ§T±>4ϋs�μσσ"Yx ¨₯&ž �›MΞΊ]ΞχDΧΨ™Π�AΤ‡Ή¦€~ieƒυΖi8.@~HܘΡφ\u/]Ύv%\Ήz5‚ιjCΎυˆλŠ{”φΌvoΗ?#˜eόx�$™χΉ†ϊ©3(α!±• Œ©°{}Z»P^AΩ…Γ³C%Z$« 5ΔtΞS°DͺΣ"πE֝ΫΉ@%J’³Ε9π3A“R»φHB°{γΎσο~ynσΓHXΨ6S5ždsάμOοΥΗZfδ~‘τv?I†;ΏšΡΊ6UΪ]ηšV&!ΣJv^ΰ=’²ˆχΨηΎ'ΖΓYˆψuζTTχ¨’` Byq%ŽUu_žΟϊY�V@Y"™ͺb€‘ύ”εσZ₯Α1€ˆδ…ͺŽ4•@ΠοΒΦ—is©ΔŠ₯dn\P/c›ΰ¬ ”KρΉΛ`ρnό‚iu>Ž@8¨―ƒϊ|ΚFΰώ“�νp}ρyΛΒμό—Œν ZΜ hŠhΠd$Έ=•ΈτYm`νΟν]!ψ>"°9.“U'Λ³NΦ|{ω1 ΧΜ‡Fk’JW+d[V¨]]Αqš€ΙzseΆz(πN(ΨφΚμ¨$ΐi&ΕX›χ"hΊσκλα2=’'._ΒŞ† hwk—J L °c†� Hΐkϊ•' !Έ30ώήΐΪ{zφd*'Ϋέ)+m‡ˆ8&c³7³²ΨΩ45¦ιeαΦ­»am~’@Υ–b~G»aμΒ8qΈ�Π,Žή³‘««?\Έv ψxxτΑƒ0;?F/]]Γ<�–δΛs3‘›¬Ύs•,_’`ΆΙω�ρΝ₯9;ΐ:TI{¬ω%ΘΫ`ΝOγ‹πb†¬ώ Fp”S˜eΓTρΜΘpΈˆ_"[�ΰ;οFΐ @Ν™‘gτUdθ"―Ϊ@‰{ #1$QPƒ ‘ HI ΤξoAˆ0�–uŒ\Έ³JhΝΥήΥI΄sdύΉύΤ·7•·KΒπbρΐΔ90·τ"ΕυϊšΫyΘ‡ o• δ|Ž%—.ΠEγΚ-Z{±6Μσ?―λT‚kŸyqξK“AƒώΊP’φ¨p­I@ΏYW FœηώΑ‘X"P$»ι=m#K ΣΔδ‹Π[F!Έγe"ΘθΫ‚�¬Ύ GΚΪoΧLPm·A‘­1(Ά'γΉMά{‚š’$'¬!Ν,ΝhCpνdΈ0ήΑž’χ•­θ4ΊΣ4ΞgΩrP bφQYΌ_ͺΜͺjZ1 ©ΔH$υx _Z’‘tˆ?οΑ�y(ήΗ’#όb:Ϋ Ο3Co‰G›ΜϋD•cέ‚…-ΝσUyp­l}A›@ΔvšΞƒmύψ!mR7Β‹'“Θ“gΓ³>«S³πb‚E^?Ο[V’EςίΩέΕψ3Ξ^§σΖ�Μp»7Vf„Άi<ΉžJ ŠyΖ8Λ~P…ακΐ—ακν{ααGΠZ“ΧζΈvΗγ Ή`αγrΙaFψτL`’ xJμTψΏβNά‹{ —+=V$Λ\ηeƒγc‘ΐЈ�μkρ}Q™AytΙγ:«ρΈ χrΒ8―Rζ1ΓΪJδhΙΗήάαŒΠηEΑΊ@$·9ο,-¨Ίά'Dί΅«€uΔn HK? ͺŒs Ϝ PaCY~JI08vƒ°“…ͺ χ£ΰΫNΆAtΨ (ΓΩ§Ή€j"Ιo•[ήΏ{E’Μη8f§eGžε#–8p]ͺΎN_δΚƒΨA…k:„āˆΎ5 t±8„DΉŽ·„Š˜ΩΉiΘ:‘ΨΨΑπ²bΠσν€Ή³œG�ΐχ;%„kΡάΣ9²$bΒn Άύυ30^3χζω¬oC#?;a�<½ΊΨ·vR5T: σPkgb?γskŸφ£[KΌΦFXΑuΏXYyεΗώΖί�ώΑ?ε ͺΥG >υ8:qP_ υψ”ͺƒπ+σΛ©§O�4ͺ’XH' j‰»b?{‰ _ ©±”ΏνœŽ0Σd«χje½M<ΟlπΠΐ`tΐnCϊ\ ($‰Α°A^#5ή±ε «B€bπj–SΉg²‚θ3\Ώ}χχdόk‘pί ΘS ͺr€C³ŒΊvo Q,€.ΝΝΕ Yƒ6Ω`Ί±••y"E.‚/A@ŠklFβ \>όχي’gλΑ/‘γ’E….‚ΉV�k` 3Όρζ ΝkaψμDθη΅‹τυΗΎˆŠΰ ¬3ŒœΏ@}?ο’ “Ο¦a�†$ΐύ�Νӈ6—.ΆζΫΓ’~#ωύ½­08v6|ωη�&€Δl,Ωxω‡ΏΛ7 _’ΘΎmΓxξu—ΧW –3dD{0»rι2 eΐ=‹6Τ)9ξΣΦšξφ7Ι¦�Z S¦>>–DάLk ~O₯χtγ d@‘ΰήήvΖέηl£φ0Ο‘pˆY8ˆ€Οα!’v>nέ}Γ΄ω~†Z…ΰWπ£jb{SfŸρ΅vZΧΜ<ΊJ(!qχ·ϋC+?»ϋ�η _Βκμ4€½A77+ho°%YwΆίΣΏBΠ§DDƒ±TYΚRrτžΧTO�H ‰’&¦ ― θ‘Mž] όmk€]ƒζΚ' RIIΏd x•yΒλzΟΆ6τΊOΈ%Η§­2{aΆœTI‘4[Οm™Χ_‰sλΌf|€‘c+I†DžΧτη'9Υf€έ[ΊΡ¬«ˆΟ'ΓyŒYω‘ Θ“Τ©ήŽ‚€™M[0ΊαΌ^η„Ξ~˜ANQΙ:ΰέ>χS=ΓΌ.­B—¦C[g/ HλEN[gw‰Ž§ζˆΊΉοpOΫγΓr8„<άƒ,²Ξ_? ;342!ƒΊΘF[^ь3{Ž}δ:<„XτΜpnŠ\χε9φ³7«/Ϋ₯₯aύaζS@«Δ»Ήψ™δέ#ΛΊŒ«|"$ΓΟZyžJΗPμί]+>Wr3ŚpΝj΄ηΩ₯Y€dQ”‹ϋ<ώg·ž„ƒkBΓΘ.­Σf$α±δƒη²`B ± sΟ,„πΠρζ€GT -}”+­A±VQDyΦ•θ�βJDδυ'‚FΦXͺ… ―%’ιθ>k’ IΏJΧ!ΊΊΆC=;槞w<�΄τBί ΤάKc�<λΝl·d P‘ϋٍ₯R=(y<σZynτ«p\ΘΞ ,%VΛάwŽnͺI$ ΉHζ?~^€e- γ;nΉH»-ϊXLz ¨>’πΨ…θ΅d€w Φακžk—�E…Πό�b¬§/νιπηΪ4Œ]/-/PΆυ"v€£ 5t€Z‘ΔS–οΩ�γΧ/p.ϊwΫ2Z―oΉC“ΫfΞδfȎ4Ÿ7%’#½I\άΏ>0ΌL$�όΣϋςσΖz;XΆ#A¬Bβΰΐ­·Α>Dšλ’AŒδ—τg4t2_‚I‰€NH&UcLJœ[ˊτπύT.ψ§­NΧQΞH>ψ|Ι‰_ί}’bΛv‰ύζ!ή»(/ρ³PBΛ1³ Šgγkoώ₯'΅ό½ΒY²‰ ₯€‘―³ΙήKΰσ†tσ,v ;OžQyΐ’΄κ€δ±δH₯žI―΅ΐΈI�ω:±TΕ=Ηϊπs½“Η·σ™ξηΰξS―Ν8+ψ¨vhΘQVv,Λό²·¦§'ωœ[EιrPΈσΪ›�λo�Ξ?₯nύ«>υ¨ΐιpRΦΏκ#POΫόή�ύΗ[>|» ΙινβΡQ¦ŠDίooϋ’RͺβS©ζφ )c3Y€ΆΆ| κ4&k&coFι1xfœΆcP‹Δ'dd‘ZΗl?@6©βΔΔ9ϊ‘”)•Μ‘|ε󯇛wh―‡$΅Yϋ”ΦiξˆYš °™ /.Μ\ΥρηnβΓ Θ„π΅¬!ΎύκKHωΣaqi&ΆiΛS―~λ•ΧΒ@ιΖ+/ρχWΓwοΏp@fA~‚aί΅WΉN gh³G€J0ΥΥή�^;.œΧ`o΅ΐΖWΟMΛΘ†qΟHx/κہίύϊ7Β³η3Τ8“νΘζΘd^Ύk›yŒ†W^λΦΪf˜zςΐι/γΤOΎΊ΄DΦl<τŒ †ο}χm€τs56€™±€œƒΐž‹eδΑ– γΞ#OήŒkaf#7ΜήφΦ1³Ρ`X©“w"xί^ˆnŠϋΤu\²F‘γΉ1εuRfaIΡ5œ,±ΧΓζƒά‚ «J₯σ€θŒ$ΌΗψ( ίΖ|°`)Θ›©Ά4€R%j’ @Žγε:Δlν,�‰£= APάοΙ–D:U³ ν€'ΞꐘJžͺ\’α^§_ΘΊŽq ‚μ8pΘ:€œ¨ŠαηΓ£ΈΜίΌΙx/…ɏN[˜ΥXΣΚΘόΆ4s,HM°žφ z ΰν& ΐ{»p ήν//(%F„€Ωn.–ŸCŠp­ͺβ}sUΣχŒW‚ί+‘O³—�κήyεΠ)Φ¨zƒΩxζŽ"ΎιΠψ<‰΄c:Nψύš ›.ͺ;Z0γt>ΌΙ;ž( |‚η˜•>vMmΣ  �ήA"ΘrΨτ0Ι� ^ΰΣ‰κΐ=ΎˆThή—ΰ>.^ΏFΖΗ#ω³‚"dZτΣ²Φ nρeΊ™wΙ.ΑϊOrλxnlξpζtAl΄qΝ3!βFήGΩ΅σΥR&zFπb\!ϋ›ϋΤ¬|μTš+3g€Ϋ„‰cbiL/]šOŠ’²Gi|†ρΞA^5₯λγΛ<5‘έe)±ΖQππΪͺkNPηQ ΠΪ΄Θύ:ΖfΈ9lx<,θ—Η΅θcΰ¬q=]že�±Βΰ”™_ΛRt"Ir/ξEΛYφ–gΟΫζΠʜΩ”Ιt‰Gπ―R«ΐxΟB€rCrί΅ ΉΑωœ₯τI�πeΞέvŒ\χ φ6P(ά½6‰ΜΨ‘k`ΫTPšΕR"© ι—p?ρ~M¬ K]’œƒ±›uΓƒq½tr>«`°DΖίΉ>5₯ΤPΣΞ"{”Έμ°φŠ%Φ+ ‰"οo·—θƒΑhHp ΐ2FΌ = η(g„ΧšH±ΖX ό…ύΔκζώ·ν"ΓZ’E=α9ξyŸρ)r6ω<J]vΊΙ@€Iΐ»—£’„�ϊλ€³SΕ›† ~ζJtυ χ‡Χίz3ŒŽ‡EΌ5Z0–=C™ˆέ‡ΊΫ»Pž-GO [8j‚‰xζV2Α�°<‹ςΝ³‚3ͺw ŸΧΥOˆύΘgeT‘p(°Β x$mP!0Φ‡NVY?]˜Ž‡±«/αKQΗgQεp“³ ‚‚u²8=Εyˆb㘠‰ί�‘Ÿώ₯ρΏρίr˜ΥΏκ#PϊœŽ@8¨―„ϊ| GΥΑρŸώΕWίίZέόxm}γ‡ŽšΛUJ΅ Μ�˜Ε'ϊ&θ±χ7�ΫΤ¨w,ζxŒeMόi†λsoΌ‰ya7’ύ.iλ‘η=φγ =k%œ}€δ«€“u²Vz˜1κC]πƏόH‚PƒΗ ΐalΖ ΑhGGw λτR7[bF[`ΉΊŽ<·`ΨΪωٜ[wPɘ8έzεuά�/†‚―-^w`λ„ϋί{?<{ψ₯ΑΔ„I%§€†ω™PέΖ¬μϊΠ ΘΪޘΓτοδϋ[ό}#<ώΰν0ωτAΨ„ Y’$γΡΣ…πΰϋ‡ΉΉ%κ‘Sԝn†³w^ Γd΅iεΘ½DτΞό Jru‘_xρ$|3Fj€Ž-2ͺ‹΄ œ_œϟ=§w‘l$¨„ρ·6G–ωβ[ΑΤN 8 ½ŒΩθθΉ0;=Cν>�^Ζ[ξFΐv3 €AdΙ΄ύΤ›bΦN2ζ!ƒQ&lVWpffΟ,Ύ% 2–ž4AzάύόG ΊΞ5q1›k ͺ+Ή@SА xή% __^εu¨ƒ% �0ŸΦk2Έ©a–W@&¨UbΜMρ©pχφpϋϊ5Zίa.ΉΈpΪ�€)(LΩ[]gσθ³ΰ2J·@ΐ,¦’ϋF²½0‚Π" Wr ήΟkΣ_ΰcέό�τt(:ν AŽ™oΐΧΨΐZ–ΔΠμNυŠA±ΛΪσŒP^Γ²λ΅"‚Ι)³ˆ*qΜ&{]&χA„r/c.©b Ξ‘Π‘ΰY›nVΠ9Ixνάg‚ηψαͺ,ڟKH˜…·ήέΧ0+μϋjΠ(i�F9ŒYh³*C”εk\ΪHίϊlηΣ1c2βŸΗΘσ HA»γͺ’AR蘡�€Χ†e I怨?ΌόΪΛ‘˜Ϋάν!‡^™›Ψ9¦˜ ²§”œGΗx@ƒ™XΟΑkΓI6τΠ2υΪν+dΓ!΅ΨΏ Sρ>5‚Τk ΒΛς^Γγc&w― Ψ,_qώτHρޚP+ΈΖ2(,:)+:{ιjψΰώ»μεΨyφƒ_ΓηΕ{ζlŠqΞουu‚`N€ζcŒ‘ŸΤΟ@zcνԌ•εΑ£Ω{kΑϋ8ΧQ?₯Xsv¬πkόΘ*γŒ@)³ΏηoάΈMΛΣΘΔ€9sγxσšυIδθ/QdŽ-ryHι;ΒA$‘@ Q@…αœ ΫίΰlJ²&£Κ#a�ˆœŸω·$Γ5W˜kΞ'1‘d>ɞκ@‚ίΔ:M’pΈqοe$ω΄RδΎ78―(ŸPΥBdQŠΓ˜ΨΉB²K…KμτΰϊuΤ™Γ*ο½Kϋ[Kϋ§Ά˜Υ 2*’Έƒc ΝpΗΠ^aou-¬ΝL‡ΥΟQŸμОrς₯:½H“¬Ο%䁆~Δ”WΌϊ�ː/9Tb³±tE2Ξr=̜kŠx ¨–<ςΜ²δΕ’•&ξ?%iΗ\dy>·ΰ1ΒΨ „‚ΰσ>χ8W8;,‘”πT �«A²ΟΩb₯H©l‰ %I”V՘ΙJ‰‚¨Jΰυτ°‘`u|cι{Ζλif¬U»Eβο„ΞάXΗηΡιސΣ1ƒη“δ@4†δΆ4«ΖυxΖΈοž-�cχ{$Xˆ�KrDK|v.J–±Ύ F(ΓΠ”Τ±Ϊƒtφψ#ΪCπ™‚RȎžΙ¬-0ήƒUηΥ1rŸ«’XcΞΌ&ΧS$Pθβz�―Go!??Έ]>›ω¬EΕR- μ ›‹³aϊρ‡anκi˜§LιoΌήω֟σY΅»όΦ~φ?»7Η›ΧΏκ#Pϊό»πDͺΥG >ŸΒH$Ίφ'όΰΑΏ�K₯β/δhiV%Ψ:!ΐUl¦‰šYο6L³7CΘδK›˜�YŒΪΎΟ·ο܊ΘF‚Ύτ+΄$ԌyΧ6™Εϋί}‡` εΐμ45ύ»αβΥ›d‡ tC ΰΰhψψΑœΖ—cλΕΙσS°Αϋ6"Ωλ‰=ΊνΎ`;Έ Ώ‚­]€γ "MρS/ž…Gσ j}‡&Ξ†{―ΏR~πΑ‡χΓω ¨ hο}χݐJ<΅ί²�·ΒΪ ~ϋ£οΣ R LΖͺeφM?$x^ZZΣΌn ΨΥΟ9t…ο�09E{,δ½…†BΨ;ž έηiˆΚ`aeΰ #XΝ"­έάXΑε| φ‰° 1Λ•oκ$e fkαdΑ:rmΝηZ¨%Fwfƒj•pνξέ°²EΝ4αm~D`œΕ<­ωiW5χ•m@­ςz¨KνŠ2ϊΝ…Y‚ΛU‚r@/ΧάF΅sΕ3γgc„$κˆ κ‹ sψ +Α}o.ΜΫύ’-zθŒ/kὬΛ5θ­$Μ6“Xβώ¬6›UKY~’μ˜“ 4›u dΦxLυΦBφ[Η­“ύΩ ηBoGkΈ�υ?"XG ˆ8D­’C]!€&BσoΫ€ι"γ‘x½ςκηύQxο½ϋ\Ϋ)@>­Γ$y4hF·”K“]Dφœ<άC~N6ž<²Κ½’)Z&FΖœ 5"τš­?–(p=5iκΘπΪ-1π[u · ·Η―4€·"]y΄*”‘žNΦvx2Κ¨Δ]mak 2vi潁υ[5Ϋ )Πΐ}ϋš³Y.dζΌΖž:’ΌΔšašI= kšjhε=Ή φΩjΧ‘cшœχ’Χ%πΦ₯_Y΄Χ ^Tg &IqΝΡΌ Ӑ₯δΐq ψιιλX΄ŽΒ‡ο£Μα΅ μ 3fΑ›Ά€³^]‰΄γUƒθ²υd₯@CΓέαιγ’W(\7EΚR$4†Ζ.Pz@ι΅μ'­”I¨ rώ3Ό–χ-ΨυL1;kωΑch) •ίόœ,-γ/iγί%pόΚSV’·Š μ4£KΦ \γ “, Vi7ͺq4Δ+ΉG9ηΚd ΩkΉΦ&ΉώpΌ6`e½γKbιIΝŠ1“ΛΉH"·sFάΪς<υϊόŒύs\#λ πR"ξžr~ς”oX*Β›0�¬aU Ί@²όΏμ½ip₯ιyžχžΰΰ`ίχ}i ½wOΟΖ™‘†€ΙΨ’Ως’Ψ‘’Jδ€βό°+©€ςΓUρόΘRQEI•γHqbEŠT1cY %QRΐ3===Kοn}ί—ƒΰ Χυ‚t)΅”�…< {Ίœεϋήν<χύάΟύd‘`”ΊΞ±¦ŠΒέnβ�‚#έlf8{Ž%NΈ_Ζ;ΆeF² b‚7bξ ³Έ― kδ„’™ έσΟίk“aςφ!]ΔΩΐΨHŒI�X2Δj#γξXŸϊHžqc{G…š ώB‘†΅κοχΎ‡Dž*Ά<5"*λŽY;v‚hκμ=Cœ�ίDxΖάre”\­Ζ9:LΚςωSΕώήBΑbYΡ.e"Εε΄Β€ά&Η™%™#ykΫPUX~Žgφ9#%12‰>8[Ω|Φ%Ή§"ΦΒfɏžLΖξ,=C—BϋΕΧωl›€°xΜ8²Ω?‘¦Ήι—―½ϊΒSχ`α«0…(ŒΐqπGG£ποΒόΰΐή`ο�051u‘4Δ9’T‰h΅0™₯KΜ+Λ¬.oŠ£Y½΄΅β(ηΆΫͺ&H¬<Τ’Νxφt”@γΐ₯:œΏt-ttυΔΆkQυό�Έͺ£«—Zίέpλ½›±δuTDiαƒwߎ >ώθVΜΖYƒ!ψ�”kδΒ₯ΠΩΥƟ= ϋid�ΤW—64Qb@«6ˆ [.ΞΣ.L9ι /ΌΜc{Γ AΧ&ΎΖ”&sΈΉ$šΪšCΐ;{DπŸ%ϋ7;ŠΙ*EY*Ωζ­=%BΆšΪ"^z…nœϊΞY@? δΤeτΊξμk'C³Ού~ΙpŸqψμ΅B2”NFΞ_ 3OŸ:ΒU€ Ζ•1De d%RJωΉͺΥ'€ I•ΟНbωΞΗΰƒΊν!j8sO>@ς<ϋδcΚΈ…§ΐΣ»wΒϊό$ύθk‘t7D0S@Μ‘ΫηΎ/_{.Μ>‘…ήά\ ’Ήˆ„ΰ*=·ξ 5 \>+ `ΆV(νaδψΜ2.₯Υ΄Ήe-&άͺK,o’eP)Χ=g\Ό?Ζ΄ΒI5\Ÿ‡k¨B2Ό_1{Ι΅ΚQ#Ιή) ‡œ}η/›Σ““oGaPωtτιΩΟΆXκ°H†JsD΅ΨnCupιϊ°ˆηΒ2`©sΓ—>�ω0|γΉΠDκVκΫ;zϊH¨”Œζ‘ΓkπφΡGD™r½†ed_[ΘκΌπκ+tTΐΰoς1’φ‚2₯₯ΙEγ0 FJcΙΒύΫ·ή₯τ7ϊjΪ:’Υ�ΡΌœ Ϋ�­νέH}»cπΎEFςι{ΩJέΥχθ‘,ά1°vx{s™ Žr ²\fK£άXΔxjΤĎHΝλlΑ³¬,ΐz^kkq €C{Cΐ―%ϊ?Μjjk›Nƒ]HKIr€RσΎο&5λ:Έ7΅w—’Uήβ‘§2JŠcK2€“™οζΞnΐ^3―;Ζ8 α9γhο?AcSx0ώ(4Ρqα,ΔΠό<&hSdkyˆzς�ά™|}³ήE΄²+AΞ4†Ά¦V@€+η―0›1xœδυ‰f ΊΝ4kΘ¨ΛΎΰΔ>j92±―CV—g Μ‚λ·‘$^Π³άεΆ%m/Y“‚�"Α „•c―#χM κά;lžΔqQh¦tηςsΧ Μh―‚¨3«nΫRΧό\€ ΘR"½‹1§₯.Ά\+«©`EγEΑΡΪ rjΐLάΤΪΔc|›αρƒΡ0;?C Ϊ»±siΤzΨ&οΠ΅ΕΈνCδ΅υ΄„η^ΎNλ½sΡ οχ~λkα°Τ�‚g · Πm©„dŠcθΨz―”όhΚιW1ί«PΖ]Γγ­ωŽ€P»Ιؘ$­‚Tqm:ώNβARΗ9“Θτ9ΦΦ+{·ž�{σh66Λ9vΘυΊ>εBvχ¦μΊΖzΖ -Κ— Ζ€‘½ϊ™Ο~!\{ώ:₯=Νd‹+CίΠ™Π?<ΜΨ’pzόR%Ξ}Z  6i-©9_9DˆυβΞ³Σ KΣ”ΚΜp>Tњ²§ϊšπΪ«7BgK-Δά}ΦsΘ½θΟ°ΟΨT�έ’Ήg L³―w!ΰQAΑοSμeΛ*9gXѐ6�nΔ�'f‹%Œ˜«Κ0ŠQώ˜Υ6ΫΌΎ΄ΐV€”ƒ?aΏl Λ@N³ξχβZ# M‹Δ½Κy ]Ž!#Ž9ί™ɘϋN₯eB₯dΔU%9† ―Q*Ϋ»ΓLRϋΟ_ 3σ a}n’O™Ό&„‡ΤΧ7„—_ycΝLΨ +Μόάt-εγ,`―©xͺΒΈ΅Šζ‡ϊ½ζ)ž'©ˆdO<_›”@}ή“K)„ΆςΥίghδ<χPAiέ\x†―NsS3Ÿ³΅Q©°@išέaτ0υsV%‹†œΕŒ‡Δ›₯|•¬9M%�\§»|e™χ}H™mHΛ΅²ό½ ‘Lrκ„9“ΐ�朐°˜€|ϊϊο�^xσ«o…g ”₯L³ΦŽΗ�Ÿύ™�Έg䡉Έy �)Œ@a #πΗF @ό±)|[΄ψςoœ|γ;Ώ1σξ·ί£t}ε2νͺ ’ 4sΗϋQώh”' ά  (#ΘιθƒCCQ^ipΊM`΅ψž¨=#Δ₯GteA2fgd=Aw‘E1@ΣP©΅εfjš°lΝNΫ’ο€@«6Τϋ3dΦ{”˜ΕΩ‡„ΠΥή,Ο£'Β½§ΓσŸω\ΈŠ ΅uτ₯ΤDšΝ™΄X"εβΙΔ?ξίG"»ŠΜΏ>‚žκΖκ0xv !2c9^{wi8* Α‘A±�zƒ:Ώt“ί .»ΈFΆω„L]ͺ ³Η³gΙ` @ 7Ι|m�Μ`Θ΅ 'Έ%ΐ³}α1 ΑlŸnΦ;f+‘+—¦19γ>m‰g–DΘθŒ‘E†ΪG6_ΓΏT;d|ˆΡ`μS™°ΛW�β”Ύ©Ϊ^š$b΄Εύ—’!$’…ΰΔΪ]=™ @x9ΩΟˆž]ξΗ,iMC:\�τ‹1Γ½2?N[=²cd}Kp’ίήZ&¨˜� 8m“&˜œ˜šΐΔ±4΄ ž|5αAVŠ1W:¬‹όs¦j"‰^  iρy訫 ŸωΤ§B=ΩΕU�Y΄’±ρ‡¨Z ž4(΄δACBΕ ΆΩ[’ζw)ξςΚZXτ™οWζ~H¦”)‘‘%ƒ|D¬³~€£‘dΫΐ`¨εϊ�€ %Ω'σ4!Ρ/e�sΘ’σάWŽΧX*iΧΛΠ’₯�ftΣΜ‘νοΘ+ΖΜ^ΰ =1IŸN@Vδi•ε)Θ‡"2ΚUΣΦcIy„Ι(& HΘ@ β°EβB3Jkͺ‘l3ή>njhžΜyqŠ>κΌ^΅€-νΘ i‘D₯Ω£ό€λC₯Αs¬―cΗ1‘π)2Σl6Ήέχ–°zoΙλ’μλφ2€›Œrβ ‰"£”ΜΎc<φl"<›_f­bκΙϋI ΆΌ� (Ύˆ΅­,]‘±©*œŠΛμ�|ψΦ~;ΤpVτφuFΚcΩ‚jƒRˆ ω$±vΆΧ"‚₯γΡ» $*Λmάj$Žτ±P8°Fύ}1ν%νΐΰΉa&WPh©Δ1{Qc;h†}Λ}‹)ζBπtΜkΫY‚ΑΓtη²Q΅ψ€T�0¦e*\x―2ΖρόωK`Ϊ§Ί‹|–tυ „3Ÿc�i„5a [Λ.Σ.U…Ρίώ�“‡έH@IDATpυ•Ο†ιϋ†Ω§Xω'‘ˆι¦lHŠΧ_{1\8wΎ έjšΪ#HƒU υ‘cψeO!<›Γ�Œθʏ‰κ*$#·Η4»£0(ευ,~5SbAΗξ'Ε5(IίCTfώ!yƒΦθ1ε,vI°?T8i€[Za"ιφέΗ₯Κ ”ΛΓ# 9«λμ3ΨIŽhΐhλ˜Κ™ΘEΗσX�£ΆΏ74’&+°;ΏΫ‹΄hLb7‘Ν³ΧŽͺ’(…ZΓ>ΰtƒφ}ΦΣSv“ΩCΑ•ΪEDΏ8ΏŸe\Νςs†qnK*1Χ ζo’c΄ ]Κqg―Ώ QάΛ<Ν‡*:X^WΖϊ—p”0‰₯"2l\³ζ…ϊ9d ,ˆψΊΆ…υ<8AΖΑΡv ΆψSΡP―M’k3ς˜³O…‡gyTqKPqDρ±G —ei’βεŒC±€γ|‰Ioˆ*v–ΰ0|N&ΣˆχŒζίr%%#Ο_B!DηŸ‡wΒμ Ÿ#μΕZΜlŸM‡±;χB~ΟsΛ²)Ο"ΙˆiΙCHwUv)ΤwϊΘx~ZΒ‘zδψŸˆι¨ΐΰ Ρ�ΐs-»ƒŸ ν8G�”qφsƒ5‘UIΥ50ΐ&JQώχ,ΆεΨc–ΆΦ^ϋάλ�YiγΏχΞ/ώβ¬°ΒWa #P?9s…―ΒFΰ|ήxγKΉ›·?ωψΑ'7?^Z\ΌJ m³mΪ²pizƒπ]‚-³6j;-΄ΙŸ[’%Ωό––70uΚΡ6­B€Œ‹ ·Š ͺ…‚­²{H‹M•dσ”΄Ϋ!Αvnš!Fi.`(Ίώ ²Γ1{¨“?I‚�"΄ͺΕό»– cοΰ`hho‘MγFx6>4˜–f7oΎž=yJ‹Ώi‚Θe<@Q)RX‚9ΥεΤ½λΔ�ή;o‡;”IlΝΞ„ lήΕΫԘα’G6&Q‰€™6ΐ `H3© dΐEEΘάΆYkk1CφταGȝ1K$Θmλ¬VQΗέΞ]FzΪήƒ”wš–@• Nπ�Ήφ˚σ0rε2δ=εΙξΝcrΦ?p†¬5οΠ©ΰυ”ΠΗΎο΅Άf›§ΝΩώ tΖ--•5JRΉOκγ–f»ϋ†γ½μέΩXB LπuΊ0ˆgwΧpλnΖI»&ͺ1ΆπΛΚ’Ό~cc³0²Š±ε! άHΡ ©­ξ�^{Ικε(ɞ}ΒRSΟ5nσw`'εrL@¬zEi7™ͺpΒΨΜ@ψL…-2·›˜«­―’₯Ÿ_£™ΞΘ~3³™½T*τ <ορύ&`θ,ΞθϋΦι:ΤV f° ˆd”€Ϋl™ΧΈŽL|₯Κ: ¬iίσΫ7o…[ί~’Œ9Y—VJdΙΔ™έ?ζu2φŸwΝ*ƒ7C(yε½0@–€ƒοy‘u@ίυv‚Δ‘ε!–SΜΞN‡l‰Uε\ kDω½.φCgΟ‘ω§ ²tΘΩKQˆ4P·ΌΜ’ψσ?Aq €·Έͺ¨P±ΗR€+kχ-₯š?ΖφšIΝ"%₯4–νΔχ,Ž™cή›½%‘ TήμΆε ϊo”A’TΧ5ϊσ(~π εΓΣGOΒ8ϋeτΩTxπh4Ξ«{ϊn΅ ΧΗ|Zά'‚₯Sσ>²α¬γ] £αWς$΄5@ˆUP MyΕ>χο= ,cΛHΖok ŸΖYƒΈeαΌ κ]ε]³’–‚λτνUίsζ\θι Σ£#ψ’ ŠζžάƒήΞ!w ²αoζM)ΩȊ Y^WγN™λ  ςν ]4ͺ9‹$12yjκyL kΆ”ρΦ{bΥΘ*€IϋΘε°„Aj3ϋΧΊόήϋFΌ—c]@§Ί‘Œ{{ύ‹#΄\ ]xt±gΟž/=>�c=–dέϊΓίE0 ωWU k¬Νo[G,qJ0g₯5a‡³s~‰½@fΨ«ΧόLQαΟU«₯8Wv!ΠβzηώvΆ$9ΨΛΆΝUΩΝωήϋε₯X—zP<^Υ†$Ή%eξ'U!ά}˜™šΐ°΄ώ­ψs�ηΫΡ‘°lα«0…(Œΐχqπ}‡₯πΓΒόΰe ΗoΏ{{rialszjβ‹FοΔ–˜+‘5@’% Ϋ&;σδΙ8FIΊ£λ’ 8 #Ÿ’fΨΐΣΊπ:‚ΊώΎΎN53°΅œαθΠη(Ή$ΈE’ϊC[³μΦΦ5 4ς|ϋO[-ώ²% mη ލ:Ρ „VVVύoGUΑ­?|›φ~α,£…ύ.&zG<'i†Œθ0GmtΰΊ•–WηϏ„'βώΆΣHc β”Κ#ι₯Uέžzœμ£Ηl™8`+@1Ο½5ΠσΊ/œ:._Ώ>όφ›ΡOω4γ``)Q±†${q–rudΔEƒΩ#ΐ@)Ί©ϋΜY‚ϊ :5|p©±Υ60ΐ `θ)~‚ώƒΛ2ΐc†,μΜΔj €>ΉHƒ2²Ρ©�ΰ"F™½ΞγfΑfΖGcΛLβΥ(�­.ήύνtΓx-\€¬˜x&Ι,₯Λ¨gHxίΕgŒ' μ%tΚP9ΤP’°ΟkWςο^~ YϋjxλΝߍΞπ%”d ’wΗj�]LΦέΰ؞ξΝHΧ59ά"‹fΩΔ .μΫ›ψ8ΜΞ6ΞBΖ‘ξ?ΔΘμ‚@ΥG· ‘’e^‹K«X‡w‚gA‹Αl'\cl3Foφϊ€Œšΐ¦ŠkT œ~Š2ŠEˆ»tθ“! 8dm0χJ³υGŒοΧj$m&›θ0BvW@τ]YΌΔ‚­ρτ΄ΨόZΒΊ‚™€ψ ^’+ h°οΌCœ«%@’2|{· Όr¨1πŸ mΝM!c€avLFTυ‡ζ…‚³Θ 2Α„Œ€=ε]5*7tΧΟQg,!ηo!ρ\sΦ£ Ζ“Œ8!lΪ%5#»•0xdωk·₯«7ξ­5H5ϋΠgIνο1Η‹xŒΟ/…m@—ϋLY·χφ½/οέΧrLκΎΏkσ’mΦq‘ςgΆ)‡ΑΏ‘ͺŠqΜ¨8ͺf―Dο ΐ”gˆ$SςΠvަ`ΝΑ<Ζ‘Κκ­λ5³¬9—Nς1+Ή’OƒDΖ~;Ή‡O�’r#fΘͺ5a;β~:ΆΟK’ύͺBYrνωkjajy9Τ#M^ž™£ ŽΈοΧ' ##[œBΩ€ΑNMmMΘφPΥZ‡ϊe)1 ”5WΝ8”Σ»> πŠC[gwθξΎ€`{{3+ο8άϋn#ŒkΔJ4=Δ:nΦΛδ‘ΐG’ΔV0ͺLœC‰…<€“-ΥT)˜-Ά¦†k>N�J ΒΣNΧ0χγZ>v�Ϋ:{"9'Θ°Dcυ·ΕτDq?ڊΥN x"rŸnΦTόβέ#¬κ!Θ³S”ΖδUΡ³{J’ϊ{:›V�A’ΟγΜΤoa^ϊ½rΛw˜Ε¬υHԐι­!Ϋǝ±°e©¦“ 3ξG’’ξΛuXP”;ν€ pβœβ±–ΗK�α/qdΦ—χu=JsH@n²‡ΜkN(y`{Δ �‘ΰZ/)Η’Bq�ΤΫ³Ωkk‹aφΩ}“ ŸύόOFΠ{°V\bssu5‡Ύ†yΟ�/‡Ι‡Ϋ7‘wO‘ΡN†)ˆ…Η> ’%fn²Μ›Δ5<άDυυΫA#Χ_α<<©ηVTΜΈε5¦έ•4ƒΜ«g�4Έ£ŒŒο1—…ˆΊ|ν%WΓ”8QcΟk>½χ Ξχ§Ye ³Ξ ΙXΟA_Ο}cϋBK=”ΫKξžπ»4νž1 ΠzΊΜφœέ‘PP`kΡφ'θšssG[Ο. …2φŠΏS6Qϊz{ΉΞΪ°81 )FιTτ3½‘•9]₯Tae˜ε�kΑΆͺ‘}΁υωιΈ–Tdh*j½λ&α΅s_Ϋ¬“φώ³tΓ8«bg†b§‰±qΚ€&ξί‰~2υ΅;s<οΤXςˆ5Ν…FR`cyž²†Uφ%=xj”Χ³ΦY̻ākΓύ²«ΚύSWί‰:ύ%Έ\Φ¬΄ε¬QΎ‰δΗ>d·Ÿ…₯œ΅Ž‡«άϋ²€LRΛNξ–Ψf²Go XzΒ=Μ¦dχ+ͺΨp»‹Ε7Ν”_d0ž{Ugž•½ψmT@„IΌHή3^JΌ_μC>/hάˆGGžρ]Ya½3 žnB Ώ\ώΡΫΰ₯K,‘ς5Ωΰ ϊ9U‘0αg₯mΥ5ε­|Ά”όζoΏω “ ρ… �)Œ@a #πΗF€Σ¦πUΒό0ΐOύΝΝNN>)I§R΅›+M'� k·‰ͺ ͺ*ΘΒ@*XœΚ-+>ΚgόΓΔ2ρ͘bέ—.Ÿ'W)βDΨ\_έ==αs?ώΧBίΰY2iΫaqa&‚cΫZ‹­„Ί‰Μ•€D/„ ³ΊΘ=’Μπ όU H(aμ€Ϋτχ2FE{k».LηβΪ:Ϋ£τΌŠk΅›B AνΩǎ‘$ΌHΰ·©“'#”%ΣJ|3L"ΥτΝ>sαjΌΧbβ,3’]d œΘ O¦Γπε+ά3-㦟QΧZΖξί…X© ec_τ-¨ΑΨjuer ³Ζ3Ρ7` Y·ώ£Ό€‚ €8Xœ›ηZˆϊgΐΑό1`‹Φu%€ ΏeŒ½>fΊφ;³_:©ΧPk!Zr[€M£=ξ΅‚ξ ΚΊ[:{cfΙvb~OΐPΕd°�Κ/ώ/dsσαό‹Ÿ€z ηˆyυMνOϋΉhklΉNFΜƒθ•΅₯ΠFυεW#Ή°00΄>@θθξ^J&ž$τžι ―^1Β oέ3σDΉYκ©ι&A­�5΅‚ΙCΪ@ ˆΝzZ|L<Ϋνδiy‘P]„β"O&Ϊ92“Mδ ±Λ}!Λg<Μ€qαΗX�}’¦«΅ S7Lξ˜ Λ‚vΙ°o�U eΙ «8ζΪ5“”άPE QU_ίΜ:j@‚Xξ}ό!{A#Ή3#ηY#zƒbΉ•ŽΟ!λEΠuβ½RR%ͺΞq]’LYΞ‡―­ϋ| g‚%?[μυbΦRm=­'!Κυ ΰ1e,ˆΊj”p“ ΪfcyΔXLŽ=ΖY~υJ‚°#z62ΆΫ|3πv9δυPj<Ή�ˆ6–·Ψχ(‘ XΗGa:ΦιLβΩΐ¨‘ρuίs֐ѷek ίIΞΗ†φ>€>¦w$ž―S3ΣΈΩ―s.ΪΖ΄œ2…�HœTΰ’¬Ι5Ζ4ΗώμLΖ½ΓΎ\‘Μδ₯’οaωΝg{4ŠS¨κK½«žuΐ~bι_b”2H>=Pbέ=s[LͺLΰΉY•ͺfΥ5ύ,ΌΡ˜ο ύ:gξ4%P»;v·HC .De�­X―\½ΐ~=@YC—Κrς~EΥ‹Λ³ω„λέίΒβΙR‘ΞΧV%„CΧΩ €{:F0~}gΟ“w^ψ,h†8Ε|χφGakr²vŽυΔ™Αλς{Λ,#P9plΉλIŸʍ2<Žρ:°Tᐡ+!‘fάΝΚg8»œίbH:ΫΩκ!£2Μ’U š•Ϊ.Σ”,πV©δπΦq½ž�3χ°kΤ}`·C~¦ν‘RRΙΝ Qy¨ŽΤ뿐:PiRW†GFk˜c_ξΊΞτ’_ͺhX$ρ1±]$γ·ρ»ΗΉΏ›UύΔ^βάnα³οˆM<±ΈΒzň’r―ΌΎg&*Ι<.Z5™7saμΎtMkϊθΉαΊΰEΉ•=©0ΠΧ{�ΠΠτψς΅—Ύq sQψ*Œ@a #π'F @ό‰!)ό 0?Ψ#π«�ό+»ΏσΥgο Τ�φΔ³G²j7S›Υ4Τ†‹t=ͺ€ΐ['`¨Ί2»šΓ₯ α'�ΞO‡ Οi-NΣΤ{7#₯ςθCΐA}θ€σΑυυcOξ„Z�ΖΧ¬#C’JΣ˜`gia…ΜΨ“,§/2΄°‚ξujŽνR`6˜˜9S&»Cέ²�ζ‚"ƒ*3€ͺjΙ4+w/CΪ+hνλ —^Έ  «•HZΣΞλΩ"2Bfw­—&�LPl>vⴞŽΊπc?ωΧΓ+Ÿϋ™½> γ‘˜ˆ―ΞM„‡woθljjVŠΧ@3H H }M²m««k˜ ’%{”hνάξPΟlCΔ<Αδ.΄Τ%€{k»‰žy.2RTOΫbšYμ"ΛέΤ�8¦iΩoϊ½mz|ΤZ7}°·EΆjƒ! Μ5υ_δΊ0š#p·Ύue azcSwψδ£›΄¦L†΅΅mˆš₯(—·ΊΐKπ{Hགྷ¬in.—eŒ0΅άΓaψϊs$45Υ« ‹ΖVX™[$MJ Ι{νj¬£―"Γ݌Œ»³»#<όπ£0~σ}²ƒ(Η›`6sξν’ΐ`]ΐc (5ώR9!’Ε#A0oΆ/I/‹ϊC�…χGTΞγ(‹@Ω’’ξξ­£d γΜujπ·EφS©ν6ύd@Χx~ΚΝΤ”ΛΫωΒ6ŽΊΖ «¬a)@ΰ(1Φδ’Μ6j“J{Qx φsέ9ώ=Ζ§G™£SS² „A'Ώkθ₯&ΏŸuPΕΣƎk·VώΜΩαPIωNiιξD1ΡΐxpΖ_˜xΐ>@!Ρά3~ΗΘΘ)v‰@�u% °ΤΑύgr ϋΑΦq� t΄°C1ΐΎ2£^TTβ•†Η짝lgŽ W (mλλ§ΓΓ xαΦ†'OOΧC±Ώgότ°c1Κƒ2²–'ˆ"^Λρ,IΊ€θcΙJ± \ύUί΄@Ht’�P¨a7K¦Ψ., ^O b—AΚώ�¦s€-A(?¨€w νƒC¨}Θ σΏbΐ²“°ΑTŘΥ7ΚΈηώΑΑHi2št ŸcνSΪc§ €ωΖ£GŒ‹%FY=(x?―9z΄@Bf87μ“*€`=€Tκ(šo�‘$‰:†v”„[[«a�ruJgO?e6¬νΙ¨Œ²€₯Ά©#‚γ’’ŠSΒ‚sDSΧ2·‚E‰ΛYTKd(PΉ³°³)WIΜ"Ξ„c¬™hUU#j­NζƒG�o‘R©u•]μοΈn·ΈWœ…iΦΈέlJ!z,o9䩃œ\x:ާΛdϋ°vράρŒΓPBΜϋ·ΌDΉΎ ]‚ͺ ΟU1‹½*PΔΚ[œgLΐΊΆφπci‚DΞ±Ώ5_Τ|°£o€ΟΚZΨkϊh‚™‡ΉΤ; Ιωͺκ‘$ο}Β9�š.ΑήΠ1ΙzCtE©‚¦«΄ε¬« ­ƒ}!Ήy¨{―‚η«0°μΝ2;ΗΥχΝp¦g(έΛΌεͺ²μ"Ρ ηζsJΨΓ‚r»φX¦ 1c -p?υڏ„^φγΒΜba�% TΎ¨$R&-ː&{ν|*ω^]š#+efΘ΄"ΆG€άφΚ:sxΔΪ9ν:J%φ*₯η_xYύ~˜ši2Ιφ‘Χ€T’ΐ�“XκΑάΊ¦[ΙΥΆϊ³Όε8‡τE'€§”₯[˜ωεΉ>P―½G/l²‡ŠŽeΜgŠ{ΩYƒ¨ψξ^x»W] ΎΎ`yͺnΓ»Ϊ,‘4+�ΟΓ!Δ‹₯#ϋ+ϊ@ώ4€#οKmω ›�ζ8ήgSͺœΧ s”‚τ†_|9tΣ₯f PoάΦN˜~ϊ(%Όž Ο,»(,γΰψώΤΕίq·εžs©μ]RΦ�Λ΄ΰ€΅a3δ‰w{}‰ίAjr†ZΣεψ°5β;@”S Δάω^  ]γ?Ξ&Ωž#ωΥΫΧß^Zω=#σ °ζq¨WΙ_Ϋ}-q‘4»Φ%?NΖ¨HP  a©L„xΆ?α3δσΪ3gΦͺœΰ«βξ‘m>WxHΰδΜφs~ΘuA§„tmc4uύψ3Λ54 TݐbύY^° `GŠ+Ο?Ο Ε2•₯…™P±θ|ςšͺxτ‡`υuvY3Žs^₯€�ΞA©ΤΠ t‡%I…Σ3ψ"@T¨ hE‘sΑ€f—ΟF_Ο2»­υ]>φ8g ω™~+Όg%-=,‘Ρ 5–}πž$Άd<7r1tuu†Fȏ#ΦρΤ;~NzŽΊΚOKτvp‰Z ”β3έ‹ `άSτwA‘β΄τφΌπΚ§³²ΆξΛƒ½ƒ pα«0…(ŒΐχN™ΒWa #πΓ:oΌρs‡Ώςλwον¬έۚž½RMγχvκϊϋΙ¨ ΆΦ‘Μͺ6h‘ΕαΛ/= …Ήρ»aςιέ(Q^[˜% ]—�άυ«ͺOή WpεΧleY+ΑΑόΨκοέ#@’ξ™@[Ih Nΰσ3sV™ΖΝY λΓύGι dΈΦιl`ίi]ύ­αόΔΐ™xU"Ο>!XΟ“+%3š XΏω΅ί ›SS‘žΐλΚυλDI¨VWb3אφ$O›¨U1±07ξΏ�u€%υςm½α₯ΟώΥ Cz 2ίK―ώ‘†’Šϋ€μmΤ)�%I€nœt›Ή>Q}@Pl–ž‘`έΊm3ΓΈν+ΙN$k ₯¬Υ Ρ¬–@|zϊϊγύmSΒ`Χn4‚ΤRΖΚ±1\˜ž‚  ΅›Ρ™/Ώ7λQՁ1±°Δψ‚kBi5­/ f³m¨SwKW_hξμŒRέ1:!TμͺλZ?dεΈV%Γήo―{ο“{\ή'CFpΚ}ι[pΘΕ”μZ?œFΞΎGkΟύΩ%Ό0€„€ Α‚ΰΔΚ‰σŒ…f’ΖΆ5«fnό. ˜0³n,&)V&MO`κ—5ωΗdJ[ –Ξ_D=± π’žςΔvŸΔς1ΣΛ ‡:n{{GlΧΉGWξ–uΝfάxM–ΚhΊgVNP΅΅½ABv›,ž΅ρ΅”%ΪΐM<ΩΕ.ΖͺŒλ­€γ† s³Λί Yζ§wΰLΜΣs³αΫ·ήΓ ‘ιYftw‘³³Μh·6Ν•;φν2§Η\“ffJΝ€§Re;lPηΞ‚Θ1ŽΏ„e 9€ε€ω˜Vz.1#Ω$ΰΠ0�v₯IΖ ’=UOY@cGΫ₯e•cOŸ<ι΅•¨Rί‹ι‰ν UR¨Ζ¨€0{Ž@$ΦK+ΧNA|”K$π³ZL+gΎΧ₯Α‘kqΗφ€\ƒξω’+³Σ‡€ΏυΥ₯˜=-ε%mό}ΰ·_ΗΦlm+cΊIχ>cΠNΛΏΎAκ»1LBώ]Ό~-fQŸέ‘¦Ÿ� όάG7^{Œ,gHDχΞχL3U΅x.(#ίXΫΌ—k0‚TΐRΧQN+»$γ§€{ Οa{Θ]²Ω[‹‹μa2쌳χ΅Ηλ[F±ςi‹{ψ'#Xw_ Ζ™IήK²Ζυ%ΈΆΑšύbΚdtμgΎTVHh€iΝϊ”³’N‚ίΐΪ‘D2Μ'kάΜΉ­ό�Ž7―©‘«c]0τŒ\Z˜Η€LXόΆ`•άp\WfgYc@t%9%kPξ@š¨ξ‰mF!Ψά‡Y ·vπPαlhEQ&ω°Ύ:O‰D{ϊ€ϋ˜Oχ«™φD΅ γ` œ₯y2�™M~O+] f6œ$qί•qv΄vvΕσtΒ$vT€ς³aanŽωcή<€X“ΰΞ·gΆσbDμμΒ}HŽznΈ£Oρ,‘χoK£4�½ϋ ν§f(“™ <ŽΎ’sGx(DCEΟf6�>~Y"T]οgd&ο_ΜώN0G)JΨwέ]ού�ι?ψχGzGβ �)Œ@a #π§Œ@8ψS¦πγΒό°Œΐ/όΒGΏ�υ_½Ώ·Ί�™ΘνΕΩg=ΩύύκέmΪ/b$X‰ΔΪ ;Ik³Φζ@φ.]{>fΓ rt†DŒ’>0σqD¦γ}Ο»ϋΘζœ=ψψΤO€΅ jc „φ†ΗGŸ"ΰ$7#]¨6+ςτΡ£0“΅Ξd_t7ͺ4ψIψ{Ah ΰΖL¦Žώc˜—epΩo"HoΖέΎx�` Ο8€�υ’( Žiύgvυμ•ηbήΎτfq.\) žΏƒη[οΌ₯΅vθ:ΞAˆŒO< ‚Κb²ΎΚ…UIΨ_ώ„σ±8τ•½Lϊ�dΦ κφΙͺ8–S~α2mΡƒΪJƒ}kŸ•ΔκνPeϋǘ£‹@so3Η\ΨΆ―˜lY?φΤ=A3€ω#�ιn²‡ώ Z#{fpŽΚc=&ΈΝ`iœV‰μ\ୀ֚߁ό>Αμ* ά žέ jQ‹¬Sƒϋα»7 6‘Ρ3{yyΖ=αa7dG'₯&Υ€€•‰‰xηX―οΌ©8ˆ†cΔ―G†CΦ‚ ƒcΖ£ IΎ™ΪX»LφWe‚rcΆΠμHNXV’*ΥΘ±! ΏFGiQIFTƒIkω τ π}Ÿ9ξΥZδžξή0φ΅λf ‚χ¨βΰΐ§’ΐkŒ₯+ΨJ._ΉDYN[ΔQM˜œc¬sαε—?X―D‰§ kl‰{)cΨΜcuT2:Љ%(0Y έ�WηYkΤ³B5΄€dξfθ8Βϋ*ίήƒ²4H δkλ’Ό[iA΅2bΖ"Ϟ�g€ΰYVVR”,�šΘf+Η°JX»lΆs—ΗWp­ε_5MW�άψ™Λ#Χ�χΕεΕσ³σσƒQΉ@ιKšγ±²{ξ]’Ζ‘η^|!z΅¨Ζq―KόΜ±.Ά >υ˜ΩsYωπ˜Ο#•ΓηΟ²NNbωJ)ήueω”₯Α•¨‹Φ1΅΅[‹ͺ»σΨ>΅šV·ωβ㨊¨oj‰₯v–xώήΏ½'½a˜�ψ9!λ—DŒsΐΐxq]ώΝΎ9}<…C|οΏ]s�oΛο,\ΐ3g~Bbvrr+Ž― †=Φ…ν9Sel§ψ|ΎΆŠΆd ͺ&ΞΑJ槚q±νlŽstψά0†™ }ϊβ―�ό?οUψ*Œ@a #𧎧Uα«0…ψa7ήψ…£ίϊκ7ηΏώ+·ή_ψΰΡδΔψ9ΚZ@FΔ�'a %Β2δωΩIώήΒ °7‘λͺου|Χ Λΐθ5―}CØζέc΄κΪεy}ΓgΒkŸϋΛ”-΄…?ό0‚"R†ή€‰l NO_Š-ΤΜήŒΖƒΦ=+ 5ψ³I€U-gδ΅ ƒƒaόιjύί QΗN`Vƒόώ•ω< ‰Ζ°46EΩΐ‰ω\ΕwCKCAk3�τΝ±a“Œc5^««‹±,’±½;I$Ό %άƒΑΏŠˆ²¦gGΞ ThΑ«‚¬%χ¦¬zx™4Wb,P’R?5;3―ρsΣsa γΌ©Ρ±P˜³RC*ΟψpΖ-LΟBT‡V2žΊέ Φ‘ͺgΐ±…ŸIj  ˆdŠ2σ*H ¦‡N eών\2― �iŸρRͺm!‘MΗJpc«G%₯Ξq=¦s=»˜•ώ³κ¦φџ��Οέmhnϊ±/ΌT³±±†šhι;eξ½h€5˜ υoύν‡_ψΒ_ώΦτψD ʐς�Y Kb0Kf΄†ϋ5mɏct*©ό²2”hΨF�5g©H߈ΊΖ6Δθ―₯!ͺšBΗ@{a'„’ωbJΨ§OΗ1ήtΚ€8Λ鍳Km»{π3εΗΓπ…K¬K ;YγzW¬AX’‘€Ω/ΗU"Α.:� Ί4N%ρΌδCOν3[ύfΘΙ ¨KjΙΰš5?ά§Δ ‡9'-Saf„K,W`οδ]Έ?‚ςΜξΊG Ί‘q—°9 ΞΏ"E‚@ΐ+”@0›œ³‚λYGqΐZξζŒͺΐΓη>Ό�€uΚzε?fœ5+­dΡΰΔƒ4]TφηήώΠ70H Ο&g„ŠΫ]nS‚B™{sŸkΥ€ούbYS ϋΗ6‚ͺ•ΚΛ,χ av|‚`‹ω�γΊΈ><,Υ‰ –ΧI$4δΜAIrΪρ„Ηπϋ�ž>6;¨’VΑΪ[b;xX�9!aΐΪ¨„Π²ΛΙف‘051ΖλCφ „ΉOK[ͺX“ ζI/Α΄η gΊ¦ŠώŒŠδ•kC•†ώ.1εhG¬«ΞΰZΦt=λΙ»Ϋ¬aΫ™¦!a-s)£ƒ‚c°M9€&ƒσ”YΈΆΌ6?c,oβ¦!3 hΈΎ½=Τ+œ%{‘ߞ!φΔ>{BS^Ο »Ξ¨¦Π �9ϋc�r t‹R\vŠ1:‚LΗ8„5Ώ,§Ρ�‚b#†sSφWTΘΉ@!v% =cνΒKΖqt½hκΛ²l k©™dh$/8£T€ψ:;œϋ“H­YB>ήyΣ�Η%tΐΌ;§ΆΎΤ�RIKζkμ’�ͺΔ ³Šq+σ3•±―ΕΛθΒΕ ϋ—o\ϋo�ΏtΗ�K^nα«0…(ŒΐŸ6…―ΒF 0§#πκƒ�β›οOΌήΫϊϋ“c£E`‘+=Ε)²* ‹fΙΈA‘Ιo'‹Χ^ŒΖedγ«‘₯jΆ‚쳦�‚ ƒηΜEΙoK{gψ·ζgq©ο χξέ‘ηω 5Ύ48ILΨzϊq5΄:{@©&$ΓNΐΊMΏ…€Ψ€ΜϊZ%ΒηTGՁY.₯¦λ8›­K“a”δΨ'θύδΓ[αCH�„ρ•Φ+Υ°‰¬y-ΰ΄²bφιDΈύΞ{αe²³Y”'UΌοςό|8{fˆVrB–5Έ±v ΨgΝ)‡ήEŽ­#Όkή9fm­ƒΞ3W~ΩΪ›‹ΣΪvζ㘲[3J\€P°ψ%Ρb ¨L"HcμΘΨ›1�­kΆεή½ž‘α_ώ�—ώ§­όΏώ�*FˆωžΎΎΟ\Ύv½θΉ^ =ΓC΄°l/|κΥ•ΦΞξ§/½όβί}εωW�―©ΉρΟ cξ�τΈn$ƒšθvRʜιΕαΎΙq­ΞIškΩΪXfCΦΉΏX#�cΧ©ΰΕ}Λs8zϞΧœεχgϞEΪέf!V Ž™γYΚ9ž=}Œ‰ηχ%96‡‰`eοΓο‘ُ`–Ί�}jλΛΛj8w\[8ζ;Κνυ1sΞ~ˆI؜œ-PkPΩάюܟV‘›‹α/}αΗΓ9�iμαZxRΖΑœWA(κΝa‘€ŒΖ=Λk"qΙΟ,Q8βύ=Gv(Ιρx Zχ3)ό[K@$γžœΉξeΞ2‘U#(χΤψΧΘ@œ‰*_OΏΙέΧsΕτ‘yHpoqνπ·5ψeμ};ψs'ψ2pAξDK–³ρ€σΒΟ„Ξπ2ΪRͺS΅6rνΕx&.Ο‘Ύ€lˆ* •(ό γLΞΗR•Rˆ„άΎέ!˜gz±XpΜψ)έ—¨<ΰμΙl£ΨbŒ[ͺΓ η ²‰HHtUAΘn0_Ρ€–υlΙ†f½–2YV₯G―†ηeΘ�νc―IβPxΓά{Σξ# _TΙψωεΎWΥB\sTΞ±ž$c †γ)akV ƒC�[‚HC@RΜΏUΨh¨xŒ₯δˆκ'IkΫΊ&ωΌ– ΘpžIzH¨•AπκΉ‘d-¦ F\]ν‘�ΉριΏω7~κΏ¦„�ΰmOΧΒ #P?kLχΎ #PΒό«x=;[“''k�πϋοίψΈ£΅σ?Μޘœ~ή»₯Ψ₯Θ±wΦW"ΈI44…±GχΒΘ₯dΧV:‘1#k΅ž;…#�•k/„e|Ύρ΅―Δ,ΟΫo½I°�AY%ϋ΅Ψ ΄vlji _ω�πS^|ύGΒ(Ω₯Q2s)Ÿ ―ΈŒLτξ©δSBΑl΄5ᇬ 2Σ±Φ3™C² ι#κW&OŸŽ…ΥΊ΅(ΡMx₯œλQP”¦&L„ōۑgλ LΣ’’Ί‘`ΪL)ΐ”Ίδ�ά‹Θz­-―‘ΐ Ϋ_Ϋ΄ΩΓΫ―κ] ΛΛqζΨχ½ϊβYဨP`=Ώ�ηPJ¦Œχ(ζg‡t€ #C-²ώCJ4¬γ–ά(Œ) ώτ~ ³΄žπ­oΌ‰λ;Y,3‹\³­μŠ‚›q˜_CV?3Ν{U${�Ίkp όθg?Ž! Ύυε�›¬$²k€@μΣ~ η~wΉ'A“Al `”"“šΒν]€ΉNύο ½ε±Jd.™;ξ'‹ΒΒzΰ+>ωδθΌΞΝοΌeΆ–$!|³Ιξβψ^€ΙΡ‡§m,q₯―¬�‘Ό €Ύξ―ίΌ”‡-Z?κτ―”»ˆμ�ο+1UΓ<^Ί2:0�΄‹Γθ£O0νμ ηZ�€E‹¨ƒ† ™Ÿ£?ϊ 4πϊ]¨hv!*ξ~t;–Ξ<ΎΒτ£Ρ°ƒ|ΊΏ§+”Σ™Δn–.4Άπ=¦€v ΨCώ~ (<μs}QNŽyb�ˆ²J�޽νe~δω„˜™>5$ƒΙ5πλؚ/Ι|$  (oPJ€9Š|†& ζ—qoU/QŠρ^m[sΊ₯――΅±±ωΛ7�©ε+W^{τθƒWAηλ (‡$G@έt‘΄#ʞ�¬nBζή6v©ΥΞZ’ 'γ*°>β{λΩΛ8’dfΦ5ι3Ύ8υŒ6ЉΠΧΡIw@g}q†�§6Κƒh‹7ΛΊ�Ζo’p†ΗΎτκλ‘l¦ςj•L3ν! V2ωJmp¬‡ΤΫ‘t'yŒΏ‡ε3(d,‘*ŽgοΝx&πGXι«Ihξ¦σΕ|ΨQιsΈ~ςAΈ8| αΑ=Φ5{^ΐΨJ[c6βΙ`›Ϊ-ˆ1ΛNͺλšβ947σȘ de…²ƒV}°Φzμ-»·$PYʐ’…§ύIΦ{Žϋέ₯¬ͺΊφnΊH4‡μΌ žΛΎ©¨ F�Œx½„)2Ϋ;{›¨ZŽΒΒπd+Θς&!²SΜΩΔ%VπSγαβ…Λa~|"ΜR†S[ZΎσυ―Q—ΎΜ¦~ž{™~8Ά˜λjΖΙviMψ@¨¨ ‘fƒM‘΅»/Lr}f—f§ikzκqΔZTͺ3¨’8¨μŸ2‡Iξύ„5¦½‘Ύ f½m­θˆ–˜₯<ΦΦΆ„ΎΑ!ʈΊY�9VΟιδΑεψξσo‹ε,ψŸF’0>θ;o}εΒψγϋu›3‹μBξŒ9°˜ά|Ÿ ΘωυY5 Lν{)(―hlC$�Sd§3Μξ {Ϊ[ ςδώ'α'ώݟ…Ι‡{ο½`‘Ε+uπΟί₯[Bν#ŸcύgΒ[oύuβ+p›¨0-zΘ‘+BGwh„ \X˜gnU,@B�fNASe€δeΖ₯Ξ,3�λ€ ίM”DΑ΄ρy΄IΉΨφφΫο…ύυΪΫ …ΊY³°”—τ<*¦ξ]ηΑς(ΥC₯œG6{ΎgI² Ǟ(Bm‘·„{οDu€·uCkΝ]ΐcl ptΆt„‘ξσα7σ«ϊm2Ύ\)]κͺφgv3¨†Ψ»tιr4½ϋΧ‘FMƒO‚bΞIטΩ(¦Qύ€PδŒό$g‡ηnf²~Σιύ@|Zr!1U*μΟ{Ue@xσE Ύ’xΟ(c mjχά§ž’EιyCg†Β1€ΰ3ΐΈΚŒ5|?P˜¨rŸŸ°·Κj›b¦ί’[jxšε9ΗΉH•+tM‚ jdŽ!]ΟΜM²·‘½“σmΜ]hΰs€‚σY³ΔΓ5ΟΙΑΪΨΝ&³~ˆrA_Ϋ[�q$ ‘pTd ‡σUΑ΄Ζs,ΙQvV.έx>TN„Q¬l@ήe!«Ύώζ„ Φ)N ΄Νݏ)Ÿω‰«+ͺW²‹λψ@³�±Χ€T sΣk�Ωm!Ο΅ΞNγ#C«ZΛ'ςΕ(X8c-ϋΘψΉE'˜2ζΣ$�«X^Γ*Ρ :­ŽΟ I=oNΏΠ`@†ΩVS’!»£· ΔOD9σδyκ°<${xζΧ"Ω`—‘c>#ν4‘d[[ ·΄r½ΜˆδšζΗ–‚₯*Σωή‘αφΣ?ύwίϊ£ηΐw/’πWa #Pο;βΰϋKα‡…(Œ#ψG©ώ—''γ£οεΏΫήΛvΎςιέ½σήOaΐυΩeά­»¬q―F�‹± ~p€‚. ‹x|1|…Α σΜ–½ΉSŒd‚l7›ˆuι:ηkή7?Gλ0W€ΩΜƒμrhΖ-Ύη�ζŒOΒ4΅ž[dΒ­έTζ}B Zœn‰ΩήuS­ƒ/½ZΉΎ™±‰0IΠFΦ±” *Ύ7―)j3˜ΛƎn“33α@&CΠUΩ8HΫAΩͰMpVKΖΚΊj 5¨°β{7`ϊfπΈ†\ϋ„ΰ=(5Έ³ΆTy»~ϋd~60ΰk%Γc6˜§όεBΩψΨXή‹―9³†˜VUαIΠ�P†Ί;0�{9΄υ‡―�ώ}+&–3-ζ’Θτ‡Γ Χ½΅ΞΎgΰBB~Ψ|6ω YΧpHΖΪ††λ¦¦PPνχŒQε@Ξ” 2Χ€ ³mfΤ­ 6ˆ6pVŽžΩΑŒ’Μv1Τ]εΡ1ξψ¨ΜΠσΌ"t /ψ»,doζ˜` HΨIπlΚ™‹ηo\ ηΞτ‡Ρ;† 2œc££ξΐ€±o„LγΓpλέoΕ>π,°p„$Ό΄Ž. •υ€ς~”HœSπ‘έ٘ 1GLpΏ5”8ψuΰ{@šΨΚsRhβΑ=2ΨΝȚKΕΉθQΡΩ7yU6––Ψ#*+Θ ’Ύήƒh°UθžεεΜq)κ‰έyΖ% ?oΑ;£˜λxφτΩΘΖ(3ίƒΠ(‡ΌΫ#+’fΏ¦‘ξliX‰σέ�Xΐ±±DόΙ '™LΗ7Ύρ[?ι}•αkbXA¦?œμ#™―CI@Ά’’’eJb,°k‚κΦ\vWΣ8L6ύσ¦ωeCσδ^-.ώέanv<–°Μ²―wζžA6T†ϊΎ‘πΞ{ί E(>�W~O”=‘Ω ϋ<0p&ΤR²΅†·­υ>©ƒH¬Ή|-L³WΧψωQ–=l=χ‰~fq!ϊIΆΤK²f²μ»ή‘‹(WaCΔ:Ȍ *Θ§ξά )ξλ…D–y<ΘΨ’ξΕ¨mX“{ψp¨¨(…Œδ₯YΟ}€δ’$­φΘ” ήK!s2jωg™Ωo@z9d—υγ²6i"δΚ λΈΰͺ‹ώψΨΣPΡΪ >7·τ:±@`Ρ+.(/¨¬£$…θΜ² …νΆzυΜHrφδΈN)p―d±9+‘jΘlΣv@«cΚ$½*ͺ;ΩσK,_• ͺP,Pςd[ΫCΦ§¦‰ΚΫαθāηcn—|ŽωγdŒ$£JKbλHˆŠ­Υ•0Ε�«4M–œ%₯ί±J°Œ΅ώ$fΐν`kFΛ•Κ9—OςzΙΰω‘·Γω]ςꀡ΄-ιΚσ#©Α­„ψ8„ΌZΧδ•Ewχ$η|"D Χ\Q…a)0?KG7Ά₯YyΚ($犘[_ηψΘΦ―t!αρί»žω9”C¬γuH―“"1<ξΙύϋ΄’…ά₯,g“³>Γυ?ƒ X__Eυ‘RK?Κ?ΘΨ_€δΪε3g‚n O§ž½ΟATΏ?’ΫΠ\\Η»ά›]aŠ!jUά”πw4ΝdΆTβ©’:`,U"XŽ χ†6τ½q­ρ`n‹σš΅­J¬’ r•ŸAT•–±ζ³XJpΪrίφΎŸ=ξG/Ξ‰mυV‘„H;9Κς9»Œ!βΉΠΡέ97rικoόΡs  …�F 0…ψ3F @όƒSψUa~ΘG@ Aΐό99ωώνχo�‹ŸΏχΞΧώε?₯/φφͺ'Φ/Ρώ­μN&οΏω»ιΒΎe€]»9hΆg±{qύΎ6~n]Ύ½ηKΘ΄Ωξ4g;.δΌ.‘κΨ#(έ[{@όλ»΄=$ΰ= •Σ"ΠΜ“Ωη —ŸΗo€Œ$ϋύo|Gq ˜iΪΡα'@πεΫ₯€ΩΨƌΰ4‰Μ9‹bCu€ <‚γ6ΑίVw Ž˜ Ξ¬1ηά_Y=RoΝ ”K+PcΔ²…ϋΘv)ƒκν/PΛ�ζ’mΙά±^””ηψw ’‘―§'œ?3ξ°Φ>A]Ζ΅•Qš‘Cξό7ί “(1ΆΘHW@ΤTq,Tg3χm>}r›bπuYJ ώ  OX ώωr�Χϋ*Ϊ}Fί Φou½θyŒͺם`ΐΪeαrΜEe;9ˆ#%η,nΦφk’ωCŠmΛΌDκ0Πυ$,jU%*%φA ΅L P±“Ι,ΧΤ7ήώή~ePώά―ƒδ^ετΨ“σ’{έD š―Yλ�Qœ%3ΊBr0d¬1²›΄ΘΜ#σ·δbgS0€‡%$HΥΉ6χ€c‘b-€ΙFίόΦF2΄R?ή?2H΄£ͺX!{Ι2φšRνφŽ.Ξ…^φ`EθΛr&μ…φρ&„Κ ^"מ% R2bλΛχΏΥ,cΥ>μ³·šZΊ€Αςƒ6J£ΞΏ&ήyΥηΧ”γΜβCρ‘Υυθδ±'ΠkŒ\³π,FΘ Uw@~2oͺό#Ι–aΝ&!v ©g§h-Ωǜ’:ͺL„ΥΙIή[™>C˜–8³SΗ"1©ΪζΠ… e³Μ–ιR ώ0ΎTWU–r"’¨Hž”c`ySΐ'!_<}Xφy_.‚}ΖΆΓs‘„ς€Zϊ^θ·`iB�΄«R—uΚKΊPP ΐΎήg}0?™m揻/eϋUΙσά–9Uε―�΄+ε0”I&²uζwea#Α£8―vjpί§8‹’ k „ ŽμΈΧS*Ξ(»ΘΓT–c�™2S!TΚ炦£’-Ρ$–λδJN­.Μ„�zΞζ1]ίJgŽφΈοΟλTYΑ’ΡkBΓ�8†ŽΜ:ή3ŒEͺ"‰Ξ39ΤXšz6J\€Έρ4ΨΌσuΘͺHJžͺπ²Ψ¨`}§X{ηΎ„/ΌηB…B ε*œiL‡Ο„ι₯©0:3N™Φ εt―‡ίω&'&89ρ? ΄Θ1Ϊb|%™ŽΩ“Y>'$„τ|0`©Βδ”ΰΚΰa«bMXaβφt*Φ,δΨ6νΩ³§αήƒΫ΄Κ#`mm€4?,“ν©G2Ÿ„6#Ήœœ/DΐkKΑ Κΰ,ύ]I΄Ωοΐe nγΞνΫHUσ‘s ?4|V‘mξnλ·ί�Nxxλ₯ΥYΘgϋdΓb)¨5Μz4h(hϋ―#cΆΝίGΰΐ€ ΘμΈmΈ…?x?fD5‚‹uސ(d!0ε<6ΠP•ΠA―ϊ=Κ;ί&¨#0䏙¦ΨΪ‹ �la3�lƒζDQKθ‘ήΆ­»ƒ₯πΦτYKΤ βυHΆ/ΌϊzqϋƒΓ#WΒύwί¦έmΥZCΟΩ«ΟωπΙΫ7ΙΊWΕvddΧ·2«Hq[–\§L‚Ϊ}ξQ&Θ@�`U“43λkΛ±υ` ωy²kI€Η‹k[a…`΅‡ŒΣ£;wYkά' §”u‘šδ™ΈΑ³ͺί{iq>|υ+Ώ©( °O’*Ιξb* ›€·ύxšϋ/ΔΨ\ηϊδS΄?{2Η<H€­ ―¨‘v2ΚΊg³Η�ν²eΝ: ίc&Ϋ±oνμαΪP₯p-�;i΄S0ύS„„fHΒωŸœΆάu<ϊ=μQ#^ ΐqε«E”1¨ΨΨζϋκzdα¬9eβι²2:–²8�‚_’Δ7ΏώεΑρGΣqΥrνͺEτ)‘ά¨Bικ―ƒ�γ/$#ZŒ²¦¬9{i6χ›ΰί`™8Ώv°³Ζιž…aΎςx5”°f)±΄©5L {ΰ“Ϋ·Β,΅λYΖ°­΅=Ξ›m�4ςSΝ2;C7 δψOž`^Yϊz{!~ž†%*f(!’ ,g>=ΜxžuΫΧ―­m0<8z/ο,…rJd’x”³ΎQκ‚―Ϋνb9}’ŸkΜWΑψζΙΎƒϊ8/π9`œ”χ€%G,ΦC€γf•χ!8Κͺ4Tάηg @lύK$@%Oκύο2¦=”υΠΉe€ƒV‹w!U³¬Adπ\{ž„ΐJ�±€ͺΈވuβx–ATδQΨμ£Π€Q/‘θ)QYΩXU4^§Š‰εxύν=qY�₯αγΚά4Z’2ΚΒΘhkΊY„7†¦’šeVΠ‰ΐ}%€σΈgε sNφ•χ#qR@•\Χƒω€Š"ΐ8CŽ"Κ Ή­#Qϋ0ηΆ‰υ¬ΙA<ΪA Œ?•ψD£&Š’„>Gςi}a&d&Gα¨ I0§­‚d.βl±#Κή5 ηυ€ΐ΄=ŸHC’ εo㳦‘΅ bcχΐso9=ΙL―΅˜υη\γ,¬g/�υf³W>OVWΦΒΝ[ο‘Φ:‡š«.|tοvxνΕO‡W?ϋ—Β7ΏϊΫ”ΏΤ†O‹ΦЦ60Ÿ~ύ3α+_ώ δδW BŠ3 ƒ"Κό”€ŸΟ Ϋυnc”ΨΨَ― Δ)γXΒ½T±φ‘ζXο¨uΨg�/{o#y~žχ}λΎ«ΊͺϊΎ»§{zξkgο%w—­lˆŽYmΐK†ƒ'0k $1A¦a†Α‘81‰PΌ•].χޝΩkvηξž™Ύο«ΊͺλΎ«ςyΎ-r !»K�ώƒΥδμΜτT�κχϋ^υ>ΟϋΌΟk½ Τ�V„ ΘCκςPδ •�Βv«ΰ5ςƒΙq6TQ*E™§&ζ�Φ‘½WΖψ ΰ’―Ξc?Δqˆρ­‘’οΑ`O_{ ―ο;Ώυ;KeKZ¨―ΞtF 3{:ΔΑΗͺΞ ;#ЍΑ†@Ιό3Ο·—9ςBχβύ_ΏςΖΫθtύt C0w“= rgΝΜ»Lžΐl{s‡Œ)’]ΜΤΤβ1Jφi‰ψϋοΎ Hw˜I2λ}ώ—lwφΦ σΡϋWMίψιλΖtκ}γAφ¬ϊ�2²v―ŽςΏuΈ΄νP8ά€z³—Sd ΤΣOWΊ¦Ι΄©Ξ6Ξϟ>sΑξο »ί² 6N&SΐVσώ֊Άͺq�’AvΠi )y<�a*pU�Μ¦­‡`8³§Œ¬ΐ2‡ TΤ‚j²‰ΡlΆΧE³‚ ϋp�Œž~ςiσκ[Wlι΅‚dY0?Ώ{™•{?lŒόΦΦ3œ)P’ £ΰϊ„ΌΈε›ΑSτ…'ΓZΩli5Ύ„Ο€7€9™k™υž;kΊΙjfά°e H•­δ‚άŸ~Œ+•α-ρLX―³2ρuXv›q#cΊŒšb‚yQ2¬¨ Θšœd₯ ULζ>ΈiŠ)ΜO]E'/^ΐ©ώ†ΩΫά$γLΫGζUΖp…κ»h|Uξ’EŽνnΣξ:]γ˜eTΛ`’.²όQυ4`„ϊοrA.ύ(DΚPΖ!PλDΆ―!Wup«,^iΊk?™Π2¨@Ά·SΙ£ήτ$ΰX{’ “%0]|τa3Aωΐ›�χLn―ΐ°%$Rw»θN  λ5@†ώ燀έ£€@³ZΦQ8Έ'I‡n£€šΊH'HζΥ‚ ‚|bΫŠšπ}ϊΙ«Ξ<,ι?ΟΨ=0hΙe²5ξz—vޡ搅䖲�€Γ^ŠΞ¬ύ&&^�]BυΡάPύέΐ€;‘ψ|\Š‹|ά/o,ώλ}½½±…}ΪQ’©UΛNeqyH@ ₯B/Θ{v'Q„όΨ £H`ŸΆ…2μS‡–6YweΤ•αU­ΏU Δό”ωŒ`ξΉlΆ<° ·%Χ @΄Cκ–β.λŒ5ιp«γϋ>iƒJ‚σΕΙϊ–½ι»ΓΞXΜ‹ΒjΠΝZΔ_ƒ…bφ–Wm Π^²όŽ2$ΌW%½Ξš ›δΘ”―-yΟδˆGU€σΑ„βΑeNdΚ‹¬ρ ΔκδΜ$λ­Θs·P% °Ÿ0οCEγDΊΰ£THκ¨Κ¬5υR[x|μ^ΚX“±�n³½FWZk5Δzς3_U{…9¬±vΪ¬k 'Κ/$>HΉRzƒ}ΉAyI«΄2*2’ΔδO»μz»ΗšμΧmK¨Κ“C-qt!‘ψ]ž*?*‹4γά•ΚB€™j"ͺ΄~ °V€u�Y…xSW jΰžΐΟB\AΘψy_ύμφ�,khŠqΔ@†HΪσ›Ο &ΫΆž*Wj³gS›¬)K ¨ΤοŠvˆKbfΘΨiAgλy3rς!s>>i�]»Γ™ ‘Ε9_aξ‘0Rχ™ ΏžύΒ/™γ3'PφμΡRψœΩάέ0?όΡ·9ΣbζμγOQ:ƒΧ ϋ5‘4„ωi…C@e ¬{eόΥΎ²ΙηƒJuΌwr-Ηy$ς)ΦΫΝϊΒ›Β3 >7.AWΰHύRF$¨ΞpΏHOώ½’>…ο«λ %¬½Ζ 9¦Ο•ϊD€B2©„�ΒΩδDeαΖΫ&€'J‚%BλΕ~ΞΏΗ[uu}+βˆό;₯Lχ°θΌ�3ψŁqπ‹=�§οŒΐ§ΧŸw4^ΫΪϊ·�κώ‘χϊ{Χώ9u§._€ωmVƒ&:hπ9x +fnή„8X#Λε3ΗO#½§–z o+΅A§5Nπf0γΓUIεΕGŸ@N9l%σδΙ‘Q‚Nΐ 0LΩ7΅-δDͺ�“,+ί= p%΅Wz«JΦΆπο§>ZΩ’Ύ‘σΞ―„B@nŒONQ7=`>ΊϊšI*#ηπΥԎ?«VYΰ%†ΰ6 Gfdϊ’Ι—Νΰˈ/I’$[VΐKZWc5€p—€lp£.λ[ζΚ«οbž†‰] KΑ A!ˆV’}?Fn2d‡– `ΡAΧ…r9ǘ!«F¦ά=qrε�Ψ—dιQέ?@Ϊ=fΎŒ·eKssfπΜ9sρ©Ο“GΖ›ΪΖμ’ΉϋαX%q@Ώ@&muuΩ,ά»gΊ‘ p©‘ ,ΐΓυ•Εo0K‹ ¨†θΏΜχαγ�-Iο0γ¦`u @6ΘϨЁ !id~ Cν₯-@ƒ[ώΜΛκ% σΘ²ιoοΒψ_uκ„ΐ+²tdi­Τ_$  HmέΤζN„†ˆˆ2΅χY<%<Œ—τjy§ΧyψaδΎ9H„&_ΉŸ£‘ύ\Λ\}υ λΐ�φΊΗ^ &}ϊqϊ—Ÿ4 wo™ΕΥ-”΄p£L‘Iζ΄ͺ@‚ΚΓsϊ+Κ€λΠT•GŠΝ/�Μ¬;RΦΚφ—dΨ(r "•„Œ>›,emU‚αΔτneaήΦΒ δWΈWυ§Wˆ^€πφκŠ Ζ*d–Qέt.δ _.b�‰ΪΓΟΊ.πX.žE†oΚVFΊ!<„‹d` (QωΠα,ΩΕϊ1�C&“n“t6 3)/Œ#οՈΛΤ2 Π)l1I„°ς1χ1Τ@ω ֈ€Ω)jΟ%y— V#3.�’ ?«η΄›•M)Ιu‚ay~ ―ΊE0†Až#sΘΊa i_U(ΗQωΡζϊ*™jφ:γΉΈΎbŽ»dΛ2d>Ϊ34ΘΪ\5[[HΪΘͺι―€qθg”ΉΦ—TSγ'Lˆς‘{”8•Ω+R8!†˜ +O³―UrDf^)r~°>•Χό΅ζ|x°f<.™‚”!ΖΞ±―σψzlXpk PξGΖy5L7—VȈγqD2ςNhΆν\zΉkuρΦ]³tkήf¦KHηύD/ΐ� `¨ŸšBeΥΕ³-σwΖDέJθ�`_9Q™Θh›AχGoˆ ωHͺ.― j³θ…° @γZfL dΕ+¨*=aŒDjI= ϊχ@$Δ\s²’Ν–Ώ1ϋΫ<Ώ< \[f‘dΘYΣRa΅1™u±6*" (E`• BλAδ\Γ_Tšoζίω&SΦ67yΞΙXWg™Fω/xΘ"Ξnέ>²ξ^JΘΨΫM•#– (qΪƒΡ>ξυeWΘDΐΆ²σ"Ί΄FσΥC³H‹MΨVLj9›9�u?2 ls.φPξ±'?Λ^ι3―ρy ΗU)œ ρ|ϊlΊωΡ Ϋ�VgJ‘1ύΛΏρΧπT©™[οΏg>xύUγ¦άζ©Ο}r„†mσ™ή;΄$ˆu€Ge ψ"°t-’-hσΤ)€Φ–a)ΨΓ!>7δη£–‰5>ό€4ΰ&ΉuζΩ€Κ>DΧθ+Δg†Gνe”xT^"“D HŒ―£‘ ‘ςάΠ3³†4Ÿ:$τž½έɝΣΞ/]ΉσίΞtF 3Ÿl82;_θŒ@g>έ8K[χ―ύ_]ϋνž[·nύUO �TΣΎqΪ^₯rζΧ^·Š"_„Gώͺ―υΚΪ†Ω£,ΐP©Žχ‘ΡZp‰>΅«d΅ςH1[(Ά^c»ŽIΚZ%Ki%Ό|*YP–KφOͺ­“Ωj²‚GdK―Ήqύ]χ™·^~Ρ΄JHdɚOˆ­›Τ½Y$τqλ‚NœΙ\\�Ό·ήAžμf"¦kxȌNaP©sHvΓ=ŒΧ hΘ²nΡ…aw &`L`ν"¨UoϊC²§’>·(—PF^½ε·W֐ΥRΖ@–ίΛs1-<'ΩΖ"5ΟΤQ;™?β[!©£>ξΚV¨α @’„Q3ΘP―(s‚δ¦.Βο υ�΄€”2_�βA²ΣeΘ‹[~d¦.]@ρrΦΌόΚ+Μ-”c€Άw*c‰χjc΄icŽœΊ. d€\ςΥϊLςη*€Τ.ν8 �=(&TΧ―ΰάΎ?Ο ΓΧάxΙθ΅dΰπ±`GΐR‚0R¦Σ‹:£hΙ †Žu—ΓΩ”yρL"½<\_N�Χd.ΛdΧUΗ^!λ,R*œθ#ƒŒ"nο~FοQwρ|©]^Μls£gTΦβE˜ε“|΅Q?Τδ‰!ο Nσ’;+«.ωυώξΩ[ΪtBΒΕΩΫGrkζ’Ή—ɝ €¦$FF‚ξκτ₯¦Pg…e=Κl;P#َΠC…ȏ ­ΖGζ‘ 7 ™%τΙ»mλ?Θ$7ΩσΆ΅΅‰/HΤ?sή άα{8#P˜Δ )2©φ f˜€$eΐΛHΰσόύάΩσtsY kΚ"Θ?· ΰ0΅Δ?„υμ’Ν‘:ΏτKi€οŽͺ6ۏ`Bƒ2HΔI.%όAœ΄QG•ΞςH3\‚„΅‚t> )fkδ92”ς¨†ζŒΰŒPΨϋ*5¨E,©iJΜA‘sΞ‡W‚Ÿ± ‡Uη�RT`œ•e^―sKFŒlYΞ2·ιΒ{CgŒ0n”’Χ«… ΜT3μοαtˆƒO8`—wF 3�ξ Ξ\N]½Ϊώ½ΧΎύΥ΅ψΒ�’Ο§{ςdΪUΧάC+DI†Υ*�yφI‚ώ2A δΆn€ς‡dΗδ6½KK©0ν,΅τΚE0wR-k “Ε. χ�Τ¬–λΛμLi 'e*VPζ›(ΩGΙU 2p³Α1eže0xSύ½j\•}R-©2L‘ `F|@F…m=¨ jΒΰύ«WΜβ} ΨΥΚΖ*#ͺ―x² ²OyΓ†G’€κ^”Ωjqmo,dΞ<ω€’­Ηp ―Tݐwξαsζ>ΏΙσ» šͺδ€JιpBΉm[.ω½ νε6Φ0v£†\xκδyƒήdo’€₯YWŸY]^2«σχq�Η§€:άΆŒ΅ΘZχΖ€1GfKΏ0γQ0·n]g BdΆ‹¦Jο§‘dψu‚η] ₯2ΈψΨΤ‚wθ‹H—‘ΨΦ»sco7ΖeUJ ΆΆπ—ΉΖ†€-Υ-c΄5σAŒ0uΐ�“�_„ ΩΡ:² pμΡuHš΅jdιΙ€ͺz’ι9K€£”Αў±ρ§§μΈΙSBmρD8°•—Ÿ‹¬©Τ*špΝ«ZсΜ2²τy”ŸyκYΗଐB­RlaX¦»$sœ%8Ώ‰β@kS*΅0«Υn/̜)ƒž† „ΐρNv ΨeΎΧDΒ^'‹+Ο…Z…ˆ΅"λ―uD•Χ@’dή~ά%©5Θ!™„&©‘8P§‰B!m »2†-²»\Œ_Θέ!Šά'uζ�ΚΐΉ†ž[ΐΠΗ’Ώ?bΙƒF₯ώAw2ρΎύΑ�ŸϊP�Π7 ΉΓ/fR»±ε$φ`%Š›υ—ή[η~j& Ι�=0nA”y ˌY‹1€²³ϋRs 9u°”¦»Š²‘ς5R^ΐz �”IΦώ“’ V1F6ΕC€ηαDΝσ ςˆadn’˜;cnέ½cJŒƒΚˆ’¬Αqώ½PΊM‡…}«:jΣS†sAυΕ Pcΰ ΐ½Νœ’S†2» ” )Γ\5§Ξœ`oΣή_ΘξB`AΜpξΈQHΫ$?‹ύT–uΨ‡QfΘάΎq›qξΖ80nο,™ΎΎ΅λ˜βqOmdρζj�'•ŒZŸκ>Υj΅Ά½Ο3’ά`N²SΞ(₯K―ΌπcHML ‡t}΅™δf†Ι^ΊYJ8Š˜»ΦU‚Γœψƒt?@ΐeŸΊ0φ8ηΐXŠ€<%YΞ‘¦ZwjY„π“§A@|IμCφσzΤ-<<{K-i)aβyU†Γ›1¨btΆC²z!iλ%ζxo'o&G‡!I°[dμδρΐβΐ˜–=A»Q1"―ӌ₯rSλM„©Ύ'RSe φ3ƒkˏ"ΖzPgyH΄8/{zzΏ}ζβΓ�Β1έρ6ψψΗc畝θŒΐŸqπηG£σηΞtFΰSΐO8Κλνφ·‚αίΌπΓ?ωgΫkχά#fΰΨ ›Tζ‘ψέΜέΉC¦ I9ε”ά¨ΥΖ£€ΤY]·Ή΅sΝ|ψΡGζZΗ^Ζτ!εφΰ°^₯Ÿκ‘AKb526jόΌ2£U‚·fyΦٝΰVΩ3iOλ€Μ–ΐ€‘ •“ΆCž™:©+WTδς|‚ΰ�!Αεή.#₯„~k+KΦσ@Φ>ŒN §€X˜»}ΣΆCμ5;[΄Žl+ƒ¬ZήΣO>a<έ]&B6ΌΒsξν›Ω7^5©…eσΔ©­`@ȌPuξ~jbΚ�`Ό€2Qδ‰+y?€σr χ#Η}όςγζ‘Η67oΌaR‹Θ’‘­‡ά&ΐ{ΝΟΟBbΠSqŒLLšύθύkŒ*cΖ4‘‘…„Έ�ŸΥ…‘^Ο™**£ϋ'Θ>�±Η€ ι™41 DfŽΟXƒΦ+/ύ•ΐ)3{•΅ˆ\rF ™¦Ά3Q<Ÿ{˜s£ewοqrεμOΥΘ'{h1ΘzuΘ]Φ<F6‹Α.Zs τ�$9ιΰ$c#I-₯’ρFQ«0Ά5TYΚ’άEΓώ–+JΦΠ~2 t0'κlαβύμ­ξ„IΥΣμΚrΗΙή)ˆ.Zκ eΐΤ0¦aŒ»ΐ}˜Ήδ›r$τœc*QΙ‹§�ΩdΟIύ’3S [₯ΑΤ"DT)#HšΥ’U{"GιX”σS]fδ ‘2‘υε5ΤV œ#ͺηW‰„φ©2πΉT ’‰30[Ι³O9χΌψy$ΊΩΧL oT― S’ΑΎΠZW{Τ£r ²χμ­A)nΤ΅D+\zVφ]™ŒxEζ‰XΤωoΫΌ²ο₯ˆκ꣋gΥ"Dΐ> ‰Η�,Cδ¦έ,%#¬―Ÿ/"ˆdŽ*UŒD;ηΟ]ΰΎς”–ΜiXΜμ.% ˆ.Ύ&M;νS­εr–ΤUΖUΚ ^ώ�Žo’@{έE9”i„Νδ–> χΩίgΞ1£γfn~ž21§Α’”uΨF96Δ³1 ”Amπ˜―0oάo…30ˆΚΟάcyΤTE°�δύcχ!QD΅bAž4"μt~&‰ύ_ϋk�ΝΙ‹WΈΞWg:#ЁO5βΰS [η‡:#Ё�οΣ žυω»'§'ǁνt%Ÿ9πμν�ΦI21P»4Ή.Π•�„΅#γή@ό x XkQο_(K Π"ς©Ž–Μu†Μ’ΐSU€€,°“_δtΈ¨ZΥUuύΘ’GF†Μ›ΧpΈή³¦ζe�Rφ›Φ‡Yώ¬Ve ͺGχˆ?ώ…/αΑ5{ζϊ•Χl°\„pΜΗz‡Έ ’Ι‘σΆ�z› \ύ΅›‹κ˜Π°Lΰ1PI!ΣχΗc¦IΠογu 2N+ ‹ψ¬š[½oΛ/ΛΈ†“!­R›ΖC™ƒ€«Ϊt©Η·Ϋ ΐ"HrB€Γ 3€„υΤ£—U²ι7ΝΞφ*Αξ°ιA*;8bŽ;ij―ΎNιΒΩι8YB$Λάg½8f>Ός�5žσ#3/c’!Η­ΩΐW$ŠZ|•1S«"}�8<Œz~³|wΩfΛάGΘMφΉA€ ΐΰ¦ΎS0₯mΚ,Y-©£Ον!ϋ)@"ΰ%™²dλΎ0ξπΑ~‡Υ‰‹ϋ‘£ΐή (jq3mL$]ό;ι8}ήυ(Ym œΐ˜H\@F  Ω’oθύ\ύϋαώ¦½^ ‘@’L@ξabl‚χEΐλ}elq#W–y˜Ι Ν―ώ₯Ώb�Ύ~Υf}A*φ9ΤΚ,½‚Bδ²qL&X·*ΛΰηΉ�Μ+ΘήCzή�~+/“Ξ£XρΧθΑАι7θDΖξTχΦ“”"kUΎ ΅6δχ‘Μ¦ΐgίθ1σα{οΩv•lΦ&—(/ZΤ6·$"1΄^]dδείΰcέ „«ξ]έ&Ό/a: Φg:(μγ*œΌώƒ§Οπ„ΗτΗY·e"­₯9ƒS&Bζ2ραΐ$±°ΏJιcƒ±^m‰: QŠ™χ*"„[4BIΠUv‘ωE‘9c’;dPUΡTiΐψΟZ τ 4:ψΉ$`"¦YήE΍Ή]1KΫΐ„ι₯+‚€ιjsG"œρΖx―…b¨A—ΘΉ $T ίh€Νήƒ}:`tA ξq=JPΔDρ ˆνΝμmšΡΑ~sž²Ήα«cΕςβκH€Pάξω ]›{”ν`ΠͺΜ/χ‡0θˆ›gžϋΟΜ;―~‡kS§ήŸ0ύƒ=¨D$‘π‹όσ˜Μκ&Ωuφ^+ΥΓ]³·½c&fΞ›8₯E«++ͺΕχbς y·_4i2γM€a½X3 @jt€}ΖXUΒ’ΛGγQ@+JΜEδE’˜ζ½<“|²gΐδ!�Ϊ,‡ Ο�ύΦ† πβΐ/D–yŽχA aΞAͺ�ΰξϋfύ欜[κςΐ•,QαtΕ8OΈ―ύ & 3UζOm=4�Yƒάpγν lΉ“}μf=ζvρUAζdNά:³ {(Β~ ³^dτϋπjΡΊ¨‘Œ‚βΰώγΗ,•¦ΞNΦK6΅Ε4­ο‡“�΅]ŒPΆΣD#EA4ΙϊcOJ#zCfŽ˜²ψd€§$ΑΑ™Rcί±ς X“手Lrlˆq ί2ησ›9Μ'eΐBRΚ` ‹κ@{,Νs„”­·ͺΞ$ζ|εΑΧ‡(•ήB* ­{^Ϋ• σΉ™Ζϊ’2J-\υ9&²ΩΆυ„πϊŽJ―θεΐΟ—ρ5ιΓHtΐLšAUζ¦KCΒ$΅χ,ΠMGΚΉηHŸ ScLρֈ„b|. ­QT¬cδΙϊ Χδ7α€ΐ“2�·³‚4Βη_<Ž-Ϋ »'ϊΏ�ΚΏς?@¬ό“‘σΚΞtF 3�ώi!�ύοwΎΣΞtFΰΐ/?})NsžΎγ―ό•ίόλ�λ­λ·.Ρ61i3`Κ|HV� Ui�.rΡ<υήJiJ�\$;₯ϊz[G ¨$!Τ纏šζ8έΑa•Μ‹-Q œR­ωΠΰu”ίX]€ 2&`χΫ Μ�$™?j#&3ͺαefΝ‰Sgmιβά΅₯ύ6›'ψσ@¨ΞώΜ₯ΛduŽZ�Εhσ₯Lœ:(0” ™qωΉ/™ OΦ8Θ·ΧΝΘρi324f3ψχggιAv²Η¬.,δLsνρι žΉa6`H}/ ’d&΅τό>Hvlrζ€­±F>Ξχyκ{‹d©ζ(M₯¦wo³A7ε€·‘“gl«Κ₯›7μ^ΣΥ?j₯ί›k”6vΦΆ, ²ΩVfT@Βv†ΰΟςs{7ŒΝψΊΉ?9τσL ²z‚~•y(kΨTκ™ϊι΅Ρ3Η§ ¨c†„Q«/qΫΙ―άώ=”,Θ­έAφ-"Λ�T LΉ€΅dό%³­h~y/&IΥσ6ΖάM¦ DFšο¨[ΣI·Œϊt’Ό;y/. ςnΙδ½r1ψo"Ϋή'ΫzκτiH’ŠΩΒθM¨$@Ή “JνYIz?‰Ε{ Œ‡κ…i a>ΰύ”γ².ΏŒ F2feυͺ\KλNΰ¬n•¬+ΐR5‡‘#€ΛΊͺ ,C08Xc2ν¬²�ε_ η!¦VŽςϊH°.ΤMAs‘„€β ΈΧuΪκ $+]€ΑΘ*’XΰηΥ"4ˆ*J βuΞήP§‘Αρ1σΠ£ΧρXτ‡’ί�ύί�}žβγ}ύϊ_ώμ$¦nΟ/ܟνέ‘›†Τ ΚόΛ�Α›“Ζƒ΅I΄P'cΌΏ‰<›,§ζ‘)°‚TέΗήpcρ^ΖBgjRr σP΅J΄εά³LΫTv£L·ZΙΙ@PηBρΥ“©¦”ͺWΛC­N={‰Lv†k΅Έ‘ήώ~σΘc™‘‘Ϊ»ήg~Χθ 5‰�²ΎQ�W3—.œ7 T.»χX ΅ξΣu}”ŒŒŒŽA$ΰΚq ΅”ή]ΰ9Λ3W 2Ι&ν)D†θΊP%Ϋ¬³©؍ εβ‘Ρ3ΨΕkhχHg†‡Ÿϊ%Ξ‘AΦ"*)ΚPRΫkfkmŸu—dˆHΏ₯? .#cPζ^g”:LPnΔ1Β”Κ‘Νž€uσ―–•2”υ2"YZ¬5•?θE˜Τ ϋTΏήΖ[ΑΗώ‘χGƒΉρB6π†fqT;I;Ά±>όD&p¨˜™ i:aΆv9―dΘ‰©"χ.₯ˆΜυσ^φ½­9Κ}Όα£ξ+92σΪοπψ-ΠΦ•ρ.R%‚ΰΜCqQκΕ₯�2„`C@Δ©¬K΅5RπP…,UΞιMJœwYΞΔk@+-Θ,ͺFέFdN*EK“υβƒΰ�gƒΜ«μ©"J†Φƒ„KλδΎ¨0#άΐ«ΐ½« ‰,Α’΅Αδ#O%ϊΝ―�Δμn�^‚JΙΧ7ζΜΒ­›¦― Y9υθ-=žΝPΟωlz@35™NΦ”-$0–”ZΐF―S6olκ` 'ψω9Ζπγ#ΫΝ=8 ΖΤ}dΌ”Ιwϊ$ύuσw^9Ϊƒ° ‚Ό€Γ ?ΫΤ3"³φΰ€�ΠOPΌlR«μιςBhSΒ§=βΞφ&οIφ)ΎΊ3hmˆ¨1·Ή�Κ"T\ΖtOΖzϊsp€`Ύ…‚ήCσξ`ΕP,xΉ―C²•έΤ― €Ώός+6«Ϊ€ά ˆ�’„c9ΟσΩεJ਴8„ˆ²Ϊς0SΎ’5€ΆvB \€†oΐZολg^ΛΤνΧ »Κ_LšΨ‘~€M“g΄ώ7ΖΥE=x›Ίt™: ZΤΉc|κΈΩέX΅ΐΫKIMKΩZ2η>ΐ_Πγ>!YpΚΐ ΎΤΑ‡$ΉΜΙΥ«Yΰ�»ΈΣύΡύϋχ\Σ>ζŽn9ύœŽκΙ,j7Χvaœ]0MΦ$ϊΫ²ΠΩ€γ&l J]œ^ΐ('Oι‚Zs:!K Vμt’] qoˆ™ΓmΖ Ή»“±dΧ(ϋΪbύ½ό¬yο͟@ΰΓ‘� €d‹u£ŒΊ@±ΖΈ©ψβ _€b«b&'¦ΜcO<…±j @κ5γγγt`άΆLyγΠTλ·ΘσΑm)€+r~7`Sέ9D†Θo!‡D|υΑΌ6Xσμέώ6Νι‡Ξ�Ύ3Μ($ΈF{Π,uςj'šIqΖΑfΟ™�dΔ%Yc–­I­s02δΣΣgΜή�=sιαΗLwώεω«&Wˆλ\Λlη~„33<ˆ¦›˜οM>Λ]±Pύ4XJδ[ ΐΔ+C„šΦ¬‡ϋQ)όt^ζi9λ"G4–˜·4>#~L ½Θάk5Τή%@Ό—ϊU…ΨB›`ƎŸ˜η(θ5Sγ&SI³ζtΟζ:sBκœχόBœ”Ψ_Nˆ{(jšuJΉ¨€~‘ςWrΦΚΧ$Νωš†ΐσ&» ϋΝΖΚ"+”πpX²½%„2]ΌάΫƞλ:sΨH˜nφρ>¬ΉΞTΖ.—CmIμβύέμC‡6{BΔ§J4<(ΩDsl1ΏΉόΨS–„)rΟ«2sRΣ΅™η n0žeο¨Μeys͜:qς¨…3«„eo¬Ÿ5 !Γ=k_' ‹$ύΧΩ艨 ޲1Φ+«Σ’5RC«Άο@IDATHιLК‡Œ9₯2ΠΪΥΩiύn8‹€JY¦2ƒχ"ͺ§U χ~ωΜi«�JΔϋ­£ΞΨ¨+‘ fΗϊ'ΝύΩ»ΖΙy23sάL?eΥ0λλ‡Jœpz3Ž*/JHιaQEρPΒ·!Ρ Iή՝Xxβ™'�‰ΓΡ…yJη«3θŒΐO?βΰ§ΓΞ:#Ё?―}}ψπωη­λo|�‘H,<DB-ωΉ‚>dοΌϋ`£ ]CŠ ° “VB"ZΖψ°Š«΄ ?eRΪ¦2€SP$§oeΫΧΧ·δ©7&ΠΣuUS^–B€tωώ,uΠ«Ζ:­OL˜Νu°ˆj]‘sŒ•΅*” ’68sξ’% dΨV!‹¨zξΫΧ―q?˜ϋ‘ν?qœ=‰ŒfVόŒ‚Pe¨wi)(2cϊΔ)³Ά΄„g@Ϊ΄g½Is�ύkfŒφ‘χξΟαŽœ–lt_’‡S\ΟIΛ©EW•ΐs#Θρζ•7M9E6€ͺŒzΓ<7Α³ZΑν“Ν{ω₯ΜΞΎΤdΉ#ΛlP\ιΜJƒ–yδK_4±ώn³3xυ°>δσιΚͺΝΜ…Θ²"°₯$Θ‡ιX₯’X#ύΧΊΥ*`Pc’–sͺ‹YγΗ‘]΅ΔRU(3)ΐκ<8wώ‚Ή�­ΙrΔ dΤrX―_SՏ˗AĎ:,TŠi;?qΪr*C86υ0νΡn˜,΅Β#ΏN'<φš%ΓΙΖ37ύ“3HγfϊΜy“»ς†)‘νλBEr°΅eάML�¬�xiΥ Υ:’idβzΦ Ωp€ƒJS€έ’”Κr?jε7OFQ%1ξο˜’jΈ|ω!LȎ™Wi*EBΜΉœ�›ΜΈP<ΰΎ τ#ȝ²λ�Ω“p„5¨[ΉΈ| ¬΄°§2ˆYB™BΊ2¨£�„q X@¬΅ΜxQS°φ(2`_ΈΜΦϊέCΣ 1ΦCΙΝ=ΚZβύΓ€ν΅nXƒLετή"E|ͺΓΧ 0=g‚ΪοŝZΩρΌ¦aI(–†Ž;ΛK–°λ… tγΛ‘}Ύψ`‰υΨJ8M„u£2cϊ( Z¬cqR-41ͺ“|όΒgŸ4™νYB©ϊΤιSd‡Μ*¦: b~εՎχK?AΒη²3U @‚d^IΚ§Ν’ŒΌ�_{ΐΆn‘ΩΖΙώ"h ‘20ƒcγΦTρυΏ€S6e9œ+�zωmλτ{a7g¦Ζ'M΄―Ηfύo½sεCά$cέfosΰoƒ¬Ϋ†Y¦d!’$0κ7x;?}Β8Λyσξχ~d‘ Ω78p'sΙ½m’έLοlr­@Aγ#S¬ $™0€ύΔΜ ₯βAΊμσhΘΤ!B$֊€i“ΈΠΓχP1sς’yυΕοΨη³’^< τ3m²ΐEjΧ”pQ“.\Ηπg ŽVf^m²y@Nϋ(Θσ‘�FQ h±Gύ6ΑͺΠςοκi.CΆ<΅δ>\λ½~ΐ"Yd)Apώ2ήDΨLBD¨μα½+―›:ψg~ν―bΰ8lβrFβΚyQdΙζΧπ­ΘΤΘB»M΄έs}―ρ£Ι`Jفƒ5z°½nN\θ5<υ9ΰ~,­C€%œ4€L'ηŸΤ&"4t.1Ζco ΗfP-€—Μν;&ζrR^@V[ΚέWQΚδ!$Δΐ1Ί‘ΰ©°·–hKΎ‰Η9λεk‡μKφΛθτI38sΒμΠΞ΅NχšδΑμ•«fƒ3rϊμ-tΈaŸ‹0›`ަ¦:7mο'ΒΛ”2Ι?ϋO€šΤ6"ι4_R1”VΉ“„άI�Ν$Γ|ΉΨΫPΔμc)ΌfDZHy"΅€Ÿ}©²2gP«η $H’dΟ λ ώƒ €­’/ΚοΜ‹ @^c x‡ό¬+ζvνΑ¬ι†hP¦σͺΖ=΅ωl‘Β+I9ΐΙΑasεέ·Ν ”ƒtQ>—Τ]&ΗyΫΓ™mχ8χοCΙΠ†œUωR3C­YC^΅½δΩYΑ*Οr±—₯=Ι&Ձ=Sυ~ό²_|lI™ΗJ%ζαΌ¦D摇.B$ιό:)ΛgLž½3€οξμ·!>Χ¦'qΦHΙΰΓ_#g�_ΏyM |šˆ‰0Δa―PRIP…³ r‚ύΣΔΜrp€›Ο °™™žωΖ―όΖWΏΟ½ι(λ|uF 3ψ™ŒΐQ”π3ΉTη"θŒ@gŽFΰίϊήFfw£q°Ώ�T₯Š«uΊi ζΆ0ΫΗtͺͺ:b‚©šCνΑ¨Y|{šŠ€C9G Ζdd( !0—'#Υ,‚[ €nZ7db…=ςψ“V%Dn"u—©TΰX"–󴀝πA%°±ΊŠ:a° ψKΡ! ΅»@‰"=cΦωχΩ;·ͺEZφ˜“.Ρ;ώ,’κ€Ωίή΄ŽΙ„Ε‡Ν%R9t“IŠbΪ¦Ύρ;›ΫΦ]_FŒ³d‹TίJv?ΰλε,εŒO›ηH­.R·=aβάo/AρΑζͺιŠΖΝꈍεE‚[ZΉ”€� Ϊ§ύ»“€zΠ p!θ”μn²zκ*°Ÿ:0wnέ"³‡LΫ­l>Κζ*B‰Cz>ο”;¨­ž€Ω Λ765eŽž1n`I"gΐ؞• · š#”~ ςšψΝΠzσΐ L3§Nš`"N‚²eΗ¦OΨ�Λ+fyαΎlΘκšO‚xξ}ςδ)»ΪΌ^=χΜΓ(yπœ`pζςΰΙ@6Ss˜tοq‚p&Œ—ΉHf?inάϊUΘ2|@D@° Œ:œˆ Τ2v2ε&οΨLΏ1ͺ΅πβ¦ZΚΈKR­αεj ΪΖΨΟ˚–i ό4ώΆσ‡ΦU,hT‚F&šΗM T H�.ή#;~”ΩU–�ADž΅.β@Ο'CΚxw2sF2Λa2ή“ΗgώΥΨΔτ»ŸζόωO`ϋόΫλίόΰέG”τ%/ή²™]«(8RΗ‰a·Θ Υ•K .™6eIμ!K€δ rι―Sϋ―ώς%έ;₯ Λ €Mώ,A‡j·σ”ΡδhA©Χιg˜Lΐ/²oφn@ΩΒπύl^LuΠƒ»³f^E…Aι“€τλΖOΰΑέ;dήΉwξ3H;6 ¨Š†-ρ΅»Ό dm3WRAΈ8wͺΞ€[ ž98œ±η Δ ψvΘ`/ρ›‘Ι1^ά2cdδc±2†‚ δτ :ΩΉόμ!™°2αΞ’5’Ί‡Όy:ΐLpmmžN MΘ©*+”BΐdeZ»ug5•jιαO@₯ƜΊxΑœ½x™±Oρk₯εΊ?•P]©«€%€Δ‚u9rŽςόŸ}Ϊ„»1n%;/…Κε~”Eηz˜3ξΈ=;wv(ϋbχ˜/ͺ„οςSJ‘nΊ χ˜=Ψc�elHwž!‡2ΖΊψΛwr© D,ˆ@“EB1΅™•Κg!Hσ”•H•€s[j‘ ”42¬ς3~"Ιͺ¬;™ϋΙO!„J^2""E†δyζ€F/–Ώ0‘ω˜·Ή?6θ^αωΗ©�LΌ:.Έx� ₯ »¨-bqˆΤ™“œG%³΄² Ι³gRkk–ΐ'¦P%ς*i©¬C„ϋ@η€ΚέTͺ –Ί*=ΪΗΓ/‘%Κφ«L§βμΑΜvβ!œ=ΌΦ:£α¦œ.AλN<.‚ΤIξEsd!«u?59άkΊ“=¨0·…ψΤηΦ%n«tͺHa@ͺ99ddσUφ(ͺ=H΅†J†R¦§7ŒPŒ΅GώδσΟ~ξwOτν}š3‘σ3θŒ@gώ’θΡΘtΎίΞ|κψΪΧΎΦόξ·Ώ΅tυνΧ>χΰώƒαε %CΥ +ƒ%»ŽȌαzM€%ω§›VfκM-i­§ΪQ•(¨5X€τm°d₯v\ΐg‹€=I½m― �=2ϋMδι%dΔ9€\yΌκ΅•έj vlM9!ž‚ψΏZ4¦Ά¨—φ:_S(ϊΝo½ ππγ˜ήo>�₯ηί'Μξώ6&lw,! R"`yζΉηL -%„²D8½αΨH`NΧ‚z°ΚάIJδΉϊ Nί}ύ LηΤήg0bσcΠυΐμ’Δ(α’�Œ₯Lηάc›`΅Nΐξ€―·\Ε}€(IX[Ί₯τšiςσ!2¨=”E¨4C†er? Γƒ€ζU€ΙΞΪ �~TKp{i 3»ώcΗmΏ{ηTϊ’βγ7|ύ\lpRdi�! βB‘?ž q–ΐ %΄Ή²žEΔC‘ΎοκXα|T˜/χ²Έu9ρs?Y‚φΎΑ!~Ξ‘±„L{ά ŸΆεΚ\ʘLfŒ»dF―Ώχ.�κ€;ξU˜JrfIΰUΓ,€ΑY ²Ώ΅fIΉœΓ106d ɝ˜3Μ:y’ρ]bώ!’Yg/œFž=ω\Ψ,ά[¨σΌdχΤ¦N}I€sYAΏΛa‘,%UΔρcόθ”C=7εaŽ*ύ FΪM–R šς²h�¨+x¬YυTWη`ΠGVΉ€WA²…œ 0yς€UΉ(ϋΌ¨Q«N™ ͺ£E“ύΠ`Œ=<κφ‘η”κΕG‡…άσ=}ί|μι/ώ³ίϋ½ίΛΫIό„�ωΖσΟ·Ώrνκρ»Χ?ό²ΆέeΦE5 Κ“BπC–uηfŽΫμS?a‘Oςfp+ «ΦlλE™κ k²Q₯6ž.)"6€Τp©;₯ NJδ‘­bΑV�@&—Κ> < »((Q³γοt§ŒκΉu”³HΥ{¬βζ�ScψΈΩήΪ4χn^·εAUΖX*#*VP0u™όΚd”eΐ)"RΰN„Ε�ΎέσBΩ”ΐp2ϋΜΏ:8θ(10:ΒsΉΜΞΚ¬ )BgΖ₯€ΪΙΙg˜:O΄ψ μβs̏zF²jw U„_Ξ,κΈtα9”ŠΟ*u€ΔΨΫM[΅BΒ6ή4“γC(ΜθʐŒNΜψŸ�‹Ώσ·ώαΜθōOxt^ށΞtFΰ�wˆŠ:_θŒ@g~#κ=Œ'»�ωψτ±h�P=™ΚWΘΈ`τF-©ΪΫΥ GzΜuμ9\π'nΤγR’1;΄ΰ?Θ‘Α\‘π”Χˆ‡n[Σ™ΝΉM” ΄ΤːΑΊkŠ€‘#“ͺ–Ν6$©½ΘQ_ ξ`NX“;5Χ‹Δ#΄Q ¦rPΰ "Pάά\£F~–@Υg}μ‚f Ρx 0Ημ+ΰ₯Ύ5AVo ώϊ�Δ tžkΛ‹g²cψ0¨}ŸΐQΛL.ζγΣυ}ζϋίϋΆ“9TmLωoƒμυͺ>Zί©CƒY ΅ Hq9έ 6‰­ΉfЌŸ2Q‚ξλW_" ˆ§ @5e¬C‘nS„z –‰n!Z4(z½CΊ²ε& T²cΏUγ&ˆΘ™ιcVς|ηφ-γ₯Ζ[ΩP)φ`]2}2.£[eδQΙψη2„ΛΑqά¬ΟΟZPΰ€\’oπΪΆg€«σ¨hŒξ~pΝlAˆ$ιξ²υΡ›Œητι3&rώ²iRFpϋΪ6¨oπΆΦ!Λ“‘SŸυ`ΌNΰέ;2Ιό36ˆR()GΩΠ6C#ƒζΗ/�„¬.tΜδTβώB€‚Οܝ›ηπ$ΌζhΉ'0 ηBj!IόŒm1ΰ§%¨T‘(†PNΤ ­zξ»d�%ΗΖη€gλκOΪR΅sl3—ΐ!V Β< ξ;I•§F]υΡAΤM֐"…Λξ, OW`W™Ks9Δχt‘\4ΚΘR€ ΠVοπΘ?ΕlmΛ.ξOρ]ε»εΚe%š©%”YΧZU6W>!^ ‹Šη°ς<Κϋ”e‘C6f’&žμ₯‹όΝ“Β뒎wD±!σΖ,@ ½ ₯Ϊϊ*{KΎ#ςˆ¨S^…ˆΣ3ζ¨UΔδ³0cŒΫ΄α«³Ÿκ€- ΈνΎ¬θΖΎ" ο?ΈΗΌZrPε#+ʈ6sϋφ Œ7μ˜ ρ*“,3Py$¨™9 ΧΙH0MI’ζAΰwŸΊόHχ„Yzpΰœ’„GΪΗHΞ)Ip0u1ΰ¬(sζ,έύˆσJΔdΕΠ¨©}ΐ΅y-IaT ήƒΤI£(SΨΏdŸ₯^i6ΩLaΦ“”h―L…΅‘NΎCi~>κέU�εh@d°ςι|δ'’φQZΉ’ψiBΪ°ž|΄ί Eϊ™J Ψ“oO1[[+¨AzΝπΤ΄Ι²wΩ/qΘ­S}P₯,ޱ¦xs“·ε ςΊp!Ϋˆ-bΓ]=ŒkAͺ ΐ΅ΘΠ{JώeΖP]hœbEΞ—‘ψ ωβΎlzG9ΏΝ^(<1tΈΨΆέκ"Δjx΅ι•ςΙΝyηG5&"Gf«LOυΌ%Φ>/΄cQ₯ό’νΘr>œƒTʚΤ�}Σ °–κteΑΛΔΑ9Ωي9β8DΚeΞνΉ·Μ*„ΨΫ―�Ĝ:uޜ=wɜB}ΠϚ}σ₯Σ6wΞ!zζ€&Q³’ΕΑ—ώ«Ο#kQm₯k’?‰,Όά�=c’ #W}v¨ˆΚΤVTJ.ΦΦ)h_IΦk˜qΣηM5›’•)­5οCΞ₯D’Ÿkˆ$†$G±΄ƒ?ΘΔ―ΜZ3¬ΛCω±Έ c«˜νR�6ΘΎΖ$“’¦ ϋ‰Ο>ωχγΧΎϊξζ²σՁΞtFΰg?βΰg?¦+vF 3ŒΑK0ϊΝoόΑ?ΞΏτ�OώΙkάO€G\E]'Ω/ϊ]d§Έ₯‡iΈxmf‘Œ­Œ₯6P­ΊZ·Ή ΊdΖευΝ]Z›b�[Ys Pλβί" 6O"8‚0ήΜΒZ:‚:u[€G’SΫc› Ρ] {β3ζW^'@τΪv²\s”,ŒNL˜„€πʊ½οJbεEοW―½€ίAŠ ώλΛ;uH][yΌ€/�τh’ώQ€ςQžmm~žηFRο*›κ†6­Υ`SΈkδ蘻Α•XOγ§ΞΠ…ΰ13wλ†Ήˆmρ s=ΐIorΠx¨»#Ί‰ΩbŠ@έ ρβ ’iΰ搢†¨―WfΞM’Τί‹˜©Υ [Y>ξR™φ#pŒϋ‡” ‘£”¨©g<τ2 M™΅2y™Ο%0“DΏ…„W’ϋ Ϋ‰γ'lφΉ@¦NDL�"Ι½2dΜƒƒμΨ°σYΚ5¬ͺ‚yRw^™ u"kcŠleΒ#»½cΙΉžx52ΪΚάW!+{Œ_^uΉŒ!rΠ\X7{/λ©π'bhe}ΝIͺY‡zΝω³η­‚`vξ²h<.‚=6λ`})‹) 3·�nas·Τ±.HΘ.?ΟXΕΏΩ(p\§Ύ8ˆ ωΘΜ³nK*ZΘ‡εΰ/©²dφͺ2φjœZ’:mmΏˆ�n< r”m–F€Y/Š ί\ ύ:�Αƒ|\€N‹λEXλγγx@‚Ρž°K$ώaςΉαμ@|Ϊ�”J‰τήώΉ {NŽχ2ΜΘxp/d]Ee‘’©=²ψP¨%dqmΰz―ΦtzξΈΚu††L…5XΘPηΟkdTβG’—|¬Ϋ…aι&„ €ϋV.σ‘ΆCΧ•zB~ ͺ£―‘ΰœ‰>ڿ֟�€5―6ƒΚk ¦!_vφΙQ²ήͺtt]ΧqB ŒŒ›{‡˜‰Ά )yΟ0Ys( Ζ_Ωa•[°VΘ� tKERΞ§87(€ΨΘf{­R@Y~w€—.ݜ5˜ŒFPΥ P¨ηwQΌpΝ”?ΫάSΕόδϋ�†η‘φŸ}Τ’Ά(Α+΅cε…ωS&Ό ΡU«e©UͺΥ‚T‘‡D•Œr‹΅ε† ”RΙΐy­‚B«‚Ωd“ω–’H„W…Χm­.C|ᏀۦU‹ΞΙ&™m€λ sdι‘ΆC¬D!5Σdό'ǑN˜‘œIiω‰„"œNΖͺ·{cWζ jΜΚΰ₯:iΧ\H ο gΜ₯ tα^δ £ύΘΚΈocu"w—ξ ¨KΨ—e~6€’€°Κ‰€,Qi€Ω r'ꁚŒTš…OƒΪΟͺSŠΦΔN F‹΄AφΊΘ=τ=|Φ°GΩkΧ*f~Ξz‘Gώ-Y«(r3zΦ2η^ߝγ"y‘Œ¬ΒCgmJώ:Oš”ΰ9!‚ό½%΅?ηŒ•al‘3{™ς$©κj•WΓ€¬Ψ/ήχΈd ep)P/Π'ΙoA}₯²�ρ<ΗΙτeΙΦ©n·Hm˜D$!fΞ_0‹χξ™΅•U3=mρλοΏkv‘W2xbpj ηg\εΏ Κ@fŒέ€7ι ΎΥΎ/„rΔMYGϋΚ3&Α ω½|)$ύ–Τ{msΝfzeξψ…gŸ1³·hύ–‘φPIθd€I&`WU1Ύb+Jι½κΩᕐ^#™vŒz΄IΖ+Ϊ—”_~*»IPΛ\g½J†`ΘΏAχ†π“™υΊ#Vž,�ˆ6ΰL†8ή7ˆ�…uJIO΅Y@T‹<ζƒύƒj Βά.ZC@½Lυά5u»`­(Σ l΄2ξ²w§%Jϊ’ŠΩΧ4 pT#οƒ4XY^6‘1Ϊχ1�›Τ©7XΣ"•–‰`WΧ°ωΜgž6§¦&Ν;?ό‘)βm’¬Έ›ύ(•ˆŠ%ŠΤ…‡’έV‘ΠΥσ§% *EαΉ R qν6—££'¬Dΰτρg~Ι\γλΉΡGW“ͺ\«�’T%(?(^ž²�ΦLS™^Š-²†erψ(SFQ*‚·υΦ<—SλΜ£Œ6σ(Γ4?’|ΩΉϋ.ξΟΝ½΅ρWP»57cT‡ ρ’¬³@ΰ<Κ–²ΐ’μ|�ϊ-΄ zοzιp˚₯΄Cε&)$λQeΟΘΰ›ΖΔ>•―ΑŸ?˜Ψsν©“§PFΧYη·©‡P‚―膄’ ‘ŸvšΛƒνMΖD Ÿ@”^‘ή=v‚šρ‘φΨ<δΪ:qΘ E�)«Ό½Ύ@Ιώυ*0 zζ:e#~­ε€έλGP‘€«ΊS¨«ˆΖΚΈP TEΚΤqŽίΑ$ΊΪGw•³ζνe™ζXG5ρmζ_δOƒ{Wφ^ΐΪΝ”±.A²γi|QZΜ±ΗόH‚Kχο‘9FXτqžρiΣ=Ž'@eΨά|χ)c†OΘτκ}œφ ξχ—̍w^…τ)a¦»0%1Ρ(Ύ%¬9y†ω;€m9›β”j©ν¨Ζ±ΞόϋΓ”°'3T™μ‰PW› ?N§Zΐ�­Ψ“&‡ςFlkΚΗσ9ρHφrFΤυYeαQ±Έμy961…ΙiŸ%ZΤ%B­ ₯�ΟkMΙgFd«Θ­Υa­ ΔΟΚ½9³MΩF v¬›²+•ŒhŽΚμρ.ŒDύ—Οey_πœΜ{V¨Δ½5XϋQˆ;©¬ςψD8tžx//?§2―&ͺΘNrώΙΖB<κ ΑŸ₯^α{όοΙΎb­kυQ±Οΰε=UJ£ξ&’χ9k](DKΩ£φŒRQνS>΄΅»A©HΪ<όπ£fxdΔlnm˜o~ΐ{BZσΟxTJ‘–‘a€`ΰ\m )j6Ξ 7 §Βz‰3‘dΜ|ώ Οa"H–PD)Ρ Ά\­U£8C,ά^&˘‘Φ9ΙΪγώ!R€DpΤ―Θ(#Τ6A KkQHλΐ‰KΊ+�JγΣh1ŽZTά—ΌJYJ-Ζ’Ξuά_Β£Κ|Υ¨SV—7kΏΑZ;Tπ$ΗG’”k”»:±•e,^`›r%mb²Η6#“HΆλσρώo„½~ͺ―ρ‘‘ΉΉ›,-- ©P&FW ωtδ x"d«₯ΤψQΫ<ΙΉYDΨ7¨!o3φ#Ηf,ΘVΆJš¨4€"`iXeB΄-%ΊŒK•‘"mΙR―W*Jξa,%η;Y…–όAΐC-φ£jαdήU†`[μ±ΆάάΚ(Šˆ mw‡uΛλJaTKΤ…Ώ}εŠΩ[Ύg*(…ΐ$U{H(k’Α'… gεhD€nΖE戺7ωΒXΉM`jXΰόKon�ϊ’(Α™ ιQΓ#Cκ'ϋWέzšœ \2Ak7½oNž8ΝΉ_‚ΔZcοG(σ)’ΰ‘K…”}xΤI„yωΒΎv°~› V{PιD(JΙΝ*νw�ς3œ3¬»Ι±)s•Ώ―‘z‘‰h!"=δα‘_:cueRΫx)άƒΌŽ›ι™(1Nς:ˆjΞ"?† ˜τ�/,˜[Χί§,n‘›βΑ™Gχό‰s—η�Ζίύ―�₯Γ1ΊΕ£ι_�ψθ·Ξ;#ЁΞόqπp°;oՁ_ΤxώyGλw·½τα•k�τ΍;��ΥζΙ&§k+@•β@νPT�€ξX=³ε†―`PNΙnmΰ―Χ"�T]x›:α‚χǟ~– œΟόΰOΎkƒΞ²ΝR 4KΥ°Ώ½Kqς„^GGύΠ#"ην3אūΆYRh΅SGeΨ₯\PλΗ­» θν‹ΊƒΦό°Hΰ`@3λΆ@ΈHφiuc5A6‘d·^ŒΨZ€£ΊΜY‹e²²£Γf>½ €¦`P4m,-\« „~©—xΩ‚ώ 2`^κ9Ρ €εΈ_/έ T‚ΰαώΤΫ½i’NyύίSΫ.9δ‡!6™°Ι„LWΖ-’3γC½ΌΩdX[Z2F'Ν“O~ί†ŠIΝoZΰ₯Œοώφ­Χ Θ˜# bDζ'[&Π¬n*ƒ`κ ²t5ΖήAk²6ςό:Ο#υ ΩfκσνΟh^dΒWΚb6Η½Τh5V!Σ\Fm°ΎΊb‚0 ͺO5Ν₯• „PPM:r_υΆ—1brΑΓΈNYˆΚcTΏƒΤ<§²³κ„‘²ωHΑΠ ΑΎ σk]FΫLM겕-­³f”₯ΞμΡV“ oCHOυΩςŽθδδΝ­wί΅�γ&ΊƒΤΘ˜r”6h½e³tΠ€Ψ©•Θ@σwΣ�Ί ˜8Jƒd²7ν*ώ§ΏN²X~ϊ/GWWφwwήEβ�•2@ZB^Έ8Xς£Ι>¨I‚ΝX4λRH0χ¨†ά<{)|ίΘ8λ(ω„…ΐp ©7ΟΝ]σ₯φvψ‰07ώMu)Tδ ΐ_μϋh#Šθ+ŽΤ/ͺw―�]ΔC6½VCbxX"εtδΝπbYT %ΣO7“­΅-SΗsΑ θ€Έ‘Ήήφφ¦%pΤΕΔ²W܍ΐ�ΰ}ˆ2’₯vŒR„0χ$βl ΫF° QΥC{Υ6s/Β5YŠ=ΣΗxΆς»€VoάTχ—βsρς9«`ZG‰΄±ϊΜwθ”gξρ€Z@"ν‘"„‘‹Q¨-#› BŒ±y’ ύt;Π8`Hœ ’") Ό¨Œ€JΠΩ₯lΆ”2“tJ₯Ž9ͺ·/cRf<–LΔXΰ¬Ϊ~­E‹Ξ#‘:R¨σKgςΕΙψpξV·8+t@‘Tς@ο#3U Eώ��3jWΫβ\A8b�΄rτβ[ ωεεw¦€RΖl―ΰΡΑΊΈtCJJfί”93Ϊtƒƒ "Ι+R‚ωV¦]λE>ΪƒZσRξˆ`�ή©7ΈHz7οᏲgωόhA:4ιL‘r*'Δ¦Τd^φηΐψ ν<BU΅CY@?“κ^!…QΦμ6η‚ ΪγeΞ 7Δ―”5ˆΒδ§E‡�W‚<΄]'8Ο=¨‡"μΥ4 {»Rˆ›ž>ev7i‘‹ifςΔ φ³,ΜyΰΗ"t�yCHˆΝUΣM;Ζ$-'―Ύύ6�6Η'OB@³ΉΊdξ\yۚJŒ .�ζ―�ηΏσG'/<΅oLWA;ͺσՁΞtFΰ?ζtˆƒ�˜£ίyοΞό`΅Υ>8ψΑάέ;Οξξ§Ko]HX[ ά¬Q„ΘΚ)cΈ½ T °ΰ!  ΄•κŠEmM°j£ΉrUj™1Œ"/^|ˆΰ.jή{η-‚Αš™>yΖLMϘ·^{-€X>c�·¨σ%ΘV ] ω κ6ΧΧΙH!‰'8,h’˜ΟI~«€8‘aύΘΌ5IΧΥQ”»Š€ς–°Q€’ƒϋ·o’;΄FwΚ4οοΘEΐ/grΙόα?€@@Θτρ3flr„Ž]U³8{kΛπѐM˜­dσ΄dS-‰pl•HŒ:@ όFπKΎNYnΐm€Μ{$άc³dκ‘@ τ’όX2ρχž „–θd‘ κ%K–βA2i}₯¨mW€ .$?…·B/dՍ“c&S’μ" Jΐ ϊ‘|ΰό©|CΖ‡99ζηPs’¬h7q9'σ[eΜZˆtέ"6�ΏwΥ$Ϋ“—β{”‹PW,0€vς\ΖG`2σ‘�ώΊΫ;~܎χ›?F-Β:©]£;=RΘ`[Œ0hά‹Ϊ¦Μέω{”TPRΐ*©[A»―ν…άh™»wξτ›f]’w€Ξ9²‘" ˜aTΏu€‘LZƒ"sdž&7 · dΝ dšέ*φ†˜hpΥΗσؐ:2�D–!T‡°Z ›¨ο>T Mζ«ε!ΫΚίs(HFΖPZw˜‡žξ^λ ρ–„^_u©P-΄ΆB6�Gσo�W�ηΟBmΐc˜k~θ?ω™γ;λ«fώϋ ΰ& +ΐ¦:υ$`q{6ξ@φq5€—� π8vω}?σdœϋ-±.d˜Η2‚0€b ¨Σ³’yαzJ{Ϋib]1ŽNΐν/πγ€ρž|™8D €Φ·Ρι$…‘Θ΄0%€“΅uΐž»~γ$ Κ!@z2G>m”ςE8uꌹ“C)Ε"†ΐCrΞDͺ|ˆg L,>ΐσ@pι,BA€ωQšΧƒœahκ„Ή3χ‘5φσI­ –ΟΗϊ✠aVwl ‡ξ(˜πA&pNΉ}KόN׏ƒ}Μ2£–hRGŒΜΑ–‰υ ρ|NφΉΤ+μΎ:ε CƒC¬‘ Ή†,έ–φ0ΆοΏ�Ž9}ι<₯MQ“ε΅~ΑϋόŸc½ωžΪv8χdφΗ’7‰α±#SNή/Μ9RGν€.>ž'θ@γUyLέͺeDdB>jn˜^Ζ ‹ϋT£πj@Δ”QψΈ§�(έA8‹YHΎd€¨ς!?ΐ:ήΣ%ν λŸRΞ©"ΐϋc?νE© D—(΅Ψ#λ―ύ{ότφ:„!ή(ˆ†ΆφˆΊ˜p^ΕόΌΪεΪ΅Βu5οR;΅d�!˜dN*�Γ9!Ώ΅@”"ΜGωN»οֈ£V­Ω*€=”\Oυ?mΗ4Λ³ͺLayqgΦϋπY‘ΠΫ?DIδΟμ%γ_‡ ©WQ q"ώ5FΠ„I[z₯ρr³~˜άž<ή,./™€Ξν φ$]ώφήg¦gzξϋΨ™ΩέΩ » ,@άA’BͺLΩ.;RJ‘•”UΦe%vbΛ±DbΩr‰Ά’²£”‰₯X Yoz8�ι₯�…Ο‡K€dО«ˆΧh�a;ϋδ£Ώ.[+Κ ‘D0¬.HΘž;”oAtNίΎΞ=οQΡυ•ŸϊΫΏπ…Σ/ώτ}ΦΉœ~k_΅Τ"P‹ΐG"5βΰ#1 ΅›¨Eΰ/F<ΙδξΏϊ_�αοΎωϊλ£εŠχQΪ­λ¨i–όV`%“α$Λ1NFNYρ@Y™Fφ4™ά0`#€QœΪdΙΘojŠΓΪdюž³ώ#GΘ2ΟΩ=άΆΧ1+‹’Ρс=ψκ‹ ΩεwΟs†GJ Π[&ƒ�λθk˜Ϊz•)ŒγΊ]©ΆU#eθφδlŽΜVfŠ2_“©`Έ·=ηΪΙΙO!Œϋ} ·ύ _"c, �Ÿ,˜ZΦα’.ΦF �G{7ψ{ηΧ­ 8χy5ΈχΘzΚΐ¬˜GΜ‘_|ݏjΚ[;©%&[™h‡0ͺ“d[Ω³8}θC9™ω�θRΐn9¬J@2&1dϊ2%«nεf/πη< @wrΞηŒ(: gΒ\Cύά³ ίpΞυ΄yˆH]Ԏž>aiZ'ή\šΕσqθΎE ρ’d3ΘΊKΜ•!­pΐW ³φξnJ:ΘΒ2�Š―OΝ8eΗΙsηœA’ΐΏdΣ:8ΟβΥ'«~μπ˜ω–0½[Ϋ΅^z‰λζμ½Χί’ύ]Α)(/e$ƒ2‡#�@{€Συε€H ΡΗNΩΩO~�ΉΧΩλ)Κ.κΪΘΎ2&κχ~ΌkΘ: T�©7ι]„qαδ�>(Ί•d]DŸ˜ι3” ή£„&O†3†ΗF‰ΐl.P²A•œ₯…ΈFq+Γλτ<€'ˆ΅U«C ‘~φ›ό^Χ#/ e3%{―fˆ!?ίE•²ΗsΆb48rτΈ5RΩTE< Αξν‰°C7‘―°6d χPΎ’1_ΧτψΜ'€|Q)†,K5rl”<žKo)/Mιΐ― “P*€*ΔV €)N=sbe•±γω=8G °o¬RΊBΌBΤ¨«u¦Ÿ ·ΐ_ε‚dπΙΉ5—Κ̙"_•δθ5RΧΈ�²ΰΫϋuΠ70δ€ι{)AΥΔ£xα51Φ«Ÿψ_Ώv?&|ξAΗ ”"l%ά !\Q+•ΙύΜ ι˜‡ΚΞ£υ±Νω«“D²1·ΊΘϊfΌΤ]υ=uύ} —Ž9‚²βqƒhάq`0G—“e 22άGi nQ�ΩD»P­U†lJηΫήZ5λY]RΔ9ΐο771m„9rΨή\ϋSW‘§ʈκ‹ΔA™΅ΦDKΚ¦ΆHKΪ2�9Bͺ­χ ֚—Έ―.-Y²›–ˆ[kΆΐΡzθΠ¨# Ά!±F+›”₯lΪ8~֊ \΅oI…E-³»½Κ>'G|M VΓμΙυΈ<%ͺ %φ¨pBΚ Œ]y>?“Gή +σσNΦΫE dΨ6ΰΫ ‰;D ΓΓ9Ζ’ioYXΥz²”:"D€zQΧH“€.Z—ςV`Sd―δσμ9Ty>ΓιμΓ¨P%-^Ίφ­Ά�N»qσŠ}νjύ}CΆ‘#ί•ΞŒŽŽ±†ΣvοξmF›ΉΖυϋioH\s(04Ο‰k£Τ3Μ»4^,ς«ΩΫ§‹KοH?m Ψ.-oŸ}α“΄Δ\G…5C+E”̏Oζsm-vεΝχμτ™QȝˆέΌ~ϋΉc§’uA Sa°^ΆD ۝+Χ­ƒΆ‘š_ιβͺut}οοώΚ?ϋ₯Ž#ΟϘύWeΧ.R‹@-΅<¬pZ¬}Υ"P‹@-?ΈόιŸ}oρΣΟΏπυ›·/.”sέ8ͺor`q˜φ)kΌMm΅HΥ•K*Ω�«1ηψ L'ψΖύΙj[G'σ%ΐ―Η^ώΟ>g-όY@a,SŒ,βΣ/~Π³�žnkΖΥϊΖ΅ ^Œ֝A @O@\F‡­dWL84 ˜ξ‘y’γ»d«ͺ·Υλ”IυA^ΘψLJΘ•V9ΕΒό]δŽμ•λλΠ©ap"Σ0lj°·ίψ–ν­―X„χΥ!ήεp― Ώ_½ΫΙμI9PΟ½?ƒ’`Ÿxαe—ytξλdKKΤ—WΘΨfE6π«T dΪ’γJ^βp=7yΟ™t΅rp?46ΖAu‹Zy™‡)ρ LβώΐUƒŸΗrIqg;υΐ@IDATo?@%o­Τ;OOS�O6Όo^Ϊ;l§;cΛ‹s€Ϊ9k ΛΧΙ>/P�x9�η2Μ BF¨}]�А­MNRΫO7Y6} ΄uvΊNΚφ�rΤ1* €Ξ�Λ|.?° κ€uκΥg(α˜™˜wΩθVκ�}€•4ΰA΅Γ"VԚΝΥ|§eoΎ΄ΓDQ ~σKΤ¦C΄(«ΜugO'ςβQ» ‰±Žδ]`¨Δsηx`-6₯8(Qj‘£{€ζ_EŒ΄y'"K­τΦΧi£ΗοKtpΐyƒk–y­S*0Ύ½GhΌ/Π!θ.cž‡ Pμ•νέ’ώ»ηΠ!λ<χ6*e“Γ2Qƒ*λj@ P­χ”ε­Š8P?₯)2Τt_μΪ d$H]=¬εζwŸ:q™|ΘΦV‡‹λ{Δ6ŽVΌ˜…Όγ³γ\λ,ΟψŠΠςςϊΤχŸQ†²ΫE†,€€ΦE&p§Δk Dε‘Y_dύ³D)Kςs―dΖΧ&η1,ά £Γ‚-Ο’ZΒΌπκϋοZ ΅L(¦›”h0―΅ΖDώ©ž?ŽΙ‘ ψͺϊ3ε)*CRl�Δ.ˁ_e©ΩalτθQΘΖ°έΏ}“5Μ^¨gg/a‹aNb,)o "™Dν…ΠσγΉΤ!ξR›+<;DνB{ W4οDΞ554Ήη�ΌSζ]롐Lxm ?wχŽ χ�ζ―ΕVfΉόAiS ΰ ΒΜ3ζZ *ς£ΤQǁγΦ14lηžxΚξ>˜$Ž>¨ vρQΠ~Τ A'΅DŒq‹γ粇ƒΊΤˆ©γzjI8|β8J―nδώσψ‹ΘΛDΜTΐΊ‰� Šu’ΡσΛΣD{ΚWJάψπ±1žύ@ρ@Ρƒ#₯NΣ.7N@²νψΨ)λο²%φ—……όO(ΛRΗ”aΪΏχyv0‡ab/–Φͺφsύ<―1Ԟͺh)ΉΔ>έΣίOŒhsΉΎa]Ννό;_ŽHdTyT R£ίΎΗœ\FωBό—P6x(uΣΎ8qά>ΈzΓ¦&¦!Ž=ΞGηόχΎeγχ.[’%ώυŸόιŸύ;Cg?7nφΚΑ¨ύ-΅Τ"πŠ@8ψ FνVjψ‹W^y₯ς?ύΪ?M��ΞόƒΞžξΧ�ڏύΥ_Ώvνβξώ#ϋ²vœα™VŠ" Ί-pΊε+ΐαΝR†)9΅�!€«Μώ*ΤΜ*»sφμY2:y›Gq μSœzεcǏφpχ�,ΝΫζ½έy€ε’­ΚȊ„:‡Iδ»dLsp­,.q(θԚo—μ“ €š‘ΓG\VΞχR3¨&»@†1œτ{ΤP` Χ!\.ρ~²b›K–β€\ΟλB(ψhλκ?dG{ά0Ό³ κ“e�§―:ϋAΐΫΒμ€;ˆΛ€.Gf7 rpχς’ηξ“νΫ#³KΔ­whΣ?κoΙDΆτΪ Ÿύ,2ήΐζYaŒ!=a@ λ+;.YΈŒ·βKτlί!šH΄ƒ5›Ÿ™q7– œ{z;¨KφΨόƒiΚΖ(ΚΑ:H­ΈΊ ¨·y£G₯U£xAΘ/`,(X€oΘΕ1v!ΐ·$Δ^@|ωύ½kWhΈbYZT¦9dοΔΌrLΤα/€ 2†Ή]ΒΐϋΒI$γ>Ξ鳫¨VdvV¬W9Έ―Σ™#β[ožGΌ)AΖ΅2₯%T-vΚ�ί™ΖΤ²ύςZH‹(€\ΡΌqθ— ~©{ βGfR>ˆd)Q\T-6γ,''uηΐs t ΨyAΘ-―“α/Ά4΅ρe²―ν-δΆΝβi7§όL ‹³d;‘𷖐=λΊQ΄`’~?Ψ�΅O�θq·<΄―Ÿω•_(„rΥw·6‡$ ίΨν Μ2V2ηL"³w@ŠΉΆJΞ.ΙGkΚ±GΞ’ynq€N~ u¬5οή†₯HβΩ^Γρ΅ γρllοsČΊ ¨Ζ]e3z�ČΤ%Jœ³~DΩk‘0¬΅1„…€jΰυ€έξ&L4λς7Έ²‘;w>pkXΩ}©t’βGϝΰυZ‚ΑΑS ώωmxͺΈV©X2Υ …€XAƒCYT…=B`R>y)u �π ¨Cu΄0;eΣ ΆΛ}…Xc~_Υ·P:‚™žjΫWwΧl‡Ήαυ‘€BU`ŠΙz™B%δοg/ˆs�κΖ‘ηΥΎΒτ‘¦…_™/«θ[*₯<Δ}ϊl|ό―Ν9ςHΰέΓό3f³;»O �[‡•ah/JC~d!&dζΪ@<»)eh˜ϋΨ?0WξPΰΉγΰξi`½Γs)#Κk€,π.ΰΏΆΊŠ"$η<:Dˆΐ Cj¨Δ¨Q–£KΘ:­hC(…VΧΣ” dM˜ Š)sίν]˜·’ ΗγΕΓEΤ²ττΣOΪι§>Αά©sm5—η—,½•’Ε)χΙώ(•Y‘_gP|œ=†!a#e1˜ΨΚƒ€}Έλθ¨#Šw7·!Ρ‰@ˆ”ψΌ"�¦ JΉΧι©IGDƒ(ψjυ+σΕ²”)"…τœϋŒ}ηͺς3£doQλΣϋ4!τ(d �&lC&wb :y�]ΊτΎmRr±9Ή΅½G—›5~…ΠΤκe―^f]£dCλ`aqΡVπΩ™Ÿ[°UH§…ΉUΊωά΅{·θΨγΛδξϋΝΏ�~υοv}yŠ7hfΤΎj¨E \j₯ Ή!©έP-"@ϋ¨ΟW«Wx�«HοώΚ’zΎλΰΦH¦½ŠτXž’ζ D45ΕΘΜ‡]ΏσͺΉ:Šev³`“/ΐ€€7o\₯A–’jځ‘ΩnKbτE;ΖUrX?}φœGύφ­W�؎8Cf΅hΛKtHΰ€¨ Y /M²Ιj¦ΙŠ+Ϋ™¦5` π!WsύYύιe‚˜η»Zζ€Θι_υσ^άjgΠGΙ–yψ½k}ˆ4:W@²Nέ³\ΣΥ«]~ς€r|aXίΦ ΐ]°₯·t‰ 3*³6ΐ‘V`N·2χΛΉXr @ΰ”Γ?‡L�"vκ°43E†CC‡Jt(ώκW~?‡i$Γύ.£s²ο,…3„οQ2ΡΦΩfύ#r—h$Δ…Ζΐ±E}°ΙΑxŸ,Ύ‡xΈξeθœͺ‚ϋ­ƒ\ƒΚ?δi “»Τ>QU}ˆ?@)€Ω›š·k·οSn"gtʁ5ιRD‹κ~ eB„,εξnB5ΟR†HπDΕ ‡J&΅?‹ΰΓ°£Μ$�‘γGνΔΩGmjeΙfiXOΛ=•Ϊǚγ֚lq&p?όb£έΊ~Ο&oΣεπ– ]gIΐ˜kͺΦ_ IρV_zΙځBόLͺΘ2­ͺ ί―Ro‹@ˆ€·Ι–bήXΒ$ΐΈ1š_BβqΚ"ZPaτυ Ί v/uXQΟΎ a&σ7Χε\I\ρΥ$NΈϋΑu>Uͺ–οΤ‡ϊ5{υN$I―Πκ‡Ε…ΐήA]Ή (%ΏΦs6QR±ΑB”βFΎ-dΊ΅ήdπΨΪΪγΚpΦΆζQ΅,Yσ2_X΅}jΏv—yΖNm'³”οΘ·cwk•J’‚δρ\Χ %ΰ«ξ"]ͺ€ΰα ΈΎ*Ϋ™_€7\qΉγ7v4Ϋ©γ'™Οx|pίψ³―3N¨O˜ƒR£HY�”ΔĎρ“:„ŸΊkI‘Ξ*SRY†dρa€κ2J¬`Π(β¦H7–*@8΅K{F”­”Ϊ ΖQ;1Ggn -癏`½eμ6¦₯Ε,%+΄qΤ\ΡQ œ αPδϊ2½τBŽΙόtkƒυΓk2[x/° ”ΙpηWΌBά³/aκθοάΉΙΐΈ•ΏŽΛ¬Λύ?ΐ܏…šX3»™tm D‘ NžZ}ωLΤ7AFα7`―ؒہZ9ϊΨ;›1‹ν;BkIΖYͺ›dΩ& ΊΏ½"¦ΛψnΡ*uΧΆπBQ懋Ζλ­«o"BΎŒ {�žOλ‚ΡuΩ?s:ΐή-sΥ§ž{��|χ->wŽ-‰ηc“2άΘΧC. ΨVbΣϊ0 e�ΡΊΛ8{ZίαΛχvΫDκάσΟΡb–N©MTI¨†δΕΰΕ€“Οo‘D+γ/•—(&Š%(υΨƒ4\Ο€Α7‘FΖ}FQYψx―ƒBfΗ) |ά³BGϋλ~•=…ω §θžMλ?‘βƒ ρ#%ˆΪ”†ΩΫ–fμχώOL™—i aα_ŒΔ£ΚF’(γt?N­ΰHtkaάΣ#D«λ”ΔΤρ>φ°x σθ“OόΏόΕ_ύWOΛ�ηφͺus¨]¬Zjψχ"P#ώ½€ΤώX‹@-?˜pε˜Ζ9ShΠλΩΖt­ΒAΠ›&˜§΄ ης-κ†�”IάM‘K#‰o–36‡i€™ΐœ€’Q€Hœο‰{wμτ©#φτ“OΨ,β«—.Ω­ωκζνμΉ'ΑβΪΪ’ #Λο:ds’‹ς_3% ¬ηg¦,[r\ΚxιώŠΥ–N&Š[€ωI>ΗΤdΛ_‡ή-ΪBξs¨φρέa‘CΌzΕ‹Cν±jΌ]’±ΡgΚ—@e'ΖyΘ–Ή'u™δ»΅-A™J:J$:©�¦—}$΄Kηίvυίc#”" b€ΧOά‘xt“λέb-€Φν²tŸ²±έΕ‰]‚zπ ΩκFκΪυP�Ε m%1°»φθ#Οά}Ψ«“²›ψΥ+«ΛΛd•»ύ%L―Ί1S‰‚κνε8ΏŒOARΑ™ΨΥ6 evQm(&1$ΰ@qŽ�±x“ƒ 3Z¨�I°[ΒO 1G%€ο±†·ˆAζH> Q'ƒΑ:δβ(‡ΐπ�^ή«lΌΧ�ΌLC¨Θ*ξ™ψvΜν:)K#~―}σ5Μωθ$šρ³nΣd… ˆR(ˆφϊ)�:R }°ΐH4ˆ%Ќ―2ΜxPf£,6·Μžγ±΅₯UJŒ‚ΘάΧΙXS²ƒJ'LiLu�μ!Υ³gΎ­ τς:`}©­ Ί‡(»@Ε B*Zω,G@2χΌceφŸΧ†Yή4m#€^yΈμ‘Αήlΐ«;zμ„]yύ»d€)·`Tό•)ΑΓί$D|Φσ>I72Q…ͺ£„ b†ϋΨ— ‚}(hOςό»±1Ζ ™ΈIq°C{Αu/Κ’ΩeJ” X£ς'P‹L ς‡ΟQ r‹4j$έ·JVd‚¨ρR·θmφμ0[†•κώH§1Hψ)Y8m‡ΜΘ°–οŽί²Σ§Ο hjrχ�ΥΥεΚn}πέΈuέ>ύΙ—νπα#φή;ο؟½ϊ'(<  έΦ1²ψφUΫβZ2Έ ǚXχY»σΑmδώό‘ώ „³JΌκϊΑΨTΣ”#°?V«D<ƒ”\1X\0ΖμΌ¬cͺˆ:dQ\Τ·ΰ;Β¨e‰u€υ*B2ŒOΙφδ4{� ˆ3Τ$L( x€θυϊRη7]ωΉ1‘ΉΘ((*ηZ¦εb0€…gΨM―Ψ‘γƒφ�§^ώΰώζΟό5�ΰ †΅�―E vjΔΑG{|jwW‹ΐ_„Ο=ώάoΡ=αNκŸτx�ώτ6‡ηυυ-kΠεΘζΙφg9Jώ~ζάγαyΧV±Β‘O­θD#›P,΄B άwf\{[€2Gt ˜Ώo»ωλNξ;zτ˜]{�" #;ΐF.μ'‘^―#ΛΝ"Υχχ9ͺFY¦Y:όΛΕ\¦bΚΦ7Άξΐ3Λ ˜οŒ·Ιœ*Ϋ<ΨΗμΫOeΜ9@ pRΫBr«ΓͺΪ’5χφΫΫ’λcQZ‡ b~Ψιϊ½§©›έ‘έgu2―€+€΄U€~°Ο«�~Ÿϊήf‹»€\‡|ΩJɊ9ΛrΨEΒ¬G‚³s/Ύl³“·©‘½Μa·™Γ>.^'“+`2G²­·§x2œwοβόήh²|==ύ7Q;l�υO5ζ‚λ΅1€€P+γΆuβ©–ˆ^ΐ6pξχ:A~δ12k;67;R M{EΠ–8ΨΛηAΩγν΅mwπΧ΅Ux5`”νΰ#c¬vk^άy²Άq�ΐ(<0«Δ9Ÿˆ"‘³ξΎ.ˆNj?H†₯T‘ΌψμιsΆ”ω­χή±γΗO90W,NAΥ«u&χ§ϊs©V?ίΌwšτˆ…sόŒv™›d�‰‡ΪpfC2δι €VsϋNJRH’Χ¬%΅ŒΨΠΐ]8��“Ϊ§Ϋ{΄ͺfrΗΝ²‘±Γ2Λ‘Ήtnχ€ΌSd”'θΧΎ nƒΐ‘: θΪBΙ2=1nƒM(ašΘΌcR¨DR~ώŁοα~{ρ3«γΧ.N’° 3ΎΚΐͺ�sσWfvΑ‘PϋdHΓR  ›θήZ_ΓyΎb ²+ŒA˜�ͺD@΅’ƒάlBz¨Ά[&€9ΐπ>κωMπ‚ς1δWˆ7yQp£—β‘̏DˆΘ{!PD@IΉ"B/Ž'λYί;Ά°Όˆ‹ύsΦI3>%e€£JpYW哏Ϋυ₯οΈ5/ —e�pMeš‰΅ΚrιM|GΊ¬Μ=9΅0ΤΦS~9X„½2¦™(B>8�mΘΆ>HŠ"έT> ”Hέ=˜§¬«*σ³ ΅» gL{†ΉΟ“D�Aν EXI}PΤͺCJ˜Ψ…!Νf¦ Hx5ΩjΕ¦½»Ην9!€«H•ΚΘDVχ"ςRΚ•”3U@¨:Œ4φ£Μ©\F₯ ¬sž­ΐzήΕ�Εq"3Ξzκϋ₯ά(²†}μCς Έ5yΕΖ―έε”pν dckE­5π"7³¨  ΜλƎ^ξ0�͏ρvͺ ξYΖ)Χοά¦€rΖIf»K…fΚφζMΝΝ~!£©ω;8|Θffgμ�•+x½`,Θ%FzρŸΉΒ>šE vΒξήΌeηί9—Ζ°=ϊψΆ~g ςγI‘”GΑ}―­ŒΟBr(œάͺ€ΰsζšμUHΚ₯a憇ύc+e€ΐ½ώS,΅ΡJΩ%%P…ΉU‘Ηs‘§³<ž~ξYWͺπDF–=£Θ^ΰσχ)£βςΜq‘Ϊίe4‹ΏŸ₯?ΛΠΤC]•<τo–ζ³ 1₯J“1m�·TΩ΅ώCΟmœ<9vρ�½›ΤγΤΎj¨E ~(ςώ}ΦZώžφ­οΎ½σΣί~λ^ωκΫ-΄;•Ϊέێ’Ω‘>μlTΘ)‹αp,ƒΔ$m²”©(—.ΐ'©3Ώpψ[!:3=adn‹ ›š;lq‡q€f{ί5©ΫH�‘ σw@‰Œ՚la~† ₯’>d2¨¬4gZ²¨υdX—]–U*΅'” ΦΊ�ÁP ΎDVήÁ²ˆB‡Hέ›z„K!yΎ2FσΡΦkqcΑ†ŽΩπ#ηlV’0usHTΟώΠgάα|yaήeή½€R΄#{–ZWΖV­νΘΚSŽΰAj-p-Ϊ"G¦­Lœ€| ΄‘άε°ΛAVδNεJ²ϋeά¨Φƒ<Χ*†<Œƒκύf‘ewΪΰΰˆέΎtέ6VUAHŽ}/ε„[Ι nΜΟ’…U E,πμΩ£1TΔ%ƒ1ϊΠg |<οBόHώξg¬Š|nz“L01*3yˆeθ"€φ8RjΥR+Cklδχςˆ` ψάξ^Μ+D9κ»(λ΄ξ\α;€Σν¨'΅βG§ AΏ½ρ"€Œφ}9™'š‘iS>]₯<δΉ§ŸtATπ93sBΤNC$ϋ%­WΙ Bfr’fEξ?h'OYο`Ζrυ6vb2ΐoG΅Άξ6kα[5�Ε‘kΔν'ž{ƚhZTlΞΤΩ! qCΚή8\dΎF‘³ΧΙ©^1 ½OΉ*%1ŒK+ |’η)‘Š£ήК‰’4P+H™ž*#¬r eΙ#(v·–YΛΤώCΪx!ξΘK;ΣBŒ0\rΊžV‡JgΌ(($ΕΟ’l¨0Oδ½!ωΏ&Jjk…ύ£PmBaΡδζwΒo€,Π―vŒ―2ŠτCΒΤ·΄&ιΨ²ΊαŒAς>Αγ(ͺ¨‘αΓΤΒΟΊς‘nn?b=y! φχ³ΦΔ{#€]©uXV֘lε5ψ­ΰ%‰5:CŽ9—όΛxpΥ€Τ2bž'Ύ·ί=osΧoΡ5LΊΖB "Υκ¨f:ΐh½ͺƒξ· …Gλ^₯H2‚‘Α¦βφΞ σ‘χθaλ’φΒ·Ω*υ‚|β¬ΝF²ψ1ζΗuκω«μ'ITAυμ‘b_gψYΨ‘¬ξU ~meSΤIΫa¬œΑ!j‘ή‘{μ™§ls˝9|P¦y£΄zE!„ȁr΅¬πŒZ³9g—ΪO΄ŸΛdS{N‘ηΧ3I IL<΅oΗ’  \bQ% ¨—ž{ρEΜΩψΒ‚}p‚He8ΜAΗμςo1/γ… φΎ"p΄Khήͺ€Aή$ς³ΩΥέΫƒ²€ωΐοƒyγαo’ Sn‘Όώ_�—σ— 1ΧΏτ₯ίcd_yΨΛ»v½Zj¨Eΰ‘F F<ΤpΦ.V‹@-�o#π_πxςΫΗζ›[š�ΰρ§ŸϋΧAΏχ»;ΫΛ•tj3μ©Vb-͍.³!2Ζ’P+ /5‚$σrΪΞpX–~΄30<μA#™�ϊμη­ΐkBΘw“όΉ…Γ퉏ppkj"\‡woέ@z[ηδΣΚΈΚ”Ί‚ΓsΜ::{8< 0² SΚΒQ>‘βσƒeHώΣη‚F €½ά˜Λ”Ί–oΕA ΜΫF€SΒYc³*Emβd8}ϋYW\ΚΙ–^zο’­b ˜W-Ο+p%@'Βd—Œw ~$žδ3ƒdΪκΰ―Lm•η•GC‰¬ ½€VΥtKΑΉΥΥ€ηΙΊϊΙΆ«]`,ΩhΓ§ΞPΟάpΌiΧ.\t UΗ*2ήFΪΎ•‘—Λ°‘w|L·" bͺΞ ejΒε˜�֘9ϊΣ—ΐAΜΰ”9U—);$ΧUΙ†[•ΜΰΦΪΊ»W/^:εϋ¨c<P(Σ,ΒAd‘Jξͺ•,€Σc}ύύLŸν β@ AΪGζE@p@/πlMILΧπ―ΈvιšΝA¨υf’’žr€F€A•Ο;}ϊΈ¦Ώϋ²ΝNΟ8Ÿ‹fησ+ΐΘЁ’�‰ŽŠ=¨P�d?iQωkΤ'B΄αpή!@[™Μ4Aίΐ^Ξ'!IχŽzT0ebάΡ‡σ=₯τ !ۚFSoυ”Šμ ‹†ήα!ε ΈΚ™=ΩΪAžς•‹Χ)Ÿ8h9ˆEί9σΙOύΖo�φocžπpΏ~η•ί©όΤOό5jŠ?zϋφ†ΊpΚ†\FΪ•Ω0Žj­)U‰JuBO‰„bو""Aϋ8e΄„ι…tJ°ΎόaS3σΦ36f¨ZZϊϊ\kΗ“γŒ+νϋ3™ͺ΄ Θœ’׀ȁoω \Ίΰ0ηͺ%-ΚΊ³†ω; k_εΔ0NΜf!°�Τε³XΉ6cΕϊQ'σMPΨ0dG•υΉο+rί”’0οΠE6¦ρΥΠό ‘ eΤ#¨$tύ’Œ™žϊ*2―΅C±JMΡΜ—΅ω)nS„Δ§))rxΘΡ΅μ 8ζ1\ά—Α&ΧΡ:Œ@‚…Ή~†}«₯½_…Mqb}–ΧλΒφΤ³OC3xmρήηλ$c"Λ3ν±WaΤΘ„|AξΓ|Q;eθ�‘8κs#·—qν ]C$έΪΜ„΅ΦΡa€r°5Ζ)΅Ή aΐέ‘ΞwF³uŒ±Θ8bαG!±ƒ AϋX]δiR€m¬ΔH"BsΔp9»‰?ΑaΊΖŒaΈlsΣσu”–ρ™©;Ψw– o§&§œ Ό bμyaΖΏΥ„>·ρŽ˜œ”ξˆ5ά‚Αι*"ό#ψI€Ε<Ζ©›λ›ΦΩ’Βoe20L2ΙΥάdBQΊvΔ€όUАLΔC�‰ ’�G­U5Ϊ'U&%ΏEΠ eoΪa_=vꀝ8sΦπx°D—ζZ2pκΑ 0.{_Ž$βΩw!FσyΘ`φ`ν³!ˆ_΅a•ς@Ύ.š―Eε ε ~ž7Ο¦¦–’±˜ίΪ;Z―HσΜβτν«Wζϊo°iΧΎj¨E xΨϊk_΅Τ"P‹ΐ��πxΎT4�¬ξ[74…ΏΐΫςε/%/_»υβΫw�gެαmΗΕ:(*CΉCfΠc½ύΦ38  NY;υοΛσ“d8W܁΅ž¬ν6™· €·Ί θPŸγ�vY{ι-'υΰWοx9�ΛμPuΙ/[;΄yγ ^HŠ"…^§�>Nflψθ1Χ“ϋκwήuuΔ2,‘IUUφΗʐ ,9|ƒy)d�β9pλΖΦ‰δΎ133k ·ξYja‰χϊlawq2YT)Pπœ^€HΕ—αΉ9$¦Τ·> ‘"₯…δΆΚf+σOZ‘ηθrˆ0σ8”5UωCp“ ΧxΟρcvηή->}Κpλ7?@¨ 8Έtω‡kΥΡΆ©Γ@ž_ύ1Lύϊ0X Ι΅Γ€//^΅ž¬σΦΉ¬Ή@–όœΜœ{;1fχoέ²ι{‹x;ρΣA›CΊJ8"¨‚ΔFΧΗ€ήrτ’—ρ€JBΤ_½ZΝςMφϋ•ίC™wEΑάά’“~o¬S²AmW¬’ ₯6™Ο’»EΦ :Qόs€?έΏjΟ«21lŒΨέ;w)ƒA>=4Œ‘YΘ9ρ―,,Z‚ŽM±LΧ‰ΜE– GρΨγg¨EŸ$»ή, ˆODQBμsΖoϊ;Yκϋ³":ύ ΊΏ@F¨τ@ώ~/€άάu`&¨χΘ€΄₯£²I*<(Ι)‘FIQd½jn―,-"Qβqή# #΅Ερ%Ε‹Ϊ8*#�Φ«ͺ·‰£,ˆE ωr¨ΌGζ²kΛ³ο‰P„πΚbXΗg§P;δ)K²�½ŒΊˆάΌπΟήΞώB?€ŸΦmR!@…‚Θ eζ][Qζb,AΆςak²>§B|•ΑΛfζKΥ“ΐ„tΞ3ˆΏJ^όIέέ6›x!@σ—>o‡Žž΄ ―½F·žƒrΒ°ux—ϊΑ(‘9]`B tΰ|φΩ''F~ΝAΗydΖd χ›”dσ|΅σA$Φ^J£τ@½α³d•ρn@Ω±0‹Ή$χξηa’ΐ~Ι΄€?σΘeˆE:Θ pΐςώΕ7‘A―Πv²�γνε–­«·Γ>ως‹˜gΆΫπؐu ΄–“WκΛy� D€„Θ GP0Wdθ(s5΅ΦS-u@½8½`ι b_‰Ϋ˜ΣΡξq#ΕΡ�Ψ4@šΜΝΟY’¨7ϊ•u&“grδΤΨ?:vς$ Ω‡συ+_ϊΗ₯―όΞo?œΞ£~ι‘£>\ 9Ό�ψ dPKH‘½˜Κ>{ˆύΓGpΛOež₯ld‰L<΅οB2ασB.푝žY «Νœο‡ΤΩΖ|rcΜf'έN3_ˆ"³ŒŸ€δψš2Εd9ΈL�Œ*eΐΒΏ$€Ϊ€:HΒ>ήƒ2"iυ—α Δ;OvWΤB±ΰ—OFzƒ6«2„ a©_ Ή�•Υ¨£”όoΝ{ΚkP hŽV“* φΎ’oV5΅�όV@”ΝΞρYϊ’©¦ΪW&1`yE½ R%PZσE€ξςW0λρJi$ŽIΊT¬Rr³±Jι„U=J€F Y㬙 IΖ!Α˜cUφ½W†•!ΦJ€u'”R·?δs”ˆ xΠ}©Mh΅ˆ^―ω©yͺRƒ J•Ψv6h}Ί•qε("ύ”<ωˆM’%Ψ§£λΈˆί€φΑΔؚ΅Δ‘²}FΆ¨ϋρα“2h>σ,„df‹Σ0£elφ!!Uο/o‰2eΝψ1ΘDυ3³ΎbΣ³“v€ο΅@ψΉ"¬Ÿ:ζΡ‰G±kΧ�Ψ*dj2JmLΥu‡r™λ?Ę‘aμ0'eύ)7�Ά+šό1δY ’HΔmσΝ*ϋ“λπΒ―}τ™§-ΩΫi·οέ°ω»SȎ©ΧFžVθ·½Iζ%r2όΈ―_½tΥ^xρE;4<ΔΑίN}„RZ" €XQ‹ΞΑcΞ’{°Σ&:Ήν,Ο&Uَ>ewξOсΰšΌ-Μ‘ξŽX€2Θ$Ζ^’τάή*uΫΆ0΅ΰ@ρσ/τ i°[·Ηιό±ΙψΖliy‡λκ”D{Ϋή{σmKBv4“ω5ΔίψΛ?ώγΣφ?ρ‘νθ#Κkκ‚©ž‡¬­ΪVŠqν@”"ΏΊπ­aφΰΡFiBŸ΅υτΈ,Ώ@{Κ‘K­€ΰΦ\š•}€hΎ…ιδ‘‘Q@+΅πΤ©ΛΤ―,ξΒΔΈ₯πxP]=VψaŒs% ˜WΏ _ζl5η±Ά&Θ ΐ²ΪBήΈq΅K§ Q€tŽ�)\ ˆ­:Θ�5ˆ—m0s‹<9γVt•€¦Τ"qΘ%IόΧΗΨT¦\νUן'[Ÿ`]J΅#?‘aιέ-:H΄2ηh1Ι}ΊŽ όZ„ΐT‡:^/…OυŒˆ΄Ζ–N'‰ΧΔ+ρs‘ @t(]EP68q έlο^½‡ψCρ(Θι l¦QŸ4‘.BΖ§*7ͺc σZώ RWΘΘ•ΑrD’««§tA XςωšΘ<&d d±‘„_2itώ Sς΄¬g ΦΎϊ ΪD τ†Θ€Kω”IaRΛ—ikΕ“ΑS„9³2k£‘Gm$ΩgΣ΄γ”οSIΛζβq…ˁi`  /�ι‡žΑή{ϋ-›Ό?n Œν&ϋ0ΏΨΜΜ$ώ1q«ηyηζ,QfŸΣηωˆs•΅%Χ΅λdί,rέjŽϋΪ…$ўΐz“‘¦H‘ΐR{Ή�0*SP;K½Fegπ"¨ … Xωhž‡Xπ™*Ί²*|aΦΦ‰PβZκήR€TAK!J©φw•ΉxBŠΤ3·λd¬ͺkqA^fkλp}ΜΙ$d‰ΧΟψ2š[QDeŠG†|αG>ϋW——=τς#�YϋͺE Z>”Ԉƒ%¬΅‹Φ"P‹ΐÎδΞwθ‘ma†__ύ—�όW‡η¦,Q}ζτΉΗώ ―·«tαέοό<‡ψγr³’"Ψ€Ά6U™‚²‘Κ0*λ|όΔI;�½οbΐu‡Ϊτ.ηΪ―Άkχο�Š" @ύtžC_œ,Ψ(YΥυΓN’d·#•v„m§>eΛw8yΉ?Ζ!”Γω>Z­ΐC5υξ$Ι12ΐύHj―z[Ή"( %“vωέ·­΅½0EΧΚ&b Νφώεχ:pπέ¨ƒ§\Vӏ4ΈL” ”W‡δ‚ŸΓ°$±JΛ¨86S[C%oδγΜ“ V›μWŒΪΰώ£GlzqΖnή½ι\# E]8b” μSzΰΑ=P†~?¦oJ―‹₯`‚Vƒ΄Λ‹γΐεl Ω~)D†’>λ%²­zœΓ•iS}qΰ4?ώ€ίSŽ=ƒΟ3_γ> άχ>_ΝHšΉqP„ΓΥ—ϋ0ΟΛγω ΟWΧ Υ0«­š—ηθ“μ9“ΪœSΗέ�dC³yλΓ8ΩΡƒφrΧo“ΥFς(P ΈS δαύΉ]TΓ'νΠΐ¨Λ|fι{dτ°ύΘηL0ΛnήΎΫό-δ*[Y 2Ά2­C/β (VtqaηV{5Ï"…œŸgμͺ6» %ŒάιΧ  ΌŒuA@PzαΚx4ΤΩςρε9dxΉZέ΅λγγ6ΠίmΟ=zΖFΪφΔ΄βΎO&/σΘjFςϊυ»O<υBξΦ­;εϋ·gσ#gBζLεˆDΔtχΊZϊυ-H&β:οΌΪΫiqΘΈ¦θ€1=7c·ξά΄Ϊ{>By¨³Ο††mƒ�$J^ΖO΄SΦ6ΠoG‘©ΏϋΝ?…8Ϊs2zl•jΔUΟ―R…ΦM™2›\ …NKά}τ)jΛ³\#>Θ;y2\YΏfζ\p-PΐXΚ’G9mYΘ†I€9){ζήR3π`Ξ'�p…’ž7„’G₯JΫ Uσ{κŒfžJ…P"Γ�V*¨ό¬Α{ƒΖ^Χ�χφ{M²ƒ }e + κΛΪΎTΚ€Τ*±•΄_§,(ΩέCό˜Ll‘M‘˜eφ²ΆN+Θφ‘(Ύ UΤκΪTέ<χ_ή‡ά)Ρ’•k©l  xUΧ­­ΑxC‹ΛˆK9Q Ϋνγ½RDYΏT9e|όΤω(‹ˆ5Π=r§ˆΙ_Ÿ�+οJeΨsπŽažϊω3²&ΪR>’Ŋ’ΰθIˆAφ˜…­=»;‰Z‰ C π Аrκ‡"MGΟ¬Lμσϋώ ‘|Χι�R΄mΦlXϋ+{ΡΕσoΉk¨”ΐ‹ ΜϋEΪp!I‡ΈwLaYGΎ‰”E!ΓΌsώΔΟ‘\\A$qς€|.ΩΓsΊύ‰4Ζϊ€XαψK{ΕGδd R@m€Uͺ–‡ …&γQ(g‘™ –»N¬’RέƒΤΪNΒ΅8"Y$„φΐ‹&†²+Y©�!ž«‰N !Θ††ζ&ζGδB‰ΐ7!Ž>΄ς#έ~ν«ZjxΨ¨;’΅λΥ"P‹ΐ‡ο“€)ν&$Βύ™_olΨΡ�oΏώί.ίώΰΪ?™Ÿz0:qgάΉΎͺAΛξ¬rΐΜΨΠπ¨­Q3›¦Ώϋ₯σί3/@²RΖ•œCη.‡ίΕ΅dΫP   ¨BΧA€y[]»…Ι„Κμ�KFXdzΟKbξ!žΐΏGdʐh’iβ³WNΫκ6ζmΰΊι­Ϊ1ξΖS8ΛpΈχD9ψ²κΘ Fwi>O.κ«φ:υΜ)‘5΄¦μlιpΔR Wϊ#GŽPΎB Ρ©„?€wdυχ651eσsΛ6ΏOVŸ‚ˆ«s.ς<Œ6σ˜ΎQrA–z‰ω1]˜ΐ%ζζsjυx‡¦ξ(Sξ·ζ&zΔσάcƒHο ”Œ4#έn$[œ[A “ΪΉυΔΙC―9Τω!�ͺS§žΛ±ύΏώκΧzACgƒ2ΕuΊ 0—Uς"Ά$ϊδdωk9ςCLχ5 νZ[Ϊ¬ŽŒ�<­IUͺΡ‡bœ¬qγΚ½Τ€u`φ؊ϋ�μτ4€ΥΌ+‹©CŠ/"Nσ°©»ΛϊO·Ι «i€,|ͺ'ΏΙ|φα[Β+tΣXΒΘ―­£EHƒMܟ΄χ™[Hξ‰Ή€γ‚δ…iΊ„ά?aMŒΒ+Ό>ΨΖQ8ϋž†tΈR’h#thn”yG #΅ƒμξζ λ�±0 ’FΙΠ‰$I‘ ͺ 1σΛγ9(WPwƒ {ΘφΪ$%N}ΜoΚ πI‰αΛQ¦uk9/4ΗΪν> ½ΰ·›—n–ُ˜χ~ξeinΙ©ͺ¬…kRš2xΝβw)Ρ(’ύΟ �Φ^ ₯ Iγυ- \™-Gc2Ό6Ηs¨ „< ΤΆΦΔX2AθΗΫ„ϋ,.“Ω—οŠ’&TΕž΅uQjaέx¬‘ Sd μ*λιΝu|Ί‚`|ΉΟΎ©}’/…0Ÿ±A&UZdΖ)UΡZΦ^β*·Έyα}Θ ·“"ϋœŒ EbπΤNPoŽΨP)‚Φˆ”H%€WJJ±g1•jlQ€vβ₯Φ–ω ύ€ώ uΚ`jοκe(²©Ε«Μ εE"#ΝΧ—gA^J)Κ²6wΆ(ωhδ>Ψ눝”yJJQ9L#E&ϋƒsΕͺ[λ*QQQΗ΅₯€RΙ‚ϋbž©ϋBΨ±Μ* ͺ[Ϋ»χ{ϋΊ�*rɎ–―ώ�ίϊ•‰�ζgΏpπϊΪ�Χ"P‹@-“ԈƒΙ@Υn³Zώο#‰ε„ψύ―Ώρ‹_|maςόΦ?ύg?χΰξݟΩ^Ο6ŒΦ%1Αλν²Ω™λ§.wKυγdΧ’φ"S-qΐoln§ α΅Ά8~ψΥrQ²ωMdάνmΌwv†¬kŒl1Tώ~τπ¨ΝU‡¨Ρ§w}^™>²[ΚΜZTΚu@ˆ„9e†$λ₯μš)ŒΦT+γ―-κ, ₯‘‘ўyςEg¦ ϊΪβuρ΄²˜δiΗ›άuγυΰΉςsζ«φiΚΰ*kΨCfΈ­�k3‹³68v”ΪZκ›Qkλd~7νpΧiό!(Y {{αϊE»uΒb”Β\‹λyΘςVMΞP =scΏKο]s`Ώ·Ώ Y}·EΊ!>–VνΜ‹/SZ°a«”ΘΜN&`^jΈCΌ©[mΥw—”Αd¬ͺ”Uμjͺ)œ 8hW”U&«π8°+k*Gv΅ͺ@Π=I±ΖΡΏ§§ΧΊ ΪΤ�œ/Ο�υ‘™l(1'0Ύ˜έ<ΑI’%›/@Nl �—LY`TŠ ₯οέΓαŸφd�uψ"u–_ €ωΔ“ΫΡCGΘ6’‰…πPϋ%Tγw@�<ΐ3λ€ ·γJ`²ͺ₯ζή%q& `FŠ^ΰ5o™�e³€Ј_5Ϊϋ• €χ£ ρ`?„€ΒΔδ”M|pΛzΫΫρ}H(N―φύ₯Ρω7·?¬_YC₯·ίώ6. žΠ> -BV4Œδa'Ÿ8EΛΠΫΝ₯­Ÿ¬ωέϋχνξν;ΆŒyžŒγd˜=Μ• .†j Νλn yτδ)λΐα%5aζ‘ˆ<δϊ·>e2*§ϋ2kΤΛ(’πΩδšIζTP)p₯ΖΏΈN™Pžqؘdξξ 0‘ Š84°7Hφ."’θ ›¬₯«›ύΓk›Λε6φžB Kόd.("Fc―ύaŽ}EέG(Άρ‘ΒΒί₯»ζ‘”M ’D©oŽΫ�τ4s� 4‘PΚ”:l%Jg4dV¨ηΟB¨΄@mlf㨍Ά(+`“`LΨƒI™Ÿͺ}jΉ‚z"€δžuWdμ”Ρ—�beiž²Fg>«ŒΎΌ#ό|†ΐ³<"Ρ&kο° c60Ьr-Τ;xXtΆ63¬F‘8,’2™©:€ΨΪ‡PΊωΞ%—‰ί@΅²OΙ‘u”<[φΥ₯’ͺr>G»£ϋέη”έwDΏ…εeνˆό’B%)ΎJΘmΌ3 fψL•„ �{R|pο`Ϊ}WφdπHΉ�†"$Δώ‘G•’rK Ώ‚<%8ϊ’ίŠŸy#r@DŸΪμ&θŽ"u’Ζ3ΐWΧ½2d”β*BΩ‰Z^ŠΤθνογ}ΑBWgΟ+GŽΎœφU‹¬9‰0j_΅Τ"P‹ΐΗ*5βΰc5\΅›­E �§|ŸH˜¨VΧ�ΑO}ζGgn^»υχ=ΎJsΌiΠgΘ|Ξ‘Α*bv΅Ψ€5^C Ϊ‘‘ΙͺB$$”$£(Ι²@φ:τ•MΌw‘£W©υ–L7ΰ,,?ύ™ΟΨΚΤΌσD(qpυƒvφρΊrυ³R 6!νU]v™R]Ϋzγ€Ι=¦ϋ8ε2}Y τ:ΘϊΙΑ ΐ¬�‘,Ϋζd6ƒ [&l2ι!μ%2θj�εCΡ°Cυ:΅Ψ%�ίήΧγ|tˆέ+¦iΑμνq‰’m­�σ½YAΖ~nΛΞ=c ‹sΞ‘ήO,|€\). €%™¦©wΉ@ΑΜΤ,o€†Ώ`£Θϋ«tdPF}m2ΕAH“byΟLMY’°δC†”₯…$Ο�b€E#J ˆ/™KJ†,Χz/υΘ!²‰ ξ$Τςl~₯9° εΘZNήΊγ2„u((^zΙΉΐΛΓΒθY»=‰4›ƒ;εr―ODv –8Δ€/'Σ6ž?ΛX„ρˆP :”λ…ΫΞ!ˆι\jkeΚ€ Ί ews5Ξ9»|ρ†ΝΜoX< 3NΧ ²™yM�™¨Η€g[]Ψt$”άηΣ¬½β¦ΥΛi}ŸΪ}M…ω’~Z)ξ,@+„šγύχ/“Y…0αžοdN ΰΩμμ�ΦYΟΩ΅Lαί­§X².XŸh Ζρ¨θ9:ŠšeΫVΉχ„Q +Χϊ|”΅–šFF€ƒSΙ–f€Ϋš-�†O€j R-Q$3ΎzΖ0‹ZGΎ0JςνΨxρ ΰz@ M£(Ι±6‚(-ZŽ·ϋWή₯³…Η:˜;Uό¦QΛ<˜™’KC―Δύ� @IDAT΅tχΪ™ν*γΌ½Eƚ{kΕ[‘@9LŠy¬Ή$IΊΎTKϋ˜r}‘f²ε*'ΠZΩζ:2ΐυ{γžpe\Ο[―έu-΅Τ"πŽΐ+―|±ψ•ρΉλ₯ΥΩρtfspuqΆ“3.‡ιξε[8Ϊοp€(ΦW6Κ«šΊωD£Λ4ΟΞΞ:Ιͺ3Ψβ=80ΰΆλ(Τͺλά#gνππ°MAFHͺξ²Y«²Ά»ό½�E²ƒ€·Ÿƒ³€―“Ξͺ¦™¬<•΅œΙ9Έϊ%ΝW>ͺƒmΓώ5τ |ώmΜχTβK’ΜΆcΤOΧΡRΩwN’Φ~hˆNνΗT1θ(‚…7ΰν½½Φ?2β΄0_xUV\ΞΰέξΨ… ι ±i2‘@Adς8ωc8θCrμΦςEψ‰‰Λϊΐd#=€·Ϊ ͺ.ΌJ–5ΗAYY@ϋ₯h+XζuidΤ~`n^YRe·ΰ€Ξ20S¦?ΡΦA@’CRpβՏ]mEˆpQΦ7Ms΅}@‰²‰ώυj94ΰπgξ?ΐTπM»όΞyΠδqZ‚πY[ΫΔν€cNΞΌKΖ³Jv5 θ©RΧ ŽBj³½άΠ!ς|§0eΫ‘ΫΑβΜ"=μw,Α”ζοgfΧ qfXνeD*]ρœ’Η-8H-$ω¦”Ϋ¦ύž`j…xmaβζaœu/Q²|Θ'Iς=€ydΘ‡!B0Ύϋξ/ώάΟύζΏψΕƒ΄ηxͺ?”Ώω­ώ…ΒΕ·. Ϋ£άc³Ώ•%ΚΈχ"sUΣO&™ς琹œρ;~‚Lk½S,ΞbIΈΚάΡψU!{D„HgYΚ&waΖ9?9c[΄Ρ[^X΄ιι—)μ±Η)ˆ9ο‚Ά�~ε^@―&J * α$³,ΐšL6Zw_'τε#Œ’y±{eŸw™λκ&Β ςsˆΤEUκϋ-IϋΤg”Μ>%Λ+(yκ’€MΦ\0HΩ s» €”Y‘ u¬›:φ }…™σ*ΠΌΥe‹μδκ*#ήάΕ\΅q·}Κ3Κf•Q¨ΫΑ:žλt@#€‡¦~αͺŽvʏiZΛξ¦w¬½£Γ6!DP5ΰύΰ‡Qg™*χ%5Ο>χ£5₯gS½½φ’� sΥyƒΠIE±2‡”χ‚:‘€θ °_fή�UF₯9Φ0SсεcXBΉ CF•dˆ`PPŽ�>8δ O”ž4P:Rεσ=2”©€πž%sοgΙ‡ΐrζ” TύϋtέPΜd\YD₯£2/Ν­™$lŽ1Ψ¦¬,šGέ)«{ν£Zχκš 0/ο©’ur©eœ(pžψT©•βΰΘ±γvκ4mUg'ωw€(榇Ή"Ο©Ÿr(τΉΤcΊ') Έ΄Ϋ―ό"₯Τ²Qf ΪΛΓΔ#HΌ€,*0jαŠΘŒWθβρBψ$¬rΣΔ"ϋΐοu}υ�φͺP©}Υ"P‹@-ΛΤΛa«έt-΅όy"0ΰρδ_½ϊκηκ»7ξΗ�σ²xsιGκ0Lv pΠ+“½ƒΰ]‡‘Xωρά4R`δΏ+σ” pΤazC΄2ώ9²νQ2π{H¨CMuΨ�μœ]XLΟsX¦Ύ=ΞA΄ΰεπN=sRΰO}βi»σ�Mπ΅†Ώκϋ”•ƒu² ™4ŽΎ��Z^’ΘFΙͺΎw‡ϊι¦hc”LO>ΰ@‹LŸφlΝΤ8/ΟNY™lyίΘ(νΪ½ωi{ς‰Ηρ8ζdΜ+++Έw7Ζ¨Ε&«Vς•μΦεK6woΐO&ώx` γΎϊ‘£D©θ›Œ:—$·θ9Τψƒq‡iΙψ<¦~-νM΄k‚|HΉΊaυ‡rHnθhs™Ο, ΫΓA{~9χ-χz”}όDP«9€ ψΜLR;;nH6‚€Nc’ΟuΩ`λπd₯‘ύΆ%ν©^τΣ³ς¦­»Λή½ψŽΝ.ξ]»BMΑ‘ΏΎ‰Ίϊφ.[yπΕȚW\₯¦ŒLn{@v@‘"$)0œΩ-3β”Kπ{@Δښλμ�…P{¨₯¨’ …j#Α\=^R{(›.†’Kχ'(ΙΎd�2K; ˆ±―ΣXΗ3 =σπ³"Yθ�ξn;::j““γ2Β_oiiΙώyζωΓyMwΎ₯΅eξζό”­£6P)M=% »Τ·«Ε¦kΉIΰ:υ,H‚λZ§u€ΖHδ DGυολk;ŽμQyN?„-Ϊ9ϊˆΙΖ:ΧbN•ΠUε)W―\eŒρσ`�~ςS?l·n|`i�Ν[·m’ ‚ΤΎ³£ ωxΦΆX¨γ£*ΏgήP—.ιΌ@Ϊ9Jι _ ΜαΎ!Κςiu ΘΞ�-[ji,πA›R!Ό}Ύ«°8*)π Q· MN)¦pόB,ͺSB…λGP"Iε° Θ3ΖΡΐΈH―LF3dχE‰<Μ“ΉŽcŒι%CέDK?]SλήΟ:TΦ:Œ™`�©cΆ;1ξZV±FPΝ#Ν °yχpε:”Ϊ`–ν±“Ψ‘αZKnΨΝ·ή΄x₯2―JμQ°/)£-ΠκΘΉο“"m΄ξδ«°/ε€&:χ²³±Μοι<ΑΊ)ZdΝTY_2NT¬ΛΜ�MΘ‘ κX Τσς.eΤε7²Š«Š¦ .!iXΆ²ΊΒ©'ΐ ƒσyολΪ¬u΅•ω"Ÿъ ˆpύ ρηνάͺ ζ@‘8ξ3ΎA|#2”jȟ!€tΐyΈ [)Œτ8j»(u‰”0ε $G9A„BSD)LP΅ΗΊ¬ Β³…=«)ΩdΟΎπ’½ωϊ›ŽτΛ2Vκ.!–G–"4s”ηˆpJφ•j }βοεg!o:³ˆ4P§/εόmc2ΖύA°0₯�™ƒ’aν`OχΏώεΏύΛΟΣΠ°ΕKk_΅Τ"P‹ΐΗ65βΰc;t΅―E ?Ožž"X«>ψϊW~ωγώϊ=€ξ³ι­΅‘Υe| T΅ x+ 6P�ν"ΩFΙx‹€BNΏHζΚ–qθr€\€(ˆI* I0ƒΌx|všC"YVίκ7ήίΫeGŽ΅ JΙπ6™�Ž>Οϊ‚3ϊK4'Q7¬ ErO-τ±±St{X₯TbΕ•Fθ νδ”₯γξΪΪΪ­™ςΜΤχIέ8‡ΫΊFΥ“Ο8`ŠόμdΤ>ύςgΛM\ ΐΖ}Ο‘TXζ¬;πΨΩΛΩΫo_²½ω'4ΡNQ΅ΊΌ~%ο$ϞTYΌΦy^ΞΠφUΛ ŝ9˜ΐ_EφDαΰGf_€fvRdέ„ϊa@³LΉG€¬ρ‘±1ΧfR&gͺ!Ζ98υκdΰε%!R€Ί‹ϊžg)ΰŠΏ΅±b!ce2¬­Ύ9yΚXΌ.Θϋ³t^ˆ“Ρ”Α©ηŸ!kxΜΕrϋζ »?~Χ6η—lib@•‚ ΐ sΙδJ&}w¦(K!kΗTΞ‡ <O—2%Ζ:ΈαΙ ‹v$Π€ͺ ―obŒy`ζE–9±πέ²* •YHžP¬^’h‘Hί‰‹SŠRγ"ΰ­@ %ιwύα₯₯ )˜uj#§7�’R$†œήΥΎ�΅­Εžyφ@Kξn]]ψ›H±…Υ~ _<šύ‹_‹Ν*ΥB  aΉ§]‹©VΫeƒχΙ–gQg xi`œQ³LΟΟΊμ³Jz’dYUS.ωx‘Œ΄H΅Έ«Δδε υu—$d”cΜ#uœPw€ϋx €2Ρ’PΖi–'N#a ”¬ε׈u½;~ΔΏΣf˜GEˆ³y§Zπ#Mί£4B„Cˆq*σΛηΛΗ@νF―`^*™μ8‘Œ2Na”/;UΚΒkνξfόάgΓΐ ΟZ€θPǎ/Έ"Θ¨2 7 Fcb)ΤJ­XA>―μaN£$°ΜCŠ@‰hžrι\»Dˆ€$₯Gϋ&*›|—i—λΦγ‡R2F@ΊΘZHpošK�]}φμ“ΟΩ₯λο»ϋΠΊέ€[Gwο€Ν5ήΔ"ϋŽEΒ E—Θή—X»!ΤEP8e„Θΐ(ΔΞAKXbΓεΦΆQνk΅[D]B€Z>δpd©}Υ"P‹@-�©GΰϋςΏωϊΞƒ₯_xΛοK―~ηΟΎφ9μΘ½ ²ς2³‹ΠΚOΰ₯‰.+«ψμ"ί/"Gξͺš`Ο#Έ»s8t3•œ©9&Qάͺϊ—#/SγT­;‡ωg;gYϊk»dHιϋ½CΛΏ$ΩΗnJζηέΑUξ�;›Ϋ�ΦXΚΧΚ9%£·£cΗΐžŸ"³& mΞ&g–!2�­Χ©GΟΨ ’γη΅ΧνΧί°χοβ]°aνΈΩΧΞΆ‘cγ[ί΅‰ρKΖ0|γP~j‘?OQ² ŸƒΉŸΟ’_gdw°—œΌ„Š%‡Vϋ:ύ^rΰ2χQ$C�ξΓΓvψψ1@έ$•΄Ήvvdχζ——νΈ€Ευ΅ ς”Ψ–ά] Z5ΜE�)Β!@]s’§Νŏ„§{ώYΥ‚‹ ’ϊ 850wΆ0™Μ—ŠΏσχώ»Ώσ•W^yεF˜½bΏ�νW—�쏿zsΚC’ϋ—Ιbλ[δUŠΠƒ :tτ8€)aΧQ ¨5bž1€ΨƁΉƒzοƒr=IΚ+ M/@0ι’q /*ί}jW4οcΤμΧQϊ’4wtSzΨ Πνb2…F”3K¨Wήώζ7m‰qMSf”%-#Ώ"kJ αd„S0¨–‘ԞσνΓ{#:$‰‘ΪηǏ½πikΖΤoςξ=‹0D”1Œ#€‘ΜΉΪ–ͺCB‘u_a|�|™σΑ‘Ε–9)J Ί¦$zu‘Μ’ˆΧG!~-F|μj·©ŒΏ2νR-aΪκ:»,98`+Μακ…< §εΕHJFΨΈ¨Οs°ΰ”* «C¬j‹+€ δ[Σ“ΆM]}`r插‰�ΪΝΫ7μθΰa›Έ}—ƒ&ωψR€,?�xœΛu–1—Οek Π3o"ΩV΄>Kh4GV’3*-ΩθN]ώ�-ϋrο9Bβμ#Ήμύ΅+W܁˜Zό vι˜pΥ&9ΤΧ#ι˜°•αWŽznews Λβ”eρ•ˆΖ9ΨCΒ #Vœ<€ΥB«6½ΘΟγ”vtŽŽΪ3Ο=WΒ:ώ;Φ9Πk/υ΅μπ" `ššϋ/υνpί =sϊ1²Ν˜;bΜ Χ£^ Ϋ 0Ϋε}Ύε)@ )Δ}+#¬še=—ω(Θ'A€FΚ =«ΪΌ…1ΌrIρz΅’󒁖_C0 A0”‘,—Θ\CθK1Q«9­=@¬2ξaζB=ο™²—¦ΔΧϊ2Ύ ρ(2t'U7Xςidίγf‘ΖΥUž{k3hhπM�Γhύ`ΏΎυ‡υ©Ζϊϊ―ΜOήωdgOΏΏεF™lvjožϋOΙπQy¬Π�4‹Ιœβΰ 5…b™Αƒ@m/‹Μ›¬ŽΔˆx)K,`[=P™»X©N=Ϛς«\€΅319αž—>υ)0Ά•b>¨ί*eAIΜν€`Q==?b,TΫ  OζZ₯ Z?~Hž½\φ[š\ Ρ+οΏcχ''­gd֞ρS6;~ΟΆŒ ‰&ΐ±jΫρ›V"δ°™2δc2π3ωȟRΧ!ΐX2v’ρ‡qβ/mφ e¦ε¦/?‘ σYs­‚‚ˆž|Μ=Ϊςε·ψ3₯H ]ζνLήc½n²v;PΝςwY’LQυIa2όΧ)/zαS/²v(9βΩβ [›œbŽSJΒ<ΤB”�€GJ%€·—΅΅‰ŸB–ΐp ¬-ξηŠς!ͺ£Ι€Ώ™ί―žQSjŒD $]> vtMνGͺ^‚ΚdŸ’TK@ί94l™―Ώυ¦Ž'πJι²k·―Σ‚uݎ°·νb :?E Ζ=Hόλ!€4A =G]Τ²Sσ@ΎZ“Ήά.DΚˆ[Ν/ύϋ¨²§Jι’ ν)*¬G™+ΦΣqΔ©|DπηTOa£b ^_εωE˜¨CJ§Κδ­›ΌΗηΤΙΦλ₯kk3³‘#‡™kο»9ΰ5ς|Θ;Ό C¬aU i~Θ£†Ο‡(έ…0‘ΒF”‘ΦF€`££…ωΙΓΆ64�γ{ε'�χ1ϘγrΈ@ν«ZjψΨG F|μ‡°φ΅Τ"πΏόΧ�ΖΒόΔΤΖWΏόΥ6₯œϋ†Y{g'ςΞq;E’ Ψ O{œV](ΐH�g‡5i‹:o “ΦŸεζŸGv�΄v}΄ΑΊ›;μ&Rϊ_xήΞ}β Ϋ.ξYΧΰέ lbaΡ’Mmdͺ$Ÿ₯ޚŒ›ΪσΐUdς3\”μqΠW-°€ 9;υ€Ό N圾…οΒκ6mʀ»xށΆ¬'j)@ύkο^ΑdŽ{(Πό ‚C6=ΥήΚ0_ΰ LΙ„ΜΚ"hgVDeQOƌΗu€LΆ LAd€Υ§^f‚)jΛ†ŒχΖε[Ό7ΞΑž,έ©Œ…ΞžT.B Tμμ“O[;mS+«φΪ«―’™„ΰ_εο¨ώ'T€Ό Šή}(Ϊϊ¨j˜ͺ‹-�Po[²$²p)R('ΞΏρ¦ωh£Άό`ΑΎ9Ώeχ�^³–†€#?�dn½f—Υτcˆ&`!P*χwΕ/€pF‹ŒΉΐΤΑί+syπg½Q J§Μeχx!Vά­rί%²ξief‘Γ§! ]Ϋ) xω(s.B@„…Β E¦OH”τŒΪς<1ˆ(™ΊΉ–u\―WK:ΰΥ&.σ³�1sϊa½φ―όΟώΧώθχ―f3)ͺeRuΐP-5Σ»[A !_ˆ=Κh6ΌΚ^«$!Ff_“ΎΥP8ͺ5]L™r2֚γ`ސ6rΗW§ο-ζSœΧF\g/]-Μζνβ…χ]™ΞΨθ˜“΄«ΝιδΥΛ.;p d ¨»’�λΪ,Ή+b₯pΑΦ1ύΫ[_±“'ΗΘάχbˆ7eΛ΄4-σΩ+kΆ―ΉΟš “±XV—eΔΓ|N%-• κ~ �IJ΅PΛD)L΄N˜"Όb �§„A„ κΝ‹žΛΓΪΔ&N�ΜλΒ^Ιϊ19AΉ‘Ga”^$k9¦ςmPUβ*₯LΐξL c™ύΒG6?i%r„A³kJ™t!€Άπ³쒌ŠΣRS™s™%*Eΐ°ΚΈΚh•šP8ΐZl·ήCCΦ=O§‹ι kθ·Γ#φνoΫθ,S$;_aNμσ]D!‘ω!BUΧ“tŸΑr-Oφeή)―X(+[_‡€I6Ψ /ΏΔώEΫΚΉ)=ΤXΗθb·qΚb|«y¨2±JG†ŽŒZ2F]i‚CwιΖ²IΗםFŽΪ�Κάg˜ΟVW˜ŠΚ›Τ…{kMΦa˜š²¦Φ�‹½7³-­Κ4Χ‰3Ζ9'ζyž#ξ<ε<‘ "ˆΆ’€Π*₯]’¨Υ…Mβ£m‰ ₯Uε„%Š-Πˆ)fBrσޜofήyŽαΖ<ΟgŽ3υϋύAΆ>εΣ]ΆI&™ϋ@ά7✽�½φ�οόΏo}λ[5ΦΥΩΜ1(΅ φ~&^› υuOx€‘ς^^ΌΌ¬"ΐvΗ{yπ"ΰEΰ•~τη©•Ό|ρβ­$₯€"2Ω+˜₯ΣΤ'#χέ$)'Ω}'{Ή•/‘ PΆq‹pΚͺ Œ*kΏN―ΐa‘L†“$q'`Yξρc“³6ΠίkHΣ €‘(cnzΖ‚dJCdΆ%qU ΄ΐ;ϋ_ΐ*Ϋh²»πΌπ`C­·Š6ϊeμ²Χζ9†<8ΟϋsΘΐΥs\Fq ΊBπ»Y±M Ο2W�Μqδ[ΰ  ΐDv1²c2f2Ύ qΜ κƒuν>jς΅ΑΧ+CvP€[ξςΚ„> ΐ”ZCŒφeΩ΅m#9οχυφ[K{ν.Q0pήΖΆK’ύ_E†^¦9J)ƒP£τ F]cW‡½κ5―΅4²ψYl]tOg—s΄O KG°a~νμκ…Λ–œ_·JC¦Ζ1ΊDuwχΈΦŒ«ΤKϋ 3€λΔπΘp₯Kͺe ]§�ΝΉΒK%B,@„lΤΗ½‘"c=epεeζ‡Έ>2ΕΙ¨A8¨’ƒ€™§ ΌΔ¨ΫΉΑ­ΐ’5u ˆc†”υΈ‹c<')vεB%χ^ǐF­Οκ>hŽTFΒOόΒ‡?τgΏσ;ΏZύΞΏ>ω»Ώ]ι\Ύtͺ3•NcΏ@ν7 ‹ϋ εG,@舟•X&"MrS9Œ& +HΜύΔM/©kΥ΅;“Eζ›²κεjΝΗmdξaŒ' HŒRdxO=uΚ•.μάc8i—/Ÿ·’” œ­’R€?p£\°©cηX—ΦͺωΧ=I±dπ(Ώ’Υ΅eމκ’*Ζ}θB#Ωύάτ”­ΣmA^*‘CHhm1iYσR–°nΐ76ӎuL€‚’™bΌ¦†χβ«@iƒκμ΅^+ρ�Ω§Τ,rίWS΅HΝ±�&^ΣΡfUx ΘTŸΩ’\g|lυF†ηs πžOAL1™DΘUβ±Ζσ¨ƒυ /Œ%%HΐϊΖV:·°^ ³` €η1²Γ3΄”ž@f†~=cˆQ�ς 4Ύ~ζ€2ωAΔPŠπή©H\ χP2-ηνAlD$¬cJͺŽ)Ί—.]@MC™Ύ—.PΆB»ΝΟ)y„€Dr\gΎH,΅ώœͺ±¨υ‘Dύ;ŠRD½ΖRAΉŠΚΌό¬ gώΑΌΘπ¬εβ΄.ά=ΡT“²% Ή*υžα‘M”š4·αm�ۍϊ βJ:θ^!ο—4sAͺθ-ηQΣΦΣKόšθ’2cηPu₯x~Nq’Μ!(Ξ'?ZVBξIm!r*�uͺ#ˆl�σeC …Vη™h%\Χ23ηK}½όΎχΏγψοώξ‰ρ^^ΌxxΩDΐ#^6·�»/^ώ%P›ΖίύψoŸόζΓoœ½^/ Y £ΎXI'sl(λœXfΥ /’AWέq‚ μ:‚@[q@#ΩF6κͺ.c(Ήv–έ~[k‹3S�τ-@p €¬ kΩΘ6$ΑQ€ΘΤυq—ΕΜКMmήτR›3egE8.@ͺ2δκ·�MΊ΄ΜΔΨΙ"ΝΕŞq@b ”cN–NuΔ!°œ§ζΏBCΩέ,ζƒj¦Όΐšœδ|Ή‘‹$pνΧΨ+Ε‘S€$Ζ 6ΫIκ©E(ӚbS- ΈΪΙ8LYueδD"p GX€Χqα_±ωΩY»±0ok˜ΜΥ64XW5έd©w\‡n»Ωmζγ˜ͺν»ιˆ5wΆ“ΙlΆvΘƒDEΉ΅6η7&&mzzΦΦ¨Gž»j';iνυ2-ΞΘ‘ Η‡Βπq¨²•udΧΘΙ₯UˆΔ(\3”K#ӊ:ΐIŠ«@”ͺ½wˆ—?%}ΦοUk/ Θ’4Αɝ―@©ή£ΏeŽ&�@_χ Μββ'ΐ«¬―¬δτŠrd©{©°ςKA )΅$ρςIεKχLŸ€φ?ί�Φϊ‰οϋή7>…Ώ;ΌŽχ|}όΏŸ8pxοΧΎς7Ÿ­X]Y»‚Š©SfξmS‹N& ΏŒδςΑpΔ’rj_'Iόnζ^ΰ]-J uίU܏]•Ž~.#Hέ#,Ξ₯Ÿ«w ˆ�Ίk0Ž^»d+tUHrξ₯•U+%€$AΕΨU'Ν[uOPόΚR;0ž2?W‰„Ϊ“EˆΑι‰1'‡V“½p­Eθ,m�ΈχθύUΥ΅ΞDSžj ͺρ©΅bd`FΔΧ<ε7d;›VŽ#|>¬uΗNJmW]>ΛTγs"UhGHkK‘ΖQΖ΄χ ZЉc‘έ₯Όͺm–뛝CεĚ�/²”υΘ ΅ Σΐ-όQΦ7Vœ?Αή=%’–qޘœ°(cθ€œ§ϋ ΅‹ζ 3–yͺωIY‹2Ή TTjMQΐ1t_΄\KBΎΫ<ΡΌ—κA'eD­ΜΕ©ΌHε«»ήΏΞŽΩ-7ίΑϊ+Ϊ9Ί™\ΌxU"Te "βX)2ό" x@θOGά‰(S'•£(�šZΥψzπ-j!W°`9©8§ZΤVαϋ!"Aλ/KόAΓgDΞDQˆlλθΰJPEpπ2Ž “ς'Λυτξ¦|#`M(ΐzΊzGG”²†*ΚS2PΧ._³ η/Ψ₯sWνāL 5˜|n—t”·„žκ’‚(k¨―΅:ζ²Τ1΅ψ#ΤΥΕωͺf.Υ¬2±žlλνΌ�χώγ§?±Άφ=§o»­υE!ώ\ΐ½?Όxπ"πE@ΟxοεEΐ‹€WTϊFnž>xτ΅εΝ•ΙriΟξ#£H>Ξ6·¨%F~-AE0f›΄+,’LΡ�P�d9•KR― o‘6nΚ, XWγΜ> h�­‘ή5jσ”2΄£dΨ;ΠkΛ“s˜šmΨυη.Xu€²nΚnΙθ*;Ύ›9ΨΰΤξΘ 6ώ•lςυr΅ωʜFTs¨‘ν˜Θ†2ͺ‡"ŸI+ΓθUY‚2―Τ€κύ€gIΖΣ”@°σ†δ`“@|^†dj*Oλz„μζΐP5’M=ϋμy\θxΥ΄€T2›qd‘p± 1† ηΟ‘�ΨΖ«‘\JX{#ŽωxEˆ€Ψ^˜£[Δ< ±Ώ-»09jέlς«¨ΧΎrω*€pM¦O ±‚qLOΟYkc³έΈ1akΛΛΦOVΈ½Ώί=ρMδΣλ©ιDa”“α-Ι¨γί±iέ·Θ�BiΈv˜|9YΌ2Ρ\2ΰBŒ:g–�aŒί$ΑV' ©BΚ€Σ)αξΧέegΞ‘j@aαS¦˜±%xΰβ8ςFˆ$|”΅$6ΣFw=V+!wLΊ8•%ˆ―ƒMΘ—%?'qIM5e7%ͺqFE΄Τ7qlα¬ό™ο{σΫΎ ¨‚Εyq^œ›ΡΫς§�π“ψG�υ“ί›Μ$χΗ¬Zώuό+t~:`TΠ‰£ I}€XΛŠ€”’‹]ZDD€ˆ§4Δ“Ό:τR—‰�ώμΪU2Ÿ .ŸBbΟT·€ ~§φ¨›kEΞ‰΄Ÿˆ�H³me9AΉ   ‚ j‚-Lwξ΅Μ+gR €—BF`]5κ~^ΖOδRτ(€o΅½Žn#ηνθ±cvΰŽΫ­ιπ°“χ―cΎ8ϊά:l‘ΐθaέ¨5‘€@σ““–X]B‚ŸprνܝYν k`₯DŽv…„ō§�cξLΣ9žΪ~όΌ·ΐΊœŸ›ΆπZΜΪϊQ2ρΏΕEˆ)x†Ha I|^†yTΫLEΦ}j+eO‘Ίˆ’‚΄;οΈΫήπΆ·ΪZz‹5΅Ξ½ƒΆ6=oWhߘEi»ΓΔGΩβƒάΡΪ @EΗtb #Λ€#^Dͺ9²ƒg†Κsτ%Ε‘X•ΤΤ7 – ΫΤ֚uCξuΦΆΠ‚qΙJχUžiO>ϊ˜#3(•"κΊIΰ“Υ“>Ν=ͺΰxRˆT“ͺJJG@H©"AΟ5)Ά7σ‚u…O VK€t•°D Τε"—₯\‹ψϊ!T*‚ΈΘςάS»Ι}Fl}sΏ—iλ…D ’ ˆσ9 Fρ=Αc…E¨³ΓΒtl©9LyYΒ�]»J»Ϋ€^œΆμώ Μ±zŒ uνc(Ζ΅0&_ˆλβΐνtV¦Δ€–g£ˆΖjΪΆϊΉOmν-g‡†‡?ϊžχΌϋ³0Αϊqœ Ÿπ^^ΌxxΩEΐ#^v·Τ» /^ώΏ"€μ”½/wκψC�mfjϊ5Χ.]9΄CιθΨμ†Ι:*‹Τ`MdΆΟœ½LΦoΡmjσdΜTΗ�Ώ΅ΙvuΒμ.•g.HςΛ†ΣΙ¬ΩHo"Cπ‘ΉkTζƒ·S=‰y”³ΈΐΈ²ήΪ<3P· ¨Ή2ϊΚVͺ-£jΆ΅αΦ&{q~ž 8DξςΪ™k3^‰,ΏΘζlΆ+†8PΦTyΖ]<‹œί«T@™_04ΧΑ¦˜γI&žΗMΚ ηΙξόaΜϋŠΌ΄s”€»Π?O‰†ˆI²ΣΤ竦Ώ†M³ #“€”JȌΐ›α²ί΄‘cG8›vΜσΆD_{φ,ΔΙΒ™O:9lΜ.ŒŠ6zg{Ζ£W ±Ϊno";λꬣ:³ΉoΩtΙ�/Ox x(σhl¨vώ"PTΞΐ}εH»_»=Ωω€Eξϋ±ΚR+Σο§�½Δ½λξ·¦Φ:ΪA¦‰%�υΈ�GT—Ο±d8ΐD₯³@θcσo` Θ Π€()³2κQΤΞysΈΗO ω~’Ižƒν�$A½ιύhGj§„σM ŸΉσΞCkŠΗ‹ύzίnύψγί\Zš_ά_&ΦMΙMό*”Ρ/αn(ΰ)ΰ―ς9δ'Θς P ό xϋ«ΠΔ$i ’Ν•!¬ζRοJLέν‚LΉ eΖξύ~+[Ss‹S«/OΞX-5φβΚ>sZχ₯2Νg?€M0š‘Wη—‡‡H8Ÿκ@|*+R Fΰ]9†Vͺ9;{Ρ‘^]‡F¬�§C:”FΝt7˜§Νκexl¨M£ΖTfώ—)-πs•Yχ3ίΕμˆ\Ψa�(¨δ’γλύΰ¬4kξ±p=™iJu"Z»πAU¨‚€ΖΥυ$Ι3"Μ΅Iήο:—πlqσ†ηKˆσI‘²Ny„Φ–ζœΘ:‘0W�^Άc·έjΝU(! Hjšι–B|*_’‡fΌ†1Τ΅€ψŸκ£Οη)ΒΪ ‡!|žΟWpeξιΐ=`\₯ R&Τ·’°ώ‘a[eύ6tt»ω[ƒβαάiLWΧ-›„Έδ#”Κ€―ƒΚ œΡ!kΣ]ρ’κ@Δ§T *aˆαmβƒδI‘Fͺ’|)δ>� a‡q…˜S45€Œ Α=L[Κ…4O΄� ς,qT«k+6²wΔG†iΉΌΊΐ½ˆX%LΆ.―T ύƒ_¨$€Ψπ—ρΩΎBΗ—MŽαͺΦͺΘΠFžm*!ρράΠ³MΎ2Ažκ|"ς¦·•G*ΉD™ΫŸ|ί;~πΣ·zΥχύE#ϋ­χς"ΰEΐ‹ΐw$qπ ³w/^^*`ƒ'Xh·Όϊυη_w}μW7Ά’zφΒΉΦz2šΓΓ{‘[ηΩΖ¬‰Φ‰λ돁ΆΩ4²YU½ΆzyKώ+€>q€=Žl[[eCK€B6 *Έ²ΤυοΤ¦¬Η?ΰ\΅½Ž•γ!ΐR/5ΉKKslΒ1!t”Ψ Œ3N—έυ)3ΛϜy˜²Ά" ΘΠJ’%σVΘ«]ƒa³νW> U›ς@JuΑY6ρ·qAΩ�€\€±)“&Iw‘̝6ϊ[›(fg杺 ΜZŠZλζlrBWΝ΄2Α€�U±0.)ΚΖΩPKΊΎ΄ΈfΛ¨ΤΥ Α0u‚¬ρν*ρ ΐ­| §ξJΛω«ZΓιx!@ψθ† β0Tc“>…Ωš2’I€ή Y`΅Ι3LΧV·‰YLP:")€’ n–sqίUoμͺδD€ŽΚ>Ύ‚” H™‘D1ΠΪΣjχά{;χ"kkkkφ·_}7x:d‡Trwης\μEGHuΰ&*“°ˆδA$Φ)b#„L#Ϋ΅$όΥ��N™Ψ]toUS�.ŠΏΤjι‰QFPφ]ΌχξW‰ϋώ’ΘXNΪδΞλξ}ßP۟|ποΏϊΦ&jΒW‡9@ζΧ¦9D‘#AF‘qŒCξ€,�‡Λ.3οy₯ΤXα¦RIΦuΟ5—τ~5½G³Kε12€;|θ s.m_»α²Χ0f¬)Iηπ Β0Ά“ž2λ"ξR¬½8χΉB%9ό―€"(AΉ˜5έϋΆ�Nζ3 Μ>7Φνά“Ο@`ψmΐ?ΊΌ`Ν¨*›vψU―΅Ζ¨T1ηρύXw*†J€"Χ—a}1 Υ8ΥeB„B1UpΟ±ϊ`½2ΓψΎͺΎ…y›΄-:”t7tYγΎγŒrŒ8m,―ž>Ρ’ΖΫ£Η6V7˜W'ΔΜ(Δp›gH…?ζH΅:ΊHΘo@ͺ©ιΒ ?ŽqHΎ~gš₯‘�₯Ε)ΆsΫvΈσVλλνΗ4po‘ρ%ώz)˜TJR€₯d‰x©3‹Z gPN”Λ_ ‘Ά«ΔUΕΎ‘Ϋψ5vnϋ<δ"„!Ÿ)@Š�|vν™±́(Χε9³…"AsB〡']Ux’>PΗ D9žMΊuiξ΅μξ{ϋΫι.ΡbΣ€, Ϋd̚#­6^K_γ>bΌΚΨ€π(ΘΧ€σfˆIs₯Ÿ­Ξƒ€•W+ž)ς;Πό©δη!κ)Mhjh"ΖŽ”|MߘD%…ί O!=+œ^1*Q ’ž�Uš:ΝΔh₯[M{ΕΆΦfΖλžU§’ινΛέ=]_ύ•_ωΏc½z]XήΛ‹€WFτί?οεEΐ‹€W\Ψπ‘.?΄ΌΆό‡n½ι#'Ž?rλΨθ›μ(hγ―λΔHΖΞ^ž 2P«<±²iΚΦ«U[ …`FNς`ΪΔAPΦΰι‚sŒ/“qΥ¦›Œ—²€•dڜ)εlH‹₯œm“­QΟuυ,W67Βf™o+ϋό™ {œžτ:F�]ΚΨ+Λ[ΦΨjm—εη�NP#ιoœsg‘ŽΙξ)k'r$‡Α]π*0'E}d>«ΘΦIξΌεΛΒ7Ι£$HeP]td‚&‹zά§3ΦΧϊLŒUύ«“³ζP‡©ίnΜlfηWΘά*(Qv˜‹· RaWNξΚ’R@Λ {Ξ¨>` λa‘2έ[Γ|M$Z%f! d\–—Σ9`c·;ŸΒqU�,0ͺ8G†„E΅mM΄«¬³AΘ™•τ†]™³»οΌΓ‡‡ΗΧΩωσ—ψs5ΦΘΗ#ψWdˆ™b,5€γ2°«‡„ΐ χ!‘³MμΦ)½Ι‘^1Žηή¨σ‚ΪΚUa„(BGYμ0j76ύX 7•,777|ξ­o}ύ²ϋπKΰ>_ŸtλŸψα―=ϋ•/~Ύ7Ljb�Ξ-ΠP\―fNοfγUξ`ήFYŠϋ % Ί"sΤICŠρRΈΦ₯ΔHσNρ¨δ^J±ΰ$Š€SXž|κi€4*Ό˜~Š0‘‘^M’y²zξœ1ηK₯iΛΊΎνˆB‰yŽ)jme (J-dΘ©rŸJˆ‡ŽŽv[€”g +‚¦ eΔθؘ΅Žοxνλ,@ιΒ…™ΛΆJχ†εε% sΜ:Τ"Ε¦:ΓΜ�.•�§ΠోΧ;EF-?«€ΌJ-8oΰ ±†R*‘—OdlbkΤf¦1p€½₯%Gžϋ@5†XΘσμ’j"B|J?s=Ζqd ¨5©ηœH"‘ @°IφJe Y€ΉœΈΧΘtϊ)„�©"›Η¦YJ„ZF…ΚLk£esηηΟ]`#.`₯Ν5` πUCΆίΥr³Ήή˜Ÿγ{Υ>(Ÿh$Cν-ŠT�«l’ΐ±>§ m@γPΛψ-QG/σ`1`ΛlΊE8ι8ηcϊ–ι«ΣΓqΖvΊ4°mβ¨₯ζΊDHΒk-Bb’ω΅€Τ62ΑuQDΞϋΘςj.a€X€Δω6Ə3˜$ξζ²R ]ϋB ήŸsJ@„Ζ^ ΫFƝX‘ιχS0-_…ΔLΎ°Εψ(/΅ρSKΐγ—τ™a:!Œτδ!„ 1alκ―χιnΊ/ς:Pœo»υ&{νλ_m§Ο΅E€Ξ2–«G*}Σ-7Σ₯‘ΟꞢGN<˜`\€ΕJξ}Žγf›ξ₯ΐ2””€¨έ\ΐ皳Ό'@œΒ€a•’θ|.[ °¬F��6…eζCο‘’DYΰ` βΚ½χάϊω—ρ•kjΚΣ{φώυίmlnͺ&«»Šj$Μψ‘(~dΘΉΪΛΤP§L3kAζ†ΤϋŠ‘e΄Γxθ^ŠDWγo@|D0h~λ˜ΚΎo°~’2>Τό“ιή$ϋE©(Ε,1JιHˆχσqι6c@^OΜ bAΘ½φxU=ΏWyDšŒ=] Dπ0~¨pΦΜΧ³H¬€nΐΰHu‘i=Mmz$€q%ηααΚ3Θκίyχ]–gά££6@ύςΪ�Š“€ 4δ‰3‘ra™εQΪLKΆJΫHnΈμζp~ΐΥ3§‘Ύ§6i3‰ΟΑ‘›ۣϞ#a ΈηΏ’ΫŒ΅ δΠVΧd~°ˆ,roŠ·3Ϋ”Y«Θΐ"mVw]ΏV8:…Z-ΫΠWΐΠȜŽŒ+ S΅(t[Θνέ»�O~θ‡~hζ₯³*ώq$7ίμ˟>υXξ«_ώΏπŸ˜Dχ›ofŒ0­IΧ3ΦΪ‡@ωΑύU{�sΛiζcbεΤV@J0 ΜtKUD°K€©~?z$Œ[ΏΦŽζ±^žjKHh‰' ZφΥτ–:ΌΧJ(ζf§Q@±¦v8φn·Vƒσ427Ά9n‰σϋ8ηί«sIώ €7ί„Ψ Ξ`žΜ–ν<>&«”*TB^¨ŠΙηΘ%FΙ|(².”’ˆŒ H€σxg²Θ9ζvvGC¬ΦICO'€ΎΪ|"1mάsδ°λpω"Κ‚<1ΐαΒ™g½$ψ}†hηHŠvΟm·ζKώOΐσ.7·uΏwοΎ½~ΰGκχΜ6’Ώς‘Ϋfv«ηΐƒOόΜλώΧ _�«o½~ν—~λωo½Ώ½xπ"πŠŒ€ΆgήΛ‹€/―θ|ωΓΏ œ}ξτ©ο]]YŠI€„• *σν€ Ω²,YόTf~6«\@u²ΦΚ.—Ψ«ύœκf•)S-° Sΐ©ϋΙϊ;PP Ά>Ξ±Ψ€BTΘ@‘Ϊm>S₯zb²πEœΌ•΅Λ€Τ7#Εm¨wYΨ<`A-?Fg.ΘΉ•­#Ηηδβ5υ5Φ�ή ΘΒtΟΦΠ9‘™ώρ-Ν vǭǐW#έ¦+*…Zˆy#TΧɊΚ ρ.™r~ΟΟWΘvRΔlCƒέHοs•Θ„³Œ7/U†Z¦°T‘L2(Ξi²Ξͺέv†y€ΙΨΥ28L’ω}>&τ2K“Π¨€LpεOρ«§’½£²‡€ΛΤ7@N΄u·Ω­w³ώΡ²ρωi@HΠ~β}οΓs eWΙπΚ¬2˜PζSχ0ŠRβ�{ξ΄ήΑ^�λDι>©~Ÿ‰5€Φε±+άGj†;Ne‘Κ䭏…0±  H‘«γτ›ηžͺ{ΆƒΒ’† u-YN]—H'eήu]R4ˆθ‰«Ό…ΨrYŽ0) a§μβΔ―�ϋ_ύu€Τ��%Ά™Σ>Œ3η/œM=ρ؉Í--AΥΌ'ρ©β"ΐ΅ͺΰ�τ-T%!•#δ}ςΐϋ=™\�žΉ 0Ορ^n-ˆ ½š@IDAT7TŠ07Qͺ0ΗδΠ―ΞC%χI—Χ…Ž―LΎJ "Ž ,Ψ$ω™©9§Δ)€$™ΐΜe;ώVvΌ�Žρq“ΘάG―^£΅γ(ΩpΌ ¨‚šη¦;Cλ2ΟυU±ήnLŽŒk™·υ€ι%›½qέκ(υY]šB“tR?q’ΊήgŠcH.b>eˆ₯#cΎόΒ‚ ΐ,Ε„žGR¬žiΉΎ‚A!-ΧΧl#Σ(λπ*¦΅YΪX.�‰q5Πέ[ 7ι81° ooνΰ–TΨ2Η‰‘ςY_fŒ+ξΨK³‹Ni₯˜V°ΖUv ec—!Ϊ½ζ΄&P β1Mœ6(©P;Ε0Κ#‘Fϊ;ΉW֜R…ki¦ύκwέΙχ~λ₯{Κ`�/«Ξgb“ϋZΝΪ“GΜθ•«(ΆάΊ“―ζ…ΌvPhqr»χήΧΠΪ΅…”:­¨;š5�jQ_£ΧlynΞ�Δη܏ΪβΤ¨MM^±Ξžή―�ΔO}ψΧώ…/ύ/?ύΓ—ωΧ§Kώτ‘=‡Ζ}Ύhφ±“ΟŒΏε ηΟώ»Ÿ»gωώOή/ϋοεEΐ‹€/ߊ€§8π¦‚/―ψψ^㣓[ωτί>π•o"%§6εU‹MδΝ%’οG9²ˆJϫˁ£3”K?›hΉqΗΘ4ŠEoϊj«GβάΪֈqaΜΞΉdij]·ΆΛE$Μ6ϋΛΔ ««"#dGo>„rπΠ§:::Φ_ͺ‹PŠΖvŠυqω‹_ψ«ΜιΎoph/m—lmc‘ϋ§φz»[5sD€‰ό)τ�:ΨU•ΰO Τ₯‰dω!¦ƒσ»P½ΏŒGEΊE!Κ²ΔFσXΰ˜H>d±\Ψζ–fνΞ·|Ώέ’ŠUu¨OΞΩψτ,%7^΄ ₯ξΗS"#τΧ…Θζ”ό$D"θΜS_ή2άα~Φ’$ρ³–+ΒςΣπ•₯τh`nž>υŸc>ΒL€ΕτΤ΄Ζή2χu6|dΩώœΥv΅:/zω˜Δ£΅΄λ€\ ͺΒΙ§uΈ0N@ νϋl™ƒ-:ŒloQ^ω‘₯ۊ:ˆε:ΐ\D‘2AνwTΦΐ.±(�¬=F|ΉήΟƒˆλαo”@K vρΤY«oͺw?Η’_ ”5{NŒ±΄nύΓם2Cή!Ν-m£ζ¬Ή�ΑΖ.\΅qž b.β€’ °ΡΟψΆέ}ΠσoƒC΅3uDρTKYGœ©TΕOά«O“h\ž(ƍRr…β§V›Χ†TχBεStnΡά™šX·#¨3F·�Ψ‰oNX-JŠ+g/P:Τ`>”!Φ‘JŒ‘JΫDŠ‘˜[%{όΡ“vπζ›l £‡V“vκΉη LfνΥχάk΅t‹9O{Κ₯ρQb½iΓ‡\Ωσͺc_|Χ;όSϋnŸv”?ήϊΖς(έIτόλ£՝τ^^Όxπ"πίGΐ#ώϋˆx�φ"ΰEΰ6ŽΙϋύίύΧ¦¦†ϋŠ…Ζ 6υͺ½–Ιš6•rϋg—Ξ¦˜ =YΖ vγΞ$ ­@’²θςp(ƒjS¬ΟIe r€*Z‡• dά₯Ά†ΡΚjχΉ›βΥεy|;=Ι2Jv`ί{聯b*HkB‹¦φ.dυϋω.“Y₯$ Lc\ψ`Χf\ΰ΄Δω”Υ[Y[΅2^nΓϋGl?5Ϊ> ΪTR1·8OFΌΪFzQ ™¦%\ŽZθ>mΑ:LΛθΈPh©[”ί Θ7΅ΥΩήψ*WS�’ŠΦξFŽ*λ§ύ£O?‡VvΚήζύτ•'S  ‘bB*wLΛ@° ΤΆ\Δ‰TYΖ)ƒIω'•ΊzwŸRpd8bΖo\FΩ΅Ίδ½M- Ά²Ύb›Τy«ρ€3³ΪΖ:»:~Νφ _κœΙβχ Ϊχ½ε-VCvυDβq D₯%[€Ώsγγ₯œ#ͺ³gŸ=Νρ}8¦·Ψά ^€Ψ:$Τƒν( r("d†·AβŠ�„l7Ӏޏ"‚R\οsW.X ΔΚόg)@ϊ΅‡O’•EΖ�χΔD’ΈQ©MB\‹ζAOWί?π{€yβ�VWό~₯GFφύρf2} ͺšΦZaVPBS€^ΌXΰjy ¦aUΈϋ*γJ•逋(‚Ύ₯�)β«‘υ’Ή…sYmΪ ’όPvZσ8Β{εoΠ@—ƒ‘α^»2v9UΆ#‡Ϋ*YσžΎ>dό9;xϋΝΆχΆΫmflΚNŸ<©$uΞ.ω€΅'β@€[sΚ©X»r�OFƒ¬έ<nιh¦|�@q­:žhMγsRbμςVΠ=£j ΐ x—ρ(­VγΜ›mΤυΘϋ›[Ϊ1ηː!―γ:₯DΩ±iΜA••ίΑ8τ铏Qφ°‘‘kt@ΐ$4‚Κ%˜θb—γ˜!όJδ{R!•Ος*|>˜˜K³ ΔάO!εσ]¦‚zIώο§΄@εκΐΐ uƒ97-X!ŠŠtΙΝmMp§ΰHr άXηUβΗ,³b%ΙϊΨa”ψΉ+M`ΜΛ;�B”nΠf² γΙΞΞv{κ©§\‹U™ΝnqL5WΑσŒ_-8‹4.JΟΖdL5ΦΑ#tέ`ž<ςΠΧιβ2ΑW΄Χ.Ή²°μ2±Ζη`υDM4:}μΦ»ώδ-οϊρΟΗΫ_?=0δγbώρΕΪIΐ]φ^^Όxπ"π?Š€Wͺπ?Аχ{/^^18ώΘc³Ξ={u νn™V8‰0›fQ%›ΨυψΚ*;'™―Ί¨O½@΅^j&c>eΥ\ΉƒΘΐ}„ϊ]Iύ»»ΫνŽ;ξ°ώή~λιν³Α!Θƒe'mW?χ ™ΠœΙ7ιCΎπυΩ.οΓ{χΨ‘#GνΐαC6Ώ°hσΣ‹Nž-‚Cε ΚT*c(ix°^β\ΜΗΨοž$Υ.Ρ~ΝΥwυt3Zΐ=@ξΖԌ#v¨ΩVϋΆV@[€ρ�ο€ )*lWCω…²ΑΈΖ?qφ;sζ‚]w$δχEΐKj‰‘ΠV %”Y”!K”±tv@³’2ΏΙζˆΔ�ž’ a™GΚy^ OζpϊŠG‘ ί©<‘•ŽY\άe,©>ν1²ϋ2‹μλξ΅œο9:JpΎ*ΐΏΐΡ£O=Ž4žr ~槍άν7ίLzX ‘Qi+ΐ…—jΕ(gϊ±λSΆ €ΚΡ crrΉuΦʚ‹(b¬Φhϋχc”Α AS™oΩ@ΡΊ¨oγ›^o#{†P=τΫLεnΜ,XΩζ‚j€Ρ K]-’˜)VFγwέyϋ‡οΊλ��'ϋι&ΠKτϋοΏΏ|φΒυ量�Γ$¦z―kko£‘G₯«§Ο€ {Ț«4$ Εtp@VŠ‘E*ƒς2Ÿ5 -Οp―₯(©V‡ΗAˆυ€,Έ@©Z~Š’Ήι–›lpOΏ»~ΑξBΦΎ�ΠA{ξςi`΅Ο�\Ώb›”½υν�“Ucζχά3gπ½ΗόLΉζΘέ΅υTη­Ο,wόμTCR  «E Ζ�₯e­h—˜Ώ»Š>ΟΊ–Ÿ‚ˆƒc[]ZEaDζ›lz”Œ~:Ήi3¬ƒ…3Χ δυ£¬eZ’Ξ-bg‘f.e­Ώ|Hxh,―¬‘0Ϊf<”*AΆdψ ` ͺXhmΈq?)TV!SA™$ζˆY•ΖΟ#ΜiΌ"ˆ«J Κό-RΛ©6(‘ZAsVε9ŠK’ڏy@„©DͺŸΚͺ…ι9ΫΔΧe‡΅-RB V²@Οy‘θ9¦±I)€Μž8¨Δ@ε*—ς3—s¨iœ™%ͺ½ϋ½ZΏΦS’fMΚηCVT¦΄‘₯mm-χ‡gΛΘΓ‘τ„ȌU�*Νύ±’g™Μ²xN™_"—Ά˜₯rN•‹UΫ5Φρ6*ŽcCϋ`)žq8ZGgΧτ[ήυc?ϋ•�ύΟολ\ωO�ι~Nΰ½Όxπ"ΰEΰ_Oq𯍜χ9/^^vΨμ°ωώϋΟώ·?™ώΜg?ϋεΖ†ΊώΖfijjγτς.°q."ύ ©‹šdΌΞΨJNKf$ Y6ΛjΏ¨N ΚxfΘΌohcΌ“ ΛAre€τl†―�+^€B5ΊE•ΩNbF―±Ϋo½ u΅έ·ηM”% ΏN$I˜Ÿ!{niμ°Ξή.»xε ™Ρέϊh°‚ΛD²»&‹ΚΖΐ21AM5@υ–[Š"ΆΈ΄lcΤ_=pΠ™žΑcp΄`C…0=Ί@iF‚Φ‚τ˜ΟΨΐώ!»ϋ{ξ$%!ΘZJmΠΡN—ƒ*»γ–»,C]ΊτζΟ^8g΄V”€³Ώ$rύ*2ΟY€Š6ρύύ€πiz g(η {ΨΘ¦ΑHN•‘iύύέ.Ά)‑β!ˆ˜QfZΊ™�]έΰΪ�‚vjγλ1iΜΨβκ’΅·΅6Jd©i“xQ�φ"υ>ξKxδ0‘«-.:!yτQ+!Σή"λ©›@ΘRνš@΅-S&ΫΊ˜ aΕΜnΠΦIIΗ>HƒφΩ@o―?ρlŒΩΎνMV™βaΈ‰APt�O~4x,x₯­ΡBσΓO<δdΟΐψX 82²ηΏΌη=οΉπήχΎχ»f±>r¬/}πg~Ό5 ¬₯΅±zzfςŒΜ2ζtjwXΑ|TΎŸ/IΫ%[w¦’@~G<7ι¦Do3›h9Ωτd‘FiΪ VΡr΄ΏΏ—Ϊό"Š™CֈΏEβε–Ϋο’V}ΖOΰτO(gΦζQΏΤ[Ϟ>»ώτYcΉ{–‚Θ(rO5—€θ‘Ήf}s+χΌΰJoH«CŒΐ!΄dΎ§LΏΊ\ˆ΄p–)¦ζ₯֟橘7ΖY§;γtjέ–¨Ÿ—’§ˆ)§ά Π₯Έ²žλ™‡ΛΈψΛ(“ @&LX5ήj+©n":Ά(g±RΪI;β, ‘Έ©5©όTΦRf�Θ42‡Η†sΞη»l«5#˜όMΒ›"d (€―–«‚–‹SBΙ·ωŽξ‡ˆΊ’œG!*f‹β΄ΉΉΞέ/jο*₯†ΘSŸΡγχόΝϋ¬=ϊπqΤ¬Φm€υjŒ»�)tTΆKnD9η¦#μ2¬ω%*aΞ+Oejι¨�2꜑ς ]―ΘŠXœ:EΟΞktb7C3DTm] •**‘‚\ΰ]Ύ :Π΄wLο»υ–έχ#?%EηUπ]σ”ρκEΐ‹ΐK9qπRΎ;ήΨΌxψŽG€M&{Ϋς΅“ŸψλάΞΤ―Φ�‚,•Ϊ* “έ8&bύ” [Γ?@ BflA@‹Ϊž‘λue %@m [HDYreγΥΆ m2flΣ6=uΧσkͺib³ό—Μλ‘£GT»„47±²bΝτ‹8ΈBƒB2ΣΤϊ7χucˆΐΨπΰΡ}Φ]O―ςρY›Έ±„Y[œσ‘t€¨ΘSŽ-Ω|žΜf,ΐγ  Ή2j€Μu±Ζ§ώ›σωΏ2zΓ&&:ντ{ά;LIΓ0οΙΠ’ξ‚ΛΜwτΦ8wωύΓ#ΘΕΣ6zγΊέuΗjΜƒφΰρS659Οψ¦2Ύ]ν-+Τ‹ ­”m—*B¦‹y•18BVPνήΒjΛΈΓ5TβΡ ŸΓδ-˜κΈγΕP|4P�ά€KϋΤμ΄υvυΠ‡ώ[]/8‡ΐ]ΐXΔΏφ�»μσ_ψ²ΕQ|Θ€qœλT©Ι:YOuΊP9…ΚM*Š‘ΪhrO‹€4Ήφ76ΧαЏ)€Γ`{«’eέπžA~ήD={΅Ν―.PC₯Λ@Ύ” :} *‘J*ΗP‹Ζυ­ Kσ;:Ύ[/ΞΈͺ«ΛΝ-5_ϊΐήυ™οF@ØE�ύ鏼ϋϋoG.�ΞL g*ηmn~iϊ&χ™{Ι�:RFν3ƒ”³0΅PΟTχΛuΙζ‘²«εž)��Ÿϋd~¨ŒccsΝ:†;νθ±£ΆŒi₯ΐxGS‡Ω(_οώαχ`Πuύ{zmτΒe»9’Θ)€t»�φΓvϋχΨηώμ³Μ_΅Λ€“„^‰9’ώ>Œ©₯Ϊ€Μ2ΛΩ!ςJͺ ‰Ί₯^@?CKA ι&χ₯A©Π ˜§Δ΅{’ ·Ϊ�Ι£€q§ΓΒϊς δW‘(r˜o9ΦΣΫy¦¨ei΄ΪAeFDN Y%Zs*οQ>„�H9ΞLε9Sd\jΝ(r!9e„듇ˆ €<λV%!|‚”ρȐ³§%λLή!e]λRΧΰί›)ŒJΉWRD‰h+Ρu"§΄ƒ8H°ΓX΅n‹‚*‘π†p½΄"•2U�Υy«˜ Ωήή!«no΄`KΜ†GφΩ₯œ—ΑYgC«�ϋoΪθθ¨λ¨ βAc՚ΩX[wΔ‡JC€‚P§ ½*QFΘΏEd έ³¬Y+£Ε"Δ‚Z,‘¬ΎάŒm‘Φ*d‰ΟΚΉ©«―oΰ―ξxν«�ϊ ?π‘'Ώט €χ‡/^^‚πˆƒ—ΰMρ†δEΐ‹ΐ‹£Οώ/>=5ύg‰ΔΖ ξ ττΣ |Χi\ηkΤιͺ…š“ώ²Ι=œ¬₯δΆ»ft) γœ%sWD&νg#οc3œ`lπ½Ÿμ]8RG2lι°^:{‰ ~Š}Jι―�.’–”BK€\Ά�££ΣγΓYOS»;uΚVΧ–^€²}~2‰­Y?€ΰψρ§ΖδNϊΏOd@’€Ϊα γ‹aΤΆNφw 'rœβΓuϊœυvt؞AΆ€ˆ™G! e•—μy‚ξO<σ$ ŠzΪRΆΡ†±Υj©ί›˜„8‘ˆk“Ίξ•e2³€ eωΏ+3‰`‘ .ΓΕ3 FΦΥ‘ ?€ˆmΠJu1¨!ϋxΣ‘c„#k1Eμκμ œΟΊΫΊ\ύσŠ;¬I 3 β†Ωέυλ$ ωž�HŒu€βIIεqͺ(/)[ xΥψΆΙTΗ*’„‡ ͺpΒΟA¬I;OΝΞZ7%I°όφΪ,Δ@%χžΣ'θ™ )€ŸΚ7Jd@±Ϊsυε"#Ϊλ­Ύ¦κοyΟϋ>άΩΉwνŝε�ϊ³α –­oh˜—@₯Α@%fv @ύ$χM~2σ€'�₯΄ν$δiΆΧΎξU–†΄Qw€a< }δQζ]­ͺ3 σnnp§˜·E{πα‡νmo£Ε`+ˆί€Ž>„LΏŽωY‹‘¨ZμEPzτ PRC=>e)Rv”¨Gˆ0‡(°χf§ώk7Ζ,€Gur7Σ―Ž%΄μA³Ζš(WΧωdΈ²€Ί:’9žŒL•Υ˜-œύw*‡pέPΗH²λsP$sζ}ˆ„ν:₯œI�M!(…ΐ7ŸΨKY©€ E@:Οw<hϊ!(³xŽθg Θ½'―rλB ½D€(-’jI„›ΦnH€s˜ Ω!R₯‡λκΑ˜y.ˆ΄α’S…pώΜ:-1‰Ρσ%DRNμ ΪI3F?Ο9©o€NΗ‚Ÿu$•ζ:‡¦ KυχAά…μψ³Ϋ Κ…›^σZλΐ7‘­Υζ N¦fζ¬ βΐ‡ΒC•κ4"e„β£ΏΥšQίΛσ@/Ε³š½WίLj‘?-]U‚’RLXsR<0hˆL.·ω,1¬mŠ•Žάϊκ�όžϋόNCƒIΤΟΉczxπ"ΰEΐ‹ΐ·'qπ퉣w/^^fxΗ;~llsjκίόΒGybu}α—iΑθ‹VξΎΩ쓝Klζm‰½Z�- _€T(±aχw3sP™™mβ‚Π²ZοΕm;ΈΎ+EKΙ\€nWe%2ˆ.^΄½GφΡ:mΓ�\›Άΐ»z™ηΘΒMNŒΫ<2ξ}gU­――ρ™3zLΣ«Φo72ΆΘσΙ΄:“B6Ϋ;ό;‰‰]’˜ ―{ΜΖ�M’ω„Μ`γ½IψφϊΫ(o w¨�―²ΔΖ–=όυγNVa£_‚,»ωγ_£Μ’…^νy{κΤS(²6[ZCe°`]ΦΘ†LgHƒ ₯ε*ΜΫ”Αe\Aβ&…€ΚΠΔ U ½“΅ŠάϊΙπ+²Ο’)ηQGLLΞ8BA¦p½}/ΏMLΟΪu€ίW©'Ο3ώw@ͺ¨ ή§Ÿ³;ίl+MΎΦo«azΡ—•Ie�e?ƒΆqrΚ0k<’c+»šG֝xΦSΊ‘7([g|Κ27Ά6[#%‘ͺ(ςθFη!’H&aŽ-ΩϋδOΦ‹jγŠ|([(ΰƒ₯3€Jκͺͺ.΄·uώ‡ƒΞ|7/—wΌΓWόΓ?όδΓW�]ωAΌ)Fj!₯Dν£d`‰N“ϊύ•�m©Z6ζ!P†χν‘Γ@%5˜[βQΆ½΄�Œώ‹dγ§0ι–Χ½R¦ΊDF™Ξ«[Σ°KΌO±‰1[ZX±WέώZζOΨΦ–ΦmϞ=–i˜7i>—!B;9Κ~Š…$‘™[ύ}=vddΏ]ΐ±�™ηNcV˜Ζ#ƒ.έΝIΖl‰y‘υ#ΒJ€[DRY”#Ξω*}(œΜE2ˆ¨y CC+ζXΠ’ΤK?ΠΊƒl“1§ό"x¨tFΏ+ς3)€(xΥ‘ €η€σΐ2„ 9a'’B 9Θ!)"@Δ]”±gθ$QM‹Qz§²)Πξ5E�€Ÿc‘JB$„|²K<7J! ‘λγ9ŜAPͺ4@¦"gŠ,a@4Yσ¬]uΈ‡ψYΐ•*θyΑBΔ›)5ι |i3±a{‡χ[‰ϋoh²ΆΞnH΅›₯s‚ΡρΛΧρΐ 6Vλ*—…df)2ƒώ<Σw½t.ΕΏS©žW&θgZ«9ΤWj‹*Ε“RύΔλ!>ˆι£‡¦>π3ΏπՎ4p‡σώπ"ΰEΐ‹€oc<βΰΫLοP^ΌΌΌ"PΫΣ³qςδΙO~ζ3�Ήέο/ΜWΗλj–~J ǎΦZ@BWς6»v@J†L)ϋo·ρU σ%@uΠΑςΕΑΰˆl;›ο(ΐ2ΑX$@ΠŒ»�ΐΠΚΐ›ω……U[ΨΛ€qbr�P=(3¨—ŒθZ›Zlpp]<{εΊό Κ΅,Η¦ΰ‚ΪhPϋρ’d!(p΅Αz/γP«Ή β ¨˜(‘žίΔ8sκŒσ |:€B’―΅ΥŒ{|t 9Ζe «κ©?¦^±‚±Ξ£^Ψ€40ϊ²w‰`β`τΜa씨…‘²Έjβe ΩD)F‚!ΗxΚ€’mΤ*‘Τ: €390X§Φ–HΚO<ςΈυφtX;­δΖ&fQe&ΉcΧ§&msy۞}ζ4Ωή G𬒀Pζy‡φy -h•ε&›JήŠ]5ƒΘU§Λ\ΈθκΕωŸΗ«‚ Άb¨zx΅ζμ¦Τ£Μ}Ψ^]·φΪFk@ŠΎ„οΔΚάΌ+)‰ώN<ι€ΧΎA[θΒSaΡΫ»¬"‘³­νOο»ο�aίΎ}ϊΠ‡ά=όnώγƒόΉ�ΏρΉι…_Ξη o¬ŒPέ„p!€Kσψ ²ΩΙ©ύ$e50Bƒ½D˜XS"pϋ­”·°6φγy‘ΖλΰοΎψK!χί†“q₯zyu₯ΈxnΜΊ;­«―υ†Œwμαγ'νuwήΛχYKܘ΄ΑΞ.{ŠΪz§ό¬)±8C7€'IE°Š’ώ† [˜ΕΓ"l‡ο ΊμJδαίψΖ 2Ί%ΫB>~mΚHΝΥz.H<+–Έ¦(ήΊΆΤr‚{#uΓλόI²Όκ3ΟΥΈ{’.Κή>P"\k„ ιτυ ΛΠΧΎyν²“Οίyθ°έvμ˜]Ίxήͺš›*γΡΗΪ{�ώύϋguO^/ζΣ¨ό"οΟ{ΎχχPΌ« 2¨ ΅η\N―@ΐ¬Κ¨+Σ~ηέwΡ-DΘ©s=^UCGƒ΄ΝR�2|dΏ5U‘ΤΈt9 Ρ Ÿ[Αg&Ž»“ά …! ž:Θ‰(Š€h)ͺυα₯ΡQκΰ™[Ϋ(έ?ςό7~�›m�‘½BdάYR±”2h¬ΉΫοΉΓξ{γ}φƞΥdχ*—gž:γ΄ σ½@‰O‰5…$CΖ%1 eςΰUͺ’g)�ƒ]εΪŽξΆEθ~Ό ψŠ S›VuPKΧ eΦrηω‘9.Oq !<JLΜάvŠŸ Xλy₯y₯ zN¨3JΌžΘ·<%ηΟc ‰�‡8“U™J!`.bLγ”BB$‘ΘH‘‡zωυ+­ΚSjραΟ2H@½ΚΪ<ΦεΚ6Ώ8o#ΛΈ­oSGŒ΅‚€�φf†XξΉ YΞ΅Ν„S`θ”i™rΧ,ε.ιχͺ‘–χD±€kηzk+Ήζ( weWy©„#ƒ―κέϋK7&_…|ԊU*(;:κτ)D‡ ΐ}Θ8†l3 KŒPΔA«ψc £Δυ₯+ΥΡψJeΌϊΞ™“_£“ΐ3}##Ν=>�ί9qτθkδψ²z}km¬|μ·?ς›£—/·.--Όͺ>^λον¦KσΉΐύ©Έ―β–Εt/^OίΒZD—Ω/sίώΦ·3+low¦‘sΆ0Ώh1ΐrŒΉΆ>;g«ΣsΞϋBYωTP™\vΚ•*T“Χ&ΝΗ=qRvξŸΚJ††ϊνΦ[o²2s\¦¦Hκƒ˜mbyϋ»‡ΏfCjvυvΫ[ήψ&:£$μ}έΦr ‹ϋi›Θ*π£x‘;"¬ΚϊΥφ!‘‡�‚XRΏΖ«9₯Ž(ς)*ΐyžpώΰ_ ^�–κEΐί•_೑ƒπΠ1ŽΥκQ₯H >[9%₯E‚n%•Μ;\QΕ κXcš5Υ”_πωq¨Ό§²ΊΞ†ϋ!��XΖ—₯…j³νHYĜ/3v6j|" c”H „ ¬«΄Β-]…d ($ŠdπCŸ:ΘθΊDΤδ} sŽ‘ΓsE>‘(γ†ΘP7ˆ‚.ΰ[ ‰< *QTm3ξ<*_–6‘Œωρ―=βΞWΈ΅½k†θΜ9–Θ)�€μRΓωb0.Q_R"¨m£ˆ†Έ²…kΧ�Ή˜‰”Ν‘L +•8DbΦΦΫoέ}γ―ωž·ύ%ŸgΰήΛ‹€/^^ˆxΔΑ Uο˜^ΌΌ,#ΐ¦T$Bω£f 6α�ς—?ϋθ7ϊΖ½©Lϊ½΅υ΅m™Tͺ’Ύ¦Ξe�—i}¨ϊ]¦Θ₯ k(™­z΄«ξέ¨aSΐΌ”P$lΡ’¬­¦oάζΩ\Οܘ° dΦ}μ ²«-½Ykj�΄λ£v ir  EdBŽΝΌΪ.To+σ ف„(4βL΅ΟJT·/’£€IaφΖώίΙ’•ΙXZ\^`‡j»›}2‘ͺcWφןώ–Γ;€ Ρζ?`W–>’Ϊr2π½]έ\o’ηΦG†}GX•Ϊ¦a„·‰!έ4~ύ}Θψ[ϋΌZΒ5bξ828ΰb΅0·D6rFDRxdμΈΘsŽ] s‡M[ΜΛ…>ΞySΤb‡ΈFŽt“P»I€ΐˆ,e”8l‘ύ”Ϋ~ZŠυτzΏZΪ‰ΰQ2Ή’AeEzΙΗ+ƒ( t­άΗ%ΞΉΜΨSΔΦ―šŒχ΄ΰ[ŠVV|ϊMοΧ§b±šΘΙ‡O|� όGήχΑΗF€9ΚzyΏ>’ύΨ•/½ϋKο<σπ‰wbώω±@Δ_S μ`D‰™!χδlηΜ±εΥk ƒ|ηwΊΉ¦Œ|ooΔNM PΆ\¦šL}Μ=“Z‘=[¦£ˆH‘s]ζxQ:5DπΕ¨ΰήνpίՎP†—Υψh)IΈ9΅’ΩΐΘ2ΞάG―b-ΥB?wΪ’˜›BΑ³‘Ψ΄νΔ– ΪΨυiJ‡RVαFζB‘Q5�±Μ*ζG %9‹Y»΅�nΎ ΩσkWςθΥ+§μ>Ωτ@š?™Χg½—/^ΌΌ0Π ½—/^Όό�ŒΐύχߟϋάηώfόιgΞ<1ΨΣσ ’δ΄œ…B«lΒΟ³ŸΎDΆί𩬫« hΦadVSW…)ύ�£΄η# «οπΘPž¬όc!_ώ|je�qqf<š‘W|.½Žά’Νέ˜Η—‰2ϋ0›υSO>Eoψ+lœ›λΦΪςΚ&ΩK ›ύ°ŒΤΨYiy$~e@ω™Z,ΚΛ@;‚,|©’”#HΦ¬L}P¦L <DΈοΜΚt*CΊ“C»€Εi€½ΐ‘Ž [©φoq@Ά²¬dΗ°€’€΅t΄Xߞ!kΖe½@–`σΏˆΩ‡ŒUƒΪήU Λ€‰ΰ€zν›²‰‰Ά²Ίl++["=2¨( Ίecΰ‘zrΙ°Γ’€£"‰·d�ΥΨ·κ΅E† ΘUΎ•F NωUΠ½λ%―–vRfΔ«ΥΘΤ%1jΤ!px*l CJ•wΤΥEKM 5Ÿ=rψΐ/}μ·�ΰsW―ήΎnv9ΤήΩqξ]οώΙ§AEζyωΏξδώςηώςs©?μ©s£Ο=ΆB‡ϋzzκ7)G΅…0Tgy|tΪšZ/A€¦y{‹­ΣΥδμΐξ‰Ηž’΅!>άΥϊK^/LζœbΤƒ‰ ˜E‘C–[ο‘ΚGΚ jN1ρPΤΪʐuζZSC£Ν"₯―81wϊϊƒΆ85k1J]κγuΦΫήe‡χ‘5j½λ–’Ά‘Ž(d«E H7Ν y”˜ΧκPΗ<ή»�… Š•]Ή=yƚΥΡάd^‹Ω¦ΔBΔž{Y―Υvmμš+RΙPw_Ÿν;xΨ&ριΈεξ;l�­7Ϋ 5ϋ9”E|ΤrΜΣ DΑΎcϋνΘ-GYkt$ c{w›΅ρ€δ“οΒf&ιΪΏΚ«AJ€d‰Κ₯δ1"ζ@J$…Pνυi ηTFb£ulCISέœJGΟ ²ϊŠ­ZLΚ“A$ˆLMΉT: €‘kj;Λ³²Κ-d)Ÿ₯”* ‰‘g��Κ@€ŠΚ2Pu ΒΠχβcŠ*aβΉ‘ηΦ§~―Ώ£\Λ&dͺH‡°Lω½Φ:“…ϋΆ�žŽςπΘΘ_ή�ΏυΣwέύͺ3―”υFΌ—/^^”xŠƒ%μήI½xxΉD€¨μ9}±Ωύώf§ΞΞvaΑχΠ© +›[Γλλ«w•K…Žι©ι#Hά*«ͺkκκλj67·.ω|ώ/ φυ_υλξxͺq°%ωΝΏϊβ‘•ωε‘ΉιέιTz›½rέιg�ά·87vλφρmίWώΫΖψO›σŒϊVρ@OΟέ-ό" j(κ’°E}Ά°#`νκœZ˜φmŒζ΄OgΖ£J6ζNnΝΰ%MNΈ:kϊ©“₯h3ΟA}lξ•yLo'q~Ηԍ1δζΑ(}‘y$@,₯Άμ0dΑΎ‘!ΐLΜ’€’cΰνdQsΦ₯4BΔ‚H ‘δΞ-t.ψϊƒ�`-ΤΊη³j_糆ZLW·Ή^€γ()B2#I²@Σ5 ΄Α)8‚@†uvαZ‚aκκQ'(S)P"™…ΚΚθζεw ΊsySΘΕΎκΓ«BD@W1”OC€²0ƒ?%χ½ζ^΅²Όއ?ςφ·Ώkς§φΧ|ϋχ_ξΫχnϊgΪΦΒρrωΟ��…'›λGŸ={ρB•·uwΈRƒΩ₯y”"Λφμ³OΫe8}C–lθ°€3‹&J–Ώ?7IΉw©]’¨D€‘JG₯7;(ldΆ©9+@šΖ ONΤ�0Oϊ>‹“ΏT>ΥxάXœ³«—P3Pš²ƒίΎΎ~J"”ΐ$μΒ™σΆ<»`FΕi€<§Ζ:Θb―@d™/‰u§’‘ιaΥ‰ΐ¬^jQZ…9fοxAΤ(”Ύπ~-Όέ:~T,[ZWi½Œ—μρ'uδ^MSδaΜΪΫ:Pν@BΰUυ΄Ϊ₯ΉIϋή#o±WΏώ΅φπ—°Ωρy€zΜͺ*"(ͺ­£³έ._ΏΜg(Χ@qplΰ˜>v”r€­mmΪ έ]κ"Υͺ.ΫκΔ2γ‡"BŽrvy•'™0JuΐœΩ’MZ)†«i©Ξ ” ­nΰ/Α‚-SŠ φ“­#uŠ  ςG­5�]\„Θ„de|εφvΒ‘zRh z)vκ’’œI&‰RΘbg'ιH)‰Dh}²~\œ΅ΆEθη""τ;1"υΊΊ;­·―χ ο{�Oόε"+ξή^Όxπ"π‚Fΐ#^Ππzχ"ΰEΰ•6Ό€C)ξώΗ)<›aΣόϋŸyδ‘ϊKWΟFb΅υG+γ‘ΫoΊι–?hkλΠό§Ÿ9Ιϋ}ξ9 Lάd₯ύ|.<~ς�·Ÿ�΅wO�άx'ΈoΉͺωMδάY6ήΥu­Θ†Qμ·K^Υ"‹–š²ŸiLe¨φn€Η΄tx9±ΧμeΜgCΎ½)  !ŸSMΉ eφ³H–΅Ρ—BίGνz†Œ¨ΪΜ…‘φ(Γ6ΤΝA�φ―X τβ(Oy’b~ θ9˜tΥΕ«Ι( ΄«l 4γ*ό3Έ»«tβκ•Kd79mΰ‡Κ–ʍ]ύεFTnQζ\ϊάνeΰ&™ΈPŠ ςDHθϋ°T Έ�GxRXθ₯¨Κ"‹H¨ͺ¬v=θ³ ΊΞZΊ7PΌ€Q%dΗ•raΈ· εφΔΚ ΏΎΆΊ&ΫΥΣύG½m§·ΆDθ¬Ό—½Ζ�4» ―O|βcΟ]'ςα“O>ωwqςδ#±ͺšO\ω§ŸΊ`£γk)Žρ’2yrf—ηYZg–6ύa²Ÿ*9POwe�·δ·Βκٌηω½HIωΥΟ]Ÿ£H΅Ν ` €mdmh ΫΦ7Ά "P*0LmμkX%Θ„Νδ¦Ψ;d{Fρ¨Δ3ΰGξ½Μ{ͺ" ͺ” δjΘ1Šœ»χΰ@’­PΛήΦΤeΣ›τ΄§6ΓΙ Riψ Gl¨ΝœΖžΫΜβP QΧ‰j ΰ₯Θ4«V›r@‡δόY²œAΞγχ’ΔgΈώ*ˆ ˆ|%Yk€M!+0ŠΑe KF—’OKΥ€) ’Ί€txκ¦ΓΗ~ρΨ±cYzΜ_ξκκΚόσ;ηύδŸFΰηώ#W―­^ϋ‘λΗO5ž|β‰― –²ΆΉͺeeuΝ›tΑ8χ¬ΝœΰG­Ί£Ζ“—Ο_’œ…ΆœψVlcͺ—A./N°₯UΠρ EιLE€¦u•4`Δ…  aš'ΕHšΖ—@yy{Μ\KΣ.³ή•Υˆ JΞo9PφAΡ.0ΘgJyˆ'ΦP3Ο2s2'"  6_„ƒP¬� ΙτE@‘Β/€0·ςZ3£RjΖU†ΐRF? βCΝ²½ž±ΥR‹΅u΅[p|ΜϊQ„© —R!ΐ{έ@ΘΚΦTsLˆ†(νέdW*£ΐ >QΉρησW8όoίϋήχ>G¬^ου/ˆ±ιE/Cg&ϊ›χί� O΅Χv~δνoύ!4ϊ₯�γίψ¦ύΝgΎB·…Fσ-ΠΡ€ϋ’„ό!eνΪνα›GkMJN δόŸγώψ€,aξίGeŌ3kΫ¨Q(!IΙ€ω•š)ό”½ž›Y΄zΜ93w&(³‘ΚE€‚Jδν±ŽGH„Ÿ©nΎ‚μ»Τ1β΄–δ“Α4bέ`ΘΗΌ’§~ bN~ςΨ(ΣAνΛ~Υβ @!PΧTνϊdˆ”Šc)3Ώω™K3ΧρΚΨ»o?δδ^ ΚκW£ό)r ~ζΎΦS β*μί‡Κψτ”EΉΖ$Χ0?K»TόΊΊ»lnvΙe�—ηWμi:­4…j-» α‡ ΓeξkŽ΅E%ƒ»VΈ ;xψ-·mvfΪ•utw Š†ŒγΩH—!i{e—΅χυβ'RIιΘ$F§“\ƒ:²πBΑdCEuhP ‘b –τ6?‡,‘\IO!—ς% Β€·;b―‚Έκ{ΕOd‹ξβcƒj�ΚΓFΟ$½GK»€?F2©žς«ΖϊΪςΎωΡώ›O΄y% ΔΝ{yπ"ΰEΰ;8ψΞΕΪ;“/^Ύ-hn:ώoo~3>:11σ³Σ3ΘϊΙΊG( �@'ϋ ΗݝΟψŽW‡œσΌ2{ΚϊϋiwΨPWν6ο΅5UŽ(HΞΥ–­Δ&_Y{r$΅§ …—+μβeκΕ6}ένΆI οY fa$^Ήΐ%k-Υ –₯•βκΪͺuΣo'³nŽΣ�Ψbγ£S>Ζΐ¨ͺ¬ΒnΕ:ώˆ}υp΄―‘„DH @¦’gxH)G†sϋY!ȍ €¦ez— πΌ@ŒχH^.™΄ŒA„–xΘK‚λ&ϋΙ±κqΗΧE΄ΤΥΉr„]0Zθt!†|*|“ u _oiiϊκϋί�ώ3i𯟾Δ.¨π™g9]]έΨάP�ώΜNώmγγΗVΧ·ρ«€XS-|Πj!HESƒ&„N" ‚°δώ*›―Ά šΣ"‡€]e�3x!ΘμSāΌ|( 4w₯@‘zF†˜`[~Α|Y眚ͺjΫΉΓύήFj§Ξ_z•Ύ„�1ΐΎΐz–/‘yΦUSK“+QPy‹>WΔ+Γi¦.jƒZJ%Κ:m€B€Θ¬76΅°Y'H(²[¨)ΆP6ΰΙΰΕle~Αu}X˜₯#₯\.λ.’$ΧέTθQΨ© ”Β¬\iΛs Ά4»b5tˆ”wΙ‘ ω°†3t›9‘‚ ¨ΰύ*Ohοκ°CGήl}γkΞ{‘Šn'έ=½(bvα�§P)PίΨ€Ic�š[Ϋliaή•©EλJΧ­—ΤI"7΄�ΤΩΕ‘rβΧt/dj(rχ½z�μš+ͺS…LKΛά7Άͺ Šξ›»w,Lέg;šT‡“ZΊG4AϊutΆ>ψ‹ΏψKδx«ξ ή^Όxπ"π‹€G|ΗBνΘ‹€/ߞ(“›HŒίϊ–·$“‰τψ�ωΉ/¨Ξ8ŠρXˆ α6nͺŒAHς[JέΙι]jmάs€‰j“«TRDιͺιWγ6mζ• tuΙ{e-Υ*.( (W†3ŠŸΒΞκ?f]•ύ¬«ΈnδH°,ΠΪnΠ°Ε±)ΐUΪΦ¦g0“‹Ω�) `�&ΏΞξ„}γ‘oΪΧϊ†%hΥθ―`!—qvpΥ<¨ŸώΉ8£ψϊΏΫ; »ΞςL�w_ϊήΎ}{ou«Υ-K²dY²dΩςΎacA0`\I›Λ{«τ&οχShe(Π­-ΆYr Φk)’Ν4Y?«|Vp[sΑdάζToeRlEΦϋΰ—|[•΅Ο­¨b“B―Oξ]₯ hΓ{sF*ˆ †:ExnrΞ͎Œ;?ŸΟŽ€ΚQ”άφŸ>μfŽu;v žoάb6{ηΞέ�ΐjsχx3΄³Q… +»edΡήΗ3ΉsŒBΓβ9ώβ’1 +νά­³™tsΉ°ΚΛεz¦ˆ‹z]gšfF?‡¨λΔΣ ¦I Ηig5;I±η§ΡΛχΨX+ΖyΚΡ/ ½ϋύ·άςEJ˜·Sνφ8%ΞχοΏώρ#[Ύ³ιh₯ZΉπ‚υ',vσΘΔ4κ2…0ƞμVDΆ�ΜjpOX, Ψϋm ±„σ4θ'ρuFZ4ΎΜ¬―BdbΖ“α“~α%T)`ΝT1ΐχ#: Έg�μΛΗ½nFζaΒt/Aσ(§@”cΞeη\ Ρ6TηSΌηHfh0ŽpΖΓLSά’3†\'ꃣHώ‹$Ψ(OcC�Η+Όq\τ%VΞ[’n–’zr2ΛχΊ γΥlΕ§r.3C£υAŠ€†0ΚkΪΝαsΛ8K ΙΡ Ψ{xΏΫ±{/†’ΣŒe€Λ( ΨΝkiPΰ³`Ν•2ζ’¦Ό°4•p˜ <>σ<1ΓAFh ¬ΉΧ /vΈή>Ξ{>’ΥΖ’Œι’ΑEx70Αsk‘ν4 ξ㦲δŠγ$τ\ψYbσ3˜=°Ÿ¦Ίˆ Ξ°Ο‹Eσ80σΓy΅‡ΧΘxξξ4³Cϋ»5¬±γg‹ηΧΒ΅Δh�P r‹α܍jiΥΉkΈςε/ύΤŸΉΓΖ_΄‰€ˆ€όž π£^›ˆ€ˆΐ©Lΰ‘GXsϋ·�υΘθψ…™\nΈ\ε{VτG§2Ω²Jhv„’Α ±MŸR¬,Z1žx�ΨΕ…}Šάτ «§Χζ«[5€ϋ9Mk˜q’I‰-Υ ŒiœUηŠ“ΎN "β|₯‚Θ2o,ˆV-ZΨ_oF’_0ΒY0gP―Ά96;—―•ΦΗ ΆŸ™‘πρGάDfΕ QuV@΅ΈŽV $FB48拐’λ!Κnήtq~EΥOΰ˜fΪ–£ΘςSΨxrvJŽ43Ρ ϋˆ~Δ§ ‚’fΝšεgΧlΥL„FGœ(HV•kŒ0|ΛΫίσΞχό »»›₯nmΗ›@σ±fθΆMΎ.Žx&[8{σ–G(ΎρΝ`Ž>HQi !‹΄ΈFσ9°1SŸψθXΑo«ΤŠψΖt{{ΈOx�i`ε(|­ωeEμΌg΄?jΚ‹)΄”†ωΟΓ¬œ[G; QF[μ^²b·₯5‚² νzϊΈ«―Ή†c:wθΠ>X“mŽω^·°ΏΧΨ»ίΪ·ίuuv»M[63rΧ‚=œ£©uŠΉ 1₯ žž» 6Ξ‘Α½@‘‘λhsMžΛώ _:>>A�Βή “<ƒΞ%1SœΚŠΉtŠ mK s –žRεY#D5RόΫ΅Y£―…Fb‚HqΧ^mέςΥ+άy]θ�=iš"qΞњ ΘP4Ψ― v3NdI$[·a^yθΚ€ ' œΟ„{ς‰Ÿζ ©£Z†‘5:¬ωhJ₯yζœ£M6ξ`ώ%¦h*Ωυ6E°Ζ Υ R²··Χ…P/#ͺ²ΞΏ[S’5Ξψ”ŸwρώwΠΜιξwƒ‹}οΊW�Ι{Χ�]�€Τ?Ηϋ©ΤώE@Dΰω hTαωΉθ«" "pΚXΏώ’νΘ°ίό…/|zΩ·6nόb6WYπc8ΠΙ/φuwŒkΤ1Lγ·sΜΨ?¨R,πΛy‚•P“›η@ «‹f(WΓ‰έ υ:ζfV„4}aϐЊ.«—VΨwDpL§h˜/ƊxT‘ω#?f�ύK\_gλckΧ-ω8υάγTωώP©^ Ρ΄H-_³zΫEηž3~Ϋ�ϊίkž~rηΛ'ΣΕ?fΝr 49K‘‘f>±‚Πως˜Ϊ΅�( f‘j/NγΒ [%�±κI-ΔΗΌ‰υ…ςuŠδHΧi’P¨τ0/οσ5¦κΑΐ·‰o\\Θη―hΰ`P«d™οn$Z{[’-OβΡπ“ΧΏε΅_;kαΚίΗ>ΑΑ΅ύ>ψΞσUo½΅ω­5kξΩ»iΛƒŸΰύΎΦΉŒίŒυl…>Œ°ςžΓƒͺ’Ψζχs¬ͺ‡½Ωw”/žwEΞ{z3υ4J“34Ν(\Ή_MbPAβoJk™σΏΕ<ζX©·FwχzΓ΅£X1…Ž™ρΥρ!0o Ϋ¬Qaζ…ƒX%εγŠ™$ΎΈ €!Φ•ΒΪ5«\?f…£Ηά?ϊ)Ν¨6ξQžό)ΈΙρI—§αkK“ΆΐsEσa’ϋ=Α3—FEΐΎ'iά΅§QaP8CΣΐσtΰ9˜Ÿb_=FIζ½xU[εoP`ۍZ#νΔV¬Πgsσ±£–>b >�ΛΤEΦ£4(0BaΝ‰>"3… ―C‰dš06ξdγ•DΡ;κϊ Ίν??IΩ-^ΌΤυφ πόέCmσΜXmΌΙφ³’%ωœΟRWόAΤGΆίηD¦N0΅u8ζrsπ§™ΒϋYα}ˆF j”i•P(”Q˜Δ]7MΏEέέ.•N4�½]χwΩεο>χά vΪϋ‘MD@DΰΔPγΰΔpΧQE@Dΰ%ΐ*\žζΑSϋώίώΫ·mΫώ‰\>ŒE‰9£ΰ n-OγσΧ1#$šB§–ε~–Pγf^fE:�Ÿβz“ρ7Γu—'б)σ4E[ΨVμ)@βI$ΝmMŠy+:‚qS%Τ)ͺna{‹‹±ͺڊyωŠ₯?\ϊ�χ�ϋUζ¦φŸo?:p ωΰώ=_œω»Ν[6?rυ†>Ίuλγ69=σjσ8 Άcς‘˜Αž+ΈΜ”#kN΅2mEζLLŎvHA  ρnIŒςϊϋzρ|pΥT[όƒΉνξ ±²καΌ1άύ^{GW³½£;±lŊ―½όΪ N±ΓωJρ??_ύΛq pλ­χ§ώω3�όΧέ©τ7·oίφ¦l,t~“MSΠ= Π΄ ›©g^ε 1‹ε(GΈ'3Y�3³Œ'πΎ‡)°CaΦ‹σξό–ώasφάψe”<νךb6wΟϋΞ猩”λ.[šŸΓΗ Ο ‚…}ύ€ D™έ§πηήΆΧLβ-0yτ0ή17 Ώ§ί-β™Βˆ°DŒbΈΥS:δ‰2΄¦œΝϊ‡8ί"£ 6f`ρ€Φ˜₯‘`³7¦œ±ζΐΔTΥΑ±1 K“ˆPxΫXEƒFŠŸΒτ8ͺ™ ηYvF…\GΈQ+ΰΝ[ΐΟ> ³^™77₯ν9"ν<ΞΛΤFfό™™u“샧ΙΫG–Q 3#2ΚΓ‘ˆf€Œ§ `Ο–)>v=³Σ’„bΚ£YΎΧ$3.LIs³q"31΅Q&3/5EOŠŸ–Π`)φήxήŒyX„j †ς…Q­FΜcΌƒŸQ¨,Ϋπϋyn1@\H|ζP'&₯­Ιr�ΰΐG^ρΊW|nΥͺ Əí§]Š€ˆ€όΤ8ψ-`ι[E@Dΰd&@TΫΆm۝mΙΦΩlΎπ⧟~κu xq‰”EΙα.Ο/ρ ν8’lκl~Ι/π ;EXŒΰBζ‘gi(ΚσE_όγ4"Θ‰ΛΔ¬YrA «–ζ_₯Pθ!•ΑΛ―w%ΤΙJw"QHφφv{pιπ¦+­2ω ΫА«o}`A@μΡK.½κγ―yΝ›ΏsχέwΞ9v6eί#γc?ž:6ρήαξΤ[16“·’μ ςμZ•c―bsάt>jυf[*ε‹Η�«ω»~ehέω_„MqΣ¦Mϋ/ΎψβΫ–.=ηΘo8-ύσ π—oωK[QήωΌwvttμ‹ ϊbα‡!λGƒ’έ3+4B³B€_U@‘`+ΤLβxγ75R²€X!k#VtΗ)†½τσή0U w€™$š ΑA Ππ nηζπ Hb.θl–hŒρ\LŽŽ!©οςF`4ΪB4:Y­·½Βκ}{o§v3cγ40²ξΜgΉ‡άΞΨ@ €«κ—-Ξ1ΑΘ+ϊ*J+΄i€5m¬‚G$HγΒ<,•ΣβΈ<ŸaK.¨RˆΣ¬ΰl’²kn`ΖX΅q .kοy.qο[ϏΒΒR&L±`Η²f‚™VQΩ³Œ‰Η!š˜L’δ8°τΎ65“u½ƒύn՚΅˜RΖέΑ}]69Ks`‚T…‚—1vψΚF4)γΩ`Ύήυplο8ֈ ΒƟ‚44¬ΉΡδ}³Ζ†=›φ^ ‘aRεΪπ–@G΅δCΑg_½]˜«š  ΪS¨’ό.ΩΥzΧ;>ϊΡ�Ϋζσ͜€ΫQ‡ψ%ό€Χ&" "π‡B`νΪ΅$Ά»;›ΝΒ}oύ‹·P7„―Ιζ3!3N‹…Z)£˜ν¦ˆ¨±’ˆυœηJocUδΩXΔ!k&&ήE‡5RqVn«ΧΚ<΄$υFΑ₯1œ‹€1dφڊ«@0Ύgν9η| +™>Ψ΅`pίe—]6I‘Nuφϊ߈uλΦ­�-Ωqg{Ίνφ΅—½tφΖ7ψšƒƒ=ΪίΏτϊEλ/ι‘Ήγ_>:°oΟK3ΩΉ³»Ί» –κεu-±Θ΄­ώ"?οGzΎ»»―竬vΝNΞΌ>ΪŽ-^Ύδo―{Ω χs"ήvε•WNΘ}θ7ž“ΎαΔΰž‘΄wξ[ίϊ�fš<χWώkz:QΑ xα~4ΥΜΔΨ΄—ͺ@νZ(R-~Τ$ϋQL/c4•lΥΫgJκάΧ¦RπVγ)#ύAάώ'¦ζΈχQ؍Α-¨n¨S)Όνο(LΉΒη~ξχEϊΆ‡u‹—-s)VΒg'˜f&Ώ•ύ/YΆΒsϋίΏw‡›žΐƒΐ†έeW\αής‰Y�œ‹qn|œKžηΜ”V°Ϋρ#Z#‰ΑžCΫ~vΞ&ϋ7‹΄4'U­Πΰ™γ©³ιΜ9’`Οa“y³Iaθ˜G-`‰ΆY3%Šκb.3λφνΫνΚ…ί[φ’WŸs�«ο~Dž4‹9ΟΨτπžgέ 'πZΘMΟΊšΕF2κ‘Αr�‰R!oŽiM{ΜΩxοhNΜ7 LΩ‘c¦κ0U¨½χ$ˆβ ΕB˜Ώ§42Cό—Q"�1κτš&~šύƒέ3½�tΖΚ3?§¦‡Wˆ€ˆΐIA€ίΪD@D@ώ 9²«γ;ίόΞςιΜh΄¬`rdφ-˜ήΐb_.Ž|Ε ψ�UεJya±\’Ή€ϊ5εΏ³Tκ­^–)ΦBΜ"‡15k‰aΘκaͺ-ύu’Τη ΩΕιφΤSm©ΆMοΉω½χSΕύi«ό ͺυ)’ ΛΘω­Δ.±jo_³θQ“ήΫHƒ Z“Αξg/n|g₯J+βK±(E^Cρ;øΊσΧΊ%+WΈ'~Π΅P$χ0―ί΅ ΗΉf΅›œq»wξp—\~ΎU·gΧ762εv<½“g(ΰΖG'](†) r™Uψ …η πΆͺΪ�₯†B`~c€€Ζ� kΤ ΧfβhM3¬Π€°‚ά υ0«ψ6RQ‘H·}˜χkψ¨,PMP½W9°ζCˆ„ƒ*€j=Η„GΥ 1z‘€ωg«W\y΅‹βYbsŒxf;Ό{KbΒh Ž"±ŒY r³E7γ+a₯Ι@Λ1’`<ˆdΤ¦.°fG…k°Fž·η»ΐ‹h΄γΤμΌ1O5ΕRwšhEL[‹²ΖBΓSLK`ΙϊώH :|Ζβ­/ω£[Ύ2<Μ΅‰€ˆ€œ4Τ88iή ˆˆ€_›7ί;όψ£ΫΧό‘ςM―}ν]__ν»ίύξ’ύG�ή΅sΧKŠΉΩ%©tr56rψΘ™)Ά*¦ΡxΌ ΆΔZfbΑΠ‘σΧ^τΎ—έpΓaΞΦTkεγΡ08Ύ$΄χS „ΨuΧ½δνΜώ�νπΠP[…Uτ)Š~σ°qO5ΐηΆyc ’5Vέm!Kqže…έ€ςf؟+˜’ΐΜ}nzfΖ+Ύ¬~[ڈγΤτ.'©€Ώϋh&‘ ˜‚ ˜Ι°Ÿu«ΦηΦ¬?ίmώΡ=fβb˜‹Άυ“βΐΈN“Αι©iVα[)”γ4-ζΌσ(‘.°¦F3G;Nž�&RI/φΤΖΜXΤ ltΒΔΦG¨[’ ίBΞoŸ›Ω§™ΪΒ=} jπ6»Nϋ>“.‚σ l?ΦP0―ƒ©$Άk˜Ο€}P%ψθ !₯n 0έΣλΊϊ $ͺΉρ±—›tET–jPmv‚Jΐ岟ΛΞς_ΒδθTO©d Θ,Š5Κ~mt$†Η„ d\5D‚―…ƒŒMπΒ MƒΆD’Τ†>O�*ΆΧhδb‰δθ9λΦίtυΛnΨΒή­RΧΟ(h“Œ€'ْӁA Ω<}κP6֟θ―S°κoΝγς³³ΏG˜†π<`–Nb£ LO-�²DκJ₯’GI0νβ¨P1ΤZ“αr[{ΌM&λ/Ί2±κœ ?ΊΥέύ΅»œ/̈~~iβΌˆIΞΗ”Φ$‰F|€‘Π”HΆq.Δ0Β΄½½“λ°ωzΘOS©φ‡ΞXΊtϊ+EιP»ςΕΧ?ΝyώLvqϊέθΊb8Ψj‘6Σœ€Ο7l²ΰŸ—o:Ν‘θςO“Δs67ήuο]<΅ια…•Jse6?w.i°=έΪW-WΧιliiΙΥλΥΡΞΞ�±–hό{‘Xδ0шimM�6€q"§ωyς�0© >Œ‹(".Τy¦iΖΜο ‰Q€υ|Ν^Œ ψ™ΝO4†όω]ιžPk°;nΦ‚΅Υ―ΪύμŽή½FP6°<Ž’fHφτ8L:=εB3AOmΐ8A‘UχL–δ6b` k~PΗσ΅–^HcΐSI ͺ yΐ ,ρ{M³05;δ5Φd°ζ‚₯@˜―Vξ¦`°Νš!ó4  V±Χ­q‘h%%&e†y—  π§\wGzΌsي zŸYΈ°{¦V¬UϊΟXΤ\°pΙί΄₯:.ΝΧςριK8D·Ogf,ΪqΈ”mΖ‚ώ`ʚ1΅*Q―ρvŒWQnؘž^œ«kV—.;3ΣΦΦΉΩ oZ8°θώ‹―|ΩNͺΖϋϋ‚7Ωυkxα ¨qπΒ3ΥE@D@D@^ —&_Ÿ~ξγ‰fsΣΧp8πΉπ=w~Ή'ώl¨«ΏanυΕ«Η—,*vuU°CίrΛ»š““·-[Ά4Τ_ιί΅o�Ύ υj-2£A*m[ω…P) >¨ΤΊ\;Ÿ! z¦s*Ιdbg±Tθ pBπΥb+Ο\|Η›ozΧ§¬Δ?πh¨»kQ㉧Ά ύΜΣoˆΖŠΧ3POGSŽLΌ¬Y υV‰Œ ³*₯xob\˜gd!ŠΟ@œ‚Ύ„χ‚©ΜΑSp�ΦπL)θν_–P@C Fρ]e,γΟk™”šΦ1―ΫΜWΐΦ ±�š™’₯IΨώ捣Ό„¨1•Ωڜ V1ndcΕωgξ_|ΕYί8χό ώγ²?σγ�Ηuζ�ΗΟσ4mBO?ΎρΣυfΰ+~ΉδκΛƒ—lΈfK'Ζ-χύ°wfl2upΟ3―›ΛΜmH$’c흹ΆtG₯”)<]-•Θ„EΩК8ψ’oxfɊ χΓέΜ[΅‰€ˆ€œ‚4ͺp Ύi:e_O`Σ¦fπΘ‘Ϋ‡‰ŽΔυΧ_ΰζχΌγMΕrεζύ[ΫΣνΝ\.S›Λ0 οŽ ,| \Μ—«•R7ρŒ›ήφΆ7|cǎ‘PΌ>==ήΣ‘ŠW^ώͺ7m‘πύ9=…uΛΏιΆε±`kλ…―ωΣνoΕ ―›ϊtΝ‹TλxΠ$(#κgΥ―„ ‹κs’ώc 6Nΐρ1M΄&Ν Νd°Ž‚!e±@”|σ;°ψΡ:#Ά™ΟC΅Jδ€%Iπ:σ0υ„™=Ϊ�,‘BΤaρ k"΄ΰηPaΤ‘BŒjͺ£Υυ΄›ηŸ·ό›o}γ?Ός�W™‰¨ΉόΚΖωΩο‰όσ/*μλlΦΠqγΝfbbηγ½­έΣ­ΜvΨΉ�‡Μ€?n½υ_k―Ρ&" "pκPγΰΤ{ΟtΖ" " " Ώ%fσ±Π'?s�E₯b>940Τ(Uͺω§žz’Ι’%O½ν΅—έΩΎ)1+ΕΏά πΒΉ€φN":“έΣ‘L.›)Ϋί�}μ_w=³χ² c%VωK4¦¦-Ι‘F4# 33sήƒωψύaΌJσc4LφοωΪό[Ow§ηΙ`¦.ΰ\‰˜HK’ˆγ±€Q‹yΖh"ψ‚^SYφΛ8ͺ‚&�Š BΠd0eBΕ­YuΆ[±x°τ’—½θεW]χί~ΰδ·όγ±Η e³ΩζUW]υ œ~ΛέθΫE@D@N!jœBo–NUD@D@Dΰδ#πΜ3?Ižyζ%ΔμτϋΫ;οΉη»―žšœ|g!SθjΒnv6OΓ€XHŠώ9K| UΑ< ,rvΚΨ22Ώ`ΚS8 όjπΓH‹η—`γ fX"΅ΐb-1Αϊ 6βΗδΠ|*…Š« [3Qr±–€ ψήFέυυΆΉΞΞ4©]�§§sjp¨ϋžσυŸ;Οwž©΄‰€ˆ€ˆΐ―% ƒ_‹G�(" " " Ώžΐςε—fξ;φ"ε�Η›oώ‹ζёяΤΎ ₯4QφJ¦b�ƒql6G”βΌBΐFLeΠτ3² Ϋ'4 P |¨0’ΰC9`~ ¦6°¦A•ρΟx‘€"Ν‚Κƒ:‚‰X2ζΕKΪ(ƒETVρDθκoq©Ά€μνs1Ζ-^όυΏdΓ''Η]ηΦyγ?wξϊTD@D@ž—€Ο‹E_�:7¦Ÿ}vχ+}τ‘·f2… 3™9’H5ΐ ΡΌ LeΛεH'({¦?SX²B6StA?Ν” šATd8•ΡSTP X\#κ³I0υACΖ‰ώ@ƒtˆ—nm₯QpρdΠυχχYΚC±«³χK/Ϊ°αC6\ψΏ~ez₯ˆ€ˆΐιH@ƒΣρ]Χ5‹€ˆ€ˆ€wf"xΫm·­Ω΅kΧΏ0а˜xΖ�L6γ2Œ+˜‡ΰδδ$AUFόŒ΄ΰOPσ<ŠΕΌλμθ@m@‚&‰u’ͺ₯š«εMIb!δςΉi 4Wh4«�%rΙΦζ‹eυ…ά’‘a7tF?© E>*O,9sωΗί}σM}Ύ�ŸWGw:€ˆ€ˆΐ5ώ0ήG]…ˆ€ˆ€ˆΐIH€ζAΰή{οΞd2‰οΎ₯PΘ½>@aŸΟέά쬝gΤ βy΄Δ'Ny 8ΰ|€#Dγm4Z\ƒ* ψ!”Κ%W6―Kg¨•\w[ά₯’—ŒΗ]2ΡBBCΘu§Ϊ&B±π#η^²ώ}―ό£�ώ4£M8 ˆ€œ Τ88ή%£ˆ€ˆ€ˆΐ)OΰΞϋδ�­?~ψ_ƒΎΐϊΙρIW'.q*WΓΘ°BB‰ Œ-ΨψAωƒ\>οf³s.‹ΈΆφv‹Ά8„^jB™¦:ψ0FGHY(d]_wΪ /κwΕ\Ζω"α'Ϊ»:ΎzΦβeχ^tΞε­^=sΚΓΣˆ€ˆ€œPjœPό:Έˆ€ˆ€ˆΐιBΐFώνΞX1rτΨΊFΣ·`βΨψ†ΩΩΒΕΥZ5 <B[:ρaΘMΟΞΈ©ΉYW�–EhΊp(N2BΏ§6ΘεsžQbοƒd*!b‘ΧΖ{»Ϊ‡ώο\vωε_Έφε~…βO—›KΧ)" Η™€Η°v/" " " ΏL€&‚ΫΆwά{Ο·/έ{`ΟuΕlφΤq>Z’ΡX Ž|i&3{΄^―E»Ί:Ώ1՚>7Žo'UαΩΩιλ"±Ψ`{OΟL[ͺν3=έ]w-ZtΖ‘—ΎτΥs4 *Ώ|<ύ]D@D@~jό.ττZψ4}‡›G’·θϋϋcωl~ ›/όιoόκ²Ύu³ΆλϋοwnϋφΏY=2:zεͺsV=τ’Χύρφo|ςφ₯Σs“+:ΣέGoΊι ω| ‹ΏΣiθΕ" " " " " " " §3TόΥ3mϊL₯π«_ΧWD@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@D@Dΰd$ ƒ“ρ]Ρ9‰€ˆ€ˆ€ˆ€ˆ€ˆΐiNΐ�h@`MŒ_›§9Žzωš•;‘ψupη#π\³@ ƒηƒ£―‰€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆ€ˆΐ)J Ωlϊμγ=ύΣκ΄ύ§ΥΥκbE@D@D@D@D@D@NΦ4PMz²Ό:γJ ΩlϊŽλ΄s8‘šΝ¦ΟBΟ@8© ό_  «'ξeIEND�B`‚pydantic-httpx2-9b7ee8e/docs/img/gh-actions-fail-check.png000066400000000000000000007433041521723372100235360ustar00rootroot00000000000000‰PNG  IHDR ˆυ8gŸ HiCCPICC ProfileH‰•WTSΙž[RIhH ½‰"H—B‹ U°’@B‰!!ˆΨ•e\»ˆ€Ί’«"Š��€¬um,‚½?,¨(λbΑ†Κ›ΠΥσή;ο?gζ~ωηŸο/™ΉwjžTšƒκ+Ι—Ε…³&¦€²HΐΈ&/—²cc£”Αη?εΝUh ε’‹’λϋρ�*z‘œ qΊ@ΞΟ…ψ7πbΎT–Ρκ­gδK•x2Δ2 ΔR%ΞTγb%NWγ •MBβ]i<ž,ν&¨gπ3!φuˆ]%±2Δ|OqΔ#rs§+1΄ι_ρdώƒ3}ˆ“ΗΛΒκ\TBΛ₯9Ό™�g9ώ·δζ(}ΨΑFΙ"β”9ΓΊ]Ϟ©Δ4ˆ{$ιΡ1λCόN,PΩCŒREŠˆD΅=jΚ—s`ΝbW/$bSˆΓ$9ΡQ}z†8Œ 1\!h‘8Ÿ› ™»X(ΧpVΛ¦ΗΕ β ‡­™[Ο“©ό*νO*²Ωώλ"!w�u‘(!Y3F-'EC¬ 1Sž©ΆΑlŠDœθA™"NΏ ΔΎBIx°š›š! ‹ΣΨΛrεƒωb‹Ebn΄Wζ‹"4<»ψα ‘“pcšx‘μ›|X`<θ„Β49§3nY=π`άςCnœ‰›| τΔΖ‘o¨εh"Wf�-χ?rψͺκ;Š+₯ £QΎ©ν€ν1Δ’¬ιΧRǚ>TWΞΠΘ·ώ9_UZŸ‘ίZb‹±ύΨiμ8v;„5vkΒZ±ΓJ<΄ŠͺVΡ ·8U<ِGό?žΖ§²’rΧ:Χn׏κ±|a‘ςύ8Σ₯3eβLQ>‹ ίόBWΒ9‚εζκζ €ς;’~M½bͺΎσά]ή1|J‘2σ‹Žg ΐΑG0ή|ΡYΏ„Ϋc‡Ϋω YZ‡+; Έ£Œ9°07ΰ ό@γ@ H)`*¬²�g˜fƒ ”`-¨›ΐ°μϋ@#8Žƒ?ΐyΠ�€[pυtg Όύ‚:Β@Œ ΔqFάo$ E’8$IC2 ’@f#‹2dR‰lFj‘_‘ƒΘqδ,�ά@ξ!έΘKδŠ‘4Τ5CνΠQ¨7ΚF#Ρt š‰ζ‘Eh1Ί ­@kΠ]hz=^A;Ρgh0-Œ‰Yb.˜7ΖΑb°T,“as±R¬«Ακ±fψ?_Β:±μ=NΔ8 w+8OΔωx>_ŠWβ;πό$~ Ώ‡χ⟠t‚)Α™ΰKΰ&2 3%„rΒ6ΒΒ)Έ›ΊoˆD"“hOτ‚»1…˜EœE\Jά@άC φ‘H$c’3ɟCβ‘ςI%€υ€]€£€‹€.�;²Ω‚μF#§’%δ…δrςNςςEςcr?E—bKρ₯ΔP”™”ε”­”fΚJ₯ŸͺG΅§ϊS¨YΤΤ j=υυ6υ•–––•–Φ-±Φ|­ ­½Zg΄ξi½§ιӜhΪdš‚ΆŒΆvŒvƒφŠN§ΫΡƒθ©τ|ϊ2z-ύύ.ύ6C{€6W[ =O»J»Aϋ’φsŠŽ­[gͺN‘NΉΞ~ :=Ί];]Ž.Ow�n•ξAέkΊ}z ½Ρz1zΉzKυvκΥ{’O�·ΣΥθλoΡ?‘�€1¬Ÿ±ˆ±•qŠΡe@4°7ΰd”μ6h3θ5Τ7c˜dXhXexΨ°“‰1ν˜\fs9sσ*σΓ0³aμaΒaK†Υ»8μ­Ρp£ #‘Q©Ρ£+FŒYΖ‘ΖΩΖ+ο˜ΰ&N&Lf˜l49e�3ά`Έίpώπ�αϋ†ί4EMLγLg™n1m5ν337 7“š­7;aΦcΞ42Ο2_c~ΔΌΫ‚a`!ΆXcqΤβ)ːΕfε°*X'Y½–¦–– ΛΝ–m–ύVφV‰V ­φXέ±¦Z{[gX―±n±ξ΅±°o3Ϋ¦Ξζ¦-ΕΦΫVd»Ξφ΄ν[;{»d»ννžΨΩsν‹μλμo;Πςj.;½³78Ά;‘NN"§*§ Ξ¨³§³ΨyƒsΗΒŸ’5#�ΉΠ\Ψ..u.χF2GF\8²qδσQ6£RG­uzΤgWΧΧ­�·Fλ7zαθζΡ/ݜάψnUn—έιξaξσά›ά_Œq#³qΜu†Ηx=Z<>yzyΚ<λ=»½lΌ�Όͺ½�yxΗz/υ>γCπ φ™ηsΘη½―§oΎο>ίΏύ\ό²ύvϊ=k?V8vλΨώVώ<�Νώ¬€΄€Ÿ:-y5χƒ¬ƒAΫ‚³ΩYμ]μηΑ�Α²ΰΑo9Ύœ9œc!XHxHiH[¨~hbheθέ0«°Μ°Ί°ήpπYαΗ"‘+#�qΝΈ|n-·wœΧΈ9γNF�"γ#+#οG9EΙ’šΗ£γǍ_=ώv΄m΄$Ί1ΔpcVΗά‰΅Ν‹ύ}qBμ„ͺ βFΗ͎;ψŸΏ3ώMBpΒς„[‰‰ŠΔ–$€ΙI΅Io“C’W%wN5qΞΔσ)&)┦TRjRκΆΤΎI‘“ΦNκšμ1ΉdςΥ)φS §œj25gκαi:ΣxΣφ§�’Σv¦}δΕπjx}ιάτκτ^>‡ΏŽ�L$X#θϊ W gψg¬Κx’ιŸΉ:³[(*υˆ9βJρ‹¬ˆ¬MYo³c²·gδ$ημΙ%η¦ε”θK²%'§›O/œή!u––H;σ|σΦζυΚ"eΫδˆ|ŠΌ)ίΨ[Šχ  ͺ ήΝHš±ΏP―PRΨ:Σiζ’™‹ΒŠ~™…ΟβΟj™m9{Αμ{sΨs6ΟEζ¦Οm™g=―x^Χόπω;Pd/ψs‘λΒU _/J^Τ\lV<ΏψΑα?Τ•h—ΘJ�ύθχγ¦ΕψbρβΆ%ξKΦ/ω\*(=WζZV^φq)鹟F�TρΣΐ²ŒemΛ=—o\A\!YqueΰΚ«τV­z°zόκ†5¬5₯k^―Άφlω˜ςMλ¨λλ:+’*šΦΫ¬_±ώc₯¨ςJUp՞jΣκ%Υo76\ά΄±~“Ω¦²M~�|}sψ憻šς-Δ-[mMΪzϊο_j·™l+Ϋφi»d{玸'k½jkwšξ\^‡Φ)κΊwMήΥΎ;dwS½Kύζ=Μ=e{Α^Εή§Ώ¦ύzu_δΎ–ύήϋλ³ύ­ϊγ@i�0³‘·QΤΨΩ”�ΤqpάΑ–fΏζΏό}ϋ!ΛCU‡ /?B=R|dΰhΡΡΎc�c=Η3?h™ΦrλΔΔ—ON8Ωv*ςΤ™?Βώ8qš}ϊθ�3‡Ξϊž=xΞϋ\γyΟσ ­­ώτψσ@›g[Γ― Mν>νΝc;Ž\ ΌxόRΘ₯?.s/ŸΏ}₯γjβΥλΧ&_λΌ.ΈώδF΍7 nφߚ›p»τŽξς»¦wkώεψ―=ž‡ο…άk½�Φώƒgε?v?’?*lρΈφ‰Ϋ“CέaένO'=νz&}ΦίSς—ή_ΥΟž�φwΠί­½{»^Θ^ Ό\ϊΚψΥφΧc^·τΕφέ}“ϋ¦�mι;γw;ή{Ώ?ύ!ωΓγώI+>9~jώωωφ@ξΐ€”'㩎lhF/·@Og‡v¨“Τχ<• κ»© �„ΥwA•x°=€ΔωDΑ3ΚFΨl!¦Α§ς¨žPwχ‘¦y†»›š‹o<„w―Μ 5πI60ΠΏa`ΰΣVμ Žε©ο—J!Β»ΑώJΤΦJίΚΏ(Σ~a,™γ§ pHYs%%IR$πŸiTXtXML:com.adobe.xmp 2582 1160 BΒ-€iDOTD(DDχm›C±@IDATxμέ|UΧΗρ#Ezο½wQͺJ/*<‚H³+‚ˆΨ°+v, *¬XAA)‚‚�Aͺ"Mzo�{Ρηžf˜έμ&›dΩΝ゚7;εΝ™ο„Η$ϋίs/ϊΟ4‘!€ € pžΚU�~žΟΘι@@@@@@@BΈˆ`a(LτA@·ΑΒp‹2 € € € € € € ‚…αqd@@ ,L έ@@@@@@@σ$@°π� @ˆz‚…Q�ˆΉA@@@@@@ˆP‚…ϊΰΈl@@ �Fϊδϊ@@@@@@@ ZFλ“εΎ@@.@°0…? .@@@@@@R­ΑΒTϋθΉq@@ΰΒ ,Ό°ώœ@@@@@@&@°0˜ Ϋ@@’U€`a²ς28 € € € € € € h‚…‰¦γ@@@€,LŠΗ"€ € € € € € €Ι'@°0ωl@@ ‚…qΰ° @@@@@@Έ€ / >§F@R³ΑΒΤότΉw@@@@@@HΙ SςΣαΪ@@( XΕ—[C@@@@@@ˆ Xя‹G@"W€`aδ>;�@@@@@@’[€`at?_ξ@H± Sμ£αΒ@@@@@@@ • ,Lείά> € p‘^(yΞ‹ € € € € € €Δ-@°0nφ"€ €$“ΑΒd‚eX@@@@@@@ ‰ “Θα € €‰ X˜87ŽB@@@@@@’[€`ar 3> € €@@‚…Y؈ € € € € € €\p‚…όp € €@κ X˜:Ÿ;w € € € € € €)_€`aΚF\! € • £ς±rS € € € € € € Q,\Ίl…L›1Gώ^»!ΞΗS�LIi\ΏžT―Z)Ξ~μD@H‚…ΙγΚ¨ € € € € € € €@R’*X¨‘Β}‘ “»oλLΈ0AbtF@Β#@°0<Ž©}”J+HK«ΛΜΩsdΣ¦Ν)ž#S¦LR¬h{«�^“β―7±X�Κ+$_ΎΌφπ3gΞΘΨΖ'v(ŽC@@@ Ε \tΡE’9sfɚ5‹€O—.Ε_/ˆ €€#pκτi9|ψˆ=zTώϋο?gsΨ^uΔ‹δ?σζΥ~Ή(lc_ЁŒΥζVτžμ«ΉΛ@-΅ί ΆE–@T _8TΆlΫ‘ 'PΆtIy°η :†Ξ € €Iˆ†`α•υκJΖL…±mΫvY±rU’ŽM‰΅nu΅”.YR *(Ήrζ”C‡ΛΦmΫdέΊ ςㄉΙrΙU«T–ύ_΅c�ϋοΏrΫ]έeǎΙr�p Ϊ³G7ω_›λμpέ{ή'λ7lŒwθ¦M™7&²νwςΔ σ½΄Z6lŒ¬ ƒ„yΗ―?O”"… »£6iΡZ6oΩκ�GλΒuΧ΄²AΧβŊIΑ‚δψργζΎ·ΘFzύς«odΗΞ]IΎυ,ζͺ �’Υ/‘ͺUͺHφμΩμχύ¦Ν›eΪ―ΣeΖ¬ΩI> € € €„.6mΙ›7/ΒΠΙθ‰ Nž:%�όσœ9σoΨ�Ξ Υi΄0Ί››.τΉΝΤ~�>¬D¬@T ονΣΧ}^|R2y“χΨ±γ�η™~nί!^p—Y@@8?Ρ,œa Ÿ|φ…ΌώΖ›>Ϋ²’ηόΦΙ™#GΠΓζ/X(Ο>�’¬Y».hv € € €„O@�&’αβτᐑ@Έ@'Nœύ{> p’6X_XΠBŒ――ƒΕ+ € €@ψ^Έ`a“F ερGΆsόΔIςφΰ‘‰z°Χ·½Nξιή-€cu …7ήdƒo!B'ω­7^nθŒ™�αζ;ΊΙž=�ΈG>Ψ»—΄jΩΒ�χ{΅Ώό:}†»οB,δΝ›GF}2�žzφœyςά‹/Η{ :ƒνέ·Oz?ΠGζύΎΐΩΆΧwή~C�nήΜ―― °}a*ρω·Τ,Ό΄z5ωόγεβ‹/φgΈώώ‡ΛkάΧΖ›Ίt’'{D�§J­»vI›veοή½q Ι>@@@$ θτΗΉsεLβ(Ž €@ΚΨ»oΏ9ε\W‚R€`‘Ρ'Xx!Ώ97 €€Vhvν|£\œ>v˜¨y³¦f œ<φΡώΉμ/YfώίΏιΤ¨SύΝσyYΧi‹Έο^{�ΙS~–&π—Π¦χχιΘχ%mΪ΄φΠcǎΙğ¦Θτ³dΧξ]’ΟLΤΈQiΩ’ΉdΜ3]τ)3•Bχž½ΓZ=P«�•,Q\–―Xι*Τ‹zΒ„'›₯Άώί {ΕD;pΎ΄ms­άΫγn{„uΕ`Γ$&X¨cι4ԍš΅ 6l’·:H4˜κ΄g_xYF}ω΅³κΎ¦¦`αΜ_§Hόωέ{Χ…3gΞΘίkΦJ&σ½_Β|z›NΫ}C§›D�·!ΤV­jσυ¨Xݏ=f�ΘηόÒ₯H‡Ξ7{7±Œ € € fͺ†”α@.Έΐ‰“§dχξέIΊŽ�δ?3ωq΄O˜Hο][jΎ�Τz#"+ΑBσ Fώ72w€ €‘' ΑΒ`κ/<ϋ΄θ”₯Ϊ†Ό;\Ζώ0>XΧ ²=ΑB‚X§"Φ¦Sπ>ϊΔ3&ά·"ΦύTΏ€šΌτ|_ɐ!ƒέχρ§ŸΙη_Δ’Ε:0 RZ°πΕηž‘:΅k‰VoμΨεΩΰ@Όw(XxσνέδψρcφΨόθyευ7|Ά%u…`‘―`σfMdθ sS;•9Ώσ½[-πΖΪ‰>ϋ4i�Έk•ΠwΜ�6„ΪFΌ;X7lΰv?iBΊΟ<ϋ‚Œω>f:φ’%JΘkύ^Λj\κφΡ…ζ­ΪΘ†}Ά±‚ € € >B… JZΟο{α™‘@Έ0gΜ£·oί‘€“λίIu¦‘ΤΨl¬0•ίκ|ςΡϋέN°Π<[‚…Ρϋ Ν!€ €@Κ Xθϋl*›pXωre₯dΙβ6¨·vνzY±j•l2• γkb,]ͺ€,P@΄* NƒΊμ―±‚~zŽ"E I­Λ/“FgCJ«V�-γ~Œ >ξ3S,XΈ(ΎΣΩύΟ<ω˜ΤΏκJ»<{Ξ\3­oΏ Η=όΐ}r΅©\¨νχ ε©ΎΟ»}5˜₯mΛ–­²bε*w»w‘h‘"R©R»iζ¬9’՝֠ώ•6΄xπΐAwκί+λΥ•ΜY2Kϋ�΅•�₯KΩ�ΏLύU-Yb—Χ˜Jrλ7lt†p_sζΘ!ΥͺU•²eJKžάΉLeΕm²vέ:kι=§{@ƎώR2eΚ,λΦoχφιθ@ΑΒ@�v²˜©—~š0Φ§rž=ΫΆοdΟΣϋή{$Ožάξ9™φ«­.ιn8» γ<ΪηAw³VΧ{ώ₯W€Ϋ·™κ{™€ύυm₯pαBξ~�yα’Εv}ζμ9²hqŒq Š…GLu½«›7•Ϊ΅.—Š*ˆ~Ώ­Y»VΎύ]ΌΥϋτ{·YΣFR�lY)SΊ€ω£TYo΅*ΰo3fΊηu/μμΒσ}Ÿr7ύc¦ΦJ‘ZύO«ijΘ³ ©4θ<ηwήα†έƒβYΠΠlΗνέ^cΗύ(}?wNgΗ ύέiΉu›Vχμύ`gwœ―Κ—“ΎϋΖηqz¬Žαmϊ½2~μhσ=–Ιέ¬Οξ³Q_Ίλ, € € €„W h‘ΒαΡQΐdVlK₯Ή•膉п™&©ι�H₯��²‘JΕKΝχŸJο=I�fRπΑ ΝΓ!X˜‚ΏCSΐ₯Mœ4Yήϋπ#)jή¨»ΏWOσFfΜ›Σ)ΰ�Έ@"Z P8*’oΘsρ ©X¨‘ΉgžzLJ•,ιαάβΟΏL“Χί8Wνά‘K«W“{οι.%ŠϋN΅κτYa¦~₯�²cΗN»ιΝ―J•Κ•έ±^uzƒ�·ήk{  ή`αΜY³ε…—_ ΤΝnΣΐ^Ήreμςφν;έ©υϊ_εe»]§m}τ‰§ŽΡγέ�ΪΨ}ο}π‘ ’qϋMžS±ν€ vθ|“έώΣψ±>!,·σΩ…_›.ύ^ΰ³ωζ�₯KΗ’6]:ŸνΊ²Χ�^γ­ α΅XΨPΣ„9ϋ½ψœέ3ΪT³ώώ‡zΕήj°PΌε¦.’ΟΕi†ΌδςΊvUM4|κ΄ζ™έΡνgΥ}νl τϋΧiZ²φ eΙ‚9Ξ¦ ―_|υτ}ώ%»ί?XΨ­G/ι�ΪΛ’ί ώντιΣ¦²ηˆ όϊ}ό―ϋψργqώ›Ω³η©Χ ¦Š¦Ο@I\™:y‚ω¦ˆ;JΏWϋΛΘO>sΧγZπ7Π履!Z]ς*c£ ušεΥ―1ίWΛbU*klφ!€ € €$M€`a�ό8:ρ oΗ‘ ΏΑΒψθ@jˆΪ`α€Ÿ4oΠ~“υΨ±γ�η™sS΅₯€`‘Ύi§oή%Ά½ς�σrC»�%φπwάάyσεyσΖ™NW¬έxC;yθώϋ’%`8ξΗ ςπ£OψœzΕ ƒVKριΘ  €Δ)@°PDCZ±P›žΎϊζ[Y΅zύY£₯™:ψŠzu\Ï?ύΜTeϋΪ]ω…g₯VΝΛνϊΎ}ϋμtΖ‹/5Σ_l¦x­m§¬u:;Uώ ,`¦KΞo‚ZWΚuΧΆΆ»�0·ΟΎψ�.ο5SΣ†2υ²vφ†νΑζ˟Λώ’iΏNf7”©ƒ½c„³b‘N)9s&Ήυζ�n…ΖοΗύ :e³Ά 6Ιώμr‹fME+β9MοaŒ©&wΒTκΣgsS—Ž’={v»ϋ€9¦C盝� zύ`ψP)V¬¨>|XΪέΨ%δc,Τΰβ€Wc*@κ 4 Y±ZL`RΗωε§ρ>•ϊzτΊ?VuΎΕΏΟ–¬Y²ΈΧχΠ#Λγ'ΚΈ1_Ϋ)§K–(ξΪ<|δˆμΪ΅Ϋφ�vΜw’ίkΪό+ڍζ‹Vά·�€±-lΗsΆλ«ΕV-[ˆN!μmϊοδ―ε+L•Β�LHΆR¬P�N³ύυ·η*Zϊ u, 1jXχτι3¦Rh I›6­χ6tϊαGŸψlKȊώ΄eΛ–ΥN­­UΟu:c§ιTεW5Š™άΩΧλΔΎ³Σs;}΄2ηέwή!MLΤ�Ϊ΅Οτ³lεE΅¦!€ € €$―ΑΒδυeτΰ ƒΫ°’.@°0ι†Œ€@΄DU°°ίCeλφ z6eK—”{ή‘ c’³σέ{Ϊ7‚{Ž~/>+Ϊ·KμαI>nήόίεΦ;ΟUBΡ7ΡξιZΥ�“xs ο�ΝΧ/Ύψb™0v΄”0ot†³9zT.―s•}SVΗΥκ-ZΕΕΫήτŽΉΞsSΩ}ριH©qiuo–@@ €@j^ίφ:σsR7+£a©^<+ΤΧ³G7ω_›λlŸ#&ΐΥε–;άΐήηŸ|(ωςζ΅ϋtϊYύ@†·έΧ³‡;E«ύή<ΤέέΊΥΥςΐ}χΪυΙS~ύΉ+1νΙΗϊH£† bͺSΣnΨΈI4,8wή<σΈ:_r  zβΡ‡₯q£˜κ{ύΎ%S~žκμr_½Ž:ξkΊϋt!oή<2bθ`ɚ5«έ>κΛ―δ#3έmBšŽ1κ“‘φΩsζΙs/Ύςα Žύ₯T�TΙ{νΊυ�ςΪs:ϊφΛΟ€ϊ%ΥάύߌώNž|ζ9w½Aύ+ENӟ…/­YΟY΅―Γ‡’&gMuΓ³/Ό,£Ύ<xu:ϋ υ{β΅oŠΨΣ€λGŒ2₯K9‡Ψ)»λ7iα��φσ$)\Έ»�Ό;οξiΒ·Ϋm%K”°α\o%@�ŠƒώΑB Bή�Π#ξο\ujΥ”χ†½γPτwq/ „…@Nοa―Y#=ΩΧ†p½ΫγZφ{Ξ™;_κΥ­Χ!’Σ>_ί‘“lή²5Ξ~μD@@HšΑΒ€ωqtβ&ގ#@ ~‚…ρсΤ"r°pψΘQςΗ_+δ’Α„½ϊ>Φ[rζˆ©π‘ ƒΡyι²2β£/tδύχά.ε˜{3+A'CηHκτwέ{φveΊw»SϊωlT@©―G}"9sζ΄ϋ}β)7€χΙ‡ο‰V ΤφΥ7£εƒ‘ΫεPΎ„+X¨ηΊσφ[₯έ�ژinΣ=υΦmΫdτ˜±ςㄉ>}.t°P§…Φι‘΅ί% ζν�AΚS§NIΤΤ鐽mΑΒE�ωζΫ½›XF@@³ΑΒ0ƒ2\Θ C¦’#$B€`a"Π8(9XΈίTvΊΏτιΣΩ)Τ΄ςΞ3Ο½δVΤΞΟ<ω˜¨Νωl Ο§6ηBˆ&Τ,Τ#δϟί>�ί6ώ6|Ό:M―VfΣζ ₯½ώΚK>A²u¦:έğ&Λ,3έ―†βjα κy2eΚd*+^+uΝ‡+Κ•+c¦r2τ―Φw‘ƒ…^‡υ6ΘA*7–)SZμέΛ’ξή³GΊšΚ‘ iΞ΄Υ:oΗ.·ΈΣ0‡2F €πτ�΅₯K—.ΰ0Z±�Ε5mνΟΝN ©-˜;Γη˜k�wƒ[π—I?JρβŜξhͺδΔ {›*'MvΗΦ…@‘9­¨•ύC‡{Νtίu�lδsΌ³2uςQ'§υyμIϋΓx»κ,τή―ΣΏCϋλ₯ί‹Ο9«Ά�fb§ΌΦŠ‘ί}3*VΘΟά,θtΫwυθεσlΌϋ½ΛŒtΏ†Bͺ―ύχ�λϊΏϋΏ"ΥͺVΡU·υ~°ωί…)ξ:  € € €α X^OF ]€`aθVτD„ ,LΈG ­! @{£ΗωV S¬hay΄χέqΎ‘μΨpnΏ·O_wΈ!^p—#mΑΏ:Η 7H««›Ηyϊ†άςε+ε―ε+D§ά�iΔ*Wͺ(Z™Ε™6/�tбΕK–Κϊ επαΓφψβŊI3°ΎΑεmZApοήdφœω>ΣΗ΅ΉΆ΅©ξr‹νš+g.)T¨ χ°€ΛϋZυψμ[8wfΐJ„?�2MξΉο·―�τmΣgΜ’ΣgNΫύyLECοΤoΞAκ€S8;­L©Rξ”Κϊ†­Ύ9�ίΏ�ΩέZ €BωrvY§–;qβΈΌσξŸiυž}ϊ S5&f*δ"…‹HŽ;�ωg―­v³lωrΩΆm»”-[Fͺ˜gSΕ<[ηΊxE@ ΪR{°pβί‰VcNHϋfτyμ!•*V7^ο0Δ§α·Ε‹—Θ„ISάΚmήσxuI™ Ω;¦wΉ�ωΜuλHέ:΅άj‹Ξώa#ή·Υ uύB »έy›thίΞΉ΄^υηCοτΒ‘4vτW6|ΉnύιqoΒͺy ΖwΞ“¦‚†λόƒ|zά‡ο½+υ―ΌΒbπΠa6°ͺΑ΄)ΗΉΫχνί/΅―ˆ™FΪέh,lwcŸJ9c�ψc‘OΠΡ κ³yταnφX#PϋΨL©|E½:ξ�wήξNύν,tΖw;›…¦MΙ°wήv7ιή‰ κ ξΣ ž™2f΄AMύ¨ζε—Ήγλ‚ώž’ΥκCiKΜ•Μ™3Ή]΅ςaϋŽ7Εϊ·­ΏGLϋy’δ:[αTx�Ï}~?sa@@@ , ΓΒΘ ‰ X˜4A†LEG’^ AΑB}νυA#dσ–ΨυΌR]t‘χ’Μ_°0ΰ±ϊψ·έ"<|.Π§α> ωΕΥτΝ>}Σ/Ύ¦AΖ­ΫΈέ²fΝ*‹ηΟrΧ½ ϊ=ωΚλδτι˜ϋΤ7^ο0Χζ4o`‘t©’ςΣψ±Ξ.χΥа›»v–ΎOΕLoη�†ͺNq¬Υ…΄U―YWŽ=ζŽhαρGr§ΝΣύϊ<Ύ5XF|02Pw;Νς€ΧϊΕ x0@ˆ0ο§#μ�γ½άž}Ϊ„κbͺK1!'§zšs`Ξ9δλ/>uVC~ύΡL';hΘ»n�ςεΚJχnwΪŽθΟΰΪoΣgΚΛ―Ύξ³+Ήƒ…ή“ιΤΊ7uξ$iΟVΦΣʌwίsŸνr‘ƒ…έŸ΄ŒηΓ:ή{q–ΫΆοpΚdgΏχ΅VΝΛδεž³›ΌΑPoŸΈ–,ΤPάO?+kΦ� 8¬N[ύZΏέ}K–ώiBt7Iχ»ξ­Žι΄oF'O>σœ³κΎ&6X蝞ΨΜ, κΤΞχυμαvυ�™έέaFΌ;X7<χΑ€‘*ύ^`»ψ ύοNΈƒ…ήks–υχ ύ=ΓΫZ]w}Πηδν7ιΗο₯LιRξ¦9sηΛ-wtsΧ½ ϊ!§›Ίtr7ιΏ�»zάλ�³€ € € ^‚…αυd΄Π†nEOHΈΑΒ„›qΡ* `‘"l2‘ΒΧί.:W°ΦΈ~]Ή‘mλ`»ΟλφΤ,|ͺοσςυ·cβuΦι…Ώ�φKŸpα¦M›₯U›vrςδΙxΧ7¬τ+mα ;vL.ΉΌ�ΟωυΝO}4‘ΝϋΖα…j±}§�²fΝΪxoγφ[n’'$ή~t@@ ’Ό�Žδϋtνρ υ˜ΎϋF2dΘ`:μ=Ωo*ΔΕΧV�^m§@υοW°`©S«¦ V‘*•+IήΌy|ΊψΪΞg°P/δΦ›»JΧΞν52Υτ�iΫή.{ƒ…όρ§τyό)»έ�Kο{ο‘k―ie7kΕF½§MžSeO§ώΥ€œ·=ρθΓ�ΈQLΥ½ώίς©2­ύnΉ©‹ΒZ·~ƒ|ωΥ7ήΓ.Ÿ8yB4ΨjλuOwisέ5Άϋ#ζώ–šϋLH ,όό‹―Lεμξ0ǎ—΅&HΈbεͺ‚jή xϊΑ—Λλ\%ο "‚tΪΝ·w“Ήσbίηω ϊ 5ΪΌUΰίΖ|=Κg ΰ^~U>ύό {+)%X¨³ςΟE>Ώ{y§lvά½ϊW™Τ©uŠγ@Ν?©ίo7tςύwθ8Ά!€ € €$N€`aβά8*ιΞ[υA>kœτ0€j‚…©ϊρsσψ$8X¨G;v‚L›1Χg g%§™φ΅ο£½Ν›€;›.θkj Ξ3On½σnσΪ5/·o0oΫΎC~šς³Ο> ―iˆΝi½zΔgΚ4­¦Σͺe )b¦QΦ †:e—·Νžώ‹VY+‚h#GψTρΣκ†Ήs岇4kΪXτMφPšN…¬S"{›Ncά±C;S€a¬7Λ½ύΌΛήΐBΈƒ…ϊNcΌwί>ŸΚ:MY–ΜYμe<ΦηAiΫζZ»όΪ€v*2ου©mόωD+Εhuo7ζkΡ)i €D«€χΏΣΡv‘ ?>TŠ+jo½οσ/ q%Φ₯Aύ+εφ[o6?ΓΕTίΊm›ά~ΧΉκoI fΚ”ΙTα{V�¦I# t�Ώj•Κ2°�«Ξͺ8�ΌΑ›6I·½ά>ή…~/>ηN%Ξ`a:|ά„΅­ώϋoιuΜ²χάI]vžσ‘C‡Μτ΅]<\ `aR�ν ΨίώŒο\LΏWϋ›jδšι{ΣΩM;vξ’ϊ›;»}^ύƒ…Z σ£O>χι£+Ώš)yο?]OhΕBNXƒNΣdσVΧ™κω[Mφ5wξά2cκOΆς·³γΆ;»Λ¬91Ώ―&w°Π�Τσ7iΡ:Φ5:Χε_QέG~ς™³;θλσ}Ÿ’.ntχkφκkΪΊλή…!ƒJ‹fMέMγ'N’~Μ]g@@@ Ό ΓλΙh‘ , ݊ž p‚… 7γ’U QΑΒ'NΚ ―2Α―ƒ±\ξΎ­³T―Z)Φφ ΅!±ΑΒ₯ΛV˜πδω{ν†8/½\™’�Έ~½dΏη‡Μ΄Ζ?˜ΰžΣ½9 ΦtΉ:-p£ζ­d» :νν7^}γΨi-_!�»‘“³jί€›7sšθtΓΪͺ\ZΛ§Zα΄)€h‘"n�7ή,ΓFΌο�ϋWœϊλo�½gowΏNΝΧηΑsλξŽxΖ|?N{ς™ ½4π¨Σ7iάPZΆh.ζ ΤΌoΊ†;XθœΟ[E·ιTΙzmή¦Δ†ΝZΊ›.ΎψbΡΰ wJ³ΟF})ΟΏτŠΫΗ�ΝTw  €D‰€χΏΣQrKξm„,τφωsΩ_ςπ£1• έAΞ.Τ«[Ϋ hŸψ“;―~@AΫαΓGdΖLίθvohN«Ϋ]w}έl›7XΧΉώώ―,ΤΠ—~ˆDΫΐ·Ι€Ι?ϋwsΧ;wμ`ƒŽΊαΈ©�Χ¦]LHJΞΤjlΞφŽ]ouοΟn4_τ羏>n~ήΛl7%6X8κΛ―bΰJ•,!Γ‡vN%>ρ”ύΐ‡»αμ‚V€¬[»Άd̘Aτ**ωω£λZIς“ί³»f͞γσ³^ ώΆ%G°PΏ74 θ΄“&zqϊτΞͺ|ςΩ(y±ίkξΊwΑ?X¨ΟύΎb2“,ΜbžχΒy3έο1½†‰“&‹~ΚΫ4tΪ‘ύυξ&­¬_·~Ω»w―έ–άΑŸƏύ=ΓicΗύ0h«•+οΏ―§ΣΝΎzΗΣϋ½ήTh׊£ϊ;Υ”Ÿ§Ί}+”/'cGεcρϊoŠώ[πΆ+λΥ•‘οο΄θ‘†½γ°Œ € € ΊΑΒΠ­ΒΡ3‡ω;‘Ά'Ž›Ώ1›Ν!cλY²d–tι�Ϋ‚"‡Χ°Ι2ΑΒdaeP8+@°op,Τƒ5x7β£/œqμλ%U*JχΫ»ψl»Π+‰ Ί·ψξ#Ή•ή7τZ υMαv7žσΏΊy3yην7b]Ίε<οΤZΥkΦυ©8ψΛ€₯xρb>cœ:uΪ]O—.­ΟWα κ ž{ρeωό‹―έs[Π7΄΅‚‡Vt¦tϊz 2X¨aL e:ν₯ηϋšκ‹νUχUίπ_Ήj΅»ώΧ�>oςΊ;X@@ Ό�Ž‚ΫρΉohpΘ»Γeμγ}φλΚe5.•W_~ΑέώΥ7£εƒ‘»λΊpsΧΞφ�ZylωŠ’•œϋΏϊ²³Yޝvτθ1Ρί½œ6κ“‘>SQzη]•50zM›φ’ΣHΣ@@@’G 9‚…Ω²e•Β… ې[¦LΝϋpiδΨΡ£fΦ°£’³R:”²oΙ#-v†΄+―¨g‡�Η| pφΩΩ ΒyΎVW·0ΓJ'�ώχ―ŒŸ0)œC‡},‚…a'e@πDC°°Xρ’R PΩΆu³lΫ²ΙswΡ·X€hq)T€˜μΨΎMΆlZ}7Θ]PD υͺ‡%ό΅�ή@S­οc½ME‘μτ†όOž˜`aΏ7†ΚVOΥ?�1­—-]RμyG ]aΩJ°ΠΏ:FΧΞcU5Τ‹™3wΎ 6Β½�gž|LnΉ)&θlΣN6kLΥΓZfJεΒfJδΈZ8ƒ…z}Snθ°χdΑΒEqΦξ+T¨ Lϊα{Ÿκ…ήΐΒ… j’qgίΥ‹ΥJ’yςΔ~#w؈d¦©f㴉?|'eΛ”vVyE@ ͺΌ�Žͺ37J°PοY§֟±œΆ~ΓYΉr΅­ŒWΆLwͺdέ�Χςες`ŸΗ�ςΝŸI޳?{Ÿ>}Κμ_!žΛž-»T«VΕ­r¨h5hoΥι²eΛΘΠAoΊciEC Μ-ϋkΉhΐ1”V�Κ+δΙΗρ©’Άyσ;ΞΎύϋ%{φlrI΅j>ΥάΜ>-?ύ¬,ύγOχ�Ԑ₯ΣtšΧ΅λΦ‰Vp«RΉ²{Ξώ„ oΌ‘άuΗmΞ‘rΰΐYΌd©ό6}¦;Unωreeπ[oΈ–Q ύΩsοή}Φ_χ;Υu ΗŸκ+‹/qnjkΑyΎZYΌ“©ΖΈίœ?‘-Ή‚…ϊ=ͺ•$ύΫƍ›€™™r8X‹«"ω_}#:­·Άp υ{ΰ·_~Šυ=μΪ4¬ΧΨLEμ„΅_r υωŒ6Υ;sεΜμ²nώή2ΰ͘ͺ‘πœ;cͺϋ=¨¬Y»NZ]w�£žg’©Žθ­,p`ΟF_ΟCC@@H>p u¦„*•*I‘B…|~Gτ^½~Πlϋφνς§ωΞΙ“'½»’~9w�\β χξΫk>Ό:7μχ¬PΥ‚&κόㄉa?œ, §&c!€€Ώ@€ P‘ήΧ)σώΙ�…σύo1ͺΦkΤ¬cώϋSΐpaT=Ϊq3I κTΘ/Ό6HN˜\Ϋ·i%MΔ|J$EάΩΩ‹HL°Π{Μ€Ÿ4•R2Ό₯cǎKŸgϊΉϋ† xΑ]χB(ΑΒΔΎq€o(κ‹Ϊ4ΘwG·{‚^ΎN9ά¬IcDΤJ9ώ-άΑBg|}spΖ¬9vΪΉΉσ~7SΠmuvωΌj@­θ4o`αB ΫΆοhͺ Ε„pk εUίπoή¬I(]ιƒ €@Δ x�;qΟ‡,ΤjxΟ>ύ€θT§q5 μιΌΑ΄š—_&Ο=σ€O…²@c¬0?ƒά�π£±v {ηm)]Ί”Οφέ»wKΧ[οτΩ׊V“λvηmquqχiΈξ‘ΓcύQV§#~η큒ή3―{YΠΠδΒEK€NνZvsB‚…κϋΑπ‘Άς‘wΜ_MΥ»~― p7ieΑ;oΏ5θ5hGύƒ²V”όϊΫ1ξqρ-Œσ΅ ‰f”uλΦK^χΗΧ=ΰώδ j˜σ«Ο?ŽuN�JΫώ4μχ³©j�Άώ-άΑB_¬―φ{AςηΛη:Ÿυ½ϋφΙΣΟΎΰ3…°vHξ`‘ž£N­šςΑˆ‘±ͺ§λΎ@mτwcm@Υ»oΙ‚96Lλl›7�wΉιΆ˜j—Ξ6=Ού_‘ωσ;›‚Ύκ›ή rЎμ@@@H’@Έ‚…fkX�*S₯0KHΧsπΰAωmΖ̐ϊFK'‚…ΎO’`‘―k ^HzC…ͺ²cϋVSΕoCxRΨhΕJ”’ »W΅c‡©\Έ‘Κ…. IHR°PΟ­δΧ¨A}{Ψ‹ύ^“3gΕ9Δ]wά*5”|yσϊτΣ {ϊ³Ω—¦Š` ©Š΅š^—NMθ�¦Oε@dηΝΆR‘NS¨i0¬σ€QΓϊvΊVν³ΛόŒεf t¬w[eσIϊΫnι*—VΏΔ»Ω]Φ@ή\3E�N λbΨν`΄‚βC½{ΩWg»N―¬Υ Gω^²fΝ*½{Ε|ψε΅ε—©Ώ:έdτWŸΫλΧϋ½ωφnξvgA――Cϋ�Y#g:ζiΏώ&―Όώ†ΣΕΎκ5άwOwΆΜ!ƒ»O―_«9κϞ‘TΡvΤΨ‹g?πςυ·£εύc‡ψœΎq½,ίT�›δ>ί“Ζ₯JυšqςΎYΏύ+°ΧΌU›x§ΞΥ°γ·έb¦™na§SΦJϊ€ΟF})ΟΏτŠ=�SΕ―ZΥ*vY [΄npάEσfΊίΑξMΓŒΟ›B5lp•©ŸΓηώ<$³ηΞ3SXΏμS©Πι4oΦ―vͺ$]Χίoͺ\Puφλkέ:΅εΣ‘οΉ›fΟ™'·ήy·»Κ‚>'ς[§+Φ)“΅?ώ\&o b?ΜεΏ�‘ϋο³Υ5Σ§Og*k”>=)ΏNŸαίΝ†ί|γ5Έ tžmΫΆΛ ύ^υω7k6 € € €„M \ΑBύ»J±’EέλΪ`Ώύ ’σ!Sύ}X? š3ΗΉŠωZ„CgfH-`‘ο“&XθλΑ„W Rƒ…ώ»;ΆΛζλΒ‹“BG+V’΄ ž›t§ n&\˜BŸVd]V’ƒ…Zyd™&,€Š)βΝ‘ʚuμ₯”+SRnξΨNςδ>χCw kLHX0!}+Τm‘ &ƒ†ΌλΩ‘ύυR΅Jew=Ψ‚Ύ!­oΌνΤ©Σ’•\&Mž"σ_ ;vξςξv—ίxύismkwύ| ._±BΪΆοδ¬ΪWο€ήΐBΙ%dΚΔq>}uE§†ΎεŽsoBίά΅³τ}κqΫO§ρ«}ECχ­”σΩGο»λΊπΒΛ―Κ§ŸαnΣύNEg㠝nς™ςOΗΧOŸΕΧκ_u₯ωE²H|έ؏ €@D x�;‘7 )S&S½°¬©�wFΆlΩκS‘0ΎΣ-RD , GŽ1�MƒˆΑΖΠ?N§3¦={ώ Φ%ήνTԟ·Š.$gΞόk+ nί±Stj]ηΰρ ’χ_ͺdIσ₯‹μ΄ΜρυOθ~'”ίυ/^Μξv™ Ž›6mNθil�ϋzφλΞώœ¬?Λλ4Σ)©ιϘγǎφ©ζ¨Σi�οߟ­S�5λ΅θ΄Α₯K•ύ=TΏΟ½Σ§„kΥλΣί―΄gΑ䀩 ±aΓF’έ°qcœ—¨Ηζ3�ŽtJσPšVΤίχN›)Ζχ™Š+Μ4κρ#”qιƒ € € Ί@Έ‚…-[4wgRΠOΞ_°0ΰEΤ�yΉ0ΏojΣ©'ύ4%`ΏhάH°Πχ©,τυ` Β+‰ΑΒΤ*tž>αBG‚Χp $9XΞ‹Iޱ–.[!#>:ϊJθ9"©b‘V³ρNs§•rnΏε¦„ήrΐώZ5γ‡ρd°™ΎΞϋζ]ΣΖ eؐAξ1αŽϊςk™0i²;ζc}t«Έ= ώΥ'ύψ½”9;­Ÿ7° •nϏ]-Θ;e››ΑΒ'ž~VΎ5Υvœ6aάh)WΆ¬³Κ+ €©RΐϋίιT ΐMG΅ΐΘχ‡™ea9t萴οΨ5Eέ«V|Κό�pωe5|�λQS΅Lš5kσΤγ’Σ'�³woΌ3–ιXϊαΥμΩ²IƌEg"Π™4šΏqμΪ΅Ϋ�Tv]Ο•ΩΜ8 ~Ϋa‚‘ΪτwϊAT­ΈΏmϋφXΗκ½Δ\cvϋΑΗγǏ›Μ53€ν–γΗOΨ1Ό_‚ σεΛ+yσδO?p»ΧΔΩk>€—˜ΦΊεΥΆ0ˆήσ&"gΞvV…lΖH›ώύG?ΘΊ� ΗxwδΙ“[rεΜi§ΎV[ύ°―sΝϊΜ²™χ4�3�·uλ6οaξ²φɝ+·9>³Ήή4ξσΩa>δKCΒ!iΑBB…ηž:αΒs,…G κƒ…ΚτΙ—cdή‚%‰‹€`ακΏΧΘ5mΫ»χι?mš³C«�Lšς³όgͺ|hkΦ΄‰ βiE–ι3Ξο*U¬ U*Wr³―σζ�ξ3=^εJeμθ―ά>ώΑΒ+κΥ‘?αξeბΛ«ύΊ]―Ί’žθ³šNυΥ°YKŸ]KΜ±S„ιΖκ5λŠNΝζ4­Κ’DΌ­U›v²fΝZwSRƒ…?ςάyϋ­ξxΊ0ςγO₯ίkάmΧ·½N^ε%wέYΠO -^|φ{υ’‹δ¦.ά{qϊπŠ €@΄,Œ–'Ι}ψ θί?ωπ=»Y§ΑΦι°SBӊζΟχ}ΪT@ˆ=Uo Ÿ«SΒ5s  € € €€dδNύυW° vίJK“&&XΈ{χžXέ4ΠWύ’j6hηΏσίΟ؊χλΦ―χίeΧ‹),•*Tπ™αΐΫρ€ Ο-ύs™θ«·5iΤΠ†δ4·xΙΡ©Σ€97sΧκΏ�φ©Π_ΆL;k‡·3ή™3glEώε+V:›μ«°PgΈτ�κnΘ�ΫYƒŒK–ώafΥ8γέοr|ΑB ςΥΌμ2ɞ={ΐ±4ΌΉΠΌΟ,ͺΗΧ2U'³e $z9uꔝE�Bωr&™Χξς�^Ș1ƒyΆ—Ψ™6ώ;{πEžAŽ;*.ϋ+VˆΣΣ…E@ $H *ŒύHK”*#ωςtw0-²KΑB"RE°P]V―]/γšζN‹ͺU$ υžΪέΨΕώΐθܟ~j©�«/»α΄΅λΦ‹NΛλύφΣ‘οIέ:΅Ε?˜¨Ÿfš<~¬θTpΪτ—'ŸyΞ§ς^ΛΝdπ[o8§³?€wθ|³»�cΌρz?σI«†φ˜P¦�ύ{Νiέζ\@RΣpa§Ž7H½:uΜλ1?lϘ5[ϊ<φ”OE-�ω'ΊηoΫΎ£xρΠ°ε›^“J&©Ÿςymΐ@Ÿ0₯˜Π`α;ο—·uΟY¨PA`Μ΅Œώbw‘ φ–»οΊΓξΧ©ά~™ϊ«τμύ ;ŽZ-˜3έ|’,«»@’I€`a4=MξΕ+Π ώ•ςτΩŸŸί|{°Lšό³wχ[ξΩ£›<Ψ»W¬σkE€[ομ.‹œΈΔκΑ@@@$Ž`‘Ž{Mλ–n@N« j‘„†βtœre5°WήΎχ€λΑΪζ-[μ{zήύŊ΅D}_+�¦GΠB#ήλkbf8Λ’9‹=LΓ‹ώAo°°v­šR ώΈNaχmέΆΝηoή`αΏ�™β)ζ}K�σxέ²u« 9.υnŠw9�`‘VFΤP‘V`Œ«©ΛΒE‹eη�]>έ΄Κ`½Ί΅%}Ίτ>Ϋ½+ZρQ+:}ΌΑB}ί°aύ«l€S ,ΤνzώΉσζ»u H¨@€ ύC…»w퐍λΟ•Jθ}GKΝφ”,]–pa΄<Π |©&X˜η{ϋτu»GZ°Π?θάHΡ"E̐{}ͺχ龊ΚΛί}γt�i…u‡«UWώ0Ÿ@:yς€ΫWF}2�|²ζ2w›kΤΎ�]χ.ΤΏκJωpΔΉžwŸ�²μ¦ό<Υ³]Οg>₯£eέύ―Ewj¨PΓ…Nσ―θlλ5‘ΑŸLυΗ^χ?pHοtԟ|6*&wͺ‘@IDATV΅-Λ�Άrτώ¦ƒu»σ6yταsAΓ€'`# €,@°0‚—―€VΙΦOš―7ŸžO)-P°pεͺΥςϊ€7E?΄CC@@@„ „+XxE½Ί’'wnχδϊ7 Ζι ΞΉξΞ :qγ†υέ°V―ϋΫΜv¦Σ §OŸ^Κ™ΏUθτΖΪ4p0{Ξ\Ÿ±››Ξtκcm'Nž­Έoί~ϋώ•Ύ—Uͺd wμ΅λΦωφπ υx nή²ΥT6Œ™¦yη�vzc /j5C§ιΤΕZ=Q§>ΦJŒ8Μ’%& ¨}΄κ † ΅yƒ…vƒω²�ΐ~YΏ~£;~ΜY)_�œ[mQορ·3Μ4٧•vΖπΎΖ,tͺ2j 6nάΈΙNa¬λΉsη’R₯JΊαP΅Χ‚"ήV―n;e³³M«*nίΎCNŸ9m§E.]ͺT¬Π’7X¨UuΆ9mz~½ošϊΤιSφ{G�₯ΟYΫN3΅Ξ’FC+ ΑΒ@‘Β λΦΔ�O¬I€—ΪΓ…O=ώ¨™½΅‘}lcΎ'ƒ‡‹χž―c⽐ց`a€β xρIσhΜΡώ]υρ>Οτs7ΗBt;&bα‘G—ΖOtτζiuuswέ»πΥ7£εΩ^ŽTσφΡe­¬χέΧ_Ψԝ}kΦ¬•Ά7t Ϊsϊ8―τΎWξνq·³κΎ>ώT_ύέXwέYHΘ΄Θ'Ν/LLeEo΅Agœ`―ύ^|Ntz7oΣ°^³–ΧΩ_ΎΌΫ½Λύ^|ΦTb|ήέ”Π`α©S§₯iΛkμ�ξ gΌΣ"kUΒ§ϊ>οSρΡΏΏ³�•&›gJ…Gη^@ˆ4‚…‘φΔΈήH¨\©’©T^Kώωηџ·7nάl~ή^ι·Ευ#€ € € pΑΒ,ΤΩ«˜ή�α^SΕpΧξέ²ΝΡήP€š—_&… ΖL{xθπ!™1sv¬χ u†°\ΉrY/­Œ¨αBmzή¦MΩ`œ,Zdώ~°ΧξsΎh%D ―iΫ³gΜ1Uρœζ jΠmζ¬9>³§9ύΌαE-ˆ2w^μʌޱΌηρ ΟiA¦Ή½?—-3Σ*orNοk°`a™�₯D��’MC}σ_ ώΣPka”Ϊ΅kΊαΒ+Wɚ΅1U³tŸΞη΄U«WΫ™δœu}Ν–-«\Y―žΤmή`αe5.•"… λfΡ`η_ΛWΪe§ΐdαB…lΕIέxτθQͺœiχσHŒ@Jζ̝GΚ–«θޚV*$TθrΈ Β…kV―”ύϋώqϋDγ‚o»₯«Ο­ 2L yΧg›wε|γ=g€,, π€ϊ½1TΆšΜ�Κ–.)φΌ#!‡$¨―XoψΠAvzα`ƒlΪ΄Y~μI;-²%<ύε€G·;δ¦�έ)’½γθ' †Ό;BΎϋC¬_8΄ŸVμσΠύRγ�κήΓάeύ…ζΫ1ίΛȏ?3?¬ot·λ”p ­b‘€Χ=ζϋq2ΰΝA>Σ»ž]Πήγ}r§lφίΨ|ΪιΩη_’q?NπΩ₯ΑΚ^χt·Ž:M±ΣξΌύVΡ@ 6ΒψςΊW9»$X8rϞδcS‘πΛ―Ύ1ŸŽ:ΰφζΙΗδ–›ΊΈλΊ Υ`4`¨ŸBςo₯K•”^={Θ΅¦δ}|₯ζύe@H XiOŒλE@@@π „+X¨cj°μ²5άͺ‚ήσ8ΛZ pϋŽφƒ‚ZεΟۜPœn›5{ŽO5B§ŸNΗ«Fm:Φψ‰?9»β}ΥλkΤ ν§•u:d§yΓ€-_a«:ϋœWo00�j‚ZΉ°r₯˜°ˆVΤͺ…ΪΌΗkΈο—©Σl₯Cg|η΅ϊ%Υ€x±bvU«!κυ„ΪC½Ύ'œ+ψβ­6θ?E³wl­Ζ¨U΅iprΦμΉvYο§Lι�vΩίΞn<ϋΕ[•P7yƒ…ώcϜ3Ά,τŽΓ2 T”,Μ›―€κΧΉO‚…Ž„οk `αΊ5«dο?{|;FΩΪ’y3ΝΟU1Uš[ΣTγ歝ΥX―ηλ˜X'Ž€  <€₯ΛVȈΎ°'ψ¦ϋοΉ]Κ—)ΌCχθ?x­xη΄@ŸXrφy_υΈΝ›·ΘZσƒsŽμΩ₯hΡ"’ŸŠ %΄¦•ψv˜RΩΫΆm3%ďΫ)‘‹™γ3dΘΰ=EœΛz~­μ¨-sζLqφ ΆSο[?y£U6mή,GŽ•"E K‰βΕlYqύE"”¦GύdО={ε’KͺJNσΛSr4 D?qB�§K'ϊΙ¨`M}υΎ΄ΤyΑωΝ§ŒŠHŽΩƒug; €Q'@°0κ)7„ € € €€*p 8}―X±’vz[gjbgŸσͺU _ΈΠ­*˜1ciή΄©³[¦Οœε.ϋ/8ΑBέώΛ΄_mu;�>Ί�οEκΈ.Ξ ι�§“Μ™2I΅ͺUmΧ#GM°pZΰ`αtS)οΐΑ˜)½γ–(^\.©sΌ·Z’·O\Λή`a ©†cΛ–)m¦ Ž &κϋŠK�ψΣΩοk°`a³&έ)–gϝλΊϋθ½Ζγζ½Υ)ΏL΅]ΌΥ$W�Z%›δ‚΅k[·rίΗυ +”/g*F–sΣχ_7™i’wξΨΠΫνΘ ”,Τ[*QͺŒδΛS©WΧ ͺΒΉ(T¨FΧ�oΠΉ£#{)PHP?Π¨Y« 7vΎŽ z)xΑΒ GΓ…S§Ο‘5λ6ι³Y+6iPOͺW)ggv"€ €Έ ] @@@@"P 9‚…^†,Y2Kό€P‘’3gNwš]νγ ΧεΛg¦Ϊ­}nͺ]οq-ϝ?ίgJί‚ H©’%$[φl6PμΨΈ‚…S~ω%`%AoΥΎΝ&ηT" v�νήО· ?o€1\ΑΒkΜLci.JcOυΣ”ŸƒNG­aL 'jΣ@‡Sυ°aύ«$»)£mα’ΕΆθˆ] πΕ;]΄7X¨c7nΨΐ 8ώwφΨ‹Μ«3]Ά΄  Hͺ@$ υ ~�©9T¨"½ο½Gξ»·‡N|S!Ÿ―c|.*BVFΘƒβ2@@h XmO”ϋA@@@R—@r ½š:qκΥΝμWηfδrBj:ΣΧe—^κν�²sΌvΎ¬Ζ₯fv­Β!—˜`‘wŠβυ6Θ²Ώ–‡t.§Σ… zΓ‚z-?ŒŸΰ\RΐΧλ�97Ν’BlΤ°ΎdΛ3%£Všάa¦³֚6idͺCfΆ»½ΑBέ 3₯U­RΩΜ„V@�˜ ‘6 zΫAS-ςχ…‹‚V’τφe&)ΑB½ώ@αΒΤP•/Ψ³Kν‘BΗEƒ‚ν�ocWΗ|7N yΧΩτυ|τRθ‚…)τΑpY € €@΄ ,Œφ'Μύ!€ € € €Ρ-p>ƒ…*©!7 žιτΔΪV�½FV­^-ήΠέΏ�ž‘ΕKώ°ϋγϋ²sΧ.9sζŒψOœοχίeΧ�έξΊ.hΒ†υ―’,Y²ΈΫ½ΑB -¦KŸΞ& ΥΝ,tŽwΒ₯Ί>ΛT,άk*�@ΔDb°Pο35‡ &ζ;cB XŠ}@@Β.@°0μ€ ˆ € € € pΒ,,h¦΄­e‚kNΫ³g,\ΌDNž<ιl²―_|±­ψ—7Ow»†5Œ¨­b…ςR�lY»¬Σ/^²TΆοΨaם/ujΧ’όωςΩΥS§NΙ€ΙSμς₯Υ/‘bE‹Ϊε@Σθ–(^\4y‘–Η3-1ΑB=Ξ�ό /–έ»χθ.Ϋ²eΛ*W]q… >ši[·m“EΖBΫ… z«5κ΅lΪΌY–ώρ§.Ίν’jUEœ6wή|Ωmž₯Σ7l Y³f΅«κ\±r΅lΩΊΥ>η|¦₯ϊzC…ΪΡ,τNΗ¬. ΕΈœ}$vͺerΩiqMΩμτα&©ΑB½Ÿβ¦j_~OΥΎm[7ΛΆ-1Aϊ`χιΫ‹-.…Šsoc—™ zS* ΪE`!l ΓFΙ@ € €  X˜-ϊ"€ € € €€4p υž�Ί’žδΚ•Λ½= žν4ν44¨•ι΄Ϊ_όωέΐvά½g·Μχ»{Œ.x«κΊ†›)y3fΜh*ιε°―Ί]ΫίkΦΘΚU«ν²β4η4 ξΫΏ_Nœ8!φsͺπ9ϋ,Τ`]ΓWIš‹�Ψ‘tΪζ}ϋφΛργΗ%{φl’5KV7Ό¨ϋζΜ™ηVέ»ΑB½XoΥB]WƒΓ‡bBYQ–Μη* z«j_m š—]ζή_ΜVί―zώξρ ύΟΏ�ΐΩ»W+ώ'Ήsη2~ΩέcƒMgν{6Φ@ΰ‘,Τ»ς† O>%KΞ~³Q°§FΝ:¦ςmL(ŸPa<Πv  SΨαr@@Τ"@°0΅οςŽ;εχ ½›δŠzu%Oξά>ΫΌ+;Ν1LuEm‰ κ±Z±j•Κ>!Iέξίώ\ΆΜͺYχ]θ`‘VŒ¬Uσ2sΑτ:΅βγ|cλ_qRχiuJ­ιLY­Ϋœ¦‘ΒΕ‹—Jωςe%[Φlv³7X˜1cΉ�P3gΚlχ™Ό©m15$Ο�˜—γ'ŽΛœΉσέJ–ηφ°„„.ιΑB½ΣB…‹JΎe§©ή»sϋ–Πo>{*\ΜάkΩ½s‡lίέχ'β/™`aΔ?Bn@ˆL‚…‘ωάΈj@@@@p ΟςεΚJ©’%EClš†ΖΦ¬]'λΧo΄ΫnӐbK«‹N™μ`;tψ9v£lά{JH=�BωrR²D Sυ(­;ώ±cΗDƒˆΛώZ.­�nalόmϊ ·SqQΓq“~š+πθv<» /©ZUrδΜ!ιΣ₯ww�gΚ3ξΫΏOV¬XεV*tvΪj‡υ―”4i�Κ�έ»eή|ίjNΏ"… ™pe »Ί~Γ{έΞΎψ^›5i,™2e’Σ§OΛğ&μ�FE‹‘L3ΉΥυΊ?&[Άl“U«cͺ@<ΨlΤ€`αB…%§ΉχtΖω_sμ?{χΚ�]»δΘ‘£�€QCwJdo°PΗΣο ύΡpfΪ³ΣE;ΑB­Θ΅iΣfϋύ(Τμz؎ˆ†`a ϋb$\€`aΒΝ8@@  Γ€Θ € € € €L άΑBηFr˜i‹³šπ]:ΊK“6;zΜNi¬S#'€iˆM«ί4Sλ±ώƒ₯ΑΏ4i�ˆN‰|όψ‰`έΒ²=sζΜfαΜ&˜w<’ͺμiψ2k–,&ψ―5Ο'TΫψΠ�iέ��xΚ/Ώυϐ!ƒ ^d’…‡Μ”Μ„ γ“e?$D€`aB΄θ‹@t ,ŒξηΛέ!€ €)V Zƒ…3f4π;ždχB…‹˜’υ[“< p‘ ,d>mΏSώύχί u œ@@@dH�`a²^4ƒŸw­4ΨΌic{^S P.Z,;M…B�V‘|y[‘P·k¨s�δ)ώ]άuG› i €@Έ†[”ρˆ\‚…‘ϋμΈr@@ ’’)XX’d)iΩϊ3UJf;Š©ήΨ?ΡΟηž^χ›iQ2ΚΑδƒχ†Ήγάr۝’ΫLcs`�~ωΑw{r-”―PQZ_ΫΖ?κӏmH,”sεΜ•KŠ)oΧM›6Θ‘ƒ‡βνJ‡Δ^k(cΣ'α7vκ"EгŸΦ6dΠωΤΌχϋP§$ZώΧ²8oDƒ•«T•| ˜©ˆ�ɎΫeΥΚ²esμι‘βˆ € € €©F€`aͺyΤIΎΡζM›ΨΏχι@\³v­μέ»ΟV’ΤΚ‡%K–0S$r§WήΊm›,ZΌ$θy ₯a„A€`a( X%’Ϋ@@"M Z‚…ιΣ§—&˜ΞLβ4ϊdΠ›œΥ½f5ΣΣtλΡΣ£a¨·ήxέ=ώ�»ο‘lΩ³Λ‘Γ‡δύaCένΙ΅P₯j5iΡ²΅ώ‹Ο?•Ϋ·…tͺkΫόOΚ•―oί?–.‘_¦όoΏP:$φZC›> θΥϋAIo>―mς€ ςΧ²?>Hθyίύ’!CFw”χΜΏ™ΓζߎΣ©�ϋ_;)Uͺ΄ϋΗ{oŸ;vΘ—£>₯ς’…e@@@+@°o„PŠ+*—T«πoώc;vL¦Οœη5 ϊ«±Žα XNMΖB ²Fφσγκ@@ˆˆ–`aΝZu€~ΓFφ9μ6S˜hˆJ§MJλΨεf)`ͺ¦mάΈAƎωΦ*R‚…zύ… v―;ΨΒ’E eΪԟƒνNΠv‚… βJφ΍š4•jΥkΘΡΓ‡}ͺn&ϋ‰ΟžΰΪΆ&άZΞ7ά,XΨυζΫ$Ώωχ¦MΓΌϊΗϋ3§OKfS- νΩΐπρcΗeψ»ƒ žυε@@@ F€`!ί Πpa… ε%£ηƒήγυο;vξ”ε+VΚΡ£G½»b-,ŒEΒ£ΑΒ0b2.@°0Β — €Dͺ@΄ []{T¬XΩ>žx�Ύ}ΙφH"%Xxϋw‹NC»{χ.ωμγ‘Ιζα˜`‘W#u/5S0ίΠ±³­pΪTuͺ‰ ΦΈ¬¦hRΫΙ“'εϋ1ίΘΦ-[μzΪ4iεΖΞ]€`‘˜μŸ,•Ÿ'O²ϋψ‚ € € €€ ,δϋ 1EŠ–lY³Ϊ©‘uζ 1AΒ={φΘ‘C‡C’`aHLtBD ,L$‡!… £π‘rK € €@$DK°°MΫvR¦\9[Ιμνύγ€Χ)Wσ((ǏKT1Τ`‘’ς,(;wlOP…΅όω ȁƒϋεΔρφ>Φλήσ>ɜ9³lΪ°AFϋUœ&‰έ™Ψk½ΨLΟ«ΗξΩ³Ϋ<‡γ‰=}ΌΗi-±ΟΩp;GΞ²cΫv9σο�έAΧυBΎΪ5:rδˆω�Πώ˜ν|BΦΣ₯K/yσεKτ΅ϊŸΛωώΣ?Μ�i¦ΫΎτ²Λm—@ΑΒΫοθ&9sηΆΐ�ζ«Qn¨Π;¦;ήι32dΠ›AŸV8Μe΅;wμ”Σ§Oy‡`@@@ JF郍€Ϋ"X‰KD ‚FπΓγ�³ΑΒ0ƒ2 € €@h‘,lΧ‘£+V\4,θ΄�ύΧ.j`mψΠΑΞf©wεURΓ„›2x¦9ΡO"0Υ Η�8.ΦΤΙwtλ!Ω²e³�F}ϊ±;N|ΑΒf-�–Š•ͺHϊτιέc΄ Ϋ‚ωσdήάΩξ6οBΆμΩ䆻HφμΩέ{9qβΈ¬^΅RΆoΫ&-ZΆΆέΏψόӐƒ_χ=πhXlω_Λ䧉㽧K�rb―UŸQλλΪH©�eέκuz!ϊΌΆlΪ$?ώψ½¦lCG)ZΌΈ½ΞΓ†Θ±ΣΞ΄mΧ^J–,mϋ :Θ=Άr•ͺfZμΖ6Tiwš/ϊœ�ωgL�ƒμΩ½ΫΩο«ΤZ]ΣFςεΟο>=HkZ9οΧ©Ώ£BΕJ�΄Y Ή8C[±OΟ―χ0{ΦLΙ•'·Τ¨qΉγ΄ ΘωP±riάΈ™9φbχœΞΫΏΏŒώϊΛ… u*β2eΚΙ)s½C½εžκξ{ξ•L™2ΛΪ5Λ?ζSψϊ˘1£»�θΡ#ςγΈοόάNq,4kΡRͺ]Rέφ˜5sΊ€7ί‡΅λֳ끂…χφ~P4lzΤ„(‡ΏϋNΐ‘4n"—_^Λξ›9ύ7ω}ώ\·_†Œ€υ΅m€xρ’�™ξmͺΫ—@@@θ X}Ο4Rξˆ`a€<)�Θ X™Ο«F 9&‡*c"€ €Δ+ιΑŽ]n–Β…c¦HυΏY σie3muκ^!W\UίΏ‹»�Α­F σ muΏΧTό3α«}ϋφΚGΌηφ+Xx«©Ό–ΫT^ Φ6lX/ί}ϋ΅Οξ"E‹J»|Βvή»wν²Α6έ–`αύ=bCVsgΟ’9³gŠžGƒxX\΅j…:xΘ{𐖓r­Ž[°:|Hή6ΤξΦpΰΥ­�±ΛK/–iΏLŽuX/FK―a4‚>4&ŒV·ή•6@«σΩ ζϋτγCͺT™;wιzΛm&œ™.Ψpςχί«δΗ±ίϋμ―ί ±Τ¬]Ϋg›³βσζΝ'ϊ=7θΝΞ.ϋΪΪLι]αμ”ή>;Ξ�θ1γkφϋoΣ€fρ’%E§"μ9WΟϋξ·ΫCJVž½θ’‹ό΅Οί–ΰο cήrϋ]φ{OÐ#ί.W^Υ Ξ`‘σ½κ�oΝ{QΥ.ΉT4΄«mεŠε6$ͺΛXνΦ£§ ’fΡΥ€MΊκFC@@ˆN‚…Ρω\#α�FΒSβˆ\‚…‘ϋμΈrΒ-@°0ά’Œ—lc'L‘ΙSgΨ7Xί~΅―{ž-fJΈWΎkΧϋάΧMJ•(ζξc@R�@€ ΅* V^kjG%K–²a¨‘ΰZ₯M«ΔyƒNgΜ4ͺsζΜ’εΛώ”’₯JΙ₯5.³Σ"λ[·l–―Ώε>¬„ 6n*—]^Σ―!Ή)“&ΪJ|+W–ΖMšΩœξό~τ7²~ύ:χ+Vͺ,M›·0Ο)½­X©!γS§˜Ω’ρ@@ˆ2‚…Qφ@#θvFΠΓβRˆ@‚…ψΠΈd’I€`a2Α2lψΎώnΌό6kž}CτώΟ»'Ψ°i‹τσ&ώύ=n—ςeKΉϋXH^ƒ‡Λζ-ΫLΥ™ RΆt‰δ=£#€D@€ �¦m;)S�œ 3½=°Ώ³ΩΎ*TH™`ŸΆysζ˜@Ϋ»μ|ιύ@I›.­Oε;έ—Π`‘3N ΰWφμ9δφ»ξΆ³ƒΘο ³§/SΆœ΄ω_;»Όο^ωαΉΚˆΊ1ώ�εζ[έ0Z¨ΑΒ‚… Kη�7Ϋq½_4Μζ jΏΓήqƒqήΎώΛIΉΦ—_.M%>=�ΈοLj9­Pα"�©ΛMvuƒ \~g‚—Ϊ�Ώ‘ƒ­°¨ΛΓΜ”Φή鐯ΏαF$Υ €οyΫ^ΏΘ4Œ¨-P NΏGtη;wΚΟ“'Ω~q}Ρι§σδΙ#’ρfZ`oσNυ;y�ωΛU΅ιτΜ₯K—΅Λ Ÿ'ΣMHΤΫt:` ΩiσήΡ­»δΘ‘Σξϋ�„ζΆ›πœ·ιχ‰>mσζΞ‘ΩfŠαψZ(ΑΒΡ_%›6mπΚ u5Α\οtβ>¬\V³– qκ�?�Xbœ²½β jeHύ^ΧζTΨ΄+gΏdʜYΊέέΣώ;ΥMN%D]ξΨΉ«.RTΕςΤu}υ�ΌRe�„ f:μέv™/ € € €Ρ%@°0Ίžg$έ ΑΒHzZ\+‘'@°0ςžWŒ@r ,L.YΖ »ΑΒ°“&yΐΟΏ+³η-΄A…Α―?—δρ@ u €†`a|O΄« ξε/PΠV3{ηνnχ„ ½αΈ™Σs«ΤΉƒ™ 0ηρNKΫΚL}«;m_ωΉ©šΈΕ.{Ώ8ΗιΆPƒ…—TΏΤTk‹™6VΓwK/΄a4 ηe͚M:˜j|ZUNێΫε‹Ο>±Λq}I�kΥs:ΣοΪ΅S>�δ#{4Σΐ™6oUB]wϊϋ‡1xψQΒΝ.ίΥ½§©˜Mτόƒί:χ½δ½gb�`aοMΐΥT•άk¦ϋLυψ‹Ν΄ΟZΩO«!ξά±CF}φ±wΨ€Λρ ƒoΊεv;ύΆχ{5ΰ <5ΨyO―ήΆ’γ±cΗdؐAξήψ‚… ’N&«S2λχλš5«eΞΜYrψΘA©V­ΊήZΗwšNαόώˆ˜jιΧ·3TO5Κ‰?Žσ �:ΗπŠ € € ½… ’4ζwJ €Ρ"pΖΜj³}ϋŽhΉξ’(@°0‰€~ώώΟޝθT·�ΏμϋΎοϋ.Q”VEHIBvJ+B-hO?=)% i/-R"’,ΙΎDvΖΎΝ0ψ}―οέ9Ξ}Ο=ϋvΟΜϋό�ΟάgωžsΎηu¦ί3=σ™λ"X˜rΦq½ΑΒΈJ1@ ˜@F jP­n½zR²diΙaBZY²g“lY²IφΩmXKΫ€&4Xθ­DwκδI[.Π;Wξ\Ά-«ξ5ςU{ΈKχžf>₯‚VZtΞΏΎΙ ry£+νf\ƒ…—Τ«/Χέpƒ=η%K‚ϋxΔ8δˆρήΞτ3)ζZ΅ju©V£†h«έμ9rJΆlY%k–¬f=‡ •yƒ…zO'άιm‡\Φ΄'Φ`€.σ~ωYVόω§]Χ/ήΚwΊ}ζΜΤ;(ΫΆn•ΕΏ-Τ]ρ^΄ _Ω²ε₯@Α’=[vΙjζ¬ΐfώΊxƒ…ύ~ΜχDwIφ#€ € €€bŊ™�γβ€₯“Ηβ1@2°@Δ™³rΰ@β:°θ�Vκό轢RŸ]—ŒόόυΩΣλχ:ΑΒ4πf#"Μ/%‘R%ŠΗ{Ά'Nž’ˆˆ)RΈPΌΟMΘ Ϊ�ξθ±γΙrΏ”ž5Ο²{Ο>)^¬ˆδΚιϋε­ΧD!»ο@˜”,^ΜΌΗbZ?tψ¨δΝ“ΫT~IΉΡά³oΏ6Ώ ΝaΒ qYτΏμφξ?`Ÿ»`όўB°0Z €ΔA £ ;š ZH‹iIL°πζV·J­:ucΊΌί±ΙÇ‹Σώφ¬ ΐ½5f”ίg£ξ%υ€yΛVv3�ΑBηܘ>[š9ΧώoΞS&MŒ΅MlbζšΣόΧύξ{$Ÿ©–Σ,Ό©EKѐ€.N;d§E²7˜η\3Kζ,�’Υ-R½FΝ(?κΟΘ―^-ΏΜ™ε ρSΫθήr[Œi 7XθTτίΟuC{ζηΨ1£|‘=oXr©isΌ(š6ΗχάίΫ΄K.`“c£ω~ρή/Ά`a ·s�kiζ‡`‘7ά§-œ΅•³w‰K°PΗλ{»Ι sx~ξΧ6΄ͺζΤ/>“‡dί«Ά3ŸφυWξ-jΤ¬e‚‰-ά°§{ΐ¬œ:}JfLŸ₯έ³w λ € € €i[ wξάRΈ―3CΪ~f €€OΰΠα#’g³h΄.£ΦσυΕ 3φσgΤwŸ˜fBω\‚…!ϊvτ—•γ'*λ7m5νΜ"έYζ2UBΪ΄ΊI�Ώϊ wŸ³�oΠsvυ‘ϋzΘ²«eΕκ5&TxΖ9,U*U>χv ’ϋ{έF\,R8ξ�ςγ½ία£Ηδϋ™sl¨Po¨ dύ©ώά%Ŋvη +#ί|OΆύ»SJ—,!ƒολwL7όΆT4D¨ΧπΆΧMΞ`αďΎ”ε«ώ–&DΨζ–ζςΩWΣεΨρvnΧ^ΥHΊ΄ΏΝηtσœΏόΊΨΟVƒ‡m[·k7tΗyWτZoŒ›$ϋ΄•yτXώ|yε¦�‘Ϊ5«Ι°‘cνπηŸzDŠρ…@κδάWίιGŸ#ΗOœtvΩ_N_~i]ιΡωwŸwEΟωΔ΄7Φp¨w©T‘œάέ΅ƒ;·O§~'‹L d'm―cΤΉ>σΔοι¬#€ T # ›6k.—6ΈΜ>�yΣ>ΰ˜i£Ί{ΧN[ΥμΔ‰’ι΄-pb‚…W]s4Ύκj{Υ­”“ζK’_.Θ�Ε‹εάωsn{δ`!9ηόk�o"W\ΡΨn&e°Π[eqƏίΛϊ΅kœ[ύtZ2'd�=οΎWŠ-j―«νu……™Jr»δτ©Σrόψ1Ή±ΩMΎJtžVΘ:X‰½`ΖqΪ!?4ΰQΫxΧΞ¦}τ'Aηͺ^q₯T¬TΩTG,bΗ;·nέbBiSΝh?ϋ?ς˜[a2βL„μ7ν‡υ/D΅"₯V Όω–Φφ\o°Πis|άTΜ›πξΫA―έΣ,‹-f«Z:ΑBokε΅kώ–Ÿfότ\§‚γIσ³εψqoγέ™RΑΒN]{Hι�₯ν­O2;Ν?gήE+cj+g]τΈώόΊnΝZ·…΄w¬�k»ηrε+ŠV)Tk]Κ”-+;w³λ+–/“ysηΨuο hκ?λ₯LΓΌ¦%΅σ³±ώs?qΒ89πσ΅χ\Φ@@@�ΆU Σφϋcφ €’’Z‘^ν‚ω™2h΄PŸ]—ŒόόυΩν‹O‡_†ΰKՊv―Ό6VN‡‡G;»šΥ«ΨОwΐCŸ΅›εΚ”’»‚·έ*?ŸΌςμ οi6πΆqσ?vίΓ½{Iυͺ•όŽG·αάοςϊ—ΘŸ+W¦Ώ˜Σ £ΞΧY^ω–μΩk*θ™ΰαKC|mלcϊ9{ήBωφ{_5—±#_t%g°pμ{Sdν†ΝΆŠ`€©Ž’Ώto°pψθq²cηnηP”O΅Έ§ϋ~ϋwξή##ή/ϊ‹μ`Λ• λΛοΛVΪCCυs+S&ΤI/τυτ™2gώoΑngχ.T@^ό˜ϋ Oέωλβ?l 2Ί“τ—δΟ?υ°hΓIO5αΥΏ‚ΥγÞτ;@π d„`α}τ‘|ω}Υ?ό`’„΄θuίƒ‰–7!¨φ;YΪΕ‹Κ’Ε‹ΌΜΡ�ίzΫνΆJ›˜2ω}€ ‹2Φ[m1�ΑΒ[ZίfCu–Œ�en+3¦fΝΪφ~γίk'’άΫ»#1su*Ν†7λ»•ώ‚…zΌΧ=χKAΣ:Yf3ΎŸξΆAžϊΕ§²γߝKΔψ©U΅Υ�ώ\yVήύzŒγΛ•//:v±cμί/M™δ7^+τuιΦΓξσ ο%ύ9vάΫc$"<Βο<­¨¨ΑΘ,Y³ψ ucfΒtiO¬ηφ3aG}†˜*"zo˜RΑB§½³χή±­oίΎMΎώςs;L½‹)j+1j°2Ψβ /~ϊΡ[Ε0Ψ8g_ž σF€ X˜t–Iv₯cΖۊ~zΑŠεΛΚ­[š°Y1ω{ύFό:czΪλ�³K;Ήςr_{6έv‚~Ί�ξ°U 7�³]&ό₯œ4UYtΡύ5°λϊε±Α/K„iσ₯Λ5¦β^Χmμzl_Όχӊ·Άl*W™λj΅»ι3~–u·ΨKδΝ›G^}ώIχr Μ₯D°Π™d­UmυΑ|fξΪFZΓr3η,°Ο₯cŠ),wwλ βΤ@βd΄ 7-§uΨ�~Ρ ΞςΒ«oΨJ…Ί­ο³έm7ΫʈK—�%ί|�“_ˆ1)‚…ΪφψεΎ*2ΪnΉ{ΗΆriέZΆmσ䏿’έ{χΩ©5kr΅‹3ΟGž~ΙVK�w©ί.ΏΤTρ9)ί™wωΗςUv˜œΤ*š§N‡ΛΤi3l¨TΙμ„ υ_œsζΜα\–O@’ΘΑΒ>=,9MΕiύƒ7GωZΟ: ZΝ�‡© §�=zsͺΓ>|H&Ώ�žsŠ8AΕγ&θ6aœ―*7τnώ0坷ήpΗ;+7΅ΈYJ–*%α§OΫΆ�ΊΏVν:nε»`a±Ό¦uπ½τΆσΣρq 6½ΙTi¬ο«�ψ˜ٲrΕr=έoιgnΩLΉ˜*zOHΜ\θϋ9τΠ‘CςΑΔ‹–zύ—5”š6³· ֚W+J6Ή‘©=�U ΅₯uDDΈΌύ¦Ώ±ΆΡmpy#;nΞμ™Q€NΥD ύ½ρϊ;.Ί/ή9ύ΅j₯Μ™ύ“ίΠ;›Šzμ>o°πϊ&7Θε�΄ϋχμήmZθ^§�R�œοgΤ@χϋzχ΅­’΅šί”IοΛ‘CύΞυΆ�^ώη2™�ΛΏγΑ6R*X¨Υ/+UΎψGLsΙo‚½ϊ½¬ΛΎ}{νχάϊ΅keΥJίχe§.έ€t™²φΈΧΣξ0_J–,%Ίv·�;zTήoœsHΪ΄m/ΉLΛ«°ϋ£Ό§‚… I―{°c7¬_+?š`*  € € €@ϊΠί­h[dύXΆ¬YΣοƒςd €ιN@…'L§mμνX˜ξ”B ,L[ςτΟφΆU°ήAChƒψ~εάQ«>ρμpFΣφ»#_μrƒ…ZYnδKO›φi�ΕE[πjΐM—ΛL+ά{{ttΟϋφ‡Y2ϋ—…ΆZߐΗϋΉνnέΡ¬xƒ…=t― 1z‡Ž›ψ±¬^»Αξς†C=XΨ’ιur»i‡μ]τΏ@yκE Π°αpOPRΗi«γΑ/ް�E[²xQ·π¦-Ϋdτ;ν₯*”+#O<ό χ²β ꁀΎςΪΫ²kΟ^[π呏ΫP€χ¦OΏπ?;_ 18­¦5(ψ°y>]κΦͺnZfwχž"›φΘaa‡€rΕrr›iΕν,Ί�7ΣΩ{-ηŸ €Δ&‚…έοκεV-Ϋ²y³Μύy–­~§AΉf7΅°α:uJL°PΟΧ*5ώ«xδΘωφ«/δπαΓR΄X1Ήήγ*T¨¨ΓΜŸϋW€{°O?ɝ'=Ά{χ.Ϋχˆ9OηwS‹–n;^Χ`‘&{φΊΧώ,’AΊίώ*,]bο‘―Ž&ΘU @»½eΣ&ωnΪΧv=Ά/ «ΣVXž[dζ²ό₯Άt“›I}ΣΊVŽΡ%X°Pχ; u]—`!±*U«™Y;{\ƒ‡_OύRφξΩ-ϊsyCφΣπ›ήηΈi…=aό;v\t_ςη/`z\Ώ/f�4ΓάshΛβΦ­ΫJωŠέSƒpN«f -‹wξάnΗ–-W^΄Šž³ +W�*··kokvޜŸeΝί™Pl.ΉαΖ¦ξχΦσΗHcnjr.γgJ cœ„9xέυ7šΦΤWΨaZAΣioμœη­©ί―Λ–-•eζϋU+>Φ4�΄hΡΚVyΤρ³fΞ4.Ύ?ΈΡνϋ4LΣφXmC>�—Ήφiλδ›Μy…M΅K]~˜>M6nXoΧω‚ € € € €d ζI3Ω/ιϋ‘Νο.˜?2Θψ”ύω=ΨN“ Cμ΅}=ύ'ΣΒΦΧΎξ™'ˆ†Τ—)Ÿ}νΆΞ}}ΨPΙ‘#»βύœͺrη=6ΔT&Œ8#Αnϊ‹Vύkͺψ,ΞύJ—,!C>εΤ'OΙ“Ο ·ϋλΥ©)φκjΧC9X¨ox!Κ³h•Ώa#ΗΪύέLΐ«―πUαρ|cά$Ρ–�θ|cψ³φΠίώ σώnΧ½‘Aοy£ήž(›·n‹2&‘Nž|ΑVb©c‚}‚z“_~]b* ώhοχΒӏΊARη}j•Γξκ"Z΅1Ά…`alBGˆI # +Uͺl[ό~Ξςώάn*kEΓΔ 5΄vο‡μ_Ζ;ζ’rBsΊOΫπ~ςα‡rπΰgˆh �u›Ά~γάƒfEΫ#)κϋy4�ΑB=�ϊn”ΛϊΒ\Ί­s9ώœ_P1ΒόΑΜΫAͺ+κψ`KBηκ­ x]οΌ’ zΫAλωΖΏm‚Η/%N+bη@ Ώn0i‚hp3Άε�{ξ3‘΄"ξ0οχŒ³gΟaΏ§ƒ… lkΎί4ΠΈ¨·K΅κb`°PΗήΡ‘£T¬X)π4w[η�σ, Φ­vχΕ΄’V‚…ϊ ­oo+ΥͺΥpG½υ?ή~‚…`5€«Υ½�ψήσ)AΪK»7c@@@@HΗζm΅ΩΒ &ŽβΛΖ/—²4ζCΦΕ<y0ϋ�ƒN5£?Pv¦)‚…!φΊήzoЬ3­uυ—XN5Ήΐ)ώΉr΅LόθK»{@ο»₯FΥΚvέ †έvs3Ήω¦&§ΩŠzΪ¦Έlι’ςτc}£οη~M�ΉR:ήqkΠΣ}E΄Κ’7|˜Πΐ\J΄B֐¦†5—EK–Ι'SΏ³» *ΰW �{δθ1qΪTk8QΑψζψd½i Σϋœ5χW™φγl{oψ0!NZ¦X++κ’Ο’-±—pS}E+,κrwΧ�θ²zvέpΤZ³Bω2ΆςuW5ςϋ…©=Α|!XθHπ‰ τ,Ό΅υνR½fMž Φζφ�ϊυmΥ4mύλ,Z-xεςεR `©V½†œ5•ΰήςT‚{°―©$˜;mIϋΑΔ ΞinxνψqΣ ωέ·έύΊ†ΓΚ›6Ήή@”€˜V­Z5-X¨M[½Άm§δ2ΥιœE«Φύ»ύYΌp‘tλy·έύιGSdοή=ΐX?―l|΅©ΤΧΨ/L蜀m…΅ͺŸ†γ³$t�-nΎΕVaτΊh@ο‡ιΣ₯yΛ›mΥΉ`ν unεΛW”φ;ΩiFη�υΪκXΞ„ϋΌχΡcZ©P[�σΟV݌uΙnΎWΪίΩΙ΄―.νŽΥχ¨Χωδγ)ς@ο‡μ=–šΚz‹ΜwΗθŠV6lΩͺ΅+ZΜΎΣ“¦}…VOœgΪί|Λ­& ΨUͺ\EʘΉdΟ–έ†Ι6›°Υ©“'γ{)Ώρ k©�elζώΩb[έϊ]4šz—Φ—fΝ[Ϊ£K—,6ν”D3ςβξβΕKH ΨύjΊ,\ό‡έ=ςεΑΆe­n€V°°\Ω�ςΤ#½§i+œ<>t˜έ_·Vuιsow»>μ5S•qΟ>ΙmΪνxιι(ηMώdͺό±ό/»?T‚…Ϋwμ’�½ρ�Sηφ·‰ΆŽΛς™yWΏώχ�’{ŸcMϋ롦ύ΅.ή`aBϊ?ρΌ­JT«zιχΐ]q™fŒcVύ½ΞY?·Χ̞=›Œzεw< ] V@ @°0hœ’"•«V΅m‹švΒZ½O—υλΧʌ裏Θύr­0έ·�#nζ°°ΆZ₯V,_‘’δ5“)“ω ³Μύω'Y΅reBnΓ9 € € € € € €D€`aˆ½θ ›·Κ˜q“ν¬jT«,ΌΫo†‘¦šάγC†™Φ\ηΜ/9ύC^‰ j{ε’E Ω°Ÿί cΨpξ§C† |HJ—,α7zΚg_ΛοΛ|Ώ°ΤІZΩP—q?–Υk7Ψυ�½π”δΙ“Ϋ�λ— .Θΐ‘―HxD„έ*ΑBmόΘΣ/Ωp]ΎΌydψσOΊsvV¦ύ8[Άό³]ς™_ΪήWg»ϋοuεχ?²λΑήηΡcΗeπ‹#œKψ κτό�–Ω_kKζωσΉΧΧm½ώfϊO²dΩ {z�œ9E++:Λ¬ΉΏŠ†πt)^΄ˆτ7αI­ΜΈkΟ^[o�ƒΞP •`‘NΘiΕ¬λ’|θώφ½„ψLV�^k―έ—ϋzv–υj»‡‡4-ͺχ^όE³ΆΝΣgvέ~iΘc~ΑΑa‡δωᣝ! =΄@IDATφ³p‘‚vœίN6@"@°0 »@@@@@@@ X/!ΨN‡‡Λ›ο~ Ϊ’Ψ\Λj*6mr΅ά~Kσ(§9AΏφmZIΣ믊r\Cq‡5 ύC‰N;[ Ž ~Ό―­Tεδ ;œϋiρΰ‘#²θχ?ύyrη’ΎχυZqοώ0σ|“ύ‰Zυ°vͺrΥ—‰VQΤΕ,όzϊLΣ�χ·(νxwξή#�χϊ;vό£}ο­ΞίΕi;¬ώ^6$ΪΣυ]Lϊxͺ¬ψk_θNO¨ZΉ’τκΦΑ/xη\HΓ’ΪβϊΨρΞ.[ε±QƒzR»fU™ψΡ—vΏ7X¨;βδά`ώΒίε›fωUDΤcŊ–�n—κU+9Cν§†υΩ4θ κA­TΨ£ΣR©B9Ώstcξ‚Ες݌Ÿέϋhλem‹Μ‚ €@l cβ8 € € € € € € : SΗ=^wΥPΪα#Η€BΩ�’mj“cΡ £ΆΖΥpa\o°Πi½¬Coυ*•Lλ΅l±^Jο»Υ΄x.l*όiλέ€Zœ Œ±]/SζL’-kΦΨ†=�U·οΨ%Ε‹Άs‹Άήd*5U‹+b―ϋηΚΥΡ 'ΖIΟέ΄y›ύή)W¦Tœή‹Ά£Φκ…Τs²ΖΑH+l9z\ Θ—`SηyωDΘ 3Ζ{ζ)@@@@@@@ ν ,L{ο,df,X “ϋΝTNόψΛiqžŠ·*bœOJq &ανΈ €!#@°0d^A@@@@@@όϊq°P ώ½n£Lωτ«8=ŠVώό“q›\ƒ&—,ΧEu‚…‘ώ†˜ € € € € € €dT‚…υΝ'Αs‡j°0 -E/A°0EΉΉ €@ , ‘—ΑT@@@@@@@ΑB«ρXΎκoΉpα‚Τ¨ZYςζΝΏ“ν œ—΅λ7Ωνϊ—Τ–,Y²ΈΗXA@ = ,LΟo—gC@@@@@@΄,@°0-Ώ=ζŽ €€a‚…iψε1u@@@@@@HΧ Συλεα@@Π XΊο†™!€ € € € € € €@Ζ X˜±ί?O €€šΑΒT£ηΖ € € € € € € €@Œ cδα  € €@r ,L.Y�‹ € € € € € €$N€`aβό8@@  Ηi € € € € € € €@2 ,Lf`. € \€`apφ"€ € € € € € €©-@°0΅ίχG@2¨ΑΒ ϊβyl@@@@@@y‚…!�Š˜  € >¦ΟχΚS!€ € € € € € €@Ϊ X˜φί!O€ €€I‚…iς΅1i@@@@@@Θ 3ΐKζ@@P XŠo…9!€ € € € € € €" ω.@@H‚…©ΒΞM@@@@@@@XΖJΔ@@δ X˜ͺ\@@@@@@HΌΑΒΔr@@,L§ € € € € € € €) @°0Ή € €@T‚…QMΨƒ € € € € € €„‚ΑΒPx Μ@Θ€ 3ΰKη‘@@@@@@@ M,L―‰I"€ €ιO€`aϊ{§< € € € € € €€‚…ιγ=ς € €@š X˜ζ^F@@@@@@ "@°0ƒΌh@5‚…‘φF˜ € € € € € € ΰ XΘw € €@ͺ,LvnŠ € € € € € €Δ*@°0V" € €$‡ΑΒδPεš € € € € € € €@β&ސ+ € €$@€`aΠ8@@@@@@H‚…)€Μ-@@’ ,ŒjΒ@@@@@@@ †Β[` € €@ X˜_:Œ € € € € € €iB€`ašxML@H Σί;ε‰@@@@@@@ },Lο‘§@@�œΑΒ4χʘ0 € € € € € €d‚…δEσ˜ € €@¨ , ΅7Β|@@@@@@@ŸΑBΎ@@RE€`aͺ°sS@@@@@@@ V‚…±1@@ 9&‡*ΧD@@@@@@/@°0ρ†\@@  €Ζ) € € € € € € €@ ,Ldn € U y›NQw²@@@@@@@ Υ¦ϊ+` € €@Ζ X˜1ί;O € € € € € €‘/@°0τί3D@�₯­Σεkε‘@@@@@@@ ,L/‘G@@�’ΑΒ΄ψ֘3 € € € € € €d‚…α-σŒ € €@ , Α—Β”@@@@@@@#@°o@@T X˜*μά@@@@@@ˆU€`a¬D @@H‚…Ι‘Κ5@@@@@@@Δ dΪΎsο…Δ_†+ € € ?fΝ[ΔοF#€ € € € € € €€ˆΑΒaζ& € € EΨF@@@@@@BC Sα>«©Xο‚Y € €J πΌnκyyX@@@@@@@ ­,L+oŠy"€ €ιL€`a:{‘< € € € € € €€‚…ιζUς  € €@Ϊ X˜Άή³E@@@@@@Œ#@°0γΌkž@)‚…!υ:˜  € € € € € € ΰ ,t)XA@HI‚…)©Ν½@@@@@@@Έ ,Œ»#@@’P€`abr)@@@@@@@ &!&—B@ˆ»ΑΒΈ[1@@@@@@HI‚…)©Ν½@@\‚….+ € € € € € € €@H , ©ΧΑd@@Œ#@°0γΌkž@@@@@@�–ΑΒ΄υΎ˜- € n¦›WΙƒ € € € € € € €@: X˜Ξ^(ƒ €€‚…iεM1O@@@@@@Θh 3Ϊηy@@ X"/‚i € € € € € € € @ΨD@H‚…)γΜ]@@@@@@@ψ ,Œ―γ@@’D€`a’0r@@@@@@@ Ι&9)D@ˆ‹ΑΒΈ(1@@@@@@Hy‚…)oΞ@@ŒΑBΎ @@@@@@@Π Xšο…Y!€ €ι^€`aΊΕ<  € € € € € €€Q‚…iτΕ1m@@ ­ ,Lλoω#€ € € € € € €@z X˜^ί,Ο… €„ΈΑΒAL@@@@@@2¬ΑΒ ϋκyp@@ u¦�?wG@@@@@@’ X ϋ@@’U€`a²ςrq@@@@@@@ Α LΗ‰ € €‰ X˜=ΞE@@@@@@’O€`aςΩre@@Ζ€Γ!@@@@@@@ ¦">·F@2²ΑŒόφyv@@@@@@e‚…‘όv˜ € Ž¦γ—Λ£!€ € € € € € €@š X˜¦_“G@��ΑΒ΄ϋξ˜yϊxρΉ‘��mΩ Lž{αeωuΡo‰~ΐΛΤ—š5ͺΫλ “Ω?ΟMτ5Ή € € € € € Ϊ Σ§OΛ™3gR{*Ι~‚…ΙNΜ ’K A…\φ�ϋŽž•έG"“λ6\@’I€`a2ΑfΐΛ–+[FξΏ·—T­REΚ”.%yςδ‘½ϋφΙΝ»δ§Ω?Λ7Σ¦g@•Έ=rκΥδϋo§Ίƒ—―X)Ίέεn'teό;oʍM�·§οέ·_�»±yB/Εy € € € € € €@ͺ ”)[V�ΊϊZ)Yͺ΄d͚U2eΚdηrώόy9~ό˜ό4γΩ΅sgͺΝ/9oL°09uΣΰ΅λ•Λ)5KεŒvζΗΓΟΙͺO§zοŠΚΉeΖΐΚvž‹7Ÿ’Φ―ovΞια@ή™εή&E€j‰μRΉxΙ‘5“ό{π¬lΩ!ίόyTΦξ OΤc–.˜UšΤΜ+Œkέ²Ή$ςάΩvFΦν—7g‡%κڜŒ €@tι!Xx[›;dξΟ³δδ©“Ρ=&ϋ“Yΰ™ΑOJΧΞνΏΘEw«M›7Λƒ}Θ4LŠ₯d‰β�·χφR.\�eΎN%Ε₯SόΑΒ•«ώ’;»τHτ<&𐠀 € € € € €@<:πΙXgρΗ�%²pΑόXΗ₯΅ Sΰ=ykqyΒό睹eθΤ=ρΊγ[=ΚH—« Ι§‹KΏ“ζ‘1M`ΑͺR§LτΑBηά#§ΞΙk3ΘΫs’'tV£d{« {#œ[ϊ}zƒ…Ώo9%·Ό–~ƒ…}š•A­ŠKά™ύ œΘσ"”§Ώˆίχ–s~Η+ ΚθξelXΡΩηύ“wΚKΈΫ¬ € τ,t<Ž=*sfΝ”νΫ·9»ψLbΫnm%―ξ^υη9ΏHŸώΈΫΞΚΣO“^ώ?ΏΣξ»η.yΈ__vΜι·_7"##eβʈΧFϋ NύϊιΧηAΏ1Ί±cη.ιΣοaΡwΓ‚ € € € € €€%J•*KΫφwΪ)1Ώ»™4ρ=Ώι—*UJ:tξfZ'gρΫοέxη­7$<<ά»+dΦ ¦ΰ«ˆKΈ05C…J—`‘Ž«P4›,z¦Ίh»gΒΏ¦Mξ1Ι›#³΄6•τt9|ςœό΄:j0Ρ4_VΚ%UKψ*±,XBΚΞn+"6«OΪ5,`‡­Ψ~Z&Μ?hΧχ”Ήλ|Υϊ’«XΨ¬N^ΉΆZ^)œ7‹lΩ!K·œ’%ζ?±-Π»΄|.©[6§­Μ¨ηώ½#\–n=%Μη\K砏Ÿ>/?¬:fw7�’[š˜J€e e“ΟΚΊέα2}₯ο˜s^\?Ώ}€’\W=ώά7{ε­ΩaAOύΈwΉΉ^>{μcΣj{@ZmΧ.“S˜jˆΞο oόΏΝς—yή`ΛηUj%|ΏD~o^˜Ό3Χχ>‚e €ρHΟΑBΗAK’�:οS‘ν€³+]|f.‘Mrv,,ηχž•π/γ^/)^« ~ώρŐ ά^yu€|ψρ§qΎž―Χ‰i9uκ΄άΨβδ ₯`‘ΞωάΉs’%šUV·΅‹Z φ¬1 >φ°Ψ·Ών–₯;#"Β娩jxκτ)Ι—―€*TH΄šα»οΌ%§N†ζο ϊ½Ξδ߈)\˜Ϊ‘B}ϊΈ u쌁•EΓuΊŒψqΏ �~Ώ4―›O>λ[Αξ;{ξ‚TΈ.Ϊ`ήβg«IuθΣεεiϋ€Ε%ωάλٝ_v>+υ†l°{ƒ…ο/8(oίUN²ϊΊφϊ©Ηξ : BŽιQFnΏΜdτ;Ρl2αΘG>Ϊε½Η—>_]ͺ˜`αΣ‚ψzΣ‚xϊ£•€ iΈ¬Ω.½M₯Ώ΅ζ3>‹† k”ςω|ϋηΡh+Bzƒ…γLθoΘΤ=±ήζ¦ ὦ‘.n;--ώ·%Φs€ €@R d„`‘šE˜Ώ0ZΈpό΅rER¦Κυ4T˜«G1Ι”+³œ?)§ήά›*σΠ›�\ΆXς˜ΦΕήετιΣ²lω YΉς/ω}ιςϋΛΌ‡έυΫo»UFΎϊŠ»vP&™Κ{Ί4Ώ©©ΤΏ΄ž{lΪwίΛΐ§†ˆΆ"ξΪωNσYS.©[Η=ΎΰΧE²gο^ 3%λGλξΆ’T kkKdmΏœ;W.Ή©YSΙ–-«sHfό4[<:Πݎn%Ί`‘Ά?ž1ύΫbΩ9w‘i}Ό|ΕJ©Q½š΄Έ©™³ΫόL|A:wΏΫӝΑ‚…»vο–υ6Ω?nΉ±Ιυn•D�ώ€dψ_eFέfA@@@@@BY —ωΥύτ•,Y³Ψί“|φρ‡²wοΕ̎v‚��MΊh¨πν7ίπ{œ,™³Θ5MšΘ’ωσεάω€ιλwƒ$Ψ X˜ˆρ½D°p‘Ά/σΆJώlΙayhΚ�ψ^:Ργγ,ό€OiiΒ€ΊLώυ<ώιn»Ύρ΅€ˆ©¨‹ξΣc‹VόΝ u9o‚y—Y/ξ-/WšŠΡ-;•K‡F FšξΐηΜErdυoη½Ξ—¦}―†ϋΌKQ3ΗΉ¦pS]0Άε΅δ•ιϋό†ύωbu©X4»έ·Ϋ„KΗp­ΞH£η6ϊŸZ9rώΰj’/§/QΩoΚNωtI쭊΅ αMu|οnΠg»eβί;r*.ζɞY6쉐�žŽw 2)ž‹k €d Œ,Τ·yψπ!™>ν9ΌqZyγήPα…πsrzJ˜œίw6Υ¦ίλ�2ψɘƒsΪ2ψ[ σΦ;~ρ¦}υ™ :“oέΆƒ_;ή…σfK‰βΕνa­ώW«ήεΞPιtg{yω…gένv»ΚκΏΧΈΫ1­$e°pη�]�ΎSw[MQοyΝUεύρo»U ϟ?/—]qίs›[tΑBoλe=oκΧίΚΣCŸs/1 _ιί··»νmG,\³vtλy;—@ΓΓζ/τ�ΈΊ‰{-V@@@@@@Pθyχ½R€hQ;ΕM7Θχί}λ7έ"EŠIΟ^Ύ�PϊϋͺΪ$ϋ Ρ ‚…©τbΓ…ήi€V¨PηŸ`αoΟTs+κ=oZυΎω_«ή‘]JK―λ|Υπζ™ΗνΗlσ>ž]�¦„�ς+ΏyΏυΖk�²ωMξΎΫΫw–΅λΦΉΫΑV’ N~�]VΤs΍”kolξϊ9Χω}Ρ<)lJυλ²yΛVΣ~ω»,ΌϋήE«z—o§~&ujΧrwΥox•Ϋ%S�?RQN0;ΒΖΦ5‰h�#{FΚ€eΣΎ)–/«©ζXΠ―ββš]αrύ°Νώ'±… €@"�k°0Β„«.\ ­\‘Π95-„ ΅ςδΞ-·΄j)χφΊKͺT�δv‚o5ͺW“￝κξΛΚΐ§†Θ4ΣRY—P V«}i”©kΗW_yΙέ¬ͺ‘{πΏ•θ‚…K›/… ΄£΄κ‘�ύ Όf7^laμΜΙ,%M5ΖΐsΥN εΙΟwΛ„ω‡œM>@H”@z n6U4χηY¦λΙDΩ€ΔΙ9ο,"™Kf•π/Ιω}Α�e%”C…Zu°LιR–J+βmΨΈ) › [0Χmy¬�3ν|?!+—-vΗk›δQoΌεn[Ρj‡'Oω~ήKΚ`a`˜�v­Z2ν«Οά)L˜ψΌ:ςu»ύάΠ§₯{Χ‹αΎΦm;Dyξ~}”‡ϋχuΟΏχΑΎ²ΰΧEξv°•θ‚…ί}ύ…ΤͺYÞ²�ΐΉ¦ΙΕΛΞuΎϊόc·eτ‘C‡D«(κβ jy�κuκ;§ΈŸΓ‡½(νοΈέέnΪβΩ±3j΅rw+ € € € € € €@* T«^]ni}»dΜY4TψγχΣβUq°H‘brΙ₯υ€FZ’;ΟΕΒb[6o’οΎύ:•ž*ζΫ,ŒΩ'Yކ ?]rΔή§Kc_5έH­p‘7XΫΓ;}^žύz|Έθp”‘Ϊ†xΝπZ’Υt!l‡μ­f¬έr|ƒ…1UΌϋΊΒςZ—�v~ή`αOƒͺHΓJΉμώ>“wΚK}ο Κƒ˜ήωj»em»¬‹7XxΙΰΰ½Υ,΄7υ|Ρˏ΄,.mδw«~½μ¨ά?Ρ?¨ι9Ε]έφzm·•²Ά9ΎϊōA+>κ ΪΦZ[Gλ’NκΕ‚ €@R€§`αΡ£Geώ/sDπO+Kξώ%%sΑ¬rΑόLwϊΓQΒ…‘*TγΡ―½*·ΆΊΩrλΏΌ5iΦRφξ‹ϊΗ"_~ϊ‘ΤΏτχ΅8탡²†u9qς€4ht΅;ΖY)Y’ΈdΛ–ΝnzoΑΒϋ{χ“y ~uN‹ρ3°Uρϋ“>α#|ΑA=ρɁΙ}χάε^#¦`᧟)ΟΎπ²;VWfΟψN*V¨ΰξ‹KX/Ί`ᛣ_“›[\ ή}hρχΪzŸ™ί㢝^Ήκ/Ή³K{ά,Τ#^-γߟ䞫‘ΟsgIώόωμΎΘΘH©Uοrχ8+ € € € € € €@¨”+_^ΪuθdC…ZPaφO?ɚΏW%xz—5l$MnhjΟΧΆΘή};ΑΧJΞ &§nk φ›β jνYF:7φ΅νΥSS#\,<}φ‚ίSœ2Υπ΄Uξί;ΓeΔϋ$μΔ9Ώγލ―T’&5} ΫΗ?έ-“=$ή Άή­στzο)v=ΎΑΒίM₯ΐ[LΕΐ`KtΑΒ%ΟU“j%rΨSΊΫ.3ώς…ƒ]cΦUδςŠΎ`Ύ+'šΪΑBg�Γ;–’ϋo(b7΅‚dΝ'ΧΕψ^t 7,ωσšγ�iμvηrQ>ϋ5/*/άQ�ξ_υoΈ4N;δ(Hμ@H@z>όΨ YΉbΉ,2­#Ο―ϊ— œ8Ι{•L9³D †z¨Pyτλ#ύϋφv₯6nΪ,― αί44xWχ��·χύξ˜}ϋχΛ΅74·Ϋƍ•&Χ_λ{wΒDωϊξφ§N’υ/uCsN QάΩώyε₯ηέ±3fΞ’§‡>ηV4tYΉαϊλδ½q«#jrδλ£eΪτδΚF εΧGH‘"Ύΐ£žξ V,Τ0ή�FŽ’IS> κ½όβ³�ϊ–Vξ]½ݝAV’ φκΩ]?5Θ=cϋφε>’άΆ}» eΎ�ξX©[ηb%μI|(―Ό:�Ž ž:uZ†>χ‚L�a†=wΜλ�“+―hδ^{ΝΪu�ΆΓΕjŒξV@@@@@@T(Y²”tμ�ΝύΡ‚yΏΘŸΛ–&jFyςδ•ϋ{χ΅-•O™NhοΎ}ρwG‰ΊpŸL°0‰AcΊ\L‘BηΌΤzƒ…Αͺ :σŒΛggSqlΟ²v¨ΣYΫ#;mΗΝ=(C¦ξ‰r©”~σp%ΉΎ†/τ8Π„'™ΠctΛΚ—kHΉΒΎJ5mFύ#‹6ωZ†J°Pη½ο­ΊΆ:€�k;δΐΦΤΊί»|ΩΏ’4­•ΧξϊΔ΄ˆξ�_‹hοg½}£2ΎW9»ΉϋπYΉdHπΆΣΞx>@ˆ«@z/QRφοΫΧGΉqΑΒ…:Ι\=ŠI¦\™εBψ99=%,J5ΓPxͺU*›–ΑŸKφμΩύ¦.‡‘R₯|α=8qςωΏ�½fwιωΣΏωR²fΝκΡͺ„ΗŽ“Κ•*J�\Ύ?,Ρƒ«ώZ-:wwΗiπ£ήw·uεμΩHΡpܝ].Žσπί†ώ2ΫTBΌxί`γœ}1U,tΖDχ©AI LΖΆD,Τσ+ juHύ.^»C‡KΣζ·ΈαΚΐ`‘=Α|Ρ0d–,YμΏ(;ϋτ³ίÏΛO³φξb@@@@@HU\¦°Γ}τq'²�>ΩΊeKΠ9%­_^ρQ‡Ί₯Έ<ΥΪχΜ–˜κ·FS2Ί{±@θ�C°0ΊgKKϋΓ…:χP:Ύ··i-#ώοε(!5ηΈχσΟε+€sχ»½»lΕΓ~}΄eλύx6ΒΒJ^χΙζ-ώ?/Νϋy†”)]Ϊ3Rδˆi‰έθͺλύφΫxfπ“�ΣTS Άh•A§E³)XΈwο>)Y²D°Λؐc\+Ζ,ΤεΨ1£€@όAο£;OŸ>-OyV΄r£³xƒ…φ�½»c§ΟK₯ΗΧΊsNξ`αξ1u$GΦLφ~ζΣP_°₯v™œςλͺξ‘ΈT,lX)—ό4¨Š=ηΌiŸ¬Χ_Ί5ψυW™Še�«ΨψώόCςΔη»έ{±‚ €@b&F/iΟυ† υΚ‘\©0πΙ_y… >(W˜\°ε@X˜ ηi΅Β`‹ž�μ'M•ΒJn {!ί�8SΖΎσ�h%ΓΐE+φΎ�^Ήι¦¦Ά ±?xπ4ΎξΖΐ‘A·>φ°τΊ«‡dΟ櫌}ξά9Ω΄y‹Όπς�ΙθΧ^•�ύ•ZLΑΒζ­ΪΘΛ/<#υ.©λVX'W_u₯{=�F+WύeZΏdΫ#{ΟcZ:·ΊΉ…έ΅tٟ2β΅Qςτmλδlζ™3eΚd½>�ς+5&4Λϋ{Ÿ‡u@@@@@Θx₯J•’ΞέzΖιΑϞ=+o½q1X¨• ;tκd~·’;h‘Œγ¦Βαμ™3dϋΆβtύΤD°0ΤΎ]Χ½K\B…Ξΰΐpa‘Ύ;‡’ν3©ƒ…ΧTΛ#ί=Z)Κ|Ÿ�f―Ό9;,Κ~έαm½{&ς‚T΄NNDœχ›Ψ`aή™eΥ°R0·/ΌμŸΣ�νm~αΒ»―3Ώ@½³”ξ{cΦyρΫ}ξ<’;X¨ΑI}N]v™Δ·Ϊ*ΫΓΞΊχΧ­¨ψγΐ*R₯Έ―ΰα“η€ͺρr­zΨΌn>[²χ€²ao„sHΌν�9pΖ<�vΏγjτ�i|s½|ξ9]͘ŸVw·YA@ 1 £—τη:αB½r¨Ά?Žι©K–(.ΥͺV•²eΛHΞ9dηξέςΟ?Ϋ’TŒι—Τ­#ωσε“]»χD ΚΕtžΛcJαŸ<ό5b:·FυjR΄HΠ‹νόη†>-έ»vv/W­φ₯ξzνZ΅δψρcACξ  +υ/½DΎότ#χH°`‘{Π¬”3ΎΉΝ³FDœ‰·‘s}WΊμέ·ίΩΕ' € € € € € .²dΞ"UͺU“"E‹J�œΉLα…ƒ²sΗσšU ½/`‘W#™Φ»4.(Ϊ yάάƒ2dκžxέΕ ~Άδ°iq΅RJΌ.‡ΑI,Τ[�x©†”/β«Δ’Ϋ‘&#Xη©‹-…uŸw©W.§όςτΕ |ZQπΧ 'd‰iΩ«α>],Τkx«κφ‘Sημ=²š¬a‘ΌY₯A…\ΊΫ.ϋŽEJν§Φ;›φ3Ήƒ…·_V@ήΏ·œI-ϋn«!Λo—•U�žS U΄RaϋF%wφ�˜aΓΏί/#~τύ‚ΦΠΤ+|ώϋιϋΑNίΕΜW}ΎΩ¦5΅sύpγόυ²#rΤTfΤ+Άi_JΊψή¦™{ί3a‡{>+ €$V€`ab9?£ Δ,Lˆ…^―Ή©ΈθTGΤkΌ2|„Lšr1h˜λr € € € € € €@Ϊ X˜φίa’>Ar ‡ή^BmY̝ηœ5'€γΨmξv°•ωƒ«Jέ²9ύiΥΎzC6Ψ}I,Τ ½Ρ½ŒtΏΊί}7φ”'ξE›NϊJξ`‘ήlπm%δρVνό&°ρΙβΓ��Γ‹αΣnW’1=ΚΈ£‚οΈΌ€Œ6Z0¦eν�pi5rk”Κ‘1Γ1@b X›ΗπHΚ`‘V όυ—Ω~7—[Ϊ΄‹wΥCΏ‹° € € € € € .¦‹Χ˜tρΣ Κ�°’―ύξ­―m•%[βίΞ-p6Ϊ¦wισΥέέ˜–Ό_ύqΤέΆRΊ`Vy€eqΫΩiWΌσΠYΉt¨/XX£d™?€ͺdΛ’Iζ�;!wΎΉ-ΨeόΪ*Ώ7ο <υEԊ‘·ΥΟ/OΆ.!UKd·Χs.tπΔ9™Ώώ„<ϊρ� ΊŸU1VΉlΖ*― :¦BΡl²μ…’Ω”\φΟ)i9b«sω8j+c j%Η`‹Ά7~Α΄–Φ’xΞSU€Ž©l¨Ο�λ½eιΦ¨οS-ΗίSΎsͺ:χ‰0U΅J䫦"  €I-@°0©EΉ^zHΞ`ၰ0yι•WeΖΜY靑ηC@@@@@ˆƒΑΒ8 1$q―((οά]Φ^δθ©σRyΰΪx]°hή,’=k&Ω}$2^η%d°†χ"LKΰƒ'"%Μ„ρBiΡ€fu¬P4»hΫβƒΗ#eνξpΩ²�LŒΣΤj„'"LοδXwU΅<’ήYLr©RΈbϋιXΞβ0 €  X˜p;Ξ̘… –:΅jΪ‡?yκ”,_±2Qξl/α²cΗΞD_+Qαd@@@@@@ Xr―$ύMθ―a5€L‘lφΑΖ›ͺO©˜ώžš'B@ΨΖ&Δq@@@@@@@ u¦Ž{ΊΏλ5¦ςΆTn{y·…o€)šΧ`θϊ©<˜ξy@@�ΑΒtπy@@@@@@H— ΣεkMύ‡Z;Ό¦”ΘŸΥo"―Ο< ΓΎΫ総 @ΘΈ 3ξ»ηΙ@@@@@@@ ΄†φϋI³³σ ΟD^)‹Λ“ŸοN³ΟΓΔ@@ ι&½)WD@@@@@@’B€`aR(r(Νλζ“π3¦χ±YVl?-'"|λQ²@2¬ΑΒ ϋκyp@@@@@@q‚…!ώ‚˜ € ^¦Χ7Λs!€ € € € € € €@Z X˜Φί σG@�¨ΑΒ4ϊβ˜6 € € € € € €€{‚…ιώσ€ € €@h , ΝχΒ¬@@@@@@@‚…| € €€ŠΑΒTaη¦ € € € € € € €@¬ c%b € €@r,LU�‰ € € € € € €$^€`aβ Ή € €@&S@@@@@@@ X˜Θά@@ ͺΑΒ¨&μA@@@@@@BA€`a(Όζ€ €d@‚…π₯σΘ € € € € € € &¦‰ΧΔ$@@τ'@°0ύ½Sž@@@@@@�‡ΑΒτρy @@ Ν ,Ls―Œ #€ € € € € € €@ X˜A^4‰ €„šΑΒP{#Μ@@@@@@π ,δ;@@ U¦ ;7E@@@@@@b X+@@’C€`ar¨rM@@@@@@@ ρ oΘ@@ @°0hœ‚ € € € € € €€€ΑΒ@ζ € €QF5a € € € € € €   Cα-0@@  ,Μ€/GF@@@@@@4!@°0MΌ&&‰ €€?‚…ιοςD € € € € € € >¦χΘS € €iN€`aš{eL@@@@@@2ˆΑΒ ς’yL@@ Τ†Ϊa> € € € € € € €€O€`!ί  € €©"@°0UΨΉ) €­c@IDAT € € € € € «@¦3g#/Δ:Š € €$±@νz—%ρΉ € € € € € € €@R,L E� € o‚…ρ&γ@@@@@@@ E¦37A@ X(Β6 € € € € € €  Cγ=0 @@ Γ ,Μp―œF@@@@@@4"@°0Ό(¦‰ €€7‚…ινς< € π�μέΌŽυΗρ++[ΆΜΚ�‘½·ˆ"’BfJ$ QR**D(2’€ΘΘή#{‹Œdnqθ_Ώηίη~žσœγLΞψόώ―�yξ=ήχ}Ξ+|Οu!€ € € € €Δ‚…qεIr € €@, XΛ—‹ € € € € € €ρF€`aΌyΤά( € ³Ζ¬ηΑΥ € € € € € € €ΆΑB[‚O@@»*@°π�rs2@@@@@@@ Μ ΓLΕ† € €Q)@°0*59 € € € € € € u £Ξ’#!€ €„C€`a8°Ψ@@@@@@Έ‹ ο"6§B@ XdΑ € € € € € € “Ζ€§Α΅ € €ρH€`aςη3ϋ=zL–,[αcEχŽξk=uϊ΄Μ_°(ΊOΙρ@@@@@@  ,ŒΕKG@b³ΑΒΨότbΖ΅wξΠNR€Hαχbnέ ”C‡Θž½�ΘΖM›ύnΓΒ; Œ6XͺV�δlψβΛmeυš΅Ξ|lœhΫΊ•τθΦΥ\ϊΝ›ςh‘⾍‘ί‘*•*šύχύ»_jΥmαcEχŽξk=~β€T¨R#ΊOyώ_’x1Ι™#»d˚U�]Ώ&Χdο?ϋdΫΆνrεκΥh½. �vx΅ #ΜθwΗ;½›Ύ;₯Hž\:vxU<]W2gΚδ»Ϊ™ΧΐρΏ’Ωsη;Λ’j’I£†ςNnΦχTJΏ‡ ”οF‘/ ρ»ž… € € € € €1SΰΑ¬Ω€FΝZ’>CF― αB[‚O@ˆ+q%Xh?γǏɼ9³δΜιΣφ">£Yΐ, p‚:Ι“'“²VEΊti½«~οΩ»Wžͺ�\4_Uμ9|xΓ[±ηΞBΎRmλ¬ννQο™F’-#:FT.τύΒσnκ3:ψK'ΠwβδIωy�―ςΣ€ΙrφμYs"­f˜?>iΤπiψL}I˜0‘Y~τθ1λgBΓ(i<ν·Ÿ­φǝ[Όt™Lšό›Θ—OžiPOΚ•ΛYχχ�έςτ³y&@@@@@b�@ΓΖΟK�\™ Όtρ’¬[»JͺV―eζ Ζάηγ―Μ7T˜$±Uy°VΨ+šύηZ•­ :ΖψGΞ"€ €@8βZ°PoύVΰ-ΩΈa­¬^½J��ίpα aΣp Έƒ…K—­6ν;y‘VκςΥ€ΟΌΪ%?Q’Œ"zω₯­€Q³Οάy ‚U.«V΅²<ό' ΄ύ―²zΝZ³mŽμΩ€VΝκfϊΦ­ΫςΓΨρ&4TΉRy)V΄¨άΊ(ϋφν—ί§ΟvL³ΣΎh8©fͺ’-λƒ’Ζͺ΄vζΜY9l΅o>σP§Α₯ςεΚHή<ΉεΑ³ΘιΣgδΐƒ2kΞά`ϋi»Ψ|PΊ½ρšs5„š=gžάώο?™6}¦Yž?_^)[Ί”™ΎvύΊL΄ΒZΎCC[Υ«W•|yσΘΓΦ5\΅Bž{φώ#Ϋ·�ε·m²ή_Ω2%Νaτή¦N›aΉ=a�]ם;wNv[aΏΖύθ{*g^―KŸAΞμΩ%UκTV€μœ9rT~2UŽŸ8ιlη;ραοΙ M›˜Ε@+_Ή†ο&’U‹=QDςζΝ-©¬JΗŽms&Έδ^Ϊτ·CΎ–κΥͺψέ$00Pƌ› Ÿ ψ2Ψϊ.;H»Ά­E™Ιwθ/*ύhέΫ§Ÿ{�Yb‹ζΝςέΜkή�δΧ£[WiΫΊ•³.@•½ b…r�ο£>&ΰe/sjX±η{½½‚^½ίGZΌΠΤl¦εfYaF{ή½ο‘£G₯M»NΑBk_~Ρ_κΦ©Μ[χU£QVΠKΫ:ϋ fΟ°~«0§Y₯AΆξ=ίs6ΣpΨ§(ujΧt–Ή'ΞZΗO>ΰΰto°pνΊυ�΄I#χnfZƒ‰mΪu πΤgρυΐΟ₯p‘Ηƒν£ Τ―«zΣ–ΎξΩkυ ώj€Τ©4ΤλmΨΈ™sή6―Ό$―wξ贐v_‹šΆΒ΅_ όΪ½XΦ¬\βT cw_{£›Χϊχzφ 3ΪCί­πΌ›ΊŸV*¬Y½š9„Ύ/M­P‘ή›~W(_N²ZαΩν;vΘ‚‹€eœ&uj9qς„?~BfMŸbGS™}»Όω– ΥΎΣ£›Ό�ͺ₯Y¦_όύ\3j„”+SΪΩ¦ΞΣΟΚu+t;oΦt'˜©ίχ“ ϊω’�ϊσR€p!g?wΘΩYΘ € € € € €@ŒO°P‹<4jjύb��;ιψ»ΉoΏ$Χ�]σ·κž/#X  ͺB…φ₯.΄%ψD@Έ$—ƒ…φsΪΉγ/YΎd±ΞΉb/ŠŸ 2'–€M�Ινγ7εΪdO«Ρ{qca Ž5�ͺŽη©Έ§ΧΨΎσλ²pΡ<Šh°P«Λ όU˜nωΌ2­\­ΆΠ m§wίξ.ZEρNγνw{Ι”ί§;›ΉƒzΞB?_*C‡ Wx+΄`a«zέ¨‘ΓδΎϋξσsΆ EZE�z§a½^έAƒzΝ_jξ}ύ»|CkoΎΥΣiŸ­'πmeλœΤ5‘!ΊV­Ϋ9ΥχάΑBΧf~'΅ϊ [ν‘αΐ₯ ηZU)SΫ‹ό~ξΨΉS<ΧΤk]d―Υ,τ}ΊΣ­n££ϋ›―K»6―xίί̌?f‹šΪ#Ίƒ…κ·vΥ2¦ΥΠg£η››ΰζΛ-[Hξ]Ÿ^Ύƒv TC“΅κ60-‘?ϋ€―Ή\;dͺUΥΦKύTBέΎi­ά�ύf“φύ+΅λ=c¦΅*a’Δ‰Μ΄mgG?ΧώΉT�>π€YD[v· Σ € € € € €@μO°°]ΗΧ$ΉυχΩ:�_Ώ&¬NGW�ZΏψžF�¦MkŠ(ŒψφΉz%fώ["ΑΒ(~7£:Th_ήέ ^»ωŸ\·ώ�H‘4$ς.Δ�¦ΡΊόμ•[Rθ½έζON%ί½’=ZΟΎλψuΩ΄?@v½.—―ί–ή/…²ί/₯s§°ώ17|Whuμ“ΛΧ¬/αzŽΤΙbΐΓΗ5³) €@ΜˆΑB}Χ­ί0Z±b™lέΌ)f?0^† “½˜Qξ³ώ»ΰφω@Ή:δxχŒϊΝξ,Τ ΟΚ%σ½FZ]LΫΆF¦b‘Ώ`‘‰V―Y#O)lΪ"»οΦ_ΘΝ½^§΅ρΌYӜήΕ‹—¬ŠgSδςε+R¦tI)ωdP{VmΙόβΛmΝ!τ>fLμu`Ϋc΅¨Υ–­Z!ΝώέΈyS+β9ŽΆΐ!½SνMΆkχΩΌe«άΎ}[>ϋβK† -X8gζο’ϋ‘‡Νuθ YΝ_°Π΄nΤ°Ύ�uƒ† “oΎ‘“βdΣežΣΐ—ΆΆΓWΊ\‡Άμ΅ƒZξp–ώφή7ΓFΘΎύϋ₯Έu―­_~Ι³ƒυΥmd/ΤΐΩ»=ί2³,QΊ‚ψΤφΘjb]?mΖΦo^—ςeK;‘4]ΏuΫvyΞ ±ιπ,άf΅€>l΅eΦͺv©­6ΝξQͺ|§zγ'}{Kγη:«Υ`ζ¬9ςŸΥŠϊ₯[xUtΏCQq­κ©�Zε²{Χ.Ξ5h@οω^’ύ˜eΖΤ�€Σ…+­ΦΗ7mmGmW ΤεzέM[΄2λt>"ΑBέ/¬ο¦†p5Œ«γ»Qcδσ_™kšφΫ$§%±YισΕκbϋwώ½Kκ7τ΄ΘvΏΧRΈxiηΎίϋC† ­Xz§Ρ±}[ιΪ₯³³™Άωώ€�Ξ< € € € € €±G ¬ΑΒ€I“J«ΰ… βέm)a‚„R�R%YΉt©άΊ}+F,ŒΒΗ]‘BϋοFΈ°Ξ€ύ²ι`€}JΏŸi’'Η²&•Ν”‡3&ρ»Mt/<~!Pžθ΅Ηœ¦\ήδςΫkΉ’ϋ”χμψ�žΊ!Η ρΉdJΘ Vf“RxΞaΉΠKΞJο)'Β²©Χ6�, Ι‡3Εθuf@ˆ/ΑB½γsηΞʌiSεΜιΣA±pΚ*όοΪ- wZnŸΈyΟξΔ,}FΚT¬κl§AΣω³ƒͺRΊ―7*�Uƒ…_ "ύϋ}δO/[Ώ Ω� ¬j0�Ύ!Π_§ό.οΌίΫ^-Ϊ‚ϋ΅Žνω K‡Χή0σvhOgΒΪ Ω>PXήMχ»]£N}†ΠΏŸ4¨_ΟFίΉQΦ; ΑΪΦV+g;°κN7ZJ–(.7nܐǞx�μη{Oν:v‘EK–šuΪ*»QCO…B RV«U7X{kϋμΟΊujΛΐΟ?qŽΪ6ω™FMƒ΅ψΆ·η@@@@@ f „5X˜>}Fλοέ_17sφμY;ϊ»˜}c~�Ž`‘”ˆ,Šh¨π’Uδy‹Ν)λΦ¬"©R¦υτΡ.¬ώωΏ²ύπ΅P―Α^©μzΥΟ$«₯·EΙη†ύW₯αΰƒζXέŸΚ ―UΟμΈρ%X¨U +ΊΟͺώŒ Ψ‚IrJ₯ό‘Ώ?φN#Ÿ‘ήS=­Νμeaωά7 €$OB°0,Vlƒ pgψ,ΌxK6nX+«V�Œ±Ώitη'εΩ"¦… υͺάΑΒ;έ‡VαλρΞϋ¦ n•ΑB»ͺ} %Š“‰γ°g­ΚƒSE+Ξ…whΕΕΤ©RIΊti₯sΗv&,©ΗΠj†ΕK—7‡gύ!T+κΠκje*TuŽΊLlmΫΌ,χY�Σ1� ^ΉzΥL‡%ΌR°°SϋWε.Μqτ‹†ι4Tηί*•*z�S—?Q’Œ9·oXΝ]O·σ vuοωž¨±wZΧΐΆΰ]³v©Έ¨ΛBξP’o₯Ήm׈RulΩΊM5mαum‘[«†'ΜyΕ ΰεyΎΎΑBwRπϊk₯s‡vΞ±τœ:m†UΩ²Lžψ£³\+ϊVΎ1l°S)Π<Œͺk½y3P�Ώu―†έΪ΄ομfΥ‹3j„©Ό¨ΣΊ}y«Κ‘ώε‡{Έ„Z T«‚κp/Ž`‘mοώ6i‚.τΈ9Ώ]ΕPgάνœέΑΒ/ϊ,ΟΤχ΄ιΆ«Ij•Ζ…s�p—ς}οƒΝ15ˆ«ί7:ό½'f…λKΥΚ•dΘ ¦]³½ΈχGύ䧟±gωD@@@@ˆea κm½Ρ­‡ωϋfύeυ}�μ•΅«WΙργΗbΝ,Œ’G5ρ·™’t$IœXκΥͺ"ι­ΌΣΨΈε/Ω°e»Ω¬x‘Η₯X‘ Κ!νλ.Τ0bΣ†žͺ !νΦεξ`‘ΆΞ’&‘³λ«uξήγ7dλα― ΫΤ.9₯Lž°ڜƒ…2±ΰ―Λ�bΔ!³E›ŠιδγF™ƒm‚…7�“’μ‘3—=εN³§K,}f–rySXΑ„�dюΛςφ/ΗM[dJqΩώIΎ0UάzπšŒ�σ|0W߁Φy&�ΪξΠW$qB‚…ΎNΜ#€DL � :$‹Ξ‹υU υιΖΔP‘^WXƒ…ZQ°σέΌBSQ,τͺs_[Xƒ…μ`΅L­XΎœ|Μν„Ύτ^έΓ,\<–dΟ–Ν¬ΦVΊ žkκή4ΤιΘ έ•ατ$v(Λ}Β.¬jv‚ͺΩ5{ρeYΏac°Š…vΰΠή·t©’2ήͺvhw°π끟‰V€σ7τ9/YΆ\ƎŸΰUuO·ΥJ…Z±Π ›Όΰlγλ0~ΒDω¨_{ΣP?νp›n€η/Q¦‚ΧφZΉρΗ±£œev°°α3υε³Oϊ:ΛΓ2‘χΡ"&Τζ�2Ρkυ=Ÿo₯E{ύ’y³Dƒv:΄=²Vτξp«Ά§.T¬”Ω$Ίƒ…ΜΤ€¦υύΣ±|Ρ<Ι’ΕσηGwΥΙjU+Λπo<-&άΑΒ±£FJΩ2₯Lϋοό5ΗΠ/“'Ž7mΝuZ«‘Vͺ^Ϋ΄Yžωϋ―ΊΘ me¬-C&TψυI’$¨Κ�·#Ύ—/­J‘ @@@@@Ψ+ž`᳍ΛCyΊ-Ωw¬‘.]Ί$+–-–=»wΫ‹cδ'ΑΒ(z,ߍ›δ©a½ša κ κ~.œ23¨"HΫ–ΟλβHw°p黏Hώ,χ;ζ©K�dΨ!ΩyΔSΩ0mŠ„²σΣ|ΑΆ‹θ‚…Ήι›.Κ«?13YΣ&–5X�Έμκ;y1Π„oέφμ3‘}©φhʈ�ΫoΐμS2`φi³Όv‘”2¦mŽ`Ϋ°@ˆ ΔΥ`αu+X³bΕ2ΩΊySDibΤ~15T¨Hξπ^`` ,\ΌΔΨ)TΘ ι‚ΉσHηΧ»™uφ—¨ ΆnΧQ–-_iΪ|Ί«Κ…%X¨‘ΒVhΙqyΜgΖ,\ϋηR§Ε«V½{ΎωK>[‡<λ¨ O+d iiXΛzσ―΄j)οτr·[ΚϊV,τέ·XΡ'd�„±ΞαάΑBu�v΄ujΧtΦϋNθ»Π«O_ΡΆ½φpŸΣ]ύOΧηΟ—W܁±°΄�Άλj{α VE?χπ­Lh }mάϋ„4­αΉŒ�GΙ΅ϊžC«ώ5mΡΚ [ΪλέοWHΑΥαCK΅*•μ]Δ~žΡ,ύέ·¦Š§ώLBΕΜωέ­§΅ύΈ>K―Ά~Yήκφ†™v �\ΆΠ2Ν 'O’r•ͺ›υϊεε–-δݞA-­λ=ΣHjΥ¬ξ΄}Φw¬Dι NυOgΗ�OT�XAΎ±*ήП§Ηύψ“τύδ3ίM™G@@@@ˆeα κ­-VBJ—-ηtNrίξ₯‹eΜθο%0π¦{qŒ™&XEΒ, OΘ/’ΑB½μˆž3΄[K°PχΏpυΆ<ώήnΉyλ?sΈοε–<™“˜J†g�ά2ΛξOtŸ€JšΐLϋϋrνζN΅½4ΙH Ž»rύΆ,ΩyY:?jvyΎTιΥΐSq"iβϋ$₯U•OGH 5`·fί9r6P ηH*ω¬`€ΆlΛΈdUd\Ώ?@N^”'rYϋf}ίΛΦ΅κ=ψή§Vόλθ5)˜υ~y4kRIb9Dd΄sD¦mΌhvϊbVyξΙ4~Σ~μω}ƒg».52Θ»Ogτ»]xκ½ε{—\·*'κXί'hΥD €Q%ƒ…{­ί*Z΄`ž6ρT²Ž*«θ8N�Ζι%A–Drν—³rϋ„�?¬ΔδP‘šΈƒ…K—­°ZΉzZσjPLF xώΫQΫ ΧoΨΔ«U�o°Π_%±u«–Ιi<� ΆyΛ6iάΜΣ·Fυͺ2lπWΞc‰Š`‘»U«XΓƒ«Φ¬‘mΫώ’‹Φo­΅²‚N<ό�ςj…μR:|DͺΦ|Κl–/‘ Ίƒzz.­d§νάCC… ³‡ΆΘΥVΉΎϋΪA4{»Π‚…φ6ΐ¬ϋTy�j;]ΈπγΞs²ΧϋVœ3σwΙύΘΓfυΜY³₯kχžφ¦ζsώ-ΞΌokkg…Ÿ‰ˆ λΤͺ!ƒΏΰqρ�eςΗ¬9ΞΌο„�fϝoGΕ΅ϊ_ηΕή,F},Œ’Ηѐ_l *[ΓΑδΟ½Wΰ ζYEC€»Ž]—JŸξ3Λ�$O »ϊη7ΣώΎ4z@–νςμ�e³eΚϊ ²bgήίφΉ2hΥΎΩ}όΊiAΌλ³όςΒ·d₯uύvυ@{ϋΆ•�IŸg3KΒΰ‡°7ρϋ9ίj ½ν°§*δ«•Σ9‘Jߍ»�|L~ό[γξu2Hχ:Q,όtΖ)4ίS­PΫbn“έχΤΜ#€ )Έ,Όpα‚,]ΌPτ?όcΛHώZIπ@"ω/ΰΆŒ?,\ΣC…κR°PΧihKΓ[φπ =”+—ΜŸ=έ^-[Άn“FM=ΑA]θΫ:7Ίƒ…vυ5ϋ‚4 ¨AA{ΈΓ[ξŠ…ξ •nk·ΆχӊyŸ~ό‘=+[ΣΤB‡oxkΤc₯�_:ΫκDn]₯mλV:i†ώz±y3ωΰ½ pήπ‘ίΛΐ―½[Ό.Y0[²eΝjφsW•‹L°P_φpΰͺU­,~πždΞ”Ι^mͺjAίϋtW@΄7^΅l‘d°ͺκ°ƒgφ:ύlΥ²Ή<ίΈ‘Y€χςό -M΅Ίˆ }ƒ­kΦ�“­ΪΈOi¦ν –W�˜–ΏΊ0*�υςεΛVPφE3j„—™†΅…°=†|=Pj[•ϊμ‘a:ϋύΡeϊ}4gζTI˜0‘Ωdσ–­ζΈ:cWΤι7oΚcEJθ€3ΆoZλUΡΟ~·tίgζοέμh΅ οΪ₯³9ž†φ4Ό§‘Ύο†γœ#€ ­Ύ˜-k6I“ΖσηΔ/΅–5λΦ{mξώžΤ@μΓεrξσχ{{UΔ΄wτ*ό~τXωl€χχ•½=Ÿ € € € € €±O ’ΑBχ+ρ€Tͺ\Υ,�ΆΘߏζ^c¦ FΡ£ˆΑΒΧ'•Ik.Aw₯ΌΗήέ-g.{ͺ.θρ°<ž=i0e­N˜λ͝&„§Ύ} Hσo:AΕ`;X rXΥςΦYUσtΈƒ…Es&“CgoΘι�ŸΣlΰσEƒ‹/”yΐg©H›Q‡eζ–KΑ–»$³*%ώΤ!‡”Ι”Φυeϋώ#ϋNέ]�δ#ɜ€{_{Ίζγ)eά«QίFψ?«˜`±φΘ1«Κ’ŽIrJ₯όήΧi_Cx>―ήπT+΄+Rnό0h;f €Q)‚…―Ώω–lή΄QVZ­­ΰLl&8Ψ2ƒά—4a°palͺuhΑB <͞1E%Jδ<ίPΤίΫ6:A!mm:πλΑ2ρηΙ’*UJ«ι—R€p!gίθŽ5RΚ–)εœΟj�ύ«­­�…ΞάΑBί–Ί΄*7v6ΥΥ`ΘΧ€@ώ|Ξq΅U²ΆLΦαή�±/½�V4Œg‚…ΎU!―ZΑ·7{τ”…‹–˜]?�τcyΆΑΣφaL‹]­*§#’ΑBm<ψΛ/œcώψΣΟςαǟ:σΥ{ΦρŸυΚEŸ,kΒ‹—*¬…­o;_­ ψj‡ΧΜ±J=YBF~ϋ$OžΜΜ_ΎrΕ[g",Τ}έύτΊΪwz]–,[�«LKμŸΖ1ΟHηυΉV―γρŒΚkΥ{Σp‘ϋϋ€Oί~2aβ/zΪ`-έοWΊtιdԈ‘ςψcšmυΛcΗΛ'Ÿy*1ώϊσ^ίCښzΔw£Ν»©ν¬5|ΖΩO'B ϊ{75tΉ`ΞLS™T+%V­YΧ<Χ―~&uλΤφ:Άϊ.[±RͺTͺθ΅\g&Lœ$}ϊ~lΉΎΏϊϋŽ€€)\Ό΄οbFΦJ¦ξφΗ³ηΜ“/ω:ϊVψ v@ € € € € €ΔH¨κ1ΪΆοhua½O�ZΠF σ�wΙχ€`a=ψ,lπυ«ν°§ΒΰY₯qIO›Έ~ΣOɐžJwΝΛ> ›>LyΖζK�vτa³Ό|ήδςλkΉd—UύοΠ™›²ζŸg Ι΅΅ͺυιΘ”*‘Ξι )Ίƒ…f₯υ%―ΥΊψΥΚi%·Υ’yο‰ςιΜSrΞΥ–ωo«ͺ †ν1nε9ι1ιΈ=+σ'—g‹§‘,$– ϋdθΒΣ`΅Φ‘-wZΥΉͺΪΑBϋzμ7­ŠOδL.§.Κ°Egdϋ�+κ6σΊ?μ\Ώ½Od>΅UqG« ς¬­ž`€»’cdŽ«ϋφžzRF,>cS―H*ωΎ5Υ #kΚώ €ΑβB°0Sζ,rςDΠOΏΛ˜½Δ_ΈP―8Ω‹εΎd δΏk·$`άι`Υ cΚ]…,Τkτ ·ύ΅c§<Σ¨©sω³§OqΪ£: C˜ˆξ`a―wί––-<Α;½ Ζ\³ΪΈ&φ }ι:w°PηΞύCrζϊο5mύ|ωςI:•�vΖΡ£Η€RuοΐΥ_›ΧYηHβl£,lά΄Ήω )X¨Ϋ}Ρ�cy¦Ύ'μ¦σ:τΊ―_Ώ.I“zώ»έ^φBΛWDΫακˆh°Π7©Η�Jrz_ω¬φΧΊή{χώ#uκ74³ξπίΦmΫεΉη›Ϋ›9ŸHœe½‰Q΅Κ^ΰΝ@'Phoμn₯μ>ΆΊU¨T%S·ΧŠ‘“'ώhο*=ήy_¦N›aζ[ΌΠΤXΨ+ΥnΧξ=VΨ5Uο!―ηξ�ΨΥΧΪ₯sy­c{ϋ2δΪ΅k¦z§^‹w`Sηυύ��λpϞ;'Uk<ε„6ϋφι%M›42Ϋ…ε‹;X¨ΫίιέΤm~σ½”*ω€NІψΊXaoj«UG³gΛj½#�š6Σsη/Nν_5Λ3eΚ({¬wdώ‚E2ω·©f_Ά¬_μωϋVu΄χΫΆqΧ{o/ισΝ·zʌ?f‡΄šε € € € € €1H ΐ£Ιi<Ν’άŸDŠ—(i�ξκΥ«²Ε*Bbm[·Θ•+—ΝlΜIƒηΙαdι’EVg"OG["Χ©[O2ώΏ Σ‘ƒδΧ_~Ά£> FΡγˆoΑΒ£ηεΙ>{œΆΏΪ’Xƒm:ά‘ΏΪ!»Ϋ �Ψ.‡T,₯σ$X-€[Œ8dζΫTL'7Κ쬳'άηΠeu­πΫ(Ÿπ›ο φάε„'wΞ%ςyZ§ω�ϋπΩL��Чυ™}޳V(±²ΥΦω€ΤΡ­vFyλ© φj§b‘.HyΩΤ7― :X5ΏψWΆΊfu�ž^ή―τξνΒ2­Υ!νΌ,uη\³ωΕ}λίM%Lθ΅l‚ΥΑθτ©SΞ²˜4A°0ŠžF| ξ:v]š ?$GΟyΪύeI“H6[‘:χ¨άŸό}τΊYδΫΩέY«όύ;°€{W o°Π*θ!»¬j„ξσ½~;!ί-=k»Γƒ?―>/oόtΜ,w·Xφέю+ςΒπƒf±oH�]±0€VΛ w\–ζ–•Žj¦4α?3/M‡”%_ Άη“'—Ρm²IF«’cTŒχ~=!£–y̞~"•|χJPυ›¨8>Η@@ΐ XhKάϋOwΈP―&¦W*΄Ε6�Yα„ι–.[a΅ξd―r>?όΰ=y‘igήέβV6¨_Oή}»»€K›ΦΩζΘΡ£2zΜx)Q¬¨*Z΄d©΄λΨΕlS¬θ2iΒXg{»m±³ΐšX·j™υ›kžŠήγ'L”ϊυw―φ;]θρΗ€O―w₯p‘ΗMε?-�ϊƒδτ³$ΰZ€SUξΔΙ“RΎ²we< &~όao)ωdq' ©'Ρ?€�XΉJ>ψ• ϊžXƒ]­juOΧ«#™��›q|Κͺφ§Υέ­–΅αγE=Ώη>Ξ;=ΊΙ³ΟΤ—΄x~SOΧi0sΏΥΎ·Ώ(΄ΫϋΪϋhΥΈ7Ίxž•  j­Ϋh›εS'›ς�:οδ�ΦΖ/YΥsεΚ©«‘χΊxΙ2Ιάσm‡μnƒό|©42¨yVϋPζ3ΌΑΒΠZO΄„]� |Υj©όQCOυΓήSNȈ%žπœVDΤʈ!Ό=v‰Vρ³ώ]WŽ *θlζ†TΥO+;ϋΐΣB¬pŽ€2ο­‡ύΓ;ρڏGeΚϊ f7»š ϋ=λe”7jUTt― λ΄>γ‚οxͺκύn²ͺjp” €@t,ŒՈΣκbrϋγˆίaθ{ζȞM΄Ε잽{Γ< ύ¨[«ͺT©<½Γ‚²Ο¦χ‘χ£‘D»­½ξNŸznwpξNΫ»Χkψ,]ΪL°Ρ·2’{»¨šΦσeΛϊ  p;~ά!}ύnΟ·δε–-ΜbmΥ[ͺ\eίMBœΧjxiH#’C‡„Έ]T­Pϋ‚ HΒ δΐΑƒαzοζ΅κ»•άΊΦλΧo ξ…d‘Ο*_ήξ>vM>yJτνρωσY€eΉ j;φς°~vϋω˜LψσΌΩόι’©ε»—³…uWΆC@ ά ΓMΖ N?¬*|hΣ1{Ξ<ιςζ[α<›Η <ΎήΉ£T―^Υ«Ε²ου1πk9κίΕΜ#€ € € € € €€ΑBˆΞFGΘοNΧηΌS°PΓ„Ϊ:ΈψΓΙδγ†YDCƒ! m¬­€uΨ퐡�^Ξ7wšΐαƒV%ΌM>-”ΝΆVP�Ε�Γ€ZIP+ ϊŽγε‰^žJ€ Τp ΏR°Πό³Wny$c»›eM†e»�šiwρ^ έ;`Φi0Η“bφΧZΪ½mhΣη�ά’Gίέm΅έS‘j…‘i±@ *F…"Η@΄Jήκε‹œφοΌί[~ς{H›³< Τ©]SrfΟ.Y²d–¬ͺ“ηΟ_ƒY• ɚ΅λ"\•3q+ € € € € €άQ€`α‰ΒΆADC~GŸ”e�5'©XΆ€dΝ’)l'΄ΆŠθ9C;;XΈτ]«š`οj‚‘νλ»nωξ«�ψ›f±έyζ–K�fΤa³¬ϋS€{팾»Ix+F$XψΒπƒ²h‡§jβδΞΉ€BΎ+VόdŸμ>~έ\ηϊ>y$»¬ΤS‚…z-Ήήό[�[U"ulλ—W2¦ ϋβ.ŽΚ/k<­–λK-#[Q­Π€ς@ ΪF-FK@[η~όΡΖ" @ϊ}ϊ2ή @@@@@@ Œ Γu§Νά!Ώ†υjJϊtakG;ρ·™rωŠ'ΰ–*e iڰޝNe֟9{N¦ΜœηlΫΆεσΞtd&’2X¨Χ‘η­]rωϊmSΩpW�όβnAΌσΣ|’6EΒ`—{7‚…}¦ž”α‹Ο˜sχy6“΄―’>ΨuΨ μ{Έο>‘cƒ‚ZGw°P«ήΌ)¦Bd‹rΨ—γχ³DŸ½rψ¬΅±5¦vΙ)eς€π»]H O] ”Βοο‘ZaH@,Gˆ‚…ΡΒΚA@@@@@@@H ,Œ4‘ηξ€`’$‰₯^Ν*a Ž8EnhzΜ)S€fΟέ9X¨‘Β™σˍαΫΟs₯‘κ`α;“ΛΛΟ™“ΞιώΤύrΏiƒ\8GR™χΦΓ~/Ζ,|ΊhjωξεlΑΆ‹l+δίΦ]N㏚γfJHΆ~œ7Ψ9tΑŒΝ—€νhO…Ετ)Κ_ŸδsΆ‹ξ`αΓέώ–€›�™ΆΔ�( I[ΙF?Γέ^ZWί©΅³ŸCHϋ±Gδχ ΝͺgЧ–α/7χ·Λ@ˆŒΑΒΘθ±/ € € € € € € } £ΘΦ„ύζZaΏ�‡Γ.ΤVΘKWzZ!W*wηVΘΎ‘Β$‰­c­°…Γr«Q,ύ‹·%Ÿϊ³G¬χK“'ΣHΑlI₯JO‹ίΘ υΨξͺ…:―Uλ[ΣYν™·Ύ&γ�#}¦žtΠjJ)cΪζpζύMΈ―Γ^―ΑΊu}ς˜Ω¨ꁺ�|L~΄„‘TIΘ”ΧrI!+xθΡ,Τs°μz»μάηχ~₯BZω€qgρβΏ―H³aω&₯�ΘΰζYyΠͺŒ%ϊxΒ‡χY–΅%tΖTT+τBb@ ΪF-F@@@@@@"%@°0R|ώwŽκpαέ κέΤ°_6 07φg―άςHΖ$ώo2K/_Ώ-yή ͺ@8ύ\Rς‘δ‘αΤ₯@ωdΖ)ωuέ§j ΆR^σ'Xxϊς-yόέέζ•ς§Iό· v‡λΪWI/}žΝμΌΊMΧ GEÊξq’ϋ€ϊc)ε«‚_²ΔVκΞgTόtŸμ>vέT1<6¨ ΟZΟ¬Ά\ΞώΖN3S4g2™έύ!ΏΫ…Άpωξ«�c�1―ͺξν³¦M,ƒ¬ΐ`…|ΑM«|φ―μ֐ΰγΩο—|Yξυ2Ο^ΉeΪ;‡Ί+@Έ ο:§D@@@@@@Β @°0 Hέ$²αΒΈ*T»η†•{�Ζξ΅3Jχ§2D””ύ@@  ,ŒC“[A@@@@@@8%@°0š§oΈ0’§K’8±Τ«UE�§KΡCάΥύ�ήψOŽž»)?,?'£–5ηN˜@dΟη$y’θ«:xWo’“!€ €@€FŠ@@@@@@@h Xm΄AŽlΈ0Ά… υΞ‹υήk‚…A ">›IΪUIο^Δ4 €Δc‚…ρψαsλ € € € € € € £ή₯Η£αΒy‹WΚε+WΒuΖ”)RHΝ*εbM₯BϋζŠφΪ#Η.šΩϋ¬…―VJ'6Μl―ζ@‚…Ό € € € € € € €@Μ X3ŸK¬Ώͺ…;.Λ©‹’ωΔR,g2I“άκƒΜ@@\ ]L"€ € € € € € €1H€`a z\  € ŸΖ§§Ν½"€ € € € € € €@l X›ž׊ €Δ!‚…qθar+ € € € € € € §Ζ©ΗΙΝ € €±G€`aμyV\) € € € € € €Δ/‚…ρλys· € €@Œ Xc‚ € € € € € €x ,τβ`@@ΰn ,Ό[�œ@@@@@@ŸΑΒπy±5 € €@ ,Œ"Hƒ € € € € € €D±ΑΒ(εp € €a X6'ΆB@@@@@@ξΆΑΒ»-Ξω@@ŒΑB^@@@@@@@ f ,Œ™Ο…«B@βΌΑΒ8�ˆΉA@@@@@@ˆ₯ cιƒγ²@@Ψ.@°0Ά?A�@@@@@@βͺΑΒΈϊdΉ/@@ † ,ŒαˆΛC@@@@@@x+@°0ή>zn@Έ· ο­?gG@τ[@IDAT@@@@@B X’ Λ@@’U€`a΄ςrp@@@@@@@ Β #Lǎ € €‘ X=φE@@@@@@’O€`aτΩrd@@P†‚Γ*@@@@@@@ΰ ,Ό‡ψœ@ˆΟ γσΣηή@@@@@@@ & ,ŒΙO‡kC@β°ΑΒ8όpΉ5@@@@@@ˆΥ cυγγβ@@Ψ+@°0φ>;�@@@@@@βΆΑΒΈύ|Ή;@@ Ζ ,Œ±† C@@@@@@x.@°0žΏά> € p―ή+yΞ‹ € € € € € €„.@°0tΦ"€ €D“ΑΒh‚ε° € € € € € € €@$Fέ@@"&@°0bnμ… € € € € € €D·ΑΒθζψ € €~ϊea! € € € € € € pΟήσGΐ € €ρS€`aό|ξά5 € € € € € €Δ|‚…1�q… € €@œ X'+7… € € € € € €q@€`axˆά € ΖΖ§Ζ5#€ € € € € € €@| Xž2χˆ €Δ@‚…1π‘pI € € € € € € €€%@°Χ@@ΰž,Ό'μœ@@@@@@Έ£ΑΒ;± € €@t,ŒUމ € € € € € €D^€`aδ 9 € €@F]@@@@@@@» @°π. s @@ΰ ƒ›°@@@@@@ˆ  cΒSΰ@@x(@°0>tn@@@@@@b…ΑΒXρ˜ΈH@@ ξ ,Œ{Ο”;B@@@@@@Έ!@°0ndκ΄±ώžΈΰU+W’,Y2››·l“;w߈% € € € € € ’ΑΒiX €  £S7~»s‡v’"E Ώ7{λV :|DφμύG6nΪμwήY`Δ°Α’-{Όψr[Y½f­=+?ΫΆn%=Ίu5Χ~σf Vn @ˆωq!XψtύgeΡ‚yrεκ•˜―pΗ– ’8q’;ή™pϊφλ/kΦ­ΏγΆρm Ψ₯Lι gNω}šhe7χων©R©’³¨Uλv²rΥjg>6NŒ5BΚ•)m.}ύ†�μΕ—οϊmdɜI:Ά՜χΏ�ώ“Ο|eύΉzΧ―#ΆžPƒvΥ«V1—―!»―μVΦ―Z.i�€6Λcc°0OξG€]ΫW€Fυj’"yς`χ§ τέΡΰtοϊ™ ‘ߍ"±PΟϋαοIƒϊυΌŽ2πλ!2|δχ^˘A@@@@β²ΐγ… Kυš΅εΎϋξ v›·oί–Ω3§Λξέ»‚­‹ν Ζφ'Θυ#€ €±T . »v[�_»&+V,“­›7Ε�'{/;¬ΑB½C­LΧ¨i ͺlΉ·†Ϋ–/žο,πε ρύhg^'J/&_τ�XR§J-«Χ�•N]ήτZgΆm\#I“&5—ώυΰ‘2tψΘ»~Ο7~N>ώπηΌ ›ΌpΧͺΟ9'Ε_~Ρ_ž�[ΗάΑεΛ—₯hΙrΑξ&6 _lήLήξήUξΏ�~―ϋΊpα’$²ΒΤΎACύ­ΨI“§Θ£. jοgΟ–Νλt†`a0 € € € € €@H‘"₯΄mίΡ >tH:(ΉzHΜκω;T ς΅υοQ7γ”ΑΒ8υ8Ή@@ φΔ•`‘-~όψ1™7g–œ9}Ϊ^Δg4 Έƒ…ΪTΫsκHž<™”΅*�₯K›Φλ φμέ+OΥΞkY|ž K°0�ωh[gmοlzΟ4Š–JoφρCϊ$X’LΨ–Ηε`α[έސW[UΡά±s§όψΣ$Ρͺ‹φH—.~ό1iΫζe)Y"¨•χΒΕK₯}§.φfώΤ`γ»ow—D‰όW„%XaZvD@@@@X(P§ξΣR ΰ£ζΚχο�W¦ώϊ‹s­Z·•΄iΣ™ωΝ7ΘβE œuqa‚`a\xŠά €  βZ°PΑ­ΐ[²qΓZY½z•Ζ±ίHЉ―˜;XΈtΩ iΣΎ“ΧeΦͺQ]Ύπ™W»δ'J”qZΞΎό�‹’0a³Οάy δΠα#^ϋW«ZY~(—YΆύ―²zΝZ3#{6©U³Ί™ΎuλΆό0vΌ<”+—T�T^Š-*·nΚΎ}ϋεχι3‚Σμt‡/,(5kT•lY΄ZΉ¦‘3gΞΚaλΪ¦Οό#Τγι5”/WFςζΙ->˜ENŸ>#”YsζΫ―ΑΣu­m”noΌζ\Νβ₯ΛdφœyrΫj―:mϊL³<ΎΌRΆt)3}νϊu™8i²³½=‘ΥΣͺW―*ως摇­kΈj…<χμύGΆo�ΛoΫd½Ώ²eJšέυή¦N›aΉ=a�]ם;wΞj°G~χ£}Š`Ÿz]ϊ rfΟ.©R§’³gΟΙ‘#GεΧ)Sεψ‰“ΑΆ·h[Χš61³'Nž”ς•kΨ«Μ§Ά=Ϋ@rζΜ!3fK—.ΛργΗeΡ’e¦ε¬ΧΖ�Ϋ^―+S¦Œrτθ1ω{Χn™Ώp±umg-υψ•*”“JΛKέ:΅ε#Gύ {-3mλ»dΩr³όΩOKϊτžΏŒΨΆν―`­Όέާ¬gm?3έΉ†υκΧ?Xθζχ_–Η-h�|σ–m�ΈY 3­ao 4Σϊeπ7ίJηŽνœ?8Ϊ+�^ w{υ1A{ٝ>5TT½ZΏ›i»Σ1γ&ΘgΎ ΆΎKη��mkIbΉ|Ǎ›7εG+PτιηžkΦπΣ’y³|7σš·+ωυθΦUΪΆnε¬ΛϋhgZ'4¨Υο£>’Υύ +φ|―·WΈ�χϋοˆ†Ρthθn–f΄ηέΗ8rτ¨΄iΧIφώ³Ο½X΄Z]έ:΅‚yλFj4jΜ8ΡΆΞώΖ‚Ω3$W�œf•ρΊχ|ΟΩLCl]:udΙ’9Λάϊήθϋγ;΄Ίάλ―u”$I’ψ�m]Ϋχ“ώ2mΖf]σfM€O― sϊξ ΑΉ'ΛT4‹Χ¬\βTݜc__{£›Χζουμ!­Z6w–ΉŸΝτ)Ώ8Α»VΈρŠυ—&υZ ―]Η.‘†1}χρί³c‹³hΘ°α’ί2υjΠύνwΝβ�₯JΚψΎs6ΩΈi³<ί<(D¨+τέ5b˜³>/5�S»¦³ΜwΒ]±Ο,Τj¦<όσύμήoι²ΰ‘d]‘w;²?V.]`?3šΛsΏoΤ,^¬¨iα½vέz>Υπh‚ϋ˜ e+d9ΜϊΛ,ϊs§Vέϊζ™ώ6i‚.τΈY�_jΤ©/ϋpζubΣΪ•’2eJ³LΓΘe*Vu~nž³B‘½zχ•SV%ήIΖ:ϋ,t(˜@@@@@8.(Qbλοηί4wι|ι•Ά’άγ«ŸΉgM‘‡FM›K’„ ½–»gΎύf\³ ΔΔA°0&>� @ˆq9Xh?Ύ;ώ’εK4ΤsΕ^'>dN,ɚ€—['nΘ΅_‚ͺ±έν› K°p쨑Vu­ώ₯Uΐ",Τ@βΉΣ=kP¬r΅ΪN•ΔΠΆΧΦ£Z‰νNγνw{Ι”ί§;›ΉƒzΞB?_*C‡”¨ V(WVFζTWσsJ³H«&V―σ΄³:¬Χ«;hˆͺωK­Γ½―:έ­cυΎχύζ[=φΩujՐA_~qΗ{ρ #vοΪΕ: a’c—�¦2ή½†pIΞβΓGŽH•O9σαp ο΄οΜY³₯kχžf³KζKζLž@ͺBK”�ΰυ}’Lυ²‡ Ÿ±ͺσE$Xh#€Oί \DίνΘόlΠwpπWΜ%nή²Υ 2{~ΈΫ>ΫΧπΰ!SUSη'�6Ε 0(ύϋ}$ΟYΥ6uΨοΏ†‚5l ܎ψ~΄=+zŸ£ΏϋΦ™�εΧ)ςήJί>½$[Ά¬Vτ=ώՊ’ &&@@@@@  dy0«4kξωϋΪγǎΚΔ γΝέ-VB*W­f¦oήΌi:ψθΜwΓ‡ΙεΛ—Μrύ��γk’άκβ£γϊυkrΑϊ…ξ«W%Uͺ4V 崦ˆΒˆoΏ‘«WbζΏ%,4.ϊΏœ±ZsΝ_²R.]ί‹*e ©QΉœ€O—6ϊ/’3 € €wQ > •σΊυF+V,“­›7έEέθ;• ΆΜ(χ%M ·Οί’«CŽEίΙξpδ; υ·ΔVZα₯D‰9Gͺστ³¦^T ΅ύξκ5kδ‰"…M[dη„Φ„ςq/σΦVΊσfMs‚m/^2‘Λ֟Κ”.)%Ÿ,αμ’-™_|Ή­™Χϋ˜1u²Χ=j₯³={φšφΒE rŽ©• +β9ŽΆΐ!½Τ¬ξωC―L۝j ιφνΫςΩ_šWh ηΜό]r?ς°s]�μϋΧ Ο-΄ώ0œZ5l`΅π΄ΗΥ  &ί|;Βlλ/X¨•σφύ»_Κ•-#ixΐ9¦NT¨RΓ©¨·φΟ₯Ξzύν½o†}ϋχKq+ψΤϊ堊wn#ϋ`/·l!οφ|ΛΜϊΩ†,ΥͺT²75-ŸΥ1{Φ¬ςZ§φΦ=₯2λ΄ςŸΆΣΦ‘UΜ™ιά§ϊŽ�“œ9{F δΛ'Ϊ’ΦvΈRΫΏ`΅ΦvΎ…Μ^-Λ–―”cVΛεΣVΫ €κˆͺŠ…φI΄Υς«2 ΆH֊ξραǟʏ?ύμ^ζiΑΒU«ΧΚΑC‡L•=}GνqλΦ-Ρj˜Z…²Χ»oKΛ/Ψ«L;cm‹m…–­Ά€Φ‘•σJ–­dΪφκχCεJœP’�Ÿ4ω7ύu6:-‘έ uΆ¨Π6Σϊσ@Ϋ!'Nτsαΰ‘ΓR­VPELjΎΫώ‚…aύΩ0άϊΤjU+λ₯JλvΝ;α~gΝ ?_μ`‘ϋgš>K}¦Ύ?Χ­ί(/΄|Ω9Šοχb³_–υ–‘ο Xθ+Β< € € € €ΔΗ/"5kΧ6·»�>™ϊ«ώ›LbιΠΉ‹ωϋζ³ΦΏ θΏ>˜5›ΩfΪ”ίdίΎ½f:i�€Φv―›i βέm)a‚„R�R%YΉt©άΊ}ΛlΣΎ,Ό ODC…3η-–7nFθlI’$–z5«.Œ;!€ €@Lˆ/ΑBυ?wξ¬Μ˜6UΞXν$cσp‡ �»v[Ɲ’Ϋ'"φίΈQαΰ=zL}γi›ͺPΣJ\εΚ–φjkk‡»τάξŽΞ‡§²oxHΫέVͺVΛ©ΆφΑ{=εΕζΝτ°fŒψn” ψj°=λχ3…υΫjφ~ίiο«•Γ4gwu7mKZΆ’'ψ‘΅O³ηΫ›Ι„‰“€OίOœy­<Φ΄I#gΎKΧξ2{ξ|3―ΑΈε‹=ΣΊΐ·š™. )XθΫςuηί»€~Γ κr₯¬ δ8«Υm‚ τ0rφά9)U�²™φ 3ωV%œςΛO^‘»V­ΫΙΚU«ΝΎ[7¬vžι†›€i‹VfΉ~ΡκlΉρ„Ψφώσ|?:¨u«�ΧΆΊΪήV‡»"œΞO�ƒ”(^L'M;ε‚…‹›iύR΅r%©YΓγ}ύϊuιύQ?³Ξχ9k«ιΡVf{h»lu²‡έ†[ηŸoόœ|όαφ*iΨδΩΆύ/g^'’2XθΫξχ.€SϋWσω>?gE&|ƒ…Ϊ\["ΫcΜ¨’­|νa‡ή4d9ν· 0γl«%v—7=ΑO ΪΟT•ΣΟΩΗpWρ»|ω²-ιy�φzύτ ΊΓ“Έ[a½ϋvΈPƒ¦φ3Μ»™Ÿ ³§O‘έ‘D ΎiΞƎςͺ yθπω}ϊ ωsΥΏάt?m!«V{t~½›Υήΰ²=kBŒ―΄jιΜχύδ3 Σw3X¨UkX­¨υžάCC₯ϊθΈtι’+εyV;΄“*•+Ί7υš^΄x©i©m/t υUkz·UΦο΅YVhξΎϋ<ο ;δθ� ¨έVθMG»Ά­EΫLΫ£…Υ{ΥΫα κχFαβAαF=Žο3/UΎŠiϋ™wΫ7XžŸ V―Τ©S™wΉE«6ζVwmίδ„sν*†ΊBΫkΨO‡;XΈpξ’3GvΡVΙΥj{*f6iΤPϊ}ΤΫl«_μΰΎ­ΑGύ0Vϊ[•Jύ ‚…ώTX† € € € €ρA b•ͺRΌψ“ζVwώ΅]vξά! y -lΨ°N–-^$υŸi(Ήσδ5ΫόΉbΉ¬Yύ§CσF·ζοΗ΅«ΞΎφΚΪΥ«δψρ{Χ ΜΉ°0N, #TD6σ &IlU¬φΚƒf�ΉV₯Γ›7Νι Fδ)° €ΔTΈ,ς{χ&L#€ € € € €qR ΧC; 5˜0aBΡκƒ?+'Ož0χάόΕV’)³ηί₯ƍ¬θˆ†K—-ηό»‘κ�Ε‹2fτχΦΏmάt/Ž1Σ £αQDU¨ΠΎ4Β…ΆŸ € —βb°p―υ[E‹Μ³Ϊ½^‰ρ*i“t’0s ψεŒά>α�+19T¨ΐξ`‘»"Yώ|yeϊ”_œ’ΪΉ~Γ&^­r}ƒ…ίŽψ^Ύ4ΔλΉΉƒcξ `‘ yΐ5ΣύΝΧM¨Ν^€αΑUkΦΘΆmΙEλ·ΦZ΅l!<όYνκ},ί,χΧ†Φ¬αKd‚…ξ žΎFϊ²�ΐ―3i¨Πέ Ψ�ˆζ»ox‚…φ ΄kέ§κΘ“VΫιΒ…πs·ΥΥ}ά-wgΚ-]»χ΄ευ©ΑΕϊOΧ•2VΥD=nΆ¬Y½ΦλŒV…Τκ3¦N–ωσ9λ5iύm‚3ο;±eλvΗ(ΌΑΒυ6ŠV|tίVΣnGχ{qξόy)YΆ’{W3=fΤ)WΖΣX�2€@!O…@ mͺkHC«B.[Ύ�YνΏ-΄Ϊ$·οΤΒΨήhΛϊΥ’ϋΔYo{; ¬‰θ ϊΎŸαy·#σ³aξΣΜχΈΆΣ.Z²œΉέUΛI† ιΝτœy €η»½€ΌΥ~[C‘Ά§ύ³Ο]!τ‹_ΛΘQ?8dujՐΑ_ pζ_iΫA†δ„hΏ<Τ«½΅³α�'ϊŠ0 € € € €ρE yŠ��Cg―Ϋέυχ™5s†³μ՝$EŠ”fώ«Ÿ9Λ}'�§Ο(…¬ΏΟ�?φξ>ŠjνγψCο½wιE₯¨ˆτ&Š t± ]±aΉψ’ UE"EAŠ(**U:R)�Kh‘'ΌσΜ:Γμ&›ΎΙ&ωχs³3gΪ™οΩ{?/δΟsΚ–½―Υώ=°_ζ�<ΗΪυ«O‚…q<q*΄†_ᐛwδΊρo-Sϊ”’:₯·£ρΧxν–TzίUτρϋ²ΘW/ŽΏ‡'Π“φ\—m‡ƒeχΙλrυϊm)W T*œN.™Ι¨π»A©ηΪ}ΧδγήΗ.ά”βy�J…‚ιεΡ2%s:?˜πΨ½W#€ψ©@R ^ΊtIV­ψ]τ�ρO,-γ«$evγ_U…ά–ΰιgΓ„ ύ=T¨Ξή‚…zLC4¦±ΪΊυδ…Ξέ¬]qVχ�ΞΏvμ”Φν]K‡κΎη�ΉΎ~ύΥx©e†¬VΏργ’AA«Νώα[Ή―REsΧ,;κ3i�θξrΆΦrΓΦuχW�dTψϋΘΪ•AC>΅Πζ,œ=ƒ…]ΊΏb.γ¬ΧXΝΉ|π›7εήΚΥ¬Cζη�m›$]ΊtvŸΣΡ,Τ<—δU“εKΪU΅R‘zΕ€9ƒ…Ίlt­ϊMΜͺxΦ½΄*’α¬ζY=P—τΥ₯}­ΆyΛV{d «j°Ο³9ƒ…7o†J…ΚU=O‘-FΥΓlΩ²šύžΟΤNo cσݎM°ΠωΏVΧ3œζ%}�»v™�ϋ:ujqώοƒσ|§Ηή}ϋEΨΪ4x]§A³Z₯σ|ηΆη'©XθΤa@@@@’Ί€�£• ΅]Ώ"γƌ²_9eΚ”ζ 2)ŒΰŽVσΉϋοYμ=6ͺT«.uκΊVšΡe‘'Mηq†μ,ŒΓyπU¨Πb|„ ›?,ێ[ χ3[Ζ”r―:ϋμ™f-ά“|άp)TξοηϊΕ}Ν�eφ«Ε|όΔ„»ύ‘³7€η΄“^η%oΦΤF°²5‚?‰©EŒθ˜?½cDΑB .\0G4hc5 Z‘:νϋgηVϋ‚Ί|ξgŸ–™ίΟ’,Y2ΛΨQ#€ς}•¬KΕΧΑΒi“Ώ”Gjh-Χ­Η‡~ς™|=uΊnšMύK[ύϊ9nΒW2rτXg—Ή=|Ψ`iΡΌ™έ�ρπ2ιλiφΎn8ƒtΡ Ζζ»›`aΫΦ-eπGšο°qΣfιψΒΛζ�Θ?‘b­°κlΊœχΙS§μ°±uL¨}₯Ίη-ψΥκ²?=ΏΗց¨,‘N°Π�β@@@@’£@»g:HΑB�‚gžΥ kΧ­'U«=h²>xPζΞ™%"­pΨ₯{O£X 2VB›8.μί…GιF>>‰`aΗ4Txεκ5ωuΙ sO4�'Y2ί-uήΠ|.lψΙ!Ωu<$ΌG‡ιΣ*yύšη•ž \K3…9!†’–£šWχy<·ΌΪ0w˜;%—`‘V)¬;τ`Έ‘?O”z•:e#ώώ8― ½mTβό―4‚‹‘΅Η*e–©]ŠDvΗ@ˆ–@RζΝ—_ΜˆΦ{ϋΣΙαu|:ε‘F₯joΥ ύε" κ=Γmοή#O΅noαό9RͺTI{?’ _ ϋυ}W:u|Φ‚ゃCŒ₯JΣΈ…#υg°Pχ_ό«-r·‚·V »jό9#kΦ,zΨn'Ož’: ³χuγον›νεP­Z½�MϋfΐΠ[°PΟύtΨ yͺω“Φe槎ϋϊυλ’>}z»_ϋžντ’θrΎΪb,τ Bκ½ό{Pτ½ΚΥΧτΈΥtIέ¦Ν[š»_Ž#υκΤ6·=CƒΦωΞκŠΪwϊΜΩ·�€Θ—OJ‘.ύƒ½6Ο`’ηuΊμπΡ£Η€ˆ19sδ0―ΡΌ|€v};ΠψPυj2cΪdϋΈnhε9ύŽΆyΖU9s`�~�Ύmk·s"Ϊ‰(XΡu:?­Ϊu0ͺήύΡi^y ½žh8>P�U/Μ)žΛ:['„· ±{½w/³β už~›•$U9΅Ε4X¨ΧΖτ»›`‘>w›p͜١\F�ƒεΫ™?j·θRιά_Y²fΙ"ϊΦώ€Σ§ ƒ.ς°±l·¨5Π©ύΦΟΜ ?τΌo¦|εθqmj8WCΊ5‚…ιp @@@@’Ί@α"E₯M»gΜΧΤίΑόΎt±μΪΉCξ­XY6nl.˜>u²œ?wΞζ(ZτiΡͺ΅7ŠA¬ZΉάXνηΌyL—DnϊD3Ισί*Lǎ‘Ÿ~Œψοiν›ΖσΑΒ8Ÿ9ϋΉzνšy·΄i�H³&υ$WΞ»ΏHςφ˜­ύ-ώ΅Λ<\΅rE©Rω^o§ΪύžαB #Άoy·Zƒ}b 6œΑB]b8Ά»^.ΛδΈ!;Ž»έζφ.*5JE=ΠΩ°–ύ}U:NΓξ֊|£Œ*ŠΦύνŽ ­†ωώdΞΟσ½"ž‘D=xΡXV½z WR}—/ωΥ¬Zηvα;ZέΠΉ„sDΑB {:—Mvήoζ³δƒƒœ]ΡΪv υΏ3Ξ�Ύ9o€ΑΙ�υ3ͺιΝ�ΕΩmnkυA­Bθl”kΡκnΨyL—¨ΦŠŽi�άύσͺwV^ŒM°0¦ίνΨ Υ5υΏ³γ%Ζ΅jc\΅5+–Ίp΅ΒαƒΖχΝY)3Όg, O…>@@@@HNO·n#χάγΎΊŒσύχύσόϊ˝ΑΒU}KHΩόιΒάομ•Pi;ξ˜μ9αͺl˜#S*Ω3΄L˜σbΪA°Π%7Ϋeι:ε„ΉS0GΩψAIΡ₯‰νΜεP3|xΛ¨>¨νΫξE€AW… WχŸ₯ίΩ+WŒ°¨ΆQ J»‡²…9Ή�ά32a…+1]­xFω區»δt˜—§@ΐη }Nε8Γ…z‘ΏW*΄^lλΖ΅v˜nΥκ΅Ζΐ½¬Cφη€ή—gΫ·΅χW¬Z-]{Όjοk ©ο»}άͺ˝8y�Xͺυ©VεΡεw΅-_ΉJΊυμmn{†l¬e‹Νƒ�ύΨΌ~΅dΟζϊ�―Ύωv¦|4x˜σpΈΫ•*ή+ύϋυ5—7Υ@žVΙ;cόArώ‚ί$8$X^νΩέΌN«ι=Z·‘Ϋ=4˜8hΐ‡ς`υͺvROΠ?�]·^>ωl€t»ΘΨΡ`Ϊ+Ζ}ŸlΦTςύχ/γτُΥώ΄ s©e §U|ΐUΞίy]ςχ駚»-w«ΑΜΓΖ²ΜÌeoW�^γ<έ¬4§η΄ixͺR•»K@kŸ.E»`ξ,»J`ΟήoΘ�eΛυΩ4|υΌQέ±X±’V—ω©οΊbεjύΕ³z›vΦ¬ρ°L<Ρ>O«ZC»σΏ hφθΦEͺW«βyΘ¬$¨‘ΔΕK—…9¦φΓ† 4Ώ/Ξπž:ώ±a£Œ7‚a7o s.oΫ½KgiΨ°Ύτ¬θ§ί ]φXM¬vι�eY²μwγ�1«?jΏ§γό9?ΪKλϋŽŸψ•Όφj)SΊ΄žΤοΡdcω`gP�zFt>ΑB]ŽψΚΥ+�κ©R΄¨«βΉ~:,ύ ΧΑz–sirν>r΄±τ³{UGλ\ύΤ`p―ξ]₯d‰’1£+¬.½zΏižζ\[—‘ώŸ±D°³½Ψ©£τ}οm³KßΥ�&`έοv\όoΓηŸ},O4}ΜκώdԘρς׎nΛ”λ Ί¬υ±γ�?3ΪD°‘ο«οm5Ο�=΄ϊ=?υ»:ίXΎΓ rφ‰Lώ­ηiμ#€ € € € €IZ y‹–RΌdI»B‘Ύ¬ώnβŸ=»eρΒ_ΓΌ»V&lέ�ρ{›Œφο<œ'ιί§/]΄PŽ>δμφ«m‚…q4Ξ`atB~1 κ°cϊ̈^9*ΑB½ώRΠm©ψώ>ΉyλŽy»΅ο—”Rω�š• Ο_sUΨK—:…d1–ΠσΦBnή±«νeːRtiήkΧoΛΚ=Wε•oNš—iΨ­_ WΕΒτF%ΎΜFU>mή*jΐnγΑkr"0Tξ+’^ΚΑΘ�V-3―‹θ‡†μΆ–3—BεώbΖ΅ω"Ύφͺ1V}Οχάq4Dώ>"ε ¦“ ΣKZΓ!&­ΫΤ2o««bΰΟ”VΥΓ�τΎέ§Ÿ�tΧ»QnιϋdžH§Υ‹ΎωyžV8<τYΉp― 6ή―ψ[�σΤώΐ§eΓ=N@b"@°0&jΎ»Ζ κ‚§Ÿ•Ϋ§oϊξa~xg θάS¬˜hˆG—NΘ¦aΏ,Y\�X$&cΡχΠχΡP’VŒNΣgGV½ΜΫύ΄Κ[ΞΩΝ`£geDoΧΔ¦_ŸW¨`3ΐy* ΐ BzήΟ€ ΌpAͺYΧσ”0ϋjPΨπΛ›'ωΊŽKDΥΔWφϊ�eJ—’ Ζ;DeN=ƒ…ΦςΚϊ²χW�$G0–\ σξ1ιπ ~<|„ysΡ"…Ό9Ο�PηΧ_·»4θWΣΟΖΥνΗp#ΎΏΫv~ώΉn9₯CΧUN:%©R₯6*ζ3•VuΡΎ—!€ € € € €DS D©RR€H19|θ <ιΥ©R¦’’Ζ?όΟ•;·dHŸAΟ?/Ǐ3>ύ³J‘σ…:5b±Ӑ_b *UΛΡGδA¦šUρnο©λRg¨λΏ4Ω2¦”½ΓΌΡΪ~qDVοu]―ΛμΞΩrIΦξwν‡7ΕrkΥΎRζ!Ο`ᝠIΫ/ŽΚώΣΧέ–iΦΠίΘg JΛjYΓ»₯Ω§α½·fž²CŽΦ‰H|¨DF™Φ₯ˆθ»xΆΪCΚΎ€λζΔ{?.+ώ?"λŒρ[Υ­σ»ΤΙ)ύŸΞ'©ΒήΒ:%άΟ₯Ζ’Π;»ͺBv­›ΣUzžάηϋS2㏋fwŸ¦Ή₯OΣΘƒ…Fρ)πΪσ ξ�$όyržG°ΠSž}@Ψ ,Œ­ Χ#€@dΏΞ›mςτΌ…‹–Hο7]κ"».±(XΧοζ-X•ηΤ―[GͺV}@ž2*‡jΣjΏ.\$―Ώυ�΅›,?5lΩω₯ηε‘κΥμ*“αAθrΡΊl4 @@@@@Έ XG’Ι1XψΪ·'凍—LAg₯Ό{ϋξ“σW]U —½S\*NFY«{sΒΣίΑαε€Γψ£vP1ΜFG‘œids�°ΑΒŠfc7δάΟ οZ .>[#{˜C/O>.Ώόu%LΏ³C+ϊ}Χ£ˆΤ(•ΙΩ- όWž½!zΌz‰ vH�ν€�vWΜ,Σ»Ί– οxLϋ4ψWεƒύrΚ¨²¨ν‡^E₯NYχqz»·sž–Ύ]\*=›VBԊˆΪ*Ι ‹ίΎΗάζ €q!@°0.ΉxΠ*sΦ,·—Π₯puIάδΠK°ΠJ΄ζ%88XZΆ}6ά ”Φ9ΙιSΏΗ κΥ‘ωσKήΌyŒ*…% ΰ΄±ςq9tψˆlΨΈ)9qπ� € € € € €ρ(@°0ް“c°°ΕηGŒe‡]Ηt,(mt-Υ;xώY³μœ)Ϋα‘μςYϋa”lΏ"]Ύ>nφ?Z:£ότj1ΩkT�;vώ¦lό7ΨΎ^Cr]Œj}ΪςfI-χu…ίœ ̓Ə�Ζ�Ε]λ搒ƒΜNߐ‘Ώœ• Že™�1ͺ jΠjΣΧ]w~°v₯vٌςtΥl’?{ωσ`°|ρϋ9Ρ₯€΅iUΏ=FυΕԎͺƒV°ΠΊήϋM£bΰύE3ΚΩΛ‘2nωyΩυ_ΕA=gIŸβφψ­kbσ©Λ0χ4BΏνp#£rί―Χ\Ύ³\ο―Υ§•k•Ιh_ͺ‘Β^ߜ°+0Ξz₯˜ΫqϋD6@ˆ‘ΑΒΒqDI@—4τΡζΉV<τΣ(/i₯ψρI‰5X,ο½ίO.^κΗΊ @@@@@δ!@°0Žζ9Ή O^ •κύχΫ‘3]’Xƒmڜ‘?oΛ!;—AžΡ­ˆ4Ό7³=ˌ%€;Nfm8Ÿ‘}OTΞ"“;Ά›ŸΌ+�ή^;θ Ζyπt^ιV/—ΫυF(±�±¬σ#$¨ν­ΗςΘۏηΆΟq 5˜·m`i3€hŸ`l4ώτμ8ζZΞψ•†Ήδ�šηuŽΦΆV‡\ΎηͺhΤρΈΐόϋDˆ\uΛδO'ίv/bVuŒΞMΏ[Qήώα”=ϊY3¦’ WCm7­(ωφγyδΝ&wί=:Οΰ\@Ό ,τ&C? ;R%K˜ξτ.§|Zύ―ZΥ*’!½λ€ύ½η ŒςΰGψT.\ΌhV•F•·Os ·~TZ fμΣʎU>Ψo^s_‘τ²δνβφυΡέxuΖI™³ε’yΩ­Ϋa―~―Yy½qΤ« n?,O:bW&Τ;¦I•B²fH)ƒnΩU ΅?WζT²ΘXΚYC˜4@βJ€`a\Ir@@@@@@@ nΖ‘§/B~‘ ΝΟt #{Ύ†ΠΖt,(OUΝζΤΖ½Εϋόc†Σ<+ύ΅ϋ⨬ΪλͺΌ·κ%€ltnΧG7XψH©Œ2§w1·{X;Ke•ŸϋoYε.urΚΐV�`‘³ϊίμW‹IΝ�­KΒ|:«/nϊ°”Νε Χ9ƒ…£ο7ΈyλŽyγ³+ΆΑBη}΅κγΎS!2τ—³’οh΅OΪε—N5sX»^?5$Zώ{νπ`Ή‚ιdόs₯Ό# Ίf_τώζ„œΊδZ :G¦T²{H3`ιυΖ@@  £Ε© € € € € € € €@< ,Œ#l_„ό"š/žY°PΓ„Z΅�jρ 2¨e~ΡΠ ·¦KλRΐڬ吡�^Ρ7χ˜ΆΖΚΫ<–P6Ο5‚r� j%A­(θΩŒ°Ϋύύ\•5¨αΐπš·`‘3,ψGΏ’R"OΪπ.7ϋΪ~qDVο 2·!Δ„ :;ό·s2|ΡY³+Ό₯₯ηZΫ}Ύ?%3ώΈhξ–ΙŸN4ΰ©=[Ѝ;RυΓύrαΪ-σА6ωε₯Z‘=οΓ> €α , O…>@@@@@@@ αΖΡΔ4δw2ΰŒ¬ώc“9ŠΪ<(σηςˆbϊ̈ΰ �κkT4Bg1mZρ�ΝΨ#ζεΦrΘΏόuE^ž|άμλσxnισXž0·nΕ˜ ŸpT–οvUMœυJ1©UΖ{ΕΒΪCΚΎ€λζ8·τ/%…�[Ψ_‚…:°boώ#׍*‘Ϊv.-y²„]–Ω<ψߏG�+Nί0χζφ.*5Jy_‚{�κ@ωΏŸN›η6�˜Y¦w-βΌΫ €ΔX€`aŒιΈ@@@@@@π©ΑΒ8βu†όZ6k,ΉrF­ͺΫΜΩΏΘΥk�€[–Μ™€}ΛfQΡωΐ 2η—%φΉ]:΅³·c³—ΑBG©·χΚΥλ·ΝΚ†{‡•ηΔ{†–]^Χ³ΕG°°�ά32aΕyσΡύŸΞ+έλες†½o½ƒVτ;5κξ’ΗΎjΒ›7Ε¬Ω±fv{<αmTλ@Ž'-²  žSϊ½r%Δ(i4oσ`4~θ²ΥΊ|΅Ά2Ζ²Υ«κ†4@βB€`a\(r@@@@@@@ ξΖ‘©3 ˜6miΦΈ^”Β…ΣfΞ‘š3ZζL™δ™V‘ 5TψΛ’rγFτ�‹Κ«Ζu°π³dʚ ζ£υΉGžqΨ\ωΎ"ιeΙΫΕΓ’3XψδYε« …9/ΆK!Οή|Iz}s�Όoή¬©eΗ �až‘ Ά_‘._»*,ζʜJώRΖ>ΟΧΑΒβoύ#Α7ο˜K^N�§ g­bc4Ξε₯up‘-ν¬η8—‚ώκ₯ΒςδύY΄;άφ©±Τςg�-΅\½xFYπFψΛN‡{1 €D @°0!€ € € € € € € (@°0ŽπΝ°ίb#μχ_H0ͺαB] yΥ:ΧRΘujFΎ²g¨0m#ΔΨ$j!Ζ¨Όj\ œ»)}tΐ|t±άiDχ΅ιXPΪ<˜Νάφό±ι`4�ά΅„²g˜Ο:7ΆΑΒP£X_Ήw]Υυž½ε–ΎOΊ/Λ¬|rP.Ή*ϋυk‘Wz5Έ[ΩΠΧΑΒ–£Θ‚ΜW�W>“ΜμQΤz}·Ο�SOΘό­—Ν>O―οΦ_” +₯VιL’γ·Β‰}ΐηΧ�>3§K)[?*-Y3€t»―ξ<{CjΛ&kxQΫ°Άωε…G£VΣu?@π.@°Π» G@@@@@@@„ X‡ϊ1 FuΎκ8β:X¨χ¬1π_9dΤ¬–ΚΘ―Q^R‡Ν±™§\Ύ-eŒΠŸΥΚL'm«g“ς…�K½r™ΜξΨ υ&Ξͺ…Ί―U›sΛ3ο:"ίόqQnήΊ£‡D{»—1«šΖ_ Χν’Vc\K}f‘œiδ½'ςH5£j`JΓnϋΡωψΧ3rΰτ][gποθω›ςΰW¨S―w#Υο!γΨυPΧϋ₯KBϊ<ž[šTΜ"Es₯•ƒg�Λ›.Λ€UηνF‡@IDATPa&#€ΈΛ¨Ψ˜ΑKεD} @θ,ŒŽη"€ € € € € € €ρ'@°0Ž­}.ŒP‘Rψ"X8aΕyι?χŒ-ύX₯Μ2΅K{?Ό η8¬γ¬ΫάΏ”ΉΑB½QŸοOΙ #@QΛ’>₯Μy΅˜T2‚‡Ξζλ`‘>k’aχ‘ΓΞω|Ον—jε!mςΫέ+ώΉ&ό;jο·}(›ŒξPΠή_ΰš΄sTξΈ²…vxiR₯eο—²ωΣ…w˜>@b$@°0Fl\„ € € € € € €ψ\€`‘ˆγ:\_‘B₯h:ό°l;lͺόΡ―€”Θ“6ΦBW―ί–Roί­@8�υbς`‰Œήχμ•P²ΰ¬ό΄ω’]5P—Rήψ+Xxξκ-©ΨwŸy:e3Ι½Β_&Ψ�λ^/—τ:o˜ηκ9o|{R4¬θlZΕ―α½™el§BαVι«=τ μ;uέ¬bxjTyη₯φΆ.Ή\ψυ=ζώE3ΘΒ>χΨΗ’Ί±f_ΌσΓ)·ͺΞk ζH#£Œΐ`­2aMλ}|Hφœ­6ΈδνβR2―ϋ|κrΟοόxJ–οΎζΌ₯½"…Hk£Zδ –ω%[F/%&ν³Ω@@ z £ηΕΩ € € € € € € €@| ,τ‘t\… γ3Tθ# ΡπZ΅ώ�%y5œΆwXΩ(?κ–ΜӐα cΙήόΩRKZ#μ竦ΟΪm„π.K1—7–_Ξm,μOM—<ώΫίΎΧ�Η¬X8”‰€Š`ΰ΅[ζςΞ½‹5wΛ?kρΒ΅Ϋ’7[*©P0½Ή<΄Vl€!€ ΰ ‚…ΎPεž € € € € € € €@μΖήΠλb.L ‘BΕi5戬Ϋd:υy,τy<·W3 € €@ς X˜|ζš7E@@@@@@Δ%@°ΠΗσε.Œιγ�¦I#ΝšΤ“\9sΔτρz]Ѝ;rςΒM™²ζ‚L^h>;•Qψn�'ε$cZίUŒΧ—δa € +‚…±βγb@@@@@@@ΐg }F{χΖ± &ΆP‘Ύy•˜ΑΒ» "žΞ+έκεrv± €ΙX€`a2ž|^@@@@@@όZ€`a €$^‚…‰wξ9 € € € € € €$m‚…I{~y;@@ΐoϊνΤ00@@@@@@Hζ “ω€ΧG@J€`aBΙσ\@@@@@@@ bGŽά‰ψŽ"€ € χ 5Žϋ›rG@@@@@@@X ,Œ5!7@@ˆ‰Α˜¨q  € € € € € € ΰ{–Bφ½1O@@G€₯ΓA‘ @@@@@@π‚…~0 @HŽ “γ¬σΞ € € € € € € &†YbŒ € €@ X˜'•WB@@@@@@$!@°0IL#/ €$>‚…‰oΞ1 € € € € € €$‚…ΙcžyK@@ΐοϊέ”0 @@@@@@@ΐ XΘ@@ A&;M„UΈ_Κ•-cŽόμΉs²tΩrs;Sƌ�’y3ϋ-Y&φ~L7<οϋέχ?ΖτVIϊΊΊ΅kIΑ‚Μw΅οΫρωΞ²qσ{Ÿ —ΐoσgKιR₯̝M[ώ”^Jt4];Ώ(oΏυΊ=ξqΎ’‘£ΗΪϋl € € € € € ”κΥo(*V2_ρϊλ2iΒΈ_7Wξά�ΈISɞ=§yή±γGδ—y?GxMb>H°01ΟcG@±@R>ΩόiYΎl‰\ Ί–ˆg"ρ}χ_Jš4©ΝX΅z­Όά½W‚½Lώ|y₯gχ�ζσοάΉ#Ÿ i|/‚βd< γ„1Ξo’ƒ…Ώš,ΓGŽŽs+nˆ € € € € €€Ώ δΘ‘C:½ψ²€L™�Ϊ­[·dτΘαα³@ΑB�¨qΙ•;ΫρσηΟΛτ)“άϊ’�ΑΒ€4›Ό  € ˆ’B°π>οΚυY»v΅μΨΎ-ι'‘ϊS°°]›V2hΐ6lΛΆΟΚΞ]Ϋϋ±Ω X=ί]›‚…ΊςΤΙ_J©R%δθΡ£�­goΡͺ˜4@@@@@’Ίΐ‹/w3*f·_Σ[°°A£&r_εϋνσœ l#€ € GI%Xhqœ’%‹~“σηΞY]|ϊX€`!K!ϋψ+αν“B°0Βδ  € € € € €IT ϊƒΛ£΅λˆ�BuϋΦmI•:•x ΆlΣNŠ»Η”Έrω²lή΄^κ7lbξ,L’_^ @@ a’Z°P5o…ή’­n’ ΦKθΝ› œ žQ°°M«§%[Ά¬¦Ββ%Λ$0π‚4nΤ@z°ΊdΙ’Y9*+V�–-nυ*₯χ(_�¬ȟ_n††•άNΛΆνΙΒEKμkrζΜ)ujΥ”:΅•'š>fχ9yŠ8π―\ΈpQV�^cχλ†^ΣϊιR΄hΙ“'·\»$ǏŸ?6l” 7Ή«;ΎͺXXͺd ©Uσ)[ΆŒ„„\—›6Ικ5λ€Άρ.£G|j£γσeγζ-φΎ΅Ρ¨a}©PΎœ”*Y�ψΓv¨ρΎε―;eΝΊ?¬SμΟ εΛΛ#54χϟ”Ήσˆ.]―n)f8€K—Ξ¬πΈ�X�:00ΠΎΞsγžbΕδњ5€l™�’7o9yς”ό³wŸ,ύ}EΈΧΕΕχ i“FR©bE)P ŸμΩ³WΦώ±AvοΩ#Q jE@ύήιχ¨hΡ’Ζχα‚μΫ@ώXΏAφξΫοωz㡌J—*iŒ9Ώœ;w^Žίχί-–cΖχΜΩtš6ilwύψӜp—πŽΞ\[7σόž_ΉrUdΉρί»­ΫΆ[§ρ‰ € € € € €@Ό €KŸNΊuΥ ξίΏΧ —΄iΣz >Ρ¬…δΝ—O–�ΎTŽ>$™2e–�=z™cŽJ°P—Z�Χ ‘,TH2fΘh^wύΖu 4–QήΊe³ρ;’cρϊώΡyK!GG‹s@@βL ) -œK—.ΙοKažΓVŸ>ˆ(XΈχ_φ§ΟψNš?ω„dΟ–ΝξΣ ύWhS¦}#C?ωΜ­ΏΆ2°ΏδΛ›Χ­ίΪ9zμΈΌΠΉ«�κπL[ιίο}λP˜Ο‹Ζw‘zΪvŸ7zΛ‹/t’΄i�Ψ}΍uFΰμ…Ξݜ]> vλ�Y^΅§€NΪνYκ›>c¦ΌήΫυb=θ,,RΈ|ώΩ'r_₯ŠnΧZ;+V­–7ήzΧ- φα�ύO:>Ϋήb”Ϋ±ΨŒWoΤϋ•’sήχλΖΝ›2γΫ™nίwγδ‰γμ1tε5ω}ωJ{?&s­Ώό�σ�»Wɐ!ƒ}/熆O_κ�ΓΩΕ6 € € € € €ρ"πL‡η$‚ΖίΥί”/F.=ŒΏ(Xθ9¨θ ( ­ΫwΤ©RyήΖήΧίE„„„Ψϋώ΄A°ΠŸfƒ± € €ΙH ) ­iά³ϋoY³r…°Ίfu%‰Ο”ω�H†ΆΉδΦις£χκrΎ~Ω¨ #‡38§ά–ό6ίk ΚΊΧΡ£Η€ΑcΝ$:ΑB Ζ½ύΦλΦ-Ό~Ξ;Oή{�ϋx\W,|ρωη€ο»}μϋGΆατΡ |«~_lWƒτv­VτkΡΚ$ΤsœΑBέΧεRyωC΄†ξš>Ω�¨*yDO5›250YλΩϋ YΊlΉ}š3¨gwzΩpΎ§ž²vεR―αRΟ[x ΅䀉_ˆώ+ĈΪ7FΠο£ΑΓμSb3^Ocϋ¦ŸώBΎ˜π₯ΩQ°0¦s­G/=C£Ðyσ‘>οyεzžΟ> € € € € €±(SΆœ<ρd σ6+Œ „Ϋ·m•^Ζο|,μΦσUΙhόnEΫυλ!rιβE 2VΧΚ&9rδ00qόX ΊζŸΏK$XhN?@@β[ 9 ΥτΊρ/ŒΦ�]-;Άo‹obŸ<Ο vΚ#)�§”ΫoIИS>yNTn`‘ώK―ΕK­ΐφΐύ•έBOΞ€“VΔ{₯Η݊¬ί(s~žgώς…N₯LiW…:ί3Ο½(AAΑςlϋ6ζ’ΐ•*ήk[—>e,ϋzΞ(c―A.mΏ/ϊΕ\ώX·΅Z✟ηΛΑƒ‡€B…r�€QC»z Ž΅R•‡τ4³Εu°pύκε’;w.λφrζμYcβέζrΖυ₯‰=«:wC~h,ΧΫ�ΎV„ΏόΆΘ|ŸηŸλh.olμΫ―ΏΜš=Χά /τ¦K"λ2эͺv Τ—4iξVO\Έx©τ~Γ~Τ°η2ΓN—KΦ¦•χ¦σœΞκΣ’£GtQ­X¨Ώ ΠjˆΪ4T8nŒϋ*F©R¦’šuκΘΊU«δΦν[‘>7!N X˜κ<@@@’K°P§ϊΒ…@Y0o�œ?w.QΟΌ3Tx'δΆO?+·OίL°wŠN°πΉ»ΨΛλ6jX_ƍi{λΆν��Γσζώ[―Ώ*έ»ΎlkΩφY#φ·Ή―‘Δ^ŽΠαγ'šΛ!λΑvmZΙ w« :―³nΦ―ο»ζΏ>Σ}}¦.§k΅1Ÿ&5nhνJ£¦Νν°Y\ Ÿnρ€|2tύ β΅5ή]—'Φ¦ΑΒ _Œ²ChΪg ΅‚έ– kμπΪΉsη₯FνϊzŠΩ4l·tα|kWΆ�΅CΪ<σœΉο,<~β„΄jΧΡ~nΝΛδ/ΗΩU oίΎ-U¬i.§όΑϋοΙsž±ο«KWm,#l΅±£>3ƒ™ΦΎ.±«‘:mžA½¨~–-\ Ŋ΅n)Ÿ~φΉ|9yн�έτ)R½Z{ί,τό~ύΎb•tοΥΫ>·SΗgEΏ VΣϋκύ΅ΕtΌ}ψςL»6Φ-εΫ™?H�CμύύϋIϋΆ­ν} mjΨΡ[°06s=σ›)R­ͺΛF«O–Ώ―ͺύ\ύ~5nΤΐάΏ~ύΊ|ψΡ`ϋ € € € € €ψR ωS-₯d©�f±„ΖίσŸ3 /hσU°0W�<�ιΕ—Μgθοa¦}ύ•Ή˜~,LL³ΕX@@$$‚…·BoΙΦ?7Ιϊuλόφ_Eυ+εo‘BwTƒ…b«Χθq·WέΎe½hxJΫΑC‡₯Ι-Μmϊ…—/_1*ς-”U«ΧΚΖM›Ν ›y’Ǐ¨ =.1ŸŸ'O£‚[fiΪ€±tιό‚}Š.#¬Υ΅Εe°πή―HΟξ]μηΌΫ·ŸY9Ρξπxžφ[ΑΒϋ+W’Y3gΨ§j8rτΨρφΎnL7Ϊ�,θ z �οÏδ‡Y³έ�υ Z_5^tia«½ςΪ[rυκUkΧ Η½τB'{ΰeϊŒοΜ}gP/:ίηwΛ³ ’ήΈBως2oφέ`¨3X¨Ύκl΅‰_M–υ6Y»’5k·ρΈxι2Ρw�ΣρN7ώ2’ΖΓšχ–΅κ»}Wυ»ήεε%…ρΪΎœτ΅yά[°06sύν΄Ις`uWED}Φ±γ'δηω D«nωs«vΡ@@@@@ˆWό Jϋg;š…ώύχ€ΜŸ{χwΎ κ ΎώΦ;ζ3u%«ƒΖs7mX/ ·XtΡ FWŒσ@@βD © ;&Λ_’θ«κdϋc¨PΗε iποεΫlΞ€–.ΕϊΑ€»UϊτgΕ9g°P—”7ηGI›&λFŽŸZE{PΦTωuα"Η‘¨U,Τ Ϊ΄zZΪΆn)ΕοΉG²eΛκvηŽͺΣΎΈ �xˆ΄xς ϋQ=ZΟ�huΎψόs�χέ>Φ�,lωTsωxΘ@»?*₯+T6Oσ †χ\­J¨Υ ­ΦϋΝ·eα’%nKH[Η"ϊόζΫ™ςΡΰaζ)1ωθ�ΛkV,΅1{ξ΄»¬Š…ZποΈ*λΩ#Ω°„žΑΒπžλf³ͺn^ΏZ²gΛΙ“ξž5{�τνΧίμpυ’ϊ=([¦΄όςσOφ uΙꃆΪϋΦΖΚe ₯PΑ‚ζ�3X8α‹Ρ� ^λ΄H?ίΏ˜ŒWΰ 9:—φŽμαή‚…±™k}fοWzH·—_’΄iΣzΒOs~–�ύίέο™Χ9€ € € € € €@,Κ”)+O4ΚΌΓΕ‹%ΰΤI·»•)[NR¦L)Z`bίήΜcΏλ»tι’ΫyΦN¦L™₯kW±‹σηΟΛτ)“¬Cα~>P₯š<όHMIŸ>}˜γW._–©_O2aϊAΑB?˜†€ €$G€,<`ό«’εΛ–KŒ^σϋ)Mί6§€Κ—V‚Ϋj»υ”ΥkΦΙ‚Ή³€\Ω2V·τyΟ¨†g,ΰ­ύ΅c—>rΔ<“ ž.¬Ke[mι²ε�³χΦ�ύΉsλFϋ/œΑΒώύϊJ‡gΪΩη=VNœp�K ϋ ±pΪ¬β§}1―^7ί¨²YΎ\Yέ4—�ίΨ}ιoσ@8?Ό c3ΧΦcΤ±ΉQ³ΖCΚ}χU΄C˜Φqύt~ϝύl#€ € € € € WχV¬,{,Z·[²θ7ω{ΧΞp―‰n°ΠΊI�\y€Rεϋ€lΩςfυD«�ίϋeώΟs¬]Ώϊ$XθWΣΑ`@@δ#”‚…ϊ/–V­ψ]τ�ρO,-γ«$eφTr'δΆO?&\θο‘BuφU°PQΪ�™Ÿϊ#gΜςζk―ˆ­6oώ/�›Ρα,μ�ύYΉzuͺtλ�YϊΌΡΫή<μ™:ύ[{_+j•8«9WqΉrΧΞ/ΚΫo½n=F¦ΟψNωΨή׍ί�*E‹Άϋ¬`‘†+.˜kχoά΄Y:Ύπ²½om)\ΘάΌl/³μ, oyκ₯ ηΛ=ŊY· Η;~ΒX’`€4jXίξζΉe˟[ν}έΠωΙ”1ƒΩ§ΧX-¦A½?7¬•¬Y³˜· –΅κ»}<«::ƒ…/vκ(}ί{Ϋ‚Œ7AFoολ†~ΗrζΜaφi°Τϊ�ΕtΌcG}fVΪ΄βitεJ2tΠGΦadΜωΊυΔ[°06smύχGf½—nW(_ήXκϊ]©Zεέ5›V–Τ “4@@@@@|%P²TiyΌYs―·O:΅},44Τάώυ—yrπΐ»ίΉΣ`‘σUͺU—:u]ΏϋΠe‘'Mη<μ7Ϋ ύf* € Ό’B°π΅7ί–νΫΆΚ:£z¨Q.1΅ˆ‚ƒσ§wτE°πΧy³₯LιRζk^ΊtΩXξΈ½nӎ¦5–Ρ#>΅ fϝ'ο½�Ήί¦ΥΣ2d`ϋΨΒEKΜe^­`Υ«=»›ΛΓZ'Œ›π•h%;m-Œͺnƒ|`WΏ3ϋZ΅—έ{φ˜Ηγ2XXεϋε‡o§™χΥZ9qπΠOδ»ο4ΓnΓ† ”Η7΄λ†,ΤνλVJΞ�@ά­[·€{―Χμ₯ ΏϋfͺδΟ—WO•#GŽJΓ¦OšΫžΑBύƒω'ΓGΚ”ι3ΜηϊθiφxSσ\ύ(ΊŒ²6Ο0€β^θάΝ<¦?4”ωόsμŠ’Ξ°ZLƒzΞ₯²υΫ�Ϊ)―Ύώ¦œ>#υλΦ‘O†’lΩ²κ!³9ƒ…•*ή+³ψVR€Ha;u*@:½ΤΥ�’¨!Ι‘Ÿ“tι�™Η՘ŽΧsιb΅Ω·jεF kŽω|Έ[ΥΗvž]2Ω[°P“ΉΦPαΦMλΜ%#τ;vξ’Vν:θ¦Ω† ώHZ=έΒΪ•ήoτ±«Zڝl € € € € € ½ŒU‹�¦M+ϊ{ηΚMή†ΑB½G—ξ=Νί%+‘Mηϊ‘·g&T?ΑΒ„’ηΉ € €@2H ΑΒΌωςΛ™Σ‰v&Γ κΛdθ”GR€O顚‘ΏΌ°/‚…Γ?bύ¬wΌzυͺό½{K/*”“΄i�X‡δ�ύŸΜ·ΐά¨z5™1m²}L7nή 5―mσLGiPΏ�L;ΚνΈVΒK™2₯0sτUΕB}ƌ©“δ‘«;'τΣ±θ<›3XΨρΩφ’!A«έ1–$Φ%S₯J)ΕοΉGœ�ͺoς”i2μΣ橞ΑBλzoŸΓGŒ’‰“ΎΆ―\ΆΠm)έ /ΚΡ£Η€ˆQYΡ :κΙAF•ΔGjί­.Σ ^΅ͺUdζ7�e�νA:§i�άύ—‹Φ1g°Pϋτ/œK[‡„„˜KNgϞM rUt΄�νΦ³·,_ΉΚ܍ιxυbΟJ“·oί–«W―Ω•­ηP�UΟάΞ™3§τ7ͺύ51–ΦΚ€ZνOƒw7n–οόIΎšΰ*s―ύoa/;tΠiές)σΊ΄m£¦ΝΝm]zxα‚ΉvΕΓ>ο½/Ί¬nTšί>3Β_χίWΙ¨ΐ—Ζ¬"wΖψCλͺΥkdζ?Ή-εΫ²ν³vΝΊχ :ΘΛ/½ ωώϋΧtVΏΎο³fΫΛ<[ύžΑB}‡AϊΙ}•*J† ΜΣ._Ύ"‹—.3‚vύ­Λά>uΜΊTs΅*Ψο¬'¨Χ6Κψ _ΙΖΝ[ά�‰Νχ@oΤ₯σ ζ2ΛϊžϊœΠΠ[ζΥ#G•η:½G/#X˜!}ΈΗœΛ–,–;\ΑB­LΨΊ];γολ3Ϊ«ω8Ο½rυŠ,]΄PŽ>δμφ«m‚…~5 @H> ύk�­p‘Ž*1„ γKOC†…Œκ}ΑF₯·ΓGŽeκ£όh Zϋ‚εΆ € € ,ŒΨ‡£ € € € € € € €@B ,L(yž‹ €$s‚…Ιό ΐλ#€ € € € € € €€ί ,τΫ©a` € €@� X˜΄η—·C@@@@@@Δ+@°0ρΞ#G@΅ΑΒD=} @@@@@@’°ΑΒ$<ΉΌ € ΰΟ ύyv € € € € € €$g‚…Ιyφyw@@ & >F@@@@@@" X‡@@|'@°ΠwΆά@@@@@@ˆΑΒΨθq- € €@ŒƘŽ @@@@@@@Ÿ ,τ)/7G@π&@°Π› ύ € € € € € € €@Β ,LXžŽ €$[‚…Ιvκyq@@@@@@πs‚…~>A @Hͺ “κΜς^ € € € € € € Ψ&φdό € €@" X˜H'Ža#€ € € € € € €@’ X˜δ§˜D@όS€`‘Ξ £B@@@@@@ς@@H‚… ΒΞC@@@@@@@HFJΔ  € €Ύ Xθ Uξ‰ € € € € € €Δ^€`aμ Ή € €@ ƍK@@@@@@@x XΘ<@@ ¬ΑΒ°&τ € € € € € € €ώ @°Πf1 € €ΙP€`a2œt^@@@@@@…ΑΒD1M @Hz “ήœςF € € € € € € 4&yδ-@@D'@°0ΡMF@@@@@@d"@°0™L4―‰ €ψ›ΑB›Ζƒ € € € € € €ΈςM@@H‚… ΒΞC@@@@@@@HFJΔ  € €Ύ Xθ Uξ‰ € € € € € €Δ^€`aμ Ή € €@ ƍK@@@@@@@x XΘ<@@ ¬ΑΒ°&τ € € € € € € €ώ @°Πf1 € €ΙP€`a2œt^@@@@@@…ΑΒD1M @Hz “ήœςF € € € € € € 4&yδ-@@D'@°0ΡMF@@@@@@d"@°0™L4―‰ €ψ›ΑB›Ζƒ € € € € € €ΈςM@@H‚… ΒΞC@@@@@@@HFJΔ  € €Ύ Xθ Uξ‰ € € € € € €Δ^€`aμ Ή € €@ ƍK@@@@@@@x XΘ<@@ ¬ΑΒ°&τ € € € € € € €ώ @°Πf1 € €ΙP€`a2œt^@@@@@@…ΑΒD1M @Hz “ήœςF € € € € € € 4&yδ-@@D'@°0ΡMF@@@@@@d"@°0™L4―‰ €ψ›ΑB›Ζƒ € € € € € €ΈςM@@H‚… ΒΞC@@@@@@@HFJΔ  € €Ύ Xθ Uξ‰ € € € € € €Δ^€`aμ Ή € €@ ƍK@@@@@@@x XΘ<@@ ¬ΑΒ°&τ € € € € € € €ώ @°Πf1 € €ΙP€`a2œt^@@@@@@…ΑΒD1M @Hz vN[έN--%΅,’Pω&eh΄ΣΝΈΆΆqνjγΪ‰ΡΌ6ZJf'Χ―[GςηΟgΎυΞ]‹ώG[¦ŒεΛρc€ZΥ*²cη.ιΦλ5 4ωϊG•ξ—‘ƒH‘Β…eρ�₯ςFŸχ|ύΘxΏΏΎcΉ²eΜηžχΦ­P9vό„μ?π―lέΆ=άsό­sΣ«$Gφμζ°~]ΈH^λ]s»kηεν·^·‡;nΒW2rτX{ί—Ǎ w'΅"χWΎOJ”ΈGŽώλΦo4K•,axΦ2OΏ|ωŠθ;G§ιά—-[ZJ•(!)9>vμ„Y­� Ÿ:ο^°°RΕ{ ΓR‘|9Ήxρ’ό³wŸ|χύΞΛάΆ΅ͺ€Ύ{ωre₯hΡ’rαΒΩ·�€όa,­KqGΤb:V­ZY«^#·[ΏΠ©ƒ€NνZάϊn:OΠ9Σ1ȟ_n††•/OΛΆν™σξ<m@@@@@p Δ6X˜2eJ©Χ ‘,TH2fΘhήτϊλxώΌlέ²ΩψύΘ1Ώ₯&Xθ·SΓΐ@@€-Ψƒ…™³d‘^|Y�€Mε‰ZΉb™lϋσΟ(ŸŸ'† ΤηΧWHI·WK¨LLͺ›~Ρ" κ G&Νojχ₯.=dΝΊ?Dƒk Μ΅ϋ?γ;in„³gΛfχιΖ#€¨ΑΛ‘Ÿάυ�~ β0ζFCžνοέ{dσ–­’!9m7Œ@ξ½χWχ<-ά}ΧŸ³M-o/mΦ{vλ"iΣ>(%Šuφλ”½ί~·ΟόΗπ'Ÿ 2Α;+κEτ―ιV­Yg‚‹9^~I$Hΰ\[§bnί©‹YΟ—'·LŸ2ΑΩ§ ?μ? ί�°_²<YrηΚι±Οί`ᐁŸH™Ro:ηώaύΗω�e+$uͺTR°`yΰώϋ}­*‚vE_ΑBνΛ©ΣΏšπcͺTχ9ηιBΎoXΣ>_0ΫV.Y O[}ΆΫΚUk¬ηψAR¦H)υλΦ’€I“š]Χ�_—2oU΄¦‡>nΦ££―v°°I£�ώύVvδ‚5 sΥuœ{΅nΩ\Z4kβμ�ʚnzΑ’ΕΦ�πqU²¦<“εig_υZυΊΪ9@@@@@≀;Xθλ‘uZγe‹Ι‰ΏxμΦί4³f‘�vΥ Žξ9»Q’„‰$‘B²mΣ&Ήyλ¦ΗΉΑ²B°0XF‚~ € €ρL . uΘ~8½T{·ΆυE·CTήCωΝΧ_Λ¦�ωvΠ@IDATλΌ7εzl ώϊλ:"dΊ`ύ5­$—�΅W<ͺ΄?~BŠ•*gά£³bα_ύ-…Š–t*ΰuλ�Ij½[έί1γ&Θ€ΑÜυ°’#X8rτ8Ÿ=—s{­d·eΓg]§λ3~’³�  kΥkd…+w™σ½Γ—ίμύVͺΎ[Ημσžžzρ�εΦτĝΝ>ύ�±}[iX?δX]χ'X¨ΟΊwχWN˜ροΏ/ΚΫ•ͺ:SϋzWν;τγORξΚzyρ�όr΅΄jΫΑμΣ/ξι¦uݞNΫϋΧmΨ$Mί»π«]³†tνάQO1mμ„IςΩΐ!fθθθ« .ύϋφržϋ’υΧ‘΅­qΠ`€έΪ΅i)M7΄W₯B•Ξ~­^ωž+tψΉUΥςδ©ΣΞ±, € € € € € ίμ`‘V+Όtρ’άΈySξKyŸάg6°ΫυkΧd€5₯±V2΄Ϋƒ>dύoφυΝͺ,˜2qœ½+ΦΌ,Œ5CEG@@Έ%W‚…:*… •œΉsϋ ‹�-S&MλΧ―ωάL}… νώcΥBwΕB»Ÿa½κΘ}παG’!6mΡ,tWγΣkkΕ½™Σ&ι’iZ­P«FΤ’,όοΏ�€`‘’3»M›4N^Ι—Χ^υ¨ΆΑBw5Dϋfί~½έ„θtύθ±_€€5ύ°Άω³gHφl/šε«W―JAkͺh» Ωh}ΩΆi­€{θ!³κO°0gŽ—eφŒ)φι2a�ιoU]t·R%‹ΛsΟ>k6ύtψgYΎςK³μ,¬Ϋ ‰lΫΎΓ9ջ⟾.^*Ν›6’χ[΅pŽΣιφ!ΑJέ¨•‡ ΰμ_΅f­΄hέN’³―ׯߐ$I›{¨eΓ¦-œp§}cοώkθrي•²iσVΩΉk·ˆ΅η@@@@@n dxμ1Ήlύa�ŸΦŒAξφΨcΛ;•*[3g%1›ϊρ,_ΊΨ}ˆ΄iχ) ΏΓ9zδgΩ΅c»œ={Ζγ˜`^!XΜ£Cί@@8,—‚…I’ά#uκ5πψΛ${θ–,Z G~>l―ν«w¨Pƒ„Ϊ JHhI—ƒ-\θo°P+ ΆhΣΞ#pΑB­n§UξάΝέ·;,<όσΟRښnΧέ4ψ¦8»Ή§ρΞ`αΜΩs₯[Ο>φmΜλS'Ižά!Σ»ƒ…;ΆlLcŽΡ€_™ςž}Φ£­Ώκ+Z€°.ϊU±°rΕw€_οζxύ�ΌΥϋ²fνzg=Όw°Pί+Ή_}έγpο©›ν`α§χ‘wΚ‡Tΐτ8!Œ•JωŠΥ$Ίϊκ}οJ‹φ~}―/^0GξIς?lΨΫυU·‡~όQƎŸμ-έϋYF@@@@@°ž!«ΌYΊ¬9ΰβ₯‹2~tΘμZφ<|≧μUσzΣͺxxΡͺ|Έuσ9όΣOϋ‚m…`a°ύA@β‰@\ κe~:‹ΌυvΡ;rψ°,YΌΐc[0�ψ ŽI, oίέ~wxO§ω]·a£ι�KΩ²Iϊτ;έ³+Ε9¬…θ 6h�\6oΩζΎΌ|�ΝNΡ)™΅έ©`α·ί}/•«ΧτθGΛζM₯U‹fΞΆ˜ ŽŸ8E>ΰY!pΚ„±ςΪ«ωΜ½έΑΒ=;Άšj~Ίc�ƒΦ”Ε՜ώΩ Γ}&₯ή,aVύ©XX―N-ιά±½}ΊxWtvψXp ΅Ϊγλoχ8κε—²Ιܙӝmv°pτηΓ€θ…œν-ΨΡΥWοϋ©S΅šuiŽέϋK/&=»uqξ}φςϋΘ;•oOαmoη@@@@@Βhm H˜0‘θοͺ†κΐ9sΛ+―εw~oδ>@g>›Ψ΅'gξl”(V4yΩ·+™PZL ŸΞό”Œ1ΔL μ}σsηΟ[�αύ‹Ό’/―Ωεo°Pv‡½―k――^»Nήk2-χ9ͺ|ύβφ‘ζυε—²ΙܙӝmξπΎΗfL™(3>ξμχ΅0wώιά΅§Η�θξλτΙγ%_ή<Ξ=΄eΙ2ερΜi“<ͺ9:ΉάU]›YD@@@@@ ή h°°H1ΟίψΒψιΗC²|ιb]O=υ΄”―PΡΩvλΦ-Ήυί’8Q"m3¦M–ίώχ?g[0-, ¦Ρ / € €@< X;†υ›[­i‹ο3Wί΄y«4lϊ^¨;υμΦEjT«βlί°i³4nΦ�Y/�VYιά±½€±ͺLΪντ―ΏΚΔΙΣ$wΞ’SΕjΣJsZqN[Ξ/ΛμSΜ²~©^«ž|½ηg]voί,χ§NmΆM›1Szυνο±ίΧʚ•Kœ έΌ‹δÏB¦ ~αωηeΑœΞ΄Νξ)'O#ω_}Ε\nΗΞ]R«^#KΧ―[[>ό Ωvύϊ ΙσκλrωΚη˜Ι“K «�]Ή²₯δα��ΛΈ�¬�¨-ύVSyΟ}ώΥ«WεΕ!a?½ΐΧΫ·HκΤ©Μ΅άΣΫύω0)ϊF!³zΰΰAλ―ςnW‹Τzο:ΦΕY_x^2eΜ(Ώž9#{ΎωV/Y*νίo-:6Ϊ κρ:ήΝ7”‡­ΠŸ=M±nΏpα‚Œ›8YΖOΌ=vΊύγ>=₯R…·uΡLc\ΌΤ[fΩώςμ3YdιΒΉΞ΅Z΄n'«Φ¬΅w›Χή=ΊJι7KJͺT!οG{ηΟ?‘‰S¦Ιάω νM―φU§-Άί“:ε²»―i�€‘‹ηΛƒ¦qξΡ³ΟΗ2ύ‹Yζ}ΥΊe3)QΌ˜G…B=Pƒœ“§Nεβ\„@@@@@β©@¦'ž”ro½-IΌf²9�_Ώ.›­j„ϋΎϋΦήδΌjeΒJU«ZE,’;ΏcpvZ ­Κ‡kΎ\)Η9ζήTΛ ƒj8θ  € Ɵ±Ž OϊψcLψκπΟ?›)€cCŸc’φscβ€+U²˜sι•«ΦšΠŸ³ΑZpOS}ρβEΙ™―€{·_Λϊ,Ο>ϋŒ$IœX[Σk°0¦›V0ΜόΤS–αe9|ψˆί–w²―OdΚ$}Dώ±¦Kώεψ‰;βΣξ\@@@@@˜Έί*P‘)Σ“’ϊϋMΕΑίϋ]~9vDώϊλ―o›(a"ɜ%‹<˜6­$KšL~�ύw9uς€υœU έD°Π­Α2 € €ΐ XxΗ¨ΉA% Υ΅J έ΄šaΟ>ύεΗ2SωVxη-)iUΦ³Ϋ–m_IύFΝμU^@@@@@@ξ€ΑΒ;€Μ-@@B , mΒ⃀VηΫΊi­€L‘"ΒΗ½q㆙ΊZΓ…4@@@@@@;'@°πΞYs'@@—ΑB‹Δ3œ9^–±#‡KκΤ©Β|ςΏ�Ύ(ύ?(sη/ σv € € € € € €ČΑ˜qεͺ € €,ŒˆέΔq­\X₯rEΙ�κ+’.έCrλΦ-I˜0‘όϊλΩΰ Lœ@t@@@@@@β­ΑΒx;τ<8 € pwή]ξŽ € € € € € €„%@°0,Ά#€ €Δ¨ΑΒεεβ € € € € € € €@€FšŽ@@’"@°0*zœ‹ € € € € € €ĜΑ˜³εΚ € €α, ‡] € € € € € € €ΐ] XxρΉ5 € ŸΖηΡηΩ@@@@@@@ ˜σθΠ7@@  ,ŒΓƒΛ£!€ € € € € € €@¬ X«‡Ξ#€ €±W€`aμ;zŽ € € € € € €q[€`aά_ž@Z‚…A;4t @@@@@@βΉΑΒxώΰρ@@»%@°πnΙs_@@@@@@@ |‚…αϋ°@@ †Ζ,—E@@@@@@’(@°0Š€œŽ € 9‚…‘sγ,@@@@@@@ ¦Ζ΄0ΧG@π)@°Π' @@@@@@@».@°π�@@β§ΑΒψ9ξ<5 € € € € € €ΏΑΒΰ#zˆ €ΔI‚…qrXy(@@@@@@ˆ γΐ ς € €@l XG>#€ € € € € € €@| XF™gD@‚P€`a ]B@@@@@@,‚…Ό @@ξŠΑΒ»ΒΞM@@@@@@@FHΔ € €1!@°0&TΉ& € € € € € € u‚…Q7δ  € €‘ X 4NA@@@@@@ξ€ΑΒ;€Μ-@@B , mΒ@@@@@@@ Γ(Π@@  ,Œ‡ƒΞ##€ € € € € € €@¬ X+†‰N"€ €qO€`aάSž@@@@@@β†ΑΒΈ1Ž< € λΖΊ!£Γ € € € € € € OΖ“ζ1@@` Xl#B@@@@@@@‚…Ό@@ξŠΑΒ»ΒΞM@@@@@@@FHΔ € €1!@°0&TΉ& € € € € € € u‚…Q7δ  € €‘ X 4NA@@@@@@ξ€ΑΒ;€Μ-@@B , mΒ@@@@@@@ Γ(Π@@  ,Œ‡ƒΞ##€ € € € € € €@¬ X+†‰N"€ €qO€`aάSž@@@@@@β†ΑΒΈ1Ž< € λΖΊ!£Γ € € € € € € OΖ“ζ1@@` Xl#B@@@@@@@‚…Ό@@ξŠΑΒ»ΒΞM@@@@@@@FHΔ € €1!@°0&TΉf° €I“&TΧ�ώϋ―\Ύr%Τv6ά=ρcGIŠ)e�ώύ�§_�»Χ‘;xgϋ½οΗΉ³gJ�€χΘΧ{φJΟ^}ξΰΣ~«¬Y_ώύz›ηΜ™/Σf|ψE8@@@@@8(@°0*„ €Δ‚…±a”ογ=χά#ΕK–’Η3f’Φ�]ωηŠL™8.π Ε‘3*Ό]^ztοκσ‰ώϊλo9qβ„Μž;W–,]ξσ6ή9ovοΔ‰[ΑΒR½fν½q­wkHςδΙεπ‘#²~ύ†½WX&ΛΣ’!ΐ ΘΡcΗδν •Γ:4 νϋφ~mŽί»χ[©SΏa@ηήιƒ .$Γ4·5{Žτλ�ιξχC@@@@@ (ε°Π)@@ ξ ,Œ[c¬UήJΌYJ2fzB&Lθ<܍7dψΠ޳1H† όLϊ|ό‰όφΫo1Ϊ£Κ•*JΧ.Fxν;wJ“¦οExĜΐ Ϊα»oΏύNjΧksΞ•|ς±”(Qά1fάxω|δθpŽφ—ύl ύ7γH@@@@@‚M€`a°ύA@β‰ΑΒΈ3ΠO>ω”ΌυNE@‘ύtΑ,ΤπΣΕ‹eπΠα2oώ»ΛΡώκϋεYΎb₯$J”H�§O/ςΏ&₯Mλάs؈‘2~ΒDg…;+ΠͺEsI™2₯ώωˆΜ7?Fon‡οξV°π± dΙ’ω¦Bγ•+�HΡβ%£mjnϋΩΖθ[ˆ‹#€ € € € € £ c”—‹#€ €„%@°0,™Ψ·=[φ—₯X‰’¦γW―]•oΏωFrζΚ-I’$‘`ΪΪ{φμ•ξ½z›i‰νmΡυκ.[ΆB:wνζqιιS&IφμΩΜΆ:,•«VχΨΟJά°Γww+XΨυ£ΞRΉbƒέSΫΟF°0nΎwy*@@@@@ψ!@°0~Œ3O‰ €ΑΒ ’HwθΩηž—"EKΘξ]Ϋελέ»ΜuZ΄n«‚…ΪιkΧ�‰N;eΚ4Ήvύz€=ΌOŒ(X˜7O?v”9νκΥ«’η•όΞ%2eΜ$;`Φη[UW―YημΣ=·AƒΊΦ’Θ¨ΡcECjvkΫ¦΅Ό˜υΉόΟωδ“�¬icyω₯μςψγΛ_ύ-?Ψ/=zφ–sηΞΫ§DΛkŠδΙ₯Q£R¬Θ’.]:Iš4©ρόγχ ςέΎ}2{Ξ<Ω½gO˜χ�JzΝ›5•,Yž–Œ?&Ι’%“?�ϊKŽ9* -–ΕK—…:χωηž“νή7ۧϜ%.\ςo•“|yσˆ^ος•+rΰΐώω(£¬–OΣ&B]οΠ‘ÜXΟigΩj›5w�δ͝[ςεΛcυ5£όύχE9pθ Lž4Utjkw+[Ά΄T(_ήlJ ‘δΚ•Γ,_Ώ~CΎϋξφΈιΖ-ΫΆΙ€ΙSΝ~χ­pY·N-ΙόTfI“ζ³KοyκτiΩjγοTΖ:FλΧ�2Άz��εή χ}蘸ƒ…cΗMͺU*Ivλ½—ζΜ}Άm�Κzουq?šΗςΛ/Ώ$ukΥ”§ŸΞ,¬ρ»yσ¦=φ‹μΨ±S κq¬―}/Ό”=»dΚ”IR§N%�όσœ,Œ£Μ3"€ €A(@°0%»ƒ…φγ?q\Ί[‘§oΎΩkoŠ�kDΑΒΜO=) ηΟuξ‘=GngΉ`2bψ³�S$λTΙξVσέκςAϋvfSΟή}eώ‚…ΞξS'KΆl/šυ“'Oš@‘³σ�~·Β~o+α½9JλKΟ D†ΥΆmί.͚·τΉ»Fυj�Ίε{&πζσkcΓΖΝdΧξέ»K”(&>ιoΆ­XΉJ *(Ι“'σ8FW.^"έ{τrΆ—/WVzχκα¬Ϋ ϋχκ5kΫ«―₯K•”ώύϊzlσ^Ρ°^―ή}Τηϊš΅λ€]‡Žϋ4P¨aΡπZΝ:ueίΎΒ;Δμkέͺ…4¨WΧ,/[ΎR:Τ5Μs"3&v°Pƒ²�ύχŸ —zί ¬χA³&₯QΓϊfŠfοstύЏ?IΣζ-LxΤ{Ώmϋτμ.ιIο½ΛYΧ γˆ‘!A^έ^°pΘΐΟ€ˆΥ¦αΤΦmΪ…z|A@@@@@  ,ŒƒƒΚ#!€ €±A€`al₯Θχ16 υ©5 5α"4x¨\Ίt)ςΦ™ «U­";…T%ΤΚ| uξ]ΑB½ΰωσηeλWΫεΎ”)₯XΡ"’ AsŸΑC‡ω¬Žηt"€…ζ͚HΣΖ!5ˆυ΅U™π°5½s�€Ι$»rΤ)Ÿ΅’_“¦ο…Ίjž\ΉdόΈΡNΏ΄’βW;vΘ_ώe*ζ·ͺυέ{ο½ ν k¨νΰΑCςηŸΚγ7UηΌƒ…ΟXUkΧΊφ{«\sz ΑΒM[ΆΘ™_ΟHž<ΉκvϊόŊΏιTΗ{5_>+€VΨ\?aΒ„ζ}‘+/^”+Ώ4Ϋν/ZΡqυκ΅φͺyέωΥ'pωσ‘#ςνwϋδχί— <*―Ώ^ΐTζσ7XΈeγzsό­[·€bεͺrδθ1{Ω+‘;Xh_GΓ€ϋ¬j•ΟdΙ"ZΠnU«Χ”ƒ‡Ω«βˆκΖύΚΛ"yŠRκΝ’’•΅­^½FΪwόΠ,Ϋ_tߊεKδϋο7›΄Jα¦Ν[δΧ3g$έCιLUΙ‡�¦ƒ…Ÿ*―©ͺU![΄nγQν�Ύ/― € € € € €ΔU‚…qudy.@@ ΘωE±{±=Xh?ώω�ύOϊ~ό‰lΨ°ΡήπkXΑB B½Y²„ΌoU‘K•κ>s]οκqΡ,<φΛ/RγέΪNΘ­I£†ς^σ¦ζžŠkΩκύ€ŸΛΧ ξ0ΦΠa#dΒ€Ι‡ι”ΕΙ¬J‚ΎͺAΞ›3Λ ž=mŽΧjvνΫwtϊ«΅ b»Ά­eΰ ‘’U%έΝ;vτΨ1iΧώΐœsωβeΡk‡ΥΎΩ½ΓTΚ $X8jΜX3 ΅}ΝY_L—žΞ¬zﳏΡW;|§ΣWΧ�Χΐ½+Τ²ό&ŒcΆ_ψγ)\€x¨c΄’’VkŒ¨i₯B­X¨-’±μ˜ΨΟ¦χπ�Ύ8jδpΙ�κ«ΊΛL+8H~ϋνχ(+ΉΓ\ZmΧΞέ’ϊώΤ¦²ŸV΄[οΎΛάyσνUσ]ΑΒμ9r{\WW6¬]->˜ΖΈΌΓ_‘φsC槞”™3¦I�€IC‘Uθƍ/«Χ¬ ΅―Y“Ζ�¬ic³}ΜΈρςωΘΡ‘Ž oƒ;XΈpριή£Wx‡‡Ή/Π`‘»βžϋ’[6�—Τ©S‰VμΛ™ηχ.gΩίEπ³OθΧ»—”-[Ϊ^u^5ΐΉΨ ٍ3.Β*‹Ξ“'Ÿxœ۲u[Ω΄9€j₯s1ΧBTΖΔ~Ά}ϋ~°*6Φu]UDί# ηΟ5ΫtκζNCB€uξ$U*Wς86ΌžΌuΫφ搗_~I¦Nš`–ΏήσΤoς^ ο|{_xΑΒ%K—ΛGέΊΫ‡ςŠ € € € € €@Ό X―†›‡E@‚G€`aπŒELτ$Ά Ož<)={χ“]»wG‹;XΈlΩ ιά΅›smw˜J§H.^’”\ΎrΕΩQ°Π]ε­§UωmΎUΞn3¦N–lΩ^”[·nΙΛΉςΪ›Χ˜κΕ58ΦΊUKΡι{“'χœξYχo΄Βl­¬P›»΅nωž4¨2eπΘQcdτΨqξέ.»ƒ…z�^#2-Π`α”©Σdΰΰ‘‘n΅gΧI’$±Ωξ+Τ©;μπΏΑB=§Dρ’�¨aCyφ™,ΊκΡ4`ΨΈΩ{aNmμ6:όσ©XΉͺΗωή+QϋΩφξύVκΤoθqι°‚…ξj—Zαrσ–­ηy―όψγOΞχι«ωςɘџ›CΆοάiM_όžχαa�{ �ώϋ’€JuŸs|珺ʲε+u@@@@@ˆ/ γΛHσœ € €@ , ²‰ζξΔΆ`α΅kΧdΒΔΙΦ�O’kΧ―G«FxΑB½ΡΒωs¬0ήS枳ηΜ“ΎχwξŸ3g™X‚…Nη­ν)kšγβΕ‹IšpvU­^S:δ¬Wx»ΌτθήΥ¬»§Ηuˆ`Αš5z¬U½olgψήh°0¬Švv°πΟΏώ’‚…‹ϊΌ™Ύ $Xh_θα‡ΣIόω₯\™�’ΥϊtΪem[Άn“χZΆΆσxΥι‡ubm]»υΕK—yμχ^‰Κ˜ΨΟH°°I£†ς^σ¦¦cΗM#Gyw)ΜuυXσε ³?Π©½έΑB}OΦoΠΨ ΖΆjUC¦Ώtι’T©φ�œ:}:Μϋ³@@@@@Έ(@°0.Ž*Ο„ €Δ‚…±`’ΠΕΨ,Τ zŸ}6HNž:…'ϋԈ‚…ξ`ΣΥ«W₯dιrΞ”Άξ`α�eΛ₯KWΟiYόTŠ)bnŒΑB·Κš•Λεατ›MήΑ6χTΆgϜ•₯ΛΊOpωn ύς‹”Ηsϊ^ οiˆO›N�\ΉjuŸύ·ΓwαγσD―€λάι³υΔ‰RΆ|―#Dάύ~ύυWy³Μ[‘Žρή•1±Ÿ-`‘Vcπι'¦Z1΄aγfή] w}ηW[$Y²drσζM©T₯š9z,άγνξοΏY³ηHΏώŸš]sgΟt*Cξί@ͺΧ¬mŸΒ+ € € € € €ρB€`aΌf@>‚…Α7&ΡΩ£Ψ,\½b™τωψkΚΥ-Ρωθ‘�Q°POp‡˜ζ̝'}ϊ…T-tWb;wφœ/UΖΉώc2Θβ…σ)wƒ!X¨Σܞ΅ϊιžΞΩξπ‚y³ειΜ™ΝjϋŽdυκ΅φ.σΊeγzI:•Yk:γςεΚΚΪuλC]�n ΅³Νš·”mΫ·›~λ—~}zKΩ2₯ΜΊχΤΧΞAΦΒΖυkLΗ+Wώ‘’ΕK†z&χ±Ί¬E Έy·"Eސ!?3›u*ο2o½γ}ˆŒ=R^Ι—Χl�lΐ ™6γ‹PΗψΪΩ1‰L°0Mš4ςες%’4iRΣ•-ΫΘζ­‘§CN‘<ΉδΟ�ͺ¬^³Ξ£Λγƌ’|yσ˜maM‡œ�ΥWεμΉ³‘Γ°‚…ϊ^ώΒ ˆjXQΫΤiΣeΐ !f™/ € € € € €Δ‚…ρa”yF@@ α D‘K=φΈ<φxFη y_yU%J$·nέ’ΫΏrΆŸ(Ν›5‘tι�9έ†`αΌ9³$γγΙ†›d“ΥΧγ'NJ† J‘Χ_—reo‡"‹ΏYZΝ;οτ]jT―&>hοl[½f­¬ψr•©ήψΤOHΕ οHΆl/šJvZΡΞέ",,T° ϋ22|θ ³~ώόyιέχφ”ΤΧ¬J’VΣVΊTIιί――YΦ/—._–!C‡ΛIλY‹YUχ*W ©ψί�™j…?ώΩ9Φ½πΕ΄)ςβ‹YΝ&‚wΩς•ςΗΜχΜΟ?χyv5Ώ£ΗŽΙ�e+δ€0όηκΏ’+G©Pαmyό±ΗΜuΎ\΅Z>θΤΩ}yώΉηdφΜιfΫ…?ώΒEŠ{μo%²c™`‘φ£Eσf�ΈQΣ₯7nΘάyσΝτΞ_ό[2fΜ(yσδ‘’Φ΄Ϊφ{5A0ζ3Yž–Y_L—Δ‰›σύψ“L>]΄Šcϊτι₯θoH©7KŠχ4Λa υ"Υ«U•;v0ΧΣΟ²­ΪΘΦm·?ΟΜΎ € € € € € GΖсε±@@` Xμ#X�*W­a π€ǏΛόΉ³"<..ΰO°PŸwω’…ςψ�Ξ3Oϊ~lkχ~k©S»V„$Α,Τ€WxmΑ’E�£gŸ‡Œ1L δΝη>{£N‘ΑB½ήΟίfΩΌƒ…aοkκjχ±o–,!Ÿφοηήδ,―Y»NΪuθθ¬ΫΑBgƒ…ώωGκΦo$Rt·Ÿ}"Ε‹5›Βͺι>ή{92cΩ`‘ή{ϊ”I’={6οn„Z·ΗΓ½£Y“Ζ�€qCI˜0‘{³Ηr ΑB=qψ°Α&«ΛΏύφ»T²¦ΆΎpα‚��@@@@@ˆΣ γτπςp € €@π , ή±‰LΟ*U©&gΜα©Η�" ζΎπΈΈt@Ω²₯₯_ο^ζ‘΄[οΎϋ|ΌͺU*I—;™}gϜ•₯Λ:ΗΉΓaΊρζΝ›ςν·ϋdύƍ�‘έϋζΈN»ΘŠ•«œs&Œ-yrη6U_Ι�Ί³έ^XΉ|±dx4ƒhΌ·+TΆ7GιυύΦ­δΝΕε‘G uΏ�Ύ(³ηΜ•αŸ ΅Ο½Aš5mb¦ voΏ~ύ†lά΄Ι \~*ΨU°@1Υ,?q\6mΪζ΄Δyrε’Ν;J槞 u�ϊ :ΜΓιΥ|ωdΜθΟΝ±&M–‘ΓFxœ§S//Ά Σ=τΩ>nόΔίΓ`@@@@@X*@°0–έF@b»ΑΒΨ>‚τ�N <όp:ɚ5«™*wχ�έ‘ ˆέ©>k_3YAΣtι�ΚΏ�^³¦£=ξ1΅―?ύH“&Όπόsr�ύ©εΤι_επO‡ƒβ™έΑΒa#FΚψ Ν³fΛφ‚όjB5δ“-kΦδ!+δ–2e 9ξΦtΣΗCM+mίΏGχ€ΒΫo›ΥY³ηHΏώŸΪ»"υz§ΗDίGΟ=ϋœάw_ 9wφΌœ8u2Μgυ~ >ϋά³Vθσωγχ?δη£Gό>ΧϋZ¬#€ € € € € ΖΗQη™@@  Xƒ@@ `_ΑΒ€/r‡NΨωΥI–,™\»~]Κ”+O°ξΉs@@@@@β‚ΑΒΈ0Š< €  ΖΒA£Λ ±)X¨Υ “'M&—._–ƒ‡1z € € € € € €€ί ύ¦β@@@θ Xš\ ξ”@l ή)ξƒ € € € € €qO€`aάSž@ˆ cΕ0ΡIπ(T°  <ΐlύtΐ ωbζ,―#XE@@@@@bΏΑΒΨ?†< € +ΖΚa£Σ € € € € € € ΖƒAζ@@` XŒ£BŸ@@@@@@@‚…Ό @@ξŠΑΒ»ΒΞM@@@@@@@FHΔ € €1!@°0&TΉ& € € € € € € u‚…Q7δ  € €‘ X 4NA@@@@@@ξ€ΑΒ;€Μ-@@B , mΒ@@@@@@@ Γ(Π@@  ,Œ‡ƒΞ##€ € € € € € €@¬ X+†‰N"€ €qO€`aάSž@@@@@@β†ΑΒΈ1Ž< € λΖΊ!£Γ € € € € € € OΖ“ζ1@@` Xl#B@@@@@@@‚…Ό@@ξŠΑΒ»ΒΞM@@@@@@@FHΔ € €1!@°0&TΉ& € € € € € € u‚…Q7δ  € €‘ X ΄XvJκΤ©εŸώ‘kΧ�Ε²žΗ\w³gQϊφξin0~ό$YΌt™ί7{ώΉηdΤηΓBι�%)[ΎB¨νw{ΓάΩ3%i�{d�ώC�©s—»έ ΊΏŽε§Ÿτ5}š$Ξ―W�TQjΧͺažσƒŽ]δΰ‘Cα>σψ±£$EŠ”ΦϋΏτιΧ?άcέ;S$O.Ν›5‘ηž{V�¦M+ &0»§MŸ)sζΞsjΉv­š’/oyδ‘τ’$Ib³ο·ϋ€[χΟœP'°όθΠΎ­δΜ‘C�ώϋ―ΤmΠΘοσ8Π·@Φ¬/H† JΪΣΚΥ«WεΔρrΰΰAΉ|εŠο|l՟₯/Ύ˜U%J$gϝ³~6}/.\πqdδ6U«ZEή­Q՜άζύφrδθ±Θ]ˆ³@@@@X,@°0]G@b³ΑΒΨ|¨Ό^ Ώ½κΌjΠ¦f~;cႆ Όφšιωτ_>Š…p—υ½SσݐΟΩΝ[ΆF| ψœ “Ə“\Ήr‰μ9r#I1£?—/½dύαA�PWΠ?DΡ ύ°αŸ‡ϋ=ή­k)[ΊT¨kθΏ7'Mž"C­σ££΅{Ώ΅Τ©]Λ\ͺIΣχdϋΝ_6*ί›΅¬οιδΦχφα#GβμΟέ¨ψ<ΡpB‰βEεΙ'ž”+Vvšυ³ˆ† € € €@| XF™gD@‚P€`aJ»T­FMyδΡ a^eΫΦΝ²kΗφ0χΗ‡Q κ/_Λ–-ν05kΪD�<π€,tHbΝΑΒX3TNGοD°°Y“Ζ�¬icsΟkΧ―ΛΎοφΙ±_~1λkΧ�3ΤςςΛ/ΙΤIΜq�ύχŸόtψgωΑͺ”xλζMωρ§ΓV:4'ω—ΆmZKέ:Q ψω#F©{ςΏ&#G„O'LœmΑͺ(u*ŽL°0ztσΖurΏUΡ:Όφυžo€~ÐΟBχqϊο αΓ†Hξ\9έ›=–7nά$­ήoη±-²+Ρ,ŒΚχ¦ύί~ϋΤ�Χ ²ΤηEΕηn<Ψτ)“E«λΟΪ—rζΉ]ΰž € € €άq‚…wœœ"€ €¨ΑΒΈυ>¨\΅†<φψγζ‘΄bΜΩ3ΏΚ©Σ§$‘υιyΔ >*ΫΏΪ&»w,ŒlΕBοwΜ¬/¦Λ Ο?G°Π&¬,ŒƒδΥΕ@ƒ…­Z4—”)SΚ៏Θάyσ½�ζ{uΠ€O€XΡ’f§NΎbε*ίzmΥj’ZURΫό…‹€g―>^GΔώU‚…αal η„�4ΑΉ·ΒΫεΝε�όσoΈΥCƒ³χΑΣ«΅«VX‘η[²uϋvΩ�Γ~ωύ?δωgŸ•ό―½jΆ²9ύψ“Οdζ¬ΩΞΊ.tω°£T­RΩΩφεͺΥ²ϋλ=ς»5ύρΣ™Ÿ’2VΓύϋJ珺:ΗDe`aTτό;7Ά}v,τo\9 @@@ n ,Œ[γΙΣ € €±F€`a¬ͺ;ͺΣΩ5iή�L}|σΖMY0Žœ:yΒγ<Y‡Αή΄’`+©UΒ"šκ42Ο•Š…ήχ#Xθ-{Φ ƞ±²{h°Π>/ΧιS&9ΑšWσ w*PχuΫ΄n)υλΦ1›>θΤY4lΧΑΒπG4Ά…sΒφΖW^=»ΛΫo•3ΏzυiίρC‡B«�]σ₯θ«ώ{²�§dΦμ9Ξώ˜X XͺžΧŒmŸ] =Ǐ5@@@ψ!@°0~Œ3O‰ €ΑΒ ’Hw¨LΉςςΜ³Ο™σwZSeMy[Ϋβ…σδΙ'žoΎΩ+u4ŠφΗp uΊΚ)RHήΌyΜ=/^Ό$‡~<$S§ΞΝ[·Fxο@‚…zίB_—œ9^’‡�¦“δΙ“Ι•+�Θ/Ǐ[Σ¦–!C‡Λ«βOxMω[₯J%yΚςyΤͺ@©aΡί~ϋMΎ�α«ͺΠ\Ω΅{·Ηιφ~‡~όIͺT«α±―ͺu’Ε‹›m—�Ή"-[½ο±?6�βγ,<�Ώί€x±"ςbΦ¬rΟ=χΘ‰“'eώ‚E2uΪτ0)tϊΫΊ΅jΚΣOg– 2ΘMkΪΫ£Η~‘;vΚ !CΓ<ΟήΡ‘έϋςRφμ’)S&I:•όσΟ?rςΤiY½fΜ˜1Σ#Τ¦Υπ΄*žΆ6ν:Θϊυμ˘ΗΗύϊHJ뽬mή‚~WΪs.D … ”Ϊ΅jΘ³Ο<+χ!ΫΞΏ6εIDATέ—�„Œwξά%Χ�]“:΅C¦βmή’U¨ΰqΦ¬/HΣ&‘?3ϊQ>9ΪηfʘIΊwνμμΣ1Mœ8±Y�ΪͺΒεnή�Ÿ*Ι¬P·ΆΜΦ{ΰϋο7Λ'Nœση�g–υΛχVE°ΑCC¦Θu6Ζ’Ÿρ¦2jcM}zωΚηΙ~8”-]Zς[Ÿ[™2e4ΣΖλgΦΩ3gεθρ_¬€�:SέΡ9ΑkαωηžύΡ6}ζ,σωXή <ε³>―³Ύίτ^αŸ¦ΤέΊuν"yrη”Œgύ\�~�2i�T©R©‚ά›,©uήA5z¬ϋ³œ&Mѐ¨ήϋΙ'2™χΒ©S§dΏuό'Ÿ υ­aΛ­χΆtι’Œ3šε VΈ£GŽšeϋΛΈρÜJΫ>&’W·Ι–mΫd�δ©>OΡ)½σδΞeφυμέOŽŸ8ξq\d?»άχtLͺT�$+ΌmΖξΎϋξ3Ÿ—ώω—UQτgωςΛU²`Ρb>Ϊ+C „‰Ω«ζυκΏW₯ύ<ΆωZΡχO�\ΉΜX^Ώ~C.]Ί(‡‘qγ'ΘΎ}?„:₯lΩ�R‘|y³½οΗύε«Bbž<Ή%ΛΣOˍ7ΜηϋPλgυφ;CΩ ]>μ$™ŸzRτ=³hρλ³―¦dΛφ’$½χ^ωΕϊ‹]»Ώ­θnξΟ­}ΦΟύχƒ―ζ~ž9VΥVΟ… ’aƒšΛιϋΎϊ»!ŸΉΊ‘A½Ί�ΊU ³O�πC?‡cΊΉƒ…-ZΆ±ώ½–Ϋ―1‰μχ¦Ϋ,A‚„Φϋ'‡yD}�|χηηŒχχ ώ jg}&h›5w�δ͝[ςεΛc>‡ώώϋ’8tP&[ŸCήοŸZ5ί•7 4η­ίΈQ¦[?�½›ϋ{ϊK+π9gξ<οCZ¬ϋ&~^Ϊηj0΅Q£RΜϊwqΊtιD�8κΪυλςΗοδ»}ϋdφœy²{Ο퟿ξχ»^#ΌŸΣgϞ“Ξ]»Ω·r^υΝ›5–/½$iJk>ΫυίΰηΟ“έΦχΨΈ εάΉσΞρ, € € € l ƒmDθ € OƝΦj…Ι­_Τi°iΨΰ±ϊΑξd°0,( |6pp¨)½$Xh‡όΌ―a―k¨πƒN]B…νύ=Ίw•wΚΏ% $°7yΌjŸsζyΕc›}Oο`‘VVΣp€^λΏ�ώ“‘ΓFΘΔΙS<΍m+ϊΈƒ…ύυ· φωzζ#GΙΨqBν�_ς7jXί ‘y ζM›·D�γςζΙ#}¬ͺPιIο}š³�χΤ{Ϋ-¬`‘ώb�„±Vpζ s¨Vϊ¬Χ ±ΟϋΪΧ ζΧZο֐Άο·–D‰<ƒDή}φ,,_�¬τξΥΓϋPkZΞR½fνPΫuƒϋ}ΰσΧF qΉ‚φχ—λŸ‹ϋφ}/5λΤσΉ/Ψ7ϊϋŒϊεΚWτ°}ΠΎΤ|·zΈΈlωΚ0§L-Q’˜ ψ€Ώ9_§€.lo4νέZa¬ξ=z™Νϊύ0fΤηV(5‹χarιςe'|«‘²šuκz£ͺžΦη¬υΨi­hπ«mϋLθέή7cκd³ΧΓ{υ5­lxΗϋΪ§΄…σηš]ηϟ—b%Kϋ:LΆl\o>Στσ½D©2™¨|vEfL΄ƒΓ† 2γη³³ΦF ‰j…Pο¦γΉqοκŸΩsδφ>άYΧPλΘΓ­@`fg›{ACL¬ŸρήΥφά!Ά?ώόΣη{AΦΦoΤ$T˜Υ}ύ@–-˜+O=ω€9εκΥ«r―(τnϊ~m�¬ΉάΥη[Ήl‰ωω£η.RάΩη>wφΜι&$«ΫόΪ]ί͚66—ρΊ§ŠoΩΊ­lΪςG,ϊΎ&zο`oϊ<+–.‘$IB*ώψΣaΩ»w―<žρqΡΰ…»ω jx v­ΫΥ΅ή*WƜ^°PοΩ°ώνΠ_™2₯πΩμ9!.ϋΎkΦ�χώjΕ§dVυ;mvΥS]ΦjT'ŽŸΠEΣt\ζZΥΒbcσχυ³Δ»ͺš,όχίe§UMυδ‰SVΈο’#χχ™ !ͺƒ™ŸuϊΎΘόΤSβvοφ‘T|ηms-ύLΤΰΟΕ‹₯Πλ―ΛΓιvξα,ΤχΑ’…σΰ‰V�Ϊ°q£ωŒΥΎj…Dm§=-₯Κ„T΄Σu­Βg‡Χž°Β½ZMQΫ‘£GΕ»βε‚…‹E?»£ΪζΞι'4lβQΩK―­»βœVr¬]―sKoΣ@>»τ"ήη뢈ΖDƒΤγΗ†„€5θΈΗͺF¬ϊ3V«½ΎφΚ«V5ΐλ’ο΅Χυr‘ZξIβDIΜφ"E ;ߟα |Ϊ_J/fΞΡ ΦΪuλ$‘U-3‹8΅CΨ.ΤjΟξ*eή‘2}ο�ί°Iώ½ϊ―Ήž]vΣ–-N•ίœ9sΘψ1·Cΰζ¦|Ω²e«΄nΫήεκνΟfλϊ)S¦΄ͺθuΒλήΑζQ#‡;Ÿ‹:%ρVUOws‡P5«αΓπΪ«ωςI―IΥͺUδž$!ޟ $Σf|αœζž*Ύύ₯f’Υͺς«ŸΩϊ‡-ϊο(­ΜιΝ9'Gr!2c’·Šμχ¦:)RΨΊ‚˜ͺΠ•+U4Λϊ9²bε—fΩώ’UυV―^k―Š―`‘ΎWΞόzΖTYΤΟ+m€-f…ίά^[ΎΧάό±‚ξΧγ+T�jφkΈvΑΌΩ¦β«ξΣ?™0i².F©EΦGoΩΟK=·y³&�΄q#]4Οχ΅exΨϊYŸ4i2ΙnUκ̞=›ωΪ€ι{ζύΘΟiύw΄χƒL7Ζό;Y―₯lύ :nU~πΑε•|yΝΏ‘΄ͺρ˜qγυ € € €A)@°0(‡…N!€ €q_€`aάγΦm;˜_€j°0UͺTfΩϋι�ZΏ Χ ά… Ώ{ο ͺυ;,Τ %Z©ΔnΣ§LΆ~±ω’YΥιθ>0Πήκ5`‘t΄ϊχtΕzQw° •5θƍ›œ{y�W‘¬ΏXv7 ΙU�RΡ :ΨϋμjcvΕB­R¨SjΣΠMο>ύL(Ηlˆ₯_"λγ,t(4ό·tρBI›φA£R΅zM@ΠΚε‹%Γ£!A# Di0Κn@š?w– (iˆ¦F­:&HjοοΪεC±ƒ §¬FΛVm<*=ι½;thkM§ΌΛcΪJοŠ…?Yυ—εvΥC Ο5lάΤ#¨`ί3ΆΌκ” :E·Ά½{Ώ•:υ:]Χ)MuΊH»ω ΪϋμΧovο0‘œπ‚…φ±φ«ύύ―cχRΐ˜½/ΌWύώ�['$Τ¨ο©.Γ;7Άμ τ5 “υΕ¬2Σ <Ή4ϊΌ¬)f΅Κ¨ΆVP°ZšfΩύΕ;Δ¦‘μvν?πψ~Ρc._Ό,ZαJ8«V,u*Ύiπi΅5έ²6έ7Ϋϊω§ŸΪΌƒ…>ωΨ Ν…―ΎήσωΎtχΩζΣig}UxΥ©ΨGŽ™ςzΒΔI2tψηζ^Ρύ₯aƒϊ�ͺEssΩ‹Iž}|¨Ό^ Ώι±―€N·žΜͺLϋώ «ΩίΓώώœήΊiƒυίFχ™ΛUͺRM4μοnΖ>xπ GΘΨ½Ÿe@@@‚A€`a0Œ}@@β‘ΑΒΈ1θχZΏnή’ΗΓh•Σ§NI‚„"­ιΖ΄š‘6 N™<9τˆΪw2h€©ΜrόΔqιΪ½—{—\±¦²τώ… Η~¬)ς† ψ™9�°OΥ)η†dV�|D*ZUcΒjφ/‰΅"R�ΌžΣ‡uŽ―ν ¬Ši­[†TgqάτΨΪ΅jJϋΆ!γ«Už4δζo³!�•ί΄’^κΥΜ©Ϊί.]»yΧό½fxΗi@$f‡'4Lwo�Κoώœ―!Y;τYwδ„UΉ¦lω ·vέaOχ/ΰΥ΅rΥΠS½φνέSΚ•-c�ηBΪΌqάŸ:΅Ω§‘ ψΣάΑB ,U―VΕͺpψ9՟ΐƒ?χpΩ1‰μyzoχτˆ: ’†ΕάmΗΆ-ΞTΈρ1XΫΘ~oΊύ ΊΟυ΅όΥΦM¦ϊ\XΥΤά!6 T«QΛ#ΰλ}Ν²eKKΏή!?3|M?ν�Φκ,άϋυNDΣκ{%K—s‚]φ=tϊž=Ί™Υ°Β=ξΟ‚…‘=oύš/Νψ²ΫΎm³©ŒͺŸσ­ šύYιξ_d>»τα=Η]‰νΛU«εƒNus€š?ΑBN½CϋΆζϊπuW>ӍZύT«ύiσ�@ι±-YΊ\>κΦέgΡΚqvUc;Ψ¨ar{κ`ϋΈˆ^Ώ�aΏ3 ³;Xθ+h5ξl§*¦χηή:λ} n΅½S±²Gθ6Ό}v�4 ­ίΧήνό�ώ'uλ5 Ώ»ΫΧ;Ώ’{ξΉΗΩτη_Ιόω ¬χb"Ι•3§σGZΑ΄ϊ»΅Γύ~u.ΑBdΖΔϋ’ξχΎ?ί›ξσνGωσsΦ,T›‚…‹Ί/ερύγλ3JΏ·η[‘Ψ ω·”ώΫ$cƌζηΞ“·­1ΆΏŸ=.Ε•@}’ςy9yΒ8Ρ*ŸΪϊτλ/sζΞ Έχ ν?2Π•.[>Τϋ:ΰp € € €wA€`α]@η– € €" γΖ» UͺΤ�ΐͺTf·‹�νL;¨Ϋ4ΈΧΨͺ e‡ ΅ς�©“'μΓοκ«ύ [;qεΚ?ςJ~ίΣ%ϊ{ w°pΓ†Ξt„ξσν_žϋ Ί 4X˜'W.yΗͺΤυ¨Uρη‘tΙ½�� zύerβΔ‰Ν₯΅z’VQ΄[׏:KεŠ!‘·ή}?hJΥ°|5˜¦Ώ\Ξ¦ΥΗ*XΟHΣjZ«V―‘ kWI‚ ό>Υ=etd}άΑΒ+WI§Ξ]<ξο{κ>=F›;΄’λ:e‘6w�uΚU{}Ρ’₯�­{OsŒΓ4τ£M+S•(]Φ,ϋσΕ,t―U£ΒšBΤ}\ Λϊ~Œμ˜ΨGΉ_Ής­i ΛΞ―Ά˜ Xa}Ÿ»+yl|έΟΔ…Š…Q“Θ~oΜ5Ϋƒ52ΑB}Οk₯ΙlΦ—ι�₯³¦ Υκ…u]›e^Ν_Π,»ΏΈClZ½ͺnƒι3έΗΈ—έΑA_ΣZκTΩZΙN›;Xθž2VχΩίΣΊl'²¦z΅\Ύ‚Θzl ᜨމ;œΣ’e§"Ÿ;Ψδ€ŒΚg—>ŸΆ@ΗDΟΡ)Ιϋτ ω Τ€θW;vΘ–-Ϋ¬©’Ώψό Ί+υi•>­ΦηέΎΪ²ΡL5¬Σ!ηΞϋͺ³ΫbλΩ»―Μ_°ΠΩ§ Z‘RΗY+ώ+Y:TΥγ`?WάΑBϋ³Π}ͺϋϋΞϋίξώκTΘ:%²6χHό`…΅r�―¦―ͺΦtή:•ρ£V^ύ±�-’Α�ΖM›{Œ‘ύo#½Φ%λ=ͺT­α�rWά[Ά|₯tώ(€*©―{ϋ»ΝύŒ‘“@Ύ7½ϋe�;*Π`αjλί6ν;~θ}9ωvΟ. Φ `ρR!€ΰ>Hϋ:b؏Κγϊ~«ί¨‰hb’βΥΟΛ^=»ΛΫo•3‘΅vνzΩ±k§μά΅Ϋ —-^ΰ4υߏ_~ΉΚͺΎΗ|ΕDP3&ƈk"€ € € @°χ € €ΐ] XxWΨcδ¦ο·οθ\wξ¬/δΤ©“ΞΊ.”x³΄5%e6³mϞݲyΓzύwkΕώ…­ΏχŽ•;X¨•R΄bŠwsWϊ±«y£λ ‡ $… …Οx_wА‘2yΚ4gσΈ1£$_ސiπ4l"»­ΚƒώΆ°|9"οT »£ΏΧw§•Β΄bX mΐ !V°p΅¬ωrE §‰»Pd}άΑBυVww«ωnu3•€ns‡>κάIͺXA ›;ΌϊςΛ/ΙΤIΜ©:}`ύ†ύ½Œ„,Τ tνΦC/]ζχ΅":P§‹μ˜¬XΆX΄‚W M§&<}ϊW't©Α�’eB‚ξλhΕ8­§-Ύ £2&‘ύޜ:mΊ›ίT6 dΊgύλίΏ―©Jθq!―ο)^νέξ›χ”΅φ1ξΧέ?²ΒΝo›Mέ{τ 5Ν»;ΨλΊογΎ^XΛΎͺ걁„s’:&:eΈN�ΝΰfUΫ-lUέΥΦΩͺJ»lΩνΟΦ¨|v™ Z_άVώŒ‰}^Xγί~ϋ]¦Ν˜!“&O΅ χ՟`αΰŸJΡ"EΜuάΥfέvWG-\΄„t‡Ψ|}ΖΈ―]άϊwΥΉsηέ—Τ²;XθλίυκΦ–χ[·2Χ7~’ �|€sύ¬]Ύt‘ ΐώώϋy£X ³oΠ€O€XѐjyT…ΣΠΨ'ύ?6C½Πn+όΩ Ρν?\Y»j…ž6}†|6p°Σ]p�\ύώϋδέΪu=φGf%:Ζ$οMο>Ϊ�Ž 4XθzΊ―ΉeγzI:• §ζΜγ»�u·�]€R…wœΣ&Lš,ZΝ2¦Z >ξΟϊγύy©ο±™3¦YΣo' uΊVR7~|„Σ’,¬ψΞΫ�½ΫG‘ξ§Ag&}δΘ1ΡR]3Τ Ψ€ € € €@4 ,ŒFL.… € ΰΏΑB�­‚ύΘΦm;˜κ&:ύάΠA!ΣόΊϋόό YεΝ�―ŽφΛ/ΗdαΌΠ|άΗί©e ’έ{ηTΘν¬iS¦H!ηϟ—QcΖytεβ₯‹²zυZm�Έƒ…Z‘K«ζy7{ŠNέ�•΄Βͺhβo°P§IΤjZvΫ»χ[ωnίχrᏠrσΖMΙ“'·:5z¬υάcνCMMiΪjΧkPΕϋβz�>C�{ο5Σ}κϊ‚E‹€GΟ>Ί-M1λ�§·σχ‚+­ͺ1:΅υ{Ν›JβD‰ό=Ν όa…QΎ0ΗkP/2>ξ„VˆΤJ‘ξV°Π]mG+μlή²Υ}Z¨εόΙͺŒ³Ϋl5_>3ϊs³μkŠΞP'»6x /^Ό(χέwŸ9BΗΆr•κ•£\§Fj1²c’§τ?μχ=oέϊO&Z‘  {γΊΥζΌ?ώόS ½Q,Τ5άΥ)}…~ΌOˆK υΩ";&Qωήt›Ί+§ιτ²ϊ«iˆoΝκ•N¨PΓƒλ7n4•:/]ΊdNkέͺ…™VU«Vε}΅@¨KΉ,£ΗŽ“‘£Ζ„:Ζ½Α]ΠWΨ6¬`‘»’žNϋΕΜπ>ώυן’Σδz·@Β9Q}–MΦ?ύ,Θ_π 3ύρΖυkδ^λs^«Ι½V G£ςΩe_(Π1±ΟΣΧϊuλHMkšβ΄ito6ΛZΑυJUΒόYkŸΰO°pψ°ΑRθυΚΖξjŽφ5τu‘5₯qζΜ™Ν&χΤ¨ξ›―χΈ―`‘VΥͺ΄–υλ7˜S" 6oΦDš6©Φ©a_ δ»›»J`›vd玝bΏΒͺώκ>ί{YÊK­ o‰ώ�g²;μ¨―Ÿ}&‹9E§΄Φ©­έM-μΟqwΠΡ}L Λ‘ο{ς½ι}�ύο¨@ƒ…S¦N“ƒ=�`A―½gΧS!R—έΆΊn·ρcGIήω”h%#»΅οΨ)ΚAMϋZwλ5²>‘ 6iΤΠΌτyǎ› #FŽςϋΡέUηŽ=*οT¬βχΉξ`α‚E‹­PhoSυ'λ Ο›k»μΞΉƒ…ώŒ‰}žϋUCEΕ‹“R₯JΚ“O<αμ2tx„Α‚…ξjoΎ~ήκ 7¬]->˜Fτ1^Ξ•ΧιCdBlξŸ%Ξ…"XΠ°yΓΖΝΜQξ`‘»z’} χΏ4Tθ]IT�@CjΣ@Φφν;εÎΜΊV¬ΤΚ•Ά5+—ΛΓιCβZQVΏ‡΅=R^Ιβ₯οΉΥkΦy\Ϊή λsάγ?V"3&ή—Κχ¦ύο¨@ƒ…>ώ¨[wο�8ΑΒ°|Ό�ΕΎ€―±·χEυ5ŸθϊΌ΄ϋ¬Σq—*YBŠ/&ixΐήlώ=£��ρΥ",΄―£οΡ|―δ“2₯ή”‚―0Alέg΄νγxE@@@ ΨۈΠ@@ ž,Œ;έ°Is§z™V,Τ_–»[ξ<ωδυB…Ν¦CΘΚεKέ»ƒjωN Ož<)eήΊ=ݜBΈΓ'ΗO—rε+†ιγ�–§‘�°~ ΊkϋV3ν›―*Rzρ‰γΖHξάΉΜ}ΌΓξ°Μš΅λ€]‡ŽaφΗ{‡ύ ρCVΥΌ*Υj˜έ:œN §νοΏ/JΕ*U£e:GsΑ»π%²>ξ0H  K/*> gΊΓ!ώ>ϊΞ―ΆH²dΙδζΝ›’#Gωuͺ;X¨U©΄Ϊ•V–š;g¦ ΑκEΒͺΐιΧ ‚ΰ /—/‘G}ΤτDΏοτϋΟέάa‚…n™;³¬Σ±κ΄¬ΪΪΆο(kΧy†Šά½ΠκŠdΣζ+δ—'W.™0>€at Λ—++½{υ0χτ5Υxƒzu­*Y-Μ~χTΘξ0TXΣ2›“"ψβη̚=Gϊυ�4‚3’ΆϋM+Œσi�~ζ"λΦ―—)R:‘/_•ϊ’ϊΩ₯7ŠŽ`‘ϋ©έaαEK–J·ξ�Ηή}€GU§{ Ub$4)WAšY€Š��4uAšΰ²*uέ•KUCW€θڐήl¨€%�Δ .ˆJ€JI0A@ΊαžχΔs<™9i“Ιd2ωώŸ‡Μ™ΣΟη?sfžg~Ό�1ΞΕ^Σ φλΫGΪs�ΉRΕJςξͺeζπΑρ'NHΛΦmνγψbk�Έ±ΌM­κ£΅nZr^Ή|©½Š[°Χ^Θ € € €9,@°0‡;€Γ#€ €yU€`aθτόM›Iƒ†w˜τνΞ²nΝG).ξ£ZΤυ%#Μyџ*Ϋ·&͚b₯ yΘ`‘^ς cΈ΅h£ΚΥ΄Κ–VΫ�ΆfΝZyjψHk‘Χ£ώ€¬?$kΣΚuZΑΞ­mόβ3;ψιό‘^ΧmΦ΄©Μœ>ΕήΜσΗzηυνg Aj ­km€?τjΘdωΚUΦ,σΡϊAά,Τ–±Nο4†dξΦ£—NζΚ櫏―ΑBκQpEŒ‘{΅ΉxtΎφI“&½*:Ν›σ²4j˜<Δ‘3\’ΫXMC$ǎK:t κϊάŸθ°Ϊt8ΏΑO<™βυl.Θ%¦O‰’ζΝο6ΟvΙ�e2nΒ$ϋ̝&I°Π¦ ΨDwcΫ§ŸJžR‡ŒΤ s©5φφ‰!ƒΜΕΡλΧΛ ΑCS¬κ †ψ+X¨A?xο)T° ω^0p°lάΌΩ<�Ύ5„«a\mΞ`‘>_Άd‘*Χi·αfuΎ6N3Ζ]‡χlΐJ ξ«ΞΟλ|NœψEZ΄Nώ\²ζιcVο]ΊηϋΠσ³J—»5=nQ#L}ψ矽;‡7O­Β›s£Œ !)ν§ΘχKBB‚½ηΩ_nωΚψL`/σ5Δf½�μ₯3‘˜˜hΏ†œΑBΟͺxΊίwW-·ƒfm#;ΈώG€Ρ#‡KΧ.ΙU©­C»Ϋt™ξ³^½:�ΓyλrηggΥfg΅ΊΈψxiΥζ^έΔnQΟM4^#­ΝηkΦ�“§†°—ω:αkŸ8—•χ¦+­•τtXι–ΖϋΚν½oΛ,Τyύ ²οAϊ|ΒΈ±�>2ΩΜ³š€ΎO–.^ %Kκͺ2ο•�ΘΜ—fΙ¨ΓδΑ�ΙՍ9*tξšζ9˜gςOf}²rΏΤc;vάυV,[,7�1DyZ΅ί<έ.]»vνφZ€Ÿ Œοηְߍ›4u=/― ™ € € €@,Μt‰ € B°0t^ωΓςΛγΖpΘaaaf΅Βλ£ekΜWζΆjΣVjվ͜Φ!{g͘&Ώ'ύ΄o…ή1²"θΕΣfΜ”ϋH‹w§ψqή3¨λ;[—ΞδŸ£’8ΧPΧΖM›ΝΠ_R�Ωων·’!m΍V©YΎb₯ΔΫΤ—>½{™AkΏna ΎΈUΛ–ζ*Ϊ‡oΞΫ·l•KΖtΥͺ·Hξ3C#žΓ1§,Τa™ίzγ?R¨P!sŸ―ΎφΊLŸρ’u ΉξΡ_ƒ…Š£Υ°΄*–6ν₯Λ–Λϊ εΤιSf₯(­:t1¬ŸV&τό‘Z+bκΪZ‘H›†>ߜ?_<(eΚ”‘–Ν›Λ½mορfΩφ°*š;0ώL~α9chΡδΧG‚Xy SΧAk½`¬Sη6Ρ* V›�φBYΏ~ƒάtse4p€ιi-s jHΧΩ¬ΐn\\œŒ�gHρβ… ’‘N·ζλ‹™&ΨνΈΉažσ=sΑ0\i Ι½gΟχrώΒyΉlTΰ\³f}Ξp—ΎGτžύΕz)TΈ°τνΣ[¬!Όu u_γǎ‘ν#uR¬sLfεή₯Ϋϋ,=r„tιάQΆnΫ&}ΌV~ά»WΒ―*j~ώ=Τ΅«-z•ξΪ k ΨΩ΄_τ>j΅αÞ΄Γ‘:ο… —¬E)ΥK-jΖg£6 4Ύh΄~=yJZ·ii„±“+φκ²ΗŒ Ύσ^ΰ›ξ73Ν,Τν>ώB–-[!W_.CΆ‡$Φ*΅zοwkΞ`˜΅|Ζ‹³D«ρzΆGχίΰΗˆVηό,:ZφοΫ/q'βπ\ σs«–ρZ·šΎ†‡>9Μzj>:Ο766V^ž;OΞώvVΪ΅m+:,³ΥrtΊλ9dw�μ¬F£U�fLμ\œκ΄[°P+qιpΙ*THu; οd4X¨;qVΣay΅Ί—3`‘ꁂp/>ΐTf†BΆ.ί΅ζΉ=z uΎω±~šA`·mtžVΏΤ*˜VK+X¨?œ―\ΆDΚ”-c�³u«τιϋwkΣ\υθ5­χ :ƒlimg-sλ]F°Πr\Ύt±TΉω&Χ…žΓW;9žθ=ΗͺεΟ`‘VύzνΥΉβ ZΗ֐ΟΥααζSΟ`‘ΞtΎΗ¬mάΣ :+πyn;ρΉΜαΚ=ηgεΉΫ0ΌέzτLsΈΤ¬ά»| vν�)ΝΛL­ΊžŽOsγ?jΠpΝΪOΜgκ2mj”6‚¬©5 π 6ώC†³ω+ΔζάgzΣ©}‡pnwζΜιΩϋΡA4ηr~ϋΝΧΕ κχVχ΄s ²ZΑBΟν=Ÿ;zLώΪ©‹W·ΖΙδΙΟΫο%ΟντΉ[ Ρm½ŒΜσWŸψϊήt9ξyΎkΧ}"O>=ܞν,΄xLΌχώ2ϊ™Ϋs_ |vκϊ`ŠPί½xα|;„«aE­λΟ–Y_ο—Ξj‡©�ŠU«δΩ1γR[l„½KΙ{«VΨ•£+zon λΈMzζ_’ίΫi € € €«ΑΒ`νΞ @q‚…‘ΧΑυoo(Mξjj6¬+ΤjRџ�“;Ύ±fεΩGύQ|Ξμ—ΜλΧΚNοhhV™³@τy­š4ιω(kVšϊ£εΘΓεv£κIΩ²eν §†"ǎŸhoΫΉSG£JΠ@ΉξΊkνyz¬ν_-+Œ!ŒuXemQS¦™CqΪ+9&tΈΓϋώ·ƒΧ©ϊCτ«W{sΜ—Ν`…gυk—κ Ϊ²«B€u¬@υμΣΧ|ΝZ—γμOk^j/^”ΫύΕu±V­ΣjLžC€Ί�μ˜Ω�ούΜΐ¨ΞJ/ΨεΨ,ΧMjpορύΚZυŒκ}₯μjrτ¦UΓ:쬆ΌœM‡₯Υ ©Œκ]„:ωλ―�τξδŠ›Ξυœαί΄ξ‹ΞmtZοΙ�zf΄Τ―WWJ•*eφε�έί™χυη'M0Wίb gάχ±ώž›Šsψπ§€Bως^ΛτΌ7lά,³ηΜuΦΧΪ@«ΠjΥΡ�Ζ±χϋ?ϋ²ςw­ΥόφΈξγΥζuκ΅ςiϋϋ’«’₯u_ο]Ύτ‰V±λΡ½»HΥͺΚΞ¦ŸZΕ0jΚTΧάW›7x}ή9·wN{†΅2οΔ c₯ς7:W3+YΎώζ[ς�¬Ω)ζλ“τήΗV…Θ΄‚{^;Mg†,ΤκΙοΌϋ�ρΎθ( &W΄ΥM΅O‡ }RbΪ—ζžœΌ 7™ΓΕ»m χ·Ηϊυ‘Z5kΊΪj₯O­0:Σ¨x˜Ϊ°Ώ–­xυ?°XMο­ZY�ƒ„Ώš?ϋΔΧχ¦ήΓ~ψA©kTΥ 7ΒΙΦ5{ΑBΪ[Ώ–+WΞ¦Έtι²,XΈP&OnΟΣ‰­[6Ω€YηJΞο$’ώ˝͜‹ύ2Y_ξ—C‡ –ΆΖpΩeΛ•υ:ηS§NW—šC@{-τ˜‘aΛ^½ΊΛέ͚ΙuΧ^kχ9tψ°9όΉsυΣ¦}W'ΕύΨZ�λΟ1ͺnjΡ@@@f‚…Αά;œ € Β C·sK”Έ^ͺήZέΈΐ+²�§X9zτhθ^¬�¬ό 7HνΪ5%>ξ„1LΪ6?μ1υ]θq*•γŒc}“ϊŠi,ΡT«Cκ†εΟg ±wXtx>ڟφΡU΅ͺΥδcθΚγΗβδΰαC)ͺ ύyfήS‚ͺZ­ͺ>(+‰Ώ$Κ^γύzόxœχŠypŽ`J–,aV_ΣαLiΉS@ο―7έt“B,"�ύο�4CyώΎB}Yα(½χjEJm+ŒaœŸ3֜vϋ£ΫΥ¨QCJ•ސ“‰'εΠ‘ŸEΓΒ‘Φ²rοΚ¬…šVΉ₯Š‚Œωσ›―ƒΨ½?Ωύ“Ωύet} ΓΦ¬^έZΨsθڌξ#;Χ³‚…ϊ:ΥJͺΪ4Θn|žμΨ±3ßΞαrS §y^Η-Ζχˆˆ’RόϊβrζΜoΖχ‰ƒιϋΠ>­[·Ž�F[ηΉbΪ,΄†’Φο#΅jU—#FHύ‘Ψ|Ή_κ½GmJ•*)ηΟ_4΄�¬Θι72\�P±βΕδ”14ΊΓŠχuX±@@@ΰ X|}Β!€ €yB€`ažθf.@<# ·pξ„qc₯}佦Cv %šg€ΉPΏ Έ 3{€V-[Κ”¨ηΜΝNœψEZ΄Ύ'³»`}?Έ ύ°[v € € €ΑB^ € €9"@°0GΨ9( €dƒ€VΐzοεςΣΎ}ςρš΅ςύ?ΥρΒ€M«V�Ζ~S›·yΟ½‘Ω^)/.]† €―ΑB­Ϊ’EsΉ­v-ΉλΞ&φ°Ζsζ½β:Μs�έ%, Ί.α„@@@‚…!Σ•\ € »ζ�ώβl@@ u+X˜ΪIII2ιω(Y΄xIj«0€ ψ,|θΑ�2rψΣ)Ξυ»={€wŸ~„fS¨ξ ΑΒΐYs$@@@ςšΑΒΌΦγ\/ € $ ƒ€#8 @Θ²@xΡ’2qβ8£Š[m)^¬˜½ΏsηΞIlμO5ušlίώ΅=Ÿ rZ`αό7εΦ[«Ι/ �²uΫ ŸΞ}Ϊ˘g�e�τΨQωzϋ?q‘Β ϊΕfM›Κτ©Q掟š" .ς�AΨ# € € €δI‚…y²ΫΉh@@ ηζ|p € ΰ –,!η/œ“γΗγόφˆ € € € €@€`a9 € €€·ΑBoζ € € € € € € €Α @°0zs@@ς ΑΒ<Ψι\2 € € € € € €δ ‚…Ή’›8I@@ τ†^ŸrE € € € € € €  C£Ή @@ Χ ,Μu]Ζ #€ € € € € € €@ X˜G:šΛD@‚M€`a°υηƒ € € € € € €$ ,δ•€ € # s„ƒ"€ € € € € € €ι ,L—ˆ@@²C€`av¨²O@@@@@@@ λ ³nΘ@@| Xθ› € € € € € € € Xd € ΰ-@°ΠΫ„9 € € € € € € €@0, †^ΰ@@<(@°0v:—Œ@ˆ δ“+R°@~γ―Θ₯ΛI!z•ΩsYΨe+{E@@@@@ « ³*Θφ € €> ,τ‰@  ©.Ώ]Ξ/GβO₯y†… „Iρπ"ϊœ$%i1gZ‚₯H‘‚’t%IΞώv^$_ΜGn΄Λ)ŽŠ € € € € €@`Φ›£!€ €ό!@°—B° „-*…‹±O+!!Αžv›ψΰ½U’Ϋ8Ϋ#'φX�ςÏ{³SL?7qΌ4jΨ Ε<}2{ξ+²hρ―ωΩ=£s§ŽςHχ‡ΝΓ >ZΎΫ³'»°ύ—(QΒM~Γ.aΫιΗ6ηy:er-τ> ζΙ‰΄iR qβDπ =‚Ο•xφΒn ½τΝδx+[$J– *OwΈΉΉCώGώΧC½o??\Ύr£¦oΐΙ�ϋΣ™Σ„+Ϊ9υΩ(@ P€ (@ P€ (@ P † 0XC_§M P€ bΊƒ…1ύ Ύzώžž^θά­‡ ’ΉλπΪδ c_}S4\Q¨@̞T)π7΄[Όd&Ž£g²gί>tνφΕ+gεκΑΒ¦?GΟ/Ί«Jt‘>‹£`αΨΡ? \Ω²!ή·iΣτπ­Νω^j,#¬ψΰαCΪ΄Ή@Hΐ°UΫφ8yς”Ν©Δ‰a萁(_�œM»υ`λO?£ΟΧύ­MΑφ_g°πΝψ~hV4ώqOƒE;o›‹ΡπF"OΜό.>Μγ‡ιs0f™σ*cΘgξr‘E½’Θ’)-ήHš*)7U܏ ΰωση(ςI‰WΞΐΪ‡«-…œ&MjlΩΈ^^žϊ9ώόλNœ8Œ™2’XΡ’6Οf,”J…ύϊ~e^#>xˆTͺ‚`Α�-g.ΑB ›5X(mR rη�=xρς*V($‰λK7ΏιΧυλΥΥηe)aΉζβΕKȘ!ƒ 8–ΡAU9)•—―X₯―sτγu {ψ£hΆΔπφz ΏώΟq°0Iw΄©ž νΫ&‡gΌkΈz. ΖΟΎ‹ Ώέs4ύH΅΅iV›–E {<• D€ ͺΐ ύΤ�ΎP}ΏTΑΑpσ{�²„*$π nώj_»ω=SŸκŸΏZΚΩO]¨†‰s" Eqψͺ.ΎΉύ©ωYov5;λάΈO P€ (@ P€ (@ P€ˆΛ Ζε·Οg§(@ P€Ρ(ΐ`a4βΏ¦‘;t κΡf͘‚'ŸΌ¦‘Γ7Μ¦υk)S&}S­:υpA…ΨfNŸŠ"… ιΆ½ΎΔΝ»BνΤ•ƒ…ύΏξ‹υƒ‚z'NœDσVmΜgω²ΧhΪ€±yl,άΆeήN΄”΅.%xilΦ~eYε΅‚ƐσΦ`‘^jYyζΜ�τ­ΉsˆEσηιύΗκ;QΌT½/?²gˊ•Λ—ΒSUΣσχχG――ϊΪΨV½*Ύ2X_/•K•)oήkΏσ:ƒ…ͺ`Κ$ρΰ§‚|Ÿz#y’ψx3©�& ΔΫΙέ‘! δφ@žΒ /±φž«ιzβэμώΕ^φWUέpο™;nΛΏ'>xπL₯ψ"ΈΥ¬\ ƒΊTT†/TαAo*TΑ΅τ±ίc5φC@… %8tτQU }¨p†Ώͺ\¨ͺκ ’΄ΈθπaΌΰ“¦>“ζΔτ›±xMθΏα™Ά«Ω…gξΌ– (@ P€ (@ P€ (›,ŒΝo—ΟF P€ \X€ΑB~9N˜Z† Q―α级ǏaφΜiNθΥω]dΞ”Χ―ΦίΎu«TΣϋ­[Ά@χn]τώΊ ρνΐ 0[H3pε`‘<Ÿ<§l;uكmγ·ϋ(QPΤ,”ίΪΥ+υ΅=F‰�ΆΛ!Λ’Ε;wόl†G+|ZwξάΥΧ[ƒ…6nΖ7ί΄sΝͺεΘ‘=»n˝/¨ͺ₯τμΡ-š7ΥνRPͺΪo›7¬EƌusƒFMπ‡ͺ†ιh“0₯„e ©/GχEΆΝΛΣIβ{α­$žΘώ–'Š˜εΚ'F²,j9a―»xώDύΤ(*ŒθΟΎ�ψΰαω8v� Ώ]H€3wqν‘ eβˆmηΛ„;eTΡEU‰0ΐO…ŸΓΛSUv0@άυ'TEH΅²ή‚–DφWaD,τSBΥ��RΣ” αsψΌY ~)>Α�5Ώ`ϊŸ"6±Wάε v―˜"OS€ (@ P€ (@ P€ βŒƒ…qζUσA)@ P€ €k 0XθZοΓΩ³iπy€K—^w{`�^ώΝ6Μζμρ"Ϊ_»Ά­Ρ₯SG}»5@h Υύ}οΚUψ4Τ!\9XxθΧ}:όηνύ+μ9&OΕ‹ιvk°°tιR˜0v΄nίΆ}z«κφΫ”IPΌΨ'ΊΩΊ΄5X8xθ0¬^³ΦζVγ>???”―TχοίΧηǏ…2eJ›ΧήΊyKοKθΝ، Šr<ΰΫAXΏq“qΚζ³bΕς52(˜8sΦLœ<Εζόλ<Ȗʍ?MƒzŸg@όDwαχδŽ>ήύ±\e7Χύκσwƒ‚ΘWΞ,oa|οΜH_…%Γψ^jΉfaTΉBΙώ0TΑBw7u^ύσπRIB΅tr@Ί© ©G"Έy%Qm TΌ0όγ₯ƒŸΗXΈjf-ΩξŒi†©Χm¦Iρ" P€ (@ P€ (@ P€ @`°0Όd>"(@ P€pE ]ρ­8gNξξξθΪ£δS–³0v”s:Ž‚^͟‹άΉ?�=φ=ΆlΩj޲uΛF$O–L7kΩ'Ož2ΟΩοΈj°Pͺ <°WOWBz•ͺV·Ÿ:ϊ΅j|¦Ϋ­ΑBλRΒK–.È‚ΏGλ½ ΑΪυt?Φ`‘΅Ocπ±£@Ή²A­•W―\ŽwrU24� νσΗQc°pρ‡—-RΣ§MΦηƌyσ:Ό.*“xΉΓ]U.|ϊΒ’βS›ΚοαΛ&™Ρ²΅ νωήΒγ«±h]BLΨπRW/tζ<�¦I†)}s!έjΩeUwΠ#ΠξτJ€Žγ«Β…ρ¨ƒ:<θ�„*D"Tηέ€=ΎšŽ‡ ͺ:ˆ¨~—}T%Γ˜:–� ϊN9sΞF_ΡmgΜƒŸ (@ P€ (@ P€ (@Έ.ΐ`a\�πω)@ P€ @4 0XMπ―aΨbΕK’πΗEυH7oήΐς%‹^Γ¨αBBwϋχ \½j“Pš„ΣBΪ\5X˜"E μώe›žφƒ‡QͺLω`0ΰ›~¨W§Άn·†[΅hŽέ»κφω bτΨΰΟo½χ»α#°bε*}½5XΨΎCg€:‘ϊηζ�φUΰPE %)• Υ�ψ«c?΅²:’₯“U01ΐ߁*(όγΤ•Ψ΄γˆΣζjίQtΫΩΟ‡Η (@ P€ (@ P€ (@Έ*ΐ`a\}σ|n P€ (Ν Fσ ˆΒαΫuθ‚ΔIλV­XŠkW―FαhοΊNνZ8 ˜:ΈpαjΥmβ΅Φ`‘£ ]H7Z—ž5{&Lrώr½Η�//O<|τ%K— 6kΘΟ,¬RΉF  ζmά΄ύ υή.]{`οώύϊšˆ ₯Β T”­M»Ž8|$κlz(ϊQ9[₯H…­�χή/� &‰ο†oš'C­*>˜2Γγ·DΝ’$J€yϊβΓ\Ωΰ Bƒͺja@ ”ΰ ΪWΗ& *¨(ΑB+TaC΅ νr ψΒMͺͺ^Ό_ψ`ΨΈeΨwθLΤL\υέvQφ`μ˜ (@ P€ (@ P€ (Γ,Œa/ŒΣ₯(@ P€±E€ΑΒΨς&mŸ#uκ4hά¬…n|ωβ¦L ^εΞφŽθ;š8a,J•(‘'πΛΝ8σΏ³Α&Σ‘]Δ‹O·W©V#Δκxέ»vFλV-υuγΖOĜyσƒυε¨ΑΊ\οΎύΠΉkwG—Eͺν§Ν.]:έGυupεκ›ώΆo݌4o§ΡmΦ`aξάbΡόyΊ]ξ‘{ν·ν?mAš4©u³΅οˆ ϋέ κΧΥύMž2 ΣgΞ²�₯=<άίέ_”{‚ΤΣaτF?άΌχ\…σTΕ?ζ‹§ŠcΆͺ”λ»γ»IΟ°ς¨JσEΑ/žfώEςε„Ÿͺ4θ'Λ«° ΏT$” ‘ϊτJJƒŠ ͺπ£ "ΰ…Zξψ9ΰη­.π†›ο#΅lσ?τ}ί7ςα吏ψγbόqξšΣgν*vN0vH P€ (@ P€ (@ P€ˆ‘ ΖΠΗiS€ (@˜.ΐ`aLƒŽη_§^CdʜYŸ<σϋ�a› žΉκvθΧ}H˜P- «ΆZuκαΒΕKΑ¦:gζt,X@·‡΄V?Ύ:\ ͺϊϋ>W�ž© ΰcψΏ|¬B„ŸΗTŸnώOαο#�T 0ΐGΥ8τU‹$«J…ΟΑΟ#³6ΓW_`ΐΘxτD΄Ήš“‹έP€ (@ P€ (@ P€ bΌƒ…1ώς(@ P€ @Μ`°0fΎ·WΝΊ[ήππτPΡ1}κ$<χv^ιUc‡ηΌu β;wξ’Β§Uή.U₯‘lǎ@Λ6m^—9Sf¬[³ͺ$ΪΝΏ€­?ύ άΎsΫΆνpxŸ4nΫ² o§}[ŸΏwο¬ίΈ<„ŸŸ–,]β}a=‘7o,˜;ΫΌ|Ρβ₯Ψ·o?²ηΘ†�;™ΑAΉΐ,”γ~}Ώ�=Ωώό9&MžŠ?�:‡>ό;΄3«9Ϊ/γΡ`‘Œ3wΦL(OvuΨr�ͺώxςτi}œ=[6”-[Z/—|E-±]£VPuC}�ξΗ’ωs‘;χGΊυργ'(^κΏΰ£έ₯N9τpwCβxn¨Ϋ ]ΊeC†Μ °pϊ¬άρWξϋΑΫGUT[ќρΡ­Z| ]ψ�»«J FΑζ₯~~ΡΥΚΌ‹ήΰs/ͺ@αCU˜π©ϊχL‡ U²P…}Υο«άέαη«–HVΣtW5 =άΤ?_ψ?~·δΐλ½ΦX·γ&L__� gqΦΤ]ΙΞYΟΔ~(@ P€ (@ P€ (@ P€1]€Α˜ώ9 P€ (C,Œ‘/.”i*ό1Š—,₯―x¨ͺΜ͝33”«£χԐΑQσ³κz7mF�N({Ά¬X»z₯>'AΏ₯ΚβYaIkŸΦΞ�ίΈYF9€­Fυj{έάά‚]"G >Fv;ϊ”+ϋκjˆφΑΒ)R`Ε�EH:uˆSΈqσκΦkdγ™`‘˜O›2Ω\b9€/]ΎμRΑBcžžnθΣ(ήΛ– ίΞΊ‹‹·}ŒSϊ3ΗΫρΠ€ψ˜»γ>�<Œš`‘§‡:^5>€―Ο ΅΄ρs TŸπΣU%ψ¨ΧEά7, TCΏώ*`(αX7ΌP!ΓžΊαή_ά Μ‚»ώπΫΙsΈpι–Νσ8σΐμœω<μ‹ (@ P€ (@ P€ (“,ŒΙos§(@ P€1X€ΑΒόςB˜zΛ6ν‘ ΐ½Gxπ,·ΰΉO |Τ’Θ~πρUχ«ΠaTnΡm•ΟΖΎ)@ P€ (@ P€ (@ P€1I€Α˜τΆ8W P€ (‹,ŒE/“£ *„”)Sθ€€TS Ο–?>€K—Χ―ίΐΙ“§Βsk„―•e¦sζΜ‘ςlnΈ}ϋ6.œΏhS1ΒGαyӸፀρqτΪKxΏ ΄)Ύ— &O€Ÿγ₯―ν9› #q K 7¬”υ>φ€―οK΅Δ±ž=υΑƒ'xδνŽϋUP„κί?Oόpχ±/«c€ ϊIήPMΛ_~DΓέvΡπΘ’ (@ P€ (@ P€ (ΰ’ Ίδkα€(@ P€ @μ`°0φΏc>!βͺΐ άΰιΟ}uHΟΖA-Cμξα‘B|QS­Π뽬)?›=υΗߏտ‡/U%Β—ͺ‘T,UεΑY9zςƒΖ4ƒ}Ί‚]°I± (@ P€ (@ P€ (,Œƒ/L P€ \A€ΑBWx œ(@ P€ (@ P€ (@ P€ (@ΰ 7a (@ P€ ΐk`°π5 s P€ (@ P€ (@ P€ (@ P€`°0hΌ… (@ P ς Fސ=P€ (@ P€ (@ P€ (@ P€ˆ  £B•}R€ (@ ΌR€ΑΒWρ P€ (@ P€ (@ P€ (@ P€Ρ"ΐ`a΄°sP P€ (@ ω (@ P€ (@ P€ (@ P€ (ΰš Ίζ{α¬(@ P€ @¬`°0ΦΏb> (@ P€ (@ P€ (@ P€ (C,Œ‘/ŽΣ¦(@ P€1]€Α˜ώ9 P€ (@ P€ (@ P€ (@ P Ά 0X[ί,Ÿ‹ (@ ΈΈƒ….ώ‚8= P€ (@ P€ (@ P€ (@ P Ξ 0Xg_=œ (@ D―ƒ…ΡλΟΡ)@ P€ (@ P€ (@ P€ (@ „$ΐ`aH2l§(@ P€ˆR £”—S€ (@ P€ (@ P€ (@ P€ˆ°ƒ…¦γ (@ P€‘`°02zΌ— (@ P€ (@ P€ (@ P€ @Τ 0XuΆμ™ (@ P  CΑα) P€ (@ P€ (@ P€ (@ P€Ρ(ΐ`a4βsh P€ (—,ŒΛoŸΟN P€ (@ P€ (@ P€ (@ Έ²ƒ…�όv87 P€ (‹,ŒΕ/—F P€ (@ P€ (@ P€ (@ Δh cτλγδ)@ P€ @Μ`°0ζΎ;Μ (@ P€ (@ P€ (@ P€ˆέ ΖξχΛ§£(@ P€.+ΐ`‘ΛΎ§L,ω›oβι“§πσσuJ―»“)R˜CήΏίάw΄“9SfdΝ–�§Γ“ΗOpεΪ5œx#Ί}Ϋ6θά©ƒ9׎ΊβΐΑƒζ±±“=[V|υUo-RΔh2?%Œ8}ζl,]ΆάlsφN«ΝΡ£{W‡έζΞWΠa»ΡΨ₯SG΄kΫZvνή{φξ5NΩ|.T³fL΅i“__?(όq°v6D½@T½“ξ];£u«–ϊ:uι†ύ~τΓ|έηK4jΨ@χΣ’u[?~"�}FeσfΟD~¦²ί¦Ν˜‰)S§Ϋ7;ύXB…λΧ�BκΤ©ƒυ=wήŒ<δ+χ4QNΩφξΫο”@h°Αc`ΓβσπΡGͺPkς(Ÿ z§Ό`ξlδΝ›GOβU�=‰ή™rt P€ (@ P€ (@ P *,ŒJ]φM P€ (’ƒ…!�ΔΘM[΄RΥ΅R…8w w,]΄wοή ρW8‘!}z¬Y΅ $0§Σ₯kμέΏί<–©hΈrω€RΕBΫΎωc”… έΏI'ΦΓίΎuGΗσΟU…©η5f\hΣBXƒ…Z’κ†ΖΦ±C{€PΥ(,4D^�gT½  mf͚YΏΤά}„κΥͺκύΧ,μΨΎ:vh§ΗτρυΕιS§qιςe}ΌcΗNkθO5i†3gώgžwΖN±’E1uΚDέΥΚΥk0τ»αΞθφ•}8+ΔφʁxA˜œυN,΄%Ž`α’ωs‘;χGz"E‹•Δ3ooΫI98b°ΠŠjb°Π±KX[, «―£(@ P€ (@ P€ @μ`°0vΏ_>(@ P€pY ]φΥ„{bLτο’ΌrΊuσ†Mm;tB’$IuΫΚεKqύΪU›σ�p ΛΛnέ²Ι“%Γ_ηΞγο{CΒ{²9 nήΈUuBΩ†}?ΛW¬�ϋƏ?oAκΤ©υaο―ϊ`Ϋφ_ŒSώμΩ£;>όΰ}}κΤ©)S&½�Α\ΌpΡμχΉͺ’ΨΉkwσΨΨ‘*‹3ΝΩh“ΟQ£ΖαΚΥ+Φ¦χΓb“%£{tοͺC˜Y³d†§§'�_ΏŽ3�ϋ#ϋχο;KήGΫΆ­QΎlν(KSΛ�°ώΉS§Okο#ǎ9Ό7¬²μυAίκΛ·ώΌ +W­~ε­sfNΧΧ:|ΣgΞ2―oΨ Ύ�™={vΈ»»ΑΧΟOΏ �]ΏΑΌΞΨ‘πiΏ~_ιΓΥ*j�ύ%y[·n‘ΟO6'Ož�ϋŽ~„χ”*Y͚~ŽœοζD�€IτR»‡†š7kͺ‡θΤ₯φψΥΡpαjϋΊΟ—hΤ°Ύ§ί€oQZ7OnύNοή½«·?Ž‹λ7l�fX©Uγ3|ZΉ²gΛ†Τ©RαΙ“'Έ Ύολ7nΒκ5k­—:u?"ΑΒΌyσ EΣ&Θ‘#;�«ο—ΏΏ?.^ΊŒί~;„1γΖ›Ÿ|θgΆΛύς;"ΫΡ£ΆίοUk֘ Γϊ·@ϊ™9kŽΓ%”ε\x7©ΰ?aœRK4O™τ»`τ!Ώ³?ώ0žΨ΅k–-_aœ�Λ©Χ�QCΛίΛZ*Δ]¨PAΌ“#όδwE?ρ•σό²ΧΘ“;72gΌdΙήΠΛΎ_»~CύώlΗβΕKm‚˜Φ`a΅Οjι%¦ε»—1cF5%JoοηΈ|εŠϊοΓ9ŒSsuτ·Λx/Ϟ{cδΘQαSpZ·l Κk—ΐΐœ=ϋ'6nή¬–ŸOχ?x/ŸΏ@ο>_›�֝ˆώž΄jΡΚ—Γ;οδ€ϊ�ΐΩ?ώΔζ­[QΉREΘχQΆάωl«ψZΗε>(@ P€ (@ P€ (»,Œέο—OG P€ \V€ΑB—}5αžX³–mπΦ[oιϋφξή…cGΫτΡ₯ΫπŠO·M4^/ls Œό~*Z hΣΆZ΄h†Ε‹ι™9 Ξ›=²œ°lsη-ΐΨρτΎό€ΝΎ=;Ν€³*As PvA6oX«C5φ·uνή{φξ΅ovxž›³« o&Oξ°/ DφμύŽ?μΌ,σ,‘«Ά’c§�!S{φlYΝκšaιΟZ%rΣ¦- œlcG�€reΛ†8¦υZγ’’Ε‹c�ΔqϊpΦμ9˜0iŠqJΚ2Ϋ•mπΠa‘θΒσNš6ώ=ΏθέwH?’"X�X=B·=ƒ…'εχh萁ζ�ΐŽξίϊΣΟθσuG§"έή`aΗφνΠΆM+σχή~g�ό :u± €YΏφΧΫ[�Ξ„ηoΑχ#Δ�eΛν»‹ΠριGυ}'NœDσVmlϊ°ώ>ΙΞ²”³±υRί9#΄ϊΰαC‡$`Ψͺmϋ`ίιC‚Άί ˆ·ΣΎmtμsΖΜ٘4eͺΩn5ΊvνšΓΏ}�¨ r™ςΝ{Œγ9cϋO ~Υ·?9bs*2c� ²ιΠΑύίφΘόžŒω=*V¬ΰ`Ϋ&ϋ1mΟςˆ (@ P€ (@ P€ˆΝ Ζζ·Λg£(@ P€.,ΐ`‘ ΏœpN­θ'Ερρ'A!ΌGBBwΊ—χή�ŸV©¦χŸ?Ži“� ΰ…s˜(»άΊ”¨Tšγ™εwUAtλ&v[6o0Èςί‘={χαζ­[ͺ‚ej)RHUL‰Π‚…�Ÿόή�λA$M’D…UΛͺβ|nz …KhΣΊΟyρ�%]USΖJ€ώ–U(WΞ 7ώ}οΚUψΤz›Ήό²ΡΦ1«¨Šœ#†3nΣοYͺrζΙ“οΏ—Λl—ϋ_DOδΏQΓ‡1ϋ–pυ΅«ΧT`>?ή•κ…–Ν~LΛ)ξR€ (@ P€ (@ P€±\€ΑΒXώ‚ωx (@ PΐU,tΥ7±yΥ­ίP”‚*ΜI¨πργΗjωΘDˆχo₯Bi“ Ω₯K�-Ω±‘œΧΦΝλ‘>]z<}ϊΥjΤΦΕ^,”Y όφΤό¬ΊYύM–=΅V‚“₯3₯›}U+g<5 9{Ξ\ŒŸ89\έvιΤνTRΆ¨Z+a=v\……zΨ,S*Kbη|χ=Ύ,+:gή|½/?¬φγ'LΒμΉσΜs²σ^�\H¨–&uTιΠζΒ0XΗ’hhKςNœ0₯J”Π½V―QG/½mΛ&3h$Ο ΟblύΏξ‹υƒ‚q—._FZAϋr>:‚…ΦωΨΓd‰Ω¦MSGT εχCͺJ€I6©HΉ`ώl30Φν‹^Ψ½{>'Υοδ;"ΛΛ}½Ύκ«ƒ»ϊ€ϊρYυͺψnΘ`}–P¨q_x>Γ,4ώ†H� -†,οll’]½r™ΩJ@ςσ¦ΝuXΝ8oύ\4ž Ξ~¨ƒ”yς‡­ηνGφo£>Cj3wφίΉ>¬ υ’ΫͺΪα™3�ΣΓΘσΚsΛφψρ/UFο?τ�υκΦΡ‡ςϋ)K.¨€©±IππΛ/{ͺε¦γ'΅€Ή±Y«Κοί獛™ƒΪ·mƒΞ:θK…eIcY άΡίξukV"[Φ¬ϊ^λwV":¦υο‘,!=|ΔΊω1cΪ|\€°yl ωEζχdՊef€pΑΒE5&¨‚ͺ 4Ξ,δΛ—Χα˜f#w(@ P€ (@ P€ (@8!ΐ`aœxΝ|H P€ (ΰz Ίή;‰μŒΚ”«ˆΌω‚–Άφεηη«BBΛpϋΦMk³KμΩ»'dyXΩ¬7kΰΜΡRΘr½†~όa>x�=9 ΆIΨOBQ±E6LΥΑΒGι₯T¨«T₯ΊΝς―βQ«Ζg<(h)α}ϋ sΧξ&“u™ιΐŠ•«ΜsΞή±Œ|;λ7n�οuώΌΩz¨ κX²ύ²ύ']ΝX>Υ€zτθ1J”Ά]YO;wόlVm¬πiHεFΩ’#Xh]^Z–‘6~zBκΗoφ©0pP…Ι¨ώvθ0Ϊuθd §?­Ώςžε}Λ&Α�Ν›κύε+VAͺΪoΦ₯½4jβ΄ͺ|Ζ8a Z₯ d½Œ.ΜΟaC£z΅ͺϊΨϊwΖΌΰߝΈ,ά°q3Ύωv Ν£―Y΅9²Uc΅ηδ"£ͺ¨μχθυ₯MΐTΪBΪ¬!?γwΫΈV~7Ψ«₯š£|ΒΊ΅V&»w ͺ–ϊγ¨1XΈx‰ykDΖL‘"v�ˆ”jŒeΛW2�qήΌy°`nΠί#9ΆϊDτχΔ~Μ"Ÿ¦₯ي)‚ιΣώ «[Η Ί‚?)@ P€ (@ P€ (@Έ"ΐ`a\yΣ|N P€ (ΰb ΊΨ ‰Δt<ά=ΠΈY Ό₯–£”MͺrωωϊΒΝΓžκŸlR±πη­›qφ *UΊ1šHε»Ε ηιͺh²œp­:υΝ½*XψΑολΚz)ή|Sί#§Οž!ΐΟiήNcφR(ΚΌ ‚;Φ0“«U,΄ξδρnέΌe>₯±ό¨‡ZŽW–/•νκΥ«ΊR€qѐΑu%H9–%SwμΨ‰ίΒ‘ΓGΜ`žqmd?σηΟ§—ξ–~V�Z YβΈQΓψΊΟ—ΊkY ΅fνz%k·�΄E·νή³WW’΄ΟΆm߁ήͺͺžύ6e�Θ»’­u›φ8’–Η•-:‚…‡~έ§CŽRIσγbΆA"™“υ;ΑBϋ–ŒY¨@̞5]vυRΗΖ2ΈγnjB™2₯u»ό0ΎCΖχGΪήNϋΆ|θΝ>8f΄GζΣϊ~§Ν˜‰)Sƒζiί§“% ilŽζ*ŒΉ―Ϋ°ί ͺΆhάc|Ζ…`αΰ‘Γ°zΝZγ‘υ§ρ{βηη‡ς•ͺ˜Adkπφ­Ϋ¨X₯šΝ}‘XC~ΦP―qΟ―ϋχθ%˜ν�φηε»Y«f €K—©R§Bό«οJ(O*iΚ6a�ΘRζΖ‘1­ΑΑ–xί·{'’%{Cc ωEτχΔZ%2€1μέ…€I“ΣxV~R€ (@ P€ (@ P€qC€ΑΒΈρžω” (@ Pΐε,tΉWα ΥRΑ«,Ω²ιϋ<Έe‹κ@˜4ώΈ(>Q!& ΥHΈpΚΔqπU‘CWΨ–/]€—Υ•Ή΄iΧΡfΩKkΘΚQΕB#$χJ%Ά/zφ6«LΥ©UΎιwww9­Ϋ:eΩ^έΩΏ?\9XX±byŒΌΒœuώΦύϋ tΩ f“—ͺοP‚ Μ6cG*Β͜5 ΫΆ�b4EϊσΘo?~|œωίhΤΈ)&Œƒ�%KšύJ(©PΑώέPέfTœk�ΈΎκέK·-YΊ #~eήcμHUF©Ξ(ΫΐAC°vύ½�Ίƒ…Φ€–ί*U­�ηaύakT {χι‹mΫvX‡ΤΛ!K%EΩ¬ΥώV―\ŽwrU°³Ή!„G‘Ε. ssXƒ…ίτλ‹ϊυώ[ζϊUμΪ΅έΥί G›ρwEΒΩ±u)dGί­±£@Ή²A?­!@kθN–ToΥ¦#6‡m֐Ÿ5Œg\ΌkΗ6ΌυV Z΅�}˜0Nύ (υίίγϋΟ1γΖcήό…fsDΖ¬V΅²ω·eγ¦Νθ?ΐΆš£tώΣζ *ΰ˜Nc}–ˆώžT©\ #†ΣύmΩϊ3ϊφλ―χ­?¬N­cZ―α>(@ P€ (@ P€ (ϋ,Œύο˜OH P€ \R€ΑB—|-šTχž_ꝿΏ?¦N,8X«� f ž:q;Ω‘qœy“΅τkΏ,lΎm2$T&›}5Qέψ~Xƒ…²ά­,{λhkίΆ :wκ O͘9“¦LutY˜Ϊ\=Xxψΰ~]IT‚΅°΅nΦ }Ό^_tGσfMυεα Z�N‡΄d±uΦύˆ„όδ~k%[k•Q£οNΫ£C» ΏiΞZ«2ξ?π+δwΟ~Ϋ³kήLž\7[ƒ…ύ=±ώ7ΜXΪέ~L#x)νΦ1­Χ•-[Ζ&ψ-ΛΪΛwƒ(@ P€ (@ P€ ({,Œ=ο’OB P€ b”ƒ…1κu…8Ωδ*pΥ²uPu§'OU°pZππMžΌyQΆ|%έΗέ»w θήdiΨ… ζΒΓΓΓαT2«jiΖRƏ=ΦΥͺΆlω ΣgΞ‚5”qηφT¨\5X-š7EΟAaBk`*Ψ…lˆ�`α‚Ή³!AΩB φY—έ»₯ΛFπ)ƒίΆ}λf€y;>1ΰΫAXΏqSπ‹ΒΩb Ι|“%{C/]½hΙ2Œ5ήήΟα©yρΌΌ` JZ”W�^Aυu‚l­4&ηε:Ω¬ΑBG‘DkΘοUΑΒ°ΌΣΊœͺu.rN6«mT =gΣ&ρe―/τψ²L΄Ήdλ�u_4¨΄Όπδ)Στο>ρXƒr‘…ƒ+V(‡Q?U$=|δˆBFtš‘ .[ΎBW،θψ―ΊΟX6όΪυλ¨Z½¦ΝεΦ₯Α,”ύΊ &„TΔ­[Ώ!.\Όd3nH αɧϞα“β₯‚u?gζtTK£ΛζŒ`‘΅š¨£1­α[Σς‹θο‰5°yηΞ]ΘςΣΦ-s¦ΜΨ°nάάάt³uLλu'6�;)νΦΏΦλΈO P€ (@ P€ (@ Δ\ cξ»γΜ)@ P€ @Œ`°0FΏ>›ΙK!Λ’“³¦OΕ³gOmΞΧoψ9�gΘ¨Ϋώ8σ;~Rα0Wί&OΕ‹ιiZ+ΝIƒ58'ǎ–x]£–‘Μρο2’ /Α£ΖΘ₯NΫ’+X8bψ0H₯>Ω€2›Ths΄­Z± οΎ“CŸ’₯lGηθ2H¨οˆZ>φ™··y^–AΎ­›Φ6γ€Υ΅wŸΎΨΆm‡q*Ÿς>μΫm1žνθ‘_/^<³οΩsηaό„IϊXξΫΉγgz’YNT–56λ§RΝ³XΙ2Ζ)½¬©„e³§ΚςΐλΧ�ΦΥεό«‚…a}'γnjB™2₯₯K¬XΉ ²4³±U¬X£FώwΑByŸF»�Ύ1,¬οsΨχ#°|Ε*}ΞΦ“°gΪumξ3:«Œ2[ZΧ8™Okψ*΄€¬Γ$΄™ A=œύί cς})V¬(Άm�Εh φ‘`‘όΎ¬]½RχuZ-ΩΫ€yΛ`ύ:«Α§Κίϊ΅κ™AYιݚ•jΙπ¬z(g gͺ�¦)\HχRH»XΡ’Έ}ηΆMθ0’ΑBλRθφαιR%Kbβψ�ώ–;#Xhog_sΒΨΡϊο€P?¬!ΏΘόžμάώ3R¦|Kwk�·TͺνJΥ]c³Ži΄Ι'ƒ…V ξS€ (@ P€ (@ P v 0X;ί+ŸŠ (@ ΈΌƒ….�ŠΒ<ΑΦm;ΰdΙτυήήΟ ‘²ξέΣΗε*TBξˆΏ„Ti Δι�ϋ?œ wF`μŸξ£LωŠr‰ΉΝ5 δΣΗμ›;o>Nž>­³gΛ†²eKλε’―¨εWkΤ ͺn¨O:ρΗΆ-›πvΪ·uχξύ£*dnΔƒ!ΛN/YΊΜ©K§ŽhΧΆ΅>–s²δ³|η?yŒLͺϊ©ό>TRΛjKε½’ΕJ: ΝΚΝ Κ}ǏόOOOΩΕ/;wβ·C‡!aVΩ~;tΔa(SŸ ηλίEY~ΚΤiΊ‡&ŸnV2•g εoΧ²%‹Μη;ϋη_X°hdΩέ·ί~εΚ”AεO+鐳uκˆ ͟kώύ–ίεΥkΦβΒω (X¨Z·j©+—lΞ ΦͺρϊΦθΫwό‚ΏΤΨωΥχίXά8iς‹θοIΗφντί(ιW–x§Σ—/]VαγRζί΄Ζ4Ϊ,4$ψI P€ (@ P€ (@Ψ+ΐ`aμ}·|2 P€ (ΰ� Ίτλ ΧδR€x M[΄²©ψ&ΛVΚRΒΖRŠ�α… η±AUb‹ ›5@c&“ωKΨeρΒωˆ?~¨c]ή5Τ Γy2ΌΑB#°–a–―X‰aί-νκθzke2λωM›Ά ί€�Β1}ΏκΟ5΄^βpίQ°Π¨vθπΥΈfέ: ό]H§Γέ>hΰΤ�YCίwϋΦmT¬RMο[—΄–ΐXώBΫτ-ΥκV,]d΄Ή@άΈyuλ5 &λυEw4oΦΤώς`Η― Κ a}'Φ%–ƒ diˆͺ`‘esWͺΓGŒ4«'€ί΄)“uuG£ΝΡη₯Λ—£,XX£z5 <Πζο˜1ϋ`«5f\γθ3*‚…Ύι‡zuj;ߏόK—-wx.Ό%‹Η€‰Ž«Zϋrf°Pϊ•\ϋvmlώcOφ₯zͺ3‚…Φ₯ΡνΗ°?vV°Pϊ0n J— {ۏc=ΆFτχD*h�XΆ3UΆŽaΏo?¦qžΑBC‚Ÿ (@ P€ (@ P€ˆ½ ΖήwΛ'£(@ P€.-ΐ`‘KΏžpO.mΊτ¨\΅šͺΐ–<Ψ½ώ~ώ8yκ8φξΪ윫6Œώq$*”/§§ΧΊM{9v,ΨT%όΦ»WO|\€p°s²άλŒYslͺš»( ωσηΓΌΩ3u“§LΓτ™³BνMͺJΥ΄°lsη-ΐΨρBΌT)_χ탂ͺšVΪ΄iΝΠ•Ti:μ{›ϋ$ˆΤ§Oo½\­Ν u FϋΔ΄ι3pύΖ στέ»αӊ6]Z³ΝΨyόψ‰  ­TUο¦MNω”ΩΠ!ƒt_kΦ­W‘Ε‘z_–Ϊέ²i½ή—κeυ4�ϋΦβργ#πIяm‚O�έ³g/ϊ,ThάoύžI›άsςδiμά½_φϊB_Φ·_]ΞΈΗΡgxήI�―ϋ’Nνšf8ιOΒyGUΕM#œΦ’u[?~ΒΡPαjλή΅³�ς&7MUοΉΙ獐4iR³§ΟžaΈZΩZ±�<©vδΉϊ}έ•ΤχΑΊ$΅\cΌ°Ψ@IDAT#ΛρώώϋlΪ²Λ–―°ήζΤύ²eΛ ­ͺT—U-σ›(QBέ·„LΛWͺ¬`«ΝΡͺe ΌρΖΟhLFͺ5ξΩ³/ΔeΑε:γχT*Θω€„qk˜>₯šžTξK£ͺ]&S•Smΰ !€³³Ά6­[‘“ͺΖiTH”~―]»¦ώfLΒ¨ΎΧΏ«Χ�Γΰ!�₯z§„ek�ΌNŸώ]ο?†Y:<$WΉ�PθΧ―€Z₯ύ&•RΗ¨ΏYFΕT9?{ζ4*XRQφγbΑ-·n^τκΏ[Ry±fνz6]Κ2ΐέΊtΆq”Ή?qkΤ³Ιςγ²ΙοRρΥΨ"3¦τ!•CΛ—/‹,™3λοχΉσ°qγ&Τ�UCWT}ως% }\ΜΞόŒθο‰ά7qΒ8υ·<ΏΩ—ό^ν;p‰&BΑ‚πβΕ .ZάσwBΪχψUW;΅^Γ} P€ (@ P€ (@ P f 0X³ίgO P€ b¬ƒ…1φΥ…:ρ€*P“)S€Rα–gΟΌqσΖ5άΈ~=Τ{bϊI gΌσξ;Θ –λ}ςδ™ͺΜxΑ&(ӟΟσ£>ψ©Σ€ΒC΅”μ΅k7τ²Έ‘υ&MjdΞ”YUL©Β->jιΣ+ψλάωΠn‰φsψL§‘Χ―ί° 9…61yN±‘@Ο‘ΓGB !†ΦGDΞIΠ4eΚ:δe vF€―πάσΑ𢡄^ό₯–΄ Οϋ”οBΜ9 ’¬Έ}ϋΆZžφβk³ ΟσΙ΅ςNsεΜ₯B”‰qηφ]\½~ΝiΛv‡w.Qq½ό>ηΝ“Ι’Ώc*€κ¬%ΙΓ2W;g�œϊχμΑ?pώβ…(?wξΥ²μqχξ=½δ{XζηŒkδŸy{›]ύΊo7’$I’ΐ―Zφ;"Ώ'2^‘Β…t(τΠo‡lΖ6'Α P€ (@ P€ (@ P N 0X'_;š (@ DΏƒ…Ρ�8 P€ ’_@–U—*�φ[Z51πΫotσΎύΠΉkwϋKxL P€ (@ P€ (@ P Κ,Œ2ZvL P€ (šƒ…‘ιπ(@ P€qE`ΗΆ­πτπΐΆν;pςΤ)x?|ͺ*dγƍΟΛK3tμΤŒ+$|N P€ (@ P€ (@ Pΐ,t—ΐ)P€ (@Έ(ΐ`a\|λ|f P€ μ~ΩώR₯Liίl�τσ6|Υ·ŸyΜ P€ (@ P€ (@ P€―C€ΑΒΧ‘Μ1(@ P€ ‚ 0XŒ„  (@ ΔAoϊυE±bE‘>]zσιύόόpγζ ,XΈ+W­6ΫΉC P€ (@ P€ (@ Pΰu 0XψΊ€9(@ P€ €ƒ…6< (@ P€Ȑ>=<<(@ P€pQ ]τΕpZ (@ P€ (@ P€ (@ P€ @œ`°0Ξ@ P€ ’G€ΑΒθqη¨ (@ P€ (@ P€ (@ P€ ^%ΐ`α«„xž (@ P J,ŒVvJ P€ (@ P€ (@ P€ (@ P � FšP€ (@ DD€Αˆ¨ρ P€ (@ P€ (@ P€ (@ P€Q/ΐ`aΤs P€ (@ :@a(@ P€ (@ P€ (@ P€ (@`°Π^§@ P€ β’ƒ…qρ­σ™)@ P€ (@ P€ (@ P€ (@˜ ΐ`aLxKœ#(@ P€ˆ… ΖΒ—ΚG’(@ P€ (@ P€ (@ P€ b…ƒ…±β5ς!(@ P€ @Μ`°0ζ½3Θ (@ P€ (@ P€ (@ P€ˆ ƍχΜ§€(@ P€.'ΐ`‘Λ½§N(ω›oβαƒNν3Άv–8Q"tκΨΉrεDΚ”)αξξ¦uα’₯X±r•ωΨοεΚ…©“'˜ΗΖΞΣ§OQ­FmγΠ©Ÿ|π>F ͺϋ\±b5.^βΤώ_ΥYήΌy-K$H˜7nάΔ… pύƍWέξσ+—/E‚ρpτΨ ς]Έοη  (@ P€ (@ P€ (@ P Ά 0XΫή(Ÿ‡ (@ Δ cΘ‹ Η4?­R 9ήyžžžpssC@@^ΌxŽ3Ώ�φοέŽžβΞ₯*\ΏvR§Nμ‘ηΞ[€±γ� .T³fL v―― ώ8X»3J—.… cGλ�–-_α#~pF·―μ£U‹ζh©ώ%KφF°kχμΫ‡‘#G95`xϊΔQ=Ξ‰'ΡΌU›`c†₯‘iγΟ‘H½Οs*όΈsη�°ά’―‘πfρO>Ρϋ‹Tpσ™·w˜οIV¬PY³d…·zΎΧP ―S\y'αuαυ (@ P€ (@ P€ (·,Œ[ο›OK P€ \F€ΑB—yN™H›φ4i�ϋϊλμYlή΄>ΔσqυDΗφνΠ±C;ύψ>ΎΎ8}κ4.]Ύ¬wμΨ‰ƒ‡™4B¬V­Šyά±C{€P•!c[°°MλVθΦ₯“ωœŽv�]»†ϊ ;-„ηŒ`‘ΡΗΙ“§Π¬ekGΣvΨΦ³Gw΄hήTŸkί‘³Ν;wxC m\4rηώΘ“ΏK?E\y'.ύ89 P€ (@ P€ (@ P€ˆv £ύp (@ P n 0X{ή{™²ε‘7ύ@~ώώ8zψ7\»zΩ²gGΎόΥ�ΎξϊάΆŸΆθκ…±ηΙ#�$cFDωrεtG}ϋυΗ–­?‡ΉΣeKαύχrΕͺ`‘„'χνΩ©«^ Δ™3�Úuλqηφ”,Y5>«Žψργk£ι3gaς”iaφ νB#™Š…F :–f°Π± [)@ P€ (@ P€ (@ P€�*ΐ`‘«ΎΞ‹ (@ Δr cΟ ξ�½'ΌΌΌτ-]΄·oί2.S¦,¨SΏ>ώηή=,˜7Ϋ<ηŠ;eΛ–Aϊ΄iuΥΐύ~ς).š?WUqϋHS΄XΙpUΰ‹ΑBλrΟRΩ�bεͺΈsη�ω¬AΜ}ϋ sΧξζΉΘμ‘@ #£ϊ½ †ξΓ³ (@ P€ (@ P€ (@W`°ΠΥήηC P€ βˆƒ…±ηEΡ»~˜gϞbΖΤΙΑ¬m‡NH’$©^uΚΔqπρρ v«4¬_» Y³dΑργ'Π’u[§O+s¦Μ8 ŸΩoήΌyΜκ|G3Ϋeg՚5‘V0 O°P“₯J–@ώ|y*ej$J”ήήΟqωΚόuξƍŸˆϋχοی/₯K—Β„±£uϋ²ε+0|Δ6Χτ�Ί²gΛ¦ΫN�ώ»ξΗzAŠ)Π£{WΌ—+—rΝ¬Ÿυϊυλ8σΏ?0ςΗΡΑΖ¬Uγ3 τ­ξβΡ£Η(QΊ¬΅;4¨_ύΏξ«Ϋώόλκ5hds>’Φ`αŒ™³υ8ΉσδΦKMK°ρΐΑ_1hπw6έΛ²Τ΅kΤΠmnnξ(P Ÿή—₯©O:esνΎ0wή³mςΔρH˜ >Ξ#;ήLž\ο_U•>οήύΫΌΞ? =Ύθe8•ηϞ-+ξ?x€uλ7 YΣ&ψ裑@UrΌ¬–Ρ>|δ(Ύω£Ω‡μH%ΘργFΓ]Νσ₯―z«ίΩgήή6Χ€I“ί  UaΤΧί²,sdΆπ|Χo«Š”ύ½wϋ1ε;ρiεJϊ{–:U*½^¦έ_US}ψπΝ?Ÿ~ϊYWΒ4/V;‘y'F?αΣΈŸ (@ P€ (@ P€ (@W`°Πί ηD P€  …±γ%§UΥύ6n¦ζξΫXΌp~°kπyS€K—N·o\·ηΟ�μWiˆκ`aΙβΕ1I…+Γ²Imμψ !^ž`‘œ ©3 ~Υ·Ώ ₯±Ή$΄`αΈΡ?B‹²IH­{^6χΛ½ƒ0Cs6« Ζυμύ•qη¬ _ΌxΒE‹§τη7ύϊBΒ[²EEΕΒ—/_κl‚Cz 8x;u5›z}ΡΝ›55CΫΩΎγτϊ2(€+Χ½κ}Xϋͺ^£�\½b6­[³Ω²fΥΗ2_cihσ΅sϊτοhί±“MxpΞ¬(X ΏΎΜ‘΅z¦£σΦώΓ²žοϊίͺšiΉ ŸΪt+aΘ‘CšK…Ϋœόχ`« φωΊ°SƍAιR%ƒ΅ ς}• ‘Φ-2οDϊ‰Θ˜ΦρΉO P€ (@ P€ (@ P€p5 ]νp> (@ P Ž0X;^txƒ…ϋχξΑ‘ΓΏΉμΓGu°PͺΒ΅iΥ�|ώͺU« IβΔϊxωŠ•f»μlί±Σ&¨gsRD$Xxρ�%œ9σ?άΌu ‰&D…rεπvΪ·u׎Β]! ₯Ί[‰βΕτ}?A—ξ=pςδUϊδ97¬]„j Ω€κί�έ» *π•T•₯Šœl7nή@εͺAU�tƒϊ±cΫVHe:ΩV©ŠtsζΜΓυ7P±byτλΫGW”sC‡}•«VΛn€7ϋPΩΩ?�RαΌΣxχw U%­A£&ψγμY}X΄H¬,­χέU•Ώzuλθ}©¨·eλOzίψqδΨ1lΫΆΓ8DΟέ•MPΕΒΒ… AͺdΚvπΠ!\½rUοΛρ²―>h Κ5b»wί>U4 *”/gVΐ΄¦JυΘΥ+–α­·RΘm3n<ζΝ_¨χ»wνŒΦ�~/ο¨κ5λΤ³ %κ‹Βω#<ίuωξI₯Hλf ‘Κ²Ψ{Τ3^Όx 3d@9hsΩ†}?ΛW¬2o΅†SεΎcͺϊ¨Ό3©”šCU‡όδγ’πσσE‘OJ˜χΘNdήIDΗ΄™(@ P€ (@ P€ (@ P€.&ΐ`‘‹½N‡ (@ Δ cΟ›6–B~ϊτ fN›μΑΪ¨₯“ͺ₯e;uς8vξΨμWiˆκ`‘ύs.š?Ήs¨«δεΙ_Θώt¨Ηα Jhj�_­A΅njΩέέ»χ˜γ: Μ>ETN6©:(UόŒ°q㨑߫ `}xτΨqtνΦΓ&¨ΆrωRδ|χ}^–až3oΎq+$€5πΫώ:@f4Κ2ΆϊΠΟΟ«V― Ά,³qmD>­ΑBϋκ‚S§LD±’Eu·φs΅Žeτ!Λf-[[O…Ί/ο¦Eσ Κ‡²ό°„ CΫ¬ολφ­ΫhΨ€™Ή€t΅dπˆαΓτνŽ–’–ηŠ™bιγλ‹ζjž‰%Ζτ©“t›ΨΆjΫή&$Ϊ\Βs.<ίuYκYΎ#žžžwίλ«ΎΨΉs—9άgΥ«κe›₯αΑΓ‡(U¦Όy�SΗφθΠ.hsG•%`YP-[½mϋ/ζ=φ;α}'ΞΣ~<¦(@ P€ (@ P€ (@ D·ƒ…Ρύ8>(@ P€ˆ£ ƞί΅GOς�΄xΑ<ά½{Η|ΈL™² Nύζρ…ση±asͺΜ™Fpη½\Ή?A|›»Η₯+βΙ�³±9ηύμώ:wή¦-²α [ُž`‘ύ½Φc©T'λdϋqΤ,\ΌΔ=†―Ώ +υٜˆΔ ”`]εjŸΩτ-•G‘{_²tFό0ΚαHF―3X8~Β$̞;Οf>«W.Η;ͺ2ŸlΊtӁRλέΊtB›Φ­t“„ς<ά=πΖAΑίρ'cφœΉΦ˝ΆžοΊ5Ψ'Υ₯*‘ύΆyΓZdTίGΩ¬•$»vξ„Άm‚žο§Ÿ·©%ΎϋΩίϊΚcλψa {:cΜWNŠP€ (@ P€ (@ P€ ^³ƒ…―œΓQ€ (@  0X{Ύ ε*TBΑΒ γΖ t©’―|Τ1γΖcήό…ζu‘ 7l܌oΎh^kμX+όm‘}ΚrΚ₯ΛVΠ—”,^\/Υ+ΎΎ~ͺ2α7ΨΆm‡>'Θ cG«₯£?�Η‡A›vυ~dί…Σ§G“ζ-lΊ³%·lύ}ϋυ·9o}ΌΞ`aξ|αΝΟ–-šα‹ξAΑ™³ζ`βδΰΛ“‹εŽŸ·˜Rωn—-_ΙfΉj³C'ν„'Xh­Ί–αν+mKšΫί+Τ…‹cξΌ  ¨ύyγ8ΌΑBΉ/²ccσ“ (@ P€ (@ P€ (ΰ* ΊΚ›ΰ<(@ P€ @`°0φ½πΟjΦAζ,™Νe‘ύό|Υ²Θwqξ―?QͺtYύΐ»~َ“'Ž»ΔΓW«VEUν³] ΉWΟH’8±žχΤι3mζωδι3δfs"α [Ω֊…;΄CΗφνΜΫOœ8‰S§�χά‡ΏŸ? *h†§N›©Σg˜ΧΪ ?~b.›+υSKoΪΌΥΌ^v¬ΥΫnάΌ%KW؜·?xτθ!$€(ΫwCλϋeΩς>βΩ5· ιΣcγϊ5z™ei,Z¬€SΒpF(Plš·jcŽ';1-XΨ©c{thΧV?Γ‚…‹0jΜ8›η‘ƒΒ… aΖ΄Ιf5Q©4Ϊ΄E+œ9σΏ`Χ:«!<ίυMκgΚ”I-Οpηξί‘NcΧ�έΈ~γ†Ν5­Z4G“ΖŸ#eΚ·lΪεΰφ­Ϋ¨U·~ˆίˆ ₯ίȌ)χs£(@ P€ (@ P€ (@ Έ’ƒ…�τ68 P€ (‡,Œ½/ΫΓέCU(L‚Ǐ釬φYMΌσnN½/aΈ[*lζͺ›QuμψρhΡ:(œ•s OΨΚ~F°PBaω }lΪ<^ΎtήΛ•K4kΧo0ΟɎ5ˆZ°π³gΡͺu;tοΦ ΤΧ}<}ϊυ6Ά uεΞύ!δΉd;vμZΆ »γœY3P°@~}―T” φΫφ­›‘ζν4ΊΉA£&yEv‹©ΑΒ�ε*βώύϋ6o}Ÿ*”`žu“j…+–-FκT©¬Ν%§λΤkbΨΞζβ„η»>]…‹)’G‘ͺ”R2’›C+”/Κ•+!k–,f7γΖOĜyσΝcλNDƒ…FΣΈ—Ÿ (@ P€ (@ P€ (@W`°ΠUήηA P€ β˜ƒ…qη…wνΡSW1 ΐΔq£!Ÿ�ΊΕ€`α‚Ή³‘7oMZΐξπΑύH ž>{†OŠ— F?gζt,X@·‡,΄V\Ή|)rΎϋŽΎGͺά5j�Μμ7q’D8x`―>~τθ1Jό[­�Ό ”λ\†ϋ+W­vυήέΏ y²dΊ½nύ†ψλάω`Χ„·Α™ΑΒ?�:‡z …y ²l±,_,[Οή}°γ—_B½wݚ•Θ–5«ΎΖQΕΘ©S&’XΡ’ϊΌ£ώf͘ͺ+ΚGCόψρρΡGκλwοέ‹nέ{κ}g�X4�ΉŒ΅£%œ­γυ�Ί/Τ―«›&O™†ι3gYOGxμθP�lPυΤu6βہƒφήwβ°“Γ:fh}π(@ P€ (@ P€ (@ P :,ŒuŽI P€ ( γΖ— β§UπΑ‡釽|ρ"ΦͺP”+o1)X8bψ0TQUΨd›4e*f̜νφΐή]Hš4©>g@,U²$&ŽcήΦ`‘Td[²h&L¨ο΅_rwՊexχΟ™ƒ©YjωΘα#f•Ίqγ:₯KŸžςψB)R| τΥ«W4eβΟτΰΑ}Ÿ>π·IXX·Nmϊ¦w/ƒοŽίwʐ±/_Ύ’#G‹Ξ8ιNqμ¦·hρ:sϊ ωηΛK-[4§θΡ’Ιzόγͺ°λ6¨_Ύξωg₯ eϋŽ)pΗοrύ“|ωˆρTΪΈƒ–,]N�\ύ‡’%KF9„C^•Κ•d8^έu―T©’4jψP΅}*8-£'ώ’'OŸΠB°ΑξΠta!oΨ²u-\Έ˜βΖ‹C]:v4ΒDoΪ΄™:w³�Η‘…Η�4†’FJ|?vθΨ…Άς&ͺPΎ ωqΜ?ώ΅lύ…qύΘΒψιή΅35ilŠ^ΏqCŽωŠ‹ΞΡΫ·ξΨ‰Ή»ιS&SήΌΉeΟ,.œ.D—‡Ž‘λι>ϊˆJ•*!ιΒΕ‹T­†Νݐ7²8΅nZ΄o�~Z»n=:}šβĊ-―ŸυκQμΨ61μΐA?�ό y‡δξ9 ‰>g†σ @χ    Y @X±Ξ|§�_Q”(Q,ŠEL;·ΣήέΞΚ,w ‡ΒfMK4ΰY…α ι!Ν™9C„‡Ν.…^9σδs»y³ΘL5°rεjκέη[ΉΚ�€cFW›‚\Ί#,δ†ΖŽIΕ‹•mήΈq“j‹ΐ·nέ’λ½zt§† κΛ|P?Ί°λ ώα{ͺXΑζΔθl?λ\·^CKW:gϋUΒB]œgξkύ†Τν«žζbc}Ρ‚y”!}:c]ΟT­V‹.\Ό`9;ηF‘yπΰ5kΡΚ3²£ήBΎ:I’Δ²Ϊœ_ζ�aφΧDΏοΎ₯Υ>•Ϋ―ώs•jΤ�λ²λ’ή·³|²d~΄bιb–Ϋ\‡…†₯ΛV°+fWΜ γBT?»rσΚΉση„…*Œ²Ή�Z7ο£Κυ₯;ηDwΪΤΫΠσ�τ©ΧG@@@@@@@@@@Β›„…α}Π?€€€DRF¬ίΊν—'N\‡ƒzϊμ)­ZΎœ.œ?λ° $]ύΨέοργΗ”ΏM η—8±cΣΧ½z’ΏpvKž<9½σΞ;rwEψώ£©:΅kQΗφ_R‚ρ2vŠ;pπ -^²”Txαa#F‡5V‰]ξ&NψI�N>ƒF§6Ι%χΏL„ήυKšT�Ož2Ζώ4ή¨ΓΞo={v—αjΒΧ ξΨI&NrΆhΦ”š‹ϊxΥώ[·o§aΓFΩ‰νΤ6O—{vJΑ‡ηε0½zβp»+—/‘ΒΩE‚UΏώυΝvωΒ RΓ†υ)w�œβ~ˆcœ+WΡ�ϊX‡έεXψΧώΛΆ”Ο?`ιgΈ2Z…3VΒBΉΌLά[΅kΥ’αŒΥ@. ΏN]ΊΡ™³ηTuνά‰X4Λ‰έ9$ΆURmσ6³ΘΤͺΎ»e©S₯¦ζΝS‰βΕ)Aόψ�=‘ΫΈtω2U�Zέ‘9ΎΎzέ“Κ—+KΡ£G·ΫώςεKϊγc΄rυϊmή|c[•*•¨iγΖR¨i;σ5Ο.†ΓFŒ4°ΖަŒ;η$€ϊ4 «           � , Wόθ@@@"/ #ήΉO”(1₯ύ(ƒ% kΧώ₯ΏN§ηϟGΌ}‹ˆέS₯L)ΞΟ 69¬…bΩ²e#ΏdIιΞν;tι�—„,DKϋQŠ+¦ž9}6D]τΒκψC²%ώ{ψθ,\L6Ν‚Ζ8"ςαΓGθί―…dw>Σ_ ™2₯'‘Φ€«W―ŠpήA_ |ΝeȘόό’�»"όσε+W‚έΗΫƒ >½3φg ,tFε    ‘JΒΒPΕ‹ΖA"(+aa=T€€€€€€€€€€€@8€°0α£kˆΜ ,ŒΜgΗ ΰ) =%‡ύ@@@@@@@@@@@ά!a‘;΄P@@@@ Δ@Xb(Ρ€@$"aa$:Ω8TG†#|t    ‘™„…‘ωμγΨA<%0wΞ,Κ’%3έΌu‹J—­ΰi3Ψ@@@@@@@@@@@‚$aax°@@@@ ΄@XZdΡ.€€€€€€€€€€€€€xGΒBοψao @Xθ!8μ             ‘LΒΒPŒζA@@@¬ @XhΝ₯              ή , ο3€ώA@@@ ’€°0’žx6€€€€€€€€€€€€€€Ο€°ΠηO   “„…σΌβ¨@@@@@@@@@@@@@ή~ΎύηG   o% ίΚΣ†Aƒ€€€€€€€€€€€€DF‚“ŒC_$a‘/žŒ @@@@@@@@@@@@@ˆ ,ΔU    . , μθ@@@@@@@@@@@@@‚%aa°ˆP@@@@ 4@XTΡ&€€€€€€€€€€€€€xOΒBο’@Xθ4μ             a@ΒΒ0€Œ.@@@@ @XθΘ%              ΰ  ,τ…³€1€€€€@$$aa$<ι8d·‚„…oΕiΒ A@@@ ‰0βΣ·ρˆΜ›K1cF§}ϋRΏώίΖCΧ1Η‰›bČ)ΗpλΦ­p :X%Jδ�=}ς„>zδR݈VΙUF�ά›ϊ½μ*ΣΒ �Λ—/ι�εΛtωΚŸΖΛs}άΈ±ε;uξF'Oφιρz:ΈΤ©Rӏ?؞e .’EK–zΪ”ΟξηΙ΅^“%sfJ›65%N”˜nίΉM�s•8^Γ ΆίπΊO¦Lϊ™βΔ‰Kǎ£ƒ~ vœ¨Άζ͝C±cΗ’ƒ‡ŽΠ·}ϋ…Hηκύ{Χ�½τύ8η!5‚5’1Cz>l°<ͺ9ΏΜ₯yσF°#Δα€€€€€€ΐΫCΒΒ·η\a€    ‘@XθΫ§3q’$T�|EJ˜Π&ξΉtω­\΄@!A‚T΅ZM±OBŠ=Ίœ<|ψŽύq„vξτΙ>rpŸΧΑƒ‡¨i‹V±\Ω�”6MZz$ΔM³ωΥε6²eΛJE ’υηˆύήFqΤ†€5δ—4)½zυŠ )’Ηΐβ‘FŸ5”|Άm€γ'NΈΜίn#‡‘�₯JΉtwοή£’%\«λRƒ’RŽΩ©UΛT¬HŠ%Šά­Iσ–tθΠaW›υz�ϋΊ'Υ«[Η₯~ΊχμEœΦε{mΕ²%”$IbY‡“Χ*qέQ#‡Sή<Ήιέwί5ͺ\ΏqƒJλ7eV™ εΛQ‹ζΝ(s¦ŒrσγǏ)‘’VUC΄μΐή]ΖxΏhσ%νά½;ΨφίΖ9ϊ“|ωˆEZœfΟω…†μqΎm·n¦ψργΙa_»~Κ”«θs‡P­jκΠΎωωω9Œ―ω}ϋPž_;}fzϊ^αΠ™›žά'nvaY]υ{μ؟ԠQΛ:‘±°±xŠ-ζάSgΞΠ¦M›Γ Αα{ιwή‘#Gώ FM›…Θ8Τϋχž½{©UλΆ!�¦«ΰύ�URα[―`ώό4qΒOr3fΞ¦£F‡ο€Π;€€€€€DbFⓏCπ$aax�wήwςPΩrε)q’€v•nήΌI³¦O±+ΣW 7žΟš4hz±‘?rψm\ΏΞXχ•Œϊ°ι°pΞΜRˆΔ⺜yςΉ|h];w’fMΛϊ� ]\n< *Φ«[›ώχu/Ω‹$Z΄j’½)\ˆΖ#ۜ:m:kϋΈ’ 1Ÿ$0fτ*Q¬˜Kc»yσ•,SΞ₯ΊΑUβΨ­Z5§|ώώUYψΐ_IίφωΥ�YΓ₯ατξσ-­\ΉΪiέώύϊRυO«Ϋ�ψγ5lάΤXWc̘>•2eΜ Šμ–�ύχ}ϋ]?ZΉj]9―ΤͺQš5kL쨧§/^Pn�όzQ¨δ•p‰wuΎ}ηθˆ.,d—ΜŸΗ΅»FXθΔ‚'_ImZNνΪ~μpjΤͺCgΞ³¬ηι{…ecnzrŸΈΡΌΣͺͺ_ ν©wΤ Δήφ{„ΞZDβύ2t�“n&Šφ@@@@@@ΐszΞ{‚€€€xAΒB/ΰ…��₯Λ–§9sYΆœ°°mϋN"€°-$ξέ»wθ―γΗ…sα{”!S&ιr�]½’Ž�yΜ²ύπ*Tm!,t� ¬\Ά˜R₯J%wlΧΎ#ξψέύF‚Ψ~ƒ€Α7•*U’>Ξ–ΥιQ6n܈’G³‰˜.^Bύ|ο΄�«’%σ£υk‹ο|YXΘ’“ύ8=ΤE‹—: Uœ/o^š2y‚1Os#Ξ„…=Ίw.’ d?μΊ6iΚ4bWΪJΚS�\9eωƒ¨PΡ2―~XTΨχΫoΤͺέΒB;^―pxμ6­mξ»›7ouΙ™ΡλNΓ°ozχ’ΊujΫυ8}Ζ,9Ϊ&B·Ϋ+Ίsξ/s(Z4››η_'OQ`` Έ?J—Εœ9rPΥ*•EXξΈaα›ΤQΈ;2“S§ΟΠΒΙF@½£BX²Wή/C–gh΅aah‘E»      ΰ> έg†=@@@@B€„…!1„›¨Y§₯NFΆz�ή=Ϊ»g'•*S^�%,L-ΒΧ¬]WΦ{τθ!M?Nζω§Œp?ό8‡M¬xS„Κœ5cͺ±Ν2κ£-„…ξ g:δΗAr§€Ίυm!‹έk%θΪψπ4ŸΘΌuΛΖb'›Ι.Wή&]Xxηξ]šϋΫ<ͺό㏳˦}YX8tΨ·Β°λ¬–-Y(BΉ§Ρ‹œ 7�_KI“$‘uΏλ7€/]&σ|.ψœ¨Τχ»ώ΄dΩr΅*έ •°πάωσ4S„4μ-b,…°Πΐ„Œ Φ�ZN)R€°«yZ„‰­Y»ž]Yx­΄aΎ;ul/»ίΈƒΎμΠΙa(μόY₯J%š7‘Γ6UΩ ΥqciO@½£BXhΟΕΫ5Ό_zK0lφ‡°0l8£p…„…�PB'aaˆ#υΊΑΚUͺ‘_²d΄iγzΊpώΕ‰—Z·ύRΆ”°°^ΓΖΖ‡ώ-›7ΠΑύϋ±΄ω²#ŊK�s¨ΰρcGΡ³gόναQmYX8iςTβπΎ9rζ Dο½G�ώ{vμόΎλ7Πn˜Κ³oŸήF;u½ϋ�͝hίΎ7ΗΞ�^ύ—8 ©J?M±^;;¦KŸŽήK˜PnΊxρ"]»v]U£/_Rη.έθα£GF‡NχQZΊuϋ6-’&Β΅EO1cΔ σB¬³gο>ϊaπP£>gXΐ0zΤpŠςNzϊόuοήΣ�M�Γ‚ͺύϋQΤ(Qθω‹�d˜P.*Ν›;‡²dΞ,«τώ¦eθΣ φwΆCfνTηη—ΤpDδc>{ζ¬έn“…[ΪΞέ»e‹4jV«&σ /¦Υk¬Γnwλ�‰²e΅9αυ0ˆ.\Ό χ™8α'Šυ]Ϊ+Ξ3―(„“™2e$νzςδiZ½v-ύ:χ7»ώυΎš‰σ‘^œΣ>ψ@Š₯Ξ;O»vν¦£FλUνς|-΅kۚrηΜII’&‘ΧΡ£Gιίk��^q>'O&―C»<\Ι&Έv|9ύΆ`}"ΒύζϟR₯LEχξέ§?OangLU7cnj€8±bΣΓǏ¨CΗ.ͺΨnΙΧ₯ ‹}ψΘΛ°Υ]:u€¬Y³ϋ-XΈΦo4Φ]ΝTͺXž~ds( NPΔcΓζ€Κνχλ?Π©sŸ σ»vν:š:}†_όa›“«ΒBwϊ” {ψ£‡BφTXΘ.a­ZΆ#˜6c&΅hf lεXX\„¦+BTsΊvν•)_Iζω‡EƒμJ¨Οƒ-> –EνΪ|A³ζόBkΧΘj»ί.Ÿ Ύ&,τtŽΦη.}nQLΤR΅�@ˆπ;vκ*‹λΤ�%ηœWτŠ&L˜L Τ₯œbN`ηΥ��ΡcΗhΘ°αNηf_’dqΥ…±\±rl0ΦυŒ>g~�ÏT£z5Κ—ΟŸ2€O/η=žΏFλ0¨6J”(NM>kH™³d¦Ψβξά9Ϊ½g/8tH:ςq½aΓFs¬ΪΟ›%».œo›‡ΐ8ΒαN…ε�$ή_._ΉβΠΌ:/< <ŒΪΆiMΉΔ3>eΚ”tχξ=ϊCΈ(³H–Ÿχ*ιlά}ž ώα{ͺ(<9ιβ[ΥΆ³₯7οz›&:F΄θ΄WΌ‡-^²”Τ―G δœΔσL„?ώύςΛ―vΒ_}’˜Λ\ �οοjžŸGmΎψά‘ϊ‰ΡOγ'8”λϘkΧoPρμJ(ޟώ:y’ϊD κΥ£’%ŠQlρΞsZΌ+t�ͺ—έ΅ην3žCŒ7kژ2€KG±γΔ¦¨β}―ω]βdτ؟Ζ«ΈsNτkορή–7onΩΤση�ΡαΓ‡υfiϋŽΔnV©Γ—ν(Ÿ^J—ξ#Š/žœ³O ξΔISˆEŠΞRŸoz“ή<"d}*z$ή…xξαχ‚ ?“�ΆrœC‡DRοί{φξ₯-[·Qρ‡H™³d"�W8uκ4­ί°‘ψΉdNόP­Ϊ§²x€x3ίχ}FEŠ’�³=Ώ6ήyΥ\ΐ;Ίσ~iξߝuΎ―{χξ!wY΄h±Γ;_W-[6“Ϋž0Ιξά¨ρΊ3wqCήτ)"~ΨΆVΝκτ‘xŸελ‡ŸΣwξάŽ’§‰ί‘Τ¨ϊjΙdΠΉSω�ƒ΄iRΛwΪΛ—/Σ±?Σΰ‘ΓιΦ­[ͺͺέ’Ηά΅sβyΑΟΟO^―‡‘Β ½ίwΆ�C͐Τϋ΄]ƒXq†8R4    ΰ  ]‘Ύu\ΆλΨ™bD!ΎΎ’±#‡ Qά 9p«ΠΚ›6¬£ΓBxΰ+I}Ψ|ϊτ©Ώ 笏oΗΝԢ]£¨X‘"4N$]IΧ…Kcι²Œͺͺ?£ ˆLΥj΅μ>Œ/]Ό€>J›VξΑγ#†ΓήόΡχ‹ΆνŒ©\aΪ”IςC1η­”ζ̜N9r|Μ›-·Λ ΪOႉ?”sΊ$>V�ϊFP€Uσ(ϋΛ¬R,ιΚΞ,’dW9Nό1~Π€ώ2o%Šβ ,Ϋ*„―Ρ£G—ΒFρGN.ίΉc›ά7¨g!wΫ~њ>oΥΒ—šΫ`GΗ6νΪ;|Pe‘ΜlΑ^ oΝϋρϊ˜qγiІD�yΞΪcρB�iي•F•ΛΙΥ\ΠΎCgΪ&ΒzšS―έ©aƒϊ²Ψ§ΉsfɏΖj_ςŽ�³Zuy9iΒx!*ωDΦ%„OVΒ՘ω~sU¨φχDXθmŸͺοΰ–ή Y¨3ο·_₯k ;F –|Ž8YέC_|ފΎlΧFn_Ήj ± ˜‹jgLLQ„0Y₯›7oQΙ2εΤͺε�W……ζσg9ψΧ…ϊΝβ‡―Ε.³fΟ‘a#Ÿ,Ζ#ž‘œΞœ=+BαΦ•y³0Sš~ψYΒχίρ'L[H Γ?­ZΩ‘|Άr>�‘œ Xdέ΄IcΉνφ;†Θ]―ΜΒjˆš…H,VλΡ½«WEΥ«;δΫ΅οHBR©]Ϋ/D˜g›E8qγΖ!qβPΘV"+ύ™rι�%)(4Η|½zσ<6δG*WΆŒμbιςτmί~ζξ,Χ½y―P κΟ2>gρβΕΒ²tj³±dA=_»V)¬„…ΥͺV‘ύΏs»Ο² ­9ιΒfσ6«u25ψΜv}λ\¬κͺ2gΟ.v‘δΉOύ‰ͺ―–ά;SZ‰¦τΎ]9'ϊ}©ΪwΆdα]·―zΪmfΦπaƒ‰ί/¬ίΣ,ΚσΛ\»Ν,›ψσO†PWίΘaοΥ{Jh υΎΜω5BΔΦσλ�Ω댬į#‡‘�₯JΙ}ΚV¨dˆ†υΉΐ�A‹ύύ�b³ΛEϊ}ΝοrόN§§FŸ5si7YΤoΐχ΄hρc³>^Wη.ήΩ›>y�1£FP‰βΕ8k™ψo vάΞΟ·~}ϋX>KΈ!ώ‘�έ{‹Βυ”'On=b8%H_/vΘCXθ€      ¦ , Sάθ @@@@@€°P‘πέ₯«ΒŽ]ΊKΑΣgOiό›˜"A‚Τ¬ek)6y. £ 1§ύϋφΠΆ-›}ζ Ν"Žk3d‚5Πz ‚vψkΥ’ΉΪD•+W’ΈqβΘυyσεœa1 ¨Tb’X±ljŸ|’TRvή»xα’ͺF/…c‘Ω}PrΕ…Γ�ΆνΫ…Έ".•-SΪψθΝβ Y¨ΔŒ —§Δ‰m‘cω£2 γΤ©Γ—Τςυ±ό+ά«Χͺc'JTmθΛ)“~&vYαR_Uϋμ’’AΈώqJ“& εŒ8±ΗμΉxΙ2γœpm[6RBqέqͺ!ŽγΜΩs2―~ w­―„†“.°Τ?ό«Ί,ήa»ύ¨cεmf‘LΉrehΨΰΥn�•eΏpŠŠ-�v­βΆ9¬§ξΒ9GOΣ&O$α(Δ‰ΰφ‹­„seβΔ‰₯p.ε‡J禉“§θ»yœ·nΧΟ?�#Κ�}τ‘l›?—bXε–ΙŽvμlΗiΓƍβΓ°½ΛυΉϊ½ΒΫT a!ί{λV―΄Ν+BY¬D)cœͺ}iΎΏ#ͺ°η;vκ‡nδ>$ζ΄?Œu•Q‚b“rΩΈρβ),μέ«Υ―gΒιsΘβ…σ(½/q;ђٜ[YΌ’'_Υ•ε2¬……»vlnf6χά&Ν[:ˆεΤ =£ΩiI 3―]ΏNeΚUTMΛQΓ‡R©R%εΊ.Š5 YΘ³aγ&zφό9•b vΠεtδΘQαφζΩ# ΕΟCŊ•«~‚X¨ΑΙUa!Χ}ςδ mΪΌ•ž<}"…qκ™Ζs„ξTΚχΰͺΛ€ •χ;+\Ϋφ§Βχ“ΏO%„«₯žΜσ₯ΎΝ“όoΏΞ‘¬Β!‘Ο3<ί³ψ—ΣΎύ¨E«Φ2―�θβ.ηΉ6πχO<7Λ”.%]ΨΈά,Lττy�Ύ][jύyKnR2(ž�Ώ ΌšOε‹oή+TsVΟ2ήφΧΙSτ·psδgKφμΩΔ\r*,tυ>Q}zΊdα[“Ζ6α·‘„±� y~9|ψ¨8–¬ΖXπ;Σaαp–9s&)‚γυΒEKHξV\\}Ζ³›]2•ˆ–]r•{2ίΛJlΘ‘ί9Ό9YυΝuœvΘ-Uͺ„¨Aς9Ηn¦œξίΏ/œ˜ΧΚΌϊaWJ³#ι‚ys q Ο#λΦo ;·οH—Nsb~uκ5°{GϊNΒj ΧRN<ο¬[OOΔ;=ίΣI’$–εόšΒB~�>xπ ₯I›Ζp ζ>»χμewœž ½yΏδqx’Όωy:wyΣ'Ώος;>'ώc1~/ε{…ζΩ‘»P‚βϊyNω ٞ7Š Ο_Λ—,2¨ό�“Ν[ΆΘ�Λ+VT:rέ+_‘Š•mΧ™ΪwΩ’…€ώ/Δ�gbχΚX1cΙηZτhΡT5ω�880'aa˜#G‡    LΒBίΏ\vξΦC~œ$B;N?NX³–ŸΣ{ο%’ φνέC –ε'�:!E ΎrτΊπΘμώΒ�|μΞΗI˜Η>gζ αψ—]~„Λ™Η&„3Χ±Zg ‡ΦγdεΊbήGrxΜϊΒΥG9δθ’1οXT�τΔΗΑ.‹όqœ?7š8±γ‡šq²Œ?4[9Sιmp^ΟάΈq“J•-o�bλ>uό8›@rκ΄ιΑ†όίΧ=E(λ:²�Ω"Τ#‡‡Υ“.Jιάν+Ϊ΄Ι&p5ψ7;Tκ’vvcqšJkV-£R| WΝ"!·hΑoςC+ mΨΈ)±hB₯ΐ­›)~όxr΅vέϊtR„ώΣ»Ώ?~άpΫΡ·y’Χ―ή�牓ˆ]ΏT�ωθۘΟV!ΪδΌόqΉxΙ2v"έ……uλ7TMΪ-CBX¨ a·lΫf„’΅λH[Ροo.ލΒB퐲V�iμ8χuΟ―d]u―θχΆ•cα°Α?ˆύeε>*Δ«ξbΘnL5kΦ0Dp%J—3ζ'‡A‰‚°Z!Έ2wηh]ΤΣA„9ή*�Q•δ}τΪ1•ηΰβ%Jχ‘>Ηπ\άF8δς\Γ‰Θ~™=Ø+ψΩjv|R}πR†˜η$½ž.ΞαϋΊi‹VΖόΔΟ3~�qβ0ιEŠΫĐΌ�Ο³f‘#»Ίρ5‘RH Y ΏY8ΏσΞ;€?{Ψm–Ω2·’Ε…ΖΊ8ηάωσΤπ³&wύϊ5 (υγTχˆ:.^κσ₯ώ<ασ΅pώ―†ΰλςΨώ�v"v`³rδzzςδ½Βό,c1Zί~₯ \΅%sfωΎ2oώBUδKε”θŠ°ŠωτPξ‹DΨguΟ(ΑΟ Nκ^1sqη―Ο{{χν£–ŸΫ\[Ή}ύ XX]©κ§Οksίξžυ γ?t`AtP‰…ί,ηΔβζ–­ΪΨΉ^λ�ͺϊWπ½΅nυ yΝς»JΗΞ݌Ή‹ίcΨYYύaJh ΝοVΊύΟγ'¨~ΓFΖ‘Ξ Οz@IDATλs—Υ»³3ΗB£‘qχύRίםΌ7"?Oη.oϊΤ]aυkD3_+ώ"¦ςzh$]XxGά«Ε„°IOϊυn ρΗέ’%KΘκ,Ψd‘Jϊ5aή¦κπR9δ©2]Ό¨Κ‚[ςyπσσ“Υt1³ύξΫm8Mq%4qVί\ξI(doϋ4ΑΩΊ ΩY.7;iρυΌbι"&5žtoγΰœ‚ςܞΟί_Φeφ'…ˆT gY°U­FmZ΅|‰jΦJ,+w~ύ……Ί+* —™“JzΘKσ6]Xh%ζψ¦w/b·-NfGZΥΎZz",\Ύb}σm_Υ„\*'J^Ι‘Ϋvή9―‡Fo+,��ӎm›ε΅ΕeVΟ!½�;y] «‡Gύiμh*ZΔφ‡ }ΎύΞ.Œ;·―‹sΜΫυΉŸΕ~삨RPό Άρώζχλ^= ‡LΥ¦Zςσβίτq“«νΌτδ½B?nΓμΒΘeΎšΤσΠaα€ο  ‘²šίΟψ=]Ω”“χšΉΈϊŒη6ΆlZoˆ₯5mζΰώͺ?Χ”ΰšχSΙά·»ηD½£Ί",TΧ χέ½GOρ»Κ­]΅B>uΑ°ΞΡͺύέ1΄„…fYζΖμcĈ!Qrθ]%T‹ŒΒBwζ.o„…ΎlGŸ·j!™―]@=zυ–ωΰ~Τ{ΟΣ§O©|₯ͺTP£Ϊ§ΔΒVNϊ3N»ς�iψ�6zš9m εΝKAX¨“A@@@@@ž„…aΟ=‚€€€ϊώeΰŠ°0~όΤ²΅ΝΑεŽ«Ν™9Ϊ|ΩQаnάΈN³gL£Œ3QεO«ΛώηοΏ…ΣΟlŸ9xυΡ–ΓΑ–―\Υn\ΊΠfαβ%ΤΐχvΫՊϊ˜ΛN/aεXX΅Z-;'‹.TTήΥΥrϊ”Ι”WΈθ)pΗοR’—YεΩ‰iιβως£τƒ¨¬$©½Vυ½-Σ…{�8rΊˆ€c—n΄eΛV9 Μ’N³fΟ‘a#l!»y]�πΟa2•ΠŠ·©€Ξ1―+ ."βrΎ†8±£–JΙήOf¬›γV.[L©R₯’UYΉV8YνΩ»_„|ή*\ua‘UhfΘ‘ύ{dψE‹]Ά’MΙεϊ‡j]€£όηPͺ%…K³k‚λΎχ:€+·©\i8οJ�uΗ² φe]μXΆπ·Ο�{ξΰ&ΤΎΌΝa‘·}7&΅]rv n•.ŠπΪϊ9ΡE’½ϋ|K+W�–»ισ•c‘.,dΡJ­Z5eΈJ9Κn§μ’§_Σ‘QXΘΧψζΔ‚{³»ηά_fSΆ¬Y$λφ:ΣΆΐ@γtιΒΒA?‘ίζΝ7ΆqFŸ uQ]₯Χ+ž ϋ‰gΫ"ρŒΣ»ΕrΏ,Ίη9QΉγ*Aθ£G©@aϋp˜Ό�˜Ρ#ŒΘ!),Τ„u‘>[…jן e+Tr˜~άJφωΜΩ³T£V]GΟΥ;½5hP8”5ηΝ‰8,tΦEμzυΜqη½B–ρ|όIΑ"z“>wGXΨ«χ�DXΰu"”ui1ΜζvΖaˆYDΝξΜ|­pRσ›Ξŝg<·‘ޝ…7Χ'NžB?Ÿΐ»IοΫ“s’ϊ·όΌΞθ"Hο α’ΘI½“π’ίITR�²Ίs'ŸCOϊ³!4„…·nί¦₯lnΈzΏΣ¦Lξxyd‹~•ΣgdΊ3wιοkμ$Š.έ{ΚƒαPΘΚ*eΚ”Δb“ΙΗΣ£‡ν Ϝ9MΛ—,ς™ƒWm­>–κΛψ#6ΜΆJžΈ]hΞΝά—ξX¨;H©zΝ›5‘.:ΚΥΙS¦Ρ؟μ?&ςέ}Χ?~L₯Κ”·qΉUκί―/U�Τ&Ύ΄ i΅7eΊ˜ΖUaaΪ΅¨Ο�Ύ–έ²¨Ε…œ6¬!Ώ€IeΈκO«ΧΆeκώuќάρυΟΨ1#©xQ›ˆF…ΣΥ]ΔτΊΞς›7o‘N]»›kΥ¨N,(2'ώ˜Λ’£ργ'�Νu’8±ώ,1‹vΉ’.,ΤΡ²ρΓαkη͝#WYΐΙ‚4gΙa‘•Pw"U’}�Όtω2U�jϋƒ},ƒ *•+Κ"«vυΊξδχξΪaΈ—±ΈϋΆ#qJ“6 q˜uN,x/T΄„Μ«]XhυάάΌ!@†y΅ϊγOž'ͺ_}ΙΒΒ"ΒU±Lι’2T΅ΪvP„FζΤVΙ“χ ύό\Έxψή–δŽ°PΉΥκ*%6Μ“'7͘:YΆκ\άyΖλχ­³ύt·Ώ+WΡ�ϊΨ;κ}{rNΤ;jpΒB½WΞ9Ώg°Λ2‹ΕτωΗ,4γΆxN繝“Υ»²άΰΑ:ΆS§ΟP­:υZ>t0•-csVξ*ώŸΑΒaN‘QXθΞά₯ίξ ™ο²% )mš4œ΅Kό³ωEΊζκt·k½άY^’.Y4_<?’UΥsFίOΏΏ ,ΤΙ      aOΒΒ°gŽA@@@ }�2pUXΨ©λW�εŒΕ„Q’D‘Ά{ΧNϊ=p›Μ)Vœς}b)>t€6mXο3―>lZ}ΰΧ?*Ώ ΒΒvmΏ 6­m‚³+ŸΞ’“I~2Ξ»Q5nΦΒ©k’ڏ?,¬YIΡ£G—N\ε*V1¬T^z",δ1(ͺg"wqξΧ_„o+\΄8YgύƒόΡ£ΠgMšΙΊϊΟ΄ΙE;ye‘rΣ…–»χμ₯mΫί8ιϋͺό_"t잽{Υͺ\² _‹¦M({φl�εSίΘώ9,ά΄3υbσΊ°pζ¬Ω4|δh‡ΆφοΩEΡ„³ 'σ‡μ/Ϋ΅!v6βĎjμ¬Ζ‚€qrE++zπcΔΦ¨UG8Œσ %χv‰hΒΒAϊΛπ‘L#/η •'JL™3e”«Ο…Σ՞}{₯ΐ΄CΗ.²¬w―TΏž½£»qd券oΟNŠ-š₯0Uυ£–UX˜/o^š:e’<Μ➯[Ώ!}Υ­ 5nτ™,³zθΒ5Ώ(NΌΤ……V’O½�'ΒB«{ΧJX¨ Œ.]Ί$œˆkθ]ΛόQ…ςεd>€„…ξWΜ}*a!ΏŸδΚϋ‰ΓxƒrewŸ'˜ š4nDέ»v–₯όό5 ΈUuo……ϋφν—N’ͺ=__Ί#,Tβ[ύ‘{Ο^°‚ΊσŒΧο;gϋρ΅ΞΧ<'+q½ώ~αΙ9Qο¨Α υ{“―«‘£m�NΟ»xΏΰ?α€ΏΛ(1΄ΎŸ~ ‘!,t&ΪT�©<u~9œ°Pwε΅«qϊ΅γκ�π~ξ¦ΰD~ΊγͺYΤιιάεMŸκψZ4k*œ R’$‰U‘±ΌϊΟUͺQ»�ράΧ]―ό}E„$·wά5v|Ή{χ-_±J�ι.ΗVŒ ί_šIb@@@@@Β–„…aΛ½€€€Ό&a‘ο_ � Ϋwκ*ΔHьΊοM™τ³±ώiZ”.]zΉΎ}λfΪ·w±-Ό3κ£­•ΰΜ—……Vΰta!‡ϊeq‘žψΓσόί~‘Ξ}zωί"Ν™ιώ{…ώ,σDΔζlΌaQVΒBwžρ|ά;wl#ζκl?=Dόƒ‡�άίζΩαςφœ¨wTgΟd½3ϊ³ΐ›“.ΔΣλXεkΥ¨.Γ!σΆ€€υΒπk»juλΤ¦ozχ’e‘!,δ�7X �•›(w¬ΏιΒBξZπΖυk)i’$²ΘΩύειϋ₯ޏ+y]δg*[w† a‘»}uLϊXυ?0�―ρ»wοQΡ₯‚jΖnΫ ¨J劲Œ]°ωω¦'έΒB ς      φ , {ζθ@@@@@€°Πχ/W……ώωςSΡβ%δ™έ “'ONυ6¦wήy‡=zHǏσ©Wm½κaΧΪΆλ@;vξtιυhμόΑ A%]Xhv―a¨εKI79�U¨\ΥΞKw3ΌyσΥͺ[_†Ό]4ŏOv;rτš>c–Γt·8³˜Θ‘rθ»#GŽŠεΝ]n}ΑΌΉ”)c»ϊV‚� εuσΉΠ?ΊsψΨJUͺq5bHˆΔŒS�[…0ε ά~αΒ g7YYό°`εΨ±?Υͺ±δϊΫ6SΤ¨QeYΑΒΕ,έ$έηθΒBnΨ|­κxΩω°wŸo1©Œ.¦TeΞj»Zκa“ΉΜU—Η‚ωσ ό8=yς„J–.gΙCV0ύ¨ϋ[%ΌTuτ₯'ΒBoϋΤϋ*ο‰°0¨φt•³p»ΦާϊG~Ύf.˜K€ψ@vaεΊgξϋmΊ;G«cd[…ΐŽΓBλΙJΞΫuaα½{χ©|ΕΚvΧΈξ€hεΊͺχΪΒΒοϊ~C5«W—]š€Νš6¦�;Γ a‘ξΦΘΟ�’eΚνλu=q»DrxUNή Ή wž'₯J•€ͺB(3iς4c ά†J<‡ό£|'rζϊΘu=y―ΰλŽ…pœ ,χΥwύiΙ²ε?㙣rŽ”ω_ζ�aΓ9+»ψ�ZΎ”’G.Χ›4oIόn¦'oΟΙ–Mλ)Ρ{ο‰χηΗTΊly»yAο‡σ�ϋΊ—ΨΦ–ΕVο΄ͺ~�\9‰ίΥϜ='‹t·Y~ΖV¨ό©έWΜ�νWʜ)£¬ΒBn˜Γ26BφΑ?UͺT’AϊΛυ�½F,TI'3 !«U­Bϊ§ͺΚύxsςζύ�άVPλ|¬_»ZVωχκΏTVΜν*ρ{ϋ²%‹δ»8—…”°Π›>ω½6v¬XΔοΊζΤη›ήT§VMYlv½ΦE­VΝͺ-v³έ»g―qλΟXsHlσ;ΆώΞ‘ΪΓ@@@@@@ μ@Xv¬Ρ€€€€€FΒB †e3gΝ&ά†lξƒΡcD§ΌώŸΘΡ=zτˆ<`Œτθ‘Γτπαc½c—ξ†ꏣGhΣϊςΤjŠ»κ£λώύ{iΫζMΖ>ΎQ" «°ϊ‡ΗΥkΦQ―ή�³rχ�©IγFrΫuαΤΈpαbbg#\έΎu‡vξήmΉ_±"EhάΨQrΫΣ§Oi‰Ρ{βΔ_τδιϊOˆ6Ψν§ y‡ΔδΎβΖ‹C]:v€dο'“υ7mΪL»}eμΛΒ¬ρ?‘ηηΥ«WΤ‘cΪ(·W(_ŽΨ„‡ΟkΩϊ ‡γ›Φ―£$IΛ: 5±Γɍ‘π£\ŒΈι›6I±;rΪ΅{―έΗoYψϊG�X©Κ]�πΟu™Ρτ™³hχ�=”)sFjί�­q σ‡oώ�okύyKΉΚη›ψΆξŽZχ(UͺT�!²|Ω2K|¨Υ‚ͺO)Όjυαϊu€�_ΏNY³d‘J*PήΌΉe›¦š?ς[%o……,ja1λ₯‹—¨Œ»¨Ζ|όuκ5 “§N[uKΊW`!-‹ƒKž ‡ ω‘Κ †œΜ"‚ΰϊTχ·ͺœ°0KζΜT―žΝωŒχ)]²$%H_ξΞ.ŸE8LN,`—F«δnŸVmΈRΒB=$ϊ³ηΟi†"³{\Ή2₯ ΧΦP‘’%]‰όύύςšΥm].ΠΓ“οΪ΅›Φ� 0κ…gΖέ9Z«. γς œœta!Χ={ξ�y=}ϊœš6iDώyσp1]»vM:ͺΚ•Χ?,Ύΰpο*ε.΄Ÿ·j!WωΩσλ―oΤx%ΈλΦ₯“hΫRό‹6_:<§tw*έυK±s'GώA;~§χ“ΏO,κ‰%ŠŠe˜RήθΞάΥ«GwjΨ Ύl“―‹½zνλ™ργΖ»q�EΛ!!,tηyΒΟ~.π<ϊϋ�]Δοη…ϋ§PR‘‚…;W%CpΊuϋvω<–ƒ6ύxς^‘ž+ά”― ΩUO.œ_£Ύ�ΡΨτLΌρu¬;¦vμ�ΆlΩ*Ο7ŸwNέ{φ’οLΊCœ3a‘;ΟxŠŽ>Τ;ͺmήΌ•'ML;΄—!Ξy£Υ;$—{{N~=“²gΟΖMΙ{—ͺoίΎ%ΓͺŸ>}Ζξ9Ν}­Y½Βp εydϊτ™tξΒyŠ'eβΐŠ+Θ?Ί0�‘Ε€ γ©@~Ϋϋ>‡‹=ξ'zςθ }Φ¨ρ;€J‘%,δφYΆcΗNJŸ>uŽ―κ6τ°»\OΑ³ΫαΜYsˆEΞΩ³ea…›οk\WŸ»x]OžΎ_κmΈ’Χ―Ω|α‚Εςš�ΰΗΟΟΟh"€„…ά §}²8΅nZ΄O8Ρ�]·žN>MqbΕ&�|y©A½z2Τ6·?pЏ4ΑBΞΚ€ ΪΉ€ίƒ—,]N�\ύ‡’%KFό\βΉΟ/iR2 μυ±ςϋδ\ρ̊;&uξ؁ψy£„…Š–      > , ξθ@@@"= }σhΫΎ“ρ1/¨nΪ°Ž:dTaΧΒ"ŊK£PΛά½{—fL$?†jΕαžU" «Β� ΩdΕ�Ε–άXhXΊl§ΗΉhΑ<Κ >’Z₯ͺΥjΩ…6 ­φaQO³­ŒΝ,:Y(άϋ”0pŽΙq‡Ϋθχέ·T£šMΌΖa$kΤ�kΈ‰4¨_Ύξi)²°ͺΕη_XujeΊCŠΉ«°ƒͺ`ίΌ1ΐ8'gΞ₯΅κͺΝvKύΓΏέΣ €―^σθLmΦCVͺ2«₯•°Πͺž^Ζ�μh•άηπώfΗB«6ΉΜ*tž^W$q9 nYx\ςDXΘη†Γ *q²34g}«ϋ[mNXXΏ^]κέ«‡ͺξti·ͺWt·O}_wςα!,δσ1MΜγ,ΐ΄J,NξΣ·―ευ ‡ ΅ΪW•­Y»Žz~m-βVuΒrιΞ­K%rωΒΕK¨�€ου*Fή,,46hΠ 8ˆ-Yͺ•’td§@W’NUΏέr?-›7£Ž"μ5;•œέ―ξΜ]zθe%³κS�ιΞW!!,tηy’„…VcΤΛnέΎM5kΧs*Žχδ½B–ω²°PC«3q–ηg'‹’•ψΠ[a‘³~œ=γ§LϊYώ‘€³ύ?~LmΫw€:Tρφœθόan|ύ†Τν«žvΕόœ�ξΫ>Ζ»έFmΕ,,Μ‘#;MϊωgC8¦U΅Λ†¦°Π�£Χ+η„(·Z › £Ύ]έΧz™U>(a‘§ο—VύU¦Ο΅AΥ Ia‘§}κ�—ΞΖκμœθ"pgϋrΉYXΘswχn]‚}ž@XUlΠ'aaθ3F     ,΄€βEmΏΒΒXΆΠ�A gCΐ::z䍰λζΞγOE‹• ¨οΪBΈr;ΓάΌyƒfϘƫ>—φμ ”`­\ΧΨ)cες%�‰Εύϊt:ώΤ©RSσ捩Dρβ” ~|Γ½ρ’p8«\΅ΊΣύXψΧώΛΆ”Ο?pςπ“Ξv\Ω*œ±rHΌeΛ—SνZ΅ŒjΌΟΕ‹©“pςQανΈŒΓR*Ρ‰.ΆΰmzRmsΩΟ&nl«V,₯”~(«:‰θν„FΎe‹ζT±ByJ&œ]”{χ”Θ„·λžGύ‰¦N›ΞΕI�πΟΒπδaJ4£œ§Ίwοi.͍΄hΦ”Z± +­oΏpρmέΊ†₯ӘQ#(w�\vΗ€*πu3q�dβpsΞ’•€Ε™+#·‘ Ή]ኘ"E £y…ύ:w. 9Ϊ(³Κθ‚©;B0\¬Di«jeΣ¦L2œΧxcPηDν¬χ”˜OΥ7/χξΪA1bΔ0ŠƒβΓ•ΜaMgΦΉš»}ššvyυ«ξ]‰?Θs2 \nD«ΘBκΕ ηΛλ>(1ί/#F %�iά¨eȐ^:πqθ̝;wΡ»"ό³ͺ[…†ε>ά™»φνώ] ‹y^.%Dϊμςj•ψy½zε2ΉI1ΨΡΈcη�zs>“Χ]ƒΤ³gΟΘ?!�Cb+!,‡τ5}ͺl’}‡Ξ�‰™EΟσζΞ‘eΚΕ0$žρμ Y_ό‘…9Ό9‹u{}έΫξ½Λ|Lޞ“ΒΒι²aΓϊβ}!'Εσ‚z7qφG|έτ��t‘υΝϋ8‹Cοή»—~ύε7—RfΗN₯ϊ{σgη&>“ο§{ΔΎ,Π‰€ξmv€δϋ»PΖ±ρ{Χn2·KΧξ–ο]|ΏοPϊζ°ΐs₯p€Ž#fs—>φ–Ύ_κmΈ’>t0•ΞΎ*ρ;ώ‘CΒέ}Λb'`Nζ?�πvξς€Ožσ›6n,Ήκξ³<>9w Γa#F:‡ω­gΟξΖ�x?•xξŽ”„Ϋ³9Τ2?3zwZΎWUb—ί_ϋΝxΎ±K4�� @@@@@@ |@X>άΡ+€€€DzFάKΐΟ/eΚ•n ·ΎώI/^ΎˆΈ†G¦ΔEXjvπαΔœγΔ‹C‡ V€ΰξP9t頁δn'ώ:IuλΫDLξΆυωγ€rΊcΑ\±₯,?NσΨtс˜rYAΑφΉχΊO„Ψcζ�$v™Κœ)3Εηδί«ΧDθάKΑž’$OžœΎ—ξέΉ'\*/Ω9UΊ�―+utaα˜qγiΚΤiΔ„?ΞJ §J+·%«vΩяύ8Ν›ΏΎ�αMΨJ«ϊ(‹Έ8Df‚„ θ p― N$q)X™B•ΓŠΧ�k ηkU[*"‡ϋL›6 s/οοΛ‰ηK5GNœπ“:΅DιrN(Ύ|<ζ±Ήσ<Ρχeρ‹΄όό’Π£ΗOθ²1λληRDΙ‡δ3>£�r¨ή»βY}θπaγΊχUVrI“š<|D ρ―+Χ_·Y³e‘ϋwο;ˆCσ8ω<ε/Ÿ^όχΒεχ.~βΟ7nά"=ϊrβχΓl"\3‹(χ Ρ€š3Cs̞φΙη"CΖ bξJJο q* Ϝ>λς˜y>VΏdIιΞν;tι�—ήkYܚ.ύG²/ώc($ί!a‘οœ Œ@@@" #ΥιΖΑ†+aa4λ΄ έaΞΊΜΩNβErξ¦—Β½ΕβΣέ6τϊΊψmΛ–­Δ‘%+с³ΊosΉ•°ΠέγαΤK/4\eX,εŠPΑέ~PήvμšΖ" NC‡€Ωs~qzH}Ώύ†jΥ°9Ϋ*a‘ΣΚ>°ηLNfa ’–/]DοΎϋ.±Λbαb%}`΄ήΑη‰χ½‘…&Yžρ!Ν ν€€€€€€€€"a‘"%€€€€@˜€°0Lq£³@ ¬……μfη—4‰$·w�~—.˜7—2 —ORΥj΅\r4qΦ6‡WδΠΒE ’OήͺƒŒ$ƒ,ΟψHr:q˜       α@ΒΒp€Ž.A@@@ˆ ,ΔUξka‘{£³ΥOaα𑃩l™�vΓ^Ί|}Ϋ·Ÿ]™y%²ˆ<²ΐtΕ²EvΨξή½G-?o ·B;*X‰μ6�_KI“ΨΔΨΜ‚C^φλ?–,[$š·MXh5Χκxαβb‘ψۜ¬ŽΡ•ηΙΫ|Μuμ‘εQΟŽ @@@@@@@ ό @Xώη#HIΒΒHyΪqΠ^˜;geΙ’™nήΊE₯ΛVπ’₯ΠΫ•Eh‰“Ψ«άι…8‡vg‡Ίύϋυ₯O«T–bž3gΟI7­±?w¨g.`ΡΑΦΝdψ΍›6S·―zš«DˆυβŊΡθ‘Γδ± 6‚~ϋ›KΗΕαΧ¬\NQ’D‘»χξΡ‘£Giόψ‰tόΔ —φG%ˆ,V.[L~ψ!=}ϊ”Ž?A —,‘•+W{ψ_uοJŸ5¨O―^½"/Ξσ—/§zukSνZ΅(}Ί(jΤ¨r¨<φkΧ�ΣΖM›θΗ!ΆyΖ—!Έ±yϊ< �]l{‘εφdΡ#€€€€€€€@d!aad9Σ8Nπ1ϊΨ Αp@@@@ΐ ύ½„ |^ ιΖ!‘*€€€€€€€€€€FΒB ²    aGΒΒ°cž@@@@@@@@@@@@@@ΐΊC uA@@@BŒ„…!† €€€€€€€€€€€€€@ˆ€°0Dq’1W @Xθ*)ԁ°%aaΨςFo    ― @XˆK@@@@@@@@@@@@@|“„…Ύy^0*ˆπ ,Œπ§             π–€°π-=q6€€€Όν ,|ΫΟ Ζ             Q @XQΟ,Ž @@@|œ„…>~‚0<HKΒΒH{κqΰ    Ύ , _ώθ@@@@@@@@@@@@@œ€°Π”ƒ€€€„* C/ @Xθ1:μ    ΰ  ½‘‡}A@@|™ΐ;bpQήα_’/_Ω²r?ήˆϊš+·ςβ•`‹         * , ¬h@@@@ 8GΫA@@ήF¬!)κtχ�“/œn(bE}—Fη+lΞΚΛηiωε ΖzxgxN9R΅ž1Œ«QΩ +ŒυΘ˜,»tŽV]±žγB’?_i£vͺ¨oΞ|Ζp> \OGnCXh1eFψ’ΈοF“₯wŸ=₯―μ2ΥίUύω+Ν'υ‚πz ,Δe    . , μ.wš8I*WΎ"%L˜HξsI6V.[μώΡ£G§²bΏ”©R ±Φ;τHˆ)fN›μ~ΎPΕ e’(‡2όΟCtκώ=ϊ,m*κ—\– ;v˜N?Έλ0ԘQ£�(›ΐεξ³gΤσΰ.Š#D/ΓΕΗ|NwDY/QfNuS§£>9όΝΕtλι*°Μ‘�˜R εOšΜ‘ς¬3ΡPq^Ν)}ά΄€ds±\g1Π™ϋwiε• ΄φΚ%ϊοΥKΛz(°" Z4 ¬PΣiwΕΧ-₯[B<š)a΄θ”6^|£‹£BΤΦχF’1hsΉκΖζ?E0ΦΓ;γ©°0GΒΔ5ŠMYuλΙSΊπθΎΣC13˜sφ/|ΜqŽsΪΐ[ΊΑaa4Α4»`«�Y1―ί}ώ\­FθεQMΰϊβεKΚ΅jAΈ/Ώ3ε~/ K–œ*}šňiŒηώσgThνcπ'aaψŸŒ@@@"% }σ΄'Oρ•-Wž'Ij7ΐ›7o�¬ιSμΚτ•8qβRΉ )Uκ4E8j©τί�ΡΨQΓΥͺO/7–ύ”όbΖ’c¬³uΈw‡ΛΧ B,Ι©ζ–5Rl(W΄Ÿά‰’Π¬Β₯eΙ™{w©ϊΦ΅T@8ζM.XR–ύuχΥήΆNΫΓ–΅ςG�σξΛ6v@K†ζ)@e“§€w„6G…!ε 3ΗOH Š—ΆνgΒ�ζ–uA }‚m@ΐKΎ ,l‘.3uɚΣ8gs£Q!2fQ]D²ψν@εΊ­γwnSένΖΊ9cfa‘™Π›υLρΠΒβoδC…s–bF†δkΒΒj¦‘Ήί„²ΦΟ?gσ�^¨!        Ξ , η€ξA@@@ ²€°ΠχΞ|ι²ε)GΞ\– JX˜6νGτiZv‚BΥΘΫ",Œ-tvWͺ­†MyVΝ'3ΉCsΛ½r₯+WΧ,9©yϊΜrί‘¦igNPομy¨p;δ4䏃4ϋάI™ΧΜΒΒ\+ηΣ P―…Ό7tA…·ΒBǍ'Od8Σ°vgσ†φ`DŒξΜ 58OAϊHs ΗB όAf>IμGΡ^ νΩΝφ»A‡λ…°0HœΖFvΜΜφΪM™ χίΊlψo mψ|Α±ΒBγRF@@@@@@@ή Ύ§ ƒˆGΒBί;§5λΤ£ΤΒqΣύ{χhTͺŒΝΙ-(aαΗ9rQαrΘι©ΑyθΐΚ“ΧŸ’‰o‹°Pw<%\kš\άΎAŸn”ΗhώѝkmYK'EˆEέι°ΪζΥtVΈš„…f"!Ώξ‰°pύiΤρ#”8zLͺ“&טΒn`7ΠαΫ7νΚ|bEΞDτq$g"(ŸΉ>‘j)ΣG a‘β­Λ@Xz§Μ'„…α4ιΟA_»sΛN$ ΗΒΠ»Π2€€€€€€€xJΒBOΙa?―@XθΎPΩΉr•jδ—,mΪΈž.œ?GήΈuΫ/e_A 3eΞB₯J—“BΔ}{χΘϊν;uυyaαGqγQ<α|Δ©ΉνY:ω‡2ΟΞR_ξΩFm2d£"Ι’Λ2vͺλΌ/.=|@χ�{FY$’ε‰cΔ€ΡωŠΘ<�|{h=|ρ Ο[Θ(λΉ']~τŽ°M~y*,Μ.ϊ�τAj*”4₯α―>~Dϋn\£MW―Πϊ.Ϋυa BΎΚ–K„Ά•œBΗ₯ΟQ’°κ‡©Ι_„nΎ�όmωχ ύγέy•ΈΏΚ¦R«4αδ1ϊ V\Ή/—'‘’ΟέΏO3EXΙ%—Ξυ8“8F j˜&#HκG9ήKB·ž>‘Χ�‘υ_¦Ν�ώmWW_©“*pa‹'‹^бBΏbβ\TL‘’J½o;O‡„Ψsψ±Γτη½Ϋϊ�vy]Pαͺc!‹ §ž>n΄3ΪΏ0•z}mpα€#ϋhώ…3Ζvoψ°¨~κ β\ΎOŸˆsπβΥKΪsσ:νΈφ-ΈpΦ�!ΣθXdς$JJUΔ΅_μ›J\ΟΟ_Ό€ΣBΨΊκΚZzι,έ}ώ\―.σάgέΤιΕ>ΙdΘξθQ’ ‘δ Ϊwσq(Uύάλ;³ƒgCαΒYκύ”I„Ž!ΦωšΉ(ξ‰m�ώC+―œ—y}•�XΈ‹±«'³J;±Έεκ“GtL„z ψηmΧmhΈuzΚǝsŽ₯Μτρ/θ�£Τ.SvŠσξ»4C8—Ξ>{ŠΎύ8/•O‘JΞΏž;EOύ©°Pιχ? �ΔoΒΏ9ρ‡ΈΖS AλG”=ab:|λ&­Έ|žζ?m}_‹–<ς½YO\Δuγ½ΔτXΜ[{Ε΅·GΜ%Ώ‰ώΜ�œν_žηŸDbξS‰ΕA…kœJ§Δ5ΈXΜ/ζδnŸrq�ΧO›Ž*₯HMΉ+όΫ…S΄ϋϊ5Z[¦ŠΡ…·‘“ΕŒEΝ�e’ν=Χ'ΟA₯Ys‹pλbp"MσΕΝ§O)©#·Θ`s―5οϋΟγΗ–‘w“ΗŠMM>Κ(«'yγ�'Ύ'υ4ώ―cβZ²έΧV‘—‹λ峴εuΔΟ’ΝW/ΣχGΠ3qL!™άG˜-3VιψέΫ΄ός΅Jυ…ˆ;uΫœΟ…η< yΔu�:΅Οθ$1ί\sͺœ—ŠΏ^ΖωΒb^-βχΎ,Ξ+�,―ŸΫ\ΐΟτ΅Ώι�…xΠ ŽΓϊ3Zξθ͏Έ<ͺ€LMΕύ’‹ω=™ΌgŠsΗΧπάσ§Δ3π =ηœ)yϊά,$ϊ¨›&=ύέsσBρœšqζ/ΪS©–Ρƒ3a‘GοF«ξeψY’Νu¬,¦^ΘyŸ/…°±οα½B”xή�Ήχ…ΰi]ιΚNΟ%WΎ(Δͺ•…;§]š™Qω ’]»mΪJέ­t<¨VΥ₯¬§|ά='|O©ZΟ₯1©Jχ�F!ζ4L„1ΦΟα!ŠϋZμ¬κσr«αvχŠ£Ι3a!‹QΏΟύ‰Σσy[8Ο6ί±‰Ξ<Έg CΏ—ŒB'™?ξά€Ϋ7Ψmυ€Oζ;Ή@ Κ/DΤΑ%o……9ήKDΏ)kt“CΜeVΌΉBt1§ν―RΗ¨[sΛ:u�ω ‘οτΒ₯Œr=ΓχsΩ +τ"™gρΫ„ΕʝθΈfa‘³}XΠ]"`™ΣγqΆŸ³rOζ«π·%–JAfŠXqh&ε~υϋ„Χu`^ΧΣgλ…pί1ΜtίώT;u:½jωά+8jƒά!ˆ|n¦,e¦ά\έό,ανž>7ΫeΜFm…ψלψ!RŠ?QΙ,,τζ½B΅ινΒBo b]†._΄    ΰ„„…NΐψP1„…Ž'#<……2}L­3fu”©δΐΝkΤτχΝv₯,΄2 ν*h+Α ΅ͺY%,Μ/-*QΑa»Ή€ωΪμήf.&³°Π‘Βλ‚°ΆΞ…:dΞa aΜ‰#4ωΤGC³°Π¨h‘Q|X˜΄³bMŠ5ͺE­7E,4+Ίn™ƒΨe¨lVβ° ’YXΘ.Q;+Τ ¨Q¬…žz[Υ7―±•m.[Ν©[˜ΪΟJX˜/±M+TRUqΊ ia‘'|<9'ž 7 Ρng!ήεd:$6tΒB+—Ow Ν:g}>nw…Φ,‘gBlΚΙa‘§}Vnͺ?δ.ΰlˆvεή ί‚ΞmβώP©ΨΪ%Nέ;ΩyoCΩOUU*°z‘sϋͺ°ΪfΧVα{Υ³§oζ‘ ω‹Qaᦧ�6!˜ύR\Χs —¦œ‰’¨b�οUψ6 y^ΨδœizϊάdΧΛ€2Uͺ —fa‘7οAvδΖF έ€…ͺ         , θθ@@@@€ΒBίΏ "Ί°°FΚ΄"_bα˜[±«ΤΒσ‹ŒY 7―Dcεΰ(„pή‘&3Qt!Φk™αΠoΕεstM„Wl™>‹qrΉμςΓGΒ)κ• !¬;`ΉγXh½p Ο‘ΥΒ±/§cΪJƒξtΦ(pƒo+B/ΏNΞ„…WDθΦεξοΗ)[‚Δ"δhzrUXΘ’Ύ=7�‹†Q©vͺdXf)œΉ¬dE;§¦SχξΚp�,Θωά$ެ»mpOΌ£†*—VΒB!ΉL„Zζš|ή8|(Ÿv,œ|ςOsβ¨ύE‘άBμ2IΈ‰ι�‹fŽ3a‘S>⻉πΉΝDh`•‹cγpϜΎ!V£‰ΎU2‡fN7-)i/Ϊ<#ψŽωλ(=νpXΫ/DoNy…K¦JύrϊSMbZ₯ΛΒΙjœΨη�/6�”…sšJg…ϋZ5αΒΖ‰…Dz(MœUί²V\λΕΆ¨”!^Bκ‘-· �kv,όζ㞞³°Cβήβbέω�¨pΎK3&-.QQ"‹~rŠΉ‚“YXxψΦMj΄ΓBΨJτσ‰8'Ε9Ρ“;ΒBa»¬d%cwy\lνR">‘’FI›„˜O%yγ7§BΨΥEUR‘€ΥΊΎτ΄Ož‹+Ό™KΉΝ"k !μs9ά•β8Ri"H―……’ύΕΕ+P†ψ6!ΪΧ"ΔϊJ!žž_΄eIψž<$ε°ΪH<zΎޱ0³εΞ-r»ώcΎ6œ υ}Μστρ;·©ξφ½Š]ήJX˜_ˆ‰‰ω;]άψ΄TΌU²rTΫ\]z3¨>X?§H΅κ°l°m=ύqW{Ά8Τ )dο›3Ÿ±Ε™°Π¨ 2™Δy](Ξ―Jό|δηdh€]β@OŽ.·“4—[ξ3YŒX”HŽ•¨ή›ηζώJ΅νάoΏΧγοβΊδdžua‘·ο²ƒψ°0 ’ E†"\4     ΰœ„…ΞΩψΚ–Θ",άVΎΊtλbξJΰ₯‡]¬²q5]xd}ι熝©¦ΎσͺA’ψΡδ‚%e5vŽjςϋ&}»Ό;ΒΒAΉ?1ΟΈMψλ½Γκ‘ΨA«΄ͺtψΦ !PΪ¨V₯θΛ Y PŒJN2fα\pΞWy%₯™…K­™EμΠ΅Kdκξxj'³°°qΰF:$¦άM!-,TΒS}ξς1?» VίΊVo’Φ‹°–Ί[]^!DS^σ‹•₯, υ+ »‹BΠTJ$ά袊λ\O?ώq€Xσͺ�‘―²ζ2œ;Ή^UΡ. EΝb'Υ»PΞ9{RX�J76U�/Νlx %^^>OŠωΜΒB]Δ•§,aηΜW&`9ύϋτ±Ρgά–bΣ1Ÿ΅ΫŸ―iu ĈΥN0Θ­ΔΡξ =ν“έϋV•ͺlŒu“Έ^:½!Ν…R€’‘y ΫCBXΘχ@“t™d›³ΟœBδƒvηWŠ²Δ½84ο›PδζωM (<„…,j-Ήήζ†[ˆάυλ%Ϋ�ΕΌ@IDAT‹°Γή$oζ½ίžΩrQ#α’jNΞΔίζzμλ«ΒB³ψ’η»|kΪ ψΝΗΓλž>7ΝΧΩ3!*Ν»J8ΥΎ~7`γ†roΒvλΒBoί+¬ŽΓ“2 =‘†}@@@@@@@@ μ@Xv¬Ρ€€€€€FΒB †f#²°°Πλ0šIEhށΉσg`ΐ‘}τμε  œΦTκxqΘΰ=B(ψ~¬X”*v\Ή‰(*„γαμΥmίο2ͺ )Λn_έEΩΥ'θμGa’;ΒΒU&w.56gK³ΛYΖαlύ…ΰΙ•d‡΅ΪΉ™vίΈζtך©�RΏœoB€ZΥΧܐZ©FΝΒΒBkΣ}α|θn�ϋq&ZqΕ±ΕίέO{o]w‚»|8<ηš�oDfvα0_·>4Οαι‚²ΓΒyPΝΜN™Α9ώe.ˆσ5D‡ƒ°(ΠC>›Cmš«σύΡόχΝτU«'+Χ=};η9΄νΈBσvwΧ=αγι9Ή&D~Ί°°ά†tηΩ3»ΠΡ,,δ0Γλ4aaŽσ€k£YXΘϋλ ;gώΨ.άΊ Ο«3qGXhv ΥΫq–W.ϊvw„…žφΙ!Ά§kε�³w'p6Υ�Η?!ΖΦ”­μ’}ɞ5;‘l!•κ―R‘JΛ/ν«"‰BΩ₯TdΩχ}cW‰(ϋ ��ϋ9γηžΩοΈ3wf^ηρΘ=ϋωήηχ4οω|ϊ™ sc\ζΌ•―F°°ΡMωe@΅:Φ[έϊΟ1ιiΪΟkr%”₯΄ευ›Iσg‡.Ρ}}ΣύήΐWRT,œd»o˜?―tΙh*�wU)ΥΚ¦]LeΣΔ,‰ύ:b?[m6ΆθΰdΦ?³ͺ˜–�ξj¦φωήΧ`z«HκηH[½Η΅ψϋηfΦ ΎAύ'ώ±ͺϋΪΟσέΑΒΔώ½Β~Fb_ &Vλ@@@@ΐ , ¬/wG@ˆA€`a 0A΄;5 ݁³ψ’kεΒn%ΛJ‹…γ{‰uή†cGδ!Ίς. .nΪZrd ρή"Φνς&Όd/ή`α!S‰�Ή©HŸΕœ‹«U₯·’ΨΓΛΘ:O Ολo­μρxƒ…U~4ϋL ή„.ξηΔ7X¨συΙφ-rΦ�6ν~΅°·ύ¬{ υρVφ«τΫΎΩ}KyΗ3ۘ€¦½h%ΌίΝ‘θZφzνμkά―ήjXξc1­w_½Tωέ:¬A \-Γ£»F[ό֚5YΞxZυΟ~ 7UάΊQΖνέιήε¬1A°ZΉσJ«‚E|ή›}B|*/ΪηΖφꏏΏsrΞ΄u‡Η[±ΠΪύ°R ΉΣdv¦.€^&,ψP±RΞoΥCη€YieξυžΉ§½h%Ξ‘»ΆΩ›Q^�3IΦy¦ρΏΪ3Ϋ΅$$Xθο3΅"α€ϊ͝§Ž5‘ΉΎ—CsΊ³šωŽtU4ΌΑŒιL•?SIΟ^΄§ώ^Σ0–Ά‹ΦJ‘œ=#yMΥQ{‰ιs›ƒ…Wελˆω(―ΫXΚ]ŸΣ&t^7?&—™κ~ŠΛΜΑBύΉΦΥ ]+Χ2_£γZόύsΣϋg»χΟSo›ww°0±―ˆλ=Εχ8ΑΒψJq € € € < “ǝ§"€ €i^€`aπRs°°σΝ%DC$Ο–©ΰLΔ·{Γδ°©@ΦΣ³o�™Θ6ΖM›Ι’Χ]/εM β)SΉ0› ˆι’α“q{vΙΣ₯ΚIΦΛA+­ψυή]Φρ½§OΚς£‡­uχ/ ©Xψd‰rV΅Dϋϊk–ΚΒ?#«ΙΩϋμΧμf §M΅=wΘ>d°°p–μ2£Ρφpδ€iέbαLgΫ ˜o‚K=Χ-wŽλJj¦7 ₯Mwέγσ~΅]�]1ΤTσZζ©ζεnν ›ΕTνO[rώe*.κβ »hυ4  Ή?#Ξ€ΜΞζΪγη#―uφ{WΜyw**oU¬ζ™a€�3A�Έ »L6νdέ­ϊs¦Θ±Λγλϊ؎ϋγγοœhΨμj έ~ΐ]ί’OΫλθZ‚{[ w[½X–‰ϊυFΝΚ›°κ7&΄j/Sξ•W7­±7}^υkF†k�;ŸKχΑ‹–”ΚVtvΕφυΘίgζ4ŸΑEMΫ8Ο8cΎ¦Υ˜9Ι υ―ZKšδ-θΏΑB½Ω*SύΝώ:nί\Ϋ•η0ν¬οΘ_Θήe½ΖV…πj O›PZMS4¦ ·νn +^―#]n))Ο—ΉςΩρ5ο›–σγχ…ywϋlϋ,ΤΚ©ξ κτC{εS‘2‹·ϋ#¦jοZOΥ^ύ|d1_ν ―‰ωsΣ Χχγ�’yGΎ‚�―J-ηmΊƒ…‰ύ{…sΣD�ψ,ΜfμΖΥiμσδ{–Μ‘σ¦ς%  € € € €ΐΥ Xxu=Ή € €@<Ζ*OKΝΑBeΥoL―Ό³#¬•§2›jCξΆ‚g|₯Z—^π’«-μ[6Θ7ϋvΙ�ΚU’ϋM`Q—χΆ¬“oχνΆΦcϊ%!ΑΒJ9rΙΨڍœ[]ψχ’ γ-3U Λ…�“ ι%Ÿ©JΧ­DYi–Ώ°xƒ I,Τ@Τͺζm%“ρ΅ Ώ έω‹δϚUΎ2οΓ]ιξ%S9oζομS­ΧΤ,Τ78¦V©œ3σž΅RW΅KMˆLdhυϊR2τzηΨΌ|ΖΌltS~P­Žs\WF˜ͺs£wο0U/ΙMζsπjω*rλ 9₯ΚΜ‰Ξy³Ά¦j ½Μύγ ωœ�—cα’ή|ύη5²ί„ˆu|α¦’£έΊάίgjΨs½©ό–ή|νeβώές©©(ZοΖ|ςn₯κφnλυj ?­Z[ζ-ΰsο'V-–P$w;λ ήΟ»Άψ΅—μ2šΟψ]φ¦h«ίΫšβlλΚIOEPέη ‰ 0s9γ·ύNΐΣ}MR u|~1ΧΊ[Mλ½tynνrŸΟ’ξσVέΤΠP£½t/y«O‹p #ώhŒμεμΕ­ΟΎ½­―^+ξk–ΙΦŽGω}βΎΞŸuoΈYΓ|Z!v₯ωƒtζkmΙμΧΛϋ¦ΕφΒΓΏΙϋ[7XH̟›ή―]ϊϋ±λΚE’+sˆŒ«έX2ΊμάΑΒΔώ½Β½¦Žωs¦„1°χxθ>ύϊe/a¦:ςSΥΧ»δΞ" ̟Kξ₯†ωϊh5έϋYG@@@HœΑΒΔωq5 € €€Ÿ ύ„ πe₯Κ”•λ/‡š2fΚ(Uͺήf=ρμΩ³²ycδ7ΐuΗ–Ÿ7ΛS•Ο^ (( ^©ζt[š’ή|3ϋ’ω†ϊκ•+μΣδΰΑύςΫ‘CΞvr�άf‚]#LΐK—Ÿ�ώK:-›/ξ ΤζγIηεσ£β’;ΪΘ ¦‚•.­M5Ύ=&P³μŽΆš1²ŠaΛ?Κ>—Ot7IH°P―[«‘TΚ™;Ί[EΩ—œΑBL SΩ«Oε+a§(ΌΌΓͺψ5wz”Š\©=XxcHf™Χ€UL,>ϋλš6š»[›δΦτ†wJΣ*6ΆεΌ wΉƒ…ήŠ]±]λΣΎΣo\­ξωΟωσRΚTώtΖ΄}g}ΣΫšsn”?}ό™“@ cz«ΆΉϋΧ(‡½©('˜ξv½ήjƒΡoοkΒͺΡ Kd•LΕɘ–­�“ϋ–š–Ά—ŸΩ³τ­&˜ZΪΎM¬―W+XΨιζβςrΉΚ>Οͺg™ΜŸgήvβ½7�’i‡"mΪΊyjƒ+•Z}nΓ†»ΕΉ}Κ€zΝ€ψu‘φf”WϋΟ=ΰϋ@W,ΤgϊϋuDƒs?™ ₯ϋk†έvώSΑπASΙΠ^τλDσω?:_Ζί}λdϋ|ολ(dοΏύJ8M{ΓυήktΫύϋ$Ίγρέ§?΄°ά„λ΅uvl‹VΒ΄ƒ…zžΏnVΌ!—|UηΚΔφLw°PΟKΜί+b{NlΗF™0zUJΟ²ώ―£�eε‚(§,ŒBΒ@@@@ ` Fˍ@@b X›Nςλφτ3ηΜϋI6oΊRΙͺCΗϋM°πJ[ʘnp`�~ωaΒ·1N�ύ/™VžMKO]μφ‹―˜@Ι}&X’Λ»?―—οφGmΙ¨•έΌU ³f0AWϋژ*Z7ΎόKBƒ…Χ›ŠYκέaU€sί'Ίυδj"δσκ·K]SY,¦εœimΪaρ\Ω6²Υ΄ϋΌΤ,ΤχŸ°•V―›lΪΥz­J¨FvΥ{\·½ΑBέχtΙrςΈ©jΧ[°0¦k΅R^γΉΣœJuzž7XΣ΅›V‘λ<­Bc:7>ϋύυIθœ$U°Pmο˜7Γ©Zη5ψ buΉ«`οngΫ˜�1Œg°'¦`‘ήΨϋ{Τy˜Yρ ύ}¦~­Ϋ€e”ΦΔξgΩλW+XXΑTϊt·XΥκ°•œ ήΆΧϊάv‹fΛN²Υεj o½>§|m‚t1-Ι,Τqωσuδ­[«Ιέ…‹:oλ„ Χ3UJ�ύο?Ιhx+ίύΪΎPQy£B5gW Sρ@Υν“ο*PXz›°f6Št/KL›ΦΦ―π£ϋΈ;x Αžj³&FΫ’Ϊ}MtλξΆ’1…€ gΙ.3]©4Ÿ6Φξg%ΖG«}~[]Ι›%«ϋ–rΐTΐμΆfI¬ΞZλ%ΣΆΈ}‘[|ͺ�ιτϊ~¦…νBγμ]τσΫΧT“,{}τ!m‘όύΎ0YυΧη��ΕKK‹|…ε–*©Ν8ΈO>όe£όγ�¬h�.`ήΧ3₯Κ[-}έ­±ν�.l]/sL»η«½ψλ“ 91žu-Ϊ9mΏ΅σΙσd­Ω§ΥΚ΄έjUӎZΫθ.lΪΖz‹Zρ±κ?XΏ™ϋ™yΈΓTχ΄—N¦ΚίΫζχšΫyΗ‰δAσ5ΖύϋΩ>ίύΪΐ„x[ΌY΄½iŽLWΎ†kΐTΗ`†κ³ΤΞ}“Όk‰Ή’ ’kθχ‡{dœi‘όΫΉ3>ΧΩZ�Yώ‚�ά΄bΎ9Ϋu’?K§BΫrΣΊτ‰ΥKμSWž©Α§ρ·7ρiγ­fί5νoΏ7αZ{Ά]΄^b—¦νbS‘Φ^ζ›ΟfΟΛ­Θ½-gέ­WσgΞκΣϊΨΎ>¦Wύlhkk»e΄ϋ<ύ=ϊPΡ¦²g)š=»dw}ύlf¦φœ„šΦΛΛ\φ/L»ωΟvl΅n₯σ³ξΞvΞΧoKuχσόYOΘΧ‘Μψ—4kλσm/½ά΄Ά—¦ω ΚΗUjΩ›Φ«ν;΄z]Σ¦=―Ο±Ψ6šφήΓvmzŠωMPΥTύ½·H1Sρυ:σ_6ηχ�ώ9Seζ„(ΏO’ή$ώ{τ³ΤΏJmηοξ+υχΘ[6Fϋw ώάΤ?γ?1mΌένΣυοέV-‘±u:Ÿ!­[ΟT‡u/ώώ½Β}„¬0γlδi7Συ1}n½Ÿ}½Ύšω:§mΨY@@@@��ΑΒ«λΙέ@@β)@°0žPœ–jΌΑΒoφξ”cζ›ώGMΨ*Ί*u^ N]Ÿ!“d0aΑ3&tΞ–.\ςΖ‡ΌW%ΟvΖtι$§ ;»xΡj…k%$4”zyςIΙΠPσˆkδij³—˜‚…φρδ|ΥPNBΉdͺwΏ‘ΰefΣzS[sŸΏtQN^ΈmX)Κϋ3•l¦�f¨Ή.Β\wζβΏΦόΔ67:ΞΜ¦%ls]z³�• ϚϝV‹k ΡλΜ8u¬ϊΌΣ泐T!|;'qyθqo°°Φ¬IrΚό^Ξb¬t^ώŠ8πίΣHΊΞTΜbώ;kž}ΖΜgta·ψΌŸψžγΟ3υσ“3cˆωϊxNΞ›PKψρu$HFžtΓ0FΧeΌV²gΘhύY­_ϋ.Ζγ3μϟ›ϊ{+·iQΖό9 _KΊ€€ΏW$τ½q> € € € €€ ύsγ*@@D ,L$ —§xo°Π~CΡU²ρ·ΐπυ₯zξΘJ”9Xθ'λiG ¦`aΪΰ"€ € € € €³ΑΒ`žΖ† €€b‚…©xrykρπΆΠ΅/:b*r5š;Νήδ51΅Νφ«|Ό}sοΖιN€`aΰlΉ3 € € € € €@β&ސ; € €ψ!@°Π4.I]¦=bFΣΖΨ»h7γψ΄Iτ^Ηv€€Ά‚Τ�ΌΛ…K—ΔΠ² 4 ƒf* € € € € €@4 £Aa € €@ΰޘ' €―ΐ«ε+KϋB·8¬9{²œϋχ’³Ν  € € € € €Ι)@°09υy6 € †¦αΙη­#€ € € € € € €@P , κιap € €@κ X˜zη–w† € € € € € €)[€`aʞ?F €€X‚…)vκ8 € € € € € €€r‚…©|‚y{ € €@° , Φ™a\ € € € € € € Φ¦υOο@H&‚…ΙΟc@@@@@@@8ΖΔa@@ΐ, Œ+wE@@@@@@+@°0±‚\ € ΰ—ΑBΏΨΈ@@@@@@ΈΑΒ€σ@@θF§Β>@@@@@@@ ω&�0@@ M ,L“ΣΞ›F@@@@@@ @°0LCD@R£ΑΒΤ8«Ό'@@@@@@H  SΓ,ς@@(@°0NCF@@@@@@4!@°0ML3o@>‚…Α7'Œ@@@@@@P‚…|@@’E€`a²°σP@@@@@@@ N‚…qq € €@ B•{"€ € € € € € €‰ X˜xCξ€ € ΰ‡ΑB?ΠΈ@@@@@@H‚…I€Μ#@@’ ,ŒjΒ@@@@@@@ Γ,0@@ ,Lƒ“Ξ[F@@@@@@!@°0ELƒD@RŸΑΒΤ7§Ό#@@@@@@H SΗ<ς.@@'@°0ΕMF@@@@@@4"@°0L4o@6‚…Α6#Œ@@@@@@ˆ XΘ'@@ Y& ;E@@@@@@β X'' € €B€`a TΉ' € € € € € € x‚…‰7δ € €~,τK@@@@@@@$ X˜Θ<@@ ͺΑΒ¨&μA@@@@@@‚A€`a0Μc@@� ΑΒ48ιΌe@@@@@@H SΔ41H@@ υ ,L}sΚ;B@@@@@@Τ!@°0uΜ#ο@Hq Sά”1`@@@@@@H# ΣΘDσ6@@` Xl3Βx@@@@@@@H‚…|@@’E€`a²°σP@@@@@@@ N‚…qq € €@ BΥΏ{ήR¬Έ3�eΏ.TBBB$wž<֍Ž9"αααrκδ Ϋ%»Ν, € € € € € € ϊ¦ώ9ζ"€ €A)@°0y§%44TjΤ¬-E‹—L!ρLxDΈμΩ΅K-œ/ρΊ†“@@@@@@@ ε ,Lysƈ@@T!@°0ω¦±F­ΪR©JΥx ½#Υ€αΖυλdՊεήCl#€ € € € € € €@* X˜ &‘·€ €€D‚…I?k™2e’οwZΫ#8qβ€μ Ϋi΅;Ž0‘Am¬‹ΆDΞdͺj›δ’ΕJHhθuφ%Φ«ž7α»o¨^θ£Β € € € € € €)_€`aʟCή € "&ν΄iH°}Ηϋ|ͺ:x@VšͺƒϊŸ₯@ΑBRΣT;ΤW{Ρκ…Ώο„νύΌ"€ € € € € € €@Κ X˜rηŽ‘#€ €)Z€`a�MŸV*|δ±'|B…‹Ξ·Ϊϋ3 m£\ΏA#ηR Žόr(• V@@@@@@HΩ Sφό1z@@ Ε ,Lš©σΆ?ŽiS'Ε»JaL£Τͺ…­Zί-™B2Y§h[δqcGΕt:ϋ@@@@@@@  ,LA“ΕP@@Τ$@°0if³f­:RΓ΄/Ά— ¦mq|[ΫΧΔτͺαΒ¦½²½¬2m•W�Xfo¦ΪΧwίz]Ϊ΄ΊKώτK0πsg;5¬¬[ΉTBC―³ήʏ³fKΟη_J o+ΑοA¨w}TŠ»ErεΚ%ǎ“]a»eθ—ΓεπŸG|Ώψ\>_ρqΰ@@@@@ό(Yͺ΄ΤͺSW²eΟ.�§-2qϊδIYΌh‘μΩζοmƒϊ:‚…A== @H½ ?·M›έ)eΛ•·€U ΅Z‘ΏK½ ₯r•j]UB­Z¨Υ uωeλ™3{¦Ώ‰χu_!·U«ηωgϞ“ΡcΗΙ'?‹σάψœΰ nΨΈI:vzΘΊ”`aμ‚ Eξh�Xϊ}ψž„„„DΑ:ώΌτzι™υΣά(Η»ƒ`abΉ@@@@@ - ”+«4nΪL�Ήζš( —.]’Y3¦ΙΝ;’Kι;¦τdό € €@  Xψ‰λΦύ§ZabZ ίaŠe.uԟτϋΠgπξ–ΘZ΅pΘ O}Žb#ΎΑBϋΩ}ό‰ 1ΪήLΤkί>οJƒzυδ\xΈΌφΖΫ²hΙRλ~ cgMλΑΒ9rΘόŸfHΆ¬Yc„:}ζŒΤ©ΧψͺVΩΤ‡,Œ‘œ € € € € €Δ*5k6ιϊΔ“N¨πι˜₯= )"yσε·�ΥpαΰAδΒ… ±ή+₯$X˜�fŒρ"€ €©D€`a`'²X±�²M[λ!'Nœ”‘Γ†ψυ@o¨pγϊu’-•½Λ#]»9mn§O™,aa;½§\Υmo°pΠΰ‘Φύ―͐AͺT�,+ά*Χ^›ΑyζŸGŽHϊMœν@¬,Œ]5­ [Άh.ύϋφq>ς… 7aΧ‡μ$ΟφxΪΩ�ΔΣΟΘό‹œν«±B°πj(r@@@@@΄(ΠΌEK)UΊŒυΦχνΫ+“'~ο0ty΄«άpCk{Σ†υ²pΑ<ηXjX!X˜f‘χ€ €€@‚…4wδ˜Β€qΐ*Œ­Νqύ€R•ΘΦΔώ>/�ρΈ»ƒ…§N’ΚΥλΈKΑωeΞΜi’Α ν₯b՚N%ΈΆ­[JΜ‘�ΠΫ²εY½v}šυͺ-kΥΌΝZ?ϊΧ1™:m†sΌu«»$ΗυΧ[Ϋ«Χ�—mΫ·[λρ jΥΊF κIΉ²e$sζΜ²~ΓFYl*ž:uZ6­[ι<γσ‘_Κ€Ÿ;Ϋ1­tΎ�^ΣV7“uψ§9σδΰ‘ί€vΝR«V ¬ΌVώωηYΏ~c”χ羟Ž©}ΫΦR¨PAɝ;—œ9sV™ϋ¬X΅ZV­^γ>5ΚΊΆφ-Y²Έ+ZT�₯O'ώfyL�qV”sc ήtcΉΛομεΟ?ˆχ λΧ“jU«ΘM7ε±NΣΐμώύδϋ‰“œy΅―wΏ6oΦTn-WΞΊnϋφ²xι2Ω±s—Τ―{»+VΤ:uη�0Y²tΉϋ2k½HαΒR§vM)Y’ΈδΙ“[~�ύωuΗN™;‘?~<Κω±νxμΡ‡ε…η{:§/SΑYί΅m³³ώΖΫοΙ7ί^ωŸ΁x¬$φσU±By©\©’”(^L�7Ÿρζ§.w«‹–Δω~ςY°ίŠΞΆ4/?ŸυyύσΘQΩ½g|υ΅�mΫν{σŠ € € € € €ΐΥx�tΛ”)Dώϋο?ω|ΰ'NUΒΠΠPιςθc’.]:λ1gϞ•/ŠςH=ή QΙ—?ΏdɜΕ:q>BŽ;&Φ­5ί“9εš`ΩA°0Xf‚q € €iL€`a`'ΌCΗϋD[λβOδ„„ υξvΘZώ]ŸΘ%�`‘>ϋλ±#ε6D³—κu8α¨ΥΛIŽn°Ν6Όξ=Ÿ·O³^{Ώό’t1•δμΕΫ±u£σΔ±γΎ‘wޏl W°°ξν΅₯�G}œΚŽφ½�ύχ_yλέδν7^΅wI|ƒ…ξ@šVmΤp—†ΒΌΛΤι?J―—^ρξ–^Οφ‡»<(M1ΊeωΚUζŏG9Tμ–’Vυ½�₯JF9¦;v……™η½κ„.u_LΑB­¦7iΒx)zs=ΝZf͞#=ž{ΑZΧ°ά7f.o)zσε£Ύ/0Τ0ޏ³fϋΠPΰƒϊάΧ>aΒ“EW«ZΩΪ₯ΚξjΆ^5ψLχ'%cƌ>ϋuCŸωΞϋ}D]γ»T7ΊqcF8§?ϊψ“V˜Ρ[ΙP½Υ=‘Kb?_}ή{[Ϊ™€it‹υ~?ψΠ'`kŸηΟgAƒ€C?(eΛ”Άoγσͺaαή―Ώ%³~šλ³Ÿ @@@@@’R C†kΝχž³ι >τHWΡοaΈ—OϊE~ΟΘή—7o^io'ɐ>½½+ΚλΟ>•πππ(ϋƒaΑΒ`˜Ζ€ €€A‚…τΞ>,ΉσDVv7v”5­€γ»$4T¨χΥgι3uΡgι3ΉΔ,Τ°ΪμSL•Ί­a>ό§άή°©3€Δ έaΎψ ΅βߍσ© θ &š‚…ΡάΖg׌™³δΩ^/;ϋΌτœž•&O•—{ΏξμΥ$/œ3S²dΙμμ‹nε°©:Ψ¬Ek§š`LΑΒ γΗ™ΦΥε[xÌΖe΅ΆvNˆfεάΉs�κo�~λ¨Ξ�‚Ή3πh4—ψμς 5pωxΧG}Ξ‰nγΙΟΚάy ’;νΎe‹ζʍ—_jxnيU�΄qCIω(„νή#Ν[FΆ0φ1μLμη뻯ǘJ…cΈϋ•έ―ΎρΆ|7αg‡ΏŸ…YΣ&™j‘·8χ‰n%""BξjΣΑ™ΣθΞa € € € € €Έ)o>Ή―ΣΦ#�ρ»Œ�ϊ+k½RεͺRΏa#kύΒ… VWέ6t°œ>}ΚΪ―Ώ<ώdwσύ”ΛU #Βε„ι4uφάYɞ=Τ΄PΎΑ*dρŐΟδμ™3Ξ5Α΄B°0˜fƒ± € €iH€`a`'ϋΩ^/9πώt”s šB…φmό}¦}}B^έΑBύ)�Ύύ?΅.ΏώϊP©ZΉ²TΈ΅Ό|Σ�τ/όοUŸjkI,>τs©WχJ»f M-\ΌΤϊ‡f•ΚεzS.ί½$&XΈrΥ«…m•Κ•D«ΙΩ‹VFΌ«M{Ρπš.σgΟ°ΪλΊMš2MφμΩ+eΚ”²*Ϊm€Υ·|εκzš΅ ψψCiΡΌ™½)›OŸ1SB―»NκšχxΓε6ΡzΒΘΡc像>ΆΞ.XθuΩόσσ“{{?Πι>y½χ•0䞽ϋ¬Κ„™2e’Ζ ψT#Ԋ?b]Ϋ³ΗSςԏ9χΡχ·Θ΄œ>bZνVΏ­ͺU­Π9hVάΑB­¦7ΟΨθ3t9oώ‡ΐΨ―Ύ‘cǏI©%D[aΫ‹ΆbnάΌ₯½竆χΎ=<Ϊ ‘š@nη‡ώΟ― Χ1!Ÿ/m ώΡο:cΧΟΙΣϊϋπŸ&Œ[»–άZΎœsLΫ?7lΪΒ ‹ϊσYπVn^@@@@@H*²ε*HΣf‘ίΩ·oLž8Α‘ΈVΊ=έΓ*&qά|ο Β|%oΎό֐¦NϊΑ|―%ΜZ 1η=c­G˜PαΰA‘ί˲Ǟ>]z©]―ž,_ΌXώ½τ―½;¨^ Υt0@@ ν, μ\ϋςKL¨Pߍ?ΟτWΑ,ŒλοΨOF‰ό 2ϋά€ jU·ΥΛڏΆ‚jtω?Ω°q“΅―`όςέ7c%w�\Ξ9ώ 5X§a,{=β ©]³†½)γΎωΦj»¬;^{ε%λ§αt]Η’ΗμeΠ€₯YΣΖφ¦4iήΚ Όi%ΐkWΘ5Χ\c;yς”΄iίQϊΝΪΦPޜ™Σ$sζΘj†ΏξΨ)-Ϋv°ŽΉƒ…Ϊκψ¬©2θn½ΆΫ ž9{Φy�†Π:ήΣήΪΎdo’†ΫtΡVΖsfNuΖβni½tΑ§Z₯žϋϊ[οΚψο&θͺ΅x??ξ`‘5Πh/ŒΤ€€½|φιΗVπ�ή~€k7YΊ|…½λk‡vmεύwތrΚuλM+…^Φ{λώδ�γιnΦ9ξχε’Λ;ϋωš>y‚”*YΒΉ}―—{ϋ„pGb νήοΣWF'ώ~τσ¨ŸK{ϊεpωxΐ {Sή|νΡ�ْ˜ΉσeΑ’ΕΞ1V@@@@@HJΪuλΙm·E~ŸεΧ_·Ι¬Σ₯ύ=χJΑB…ε�₯K2rψPiάΈ™)YθaΙ’…²~έkˆ9sζ–~ΔZΧοmŒ9,)‡~UžE°πͺ0r@@„ ,L¨XΒΞοόPɝ;² p|Z!'6TθΣ ωθŸ2nΜθ„ 8g{ƒa±]~αΒEωlΘP<τΚ?Ψ’2XX£ϊmςΥ¨+Ϟλv°Π[qοΙΟΚάy |΍i#Ά`αs/Ό,Σœν₯ZΡQ+ψU�XQ ,ΰ„$½'ΫΑBm�YAk}ζŒi²γΧνΐۢο EŠDV3΄wώk:4:uJ–-Y(»vξ΄wε+ΑΒ œ… €€~‚…γ¦Νξ”²εΚ[ΩΈ~,Z8?Ϊ^P‘ήΈ~ƒFR©JΥ8Ÿν όΨικ?Ύ*W―ε.Ν›5•ύϋ:ϋ΅έoΗNYΫI,|ψ‘δ•—z9γˆ.Œη xω,όzόwςζ;ο;Ο±WάA9 mΥ3%ωuρΆ;ΆΟξΥzίK—G—ε+WEwI”}± <$­LΛdwd½VΛ�Υ(Ι”)S”ϋywΨΑΒ2₯KΛΤΎuϋ΅ΌΧη#gΫ^YΆh�SνΠΛ鱡+—XΥνσβzπΓdyε΅7c=Ν=ZYς‘GΊZν£‡ύ\κΥ½ςΩ]³v ™–pBž}ό‰ 1:Φ{{η$!Ÿ/o 5¦€Ϋdλ/Ϋ€m‡ϋΔϋά„|4όΩΏo)]*²²etoπΨ±γ�ΉΛ£Ά{Ot‡Ω‡ € € € € €@ΐ ΉΩ©P¨@-h‘ΥΏωjŒ9ς§υόNt‘<7Fv;z„ϋλ/Ÿqi8±F­ΪΞπ»ž:yRF./^pοšu‚…A3 @H[ ;ίŊ•–mΪZ9iͺ£64Κέa@=ψΛΦ-2gφΜ(ηΕgΗ£]ŸλLkZ]¦O™,aaύ «ψ u,ξ0ΫρΏ�–κ΅λλnŸŠ…λΦoϋΈRMN{_ΕΛTΠέΦ²kΫf{Υj«­puιϊhyρωg­uύEΫkˆΜp|ΏO_5vœsž�xΫΓϊ,œΏp±<ρTŸϋκΖζu«$K–ΜΦώM›–χ= ΅k֐Ρ#ΎpΞ=α‚l4ΑΛ5λΦ›vΔΛmΥͺšvΘMœγv°°Iγ†2xΰ'Ξ~ Τi°.>‹{.’;φœy�½ησ>‡΄Υ�Άά΅ F.[±RvοΩkύ4ŸV‚΄Ϋ<ΫΑBmιΌiέJϋ‰�ύ³ž³~υ2§’₯;X8}ςΣΚΉ„s}―—{‹ωΏΞΆweσΟ[eίώύήέΞΆ·‚bߏΘ—#F9Η½οΡ9`VβΦKμηkη/›ΓY?Ν•Ο^ ΑΪcq·–Φ •^LΜgΑΎ―ΞmSσ™ͺT±‚”)]*Κ�T±ηΤ>ŸW@@@@@’R KΦ¬ςx·§}ΉγΧm2sΖtgίcݞ’¬Y³Y۟τ‹όž‘sΠ΅’3gn)o:•,YZτΎφ²;l—L›2Ιή ͺW‚…A5 @H; ?ΧO>έS2…DVz‹�ς³½^r‘˜P‘» rDx„ ώl€sί@­Δ'X˜Γ΄D^nͺ�eȐΑΖ‰'₯jΝΫ­uw{` Υ•­YmΡο֍k|ͺδ%&Xθ­ ·mϋvΡ ž{ιχαϋ�Ίe g—?ΑΒσηΟΛν ο0ΑΐγΞ}ΪΆn)}Ω&Zwώ8kΆτ|ώ%yΌλ£�λΩ+!D­θ§•ύμε/>/tyΠή΄Ζ«γ.RΈ°Μ5ΝΩοδΩ;ϋυyOΚ–-cmξέ»Ο ‘ι†;X¨Ǐ ’QΓ†8σ£ηΌυξ’ννE‚ΤεΘΡ£R»^cϋυϊΛζu’ρΪk­uwΝύ,ύ Β»Ϊ΄χ©|η}ξχ‘ΑI ΝΩ‹†N5|κ^τ³•υrXSΓ£±-υλή.Γ†~朒­†΅ε°½θϋϋΦ(έaF=¦•ϊš·Œ ΫηFχšΨΟ—ϋχΒι3g€Ž1vWŽΌ―cyϋWGkE­€˜˜Ο‚=§zSχ³:ί―ΌφΚK’.]:λyj«]@@@@@’K@ _+κ.ƒ}κ E�ΆΧ"ZupΠ€ώΞ±ΨV*W­&υκG~/B;s �bpl§'Ϋ1‚…ΙFΟƒ@@΄-@°0πσοn‡|πΐ™ψύxŸ‡Φ¬UΗ*½[«dŸ bΨθόΰΓ’;OλhbŠ1ά>Ϊέ± 5΄T­jyαωžR’x1ηzwxlβ·γ€Β­‘­’υ z}1l€Uyξƒwί’φw·q�Σ•Δ υzwΠM·ΏŸ8IzΏώ–�Z!Ώg{<εό£Tχω,Τλ4όχτ3Ο[•λή^[4°xΓυΧλ!kω࣏eδθ±�ύΙ'€ΗΣέμέ2xθ0ωd`dψMŽοΎυΊOυ8»b‘^°rΙΙ•+§sν ΑCeΰgC¬ν.v’ή/ΏθΣ6ΙZuO·pμρT7ιώΤΞω��c'Ω±s—΅oΛ†ΥΞ84Z―ΡVMCm―ΌάKΤ«λ\λjΈ±u«»œcZ­rΐΐΟεμΉsR­JeιΨ‘sLWܟΗ}ΨϊμΨ'ΈίƒξΣPβCtrζ+�ͺB\½l‘};9τΫo¦²δ3Ξ{Τήj—Ίoυš΅¦π�ιjœ‹ΫVONΘηkΘ �ΈQηξ ZQpΘ ODίƒ½<ώdY°h±΅ιΟgα­Χ{Λύχήc]―ν"Ίχμ%?͝gmλsV-]ΰTPάΏ�€4nή�~4― € € € € €$Ή@Ηϋ:IΎό¬ηz«Φ­ί@ͺT½Ν:ΆoΟ™ρ€υ�ΓϞ=#_ ΎR  ^7H’“&4A@π Xθλˆ­L™2Ι£]»9U -œ/"ΌšK₯*UE[*λ’Υ G˜ t τβκ³.^Όθ<��PθμΈΌ’-m§N›am½σζkrο=ν½§ΔΈΨ`‘†ψ4Μη^.]Ί$ϊ_tγυ7XθΎΏwύΨ±γRγφΘY£†υeθgW~’NΟ=gBwϊ“uϊΉρ.ξ`‘·‚ž{φμ9Ιpm§z }ύλo½+γΏ‹όG΄;όf υΌ±#‡IΝ‘�θΦmm+ά€y+]•©?|kZδ–ΆΦυ­Κ¨3gŽlνμ0+ξ`αM7ζ‘ωsfFϋ|χΊ;X¨ϋΝ›%ωσεsNωϋŸδΐƒR°`ΙqΓ Ξ~}ί΅κ6τ©Ίηt­xΫ+λ!­Ζ§ο΅p‘BRΘά7ΊE[fkλμΈ–Δ|Ύ Θ/³gL‘Œ3:QgύιKϋ'0ν^'> χ΄Ώ[΄…΅½\ΈpQ~ΩΆ]ΒΓΟIΩ2₯%{φμφ!ωaςTyΉχλΞ6+ € € € € €$΅€»s—~_gώܟdλ–Ÿ₯lΉ �ΈiS§ ΟΨΡ#δΨ_9Γ+T¨ˆιΥ^™ο,^΄ΐtœ:fΣ–ΘΝ[άεν8x`Ώ)r₯›“sƒ X!X“ΐ@@΄(@°0ifέ�Jh?-Ί–Θφ±„ΎΊ�!₯Χ�Z±\V�X–ΠΫψuΎ7XΫM΄*Ϊθ―Ύφ hie΄s~tΪμz―Χφ¬ξv­‰ κύ£ —ΩΟΥΚl… ²7ύͺX¨a0w8ΜΉ™YΡπΦ�^{Γ Vκ±ΙΖKΉΛ-‹έηF·ξκρ/‡ ς©έ5sζΝ—§z<ηŠ)X¨sρ㔉>Ug̜%ΟφzYšίΡD~�ΟΉ‡{E†ξΰ›;X¨ηι΅ο›κ“Ω²fu_f­―Y·^ ζΟ/yσήdm{sZνρΣώ}£½ΦΎ™†Y΅κδ€)WZCΫΗΌ―Zaqς„o$[ΆlήC>ΫΡΝ‘»"€ΟɞΔ|Ύ~θyΡTψŒ.δj?ζ?ΛƒΗ‹-&­οΎ�AΙ*8aΎg•αr[e=Yχ}ύΥhωλθQŸkƒeƒ`a°Μγ@@�˜ΑΒ€›πΞu‘άΉo΄.Σ§L–C$j*lΩ¦­„d ±ξsτθŸ2nΜθDέ3!ϊΉΤ«['ΪK4œuώΒ9|ψOΩmΚΞk‹γ-[‰rnωreEΫ—,Qά9¦νv5·mϋ―ςΖ«�³φ‡‡‡KωΚ՝sΦ¬Xμ΄ϊεpωxΐ 똢ήΥΌΊhθ­V½Ζζ§ΟŽ[Ϋφ/}π�4nXίͺΚ¦G 0nά΄Yz½ΤΫT›μά·_�Oε‹α#νΛb|έ΅m³slψΘ1rκτ)iΧ¦΅*TΠΪ―γΨ»wŸΌωΞϋ²z­o΅J τ½iήγM[?Mggυκ΅ςνχeΨΠΘ²ϋΊΏι­£Κ΄m·ΗώOn4Υ―Ήζgϊž‡-:χ²lΡ\ΉρrΛlm=ύΏW―T­»½v-λyξ  V-Ԋ~κΪλΩgD«=8N˜@IDATκXtΩoZ{6ψ iΧΆSνpΦμ9�γΉ܏ τuhίΦͺ„—ΣΌί]a»eύ† ςυψοeαά™Rΐ„ uρ uŸ>―ΟϋοHΥΚ•|ͺ8κV¬Z-C†‹bͺΧΕ΄heΐηzv7Η¦>H=�τ™3²xΙRιcZU(P@>Ψί§2bσ–m%lχž˜nνμOΜη«b…ςζ3�Š”*YΒ'`xκΤ)σ{bΌσ^Ÿ+3&τ³ ‘]mέξξ6r}h¨3~]ΡΚ™Z©p™_οοŸΩ@@@@@@ Z΅Ύ[nΎε§B‘>ZƒΏnί&?Νϊ1ΚH΄2aϋŽM¦,>ίG±OΤοι̝=KφοΫkο ΊW‚…A7% @H “nž½-‘υΙ‹˜ΆΘ|ƒfρQ₯Κ¦ύqΓΘφΗzMRΆ@ŽοržμJ/&�ύ·μΨΉ+!—ϊ}�†Μ.\0αΗDVcσ ?μΧί“Ύ§BσΛ¦Ν[β5F ΰi+ZΖ£!±’&Œvm† ²Λ„ίΣχ”5Kfs�Ώc ΈΩoVCrΪVW—‹�•ο&ό`²^υ^+Οs~ξΦΜ>'^ήP³#ζ'―ΖgDΓ¬zOmώλŽ~ΉG7N{_b?_:> ₯ž>}:Acση³ N Sj΅Δί~ϋΝjmΏ^@@@@@6’ŊIΑ‚…eίή½&wQ€τι�Λ-Ε‹KΞ\Ή$sHf9vμ˜)rΠΌg•B·7ΑB·λ € €I&@°0Ι¨­ε6•β:άsΏd Ιδ<ψ ©ϊΆjεςxW/Τ*…υ4½—½h¨pΒχίΘΡ#΄+΅M’ς5¦`aRŽ!ŸΥ·Ο»�¦UKghS§Ν‘ΓFˆΆσmή¬©<Πι^)S:2x¨'i Σ[aΡΉ˜@@@@@@ ,Lƒ“Ξ[F@‚A€`a�Ο‚V.μpο}N[d{'Oœ°°²;,ΜTP wB‚ ΜdZίb~ςͺX±r§e©Ά?žπνx«κš}/^“V€`aτήΪZyΔ—ƒ£m-ΰ½βχί�;[έgDοul#€ € € € € €©Y€`ajž]ή € Δ “orjΦͺ#ΪΞΨ]½0!£Ρ*…ΪFyεŠe ΉŒs @°0fΤ.v’—z=g΅Ψι¬Jχg_mΫ·Ηt ϋ@@@@@@4)@°0MN;o@H~‚…Ι;Z½°žik¬•γ0Τ@‘V6\Όp>U “wϊœ§W­RY2‡„XΫΏl�UŽ?ξcEδ¦σΘCt6mKIž<Ή%<<\.^όΧ΄DώC–._!~˜  € € € € € €@4 £Aa € €@ΰή8ΎOΠpaQΣξ8Τ΄:֐aξά7Z—j«c =rDƒŒ@H‘ SθΔ1l@@@@@@Hυ Sύσ@@ΰ XœσΒ¨@@@@@@@‚…|@@’E€`a²°σP@@@@@@@ N‚…qq € €@ B•{"€ € € € € € €‰ X˜xCξ€ € ΰ‡ΑB?ΠΈ@@@@@@H‚…I€Μ#@@’ ,ŒjΒ@@@@@@@ Γ,0@@ ,Lƒ“Ξ[F@@@@@@!@°0ELƒD@RŸΑΒΤ7§Ό#@@@@@@H SΗ<ς.@@'@°0ΕMF@@@@@@4"@°0L4o@6‚…Α6#Œ@@@@@@ˆ XΘ'@@ Y& ;E@@@@@@β X'' € €B€`a TΉ' € € € € € € x‚…‰7δ € €~,τK@@@@@@@$ X˜Θ<@@ ͺΑΒ¨&μA@@@@@@‚A€`a0Μc@@� ΑΒ48ιΌe@@@@@@H SΔ41H@@ υ ,L}sΚ;B@@@@@@Τ!@°0uΜ#ο@Hq Sά”1`@@@@@@H# ΣΘDσ6@@` Xl3Βx@@@@@@@H‚…|@@’E€`a²°σP@@@@@@@ N‚…qq € €@ B•{"€ € € € € € €‰ X˜xCξ€ € ΰ‡ΑB?ΠΈ@@@@@@H‚…I€Μ#@@’ ,ŒjΒ@@@@@@@ Γ,0@@ ,Lƒ“Ξ[F@@@@@@!@°0ELƒD@RŸΑΒΤ7§Ό#@@@@@@H SΗ<ς.@@'@°0ΕMF@@@@@@4"@°0L4o@6‚…Α6#Œ@@@@@@ˆ XΘ'@@ Y& ;E@@@@@@β X'' € €B€`a TΉ' € € € € € € x‚…‰7δ € €~,τ-@—άR¬Έ3�eΏ.TBBB$wž<Φ“Ž9"αααrκδ Ϋ%»Ν, € € € € € € ϊ¦ώ9ζ"€ €A)@°0y§%44TjΤ¬-E‹—L!ρLxDΈμΩ΅K-œ/ρΊ†“@@@@@@@ ε ,Lysƈ@@T!@°0ω¦±F­ΪR©JΥx ½#Υ€αΖυλdՊεήCl#€ € € € € € €@* X˜ &‘·€ €€D‚…I?k™2e’οwZΫ#8qβ€μ Ϋi΅;Ž0‘Am¬‹ΆDΞdͺj›δ’ΕJHhθuφ%Φ«ž7α»o¨^θ£Β € € € € € €)_€`aʟCή € "&ν΄iH°}Ηϋ|ͺ:x@VšͺƒϊŸ₯@ΑBRΣT;ΤW{Ρκ…Ώο„νύΌ"€ € € € € € €@Κ X˜rηŽ‘#€ €)Z€`a�MŸV*|δ±'|B…‹Ξ·Ϊϋ3 m£\ΏA#ηR Žόr(• V@@@@@@HΩ Sφό1z@@ Ε ,Lš©σΆ?ŽiS'Ε»JaL£Τͺ…­Zί-™B2Y§h[δqcGΕt:ϋ@@@@@@@  ,LA“ΕP@@Τ$@°0if³f­:RΓ΄/Ά— ¦mq|[ΫΧΔτͺαΒ¦½²½¬2m•W�XfoςŠ € € € € € €)T€`a 8† €€t‚…ŸΑΠΠPΉ�Α.N δΔ΄?Ži΄ξΆΘIΩΉuΛRͺdΙh‡υί�Ι‘£Gdχξ½²aγ&9sφl΄η±@@@@@@ψ”,UZjΥ©+Ω²g— ιΣΛΕ‹ετΙ“²xΡBΩ³',>·Hqη,LqSΖ€@@Τ!@°0πσشٝRΆ\yλAZ₯P«ϊ»ΤkΠP*W©&ΡU%Τͺ…Z½P—_Άn‘9³gϊϋ˜x_χυ˜r[΅ͺqžόψq0h°Œ�nBœη&χ />�¬dΛ–ΥΖ€)SeΣζ-Ι:€›nΜ#O>ρ˜5 k~ΤοBšΙ:#<@@@@@’C \ω[₯qΣfrΝ5ΧDyό₯K—d֌i²sηŽ(ΗRϊ‚…)}? € B~βΊuΖ©V˜˜Θw˜€b™ΛEυ'ύ>τΌ»%²V-2θSŸγΨˆo°Π~φϋ}ϊΚ¨±γμΝ {Υί�…sqυλ�©|1|€³+;΄“wίzέyτέχά/[Άώβl³‚ € € € € €€v¬Y³IΧ'žtB…‡-θQΈHΙ›/Ώυφ5\8xΠΉpαBͺβ X˜ͺ¦“7ƒ €€‚…«bΕJHΛ6m­‡œ8qRFβΧ½‘λΧ‰ΆTφ.tν&‘‘ΧY»§O™,aa;½§\Υmo°πϋ‰“¬ϋ§7₯η«T�(E φyήΉsη€ι­δπŸG|φΛΑΒ`™ Ɓ € € € € €\hή’₯”*]ΖΪ±oί^™<ρ{η`—G»Κ 7δ°Ά7mX/ ΜsŽ₯†‚…©ay € €@  XΨIs·AŽ) ΧΌ‘ΒΨΪΧoΠH*U‰lMμοσβϋΈ;XxκΤ)©\½Žϋ°”,Q\†~ώ©Θω“bz°ΧK―ΘΤι?Zη΅mέRrζŒό‡ή–-ΏΘκ΅λ|�/SΊ΄Τͺy›΅οθ_Ηdκ΄ΞρνΪ:!ʟζΜ“γΗ�–¦MIυΫͺIφμΩdίώ²pΡY·~ƒsMl+­[ΆΌyσΚσ=»;§-\ΌDf͞#—L bχ³ν*Wͺ(U+W’Ε‹I–,YdΟΎ}²cΗN™ώγ,ϋ”(―9rδφm[K‘B%wξ\rκΤi9|ψ°,0cέ°q“sΎžWοφΪR―niΡΌ™³�Λ£L`t·όύχ?²hΙRgΏ�Τ―{»ΥšΊ@ώ|rν΅ΧʟGŽΚξ={δ«―ύoΏνσ6@@@@@@dx�tΛ”)Dώ3ί³ω|ΰ'NUΒΠΠPιςθc’.]:kTgϞ•/Š2B=ή QΙgΎg•%sλxΔω9~μ˜lX·V:εš`ΩA°0Xf‚q € €iL€`a`'ΌCΗϋD[λβOδ„„ υξvΘZώ]ŸΘ%�`‘>ϋΎŽδν7^u†‘ΑΈΎ°ΆW/_$9nΈΑZŸmέ{>+½_~QΊ<ΨΙΩWΌLg}ΧΆΝΞϊΨqίH+ ΌήόγΡ½θ?.GωJ>ψθcχξ(λ δ—sfFΩοήqW›φ²cη.gWΏ>οIλVw9Ϋξ•°έ{δω_‘mΫ·»wΛ�=ςτxͺ›dΜΩgΏ½±tω Ρͺ“ΊtΊοyσ΅ήφ‘(―�œ8!ΥjΦ΅φk₯Ε‘Ÿ”²eJG9Owhθ³χλoΙ¬ŸζF{œ € € € € € €@° dΘp­ω�sΦπΌΑΑ‡ι*Z¬Α½|�οCχ¦UX’ύ½$ƒιΈΣ2δ³O%<<<¦ΓΙΊŸ`a²ςσp@@ ν , μάw~πaɝ'υqcGΙΡ#ρoœΠP‘>DŸ₯ΟΤEŸ₯Ο δŸ`aχ'ŸOG†εt,£Η~-ουωΘΦΥ Ζυ;?τh”jˆξk,όξλ1’Υ c[Ξ=' šήi*)·Nk~Gω΄_Ήζškb»ΜͺŒΨλεή Κ6IŠ»%ΦϋFDDΘ]m:˜JŽϋc=ƒ € € € € € €@0 ά”7ŸάΧιkH‡�ψ]Ζύ•΅^©rU©ί°‘΅~αΒ«›“n :XNŸ>eνΧ_²»ΥyJΧ#"ΒεΔ?�ΘΩsgM¬PΣBω«ΪαC>“³gΞθ)A·, Ί)a@ € €@Ϊ XΨy~ΆΧKΞΌ?εˆfşP‘}Ÿi_ŸΧψ gMŸ,Εn)κάφύ>}eΤΨqΦφΥ κO‘ύ4wΎhH°RΕ >>mc¬a½Ψ–·^ο-Ήr唦#�ͺηj…ΒM›–K—.Ι‡}ϋΛS>_[&χϋπ}ηV™ΝZQ—&JΕ ·:ΗάΟՊ‚ΤsŽ�n‚h…ΒωςIχ§ž0�xΝnΣgT¬ZS΄ τύχv0―₯€|Ή²ΞuK–.—?LλδΏLiώ?—κΥͺΚΈ1#œγ”α£ΖˆV4lές.ŸgΙθ±_ϋœr΅‚…ΪVψυ·ήυΉχ7cGI΅ͺ‘―V°0G޲zΩBŸηΔ΅ρdgeξΌ¦­ρ=’ν–£[Ο?/«Χ�“ ?L–Y³ηψœW°POž�ӏR¨`Ÿλμί�CΖ›@§V2dA@@@@@Rš@₯ΚU₯~ΓΘΞOϋφμ‘›ς擐Μ!rζΜiωrΘηΦΫιΠρ~σ}²‚ΦϊΜΣdǯ۝·ΩΆ})R$²š‘½σί�•S§NΙ²% eΧΝφξ |%X”ΣΒ @@Τ/@°0°sܴٝRΆ\yλ!Χ―“E ηGϋΐ«*ΤΧoΠH*U©ησ’„;½ΑŸζΞ³ξR°@~ŸvΑZ5οφM’<αj ‡#φλοs�1#Ύ”Z5«[ϋ�V°°d‰β2cΚDŸηΔ΅Ρλεή2uΪ λ΄Ow“Η�οɘ1cŒ—Mœ4EώχκΞρψ ‹έRTϊχν#₯K•t�σ�;v\:wyTΒvορb@@@@@ZΒEnv*j 0}ϊτ’ΥΏωjŒ9ς§5ξNt‘<7Fv;z„ϋλ/Ÿχ£αΔ΅jKHHˆΟ~έ8uς€Œ9\.^ΌεX0μ X ³ΐ@@4(@°0°“^¬X iΩ¦­υ“'NȈaC£<ΠΤƒΏlέ"sfόr^|v<Ϊυ Ή.4Τ:uϊ”Ι؟°r υ§Ί*W―γ sΩ’Ήrcž<Ξφϋ}ϊΚ¨±γœm]q ΅π}<μs|ψΠΟ₯^έ+χ,^¦‚s|ΧΆΝΞzR ΅΅²ΆXΆ—ί~�]>ωτ3{3ΪΧyσΚ™³gczV-[HΝκ·Ι­·–“όως9Ημ•Φνξ•mΫ#’.>ΑBϋΊΚ•*JΣΖ ₯RΕ &ΨY*Κ?ŽšɏuλnŸΞ+ € € € € € τY²f•Η»=ν3ΞΏn“™3¦;ϋλφ”d͚ΝΪώ€ί‡Ξ~οJΜΉ₯|…[₯dΙ�’χ΅—έa»dΪ”IφfP½, ͺι`0 € €@Ϊ XψΉ~ςιž’)$“υ θΪ!?Ϋλ%g‰ ΊΫ G„GΘΰΟ8χ ΤJlΑΒΞχί+oΌϊ?ηΡǏ—κu8ΫΊ²bΙ|ɝ+—΅οό… RΆBd΅Eϋ€­ΧH¦L‘vΊ/©ƒ…#F‘>}}+!j+dm‰¬Λι3g€R΅ZΦΊϋ—›nΜ#Χ^{­΅λΰ‘ί¬W Ϊ‹;hX¦tiy½χKR₯r%ϋ°ΌςΪ›V[dέα v}βiY΄d©s��ΔtoƒΧ^yI�₯Kg―ciΨτNŸkΩ@@@@@@‚] Η³½¬J…:Έˆp<θSgΘϊ}=~Ν5ΧXU πύގs’g₯rΥjR―~Ck―ΠώΕ`ΟΑ±I°08ζQ € €iN€`aΰ§άέωΰ2ρϋρ>­Y«ŽUz=ΆVΙ>Δ°ΡωΑ‡%χε ‰ (ΖpϋhwΗ,Τ Μ™)ΪΩ^†~9\>0Θή”‰ίŽ“ ·FΆŠΦΪψ‹a#eίώύςΑ»oIϋ»Ϋ8ηκJR ΅…ςCtmεl/ή*Š_ )ύϊ_ωΗλψ―FY΅ Ώ.¦Œ— k–;ΏŸ·l•v;Ω·”>ο½-νΪΆvΆυΏ³~škmwhΧVήηΝ�gο> £¨ή>Ž? H (EŠŠ�AΊτ*Mz•""E@Eμ 6_P”Jιι½ "="U‘ζŸN€ψΞsΧf7•„$»›οœCvζN»σΉΞIςΫη:ϋ.Zl¦JΆΓ‰τzGZ4kbφkΩ�n/χ{Jj @n\³άό ­:tXͺΤ¬γ\‹@@@@@@ š6o)Y|ΘtΥ·ZaΉ ₯h±βfίΑd挩Ρz$­pΨ‘Sσw”K—.ʈ‘‘ΟR­‹ΖΑA γ•K"€ €D-@°0j£Ψ‘χΪwθμT-\Ήb™hˆπv.…‹RY­V8κλaΦ§΅Boη-Β½VTΑΒΟΤ•Ο>ωΘ9χ�₯ΛRΡͺ˜§Υ uωθύχ€Y“FΞώ¨Vβ:X¨χίΉνGΉλ�»ΌΊ’ΑΒΖΝZš€aξ\9eξΜ©’4iRη­xξά9ΙωpI™2₯ΣΎύ—�¨Y+³½rιB―i�:qBφν‘Μ™2I.λšϊ):]�_Ώ.E­)₯νΰ`‰'‹ΙΔq£Μ>ϋΛΥ«Χdη�έ�Έy+i�¨τω°·½Kμ}W�\–'Ο+iΣ¦uφMŸ9[ή|§—³Ν  € € € € € ξ™»nάΈ!Λ–ό ΏξψEžΘWPͺT«ζw?v”œ>uΚy€lΩrH½†δ¨UΤbΥΚεΦί¨N›}:%rΝZ΅’G²Šƒ|ηœηO+ ύi4θ  € ˆΖΟ`ΫU ν»…7%²½οV_έ?HιΉΧ―“ λΧήκebt|TΑB½θΒΉ3EΓxφςύ΄ςN―Μ¦VΤ[ΎxΎΧTΎφqϊͺα:χ4Ώρ,2π ©VΕ�tχ₯φ3dοΎύ¦©[—N�΅KGη‡Tχqφϊ©S§εΩvΟKΘoLSΝκUε‹~}½‰φ±ξΧOϊφ“1γ'Ί›Δ7”¨;�wφ¬SέκτΗSΏ›l¦ΰ΅―Ε+ € € € € € €ΎΑΒΐCž@H‚… 7l₯J—ΞΨ]½πVz£U uε λΧήΚi‹ € € € € € €"@°0@Šn"€ €Α&@°0aGT«–·¦5ΦJ„Ρ j P+�Z±Œ*… ;|ά@@@@@@8 X§Ό\@@ "‚…ΙΔ»† sZΣ§·¦:֐a† ™L'tͺc ž#€ € € € € € €@b X˜F™gD@όP€`‘ ]B@@@@@@,‚…Ό @@D€`a‚°sS@@@@@@@ J‚…Qq € €@\,Œ U�‰ € € € € € €Δ^€`aμ Ή € €@ ƍS@@@@@@@x XΘά@@ ¬ΑΒ°&΄ € € € € € € €ώ @°ΠF> € €‰P€`a"t@@@@@@B€`a@ D@‚O€`aπ)O„ € € € € € €Α!@°08Ζ‘§@@N€`aΐ F@@@@@@D"@°0‘ 4‰ €ψ›ΑBϊƒ € € € € € €xςN@@H‚… ΒΞM@@@@@@@(FIΔ € €q!@°0.TΉ& € € € € € € {‚…±7δ  € €1 X4NA@@@@@@βA€`a< s @@° ΓšΠ‚ € € € € € €ψƒΑBϊ€ €$B‚…‰pΠyd@@@@@@‚…1Lt@>‚…Α7¦< € € € € € €‡ΑΒΰGž@8‚…7dt@@@@@@‰ΑΒD2Π<& € ΰo ύmDθ € € € € € € ΰ XΘ;@@ A&{Έ7Ν•;δΆώ₯M—^R€H!2f4ǝΤο^ ϊݐΠ!@@ q,ŒΫqnά΄ΉθΕΊΔdδ[ κ=άΣ!kωw½g\.1 V―ZEυΉΣ΅ƒ‡IΧ.ϊμ—.]–·ί{_ζ/\dš~ώq½(΄qΏφ0PF|=Κ4i`ξ‹~}₯PΑξCœu Ν½ώΦ»²γםN›oΏfΞ+υλέ¬†xΕ λε/RΒ―AΎO?ώΐݜ ΈVΞόύ·©Π8{ΞR―nν0νΪ ύzυυ·eΧξέαξ―±fυͺ�ϋέ·εΎϋ<ŸΖσ=fΥκ΅ςRΧΒŸ�ΌΤ΅‹€H‘ΒχΉv회ΆŸύ>��μΣηέΌa΅ά•Μ,”΄iΣzνΣιήz··τω°·$MšΤμΣ{ι=έΛνKχ΅YG@@@@@±~OŸLΊ½μω{ƒop°ΝsD Έ—ύ?soJζΜ™₯Q³–’4I―vχΖ°Α_‰ώΘ‚…ώ8*τ @H γv[΅n'2f47™8~ŒœqΞ;uκ΄™ZτήξκŠZι°η›7οαœδ³²|ρΡj€φ²?$DV―Y'9s>,₯K–°¦HnΊΚΚΥkΜρ ηΞτΪ§j§S?W«βω!\OΤηoΦͺ­ΩW§VMS�ΎΰΠα_Λ€ƒνMq/X?|~²΄ΩχΙG½₯qΓΞq œ·`‘Ήv›g[y‡=Φz°ϋzφΙjΆkχ3ώγ&L’ε+WΙ²EσΜτΗzŒφWίό.?ώ˜hπ�~―Έƒ‘zμ€ρ£₯x±’Ίj t.±ͺ,ή°�aO»mοΣWw°0.Ζ�}/Φ@@@@@@ΐ#πDΎ‚R­F ³qπΰ™9mͺυ»�d�Ήkwσ7€3gNK¨Um0sΟίKfϘnύ Δ―³6uξϊ’YΧPαΠA_y.ϊίΧ$w&±fh*/λV­’λ7�{νσ— ‚…ώ2τ@Hd γvΐcς‹M¨PŸ&&χŒ©‚o°0²λ|τΙg2~β·ζߟ�ΚW�ξLƒΫλ7εٖ͝ΛιτΖ:Ν±½,]8Χ οωVβΣκx?m^ηT‘Σ°X½†Mͺ„ZΌ)’ιΏJ’z͚uκ›)ˆ}ϋuωςeΖsWΤγΜ™.yrηΦU³t₯§,όa‰½)σgO—Gςxφ_Ώ~]Š–(kžΝ·ΚaνgΙή}ϋσΦ�\βτK«εε-p3τζδZ©Y£š όβf˜sϋ_…‘λ@IDAT/;¬Rώ­œ#jΥ¬aM?|³ά�€ΙSδύ>±¦M~KZ΅ΈYpڌYfΪ_ϋΔξ];K·.μMYΊl…tξζ©ψ³e›&M³οם»€~cΟ8©λΖ5ΛεŽ;ξ0ϋμJ‡:[6�qΒ} ,U�’sm ‘.Y8ΗΩήΆύiάάσ©Cί`α"+@ΪνεWcν•χή~ΓNu[Γ‘ΏύΞή%ƒΎό\jT»9es՚uΝ{AØΚ΄k½―=Ί�;«ΊdΖ μCΌ‚…·{,›°‚ € € € € €^eΚ•—βΕKšΆ={vΙΒys₯Q“f’5[vΉqγ†ŒώfΈT©RCrδΜiŽY½r…lέ²Ω¬ίw_iέΞ3ƒ“Ξ5nτΧ^Χ„ ‚…0Jτ@B‚…q;¨­Ϊ΄• 2™›Dg*δΨ† ½¦B>ω—L76Nπv }«σ+ZΔLQkw^«j%;{‰,XX¨`~™:y’}¨Lž2Uz}π±³­+:°NΫk/φ”½ΎΑBί@£}όŽŸ6‰~ΒMί0ŸΆιΙΥ«zͺώ]΄*χε™’zϋ–V©ύ”zˆh­sWοι{{X δΟgφλ;η4ψ¬tΡ Ύx3hW$tφόsm$mš΄¦I«Fξψu§Œ5BΚ”ςό~υκ5)[±j˜i—7­[)χZε�u ων€ _κΊV\Τj}Ίθλ₯ΚU6ηϊVq΄ϋβ;όΣ)Œέˈ‘κ‰ξΰ‘;X¨^Šzϊμ>7Όu 3f°iΣ¦‘šΥ«I‡φmΓtͺe­˜X‘άSςυπ›Υ5ŒψΑǟ:ΗιJ»6ΟΚΫoτtΪά oχX:7a@@@@@ΌΚU¬$E‹>iΪvοόUvοή% 51Ϋ[·ώ(«W,—ΊΟ4\Ήσ˜ΆυkΧΘ¦λkΌόκλ¦0‚Ξztΰ·ΩΌqƒ?ώ§³ίίWϊϋΡ?@@ HΖνΐ6nΪ\Κκ™wκ”ΙrτΘαoΫP‘^Xο₯χΤEο₯χŒΛΕ7Xθ�Ϊη{ί±γ'šjrΪξΰλήγ5YΈh±Χ)»Άo•dΙ’šΆ[ 6nX_>ωθ}ηZ:°έK‘Β…dŠUΞ^μΐ˜oΏΊtŚwΉ}˜yΥi”Χ¬ΈYpΒ€ΙςaŸΎ^Η„·‘ύ6­]ή�ΫΒ»Ώϋΰώ}ϋH½Ί΅¦<tΦ#[qOŸ|πΠ!`τ=~Όυ‰½R%‹›fχΒεž*#£F u·χ‡2eκtΡp N¬ΛikΪθ’OU4λ ž©+Ÿ}ς‘Yξϋ9άΑΒέ{φJέž_„wχ&ΘΓ9rHϊτιΒ;Δ΄ΩΑΒΆ­[Κ;oΎξή{P§…ž7kšsŒύ>‰‹±tnΒ  € € € € €x .RL*Tςt8xΰ€<9‹€H™B.^Ό #‡ 1Η6nΪΒϊ;YV³Ύ`ήΩ»g·sϊKŽžj†v£Ξ8uώόyY»z…μί·ΟnφΛW‚…~9,t @~‚…q;ΖΥj<-OδΛonςσΦ-²rΕ²pox;B…zα +Kα’Ε’Ό_ΈˆA£;X¨?|±¦όΞβΰkί±‹¬^³ΞλTwUΐ[ ϊV™ /œηc…?ιΫ/Lΰ1Ό~ωžQUC―‡±6|Οσέήvx‘HχqΓ%•+U0MZ=πΡ|…έ»#\ίΌ~•άsχέfΏVοΣ°ο2|Θ@©\ΡΤ}vΨOΧΧ―^&ξΏ_WeΩς•�©λK²mΛΡJΊ|ϋέχ�ϋΓ>fύΉΆ­ε­ΧΓN_lvFπ₯Dي¦ ’;XΈmϋkͺβ›Σ<»OυξΨ½ΟwέΎΠΎΌφκ͊‘ϊ ϊ,ξΕwšf;XcιΎ/λ € € € € € pS {އ …L’$‰hυΑo'Œ“'ώ2Ά|Ά­dΜδ™ElόΨQrϊΤ©›°Φ4œX²tgF*χΞσηΞΙΨΡίΘ΅kWέΝ~³N°Πo†‚Ž € €‰K€`a܎wξ܏Hgκ››œ;{VF}=<Μ έa@έΉσΧ²xΡ‚0ΗE§‘}‡N’.}zsθάY3%$$n?aεΑBίΠ’No«ΣάΊίip5T¨αBίsΓ κuφοΪξ\Ξwgg‡ΟІξ4|g/ΗώψC|5Ψή χuι²rρ�₯pχicοwί’V-n†Ÿ²¦4>ώΧ‰·wΈ{'Nž”2ε«Ψ»œΧιS&9Σ2Ÿ9sF4μg/οΏχΆ΄lήΤl^ΈpA^}ύmS±Πή―@ κR³zU8 Ώ½KV¬Z-σ,rΆ}Wώωη±+_ΊϋQ°P§tΦ©ν埫WεgkΊεΝ[ΆZαΔΏ₯ψ“ΕLμύv°°fj2π‹~v³τ�β+ρΝhg[WͺW­"ƒΏϊάi³ƒ…q1–ΞMXA@@@@@/T©SKΗΞ]½ΪφξΩ% ζΝuΪ^θό’€NΖlθ�™Σξ»rί}$Αςθ£yE―k/Ώ…μ—9³fΨ›~υJ°Π―†ƒΞ € €‰G€`a܏u—�/KςΙ͍›ω•žo8ˆM¨Π= rθ•P:ψKηΊq΅βΑBί*s[ϊYš΅jλE0 _©ύtM§ΝF7XΈaυrΉ�ώϋΜωgϞ“b₯žr�₯+:ΝnΣƍL›~r�i‹Φ& ¨S!λ4ΊΊ\ΈxQ ?YΪ¬»ΏθTΛΙ’%3MGŽsο ³ήΊU yον›ο;ψf¨Έq£GZ?H{~0ž7‘ >R|+ό΅mίQΦmΨhŸ&jΈhήLσ‰?mάΆύ«Zΰ³Ξώόωžίλlοέ·ίTdΤ†ΓGŽJεꡜ}Ήsε”…sg:Ϋ›6�(­Ϊ>οlΫ+YzΠ¬^ΌtΩT+ԍθ ;vh/=_ιn_Fϊτύ?;~’³­Υ΅j’½ΨΑBίͺƒτ¬Pεζ{BŸ:y‚²~Ή`/nίΫ=–φ=xE@@@@@°έ_ιιόέ"4τŠ τ•sНwή)Ί�Ž;ξ0U}ω…³/²•"Ş”ς*™Ctf�oF μπΫG°0ΑθΉ1 € ΈΖύψ»§C>rψ°Lϋ~²ΧMK•.kJ―G6U²Χ l΄jέN2dΜhφΖ& ΑεΓmv 5@ηŸωžpμ?ΐXt|1 YολžͺW·!_ ςό0Ψ²yyχ­7$i�€ΊK._Ύ,₯žͺd‚Ρι—žγ;M°Vα{‘s7έ%%¬ y#‡ –T©Ršmw€π›αC€|Ή›ΣEk…<­”g/“'Œ‘Β… :?ΫSΫϋ}_Ο›WfM›l~PΦ}Zέ°GΟ7eωΚUfZβz½#υκΦvN8x˜h8�]λVςφ›―9ν‡–η;u•ƒ‡™ΰγ¨C$ߏ;ϋnj› Ÿ|v³κ ξXΊp�dϞΝ9Ζ^ ojθMλVΚ½χάcΡχI§_’•«Χ˜m ~;a¬h RνK•šuΜzt‚…έΊt’ξ];›γυΛΠα_Λ€žJυκΤ’?θε5­,Τc—-š'Ω²eΥU³θ΄Π£ΗM4λMΦ7Υ�Ϋe^άΑΒΫ=–ξϋ°Ž € € € € €ήM›·”,>d}«–«PQŠ+nφ©SΏ±i‰N€/6ΑΒF ž‘O?ώΐuwb7I’$NhΟήι‹E§_zžVτ[0g†UYΠNΤ6‚χΪΥkN PΫt™·`‘Όb…ύtΡκ}sgNuBΪ¦U ϝ;'9Ξ!)Szˆھύ—�¨Y+]tρ­Ύ¨Ÿ;w^�€I-ϊ ={ΉvνšΤ¬Σΐ„΅mΙΒ9ζ9μύ7nάύ§‹ΊΤυ3�-•ͺ>fJζ/u“ΞΓV¬Z³�s=_�Y§mΆ—�ύW΄Κa’$wΚΓ9rxέoԘq�·Ÿη“„Ρ V�TA†ΎΞΤ{hXTŸ]Ώχ|w°°~½:ςŸ~μ{H„ΫξχJ\Œe„7f € € € € €‰\ΐ=s—ώ=cΩ’δΧΏΘω J•j՜Ώ‰Œ;JNŸ:εheΛ–Cκ5l$G­β «V.·Š`œ6ϋtJ䚡j;E;Ž>dωΞ9ϟVϊΣhΠ@@  ,ŒŸΑΆ«Ϊw oJd{ί­ΎΊ�s7�_'Φ―½ΥΛΔθψ[ ψύ T―UΟά':ΎΨ υ&ΎΣύ†χ€[Άώ$͟mημŠNΏμƒ;½πΌΌά­K˜ ’½__>"u4ρ εi…½�]::?ຏ·ΧO:-ΟΆ{^B~;`7EψͺS+O™4Φ+$ήΑΎSkeΕ!HϊτιΒ;ά΄i@οwzΙΒE‹Γγ;ε΄ �4Έή2ʚ> άSeΒΫε΄ι”Λ:-³V^Τ%:ΑB=nζΤΙ^΅-’Ε,ΤctενΫ…;³ζΜ•gκzͺ'κ±ξ`‘nίξ±Τk² € € € € € €@ψυ5–9r†ΏΣjέ·gΜŸ7ΫkΜΉ₯^ƒ†N›)΄`@Hj£°m›dΝ�tκδI»Ι―^ ϊΥpΠ@@ ρ,ŒΏ±nΥ¦­dȐΙάπJθ™;k¦=r8VΠPagκKŠδ)ΜuNžόK&Ž«kήΚΙΎΣΑFvξ֟~–f­ΪšCŠ.d…αΖ9‡kΈOC~ξεΗ «εξτιMΣ„I“εΓ>}έS'OB ˜ν%K—K—ξ―8ϋά+ ž©+έ^μ$fΙβL¬ϋOX?Ž?IFŽγ>\’Σ/χ Ŋ1•ψ΄z»ΚŸVGœ:}–τϋ|€’sŸW²DqιυΞV•Β‡½‚‰Zerή‚E2ĚΊY+ήΚ’λΤz:LPpHˆ|ώε YΆ|e˜Λi(ρ“{KιR%Όͺ%j?4δχnοΒTt_Δ7ΠΧοσ/ØΊoΫΊ₯<�\[Ιτί”έφΎΣ§ΟΘ”©Σ)Œνφ±£FH™R%ΝζΖM›­°e{—Χ«>ΗϋΦσW―VΕ΅"’†7mϊQΎϋ~š|=ά3uΆW{Ί^˜g�{T­RYς>φˆU…2™μψu§θύ~ήΆ]Φ¬XβάΛ7X¨;βb,²‚ € € € € €^uλ5‡sες* Αΐ=»wΙ η{«Z™°QΣ¦ΦίARyύ­Θ>πό…σ²dΡB9tπw»Ιο^ ϊݐΠ!@@ q,ŒΏqφYοΌrΉ5-ςO1›ΉpkϊγJžιυZρ9²ή/Π–Ησζ•λΧ―ΙQ+°gWΔ»Ο ΧΏηξτrψΘ‘[ ζΟχ„€K›VŽύρg˜ΐ[Lϊ§!»Gςδ–+W.ΛώύΏEϋY³>τ 5s*k νnK?"λ{jλ>yσ>&I¬ιŠ>,Η�:Ωα·΄O+)κ³GηšZ‘2c†ϋΝυυxίπeZ5ε‹~7­½?μ#ί~χ}„ύΉέcαΨ € € € € €@"Θ™;·d͚]ώώ» Œz¨$w&‘\yςΘ}χί/)S€”Σ§O[@ŽX―ώY₯Π=Ό έ¬#€ €Δ›ΑΒx£67Κ`Ujkά€…$O‘άΉρ+X΅qΓΊhW/Τ*…*V½–½h¨pκχίΚΙ·/ e_›W‚U`Ωσ%[Φ‡Μγi5ΓΎύΎYsζIκT)MυΓηΫ΅΅>Ιx―σψ΅Ÿi${χνwΆYA@@@@@βZ€`a\ s}@@p†Λ§ZΉ°q³ζΞ΄ΘφΝΝ=+!!ϋδ7kκΪPkͺd;$¨ΒδΦTΗΉ¬O^εΞύˆ€ϋoz`ϋ<ώxκw“­sBν&^@ =_ι.;΄Ζ‘"«V―•η;½­c9@@@@@Έ] o—$ΧA@Έ%‚…·Δu[.UΊ¬θtΖξκ…·r­R¨Σ(oXΏφVNγXp θίWj?]ΣΥvuΣζ₯c—ξўV:μhA@@@@@b&@°0fnœ… € K‚…±ŒειZ½°Ό5­±V"ŒnΐP…ZΩpՊeT)Œ₯?§# … ζ—¦IŽμΩ$}ϊtrνΪu9ώΌϋγO™1kŽlά΄(@@@@@@ A&;7E@ Xθ?ο 洦;NoMu¬!Γ 2™ΞιTΗ&Τ©‘9bB…ώΣkz‚ € € € € € €q%@°0�dΉ. € €@€ #εa' € € € € € € ` Œž#€ €‰[€`aβž@@@@@@όW€`‘�Ž =C@‚Z€`aP/‡ € € € € € €,@°0€�#€ €,@°0GΎ#€ € € € € € €@0 , ζΡεΩ@@? XθΗƒCΧ@@@@@@@ Q ,LΤΓΟΓ#€ € '@°0αμΉ3 € € € € € € ™ΑΒΘtΨ‡ € g γŒ– #€ € € € € € €± X+>NF@ˆ©Α˜Κq € € € € € € · γΦ—«#€ €D @°0š@@@@@@@ X˜ΐΐν@@Δ*@°0±Ž<ύ € € € € € €ώ.@°ΠίGˆώ!€ €A*@°0H–ΗB@@@@@@€ XπCΘ € €)@°00Ǎ^#€ € € € € € €@π , ώ1ζ @@Ώ Xθ—ΓB§@@@@@@@!XΘ›@@ A&;7E@@@@@@’ X% € €Δ…ΑΒΈPεš € € € € € € €@μΖސ+ € €Δ@€`a Π8@@@@@@ˆ‚…ρ€Μ-@@Β , kB  € € € € € € ΰ ύaθ € &ΒAη‘@@@@@@@ Δ0ΡI@@ ψߘςD € € € € € €  ƒcy @@ ΰܐΡa@@@@@@H$ Ι@σ˜ € €€Ώ ,τ·‘? € € € € € € €€G€`!ο@@ X˜ μά@@@@@@ˆR€`a”D€ €  γB•k"€ € € € € € €± X{C�€ € ‚…1@γ@@@@@@@ Ζ2·@@+@°0¬ - € € € € € € €€?,τ‡Q  € €@" X˜GF@@@@@@€ XΓD'@@ΰ X|cΚ!€ € € € € € €@p, Žqδ)@@€ XpCF‡@@@@@@@ ‘,L$Νc"€ €ώ&@°ΠίF„ώ € € € € € € €‚…Ό@@D€`a‚°sS@@@@@@@ J‚…Qq € €@\,Œ U�‰ € € € € € €Δ^€`aμ Ή € €@ ƍS@@@@@@@x XΘά@@ ¬ΑΒ°&΄ € € € € € € €ώ @°ΠF> € €‰P€`a"t@@@@@@B€`a@ D@‚O€`aπ)O„ € € € € € €Α!@°08Ζ‘§@@N€`aΐ F@@@@@@D"@°0‘ 4‰ €ψ›ΑBϊƒ € € € € € €xςN@@H‚… ΒΞM@@@@@@@(FIΔ € €q!@°0.TΉ& € € € € € € {‚…±7δ  € €1 X4NA@@@@@@βA€`a< s @@° ΓšΠ‚ € € € € € €ψƒΑBϊ€ €$B‚…‰pΠyd@@@@@@‚…1Lt@>‚…Α7¦< € € € € € €‡ΑΒΰGž@8‚…7dt (RΈ|ϊρ’υ‘‡δ‡%Kδ•žoΕσ6mάP’$Ibžeφœyrρ�₯=Χ™2J₯ŠΜΉW―^•©ΣgΖθ:ρq’»―Χ�]“ο§ΝˆΫr@@@@@‚J€`aP 'ƒ €ŽΑΒΐ+νi»Φ­$cƌαvOƒOΏύώ»μάΉKB~;ξ1ΤΨ΅sGI:uΈ]Ύ~ύš9zLφ‡ό&?ύΌ-άchŒZ`ΔЁR©ByηΐgΫu›6;ہΈςxήΌ2{ϊwNןλΠYΦ¬[οlίΚJ‡φmευW_qN)QΆ’œ9sΖΩφ§ίΎVͺφ΄ωρ§>ή�ΎδΞ•Sς>φ¨d~ΰη’ϊή�έ»εψ_'œΆΈZy‘};)ώd1Ι‘=›ά}χέrβδ 9tθˆL›9K–-_W·εΊ € € € € €@Ό <ϊX^)]Άœ€I›V’ZθΧΆ_8wNV­\!„Δ{βγ† γC™{ € €„†`azυeω�%rρβ…0ΟGCά μΪΎU’%Kε.Z,o½Ϋ;Ζ•Ϊ’ΌA4ΠPVš4žpΰŒY³eΫφΡ/ΊΑB}Ϛ6Eξ»ο^sQύΏ`֜y2iςΡj₯φ’S`W(_V:XΣ§ωo u 7mΩZvόΊΣ>,Ζ―½ί}KZ΅h术S/΅ͺ"¦I“FjΧͺ)Ε‹uφiΰΎπ“₯Όb¬Σ!V@@@@@[¨Y«Ž<–χqsΦΑƒΏΛΜiί;WhΫΎƒάsηwΆΫ~Ϊ*+–/uφΓ ΑΒ`Ež@@` κάΈ~]ΆnωQ6n\/Χ‚μIώψs‡νΒ«ςΥ½kgιΦ₯“ΣυγΗ�’§*UsΆν•JΚˏη•\ΉΆ*}%•~—=ϋφ‰N‘Ω�Έa}3 i搫Χ�ΙρΏώ’Ÿ·ms^½:΅$sζΜςκΛݜ˭X΅ΪwΓ έΜΆ‚AQ-Q=kυͺUd@�Ϝ™^―P±RN˜§~½:Niǎa¦JΦ RιRΕM7Nž:νΥ'}ΞτιΣ™}?,^*gΞό-ΥͺV–ş”΄iΣXΥ ˊ•«eΛ֟Μ1·ςEο[­j%yΠͺΦ–>}z9}ϊŒ=zLζΜ›/G¬Χˆ ΝU―VEΙ“[²gΛ&—―\‘C‡[ί{›Γ<[tύ΅Β¨₯K–0·ΌbU'O™ξνoεύ’αVν§.ׯߐ1γ&HŽμΩMθ«HαΒVΫ5λύvΠ ‡Νπyο½χ^iTΏž™r6C†ϋMUΊγǏΛrΛό§Ÿ·…ΫGm¬Y£š ό’Ÿ³_+vjε:χ’U‹*(yςδ²Ζ2όωηŸrΰχƒ2cζlη½c^°0΅l-χT)\¨U±υ†μί�›L³Ξ=sζŒ}Z˜Χ"… I1«Š’Ž]*k<({χξsΒ²aNψ―!6}­Tνi/ίZ5kXί“7«νΝ³‚ΊΗ�:αάZΗ­l™�¦ZIπδΙS²oˆ¬·ͺ>jˆΞw)Y’Έδ{"―iφύώΡF}Ώ6oΦΨμΏ~νΊŒ?Ρ¬?eέγώϋο“z½#)S¦4m‡¬ο'{κβUkΦyYN<ΡͺT˜ί§‘Ί†yΏ›�}ΡχNŸzI•ʝkW©YΗ¬ηΟχ„υ=\Μ9|ςwSÌΉŽU‘ΒΝ17nό+£ΗŽ7λΣΎ›( xϊ‘c]©Z-―sηϞnμμ‹λtΘ:-2  € € € € ˆ]Ί½$Ι“§03— 8ΐ©J¨ΧhΫώΉσΞ;Νc]ΊtIF ζuΕΚU%ΛƒJͺ”©ΜώΠBεΜιΣς“υwΕ£G„9Η_ϊΛHΠ@@ ‘ c°ΠΒ³gΟΙ²% ε˜a‰;¨ΒvzgwΐΕ·r–†‡ΎθΧ7Μ”’v5@τϊ[π₯AͺO>z_2eΜhκυzψΘQσƒ€γτΛ/πΪο»Qϋ™F^ΥΖ|χλvtžu@�ΎRϋιšΞιξ0Ο¦u+ͺ†‹¬p`·—_uŽΣ•wή|]ΪΆnι΄εyά&�†ύ»Ά;νγ'~+u­ δέΦΛξEm54χι�}ξnŽt}˜5%€xς=πšΤ;~’h•=ί₯fυͺ�ϋέ· €οώU«ΧΚK=^3A§[ρύΥW¬ omΛΉ ΄1&ο |ώκ¦ΙΐΑΓ€k—ŽΞ/μ›]ΊtYή~ο}™Ώp‘έd^Ÿ�t±³:σΪimhXKΗ9Ό₯oŸ₯‘HΤEί‹�³ Ί}ϊρ&|h·Ή_Οόύ·|ςY―€©o°π“ΎύδΝΧ_ σ,ηΝ—Χή|Η >�r_�¬χοΫGκΥ­¦]τϋνΥΧί3…χνθ«;XψlΛζ�λ7>¨}σgΫ9χUσ—Ίv‘)R8ΗΨ+ϊΎm½Οϋ}ώ₯έd^έοε“§NIιr•½φW�TA†ώΚikί±‹¬ΆBƒkW.‰π�=XΏŸμ0Ÿ~κχ©.Z‘΅sΧ—Νψkx°J₯ ’'wn9φΗ1YΆ|₯υ �δ’+gNσΛ-‡™S'[ΑΗΗΝΉ“&/οΤGή²ΖξΉΆ­M›~ω°O_™0i²³­+cG2₯J:m5λΤ7γτΓόΩ’σα¦]ƒΡ=­ρv/oΎΦCΪ·kγ4u·Ύ£ j;³‚ € € € €ψ‘@�€Ι¬Ώ©τ0=ς Άy�ƒθοhέ‹p/Zx’Q³–’4Iw³Χϊ0λχΗW¬ ώΈ,τΗQ‘O € €@"ζ`‘=|{vν”Υ«VΚΕ‹μ¦ x½3S2IΩδ>ΉώΧ?rεϋˆ+“ΕυΓF'lηόhμŸ†•V-ϋΑ©ΔQ_�ΉzUjYS Ϋ•ήt*�Ε ζDτ²―sψπ©\£vΌ ǍiUτTάΣ~tκϊ’ ιϊν κ΅"[Z΅ii5ϋά·ίθ)νΪ�\Έ}s7κTδ=^»Nt�?WΑΒΉ3§Κc>bΊao—x²˜ ΠΟλWZΙπβΕK¦’¬•K3dΘ sfL1�oΩ!S΅΅ δ>ίιE{ΣΌώϊσfRԍ߬J�5j?cΪυϋA«•κrώό―qΦΆCŠVφΤεΊUΙ·h‰²aŽ1;ω‚ € € € €ψΉΐ™³Hσ–žΏg�σ™Σ4 2P*Wτ„³΄A§fΦΐδCY²H·;YΏtHkŽΣπž†Ηά‹Ύηυ½o/]ΊΏ"K–.7›-š51&φ> Ξ;ίϊ4d¨”-]R²gΟfο’_vό* ›z*Y†,όγ?e«5sαBδ!k χςΦ»½eڌY¦I§£ξ�Ω'Ξn j…K]Τ¨PΑΞ>χ{θvυUƒ…Y¬O…Ž9Τ ΚiΰM+$ΪU"υ}₯fξχ~ολtΣ:MΆϋϋW�/iΦͺ­3uLƒ…:U{&λ�šF žqŽ[ΏTZl}钁ΠΏξ4χŸ7kšiΣ�77χόΛ5;ΓωbO‰nχΡύ�ΰ’y³¬Κ†›³4X θΝκ„ΎοέAC‡‹V܌jΡ)«'ŒωΪωΏθם»€~γζQΖ~@@@@@ΐ/žΘWPͺΥ¨aϊvπΰ™9mͺυϋΟdΦ‡Φ»›ίƒž9sΪϊ[ΰɜΕσ;ςΩ3¦Λ!ζxG?ά�‹† ‡Ί9³Ά%Ή3‰”)_^Φ­Z%Χo\Χ&Ώ[ϊݐΠ!@@ q$–`‘ŽζίΦ΄’σζΜ”S'OτΰΊC…�^Ή!—ΗŸ”]M°gŠ*lη;ΥηΡcΗ€bΥ§E«mύ΄y3…«VI«Χ°©S•PCzZέΛ=Υ±�{υεn�ι…ηgnΠ€…3U²“^t…‡ a¦ Υƒ5¨ΈfΕηΌώ_|%#ΎνlG΅β~V s}5x¨9E(}ͺLi)cΒR¦Lι\ζΠ‘ΓR₯fgϋv 5见?]|ΓGΒjΪ²sίπVΤ�ƒήο:ώίO›α\OwOλ�ώ¦ΥζZόμeϋ/;¬ιZΩ›R«f ωςσ›S Lš<ŚςΥf‹ŽDΑΒΨΌ_|}4ΐZΎru'HͺSςκΤΌφ2βλQ�ΐ@³9yΒѐ–.ώΛ[ ¨YΧ/Z �ZUOPU§ΕνύagŸ�tμΠ^zΎ�έ΄ιώ|…‹;ϋΜ™n¦Ν΅ΊΏ�Sώpσ½ιž>ά]mΞ7XhWε΄―σρ½€iγ†φ¦yλϋ\ίͺƒvεPϋ`χ˜»ŸυvυUƒ•}?ώP�₯σ„15\χΑǟˆN l/½ί}KZ΅hfošP€†#ν₯{ΧΞ’A@{YΊl…tξφ²Ω΄C{Ία~ΟΪΗF4²½Υ�E’%Kf³^ε@χ{۞²ΈqΓϊfJv=IΝtγί²ήOΝΌΖΧΎάύEy±Σ ζveQίgκΨ₯»3…΅N•­G]Τ«rυZΞ�g¦1œ/”2i¬WΕ^|lB±αN € € € € ΰχeΚ•—βΕ=Κή³g—,œ7W5i&Y³e7Ε#F3\ͺT©!9rzŠ\¬^ΉBΆnρό εΎϋ2HλvΟ™gΤ™zƍώΪοŸΧ·ƒ }EΨF@ˆΔ,ΌaUΔΪΊεGΩ°~5δ΅xq«›ψ[¨PŸΣΆ»zυš,]ΎΒ<Ύ†‡ςδΞ%­ι?έΛ`+θχΥ ‘Vu΄ό2uςDg—V‚Σπ‹{ΡιPuZT{ΡiOuϊSߊ…Zmoή‚…’a M›tcφyφkt‚mφ±α½ΊŸ5Όύξ6­‚ψϊ[οš*tvϋν ΪαLϋΊϊΊmΛΦΤυΏ”κ΅κικ--ζLgUΰ»χή{€k—Ž&,©Pί’%˚kuΡ vY•ϊμΕ�HhoλλσΟ΅‘΄i<α1}?h΅7]’γQ°06οί`‘»ŸφKƒƒ ΄­V¨U u™4n”WυFΒv֜Ή¦J¦VŒlqŸλ[υqΗO›D©Ίψ†3΅M§Θ­ώ_hρ’5υΒΘQžώω ‡όF>�ržb–w’Υg{™>sΆΌωN/³Ή}ΛFkͺOπU+γuξκ δΩΗφ°»ςη³7₯jΝΊ&θ{»ϊκ\ψΏ•/‘!ΓGz55BΚ”ςόrH�?)[±ͺΧ”Μz°ϋϋ(δ·’c]β:XψBϋvςΪ«3»ͺ;8ν�b¨AγΡ_ί¬,h 5$¨aA]μ)Ζ5 ½μ‡ωNυP ωΎΣΛsŒ‘υϋF—πή'f‡λ‹^λΫ cst—Vƒ|ωΥ7\G±Š € € € €–@ΉŠ•€hΡ'M§wοόUvοή% 51Ϋ[·ώ(«W,—ΊΟ4\Ήσ˜ΆυkΧΘ¦λ‡|ωΥΧΝο`υά~ ‘Ν7Θργ 7˜Σ±h�,Œ&‡!€ €ά^`;zD–/[πU uΤύ1T¨ύΊ•°Μ΄Ί .ξJ_ΊέσΝwD_ξ₯HαBVε­qN“= ¨N1;{ΖχrW²dΞ>{E}{φξ•‘ίŒu¦W΅χE'ΨfήktŸU+βu}ωU― €z=w jΡβ₯�Ν:Ζ½ΌσζλΦTΞ-¦<tΦχοΪΒόvόy²˜§²^tƒ…Z°s§R�lkͺκ\’,ΩΝ)œ›Y+ξ`a�Ύ}€^έΪΞnwΖV’γQ°06οί`aχ―ΙΒE‹½zι[w°Πw`χI�όσlϊq‹™6ΩχzzάΞm?ŠNΟ­‹»:¦―ƒVΉΣ xΡY|ƒ…υ6“]»w{κΎ―,ΤΠ覡žΠ―ΧΑ‘lh…ΑΦ4Μξ*Ÿ±ι«ϋV8!e+Tu7™υε‹˜ι½uγΰ‘C&άθ{ΠxλΣ€:]·.:%xώ"%Μz\ ίθΩΓ„fυfvυΤύϋJν§kšϋ»«sjƒϋ{Φj΅E­P¨KϋŽ]ΜβΊ>uςg*j­†Zήϊd­NύlO½¬Η|�·ŸŒ3Œ­mξEC…“ƍ–Μ™pš7lά,­Ÿλΰl³‚ € € € €’@α"Ε€B%Ο B2g‘)SΘΕ‹dδ°!ζ‘7m!eΝjΦΜ›#{χάόέyύF%GO5CϋωuΆ σηΟΛΪΥ+d�Ύ}v³_Ύ,τΛa‘S € €@π k°0τJ¨¬]»Jvlίf¦ τ‘τΧP‘ΊΊY9λ‘Ώ"}ϊώŸsH»6ΟΚΫoτtΆ5Δ΄dιrg[W|ƒ5ͺΡp.Υ«V‘z½#χέw―ΩοΛ―;wIύΖ7§Έυ tΉΓ^αοΫζ~V}¦e+VšC ζΟ/<Ι9ό‡%K₯λKή‘Aέy»‚…ίŒ'Ÿυ�ΒΉŸ�Œ5RJ—ς¬’,ΤPαάYӜ—ΧΕ|6άΑΒαƒΏRV q>š―°YΞ—θψG,ŒΝϋΕ7XθtΩύvWεs uΏΑ΄z¦΄ΟqΏN›1KάSφϊήΣ’ι9ΎοkχΤΛξk†·ξ,¬Tνι0Sγώ²u£3%·,τ½gxΧφmΣ°οž={½Βm±ι«ουυ�ƒ±γ'y5o^ΏJξΉϋnΣ¦I Nϊ.Γ‡ ”ΚΛ;ΝvΈ5�ƒ…:ύΊNΓ�‹]©Σ=uσκ5λLXPχkΕIzΪ^μ`α /?—Υͺ˜f»"€n΄kέJή~σ5ϋpΡiͺ«[ΗΩΣ>λ�7ΕJ>i5Φ)“Ζ;S9λ…’3%ΊsCV@@@@@?Ȟγa§B‘“$Ibώώχν„qrβΔ_¦η-Ÿm+3yώV3~μ(9}κ”Χi8±dι2ΞlBξηϝ“±£Ώ‘kΧ�Ί›ύf`‘ί A@—@0 Cφο“εK—˜O)ωϋh¦hr―$Ιt—\ώώ΄άψ+όVό9T¨Ύξ°έŸ—o­)ν%Τͺ&¦S•jΐεβ₯Kv³yυ ^}πρ§VψπfGͺPξ)ωzψ`ηΌπ*vΥ¬^UΚZӎ,ίͺΊ—Σό0ιœ`­τϋόKgΩθΫάηϊ�»ŸU§]~ΎΣ‹ζ mΝ±*(ήyηf[wu4‘½ϋφ{]Β,Τitu:UχςΝπ!RΎœgΚam·SΊξ�~v;‚…:Ε΄†εμEΓƒ6m²*Τν”sΦ'τΪZA§œη0»έΑBwJw>eMU{ό―ζΈ¨ΎDΗ?’`alή/Ύηήj°PŸKƒ˜uλΤ’R%ŠKωδΑ,YΒ<�»z`Ÿ{K“F Μ1v:χ ξρτšΩ}œοzLƒ…ڝ.Ϋ^Žύρ‡ ψκζχ–έξ~]Ίl…ωΎ½]}u_[Χ΅βcγζ­½*.κχQήΗ5‡ž8yRΚ”χ„πάηNŸ2Ι™²ωΜ™3R’lE³Ϋ,tW2΄ΟuOe¬mΎοƒUK9Α<χχ·}ΎVκԊΊΨ‘δΦ­ZΘ{oΏaΪ.]Ί,―τ|CΆύ²C>~�=Ρχ½θ{γUqι’yr�ύχΙ™Ώ�–e*Ψ»ΝϋλΗ kœͺ‘:]|yλ�?\—u6JΫφγέ+ϊ}ε*άϊΣΟ�¬U[χa¬#€ € € € €+*ujιΨΉ«W�χξΩ% ζΝuΪ^θό’€NΖlθ�™Σξ»rί}$Αςθ£yE―k/Ώ…μ—9³fΨ›~υJ°Π―†ƒΞ € €‰G ˜‚…:ύμκΛ$$ΔΏΛ•»ί]©Ίe–;οΆ>Uuε†\2LΈΠίC…ϊ,…νάΟήzŽμΩeΙΒ9Ξ�π‚0ξiFυ@wHƒRΊΈ‹:έk—ΊJΣΖ Ν>ύβmωΫF'}ϋyWώsN g%²g8 ΏhΘΡ^Β ­_½L2άΏ9䟫W剂ΕμΓΝλ―?o–δΙ“;mq,ύυ0yΚ dΪ‹oε;wxΛ,t©τ\{zjϋ::.γF΄~xχό0>oώB2|€Ω�ˆ‚…±yΏΔ&XhΏΟτάο5­HΧλ7€h‘›ί~ο}3-²»bΙyθΑuU|«jΫ†ΥΛMΐLΧυ��b₯ž�UgΡ)±›6ndΆυΣ—M[΄6χi°P/€S!λχˆ..^”ΒOήΣh}Ρ1JφίγGŽ3Ν·«―Zε―m›VR¦TIϋvVΨξ°T©YΗΩvWτΣF Σιχ’½θϋ`ΡΌ™N€xΫφ_¬pβ³f·οΉvUAϋά©“':A=ms�’Ϋξ`αv+Ψ¨Y+mv ωι5tYΌt™ΌΨ½‡ �³Ύ―έοηΧΚα#GεŽ;ξp*„6B4<θ^άί“Θ~8Gvη9΅¦Ύ|―ο¬ιβέAΧΝΦτά-Ϋ΄χ=”m@@@@@  ΊΏ�Σωihθ:θ+ηy΄πƒξΧίΓjΥΑA_Fοo?EŠ=)ε+x>$�Σ"3ΒϋχΆΞ x…`a·G@«@0 _κρšlΫφ³¬[³J�Ya­@Z" FΆΟŸž1²°]TύtντXwΨ¦eσ&ςξ[oH�€IΝe._Ύ,₯žͺdΒUσgO—Gςδ6νΚͺίΈ™3lΝΥdΰύΜ>ύbO«λΎΑ62ΈΝs’]q/²gΥΐΣΒΉ3œώκύ|CQΣΎ›h*+κ>]4(4βλΡrΠͺdφιΗH£Οxvόχ5.ƒ…ξ©“υvZ=Q«(j@ͺΣ ν­Ο;}q 5P7kΪdσΓΉ a»=ί”ε+W™suzj­μf/3αCݎŽDΑB=?¦ο—˜ Υβ§ΝλœJ”ΏμψU6m©]1Kί>JΓϊυμMσK‹…?,ί€ώ2CΫέ‹οtΎ+V­–:{¦Ω-ρd19l°€J•�œβΖ&Xθ[sΔ7£Mε=»_“'Œ‘Β… :Ώ˜ΡJ€ZπvφυΜ™Ώe±(Θ!ƒ}[YΈh±t·ώΧΕwJ` >oυ{DC‘£F ‘|O<ξœ;fάωδ³ώfϋΝΧzHϋvmœ}Z)υ‹/Ι&+hΧΌicy�½·±Τƒ|ƒ…Λ/p‚:υpskڌmΫw8ΧΣ;0ͺUIΫX‘Ǎ›6K«Ν¬�«^wάμ΄κa™�%½ώOΠ}Ϊ―η:tφ ͺj{ύzuδ�>ύXW½ύΏ―@Ρ›aL{gx‘B ƒκ4μ—|*Δκ9'­ ξp¬}^@@@@@@hΪΌ₯dyπ!ΣUίj…ε*T”’ΕώΏ½ϋ€²«*Ϋό‘ $τZιU”’�C/„Π›Τͺ’‚ HοUBh HΗ€ %‘K―‘�ό©€€H�έ'άݙΜL2“™Ήε9k™{Ξ>mοη»q­!ομύγμ܈αΓγφΫn™¦!₯θΫ/ϋ7q㾌+.mz₯Ÿizh\$XΨ¨I€ ΠΌ@5 »-ΌHΌ�ή»ΝΆL―˜Z€0u΅λ^ ΖL]:5:›aΉ §©°]s}LAΊ¨+έ�ς¨;wn�)ομ3N‹ž…ei‹Ϋ_|―Ύ6¬0Ϋ_—Xyεc–og\Kη{μ|“ρ›@IDATρqϋίM…�κ OΗ,³ΜRΌ5ϋLKωφΩeχf†Ν5…‚R8¨Έ₯>mΏγ.ΕΓ8₯°<κ.;M™….olb§-ƒ…iωΦ4ϋ`qϋζ›obόψ ›ο5B• Συυg’Lmιš9昽Np+…³ΆάΆW KΧ€­9�¦‚…-ύΎ΄4X˜ϊϋπΰufƒ{�ƒβͷގEΊu‹e Ko§ί~L[šUp͟¬Ÿ·JΓS›™2]ŸΒ‡�ΈλΆ|ιΫΤ–�τΥ€ε�‡�쟽{υŒe–^:Ζ˜=ώD\yU�H}κΉέΦ±βςΛΗθ�ό'ž~ζΩ8�ΒKκΌ£τΰΕgžlP�JMαΤϊΫ_―ο_gΖΜϊηλί|λmqά u��Άώ5Ž  @€ @€ P�‹w_"ϊμΌkΦ½τߌtΌςςK±Κͺ«GΝ6Λ�}b@�«bμGεΓXb‰₯’gοcLαΨ‡<ό`ακΗfη�’Θ[n½M,ΈΠBΩρθQ#γΦ›�šίWN;‚…εT }!@€Ԑ@5 «‘\υΓ…iL•*Lύl.l—�ij«Ώ|ιΤ�M3ι₯υŠ[ ₯ΩΥX`ώbΣT?§Άρ%ž›υψyƒλ·Ω~ΗxγΝ·΄—647Φ4ƒΨχί['Έψ«ίwί;0{LšqνΑήΫ販i6±�%UΫ2X˜ϊzΕ\sΝY:Δ©ξΧ¦qόν†ώY8nͺ7|ΫxκιgF�7ΤΉ€9�¦‚…ιA-ωΎ΄&X˜–·>χ¬ΣλΪκ θΫƒΣN?+�p}vT:dύοnι½iVΘ#λW'`Wz>ν5:Άλ΅SžkM°0=/…βνwPώXR[ύν£ΖƞΏΨ?�rΌΕmFχυΘΓ‰CϊX||!Τ:>[�8ύL36^rαy1χάsεηλο€λ>ξ„<πW<Η­UV^©xXη3ΝnZϊΜϊΑΒ΄ότqΗόΆΞ=ιΰOgžWχ΅§ΏŸwώύo±δ’KdΗiFΓγO<©Ω�οΘ.ž†?�l«iΦΥ�­ίῌAƒ,mΚφοΊνζXiΕ΄7Φ0΅%Ή»V; @€ @€ΚQ`‡ϋΔRK-έhΧή|ύυΈχž;λœ_zιe£g―ήy[φΛμ…Ιf.LrQάRΫ Χυ +Ώ”γ&XXŽUΡ' @€@ –O‘KΓ…©WίL˜γ|“ί/ο坟/,;ΗsdχύspvδQӍΪkϋνβ°Cϊf3Γg€Kω πά΅…`ڟ―Ί¦Α3SΈπˆΓŽΝ6νQg†ΒtašU�!δυ—«―mp_ ZWm»Ν–ΡνΫίBK³υm΅]―:Aͺ7ž{κјsΞ)AΌ΄Μιώ}ipYZ x·]vΚΫK—ΈM«­ΊJ6Kγ Λ/—_“O�ό@Ό6μυ8ρψc³φ &Δjkό$Ώζ™'ΙCQ₯³7/(]�φ΅aΓ Ώ}χέL‰Εkκ¦Ύ€εa°Ϊͺ‘ ’}2ΏλξΔψ γσ™Ω’ηϊoZ�φ¬―Ϋn½Uή―βo½ύvœSX‚φ.6εŸΝωο»Ο^qμo§|‡&Nœ«ώhΚ�ω ;Σϋ}YγG?,!Ώϋ.—}.}ζΣO yζž;kΊξ†›βδSOΟO§Ωθ>θ€X{­5ςΆβNš•ς²+ώχ\lŠ—Ÿ{*Ίtι’§Ωι.ΉόΟωΉϊ;k­ΉFζ˜f,/ΝάyΛίΞ9/¦{Σ2ΣgŸ~jφ˜4KβΊυΘ–+.}ξS=σΝ;oΦtύ“ώψ§�Σ‘f <αΈ£ ³~ΏN¨1yίσϋβ’Λ�Θ—/½qzϋš–3�ΓοΛ1΅ΎΦŸ!°tfΎ^=νδcέu~’ΟΎ˜”ϊψΒ‹/Β|§Τ™ ³ΨΟβ}›όl£|6Ιτw)ΝΐxξgδN:e—Oν{pΠώϋFŸή;Δ"‹.’��Jύ€lϊ»{ΛMΧεύϊͺ0Λδu7άwώή€Ώ{₯[1(<­Ko²ρF…₯6.ΜρΙ§ŸΖΧέ(?.έ).]]ΪΦΤώ 7ύ-N9mΪgtlκYΞ @€ @€ @ £ΆλΩ+ΎΏΜ2u~>_φZά?πήέJ3ξΈσΞ…�¦;[ώߍK/ϊό‹ΟcΠ}cδˆwJ›Λj_°°¬Κ‘3 @€Ϊ,,―ZΓ…©W•*l ½•WZ©°¬μ€SX’uZΓ8)dΈX!4Ύ 1rTƒ USύLΑŸi}OSΟ™ήs)΅όrΛΖ'…ε\››)qzŸ=½Χ'ƒ9ηœMΛBOοVΛ„Bρ­·ώ=]ž­υoΙχezΗWΌ>υuρΕ‹…\°°άν'1²°lBύοNύ`Ψ΄Μ„Y|~ΛΌσΜ£Fžj°―x݌όLα�Ή aΩ�όί»S κ5φ�φμkχ‚ωlϋ‰�7Ν}L΅Za…ε³ξ?χό  £Ιφ¦Ύ›ΙνΌΒL–Ε™ ‹J�ρκ½χήΟ Λ³Ο=Χ\Ρ­03h Τοπβ%>  @€ @€ @`,½μ²Ρ½ϋ’1βw ‘ΐοVΰiμѝ;uŽe–[.ζ_`θΪ₯kŒ;6Ζώ{όΨ±ε9Kaι8 K5μ @€΄›€`a»Q{5 P:cec3=ΦCΝ 1-έ½έΆ[峟Nmΰυg-Ϊ5Ϊ @€ @€ @€@c‚…Ιh'@€hSΑΒ6ευpjL`πΐ»σYμξΈλξψΝ1Ηט@mw½u~Λ–H^Έ0Cαόσϟ-Ω½wˆγ=:f›­k£ύ9rTόρOgΖΓCiτšj8ΡΑΉ…»-ύϊ˜ρ|σΝ7qζΩηΕ—γΖ΅)Wύ`α•Wυ3Ο9―Υοl ŸVwΚ @€ @€ @€²Xu΅DΝΆˆ™fš©A?'OžοΉ+ή|ση*½A°°�+¨� @€ ¨†`α/}tLœ01}tHΌόβ ‘BWΆφ8ι„γb·]vš¦—ώο«―bο}Μf0œ¦*π’ΆΞνά§wόρ€r^;νΦζK,§₯ϋ_uE,»μ21zτ˜8πΰCgΘRΘmα“ΓΨ!@€ @€ @€ͺN`φΩηˆϊφΛC…cFŽ1£GΕ’K-‹,ΊX6ή.Ότ’σγ«ΒΏEUΣ&XXMΥ4 @€@ TK°°Hώή{οΖ ϋΖG~XlςΩΖ?\}΅ΈωΖλςδ�λƎύ8†>ϊXŒ5:–X’{l½εζ1Λ,³δ=Iη·κΩ;>ώψγΌ­švΪ"8ΧΑΒΆͺI[ψ΄U_=— @€ @€θx-·ή6V\iε¬##FΌ·ίzsή©}φ; ζwΎμψ…ηž‡œŸ«†ΑΒj¨’1 @€*P Ϊ‚…©“Ώώ:ž}ζιxςΙΗcR•ύFR9~ΕώvΓ΅±Ζ~˜wν΅aΓβτ«μΎψbqΣυύ£ΫB εם|κιqέ 7εΗŝM6ή(VYy₯Xf™οGηΞ3ΗπαοΔλoΎοϋgρ’:Ÿi ζΉηž+k»�Ÿƒ ˏ-7ο?Y{νψβΛ/γ‘Η―sοZk�m°^,ΏόrρΑΖσ/Ό·έqWgΞ7ί|Ρkϋm³Ά―ΏžΧ\{]€Ωϋ6άpύψΡWΞ:ΕΘBhςρ'žŒ·�=ΌΞ½ι`Z‚sK-Ήd¬Ώή:±B‘ -΄`όί�½―Ώρf zΰ‘:v©/©Ώή½υ–[δοϊσUΧΔΫo�;>ωδΣ©.-½iMbε•VŒe—Y&ΎώzRαΪαρβK/gωCšΩIcήu—>ωUΉϊΪ|Ώtgzk65ŸT—uΧωI|©%cDaΙμ_|yͺγ*}―} @€ @€ @ 6ϊvDΜ:k—lε²K.{ή–vR`oΫϊΔ%ž›υψysιΰΩ瞏]φΨ'oO‘ΌK ?”·τήί�ξθ˜sΞ9‹MΩη€I“βΜsΞΟ‚‡₯'¦œ+=ΰ~Ώˆ#λWgΗβωτ½=ε΄ΣγΞ»ο͚vίu§ψΓο+žnπωι�k―³aޞΟ?ηΜψΑj«ζm₯; Ώ<κθBs\iσTχΧ[η§ΩRΘΕ“‡qTά?θ»ίςkiΝJ}ώ9ψ˜½P―τ�ϊΫγO<ύ;ršϊZ�^Η @€ @€ @€@uΜ<σχβ°#• ¦~ppο}ˆ4ICιvήΩg”Ζ"‹,;ξ²{ΜάΉsφ�ƒΛ.Ύ &L˜PΪT6ϋ‚…eS !@€Τ–@5 ‹•|ύ΅Wc萇γΛ/Ώ(6UΕg§nί‹�;Ν_Ώ�Ώ˜psΗ,)άkϋνβŒΣNΙ=oωϋmρ»ίŸ”Χί9ϋτScžyζɚ_φzœ{Α”ίK3γ yΰώ|ζΑϊχ�χΥW±υv½ 3ڍ,6Ei°0oœΚΞǟ|σΝ;οTΞLiΊΰ’KγβΛ�Θκ ½ιΫ'œτΗΈιo·δ—•ηξx_Yς·_�ςπ8θ€ύЇ~φ;ό—1hπƒ1=ΑΒiuL³Jφμ½K£ο.žh*X8­οšZΝJ}Šοjμσ…_Š>»ξΩΨiν @€ @€ @€@• ,ΌΘ’±λξSώ­ΰ½w�/nΊαΊlΔ?Zc­Ψx“Ÿgϋ_ώ ι{ίϋ^Άεε—Ζ_|ž«Τﰘ­πoQi›8qBόχΣOcάψq… %ζ.,‘ι)ΰ˜‚ŽΕ-ΝlY²|ΰΑ‡£ο·?τ―ρI€ @€ @€Τ†ΐzn?ώρO³ΑΎώϊk1πž»cǝv‰ξK,“'OŽ«�ryτθ±E,΅τ�Ω5C~(ž}ζ_Ωώόσ/{ύbίl�γ?Žk―Ύ2Ϋ―€? +©ZϊJ€¨"ZNN3Ψ=σt<ρψcρυΧ“*Ίzε*LΎμ’Βμ}榛lΆUŒσŸόxZv~ΈϊjYH―xmZR8--\Ί΄�Ύρλ_Mωm²Τώ«ίwί;0»€4X˜f½Ϋq—=ς[χΨm—8ρψcσγϊ³τέrΣuρΓՐO³$�΅ΞΩ~ύ`azWzgιΆΧ»ΕοχέΗgs~όωͺk²KJƒs₯ΑΒ«―Ό,6Xoέό1‡qTa*ώο–θήpƒυbί}φΚϟrΪ1ΰϊ³γζ‚…υSˆςΒ‹/˟•v�ΈτΒ|ΆΔϊΑΓ:~{ΠX°°ώ»¦·f₯>iόλoΌi|9n\ή…\|β‘£kΧ�YΫλoΌΫξΠ'?o‡ @€ @€¨ ΆI¬ΉζΪΩ€‡½ϊJ φZτΪq§μψΩgŸŽ‘=Ϋmί+–YvΉ¬νρG‰§žœ2qCj8ς¨ίΖL3Ν”­π4όίoΗΏž|"ή{―cVΛ:8N'˜Λ  @€fŒ@΅ �3ft<ψΐ ŠŸ₯0U»άB…©O'p\a™ή)?Έ₯γ=φή/ŸΥ/OΛΦ§χqΪ)Θ/ύυ1Ηŝwέ“§4λ`š}°Έ]tιεyh�4X˜f�K³·4ϋ_š°ΈΥŸQρΌ³OmΆΪ2;έT°πΨγOŒ[o»£ψ˜μ³ώ €₯αΊ�ΰ\i°πΒ2ΘK,Ρ½Ξsš:Έξ†›βδSOΟ.i.XΨkϋνβŒΣNiκq Ξ-·ςκ ΪJ ΆΆf₯>�*ΜΉ{α{S»ύ–›bΥUVΚ?ϋμσXσ§λΧΏΔ1 @€ @€ P?Zc­Ψx“Ÿg#1|x,ΌΘ’Ρ₯k—ψςΛ/ “`\’΅χΩy·XΌϋ”ƒωΗ=wΕ―ΛevΨ±O,΅Τ”Ω ‹_&&ωόσΟγΡ‘Ε[oΎYl.ΛOΑΒ²,‹N @€ͺ_ Zƒ…'LŒG/ΏψBφΫG•^Ιr &Σ4»ή±Ώ=*ηM!Έ†›žν{οΏ;ϊΧω-₯K WX~ΉΈηŽ[‹‡qΝ€λγ΄ΣΟʎKƒ…ΉϊΪ8γμsσλfT°ππ_ώ:ή?(nΪIK)?υθCy[鬆₯ΑΉ�`αΣO yζž;Ώ§Ή�%‚› Φ―EsΟNη²ώΟ"MϋίΨΦX°°΅5+υyπα!qPΏΓtα†WǏΧZ3kOKQ―τƒ)ϋ .Τ@€ @€ @€T΅ΐ’K}?Ÿ‘0;wξœύϋߍΧ]|π~6φέχά'κΦ-ΫΠ�ͺϋΡGuLR8ρ§λ�]Ίt©Σž>�μ³θυ_b�€―œ+‡ΑΒr¨‚> @€jP ƒ…oΏυf<8xPφ[Jε^�.;͝»Νγo“ίŸϊ+ε*LΆ›lΌQΆΌnΡωίΓί‰-ΆΩΎxΨΰsΘΰϋbξy¦λ^~ω•ΨσDύe‡OϊγŸβϊ�Zηލ7ά �ΌόβΌ-… SΈ0mν,L³ ¦ΩK·ϊ³(^yU�8σœσ²KJƒs₯ΑΒ»oΏ%V\aωό1ivΖΒOΎωqύ_z%FŒ™57,άrσMγΒσΞΞρА‘qο?ξˏλοόο�k–¬McΑΒΦΦ¬Τη΅aΓ’gο]κΏ:Ό;–\r‰¬ύ½χޏ 6Ω¬Α5 @€ @€ @€κ˜mφΩγ ƒ­3Π7^-ώqΟέyہ³Ο>Gv|ήΩgδνυwζŸΑXmυΔ +¬ιΉΕνίoΏwέq[ρ°¬> Λͺ:C€¨j ¦₯l‡>τ@ΌύvyOW^ϊνšν°E’Σ<…ίͺš09Ζψ°AΈ°œC…i³Ο6[<:dpΜQςƒΧ)§�Ώ±t˜Ω~ΏΎΔ/�ξ‡Ύχύ3�Υo’ώ’ΒΟ>χ|μ²Η>uξ/]²8Ψο ~1τ‘Η²kΪ#Xψζ[oΗΦ={ΧιΣ駞½wθ™·xς©qγ_oΎKƒs₯ΑΒK/W<Μ>ΣLˆ³ΟΦ5Ϋ=ζ?ωΉϊΑΒϊ}$?Ώμ2KΗΐ»oϏŸϊΧΣ±Η>ϋηΗŝξ‹/–ν~9n|“³¦‹ ΆΆf₯>ι=½vΪ-^~εΥ΄›m?Y{­ΈώΪ«Š‡ράσ/ΔΞ»οΫ!@€ @€ @€jK ­.•f*LΫΔ‰β�‹.Θ:uκιόL3Ν”Ν:xΡωηζηšΪYc­΅c£7Ι.IΛ"�εŠK›ΊΌΓΞ v½ @€j[ ‚…GΒi/Όπ|<φȐ˜τΥΤgύ+Χ*7lκ\9ηπCŽΓι[§KW]smτ/Μ(ψήϋdKzπ±Ηn»d?Π/<τˆ£βώAƒ³ΓΗ‡> .°@ρT\|ΩqΑES~xΫ}םβψcŽ™gž9;?~όψXgƒMβΛqγ²γφ¦έyΧ=‘Ν0XΨίί½γ¨#ΟϋτMaΦΑmwθoΌωVΦ§�ΰ\i°πΐύ~Ώ9κΘμšτΗcO<ϋμwP~œ–•ή{ΟέσŒχϋ?DZ9m}z利ς‡l?ύ‘‚™ΗbξΪžzμα˜oήyΣn€₯ϊrD>LΒ―λ w[(;?rδ¨θ±εΆΩ~c4,LΧ·¦f₯>ιY£F‰ΓŽόu€Ω W[u•ΈψόsbΡEI§²­�€βΤΣΟ,ϊ$@€ @€ @€jL`η]wE[<uύΩ 7άψg±ζZ?Ξ΍>©/Ε-η{ί› -Ά₯ ιΖ›nΥμμŠΕλ} @€ @€ @€Υ'°xχ%’ΟΞ»f›±ΤRK7:ς7_=ξ½ηΞ:η—^zΩθΩ«wή–B‰“ �ώ0σ·Λ*§©ν†ΒͺO}ψa~]9ν–S5τ… PC‚…εSμ�paκΥ7&ΗψΖδχ+gyη“O<>ΆΫvλ˜}ΆΩΐ¦™ω�Όκš&Cb½Άί.[V9Νθ7ΣL3εΟψ πƒά΅…εp�\ΈΏώVR«?›αλ­W_9evΓτCa-Ά‰Ρcώ“?β΄SN,,1ά+;NΛ6oπ³M³ύM{l—^x^~]ΏΓ›χψyl°ώΊΩ�ΞιΔΔ‰γω^Œίs\Άδs~qagΠΐ»b©%—Μšn½νŽlΙβ�σi9βΣO;%ΦZγG1묳ζ§Rξρ'ŸŠΛ.Ώ2žzϊ™Ό½Έ“œ}Ψ/zϊW4;φγψι?+^’}ξ³Χξ…εšχ‰nίώ–]ρdΊφo·ό=Ξ»pΪ¦ς/υKΟ(]ΎΊψΜ–ΤμΡ‡ε}»δς?Η»οΎWXz·Xfι₯σΊ.,|ζ9ηηΛeίη“ @€ @€¨]νzφŠο/³L �Ώ½>μ΅Έΰ½ `�Μ„;ξΌsa‰Ωςƒ(½θσ/>Aχ Œ‘#ή)m.«}ΑΒ²*‡Ξ @€jG@°°Όj] ¦^UZ¨°T²ϋβ‹ΕV[­πCέL‘fί{«0KaιŒ~₯Χ6ΆΏςJ+ΕΧ_OŠ1… `s3λ5φŒ–ΆΧξwPΏϊΘcΩγR`pΦYgΙ–nισKοKΟK^)<™–-žž-… ›²IηWZiΕθ\˜ώδ¨Q Ν½λΎΖ‘‡·Δs Xό`£·΅Άf©Ώiφ?ώ€Ιq5Ϊ' @€ @€ @€šXzΩe£{χ%cΔ;οBί­*ΥΨΰ;wκΛ,·\ΜΏΐΡ΅KΧ;vlŒ=ΊπYž³–ŽC°°TΓ> @€@» Ά΅U@SΑΒ F‹»šfT<ξΨ£³‹3#¦‡mΉνΣmq'άH€ @€ @€ ‚…Ύ @€" XΨ!μ^Zζ΅,άΉOοψγI'Τ©�πwFΔζ[χ¬Σζ€ @€ @€ @ m ΫΦΧΣ  @€,lFsM Φ {ύψΝ1ΗMχRΝ5ύ%2x @€ @€ @€ΐ ,œˆA€ 0ύ‚…ΣoζŽΪΨ`½uσ>ςΨγω~-μt_|±XΏ0ώO?ύ4FŽ― V Γ6F @€ @€ @€@Ω –]Itˆ P‚…΅Qg£$@€ @€ @€ @ ς +―fzL€¨ ΑΒͺ(£A @€ @€ @€ P…‚…UXTC"@€T‚€`a%TI  @€ @€ @€¨EΑΒZ¬Ί1 @€Κ@@°° Š   @€ @€ @€˜Š€`αTP4 @€΄½€`aΫ{ @€ @€ @€Z" XΨ5χ @€΄Z@°°Υ„@€ @€ @€ @€6,lV%@€hN@°°9!η  @€ @€ @€ Π1‚…γξ­ @€š,¬ω― @€ @€ @€ΚT@°°L £[ @€j,¬φ  @€ @€ @€•* XX©•Σo @€@… VxuŸ @€ @€ @€ͺ,¬Ϊ� @ Ό Λ»>zG€ @€ @€ @€@ν Φn퍜 Π‘‚…Κοε @€ @€ @€hT@°°Q' @€ΪR@°°-u=› @€ @€ @€-,lΉ;  @€Z! XΨ <· @€ @€ @€ @   ΫΧ£  @€,lάΖ @€ @€ @€t€€`aGκ{7 @ † kΈψ†N€ @€ @€ @€@Y –uytŽ P½‚…Υ[[##@€ @€ @€ @ ² +»~zO€¨XΑŠ-Ž @€ @€ @€ Pε‚…U^`Γ#@€”«€`aΉVFΏ @€ @€ @€¨uΑΒZ�? @ ƒ ;ήk  @€ @€ @€ Ќ€`a3@N @€΄€`aΫΈz* @€ @€ @€Z+ XΨZAχ @€΄H@°°Eln"@€ @€ @€ @€@› Ά9± @€LM@°pj*Ϊ @€ @€ @€ Πρ‚…_= @€Τ€€`aM–έ   @€ @€ @€¨ΑΒ (’. @€ͺQ@°°«jL @€ @€ @€Tƒ€`a5TΡ @€( XXEΣe @€ @€ @€jB@°°&Κl @€ς,,Ώšθ @€ @€ @€’€`‘ο @€@‡v»— @€ @€ @€ @ YΑΒf‰\@€ Π‚…m‘κ™ @€ @€ @€h½€`aλ = @ ‚…-@s  @€ @€ @€ΪA@°°½‚ @ ‘€`aC- @€ @€ @€(ΑΒr¨‚> @€jP@°°‹nΘ @€ @€ @€T„€`aE”I'  @€Υ' XX}55" @€ @€ @€ͺC@°°:κh @€Š,¬Έ’ι0 @€ @€ @€5" XX#…6L @€@Ή –[Eτ‡ @€ @€ @€S } @€:D@°°CΨ½” @€ @€ @€Ν 6Kδ @€Ά,l UΟ$@€ @€ @€ @€@λ [oθ  @€-,lš[ @€ @€ @€ Π‚…ν€μ @€  šh!@€ @€ @€ @€@9–Cτ Pƒ‚…5XtC&@€ @€ @€ @ " +’L:I€¨>ΑΒκ«© @€ @€ @€ P‚…ΥQG£ @€Tœ€`aΕ•L‡  @€ @€ @€¨ΑΒ)΄a @€ΚM@°°ά*’? @€ @€ @€˜" Xθ›@€ Π!‚…Βξ₯ @€ @€ @€hV@°°Y" @€΄…€`a[¨z& @€ @€ @€Z/ XΨzCO @€h€`a ΠάB€ @€ @€ @€v,ld― @€h( XΨΠD  @€ @€ @€ΚA@°°ͺ  @€,¬Α’2 @€ @€ @€! XXe�I @€@υ V_Mˆ @€ @€ @€κ,¬Ž: @ β +�d:L€ @€ @€ @€@ΦH‘ “ Pn‚…εVύ!@€ @€ @€ @€ΐΑBί @€,μv/%@€ @€ @€ @€@³‚…ΝΉ€ @ - ΫBΥ3  @€ @€ @€ ΠzΑΒΦz @€@  [€ζ @€ @€ @€΄ƒ€`a; { @€@CΑΒ†&Z @€ @€ @€ P‚…εP} @€Τ €`a ݐ  @€ @€ @€¨ΑŠ(“N @€ͺO@°°ϊjjD @€ @€ @€T‡€`auΤΡ( @€' XXq%Σa @€ @€ @€jD@°°F m˜ @€r,,·Šθ @€ @€ @€¦ϊ& @€tˆ€`a‡°{) @€ @€ @€š,l–Θ @€m! XΨͺžI€ @€ @€ @€Φ ΆήΠ @€Z XΨ4· @€ @€ @€ @  ΫΩ+ @€ 64ΡB€ @€ @€ @€r,,‡*θ @  k°θ†L€ @€ @€ @€@EVD™t’ P}‚…ΥWS#"@€ @€ @€ @ : «£ŽFA€¨8ΑŠ+™ @€ @€ @€ P#‚…5RhΓ$@€”›€`aΉUD @€ @€ @€ 0E@°Π7 @ C ;„έK  @€ @€ @€ Π¬€`a³D. @€h ΑΒΆPυL @€ @€ @€΄^@°°υ†ž@€ ΠΑΒ Ή… @€ @€ @€ν XΨΘ^A€ ΠP@°°‘‰ @€ @€ @€”ƒ€`a9TA @€5( XXƒE7d @€ @€ @€*B@°°"Κ€“ @€κ,¬Ύš @€ @€ @€Υ! XXu4  @€@Ε V\Ιt˜ @€ @€ @€,¬‘B& @ ά Λ­"ϊC€ @€ @€ @€)‚…Ύ  @€" XΨ!μ^J€ @€ @€ @€f ›%r @€@[Ά…ͺg @€ @€ @€ @ υ‚…­7τ @€ΆΝ- @€ @€ @€hΑΒv@φ  @€†‚… M΄ @€ @€ @€ @  Λ‘ ϊ@€¨AΑΒ,Ί! @€ @€ @€ P‚…Q&$@€TŸ€`aυΥԈ @€ @€/=ˆTΆIDAT @€¨ΑΒꨣQ @€*N@°°βJ¦Γ @€ @€ @€Ԉ€`aΪ0  @€ε& XXnΡ @€ @€ @€L,τM @€θΑΒaχR @€ @€ @€4+π�E`v…²IEND�B`‚pydantic-httpx2-9b7ee8e/docs/img/gh-actions-fail-test.png000066400000000000000000015003361521723372100234350ustar00rootroot00000000000000‰PNG  IHDR "~ΐt�π HiCCPICC ProfileH‰•WTSΙž[RIhH ½‰"H—B‹ U°’@B‰!!ˆΨ•e\»ˆ€Ί’«"Š��€¬um,‚½?,¨(λbΑ†Κ›ΠΥσή;ο?gζ~ωηŸο/™ΉwjžTšƒκ+Ι—Ε…³&¦€²HΐΈ&/—²cc£”Αη?εΝUh ε’‹’λϋρ�*z‘œ qΊ@ΞΟ…ψ7πbΎT–Ρκ­gδK•x2Δ2 ΔR%ΞTγb%NWγ •MBβ]i<ž,ν&¨gπ3!φuˆ]%±2Δ|OqΔ#rs§+1΄ι_ρdώƒ3}ˆ“ΗΛΒκ\TBΛ₯9Ό™�g9ώ·δζ(}ΨΑFΙ"β”9ΓΊ]Ϟ©Δ4ˆ{$ιΡ1λCόN,PΩCŒREŠˆD΅=jΚ—s`ΝbW/$bSˆΓ$9ΡQ}z†8Œ 1\!h‘8Ÿ› ™»X(ΧpVΛ¦ΗΕ β ‡­™[Ο“©ό*νO*²Ωώλ"!w�u‘(!Y3F-'EC¬ 1Sž©ΆΑlŠDœθA™"NΏ ΔΎBIx°š›š! ‹ΣΨΛrεƒωb‹Ebn΄Wζ‹"4<»ψα ‘“pcšx‘μ›|X`<θ„Β49§3nY=π`άςCnœ‰›| τΔΖ‘o¨εh"Wf�-χ?rψͺκ;Š+₯ £QΎ©ν€ν1Δ’¬ιΧRǚ>TWΞΠΘ·ώ9_UZŸ‘ίZb‹±ύΨiμ8v;„5vkΒZ±ΓJ<΄ŠͺVΡ ·8U<ِGό?žΖ§²’rΧ:Χn׏κ±|a‘ςύ8Σ₯3eβLQ>‹ ίόBWΒ9‚εζκζ €ς;’~M½bͺΎσά]ή1|J‘2σ‹Žg ΐΑG0ή|ΡYΏ„Ϋc‡Ϋω YZ‡+; Έ£Œ9°07ΰ ό@γ@ H)`*¬²�g˜fƒ ”`-¨›ΐ°μϋ@#8Žƒ?ΐyΠ�€[pυtg Όύ‚:Β@Œ ΔqFάo$ E’8$IC2 ’@f#‹2dR‰lFj‘_‘ƒΘqδ,�ά@ξ!έΘKδŠ‘4Τ5CνΠQ¨7ΚF#Ρt š‰ζ‘Eh1Ί ­@kΠ]hz=^A;Ρgh0-Œ‰Yb.˜7ΖΑb°T,“as±R¬«Ακ±fψ?_Β:±μ=NΔ8 w+8OΔωx>_ŠWβ;πό$~ Ώ‡χ⟠t‚)Α™ΰKΰ&2 3%„rΒ6ΒΒ)Έ›ΊoˆD"“hOτ‚»1…˜EœE\Jά@άC φ‘H$c’3ɟCβ‘ςI%€υ€]€£€‹€.�;²Ω‚μF#§’%δ…δrςNςςEςcr?E—bKρ₯ΔP”™”ε”­”fΚJ₯ŸͺG΅§ϊS¨YΤΤ j=υυ6υ•–––•–Φ-±Φ|­ ­½Zg΄ξi½§ιӜhΪdš‚ΆŒΆvŒvƒφŠN§ΫΡƒθ©τ|ϊ2z-ύύ.ύ6C{€6W[ =O»J»Aϋ’φsŠŽ­[gͺN‘NΉΞ~ :=Ί];]Ž.Ow�n•ξAέkΊ}z ½Ρz1zΉzKυvκΥ{’O�·ΣΥθλoΡ?‘�€1¬Ÿ±ˆ±•qŠΡe@4°7ΰd”μ6h3θ5Τ7c˜dXhXexΨ°“‰1ν˜\fs9sσ*σΓ0³aμaΒaK†Υ»8μ­Ρp£ #‘Q©Ρ£+FŒYΖ‘ΖΩΖ+ο˜ΰ&N&Lf˜l49e�3ά`Έίpώπ�αϋ†ί4EMLγLg™n1m5ν337 7“š­7;aΦcΞ42Ο2_c~ΔΌΫ‚a`!ΆXcqΤβ)ːΕfε°*X'Y½–¦–– ΛΝ–m–ύVφV‰V ­φXέ±¦Z{[gX―±n±ξ΅±°o3Ϋ¦Ξζ¦-ΕΦΫVd»Ξφ΄ν[;{»d»ννžΨΩsν‹μλμo;Πςj.;½³78Ά;‘NN"§*§ Ξ¨³§³ΨyƒsΗΒŸ’5#�ΉΠ\Ψ..u.χF2GF\8²qδσQ6£RG­uzΤgWΧΧ­�·Fλ7zαθζΡ/ݜάψnUn—έιξaξσά›ά_Œq#³qΜu†Ηx=Z<>yzyΚ<λ=»½lΌ�Όͺ½�yxΗz/υ>γCπ φ™ηsΘη½―§oΎο>ίΏύ\ό²ύvϊ=k?V8vλΨώVώ<�Νώ¬€΄€Ÿ:-y5χƒ¬ƒAΫ‚³ΩYμ]μηΑ�Α²ΰΑo9Ύœ9œc!XHxHiH[¨~hbheθέ0«°Μ°Ί°ήpπYαΗ"‘+#�qΝΈ|n-·wœΧΈ9γNF�"γ#+#οG9EΙ’šΗ£γǍ_=ώv΄m΄$Ί1ΔpcVΗά‰΅Ν‹ύ}qBμ„ͺ βFΗ͎;ψŸΏ3ώMBpΒς„[‰‰ŠΔ–$€ΙI΅Io“C’W%wN5qΞΔσ)&)┦TRjRκΆΤΎI‘“ΦNκšμ1ΉdςΥ)φS §œj25gκαi:ΣxΣφ§�’Σv¦}δΕπjx}ιάτκτ^>‡ΏŽ�L$X#θϊ W gψg¬Κx’ιŸΉ:³[(*υˆ9βJρ‹¬ˆ¬MYo³c²·gδ$ημΙ%η¦ε”θK²%'§›O/œή!u––H;σ|σΦζυΚ"eΫδˆ|ŠΌ)ίΨ[Šχ  ͺ ήΝHš±ΏP―PRΨ:Σiζ’™‹ΒŠ~™…ΟβΟj™m9{Αμ{sΨs6ΟEζ¦Οm™g=―x^Χόπω;Pd/ψs‘λΒU _/J^Τ\lV<ΏψΑα?Τ•h—ΘJ�ύθχγ¦ΕψbρβΆ%ξKΦ/ω\*(=WζZV^φq)鹟F�TρΣΐ²ŒemΛ=—o\A\!YqueΰΚ«τV­z°zόκ†5¬5₯k^―Άφlω˜ςMλ¨λλ:+’*šΦΫ¬_±ώc₯¨ςJUp՞jΣκ%Υo76\ά΄±~“Ω¦²M~�|}sψ憻šς-Δ-[mMΪzϊο_j·™l+Ϋφi»d{玸'k½jkwšξ\^‡Φ)κΊwMήΥΎ;dwS½Kύζ=Μ=e{Α^Εή§Ώ¦ύzu_δΎ–ύήϋλ³ύ­ϊγ@i�0³‘·QΤΨΩ”�ΤqpάΑ–fΏζΏό}ϋ!ΛCU‡ /?B=R|dΰhΡΡΎc�c=Η3?h™ΦrλΔΔ—ON8Ωv*ςΤ™?Βώ8qš}ϊθ�3‡Ξϊž=xΞϋ\γyΟσ ­­ώτψσ@›g[Γ― Mν>νΝc;Ž\ ΌxόRΘ₯?.s/ŸΏ}₯γjβΥλΧ&_λΌ.ΈώδF΍7 nφߚ›p»τŽξς»¦wkώεψ―=ž‡ο…άk½�Φώƒgε?v?’?*lρΈφ‰Ϋ“CέaένO'=νz&}ΦίSς—ή_ΥΟž�φwΠί­½{»^Θ^ Ό\ϊΚψΥφΧc^·τΕφέ}“ϋ¦�mι;γw;ή{Ώ?ύ!ωΓγώI+>9~jώωωφ@ξΐ€”'㩎lhF/·@Og‡v¨“Τχ<• κ»© �„ΥwA•x°=€ΔωDΑ3ΚFΨl!¦Α§ς¨žPwχ‘¦y†»›š‹o<„w―Μ 5πI60ΠΏa`ΰΣVμ Žε©ο—J!Β»ΑώJΤΦJίΚΏ(Σ~a,™γ§ pHYs%%IR$πŸiTXtXML:com.adobe.xmp 2594 1662 ›�1iDOT?(??ξ&€Υ”-@IDATxμέ|UΧΗρC“ή{οD”*½ ¨  �EE»bΗBQA° ¨(" E° €*�{ο½}ξ™0“ΩΝn²I6$»ωέχσ²Sξά™ωΞς˜°�=7Ε¦ @@D(]‘J"™Σ"€ € € € € € €C AΔ`02 € €@\"ΖUŽγ@@@@@@@€!@1i<�@HΆ“ν£ηΖ@@@@@@@ L"†Ιƒδ6@@P ˆͺOŽλF@@@@@@""ςN@@HT‚ˆ‰ΚΟΙ@@@@@@@x DŒ7! € €ΔG€ b|τ8@@@@@@H|‚ˆ‰� Έ@@ Y DL֏Ÿ›G@@@@@@0 ˆ‘[@@BY€ b(?=�@@@@@@!ˆΘ»@@ Q"&*?'G@@@@@@β-@1ή„ € € ‚ˆρΡγX@@@@@@@ ρ"&ώ3ΰ @@d-@1Y?~n@@@@@@Β@€ bJωre₯κ UdώΒE²sη�$Ο‘>}z)\¨ u7mNςΧΧ ¬Wηfɝ;—uψ•+WdςΤiqŠγ@@@Hς)R€ 2H¦L%MκΤIώzΉ@@lK—/ΛιΣgδμΩ³ςί�Ω›ƒφͺ#¦�Μ�ιΤ­ϊGŠ ¨«�Μ­θ=Y―ζ.}΅δ~�ΎLΨžaD|{πpΩ½w¬žX©Εδ‰ήχΗκ:#€ €Δ_ ‚ˆujΧ’tιΣΕ cοή}²nύ†8›jΥς)Q¬˜δϟO²gΛ&§NŸ–={χΚΦ­Ϋε§ι3δ’+U¬ ƒΌcύοΏ�Κ}φ”ύϋ$ΘΉ‚5hο^=δŽΦ·[Γυμύ˜lΫΎ#Ζ‘›4nh>ΘΘδ·ίΕ Μ{i£lίσX~ ςŽ9ΏΜ‚ 8£6nήJvνή㬇λΒν·Ά΄‚±E –|ωςΚωσηΝ}ο–&$ϋέΈρ²�ΐΑxίzFσΑVύϊu₯j•λ₯RŊ’%Kfλ}ΏsΧ.ω}Ξ\™·`aΌΟΑ € € € €J•RrεΚE1p2z"€$A‹—.Ι‘#GδΚ•ƒvuvO£ˆαݜ4’Ηm&χϋχΐ`%μΒ2ˆψHί~ΞƒψΖ ’ήΟ‡ΒηΝ—Ύ/χwϊψΊ³Μ € €ΐ΅‡ β¬ιSβŒυΟΪ΅ςDίηβ|||,R€°5D|«ΆhήTΊvιdͺίεφ{I‡–/Ζ|-³ωΝoŸΈμΈ·kι�©ƒs萏>φ=jυA­Κχ―ω‡“έ{’FξΣΓDνϜ9#wΆοδ\»Ώ­žψΫ¬ιώv{lΏxρ’ΜϊεWy©ίλrΖ|{5!ZŽ9€DρbΞΠΛ–―p–έ Ι-ˆX«f yρΉ§₯\Ω2nε &0:ζλoε½Aο{lΝŠžgθ%[Φ¬~[ΊlΉΌςΪ›²yΛVΏ}؁ € € <ύ7‘΄Χ₯ ή€Œ„ €@" \ΈpQτίσi €@lΒ>ˆSΈΠZŒ©olqι € ³AΔΔ "6nΨ@ž{ζ)λ!M›1S>:<ζζ£Ηmn—‡{φπ±'κ&�aΠϋC¬ \Τ½qΫ’Σ20θ=3“C Ήb¦θz9|ψˆ3Ψ}•–-š[λύί sζΞsφ%ΖB�\9eμ˜ΡΦ©.Z"―ΎρVŒ—› ’=ΨΡcΗ€Ο�ϊΚ’?—Ω›‚φϊΡ‡ƒδ–fMρϊ™ΐΫ·¦�ŸwKNAΔͺT–oΎό\�»ξ:oŸλŸ~ώ₯Ό;p°Ο}ΡmΌ§sGyαΩ§%Mš˜§ψ:pπ ΄nΫAŽ=ݐμC@@ˆ§€Nǜ#{ΆxŽΒα €$£ΗŽ[Σ4'+βJ@ "Ίͺ'D …·,׈ €α&AΔ.ξ–λ�D 5kΪΔLΙ“Σzd―ωG֘�χn:Uλosώπή|MΦuε�=φˆu�Y³‘& Ϋ¦χχΥθO%UͺTΦ‘ηΝ“?Ο–ΉσΘΑC%·™’¨QΓϊ�’y3I—.bϊκKfj‡ž½ϋ΅:‘V,V΄ˆ¬]·ή#„¨υΌ [62‘KmτŠŒΦΐ±ψ£MλΫδ‘^YGxWoτ7L\‚ˆ:–N‹έ°iKΓΖyϋΘαCDƒ¬v{ευ·dμwίΫ«Ξkr "Ο3[ςζΙγά».\ΉrE6mή"ιΝ{Ώ¨yΊ›N#~WΗ{D�·!ΠVΉRE™ψύΨ(έϞ=gύ£ ύΏ7ξ«V�%ν;uuob@@@ ΘTC 2(Γ!€$Ίΐ…‹—δΠ‘CρΊŽ�δ?3sΈOΗμ›Hο][rΎ�δzοΎίΙg+AD‚ˆΙηέΝ"€ €@’‡ ’?ΨΧ_yIt UmΓ>)“§NσΧ5QΆ#ˆ¨S"λΤΘΪtJΰgžΩ„ΧEΉŸ*ΧW–7_λ'iΣ¦΅φ}ωΥΧςΝ·QƒkQ Β†€D|γΥ—₯fκ’Υ!;tξ&ΗOœˆρ.}»vο!ηϟ³ŽΝ™3§T,_^Ίtξ`*0dχοσ/ΖΘΫο ςΨί‚ˆž‚Νš6–αC"§ZΆ+ŽŸψ£Sπξ»ΪŠ>ϋ”)S:k�Μ�6ΪF}ƒlέΆ]z=�' £}}ύέΙh¦‚ϊyϊdΚ| mΣ�£už><,9sζpΞωλοs¬κ•Ξ†« :Ξ3}Ÿp6kυΎΧή|[zSΙΠ~Ξ}<Κ :Ε° !ΫνΫ9½&OωIϊ>yN{ǐΑœiΒu›VνσD_{w΄―eΛ”–©“Ζ{όÝ«cΈ›ΎW¦Mž`ήcιΝϊμΎϋ³Ξ € € €@p ,ά LΖΕjΙ4η έ@ �ϊo¦ρjϊ?RΙτ ¬¦β%ηϋO¦χ―Ώ3ap0AD‚ˆaπ6Ύ6·0cζ,ωδσ/€ω`ορG{›>#>ΜΎ6gη, €„―€―0UΈάml*"jΘξεŸ•βŊωΌύ_~ύ]ήYqΝέι†*•呇{JΡ"žSΏΪ}Φ™ιŠί0Hφο?`mzΰ;R±B{w”Wn‘Λ½DΩξkƒ;ˆ8ΑByύ­w|u³Άiΐ―tι’ΦςΎ}œ©™υϊί{ϋ-k»N#ϋΜσ/ω£ΧCJΫ;Z[ϋ>ωμ \›θτ›5=’"ά DlίιkϋΟΣ&{„ΆœΞWζό1WϊΏ;ΠcsΧ.€s‡φ’*ujνΊrΤΨήτί°[”|l¨fŸύίxΥΪ3ΑTΛωιη>zEέhQμvOgΡηb7 O^S-kUM4¬j·yζ™έίγa{Υyνd τύk7­vYγζ²jΩ"{“ίΧoǍ—~―½iνχ"φθυ¨ xχ-Ρχ‚w»|ω²©:Κo…ΐΎO>.άΧMRϋx6:–†%ΏωvœΟχড«Σι{䍷ߕoΏισύqκΤ)yΪΌ5΄hkίξN±Γ΄zΜ—cΎ‘&˜λέ^xξiιή-βύ©ϋ&Lš,Ο½ΨΟ»›Οu Svξx·³O»­ΫF�;;ΜBŽ9$KζΜΞ&ͺ!:, € € € "@1AX4‚ˆ Ρβ,ο bœΌ ͺ“hρ�₯ΛV›ΈΎ±�₯Kλ1εW\ΗIjΗi₯ž­[·Y•k΄’IαB…¬R+V(οQΩ%ΨΧ½wο>iΠ΄…3l…ςεdς„qΞ:  € w‚ˆ"NΣΰ˜»‚™/Ρ;wŠΉά­|Ή²f*Φ7$]ΊtξΝQ–5„ΨΣTίΣPΪΰοH₯ŠώƒˆM%Ε{ξ{0ΚΎ6άo‚aοΎΛΪuεΚ`‚zΏΝωΓWWΏΫ*ˆ8σ§£ύ™ψwsξ)‹5 ¨Ο"Ί¦χψαΠa2sΦ/Ρuσ»ο‘^I›Φ·YϋŸ6σV�υ·ίΎξ± "j%Θ/>σœξ·fέFVςρΗzΛ£&΄j7wHΡή¦―#† ‘&8›~7‘Ν‡~L܁>g§ΧBtADύ='Mš¨!O{ύ–hΗ{ξ‹φόό“₯^›νnΡΎj5Ζ]ξυθγ}έηϟφοΜαΓG€vύˆ*Εsε·YΣΝο0QϊΏ3@FωΪYnΑΫ@CΏ_}σ­hυΚΊΖF+Lκ΄Ο7m6ο«5Q*‘F76ϋ@@@β'@1~~w‚ˆq·γHˆY€ bΜFτ@O°"|γσ�οeϝ;/}_Žœ:nΨΐΧ=uqM?δΣϋβΪή~σ5Ή«νq=<Ι·xΙRyΝ|Π¦ΣηωkwίΥVž|ό± $NωiΊ<υΜσ§^χΧrΏΥX<:²‚ €Ρ DΡ€‘VDΤ¦©q㐠7[?k΄0Sί\»¦cψεW_›ͺoί;λo½ώŠT―v“΅~μΨ1kzε+W›iŠ―3SΞΦ°¦Π΅;ΫUσεΛk¦oΞc‚]uδφΫZY»�2Έ―ΏύΞZ>j¦Κ d*hνμZ›?ώ^σό>g�θ΄ΏLeμ#˜uŠλ �Λ½]»8 œ2Ut imΫ·ο”γ'NXΛΝ›6­Έg7½‡‰¦ZέS PŸΝ=;H–,Y¬έ'Μ1ν;u΅»Ζκυ³‘Γ₯pαBrϊτii{w瀏MQƒŽί‰¨0©'ΠπdΉΚKηן§yTμυθγQͺ�­όs‘dʘѹΎ'Ÿ~N¦N›!S&~oM]¬hηι3gδΰΑCV�&N}―iσ�ˆhm4huΙcΗOΫΦxφv}υ��Ψ²EsΡ)έM�žό³v©‚ψŸ Υ–βΥiΏΏ�!²b¦wQΗ�Π£†{/_Ύb*‘•T©RΉOa…T?�bŒΗΆΨ¬h@P[ζΜ™¬©Ύ΅ͺΊN―l7:½nÈ©ΚνmѽΘ:ɚ.ά?zΰ~il£ήΧ�}ζΞ[`UvTk € € €@Β DLX_Fχ/@ΡΏ {@ ώγoΘ$7° "φ4\φμΫ«gYͺD1y’χύ±:&!;?Π³·υΑQ\ΟΡ�W€}»Άq=<ήΗ-Yϊ§άϋ@d₯ύΠνខUΥρ>ωΐχ‡ΘΘO>σήμsύΊλ�“ι“'HQσΑh0Ϋ™³g妚u­qu\­£Ubάνύ!™λŒœZοΫ―FKΥͺΈ»°Œ €>’{ρΞ6·›Ÿ“zX2�zτOE φξΥCξh}»ΥηŒ |uξvΏπϋfΜη’;W.kŸN‡«_ΰp·Ηzχr¦ŒΥ`ΰ‡C‡;»[΅ΌEώχΨ#Φϊ¬ΩΏˆώά—φΒ³}₯aƒϊQΥ©r·οΨ).\Όd‰yυ]ύ/‘‚ˆφ=�ΜS�¨aDuΏƒ?ΩΏόfοr^ݎ:%ο»;ϋt!W�œ2jψPΙ”)“΅}μwγδ 3ύnlšŽ1vΜh됅‹–Θ«oΌπα± "NžπT(_ή{ΛΦm�βΆΘ/)ύπέΧRεϊΚΞώρ&Ι /Ώκ¬Χ―WG40i7ύYψ†j΅νUλuδπ!�ψͺ©nxευ·dμw‘Y»³wQίο|_μ€ŸbΏψl””,Qά>ĚBΌ^γζΞϊΏΜ”ς;λΰ{ΰ‘ή&¬»ΙΪV¬hQ+Μλ�4θ]ΡΠ;ˆ¨ΑΙǟ|Ϊω«fυjςɈ<ή.Ξ°ΰ+πι>lΣζΝςμ ύ¬Π�{{tΛήαΠE‹—JνZ5’;Dtκ;Ϋw”]»χDۏ € € €ρ ˆ??ŽŽ»AΔΈΫq$Δ,@1f#z €€§@¬ƒˆ#G•ΏώYο9J kiM8¬ί³}$[ֈ "1tχξΥkΦΙ¨/ΎΥ8?ά]Κ”Œόπ+V'@ηP"κt|={χqdzφx@ϊ>Ήξμˆaaڌ™ςΏ§ž�K+~δ6δξ?p0ΚΎ9rΘμιSLŚΜQφΕgƒNg8ρΗ)’;w.isϋ­’‘Gw³§F³·}ύΕ§¦ Qu{•W@π#άƒˆήyΣ„Β�·tΎϋŒωz¬O©οǎ‘lΩ²YϋžyώE'Τ7ζσOD+j7~‚|6ϊKk9?‚DΤs=Πύ^i{Gk3νnΏ§ή³w―L˜8Y~š>Γ£Obušj�ZΫΙ“'₯kχNΠΣ}‘Ϊ·³ξS·­ωg­h•ΐΨ4 “j¨Tې>ŽβέX1΅ϊލUo>>lͺTFΌŸμρ&Mž*Ο<�’½*έ»έ#/<χ΄³�?ηΊƒ―Ύό’tιt·³ίΧΟδq "jUEo7 4κxvΣ°bΩJU­U_χmWg΄ϋλkΓϊυ¬ ‘{[›vι‰½ƒˆϊ%’α#>qwοϋΦP―Ύβ�τ==ώ[ίS._Ύ|YτwΒ:Π¦ΟwΥ²E~»kπς�₯K’Χ;uzfw[Ά|…tκΪέ½‰e@@@ D 2(Γ,@1`*:"€@"ƍCHζ±"7^wˆ5EY vνZ·”Ζυ=+hzl\ϋiρ·Ή‹dσΦνΡ‘•υΪͺTЬνΧhηΊυdϞ½QΞ6|δ'U3ΊέΣYj׌Zγϊλ+IžάΉ£­6+ˆxk›v²qΣfη²Λ•-#Ο?Σך~0MšΤΦ”nZΩηεWίtͺjη—_xVΤζZ6‚ˆΧR›s!€„“@r"κ—ςδΙc=�ƒ?4wψ|Ό:m°V~Σζ±½χφ›Α³­¦ϊ݌ŸgΙ3ύ°†“’kΑ "κy�§Oo*7ή&΅Μ—1J—.i¦–φJτ�˜ΨAD·ΓΆνΫeŸΚ%K–'ϊϋ‚Lž:ΝZυ"ΊοΧξ߾ݝ��WνU«’g\§ΰ֊”“Ə t7 :ύχƒ½υx6ξύξe_FΊ_C€Ο½ΨΟϊϋ�λϊΏƒΌ-•+UΤU§υy’―ωί…ΩΞ:  € € €Α ˆ\OF \€ bΰVτDΨ DŒ½G άbDT0 ψM˜βYΕΔdαBδ™>EϋŒΏcƒΉύ‘Ύύœα† |έY΅οκCή(-oiνmθxkΧ�—Φ�L§5«PΎœhε{ΏθΠ)ΟV�Z-ΫΆοΣ§O[Η)\X›ι‰υ1wΣ …G‘…‹–zLgΧϊΆV¦zL7«kφlΩ%ώ|ξΓ|.?qBͺΧ�ο±oωβω>+ώςλοςπc�sϊzO'7wήΉ|岡?§©˜θžŠΞ>HtJi»•,^ά™βY?ΰΥσ�ϋχ?k·V)[¦΄΅¬Sέ]Έp^>ϊx”Η4―ΌτΌ©J15sΑ%«Š GŽ΅ͺι¬Y»Vφξέ'₯J•”ŠζΩT4ΟΖΫΦΎ.^@7δDœ1u’h΅ηΨ΄ρ&Κ'Ÿ}aRΎ\Yτ^Ÿ‘? Λ­\ΉJ¦ΟœνT†sŸΗΐ‹ΟΤΜξ1έΛ΅Μfn�USjΥ¬ξTs΄χυ©UmZΧ;ˆΨγϋ€}»Άφ₯τͺ?Ί§;δ ΙΖYaΝ­ΫΆK―GbW-άW1¦s^4ς4ŒηόΣγ>�δc©Wηfgˆ‘ΓGXW ²Νž1ΕΩ~μψq©qsΔ΄ΦΞF³Χ bΫ»;{|±Κsέ_Λ=‚‘vQŸΝ3O=aw³ŽΥ1|΅/ΝΟ7Χ�ιμϊθγ‘ΞTδήAD{|§³Yh�Έ‘ŒψθCg“N)Χ ’’a@­š>]:+Ψ©ΏU»ιFg|]ΠίS΄~ mυ²Ε’!Cz§«VVlΧαž(·υχˆί™!Ω―VPΥ>ύόKίϜAX@@@ŠAΔ 02H"ƍC@ `‚ˆSΡ� Δ)ˆ¨Ί½7d”μΪ΅bŸ[6EŠςΜγ=₯ˆ #&vK�ADύΠρ 3eά•+W|>‚‡{>(?ΪΫη‡ί°λχκ²tΩrŸΗκζάΧMž~*2¨a@ FΧτΓAύ0¦¦ΑΗζ­Z;έ2eΚ$+—.pΦέ ϊž|ϋ½rωrΔ}κ΅χ›k³›;ΰP’x1ωyΪd{—σκ=eYΧ.€ί‹Σνy«S.kυ"mUͺΥ’³gΟ9γψZxξι'iόtΏ>Α •QŸφΥݚφyΰ»ύc ™ϊ<˜ €„˜€ϋΏΣ!vι1^ξλ―ΌdBxΥ«‡™P”]Ν>0[Φ¬ςύ·_Ω«Ώώd¦·2μc§™�₯€g¬/šθΟΰΎΪsηΛ[οΌη±+‘ƒˆξ“ιTΏχtκ(©�VξΣʏ=ό˜Υ%±ƒˆO>ώ˜΄ˆαΛ=ξ{±—Ϋ΄λΰs g{Ώϋ΅z΅ε­Χ_΅6Ήƒ€ξ>Ρ-Η6ˆ¨!Ίη_zE6oΩκsXFϋέώo8ϋV­ώΫ„ξξ‘žή/Z}Σnγ'L’^~Υ^u^γDtO—μ fόuͺιΗzχrΊz�Μξμ0 £>*D~‘iτ—_I�wZ]ΌƒˆΎώw'ΨADχ΅ΩΛϊϋ…ώžαn-oΏΣοsrχ›ωӏR²DqgΣ’ΕK₯Ϋύ=œuχ‚~)κžΞMϊχ�Α^8λ, € € €W€ bp=-p‚ˆ[Ρb/@1φf@rˆSQΡvšβ{ŽVΜ_kT―–άΥ¦•ΏέΧt{r "ΎΨο5ωώ‡‰1:λtΗ?ώπGqηΞ]�²u[ΉxρbŒΗλ\ϊA—Ά`ϝ;'ΧίTΛγόϊa©~hΫζώ 1±ƒˆZlΧ±‹lήΌ%ΖΫθήνyαΉ§cμG@BYΐύίιPΎ_ΧSQ™:iΌ€M›Φ:|ψˆOδΈ©@S[Ώq£5%«wΏ|ωςJΝκΥL ±’T¬P^rεΚιΡΕ;w-ƒˆz!χvν"]:u°�ι’©Φwk›vΦ²;ˆψΧ_Kίη^΄Ά{�Ρ瑇εΆ[[Z›΅"€ήέfM¨β§Sk Ξݞζ)iΤ0’ͺί€ΑxT±Φ~έξιμ„ΆΆnΫ.ߍο>άης…‹Dƒ`ΆGξ)­oΏΥκώ΄ΉΏΥζ>cΣ|Ώωvœ©Μ}Αζάωσ²ΕΧ­ίP°Ν]aOΏ(sSΝΊςɈa’‘I»uνήC/‰zŸΧ*ˆθ˜Τk³–Ύ˜ψύX)‰_λωκ›o­[I*AD½˜υ―πψέΛ=…΄νξλΥ»Š₯N΅¬S.ϋjήN}ΏέΥΡσο…―γΨ† € € 7‚ˆqsγ¨ψ ΨΥϋωnrόOΐ ¬"&λΗΟΝ#'8υl?Lž.ΏΟ[μσΔΩΜ4΄ύžιc>T½Ξηώk½1Ή.Z"χ>πsj7YHοέ·_~žύ‹Η> »iθΝn}ž|Ϊc 7­ΦΣ²Es)h¦uΦ ‰:…˜»-œϋ«5Ν³VΡ =gΞρ¨¨ΥsdΟn�΄I#Ρεi:5³NΡμn:­r‡φmM΅“Q>\wχs/»Α"κz:­ςΡcΗ<*Oκ΄i3d΄.γΩΎOH›Φ·YΛοlMζΎ>΅Ν›'·h%­^γnS&~/:ε" @pp�w:άξ1 βg#‡KαΒ…¬[οχΪ›>C_qu©_―ŽtΏ·«ω.’Bωž½{₯ϋƒ‘ΥεβDLŸ>½©ςχŠ€J™R4Xθ/@h_₯Šdπ€wμU±+ Ίƒˆ;vξ”½uϊΈϊΏρͺ3΅m0ƒˆMHρ9VΤΆqΣ&yτρˆeχΉγ»l?ηS§N™ιt»Δz8_AΔψώέ2x€υ3Ύ}1ύί`ͺ?a¦NmmΪΰ ΤkΤΜήνρκDΤj›_ŒωΖ£�Μ1SΫο?]mEDήX†vΣΐd³–·›κό{μMΦkŽ9dήo?[•Ενχ=ΠS,Šψ}5‘ƒˆξP§žΏqσVQ�ΡΎ.οκκ>zΜΧφnΏ――υ{Q:wΌΫΩ―‘Ω[nm㬻† ,Ν›6q6M›1SώχΤ³Ξ:  € € €Α ˆ\OF \€ bΰVτDΨ DŒ½G άβDΌpα’Όώή;Ερ‘ϋ:I•Jε£lO¬ q "�^³Ξ„-Ι¦-Ϋ£½τ�%‹I£z΅όžŸ4Σ,O5A?» y`”ι{ušβ†ΝZΚ>8΄Ϋ‡ƒήύ Ωn�¬]'wάΥΡ^΅>°[2�wΡ鏡UΌ‘ΊG5ΔίgO—B :ύ}0TFŒϊΤYχ�Tψۜ?€gο>Ξ~*°ο‘λΎ&ώ8Ež}αeΏ½4 ©Σ$7nΤ@Z4o&ώσΥά�;ˆhŸΟ]qE·ιΤΝzmΕM[8›�»ξ:Ρ ‘{Š΅―Η~'―½ωΆΣΗϋΓWg  €„‰€ϋΏΣarKΞmDtχω{Ν?ςΤ3•¦A�.Τ�UΓ tM›ρ³3%°~‘AΫιΣgdή|Ο/‹θvwΘN«ηέ~g{έl5w1ΊsΫύ½_5ˆ¨!1ύ�‰ΆΑ ‘™³~ρξζ¬wκΠή Fκ†σ¦z_λΆ‘*ύ9S«½ΩΫ;tΉΧΉ?k£ωCξϋⳑζη½ Φ¦ΈΗ~7.J`�x±’2rψPϋTςΜσ/Z_q6\]Π “΅jԐtι�ŠώŒ―JήΗθΊVͺσω'Φ� yό¬η«Ώ―m DΤχ† νvΡ„I―K“Ζ^•1_•7ϊΏλ¬»Όƒˆϊάϋ_Τg|ƒˆΝσ^ΎdΎσΣk˜1s–θ§άMCͺνΫέιl�Κύ΅κ5–£GZΫ:ˆψσ΄Ι’ΏgΨmς”Ÿ|s΅2ζγυΆ»Y―ξίρτ~ο4ΰ΅’©ώN5ϋ—ίœΎeΛ”–ΙΖyXΌ7θ}ΡΏ ξV§v-ύιqOΣhΨΡ=Λ € € € D ά*=³š'�vαΒyσoL‘³Ecl#cΖ ’:u«ΙιΣ§ƒ5l‚ŒC1AX� Dδ­€±ˆWQO¦A½Q_|λqήλ+–“žέ;{lKμ•Έ}έ[Lχ‘ΠLχ‡Tz-Ύ‚ˆϊ!rΫ»#ύoiΦT>ϊpP”Kχ�Μηžκ«J΅Z ω“)RΨcŒK—.;λ©S§ςψ +XAD=Α«oΌ%ί|ϋ½s. ϊΈVΡκƒφτ†v_wΐ!1ƒˆήΤ§έή|­Ÿ©ξΨΞ^u^5 °~ΓFgύŸΥΛ<>vv°€ €@Έ�;·γq ξα°GΚδ©Σ<φλʍUowήzέΩ>nόωlτ—ΞΊ.tν�Ιϊ{£V6[»nh₯θοΌeo–†“ι&€θnϊ…vwFTM;|ψˆtξΦέΩν)jEC­τ|ξά9g Zy­t©RVWCÈΏώώG”C›˜/Žgw•ρί~-Y―ώμ}ως%³hΨ.Kζ,RΉrE§Š’ Υ¦έU­K•*)Γ‡ΌοŒ₯5`·ζŸ΅’Θ@Z½:7Λ Ο=νQ₯mΧ�έΦ8ǎ—,Y2Λυ•+{T‹»rω²<χ�+²ϊ―ΏShSC™vΣig·lέ*Z!�b… Ξ=ΪϋcDΌϋ�ΆςΰύχΩ‡Κ‰'dεͺΥςΗάωΞΤ½eJ—’‘ rΎ\£ϊ³ηΡ£Η,έoWcԁž{±Ÿ¬XΉΚ3ΊϋωjεςަΪγqsώΨΆ„ "κ{T+Uz·;vJS3²Ώ]ΕσoǍf\[0‚ˆϊψγן£Όό]›†ϋ™©‘ν0€φKθ ’>Ÿ ¦:hφlΩό]–Ον#?ωLΎQ•R‘‹ηύζΌυ€Ν[ΆJΛΫ#+=κyfšκ‹ξΚ•>vmΤρυ<4@@@„fQgb¨XΎΌδϟίγwDχΥλΣφνΫ'›ΓΉxρ’{WΨ/ηȞ]μ βΡcGΝ—]ύžυ ­ZEš>#θγs@‚ˆΑΤd,πυ ’BΤϋΊd>?Y½|©χ-†ΥzΥj5ΝΏ" >F «GR7” ’NΝόϊ»Cδ‚ωA·]λ–�Έ~Δ·P’’D\‚ˆξcΎρ‚©Δ’Ξη-;w^ϊΎάίΩ7lΰλΞr° "Ζυƒ&ύR?ˆΤ¦ΑΏϋ{<μχςu 䦍YΑE­Δγέ‚D΄ΗΧη-XdMƒ·xɟfJΌ=φ.W­2¨Υνζ8$f±M»¦zQDhΧΎΆ@^5 Π¬iγ@Ί�@p�w:δ.>† 4ˆ¨Υφ^yιΡ©W£kπΣ/6ΈƒlΥnΊQ^}ω hΎΖXg~yό©g’μρΡ‡R’Dqν‡’.χ>ΰ±-Ί­VΧγϋ’λβμΣ0ήGΓGFωG\ω£KΧΤΐΞAfAC–ΛW¬’š5ͺ[›cDTίΟF·*+ΊΗœcͺκυw ³I+>Πύ^ΏΧ υ ΅bεχ?LtŽ‹iaΚΔοM¨4lέΊMz=ϊxLέ}ξO¨ ’†?Η}σe”szWςφξ αΐ_LΥt΅υnΑ"κψx}§�λ’'wnοΣy¬=vL^zεu)΅CBυ5«W“ΟF R]χωj&MΆ­ξ}«–-²Β·φΆ%K�”{¦ioΣσ πΆδΝ“ΗήδχU?,q—ύvd € € €@Ό‚DΤπ[ƒzuMČ]ΟΙ“'εyσκ."z>I‚ˆž¬!€@pB9ˆθ!ͺΚώ}{L•ΐνΑJb£.Z\ςζ+ΰ\Υώύ¦2β*#: ,\ υJ›»H–�X-ΟτyΘcͺ©krœ$ΠP‘{(χ11… cΣΧ}ŽΨ.D|ϊΉ—δΗ)Sc;΄΄lΡ\† ΰ§Σϊ=m¦›‹ι›Tξ£}pBνρνΧΚψ “¬³―\ΉboΆΎ₯΄ώοΘκ‰ξ€Cbo�ίD>μ\g  Ύ¦z τXϊ!€ Τά�NκΧΫλΣJ λΧ³{£�»2oώ‚h‡xπώ{₯QΓ’;W.~ZΑO6ϋΞT)τ5u²Vλλά±ƒ ιUσ¨L¨ƒ8pΐͺ„¨Σζϊj$λtw{iΨ ž5}¬φ9h~Ζς?ω:Φ½­‚ω¦ώ}έΊΘ U�wov–5ΐ·ΨLΩ«SΥΊ§π³Θ‚>'‚\§OΦ)œ|΅Ώώ^# f}ωΛ{�“?fUοL“&΅©άyRϊ>ϋ‚Μ™;Ο»›V|Π»V@ΣΧyφξέ'―χΗγοH”AΨ€ € € 4`υίU *δ\ΧρΗ­/6Ϊ_JΥί‡υ ₯Ω²FVδΧ’:σCri=Ÿ4ADOΦ@ Έ‘DτδΨΏOvνΨ\œ$:Zα’%L1r†Σ&ŒΈ‹0b}ZαyYA "je“ΓfΪ²<>*b$Ίχ‡.›·n·.₯tΙb�΅C[Ι™#ς‡t_Χ›palϊϊ:W Ϋ "6B† ϋΨ²}»;₯RΕ ΞΊΏύ[+κΈΫ₯K—E+Ε̜5[–ώΉLφ8θήν,zοmi}[+gύZν�]·NΪ΄λh―Z―ξTέ‡bE‹ΚμS<ϊκŠNUένώΘ­»vι$ύ^|Ξκ§Σ ΦΈΉsŒVβωϊ‹Ou]xύ­wδ«oΎuΆι~»b½ρ�ŽχxLA¨γλ·ΫbjυκΦ1ΏxŒ©ϋ@Iχ§Cςΰ’Σ§Ooͺ#–2U―Θξέ{<* ΖtΊB JΎ|yεΜ™3&π΅ΣgpΡίϊΩ©Mκπα#ώΊΔΈ]ƒϊσVΑωεΚ•­J†ϋφκΧώGσ˜Ρϋ/^¬˜ω‚S kšθ˜ϊΗvΏb‹ιzŠ)lτš ‘;wξŠνi¬ώυξ%·_ύ9Y–Χi―“Rӟ1§MžΰQ-R§χΎγ.ϟ­“�5λ΅θ4Ζ%Šύ=Tίηξi˜“Β΅κυιοWZι3_ήΌrΒT¨ΨΎ}‡ͺέΎcG΄—¨Ηζ6tŠυ@šV΅Τίχ.›)Ϗ™ŠλΜ΄ξ1#qιƒ € € Έ@°‚ˆ-š7sfjΠ/[.]ΆάηEΤ¨v“δ5ΏojΣ©&gώ<ΫgΏpάHΡσ©Dττ` ‚+ŠAΔδB΄Ÿ>aD[‚ΧΔZ11.>6η\½fŒϊ"2$›c΅o(UDΤj9ξiχ΄OχnχΔφ–}φΧͺS§M—‘f:=χ‡}M5Γ†8Η#ˆ8φ»οeϊΜYΘΟφ}Β©¦βlt-xWœωӏRςκ4ƒξ€ƒV�YΉ4j5"χr:lBŸιωΑTσ±Ϋτ)€t©Rφ*― €$Kχ§“%7Φ£?aB™δΤ©S��C—$u―Z©πEσ»ΒM7VυΈ�gLUt4=:²‚ € € €–@0‚ˆ3fΖ :’Ώ›B!§OŸvΦέ Χ]w4kΪXR¦Himžk¦gΦ/Αy7-†‘Α½¬ζΛ§™2e4_X=/:σ‘£GcœMΗ�/»fɜY�₯K':ӁΞΤq�όΗΑƒ‡ΌOe­λΉ2˜ τΛrϋMR›~AOΏΈͺύχξΫεX½—ˆkΜb}Qςόωσζ ΆgΝ c‡δόω Φξ?όsηΞ%ΉrζOΏ {ΤΠ9jΎ°—ΦͺΕ-V!½ηŸ¦Οπ;DΆlY­Y2#mϊο?ϊΕΧγΗOψ=Ζ½#gΞ’=[6k*n΅Υ/ΫΧ¬Ο,³ωLσ?σ{φμuζ,kŸΩs˜γ3˜λMι<ŸύζKΑ4@ ‘D$„ωΤ #FZ°tm’MQYΗ|7Q–,['αP "nά΄YnmΣΞΉOοiάμZΥeζμ_δ?SED[Σ&­ΰžV|™;/2¨WΎ\Y©X‘Ό}˜υΊdιŸΣυU(_N&Oητρ"ή\»¦|ωΩ(g ŸώRή0ΨιZχζΪ’δϊj:υXƒ¦-ΌτλΗ|ώ‰΅Y§εΦιΉ“Bӊι―υ{ΙTXˆ:u°―Ÿ«“Β5s  € € €$e„"ώ6gŽΘσwίbK™2"ˆxθΠα(έ4XεϊΚV0Ο{ηΏ�^±*κoέΆΝ{—΅^°`)_Ά¬Η ξŽ'LΨnυίkD_έ­qΓV¨N|+W­j:eΚΘ™Α6nΪδ1@©’%­YAά}μρ�\ΉbUό_»n½½Ιzυ"κ 7άPΕ eΊ;kπqΥκΏΜ¬Wά›c\Ž)ˆ¨ΑΏj7ή(Y²dρ9–†=—›ΟωόIυψκ¦ͺeζLFχ —.]²f©+[¦΄ pζ²vyΏ�₯KkžνυΦL�]=8…k³ηΞΚίkώ‰ϊtuaH ”‚ˆ„£>�’ΕKJξ<ωœLΣμP°€Ι*ˆ¨Ž·l“i?�ξLΣ¨m(υžΪήέΩϊΣΎ?ύVΤ€wήrΒl[Άn&ΨύπW£?‘Z5kˆwQΏ-5kΪdΡ©ι΄ι//ΌόͺGeΏΝ›ΚΠΩ§³~¨oί©«³�c z―Ώω&Wλž@¦#ή΄y³΄j¨ΤΑ4ŒΨ±Γ]R»fMσΓ}Δησ,”ΎΟΎθQ‘QK�3ζsηόmΪuχ/*Ξ|ΰ»Rή(υ[DομΎΤcDόθγ‘ςαΠαΞ9σηΟ'ΉV˜Ρ_S˜@αΙ“§€vύΖί2λϋDyθΑϋ­ύ:΅ά―ΏΝ‘ή}žpΖQ«e‹ζšoͺerΆ±€ €@8 D §§Ι½ΈκΧ«#/=�¬υσσϋ•™³~qοN΄εή½zΘ}r~­8pο=e…ύ…˜(=Ψ€ € € €Ύ‚DΤqomΥΒ ΤiΥB- ۝ŽSΊ”όΚXŸ=ιΊΏΆkχnλ3=χώΒ… YFύ\+Ί¦�Ž …IάΧΧΨΜ –1CFλ0 ;z έAΔΥ«Iή·τ>{Πέ{φ˜Pδjχ¦—£ "jεE !j…Η蚺,_±R<θΡM«Φ�UC�€Nγ±έ½’%΅’έΗDΤΟ Τ«k>υ_ADέ�η_Όd©SaQ·Ρ@Ψ „JΡ;„xθΰ~Ω±-²Ulο;\ϊkΆ§X‰R„Γ偆Θ}$» blžΛ#}ϋ9έC-ˆθ&΄o€PΑ‚ζΞ£Υu_Ή²edκ€ρv7ρžζXwθ±ZΥε/σ §‹/:}uaμ˜Ρζ›;7:Ϋ4ΰX΅Fgέ½P―nω|Td`Ο½Ο{Yy³ωΝ{³΅žΫ| HΛΜ{_‹ξΤ’†νζ]‰Πήέklƒˆ?›κ’>ώ”Ο!έΣcωzl”j8Z&^m5ιώ…Mλρΐ}ςφ*·@IDATΜS‘ΑDŸ'`# €!,@1„—£€VαΦo²o3ίΞO*ΝWqύ†ςήΐχEΏδCC@@@Ψ +ˆxsνZ’3Gηδϊo €Σ μ){~tjδF κ9α<­Ž·ΙΜ¦¦Σ2§I“FJ›«Πι–΅i@aα’Εc733¨ιTΜΪ.\Ό ZqπΨ±γΦηWϊYVρbE±·lέκQΔDΤγ5ŒΈkχS91bΪθXΣ-kΨQ«%ΪM§RΦκŒ:³VzΤ€bƌFν£U 54©ΝD΄6˜?ŽŸ8.ΫΆνsηΟYEYΚ”.νTsΤ{όcή<3m²οi�ν1ά―ΡνͺΪ_ƒ;v촦TΦυ9²KρβŜ0©Ϊkw«]«¦5…΄½M«6ξΫ·_._ΉlMΣ\’xρ(!GwQ«HκlvΪτόzί:Uφ₯Λ—¬χŽώ[”>gmΜτΨ:  ˆ«@(}…·oέc?�&‘v\r#Ύψά3fvΨ†Φc›8iŠ >"ΖGx­Ž‰ρBB΄AΔhœ;ˆ8πΜ¬?t{’?Έχ}ΉΏ³9¦Π’Σ1 O>ύœL6Γ9rΘϋ₯ε-͜uχΒΈρδ•ΧߊlsχΡe­ά7ιϋo­μν}›7o‘6wuτς³ϋΨ―�λσˆ<�λ!{Υy}ξΕ~2a�dgέ^ˆΝ4ΝΝ/XνMεFw5C{―ύίxUtΊ9wΣp_Σ·[Ώ¬Ή·»—ϋΏρŠ©τψš³)ΆAΔK—.K“·ZΏ,8ƒ\]pOΣ¬U_μχšGEIοώφΊV²jžq $νcxE@ Τ"†ΪγzC] Bως¦zu9rδˆθΟΫ;vμ2?o― υΫβϊ@@@H4`uv¬ϊ¦ ‡―Ο…4”xΤTIwΡWΨN €4iΤΠ τύ½f™ζy§}ϊ_ύK–(.ϊο*Ϊ4ΈτΟeβ=-ΆR©Q£šF\·~ƒlήQ•KχιμtvΫ°q£5S½�―™3g’:΅k;aBέζ"ήXυ)X €n ‚ώ³v½΅l°,?ΏUΡR7ž={Φ„0η[ϋωˆ‹@R"fΛ‘SJ•.ηܚVB$„θp8 ΎΒˆ›7�—γǎ8}ΒqA…χuλβqkC‡!Γ>φΨζ^ΉVΗΈΟnΛ£y’ύ —=ζωΨ΄R%ŠΙ½οΝ!±κλξ9|ˆ5έ±ΏAvξά%O=ϋ‚5M³w₯=ύe¦Wϋεž.œ)›έγθ7¬†}ωΈT½‘Šϋ0gYϊaβ2ϊΛ―Νχ;œν:Eέg#«ˆ¨ιuOόqŠ |ˆΗτΛΞ€W4΄χ\ί')€½χŸ6ί¦zε΅7eΚOΣ=viσΡ‡{ZŽ:m²έθ~―h€P›N©|S­Ίφ.ρ¦<|ψˆ|i*~7nΌωφΥ §�Λ/<+έξιμ¬λ‚V›Ρ@’~ΛΙ»•(^LνέKn3%ψc*}ο},λ €„šAΔP{b\/ € € € €€[ XADSƒh7V­κT-tŸΗ^ΦJƒϋφ°ΎX¨UέΝΡιΆ yT;΄ϋιτΐxΤ¦cM›ρ³½+ΖW½Ύ†υλ[ύ΄’‘NΟl7wxπŸ΅λ¬*‡φ>ϋΥ$Œ�Z‘VF¬P>"\’Υ ΅*’6χρόυ·ί­JŠφψφk•λ+K‘Β…­U­Ά¨Χh³ υϊ~šY Ζ]ΝΠ{ΚhχΨZνQ«>jΣ ε‚…‹­e½Ÿ’%JXΛήvΦΖ«Έ«κ&wΡ{μω "ΖΆƒˆξqXFβ+ΤƒˆΉr硦Άο“ ’-αωκ+ˆΈuσ9zδ°gΗ0[[±dΎωΉ*’ ΄}kšƒjΤ¬•½ευZεΔa΄ b4sυšu2κ‹o£ιuΧγw—2%‹Gέ€-ϊ?ZQΟnΎΎeοsΏκq»vν–-ζν¬Y²H‘BEΏuHΘM+ύν7₯»χξέkJšŸ·¦h.lŽO›6­ϋΡ.λω΅r€Ά �GΫΧίN½oύfVlΩΉk—œ9sV , E‹ΆΚœλ/4 Hκ7>*Χ__I²™_Ά’i€ςό… ’&ujΡo^ωkκ«χ₯₯ΧσεΝcΎΕTP²fΝβ―;Ϋ@;‚ˆaχHΉ!@@@@ Y 3ˆhΓιηx… ²¦Ϋ΅§JΆχΩ―Z%ρΟε˝ͺ…ι�₯•fMšΨ»eξόΞ²χ‚DΤνΏώ>ΗͺžηέGΧυ³H7νui%ušΤ’!}z©\©’ΥυΜYDόέwq�©ΔwβdΔ”Μξq‹)"ΧWŽ8ή]Ρέ'ΊewΡΧΤΗφ±₯J–0SGυsΕΥύmοŠρΥ_±iγFΞ”Ο /vά½t_γyσΩκμ_³ΊΈ«U�ί°A6™κό΅ΫZ΅t>ΗuΛ–)m*R–vΣΟ_wši«μίοΣΫιΘ €DΤ[*ZΌ€δΞQ XΧ #ͺBdσBT£Ϋό�7(ςθΠ^ς*Τ/4lΪ�ο]«cό^@μ ˆΓCΤ0βosΙζ­Ϋ£ν©•Χ―-U*E”γŽΆ3;@@‚ˆ  € € € €!(AD7Cƌ$ožΌ’?^Ι–-›3ν―φq‡ρrη6S�ֈœϊΧ=FtΛ‹—.υ˜b8_ήΌRΌXQɜ%³@τwltAΔΩΏώκ³R‘»*ΰ. ³+ϊ;‡χvwΘΟ]mΠ»Ÿ;π¬ β­f&³”)RZ§ϊyφ/~§ΗΦ𦆡iΔ�ͺΨ ^]Ιb Ζh[Ύb₯U€ΔZρρ‡{ϊjwQΗnΤ Ύˆόοκ±)Μ«=}·‡΄ ˆ―@(υ #ϊ~�Ι9„¨"}yX{€—NLS3_«c<.*ΜV"†Ωεv@@P ˆjOŒλE@@@p $tΡ}.Ήj•*fv­ΘΏμP›Ξ$vγ 7Έ»΄l―o¬zƒ™½«@@ΗΕ%ˆθž2yΫφν²ζŸ΅Λξ”XADwΈP―eκ΄ιφ%ω|½ύΦΘiνΠbΓυ$s¦ˆ)"΅’ε~3½ΆΏΦ€qCS}2ƒ΅ΫDΤ :[₯ŠΜLky%₯ &jΣ ’»4Υ(�\ΎΒo₯Kw_–@‘DΤλχFLU�ό=»δB΄]4XΨφΞΦΦκΔISdΘ°ν]~_―Υ1~/ ΔwD ρΘε#€ €‘.@1ԟ ׏ € € €$okDTi ΕiPM§KΦΆqΣfΩ°q£ΈCz�ώ{EV�ϊΛΪΣ”+W�ˆwρΒΕ rΰΐA9sζŒ\ΈpΡͺΈ—*UJV¬j — bιR%₯\Ω²ΦρZ΅OC±iξ{ΌΦν)›υz£›ΞΪ=EΆ>‡i3~Άn±Fυj¦²ekωŸ΅λdλΆmΦ²―?άΥ½ƒˆv}δ5aĜ9rHΜٝ£½�Ψ±c2α"{•W@ Φ‘DΤ›σ#ΨΏOvνΨλϋ‡Ό-’ΛtΜαπμBύ"†ϊδϊ@@ ˆβΛG@@@’Ή@0‚ˆ%K—όωςY’»vο‘;wF«Z»f Ι•+—ΥgϋŽςχ𬀒=%πΏ�ύ+Ӧόv οξj…ΗO—yσzw1·rs­ZΦφΈ δΟ/7έdtO+εD~6$fΡ]ΡpΕͺU²ΗLμ«ΉοQCœΏΝωΓκVΉRE)V΄¨΅|δθQYΈh±―Γ£Bύυ`3σ³ΥR˜’ˆΩ²e•ς&δiΏ/t‡]1’"€±΅ ’ޝw/9† -!yσεw6!D‡‚…k @ρ s @@�ύΫ°@@@@ ι #ˆθ©>}Z~�cn΄7ή¬icI—6ΥG«!jUDm-š7“4i�XΛv₯DkΕλ"… IκΤiD+φmίzt‡Χ­ί ›·lρ:J¬)‹+fmK1cΖ �ΈaCgάΥύ%;wνvΦν…βΕ‹I₯ ¬Uw˜/1ƒˆ5ͺέdU Τ‹�©�˜7ίΊ>ο?κΥ½Y²eΝfmΦj“K�\f-*XPͺήPΕιΎδΟ?εΰΑCΞΊ.h•ΓυκJƌνξ ’†S§Im%ΥΝD΄·Γ¨ΊΎΐTDiO‘­Ϋμ¦!Δ•+WK™2₯$s¦ΜΦfw1]Ί΄RΗV3€Ο`ν3ωT«EΤ¨ΌΊb^Ξ_8/‹/u*eFξa \ Τƒˆz§ω ’άyσΙSψΐΎέί|φΜ_ °ΉΧΌrθΐ~Ω·7Όο5O²Ήd‚ˆΙζQs£ € €@� ˆ˜4Ÿ W… € € € ˜@°‚ˆφΩΚ”.%Ε‹ ½ωj2ΫΌe«lΫΆέΧnk›†«ήPEt gοΐΫ©Σ§Μ±;dΗΞ¨STκqeΛ”–bE‹šͺJ©œρϝ;'\\σΟZiyKs+@¨AΘ?ζΞsϊΨ5L7σηΩQ’NΗ« ZαρϊJ•$kΆ¬’&ugχ¦όγ±γΗdέΊ N%D{§UM±^I™2•»«Q‘B%}ΊτNuC½ξsηΟΙξέ{eΓƈ*“>65PX Ιfξ=΅qώΧ{δθQ9xπ œ9sV7lΰLΡμ"κxϊΎΠχˆ†9S]ΎΪ"jΕ―;wYο_!HΧΓv@ΐ—@8}έΫ@ α"&œ-##€ € @1$Ί € € € €$Y`νΝj¦QΞdΒz©MH/eͺ”rξμ9kŠeͺ96MCoZ]ο’™jYυ� θo, ¦L™RtŠζση/ψλ”ν2d0Σg0AΎσ!UΕOڙ2f4AΒε¬y>ΪΖ„vk«ΞΛ³ύΥ―Ϊ΄i­ΐb “DήΆω 4%τχΔ{@ ΄BCΦlΩδ°©h@C@@@ T*ˆ*χΟu& • ›5idu6eωŠ•rΐT@τneΛ”±*κv Ξœ5Ϋ»‹³�γhΣ " ΆAΔ`‹2α/@1όŸ1wˆ €$ip "-V\Z΄ΊΥLέ’Αš’εί�•ˆ³�Ï>n¦iI''OœΟ>αŒΣνΎ$‡™VηΔργ2ϊ³QΞφ„Z(SΆœ΄Ί­΅5όΨ―Ύ4SΔˆυ© š©b²eΛ.—.^”7ψ=>ƒωyΥͺ7Iήόω­o“9|DΆlΩ$λΧ­υ{L|vάΦϊ)UΊŒ\6�¨ϋѐχγ3ΗΖS GŽœ�υΎϋ­J 7¬—iS'ΗsΔθΧjeΛ•‹Ύ“Ω{τΘaΩ·oŸΟ~ωςε— +IξΌyΝ4J©e�ώ}²aύ:Ω½+κΤV>`# € € €@XD ‹ΗxMn’Y“ΖΦΏχιΙ4dΈyΛ9zτ˜UιR+++VΤLΩœί™ξyΟή½²bε*ΏΧFΡ/ ;@ ƒ€Θ$3‚ˆΙμs» € €@R— ’Vrλe‚ƒ©Νt,vΣ©X†Ό?Π^Υk&3]N^½­cώ3�’ψΑ χœγ|θaɜ%‹œ:}J>1άٞP +U–ζ-ZYΓϋΝW²ίήXκΞ»Ϊ›D-a]8³vΊR£fm+ˆζ}‚sηΞΙΈ±_Ι±cΗΌwΕkύΞvζڊ—°¦Ν‰λ³ŠΧp°#P½F-©[Ώ΅~φμ9ό#g_B,”,UZZίΡ6Ζ‘=*_~ώ‰G?–κvslqσήIα£δΐύϋε;σ~Υχ; @@@ ό"†�3Φ)\H�―\ΩηΏ'xŸC�=lξόΡN·LΡ[u¦AΔ`j2ΙC€ bςxΞά% € dΒ%ˆX­zM©Χ ‘ε|ΘL©2kζτ8Ut?¨»J^Simǎν2yβΞ�P "ζΙ“WΪ΅ο(ι�§s�έ_±^ύFR­F §ί… η­©­3˜κ’iΜ΄5ΪτΨοΏΤ©ͺ ":δ‰Ύ Σuπ!ΉξΊ΄²dρBYΊxQ‚^SZ΅₯Nέϊ1žγΘαC2ζ‹Ο=ϊuιzŸδ17΅iPX?Έrω²hEΟTWΓΘηϝ—‘%Œθ!Η  € € žΓσΉ&Τ]i±lΩ2’.mδΏ™ΉΟ₯�Φ°�ΐY»n½œ={Φ½+Κ2AΔ($l@ D "&C!L"&“Νm"€ €IU \‚ˆ-o»]Κ•«`1λtΙΗƒ\ΉΟύόB!ˆ¨•νnͺVΓ©nxεςI•:•Κςž�:[φμroχ­Ύ6œ?χYΎl©sΛ 7‘ͺ7V³Φ›κt£½ͺΣ9γ°@1harH³[ZJ₯ΚΧΛεΛ—dθƒΎ+}/κ{RΫE3ΥψΗ˞ݻ­υT)SΙݝ:KΎό¬υΏ�Z-ΏΜši-σ € € €@ψ D ίg›wV°`ɜ)“5U³Ξ¬’Δ3&xxψπa9uκt@§&ˆ@ ŽγΗa$c‚ˆΙψαsλ € €@R— bλ6m₯dι�>ƒvήΞ:­kžΌωLΕΏsq ,DΤPTž|ωδΐώ}±ͺΚ¦• Oœ<.Ξ_°.=.S3?ΡχYλX .Z8_Š-.… φιΣ΄y ©|}«�ŠεΛδίυ&“;οΊΫLο\άΪ>αϋq²sηφ(}Ω 1χΤ�uͺμ¬Ω²Κώ½ϋδΚΏW9U¬ϋθτήyΝϋβΘΡ#r.†o»2xΜΉ%MšΤ²ί<�@›V%Μ–-{œͺy¦M—V²gΟιαθyγ�OŸ‰žσˆωΗωΈ΄Άν;HΡ’ΕδμΉ³2rΨΠ€‡θ~Ι–#‡υαΐψqc’{€ž½“ 2˜*‰WdؐχύΎg΄‚bvΔ=°�€ˆtΑ2 € € €@θD gnWJ1ܞ(χƒ@� ˆ˜΄žWƒ@(D …§Δ5"€ €a,κAD 3.\Δ©ό§JΓwΪΟ7S³ 8Υ�SΧTφ»I�Ί¦]Ρo:Ÿ0Υ§ύ4%Jψλώ½$sζΜrθΠAϋΥ—Φ˜ϊGLAΔ¦Νo‘rε+šZη­άΆlιkΚ[g£k!s–ΜrΧݝ%K–,Ξ½θτΘ7¬7S!ο•ζ-ZY½Ώύζ«€‚fD<{φŒό0nœ9rHξκΠΩo±σ=χJ^˜T‹½ηΊͺΘΕ¬Y³ŠzhΫ»wŒϋuδΞ–J–*-Νoie…ΦR€Hqu*έ³VεΕ2eΛI±β%DΏu>δύ#i@¬ε­­%wž<މvΠ zZιnΞo‘Ιž½5ί^Oo…KG�Θc{εΑž½%£ žiΥέG«λi3uκΘη₯Χ³kη™:ωΗXΤτ^6j"™ΝsΤ{΅›Nόǜ_eν?kμM―š47Υ+9Χ οα“'OΚ”I₯E«V’+wσmόCς͘/<ŽΣ°λ]:šΐk~I}uJb}Ž—.]’Λώ΄B¨Δ°ςψ“O[=V�X&sηόξτΆ·Οœώ“”«PΑΌ—Š:οo=ίαC‡dΒγbΰμzίύ’+Wn9~όΈŒώt€s�˜ισ„™>ϊ:9{ζŒ™zΩχ³�ί¨±άtSuk(­πωη�ΕΞ°žlu[k)R€˜Ηϋκ’ω;ϊΧί«eξοΏ9}Y@@@ ‚ˆ‘ρœΒρ*Ν?‹XΝυΟ@αx›ά$’AΔD‚η΄„°AΔ~x\: € ‘DμΠΉ«(1 «χσΠπŸVCΣV³ΦΝrsέzή]œu ž}6j„œ99νJΟGLU΅τδΨ±£ςΕgŸ8}£ "ήkͺ΅ε0ΥΪό΅νΫ·Ι€ΎχΨ]°P!iΫΎ£$σΨiVΜKmwςΊiΣωΙ΅έΩΆ½+QΒZΦ°ήΑƒ¬eϋwrϋφ­ζŒ·vέέ±³,TΨξευ” ~:κγ(Ϋ}mΘgΒ€:ίγnσξ§AΎuk�ρΨάΡ“Ώ@AmφΚεΛ—εβ… ’•ϋΌ{jΤιžnV(ΟξούͺΥΏύzŒχfΏλv%ΝΏ�Zeή??;ύμνϊw!{vίοﳦŠ€;ψλμgαΑ^½ΝτG™­Š‘z<-UΊ¬u?›6nˆς νa4©UM½�^Ϊϋυ΅ςυ7ˆ‚΅­_·VfL›j-λq=Μy3dΘh­ϋϊCΓΏΣ¦Nφ΅‹m € € €IT€ b}0Ιΰ²"&ƒ‡Μ-"ˆŸS#’CτΑ%η˞<}ΆΜϊmžυ‘π‡οτs(v›iςήρ!mίΗzHρ’ώ?Πub@] ΤƒˆZu0½ 61‘#:XΓm£?eΉ^2•σtŠ] 8uλώ ^�©Z-Z kΧόm*ρ—ͺήhMΣ¬μΩ½KΎ�n¬σLbDl`*αέxS5λψS§OΙμ™3dχΝVΉF›JSΕMۏΖΛΆm[­eύΓ겆«ζύ1Η„°φ›0UU©^£¦G°-Π ’ŽεnΡέaΌα}ΰL ν>Ύ λ΅7‘=mZ©qψΠέ»}.k…Αޏ=.©�VκΫΊu³,]΄Π„�•κ΅jK™2eγΌ+"Ί―I+0κqǎ“›ͺՐ ΅r`D@ΡΎή\ΉsKΧ{ο·ΖΫ²i“L™<Ρ[Z΄ΌUΚ›γ΄ΩAE[ÎΪτž~�υ+$XΈH«‚£†3΅Νώy†¬ωϋ/k9Ί?z?ϊΈ©ϊ˜Ξκ’AΎU+WH:S}σ†›n’R₯ΚXaΜ ¦Jηπ"νΚU¨(-[έf£ZΉo©Κ—ΛLλ|sέϊζ½™Χ9₯w±Ϋ}HΞ\Ή¬ύ:=ς‚ωsM΅Μ}¦gsl]§Ί’V6\Ύl©3Nt vΰΠ_QΥ©”η«m[·H‰’₯€qΣfN•Q}ο.ϋsIt§pφι{C«“jΕO 7¦KagwΠ ρtt�]Ρ}ηtΖ9Ίχ‘ϋy»+xΦoΨΘzι8jφλ/?[ηW³&͚[fZαQΜZU’† € € Cγ9…γUD Η§Κ=!t"&gΑ• *CεIqŽΐχ“¦Ι –X€~4ΰ5gϋφ»eΐˆύοΥ]Κ”*ξμc!aNž:-»vο5䦕R%Š&μΙ@ μB=ˆh?ΦmΪJΙ�₯­ ⇃Ψ›­ΧόωσKCΤΆdΡ"Ρ@œ»υω__I•:•5•±{ΚήΨνqtJθ]a3=W–,Y₯ϋƒY‘Β“¦’ΰgW+ κTΎ­οhk]Ξρ£Geτη‘•u£†ε:w½Χ©(˜AΔzυI΅5¬kΨΏo―UuΡZqύaWΤMή‘AW7Ε[ok#eΚ•³ΆιTΚξ Ί±NύR£F-kΏχ˜:uΜ9εδ©S2mJDΥC«£ωC«=κTΚΪf͜.�˜P©6žY+έω ¨υμmͺ[fΘ ηΝ“Γ†Xύ΅Z£NΧ­Ν;@§A·;Ϋ΅·ž—W―Zeυ‹ξ OjθR«^.Z0ί£kwS)3›©”ι=ύυC½•Œ™2ZΫuϊoοJŽξŠŸξ bq3υζϊ΄i nΜŸyœ/½ΉΧ‡z=b]Ώ»2¨G'+1΅BγΗ ρ˜�Ϊθά±c»L?ΞΗΘQ7υyΒό½»R΅χκϋ@«ΪΣZ«ΧΤΙ“dΛζMv+<ͺηΤΆxα‚(ΣOλ½χx¨·υwZϋΈέ:tκ" �Ν&κΊ-Q’”y?Τ±φ͜>ݚ�άZα@@@$/@1Ι?’°½@‚ˆaϋhΉ1’„AΔ$ρΈBJ€ bH=..V"&½χΑ7γ'ΛΒ%Λ­m‡Ύχj�»@�@ I $‡ bL ‹ ϊεΙ›Οͺ€φΡ‡ƒξ± "κΤΊ:Ε�Άωs�°*Ϋ9]]Π@a^sχΘ-o»]Κ•«πφξ@ͺςλγψ‘»»»SQ@)₯₯‹ °Ε� "*’(* RŠR‚ˆ„�%έέKΎΟy†{Ή3;»μ²5»ϋ½ολΞνϋάΟώ.ΞoΞ±{|3aΌ©ΚΈ#π0DΤγtŠ‹ ’Ώ΄Κ\ΪΛΨ/³MΕ»έ;wJ‰’₯€ήwΨΊΞΐ΄κd`ΨΣΩζ}u*=jΚΓ‡y7ΉσυyΒ^70ˆθξd&]ϊt�³W_»eΙβΕ2oξovώφL…ΛλμΌSυP4ϊΠ£ένzo ²‚©FxΧεj„ΗMΰqςί… ΪƒbαGmSέπFSR§>|ONnμh»Ξϋ#³i]όp·6˜η ΤέΩΈ‰­ ©ϋj[cmΑ8΅hΩZJšη§S`θ.p_gωjAΔ`­ΕυΨ^?)ZτΠ‘ƒςΩθQΞι"}u�₯;νΨΎέΌηfΪP₯.{Ηv6L>1\WΫI[`·οΨٚhPqγΖυ²pώ9qς˜T©RΝ†K΅§3yΫk{[xλ½Lϋi²hp˜ @@@ q ,X@R¦H‘Έo‚Ρ#€ ΰΈ`ώ;όξέ{»�’…˜vΡσ‚ήoέΥ‚ˆήΞΑ�qƒˆΞq‘½2aΞΆν;Ϊ]–/[&Ώ™Š‰ή©lΉςr‡ $¦σόA=΄:δΔo&ˆσώΣVμ“Ύ�Ξ=΄\ω � a#σ;yψΏ[θ3Ÿ6eŠlΫΆΕݟ@@@ΠΘhΎ ˜3GφΠ(#D@ Ї±_œβξAwΣ(^r­μ‹!&οϋO�Ο>θ†d΄’ bˆ?l Ή}<φ+Y»a³hΈΟ™2dH/Νί!unΉΡYεΎφzκE;�ΨÝeΙ²eΩΏ«Μ‘gέν₯J“u ͺ[Ήf½ :ζΚυΏ,y―wψθ1ωiϊ―6„¨ΤSυ/^½½_ςδΞιŽAg†½ϋ‰lΩΆC ζΟ'ϊ™j$Σά?Ϋ6Μzo»ίΈ "Žώβ[YΊb₯δ3‘Γζw7” ίM‘cΗOΨ‘έZ«¦άΧͺ™;Κ)ζ>›·ΠΟVƒŠχ4m$·ή\ΓέΟ;£ηzgδΩ·� ­£Ϋ²fΙ,wΤ«-Λ—‘ΑΓή·»Ώτl_ɝΛ½V'ηΊϊLΏψϊ9n>°w&m[wC΅Κ�Ήύ½Ξ*ΏW=ζKΣnYΓ€ή©D±"ς@‡ΦξΨΎš8Y˜–ΜNš_χu>@WΓηŸξγ=œy@‚ $‡ b}S�š©§“Ά>vμ˜μΪΉC΄Ϊ SεO«ξΩPW *"Φͺ}›ά\λ{ �4_D‰xΊ$‹.” /Έm—#kM\»N]ΉρΖ›νιβ2ˆθ―VŽ»h~ή·o―»ΊΟύmu?­6¬°»γε§"b° ³―Σ;πώ{χ}�­©­yχνΩcΏύ©Υ&Oœ8ξΆT Ζy«j{f­~θ΄ež7η7YςΧbη�~―ΩMσϊjHα"Εμ{A«:Σ¬ΣdεΏ�8‹A_ ΡΠ_{χw1ηΞ];δ˜ ž0σ ’2eΚΩc ’VΤϋΤiύΊ΅2uΚ$;ψΓ±π::ΥέΌΗjΕ@­¨Σ΄©SdνšΥήΝAηC)ˆ¨+5L¨ΣζΝ›L˜pbΠ1λ~EŠ7mχΫχ†ξδ 1FTΕQƒ ϊΏ Μ{=s–,ξ³Σ�=j€ψ]<θΕY‰ € € 2TE ™GΑ@@b(Υu—Μ�₯H¦QD½w’σύ'Χ{·>� ˆΒ_+ζ½ώζϋrΪ|xΡTΎl)ςσn¬� v±H‘²}gπΦ^Ω²f‘Χ_π}¨ζ«Ήυ�³‹wο*eK—p6Eϊκ\ο†κUδοε�έW?œΣ`€ŽΧ™^φžμήc*τ™ β«}€:ΫτuΦοσεǟ|UGήφŠ»).ƒˆο2NV―Ϋh«ž7ΥwτC@gς‡ )Ϋwμr6…{U‹;΅ρ[ΏcΧnϊΞΗrή| lΊ©Fuωs‰―ΪΝ §zΉ•/―ΥI―ρύ”ιςλœ?‚]Ξ�Λ™#›Ό2ΰIχCO]9oα_6€ΡAb|ιΩΗE+$Ž?Ρ„]ƒ(�Ϋ?ί?’Σ°@W 9~΄‡dΙκ«.όωg£ε@@;·Ί\ ‚ˆEMͺUΫvΦuα‚ω²hαΧ8²™&ΝZˆVvΣiάΨOM˜κ@Έέ½Υγ"ˆ¨•‹™ͺ„:i‹`mΓ8y[O―XΆTf�:+p—pΛwλiͺ+f1_θ9'ο+άv]‘­‘΅’7Pη­δ·ί΄IώbάΏc5$y_ΗΞv]`QWφιk“©SΙ¦lUςЦR₯χό~' ² Ώ;ΧΏ£‘T©ZέnJπςξ¦Ν€\ωŠv�Ώ�ϊSζΞωέο̍ξΊ[*U�bΧ9AD]p\ΤυS±β%₯ekίο΅ή bγ&Ν€|ίυ>=J:x¨4i~”-λ ?Žόΰ]9mΪN_mŠ― b₯ΚΥ€ξνυμpΎŸψ­μ1­‘'ΏLΕΘω—+Fκϋ#W�άφ}ͺοΧ`S;ΣΊΊ i]­ΣW_Œ³Uƒνη¬ΣJŸχη'ΈpαJV"±ή γFψ ˆ�ζQΎβΠۊz@ρ’…εή¦wšpZYΉv½ Š={Ξ«Λ}-ε¦|Rκ '¨σ8μάξ^Ρ*ˆ�Ϋ*cΗ+'OΦMvύΝ5―³σϊγΙ―IΨε}k›Š~Z7w·E6㽞VΓkrg}©eΞ«Υτ¦LϋEΦ¬ίdϜ9“Όρ�3ξ©�5`ADgΚ•ΆΥ ³˜±k[k ΧM�u�½/έ'O�œς@ΗΦ’‘O 0Ž5ΑΌ3¦ΆNύ{?"ZAΠ™^~γ[ Q—υyΆlv—­ΌΈxι?ςΓO3όB±DΤ6Μ― υ}˜¬νŸ;΅½GͺU�`ΫH�μΪγ«.Τ ξ-v,Ξ8ϋ>χͺh[H}–ϊ¨yC59~ό€L6Ος―₯+μnNΠR«tž:}F&NšfC¨ϊ‘Ή>ΤΏh§OŸΞ9-― €D(‚ˆ={\�›ŠΦϊ…„wίζg‘3g.ιόΐƒΆnLZ3§J™Jz™κvϊοc­Βχα{οψ]Gξht—δ7-€Οœ>m[ΗκΊ +ΉΥύ‚΅0Μ9‹­θ§ηΥ).‚ˆ5jή$·Υ­gΟ―΅’ w�Κ}tοi~·HogzΟ„ ΅šγΥ¦-[KΙ’Ύ/Β,^΄P̟λwˆ·z‘7(¨νλΥo`χύgΕrωuΦ Ώγ΄ς`‘’ΕμΊ`AD'ΈvΖ3fΜ$»vν’―Ώόάο<·ΥΉ] šφΏηΝ΅­§½_‚Ρ{χνgͺ2¦6Ώ‹—Q}ΰwlΰBλv€HίοžΑΒ�έλ#2d°‡yƒˆΊt•Ύ€œ΅JβΣ/ ±Δj;ΰa― p6ΉAD­\7μΥημ‡—ΞFm ¬8�7­yκάΦΩ$?N)³~›o«μΧΛmΏλξΑŒ7ˆψδcΩΠ£wΧ‘£ΗΛΏ«ΧΩUŠt‘DlT�6iaΪ3{'ύnίg_±! 'ρ+u?m½<ΰ•‘φ_Μωσζv[oΨ΄E†8ڞͺX‘BςτγέΌ§ohP7ΔFρυ7?»χΨ@αkƒϊΩ₯χ’Ο½ό?;^ύ€Τi}­ΑΒΗΝύιTΉBYΣΒ»“χoΪ58pHJ/"ΝLkpg�υ˜Νήs9ΫxE@ΰjΙ!ˆΨι~φΊ\ιlΣƍ2ϋ—™Ά…«†άΡH�˜ΐ—N1 "κρήͺxϋρ»oδπαΓ’‘«:υκK±bΕu7σοσύςωXίο&Ίά­G/ɘΙ6Ϋ΅k§Μ˜6UŽ˜γt|w4ΊΣmQ¬ϋΖEQΟλTζΣω ΦΙS}NΗ�‘�-[ΉaΈ-�m–ΎϋVw»κ€―G»?fGΡίγώY±Μ†/]Ό$7ίRΫ΄B�ιV†φ³fΝζΆSΦg’­‘Χ­]c*'¦“¦Mο‘’Ε‹»ΧDΣ–»mΪwpχΡ­Ί·uΛfΏuMM―Μ劁Zyqςί›ΆέGE―_§ήνξΆ¨„�t�jάhΟ―Ο~ϊΤΙ²{χn€kΦβ^ɚ-›{mo1W.Θ{ «λ ο}{χΪΰlΣ&Z�NαLή ’�{π‘n’-[v»y§ ιΝ4NϊΎ)Y²΄άΥ€‰€K—ήnϋΣ„@�Ϊ A~ΔWQ/έ³O_I—ΦχΕmM­ν£0θ½-ΫHρ’%폛Vά£F^ ‚z+fκώK–,–%¦bbΨ™0)oώΜ4jΤΨ0υΰ™Σ§Λͺ•Ύ/σθ²S₯Sη΅…ϊœίfΫ?χΪΚωs\Μ9u“m“­cbB@@@@½ΐ%s)μD+‘ή€ωβ’ωRBŠΐ’ϋύz°œ€"†θγύ~Κ ΣRΧΧNοω§ϋˆ†Ϊ§qΎw[ωΎ5xω ΟχΆ tͺΦχδ@Sω0μ¬ Δι΄ϊm­θLΞυ ζΟ'ϋ?ξΠ'OΙ3/±λ«V*/έΊϊ>” ε ’Ό7τεpχ’U{ί�οh* ήrγυαφqZ\kυšw†Ό`·σγT™3�O;ο z~ϋƒΡ²qσ–pϋ\«SŸg^Άx*™@aΟ€@‘^δ·y‹L%ßνυ^~ξ 7xκlφ}8�aFύ`σݏ?“΅¦EudΟsζμy2ιηYφ4ή°β΅8iΩd­ά¨“ή‹ΆθœΞ˜Š-ZΑQ§:΄–šΧW΅σή@€�Њ›Εвmo«u₯jέως‚ˆ^ ζ@’+T‚ˆMšΆ²εΛΫPΡ;o ΗP­zuΡVΌNυCέA«/_ΊT²eΟf«ί3΅χ<΅n=M₯B;tθ |6z”{Ξ�w³αΉˆZφήΫΊ­5­ƒ½‘( Iν7ν`§N™d«ΦΉ'»<£•οiΥΖmί««΅•τΆ­�ΙΒωσm›Z]§‘¬={vλl΄¦–mΪيŒΊ ζ£'«Z­ΊάZ§�[IΟΉ€Ž}·©ΤψυWγUΡzΥΜΪϊΩ�Σpΰ_¦Š]Φ¬YECΞ_Γ―΄Ν֢ĭ̘σ(θ^KΗqόΨ1ωrό8·�βbs­ή8y«S�_ΏN¦Nώ1p»¬O}ο8AOg'½–†§Nžd«$:λ#{Υ``“ζχΪΰ ³ŸzοάΉS–ύύ—i ά��ωΑ»rΪ½“ήgc”#GNImͺ jeΖ-›�“ysη}DΤγ΅κdΣ:‡i+μ}Ώ©ηκΥ+ε—™Σ½—Ήκ|ί~OΫߟW,_j*‡ϊ~7Φƒœ€bDήξ£|Ԑp£»ξv+‚z¨Ύ~0UE5ˆl�Vη+Uφ Žκ~j�ήsηόμ0[5±�©`ι΄Όvv�ꦍμŸQg― € € € € € €@b ˆ’OJ«ξiυ½τι�Ι›ƒεΆ»δα#νΆΆχ4‘Ί·ήdη``ΛfwJƒΊ΅Γ;πΥa’aΉΨ"Άj~—Τ―sKΈλιŠηΏ)‡›6sY2Λ�½ψ΄έηZvz`BΏŸ2έTͺόÎ?*??ίίΆDvξ5²ηΉtΕJωτσoμicDά±k·όί[FeˆvŸ¦&΄ΪψrhU?ύα§2gΑbϋ!ͺχ$ښ―Ρν·Jγ†υόͺΈDτ*1 ]€DŒκ}k•½Όωσ˞ݻ‚£zž¨μ§Χ*\€ˆ©~xΐωv…ϋw{°shX―DΙrτΘΡpUΰ‚νλ΄΅oα"…m nλ–-6œΧΙ”)³h[ένΫΆΙΙ“Ύ/d\νΌκQ΄x1“.ΩΌyγΥvw··jέΞmα<ϊ“‘’Υ#›R₯L% ²­yχ™6ΝϊώΈΦIÁEL{蓦šβΞ;�υ4ξq½ϋφ³_ΐΡφΡ_Œγ�œΡ dΆμ9’εxŽ„Z.P°/QΒΆΕ>dŒ›M uoΥЈΖ₯ο2eΛJδ<αΌ¬_»6ΚAέτζ ?…ΜsJŸ>£ωσΉΓŽ#Ίλ@@@@@@P ˆ’OhΔGceέ†ΝΆΊΖˆ7^ :Κe�¬–Qγ&Ψm=�E*^n‘›PAΔΫo»YZ·Έ;θXϋ?o*"š–ƒΪbZ[Mλδ„σ΄²ΰ«ϋ…;nϊ/sdΚτ_νϊχ‡ωͺϋιBB΅½²ΆYΦI«Mf͜ΩΞύaΚξήzs ϋ vΝΪf/’ηωΛο lPΟ<ˆu'm½­-Έu*[ͺ„T―RΡΞGτ£rΕr’+gvΏΝZUρ?�–V­•­Ϋvڊ–Ξ7Υ¨.]Ϊϋ*κθ:‚ˆŽ ― €Χ"ά‚ˆΧbΔ1‰K@ ]Ί>dΏΈqδπaσιΗ!{χš*˜E‹·m…gL›*λΦ�ρλΝ΅jK-ΣΆY§•�ώ#³fLσΫΞ € € € € € €*@1Dί'ύ,ΏΝ[dG§!= λN_}7Eζ/όΛ�φΪΫBW*ˆX€pAyΆoχΐaŠΆξ7h°]_ΉBYιρP';?ψMSυqχ^ɘ!ƒ }υΉpǍύr’ό΅τ»>T‚ˆ[·ο”�½σ‘SϋVΝD[Geš`žΥΌΛΟ*’ηωΎiΗ½Ϊ΄γΦΙDΌV§ήOΏd«U([Jz=zT†ι>+V�1ΑΧ―ν9Σ¦M#oΏώΌ»?AD—‚@k ˆx h’΅nΉUJ–*mΫ,λPtšόγχ±VΡ1.nΊBΕJrΧέMν©΅₯π^Σv{—iƒ#gN)X °€Οήέφ٘Qq^Ε3.ξ‘s"€ € € € € €Δ½AΔΈ7Ύ¦+¬ΫΈYFŒk-W¦€τιφ€ίyΞ›juύ6νΏ.H`(,&ADmχœ;Wτ»`$ Ξυt—ύ“‚ωσων=nΒχςη’εvVLΤΚ‰:=^ώ]½ΞΞ�οεg%S¦Œv^\ΊtIϊz]Ξ„…Ωu‘DΤΆΕ}Ÿ{Υ†ρ²dΞ$C^zΖ³33ιηY²ιΏ­’ΕTK|δώφvυΚ5λεΓOΏ°σΑžηΡcΗeΐ+CSψ―Υι₯�.ϋ²•x΄EtΆ¬Yάσ댢‚ώ}Ύ/μϊθύχIfs?kΧo2­§ΨύΪ΅lfί ήƒ†ŽψXΆlΫaΟωήΠ—έM_Nœ, -±Λ―ΏπTΈkΉ;2ƒ €@‚ˆ)0ο‰@IDATAPX•(Ίt}XrεΚεŽ}ύΊ΅2uΚ$w9Tgš4m!eΛ—pxPόeζLY΅rE„ϋ°@@@@@@ y D αηο΄.Φ!V1­s΅_φlYMΘm›|4φK9yς”½7ά§+œ``ΛfwJƒΊ΅ν>ή_&GŽ“ΒσΛsOφt7}<φ+Ρͺw:=ΥηQ)^΄°»-²ηzΊV~ιΤφ©q]9eZ1�0e†,Z²Μž!}zΡʍΞ4sφ<ΡОNysη’ή&l©•wξήc+ονΫΠΩUB%ˆ¨rZCλΌ†.{€³}.Άχ£?J/*ύz=lηυ‡γ�σU+——ϋZ57aΕLςοͺu2zό·rξά9έd'oEΔkuΪΈy«ΌύΑ§φ|ιΣ₯³•(K—,fί7 �Z梁N—6­Όυϊ »Ÿχ †>ΡσA)/―h›ζ…‹—Ϊ{אh>Σbϋ…Λ-Άυ@ο5h©m›υ½Κ„ €@T"FE‰}ƒ@έΫH‘Β…eΗΆ­²ψΟE¦2ψ™Δ0l;Ζ’E‹ΛmuλJ–¬Ω$MšΤrιβ%ϋ₯ }{χΚτŸ§ΘΩ³gΝ½0P@@@@@@ψ ˆ�ζQΎβξ½ϋdΘΫ#E«F4.Xΐ„ {ψmv‚Ρ ">1ΰUσ£/ wΛM7HΗ6-όΞΡ‚s= žiΐ1’ι‘Ξmεϊj•έΝhΣͺŽa|¨™'WN[ΡO₯ ’V„τΪ›’U )EŠΆŠ£³¬U*υο-ΉrfwVΙϊ�ɈΖϊνηn43Βά9h…Ε=ϋ˜ϋλ`ΤͺŠΛ•–Z7^/Z₯Q'oρϋ)ΣMϋΰ?Β΅ή±k·όί[ΪύŸθωhυΏθNNd­ ψζΰ�ΟbΜψ‰²μŸU~!== tΙβ�΅ckΏ žs" —jΛνcΗO8«lɚΧU•ŠεKΛθ/Ύ΅λ½AD]q-NΞζΜ�S~˜:Σ―β’nΛ“;§thmΪπ•.αμj_5h©χ¦FχNZ ±s»{₯D±"ήΥv~φά…2yΪ/ξu΄΄ΆifB@ΰj―&Δv@@@@@@@ ΄"†φσρ†Ψ9&Ε m›“΅U―†£:yƒˆN+h $κxΛ–*!Zπj“^w³i9ΣTΤVΐ±59―vΎ)SHšΤ©―Ά[ΠνZΕpλφ’7ON;φ¨Ψi«γ ¦BbnSυ1ož\φΌ/�7Β ’sα˜8ι±6n±ο"… DιΉh{l­Ž¨‘B=&uŒ΄‚η‘£Η%[Ά,Χlκά/― €ΙC€ bςxΞά% € € € € € €$]‚ˆIχΩΖ۝ "ΖΫΕ#ΉΠ¦2γψo'E²‡�&oΥE�-ρ³• bόŒ„« € ΏγΧ›«!€ € € € € € €±-@1ΆE“αωB5ˆΈrΝzχΥwQz"ZΕpΘKΟDiίΈΪ‰ b\Ιr^@P ˆκOˆρ!€ € € € € € €‘ DŒά‡­QΥ b†R»D ©ΗΑ`@βQ€ bΖ„ € € € € € €D]€ bΤ­Ψ@@ "Ζ*§D@@@@@@βQ€ b € € € € € €ADή € € *@1AωΉ8 € € € € € € c‚ˆ1&δ € €1 ˆ=ŽE@@@@@@^€ bΒ?F€ €$k‚ˆΙϊρsσ € € € € € € "&‡Θ- € €‰Y€ bb~zŒ@@@@@@!ˆΘ»@@ A"&(?G@@@@@@b,@1Ζ„œ@@ &c’Η± € € € € € € €@Β DLψgΐ@@d-@1Y?~n@@@@@@’€AΔ$πΉ@@ 1 DLΜO±#€ € € € € € €"y € €$¨AΔεηβ € € € € € € €@Œ"Ƙ € €ΔD€ bLτ8@@@@@@Hx‚ˆ �  € ¬"&λΗΟΝ#€ € € € € € €@ ˆ˜"·€ €$f‚ˆ‰ωι1v@@@@@@@@„ "ο@@ ˆ˜ ό\Wΰ•IΛ{šΛΎύδΕ—_“y ώp·]λΜυΧU—ςεΚΪΓχ8 ³~™}­§β8@@@@@@ d²eΛ&§OŸ–³gΟ†Μ˜z ϊ pύ \W,ƒ=Ηή£ηdΧ‘σ1>'@@ψ ˆΏήIωjE ’Gκ*₯K•’B H¦L™dΟή½²cΗN™1λωa�”€|ϋ1Ί·reΛΘO?NtΟ±tΩriΧρ~wωZg>ώπ]Ή½n{ψž½ϋδΆΫ^λ©8@@@@@H0B… K­[n•ό JκΤ©%EŠv,/^”γǏɌiSeηŽ 6ΎPΈ0AΔPx !8†ͺE�Kωι#Ωρ3dΕΆΣ ό»±dF™ΦΏ€獧€ι[›#sRؐ9]Jy¨n.)/­”Μ›N�₯N!Ϋž“MϋΒδ‡ΏΚκgbt›³§–Ίε3KMγZΉp9α’l9pVΦμ:#οΞ:£ss0 € $… b³ζχΚμ_fΚΙS'#ΊMΦΗ±ΐσž‘νΫΪΏψEt© 7J·ž}d» &ΖΖ”?_^ιΩύQ{ͺK—.Ι�†½mή§bγΤρ~Žΐ βς�H›ϋ:ΗxcLΘ @@@@@@ žθ�ΜUGρΧβE2ξ—Tw ˆOφ™&yεiσΟ‡³Κ ‰»£uεχ:’ϋj启–^ŸΗΞ§‘ `ξΐ�R©PΔADηΨ#§.Θ›ΣφΛΏΖMH­\ώtφRλφ„9—τ{υ�άtJξ~3ι{4Θ-O5Ξ+Ω2¦τ3pΞ_=χ <χMτή[ΞρmoΜ.Γ;²αFgχυΠΙ ςʏ{δ󇽫™G@ ΖI!ˆ¨ρ;sFζϟ+�,_cN='ϊτ2ΐG’tΠ–­[εžVνc%0Ψ�M+yνεάλΆlΫAώ]ΉΚ]Nl3CΏ" κΧ“°°0yα₯Χdφο1�‹2AΔΔφ.`Ό € € € € € Lΐ "j;ζ½{wΛή={%uͺ”RΆ\Ι’5«=D«#~ύΥxΩ³{W°S$ωuγρό ²{΅/M °w…NΡ98WΟ•Ξlœ½F5ˆθ .ͺΆͺ™M>ξZΔ^β³ω‡δΙ/Γ�!M.AΔυsΙk­ 8ά‘Ύ~hB‘ƒΎΫι>ŸΊ;―hPφrΥΨΐΝξςΕK"Ί]&-=κ�c@˜ $• ’γ°gΟn™9ύg9x nΎ¨α\‡Χ+Λ—,”L3Ί+–―ψWζΝ_ {χν“š7\oΓu™3gv·ΏϋώHρώ‡ξς΅Ξ$΅ β΅:DvAΔΘtΨ† € € € € €‰Eΰώ‘Ε‹ώ5«Γ₯θςΐƒ’+w{+›L‡�Ι?~—Xn+VΗI1V9#?Ω`$λneΞ•0b`qΒ’ΓςΨΈψ­ˆψΛͺγςχ§a›Š|©L[ΰ΄r[ΉΜ’!―ίΉn|kϊ~�Γ]Φ™–χ4—7^Υ]·θΟΕ�Ήkψ ŠΧ_W]j\”-SZ2š`γζ-[dέΊυ2eκ4χXΙ™3§Τ½­ΆΤ­s«4i|—»νγOΗΘƍ›δπα#ςϋάyξϊ`3E ’;έa7ιϋeΜΈ/ΒνΦ©C{IŸήW!|ΖΜ_ά–�+T[jέhχ?xπό0iŠh›θΫλΥ•bE‹HΊtιleΖίηΞ—C‡…;oD+ξkΧF2eς:ωυwΡꑁ“ŽϋΦΪ·X£‚ Θώύdύ†ςΗΒE²qSψκδΑ‚ˆ₯K•”ΫΜ9*Uͺ(‡–�])³›+U*ΗΛ2 € € € € € Χ₯K—•fχάk/sδΘ3κ£p—L™2₯άή ‘,TH2fπ}v6L<(K—ό%;vlwLb[A1žŸΨ{] Λ}7gw―QΐNwH¨’^Ϋ[±ύ[eΦΚγΊΪo*˜=΅|Φ­˜\_,ƒ]φό%©2`­8qΑoΏk] ˆθ“{¦©iιm*κ΄εΐY©;x£hΠ;iXρΧηJ»ΑΠηMEΔ¨ΆΛώ�Oq©WήW!hΣΎ³rΟπΝ6Œθ=�ΓusΚν Ί«zŒέ!ί,>β.3ƒ €@L’bΡρ8zτ¨ό:sΊlέΊΕYΕk, 4k�Xή:Δ=λ/Ώώ&=zχu—™ηžξg„9μβΊυdΤθϜMφuؐΑ�’ySΏuΞ‚μϊ==@V―YcWuΌ―­Ότό@gsΈΧ#ζΉΧ¬U'άzοŠ�]:Ι€gŸrW5lά<\πoΓκξvοΓή²Λ/zN4€¨“ ‡ΏϋΌόΒ@SέϊΚ—„œmχ{F4x•iύͺεξ9Ύψr‚ΌόΪ�ωφπƒχΛγ½zšpdzΏυΊpώόyύΩη2τΝα~ΫƒˆΏ�Azυθ淏.lί±Szτz\τΩ0!€ € € € € €‰I D‰’rO«6vΘGΜg7cFβ7ό HλφM+ηT~λ½ ΎχŽœ9sΖ»*ΡΝDL€G•0bB†•$*ADέ―Xξ4²ΰω²nξΑQΫLΫήc’9]Jij*υιtψδ™ρoψ £έh~Τ(‘AJησUz™»φ„Ξ™ΦV\lP1‹΄¬‘ΝξΆlλi5砝ίwτΌΜ^γ«QEΔ•2Λ­e2KΞΜ©dΣΎ0YΌι”,2�\m�@_΅’€rατΆς£»rϋYΌωTΈπŸs.ƒVˆ<~ϊ’L]qΜ�ΎΉTF©k* Ξ‘FΆ<'kv‘)Λ}ۜγ’ϊϊcίr[ΩLvχΨ#οΝ:τΠρέ‹Ι]U³ΨmγMλο>Qhύ]±Pz™kͺ-:ŸYίώεsΏΑ¦―+&eςω>tώδχςαlίσΆ/λ@ˆŽ@R":Z’}ήοΏ™Šo'UIβ5eΎ4’ΎmNΉΈηœœω6κ•χbσ桊αΧγ―„ 5χϊΓδσρ_Eω2zΌž'²ιΤ©Σr{£»mπ/”‚ˆ:ζ .Hͺώβͺ›΅ r v―‘ϋ?ωΈt{ψΑ`‡ω­Σκ‘O>υ¬»ΞDtWF0sβΔ Ή΅^C*#FΰΓj@@@@@M;7‘Š•*ΫΑ­Y΅R¦O›κ7Πn={Ϋn\Ί2,μŒ5UO>%Y²d“9rˆVKόθΓχδΤΙΔύY"ADΏΗ ‘…:„¨ Q "κΎΣϊ— γι4τη}2δ§}�°r™Π³˜]wξΒ%)έM„AΎ…/”‘²&¨Σk“φJ£*YάσΩ•?v>'U�³kƒˆŸΞ=(ά_DRϋΊϋ©Ι>Ÿο: NŽθ\HZ\ο >ϊh™0eί/vΊACοφΕ/••R&ˆxΙ΄D�cZ"Oy’„d7ν«§U;ΟHwSIp΅yΞ€!Δr|>?ώ}4Š“ή βH8qχU/σ?Sεπ!SνP§Ώ·œ–F�ΫtΥcΨ@ΨHAD5 3ί`š?�ό³|Yl&Θω4„˜‘sI‘!₯\e―ίnΏRVŠηNkΧν2!Ι‚‘œgσώ³RσΕυ~ΗΗΖ‚V¦œ3 ŒdIοK`φ·CΎZtυΦΙZεπŽJΎgχΤ„]2z�ο93₯M)λv‡Ι²m§£ Œϋβ €ΙC Ήυi>|H¦LϊA^α8±yς�XΗwό‚ 'eθΤ}vΏ}ΗΞΛΊ=avή[Ρ�0?Vl;#›ΦΑΪΉDž΄ςt“ΌnΘΠ©Zθ­JψqΧ"�ͺζ•JˆΪFϊSyπΠΙσRΙ΄.ξέ0δΜδ TjΨ±Ξkάλλ5½AD]Φκ‰oOί/�n?m[Cw―ŸΫ―Βγsίμ6γ‹½ΆΖυΚg–‘ΖΊ€ΉWώ3aΗQ ;zŸ³ΪίsC6ιP+‡d2"§ωλOJ±Ϋe—©xΔ„ €@l $‡ β…σdιί‹eႉώ›L‘Btή‹-οi.ΟτBrζτύώθ¬|Υj|-ΫvtC{+–,2₯π3Ψέ΄Šb^}ύy²oo©ZΕWJ_74lάάms’K¨ β _‘―ΏύΞoάο½σ¦άΩπw]‹Vνeυš5ξr°™ˆ‚ˆc?ύΘ†υ˜sηΞΛ­·7tύœσόΉΰwΙiZθ΄qΣfΣϊ^;D|ΰ‘n’սӏ'H₯ŠάUΥkΤrƒŠξJf@@@@@@¨GC©Vύz;*ύœiδϋ#‚ްoΏ§m‡(ν,΅yΣFYΌh‘_ΥΔ %Β•Cΰ‘ #&dQIΌ΅φl•Y+•jscvω@aw›† 5t¨ΣuΕ2Θ/Ο”²σ΅gΦjˆZQ§ΐͺ‰]nΝ!ow(d·}Ήπ°τώ<|eΘΐ ’†;|ΈΥγόЊ‡ΏZN΄ύ²NήΚ:Ζ™O—’”—‹(Ύe„ƒ'ϋW<,˜=΅όάΏ”Ι高ψλͺ�φύ-φ\ϊΓDcڐWΉώ&;ο "ž={V*U―x¨ xφ)Ρ ‘Ξ•Π€³/― € € € € € €@Bάxs-©}k{ισ.Θc?5έΡΚ½­ΫHρβ%ύΆ]0Η?~\ζΟύM6¬ύξͺ~‹§‚ˆρΩe‚Ώ2Α»^A‚w‘'6·]-ˆ¨‘Ύž rKοFy$cZ_ŠΟΫ2ΩKdACo[ζSg/I‘Ύ«œΓμktƒˆL΅ΒκƒΦ­Ψ7’s!ιh*ύι4rφA8ΡΧ‹ύΩ¦yε©»}­φΆ™ ŠΧ=οkωlwτόθtKy§“οΓW Uζο}e¬ή β«“φΚπϋ=Gϊf;ΧΞ!Γ;ϊŽ_Όω”4Ά9ά>Q]1©o Ή΅l¦p»k΅Ζ§&μ”qσƒ�ZΈ̊οW6‰k�-{Žž—1sΚ†½a’'KjS-2»_EΗU;ΟHΑύb @$Υ b˜ c͟?WώYΎ,:‘shb!jeʘQξn|§<Τυ~)U²„»Ω Κ•+[F~ϊq’»>*3ύŸ(“L‹gB%ˆX¦b΅pCΧ ‘oΌώͺ»>XΥDwγε™ˆ‚ˆ‹�˜#9²g·{iUE Nϊ Ώ·_i©μŒΙD"‹ώ\μ.3ƒ € € € € €„’@₯ΚΥ€αwΪ*‡/^”‰ί|%;wD^”μΊλkΘΝ·Τ–τι}…ΜΌχsόΨ1;z”œ?Ξ»:ΡΝDLΰG,„θ )!Γˆή ’VωΫόJ;ήμSΩ€š3N}Υ–ΗmίΫ"³Χψͺ!:Ϋϊ5Ξ#šε³‹s֞”–#ώs6ΩυΊ]'­Ζχΰ¨νξ6‰nqϋ‘s&ˆ §š£sM :Άyw‹œ3ΙΔH& “κ=y§…OI{Sν1πX΅SCgzζλ]2jΞ!g‘W@b$ƒˆΝ·–f�2Σ΄—=#›ψ88}›\’2j9σΝ!ΉΈ7ψ_nB9„¨U ,`©΄βήΊυΒ±i ρΉ³έΜΊΓm¦½πργ'dω’…ξώΪΆωνwήs—ƒΝh5Ε“§|ΏοΕf10|W±B™τέw£F&o {Λ.Ώ8θ9ιΤαJ°ι=­Γέw―έδρή=έγκΦSζΞ[ΰ.›‰(ˆ8ωϋo€Bωrφ}ϋχKνΊWZ>;ηωξλρn λC‡‰ViΤΙDΤve+Uwq_‡ ~EZέΫΒ]�ίθnΩΎ#|5twf@@@@@@(SΆ¬άέ΄…€L™R4„ψσO“’UΡ0W�p[NyσΎ‚v|ή βŒ§JIμϊcwΘ7‹}Ο ά˜ήρjϋgm­“7ˆXe@πŠŒήκ1 "Ϊ‹z~hΛηΎwζ•ζΧeu«~Ώδ¨<2Ϊ?Ψι9ĝέςVE·΅³Ά]Ύε•υA+JκΪf[[Yλ€NκΕ„ €@l$₯ βΡ£GeΞoΏŠώE!±L{η—”ΩSΛ%σ;έιΟχ‡ #†rQ‡Ώω†4i|—εΦΏμΥmp§μΩώΛ%ί~υ…T―VΕ},N;cmΝ¬aFNœ<)ΧΥΌΕέΗ™ΙŸ/―€I“Ζ.zrAΔGΊχ’ίηΞs‹τ5°uς§c>“!C}AC=π™ώOΚΓήοž#² βW_+/Όόš»―Ξ̚6YŠ+ζ�‹JΈ/’ β»Γί”»] >πP7Y°p‘{n½ΞτŸ~pΫ`/_ρ΄Ή―³έξ "ꊑo—?γ«!ΡΉ³gJΦ¬YμΊσηΟK…ͺ7ΈΫ™A@@@@@BE HΡ’�²u;BΤ ³f̐U+W\σπ�―QSκΦ«oΧ6Ν£>ϊΰšΟ DL §,„Ψkœ/Ψυ~—B�ώf_a^B„ƒˆ§Ο]ς“:eͺνiλή•;ΞΘΠ©{εΐ‰ ~Ϋ½ ίχ)!uΛϋΌύΎΪ%cηo0O[Wzn­χ;έ βŸ¦αέ¦"a°)’ β’ΛH™|ιμ!Fn•i�ψΒ…ΑΞ1σιRrCq_OŸ•Mθ ’3Φ!m Θ#υrΩE­PYώ™5‘>έΡ�όeΥqiχώVηtα^{5Μ-/ί›ί�_±νŒΤB{ζpH¬@Έ&€D|όΙ§dω²₯²ΐ΄b>.xUΑkΒ‰‡ƒlΠ°KnI‘>UΈ0b¨‡•§O―�»gwWjύ†ςϊ‘nPNC†χwκ =»?βξ³wί>Ή΅^C»|D π}‘Β»qτΨqς�{Σ��γ§όπ­€NΪέE«;vLJ–(.2ψΎˆ’Wόσ―΄nίΙέOƒ_|φ©»¬3ηΝ Σ΅ΉοΚ~~;\^Π€δόίf™J‹W�l?g]d}"zΥ`₯,―6EDΤγ+,jυIύG'―έ‘Γ‡₯~Γ»έ0f`Ρ`~hx2UͺTφ/ΦΞ:}νυx?™1λο*ζ@@@@@@Θ` A<όhχ3‘}ϋφΚζM›‚Žιδ‰γςϊεξΆ’E‹K‹V­e‡)π0ηχΩrθΠA»M[47n�TςδΝk—·oΫ*Ώ™ΰ—g"ΖσS‹JΡRB†c3ˆ¨χγ΄vΪ3kuΑr|•oΌQVο<γάΆϋAΔ·;½ŽN_όqX�b§{}Ŵ�/χτ•jƒqDό’{1I“JδdΨ%ypΤ6ο°ΒΝoVQ²e4}°Ντ˜©Ϊ8αr»οp;^^1Όc!ι\Ϋw� 7ž’¦o―(©»?uw^yΆ©οό™κ“M"¨>Ρ΅X €@DI!ˆΡ½%¦υaD{¨‡ίΝ›ΚΠ�{-\¨ΝΩξ}ύ{ι2iίιο*[Q±WΟnΆŒΎίρ₯sΧ‡eγ&�ί—~�eš*XΠ³§ΘΣ’»f­:~λ‚-}Zžψ‚heHgς5zφμ9· ³³σϊλos€ϋc}œE^@@@@@@(PΠt·νy g ηϟ“w‡Ώε,JΙ’₯₯EΛVξ²-φ`Z¦6œI׍�|¬ΨΏίY•(_ "ΖγcάΊ€t―οk«—ΥΦΎN;ζˆ†‘PaΔΨ"~paiwSv{›ώz@z4Θmη΅΅sέΧ7½}o1’ά%3Κ΄ώ%νρΧ�šΉ§Η«­|Ur΄ύtυkƒΆ3~Ν<»—Ÿέ±Σ₯DΏΥξ˜γ:ˆΈkD%I—:…½ž†�4lͺX(½ΜXΪέ•Šˆ5JdO•²Η\4νœυό‹7?� S²π劐ŸΞ9$O½Λ½3 €ΔD€ bLτbχXoQΟΚ•οόζ›n4Βnr£ Μ›φ8`Γ|Z 1Ψ€ΗΏ0πS±„[R_χ “Ÿ~ž.οψ‘h₯ΔΐI+*vδ!ΉγŽϊΆ-²n?xπά|Ϋ큻]ξ�δγ�υώΞ’6―ςφ… dΓΖMςςk�'Γί|Cς]ώ\dAΔ†›Λk/?/U«Tv+8;vάVπόKA―lε†Υ+άΥ_|9ΑŽΑ]af4ωϊ+/Κ-΅nr―£ΫΥhωŠLΛεWm»fο1#L‹ιΖw5²«/ω[†ΎωΆ<χtΫΚ9Ήη)RX――ΏύNή‘ΈΫ xο›y@@@@@H: φ»Dι†Ξ;'ο½s%ˆ¨•[·kg>[Ι΄¨ΖqSAqΦτi²uΛQ:(οD1ŸΞΑ*»W‹JΡΩ90Œ˜«ηJgSœ½Ζv±v™L2ω‰αΖϋ�{δέYΒ­ΧήVΐgΟ_’2O­‘aύφi1sΊ”²bp9ΙžΡ—2^ςίiιψαΏ0β·™\ΫpΓ€οΜά/―όΈΧG\5h©χ©ΣNΣΉΩΫ›eλsξυuF+6ώάΏ””ΚλkIxψδ)mΌœI«*6¬œΕVžμ>f»¬Ϋζlo{ζ�φŸ5χΏΥo»}dZ2ίU5‹{L³ΟŒ»ΛΜ € ‚ˆ1Ρ‹ύc0’ž9TΫ1GvΧωσε•2₯KKαΒ…$}Ίt²cΧ.ωοΏ-α*FvŽ*•+IΦ,Ydη�έα‚u‘§Ϋ2™�ό'O�bGdΗ–+[FrηΚe}W;ώΕAΟI§νέΣ•©X͝―X‘‚?~,hh�έ)ΘLυjUδΫ―Ύp· "ΊΝLγ›ΡάkXΨΩh9ηΡg₯Ӟ½ϋœUΌ"€ € € € € €IR UΚTRͺLΙ•;·dHŸΑj8(;Άo7―‰» ’χaDτjΔρό}7gmΝ}¨ˆIEϋ.«‘Μ—•ΫN‹©Μ*Z ±UΝμ’1νεΜnC~Ϊ'Cφ} λ tκΎώσˆτόl‡οdζ§ήί,Σ*Ϋ9�γόύ’#rΤT~Τ36Ώ.«ΜqεΉM2Χ~pΤvχxf@ˆ©AĘ r|rˆ,ˆx-zΎ†¦’£S}QΟρϊ‘2fά•`⡜—c@@@@@@’AΔδσ¬£u§qDΤ"Ÿ)/­=Ÿs’ƒ'.Ȝ΅'δ‰ρ;ƒπf[J*™Κ‰z/]?Ω&‹7‡žjωρƒEμ~NuDη:a¦ £V‘|ΓTZdB@ Ά"ΖΆ(ηKκqDάΰ€Όϊϊ2mϊΜ€ΞΘύ!€ € € € € €Δ’AΔXΔδT‘ ΄½1»|ψ@a»ΣΡS₯d�Υ‘°5wζT’6u Ωuδ|ΐ–Ψ_Τ°_˜iQ|πΔy9`Β{‘4i ³¬ ˝V΄ςΑγηeυ�3²iίΩH‡©ΥO„™^ΞW™tΏZe2‰z§2ΙΙU¦ β²­§―r›@Έv‚ˆΧnΗ‘ΙS gΜR©By{σ'O’₯Λ–Η’]›Vr&,LΆoίγsΕh Œ € € € € € h"&ΪG—ψώΟΰrR(G;πMUΒη‚T%L|wň@@ ¦c*Θρ € € € € € € €@Β DLX�$υΪ¦²žΆxΎη†lnKασ¦(ίuƒΦΖKeΓ$Μ "€ "&‡Θ- € € € € € € €@² ˆ˜¬άίόκ!ε%_ΦΤ~zkϊ~£ΜθσΐΫ½›ή₯J™RΊvyN?ϊˆd˚Υ{³³�εχ‡(sYΰτEΧBσ¦Mδ•Ύ½­ο©Τ>O,ŸNψR>1Κηv:@@@@@ξN9sIΊυ$Sζ,‘xϊτiωκ‹ΟBυΕΗ‚ˆwπ©kqφό%rυκ΅(]U+(4¬[ƒ0b”τ8@ξVΈDμΥηeΉrω²¬\Ή\Άnήt·RΗΩqE4ˆ¨Zω�i‹Φ²cηΞ8λΩ˞-«¬XΖφΑ�Ωη‘N£•εήϊ–€M“VΦ¬['έzΎj{ �lΫΈV’'On†ώΡΘ12fά'QΎ ‚ˆQ¦»εy7έ'(χpώώ;aˆZύπΪ΅k’>]:χξfY΅Ύi*§†Ω…ŽςεΚΚŸ~,‰ί>ύβKύdΦΟs£pA@@@@ΈΣ΅κΤ“β%ςyY‚ˆ‚ˆ>_θοτ7„hˆ0’-Α' €ΔΈD΄ŸΗργΗdώΌ9rϊΤ)»‹Οpƒ‚‚œ`OΚ”)€’Uρ.c†ΠUΕχμέ+�kτD *pNΩ°WΰάYψ#Υi¦uΊi»5|¬©hΕΜ¨6‚ˆQ•»υq‘y7υ™Žω<ρχίςνΤδ›©ίΛ™3gΜ…΄ZbαΒ…€i“Η€Ιc$Q’D¦�θΡcΦΟ„&Ρ2]σŒΏ΅¦c.κάΨ’eΛeκχ?J‘B…δ±Ζ εž|ωœmμΪ->ήΜYg@@@@@ΰξh�μIΙ—ο3ΐσ�ώ+λΧ­–š΅λ™u‚ˆžηFΡγ£_½CˆI“X• λEΌ²‘9ώ«’’UΑAaΔ}\œ@ξ°@\ "*ίυΰλ²qΓ:Y³f΅�χίpw˜5^]ΞD\Ά|₯tθά-ΤύΧ«S[>φn¨ι›*SΑ ΅{ζi+”ΠσΛό…a*£ΥͺY]ξ½ΗΪώϋNY³vΩ7Oξ\R―nm³|ύϊ ωbβ$2ͺ^­²”*YR�_–}ϋφΛO3g…9§9θ6_4ΜT·NMΙ•3‡€³*Ή>}F[ΣΙΜύσ-Ο§A§Κ•*HΑω%GŽμrκΤi9pΰ Μ™χK˜γtϊΪ9rHοz8£ΡΰΤάyσεΖΝ›2cζlΣ_ΈPA©XΎœYΎ|εŠL±Β]ήMC^΅kΧ”B Θ½Φ.Y‘Π={�”νΫχ9³ή_Ε eΝiτަϘeΉ=dΖ�ΫΞ=+»­pΰ_}ν})g]Η₯Ο oξά’&m+pvVŽ9*?L›.ΗOόνμη½πΖλύε©ΝM·Φ*W―㽋hΘR•‚σK«δ±cΗD§]ž6}†σξΨω "{π©T±‚J+"�όσhθμ›oΏ³ρωYΗςΣύ δΟoޟ½{χΙ–­ΫdΕͺ_}ξowFu¬jT₯Fθ{oΫ¦•ζ³ίkϋ:ϊ©ο}εJΝsΞi½›'Ož’έ{φΚ―VeΑ½ξsοj–oό¨dΚ”Ρ,oΫφ{˜©ΡέοΑIλ]΅ίΉˆΎ›zb ,Ξϊι§β‘ΎοΝ[=γΝΕ½Ύθσ:δMsΊιηΉσδ…ή/›½t[Ή²eœ#¦|ϋ}˜g�οj©’%Μ>7nά”ΟΏόJτ{`ΓΪ•NΐqνΊυ�Ίmη<3f”•VυQ{*y­Πz‰�Ξv@@@@@ξ^G6–¬Ω²ΙβE δΐώΏ$UͺΤς\ΟΏIE$ˆ˜0aB©Q«ŽδΜ•KR¦HinτΚΥ+rƚΦyγoλ­:tχή|GF1‚PQέΝί’}]ˆΆŸ € ΧβbΡ~FηΝ“EσηY!°ύvŸ1 p» ’^ςΓaC₯α�8WΆcξ*�>™;kΊΣ�搑2iςg]~ϊα[yΰ~O…³Ν[ΆI³–­Νv 8Ž1άΩwδθ₯{ΧN’t·K—‚δΥƒLΠΙέ«εG}$΅kΥπΉKpp°|ωΥdywΨaΆχμήE:ul/ϊΛOήM±ιkλήήyΟ3f ”-ž?Η{·Pλv₯ΐΎ½{IΗφmmοχ°μŽͺU*ɐ7™@˜έηώΤpcΏώCΓΎφŠ΄~ͺ…ΩM+ΦͱφΊϋΨ#GJ‡NέΒ„ά>x¨<� ^o=V&XΑ0fΪW[8w–υ[‹yΝ& ΎυιΧίΩMΓdοΌυ†4¨_Χιs/œ±’oΏ;Μ Μι6ο βΊυΏI‹ζMέ‡™e 2vθΤ5L TŸΕGΓί“βΕ sŒv¨_/+$§S »›Ώcυ"Žόp˜4¨LΤρ6iΦ�Ήn‡gŸ‘η»wu¦΄vEΝ?·ΒΈο�Θέ-kW-uͺ’Ξ³‚Ύ=^θj{�~}EÏvΣw+2獵•λΦ�eN‘οK +„¨χ¦ίίU*W’œVΨvϋ޲pαb)f§K›VNό}BŽ?!sfN³‚¦iΜ±=_|Ι„p_ιΫ[žmΫΖτι_?Ύœ0^*U(ομΣΰΡΗεŠ�?g¦δΤοϋο ωω’;�πνΧR’x1η8w(Ϊιd@@@@@ΰ�ˆLQ‹B4maψo¦_7χρθrωςe_›¦ b >ͺθ !ΪC$ŒhKπ‰ €qI .νη΄sΗο²bι+ΜsΡξŠŸ ³%‘δΝ3ʍγΧδςχž©OcγΖ"Dœ8α«ϊž§’ŸŽ±sχηeΡβ₯&¨Υ ’V―;ςΓές?V(΅z­ϊN λV½ϊrΡ*·k/Ώ:@¦ύ4ΣΩΝμs:},|4rŒŒχI€Β^· "V±ͺγMψd¬$HΐΗΥBΊ΄J]ν:― ΑΎVΟ΄τ±Ύ‚`ή!·_κηLη­πžZΧΉ¨kACwmΫwrͺϋΉƒˆ�έ|.juC ΒΪMΓ„ΛύbU½Lkwωόά±s§4~’E¨mώŽΥDτ~�ΣΠ­ξ£­Ο‹ΟK§Ο†ΊΎ―•Y?Ο5΅[LΥoέκε&|«!Ρ¦OΆ2AΟvmZKί>½œP ŽGίA;€ͺ!Λz46S4Ώϋφ`3\;”ͺUΥΦnΛ|TZέΎi$K–ΜμςηΎΏ€~ΓΗΜ²V=Lš$±YΆνμσθηΊ_—I†τιMΣΔ»eXF@@@@K 2AΔN]{HJλﳡ]ΉrYΞY3)] Ίdύ’|:ɐ!ƒ)Ί0ώγΡrιb`�["AΔz‡£;„hσN…/_»)W¬�‡ΧR%O(‰Cz oΧν?sρΊλΏΫ\γΕΣΘ§ΟζŽΡλέ 'ίuόŠlΪ$;Ž^‘ WnH‘Ι€XξdR>*λ#7BkAΉpΩϊ‰¦ΧH›β.xψ‘3»"€άέρ!ˆ¨OΰŠυL+W.—­›7έέ$‚£ΣbЧ³HλΏ nό,—Fΰ‘ΡΏΫν‚ˆ Z΅tA¨@’V/Σidύ©ˆθ+ˆ¨Α£5kΧΚC%Š›išέwλ+ηή�Λ:­ςό93œPίΏ�ž·*ͺM“ .J…ςe₯μΓ!ΣΕκΡO·λhN‘χ1kϊχ‘ξQo{¬)su Y­ΐf―^»&”πœG§(Μ9“SMNOΆkχΩΌe«άΈqCή}�žΌUqήμŸ$�}χšqθ e-XΈΘLgά΄Ic'¬₯ΫFŒ+£?―‹β|Σ> Ϋi@L§4ΆΓZΪ―M§Άƒ]ξ0—ώvΰθ±γeίώύRΪΊΧφνžρ`}uٝP{΅ίKfU…eΚWq’:]³šΨM·Ο˜υ³υˆW€rΕςNˆM·oέΆ]ž°BoΪ|·YSRΆ¦‰Φͺyi­i£έ­\εNuΘ·”fO4q6«Αμ9σδ¦55φ3O·Ue�ύEΗXΥS]΅ŠfŸ^=1h οΙ§ž‘ύ˜> oj`Χήiη*k*捛6‹NmW#Τ~w‹ΦmΝ6]JQ‹θ»©‘] οjϋtΒ—ςήπ͘fό8Υ™"Ωlτϊb΅ΫγΞ?vI£&ž)»έοuPP/]ή9ƒχχώ¨±γD+’ή�uνάQzυμξμ¦ΣŽΏ=τ}g@@@@@ΐˆh1yςδ�Ε*‘MCˆcG…žΝ)QΒDR©Z5Y΅l™\Ώq=p|Œ” ’»b*„hλN„ Ϋ/›Ω—τω™.eBy grή2‡ά›%©Ο}bΊσψΉ`yhΐs™JSʏ=ςΕτ%cνόΌ*]' χΉdM›Ψ bζ’rχyΤθψ₯gdΰ΄Ω5Τ> /")’D2υκ ¬ € "_‚ˆzΗgϞ‘Y3¦ΛιS§BpΙBΌyωΊ}uJnœΈkwβ"=zLFŒkΖ’°Σj}•¬YŠ)œρΉ+σEgράΉ₯Z­zN¨νυώύδιV-λŽ�t‚ ϋp€³ξkA«»½1π5gΊαο~˜fΒtφΎ+­@eΆ¬YΝκIλ=ͺXΥ3ν›Φ1-Ÿlfο&“§L•AƒίvΦjͺΰž½ϊΘά_˜νΩ³e•K<Λڑӏ�μsηX]/ˆθ==΅;Θ₯Η•³‚“_}ρ©s?p+W©Ίn Dτ�z8ν»o€Ψƒ˜}υ‹V Τπ›Ά­Φ8ΟtΓΖM&ψf6X_:Άok#ο3«{�όS>ϋ|’½Ι|N?Vt*imΈlΦ2€ϊδœ™?JΑΜ6ύβv�υŸgό(… zΆ_Ώ~]J—«lž·wq�5Ν΄Nσk·™ΣΎ“’E Ϋ«¦"’Eυy�Άf… =uκ΄T¨ZΣΩOƒ© ζ†T½t7:ΖͺAΔGŒ’‘Cήt‚ͺ¬ίΆlc\5Hi7οΠθΣ~’W^hoΌGΧΞΞϊΒEK€KΜΊςΣ•ˆNΝlŸ("ο¦ϋέ�Σ ‘ O:D7jhN£οάλΠ n{kji;ΰκ"Nώκs)[¦΄\½zUxθasœχ=uκΪS/]fΆιΤέM›x* jπ²V½GΒL·mίƒύωHƒϊ2ό½·p€NγόXΣa¦·χη@@@@@ΰξˆh1S¦,Φί»?knζΜ™32ρσOοξσctύΐσuhTCˆη­ '?Ο_bNωHέ’&u*_§wϊb:ŒXϋ½ΏdϋαΛΞυn΅ ς4Κ*]keΊΥn‘ήΆa�%i2ς 9�Ο�2KΪ™Γœ#Ύ΅ bυwφYΥEΒ„ι˜Ϊ-―T+|λχΗ>hό’Σ2pΊgͺ5»/"Ÿϋ†‘”I "FĊ}@n/‚ˆΧƒ―ΛΖ λdυͺU�›Lw[Qί0wρvoœVωλϋΚk¦ΚξAD{ZW{ eJ—’)“Ύ°W­Κ†ΣE+ΪEΆiEΗ΄i�Hƌ€{ΧN&\©ηΠj‰₯ΛW6§ϋΚϊC«VLΤ¦ΥΫ*T©ι"΅Oo;΄“Φ�΄}b /^Ίd–#φ /ˆΨ­σsςBΟnζ<ϊEΓwΒs·Οƍ‘jU=γΤώ‡ΚT0Χφ·Ή«ύι~ήA°>ύϊ‹ksO‹«λΠΣ)Χ�[o*:j_xΝbτ�d·mγZΡ«Ά-[·IΣ­CF§μ­WΗώΌhφ>™ΰyΎήADwhROπ|��½K'η\ϊNŸ1ΛͺœYLΎŸς΅Σ―½+λ;�©Dθ*FΧX―] –$�M%¬αΈ»‡ Ώκྜ0ήTvΤeέΏ²UEQ�²Δέ܁C­6ͺUG΅Ήϋc"ˆhΫ»C„?N,Ε‹=h�oWIΤχτ�ξ βϋCί’Ηy¦ ·«UjΘEΏόμ45ά�υ7Μ95Έ«ί7Ϊ|½'fƒλKΝκΥdԈαfϊh»{ΰ›Cδ›oΏ³WωD@@@@0ˆυΆ^θέΧό}³ώrϋΎ?χΚΊ5«εψρcvΗ·.AΔΫEj)?Ξ­ ‘-i’$�°^ ΙdύƒανΪΖ-ΏΛ†-ΫΝn₯K<(₯J„TώοXο0’†[4ρT}φ»ƒˆ:εqφt‰CΟYSωξ=~UΆ Œ›ή3―T(±œs²[,,όύ‚΄ΘμΡ‘jFy«iΆ0{Η‡ βΥΰ›Rςυ=rϊ‚§όjξŒIdp“lR©`*+ΘpSοΈ /wάLΣ¬@©’%”νoŠPΕΒ­/Λ€_� γκέl]gʚύ}XD’$"ˆθνΔ: €@Τβzρπ‘C²xΡό€―‚¨Oχn !κΈ"DԊ…έ_θ*dAD_!<χΨ"DΤΠ`k Χͺ•+YAΙόNHLοΥέάAΔ% ζHξ\ΉΜfΪ·ρ-ά»ήrٟ ’»ςœ^ΔqΉ/Ψ³›U-―[H΅Ό–O·“ί6l SΡ(ΪΗ–/WV&YΥνζ"~4ό]Ρ sΎš>η₯ΛWΘΔI“CUυΣ}΅’VD΄[“ζO9ϋx;Lš;ˆΨδ±FςξΫƒώˆ,ΌΏ„ ΑΉ«XFu¬ήΧσ�δho_<Žh0O›NΧ¬•½›; «Σe+UΞμΣAD rj Sƒ‘ϊώi[±xΎdΟξωσ£»ͺe­šΥeάhΟ”ξ βΔ ŸHΕ εΜtδ…,iΞ‘_ΎŸ2ΙL³�ΛZm΅ZνϊfΪηΩ?ύ ]¦ιΤΚ:ΕrxΝ„?&I“†Μ"πρψΟδ«% @@@@@ p"D|Όi3ΉηΟlNφλΜKηϟ—•Λ—Θžέ»νξ€ώ$ˆ͏οΣ―¦:gl�°n„Bˆz@T‚ˆzœ†§Ν©8�±Ν“Ϊνws—½zŸΞ,Μ9Ož–ζcΙΞ#žΚ‰R%’ο ³_T;"zδfnϊWžϋβˆYΙ™!‰¬}έϊΗh―ΰί�›°βυžc&wΞ#΅ξOUϊ0Η ›{R†Ν=eϊλK-_vΜf:@ˆͺ@\ "^±‚8+W.—­›7E•ζ�:ξn !*’;μ,‹–,5v%ŠsΒHΪρΛ‚…�ύωήf›ύ%:ƒˆν;u•ε+VΩ§6Ÿξͺu "jq–r²C_‘Nζ΅β"�ϋu™3ε¬VΥ{²Υ3^{‡Ώκΐ‹ΜΤΜκ�p—έ4$ηݞmΫF^ιβnOqλ]ΡϋΨR%’©“':§sΥI§ΗmPΏ�³έ{Aί…ƒ‹N#l7χ5έΥu{αBΕ0‹ΘTΪφyέADξΈŠU1ΠέΌ+ΪADoχ1α-kΨ.KζLΡ2VοkhUΑ­Ϋ:αL{»ϋύ /θ:nΜH©U£š}ˆΨΟ3¦ƒˆŸϊ±©ͺaS€X)s}χTΨ:Ί>KmΟ΅o'/υ~Α,»ƒˆΏ._d™f–ΏOž”JΥj›νϊ₯]›ΦςjΏ)Ά>ΦTκΥ­νLC­οX™ςUœκ’΁�-T―ZEF[•“% ωστW_#ƒί~Χ{WΦ@@@@@L 2AD½΅’₯ΚHωŠ•œ™™ά·{ώίεΛΟ?“ΰΰkξξ€[&ˆ͏ΜDŒL(0ͺAD~T―y«[HQ?wι†<Ψ·\»~Ӝne�όR [RS)ρτΕλ¦/Yβ’&yB³μλΛεk7j~ιR$”`+LwρΚ YΊσ‚tŸtΤςdΉt2 ±§’Eς$ $΅UυO[x5·vίE9r&XŠηI.…¬ ₯N!‘vήͺψψΫώ ωϋ\°<”Ο:6Ϋ­½`UοΑϋ>΅ΪΰοG/KќΙδώœΙ%©ε•ΦιΛ#2cγΏζΠ1Oη”'Nησ4'‘Ÿ6xφλY'³ΌϊhŸϋEΆSο­πΛ»δŠU™QΫoƒ ˆVe€!€ ]q1ˆΈΧϊ­₯Ε η[αO₯μ貊‰σ$o–IfO,—Ώ;#7NψώΓΝέBTwqΩς•ΦΤ²ž©‚5X¦€„ =�ν¨Σ27j�<ΤΤ½ήAD_•ΚΦ―^.ιΣyώlσ–m�¬₯gΊή:΅kΚΨ‘:%:‚ˆξ©cυΔ6\½v­lΫφ»όkύV\[+uί½χθ¦PS3»ƒW‡‘šu�gφ‰Θ‚ˆξ`Ÿ^K+εiΕχμΨβ¬{O΅νlπ±Υ bƒzudδ‡Γœ3.YΆ\~ž3ΟYχ^Π ΰά_˜ξθ«χωuύΰΑCζϋĞΊ[ϋάο—wXO·ksO‡μ�Nθ"j%L­ˆιnήSw»ίƒˆΌ›o$͞xܜ��p©αΏzu<Β={χJΟ^/Y “Ιπw‡HωΝΎφ»α~Οά??t' Ό�_½Β©J:bΤXkšρ*¦£n_΅zθ4άΎš―β—_M–!Cίσ΅;} € € € € €&Ω ’}{™2e‘b%ŠKαΒE%eͺ™g�ά»Gfώ4Νή- ? "Fσc‹j(0PƒˆΚΧdδωuο%#9’UNΡΠΰ�cW€Ϊ;ϋL_Ί” eΧΠΒfΩΧ—ζcΘς]žγ?h™C¦ύvNVξρ¬ϋΪ?_f­ Xΐlς"Ži“Kš9({N\ 5m΄†?|*§4)“ΦΧ)MŸ†ύzO9ζ„"ν5ΐXξΎ”2Ρͺ¨χβέͺΎ½OvΏb¦Dήυnayκγ²ΚΏ]ΠήΏc΅Œ2θρl’(μ)μ]|~.°¦¨ήvΨSuςΉκ¦χΞ}Ύ=&_�7ΝrŸ™₯Oƒθ "Ύ3뀌X੆¨Σtή!·χ₯YG@ΐ/ΈD‘ŠΚ9Χ³…Όλό\{λ�!!5wΡ{ŠίZ•!»›κ„j0κ£aR€p!ηΌ:u³Nα¬Ν;μ₯SΦ>σlGΡπžέΒ "zWΌdε^μΫO-^j}δρƏڧ1SώjΥ:mQ "κtΜ#?xί9ηΧί|+oΌυ޳�ΑR½gm7­�P.ωpEt‡&5DXΊ\ε0SκzO/¬ Ÿλ�Ü«άΓe䓏GKΚ”)Μϊ…‹ΝΉu%ͺAD=Φ]1PΗΥΉΫσ²tω έd¦θώf�—ζιΊ>ΧΪ <žΡ9V½7 #ΊΏO "“§|§— 3E±ϋύʘ1£L?F|ΰ~³―~ωbβ$yϋ]O₯ΗΎύ:ΤχN•=ώΣΟΝ»©Σk7mς˜sœ.ά*ˆθλέԐζΒy³MεS­ΔX³ξ#ζΉ~4ό]y€AύPηVίε+WIjUCυλΚδ)SeΠΰ·Γτλϋ«ο±w ’β₯Λ{w›π²VJuOΗPό銏AΔΖ°¦AφT0Υ:§4+λ™ΆnΘΜ“2j‘§’^«Šιex‹ahgm>/??lϊ+L)?τΘ'»¬κ‚‡N_“΅9Ηk¨�£U P[Φ4‰₯x^O¨ΡD4­/­©”Ÿ«žAς[SDο=qUή™}RΞΊ¦‰ώΓͺZ¨‘A»}΅κ¬τzά^•ͺ…SΚγ₯ΣIφτIdΓΎ ³θ”YΣkΣ)¦wZΥ»ͺΪADϋzξ­Š„εM)'� –±‹OΛφ�*κ>σϋάλŒί>ƟO:Ή«5-󜭞 ₯»b€?ηΥcN�[Ζ/9mNΣ°Dω¬=Υύ5εx@°q!ˆ˜5[vωϋDΘO„½Λ»»ΗWQGœβι,’ EBΉyωΊ}u*L΅Δ»ε�nDΤ1z‡α~ί±SkΪΒώά™ΣœιZΞpb:ˆ8ΰΥ—₯MkOPO‡ AΊ  ΛΦ΄²IB…Δt›;ˆ¨λ‹~ωYςζ ωο5ŠϊΒ…‹’6mέμ΄£GI΅Ϊ‘ZΏo^o]#©³.h±Y‹Vζ3Ό ’ξχώΠ·δ±Fžpœ�kΣq_ΉrE’'χόw»έχT›gE§ηΥΥ ’wpRΟ₯•κτΎ YΣqλv»νέϋ§4hΤΔ¬ΊΓ‚[·m—'žleοζ|j€qŽυ>$I\Υ*~ΑΧ‚’½³{jgχΉΥ­J*œΊΏV€ό~ΚΧφ‘�χ•ΧdϊŒYf½υS-Œ…½Qνvνήc…cZΥχξ υάέ£{¬=»w‘];ΫÐ˗/›κ :mξ€§�λϋ₯�Χζ0ž9{VjΦωŸς§Z�dI₯t™²ft—.]’-VΡ»mΫΊE.^Ό`Vσζ½G?ΡT8 Λ–.Άf>ςδptŠζ4”,�Νςtθΰωα»oνSδ'AΔh~lρ-ˆxτŸ`yxΠgb2YƒpΪά!Απ¦gvOΛόu§ωγθΣε==³{Zf­"ψΧπ"ξC%²AD«`ˆμ²ͺjΠ» ψρ„|ΊμŒιv‡ Ώ]σΌπΝ1ΣοžςΩϋψΕ;.ΚSγšnοP₯»"bxS?/ΪqAZYVΪjέŸΪ„ΝJΎ΄{P–ώq1Μ‘ί›R>οK²X#££υ�α„LXξ1{τ‘4ςι³!Υu’γόœ@[€ ’-ϋŸξ0’Žζn―„h‹m\»� ί-[Ύ�š’Έ›½Ιω|γυώςT‹ζΞΊ{Κ]νlά¨‘Όϊrɘ!ƒ³Ο‘£Gεσ/'I™R%�β₯Λ€SמfŸR%’©“':ϋΫΣ(;ΦΒϊΥ˭ߌσT Ÿ4yŠΌ9d¨{³Οεb> ƒΌ*Ε‹=h* j9ώΏ­?xΜ5G‚.9UλNόύ·T�Ίςžίzc ”}Έ΄žΤ‹θjW�Z-ο �Π ½/¬A°ξV5ΌG6l�ύ杆�gUΤjƒξ©Ÿ΅�αƒ%=Ώαη>Ο+}{Λγ5’ ι=Ώ ¨Ϋ4ȹߚNx¨@΄§ΆΡͺt/ττ<+ H+2%΅ξ£Σ>Ϛώ½™Ž@Χ½ƒ_:Υς3VυΘ|ωςκf§ι½.YΊ\FŽ';vξ4ύ•*”7SΫ;5kΩΪ (Ϊ}ξΟ2₯K™ dόχ…ͺφ§‘ΤοόIή·݁@χΓ:Υnά§ s/ݟο-Z™ΟέΪΆi%žmλψΫΫNŸ>#SΏ�Q>ι{:†ΘŽΥͺσ«†ηΜψQ2eςT£Χ1θ΄Χ:ύ΅6έώφ›Νταv8WϋυΠ δk›)—΅ΟέτV#}¦v;wξ_™Ώp‘υŒώp*BϊznχnΪηΣοoύ>·ΫΩώ‘QΦ;°bε―aΖ€ί'ξ©ΗνcΒϋ¬Y½š5ΖHg³ž»lΕjΞΊ{aλ†5‘BΟξmΎ–{τκγ3Πθk_ϊ@@@@@bW K7+ˆ˜"ωm±pώ/²m«'ˆ¨•›>ω€υο6)σpŸΰό…σ²`ή\9°�/ww@.DŒζΗΥ βykΚ΄ΩΏ,1£iX―†€Iν©Τ‘αEυš·:wνχώr¦Φ€[¦Τ!αΎƒnΘ~«Ÿ@΄Ο³ψε{εώ\‘ΏΩΎ^υτ™κ ϊyOΟμž–ωΙrιdD«œφ©Μgdƒˆ·š’xŠ8μυ_ΰπ9kŠη7›xͺ+œvBΖ/υ„ν΄β’V^ ―μ»K΄J υοΐrlDQg7w1ΌͺZ9²Τλž)͊ηI.σ_ΊΧ9>² =Ύ>*Σ~;g³«ΊΟΡ―ay‘nHΕFχΆˆ.λ3.ϊЧ’ήο&«’Mi €Δ„AĘPϊ9ν0’žαnžŽ9κwxλ#σδΞ%:εힽ{#TΊυY£ΆUXi�x*†G&4e_MοCοGCŒφτΊφΆΫ}κ΅έA»Ϋνοή�a΅Œ�› €wεEχ~Ρ΅¬ΧΛ•3‡ |;~ά'½ΟύjΏ—€]›Φ¦[§.W©Ίχ.α�k΅½ ιΣΙΑC‡δΠα#αξ]ΤΎhΡ"’(aB9pπ`€ήΓ;9V}·RZc½rεj˜ _xϊ¬ , g­gΩw�>η­ήΝ&Vv@�~NεKϋ^ϋ¨,Φ)Ά3Z!K Ώ;μωμσ‰φ.|"€ € € € € £‰&’ό J¦Μ™%Eςrϊτi9lύΫΓιӁ]эFΡ­ Λ1 Όέ°bβšξ βν�Ÿ$QΥ:§ΚU?γ·‚ € € € € €@΄ DŒ6JΟ‰’ 5ξ ,ήα©Κψ}χ|R₯Pψ«Ύ½OvΏbΖωΫ ’Ϋ bj»[‚ˆ:–|/ώ!W¬*”ΪΆ )(Y�D~:εž“Κwk=S?7*•V>iK5DΚ@ ˆc΄œ,Κχ­7_7AAA2δχ  ρf € € € € € €Ρ,@1šAέ‘ΐ& λJ¦Œ›wʏ³εΒEO .MκT�’IÍμτ™³2mφ|gߎmžt–ύYˆΞ ’Ž£ΐK»δΒ•¦rβ�‘…Ε=%ςΞw I†T‰Β χNM�[Ζ-9m�=θρ¬�ΉF¦0γ°;μ{H@δ؈)˜c:ˆ¨U―]S²u₯τφp|~–΄WŸ±vΆΪτžy₯BT>χ ―σδω`)ώΪͺ!†D? €@ŒDŒVNŠ € € € € € €ά1‚ˆΡLν&MšDΦ­‘0βΔ)Σδͺ¦Ν¬–:U*iωΔνƒˆBœ=‰\½Ήγ"rΛΡD|εϋγςŊ³ζ�σϊά#|°ίLΛ\‡δ">Z2­|Ϊ.W˜ύόšωΗυη€Ϋ€£ζΌYΣ&–­o s 혡ωΌtόάSΑ1SκDςϋΫ…œύb:ˆxoο?$θΪM3Mς_ÊHς$V�GsOw­›o7Υ΄SHη‰Gδ§ �šM•N+㞠kξλ8ϊ@πG€ ’?z‹ € € € € € €ΔΎAΔh~&ψ‹ό/TΡ0’NΝΌl•gjζj•n?5³w1i+τX/b‘LjάrtœΊ&εήάk./sΡum£Zη”feΣ™eο/λφ]’Fy¦tφ�ΩϋϊD Ύ!RδeO΅F=gΟ:™εΥGCO­k½·OΞ]²vΆΪ€ΖY₯[­Κ‰1Dl2ς€όΊχ’Ήv’©dJ—ΌfΩϋΛs_‘™=!Bo―oV�#γ–ž‘*S™ρϋ 3ͺeΙΧCͺ!n\P4œIC@ ¦"Ζ΄0ηG@@@@@@bV€ b ψF5ŒΡ‘ΔtQΗέAD=g…ΑΚ_'―κ’i‰Šψ ¨$Ά>}΅ƒnH!+$h·"9“Iσ‡ΣIΡ\Ι₯FΟ”ΓώυάξͺˆΊ�UY3ZΣEo?|Y&ύϊ\»~S7‰όΆ)dͺšλKLWνΉ$OŒς2υšy2&‘~d‘2χ¦”„–έζƒ—εݟ�–½'Bl‡6Ο.m+{¦?xϊš”}ΓΥ㽃”Ϊ§­Γ„Γ2{Λy³όx™΄ςqͺ! Ύ €ΔΈAΔ'ζ € € € € € € €@Œ DŒ!ޘ #ή‰’’ΔDqά’Σ2hϊߎxύb©εˎyœu_ ξqΨΫ5ˆ·~P³AD=QŸoΙΧVΰπV-Mς„2­G>)fέ-¦ƒˆz­ρ–έ@—ϋϊήΛΟVΙ o7Λξt/ωγ’΄{ΠYo^.Œl•ΣYΧ­ϊXf'¬˜ΐšωY§¨Ξ’†jˆ‘XAˆ1‚ˆ1FΛ‰@@@@@@@;"@1™£;Œx§BˆJ�`Ψ~Ωt0Θθό: Ώά—%©ίR�ܐ/…T8œωB>){_Κ[žχδω`y{ΦIωaύ9§*‘NνΌφuOρΤ…λςΰ«»Ν9ͺN%S»ωžΆΨΖλ\#“ z½& 7Ί[²Δ €φ©e΄U!0E+₯ηΥͺΎ³Ov»bͺ$QΤk«gU§€ΞύΒN³R2o ™ΫηŸϋέͺsΕξK�wκ±PU%έϋη̐DFXΓ*…ΒšΦxχ/Ωyδ²€J–PζΏt―δΟϊyφ΄ξϋ»΅ηΜιšZU'G?:¨θΎΛ €D·AΔθε| € € € € € € €ΐ ˆΓήΡFΌ“!Ę"qWέK—2‘μZ8Β—Ίnω4”x5ψ¦dO—X’Zαΐ˜jz­Vhοkjθ’ΦtΠ™­ι˜ο¦¦S0�noχqΟTΜ*|0w2)”=Ω-‡yζβu3έτ-wb# €± @1ΠΉ$ € € € € € € £3ΌSωFŒ !D΅ybΤY΅η’aκS?‹τω_ζπΘθG@x$@1=ln@@@@@@β€AΔ;τX½ΓˆQ½l�$I€a½’)c†¨žβŽwικM9zφš|±β¬LX~Ζ\;QB‘=ο‘”Ic�ͺα½I.† €~ Dτ‹ƒ@@@@@@@X ˆxΏaΔ@ !*m©{MΡΝόΖγY₯SLξ.–@@  DŒΗŸ[G@@@@@@8!@ρ?F #Ξ_²J.\Ό©+§N•JκΦ¨0•ν›+9`;lVXŸ«–Qήh’ΝήΜ' € y @@@@@@@ΐ ˆΨΟο�ύ’δδΏΑ’-})•7…€KiΝΛLC@\],"€°#)—@IDAT € € € € € €(@1CF@β’AΔΈτ4Ή@@@@@@ˆγγSηž@@»H€ β]τ0  € € € € € € ‚ˆQ@γ@@θ ˆ}–œ @@@@@@ˆ ‚ˆ±‘Ξ5@@‚ˆ  € € € € € € €@@ D ΘΗΖ @@Έ#@1ξYθD@ΈSq!ˆψh£ΗeρΒωrρ�Ε;ΕΖu\;Άl$I»z|/j`g𐑲vύoΎwˆΗ½ΘKΪζœφΣ ΡΚqξφΙΗ£€F΅ͺNWΫφdΥκ5Ξz .|9aΌTͺPή ύ· ₯εΣνξψmdΟ–UΊv~Ξ\χζΝ›ςή°­Ÿ#—ξψ8υ‚Μ«]³†Ύ†ς>9:Μ­όΆz…€K—Φτb±@ώϋ€SΗg₯NνZ’*eΚ0χ§ϊξhΠzΰ›CL0ΡηN~tκuίx½Ώ4nΤ0ΤY†4JΖ}ςY¨>V@@@@@Έ,π`±βR»n}I A˜ΫΌqγ†Μ=Svοήf[|ι ˆ_ž4χ‰ €ά₯q!ˆΨ«ΟΛrεςeYΉrΉlέΌι.•Ž»ΓŠhQ΄ς]Σ­©βεz4 ·bΙ§gΨ#dόgŸ;λΊP¦t)yθ[’6MZY³ntλωb¨νΈ²mγZIž<ΉϊG#ΗȘqŸάρΫx²ΩςΦ―;Χm�ό©;VέΞΉh/|πώPyτ‘ζ.\Έ %ΛV s7D|ΊUKyΉO/I–,Y¨ϋ:wξ_Il…―½ƒ‰ϊ[·SΏŸ&@«ύ½Ÿ;W�PcΠ‚ˆaHθ@@@@@8,*UjιΨΉ«B<|θ>tPςέsδΘιω;T #Žυ‘υοQΧβ°Dψ·F1|Ά € €άΈD΄©Ž?&σηΝ‘Σ§NΩ]|Ζ°€;ˆ¨Σ•κt‘ΪR¦L!­Šw3d5‚={χΚ�=ͺ/>―D$ˆΧ|tšinΪn k#•δμσ‡χI1<™ˆυΗε βK½_ηΪ‡Tιά±s§|ύΝTΡͺŽv˘1£πιΨ‘”-2΅ψ’%Λ€s·žφnQώΤ δ«/χ‘Δ‰}Wœ%ˆeZD@@@@hπΘ£R€θύfδϋχ�%ΣψΞΉ‹Άν;J† ΝϊζdΙβ…ΞΆψ΄@1>=mξ@Έ βZQ‰―_—Φɚ5«%8žώΖӝ|ΥάAΔeΛWJ‡ΞέB]Ύ^Ϊςα°wCMίόP™ ΞΈνžyZ%JhŽωeώB9tψH¨γkΥ¬.χή“Οτm�}§¬Y»Ξ,ηɝKκΥ­m–―_Ώ!_Lœ$χδΛ'Υ«U–R%KΚυλΑ²oί~ωiζ¬0η4έζΛύE‹Jέ:5%WΞΦΤ²ιδτι3rΨΫΜΩ?ίς|:†Κ•*HΑω%GŽμrκΤi9pΰ Μ™χK˜γ?ϊˆ΅OιύBg4K–-—ΉσζΛ kΊΧ3g›ώΒ… JΕςεΜςε+WdΚΤούν­ΞV»vM)T°€άkα’ έ³χOΩΎύwŸΣ8λύU¬PΦ�χ6}Ζ,Λν!3vέvφμYkϊ‚=ςΕW_Ϋ—σ©γ�g7wnI“6œ9sVŽ9*?L›.ΗOόf»C§™}ͺEs³zβοΏ₯rυ:φ&σ©―¦7–ΌyσH–,™εόω rόψqYΌtΉ™7ΤΞ�Ϋ^Η•5k9zτ˜ό±k·,X΄ΔΫgO=΅*•€ZΥΚςHƒϊN�'Ύ½–™N3Όtω Σ�xγG%S&Ο_^lΫφ{˜©Εݎ'­gm?3=ΈŽυ<ςYχ Ν~wu�*•+JVλΎ‚¬J�zΞ_ψ�"­ŸjaU˜τTξ³ΏtκλŠΛ[ί{IδŸώ‘ 6…ΏΎ3-[43γΣ/ΎξOϋ;<ϋŒ~˜¦ϋόsξœά_΄ˆθχnΡ"…νM�χ•ΧΜς�έ{ͺ§Ύ*"κ”ΞεΛ–΅žonσΎόΆq“,XΈΨ9χBdίm6θϜ­ί˜΅§φX΄x©tξώΌχ°B­λ΄Ι^yΩ™†Z§iώζ[Ο_‚ιΟΐ-[oύΠ‘0ΗZAΔ@{bŒ@ˆcq1ˆh?’sVXfΡόyVlΏέΕg ά.ˆ¨—τΤ<Ϋ±‹¬Xυ«ΘŸΜRaμΝ!CΓ„t~ϊα[yΰώ’fδ›·l“f-[›e χŒ1ά,λ—‘£?–ξ];9Π΄7\Ί$―d‚=vίν>5„T»V Ÿ»ιτ«_~5YήφA˜ν=»w‘NΫKR+ψεέ�^»&_[€wήσŒYΓR‹ηΟρή-ΤΊ])°oο^�±}[g[ΑϋK8ΛΊ Α�!o­�θ«iΈ±_�‘Βx_{E4Ό¦MCzs¬π£½ξ>Η‘£G₯C§n²χΟ}ξnΡjx4¨Ζ[wR£ _~%:Ν΄―Άpξ,Ι—/―Ω€Α½>ύϊ;»iθ­g·.’"E §Ο½ οΎ?ήM«Χ=ί£«$MšΤ{“θTΊƒί*3fύlΆ΅jΩ\ Ή¦χ΄{ΈBUΣ½vΥR§ͺη<+(Ϋγ…ή‘vοί――΄mΣΚιs?›™ΣΎs‚z ­0δEλ/?4|κέ΄Ϊ^§�=oήτ>Ζ{}ώ-NΧ¨±γDΏ?4”κέΤ ΟΛ―šξςεΚΚ€/>uvΩΈi³<Ω*$t¨τݚ0~¬³>/5nPΏ�Ση½ΰ�θ"j΅Τϋξ½Ηω~v·lyΨ³nΚ»νοΟ†UΛZAΡ,fxξχMƒ₯K•4SŠ―[�› «jΨ4a‚„&xYΔ eŽ΅ώςK›ώά©χH#σLœ:YŠ{Πτλ—: Ιώœu]Ψ΄n•€NΪτixΉB՚ΞΟΝ³VˆtΐΐΑr�ͺτ;uςDη8‚ˆ  € € € € Η'Nbύύό‹ζ.½ƒ†Ο<ΫQ΄»}8μ]χͺ) Ρ΄E+Iœ(Q¨~χΚΗ£GΘe«€@ 7‚ˆότ; € βrΡ~<;wό.+–jθ’έ'>fK"Ι›g”Η―ΙεοCͺ½έι›‹Hqβ„O¬κ{žŠ~:>­.¦UΖό "jΘύάξž5XV½V}§ γ­φΧ©P΅�ΫνΪΛ―i?ΝtvsϋœN #cΖ}"ΡD¬R©’Lψd¬S½ΝΗ%M—Ve¬έΰQgsDΗ«hθͺΥ3ν#}¬@έSΩκ ΌοϋΕ—ϊ9Σy7¨WGF|πώmοΕ;ΌΨ§WOuΞBמ½Lε½Ψ"†3$§ϋπ‘#R£Ξ�œυΘ.Έƒˆ·;vφœΉ�«O?³ΫΚ₯ $[VO€U€eΚW υ}’Mυ²›&³ͺ�E%ˆhŸ#ΌOο`]Tίm~6θ;8ςΓafˆ›·l΅‚ΟžŸξi¨νρcύ›€ώ[`ŽœΉΜ>3¦ύ(ϋφν5ΛΙ“'·φ{ή,kqμ¨Π³9%J˜H*U«&«–-“λ7�›ύυ AΔ;ψδ4„8{ώΉzυZ”�š4iiX·aΔ(ιq €ά­ρ%ˆ¨ώgϞ‘Y3¦ΛikzΛ@nξβΝΛΧ%θ«SrγDΤώ7:άAΔ£GΙˆΡži\υvZι«RΕς‘¦Ω΅Γ`zmwhGΧ#35³wΨH§ί­V«žSΝνυώύδιV-υ΄¦�t‚ ϋp€½κσ3•υΫpo |Ν™nX+“i˜Ξnξκq:MjΕͺžα›Φ1-Ÿlfο&“§L•AƒίvΦ΅²Y‹ζMυž½ϊΘά_˜u �­XβYΦοjiΪ^Ρ{ ڝμ’FMBͺΧ•³‚“_YSο&L˜PO#gΞ•r•ͺ›eοπ“wΥΓiί}*€ΧΆ}'Y΅z9vλ†5Ξ3έ°q“΄hέΦτλ­ώ–�>OθmοŸΚgŸ‡L%«Ϋuš_nW›»βœ�O™τ…”)]JΝτΞE‹—6Λϊ₯fυjR·ŽΗϋΚ•+2πΝ!f›χsΦ©―?·¦…Ά›Nί­Nv³§Χυ'›=!o½ρΊ½Iš4JΆm�έYΧ…θ "zO?όBΟn�­σsΞυΌŸŸ³! ήADͺ\§hΆΫ—Ζ‹N-l7;$§‘Μ?†„ηZStχ|ΡΥ`ξ‚Ή!U?ν°}w•ΐ .HΙ²žηjoΧOο ’;l©½•Φ»o‡5˜j?sήm~6̝9M Θ/'ώώ[*W―cnE§PΧJžΪ4(όΥΧίHαB­0ks'|μΆΩΎi Ζ�ϋmƒ΄jσ¬9N§ΐΆƒ§Χ�[S‡TžTc΅Φ¦S‘W―έΐ,{!ˆθ-Β: € € € €ΔJU«IΩ²žΏγώγ2wφ,iΪΌ…δΙ›Οvψό³qR»v}ΉηΏŸXnΝ”Άα7ΟΏοdΚ”EΪ΄σό]ν™3gdβηŸΖY6‚ˆwθΡϊB΄‡IΡ–ΰ@βŠ@|"^Ύ.7¬“Υ«Vόo2έm!Dύ>poχ}‘UώϊΎςšΜ˜υ³Ω5:ƒˆήΣυj MƒmvΣ)‚΅*bd›†₯�Z•ψ2ZΥΡ»wνdΒ•z­–XΊ|esΊ―¬?΄j…8mAAAR‘JM'©}pμΨ‘$°ώ§νkZV­κ§ΝŸ ’†Ψ4Μf7 iΜέ>7FͺUυŒSϋ΅’ ^Ϋ;ˆθ]1²gχ.�£kgηT}ϊυwͺάΩA+{£ gύɞ#§$O‘\.^Ό Ÿ|<ΖX4{ς)ɝ'Yž3{¦μϊc§cτxΣfrΟ=χ9λΊ ΄@ΐΚεKdΟξέ‘Άκ AΔ~rώ†ναF΄%ψD@Έ&WƒˆW._–•+—ΛΦΝ›βΔ#»[CˆŠλϋιΤͺ‹–,5ζ%Š“μΩ³™eύβœ�Ύθ "Ί+•ιΉ΅mΫΈΦ ώD$ˆ¨a‘Y?ύΰLΓκ9‹ο―ξ βΊ_—I†τι͎7m–'[=γϋ ½ώǍ!΅jVwΞκIٝZ π•Ύ!΅N]{Κβ₯ΛΒTDτ>Φ;τδ"ͺΣ;o½! ꇦΩΧΤO} ,?LϋΙιv‡O:-ͺΦtΆΩ ŠλΤαYIš4©έζSΟωΚkžκrλW/—τι�…Ω'Όχ{p'ƒˆμΪ->ή,Μ°ή{η-yΌρ£N•uδψ‰ΏΕŸ ’χΤΰφΙέ‘MF½š5M…6}—/žοTKόbβ$1j¬¬_½Β β~ωΥd2τ=ϋTζ3²AğηΞ“zΏκή•ν ’?οΆw12?ώΟή}ΐGQ΅{θzGήD)""½‰€« RΕ†εΕ‹‚ ’b”"�QT€(U:R€7ι%τžPΈσΜ2Γμ¦’dΙξζ7χσ&3gΞ̜ωžΕΟ…όσœλVšL7mή"Ν[»B†V8Qξ Ο~?lˆΤ�ιͺZiΛYλςλΊ »΅ ό΅θΨtΣε?τ]K6οΪ½Gžhβ ‡ZΧ8Ώ{ώ™ός›!2όϋœ]ΨG@@@@R `‘ΒvD ¦H‘B΄ΊαOΖΙ‰ΗΝwnΣξΙ•Ϋυs©ρcGE(R’aΖ‡©f�άΘ uρΒ;ϊγgםΝ~·OΡ‹S–P!Dkˆ„- Ύ#€ €@ bqρ[K Μ3–Ÿ½μσS•ΆevIž'₯\ωυŒά8ω_n|9„¨ΐΞ ’³βYΙΕeΖΤ_ν%MuYζΖΝZΉ-έλD6βωjΠ·ys͜Ζβ6r{€γ Η[―›!8«IΓ†+W―–Ν›·Κγ·β^hίVŠ.džvυ=K—*iΆGΆ,�y"Š/ρ ":ƒ}zϋϊΛώܞ€!Dη�ΔVΕ5Οkο$ˆh=@—•}βρFRΩXϋώϋΛF:—ωΥkœKΟϊsΆΌΩγ}λVnί5θΨψ©'€ͺQ•Qο›/o^·σz U'΅ϊδΜi“₯TΙφy L�ϊ`{ξό»i‹mt§AΔu�¬­(ιά<—Ύv::?gϝ“‡©ιΌΤά;j„T«κZ�X�ρ€T9WB yͺkT›V\Ίl…}Ϊ–ϋΛXΆΉK·ΫK*[ώ]·J‚‚�™‡ΊœvΛgΫY§dς€ ς@ωϋΝγ={ώ“α#GΙΐΟϊΫη-o»ΑΨρfΡσσy'Ÿνψό·aξΣΝ?γΊΌχƒU3_wε�…’#GvsΞΌς~Ο^ς¨±Έ†H-OλΏ}Ξ €_|ω|?jŒMΦ¨a}όυ@ϋψ₯Ž―ΘποΩ‘ΫoηΆάΆέρΦADOŽ@@@@@ ©₯O/_yΥνuwξΨ&Κi·uz₯›€OŸΑ<ώzΰgv»ηNφμ9₯œροα%K–½―΅ύ·g·Μψ}ͺuθ—ί "ziΪ:„h σn…―\Ώ)W�E΅₯O›\R&κμέk?s9\Κ}ΰ*OϊψύeδKχή½‡'�“v_• ϋCeΫΡ«rικ )uO)woyΈhz£‚Hό₯žΛw]–Ζ½½.…s¦–2yΣΚ£%‚$C˜πψ½W#€ψ¨@ ϟ?/Kύ%ϊΩ‚^Λ#Ι³€”›‘7$tΒΙaD_!ͺsTAD=§‘ ίXۊ•«δ…­CqVΣΖ7m–ΟΈ–2ΥcΟ₯|½D=r˜T7FΦV§Αγ’ΑBk›ςˏrΉ²ζ‘3ˆψν /₯aύΫΛλZΛ[Χ=PΎœQAπcλPϊυ�LΤB7Ο β¨1γdΐ_Ω}uηέ·ί”Ž^Π]s³ΒnνΪ<+~p;Μ§ΥΡ΄Jšs[Ό`Άδsέ<ƒ^Φ=­k=COž­~—CB¬]³:£.­œ;W.»ΝͺπηωžΞϋY5€hmΞϋ–)]ΪxΟχ€b…­Σ�³WoΡκ†Ξ*sz�Σ^Ϋ²eΛfTΉsπœσιDμΨεUsYi½ΖڜΛ_»~]ξ+_Ι:e~ί²a€I“Ζns::ƒˆΪΑs‰`5Y8oΆ]uP+!ͺW\6gQ—±�^§‘YuΟΊ—V]Τΰœ΅yV'Τ%†u©ak[»n½½,³†[5θΉ9ƒˆΧ―‡I™ς=»Θ:£ͺbζΜ™ΜvΟgjcTγσَOΡωί+΄λζπ’FƒΎ�ζ-[Μ�>€L™Rœ�}pφwzμά΅[4°­›΅kΦmhVΓtφwξ{ώ™€"’S‡}@@@@t]F+!κvυκ:dύΚΙ“'7W¨Ifw΄ͺαoάΞbwτΨ©P©²Τ¬εZΙF—iώaΔPώuHΡ σε­’5Τ»Fl4pΏl8j=2�’Λ}FHνΛgο1k‘vςrcπω0y —λύՊΙ”Χ zω‰‰wϋ}'―IΧqG£œ—\™RAΜ|R₯ΘνžΖv΄!ΧnJίιΗeμς³‘oI•"™Όή0»ΌΩ §€ [Vϊ!€ΔR ‚ˆ―ΏυŽlά°^VK1‡A!ΪΜ aϋ’,­QBή#Œθ!D΅Ž.ˆ¨AΓΩ3§Šs¬MƒˆVOΫvl^o�ΕQ—σύς›Α2ιηΙ’1cωvΠWRώώrΦ₯βν βΈQίΛ#U«ΨΟ³Bmλ�©ƒρΏ—νsΞ ‘ηςΗ”—P›ΈΤ`Θ7έͺφι�ΝΊ„³nž½½ϋφΛσ/ut $EDτ¬:*o½ϋΎό΅p±yoΟe7oΩj.-«'γDΤJ}ƒΏϊΒΌΏ~™ψΣΟ�§ί§φρόΩ3ΜwΦ]αΑʏΥICΔ,Σ@dΕ*šνΦ…jΌ~Ν »‚¦si\ν3ΰ“₯yΣ&VwσtιΫN^”wή~Γnχ »jˆμωvmμϘ`Τ Z6o*ύϋφΆ―=gžΉδ³3ωΫΟέ>ƒΊ,τˆ‘£ΝΉΥε©[4{ΪΎ^w’ "ž9{Vή2ͺ@κ΅šδwΖR½V%M½6ͺJ†z.¦ΝDΤΎZ-ςΥΧί6ƒ΄θΥκ†ΦςαzώΣΟΏ”ΡcΗλ�Ή©Ώs)f«]Ώ>RΎό­³Ιά8ΰi�ψI»ύ³_Ι£ΗΩΗΊγ ήέI1>Ÿνψ[΅h&Ÿ|ό‘ω«Χ¬•Ά/Όl.Υό›BΦ �ΞM—?zμ˜NΆΞi`΅§±tψτ™XMφwΟΟ±u"6KΊD΄΄ψŽ € € € €IQ υ³m$o>W4Οjˆ5jΥ–Š•2Yφοέ+Σ¦NŽ‘VPμΨ₯«Qx,™„+­ρίΒcu#ιD1'"�!Δ‹—.Λσ™£y’AmɘαvιΝΘ†θν0b½ΟχΙ–ΓW"{t„6­ΒΧ«q.ιZΧ΅TT„qlψgˆ4|ΠΌΊΗγ9δ΅z9"ά)©΅ b­OχFτDω₯[©Y2ϊϏσš°F₯ŸOώ“½FΠ1¦ν±rdlΗό1uγ< €w$AΔ\ΉσΘ‰γΑwτήΎΤ9²0’Ž/]»œ’,]rΉy%\BǟŠP-ΡWή!Ί ’ŽΡ3 ·uΫvyΊΕ3φπgϘ*Ŋ΅£Ϋρv±WΟχ€}Ϋημ!h.4τбtj*·0₯vpυψ―ΉHό·+„k…³KΖί32eΚ¨§ννθΡcR³ήcφ±ξlέΈΦ^žΥ:‘ΥρZ>ΣΖ $FDΤΎ_ θ'O7~ΚΊΜό�γΎzυͺ€M›ΦnΧΆηΪΏ$ΊΌ°nq "z'υ^{ώΫ+ϊ^%ŒκnzήΪt‰ίF›™‡ί"΅kΦ0χ=C†VgυFm;~β„μΪ½Gξɝ[Š!0ύ‡έ<ƒŒžΧι2Θ’όΖ|d˚ռFΏhPσ‘uμd•Κ•dβΈQφyέΡΚvϊmω¬«2gίή½δ™V-άϊDw]1Ίλt~š·ncTΥΫ]·(Οy£μhœ8}ϊŒ<\½v„.žΛL["[YΟ½Ρ½›YΡΠκ§ίCCCΝJ•}ͺŸΊΕ5ˆ¨ΧΖυ³Ÿ ’>wƒˆΝΑ΅|G゚ȏ“~ΥfΡ₯Ϋ| ΌdʘQτ3¬νΑǏεacq \kTΫ­?gζ…Ž/Ϊo˜‘ŽΧ�†y5ΤέF1:Ξ!€ € € € €@  ά›Ώ€΄lύ¬ωšϊ3˜ΏζΟ•-›7Ι}eΛK½ μBγǎ’Σ§NΩ ’&Ν[Θa£xΔ’Ε Υ„N›ηt‰ζFO<)9o­ςtθΰωνΧθ�ΦΎ©ξDLΰ‰™4e–\Ί|ΩΌkκT©δΙ†΅%{ΆΫ?xŠκqλ�έ*�ό»Ε<]±|Y©PώΎ¨ΊΪνžaD />Σμv5»cvœAD]ς8OζΫdΞ_Ή!{‚―Ι¦Γ‘nΑΈiέ HΥb±ΐΕ4¬[/IΫ‡Μn/ΧΘ&ύZδŽpIR"^ 3ͺΈ|Έ[N_ 7ί�ήl©€o³άR­xz ΏqSn»$ούl.Σ¬�K(oι_B�₯rύ4šGΓ�&˘egΝVύΉjηZٍPi6Ρ ‹O_—O�8!ΣΦ]°―ϊΚ¨€ω\Υ,φ1; €ΔW ‚ˆρ5π…λ=È:&!κ8c "j0MCz©S§ΦξζφΦ;οΛΜ?f›ϋuλΤ’αίή.Ÿοκαϊͺ3]f6]:Χ²Ίή"κX�˜>5BxΠ9&kί3ˆ¨K:ϊκs£’£{πΠκ―ί―\Ήb†=Γfί ώJΤ«λμjξ?ωt Ρε[£ "κ²Γ?Žύ!Ϊ0§†άƌ›`VΑ³Χ ’^οΨ΄ξιό�΄φFeG3έ6¬ύ[2€wύ}e؈δ«AξKHk]Ζ[—ϋuVΠΤvΟ­�€/dΜψ‰v³VόdTi΄ξoŸpμh΅Ν>μ#SŸαhρ 1κΙsΖ2ο•«ΊB“κ»pήfU<· ohυDη’�Ρ5κ\ΖΩyΏIΏL–ϋτs6έΡΎ3ˆ¨fœޜ7� ε�zΥϊfΜr6›ϋZέP«:7 Φ5i~;8μ<§KfkΕΘT©n�}UΟ;+;Ζ'ˆΧΟv|ƒˆΞκϊgv˜±δΉV…L¨mΩ’ωn]­ ψρysVβŒμY#S‘ @@@@’’@Σ-₯P!χΥkœοΏkΗωcΦtg“)RLš4kn·iˆρ†ρs“”·–yΦΪφγ„±rκδI»Ÿ?ξDLΰY9ώϋŽΝžl«’^— ’^§aΔ©³ζι�ΉulίΪڍΧwgqIΟ"R2Ošχ;y1LZ =$ۏΈ*'fMŸBΆZ"BΏΈ6DtΙΝΨpA:9bδ͚JVXTt©dηvβB˜V 7ͺκφc—όR·Œ«‚†«%κ―Είέ)p©nƒΪδ•ΦU2Gθά{Ϊ ΎΘ•Θ�T8Hf½ΈK`Gxy@Ό.@ΡλΔ±~€3Œ¨ωz%DλΕΦ―^n‡ο–,]n,IάΝ:eοσαςά3­μγEK–J§W^³5Υσ½nΥλŽ=j,;A*UxPt9`έ.^"»v7χ=C9Φ2ΚζΙ[_Φ�\*Y2»ώ�« ?N’?ΰ<ι~Ή²χIο^=ΝεV5ΐ§UψNρœ1σO ½*―uνb^§Υϊ­UίνdμΧη#y¨rE;<©τ/°ΛW¬”ΟΏόΪ Ί]dhνUγΎO=ΩHrίϊΝ;}φγF5A­6θ\ϊYΓlet-/༏.AάτιΖnΛοjsΏ±LτcήΕK—9»›•μ΄’nΆ*Wαφ’ΤΪ¦KγΜ6Ω�BΨ΅ϋ›2ΑB=enΦzή¨Y°`«Ιό�οΊhρRόέp³:œ6V«ϊ°Œ5Βξ§Υ­€’έxkG―tξ(•+UπN«-xk‡ΩO+(ξϋ²T€Χ„οWψmW?΅ίσEΙHϋш €@\"ΖEΝ{ΧXaD}‚//Ημ- τ*XP4τ£K'ζ¦αΐŒ]Ώ\—±θ{θϋhˆQ«ήɦώ©:ZTχΣ*rΩ²f1ƒž•£Ί&>νϊΌ|yο1ŸΗ‚ƒΝΰ€ηύœΑ«3gΟJ•j΅<»D8Vƒ{ Ώ\9sšΏvΐX2!Ά&ή²Χw-QΌ˜œ5ή!6sκD΄–{Φ—} |99x舱Δ™ο—Ο βgΏ2o£c.?_”ΑOη³4:zδ0»IƒΥŒ°mBΡΎqwξφg[ΓΡΟ·kγφY:t]…αΨ±c’"EJ£²an3€iU/γ«q € € € € €ΐ )VLςη/(ϋχν3B„{cΌ:EςRΤ(=GI—6œ>}Z:d|χο*ˆΞ'ˆθΤH€ύΈ†ύ5ˆ¨d͐Ώχ„˜zVE½Η�JΝO]Θ2%—’�΅ϊξ€,έιΊ^—ύΊξΌ,ίν:ŽlJ ζΠͺ€ΕΜSžAΔοΪη“Vί”έΗ―Ί-­!Α―ŸΛ+Ν*eŠμ–f›†ύޞtΜEZ5ΐX₯HŒλ˜_τ]<·ύχΚ�ΰ«ζ’Θ;?+)Ο ; +Œρ[Υ ­ώkf“ήMsKŠˆ·°ΊDϊ}Ύ±DυζΓ�ͺ“je³C˜ž{ό|L&ώ}ΞlξΡ(‡τhsΡ(Ξ"χΌΎέΌFΓ’»?|žœύ"zΚsŒ _‚ˆρδzˆIΰιS̟φ›=gžtΛU/¦λόύ|tAΔ„~·¨‚ˆ±yNZ5₯bΕεi£2©?­νΩs䍷߳“δw gvxιy©RΉ’]Ε22]ΎZ—±fC@@@@@ ±"&°|R "ΎώγQωeυyS�Y‰οΎž»δτ%WUΔο–²χ¦ ­Υ Ύ΅έ νiΰoοΐR�fΨA;Ψα£!ΆT²ΆwΔ βƒ�Ι‘3ΧδΤ­gFv­Ÿ«š%Β©—G–Y�^ŒΠξlЊ?½’_ͺKοl–Gϊώ'{O^=_ΉH:;TιΦιΦAƒ²d|'Χ�d‘k›+|Έ[ŽUuϋ₯[©Y�}œQέΫ9Oσί),εŒ ’ž›VZԊ‹Ί•ΟŸNζΎSΘάη  € !@1!ΉD% UμV-[h/w Kσκ½Iaσ— ’3ΔhΝKhh¨4kυ\€.­>Iι»~ŽλΦ�)χδΙ#Ήrε4ͺ IpπqcIζΓ²o�Y΅zMRβΰ]@@@@@|P€ bOJR "6ωζ€± ²«‚ᐢy₯εC�₯ƒ?™qR†,8e ·y$‹|ωΜ=΄gnΌ(G6Ϋ-$Ώ½VPv՝Ύ.«� ΅―ΧP]G£ nΉ2¦”ϋ ΈΒrΊˆζIγKqc)εN΅²JQc‰θ=Η―Ι§³NΚYΗ2Ρ;Œͺ…΄Άρ+ΞΚ»Ώ[‡R£d4­˜YςdI%�μ •οώ:%Ί4±nZ5p»Qέ1₯£ͺ‘D΄n χ~Λ¨Hψ@ 9y!L†.<-[nU4Τ>σzΆΗo]ŸοΊ,tW#$ψη&W�Y126χ½μ¬τœμz­v8Ζ¨όX½D}©†»M8bWxœόjA·σvGv@ˆ£AΔ8ΒqΔJ@—Xξχρ‡f_ ·}ςι±^b9VπαNώD •χ?θ%³ηΞχa]†† € € € € €N‚ˆNΨOjAΔ£ηΒ€rοέvHM—LΦ œnΐ`TΛ3;—ežΨ9ΏΤ»/ƒ= Œ%‰ΫŽ8dΏ\#›τk‘Ϋ>gν8Ÿ‘mO”Ο(£:άk6ΏkP―τϋ;ν0‘3Hηy�OΣ\�Ήvv·λΟ!ΖZΖ2Σ'ŒP‘no?–Sήy<‡έΗDΤ ί†ΎΕΝΐ’έΑΨiπΕ>ΩtΘ΅Ός«υ²Λ�5Ξε<}GϋZ}rαφK’ΡΘΓF`sλ‘+r5Μ”,‘'όΨ%ΏY5ςNnϊΣΚsςΞ/ΗμyΤχΘ”BΞ^ ³έ΄bε;η”·ή~χ;y}@ˆJ€ bT2΄#€ρ(V΄ˆYAOοr,8Ψ«Υ+U¬ ι�Ί~alλφrζΜ™X~πW_ΘΩsηΜͺ•’I?ON2aΡX#Ρ@@@@@ ˆ˜ΐ””‚ˆ;]•g‡’£g―›Šy2§”FΟΉΥ°Wv½j6y.Ομ\–Y«ξϋ²”σRΉΣ b £JαN£Ϊ‘†θ<·^SŽΛΘ%�„9Γ†?―:'oόtΜμξ\ςΩσϊ…Ϋ.ΛsΓšΝž‘Jg1ͺ₯Ÿ�ΪvIΪVΊΥ-“Α šqψςΜΠƒ²xΗεWV.$£_Ξ'9Š‘wΊ]½!_Ξ>)#GύΓΒχžΘ)έκf—Τ)oW“ΌΣηΠ@Θ"F¦B € € € € € € ΰ?x�βDΌxι²Μš»ΘΝ“ kKΖ ιc=²Έ>3ΊΤϋ|Ÿ½œ°ά²gΈξΣΠΪ~£Ÿ@΄ξ³π½ΒR&Ÿ«†Υ6qΕ9ιaTΪΣΝsyfη²Μ­«d–AmςZ—™ίο4ˆέ’Δ“Œΐα›·‡Œ%ž?nζͺ�ψΡΤγvψN+.jεΕ¨Άβοξ”‹WnU:Œj"ƒJΫݜAΔυ—ΌY"΅rd…w›Χܟ?­Μ{§°}ύξΌ6ρ¨L]wήΌ,όFΔ«ί2§ΌΡ φU 7 •¦ƒΨ•υŽ©R$“Lι’ΛΉp»J’ΆgϐBζKKkh“ @„ ˆ˜P’ά@@@@@@H‚ˆ μξP`LCτΖ3Aʞ―‘΅!mσΚΣ3EθzΝX2Έpf˜Ν³’`λοΚ’�Κ~KώWDJή“Ζνϊ; ">R,H¦v/θvλ`Ύ±Μs»[ΛΔU9°W“\�­ξνΚ‰ή"6|@ώήbΎrν�ιe�+¬Χwϋήiμ™±ώ‚ΩζιυΣΚs2|ρ©^<½θψ­0cO# :ϊV@4Cšδ²ώγβ’)]r·ϋκΑή“Χ€Ί±Œ³†uΠ*Όπhμͺ}Ί�ΰ+ €Q DŒΪ†3 € € € € € € €€?DτΒ,Ε5ŒΫ‘x;„¨γHθ ’ή³jί�dŸh³ΆFήνΐW₯%eΔά›ΩεBθ )a„­­Tή4�ͺrf)/­Τ.•ήlŽoQo⬊¨ΗZ₯±±Q1›±\τ–ΓWdΒίηδzψM=%πΫςI ³:‘Ω`|ρvqΕξi>ΔΘΤgζΟ–Jή"§T2ͺ&7μ6Ό"ŸύqBφΏmλ <}]κ㠁κυΞ ₯ϊU1Ξ] s½_š”Ι€Ηγ9€aٌR {jΩ{βͺό²ζ‚ό°δ΄BLo·!ΣEQ™QŸΑ† €ΐDΌ-ϊ"€ € € € € € €Ύ'@ΡKsβ­0βέ!*‰7‚ˆΓ–ήΣNΨβ•Λ c;淏#ΫqŽΓ:―AΌ΅½‹™‡ DΤυψω˜L4‡ΡmΣ&—©―”rFPΡΉy;ˆ¨ΟaΨ}δ°s>ίs�₯κY₯ΛΝr[§ωŽ €AD> € € € € € € €€ DτοωσωΡ�΅ν’œΌ&Ή³€’ �Iζ c]f6@@ΐ!@сΑ. € € € € € € ΰ‡ύp�2 € Hi6y@@@@@@HŠ“β¬σΞ € €€ Dτ‘Ι`( € € € € € € €@"ƍK@@N€ bΒYr'@@@@@@@ 1"&†:ΟD@°"Ϊμ € € € € € € €~)@Ρ/§A#€ €#@1pζ’7A@@@@@@€)@1iΞ;o €ψŒADŸ™ ‚ € € € € € €ΔI€ bœΨΈ@@ ‘"&”$χA@@@@@@G€ bβΈσT@@[ω( € € € € € € €ώ-@ΡΏηΡ#€ €~/@Ρ類@@@@@@@$.@1‰x}@@ ±"&φ π|@@@@@@@ ~γηΗΥ € €ρ ˆO@.G@@@@@@Y€ b"OG@’ΊAΔ€ώ ΰύ@@@@@@@ΐί"ϊϋ 2~@@ΐΟ"ϊω2|@@@@@@Hς“όG@@ q"&�?OG@@@@@@β+@1Ύ‚\ € /‚ˆρβγb@@@@@@@ Ρ"&ϊ0@@ i DLΪσΟΫ#€ € € € € € €€� Dτ�9δ @@Ώ ˆθΧΣΗΰ@@@@@@@!ˆΘ‡@@ Q"&*?G@@@@@@β-@1ή„ά@@ >γ£Η΅ € € € € € € €@β DLό9` € €@’ ˆ˜€§Ÿ—G@@@@@@HvΰpπΝx^@@ΐOκΦoΰ§#gΨ € € € € € € €*@‘Ο € €@’ DLT~Ž € € € € € €Δ[€₯™γMΘ @@β#ΐ�ΜρΡγZ@@@@@@@ ρ"&ώ0@@ I DL�ΣΟΛ#€ € € € € € €@D €Iδ@@ ˆθΟ³ΗΨ@@@@@@@‚ˆ| @@U€ b’ςσp@@@@@@@ ήγMΘ @@β#@1>z\‹ € € € € € €$ΎAΔğF€ €$i‚ˆIzϊyω;¨πΰRͺd σŠ“§NΙό ΝύτAA�€ρ“φζΜ[ gΜ±γΊγyߟ~ώ5�· θλjΥ¨.yσήcΎγή}ϋeΥκ5~χΎ:Χί"•*VM›·Hηn―'ΘgΘο 0 € € € € €@’H:΅dȐΡψ7ρΣIκ½½υ²½%Λ}@@b%@1VLtŠFΰΥW:KϊτιΝ›6o–ΩsηGΣΫOiP¬vΝζ ?!ΥkΧ7χΛ”.-Σ§όlΏΨG" lτXόΥφ}Ϋ>ίAV―]g³γψsΖ)^¬˜y°fέ?�¦ύK~GΣ©Γ‹ςΞΫoΨγ:|€|=ψ[ϋ˜@@@@@A Ož{€vέz’5k6Ie„“'OnΎΦΝ›7%<_��ϊωΐ―ΟEH‚Œ‡ b‚0&ψM1ˆ8bδ(ψυΰ·β† € € € € €$¦@•‡‘G­ν�_»&#Ώ*W―\ΆŸžlΡϊ9ɟ?ΏέoΫΦ-2wφφqRΫ!ˆ˜ΤfœχE@|L ‚ˆoφxΟψΛΘYΎ|©lΪΈΑΗ„8ΎDlέ²Ήτλσ‘ή¬Υs²yΛVϋ8>;γ£η½k!ˆ¨K3υ½+VD<(»v­ΊΙ† € € € € €@ h±j΅G%Δ(.|옜=sVn�W€HQΙ–-»]!ρτ©S2~μ¨h_½H‘b�€Ys·>―‡έtα@@»((AD‹,8ψ˜Μ›σ§θ_PΨξŽAD–fΎ;Ÿ΄ΘŸAΔΘߌV@@@@@K@—bN™2₯\3ͺzn3e”—^ξb†oάΈ!ƒΎϊΒ³‹ΫqΧW_—4iӚχJm,σ¬AD‚ˆn@@ξ�@ U/<,\Φ�³FV­Z)aΧ―ί]Π$ψ΄θ‚ˆ-›7•Μ™3™*sη-3ΖoΆ5¨_Wͺ#Σ¦Ο]ΞΊv­šRΠpH“&YAr±±Δφ™3g"\o5*XP­VUJ–(.Ήr唣GΙŽ»dώ_‹"½.!>Φ—reΛΚ=χδ–νΫwΚςΏWΙΆνΫ%6AD­8¨Ÿ;ύ(Pΐψ<œ•]»χΘί+WΙΞ]»­Χ²Ώ'Δx-£βŊcΞ#§N–ΖηύΟ9sερ9sn:6°›~ύmj€KŠίΙ\[7σόœ_ΌxI‚ƒƒe‘ρηnύ†V7Ύ#€ € € € € θ/ΎΤQ²?ΏΡνΗρcεΔ‰γ‘Ž©ΡOI©�eD‹7¬— +™ύ’ "j²vέϊ’7_> JdφΏzνͺœ9}ZΦ―[kόŒθP€Ος§F–fφ§Ωb¬ € €@ bњ¦σηΟΛ_σζαŸύVί½ ]qχΆν'ŽŸψ“4~κ Ι’9³έ¦;7oή”1γ&Θ§ŸιΦ^ΓφοΫ[rηΚεΦnγ›!C₯Ο‡H²dɜ—šaΒ׍k# dvκπ’ΌnŒΩϊνBη…ηΟ_ΎύΘτ™8›%>Ÿ}Οaί2Cn75&ώτ³j­$Ε‹3O­Yχ΄i�’[7ύ}Ϊ―δΚ™Σ­]Œ`먱γeΰWƒάΞΕgΌz£ξ―Ύ":·‘}Ύ�]Ώ.œδφyΧ1Ž1ΤCγ·8�ZΈΨ>ŽΛ\λΕ/ΏτΌtοφŠ€K—ΞΎ—sGΓͺ/u|ΕΩΔ> € € € € €‰&Πι•n’>}σωΓ‡‘АcΙaό{Ϋφ/š?Ϋψ矡FQ’0©ςpU³_TAΔ{ξΉGZ<ΣFR¦Hα~Vƒώ,βΚ•+Φ‘_~'ˆθ—ΣΖ @@ΐδ ’5KΫ·m•e‹¬ΛVS@|Ož;•€m•Mn_—+“£�^η헍m1¦q8ƒvZ!nޟ3’ PYχ:xπΤ}μIΉ“ ’ιήyϋ λQ~Ÿ2mΊΌ�Α‡φω„�ˆψβσν€η{=μϋΗ΄γτΡ KώškW›ŒκZ­Ψ€Ή+x¨}œAD=—Qό₯[CzžjfT­< ]ΝMœ°‹iλΪύM™Ώ`‘έΝμ³£ΨqΎ§vYΎx~”aTΟ[x΅�δ#Ύ3—qπμλ<ž`?ώd€έŸρzΫ7υΨωfπwςέποΝΦθ‚ˆqk­ ©ΛVx†L=†!ΣgΜ’οGβυμΟ1 € € € € € -”>½Τ¬]GJ•*cήϊκΥ+2tˆ{λ™/wξj¬Ί•QBCCeψwƒε‘GkΔDμάυ5 2~Ά’›ήϋόΉsbά'³d͚Υό9ˆaίJΘe�ώY"ADλSΒw@@DH AD…½jόΣςεKeΣΖ ‰βœΠΥbΊv9%YΊδrγ\˜„ NθGΔϊ~wDΤί$›;�/Ρ o>Pή-$ε DiΕ½W_Ή]‘πο•«eκοΣΝ*|/΄o+%Š»*ΰι Ÿmχ’„„„ΚsΟ΄4—(.Wφ>{μΊΔρ1cΪSFY} ~ιφלYζrΜΊ―Υ§ώ>Cφξέ'eΚ”’†υλΩΥ u¬ε*TΡnζ–ΠAΔ•KJŽΩ­ΫΛ‰“'e‘·™Λ+Χ1–JN™2₯}Nwœ½ώ}?’–Ν›Ωη5p8λΟ9ζϋ<ί�­Ήά²u²g―ή2yΚ4σ0²œ.Ρ¬ΛVUσκΥ­#©Rέ~ξμΉσ₯ϋ›�°€†CvΊ|³nZΩoό„Ÿδτ™ΣRͺD i�ψI³]ΏθΔυ=e{ϋbϋ9ˆ,4ͺUό�]½&E‹]ώΨΉygϘ*Ō₯‘­Mίgσ–-’ΑψmΚ—^h'iΣ¦5Oι»<ΡΈΉΊŒλxu™ν™Σ&»ΝŽw·± t…ςχ—³?σϊΜϋΚ»–Šˆ.ˆΧΉΦ|©[»¦υκ2ι—ΙζrέχζΝ+―uλbώ#žΌlό6ι•\Ώ)jwf@@@@@/ 4mΡJ²dΙ*ιŒ«Osλίλυ‘œ=k¦μΫ·7Βͺ‘Γ‡nU?œ>uŠρσ=1υg―+Yχφ 8¦HžBͺΥ¬)+–,‘παžιO ύiΆ+ € €I%ˆ¨Swφμ™9}šœ>uΚ―g�BΌy%\Bǟ’Η―'Ϊ;έI±έ‹νε~λΧ«#Cm{ύ†�ΊΝσζρΫoΌ&]:½lŸkΦκ9#@ΆΥ<Φc7GHρ»a#Με™υdλ–Ν₯_ŸΫU ΧY7λΥσ=σ·ΫτXŸ©ΛϋZېoΎ”ΗΤ³₯~£Ζv8-!ƒˆM›<%ŸΪΟ~ŽχZο�Λ%λ¦AΔαί ²CkΪf΅BήΊUΛμ°Ϋ©S§₯j:ΪΕά4œ7φ λP6ώ»IZ>ΫΞ<φ ">rDš·nk?·ZΥ‡eΤχCν*‰7nܐ U3Γj~πΎ΄kσ¬}_]J{΄±¬±΅};θK3Θiλ’ΏΒΣΝ3ΨΫΟΑ‚Ω3₯`ΑΦ-ε‹/Ώ‘οG±?F*Wͺ`;ƒˆžŸ―Ώ-‘.έΊΫ}Ϋ·}Nτ³`mz_½ΏnqοΗύŸ<ΫΊ₯uKωq�/�»oϋΈoο^ςL«φ±†<5U1>s=iΒ©TΡe£Υ-Kί_Ρ~�~ΎΤ―k_½zU>ϊψϋ; € € € € €ά �έߐ4©]Ε¬η]»vM&Ž-ηϟ·šμοZ5±£Q 1yςδrά(BρΣΔq湘*"fϞSΪΏψ’ΩW3nτHϋžΆC1Πf”χA@όL )ΓΓΒeύ?kdεŠ~�›LΎBԏ{lƒˆz«]�q·?!Χ­ [ιΆwί~iψDsί³"β… Š³eΙ�ε²zΝZ3gvτψ› ’Η%ζσsζΜiTˆΛ 6Ž^°»θ²ΖZmP·„ "ΎΩύUιΪ₯£ύœχzφ2+3Ϊ ΟΣv+ˆψ@ωr2y�D»«†);Μ>֝CΫ• AEΟ β�}τ±ό2yŠΫ΅žBΛ`τΘa’K[Ϋ«―Ώ-—.]²Ν0έK/΄·ϋφ�LΖOόΙ"ΏΟ˜)Z]tέ?롉 @@@@@DhΡκΙ”9³±RS*#˜VR€LaŽE‹$Μ›σ§lίζ*Pa °mϋ%g�\’ηGŽj/£SQ―γνwΝβΊRΦή�φȚU+%8ψ˜uλ€ωN1`¦’A@όS Πƒˆ‡’…Νσϋ*ˆϊιςΕ’ŽΛΣ ΰΛ]Ίi³Ή9]Ί4μ‡}nWΤΊvΞ ’.q;}κ―’ΪψΛ§η¦Αά±s§β+̞γv:ΆAΔ–Ν›J«Ν€p‘B’9s&·{8¬žΆ%dqΰgύ₯ΙSO؏ͺςhm»*‘Υψβσν€η{=¬C;ˆΨμιΖςY�Ύv{lvŠ—)ovσ "Fφ\­z¨Υ­­ϋ[οΘμ9σά–΄ΆΞEχ}“δγO˜]βς9Π₯ —-šo?bΚ΄ιςώ·«]Z'Φό½D²fΙb:ƒˆZqR+OΖvΣΐ©Ξ·nq―^·hώŸroΎ|ΊkX­ϋ™ Ρ|‰*ˆŸΉ~ξ™V�ηΓ"}ͺώFικ΅λΜ%»unΩ@@@@@Hl:uλKω]+ύθΟ‚†ωF�_ΏnλΎ²ε₯Αc™ϋ�nXoόμοφΟbDlΪ’₯*TΔνΓΓΓεβΕ‹²|ι"Ω½k—Ϋ9= ˆθ―3ΗΈ@@Τ βΥ+Wdως₯²iㆀ˜)_ !*nlƒˆ?Œ'Ÿ όΚm>ƍϊ^©ZΕls΅‘aύzf*{φlnΧ8Άlέ&M[ή^.86ADΟ嗝χσάχVqψ·ƒ€nZφγ¬  έ`μhPς“?²›¬ŠˆZuποΊ*χΩ'cΨ±‡žAΔȞλ~³ͺ&�]ΉT²Ώ™Ϋmς”i�³Wo³»3ΨΫΟAΙΕeΦοΏΩΣ%΄ϋτϋΤ>Άv/˜-ωςζ5AΔαί –Ί΅kZέbόξόόΕeΌϊg(�ΉΤxL*ˆŸΉΦgvυιόςK’:uκ(‡πΫΤίε�wϋseGN € € € € € ΰef-[KΑ‚…Μ§l\�,ZΈΐάοΨ₯«dȐQ΄’αΞ�•¬¬‘δ0V½Κ‘#§yxξά9 >vTN:%kW―΄Ί˜ί¬PI~€š€M›Φ­].^Έ cG� aa�ΰc„~�@ΡO&Ša"€ €*ˆAΔ=Ζo--\0ΟXςτ²ΟO[Ϊ–Ω%yž”rεΧ3rγxδΉρε’{+ˆhM^£†υεQcIΰςχ—­”˜"…«4Ώuώ‹/Ώ‘οG1c "V«ϊ°Œ5ΒΊT�ΏI·ΑXΪXlgΜ5—²ΥηY›·‚ˆZ©N+ΦY[£§šΚž�φZ‡ζwΟε©­ ’ŽΟΉ€π’%Kε?έ+C:o€ΥοfΟuύf gρΙ§[ΘΞ]»έεΥW:‹>ΫΪ:tξ*K—­™Σ&K©’%¬fιρώbόί>φάωwΣΩΰ€Ω—`Ÿ.c¬Kw[Ϋό ₯kχ7­Cϋϋζυ«ν4p{χκ)mžmmχϋzπ·rδΘQϋΨs'8ψΈY%PΫγ2^½n†QΕ³t©’Ίk.…\§ϋRδζ‰HΎDDŒΟ\[QΗΖFυΝͺU’ϋο/k‡6­σϊέω9wΆ³ € € € € €ΐέ(]ζ>yμρ'ΝG9|H~ύω'sΏsΧW%((}¬‡bόŒpΔΠo#νŸ={N)Wώ~)Y²΄₯Ώ}Ο�φμ–ΏOτi$ˆθ/3Ε8@@€ βωσηeΙ’ΏD�’ΰ/[Πky$y–”r3τ†„N8!Œθλ!DuφVQTΊ] 1Ώλ—lΩ²Ι[―Ώ*8΄Άι3fΉBqFƒg±c—Weρ�eVWιά±ƒτx³»}όΙ€Οeμψνc­4¨Uθ¬ΝΠJΘ₯™;uxQήyϋ λ12~βO�·�gφ±ξό5χ)�^»Ν "jsφΜivϋκ5k₯ν /ΫΗΦNώ{σ™»—CBνeŸ=ƒˆ‘-—=φ )T° uΡ0έ‘ΓGdθΰ―₯~½:vϋ³ν^”u�¬·uGη'}P:³M―±ΆΈϋώY΅\2eΚhή&44TͺV―γφyπ¬ι "ΎΨΎ­τ|�k2dθpόν0ϋXwτ3–-[V³Mƒ¨Φg-�γύvΠ—f%Oλ!žF”/'ŸφϋΨ:-ύŒ9_±r•DDŒΟ\[~τaΦ{ι~™�₯₯·ί“ŠΤCsΣΚ•ZΑ’ @@@@@Δ¨TΉŠT―YΛΒ‘C‡δ·_\AΔφ/Ό$™³Έώ=ίs|Ι“'ύŸnΊ€³ώοόΉ³2~μhΟ�Ž+Tͺ,5kΉ~φ‘Λ4�0bh„>ώΤ@џf‹±"€ €(AΔΧίzG6nX/+–/•0£Β?mfΠ°}I–6E„0’?„ΥΪAΔ?¦O‘Ε‹™SyώόcωεgΜ0œ64z¬ ώκ σœ~™2mΊΌ�Α‡ζqΛζM₯ίήζΎ~™=gžΉμ¬Δz­ksΉZ«ΓΠα#E+ειΦΔ¨Χ―Ο‡vu=³­ω3²m»«ΔB+<ψ€όςγ8σΉϊE+3~ςιηςΣΟΏšαΈύϋΚc κΩηuΗ "κώκ‹%[VΧ_ΈΓΓΓ₯K·Χνΐ₯š0VςδΞ₯]εΐƒR―ΡSζΎg1,,L>ψ΅Œ?Ρ|nΏ?”'odφΥ/gΜ]ΦY7Οπ€θ^θΠΩ<§_4Δω|»6vΕJgΈ-�Α>η�έϊŒ�n–ΧήxK‚Ÿ:΅jΚηŸφ“Μ™3ι)ssΛ•½O¦ός£$K–Μ>¦ b…€IσrΨ(°dρB£ΓiσžΊDs£'ž”œΉ\…t,ΏύϊsŒΟσε}yv € !ˆΣδFΤwς‡’ŽΣAD­§΄9²λ#’ά<«ςiGΟ–Ά3~»�rΥΊ+Σ&O’²χ•1χcϊβΝ ’.‘;vΤpɚ%K€ΓΠ ZήΌχΨηœADme, ΆθΆ�n2«Z!=ƒˆΑΑΗ%Ožά‘ήBƒŸO·xΖνœ>oQ2CϊτnνΞ S~πa™ϊϋ »9>Α>Οκ}φM ‘j(ΡZΎΩ3ˆ¨U!7Z ΘοΌ,Βώδ)S₯g―>v{|Ζ[½Ϊ#†Ρη’1£kIiϋ¦Ž D>Χώ%ΩΌe«Ω]Q;Δe�5€ω•QρΡJu Αήν?ΰ ³"¦έΐ € € € € €^Π bͺΤ©cΌϋͺΏWΘΚΏ—ΗΨO;ΔD,R€˜4iΦάΎ—Ή|³~L™"…[ۏΖjS§Nž΄Ϋόq‡ ’?ΞcF@H€ ’οL¦3Œ¨£ςυJˆ–άϊΥΛνΠ•s™d=Ώnε2{ιά!C‡Λΰo‡Y—™ί‡7XκΦ�iξλΘό³6 #ΎώΪ+� ~=· ˆz^«»5–ώaτ8«»ύ½˜Qν­KΗRΟXzW—¨Υντι3ςpυΪζ~ΆlΩ€·QM°‘±τ±VΤί΄Σ ήκΥkεη_“‘Γ]K5k{ƒΗ›ΨKω~Ϊ―΄hφ΄y]j·~£ΖζΎ.…<{ζ4»’bχ?]ζ76›εΎ4Βbά_Ξ¨π—Κ¬RwΒψKξ’₯Λd�/ΏΉ--ά¬ΥsvpΝΊχ νΫΘΛ/½ ΉoύΆžΥ�οϋΛδ)φ²ΣV»gQί‘_Ÿ^rΉ²’.]:³Ϋ… eξόF0―·u™Ϋw³.]©Βƒφ;kυϊ{Υj6|€¬^»Ξνšψ|τF;Ό`.ϋ¬ο©Ο 7—ΜώzΠ·��Ν³f₯Kν·dιrc)δnΊλΆυνέK¬‘X΄NξΩσŸŒ7A&O™f5™ίγ;^5κΧη#y¨rEΫUo¬�Έ±|ΕJωόΛ―Ν –ΦC5”:υΧνe­uΙk Ω:·;k½VC‘―tξ(•+UpήΚάΧ ι°?˜sα$  € € € € €xA YΛΦ’ΟX±(eΚΫ+_9s%τŠ,]²PΆnΩμlŽvΏj΅Gεαͺ�Β [6o’ωsg»υΧΚ‡-Z·6ώ½>Θ^-ΘΩαβ₯‹2Ξl9°Ÿ³Ω/χ "ϊε΄1h@@ p"ϊΦ\ZaD•//Η|·Υ4”˜Ο¨jT’Ϋΰ Q6�L¬‡ aD«" ηEzί+WB%ψψ ΟSwύXΓkΊΕe,ϊŽ₯K—’F°ςΐΑƒQήΓ3ˆXΌLyϋ=5 wρβ9tψˆέӎϊiSΓ“;w펩{ΌΟkˆ4΅±$s\Œταj\΄HγσpYvοώ/ΚΟEΌκΈABΕv�C0Ήχσ”+gN9}ζ¬0‚΄Qύ™p^Η> € € € € €ήȚ5«δΝW@²dΛ"©R¦”“'NΙαCϋεΌ±Β•·ΆΙSHΡβΕ%{Ž’.m:£ˆΕi㙇Œοώ]ΡιEΡ©Α> € €ΐ] ˆxΧΙy ‰&]1ΡΕƒ@@@@@@β-@1ή„ά@@ >γ£Η΅ψ—AD�š/F‹ € € € € €ΔV€ bl₯θ‡ € ΰ‚ˆ^aε¦ψ€ADŸœ… € € € € €Δ[€ bΌ Ή € €@|"ΖGkπ/lΩ²Ι}₯K™ƒΎ"λ7lτ―`΄ € € € € € €‘ DŒ”…F@@»%@ρnIσ@@@@@@@ΐ;½γΚ]@@b)@1–PtC@@@@@@|T€ ’N ΓB@’ŠAΔ€2ΣΌ' € € € € € €ͺAΔ@Yή @π‚ˆ~2Q @@@@@@ˆB€ b04#€ €ά‚ˆwΗ™§ € € € € € € €ή ˆθ-Yξ‹ € +‚ˆ±b’ € € € € € € ΰ³}vj € 4"&yζ-@@@@@@@ p"ξάςf € €€_Dτ‹ib € € € € € € €@”£€α € €ΐέ ˆx7”y € € € € € € ΰ=‚ˆή³εΞ € €± ˆ $Ί € € € € € € €>,@Ρ‡'‡‘!€ €IA€ bR˜eή@@@@@@Y€ b Ο.ο† €ψAD?˜$†ˆ € € € € € €D#@1N!€ €x_€ ’χy € € € € € € ΰM‚ˆήΤεή € €1 DŒ‘ˆ € € € € € € €€O Dτιιap € €@ΰ D ό9ζ @@@@@@@ °"φόςv € €€Ο Dτω)b€ € € € € € € €@΄£εα$ € €€·"z[˜ϋ#€ € € € € € €ή ˆθ]_ξŽ € ƒAΔ€8 € € € € € €ψΈADŸ †‡ €ΊAΔ@Ÿaή@@@@@@]€ b Ο0ο‡ €ψΈADŸ †‡ € € € € € €Δ @1 N#€ €xW€ ’w}Ή; € € € € € € ΰm‚ˆήζώ € €Ρ DŒ–‡“ € € € € € € €€Ο Dτω)b€ € €@` D μωεν@@@@@@@ π"ώσ† € €€O Dτιιap € € € € € € €@Œc$’ € €€7"zS—{#€ € € € € € €ή ˆθ}cž€ € AΔhp8… € € € € € €ψAD?˜$†ˆ €²AΔ@ž]ή @@@@@@’‚AΔ€0ΛΌ# € ΰΓ}xr € € € € € €  ‚ˆ±@’  € €€χ"zΟ–;#€ € € € € € €wC€ βέPζ € €Q DŒ’† € € € € € € €€_Dτ‹ib € €@ΰ D άΉεΝ@@@@@@@ iDLσΜ["€ €>+@Ρg§†!€ € € € € € €± ˆ+&:!€ €xK€ ’·dΉ/ € € € € € € pw"ήgž‚ € …AΔ(`hF@@@@@@όD€ ’ŸLΓD@U€ b Ξ,ο… € € € € € €IE€ bR™iή@πQ‚ˆ>:1 @@@@@@ˆ₯AΔXBΡ @@ΐ;½γΚ]@@@@@@@»%@ρnIσ@@H"FΚB# € € € € € € ΰ7ύfͺ( € ˜s^y+@@@@@@H:“Ξ\σ¦ € €€O DτΙiaP € € € € € € €@¬"ƚŠŽ € €ή ˆθ Uξ‰ € € € € € €ά=‚ˆwϚ'!€ €D"@1š@@@@@@@? ˆθG“ΕP@@@ ˆˆ³Κ;!€ € € € € € €@R ˆ˜”f›wE@|P€ ’N CB@@@@@@ξ@€ β`Ρ@@ α"&Ό)wτo:΅jJž<ΉΝ—ΨΌe«θ�tK$ί"•*VM›·Hηn―Λ™3gΜsήώRαΑδΣ~}$�½χΚάωσεΝο{ϋ‘wύώϊŽ₯J–0Ÿ{τθ1YΌtΩ]ClθλΙS§dώ‚…±½”~ € € € € € €€W"z…•›"€ €ΔV€ bl₯θ•ΐ«―t–τιΣGz:<"»χό'λ7lŒ΄―5�ω{‰dΝ’ΕΦ³ηΘoΏgξwκπ’Όσφφp‡)_ώΦ>φζΈ‘ƒE’ΦΦξŎ²jυλ0 ΎkΘ³vΝζ»μέ·_>ΡΔgίΛ9Φΰγ'€zνϊ>;V† € € € € €€― T­V]ΚέΏ€HžRn�7qάΉtιb΄Γ-Yͺ΄<ςh ɐ1£€L‘BΒΒΒδ�… ²dρ"Ω»wO΄ΧϊI‚ˆ>ΓΌ € ΰγD|ͺqSYΈ`ž\Ήμγځ9Όm�ώ#©R₯ŒρεvξΪ-}? «Χ�‹±obvX·r™dΜΙBtAΔ#GΙΐ―'ΘPί}ϋMɐΑζœϊϋtΩψοf·ϋ:ƒoz⅝eΕΚUn}όύΐωŽύ}6? € € € € €Q Τ©[_Κ”-gό|)•[§ρcFΛιΣ'έڜeΛέ/υ<&Ι’%s6›ϋ7nܐٳfΘ�];#œK* “ΚLσž € €€ BρΝοΙΥ+Wdως₯²iγ•άaΕ6ˆ¨Χ―‡I‹gΪΚΆνΫ}$ͺ ’.Ν}ιΨ₯«B<|θ>tP *$χδΝgήBÈC‡|cό<κΊuΛ$υ b’šn^@π=@ "Z²ΑΑΗdޜ?ετ©SVί½,ΰ "†††ΚΜ?f›O J'T}X²eΝκ6‚έ{φΘ㍛»΅ω�ATADo16ADo=Ϋ—ξKΡ—fƒ± € € € € € ΰ7ή~Χ †‡‡Λ{vKφμ9${ŽζΓ’ "6zβ))UΊŒΩo�ώ}2ν·_νΎΠ‘£d͚Ν<ήΈώY΄p}.)νDLJ³Ν»"€ €>(hAD% —υ�¬‘U«VJXύ§»ωQs—,]./wιζφψ†υλΙΧ?s[ΎωJU₯΄CΜ~/>ίNR€Hnξϝ·@>βv}έ:΅€p‘‚fΫ–­ΫeΥκ5ζ~ώ{σIΓυΜύππ2fά)T° Τͺω¨TxπA “½{χΛο3fFΈη�³wίρQoΗBo’t,ΐ"‚tQ€ΧH“*½#½(Ψ°AŠ4ιEι‘w€JιˆtA₯…–„ί>w³w IHΉ»|φυ27;³eφ=λαΎ™1OΊΛ»50θ_½š}ΦΜηΨΟP΅J%Ι‘ύ ³Νκc₯ ε₯LιRςΈΡΟ3gώ”]Ώξ‘yσΪηk‘nνš’-[6ιΣ»‡]Ώzν: X²LBξά±Οχd^)]ͺ€y̍›7eϊŒYφρΤ³—’VΏ‹�‘jU+KΙηž•΄iΣΘ±γ'dυšu²ύ—φ9ξ…²eJKΡ"…%W�œrΚπίΈi‹ιœ'w.Γ³¬yψεΛWDŸω^6ϋ|ωςJž\ΉΔΟγ“'O›³aZaUη΅" "*ψ΄aψΌΘ�”όϋοΏrΰΰ!ωώ‡°Xpž―e΅RŸ=�Sω${φμςΟ?�Θ‘ΓGδgck]<²-¦}ΥY1ΛV¬κrι6­šΝΊ\Ήυn:Π1Σ>f˚Un3kž“»v›γξ<Ž2 € € € € €Ύ&Π΅G/#€xDV,]"Α!Α�’U[Ι”9³ω˜‘υΌδΙSΘγϋ“o‡Άg=L—.΄i�Šψω…~Χh|�4zΔ°plΪ^ΡXϊΡΗ“T)S™ν7oέ”‹.ȎνیοGN†;ΗΫ*"zۈΡ_@@ΐΗ|1ˆh Ρ₯K—dε²%rόψ1«ŠΟ8ˆ*ˆ¨·―JΗφmμφΌŠΨεΓϋvΫεΙSΏ—:FΈρaγ—nη¦Ώ”kPσσ/ΓΌ΄]ƒ{ƒŒ±ΡΠ€ϋΆwί~ΩΆ}‡h¨N·[·nΙΣEŸu?,Β}ΧA_ °Mά�Y1ϋΎω�ΛέξAΔ­ΫΆK“Ζ έO•£“Ί† —κψ|ώιG’9S¦pηaΏq'‹.{νΎΕΆ―ξAΔ‘ƒΥ°`’φ·~£¦fhUϋψΩ'J–�ώAΕ½/'Nž2�±Δ=Œλ~ϋ € € € € €ψŠ@t‚ˆΊ”³.鬛{Π°u»Ž’>}θlˆ–‰NαάtRˆ†MŒI'vV»”G"7nάp©σΆ‚ˆή6bτ@π1_"ZC΅ί^YΏf΅ΊfUωΔ§_–€’’qz 9{[nΜΊoϝ β€qcŒešCgτӎZ!ΎΨuΒΖ_ΌEgϋΧ₯V¨\ÞΑ0²sbDŒμΪΪ6|δh2l„ΔE1ͺ{·hέ^Ά?k›8n΄”yΎ”΅ιgtƒˆϊΛώj#`©KsGΆi€―FΝΊφ˜8ƒˆ‘§mbΥ0«΅ιŒŽcG.„j΅[ŸrΥ°«΅έΎ:ƒˆΌϋΆ΄hΦΔΊΌœ={Ξ Ξκ1:£ζ²Εσ%eΚΘ]Nœ8)•kΤ²―A@@@@@_ˆN1kΆG₯iσ–&ΓΩ?ΟΘτiSΜr±β%€B₯ΚfωφνΫΖκ\IΝςw£FΘΥ«WΜ²ώθΤ΅‡ρ½Ε³ ήΌ!—ŒU˜―+K₯3&—xΔό~aτΘαxΝ»ΏK$ˆh9@@ψHADu½iόΣ† λδΧ];γƒωΎίSCˆ)[f’D)ύ$δί vφΎί#ΊŒ*ˆ¨a―k–ΫKΥκuύkΧ“#ΏΥŒˆ5π΅yΛs™a]¦ΩΉι¬ˆ³f�䬊°|Ώ‚ˆΊΔ²nΊ€rςδΙν{:}Z*V}Ρά�θύw$cΖ R­Jθ/ΙZ©KοΪύ«„„„Θ_ 2ƒzѝQΟΧΏΦ[Ί|₯t,V΄ˆ$J”H«ΝM—†ξϋΦ;fΉδ³%dκ€q�΅„~όΆwŸμωm―δΝ“[JτPZϋ<-”|‘’± uh7`ώΙcτΩΪ–.7žγ7I“:΄kΣRR€Ha6έ2ώ’fΖrΥΗΝύϋΡW+ˆΨ©c{ιϋjO« rΡXϊεf­ν{υκΡUΊwιd·�l,=gξ½{HηW:X»RΏq3»]gΗμζ)~k̚ΙςΜ6@@@@@ˆN±LΉςςάs‘+<8°O.†›ΘΩs˜;Œ;JͺT©!9sε2₯Φ+₯ύ²=τ»’ 2�fίΞ¬Χ &�Ξg5 "ϊμΠς` € €€w$„ bpP°μψe«lΪΈΡλ�’ΙΣBˆϊ–;ƒˆQ½υ:ΛίoΏ+zΣν~³ύι΅uFΏιS&hΡάt6D1ͺ-ΆAΔ;wξHΉJΥDjΦ6eΒwRͺδsΦ�Λl~χ3ˆθœmΡΊΩ�ν›ΜНξύγ˜T7–CΦmφŒiRΈPA³|σζM)g,]mΝ0hV?6�]!™3e2w£D,^¬¨Μ˜6Ι:]ΖM˜$ŒY›υͺςTΎ|fΥ‘ΓGdQΐ³μDlΣΎ“lά΄Ω>Υ}FA}~š·@Ίvξ(―φμn§ΣM›C�qA+u&Ε‘ƒΪνK—―ξ½ϊΘύμλνΫAΖrIΜ{¨e‡Ξέν0¨ucχώkHsαβY»nƒlΩΊΝΠZΗσ‰ € € € € €@BˆN±\ΕJςΜ3Ϛϋχώ&ϋχο“ϊ ›ϋΏό²MΦ­^%u^ͺ/Ήσδ5λ~ή°^ΆlώΩζλέη s2ύηθοGdλζMrφμŸv»―"ϊΚHς € €€— ψzρΤΙ“²jε2―ŸQ_/O !jΏ’DΤ »χξγΠΊŸAD=OgΡsnΞΎ=¨ βα#GδEcω_η¦A9 ΜY›sYαϋDœ>c–Ό�Ρ§ΦmΜΟο'OgK„.³μ "n^ΏZ2dHo£ΐšu]ϋ¬ £†‘Κ•*h1Z3"6jPO>ϋδCσxύΡ΅η«²|Ε*{?²‚3ˆ¨οJ‰ηΛΊξΎ”΄DόςσO₯^έΠ6]NΈΛΞΎύϋ₯nƒ&rΏϊκ~χ™­v}ΧηΝ™)Ι’&΅ͺμO θ8xPƌh3νF  € € € € €ψ°@t‚ˆΕŠ— •*› ǎ•¬Ω•)SΘ΅kW—Ύ5λ½άLβ ³Όxα|9x`Ώ­V―a#Ι™3tΆD«288X�\Ή"Φ­–Γ‡YΥ^ύIΡ«‡Ξ#€ €ή/ΰ«AΔ›7nΘ† λδΧ];½Œ'πΤ’β:Γ~ΊμπΚΥk΄ZŠ*$Y³f1ΛϊډΞ�0 χ3ˆΨΎSWY·~£σς²gΗΡ%’u{PAΔ]»χH£¦-\ϊΡ£kgιΩ½‹]WAΔ±γ'Ι]g œ4nŒ”~Ύ€yogρ—ΝΜΩ΅aοΎύΖΚMμώY…‘ƒΎ�ΥΜέθ̈آuKιχf_λtqŸΥΠnˆ ΰ "κl’e+Vu9ͺh‘B2kϊT»Ξ "Žϊv¨T�Xή�ͺ`ά―ΎΊίOš΄hc/»μl―^΅Š|τώ;vΤΩf•Ϋ»Oκ5 [Rάͺη@@@@@_ˆN1GΞ�Ω3 j€0qβΔ’³~?e’όυΧ9“₯yΛ6’9KθχR“'Ž 7I‰†K•.coδ΄Όrω²L?V‚‚n;«½�LΡλ†Œ#€ €Ύ%ΰ‹AΔ#Ζ_-­Z±ΜXκτšΗVŠFΔ/kΉ1σ’„œ‹ψ—O!*°3ˆ¨ΛΜvθάΝtΟχd^™oΜηηηgξλ¬ouκ7–ƒ‡›ϋϊΓ=ˆ8rτX4d˜έ�…m›ΦΙΓι�™uΐ_Υ*•dΔΠΑφ±Eξ%ˆΈhήly2oΣ/’΅aΑO³Œe”Ÿ4‰NΡ}Lt)l €Fg‹iρΓχϊIσ¦/Ϋ·}Ζήw/œ={NΆlΫ.χ«―ξΧΧύ'Nšοϊ΅ΐΐˆšE—§~‘Li)RΈω�€ώƒ‰sϋκλodΜΈ°eŝm”@@@@@π%θS₯N-ΊtwyμƒφΙβ… μΊWΊt“Τ©Σ˜ϋƒ~aΧ»2dΘ$…Š–|ως‹^ΧΪ~?rXζϝcνzε'AD―6: €ψŽ€//]Ί$kW―ύEΑ[ΆT=²ŠίΓIδΞυΉ>εοpaDO!ͺσέ‚ˆΪ6tπ@3t₯eέ6nΪlΞ’Ί'’3GY0ίڕݿMΒf,WΆŒŒ=ΒnOAΔq&Ι€―\g5|£Ο«�±}Ϋ!o"vωπΎέvω^‚ˆ£G •JΒfόΈ�™2mΊ}­ εΚΚw£†ΫϋΡ "Ίηζ-[₯eΫ°%©υbτ—§Ÿ.`^χ?Ž™Λ7λNLƒˆm[΅~o½n^O 1J†iοk!uͺT’>ύ#fέΕ‹�!εΐpο^LϋzυκUcΜ–2qάhΙ’9³}ί€₯Λ₯η«a³CZύΠOg@1}ϊτςZ―ξςr£°₯±ηΝ_(}ίzΗΎ@@@@@|U :AD}vύ7wλϋoήΌ!#† ±ItR mO”(‘9«α°o\Ώg±t+/ρ¬”―PΙ¬ΥešΗ:Ύ“r;Τ+v "zΕ0ΡI@@ΐw|!ˆΨλ΅ΧeΧΞ²ΡXŠ9θvΔ³ zκšAΓV%Q c y·0’7„Υ5² ’ΣΜ‘$I’ΨCΰΎ\ο=;μ_uiη―Ώ*Σ˜%iΣ¦‘αC™³ΖY''„ ’.άΊ]GΡε‰­-.‚ˆΦ—ώ`έΒψΕΣΌ―ϋ ”υ5‘“§N›mΊό΅.ƒmm³š'o½σΎ΅Λ' € € € € €>+έ βΛM›Λ£=n:ΈΟ†X�BEy¦ΔsfΫ±£Gε§9³’ε₯3(vμάΥόŽ!ΠXimτˆ° ’u;ˆ ’‡ έA@š€/3gΙ*;λ΅CQQ&eΛL’(₯ŸάΉ,Χ'Ÿ7[’§π‹Ο€nνšv›Ξ€¨�/$OžB xΚΕ捷ߕŸζ…-'aŸD@@@@@/H“&­,TΨ~ŠΒEŠIκ4©ΝύέΖΔ#ΖͺFΊύϋο?r`�>³¬?"»4zΉ©Ή"+—/•ίφό*O,"UͺUQ·ΙΗΙ…σηΝ²ώȞ=§ΤmΠPN¬]³J.^Ό`ΆιΝώ5kI¦�V;:yβΈό8σϋχ¬}α²zΝΊ¦ρτ)\f‹΄rœ³D:ͺ)"€ € € € € ΰŞyF*T¬ε³\Ώ~]F};ΤεΈz IΜΉ\κœ;‡E η9«$W�ξ?ΐ₯=’εσν`ޏsζΚΫο†._\ ~™3sš½Œ΄s‰ι‰γFK™ηK™—ΫΌe«΄lΫΡε�νΪ΄’·ίθcΦέΎ$Ο>_V�ύχ}Z™:U*ιnΜ€W»–Ώdωο/οξΏΏX§Ύ9³Ÿσό›7oJΑb‘α@=wϋ¦υ’.έCZη2Θf…ρCI―\±ΌΉ»o�~γ―ώΒf£ΤJ½wkcΙδ§ δ—Ω³Λ™?�”_vμ’yσHίW{‰ŽnχDΤγuΌ»Ό�A²!ΑD‰i•Ή]ΌxQΎ?QƎ;mψόӏ€aύ—ΜctYεͺώuΜ²υ#ί“yeΑO³μkuοΥG–._a5›ŸŸ|ψžΌX£Ί<τPθϋh59ς»ŒŸ4EfΝώΙͺrωΌΧΎκ2ΚΦ;ιήΧτιΣΛβy³%C†τφ=>ϊτs™ϊύζ{Υ«G©V΅ŠΛ ˆz ?'NžΞΕΎ@@@@@|@ h±βR±²λd=–ΞŒ8zΔ°pMuκΦ—�εΞmΟ€¨hΈPgO\°(άρ:σaΓ—_6&½HeΗΰ<θΚΥ+²|I€?φ‡³Ϊ+Λ½rΨθ4 € ΰ;=k,­0’φΚ“—cŽ+΅'Μ k>rΔ\’8�ξγιΧΥp 3¨ύΥΐœυ°Ώ8 XΊΒXŽΰ’Λ­œΛf_ΉrEŠ—|Α₯=:;ϊ,ως=)I“$‘ΓΖrΙξχˆΞ5ξυ!1w�\†α59|ψχh[>ΘΎζΜ‘C{4›\7–o>vόΔqΉWGŽG@@@@@ΐSrεΙ#O<‘CŽύρ‡"<e7ϋ%–άyσJ†Œ%eŠ”rαΒ9uς€ριέ³ :œ ’Sƒ2 € €ΐ ˆψΐΙΉ!! ³κ,„Φ¦³%~τι9x𐹴pύzu€Ί1sŸ΅­ίψ³΄λΨΕΪε@@@@@@ΐƒ"zΠ`Π@@ ! DLˆ£Ξ3#Ί$σ†΅+$MκΤQr™Kik‘ @@@@@@ΐσ"zޘΠ#@@ A DLPΓΝΓ"ΰ"PΌXQ3b˜€KχK½sηςε+2ΰ«―eΦμŸœΥ”@@@@@@@t@πu‚ˆΎ>Β< € € € € € €ψΊAD_až@πp‚ˆ>@t@@@@@@ˆB€ b@4#€ €Δ­AΔΈυεκ € € € € € € €@\ DŒka� € ©AΔHyhD@@@@@@<^€ ’ΗD@|[€ ’o/O‡ € € € € € €Ύ/@Ρχǘ'D@½νΣGŒϊNnξk@±bωrfωμΉΏ€lΕͺφqQόkT“‘ƒΎ²kΡΊ½lΩΆέήχφBόωeήμμΗψΰγώβ‹aKϋ#)h`΅™ΚΜ‘#‡ρ§”3gΚ‘֑ߎŒδ¬Ψ5ωϊϋ;ΞF@@@@@ bJ•«JΞ\Ή$Mκ΄’8Ibϋ Ήv횬ZΉLŽ9bΧ'ΔAΔ„8κ<3 € ΰAΎD¬]§ž¬Z±L�^σ Ω„Σ•}»‘€I“DωΐgϞ“ΟΎ(K–Eyltp"Žώnœ <Τ<• βέ "†Ϊτ{λuiΣ²Ή=3€SLgΡ|ΉY+9yκ΄³ϊΎ” "ήF.‚ € € € € ΐΊφμ-Ι“%τ©wοΪa|gΈ<�c|Ή‘ ’/.Ο† €x€/_νϋ¦1νϊ Ω°aόΊk§¨ϋV£DΤ§ΎuϋΆ΄lΣAvμάk]βvβΈ1’'O.9qβ„tκΪStφCέ"ޝ— ’HΥ*•dΔΠΑwG2ZvνώU5mι11i$ˆ5ΞA@@@@HθDLμ—X.“ όυΧ9Ήtι’d˚M²=ώ˜€J™ΚδΡ•ΊfΟϊANί%č bBuž@π _ "Z€gΟώ)Λ–,6 ±κψŒ[gρ�₯Λ2yΪχζ Σ¦I+₯Ÿ/)OζΝγ�±ηk―»Τέο‚ˆw%ˆ(2xΰ©υ’Ώ‰$έzΎ&»~έ#πŽT―ZΕ¬–§ Ώ;d ["ΖŽΣ@@@@@΄@Jc‚ŠλΤ­ίPrεΚmΆ>|PΞ›αqΎ^IΡΧG˜ηC@<\ΐΧ‚ˆΚ,;~Ω*›7o’ c>ΆΈpΧ�Ϋ :wsΉaγ†υ₯�ΗΨuΏύCjΤzΙήoΫΊ₯$Nμgξ/]Ά"άrΈ•+U�εΜaΆ�ΆwΏlή²Υ,gΝ’Yό«W3ΛϊcζsŒεΉCN1Oξ\RΆLiΙ—οIΉqγ¦lΩΊUΦ­ί(εΚ½ C}e_·Eλφ²eΫv{?’Bϊτι₯ώK΅Ν¦ΰΰ™0iŠθŒz­bE‹‘η'ΗOœ”Ÿ7m–#Ώθf†«U­$=šM�₯K'.\”SΖςΐσ. η⼈ޫz΅*fθ3Gφμrݘ!τΈρΧ~›7o Χχ¨‚ˆΕ‹•βΕŠΨ—ί±swΈ,_nΤ@ς=™W²crGΜ9#ϋ”yσΪηΉΤ¨J₯ Rπι’,Y2σšλΦo0g±lϊr#I:τ―Χ¬]‘‘φ«Dρbζ3¦2žχθ±crπΰ!Y°(ΐύVQξυ­”7ΖF·=Ών•ϊ›™εJΚΛθ‘Λ{kE₯j/Fκnžt—±}Ώ΄/OΘ/Ήs�Οψ�#‰5ώΏ9pθP”K›ίΛ»ΰμz£υ$�SωŒΏΝ*·pζΩsηdη�έQήΟy Κ € € € € €Δ‡@ζΜY€y«6ζ­�ωη’±’ΦwαΊαg|WS±rUyτ±°oήΊ)/\Ϋ·ίǜ wŽ·UDτΆ£Ώ € €€ ψbΡ"’}ε²%rόψ1«ŠΟ8ˆ*ˆ¨·ά³c‹€H‘ΒΌϋΡ?ŽIυšuΝ²†΅όd–υΗΗύΘ”iΣν}-Μύρ3₯ε]»χΛεΆΠ’”+[Fƍa–υGηξ½dεͺ5ζ~TAΔNΫKο]%I’$ζρ֏‹/Κδ©Σ₯wΟ°0et‚ˆξKύΎρφ»ς^Ώ7%mΪ΄Φ₯ΝO}οΛ―Ώ1ƒŠ. ΖΞΘaίH•Κέ«νσ&Nž&_ �έΏzUωΰέ~’!CϊpmZ‘αΠ^Ζ ”VH3² b‘‚OΛΤ‰γ$Uͺ”φ΅>ό€ΏL›>ΣάΧ{}όα{ς°’Œh;vόΈtιή;\P}Ύθ�q8yϋέΜ ͺ5ΓFŒ’‘ΓGΊ\~ΰ€ώR·N-—:kGƒ}ήθ'ϋφο·ͺ’όΤρνΦωσ8Ε³šρ>κΨk`Vƒ³ΊέΎ$Šc–}˜φGϋΥφfΏχdΞάωφaΊŒππ!_Ϋϋw+¬ίψ³΄λΨΕlΎ[1gŽ2γϋI’ώ‘GμΛ 9Z† {κ8jH1iRΧπ¦}π ΚωΧ�gWλyΣ§LύKÈ6 gZ!Dmw"Θ6ɘ‘±hD§ΪuΧ₯’1{‘† £³ιlŽp΅ξ{˜­ςτ™?εωRΟ٧Ϛύ“τ{οC{?Ί…ΨΌ_:›αΪ•KΩ0Šτv·Œ™^kΦi ό΄Ά˜Ό :«θ²Εσ%eΚ°ΰ©u=η§ϊT�qΤye@@@@@΄@žrΔ\^:W��IιR%_Ί“[M�±swY³n½DD\b,‰={ΖTyάXŽΐΪ¦MŸ!~ς™΅+_~ώ©Τ«Ίό΄Vn2–}ήh,5ύhΆ¬β_£š<ςπΓφ±M[Ά•νΏμ0χ§!ΤηJ„Ν,¨‘Αε+VJȝ;¦·{θΞD¬[»¦ ό"¬ηΟ_°g“ΤY³κ²Π}ίzΗξCT…WΪ·•ΧϋτŽπ°mΫwH³Vm#l‹ͺ26οΧcΦΘυBg ΥϋθlsζΞ“ cΉωΪ΅^ Z›Ϊ·iίΙΪ•˜Ό ½ŒYA»w »ΖΟ›Ά˜χΣ₯³Ϋ΄ja.ƒmέΐ9¦VŸ € € € € €½{HηW:ΨOPΏq3{Ιg›nސβ·Ζμ˜'OΆ₯€ € € € € €@|”zΎŒ<_ζ…p·>vτ¨ό4'l5*λ€ 2I«ΆνΜ]]Yi�ψο¬&Ÿϋ$ˆθsCΚ!€ €ή%‚ˆΑΖlb;~Ω*›6nτϊΏdς΄’ΎνΡ "κ±�ωGή|ϋ=sf>έΠAΔW{v—�Γft_κXϋ4fδ0cΓrZ4·˜, Χ^ ζι…Z΅h&ου{3τ’ΖΟ―ΎώFƌ›`ο; :{Θψ+Ύτι‘ξ];IΩ2₯Νf-ρ™R‘Ώ\χμΦEztλlŸfΝxhW…νZKΪ4iΝͺ«V›!3χ ’σx-―]·A:tξζ^αΎ†Υ�¦}HrδxΒ%i=[…reε»QΓνs§~�ƒ|τιηφΎά—2vΈΈ{ϋfc©„Πeƒ5ΔΨ₯»λ †―AΊΒ… ΪΧ«κ_ΗξΩ•n΅Υ₯Βs³FF΄9Η.`ώΙ“'·y˜/'LžΡ)v]lή―’E ™aUλbΊt·.ανά:uh'}_ ύ«M­ΧwLϋΣwΑ}FD}Ώ4„ͺοΐ–­ΫŒε읷§Œ € € € € €@Ό δΞ“WΚW¬d̈θ'ΙR$—δΙ’Ϋ}�ΙH¦Nž !!!vzχy܄B'Ν8ϊϋΩΊy“œ=ϋ§Λ1Ύ°CΡF‘g@@ΌXΐΧƒˆ§Nž”U+—yύ,ˆϊŠybQϋε "ž8qRΖN˜€Υ’8qbs¦»²/”–‚O0λτ‡ΞτV½f9{ξ―DΤe~uΉ_k+ωBE{6D«Ξ=“ βΫο~ ?Ξ™k]�όΤ%˜—Μ·λœA3 ―‹,χBΓ$·$MšΔ>ΞYpθ/uλΤ²›σ(b—#+DDŒΘΔΊ^Ic™θŽΖ’ΖO=υ€ΛΜ|V»υiΫ΄j.οΌυ†U-=_{]–,³χ΅οΙΌ²pξvDΤΐΰ– «νϊθ¬Y&#;vΦτ).K::|DR§N%=ϊ¨}Ϊχ?Μ”>ξ/›Χ―– B—Τξή«,]ΎΒ>&’Blή―F κΙgŸ|h_V—™Φ妝[ρbEe†1ƒ€΅YV1}4κ3κ�ŸVΰRλά·ίφξ“zšΊW³ € € € € €€G€1V‡j�Jgρσσ“   φΝΧαϊU¬x )UΊŒ€H‘"\Ϋ•Λ—eβψ±ΖΉ·Γ΅ySADo-ϊŠ €ψ €/΅΄jΕ2cYΡk?b)eΏ¬IδΖΜ‹r.β_n<9„¨ΐΡ "Ί¨V¬\-]zτ7#βΘΡceАa.γΆmΣ:y8]:³nΧξ=�¨i ³\�l7z„}¬3δζ\^Yg^,[±ͺyœ{ �Ώv=9ςϋQϋZp_�6&AΔΟΏόZΖOœμr]χΩμΎ7QΎόz°ΉΤ�.Ήkm6ά΄e‹μΩ³W.‰Χ¦U ΙυΏœf³3ˆψΑ»oK‹fM¬ΣΜgΤgj‹*ˆ¨ηςΩ2yκχ.—ϊmηVIžC£3\¨AΠ™ίO‘Œ38�ZΤe‘ ?S*\½{Elή―ͺU*Ɉ‘ƒνKκΦΊ”΅ss_κΪZ.:¦ο‚σΪώΥ«Κ ΖΰE 2�ΏΤM›5¦Ξ:Κ € € € € €xŠ@§.έ%UκΤfwόβ�έʐ!“*RXςεΛo―�~δ°ΜŸ;η�ηyCADo%ϊˆ €ψ°€//]Ί$kW―4Qπ–!KΥ#«ψ=œDξ\‘λSώFττ’:G'ˆX»¦Ώ ϊj€=,«Φ¬•N]{†› oχ―{€a“Π ‘μ6ŒmΡ}†> ΫiθΞΉ­\ΊH²?ρΈ]“ ’.χ[³nϋZΠ�ciP―�]§K�κΐγΏ)e˜΅Uͺφ’œ3δ/;vJ“m\n3xΰ©υb˜_ϋN]eέϊΣwA/�ο‰nΞ§šΏΦ«»Όά(μΦe’uΖI6@@@@@e‚+ZΔ~άƒ…ΦqΦg½Ί΅εΛΟ?΅vE—£ί{rρβE»nΪ€q‘φΙ>0‚‚»Σ½Ύ_?―[)™2f΄―<|δh2,tΦΟζMΛ»oΏ)Φ;€³4>_Ά’ Œι»°hήly2oσ~—.]6–_nb‡9έg³œύΣι/xΊ%J”Θˆ™�ύΠ•ΞhΝ^0ŽδΙ“ΫyΘ]Λ± "κ…§N+%Ÿ{ΦεΪg???σ?—c'¦ADχλ8χ5Χ‘s7³κ½~oš3ΪYνRΌ~ύ†$K–ԝYmΞ ’ֹϐ§uzLš4©]žEŸΟΏv}9vόψ]ƒˆ]8w–KnQΐιέηM½¬όm§Λ5―^½*)R€ΧG=ΦDt�i{d›3ˆ˜'w.YπΣ,—{θ{sωςesΉκ”)SΪ—rŸMΣnpτΧ,_,ΞσΤ{�rι�c†Ό’ώ‘Gg„Υο΅Χί’€₯ΛΓ΅ΉWΔζύjX�%ωάu:·[·n™�Ya]«Νι€u1y~ρ™Τ­]ΣΊ€13ζUΩ»oΏω£ <%Ɍ%·­ν·ί•Ÿζ-°vωD@@@@@ΰ ”)W^ž}Ά€\ΌpAφώΆGŽ�CΞ�ύ·±ͺRyΆd)y*ϋ;ŒΣ§NΚΜΒVyʞ=§ΤmΠPNί‘¬]³Κ˜œΰ‚Ωo]’ΩΏf-Ι”9³ΉςΔqωqζμ™ββFγB•k"€ €D[ΐ‚ˆΡ~X>Π=Œ¨]υ†’φΣ=ˆ¨uwΫ4„ψφ»Šά¬­r₯ 2jψkΧε388X4ˆeΗξGQg›8n”<ςπΓ.χ²vΜωS}4›΅£ ’>§ΥgϋB�tφ½ζ­Ϋˑߏš5Ί΄π’ysΒ-μ~žξ»5X7cΪDs‰λˆŽ·κϊψR&NžfξήmFDmΤǍα }�£OeϊŒYςΑ»oK‹fM¬KΊ|κlzΞ/AD=°ο«=₯cϋΆφ?8Ož;ΌT'tζE­wΨυθΪYΊwναΉΦuΟΏ -Ϋv°M­ϊˆ>5x§Ό¨6χ1Τχ°KήζRΘ‘ΫχkΨ7_‡›•Σύ~:c¦Ξœιάbς.θrΠ:«dƌœ— WήΈi³΄iί)\= € € € € €< ">χ\©(ouσΦMωnδ·rΫ±‚Z�\y€nύφΉ!!!bLR$qb—ΊiS&šαF»� ½pΠθ2 € ΰK=g4aDν•§Ο„hΙνΨ²ΑXF9­΅λς©a�[·nΛι3§EC„C†tYΧ:X—ξχf_—ΩθNŸ9#γ'N‘Ε‹‰.«›.;ά©kO³¬―93§Ω‘9 Ji`J7UNg—ΣMg¬κ_Η,[?4όχυW€hαB’Τ˜υMgoόΛψΛΉ΅λΦ‘»eφŒiφ’Ηυ7“=Ών΅Nπ³j•J2bθ`»­kΟW₯z•ΚRφ…�Ζ_γ₯7λoήΌ);wν–ΧίzGΞϋΛ>V … >-ΎΧO *h.Ϋlυgώ‚ΕrύΖuΡ0žnηώϊK^¨PΥ,;hH°vΝ]Β€Ϊ~ψΘc©λa²rΥϋp Ÿ-]4Χφυ5ϊ£ΛH[Ϋ«=»KΧΞ­]—{φιέCZ·ln†,u&Α  `s6Α~ο}(³¦O±Γ—}ϊΉLύήυ―5δXΥ0Ι�Τ“¦Ήšnή²Υ4YΏ:l¦Aχ ’v€TΙηδύwή4fAόŸ=ήZ―¦ /‘o%Œ­6΅>ͺ­€±tίΧzIΡ"…ΓzαΒE™5{ŽιΦ±}Σή •j[©²Ýγ^Ϋχ«ώKu€G·ΞςΨ£Ϊο‘ήCίΡIF tΜΈ ξ·΄χοε]Π“τ}θΥ£‹T«ZΕeDmΣχmβδ©2vό$έeC@@@@@ ^rεΙ#U«Φ”©RΉό»ΉΥύΞβ„1£αβσΔ}ωfω°αΛ/ίaD|ξ•«Wdω’9~μλr^ϋIΡk‡ŽŽ#€ €Ύ!@Ρ³ΖΡ #j―(@Ρ•Gzΰ‘xg<μ†+—.’μO: € € € € € €AD^@@x ˆ―όά@@@@@@ˆ΅AΔXr@@ΨDŒη"€ € € € € € €ρ/@1ώΗ€ € € Z€ b‚~@@@@@@|@€ ’ "€ €x³ADo=ϊŽ € € € € € €ˆDδ-@@ˆW‚ˆρΚΟΝ@@@@@@@X DŒ5!@@ˆAΔΨθq. € € € € € € �γ θ €  "&θαηα@@@@@@@ΐ"ϊΐ ς € €€7 DτζΡ£ο € € € € € € €€ADή@@x ˆ―όά@@@@@@ˆ΅AΔXr@@ΨDŒη"€ € € € € € €ρ/@1ώΗ€ € € Z€ b‚~@@@@@@|@€ ’ "€ €x³ADo=ϊŽ € € € € € €ˆDδ-@@ˆW‚ˆρΚΟΝ@@@@@@@X DŒ5!@@ˆAΔΨθq. € € € € € € �γ θ €  "&θαηα@@@@@@@ΐ"ϊΐ ς € €€7 DτζΡ£ο € € € € € € €€ADή@@x ˆ―όά@@@@@@ˆ΅AΔXr@@ΨDŒη"€ € € € € € €ρ/@1ώΗ€ € € Z€ b‚~@@@@@@|@€ ’ "€ €x³ADo=ϊŽ € € € € € €ˆDδ-@@ˆW‚ˆρΚΟΝ@@@@@@@X DŒ5!@@ˆAΔΨθq. € € € € € € �γ θ €  "&θαηα@@@@@@@ΐ"ϊΐ ς € €€7 DτζΡ£ο € € € € € € €€ADή@@x ˆ―όά@@@@@@ˆ΅AΔXr@@ΨDŒη"€ € € € € € €ρ/@1ώΗ€ € € Z€ b‚~@@@@@@|@€ ’ "€ €x³ADo=ϊŽ € € € € € €ˆDδ-@@ˆW‚ˆρΚΟΝ@@@@@@@X DŒ5!@@ˆAΔΨθq. € € € € € € �γ θ €  "&θαηα@@@@@@@ΐ"ϊΐ ς € €€7 DτζΡ£ο € € € € € € €€ADή@@x ˆ―όά@@@@@@ˆ΅AΔXr@@ΨDŒ^μΟm’DκKY"A2Ε/θž.ΨΙ8·œqξ:γάΡχxξ=݈ƒ@@@@@@𠁀I“Jςδ)δκΥ+Τ«ψν AΔψυηξ € €@‚ ˆΏ―ΐ΄vξ%Ph…­“›ϋέ°Šό³{—N’:uκο$'O–ΓG~—;wEx • € € € € € €D%χνώE’& {†»έγΰ‘ΓςI�²eΫφ»β1υoτyU�€ WΞ™;Ovνή―}+WΆŒT©TΡμΓ?�ό+ƒ‡Χώps@@@@@@ΰA €OŸAš·nkέο"kŒ0βξ] wb ‚ˆξoϋ € €T€ βεŽπfχ,Ό—c#ΌYTF7ˆ¨·Ύ};H6i!ϋφžάŸKfΝ’YΦ―^n_lΰ !2zμx{?> ƒΎ ΅kϊ›·Ύzυͺ{�L|tƒ{"€ € € € € €ρ"ΠͺM{ɐ1£yoqΣΖ rι�e)R΄˜δΞ“Η¬Χ0βˆaίίGݎ—>ΖχM "Ζχp@@  DτŒ :ΓθOγ "^Ώ~], 0»‘*UJ)ύ|)I�Θ#.έ:lL‹�b.už΄CΡ“FƒΎ € € € € € €@BxΨψ�©mϋWL†  Ϋ2μ›A.$ΥjΌ(O,dΦνΪρ‹¬^΅Β₯=‘μDL(#Νs"€ €*ΰνAΔ:uλKξΌyοIχφ­[2qΒXΉzεΚ=ΧG4Œ¬-�ϋΥυAΔ΅λ6H‡Ξέ\N©^΅Š ψ…ΛςΝEK}ziX―�dΟώ„dΚ”Q�\Ή*gϞ•UkΦɎaKδ{2―ym5Κ�T>ϋ:oΌύ�Y>xθHΈΩ%5¨g›-kVΉ$gϝ“»v›Ο`_€ € € € € € ΰ%EŠ—JUͺš½ύݘπbώάΩ.=χσσ“½ϋˆ~ί?1Μ₯]w΄­bεͺςθcIͺ”©Μφ›·nΚΕ dΗφmrκΤΙpηx[ADo1ϊ‹ €ψ˜€·Σ€M+mΪv€Ι’E{dΦ¬^!;ω%ΪΗ?Θ# κύΛI»λ$HFϋΩϋρ]ˆ*ˆ¨ύ”EKœΥαΚl\΅lqΈzgE­—ΚΑC‡Ν*=ώ›―Ώ”Β… :±Λ`|΅Ο›vΰ�jθΠ�΅τμΦER¦LiUΉ|j€Q}t:θ+ρ―QΝ₯έΉ³rυZιά­§YU�lωμ“%KζΜΞCμς‰“§€ρΧ‚ξAOϋ  € € € € € €€ T­ξ/ 6{ΆuλfΩΈnmΈ^vνΡK’'O!Ί<σγϋ禓P4l�\’$Nμ¬v)>DnάΈαRηm;½mΔθ/ € ΰcήDΤα(φΜ3R‘bθΜxQ Ο9cΦΉΎŸlόr'ͺCγ­έ=Œθ숧…΅oΡ "N7ΖX¦Ή€ύ(»χ’•«Φ³Ζ<ˆ¨3Ž:ΨΎfd…/]’ •k„ :ΟΉ— bκT©dνΚ₯’.έCΞK„+οΫΏ_κ6hbΧϋW―jώς›(Q"».’‚ΞΌΨχ­w’DΤε€—-žΧp£u'NJ塬]>@@@@@@p "nή$7¬ Χg+ˆ¨ ΊR—sλΤ΅‡€2ΎΫΡνζΝrιί%πz €M›N1–}ΦΩG.Χ�9OσΊ2AD―2:Œ €ψ–€/ύόI“f­$‹±md›†˜6YΝ;ΩaΡQΡCˆŠUQ—!ήΈfΉ$I6«£νzrδχ£χ=ˆxφά_Ζ�Ν[€h‘Βζ2ΝΞΑΤYgΝ›}ΡΩf•?z�ɘ1ƒT«RΩͺ2g@ά΅ϋWσ/θΎψjfόμ“€Qƒϊφ18\Έx‰ά1–onέ²…h0ΠڜχυνP©\±ΌΥ$ΣgΜ2g†|όΡG₯G·ΞΖ/ΌiΝ6]ΆZ—―�ι_Cž/υœ±άtY—™gΜ ]r`Ϋ/;Με’{υθ*έ»t²―ϋσ¦-2gξ�R…ςR­jhςζΝ›ςΑΗύνΆA_ Ϊ5ύΝύ«W―J±ηΚΨmZθΣ»‡t~₯ƒ]WΏq3ΩσΫ^s_gzμζ)~;r4Λ3ΫR@@@@@@ΐΣtΦΒ6ν_1»t[†}3Θ₯ΛΥjΌ(O,dΧ-Z0O<`ξgȐIZ΅mg–/^Ό(“Ζgηk‚ˆΎ6’< € ΰeΎDTφς*Kρ%"+—/Λ€ γδφν[Ά{ReD!D«ž8+’sFD«Ÿwϋ ‘7ή~Wζ-Xdr?ƒˆΦrΖΦ½5π§Α?kΣΩuvΒ¨Ά¨‚ˆE‹’YΣ§Ϊ—Ω±s— >�ήΧΒθC%yςδf3¨8m�8yξΩ°wτδ©Σ2wώΡ #›₯0ͺ ’ϋŒˆ—/_1fh ΅λ6Θ–­Ϋμp¦K'ΩA@@@@@ΌD u»Ž’«pιvνκ5ωyγ:c)ε@)XΈ°δΞ“Χε)–,^(ϋχ…NΨ  ½ϋΌ!‰%2WΆ:ϊϋΩj,ο|φμŸ.ηψΒAD_Ež@πb_ "&MšLZ·m/iz(܈θνΏ9�ήΣ*άCˆ<Τ­œ„-kμiaΔθuΖΒξ½ϋK'o΅Ωοg±ηk―Kΐ’eφ΅΅ΰμΫύ "Φ©Ž|ρΩ'.χ‰j'o"ζ!͚4]ώ9’νΦ­[²eΫvsωhχηˆ*ˆ¨ŽσζΜ”dI“†»΄†?<(cΖN”EKΒ΅S € € € € €xΊ@ζΜY€I³–’8Iβ»x횀JΪl›ŸοαΓ‡eνκ²νϋοΆ₯Φ‚ˆ©΅ηh7 € F�RQ»DΏρΤΰΞF½³}Ϋ6™7wvΐΊH\B•.*ˆΫΆ³}/nΨO‡^Άb₯mR±›n’Λ.Λγ7οΓ%Kε‘.έόeIΚ b›φdυšuη�bΛΡ!’uJͺ bλV-₯wΐϋΈhˆ…ro-χ―SηG:JϋΆ­%cƌ!φŒZ5sφ{�ϋΙώώφΈ‚ˆΊc­ΥmΘρ�K£Ύ θμΜ|ωΥΧrW“�†«v61‹ € € € € €D΄€ 7i&_œΓ$žψϋoωώϋοδβKrΘΥW_mΫ�ϊΐ—£έG‰’₯ε–[+ψŸΉ;θΘjƍφ95OSsοΡv@@ €΅ ’vIƒ†$Α¨μ�˜*sƏ‘#ζM‘<Ε'hŸ}ΞΖ=ΊAD Έm‡‡m3nΈΎ Μ3Uϊ�₯Kg—΅2_ƒFMε»ο�«LD|cΤ4dXΐml\ΏZ.Ύθ"»ξ³­_H“{ZΨωΥ«ΚΘ‘―ϋϋ¦T±v­2τυώuW¬Z- ߏΉ� V:\τ᝹ kViPΏ�”/WVnΎΉ¨\yΕΫu‘αέΝελoΎ±λγDτN ν«XαV)vσM6θ™>}ΰ7_}m°Ό5φΏ!«½γxD@@@@@R‹€WˆβoDΤ©­)X‘={v[ιΠύ'ψ~.½4—άTμfΉα†B~EέGGVΣΦRσD15χmG@�€@Z "f3o2Z=ΨVΞ7ηV�X*ŸnήΡ=Nΐ0œ}Sκ¦c "κυυžγΌiέϊ₯U›φή’\{Ν5²dΡ<yλη_HγζQAC]y[₯ 2vΤHϋΩ"Ž�Ά xuί†ΰπδ†O6J‹VmύνήΜΥW]ig;ξWCΤ’7=vΜ›•Β… ΙS}{J©’%όu}ϊ=m«8κ 7ˆψΟ?§€p±Rώ~ތwnχΌ9rδΗ»<"͚άνν&sη-ξ½ϊϊΛΜ € € € € € €©Yΰ�œ9₯e«6φώ:tHƎ~3^·S²t©\₯ͺέW‡iγ|&―DΨN#¬Ch € p� €Ε ’φa‰R₯€P‘’2υέwδΜ™#Ά[ο�7ƒάaώοM«ε”xΓ1{λ‚#-Œ[Qƒ†‹ζΟ– ώ»G "j Ρ›Ύύb‹xUϋthηΧ•)Sg˜o­e“αCΩΚ~ήΎg#ˆΈγǝς@λ‡δΧ}ϋ½fΘ†u+%Η%—ΨεΣ§OK‡‡»ΘΚΥkμ²ߝ8A.Λ“Ϋ.οΪ΅[ͺΧ�o« nωd_!ςσ/Ύ”»›έηŸsΐ ΟΚέw5τ—;?Φέ―€8pΐ �°A=ΫΛɘqoϋΛ ηΞ’λ °Λ‡ύe†_n.{~ϊΩ.ΧΎ£¦ τͺΏο¬9s₯Wί§όef@@@@@@Τ,π`›vfhζ¨Οm>\΄PΎώκΛxέΞd“‡:t’σΞ;OŽ;*£FΧq‘ΊAΔHνΪ… €œ#i5ˆ¨έw‰yΓρΗDtON>“Ωo_|BˆήΞΑaΔϋ�E•χΆ§δclADmΗ+/=/w5¬ο7ι«―Ώ‘;7χ—Ν›- δχ—c›I‰ ’^�«Ο6JFSQӝ4ˆΨ€ω}6Ψβήζ��Ιήώζ�ύΧ9>}:ΉξΪk‚—nEΕ•K ΓΌo�~ω~Ϋryž<’?>ϋFWOͺαΖRε*ŠWέ°kη‡εανόλιΜργΗmΕΔη^|YΎό’44C={Σ‘#GD3eΚ,… ί(Ο?ίΫ$=z?)sζΞχ—™A@@@@@"] wξ.… •²·ά"Ω²e·Ν?a†i9|Hΐ­δΝ{­44Ηύ΄k—¬ZΉάŒbuΐnΧ!škΧ­'ΉrG–Ψ³{—Μœ>5ΰΨΤΆ@1΅υνE@�˜@Z"¦†�ͺόoziχοωςΑy§d’ω8“F 'ΐΞωγ»o\AD­ ΈμΓ…ΑΎΗŸθ%σ.²—¨V΅ŠΌτ¦Π»ΆςNž<)Y²d±«R*ˆ8bθ ©Y½šΧ �±ήmΰPWθΡ:ttlΣg[?·CQ{B¦Z‡Yv+D†:ώΕ―Κψw&ω›tθζ™S'Ιωη�WYR7.[±ΚTcμl‡Έž2qΌδΜy©L¨™ΰ‘±CνΓ:@@@@@@ ��Ξ›W7½'Ζf:υΜž9]~ώι§€}ςε+ έν―;s挜1&2€O°n²νκχί~σΧ₯Ζ‚ˆ©±Χh3 € †"¦‘Ξ\²Τ_ηΝh`S«"ζΟ—O²f f.^ΊLξόΈέE‡ΑξςhG©Y£z@Dέ¨•'˜`£;œ³=ˆ € € € € € €@*Θ‘γRΉο„Ϊlύόζπ_ΙΤw'ΙΡ£G’έ‰V>lά¬™)z‘Υ™Κέιπ‘Γ²δƒE²kηξκT9O1UvF@�ŽAΔ΄Σ—iαN�ΎκJ[έoΫ?Ψ!#εž4˜θU5 Υ&έ^¨Π’>]:Ω΅{wΌΪ�Η\eξ7w�\rΰΰ²Λ Ϋ5B]7¦uJΌςŠΛεΈ‚`η�έf˜ƒ1νΚz@@@@@@ ΥheΔ+―ΌZ2gΙ,»ΝpΚ;ΜgJρ™�§K/ω ”Ksζ”,™³Θδ§={Μcκ�‚θή;ADWƒy@@ ˆ˜βδ\@@@@@@HR‚ˆIΚΙΙ@@Β ˆ�ϋ#€ € € € € € €‘%@1²ϊƒΦ € €ηœAΔs�ΛΉa@@@@@@HcΣX‡r; € €@j ˆ˜ΪzŒφ"€ € € € € € €=XB@Ha‚ˆ) Ξε@@@@@@@$ ˆ˜Δ œ@@ <‚ˆαy±7 € € € € € € i#­Gh € pŽ D<Η:œΫE@@@@@@4'@1Νu)7„ €€.‚ˆ©«Ώh- € € € € € € ,@1X„e@@ ˆ˜’ά\ @@@@@@Hr‚ˆINΚ @@Β ˆŽϋ"€ € € € € € €‘'@1ςϊ„!€ €η”AΔsͺ»ΉY@@@@@@HƒΣ`§rK € €@j ˆ˜šz‹Ά"€ € € € € € €Ρ"F7a  € €@ DLAl.… € € € € € €$ƒAΔd@ε” € €ρ ˆ+φD@@@@@@"Q€ b$φ mB@Ξ!‚ˆηPgs« € € € € € € &"¦Ιnε¦@@Τ#@1υτ-E@@@@@@B D ₯Β:@@ ˆ˜bΤ\@@@@@@H‚ˆΙΒΚI@@β+@1ΎRμ‡ € € € € € €D¦AΔΘμZ… €œ3Ο™�ζF@@@@@@@  DL£Λm!€ €©E€ bjι)Ϊ‰ € € € € € €„ ˆΪ…΅ € €)$@1… Ή  € € € € € € L“ –Σ"€ €ΔO€ bόœΨ @@@@@@ˆT‚ˆ‘Ϊ3΄ @8G"ž#Νm"€ € € € € € €@š ˆ˜f»–C@R‡AΔΤΡO΄@@@@@@ˆI€ bL2¬G@H‚ˆ)ΒΜE@@@@@@@d ˆ˜l΄œ@@ >γ£Δ> € € € € € € €@δ DŒάΎ‘e € €ΐ9!@ρœθfn@@@@@@�°AΔ4άΉά € "¦†^’ € € € € € € €@ΜcΆa  € €@ DLd. € € € € € €$£AΔdΔεΤ € €q DŒΫˆ=@@@@@@@H ˆΙ½CΫ@@s@€ β9ΠΙά" € € € € € €€i‚ˆiΊ{Ή9@@ ς"F~ΡB@@@@@@@ 6‚ˆ±ι° @@ Ω"&;q’/pρ%—ΘργΗδΔί'}.N6.ȚU2eΞloξΰΑƒ}“OχRJ•,ažΣ'€iσ{“€­…nΌQή14ΪΉŽ9"υ6ŠΆ>%V€¦>I ψ^Cϋς•—_°»Ox{’Μš='Ύ‡Fά~Χ, ― |ΩΆk�δ)2mϊ̈k# B@@ΰ\ΨπΡΙ’%KΐνΏΏθCιΥ§oΐΊ€XΈ&ο5r]Ύkεͺ+―Γ–]{φΘgŸm ϋΤ9rδπIκχώzξ•ΛϋηχfF'ΓFŒτyD@ˆp‚ˆήA4@Hλ#―‡«V«!ΧζΛ'Ω.Θ.ι3€χxζΜ9zτ¨,7ήρΓώzo¦@λ₯VΊήbΘΗS§OΙ¨ΓBn‹„•ήjq_T8mυš΅ςΝ·ίFB³blΓύ¦­YM›·mί.Λ—―ˆqΏδή°tρ"ɝ+—όϋοΏrkΕΚrτΨ±δΎd‚Ο�Ξψ±RΌx1{όΝ%J'ψ<ξeΛ”‘1o½α�²σ�όsJJ•½%Ϊϊ”XŸ>)R€°TΌυVۜI“ߍθ~K©Χζm+Κπaƒ­Ι˜±γdθπΤϋWωrεdΤ›#μ½Lx{’ <$%žz\@@β!ΰ8(O?ϋΌ=b»yo�ΣΟ?Ηγθψν’?ίu�£GwΡχΑ“ G+S¦N ήrΉύCmεαNόm;=*λΦ―χ—uFί·•.]ZrηΞ%Ϋwμ-[> ΨΧ‚Ά3c¦LφΛƒ­ΈίξN1.5Ά#€ €‘%@1²ϊƒΦ € €ηœAΔΘλςN»J¦Œ™bmΨΦΟΆΘς₯Kφ)VΌ€T­^#`]π‚ΥΏφJπκˆY�XαV9<ͺ²έΨqγeΘ°¨OΔ40¨!ŸΊΙ�ΡJ-l΄5e›5m,}{χ²Ϋ΄y‹΄nΫ.e.œΐ«$GQ?l©W―Žί’ŽΪKSIτlγΫ'wν"ή‡;ν;<,λ7lπο!�fRκ΅I1�zžφ € € 6Ό βχΫ~ΖM›'ωMj…ΑΣή•\9sΖzξ—^~5Ξ0βUW^)³gN“Μ� AOψΘ£]eυΪ΅ώΉλΤ�e�6={v†»?ΡΣ„τΧΕgΖ}_F1>bμƒ €DŽAΔΘι Z‚ €œ“#―Ϋ5ˆ˜>]z9πϋο²�>9tθ\~ΩεrωUWJΦ,Ymƒ5P8kΖTΩ³{·nρΠ‘?mυDγ�gNž<)sfN^1Λ)vJͺŽ„ β‚Ή³%oήΌφ–:=�YΦ�ϋ(©n/YΞ“AΔΰ†N}w’.tγY "Ζ·O"χœˆϋ£ϋ°@@’F Ήƒˆ=Ίw3#>άc{όψq™;oΎθΘW]u•άug)tγvΫί�-eΛWŒυ¦ΖŽ~SʘJ‡ξδ΅ςβ΄)“%cƌξ.vώǝ;₯α]£­m…ϋΎŒ blRlC@"O€ bδυ -B@Ξ)‚ˆ‘ΧέYLu·γ1 ­Ϋ°QcΙ—/ΏmτΆmίΙ‚Ήοω7ΰW._&Ÿn‰ͺΦηο f"†ΧIwΤͺ)― xΡτνwίKΣζQΓZ‡w–”έ;­Γι‚ˆΡŸ{ξ^£ϋ°@@’F ΉƒˆΣ¦LςΓ†σ,”Ύύϊϋ Ώ&ο52ξ,ωž-ε«―Ύφ—έ™Fw6”§ϋχsWΩy7ˆΨ΅Λ£�ΊΥrζΜιΡ»¬[ϋ‘tμΠNZήίΒξjηh'tVΈοΛ":0Μ"€ €©@€ b*θ$šˆ €€e‚ˆ©«wsηΞ#χ΅leύΗeΒΨΡώ €Φ ’†±Š)lο#wξ\~uΏƒό!;ΆοποOgτΰ‘†―Υ!τοZQΰΊk―‘ 2ΘO?ύ$_}ύΌόκkrπΰΑ€σx ϊΗ�NΫI‰bΕ$g�œφΈcǎΛ>S‰rγΖM2zμ8Ω·oΏ·»ώ·QΓ†vωΌσ�I©R%μΌΌuλV?Y³nŒŸπNΐ:]χšΡNΰ¬p?Ψθσd?Y°p‘ΏU‡*ΦΆž6D9rXn-_^�₯K'›Άl‘J�§ϊΚΝ7ί$gNŸ– 7Κ£σugžθφ˜ΉΟRΦUοSΟ΅mϋvΣcεσΟΏtw ˜ΧAjT―& 9ο<ωφ›οdα’ERΫ„'‹/fχ½ΉD`Eοw5l w˜a₯ςηΛ'Ήsε’Γ‡Λvσ\˜;Μš=ΗΫ-ΖΗp+"¦TŸhƒG "Yώ?œVώωε’‹/Άχ±ΫT7έΏ�7�ž΄ίΊ>ΦMކ%'ΤGƒΎ:t~fΞ‘γ{­Ώώ:,?ύό³©€ΉNFŒ|ΣΏΎΞ$Εk3ΰ„ρXp?π� βώί~7Ο£ͺζwD[έcχž=ζ9πžΌ3qRŒgΣηW+σ[γ{₯Βμ΄yŽοψq§|όρ4xHΘγͺV½]*ίVIJ–(f†NΛ-Y³fύ]°sΧ.ω~Ϋ6στSφzޞςΪ ύέ₯'}cδ0Ιt~FΩΈy³ΜžσžάΣΌ™”Ώ₯œάpύυrΚάσΝ»dςδweΞάyχξσ ΰΰ0tΨx­Ξ’ΏΟί3νΠBoΊ©¨dΞ”Ι΄o§|b~ΟκPtξ€―ΗώύϊΨUŸω₯΅w·{σήο8]ž>s–|παbo € €Δ)άAΔ…σί“«MυC^xi€L›>3 MK?|ίΎΠ•έ{τ”ΕK–lΧ… ΜU½?_.Ύθ"σΎδωνχί€‚yo―“DμΧ··4i|·}/R½V»]x£8ΌϊΪλ2q�d}\3ξϋ2‚ˆqi±@ˆ,‚ˆ‘Υ΄@8η"¦�.ΏαΖBR§^Ϋθύϋ~•Ιίφo ΅'Ώ3ΑSό‰eF+S¦N Ψ£J•ΚςŒ©ΰΊ6š ΐ<ή½‡lΩςiΐ¦λM@nβΫγ%K–,λέ…‘ΓGІ‘Ό©Ϋc]䁖χ{‹±>.YΊLΊ=Ρ3`Ÿ„\3ΰΞ‚~ψ A$φ˜Πeέϊw:[E4@x‹ϋΦΕΆ0Ρ–^8Θί%Ožά2rψ0)hΒ\‘¦“�ό#Ν‡S§Eκ{ΰΛ/I͚5B°.8ˆ¨²<χl©^­Zΐ~ξΒ’>”ž½ϋΊ«’Ν‡DLΙ>Ρ†zEktˆυή-»vος·$ΖGˆ,Œmjρ@«€pib_›±]+¦mξ^‡ύ%]taΘ]‡|Cή=6ΪΆŽνΫΙCm[ΫPq΄f…VνΠι‘h‘ΒΈϊEΓΜ=zυ5ΑΉ§-Y²„ τZŒντvDLθο.=§>Φ―[mO�Ωg[%{φl’?τΧͺ>τyδM yxΗ&δρ½Ω3$ίuΧΩCOœ8!™L1x�@sϋŽόΠ­ώξY΄`žνC=¦JΥώ6χX7ˆέ«O_yΡ‡ξfζ@@ˆU ΉƒˆϊΕQ}Ώ “~Iρυ!CύφθΏηΧ¬ZξΏo‰©"βΛ/½ ΅ο¨%�ώϋ―΄}¨ƒ΄jΥR*U¬`ΟD|²4Ή»‘ωβΰΉ΅R»½l™22ζ­7μ|πu₯ΎχZ½v­έόΓ}_F1X‡e@@ ²"Fv�Π:@@ Ν DL=]\ ΐυR³vmδΘl½vΝjΩΈa½nρδΙ“¦ϊέyvΫργΛΘ‡Όo«ΩωDΘLΣ&ύ°Ϋ΅Χ^+εΚ–±-ΫΎc‡lΪ΄9 •³ηΜ•oΎύΦ_§•ysfωaB­^ΈbεJ;Ρm¦ΊΩU¦šN?�ς³Τ�ΫΠ?Ngƍ%₯K—²λ΄‚ΩfTάeͺ�]zι₯rKΉ²ΆrVˆ5zŒ\ωrε€jΥ*vY« jŝ΄bίϋ‹>°σή­RΆxρRoΡ>&δš'pτύ`A§PM7ˆ¨Uο΄ϊ˜V";ΟT'ΤI+νmϋ~›+v³]·έT9Ό«q3»M |e€Τ¬Qέ.k%Δ₯Λ–IzsΟ―/(Χ™~�IÈuλ7ŒV5ςΕ瞡ΫυΗΊυλeΟξ=ζ˜’’‘?w ">Ω§—θσA'ύ e՚5²cǏΆ/ͺ™Šuj�S¨jvΓ�„DLΙ>Ρζi0K–¨ΧpYσ\χ,΅�ηξ]»ύΫΠ!΅‚+Ε%ΖΗϋM/πƒιk­Ψwΐό^Έςς+€R₯Š6HDLΜkΣΏ‘0gάΌΌCΧ¬]'Ώώϊ«άbͺύyE8(·W―ινbkΦ¬._ΰ―ӊ¨›Νλ0λΨοτΓ>/^"έ{φφχΣ/ˆΈγΗνhΏμέ+YMHΉ† Ε^vωevίί~�]ͺΥΈ#ΰΈΉsfϊ}¨ΫW�Zm*^f1Aάκ’ρόσύ}ƒƒˆ‰ωέ₯'uƒˆώEΜΜwζ5ύ‹©p©ΏΗŠ-bBΚ{‚ˆ yΈηwή "κ±ϊ;z΅y]gΛ–ΝVLΥκ΅:0«!k―�Λ€WΚ»S¦ΪύΌZeqΞ¬vQΓζVdB@@ οίΖZi°qΣζα―}4‘ΑΗΊtΆϋκί^4_¬\Ύ|…%‘ύCmμˆ ΊQ+ΤΧ©ψχ ]―•ΜG /z_ΘΣ ϋ‘‚ˆ5kT3οα_ΦΓDΏΠ΅Γό=₯hΡ’rώωδοΏ�–;κ6°_Ζ�Ώ‘4oΦDκΦ©cή3δ°ΥΗΗMxΫηώpί—Dte˜G@"_€ bδχ-D@�΄AΔΘνή| Hε*Υ$ Že˞έai‹χοΫgͺ!NhΌD Ψπ� 6mX�‘|Ό~]¨Ν±ΞύCϋΨqγeΘ°±ΆΛ­Ό·iσ3ΌpΧ€ΚY3¦M1Γ”΄ηΠ‘Uέ?°―]΅B.Ό0»έ¦:θ‡ξ€ΥΚΎω曀»]η½π’V$kω`›ΰΝΡ–“βšzRvΚ€wμω�ύ€T­Q+Ϊ΅ά bΧnOΨ<ή7FJ”(nχυ*ˆικ�‘Β�e£†x�ΟΜιS%}ϊτvXΫ.]»TJ˜τφ3¬sQ{φ΅�Σ�υ8/p¨Γη4Ψo›{}]ιυšΪ_L�‘t»υθeΫμά ~]yώΩgμβώ)•o IzΫέΗp‚ˆ)Ω'nu^C‰Z‘N§φ9μΈέh~$Ζ§L©R2vΜ({ͺ˜B[uΜPΨ±U” χ΅ι΅;άGχ/=V«tj΅N4|7ξΙ™σR»άμžΑδE ηΚ•WD…uΨ1~Μ›τ·Y3¦ΪΠ²†\ο½�8τΆk_¬5C)W<Τνn˜�σcέdεΚUφ0χΓ> Fή�ΐƒφCDέ¨Ώ?† 胃ˆ‰ωέ₯η"jΊ�3ΟΫΐ°nΧI‡ͺΧΧ©7\R<’Ξ�Ÿ�έ―{•ζ-ZϊΥ(υ97ΰΕμΙτΓ�JUͺϊ'vm5PzΟ}•h{tο&-ξ»Ηξ―UY_πŠ,3 € €ΔG ΉƒˆΪ†ώO=)w6¨oί[λ²ΎΧΥχΩήtμΨqιάυροCΌχ7Zε°^ΓFφίΡ1υ|ϊokύ7Ά;:uΚΎ'�σΟ?€Ρ]wJiσήΠϋ‚Ÿn{ϋ‰!�ξβΎ/#ˆθŠ2 €DΎAΔΘο#Zˆ €€i‚ˆ‘Ϋ½·”― ε+TŒΦΐζ›νsΜp—Α“D7ˆ¨C­•-=΄�ϋΉSR<άσΕgή "zαgχ8χ5πά /Ɍ™³όΝέλ"΄Œͺ„¨C3λΝ:UΎν66d�ςΛ―luK»ΐ@@ΒHξ ’Žd ΑΑ—\b[₯_Φ;rτ¨œ9uZτ½‰7ΡL+›λϊd»G ύ›@IDATω"κ]wG}qPχ+ˆ¨ϋh1TυΓuλΧˊε+eφ{su·X'χ}AΔX©Ψˆ €DœAĈλ„ €œ[SOηΝGξjάT²šαIuϊώ»oeαόΈ�€¬ϋjH±mϋŽΆ2’ΡΣίν€ΧΧ!k΅B[¨Ι "z?7Ψγ…;vh'Ϋ·³§π‚ˆnΕE·κœ{ωsg‰†"uςŽs‡Z "Σ}έγΌvιz·2š.Η5Ή•ι‚χ 'ˆ˜’}άN7„W1±>/>χ¬Τ«W'Έ Άrκ\Κ{cΤθ«aθAαΌ6£]$Œξ^nxΟ;…Η«AYžyξ™5{Ž²O/iΪ€±Ο+VJ—Η»ϋ»Μ—?Ÿ/VΜΎΠ@€ŽΡ�ιgύφΨ‹9?άχeΑ�Nwvc@@ "F`§Π$@@ΰ\ ˆ˜Ίz;[Άμ�¦]ϋΗκS§NΙ°Α―ΕϋτΨ^UΔ cί’?ώψ#ήΗ¦ΤŽα„Τ―+Ο?UΡL�Έώξ”θUϋάv:τ§Μ›ΏΠ]%UͺT–Φ΄”’E‹ψΟΌ4¨C‰Ž›πΆ·*ΪcΈAD=Ab�©Ν/Z M₯Ά“'OJΝΪυb … "jΰGƒ?:ΕD6τu©\)jXεGνjƒ™φ ηǜ™Σ$ώόv7τ³Ϋ'+W� 1Oξqn0Ι­LψΞΔI²o�oΑ‡,k,¦α΄Γ "κISͺOnΐ,„DL Ÿš5ͺΙCmΫΚ Χ nŠ $Άλψ°|φΩΦhΫtE8―͐'ˆηJχ/­<¨έ)¦ ’ΠέπΙFY½f­{X΄ωοΎϋή�@Ο γꎟ~ϊ™lύό 9ψΗA9mͺ•”)SΪ)ΊC‘»}β…qέ έQ«¦Ό2ΰE»Κ "Ί―“„ώξrƒˆ›6m–Φ΅w/λ|bž±ž8ΔΖΈ‚ˆ:Ά—ν²Gκλ~ΰ ¨αίΌSσ–”.U�.vνφ„lψxƒ¬\ΎΔ 1—IŽ;.·Tώέ;ŽG@@βHΞ ’[όΔ‰R«Nύhοέέ/ M›>C^xιeΙ“'·,ωΰ}ΏιZΕНJ+nΎœšΕ�Ϊρ㏲χΧ_mΠπϊ‚€YΣ&vύ?�œ’΅ζΛ•3fΝ–΅λ>’ρcFK©R%άΣΨωοΎί&Mšέm½�pί—D IΔJ@@ b"FlΧΠ0@@ΰά ˆ˜ϊϊΉ}ΗGμpΛΪςΧMe¨ψN-[΅–Ksζ²»Ο{oΆl�a[|M±ύΒ ;ΉΓoήό©<Ψ6*Μ’Ζj¨§ά-ε€nν;δΆJmΘEΟ£ΓXWΈνφO™ ’w²„\Σ †ZΦ;·>ΊϋzΏψŸκΧW7ΊΛžN«$Μ™;Ο=΅_±t±­΄ 6‹—*kΧιΠΆcnj²σ+W­–Ξ]ρ8έΰ΅Kηέanƒ«>θφp&/ˆ¨aέ’en‰χ‘Ιέ'Α 'ˆ˜”>ϊαVΕ €~έ:RΌx1Ώ ‡VΕxψΡ.ΑΝ΄ΛαΌ6Cž ž+έΌΒ "Ά¨­<ά©ƒ½Κ[£ΗΚπ‘oΔσŠ"nΕ‘PΟw7,ηݐ\γ¦ΝνΧξEέΠ€DLŠί]nQ««΄λΠΙ½tΌζς<¨Zυv�ƒO½ˆy�ωη_Ζx=7ˆ*¬ιΪjQÈξδV•\Ήz΅¬_ΏAzχ|Βξ²`Αϋ�§ίSξξI6\=τ³O·Ζ|v/ͺ―§«�Ί�_uδΘQΡPv|¦„^3ά>ρΪ’UsŠ—(ζ-ΪG5Οt6�™PŸ³Ρ' ½fjλ“„>κ£ΟΝ„>βσΌf@sO 9ƒˆξ{c ήΩ(*$θ*7i|·τλΫΫ�ςή‹έύcšŸΏ`‘ φνέK–-[.ΣgΞςCΚ——7F³‡j¨qΙβ₯R©R©V΅ͺ]χτ3Ο…ͺΩ}_F1&yΦ#€ €‘)@12ϋ…V!€ €ηŒAΔΤΧ՝LP(S¦ΜΆαΓΜp’§Nύ―›θψpɜ%κΈαCΙ?�ΔοΈx<‰vrΓNS§M—Όγ™έ Ξ‘CI₯*QHρ€xnȟο:3δκ οPαo£DŒ­’€·olρΉ¦ήο’ί—lΩ²ΙιΣ§ΝME‡diJL±έCmδ‘Nν©5„¨α,w�!™η½7Σ™ϊΫοΏK΅wΨΝξ‡&ϋφν�֝άγt½DΤMš5ZwΔΘ7eΤθ1ξ‘aΝΏ3~¬ ΨιAΝξiηΫ‘Nž}|7ϊxχž²tΩ²ΰ]όε€τρOjfš7k*}zυ°«4TV―a#w³?ΞkΣ?(3ξ^α΅ΚίΐW’‚ΩŸlάh‡0‹οε?YΏV2gΞ,GŽ•[+VŽvΨΈΡ£€tιRv½D|ρωη€^έΪv½ώ��ίYξ€Υ΅*’Nn1)~wΉηHhΡmk|ŸŸmώΔ�κρq…ΐέ bŸ'ϋΙ‚…‹άΛΪEυΓQbz ¬YΉ\.ΊθBσί¬S²wο/’7o^»Ώ;|]‘D?Κ—+gƒΡξιβn}{ά)Q’Έh|ΓΠ‰ΉfΈ}β5�σ#€m›Φή’}Œo<₯―™Ÿ³Ρ' ½fjκ}Β$τyPŸΔ<žθ, € π” "ξϋuŸΤ¨]7š{«ξ·UςuΓϊ €}‡‡νΠΙί/ιΣ§ΆΏ�ΈΖό[8]Ίtv›ώD«ΈΏ�ώ1ΎΦχΨϊ^R'oT_½r™\|ΡE2sφyφΉtUΐδΎ/#ˆ@Γ € ρ#Ύ‹h  € Ά"FV�ꐻϊGεΏ�ώ;dΓ�ΏαF©[Ώ‘έ<4s† ηΗJ,^’€ά^­Ζ�ϋΗ ι<(δωΟφJ7όυΉ΅ΕΖΪ€™Σ§ŠA€S¨a=½ƒuθݍfΈΦ£ΗŽy«€H‘ΒςΥW_ϋΛތ|Φ�^α�αίύc½·χ¨C„ζΈδ;Dh΅΅Ξονγ>&ζšΫ·BV'–ΈΛγέέSG›OLΡ ©YέϊwϊτBOχο'ξŒz‡ –/ωPrζΌΤΆ§{Ο^²ΨT\π&­φ UΌΙ "ΊA2ύ@₯a£ΖΧτŽΡŠQW_u•ύ Ζ[ό8ΰΕ€NνZv΅VΖΣQLSJφIpξΏο^y’{TΥH|π¨JΑϋιrb}bΊO­h5ψ΅Wν%χμΩ#uDUΒ nCΈ―Νΰγγ»μ~ΰNQ‡>ϋ`α<(ΤkΕ4€ΈΎΎ+T(/‹—όϊ\g^οΩ³g·M �VΎν6f‚ΫήδέώϋζΫomθΥΫ/Έ=nQχIΜο.=>‘AΔΔ>Β ΉADφ»εƒm΄ωv�ΧςΌχfI† lΈϊŽΊυEΜΑSίή=ύaζΌm?ξά) οŠ .{λ’κ11a§³° ·O<§ΤzKm}’ΠηAjκ}%τΉ—PŸΔ<Όη= €ΈΙDt�½�ΧμΪν 3„ς χς2{ζ4)?Ώ]7qς»ςκΐ�ήwμθ,Œ6D*U¬`ΧΔτžΗΩ]ξiήΜ―(ξώmcνͺrα…Ωe†©žψά /Ή‡Ψyχ}AΔh<¬@@"Z€ bDwC@�ΎAΔΘκγ ·U–2eΚΙΑδ«/Ώ]»~”ίϋMrδΈTΚ”»En,TΨ�φϋΟ?ν‘ιSίυo ΛγOΘ_ύ%_~ρΉμϊq‡μίΏOrηΞ#en)/ ^o«ΧιΞ_|ΎU–.ώΐ?.�fΆlόΨS΄]Λ–/ ΊιΙ:}Όac@8­l™22ζ­�†`ΥαŒζΌ7OφώΊWςδΙ#7ίTΤT,«#Ήsε·—χ‘ΐΑƒeαϋ‹dγζ-ς›q.\¨ΤΉγ)Uͺ„½ή/Ώό"wΤm`ηCύxwβΫR΄h»IƒHZνλS‘@‡+ώα‡νC΅&φšnΐοž-C†(έ6&&ˆ¨ηΡη֍7\oOωΣΟ?Λπ#εПIšΥLρN�RZ΅A«7x“˜<~όΈ :\vώΈSnΏ½²­Ύην§nQ—ǏνΫkqΌ η}φωηΊIςηΛ'U«V "μ2•ϋb !5m�XžμUυαί�•u­­’wζΜΏςω_ˆ’tJι>±u~Έξœ8qΒRτω‘SbΒNg#`nŸxf©)τ–Ϊϊ$‘ΟƒΤΤ'ϊ‰yxΟ{@p’3ˆ¨Χ™6e’ΊρF{Ιcǎ›*ιβ[$»©φέϊ–ώ{έ!ψ}΅=(ďpƒˆξϋŽ/ΏόJ–―\%εo)+eJ—ΆgghζΘ¬B@RΉAΔTށ4@Hν#«5ˆXΆμ-q6κΔΙ2ϊΓ+?f†vkϊλΠ!;ϊΝΈv;«Ϋϋ=ΩGšάzxΨ—^~U¦LΠΎ^=ΊΛ½χ4Xj!T1Τ~ξΊ>ύž’&ΈΣ€Γ�κ𫑦%K—I·'ώλ78jo]¨kΊU 6mΪ,­jονγcbƒˆ:\κΰΧšaΐ3Εx uξUΡΟΫIοsϊΤΙrυΥW{«b| "jΰθΝ‘#Lˆ4wŒΗθ†ψTC @y'ΤώTcRΊOΌ6Έ³fL“‚’ͺ`ΈλuΎ~Γ»†ίN¨@ >Ώ»¬‘ΡV­Šuλp_›ξωγ;Ÿ˜ ’^Γ ΖvM·ˆVLϊϊk±νξo "jUΔξέσƒήώŽA3ΑADݜί]ήiέηnΈADο‘γz„<Šιuθ^ϋΘ‘#ζΉΧ6 ΈνnΧωΙοL›L°\' ™V―U' ”n7$яĄΞFΐ*ά>ρ˜RSθ-΅υIBŸ©©Oτy”Πη^B}σ<πžχ<"€ ΰ $wQGo˜lΎΌΫ{jmϜΉσ€�ΣΟΊM‹q>ά ’žθ‘ΓDίίOΑUέένξϋ2*"Ί2Μ#€ €‘/@1ςϋˆ"€ €iZ€ bduoΎ€F;$‹ swήyΡ§Υέvοή%οϟmψζφ‘¬Y/ˆvŒ�Π }_υ₯,ωpQΘν‘ΆR«ΥΎ£–δɝ[.2ΥΌI�8―€žτδ={vχ+»ΉΫ΅καΪuλεΝQo‰Vφσ¦‘fxκΕ‹œίۢ租dΤ[£eήό…ήͺυϊχήΫܜ«˜\pΑ~ΏΝ_°Pϊφλp\B―Ήpώ{ώ½uz€³ΉŸΞjααN€ύCmE+ν•Ή%jθ&―ZαΙώ‘�e£>ˆx°UKy¬Kgξ©TΉjΐπ�Z½α₯Ÿ“|Χ]p =η„w&ʈ‘‘C­’6t°”.U�?NŸƒkΦ­“ ²d•�₯KΩηoΩςύνތΫΗ ΕZ«f Ρ‘ΚέIΟ‘U˜*–S§Mw7E›ΧστξΥΣ΄‘„\~ωε~Ώ=•’}­‘f…αϋΘΓMEŠ’¦rgn[­Oχ;m*"†ͺ6!>ϊXοž=M«H4S½Φ–-ŸΚΰaΓύJ‘Ί.¦)άΧfLη‰i}Ι’%dΒΨΡvs¨a΅uHp\§^}ϊΚϋ‹>΄σξΦ­ΦΆ²CΉλu~—ωύΉjΥ8hpΐ&2Όσ#ό>ΠΐΫ–O?•Ωsήξ['=N‡w§»6&­}γMZΡσέ©SE_s:½a~�hˆ1xJΘο.ο›>Yo«5† {ϋΈIρ<ψxέσί™,ώiυw‘ώNŠiς‚ˆZfξΌy�ψξ»εόσ3ψ»ο6ΥM»<ΦMΆοψΡ_j¦Ϋc]䁖χΫMq]3Τρᬻωζ’&Π:!ΰ!ΓFΘΨqγΦ…ZώχΘΡ£rkΕΚ‘v X—˜k†Ϋ'ή…΅z¨Vu§ψTΫΥύSϊš‰ρ9}’Πk¦¦>IΜσ ‘>‰yΈΟsζ@πΌ ’ώΝΰιη’ώ½�ΓΆώnΰν›ΠGύ7xχnΛ-εΚF;…^χ­1γδέ)S£m‹iΕk―Ύ,5ͺW³›Ϋ΄moFwΨΣ�λ{tο&UΝ(ϊήXGƒXϋΡGς꫃ή�λ+ά*LEψ2ζ½όύ-ξ³η ˆ@Ι € ρ#Ύ‹h  € Ά"Ff�¦K—N�½6ŸδΈ4‡ Σ\$ǎ“_LˆN‡c>}ζtŒΞ”9“δΟ_P.Ή$‡ 3f±C5οΩ΅Sφξέγ1iiƒŠ)"Ήσδ’?�ψSφμω9 ’\¨{Υ*sϊΗψ‹/ΉXώ2CοΪ½'ΞcB'œuα\³^έΪςβσΟΩΣϋέχ�΄ω½α\*IφΥ°\ΡΒ…νpͺΑCNΗvν2eΛΨαΔ7|Ό!Ϊ‡±«Ϋ�Ι{άpC1)BωυΧ_ΝpΉ;Β>G\ΧπΆ§Ά>I¨O‘"…%—ͺ<[Ά d�Ύίμs}ίΎύCšzΤʚ7ήp£d7ΓοϋuΏμ6Ώ?γΊW Ίδ5Υ<χο�έηˆwσΘgŸ§Z]$œ)!Ώ»Β9πΎ)υ<π‚ˆGΝΓ΄ ₯NήΎΐτΙΦ­ŸΗΩ^»έ‘β»χθ)‹—,σ6ρˆ € €@‚Ό ’{°~ΡIΏπ”Τ“ώ{Ώΰυεͺ+―Γ‡ΚφνΫ“4π˜νΥχύ+—-Žv*‚ˆΡHX €D΄AĈξ‡ €€}‚ˆiΏΉΓΤ-0nΜ[~eAwxιΤ}W©»υτIΜύΧ°~=ΙΛpή1yΐTYΎ|EL›YŸJBΓ½•κΥͺΙ /ΫΓ~�ύ€T­Q+άS°? € €ΡV,]lΎΔyqΐϊΩοΝ•g�_1`Γ9° aΙU+–J† �U0ΧΫ6βxU?ˆΈE@@ UDLέD#@@΄+@1νφ-w–6΄*`ξ\9νΝΔwΨ₯΄qη‘{τIθΎΡ�Φ―[zckϋύw©f†₯gJ[ "^uε•R΅κνRμ曀RΕ ’9sf 3jτ˜‡„O[rά  € € € € ΎAΔπΝ8@@ "&!&§BΞaΔχ�φ›T―YϋΦK›·žΠ β=Ν›IοžO θpΧ­Ϋ΄KΆαΩ.Ζ € € € €  "¦ΒN£Ι € €@Z ˆ˜–z“{AΞ�@‘"…%S†f>τ矲}Ǐg·ρ\=Ι¦LzG ΊQtθνp*^κίΟ<ύ”mΟή_χΚ§[ΆΚ / „˜δ=Δ @@@@@ - DLK½Ι½ € €©P€ b*μ4šŒ € € € € € €8 f@@R^€ bΚ›sE@@@@@@@ )"&₯&ηB@[€ bΨd€ € € € € € €D”AĈκƒ €œ{Ο½>ηŽ@@@@@@@ m DL[ύΙέ € €©N€ bͺλ2Œ € € € € € €D ΰ`@@ ₯"¦΄8ΧC@@@@@@’V€ b�zr6@@0"† Ζξ € € € € € € €@„ DŒ°‘9 € €ΐΉ&@ρ\λqξ@@@@@@�šAΔ΄Φ£ά € Κ"¦²£Ή € € € € € € €@AΔ @@RV€ bΚzs5@@@@@@@ ©"&΅(ηC@K€ bX\μŒ € € € € € €DœAĈλ„ €œ[Ο­ώζn@@@@s]`ες%’γ’KfΝyOžyφω€uηΚΒY³ΚšUΛ%C† ·%V€¦>I � € €D’ΐ†ΦH–,Yšτώ’₯WŸΎλ’bᚼΧΘuω�•«�ΌB�uXvνΩ#Ÿ}Ά5ΖS»ο'cΪ)©ίϋηΘ‘CV.[νr£ΗŒ“a#FF[Ο @@Θ ˆ™ύB«@@sF€ bδuuΥj5δΪ|ω$ΫΩ%}†τ~Ϝ9#G•εζΓ;~ψΑ_j¦ςνΥδΞΚ’%«€K—Ξξ’Η>|X-˜+{χξ uΨY_§loq_T8mυš΅ςͷߞυ6ΕΦ€ϋM[³š6oΫΎ]–/_Ϋ�ΙΊmιβE’;W.ωχίε֊•εθ±cΙz½Δœόρc₯xρbφ7—(˜SωΗ–-SFΖΌυ†ΏμΝόσΟ))Uφo1EγΣ'EŠ–Š·ήjΫ5iς»έo©ν΅™’ΝΕ@@@ Υ xAΔΚΣ�―‚ΈέΌ·�ιηŸ“μ^ςη»Nzτθ.εΛ•‹vN Ž=V¦LmΫϋζο6W]ye΄υξŠ³fΛsΟΏθ�}ίVΊtiɝ;—lί±CΆlω4`{\ ΪΌ™2Ω/Άzΰ~»;AΔΈΤ؎ €D–AΔΘκZƒ €œs#―Λ;uξ*™2fŠ΅a[?Ϋ"Λ—. ΉOσ{[ΘεWΔόλukWΛ'―yμΩ^Y±Β­2rxTe»±γΖːa#Ξv“b½ώηŸn²Ϋ΅’AΛΫΔΊormlΦ΄±τνέ˞~Σζ-�Ίm»δΊT’œ79‚ˆϊaK½zuόφuμΠή±uΆ‚ˆρν“Η»vοÝφ–υ6ψχi3©ν΅i~΄@@"Kΐ "~Ώνiά΄y’7N+ Θφ�δΚ™3ΦsΏτς«ΡˆK-”<—ε‰υΈ9sηI�§Ÿυχ©S»–ύΫ@φμΩύuFμώDOJόΡ_Ÿ™Ϋ*V”αΓΫ] "ΖGŒ}@@Θ ˆ9}AK@@sR€ bδu»Σ§K/~�]φοί'‡’Λ/»\.ΏκJΙj*ꀕοf͘*{v︁&Νξ•«�ΎΪ�Σ ˆΏξύΕ|›�'IgώwΩεζW\!λ?Z'7D €KΰB$̝-yσζ΅wΠι‘Ξ²vέG Ό›”9,9‚ˆΑ-Ÿϊξ$)\θF9[AΔψφ AΔΰžc@@Hδ"φθή͌ψp½™γǏΛάyσEG~Έκͺ«δ�;H!3Š…N�ύ·”-_ΡΞ{?Ό βιΣ§eΒΫοx«?ωd“�e6­Ό8mΚdɘ1cΐ>ΊπγΝ�π�ΖΡΦΗΆ‚ bl:lC@"[€ bdχ­C@�ΌAΔΘλβ,¦ΊΫρ†ΦmΨ¨±δΛ—ί6zΫΆοdΑάχόȜ9³΄οτ¨Šωτ©Σ2{ΦtωiO`PQ‡iΦ€b€N©­κΪΩ"ήQ«¦Ό2 j(¦oΏϋ^š6Φ:RϋWΫ•Φƒˆατ AΔH~¦�6@@HΛΙDœ6e’6œΏ`‘τνΧίηΌ&ο52ξ,ωž-ε«―Ύφ—½ βώύϋ₯z­�ͺ�ϋ;Νtνς¨΄nυ€ύ{Oή}dέڏ€c‡v�ςώvώζoEλΦΗ� ©ƒ€YD@R‘AΔTΤY4@H‹SW―ζΝGξkΩΚ6ϊ?Κ„±£ύ¨[Ώ‘\CΤ7κ7˜‘—?2C0§†IΓXE‹ΆM͝;—_έοΰȎν;nA‡ 5|­y€x׊Χ]{dȐA~ϊι'ωκλoδεW_“ƒœΗ[Π?ώwκΨNJ+&9sε΄Η;v\φ™J”7n’ΡcΗΙΎ}ϋ½ένπΏ6΄Λ睗NJ•*aη΅ςήΦ­[ύύtfΝΊu2~BτΚα^3ΰ€A ξ}žμ' .ςχΠ‘Š΅­§MπτΘ‘Γrkως6€ΊiΛ0` τͺ―ά|σMrΖTXΨ°q£<Ϊω1�Xwζ‰n™ϋ,e]υ>υ\ΫΆo—ΡcΖΚηŸιξ0―‚Τ¨^M , rήyςν7ίΙΒE‹€Ά O/^Μξ{s‰�Ηx w5l w˜a₯ςηΛ'Ήsε’Γ‡Λvσ\˜;Μš=ΗΫ-ΖΗp+"¦TŸhƒG "YLhX§όςΛ%_lηw›κ¦ϋχ�fηυ‡φ[ΧΗΊΙΡ‘δ„ϊhΠW‡‚ΞoΒΜ9r\b―υΧ_‡MΥԟM%Νu2bδ›ώυu&)^›' cA+zθΫ… ’Λςδ1UίG½5Ftφ˜¦7F“Lηg”›7Λμ9οΙ=Ν›Iω[ΚΙ Χ_/§Μkl§i�δΙοŠŸζ½6υ\3gΟ–χ}ς΄έλ"E Gύn|ζΉeΧξ]vΏQoސσΣg›6Ϋη‡Ύ¦nΈΑ\ηΤ)ωώϋδύ>w§LvNΒ\ƒ²•o«dΫu©ω—ρόσε?�”ΝPmŸšίaC†vœ·BΏκο&™σλοΥ† κKΉ²eδͺ+―΄mωϊλ―e؈7|+υ�W§ŽT0Ο½k�Ιk‡LΧ@ό―{•»vΚ�%Λd–ρr'ν{oΈωύΏύ.·”+#›ΧΙwί/Ϛ~»§Y3Ή½Κm’ΥάΟζχBχ'zω6ξyš6i,w7ΊΣΆMϋR«Ιόωη!ΩφΓςΑΚμχζΊ»'j>!}’ΨηA’ΜΑ € €’άAΔ…σί“«MυC^xi€L›>3@}ι‡οKξάΉνΊξ=zΚbσoco 7ˆΨ―ooi�ψnϋώΕ .z_ž|υ΅Χeβ€Ιήιγ|$ˆ'; € €+@1b»††!€ €η†AΔΤΥΟ7άXHκΤk`½ί―2yβΫώ h5D fhΨbθλύυ‘>3ω rΣMEγΥΜ—^~U¦L°o•*•ε™ώύό@WΐF³ ΖΗ»χ0!¦O6]orί/Y²d Xο. >RƘ0’7i0聖χ{‹±>.YΊLΊ=Ρ3`Ÿ„\3ΰΞB,Τπ“N{Lθ²nύ;­bCχ·Έ/`]l MHκՁƒό]4@4rψ0)hΒr‘¦“�ό#Ν‡S§MΆyΰΛ/I͚5’­^DΤ ΤsΟφ—κΥͺοκ//2’ž½ϋϊΛ‘fΒ "¦dŸh[½‚B΅;x]ύ†w¬γ£D Ζ6΅x U@Έ4±―ΝΨ�ΫΆςεΚΙΐWΨ `lϋ˜ζ΅W«Ύ/U6Ϊ‘+–.–K/Ν!{Ω+΅κΦΨ�aΤΧΎ,ϊ|5iΘoΠΰ!2iς”h›΅_Φ―‹ ~kX1{φl&Θύu£ABνS  ½ψά³φ<_~ω•ά{�!ΟΉjΕR;΄š^[?LΤΰŸ{­h9+fšΐξ³Ο½ΰ¬Ρί•C_-`]πΒ7ί~+»>ΐφφ©Y³Ί |y€]Τπd•ΚŒώϋSΓ–ύŸŽΊ?w8:ο<Α Φ ΅7UΎν66δΏίEήϊ˜5p~Ο}Ώ—‡dΫΣ1π-_ᢘ6‡΅>‘}’˜ηAX dg@@ΙDΤ/Ž–,YΒ^[Ώ€ψϊ‘~;τߐkV-·_†Τ•±UDlzO ΙiήΗόόσ/!Ώ¨¦Ηχ{²4Ή»‘ωβΰΉ΅R]%eΛ”‘1o½aηƒΏΈ¨+5lΈzνZ»=ψAΔ`–@@Τ#@1υτ-E@�€AΔΤΣ­ \/5kΧ–L™’ͺ©­]³Z6nψohGMx$C†σMΕ§?eρ ₯μ-·Κe—].ιΣ§—c&t±wοΟ²hΑόˆ»a­Zε…έ�½φZ[]KΉ}ΗΩd*~ΉΣμ9sEƒ2ή€aΉysfωaΒ}¦zαŠ•+νpD·™ͺ_Z₯K§ŸωYjΧmθfǍ%₯Mε3΄κΩfTάeͺ�]zι₯¦WY[Ή@+č=Ζξ£?4 U΅j3'ΆΊ VΠI+φ½Ώθ;ούΠΚh‹/υνcB�pgA?PΠt ΠΤΚe^Q«ήνάΉΣ>Ο3Υ u� ΞΆο·I±b7›‚…η™ŠƒΫε�ΖΝμ6ύ1π•R³Fu»¬•—.[&ιM%³‚Χ”λL?ι€aD­Δ©ξήδ†kt�΄gχσLΙh!―ΰ β“}z‰>tϊχίe՚5²ΓTjΣ*ΥͺήnΝu[¨jΊή›Β "¦dŸhϋ4 ˜%KΤkΈ¬©$ηYj₯Οέ»v{·`ŸΓΪ―ξ”οC6=ί¦―?ΫϊΉ8p@�Όό ©T©’\tΡ…DLΜkΣmwΈσ^υ=n�oΏΙ† ŸΨŠxZΡΡ{ώκΆ€ "Θ6ΕT ,¨§•γǏˇK–ΚŸό)ΕΝλëੁΐ&Νξ1Ώ›~΄ϋy?b ’}g^_Ώ˜j“ϊ;₯¨©ΤΈη§=6ˆ¨Η­^ΉL.Ύθ"{Š»ξnνœχίw―<Ρύq»}ΝΪuςπ£Q!�PΧ�ί‰€Τ*Žήο=°Σ#M₯ˏμ9τ‡DΤΧ–ξ�ƒωϋϋοΏΫ*‘΅jΦ΄!GέoεΚU�ΩTγ žά ’·νΔ‰ςΝ7ίΪ�ξ\χj[Ε4TροΏ�Ά•WχμώIŽ="7,(ϊ;Z�ϋ€“Ϋ—nQΝ·nύΒψ6�νΛdχΥ ιVσό½ρΖμο~]�`>lυͺ‡ΊΈκ½κοv5:yς€0Ακ[o)oͺGώ#εn­dΟ—Ψ‰ι“„>ΫfŽG@d―ˆψ`«–ςX—Ξ–Z�ζπ’y·|ω Ρ/A΅¨ύ‚’nΤ υuκώ½Β}Oδφ•~Ρrσζ-ζ=ρΛ#?Τ¬QΝΌ‡ΩξzθΠ_ζ}τσoθ’rώωD�-~GέvύIσfM€�©Z�_�S q‚·h»<ώ„έGƒˆ^xaΐώގ'Μ 5€uπΰoUD=jΠhδπ¨*cǍ—!ΓFΔΪ>·ςή&σΗψG;wυΓ(z . ώϋΪU+ŒSv{ώΖM›ΛχΫ~Έ–†vΎω曀]ΐfΑ«n§‘ž–Ά ήm9)�©'-R€°L™τŽ=�￐ͺ5jE»–DμΪν ϋΗΫγΖH‰ΕνΎ½ϊτ΅CΒͺ·Ίk¨°tΩςv›:sϊT� ›]Ίv ¨”0ιν fXη¨*–nθHΦγΌͺrοLœ$ ΆηΤξυuΩ "κ5΅ΏtXm½f·½l›u?Τ―+Ο?ϋŒΧ‘d+ί’΄+‚~„DLΙ> j¦ %j₯BΪwx8δ°γή1‰ρ)Sͺ”Œ3ʞJ?ΈͺR5z΅Κ:f(μ˜†ΦΓ}mzνχ±Ρ εiSαT§}Ώξ“­τ_ƒn8O·»α5]NhEΔζ͚JŸ^QC9kπ±MΫ•(Ÿyϊ)Ρα°urCv…ωDΣ`r�gž·α]oΦX_3ήpl}{χ”fM›ΨΝΑΥHu₯χΦyου«σΑΧ� oGS Χ›ϊ?υ€ά}WTuTΆΊm»Žή&8Ό·ys3tτά€ϋΣτΓΠΣ&Kf3lΈ†�J–ΉΕ?Ξ› "ξψρGιfͺΝΊΑLέηθα£6€¬Ηix[‡Λžb†rφ‚‚ήωάΎώΪ„›ίΫΒnrƒˆZWΉ:μvΫ6­νvΚω™gŸ—6­”.>lΧ΅jσ_υΆSΗφ�‘έCv}¨ώΚ‘#‡”.U"`θ;»s$¦OϊΏ³A}� 8ϊ^Χϋ2Ž^οΨ±γΆ"ΉώΫݝb "zϋhεΓ'zτφ�έ­λΌψ‚θϋ:w�Ϋλ{ς?�όC™χ ₯Ν{CοoKΊννw&†ό» ADW‘y@@ u DL]ύEk@@4'@1r»τ–ςΜΠ‘£5p§ωfϋœΩ3ΦgʜΙTΏκ°NΏυώ³²χ<“_ΜkB&Z-Q' !j ,§pΓNŸnΪ`�ˆ―UΉjΥ©P@οOΓC"�)8²eγΗώ0HZ}@«„;…DLŠkj_νS!°ͺmξoΎ%oŒz+ZΣέ ’wn ΚφWXΔ�Ι Ί/­Τ§!9wr‡…v«Mjΐgε²ΕvW­*\qLCI£ήό/\κ]OΠJ^(OΓZZυ0xZ8oŽ\}υΥvu³{ZTΗtχυB\ZΙ±TΩθ*wί”μχΊ:οήs\ADwίp}ά qξ«Q»npSβ\χ΅η cΨaΘ rϋνUμΦ!C‡ΛΨρφ\΄p�\yET₯Σ€ "ΊΑΪξ=zF ¨iεΥΞ·Ώk΄ΊhΕΚ·΄)8ˆ¦C�ιΠk±M,3+κχψo¦*a΅wψ»ΗΆ-ψZΑCΈιkpι‡οϋή₯ΛωηkΖ %λ~‘ͺ4ΊAD­4Ψόήϋc| Ζu-oϋGkWIΆ .7 λŸ{α%™1sVΐpΦ^(οš`cUS%uπk―ΪS=ΪεqY΅zuΤόÝ䑢­νό.–½ϊx—K–ΗΔτIl}ΫΆdΉNŠ €œc)DΤ „―šΡŠ.RWΏ|©_Β ž4ˆx‘©Z―Υαχ˜ΏUd”O6n6ΓAoŠVΉΛ?(h&ά bR\S+—½7{Ί Ei„΅κ„l―D,_α6»:¬R­¦ύΠ‘k—G₯u«μyλztο&-ξ»Η�{qΐ+2uΪτ ;ωhΝJΙ–-[@%E­ψ¦‘.BuύΊΥ+$»©π©“DthΊΝλO―/uέe—_¦vκχΤΣ2wώo1ΰ1œ bJφI@#Ν‚.Œ+ˆ˜7 ͺmЊK—.“OΜs}‹Ά6>S8―Νψœ/¦}¦LžθHηhέ}ϋφξe* F ߝTAΔ•Λ—HŽK.±—ΡŠˆ§M€U'οΉ§y.ΛcΧιοuβ­pƒh/[>z€άΫΧ}τ*8κ: Y‡DΦI‡dΦ0°NΑUEέkιπnΥΝλ?xrƒ•‘ Φ―'·›Š―Ήsη–œfΨθtιΣΩSθ²7u½DΤηV!ŒΟ€mΦaβoΊ©¨½ζ%G I­ΗzΧΤj‰ϊ{J'7ˆθUn­^­š 5Τ\�§Ÿ­Δκ’ϋτ{J,xίοVOΥΐδG,kΦ¬³ΏΫυΉŸΤSbϋ$!Οƒ€ΎΞ‡ €œ‹ΙDΤ‘ F βΏΧΠ/λ9zTΜ:πώ"ΤΝτοΏš/‘WΧΛλ ½ͺ†Α#?h?j1TυC­¦ΎbωJ™ύήά8»› bœDμ€ €D¬AĈν† €œSO?ηΝGξjάT²šP‡Nίχ­,œ�ߐλήΣΏ™Sί•Ÿ~Ϊγ/λLΝ;κ˜!2o²λ6oή(«W,Ψ ᄝάPL|ΪξVά�ύuψR&)x�ΰΚκ΅keδΘQqVϋ 7ˆ˜Χ|φ™ώvh'mw¨!]½ϋqƒˆ^ΰ―Ϋc]䁖QC{αĎΪIΗφνμa^ΐΚ­Έθ€ΌsλγόΉ³μp�:ο§xθpP:ι0Ώ" žάγΌvι>³fL“‚ςογς«Ωϋ΅C8AΔ”μ“ΰΆ†DL¬Ο‹Ο=k«Κ·AƒssηΝ7U5GΗX C η΅|p–—-ωΐ»Οονj#tŠn8)‚ˆnˆΜ»Flϊϋ‘I³{†rwΟ±kχ.Ρj£ρ™š4Ύ[ϊυνmwΥ’ΎΦtZΊx‘δΞ•KτZ ξl0Œ²{­oΎύV΄2hπ4lθλRΉR%»Z‡fφ†yΣʎγFς«Šη.‡ͺ8κώΞ ’έ=֝Χ0 xΑV=tΧΟ:τ—TͺRΥ�vƒˆή°Τξ‘^8±dΙ2aμh{ŒNτΞ;wΞLΉξΪk½E�Q‡²Ÿ8yrœ+ύβ1“˜>ΡΣ'δyf±  € €@ΙDtΏ τ±©lψΨγέύ`‘Ύνχd?P¨_ς‰ο—ΔάΏ ,2_¨μΩ»―hεΕζ͚Hέ:uͺκΛMψ0_ώ|RΌX1Ρ»j RGŒΠC=2χίߣnj“a#Fz›xD@ˆp‚ˆήA4@HλSWgΛ–έV>ΤoΏŸ:uJ† ~ΝΏ.?a�ˆ}ζΜ2(jΈJ£™)TΈˆάQ§ž]΅sη2gfτ*wξώgc>œ°“[υJ�Έώξ”ΨοηΠ‘?eήό…·UΕTkύ@K)Z΄ˆ?L³·ƒ†€thΨqήφVE{ 7ˆ¨'HΜ5΅²έβE $cƌrςδI©Y»^Œα±PAΔΗΊt–[΅΄χ[Ρ 2=ςhWΜ Ύω93§IώόQΑA―κšΫ'n°Κ=Φ=Ξ šΉ• ΅ άΎύΏΉ‡E›_±beŒΓi‡DΤ§TŸίD8AΔ€π©Y£š²Ά­άp}ΑঈΫu|X>ϋlk΄mΊ"œΧfΘΔseL3½ΓuψnuΣ)ά ’WωΠΒΜ­©ΏS_2Μ»TθGσ{AΐξδΡ6mΪ,­jοnŽuήšψδ?�Hε*Υ€tι�2lΘ {Μ§Ÿ~&΄npΌ{­/ΎψRξkΩ*`».hΨ°tιRv½ϋϊ}{ά)Q’Έ]―Χ[»f­ό°}‡:tΘ�ktWC�5έςΑ6ў nρΝ·FΛΘ7FΩγbϊ‘m]bB•:τ²N6\Ύr₯θPpZΝU§.±ΏΟάJ’nΡ B»ΟΏξ={ΙβΕK%Ά ’ž[+½Ά0•%sζΌT&mƒϋcϊΰ5`η8Σ'ή©Γ}xΗρˆ € pδ "Ίο3Nœ8!΅κԏφήέύ²Ψ΄ι3δ…—’*€ΗuGϊΎnΰ+Qϋ~ύΝ·�όή�·wOS9Ύ‰=τSα}­ωrεŒY³eνΊdό˜ΡRͺT‰h§ύξϋmφKVΡ6˜C©°@HSG?ΡJ@@ Ν DL}]ΫΎγ#’υ�ΑŽΧ�?T₯ήΕ£]·C/Ÿ6Γό <0ڍ]sm>iΤ8κΣΏός‹L{wb΄}Ξφ 7l2vάx2lDŒMr‡ήΌωSy°mό† uB ’”»₯œΤ­}‡άV©’dΚ5 φαΓ‡₯Βm·‡:Δ�KHΡ;YB�ι† ί3Uμžκ�ŒwΊhξΎ^ΰ/ΎAΔ§ϊυ•ƍξ²η �4ζ]hΕ�ΕΆ�‚_‹—*kW—)UJƎ‰ '­\΅Z:›ηdπδ§λ½vιό¨7GHωrεtVά*nvE˜?Ό ’ΛJ–Ή%ήG'wŸ7$œ bRϊheΌŠ*HύΊu€xρb~­Šρπ£Q!ΏΰΆ†σΪ >6œe·’WiΣ=ήJ<8ˆ8vτ›RΖωtrŸ[ήρ[6~lΗnQ·}Όn©4›Eτ»Reγ�|ρΞλΡ΄�I»ΌMq>κ°jw5l`χ4xˆάT΄¨Τ¨^Ν.?ύΜsΡ†Ms―΅gΟ©Ϋ κuκ^Θ "6nΪάVoΤ>_Όh‘nZC€­Lΐ1x˜bχΈΈ‚ˆoΌω–©’ω–{Ωhσz_z:ι΅hΥ:ZπoΣ†’-ˆθ5H‡΅«Q½ΊΤ6[έ*‰‘†±σŽ©W―Ž7k?ϋtkŒΑη„φ‰{pŸξ± Χͺ9ΕK 8άή:`eˆ…ͺUo·―oΣξέ»εσΟΏτc|LΜ5Γι·ϊ;ξͺ«�τW9rΤέ_Ι  €œ“ΙDtίοψρGΉ³QΤίb\h·2vlοΕάctήύβŽ&ΤστνέK–-[.ΣgΞςCΚ——7FF}ΩJ‡f^bΎΠS©R©V5ͺy¨χz ‚ˆͺΐ„ €€N‚ˆ©³ίh5 € f"¦Ύ�μd‚B™2eΆ 6x©ŒψoΫΎ“dϞέΞkED ˆΉSι2εώΗήY€IU΅qό₯[aω” Iιιn₯AΊ;i€€©…₯»»AΊ»1θιόΞ{†s9χΞΜξΞlΝμώΟσ0χtόΞ½—Ή�ϋΎT¨HQ™uζτο΄aέ½Ψ#βΊΨiα’Ε4xθNη₯‹?t·žN±€E++–-1j;C©B%DT?ώ«|WA“Χ»yγzŠ?>½~ύZ<Θ¨arΩj38BDέύ­#¬Ÿ€ό„V―\*EMχξί§₯ΚΚαYμ΄ωηυ2~ηΞ]*UΦ,ζΡΫq%],ΖMjΦ¨&ێχŸH“¦L•qw>fϘ&vάΦ‘‹Ω τ{bW†~+\«oΩΊΥZΕH‡$£S©U³υμήUf±˜¨bε*z±wεΪ4Ή™2iεΝγ+[*·Όz7zΉUˆ8uςΚγkkk½nυύ΄ —.^HŸ₯K+‡©Ϋ aUϊœτ{‘«BΔΜ™3Ρ‚Ή³ewlΩ5ρ‡‰₯Ϊ™Z‹…Ά%Λ”72ͺ9νή±&|O&Υ5¦?e«(­ΫΆWΥε‘ϋέ(„Šο½gϋ?$$„ˆmZ·€ΝlYTΞβr=θs ‹ˆϊX*�»w&ζfA4 υ0yΚ4η?AΟ2βξξ‰ΡˆΈzθmݍ·oۚš6iljTψ‰£‡ 3wΤ—άΣΥ=Ρ₯[ε|Wκz_ˆƒ€€D,a%DΌsϋ•*WΑžnν}�ΑƒΤ’e»:Ž2τΏ©6mήB]ΊvwTMζρwlώ.ΙAyEΰψ�[ιύ„ iις4`ΰ Ξ2M8―"!’Wm&    „ˆž΅§μr—έ.³(ΓQψ,}ͺP©²,β‡ιΊkζ‚…‹ο[k^Ώœ:I[6ύlκ’Ύ°Fυaβ$2o§ͺ;rΨTξ ],tκΤ/T·A£§₯ ˆΨοˆ‘£ΦgΧ»‡6YγbαΗoΏύnWŸE%{vm§hΡ’Ι2ύΗzkeεκυΕ‹—BŒWΖΤΏ΅.§ƒ3f«Ν©UΛζ²[vKάαΫ.ކ0ς‚#DΤEgμΊ΄B₯―Lb§~}ϋP•―lη‘Ux΅mσFΓͺr‘ͺ&Υ§Wb«*(‘§uχR,,­\₯šiLΥ†-j₯HžœψA³0tπ */¬Ÿq`ρ‹ˆœ…°άλκ ·±ίu±Ydΰl‘ΝY.gλdΛf£.‡ufa ]½6­#°ό�]: wΊ΅e5ΆΨΡͺu;£ YW._l\›V!βΰRΕ εd}1³˜Y…ύϋ�W_V’I«Qy:r‡¬ϊ`+#O�ό“.^Ί¬²δQ’Y―SE'‰%‹ΨΉΛ^Ύr%υλ�ƒ] },.΄ž7UΏώŠϊ~ί[Ά»qσ&±Ϋt3d E ζΚψΓG¨hρR2�>τϋη…„‘]#³K;wο¦vν;ΙΈϊ˜;keΝϊΉL†€‘έΰōΗ‘Γ>½{Rυͺ6±νκ5λ¨χχ}ΥtŒ£«’7wχΔπmΔ•σΐΪ֝΄ώ[΅‡Q‘ΐ@@@ 2M!’υoDG/Y-_Ίˆ�¦I#QΟ™7Ÿ†)γό’Tμ8±Ύ ΕesΔίΡqΔί»ΨJ9[+wjΧͺI=Ί}'‹υί6φμά._BZ"¬'4Δ�9„ˆvH   ^CBD―Ω*L@@@"&=k_ °˜PX.|ψΰύφ}ƒΣΥ@IDATλ/tυκeΊο%Jτ!ωζύ‚2dΜdX!Ίyγ:-^8ίX@΄¨Ρ¨­p…ΛBFΆ†ΈwχN:rψ,/YΊ,}žΥζ‚‘ŒώcGΣλ7―ΆžQξSyN[·m#φ°u06‰ΣΨϊ[ASέ­XΉšώΈύ%Mš”²~žE“Κ“O’$Τ³wZ»nƒ¬ͺ <|ψΦ­ί@‡£{‚s¦Œ©|Ω²”+WY]X—­`s›ͺΖЏσηΜ’,Y2Λ¬ΣgΞΘώ=z(ω_ΈpΡδϊ4ΈcκΏΪuλ;QκsΣ…EJπ§[ΰS!XάΘ"GΊ9>·2€�Lζ³ iάxzςψO*UΊ„!~%σωƒ­6θ’@]0ωςεK=v]Ή|…Š+"­ο EDΝKε͘:Ε`ΟbΔBœwβΤ)Yœ&uj*^Ό¨tί|UXξ«ό΅Νz’j«kT―F½{Ϊ¬>όχί΄wί~:tψ°Ψ—�θΤ/ΏΠ‰'eυ°ή}ŽΧξΌzυJœ»«θΜ™³τΧ«Ώθ_aυr“p›₯wω(#»[³v=ύ.Έ/ΕΉrδ *UΎ’ΒNη獛¨kχžϊ¦Έ+Χ¦©‘ ΆͺΉ~ΝjŠ#Ίl΅fν:Z²lΉΈ&’ίu‘€�Kjτf"6iԐ:΄o+Λωž1vάxΊ}ϋ.•(QΜ!r‘UˆΘηΑ†υk€E.gN3fΜ’ΛW―P‚x (½ΈΚ ·νι?K'\%Ϋ ΥyΔmέ"κ‚T³k\‹λρω=cΦl:xΰ₯Οπ΅mέJΊ:ζ2~Ι4UΠχ…λΔύπΙγ'TYΈPVΒ]U7$„ˆΊ ™�ίY&¬­μά΅›bƊEΝ„%ΎΜ™2ͺα€ψ>OΎ‚2­»škί©³t£«χ₯Ξ9sζ ™Σ¦Θ6Ί y–Φ¨^•Ž=*ΞιΝtώΒŠ'.εφΝE΅kΦ4\ �0x(-^²Τ˜ƒŠWˆθʞ¨1ωθΚy ·s7!’»δΠ@@@ ’M!"3βψ… όςβLρwϋQρΫCa½ΌqƒϊΖK9\�―6d•+[†Ψσž½{ιΦ­?Έ eȐž*‹—«bƈ!Σό‚QρβΏ<θ,θΏ™όϊλo΄mΗNΚχEς͝[6kfgδ   ήKBDοέ;Μ@@@"=kYˆ˜η­UΓ€fφκοW4eΒxϊη›[fU·p±βBΘesMΚy,HŒ%Šό§κμΫ³[ˆVφ©€Ηu‹UΦΙ 6œ,\dΚξή΅ Υ©]Λ”η(αHˆθ¨žžΧ³Οχ΄V·œ…²eJӏC;,ήΌe+uώ�›Qf–ˆ£1u+GŽ₯ΖΝZXZΩ'ƒ+D,/5BΊ‰΅οέ–³cη.j/Δ―zΰu.^8R€H‘g;Œ[…ˆluo’�x!"υqX_e^Ύr%@!"Χ[Ή| ₯ώτSΥΔ8ς~2ca½'Ζ$΄Θ²%‹(]Z› -[F+U�jrΏν.%D΄φ―§Y4Ϊ°q3bA­³ΰκ΅ι¬ŸΐςΩU4»Œ,X…ˆΌŸΫΆl4¬ƒθνY=ΊMάh"r=βυϋΎŎms{―·Υγ‘!DδyoίΊΙϋβ₯KτuUΗλκ9ΛbΚ―ͺTΧ§.­o²Ψ-(!$„ˆ<Ž.ΦΆŽΛ.ζ•εِ΄ˆ¨[Έ΄Ž©�έC‚+DTcXŽφD―γΚy ·s7!’»δΠ@@@ ’m!"[/œ'^^Œ%^Δ (¬X΅šψΕ”Q₯ωϋMχ^½ν^^sTw‚Ώρχ{kΰο~5kΧ΅fΛ΄ώ�ά”©ΣΙoΌΏΓzΘπ<"zޞ`F    ©@ˆθY۝:mZ*Uͺ,ΕΒZ[ZΊvνͺ°ΆΚ©ϋζ\ΉσPB… ‡κƒ-¬νάΆ…N<‘²<φΨ€q#i ©%ΦTΠ­^©<>ςδέΊu1,»ιelυpΟήύ4QΈ,bΛ~*Œ=’rdΟnκ_•]Ώqƒ&MžBμΊ3°ΐ?θΧ©SKτ•βΕ‹gμλΥΗμφΣέ1Χ­Yi¬­uΫφb= IΫ΄nI-š5%Ά΄ηϋEΉ e­πo!`͝Ηφ ’QΓϊΔ–ωAF‘"ΕMΦΨzÐΑν}άηΜΩshΌ�D‡xXPγ'¬nζΞ•Σ(gQμnaΝAZ&˝ΛdΝ¨$"άΆgnT¦t)Γ²›*η>؊ΓZaΕRw»«Κυ#χΣ£{71‡τΡGϋbu=–{’ΟOΕΩ�_Ϋ6­„EŠœΒr§!’c‘VΩ •θΝ»ͺͺ<ΊΓ‡€υθ֍>�<³SξτΨ±γ4Ϊoœa)�4 %ακ΅iiδ$ŸΏMΕ}@ ΥΈ![Ιά"¬€²ϋaV!"η±εΌ!ƒ~0]׏?¦±Β2gΣ¦(ΩΗΙ€ΕC«HΫ²ληύϊHΛ$ϊΈ\ΖBΉƒΒͺζόy M@ΉŒΓ‘Cϋ₯eGβ\[€?η͞)φ'‹¬4ΖoΓaή�ύ{wΙ2ή7Ύ&r‰λLύΑ�Gμ;p€ΊtιfΊ–Ug,ς¬&\+Q&η³uΎ_½V2λΧ«+­,V―YΫdΡ•λι#GŒM³ηΨ\=s™³ΐ’bvεn}πΙχε1bOx.ΌξΗOžPα’%d7ΎΉrΡ΄©“d\Y†a·Ψ³gΨ\¬·mΧ‘vνΩcr7­¬$r£ŠΛSƒzυ€ΐ—-λοsl%qΔΘQ&λΊz¬Y³ΠάY3υ, Ν=Ρ κy ·q7ήΌYiASoοΜ§^‡γφξ6,Krš�Oβ�› ξŽικžθσ°>xφό9ε/XD―‚8€€€@$% „ˆό·iΏƒ$… η/˜~7.ώ.Φ₯σ·τEήLDο½—PE^Π-!’cwΜAu©ΜξœΣ WΞΒy']Ήt‘ώψγΟ\lΊE:™3g&Ÿ€Iθρ£ΗtύϊM“E9GC±•9ώ1ώύή§?…λα«Χ�ΪΖQ?�δΉ2fΕ εhπeχgΞ£΅‚fΡΜ•ωV—ΕrY2e’ψ β‘Υεt@my?|σψJwα΄{ΘP[.caXϊτiI¨¬„‹έΫtρΒ%—ϋl Uξm{β.ŸΜ™3Qαͺ<~όxtχΞ=y�[ŎЉ'Yΐ–,y2:sφ :υ«p ^Y ΫxnŽ„ˆjΞ,\K.ڝΧΜ9ρ0ΡΥΐœ>Mυ ={n»χΊΣGPΗδλdηφ-R$ϊΟ?� AžY¬χ£ χξίO­Z·“βέ|‚[Θ=rδH Χˆ~Ÿδk* +˜ϊΨΑ‰'O–Œ�€I#„Ά±₯˜X…§ί€Ϊς:Σ wΪ>>I(z΄hςrhάCBbOxάOPΟƒ€Φ2 PBD½φϊ ©{Ο^zVˆΔΥί¦Ι“}LOŸ>§‹/*xδοΓ>IΣ‰ή—ί�]Ώͺί‰ω{�a©έ D΄A@@@<›„ˆž½?˜€€€Dx"Fψ-Ζ½œΐτ©“ Λ‚Ί{i/_–WO{β|ϋ*WͺH1q=ζ¨υa dۢ펊LyA"šyxBwE½cΗNjί©³Σ;½9­Œ‚0!R{βΚy& Γ    Α lί²‰>/$κaωΚU4ΰ­uD=?2ΔΥ‹1Ίυt^·ίψ N-ΆG.X#€€€x½mΗ0_ˆ` DŒ`ŠεD8Κ /μπΡ£n}ήΈ μ‰γ]ΣYŽk8Ο½w�>•nι Eˆ˜3gιΎ`ώό”3gvΓ΅r“¦-ΌΞuΖΚ"b`ΜPΊ‚³'ξž‘»"τ         ΰ­ Dτ֝üA@@@ ‚€1‚l$– αL@dΉ:•»χξQΙ�εmQ„ˆ? F₯J–0­wεκ5τ}ίώ¦€€€€€€€€€€€€€@€'!b€?@@@Β—„ˆαΛ£ƒ€€€€€€€€€€€€€@p @ˆ\‚h    ," ƒ€€€€€€€€€€€€€@Έ€1ά·ΘMBΔΘ½�X=€€€€€€€D6;Άm¦D|`Zφ²+©�€Ly‘%/n\Ϊ½sEέ΄δ±γόiκ΄ι¦<$@@@@<—„ˆž»7˜€€€D "zώ6Ώ/~ως½ϊλ•ηO3 όΐ VμΨr쇆˂:hΏΎ½)WΞβœ~E5jΥ j³λe̐&ŒkWηΩ³gT±r»ό°Θπ¦= @@@@@<‰ΐΑ}»)Nœ8¦)­ί°‘ΊχμeΚ ‰Δ')?‘OS§’δΙ>¦§>₯«Χ―Σ‰'ƒΤuφμΩ(uͺT[ΜυζΝ[tρβEΊqσfΪΊR)Q’D΄cλ&»&S¦N'ΏρώvωΘπL"zζΎ`V    i@ˆθy[]ΌD)J•:5ŏ—€’EfLπΝ›7τόωsΪ&~Ύtα‚‘―"mΪwRΡ@{vm§“'NZ/¬+°x«ξ76qΪ�έ{θτ™3a=—Ζ«'ζWΜωΌx°mΫv—Ϊ†dε-›6O’$τί�Qώ‚Eθω‹!Ω}ˆφ5{Ζ4β)²ζΘ"}ηρυ₯©“'ΨυυΟ?�R�<_Ψε‡EFPφ$sζLT0~9Ήσζ{τΎyΫ΅{μΝc”.U‚>Mυ)½χŠ9βάCΘF@ ϊίGτQςd7N\9aΆ|·lΙBΊ~횱vsE…?N&‹Ψ²βΈΡ#ιυ›ΧΞͺ†[Ύ·‰>I λ~=’K/™¦ΐ.Ή―e—GόΓ;[ψ4Υ'�rΐ7θ·ίOΣ°α?ΡΓ‡Mύ¨�ψίΊUsΚ‘-%N’XΆ{ρβ%έ–(>BS¦M7ύΰΟξ«T�,›G‰•rεΚ!γlyοδΙ“ͺ[yά½w/͘9Ϋ”Η WΗ΄λ@ΛΠlτμέ‡Φ�Ϋ`”ͺΉΎ"ž={Jωσε#vα}δΨ1:tυύΎ—pΝϊ9½yύš>LνΪw2Ϊκ‘ο:wλΜ%Ής:Ή―σ/�”©ΣθΤ©_υͺ¦xγ† ¨TΙ”.]Z’(QθΜ鳴nΓ*'Δ“Ω³g“u³ζΘmj£_Wώ’Κ ·RiR§&Ÿ$IθιΣ§tQœ «Φ¬₯eΛW¨jN�ZD «=α χCqbΗ–sO“6 }πώϋ2~MX7½{χžŒσο[ΗN 7[FˆΈΛ‡…Ύμ :3'JτμςΟ?Ÿ�›7…%Ν½�’†>NH\›z�ΔωZζsΓά ε5Μ–?ςζρ₯δΙ’I.Ώ�ώ;ωŸ@μ]|~5ά� ΎΙDέΧβΏtω 8pFŽ£W5Εي»υΞ”)#ύ/iRΊ|ε*ΧΛζ-Ϋ¨^=›ΘwΜωtH\/*ŒυŊ[\�§ΘΒ$•-lΙdψC)Zτh΄}ϋNZΈh±©œξή»Έοf͚PΙβΕΘΗΗ‡b‹sκοώ‘G�ΙS§hΡβ₯tψθQc<>Ηϋφιi€™‘²°rδΘ»z\αΆ°΄�³ΟχF] ΙλDυιμ˜YόŸΠYόίΐaα’%”'wnΚ›Χ—R¦HI|Ξώ~ζ4͜1Ϋξ�ύœν?p0]½vΥακ:|φβ9΅οπ­Γ:ΘˆΨB[ˆΈnΝJJ!¬r4d¨ό]'Ίeγzω·<ηuιڍ6mή*‹ωϋ^�~ΆΏΗŸ<ω“ -�7£š5ͺI̜yφάyͺ^³6υιΥƒͺW«*ΎSή₯’eΚυ•‡α?’9sηωE D ŒΚA@@@ΐs @ˆθΉ{ƒ™€€€@€ !’wmsϊ ©|Ε/倃jΩ0zτΤFΈ{fΪί�Mγǎς¨EΟ›=“>�† ΛT(,hόΆKW!(:n*ϊLδζ̚AqβΔ1ε뉱γόiͺ#ͺΠΉSjPΏžJxάΌe+uώ�›©Ž;cš:Π„°p‚ΏŸΜΉ.D—*}₯•’qΥ«ϋ)/ Δœyσiψˆ‘F•€I}Θœ₯b.GEO#ΔΓ GβͺΓ†Pι�₯53εY…ˆ,�8 ―aέΑTωmbΓΟ©[^ŽŠŒ£λ„ž χίη…υ„lΩ² ƒ…Q„ΕΑ‹τu΅š²Œ?FKn₯K•”iόlΩΊ•’‰5§ϋ,°Ž˜Jζ³±B₯ΚvV#|' cAΤυkΧΕ˜œΔb&=X…ˆϊvA΅sχnΊtι²ά‹Βς3ηΰȚ„ή―+BΔ°άž#‹γ zςλ~Š%[ϊΌvυšΜη>‡y_υ>κ!χwAμυ aΑοΑƒ”죏©P‘‚”0α{d"ηΪΤηνN\"ͺφ―^½’Σ§ΟΠγǏ)EΚ�b¦.D΄Άa‹¨GΕu7^<*WΆ ρΓ>›6m¦.έz¨nεqσ†u”τIeόξ½{tπΰ!z_X«d+’κšα"ηήΥΊU jΩΌ™œ+_ΗGΔωZŽ;e’nΆtΚηS‹–mdώΰρš6nd€+T(Oρ‹ΫΔ’ͺ…ˆ“§LSIy ΙλΔΤ±“„#!"ίώΈυωϊζ–{ΟMyύ%…h’Ψ’β‚Ή³eœχ±dιr2�ŒώiΈΈ“Y£ΗψΡτ™³τbΔA@@@" υιάω T­F­_u£†υ©S‡φ²_ώΝa°ψ~·mΫvωBQ aݜ½p` υε+š―Ψ²iƒτΐεK…W€ιΣgΚzό§gχn”θƒΈˆBK–.ίέKˆοπΓd[QΌ$~OΙ’% ňXΜXΆΒ—ςe,Ά._«fuͺPΎΌψν#9ϋ{BD‰    ΰ• DτΚmΓ€A@@@ β€Ρsχ2uΪ΄T€h Š*Dbρ…•.%Ββί½s‡ζΝ™€Ι·lΣήκMμOO…(ΝS‹~όΗΩ¬L›>ƒΖψpͺΊε½#G χΒ A 7\²h₯Β9ΦΨχμάNο½g³~ΖψαƒΨjΦιΣ§M";½œγΚ»†­ί¨‰΅Ψ.cr§ΊΨζώύTΌT»±t!bΗΞίΙ³¦O₯9²ΛΊl­΄1oζΞ’ΒάyςΙ2ΆδΆtρBŠ-štkΫ‘cg“₯„Ή³f ±“ΝŠ₯.γΖάN ­ΙτρΉ�.Dδ1yΏ’G.Ημά΅»œ3Χγπe₯ τΓ€ώ2ώHъ³‰$e†εΓ!bXξ‰ešR”Θ– 9°hΜ‘ΫqΥ&8||…kνiSmnƒΩBhΡβφΦ*YψΕ烳ΰκ΅ι¬Ÿ ζ[E…—._¦ΞΒ²ιE!LUλ<ϊœXμΚaΓΊU”μγd2ΞnΗX4¨?p[Άd‘Ό²Θ΅ŽpW�ΫoΏΛβ*_U¦~Βͺ*‡;Β-qέ†ŒλΎή7uθ».ο\χ†”18χ.v+\¨`9ί1cΗΡ΄3e\}°[λ8Βz€Υ ¬*η£Ί†™EΆœ6A³^n‡ΤubνΧYΪ*Dœ0i2M˜8Ω¨��qΞ°–ιχύvΒνςΞ]»Œv,FέΉ} ŌSήσψ�X%b4*!    )„Ά‘!φύΎ7}υe%ωݚӯ_Ώ6βœ~ρβ%΅οψ-:|˜“Fΰ—ϋ~ίΛpνΜzΫ�ύ—–.[Nƒ‡ώh΄a‹βόw΄Έ[ όψUωϊ+Κ-Ύͺί–ΈlΦμ9wQ§ˆ8€€€x½kΏ0[ˆp Dτά-ύ"_ΚW  έ―ˆ7ΫW,7[°²«τ6#yςT½V™ϊσΙš6e’³ͺ‘οͺΨιψ‘ƒςG|Ά”V¦|%;w«μ’“]urP.‹ΤB>`Έoeλl…ΐΥΰͺ1$Ζδ9ŽϊιG*QΌΈœ.‹sXˆc ΊQ­Ow[ͺάώφμήUXD°Ή&UΒ@]|e΅¬Ζγθn‘uk“‰%’[7Ι©Ό|ω’ςζ/dš[”œ4ρΈTΗ•ΨR ε-ZΌTZ=45‰u«WPŠ)dvΝΪuMΦ1υΊJ€Δ–sεωB/²‹‡εžXΧΧ˜Q―λ*έ% νJ•«`J iW―Ν@; €‚.Dd±\­:υœξ7w₯Οο¬°X½fm» μO•*ΪΦ� “ΗŒAŊ•υ ϋtcH ƒsο�]Όύ0x(-^²Τn­eΈ*D ©λ$°y©r]ˆψXόίUXυ Ÿ§Nύ"¬yΎ³φ¨ίΏΨβ ±U¨ϋMmκΪ₯³LZΛTA@@@"°"ς QΓ…·Μ™2:„Κ/_ςK˜ŽOηολŽ{θΡ»ρ•ͺΓGȟŸ k‡o^Ώ5b kβi€υCUηφ·iΥΪ΅΄`αb»ίPT A@@@ΐϋ@ˆθ}{†ƒ€€€@„"!’ηngš΄ι„Υ·βΒ"bTŠ;Ŋ˘μα:sξμ�}«‘ι R³N]ϊψ­…°½{vΡ‘6ΛaͺzD–.& Μ""[ˆ[±μ “]vͺ \©Fnˆ’$N,³― ·Λ+WQUhνͺε”2eJ™fW€?�ΌQX!8*άA ²…,W…ˆ!1ζ')?‘•ΛKζ³gΟ¨T™ςη« σ(,λθ’Γ’%JΛ‡;΄£Ζ H*…:,Ψαΐ.Z,γϊΗΎέ;(~όψ&KŠl%‘N 9ο�ν”@Xψδ  u1—©ύT{Ιy�ϋθ|‘Οχύh՚΅*i:Ί"D Λ=1MR$tqa`BΔΰπΡ’<ΆώΉeΛV:$Ξυ€¬ζισuεΪΤΫΉΧ…f<Η†MšΨ•.>㊎Ξv½¬Ξ§•«ΧΠχ}m6Μ›c<T’]}°^=ΊSΝΥdVHƒ{οΠΏ―΄ͺΒb7k[Άl£‡�ΑC‡νDκλΠγ� Cβ:ΡΗ,� Ή�ζφ'Ž’Φ\¬βZΆzΈ]’cǎM�ύ·΄žͺ¬κ{έΆ]G“₯Χΐζ„rˆE ΄…ˆμΙ€­™+7Κό²ή³ηΟιΝΏ―‰Ώ›¨ΰθE3ύ%*�wλΦ-Š!¬z'ίΑωο\μ‘Y‹–&«ρœΟK;²~Θ–δ·oΫAΛW�βjΔƒBπh"zτφ`r    ρ @ˆθ={μγ“”Ύ�Vƒβ ‘‡sgΟΠΊ5Ξ@fw;ν„K]>² Ÿ±£Fxόb];ιB₯ ,Μκ’ΆͺpKΔn’¬­―νΪ³‡όύ'hΫΉ*D ‰1u�œyσiψˆ‘Φ%Θ΄.DT‚ΏΞ:Pƒϊ6WΐJœΨͺesjΥ’Ήl£„ˆΊΕΕφ:ӎ;νΖX³j±(’ƒj§‹‡ΨΝ/»Ά½šΧYΆd₯K›ΖZέišΧΝλw\"†εžXηκŠ1Έ|@+–·NA ΩV Qή„ISœZΓΰF�\›vƒΈ‘‘_ίVχߎΊλέ³;Υ¨n :*·ζmίΎƒ:|ΫEfoέό³!XΦΟIΥ¦y³&ΤΆu+™ !’Ύ65F@G뽋…Œ,¨S υΆl rΚΤ©΄iσV=Ϋ.ξͺ1$�»I‘ίKζ/XHC΄��kχŽm”0α{Δ.εrϊš-Ÿ2ˆΚ•΅Ή₯S{¦ @­βΕ¦‚"J ΄…ˆκonΖwΰΰ!κ$Ύ¨dψολ>½{n’ωΕ+υ’˜.d+�=zχ¦M›ΆΘ]ΰ—ΜƎϊ‰²fύ\¦Ω₯sΣ歈-/ΦͺY*”/o²~Θ Ά ρaκ4©){ΆlΔ/ν° ’=Fτν7ΐ˜μLϋΠη0eκtςο―•"     ΰΙ DτδέΑά@@@@ €Ρ»69~όΤ€yKωc5‹/όF�δt ¦<_δ“ε·ΔΟ‹ζΟuZΧS \;}Y©ύ0ΐfь\ŸΏΐήjŸΎ�'OΣκ5λτ,*Z΄5nPŸ²dΙlΈiVXΘnZ§Οœ₯²μŽ� ΉƒΰŒΙ6mXK1…%ΆτUΊ\E§β1GBΔNΪS£†υε:"ϊEE Ωά*;³Άbι"J“Ζ&TVδτ=aρ"‹­Ao§‹Ύt‹k³ηΜ₯;wοY›š�,$sζNΫ!"wV{bZ€HΈ"D >₯K• fM›RϊΟ�Y§"‰Ν[΅‘'NΪ•q†+Χ¦Γ\ΜΤΕz'O!� “μAθ²eΐ]»χX�μΩsΒκaYΗ™•NΥ» η½β DmͺLέŽ?A 7UΩς¨ ίta�~Έ{οβΎ;΄oGμv;nά8¦q9±cΧ.jία[»|•‘Šς}.[N_•ΰ18ΧI€;(Τ…ˆ³fΟ‘ŸF±«uτΠŠ!¬ήrΠο%œφΝ•‹¦M΅3gΔ^Χ¨U‡τ{βΤiΣiμ8g@ˆθ 2A@@@ΐ+@ˆθΫ„I‚€€€@Δ%!’χνm‹Vm)nΌxrβ£FΨ~¨v΄Šζ-ΫRΌψΆzK/ λΒ5±§WΔNΊΰ£GS£¦»n hνl οy©BΉ²TΈPAŠΛζϋιΣ§T p1§M•‰Ε[υ5qZΟQ;cκBέ΅¬£ώυΊJ€T!βχ}zQ΅*_ΛnΩJ[€³†ν[6IK oήΌ‘μΉςΘb]ό³c§Bu΄B©vά@Ν‹γ“&ާ|yσrTZtP"1™αβ‡":²”PW‘½'Φ±]"†$Ÿ€I}„°°UͺPž²gΟfXα`«mΪΩwΦΉΊrmZΫΊ“Φ…ˆ&N'ΨM‹fM©Mλ–²Ξδ)Σhœ�„λλ…«V,₯OS₯’YΚΊ§^�»/· νί#-ž:υ+ΥmΠPo&Οgή7Ί1$ο]άwΜ9¨\™�TͺTIΓνηΧ¬]Χ©UWw„ˆά'w�~Xš=G6[o?Χ�]oJλ ]ˆΘςήίχΥ‹e\ ?yB…‹–°+Χ­―2 Ώ1#ΙΗΗ‡ψžU¦|Ε »±Άλ8€ Ύž’'OfΤxφμΉC‹²F-b΅XzβψI§bk­/^Μ$F½&ώ―ησ1°ΰκžθύ…Η˜ξς =qwLoΫwΟύ\B@@Β“@h υοΖ—._¦―ͺΨD‚ϊz«W«J}zυYϊw±ιS'Sξ\9e>{ΰοΦ°yΓ:Γ½3�­+v,κΥ£;mέΊ/]fˆ δΛGόύdsvΝΌYXV,T¨•(^\ζυλ?Π‘«f­Δ‘ο!!’χμf    ’„ˆή·­­…P(V¬Ψrβ~£G ·”�Ψ-‚έ8SΏ‘ΜυΧ_δ?Ξޚ”]#ΘΠΕNŽήόΧ§Θb˜ύ{wΙ¬'Oώ€BEm?€λuά‰λVΜΈ½#a’κW ²$ κt ʘΌήΝΧSόψρ₯«ν―ͺΤ «Χ�:ν68BDέ­#·Έμ’yυΚ₯%JΊw�>•(UVΞƒn›Ά‰‹ξάΉK₯ʚ]λνΈ.Dδ‡&5kΨ\λŽχŸH“¦LuΊΆΐ fϘ&v\/ 1V@ύ„ΖžXΗΣ…‘ίvιF[Ά:w§’|τyΤͺYƒzvο*³XΐT±r½Ψˆ»rm‚qUˆΘΦGόhf+χdA~Κ€ ”7Ν*`ΗΞί ΧeΫMMυr«ρπ½RΈ|ύΖ ͺPι+S»ΊίΤ¦�]lVAu!bhέ»xpύdŸοϋΡͺ5kMsR‰Ή³fξάτλP•υ”λ„ϋjίΆ55m�ΨΤ-»s&8Φ…ˆ—―\‘Κ_Ϋξ ͺƒΜ™3Ρ‚Ή³e�Ωύ—Ηγq9\ΌxΡ°ΰκκω!;βΗ¬ιS)GŽμFν Š‘Y„­D«ͺqP΅'Ž2ΔΔά6¨Β|WχDΝ‹a=fpψ„ΗžΈ;¦7νIpΞύ\B@@Β“@X οάΎC₯ΚΩ,κλΥ-―ο?xZ΄l#‹§O™DΉsη’ρƒ†Π!,΄†];Ά�ϋ Κμj5jΡΉσ¬UdšΏcσwIΚ+ΗUϋ₯ΛWΠ€ƒ8Λ D4α@@@@ΌŠ„ˆ^΅]˜,€€€D<"z֞²Λέ¨Q£J7©ŽfφYϊ BμRY䚹jυZ”ς“Od½ί~ύ…6½‡9κΣ“ςtQΛ©SΏ cœή�Ε ι³tievη;bδh‡υΩ₯θaα�υω‹F9 Y~ϋνw#­",Ϊ³k»ΙΝ‘ήNΥγγŽm›₯²/^ 1^S�z=Θ­Z4§V-›Λ�Ψ-q‡o»¨nƒ#DΤEgΌvX=|ψΠ§_ί>Tε+Ϋyxΰΰ!jή�&φα Ϋ6o€Δ‰?”u»tλN›„ΕΨΪ[}PA@ιB2–V�RΝ4¦jΓ£R$ONό ΖY:x±‰[ΖcA³–{bC½o„»Ψ.6«‘μ|τ?k#\>ΞΦΙ­F�4\Žsύϊuͺπ₯Ν¦1πۈ«Χ¦΅½«iW…ˆμϊμηu«₯uBΛ™KqΎΎ ΘG›6Ώ}²XEƒΨJH«Φνdœ?X<»rωbγ~`"ς˜ό±΄²Wωλκ&qπΚεK(υ§ŸΚΎt!"gηήΕ{q[<Μtt_Z.\¦§}λ2έzύΙ‰Όύ3r+VT¦x½Όξ€‚³σ'¨χKWVΊ‘ηeγΰRΕ εδ”Ω²bΟ>ίΫMŸηΆS< #†©¬gο>΄vέS^H%ά GhΦ’@fΦc‡Ox쉻cΊzθηmXοIpΞ}ވƒ€€@xM!"�-ͺ^œδ5:zαI�Ϋ}ΞΌω4|ΔH‰C νχΣg¨VΊ&Lϊίʁ½ψR»VMκΡν;Ω^"ξΩΉή{/9²ΨΡ D΄A@@@Ό‡„ˆή³W˜)€€€DH"zΦΆ(\„|}σ�Γˆ„W―^¦ϋχξQ’D’oή/(CΖL†ε£›7�Σβ…σ. }Η.-z4ϊοΏ�h�„qτRΰ9lΰA™Η θΡ£ΛmέΆXθΖ.’98xΨ$NΛγλKS'ΏsΑΚξŒV¬\Mάώƒ’&MJY?Ο"Δ*εΙ'I�Ε'κ‘‹λΦ­ί@‡£{‚s¦Œ©|Ω²”+W9ή­[·¨l…/eάΡΗό9³(K–Μ²θτ™3RάςθΡC)JΊpα’Ι*ApΗΤ~΅λΦw(’Τη!"χΓηV†τŸΙ.oάΌIγΖϋΣ“ΗR©�%„ρε7ΆΪ ‹uΑδΛ—/iτΨqtες!z*Bl}OΊ‘σgLb°g1β !Ξ;qκ”l’&ujα‚΄¨tw{UXξ³ZH“•ή~Τ¨^zχ΄Y}ΰk`οΎύ�ςΪ›7�Ρ©_~!v₯Ν!¬χδντŒƒώpηΥ«Wβά]EgΜ₯Ώ^ύE�Ύ~mqr#wω(#»[#D[Ώ ξK1F�9¨J•―€°“ϋ�yγ&κΪ½'GW�M‡Έιͺ‘»nΫΊ±5Oό@Ž-‡π=αΟ§RΚ”)‰οe„ϋβ8q☬°%ΟυkVSŒΆϋΚ΅λhΙ²εβΎ›ˆz|ΧΕpyΖύZ…ˆγύΖP‘‚Έˆ˜―�„‰2^·NΓ*'gX…ˆξή»Έ/1¦L‘œΆοΨI;wνβΗλ”,ΩΗT€P!ͺTρ₯ΆHΚ–I….ίv€ϊυl4Ωͺι�₯Λιζ­›’Ϋ£‡MΧtp―ίU•ώp•Ϋ?{ώ\ u―‹΅–Φ/«W΅Yξδλ»zΝΪ¦{-ΧWA\r^HZΟUcθGwhΑΪy“ΝΥσ@± ŸπΨwΗt—sς¦σ@ν+Ž   ήBSˆΘk[΄`.e̐A.“_^œ9kΆ°^}Œ$|7¨oX(η ϊχjύe1.;~ό͘=‡ž?}FΉ}sQΓϊυδw.;"ϊkάΤφΒ"§­A�ήρλ―ΏΡ6ρ"ίyΘ7wnY�™­Δο'!’χο!V   ^MBDΟΪ>"ζΙσE “zυχ+š2a<ύσ½[f_ΡΎ θ‡Γc!΄›1}J ύyR…>½{"λΌ† N .2ewοΪ…κΤ�eΚs”p$DtTOΟc+[lmΛY([¦4ύ8t°ΓβΝ[ΆRηοΊeJΜcd8‰8S·bpδΘQjά¬…“Φﲃ+D,/5BΊ}Χ«9Άcη.jίΡfΡO•π:/œG)R€PYNV!"[z›θ?^ˆH}œΆαG�Z­ tktz™n=-¬χDŸ‡Š/[²ˆ�₯M£’¦c₯ΚUMφά壄ˆ¦Ξ- 6l܌XPλ,Έzm:λ'(ωξΉ_έεp@γθΦ@Έ»§Ά e΅· u1©£ϊ*Ο*Dδ|wξ]άN·¦ΘiGaωΚ•Τ―�ŽŠd_ckV.7,HκuwλœœλDυλͺΐΚ*DTύX,νΥ§―5ΫH[χΗ™λ9£A0#ξ Π‚#΄σ&š«ηΪŽΰπ =qwLwω0'o:ΤΎβ  αM ΄…ˆμ½ažxy1V¬X.uΕͺΥΤ·ίSaCQΉ²eLyΦΏ¬S£fβ όύˆΏί[χ«YΫlmQΥΡ�Žž2u:ω‰@@@@Όƒ„ˆή±O˜%€€€DX"zΦΦ¦N›–J•*Kq„˜+J”(v“cλOΧ�]Φ»V9uίά¨i z�ύχeΫν[7Σ‰γΗμϊρτŒ&Ιέ“ϊψPBa-@ώqž€·ώ‘Ό[·.†e7½œ­ξΩ»Ÿ&Nšlϊ~μθ‘”#{vS�ͺέυ7h�δ)΄zΝ:•ετΘ?θΧ©SKτ•βΕ‹gμ›#Œ»c�[³�X[λΆνΕzφ9*hΣΊ%΅hΦ”Ψ�žο6‹mΚZαίBΐš;νAD£†υ©S‡φ�Z‘"ΕMξ^ΩzÐΑ χ²ͺoξs¦°Θ0ήίfύMε«# —όƎ¦άΉrͺ,i%rχή½/N\ʝ;—<σδ+h”«·νΩ£•)]ŠΨUΉήΌyClΕa­°bΉpΡb½Θ.ΞύτθήMΜ!}τΡGΖΎ°•<έυTXξ‰έ$E[έkΫ¦•°H‘SXξτ1,[ΌΛV¨dgΡΞ>ό¬G·nτωη™ν˜ςœŽ;N£ύΖ–"ΝSεΉzmͺv�υ_μr]―54nΨ€7j(]YΫ\χϝ;w;tγΞΧLSqο‰-šΡŒ-θm–Y«~m³j"rΕ¦MSkα6]YrεΓ”η(q`οnŠ7ŽQΔ�?π�WχDο/¬Η ŸπΨwΗτ¦=ασΑέσ@?—π$ „ˆό›AΏƒδT.œΏ`ϊέ Έσγοb]:K_δΝc׏;Yˆόζ/XhWΖό½¦‘ψ§�&’*ξά-ΎΣŒmzqM•9:vν�™Š /όݘ½AμΩ·†iϊώΟν ΘOΡcΔ _ρ]Ύ^έodW":"Š<π\"zξή`f    )@ˆθ™Ϋ5jTJ•*5%ϊ0‘Σ$€/^Π-ρ–;»c~ύζ΅gNΪfΕ"­Μ™3“O�$τψΡc!ΊθσleŽŒ�ƒχιOαz˜έœ²X)4ƒ+cV¬PŽ�0PNηΜΩsT£VΠœšΓΎY,—%S&ŠŸ Y]N;lπ6“χΓ7―b#ώc…ήM`ϊΤΙ†eAέ½΄w―Κ»g=qΎ•+U€˜ΈsΤϊ°²mΫvGEαž!bΈO2‚Mΐ‘ѝ%.Z0—Ψ²+g"RwϊEο'°}Λ&ϊ@Ό¨‡ε+WΡ€·ΦυόΘg±δΞν[L–ήyέ~γ'ΙRwd`„5‚€€€€7€Ρv sLBΔΌΉXZ„ -ž%I,ΧrψθΡ±&o_φΔρςƒ«ύ{w9. $χήύϋTBΈ₯χΔ!bΨοJp„ˆlE6Υ'©¨T©τiͺTrςOŸ>₯�e+„šEΥ°'„A@@@@@@@@@ΐž„ˆφL    † D CΨ @"0ΰοή»G%K—σH:"†ύΆGˆΈuσΟ”$±MΌΝ3σζ υπ­X΅:μ‚A@@@@@@@@@ @ˆ†°1€€€€€=ν™ @@ΐ=™3g’XnΈf~ςψ1]ΌtΩ½ACΉ•.Š4d(-ZΌ4”GDχE ¦1£FH?ŽIσ, 2”΅«–SςδΙιΥ«WtϊτZΊb­]»>ΘνQ@@@@@@@@@Ό•„ˆήΊs˜7€€€D"FΔ2@@@@@@@@@@@@@"-#νΦcα    ΰ DτŒ}ΐ,@@@@@@@@@@@@@@ΐ]"ΊKν@@@@B„„ˆ!‚€€€€€€€€€€€€€€@Έ€1άΠc`&!"Ξπn"zχώaφ    ΰυ Dτϊ-Δ@@@@@@@@@@@@@"9#ω €εƒ€€€@x(h?@IDAT€1Όwダ€€€€€€€€€€€€@π@ˆ<~h     L" šƒ€€€€€€€€€€€€€@8€1œ7Γƒ€€€@d'!bd?°~o'!’·ο ζ   ^NBD/ί@L@@@@@@@@@@@@@ �€1�Ÿ   αKBΔπεΡA@@@@@@@@@@@@@ Έ D .A΄ƒ…A@@@@@@@@@@@@@ ά @ˆξ[€ €€€€@δ&!bδή¬@@@@@@@"Ϋ6S’>0-{ي•Τΐ¦ΌΘ’ˆ7.νήΉ’GnZςΨqώ4uΪtS    žKBDΟέΜ @@@"=›ί?ŒΏ|ω‚^ύυΚεΙrΫgOŸΡΏ�ώγr[4πόΐ VμΨrΒ>τθ‰χλΫ›rεΜ!ΞιWT£V™kΖ hΒψ±v}={φŒ*V�b—ή΄'aΑc€€€€€€€'8Έo7Ε‰Η4₯υ6Rχž½Ly!‘ψ$ε'”>C:JšΔ‡._ΉBǏŸ η/^ΉλδΙ’QφΩθύ„ ιξ½{tφΜyΊzνjΫ₯b’D‰hΗΦMvU§LN~γύνς‘    ΰ™ DτΜ}Α¬@@@@ �€ΡσΆΊx‰R”*ujŠ/E‹͘ΰ›7oθωση΄Mό0|ιΒ#ί)TΈe͞bĈAQ’D‘Ε―_Ώ¦χοΣΊ΅«θρ£GΦ&“fρVέolβ΄]»χΠι3g>Iι›ϊ ε€=zH3§M1ΐBΓΈρβΙ4[„ϋγΦM£Œ#ΝZΆoάΫ\τ,Y΄€n\gMΡT1Œ,ΖΚ’9“ΥΗ'‰aݏ-\ΊxΙ4ώά‘ϋΪD‰�πž1Cϊ4Υ'=ztΊ!~Μ�νχΣ4lψOτπαCS?*ρIΚO¨u«ζ”CX$Hœ$±lχβΕKΊ#,Q>|„¦L›NwξάUΥ₯ϋί*•m’D‰JΉrεelyοδΙ“F=Žμή»—f̜mΚγ„«cΪu e,Z0W�™³ψΑ? P]σ\_ Αι³gO)Ύ|5jT:rμ :‚ϊ~ί‹²fύœήΌ~M¦vν;©¦¦γw;‰uζ’\yάΧω‹iΚΤitκΤ―¦Ίz‚‚”*Y‚�₯KKβι 9}–ΦmΨ@ε„x2{φl²jΦΉυ&FόλΚ_RYαV*MκΤδ“$ =}ϊ”.Šsa՚΅΄lω £ž³ˆ«ΓjOxΎγύΖPœ·�Ή�€MCΌ�Ύ\Ζ5aέτξέ{Ζ’xί:vκμΠE—»|XθΛ� Σ1s’DΘ±ώόσ)έΈySX�άKγύ'γs$$�MS‡.$ψZζsΓά ε5\ωΛJ”7/±‹3v]φϋοΏ“ίψ Δ�ΡυΐηWCρΐ-­ΰ›LΤ}-ΞρK—―Ёiδθ1zUSܝσ`�Δρ#Zt:|䨜ŸίιΣF�ώϋ/;wΦ�ό3ΝσwςψϊΚ=I—&ΈΗ₯h’―Λ—/Σα¦Ϋ™kzuθνjT―FU«|%χŽΫρž<~ό„Ξ_Έ@?�Ό‘–―\₯WVœ]Υ³Eώ?dεͺΥςαληŸg‘Ψ±bΡa 搸·6ά4†Ί_rζ�εΛiύ†¦r•θά©eΞdϋ�ͺ�ΐΑtυΪUU„#€€€€€—M!βgβ{π�ΕΆοΞ,�\Ύ„Rϊ©€VΏQγοιΜβχ‘smΏ%Xέ/;Cά§Wͺ^­ͺόϋΌd™ςF5εΕaψO£hΞάyF~`#„rπ\"zξή`f    )@ˆθ]ۜ>CF*_ρK9ι»wnΣΌ9³ŒΤoΤ”>όπC™ή΅c;=rΘ(γH[!4‹ρΦMΟ„qcθ―Ώώ2•‡Wbήμ™Δ"‘ ,XΈΘT΅hΡ"ΤΏoCΠe* £|Ϋ₯+;vάTΔζ̚aΈ¬6ΎMŒηOS…Q‘4¨_O% 1�¨”4©ωσ£tBΜε(όύΟ?4B<ΜXΈh±]ρˆaC¨tιRvωΦ «1ž°ά9p@_*Y’„΅ͺ‘ή DKέzτ2�Ž"�ΓrOx�κA£y[σ*U�j:‡ YXP¨Ϋ ‘I\άk3 ±++]Ί$6TVcQ»4‹7Ž]³BhΦ·ί#ΏU‹ζΤ¬ic)*62΅[mΩΊ­8ٝσ€χc�ή]ZK…xvΐΐAv…M5€6­[:+ ©Ϋ΄λ`7Wu½zυŠώϋο?ŠύVΨͺΐΦNΨκ‰5Έsp,�όiΔ0bNŽ /Yδ9wή»bέ%]‘Θ`QiΎ6—uŽΚ]ΝΣθ2£XB€h ,’nΡͺ΅!τe!βΰΆσθΧ_£:υX›οχΞν[€»;^/?ΰu&r·kŒ #šBDώN;Rόύ́_¦lΡ²έϊύƎ’"… Ιό>ίχ“/ήq’NνZΤ½k™ΟβArΰ—mnίΎcό +3ί~τιέ“ͺW­"^|Fω •Ήό�ΣΤΙdάϊβ"g²Ψpמ=²άϊ!’•�    ΰ= Dτž½ΒLA@@@ B€Ρ{Ά5mΪΟ¨tΉrBT[NzΟξ]tψΰ~cως€/ςι'OKk‰ΚύrΖL™©lωвμεΛ—4qόX£]xGΨR–»₯J•JZ<γ9]ΌtIXϋz纈σ–―XE§Οœα¨ ,–[½b™!&dk`Ϋwμξˆ .$­oqΕ›Β:dΉ •mή~NŸ2‰r Λ^ΨͺΧQ!TΌ*¬�±˜σ‹Όy(Eςδ�Bά€)SίΆ Κ—7//^T¦ΩΊ [ΰΐϋΦoψYΖΥ»]Ϊ΄i‹JΚ£;cš:Πό@,pp$ΠΤ…ˆlυŽ-±ΰ3аNȁΕ?ηϝ§lΒ’η]VΏ�VS–ρLj‡RιR%eš-!nΩΊ•’‰5§ϋ,}*φ‰‹+Tͺlg5R zΈ ’�_»N9sζ΄1Y…ˆ½{v'>8°ΐjηξέtι�eΉ%Š“ΉlА‘΄hρRŽ: �ΓrOx²,ŒΗv ηΦύK~8uνκ5c=|νZ­Ά‡zΘΖ\{}βδ)zπΰ%ϋθc*T¨ %LψY…ˆΑΉ6…ΈΡ…ˆͺ •>}FX�{L)R¦3u!’΅ ωŽŠλ-Ε–+[F ΙΈ―M›6S—n=T·ςθΞyΰHˆΘχ'ΆΠΘΥυΙ΄nΫ^XάgŒΙΩBJ΄hΡd[\œλΡ£G—ωϊϊTc%DTiWžΦ?K—Ξ°6Κe5kΧ5έ/9ϝσ€Ϋ±έτβΪηΐ�‡lάΌ…?zLΩΕύCY8eq^υš΅Ε½ϋ²¬ΗϊΓOΎ¦ω>ˌώώϋoi±2�ω„υΘ(o~ΫX£a0"Ί‘»α�v‰{Iόψρ₯•VΕ–-֎σξ�Β];Ά�ϋ Κ‘Ώ�Zέ΄Ξ¬χMϊ�Λ·²|χž½R$*ψπJκoγsη/P΅΅Bt l…άœνoΝ#GQγ¦Ννϊgλκό‡ΡcόhϊΜY2ή©C{jΤ°ΎŒσΛ‚yςϊR�9δί³œyχή=Ϊ ~ψiΤ;kο₯K•ίαmΒΗ'Oώί£/Q–,Y(FŒθς%Τ²Ύ”/Ρ°uωZ5«S…ςεΕo‰LγΚί~@ˆ¨Σ@@@@Ό‹„ˆή΅_˜-€€€D8"zξ–¦N›–Š-AQ…H,ΎpeΙΒ7ξήΉ#¬!ΞTIγΘ?ž§–«8°ιΟ?�VΔβJ N*…{—/›]Λπ‘�X?mϊ §�IΥTuΛ{όγ~»φMΦtρŒώΓ>·ί³s;½χžΝU5sγ‡z`K‹§OŸ6‰μτrŽ+A Ψ•R`!$Ζδ1tWMχο? β₯ΚΨ ­ ;vώŽΆmΫN³¦O₯9²ΛΊέ{φ’ξGωαsgQaξ<ωd™.’bͺ:v6YJ˜;k¦pλl³biJ±ΈJYM›=g.9ژ›>>gκBD“χ‹EBΩ2Ÿ5 ؟*U΄­έ*�sη<° k Α›.nδλaΛΖυ†Έ6Gn›΅žΧŽm›)ΡΘ)Z-Qrζ\α6>kΦΟeyΏώiωJΫCLΞPχ~pX�’Y€¨s›Ώ`! ύq„μƒ?ά=tαq—�έμDƒl™φηuk佘­―,RΜ³]›Φ�U6gόΌquνήΣ( ­ˆ.D3vM›1Σ4Τ²%‹ +ΌΊ₯Jϋ�XfϋΏυήύϋT’TY£]@eF%D@@@@ΌŠ@h „κŸγl‰›-r«Π‘]j�Έ‘J�š΅λ¨WŸΎ2­{?ΰ ώ»…ψ>πTΈ]NώρΗTΊτ»ΛFŽC3gΝ1ϊacόω)‘°vψζυαQ#¦°$ŸFZ?T•ψeUkΧ�‚…‹ν~CQu DT$pο#!’χνf    Š„ˆž»i�¦£"Ŋ ‹ˆQ)fμX+f,c²„Hbξμ�κ‘ʌ5}SΏ!}˜8±ΜbρΞΏΒΚ]αϊ3ϊ[χŸl%qγ†utζτ;K`ͺ½'u1Q`uaΟύ[KP 7DIήςΈ&ά.W¬\Ε¨³vΥrJ™2₯L³θδηŸ7�‘ΓG…;θ#&«ŠF% ͺ1$ΖόDXΌ\Ή|±ύ<"J•)οpΎΊ1_Β²Ž.:,*«>€ŽΪQγ† δκT^Χ.©ξ76!Χΰ‘?�ΒE‹νVΏoχιJ·€ΘVY΄ΔΑ‘€‘σχξΪN „…OΊqΜΘT¬XQ™Οj?Υ^rή�>ϊdθσ}?Z΅f­JšŽ�ΓrOL“ ]\˜18|t(ρ­nΩ²•‰sύ˜p•”ΰΚ΅”ώ«£ κxŽ ›4 °‰.žεŠŽΞŸ€�KjΈ&_Ήz }ίΧfa“λ»sθBDvο^R\‹Φ ‹ψ” ˜λ¨{[,YΊœ΅™|(Ι'9°{ψρώ:ͺ-―±L…JF>Gtk©K—― εξžΊh’ηϋZ|9¨k“ΜVuα΄nΙ”�OΪwΰνή½Wήg­VhUϋΰu!’\λ}κΧέΐAChΙ�eFρΌΩ3₯ {Ξhί©3νΨ±S–±Kf>Η8θΦjd>@@@@Ό’€ ςί₯!νš™XΕ†[Άn₯'βŝ€>>�βΌM�~b"vι֝6mΪbTΧϋ½uλ±Ϋe=°Ρ‘υCΆΰΎ}ΫΣKNz;=!’Nqπ."zΧ~aΆ    α@ˆθ=[κγ“”Ύ�VCΊZζYŸ;{†Φ­yg%λλ*Υ)UκΤrA=€…σζΠ_ύ%ΣyΎΘGω ’Β#ϊϋ¦„HΡΣ‚+b']¨”uX]�²ΛTvj ,–Ω΅gωϋO Π·S‚   CbΜύϋ�W_ΪΔGŽά‡ͺυθBD%ψλά©5¨os¬Δ‰­Z6§V-šΛfJ@€[\ΤΕ8ͺo>�Y΅ŒXΙA΅Σݞ²›_v�l z;5/�£[)³Άq”>b$ρϊW„ˆaΉ'ֹꂨΐ„ˆΑε3xΰͺXΡ^(ΗχˆUB”7a�§Φ0xή�\›ΦuΊ“Φ―o«ϋoGύυξٝjT―ζ¨Θaήφν;¨Γ·]Œ2wΞ]ˆhu‹¦:φ;ŠŠ*$“μš™]4λ"jgνx―xΟ8θΦQ8­ξ;§NύJlMQzߎ�AWΟ}ϊ8Ξβ|�dk”ΊΘpՊ₯τiͺTvMΨ­όœyσL–aμ*Ή‘‘ υ{ŒκͺQΓϊΤ©C{™œ2u:ωχWET½ZUκΣ«‡L³‘οΆlΪ@>I’―οΛ―ͺ™\SΛ ψπ:‘-Dd K/€Ο�₯ ”ώwιˆaC «‡lq-―λ�Fη—…bŊ%_N͞+±+θZ5«S…ςεMΦΩƒΑ6!>L&5eΟ–Έ-{/`}ϋ pψR#!’Nqπ."zΧ~aΆ    α@ˆθ][?~j�Ό%EUΊηρύ“±€ί~'σ_Ώ~Mƍ±~]MSΩ„Š'£m[7m=%βŠΨI·΄Ε?�Ο_`o΅O_Χ“'iυšuz-Z„7¨OY²d6ά4« ,8a·žΣgΞRYvG% ͺ‘;ΘlΡlΣ†΅3fLϊϋοΏ©tΉŠNΕcŽ„ˆ,Ύa‡€„ˆΊxͺm»ŽR˜)i+–.’4i�ΘeιMί]Δ£5#½.�-�±Ε±;wοιΝμβ,$sζNΫ!"wV{b]„+BĐΰSΊT α&·)₯�,u*R΄άΌUβsΩQpεΪtΤήΥ<]ˆ8qςςŸ0)ΐ.tξΑC‡iΧξ=Φ?{φœκ•\=t‘ή/Ώό*-�κύq|ϊ”I”;w.™­�₯Œ2Π’sež³veΛ”¦‡–u¬.Υ}ηψρΤ qSYG}&Dδz�œΊEv 7jŒŸΚρQά7 „Ωκj]aQ0qβνΪ±k8Ω?ρΒ�̝Œΐ„ˆ­[΅ –Νm6Y7ά·g'ŏΨΪk‘’%Δώε&Ώ1#εT1wgŽh    ώΒBˆΘ«δ‹-LΙ>N&wΈ~ύ:ίYξί»Oόb ‡₯ΕK–Κx―έ¨fκ2ΎdΩrψƒν{Μxϋ‘?d+ΰuΏ©e΄ωGX0ί#^�δΆ{φξ£S§P�\9τζ2~φάyω‘]Θ€Ρ䁀€€€w€Ρ;φ ³KBDοΫΪ­ΪR\!’ΰ0jΔ0yŒ#ήjoΩΊŒ?}ϊ”¦NzgαIfŠ,Ÿgn|m.@oήΈN‹:Ά&§κ‡ΗΡ±“ξψθΡγτφξ^¦ϊ�γψǞ’ε―έReί²f_SΘ²οQR²΅')Ήφ5…ΚN²οΙͺ_*T¨μ!K"ώησΞqf»χΞ½ά;s½Ξγρ3g?ίσόΞά_3σžΟ·UΫθ‡nξ~4PT’d ©U£Ί”+[ΖTΠύΥ²tΉG‚j‚B "Ϊ'‹Λ5έαBχΠMφ9ݏξ}νΐ_lƒˆ/χ{QΤ{ܜN«$hE:ίiε²%¦�‚VΨΤ :+RDƏσΖV­^#ݞyΞχ0±Σ v»t~τ¨RͺD »rœYˆΓ?vQƒS…‹•Œυ�uŸψ6$” βΥτΙ–M‡+-ujΥ”‚ ˜³ΆM«btyΊ»o3Νr(―Ν€'q₯;ˆ8rΤ«bγ˜hΟΠ‘][ι�Ή£ΩgΜΨρςAΤΘhχnclŸΊί†υkΜ©τΛΔZz^3ξs»ƒˆ:ά›V τ:ξΐ©Uη1χ!f^‡FΧ!�uς ΛΩw…βbD4'΅ώ‰νσΰ«υk­JΌi­pϋE)R<φ―'ϋ:ξGm_•Κ•₯†5\œ»Jβ0+ΰ,τ]±β#ζϊφyφνΫ'Z 2Ψδ"ΪΥZέϋΊƒˆC†3ΎξνΌ,Χυ o7tΨ{ς`ώόV›+™] «‘μάη‹νΌoΕ�ν_οΆvŸ3TϋX­šS°P{Ρ<.XπΉΧr°…ΔΈf\}τoάwάξάΚιΣgœ!·•Afϊš‘Φ'q}Π'Ažp�­NŒηA$υ‰2Ευ΅ΧηlbτI|�WŸΔxDRŸD�Κek€ $TΡν£ομΰŒώž”-SΪlΆ΄€ :bPœρΙ§ςκλžΟ}άηqWΧχϊΡ‹/τ‘εΛWΘ'ŸΝt~°XΊT)εω1‘ΝΌΤβΉlΩ�R©bEsΊ`�}KΡ­Ν< € Y#«Ώh- € δ"F^—vΆ‚Bi�ά`>|ΨP«2βΉω–[€UΟ/ι�:mGω ,(+W3Η>|H>š2)μnήvš>γy퍷‚ΆΡζ9yς””­ΰω =θ±άΰςθ!‚,φ©μ@Pt•μ}£{ŒΝ5υ~—.ώ\�§O/Zυς±z £4>AΔφνΪHΧΝL“ ‹«C2Ο›σ™κϋΘΡ£R©Ju³―›–~α ²:tXͺTχ Ψ}œΰ"κ—&z†Φ5JFgΞ—¦Lovzl£&Νbb;Π5�EŸψ^Η }�goYΆ|Ήο.ΞςΥτqNjΝ4nΤPϊφιeViΐ«vέzξΝΞ|(―Mη xΜ„DΤ*Cής|A§Γk˜υjLΡ=άƒ4τZΉZMη ?ϋΪkW­Œo2‹ξη»υψ`ΗΉ‡c{ύΝ·eΪτφ)‘™γDtNhΝDχΐ·+θ6 ›|χέ�ά»™y ­[³�|! +άΦϋξΌjΕRΙd…@Ϟ=g…ρͺyίw_]ŽΟ5έUtXβξΟυ t g]|‚ˆξΠ™šiΕΆγǏ;ηΠΏŸΤ{Μσ<όjγ&iί±³³mΕ�ΕΞπ«={χ‘%VΕ{κχβ ςDƒϊφ’WΡ$Σ`iέz Ό�i€bξΌγΩ°q£½ΚορΧ^•šVΕ5΄2žz‚M Ω'Ύmhn Uϋ|OOΥH­§Uα‚Mρυ vŸZ‰fΨ;o›Λ«κ§C}m»Ψ�wω›Šˆ:„π ηΙ 7xBΪξŠ"ξkκλ»tιR²d©wθ3˜Ott›]Q―αΫ‡υLϊΏό’ΉΌ#�C˜ΫΣΤΙ“D«Ίκ4υ£iς֐wμM¦RαΒysΜμΊ²E«6^CfΫθΈƒέgtΟw6Π5ν†k%₯ΏN’={ΆW‰φˍiΣ¬μΧο₯ΎςD}Oπuήό…ς�Λύγά3‘†άADίj΅ϊχcޜ™fH< tW―UG44ν;}:cšίζ³ζΜ‘_ρέυͺ,Η'8ͺέΰΈ†\τψ„Ύf||#XΧkFRŸΔηyWŸΔxΠ'φ_Œΐ‰Ρ'ρΉfB�νŠΟλ$�Ο½ψψ$Ζk3’ϊ$𫀡‘.XAD}1zd”σ~ Π Ϋ?h� aΣζOy}vαώΡα#G€rΥA»’IγFςBοηΝvχgλV―”›nΚ ŸZΥΏϊΊίρύHX €DŒAĈι*Š €$M‚ˆαΥ―₯Λ•—bΕJΘρcΗδ»oΏ‘_ύYŽZ,gΚt«+QRςή�€SΚwxε6ν:ΚMΦ/Ϊu:{φŒhHο˜U­N' Ι=TΰJE i}(�ψέl ·ΆmώΚ„D΄]ΛW¬ Ίi%*ΎΪΈΩ+œVΌX17ζΚ¬:΄μμ9σ䏃XažlςΠƒω₯Ά5όlΦ,YΔ]ΛiΈnαη‹dσΦmrΔr~ΰώϋ₯fυκR€H!s½ί�έ ͺx†θ4+|ώωψΓΙ’?>³φϋ]»Lε­?�<.έ½{†Υ>$ΎΧtόš4kαυE„} χc|‚ˆzΊ;ožϋΜ)5DυΑˆ(9yβ”T©ZΙ !^JΆCΗ.^‘@w`ςάΉs2μύδ—Ÿ‘G)oͺ�ΉΫθ�§λ'ŽλΨkq’ΞΫΎs§9$WΜR±b3|σ―VεΎΊ{ͺ'š>�4|’ΌΤΧSυAΏΈY�εΡ*y—.]–ί|γ„ΊΊO|š)ξ/w΄ Ζμ9seΧ�δοσΛE+$εqκ±qυ±CŒ{ώYζ[C―ώΟ ΰž³�Q€P!©Wο1μΤσ±x‰τκΣWgN‘Ό6ž „•‘υΤZΕS«yκ€AmύRM�&œϊλ”άuΧ]’/ͺU©,i­`œϋKΈΈ>μγΜ­τΉ6qςΩψΥ&Ι“χ>Σ —λτφ‘ςαG›yύΗόΣe­»rεjΉ5Λ­ςΜΣ]%kΦ¬ΊZ�βDŒλσ@οsΡησMΕm“>&Nœ,?�ϊ‹dH—AςX'jXΓΪηΉο^kΨbﰞ†>Q_Άlέj=Ώ–ΚO»­‘©Σή(E‹‘&9C.ΏςΪςΙ§Ÿιιύ¦PC ξ ’žL‡‰�μ³Y’>C:yΆ[7ΙφΩΜ5V¬X)Οτπ|)λ{QwHΨή›Ώ»φΎ‘>Ζ'8ͺέΆΈ†\τψ„Ύf||#XΧkFRŸΔηyWŸΔxΠ'φ_Œΐ‰Ρ'ρΉfB�νŠΟλ$�Ο½ψψ$Ζk3’ϊ$𫀡‘.AD}υν·ίΙκ5kεΔ‰’#Η=ζ½€ώ@F'}Q―AC―σθzύA“ώ°I§S§ώ2?°Ϋ»χg)RΈ΄iΣJR§JeΆŸ0Qή>ΒΜϊΗύ™‰ΆcΕͺΥRͺdq)V΄¨Ω‘™©±@ˆl‚ˆ‘έ΄@ˆx‚ˆαΥ…D,^ΌdŒ:�Οy;r„\ΈpΑΩWÊΝ[Άv‚ŠΊA+>i…ΕdΙ’9ϋνΩ³[ζ͞ι,‡ΫŒ»J–oΫ|‡(Υν}zυ”¦Mϋξκ·(ˆθ·“ΟŠΎύ^–Vp+ΨT½ZUyλΧn^ΊlΉτxΎ·³Ν7΄δlπ™ tMwƒ-[ΆJλv|Žς_ŒoQ‡.φξ3$©�Ω=k4ΰΣνOE?{½ΟO¦$wήι©Ύi―τθDΤͺ{£’F˜Špφ·ΧύόΛ/Ρu?ί0’}¬φ§λ”Π}b·Αύ8σΣroξ\ξUΞ|Ίυ½†ίŽ«@sN`FC£-[·‹vλP_›.λUq "κΙ§NžhUy0Ζλ "Ζtοk3ΆΟ ξ=Vο ΏΣkˆZΏ 6iŸtκΪMΆmϋΪk—ψ½Nζ³μy FΌάΟ©8ιs˜³(ˆhΉξμδ3Σλ9ԐB°ΧΎϋ²§OŸΆžοm½ΒβξνΪ·+—/qξwΟή½ςxύ†ξ]�κ||‚#‘ϊΨ kΘEOθkΖΗ'1‚5q½f$υI|žqυIŒη}b�Εό˜}Ÿk&τί�ψΌNβϊά‹ObΌ6#©OΏ Xι D΄�Ϋ=Υ?Φη9―Ώώ¦Μœ=Ηo³έ‘E € €ΐu%@1ΌΊ;gξάR₯JuIk… άαA»•ϊkω}ϋ~•ΟηΟ 8|sφΫn—΅jKƌ7Ϋ‡8�^όWΆοΨ&kV�pΦ…λL›Φ­€Fυj’Νͺ –1γMN3ϋ$³ηΞs–νύΌwοžNe7{½>jΥΓuλ7Θ¨ΡcΌ†}ΨP)T° Χωνγφ8 £ΗŒ")¦I?ΠoΪ΄±u�’.]:§ίζ/X(/φσj4�Χ\8Žso­`�Ίυ_ΖΤ,ι�Ή£thΧV΄�^±’₯Νώv΅BύΒ£hqΟ­ZΆg»w3δΚ–―θ5ΌτύyσΚλ― –œ9rx]OΟ9iΚ‡2"j”Χz{AC<Γί&E‹ΆW™*‘kΧ―χTC+ZΔ<‹—*γl·gτΨΎ/τ–jU«8CΣΪΫ΄�€VqX`U±Τ rΡMzžϊτΆΪPH²gΟξτ‹οΠS Ω'Ϊ«CΧvν�ΙͺHQΨͺά™ΥTλΣύ‚ ŸϋξΝm ΗΥ[|0ŸŸ©^KƒnΓ†ΰTŠΤuΑ¦P_›ΑΞΣzχ_C†z=ΆSλ–OIλV-ΝPcΎΗόjύύ\½z­θ9έS\žΪφΠΜj¨ΟΟ"ΦsήώΫ­―Ώόκ+ιΩ³·ΧλΚ}ݞΟ=#­α�μŠ&φΆ~όIϊΌΠΧ―2Šnί΄a Θ­ί°A:u~Ϊ>ΔQ΄Έ>θ“€O9geb<"©Oβσڌλs61ϊ$�׌Ob<"©Oœ)3IJΐ"κgΏjξmχO»½>7ˆο »GQ°Ο₯ου~±~\χΪλoY£3l΅Wϋ=κϋ‘Cί–’…‹xύχ¬ΎΟΠ>κη#gΞυ;.Њ^={HEk”}o¬£A¬ϋςKyϋν‘~Η—)ύ°€΄ͺ-³ήΧ4oφ€9AΔ@’¬C@ΒW€ bψφ -C@� ‚ˆαΩΝظ瞜’ιΦLV˜&£5ΤςYωέW‡cώχ�Ώ16:ΓM¬‘Hο‘,VοΜ=vΏu쁏‹ττƒϊ|ωςIΦlYδğ'd�ώίΌ*ΚΊ?­2§Ζί|ΛΝrΚzψΧ}ϋc<&ΠyBYΚ5kΧͺ!―½2؜~Χ?JΓΖMCΉΤUΩWΓrωxΐ mκ;δttΠώ(VΌ˜ Emόj£ί—Ρ«Ϋ4ψ”'On±’]rπΰAΩ³{oΘηˆιφφHλ“ΈϊδΛχ€d±†*OŸ>>tΔ<Χ:l3$©G­"’7O^Ι` Ι{θΰaΩgύύŒι^CyΈƒˆv(PΧ•²ΒΙZ­vΛ–-±~ΎjH0·US‡?ίΎcG¬‹k‡Εχy ΗηΈηn9mώ�ε· •νφ©Λ½ΦΠΝY³f‘”VˆQ‡{ΏV―g;ˆ¨_ΚjεK40žΞzμΨ±3Ζη€ξ―ν]½r™ ξ^ΈpQΚUπiλ>L € €‘-`έwρω’Ε�§ο‹ξUρžΧχ%Ήsζ’[n½ΕΌΫdύ€'Τ© υΓΗ;ξΈ]ψM~²~΄Ϋb(ΧΡχύ«¬ͺΰΎAD_–@@π ˆήύCλ@@$/@1Ιw17αƍq* Ί‡—ŽπۊθζΣ'Α»―nΪ’:Mšΰ;ΩrΜͺB²bΕΚ [Γsu  bxΆτϊjU  b¨}ϋτ’ƍbδ5­~=Ψr € €@B DLHm�… € ΰ'@я„„•€V̚%³iStΓ6…U£“xcθ“ΐμζή#ψΪ#GJ%kXϊHšάχkWDŒ€φ'ΥΆΖ5ˆXΈp!)T° ”yψa)\Έ 3Δv›Ά’2/©:r_ € € € € y#―Οh1 € €"&©ξδf@DpσBmΔα#G€rΥ‘–¨ϋ»ο— b’v…ΧΕγD|ην7₯JεJήηš7_^ξ?Πk  € € € € €@Έ D מ‘] € €ΐu"@ρ:ιhnH|ω4qšω䉲gοΟ ΠΒ«w "�^ΉLtθ²εΦ°�=žο}υNΞ™β,0mκΉ�ώΌ’Γ}‡ResΠΐώςhνZrι�%σ\\³f­5 ]TœΫΑ € € € € €@B DLhq�‡ € ΰ%@Ρ‹ƒ@@@@@@@ β"F\—Ρ`@@ i DLZύΙέ € € € € € € €ΐυ'@ρϊλsξ@+‚ˆaΥ4@@@@@@Y€ bΘd€ € p5"^MMΞ… € € € € € €$ΌAΔ„7ηŠ € €.‚ˆ. f@@@@@@@ ˆF“@@€$@1)υ&χ‚ € € € € € €Χ£AΔλ±ΧΉg@@ Œ"†QgΠ@@@@@@@ γ€Ζ! € €WO€ βΥ³δL € € € € € € €@bDL u�‰ € ΰDt(˜A@@@@@@"R€ bDvF@’ŽAΔ€Σ—ά  € € € € € €\Ÿ―Ο~η�@@° ˆ6]AC@@@@@@@8 DŒ!€ €\-‚ˆWK’σ € € € €D‚ΐͺK%Σ-·x5uζμ92pΠ+^λ�—…t7ή(kW―”)SzέςϋDΙΈρΌΦ±€ € ΎΓ·oh € p]D �nΎΩϊ`όάΉ³rώοσ!7V=ρηŸ!Η‘% _€ΉαΣθγǏ‡uγτIŠ.d=§ΟKΓΖM―J[οΟ›WFŽxίο\§OŸ–Ϊuλω­Oˆ‘Τ' αξΧxσυW₯Dρb~Ν5fœLŸρ‰ίzV € € €@d lόr­€M›Φλ&>_΄Xϊτ}ΡkέΥZΈϋ�»εΆμ�gN·aγƐN[ΊT)Ήtι’μ?p@όφ[HΗΖvηL™2ΙͺεKόv;n‚ 州 € €α)@1<ϋ…V!€ €׍AΔπλκŠ•ͺΘ=9sJϊt$EΚNυCη3gΞΘ λƒα½»w;λ}gͺΧ¬-Ήο½ΟόŠ=Y²dζΓκΏ�>'ί}ϋ¬[³Ϊwχ°ZΦπV³'=α΄5kΧΙχ»v…Uϋ|ΣάjλV›Ϊ³GV¬Xι»9Α–—-Y$Y³d‘Λ—/ΛΓeΚΛ™³gμΪ‘^hΚΔρR°`sΨC…Іzxΐύ‹+&γƌτΫvαΒE)RΌ€ίϊ„X›>Ι—ο)σπΓ¦9S?ϊ8¬ϋ-�^›‘φρ€ρc₯°υF+Q#Gϋ�f@@"\ΐ";v\όWqυή>XΠ/[Ά¬�Άuky΄N-'ΐ¨οτ=CtΣγu•ξݟφͺΎ¨οUΏόjƒ<ένΩ ‡κ{°aοΎc~Θη�RxδθQyσ­·eΙ�ε~Ηκ1E‹•¬Y³Θž½{eΫΆ―ύφ‰nE©%$uš4ζš-Ÿjnv%ˆΫ@@π ˆ~}B‹@@λJ€ bψuwηnΟHšΤi’m؎νΫdΕ²₯~ϋ΄νΠY2dΘΰ·ή^ρ£μ[Έ`�½veJ?,Qx*ۍŸ0Qή>"μΪθnΠΞ―·˜ΕνΫwH‹Vmά›lΎQΓςβ }ΜυΆlέ&­ΫΆO°kΗεBΧ"ˆ¨_ΆΤ�]ΣiN§ŽΜ—<‰DŒmŸ<χLw±ΏάιΠ±‹„ZΓΉα˜‰΄Χf¨$fΝ‘γnsΨC>(ujΧ2σC•d@@"Cΐ"ώψΣniΠ°qΠFk%ΓφνZK΅jU%uͺT^ϋΕ�kψDιΫ§—$Ožάλ8{aηΞo€C§.~?JΣχΈ“¬ρεΉο^{W―Η‹/ΚΛΚ‚…‹œυ5kT3Ÿ Έ?�0bΟη{[‘ğύb3S�Lω`ψ0³kLχ›σ± € €@Β DL8k�„ € @€ b”D^₯AΔΙSΘ1λWξ‡’“'OJφ�Λ.ΩοΈ]nL{£iVΎ›ωιtΩΏoŸΣΪG*V–‚…‹˜ε‹�ώ+[6}eΆηΜ•K .κ|π½δ‹ΟMuDηΐ0š‰΄°S8̝%wέu—ιΕΞ]»ΙΊυ_†Qϊ7εZ}―2ύγ©ςΐύy%±‚ˆ±ν‚ˆΎ=Λ*”—χ­Κ#:D >‘ € €\mΨΏX8On»νΆ€—.€§aΒΥ+—IκΤ©Ν±7m–εΦH oΊΙ 6Ά•T©Ršυ#G‘‘£ΖxΏWΟΦhMΜΊsηΞΙkxd!£fυjΞ§OŸ–‡ΛV0ϋδΚ™CfLϋΘΉ–ϋd?�ς‹Τ}Ό{UŒσc$b@@ l"†mΧΠ0@@ΰϊ ˆ~ύœΦϊ°ϊ\‘uλΦk 9sζ2ώι§dΑά9Ξ tνώœυAΆηΧωΣ¦N‘ƒ�pΆέuΧ=RΏa#³¬Η)“Ζ;ΫΒi† bh½QέͺΘπΦ―™ƒvύπ£4lμΦ:΄³$μήI=ˆJŸDLΨη^l―F1ΆRμ‡ € €@δ „DόηΒω|Ρ’? Υα–uŠ.ˆΨόΙ¦ς|ΟηΜ~Z™πρϊ ΝΌώ3읷₯bΕGΜςώ€VΗœm:³|ι’%sf³nΐΐΑ2kŽgd‹L™2ΙͺεKœ}ϋ$³ηΞ“g¬‘Ÿ[·|J.]Ί$½^θ+λΧ}):Ά—Ν›™};u~ZΦoΨΰΣ AĘ„ΨŽ €„―AΔπνZ† €\#«›³fΝ&OΆhiύηŸΗe�ψ±Ξ <Ϋ³·™?s洌ι?€q»Ž%}ϊ ζCσ(kˆώωΗ961g4Œ•?ί¦ Y³fqͺϋ�σOΩ»g―WΣτCώ@ΓΧκ‡ρϊΑϋύyσJŽ{ξ–”)SΚλΓόοώχ½Όωφ;rόψq―σΨ :ΔRηNν₯P’9KfsάΩ³ηδU‰rσζ-2vό9tθ°½»ώ·^έΊf9Y²δR€H!3―•χvμΨαμ§3kΧ―—‰“¦x­Σ…P―ιw׊Σ¦š{ΦU}_κη5,“U¬mύΧϊ"βτιΏδαR₯LUΜ-ΫΆΙo ‘ώ/Ώ(=τ \²ͺgnάΌYžξφ¬λΜWfŸορ¬uŸEŒ«ή§žλ§={¬/\ΖΛΝί^ΩΡgNΏ©RΉ’ά{on‘dΙdΧχ?ΘΒE‹€†ž,X°€Ωϋ‘BE}Žς,κ—:Υ­a₯rεΜ)Y³d‘ΏώϊKφXΟ…ΉσΘΜY³γ^jEΔ„κmγˆαοIΪn0ΝΝ•;—άrσΝf~ŸUέτπα#f^�Ρ~{ζΩ~CtιΆΈϊhΠW‡‚Ξe…™3eΊEO%§Nύ%~ϋΝͺ€Ή^FD2λμ�ΖkΣ>Wl΅/ϊφνevŸ9s–,YΊάλPBΉM›–fV ΡaΡ}'ϊ,·U φδ©“ςl^ζ ΉR₯JJΑ™°φaλ5­ΟΕ`CΏ'Dρ‰υΝkα²\–Q£ΖJ“& ₯€υwHΏl<ψΗAωζ»οδ­!οxύύΡϋώώ»’ΞͺŒ{ζάΩ ―Y­†bΧΎcηΞ χιλΖ2 € €Χ“@lƒˆQΌ/Ώ�ώ»σω@Ηφν¬Ο:ͺθ‚ˆΣ>ϊPς=pΏΩο΅7ή’ι3>1σwά~»α"mΪ΄w›ΆdσΦ­fΉ|Ήr2ό½‘fώπαΓRΉZMgΏώ/Ώ$υΏZά²e«΄nΧAϊ½ψ‚θ{ ίύνQή~η]ωpκGΞybš!ˆ“Ϋ@@π ˆΎ}CΛ@@λB€ bdusžΌχKΝڞ_ή>tP>ϊp²ΉμΩ³Kγ'[˜yχzχέρ©₯-nIDAT5jΪάNhώœΩ²{χξΝ‰6�Ρ”IςΰƒωcuύΧί|[¦MŸα΅―††φοηΊΌ6Z h|�g/ΩΆνk―MχYΉ'Oχ‡�^;X ο%γ¬0’=υxΆ»<Υ’Ή½νγ�eΛ₯Ησžp¨½c\�iλϋXΪ ŽŒnVͺ  Βζ͞τ=,θς‡},oρ|Ω‘;eΛ–U’>.χZaΉ@“Vƒb}™a™βήgΘ›―KΥͺUά«ΞϋuθͺΑƒϊKεJ•ξ―+}±XzΏπbΠνΊ!” bBφ‰ΆΝώ"HηcšκΤ­/ΏξϋΥΩ->>@Τ`atS³§Zz…KγϋڌξZΑΆΉΏπ�מΎέ“O¦Γ”ι4p𫃩3?až·�ύ·θλ°NνZξS8σ*U RNˆ ’οˆN£\3G¬κ΅]Ÿ~FΎί΅ΛY;ξLfΦΊmΝΊuΞ6{¦O―ž�΄Ic³ψ™άd91!€ € €€·@lƒˆήG‰Δ6ˆhŸ_―R½¦σ##}―οηέ“ώiκGΣΜͺΦ°Ν]:w4σ .2?:ΤύAŸώ5yςδf›ώsμΨqy€rUιχR_y’~=뇃W†kΦq3�μλϋΓE]©ο½½Ÿ°·}`ύ€U§θΒ–fώA@+‚ˆaΥ4@Έώ"FNŸηΞ}ŸT­QC�€ρTS[·vlήθZ'Τ βΊ5«eσ¦―Ββζ>Ρΐ »έsΟ=R’x1Σ.ΊHέοžf͞λΚΡ°άΌΩ30‘V/\Ήj•ލ\Ή²’•tϊνχί€F­ΊξSΙ„±£₯hΡ"fV Ψj΅ͺ�έzλ­R²DqΉσŽ;L…ΈΡcΗ9Η•*QΒ>©‚YΦ�΅β€NZ±O‡hrOZΝ`Ι’eξUqΊ¦Χ \ ϊ…‚~± S €¦;ˆ¨Uο~ωεψLfU'ΤιŒ5όχO?ώdUa{Θ*X˜Μͺ8ΈGoΰΎ[·yλ ©Z₯²ΞŠVB\Ά|Ή€°ξωήϋξ•V?ι€aΔZuκ:_¨θ:­ΔψΪΰA:k&ώi�ΎύRΈpaΡП{ς "ΎΤ·θσA'ξjυΪ΅²wοΟ¦/*YΓVΩ_ΈΌϊϊ2γ“Οά§ςš%ˆ—ηΧΕ\ 1υ‰ξͺaΐ΄i=―αβΦsέΆΤJŸϋ~έηœM‡Τ�~uOρρq ΆΫκλν;vZ_Z“Ϋ³ί&eΛ–‘Œoί b|^›ξv‡25ƒˆξλj­δ™&uyθΑεΖΣJ8ϝ;g½ΖV˜ΧΤ#VΈ:Σ-žŠ•;w~cυK+ηVΪΆi-έΊv6Λϊš|ξΏJΈΞ֌{·FMšyύΝtοΗ< € €Χ³€ύιǟvKƒ†žςΔΖ#ΆADϋGh'Ož’²*šSΧ�UC^{e°ίeά?Β� οy†q:μ=™4ωC³�¬Οf˜ΚοϊώC'„₯->|θU q’Wγν‘™uθά±£Ό«ˆιŽm­‘™3XC3λ΄cϋ6Y±l©™§tθXφH§ρ&Ζ8€¨»ςή–­Ϋ¬‘JŸρΚφΣΣ$œΣΙχφu«WΚM7y<τKύςΑ=iU΄οΏ�ή+dηή�σφ :™.)R€­‘›»?ΣΓ«RΒΤΙ“¬a=U,gϝ'ύ\ κqvΰpΚ‡SeΘPO½¨ϋϊΊμ"κ5΅ΏtXm½f^}L›u?­SK^4ΠΜ�yβ„”Δ’4+|ώ %ˆ˜}βΣLJΤJ…:uθΨ%ΰ°γφ1ρρ)f ­=~άhs*­Z‘’΅ΚšΦPΨϊ|6…ϊΪ vž˜Φ»ΏπrgJED=F­£ΖŒΖٞt(w­βΫΫτ1‘+"κ—‡;?-›¬!�u�α©υο»ύχ©e›vNEW­ŠΉzΥrI*•όσΟ?ζu ‘b{r·}Χ?JΓΖMνM<"€ € €€KΰZυΏι΅šΉN~ϋΝΩ’�θΛϟ;[2gΎUNœ<)Ÿ~:SΪ΅mmφ™5g� θ (Ί?ηΠuΊΝ]%Qί'Υ«χΈσγ%ϋVoΌφͺθϋ:χ€ο5τ=ω‰J=kHη’Φ{Cϋ~Ίmς”~ξβ~_FΡ-Κ< € ώΓΏh! € €"†oχ–,UZJ•.γΧΐ_¬_ΆΟžυ©ίϊ§ŸyΞ q₯2λuHΥΓ‡9ϋάuΧ=RΏα•jw{vο–ys<Š;;…ΑL¨a§―·l4aΉσηΟK΅šuό†Y}Όξ£2pΐΛζΞΦ�[/]žΎ24νΆΝ_™Π›nΤ/τˁP§PƒˆWγšΪΖwίyK*UτTTΠ€ΥΘΡWBVφ=Έƒˆφύ©…šθdϋλ�Ά`›?ΩTžοωœΩO+υiHΞ=Ή‡…vW›Τ€ΧͺεKΜ�Zα­ΔΓeέ‡‰V”=j„³ΞΎž�ΠJv(O«jΥCίiαΌΩrηwšΥΡUz %ˆ˜}β{?ξ{Ž)ˆθή7Tχ\‡’*5jω6%ΖεP_›1ž0Θξ/Ό�FQ«j>ένΩ W ΌΪζΣcΤHOˆ3πήq[λšΩχo“žΡ]ύrβ€)ςξ{ž€Άn{oθyδ‘ :k†SΧaΥνΙύ·A‡Zwo³χα@@D�e±pαBfeuΆ 4 ?©χ˜g€ κπ`Ίb՚5�­»η=ψψ±£€XΡ’f½ώ¨πGλF3?nF‚ψΩι ξγ ΔύήΨύΓJ "–~ψaΙdU;Ότο%kDΤ’+g.SύМΠϊηΰeξ‚2mϊ'~Ÿ‘ΨϋΈί—D΄UxD@"C€ bdτ­D@’¬AΔπνΪ\Ήο΅ͺ]U΄*"&—Τ7€1CŠΪ­=vτ¨L2Ρ Al―«dUΕ{¨€§Ϊώ²}Λ¦rΰΐ>Ιa}θ\¨pQηWοΊ°0£}�Δz %μ€βfΟΌΘόγχ?œfΫΓ§°†+Κ’9³YΏΟvΉvέzΞ> ζΞ’»ξΊΛ,±<Ώψb±U‘l«5τ―ͺŠΞfB "^kje…9³>1ΜΣ§OK•j5ΆΧD,UΊœΩΗ:΄«&<Σύiiές)swφΊ^={ˆVžΣι΅7ή’ι3>1σξΎ\»J�§OοUIQ«$j΅Duύϊ5+%ƒUαS'wΡ��mvΪ}©λώ/ϋ�郙ϊ½<@ζΞ_`/z=†DLΘ>ρj€΅ΰΖDŒ; ͺmΠκŸΛ–-—MΦs}›5$yl¦P^›±9_°}ά_x] bΫφœJƒΑ�ι»>‘ƒˆ^cnοEΦί¦ή/Όθ4Σmτύ�]’‘\΄ΒΚͺK­/ӈΏφH₯ͺ�68'b@@λX ‘‚ˆ?όψ“Όώζ[2aμhσΉΜΖM›₯]‡NR·Nνƒˆ={υ–ϊV5wύQί₯K—€u»ζ=œϋ}¬;ˆ¨έ©aΔ@ΥΧoΨ +W¬2cκvχ{‚ˆ1i±@/‚ˆαΥ΄@Έξ"FN—g͚MoΠPn΄Β&:ύψΓ.Y8�Χ tθάΥڞΞk½pζτI—ή³mϋΧ_ΛΚ�*ΧΩΫΓαΡΎ‰ihζͺU+ː7ύ«ζ»ί!iλ[ΓiU2ίI‡r]³nDE ωD7…DΌΧ4°Ώ<φhΣ,­v¦UΟMξ ’ψλρlwyͺ…g(`;œΨ©c{ιΤ‘½9…DtWUλφlY΅j΅ί%t˜) Eκd§_xθpP:ι0Ώ:ό³οδ>Ξn—ξ3σΣroξ\Ύ»]Ž�Ϊ[(AΔ„μί› %ˆ_ŸΧ’Ϊ΅kϊ6ΑΦζΞ›oUΥ΄†ΚkΣο"!¬pαu5‚ˆφs3„&$ψΠ́^cχηΝ+3¦M5ΝΦ°¨Ομž/œ/ΩoΛnVΩ_<6m�XϊτκiΦ}±x‰τκΣΧ}σ € € ΰΈ–AΔ;nΏ]>_ΰωΌζπαΓςΧ_I�\ΉDG¨�Dc3"ƒ{$‚`C3λό4„¨Σ¬9s¬α›_1σ:ώΰL'}ΟscΪ΄�ΈΡR«fM―κ‡:‚Α +|˜3WN)X €ωρ’ΆA«²χ0(θ—άοΛ"fώA@"F€ bΔt E@’¦AΔΘκΧτι3H›φΝ―θ΅καπaοψέΐ£Υ—»οΉΫ¦ωβΕ Φ0͇姐ς<Γω�\ΎTΆ½ΝοΨΔ^JΨιΡ:΅δ•AM“υΓυ§ωWνsίΟΙ“'dήό…ξU&pΤϊ©’?>g˜f{ $Ύχώ2a�d{•ίc¨AD=V[‹λ5υ‹†%‹HκΤ©εŸώ‘ͺ5j  ">Ϋ½›΄jΩΒάGtAΔαοΏ+εΛz†Uξϊτ3&˜ι{σ³?›aΎHΡυφΠΟξ>Ρπ’¬|'χqξ ’»’Γ”§Κ‘ΓG|υZ^ΉrUΠα΄C "κIͺOΌnΐZ%ˆx5|ͺV©$νΪΆ•<χέλΫHlί©‹lίΎΓo›�ε΅π±\ιώΒ+PΡύeέΐΑ―ΚΜY³ύΞl‡6/\Έ(EŠ—τΫӊ„�ˆθ5ζ"~ϋνw�΄Ή§j©έφ.;J‡vmΝ’V,ΥͺŠΣ¦N‘|ω0λbͺ°iŸ‡G@@�WkDTSϋσ·―~Ζ0~β$³Κύ£@χ{χHφ±ϊ™ŽΙ|ζμY³jΛ¦ ’:U*ΡΟ… +)/ΎΠ[5|ΒlΣχAλ¬W~:s–¬[�₯L7VŠ)dŸΚyΤJO4ςŒ„ΰ¬όoΖύΎŒ ’―Λ € €@x D οώ‘u € €@’ ˆy]ά‘“Uυ0§²α»Cή z)’§°* ¦—S§Nš}j?ϊ˜ά{_3―A­?¬π^ΈM‘„άΓoέϊ΅΄jλ]1,”{Σ!MK”,!΅jT—re˘‘Mυx­ZPΊά#AOe± α­­Ϊέ/Π†Έ\Σ.œcU±{ΉΏ'ˆθόξ}νΐ_lƒˆ/χ{QΤ{ܜV«$̞;Οο+—-1•tx¨‚EŠ›νŊ‘ργF›ωU«ΧH·gž zœn°Ϋ₯σ£Gp*=Δe8]=‡=ΩADϋK{}LΧΊO|―JρjϊdΛ–Υ ––:΅jJΑ‚œaΫ΅*F—§»ϋ6Σ,‡ςΪ x‚X�,\ΈL?Φμ=iς‡2tΨ{^GvλΪYΪΆimΦΕDΤቋ—*γu|lάADχ‚Ρ«Žwάq»³Λi«m J’φZU«qκh˜ρ˜^KΪ‡‹Μ3κγǏKϋŽε³O¦›σν?p@jΥρœΫ¬ΈŠ�T¬ψˆUu7­sFς~ηΞoε`3Z¦`‘^›,ψάk9ΨBb\Σ·zθφ―w >»Ϋκσΐ}l\―™>‰qΝΈϊ$FŸΔηšξησ € pm�uΡ>Ώ}:βB£&ΝμEyΨP©PΎœY~γ­!֏+=�=―?8�Ή'’yΙ�εfΥ}χζvώΫ�θΡcR±J5σΎξΕϊΘςε+δ“Οf:?X,]ͺ”ŒŒnŽΣ‘™—.Y&eΛ––J=?R0ppΐ‘š "Ίυ™G@"K€ bdυ­E@’œAΔΘλ�ΞVP(MšLΓ‡[\kΕΓΨLO[‘°”)S‰Η΄’’>†Ϋδ;ΩUΎ‚΅QCcΦ―1›Ož<%e�«φl�Ψ�Ο•3‡Μžω©³{tC»ΪAΔθ* 8'Šf&6ΧΤϋ]ΊψsIo…K�ύχ_y¬^Cωuί―AΟŸ bϋvm€kηNζάBΤ0’{�!™ηΝωL’%K&GŽ•JUͺ›ΝŽZϊ…'\tθΠa©Rέ{(`χqz€;ˆ¨_š4jΨΐœgDΤ(=vœ™Λ?S&Ž7_Δθ±ϊEOLClΊΖ΅θίλΈƒ‘Ουμ-Λ–{ΎXςέO—―¦ϋό5­Έ‘“†ΚjΧ­ηήμΜ‡ςΪtŠΓŒ;ˆ8ΑBy±_―³Έ‡ ΏVADϊLƒŸ:EΞt7lς„qR¨PAgUL!XwΡ=Ě} [jθR§` υ EύbQ§={φ8JGŽ##G1λ―φ?Ϋ·nr‚«zξΨ†ΐέR»M± 'τ5έύo·uΜΨρςAΤH{1θc¨ΟϋDρΉfBϋh›ϊšρρIŒ>‰λ5νη € 0vPπǟvKƒ†c}юνΫIηNΜώΡU tW,ΧχO6oιυήtέκ•rΣMΜyZΆi'ΫΆ}mζΛ—+'Γίκ΄GGθώ\OgΉMλV�ύι.fyσ–-�¦whΡΩњΡχΨϊ^R'{T_³jΉάœ1£|fU˜dUšχ"ϊаŒ €DŽAΔΘι+ZŠ €$I‚ˆαΥ­:δnςδΙΝ0©Zv_žΌV₯«Ίf“~hhζ@ΗU΅aως?h6ύ²w―̞u%hh�ΔZηνάω4{ͺU΄MΡ `Z @'ΞwΘΠaχΧ g›7mv†1�tΣοΎϋŸίώψ[·f₯€H‘ΒlsXο»σͺK%Σ-·ΘΩ³η¬0^5―σϋξ«ΛρΉf§νE‡n�Ιχ‹³�ηŸψέ‘3ϊI««iΥ5{ΠΏŸΤ{Μσ<όjγ&SΝήΆbιbɜωV³Ψ³wYbU\°§~/Ύ O4¨o/zuΨΰ!oy*|j°΄n½^Χ΄�Κjwήq‡lΨΈΡ^εχψΖk―JΝΥΜz iˆ(Ψ”}βΫχ0Γ:ψ°χ<•*|χΣεψϊ»O­l6읷Ν%χοί/΅υTΒτmC¨―Mίγc»μf=xHͺΤ¨εͺ}?wφLI•*₯Yw­‚ˆξ6Δ6δjπΘD&·ίζ©Ζ¨ΊΊ9θΏš4n$/τ~ή,Ή?Ϋ°CŸZΥΏϊΊϋ3Oя„ € €@ΔDŒ˜�’‘ € €@� ˆ^ύZΊ\y)V¬„?vLΎϋφωυןεθ‘#’)Σ­R¬DIΙ{�N5ͺίμ—O¦μu­­_Βλϊ―·n‘£GH�άΉ₯pΡβrΫR_Ύ|Yƍ)§O�εu\8-lΫό•nTΫ΄|Ε Ρ ›‘¬ΣW7{lŠ+&γΖ\ hυ²ΩsζΙ�lΩ²ΙCζ—ΪΦπ³ϊ~ί—ϊΙ‚…‹ΜyμjŠ�[ψω"ΩΌu›±œΈ�~©Y½Ί)RΘμχϋοΏKυZšω@�|όαdɟ?ŸΩ€UχτόώyάT›ά½{he{Šο5έΏ&ΝZ QΪΧ�Ηψυx}nεΝsŸΞš!I?%'Oœ’*U+Y!Δ+ΓΎvθΨΕ+θLκ—-Γή�@~ωωyδ‘ς’Υχά“»"’�Ÿ8n¬c―°‰V8oϋΝζ\9sJŊΜπΝΏZ•ϋκ>h6ϊόΣπ‰ςR_OΥ}Ξ―�rƒlΪΌΩκ—Λ²σ›oD‡�Φ)‘ϋΔ§™βώrηόωσΦsw�μΪυƒό}ώoΉhU½t‡8υΨΈϊ؁΅½?�,σ­αp�gpΟYΧ(R¨Τ«χ˜ vκωΏXΌDzυι«³§P^›OΛ•kW­Œo2{―Z³Ζϊ’m– ·jΥ‘¬Y³:gΉVAD½ΐ’ΟΘ�e�?s-ξlξόωΦkϋ„ ϊΩC¦9 ±fβDΤσhίD%ηΟ_§Z4“’E ›Σ>|Ψ ΝB€–/ύB²dΞμlΡαΦ:u~ΪYΎΪ3„ή’ υy`Ÿ->αGϊΔV ό˜}ΧkΎΦ"€ €ΐ΅ˆmQί7φθρ¬σYL‡}ͺΣΟΏό"_�χώRG.όΚkNsυ8ύρbš4iΜ:ύ±ες•+%mΪ΄�¦U+ηV*š»ίΟ�sα‚Lš4ENYŸ‹T­\I²�―ΣιΣ§εα²Μ|°ܟ™|ϋνw²bΥj)U²Έ+ZΤμGOξχͺΡU} v]Φ#€ €$žAΔΔ³ηΚ € €–AΔπzh±xρ’16κό?ηeμΘrΑϊ@Ϊ=uξyηΓqχz7¬ukeσΖ Ύ›ΒjΉίK}ε‰ϊ‡‡}ύΝ·eΪτ^ννΣ«§4m�Ψk] …@AΔ@ϋΉΧυνχ²,°‚[Α¦κΥͺΚ[o\ω’Α½ί�eΛ₯Ησ½UvθΝYd&Π5έU ΆlΩ*­Ϋurτ•Υξ/.μΐŸ{(`»‚VYΤπ Nξa¨uΘΧaοqΎ4Ήrζ+s«V―‘n֐ίξIοσ“ιɝwήι^pήn—½Q«ξŠa…H―„ΝμmξGύ²'Ί ’ξ;gΦ§’3Gχaf^ϋSuJθ>1υωgζ§3δήάΉ|ΦzλΤ­ο5όv\}μ bΐ‹ό·RC£-[·σ*Μw�P_›ΎΗΗvΉΗ³έ­0^σwΏ–AΔΊujΛ ύΝπγΎ Ρ!ΗuθqχjπΘ]Ρ}χό₯K—Μ™3gΟq―φšχ΅κΣχEω|Ρb―}�ζ‘·θ5C}Ψg#ˆΈΩ¦ψŸΔθ“Έ^3ΰΝ³@�™@lƒˆZ©\+–ΗfͺY»�ω!Ÿ½oύz›ΙΩ#.ΨλνGύ‘\‹VmμEηQί«N?FξΟ›ΧY瞹pα’τλί?V�ν?2jΈθϋ{ίILΩ¨I3ίΥf™ b@V"€ €!@1"Ί‰F"€ €IW€ bxυmN«‚a•*Υ%­υ‘s²dΙό§aΒ}ϋ~•ΟηΟ 8|sϋN]$]Ίτ~ΗipqαΌyςλ/{ύΆ…γŠ6­[IκΥ$›UύΜ�Œ¦νμ?`Μž;Ο―Ιϊ!yοή=Κnξ΄καΊυdΤθ1^_Ό?l¨*XΠλόφqϋΡcΖΚΌω νUAυύ¦M[η*`Ω§sϊmώ‚…ςbΏώ^ΗΕυš ηΟqξ­sΧnΦύ|ιuή@ ]:w”νΪZΦΞK±’₯Ν.v΅B­¨P΄Έη‹ˆV-[ˆuHΧ²ε+z «_zΌώΪ`Ώ@Ÿžs�”eDΤ¨@—6ΏαοsͺΊιNͺZ»~½€K{£-ZΔ<‹—*γwΌ~α�χ…ήR­jΡ‘Κέ“žC«8,°ͺXNŸρ‰{“ίΌžη…>½­6’μΩ³;ύβ;τTBφ‰_#­™2e’�]:Y) [•;³šκΊŸVΣ¨^«Ž_ΰ-.>:|ω ½{Λƒζσ3ΥkmΫφ΅ ώS)RΧ›B}m;OLλίyϋM©bUϋ°'υΨΎ}§UΑc•©φ©λƒ…ξ>š2ΙΊΧόrβδI)WαΚ9μsΕφQ‡­ngύ-ΚaZoΌ1­9,ΨΠΗΎ_ξ>sF.S>θ₯άADVΎžυezλο‡=i؁―ΌκWΣήn?ΊΏ ŒούΪηŒξρ«υk έO�ιί€˜¦φνΪHΧΝΌv‹MeW= ‘―ωΠCωeκδI^m}oψ?a’ΧΊ@ ‘>μsΔηš ν£mNθkΖΗ'1ϊ$�Χ΄Ÿ<"€ €@ΒΨADύΜ`ΐΰWΝEw[£ψν7―θεΎX8_‚… 흃½Wx΄N-ιήνi―JζϊžόKλΏ₯»=λΊΩ>‡ϋQίϋ ϊΆ-\Δ©ž¨Ϋ΅jϊk֏4W¬Xιή=Ϊy"Ί’5JΎ7ΦΡ Φ}ω₯ΌύφP―χ�z‚2₯–”©RI1«B{σfOšsR1ZZ6"€ €a'@1μΊ„!€ €Χ—AΔπμοδΙ“Λ=χδ”L·f’›nΚ(gϞ•ί­ΓuΨε/ύm£uη9sY»ŒΦΤ‡δ‡]ίϋUNŒφΌQ?¨Ο—/ŸdΝ–ENXΓ¨ξί�›WEΉ@·¦UζτΓψ›oΉYNYC�ΊoŒΗ:O(λBΉfνZ5δ΅W›ΣοϊαGiΨΈi(—Ί*ϋjX.�Hϊ ιΔwΘιθ. ύQ¬x1S₯sγWύΎδˆξXέ¦•'ςδΙ-VŠP<({vο ω1]Γήi}WŸ|ω,ΦPειΣ§“Γ‡Ž˜ηΊou?Ϋ$±υ ?}=kuσ¦ΝΧ¬ογ>έAD;§}“#Η=ς£υ:wλ]ϋϊφιε y>γ“ΟδΥΧ߈nwΆ!€ € €ΐvΡ ’ΥΕυOΧbΊγφΫ­a•σΛ‘ΓGeσΦ­!]B+DgΌ9£5 τvΏ«…t’hvΦχύ«–/ρΫƒ ’ +@@° ˆΦέCγ@@€/@1ιχ1wΩƍq* Ί‡—Žμ»ŠμΦΣ'ΑϋO‡4N&Mπ‚l9fU! ₯’GΣDΜκ@AΔP―AΝ9³>3HυΨ Η:ΐκ΅Ψ@@€&°rΩΉΕϊA’{š5g� ϊ―:’{ύυ0―?$\½r™€L™�λv‡«κΰ^±€ € hž #€ €¨ADž„·€V̚%³id¨UΒϋΞ"·uτIΰΎΣ/�6¬_xc k=*•¬aι―—)>AΔfO61ΥB«T�h†φV³-[·IλΆν―>ξ@@@@@ €AΔ(¬B@H8‚ˆ gΝ•@€,Ÿ βα#G€rΥI™ΗλήβDΤμόΉ3½Ξuςδ)iΣ�=Υ½TX@@@@@�?‚ˆΧ_ŸsΗ € €@X D «ξ 1 €@D δΛχ€€‰ΓΠΜ'Oœ={Žθ{₯ρΟχ|Nžl�X._Ύl†TŽν½λpΜ‹Μ“δΙ“ΛΙS§dη7ίHTΤhω~Χ�P.ΟΎ € € € € €IP€ bμTn @ˆ$‚ˆ‘Τ[΄@@@@@@π ˆθoΒ@@ ˆ˜€Ψ\ @@@@@@Έ―*§D@ˆ½AΔΨ[±' € € € € € € ŽΓ±Wh € p DΌŽ:›[E@@@@@@$)@1Iv+7… €DŽAΔΘι+ZŠ € € € € € € ˆH…u € € &@1Α¨Ή € € € € € € pM"^VNŠ € [‚ˆ±•b?@@@@@@@ <"†gΏΠ*@@ΰΊ ˆxέt57Š € € € € € €IT€ bνXn @ˆ‚ˆ‘�S΄@@@@@@,@1° k@@H€ bAs@@@@@@@ΰ DΌF°œ@@ vcηΔ^ € € € € € € €@Έ D מ‘] € €ΐu"@ρ:ιhn@@@@@@’¬AΔ$Ϋ΅ά € #£Ÿh% € € € € € € L€ b0Φ#€ €$ˆAΔaŽχER¦L%mΪw}ΤiΫΦΝ²aύΊ€η͘1£Τ©[OnΎωfI•:΅\ΊtIΜ9#ί}»3θ1OΔJ@@@@@@ˆ‚ˆΡM4@HΊ#£o4j*wήy§ΣΨ�}χ­,^΄ΠYΆg2eΊUžlρ”X΄Χۏ;wl—εKΫ‹<"€ € € € € € €@ ˆ˜:‘[@@"Y€ bψχ^ΜΉ₯n½ϊ^ DμΤ΅»άpΓ fί“'OΘίoUFΌEξΝ“G’%KfΦρωωώίy@@@@@@ˆ\‚ˆ‘Ϋw΄@HΓΏ;[αΒ4VΈπŸώ‘ΤΦPΛ: "ή}O©Χ ‘Ω~φμυ™Χ*W­&>TΠ,;zT¦Lοlc@@@@@@"[€ bdχ­G@"^€ bxwaZu$ούΘ₯K—dϋΧΫ€p‘’¦Α‚ˆš6—Ϋn»Νl_΅r™|½u«ss»t“΄iӚεΛ—/KΤπa&Ψθμΐ  € € € € € €D¬AĈν:Ž €$ ‚ˆαۏ™³d‘f-Z™!•·nέ,/\”%K™ "vξφŒ€IF4h8όέwδίK�š}+U©&πTC΄οvΕ²Ε²cϋv{‘G@@@@@@ˆ`‚ˆάy4@H Γ·Ϋvθ,2dsηΞΙ¨οΛΓeΚEDμφlOI‘"…œ�ηΌD½?ΜάXƌ₯e›φ’^_rεΚm–Χ�^)[6orΆ1ƒ € € € € € €‘+@1rϋŽ–#€ €IB€ bxuc‹–­%γΝ·l”V9΄+jΥCύίΙΚ”IΜώ­Ϊv›oΎΩΜλΆ©S&Κ1«b’=ΉCŽS&χΪfοΓ# € € € € € €DžAΔΘλ3ZŒ €$)‚ˆ‘ӝ—)'%J–2 ώίwίΚβE ½_΄X )[Ύ‚Yη[ 1{φμ�¨isI–,™Έ«(z€@@@@@@ˆH‚ˆΩm4@H:#§/c "κt{Ά§€H‘ΒάΤ·ίμ”K—HΦlY₯ލ%uκΤfύΦ­›eΝΚfž@@@@@@@ ς"F~r € €@D DŒœξ‹MQ«"–)WήT> tg'Ož”Iγǘamg € € € € € €DžAΔΘλ3ZŒ €$)‚ˆ‘ӝ₯J—‘’₯J›k΅Γ₯‹l|‘ΒE₯lΉ ’"₯§2’ξtωςe9vμ¨|8iBΐcX‰ € € € € € €‘+π���ψŽ»@IDATμέœΤD�Ηρ½ƒ…" Ψ₯K‘ή‹t₯WAš€θƒDΕ.Hο]" " ½ƒ”£(bι ½ �̜‰Ω½έ»-w[ξ>y^ή&“I2yOvoŸΧ}™Itλφ{Β‚ € €@ς,€+sΩΈȜ9‹δΝ—Oώ:wNμί/�άύ'�/Ιω@@@@@@@ ‰"AK"€ €X- V@@@@@@@° ˆ–έF£@@ψ#@1ώτ%w‚ € € € € € € S€ bΒμwξ@‚ˆ!Σ4@@@@@@πI€ ’Ol„ € [cK’σ € € € € € € €Α ˆw�Š € π―AD@@@@@@@ Ό"†w�Ρz@@ μ"†}r € € € € € € ΐ"&π€ΫG@‚-@1Ψ=ΐυ@@@@@@@�"ϊηΗΡ € €~ DτΓ@@@@@@@ D rpy@@ ‘ DLθOχ € € € € € €α.@1ά{φ#€ €a.@1Μ;ζ#€ € € € € € €@‚ ˆ˜ΰ@@ΰ D �?WG@@@@@@ό ˆθ― Η#€ €ψ%@Ρ/>F@@@@@@‚.@1θ]@@@„-@1aχ?w € € € € € €α/@1όϋ;@@ΒZ€ bXwG@@@@@@„ " € €@P"•Ÿ‹#€ € € € € € €~ Dτ› € €ψ#@Ρ=ŽE@@@@@@‚/@1ψ}@ @@-@1Aw?7 €„¬ΐ<ΰQΫnήΈ!W―]sY7MκΤ’"eJkίωση­uW+ž\ΣΥυμΧ‰ιφλšΧ‹ξWuμΧ³Ÿ/Ίσ˜υάkξ·ΏΊ;Ÿ:ΗγO<.yrε’”©RΙΉsgεΟ?ΛΟΨg@@@@ €ˆΝ₯@@’ DŒjŠ%I“&“v;‰zUΛ�²eσ&·MMž<ΉT©VCrδ|D�»vύšL›<Αm}v € €‘$ ‚n›7�“Δ‰ΗΨ¬ί”šΊ¬7fτ)]²€΅―Nέ†rδθkΫΎ�¦uKy­Gw{‘Λυ?“Zuκ9μ›1mͺ,X@—5mΦά£@^Υͺ•eΠ'λcV¬X)}ήψŸΓ9ΥΖ¨Γδω2₯uy§W^•-ΫΆιυο/”‡³gΧλφ·oί‘ΣgNKϝ2zΜX9}ϊŒ}·^Ÿ4a¬+Z4JΉ«‚Φν:Θ�]»vuοΪE^~©™€2ˆΞ‹ .~·tΉ|:h°σ.Ά@@@@βX€ bsz@@θ"Fο*{5}IrδΘa5g�Ύ½²|ιkΫ\I“&­T­^Cr>’Λαχwξά‘Cωƒ°ιΔ+ €„Ά€ "nΩΌΑ£Fώγ©[Ώ‘ΛΊ[7KŠ)¬}£F•q&ZΫφ•φνڊ ΩΕ΄œ:yJͺΦ¬νPmφΜ’ο©ΌΊ¬y«Φ²gΟ^‡ύ�6jΧͺ!Ύ?PοZ½fΌΦ»o”jγƎ’’%Jθς�έzΚ†M‘�e₯ρ=0ΛCY’Τ·άΌySΊχθe…Ν}Σ&O”B…ž57£}΅‡UE{{άxώΒ)_±Š»έ”#€ € € €Δ‘AΔ8‚ε΄ € €ž DτΜ)˜΅ςδyLκ6hθΠWAΔάΉσΘ υ:Νƒ"šΌ"€ €@88'MžβΆΩ'Œ`ΰάyσ£μ·8hξά³η'iήͺΉιπϊTήΌR΅J%«¬IγF’.]:½½bε*cκα?υϊι3geφœ―¬zj%˜AΔ™³f‹ �₯7Ϊͺ¦K~�xqI”(‘nί™3gtHΣ>u΅=ˆ¨όαz„Hu‚‰“¦XΣ^ΏΨ΄‰τ{32,ωΟ?�ΘΞ]»dσχ[δΐΟΏHΦ¬I©’ΟIŊδ�εΛ΅>?@@@@ΐ D ¬7WC@p ˆθ‚›]Ίφ)SΚ­[·DMΉ¬WAΔ§ >+•«VΣϋoήΊ)?.\€¨$K–L"j~ € €@˜ΨƒˆΎŽ°§FT£Ϊ +SΆ‚�³οs^Ÿυεtɟο)]Σ(‡Α "V©^Σa f¦ό̘ςΩ #φκσ†¬Z½ΪΊ={±]ϋN±s§΅/Ίϋ4ΡΓFŒWαP5]t‘Β…dα’ΕѝŠ} € € € €q @1P9% € €€η=· FΝ΅κHή§ςΙέ»wε‡έ‘ΑBΥWAΔ'σ>%+U•ˆν[dGΔvέά�Ζt|ƒΡs\@όˆ βϊ΅«δώϋξ“7nΘwΛ–Iƒzυt“~π‘˝Ϋ�ADuS&N"E ι[3nΌŒ;ήΊ=_ƒˆ+Ύ[,#ͺ₯ΌρσόωσΦ9YA@@@ΎAΔΰχ-@@΄AΔΠνώŒ™2Iσ–mτh6;wFȝΫw€Δs%uƒ]]έ ADW*”!€ €@¨ ψD,V€ˆLš8NίζΦmΫεΛ™³eΔ°Ουφϊ₯[χΧb$η βΑŸJ₯Šυ=ͺi€?όψSλ~} "�Z±T2ίOΥ��νwυΠe@@@ ‚ˆ‘Ρ΄@H°C·λΫwκ"ι�₯“λΧ―ΛΨQΓ₯T™²ρ.ˆXؘΊoβΈ1^uΒƍ›€G―>2~μh)Z€°ΗΗή»'F°³΅”/WV:΄oλρqͺβa#dϊŒ/εϋMλ%eŠ{ι�%=bPηN~M_}R₯Nπ>ρηšαΤ'Ύ>ϋφο§OάΌλ‚υή ·>ρυσ€ΟKΧžωϋğΟ�„�'�=+΅ο胇 syΰ;wdζ¬ΩQφυνΣ[šΏάL—5~Ož:MΆoΩ$)S¦Τί­J”z>Κ1ΞαD\Άδ[Ι–-›Ύ₯AŸ•/¦Ο°nΟDœΏΰωυΧί¬}φ•ΏΞ�%+V¬²Šμ£,ž>uZ&Λ–―°φΗφŠ―οή›|―pέ‹ώ~�φ§O|}ψζΊ/ωζΪΕ^κοχK_ŸΩ`ΌOόΉ&Ÿ—φ§ζΏυ`~^†SŸό'Ζ € €@l DŒmQΞ‡ € ΰ•AD―ΈVΉ΄:,ώοθ‡ Ώž/‡ύ/ƒˆeΛ”‘‘#†zεΊ="BΪwμ,3§O“ς{ulλv€bωr�²Es―Ž3§4ά³{‡WΗέΊuKŠ–(%}zυ ψ5}υI›:Mΐϋğk†SŸψϊμΫ»Ÿ>qσΞ Φ{3άϊΔΧΟ>/έό³Ί/Κ ΏΓ’8ψϋύ�Χg6ο�Ιη₯Γccmσσ2œϊΔc@@ Φ"Ζ:)'D@πF€ ’7Z©›:Mι`Œ†˜8qb9}κ”Μœ1M_8>Žˆψpφμ�ω•Ž^Αώ΄wŸ¨)U˜πΙ'χκX5šR|ω€Z΅*^·πΫΕ’ώ Π�­�ι‘”<=ψΚ•+ςΡ'Ÿ‰ \ϊšΎϊ€N•*ΰ}βΟ5Γ©O|}Nœ8AŸΈyΣλ½n}βληŸ—n<£Xύ>ρη³+‘τ‰{Α˜χψD|$η#²hα|}‘S'OI՚΅υz»6­₯Gχ�z]…ζήπn΄ — β­Ϋ·Eύγ5js�€I­{Ί{χ� 1Ji+Ϝ‘ΚΥjΪ•~oφ•¦MK’D‰ΚΥ†ΊήΊuλε­ώδκ΅kQφ{[ΰλϋğχ&ί+\χ’ΏίΏύι_Ÿ~‡ΉξKUΚο0χ6jΏί/}}fƒρ>ρηš|^Ί~Ž‚ωyN}βZR@@Ψ ˆŠœ@@ΐg‚ˆ>ΣΕفΝ[Ά‘L™3λ?ζN7Z�#Ν¨%>γ ‘#€ €@X Ψƒˆ7oή”–­ΫΉΌŸ[·nκΡν;;vh']»tΦEφΐ‘-pΑόΉΊόμΉsR©JuϋaQΦΓ%ˆ₯α�t­·:ο·Υ΄Ν?όψƒs½ύχΕΛ#)š• .$κΧ—ηŸ/#2€7‹­Χγ'ŽKZu­mV@@@@#@10Ξ\@@ΐAD70A*Ξ_ΰ©Z=ςβ?ξή%kV―΄ZBΡ’`@βΉ€=ˆxώΒ)_ΡσьgL›" >­…~π‘|χέRKkιw‹δΎ τvΛ6νδ‡~΄φ9―Δu±fjςρ‡θΛ�^³F^λέΧΉ 2nμ()Y’„.οΪ­§lΨ΄I――\ΊD²<”E――ίΈQ�^Ή&O>ωΈ<š'uŽΓό!uλ7²ΆΝ{±]ϋN±s§ΉΛλΧόωσι‘Ÿ«V­μp퉓&Λπ‘£½> € € € €ψ.@Ρw;ŽD@ˆ‚ˆ±€‹§θπJI›6ά»wO~9π³Γ™3fΚ$3f�e/^”S'OΘ9c4Ÿˆm[κΩ7Ίφθ%Ι’%“;wξȈ‘ƒν»Bbύ¦£ώ<ΊΖύςΫo²fΝZΡπΞύίΫ£;FνS¦Σg|)Ήrη�0©Ύ}Ώ όϊΫο�ΊU I•2•}W΄λ—―\–_ΞστΡVvΪιο5}υI‘2eΐϋğk†SŸψϊœϋλ<}βτώ07ύ}Ÿ$”>ρυσ€ΟKσIs|5ŸψσΩ•PϊΔQΞ»-_ƒˆκΈMΦJ’$IbΌΰΤiΣεσ‘ΓάΦ‹λ bωςεdψΘοgκ»MΟή―Gi‹=ˆΨ₯kwΩ΄ω{]ΗD¬R½¦œ>}F—?ρψc2qΒ8+l9ν‹ιzVϋ‰c3ˆh?οΠΑŸIŊtў=?IσVmμ»½^χυ}βΟ{“ο�»Ιίοίώτ‰―ΟΏΓ\χ%ΏΓ\»ΨKύύ~ιλ3Œχ‰?Χδσ�ώΤό·ΜΟΛpκ“�ΔXC@ˆm‚ˆ±-Κω@@Ό ˆθWœWξΤ₯«€NΖγλ\»vUƍιΆ~¨Λ–)##G uΫ~W;ΆGDHϋŽeζτiR @~WUά–΅nΧA*τoΩ’ΉΫ:�vŒ7^ƌ/{vοp΅ΫmΩ­[·€h‰R�§WΟ€_ΣWŸ΄Ζσθ>ρηšαΤ'Ύ>ϋφξ§OάΌΛ‚υή ·>ρυσ€ΟK7žQ¬~ŸψσΩ•PϊΔ½`Μ{| "6lP_τ+ζ 5<(υ5u[7Ač›6Λ«έzDiΛ”‰€H‘BΊ\=w»vνΦλξ‚ˆjgνZ5δΓχκz7nܐκ΅^σηΟλmυ#�‚ˆjδFœTΛ™³g₯rΥzέΧΎΎOόyoς½Βuoωϋύ۟>ρυ9ΰw˜λΎT₯όso£φψϋύ�Χg6ο�Ιη₯λη(˜Ÿ—αΤ'�υ(E@ˆ ‚ˆ±‘Θ9@@| ˆθ3]œΨ²u[Ιpίύ.ϝ8qbQ�©εξέ»ϊΏΏ/^/¦NvY_†z±tΙ’2fτ·νw΅cΛΆm�ι•WΕ>ν’«z�ʚ·j-+TΆ­[ΉΪνΆlΤθ±2nΒDΩ½c›G#,™'Ί~ύΊ”(υΌτμΡ-ΰΧτΥ']štο�N}βλs°wο>ϊΔ|S9½λ½n}βληŸ—NœmSύ>ρη³+‘τ‰ΜλU_ƒˆ#†‘rΟ?――§F΅Ϊ·�@”kΏ�±½$Ož\—Χ¬]WŽ?₯Ž*ˆλ bρbΕdβψ1ϊΪ»w� ­ΪΆ�Ž―fΟ”ΌO>‘Λ›6k.?ˆΌŸθ‚ˆͺςμ™3$ίSyυqsηΝ5E΅ΉΔUQt½nυ }™“'NJ΅ZuΜKϊτκλϋğχ&ί+\w•ΏίΏύι_Ÿ~‡ΉξKUΚο0χ6jΏί/}}fƒρ>ρηš|^Ί~Ž‚ωyN}βZR@@Ψ ˆŠœ@@ΐg‚ˆ>ΣόΐReΚJ‰ηJκλξί·W–/]cB=ˆ¨nΰαμΩcΌ{… .ΘΥkΧDξΏίuhΣ^ίΎn Ό½¦yœϊ{κTžOΝ|Ν"š#ϊšτ FŸ˜Χ §>QΟ’―ρ·Η™>Αxθϋ§ΞλΑμ“@>|^ώΧη�Φ‚ρ³O\xZ¦žΫ-›7θκηίύε+VρθΠmίo”T�ώ��ί°±ΡυoήΌ)ΥjΦ±Ύ“ψDμή΅‹€M›VƎŸhΛj±�οΝΎςbΣ&Ίhσ–-�ΉK7ϋn―ΧωΩeΎ7ωζΊ›LŸ`τI ―ΜΟK_Ÿ½@ϊγ9 O\Ώ'Ν�`τ‰yM_ŸYΥvo�ΏM0ŸoΫjϊγ½n}b>ΗΌ"€ €Δ�AΔΨυδl € €^ Dτ,ˆΥ= ">όpy8GN«•ōΰb’$Iτ―·mωή*�σΟ#rόΨ1k›@@ ”Τπ½ "–/_N†¬oγτι3R₯zM—·Τ�mιΡνU½oηΞέ�¦}½^Έp!©Wχλ˜jU*[‘F5Υ≓§τΎ“'Oʘ±γ­zjΕ>αΆνrςTd]‡J�nμΨ±CΎ]ωJμS/«ΐεŒ/gΙ1γ;Zξ\Ή€ωΛΝ$]Ίtϊ(η©›c "ͺƒΎωz�δɝ[?η«yςΑGλu{qΗΞ]nG„T•}»X"vξΤΗ©Q¬ΥhΦ*4ΉjΥ=:γŸΖh’Œ6Φ4¦ƒVS3›ΛaΓeΚΤ/ΜM^@@@@ @1Θ\@@ΐ½ADχ6‘ΆΗ“ bγ¦/AΔ16ύθ‘#2ξμλQ@†€/AΔχή υ^¨£›»hρy«�—M4OnY0�ήwηΞyΎ\E=ΪrϋvmEϊΣrΚ$V­YΫ‘š=ˆθ°ΓΕΖͺΥ«₯WŸ7τΥ–―fΟ’dΙ’Ί¨Ytέaω…ϊ E…+ΝΕ“ bƒzuεύυ!*½€p‘BrσΖ iέ�CXίK(5~άΨQR²D ‡&OΈΈ+b«ρύ"©Dά/͚·Œ±Ωωση“2₯Jιz3 Ÿ«†S¨.iŒg�Ήρμ©eΓΖMςσ^7uΚΔ R€H!}\ΑBE½>>Ύΰοs`"ΎΩο-ΉzυΊœϋλœ~γ«Y ξ«k—Ξ�±C;}Ήn=zΙϊ βδ�εΚ–Υη}ρΕΖRΊdI½N1N¨9) € € € Dτ˜ŠŠ € €q!@1.Tc�œšΎ$9rδ°NΌί^YΎt‰΅­V^y΅»€J•Κ‘ΜyγΔ‰2gζtηbΆ@ˆS=»#ƒπ?όπ£΄l‰Σ ϊqςΣ¦JΑ‚δή½{ςLαb~œ)<υ6ˆΨ«giέͺ…ΎΉN―Ό*[Άm Ω-SΊ”Œ9\·o�δ)2lΔ(―ΫJΡ5™ΏΟ=ˆX²tِ΄Ίέ�@M>½zJΛΝυ&ADS…W@@@‚#@18ξ\@@ΰ_‚ˆ‘�(δΙσ˜ΤmΠΠ‘‘�‚ˆ_ν!)S₯”;wξΘιS'εΜ™ΣΖ4‚7%WξάςPΦlΦρΫ·n‘Ν›βfdλ"¬ € ` ˆhΓ±Υξ]»HΪ΄iε·ίΚάyσclΏ΄/‹b#ˆΨ ^]Ι›χIΉ~ύ† jŒΕ&†ν©ό}"Ζ]Χ.\HͺW­’/0iΚT9}ϊLά]Μ83AΔ8εεδ € € €x%@Ρ+.*#€ €ΔΆAΔ؍ύσuιΪCR€L)·nέ�S.«+Έ "6jς’œ9}J6¬_₯ε+V’B…#§ΌzυŠŒγύˆ@QNJ € Dτ* ͺω@ δ-ΖF1ν §kωϋD §ήŽΎ­£χa/ € € € ˆHm�… € E€ b’*¨Q«Žδ}*Ÿά½{W~Ψ½K ‰ Ί "ΖΤπ½^—Δ‰Λ?�ό#Γ‡ Š©:ϋ@πY vνš� n]}|’D‰₯H‘Bzύφν;ςγ?:œwγζΝ2eκeζF·W»H±’EδΡGσHΊtιŒΡ~ΟΘoΚΈρEMσμni�Έ‘4lPOΞ]§~χ]Όψ·1κίο²lΩrωϊ›…Φ‘δ|Dτοgm?ϋμ3’4iR½½cΗN«\­œ:uZϊυΫ‘ΜΫ 5α³Ο<#wοέ5iLK‹—_’ εΛιj}ήψŸœ?^―?•7―Όήϋ5½>cΦl]^χ…:R’x1}ίW―]“ύϋχˈQc¬ςηΟ'―tκε²ό"£FR� F&©Œ‘–G{TξΏο>½~τθQ£OΞκuυγγϋJΟΧz»œfWΉΆ6¦o}Μ8>»Ρ/ͺOώCΆnέ&ŸfΓߐ+`ά£Z2gΞ$9sζΤλη/\CιuσΗ„‰“]N-=μσA’8i³š~U£Lχιϋ¦C™Ήaϊœ9{ΞΈφSϊšΗŽ— &IΊτι₯ΕKΝ$ΛCYδ䉓2xΨ0Y±b•y¨υκ«O–,™Eέ³΅1S¦L’Δψ�wβΔ ωωη_dА‘Φσb]ΘXQΟ`ώωεΪΥ«ςZοΎφ]zύ½wˆ:ο±cΗeΰϋZϋΝϋTΎ>ζΙ< "¦IZͺW«*εΚ>/O>ρ„<˜)£$O–L.\Ό(‡–έΖηΙ°α#ΝΣFyUΗwθΠN*W¬`<™%₯ϊΗ=·oΛ…ΏΞˏ{φȜ―ζIΔΞ�ήηφηη݁Κ‘£G’œS˜W�]•ξ=zι:φΟ’ΩsηΚχ? U*W4ž‰όϊύσO™�υ7ςΕτ.Οiͺm“&$O�\’-[6ύύύάΉsςΣή½2kφ\ΩaV΅^ϋφι-9r>lm›+ƒ u{fυ9R€HɝλQŸΡW�\֟³&N’={φšΥάΎDtKΓ@@@.@1ΰδ\@@ΐ.@Ρ�Zλ?&7oΩF%J$;wFΘγƒ%ž+©ιWρŽDJ1΄z›Φ €ρK χk=€UΛέΤΚU«₯χλo8ΤUžΑƒ>‘'Μ‘άάΈsηŽ―Νψr–Yd½ϊΉ”/WΦΪv^Q½’₯�Ϋ_ΆL9b¨s5—Ϋg0P₯*Υ]ξσ΄pθΰΟ€’ŠRKσV­c ϊ|1e’¨šZͺT―iM³Z΅jeτΙΗΊό»₯Λυ=§NJoΫ,Xψ­ xη=«¨nΪ2π½w¬mseίΎύ�¬yKsΣαΥΡ�‘ΠΝFΊ £Ÿ:wκ(Ϊ·΅žΞ‡ψεWy₯KW—‘9ηΊ1mωΕTyϊι1UΣϋ?ϊδ3#Ψ5Η‘ξ< λV―p(37 Šό!ζΆωꍏ Α•+_Ι!¬ι«Oι’%εγ> �›Mqx=wξ/ισΖ›²kΧn‡rΣHύC—g‹wΨ§6Φ�Z!>ψ€NV3ώQŒΉxsŸ�žσ<κΥΣ by#„;|Θ`ϋ‘QΦ>p@Ίχμe½7μ-œ/κσΔέ²yΛιά₯›΅ϋέwή–ϊu_ΠΫ*08θσ¨Ÿ φ6UΨχΝ~²lydΨΡŸί-–‡²>€―σ—1Ÿ)Οxμ₯T©ηδΎ tωα?ώΊυιuσ‡―ADžσΪζ«·ADυ~V£ ώnτ£P…θͺU­j=?λΦ­—ξΖhœφ₯KηNςJΗΘΡ?Uy‡ράύfτEΚ”©€ V-Xπi="f§W^΅S#†Ξš9Bλ™³g₯rΥΦ>sΕ&:l„Lž:Mο²ΝΊ7m6FR=%Ο=WBrίΗΥ’ϊͺBεͺfλ΅σ+E…RΝE=K?ώΈGΏ―žxόq)jŒλ.ˆ¨ŽS#ͺεΩgžΆF.ˆ8θӏ₯j•Κϊ5βͺΥ«υˆšŸ½ζ{\…kΥ©λ2δ©4~D4%xE@@@ ψƒί΄@HΠC³ϋK‘Γβ�Ž~ΈπλωrθΠο~Υԏjj@΅μά±]6¬[š7N«@β₯€9’š ΅lΣ.Ϊ{|±iιχfδt±*Τ�ύ+#μΩG,S!ŸW»υ°Ξg9οS•ΤhwEi’W¬\mγΌ2cΪT# Tΐtέ“g G†Ψœλψ³m:©0š ₯Ή[ΤτΛsfENγκΤs°:|XzχιλΜTu�^Ύ*jΤ7wΛ�ˆ­z€Βθ‚ˆφcUM…)Υ’\*Œέ²tΙBɞ-2 ₯B—*|i.jκμωsgλ ₯ς~©E+Q툭EMq;zδp}ΊI“§Θ°£Ό>υ”‰¬©Εc "ͺΰXΣfΝEqUΠN-ͺ_κ5h,φ~3nΌŒ;^οχΥΗα}bLYήΊmQΣA«E8mκDcjΰϋυΆšN|ρβοτΊϊαkΡ:±βνs`?V­{DTΓ—^|QThΤyšduŸsη|©§[vΠSΣ'?_¦΄Ύ΄šΎy�”©zέό‘ή_©ŒQDGŒ΄‘ƒ|*8»~ν*=Υ²σθ–ΞAΔΟ}.ΣΏœ©/§Ž[΄pPUΟ‰z^ΜEέη· ζλχ‚*SmužrZΏq“†�­{δ”μζ±Ξ―]»t–ŽΖtΤjqnΏYχΡ<ΉeήW³%I’$zšτ={Λ†M›Μέb~ͺη0³Uιί‚ˆΞ"l#€ € € <‚ˆΑ³ηΚ € €†AΔΠ{ ΤAŒΡΥR§TfΈeΕΧ+T¬,Ο.’oTD5qάθΠ»iZ„ ―Ό "Ϊ0}ϊΎ%4¨;Λ–,�šK—.K™r,»n―vΡS«‚˜B~ΦAN+ζυγ*ˆ¨.·eσ=’ΫΡ£G₯vέΊύ�―Ÿž^ωž1]�ΑNΰΦμΕ¦ςΏ7^Χϋ?4XμSQΫƒˆͺ­/ΎΤΒ!Ψ€ςΰG\νA@5* Α�yω`ΰ»R§v䨌φΡεœλω²mΏ~ ‚ˆK—-—7ώχ–ΌšΣ;«Qζzυ‰œzά|¨pš ©ΩΫη­Ο°ΟI… ε5Λ¨Ρceά„‰D={t“Ά­[ι2BTaDs § ’Ωfw―*hͺΥRΏac‡ ξΤI€pαBzίϋ~,_͝§ΧcϊΡβε—δυ>½t΅5kΦJΟή‘οAUΠόεf�·OδΘ‹ΞϋμADϋ{ΫΌ^�·ώg«FoT£8šKΛΝυΘ‚jΫ ΄šϋΌ}υ$ˆhΏG&Ά ©�§¦ύ3z„ΎτρΗ₯F­Ίn›AΡ- ;@@@ΈAΔ€“sA@@»AD»Fh¬7oΩF2eΞ¬§a›`„―]½ͺζKρΡΗ—:uλK’D‰τωΎ˜2Q.\Έ7J+@Œ€ΐςdDΔukVZ#Ή©�1¦ U‹ϊ]fΎfy(‹^W?ΚWͺ*ηϟΧΫjšαχί{W―«pήχ[·Κƍ›)ywΘ―Ώύ�Λcϊˆ ’š>ZM#­ΪXͺL9:\½r™1₯oFέΌ7ϋ½eLa½\>| Τ�95l£&/:άƒ=ˆ¨Ftkέ.r ژξΟy\νa'uέ“'NκΛ›}©6T_šΫί|»HήΩΊ’Ÿ?μAΏ@η/ψFή}ο}έjσ™_΄x‰ΌΥ€C™9œ?>³gΐ|OεΥη­S·a”Ρν#0ξΨΉKΪΆ�oΚίp "Φ­S[*”/§§·Ξψΰƒ’8Ib}οΜζ�¬yK‡5ί{w€Τ{‘Žή}γΖ Y΅jlέΎMΆmˆvͺa5zαΪΥ+τH‹jZχrŒ‘E`°Zf}9]ςη{J―wνΦΣaA{Q½ΥϋΨΎ΄kΫFzt‹œΪ|›ϋUΉqΓΘPςΐ>’Ήσζ›»Ό~υ$ˆ¨Β”*T©–?ώTfΟω*ΚuΎίΈN�¦M+jδΗ’ΕKFΩoD4%xE@@@ ψƒί΄@HΠC«ϋσxFͺV―�υγξ]²fυJ«ή³fΝ*MŒiίΤȊ*θ°jΕ2ΩϋΣλ|¬ € (3”SQ€Τhž.κχ›eΟ2\Έ`žδΞ•+Κ)Νϋ˘&υK™2υ‹(ϋμ"ΪGnTS§žΥ«ιM5ΈšV\oΑόΉΊμτ©ΣR₯FδHžζ1φ βΤiΣεσ‘ΓΜ]ϊΥ>šβ»Ζ31ίx6ΜeΒΈ1R’x1½Ω�}'‰ΨΉΣάευ«'AΔ!ƒ?•J+κs;Ξh^pΡΒωzšo΅m|›ϋΝW‚ˆ¦― € € €_€ bπϋ€ € € Z€ bhu‡WΊ#€ΣΑΑ_όμΠΈŒ™2Iƌ™tΩΕ‹ε”Z8wξœDlΫβPOmά�ύ�ΌU[Iš4©ή·uΛf#Ψ±)J= @„€ʊ)ˆhOέΉsG† ‹œΤm ’šζΦyQS�67¦W͘ρAη]ΖοΟSRΏQk„3η "Ϊ§=8i²άΈySTxΘ\Μ9£§gήlŒH¦ώA«©SνAΔ±γ'Θθ1γΜΓ½zΛ ’}D:5 έ†Ρωε—_e{D„Wν�r ƒˆ3gΝ–?€›d>σjd;5Zvlϋ^’'OnύρΩ΄~­€OŸNŸΧUΡκ=}ϊŒT©^SΧU?b "š£’ͺ,«ΥŠQΠ:ψί•^={HλV-τ–šΦW=£ή,γƎ’’%JθCJ–.λφύ8mςD)TθY]OΜ·Ιx†~?xHώώϋo]Φ ~]yτΡGυzΛ6νD}ΖΨμΡ½›4uκTφ]z}έ† �έ;/Ŋ‘I#ίSŒη²Ι‹ΖtΝ½_“Ν_ΦUΥϋvψΘΡ‡Ωƒˆ�φGDόbΚ$yφΩgτω\έ‡Γ…bΨπ$ˆ8bψ)χόσϊLΞ#;š§_0oŽe[³v]9vόΈΉΛα• ’ € € €U€ bPωΉ8 € €AΔΠz:uι*©S§ρΈQΧ�]•q£G:ΤO“&­΄1¦gLfό‘[-{~όAV―\ξP‡ @)`†²b "ͺ6mέΌΡψ]˜JnS2)ώœ_ΝT!€*•+KΥFIj'Oζς܁"ͺ ›@ΰJ–$©-ZD–.[.Υ«UΥS«ΡΤTΨK-cƍ—1cΗλuσ‡=ˆ¨φ©:Ύ,f;φνΫ/jjۘoh:΄—W»Ό’O9~Β$9zLL§Υύ‘DτΗgΑό―Œϊςh/W£ΥΩGοΫ»wŸΌΤ’•e;iΒX)V΄¨ήvb4Ÿ‰`Υhˆ+–.Ρο‡+W�HλΆνF?U7 FKTο΅Δΰ+\ΈΤ0ή_UͺTΆ¦WΗ9€¨ΚΤbPΥ1μs=5τέ»w₯ZΝΪQ¦wφ'ˆψαΐχ€vνΘ°¨σ΄Ν‘­ρό§'AΔ·ϋΏ%ΤΧ'πΞ{’FUu^ΜQ7Υύ>[€Έσnk› ’EΑ  € € €A ˆτ.  € €@Β ˆZύί²u[Ιpίύ.₯FDR�©EύAPύχχΕ ςΕΤΙVύ)SH»φ―HЧ ϋυΐY²x‘΅Ÿ@‚!`Υt¨j*εθ–y_Ν–'LWiήͺ΅μΩ³7Ίκο³OEϊΝ·‹δνοΊm²7m˜2q‚)RHβξy0ŸooGDτΗgΜθ’FΦTKΏώo‹šΞΫΎΌΨ΄‰τ{³―.ZΉj΅τ~ύ kχΔρcτͺΐ9Δh0FDτζ9°.l[ρdDDϋ¨„›6/]Ίv·ADϊΈά*š#CΖD΄Ό�8.ΛCYtQ�·ί‘…‹ΫwλυφνΪJχ�]τϊΑƒ­Ρέ=Λώ;wκ(_ι¨―εά_QC'AĎΪY£°ΊšΪύ‘œΘ·ίΜΣ!Π³Ζμ•ͺTw{U‚ˆni؁ € € €@ΐ"œœ "€ €Ψ"Ϊ5B{½T™²RβΉΘ?8οί·W�αΥήβ€I“I»Ž¬�8|H̟k―Β: €A0§z½vνΊh©ζvVΥΈ·ώχ¦4m�H·sχ1 š«EMczω�%9xθ°΅[Mνœ:U*—Sˆφ�Ώ~�Έa]χΫEKδ�ή`g_φω ©P‘Ό.κά₯›lή²ΕΎ;ΦΦίϊίΖ}6ΆΞwωςe)]Ά‚Ψ^j§šŽΆhρΘί�Vec%XAΔΖ”Χ*,©5ͺ€]�έ’ϊcΩ’o%εΏ�@Βέ°*PVΊtIY±�}¨Ρέ5’+·‡κφμωIš·j]u—ϋβ2ˆθ}dʟ~Ϊ+/·lνΠώωsηΘγENYμς‡€K“Nž|ς cͺεκzΤΐ―ΏωFήyχ}«Α*ΔΨ€qCΩ±s§,[ΎR~ϋύwI“*΅-VDš5mͺ§|V•ί�πcωjξ<λ8ϋŠ=T£F›7οk9~βΈάΉsG.œΏ(j*εΨXT θӏ?΄N΅vν:ιΡ«¨€εS&Yε�Bfj§―AΔreΛZηV+jΊY΅œ9sF~π±^W?nέΌις^νa«›Fί,”~‘7oȝώ‰貇’”αάyσeγ¦Νrις%Ι™3§™―š1Un*#@Z²tY—‘1«Q>¬˜Σ «CW―Y#*T₯BŸjΩΊ-Β!|₯ʊ+¦Ϋ’ΦΥςFίήςpφμz½Oί7δζΝΫz]ύXΏaƒ^χuDDu°―>*ΔΈΤυZΉ©E=—3gΞ‘D‰I›–-€P‘guΉΊΧͺΥk9ΈΆkΣZztοjν>r”Ψ;#•*Uz/ΤΡεκGtADoŸλ€��xDTUνύ·~γFYb|vό}ρo©[χ©iLΉn_œƒˆjt՜9–΅λΦλΎ:rτOɞ=›”{ώy©S»–uh•κ5£L³lξ΄“UΩί_’ηΛW4w;ΌΪM&Nš,ΓGŽvΨίόεf�·Oo]φξΐdώΧ φ>θ©\©’.Sο•/f|)ΫwΘmc]}ξ΅jρ²¨~/\ΜqΚz5‚lΦ¬Ω¬s5lXOΚ�ϋ>�bϊ ‰Ψ±ΛΪwΰ—Φ½~5{¦δ5Ξ«–cǏΛΘQ£ ΫKR₯j%#„XΟ:¦“ŠŒξsΟώ™ιjτVλD¬ € € € €@œ DŒsb.€ € AΔθtBk_LAΔξ―υΡS;z�κ cGΛ•+‘„χ€>u@πGΐ9tg?—«iHUΐ蝷ϋ[#ιΩλΫΧ]ΝΡνυμλ‡�ψCκ֏qΡ^n�gΙ’Y}σ΅ΛkΗ4E©yO^U hέκVՁ|€Czͺ`ύΪUr�Ώ�Έ`Ζ—³δΣAƒ­zζŠ/ADϋ(hζy’{u ΄Άη||Ί εΘΡ#Εφι�v8mΈ»žS5―6ν#a:ψΡ'ŸΙ¬ΩsŠΝP‘C‘› LT£8šΗx;5³yZ_}ΤTΎjJ_wΛ½{χdΘ°α2uΪt‡**μ»fΥr+Δhί©pI“&ΥEΡUoŸϋu< "ͺΡ7Υθ‹ž,�‚ˆζ4οξŽwώ q�gͺ}σŒπΰ{FˆΠΥb―λKQ}φLž0NrδΘακτΊLυsqΖ΄©Ζtςάcί1η«ΉςΑGŸθ"5΅χΠ!ƒ$EŠφ*λλΦoξ=#G@uΨaΫ ˆhΓ`@@@ D rpy@@ ‘ D Ÿ' dι2ς\Ι�ΊΑ{Ϊ#+—;N Χ½§DLšΔ£?f”\½zΕ£ΊTB@ 6Tθε₯—^”Bƈi�€‘D‰ιΣ.ZΌDήκušδGr>"ο½ΣίΨ<%hγΖ Ω!3Ώœν0RWνΪ5QΓZθ)i'NμΠlΰQ£$ϊ|H”Qπ*κΪmΪ΄ςεΚI†τι­λ�y옞ΒΤΉΎ―ΫKΎ] CG*0V‘r5«]ƒ>ωΘρ0rΪ^}ސU«£NYl= ϊ|¨¨‘ΟbZμΣΏΖTW�\΄D)—ΥTˆ²λ«₯XΡΒ’9Sf+Πφ1"bυZu¬Χμ·mέJΪ#ρ₯OŸΞ^¬ΧUpqύϊFί ²/6 Ϊ΅m#5ͺW“,™3K† ι­Sxη=Y°π[k[­lί²ΙeΥ‘�Ώ]Ίv—M›Ώ—ˆ­›u˜Λ>ΫφύFν’ϊΕΌ―λΦθλ«Ρ8Υ¨œφΕWυΜΏΡ§Γ}©σͺivί�π—ΟŽΪX†d�@IDAT―B©}πΎΓq.^”αΓGJϋφm${Άμ’F#­ΧΰΏιΓΥqφΕ—ηΐ<ήDTΣ€_Ί|Εhσ_²gΟ^³ŠυΪοΝΎ�ȘVέ HͺjšwυΩqΣ‰³e‹ζ’ήC›6s]UMs^έxeΝ–Υ:—Ήrι�eQ‘ΌΖ(€1-fΠTΥkΦΌ₯μΫ·ίε!φχΧΘΡcdό„�F6U¨©ŽΥ”Ηjy³ί[ςέ�εzέω‡šΆ½�12₯9₯ΉΉ_ΖΈδ»οδγO™Eϊuβψ1z$O‡B7S¦~‘Γ©ζn5ύυG”<Ήs›EϊUv:υ‹ι2jτX‡rsC…Y‹/¦7›½ΨDJ–(‘ΧΡβ@@@ΰD Ž;WE@ψW€ " €„Ί@ώόω$w�GδΚΥkr˜BτΧί~ΆΙ*$σψKζΜ™$i’$zΪΡƒΏr˜ž6Ϊ°3ΞΤ¨oyŸΜ+ι�₯‘ΣΖtΐGύι2Έg ρϋ꣦Ξ—/―1=φ]#(·ΟcS5ψΓg—_ω5ΖχUl�Ωƒˆζy£Q½§σηΟ/™³dυ^VSΌ{Ί(S.Μ9£άΈqKŽΑט>CΜsW¬XA†ώLoͺc5yΡάη―ͺ͏Σ.'N’HώIkΌ/�ύ`Œ>*ϋαΐχ’\† b @@@¨AΔ€rs1@@g‚ˆΞ"lR q£†>].eΚΖ’oz}l¦ŒΚΩsy}œ:ΐΧkͺιξΤ¨2Ύ,Ύ^3³1βΣ™3gΌΎ€ λά1F³ςeρ΅­ώ\3‹0:}ζ¬ΧΝ FŸψzΝδΙ“λgOάδνBŸD/–PϊΔΧηΰ�ρY0Α7Ρ#&ΰ½*U³f Ÿ~ωυ—£Ύωt²xx©/kΦ¨#ΨΕt«<³1 …Φώ!ƒ?• εΛ;4κ°1cύFMΚ‚½1gΦ Q£ͺε³ΑCdϊŒ/ƒέ€Έ~ως嬀¦½A/·lνvΔH{=OΧ}ύ<ΰ;τΒώ|�φυ{}z}βΟsΐ�‹Ύ?}}Ÿ$”>ωΛ΅y͚΅Ρ#²@@ΐg‚ˆ>Σq  € €@lDŒ EΞα«€}ͺ;oΞqωΚI—6­7‡­�š>Τyj½Έn̝;�Σz6M·c[ξ›‘S₯:–ΗΌε{Ÿψ~͘[εΊF0ϊΔχkϊξCŸΈξ³4‘τ‰ορHΊ EM™ΛU j•J2θΣO’ξπ dεͺΥ�ϋυ7<¨™0«Μ3Kž4F³τeα™υEcœjΧͺ!ΉΙ%UŒχyξ\ΉτξΛ—/KΥκ΅UΥ+Ž·ύω<ˆγ¦E9½οί+’œΚγ‚πϊΞορmΕZEϊ$&Jί�FLgv·?}βϋ5}χρύϋ·οΧtgSΉο>1Ωύώ³ηΞI₯*ΥέW` € €€_ύβγ`@@"ϊ+Θρώ$„ βυλΧ%UͺTώ0y}¬ο”τϊRΦΎ�±Ε:EΐV‚Ρ'ΑΈ&}ύ#•Pϊğη€P—ϋg¨r₯Jςω ‚ˆξ…|ίγOπˆgΦwwŽόO`υΚe’)cF«ΰξέ»ςξ{οΛ‚…ίZe¬FΐŸΟƒΐ΄πΏ«γ{ίω�σw΅FŸΈR nY0ϊ$Χτηϋw {(>gΞ•ΚU}Y<Π>\@G‚ˆαΨk΄@ˆGγQg†α­.\Θ§VϋϊG·΄Ζ(ŠWŒΡ}YΤτΚj*W―—{Ζ¨‰|eΠΧk¦I•Z�^ΏζuSΥΪ'Nμυqκ_ϋğkϊ:΅�‘OόΉ¦OBŸΔΜζΗsσΙ]ΧΖϋğkώπÏ�o„R-ΰλο°?ώ8"η)ιX\ <’σy0γ�wFSͺ~ŸπΜFΔ./όZ~ψaQίΓ~ώω€Μ[°@/ώΞγγ©{Ύ~π?ϊ>πηϋ·―ί+θ“ΠλžώXτύιλϋ$‘τΙί/ΚΑC‡£Gd/ € €€Ο}¦γ@@@Ψ ˆŠœ@@@@@@žAΔΰΩse@@C€ " € € € € € € ήΓ»�h= € φΓΎ Ή@@@@@@Hΰψΐν#€ €Α ˆμΰϊ € € € € € € €€ύσγh@@?"ϊ Θα € € € € € € €@"ΉΈ< € Π"&τ'€ϋG@@@@@@p ˆξ=Hϋ@@0 ˆζHσ@@@@@@@ Α DLπ € €@p"ן«#€ € € € € € €ώ DτWγ@@ό ˆθ#€ € € € € € €A ˆτ.  € €@Β ˆ˜°ϋŸ»G@@@@@@π ˆώ}Θ € €a-@1¬»Ζ#€ € € € € € €B‘‡@@ ¨ƒΚΟΕ@@@@@@@Ώ"ϊMΘ @@ό ˆθ^h›&MZIœ$‘\Ύt9΄Jλ@@@@@@@ΐ/‚ˆ~ρq0 € €€Ώύ ΜρI“&“v;‰zUΛ�²eσ&‡‹?]πY)TΈ°€ΟpŸQ/©$J”HοΏ{χ�άΎ}Kvοά)[Ύw<Ζαl € € € € € € €@X D Λn£Ρ € €@ό ˆ}Ω¨ιK’#G«±ϋχν•εK—XΫjεΕ—ZHΦlΩʜ7ώ:wVΎ˜:ΩΉ˜m@@@@@@c‚ˆaάy4@ˆCΏσδyLκ6hθΠPwAΔ,=$—.^”S§OΙΕ $MΪ4ςΘ#Ή%]ϊτΦ‰?ξή%kV―t8 € € € € € € ΎΓ·οh9 € /"†~7vιΪCR€L)·nέ’δΙ“λ» "¦4κάΈqΓε ε/π΄T­^Sο»|ε²L;Ϊe= @@@@@@@ ό"†_ŸΡb@@ ^ D νξ¬Q«Žδ}*Ÿά½{W~0F2,\€¨n°« bLw�½gI’4‰άωη1dPLΥُ € € € € € €a"@1L:Šf"€ €ρU€ bθφlΖL™€yΛ6zJε;#δΞν;RβΉ’ΊΑή'N,έzφυzΫYqδπ!‘{γ΄ @@@@@@Ό ˆθ•@@b[€ bl‹ΖήωΪwκ"ι�₯“λΧ―ΛΨQΓ₯T™²>3gΞ"ΥkΦ–3fԍ;yβΈΜž9#φΚ™@@@@@@@ ¨ƒΚΟΕ@@"†ζ3PΪ�wτΓ…_Ο—C‡~χ*ˆΨ¦m1†?”΄iΣH�€Ι¬›Όyσ†L›δ@@° ˆ>έ]1eΚ”�ΉkΉzυŠΨΏO<('N—T©RKώ§Ÿ–bş“δΙ“λ›½yγ†Œ9,|nœ–"€ € € € € € €@΄£εa' € €@\ DŒkαΨ;Ώ'AĘ�¦¦tž�Υl9vμϘͺ²@@@@@@ΒD€ b˜tΝD@β«AΔπιΩ’₯ΛΘs%Kλούi¬\ΎΤj|�€Ι€EλΆ’>}zIœ8±Un_9ώΌ,]ό­œ9sΪ^Μ: € € € € € €„ΉAΔ0ο@š €„»AΔpοΑ¨νϚ-»dΜE2άŸˆ1β©“'εθΡ#rؒ™@@@@@@βŸAΔψΧ§ά € VΓͺ»h, € € € € € € E€ b @@)@1Ϊ\ @@@@@@ˆ}‚ˆ±oΚ@@Ό ˆθU@@@@@@@ ˆ‚B“@@„$@1!υ6χŠ € € € € € €ρQ€ b|μUξ @#‚ˆaΤY4@@@@@@p!@Ρ E € € ˆ8k�„ € € € € € €Δ…AΔΈPεœ € € Dτ˜ŠŠ € € € € € € €@H D Ιn‘Q € €@Β ˆ˜pϊš;E@@@@@@ψ)@1~φ+w… €„AΔ°ι*Š € € € € € €Έ ˆθ’…B@@@ D ”4ΧA@@@@@@βF€ bάΈrV@@"zE5@@@@@@@ D"†hΗΠ,@@ ‘DL(=Ν}"€ € € € € € €@| ˆ_{–ϋB@ΒD€ b˜tΝD@@@@@@άDtC1 € €@`"Ζ™« € € € € € € €q%@1�d9/ € €€G=b’ € € € € € € ²CΆkh € 0"&Œ~ζ.@@@@@@@ ώ DŒΏ}˝!€ €a!@1,Ί‰F"€ψ PΎ|9©[§–dΛ–MR§N₯ΟpύϊMiςβK>œ-α’&ujI‘2₯W7~σΖ ΉzνšWΗ„Zεx@žzςIΙ‘3‡ά½{WNŸ>#”cǏ‡ZSiΉsfIΚ”ΙeλΦω࣏έΤς¬ψύχή•gž) W―^—_jξΩAΤ I�%KκχτŸΗŽΕΙϋΩ›ΟΜσηΟΗhδΙο°‚ ΘίΥηš8qŠ,\΄8ΖσΖV…Gr>">–G2e|P%J,'ŽŸ_~ϋUfΊ»†ϊ|υd‰Νί%ž\Σ]ΔtlLνTΗΘ—Or>’CΜ=+;vμw׊ΞΕήOŽW}“-λCϊ”[Άm‹ξΤμC@@ˆgγY‡r; € €@Έ D Kš4™΄λΨIΤ«Zv판-›7yΤψf/·Μ¨λž>uRζ}5ۣ㨄@8 ΄xω%#p–Z~3BCkΦ¬ ι[ȟ?Ÿ”)UJ·qΖ—3Γ>ΌjΨm[·’ž=ΊΉlVΑBE]–‡SŸ¨ΐKsγyWΛ†›δη\ή“?…»"ΆΏw’zuŠK—.K™rΌ:&�*{ϋy%Kfy½ΧkR₯Je#T“(J³Ž=*“&O• Ώ²‚ΠΨ³{‡nΠφˆiί±³_›9}š(_ώωη)T΄„_犫ƒωμr/«>+‡,E rψ<;{ξœ|ςιg²bεjχ{ΉgνͺςΰƒžνΦoά(έΊΏζφ žώ«X±‚ ό™>ϘqγeΜΨρnΟιn‡ϊμkίΆ­Ό`χS₯Š ν3NƎŸΰςέ^•F J† ι]ξ_·aƒ #S'MΔ‰λέ“¦L•aΓGΊͺ*υλΎ =Œο>άΏ΅�φν;ςύΦ-Ρ>oVeV@@@Β^€ bΨw!7€ €„·AΔπθΏFM_’9rXέΏo―,_ΊΔΪv·RΈh1)gϋ#ήΕ‹eΚΔqξͺSŽ@Ψ ˜α“~ψQZΆi�χΣ«giέͺ…nc§W^F¬‰έξϊ~ΣzI›&>ι©“§dΗΞ]rύΖuΉ~ύΊ ϊ|¨Λ‹…SŸ”)]JF�οc�δ)2lΔ(—χδO‘ω~ςζΧ�]—ηJ?οΝ!qVΧlΏ'Ÿj΄©Ήsf#{Eχέ5jνΪu�£Ww»)³οJ‘Ο.Χž ƒM2Iž|βq—ξάΉ#oΏσ�,^²Τε~o 7�[γ6œη|�ΥkΦΘk½ϋ:[۞ώσ'ˆ¨FΝλΨ‘­T«VU’'‹όΗNf&Lœ,#F67^‡ύ\Κ—+λPζΌqξά_�¨i3‡Ρ�†3Ž+ύqζyώϊλΌT¨\ΥάτωυαμΩε»Ε c<Ύ_�·eρbΗΐβ'} 5ͺW‹φXΆ¬S·a”: ζ%ζΙ₯ά,PAΛW»w—={φšEn_ΟυΕτ.ΏΗ4iάHϊ½ΩΧ ,:ŸpϞŸ€SηWω‡/Ξ0l#€ € €ρL€ b<λPn@7‚ˆ‘ίcyς<&u8ώΛ“ bςδΙ₯Σ«έ%i’$ΦMD΄(X‰§fψΔ“ΰQ° Β)8l+o――Β‹ΞΧ‡:|Xκ5hμΡ)Β©ODμΤ‘½1½m »2eΚX‘žύ?-[Ά8μΏtω²L™ϊ…CY°6Όω<°ΤuεκUγΎΆΚζΝίλ)FsηΙ%Υ«V•‚Ÿ‚ˆΑκMο�kφ}lΥ(qΉsε2Β;Χeβ€Ιή5$@΅ωμr έ·OocδΨfz§ ‘7ΒuWχwM#\¦F™SΛ•+W€ΤσευΊΏ?Z4Ω‰ξ>·§iΧΆ΅οΝ~oΙwK—[Ϋφo~‡ωD\Άδ[Ι–-›ύ�ΦztAΔAŸ|$%K>'ΫΆo7Bώ»εΔΙ“’υ‘‡€T©ηδΉβΕ%EŠΘί+W­–ή―ΏaS΅υιόω¬mη•-š[Θy_/χ~ΰ\Ελm{ρΔ‰²t™kσω_eΊn{ρ›oΙ_Ζ(šΞΛ γ:̝ω}ΓάΧ�Έ>½zκMvU–λΦoΠAχΧ_MT�ͺeǎ�ΆC'½ξξGηW:JηNv» "ͺΠνϊ΅«Dύ�?΅lΫ!«‘Α3€Oo„MΫK²d‘£ϋ:j¦CΨ@@@i‚ˆ!έ=4@ˆ�CΏ»tν!)R¦”[·nY\ς$ˆΨ΄ΩΛ’-ϋΓΗD ύώ¦…ώ ˜α‚ˆώ9†ϋΡ₯K–”1£Gθۘ;�kψώ‡έaž˜™ΤtΧjΚP΅¨i;Υτ‘Ίxσy°eσ=•¦ ¨`ˆϊ q^Š+&IŒ©1½ΤY&τΆΝΎ bθέ]ΤρΩΥD•¬^ΉΜετwΚΧίDŽŒ§F@]·ϊΏixΌσ^œOΉώTήΌ2gΦ έΠ‹�-eΛWrέh£Τ›ίa±DΌuϋΆŠ\&χξέΣSϋͺ†EDtΫpc‡ ξΎ�ή»ΊΚ™3g€r΅θ§6ΆŸKυ‰κ΅4kήRφνΫoίνΣΊ=ˆΈbΕJισΖ�<>=ˆX³vέ(AEw'šυεtɟο)½Ϋωχ€ �2žKυzχξ]©V³ΆΌ»:— ,Ξϋj¦μ4λΈ "Άxω%y½O/]εΰ‘CRΏa³ΊžΊ[='jωσΨ1©U§ž΅@@@ψ'@1ώυ)w„ €„•AΔΠξ�΅κHή§ςι?Tύ°{—.RT78¦ βc=!uκΥΧuW._*UͺΥΠλ�ΟήyΐYM¬QόCQšX)6D,,4齃tTz€¨  JW€χŠτή{i‚(6:�T€*β{oΞ,ηζζξή²,»Λn’ΙΜdςŸd~9χ|ρYˆˆrM›6–κCYΊtι” —_ͺ£Ώ©Πl»χμ‘iΣgΚΆ;< -!ŽΑGήL–€I“Κ1υ‘νλoφIŸϊω„…³@ω7Ϋ½�³¦LύL—«\©’δy.·ΰΓεΕK—δ›oΎQ‘ι†kQ =š9³.ίΊν랑ΝΠ8Ε }΅χkωx`TθTqυOλW[Jξ\9%sζG$uκΤ‚΅?μί/#GρΏ˜ΊζψηΟΣαό ‚#Ν³Ο<­œNn‘Σ§NΛ’%K�IˆVӇ뽬ϊBe©ZεωIΉΪtxϋ©P‘œT­\Yw+I’›$gΞμzύοΏ―Θξέ»}Ί»aΣ¦€NmᎠΒΰU«ϊ‚Ύ^0–�όσœ={N~ψρGYͺ\wŒθΑtdθΰ’B]ΫH™Ν,wέεœtδΘuόlŠΙ?κγτk―·σ»Ζ"ΉOœΖΓ\«T‘‚ε‘L%mΪ΄rεΚ?rςΤIΩΌωs™ςΙTAxBwͺ]«¦r’+©�υΜ*T`ω[‰Όμ? .ς}ΰ£{ΧΝt3ŸΝ˜‘œ₯ξ–’%ŠIΆ¬Y΅ϋΘΡ£Χ"|„w'q²erZJ—.­<τΠCΊΘ™ί~ΣΗ4ε�ψσOy΅u[³)‘Ž ͺRΉ’”)[Z‡aL§Ψ\P�€ϋΥyΞ[°PυwŽs,χ \ ž;σ#™•ψβ.½ϋόω Zμ°Q]―C‡π©μ9’D$ΧB0ŽΞc ”CΤ£κš@Ν­ΈO<$ŸΎUϊθsŽφ�‡–-šIφgž‘4iΣθΉ‘ŸO>%ΫΆm—ΡΚξ”šχL w>ΘόH&™3k†nζ§γ?IΩςQsŠi7ΨeΈΧA55§•/WVώ§ώλτnύ|(Z€ˆδΝKξΌγωνμYεΞΈE…βόX�«η£ynE7§ΑA Ο€ξ={ωݟαŽI¨ΟΝ`ΩEWPά'YΤ<’2UJΉωζ€rP9~Ύukΐη-D„Y™R₯ΥϋΤγ’”VςΓ? œΪΖM˜θyΨR₯JHνώ.ͺΏ_Ί(mΪF }<+^Ν χ:@uΜ 5kV—G2fΤNu7)αλ/Κ…ν«½{eκg3ΒJ“bcξ2m…²„ ©p‘‚’#ϋ3Jδ—NR¦L!Έ/>,ί�πƒ 8Ψο½λzΜ]…UΰΑ*0’[Χ΅Λ»‚ϋΞ$Ϋ™�†E―†^½v­~Ύ™rfiί_K•ΈmϊŒ™fWΐe—ΞοHυͺUτ~8θυ|?κ]ΡT–‘ϋf ǎ/©R₯’ηΤ{l&u ]Έπ»|ϋέ·2i�'²~γFs(g9lΘ K ™K_iΦTΝΉQ}α ΡΈΉ�°ώtφ¨»`=ΊTN=C{χŠr@όQ½W­^Λ³x¨οόΧCˆΈ~ν*=wγςε/δχ.g_σC¬θ•&Œ-9rdΈyΞWο΅jFΝK^BD[όΨ«χ‡ςΩ΄ιΊIœ�¬ŸIŠ)œC4n�\�› Οό›eεͺΥz~ρzs*q…H€H€H€H€H€H Α 1Α ;J$@$@$@‰“…ˆρw\Σ(1Kz %I’$²cΗ6Ή’„UyςζΣŽIˆΨR‰l’%K�>^�,Σ>"―Άy]Χ‹ΟBD„Q5‘ΚΌFe“ �Ω’ekΏ]EŠ–ξ];;‚.wˆήh�–μάΉΛ½K 6θΫ§·ΞGxΌ"κΓ3>¨»Σœyσn9ϊ}$ΖQΔώΘg—oά°΄mΣJg-\ΈX:uξβμΖωυλΫGΛς¨“g―ΐ‰ ’ˆΊΌ�¬Σ$‹ςό©„TQT¬Pή«˜)^ΚOΰY0d‚W-%h+]²€ά~{jέkγrΥξυΆRΏ^έ ΞΔ"•"“Aϊλk&ΠΑ!dΕh;Ωην|―υŠ•«ω‰‡Β½OΌΪ6/}ϊtςQοœ0–^υv¨ΠŒ ›4υΩe‡ΊυΩquΓ} » ϋ;dπ]βάΉσrΗ·_-ν»2lΈŒ=Φ'σ“Iδ©§²ωδΪ°…‘Œ „‘={t•Ε;[! $D³ξa„'Ρ₯:υȞ={"‘œγ}>RΒ‚iNέΨZ UˆΑNΣ&΄ˆΠ«ί~χ½Ό�²•ίœ…ϋ~ςΔρ>β wύAC†ω„Κ w>ΐ<`ByΓ‘ͺXΙ2~ύqΫގδ:@;οvκ(5#A T£z5½ξώƒηΙ>%°7’I·ΈΚ.Ώaνj}�ΐα¬TΩς>‚ΝpΗν‡ϊά΄ϋΞ:ž©―Ά|%ΰυƒ@X|ζΜŸζƒΉ―έ›­ZΆP‘Lϋ΄‡ h³ηΚγ—o2"½Ί©wˆρήη•πސ#w^gW0ηh {=OΜΎP—1cρVΗw|D“ΧcξBhy\;H -Q"ίΞzβ+Ό ς4ιWυ£—’%JιMΈβ9tσΝ7+Α½ΏC*ŽƒτΣγ„=4nζν jΪ6ˍλΦ8ο0΅^¬#ϋΎύΦμ�ΛPΩΟ0[ˆθΣ ΅σψ¨ίΗ1>bCˆΎ“ΖG=Ÿζώω…­ž^5b˜δΝσœ.1«—P8œw~!βŠ•Z(›,Ω­²�ΐΑΐΉΊΗvD„CγŸJˆs²π^˜{Β<Οτ+‚αYŠ4Α"y·KWΏ2xt~'Κ½α”/�uΩωχ…—qλζ Ξσ²d™rNαkΪNφν§�­aΏsαY'ΰΩsζκQΨεΉN$@$@$@$@$@$°Pˆ˜°Ζ‹½%   DG€BΔψ;€Mš·Τnyψˆ5bθ υ!―PPBΔς+Λc?‘]Ǐ₯DkΔ{!"άWπρ β­νΚωπ‡οP�ˆ)δi%,zϊι§΄³WσW^υ0€ζΟ™ε|xΓ‡Α5Κ½B’BΚ­‘9\Ω‚ Σπ_ύ%ϋφ}«\νΞJ†‡2h‡3#D,U²Έτύ°.Ί}ΗNiΤ€™©ζ,vŽQHNB@i�ŒiSερΗ²θMŒλ2υAτμog΅£!>ά"αcqZ/z~ 5BD]πκ8ΩΐM1Ω­Ι«§΄2!"œWƌn"Ζυ 6JΫ7ΪΗX.Τζ@”‘υͺ˝]ι²εJθΠIςεΙ£Δ‘Eτ.ˆ Œ€Žt3h'8j._Ύ�Ξ’pΗ]cFEqΒΗΫJθ QB¨Γυνy%ΎrεoΏΠž₯Hεˆh‹Π!8Χ9|Δι�aΙμξ}b·ΞϊΨΡ#”³Z”£ΞuσηŸΛώχ+g²TΚ©ξiνvθ"Β ž&αόp­ΓI1WΞ&[ u!H4Ιώ(nς6lά$'Ož”ΌyσH†ΤΩΆhΔ”Γυ‘.RFεgS$„(„Ϋ•Iόρ§ _$cb Θΐfέ† rΰΐAέΟβΚ5Μ]ή� ·vu5}ΐ� ΐύιΛέ{δΧ_•ξ»_ , Edn!b°ηˆφgΟ™η'tA~€)!’{Ž…hl‡Ίqν”-SZ‡¦DΌΒeŽ=Rr]uτƒΰχΨaεzΟ=χh± �8FŽ=Ζ9₯Hζƒν_l‘[•³,Δύ•›­Wxfη`ΦJ$Χš±λ›fΊυΫoΏ“Ώ.�₯Ÿ)pΪ„χ‹=og+SKˆu}άOgακ5όWTɘ Aw}δEχάΔώpœ*gN�L ΒΠξ8ͺ"A|•4iR½nžΡzγκ#2yΌξΪ΅K2fΚ¨Ÿ&Ώ}‡Ž~Ο<Λ–Ž₯‘\ωςεδ6uΝΖ$D΄Η1Τω Ε+ΝQ“π<Ω­ζ< Λ’Eί n!b$s—9N8KΓφ€r₯Dθάγ'NHJεΆVR ²ο½ο^έδΟΚΕ±Έτšt=ζ.<ƒπ,B<&Lœ¬ΧgϜ¦έ­!"Όε–¨kΘΝ.ΙP#8~BͺΦ¨₯ίOαΖ‡ϊwίε`;pΠ;~‚.έΈ9ChŠτ½rδ¬^³Ά_ρ`ΉŸa^BD<7ϊι'}έ'oΌŸ”*[ΑO΄kw$!"Δγpr­Q½ͺv6G»kΦ¬ κύοσΛ/ΤΟLŒK‘"Εό\Γ}η·…ˆφΉβή:uς”~δΜk νΊψ· ώθ9±kϋV=oα\r>—Χ�ͺΧmΞ+Ϋ₯pΝ›=SΏUNΠε+Uϋ‡N^BDs_βG?€ εΛJ―χzκuϋϘ±γB~όΫοό·ήz«½[ΠΖ²εΛ΅Σ'�W&      „E€BΔ„5^μ-    $:"ΖΟ!Ν―D‡Ο]u?œ7{–Άό”1]ΊτςRέϊΪ₯eίΧ{eι’EϊγR|wDDxΑ‚ςλΑπϊ¨ a_ εTθv5D8±R*μ+„­ΫΌζσα�kxΉ«Έψ¨ήNΉ'Ϊ.)(sρΒEGPh\¦ H(^ͺ¬Ο]ΫUΛνTe ³N�ό³4nςŠΫ]χn]΄θηβυQωΆ"„r>bvι„—5ͺUυζ˜}Α.½„`1Υ5ξ„1• f?D‡=W’x1-ό°λΰΓθΚΥ«eΞάΉ>.qvσ!Φ-Ύ±Λ˜υHΖΔzΖ"— ½|Ε*s8Ώ%D$pΕC‚Θ6¦0Ίαή'~!ΓΎGΰΔΩιέ�*„Ÿο95lPO‹2ϊ}όoˆέεJP`)p5Βύg�;owTcεώvπΠ!©\%jϋέΧίG}ϋΛδO>ΥUα6Ά`ήI“ζ½νε(₯w¨?oА“HU9pπP½ӟPΖ")Μ1Ca>hχVGY½zsˆJΛΛ{=Ίλm„Φ-\΄„³/wΜ2vΜH½ ΧΦ"Ε’ζ1§€ZA˜J8΅Jαžc φ‚ΝEˆΈdΡΟS.’λΐ΄a ؐ·vύzyϋνw}އp±υSβ’&I›V-uυΩj>μΦύ=Σ”^ΪΟF·3f$c‚Ζν9ΫΑ<7Q.œdŸΗΆνΫ₯qΣ(w;΄eχbŸr+ω\ fμQΦύŒ²jί¨Τ~©ŠLŸNž(Ω²eVˆΙuΰXAΨ†w!;an¬Q³šzΟ‰rΈΆχa=”ΉΛ]7Τmkγ¦Ν>އ¦Ή³gΘ#™2ιΝ6―·“΅kΧ™]Ξ2�ζ.ϋϊιΦ½§Μž;Ol—Dˆ±ͺͺPΙFTθώΗ8υc#œΗάώZ»7υπC$―gΏs’�8šœΨ’HW1g3Fn!’™™Ζ¦Lœ ~Πε ΗmΈαJΆ@.˜Π̘Η?ύd’tήβΛMΫG”pΌq³W|ξK³Ο½lΫϊUiά¨‘ΞΖόηέΟPήω ν> ―υ6ρy§Ηώ@BDSΟ~ΈΊšW¨₯Ώ7½.ζυό²ίηφξύZ?�L›Xφϋ¨”,Q\g΅VαΰΧ)&Ρ νΰQ�Be=ζ Βφ3f9βZά Έ'πnUU…)‡ΰϊ?OFύJοΈϊη«―φΚάω ΄[―Οu      ψK€BΔψ;6μ    ά(DŒΓ §¨¦Κ NZ§” Ψ§S&κNγˆΨτ•–rΫm©΅+ΫΠAλzpΉˆοBD„Θƒ�{½zk½Γγ87¦�ε*ϊ}@„›~H^Œm!„0΅_ͺ£ƒXξ]ε…Ju›ξΙˆάH‰j;ΪΩ‚ΫΏΥΑO !Β�E ΄ƒΚωσ€@α’Ίϋ-D„σZ A‚]'Τu|°…3S(ι+υυ³iΣC©βWΆΞΛ/JεJ•ΗHSyΏP” κЊ&?Π�ˆO‚"F2&Ά[’qg Τ§@ω‘ GΒ½O?˜|;ό΄ϋšT‚:Φvζ1ερΡ{υΚeŽ“©BΠ"BP‘rUSM/¦ΠΈ^Ή `("ϋ‘Œ‰]vΪτ™ΧCwZ4ŽdȐAgΫΒIΫQŽL%Λz‡Yw·go‡{Žvα¬+D΄ϋχrŽ‚Σ«;½ί³»bή-ίΉνsΗρ’ ˆ+BM‘ΜΈ.‡μˆ…άΗ‚‹-ΖΩνœΙu`Ža έNr¦Œ½„ΠyυŠ₯ϊ=ΑKΘΊeΣz-.q;‹E:&θC8ΟM»ο‘¬―]½Β‰ΉέAΡΞΊŽΙHFh¦7Τ3φΨ†#€νn‰±FΫΙ’%ΣΕσε/δ#ϊΤ™ΦŸ`„ˆ‘\υκΦ‘φoΌ¦'DΜ‘&ϋψΑΫCm?Ψς“AT†d ΙνϊφuŠPάn#˜uΫΝ"Βο•+ζ¬ŸιgΑΫs΄[0†ϋl–rδΌηž»υαπLz葇τ:ζνͺՈφΊ1}„Hlώά™ϊGB—�ώ[ )c½PΩBD―χG„’<°ΏξΞ?ξ—jΚέ1P UˆDΈ–z%# σΪηΞ[Ήl±γ’ˆ±²Eύ¦lΈοόFˆˆΉuλΦmΚyψΉύŽ;”ΣsNΗ9Η0bSs<,!D,­~π΄sΧ—²_9²bόRnιžήqj…›ζΛuψόϋΑ3 1.ήWLB˜δaΚιή„`?zμ˜”―ψ‚ΩνγhkΏλG'DΔΏ‘πŽˆχך΅_�œpβDΒόˆχιž=Ίιν@bOΌΏα«TɒΏ>tυηχί—ε+WΙ§ŸNυϋa€)Γ%      @ό @!bόφ‚H€H€H€nX"ΖΏ‘―S―‘€M—N‡γ=r˜\ΊxQw2&!b‘ΒE$gξ<ΊμRεFΆο›―υzB"Ϊβ>Έ�­\ΉZ>�b«lύb[@'[μ„Eθ<“ΜΗ½›UΘ½΄i�θl/Q“-¨€ΫbƒΖMM—Ά€Θνbb;½X§ž»—-¨€ΛΦ?ΚΑ ΙτKγž‚|·3ςl!b“f-<݈P.‘%[|fϊ‘ΐε7}ζ,?©)γ΅4β“`„ˆ‘Œ‰νv+ΒoΨ°I…ήτΪP…#αά'^ŒBΙ›£BPfΜYW V f‡…]�·WNξ·B-μΠ²φ΅7ΐŽήρ©j‹\°/c`("ϋ‘ŒΙΐώ}₯hΡ"Nu3™{;Œ+$Φ;wι&σ”  —΅«–λuόΫίJυ’[·σ«SΘ΅ξ9Ίš y3X!bέ—_’7ΫΏα΄οΕsžαΗ₯.]»;εΞ›νˆ~ YΊt™šσvθ{ a1ƒI‘Μ¦=άΫ/(Qτ3Ο<γ„m5ϋ°\₯\Y_oχ–“Ιu`±…ˆΑΈ‘ž-LnΥϊ5YΏq£nNš½{½―ΧέόHǍ†σάԝ γ?<3K(bw²η„θF¨n“L]/‘&ΚΨnwΆHΨΤ·—Α#Ή:ΏΫI»γ˜=ί� ,η±Pζ.ϋάΒ]‡«k%rΊ�ώϋΤ;kZIv5΄+ζΆ€Κ% ‘_αΞηNq5wΩBDό€šrŒFψv„δmΤ΄ΉžkνyΖ-DDΏΡΧ!ƒhΡ―9ΟPί·š}^ˎo΅——^Œ Εμ₯y•G^(Œl!b PΘΫ·nΦι^BE»‘ !κ}§ΣΫ*¬}R-$|T Ζ œΊtο‘ΓΙΫΗp―Ϋο Ώός«+YΪ]D"}η‡ΫΆνΈk`ί{ΘsΟΈžΎϋΤ©Σ¦Š^Β©}Έb?’{�…Ψpψ° χμΩ+?Ψ――£ςeΛϊ<[ά�>1Ž�ψχPΥκ΅~°BD�?θσ‘Œ=R�–jΪΌ…T�X!F!’>™«p]½ κ<―ξ[•γ₯In‡Y“Ο%      @ό!@!bό φ„H€H€H€nH"Ζ―aϚν)U¦ŒξΤξ];eυͺN£"ΒαΟΰ’ψ«lLš0Φ©—„ˆψΐ8υ“Ι’ρ:n(y_lΩ¨οK8«ε|.oPUαnωVϋ(χŸO§~&½?μλWΟEŽϋχ’}-L˜8ΩΟ}Ξn»{ΟχeΦμ9~m##‡έ@(cbߏvΦέξ`^‘€QβƒyJ”7|δθh―�pΟ1P�‚ΝVˆh‹λ‚iΫ- ©¦BEvνς�_Ȕέ 6�ǁʯ Κv>πͺ‹<ˆI .¨ά‘J8‚δێs‘^hΟfΥ©s—…;¨ƒπζsŽ΄pΡ6½³^€œΟŠ(4$w[φqtώΈΗΕΓ}nΖp(ΏέΆπ(K`… εχ�‚…‹δΞ]vΜΨr€³CŸΎΡΎƒ_Θy§!΅Œ1’λ`τΘα’ηΉ¨pΏΆ0ΫξCLλ‘Μ]1΅Σ~Ϋ)7Ί²nΧhS6�ζ.;”ο–­[΅}°Γ™CnΔdή«Ίt~Gͺ«Ξ&y…Ξ6ϋΌ–φ1’sς΅λ†ΒΘ"NWοMpw§UΚAΥό0ηιμΉά»νP…ˆNΕ«+x·κή΅³š'JκΈ"—)W!ZΘΑΚΑ½pΑ‚Ί| w{ήqΣkΫλί«ςμ…"ΆrςΔI)₯ΞΣNΆγ―υίՏ̌`Σώ!”6αž‡ ξTNˆh\QψτιΣrαΒύ#8ωV«Q[�;Ε’Ϋ‘™x¬”(^\κΌTΫq­G =@1‹H€H€H€H€H€β γΩ€°;$@$@$@$p£ 1~Έ ­ ‘Εwίξσι\š΄iU˜¬΄:ομΩ³rςΔqωE‰·mέ"•^¨*™Ν’χ:p@ώόλO§.Δ‰=ώ„ήΎ|ω²Ψ�£ό­B‹­\ΎΤ)V :hΫ¦΅ΐq0eΚ~]r‡³?ώtό'ωtjτ‘Ο;+σ,ςiΧώ°9bΤh6|€Οώ@pωΒ=$憏₯Γ*"Ό"’»-|δ6ξgpˆωxΰΏ.)Ί‚ϋ�ɟ|κΞuC…ω5CϊZ«FυJωξώξ‡<Γθω– Ό…°…οχμζ„Ψ4%FnΗΝ*,σ"ΗIΞμ ΄4β“˜„ˆ±5&Τ—:κZH“ζΏ.αΓt•κ5~€G8κ}βΧ©3L(D|ΜΞσ|”P ¦&ΐb5€‰“&KΏϊU±]ˆμpμΆNZpΤ²S|"ΪNZ“&O‘S§Ά»κ·Q—;Όp©’Ε₯i“&~!ΙQ‚Δf-^ θΊŠPΕ―3d+D΄<αΘ΄~C”c_ C§ΒIBΰ`'8e5ͺ_O²eΛκΈ¬™ύxN4DΖM˜h²ό–ΑΞ~]ΧLŸφ©dxπA½ΗD(i€ΨΈl`°B4τiݚ•Ϊε ’“ό…ŠκpΜ&δ0„.Ο(¬ϋhώΔƘ„ϋά4}v Η±iS§θβ_}΅W^�Χΐ―j™�₯δΓή½tώ�eΛ孎œ2fμ‰mWΦφ:Κςε+Ίξ•`„ˆ‘\“ƏuB‚»ΓH»ϋh;œηI Ά’ΛoρJ3iΡΌ™Sd— Y»{ΟWrζ·3ςΟ•$wξ\R€p”ΦΌ9…―�ΔΥάe‹ΊL �ͺ\₯Ίσ\ήώΕνφ†w³Ή½ΕφcF Χ簾΅λΦK›Χώu{5ω^KΫ‘4˜°λ¦PΩBΔ©ŸMSnx™fœεζλα[t‘Θ#"šΪχC PΛ(‹w1„eNzΥE³Š w½�ΐAӌ³Œw~§1Χ έv#Mωdͺ|Ψ·Ÿ«„χ¦ύƒ<žΙ%&ΆK#4rνΪ΅δaΞ9EŠκ>ωMvμΨ©us­=w-^8Ο ½M9$#΄IfzΔqNΗ^Ύϋα{9zδ¨τκύ‘.bζ1ύ3K8ˆΩιΛ]»ύΔqφώ%‹ζΙχ? ³’/Ψulα…Ϋ₯Μ”ϋXΝ?Ε‹Σ›vXYϋϊσϊPŸ„ˆ#G uΆ" •ž>}:εβ˜_*–/§I#ΉΓ=κΜ«BͺΨυ°κu`ΧVˆΨΌiy΅ε+ΊͺΫΩΙn/˜u>ςδΝ#εΛ–‘B H²dΙt5#ΐ ΤF(σA 6L~Ϋ6­ŽTHvΘρΨΈl!b(B4Ϋύ‘gS§Ύ]Ί*χ6€%*”u‡·£Φu†ϊcξsΣτ!Ψ₯-ς9zμ˜~�ΊλΪσΔΐ}ϋpŠ˜±χr*C!„M…γ%Rϊ ‘S₯`„ˆ‘\Ά;jt!ηυω‘>O’kΫήq(„JHΆ›­)Σ²Es˜ )Π{U$s—9N0Kϋz7εqŸ,_±JoΪοrBΫβ-Σ–ΈΦpΝΕ”F&yσ<§‹α&pΖ &…ΒΘ"zέχ8\ΉqOΕτ£‚Ψ"φωΰ})«ήε9cbD­`Œτυ7ϋδΕ—λκuχŸΨxηw·iΆν}6mΊ#μ3ϋ£[šyebzG‚θςΜ™3Ί9ϋφάe £;�Ωgύ[7oΠbG³Ο-ΒΆLαT χI“Π·*U”rεΚj‡w“%B™γGAsζΞΣξ»φ>�“      ΔO"ΖΟqa―H€H€H€Hΰ†!@!bόκz Ιwώ+Ό³{aЧΰ£ώ?wφ7†yœ”.[ήq=΄λθυ$I$ιΝ7λUˆδΰ2‡ΊCU(΄„Ldτ΅s—nŽ3ž-R@θ·‚E’DM‘œS$‚Š93§ι°g8^χο9!D97͜ώ™σq/&ΡC sˆ !"„h„’ς‘Jc3A(Uν…**ά³’D]ΓvΒ‡W|Έ6}¦­ΧΝGa„τFxλθRlŒ‰WϋΆΘn� ±Ϋ₯kw―bςzΫ6�°A=½/¦Π ž X™ξ«ˆΝA,c§˜bΆˆ.Kp[Š)Ω‚ΓGE)@ξ@IDATKΕΚΥόͺ¬XΊX ΎCΒ~”CΊήBΔPΖΔvQ:l„Œ=FŸC€jΧͺ)pςB:rδˆT¨\Υ³I[¨Šx"_ž<κu`w X!"άϋ~ΨGW-±2ƒθwΞ¬N—…SEPζ§Α+v¨θΥ«Χ\Ύbγ:Wˆh;�Z½ZR₯ΊΝ=Ω_sJ±1&‘<7M?‚]ράκJ”.ηˆxL};τ�{~2cχ�*dκ©S§M5½\³rΉάsΟέz=Ίk‚"FrΨb¬+WI»7;θ~…ς'”Ή+”vέeΏΨ²Q’'O�CΛΊ7Qvάθ‘’+WN]-!b(s—»/1mV!Κ«Pε&ΉC7nΤPΪΆŽzwϋ\γ¦QΒiSέ#ΤϋPRεΦ‡wηΙS>•ϊυκθw8Υ5R?€‰NΐŠgά²Ε wwϋYgŽhiΟοcǍ—ƒ}Ÿέv=[ˆxτθQ)_ιί0�(g .=“M{±%D;z„δΞϊぃ:θ-Z0Χqšu‹γLŸ°Œw~»={}βΈ1’=ϋ³: ξ‚Έ&ƒIφ³CΜ#Α¦@Ž‘ƒ>ξ'g|Ψ³™τι�;Žρύυ—?qB<$mίh―ΛO2I²fύ^ǜωrέ1’IΧ­‘ΫoO­74n* Ξo«χ|JθλάNpπ\Όx‰~Χv»9ΫεΈN$@$@$@$@$@$�Pˆ�Ζ„="   Š…ˆ gΈŸ/PH9BEΉχ|συ^YΆdQPΏυΦ[εΥ6―λ²ι<~ΜΘ κΕe!KNž<ε„Κ³=[ ώ͜YgΉΓ'ΪB2ΫQΔ�u„χά¦Bƒ^ΌtΙgW$‚ [8`7 ·―°ΚΆH‘ λ7jbWs֟}φΉpώΌghΊΈ"’#ψ0JϊM…js³ ₯~teΆΉfͺR�lYG4‚ς„MK ΝK—ώβ%KGΫ―HΖξ1)U˜=―³vΨa„·KWΟSDxo8ρ Ω‘^= «ΜpοӞύΡάδΕ$D΄―s„΄¬ωb?1Ζ(£ϊpΎnύzέ,«W.sœyΪΌήNΦ�]g©έψΰ†δv΄»ήBΔPΖΔuA ]Ήju?68GάOι Α� ψϊλoμ,½“¨ΔT°y{ThΤ:υš]Ρ.ΓΉμƒ"βS,DKH^Β8δγzɟ?ŸγR†<€@|P~γϊ5rσU}t.T‘Μƒ•8ΫΆ]Ξl‘‡}ίDzΰ\Γ"’ξ&Ε"uκ(q Ά‘Ή»E:&h;’η&κ‡’ΰz a3’;d*D^‹ζΟΥ‘©±ίν$i„ˆΨηv’ƒΠέΜA(–,γλ‹:v FˆΙuwΫ cGλCB8ΩL ϋέaΚqέCx:kΞ\»kΞz(s—S)Œϋz³]ͺΡ”[ψHˆξάFweες%’.mZ]uΒΔΙڝΰ9sΖTΗρΧώ‘ φγ^™‘Β±§M“›2zΜ8ο/ΘGΒΎΙ“Ζ;�>ω|λκΎm΅3†Ώ]”kmuu\€θ~lΰnŽΌpζEςϊ7ν ηΛb%ώ}nPΏ�vME][¬jΏsa·_(Qξ¬Y³ύžΙΨΟD$@$@$@$@$@$0Pˆ˜0Ζ‰½$   DK€BΔ„3΄‰Yˆˆ‹exPΦ(±ΔL‡•Έ_ ,(+”w bΫΥn5cF wφ#ŒιœΉσεΔΙΚm-½<ύT6© Bβ#t§w;ϋ…‹DPΔr%΅έϊΰ@R°p1Ο©ψhΉdρ'δπƒeόψ‰rππ!I*΅<ώψc*¬oyό±,2{ξ\ιΦύ=ηΌΜJ\ ΝρβΫ"ŒͺU^ηrη’ν*<3ΒαΊ“Œ N0 -‘ί~;£]@όqΏ ”ΆI‘Œ DŒ5kTΣύXΊl…ώȝ*EJΙ•;§ΌX«–γZσ^―ή2}†Ώs#ϊ`†» Βή}ϋνwςη_Κυ1xως•¦«zξ}b±?ϊ›<[PeςάΛe‹Θ}χί§³Ο(Ρ)B&³ο[ΉM…‘Ο‘3»ΌT»–Τνσ G?#Φΐρ!C‡ \*ŸΚ–U‡a„@Ι~Ωfβή‡ςφ‡φξ=ί—Y³η Ϋ/…"β°+ΫΗfLƏ-9$ˆΗO˜(_ξΩ£·3?ςˆ+VD;QVΞ†•«TΧωψcDK˜,\,ί(AβjάsfΟ.U«Ύΰ8D-]Ά\ήκΨΙ©η^ΩΉνsΗΕŽxC@ά‰τωΦmž"‘p―sμ`…ˆ(ίͺe iΦ΄±�ŠωqΖΜY:άτω η呇Rχrn)]²„­Ϊ‚Bά›pΓƒΛΤ"εΘ΄mΗNωωηŸε?O>)εΚ”q˜?~\Κ”ؘώΩΛPζͺ"Ύ+WκΉλxα^$S&έ4œ…!(²E€α^¦―‘ν°Ύ¦=ΈΕΎ�Ao³ι³ wLL#‘<7MΑ.mQ.κΐ©l͚urOΪ{δ΅Φ­$]ΊtΊ)/qΏ-DD!w6mΪ">šYZ·jιd ¬…ΰΊ‘Μu‘Nφ\y”υCπζ4ΨΏo)QΌΈnχΚ€)Ÿ¨Pl—ΏΥ:ήκΧ}Y‹γrδΞλyόPη.ΟF‚Θœ2qΌ‡>₯KbNΗΌ_=[ρμƒθξΦ[nqZ $DDpζ.§αVήlχΊΤ­σ²�Γ &Ιy5G–*Qά9ί�]ž/XΔ§UΫΡοΛ/wk‘«)0ύ³Oε 5&Hλ6lΦWμcφ›εΚe‹k4§=ΤεζΎOπCŒƒΛαC‡υ3¨VΝ¦Kβb�m§ΗυgΤΨβΩ…tπΠ!Ω₯Ξ Χ~ΟχzιuˆΔ!Μώϋο+²iσfΩ§ή0§PmεΚ™C]ΗŜφN«y»D©²ΊžϋOί{«ga “@…Β}η‡ctš΄i΄ΐξΛ]»ΥŸNJͺΫRI2�Ξ0iǎ]>ο1[v~ηmΑ9ΐMσ βω‡ϊAΣƒκ‡ΥΤsbU$<^mέV6nΪlš�K©οΊϋNYΊtΉζƒω*�σωœλ…’sτiLmΔ$DΔXB|Ÿ,Y2]?PX΅f~Ύ6nΨPnΉ%©Ξ>r”›Ž 3oΰίV .”iκ}Υώw–�ΐ?$@$@$@$@$@$@ Ž…ˆ nΘΨa   H\(DL8γ™Ψ…ˆ] $ΞλψV{yιΕΪΡUΥϋb[ˆˆF'+p04iΣ–-�’ek³ι·,WΆ΄tλ�Ω@ψΈšθ\ot!’αθm©RyΊFΪ‘JMy³τ yξ˜ΨnЦ}χρmρ™{?ΆΝ˜zνs‡q΄έ€ΌΚ#/Π΅ƒ}α Π ˆψ°Οš9ΪρJξψψ@?}κG„αUη§γ?Iυ/ϊwΝGq”ΏBD7”1³ΧˆaC0Σ¨ο•άΧ‚"z•5yp6hΤΤ'΄’Ωg–Άϋ¦Ι3Kw¨Z“ξu`κ‡"DD[ΈdΪπZz ½ΚΩy:w‘…JΘ(…2!b ΆLΎΫ™ωα^¦ΝH„ˆωσε“α*|¬κΤomΘΨpΖΔ΄—BD?6€)PΒ}�’UfΤ.γ"ΪϋΜΊϋΎ4ωξe°BΔH�<ΧΦ8C† ξΓ;Ϋ("’P(s—Σhˆ+p˜FψΨ`RtBΔpζ�`Žι.qΦΈ±£δΙ'žpο�ΫΣuξΪU/Yζμ·ΕΊ˜W―UΫGœΰiκω–2e ]ΗKΜjsr»Σ9Šf%!b f—,]&ή~Ηg7ΞeΑΌY>y6ΚU¨¬] 1P9“α'\؝0.λΦ¬tM[ͺ{Ψ-δsΧΑv8οό"¦Ώ7½WsNήΩsηδ₯—λωΈ\!’S(ΐJ πβΈF]whj¦ρφP?¨6Ε$DD;pxΔσΔ8»Ϋv‹j±σ«ΫΥ]Ϋ$@$@$@$@$@$@ ‹…ˆ kΌΨ[   Ht(DL8Cš/Ι›/Ώξπή―φȊeK‚κό-ʝ¦• Σ†tVΉ™Wdγ[z½m)Sͺ€γΊfχοόω 2mϊ ΟΞ·Χ!^κΠ‘½γ"fΦFε‚4B9€ΈΓθΪ’§Ύύ Ιi·g―Ώ¨œΰήξπ¦“ενημ°VπΡ·G·ΞΪΕύ‘‘ιΆnΫ&Ÿ~ς™_W4ρΙ€ ς”ryΔΣBE’œ“¬¦Ήz•„9/½T[²+‘h*%X4�• .’w:ϋ‡IgL*¨ΠžυλΦ•,Κ]Λ8 ™€X.‰}ϋμιHgΚa Α^«W[Hξ\9”sg:'œ1ά‡Κ”―θ#~ˆτ>AˆS8τΨiΰΰ‘2vάx;Λs"™έ»Jξœ9>Sπθ±c2vμx%‚œg²τBƒ”γΡσωςϊ0ΒΉ­[·^…; £’tΘ°αΗF;U}‘²tλΪYguμτŽxΔ.g·3tΨ9zŒ½;ΪυPΖ α<;½έAJ«9Μ8=š Μ*Br.T�~+˜αυΫ:¨ϋ9«_”pcΐΰ!Ρ@L .deΛ”–τΚmιŽ;nwŠwνΦCζΜ›οl›•H�΄a‡λφΰ˜γΨΛF κK#VςφΫSΫΩzύπ‘ΓκzΨ ξ—>ϋ θ―ξαg}ΞΙΐ57rΤhAθσ˜R°σ\ΣJ*'/Μ±ξΉΗΐσc΄Ί½˜b8Χκ!΅{½­Τ―WW;kΥ¨υ’skT‰θ�ΪΞkΑ†ϊ gLΠ‹HŸ›ΡŸ‰χήφoΌ&΅ΥσΦvΫCI8ςu|»“§(}ϋΦΝϊήBHtά‡ΟηΝλ< ΰ`Άυ‹mςϊν}„ΠήG™7g¦dʘQ»ΒE爈ϊ‘\¨�ŽšK*Wͺθχƒβ-^¬ΤPΞ+…:wy΅LZmZ½κsoβΉ·sΧ.™­BGχξ%�Šι½*ΤΉ+˜Ύy•Α˜το�‘δΚ‘Σq…CΉΣ§OK―>ΙjbΨNζΪA^ϋ·:x†¨΅ŸEΏ_Ό(Ο(l7αάΣȌΙΩΦ§βՍPžaΆΈn¨ως>§gM»83Γ}ϝπl_ͺ\½ζ<»,Ϊ(QΊœ~§ΑuΦE9fW!ΕοΊσN»˜^Ηύ§ΘΚmt�ƒ~ϋ‘aΟ#'Oœ”Rε*x–σΚ υΏΟοK‘Bυ½ιnηf―ϊψΝΰΪ±γ›ϊήwΧΓ6~LΡ―� YΉj•Χn}/C˜4i”‘)ΗΑ‰“'λpσ&/˜₯ύoŽκω7lψHΟj•*–W!œ[;aΕQ’ΠΝΚ±±Νλν<λ0“H€H€H€H€H€H q 1q'Ο†H€H€H€ ܐ%κγƒ(Daι�₯‘?�Ό,G”@Ε₯ΣΙγcsΦ¬Y%]ϊ΄JtyVŽύI…y>S΅λΆ�2™2>,Ώ_Ό$Η•Θ%”s½nNδuLpΝeQα΄Σ₯K+IoΎY‹•φ�xΐοƒvlb‹τ>‰΄/pψΙ”ιaΉτǟrπΐ‘ ξ1ˆ*ξWᝏϋ)(q]€}Ό^υ1=ώΈrwM’D‡ ζZΐ5—V…ΏM…Š<}κgΝ3±†FΔ΅ϋΔγOHκΤ©δΤΙΣrδΨQ±­ΧΈΑeξΎϋξ“;οΊSΟ=―ψ κšσj+˜<άΣ -ŒΙ©§‚κ§έv8ׁ]?.ΧΓ“ΈμŸ},xZωœΊΎά½;€yγš'oωηΚ?²}ϋφκ~±e£ΒΩ.Οσν.E»Ιu€ΊYΤωήts9zδX΄Ξ¨Ρvβω!εΰxϊτ/ ΖQ β²;ξΌC…ώ2ΖΉη’»ζM?ψΐκ/Ωδg56ΫvμΈfΗΓqξ»χ^Ή'Ν=ςί�ύW_«C»dp-:κ;?援i�ͺρΏ]�¨D:x(¨χn/3gΚ€ΟρΦ[oΡLΏϋα‡h‚sFβqΉW=ϋ.^όCΎΪ»7¨z±Α+��Ψθ+Ϋ      ˆ]"Ζ.OΆF$@$@$@$" CΖβ$@$@$@$@7ΫmξΐΑƒςBΥ7Δyσ$I€H€H€H€H€H€H€H€& ζΈ±Χ$@$@$@$hPˆ˜h†’'B$@$@$@$„Ÿϊι§t Y²d‘’%Š;α|–!Ο™H€H€H€H€H€H€H€H€H Ύ 1ΎŽ ϋE$@$@$@7 oζi’    DK ΟοKΩ2₯ύΚό~ρ’T©V#Q‡συ;if        $8"&Έ!c‡I€H€H€H q 1q'Ο†H€H€H€H <]»Ό+U*Wr*�zζŒ|ϋνwςαGύεπ‘ΓN>WH€H€H€H€H€H€H€H€H > 1>Ž ϋD$@$@$@7 o Αζ©’             $J"&ΚaεI‘   @Β!@!bΒ+φ”H€H€H€H€H€H€H€H€H€H€H€H€H€ΌPˆθE…y$@$@$@$@qF€BΔ8CΝ‘             ΐ5!@!β5ΑΚFI€H€H€H€‚%@!b°€XŽH€H€H€H€H€H€H€H€H€H€H€H€H€β' γηΈ°W$@$@$@$pΓ ρ†jž(             @"%@!b"Xž    $"&”‘b?I€H€H€H€H€H€H€H€H€H€H€H€H€Hΐ›…ˆή\˜K$@$@$@$G(DŒ#Π<              \#"^#°l–H€H€H€H 8"Η‰₯H€H€H€H€H€H€H€H€H€H€H€H€H€H Ύ 1ΎŽ ϋE$@$@$@7 oζi’             $Z"&ڑ剑   @Β @!bΒ'φ’H€H€H€H€H€H€H€H€H€H€H€H€H€ 1ζ“    Δ  γ3B$@$@$@$@$@$@$@$@$@$@$@$@$@׌…ˆΧ -&   †…ˆΑPb             ˆΏ(DŒΏcޑ   ΐ A€BΔb˜y’$@$@$@$@$@$@$@$@$@$@$@$@$@‰˜…ˆ‰xpyj$@$@$@$Pˆ˜FI$i�[€q³ζz‰οά±MΆlΪθΣωG}LJ—+ο“ηήΈςΟ9t°;›Ϋ$@$@$@$@$@$@$@$@$@$@$@$@$@ ˜…ˆ xπΨu   H (DL£X½ΦK’!C§³ί|½W–-Yδlcε™gsH±%}ςά�ϋί�d@ΏέΩά&            Hΐ(DLΐƒΗ�“   @b @!bόΕGyT*W­ζΣј„ˆηΝ•‹/ϊΤΑΖεΛ—eΞΜι~ωΜ             HΈ(DLΈcǞ“   @’ @!bόΖ–­ΪJ²δΙ΅ˆπΦ[oΥŽIˆΈvυ*Ω΅s{ό?9φH€H€H€H€H€H€H€H€H€H€H€H€H b"FŒ     DB€BΔHθ]ϋΊeΛW”'žόόχΏ�•/wν”9sιƒRˆxνΩσ$@$@$@$@$@$@$@$@$@$@$@$@$PPˆ˜PFŠύ$   DJ€BΔψ;°i�¦•:υJ’$Idǎmrεο+’'o>έa γοΈ±g$@$@$@$@$@$@$@$@$@$@$@$@$Χ(DŒkβ<    € }pΔ«&Ν[JκΤ©ε?ώCΙσ -DΌ|ω²άtS}>όρ§όφλ―²lιbωύχ ρκΩ             Θ Pˆ9CΆ@$@$@$@$ #€w «ζW’Γη�ΊΞ›=Kψ1$!’WΧήyλ–Νςω–M^»™G$@$@$@$@$@$@$@$@$@$@$@$@$@ Pˆ˜@Žέ&   ΔB€BΔψ7’)S₯’¦Κ ρ¦›n’S'OΚ§S&κNλˆψΧεΏδχσηεΟ?�”T)SΙνwή©ΫB#�ϋί�dΪ§“εΔ‰ροΔΩ#             °Pˆ6V"   ˆ-"ΖΙΨk§N½†’6]:ƒαθ‘Γδ�Ε‹Ίρ˜„ˆ©Rέ&i�¦•Γ‡ϊtΒΖ—^�'©oΏ]η_ΈpAΖ¨v™H€H€H€H€H€H€H€H€H€H€H€H€H€ Η8ς,H€H€H€H Α 1~ ]ΦlΟH©2et§vοΪ)«W­p:“Ρ)豑b“ζ-΄3"ŽϋδQŠY$@$@$@$@$@$@$@$@$@$@$@$@$@ ‘…ˆ qΤΨg   HD(DŒ_ƒΩτ•–rΫm©uεοΎέηΣ9Έ¦I“Vη={VNž8.Ώός‹lΫΊΕ§\ &ΝZ8�ˆƎ’ί~ϋ-PQζ“             $ "& ΑbWI€H€H€H 1 1~jσ–­$eΚTAwκ�₯‹2rؐ ΚΧkΠHξΉ*dœ?wΆμ�ρ‡ κ±             @ό&@!bόφŽH€H€H€= γΧC,xǝwyvꦛn�‘•±α•ρ�Ή³ΏΙ€ γ<Λ»3[ΌΪV’§H�³‡ μ/�ύ·»·I€H€H€H€H€H€H€H€H€H€H€H€H€  ΰ ±Λ$@$@$@$˜Pˆ˜pFσω…$Oή|ΊΓί|½W–-YδΣω€Io‘+WΌΕ…ΟfΟ!E‹—ΤεQfπ€ώ>uΉA$@$@$@$@$@$@$@$@$@$@$@$@$p Pˆ˜pǎ='   DA€BΔ„3Œ1 ΫΎρ¦œ?^φ~΅G< §OŸ’tι�Kn%^Μ’ε1I’$‰>Ω―φμ–•Λ—&œgOI€H€H€H€H€H€H€H€H€H€H€H€H€’%@!b΄xΈ“H€H€H€HΰZ ρZ޽φc"ΎήΎCŒ;="Ζr,@$@$@$@$@$@$@$@$@$@$@$@$@$pPˆ˜pƊ=%   DI€BΔ„3¬ωςΌωςλΓυpΕ²%>oή²•€L™Κ'ΟlόχΏ�„svΧ1ϋΉ$            HΈ(DLΈcǞ“   @’ @!b’Fη$’%O&™3g‘»ξΊ[R€L‘C5=|HNœ8α”α             @β"@!bβOž    $8"&Έ!c‡I€H€H€H€H€H€H€H€H€H€H€H€H€Hΐ‡…ˆ>8ΈA$@$@$@$Χ(DŒkβ<              Δ. c—'[#   ‘…ˆ!cq             ˆg(DŒgΒξ   ΐF€BΔmΔyΎ$@$@$@$@$@$@$@$@$@$@$@$@$@‰…ˆ‰mDy>$@$@$@$ΐPˆ˜ΐŒέ%              ]@ΈI$@$@$@$·(DŒ[ή<              Δ6 c›(Ϋ#   ‰…ˆ!αba             ˆw(DŒwCΒ‘   ΐE€BΔkΌyΆ$@$@$@$@$@$@$@$@$@$@$@$@$@‰…ˆ‰oLyF$@$@$@$ Pˆ˜ †‹%             ?"ϊ!a    @\ 1.iσX$@$@$@$@$@$@$@$@$@$@$@$@$@$ϋ(DŒ}¦l‘H€H€H€H "†‹EI€H€H€H€H€H€H€H€H€H€H€H€H€H  1 »D$@$@$@7 o€ΡζΉ’             $F"&ΖQε9‘   @"@!b,v•H€H€H€H€H€H€H€H€H€H€H€H€H€<Pˆθ…Y$@$@$@$@qG€BΔΈcΝ#‘             ΐ΅ @!β΅ Κ6I€H€H€H€‚&@!bΠ¨XH€H€H€H€H€H€H€H€H€H€H€H€H€β% γε°°S$@$@$@$pγ ρΖkž)   ܈²fύL?N’$:|€Œ7ώFΔΐs&ˆ#₯J—ή½ήΧG{½έ[²nύϊ8:2C$@$@$@$@$@$@$p£ ρFΏxώ$@$@$@$p Pˆx ΗwΘό!—/_Žƒ£ρ$@ρ‘ΐŒiS%yς[ελ―Ώ•Žή‰]ŒW}J•2₯΄lΡ\žxβqI“&άt“R°©4yΚT™>cfΐΎ>όΠΓ�ϋƒχτώ™3gΙ¬9s–εŽΈ#0qάɞύY}ΐλΤSχΑ7~―]«¦”*YBη―Y»Nυ'zύΩgŸ‘6­^ΥλΗ~ϊIΊtνξW—$ΰE€σ•„‘Χ΅Λ»ςπCιΎ9ZΎΨΆM―ΏX»–”,Q\―Ϋσ„ϋ¬�§O'KΞ—€I“ΚΑC‡€r•κξ"ά&       kB€BΔk‚•’    K€BΔ`I]ίrI“ή"›5W4oΡΩΉc›lΩ΄1`§ -.?ρ„€H‘R hn�εώϋί�Κ… Τ‡ΡyrβΔ‰€uΉƒldΥyω%΅~ΓFΩχν·φξx·^Wυ5₯κσϋχΛκΥkβ]��W‡φμΪ�ύνwίKΝΪQγy½ϊߏ‹k~ޜ™’.]:Ώ�ŽŸ0I>8Θ/ίd<—;·Œ5\oBΘφQΏΝ�X_&΄{3ΦΩ œΙϊ~ΨG—ώςΛέR―acϚουθ.•*–Χϋ–.[.ouμ€Χ«T�$έ»uΡλ§Nž’’e£Κx6ΒL°Δε|`–«B/͟#2dΠ-½Χ«·#@Ώgw©X!jX²t™tx;°°@Ώ€X±’Ίϋφ“)ŸLυθ³H€H€H€H€H€H€H€H v Pˆ»<Ω    @ˆ(D Ψu*^½ΦKΞQtα›―χΚ²%‹<{Sϋ₯:rίύxξC榍λε‹Ο·άΟΧžΒ„*P@ž|ς yβ±Η$…>=zTφ}χ 6BΜ9sν;δ δ^† ‰^!œιΐΑCƒ¬y}ŠΑ]t‚£λΣ³λ{TΓ…BĘǑEσf�β•fΊΰεΏ�–=»χhG+d¬\ΉZΆlέ°‘Έ%΄{3 ΄kΌcΚΔρςτΣO飴οΠQ–/_ιyD =±03q9DΠΝ’j¨σelsδΘ.ƎΦ|;&ε+ΎpC°ζI’       \_"^_ώ<:    άπ(DŒ�—ΐ#<*•«Vσιh !b %X|πͺƒ Ož8.Η~:&7©�ξ½ο>%PΌ_Άlή$ΫΆRˆθ47š5m,―4kͺΓυyφ·³g₯S§Ξ²iKό£P?ή{S\ζΑ…ˆΎΤ  }ΉxmυοΫGJ ½‰0Φ‹—,σ*ζ™wχέw«ϋ»‰ή·fΝΊhE‹ž „™ΠξΝN-֊>–εQ™9ύ3έή‰γ'€tωŠΫ¦1 ξ“@\Ξavρ†©κ|BDΐ6uŠ<©Κ‘ZΆj#7mΦλόC$@$@$@$@$@$@$@׊…ˆΧŠ,Ϋ%   Š…ˆAaΊ�…ZΆj+Ι’'—Λ—/Λ­·ήͺϋβ%DL�Κ4oΩZ‡bώηΚ?2{Φt9vτˆOί¦E¦λC``�ΎR΄h}pŒηž―φΚ7ί|#/^’<ΟεΈη >}ZJ”.§Χ―χŸP?ή_οώΑ…ˆΎ#aΈPˆθΛΕkΛvΠΛ—Ώ\ΌtΙ«ΨuΟKhχζυΦ©γ[R»VM}hΈΉΒΥ5P’1ζ“@Β'κ|[BΔΚ+HΟέ4ΐ+WI»7;$|˜<       xM€BΔx=<μ    $~"Ζο1.«ά›žxς?Z<ψε�’#g.έa/!bωŠ•ε±Η£\WΆͺΠΛ›Uf¦ψC ^έ:�ώΧt‡N�ό³΄}½|ύυ7>lΫ¦•4nΨ@η >RFŒŠ ιχΞΫ%σ#™δΜoΏΙάyσm=υT6Iž,™:tHΎΨΆ]>θσ‘O[*”“ͺ•+λΌ™³gtukχz[ΙϊŸ�θrέ{φ’ΓGΛ―΅•l*|4RΊti呇�λ8ώύτΊω3zΜ8OΧ78A½ΦΆ΅vΚ”ρaνyL…&όϊ›}�η£~ΓO§Raͺ›*ΧΘŊͺc§lχ·_ΟΘξ={dΪτ™²mΗsx±Ο3I’›$gΞ(1ηί_‘έ»w;ε°²aΣ&?a’O^8Η�<ω€{Σί+Y³>)~�]–,Y*kΧ�—φνߐG3?"ηΟ_ΩsζΚΗ£B[›cSηVΈPAΙ‘ύI›&€L™B.]ϊC>,ί�πƒ 88 ΄1|Ψ`IvΛ­šΪ±v-Ι—7<�Β|_ωηuM–O>ωTζ¨kΕ€θ„ˆ΅jV—�%Kκ’�Έ$­ΫΌnͺ…½lΣͺ₯dΝ–U.]Ό(―·{Λ―έ»JϊτιδΨ±Ÿ€η{½όφ?όΠΓ�²E3ΙώΜ3’&m}ύ€Ρ©Σ§d›ΊήG'§Nφ«‡ŒgŸ}F¨{δΡG3Λ< �(&’Ο?ί*ύ τ«ƒcuνάΙΙGύ€I“κννΫ�½Φαu/U«ς‚)ZΨ©oV,\δαZkβuOtλήΣTq–EŠ–z/Ώ€·<(ουκ­Χ#Ή7Λ•--•+W�ντTχϊ±Ÿ~rއ•Ίu^–ž—+κήy«ΓΫ~LΈz½Ω.κژ2υ3}V�TQ‹¨Tœ!Ψ„°zπΠα!°BS7’λm̚1M²¨λ©zΝΪκώϊQ―{ύ‰Dˆ˜UΝ—Έ‡ςδΙ-χίwΏάqΗνrεΚ9rτ¨Tγ7ω“©²sη.―Γκ<ˆ€Τ―«ζωΜrχέwι<Μ£jή:l„SΧΎ^χμέ«η g§΅bύΣgΞ’₯Λ–λ½ζΒ½ή§O_†όΩgž– ΚMωάΉσ²χ›―υ5θώ2‡ΐ΅πΜΣOΛΓ?¬Οχ?ώ£κ~^Ύb…š¦ϊ]?¦^8Λpž'C”κωηΖφν;σάΣκ<οΎλ.=wlΪ²Yη{>έΑ½\Ύ\YθΩ†ύ>κ#wέy§xΝ—‘Ξv œ}4sf9wώœž75¨/ωςεŒΟ-·ά"§Υœ·hɁ¨ΦN˜K1�O<ρΈ€M›VnV?:9~όΈμΫχτύx€ησ$œλο!xA:ύσ/’W]οw*ί}�½τPσψ‹΅jIΡ"…Τ3-₯ό¨ήΪΏΩQΏSΨ}Εz5•QσQζG‘tͺΏ.\ύͺόΌ eΦμ9ξβ>Οωχ?θ-U^¨,ΉsηRχφ£ϊ>Γό>P=7·lέκSל#2C}—‰-!"ήiΆlŠz�U½Η-QΚ§ά        Ψ&@!ble{$@$@$@$@! 1$\qZ8ϊ8[§^CI’$‰μΨ±M‹CςδΝ§ϋΰ%D„">ώBt3θγΎqΪW,fkV.—{ξΉ[~:ώ“Ό\·‘§0­Μ›3S2eΜ(«W―‘ΧΪ½©ž;{†<’)“^�λ―Ώ$Y²dzέώ³gΟ^iή’₯#ώ€₯WΟΊΘή½_ΛKuλΫΕυ:>―[³R;mB4Ζ3gΞΘ'“&h‘£_  §~6ΝgDTέ»vΦB ŸW7 h|£ύ[žΒœσf „6BV·PΧΊIRΦ―WΧlF»Œ-7’©S&)ρa”P3Ϊ^έΩΊν²n}”YF¨.Ζ୎ο(ι6Ώ"Ά¨b―Τ©o“ΜJΈβN”V¬όoHwsL·#"„.ΐbžωί�ώ' ‘q&Ί› yΫ\Cp`}6ηs~υΝύΰ.αt'O/)R€π«g2 &c”ѝZ4o&M›4r„„ξύ8�WZΆςΉ� ( Cpυά†Υ-,΅lv₯ΙS>‘ϊ}lgιuˆͺf©pΑ˜ΐ|μψ z°χόwά‘σμύ†«S8šχ½iί+Ν_yΥO΄σqΏ₯x±bΊΕ’eΚω =K•*!}ϋD "�ΊHaŽόΗΨ�έ’ζ4Θ ^$Χκγ^Ω΄a­v t’œIφ8B΄χVΗ(q*DSέ»uΡΕN<%%Λ–7UœεgŸNQβδ¨8™Φ „Ρ‘I“§XΉQ« B0]ͺSΏ`ŽG‚θlΙΒωϊΗσ H±’ΞΌo·a‡„΅CŒΫΧΠQ%”„ѝ’LAHϋžί{ί½ξjΞφ¨ΡceΘ°αΞv$+α>O̜F˜Ϋ jw'χσ€��Ύ©„δHΛ—―φJλN˜ϋρ @‚P΄\…Κ>EμλΘήh>°ΛαμŸώ)x^U¬ΰ­‘|‘β₯œ9,Ύ|�ϋƒχ΅ΤnΛ¬�ςΛ―κ<:ϊ=oΓΉ *$ƒφ7MΗΈΔ^|ωίη3ξɞ=ΊJ‰βΕΦ]²t™txϋŸύφάυΫΩ³žοx‡iΤ΄ΉΪ>GŸ=6άσel q¨ kW;γS₯Z Ωΰ G˜E$@$@$@$@$@$@$@±C€BΔΨαΘVH€H€H€H€Β$@!b˜ΰβ Z“ζ-•Θ(΅ΐehΔΠAς|B±υko(aΒ-rV}€]Ύt‘<—χyΉχήϋδζ›oVnk—δΔ‰Ÿ”xaAτœ‡p€§Ε+ΝtvχοΙ,εb‡TUΉϊΤVnvpΊrεoν'6Έ‡ύπγ~©V£–.g ‘§ͺυ6Θm·έ&%KwDWn‘Τϊ΅«1“ΧΗo[t±aγ&y΅u”¦fκŽ‹XF%ŠDΨh€ύ(g)_‡ΈΩsζΙΎoΏΥϋρ"™ωsf9"2τuΝΪ΅ΪΥ³r„s™eΛϋ 8ZΆh�œβšκύpWΫ�œψώ% I!O+Θ§Ÿ~J‹§ ’2)_ž·Όyž“ >¨βFŽγΣ?[(‡ΑμPcž2U*)[¦΄¦!ί-0Β5Ϋ€QCμ�©|ωrr›ͺƒ4mϊ ½4V¬\ν'Εq (¨‹<ψΐύNˆυθ„GAόˆω"΅†Mš8B³ cG;mΨχ%Ι½i‹y""yνΫχ­~ξdx(ƒΎl!bΈc‚φΓ½LίrηΜ)cΗŒΤ›˜‡ �Œ.u~·“Τ¨VU™Ώ`‘ΌΫ₯«^‡“dο^ολυ#κ:¬P9ͺŒέ–"Bΐ‡kξ¨Ί•ϊMrηΚ­ζ­lNQ/WΖ­›78σεϋχΛ—»χΘ―Ώώ*άwΏ,X@ ˜l!"ƒ+*�!$ά·Ÿ*‡J;ΑΉnΞ¬¨kΒoˆM2χ¦ΩΖ=ΆqσI­ž'%ŠΣ’dμƒΰΦν ‹ωgρ’ωŽ ο'λΦoΠsXΊ΄ι΄#dΪ4i$Ά„ˆ‘V&   ˆ”…ˆ‘Ό6υσ+ΡαsWέη͞₯>Τώ£±νoꏸ"ή~ϋνΞ]»‡©·ψ zζΜ―v6Χ―1)'h1Šνώ†Π΅M7 xdΫiΙ"žZ PQ}~Ϋ·nΦΞ’8PΎό…tήζ k΅XtΫφν�Έι+Nΰ~ΆqΣf?A ΨcέF…ο^»vS+n!"—]UxΡ•«V9εΐ β'[ΘaΈGD; 8%l‡rv sňΒ"n\·FΝa©υ‘½„[pHΫ·oŸŸcί’Eσδϋ£„�n °³f|¦Ε1ΐΐ!ΤݜͺΉ_Qξ™Q"\³/¦%άβƌŠr‚sχΑ]מpΏΧ¨ω’ΤWξxFŒ Aλ Κ= ’\―κ½i‹ybCˆ!m;εlj»{A„uρΒEΣR$cξu`XΩ"Θ;v)±gS³+Φ—Ž0δ-λNοχμξ8ΫMωdͺ|Ψ·ŸSΔKΊƒ¦ζx8PΪ©TΙβ�χΓ>:Λν:‡Μ·Ϊ·“:/Ώ¨χC\ά«χ‡zΜ½‰uΤ^zΉžs5oΪD^m5WΉE](ίω·±7�YΜοφψc~zσΝ7Tτ/œPΠ¨nŠδybζ<Ϋν†k 9έΟ!{Ÿ—hlΕ�ΕZpvα: χΩ@)”ωmΨBDΜ?#F–α#F9ΝΓ-bY#Β�]«¦ œ3„„ 5uB�ΓYxβ„1:5φwκάE.\ŒUΒΉl!"œα"hΟcψ‘~lΡX »ΫΆŽϊΑ@ƒΖMυ3βX<�“ͺ[ΰΩΩ>ο•*–ΈI"Αυ°pΡzμΉλςεΛRΏQgώΖ³s6Β™(\T―»�„:_ΊλG²m_ΗxΓϋ        \+"^+²l—H€H€H€H ("…)N Α½«©rC„3Μ©“'εΣ)υρ£sDL–<™΄lυšO?ασΣ±c’DΜ<€>HΓ- "Δ‰γ|Δ|*r#Φ ¬Z±Tΰ5aβdι?` =<[ΉνάrKRΑGu|Π?{φœT«VΕq $DτθΩβ…–­Ϊh‘NΒvΕr;μE·ΟκΗϋ]Ϋ·j—78₯•.WΡLš6ν0§n·7Ϋ ξ½^½eϊŒ‘Lύ˜–F|BDˆBK•« »dBJ# f±’₯uήτΟ>•'L;σΩα)£;[ΐα%Xp ½\ΛΌΪ7\ΰœΗ6γθ7Ύw”@‘hc3‘K8BĝΫ>w\>φχBLΙΎNqŽ5jE‰°μzΆ Μ->²ΛΕ•Η?f΄δΜ™]ξšιΣ₯ΧηξfΤξ#ΦνsF$l‹y""B$Uϋ₯ΊŽ“œ»oξώ…3&α\v?l‘–νph—‰‹u;”οš5k₯ννΓΪB΅@aŸΒ�σ\AΆΫρ6Ί}ζήD=Ϋι Ϋφό§[ΈΪΙvΩ $^·ΛGΊΙσΔΜyΈ—ΚV¨δ#\ΆEͺp“„«€I•+VP჻ιΝ΅λΧK›ΆQ‘š‘a G½ψθJΦ{|c&£šύ,χ‚ZMλՁύϋJΡ’EτϊΠa#’)χZΫΦ�¨A}½ "Ĉ&…sΨBĞο 3fΞ’ ΚI―ž=t³Ζ³˜r7Πο#ΧZρ[§8B€0δHΙΓυНμpΘΆS₯=wyέΛxŸz4sfέάΣΩsΉ›ΥΫ‘Ξ—ž„™iΓθ1γdπΠaaΆΔj$@$@$@$@$@$@$@$3 cfΔ$@$@$@$@א…ˆΧn˜MΧ©ΧP�¦K§Cڍ9L»,‘©θ„ˆ·ί~‡4nφ―γΪ…σηW.Τ…P±™ gkĈp₯9vτv1Łέ;·ιp—F\g;™ωθ܎V.[¬…H„ˆ^Lφ~»=΄i‹ l‡½7ΫΏ!͌4iςιΫ€^w� εγ½-nD;p€4)I’$zυf%Ύ„(Ιζ΄Gχ�ςB₯Šz„΄+UάΟΏΨ*[ΏΨζ#"Ρό1β“Έ"Βξ…ͺQŽ“Ζιρ¨�–―ψ‚ξέ”‰γu8i8faάμAKšϋώϋοSχ{ZvσV½Χ£ &cƎΣλζ-£ης0»’].ξBˆΨb;™λ.!βΒy³•xϊ!έ%h—.]¦ά#w¨°ΰΫη6wν0γΨg�=sέ!/ύ½ι°³Ρ…ΤŒK!"Ζ{ΆrjΔ�N^coοΗz(χ&ΚΫbžH…ˆp%…ΣYt)�1 η:°ϋc ,\€·]νέ±ΎΧΝzu_–Œ3J:uO›πήΙ’%Χα•q@8EΆhΩΪ96Ζ}νͺEΐί�π£šχVΙκZΞω Ψγi‹ιl±Ψή½_kχOη€jΕά›ΘCΈj„­ΆΣζλtίχ8 Ž5]φάc‹°±ΌισΔΜyΆ±ι’-9{ŽτθωΎΩ₯—ŸoΪ C γ‡pζ3�€]»Ό+ΥͺDΝο^? πiDmD"Dl�¬…§k�} ΫΥΨλέΐ>O87j�Μ©Ξu`_[;½£:K/.ύϋFΉsvνΦC;λ"l8œ%‘Œ£-šDΎΧ}ο}χb—NΆHΦΎΦ»«±š₯ΖΜNpmΖ|Ρi‰�εό~²‘Ξ—vϋ‘�Sˆ)AΦ'      ……ˆ‘ΠbY    X'@!b¬#¨Α¬Ωž‘ReΚθ6vοΪ)«W­pΪ‹NˆˆB―·οΰ”‘œΨŽ;κlc₯”dΝφ”ΞΫ±c›¬_³Ϊg?7� Η²<*3§¦‡B”~υ‘’%Šλζ sD(d� ½ά~6¨'―·m£αvΫ©Q½š§‰σ 1"�ΚεK$]Ϊ΄g³J/T^2”χΆΛ”>H ά‘H!<™ϊΙdIž<Ή_M8ͺ3F–―ψ7±_!•aΔ'q!D4aŽΡ#κ°Ε;cGάΉr‰-NDΩAϊK‘Β…°m‚{&\4νd‹ΌŽvY{έp±σ°Ύ�~©R½–;;βmΓ#!"„>όΈ�Υυ7Κ°a#ύœψήνΤQjΦ¨ξ�pΫνLgZs‚@IDATŒK!"ŽkίcΨώκ«½ςr½X6ΩυβΪaΌ!:Š.E:&α\vμω(α€]7Τu8™ΎΪ’Ή#"Tίν°‡rp“ƒ«œ;Ahr΄§° ΒΗE ζjqν―Ώž‘’%Jι& ƒ8 ɈίυΖΥ?ζήΔ¦ΧσdΝΚεrΟ=wk‘XιςQΒp”}φΩgd�ψ±X·¨MgΖς{ό‚iΪύ<1sޞ={₯Nύ>MΨ"G„½†¨ΞNv(]„FΘa€΅«WθPΗ-\ΌTYΟq±Ϋ‰DˆX€x©Ϋ7c…cz₯-tu?‡ΒΉl!’qΔ,T € υC#NΜ‘#»ΐαɈm·G½#†?Ά#°-D΄]ŸMχϋPŠ+¦7½Δ΅Ψκ|iڎeί{K©’Q‘¦ν󊍢Ω        Έ Pˆθ&Βm    8%@!bœβŽρ`M_i)·έ–Z‹ΓΎϋvŸOω4J4–&MZwφμY9yβΈό’άΒΆmέ’σΪΎρ¦η αΟΐώQ!ρμžόOV)s5Œμ‘CeΞΜιφn�_#v(Ηz  r£F “ΌyžΣ"ˆ μ4tπ@)X ΏG‹°΄HsgϐG2e�λ^bƒ–JσJ³(w2/wCγpuωοΏ₯p‘β’K‰γμ―ΫΫ΅λK©ί¨‰^χϊΚΗϋJΛΛ{=ΊλffφΣ©Ρ_cηΝ„Y΄"mΫ΄ΦNR)S¦°wιu/!]ȈOβBˆh‡ζ4ξ‡?*a_Υ«ΒΎ1£†λσ° -^i&-š�λJώ»χ|%g~;#�\ωGrηΞεˆ‡₯DH£μΣσ Ί}ϋiΤ΄ΉΟώ@† φΓέ+y²d:„6Άgϝ+έΊΏ‡ΥXKFδHˆh=^neθD‘"…₯Qύz’-[V?q‰p#7a’Σ_ΫMšλ7ltφy­|χέχέΖβZˆˆλΧ…Ip›«R½¦@Ωμ³—‘ά›¨g‹yΌmΗ2/1- 1j΄ >�ξŽίzlŒI¨Χέ {ξ=}ϊ΄vJ³χΗΦ:Δf#‡qξ'8½nΪΌENŸώYΰ¨wηwJΣ&τα>ίϊ…r'nιwθR%‹«2MδρΗ²ψνƒ ±Y‹Wυ³Γ½sܘQ’+g aΨΦΟ·j±\2u_Ίτ‡δΝ_Π]ΕMΊ7ΈΝ}oζΛ“GFŽͺΫΫ²u«ΰΊ–)�牙σΌžq1 mΑ3[pμά�ροΏ―HΞηςƈwγΊ5rϋν©u9―w[ΈηKάΧ&Ε4G{]6γ°lΟCν;t”εΛWŠ—Ρv8Ε{Κ)uD— Η2bš»β»qΪΤ)ςδOθsιτngYΈh‰^η       Έ(DΌTΩ&    @Π(D Uœlή²• ˜*θc]ΊtQF’Λ·~ν %ΨΉE‹™ θλΧΖΓQ©¨0²Η—iŸϊ:­ωU`F¬HŸ>¬XΊX·eά‚Ίwλ"U*W�yUͺՐύ:ΗZ4ŽdȐ! ΡΛ%Ι""Δ2>ςΫΙ>\φžΚ–M;2’L·ξ=•mž]άgέΔδΊφτΣΩ".€;vIΓ&QβHΖˆΚ–.%%•“Πέwέε΄PλΕ:~Žxf§Ÿ„*D,V¬¨Εiځ˜NZ^iκ”I‚—αmA‚qвaeLBD#±λZ7\Ν;/ 5–L™qΒi’ސͺ7΄�³wΰQo�πŠ–₯-Πβξξξξ–—ΰP(₯ΈS4x°ΰξNΠβP(΄”βπ/Ϊβn�ωζ˜νάε.9KΈ$οτivwlg~3»›ηΙΛϋ₯J•�(~ςδ©tΨ42,N”$g[Ȝ8zH -ΕNέHαeώω©rΕ T¬hb§ΗSαb%κmZωP‡φmευŒ™³i²ίT£ΜΡ“°"²PišaύC8n5Φέ{φRgρN.9ςlr?Ί֚«Ψ<�Y”3gyː„ˆΦφ¦εXέΉ&,¨²gθcΰ6φν6ϊ9rηΣ‹έvώ}οžΤ°ΙU”…Υ?όhZD†τΜςχ’HαΒT΅r%ι@5jT9Ξ}ϋP‡NΎAΖΜNŠμ¨Θ‰EΪ&§ 6Ι°ΈςBϋግ›λί2έωUλΪ­§�~OΤ;Ο!"O„Cf³£ ‡ϋeηβώ?τ£JΛΛ9:œ–―Xβ|"²ψ4_Α"!φΏzε2J›&¬gνw]pi¦Ϋ™}ΰŠ‘E¬,fεdOΨiYρÏπ.DΤ£–ΏσισΔ9€€€€€€€Έƒ„ˆξ ˆ>@@@@œ&!’ΣθB₯a³^”ΰ³�WϊMX D μdΔ�?|pŸζΟυ—Υ|Ϊ΄§xρLΞ8μˆΘεzΚ“7Ώψcz ™uξίiσΖυz1ΞC‘ΐα_φQμΨ±₯ƒ;‰5iܐzυ0…HΦΕ"μŠ5fΤH9[‘™­ΉιLB¦Β ΚvέDˆξ;wšΝ†Es,žγΔN…I'‘‚.K1—Y£ΊΨiΙ�e4lΔ(kΥdžξΎΔ‚·’%JΩ¬λhΑφΝισδŸΛfύό‰Φ�ί`΅ %>αPΞuλ7΄ZΗZζ―ǏΟ—'€tEˆxδΰ~zϊΙΣ§T¨Hρ CρŸ9]8Vζ–ωΦΔ^:γDMzηŠ‹NšΓsψ[N=¦Ϊυκ»fYKΊHΛYœ“+―mΗ.εΙu-2Ί8&$!"·WIoΗyzΏϊ³sδθQ)tQν=†•‘ENΛ—.’€I’Θ!�X΅šΚАΊ Δ—ΧΦBsλsqδΩδvΊњvηφ-ΖXά!Dtηšθσnθυψ|Ε²%τέ·ιdvz θό_,«Έ|­nΉ£†MšΡΩ³Ώ›υ©‹‹yfΤ―G}ϋτ’}±0ΊJυZfύͺ‹}»wΙ=Γ.z7…SrκΤ©eQ οVΔ!©-“34Υ‡ϊ–qhbζ©‹θUwυw3ίυΞsVˆΨ�‡ΎT·Ά‰ωΟ&R+o/αXύ)½|ω’J”*’c)sm!’ώνοΫ�G)>Υωλ{hϋŽΤ½go£Ψ™}ΰŠ±ίχ}¨~½:ςώSό¦Ρτ™³Œ±„tβn!bHΏΛ„4GΚυ}όοΏ�Κο–#νQ@@@@@@@%!’£ΔP@@@@ΐ­ Dt+ΞPν¬P‘bΒΚ$6ϋύμΪ*„Yz*R¬8εύΚο·Σ§hΗΆ-z1±Θ1q’€2o.œ8vΤ¬‘G`Պ₯”.mZ)d‘ ']XΗ•…Γά·ι�b8[BDK§ΏT)S�Ί5+₯£‹C*T�jULΆ|ιβ a?ν Ι«‹~N‹ΒMš· ”.ό±&Z5搫GE]¬ίλΦ­ΫfyͺL1δλΰάϋTΘ_KZΊly«}©>υcX μ 4Γ–ΞŽΊΘƒΗΪBDΎΗΪΥ+θ›―ΏζSαi{}"2˜ͺT�(ϋeρ* ?T�CφZ"²pΦRΜΕmYΠ±_π‹-šμͺ`αbΖϊ²¨oΛΖuRδΙ…;u‘½ϋƒ†gζ> .HΫΆ›‹ue‡~„•Qk;~‚Ό|Z“.ήcaYK�Χ–3§£Ο&‹NY|ΚiΫΆνβ9ϊώ̉ͺW­Bƒύd\»Cˆθκš8³Œ |8a!‹±8±K&»eΊ;M™4Š),»?a’YΘpf°nυJ#|�5!’­y²Kλψ±£eΏΧ―_§ΚΥjZzΏο{ —ΙνXUΈ|ε U―i}©•ςηΛ+/m…gfQό­Ϋ·ά"Rtε{βͺ‘]`ηΟ Ί_8d°o· I°ΗΠ"vλβK-š7•cψν·3ΤΈY ³ρ¬\ΎTώ^Α™–ίgφώr44³ώncaiυZuˆ…y–‰§ω2U*βύ₯’;„ˆŽΎ/Υ½]=ΦͺQ~Π_vΓ�HDύθjΏh       Ά@ˆh‹ ςA@@@Β„„ˆa‚Ω-7 Iˆ-j4κ(By²k"»!Ψ·‡Ž="ο]¦\ʚ-»™@μؘ] �ξηΚχD½σœuDδ1lΪ°–X§§½zΫ2;ϋ>Pύ+α ½‘™ω~›ΕωΖI½s’DB-›55B­σ;Έ\…Κfοgφ+BDߜY3w8‹η̝GΏž>ΝE2Δt©R%dψζ«b?ιBZwωŽΌ/ΉΎ;�²%‹(CϊοdWΆςξΈϊEBDEGBBď‚έ©›†$DδN‹•,%ώΘkr+βk›D‰EώΟל~ΩΏϊΕtŸaB€E‡sf͐λ°gί>κΤΉ«Ό/‹ͺU­,B‡~G―ίΌ¦Σ§NΣogΞP€£ΤΆm;d½5«–SšoΎ v¬Ož<‘^>6…v,μ άΉΝpŒ»xι’?Ϋι‡B]eYψΘΡ΄xΙb+.οΣ«5jΨΐ²jkkBDF5Hε!Ή8V(_ŽFf΅ΉehJ½RX Ω rβΟcυ[Ϋ<·&φR-nd)j²Ω‘(P’K!"·ρjќΊψv’ΝΩU³}‡ΞfnT\਑ǹkΗVC #;�πƒE‚Ρ£G—WΆ„ˆz}kη֐r=]θi­Κs—Qw$S}Ϋ:ͺpαση'Ώ)₯³γϋχο₯»Ϊn!ΎΥ“$qžώΞΠλπΉ£Ο¦Yφcyν.!"χλ̚θϋάrlϊ΅­} ΧΡοΟb>υΉ3ρ{\w=΄μ›-cΔ0νwΛgV -ΫθΧϟ?οφV†ˆU/SηϊΊςσU¦|%CΨͺꨣͺΛΏδȝOeΗΐΫ(qβDdωlͺ νΪ΄¦6­} χ^•―Ωy�BDξΣΩο‰zηΉ"Dd15‹ͺU )D΄3οΥ7Υso―‘Ϋθ!ΧωΪ2ρ;†CKϝ·ΐ¬Θ™}ΰͺ‘E³Σό¦ˆ”Μl,––Žžξ":ϊΎ΄—£Χό»ίάΩ3e³λ7nPεͺ5νυA@@@@@@@ΐa":Œ @@@@άIBDw� έΎ .B šΒ?žων4mίΊΩκ sηΙG…‹3Β—ͺJo„ΐhΟ�Bμφ«ΚΒ1 Œ=’Κ–)-οθ¨HC 9άπΪuλ¨NνΪ†°…;d7*ί�έC …©„άfΒ€)4ΫŸΪ•Ψ­�>O–Œ$ˆo΄πΣ Z½vq­NŠ)B½{χ0½T>Ωνn�ƒ4mϊ bηG•ΨY¬BΉ²τEŠ/T–q|τθ1-]Άœ&Mρ3ςlphΠFPNZ3nάΈ†wύ†Τ―�«ΝΨGqβ˜\₯ΈΒώΏPϋŽ­Φυ’�<Ήs‘.pQ!KϜ9Kš6—ν&MόYΊ9ώ%k W;•κΦ©M;v0γΘβ‘'O�ͺΥkhΔ°‘²κ˜qγ‰Γ[[¦cGJηDvΖμ,\PνIG X±b‘ehoΥvϊ΄)�‰Š―Oœ8I-Ό[©"yœκ7‰˜«JOž>₯BEŠ«K«Η"… Ρπ‘CΜζΙξ…㒏OKJ™"%±\Zζae'Ž'Φ.‡Y;usLŸ1“Φ­ί¨²‚YXι%ΔCργΗ RvυΪUΪ³g1[[I…LfXώBEmU“ω!‰€τΖ§O›B_+ΗE.[Ίl >B―&ΟY°³(`Ύ!δlΦ�[�]Š"Γ‘g“έέ&Ύ^%žηα>;Φ'T₯J%ιάjMΘΖΟτδI&nΆφ¦κΣςθ̚ΈΊΤt±Ÿ­ύ―κ:{dΑΡ€ώύŒ0ηͺήo‘Σό¬>³,ΌώΎwoʚ5³™#₯jΟΟβψI“m�½ͺ§ ΅‚{wqύΩ3§Qή{ΦtΩU›Ά€`]a­�ΨiwιbΣ·«Gο>"ΌιUpCχαΔΛ‹o½ξΒΚe,Žεo(Ώ–,]ΖY2ι\›4o$\ύ°Αƒ‚}w©~ψθΘϋRoηΜ9‡VηλœFG .r¦΄‡@ˆθ.Tp7έMΤsϊK”(1₯ϘI θ=]Ήt‘nήΌι9ƒ‹„#a υkVŽ„ΗŽ§οθO·oί ‘†">}φL†”ε, ‹+B3Ÿ.ŠφτΑόίΈCώαŸΊŠ•(e¦1ΔA8Yο›Y„~MφyRzp�]Ώώ?rωj°½1+€$K–„^Όx%„–Wm:=Ϋ‘‡fΛ–E„’ώR„μ½GGŽυπΡ:?<ͺ€J•’Ξ‹0�η�Ί`wG,Ζϋβ‹/賄ŸΡ£d¨ξφŽή9ο£ ι3P<ρœάa‘―έΈnΧ³’χQΟ™mz.τή½Γtο9³&�ξ^CέΡ³~Γ&ΑΊ Ί²ζ<Φ΄BδωκΥk:zδ¨CοXT„¬�τΣΈtηφ]ωž΄ηέΞγΥΓΏ:Ψ•ΉYkΛοχτ�S !Ώ�Ο}Ί ~Χ°wΜΦϊ )Ο™οIH}F€rXfΚ”ήΌ}GgϞ Υ΅p7ώΞ§OŸŽΔΏ [·nΡΕ —zfά1†Πκƒίu›7¬“ξΏ–‘uOτ        LBD쁏JBďŠ7dΨMhθΰ”ό‹δΖΜοάΉ#ΕYό‡j―όώέ{!byEώsηu¬ B;OϊφιE κΧ“΅9 lη�ένl‰j  Ύ °ΘoΑ\ι€7Ωo͚νΎ'€ΎLι�4nΜH™sοή?Tͺly­τγžV―Z…b 'VGΣ?ΒΙoΧ�@G›‘>x ήϋϊQާKχžΔΏw!€€€€€€€@X€1,(γ    6 @ˆh @ T°£ΣΰAˆΕ#Α%έ΅ΛY!"‡ ε·E ’\Ήr!н}ΪΠΡγΗƒ»=Κ@@<”;ίqΘΧμΩ²RΡ"… §έι3gΡ!΄τ„ΔίΊƒφ:5”»χξQι²œj‹F         ™ @ˆ™Ws !’,†) pHΒμΩ³P¦ŒιΫoΣQ’D‰(Ξ'±E νχτR8"vφνn„0vVˆ8vτH*[Ζ\πΈfέzϊqΐΐHΙ“ˆ@ aƒϊτ}οžfSωγά9ςςnν1‘m]"ήΉ{—Κ”«h6?\€€€€€€€€€„LBĐ‘€€€€@(€1α’kpΕσ)cΖ Δα*q‰4pU«R™ή½{G/]¦½{χΡ€)~nΊψτ°―7oέ€“'NΡΠα#*HΉ»2Š)L•+”₯δΙ“ΛϋqΏ/^Ό€ζ^­έu τγαR§JE?ύΨOŽrνΊυ΄vΓ&qΨoςψ1'N\:χηŸ4jμψ°@½cΎ<ΉiΒ8Σϋν—C‡©{―Ύt¦ž?­₯‹ζΏ ^½zE ›zΡί7ozώ 1B·€Ρ­8Ρ€€€€@x!!bψX©θΡ’SΓƍ)zτhrΐΏώŽ;j6ψ–-½‰’Ό7Λ³uqψΠ!ϊύχίm#"_φμ (Q’ΠΩ³O»Ž‘2·¦PϋΆ­¬φ]°Xi«ωΞf²γVƒΊudσџη�rΆ«0iΧ ^Š;6]Όt™φμΫ&χόX7ɝ+'±ΠŽΣβe+μrC+U²}ϊ+zφό9-m<9e̐ž Η=NK–― gϞ;<ά}Ϋ(z΄hτΗΉ?Ι«u{‡ΫGΤ�ξƒωώ3ιΫti$ž.=ϊΠα#ζΏ#DTnž8/~ηωvl'‡Άgο>κσΓOž8LŒ @@@@@@@@  @ˆŠpΡ5€€€€€η€ΡsΧFY•ͺΥ)EŠ/Œ¬ση�€έΖuT!²ςiέΖΈιδπ‘ƒtκΤ©ͺ‘"°"ξΨΌžβƍ#yέΎ}‡NώzZΈ!>§η/^ΠΔ)ΣάΚ‘…`γF—}ΞXDSgΜvk�ξξμΰޝ²Kv€lΣ‘³»»χ¨ώœ"Κ:™2gΞHοίΏ§BΕΛxΤ|,Σ±]kjά°ΎΜφνΦ‹Ž;nY%Δk­#reθο„K—―Pγζβ& }TΫ6�₯xρ>₯·oίRΝϊιu<Έ9€€€€€€€€@Ψ€1lyγn    BBDYˆ`†‘Z8eU¨XΡ¬†₯‘ «U«N5ŠY=ύ"ωηΙεε»wοΘφlzχξ­^Œsˆ°B[ˆΘ!89'§+W―ΚPœ‘ SAˆš€ο;aΒΟΘ«ySΩpίώ_μκΉ"@s|„�΅p‡±m+o)Ϊ½(skΦ�wm@¨΅+ϋ`Τ°AΔ‘α9α�ΑυγoŒnΎ©nνšr /₯ΙSg|όAa        aFBΔ0C€€€x=i5¬₯y‹–+V,zύϊňSV²&D΄ήΪ”«‹οέ½K«V­ �:Κ@ Bm!bώ|yiό˜’ΩκuhԘŸC•„ˆ‘Š7Μ;wE€Φƒu‡1¬Η^ξημ>ΰPν[…ϋ‡»~ππ!U¬Z+ΌL9B3i²€΄jιBΉ.wούCΥjΥ‹ΠσΕδ@@@@@@@@Μ @ˆhΞW    ‘„„ˆž½Π₯J•¦tί~+ά ίΡΩ³g)kΦ¬rΐŽ kΥͺMI’&•m·mέBW�\ρμ‰GΠΡ/Z„ .HΩ³e‘€‰SμΨ±ιωσηtυΪ ΊpιωM›Aχο?°9ϋšΥ«Rυͺ•e˜ξxŸšB>>|ψˆ.^ΎLΫwμ’υ7m+”/CU+U’Χk7l mΫweϊI§φm(Cϊτ2kδθqtνΖ y>vΤ0ϊ$Φ'tFμ»"ΜpνU)K–,”π³2ΔδΑ£GiψΘ±zWAΞS|ρ΅ςnAiΣ€‘/S₯ O>ω„>zDW._•cέΈek6�dτκΡ•rεΘ&ξ•Šž �Ώ�qŽ.ZJγǎ€("|ωΩ³O»ŽVoΡΖΗ‹rεΜAί|σ1Ϋ»wοΡ%ΑΥήβΒ–‰Y3dΩI“&–χδ‹ϋ�eατ¦�‹—/¨{―Ύκ�ι£½χγΜ[°Πͺ»υ΅oۚ�‹wΚW©SQτθΡι�MηΞύE?Ošlsο±Π©E³&T’XJ*ή#ŸHaτkQ�>ύvφwZ΅zΨ#�…zΧχ^Tα�š#{69ο7oήayππa kδJb7ΈΈq?•n”£ΗM±«~ίχ’Ι“‹΅ΊO? lΤO�έ·ΤΉC;y½lΕ*Y^©bΚ›;'ρ^~φμ9ύρηŸ4c–ΏΩ<ͺW©DEŠšάθŒΞΔΙ–-Ϋhgΰ=Kž³ƒfοžέŒόlβ}ΐ"2N'NώΗ‘―οˆp�‡šΒpσ΅žͺVͺ@eΚ”’oΎώš’&ILŸ<{ο*mΟΥΪυυͺ.«ww’&ΝΧτY‚²Ώλβ]qχξ?FίοήΏ₯ή}”œŒLq’1CzςjΩLΟ’ηηΟ�E3gΟ ’�ΝΧ©©GΧ.2�žpεΝ“‹$ˆO]ΈH#…Θ·N­Βύ―ΕοΟKbΎ?ό8Πxoιe˚™5¨GiΎωZ�‡Θ½rν:=z,Xw:―έΈa=J+ΪŎG�Ν•«Χθ¨Cm+ :οΑXβύvζΜο4Σ�> βηgΘΐ)šXcvΙ\±j,wΧ>(]²ΈμŸ;έ·�υk`Orδ{bٟ£οKΥΎ{—Nb=Ύ‘ǏQŸ~’¦PΎ|Ή)kζ,βZD—οέ­ΫwHΞό\•+k UnλΖύ4@μτμΕsκΩ»ŸΊ•qtφ9QχOοΕ38‚rηΘNΕ„λd�\9(AόψRτyθπQš8eͺΝwη’ωώβωόJŽ₯Q³–tωΚ5c\ΆNF*ή±¦tΒu†GίΌi«:ςA@@@@@@@<”„ˆΊ0€€€€@θ€1tωΊ�{’Δ‰¨vνΊR@uϊτ)zσζ­ψx.Ω₯#BΔθΡ’S //Š5ͺtUœγοοΚ°ΠΦχξ Ά5‹ϋBΗOœ RoτπΑT€p‘ ω*ƒER₯+TQ—Δb°ύΎ—Χ,ΘσnΣΑ(S',ΩΌnŌ“ή‘;6)!€λΛ—―„ γ½Ÿ©vκxψΘQκ�£Ί4;rHΚφm|€ψΠ¬@»θΨ₯‡ΥΉjUμ:eέ„±£ιΫti‚Τρβ…1kBD <€�₯ Ϊ–;c.“ύ¦Σ�εζ.’³§M‘L™LBΔ 7΅Θ(X¬΄EŽγ—Žάoμ„Ι΄bεj³›pΨΦΎ½»"2³BqΑΚοϋ S§~³,’a§™“­dΉXάΚ0{Rΰξ½ΤWΙ\I›Φ�$ήOŸ>£2«†ΨΥޝ[„θ)†χΤ�ίΔ¨― ΊXΈ[΄HA)6*|8YΏi 1ΪΘξί·7UͺPΞΈV'‹—­ ‰“§ͺKγXΈ`#ΔFφ€{�όCUkš³δηΆΏS–(^ΜfΫw�ƒ†Ψ,w€@½ μiSΏQσ ’ΐΚΚΣ}{iώΗΉ?Ι«uϋ ω… €1#μϋηΞ‹~LRΥ™·>²xV }†ΪtτUέΙ# +͟#Οy_ lZ{WχΊIΟnΎT«F5yikΟ©ΊκθθχD΅sφ}©Ϊ̝%„ιίΠ‹—/)0p/U¬PV™+U―Mε…Ρ·£i]wξ6 «Κ,rυŸα'/Y¬§?Ο�>'½Ίw!krβPΧ5>œΛ ν …·lέ‘εόwΚ’Β"βyη4~’_οΘ5�;S{IεΈλ;©ϊΓ@@@@@@@@ l@ˆ6œq#!’‡-ˆ6œΖ›P\αΜΖBͺωσζRžΌωœ"*\X8Ωe•=_Όx‘vξΨ�έ§aI@ �\½JόqžnήΎ%…N₯„ θσΟ“Ι‘X±CΧδρcdωϋχοιW!ϋσόy!,}MίQGΌy„Pυ •,WΩl:[6¬–ΞMœi͍©A½:†Πγ—C‡ΝœϋΤXU‡,ά9+άοΨݐΖTjαΣVŒε/u)Ή„sΤδ c₯ˆ–3ξ W·CΒMμ‘š*UJ*/Ÿ7“ά%°θΫ»U­\Qή›™μά΅‡^ΌzIE…ϋdβD‰d>�°&Dœο?Σ0ς³ΆC8Ψ=|π€² χG5O#6kιcζfΕΤpϊκ«/)Ο‘πε+W…«έ―2ŸpŸ“§Ξ0�=±χ~ά?;cκkΒ!B—Μ5™Ό{„sο₯Β… H·8nwSyjiΒ<ΞkεΥ‚ΌZ4εSιtwβΤ)Ίxα’θ+eΞ”‘²dΞ$έ}»ύ'4Λ—'7+ZXΆ‰&ΠJΐÎ}ΫΆ›‹qO 'Ek�²±?F ΡZ!^γΤ΄e+Ίpρ’Ν–Ό¦Σ§L”ε–b=]ˆ¨:`!.³|ψπΨ»©ˆέΝ,…ˆά�Π±QJ᜘=»ι}kKΖλΡ\ήTͺP�¬ptŒ#/W�^«²ερŸώ₯9σΜςt―၃‡ΔήΌJ©R€ βΒ΅’EηœΨr՚ufmΉ`7Nv3ε”GΈC~•:΅γ΄eσfΊvνͺΣBΔfΝ["’E Π“'O?ά‡°&ΐ‚žƒ"”£5ΗΓΕ όιλ―L!9΄&‡ΨTIƒY Ή»Α±e—p˜�S�©vΝκ2k‰pg›`αΞ6gζ4–ω[Yή§ίΪ³oΏΡ\CXΊΦ3‚ςηΛ+λϊM›I -1ΪρΙ‚93 ‡AvΛcΗ;vlT‰]΅:uhC“¦L➦κΨ{δΉ―^ΆX Y”Υσϋώtΰ—ƒ²9‡Σ9u%J”P^[ 9Δ+‡ εtW„€νΨΉ›Ωxϊφι)Β[WεΦΈΛρ£`ώ|4nτpy9?`‘Νπ­ͺΎ«GGο7d`*]²„ΌνIf»GŸΎfλ‘‹‹,Χ“Γς*_Άe‘‹}τΔαŒ?‰ύ‰U'EUOν%qέ¦Cg•νΆ#»Ψ±ϋ&§„X Ά}ΫV²ξΨρ“Œ0Ήœa)`cΑpίώ?™ PΉΞαΌΘϋΪZ�E^Ά„ˆ–νfML™3g”ΒΠBΕΛX›]³XnΎΛ±Σ‡ξχγ ³η–E~μΠΘιώV¬ZΛ¬½«όkά°Ύμ†Ε§,Ft4ν ά&Ηo‘=YάΨΆ•75oΪHήjν†M4bΤXjΦ€΅kν-σΪvκbμΑUKθ ρμs²\~',œ7K~ω}ΑN±<Nϊsr\ˆ‰;ϊv—ωόCί,ϊ�Υ ‰X« ΖwΐQ΅UGGφjΓΗ…σfΛπΣ|nhΝΩο‰;ή—Ί‘ωϋΟ]@³ζΜγ‘ΛΔοσšΥͺ’�ΌςZ�Φ "œ·™;�[±„XΠΙIwγtΗsb)Dά/Ύ+ 5{w6bώ=ϋΨ ¬3Ϋ+κυξχ£kp?Τ^RuμYSUGΟ!!’η¬F    † D CΨvή*vμ8ΤΈIιjΕΞe«W―”-qDd1FΥj&!ΪγǏiρ’…vŽΥš€.ͺaΑ Ujγγ%Œ6–—;vΚπΝͺ,Έ£Τ�i1Έ2ξS‰!Ψ‘¬VύΖf’]”³\…Ζi.hμ~ΖBDNμΘmUΈg™ιζzjkB7]ΐd)DTΒRΏƒ9Yΰ²zιBιφψρ*WΩτ,YNΑQa e{G―½ί~!όŠ&„kμξW³^Γ λΑbK]r²\N›4ήpψ Iδgkj/Y[[mΙg―%§ ›·�Πα£δωάYΣ(±qυΪuCT6lΠ*YΒ�Ψ�%TίΧ,’jΩͺ™³€μ4„‘-DΤ…€μvΘ�‡–iωβω”*eJ™mΝ±Τ²Ύ#ΧϊύΓBˆ8R8όqX\ύ9ηχ ΏwŠ-B#†”ΓοΡη)@֟Ώ„sg3/“θTŸγ}ϋ!uαν&¦>αg dUŸv₯ƒͺގEΝμΚiΨΘ1�yT•{ό#Χ­ZFμΜΗ‰Czί:ϋ=qΗϋR"ξNž={χS­υ°ή,μ)ΦY%vޝ2qœΌdΧRήλ*ιϋΤΩηD"Z~?Υ}B:²`ŸΕ”œ8μ= fCJκ}­κι"[•‡#€€€€€€€€€η€ΡσΧ#"†T»¬]».%’7Ή0 €ž?&{tFˆX­F JώyrΩώθ‘#tςδ G‡ζ�`ρDΥΚ•θ‹δŸS’€‰)f SΈΡ„Β΅]Ξ8M›9›ζ-XdάJw9cΤ‘£ΗD8ΦΓΔamƒ CΛ̞6…2eΚ ϋ�};Ά#ΝΜiρ�ε4qΚ4y�~(aΝ­[·…xΝδD¦Κ2fHOώ3όδεšυiδh“„3Κ”.Iƒ˜Δ"–‘oU{w½š7₯Vή-d—3gΟ5œ΄Τ=τ±Z uα;"ΎNgœ’D‰ςαH”,™)d6gΨωθβ'OsDΤ§<^O•Τ<£EFI›„LΧoά zš«*Τοϋ^T₯byyύB„Jέ½{=~œŽž8i&N5X9Q{)΄„ˆ|Λΐm₯Λ‡Σmάά›Ψusι"“Σ?3•kΤ‘­UBXϊΕΙ‰C¬V¨b ιͺ†¬ ν ©ΆκΪBΔ‘Ca―ωžj=ΥZrž σΞηC†’[Άς©[’.π !β€ΑCE8ο]TB„―>x€œΓ°£exl]δ₯ΒγκαζΉ²5>Ι„ΐXρ�…«jŸς» Z­zAxιbqvμγχJͺ­#‘™U[uTB?ή―!9cͺ6|tTˆθμχΔοK]ˆh―Σί�­dΈζW"rΕj΅ GΒ>½ΊSυ*•$ K·Vw<'Ίqξό…4}–ΏŽέ�s}ΪϋNaWΘΨŸΔ–ύΏ~ϋΖξχ¬]B%0#!b˜‘ƍ@@@@<‰„ˆž΄DιΣg€β%ŠΛA=s†ψ/T�£BΔ¨BLεεΣJ:+Ύ’ΖΩ3gxΦd#αhFLE  qζ“§Ξ …‹—šΥ[0‡ΎJΪ,/ώωχ_ιž°ΘΌΎͺX£zUκέέδΒΔαžYŒΘI‰WXτ� q ³Δ\�„5–β=.ΣΕm,b±Jή-›‘OK“ΝR¬£κΈσ¨‹QFAδZ!ŒΤ‹:6­5ΉŠκs‰'6νά²A―μ9sjζΥΪͺπΣ“…ˆΊΈ.Ψ ~(Ό�ΰ!Ub•x­ύEοObΕRYΖ‘ηζ.XΔI�¨παDν₯Π"Nτ3εȞΨΑ³hΙr2|0‹ζTb;vTS{Α�ω‘λι¬ΦoΪB,xs4…ΆQrΩ36KwU{ΪW'¬…ˆ*d|α‚hΜHΣ{F‰³gΟJμΨΙI‰uρXpσPe*\�ώN³tΧSuuWΖΝ[ΆΣ a&§;.7φψGpDt443ΧΡޗϊώ΅%μζριI™Ν!Ή947'%ŒδεU…pTw‚Το£χeλάΪs’ο%%t΅ΥήVΎ3‘™mυ…|πEBΔπ΅^-€€€€€›@ˆθ&nκ¦q“¦7n\bΡΣΕ ΜzM$Λ%J$σ 7―;·oΣΏχ�₯_Ož4«§.ςζΝO9sε”—·nί’ukΦ¨"?η±HO%vΞϊνμYbα )rηΜnˆgΝ™G³ηΜWUcΣF ¨~½Ϊ”ψΓ>0 ΔΙνΫw¨Qs/Γ-J/Ϋ±y½ΨWqθυλΧT‘jMΚ™#1DV±ζΰΕΞ kΪ΅φ&vγ4Σ_8Ξ] ΟCλ‡ξΨ7Q„΄^¬…΄ζ{κ]ˆ¨ YΌζ'ğΑ₯χ’P—­Χυd!’ξ~vσζM�6ψχ;nΪ²MŸžžΆoӊXd;ΆΙ©K―`2U/γsc/ύv–ΪtθlYμ–λφm[?œΨ©―QƒΊΔnd*ν άMμΠ©BωZsΟΤ…ˆΌoy�:šB[ˆΈLΈ<~)ά9±“ιέ»χ‚βž}θo±ξξJa-DT.�ϊ3φΓ€A΄3p n)DΤίΗNœ _~9μΤΟ_ΈHΗ…»gϊοΎ%εΝιχίΟ‘wΫAΪιn―;vR�¦w(W4φψG"ϊMόYΌΣ³Ιρr¨nElOrδ{β�χ₯Ύξ³EK™œVCkαBοΥΡγ'¨sמ€ SOœg~͘5Η�)λ‚ε�ύύ7Υi`z§θλΧ­M]:΅—YόžΡΓΩnί$]C-ί1\™Χ‹Χ“₯ƒ¬ΜόπΓΩΠΜ=Ίv¦Ϊ5«Λ^XˆΝ‚lG’½ίwΌ/•‘ΓΌ—,k «lΟXΩɔŐ,/_ΉΊpων&Ÿkn;rμxZ³v½Y7ξxNt!" ¨ΩΡΥΡ4ZΈx)X@6?ɏ–.7Ήσ:Ϊꃀ€€€€€€„?"†Ώ5ÈA@@@ά@BD7@tcuκΥ£ψρβ[ν1jΤ¨2Μ2Ύ‘–ω�GъeΛ‚ΤO’8 ΥͺSGζΏπŸ7Χ>1FŽα6J¨ςτι3*S±j~§LGΉ„+"'GDP#†όDΕ‹•ν6lήJC‡›/2γό�“� ?yΕ�x‰%¦X±b�γ'O¨\%“€E―Οη†xΜA‡―lY3Στ)ewμ�X£nCΛ�έz]½J%βπ̜ΨυΝϊ―)BS³ „“₯HhΑœ™”.mYζΣ�£,—ώψ˜BΔ«ΦΠΨρ“lŽXX=zτ˜ΚW©a³�£kW,¦dΙ’ΙfC†’[ΆZνBν%εάΜ«•Υ:�fς<·m\KΡ’E#žgόψρˆΕN΅κ5’aΘ£‹|v{L?>½|ωŠJ”­δ–Kˆ8sκ$Κ’9“OΑb₯ƒŒKΟθΩΝ—jΥ¨&³¬Ή:κuCγΌCΫΦΤ€Q}Ωυχύ�ξ={ΎΝΎΐmΔλρΗΉ?Ι«uϋ νuτΑc'L¦+W]οήΎYΎS­‰ucpBDGφqcq’Οy�_¨ηχύυb‡ΞƒϋžΈγ}鬱W�T³Z9—)ΣfPσ¦ιSαΝΟr₯κ΅‚8»γ9q‡qρϊϊ«―δΈ5kI—―\ q=8lv¬˜±Œzέzυ±«Ρ'        ABDX @@@@ ¬ @ˆΦĝΏ_žΌω(W�\²ƒση�€έ6;«\₯ ₯Li ίωηŸ�žέΆλΪμn%°mΣZŠχι§²OKχ8]xΓ,…ˆμϋ“ΨVC¬κ ©;xΨH«γžο?“ΎMgέ© Α…ŠTβ1k‘›u—Akš­ΦH!ίΗVˆΫΚΚSΰή½A$jlφYHΘNJxv�ώ£ω<�τ]Ί΄ςΪRˆ¨‹U¬ΝSuΒβΚǏΫƒ„΅QηζμοΤͺ]'5T«G]@dιδ¦7(Z€°S{ΒlMψ^·οά5ΛSmΞ›MiΎωZ^ͺpΉͺL?nZ·JΊ'²ƒk•šu­φ₯Χwφάr>r”ΊτθCΊΐ‹ϋfg3k!’?–qδΠAT¬ha9m/ΫV�Eg,ΈlΠ΄ιϋ]΅KρΕ”*e :rμΈΚrΛ±A½:δΫ±μ‹έWΩ…ΥΡšBD~W�ZΆHΊςΈzτξG 2Dȟ—vώ'€TŽ„\™λΨΑN₯€Ι’�ŠEσ)f̘2Λ�!oΥ�…τΕΙε?hΨ€%]»qC5%]Œfν}©*:²T>ς\Ά �ΫV¨b ¬ΧΡϝύžΈγ}ι¬QΈλsΩ+Bχξχ£ž%ΟέρœΈ*DδgCD³8ϊή?�P՚υ‚ŒΣZ†ϊφͺ²α|ͺξ#€€€€€€€€€σ DtžZ‚€€€„c"†ŸΕsDˆθγӊ’Š?~Ώ�ž,˜G/žΏ? #ΥΕPμ ·nΓFΊtι²pAΜA͚4€1b3·"²„ύNόzŠvμΪ-Ϊ]!ΌγPnα X§V #œχ(’r΅EˆJΥ©. RyμFΖ�dΦ’CXθιB8kšΊ΅kR7ߎF·»χΠΆ»Dxάϋ2”tͺU(S¦ �­Œ]Λ\MMys›DΊ7ώχ?š6c6½xρ’κΥ­e„±ε{X YΐΓ’%vΙγtεκU XΈ”�\Ώ&άΆ>•Ζ²eJKgp’Ν°"ςX•˜‹Οχμέ'g'θΙΣ'|IGΕΉ.NΣΓsω/‡‹pά[θφνΫ”,iRʜ9#U(W–’&IL‡ §-Ϋvp5™XĘ*UJΪ·οΪπΊ~ύ”B� ,H+”UΥ¨ZtW­₯ΩΣ§P&œ‡oή*ϊΏ�ΰ½{�Nμε+tαβ%kΝΞΣEΉάx‚Q»D„ͺυnٌ|Z67ϊ[΄dMς›n\«g„ˆ,κΚ”1£κ‚²dΚH-š5–Χ,\Άβ?ΧΌ{χξY _έΉC[j(BIsbΑ�šuθζΝ[Β™ο =Έ�0ˆ˜pꀟ)Gφl²>‹„ τ‹€u@IDATπτYSΨΨoΎώšJ-Lyσδ¦λB Χ@ˆβά™τΨμF·~γ&:�Χzωκ%½}σVΈ’ξ r;Zλï!ςςξέ{2¬�*{ύκ•œ«.ΜvΤ‘ϋjνΣ’Z6k"»ewΓ5kΦ‰=„=yL_нœ[ϊΛ”,.Cw—�PΕΖ/Z„F ¨†Cμ6Ίo�/”(qBjίΊ%MšD–Y{'Ž5Œ Θ/Λω=2Σ�<―/œ‰YD§’΅χ₯*st¨v|ΤEŒ£ΗM UbΞΆ’³ίwΌ/"ς\V. οž/Μ¦Υoΐ@31©^θκsβͺ±{—NςϋΜc²υΞΡΗ«ΞΥ·W]Cˆ¨Hΰ       α‹„ˆαk½0Z7€ΡM Γ {…ˆ9rδ€|ωM‚ˆ‡Bμ³tι’0nv›5lPHΥdΉ5!’ Ηj«ƒ«Χ�+:bΙΖ΅+ §°ΛW�R£f^ΆΊs:4³κpάθαΔ½ΰ’»,€›4n΄!Θ΄uOK!"Χ+WΆ}ί«‡ΑΕV[O"ZŠξτq[†ε2†²@4€dMˆ¨ΒWΫjnS¦tI<ΰ«Νwο₯Ύ?ώ'ώ²ZΙΞΜ εΛΠ€~ί΅kΧo"]DuΧL.Tβ6£β‡g„ˆΫ΅¦Ζ M‘Š-ϋ³ΌΆššέφ–-œguZsRc!π„1£ˆΫ—Bz'Χ6Έ2%&³V§~£ζfn€ΊHΧZ}Λ<ζΜ‘ƒ”XQ­•ޏrί̞=+M›4^v1lΔhZΏi‹Ρ.ό62­œθBD.ž<~Œ*ζ΄RΣ”υβΕ κ�³:υ›Y] iV`qœΡΡ} w?_^?f„ΜΊtω 5nξ­›λΞ†fΪ…­½γκϋRνv―-YΆ’vǐOΫ·ρ‘¦C 5οκsβͺQΉ Ώ{χŽκ6lfΥΡؘŒv!’§        Ž @ˆŽCpž„ˆΞ³ λ–yςδ₯\ΉsΛ۞;wŽφξΩmu 6aqMoμ§³gΞX­‡Μ°'PCΈΆkεm„-ζ°cΧ©S§‰Ε\ϋχ“ƒš8eq]•X`Υ¨~}J›ζkŠ5ͺΚ–GnΏcg Mœ2ΥΜΟ¬�‡‹ΩΣ„3p"δ4UΈΞXτ‘$θ!pϋ&)ŒRαmυμJ΅|ρ|9–΅6шQcυbγœΕ“>^-dX^#SœΌyσF:ώyBˆcΦΫwžώ»oiψΰŸdxTUο•pX XΌT°«+έΟΨ}‘ŏ–)uͺTΤ―OOι Θa4υΔ‚™c’έςε«‚8Σ©zΊ jζμΉδ?o* Υc³&¨¬ω±«aόψρŒ{YвT‹₯Ίϊv ”)R¨,γΘŠ‘Ωsζ› f:΄mMeJ• δΙ?7κͺ“ǏŸΠΚΥkiϊ,•eσΘB©zuj wΈ,7NŠ%Ь»yΛv4Μ$ ²ΩΨΞv'ά$ΔΆœ,…TλV,‘Β=•­TΝpΑΣ»ΦΕd–Ο ^O?g§Ev\΄'F›χ`γΖυ©hαΒ?ή§2œ+χωΏΏ�¦: šιž…Ε=ΊψRιRōpΑͺΟρχ?ΞΡΦν;₯«ŸΚwΧ‘9·φρn�Ω)Y’$ςΩβΎίŠwQΝϊΝœ1υg#€ϋσσZΌLEΚ•#;M™8NVχνΦK>wzh^n™ŸωΉ³¦ΙzJœ¨ί£i£RΈOπ΄L:ωΐƒβ½ij―—³3!;Νκ.΅\ΞB�ƒΫ ΡήΌi#ωΎγΙ*±Cλ”i³hθΐώ!Ύ/Ή£ϋ@έ‡zhςΰB|»ϊ=qε}©ΎA=’BHλsγsΎοRκX₯ ›·�Πα£Τ₯Υ£+ΟI§φm¨Qƒz�YΊ™Wk‡œ[uβ=ϋφSŸ~¬ŽΟZζξν›)V,Sp.ΞΉΨZ{䁀€€€€€€x=c0 0&!bΗν@@`Ώ/S¦€»χώ!GB³¨‚έέ’ ρO΄θΡ„Hι&]ξWϞ=‘+·έΌn•-±°|•v΅ ±c;*°p)ΓwίQ‚ρ₯ȍCρΪ3f;ΊR…E’3|G,’γΠΈŽ¦Œ�‹πΡ_�SΑτζΝ›‰O½ΧΗͺΟ{!c† "Τlbzψΰύο›ΉΨY»΅±ˆΓ7Ώ!yo!—»B*[»ςμ'ΐλ’ξΫ4EόwλΞ»ί φί!|Χδ½ϋ]ΊtοΣΈtG„Ώ.ĝΆΒˆλ3εwm!ώ~ψπ1ύ&ύφΌ³ψΩʚ%‹xΧΕ£“Β5ўϋθχtε<ŸΗ=aœI˜ΗαΧ»χκlw�|OTΗαι}–Ο &ω~―_Ώ–NΕ‹o €€€€€€€€@δ"!bδZoΜ@@@@ΰ±@ rθή₯“tωβΩξΫ@†§3Η,Γ}eΙ’Ω©‘8x(L_N ς#6β°ΖŸ[q΄ iHο…Γ!;ž"…£G₯Bb½Ÿ>}Fε*W?@#eαλκ₯ ₯λλς•«iό$Ώ4;L@@@@@@@@ΐ^"ΪK υ@@@@"#Τrb2 `F€Γ’fϚ• ζΟKΩ³e5Βαvθ܍NόzΚ¬..@ΰcθΡ΅3Υ�ιœpjμ„Ι΄B~¬ΠCφZ―a;·~£ζ!ΊeΪnˆœ DŒœλŽYƒ€€€@€'!b€ί 4€J–(f6Γ ›·�Πα¦πfΈHBΔΠƒ!bθ±EΟ          `„ˆΦ¨ @@@@ Β€1Β/1&‰ τϋΎU*_–ή½O—/_₯Ώ€ι³ό#1LέS $Lψ₯Nύ₯SΓ;uκ7§ΪE–F©S₯’„‰:<έχοήΡιίΞ:ά @@@@@@@@@@ ²€1²οΜ@@@")#ιΒcΪ             n'!’Ϋ‘’Cπ@BΔπ°J#€€€€€€€€€€€€€@x !bxX%Œ@@@@ΐν Dt;Rt             I @ˆIӁΘNBΔΘΎ0w€Ρ]$Ρ€€€€@Έ"π±…ˆα               H Κ«Χoή{ΰΈ0$HBBΔH²Π˜&€€€€€€€€€€€€€@„%!b„]ZL @@@ΒΓΗ:a”              `‹„ˆΆΘ @@@@ L@ˆ&˜q5"†Zt     `ν‘„:              ΰΉ Dτά΅ΑΘ@@@@ R€1R,3&               @ˆSπ@BΔπ°J#€€€€€€€€€€€€€Ψ&!’m6("†dά@@@μ$°}Λ&Jœ8ŠD‰9<ƒ�ύΧf›*U*Qγ† eω€Ÿ�ωΏ.Ψ¬‹Ηψvκ@ή^-e£ 'Σμ9sλ kcί°ΰω 4xqγΔ‘Όως�—)S�ύ‡θƍ�Ρ―Ώž²ΩθσΟ“Ρζ λ(zτθtωΚͺ^³ŽΝΊ(ˆΈ DŒΈk‹™€€€@Έ !bΈX&ρGΕδέΊ<ςˆO?Jμ·:ψ’ΕJRΆ9(FŒ%JYηνΫ·τΟ½{΄qΓZzp�ΎΥvΘw`wžoΎώ†ž={F .rΈϋ|yσ�¬Se» iτ؟ξ#"6`qB“ƍδΤφξΫOœ;a¦Y¬Hšrh{"„(ΜœΓRΔαŽρ:�„ˆŽΠ²―.?GM›Β(λ-κΤ�M Δ—Y;wν’+W�κΕ�isΫφfyκ‚Ε.Κ••—:ψφν;ͺ(R]}6wmί*ώ1Abβoxυšuικ5σ5ρ4ΈΞμƒΘ$DΔ7ΜϊŽuυ9±ή«υά-ΧQŠ)¬zš‘χΛΆΝ(f̘rΌ�ύ7­]Ώώϊλ"ō› *HΕ‹£ϊ ›ϋnXΊ8€2fΘ ϋhί±3ν?π‹Υω#@@@@@@@ b€1b�+f   ᆄˆžΏTν;ϊR,αŒςκΥ+㏓քˆΊβ•Λ—hυΚεΖδb‹₯mΪu4B5O7Z Œ 8P ΰͺ1†!Ί KGXƒ1μˆΜ›#K³Κzϋ΄‘£Η‡έΝ#θ\y6Λ”.Mγƌ”dX8Δ’ˆ˜"“1"�Ÿ;ζδΚsβθύ•ρΥλΧ΄iσιΠ\³z5ٍ§ };w$ο–-δΨΞύyžΪΆοh3spͺW­Bƒύ$«lί±“Ίχμ\u”€€€€€€D0"F°Εt@@@@ Ό€Ρ³W¬bεͺ”!c&)όυδ Κ•;°5!" γč+Λ—,  ›�Οlr­ΪΆ§O?'σ–/]L7�_3+ΗΈJ€C θίΧθ&GŽμ=zty}옹ΘιΦ­ΫΤ·�F]uR»f *Q²ΈΊ4Žλ7l€mΫvΧκ€G·.”)cFϊχώ}Jώyrʜ9#=~ς„6 ΑΑξέ{©Gn”.mzτθ1­Z½†~ž` i¬Ϊ«c§ν)ožά”Vԍ/ž_~‡ώΊx‘¦Ο˜EήΧVjPΏžt†K›6-E…^ΏyC—.^"οκ΅λ‚4cF}ϋφ’ω+W�"KΗ9GννέB–O6ΓΈ7‡ Ξ’9“ΜO–,)₯NZžσΌω~zbqEx )l)DΌsχ•-SJΜ=³b_»~V�ZCσθS&gY«zu™%JTʝ;§<ύϊ :eΎ~ϋ 9sην§Lš@±?„ΑL›.-%όμ3YvνΪ5±ξυή —Ί.]»ΣΣgόΌιΣ¦PŒhΡι¨Ψߜ_Q„�LŸώ;z#φΑωσhΣ–-΄hρ£>Ÿπ+§Οk"tζO›•σE‰Ε©YγF2��εΛ4d؈ u\ΝpTˆΨ«Gwϊ2uͺ ·3fΌUw�πφlVͺXžͺ( <ŒnόΟόΪ΄Ic*R€½{ͺWοο}ΰ�gσ‡Ύ}¨^έ:’οθ±?Σ‚€…AX—+W†Τ­+σǎŸ@gΟώ€Žž‘7wnjΧΆ΅Μš·`!νΩ»Χ(ξΫ§—x7¦₯‡RΧξ½Θ«Es*X°εȞbˆΆw„ΛεΖΝ›ƒ„~wtΈςlͺΑ²S\ίN�εν›―Ώ’ί•βΩ9ϋϋ4rτX§ΔZͺoύˆoXΔϋ†ωMžHμ,8sΆΏtnmΫΊ΅oΧF.»=BDώ=¦EΣ&”N|R ‡ρ·oί�₯ΛWθΠ‘Γ4N<ƒξL{wߟ†Mš…ψ|ΫΊw\ρ0=λ�όσ/•,SΞVU䃀€€€€€D@"FΐEΕ”@@@@ <€ΡsW+I�€Τ€YKιbxόψQ)~Θ_  °5!b³–>”8qbYΎww ?vΔlr;w₯Β½M<^ΌxaVŽ p•€." ©―»χξQ鲂T2h U«Z9H>‹rXœc™ΜβC“@Ο²ΜΪu'ίnfbžŒ.dί}›ΞZu)(c±AΐΒΕAΚ;ŠJ—*$_elΨ°)ˆΨRg4K#&NφSΥ屉‘ΛBN’»Υς|αόΉ”5ky�α#GΣβ%KCͺζ‘ε:Ÿ‡‘ƒ-;Ωo*͘9ΫΘξήΥ—š7kj\wbι₯Ϊ‚k£ΚͺV―mˆξt±‡*·v\!ΦpXK•XT΅rΩρΎN$³&LœLήX%._³j9}– ΥrUΟΥ££BčλVΣ—_~δΆ–Ο”ͺޞM}΅iΫ!ˆ˜WήΛV¨d„£vΧ³ΉBμ υ²Ε΄©§φβjN–Ο€β�u‡5Ό�Z³Φ(^Ή|)}+ΔUό»?U«}οrε₯Λ™ ύέ:Wγζ6N,ŸMy!Κ8 Ώ!Π²lΚbμn=zΡ‰'-‹ΎΦί?!5Ζ7Œ(<~Γ"ΆkӚZωx� ΒrOΈβZhΩ�.²~νJ™Νc"rJ%ď―ίΌ6ή72ӎϋvο2ΎŸ5kΧ₯‹—.ΫΡ U@@@@@@@"#Β*b    Ž @ˆθΉ‹ηΣ¦½tf{ώό9M›2‘ )FΑ  *B –zψπ͝=ΣΏœ1SfͺP©Š,SύyξΜ1²πJΰσΟ“‘WKcψ•+W’Oγš\:—.[nδσ ‹8t!™*dΗ―bEŠΚΛT)SP�\&g;{„ˆ�. /^Ό€΄i�¨ξθΆp^|$YpΓiΉp!K—§‚ωσS©R%d“¨Q£Rέ:΅εωγǏe8Nyρα‡ Φέ5ΩΡ.vμOdi>ΑυΑ—―ι΅«Χδ9�x'Yδ©’5!"sgMvΦdηC•8Μ.‡ΫU©pΑ‚4y�xŠ-±kcK:}ϊŒ,ζw·Ϊχ<χ|U3·"²(‡Α8εȞΥpε΄%šΣ…ˆααΩΤsŽέυl?rH8šd+U©Δ‘‘Ή³P‘‹œvοήC…Cgpi¦x†Υ»Β²O%DΤΫ³s;ΑƊ‹²eΝJqβΔ"DttΈςlς7eέκ•βωŒ-‡y[Έ4ξή-ŸΕbŊJ‘πώͺXΉΊ>§Ξρ σΌo،i~fίԐφύ{�ˆ§…Νo ½BDώ]dΜΘ�œhΩ}σΈψv°σxΕ ε‰ί�œΆmΫN=„Cͺ«IW½tΩ Š+&₯Ι’%“]³«σ±cΗhΠΠαfΒ`[χegτL3ΘβΎ?τ§ 7ΫͺŠ|FBΔΆ ˜€€€„7"zζŠ’Γ|άΧ�ZI—.]QˆΘ3©S―ω•œ‹f=z$„qdHSΞδ<ώ£ώεΛζ‘\eό7˜7—²eΛBο…2 {��DYφή†…\³f˜Δp! 9\b‘b%eΈΤc‡1φ|ΑΒΕdή/ϋv‹Π䟊ΊΗΘ»U[9]Lxηξ]ςφikΈέq…?ύH5?„j΅„mΫ΄’‘\φγ?wŸ0Ižσ~ίχ‘ϊυL!V/_ΉBΥkšΞΉLΪ9"DδΆ*ι‚…Ωώs‚„NUυ\9κγ΄·Ÿ#G’OλvφV·ZΟςΎ£ΗŒ£ ΙΊ,όXΏv5%I’X^ΧoΨΔ¦ΨDΉ²(°YKo«χ²–Ι’ΔΝMΊΦΔhzK!⁃©]ϋNF•?ώ@jœ“56;Ά'o/YΞa€λΦkHΝΕ½Y(Γ‰E΄5„“• ZΈι‡£BDύΆΫ·£Φ­L\C"†—gΣY!’ΞΕΩgSίK―^Ώ¦<ωLξΗzίκόΐή@ωX”ΗΌΑ₯ύ{)~|S¨ω2εΝλκBD~GO›1“8ΌJμΜY·v-š>s–Κ r΄gX6rδΩ3r8•+WVvqμψ κΤΉ‹Ωσ  ΙωΜοbw&|È>φ7lΡ‚y”%Kf‡–΅…w+›™φ 7o\K)S˜„Χ–Ώ°KαΚεK€@–ŸFM›;FYM¬v­š4 ?uiσx�ΑjΦάΫμwk•υgG�ŽZ«‹<ˆEBĈ΅ž˜ €€€„;"zή’±ΫJ+α†Θ�^·… Ψ’ΣΦCrDT3))Β(ζΘir‘Sy||#B»-_Ί„nέό[ΟΖ9„°qάΊy‹Κ}pύδπ†ζπή½¨TΩςr~Λ–,’ ιΏ#v5jΨΨ$4Sγγ =zυ¦mΫwš±`w¬-ΧKΧ:v#*RΌ€,O›ζZ½�δπΘ჋–0ΟΜ’’];Ά.^zW]hηΙBDZ΄kΫڌGHΏ9KK–. ©Z°ε:ŸkΧ�Q•κ΅Μκχοχ½αvΘnpμ g-9"v�Ϋ»"DδPšRS%rνΨΊI†υd1^Ξ<ωU‘qœ3k&εΞmz_³«ΫηΙ>—υΩ…Σ«Uι�hTvσIX ΓΛ³ω1…ˆzXΦλΧ―Sεj5m�φτiSˆ]9©°ΙΥ«V‘Ν;ΚΌAƒ‡ΙπσzŸ;wν’�έ�sp劺qΟΎ}BδΧUΆwδGh O;,ίΏ/_Ύ€ς•ͺq‚c‘8 Ζ9YŠΕ™‡­Ίκbϊπςœθοθ°ψ†5kΪΔp-Ά΅N–ωcžd―¨:φuAρŸη�’ŽΘͺ½:<Πg�‹`ω½οHϊχίeuώή²Ϋ¨žxO_Έp‘’ §ΤzΒε7V¬X²xχή½ΤΩΧ’]――ŸwρνD^-šΛ¬™³όi�?½η       ˜„ˆxq15 DτΌUj�¬%%‘ΨΨ½pζt?zφτ©dHBΔhQ£QcŽ.q’$²>�αόpVŠ"BF�sβ>·nήHηώψO,# πB@XŠ8.]ΎL5jΥ•³P.YΧoά ΚUMŽtJtuυΪUͺZέΆwχ�ν”(aBΩ†ߊΉœ’D‰b?OώΉ<ηJτS’DqšψσX™ΏM„rξΡ«QGψMžH,fΰδνΣ†80§°qΘ›†£:ŸM›·RŸΎζQή"τ·o§rF\Ζu¬₯°"ήΉs‡,ηx\κΰsΛΠΈœΗ’•UΒYΛRΌ2q²±Θ'4“z&ψϊ΅ηžφΠThζπςlzŒQ{oY[ ]°Τ£wf|μθ‘TΆLiY}εκ54pΠιΖΙ�œœΖŒOσΘsυC"²“)»v:šμΩ–}Ϊϋlκ‚oξγζί7�Τ;:šh%ύπ;5α²ΡΐΙυό†…1Ό<'ϊ;:,„ˆN.Νfφ›6nD={ό'τS{Oν;ξœ7PΧkΦ­§ €*U*Ρ°ΑƒlήΫZΑφ;©{ΟήRψ― —-_AC†ύšΕΗ,BVI�*O?Bˆ¨Σΐ9€€€€€€D."F�υΖlA@@@ΐγ@ˆθYK’9Kv*W‘‚Τ©“'hΧΞνΖC"Φ"¬―Σ€‘υοί�—–,\@/^ΌΧζΉPα’ς¦,Fτ›4ž^ ‘"„&°qœϋσ<ΥkΠHNgαόΉ”5kΊxιΥ¬]Oζ͞9ςζΙCJœ¨‡B΅‡ QκΦoHη�Ί@M7€^=ΊΛf‹/‘£ΖιBλ<ΰ§A΄zν:Y'Ό‹8‚LΤΝ:ŸΉσΠΈρΜξ ³8x(­\΅Ϊ¬\]Ψ+vRυΥΡYGΔ?Ν#m™&Mό™Š-*³m‰½tχ-�ψΫog€¨ά²/w_‡•1Ό<›Sˆ¨Ώ^ Atξ|l.·YΘzΆœΓ�ξ άA ?ϋLΆα0ί,zύiΐT«†Iˆm-ŒΉ.DT"k›7΅QšBΔrεΚИ‘� ±l ΑΘώχώ}*QΚΖΩΘtρί°j’`Dϊ†Ω#Dό‘oͺW·Žέ»'0p7ωvλ!ž7~ξϊΫݎ+ξή#ά »t£υλQί>&ΧRώݝέ͟>{fΦ—¦Ίc§.΄w�~³rύbΜ¨T�l™…ΠΜ:œƒ€€€€€€@Δ'!bΔ_cΜ@@@<š„ˆž΅<­ΪΆ§O?G,zϊσάfƒK’4)%I’Tζ=xπ@†XΎwο=|Pζωvλ)Γ9sΠ©“'Φ¬#„Š_›„Š–"G³αάD ,EΊL ¬.\ΌH΅κΤ—³™5c*±€G فnχΞm²ŒΓΰώώ7Œ©iΏ1ύξjϊςοΟ Ϊ|Ϊ#D4pΥ¨VUήξ𑣴wŸmΑWϊSόCvM•2%Υ�e�Ϊ3V�σΫΩίεw³\Ω�4fΤHΩμ’ψέ₯ζ‡ί]τ~τq3–.Φ‹ΝΞ—. Œ2ΘΌΎ?τ§ 7›•γ@@@@@@@ β€1β�-f   α‚„ˆž΅LmΪw€8qβΪ=¨gϞ�tΏΙ;NjΫή$Œzόψ1Ν!-S–¬Ω¨lωŠ2ϋ7�Σ²%&Q•e=\ƒ€»x²ˆƒηxθΐ>ρΌΕ’έΰΘ,yTͺXžF *³ΧoΨHύϊ°¬B?E₯K•’ωΊ-W�œ4wφL™oΝρ―sΗφδγν%Λ?¦Q™œ b°λŸ+IΏ―5‘¦§ ―_ΏN•«Υ 2u]ˆX§^騩Wbqμ4ΏI=ΊI€¦Κ”K–ΊΆvΜ‘#;₯J•�(zςδ)νή½ΗΈιΔS…ˆ<ξρlκ!ΫwμLϋόb†pž�,Κ™3‡Μ !’ )Ο7θδۍφμέkvύB9£={φ\ˆ‘QλVήtφχ?(ή§q)uκΤΔ‘½YΰΚΒF[Ο₯"²ϋZΎ‚Eτξν>M!bΆlY εργ'©₯O+»Ηε�Šψ†}όo˜Ϊ뎬i οVtβΔI«Mμ"ΆiεCΪ·•νg̜M“ύ¦Zν˝™ό>Ÿ?gΆμςΟσIfΛώΩm‘]9Y ·�ΧίΏ'βǏ'³jΦ�+’/λΕ8ˆΐ DŒΐ‹‹©€€€@x !’g­R³^”ೄV5jTιxΘ…^™�ψΰ>͟λOŸ%LH-½[ΛvŸ!β΄ BΔμ9rP©2εe;wn‡―EΠ$  ²εΜγπ­ΜB ‡£Ρc�Ηβ€ω”9s&rΤu;Z±l }χm:Ωg“ζ-θτ�Ω» 8©ͺ6Žγa `#Š ŠE©€tŠ΄(έ Šβ‹€‰ŠJ ’’`Πέ]�’’&(¨„’"ςήη¬χzfvfwjagχwίΟ»sηζΉί3~ζΟsΆlM΄ύ@μ€Μχ?|/Z}ΜX4�\rIn3Yηλr:ΨAΔ@!F;ΐJρƒ ε…~/›mΗςΟ=Ε‹Λ0' Ξ°vύziέ¦}8«$Z6ΦAΔ`ŽD;ώwΒ£;IΣ&Μ»�έ{Θβ%K‚-*vwΊZU³l…Κ²oί>ŸεW-_*9rd7Σόο­:9iΒ{’+gN3²ΣΝtΉ2eΌε΅[j «μ`œ.£m(\,x—ΎώΫ±οΟΤTQΫy&ξM;ˆhwEλΊ-Y4ί;W‘Γ½7Ÿzς ©W7‘;ΨδBFO<ή]��iΪΑƒ˜kfδ¨1’-Ϋω¦‹ΧΚ9r˜ωΑ‚Tg:ˆ˜ά½iί_zŒχ•JΕΉηγtΌΪχˆ�ύΚώω {^¦8Ο5�Α�šά}bŸ�ν{ŸΤηy(AD»:a° o°}G:]―χU+–šPϊ‘C‡δξϋJ%Ϊ”[ΩYgtz΄[ΠΰΉ}οθg’v½Ξ€ € € €ιG€ bϊ9Χ) € *"¦ΚΣ°Qwί[BξΌ«Έ™χΕη[eΑ<ί.έ�™5 8jψ09|ψΟvκ>τ°\qεUfΪ—ΞϊσύΦχY˜7Δ@ΐξΚ΄­S±sΝΪ„nΔCέtJ‡8μΰvqΪΈY‹€MΣJEώρ‡WQHδ_ΊxdΙ’Ε,ο¨Z΅²Όπμ3fžV(½§Δύήv5œ¨!Eφό²GΚUͺβΝΣngL›βuΟ,ˆ˜οΪkdΪ”If½-[>“›zۈ刢'œa�ώύA»Γ u;± "._ΊH.rΪZ1�LΉ !·Λξ{ΜΨ·e@]vΫa=>�εkΥxPz?ύ?sθ?νΪeΊΫ΅μPΙ¦ΝI³­Δΐh₯Ξ¦-Z Θ¦ε β™Έ7νσ΅pα"ιήγIοtU―VUž}¦χ>X1š{³tιϋeΐ«―˜}θ³RŸ™Αϋ:q—ΡπUφlΩeθAξ$σμΩ{¦‚ˆαά›v υqγM8ŸƒϋχM©R%e£Σ…ξα#G͎xŸa"gϊ3LŸ³:Οςp}ήB "jH|ώœ™rξΉηšΝΨUννjΫξΉ§Έ,\<°n/ŸάΈ†�υ蠟=ϊ™βWηΉZ¦O(™2e2“μΰΰ.γΎjΥD­ž¨ƒ†ι5TΟ€ € € €ιG€ bϊ9Χ) € *"¦ΚΣ°QΙ›·l#Ω�­€€]6λψΏ�φ›Ω–qn½-‘KIπώ»γδ—Ÿwάˆ•@χ�]€QΓfsΏ:ΧβδΙSeΧξ]¦rΫώ}D+θΩƒώψΛΝ7{“n½εfiΩ’™y―ΛΎχήoήή½{MΔh*"jˆ`ήάY^尝ί~+o½υΆ|ϋύw’-k6ɟ�©T©’δΏαz™:}Ίτιϋœ·�žOϋl³l ξ…ν*y˝ξW'Oš*9s^,νΪΆ–άΉͺ(κΚΑ‚ˆ:λΌξ|—,]*λΦo0·nύΖD•ωtz< ± "Ϊέyj΅ΜΩsζΙώύϋL%ΩνΫw$κ"Ω΅±χόψq™6}†lΫφ•;~Lώ>yR.\μ.κSQ'ž:uJήzϋYΏnƒδ/pƒh·΅ξuπJ�ΧdœΣ…�;h·ŸΪύ§ϋ΅κzη¬Χ�zJZ5ΝΌŸw�,5λΤ °:AD­zΩe—›6ιŸZ΅”R%J˜χΫΈι#oήΆ―ΆΙž={%ήξM­¬ͺmΦAύoΏ£Η΅In.XΠι.½©w.u~° ’Ξ‹ζήt«.κώ«Χ¨γURΥνΪƒ>»>\½B2dΘ`&ΫUΟΦ�Yi�M‘T•ΜH‚ˆ‘\v»u<œ{Σ£λΊ«V―qξΙ™ςσ/?;g/ύŒ¨Z₯²δΞ•Kzώ―—ΉΟuΉX |†‰Δϋg˜ή+έΊ=κUΏνΦ[$ߡךKδΫοΎ“?ωԌŸtžοΟ>χ‚wιΨݎλ}4iςsύύρη¦ϋs½6+”+kώABρ{J|F{ q€r₯ �ο…η½φŒ�ž¬]»Ξyφ^*νΫ·υ*²&υ'tε‰Ό'œο/: Qš™όA@@@4)@1MžV @ˆ‚ˆρs�’ "^tΡΕ�ΠιΪY»pvύaUί»aΎcΗv™ιT]c@ ₯΄ϊί¬ιS½ͺBφώ4˜X¦\E{’tν�Yš4nθ3-Ψ·[ΟhΒNΊmύαΏΟΣ½ΆΡή·QC“ίο΄—Χq ]Φ�S?Q@‘Ϋ£₯q£δ3© ’Vσίο‹/½"οπ_hΣ~j~o`+”——ϋύ*±yΡβ%�ν±ΰ’ά€–½Ž;nW‘�€‹†Ύ’4ΰϊ`Ν:ήbΕοΌS†Ύ1ΘTΆ�πbη�έu±i·aΕͺU�±Σ£ήϊξΘι "Ž{¬h—δ‘ &N’η_|)ͺ ’ξηLά›οΎ3VnqΒmΙ I£Ή7»tξ(͚46»Ÿ4eͺO0ΚΏM3¦M–kςζ5“ηΝ_ =ž|ʌψšύβΛmςΠΓ ap�υέkμΨ±crGρ{ύg|ΙuΰΏ‘pοM»j�mΩοS"ˆΘgXό†i%ΑY3BϋΞ[Ήju±«)†Ϊ-t¬‚ˆz=zύUΡ ŸΑ†ΏώϊK6nfώ!F e .$cG4³~όι'©RνΑ@‹1 @@@�°AΔ4|r94@@ "ΖΓYJhcρ{ξ•»Šίcήlύl‹,Z0/Qγ/»ό ©T₯ͺδΘqA’y'�>)Ÿ|ϊ‘¬\Ά4Ρ<& RhΪ΄‘”*YRrdΟξu+θr­$ΨΆu«šβvIΣ§—΄ΊΕkŸ;_C:λ7n”χήύ QG ’½ςr?Ή»ψ]‰ΐ+V¬”§zυNBt·ϋκ+/IΉ²eά·’‘αO>Ω"K—/—ΗœκM:<Ρσ)™;o·Œ�HσfM₯RΕ r‰SE1GŽμήμή}ž‘i3fzογiΔQ :LFŒνΣ|»ΛΙδ|΄‹Λ‡~H 9]kgΝšΥ dϚ=ǜŸ [o4dΪΑ©>U¬ha§�Zn― n=G«T3Υώtq;ˆψΡG›*zEœkΡ ~kΘπΓuλ€»Σ-¦έe¬ζš0q²Ϊλgν=aT»ψ}Ο©Ξηv�έ¨isηϊH¨άε.lwγ©Σ>,wί<ΐβ�美xs¨άuηζmύδσΟΏpg%z΅»‘N4ΣoΒ[cί‘Χ’xΌ7΅;ς^“λ―Λη•V<=wžd9η\ΡnΧ΅:ZΩ •½ –ή‚ΦH€χ¦^{σfΟ0η]―™²NXΫΎv¬]ΘsΟτ•ͺ%tνή³ΧΣ2{φ\3»^έΪ’][λπΑ„‰ςBΏ—ΝΈ�7tyΰΰA)QκΏg‘�rφϋH�{}w<ά{SΚ=zt—«�Ό�έ„χͺΥ W―Y+oα"σˆr„Ο°#γε3LΓ€σηΜJτΩξPΑξk 7kκt{ž=›�*¦bιŠ«‚vžh…'hΕεjNwπϊcZέ·ΧΣ}‚VτΥe΅{wνζ]�JΌf"@@@@ Ν DLσ§˜D@R·AΔΤ}~"m]6ηΣΩΰ‘OηΠΉc{Ρ £–1cί>»OΥϋ�{NŸ™Ή/Ι%φά΄ϋκT} )ΨΈΣyŸ€§Ο0=Φω HΆlYeΟ/{ε‡Ÿ~τBι)u:έηΠό)ZέTC·I ΪΖy³gJζΜ™E»�^£vR‹3@@@�¨AΔ4zb9,@@ ^"ΖΛ™’ €©I P15΅ΆΔ―ΐβs%gΜςαΪu��C§ψ=Σάr½'+W�Ρ^Ώϊϊ+Ω²ekD벩A ΊSE±oŸ§MSΊt{L–/_‘šE@@@@ΰ4 D<Νΰμ@@ΐW€ ’―ο@E€ b(J,ƒΐι(_�Œτω₯ˆvΈhριφXˆΦe%@@@@R‹AΔΤr&h € N"¦ΣΟa#€D%@1*>VF ζeΛ”‘ΧϊDŒ9,D@@@ˆ‚ˆqsͺh( € 6"¦ΝσΚQ!€€¬€W,[,™3g–%K—QM-eΉΩ:! .\(€εόϊξ»οeίΎ}ώ“y € € € €@\ DŒ«ΣEc@@΄'@1νSŽ@@@@@@�—AΔτuΎ9Z@@ Υ DLu§„!€ € € € € € €a D ‹‹…@@b-@1Φ’l@@@@@@8½O―7{C@π ˆθΒ[@@@@@@@ Ξ"ΖΩ £Ή € €@Z ˆ˜ΦΞ(Ηƒ € € € € € €ιM€ bz;γ/ € Κ"¦²Bs@@@@@@@0"† Ζβ € €± ˆ[OΆ† € € € € € €œn‚ˆ§[œύ!€ €ψDταΰ  € € € € € € wγξ”Ρ`@@ m DL[η“£A@@@@@@τ'@1ύsŽ@HUSΥι 1 € € € € € € €@ΨΓ&c@@X DŒ₯&ΫB@@@@@@NΏAΔΣoΞ@@,‚ˆ£ € € € € € € €@ DŒΓ“F“@@΄$@1-ΝΔΗrΑ…ʁύϋΟ`  € € € € € €€‚ˆiζTr  € €@| DŒσ–9σY�ΌUkΡW>ΪΌQΦ�Y°ρ+W•λ�ΏΑY6³dȐAώωη9vμ¨|Ύυ3Y½rEΐu˜ˆ € € € € € €ρ+@1~Ο-G@�„AΔψ8΅λ=,W]u•ΧΨ/>ί* ζΝρή»#-Z·“lΩ²Ήo½~½m›Μ™=#Ρt& € € € € € € €@ό DŒίsGΛ@@4!@1υŸΖk―½NͺΧ¬εΣΠ@AΔϋK—•Ϋ 1Λύ}ς€lΪ°N~όαΉ6_>)TΈ¨d̘ΡΜ[8�©Žθ³Aή € € € € € € €@ά DŒΫSGΓ@@΄!@1υŸΗv:Λ9ηž+ύυ—œ}φΩ¦Α‚ˆ:w•³ΞJθΊωύροΘ/Ώόμ\ž|HF {#с΅lΣNΞ??›œ:uJ†`‚‰b € € € € € €ĝAΔΈ;e4@H[SοωΜ™+—4hΤT2dΘ ›7o”ΏOό-wήUά4Ψ?ˆxΩe—ΙC42σφξωEήχv’«χpCΉόςΛΝτYΣ§Ιφν_'Z†  € € € € € € γοœΡb@@ M DL½§³Eλv’-[69zτ¨ΌωΖ Ήϋή1 "�^ΉB6nX—zž–!€ € € € € € €@ΘC¦bA@@” ˆ˜ͺΡoσ'txΗΏΥgL";wnO2ˆ¨{t»f>tθOωζΠDhαt͜ΝιšY‡O?ωH–.^”h& € € € € € € €@ό DŒΏsF‹@@4%@1υΞσ²f•–N5Č3ʞ_~‘χΖ't³œTED=ŠŽ]ΊJζΜg™zχ±²wοοΰςδΙ+΅κΦσήοΨΎ]fNŸβ½g@@@@@@βW€ bόž;ZŽ €€ ‚ˆ©ο46hΤTrεΞ-�όσŒ>TŽ>l™\±LΉ rλm·›e�ώϋoΩ΄a½ότΣrΝ΅ω€Pα’&Ψθνw;wΚ΄©“ά·Ό"€ € € € € € €@ DŒγ“GΣ@@΄ @1uΕ‚7ί&ε+V4ϊτc§ϋδ%�uŸœ\QWjέ�ƒœw^Φ€uψΠaΙz~ΒΌO>ώX–-Yp9&"€ € € € € € €@| DŒ―σEk@@4'@1u�–mΪΙωηg“S§NΙWΫΎτi\Ξ\Ή$gΞ\fځδ—ŸwΛoΏύ&Χ―υYξkΙΥy―φΊiώϋοN7Ν{ε›―Ώ’’₯J›e—9ΗOœ # € € € € € €ΔΏAΔψ?‡ € ΧSΧιKͺ’a –9rX†h–dʘɩ€xΎόρΗA3ΏκΚυ7δ7γΌ7^~ή½+ΰzLD@@@@@@ψ ˆ_η‹Φ"€ €iN€ bκ:₯š4“\°Q3fύΏ�όσω�Αϋ坱c.ο?±c—�¦J’�;xΐ«f}�ex € € € € € €ρ'@1ώΞ-F@�”AΔψ9wί[BξΌ«ΈiπŸo•σζ„άψς+KΑ›o1Λ·s§L›:)δuY@@@@@@R·AΔΤ}~h € ζ"ΖΟ)%ˆΨ¬eΩυӏςρζMςΫoΏJΎλ�“ΒEοΛ/ΏΒθ©S§dΤπarθПρsΰ΄@@@@@@ή£χ@IDAT’ ˆ˜$3@@RZ€ bJ Ηnϋ‘;w}ΜλΎΩΟB\³z•l\ΏΦο@@@@@@@ Ž"ΖρΙ£ι € €@Z ˆ?g±ψ=χΚ]Εο1 ήϊΩY΄`^’Ζ·jΫ^²f=?Ρτγ—93gΚχίνL4  € € € € € € ίγϋόΡz@@ ξ"Ζύ)Lt]t±\sm>Ι‘#‡μέ»GΎΪφ₯œ8q"ΡrL@@@@@@@΄!@1mœGŽ@ˆ[‚ˆq{κh8 € € € € € € `"r! € €œQ‚ˆg”Ÿ#€ € € € € € €Q DŒš € €D#@1=ΦE@@@@@@ΞΌAΔ3h € �"¦λΣΟΑ#€ € € € € € €@ ˆ˜N"‡€ €Δ³AΔx>{΄@@@@@@!ˆΘU€ € pF"žQ~vŽ € € € € € €D-@1jB6€ € AΔhτX@@@@@@8σΟό9  € €@Ί ˆ˜�O? € € € € € €i@€ b8‰ € ΟγωμΡv@@@@@@@@„ "W € €ΐ ˆxFωΩ9 € € € € € € ΅AΔ¨ Ω € €@4£Ρc]@@@@@@@ΰΜ D<ση€ € €ιZ€ bΊ>ύ< € € € € € €€‚ˆiΰ$r € €@< DŒη³GΫ@@@@@@@‚ˆ\ € €gT€ βεgη € € € € € € €@Τ£&d € €ΡDŒFu@@@@@@@3/@ρ̟Z€ €€k‚ˆιϊτsπ € €@\ ,š?W.Ύψ"Y»n½΄οΨ9�ΪNcHK=Ÿx\jΧͺ)GŽ•jΤ’}ϋφ₯₯ΓγX@@@ˆK‚ˆqyΪh4 € v"¦sΙ‘ €‘ <Φ½«.THŽ;&Mš· u΅—{¦oo)tϋ­&œP―~ƒΧ‹fΑ3±ΟhΪ―λf=ο<9ηάsMσυϊ9|δHΌJŠΆ»X‘"rύ ΧΛ±£Gε§]»eΓƍχ7gΦtQS{8uJ€uΫvςυ7ΫνΙIŽW­ZY©_ί,Σ»Oί°ΦMrΓ©lfηŽν₯y³¦¦U ‘ΡoMρ¦τσ2Ε€xWηΉZϊ½ψœy?yς™2mΊ7‘π¨VEž{¦―YqϊΜYςtο„ρπ·Δ�ΐ Θ°7Ήo½ΧC‡IΥκ5½χ‘Œπμ E‰e@@@΄'@1νSŽ@ˆ+‚ˆ©οt•«PInΘ_ Ι†νΫχ»Ό?ώ€ΛδΘ‘Cͺ9?T]pΑrΦΩgΛ?�ό#‡–Ο·n‘΅kV\‡‰ Ύή5RŠ)dϊΦBE“=x J5xδa³άΚU«εΛmΫ’\ηέwΖΚ-·άlž?·Ή#Ιec53ϋ,Xπ&Ήχξ»M“ΖΏϋ^Θ!»p}buΜgb;«W,“μΩ³™]ούυW)[Ύ�™hFͺά§ 9½π¬(_2eΚδΣF lΚ5[^θχ²Οτ7­O΄¬.ΠΌEkΩΈy³Ο²I½ιΠ�­΄jΩά,�±sWY±reR‹Ÿ±y ηΘyΞσδ›;dι�ea΅γ’‹.’y³gH–,YΜ½YΆ\ΕdοΡXά›α>/Γ:¨8^8�ηe4‡\Ύ\Ή&ο5NΘύˆŒsžΡαw+&£F 3«��Όςκλαn"M.Ν}²xΑ\ɝ;·œtXFΌ9$Ρ"]t±<�¨±dΞ|V’y:aΛ§ŸΘ’E Ξc"€pœΎχž»e萄 =£ΗΌ%Ώ‘$V,BIξ ΐΜXμ³k—Ξ�€qC³υΦmΪΛΪυλμ)ρ€p}o!>¦άSΌΈ :Ψ§± 7‘-[ΆϊLKoJ–(!Ο?ΫΧ i2ΨσΛ)W©ŠΟ,­d¨! ͺU©"·ήz‹O«AΔ-o2ΗχΙ'ŸJ£¦ ΑI3!„?vξ$M›42KNrͺΩ=ϋό‹Ι�‹{3άηe²J# DϊΌŒζπΗΏ=ΦΉGn–SNΩΠΫ  {SvΘ‹ β|Ρά'mΫ΄’Ά­[™Νž=WzφzϊΏ 3Ά€~θη‚;΄mΣZ.ΊπBI«AΔ3ρqmyE@@�ͺAΔ΄zf9.@@ N"¦Ύewοή°{χμ•eK&šΧΆCg9χί.3< _}ω₯SρBΉ>~ɐ!ƒY~ώάΩςεŸ'Z—  ~j>XέTm;zτ˜Ό>0q€ώα†b τoCrοc±ΟHΧ'ΉcI­σ�Χσ ©[§ΆOσήϋNHאΟJiμVκ[0w–œsΞ9ζΘ΄Rδ&Ι6§rθωηŸ/wάQLͺW«&ϋ~�=QΡ¦xΌ{7§ςhBχΚα .$Λ—3›ΣξŠχ8ίRγMq©σ)rζΌΨTZ­^£Ž|�ΓχΙb,ξΝpŸ—Ι6*,ισ2šΓ6ˆ¨χj›V-L–-[rΨ<š6ΗΓΊΡά'œΣ�&Ρ�ώ8κtE_Ίl…d+•ΖƒIjiγ›n,Q1ž]gβ9’ZΞ-ν@@@RJ€ bJΙ²]@@"†ΔtZ²ƒˆ―χ)δ}_νtUW³v]³ό‘#‡eψΠ�*&–-_AnΉυv3οχί~“wƎy»,ˆ„RˆE(0\υXμ3�ΔΓυ χΨRΛςσηΜ”Λ/Ώά§9۝.vkΦ�η3-½½ιωΔγςP½„Οߟvν’V­Ϋ‰ΎΪƒvΫ\ΌψN@q’=Ωg<š ’Ο†Rρ›HƒˆeΛ”‘ΧώύN΄zΝ‡��C§Ž2½ά›!aΔx‘HŸ—Ρ4#Ϊ b4ϋNΛλF{Ÿ<χL_y ZB΅Χ_zEή�`BZζ:­ΗMρ΄64‰ηH„Me5@@@ n"ΖΝ©’‘ € €@Ϊ ˆ˜ϊΞk€AΔz7τ"Λ—-–7oφ�MϋN’%Kσ^»³:x€όυΧ_ή|Fˆ•€VΖ©X‘Ό”,qŸδΏαΉ8WN9ϋ¬³d�ςνΞoεγO?•ƒώ ΙϊοWΧoΩ²Ή”-}ΏδΝΫTΨωλΔ Ω�ϋ>ωtΛ™0q²l΄�mύσζ‚7™Ντ}φ… ²ή[~ψρG™2uΊΌ3nΌ3}ήλψuλΦ–kσζ5χ`ƌε7'πϋΩ֭Ώρ“dΓƍ>Λ‡σζΚ+�gϊ$ts8oΑBΡξH“ƌnYΏa£ 9Κ[|ΰkύ%cζLή{9~μΈtό ŸiξΫ6wξ\’'O3kίώύ²sΗNw1σ:rΤŸΚRv(°κ5D»nΌύΆ[εͺ«�’ƒ�­NUΦ>}ŸiΥΆHχι^z ω�Λ'^p9¦~ψAφξύΥŒλŸ“�ό#]νζUzŠΖ§NνZRΙΉON9�{σΝ‘RΏ~]ΉνΆΫ$WΜςΛΟΏΘgŸ./χ5‘†=.ΏμRΣ¦!Γή”>ϊΨkŸ;ςrΏ$ηΕ›·ŽY·Ι7\LžψΩ�ξ7«Sι/� Χ›χ•«VOΌsΫ£―ZE±VΝE―ηlΩ²ΙΙ“'εΐƒςΝφν2ώ™:}†·Έ}_nqξ‘}»‚vΤ�+kV―nήNtξ‹ωΞύ‘ƒ{^="/½Τ?’kOΫΩ�mΉή9ζ?χ‚;YάγΤ α��}ΊΪBΩq΅κ΅Ό€—½ΏδΦυχιύτ�DΓ1I Ώ:aΦ»ˆή/ξ Α––-š™·{œΠΝƒ΅κψ4@ΣΘ —頁ΖN•άΓGŽ˜χΡώiΧΆ΅Σ₯iK³ ³œ~ViΨΰσ^»χ 4ΰ5)U²DΠέkϋŠίσί| ?Ν›=Σ„DŽ?.₯J— x ή/7(`ΆϋDΟ§dξΌfά>/‘\{ΧH:wlο 5ΌE«Ά^ΐΨ~ΎhΰΊδύe­�΄pƒˆsfN xoutΒΦ+V� ΊΟΆ­[™λΘ tω/Έν«―₯M»>ΆHŸ—έν,5τίEΐχ‹/‘nυ8OC°†Υ!Ήγ³―€³&ϊί›:+’ηe8Ο Χ—,UΖ纎δœh[υ™ίοΕηƒ~~ύφΫο�½Η‰BΛ�Ρ?Nΐϊφ"wθ¦|†e‹ΚΕ_d‚“ͺTσζ…sœφσ�Ϋ@˜#φu—άͺϊΜ,S�b’Εμj}φL ³j¨Υxό;Nψ0α8ψΟ τή�zΤο0―:Υ;έλΥύ^ aίροΎο?K^υe)SΊt’ιξϋsݝfrΒtƒ† ug™Wνξ]Ÿ-:τ}φy/Pζ^fF2έ'φ*ϊ,Φg²±ώlwχc?kέiώ―ΑΎ_κΉχφ[I>ΧΥMύb9hτ9'Τ{ιΏ�€ ΠΆυϋ₯~Ο 6„DŒδΩ₯ϋՐη³Οτ­<l˜ηό£O>ε3Ϋ~ΎληŸϋ9μ…τzoΦ²΅€Υy±zŽψoΗώlΆΫΐ8 € € ή"¦·3Ξρ"€ €©L€ b*;!Nsμ ’v±|Ά.ΤŠ΅jΝξέ»dΑΌ9έιΡξ’)S&9ώΧq:(!\•#Gi�Ό•SQ%£œp* žεTyΣaσ¦ ²rω²€Ϋa"ΡΈ?k V+ώlw‚ZPΓEΚ—7?vκφ—/_!œκrφ`4œ΄Ι©|ψΝΧί8U³Θ­·ά,·ήz‹©ͺ�ΊM{o5 hh@‡½Ώώ*eΛWςζΉ#^}EJ;uΠκjcΖΎmΖνοΝηΟͺΥkœͺJΏΘ]wέ)W]™Pi,؏κZεOΓ#ξ ?€ϊιsΏήpύυRΤ©„mQ·½rωΉΐΉ—C 9i{΄]:<ϋό‹>ϋτώŸdΞt–™WΊt)9?kV3,ˆ¨Uμ�wͺ₯ιΧ©φxηΕΜΈ†9ύ+QM6Γ'0ηpΠJP«?\+ٜ*zeΛ”7Έ™T€Νμ,Œ?‘ξS«BeΙ’PQηη―qŽU­ΰσΓχ?˜qύ£Οa cΈC4>ώAΔ£GΚβ%KEJχ;aή‹.ΌΠμfΛ–Ο€Aγ¦ξ.Νλ˜Q#€h‘Βf|Ή6s+|jeΞ!Ξ³ί<οjsΝ[ωώπﳑήΈa]΅^ύζšώζfK›6$ΝZόw/Έ›ΧΖ¨  }&lv*)κ}’y΅ίέwwξ‘rηέχΉ«˜W ΣjΐJ‡~/χ—χή�ΐŒ»μ€�V-Σ°’;DzθϊŊ‘Q#ίτ�Ο={φΚ‡λΦΙA§z£VFΌΗ1>ηœsΔ;4|δayΜ©¦Γ²eΛ₯sΧξf<’?αυ~Χj†:ά~Ϋ-^ΥR�`”έ–ςεΛJ�—ϊy“>�βKΩμ»uΠͺ‡Z™άμ ’N;vμ˜,]ΆBŽ?&εΛ•υξUέ^ΗNΊ«™ �‘|ος6ποˆύάΥIφg³�²ΌG@@�“AΔτtΆ9V@@  DL}'Ε"j gOŸ.?όπΟμ.NΧzξΡπβπ‘CΜΌ&Ν[Κ…Nw³τΨ΄qƒάUό3ύ믢ɜY3|Φη ±ΠΠΐΓ=δtW8Γ«ηnW«Mšπ�ιn9P@O»j»οή„kT»oύΦXwUσͺw²œ—%Qe'ϋG�ŽώΌΒιͺ\»Zφ―Be�x―;x₯�k2ξέχΜΎt½Y3¦yA ^iΈΔτ8gN›βUΧΡΆϊw9­Ϋ―S·–Ϗ―ξϊαΌΪ.Ιp΄›Ί’χ%.’ͺFυΦ¨‘^©Α‚ˆv5δ6tΘ 3iτ˜·dΰΰ„š½Œ=ξ†\tš†`~€‘Jhέ²…΄oΧΖ,ξ�γ΄½pΗc±O Ω4iœP½M―ώέ kSΈ>vQο…6N•O· o½Oή7V²gΟfv§Οq» f­x4Ε©§ΥΚtΠλvŽθšμ„_άΰ“ž=O±tŸΛœJΊϊ£ΦJ;•vuX»f₯ �ι1άW²΄wŽέύΪαb ωΆοΨٝe^u»E�zύ»-_�Œτω%³Œεκ?’pNά•νΐή&Κ ύ^vgωTς χΪ³«ξi�ξέ{ψ“ž›n];Λ«― τžov[όI^£B±·ΥΌEkŸnθ“ΫD‡vm₯•Σ­½ώΟA{έysfΘ—'„ύƒXΪ%υ”I˜ηš†QnΨX>�ό ³z4ΟK{�npDƒκš&΄Χžh\ŸΗz­ι Ορ’w$„T-λ?-ά{Σ}}Κσ�=.ύœΠΟ `ΊAݝί~+Φ¬cͺμΉΑωaΓGˆVΥ!�s’]ψΊΑ5 W5iΦ�λ–T―շǎςBΝώα5χynΡ4ψί?‘>/ύ―{ΑΖυy¨‘"�aόΫc”p³©ώ}[α„pΌ�2I½·ΓΡώΧΏ»žž#ύGΪ]ω½%ξ7Ο€Mλ?4ί#t7dχαͺεNeΨσeγ¦M�ΌeΒgšΟ9qώqDσmΌg…�kWqφ&Ϊ‘Rύv·τO=ω„Τ«›&υ–ΪΎα΅=ξ‹ϋdρ‚Ή^ΠΆ†S­ΧYΊϋ‰ζ5šο—«W,σ>SυΏ³Ύώf»OS4δψε—_¬Τν³`oz=υ€ΌΦnΪ;:•λm}�=φXWY·nƒΜ_°0θ–έ έΩΉ#Ό Ϋ‘<»4Ψ―ί£΅B�^σέB΄{mwx ZΡͺ’:ψ�ƒ;ˆ¨�ΐ q³ήg†ή§zΏκ έ˜ί[ς~3ξ�'Τηˆ�zϊή}ξΊσ"ΊΌ"€ € €@z ˆ˜ή―Ž@8ΓΟπ °{7ˆ¨ΒCNΕ Ώ…²ŸM²e�―ΫX­n8tΘ@S‘K7qξΉηJΫ ?”ΡNE§BNe§R�vΉdΡ9αόx_±rU³Η]?ύ(?H\h“H1 ³ιή:ψ�P=vτH―RΡs/τ“‰“ώ«Ί’TƒμŠdϊγi—ny‹Ϋ]ϊΟ³Ό�Α©ŒS΅zMo=±DΦκZΕΡ΄ϋ[νW7xβΞ‹υ«άλυt™1kΆh`θν±£Ν�f:οέδ’EσM…`UέΆ…ςγ΄»¬Ύ†RpC.Ί�ΫfΧΑΕ�.ϋŒτρp}μ ’EμκDΪε±VŽ΄­¨έŠk\ύρ�ΎύrΙ₯—˜EmΟ^7’ρϊΥ“'{$άWvχŒvHΦ�<λ~μ�€5h‘UΰBάkY—χV$5/�λ@»ξΤ ’ZΉͺRΥκ>]›ώΌϊΚKR�lBw–ΓGŽ­ͺι�ADϋ:Υ }Z‘ΝxώΩΎR­j39XΩpŸ—φ>άΰH8AD Υ͚1ΕlF»Ϋ�ς@ {“IŽΫΗJˆ:ΠΖBy^ΊΗεήv©‹—,‘�N¨Uw9 ½kˆΨn_ΈηdΰkύεώϋK™νͺζΦ₯sGiΦ€±™οί₯―{ŸœŽ ’~^Ή•zMcBψσΩΦΟECΖώΓι "jχφε�ύެן^‡v[ΏGΘƒΨai·}ΪξξχH²Φ0έό9³Μ³ΫgΩU^όCξ+UΪηΠυss©Ο’%‹™^�be/4g—9“AΔwή-nΕΗ3KκϋεGΧ™ β%χ:|ΰ£xγV³ΦMθχR;άΞfS:ˆhοΡj‡ZυΠ˜3sš\uΥUf²ύsμ βΜYsδOχφYuκδ r]Ύ|fZ°τbο?œ’ύxΣzs/Ή;υ�‡ξt^@@@τ&@1½qŽ@HeSΩ qšs…Σ Φa§ζNw“φpε•WIΪuœ�ΊV΅«fϞΓι†3‘ˁœ c€MϋNζG·ί~ϋUƍ#7ܐίωρώA³ΙŸwο–ήgožqb*P½ZUΣΕlξάΉ%§Συ]ΖL έΊι{w¨ί ‘W9E§=Σ··<ψ@53[»w[Όx©¬Ϋ°^ΦoΨθύΰξ�kΏκτΛ–,4\ e•tΈn—€οΏ;N ήt£YΌCΗ.²rυjoUϋΗϋΉσΘ=ŸςζιHs§;ΘΞΫ›i:O—q‡^�λ)uj%ύ»@v—‰Υ«v#©!M&MžbΊ\Άƒan΅- 8,šŸΠ]γςN—½]ΊmB(Α{e;,J˜Η Ήθ6μΐ„»ΝW―0]φi7Ο5jΥu'Gυ‹}FϊƒxΈ>vQ«ωωnμνΉΑ&½6υ΅νJψΑš΅½λߞΝΈέU²8΄CΐvΨΚέ—]II+μi7Η«V­qΊφή”¨"•»Žϋj΄kfν’Y‡’%JΘΰ―™ρ­NXI«φΩC€ΧAΕ εεε~/˜M3·χγŽχΉŸι‚Rί'ΧΕ¦»N°Χ”"ΪηKΫπσξŸMSά��υZέχΣgΞ’§{'TŠζyivςο7ˆqρ§Ÿ€J΅„ο2φvƒΫχR(Ο�@Ϋ εyιΧ”iΣ₯ο3Ο™ΝΈΣf͞#OυJθΈΣ¦Ν˜)½ϋ<#ќ7 €; TW«ϊΉύ»Owο“ΣD dι47θ§Ο“”�ˆθ~Άj[έΚΛ?ZΧίψ·ίrͺ3ήb*ͺΏΛ—.ςͺPξu*"žtͺΨιΰήSϊκ†Ζuz©2εMΰΩνvX§-tΊrξξT₯σ젝]1ΥΎ7ΟdΡυΠv§d1’ο—³gLυΊ�Χ.ΌηΟ_ΰT!ήl>‹άο‹ώήΡΌ·�Α…hd›ξ}žRν@³Ά/ΠηΒ₯—]κ5έώ`Nχ}φy™2uš·œŽΈΧ¬VM.[‘rΐp€ί»tϋψ>οίpξ‰ΏO$ωί Ί< € € ^"¦—3Νq"€ €©T€ b*=1AšuγM½ͺ†ϊSF½9Τ[ςΡ«νh%E­†¦•+τζ‘Γ‡Κ'ΨhWHά±c»ιVΦ[™b$ aΈ1#‡{•S’Ϊ¬]UE—ΣŠ@Τ ŸώƒVŠ9jT’κBξr/½ψΌTͺ˜Π]μ+―Ύ.Ϊε’]ahΟ/{€\₯„*_ξ:φχcί'― θΞ2―v5E�XG&wή‘Π-€πΩ@ ίl\·FΞ9η―ς� 'ˆUΚ dΉƒ†ύŠ-"/<χ¬™dW2s—±_C ΦΨΛ‡ζqC.Ί@Up–-^hΊΦΌ+TIŸΪϋ‹d<ϋŒτρp}μ ’΅M=vν†|Βϋγ ƒvΛ¬U~ v΅!ŸRΥ€άλOχ‘Υ€φ�”Ο{M^/θtθΠ!ΉϋΎRΊˆΟ0cΪdΉ&o^ŸiϊF+‹{χ]ъ­’6gΦtΰ±+|ΎΦ�%)[¦ŒY%PεΤH―ƒΆ­[yUΫΒ©lψX·G₯aƒGL{&;!Œgœ0F€CJνJ›‘΄qΩ²ε�Ήkw³h4ΟK{_n/œ ’κ 7Œξ½i·Υεyι—έUΈ;ΝΎ.6mX+gŸu–ΈαΔhΞ‰ϋΥvzΞΪUν.οή'_WŸΑνšyΫW_Kέ‡6σ\/;<―ΥΗ‹-*�­}ϊl0Θ SjURν&ΨώΎa―νUνn5ΔͺaVμ{σL/œ'Ήsε2mς―bk&Fω'šο—΅j<(ϊΉλ?θ9Π 2tθpSέΪ~€ο΅2€VˆΤΑ?ξ6S:ˆ8e�ΉώΊ„ͺ…‘΄M+ΉjEWμ b»dυš}6ρϊ«/K™� Υ=ύ£]8�ο]>;β  € € €€ADή € €œn‚ˆ§[<ϊύuξϊ˜d̘Q΄ΊΔΰ―zt§λΚ:_‡υλΦΚ‡«Wšρ{K””bwάeΖ?ύδ#§‹·Efœ?ΔRΰν1£€P‘ΫΝ&�rΊ_½j΅lί±S:]†λP³FuΙχo7mš6 £Ψƒ†;wκ(w+&睗Π‘=ωJ§�_ηΔ•ώŠ9]‘5ά,κ†μ€P η£ωρήξ‚0ΠqΨmŽΕΈ[iH+>½σnY³r™dΛ–ΝΫ΄VΥ»φšΌςP½„κ‚ 7‘-[ΆzσύGB ΦΨλ„ζqCΡ„\μύ‡2‹}FϊƒxΈ>vΡΏR§«D TυO—ΡΠΛ¬Σ$gΞ‹υ­ά�ϋ>―εΛ—•ώ/%ξͺ1ΠΆt9νΆΑ#ϋ΄Υ]_«EΥ¨]7`Η1£FHΡ"…Ν’Ϊ΅εϊuλMΕ1 ε9rTξΊη>w3ήk€Χ]arθ°αςζˆ„*€ή†ƒŒΨ’δ*‘Ω„79₯ƒˆvΥY­4»�y>'5|ε±6lάh‰ζyiοΓ η…DΤυ7oX'g•Ωl*œ�UΓ½7νΆΊγ‘—Π½q e4h\�lY©δlΟ�’¬‚§ΆSο54„Όvνzy²ΗcζύμΩs₯g―§ΝΈύ'�λ ζƒΥ₯Oο^fSv;{ہΖν.U�ψγOΉ·δύ išD κHj#Ϊ΅•V-››E::ίV8^ώCλ–-€}»6frΈέHGσΌ΄Ϋα†σΒ "Ί]γκΆ‚Ÿ½w<ά{Σ]Ο~ εyιWΈAΔhΞΙ΄)ΚΏΧš¦Ί]όΪνΆ«ϋšέj~Ί| γGΧ™°VRΟθPŸ—φ΅c·/©q ΐjχΎώCj"j[Χ­YeώEΈ•;υ«ΟZάj™ζυΗuΩvύ�4vtBp:PuηNΪI‹ζΝΜ–όΏΛΈ›φ>±Γσv[wϋΡΎΖςϋ₯tοΌλN©R©’”Έο^SmZΫχηŸΚ=%"~ΫΗ¨ν]4�™dWΡ΄— uά "jΈ΅p±„PκΊ‘<»40©ΑIΒνR› b¨g‚ε@@@Σ+@ρτz³7@@?‚ˆ~ ©ό­5ˆ¨ΓργΗdθΰ�*¦4mΡZ.Έΰ3OƒWγίyK~�ν7σ^�΄nΧΑωq4«y�ΞΨΡ>σΌ…A ;<₯έ³iu4{Π8AE·‚SrAD{έEΞz—\z‰™(Έ₯3τ‡vύΑ]‡NΥ"·ςb°@ƒŽT11© ’ݍλ’ΕK€Ϋc=Μ~Sκv:xπΙ‘#»h—½γίϋ@΄«Z­—Ω©¦]~nήό±4uΒhI ‘ό8m―o‡μ�GνeμρHΓ`φ6Ε>νάIš6idvέΥιξ~ρ’%!5#\;ˆ8uϊtιΣχ9ŸύΨΧr οΆmœn„�„uΨϋλ―²~ύ©V΅ŠyΏ{χn©Uη‘ Υ¨μJMfηOR‘΄ΛΛ…�~ΆhΘε'¬a—δΞ%υκΦ1“΄Ίay'τΚ`‡j¦Οœ%Oχξp΅UΛ—šλ]ƒ=?�Ό[ςδΙc– Φ u€Χέ•f8Η‘Ο΅Ε‹ζ› •Ϊ°`Ο§€η7Ρ�Κ,œι·Šχ6” bωre€�Λ/™u‚=½ ϊDσΌ΄7εφΎϊϊΣ-­=/©ρ§ž|ΒΉΞͺκυm€hε�P†pοΝ@Ϋ εyιWΈAΔhΞΙ°‘ƒεžβΕM“5”«α\{Π Ή=ŸxάLς�œr«ωιL�£`L*ˆκσRΫ¨m gVEΞ­L¨Ϋ  LnZmΩύG:γΖΏ+ZEΦp»f·"’ngςΔδ†λώΡOr•‰νύήzλΝNΥΕ±f�χ?|/ΥͺΧ²g›q ΆiΐM―Λι`…νgm(AΔ@Ÿ9fGIό±ƒ”K—.­`Λ!₯Ύ_ΪΧΊΆΧ�^ˆζΦΈJ²dΙ"'Ož”Ϊu’;Ώhsvξ`�'Ψ†CyvΩΟΦ7†Ύ)ΓGŽ ΆΉDΣcD υ9’hηΞ„Σ&ΛΉgŸγΝjΧ±SΔΞήFA@@�€AΔ4p9@@ ž"¦Ύ³—)c&9ωΟΙ€ ΣpIž«*Ύύϊλ^ΣUœ»`ΡbwΚ}%K™·ώΥ/»μ2©χpCS©ξΘ‘Γ2|θw5^ˆ™€]gίώύRͺt9ŸmΫ]%λ � ’ώ όΛ/{¨¦Nž ΧύΫ₯sχOΘΒ…‹}Ά­o4΄bωΖ³gφό_/™=gž=ɌG¬±ψΧΰo+§Ϋ=· SwGڞŠNEΗ)Σ¦»“"~Υm­Y΅άλv]74dθ0 s»ϊt7>ϊ­±¦‹Aχ} ΧP~œΆΧ³¬ί²ε3iΠΈ©=;Ρx€a°D cB,φiwa©]4j,”!\;ˆ¨Uτ*TͺβsέΫΥ=ϋτ}V¦NŸα5Cƒ„Cί$™2e2Υ>Ϋwθ,kΦ�•χί'oΊΡ,·bΥ*ιΨιQo{$œ ’ώHͺΚ•ΈΠύΨA νͺτ<'ˆαvγh·Γξftζ¬9ςΏ§{Ϋ³½ρ§žμαέ‰ί~χT―Έ«Χh�7τ¨ϋΡ�™΅‹f�‘z΅ͺN@u©Οωz¬{WΡkG †Άkί1Q5X έ}Wρ$»|�U³†τξυ”ΩŽžΣΆνΊj5’ωJQΟΗό93εάsΟ5[³«ͺΩ›ΧηΝ=χ—…‹ώ βFσΌ΄·νvω«αι2ε*ψ8ΪΛω—.}Ώ x5‘ t86αή›ώϋΥχ‘Β›�ΒsΟJΥ*•Μϋϊ½,>s»»θ€‚ˆαr$Ρ²_λ/χί_ΚLΧϋC―…p†”"Ϊ‘�?ώD;•‘ |Φοκn8MοΉ₯‹˜ΰš.ίιΡn²|ω oU»:¬ε>»ϊήη;T9ησΔΤ}Ζ΄)^·ζΑ‚ˆΡή'v•θ~/χ δΖrˆφϋeΑ‚7ΙηŸ‘¨IκΎzε2σyͺ3cΩ₯΄]΅8X°VCΊΏμωΕ»5Π™`W%vΏχZ.Π΄Pž]vZ�‘Kυš΅eίΎ}‰6§Χ�UW^)z,ξ‹ b8ΟwΏξ«ϋάuί‡[ΡΡ]W@@@ ­ DLkg”γA@βL€ bκ:a·έ^Ψ o•‘½{χΘ–O>–ψAϊS�Ό2άWͺ”ΣΝlBE8mυτ)“δΫowϊ@§G»{?¦mύl‹,]΄Pr;ΥSj:Ζ³Ο>Ϋ,»yσFYΉl©ΟzΌA VnwŽΊ= CΝq€”κΥHΤ½«Q+ εΉκJ§»α¦[ΡοψQ�Έβr)yί}^΅7έnΉŠ•u³¬Σu°C ϊ^T½―TiM4D¬ΡJ„eΛ”1ΫΥ.σήqͺ+mά°IN8γωσί >"2 ·+½D ύwΒ4'ŒιVyΤI5jΥ1?^Ϋ?vλτ@α" _hewθρx7qƒ!έοαTX=αΞ Ψ₯«Ξ΄Ον’₯KeS…O:¬[ΏΡη‡λhΒ`fƒό‰Ε>νkβψργ2Ν nΫφ•s*ΠώνT5 €u›ŽDΤυw~ϋ­z{Ӝ‡ΖHΡ"…Νfχξέ+e+$t�τzš<α}Ι™σb3�­±οΘλ™q=Ÿ'Ό'ηgM¨|¬’^8AΔ'ο.ΧΘlώ‚…ςψ=ΝΈ�Ÿ‘C‰VžΣΑ��¨‘œΊujΙ¦Ν›eώ‚EςΝφν’5ΛyR΄X©_―žιΒTΧyξ…~2q�dM4Ψwζ !CE«˜’ΉτXυ˜έaα’Ε2wώsm_›7―hPπ–[nNΤ}₯ž—y³gxχ˜>w¦Ο˜!_}ύ΅œ~6)κtZΆlωuο―>!!w?ξ«v-?}κDοsό›ν;dž³�ΏώϊΛ„UμλO«�]vΩεξͺR«ΦƒRͺD σ^«nάτ‘7oΫWΫΌg¦XΤηΦ€ΙSdΥκ5N₯Λ?L΅I}VT(WΦ‹Κ±οp+Θz qFήχΆά|sA3I+ΞiH|�ώ}&T»έ9ή―ΏΩn/ξ3ΎΔ©<™+gN³lυuΌŠp> xΞ½©«GςΌt1αVDΤύEzNό―; ½χήɐ1ƒ4mΤP Ί]7ožΣε+ϊ†›7m";uπζς†σφJ™2χΛƒT3ΣυORADϋšχyιν Μ‘ξ]»H£† ΜZΏ:UΏ'Ož*»vο½–χο;ΰ’�…Τθ–›oφφr«s�Άl‘ΠM±λεΞΤη­^“ΡTDΤ`ΫΌΉ³δ‚9ΜfυΩώΦ[oΛ·ί'Ω²f3ί *9]ηΏαz'`ξ[ W«WjKŽ=*CήζΠύg‡¨΅ϋΙ“¦šΟ‰vm[;�νPEQ·,ˆ¨σΒ½Otτ˜5`|Ξ9η˜v—.zΐ8a ‘ύ΅ΫΞχKmίΪ5+Νs|Ξάy²qσGς«ΏιΖ₯rŊR€H!Σ­&\±Κ‘5&„₯τ­έ*gΜΩ,½ν«―ο‰γεηΏν.½τR)s�ύR©bŸΟΜ@›­[§Άό―ηfΦ©S§dΝ‡kΝ?|ωηŸS²ε³ΟD»Ήw‡Hž]Ί�XΤΟ―·œˆρΙ–-f³Ϊύ{ι�₯LχΝί;m·�@,‚ˆΡt§Ω―”±£G˜ρνιŒ#+»2XrΫ Dt»4 Ά��χώΛΩ?hκΌΙS§Ι3Ο>￘yo/θ‡ύ€ΊfΦ h’1#‡ΛUW]pϋ:QΓ± "φιέKj>XέμΛξ:ΆIγ†’•±’ΪŸ�΅fα 4˜hWBs³+ΨΉΣάΧ_zEή�`‚ϋV’ ƒy s$Vϋ΄«ˆω7ΑξΣ^8>ώAD�mι{­΄ωμs/ψTΤΤλ­hΡ"fρ@ΠμͺYΪ•qσV­}B Ίb8AΔΩ3¦z]!χξσŒL›1ΣμΫ�]ΡΘξΞΤ�濎ϋ>©κ†ξ2ξΉΥχzOi83PΕ&ο.«~·ΉC'ω Λ/”‹/Ύ(hΐΚUϊ¬h½ vΠΘΛύž7Α'kQŸQ�je>3�}cW£³ηkUΙΚUξ�έΈj•ΕP† 'Ισ/Ύδ-jwoλM 0’AD­ϋrΏμMΔΏϋ`�…Ίtξ(͚46“'M™jξ�e½ηήΤυ#y^ΊλDDΤ}FrNt=»›v}ο?hpIΓΚΪ­Ί=h8Λ�ΐgΟΣ{Μ O%DΤu"}^Ϊϋ g\?wgMŸκUυ΄ΧΥ`b™rνIζ³Q?#CάξΒ£ "κ~΄›β>Oχ ΨF»ώίg449ρύρ>ΑA{yΧΠeν:υU‹΄aώλΨο“ "†{ŸΈΫ΅―Aν\» O‰!�ο—n1Ή6κή<Ήu’›ίΆu+iέͺ…O5k�uμπΎ�<χύτ©“δΪk�qίz―ώήξsΘ[ ‰ϋ»žώίϊ†Χυw°Υό?―νλ�u›φ‰‚ΐv·ΰIύ#’HŸ#ώΗθ³9Ψ±0@@HΛΣςΩεΨ@@8 ˆ˜ΊN�Υy―‘j<(gύ[½ΠΏu'Nœ•Λ—Κ–O?ρŸε½/TΈ¨άW’”dΚœΙ›¦?D�ώϋo2nlΰ Rή‚Œ ­κS»VM/Θ ›Τn8g͞γT|;fͺι5Y§^}ŸκWvξ$Λ—“Λ.Ώ,Q+΄ϋZ Σ ~ch’yώμ&λ7h°;>]Ηξ^9PwwϊΣπŸOτ|JζΞ[`Ζύ�hױ՝ Rnw§ξ|­*3gξ\Ρn c1h—°Ο>ΣΗlJ»κΥ.{uΠJxsjl:ΈA σΖϊ³aνκDν³fϋŒΆλΠIV―ωΠgšϋ¦y³¦¦‚Ο%N…₯9²»“Ε?€6zδ›R¬hQsήοΊη>o9wdޜrΕεW˜J€Φ¬γNŽκ5VϋΤ0H‡φmφ–άΉr{UξN:+V©ζU– ΤΨP}μ ’V―«ιTΪs+κv΅�dίηžχ©ΐ¨5$ηΞΧ.uylw‘©U+[΅igΦq�hxMClφ0pπ2zΜ[φ$3ξvϋ­‘Ύ�Nΐ'XψΟΎ>,wί[�¬―ΑΘΖ šξa3fΜθ³} ;i•Δώ―½t»ξ vΨA―M½Fƒ ±ΈκΥ­νΌZΛE^θ³ w._±Β„ϊYhHκΩΎ}δΆ[oρ�wΪ΅υδ©S卑oΊ“‚ΎjxE»ΛΜγTH<묄jZΫw쐚΅λyλŒ1ΜTξσ&$1bWΞtΣ@_3§*^φμΩάIήλχ?|/+V¬rΞΝoZ¬ž—ΊAνŽτα‡’BNχ΄Y ž2d0ϋΡψ§zξ’[°+j·½ek2Pχ½fc~B½7u΅Hž—Χ­1αμP»ΫeΉήγ�₯[ΉN+€j%P{χœΈλκ}Φ£{wŸg²ΞΣkτΉ^rΊ_β.κσͺΟ”ŸΞg½ύΘ AC€E‹¦!=££y^ϊ4&Œ7Z9΄iΣ†RͺdIΙ‘=»WAτǟ~’*ΥτΩ’’σ™ΰΝ–-ŸIƒΖMeΜ¨¦*­έ΅²[yxλΦΟεα† aΨΑƒ^7›΅ri­:�έ›Ίimγ3}z9aα[ΌφΉ»α5ύόY±b₯Ή?‚]σ―Ύς’”s*―Ίƒ�σΙ'NuτεΛε±nšΙI}—ΡΒΉOάύ,^8Οω¬Μ%ΊΏzυρω^η.«ΧHΏ_πšσΌΉέηZwΫ€ΧΝπ#eζ¬9Ύ+RDzφμ!ZYΠΠj†―9Aa»ͺ‘�2ϊ^―‹'Ÿθα\—…œJΈ—yΟL­hϋμσ/z«DςμrWΦ}τtΎΟVpΎ‡»Υ7έyϊ@―ύΩNEI»wϋώjΠΈ‰lΩ²Υ]ΕΌΊίG’ϋ‘>Gάη�»Σ€Ύσ»ΛπŠ € €€‚ˆια,sŒ € €@* ˆ˜:OΞNψακ«―‘^ ™3e’ίϋ]Ύϋv‡ΣΝμΑ¬έ8Έι&gέίdΫ_ΘΙN†Ό. "­€ώ Y°`A§kπ\²cϋNΣέa¨ΫΤ0ώˆŸ;wN9vμ/§»οCώa»tιϋeΐ«―˜]iŸ΅λ&t+κΎ£YNΫ|½Σ_ΖLœnΥ 똣Ω/λƟ€Dt8/Xπ&ΉζšΌς΅Σ}£^»iiΠηΑυNW€Ήsη2Ÿi ΤηB°@�±Oόΰ=)ΰtw�ƒ]ΕΙΉXΏΧpΔM7 .Θα„>wΛ7N7©‘ΆY+LiνGŽ“έΞρ¦ΦsͺΟΫω HΆlYeΣ5ο?ύ˜dΨ6ΦΖαn―sΗφ&,₯λλ~<άm¦Άε#='Ύι¦N7ς�8όΟC>·;Π+―Ό"M>{RΓΉ5ΟφΌWΛ‘ΓGΒzhψχrηfότΣ�dƒjξqκ΅£ί½48ΆqΓƐŸWξϊαΎ>P­Š<χL_³šωώχtπ qΈΫΆ|4ί/υΉ¬AΎ œ�ΎϊγΐNχξ?†άΕ{°φ„:]۝Ώ@~sNχ�Ύ_Άοάς=κ>b΅œ~ŸΝŸ�:qN—νΏ„υy«6°@@@Θ"Fnǚ € €1 ˆD6©F`‚ӭ፠˜φΌςκλ2nό»©¦m4W Pѝǫ―@Ω2eδ΅ώ έ �ζ„ςK—«ΰ»ο�ΐβs%gΜςαΪuIVΗLw00§Y@»’ j'p}Tͺ>P#ΩκΆ§Ήyμ@@@t)@1]žv@H=SΟΉ % ™@Υ*•$οΥy₯œΣ•ι5yσšhΧΆε+VIρj@‘΅˜΅�»AΔ€―­μ¦ΥM΅‹γϋξ½ΗλV|ψΘQ!umœτΦ™‹ € € € €€M‚ˆiσΌrT € €@άDŒ›SEC@ ˆΐ’E ΉšΒ@IDATσ%—SΛ΄KΒΎΟ<'ΣfΜt'ρŠ@ͺ ˆ˜τι¨�P=y²Ηc> }Ήm›4kފp± o@@@@@�"ώgΑ € €ΐ ˆxΠΩ%ΔT`φŒ©rε•WΚργΗεΛ/·ΙδiΣdφμΉ1έC –uο*ΤHN:%΅λ>$;v~ΛΝΗύΆͺW«*}ϋ=4@@@@@@HV€ b²D,€ € ’SR—m#€ €@zhΪ€‘tlίΞzΓ&ΝδσΟΏH 3„)0αύρrύuΧΙ—_n“G5 smG@@@τ.@1½_? € p†"žαΐξ@ έ T­ZY©_ί8τξΣWΎώf{LMͺWWyΈžΩf—G»ΛŽίΖtϋl pF&Y³žοσ>—η^θΞͺq³lΦσΞ“ωsgKŽΩeίώύRͺtΉ€mηή ΘΥΔ‹.ΊΘ¬όΨ19|δH²Ϋr—ί·o_²Λ†»ΐΥy�–~/>gV› εΤΧ΄)“Μ’_}ύΤ©—Pi6ΨΊ5ͺ? }ϋΈlيͺΡ¦τ³KCΟχ—,ι{(Nε=;œ¨w�aα’%A«ο†ϋζΏν΄ϊ>š b©R%eΠλ �€hΛ–­� q“΄ΚΔq!€ € € €@Œ"Ζ”Ν!€ €„'@1<―Σ±΄D|½�K!ος–[o—²ε+˜ε�u\>ωθ#)\€¨œuΦYB1dFD Υ DLώ₯t˜'ω„ΎDz "†.ŸKNšπΎδΏαzΣxνzϊσΟΏz ƒ�D•·μ°S‡Ž]δŽ;ŠJ±bEεϊλ�3!εί~'φYΗgƒΌyκΙ'D»IΥφMŸ1S5l ·άr³œ{Ξ9ςέwίΙ†›δΕ—^ρΩςΥy�–ή½zši[Άn•N› U«V–šΥ«›YŠzσ,{Z† ₯H‘BfΎ†j>ύτSŸΝ¬Z³FήϋŽΟ4χMΗφν€XΡ"’/ί΅’-[6Ω»w―|³c‡ 1J΄›η@ƒvΕΫ²es)[ϊ~ɝ;·œ{ξΉ¦KήύΏο“O·l‘ 'ΛΖΝ›½UνγΤ‰·ί~›dΜΩΜί΄ιΏεtΒ/Ώμ‘ž½ΊŽ5 ΔΰO­J•Κ•δ”σΏž�{Ϊού₯J™kβ‚9d�²fΝZι�Ϊλ^—Β₯c+Yβ>)\θ6Ι•3·œw^9rδ¨|χύχςυ7ߘs¬ϋα‚ΞuΫ¦uΛD-ίΆν+Ρ*tI jΥ�m+)tΫm’3WNγ€ϋέ³wlt�‘‘£Η­ ͺ�MœλξΊλςΙW\!'Ož½ΦΧ­[/― t·τύ?{gΥΡ…αƒC)Ϊ-.₯₯EŠSŠ…@pww§—Rά‚Cww^œς—–�β-ξRώ9³Μνέέ»›έΝ’μ&ίτyφŽΟάwξΜ]Ί_ΞaWΗ™2f’€I“Θz=¦kΧ―Σ~ρμΨ›3? φ…HΛΔΜ±Xρ’6ΗαWχζ”IO{&σΒ²Ox»ŠsˆΓ’εΛ)ήΌT @>J›&-1ŸίΞώNΑsζY#l!²x±’²έ�Z°p±Œλ?Ψ*!ο;[Άm§eΛW苝ŠΟ˜>… ( ΫT­^SžΥ)R$§¬Y³ΚΌΗiϋΡ¨�Μ•}ΒmΉOq ‹ƒ"Ÿ]?oΫΆCu―]Γ²&Z'"βΚΩ₯oο¬ΡΩw˜zfοάύ[ΌΛΎ–ο0ήSΒέs‚„ ©a½Ί”β³tσΖM`Ȋ-Lvκ؁ΎΞ’…2€O'ΟƒkΧ�Ρ™ί~§‘£Ηjη•ώΎTœ­”ζΙ“GΆγχΒ“'εΩ4‹Ψβ e`Λ­Y³e₯gOŸRη�=,‹‰ίνό\]»v¦•«ϋδ gφ¦Φ.�―οOT£ZU™3zΜ8šΏp‘�Τ8ΚΟSεŠ΅ΒSβύgοΜ�*"       i@ˆi–7   ήIBDΟ[7W…ˆFw!’䁀λB„KtC<β„ο [‹M,{>&„Α±…UR\”«`ΟqλVSš4i,«S!ή³w―UώΒyΑRΘgU`ΑΏΕK–j%z±‹£”hI« "l5΅YΛΦ6ΕvϊΊŽΔΧ¬ZN3dU_Ύ|Iq„Ρ2°ψ£uΫvšHŠE›7¬“βnγγλ§•ιΫ.]Ό@ Q8―WοŸhΣζ­f‚.}]£ψφ;©kχžfE,x+,Π~™ω ³|•`>,^3Q­_»’Έ½­pΰΠ!jΫ�ƒV\΄pašα† H•*–Χξ_Eζ/XH£ΗŽWIν–5αNΒrvi“υLρ8bΡΩw˜κ_?¦­ψ«Χ―©˜p«­΄\]μίΧπύΕε,zο�­8q’“ZΰχΚΤΙ“„π>“–§πXcΔΊ,YΊLŸMκϋ―σζΜ“ί¬Œ»wl£O>I*…“₯Λ�'όsζ>υ{Σj‘Ρ΄I#κάΡ_νά΅ΛPiَ—,ώUαψρ“Τ΄…΅\•γ        ω@ˆωΦw   ^EBDΟ[.½ρΩ³§;vβBΩ*ˍΧiλζOBD‡Q‘"8D`bΐ8ςΒΌWΟύω—Νvl‘mޜY²|σ–­Τσǟ΄Ί,”b+mr~›]³phKˆΘΒ1%€HŸ>=ȟOΆ=αYZΡ[΅z-ύ~φ¬,ηK‘Λ‹/hΧξ=τβε !œ*IǏ/λξΩ·:ψwΦΪ…%’"r?·oί‘½’Ά&ιW²„&cΛ„γ&jCM›:‰XΈΔaΔ¨1΄hρ­Œ#leqυΚε2…',VδΐΠ|}}DŒ€5:%�{όψ±*n‘ωκƒ­ZZ&Σ»Σ}ώό9mέΎƒά Φ&‡΄XΘmYŒX³v]iaMυΥ�mkjΣΚ$ς`ΡΜ1ΡχŸηώVγQa2GŽμ�B\λ6νUiE«E³¦ZΊ|ωrΪ,]fΊ7UΘBΔ™Βb˜;ƒ^`₯ϊeq[(|ωκ₯y&O–LZb΄"^ΈxQΊΎqσ&}$‚~%JΠgŸ&»±%šdAa£† ΥPšH+4‘ήμΐ”χ½•<ΆLy\Œ. ‹Ÿ|ς }W ΏtΏΛ–Ύfi}s€T©’4fδΦJΩZΪq±.‰ηΌl™�ΔV 9l–χτVJ9οπΑ}šπρ/a σΤ/§ιŸώ‘TŸ§€"E S’D ɞ±}»6ΤΊe ξJZκμΡΛdαSf|ΈΊ7Y,/žΙ"b~qdg‡C‡Σ•ΛWdœ?ψ»ƒήςhXφ‰‘‘Ο Ά`ΗVYΠǁχAI!žΥ‹ΘΨZ C9pύj5kΛru―Z±”’&1Yž ˜8™fΝ –υ\ύhXΏuοΦE66b”˜ι-r‹ΒY~p_ˆ<“,…β\Η•}Βνψω+ZΈG)uͺ””;w.·%D ˚pΗ�ž]rRΊ% sTˆθμ;LυΟCςϋ)Ω§ΙθΣO?Ρfπ‡87“$N$­Κr&οΆvˁńλV―Τφ&ΏOv λšό|–ZSΏ—^ί‘Λ–�OπΟmnj!ίsη{Ϋ±s'ň2 χιjί°±|ΕΚfΦU]"ΊΊ7y~–Ε—l…™ΓEaIΈrU“ΐΦ²ž> !’žβ       5 @ˆ5Χw    CBDY m"z!’–©‹°PdÚ5tεΚ%]�qBDc.ΘW 4oΪ„:ϊ� ›6Β� ΡfMK7’\Y bŒΖύ‘][j%\ϋr°%DΤ·cΧ±S'›Δ{³fΟ‘€ISτΕVq½ΨιΥ«WΤΈY )&γŠ9rd£sƒev―ZΈXqλ‡^ˆxλζ-ͺ#,ί)Χ½zAΣCα&΅ˆ―6œ™E9! «[�?Wbw  κΧ•υΩ‚s5 JτΒξ”55±5ͺΗyujΧ’ή½L�7οά½KΝ[΄1s=p@?ͺZΉ’lΎo�jία?‹y솳HαB²ΜHDΕ.Dγ 7Ζ–VΊdƒχ̟Χαέ»wτmn“ΐT_ξξΈ₯ΐ*DXΰόρΗ>fΒ1Ά¨΅{wˆkρψ,�Ωΰ ‘ΕCύZϋ 7ΐ!!{μNωΔџ₯54!βώ=»)aΒ²/#Ρ/‹t~�ύw3ρWήΌq-₯JiωZŠΏX°΄rω)hbήυ6ΦφB>αΆuVΠ 9ž^δ*3ήπ³Λ8m…Ύ?ύ¨Y˜dιδ©ΣlU•ωξΨ›Ό6lΙ‘ ^YŒθhpfŸθχ-χ?mΖLš6}¦6Τ’E θ›―³Θ΄egΞšIyσδ–ε»vν¦N]»SΠΜi”?Ÿι™·ά[²’ ϊσQ χ†μ$v;�Bί~„ m:°Wf13½X˜3]Ω'ͺuε{γ{δ`ω,ͺ:–WgΦ$,g—­q"κΫ;ςSχΕ"ΔΪuHρ8 D9°ΐΉJ΅šΒ}φ7΄xΑ<™§†ΖŒ.ž&Ρω±γ'„`Ύ“Ωy₯cN˜D³ƒηΚ>XΈΎbΩbkœμš½c§��B¦,κμετκ΅λ¨�€AͺΘe‹ˆZ"–½Ιύ°΅KΆΈΛΑΦ™$ u"κ`       Q”„ˆQtαqΫ    ΰ) Dτ”•ψoJˆΘΦŸk^oď§ >N@ &Τ*½b’©“€5-Σ !’d@θ…{kΦ­§~ύΚήΨ]π§Ÿ~J—„Υ’ζ-ΫΘΌ±£GJλœ¨Z½¦™%=Yαύ‡#"}}½ΠΖY!βΊυ©OΏώϊξ€E²/2™άVζΘ•Χ¬ΜΥ„^œf$Π[Ή|©fα±έώRδ¦ΖΪΉ}‹°–υ©LZr³W¦ΪσU‰^"κΕ(έzτ€mΫwκ»’ΦΈΆl\/Ε,–bΝΰYšΕ³Π„©fκjόˆ"Ϊ²b¨›^¨ΡζΒΊcΗ&‹£ΗŒ£ω Ωmγ¨QΥγΞ”;»‹Bύή` klΑ�2 <*V(/³υ’%½hμφ­ΫδWΦTΗ²½½΄ήϊ‹έτ.ŠΪι…ˆ�ξΝ°ˆœΩ'z!’ή½±Ί/½%ΚΣ§�',G6UEςΚΦW Q»³εpEX·L›6­Œ3ο*βŒΤ[Q”.|°υΌν[L.ΕΩν$αΎ{Σ†΅f=±Kς+WŸΫ–-_AΌυA/DtuŸθŸ©!DTgΟΫΩ³K―WΟΒ‡"*λΐό<„μ4YχΗYΪΈήόΗu}}ŽCˆhIi;εΎ•]·V«QΫΜj‹ΙŠ—,-…[6�£”)S’‘hG?‹π"<”V�Z­^ZWd».YΊœ•ΘΓ¬²ƒ ½±bεκfΉ ½@cπΠαΔΒ τβ,vΝΜ.š9.±' ΧΨ~ύυŒ΄f'JΜβˆ1dΧvΝ5,[D|+άwrˆ-švMρY ηŸ₯4Fƒφ§*•*Κ2vy½cΗ.ϊωΘa:|䨕₯>­‹ˆE„10h6Mš2ΥbFΖIΆX΅JeρLNΙ’'£8±cˊ,(Š3¦ŒO’― Y³;xŸ«†‘YDά°v•&Tc!Ψ!*;rτΈpE~Μ¦`M/<βαΨ 0΅–η΅Ti½˜X/Œβzμv}ǎtDŒgΟ’%ΧUA/DdλjleΝ^Π?λ�ξMύ^ /‹ˆFn­ω>O?"]£Ϋrς93yβYGqαs§YΛΦΔ{Υ]AΡ'Ož’•«WӐA&Α8―#»Jfw݁β90v΄�H@«":³Oτχπ‘…ˆa9»τσδΈ:3?΄qεκ54pΠ9Όsύ†τS_“@^ε) …lΥpυΚεΪtΥžζ ΅cĊ©‰ΧYΰZ‘r5Y_oAΧ–Ubεž›έ3ηΝ_PΗ[…ˆ|ΚU5Ηο‹KΈCΰΛ}!€€€€€€€x½c0Kˆ΄ Dτ�₯ύϊ›¬T¦\9ιΗOSΠtϋ½k}1[ο 0'(ςδΙ%…{Ήσ}'έ’²H…SΘή}š΅'½…&UG O!’₯υAžΗψ±£¨„―Ι=²_™r θτχ`Χ ¬,²Ε&ΆάΔΑRδΓ"ŠλΧH‘Ι?�άΒΞR²ήΈ1#©d‰2šυA%f Mˆ�£4χ¬²γP>X,ΘVφX€ΖE2‹Ξ§ΈqγZ΅d‹|AAV-+F€±wί~΄aƒΙzœεΌτι‰Ζ‘O±’ϊ,ΓψΈ ίVœέOwμ�M+6xU¨PNK«‹LΧ ¨Σfj"TU¦Ώκ]3[>Χϊz*�"ΊΊ7#Bˆ¨«{α뾐]”(QBνlΤ—©xΏΎ?QjUU’fΝ &ΆšκΞ ,�²•»ύϋQνZ5€Ε»₯ΛVH4»¨Ÿ:muκΨAkΔ^�,9ΊO,οαC ΓzvYΞU™ZˆΈdι2bQ 5ζ !Ž$DςŽ9D±cΕ"%NΤ[Ϊ”BωΠ»0ΦΏΫlΉgΧΗ왃^dξ BDW\3‡‚Ε       Q€„ˆQ`‘q‹    ΰΙ DτδΥ1ž[Η.έ₯5!Ά"4iΒXγJοs!D΄‹… ΰ―4k�XΆe d7 vρ¨[ Ϋ΄u›fmkΚΤι4#0H[]ΓSˆhd1M/Φ/!b»Ά­©M«–’ΕΌω hΜΈ f\fΝ€ΌyrΛΌN]»ΣαŸ[�Š'={φœΎ+TΔ¬ΎeB \B"κ­ΰρ™:>ΐδ¦Σ²?--Dp–�‡YŒΨΡΏ±θ裏βiUU$dο^ςοΨE%­�)Dlή’5=~άjNϊŒΆmZQΫΦ­΄,Ά2χ‹p½{οώ=zϋζ-εΛ—W)N›>Sˆυfju"Ž Ή­O1jΦΈeΛ–U³Ί¨ϊdA" ΨfΟUY€·PΙV)χξΫ―•Eώψ㜰²xΤ¬¨”_ jΩ’}υef³|N° ±UΫφ6­χ΅oΧ†Z·l!ΫΩ²¨οT/DtuoF„qξΌω4v|€ώVdόψ‘Ÿ)–°NΗΑH€ΜωA3§Ι½Βq!{Δώθd{˜j9χ0n /ξClεξœXc~~x=ζˆy/^0Ovvμψ νŒ1:χτBDGφ‰Ρ ?€Ρg—~ΞκΜόΠBD½ˆUΙqΩ2.‡c‡RlamU +U,―Y΄daι’ΕΛτΣΆŠ?|ψ€ΨΝ9‡IΗS±"¦wΕ:I³eƒΥ+–R¦L™dΆή|hBDe’-4–.o²ŠkΩwXφ&χΕηίΔρ¦οω/]’ΚUkX4€€€€€€€X€Ρ 2@@@@Β“„ˆαIΫ=cu?Ψ³{ζ�ύ—Ζ™ά ΪκBD[d�(ZΈ0MždΞ±ΐ°Qƒϊ/^<Ϊ΄y+•++ά2 WˆλΦm–y”&Ν[ΪuνΩ…ˆz+SŠΊ^ˆΘ"D#κ[₯cλtXΘwθΠaϊ±gw™f ~l‘Μ^P—Π„ˆάΗΟφI‘+Λ9°ΫΧ²₯K‘Ÿ_IΝέ3Χ©]·•υ>ΥΦU!bΜίRκΤ©T7τδΙS Ω£₯mEτ«FM›ΫΥ©φK/ ―³d‘I#wΓϊ΅t·Q́­Ώψ�•/[†Š),©\φψρc*T΄Έͺ&E€,δ03pMž:M+s6’"Er*\¨U,_Ž˜uτθΡeφ,œ²ˆqΜ¨‘²^h�§Ή’· YθΥ§ŸΙ•�ΌΩχJˆhΛ½₯¨U΅5:T™ΊZZͺf̘τφν[šΏ`5nΤ@Ί`gΛ…Ν„ΐΜΦή+X Ν˜>E?u»BS#·ήJ <'(ςδΙ₯υυΧωσT­Fm-­"ΞξΥN ‹ш‘ΎoŽ»σμRΟ‚§ υ.¨ω}[ΔΗΧƒΝt«–Ν‰ί―V―]G,FΤv}ΌnΝ ω ήύϋo*αWF+Φ[ξԟ1\AΩ"†eoς8욞ŸeJH+v>Φ―G κύχΞ;|μυλ?ΠN €€€€€€D6"FΆΕύ€€€€€—€Ρσ,Fττφί·†«^³₯M—N–έ½{GX‰™cXOeBˆ¨Hΰ ξ%°|ιb3Χ­’Άν:Θ=©De<’#ωœ"κE§…‹ά›Ϊ½9wˆμ`P¨"Z2H*•¬ΤIe„[ΛΫ·οXυςӏ=©v­šfωF(³ οΚm&»q.αWšž>{fTMζύτc/1ŽΙε%»nά¬…a]ΆŠχψΡ#:α’VΞkqλΦmΓώW —Ÿ_ΌwωΩ­g/αv‡ΦNQnd9Ÿ!~– α%D< D· $SRb.5ΏbE‹�€€q*Iξ"²°­ Z½˜Λ *ͺρgw΅[6�“ΒI.³εŽ•ϋ(T¨ mΫn.€΅5¦―oqΝΥϊΥ«W©|₯ͺά½aXΆdeωκKYV·A#Γ{P έ±7YxΤ½›ιΨMυ„Πά‹«ΑΕΥ™}’"r–Οκ°!ƒ©Bω²²wK«₯Ό.Λ—.’dŸ~*ΛƒfΣ€)S₯Έ“EžXΠU­fmm-eζϋg…ˆΌWηΝ™₯u‘Ρ²…9Ά4§Βξέ!Τ±K7•Τ�%DtfMΒrvi7ϊ>β©BDžž^pΙΦsΩ‚¦Q`WΖG…KvuήλEϋœWΎbΊwοžΦt@�ΎT­Je™ώωπjΥ¦V¦ž‡E,ϊWAοޞ1,{“ΗΪΈ~ ₯IZ[±ruΊ|岚‚Νkχ�©‘°�¬‚³V$U;\A@@@@@@Ό—„ˆή»v˜9€€€D "zΦ2~›37ωψ– ;wnΣιS'ιͺ°ΌτδΙcα~3­°γCΙ“›¬kρ¬Χ‹P/^0»Τ©ΣPκ4&«a\�»‚�j»q>|θ VχκΥΛtύΪ5-€€sϊφιM5«�gMY+jΫΊ±ϋQζΞ›OcΗ›[.eλ{ŸžRU‘κΥ«tq`‘ΕΡc'΄²³œ5ι)·\‘]6²ˆ‚έΤrψωπQ3±…;ΔN²c'>τBDn²g/­X±Š>NŸ:ϋϋk–wνΪMΊš\.[v―\ͺ²‰“§RΠ¬Ω*iσΊhώ\Κ–-«,�ύμYi‘ρώύ{�ύζ_§sώ₯΅eQΪζMλ₯KΞΌpρ"Ν™3—.^ΎD β' ―„¨¬¬p όΥ—™i՚54`ΰ­- d�¦IM»…Kδ=Β…τε+W)Uͺ”T¬HͺX‘ΌVΟ―L9Γuδ έΊt’F ΘΊl•‹9]ΏqΨΒαύ{θΠαΓZ?ϊHx υΩJΫΚU«ιΌ`˜7_jή¬)ŎK›–‘‘ΕŠϊ „‹wξά‘ΑCGhE―„υPu―Κ ‹†6nΪLGŸ »wο�7_MεΚ”Ρ,ΪέΈqCZ"Υ:½°—._±’؝ς£Η€UMΆRWZΈΞfwκz£²¦ΘλΏ^Έ�ώMˆ Ÿ ΛΓyrε’jΥͺh‚ -[·Q^½υCšΕυβ£mΫΆS·ž?š•λξΨ›zWρluυš΅tφμτBΜύ°›,ƒ3k–³Λr\g„ˆ�ΌΓT�ΞΊfζyκ-Kršχσκ5λθζ­›”"E ΙΉ‚p‘žΚ}64„V�^#λι?\"vιΤ‘š4n¨οΖfά–λegΦ„;wυ천˜ :βšΩ•w˜κί!"Ο΅WnT―nΛi[₯-…ˆ… € γΗPœ8q¬κͺ Κϋw2YUyϊ}¬ςΤ•ίEμbœƒ=!"—»Ί7υβέ Όυw~ξί2@ˆhIiˆz DŒzkŽ;"!’G-₯KŸ*VͺB±bΗ6œΨλΧ―ioΘ.:ύΛ)Γς΅κPρ£~hα²°τ΅J@\#ΐ–―Bvn“-έoί²IŠΛΨi‘">š›H5RΠΜi�Β“JΫ»Ξ žGγ&VakteΛ”¦Ι“S’D ΅:ύ ’ΥkΧiiΆΠΘ–94hά„NŸώU+γ *YXιŒΠΟ¬ƒ„"²kδ΅λΦQκΥ)V,“pƒ«_Φ^; ‘¦ήΝ±A7fB­ύR»όͺζ±₯^½:”KΈi?>E‹MΦ³J©Ζ,ˆ4 ―‰f—–dU>__ΌxA‡₯E —˜YΝκάΡŸΚ”ς£ΟS~�―.γ=&’² ΪЏݴiCς)VŒ%L¨UX�ew’FaΪΤIΔχ¨‚ήύ¬Κ3Ί*ρ›‘ε:£ϊœW³Fuς�‘½ΩsΖΟΛ‰“'i•q6T6e—©lΥS…άΉsQπ¬@•΄{}υκε-π½Vgβ„qbνrš© ™ΛŒ™΄nύF•eueχ»Ν„U³„ Mn₯υΨΕιž=ϋΜ\Ό² τǞ=…π5+Ε6xŸ8q’&Lš,έ­λϋ2Šλ݊ϚL'U“ΦSέ±7ω<ϊ‘}[Κ—7·° —\Š yΐ·Β"’-ΧηjBŽξ½‘ΉηΝ“‹R¦L©Ί!°-ZΌΨΚμ±Γ5žέzτ΄r‡ΝTξqΩM.£η˜…Ϋ,~Σ²ΐΠVΠ‹˜-]t―^ΉŒ2eΜ(›6jΪάpM]Ω'ϊ³ΦΦΌTώιΣ�ηqS•4»:Ί&ͺ‘+g—j«�‡ξ“Ο [Φ-T΄ΈΚ6ΌΊς;ϊσ)d‹ΆlΩ–ƒSοnyŸψŽΛο³eΛWАa�YLεϊla°gΟnšuRΞSΕΎϋ’ι3fΚ? Pω|ύ:K>l0e̐AŸMlA4XX-ž2uΊYΎJ°zψΠ!fgΠύh’ΨΟ-Z4₯T)SI ΊUͺΥTM¬��μMΆΌjΕ2ωΞΊ}ϋŽ3[ul#£}»6ΤΊe ­ΤΩχ¦Φ―%!’Χ.&   ‘ƒ„ˆžΉŽ‰“$‘tι2P’$‰)fŒτΟί�Π₯‹ηιαΓ‡ž9aΜ @t”ρι³g�ύ-±Έ&ΎpΝόΛ/§Ν,’ιšYEυn5m‰˜¬Ή!#kΦo(CϊtBυŒnK—φ¬6ςplՐΕ@Ι“*D‹―„Πςr¨mά0Νpο‚ai…Υέ;wώ¦#B˜E9Ÿώ9%οΓGΒ₯*»Ώf!‘£Χ&ΛWY(xφn ΧͺW�] υωγυO&άΌ~όq|Ίsϋ�AŽΆ¦ΆuσF)‚Όw�>ωψ†nιΨΡΎ#ͺž^ˆ¨\€σ3Ÿ=ϋ7tγζ-b‘&BΔpφμŠψ;?ή_Y³f₯δ)’ΡƒϋθκΥλ , ΜφΝ7τ±8 ώξεC;ΧΥΜr 1{κΤ©θάηn£ΪΊr4°ΏζώΉoΏ΄vύWΊA(JBΔ(ΊπΈmπ"zΚJ`  y ½»’%JΠΈ1&·Τ 1Ά―_ig»@}ˆ0l‘ΡΏC{9~ύFMθΜ™ί"l.ξΨHˆθŽ~Ρ€€9 kW αcjαώͺ[ί1Wίζ=        • @ˆ•Wχ   @BDXL@"W…ˆ©S₯"_ίβτ­p\€p!Š7�$3#0Θ¦ϋΜH†·IBD\L @@@@@@@@Μ@ˆh† π&!bxΗx  ω Έ*D¬[§6ύΨ³» ίϞ₯fΝ[»yFˆ"F wŒ         Ξ€ΡZ¨     ΰv"Ί):(O`ρ‚yτυΧYθŸ{χ¨„_‡yT�Xθ'λίΌu“Nžψ…†’ΓQ> bE‹Rΐψ1²σQcΖΡ’ΕK>Μ@θ@@@@@@@@@ΐe"ΊŒ A@@@άABDwPD              q DŒ8φ@@@@@€€€€€€€€€€€€€€x7½{ύ0{πz"zύβ@@@@@@@@@@@@@’8£ψ€Ϋˆ&!bD―Ɓ°€1lόΠ@@@@ Œ D #@4&!b/†¨NBΔ¨ώΰώA@@@@@@@@@@@@Ό„ˆήΎ‚˜?€€€x9½|1}(OBΔ(�€€€D,#–?F°€1¬Ρ@@@@ L D >4'!b„/&   Q›„ˆQ{ύqχ             ήOBDο_Cά€€€x5½zω0y ρ€€€€D(#?0€1ΜΡ€€€€@X@ˆzžέ6ήGQŒθ1θΙ“Ηž=QΜ@ΐ+ |™ω ;f€œϋ‚…‹iι²^yή6ιεKSάΈ±ι矏�Πα#ž~Ϊ΅¨”_IYwΘšΏ`‘ŒηΜω-ω�Π^Ζ―]ΏNύϊtΈΟΠ*φοΧ‡�₯M+«MŸHGŽ•ρΊuj“_Ι2�ŸKhύEφςtiΣQΚΟ?“·yθπαPo7ΎxΟ•ε+J“*%L˜�ίΌIη�Ί@—―\΅­e…€I“jYχξέΣβQ=βμš0―¬YΏ‘T©RRŠdΙιώƒϋtώόEϊύμY§QbMŒ‘Ή²&ͺ§B �Ώ�ώKW―]#>ο@@@@@@@@ ²€1²­(ξ@@@ΌŒ„ˆž·`~₯Λ�—_e±;±{χώ‘Ε ζ™ΥI0.κCιΣg€Ψ±cSτθΡe9�ΰϊκε+ϊωΠ:yβ˜Y$@@ΐU  Σ§ΘζΑsηΣΈ �ve؎Ε<…Ώ�^–-XΈˆž>{fX/ͺež>i:ΗYΤΧ’U[‡oΘ T©byYΛΦmΤ£Wo―ZΉ ΠOΖoίΊM~eMuξΨNōλVSš4id!ΓFΠ²ε&±κΠΑ©bΣ8›·l₯ž?ώd§ο)J‘"9΅hΦLrŽ/žœψΤi3hϊΜ@»7ΑkΠ±cJš$‰Vουλ7tπηCΤΑΏ³–§"ωσε£υλ�χΏ“ο{•―�Ώώz†FG§Nύ’²μ^YŒ<+Pϋή0kN0Lœl··†Χš€bΠζΝ›RI__J”(‘žΫ·οΠδ)Siνϊ VeFXk*ΞξΥ v'ŒKyr璘1cͺlΊϋχί4rΤhΪΆ}§–‡€€€€€€€x;½}1πr"zήΦ¨U‡�«HφΒΣ'Oiζts‘@›φώ€„ΆΪήΈqƒ–.šo«ω  ΰ0-Dμ�©#5iάPΞ§u›φδˆ…8‡'οΕ!DτΌΕc m­Z6£�₯KQμX±Μ&4›& š­P«f κέ«‡&΄¬wϊτ�¨uΫφfBάQ#†Q1–½πζΝjΦ²΅CbΔΥ+—Q¦Œ΅ξζΝ_@cΖMΠ�ή ο5αuμΣ»W¨¨XΰΙBΟΠΦĜ+ϋ„{`bπœYτΥ—™Ν;|Ÿβ}�oΐ@Ϊ°q³a92A@@@@@@@ΐΫ@ˆθm+†ω‚€€€@$#!’η-¨^ˆxㆱ۸;Β²ΞξΫΜ&ίΆ}GŠ/.ρͺ·oέ€;wnΣΛ/)}† τΩη)΅ΊG„…₯ϋχjiD@@ΐ"ΊB-μm D ;Cwχ°eγ:J™ςΏχ¬Ύ{BDIνΩ½C³jxψΘQΪΉk7%n–[΅lA±b™¬·M›1“¦MŸ©u«„ˆΟŸ?§­ΫwΠoΏύNwξή•b«F HρWΎyγ&•._QkgiΫ¦΅mέΚ¬(2Γ{M”‘­Pο;ΐ¨OΡ₯+W(Ω§ŸHAuͺ”©$cΆtY­Fm»ξ³±&f£|ž]Ω'άKn]₯υPŽσ~™)„ΑOŸ>₯reJ[δπδΙϊΎˆŒγ@@@@@@@Ό„ˆήΎ‚˜?€€€x9=oυBΔρcF:ΈOϊ•)'EŒ<‡iS'Q‘‚Ν¦3jΜXZ°p±Yž­ΔΆMθ³Ο?“Εν~π§ύB4lΨͺbߟ~”ΩμϊωΥΛWΤΡ�™v§kb"?rψP*+άs˜<ΖL4θ>±&Su4ώ‹ΊΊOZ χζνΫ΅‘ιί7μ’™ŸΚj(WψηŸ{TΌd©�E @@@@@@@Ό”„ˆ^Ίp˜6€€€D"zήJκ…ˆΟž=₯Ψ±γΠΏΒϊΧ³§O…Ε₯λ΄uσF§'*ujͺU§ΎlχΰΑš4Γι>Π@ κΠ[V»ϋχίΔψβōG₯J•€Ψ±bi@l _ΌxA‡₯«W�Ραώ«Μ™©hΡ"#F ΩvτΨρ4ΑB­Ÿ.: a–Ι"bώόω4«n‡¦+—―hυψLdχ¦ϊ „ˆΞŽ©οΓΡ8 4ƒfLs΄Ί¬·oί~κΨ₯›SmŒ*[ Οώ―0ƌ@IDATqŽNžΤΈaŠϋή₯φω ¨ju“ψGV §ύσΚCώ~φ, >‚Τ«GeJ—"vΝ|„Z΅igY…ΖŽI~%KΘ|%ŠϋBD¬‰ }ΧΞ©q#ΣYv_ό1HΉς•¬ΞE¬‰±1,ϋdΜΘαB4ο'χο!%�ζLχV‚θ€I’Θ:>%JΡ½{χd        ΰ­ DτΦ•ΓΌA@@@ ’€ΡσR Ωβ“ǏιΝΫ·”ΰγšgόϊΥ+š:9@ZJ νŠϋ–€œΉσΘjEA3Œ-Ξ„ΦΚA’ϊQΥΚ•δMϚL'›˜;;ˆrεΚ)σ,…ˆf χγΗ§{χ―I(bYΝY!’e{Λ΄#cZΆ±•f €mΫ΄²Ul˜�Ώ_ΟΠ’₯Λ ΛœΙΤ 5mN§Nύ’5g![Θ�ν'N™W°PQ+Α“VفχΧ�mkb—±JhΘ–ΓbΖ4Y{χξ&Fe‘βΚU«i’°Ϊ§wμΐ0n«ΒξŒύύΫΣΧY²Θ>Ωr¦ήύκ[ρ>UΦ8�8χ§x¦'Ί-λ„"²UMvˁ­ZΦͺSO tY¨Λ…S<ίΑƒΘtˆ° η/,ιΩ z‘―AΝZu5ρ°jΗ"β‰γΗΚδž}ϋ¨ƒg�BDξ8ͺ― ―σ¬™Σ΅ηΞ�R)3š Γ²OfN§|yσ2bκΤ΅;ϋlες%�ϊΕK—¨rΥ€wΟίΏΟύω—¬πV"zλΚaή    I@ˆθy Ιn”Ÿ 7Μ„@GR§NCUkԐX2ϋάgiγϊ΅ϊ*VρL_d¦Š•«J‘ 2ζΝ ’ϋύZ5B€3¦OΡ\ύ6hά„NŸώՌ‹^Έd$Dd[Γυ){φl”Y,·yΛ6 ˜4‰nίΎ£²#τZ‘B9jΫΊ₯οSΛpγΖ ι:ZΉ‰Ά,wGΪY!"‹"‡E³gHαδα#G©eλΆTΉb‡…ˆ,f',*‘θa#hΩςV·£\³ σj5jkBEύ~ž7ηœΕO«,2’⚰`y^πliα’qlΩΊzτκmA†kβ˜ΡΩ}’"vλΡ“ͺ Χτl9—Ώ7kٚNœ8IΦ�’΄iΣΚ5ΡκΡD€€€€€€€€€Ρ  SΘDBDοZΝ―ΏΙJeΚU“~όDX7œnΫΊαηŸN΅„…­A±ΥͺΫΆΠ―�;ν]7ŒΩ‚DΥ+—Q¦Œεψ~eΚY‰ΜXX4lπ Yn)DdΧΕ#F •VνέΐΓ‡¨ˆ―ag…ˆξΣp"–©„ˆώužͺΧ¬m5;½‹Χ.έzJ—ΔV•\Θ`‘'―i±"EΜZ³Λμ.]ΊG˜D³ΙθŊ₯Iγt9¦([FΫ΅k·UΎ;3"²HmΣΣάΉs‡Ψbq¦L™θωσηb]λH`Γϊυ¨{7“D{�™Ωjά΄Ι₯₯7Ύ ²Ρ2θ]wΟ œE“§NΣͺ|h!"•Φ„Ε»σƒgQš4i$γ3g~£Ί iΌUk�Z’°e1,ϋDοš™Ο)!rX΅f°8:DΖCvn#^+pΝ,1ΰ@@@@@@@ΐΛ @ˆθε ˆιƒ€€€€·€ΡϋV°£|°ΈέcNš`r―hyI’$‘›i–‘~>t€ΨoY i°I@o)ΚH Q¦t)5b˜l―"²`mϋΆΝš‘Ε†»BBθΦΝ[τδΙYΏ£�;vlb«lω 6œƒ3BDwi8ƒL�Τ�YΓ ΔvΦώιœ"²₯CΆxh¦ AZαBίΛl#7°–υI·hތ7l@‰%4¬Ξ"Ίω Ρτ™&WΓ†•Β)“έ2wΦ δΟgsΔcΗOΠΨρˆΕa"8"DδqΥZκηΐ.ΠΩ:v�Ν–9͚M…ΫkΛπeζ/hvP %L˜@νΨΉ“X€jXψΘΒ.G£W―_kվȐ‘R|–B¦�ώϋϊγΟstυΚU6b”VΗΥHT[>‚ηΜ’―ΎΜ,‘]Ύr™κΤmh(ΦŚΨ"2@Wχ‰^䩞]ύ²Kfε>ώΨ‘C;V,ω:wΎοT5\A@@@@@@@ΐk @ˆθ΅K‡‰ƒ€€€@δ !’χ­c‡N]€{fv-0n΄Υ ď�15mή’b ‘‡ΣΏœ’Ϋ·ZΥC€Ψ# wρkδ²²AύΊΤ£[WΩ…^ˆX΅r%8 ŸΜ?χη_ΤΈI3Mτ‘Ζ;vψ […ˆξSΝ/΄+[_œ<Ι9Χ΅GŽ₯­Ϊ†Φu¨εJ”ΓΒΞRο-δκM›:‰ ,(³Œ\jλλ†―T±€€€€€€€x2=yu07ˆ DτΌEŽ=½ύχ­αΔͺΧ¬CiΣ™Dwοή‘VwTE)6oΥZ βΛ¬K/Πκ•ΛU1�  ΰ†υλQχn&α³₯₯6ΆtΆeγ:Šϋ^τ¬"6k�˜:uμ ΗΪ³ouποl6�^άfOˆ¨vπ\š`[ψη�1Ν&JBΉΈ ₯šV|�ώ}+ːZ‘%Dδ&,΄=fœΦΊB…r4lπ ™f’_™rZ™+‘όωςQΟέ„¨o¦fEŒο›­Έq`!’Yωϊ—n„'L˜HreΈ0·a ‚O?VGh¬•`V yvΫSXOόD<Ην;t σΈ–8*DΤ[}ώό9ω–,­Ν»Iγ†ΔξΙ9\½z•ΚWͺͺ Γϋoޜ iι‘3Ωςc“¦Ν΅ΆZE'"Ν›6!v™Ξaήό4fœs?m UΦ„οΒΨΡΔϋ€‹a[Άnk&,•N|`ML°\έ'άzΗΆΝ”2Ό‹@… ε¨~έΊr�ύ €sώεΦ¨S»Υ―W[φΩ©s7:α’ΛύΗ�θ#Ϊ²i%J”ξέΏO>Ύ~.χε) yioΟ]@+W­ώΰSγ5)εWR޳;dΝ_°PΖsζό–όh/γΧ�_§~ύ:=—€I“Κ6ό]αι³gN·7j0rψP*?ŸUΡτ™A΄dι2«|d€@D˜9}*Ō“ήΎ}K:wΥφΒ€ώ}(mš΄rzΣ¦Ν £ΗN΅RΕς4di�­Y·ή₯½hΨq8fΦ¬Q5¬'GμΡσ'ϊύμΩpέσ‡ϊ2σ4vΜH9Ρ Σ�e+<�vf˜"ErΪΌa|ξ/^ΊD•«Φ°SE   žFBDO[Μ@@@’=oΑύJ—₯/ΏΚbwbχξύC‹Μ3«“=GNΚ•;7%L”XώΟΒhΡ’Ις�ύ—^Ώ~E'Ε�?tpΏY$@@ 28qτgy²u₯Ί …z«Y³~#-ΚqΕ i?2†Ϊ0+°Υ¨–BΔcǎS³–­šΙœ @Κ“'—l“#W^§Ϊ†WeoXw°`«#�g–ržΡ|ρμ9–/]L_}™Y6kΫ�8tΘΩ.P? ȟ/±PΫ2Ό~ύ†ςδ�Ξ2i/#πC»ΆΤͺes9λ»„jΕˆΕ€ κ›Δ%{χνU\�΅sGjά¨‘μΏu›φtθπa— ύτc/ͺ]Λ$n˜5'˜&NvΉ―Ω°‘ΰσ‘ΰτηωσ΄kΧn»C-\˜&Oš λ͚M'O΅[ί…,pb‘‡-[·Q^½eΌjεJ4p@?Ώ}λ6ω•5Υ‘|°°†ί/όοΚ /R•j5hz•ΰY”;·ιϋ‡Ύφτ™4UˆΉ@ΐ“°7dη6mJε*T&φrΨΈ~ ₯IZΖNΛW¬”q£[7QςδΙ₯˜±vέϊn‰ιΞΌŽΪSσfMe—ν~π§ύΊ³{ςφοόϊ? ž;ŸΖMπz>Ǝ&_ίβς>F+ώ}ΌΨ­χ„Ξ@@@>?[τ     ΰ€ΞUjΤͺCi�¦³;κΣ'OiζtσκκΤkHŸ§Li·έ?ί₯yΑ³νΦA!€DΞ »tκHM»G\ρ‘¦ο‡οΎ3YŠ;uοΪYY…ˆή°&ξXλsƒ)GŽlτξέ;ϊ6·΅•({c.τ=Ml²nχ—ΙT«a²Tf― Κ’6ž±Υ<ΪΆiMI“$Έ!’bβΝWg…ˆϊ3dΦμ90iŠέΫw—‘ŸΓ];ΆRΌxρθΥλΧTͺLyuWzϊδ1ΙδΤ©_¨QS“ΘΣ€Θ$D3r8•*ε'ouF`M™:έΦm;•Οbθ L�ήΝ‘=;U¬`HBˆθFT'ξ"Άmӊڢn%g½aΓ&κέΧ$§Ϋσ0Zˆθνίω?΄1"ψ°`œ…γ�^»Fε+V σs„@@@Β‡„ˆαΓ£€€€€Ψ !’ 0˜­"ήΈaϊK{ΛιάΉ}‡vλώ*ŸΛYˆ˜β³ΟθΡƒtλφ-z ά›Ε�8>₯K—$L(-Yp½_Nž ];·s@"5�ΪΡΗLώuή�…!"~ΰQc»zUβW„ˆΥͺT¦,YΎ’ηΟ_Πψk7­�ΞɝνΌqM\Ή�°'ŽK>>Εδ°‘Yγqenhω ,Y΄€Ύω: „ˆ‘d©Y8Pζ½xŒ­ ή�n°"JˆΨ°A}MLΏyΛVκωγOφ¦‘eκ]•„ˆ©S₯’ukVJΛ�Ϟ=§~₯?ˆ₯h~ρ{Œ„ˆϊ˜cpά%Ddρ5�?œΈqγŠοήΟΙ·δ‡ΩS6n#ΜΩ"ΪG…ˆ|ΗK/ ―³˜<Ά|K˜φ©’@@@ΐU"ΊJν@@@@άBBD·`tk'z!βψ1#ξ›�‡φ‹/ λgΝ–]X1YΎyόδ1M�π.Β '‚Lπ`ή(zSβW„ˆΌΪΤΌqM΄Ι;qUˆΘ?jοΫ³K Eξ‹?D(VΌ€£’*˜@ˆ΅Ÿ„ˆ"κ]ΚΧmЈΜωΝcB½k£’±oŸήT³z5Ή&K–.£a#F}υρƒ`E§n$ΰ.!"OIοF}ψΘΡ΄xΙR7ΞτΓv!’}Ύ‘UˆXΉbŒ3¦LσZκΓ­[·mΊο+Uͺ€xšφZHΘςΟ¨#‘VΝT½ZβηΧς­ψnπΰΑCa=τ/Ϊ",“­Ϟ­ΰμs ϊιέ«}‘)=|τ:wνA͚4¦‚Ώ“ΟD¬X±ˆ­=oάΌYΊ…­^΅ •/WV6 šM‡Vݘ]ǎ)χ,?cόMnΚυͺV�DeΚ–¦L3RςdΙθργΗt^μ-ήW+W­ΦW5‹«ρωyθέ§Ÿ|ξ‹ϋψPΎ|y)q’DΔ’ΟјqγmžGfΪI°εΦ¬Ω²�³§O%Λͺ|N¦H‘œ�]»Nƒ‡ ³,–Vj”‹φ‹—ΘωT�T‘ δΟ'Χχι³gτΫoΏΡ€)Σ χ)wήBΔυλRΡ"E(c†τ”L¬Λ›7o₯5β½bτ}]Ή6iܐ2‹gθ£ψQŒ1ε{θgρlΨr% ―ο2ξ"–ίIF *1μΪ΅›:uν�xΜ΅XΡ’Τ¨a=ϊκΛ―Δwďιβ₯Ktψπzυκ5nΤPΞΣ�2O©P�ηAΊtiΕz&‘η;‡ΎpωνΨΎ“V�^cuκ]ΚΞώ;ΜΩ§Z ξb?»]:u ?yςδςίC§ΔΏ8¨·ΑsηΣ8qζ¨ΐgjρ„�ϋΥ—_�'Ι>₯Ψβ»/ŸΌ(ώέ|RΌW&NVΥ΅kXψΈΊ&Ϊΰο#<χCLgα?�ά£β%KYVA@@@ΐ @ˆθ‹‚)€€€@T"!’η­φ‡"ς|:u•�3ψ΅ψΘ“'ŽχˆΧ�Pχξέ;ωω*ρ?¨CήxΔδ1 ˆ”8ΕΦ­ςΣ“&k?¦‡wcόcέ!¨ωΎ°ΙU¬­ΆœμΘ!ω# �X]�‚ι%¬³ΥŽE‹=zύDGŽ΅ͺ’·Ψ /d+KlmΙ(„6žΎMΕΚΥ ϊ:ΞΔλΥ­Cl]$^Όx6›΅hΥΦπ^U5G„ˆ–?€ͺ>ψš#W^}�,Ξ?ΈzΏbI£ΐβTώ±Dϊ°p^0eϞMf]βU Z£΄Τ=YΦ5J»kMϊχλC,°ξώύ7±θζχ³gΝͺ©ωž½{ 8,_±’XezχνG6l2*r8Oν“…Ψ9gžόVνvοΨFŸ|’”nήΈI₯ΛW΄*Χ‹Qωγ΅e·e`qN�ƒ,³eZυ|¦ηΙ�awdςβ£G 'ήΪ ΗŸ€¦-ΜεΝ›6‘φνΪhb]ΛΆg~ϋΪwθh& Υ�pnY_Ÿ^!©ƒ›D!œΟ’-�p`‘ؘqd\�‘NΏpͺV―₯/v*ξŽχ&ΈqέjΓ3ΆƒI‰©ΤsηΘd-­vι…ˆ,’P~}_ό^hΦ²΅Mρk)Ώ4fΤHΩΔή;ZυιŽ3Zυey5ϊ^‘ΏGΛϊ–iK QϊσEχόGFaςΤi43p–Q‘Σyξ"vτ�xίqΨ°q³dχ•qΛ ²¨Υ^hΠΈ >ύ«Ν*ϊύδˆkζρcGQ __›ύρ™Μg3‡†υλiοGxλο›�Pž(ίζ, \yŸ„εζʚΈz^ͺ[ufMT›°ξ“πό.cωύ™�ΝΒί;8l\Ώ†�€6‰ΐ.Ώ3¨{4Ί²‹[vuΛΑθ;°Q›πΜγ=Σ₯sG!φ7�£%Λ9X Y Οd`/%κ;΄½vͺΜς;Ώϊξ’Κ-―–�N΅,w%;w. 7ΦζΉ�ϊ΄"κΟ9UΗςΚ�ΎποΤΕLτ>��‰εΌ8½/d—vΟU«Χ”thTy   žCBDΟY Μ@@@’$=oΩυBΔgΒΚJμΨqˆœfK97n\§­›7:5ιδΙSP™rθaΥ‰ΓMΡ�O[OόCtЌi�:ˆ~>ό£έΦmΫhΩςΒΪ_ϊ"ΔAΒ‘€ϊ‡(;~ό8]εέ„h8_ή|”#‡I`ΖΣαs‹χκΔ!pV4τy2aπΑϋήΣπzAϊΑε‚°ΈΘβ„7o�GB¨η'EŸ}ώ™μΙ–0‹…r6ΤF«TΡ$t²'rΰΠγ kvς b�§—qΆδtεςη>‡YŒα�ΐVw‚§S΄hΡd—·…5Έƒ?�L…U:ΆŒΘEβΔ‰Cξ"ς@ϊχ‘˜1bΙ1}}}θγψρeܞQο>σωση΄uϋzp�΄d§E,:©Y»�ΩS–BΆ Έ�ΰ!J ¬f–,α«έϋψ€‰fΦ€"bM,E.|Ÿl­χΥλΧTά§˜΄μΒ NŸώ5hάT2Sκ™uFˆΘ‚¬Νώλ§|ωrΪZ,]Ά\u-―όΌΫ«ΜšIyσδ–υ† !ί›f-lU.hζ4™Λp\X4ε>ΩΚΝB$ψύw…E³ΧTΰϋ"-… oιbaΕ%³Μwζ9P)!’Jσυƍ�ͺfρ]'GφμR@ΗBΔ—B¬¨\N³EΤο YΟ§WnΔb^³ζ›Y’Ρ ?ψ>χμΫG.\”bΒκ*�ΆάΊtΩ ΧθΫ«|ΆTΚΦU_Ύz)­²…EO"ͺΉΎ|ω’~�ύ¬°rω@XΙK#-Bz‚q–8σςεΝ+§ΙλΒgήωΏΞ ‡ρ)—°–ΚΦΝ,…ˆ,ζ]±l‰&ŠψKXaUϋΨ�²$jyFΒ~ΦΩz+[uε½ ‚^P‘ΈήΉ{—J–*«ͺiΧ cGΝ­τΞž«•9qΗ{“ΗlΫΊ₯N9δό6»fαΠ–‘…Ά, ζ>}ziA“γ,¬΄΄ΚΊjυZ3Ά₯HΕΕ»„ΕΧ/_P)Ώ’ΪYΖϋΞΘR)ΓΒ�Φ-MΒm½?.3 ξ8£ω^Α.6}}}δTψΌPbdΆͺΊiσ™―>ŽŠοGΫΆνPI3‹ˆ*sίώtλΦ-ϊξ»šhΙR„tp�Š+ήϋކGŸ—τn”Χ­ίH}ϊυ—ωzλklιΉBεj2��μ]άΥΧ>AP ±”‘ξ–N锐RΊ»»»»_ξT,DΐV@ET°ρϋξs—;œέέ}c_9‡ίogζφ#'"š07ο �ΖχZψμΫ³SΟCx'J«�[ΑΊΆzε2=ΗβΌg―>�>¨|οΔQk Œ?πH4Φ¦›Φ―£dΙ’κζ|rζS:yς€^GδΟ—Ο«‰|ήD„!½a>8¬>ϋκΛ―Υ‡iWιΙΗ§BJΠρΑ >œ1ɚ?ΤΏSQη΄)“ΌΖ ΣG΅T‘z ZsΰΪΥ+(‹š3aXŸοΪ½G)λίAψ( ‡Ζόρ>crVΝ΅?¨όΐΌt©Rϊ䡏S‘ΰξ31χΐk„˜R©˜ ‚€ D7BDŒξη#­A@Aΰ?€£οs"’Sλ°ΎaΝϊςΛϝ’uX£ΖΝHν²+©wͺ Ϊ›�!ϊ§Ϊ œ;k&]S�)-†�Ψ― ŒŠ„ρΜΣOω4λύχ? 5λΦUπΙ(‚€ 1ujΧ�$h'•�ύϋZŠfPΒƒΫZ¨η@MŒ·¬Ϊ·Υi fΉ¬Ε†Λ>εΪΚIρpΝͺεΚ•g.h±YΘN=€I*ˆˆηM‚KβxΊjΕRνξ‘ΑH«HΣΊU jΩ\­”ΩŸΒ ϊ“[Ή Q.τΈE�L9œˆˆϋ„ςΥδ)ΣL΄�»F΅ͺ4uϊ 6y�x2ίN›žΫΆl�ΈHΜUr@\i5Έœξ€άŽΓύ‘1”‘ƒš›“KXNAΊ]Κ=gχξo[ύaυλ½J;wξ²T‘Ž™χδ†HQ?ΘV:wρ"aƒόΪ―Χc“™ ζΈTDDŒqzΌέ[‘}½ϋY£† 4ιwδθ›ξ G ¬6ψKκf=vŒš4σŒΰe’νά}¬Xƒ{o₯ήkcόΗ|ƒχΗ'έΪ‰|(wχΞνϊ#• )ξΥ/Ln±1oΪλz½u+jή¬‰Ά·ίžΧpγ:iΒ85sΦlΏ��M^NDΤ�:•,ζY>Rΐxƒ{ή…‹κsϋOΟ·Ί[δ>­‘VΘψσ uŒŽu…ηA iΠΘƒ­ΏφΪ VΓGŒ’ω ιδθ?λΧ�¦Τ©ΠΧ΅κΤ³.¦εΪÁ}ξΌ/Ϋƒ#Ύζ}2ΠόŒ*fΘͺλƒKο"Ε<ο)oˆPj d\),˜"bΜ¦ ΦG) ƒlŒ+cΝQ©Ju΅_ΘR₯J₯‰c%Λ”3ɏϋvοΤs=>œ(Q:pZΗCO"™ΓΒ}&‘Œ—α<ΐξ{‚Ό Ή–Aύ‘Ϊφ­›΄K_”Mκrό²―iίμτ†^χ˜{·Aή~φΉgiρβ%>sbΥΚ•Τ‡P=u֏ΤG΅λΦ3ΕxC]σ‡ϊw**[4.=§ΪŠ™u?Wς‘ΌΎϊ0Ι(cb;j„E0΅A8¬[»6Ψ�Ε—_xUΏ3–/]H)R€PύC9σ8+S‡ŠOl<ΣPΎγsš‰—£ ‚€ DBDŒΎg"-A@Aΰ–B@ˆˆΡχΈ jˆW•κΖ?j=Υ]©(Υέ7έzΑ½ς€ c΅B—ύ ΪΡΎγ›φ`‚‚ΗόΉ3•ΚП>qΡ€(Ž”*Y�Ϊ 3m»zυ*Ε(WŽ‹-•DЁD€«FŒΣΎcg/Δ½z{Θ>pA–Z©²~�6† ‰dδπ‘T²Dq}n7αš(9Έ2†ΉΩ‰V""W聲\Yεβ �!Γ1C\ˆ+"’!Θ‘m»tυ!¨acmΛΖυZιΔN:1+δ΅«ΔπMo¨”Œαd‘nΊ9•α&Œ“\œzœH0{Ξ<‚Š£1σ μ›ΆˆΗΌζδšΩδ5Gƒs¨DΔν1› Κ|0(cλGmΫ΄¦fMλτnTΘtBυcΪ‡λPϋ)ƒ‘[LzξjDΐvΚΕ¬1NΆ°χήg vΥC»q7Άœd�ρηνOΥ€τhή“Ψ "’�Τ�[ί"6Ήm[|ΉΝΕK–ΊV˜έ΅c›₯HꀬΆ`ξl5χdΣ·Κ]©ς1‘uκ5°ΘrΈιdCXΝ‘;/‚΅qw� ±vθts] Χ“P‚Ωγt`ˆ?œΈ[σf|ΉϊžΉuNφGr1lˆVODϋό`ΚαΗHΖh^ŽύάνΊΒŒσ‘T9 “TpQάώ6ŠM₯fS/'It‰{v2�JwρΒE*YΆΌS² an‰ˆ|>…z~Α"ΕΌΚΖ;ΏcϋVK‘€C¨ΦM2‘@ȁ™yσK»Ξτλ?H»/hύΪ•:έ;;vНn*/κΐ0BO"™ΓΒ}&αŽ—α>@Ι‰ˆ‘Ό'Θ›kΤ©Aή(Š»ωˆ$�ϊάζG�Η{qίώρΒ‘ύ{΅r5βνDD„2(ΎB…έiyyߏτƒ0§ΏSQGƒϊυ,uo\»1|υ5�ψΚ�črζΚA9rΌ ‹΄ƒΥƒπQΜίίΕ±‰κqσL†ρ!lϊŒY4~β$}.?‚€ ‚€ ½1zŸ΄LA@[!"FίcNŸ!ƒR,Ό¦άLύδΥΈ ‘*Υk¨ SΒα™ONΣΖυk½�˜‹FM[θ―±ακπφδ·[.‘¦ΈX}ώ“­l“/šŽpyWYm½¬ώC–»Ή±«ΦDS›₯-‚ΐ ΚΥcƒϊ―j׍iΣ¦±\.&OžB»άΓ=s₯)γ.ϊͺV―₯7΄ΜΖ.H2EK”Φ›9[6�£tι�ܝRŠRά@2ͺ’Τ3�₯{˜�¨:“ί~»Žq€ΨΈ “hΖΜYϊάίO΄Λ”.EΓ† �Νζn©ύέG pCŽˆ+""'AρΊRƒ—�8>ψΠƒVΝ&? Α 熀scf �@«T«i‚½Ž±½ιζU8»ΰ$�Πi’pΕ0ϋ33Ο 1Ή ήGΈΖέ»wΏrΕz, Ι?’~`0δDD·οfΣΚ_P.4ξ ωσ;n‚vΝlκ"MΡ’EΜ%}χνwϊάτY\7ο8w"AqβH\oΈšχ$6ˆˆ'”«m(χ„jρAD\­Τ;αzŠΛSσ~ωs“Μ‰dPӜ8iŠ�ƒkό©›q‚-oςξ|'F“Βμ}oρΒωτμ3Oλ:^oہφμΫ§Ο#ω‰y“ΧŸDΔΎύ�ΚU«yυZ]c&” *ηDζDΔή}ϊ\k2ώΞ‡:F£άHΧ¦†JD„`·oyέﳈ ¦θ•9Ž/πA‘°`χŠ5Ω.υž;σιYΪ�>;’ζŒEnΝ-‘§‹ΩΆ]‘β»ωTΑɏτ'Τω$’9,άgξxξ3¦œˆκ{’k™Hϋςs½ΫυPlΤ¬ 3ύφΫοτRώ‚>Ι'ŽK δΧαNDDτ#¨EgΛφœV|Όοή{¬2�¦M«Ο±Žƒ;j' gΝκί©NυΊ γ€f§#Έš¬?""HΠE•z"πHύΐt[’Ϋtυ\Ψ?œ0ν ŸHŸ‰©[ˆˆ 9 ‚€ ‰!"&žg%-A@Aΰ?‰€Χc}ϊ™g©LΉ ΊΡΏ^ύ•fL ώ%rςΙ©ͺ"x<τp:O>₯Œ8cjπ|Ρ€L‰βΕ©^έΪ”3g«9BD΄ A ΞΐfyεΚՐ�όUΘΥʌ»_γZ �ޱqb ŠU»φμ΅6―νκs\5Λδq:Ž3–°ΙΘ’•ˆΨͺ…ΪWγ0Nœ t/ώβ 9".ˆˆ|cΪ_ύ<ΔΆ΅κX„6C°B'U¬ΫcθξΧD±�ε+ς’¬σp6έ¬Μ!œp’ W¨2E<ύΤSeO˜μežABΉς˜ΫΝμ΅«WP–Μ™υ½πŸ~ψQΉ]HP|δi?0eq""'¬šx§#w’#0CŒ„λεβ₯Κzx=NeΪÜΤU9q€GΟ^΄aΓ&{ΆX»6οIlAζ©+T‹"⑃ϋ4±/χΟ\mΛ�|iξ±B…r4¨ΏηžΧoΨHoυμ­£xΏυ—wόΈΡTΈ ‡la†HeΛ”Φe 9šζ/Xθ₯p‰œi»9F:ošrΜ1>‰ˆNd”Ρ#‡QρbΕtsœHθˆΰͺ€nΘΎ‘ŒΡ±±�0γ|0rœΘ(\UΣ‰Θ‰2ΚψόΰΖ­7ή=Όƒvƒϋυ΅J{ςΤι^γ³=�9™-kfŽΫ"εώuΘ°>ΕqΕ2Cpε*p‘1ξΥο»χ^�UADξΣϋmͺZΉ²sRΚυ©Μe@¨σI€sX8Ο$άρ2άgθ"}Ox_ε"�Χ2Ό�pΟΉš΅?υ»pΛ7οψ€Γi]Ξί/ϋ؏η9dΘ@λƒ5νpR35iC]σ‡σwͺ©+œγκ•ΛΤ:ΰQΥinγλϋΨωYΣ§�#<΄jγO¨ψΔΖ31ε8­›M:9 ‚€ ‚@τ DΔθy�A@A@nI„ˆ˜ψ;ά.Γύ2H>γnjt}-”{”κ+uΨΌΩ³θΗΏw7>‚μQ΅J%ν²ͺάΰΚgξΌω>$ žFΞA vΐΖνΤΙ΄Λ]”·iϋ€K—Ύ'(Dέ«6p‹ΧC‡Pσ–­uΕ\1n΅ΌVςηΛg5*&fmΪCcFΧaP―ΖUkp bΧ{§ήWnΌ.Συ�Sž<Ή©HaŠΖδ)ΣΤχ4$σkΡJD„{ilžΑ&MžJΨxΧ 9".ˆˆ\YsΞθ±γ7S±Ιo,R‚Κ uΣΝΤκ‘“\œTΞ8ρƒ>€Ίυ=ξΙPy ADœ5cεΞ•Sί.\Γ±ƒ{΅z―ΦU.ΣπI~α» JΉ¦₯>i?0rE(D΄Β… Ρψ±£tfœαδ§~Ώaν*ʘ1£ΞE«‹jΜ dp-" 7N1ͺZ<>6Οƒ½'†tιPͺT 1Τγ~:‰'P›γƒˆxςΨa=Ÿΐ}ή—}•–œΪΗί»χί�€^mΠΠ'W˜εξΖ9©Β_^rηΞ₯Λ΄ΏχάύχιOΞPΝΪuιΝNoh΅'d€"/”ycΓ"™7κO"’“ϋL7DΔ6­[R‹fMuσ±.θάΥ£Βηt? wŒŽ­u…ηC%":υNήβDD|ΈqGŠ;όAΰŽ�,\μnK>={ŽͺΥ¨εͺ¨R%‹«υ`SGw§ $6oΥΖ―{gTΰ–ˆˆy ο Β]ͺέzΎέƒjT«ͺƒ BΛ–{ζΔcGj…}ΜΣ#njQŠtsΌ²V¬T†LO=ω]Už ^.PΨ+>’‹Pη“Ψ˜ΓB}&αŽ—‘<>—‡ςžπg‘k^Έηο8JF₯κ€Fν9άςb#_λύtεŠV‘Ά—Λί/NDD�Ω³Ω"!‚lΈcΧ.Βz.δaν•+τΫ•Β=Ζ„σ°­―CYσ‡ϋw*ΖΉ¬YDΐ3βο¦Σ5|=b'"r·Νύύ7νΫ»Ξž;O?+Ο0ό�—QnΠ¨‰γ˜ >±υL ψ k2X·{�†›M”A@A J"b”>i– ‚€ · BDL|OΊm‡ŽΪ=3”sƎςyάάE•ͺ5(σ/ΈwοΪA'Žu“-^�ΰ?Ύ+ΏR‘Κ•+KO<ώ˜WΈΟγ'NΠκ5kε?<½‘ A nθήυMͺSΫ³ ½nύFz»—GeΚΤΚI† „8Ύ±‚aε’λŽ;ξΠ�Λ•Un™‘xέΊ „ w܈~|“Γ(ΩθD7~Z+uΖ–Ν=nG3±ͺr;έ§wO}W+”KΛ~Κ΅eΈfΘN$Έ`e.€sR,DΈq y ω`ΑVq©ˆWm/δxήӐΏTν8ΙΕΙU/οο»vο‘vj.6f”ήNϊ€ΰͺ[ΎΌyβ�Π"@IDAT �ά`N�MZγ"žΟηΜc‚ƒίκή•jΥ¬‘Σa£Κm‘ηJ–(AeΥ»ΙUΗ(�ι¬9s­’"ι¦CD ΄ m�ς#\b2lΑΒΕ¨ηΫoΖX�ƒiωŠ•<ΉΖΈΓμ*w^ \p∿ aΩ_xαyʐ!½}υκ5Ϊ΅k·um?™9} εɝ[;½‡†Pν†ˆθf\΄ΧkCD4JΆNiμaŊUΈά$M¬ŽwΐŸmήΈ–�§σΰβ–xΑΙ1_}ύ5•―θQ+γupRˆ§p© σΚϋΥWTώ•*<›>ηDΔκ5k[j�&αϊ΅+)SΖLϊ E ΕΒ}"Φ¦₯•BωΕ‹—L�ˆŽ‘Μ›N'""ˆR#† ΥΝ�πÏ΄+J§{1aαŽΡ±΅�0sm\MζžƒρQHξΌ/Kζ:~ρ‚yτμ³ΟθτNσ`°‚ ψU ~ͺXΎaΔ‡s0»ς΅½NDt"€™τχ‡ ς¬—Έϊ©‰Η‘“`9ΉxΡόΉτάsΟ\Ξ.PL4oΦ„>όθcJuםšΈR1Τͺ“%KJ±­Ύκ|ΒέΏ†;‡Lά>“pΗΛHž χœž;Ϋ9aΧά?ΖηZ†ΧΞ9'Ψ�ψγe*Z’T8ΕΔIžγGιwΰŠ"Η*Rά§ώ~q"b•J―Τag”‹φΧ6φ!W;| V‰ˆαώjΖŸ› `ώVε�8­xŸεDDΌ‡1›7jς)ˆ™ 7υYoπυˆΏug(DΔΨz&–}»w�έw§�—Ρ’βiΪ&GA@A@pF@ˆˆΞΈH¨ ‚€ ‚@σaΠ‚‚$Ψ²q₯K—N§βοΙΆM‘ι|θA}Ι‰ˆ\αvμψ‰4sΦl“EωΗ<>F eΝΟΧ‘όΊ`ξΝυΆW#\˜Ώ θOΚ—Υ)ρwζKnΓ† "¨"Β8‘ί�ΎύΨqΓσέͺ°5D?DΔPπ‰­g‚vςραςεΛz­ΚΫ/η‚€ ‚€ 1:Ÿ‹΄JA@[!"Fί£Nr[ΊώοuΗ†U«Q›2fς(³|�ύ%΅sσ?yοΎϋϊεk{ζ”wήIM›΅’$I=�y-�™ωΪ|ύϊu:rμ­\ΉŠbΆΕ Ȏ\ ‚€3ΡΉ`IΠ�Žu²u«WZ&œˆˆ�–/]με’o�ΑƒΤJΉ‡·oώΨ•…φ+cͺT΅;†»hEqAD¬―\ΥΎΩΩCφ†ξ;�Œ`όΉS­T±‚"Cξπ!Zρ6mέΈžNχ°2e<>ΠΉ""ί€ΊΣ―ΏόBηΞfUDΔpŸI$DΔ_~ω•J—-ο…;WFλΣ·?­R*½ΖΜΖ-6†+U©aΏfΥrz4K4qμ¨T΄hο ή7†ΝΑ½»wX_'^ήέ”J‘Τ‰ΰΟ vΤHϊ©?\""'p„Kεφ;σ }ΞΙ™ œTͺZέq³C<’!<|Ψ§ŒP‰#Ό€P‰ˆ6Άϋυν­£Q~\‘2fT&Aΐ'˜…JD„ΪάδΒ.]ΊD5•Β 6΄ΉA}0sζL΄{Ο+Ψ¨…"nh‡iŁp΄qέ­²„@ΎyΟ7ΞgΣ«U©¬έύ"οCΉ •pκe(cχ�w΄KWn Ý7y»Μy¨DDNx=uκ}₯μΪΘεxŒ "" ^Άd‘v…‹s'" q"b(ctl­+Œ‹t(κ/YΪk~0m4GώχM(Jof|6ε;ώ¦άœΫί‘`yόΕsRΟπ£hΎR tcPP΄¨‚|PL3�£ά�•ERS>ήca>ͺΐϋΈcϋV­²΄νήθδ₯6[‘B9ΤΏ’θΧ_₯ό…ŠκsόπyΑbΝtwͺ»i�„q&HC™ƒ½2ϊΉu>αm g η™„;^FςLΒ}O³yWb-γη1»FE_… 6‚-^4/Φ+›6ά\w"ƒQ0hAAπ΅(ܚýΉ1ξΊaœˆΘ]tοή»—ΪΆ{ΓdΣGώχ_ "b(kώp�NEŸ½οΎϋΌΪμΒτ3ήΎOŸΦn˜Όθ“ψ{ EŠ:ˆΉ &<ΰ#novzƒκ+ΖψZΖ„αΘλ·―ix:œΗΦ3AY\Ιιαc=1A@A@ˆ~„ˆύΟHZ(‚€ ‚ΐ!"FΧγ}ώ…œκ?&‹« Ϊ‹tκέ“τ•RΈzυWεβ/#,RDΉƒσ|ŽV―YΉœ>ϋμΌΎό‡g«ΧΫΣ΅kWιτG�y₯Ϊςν·ί¨š”τlΆl”ηΕ—¬MΪ?�PJŠΖFō› ΈΆ[Ώa-U�α[nξ’β₯‚@"F€«.όπÏ΄|εJ:vτΈraχ΅i݊R§~ΐΊ;;‘šΘljs" ΒηΞ›O#GߏψFT‡V*·ΕηΞ£άyrQ“ƍΌΘ NDDΉΑ& €—ώon¦ύ₯”ΘGfLB¨5Β%όιӟΠJφE”Ž‰ΩŽ¨X1(σ@‘ΗXΜΆν΄iΛVM*x4sfͺV΅ eΛφ\PΧ²\}›{(γό 2ΰ֘―1ͺkp“m¬k—N„ΝMXη.]Υ=�m’,"6μ6oZ―,yώ³ΟhφμΉτΩŸSͺ;SΡ“O>‘άϊ–ΡΔS»’`lΓ}&‘Ν}Nšϊ¨"Ι!¨p}‘ΦY•ͺxΤMΉ8†JαyC%"6iԐڷ{]ςΜΈ ιΒ…KTΌxQ‹„ˆΘΈ$"Φ¬Q]ί3κ{πύjχ€�ώϋtκύχ €q»…JDD~NœΖf“Hή“„\Λ„ϊόyzΰ R3T΄Ρ‹•Lj6yγ‹ˆh�πδ�½{χQΦΗ₯ΆmZ{ύ Α‰ˆςΏlzραο·έ{φ�νκ>‘bύμ3O›[Ρ*ω/ζ+`]σή'‚ύΙί©ΌΞPΟω‡dψhhρ’₯”"e κΠ�­Χ:•QŸcAΦܨ搟―όL•”[kσ!ˆi‹?"b(ψΔΦ3A›ψGάε½i―A@A :"bt>i• ‚€ · BDŒ�G "b±ή_H;΅πŒΪDάΈ~­eˆˆV€Ÿ¨5­Tn6Ώώϊ+?)β?ΔΈΈθBΚ\υΠήΊΏ�ώ‡’%KͺƒνDD�JƒPš‚šΘpρjΜ�fS€Ha7ϊ¦Ϊ•Iηt΄ω†‹Sz{XΎό… YʞΧ±­>΄;r'Œ|P[ΆdΧζ )Ο�άg\Kšψ@GNςΒYŸ^=-•ωβ‚ˆˆΊΒy&‘ξsh�ƒhεκ5^Ρ|cΠ+ΒvˆˆE¨υkV9b bbρ’el₯ݼ̟/MžδQο<«>D¨Z½ΦΝHΫW6΄EY—Ÿ}ώΉ#9/ά~` 6Ο1ŽIk?‚¨ž±`d0(ΌM™4ΡrΡiςُώξ5βˆ);T""ˆ \εΛ”ƒ#6τ“&υŒ³qIDD]\½ΧΖ6(‚Qž½Μ₯u ‡ˆˆρnΨΠΑt—RκφgN.žΉϋj§| t΄R�Oœ8iEΫ‰5V„ν$ͺΚUkΨBo^ΪίοŠ`Ρ―�ΐ› bι,άyΥsΥΘ`ΝYΊl9 <Τ'™Ιp—׏-""οϋXS”,γλzΫ΄ΓND4αόθ4FG²�ΰeΓέ&ˆ�NΆmϋ;ΤιΝ› QΌΟΨ qΘ_οΥ:Τ₯s']T_Υ—@ΪIH9|(•,Q\7ΑŸB³Sϋ ιΝ)Ξ„αέlΨΈΌΘ  Ψ�ύο>ΙΠ/Μ‡jX›.[Όΐ" ϋ$V ρW―QΗg·vυ Κ’>τ€mVmtνώ–>§>Z1Δ]£kΧυ| #cα'œω$ά9,άgΙxξ3‰δ=IΘ΅L$]dY|”σ7·:••ΛΕ ζyE™Ώ­Όcα‚»ΆT'""'kΫσΑλE’n₯ƒ­ΝZΡ^�ωίa‘όκTΆΫ0θ;+C§±Š—a'"Bqyݘ?""ςΊΕicγ™δΜ™ƒζ̜Žβθ«―Ώ¦ς+λsωA@θG@ˆˆΡ�Œ€…‚€ ‚€ ό§"bt=ήL™³PΕW*S² -φΦύύχί΄gΧ:υή»^QI“&£ϊ +7©wΣm·έζg. ό°yΓ:­ΆhΒδ(‚@ °ωΠ»η[ΦΖ­IϋΕ—_PοΎ�όnO–ŒvνήCν:x\# 6‡v½£“Ϋ‰>pΏ�ω ρΩ(�Q½΅{½ έsΟέ¦:MΖ9qς$­R0Έ…5† τdŒo”˜0ΗΏώϊ‹rηu&’ν―·iEyr瀴i�Z?l’•)_ΡΪ χWv¨α΅jVW*>-θ~››02vνή­ #Α\/bΓΊ‹RW|ςρΗ5φ¦ »vσRqCˆdή FΤδ͘=gž—Ό]њψ&JyΈl™�τ`Ϊ΄^}±wŸ~΄zν:“L+Ο2 ά۞:υ‡γzc dΝao©w΄VMtζμ94Vυy'‹dŒw]aoήλΊukSŽž§;™ΦQΦoΨHoυμm%ηλ'WηάΝe·oi΅\+s<Ÿ@imݚ•ϊ]Δ{PB‘ήƒ½¦‰ψΈ€{Χ�J½ωYŸ1iπލ?ΑQQΥ”ΑP?m¦ϊ`–,Y¬±Ε©αέ>l½œο%―y λ΄έj=Šgαtϊυ₯W*–ΧU‚\ " λ0Ϋ`P\4d˜>­Ÿpη“pζ°pŸI€γe8Ο$’χ$!Χ2‘τ‹ν1›Υίi}΅VW]―-Έ›]Τ�ιΩsT­†�N"i#ςβ}¨¦TMωšΟ;~‚jT«ͺ‹oΨ€™ωs{Ÿή=½Φ?Hˆργzu•JοΑΦ€‘¬ωΓύ;Uί@?U”Š!ώξBΏ7†d-YbM'OFψhŽΤCΗ#aωS©ΙB=ΨΊ3|bγ™Œ9\©ˆΥ·H=šί§œ ‚€ ‚@t DΔθx� A@A@nY„ˆώ^EHΙ”) έsί½”T}=ώ£rQυωgη”;ΈŸƒ6ψaEκ€ gδU»�tα»οθKEQDLpΡ-«".ύυΧίtτΘQΗ ήpΚ ”'{φη(γ#(ςτ·„j*6–žyϊ)Ίχή{”zδ·τ©"Χ8m€Β,Ύβ Μ’%s&Ίzν7ϊV)]r—”ρΥ†Ψ�‡“\ ΡHίg–Μtζ“3�ξ’/<�<έsοέt\0Œ‚Sl·Υ©<Έž:e’ŽΪ»o?΅iΫή)™†Ά>ώΔγj½F―3 Xzξμωϊ\bκ 2>ωδc€˜CΚνρ…οΥ.ŽOΰ1C†τ�ϋ\7'Ξ‹‡KΨ,Y2ΡoΏ�AŸ�\ΉΚώ"h Ϊ<¦ζ£Ÿ―όBοΎχžί>‹>n\3Γ}"ΊΛ§Θdψ°ηΨ±c~σςF`ρ0ŒuΥkΦζΡr!x&[7oTS₯"Έλ.RΜY>6Ζθ[m]αζΡτιύ6U­μQΈŠ„„‡ω "Xέuםtιβχϊ]Ž9D€tιVj�ίΈ&<ΊΑ%Ϊ�„3‡…ςLbkΌnρωLΠξΔ²– dXΨΊυιν^7ΙΛ:0ΐΟΔρc©`όV �ZnΖΑ 7eϋK“§’-XΓΐm5ΦΟΑT_MΫΡgŸ}φYJϋ`šς™όαΓ}& 2βCf'ν†ΣΙ#‚€ ρ‹€γo©MA@Aΐ†€m€Θ₯ ‚€ άr8‘\γǍ¦‚ωσΣΥ«Χ¨@azIb»i― [8kΒ){©r ²lψΘΡ4ΑBŸb@Ž|^‘Γ±={χΖ+i9œ6Ζu¨}΅kΫFWσjƒ†τα‡ωTω_£}n* Ψ«•Ÿ�Rδάς+ές}‘?Έ‹Ύ=yrδκόG₯·cΗNWi£%Ql—Ρr?ΡΨ(ΏR‘Ό"ή�N^©P)Φήώύ{vRͺT©t0o΅κΔ�ϋp{}r-Œ}ϋτ�`tθτ&νΪ΅[€A@D„€ΡΓ’¦ ‚€ ‚€ π_D@ˆˆ�Ε§*χ$‚€ ‘ $—PΠ’΄‚@τ# ±¦Bω²”9Sf*Y²8eɜYί,ά³—*SήQE‘»™ΑC‡Σβ%KCΝvΛ₯—1:n9TσR¦ΈC)_s­θ7-‰�RωψjΛΎ�α*�\\'&γχkdSϋ�Λm…’λ‚Ήs¬[|½mΪ³oŸu-'‚€ ‚€ ‚€BDtBEΒA@A@β !"ΖΤR‘ ‚€ D)Br‰�#ΝΒD bΝ;ΫΆPšΤ©­š�ύχ_κΫo­^»Ξ γ'BDδhΔΝΉŒΡqƒ«”κŒ?œSψ½τύχT’TY� ’0†ί―£λ½πΒσ4nΜ(JrΫmš,ά΄y«θj ΄FA@A *"bT>i” ‚€ ·BDΌuž΅ά© ‚€ 8#πfηŽτjΪτ�χT½fm:wώ3η„*‰kvοάNI“&₯w”›ΤNovuέξ kWQ† θΟ?�€?>M+V―¦ 6ωΝ�ύχSζΜ™όΖŠ8qβd h‰»€ŒΡ�β¨E&Γ5σΟW�$Ί5D$γe|?©OA@A@‚# DΔΰI A@A@8D@ˆˆq�-‚€ ‚€ ‚€ ‚€ ‚€ ‚€ ‚@< DΔxYͺA@A@π€ύc#1‚€ ‚€ ‚€ ‚€ ‚€ ‚€ ‚€ $„ˆ˜ž’΄QA@�0BDό?\Ή5A@A@A@A@A@A@A@Έ%"β-ρ˜ε&A@A@ˆ^„ˆ½ΟFZ&‚€ ‚€ ‚€ ‚€ ‚€ ‚€ ‚€„ˆθ%I#‚€ ‚€ g1Ξ •‚A@A@A@A@A@A@A@ˆ„ˆ/0K%‚€ ‚€ ώ"’?d$\A@A@A@A@A@A@Δ€Ηs’V ‚€ ‚€ πŸE@ˆˆ�ΩG+7&‚€ ‚€ ‚€ ‚€ ‚€ ‚€ ·BDΌE΄ά¦ ‚€ ъ€£υΙH»A@A@A@A@A@A@A@p‡€έα$©A@A@β!"Ζ°R¬ ‚€ ‚€ ‚€ ‚€ ‚€ ‚€ ρ„€γ h©FA@Aΐ!":γ"‘‚€ ‚€ ‚€ ‚€ ‚€ ‚€ ‚€ $„ˆ˜Xž”΄SA@�(BDό>XΉ-A@A@A@A@A@A@A@Έe"β-σ¨εFA@A@ˆN„ˆΟEZ%‚€ ‚€ ‚€ ‚€ ‚€ ‚€ ‚€[„ˆθ)I'‚€ ‚€ '1N`•BCDΰΞ”))yŠAsύωΗtν·ί‚¦“‚€ {ά�ύ� »|ω²«t‘&ͺP‘½Z§ŽΞΦ»O_:σιYΗ"ž~κ)šαqπΔγΡΘCu5 .¦₯ΛVΔu•Λ·?ΗPž—=―ΏŠμeΪσΩγύ• α/Όπ<‘OύxωG:vμ9΅ένάeΏ§²μi]ϋ«7œrω3 –Ÿ§ ΤΎ@εdʘ‰²>φ(₯ψaΊvν}χέ:υώϋ~ηφΨ¨3P[£!.ΪΖ�hΐ$PϊτξIy_Μ­“Μ™;?ΰΨΊ|ιbJ‘βv:vό$υν7 P±' ˆ€Ϋ΅^61^ͺ6sžΫΏyMϊ@σnΈ Η|=d°gά\±b%­\½&ά’b5ŸΉηP „τ½PtŸσο]w₯ΤΪwθδχο7χ%JJA@A@P"b(hIZA@A@XG@ˆˆ±iΔ–,]–žxς©€ε\VĈŠζLc"λΌZŸξ ΅ΎΌxα;Z±l‰‰Ššγ±#ιφdΙ‚Άη―Ώ�¦ά/ζ šN‚@μ πVχ�T«f W…uξڍbbΆ»JJ’Χ[·’ζ͚θ,mΫw€έ{φ8f1Oš1m²Oάί�CΉ^|Ι'<�ςεΝKS§LΤΥ€,3jΜΨΈ��oω :-]Όΐ+ώϊυλtρβEϊς«―ιέχή£I“§zΕ› §Ό&Ξ~,Y¦œ*σ’nΤ°½ΡΎW’Ώώϊ‹ΎώζUηW΄sΗ.Z½vW|$Ψπ|ς‰Η­"^oہφμΫg]›ττΨΫ½zΣΊυM”>ΎΩΉ£ξσφ9ιάωσΤΆέΊύ&Γ¬Σ(w�œζ�υ±VzτριΣ�ΣΫnΪ°–2€Oo&τυ‹—.�ΡcΗΥσœb= Ÿ„7š6iLν^omE:œ/Yj]σ“pϋ)ΔΞ�;Ρ³Ο>c‚¬#ϊβG}Lƒ†£?όΘ oΥ²9΅jΡάΊt2yκ4šwμΪ½‡Ϊuθ(yΘqΌόω �𑣃–ξx΄ΰ Ϊ΄nI-š…>–;žfΝ™λXτ=GXτz-’9μΔΡC”4iR]x‹–mθΰαΓΞI¨ ‚€ ‚@œ DΔ8U A@A@p‹€έ"ιͺΧ¬M(‚@vνκ5š6eB $:.gξp“Τ1ΝΆΝιΑ‡tŒ3ώω'΅SΔέ@Ώ ζΞ¦μΩ³™,:-6‹,ά~€²@ʝ8a¬΅!νT>Β†εE`Iύȍ͘9‹ΖM˜δ&iΤ₯‰Ά±+κ²5(Ύ‰ˆ†Μˆ±±A#)ήΦ$ΗˎΪSΓΧκλ8!a8B$�!̝£ζ“ηθ�ώο�θωœ²(·ηv­J™‰-mΦG³Πκ•Λu³?9σ)Υ¨εQχwU*½B}ϋτ�Ρλ7l€·zφφ—4¬πpˆˆαŽ—nΨΎέλΤ€QC·Ι­t&M¦iΣgZΧόDϊGγζy€s˜ob)g‚€ ‚€ $BDLΤ₯NA@A@ !"ZPDΝ '"~ϋν7ŽνΊ€§vΎγgoΏύvjΡ¦%M’ΔQb "BέƟύ�\3ϋΫDπ—GΒA |8$Œγ'Nψ-lεͺ5 Νo’0" S¦TIsζμ9�IkK- gž~Jˆˆ 9N"ϋε—_iΙ�eτΘ#(γ#Π3Ο�G©ΪMœ4EŸγ‡‘ώwδΘQ]_Φ¬Rƌ­t_~ωe¬ΈΞΆQAΓ&ΝθΔ‰“V]8αδANDδξH·yΛVΪΆ}₯M›†ZΆhFχήs‚iοΎύΤ¦m{}^‘|YΚϊθ£ϊάόd͚•Š.€//�τ­ΆΉ2Icζ¬9©£q"β’ΕKυܝ*=�!_zρEλY]ΊtI=ΟκŽuαΉξΫ³“’°5Θ‹y^ΚonΕλn?@!Ϋc6SΪ4ityhΣ…α‘C‡θ/Υߞzβ ͺT©₯O—> ρ£OΣAE\υg;wάι―ά„Oθ±+!ξ9”:…ˆ Z’Vˆ"%"†»Φ‹Ÿ»‹ΏZ yλΚΟ?S‘"ΕVΜUƒ±ώš:}Fΐτ‘FΒrΛζυΑ;wό°Α”ΧDD]‹.lͺσΥ–“ώ/!fΫ;~•¨₯οyΓi�„ˆh£ ‚€ ‰!"&Ξη&­A@Aΰ?ƒ€£οQr"βθCΓn`­:―RΊτ�0AJ„E;1‘\¨† ²dώγp"’]­,Ϊo=‘Ι<Ρδš™A „k`cςΏL}z½­wiuΠ–­1Τ₯[νs„λbΈήƒΪψζDDε† a•·ΝpΉ›"E 6`ΠZΆ|…Ξ‰Š‹­Z·υ*ΞqθΰTΆLiΦξβ$ΕiΚΝ6”{�ωη*QΊ]Ύ|Ω«\s‘?_>šφΨT±²ΗκΆ­›©dι²ϊF…ˆ}Ο[Z$D3α|0-U(WŽς+’[¦L΅‹dΈ.|wΞρ9mW›₯+mJq‡.;)υžX>bΔ‚ a7™§m›Φ”'w.‚j_*₯0υΆOϝ£©ΣfψΈ,6mΘ”1uμΠV«‚Μ‡<οΎwŠφο?`ΉΜ›3w>3Φdρ:ΎΡΎV%4ΛW¬ˆυΝδ@DDΤ[¨@š0~ŒnΒΏ�ώKΥjΤ’sη?3Mς:Ί% ""’ΐΞ;PƒϊBδE₯ς B]$ζDD„ϊ`νΊυ½TpόΨKwάq‡nBΣζ­θΘΡ£^ΝYΊx=ύΤS:lμΈ uN'Kh""Ϊ4{ΖtΚ•+‡nήδ©Σhς”i>M7vQκ–0EλΦ©­Ο‘Ω΅ϋ[ϊ<ЏΫ~�*�ΒΰΊ.άέZ΄α>³v­ZT΄H!jύz;ΛU7Ώ―z―Φ‘B �£Y2S₯ωΟ?ΧιΒΕ tΰΐ!Z°pqΐq,”±«X±’TΈPAΚ™γyJ“:-₯LyύφΫοτω_¨v}JcƎχKšE{kΦ¨NΥͺV¦ ιΣλ1οΊR6½rεgϊτμYΪ’ϊΒͺ5kωmYηχZ·jN9žžR§I­έn£ή‹—.�Ρ£ΗhΊr•χ:.,\""΅kΥ¬NٟΟ�η$΄o�ΑΚ=ό―fV¨PŽͺVͺ€ΓώχΏΫ¬w —χή{Ο+νήύϋiφœyVΨΔρcιŽλ¬J9φΎ{οΥqP~½tι{+έu5Ξvx£“)χ­ξέ”Βj­pΊfν:=>fΛφ₯Hžœ>�όs5&£ΑC‡[eψ;y³Στ|φμjξΝDχάs7ύώϋοτΥΧί¨ye-T}οΪoΏωdEž\ΉrQ–Μ™΄ŠπΥ«ΏκΉoϊŒ™•FAh._�,ύŸϊΧγν^zώ,Z€εΙ“[«Θώt劚 �ˆQ£}ϊ!TeΚ–Φͺ²PLύυΧ_ιάΉσ΄vύZΉj΅O2„κ†jΎzL=Στκ]Α{rώ³Ο•²λaŸΉκ±cnj€ΫTίωσοΏ¨³"ƒΫ1Ηi@ΏΎ”D­‹ώΎώΑu·“αCšͺΟ>š93₯K—N“αψαz�ƒhρ’ε>σΚ€Š]‡φmυ|…η™4iRϊϊλ―ιÏ>¦‘ΓGϊ<δ™ͺˆφΙ’$₯£Š<Ά–-]Šž|ς MΌ?sζ,mΪ²EΟHk c@οž7?ZF¨ >· Š„ξ4φG²Φ«]«¦VΛ† ρm·ύώV œWύ.ŠW«χΗnΌ½K–/WcΐύT²D1zξΩgυ{_~υ•κwkhήόφ¬ΦuΈγ₯U€‹< |Θ«’ˆϋX‹‘Ώ<«Ϊ ϋυη_θθqΎNiu"υ|EŠΪUyΐ5&f»)ή:F2^Z…¨“pΦί<¨DΔPϋžΫ/}�ƒκ3Okeο―Ώω†¦«y%ΥέwSύΊuθΑ‡€οΎύŽFŽλˆU8ο¦ΉΗPΗh¬Ÿž}ξYϊνΪ5z£SSŒuμΧ··ξW_«Ή‘�€AVΈΉO„:‡Y…ά81ꞸΔwππa{jάπ5₯Š]‘Φ­Ϋ ΥΪνc₯O A@A@p€]C% A@A@β!"Ζͺ‘•DΔΦΚmdςδ)θ‡Ύ§₯Κ=i›voθF 1²g#Ή[ p‰ˆΨΰ'mΨΈYz:&ΩΈn΅rόˆO\Ϋφiχž=>αN‘y°A=R)Π>ρψcNEιΝx A βwncGΤdn?DD\Ό`ž&1š< ΛL˜4Ω\ΖΚ1•lX»Κr™H‘Π--λ›7¬³ˆ ε*TςRΓ υΖ9$B¨Β U@cNDD<�υkWκ$ S½”Ώ In9qrΝΊυΤ«w_+ŽŸDqτΘaTΌX1έ,Έα4do’>?΄―&­]U›Τ%K•₯=»vP²dI Δ‘ΒEKψ€·Έν ‹τθζΩΥ w΄«U­BU+W"ΓŒΩέ£_2˜@ΚρgǏŸ€FM›ω‹¦PΖ.CΎπW”;»t{Λ‘°4nŒ"£ήp#ξ”„€|ω=dUqrώάΩq—Η™σq&Ρ EFŒ ‡ˆ·γ &Vή.»rj§7ΪΣk κσ$~Ο·m‡:½ys| φνs˜Uȍ7DDΎΆ†έ{φ�*EΖΌ,&‚€ ‚€ BDŒ ?Ι-‚€ ‚€ !BDŒΐ8ΘΞ‰ˆΏύvM©4$'ό'2Ύh�φΫohλζk-_±=ρδS:ΟμΣθ?~O4DDάX ΅Έ}χ]o5š€`H€ D„'"BΙΚFNφξ{οz©&"βόA‡)μ«/Ώ¦«Χ��“?N… €$I’θb°©‰ΝM»aγͺC°žΟfδ⊈Έ|ιbzς‰Ηu}PΪΊm;]ωιŠͺ;»E(ΒFoZuΌ”9ω νpι{GŠ;¨T©t{²dΊ<ό$""wρ΅?¨ώ9™[Z0""Κω›Π0ΈPŽdγ‘? (/½Ω©£&c@Ήͺr՚αΗ‰ˆόiςηY₯€Y΅z-έ&ώΓ]ϋ#Ž }4·l\§Υ³Πž£Ζψ(£?όˆΎύξ;J©”=K*’—!€9‘€ψsA;+bΦX @υνε—ς)φί”χε‚^χŒ‹YΣ§Rn₯ ƒ,ς~‘�xΰz)ο‹Ϊ­h ·ν:c?p}Žχ ΅O¨~ϊ3;©€±S§N)�ωγΦ؎ΌpWϋ‡A¬X±"ꌴ!ΧA±oΣζ-:άό@™Œ«„Α•εwx\ΞΏψbΚ’9³NŠωσΛ/Ύ4ΩτέΎήεDD$„bγυ~’ί•,Qά"ΒAqτΨqVY8™l“zο  σθiΣ€₯Όyσ(ΕΜԚ`Ε‰ξ#† Qξά=Δcx@ά†Jίγj>4m©[ =vγd'’ΤιӟПύ©ί¨bL6DDž}cΠωσŸι~S\)|B=6pπ8{―M[ƒ1—P�ξAUπΈzζxŸΛ–)­qG\LΜ6κά΅»I¦U W.[’‰>Δ‡ XΐΪ·mCM7�ηώάΥ·jٜ°2†ΎωžRZΖίƒθ»x�μδ3–Φ­^i„ρΌvξΪ₯σ`έΥSΨ7κoΙ²ε+™’υ=Ψ‰ˆζο-¨Cc¬0Ψ}Jν†ϊšήΈ\—/_ŽξRΈΐ–.[�ζcΉ/œ΅'·£|Ό[X―Ay6w�œ¦J―>‡@ND4‰0—_Έp^z)―εωΗ/SΡ₯L}ŒdΌτ*ΘΕWΖGψ˜€+’σαƁ½»τψ€ωaάψ{fΒƒ½›H‡>_¨€gάϐ>αƒ˜?"b$γ%Κ wύΌάΜXο–ˆjί3ε£NΌiR§‘Τ©°šπΙ™OΥψ{AΦ₯[Ϊ²5FŸ‡ϋn"sΈctΈDΔHζ0}³μΗ|π‚ š8ώN“F ©ν„λ―”Šλϊυi™"Έγƒ 1A@A@Π"bθ˜IA@A@XD@ˆˆ±f,Ε‰ˆNEbcoÚ5τε—ŸϋD§Mϋ Υ­�šώΟ܏?ό€Ά(�βν·ίž¨ˆˆ>7Εb9¨s—n,DNA .ΰDΔ@υΨβ°1 —`‹•ΛW�‚2 (₯ΨGŸV�s=ξyu€ΓΟλ­[QσfMtL\ω¦φ₯οΏ§&M[Z€5TΚ zœ€Vͺdq΅A8T· Χυ_kd‘«@τ;j„΅±–ˆˆœHΚ-Ν Ρ‰¨ γ‡;tzSK ‘.ίκΩ[—κTg9εtΘ :dwl˜Ϊ?oΎκΤk`O’―’ˆ·�:΄£Β=$lΘƒTiwg—|•_ρ(ΰ 1R+}+_`‹—, ψQ�ΈνH˟ �a Ξ½wκ}M–Ϊ±c§'ΠφΛ‰ˆΆ(ŸΛ`Κ<>‚`\¨RωΛ7OώώϋΠϊ›Τ&ω―ρ“–@RμρvoMμβy5l έ=–{‡’ˆ�ˆAvWβ(ΫΪ)7ΐ»vνΆκiέͺ΅lήL_σqΝ$€ ΙάΚ½wΜΆwLuά·{'έ}w*}5λ™OΟZq8ΑψχρΗ;ΧΌΖΓ'ΨΥ 9‘.¬gΝ™λΨ"S†Ώ±Α1“ Δ³iψZ}νΟ-%ΟΛŸΧ…ο.Pm5Ζ£ ζV°H1ž•zΎΥέR#)©m»^€yί|³£r%|Δ"Η`ΌX‘Θrψ0„νφ:iυ5Sπ‚Ήs”jŸGύ�n{χιg’¬£μ΄K)wοώΆΧ{QΏή«΄sη.=?’N’&Mͺλμ€Φτόύ‡Ω`nΥY­ΖΔΑΙζk)}:ΟNΔ±oες%šψB%ώώΒά` sΑ„ρc4Ύ sΎ¦ζ•;SήIS'OΠa 6nΦΒ‡œc'-9}R]šΥ4‰άΤ7bθ`E"+©/AάFΰλ/Nψβύέ�ˆhWνέλmνζcœiΪΌ•©�λhϊ °x>ηMς’W’nΧz1›6X$kΌ³Έc\Mπ³Ο?§JU<Κ‚ˆ·‡Eσ.�YΑϊ΅«-b'&#A$γ₯� „Έγž4ΑC46€γ=»ήΡ�ΞM1={υQsΛ2R1νξ½C}7MΩόΘ ˜φώΟΣρσPΖΛpΧίΌ>snκuKD4ωptΣχLω !’ΰοDaXΟT�ZC«›Cε‚<ˆς°pίΝHΖθp‰ˆΊΑ7~BΓxήPΞ1–V«V…Κ—)c½Ϋ&?žηώ΄Ϋt·Šψ&―A@A@ΈΥ"β­ήδώA@A@H`„ˆ˜ΐΐ‘zCD„βU₯ΎςΪLuW*JuχMR+ŚIΖj• ^D³–­•2B*­h3qœΗ}�ŠˆhSαχ.η‚€ ϋΈ%"ϊ#)ψkс}»΅rά)ζΩ8χ—ΦΝ‘S^·d³yŽ2:wικCΌ)`ΛΖυš8πΛ/ΏRΒEuuœ θDΰ sˆˆάE# ζ›—Ί’Xψqγš™«πRlsK@sCDY³hΡ"ϊν.CC½mNvρπ‘Γ΄mλ&­Δ½œˆˆόήν$ ӎbJ©kΜΘαϊΔ+ΜΥNίDDάTμR(7� χƒrΦΈρΙUΫc6+•΄4:©QVβ}č e·ύ• μ1#†Σƒ=hšηu„Zތbš‰Œo""ΪY·v-νΦ:eΚ;L3τΚ θ�XΉΖ‡ΨirםnȜ&Ÿύθvμ²η³_Cu c'έΰΊm›ΦΪέ,Ξ‘Ϊυ&·Ζέ-šώγ6o|§3䐾ΚVxΕ‹Ι‰£‹i~Θ°ŽΝ3eΔ'Š΄˜WΈ­\ΎΤr‘̕鐆•0ώqr/ƒŸσqΟ‰ΘΔΗ2»Šž)‡“œ”7M:sδΔ¨˜BυΠnάeͺfO—Χœ΅3("Ϋm`�ΎT±ByΜΙ}&Γ@¬Lr[‹Δ;VΟ3gΝ6I­cƒϊυξJa†τdE89yμ°^§ΐ­wιr-«ΙR₯�+ϊΓ \sς±ˆ’='T‚”Ό]Ν₯†<š#w^S€ΧΡ¬₯β’ˆbΦκ•΅E'B.ξeΗφ­–*dΙ2ε¬wžζ8Nζ΅·#/½@rq5ηΆ-7ζ˜sΖ+7χ›6¬υΚ 7θ+V�¦₯‹θπeΛWΠ€AήοR¨ο¦W7.⚈hϊ ͺ eύνΤV3NΗ5Ρ|¨ƒχbΧ;1Ί)P’νΨΉ«>7νΙσ.,άw3’1:15H7~0οTͺT‘ +Χ;”Ί37τΧnΨ >–Yζ3Ύρtr.‚€ ‚€ ΰA@ˆˆ�A@A@!"&(όŽ•§Ο�)7ΜWA‡[† P•κ5ΤFP2|ζ“Σ΄qύ͍‰B…‹P�<žΝ‘-J-βγ>Τι±ήk ωm{ύυ·ςΟ^ˆΘ… ·p""\ν­Z}sΜα5cS—+ο ΒPBΚ–ν9νͺ .ˌΧeΘ“/!μxŒk"β�Ϋ΄B*‡"βu₯Ύ3nΒpδͺ"ΕKιqˆ»ΚΓΈuκΤ:Ÿω»±φν^Χ—ˆˆΐιΎϋξ3Ω,UE+ N8ΙΜ±“ ¦ΤΈ©GΟ^½[š""'nM>ƒΰΞ5\³AΔ™χ3€—p‰ˆάρΉση©J΅šŽMεδcǎkΕ+Η„nSjΗΌO:e'R˜4P8Γζ?ΜNΖΨΉ=Ζr%LaΠm?Π©τσڊδWΎ\Κϊθ£Φϋeβq΄“ε8‰›� /ζΙ­σλΧ�υ"ΞX!ž,š?—žSJ�Ζ@θΩ³w­]»ήK)ΞΔۏ«W,Υ�— A/T"bž\Ή”zc%εŽϋaJ“6 %WJΨ0% 9uœ"³Μ˜9K‡γ‡+ρ8�{χξ§cǎω(Z™nœlX»Š2fΜ¨―@>Ϋ’žΝ‘£Ηu^ϋ<`ΟίΧ†ςέ·ίQιςPΣ>.�X΅šϊυh’ΌŽ¦Œψ$":½œΔΧΰ` †wΛ(£¨Qͺ\―φϋ»θ�ΉΥ{ΥC�3.`νiλWžsΏ˜ΟMœμ4}Ζ,?q’OΐΙηΗs™ωηΖ₯8Ξ‘όΆV)&„qκwj+ΖaΣv»2΄iσμΣ)—RεSI¬ηΫ=¨F΅ͺ:Š?g§΄&ŒτfڊsΣΎ$Ι’jχάγc?ο? \—(]IΌŒΖόm&M\ω<μO%j‚ ‘Βš4mApŸγDΔM›·R·oιpσΣ„·‡4Ζ"/M‘Ψ«IX'OΎK+W―ΆTBOœ8©]%ΓEψt5ž›#μs'κ υέtj_\Γ];΅ΥŒΣqMD\Ήz υν7@7ΑΤΙU·M˜ω@+’w3’1:±Ν³ΕΈT‘B9ͺXΎΌRζΝf‚υ1.>Ψςͺ@.A@A@ψ DΔ�Θƒ”ΫA@A ±" DΔΔυδž~ Xp@IDATζY*scƒρΧ«Ώ�Œ)ž ?¨ 6iή’n»ν6ϊQm Ο›3ΣΊ±ΔDD gσΐΊQ9XG€6:ύUˆ ί!CjΥCiξ€hcO—DDΎo―ΧιμPE‚"ήκ•Λ4‘ ιΈκŽΙ‡ ΄Aύ=�,MϊΈΔΊ fWHEοΏnήMδ±[\yΏ³ΧλtΝΧίNρfœgώuσw†)Ι�eβ6Μ„q"ϋ±#υšΖ#y7#£;ψ’T¬XZ4kj}$ƒp!"1A@A@‚# DΔΰI A@A@8D@ˆˆqnέΎγ›šp7sγnjԡΌRΉ*e}μq}ώΉRjϊγΟ?¬ΪAN|βΙ§τ56.Ο;K+e“ν1[¬4 }ςξρ#ϊžΒΩΟ—7/A‘ζδbYG8όprΩλm;8ͺ~Sωδd'7€9>oβ.^ϊή‘e7ƒ@ξϋϊ›onΔγYΏΎ½©ς+u‡Υꨁͺ�δ“3Ž=Ή¦©ηƒΏΗ`XkΤoΨΨ―Š+WνmΠ¨ ΜΈbk‹/ ˜ε矯кυuN{�ύθΥ }ςΞRσJξάΉtΈΏΎDDŒW†|η4Ώ‘|Ξ‡»bΈ-†q"’Σ'e„;^"o(f”C‘DzFυ+(υΖΔl£ΩjN_ΌΐCι8w�œΊXΎ0υ„ϊnš|ό—DΔHΦίΌζ܌υαό_‚›Ώ3LωœkΒ N‹[`ΗΠί"b$οf$ct0"’Q£tR 6˜rήHΧθ¦L7GΌ«pόcπ!7|d‚:TeΕA@A@# DΔΐψH¬ ‚€ ‚@# DΔ88ŠoΫ‘£vΟόοΏ��ΨQΓu pٜ9σ£�kΓ&ρ₯„-&DΔhy�AΐpˆˆU*½BP€A9π5΅αnWώ1uρADΔ¦Ξψ`ZΪ΄~%Sn)‘Έχ­"W=ω„‡ΈoΡ(ΑόυΙn]:k’�—{8·[BΡ– εΛ� ύu³p/eΚΏ’]‰# Cϊτ΄iΓZμηϊυλT PQŸwΧδsΫLϊ@GNΌα.bγ›ˆhΪXI)πTUͺ ¬·¦&ŠaP ]₯Τ²μγΪζk)}Ίτ:)\ΞΫγMΑކˆlμZΊxΘ γΚ_¦|N\σGD4iAΚ+Y’•-[š²dΞl‚iŒ"g"‚Δ”χ₯ΌTΎl*€T.“'O�σβ]Λ―ϊOB›!Š$6"’Ή?OAδƒaŒΫΆe“>δ6^'`?|~wκ?Hjά΅γoŽr½Θr{N9ΩΙ i„I'aώ”υ<%ώ…β0·wOΎλ„E¨p΅iέRW3mϊLš0i2―�Υ9ΘVΛ–,€΄i�x₯�φΫo©ZΪŽc””ΝύΩ]{Β.²gŽ@„?~’5υVu@NDόκ«―¨ό+U|rp"’ΣzβƒˆΘΥ‹ ΡΛήX�"ΗI“±AD4u…3^šgjΚΤg9Μ€7κ fΝjΒύίC}7Myό—DDΤcξ%Τυ7o£97c}8eΕ%1’w3’1zζτ)”'·GYΧIaχΔΡCκ�“’j7ξ₯Λ{ΧKsδύ0�‰ˆx§°ξ*­>ⲏ—XΛξά΅›V¬XeΉZ7m”£ ‚€ ‚€„ˆθ‰A@A@ˆ„ˆ ΗbI“&#a*ΥΓIγ=JG₯Λ–·T}ͺϋί�(i’$:D °‘8QΉΩŠ"b΄< i‡ ΰί3› ή)|―°q |ΨΨρiζ¬Ω^‰Έϊœ?�Οΰfƒ§7ηœάT«N=Ώ�BW,[BP’ƒΑu'”ΰάΘ^ }Α8yΚδ…"TaˆˆC€²g7ΩhΖμ9u•Ψ΄`ŠˆάuΘO―T�ζ—Τα–€ŒˆΨσ­ξT£z5}›_~ω%U¨T5’[φGDD‘όYρJ aχοΡnΰpξδζΠΈJD<'αš[BΡCdΓ9Wκα�]A¨ΫΆ}’xYEEπ1D4ŽW"uαΆΨσ9]σηΓΗ™„""š6‚ Z§v *S¦4έί}&X‘TuΰΐAκΣo€Eτœ6e½”ΧCΦڈˆόύ υ݌dŒζc}.ζsu EΔPη0λa„pR �ˊπ݊ž}ζiŸ\θΫkΦ�§•+W9’Ά}2H€ ‚€ ‚€BDτ‚C.A@A@β!"Ζ7βΑλKr[ΊώοuΗ„PΟȘ)“ŽϋώϋKzΣΗ1! „ϋΣ67\H^Ήr…fίp?Ι’$ψ©όHGΒ!"rΧyN.lωfu\‡ HPρAΙD'γΔ'²ŠΙu΄_ωΕ"xΤWξLAΖ‚Τ…MbcPAΪ²qεR,nφ@4„Š@DΔͺ•+QΗ7:Πέw§�Mp"€˜Άαθ–€ˆˆψf§7΄Ί`’$ω={Ρ† E/^W(灈ˆvυES.'Ϊ μί—*V(―£ΰ†³Y‹›€Έ‘…«D¨γ€VΈHqΏ›’Ρ@D,QΌ8α!ΠόωηŸTΊ\EM,α*žœπgπΐ‘«�9½Ώ&­Ϋ~B\œ._ΎΚ‘ˆ•ΖΕ η[$�’–ΠDDs―8b,{ξ\9sZ*žoΨ€8q§ΪM²!]Ίt‰jͺ1αςεΛ:Ξό /fΜ‰v+’?s;vνί³“R₯ςΌ·†€bΚ,\¨;Κ\’ˆˆ1*₯"�9Ή½ε�MαΎυν^½­rp‚ρδΓ?ς ΓϋT›Μ{‰*€OαarŠΣΨΞΙ›6o%¨Ο9™qaωΫoΏ+2^iΏοΎ=/Ÿ# * uΙ@Ζ‰ˆpΗ …AcxOΦ­Y©¬πAQ₯`uρβ%MΣ§N¦Ό/zoώά3clΊpρ‚5‡2iΒ8]Τ;ΛW¬μΥ_ϋτξI˜`‡‘ζ-[λsώ*Ω‰“ϋ@Κ©T΅ΊW¦lάο#2hWΣ&ΜC%u™|‘νσ8WΧγe‘ίηϟbΆyMωXϊ㏗©š"ˆB™wε²₯Φ|;zμ8š=ΗγjΧ”™3gš3sΊΎΔ‡cΝ[ΆρqωŒ:ρ‘ΓΚΥkL6β€.ξΊΫJpγσΩQ5ΗΕVN”B{_ε€8Œε*xϊ„½\γNα­Z·₯ύΪ“ΌvCDD[wlίͺI·(¬έh—RJ3ΥA(JΒμͺ¬‘#/Ρ–Pϋ,Φ› €γdsΈ¦Ζ:Ϋά—·οΨΩ\ZΗPίM+#; ‡ˆΚxξϊ›5Ρ:5c}΄ΡΐpίΝHΖhώ‡ύc)ξv>1Τ9Μz!œtξ؁ΤΏωχζΩwvμ εŠ|θΖ-}UIRA@A@n9„ˆxΛ=rΉaA@A@’ !"FΧσxώ…œT€XqΊtι"zχ$}₯T’�^ύ•2dΘ¨Τ-ŠPΪ΄Z ^³r9}φΩyλΪίIb""β ΎΘ°‘kίΨ”^βA |Β!"ς3¨λ¬T.LwοΩK·+—Νš4φR½p""Bπα‡ΣY�V­2Q€6׏;aŝώδ΄ÊP'5kT'lΔΒ »_©—AΥθί�N½�Ύ΅Α…νΝ›ΦΣ½χܣӞ�μ3š={.}φΕη”κΞTτδ“O(w₯e΄;ίUkΦPŸΎt:όp• lΊ/^΄”R€LAΪ΅ΥnpMΒh""b“oKLŒj_:ʘαΛ3Ϊ eΙ€±ΐ§kΧ7Ν­hwΤ ‰ΐ€Υ©χ= ’�*=Η†‘HτώϋQΖG2(2}F k”αF5ι‚Y ""ςr’„)‹9ωρ{χν§jƒ?mΪ4z“8ΐόmϊλHυ DD΄…“š–.[‘HPγhοξšΘ„xIœHhœ΄Κ]>†ΫΈ‚žυή½{ιόηŸϊαSκέͺU³έwο½hΩΥ‚8ρ3•η½SολtN?|π!-[ΎΒ)*VΓΠχ1Ά”/_–�€NνEDDE[7�§‡Σ=¬λΌόΣO4cζ,ϊθγΣtWΚ;)§R±ͺ[»–"ρ}ΠuͺΫ±‹“Ί-ΖΪsgΟQξ<Ή¨IγFt{²dΦ½Ϋ‰ˆ €Τ¬QŽ?N[Άn£OϞ₯;οH©σΦ©UK»«G惆xαŠ~υPŒ7mVnOΠχίOΟ<ύ4•+SΖRκ‚λYΈOh3δ”Hˆˆ‹ζΟ₯ηž{VߊqΝύΣO—΅ΊψY…χ™OΟ:ή&'>ΌzΝZ:}ϊϊC)š�£Θ„11Ϋ½ςρw»vοΡ�(οJu'½Ρ�=ψηo€;vR‡N7Ηd€ΕΌ %TΈΪ„ώδ Ν[°€ 6ϋΠCQρ’E©¬Rφ΄έ—-Y€ίCδΑx0aβ$ϊωΚ/T²TqEB¬Œ`mώάr†CvβŠnxηg+’ζ»§Nιz²>ϊ(+VD·ΎPm―T₯Ίη?‘’ΊxήPΟ99λ(ΜbnψεΧ_(cƌZν°tΙšΗ‰·h〉γ4)돢ꃰ=ϋφικA „b2 €©&Ν[Xλ¨~@$‘†zη-X¨ΘƒΗθouŽ5Ιkυ_%γrζyI§Α'αν\½f}wα;₯ψ eWJŒΚ—ΣnOΉβ¦y§‘†φΞ;:BO>υ„VΝΔί’0vΔqB4W(7ͺί|ϋn�O—―ψJΓ]λυθΦ…jΧͺ‰*υšeΒΔΙz‘M½£ ‚›Άbμ7a’N‡ώ>Ϊγ_οΥ:Τ₯s'œRίώυxͺ/ΤOΈγ₯ΙjŸ΅?“£ΗŽQ“f7αv’ΉΏυe8ο&ϊTΆη<Šh;ϊL³¦υm€ΰΌH­qlρΠn‘Œ—ΈΟpΧίφzΝXο†ˆNί3ε/ZΌ„† ‘«7a\yϊΨαΊrΧααΎ›¨$ά1ΊI£†ΤΎέ뺝 εŽ›0‘.\ΈDΕ‹₯Κ―TΤαψ DDδοŒ›9Μ*4„3n /Aύpϊ C’‘I*‚€ ‚€ ΰ€€@‘ A@A@ψC@ˆˆρ‡΅›š@D,V’dΠ€gωfγϊ΅AΣ!6d‹"’›‚BŒ|!ο)I#DŽ@8DDΤΚ7"ν­€š“QΜr"".˜;GΉχ»ΉjΟΟ―—.[N{”ίxΈ9·;L8Τχ Βg jg}zυ΄ MΈύh'"B-€³RχƒR^ σ·QŒ<ρ­ˆθ―ο+Ba·{[n M:NL3aώŽœάΖ‰ˆώ�γ9 <$V6ƒξƒΡΖ·ΊwΥΔ8ν©’Yσ֎>“'ZˆˆP2ƒ’ οΩθqγ©{yι«―ΏΦκg¦Νφγ�wb4Ια <ψδ„Ÿ=ŸΉζύ€MΌΣδ—7:wΡu™xND4aώŽvKιb3䐛Ήˆ=lθ`ΊλΞ;y°Χωργ'‘ΨΝΨe³q£Gz•νοΒ‰ˆX«¦/Ι‹ηωΣN³dxz~*§ΌΌpΟ Q$""'ŽΩΫΜu.wιnΟΛέΖ"Ξί3ηω�^½J 7u$?Β₯o‹ζM½;y^œΫ‰ˆ―ƌ‘]ΫӚk"Ϋuπu!ŒψpΘNP’œ2i’ε>ΧΤc?:υ?€ •Τe/7ΤkNψ ”ΧAζZ±t1₯Nύ€NΎ`αb6Βϋ=νΫ§U©δ!κ^ψξU©^Σk„’,\«?ςΘ#~«A‘‘°[—ΞZmΨo¦ˆˆώςβΓƒΚUkψ‹ΦΟsύšUŽλ('Χήα�υ€ο²Ε ΤGiύΆsuυuΌ0ε€ͺpˆˆαŒ—¦ατΩέ;·[$ύ™³fΣΨρuqƒχοέe½η}ϋ πRΖ4u†σnvμОΎVίπθο#’PΗΛpΧίφΖ™±ή 1œΎgΚ‡ˆˆΆ†σn"_Έc4ϊ WEYΖ0v�z ""�‡2‡™ςC9β}~P½ΛN€ΦPΚ‘΄‚€ ‚€ ΎΡ A@A@ˆG„ˆ`»¨*Sζ,Tρ•Κ”μ†ς„=ΛίΚ%δž];θΤ{οΪ£ό^'SŠ8―·χl ^Qκ<³gNσ›6‘"νίk©οkƒέύ`°τ/α#ΐέ―Ϊb•ŠMt °Ζ *ZcΗM κΥͺR6₯΄rε矩rsΛmΖ΄ΙZΩ‡‡ω;‡KCΈ6τg؈λή­«RρΛ‘TΆƒ\½Δδ…ΛΤ~}z*d6‹(iβ@δ:¬G‹.ρQυ™ ‹Ϊό�φξή¦²νγψeȐR**D%Q’„Κ›9C*BζB†R=ΝE™η™J™g’yž‰ττ€e2O™ίuέ§΅¬={ο3ν}όΦϋyΟ^Γ½¦ο½φή§ηό]·žΛž΄ΚΣ·cǚ‘ZuέΐΑCΜΠ¨φvχ«{Έ\]―lΦ?:Ηη€ΑΙΗ;χ―ΗVϋ;vZΑÝV₯ΉE«ζω›όν믝ώa³LωŠN5Ewu!m―A3­œΆCΟΉs§,X°P–―XιοPa­gΘ›ΧμhXΘΑƒϊ›‹}wΓ^§ažΪ΅j:Cλz½7­Έ§‘ϊΎhΪ€±”(ρ”ά{Ο=~O©Cχ±*±ΩCۍš6idͺqΩΛ±½.Ά†:nυοο:±΅KŒmφpΤE rώΨoŸWC Γ‡”ΙVuΌΨ¦`?»jT―&­^oασΌώ°q£LΆϊY‡yΦ©[^¦’¬}NΒτ•Ίu%χ}Ήœ@‹½MŸ+­’Ψ­GOΏΟ{Ÿ^=€ΰ#xœΣήWοo𐑒C:GΒ΄vΥrŒ�Š΅ϊΉΰž΄ΊεΜιSΜύ_ν=‘ίe΅kΧ΄ξϋaΙ`…LνπΉ»κ•ϋΨφΌ†,^oΡLŠ~ΤͺD—ΕRΦίπΚvQ«…N›>έϊž¬f†ς΅₯Υ [[CΡnέΆέ^εσͺΟ\ηΞ­χλ½>Ϋτρτ°Ύ/½�1~n~φιG>οO­€5κ«―Νg€ΟΑώ]ΡξΦςJ½Ίζσ½ΖK΅ό$ύν«Οwg+ψ]Ύ\Y§‚έN‡#ΦΟΫ™VΕΝ±γΖΫ«Wαζ„ψήtNhΝθPΈ ­ c3ήθ^mζ΅βο’%ΛΜ{LWΈΓ\�Ρ�nρ7Ωύ­ΫΌƒΒv{ ΗW΅ͺ—₯K—Ξ^e^υwŒYί}ηTfsoΤΐ]ǎνΝΠΦξυ:―ί_ΛW¬’AΦο$vE\ν ­rͺ“~«‘B:ΟΈ~w―\½ZΪ·οθμ3;xύΠί£4¨+%K”›2ft~—ς~ΛοzzΝ_|ήΕϊN{ΒγσKίWK¬ΰμΫοΎηs­ξͺΗύ 4‘\χε»Γϋ:L»ΧnOqωΌΤc„σΜ~σΥ(σ{²ξο=,ψ”Iγχx  Ξ{S+Jκο@ΑL›7�$u^iΰ·i¨Ÿ—αώών>ωš•ΛΜη«χάξ6φ|8ΟήΊΥ+L`Ϋb΅Οι έ�”�š΅’°{ υ½iοξg΄ώÈΟ>ωΨγ»ϊΘΡ£�Ηϊο°ΖHΆ¬ΩLeσΨΖ‘|‡ΩΧΛ+ € €@dDŒŒ~ΰ*@@kV€ bdvύΝ™2IΜχΘM™n–Τ©RΙ‘Ώɟ۷ZΓ‹Μ ζͺ@?τΘ•+—υΗΑt&X`�αΫOӈZ₯ΥίξΉ;§œύ\ΈηžœrϊΜ?²}۟>Gγλ©Π K«zځ‡τΌj 'χύΉMŸθο›ϊ­ŸaΑτ‰†S5ΰ}³υ»κqk8_ 5k(‹)<;˜¦φZ]O' τd°†fώρΗΝ²� ¬ύš'oΙj ~δΠωcΫΦ«ξ―οΟ‡|Pt(θΨ†œϊ"‚l¨Ÿ΅yςά'VςΝ:t_ΠΟ_‡Χf2Ξ›'―άhν·†9έ±kηU]γγΤ(·5όvΚT)¬@°+¨ί1τΘ—/ŸdΉ=³=rTvξάνχύ©νμ ’ΨΥuE­gO�άzkXΰ`>βγ>Γ9† υ9ί΅k·OΘ6œγΕΆΊ„ϋyΫqΩvE œίΏ―μsΑΎ7½ο&άΟhύ2Ω³g“ί~ύ-¨�žρ>/Λ € €Ρ)@1:ϋ«F@’AΔdΣ•ά € €D‘€Ώ bήFΔ\ςύVpοα‡λz–.[–(Γ°..žwςDŒηSp8@@@D ˆ˜Θΰœ@@ΐS€ ’§K € € €@b DŒ_mΦψ₯k„uΠΟΊ~!cƎ kίhΫ‰ b΄υΧ‹ € €\]€ βՍh € €—C#€ € €W ˆx 7D Œ bpN΄B@@’I€ b4υ׊ €$C‚ˆΙ°SΉ%@@ˆ1£Ώ’Θ+‡–�e+DΝuGκ…ήrΛ-rχέ9ΓΊΌ~ΨΦ~ΡΈ“—,š/©S§– I»7;FγmpΝ € € €.‚ˆ. f@@_€ bβ›sF@@@@@@@ >"Ζ§&ΗB@Y€ bΘdμ€ € € € € € €D”AĈκ.@Έφ"^{}Ξ#€ € € € € € €@ς ˆ˜Όϊ“»A@’N€ bΤuŒ € € € € € €xDτΰ`@@ ±"&Ά8ηC@@@@@@βW€ bόzr4@@"†Fs@@@@@@@ Β"FX‡p9 € €ΐ΅&@ρZλqξ@@@@@@’›AΔδΦ£ά € e£¬ΓΈ\@@@@@@@ΐK€ ’‹ € €‰+@1q½9 € € € € € € ίγ[”γ!€ €„$@1$.#€ € € € € € €'@1βΊ„ B@�-‚ˆΧVs· € € € € € € ό"&Ώ>εŽ@@¨ ˆUέΕΕ"€ € € € € € €>}HX € ˜S›s!€ € € € € € €ρ/@1ώM9" € €@CΐJ€¦eΛ?#χηΙλΩ>$cFεΡζΎϋξ—ς+y¬σ^Έpρ‚ ξίΧ{5Λ € € € € € € Ε£ΈσΈt@@ 9DŒΌ^¬ώbMΉ+GΞX/μΤΙS2dP?6?ς¨”*SΦcχΒεΛ—₯WχΟ½W³Œ € € € € € €Q,@1Š;KG@’ƒAΔΘλEwqϞέ~/πΐώ²hΑ\mξ β±cGεΤ©SΫuαάΉs2eβxŸυ¬@@@@@@@θ ˆ½}Η•#€ €ΙB€ bδu£;ˆΨ³[Χ /ΠD\Όplόa}Πϋ�@@@@@@’W€ bτφWŽ €$ ‚ˆ‘׍#―OΈ"@@@@@@"Y€ b$χΧ† €\#―“ "F^ŸpE € € € € € €D²AΔHξ� @Έ"F^'»ƒˆ§OŸ’4i�Κ₯K—δτ©S²gΟn™3{–ί‹vΝ|ξά9I™2…iwζΜ?rδΠ!™σύwrςδ Ώϋ²@@@@@@’W€ bτφWŽ €$ ‚ˆ‘Χξ ’Ώ«;{ξ¬Μœ:UvμψΣc³;ˆθ±αί 3�Y΅RV―Zαo3λ@@@@@@@ J"FiΗqΩ € €@r ˆy=i΅βΙ'δΒΕ‹rγ 7ʍ3:{ήͺx8 _oS)Ρ^i5¨xςψqωηŸ$Γυ$γΝ7[ΥSšf—/_–qί~-{χξ΅wγ@@@@@@’\€ b”w — €D»AΔΘλΑlΩ³Λ)kζ£GŽx\\φμwΙσΥkHκΤΧ™υΏύΊEf͘ζ΄ΙαΉ-sfωλΟνΞ:Ή>C©ύr='ΘxΒ 7<ΐ£  € € € € € € ½£·οΈr@@ YDŒ�n|ΰΑ|R‘besΡ'NZΒAΑ 5€ΨψΥf¦2’Ρά»ΗΡuγ\- € € € € € € ˆ†  € €‰!@11”γχ­ΫΎi….\Ύ½Ί}πΖM›9UG "GΌ*.} "€ € € € € € €@D DŒ¨ξΰb@@kO€ bτυyΛ6mΝπΜ‘V6¬WΏ‘άz[fsΓΣ§N–­ό}7Ο#€ € € € € € €€ADV € €$¦AΔΔԎϋΉR§ΎN4ˆ¨ΣΩ³�Θ€Ύ½ƒ>h³­%]ϊt¦}Ώή=δόωσAοKC@@@@@@ˆ\‚ˆ‘Ϋ7\ € pMDŒΌnN•2•\ΌtΡο…U«QSrδΜiΆƒΟz]qι�%ωίΟ�•ysfϋέΞJ@@@@@@ˆ^‚ˆΡΫw\9 € ,"Ff7ޜ)“δΜyά”ιfI*•ϊϋόΉ}«³*Ζ6₯M—VrεΚ-™2έ"ι―Oo†jήωן²wοήΨvc € € € € € €D±AΔ(ξ<.@H“C/r € € € € € € p- DΌ–{Ÿ{G@"@€ bt—€ € € € € € €ΔA€ bπΨ@@ ξγnΘ@@@@@@@€ ˆ˜”ϊœ@@@"ς € € € € € € €Ρ-@1Ίϋ«G@’^€ bΤw!7€ € € € € € €ΧΈAΔkόΰφ@@€ ˆ˜Τ=ΐω@@@@@@@Έ DŒ›{#€ €ΔQ€ bΩ@@@@@@Hb‚ˆIάœ@ΈΦ"^λOχ € € € € € €Ρ.@1Ϊ{λG@’\€ b”w — € € € € € €ΧΌAΔkώ@HZ‚ˆIλΟΩ@@@@@@@Έ DŒ« ϋ#€ €ΔI€ bœψΨ@@@@@@Hr‚ˆIή\ € pm DΌΆϋŸ»G@@@@@@θ ˆύ}Θ € €Q-@1ͺ»‹G@@@@@@„ " € €@’ DLR~NŽ € € € € € €ΔY€ bœ 9 € €@\"ΖE}@@@@@@@€ ˆ˜τ}ΐ € €Χ΄AΔkΊϋΉy@@@@@@H“A'r  € €@4 DŒζή ξΪoΊι&9s挜;w.Έhu�Ώ^�¦Kg�ϋπαΓQwύΙ傇 (2ά ?�ό³|όi—δr[άG„ δΛχ dΛ–UnϜEŽ="[·n—_ΆlΉκΥήrΛ-ς@ž<’ΥΪ7UͺT²sΗNωεΧ_%�>;ܟkW»©„Ίφ7Ϋ·•G ”³�ό#υ5 x΅kΥ”¦ϊl_Ήjt~η]Ÿυ ½’FυjR―nmsšίκΉHθkβψ € € € € πޘ3 € €Δ"@1œ$ΪTΆό3ržΌ±žύπαC2fτWΫ”xΊ΄δΙ›W�§Ώ^R¦LiΪ]ΊtINœ8!³gN“½{χά7)7hπ€ΞΛ1α‰₯Λ–G|x’�u­Χ[ΧόϋΦ­²pα’$£›?wΆdɜY._Ύ,�W¬„œ:}ΪηZΚ•--χά}œΆΆ}ύΝ·>Ϋ#iER<κ*φ�gF[>ώ ―fτΓΊΥ’:uj+ˆψ?©U§ή՚_3Ϋ#ε}’ΐ³gΛ&52₯JΙM7eτΉ₯ύϋHΏώdڌ™>Ϋͺ=�œ<�\Uɟ�!I‘"…Ηvύμ˜3wžtοΩKτ‘0M7Fςܟϋͺ—ΫηήUwΎJƒ‘Γ†J‘BM« lέ²Esiβ'ˆΈ~ύiΨδΥ€ϋ%Τ†Φ-[H£† Μα›ΏήJ–―X™P§βΈ € € € € A#¨3Έ@@ΰZ ˆy½^ύŚrWŽœ±^Ψ©“§dΘ ~~ΫΤ¬]Gξ̚Νο6]ΉbωRY»zUΐνIΉ‘Ψ“�'ϊυ1—0|ΔHιέ·R^ΞUΟ½yγzΣfΣ¦₯^ƒFWmŸ ^z±ΊΌύV'sθυ~†›ϊ=Νθ/GI™°βÏρΫ&RV&ΕsΠΆMk©�J]Cπκk-d՚5!sDτO ο�W}k_¬Q]ήισ~νκ{χι'ΓGŽςh2οϋοδφΫ³x¬σ^ΨΏoΏ‚ˆ­^o.7άpƒόώΗV™0qRμ'Ό†ΆFΒϋ$ΉpΫADύ|_Άb…lόa“όΉc‡dΎνV€Νφoύόω ςBυ—δ―9·n8`ͺώφΫοrζŸ3R¬X1yΆr%§zξμοηHΗ·ήvφKͺwqζ¬ΩV₯Ζ}~/εάωσ2pΠΏΫβΊς«‚dήΌyδΜ™€g|0Η΄Ÿy‚ˆΑhΡ@@@@βK€ b|Ir@@°"†Ε– ;Ήƒˆ=»u ϊ\ι�₯“W›·4a’‹.Κd«šΤ�;<φΧaš5ΐ©SRTΒ‹‹…6IͺŠˆΚ—“Ο»|jnaΛ―ΏΙ‹5kΌ‚ˆiΜ†ψ"Ζ~†kwkRΏO’“ΌV5­φΒ 2bΔ—!C½G�|֌©rΛ-·˜[ώ¬λ2fμ8ηφ;wκ0$ΫΌΩ«ςZΣ&¦νΑΏ�–�e+8ϋ%Ռ;ˆψΌU₯qλΆνIu)!ŸΧ~ζ "†LΗ € € € € ‚ˆqΐcW@@Έ DŒ»a|!ά b₯*Uεώ}FφΨ/λΦ­—‘ΓGXUΈ8ΧPΉrEy‘jU³œ"EJ)T¨ ™Χκc?ώψ£ΣNg΄ZΩΘQ_y¬Σ…PΟιs׊qcF›{ΦUίyW΄j˜=ιyή{·³½(<ς°Ή?]‘αχ΄ΟŽ΅σ»�q―r柯ϊ¬Tx¦Ό"5KζΜrβΔ ΩjυΛ΄3e�δ)N;ο •κPΗΉξΝe£2™ΝǏŸ°*tξ–ε–M�ƒpπoyβρ"r³uΞ_ϋM>όψS©υ�KςtΙβr½(ϋΓ2n�f'Ÿ°™'ά>y¬HΣ'Ήsε’λ3\/©R₯–νΫ·Λjkκ@Γ χιΩ]�¦Og=ί›eΐΐΑzzg�ΰΫŸw‘T©SΙ’EKdμΈρf[€½Oœ 0£ύΨΞϊ�iμ„ ςXαΒςΈΥ79ξΚ!ϊΜώoΛ/2jδW>Ÿ=}ϋτ” ι―—SgNKΛV1CρzŸΒέη?nήμΧωΦ­δΑpv0q’̝·ΐYeζύχή‘ž{Ξμ2a�dωΘz�‚™΄/W­ΈςQτΙβ>Ο»GϋΆj•*Ξ!7YŸ{ήοegcgΒ "κπΣ•+V”'­Ο œ9sΘ-™2™€ώΎ½ϋdΫ_Κ|Λv�”©―�wn’�z¦έΣΩΞJϋWΫή'Τ bΈίa%Š—zukKžϋσȍ7ή Ϋ�όSΦ¬Y+ηΝ“WκΕ 5[₯\ϋzyE@@@@δ!@1yτ#w €D­AΔΘλΊpƒˆZ QL/^”>=»EލΈ’oΎ%ωσ?`«ηjο _Ί΅dΙςΑ{ο:!2Ο=D4ΠΨΆ}ωᇍ›ξΟ}Ÿ|ύεHIŸ>½ΗzχBŸ~d˜F΄§vo΄vΒφΊ@―σζ/vovτΨΞ9=ΰZx²hQ8 ―Y³Σ ]Vͺ>²›·†[νΧ·—½λ«Ώ hLϊθΓχ€Lι�χ 4„«5XΫTη•ϊ²yσ&q}œ…0c‡…‚Ω₯JΥj>‘ΐͺU*[FοϋμώσΟ�“Zuκω¬ΧΠPίή=|ΦZ‘AΪZ/Η„‰΄M\ϊ€Qƒϊ�’ωkNΥϋœz�-[ϋ„vm£7Ι+ {μ¦!»)“&˜uί͞#:Η ηIο °PΡ Ϊvωτ“[cVkΨψÏ>6\»αŒi“L°X—_oΩF–._nor^;uh/΅kΥ4Λ­ΰξ‡ωžgΜθ―DÐφ4dθpι7` ½�kΧΟ>‘g*”7ϋh:Ψα„5Ό§C7λ€χZθ±'ΜΌχ7Ϋ½!uλΌμ¬ή°a£4hμΖuΔa&ά b‡φν€ΞΛ΅b=³†Ά5Όν=i pρ‚Ήή«Νr‚…ύ�χ·�~ίS1άο°Ί/Χ–ΆΦwRͺTž‘Iολ!ˆθ-Β2 € € € €ΙW€ bςν[ξ @ˆ ‚ˆ‘ΧMξ βιΣ§$Mš΄f8εΣ§Nɞ=»eΞμY~/Ίe›ΆVΘθ:9zτ¨Μύ~–<φΔ�ΙwάiB §OŸ–½{wΛμ™3όξ›”+_¬Q]r[ΥθtΊϋξ»ερNJ˜ω­ΫΆωTξ›±ο#ΆWAD}ήχξΩ+EŠ6Υ@u�SΦηhkΘb}Υ©q£†�κυζf~ώ‚VΰΩ3x¬Μϋ^2ίv›iσR­:Ÿ_f₯υ#>ƒˆsΏ›)wάy‡9tΛΦmeΙ�+Uνσω{­Uσ%y«γ›f“wΦέ>©‚ˆZmsΧξ=ξKqζgΞϊΞ#@k�ωηY³nμά±KNž:)yrηύ^°ƒ{_tο)_ώΖ9Ž=£U%S§ΊΞ,–*U�ωάLˆ bΈίaΊίw3¦ΛuΧΕΌwύνwΩΈq£ά•γ.ѐΊ{"ˆθΦ`@@@@δ-@1yχ/w‡ €DΌAΔΘλ"wΡί՝=wVfN*;vόι±ΉuΫ7M8Lƒˆ3ft‚bξFg­`ΖΨoG[‘CξΥ3―ΓωθΧΗ\Οπ#ύcκΎΨn]?“rεʚUλ7ό` ΪΖ ιΚ γΖXCVζ6Ϋ{υξ+#F}iζυΗς%‹,§Ν²š�φϋΞ6Ρ*UΏός‹ΗΠΜ ¬;€΅iӏR―A#οΝ>ΛρqN=¨VOΣπ’N�}HJ•©€fVψ1ϊΛQR ΐC&Tψπ£1ΖMΝΒj§5­°ΩΞ’tαΒENs ά}όαfωˆυΌ•xΊŒ³­H‘B2|XΜΎZ²d©˜ώqX3ό� z¦PŸƒ@Η e½†΅’£N―ΎΦΒgή`ŽυΓΊΥΖ,˜ ☱γLΈQƒlhΣI‡‹ύΰÏ₯‘ mέ²…YWΏQSΝSΓ„αφ‰ϋ}²nύziΤδ5slύQ�\ιΦ΅‹YΦJx«<λρΜΫΟx(ADηΰ�ΞΨΗHμχ‰χuZφ"―½¬U§MžhΒΊNο]οΣί”TADΧb―{χ?ο{TͺΤ lΎ‡ςɘ1c}ξ�…ηͺΚϋV]ώχΛ©Y»Ž}Ώ―#‡ •B… šm DtΏ7Cω{ϋ­Nς�‹1Aqοχ¦wDτΫ΅¬D@@@@ Y DL–έΚM!€ €Ρ#@1ςϊΚ"j5Δ“V₯½ VμΖn”­p‘=?wΞ μυ6•Ϊt]Ϊti₯ωλmμΝζU«Aνή΅KR€Ι‘#§©–¨4„ψεˆ+UώωL&Lœ$•+W”O?ϊΠ\[—Ο»Ι·VxJ«φκSΡ�jηΎΎPϋdρΒyrK¦Lζή•(uεhkˆςς›νοπ‘Lž:ΝΜλϋχ;ιΆ@C3λ6χd#Ψ b|½OάΧΫΌ;ˆxτΨ1)^�s8rwXsσ柬jž œΓυξΡMž~Ί€Yώ’[ωϊ›omξχ©χ6§‘5γφΧυξ°£»]lσ>ZP†δTϋkί±“OEΦ@ϋλοv=­¬Wγ₯ΐΓΏΡΊ•4¨eΨρ΅VΕΑΖM›:tœΦ»‡fŽν@ίύΜœ3¬tlνμm+—/1U»€s@IDAT₯νvϊšΠAΔpΏΓάΓ‚7kήRV¬ZεΎlY½b™\}z³Ž ’  € € € €$k‚ˆΙΊ{Ή9@@ ς"F^e³†Ύ=e Γ|Τͺ&瞲gΏKž―^Γ ώφλ™5#&0”1γM�¨ι•*g'ŽwΒ`z *6΅ͺΌιΠΝ:ie΅];w˜ωHϊJΝ‚�{ΠaTν)EŠf6•5l₯=,κkΨεΚU_°›ΘΜi“­€f³¬C�ύY»nƒ5τzŸ*ZΞN^3‘¬βγœ9­PιΤΙγMΰθδΙ“RΆ|Ε �7” ’;\₯·lΫΪ�ΊΞώUηέΙ΄ΊΪβsu΅™΄�δόω d­εϊƒ5όu0S(ΟA0Η ¦;θ—AΔNί6U!Λ”.-=Ίu5—¨Γ"λπΘ Σp˜NvΘ*.}b?§”2εž1Ηu�pW`Τ‘ΘϋδlΆχMΜ b|ΌOœbΖDœ;wž΄οψ–Ο^›6¬5Uf½Γ΅Ε‹“~}{™φ:lΌ†ru�j‰Υa·5ώtιrί§Ϊ6ΣΏAQέ7ΤP΄A�Υ¨rΫm·κξςύœΉ�‘Sg3΅νΫΆ±†ΉζsVΐ½vz>Υa½ay―λXίSξ*ήmγ²μ"κϋ`λΫόNέ½'5­[ηeɟ�!Ι’%‹dΊω&§‰.λ€Χ]τΙβΞz3 DŒΛwؚ•ΛΜπν§OŸ‘'ž|Κη�ϋχν-O{�¬'ˆθΓΓ @@@@’­AΔdΫ΅ά € ££Ÿμ«|ΰΑ|R‘be³xβδ 6h€½IήhίΡ™Ÿ0φ[Ω΅k§³¬3ε*T΄†«Œ©zΆaΓ:YΊh‘ΗφHX%€ζ�RΜ΅{WΏͺφόsςήήρΩυςεΛ²tωr0`°ψ ΈΈw°CZΑVz‹s~ψΑ{ςά³UΜehυ5­΄ΜJq�„q’ϋΎ\ΑΦ΄ρ�φ¦ώ΄�Ÿχ€¬iΣgXί†ϊT―t· ε9pο—ωΔ"Άiχ¦ξΪd³Γ‰ZέnΤπ‘ζvμpbΈ}β;Ήƒrn+wUΖ3gΙΫοΎηlΆŸρΔ "ΖΗϋΔΉ fάAD­H©•)½§e‹š‘‹/\Έ yΒcσœY3δΞ¬wšuφ0ο΅kΥ”NΪ›u‘=Δ‚Ώ5ά©NhXp‡jX�iΣΊ₯Ωtι�%ιόΞ»±™ξο ΉΞD|ΎZ ΩΊm{P§ΣχT—.Ÿ˜ͺ‡±νpμΨqyͺdLeΩ@ν2ˆξw˜†,W­Xj.YCβε+Ε|ΈοA+kE`"Ίe˜G@@@@ y DLήύΛέ!€ €/@1β»Θη[·}ΣTζ�@Lί^ݝνφz ”τξ3¬«³Ρšq‡�όs»L™8ή½9"ζC  =[₯’|όαζΊwοΩm iϋύ;vT¦Ο˜εqŸ%K–†―Τ“‡ΚgU‹Lν±M‰½ϋτ“£ΎτXο^°CZΑuίΈœSCGsgΟ”4i�ˆV/+χLεX}ξk %ˆθ�HχΥΧ£e�ƒξCωΜ/Z΄Ψ§Š[Ή²₯₯IγΖ’ηώά>ν5Ψ΄Y Q7S(ρΏύΓY—ΨAΔVo΄“Ε‹—ˆϋ^ναtύΓν“ςζ•qcF’Ÿ~ϊ―Ό\―ΎO…ςεδσ.Ÿšυή‘9ϋOΜ ’^H\ή'>7x•ξ β—_}-έ{φφΩcΓΪΥrUaU§ {loΡό5y΅Ic³nμΈρςi—ΟeΜθ―$_ΎΝΊp+lzœΔΟ‚�FξΌΗώΪρ—Τ¬U7¨ …/:u^�%Ϊ·3λ5xΪ­GΜPΓΊbνͺε’.]:ΩΌωΏRη•ϊ¦ύCŸ½.Ύ›=G΄’£Ώ)±ί':tπ#φΈ”™3ΏσXv/ΈƒˆV~η?W*BΪνμ βΡcΗ€xΙ�φjσͺΟψμ™ΣM˜ωπαΓ�τ΅ζ2qόX³-ΉΗΒ\ύεH)P ΏΩ[‡Œ�SΏμίΰͺGΣJ|]>ωΨ _:\ϊ xΥύ»A8AD­¨Υu�aα_©ίΠ'˜Ή~ΝΚD "ϊ πڎqω‹νyΤγχμώΉ”.Sν‘ ’-Ξ+ € € € €Ι_€ bςοcξ@ˆh‚ˆέ=>—:υu’CΞžύGτ½RΉ«ρ«ΝεΖo4Ϋ΄"’έSα"ΛS%JšU[~ωŸΜΆ†΄Ι@³+‹ΊFwΐ*˜!6Η{½{([έV²tΉ€Uν€Υ―Ώύ.5^ͺε}¨ —ƒ9§ήοΌ9ίΙ 7ά /^”η^xQ΄Z°“;΄δ]ΡΝϋoΏΥI^z±ΊYέΐ q9g³W›J³ΧššCιPΘ­ΫΆ·Τko+|ττΣ%MΫfΝ[ʊU«ξ§Γ*wϋΌ«Ω�Ašͺ/Tχ ―ιF­³gΜ‘ϊ › Pι‘>>' cΕ€ γ$χ}1Cκzοξ=ό©;πδέΦί²VΦ,\ΈpΨC3λ1ΓνέW»z 4iŸ4{½•όπΓF&Η―…Ψ‚ˆ‰υ>±/)�ADϋ8ή―W« ΨξΦςJ½ΊΞn:ΏmšΞŠ3‘݁β‡sVkˆ»ιk͝e{(ygE,3ή•1ν¦‘DΤλt_νλΆ_uX{»Ϊ­Ώ b(FLœ;Ο�ξ9sδ”ρcG{νkx�ƒd²tΆ§pΎΓtߞέ?—�₯JΩ‡ ψJ1 @@@@Hv“]—rC € €@t DŒ¬ώΚyχ=RεΩηδΊ4iό^Ψωσηe©5¬ςζ7ωέ�+ ~Lž|ͺΈΆ°jU·% ηΗΊ―έ6©_΅κΧ3ΚΛνV₯Ά›nΚθ\Ξ{ο(S¦Mw–ν KuμΨή©Άg―ΧW­κ΅|Ε*4xˆμΪ½ΫΩΤ§W)ψΘ#Η·7ξά΅K*ΣgΜ²W|}²hQ©]»¦u¬‡%C† NθΣ_h)άsΚ1ΥΉ·Έ„J4Σ A])Y’„ά”1£σŒθύVͺςœΟ=jx²σ[₯|Ή²ΞΠ½v# ΉjΕ΅™VEI­°gO:Tφ[;Jώόω|φΡ6tλΥ·ŸΗπΏφΎή―‘>ήϋ‡Ί|Λ-·Θλ-šI‘ZU4³8!" /U¨TΕ©b¦ΗΥanG Τ)Ν;'…�?)R¨ 6Ψμσκk-L•Dwe³Χ[Ά‘₯Λ—ΛyσΚΈ1£M»φ;yTc §Oμ‹Τ[M+ԚζΊλμUζU«κuz«³lύ·b›ΗFk‘±UI�Ή5,xκΤ©M:΄vΟήύ¬!Ό?3UX'M™*|ψ±³έ{&1ή'φ9›6i$―7of/šΧΨͺˆV|¦ΌtωτΣNίσ…­Š¨Y³fuφ?ώ‚|;fŒtοΩΫYηoΖΪ OΏ�ή»’Ϝ{�ο‚ή}ϊIu«Βe~«Z�Ώ> ΦH{΅Οb w°‚ςyrηύl±'οχ΄�η;Lχ{ϋ­NRΝͺ4λ~oj8|½UεΧ�δYΏQŸ€±ξΛ„ € € € €ΙO€ bςλSξ@ˆ*‚ˆ‘Ω]7gΚ$9sή#7eΊYR§J%‡ώ>$nί*Η¬pK°Σ-·ά*yxΠj~YώάΆUφξέμ�QΫNCZωςε“,·g–£GŽΚΝ»ε―Εz?ΉσΞ;εfΛϊψΡγVϋWέ'Φ±1”sV�τŒ|ϊρGζ¨[~ύM^¬Y;ˆ3Δ 1ζΙsŸXIKΩ·oŸlύc›œ:}:ΦεΛχ dΆ†ΕΎα† r`�AγΊ�Xχacπατ‰]Γ’χY•YΟϋ¦Όj?κ>ϊήzδα‡ε¦›3Κ+LšύΚϋD―1άΙDμΣo€ >BΤ6ώeΟή}A‡Έ:wκ 5_zΡ\ΖΈρε“Ο� Οξ΅±_ψΩ³e“\ΉrYβt&4l1ό3Ζ}ΟpΎΓτ¬ZντΆΫn‘Ν›�t`3ξWΛ@@@@@ �"FZp= € €ΐ5&@ρλpn7κάΥ�άΓKGݍ$ΐW­RY�€Mς‘Y•Ρ.\ς~μ<όC½S­Β7uςDΨΤ}«ΏXS~ϋύPC{@@@@@Β ˆ6;"€ €Δ‡AΔψPδ$œ€VfΛ’ω6s‚u6$ά‰’μΘZ9lՊ₯a]υΑΏ�–�e+„΅/;%?ΈλΌ\ΛTO,[¦”3ό�‹Ϋ°qΣδΕ!€ € € € €D΄AĈξ.@Hώ“s‡$GΈ<(eΚ=“YΈ§0Β "jHxΖ΄Igvτ¨lέΆ=ΒοŽΛK,Ε‹KοžέΜι>οΦCΎ36¨SλpΜ³gN—”)SΚ±γΗeσO?Ι€ƒε—-[‚ΪŸF € € € € €Δ§AΔψΤδX € €! D ™Œ@@@@@@@ˆ ˆQέΑΕ € €מAΔk―ΟΉc@@@@@@H^“Wr7 € €@Τ DŒΊ.γ‚@@@@@@@‚ˆ, € €$ΆAΔΔη| € € € € € € €@ό DŒ_Oކ € ’AΔΑhŽ € € € € € €D˜AΔλ.@ΈΦ"^k=Ξύ"€ € € € € € €@r ˆ˜άz”ϋA@’L€ b”u—‹ € € € € € €x Dτa@@ q"&�7gC@@@@@@β[€ b|‹r<@@"†ΔEc@@@@@@@ β"F\—pA € €ΐ΅%@ρΪκoξ@@@@@@’ŸAΔδΧ§ά € U£ͺ»ΈX@@@@@@@ΐG€ ’ +@@S€ bbjs.@@@@@@@ ώ"ΖΏ)GD@A€ bX4E@‚(R¨δΎ?·όsζŒμΪ½GΦ�[Δ^4I ϋsί'έ»u5§ύΝ7~bbœ6ΡΟQ£z5©W·Ά9o‡ŽoΛ/[Ά$ϊ5\‹'μϊΩ'ςψcE|n}Аa2vάxŸυφŠς敁ύϋΨ‹ΞλΙ“'₯rΥœef@@@@Ψ"Ζ¦Γ6@@ ˆ˜ΰΔ!Ÿ lωgδώžƒ† •ϋ¬·W± οΉ'ζχψωσK•Κ1οω«5 YΉrEηjš½φͺά’)“DtH˜A@@@ "D@@„ ˆ˜pΆαΩDά³g·ίΓΨ@-˜λ±νŚ΅%…H 4e͚ΝlΊtι’τλΥC.^Ί¨)λ@@ H[nΉEζ|7C�¦Mkφ8pπ 5λΩb …{Γ 7ΘcΦ0­U«T‘Γ‡D �4!›DLHέ«;Ήέ%K–>=»›UW "ΊχΣω±ίŽ–ΘKΡ†e@@@ˆU€ b¬>«ο%鍄xr‚ˆ!‚Εss‚ˆΑD Ξ‰V € € € ΰ)@ΡΣƒ%@@D ˆ˜ΘΰAœ.!‚ˆ/Χ}E²ά~‡9ϋτ©“eλΏq%4A@Ψt8Υ…σηHϊτιM³:Λχs<+Ϊ_χ­PΎœ”(ώ”δΉ�~Ή5σm’ζΊλδΘΡ£²}ΫvΩψγ�»O?Ÿέσε{PΪ΅im֏0A+\XΌˆδΈ+‡?~Bώ·ε5ς+Y΅fΗΎ:μλ U«šu)R€”B… šyϊυGλ\ξiي2rΤWΞ* RvξάΑ,Oš4YζΞ[ΰlΣŽΆQ£ϊ֜ΘΐACD‡{φž4°y_�\rμψ1y£]iX�+œω„<ςpΉΞΊo­φ±’Γ‚Χ«[Ϋz†ςȍ7ή Ϋ�όSΦ¬Y+ηΝ“WκΥ5͚ΏήJ–[χν=i€ΆBΉ²’Λκ—”)SΘω dΫΦm2cζ,™2mΊws χ9hk=―Yύ S–,™%GŽfώπ‘#ζ|fαίC‡πyvέΫÝ―σr-)ώΤSrο=wKζΜ™εΒ…‹²ΟϊΗ9+W�–Ρߌ‘ΏvόεϊφΫ³HεŠεIkιœ9s˜!’SZUΗχνέ'ΫώϊSζ[Ο�€)Sφf¨ˆH†υ € € € PJ–γ"€ €%@1(¦DmίAΔΤ©―“­ΪX`Niώ(έΏOΟD½N† €@rp4@Xβι2Aίͺ{ί@;ύb οάͺM[Ωo…τμ©β3ε₯Λ§ŸΨ‹~_5\ψαGΛ΄3ννήhνӜ•fζΝ_ νήμθl-^¬˜τλΫΛ,>BϊτΰlΣ yuhίΞ¬ϋΰ£Od�δ)Ϋua�„q’ϋΎ\ςΟ?�ˆΏJεJ>mtEΙ�εœp‘}πή»’ιζ›ύΆΥ [Ϋφδ‡6zlτΡ‚�»GwΉι¦Œλ½β;ˆ8cΪ$Φσ>½ΌbΥ*iΦΌ₯½(qι=Hέ—kK[«_S₯JεΣߌΏ bΟξŸKιR₯ό57λfΞόN:ΏΨ΄…ϋ|σΥ(ɟ�!ϋ0±Ύ~Φυ 3v\¬mBΩ¨‘Β/Ί|&<ςpΐέ6lΨ( 7qΆλ³¬ΟtlΣΜY³₯σ;οΖΦDάοq†fŽ•Š € € € Oγ ’Γ € €„'@1<·„άΛD<}ϊ”€I“V.]Ί$§O’={v˜ٳB:}ΙR₯₯ΰ£…Ν>ΏY†Y3§…΄?@@ΐΏ€ΑήlίΦl\΄h±΄nΫήC?kν�εΛ—MΑ?Άm“Ώ�ώ[48UΎ\9Ρκz:-^ΌDZ½ςΣeAΔ%Λ–Ιή={₯H‘Β’λή{΅™œ:}ZΚ”­`^uY‡$.Uͺ€5'ζ'Τ¨^Ν̟8qBΎ›ύ½™·hΥΎΉsηΫ‹nΝ9€5cέλφμΩ#Ώoέ*i­ίu δΟ/Χ_Ÿή "ͺΓτ)“œj“Ζ\΄x±ω¨ΈUE2{ΆlζP»­ίž©TΥ}X™6e’U=ρn³ξ eΊxΙRIŸ.½”+WΖT΄Ηg±y³W塦1a6΅_oώώΫο’Ξ:o+„W @~SιοΥΧZΨ§SŸ¨Οw3¦[Υ$S›γύjkγƍrWŽ»δΙ’EsθŒwQ+!j…J{�κ™G5• zΤ^m‚ˆH΄§pŸƒkT7!T=ΞέVΏ<ώXsΘ­Φ3Ώ~ύ• ‘Ίrς”i’άψš†$E¬ͺ‘:ι{mεκΥVeπ­r}† RΠͺΖ©Υ 54»fέ:ΩΉc—œσαΠάr5¦Α,ΖٞtζΥ^ΑC‡™UέΊ~f˚ωυ~–Vug ψΩΣ„qc¬αˆs›Ε^½ϋʈQ_šωreKK·Ο»šωC֐Θu_i »vο6Λ λέ£›€H‘Β,Ηg±ίήςT±'ΝquHνα#G™yϋ‡-ή ZzWo΄·λk(}ςφ[δ₯«›έ7nά$―4lμκΝvoHέ:/;ΛήAΔΉίΝ”;ξΌΓlW7υ³'χqu˜ηͺΟǜC·ΗΗsPΜξx@Ώ>ζtΓGŒτŠΫΎŽψxΥΰi·�]Μ‘4TΨωχdώΟaΕΤ―g†^ξήσΚέΪΝχP>3f¬Η3§zαΉͺςΎU₯S§�ύ²EjΦ�cζύύ ˆθO…u € € € R—c#€ €\U€ βU‰½DΤjˆ'­*E.^”oΈQnΜxexΑσηΞYΔνmͺΕvΩ³ί%5jΦ6MŽ;&Z&�&­ψ”Φ Z;΅ώl4΄ΚtψπaΣ<άύ’βZ9§�ΆŸ|bχΡ­‰ύΌΣ'‘Χ'qyϋω‰Λ΅ΖεΩσίkW_Ϋύ‹�RΆLiΣPtύΔίχ¬†΅4΄₯ΣσΥjΘΦmΫΝΌ;ˆxΤϊn/^2ζόf£υΓΎΪΌω'©cρόM‘„ήβ#€ζ"jΗ–­ήπwYΞΊλטΚsgϞ•ς«8Γ5Ϋ ž―ϊ¬|π~ΜΠΑΛ–―-[›MΊN·ι€a@ Ί§/G “‚1«β3ˆ8jψPΡ!‘uϊψΣ.2~ΒD3ʏPϊΔ= ΄χ¬Γ>»§Υ+–™ “ΊΞDΜuο=2e�ΣτΨ±γςTIΟα™υ}΄pώη±”­PΡ<>žƒΔ "φιΥCJ–(nξU‡{ΦaŸγcZΉ|‰ά`UTΤ‘ΑK–Š Λϊ;n$γςyMί Ρt­τ‰Ώw‘8Ÿύ׊O4έg4]«>]ΧΒηA΄υ‰�w=k@@β*@1�‚μ € '‚ˆqβK³eΟ.§¬a˜ZάtO*|Ύz Iϊ:³ϊ·_­a–gΔ>ΜςKV•–¬Yc†.\±|©¬]νωGjχρ“b^�°Θϊc·]™(˜kΠ!K[CMj5­JΚ€€>qς„|ϊΡ‡‘μ&σζ/vovτκ1ΨT©ZMςΘ—θηlΠ ^X>sζΞKτ>‰Λ9έΓoFzŸ„ϋ|ςYWϊ$@η&Υ{3Ϊϊ„Οː΅Z?£½«nν»₯Ϋη]€\Ω2fБΓ₯ί€Ύ�²¦j•Κς΄U©/K–,rΫ­·JΚT)ΝΊlO΅κΤ“ŸώŸYtηZŸΩν;Ύe7s^7mXk†_ήΏoΏ”}¦’³ή=Jθ->hξ bγ¦Νd­5δm Ι–Σ6:μ΄=ΩΏ3€²†$Ξ|ΫmfυŽ;€rΥΜόΰAύ͐ǺPη•ϊ²yσΝzϋG£υ₯u«ΧΝb|?όΰ=yξΩ*ζΈZ}oώό…²zνY³vδ³―!Πk(}²fε2<}ϊŒ<ρδS>‡tWhtέαΈΉσζKϋ|φu‡`5~Ut¨nβγ9HΜ β”‰γΜΠΛzν+Wu*cκςΥ& shUΙόΦ°Ϊϊ^ΜtσMΞ.φ{S�aLΡ'c‚ŽΞF׌Ϋ:’†fNŠίΏγς»ίa�‡ΚkVΏΓ’ιw~ώ;Μ«]‹ϊί©Iρ>‰Λ9ωο0WΊfγϊΏW\+}—ίΏ]άΜ"€ €ψ ˆθ…U € €‰'@1ρ¬γγL<˜O*T¬l₯Θ6h@ΐΓ¦L™RZΆig‚­ͺŠ}zv Ψ6©6θ°”σΎ�.€ΣΫ՟4LXΉrŐφνΦ£—©2i©μΞ‹—,•VmΪΚw3§Iφl1ΑΞ`χΥ —εΛη γμ~q=gύzυΒς™3wn’χI\ΞM}ξsπΙg]θ“oœΈΎO�•>ασ2ΐd­ΦΟθί~�#pƒ«lq;qςωπ£O�²Η•Νϊ8bθ`Ήλ�»�¬ 0χR­:ςΛ–-f«;ˆψ­5tl—Ο}Ώί—-^(7έ”ΡgXgχαC ½ΕGΝD,YΊœSεΚ}MφΌ»ͺ£½.ΆWweΊ)“ΖK�{ο5ΝέΥόμύυwϋ$ΔgQΓ“cΎωΪ §mŸΛ~ύυ·ίeθ°a2wžη°ΐφvϋ5Ψ>ѐάͺKΝn�,_)&iG_έ•!έAΔ:/ΧR\§@Ϗ{ίχή�P¦L›nΪΗΗs˜AΔ΅«–›ώ8ώ‚zμ sΑόΠϋμ�εSυ0Άφώ*JΊΫGj1)~�ŽΛοz|‡ΉŸ*Οyύ‹¦ίω΅Ϊ?�ζΩ‡φ’ώwjRΌOβrNώ;Μξ=ΟΧΈώοΧJŸΔεχoOq–@@Ό"z‹°Œ € ¨•;^NΦΊν›&\xαΒιΫ«{ΐc>Y¬Έ<φDQ³}Ϟέ2ξΫΡΫ&ε†Ν_“Τ©R} ‡‘―ΏωΦ WYθί!ƒέyφχsD+U{αΉ`w1ν~²ͺP-\ΈH^z±ΊάqϋνAο{ι�ea ™)S¦D?§;ŽώA ±ϋ$.猦>‰Λs@ŸψΫ%ε{3šϊDƒ?α|\+Ÿ—ZΥ,άΙ것±ΑΛ=DπΉσηeω²εςΗΦmrΜnY§ž―κTs«Χ ‘lΪτ£Yο"~ωΥΧ�½go³ήύcΓΪΥrU1P§ »79σΑ†ήt‡«ΠκΎ\[ήlίΦϋ+Œ9Ι ezOv1˜PΨ³U*ΙΗ~`±ΫϊζΫ1γ½η±|μΨQ™>c–Y7sΪdΙ‘#‡™χx¬PΎœ|ήεS³=>ƒˆz@ #ΆnΥR+RΔٜθί‹—Z�°‘uŒ“{½=lŸhE»Ε ζšέŽ=*%žŽ©ΚiG_ί}§³Τ¨S%�DlX�iΣΊ₯iθωqολf:>žƒΔ "ΪΓ{Ÿ9sF�?ίͺ‘n/{^CžσζΞvBˆ6\Έx±μΫ»ONž•΅ZbαΒ…Μρ5|χΞήσ9§D΄«ςψ4°VzΣ}΅‚�£†5‡ρήkυzsiά¨‘Ω~΅ βΥΒ[z’Ρ_Ž2ΗΫ°a£4hάΔΜσcΔ°!RΈΠ£¦©ΏŠ—ξπ¨Ώ{ ζΑ΄Q³g¬ΠcYkθξ[¬`Oξκ–φ:ϋ5”>ΉZχμώΉ”.UΚΪDtYg̜%oΏλϋόΈχ}½eYΊ|Ή9N|<‰Dœ=kšdΛSΙZ‡P&τπ|ΥgM5I½a θΌRΏ‘Ο~λΧ¬ 9ˆ8lψιΣ/p%sμϊ1ΦϊD>7Φͺ¦�ζΜ"€ € € €F€ " € €@’ DLRώO�D "κtφμ?2 ―o$έ–%Λνςr½ϊ:+g­j-ϊωogπ@ΒΠκiση}/ϊͺΣ»�y_¦Ν˜yΥc)TH†lΪ-_±R4(ζžτxs¬ bƌ7šΥ‚ˆΫ�όSͺ>_έ½«δΛχ Œύ•Y§CΧx©–Ηv{Α½ΕΦΖnλ ω ―ΉƒkρDΤϋ·‡ΎΪπ·φ5Ϊ―Ÿ~ό‘T�τŒYό΄Λη2vœg5E­†¨UuJΘ ’9ΑΏ?ζY}yϋ1•c{FBι“οgM—¬Y³š3T©ZMώΪρ—ϋ”β>§;ˆθyκ>Ί―χ4οϋοDΓ²:Ήρ;ˆ¨}£}”PӐAδ‰Η3‡�¬λ2fμΈ«žJ+_½Ϊ€±iΧ»o>b€Η>ξχξΥB΅E\κoφ_Ά|…΄hΩΪγX±-|5rΈ<ςΘΓ¦IlαΥ؎Α6@@@Έφ"^{}Ξ#€ €%@1’ΊΓ\Lͺ”©δβ₯‹~/¬Zš’#gN³νΰΑV΅ Ο?ŽΪ;ΉΫύόߟd�υe&@ˆ’X‡&ΦιΐΑƒ�ΌEKŸκ†ώϊΏ'ŠΚ !1UΘ›Wƍmφ9|δˆ”,UΦΜΫ?ήlχ†Τ­σ²½(‚ˆΪ Yσ–²bΥ*§­;ˆ7sζw�ωέ�8Ϋά3‹Ξ3•ϊt¨Μ�eΛϋT}s·ΥPš†ΣtΪΏoΏ”}¦’³9{Άl2mΚ$g(θψ"κΑ'Ž+χηΎΟœη«―GK·½œsΊg΄*εΊ΅λœλwύΛ–-’!.{�!5ΐ—.]:³*>ƒˆ:,σ>ΛΖ_Υ½ΙΗΙ}Ήr™sΆοΨIζΝo_’Ηk(}�»G7yϊι’f�ρ&Š‘lOεΚ•‘n]―,»ƒˆς\8Ž€OŸή4oυF;YΌx‰½«T�\Q>ύθC³|βΔ y²ψ•*Ÿρρ¨Σ”IΜρ7oώIκΌ�ΐ9w|Ο4{΅©4{­©9μδEλY8|ψ°ΗirζΘ)wߝS–XΓfλδΊzΙ²e�²Υνυwος›uW "Ί½B ΤvωτΡκ•:υ0P† nζω € € €Δ&@16Ά!€ €$ΈAΔ'ι?ς¨F(-μ—Ν›6šα”Ožν±@ˆ ·Νž9Ν viΰhκ΄iςλoΏΙ 7ά(…­!zΛ”)-τπύ°n΅€NΪ\„žf͚-ǎ“ͺΦΠ°vΙΎΒΨ‚ˆ'O’^½ϋZΏ3μ”2eKKj/˜έτw­†¨ΓΛϊ›ΎύϊKyθ‘|f“φfZη?rδ°\ΊtIώψc«Ο~Λ/”›nΚhΪ/ΆB['L–Ϋn»Uš7{Υϊύ$‹sŠψ ">V€ˆ 2Π9�V”›2uΊμέ·ΧͺΦw»Θ�Uω°’dɜY:Ώσ�Ή~»±ϋZ5€9ζΫq’ξϊt�¦UKΡΰ€=ΕgQƒ“9ξΚ.‹¬PŸ†Ϊώ²ϊ#[Ά¬Rβ©§€Jε+ΑΝ²*ΚώύμKπx ₯O΄ZžVΝ³§Ρߌ‘eΛ–K�ϋξ•–-š;Ο£nwuΉs§Rσ₯uVΜ9#ύϊ΄žΧί%Ώυος‰h(1Πδ]IΠ]I1Π>φϊΨ‚ˆvοWC(»ΫθπΔ:L±Ώiήό�ξ͎›Ϊ½ΡZ^©WΧcΏ…ψ "κ±;uh/΅kΥτwuήAD­ŠΨήͺ*™"E vή ρD΄+8zŸΗ^žzπwίιμf½ΟμΚήϋZΦ`αη]?“2dΤD6lΨθ΅‘;κ½ΣΕ‹%UͺTfu0AΔͺU*Λ‡ΌηχYŒ-”ͺ'˜:y‚ά{Ο=ή— ±U:υiΜ @@@Έ¦"^SέΝΝ"€ €‘'@1²ϊ$ηέχH•gŸ“λώ­Dγ}uηϟ—₯VE’Ν?nςήδ,7hόͺά|σΝfyΡ‚y²iγΞ6f@@ at֏>x_Ά†m΅‡½΅ΟtθΠa™8y²τ0Θ^e^΅2]u«‚‘]QWκPΙ"<{φ©W·Ž©nμ�l¨ΥuΨV¦Ο˜%…­ͺnY³f5Λϊγόω ςν˜1�½gog] ™'‹•Ϊ΅kJA«Ί^+¨eχ…»ΡUΚZΥνICY›6m–…‹‹'­S§ΞoΛw³ηΨMœΧoΎ%ω­*†G“β%―Γi`¦x±b�±c{Ή+{vŸ:Μξς«dΠΰ!²kχnνΟ[•%;XAFŠΨž΄Zε·cNJΩ«Σ@kΏƒ†Ψ›γτϊFλVR‘\Y§ϊžϋ`ǏŸqγ'Hίώά«ύΞ‡Ϊ'oΏΥIͺ½πœΗ3΄ύΟ?eύ�³w'πRΗΪ¬)i!”d‰H«­EΪ΅-vZ΅PYB"IvI›J;E₯}§}‘hΡBŠΏŠ6ek΅δ�όžλœž™;3wξά[Νά>Η˝³ŸηΌΟΜ™ι5ίω=+ΎπΓ~š6—/ΎXpnj']_zΕmγ € € € €€ ˆΘ@@ΰΈ D<�όažσ¬³€`ΑB’γ¬œ’ΕT]ΩmΊrϋ~ΣωΝ|yΟ€ €ρ-Pψ’BrΩe—Κώe» Θ…λYΟBΓFE‹•ΌωςΘ†ο6Šv“ipƒˆ½ϊτ΅]Ν,PΠ„ό�ν?ξH8‹΄―X–iHKΫ«]8/[Ί,lX-–}GΪΖuϊΥtm»eΛ6Σύρ‘6±Λ./RΔvWmŠ;‹bυΡλ‘7on9xπOΩlΪιϊG±Λ¨VΡͺœΉsη’5kΎJΚLi%MχαωMχΕ[·n‹ΊΛίγυο΅ο�γΝ ^7�΄Ύ>½γEZ/x™{άpΫ§Ηkί;§τΨWπ9«ι΄ΌŸ€΅ϊ]θ’ εάsΞ‘?’ ›6Ι�ΎύŸΐ°§Λ@IDAT�’�ώΣς¬?λΎ¨/^\ώ5ŸiW|±*ͺΟί‘žWξσ:�z)²@@HT‚ˆ‰zεh7 € A"Ζί…¬ZύfΉτ²"ΆgΟn9⽐딯p“3_ζd͚UN:ι$»Ξ?�ό#»ώY¦M$ΏώςKΘνŽηΜEσηJŽg¦Ψ„ΞΟΏ &M–Žž”;οhθ―�ξ{ΓεΝ·zϊΣήH«–J«ΪΙ‰“§Θs»x‹dΜθ‘rΩ₯—ψΣαFώύχ_Ή‘܍_όι\έ»Ώ!Χ–)#™2eς7UηE‹KΫvωσ9ΆM= wίu‡δΝ›ΧXV-Z>²טλwο=wΙ Χ_'Ω²eKΆΞW_­•Χίμ.«V­X¦Ϋ<Ωώρ€y‘&ξΈλ^Y·~}€U’^¦Ο½o½i°%$K–,ώv?™Χχk―Ώ!3gΝρη₯ΧΘρ8¦Ά½X±+₯YΣ&R‘\9�uvγ¦Ι�GZΟ³JεΚςΔcΘΉωΟ Ή«o�χτθΩK>Yόiΐς|ωςšpUo)tα…6D°ΠLμή½G*#ήΌHκέv«άvk]Ήκͺ+ύϋ΄·’ήs>ž9ΛάΣzΘΝ»ΌΩ[4o&΅nι―ΣͺuYΌd‰?νŽάVχiΧ�δ2Auoψλ―ΏεΣΟ–H›Άz³φqΪδ rΑΨφΏψς«ςᘱvό₯�]€NνZv|ΖGΛSO?pŽξϋEΐ3‘σΝ›7ΛΤ©Σeψϋ,~ΆciΨ Ύχ�+―Κθ“Žη�΄xα<ɞ=»ωQΐίR²ΜuR¦T)<θw•¨Ζ,ZtΤ―Ρμ™3$ož<κ½/ͺF†XIτKΆDŸw₯�Ή.Ω|f ¨ήηYύ D³ί�CΚέx“]uω�%’Νό{!xΠ{ΥO»~’/ΏϊJzΏέ?b0,x[ξe>§T¬x£]Τ‘γ32}ΖΗΙVΣχΠfMšΘ-ujΙ©§žj—χνχŽτ00ΩΊι5#΅Ÿ+b}?IK{nέJn�QΝsχuΰΐϋ™’χΫ}έΩ㱾ǏΟz5o�.Ο<έΑΎ?Ί'ρλoΏI§ηΊΘ‚… έΩ�ΈΡύςh»Άv^ΈϋιgFύ7šχΌΦχμ7ΊuΨ € € €@F ˆ˜Ρ―0η‡ €ΔΉAΔψ»@υή)˜*‘†}{χΙ€ώ}’­r_£&¦šWždσ½Z=MŒ»L₯―x–,^h«Ί€Τ¦�/½"cƎ“η;?+·ίz«ΏΊVUͺZ½f@XPΆkϋ°4mάΘ�<™0ξC)|ΡEvYJ*V�ζW†�/κ†$E.»4μfkΦ|)-Z=”¬=a7`Ašτš46Δ† λKΞ9φυΕ+₯QΣζσΌ‰Χ_}YjT―ζM†|Τ/γ›4o~kτΐ}ςΨ#νB�jζmυ€XU/ΤvΑστ<‡ 6@«m}ξω.2uڌΰMcž>ΗΌώΪk₯Y³ΖR¦tιdνnφ`+ΏΒ]²…1ΞΈ�Ύ{₯½ "F4Tςp›GΒ}—^r±ŒύpT€Νμ²Aƒ‡H―>‘YM aD4€r«yξ€Teυ|SΙsόΨΡrŠSUVΫΊπ“O’ν^sδvΤξJαήkp€νΓ­mπΥυ5�‘b {ƒϋ~τz·7CO?�t‘΄)V’΄h΅©~}{{»ˆϊQΓ₯2=ZΓζͺ‘–―ψBš4{0]₯χ‘Ϊ΅kϊϋjΥ²… ΒDτIΙ ξηY}­Z%pώœ™vΆώ€ rΥŸUƒΧ4έ§o?ΡΠZj‡ύϋΘueΛΫΝV­XφύΐΫ―ύlΡεΔφζEzΤJ|“&Œ±ϋΥΠcuΆtίΗtωƒΝ›HuσωΛ ‹yϋ8hˆ >Ύ_zΛ�ςληŠXίObm«ΎŸO7?KiXτΙby¨MςΟ‘±ΎΗΟz κΧ³ŸG΄t¨!ΤσNœ’οΥ:|0r”Όϊz·€M5τή»gw�ύ6=ίΗΔ € € ηγόΡ<@@ £ DŒΏ+μ·oί²»L•¬y�}‘ι­PζΪλ₯\ω vR‡;~ά.«W­4]~žg*,^ξ)³�>y§oς£·Ÿγρ¨.Ξ4Υ’tΈτ�K₯|Ή²vόηŸwΛ€Ι“νΈώ™8iͺ­Κβ?Ό…ύή ύϊπ&νc΄AD nνάΉ#`[oβΟΏώ Ψo›‡ZKσfMμbύ’lА‘ςυΊυRόκb�θώϋό/t{φκcͺ‘ σvΓγQxωΕ�R»ΦΝ!MQ+Μ|[*›·lΆ2oΈφ:)[ξ9+gNΫ}nT©vδy¦aЉγ?”οLχ͟˜J¨z­8$%K— εΛJ�ΊΦϋq½w„Q½ β�]»lυΓoMw‹r¦’Ο-¦jŸ P‡r<°²Πf¨ ’>ŸΜ›νW�ό|ι2™3wžδ0έ‘?hͺqe͚Ta3Τ½4Τqγu^¬Α7ˆ¨L rfΞ”Yς“OΚ^w}τΞY«\jθPχύ(Ϊ ’†‘ξϋο΅μνSλΧ«ηWž3w�|�ύξb[YυhT=υ2u�x�yΫϊαΆΙͺ€zλ₯υqΤ#μ=’ bZ%Ω>ήb "j•Ύ›nLͺ蟏©hξύFη 6Ÿ5ƒ½T(_Ξ„ΠOX€ο#^Εoύ|Ί$¨:ξοό!C‡½g·qƒˆlΤατΣN—KΜ眲7\οWμύΓlSηΦzώrμŠaώΌψB[εP{wΈtοΡ3`͏¦M–όωσΜσ&ŽF1-Ÿ+b}?ρΞ'΅nQCο .’7™ͺ—™M%εΫ₯T©ώ.½gy3�ς¬?λi›έΧΚ—_~%#?όP2Ÿ”IξΉηn�Η^Z±BΕΚή)Ϊ „ "κλ¨ί·εŒΣO·λλ>οΉΏ‘Ώ-# € € €ΐ‰$@ρDΊΪœ+ € ‡γο’ΈAΔ·Ί½uέjˆίoΪ(ƍρ·=ΥPZ΄zΨ�B±§ι²JΓ1ρ8άX‘‚­f‘m Χ­�όπΞaιrΊb₯ͺή€}Œ6ˆ˜šŠuO›βwαͺ_�κ—¬ήΠΊU iω`Rυ½τ  yϋη1΄€DΤpΥgŸ/•vm’ΊcŽDΤj,皐Ρΰ!ΓͺυθQ΄ͺΚ€ώoϋ°:uλEέ5aο^oɍε“ͺ υμύvΘAθ3‰ͺγZV«Δκ°ώ›o₯αw΅γDcκkH»Ÿώ裏ύŠ’n,Ϊ ’†AO9ω�Τ»ΌπbΤB£�FF!—IͺpΩ¦έc¦BΡΒΰUBNwx²½ά}םvΩπχ?7ΊuΉ^πL5Π0‹7\_ΆBΘ/Σu½Σ§ΨξΘΏύίwςΣΟ?Ω.u»PAΔ‘ο—’W\nwϋς«―Λ¨ΡΪρΰ°₯Ξ<Φ!8ېtϊkp$₯ ’Vΐœ2iœίJοΊd” ’ϋ<οψl§°]Ό«CλVJ‰«―–άyrΫ{vυΊsΧNYΆlΉ <ΔTήε;…ImQί{=pŸ\b‚½§~š Fe‘M›6™Πωη’aooΠης Ο?g'g˜ϋυ˜±G�—·Nπ£{tΠϋ;/ŽiZ»έ>9k6$?a’άuηrύuך*u—Κί¦›w­tωΎΉ'L˜t€β³H+Ϋ62Υx/ΎΈ°œgΞE»„ίΈι{ωμ³Ο“U•sΛ5Ρ.Έ _THτGM;΄ πUW]iξ›'›φ}/KΝ΅|ε΅7άΓŒkhό±GΪI‘"—Iʜ)“lίΎ]Φ­ϋFΊ½Υ#δϋήΫ½{Κ©¦ ωΥkΦΘςε_ˆv^ΜT“ΞuΦYφ9³xΙ§ς|—ŽγNh0NŸ…/*lήkΟ²‹΄λ_ ‡kUΪHŸ£4θVγζκfΫ‹lΐI+όm0Υl'™ΐΧΈράΓ€i<#’Ϋk―H΅jI?ς3nΌt}1)¬Ι}ί?qbΘλΩ·O/ϋ\ρξϊύ§ΓΡ"¦εsE¬ο'α|�:_«λotΨ°aƒάV�—±ΎΗΟzΓ”’%“ͺ;†ΊζO?υ„½oκΙΉέP‡ "κύoؐrφΩΉ¬Ε&s�ΊϋžϋC~nς±A@@2ΈAΔ ~9=@@ ή"ΖίŠ5ˆxγfζK˜³ν -œ?OV,_pr·}T²fΛfηυλΣS4Hƒϋ…X4—-_.₯K•²Υ5όP΅Ζ‘€Vz5L _Žι°tΩ2[-ΨπƒαοΚ•W΅³;=χΌύ’;x'L7°χέ{?{Ŋ•�ΈYR%E h˜#=‚ˆ3§O•sΞ=ΗΆ#ΪnJ[΅xPZ΅|Πnγ~yσΙό·a ΣuξC­[Ϊ)νJ\ƒB:θΉκΊ^WΎ:oχξ=rS•j:š¦αx3Tƒc "z•€ΌύE`τΦχ5ΐ0mκ$”ΡyαΒΕήϊξγ€ώ}εΊk―±³RSΣ­ ͺJ•wŒΧ^yΙvώοΏ�J³ζ-₯‘ιβήλΦ>TρσOω•υ>ι…Ε44UΦt'ξα*ϋΉλΔλx¬Α‘”‚ˆzΎξσJί«5š‚ˆzύυy C€Š˜ZujΈ©Ϊxκ©§ΪuCύιΥ§― 2aΔHCj‚ˆΪ=­ήϋΌ€π~Χ~½NjΣΞί4XηUƒ^lΊ£mΥΊMπκΣξyO:]:vJ 1¬”Κ ½gxAβU«VKφμgψ•Qέ]ύ°ωΡJ»ή οΝ›5 {žZ₯²e뇓όb½&Ǐ‘‹ ²‡?t萜lˆΑƒϋ[΄j,Π£n―šϋOŽgob§΅bhϋ§:ΨΈ+x―=žή·N1‘Δΰ!άuΣ’# χ>ΠΘώΑ]G―GΧ:K•ΚGΊwu—λψ |κιg‚gΗ4Ρ‚ˆj�φ:Μ_°PΪ>’TU7ŽZϚ9Γv«?ΔΈεΦzQύΰhC΅5ΪΟ±ΎŸ„:fzΜs+ �Yσ₯άϋ@c·±ΎΗΟznΖFM›'»WT0έ‹χιέÞΫζΝ›₯vέΫνxpqθ»οɈw‡‰~n�ACΙχήί8Ω}�.δ € € p D<.6§Š €Δ£AΔψ»*nq�ώ}’-ΫΙΆεύϋφ™ "ΫδγΣB6ϊϊΚΙu7”΅Λ~ϋνWNςΊ_ΎόŠ’R£fm»μΐ��ν^!χ3SDΤͺ^Έΐ�t}ιΏ R΄ADέΗΦmΫCžώΤiΣύ/΄nέJlήΤ�§•–τXΑƒΫMpž½eΘ°wƒW‚ˆΙH�uFzέκgϊ…zΙ2ΧEΥΖiS&ΚηŸoΧm�δS2s֜¨ΆKi%νΚχΞ;ΪΥάʟγMχΏ›*aX˚5©gjΪιΈΗ㘑Ϊm`ΐέΦ ΌxσRDΤΚ–U«T²•K½`qp%Joίξ£1Κ–»AͺU©"ΥͺV±‹τ>¬έάjh-šΑ ­J—ReΑhƒˆ,ϋα(ΏkΨοL°¦ŠΪ•ΈNΤΚ‚Ϊ%½ ηΟ±UBωυWΉρ¦€Χ ]βw?;„X5κYnΡέH» έnB2ϊƒ½§lΩΊΕ"V«VΕTž{Υ_]_χ+L·άZεϊζΥEχ©ΓΜ™³Lΐ/©;SoεX―‰DΤ}i0yα’E¦rφζήWΩ·:μ=y«gΰgF7€―Αwύa†ΙΚ 7\gνuZ•¬ξmυuΤΌ{7CΓ•kLuΔK/ΉΔ†κ½ωwάu―¬[Ώή›΄nΘJŸ«V―1‘ϋέrήΉω₯|ωr6*ˆψlΗ�°AR;4όΈΐœγƍ›μs΅²yy!ώ—^yUF86ΰ˜±LΈADu;xπPΐnrζΜ!ϊΌΣ᧟–ΚUk,w'<―Htw}o<½ΊfΦύΉο+ϊYY«ι†τGήΉwnΟAΔXίO"oZ–½ωΖkφυ©ϋ�΄μ=_Rϋ<>λ}±μ3�γUv]άdhυ�²n²‹έ ’V)Χχeο3·ήΓτΰύΘΒέγ € € €ΐ‰&@ρD»βœ/ € gγμ‚˜ζΈAΔP­;τη!™jΊ;ΫΌωϋd‹έm5όςϋοΏΛiζ μl�UBΤy“'Œ3]&}‘Ÿlq0#– βGζΛy­ §ƒ[9#Ϊ b€Σvƒ,nΈƒ‡“ž½ϊ$ΫT»;Τξu>β}yγΝ·’­C1IΊΞH βSυ«X±«l»>ϋ|©}ϋFpΡδ€ρcύJcύϊ~ο πγ?Θ6IΞΛžμέ»ΧV �η› �ˆθk΅bPΝΪumΈiΚ€ ’;χΩςλoΏΙ˜1γlE6=ˆ>Ώτyv" ‘‚ˆz]ϊ™ΏΧEχΞ;₯κΝ΅,O’έ€₯V²«T΅zΨΛώΙ‚yώkΓ«ι�\±β¦kήu)A’ "Ίχ ­~άΤTώτ7Ό§A­šun±Ηu_ϊ<Χη{ΈA»pΏ±|y»X«j•Β΄ΑAD Ρt6έ Οžs$”�Ο£bΕ�το ήλYόΉΑν:]ƒtwίχ€¬]ϋ΅ίΜX―‰DάργΉσήϋύ]Τ4]ΏϊςKφn¨Igh ^ƒK:h΅Q“ζΎ±ήgή6Θ� “Zi�Ό ”NΥάΚ¬Α?β(cͺ^”Τ…Άv%]±RUo—ώ£ΆyϊŒύiΡ λ˜Ρ#ν=Y»Ή~όΙ2wξ<[κΤ’_H $G\υ7Œ0β#¬fΕ{Ρ½ΦΪΰ_~U>>¬9ΞLΣev.{n‘Β€vAˆ?ρD Ράγ6K«κ=뀓N²E7{Π�L’–χxχ>{,>_ΊχH½§]]2)οΒΊλθόb%JΫΕnΡ]_Η½ΆΟg@@8"žˆWsF@βH€ b]Œ�šβ… ΅β^σφίζΛΣμgd—μgιο―?�4Υ°zΪJ‰Αgp“ ?/Q"xΆόύχ_ζ ΩQ²γΗΠ•�’mpœfΔDΤ -Ϊ―ΠtΠnk΅ϋΪτ"Ί_€χμήMnΊ©’=FΈξ'Ÿyϊ)Dl`ΧΡκ:Ze'xx΄][ilΊQυ†pέ<{ΛyL@Zƒˆnΐoίώύ� α]~Π"RKΊ½ώͺ_/₯ΚA‘φjΩΰύ₯Lι€/byό ωΦT’7f”ν"Υ«<εv!*$jΏ‘ζc†jO,AΔ•Λ?χ«¨ι>CuύκX‹ζΟυC€ξr½Ηθ5 7τκΩ]*V¨lρΨρδ`ŒvpΓ8ZA­Αw%Ϋτ‰φΙ}χάm绁7€D,Y²„ΦΦ*dZ‘ρωΝδφ[λΪύθψΤιϊΒσvzώBΣg»Ημx¬4Hprˆ�WΓνοΠΑƒΙΊ€ ·ξјο7nΪd*�­6Υ�2Λ9ωςI±«�2‘ώ#έ»#=ˆψΦ›―KεJI2Γ_=o·ŠUJ!?o›PΡηϝε‡ΪBU»sγ^Ε½{?$Π0ί»ΓΫ¦Lž2Υ�Χ=hzug―ΠhU<­*np«›†{ΝΏΤ΅‹Τ©|u_σΊΟX―‰DΤUθ+άACΩ—\\ΨΞjύp[ωdρ§vάύͺϊ₯[/Έ»k/ˆ¨U{o�υŽιK?9J^}½›·ΘVλΤͺ:Έ!`…0#n·Βα>Ήο›© Ο…9€ν–[ŸΡ ρDΤφŽ7?r�αŒΣN—ΒζΪΎθ";­vύτ“Τ5]-λg’PΓ½χά%OΆά.ŠφΗή~"zαυ95iΒXΙk~(‘CpUφ΄ΌΗλΟzž0nŒ=}>iEΔPƒ{Ώ(c%ϋά‹DtˆjΜC@@N$‚ˆ'�Υζ\@@8 ˆε<Σ΅α>Σ σ―¦κ‹;œώr[ύ¦²KV;ϋΫoΦΛ΄)“όU2›ΐΔ=χ7’³sηΆσ΄ΚΔίύ%'eΞ,YΜ�:hEDνΪyύΊ―νt<ώ‰5ˆ¨•BϊτξaOI»@Υ V΄AD nψ.t•H·{ΐoΎa»ƒΤƒτιΫO L 6ΈŽžl/wίu§)„€ΑoψΕ\λp_ξzλπ½@Z‚ˆZΡ«»ιϊΞ«j—R ―Uϊ%ρ‚y³ύκ£ιτφ­ξΕΪεs½z·‹V`ΤΧt“ζ-lUœ©“ΖKμfιqόγqLχœ½ρX‚ˆZ•ι΄S“‚c™v΄]υiΘ/·ι:υ,SYς"σeyήΊΫv�ϋΉVΫσ½/Ξ=G–šηέ¦{πpƒšΤuBٞsξ9ώζ^p՟È[±Ωƒ­δΰ‘{Ι•λlιυΦ›v^ΌκLhUΟ§ž~Ζ£:‹όQ·ͺg‹–Ι’Ο?χ—₯4B1%!‘w‡ ’%ŠΫCξάϋ^jίγυg=7ˆΈ�Ή�lωήύB?η–-_1dQ«αf͚Εί^+vκηv@@@ΰD ˆx’?8@@ΰ8 D<Ξ •‡ΏόŠ’R£fm»Υ{�Aύϋϊ{ΈΝ|±~αΥK~ωeŒzΈθ—ΰ:\sέυrƒω’GΏΨΦ/tϊšΐή_&€C¬AD=—Ρ#Gψ]gΆ}τqΉΪt­Ϋ΄q#{š3L`BΏHυ† γ>τ«½άV―lΨΈΙ[φρΉNΟH}Σύ­C†½+Z™(xp»f~oψιΦ=)ΌΣGO Φ ’~‘Ϋ―O/[eP[—š/4΅Β₯VΊΤAΓ«ZY)=·λ<ύ‚_Cˆ:h£ηM·Ÿ:Έέ"¦wΧΜΗκ˜φD‚ώΔD ΪEΜ“nΠIwmeE FΏςrWɞ=©‹gν^Y«Ν…š4z@΄’˜zΦͺ�Α݌κ2χ§!­¦κ ‘‚ˆ|ž>5)Έ�έ©j°€pαΒrΰΐ©ΧΰN[ρΣ D₯GΧΜz<7pν΅3�czh#ν?�²ΰ ’†Au8xπμΨΉSΆ›jΒcnj—…Ÿ|°›ΞΟ=+υn»ΥΞ{½Ϋ›2βύ‘ΛuβσOωχ―‹Ιd+™n…Ώ¦ΝZΘ²+B­–nσ^θ�Yn½₯Žέίπχ?7ΊuΈo=O=ίΰAψ .}ϋΎcοΑΛƒ§½0›†HJ]s]πb;ν†UΒέSkΧ�)/w}Α�?eκ4y¦Sg;Ύμ³ΕrςΙ'‹�XZ΅FMSaΆ”ΌόbRχγΑUC6(Κ™nQ»zΦ°^€αَ€aƒϊ‘V X6oή|iχX{^¬ΧΔ "†zNΊοi ‘ήo'}ޜ7{¦œ}vRχ»‘ΆsCƒ[Άn•Zu’^Ϊ`/X΄fΝW’.έΑ½ήzολΠρΘη5]O―³^οΰA?ηNš<Εta?ΠοZΪ[Η­κθΝ‹τ¨Ο}€epƒˆ)ωΔ[Ρ»ηιλω—=ΏΘ;vȚ/Ώ”ώΖ6RΠΨνβΪ{Ν₯Ɛ bd­^=LΕε“ͺjβχ?Π4Y7ςiy?֟/έ{d4]3»λΈ5ΔΨς‘‡₯”ι@x¦ƒ~~jΥΊMͺ‚°‘υYŠ € €$¦AΔΔΌn΄@Θ0οRΆ{μ [ΕJ»ΆλέγM�ΌωΪ½f?ΣmspΠP«)^xaR7k«W~!sηΜς·§‘΄kT―&―ΏšT±l͚/mˆ#=ƒˆ΅n)Ϊν£αͺ£½ϊςKRσζκvτ 7Ψς'*X‚ˆ—^r± 4PΞ<3»=Ζμ9sδ±φOEu<]Ι Ά¦G˜!ψΐ;<)wήq€ϊ.Χ@YέΫκϋεK—HΆ¬YM7μKΙ2‘Γ=Αϋ4}<Žͺ=Η3ˆ¨νq_Σ©ιr»ž -w6αeΌξνDΠνYΓ]^΄pΟ·‚›ξbρ’%{*quqΏϋ`­ϊ¦!’ΉsηΫ.uE/δnδvΙΪͺεƒ�ͺERυ2·λawύԌίΡ°ΎνΦ8ΪmώW†˜ξa#^’έW,λΉAΔώJί~οD΅νŽT»%Υ!ά΅‹Η ’ΖfΘj«Έj©ΪΝ΅“ΉBhΥΨ&ά/W^YΤ―λ­§}NiP?�MQ«jπV‡/ΏόΚV|ή§ϋž�ΡΗ3εΙν*^ SΟ«τ΅7Θβ…σόP°� ]­_TθB�žͺΫg»£ώΈ!›εΛW؊΅‘vγ†A΅:ιΒEAΧΰmΏ1]«»d]Λ5I)ˆΨΊU Ρ€˜ξ*>Y0ΟŸ ΄sΟ_+ΡjθΣΌ{ΠΚ•«δ&IŸ₯Όe)u½jU+KσfΝδ²K/ρ6σ5ψ`«‡dΥͺΥώ<·Z€žΓΞ]?ωΛBhΘsλΆm‘E=/Qƒˆ‘BΑ)όΨG‰~†�‘ύSdζΜΩ)m°œ bGΐΔ‹/t zκ ?hή²•h7Τΰ½ΎάeѼǏΟz+–~ζW2Τ�™ƒίχέΟ;Ώ�ώ‡”»ρ&{ZnΡύ<6�όψ�θ—ΫuBU\uMG@@N‚ˆ'ΒUζ@@8 ˆΗ'LΣژξ΅{f­ϊΠ³ϋv­SM·°-M΄�Υ wŽTJ΄3͟+―*fΊ]LκΪpΫΦ-ςᨴU}ρφ›ήi "j[άξ@W¬X)₯J•°MLŠˆΣ/μtΠξ΅:ZπΰV,Σ.Ÿ§NΌ ΣGY ΅ADνžtؐ~•'―«Ϊh›ιοΠ‘CR±RΥd_ͺ†ΪW₯J7ωΑ1]�έν…ϋ‚Y°„uν’yζ¬9v–†4  ΓΟ?ο–JU“Β°v†σ'Έ’Τͺ•«Γ/�γ˜Z₯§x‰«Hͺ_Η;ˆ¨έ.wzζi{σš.\ΫιF5ΰΔ‚&ά EΏύφ»”―X)h ¬©VE^}ιE?Π₯έ½k·ο‘χ‹ωPΛCΝs«ΔΉa8]7ΈΚœ[uιΥΧ»Ι#“žO‘φ›ηΕDμπd{Ήϋ�;-IΈπωΛ>³ΧψOS‰Έτ5Χ‡εσtΊΒΡ�ˆψΔγΚ}χήcΫάέoΨ: 4pvνuΧJ­›kH…ςεlB]¬ŸAΚVH 8«ŒzAΔH‘i7Π\YΟΫ™@5ͺƒ–s»9Χk’ΥF5h5oώ|f«"Ϊs.Σύz1S5YΓ=ΧήΊkPο8©ytΫύΩηKεΑ–­#nξήg#½ώ#ξδΏ…©Ή&n1T]7ˆ¨•ΥW7tj;7PψΥWkεξϋψ―uGΒΠ±½ι½°\Ω²R§VMΡχ_νb^‡ΰnӏΗ{Η‰Dt?³GSΤ»†ξc,AΔΤ|–qεη†wμhŸ~κ ΡnεuΠχŽΗΜΡ‚+ςΊϋŠυ=ή½yϋ‹εσ₯·m4³gΐΌyςΨUƒ«;λL W{]˜»Ο+7ˆ¨ŸQτ³ŠϊψFΤγθΛ{šέ? € € €@ ˆ˜A.$§ €$ͺAΔΔΊr@Τ ’‡4],χ΄γ9Νꍛ&U² ξ²Ω�`ώ\]ΌΈTͺ’NΪ΅k§Ό�ή0oQ\=Ί_jjw°-Z>”¬}Οw~VnΏ5©»?·"†��›Βτ"jΧ½Γ΄ν (Ρΐ'¦ςRζΜ™ν:αΊΥ.Pο½;©‚–�ψωςες\η.vώ€]ΐ † ŒzGΡ@Γπ‘CδœsΟ±³Buι­ξΡν225•W­Xκ(tίœmά,yΈU—Ή― ξžΣνBx™y>5mZΤm΄;gύςέ"_�γ˜nΈΛ;n¨/½e‘c h ω”l'ϋ»kέ¦mTέ―ϋ8#n₯ΐ™3g™ŠOI‘Dg•£ξύB«WV©~€2˜nP�μ �£{7[‘N§ƒοe:Οτώ2ό½‘ώύΕ]¦γ πŸO|άσΛ™>ύ#ygΰ »κΘοIΡ’WΨq €έs_£€ntέJgΡvAmw–AώΈΟΥΤTD|Έu+y°yS«�’€W©*\ Υ#½6Eσθ†ΟtύP5w?ο ld:O»±ΧPl¨Α uισU_?{φμ XΝνRτ•Χސ‘£FΫεnˆEΝsδ8Σώx`Δ£€{·ΧD»τΜ’5‹ ­DΊο,Κ ΅ΥvλMQ«όu{ύ5»ΎV:Τϋcz )]7ˆ¨]ΑO6#ΰ°ύϊφ–²Χ'…f΅:°Ύ·ιΰΞυc χ³fΟ‘ΗŸ8RYΨ{€5ˆθ6Τ=ž†ωkΧ½έ_όΜΣD+³κπvίώώ½Π_α(ŒxΟYέu¨Š‘nΧΥρΤ5s¬ί2HJ”(n%_|ωUωpΜΨT«¦6ˆ˜ΪΟ2‘ΛηŠPϋ9Zσά °ή�:>ϋœhΥΧHC¬οριρY/R»B-<°Ώ”)]Ϊ.:μ=y«g―€Υά.λ58ήφΏϋ† "κΖξ{±VηmΣφшΑΝ€2 € €d0‚ˆμ‚r: € €@’ DŒΏ+–9Sfωηπ?!V―ΑR `A»μ§Ÿv‰†ΌΑλšY+%z§ŸμΫ·Χ[dήy·œwώv|έΪ―δ£Σ–ΗΛ„ϋ…X,AD=™Σ§ϊΑ2οΌ�#ˆ¨ϋš6e’\pώωv·Αa·ΒT€�XέυtGι„°;�DDΤ@ΐ{CIΰ�α›o�'7ͺš‘Η«‘“9³>φ+>ά摨ΏψLMQηVφξpιή#)ˆ¬m;f€œ—�<Ϋ¬NΟ=/“¦Lυšθ?Ζςε}Zι†»Ό†‹ ’x‰ζ˜uλΤ–―Φ� TΤ κΨΡ£lIχΥ«O_Ρ°™κ©•Έ‚»HΆ ͟ο3Χ�΄“ΊN«�ͺΦκ )φλΣKN=υT»ά­\hgΔπηmL/_�¬έ2ΤσΠ­§Uΰ4˜ξu‡Ψθϋδ±GΪΩm·lΩ"΅nΉ-†$φ&ξs5ψήιΜ΄ΫLν>S‡ 7Κ½&ΰιΉκΌϋο»W΄BŸ_―[/wή}―υηX΅ n ΨκjΥ.ožYΧ�ύΪ›τυδ†πCu΅ι―lFάξΞ΅¨’C ξkhΔϋ#ευnoϊ«ιksΪδ‰~χ~sοφΊεΥφ,^4ίζκFήq–ώ©ΏΞlΊΧξKΣkΠc§&ˆ¨οCM›,§œrŠmB¨Χ�.Πύ–-{½_Χko¬ΧΔ "ͺ›ϊyƒVsZK‚ˆRξϋ±꺼𒌟8)p₯SiyOλg½Ν‰8λΆΊ·H—ηŸ³λθs§‘ €{As½·ωΎ­Z«+<ςψ2wξ<»n€ ’�0aμh)\8ιώ£ϋ­{[ύ€χc»ώ € € €'€AΔΰ"sŠ € €@< DŒ―«suρ’¦[ΧΚ’ Χ¬Z)[Lu—½{�σΟ/`Ίυ¬(yσζσΙ^~Ήν–[ΒΠ/½ςͺΉW©εVΤ6jρsΜPƒv-λ}AjΉ7/₯ ’™ζϝεw‘»fΝ—2gή<†lΪΈ±d5βtΠΰˆN΄Α}�¦&ˆ¨�3¦O‘œ�½�j}‚ huβ«―*& κίξβΒuέμY« β\žΞϋl{Ψ»ξ½?dΈΠk“χθμτΉ8mϊ s?όB~ϊι'ΉβςΛ₯fRͺT »κφνΫMpνo³ Τ­x₯ƒΎ.ώt‰h5ΐΓ‡�•5_~ι ݐ™�«UCηΝ[ gη9[iσ°ωL”WgK¨`›HΡun«Χΐ†šj\{Me‡pΑ?oyj='έ.šŠˆΊž[ΙK«Ÿ;Ξv3όϋΏΫ ό5eΚHuΣ₯΄—ݐ§w¬X�‰DΤ6θϋίΨ±γεŒμ§Λ£mΫJΎs’ήO5€A oΠΰ䌩“ό΅†χ>ψ`΄œ”ι$i|�}~u<ν’»ZZ! οΎκzΉ§ΟψX:t|Ζ;€ιN;©jδΖM›Μ½rΊ|mΒ°LUπR%JΘν·ίκ�8D+Ζ=Ω‘£ΏŽ 4ΠnκgΚ‘Γή•UkΦΨu _t‘TͺTΡ†Κ0Ÿ·5΄”ΦΑ{?ΡύdτŠˆ½{½%7–/oΙܐ~J†ϊΌ}άt οu©}΅ωό¬ΧB‡Mί/+M0V Αv}ρe;ξώ‰ε³Lz|�pΫp΄ΖυΗ Γ‡ •“N:Ι?„v3jΠטώ[ΓΤ5Φχψ΄~ΦσڐšΗOMX\«ςκπέ† 2a‚ [šσnΨΰvSα9ιGw?�Ό[*™ΓzCJADυ6x Qλ6Α�φσφΓ# € € Ρ"fτ+Μω!€ €q.@1Ύ.+U©šb£Ύύf½©ΜgΎ°q†\ΉΞ–ϋ5ρΏΨΣEϊ%ž~Ρη~‘΅aΓw2yΒ8gΛγ?κ~q©5]_zΕ~AŸRQχ1oφL9ϋμ\ώξ‚ΏŒš0ξC�‹O/ ΰ―aDΏθλχvoΏ[ΙP«†«δθ­λ~α§σ¨ˆθΙΔώ8Ϋt3κ…R"νΕ{ι: W�Ό²h€ΥύeΑ•Ό£>a‚8Eμd¨ξεΌυB=¦6ˆ¨Ο½!ƒˆ~‘jΠ�;uξ,β5Δςε}Zι†»Ό6E κ:nΈΣΫ&ΤγŽwH΅š΅C-Š)ˆrGΞΜnέ{Θ{ΓGψsΌ ’?#ۭ̈ ·ŠΘρ¦#=Ί•ή"­—RQ·­wϋm6ζuΌΏΰΚhΑΛ3ς΄ϋ\MMQMά`]8# @ΧoxgΈΕvώ±"ήuηςτSIΑ2 φ6iή"b›Ό…z/ΠχꔆPέυ†Ϊ&8η­3ΥΝtή0h@?Ρ ^ΈA«{ΆzΈ­νzΩ]ηωΝδφ[λΪYξ½Β­6¦‘Ώ’e�s7KσΈλmQκ^ϋHDŒ΄Ύ. uMΒω»ϋ�`{£&Νόπ΅·ΜύA†7Ο}Τp©v΅ͺ•{έΑ»οΕDtχ<�ΟƒFMš'λζ[ŽύϋΎm~¨Z ήΞ›ΦAΔθ_ κͺΥ/υίΏ�ώ‡”»ρ&2ΕG ™M™έΏCjΦ�k~°-`Ÿ±|–IΟ8JΚ•“>½{D΅χƒΚ5Χ— X7Φχψ΄~Φ hD”΅kέ,]ΜgVοGΑ›ιω=ρTGY°πΘϋNJADέG‡'ΫΛέwy―u»–>Σ € € €@F ˆ˜Q―,η… €$ˆAΔψΊP/,$unΉU²fΛ²a™Š\ ηΟ•5«W…\~�ιšυζZ΅Mυ°€κ‚ξJ�όύ¬Zύ…,œ7םγΑ‘Αpκψl'™:mFΐ—LαΊUt»zΣύŸ8Qžος’Ώk­ YτŠΛM¦ΓRΫtCόE§Ώb˜‘7ίxM*”/ηWΣΥτ‹πΩsζΚ3:‡Ω*iφC­[J‹ζΝόu>Yό©΄6A †Ψ¦Nοw±i/ήsHΧ2π)]ΊT€ΥύeΑ!4oΑς₯K$[Φ¬ΆͺW­:·¦κyτΩβE~΅=έ_4Ού²Έ{χ7€tΙR_ήjt/Ώφ†ί}Χ>χQ+ΕhW§ξΠ³χΫ2xΘPwV²ρ΄σΑζMm΅/w§)U`Σ�’»ΎπΌ»IΘρHΑ‘eŸ-xmF:f§g;Ϊ š^—λΑΣ.»{§…Ÿ|°H]·Φ­#—^r‰„ φi%Ÿ!Γ†‰v)<,]ς‰ίkπ2wZ= ξΈ+YΘ]ΗΧ{RUSS‡¦ΝZ„¬ΰ©Λ΄+αvmΫHžάΉu�ZνρSsjϋθγή¬ξΡ}�¦TΉ0N΅jUδ±vm%ώό‹5μ¦­ή|σ­€κp+ύ71 _Ώšk€ηl¨m£7mΚDΏ‚œΎοθ}'Ϊ‘WξR’xqΏB©»έS©τeς”iξμ°γz_yΊΓSRΪTR<ΧT±υ~0‘Υ50ξΪ΅υζυ¦χZwΠΧf‡§;†μVέ½h·¦Οwιj7Υnx§›Š~:θφϊϊJοΑ{_BŽt¬&&Ι™gfOΆΪ› ‰ΎΉC¬ΧΔ "ξί@&Mž,υλΥ xOΩl*Ά3χƒ 7Ή‡σΗkΧ�)O΅oŸμΉ Υ_|ω5σYθH%bo#οΎάU½.Χλ2uςl7a’νŽΦΫξ�K.6αΩ§δͺ«Št«ν-�β‹•�£wΏ’¦7ί{ΤηZΗ§Ÿ’κΥͺ&Ϋ^?~υΥZ™jͺ|jΕΝ΄ήηΩC‡I™λΚ&۝ΆeΡ‚ΉΆb›ΎfτsCΈασOΩΚ“Zω�l…θƒ~nΧλ)έΛΌΟ!©=ΖΛ/v ’頁Σξ=z†;dσ5ϊΡ΄)!ί7έ•υήY₯zΝdcω,γήάcGϊ\Όξј.Sͺ” τNT»Φ ή*&½η»ΔϊŸ–ΟzξρS3�ΑK­Ž{ΞΉηl¦έ¬λΏΩ‚+‘»έOΠ(ΤjΜC@@2¬AΔ {i91@@ 1"ΖηuΚyΦYR°`!ΙqVNΙ’9³μ6–ο7m0]�Uƒ³›/± ΈPς˜n χνΫ/Ϋ·m‘mζ O†τ(Zτ )TθBΩπέΖd•x��hμ#Z(GΞ¦ΓU’έB‹αxσXœ—C»-PΰΙ}vnΜ&ΫMΕΕοΏ�!Y"Έ=ϊε}lEΞμgž!ΏμώEΎΫΈα˜]“ΰφD;­Α tό΄ληd_φG»ΦK. �… –ΣO?ΥvΧ½Φt#/ƒ‡4@€ƒv!έπΞ»cjšVCΣπ`Nσεχ_·η©AΉ£=h νβ‹ Λo昫V―N1Ψy΄Ϋs΄φ―A­"—‘즛δ;v™ξθ·€x?Iν5ρ‚ˆϋφο·έ=λΉ”½ώz9έsυκ5)Ο;w}Ύ_qEωϋŸΓ¦‹ο΅QoηmŸΪGύΜ•'OΣ₯λι²kηOζΉχCͺŽ©Υψ.»μbΫμŽ;μg75`ˆ^@ŸŸΣ§LΆΑU­Z§]±k•!Ύ�ς¬?λιη―βΕ―Ά?[ΆtY†½·ΗΧ3„Φ € € €@F ˆ˜‘―.η† €$€AΔΈH4@H£ΐALΒ’v/nuΨ4ξ6Cl^�μ 6\™Ϊ“9όΟ?’όmDL΄s ½ΗGΐ­κ\mόψ΄ˆ£"€ € € €€+@ΡΥ`@@ΰ˜ D<ζδ@8ζZ .ož€.Ήƒ»Ό<捉³Ž=R.»τ’˜ZU§n=[™/¦ΣF|8¬V―+\¨=“―Χ­£z]Έ¦œ € € €@Ζ ˆ˜±�'gƒ €$œAΔ„»d4@@ "¦#&»B@@@8n=F@P‚ˆ<@@Nd­yvξ\©&8|ψ°¬Z΅:ΥΫο FŽxO.ΏΌˆμή³G*W­qΌ›Γρ@@@@�I€ b:A²@@Ψ"ΖζΖV € € € € € € €@ΌDŒ—+A;@@T€ β zα9m@@@@@@Θ03Μ₯δD@@Δ ˆ˜˜ΧV#€ € € € € € €žADO‚G@@γ"@ρΈ°sP@@@@@@@ έ"¦%;B@ˆE€ b,jlƒ € € € € € €ďAΔψΉ΄@8!"ž—“F@@@@@@ $@1]LN@HD‚ˆ‰xΥh3 € € € € € € pD€ β Ζ@@ŽƒAΔγ€Ξ!@@@@@@@t ˆ˜Ž˜μ @@ υSoΖ € € € € € € €@< DŒ§«A[@@P€ β xΡ9e@@@@@@ΘP3Τεδd@@Δ ˆ˜x׌#€ € € € € € €�ADWƒq@@c.@ρ˜“s@@@@@@@@ ]"¦+';C@H­AΔԊ%Φϊ9Ο:K~ύε—Δj4­E@@@@@@T DL+#€ €€·AΔτMϋώͺVΏY.½¬HΔνΩ³[FŽx/δ:5jΦ–‹/ΉT²dΙ"'t’>|X< kΏϊR>YΈ δ6ΜD@@@@@@Δ ˆ˜ΈΧŽ–#€ €B€ bό]Ζϊ ο” ŒΨ°}{χΙ€ώ}’­Σ¬Ekɞ={²ωތoΧ―—iS'y“<"€ € € € € € €@ ˆ˜."§€ €$²AΔψ»znqϋφm!Έkη.™7gfΐ²›*U‘β%KΩy�σ,_ϊ™lΩΌY.*\XJ”,-™2e²πΜΫσ@IDATΛf~4έVG ؘ @@@@@@HX‚ˆ {ιh8 € 1"Ζίutƒˆou{-κ>άξ1ɚ5«]_»mή±γGΫ.”z ο°Σ»ώYή6Ψ_Ζ € € € € € €$ΆAΔΔΎ~΄@Hx‚ˆρw c ">Ϊώ){2ϋφν•ύήNvbΝ[Ά–3ΞΘ.�ώϋ―τνέCώόσΟdλ0@@@@@@O€ bβ]3ZŒ €d(‚ˆρw9c "ž{ξΉrη=χΫ“Ω΅s‡Ό?όέd'vΗέχIώόωνό)'Θwί}›lf € € € € € € €@β DLΌkF‹@@ %@1ώ.§DάΏŸdΛv²>|XφοΫ'Ϋ·o“gLKΦθΤ?YΈ@–-ύ,Ω~˜ € € € € € €‰'@1ρ�-F@2”AΔψ»œn1TλύyH¦Nœ(›7°Ψλšyοή?d`�ΎΛt’™ιš9»ιšY‡Υ«ΎΉ³gΩqώ € € € € € € €@b DLμλGλ@@„ ˆ—Π "j5Δ½ό!�σ f?σLΏ±ύω§τνΣΣVJτfΆyδ1Ι’%«|�½a²kΧNo‘(p‘Τkx‡?½α»οdςΔqώ4# € € € € € € ΈχΪΡr@@ CDŒΏΛxήωηΛ>Σ σ―ΏόΠΈσΟΏ@n«ίΐ~ϋΝz™6e’ΏNεͺΥ₯ΨΥΕντί�-Λ—~.[·n–B–%KK¦L™όuΏίΈQ&ŒγO3‚ € € € € € €‰+@1q―-G@2„AΔΔΊŒ—_QTjΤ¬mύ‡ι‚yPPΜ-Z?,§vzΘ“Ϊ·wŸœ~F�²U+WΚΌ93C�ΗL@@@@@@H,‚ˆ‰u½h- € α"&ή%mχΨΆΊ‘V=μέγΝd'pΛ­υ€ΰ…ύΚ‰�ύ—ι¦y—όοΫoδƊ•μϊσζΜ’U+ΏHΆ-3@@@@@@@ ρ"&ή5£Ε € €@† ˆ˜x—³Ν#ΩααΓ‡₯gχ7ž@ζL™MΔ3δχί³λΤΎεVΉδ�Λμψ¨Fȏ۷…έ– € € € € € € 8ηZΡR@@ C DL¬Λš%KVΡ ’‡”Ύ½{F}n€Q+)j‘@@@@@@_€ bβ_CΞ@Hh‚ˆρwω΄’α?‡� Ω°z ξ” Ϊe?ύ΄KFΌ;4δzΑ3«Υ¨)E―ΌΚΞώ~γF™0~Lπ*L#€ € € € € € €@‚ DLΠ G³@@Œ"@1Ύ�δΥΕKJΕJ•eΧ�²fΥJΩ²y³μέϋ‡œ~)_±’δΝ›ΟoπΔqcdΣ¦ώ΄Ž4iήRΆmέ"+W,—ŸώI _|±”,}δΟž]οί�•Aοτ³ϋ ؐ @@@@@@HX‚ˆ {ιh8 € 1"ΖΧuΤ b₯*USlΤ·ί¬—iS&%[―έcOH¦L™’ΝΧB\όΙ"Yφω’Λ™‰ € € € € € €‰)@11―­F@2ŒAΔψΊ”/,$unΉU²fΛ²aύυ—,œ?WΦ¬^rωƒ­’ΣO?#Ω²C’i“'ΛίVPLΆ"3@@@@@@@ α"&ά%£Α € €@Ζ ˆŸΧ3ηYgIΑ‚…$ΗY9%KζΜ²ϋηέςύ¦ ςΫoΏ₯Ψΰ\ΉΞ–B–9rΨ.žΏYΏN4ΐΘ€ € € € € € €S€ bΖΌ�œ € 0ζRΡP@@@@@@@ €AĐ,ΜD@8V•4ΗA@@@@@@ŽŽAΔ£γΚ^@@’ ˆ%«!€ € € € € € €q*@1N/ ΝB@N‚ˆ'Κ•ζ<@@@@@@@ £ DΜ¨W–σB@D€ b‚\(š‰ € € € € € €„ ˆ†Ω € €ΗF€ β±qζ( € € € € € € €ΐΡ ˆx΄dΩ/ € €@T£bb%@@@@@@@ n"Ζν₯‘a € €ΐ‰!@ρĸΜ% € € € € € €d\‚ˆχΪrf € €@BDLˆΛD#@@@@@@@°Γ�°@@ΰXD<Κ@@@@@@8zž-{F@ˆB€ bH¬‚ € € € € € €Δ±AΔ8Ύ84 @8"žW™sD@@@@@@Œ,@1#_]Ξ @H‚ˆ p‘h" € € € € € € A€ b!€ €}‚ˆGߘ# € € € € € € €GS€ βΡΤeί € €) DL‘ˆ@@@@@@@Έ ˆΧ—‡Ζ!€ €_€ bƿƜ! € € € € € €dl‚ˆϋϊrv € €@ά DŒϋKδ70W�³εΧ_‘Γ‡ϋσAHLiS&Κ駝Πψ�iΡͺ΅|ϋΏοζΗΫ„Ά»u«R€Θe’;wnΙ”ι$ΫΔα#FΚ‡cΖΖ[sz{ξΎλNy°Y“dΗωtΙη�ρΩNΙζGšρDϋΗ€d‰rθΰAiΤ΄y€UY–A^θ�YJ/&ϋχ;ξΊ7ƒœUθΣΠ{GΡ’E%oΎεd9ι€€ Η?�#»w�,οr?9Μ—«uκή.9s攬ٲΩΰβΎ}ϋdνWkdΙβOBnΓL@c+°rωη’9sζdmΪ¬…,[±"ΩότœQ­je)ta!|Ϊ/Γί� U»Φ Ρ€ c%oήΌΙΆ:μ=y«g―dσ3ϊŒ6΅–ζ!‚ˆΛ—―&Ν[€κτ‡(₯J•°Ϋ+Q:UΫ²r|θkδή{YΈθY·~}Δ†½�ή0Ήκͺ+νη΅β₯�‰Έn’.Μ—/―τ{»·Ήο\ςΎ·{χ―εgd—{ξo$§™/³Γ ou{-Ω"­šxΟύH–,Y“-ΣkV―’9³>ΉŒ™ €ΗN vνš~EΔ:΅jI±bWΩƒ‹ βˆw‡™γ])ˆΈΊd™Tt«J«–Ϊmώόλ/σΎ²F6}�½ž={�,ωόσTν/#¬¬!“λ�KrΜ–νdyβρGνiDΜW7υηP�μ �·OR wπ‘�³χΫwr"/½δbϋᨈΊpΠΰ!�«OίΧKΝ žl/Z΅4ά oΌ©JΈΕ©žύ΅ΧJ³f₯LιδAβfΆ’₯Λ–…έηΛ]_}o7hΕΩ_~5άβ4Ν/^όjyoθ`»}oΠΚΌ_­]+‡�ωGΎωφ)V»η β5eΚH‘BIaΐbW]%ujΧ²ηy4ƒˆE‹^!ύίξ2όͺ�ωηέ�ΌEKJάdΫΒ@@@�K€ bzI²@@˜"ΖΔvΤ7jυp;9ε”Sμqώ2Am[ΆΘφνΫδτΣO—σ.Έ@Ξ>;·τxσυdνp·ϋΝtwχΝΊu¦2βYr‰vφ_Eŏ¦O•u_―MΆ-3@Žΐ“ν7Τχ bw‚―RΉ²mk‡ŽΟΘτ„ΫƒŸ5kV.·³b "ή~k]ΫευOΘκ’Α–‰8M1ωUΣ°ξΔρΚw6Κ'‹ۊp2ݐ— εΛJμF‡–z ξH·p–Vνφϊ‘ξheΏ™³ηΘfσΉϊœ|ω€ZΥ*¦ β|rs­ΊΙΓ­ό8λ£ιa·ŒD¬XρFιυΦ›ώΆcƍ—υλΏ‘«‹3“‚sΊP»l�β‹•ώzι5’aM mκ0nΒDιςΒ‹©Ϊu’ά»\η£DυΑΉβς"Φp‹yΎ=Fώ1Οο&ξχ+ /[Ύ\š6o™*gVF@@@ %‚ˆ) ±@@ΰ¨ D<ͺΌ1νΌθ•WK΅5μΆϋM—Κο$ Ψ—vρ¦_ΦΊCAΣΝζνυ&m·ŸΌΣ·ΏΈJ΅κrU±βvzχΟ?Λ{Γ’*žψ+0‚ pά)ˆ8βέ‘~υΖλΛVν2”!P -AΔΐ=1•ˆSΥ&Œ-… ΆΎτΚ«¦ⱩίIˆ-΄ΒŸVϊΣaκ΄�ρΩN!ΦJΏYnρΧί~“‘£FKΉn°]oλQ"{Όω†Tͺt“mΜΤ©Σ₯c§ηό†Ν›=Σό)—ž2uš<Σ©³Ώ,½FiΧΖ„δ°»{²CGωθγ™ι΅λΈΪΟ±"Ύ¨L7ƞχδξ{οχΓ΅ΪMx§gžΆΛτίrΥkΦ–;wΕ•A@@Hl‚ˆ‰}ύh= € πγο6kΡZ²gΟn6tπωυ—_’jδwί'ωση·λΟ7[V�XαoΧς‘Άrκ©§Ϊiνn­oοςηŸϊΛA±έ©jε‘‚ Ϊ�ττΛγ-[·ΙΜY³δύχG† \έyGC©Q­ͺ PdΚt’όυχί²ΡT|� ΐ„I“X//RΔο²u‘©5tΨ{Λ½ νϊΆLιRv²KΧ—ε‡Ν?x‹μγmuo‘7W—Β]$yσδ‘?ώψC6˜cNš2UƍŸ°�;QοΆ[₯VΝ›ε_σ_ΗgŸ³ΗΈ©bE)S¦΄δΜ‘C΄{ΚΕ‹—H·ξoɞ={μ¦Ϊ΅`υͺUεΪkΛHώsσ[—ΏΝ9j5©M›6Ιpγ©2Σsž1Η)).(`ΪΉWΎ\ϋ• ϊž4¬»œ|κ)ςυΧλ€_�n3ύρ6΅Άm,\ψ"{Oά΅k—όoΓygΐ Y΅j΅Ώ^¨‘ή½ή’SNNͺ*«Λ΅²ΣΦmΫB­š¦yοτ[²fΞ"Λ–―°Ο›«W“Λ.»TΤθΫoΏ“ι}$Œ•β1RDŒεšh5²Ξ:ϊνΠ`N–,Yμ΄Vνs‡;v`R³νΨργCVHLΝλΔm‹ϋšaυyYχ–:rν5eδόσΞ³ζ_ύ΅τ~»Ÿ}N΄μSκrΩcή7ΟΙwŽ-zΉό±w―̘ρ‘ΜŸΏPΪ·L.6Ο§ί�CΖ›Š_oυLκ>Χ=fzŒ§6ˆΨ³{7Ι”%sΐ‘<$νŸμ0Ο›p―Ι¨1c$ΧYΉ€j•JreΡ’’-[6ϋϊ7~’Ό7|„·‰�ΨφαΦRτΚ’’?txτρ'ύωήΘ ]:‹†©Άš{_Χ_Ά³O?ν4ιΩγMΙtR&9τןΖρ©dχCέζΕΊHfσC‰Ώώω[Z΄|ΘΫεqyŒε΅©]βή^·�moΈη².|όΡvRτŠ+μzή=ϊ±GΪ�€yyσζρ+όιsQίάaΰ !]˜»]3ΧΎε6Ϋυyρ«‹Ι¦φoΏύ._™*ΦΟwι6¬€φzό"E.“<ζ=A―ΑφνΫeέΊo€Ϋ[=όϋΉΫ―½ϋμ—Χ^λ–κcΊϋJq·ϋδαο otλžζέκ½r䈀χΩτξ~9\γτ΅2Μ„?ϊθcΠȎ{4dυ¦ιώχ�K.φfΚ±Ύ65ˆψrΧlλΎ2Α«»οKͺη6WχνΖτ^€χq Θz�ξΊαΖ_yν [)Ο[ξn«]Έj1xΨ½{άT₯Zπl){ύυςκ+/…}όόσn‚κ,0ž–c&kD:ΜΠΏ―\wm�σ±gο·eπ‘iή«ΫΥπποΛoΎeχ©οΕΈ>VΥ\£ "+v₯y ³νΣiZ·Ψq}ΎMž4^ςδΞm§½?·ΥkΰWΨσζΕςθέ«RΪV»΄ΎχΖ«Εrο�xΗ�άT/ύΥV£ςΒ:jι†ϊtzΜθ‘~8―i³²Μ©\ͺΛέ/Θ΅κίύ›κl;ΈAB ).X΄H6š*@œΎ Dήd_ηΊbΈn-έν“φ(’]G�_�½ohυ9­°θΆΩ ½if…iλ­*hŽ]¦tΣ=ο•ήn€~Γ;εΫ�}ηOw~ξYΡ Œ:hXgΦμ9ΆrγεΛKΎsςωλ… "ΊFz=>ž5ΫΪj…0―‹Mέgƒ;ξ Δπ‚ށŽUQCzέ΄Š£\½‘υΓmε“ΕŸz“Ιc "¦ζšhΕ΄fMŽ„HjΥͺι‡AG˜Τ}€Χ( "Ία΅Τl;kφ\YΊl™·+‰υuβνΐ "zσ4Ό²nέzΦΏ ΐΆ2h¨ βΆνΫδ ©*¨•C½a§ ύn*$zըƌοWύσΦIGοωMQχ|ηg%Kζ¬φΠ•*Uτ―M4AD»‘ω£αΏ;vΘuΧ]kο :?TxΝ  i— © "κηqŽς»‡Υ0π°w‡ΫΓ·kσ4ύοω₯Ζ·šΤ± yΩύΡϋzpH8ΪΧζΒωsl…Xέe¨°—V9Σjg:ΈK y{Ο« /ΌΠVνΤu6lάhͺΎV?a’h{ΌΑ»&ή΄Υ?ωt‰d?γ <―dœ’Λ4δ\Iwζτ©~ˆ^―·ΎώΜ-Znψ?{w.EΩ†qό!”6PAR0€OA@EΊ»»”‹΄@‘‘”nι–΄°P $%Αožw™qΆ§Οξα?\ΧΩιyη7Γ΅χ>ο“O8ηρσ/ΏHΝڞΊ}Œ˜ΣήGLυ:-φ€T(WN*”/gv§Οˍšx}žDχ8Οuλ*­[΅0›k…ΕΗ¬ΚΎ ΄–«G�όΣTK}gΨ3Wά‘΄`ŸEΪ%³vΝ¬Γz+έΥ Iλ ο ujy>K͌k΄β¨ήwΔtΠʘ©¬κΔ:γuYΓΖΝΌ^'φύ‘ή�θημ^λ΅uΜϊΌ�Ο¨Š*ˆ>ŸtXΏ~ƒt}�‡τΗޏ.‹« βœYJžάΉΜανϋ#­β;ξ,§B½έΆ/ΎψRZΆigOςˆ € € €@Œ"Ƙ € €ΔD€ bLτbΫ\ΉσHΥκžn·*’dΊΦΥ²ο‘ŽϋS¦Oμ5Ϋ�€xώό9?v΄YΦͺm{Ήέκ²ρŸ.Λ�;δ‰"EΝό=?ώ Λ–.φڞ nD>/ΏθTΤ�{»X•EχYα>{Π/Ά{υκ.ΫΆνOVόW΅Μώ˜^*)R€0Σ=Ÿοmuo½ΖY6ϋΓ&8 3|ƒˆξΰš†DΪΆ{ΚιžRΧΠΏ―hΧΤ:ΈC@f†λoΠ!XψΓ΅I”G}ΓNΎœάaL i‚ Q "FηšψW+oiT<ϊ_`�w½@ΣQΩ6Ί―ϋΈΎAΔύVwΰ=z>ουΥuΝ9'κ―έ°jED}+QΪ<·wm�ΤιξT»3Υ€ά§›Φ›0�Ξ]»€ν΅πΏ}ΜΨx΄Ÿ‘ "Ί9eβ)X°€™Ω ’†¬΄;[τyΉtρBΉσΞ;Μ΄o˜Η E5ˆ¨;Σκ{ZYSτpιςeii₯Σ€NcU?mζi@ΈMϋŽΧν:έ4,�Δδ΅ως‹½­χοϊ¦uΊΆΓΩΊΒ³=zy½Ϋ§T¬θ“2v΄§Ϋo­μ§ώ"μk’λθgF“¦-œχεŽνΫΙӝ=?PΡπy—�Ο9»ςzΏ΄Β‹­Ϊ΄wή»΅²μ΄©Mw·Ί;`�ΣΡ=¦nΣAΓkeK—‘4iR;]Δλ>΅Ίηθ±ceφœy1=„Ω^»3Φn―7h(T_'q5D&ˆθΎ–v5e ήO4ΑόΘ@Γj§­hˆNίλmΧPb«–ΝΝ�’tŒΜ{—ξά~Τqύ‘B^½uΤ γƎ2ο3:‘χUze8l�¨‘hχΧΏΪ³Ν£>ίηΞώ@΄Ί’Ύ=Zψ ―εξ‰ψ"�^ρ±dȐΑΆ|₯*¦B£ύ<ΠΟέ!VuN;Πμ{Ÿθn+γ € € €DG€ btΤΨ@@ Φ"Ζe¬μθΙb%δρ'ŠxνλΤΙ“rτΘImuešΩͺ¦‘Υ uψκΛΟeνκUf\ΏxλτŒ§›ΔΏ¬/*'MxW ,(₯J{*Μ¬Y΅B.[‘JUͺ™υ[•΅ZG( H [Ά`mϋϋβEη z bγΡΪΔGρΐR­f―f»ΦZL+„Ωƒ@‹NQχ‘Aj Tλ ‘ηdI“Ι-·€3Σ±Υ₯�ΩY ώΔδ΅ι~ήϊΎOF΄Μέܘϋτν/ξΰ·ϋ\|s#†‘�₯K™Cϋ�ŒŸ0Ρέ yΆ[iΣͺ₯™g‡ΫμμηNGε˜φφ1y9b¨”*QΒo‘ιΖήo£fL|oœWeZ ¨-\΄XΞXUQ³Z?τ±C�Ί w…Οv­EvM7ŠΧΟDύlΤaΦμ9ςΖ ·dΑΌΩr�}χ‰V­Χ ‰΄oΧFτG:ΈΫέ{Z³#Χχ}F|υzT�VΓ«eχ{ώ‡3gΙ ·†ΈZρ¨†υ΅§C j¦φΦ‘ "κk/Ί�?Ω΅c«ά|“§Κ­ΚέχEϊZ2lΈ¬_γωqK ϋH»­QyŒξσ &ηέcFw»„h+Η ό,Œ­�‡ή;s@@@ ¦c*Θφ € €1 ˆ#ΎXίΈ„U!¦`Α�ͺSνΩσ£,[²Θ9NΆμΩ­/#›ι+�\‘‘Γ=_ΠέrΛ­�Άƒ§bΞ)+0cΪdyκι�&cWOΜ•+·T­αιήM«-ΞϊΠΣ₯’³σΡ/’ΦY­$I’Dϊθv0 Ώ>Vwužκ‘‘έX+̝9{Fήxu`d71λΩ[/œ'v·u‘έAυšuεα|yγύ˜­[·ˆ–ΟŠ•«βύšΔδ˜‘½ΦΣ/ν ™;Έh]χ<χ—Ψ+­nƒ{ZΥ }χβΎ]0k…£GυT<{¦Λ³²qσf³ΉVn� N:ψVϋsNtωοΏύ�^―»3έmζιί`‰Ξs'Lœ,£ΖŒΥΩΧ΄;ΑΝ›Šv7š!Γ]N·±)R€”[o½Εlο�θ Ηδzΰ~™guρͺƒoqύΪUN/­ˆxΕ dκ`ΏGθ£»kηRe+ˆ06+^ϋ£ο-©―A/[a9κ^+γξηv₯Z�bΏύځ?]P₯ZM§Z™οŠQ "FυšψΟnW\cϊ:Ρ6»C)$Υ@iDƒDΤΚ‰΅κxͺΪΩ]}O4όž"E sΏœΏΰcξΕ±6™ ’ϋΎΰΛ/Ώ’ί³ή;ν{ }½6oΥΖ«kς˜ΖdϋΨxmΪU/]Ύ,%­je…¬ΰκ(λΗ!:|ρΕ—�²M» MŒn1ͺαΠΝΦ9έb "Ί΄*¬Vf³;ˆΥcΪΫΗφcέ:΅₯_OeOw8&ΗyωΕήΦ}Ϋ΅Κ¨σΘ«―½α·;χgk ͺ’~DcFd‚ˆ0Τ ‘{Π$΅lΣΦTΦωv€ZΗν�“υΗ1Ρ½§ΥύΈ‡ψ"zΉzΎAΔi“'ŠήΫκ ―ΛΝ›6Λή}ϋdΥ©]Sξ»Οσƒ­ΫŠ: ‘ "Fχž�άωσ2gΦ‡’'w.―Γ»+]kUl­Ž­C ― #1‘ο9αrΟΟ�Γ‚_PύjLώO”ΟƒΰgΓ@@HH‚ˆ ©Ο±@@¨ˆbρ΄iΣIϋkažS'OΚ”IώaͺT«.Ήσ3άAĈΎ€·7{±w/iάΘS‰iΙ�eςJ_οσ,\° Lš8ή¬ξ"Ί»f1jŒLš<Εή₯yŒ¨kζm[6IκΤ©δ²Υ%sΑkΑi―ChΒς9xπ T­QΫ―uξ ’VGΥ/˜ ξ ’0 ΄^t―‰οΎβ#ˆ―wΡξžΤχ\άΣ‘DŒNΐΔένq p™ž―V=jΈ9υ¨έa¦@ϋ�|η6S5XQΓsf}`*Ίν΅kΫΊυ…DUΔΨxmΊ«Ϊj7Έ?τ”/ηι>΅�€WeΑ’ΕξΣχ― βΒωs¬Κjž¦κ¦ήκϊζ›o₯Iσ–N;C-ˆ¨:­@§ΓιΣIρRžΟO§ΑΧF|+aωΕW~‘{{χg‘vwόϊ›ƒνEΞ£»ϋέ@οΡΪ�όqΦΧ‘>ŠZ%οΘ|~ηΛχθϋ²{πm³ώ€αφkΡγ"4ΚAD½_[Ή|™$I’DΞ=+­¬ °οη©ϋσ6’{w1Πϋ§ϋDwά}ΝuN¬U§žh X‡Ν›IΟξϚρΥkΦHχkUνΝ ώ € € € C‚ˆ1ds@@˜ P1f~q±΅]Ωπβ…‹2nΜΏC4lάT2gΙjζΟ›3SZUΚtpwΩ¬nfΌ?EŽ;f–ιŸŽŸ±>iΜτϋS'y-sVbL`ϋ§›$UͺT’•‡4„°o�ΟΧp~=π«h ΐwΠ.Ηυ‹s*U¬ o ςTgZ³v­€I“Vžxό1³~ ΰβΛ/Ύ`*rκ cΖΎ+γ'L4λFεOTƒˆο½;Φi“vi©][Ί‡ΞV—ΝOuhofΉƒˆ5«W“Wφ7σuyέΆu+ιΦυ³ά]QgΜ›3K4¨¨C³–­œJPfFώhΈ$εΝ)œ-:wι©kλl‰wΨI+Β•«XENœ8α΅ε¦υkεΦ[o1σ…Ύμ•»uyZ΄Λe†[• 'Of/ςzŒξ5ρΪ‰5aW Τω΅Λw;Žlˆ16^'αD΄Γ|ͺΩκΌΈ"ΪΥ υXΎα5wp-XΡ½ύ�]Ÿ™nm~ψ!ݝΈ»h73όΡξΚ³gΛζ,:l€l°ΊvΝ!6^›yσ>(lΥαπo‡εΞ;ξ4ηjW±¨½ξ β¬ΩsδAoE΄ΊD78nμ()Z€ˆΩ·έU―ϋ@6—^xήΜZ΅zτθΥΫYέc:;ˆεw…Έ£GšχSίCΈ«ΫΛή›0IFύοG7φ|}tΏlί±SΪwμδ^lΖ·nΩh*�kUΨ}δΡΒ~Λ»>ΣYΪ΅mγ5Ώ]‡N²cηN―yMΈCiΑΆΥη¬])YχυΗοH…*՜ݺŸͺ&;+Ζ`$”ƒˆξ>lής©t~¦«Χ™ͺί +¨xΛ-žξ½# "ΊŸGξ*…^;ŒαD―ΟIσfM½Ό=d¨Wη±£GšΚξΊBluEξŒ@@@^€ β �@HX‚ˆ λθθM›·’ ΧΊ�;{¦:xΐk΅.Οv·ͺy*ŽϊΆΥύοU³ΌPαΗ₯xΙRfά·b¦L™€a“ζ¦’ΘωσηdόΨΡ^ϋdU`ΒψqςψcžπA°ξ™5θρΗ‘?œ ›~α½vυ `T·�Ουυλ78„Z±ιWšιˆB+[6�³*!zΎ4·7>vμΈ”)_ўt+”/+CήςTs�pSM«²ŽoθMWΦκMΩ²f5]M;_‰jqΜ¨RΌXQ³΅o8N«’-Y8ίω�ίDΤζ²₯‹εf«B«†;:?έUΆlυTnU»ΉV€ZΫ©ƒoΡΈŒ¨š\ώό˜ͺ―Α‚£vΧΈζ ֟`α{ytυ\4ΔbT'{¨[»–τλϋŠ™Τn²«T«i/ς{twKͺV:{Ίώφ]1ΊΧΔw?#†‘�₯K™Ωz,ϋϊψ�h:²AΔΨxΈƒDαTqΕ²₯’)s&ΓΥ@m\ίxνU©V΅²i›δ4(gτ“Z5ͺ›Ι@ADwψψψρRΧ oίtSr™?gΆσ^0lΔH™2υ}{—~+?ώHξΞt·3ί· Ξ‚ŒΔΦkSοΑrηzΐ«% -’ώ^σšη;αtξήύ΅ͺφ„Œ}Χ³§£ tΗu?ξlyΰ~OW΅Ύ―ŸθΣnsT5ό₯]y{―±ίWtΏΑήέ2ϋψu; �ŸEZ�¨w5ώω§”«ΰy]ΨϋΦΗψ "κ±ά•”}?G*₯J–ΠΥ$P…b³ †άΟ§ˆ*σ;Ldή»t[ϋσ9ΠgΌϋ΅γξšωyςΘμ™3Μ‘OXγK•)οΥ ίΰ_DADw5μθ„Ε½dΒ}ΊŠϋs@Cϊ“'N0χHϊΈŠVΰΤ�”dwΜF@@@ J£ΔΕΚ € €±-@1ΆEcΎΏ\Ήr[]|Φ2;Ί|ι’,\0W:dΒ‡š4“»2xͺ¬8q\¦Mφ�ŠΦυΉž’,Y2³ν7_ο–΅«VZ‘Ζ RΗκ.ρζ›o6σ?ϋl§l\·6ζ e$­Ύ7λΓ¦+R=~ά#οϘ!¬J£wί}·”-]Z*Wͺ(Ύa­2₯!.\Έ £ΗŒ“χόduί™W:=ΥΑy½EΤνŸ†}»™œ=gžΥ}δ ³_ί?ξ/ωυΛσ)VπνΛέ»ΝjΪ=g™2₯DƒΏZm―Y»žοζΥ βsέΊJλV-Μ~4 9wώ|«KχΟ${φlςtηNrηw8Ηpuζ믐κΥͺšε�ύ·,΄Ί1=yκ”h%Ȝ9r˜ωϊΗ7l‘’ε/•Ϋn½Υ¬³�ηŸeΚ”iςσ―ΏHΊ4ι$wξ\RΉr%Š(dμΕGQƒ.S¦½/Ϋ·νάyrΙ3–‘ύΎλ[ Ιn—ύxOφ{dΡ‚9ΞϋχO{χ‰vΡ}Ιϊ ΠμΚ•«Νͺ1Ή&φ±τQ»„Τ�!uψΣͺœ;oήSυM+;žžρΑLykΘ;ξMe@�ΎRΫ ι έΚΦ�Χ ΰ{Ÿo%Ψ`‘3―GqΒ·"b°Ν―χΪΤύ¬[³�yμΫΏ_jΧυΠƒνӞίη•—€~έ:φ€Χ㛃ߖ™³f;σb Τΰ»~†4„©U*§N›ξ΅JLŽι΅£HNΨAΔλ­Ύ~ΓFιjUώ4D'ˆ¨οuΪ₯} Ο"ϋΏύφ›TͺκyξΪσμΗθέ•νύzτν~YΧymΰ©Qέβ΄MdΊϊ΄]dζE5ˆχ.m‡½]Tƒˆ Φppd†λkV―&ϊ™›$IΏέ•―TΕ+,ξ·B$ghqܘQΞ+|7ΣΟΪVwαΑ*;ϋ�Ο4 € € €‘ ˆY)ΦC@ˆ‚ˆqΒ+;­Q»�δΜy―_8J»V^Ό`ΎUΑθχ€Η)πh!)^’”$K¨+ιΡǏ“ιS'ά†™άθ… ”—^κm…ύξυ£ΠΚ^C­ ‡o…/ ©ΌύΦ y²Θ^―Σ+VΕ› V˜βε>ύqάX½βc'Μ¨U«Υ \±·ΡcΎτbo©X‘ΌSmΟ^¦εoΎωV>ϊxΉWw«φςΟu“–V•,}?¨ί°±μωi―½(θγ£VΥ¨~}^φ qόzΰWιguOͺν‚9PxDΫΪΧΪV+Oi`S+G~ϋέχ2gξ<ъq:lί±SΪ[_ΔϋδΨΏδΛχ°S%Π^G+Μm·ͺ}ψΑ¬ •ϋvnΫ")R€°7‘ΘV1s6ˆΔˆžŸέ5³V§R�‚u‚ κόιΆm�³gολ>μΓi H»αΞnΏςά»oŸΤ©ΧΠ^EbrMœX#jάΊus«»Ο’rλ-·8Ξ­j]U«{*ˆΉΧ·Η'Ύ7N΄–^Οǟ,nΟϊ“Χ‰;p7dθpyϊŒ ΗΡ“'Ύ'…¬kΰΈΨέ―λkC»fΥaΤΘaR²xqΡΚ“uλ�gkΖ� ?�|OΙύΐ’A>{θΩϋ§Β₯ΞΫ±u³t³Χ φΨω™�²yΛ§ζ90u�³Ϊθ±γLΕVχ6ujΥ”ώύϊ˜Y/Ότ²h§ξ‘XΡ'εΝΧ_sͺ΄ι2­X:rδhiΧ�΅dɜΕ+@λ(}�Γ�°±§š¦{Ÿ:ΎΘͺΰ|oΜfΆoWΐ:Σέ½ͺNk΅ΤŠUͺ{UΤω1bσ΅iφ΄MZ1O+ηEvhΫ¦΅©¨›Ρz�³+βιΆύϊ”…‹—8»™4α])\¨œ?Až(κ�šZΎl±ί5q6ΆF΄²nοž=½Ž‘ΛOœ8!―½1XV―Yγ^݌Ητ˜~;ΌΞ ­W«fuΙe½μΚέξM΄*έδ©SEC�Αν�VƒΠξ!2ΧDŸC‡Ύ-…-θΌ―κ>τ=zΥκ5ζzœ;ή½[gΌCϋΆ¦Ί­3ΓΉή牆ά^Ψί½Iΐρ`?xΑzίΠ*Ϊn{Πͺ–³fΟ•QcΖΪ³bύΡjθGφ£σή₯ΫΪΫκ‚;k–,ςΡ’…ζžjώΒE2`ΰkφαΜ£VΩ­g|νΐ΄ΞΤΧΝ�–Yο'M₯ίΘήγ”)SZΪ[―ќΦ{VκԞͺ’Ζ.W±J¬½'iΥνΑΦύŽΎ/Ϊ‘G½WΠϞž½^°*ƒώκu~L € € € cC‘} € €D[€ b΄ιβmΓlΩ³KΞϋξ—³Φ—ϋ~Ϊ#ZΥ02C† %ΟƒΚq«βΖί}'W�^‰Μf¬ƒΐ - _όηΞ“[2gΞ$'Ÿ”½ϋχEͺ2ކΓt›C‡ϋγ TƒdΉsί/Φ·ΫV0ωΩ·w€oQm“†ͺξ»�>««ΰΛ²Σ  mΫ―ΊΪΫΈΓ$ZN+ΔE4hU‘œ9ξ‘³ηΞΛoV·ž‘ PF΄ΏΨZ¦ηdν@…Ξ+bUΊΌ|ω²μΝΤ@IDATΪ΅Λ9ηΨ:¦{?1½&ξ}ΕΧxBΌNβλάΒρ8ωσ?"Y³f‘=V—τρρΊrw ­^³ηΜ΅Ί’λt±υΪΤύlX·Ϊ„Ύ΅l‰Reβτ5S q=ψ`ωηΚUωφΫo#υΩΣcFu{5ΝnέΧj8=έ-i£τ9ΥcZί~ΞλgυO{~ ιλi>ϋr户Χg ―Pœ§Ο‘ΌyσJ†Œw™ϋ G‡ϊ m~ό‰ΗΝ’sκηGϋ@@@BK€ bh]Zƒ €άpoΈKΞ #€ρ" ]b9rΤοXoΌφͺT«ZΩΜ>b”Ukšί:α0CƒΎAΔph7mD ‘άέσjEΝΚΥjΖZε1χ9ΕΦkS«―i7»:¬_ΏAΊ>ΧΓ}Ζ@@@@9‚ˆ!wIh € pc DΌ±�7g‹Δ‡€Vk\ΊxΎιήuΕΚUς£Uy*y²€R‘\9©`u+­Γ_‘Š•«†tEͺˆ¬b+μΡ1X†@bψtΣzI›6­9%νf[»ΫŽ‹!&―M­ΪY ~)φδ“VΨωξTΫΆλ(;?ϋ,.šΛ>@@@@ˆ5‚ˆ±FɎ@@’#@1:jlƒ ‘€D ΆΞΥ«WeΠ[CdΦμ9ΑV ωω1 ;…όΙΡ@bY@_/³gΐΫoΏ]΄bΝΪυβ,„“Χζ;o–ςεΚzύ’%K₯oΏ^σ˜@@@@@ "†βU‘M € €ΐ $@ρΊΨœ* OzσΝΧδ‘|ωδφΫnsŽͺ€}ϋφːaΓεσΟΏpζ‡γˆžγ†u«%yςδ²fν:ιΡ«w8žmF Ρ Δδ΅9p@?©Q­ͺhXzίώŸeγΖM2jΜΨDgΔ !€ € € €$N‚ˆ‰σΊrV € €@ΨD ›KEC@°ΠPНwή%�Ύ GŽ Λs Ρ € € € € €„ΊAΔPΏB΄@Hδωζτ@@@@@@@ Ρ DLτ—˜D@B[€ bh_Z‡ € € € € € €\O€ βυ„XŽ € §γ”—#€ € € € € € €q.@1Ξ‰9 € €@D#�a € € € € € € ϊC�ΡB@@ Q DLΤ——“C@@@@@@@€ β p‘9E@@ ”"†ςΥ‘m € € € € € € €ΐυ"^߈5@@βP€ bβ²k@@@@@@@ "Ζ2‡@@.@1Έ K@@@@@@@p ˆW‰6"€ €‰X€ b"ΎΈœ € € € € € €άoˆΛΜI"€ €‘+@1t― -C@@@@@@"#@12J¬ƒ € gγŒ–#€ € € € € € €ρ"@1^˜9 € €@0‚ˆΑdBo~ϊτwΘ©S'εκΥ«‘Χ8Z„ €Δ‘@ϊτιεΉsKΆμΩΜ}Π‘#GeίΎ}rθπα8:"» e^=»Λ£ Θί/J«ΆνCΉ© �6}½δΛχ°dΛ’ENZ�w8pπ μήύM‚΄…ƒ&œ@8½NͺU«"M76Xύϊ=?νM88ŽŒ € €„ΉAΔ0Ώ€4@w‚ˆ‘{“&M*΅κΦ—Œξ–)SH’$ILc―όsEŽ?&LŸ΄ρ7ί|³”―XΩϊΒώIbύ;αΌL›ίP|τ "~ωεW�’΅§ς™Ά·Ηsέ€e‹ζ^MΏ^Q«ΒεΙ“[.\Έ(ΓFx‚¦^;ΈΑ&*”/+CήϊοJί~ϋ,^ϊ‘όϊΛ―’ΩͺŽXΆlΡη%AΔΠ}bψ/Zݎ?V€˜ΣΰŊΙθQÝiΉ^1œ^'>ZΐzO/oΞo�”©VDυB`@@@ΐO€ ’ 3@@βS€ b|jGξXyzΔͺjXΙ¬|ήϊβ}Ϊ”‰’_FΉ­v¨]ΧΉ‡‡σε—r*šY_ϊ[Ύόόsy΄`!Ήι¦›$\‚ˆΪx­ˆ¨•έAD·γ €$~­[6Švs¬χ0mΪw °ω.,Ι¬{’­Ϋ·ϋ.2Σ  Lˆc<ω™ιDΤϋΧ2ε+9έ3/_ΆX²dΞβΥΪλ½VfBζΜϊPςδΞe$Άlέ*:wρSΡ ›7oφ[ƌ„π "j‹ϊτνo₯:ώΖ«₯Z΅*:κ Χ ":+2‚ € € pC DΌ‘.7'‹ €„žAΔΠ»&ν:v–tι�™†M™τžœ:y2RΜηR¦lΩΉc«μΪΉΓlσL·ξaDόσΨ1)k}Aν‚5  έ˜•,Q\rηΚ%wάu§άl/Ož:%?ο�YΎψκ+1r΄{Wrί½9εε_0σŽώyLžxΌ°άvΫmςγž=2π΅7€qΓ†RΊT Σ-φή}ϋ₯g―δΧΏzνC'ςηDZ5o&χίŸdΙ’E�\Ή"ϋώEΆmΫ.C‡π[Ÿ € 9ύ¬^8�Yω°UΊr՚‘ΫΠZ«ϋ³έδ‘Όšυ3dΈK²gΟnΖOXχSϋ­Οuχ0aβd'Δ¨!Ÿ:5kΚ+(wφμy²HSez—υÎAƒ†HΏΎ/› ŒW­Οϋν;wJ—�Ο9»Šξ1X# κΧ“ΊujIVλžBουΎβΤ©ΣςΣή½ς‰Υ₯ξ‚E‹έ«‡ΝΈDΌdUψNš$‰$Ož\†%“§N³<’Σ¦šsΉpα‚€J•ΚŒ "Ž:D’&χξvψο‹KΟη=χtΑ@τ^±}ϋΆR�Liɐ!ƒ©8�m9yό„|΅{·ιΪvηgŸά<�I©R%eδ°wLϋ5΄[�b'δπ€ΜμΥγ9)X° δΜq\Ύόyώ�΄oŸL˜8IvοώΖk‹Ί΅kIΥ*•Ν<χλΗk%k❷ΛνΦύυΉ η½^+φz΅k֐J•+ZχεχJ†»ξ’3gΞΘ>λυ©•η/Xh―ζχh�_ωW^z₯―.TΠΊo/%… ’Ϋn½Υό`Λ–­2dθ°(;ψ,gΈƒˆφkaΣζ-ςt—n¦›7¬“[nIgUύοu(ˆ˜― _·jΩάΊ–χIϊτ·›φώυΧ9tψ°lή²Eƌ}7 δσ={HΆμYύ– 2<ΰ�½tEϋ½VŸWƒ‘NOuόδ“lVZY�›οΎ•ώ^ ZQQ_/-š6‘<�Λ#©­χ›ŸώYΆοΨ)Ÿω₯T―VΥ΄%’γϋ5– € € €@ D Α‹B“@@I€ bθ]νg{TJ•,aOϊ=ž;^Š Ύάoƒša[Α? U>ρψc’]7nΦB^zαyiΤ° ‘}ωΥn)^¬¨iΉo1}ϊτ²~ΝΚ€g•―@‘€σν™ϊ<�ηS°!XΑpΉ&/<ίSš4ndNΟ\ vΎξω3f±£GΙ֏j ΨςΞ0™5{޳ΈΉβκΥ³»™^Ήr•τμύ’³ΜΙkgΞxίLjM―§=h0τՁύ€\Ω²φ,ΏΗˆΊ~ε₯LhW7š;oΎΤ―WΧo{ρRŸΎςΡG\Š3έADm·£/]Ί$%K—“"V(zθΑ¦Ω-[.Υͺz‚ ΎAΔ„xhQÁ ΝZΆς ΄κϊΛ–,4Bίm»X?€Ϋ°q£οl3ν~―=xπ`ΐνυ½¦tΉ ~Ϋ7nΤPž·ž»Ι’yš}WμόLW+@ω©οl¦@@@° ˆ6—І"€ €‰S€ bh]Χ[­JmΪ?eυύ·ίΘ‘C%ί#¬κιεκΏWεœΥUσχV₯‡ΫΆFͺααDμψΤΣ2ώέ1ζΌ~ϋν7©T΅†sŽΧ "ώϋοΏ¦ΛΖ½ϋχΛ1«’’~±Z±BΣ₯£ξdύϊ �υΉfξ ’VŽωꫯ呇”)R˜εxψΚϊ2�Β΄ICHZuωΙ'ŠXέS_–ΗŸ,nΦ ·?ξ βθ±γ€_Ÿ—EΟ³jυZ2uςS₯πγε+$UΚRΊt)szΎADΩΏί+’<™ηωP¦L)IkέwιQ±s§ŽςT‡φf=½~»¬ϋ5½†)S¦’|VX5_Ύ‡MEL½uαtM†ΏσΆ”±ͺ=κ ΑX ΘFvςΦ ©PΎœY]+!�^³Ζtuώ@�¬κˆ9Μ| #V­^ΣωA 7mXk~Œsώόy’¨�σ�Žœ4eͺWurwPŸ6m’ύϋ–lY³JYλ<’Z]­λΰ²33­?ξννy§NŸ–~ψQώΎτ·ό/OSa1œƒˆΔ9όσ>3`ΰkRδ‰Η­�”ύ�Ρ3g›χ*=χ@Fρω:Ρ6l�t“SΙt―υž¨βγǏK–L™₯xρbrλ­·H° ’ώ°K«Κλ�‘‡κ΅‘ "κvG•ΝŸn•tiΣZαΦ2ΖLη³>/¦Lυ„auZ�oΈlιbη3eΏU q‡U ρξLwK)λGjξ ’[ƒq@@G‚ˆαxΥh3 € ˆ"†ΦΕΜ•;ω²O[υ»υeS¦Μ™6πΨ±?eϊΤΙ—Ήg†SQΏHž4α]«‹5Oe›~ύΚΒΕKΜι "κ—JM5 ψvŸ¬ΥoζΞώΐtΑ§ΓG ?aφε"j$­†Τυ™Ξ��m³|ώΒE’_ϊ΅mΣZΊuρ|1έͺm{ωά θ°|ΩbΙ’Ωσ₯ΩτΘΫV₯{ΠξηϝeΎΣ/W›4oiͺώΨΛyD@Θ Όρκ@SΜ½φΡ?�4?ΨΆ}‡|όρrηGξuάγΪeθΨΡ#Ν¬I“§ΘˆQž<ΈΧ±ΗέAΔg{τ’΅kΧΙ΄Ι₯@όf•^zY40§ϋΣύj@«ΠcEμ͝ǨS7r‡εU΄Σ£*X@V�Zγ#œFάAΔj5jΙ†υkLHΟΥ�€¨Α£:΅jDDtŸσ”‰¬�„ ˜YnjαcΔΘΡ’‘8χ ‘΅T©S9χxφ²pΊ&³>œ!ZέΜκπό /Ι'+WŽ΄ΟΝ~ΤξΟηΝ™eͺΓi7ΰݞν!7oΆ›.³΅λlτ~\οΛνaάΨQRΤͺ�§ΓK―τ­�ημk�σͺΧ¬λά£λ1ηΞiBŒzΜV·Ϊϊ:³‡Υ«Κk˜Ι“Vex­θ;ψΧ[•σ^|ρ―χ­lΊnέzΣ5°οφ‘:ν�ˆX»n}yΝz�Λϋΰ�Μs3υκ ,ΎφΖ ™3w^€hΓ隬Yυ‰άuηζΌΪΆλ(;­ͺ‘ά],oέΎ]|«BjΠP‡:ών°T�ZΣΩmΝκΥ¬ξ•ϋ›i v΅‚€φΰ§i΅Ρ†›Ω‹LΎΪ•―ϊΪΥ οΰξ�W·΅+–ΪλΉƒˆZUΠΛ–―d/ λGί b©’%₯[ΧgΌΞI»34ώX"Fχuβ�zδ#RΎ²η�?^ŽδDt‚ˆ}ϊφ—ΕK?rŽ Ÿ[·l4ΣΎΟ=wν:wν’έ=lΩΈN�₯KgfDtΛ0Ž € €α(@1―mF@‘AΔΠΊ˜%J—±*ΌxΊΤ–νΩσ£,[²ΘidΆμΩ₯^OψνΚ?W¬n»†8ˍ„[QΟαΓιΣ¬�’σšΣιω|oS(XEDϋœυ Ρ�₯JšξύξΌγIš,©Y”!C{Ρ/οΎύφ;― ’]έ¨\Ω²2tΘ`³�]‰Ρύ¬έ½›ϋK[]ωχί~7ΫΨέ6κDΖ»3:έ‚-Z²TϊφσTv1+ς@’$ U�jΥ¨au‰όˆάtSrΏmΧ¬]+ΟυxήoΎΞˆJ(Π]±HΡ¦Κ–;tXͺl9qβ„<Ϋ­‹΄iΥ�Ϟη>xTŽ©ΫΉ«ΐi5εO·m“M›ΆXέHο’=?νuο:,Η}ƒˆξ›žΠ’₯Λδ•Ύύβ$ˆ8p@?λΉSέΈ]ΌxQV―^+Ϋvl—νV—¬GŽ κNΧdυΚε¦+b=™v:Ɏ;ƒž—{Ασ={H³¦ž�SΌ1θ-™5{Ž{±�tΣzIkuy¨ϊηΆ-›L•>νB\+jΧΧ:τλϋŠΤ­]ˌϋV‘t‡Mu…@χΡΪU�=ψΝtΎ;ˆ8aβd5f¬½zX?ϊϞ;'+>ώΘωΪΑƒ₯jΪβώΏHlUDŒξλD«΅�_σ_N}ΏZ½zμ°ή»μJς‘½(Ρ "–―TΕοuόιζ ¦Ϋφ}ϋχ[?BkΰήξB:Xwβ#G uΊh&ˆθ°1‚ € €a*@1L/ΝF@‹AΔΠΊ’¬.�J]λ†L»,m})rυκU―FΆΆͺάvΫmfήd«+γΣ§O{-wO„cΡ]‰π»οFMšI° ’vΝ“6ν;z�£Ε $»Uέ]mη‘£z-χΠτ:|ΨkΆ;ˆ•�¨½v‚‚ˆujΥ” <�/μΫ―Ώ©•#&―“ εΛZέΛ·“άΉπ“Υ@b‡NO›�ƒω-t͈jQ¨—Ώΰc�=xFέ•νΚ’ΎΊύ "ϊκ0 € €α&@1ά�νE@™AΔΠΊ iΣ¦“φΦy:œ:yR¦LzΟ―UͺU—άy<•OΆlή(;Άmυ[Ǟ�ADw—xŸ}φ…Υ]uϋ”Δώ"T«!�\ΎΜtƒ|φμYiΥ¦_†Z-±P‘‚fΫΨ"vlίNžξό”Ωί{&Ιθ±γœv1‚ €ρ'Π­λ3�Άu+sΐ•«VKΟη_π;Έϋ‡“&O‘£Ζψ­cΟT1>ƒˆv;4TΎ\9©\Ή’W•D Zjΰ2ά†@AΔ@ηWADχ±΄ΪuεŠ€ΌVΤ΄ͺφΩƒ]5۞φ} εkβξbΩϊΆ?Πtί>/K½:΅Ν"»ς·οzv¨+XθK»εՐΧ?�ό#ΕK–‘>―Ό,U¬η­―Ύώ¦Μ7ίk—γί#EάΜ‹J7�ƒˆφ½½{yΈŽ»ƒp΅λΦ­ˆhˆ« ’ϋXΡ}θ�͊-*Υ«V‘όωqΊ•ή΄y‹<έ₯›ϋ~γqDΤƒνάΆER€H!Ϊευ“ΕJϊδ°w€T)Ο|‚ˆ~<Μ@@@0 ˆfŒζ"€ €‰M€ bθ]Ρnέ{™/n.^Έ(γƌπk`ΓΖM%sO ysfΚΑόΦ±g„kQΫΏlι"§�‘}>ϊh [έXOš8ή,ΪΌεSΡ/άƒVKZaoΉ%™mYι�ΰՊˆZρcΘ[ƒΝώvμά)ϊ%* €ΔΏ@έΪ΅€_ίẂΧ�]'ΟφθεΧwqΦμ9ςΖ ·όΦ±gΔEρzΗ΄μΡ]νn‘ΥΝiί~‚­²σC)ˆθFZeέ#fΌ;£™Υ§oYΌτ#χβ γ‘vMάΟqνΉ’Υν‘#GƒΆί^Π‘}[Ρπ— / #Ί‡{²ί#KΝ3?ψωσΨ1)[Ύ’{±οσΚKRΏn3�έ·oΫF�¦M+�ύ·”*Sή―‚ηΛ/Ύ Τ3λϋ�ŒŸ0ΡoŸΧ›A±‰τκΩέ0½ώζ ™=g^P²ΘvatΦ‚θΎN5l ZωT‡Φ�U«Υτ‚ˆ‘wM›6o%2zΎ;{¦:θ4μςlwIžό&ΣπCί­Rlη ’ϋ ,χωΩAΔ�εΙ#³gzΊŸ;aUΤ/<έƒ;P σc#ˆ¨U_>YΆDR¦Li¬+; A-ZDV�Zγnγ € Iν:vηΞΟ‚v5;sΖϋ’7―§Bt°*ΕZΙnαόΉζˆ»w-ΝZΆztχ}CLΊfŽΚ1΅1zo‘:U*Ώ.hu™;θ΅dι2y₯o?VCBυZόρΗΏ@œ.°ΊΎ�ΎϋŒeΟή/ΘΚ•«Χp»&3?˜.yόŸi�—_~%žξβwΞZmό�₯ΛςɊ•f=w€ράωσR΅z-9qβ„cΠΏ_Ρ�uViQ«ή½?e’³=’]*wλήӞtέ?θ9}ϊ/©Y§žΧ1ν³fΙb~Œ΄uϋv{–σH1φƒˆΡ}θEΡχΰoΏύΞΉ>φH™2₯eψ;o›Ι`έ!Ϋλκc\ϋχ{Εz>Χ2‡άΉk—΄mο©p―3Z΅l.ݟύ―b#ADΓΔ@@c‚ˆa|ρh: € "†ήUΜ•+·T­αω’δς₯K²pΑ\9|θ 6j�LξʐΑ4ϊΔ‰γ2m²w%‘¬Y³IΦlٝ“zμ‰"’,Y2VάΎυSgώΑƒΏš}:3hdχ»œ#Ϋ_ϊ;3¬‘Υ+>– ΧΞמouϊσΫ,—δfΡ†M›dΩ²εrϊΤi©Y³†Σ5œ½]lu_ξ/Κ΄+:νvN»ϋλΜ_’={vy¬pa©huω—Κ )ZΒο‹`»=<"€ €@pm[6IκΤ©δΨ±γ²jυjΩσΣ^3ž%KfiPΏ�ά›3§Ωψί�•&Ν[ Γθ ξ{…5kךPΥ™3gΜΆΫΆοt‚P±DŒΚ1u]­§η³λ³Ο¬Ψ*ωiο^I“*΅*\P7lh t½Χή$sζ―~¦λ„βAD½·�ϋ*{θύ|Ρ°š=ŸοmUΰ»l/’ 7:γσζΜ’μΩ²ΚΊυΜό_}ώ”,^\ͺW«κ¬WΎR―*‚αvMά‘/=©ύ?�,+¬η�ΎŸχKΦΜY€LιR’/ίΓ²ό“�ϋΕ—σž3λCΙ“;—™>tψ°Œ3ΦΊώKΚW(λ„ΆtaΗ§ž–@‘@]φρG‹k‘Σ:θ5 φcw•> #N±Ί�rχn³έ}χή+eΚ”2έ7�jUΡ«YΫS=Ρ,Όφ‡ bπ b|ΏNμ`©>ί–~τ±|g/ό}Q ( uκΤr*Ϋkψυω^r_FΙυΐύ’)Sfg^έΊ΅€T‰fϊύι3dη�ϝe?όψƒσϊόΰύ©ςπΓ™�Ϋζ/ψ˜³Ž=bw'ώϋoΏKE«:¨=θϋΕ’Eσ�7~ύυ7’υοΞt·Τ¬^ΝιFZΧ'ˆh«ρˆ € €α*@1\―νF@‰AΔΠΌMš΅΄Ί‹»ΫiœV=Lš4©ΧτŒiSεψρ?y:RΏa+ˆ˜Νk^ ‰Ώώ*σηΞ ΄(^η]/ˆΨ¦UKyΆ[―6ΉƒˆΪ5Yσ¦MΌ–›ˆ­ ’ξΖ΄)ζ έ`Η²ηD΄%xD@ jvρz[Νψ`¦Ό5䝠«Ή« ϊ�τζΰ·eζ¬Ωfvl#{L=°»»ZίφΩΣ?�ςKΐP–½<”c#ˆθΎ_ΌήΉΊCpDΤΐSDΓ‚E‹€�€ΧΌV Ηk�ΌYSyΞΊgΆ γuBΧ&|ƒˆE‹‘αΓ†HŠ)­nζ­ί°QΊZΥΨƒ έΊ>#m[·rkΈ°x©2Ξ΄οˆVί{wμɘΡσΓ*ίεφt°ηAĈtX† € €α @1�mD@±AΔΠ½Έ5jΧ•œ9ου jkϟ?'‹Μ·Ίšϋέ―ρυ4’lΩορ›ο;γΧ_‘s=_Όϋ.‹ΟιΟvl“›nJnuwI =ώdΐCo\ΏFn»υV³L+–«XΕ©^€3_zαy©W·ŽΧ―ηΟ_°*s,³*δ\”Ν›‰VKͺί°±©¦TΈ`A™4qΌΩŸ]αΕέ΅œέέ²»λgί.ϋtc IΆ±ΎΠΊε–tf_ξ?ΏψU6lΨ$C†wΟf@") Αͺςe˘κWZέΩwΠ n&L’…‹—ψ.ς›nΫ¦΅T�TQ2ZU–o½υgyΏώνŸξό”tlίΞΊwψ[ ?QΤ¬Σ©cιτTΉtω²z¬ˆ™ΧΊU +πΥUτž€xΙ2A+G昺ΓjΥͺHΛζΝεϋοσ»ηΣch•Δ!C‡yέϋ˜†„ΙŸ₯‹ηΛ=Φ½ιαίKεͺž�~5}Π―›jΦW�\‘²*{οŽ­›%eΚ”6σ›ηιuͺT‘ΌdʜΙo½Ώώ:#peUτΒυšhEΌη{υ°ͺ…ζπΊ/ΦσΫ·ΏŒo’Σ5³}ΞzΏϋζ―:Fνωϊ:˜ϊώt3φ]{VΐG½ΆzνaΡ’₯�·ί{2ΰcšΤ©ε₯{KEλΪά|σΝ^λ華Ύωζ[ωθγε2kφ―e:ΡγΉn�²Es―{{Ώ•ΒpΖ€ώ}₯ΆUΡ]ΟΏZΪ»jΧΣͺ[§Άτλγ©j©]΅k—νφί― ωΎΨ»·υΧο:j›>�ό >j΄hwαΎΓΔχΖ™*ςΎσMO™ϊΎ 1�,š4α])\¨υ�α ςDΡβ~«/_ΆX²XU@΅Jc­:υύ–W©\Qš7k&XmΏω¦›ŒσΦ­V…}k\ύu°Όζ·13@@@0 ˆ&Šf"€ €‰U€ bθ_ΩlVwΏ9ο»_ΞZέξϋiœ>}:τΟ-Τ/4σζΝ+2ή%ϋφξχ«Ί—Νъ.yrη‘tι�Θ‘?ŽΚCξΓβςΈμ@A@?γ³[χBοΞ(iΣZŸ΅ΏI”Ÿ΅zžδz@2dΈK’[ΑK Zκ=ΝΉσηo„Λ§η¨χj˜ΛαNΉxρ’°~0’]}_oηk’?²Ιš5‹œ<~R΄›c}>E4€OŸ^zπAIkέΟξέ»/R>ν/²ΛτΊδΞmU­L’Δϊ‘Υ<η# λEχu’MΙ›χAΉλ�»Μ{τΡ#ZΟΉ_Cώ�CϊϊΆί_ΗΏ;Ζt �ηRͺl― ΄Ξc@@@ΒI€ b8]-ڊ €$B‚ˆ‰π’rJ € € € `4x¨ƒ>4֟¬Y²Θ’EσMΡ3Φ�Š–(m/β@@K‚ˆayΩh4 € x"&žkΙ™ € € € €€·ΐ·I‰βΕdγΖMς©Υσ±cΗεž{²K›Φ­δŽ;�›•'M™*#FŽφސ)@@@ Μ"†Ω£Ή € €@b ˆ˜Ψ�(ηƒ € € €Άΐ;o–ςεΚΪ“~Ϊtυšuύζ3@@7‚ˆαvΕh/ € Θ"&² Κι € € € €€#Π°A=©W·�άί½’,Y23�ί�•£G�”5kΧΚ ·†8λ2‚ € €„³AΔpΎz΄@HΑEδ@@@@ΰΊιΣ§—Ϋo»Uφν�ωΊλ² € € nΓνŠΡ^@@ ‘ DLd”ΣA@@@@@@N€ β wΙ9a@@ ΄"†Φυ 5 € € € € € € €@T"FUŒυ@@bU€ b¬r²3@@@@@@@ ή"Ζ;9D@p Dtk0Ž € € € € € €„ŸAΔπ»f΄@HTΥεδd@@@@@@@ΰ ˆx^tN@%‚ˆ‘t5h  € € € € € € u‚ˆQ7c @@X ˆ‹˜μ @@@@@@H‚ˆ €Ξ!@@ώ ˆψŸc € € € € € € €@8 D Η«F›@@D$@1]LN@@@@@@nH‚ˆ7δeη€@@Π ˆ:Χ‚– € € € € € € €Ρ ˆ5ΆA@ˆ5‚ˆ±FɎ@@@@@@@ ˆ˜ μ@@ΐ ˆhK„ώcϊτwΘ©S'εκΥ«‘jlͺΤ©%Y�drφμ™H­ΟJ € € € € € € žΓσΊΡj@@ ΡD έK™4iR©U·ΎdΜp·€H™B’$Ib{εŸ+rόψ1ω`ϊT―Ζ§»%+QJrδΈWnΎωfΡνuΠΰβ₯Ώ/ΙΆ­[δ‹ΟwymΓ € € € € € €„ΏAΔπΏ†œ € ΦCσς₯M›NšΆh%©­ͺ†Α†aC{-zκι�’*U*―yΎΏύφ›ΜώpΊοl¦@@@@@@@ Œ"†ρΕ£ι € €@b ˆšW±Σ3έ$eΚ”¦q—/_–ΓΚoΏ–4i�H–lΩδŽ;ξ”αοΌεΥψNO[Ϋ€J)�όσωγw9zτˆό}ρoΙ‘3§ά)³³ξŽm[eΛζΞ4# € € € € € € ήΓϋϊΡz@@ μ"†ή%ΜϋΠ#R‘R%Σ°σηΞΙ΄)εβΕ‹^ Υn—΅ΛeχP―A#9zδΩΈa½{Ά/U¦¬x΄?wξ¬Ό7nŒί:Μ@@@@@@@π ˆžΧV#€ €‰F€ bθ]Κv;KΊtιLΓ¦LzON<+μΦ½—h€ρΚ•+2rؐXΩ';A@@@@@@„ ˆ˜πΧ€ € €7΄AΔΠ»όΟφx^’$I"§N’)ΗΗZ β?Vq8AΔXƒeG € € € € € €$°AΔΎ@ΈΡ"†Φ3ΰΦ[o•6νŸ2ϊώΫoδΠ‘ƒ’ο‘’>}zΉϊοU9guΥόύwίʎm[£Τπ,Y³JƒFMΝ6±pŒRCX@@@@@@b]€ b¬“²C@@¨DŒŠVά―›+w©Z½¦9ΠοΏύ&™2gxΠcΗώ”ιS'\hf»$έ-·˜EŸνΪ!Χ― ΄σ@@@@@@@ "†αE£Ι € €@b ˆZWσΙb%δρ'Šx5κΤΙ“rτΘI&dΞ’E’&Mj–υεη²vυ*―uM”.SNς?ZΠ,:sζŒL?6Πj 6/MκΤ’"eΚH�ο‹εάωσf}­•αΔ‰1Ϊ.!ΪΚ1_aϋy€OΔ>Ί4Ί―“θΪFw»„h+ΗTΐ]μΉΆOB<ίγϋ5­ηΜ1ν+ούΣηAB<8¦χ5΄§Έ―°%?Ϊ>Ί4œήΒ©­7Κk3œ�IΰWs@@@Π ˆΪΧ‡Φ!€ €‰^€ bh]β₯ΛHΑ‚…FνΩσ£,[²Θ™Ξ–=»ΤkΠΨL_ω犌>ΔYhδΎϋκ5kK’$IδκΥ«ςώ”‰r� 6†Κ _D­[½Β΄/²mϊσΨ1)[Ύ’τοΧGκΤςTŒμΆo~[Μ=#oΌ:0²›˜υV­^#=zυ–Ε ηIΞ9’΄mυšuεα|yγύ˜­[·ˆ–ΟŠ•«βύšΔδ˜αtM’ϋΓ"φαž?ΈOL_›αφ\‚% € € €@θ D έkCΛ@@B€ bh]ζ J©�εL£�\Ή"£G 5Bw+[·λ(·έv›™5yΒ»rϊτiχbgŽRSNYη[’TYμ«V­J”Ά2tΈœ΅ͺBjΨ *Γϊ ₯λ³έεγKV«*eT†z ΙCyσΖϋ1[΅h!ΡρY±reΌ_“˜3œ�ItŸ―Ώ9ˆkδE—P―Νp»&ΎŽΞϋο—AžxΦlύ<‰Ι{Χ$Έ­~nς±Ot?Oβ^&άή/Ή―όά‹ιύ7]unLοeΒιύ2άξ+‚_5– € € €‘+@1t― -C@n‚ˆ‘u™οΙq―Τ©Wί4*X7Κ΅λΤ—χήkΦY΅byΐpαν·ί.ΝZΆ‘δΙ“›υΆmέ"[·l­“½Φš§;?%Ι“%‹tΫNœ8)Σ?ψPŠ}R >Z �ΫιŠΛ?Y!ηΟ_ΊujEi»―ΏύNΦ�]' Τ“»3fŒτΆW―ώ+“§L½ρ}ΜςGΛgΟO{%Ύ―ILŽNΧ$&Ο�Iΰ—]BΎ6Γιšπ~ψωcΏG‡Σϋ%Ÿa―₯ΞΥΟψ˜|žDχu“cςψzΖτ^kΨUηڟ›|†6²}Βι΅ΙgXΰkiΖΗδώ;πž™‹ € €„ΆAΔΠΎ>΄@HτCλ§M›NΪ?ΥΩ4κ”Υ…ς”Iοω5°J΅κ’;Οƒfώ–ΝeΗΆ­^λ€I“VZ·m/7έ|³™Ώϋ«/eΝͺ^λ0 € € € € € €‰G€ bβΉ–œ  € –Cο²uλήΛt§|ρΒE7f„_6n*™³d5σηΝ™)pΦI‘2…΄mχ”€H™�ΜΫσΓ²ΜκN˜@@@@@@―AΔΔ{m93@@ ,"†ήejΪΌ•dΈΦύοάΩ3εΠΑ�‚†ΪΪ.Οv·Ί\ΎΙ4|ΔΠ·εκΥ«f\η΅νΠQR§Nc¦ωyΏ,œ?׌σ@@@@@@―AΔΔ{m93@@ ,"†ήeΚ•+·T­QΛ4μς₯K²pΑ\9|θ 6j�LξʐΑ,;qβΈL›<Ρ9Φν:Κm·έf¦/YΫ}ώΩ.g™χΘΏ²uΛfοYL!€ € € € € € €@Ψ D ΫKGΓ@@Δ!@14―c“f-%γέw;Σͺ‡I“&υšž1mͺ?ώ§3―λs=%Y²dΞtD#ή+gϞ‰h–!€ € € € € € €@˜D “ E3@@Δ*@1t―lΪu%gΞ{½ˆΪΪσηΟΙβσε?~χj|Χg­ bςΘί7FΝ;λ΅= € € € € € € žΓσΊΡj@@ ΡD ύK™-{vΙyίύrφΜΩχΣ9}ϊtθ7š"€ € € € € € €@Ό DŒ7j„ € H€ b ζ!€ € € € € € €α#@1|�-E@₯AΔDyY9)@@@@@@Έ"ή@›SE@BQ€ b(^Ϊ„ € € € € € €D^€ bδ­X@@ "Ζ*»D@@@@@@βQ€ b € €@¬ DŒUNv†ΐ�Ϋ΅c$‡A Š‚Ύ�©ΈTRj 4|¦£έ3τ(| @€ @€ @€Ό. D|ά… @€O!βSΓ� @€ @€ @€Θ"ζνΜΔ @€£„ˆG­Σc @€ @€ @€h( DlΈtO&@€μ$ Dάif!@€ @€ @€ @€ΐ�BΔ�͜ @€X( D\ˆι§ @€ @€ @€ P D,›™ΝiΓIDAT@w% @€ΐ- DΌ-όG€ @€ @€ @€D!bβΦΜL€8H@ˆxΠ2=… @€ @€ @€–BΔ–kχh @€ΐ>BΔ}va @€ @€ @€ŒGԜ!@€X& D\Fι‡ @€ @€ @€ P" D,aw) @€ΐ% DΌ$ό%@€ @€ @€ @€@¦€1so¦&@€# Dα ‘“pcšx‘μ›|X`<θ„Β49§3nY=π`άςCnœ‰›| τΔΖ‘o¨εh"Wf�-χ?rψͺκ;Š+₯ £QΎ©ν€ν1Δ’¬ιΧRǚ>TWΞΠΘ·ώ9_UZŸ‘ίZb‹±ύΨiμ8v;„5vkΒZ±ΓJ<΄ŠͺVΡ ·8U<ِGό?žΖ§²’rΧ:Χn׏κ±|a‘ςύ8Σ₯3eβLQ>‹ ίόBWΒ9‚εζκζ €ς;’~M½bͺΎσά]ή1|J‘2σ‹Žg ΐΑG0ή|ΡYΏ„Ϋc‡Ϋω YZ‡+; Έ£Œ9°07ΰ ό@γ@ H)`*¬²�g˜fƒ ”`-¨›ΐ°μϋ@#8Žƒ?ΐyΠ�€[pυtg Όύ‚:Β@Œ ΔqFάo$ E’8$IC2 ’@f#‹2dR‰lFj‘_‘ƒΘqδ,�ά@ξ!έΘKδŠ‘4Τ5CνΠQ¨7ΚF#Ρt š‰ζ‘Eh1Ί ­@kΠ]hz=^A;Ρgh0-Œ‰Yb.˜7ΖΑb°T,“as±R¬«Ακ±fψ?_Β:±μ=NΔ8 w+8OΔωx>_ŠWβ;πό$~ Ώ‡χ⟠t‚)Α™ΰKΰ&2 3%„rΒ6ΒΒ)Έ›ΊoˆD"“hOτ‚»1…˜EœE\Jά@άC φ‘H$c’3ɟCβ‘ςI%€υ€]€£€‹€.�;²Ω‚μF#§’%δ…δrςNςςEςcr?E—bKρ₯ΔP”™”ε”­”fΚJ₯ŸͺG΅§ϊS¨YΤΤ j=υυ6υ•–––•–Φ-±Φ|­ ­½Zg΄ξi½§ιӜhΪdš‚ΆŒΆvŒvƒφŠN§ΫΡƒθ©τ|ϊ2z-ύύ.ύ6C{€6W[ =O»J»Aϋ’φsŠŽ­[gͺN‘NΉΞ~ :=Ί];]Ž.Ow�n•ξAέkΊ}z ½Ρz1zΉzKυvκΥ{’O�·ΣΥθλoΡ?‘�€1¬Ÿ±ˆ±•qŠΡe@4°7ΰd”μ6h3θ5Τ7c˜dXhXexΨ°“‰1ν˜\fs9sσ*σΓ0³aμaΒaK†Υ»8μ­Ρp£ #‘Q©Ρ£+FŒYΖ‘ΖΩΖ+ο˜ΰ&N&Lf˜l49e�3ά`Έίpώπ�αϋ†ί4EMLγLg™n1m5ν337 7“š­7;aΦcΞ42Ο2_c~ΔΌΫ‚a`!ΆXcqΤβ)ːΕfε°*X'Y½–¦–– ΛΝ–m–ύVφV‰V ­φXέ±¦Z{[gX―±n±ξ΅±°o3Ϋ¦Ξζ¦-ΕΦΫVd»Ξφ΄ν[;{»d»ννžΨΩsν‹μλμo;Πςj.;½³78Ά;‘NN"§*§ Ξ¨³§³ΨyƒsΗΒŸ’5#�ΉΠ\Ψ..u.χF2GF\8²qδσQ6£RG­uzΤgWΧΧ­�·Fλ7zαθζΡ/ݜάψnUn—έιξaξσά›ά_Œq#³qΜu†Ηx=Z<>yzyΚ<λ=»½lΌ�Όͺ½�yxΗz/υ>γCπ φ™ηsΘη½―§oΎο>ίΏύ\ό²ύvϊ=k?V8vλΨώVώ<�Νώ¬€΄€Ÿ:-y5χƒ¬ƒAΫ‚³ΩYμ]μηΑ�Α²ΰΑo9Ύœ9œc!XHxHiH[¨~hbheθέ0«°Μ°Ί°ήpπYαΗ"‘+#�qΝΈ|n-·wœΧΈ9γNF�"γ#+#οG9EΙ’šΗ£γǍ_=ώv΄m΄$Ί1ΔpcVΗά‰΅Ν‹ύ}qBμ„ͺ βFΗ͎;ψŸΏ3ώMBpΒς„[‰‰ŠΔ–$€ΙI΅Io“C’W%wN5qΞΔσ)&)┦TRjRκΆΤΎI‘“ΦNκšμ1ΉdςΥ)φS §œj25gκαi:ΣxΣφ§�’Σv¦}δΕπjx}ιάτκτ^>‡ΏŽ�L$X#θϊ W gψg¬Κx’ιŸΉ:³[(*υˆ9βJρ‹¬ˆ¬MYo³c²·gδ$ημΙ%η¦ε”θK²%'§›O/œή!u––H;σ|σΦζυΚ"eΫδˆ|ŠΌ)ίΨ[Šχ  ͺ ήΝHš±ΏP―PRΨ:Σiζ’™‹ΒŠ~™…ΟβΟj™m9{Αμ{sΨs6ΟEζ¦Οm™g=―x^Χόπω;Pd/ψs‘λΒU _/J^Τ\lV<ΏψΑα?Τ•h—ΘJ�ύθχγ¦ΕψbρβΆ%ξKΦ/ω\*(=WζZV^φq)鹟F�TρΣΐ²ŒemΛ=—o\A\!YqueΰΚ«τV­z°zόκ†5¬5₯k^―Άφlω˜ςMλ¨λλ:+’*šΦΫ¬_±ώc₯¨ςJUp՞jΣκ%Υo76\ά΄±~“Ω¦²M~�|}sψ憻šς-Δ-[mMΪzϊο_j·™l+Ϋφi»d{玸'k½jkwšξ\^‡Φ)κΊwMήΥΎ;dwS½Kύζ=Μ=e{Α^Εή§Ώ¦ύzu_δΎ–ύήϋλ³ύ­ϊγ@i�0³‘·QΤΨΩ”�ΤqpάΑ–fΏζΏό}ϋ!ΛCU‡ /?B=R|dΰhΡΡΎc�c=Η3?h™ΦrλΔΔ—ON8Ωv*ςΤ™?Βώ8qš}ϊθ�3‡Ξϊž=xΞϋ\γyΟσ ­­ώτψσ@›g[Γ― Mν>νΝc;Ž\ ΌxόRΘ₯?.s/ŸΏ}₯γjβΥλΧ&_λΌ.ΈώδF΍7 nφߚ›p»τŽξς»¦wkώεψ―=ž‡ο…άk½�Φώƒgε?v?’?*lρΈφ‰Ϋ“CέaένO'=νz&}ΦίSς—ή_ΥΟž�φwΠί­½{»^Θ^ Ό\ϊΚψΥφΧc^·τΕφέ}“ϋ¦�mι;γw;ή{Ώ?ύ!ωΓγώI+>9~jώωωφ@ξΐ€”'㩎lhF/·@Og‡v¨“Τχ<• κ»© �„ΥwA•x°=€ΔωDΑ3ΚFΨl!¦Α§ς¨žPwχ‘¦y†»›š‹o<„w―Μ 5πI60ΠΏa`ΰΣVμ Žε©ο—J!Β»ΑώJΤΦJίΚΏ(Σ~a,™γ§ pHYs%%IR$πžiTXtXML:com.adobe.xmp 1376 424 ΌςQiDOTΤ(ΤΤΛρo΄’@IDATxμxE†zο½wμŠ?VlΨEQŠ R•* ±н+v± ‚τή{ο5ΰŸo’έΜξέ{so²ίy²»³3³³ο–oϜ“α¬2I…-Y±V·�VΉ|*zaS         H?V�Ω S»z₯T *ΨTρcc          Ψ π’ς”H€H€H€H€H€H€H€H€H€� °ιγ:p$@$@$@$@$@$@$@$@$@  °ΰEε)‘         €`ΣΗuΰ(H€H€H€H€H€H€H€H€H€.@`/ΐ‹ΚS"        H(ΐ¦λΐQ         \€(ΐ^€•§D$@$@$@$@$@$@$@$@$>P€Mׁ£         Έ P€½/*O‰H€H€H€H€H€H€H€H€H } ›>�GA$@$@$@$@$@$@$@$@$pHwlή<Ή/@Μ<%         ‹‘ΐ‘ΓGτiΧ�^)U§Ÿα¬²Ττ°dΕZݜlj(²-         @z"ξΨΤ*Αι .ΗB$@$@$@$@$@$@$@$@$pq°OS«{ϊζ›Ϊ\ά—“gO$@$@$@$@$@$@$@$@$žP€MOWƒc!        Έ P€½ .'O†H€H€H€H€H€H€H€H€H = ›ž�ΗB$@$@$@$@$@$@$@$@$pA {A]Nž         @z"@6=] Ž…H€H€H€H€H€H€H€H€Hΰ‚"@φ‚Ίœ<         τD€lzΊ         ΐE€μu9y2$@$@$@$@$@$@$@$@$@ι‰Ψτt58          ŠΨ κrςdH€H€H€H€H€H€H€H€H€� °ιιjp,$@$@$@$@$@$@$@$@$@ °Τεδɐ         €'`ΣΣΥΰXH€H€H€H€H€H€H€H€H€.(`/¨ΛΙ“!        HO(ΐ¦§«Α±         \P(ΐ^P—“'C$@$@$@$@$@$@$@$@$žP€MOWƒc!        Έ P€½ .'O†H€H€H€H€H€H€H€H€H = ›ž�ΗB$@$@$@$@$@$@$@$@$pA {A]Nž         @z"@6=] Ž…H€H€H€H€H€H€H€H€Hΰ‚"@φ‚Ίœ<         τD€lzΊ         ΐE€μu9y2$@$@$@$@$@$@$@$@$@ι‰Ψτt58          ŠΨ κrςdH€H€H€H€H€H€H€H€H€� °ιιjp,$@$@$@$@$@$@$@$@$@ °Τεδɐ         €'`Σψjœ>|DŽ―Xπoω*9΅}§Δ9’ώ“ψύGΟV¦”DW«,ΡΥ«HŽjU$ΊV5ɜ7£7H€H€H€H€H€H€H€H€H€ώ;(ΐ¦Α΅ŠΫ»_φσƒ˜ω“[Ό,UGΘQ₯’δ½ξ*ΙscΙ‘„Y         ΐ‡X―Υα?ώ–―O•£sψΨkRWΡ΅kH‘‡ξ“‚MoM*δ         @Ί%@Φ‡KsxφΩώΚλrlαRzKΎ‹μεΛJιξOIήΖΧ$_™5H€H€H€H€H€H€H€H€H€Ξ °©@θ°lμϋ’όqV*zIyΣ<Χ\.†Ύ(™ δOy'lI$@$@$@$@$@$@$@$@$f(ΐ¦-Β lθ9@βφ9i₯°»7Λ”'·TΦOΗ‰Mq'lH$@$@$@$@$@$@$@$@$&(ΐ¦λ–aceΧ[ο₯ eΪ5)Ϊ¦…”z¦£dΘ’9νžI€H€H€H€H€H€H€H€H€""@6\gbOΘΪΞ=εποEΠκάUΝYΏΆT2N2ζˆ:wε‘H€H€H€H€H€H€H€H€H€‚ sGόώ²κ±N³j­sG:ΫΚQ½ŠT{{‚dʝ+ŒΓ!      Έ l;'½?ή)QY3ΚKχ“όΡ™"ΒπΣς£ςΧΪΙ™=£ί}P€ 㠜‰‰•εΝ“Ψ5λΓ¨}ώ«δ¬[SͺM}U2dΝzώÐ       όηΜ^{\^ϊr·χŠKνRΩ“=‡¦c6Jόι³rKνάςτνϊLΨ$?/?¦·Ή:ŸŒnQΒήΞJ‹W7ΛχKJ%^ξ›P3œ&η­N'—ιc?pi^y΅uI{]ήέ.ΣfΤΫ8œKZΪΉ>žηŒ}Ÿο>(ΐ&wNŸ–Um;Λ‘Ώ�M�fΊΪŸΏΙ Rqτΰt5&ζΏA ώΠ9{κ”=ΨΜωσI†Μ‘}΄§³•³qqπ°=ͺŒΩ³Ρ[ά¦Α �:ΌγNlά,§vν‘ŒΩ²IΆ²₯$k‘ΒΎŸί₯Ύ#e‡$@$@$. ΌρΫyξƒzloΆ-%MληIvœ–€vMεhωΌK9»>X‘s-ˆžλγΩ;+Φύγ―SΡeΊiJ6™K±©�0Ω3γΣdj₯Οέ₯Ίu”b?rή‡π 1k7H̚urbΣVΙ’/―δ¨RQ�ΛVZ} JλΟ>ηΐksk\)’>„ιhΈδ{›+$@$π_#°ο‹oeΓσύ=‡V,ί₯žΈYH$@$@?ΨΤΒ‘9A °‘3KΛ`ƒΠΕ4μ%·=(πήLEΧ�!Ε{Xςίά8’n Zn5Aώ8+’vξΚ™•·iο>’Lyr»w₯έΆςž\ωθΣrtΞό°‘₯`~©υε{‚?iη—Ψσ˟GΏxœ>zL'wœ{Hz|ΈCΗ'¨κSbθΈGJJγj9-έΗ{zΪ6ωjα9v2©}αά™eZ»�� \G[k,Ÿyo»|€Ž}R Ώ–Aό½ϋ’<2^7s γlωΪfuM;� ’P>xY^ͺ»Ής`μpάίW—{ΖmΤχϊψ³O%©ͺΔpΨ–ύq�U%9›΅κ˜ήΆ~ΰj~y>AΉ*όΕω4 °τ-\*+š·υΨ^¦ΤΓλΥ/;/Ϋ_y]vΌ>UδL�ƒI�5>~[’kV‹€IŠκωk�¬Rή―nƒΈZθξΫ%{ιwΰϊmΆgb³·έ$Ft7ηφ9$@φΒζ‘.j`/κΛοΛΙοϋτkΩΠΛω;³Κ”±’ηjJ& lΒeΧ$@$@$Žψ)ΐN�λ tžΎ]ŸέΜξεε�ςI‚ΤΞUšό&b¬Φόθ-ΙVΊdς•SQγΘί�Κͺ6O₯¨‡Ϊί~ ΩΛ—MQΫpΝoΠXN;nW‡(]�ŸνmχΚΞ)ΣdλˆWΕuώ\ΰ1λe'6l’ƒ*9Ϊρ₯+δψͺ΅‚Šˆ—­B>δ¬[K άr½H¦L^MmwMϋΐή‡„hΕDwΗ«oΚ‘?ώ–Έ½ϋ%“£*W”R]Ϊι₯ΥΰΜρΩωζ»rπηίδ”Κ4IMνŒͺXNβ‘`Σ[­jA—gγβd�·?Κ±EKΥψWΚΙν;u2ΆθjU$gRΰΞ&‚€d~2aψξg9¦8Ε¬^«Ο ‰ί²—--9U\β’­š©PήqW‚ °'7o•ν“ή’γΛWKό‘Cjμ%Ίje)xΟm’λ’ΊΙΫΟσ‡υΡͺ±¬’Ψυ›$CΖ ’­dq‰ͺT^{Z#φ²—…+€ΞUΞ&}Νœ;·”μΪΑΡ-ΌΣwO�PŽΜ/'·lWήέυύ“΅xQΙQ₯’Ό•d)œτ�Ρ8ΔΖΆΡ―Jό‘€―›ωoΎή3™Δ—˜΅λνžς\q©δ»ιφΆ΅‚{p,‹�QM έw§΅i/�ωώψ„ϋζΔϊjϊr}Έgς«~³•Iϊ₯j7R+AŸ­#GeϋΔ7δθΌE l’’€βθAŽη ύθϋυΗ_³€0N%%„·<Ζ™λ’:ϊ ϋ'ζΐΤϊ™'eλπρκR&ό‚ϐ1““![69πύ/²[½υ²—))9ͺVRΣ· ϊ2»?tXΜόIŽ-Y�Η}jχ^ΙZ€δ¨VY?gω›ά¨¦Ζί> ή'wξΦη½λ€€pθο’¨Κτa²ͺgο…”žϋέS?Ψ›ε䢝 ΔiΙRP%TΟ ήY˜mΰe»ίύHbΧm°wΑ“πΌμΰΏΚαΏηΪ»’kV—Bχήao»WRϊά¦E?~½RΚΩ<'pά―ξ£*$Ε)u_d̚E²-,ΩJ•Τοjχμά«{f|’ξι3‚Y'‡gΟ1»Σ‰-­όn΄qϊymΓ}—Zγΰ’H€H€HΰΏIΐ` ¨)χω£“ˆ8©°k*GΛη]ΚΩ'nŠˆ¦켍±rσπ„ΏiςEg’…«8<"!Ίέ>jƒM€ΞάμΈφI�Οwιγ΄QβDBΣ05½ώ «΅x‡ώΧ ―fξΊ>D ΏŸΜ;,Jο“wž(ΰzεΐ΅²ZΕͺ…Νλ_YΚΚͺΧρΓKDDΉ)ˆ†+ΐ"ήkωn+lORS`EŸ°A*LΒθοχκušaζρJ*u‘bkŠΎˆ—ZAυn�ˆυzς*…•Wη6·_eG[„&¨ήc₯φ’EΕƒͺŽΓX0&ΨεrΘΧΟ”w΄…§s΅ηWΪη„k‚ks³ϋkνqΉsL’ψϊyηrr΅Ί·L+ήiΉΩΛΜ" T1wΙVε½ οhxΗήΧ0―τmZΔ±�\nP€uΡ^ύX§€?f\U63fΟ&Υί{]rTw^θ€Š>όι7YϋΤsχΑ₯ά ή·‹€ΑΏ΅―q$`SηϋƒvqZ 4[GNpμ/Ρ±m h₯ήΊ[†Ž·Xαh¨6 vUUΣ/! ΊmΧΤχeΛK£νbˆuϋJ5ΊΓ!ΫԊ5•Ρβ[ξ“31 _εΜ:X‡ΰRmΪ€ *bψ�RχVΌ–‚ξ£J―Όœκ©£ψ#{3ΞΣHμγ>&β–ιυŒ§η%ΐ"†ΰΪN=άέΨΫξΈEΚΏΤ7hό^ΏΞΧaυ]$F‰ο‘,χ ₯Β°~χQ8’ΑιγΗeρχJΌSM+φD+)υΜ“vΔ-$ΚƒΚς6ΎV*τΓ€WΫ—ί¨Dξ$±€«Ύγ|NΠξίZW D`Λ �Υωι3kΣ^.Ύαn%Βν°·s]v‰T{g’½cλq%$5υΉdηvv·y=[5Ώ˜.KnΉί1>΄«lU}sΌν†a�œRβκ’ΖM΅λύώl4B |yš:Χ2=»J‘Gτ܍Βύίό zτ8?³βYγ>Μλf±,Έβζο«2žΣ fY›a-Oνή#λΊτ�bv¨™rη’Jc^’άW^κ¨ΆθΊ;δΤ�=vYή�]-•_io›+«ο"‡Υ‡+Λpκόπ‰΅i/SϋάZωՏο£ΤrΖ9»@Φ©xσq{ώ³l§{™½\ύΌZsπΑcΙ­ΑοM³}Ξϊ΅υ�OPζη΅ η]jŽƒλ$@$@$@�M¦ι„+ΐvUρE§ώ™π·Χψ–%€Ε‰Ή!’Υν³ZΑ-^ή­NŽ…©εΫΖΦπŒGΪφ­ςΩόΓΊύΚ‘UqOSkοόy@ΕFMψkšŠ‘zk$Η ·ˆhΛDΓ`1υ" ρf§·/cug/!Rχόh§Š {Zj«ΔcΠϋΜγMUcΌΝ£ΥΈΣ΄νς�ςH…-R"*<]aπžUυγonΥEΓ›—G―Mπ.΅� v˜Β¬ΩηOXX/ε]lΧdΧJ κί-ΟW/ρνKwUz‰"ς’ΑU₯xήΤ__τλ·Q€5ˆΖν; ―ŽάΫΒSΑ{n7zJϋΥΝƒG*Ο­#>Π%s~x릕-Όφφ€?&-3₯Η„Gν�Ϋ›9Dδϊ*Σ·»yθ~G5/‘ΨΒ›6˜eȚUj}ωž¬hρx€ ηnΟΓJγ”Πζ2\'\―p-XΘ†pΪcœΗ, §ͺ�SΊWW)ϊH3G}·[Έω=²ηύΟ”7¨z«‡0ˆUuέζΧωΓ;su;ΥaΩ<6¦zΏ}-£’~Q$'@Μ\zgs9±q‹Ω•φκ+7Έ]ΆγΥ·Τ/χIφvr+Ή †kΠΰ΅j>\2οkS/αy·¬ιÎ2l4\ό»ΐ»Σ6uέζVΏΒqύΚτξ&EZ> «[ΌLVΆμΰψpb·υXAˆ•ΚΫί4χ³αβx§ΊΝ`Χ>ύΌόq–»ŠχΆϊŸV•ΧΗDόΒK€Ε»*’3|Xƒ€ε6|Γ‡°pΝύnH+ +ΡΆΒ2ΕΧ�τ°τS€ΓόxnύμǏχ‘œαΑΏς‘Žη2Τ5˜/―·3εΚ©=Ξ)ΐ†’Ε}$@$@$@~0XΔϊ,¬ώ%g‹·œΠUΒ`ο½Qf+/GX(Q^¬›χΕxjZβ<(‘ΤΙΛ>ŸHf.Iψ?ς'ΚΚu*”@$οΙΫΥ,€#qr@…:8p,^wφ«Δ˜¬o+Ω;κ&ι,¦ˆψjλ’φ‘LA4ΤΉΪ ΤΚ«?ο“>Ÿμ�Eο«Ά7ͺ αšyΌUΓͺJ‘\Χoμ{eΐη ήͺ³zU”Z%ώ~F²«ίV%\—ΧŒπζ±χ—>οΤEmΥ΄�a&π·�‰—GͺΩήkέb‡°λφœΤΙ» Ί‘Ό©―ͺδτ|΅Ϊί;n“#ω#yΆ,€λ»υ΅ϋ°VpŽZΌέ ΰΩΖΎKώώ>"ob/Φ:VrK/βύ_}/λŸ}Α³i¨η¬’ς6͏)ΚΒ`#Œ‰½ώΉ~²�Λ™Ξ±©ηaZN"vΝΊ¦ξY ~ °~=·~υγΧϋΘΞ^+ρϋ ³7ΞΔΔΘ‰MΚ“ΐυŽΑ‡|\Δ’%Mξw^η [Sνέ„w ŸΧ6Ήwiα°˜H€H€Hΰ?Fΐ`͟j hα °u”g+’XΕ—mŸθ!κYΑ(„h‹’πΐ ei)ΐ>5u›ΜHL†π ₯ x‡τŸ)ΐ|_ϋuΏτRή³0S€΅�‹WΏ^eͺFλΨ¬ζ5qί^νάeΦύc–Γ»yΙΰ*A=—‘,μNε)kΖ ΆΪ#ξ-’“έ§βԞo£k\/ρΕΨνΉZλ«:ξ€ηΞ4.<ςJΚ₯†Eb_!Β¦•!έͺGŸΪ½ώ³byΙ­¦@ηSS³s5¬—Δ%H O/?υΖ-ϋΒ³jϊ|S=ε ¦χŸP±MsOΫ&Α;­lŸξ’9O.Ω«2Jo€ΌUƒˆyπvΞ¦βӝΏXMΙή1MΗFˆ3Ά&βυ"n―i₯Ί?%ΕΪΆ΄‹φ|π™lκ7ΜρΗvΞΊ5₯ϊϋoΨu’[ˆ;_Mkv‹¬ΙJ=ϋ΄€©ςπΔέϋΡŽξς\sΉNgz °J+₯βŸPS©αy@MέήΤX€˜SΊG)ΪΊΉΥ•ŽWμΗω#&κŽΧήΆϋΕ ΖQeςΫCΒιε!λiλΞϊΚ…C‰λžι#ˆΝišΎ3”Θ‰ίς‰ζ·ΈςkjZ}£€iυ±*~κ�ΫC@A˜† Γϋ[έ„\βZΝ«{­£Ž)ΰaΗςϋZλDvŽJj£ΰ]·Jω‘/ΪňoΌml‚ƒBx�Υ‡ˆ© !=Ά £Χ­x*Όά_π‘Y<Σζ‡μƒ7½εiμΩ·Βά₯…gΎ• γΪͿ솀>+Oa‹Τέ6½8Dφ~ς•54½Τa:8eGΧF0b.�Gυ-ώθqΩ9ωύ‘ΖΥ\,ϊέf_σ/»1 IΑ»o“2}Ί©ψΏΡϊώΫ¬>δ!΄‚iθ/Qρ°ρDμXπ<±u{ΐ;Όό$wβ‡*xogΟΟμ&δ:ξ3$bΙΦόδGΌη5νŸ‘C³f;ϊw5� ΜO‘Ξ―ηΦ―~όz§–3žƒ%*€iπH‡gΊegOž”…κγω$KαBRοχ―uάΧxΏμύόΑΗΣGέ2ΜxI‹kκ]j›K   �>s)ΐ"ΡΥ–ΡΥƒBKN€ΕŸlωγˆνDν@‚―.ΝͺŠήχκ/ϋmοN«2„ΐΩ2¨΅™δΔ©3vόΣ΄`;Oί.ˆŸ sǚ΅Ζlι—‹ψΏΙB0Œy¨„φX-œ(ŠΓcυΛ�ε’kκΨο%ΐ’Όiηφ«βbΒκΰ•t«�g»dΉŠ_kό)�wUήΫ₯ΰGψ λx‘.)ΐ&Γ”Νω—ήΏP±ρ"κ(•W4{L%u �‹OrI±R1»ιš'»Λ!•(+,SΒg•xκqΙ^�t@/QqRσέΠΘYW ¦‹�Ώ+ LAνο>Φή_¨μ%ΉEZΤσΨά^b¨‡dAΛξNRQVδaυG΄b`^^J^!ΐΊ „2Σ§�τΰ5χΉΧ½Ό!έΠ[m–ήΦL%�Ϊhm Όφ.IΊ^^,Δ`ˆ‘¦!φ#b@š! ΜΟσwΗ:…ˆUφwPΣλ£D©nu²5μ& ρΞΧ§’ŠmOπ8–iξ>τ­αβ?$Cfη/%$k;ςχ<»iΞ:5#ς>_|Σ½*±Χ6»}‘ϋ›JΉI^±sk\ιω‘ΐiΠxe«'εθœωv?ˆGZqΤ ½($©)'_ΎkΧ΅VπŽΑ»Ζ΄²/>'…›ί«‹Όž-p«£ž?―„z»ήzOΆ kv§c(λ2ŽR‘eχΆ’•lΝ2ˆIξp Φ>―₯§«�ΝϋΜΊ.±k7>ΠY–9_AŒtӐˆoΣ€αf‘\ΊjŽcΫΪπσΪΊίƒξί#Φ1Ή$  ψo8,b|ώ½.aVh0/MPlπβΩΈχ”φ±<`Q^²σrΜ©R‘lςΟ‹•Pδ‹ADD’)Ψγא–Wε“%’ΒΫ}³ψˆ<ςΪ½?-XΣCυ]�υ–ΪI³"υΑCόHΫT%ΎϊsΝqΝ{ο+5MŸ€GLΨUFΕdEb/ΔuE\ΩHΜ`!ϊώή»’NΠiΨν*Μ’%g_�έ#ˆΣϋΡάCφuDθ „ 8_F6‘<Ότΰ‰U}λA²Ÿσiπd‚GS$Vσ³i:iT$m"­»uΔ+ZȌ€—XΰNFAΒ€—Α{Ši函¨³Š£ΜK$‚wX•%Ϊ4=MU%ζ2Ν=εΪΪηN:Vΰvεa<"ΑΓxŸς¦έΠk UU{Q^ΊLyž)ρΗmπφϋ·¦Τ s{U»VΌΪΤ1¨)λπΊsώ¨7Η•Q °},‘Ρ-.xΕό΄ϊœί ±Γγ4g½ZR£Κό:Δ[\pε-Φ!υ�Ί;ΤΌ|͏ΘΚ^ΈΩ=Ίš—hP¦Gη"&ΒI˜ρc­γx τς!ΌGU*oUKυrσK£t{«#Β΅g&Δ}>Ύl₯φ€΅φ! >XΦ`ώ―φ΅w_#Δ)†—λiώb~Γλ­&zYmκ«AΓ„„„½ž-x©nατς³ζŽύU‘œΤϊζ}k·cι%τ_Ίό/ΟηΘΡ0qΓK€…g8ži·Aθ…ΰkšω ˆύͺ>³ΧŸ=ΣΣK5^…PXpυ­/θό77–Šc‡ΨέC`χS€u κx¦‘L¬ΠύwΩΟ·}π +~‰t~=·~υγΧϋΨRΛωδζ­²ψf糁wNωA½$Ο΅ΞίA.“]LΦFΑ   4 p.XS$DΌT/οΤ‡β₯V―§ xΊšlC%ΜnPΒl¦Œ"FV—œΚ“6΅†X³ˆ9 C,�Ώ^v7ρSai)ΐ">.βδΒn¨‘K>θXF―»ŒœΉWŽœ8-’�f² &n›―‚ΰωvΘ”ίθ~qUΓ΅+¬΅Γ,PE{―ΊΫΞί+_.<¬‹oT@J&&�²XάΈvŽ—ϊ}WΛΙx₯ͺ*toQιp}A½Ώ=Gβ₯Z„{'WφŒ²iTp/λpϊKM °‰τ0ύt«ς Χt,B57’Οαva½yυ― ˜ͺ χψPuS³οδφ²λνj*ξΜ°“ΒoΧZJͺ©ξ–ΉΕΐPΒΪΜ­z™ΥT/1Σβa^"QΓex.z‰‘Υί›¬¦ΊΧΡύ˜? B °Μ`·Ό4:`J3Ό¦ƒΩ‘_�tμπΗπΗ<ώ¨·,”hjΥ Άt3‡ˆ1ΝΛάή΄³!jΓό:Δ§mgΗαSϊΑ-ΐ::Mάΐ³]η‡OUŒή€ κf=dP_vΟ#f‘½ŽΉκΥ–�ΜQfnΈΕhaUή§«x‰D^S5=ΨΤ|υG±ΫB °^ρένCm›bn¨zΨηφΘΚίδ©8zprΝ<χ»ΨPB°[ˆ0XΏΞηΣeλπρޱšq9;’ΩG€…7)ήPζφΰ V7kΡΒR΄Uσ„ΈΈψŸB„ζ3€πH�³μ�‡%fΥZέ[Žͺ•τxηΦΌΚI`]w2/3”†ΧσΙπLot―ΎΌž-«χsj•‡»tΗΓ ΥΞK€­2e¬δΉϊrΟfξ8¦λ7f@@όfξgιπNΆΜoV{VήrΏΓλΦ:–c©ΩΌ*φ3βCΓϋΨ4ΏXΏž[Ώϊq_ σœΓY7ίΗ~pFl㍽%{h²›6Q‘$ž²cΉš(ΐš4ΈN$@$@$ΰ7s!ΐb̍‡�“Ε[NθαηΙ‘Q†ά_\κ–‰’ {NΙΠ―wΛ²m ϋPΑ-ΐ"ιS…n Sή±Σ̟Ώ½°ς¨Μ*)οΡΙΏξx[Β*Ι*s”Ž™! ,ΆΎ&Ώξσϋ₯G΄Έh‰‡θ+-Xτ$\HΖΓωwoRXsuΗΑ8ωbΑaωθίCvΜΣo”Ψyy…ΊnjXt` ίΕT ΥQ*Ζkέ�Q²tλ }άw�NpFƒΟϊΥUlά…’w•ηWΚ~%TΓΰEά»i•@,«ό΄ό¨ΌσΗ;±YΝ’Ωε·^u=όπ`Q>ώΗ}�OΕw…e˜A υˆλz"μ²ά>�*ΑΪΓWεW^· ǚπΣ>ωW‰ό°Ϋ³©νJλυσρΓ/έ3ΓYe©9Ώ’�1 –§9…7Ή~‚yP%Χ.-φο~χ#A�—p žœπθ<Ÿ†x|›‡Œ–ΓΏ«©Δ.³υΊCςͺ]Σ>H^μR½ΰƒ<­ΔVΑ;vξqΗx†`VμΡ‡Δ[K<ω˜”θτ„#V*7Υ�λ;ΩΨg°μύψK»SˆΑ₯{vΡΫ/Z»Fψ+z€ s χΩ²zwί―VyΈKSM�Ÿ¬{ά倐ΑΜ-Τ#$@Γ₯³νκ~ °θ‰ W?ήUβφ$L‡²ζ΅’ώχ†ΈΒfβ@ΏXΏž[Ώϊρλ}daL-gτ³�›dCρΙ­c˜KΌ;ͺ«9ͺT2‹…¬7H€H€H€|&p�Ψu»OΙυJ„…g€—!A¦ΐΏτh€‹ϊ³V“f6 ΌEƒYT– 2«W%-Β«c–{%α2χί\+—Κ�Z€Ε1²U‹žXf]o.$}”ΠiYjXL��ߐu‚iό‘μΝΆ₯€iύ<Ž*πL½kΜŸΧ±ΓΨΐu? ²Κ•δ‘L€E³―nΆ™#d’’!1š)Ξέ;V!ΟνWΩφ΄uμ―€6ωUR.xΈ!KψΌKώη ’u•xͺ­£ΜάpOλ4½–Β‰ό`Χvκ!HςvΓΠ…LˆEjŽ9Ψzξ+ͺ)¨Κ«1 s{βζVΣW«Ύιτ £]Ε/Φ―σί�Υw²ώΩΓ―;λ+wi€�‹~½’⸏wϊΨq$gΏŠ?»fœ ώ‹ΙΊ―έ}„ΪvΗ›Ν£ΌKtxT…&xΒnVλ«:φμφ SΩΠ/QβθςΥΙΠ¬Κp,Oξ}Ÿ}£ΔŸΦ.½„@�e+QLŠ<ς �ξ³eυνώP‚wRΎλY»“]"¦―W�>―†~ °ξηΜόΐγuμεχ·‘γKWΨ»L―a¦…k !,vM�PŽΞ/qϋb7YϋK%ΒΦUΏ¬dina)ͺLνhbmΈ½J³•.©Βw|’wϋυάϊՏ_ο#λά­eJ9[νE%Δμ›=}!ΗTψόή fY ζ—zΞtμN›�k‹Έί₯LΒεΈ,ά    †ΐΫΚS±ΫŒϊ|ΰ9ΒδΜΠ�―‘S>μXΦ�ώαάC�αν/N―iτ‡cΞΘ6)oΥΫ›ޞՊg—χ:”‘WΥ΄vΔ+…·ε•Κm 1}‰ςΞ4έΡΗ*yӐŠ <&#±Ι³φΛεu«Ό,-ƒΧY wΤΝ#—υOΘΓ1M±GͺexΞΎςHRH3�j°˜¬V^K$”zώΓV¦!tΓπfΕDΠpއ8―¨›έ·’T-–ΝμZ‹Ϊ•χν— Žάπ†φ`1!ΑγΦΡPm`œ-_Ϋ,�¬?n'ΒB\“;λε‘—Υ˜ ͺ±›Œκ@`G26+)Χƒ—啉­ψ~:ο°Ό¨�Ό‚MΓύ�ός|�οξ’’/Ϊy,³ήΉX§›Hٝμ)9ψπ.ƒ—Yz°ψƒ‡‚FΈfz�…Ϋ&œzΗ/“=3ώψFύ ™3K9$ΊQΣ]ƒšz3jΑΟ¨€ψ„Υ¦Ώ¦KάI�ς6ΎV*OnΤNZΥIo�j’T Φ,oZ†+ω%ΐn�Ί@³ ,¦Ξ§…Ή=%‘Π₯ήο_§θP~ °~?’†-½Γ) F2έ„ΰ °―Έ4Onέ.ϋΏώή¬ͺ§ϋΦϋνk;™•cg xvψξ'u―} x.MK‰@αÁΈ΄οΊMΗVFίfŸ'6¨�lܚ ˆb_ω—ϊΚ†Ύ/Ωa άή—πψ‡ηΏiΟ ’Ejα>[VΏna2Χ₯υ ΐ�Βό`W4o+Η.΅‡‰λQ�ŸνmχΚόKop„[1ίm¨›–¬9Δξ=ςΧ\Ω=γcfN€Χv©nIanΦ +bφ‰uχ‡KS€υλΉυ«ΏήGnζv$œΝvζ:~Tρΐw½ύžΔ�Ϋhξ�λˆ9l~|H›�k‹Έί₯ζ»(`Π,    @<]Ά=AD­₯¦§C¬‹ΤΦμ:©½6»΄Œšφ$ΝEΨέnΩ'[φŸ’*Jœ4½5ΓξΐηŠ„W(F§ΟœΥ΅5υίηΓt‘{έξ“’_ ™ε g“μΚ«8\C\έ­NI uMΚͺπ)Ή�αλHμΑυ?©bSΰΪ[Ι½Βi›Φu(ΐ&vΗύK|¨ψ†Ι΅M‹ύιaό^uV2 `η·gŸ,ΌΦRΐτ\tύ]rjϋΞ€ζκ)½δߟ=cαΉ§[£Q•ΧΗH•t�Hδ— οWx]™,™κœ>~\y?ΕΪΥ!”‡;e±SΠ΄`ν!’oκ�²YU¬ΔL(τK€υλό½�βVΦϊ&)™‘u2¨»ΰΚ›’WΑ¦· 2ΩΓ‚‰h·¨qΣ€iΫ©έbŽorΖv86ΏAc§­e:>ςΆ„/”ΉTβͺjοL΄v‰£ŒbΧ' 89λΥ’κ3’>ΐ[γ¦kΫR΄0Λ¬υ³'OJόα£Φ¦dŒΚ.™rεΤΫα>[Vγ ΟχWΙωΎ΅6βπ%JΘDŒT/‹?tXMΣNϊ’™₯€ϊψκΓŽΡ‰Ÿ¬η;Fy‡ze�?4kΆ¬i�Œ1QπwKY|”J4/6’π V?‘,α©½τΞ‡M° οjΨ�;[(oξ„`ϋΨF R·Φυ?$ύΑλκ[b�)ΐϊυάϊՏ_ο#0 Η’γN;&½%ΫΖLrT­0r Έν&»,Φ―k‹ƒ{—Ϊ㠐    €ƒΨD�ΦΊZMNϊίAΙc#%BŠG7ΎΑλI˜"±΄O=&σ^ο„LεvΗ­C%:K”€„&¦UzεeΙwC#]΄eΨXΩυΦ{ζnΑ»κ[΄hcνΠ™²W±-ΉZΤ™ϋ³ŠP/\‘Θλ~sκΆuL,έS’͐H46žΙjŠ©e˜‚\Gy0Ή…&w²$Τ/ΫοyΑTλpμΘ?σdU뎎ͺπΠ�υωtΑ1-Ø\u‹cͺΌ{Z΄_¬ŸηΏτΆf1ηczνYη·ω₯Q²[yŸšfzΛ† ΄¦²ά›Χ ύ”ξΡ%!‰Vb§n―ΖμεΚHνoΥ1]•WΦυ”Δ�]σδ³rθoΟι2½ž±Γ`x«λ$‡g+GΣρc{Ψ±ΗνΑˆs¨­„νμεΛ:κ ΔΌk,3§/‡ϋlYm�ρ·ŠSš‹Φ* ζέΎQyρξUΣ³M«χϋ7ŽϋΪάη^χS€=ϊοBYΩ²½γ™σε•šŸO“¬E ΫεH:Έμ�‡$ώΠ» +ξ0§vο‘EξpΤq‹κŽ!6φΌ�©lκ7ΜQ£ςΔ’·ρ5Ž2όžϋ·�zΏο%3©δΊ.½”χώ6ξΠ/ΈΐΑ ―€¦‹mΏž[?ϊρλ}δgσθ-ƒχ(Β@˜οjμ;:w¬|€ƒUM/Βό#`ύΌΆ‘ή₯ŽsƒH€H€H€H€H@ ›x#,PSΧαΡ�Υϋγ[ΙR¨@ΈΥΣ΄ž—ΐκ€™ δ—ϊ³qδBՏdίβξ–“‰ήyf;L½- Ό¬², gγγεθΒ%*vζηΙGτ4iLΣOτnƒ—ήόΛo ˆ‹‡?T 4ΉQ{ΰ_±J T˜‡Σλnq*\‘Θ/ƒpO{E<ΚJvj'Ρ΅ͺΙ‰M[⩞ώnŠΗκςσQ"s4 ΛV΄x\Π4όa_ Ι ’½l)=υψθ"5}Ϊ^P·ΘΓH™>έμf~ °θΠ―σχš.ώ£kVΣΞqϋφΛ‘ίώ π`… ΨpΙ6ΗδD//nτQσΣ©’£ZeRV?Ρ5 yξopΜ}yC‰QχγUα8>Υυ­)½μΣκΣ-Dξωΰ3Ωτ’wR¨ΊΏ|!Y‹΅šκεqsrω:ΚpΎE[5“ߍΧI₯ρΞιιV_eΦ«˜¬ξiηΦ~χRO‘sΌν₯Žύα>[jΦΓϋΰΝYMǏΔό`ql|tXέDk^γBˆΔ’†·Ά—ιχe‹'Όv%Δ_@€={B–άφ`ΐ½βΩΉ*ΜR0ΏΤϊϊA21Σ|ϋ£¬{¦Y°Oδ\υλhZk§—λΗs‹ώύκǏχ‘œ‘\lΩ=-ΓώX‰Xζ?1ί΄HX΄σλΪ†σ.5ΗΙu    ΈΨ P€MΌΦw! z¨›±9£3=˜W¦Pγ*x—JJ44!)Q¨z©ΩŸmc_“έο~œ¬hš�ζΖR¦w7Oο0s π<[ΫΉ‡[²Β³Ox)–Rޚ…›ίk6³Χ„jυ‡¬ŽΙiΧH\Q"οάW:J΅Χ]ͺŽ2l ΖeY(Ά˜ώΊSeΆ>s<ΖͺξXζΉκ2ΙšκξΨΑβ3nθ9@O7φτ°RBV1%t—μάΚov―ΟέΊ½b‡Zυέa ~ΧψπMk·cιΧωC΄[ίc€ΔνUά=Ό}1UΊόΎ‚±ΈmλΘ ²συ©v1” ͺ]JφA „·²±Η*QλΤΞέJh-$QJΜ‰ͺT^’ΥTbˆ ‘ώp=¦ϊ=£!ΙWr"G€ΗH«ϊšΙς•rrΛvνα₯!ζe$ρ^Γ£[ΌL‹ΔˆY N^Σ ΓνϏzΎΏ_qOΕ�^§γ GU,/QΚJ†lΩόfΨ}@ˆ9‘�%b"ιRζ<ΉΥ8ΚIΆR%$CζLaχ²’:Χ³§Ο8ͺψΦ·£W΅‘Δχ˜u$vέΖ�κYER.„1HkCά―ρϋjοL7›š"Ÿή³‘Ξœ³﷬ŊθψΞ™’SΘK]kx_cz¦\9C6Ω}xOžP‘—χ Xf/_.ΐγ5TGΛ±₯+δτα#’³NΝTLΐG_ž[Ÿϊργ}”jΞκ™;©ξ›ΆHœŠEŸ!cFύΑύa3­Μχk›VeΏ$@$@$@$@$p ›xSΧ±Ϊ΄I’«a½σz3_VΆz2’1T�ΰ ύ‡tDX™H€H€H€H€H€H€H€H€H b`‘>¦έ4LtŠ(¦β"±Ξω΄u]{ˁ™ΞD<‘Ζ―ͺ*¦`šyΟ…:8χ‘        ΐEF€¬qΑWΆl/G�]h”$ΏZ{ζG’½\ιδ+¦AΨ5λeι]‹œqNMu¨ά—5ͺοLU…ϋH€H€H€H€H€H€H€H€H€|"@Φι•MΨΨνXEΌΞθΊ5%³Š7YyJBftG…s°±’ΩcrlΡ²ˆŽTR%©*ή�uDmX™H€H€H€H€H€H€H€H€H e(ΐάβφξ—…Χάj”x―FΧ�.q»χΚ)υVφ…g₯p‹ϋΌ+§QιΞ7¦ΛΦαγ#ξ½ήŸ3ur›ˆ²         @Δ(ΐΊ­~¬“ž=ΗUš°‰¬ζ™’£$fΥ:Ηώ Y2Kυw'KtνŽς΄Ϊ8τ럲¦C·ˆ»/pΫMRaδΐˆΫ±         @ΚP€uqΓ”~Lν7-sž\’£R92o‘YμXΟ”3ZͺϘ"Q•Κ;Κύή8:‘¬z΄“œ=y2β�«Ώ�†δTah$@$@$@$@$@$@$@$@$@η†XΞ«Zu”#sζ‰dΚ€ΛΨ•kεtLŒGMgQΖ¨μRiό0ΙsυεΞ>mωgž¬~’«œ=u*βα[γΓ7#nΗ$@$@$@$@$@$@$@$@$@)'@ΦƒΌ`7υ*§ΗΘΙ­Ϋ=j„.*ύ\')ϊθC‘+EΈ Β6—"ΟWͺζΣ%G•J•ΥI€H€H€H€H€H€H€H€H€RC€lzλŸλ'ϋΏœdoςΕωnh$ευ–Μyσ$_9DΨ΅dcίΑQ8₯V€εR¦wδ1cSz<Ά#        H @6ȝpϊθ1Yrλ·wΙgȚUŠ4»GŠΆj&YKKΎQ#vέFΩ6ξ59ψΓ―Fiδ«Y ζ—Ϊί¬’‡EGޘ-H€H€H€H€H€H€H€H€H€RE€l|Gώš«^=’Fψ»ό*Ο5WHΆβΕ$k±"’₯PΙZ€°dȘQβ”ψƒ‡uΈƒ#sΘΡy ž―~XεΧFIήFWωΡϋ         ˆΨd€mρŠμœ2-™ZιswΙΞν₯x‡6ιsp         \(ΐ&w‘Οž•5ΊΙ‘Y³“«™�φη»Ύ‘TšπrΊC$@$@$@$@$@$@$@$@ °a\ρ3'Nʊ‡ž˜ε«Β¨}ώ«DU� 5>xS2Fe?�ƒαH€H€H€H€H€H€H€H€Hΰ"&@6Μ‹π¬z¬“Δ¬Xf‹σS-Χ%u₯ς€‘’)WΞσ3•H€H€H€H€H€H€H€H€Hΐ&@ΦF‘όΚΩ“'emηžι6AήΖΧJ₯1ƒ%C֬ɟ k         €9 °)@ΌeΨXΩυΦ{)h™vMŠΆj.₯{vI»°g         ˆ P€YBƒΓό-λŸ}AβIaώ4ΛZ€°”ωEΙ}Y:d/$@$@$@$@$@$@$@$@$@Ύ › ”ρϋΘϊύεπ�€’—”7-ςΠύRͺ[Gɘ#*坜ƒ–qqq’1cFΙ”)“/G;|δˆ|=σ'ΩΊ}‡ΔΕΕΛ•J|ΎώΊ«Sάw\|ΌΌ:εΩΉk΄jρ€TUIΜ,ϋβ›οuy±’…₯ιm7[Εͺl·L~kΊdΙ’U:΄}DςεΝcογJd6mή*ίύ4K7zΰž;$ΎΌ‘uΐΪη„ΐβ₯ΛεοΉ $C† �ξΡ‡ǜςΞ{ZκΧ­%—ͺ8ΤηΚΞυ½³gο>ωτΛ™ϊτξΌυF)^¬θΉ:Υηλ™?ΚΆ»ΔύKq‡lH$@$@$@$@$@$1 °# lpθ—ίeλθW%vν†ΐiP’·ΡURόΙG%gšiΠ»?]�Z³^^{sšμS"uΌ8aY³f‘ςeKK—ŽKžάΉSt 9σΚΨ‰SδμΩ³vϋΚΛK�ήέννHW>ωβωψσot³<ΉsΙ€±Γμ.ΪuzNŽ=&ΡΡ9dΚ+#μς>†Ιϊ›υvƒϊu€ΫΣνμ}\‰Œΐη_'|ς₯nΤ£ΫSR§fυΘ:H¬ A|νϊzλΎ»n—ΛΤKQ?lδM`ΔΈI2α½σ½7'h!ΦͺΩΌΝ“z΅vΝj�³ΫΣVqš/ύΊwΒθΝ•‰―Ώ­«·mΥ"U~Β=fjλ΅οόΌ>r4ΰ–Ϊ~ٞH€H€H€H€H€H |`Γg•lΝίύ,;^Ÿ*1ΛW%[7%ς7ΉAŠ·o-9ͺTJIσsΦ„Š`:ˆ°)ρ”kέΎ«œTΙΠ`θ§Hα‚rΕ₯ ž“)΅Pl0ρ‚lJiΆK­ˆ―Δ~/”ƒ‡۝Γ[ΉΩ}Mνm�€žXΡο5 °©Ώ—Ψ      \l(ΐ¦Α?±a“μϋκ{Ω�υχrrλφT!Zy”ε»ώZ)pϋΝ’­T‰Tυu.�¨ΌίœφΎ}¨κU+Kυͺ•΄Φ_sζΙργ1zΒL58"OX„hίΉ‡nŸ;WN™8zˆ/a ‚ΰ΅7¦Ιξ={ε‘οu„ &ΐ"Α”wf¨YT‚–‡ ‡+š@jΨο~όU¦ΞψΨαN)ΐϊsQ€₯λ�]ΕI€H€H€H€H€Hΰβ @6―σ©ν;εΈςˆ=Ύb΅Z�”Έ½ϋ%^Mi?}ψˆœ>vάqτ¬*Ξhtj*΄@ ΙQ½Š1I �%kΥ�³œ:§‡ά«{'©U£ͺ=|„ x¦g?Ω΅{―.ktυ�ώ±–φώδVƒrθ¨ ΊΪ��½RžhγŒC™\ϋ”μ&ΐ¦€/Άρ&’ωΰ—ΗΚκ΅λνN‡Χς‚₯kcρm…,Xίn&vD$@$@$@$@$@ °ΩOΛΣέΰ <Υ­·>D5&α…]‡€9=ϋ Ρε%K“αƒϊΤ V0oαb9ξ5½ϋ‘ο‘ΫoΉ!XU]Žψ³›Άl•lY³I…ςe$GTδΙΚό`*Ρ}Εκ΅R�L))\¨`Θq›;Χ¬Ϋ Υ¨VΩ,NυϊQ%ώγZœT ΰNž:eλkςΨ#ΝU|ιKεξ$\‡ΤL†oΤ» φΔ »ž%π»ϋŽ&v™ΉzΤψΙ²hι2Ησ€χBM5σαΉ.O¦Sr{‡aLxφπ!Γ:Ό“ξΉ3aά±±'δ5•Ψn�J|hή#hWZ…Γιψxk½Δ6H€H€H€H€H€H 4 °‘ωp―ΟL‘¬|Ή22ψ…η“=ΒθW&Λάω‹‚Φ»φͺΛ•δ#z?B TA(kσπƒrΣυμ*flY³/T&^|ρΝχςώΗ_θ>z<ΣѐΰMψ\ίAΊ~+V­Υλ^?nΎα:iύΠŽ]λ6lRβλ(νΝιΨ‘Έ=xΡΒΫ6γ­‰‰{’_Έγσz΅@ΘΚ¦=άφi-f/VT ŒΌ ϋGΎ” >[ϋαΙΩ΅G?-τXeξ%Κe+Χυθφ”φŽuΧqoC4�rζςΠwΫ»Μ{+%°Έo† άΫP+πŒ?r°δΚmC ~�Ο ‘Κ� VΰY:yάΛqϋωΎƒ΅7pφμΩtΏΘTοeSߘ82ΐ+σΓOΏ’ΟΎšιΥΔ.+U²ΈΌ<°½•…K–)Orœ§χuDxμσ,VmK©‹ηΟK(»σΆ›€ω}w9ͺ€Υ½c€�‘;”έvσυςp³{ν*¦[£Z°ΜπΚΌ?QΒw+Oe§mφ{‚ΌΫ‹9₯χg°wftο5ΐ_oψί5ΡAΆSχ>Α7˜Ah: wŠΌΌƒυΙr     ΈP P€½P―l:=―ή†Ι†›υθάBh°!C EάXLΝΆDΟƍ�–k―ΊL7)^΄ˆδRή”HΘτΞ{ι2•w(€~ݚΚΛp»š:<ǎ α`ϊ”O]T%ΐΆSž±! ŠLye„ξ?Β`Qž«q.kX_bbbu;LuΆφ½1a€DEeΧΫψρ΄= Œΐ ΜέΧν*)XEJSυχξKΨ§+¨α °n‘ό.mPW ½³ώψ[ζ/\b ˆύzu“*•*X‡K€΅ .©[[ Ψ9rdW^§�ΘOΏώaν’gžn' λΧ±·‘ Β―e76ΎVν―+1±±ςΓΟΏιiίΦ>,Γ`Ν6ΦzjXxψ΅ιπŒœνΑˆΠΏΟž£>,΄½˜έBsێέεxLBr9ˆξΧ]s•)\P΅ϋG{*[ήΟnΑέ`­ρ/VD{E-RX �~ϊ₯φ<Ζώ«.o(O)ο[Λ,`kΙξπQηρλﳡ0h ¬·(‘ΏU’Πο>O­ΈΗ Θ's”§γ'_|c ³πΰΖυ²,%¬{œπ>Ώ)±Ο™κy…§Ίeγ†tLΓOΛ{ηΛo}nZ�ΏξjννŠπ̞+7o±χυy�‹X!@Lπ.Ή£ΙMR―NMuοœRα4fΪ]πμO™0Βϊ^Ξ+³<ΐ+©k°zνυξϊΠφLwq_·HξO/Φ-Ύβ:γz[φφ»Κχ?Ν�›8>h\uECύΌ~όω7Ϊs;+–/+ϋ&ΜΠ•ωƒH€H€H€H€H€Hΐ“XO,,L ¦@š#G”@|ŒΔ’‹ϋϊΫοΙόEKΡH»>υ„Ž‘iφψ΄ˆS ƒW Όa‘X/ρmΒ`φ}V‰εΠΔ6kκ9 0έβ μŸθiΪXΗΤμW”§%DXΣzυκ‡Β`²`ΪϋŸθ� Θέuϋ-f·2aςΫΆζφά3X/OΕ._~σƒξοκ+.•ŽO΄ΦλΫ>ΥΝτάΒ.*A0Η}aΩω`Νq v+ξ3�-<;tιa{ΗN;TςδΞ-πΔ}6Ργq.ΑRz’­ϋ†w`7xΎ&~lp‹―hƒύˆϋ ›ϊϊ8GΜWpΓ9QΫωςε•aΚ –F$@$@$@$@$@$šΨΠ|ΈΧ'‹UΒ¦‘#“ΌNα5ο©H,96ΉΎ0]ΣΆaν}XΗ{ΕzZ °^ΣΏqΌ_~ϋS Γξmz«ά§<a/ž¨§‡cέΆ-ƒηΌd- W€΅κ[š ΤκΥ�)ΟuM-Sα§OΠ…ΧΧ +Ρχ•Χή�υ«V� b΅v h‹‚Φν»ΪbΠω`ŸμΪSΗλΕxLα Ϋ–ΑCΧΑž°αXλv]τ”n„-˜<~ΈέΔ`!b!�¦ΫκY9vόΈŠ­›Y¦Ngοnή&αϊΈER»‚Zωθ³―!-6B Μ:Oĝ:y¬g¬ΡA*�5΅~όˆA:ρΪ¦D€΅Ζ OβΡCϋ£›{¬c7νž5kyη΅±zZή;g‚°&0SτΥ‰?ΰq:ξΥ7΄§vΉ2₯₯Ω}MυS€EάZ„q[0Olτχχά„Xֈ[ Οv·Αλή§0Όπ~€YΧ λ‘ήŸ¦‹ έzυ·½Ήα5™n3?…;SΑέ·I€H€H€H€H€H€’P€MbΑ΅4"°I%‚'Ÿ;τ‘ο‘ΫoΉ!β£E"ΐB\§β€"ύΡ£Gε°ϊ·vέFYΉ:!&λγ­[¦αΓ�J€uO·Nxέ†�w`‚gNK7½ΞB «¦ͺžu<―%Ό+wοΩ«½ΨŽ(6³`…¨S«Ί–ž²›Y¬Ϋ Σ� Vzμ)}}Νιωο~ψ™|­β΄Βž|Ό΅\sε₯zέύcδψΧdή‚ΕΊψ| °-UbΈxuΟδɝK&ζbΨΫHΒΆYy?Β;1]ΑφηYκΎsFGΛλ―x °Α�#Δ²;wλ©ξVΨ ΣKυ’z΅₯{§φaΟ:O·Νξ½Σ³DBkš|η'ΫΚε*|,R”Έ§aψΡψΪ«τΊϋ>ŒX±F-iyο˜Ϋ‘ξKχ8±m °fΒ*³ξ¦Ν[₯gΏ!ΊΘŒ«ΪS%]Γ»ζφXΦ…κ’zYρrΆ€‹β³�[JξOK€…ΐ α=XH } ΔξψΒπΨEψˆ«Υ3\²x1³*ΧI€H€H€H€H€H€Β @6 H¬’r€ Β@ά‚yM—·χpXxŸ½§„?KΠ ΦχΉ`ΝΨ›ζ8ΜD]¦kΕu{;šm±nΖΡ΅+w―mˆ�γ'½©…Wxψ³`¬)�ΊΫZ"­YΗτθ>ΈoPαΖL�t>XL©Ζψa^‘άηκήF‚±Κ»1Š­iνξ:Ψ&ΐΊc›m-/Y³¦ΖcŠ<Μ+$„Ωή\7ΟΣ,΅ŽP& ΅‘ °¦'h¨c˜ϋ,οΞ΄ΌwΒνΫ—΅n °m[΅Π±c­}Φρͺ»φxQošμO?2ω–ΥήZ–Ua)†¨°ζuKΙύi °VΏΦ²S‡Ηtά[kΫ½8lL@ŒfΤA|νFW_�Eδ,Y²Έ›q›H€H€H€H€H€HΐƒX(,ς‡DΠΞΟυ΅=�ΰIΊ”Zr¬)δYΗ€ΗW%ΐϋ+>ώ΄_1\65IΈ"`Ϋ«£‡•œ)ΆYηa.ΝψŸα °«Χ�—~/Ζάˆ(Ω•G€χ\ °|ς₯J^τ>Εσ!ΐΒ3Ό0wœV]β²Ε·{ϊ9;“ΌU"ΨfUlαΥσK€Er―W§LΥ}ΊγυκΒ ?L!Uάρ…½šΑΛσΦ›λ]‘ °¦PŒ{:±‘ *θΗJΌOΙ½3bμ$+'eΖ‚φ:w™_l8μkT«’½›SsbόΑXΌ‡κ2”bΩN~kΊNh%u³˜ΰšv|’MHΧͺΛ%      \μ(ΐ^μw@?¦ΉvzΆνρ…DSξE‘:9ΆΕ£uxτ ±ήΆU*U°σλοi1α °–xC¦Ό’@νΓIΒ©Ϋgΐ0YΏq3ΊΧΗΒ1½μQ•@ΘJΤ�Ϋεω΅η+ϊΓtπ»οh"—5¨§§$£Μyό`ίύΰSA’%˜W&½Cύ@'’ωX�k o2d7&Œt„θkΙ²•2ddB‚-ΏXS¬23Ι[c·–m:t΅½€Ο—ϋT·ήΆp0Λ₯ΛWɟΟΥΓΎλφ›u†zSTλήΉ½\R·ΆuZφ�ϊ0ΰ—‹Ž­δVπ²}{�O1ο»•J4ƒ§βmΦγι Ό¬α‘‹ϋ`Κ„’#*Κgr+‘ °θΟg€‚oZή;ζ{‰‘ΠΛήVΙ°bcOH‰βEεΞ[o�UΜqE‚`ΜΔ)2ηίΊ$EkXΏŽΧa=ΛRz’3K€΅>"αc ϊ;xθ°>V€a Ύ€νSέuβ4tπΚΘΑ‚w.H€H€H€H€H€H 8 °ΑΩpO <Χw Ξ),X–ρ”tm 'ξD^¦λ•¨ζΐΑCΪ#ךF›XŒ±γ3½l4O>ήJ%�ΊΜήFFϋΓFΛ©SqvY€,NVžΉrε΄ϋΐΚΣέϋΨ‚Ή_,Δ+5|`Ί x™ζqΎΨ}._~ϋƒβ؎P1k!RZ+ν:=oΗ2?b,_LΦΛΛwΒδ·mΡΦOΦ<―•G[6³†ͺ—‹_1N―#αΦΫ“Fλυ7¦Ξ°“­ΥͺQMzuOˆ}k5†ΈφΒ αv²¨‘/½ C`JΨ�=ϊΙ�έ{tχ=�\Υ4άσ½TΒͺγ1±*DCyuΜP½;-ο$θ{μΙgl/Ξݞ–Ϊ5«™Γˆ―ί�4K—™ο°Τ°ΛW�–A/Υ}β^˜4v¨Η39ŽϋŽ:.ΌL’±w­d…)½?ΡΉ[€EΔΧNΟφ΅οηλ―»Z (Γp<�βΥβCZΎΌyυ³€p¦™ ΕΖ (… 0wsH€H€H€H€H€HΐE€¬ 7SG`ΐΠΡ²rυZέ Δ…&* €R²<;Ν¨Κ!2Έ�Έχ¬¬ C °hcyb½^νšrσΧI±"…eφ?�Κ§_Ξ΄ΕμW€=—1`1.s:>Ά!ςAά€`b Y­$Zα °f‚"… IΣΫn–Ί΅kθ$;Σή�DǞΕρ`~ °θλυ·ί“_” ΓΈ‘t ‘ŽΗΔ(λ7{*΄� ~œ/<U’œ•!}χ6½M{ΉΞ™·@ώRχ•Ψ Χ’Μ_,†Ρνε1΅ηŸ1<Η*„Γ1ΓϊΫS�ᩉiύHΖεeˆ‘‰iώ‡υU€Ε±>ώόkωδ‹o½k—αΊŽΪΟαΝ Φγ'½i{&Ϋ•|<€<–!ΠZ–mߚώόπσoV7žKή#ΏΰH –ΦχΞΐacτΟ%^wΝ•�ξΡ„π (J­‹g¬§ςψQΏ‘ Νπl6-%χ'Ϊ{‡aίg_ΝΔΔ…Aδ~Y%ε*YΌ˜,^Ί\†Žš ΛCύθ�ρqύA%Tξ#     PšΓŠgΕΪΥ+₯ G%ά¨I“)7Ώ’ς°ej μΒDboN4X{3NiΛζχΩΩΩΝϊ}φ•JυƒCDCœΜΖ*1R#•lβ ’ ΔΨΡ£Ηδ‰N q MoAμ³bfζΚ-“•Gšeίώπ‹L›ρ±ή4§0›ž‰ΘqΊmΗΞ]�­Χ]¬„ž?ώš£B9lΧ’hωreTΆρΪC­―š"Ύ.QHW€ΕΑώ]°X&Ώ9]Ž?n ήΗ¦_θΡU'’Bˆx#YeV ’%Š©¬ι}­bΗ²ε㝴Η₯WΌFŽM{χYαΠ‘-›ί«�”ŒRϋa½Ίw’Z5ͺκυH˜ρq‘dμ{ νε:XMίΊ}‡νelu/ӎO΄–όωςZEz‰λ9zΒλ²mϋNG9Ό—Α’.φΉο‘^ύ†ͺ­[tŒΦιS^q΄΅6,IΔqυͺΟIxMCΰ5 Χ΅q£«€υCLsG=/o'f3ΫV―ZI=-νΠΦ>3†©;‰”λΥ}οXmαΩ‰p π|6 B/β·mέB²(qΫmi}οΜόρωΰγ/τμΩ³I‹ϋοA!^U±\aζ;Δ7Ψv~ξ]tΣυ€ΝΓš»!†«{bωΚ5"xΡ"…€΅ͺ_§fuGk^Ψ‘ήŸ–7«ϋώ³ϊΔ}`%ε2½΄1“^Θ–G΄UΛ�%KΘγm )bΦα:      @ΏtO °ILΉ– &μΞ]{€|Ω�Ά·b:–/C°ςΐc BX€†p›Άl•<Ήsk>‘ΆOM}ˆ•»χμΣΣ�!r₯g³ξ‘’Κ‹Β2x‡2xΓ�YΏA²fΙ"U*U;΄F¨>Γέa{ΝΊ :i¦ŒCό Χ&`�ƒR€PA}žα† ·³ΔΗ5J4Fc$·*¬Ž�₯彃Ππ*?sζ΄Λ…ν•ξΨƒΥΫ»oΏŽ·‹ΈΥH†•-kΦ`UΚ#½?:³ήέ›·lΣΙΫ *OeŒΣ»6Μ�XH€H€H€H€H€.Z`/ΪKΟOo ¨τψ²¦{egG".«Nž<ΉeRb�’τv.        @ °ΌH °¦ςcH €8υλΤ’˜ΨX•ΜjΆ|5σG;ΌΒνMn”‡Έ;žC! ψ?{g'΅ρΕρWœB‘πΗ ΄ΈK‘β.₯xqww?άέ9δp·"ΕέέŠ»)EΪ-₯�ωΝ2ΉΩlvoΟoα=>\’™I2ωF6ωΝ›7L€ 0&ΐ˜`L€ 0&`&ΐ¬™/3P$€Έ―“gΜσ³ˆΑ8bP/?Λq&ΐ˜`L€ 0&ΐ˜`L€ 0Π%ΐlθςη½3|ξ’eτλ£'yˆY‘\IͺPΆ€C'0&ΐ˜`L€ 0&ΐ˜`L€ „=,ΐ†½sΒ5b’ΊsοΎ £“§Hž„>•ι0&ΐ˜`L€ 0&ΐ˜`L€ x`=θdqU™`L€ 0&ΐ˜`L€ 0&ΐ˜π,,ΐzΦωβΪ2&ΐ˜`L€ 0&ΐ˜`L€ 0&ΰAX€υ “ΕUeL€ 0&ΐ˜`L€ 0&ΐ˜`Lΐ³°λYη‹kΛ˜`L€ 0&ΐ˜`L€ 0&ΐ˜€`ΦƒNW• 0&ΐ˜`L€ 0&ΐ˜`L€ 0Ο"ΐ¬g/�-`L€ 0&ΐ˜`L€ 0&ΐ˜`D€X:Y\U&ΐ˜`L€ 0&ΐ˜`L€ 0&ΐ<‹ °žuΎΈΆL€ 0&ΐ˜`L€ 0&ΐ˜`L€ x`=θdqU™`L€ 0&ΐ˜`L€ 0&ΐ˜π,,ΐzΦωβΪ2&ΐ˜`L€ 0&ΐ˜`L€ 0&ΰAX€υ “ΕUeL€ 0&ΐ˜`L€ 0&ΐ˜`Lΐ³°λYη‹kΛ˜`L€ 0&ΐ˜`L€ 0&ΐ˜€`ΦƒNW• 0&ΐ˜`L€ 0&ΐ˜`L€ 0Ο"ΐ¬g/�-`L€ 0&ΐ˜`L€ 0&ΐ˜`D€X:Y\U&ΐ˜`L€ 0&ΐ˜`L€ 0&ΐ<‹ °žuΎΈΆL€ 0&ΐ˜`L€ 0&ΐ˜`L€ x`=θdqU™`L€ 0&ΐ˜`L€ 0&ΐ˜π,,ΐzΦωβΪ2&ΐ˜`L€ 0&ΐ˜`L€ 0&ΰAX€υ “ΕUeL€ 0&ΐ˜`L€ 0&ΐ˜`Lΐ³°λYη‹kΛ˜`L€ 0&ΐ˜`L€ 0&ΐ˜€`ΦƒNW• 0&ΐ˜`L€ 0&ΐ˜`L€ 0Ο"ΐ¬g/�-`L€ 0&ΐ˜`L€ 0&ΐ˜`D€X:Y\U&ΐ˜`L€ 0&ΐ˜`L€ 0&ΐ<‹ °žuΎΈΆL€ 0&ΐ˜`L€ 0&ΐ˜`L€ x`=θdqU™`L€ 0&ΐ˜`L€ 0&ΐ˜π,,ΐzΦωβΪ2&ΐ˜`L€ 0&ΐ˜`L€ 0&ΰAX€υ “ΕUeL€ 0&ΐ˜`L€ 0&ΐ˜`Lΐ³°λYη‹kΛ˜`L€ 0&ΐ˜`L€ 0&ΐ˜€`ΦƒNW• 0&ΐ˜`L€ 0&ΐ˜`L€ 0Ο"ΐ¬g/�-`L€ 0&ΐ˜`L€ 0&ΐ˜`D€X:Y\U&ΐ˜`L€ 0&ΐ˜`L€ 0&ΐ<‹ °žuΎΈΆL€ 0&ΐ˜`L€ 0&ΐ˜`L€ x0'ΐ~3†αγͺ2&ΐ˜`L€ 0&ΐ˜`L€ 0&ΐœxώβ₯Μ̜>•σBnδ|φŸ07Κ9-’”``"β &ΐ˜`L€ 0&ΐ˜`L€ 0&ΐ<Œ@˜`Σ₯NξaΉΊL€ 0&ΐ˜`L€ 0&ΐ˜`L€ 0k―ܐaΖ–XλΕ©L€ 0&ΐ˜`L€ 0&ΐ˜`L€ x`=οœq™`L€ 0&ΐ˜`L€ 0&ΐ˜π,ΐzΘ‰βj2&ΐ˜`L€ 0&ΐ˜`L€ 0&ΰyX€υΌsΖ5fL€ 0&ΐ˜`L€ 0&ΐ˜`LΐC°λ!'Š«Ι˜`L€ 0&ΐ˜`L€ 0&ΐ˜€η`ΦσΞט 0&ΐ˜`L€ 0&ΐ˜`L€ 0!ΐ¬‡œ(�&`L€ 0&ΐ˜`L€ 0&ΐ˜`žG€XΟ;g\c&ΐ˜`L€ 0&ΐ˜`L€ 0&ΐ<„ °r’ΈšL€ 0&ΐ˜`L€ 0&ΐ˜`L€ x`=οœq™`L€ 0&ΐ˜`L€ 0&ΐ˜π,ΐzΘ‰βj2&ΐ˜`L€ 0&ΐ˜`L€ 0&ΰyX€υΌsΖ5fL€ 0&ΐ˜`L€ 0&ΐ˜`LΐC°λ!'Š«Ι˜`L€ 0&ΐ˜`L€ 0&ΐ˜€η`ΦσΞט 0&ΐ˜`L€ 0&ΐ˜`L€ 0!ΐ¬‡œ(�&`L€ 0&ΐ˜`L€ 0&ΐ˜`žG€XΟ;g\c&ΐ˜`L€ 0&ΐ˜`L€ 0&ΐ<„ °r’ΈšL€ 0&ΐ˜`L€ 0&ΐ˜`L€ x`=οœq™`L€ 0&ΐ˜`L€ 0&ΐ˜π,ΐzΘ‰βj2&ΐ˜`L€ 0&ΐ˜`L€ 0&ΰyX€υΌsζq5.}φ‰�βO(Ψ�ύGο�#z�ώ}(μwΙ˜`L€ 0&ΐ˜`L€ 0&π)`φS>ϋΑ|μΠ[mβkθ―ζΓƒϋ―aΕ„ 0&ΐ˜`L€ 0&ΐ˜`L€ „`Cσ§Ή“αΓΡ›7ohΦ¬YδννM7nάΙ“'§N:QΓ† )J”(τξ_φ„ •Α;eL€ 0&ΐ˜`L€ 0xυκϊiΕZΊ}χ>ύωη_ώ^ŸW{’Eϋœ’~˜ͺW*K1b|φ*Θ5 r,ΐ9Rή „aάΏG%J” Λ—/‡ (ι�₯£Ν›7SΒD‰D8vƒ '…+Α˜`L€ 0&ΐ˜`N όυϊ57•^Ό|ι΄ gx.˜1bPΧ-(ΪηQ=χ Έζn`Φ-L\ΘΏΰύš;wn:vμ˜W Φςωςε£½{χ²l°Rζ3&ΐ˜`L€ 0&ΐ˜@PX΄l5;y&(6ΕΫ£rdϋ–jW«FkΗΥ *,ΐIގ9³gQ‹-μ�ΒΚΒμΩ³©vΊa₯:\&ΐ˜`L€ 0&ΐ˜`–ϊ M―ώψΣ2?_DFƒzwω8†Β)`’αŒΐ(X ?9r$@›Θ!)R„²dΙBI“&₯˜1c�gbD―/^Н;wθΜ™3΄gΟ:uκT€ΆŸ+W.Ϊ»o€Φε•˜`L€ 0&ΐ˜`L€ „έ„Τ�x?‘Hΐ{xΏPά;ο:$°”?Α}čσ?zι5Ρ£G§¦M›Κ�iΣ¦u‹ΨΝ›7iζΜ™4uκTϊύχίέZ…bˆ+Ožώζvy.Θ˜`L€ 0&ΐ˜`L 4°ΤC~Ÿ,ΐ†<σή# °!MόΩ_δHέ:RxΆ6nܘLρβΕsks‘ηϟΣΐiβΔ‰τοΏ�š³-—ίώύe:'z?�ϊ‹ ΐgή�lL€ 0&ΐ˜`L€ 0• °λ™΅?.`νy|ŒK,ΐ~Œg5 “;lœ8qhΑ‚τΓ?I8@5jΤ ϋχοϋΉ=`ύDδ―�ύχ½zυ‡π.ώΒ_λ€π‘ΓG©YΛΦRl�ζ›―iڕ>|ψ€l*DΦ™8i =ων©άW₯ ε)Λ·ί†Θ~ƒ{'gΞ₯«ΦΘέ|FŸQχ�)jԏ{δN�#F€HβpΆ%rδ Ώžη-XHW―]—UΞ›;•.U28ͺοοmκΧVξά‘½9CnηΉ93Φ{‚±Ν*•*PζL™Œežρ,kΦ�§c'NΘJ§K›†jΧ¬αYΐΪ>όυ͞�“|n4mX‡b}ΣΨ�œKΔ€ �R–Μ o(;qϊ,­\³‘R&OJ λ~œ0ͺχ¦-;ιήƒτΟ?ο(wŽμT€P>…䓝©ΰύϋχςϊωd!„ρ?ϋΛ:rό” •Φ€~­0^ΫΐUουλ7β=/Jΰ6b±φ?οήQ8ᐖίε-ͺβI,ΐ†8ςPΩ! °‘‚=DwΚlˆβώtvζ—›A~Οψ΅Ž§δΏο<3η.’sη/ΔW|sΑ’F‰"œ 2R“΅]^Λ�ŽσΒ₯«’‘iƒltωλ―Χ²hq_Δ‹‡š6¨E)’%s΅ϊ'™Η¬γiϟ'•+YŒΒ…ϋŒΆμΨKΫwp,J) ΏŠO)’~#χώζνίtμ€υsΜ\=`mDξ=ϋ‡ϊ­zDQ"…£A•βSμhΎΞV£6>₯ΏίύGΣF£©?7# σΛ,ΐ†ωSδ™t%ΐ&Nœ˜φοί/>΄m₯ >Β'OžPΑ‚ιςεΛN7lϊΜٜnίUΖηŸG₯γ‡Cηbξόtαβ%Y½T)SPΣƍ\UΥ2’T—ξ=iΛ–m–ωzb7αYΏNm=)Πσ#G#‡2]΄AΪή}hύƍ2;\Έπ4|Θ@U4Δ§«Χ¬£ž}lΑΤρuζΔρ’Ξe=š·jCϋφtYFeVͺψ#υθζEΡ>ΪwšΕ³M€½sη.ΥmΠΨh\PΜΝΣ*•+�ΐ~}ΜΙ~.γ>κ7p0­όΰEμl…Φ­šSλ͝e»L‡Gm‘β%ι?ώεΚ–)E#‡ qΉNHfš―!ύ^f6$ΟDΰφuO4|’1NYΛζΝ,ΪuμLΫwμ’ΕΠ8·mσzŠ)’Z-D¦ˆ�ήΉG·χU�T ͺZ©œΫεΝY€5q\nΪ¦ ½}ϋVf@P‹/˜\ίe§ΚΚ…ΗOžAi² Ρ§δχEτ°>³jέ&Z΅Φφ>’κ:mΒ(§Bα”™σθΠ‘γͺ¨εΤ,Ψ[ϊˆυ{ΘΥaAΌk*Α n°πλΪϋXΨ«ΧoΠΠQ\†v‹,žίΓφ’8�σ_γϋΞ=ϋiξΒ₯�N'•χyΝj]–ωΤ2έ`“~“˜²Ίh€Α{α£ΗOιϊ­;βέπOG8r@wŠΝφ „ƒN=‡™cͺYΉA †‘'CΫ�ύεΌ_ά`�xϋžκL½+E·Qθ”iΎŠB™ΏŽBY“D‘Tρ#‹†!Ηra=₯ΦΤ;΄σ‚ν­“χK]γ+£Κ Ϊ]”σUrΔ€Iuιž2Γl0ž©_}fΡΓ)³(^κ”¨{{νιv―AτlΝ&Š]‘4%άΫ_λ†…ΒΞΨΘ’{-ΔΧμΩ³ΥΔZ§08V@ β^ή�χΏ�«_Ήr…rζΜιt °OU€­\½]Tlͺ”΄fΕ2ƒ™»3½ϊφ§U«ΧΊ[œΖŽN%K–p»Ό_1'ωL‘s’ΫWjU"€ncΗM ™sζIηϜ5]p(T ?Mρ™`ΤΛٌXl#y²€΄vΥΟ~ »Ξφg•ξC³xφ1 °xA-χc%ϊυΡc+<iύϋτ’jU+;€»J¨]―:}ΪU#/„^�ξœKeΦ�²ΖT~HOΝΧ °!}‚fGŽ£†M| fNŸBua6τš¨T­¦‘ά§WwͺY½š±3Ί>|8?―ͺU*Oση pΥ‚BB—4mX›bjο9Ξ<`Ož9'E»Ι’Rρώψ1B΄νάKbŒ/’ΣψQƒ-»!+ViS§’ž^ν< �΅.=^ƒͺ�ΞΨΝΫv�βe«T1J‘<eΛ’QώΆŸ=w.^ΎjδU,WŠ*–/m,Μ3Ί‹5JG€ξπϊυkΓ[\1hίΊ)e=„‚ΚόΊφ>FφΝ›·βΎμI΄`Έ7sŠ^9±bΕ€Ϋwξ‰p2§λƒ.Φ_–sηΟΖ-ΫiΙΟkŒ’X?uͺδ�Γφς•λ„χ/eŸBu¬ξLέ`ΛώPTˆΧ…ύάΒίμ=p„V¬έμgΩ°\`Τ τω‡πgθ9�±η 0Sέΰ`}ρ޲τρύMpuΠ bF ΝΎ¦LB λ²δ!½xύžJdˆNUsΖ ²]°λ7ΚΟD· ήοU‰³lQΊΤΙU’ΗOOeΜkƒ„T%Ύͺ•³ώβž7œ*¦ΞΨQ£FQηΝνͺX’D ΪΉs'(P€ΊtιBeΚψz=Ψ4-μΪ΅‹FŽI;v젌3�Ι“'νJΜ›76lh—¦‚B€υ™2MΖ*SΫΔτμΉ³vέγ‹-,^’SθEDŒΓ/¨aύzvi!΅XφαΓ_©Ψφ/ύ κΥ₯"E RϊtιθΨρ΄qΣfZΏa“qHξz~+rΖρ0»pku<³ζΘct[ΤΏU�䷈f`UΈ lοιΣgtβδ)ρίώZοΨΎM€Ό™ˆ; ΝβΩΗ$ΐNŸ9‹Ό'ψx{΄i㆔?_Ί,w–‹π +V�6ςzΗο�νά½—Ϊ΄λ`‡WόΠΑ)WŽτπαCZ½vΝ_ΈΨΘ‡—ΰ‰#,… £iΧK"ίa Τ―ρ’Γ’™―!`Γ�ΩqΏ.ξ °Ψ"~?π;ϋκ«΄c‹½w ΜΖ?Ί›1}ZκΪΡ·λ0ξΦrΣJΨωΤ<uˆŸ9zό™T¨@j\―–žmΜ+Vž$ΐvλ3˜ ΐΓϋχχη/δΌ3Ά½Wo£L½ZU©Έx―� ‘&M%“ΠλeΚψzφG;― °s§whl~)Ζπž4�έΈ)ΐ+sκ„‘ώϊ½tΟ―kοc`η-ZF;vο“X2€KCέ:΅±CτΫ³ίEγBαϋ^¦κέ•’$±…²+h± ‡X©X^4$ˆ0/Ία\’ 7Nl!ξΠ³?ιω `Θ3Ώ\€ιsR‹7-œ?·!8οά{P†!+RlΔπ"‹Y•½|σ/½ψΛvoͺ4L›ŽMEWώ Ά―Ϊ_”žΈeΏύ‚f6Nd›G‚kSΤH"tO…ψK Aΐ°6Μ,ΐZ\nχ†{Σ“…ΛŒwDX³ψϋΗR”dˆ�»·; ₯+V‰€θ&€<_UY€cP�τιΣΣ 1`FΊ‡‡,Δ„/Ώό’’&MJ5�Hq@IDATYEά8ˆ+V¬06ƒnk/…'E΄hь4¬SΈpaΪ·Οφadˆ™ `υν©yt'ξέΟχeaΪδIT Ώ――ΚιS΄φ"\BΌ�₯K›Z΄§6£Ρ˚η/ˆψ«7nή"tΕX‰%]τΎu λ7μέΏο¨aγζtλφmΉΔZœ7{†œ9Š[ϋ›3o>γmT£gw/ͺSΛΧ£Ie 9ΪN@�γNώ*>HT¬ΛHΒ#:₯ˆυf6Δ”}ςψ‰L†ψ”R„KPΨG>jН?΅πˆ½|ωŠ^ΏyM“§L™―Π΄sλ&ϊLΔ /ΒΔ-νfΓ€7nܐ±l{φ₯J•JΖXM?žΉ¨Ώ–9žͺΥ¬k¬³wη6Λύ>̘Ψ gνΕVΫΌu;uκ�ΥX1Iά+—α΅ωμ·ίŒΌ‚/<ΟΝφθρcϊMxθ(K“&5!>’» Νβ™`α‘rβΤiΊv횼_3Š{ي»Ϊ―š’Λω₯KWθϊλ/n”_ΔVvΧφ0Οfp=ϋΛyz(�λ βΐqƒαί‚ι5γQYJqͺk<°ΟF΅MLρϋwχξ=Ί ΌNo‹g>�―4"v4b ϋεξ½ϋtρ�%Ίsχ.Eη3aΒ„β�Q"1Υ =Op­?~’ΌDXe#† ’œΉlέξ∞)ϊ51mΖ,?Ρ·q#€cΑ… Άχ…ˆ|�Α―’λm,J*~KυcTόš*a'°μQ—‡βΉŸZόN~έχΘΥώΏ•±cΗ’Δ ΏrUΤίyOΕύv[\{‘#Eώo ο$« aΐ±ρ>ΆχU+PιΕ¬Š‘bε� Ύ —―P,O;Ω‡|–v’xοήΊ{�ψ IA�Œόk[vμ’EKlο!¨s”(‘θτYΫoŠ3Vctρ;Ω{Έε.>Χ0lΞTo§Χβu^Ώy[¬Δ!lΓΏφ@|θ&H@~xbΫΨΔΧΒB„5[X`1ΈΒXο‰vρLυzb”h―.s=βΘΐΑC 1UΟΓ‡`΅*•dlP%=»[vοΧ½Ήq 6kژ5m!γκΫ{Ÿ γ„°žROv9ίΡ«=}bϋΘΝ—77΅hΦΔ‘Όω:?tτΛΜƒaΫνΪ΄rX ή Ρ₯,i’€n ΌXgΘ°‘΄θ§%juιύšβlS³ηΞ§Ρc}δτ²j~ρ‚9b°–oΥ’ ƒ{WβΓƒ?€,0,ĝι³ΨuWυŽ/ŸlΥ΄>™ΝΫΈu-Ynσ–οΪ± eLŸF­bˆŠfvψ˜ B8Ώ*Ÿ—ΤGb‰"¦(l†Ο)\^B‹¨ ιQ’D¦bΰ�lίfΒ’ƒa»§Ξ”m*ΟΩΙ’R·Ξm¨«^pœ8žQCϊͺ"~NρΎ5sήbΡψuΜαχφΤ©Q™ δΛmlΗgΖ:rΤ±qQ@Ψ‡BΒ³iΠπq*ΙaŠ:χλΩΩ.}έ¦­΄fύf‡nιΐί«"ΒΐκΧ�&�H!B1-YΌˆx©d·Ώ^‰ΈŠνΊτ”ށ`;yάpš2s�Ÿlύfνδ{+ίq#Zξ¦Χ€α„ϋf%Œ?u–ζ-ZJ/>4NͺDŒ~(V„ͺU.―’nŠτΥΦ£‹FΊz5*Qq+;xδ-ZξB₯›1}θ+ω›�ώύΏ’‘ο έΊsOόϊ6"«²jŠνgΏs‰ΕzxŽώ*Φ9{᲌7‹x¨Q"G’EΉxEζa!uΚdτMβ„2νGOœ‘σκOd±N-–κΞ½‡TeH—šβΗ΅9Χΰš='φ₯,―ωqοΑN½ CjdΝ”^όή}CοΕ³aνΖν’Ωζȁ2ΙEcς&ˆ/΄‰H2Vξύ‡ΟUW–6u )l'Ώ›Ο~.@�\»I‘)ΐκυΌV|“o·}ΣDψ]ž†’ˆ©3ƒcϋω{oθ`”ωλ¨!œ³’Άt� °_Ύ£kίŠ:'ͺ‘)zd?v`±{wΨwβ8�?zKΏŠύ%‹‰ΎŽQΌWYl,’8l@wV-DX‡2,Ύ©Y€M’$‰τLΓΛ¨Ωΰ]σλ―Ώš“ύ΅UΔy.<#gΝlΩ²e£Σ¦X‹‘-ΐΒK°r΅Z–ͺ^ˆGλΧ¬°σΜ2{ΆιευωbE ΣDο±2Ι/]¬!ψeσ,€£lΫDYxu-]4ί�~~m#°"ƒYψ ¨Ϋ§�@»nδVυ†hςσ’E†ΗœUgiε*U5„, D†Ιά1wX³�„œkB<+/φ­ ΨπΔΦ Χ_φ\ωŒ€μβY0w¦0έ±Νβx�CO�03 ooͺ*t[³v=υθνχGΎΥ1θβ!Ό4αε§F�Υχω/…Τξ[-3Μeέ]†ˆvφά9YάYC‚ΥΆ0€DreΊπ‡swQ|Έ‘+_ͺ”)Ε@-ΆGUΦ?Σ+W£«<-ράΥ1Τvt†hpψυ‘π€ϋΠ=\•Ρ§ζO`Α"Άπ˜6‹“κ<ζٌ ˆ‹Š»ΞNΝ£aMΖΥ}‹όΐ>± wο©a"δŏεΛbih4+ϋcE§χ*ρ1§qΝ»#ΐ.š?›pm)CcW–οr"»Ώ=jύΐN*ΐ’ήθ"ŽCg††ίazRBZA °.ν[RζŒιU–S’#ΐΝŸ1Ρ(Έ‰ˆŸC·ΰσ}?4Bf'{ΊmήΎ‹/]©'ΩΝCœD£ψ αΩξί�Ώ#€p�LοV?qΚL—#BηΟ›K °CFŽwΊI<'ΡυY™ΞM₯ιSˆQΪ6·;πtν9`˜,οaˆ§Ί)!OOσk^―B* ΄ΒΨ‰Sύ`•8…λβ·Ω{žνΌzIaŽ 3&Ά«Š_η…³ ―ΠφΒ;Τ“Μ]φΘ±“δ3}Ž<4 ΦΦ±Ms9σ‹σ Τ§%ž‘fΣEΤ6-‹XΝΡ… λή΅§―‹ϋΫΥ}Π§{GαٚάnχπGh ՝ί.σΓΞwΏξ(ρ‘ Ιϊ΅›.MJ—’ΨχE QݚU¬6ΰ΄�½Ig l !)’%Ε¬KS ψ9Έ,‹Α‰Nύ…žŠž[�αN;F—ϋ3ƒB€Ά/…³ΐ>] ‚7oί₯Ρm=ˆF Ζu« οyϋžYjˆ§³Eί·o}=+‘‡Ζ‹†΅«8τzΐ9ž³θg™§zΰlΪΎ‡Φoή!7ΩΌA-ρ\N+ηρΫcΐH9―ώdΐ–š7τmΈυ™)”‰°.m›Jρσπ‡ΰ¬Μgτ@5+DΤsbp²τv½ΖLšI7Δ`d°ϊ5+SΞ쾍ΕƊb"ςάΕ?Ϋ Ω*ΏI½κ–ƒžA¨~$ψre·½�υ \z X+XU?5-8τ]ωΥΦ8Σ€`l\Ε1Αι;―©Ιμϋ„��Ί!ΌΑŒF‰(G²Οδ‹χίP‘ΎN"FΖ‡™bι£Σ’_ΙBΛ₯‘λžΠΜ=ΏΡλΔ‚fq’‡§Ρ5RΙLφ=–yAνٞέ;'₯lI|Ώ‰\ °w~ϋ‡ΌD\Ϊ=—νΟE{UΟυ% �œ€>ΊJ, °Ϊœ³«&Β:δyΈψ ŽfΆkΧ�4|ψpΔ/π­πŽΡ»±:r#έgΟ 1b�ΩƌC^^^vΙ‘-ΐŽ?‰f̚mΤ BkŊεewΟε?―²σ4‚^²μ„�ΓΚ0bGή{pŸ–,Yn', ζ#ΌήoςΕΛ?θτ™3Ζ‡/„ε™”-k·Ό0h� βΚ—£βΒ»βΫΜ™ότh¬ΘΰL€υ™: ο›λΧ―Λn±ͺŽψψΗ>Z]gL›,“Ν1 !΄Φ―[G0°o�:$Ί°+sΧ;X•Ηή'y 6’ζΝ™A9΄ηŒ ‹wΨΞ]{Π¦Ν[Œ-θ,•(UΞΈ†pžO;DΚ+˜½‡@~,Gώah`UE2fΘ Δ™Οιδ©3Fό[δ1ꁏKBI1J!l(K!ΊΠζœξέΏGϋφTΙr:rΨ‚Θ«LUΌϋ�‰Fc'NΪνωΞΒe¨uέ™Β£eοΎύ΄dι2:pθ°±Šα4dΈπξ^&ΧEΛόΡƒϋ¨ο€ARΌώ[t½Σ ƒΧ Β5ξ1�˜’ΡEξaf³bˆλ%›(�™ہxΓϊωί=ΒSe`ž(ΐκ ΐα.Πx·~νJ)ΜζΩΌdΩrΡ3Α&ζ¨ύ$Ι“%‘ƒšE_” Jα .nwΞπϋZ„UΉ*Bsθq‹q?ξί³CzΝ£z―,γyU¦tIΊf­π†R ΘC\jɈeyϊΔξ7 αmβΖ‰‹’4x@_Ρ πœWtοu\KVͺlPO*ΐŽ;Ι<ρqϊΓχEDΧβBTϋ…φ:"½ΕPWˆ―ΓΕ¨ΰΚ‚K€ΕφανZ΅b9J+<δˆnΛ‹—­4bˆš½(�n­:t—#1c]Τ³lΙβ"tK|ρ!{ΕΑkΤ?μΦ»iα’Ψ¬ό)σCqρn‘^\θ€ψMΎrνΊΜƒ7ߜ©6Q ƒo‘‹3<•@]Έ@>fΕφάϊ*~|9²΅Šλ9x„Ν;1‘πͺjψa`24€(V3�©J?––1‘λνςUλDνΙμ©‹X²’βOfαυ! ‘A‚@ΤUgS=€ΒΧBΌ�·»,ꎻw�!ιEŒpn›5ͺgt£‡Ψΰ3m–!›αΒΗ}γVΕ½�^ξ’oΡ‚ωΕoG4yΰ= oPΨθ‘ύΔ]™F�Έ+ΐώΌj½πh³½•-υ=a=ΊΙ£»<,O�ο;™­iλΞ�;žΒ³&“χ‰»Χž.ΐb»θ‰T₯bY)H’aΛΥ}‰σΦΌ­—1Ψ<ΟΛ–όžΎω:!]ΎvCή— 3{₯›―]Ό[•ϊΎ(εψ.‹hH{CλE㏸ ySǏΊQδΆσ!|¦Ξ¦ΣηΞΛ͘ŸyΞΆ Οάfmm’_–Μ¨j…r4ΞgΊ^ŸΩ­‚Ίββ‰ήΪv A%ΐBXνΪήΦ@jή Γ½§ΚΓσspοΞ"ͺωpΜb'Ulη6M€χ«žgžΗuίwθ8ιΙ«ς CvΗB[€½ Σ’Σ”ρΕϋ_―v՞Άϋυ[ωΘ.ΝΌ0 bΔcˆΘ0σ΅Ϋ―g'!ϊ&“yκOοA#DCΘ=ΉΨ©m ‚πι_Γu08ό(AہΗcΫMdc‰_Ϋ½~σ& :VΛ)Όsχ¬3CcΛ°ώ=e’ιA%ΐΦ�VΠ=_™>Wνͺ?Rή\ΩU–τϊτ‚¦νϊMςN L%όB[ίε‡odΊvs%�œ†U΅yΦΖω"Ε‹Aζ―<ώ’ZΝΏ/磉pέΛΖ₯‚©£Ρ•GΣͺγ/hγΩW2/r„ΟθφXίzD€-;ξ6Ώω—ά^Ή¬1¨a/)S⨴ϋ�ŸΤgΕ―ΟaΨΘκ ¨^ΎXr>4ώ°ΒΤΝ"¬ΎϋE|Ε1ι,ZΓ^Ο}€,”ΧΡW_}%­c9°†S ¦„pΊα‘aƒt) MΒ>@•ιqUšΩΣέΓ!ΤβHχlC7žιS&‰.ς)Υͺ.§A!ΐbΰ.έz8¨W|lΰu’,΄Xˆ—…Š–PΥ‘Ύ½{PjUeΜΰ%3{ΞΌ’7–[6kJmΫψ Hseˆ!ΊeΛ6Yq•η­«uTžY€ύετq™…ˆ§ΕWƒ‡42C¦Ή‹>Ό.Š~ο+ςC‚€,gή‚†Pd^e"ΐzuξ@ λΧS»S³Θͺ 3ω…§žŠΑ‰’Cϋφ1Αφc­6b^岟(mΪ42Ϋ,šΑz*X,jϋΘΖ ιΣ₯£Ÿ—.R›φΧT4K_‚ukΧ΄Œ§©—ΣηK—«hzυϋ6sF9XԞ}Œkλͺϊv\Ν_Ώq“ΚUπ}‘tgΦΜpŠΟΡ]6Ώέ¦Νβξι±#‡Λ2ž*ΐφλΣ“ͺWuμŽ˜gσνΫw¨T9›0 8V^ΗΈ‡‹•(e'h₯¬~O+κ‚Fž¬τΠπVGL^˜ώΫ€e„-ɟ/έΗ�­Μ|θχΉUω#ΗΠΌ…ΎχβφΝDο•―¬Šyš.ΐϊ΅ρ„ …7λΗ† «υ +Ό)³tα3ΈX VΑ�l£ΗO] m·Ί§cλŽέ οΙρ£[ξ‘£ŸΓό#ΐšλ`^^³a3­X½A&7©_‹ίUYP°ΗNž!„4€)˜Φ΅'‘Žξϋ­;υΐ¬τLT±cu+ι7ίΠΐ>Ύ€²°?ώθƒAΰΥ=ψά`α­ΉRx«ͺΑ€Μ»!s*W¦„Œηͺηέ{πzφ*“ΰ9~Τ ;q^/λiσ�XΌίŸ=‘f‰ψΓ*ξmL1 νΔ16κXυϋΒ†`όδbΰΠ³²(<–αΉ¬›XrB_σϊω‡‡ΌςͺFXΔ•eDÁςθ– ώθχˆήx’_»θΆΖ ³νή{€f/X"“Ν^Σζ²Ξ–Ρa³α½­„mΰn|Ω=ϋΡ¬ω‹ν6ΑΊN*�γοl›w콋|Η|ΐΐ^ˆ/Λf#vΫ�ύ² =Ά?^)*bͺΫ‚%«θ°h ƒχλθA= /Vs8€xb γ~έΫ«ͺΠπ΄ΡΏ›‘oΧq>³dΌX$’GΔJ}ΘΠ`WoΨJΰ‘[χŽ-eœ[•6dŒhlφυΪΧK„$ωBfλ"jέκ)wެj5ρΊDΣζψ^ί•Κ•€b…ςωϊΊF’“οαύœδψ&ϋ7Φ,<ό]zπVnδξΈ΄†h…ρb@Ϊλ6Ρa>@7=ΒΜmκ+J£œ_1`GnxB«NΎ”΄³D(ƒt‰’θ›§‚ΓDx„‡Άzκ#βιƍ$σ"ΐ&ιt‰ήΎϋ’Δ‰HGϊΪk#wEh…j>w€wl₯μ1©gΉΈvυΙ`C’φ‡}Y‰°“ψŠΓΤX’7EΛ§nψέΊu+•*UJOτό‚ ¨V­Zς£ϋ€( ϋξ»οθδΙ“ΖφCS€5wqΥγπ© β…GχŠΨ―U©\Qfλ±Uyts…‡&ΊζΞ“KΖΌTyϊT�Θ¨¬Ϊή±γΗ…·Υ*ΪΊm‡CwoUSύ#Λ‘-ΐ=vœ4n†ͺH³„’₯έlπb…ΰ ϋαϋb4nΜ(s§ΛίεΞgΔR΄x�(2Μ¬«²Θƒ&Œ8βΕH·*Υk^ΤqγΔ‘="*μ’ˆ1Z©ZM£¨χΨQž€`υΑ•ΤΖwνΩK­ΫvP‹�[^ΫπzȜΝΧ§\Ή2„‘ΣΝfvFJ₯KΩ„e]<όJt§έ±e£yu�C1 ΌΑΊ•ΛΚΈ“Aύδ‰SτϊΝCΈΦΧσ@ou�Žž»₯Jώ`lƒ¬T―YΗ.”ΖάYΣ)g›η‹QΠΙΜΙS§¨NύΖFnχ�]¨^ZΖ²šΡβ:‚§Ά•ιΧ³.d{ͺ»wη6‡ϋΗ˜g3BfΰήU¦Βz¨e52}MήΩΚ‚J€57Ξ!¬MφμΎj¨§jψ€WωΡƒ6ο+σΰ}(OΨ|B„Ν)~?s Φ―Ϋ j›ζϋΤ/vϊΜYδ=ΑG­N+DΓH:ΡζΦ™~Ÿ―Š6ΐρ₯,οΥK rΚΝBB€νΠ¦™ε@[ΊG—±a‹φβχμ½^!ΐ:3%6T€…Χ„hx½ϊγ•τ&Ίvύ–α}ΪHˆ£……HͺL—κ«„ΎœΕ-\$βίβ½\F‘UΠE,„@0{–ͺzϊ5ΕΘυέϊΨΈB$…€nΊ7mΒ(;jUnξΒ₯΄s―81.±h˜€Γ1Nβ*³ςΤDεύŒw_ ψ–_Ό~—ν[‰±„Bn„„uλΤΖ#νO`ΖB7rAO3 ¬ΘCLe5 ›9  ?`uή°�Ί'tριΚτπz†Ψd6Δ^FŒ^X―�ΔΐZ)δ|£–εϋπœψαš”¦?H � xxΓτkΧ|Ljuέλ4 q`±ίc'ŠzΎΞ  η™2N΄ΪŽwψ ήβ»Ο&š¨tσT±ΟΝ₯+ΦΈ€ εƒC€ΥΕM½NΞζ}φ”q2[±ΰΝW'€uο;DxMΩ> {um/G�Χχ―ΧΡJ€ΥC@<νŒΫ2Ψ7J@DD(υ~eαOž9'~ΫηZ^Ÿθ-Υ N Ωe\―—Υόe1x£«¨¬Φ hš+σΆt֜§/Ηϊ2&y΅oeβBΟoΩΎ›|Ξᾞ6ΡΦ �‡@όԚΥlŽϊzώ`ηMŸ`ωΫpx‚Γ”‹σΨ°…­ϊ!| „93UχH‘"�L[7~w�]½L@X«:Αγ"½ς:vgp7ύΗ6Gξ+ލ­=ΠΊχχΣΫύ4T lˆ†6αΐ�}€ŸΚώPTΔ.μg9€7(ΌB•εώ.+Υ­αx¨|«iλ.})ŸYPK„.P¦wΪ-ΨϊΗ², ώ:Αώ·Ι?,b³^Ό�–ΏzGΏ�ω/=ϋσ»ρšΦŸ±…!€€ !ΆΊπpΥίΚ—κsͺ•ϋK*žα ŠωΉ}žάI(ύa6„Α[‰―ͺ ±?"V`σηΟO{χξU‡iL—.]J5kϊzβ˜™8q"΅nνϋ€W›ͺT©­^½Z-ŠΤŒω œALKt›V†nœθβ­›.@""š_Φ¨Q}j�°Q έθ'O™Nλ6l0<-Μ3ΧΫށʂK€UΫΗρ'5ka78Ίϋ’Ϋ/L?~έKf~ψα" Η‘�βl�«ϊΩ}ή,‘U€ˆ‘Τκ–Σ,ίf¦Ι“άk…χ™2πζΜ3Σr'ύ`Qί”)RR^αΩ�Όic§ƒžύ!<³j@b="ζ£.¦ιέΙU9Lƒ[€} ^ή‹—,cμΧv§ŽνŒe5cξJίΎmkyΜΘΧΕÐ`UέΜ=K5λ4P‹RXΦγ1¦™QcΌiΞΌωFκΨΡ#©d‰βΖ²šAŒ,Ωs©Eϊα‡οiά¨Ζ²«™Λ—―H>ͺ Βg@δ6›Ξρh!’[™6α\φ‹ψ 0σ½΄E)Εσ%^ά8²μ(o:'Ί°ΒκΤ¨μ46ρqΡU~‚θ2K"bκέUΞ«?8Χ+Χl$„“ψγΟ?U²1M"„>xˆΊ2ˆkγ&Ϊήa\• ŠΌξΫ OHϋή;ζνκlαΝ«zΆ‘άgΒ#φ›Δ‰„°œZ†–0―«/λΖΚKV?ΰ3nΈ]i΅. °Š„ύ‘:tνcϋΪΎ€m ήρ…Η/ ΟN=VΆ­„οί9"l»`�ξί5>Ή€°·οή—a.π\4₯Ό9=t™GΧy�X·ώ#(§Έ/+—χ]O‰”ϊvΠσ`HŸ.FRH °Ϋw Uλ·ϋnjYΆΛt²€°ˆ;r@w#φρ=ΡX0lμd‡5[Ο,XX`³φΉJE Tt$ΈοmQα ΟX�Ψρώ))qμˆΖ*ξ°Ψb°Bπue`Ÿώρ/Ušp›0—ΩƊH½ΛΕ£JίΕ0g…ψ2 °!ˆά,Ύ"μΜn�D„ΥXt�?zτ¨ι}ϋφYΜεPΠ +W�€ *8¬QΊtiΡ₯ίΦϊŒΜΠ`'LšLS§ϋvƒPH•v3αšπŠ8~βνΪ½Ηaδxσΰ;`ρ‘nΨ°D"~/„/+3{ΰAˆ€ ΣE³ΈͺΆ₯{’™ΛV€=~β$ΥkΨDνŠΞ›EΩ²f5–;£‹Z)#†ϋΗΜμ…³'ύ³Ί]Ω¦Ν[‰xZ‡eZf1έδIή”ΏP1£Μτ©>bΤι<Ζ²š n‰ΎΝ�v'C @Τ1›³(§sJ݊χЬΚςηΛkΩ]ωι3ϋz»ς UΫΒt™·ϊb$!τB0˜ ‰9rη7’’žδξΟ**b*3p¦�u†ΈΟ¬‹ΓKc6ωο^ίfΞ,κš+7a­<ΝηaY€ Μ³Ω,Bκp)ޘšΓ8`ΝΟ=΅ gΟFœ§ŒYΎSΕHχ7ύ1σψΙ:~όaΰ�5kΧβ"6π[7­3Άf>vΏBτ0ˆ Ύ+;°w§θ�₯Z Φi@X ήΟC>bK/BE η7Δ3€?EΔ^½€Y k,κΤ€u'q�#υ3B„|ΧΑ@F0�°wρL‡εT%Š"x+Σc?‡»lΕZZΏy›άPBχ|wMχ ¨;}ΞBΪπˆ»»4Καγψΐήrƒ=~ςTΞϚ<ΦeΘ%"ž"DCg†Q珉Π›·ο–=7T9O‹«© °θŽξ—ΐ�ŽΣ<…`ˆ˜«0Υe_…pΥ0‘x»‚ΐ?°¨‡C »?ΒΐάΉvυ2ώρ€U^ώhDqΕ[`oϊΔΡ%Š­K³¬ ΕJΏo�X],―W«*/βλL`±ΩO&) μπqSδ@Z€ΤΌA-o7­Αλμ/"n©Φε>«€­I½κFώ/―Πq1—3C8±SgΟ‹p8©qέjF±ŸΕΰβ»DΜ_έR₯HJZ62’œ °θ±Ρ‘Η £fΜα |f.  —�Κ2]Ϊ65ΚΊ{�!αx•ωŒΆέ+XΆ`σvμΫ3ežύώœΦnځY§†˜ΣoίώM½Ί΄¦„ βΛrΔ²»’Ν†γΕqΓB[€}σΟ”¬Λ%ρ[-œƒbF SƒRΙzm`5œyOΞc¬θ"Δ€_Ά­kr»�ύ~ °Σv?£~+Ωm6bψΟθσȟ‰αιΝίο Β),°¬ΪΙ.1θΦࡏιΒύ7ς˜U:¦ ΔρoυJf ¦η…Τ< °!DΪJ|M2€ά»CήG ΒκlβΔ‰Ε(œwHΏzυJqDΜ*Χ­!+ΊHΐ~°?³eX>}ΪHM±E»φθeΤΕ™φPtgΓθ‘°X±bɁ¬ΰaσζ­o«Ž>ΈΚ™»‘κb ςuVχdCž;¦ή„Έ’»wl±σFPΫ0{cι1TΝ+!v§ξ₯‹f…ΔΰIΟΕΐm0³α_±OQWeζβ1p2„ΈΏ^Ώ–ΙŸ‹AΔb‹sΰ—™½NyΑΉΪNP °›·n§N]|ΰžέ½hθp›Π‰˜Ÿ'Eψ«—k³kfˆϊ»ς^TΗη,ς1H ƒαέΪα­›™ΕΊΥ+(Eςd²ˆ.₯kφΊuζ=Šϋ³Ψ₯κZ °xα2σ5ί£ˆέ|@ ]Y”Θ‘ε=©–_‹η`™ςϋιzÐY€uΦ¨ Ά§7 !-°j»ξL"ΐ.[)ΎM6O 7ζ}uξΡ_’ˆτ°(ΐvξΡOΤvϋΦM){G‘r�ΤYΒ³Ηφžδ�«ώ€‹C:}pͺΐ °)’9ŽD γ3mΆάe.1²wλ¦ υέ»œΧͺΠ`υ.ΧϊΰiζΚCS"E‹φ9Mρvόθ7―ƒε­;vΣΒ%+d–C«uΒJZP °8―^ΕθOaΊthiΔ…­_»+\ΐς•λŒ›ΦΏ¬;ƒp!΄„χ€ι²nΊμΞ΅«—qW€}!,nΫΩφ’.MJκΡ₯½%$ΆκΠέπ΄Ά ­a^q’/†AΓ0x˜•Ή{?X­ϋ1§V€EΘ„Pο₯h8+ΛB|Tςϋx΅5^Ή~“ΖO™c,«ηΟ£?„ψψ΅GƒY)»sοπΆ―mX»ͺhΛ€Š.ΐ6©Wƒ²fNoδMž΅Ξ ρWβ�">­² `±= †P0|_wξελ !Εxοβ;¦HlΩΈeL—Z¦αΰΒ@\Κΐ¨Ώ°L±mΆΧϏhΦ^Ϋ;@Α4ŸΣ²ΦIdUo?ύ‡r Ό&η›ŠMƒ*ΫDeuξLύ`uΈ(τ Ϋ–ŒM΅σΔ€τΪ@\…άθƒT¬ͺ7ηγ·ώ’ŸΣŠc/ŒzJ–ΆώF ρ) °!€άA`ž―J|U»w(γα"¬.ΐ’»>ψbĈ‘טΒ[uνΪ΅Ζr`fςζΝKϋχοwΨZθ `ώ©uΗ Mφ™`eΥ]βΰ’EσνDHσ(Ρ*”Αζ-Ϋ¨“H™ΩΛΙ,Α{oϊ”IͺΈμ2�ΣΚ/˜CYΎ΅uPi�¦[τΑΑJ/F]„x (eΧ�]£Ž]{ΠυkΧU6„Κ–)%—Ρύέ°•A$ξΥΓKΦα"Deώ`Ν-b†’ϋ΅ήmΝ<�Ό93δfjŸˆΡ αHYύ:΅©[ΧΞjΡιT€Pο“GΙ.ͺNW°Θ0‹ŽΊΠaQάeΊgή‹κZƒθͺ<1¨w³2wV€?Ρ‡¦Ν˜eμ^�>ΌEΜΕ¨2mρ’₯4xθ#"ύΆM덗]θΞγ˜QΓ©p‘‚F¬\ˆ\M„wρU+OY­Υ©wOΫ½‰Ρ|»φθI‡#\ί£F ±»Gzτξ+½ ΥΊ­[5—‹κ=&<Ϊ›6omœ+”ΣΕg΅ž«©.Ζ9klΡb[8ΦS']η1˜W£¦-νκP… Ϊ>TΝ‘Π₯vΠ€~‚UΉ­Ÿ–.£ACμ=΄Β²˜g3ψιƒΎaΉjεJ„ψ»ΰ ³CΗ.†G:ςaΊΨgγˆQciή‚…Ά ‹ΏΪ΅¦fMˈ_\±J5#lŠ‹όϋση”―`Q£�Yό6¨λΟ‘Ββ7K5Š™l3‡γΐ½Ίh܁A4œ*„E%†βœujέX ’ΘΧcŸŽΤӈ™ŽΌύ"4ΛO+l=eJ/DeDlZυN|]€­Tξ*¦=³ ―έ΄] žwK $˜ƒjT*k·nP °­šΤ₯ β7AΩ֝ϋhΝΖmjQo2ρ¬PΟ„\€θ\ϊϋΒς˜TA H6sώRjζ6ΕΟφ¦ j²(š,DΦάƒ�ž ϊ\¨[‚v1‘Tρ#ΣΎ^ΙεΌώ(ΆXϊ质…ν7M­― Ό©D¦½=·?dνšΈέζ<Τ¬ͺ¦D ƒ‰Α¬“!τ‡Ψ`ν ¬Zˆ―ͺ e=X„ΥXίΦ­[©xρβκPι)ρŸ;wξ@{Αβ‘Ύ}ϋv*R€ˆ±m5ΟWxΐκš,κ1cΦlΩUΥ /ˆι‰£3’΅[y1!_�@EL―œylβ‡Z]Λ³eΝBχξί“]§•ΐ†όQΓ‡R™�%UQιQΟ:έ Ξ-RΘ©§—=}ζ Υͺλθ]α%EŠtωΚ;ο.¬ ―FΔTΒΪ₯K—©R΅šϊfε<ΚΑƒΤl`γŸ°f‘ΫCάΤDB$^³b™άό/ηΟS΅šuνv•5KJ˜0έKnέΎm—OίxqγΪ₯Y-ΐSP‰ΗzΨ«²Ξ�‚R€Ε>τ:ιϋt%Ύ»Γ0°,�ΣΒΕ~0DΤ ΒN’$ίΘ8Βj€vUg³H�‹‡A-ΐϊLq|'OS»–S\‡h¬ΐKBl˜M_jξf�Η@ΖzΈΏ!κ††˜Τ"€ΗSαy aS7s(=ΟΩΌΉ±Δͺ›·ΞPߎςD6ߏɓ%₯υkl―(a.oΒ† §Άσ(σΕ96[X`QΧ€>›±ξΦν;dˆΜ+Γuοyύ™�ς0ΥΨΐ>!ς’χΐ_½6vO܌ΣΣ-ρAsρ�%£1τX�e¬D7nή2ΦCL` ΊqkŸΙ‘Χί ¬.ΰ]£HΑ|T\xΛ‘akσŽ]BT?fWη°(ΐ’‚m»τ2ΝΑq|%ΌŸΡβΊgλζ�‹uτY2eρ° Q υΠΡγ΄FΔάC#Έ²€ °MΫtέ>m½2‹λΉxΡ‚RΒ¨π°ŸW­§΅·Θy|(W(WŠr‰pΏ={N'N‘{φaZ7o$σPX¨*ΐʝϊρGρjε)ΑͺW�aF«΅yΓΊ†‡ ΞΡτΩ ƒF)λήΉ1¨–.ZαάβψσεΞADς½b€΄M[vα£ͺWωQŽογj»am”,ξYtϋW!3p¬δΑ�™ωuνF€ΕϋDσΆ^Ζΐi,­|ιΒ£0!]αΕV­έdx˜"^0”Ήsνκeό#ΐNεΗ„g9 ΧЏe �%ŠΙΠθnΈΟ{„ΰ―8–ΧS q]ΑΠ«±IλΞFžyΐΐξ}‹ΖˆG²l̘1¨™ΈΞ3OΒηβwdΥΊFC xΪ΅**�… ΅_·v†G'ͺ«{oΚ—‹ͺU,cΞρα΅ξ³p?^CˆD{ΠΚuΆηnΉ’ΕDxžBΖz~ΝθlvΡ°Ω¨NUΏV1ςƒR€5{c'πrΕ{bz#�Έ²[wξΡ¨ Σε"Β ξέ™>�ΰ4’ΚΌϘβύΗl‘%ΐΞ?π;υXŽ΅ΆUρO§ΤσušBj©Ρ·θΤΫ{γτ†‰¨|ΦvΥGx€2co�ΣW�Rόθ`ŸvωJ€ύ_τπt~hj»<]€M'"ι›�.ΫΞήχ*½}χŸLŒ{βΦkͺ7έΦZ1[L\%ΎέΎ°�λ2ύρφ= °ŠΜΩ 6E:]jGe\•ρ΄ι=1"ή“…6ΑuGΜW³η«ω˜>Φ,ΐvθЁƎk>\Ή-š5‘vmlK*_ƒZ€Ε>Z΅iO»χξS»s9β3 Θo”ι7`0-_α+Tβ^4Π…8³œJo016 Ν€I“š–.^`xίjY.gΝηϋG=tΣB¨C/…³η¬γ}AT]<₯OŸNί„τδ…G―3k�°͜3ΧΘλl`žΝ8Ȏ’‡Β–-یγΥgπ,«Q­*-ϊi‰‘¬ °H Μ³λοΕπήχλΊ2Η§†θ_₯Fm?‡α‰ώ³x¦›cΆ6kΩ†φ8ˆ*ΨΩ’ω³ [ΚΜ!-ό W Φ ͺi@Xμ»Ο t[||93t₯…Ψ «,ΊCΜR](ΝΗ�°N ZΌl₯ƒό#ΐZ Β₯o;₯πμ»vγ¦L ¨«‹\jΫζA¨z‹stΗΕ9Βzˆ‹8±Κt*4XΤgοώC4sήbU5—Σr₯JPΥJεμΚΈsόέ‡μeηMf·‘0Έ”,oΘHoΊ|ΥZΘΆ:|Ώ�==ίΏ!°? ¬ζ3m–xφ~PH,*ώϊυ^λZ—}w�]½ŒXˆnπ˜Ζσ�/K“*υκκϋύ…F‚Α#ΌΥ*”-I•~ττИ0`θh‚λΚR$s 7βͺό§,8Υ�ϊ#εΝ•έ@φP„<Κ··dkαІ W―�‰ΣηΙx¨(AρXU\TσΊ/^Ύ"τ’P¦ °Hλή‘…Δ5‘ΚΆ›"œ.t₯‹Α›΅t‰".Ÿ‹πp?uŽΕτΔ¨[^ς¦f•ςvίΩF¦˜Ρ98Xx�ΦΜΣΨυ£—��Ή»―ι²ˆκ·±U‘+Zx:Ϊ/₯ΒbVzΓHj^δTKl/BψΟhΟε?iΜ¦'ΖvB`ˆIΨLΧγ ύώηΏrύjΉbR<_R�8‘Œ«z‚κ"Ώ^Ύ/)Q¬H΄ν—WΤυcϊS’Κ#ΐκqn±½ζ…cS-Q—oD]v\ψƒ¦ξ|FΗoΪΒm•ΞόΝn’Xν6Δ§μŒΘOeΜklέρU6‹°Yqό¨QeΓκΤ,ΐ~%lΊyσ¦τpC/_ΎLq…G!Ό/a$///:tΘ>h·Μtρž­Γ‡·τ�Εjx‰Θ˜1#AxΤ-€XΏb€BL=ΦΫA,Δ‡:Όζš7klΏTΓώƒ‡hΒΔΙON³αΉCΫ6�σUu™ΠΛ`]ορ“€·ͺꚞ]p\0w¦^Με<φ;j΄·ΰα„Σr5«W£Φ-›ηX/˜‰>S₯·™ž―+t‹Ώ ΞΧΘΡγd„ €lΖμ94Ξ{’Z€Σ'Ž8ˆSˆ³‰rλΦo4„³‹ @lκή³―ƒΗ+ςΠΝΊ­_.½ΰ„<+Cwt„6PΆ}σαQϋ•Zt{ͺ Vuv{C βΘ‘'ΏΘYΏnκζeίΥΝΌ]Ώb`]xΫΆy=%Jh�ςtρβ%wXm{’1P΄pA΅(§θΦά_–;vνv 2@vγ·[I,ΐƒY 7ν) ™IDAT]�ι�₯•BΏΉLΝ: H…άp&�šΧQΛxYBcƒΥύ©Κ@Πμ�±αΊΥνšψ©Q§ždŽλwξ¬i–‘>·]‡ΞΖqθΫΐΉΗ9‚P†F&�Dτάω Lq=#|€nΊ >KΞ£ž}ϋ ΗύvΧ ΄±£‡ o€xϊκΖόΖM›E£Lγ^CžνM7ƒδ’ UͺeW�ΌΤhqu  β+Γsa3bhhAƒ‹²σgNψΙ4 Οfμcφάωr Eέƒέύ{uλJ/_½΄σ’5 °y6ͺγƒ·jΟ^}ιπΡcΖωWy8Ο­[6—ί©45E›IS¦Z ΘΈŽ›5mDxv˜cc}λΌ‹θ§₯ΛIχ^7Ÿ�ΧψΡƒ{ήͺΑ9…ψˆc`YΕΐ!Ϋ4wkwπž2c.­1 βͺήΌu—~ήάz|Y³‹:AΞ”>ρ~†kπζ{β·e‡  ή…·]ύa-Υ–λ`ήNaΤ †p»qΫnΪ°e'ŠYZκ”Ι¨šΈξΜ^ΎrB D†υ­/Σ¦NAU±^ά�Ϋ}όδ7Ϊ/Α*—·½ΗbPΔΞ½mχ’QΠɌχπ~Nr|“}ρ޲τ±9/ϊ¦:Ÿƒπ9ͺϊWI ΄eec·<₯‘|Εe«2!°E ^5’ύ6:/yH‹DŒUέτ«VƒpιeKdŒN[±υ€ Œ‹mϊμψ­y¬oήaατNaΔB Ψ`„όlΥΊέgΕ­Swχmtg—J„υpλΞvCͺŒY€Ε~ηϟOuκΤ‘U¨]»6>|˜ΊvνJΝ›ϋ~]]$wμΨ!…ΨΕ‹[V·jΥͺT @*\Έ°W- }HάΌy3•.]Ϊ‘Hp °ψ±Σ_TπιŽA,Ή~ύΊμΊ“@tΫL?Ύ]χgΫ@H‚‡’λbψEM@CkatΆžJG—>t—°ϊ Ve\Mѝτφν;rπ―ί_<]�Χ_'¦€I“ΚϊΈZynέΊ%D‰W”&MšΧΓΥ~ΰ †��h=΅€U=nŠόηβbΗώŸϋΠiόBgϋš:}&auΊ“cΰͺ€˜~ αeΓYέέ6�‘ό…ŠΩ‰ckWύL)S$wwr]ΏΊ½1!ά½w—b ]\CDΧ·Π6\£Έ6nаwξή₯˜_Δ €Ι’Θ(Υ€dUG|`\ΉrUtΏNιg`ά�.\ «BΈ!ΆPΙΔ>pcζAŽΪgw_šX’ϋ„ηC qΈs βΊ}ππ‘όŸδ›oά Ω˜c ©uϊlFύSφΑƒβ|¦2Νa Μ₯:� x6βœ`p°‡βΌD]†aqηχΟΜ_…0υδιω!”8qbωLS?ͺŽΞ¦Έφ1pW”(Qμξa4Άδ-PΔX­fυͺΤ§WcΩfpl·Δ`Ÿ―^ύ%…‘¨Q£xB΅έ�£…ΡυrΤ›PνφΚ’ Ί�ΓC1σΠΥ5¨ Χ4βΚΒτQΜϋωσΟΏθꍛ>\x9xΛ_D7 ΣΛ`xMtAΏsχΎ¬g"ј›"ERΛXœVΟΕϋ~%ίΙIΔ;Y¬/}½£¬ΚJiG1wαRyΘςε±{…YρpχΪ³ZΧ?iκΒ C*Δ†Φκ²Ž.‰†[ΒγριoΟ„‡c<ρώ˜ŒΰΩξκέƒ1όΈοπ>Oڞ;lP<[8\ΈΟΔ;Α3*} jρ«ΒM`;c‡τ6V5 °*ε G"˜Lε…Τ4ΙΧ‰ΔυE4&?w―ΥυΖΰ~ψ¦FŒΨΐ˜;μ“Wο(S/ηlτΘα(IάH”>adιqš#™}#ˆUύŽάψ‹šΟΉOwuƒΰΪPxΎφ(—" ―X³ΑσtΐκG΄δπsz-ζaΊ‹ε™b°!BUωHƒΪζϋ�Q™Μ1(�λH’9Β+΅”πN…ύ,Νj³ΰœίΠ))eOUΞ㏊[ ay|m{ηŸΥ'^�ΐ΅ιΑο�ε1>œk’λKκS>žτΆΛ α`Cψ§²;+BΔ9αqˆQΌΘτθΡƒ6lΨ@&LpˆέΪΎ}{š8q’%.ˆ· ,°ΜΣρÞ'O:~άΦ ₯η—«οƒη?-UDhxξΒΜ1?C‹Ό�ϊ dηΡ†v~Z87΄ͺΔϋ A7oέ–£Χ«]vοΪ…κΥ©₯Ι•k C3.\€κ΅λω«Fϋvo—!7ό΅R0vW€ Ζ*„Ϊ¦Νρu·nZg78]¨UμΨρΖ-Ϋ οΩΒωσZzz"ώ"bNΒrdϋ–ΪΆlς αCό”ΰΫ£Ή° ’"lβ˜!’[΄}ΌΓO‰«g 6¨Ή+ΐΥώz+Žγ=}[4$ĎθξͺΑ^ŽΨ`GόiξΐJ€‰Ύ}ϋR�ώύ%xψδΜ™“β oΟ~ύϊΙΑΈΟxΏ=ybν ―šηΒγ]"]™΅mΫΦ² °–X81€ΰ%—#w~cνιS}(^ίn–FFΝ BύFMB[`χσfO§ί}B5αέ„6½ϋ=ž™{vl% |σ4ΦΩ €�οΫ΅ώχa WεB*οS`– P±Œ�ΡνΫΆ¦ζM‡φO~?πͺλΩo¨Α‘`ώάτ]Ά,bτηΤΒΫω±g7Ρ±“gŒ|«n�F&Ο0#πΛ…ΛbDυλ΄οΐιΕ‰κ§cττjηaGΒΥύ” °ϋiœύΠ`? Κ‘{”,ΐ†.�vοΞXt)ήΎ};,XPϋ’E‹¨eΛ–²kdςδΙ)“ 꼈/ ΟXWvGtD·HgvZŒRž/_>)ζZ•a֊ §”bα6jb‹αU„:ΨΏg‡C\Ϊ€n; λΧνzVmΫ¦%΅lΦΤ!>^hθͺ\½έέqa-[4₯VΝ›ΙyO`αΡΫ‘³—¬»;Π=rΑάYvaάY/8Λ|ͺμ8w|φάymšΤ© ƒ±ΉκΎœηΰSέφΤYσιΰαc~~)Σ±f΅€Ε[φsγ\€ „Ξ=ϊΫ (…π>ή#Σ"ξ$πν»υ7β£zJU=ΩV‘p=…—ώψύ]β\'Tμ���ŸγDέ@IDATμ]ΈΤF½P€H±βR\ Jqw§ΈCq)�ΕέέέŠ;wΧw·’m)TώΞ,“7›ΝΚ{»Οθ½|Ό$c™œΘ&gξœζΒΘ ;wαͺ¬>M /Zαͺ!ˆΒ;νJμΨ±iοή½”>}zYfȐ!4hΠ ϊσΟ?Φ1gάΊu‹Ύψβ s²άΎsηεϟŸξή½k™Δwο�ršΗŒ@hGΰτ™3T§~#y"D 4©SS«ο›SΑόωBϋ‘q�}ˆΐŒY³ι�ΫooZq4oΪΨ‡­sSV\Ύ|…¦ΟžcduιО$ˆolσ #˜lΪΆƒ6nω‰~�ύ‡έČΦ«EY2ιΗ Œ@hF G�‘t�ώC ξJ’(΅hςŏ'4χύ?ˆ@λΞ}δ5Z=uΚd’�αdχoάΊCοή½­‡hύώϋοh�¨Φ>72Έxε†μHζ ©½κP&`½Βο£«μŠ€ΕΑƏŸ6oήLY²d‘ΗώβΕ :qβ„ψ(ψ@Π(Pΐ%&ΞΨ«W―R©R₯θζΝ›.λ3λΞόx�Χ_6Lγeη#8$>F€` πϊΝotηξύο\±(ΩIθ“O>ρAΛά#ΐ0Œ@` ΠΉΗϊλŸ)Œx·gϋψ€/cψOΒ�¨!}>Ύƒγ#²C€ X;8xΓWΈ#`±Ÿ¨Q£�΄iΣ¨vνΪv»}ϋφ-E‰Ε.ΝΌqϋφmJ’$‰]ςƍ©Aƒτόωs»t« &`­Pα4F€`F€`F€`„ΐ΄Ω ιτٟ)|„ˆbΐ,,±!ιδxΡ―�bύ―χο([ΦΜΤ¬a/Zγͺ‘&`CΓY …}ό,jz�ή³©+V€Q£FQŠ6ω‰wοήQ€H‘\5d'N,ΛάΏŸzτθA .tYGeF‹ž>ϋUmς’`F€`F€`F€‘Όxω’˜H―ίΌ ‘ύγNy‡@΄Ο>£~=;RT7Nhήν…k‡˜€ gα#μCΎΌyθψργYψπα©f͚ԴiS‚fe�\Ή\Φέ΄i“”*˜5k–$^ύ£›3gNΪ·�€Λφ9“`F€`F€`F€ Όxρ’,YI7οά₯?ώxΊΔ}πΘ‘#  ΔΤ NuŠ!΄ΨΩ>~˜€ύψΟq°αόωσ©YΣ&Α²ow;5{6Υ«Wί]1ΞgF€`F€`F€`F€`ΌF€ X―!δœ!ΰ_/Xgνψ2={φμtΰΰ!_6Ιm1Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0N`Φ)4œα-χξέ₯reΛ�Ε‹½mΚ'υΣ¦MK›·lΪ±φΑ»|�87Β0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐX ΐ¬(œδ;ήΎ}K , ±cΗЍ7|Χ°?ZBp―:R½ϊυέχςG³\”`F€`F€`F€`F€p‹°n!βŒ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ &`†ΧbF€`F€`F€`F€`Fΐ-LΐΊ…ˆ 0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#0˜€ n\‹`F€`F€`F€`F€`·0λ".ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ@ΐ`6`Έq-F€`F€`F€`F€`F€`ά"ΐ¬[ˆΈ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0C€ Ψ€αΖ΅F€`F€`F€`F€`F€p‹°n!βŒ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ &`†ΧbF€`F€`F€`F€`Fΐ-LΐΊ…ˆ 0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#0˜€ n\‹`F€`F€`F€`F€`·0λ".ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ@ΐ`6`Έq-F€`F€`F€`F€`F€`ά"ΐ¬[ˆΈ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0C€ Ψ€αΖ΅F€`F€`F€`F€`F€p‹°n!βŒ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ &`†ΧbF€`F€`F€`F€`Fΐ-LΐΊ…ˆ 0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#0˜€ n\‹`F€`F€`F€`F€`·„86Fτhn;ΝF€`F€`F€`F€`F€ Ό|υZv3s†Τ^u7Μ�„yΣΒΉ Weu&`½A‘λ2Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ@HB Δ°ιΣ€Iψp_F€`F€`F€`F€`F€0!N‚€ ؟K�Θ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0! &`CΨ αξ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0ŒΐΗƒ°ΟΉδ#aF€`F€`F€`F€`†°!μ„pwF€`F€`F€`F€`FΰγA€ ؏η\ς‘0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ@C€ ΨvBΈ;Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#πρ ΐμΗs.ωHF€`F€`F€`F€`F „!ΐl;!άF€`F€`F€`F€`F€ψx`φγ9—|$Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#Β`6„ξ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ|<0ϋρœK>F€`F€`F€`F€`F€a0ΒNw‡`F€`F€`F€`F€`>˜€ύxΞ% #ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ„0˜€ a'„»Γ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Lΐ~<璏„`F€`F€`F€`F€`BLΐ†°ΒέaF€`F€`F€`F€`&`?žsΙGΒ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0! &`CΨ αξ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0ŒΐΗƒ°ΟΉδ#aF€`F€`F€`F€`†°!μ„|Œέω$lX †Δρ'μ�ϋύϋ?’�ύ7φΞ»dF€`F€`F€`F€ψ/#ΐμωμς±ƒo}�ξΝ™3‡ΖG7nάδ=Z7Ÿ"E κΨ±#5hΠ€"DŒH‚ecF€`F€`F€`BoήόFKW­§ΫwοΣοΏ�*ϊ̝t@”(‘)Y’ΔT£r9Šν3Χ…9χ£@€ ؏β4†Μƒxψΰ>•,Y’._Ύ":˜>}zΪ²e %H˜(Dτ‡;Α0Œ#ΐ0Œ#ΐ0Œ#ΐΈBΰ·oiψΨiτκυkWΕ8/”"=Z4κΪΎE‰)”wΫS˜€υ).η/ ف<ΉsΡργΗύU/° ηΝ›—φμέ+δΨ 6°±ζφF€`F€`F€`ΌC`ρŠ΅tόΤYοαΪ!μ_EuͺW Ρ}δΞy°ήcθ²…_ŸΏ Ÿφ€7Ώύ9σ³¨Q¨x‘Ότy¬˜ζ¬P±=wΞljΡ’Eˆμ+$κΤ­"ϋƝbF€`F€`F€`½ς7Ÿ κς2t ώg`―Ξ‘£³άΛ#ΐl€‘s_δλΖν»ιύϋΏάΆ(!Bx*W’p¨$a δΟGG΅8*χI_~ω%.\˜²dΙBΙ’%£θΡ£Λ^―^½’;wξΠΩ³gi―πb=}ϊ΄ϋΖ,JδΜ™“φν?`‘ΓIŒ#ΐ0Œ#ΐ0Œ#ΐ0Œ@ΘA }·ώ!§3ά“@C`ά°ΎΦ672`6Ξƒ·δ«κVh%aγΔώœ^ϋC£&jΤ¨Τ΄iSω?]Ίtκπ].oήΌI³fΝ’iΣ¦Ρ‹/\–Υ3£ •§Ο~Υ“x`F€`F€`F€q0βNI tˆ Ψ@5D5Κl œ3ω!Όπd-ιΉ'«¬ΏMxΞώeσœ $lDα½λ‰… †7nLƒ ’ΈqγzRΕ‘ΜΛ—/iΐ€4qβDϊηŸς­ήΠ+Ωͺ-N z~�γŸQxK³1Œ#ΐ0Œ#ΐ0Œ#π±"ΐμΗzf폋 X{<>Ζ-&`}|V½%_UwB; λ ;vlZΈp!•,YRΆWΛƒR͚5ιώύϋnΫaΦ-Dώ*πΏ�ύήΌω’EϋΜ_υRψπ‘cΤ¬e+IΆρEΪ΄n5}ςΙ'i*HκLœ4•žώϊLξ«rΕ ”ε«―‚dΏ½“³ηΞΡͺ5λδnΒPκΦ΅EŠτqGξρ^ ¨aP-΄Ψό…‹θκ΅λ²»yrε€2₯K…ˆ�λΧ:Τ©};!7Mφν₯›3n‚ΡΟͺ•+RζL™Œm^ ]¬[Ώ‘ŽŸ<);>]ZͺS«fˆ<€·o�Ο°OCdί‚«Sη~Ύ@GOœ–2PMΎ«m׍Ή —ΡίbΠ;KζŒ„ΐ!Ae·oί₯ν»χΙέUωΆ,Ŋ#¨vM‡ž ³“ηΟ_�§ŸF VΝQΔ‚l�!qGώωN`1$vϋ$pulαZŒ1‚|^}lΗ†γaφc<«ŽΗΔ¬#&[ °><£Ύ"_U—B3 λŽ€M‘"mέΊ•R₯JE οΰ «–8~΅�–zšΒΗ* δk™2eθόωσz1‡u_°?τμM}πRv؁‹„ΟcΖ’žέ»Ί(:².]ΊL&M‘_.\’6‚DhάΈq(ožάΤ¦UKŠ#Hv_[£¦ΝιΘΡγF³S&§BςΫ!i幐ΖΘW°¨Ρ₯Ε ζPV‘mμΚ–­ψQθ'sZ$V¬X”.mZΡNfy�8-Θ+W­‘>ύ{9°g‘o“Α£ηcΕΚΥtϋφ‘ηύ^$S�¦ICΫ·v{>ΝxΪ±η c‘`JI˜ ₯Lφ…άϋŸοήΣρSΦΟ sχ˜€΅!rοω_ΤwΝcϊ4BXX9Ŋβηl5rσ3z�χ�¨@Ί(”?Md3„!~› X"_“―ͺ[‘•„uEΐ&Nœ˜8 >Άm%u¬ΎZ>}ϊ” (@—/_vΪ€/Ψ ™ΏvΪΎ« |ܝ8ž`h&Π>6φΝ»T―AccpΑΩ ©Z₯ θΫΫYΆCϊEq�U©aοIζPΘ”gΌu +EΏύφ›l­\Ω�4bθ`SΛΑ·iΎ~τϋ˜ Ψΰ;/ώέσ=1艁8e-›7£δΙ’ͺMcΩΆC'Ϊ±s·άΖΐάO[7R„`τ\³a ­Yoϋ0:iZyRͺXaͺU½’)翳銼ω/°›Άν ε+Χ'ΟδX±bRŸ:ޟGŸ’]{m^;·k)gKBΘ €‰SgyΤ›b… PύΪΥμΚβύ―GΏ‘τπΡc»t}ή°Γφ¦˜1’λΙνzΏΑ£θΖ­Ϋn/\ΈpΤ΄Aʝσ·eύS`ό”™τΗo)λW©Tρ"U]έΓ…CQΌ]»φ@/_½vΪk<Γ[4�ο1ζ»υ% RxjˆX?yμ0O‹{]Ξ6Ω‰)kfηςlx7|όδ]ΏuGΌώξuŸ‚»ύ»Q”(Άo wΒI’cAΑέ%c�΅ͺ”'Δ0 T΅ιΪO�»ϋγ ϋΫ»©ξ΄»bΰΨ±΅π‚§L›ΰSʜδSʚτSJ/’�όs£ϊ•+W(GŽNύW X? €`©S§’u«V˜yΊ�³O?Z³v½§ΕïaTͺT Λ»+ψBhώNš<•Ξ‹i€5«W%Ί;f͝g$ύrφ€ΧŽ‘+:ιP0>š:y‚Ϋ½ϊ‡€Ec)’'£υkVΊ%vέξX+ΰ †fνc"`ρ‚ZώΫΚoUO¬_οžT½ZOŠΚϋ/(Xά8Κ6­_cIŒ©ό ^š―&`ƒϊ ψfG§†MšΝš1• ua6̘¨\½–‘ ξZ5ͺΫAΉ2jόT9-WνSΘγ O•Δ γΛ©εΧnά³[ώVΩT©BiͺTΎŒ±ύ_ZqEήό—؁ΓΖ�Υλ7δ©o\Ώ6̟Ϋα2˜:kΎ”(@ΖΤqΓ Rΐ‘`0&lάϊ­Xe{‹ξF2κΫr₯$¬n#ΗM¦σΏΨή!αε Wx>|τ„Ž?)€‘ώ•ΕˆwτΠ~zՏv]'`!££xπ"oίΎ3glρ<νZ5₯lb“―Lέ‡ι�€¦]Ϊ:4λκv(Šz!f&έ•=Ήγ›¬”H<ß={N‡ ΄°O> KγGφh6ΓΈI3άzΐbf&<Ώa˜!1iΜPΉM •*–%_߈Q§MΫmή eK&Œ’Ή²ΠFΒ:#`GŽI:u²;Τ%JΠ�]»(ώόΤΉsg*[Ά¬]Ύ³έ»wӈ#hηΝ”1cF:uκ”]ΡωσηSΓ† ν�Τ†/ΨΙS§Ϋ}€‘νsηΟΩM/Z€₯L‘RνV.£G�Œ~Wί.-¨6Ό%`>|DEKΪˆ6¨_ ‹—τ ιΣΣρ'iσ–­΄qΣγ<υό4*xΉβ yθε.<ͺŽGbΦ칍iλϋυ¦*•έ{R™ X%WφπbyςΤiρίώZοΠ�u€Ό™ˆ'š ΄‰€1k6›0Ω€ϊ£M7€|ysΣe1Έσ£_X΅z­‘ιΏ'φZLuή°i“Λ’ψˆ6b”Q&A‚ψ΄s›ko=£°XΑ΅’ΏpqA&=—Ι)’'£B+9$™ωϊa6$Οϋβ)‹ρہί˜―iYΙ.]ΉJCFϊ LδΘ–ELSmlΧ2|87| }¦It€”jΧ₯— ²Έ6>vΣ X\fωΰb;0 ψL›0Βg± Τ}ψ_"`1‚AXΤ(Qhό¨A^°Κπ οΤ½αΫ†™ ΅kTVΩ^-!ΩXΡBωι»:A7θKVpφη‹4cήR΅κ–…ςε2η]ϋI‚rAEΐ†�DH’UΩλ?�‘WΨΓT–Ν Ε’b*Ώ―-A»‹�·άWŸΡ¬Ζ‰}Φ<$ϊ―{B‘"„‘ώγQLM‚€=`m0�g Ψ₯«6 έ›{4³”+YΨ#½™Sg‘“g–θeΣFΎώΚωtu%›IXΆ5+ϋιδ©r!aiEΐ*’#•ΊΑσUM“E:‚reȐNŠ ˆt�βΕ I(Ĉƒ’%KFY…vάΓ‡iΥͺUF3x)~ύϊ΅π8π#²AB*Tˆφοίo”S+Ύ `U[ϊr΅JΤ«―νιΣ§L’όωςθEΦαmΉHόϋο�(}Ί4”&u# C-α‚Π_½qσa(`%šGYE's0¬_Ε”šΏ�ω›6nN·nί–-@oqώœ™rύӈŸz΄ΏΉσΠΘΡγŒτθΦ…κΦφσjR ,Z’6Iמ|$¦�)b(‚πˆN•�qΠš²OŸ<•υ1M5•KPΨΗ¦ΏαE7Ν‡b[o�|KS¦Ξ™Ω΄kϋ #΄>r±…W†ΩΰιtγΖ ©eϋλσ_…gpj©±?^\sQm�όΛ/T½V=£ΞΎ]?Yξί(πaΕLΐ^8gOΆ’ΨΦν;¨cη�FUh’;΄OnΓkσω―Ώy)Ύπ<7Ϋγ'OθΧg~ε�¦MCΏ -O14hŠ€…ΗΗΙΣgθΪ΅kς~Ν(ξe+άΝύΑ΄σK—�ΠυΧ)nœΈβ€‘’οΞ^αšύaκY̘1%‘ƒ6±ίCGމιΝαΕ}”Jo2?sΜϋ6oγΌαό)³:w-[΅₯½ϋ¨"tδΐ^‡ϋΞΘτηʏBsΆο€AF­ύϊςΎ’±νnεΐ‘ΓΤ¬E+£X·�©~έΪΖ6VπLxόΨ6TΏΗ s{Bό….fκΤ))]Ίt–ηχΫ½{χŒ6qύ`°E7<ΫnkS3υ2ζλ'°X\7Ε3R™κžAϊψύί©ˆψˆίώ₯Τ›η2~ΟΞύό‹ΐπ})�μΏQο…fψ΅«ΧTW(•Έ>ΥυννsΡhT¬ΰ·οξέ{tAxήΟϋ$‰‰>€%H˜Ι½Φρ|ύYΜ.Έ}碘Φϊ%LP "&£τb€M7Μ:A°΄'NQ!I£lψΰ”#gvΉ[ΜJΡ―‰ι3gΣψ‰“UQ -ΨNέϋ YΫΐD‘‚ω¨AέFΜ+“gΜ^}Άηo†t©©[§Άζ"rZπwΔ½πμΧ—� ώ΅ΛβΊΐΐKκ”Ι=žΊŽσ Rϊ©R$χΘΓKυλή½τHjιΣ€rι©ι dΘ•kΧιοΏ�₯τiSΩ]ͺ?Ξ– ύξή u^ζ X�ž³?τ‘d¦ΧϘθ78¦χ; μσ/Ε9ΌEΙ“&šωŽο'zϋVλ.]η�7ρ ‘Ρ£λfΤψ)βΩtQ” G³§Ψ,«v­�tάkV«HeJu(ΆdωjΪΊΓζ\βŠτBΐ»λ7o‹gβ{Jš$±GίM; ! ξXΥMu a»νχM雬™U–WΛ€°Έ·ξˆη@ΪT)μˆtwόΔέϋβύ@<«"3€½―ˆχC1U>�ΠΗ ˆΝY°ŒφΉ1X›–M,ƒΒSΫ°”βωΨ·{GΉξΝHp4mέY<ΛώΟ±°4c�h;βΧ›Ά=©φςΥτLΡaΔβΗ‹#Ÿ5xΡmφΒtκ'‘§σΊw[ELßlš†�Χ?�£swίR›…ιΖΣχƁL¬›Π§^ͺh8°X£Σ+LΐΪ@ωΟ°3,7.‹ΚεJxό; »zγvcŸMλ;�x0 Êϋγ?R•*Udoπα€Ό[‘Cιςρ±?~|ωρ‰Ά±―…ΔΗ΅ΩB‹π1γ&Ϊι™κύD€θ.;θz‚P 4Δ Sυ<|πV―ZYjƒ*β)SΦμ†W‚^V­•93-]4Om:]š‰ΥIΖ ςΒ~Š*ƒœ4eͺΡNm1Υ4CΫ|ϋŽ]„`ώN™§‡Fa±2pπPZΊόG™„γ9ϊΈ‘=eϊ !A0ΝΨ>sβˆΤ4η2 h+f2sΣζ­ΤMSΓK•Ω,kܘ$’„,± Ζ·oΩ`ή…εΆ',*ΦkΠΔΞφΨαύ�ΐ¬‘;¨_™«ϊ‡χ»Ψyp[uPah&ΠφοήAΓFŽ"`jΆvmZQ³&,½†._ΎBmΪw’ƒζz8χ½{t³œή―{sγlΦ΄15jΪBj‘ινϋΙΖJΙ =έΥz‡.?Π³§6r:ož\Τ’Y‡βζλψaϊ‘·†Ό‹ƒRπ�έ»s›ΏH‹ΑCGΠβ₯ˌ�ΐϋ5EςdΖ6VFO³ηΞ—iΠ3Vθρ=•ϋP8ā,»ˆΰRΞΘ‰ΛW―Σ€i³eΰ0UKτ±€πτͺQ₯‚ε³d߈±“₯~'ŽIΘΈr₯‹[Κ,xCΐ^j“§Ο‘±Ϊ–Π,oΩτ;ʜ1ƒžl·>IΤ;yϊ¬$₯U¦ϋΦ©Q…žŠΖ€αςο9Sδ–κƒΎΔ{&“uλ3˜|πμΦσΥϊ¨!}νΞ%ι SfΡY1H£¦μ£,GΎL/‚;ΆiαπΌ‡^1t‹aγG’‘‚H½/H0uφκJI‰λΞzΔξή—³ξό«] ruǞύrΓτ΄;&΅ί=Β»vŽπ²…eSΒΫ4o€²δςΔιs4ρrze�νΔ5X²haͺ.�έΠfž°k7n₯ΥλlΏ ŠœΖωkΠΌ<Έ/¦ŽnyψΈη°=0T₯b9ΓΤͺBΚδΙ¨oN2Λ|8~ƒsΊΜ ήΎΑ€œ΄{ρς•Γ5‡ΖAB¦‰ΪΆpΠ=¦α%ϊςεk᝸ې@}\σΚ” Κί–Ε¦Ηvψθ :α’xΞAΔj`χ$ξM˜―Ψ₯+ΦΠ–ŸvΙ6­4’eF ώ ;lμTI˜«nEΞ[υkV¦/Εu€μΠΡ“΄ψG?k•ώUΖτ"˜YAάΖB�ΠΓΗOι–ψύΊxΩo Y•UK΄Ÿ9CZρέ“@ՏDs.K½Yθ‘~1‚,ϊσΕ+β·σ©\O“*9}‘8‘\‡Ηψ±“gUsrQΤΙ―i©ξΪwΨΘΗ33^œΟε6WΟ‹})Λ“γkΒ΅ ;}ξα7=k¦ "Θζτ―ΈχΦoήa§!œBΜB^B1 }B+χώΓΗ„η–+K—&₯$Άγ‹ίnόΞb€αΚ΅›œ¬ήίAλΕ7ωΫ7M€πaθβ°΄τ©X:3(ΙόrοOϊ[`”9I$ ΦYI[Ί Ψ'―�¦kOή‰>'ͺψ)jD7;°Ψ½'¬σ₯λίΡ#±Ώδ±#P’Xαε3Γ’Ή Ob X/!Χ X�‘%`Ρέ€ξΣΛCυWu3›T|ΌΑ3 fK˜0!=zd›–hΞσt;’Πy)°χβ<8NαΥοCH¦DU²γe«? γqMΐτΊτΐ@”3λέ­ƒπlMa—}ςΜ99ΰ£Ψp€ιΫ­#αΩ£ Η„cƒΑσέiηισX΅νΙrή’εFPΌE QݚU<©ζ΄Μ_β7rxFαωE²ΑiLΐz‰~@ΙΠ�Ϋ΅kW6l˜ڐψJxΘθSY y€)Θηϟ'Ήf=z4uι�Ε.9Έ Ψ±γ'ΡΜΩsŒ>h­T©…?κ?�\cη ΨκϋζΤͺ…ŸW©rί š»F]‘Κ™=;έ{pŸ–-ϋΡΞσIyΎ΅nΫ^|θύFgΞΒ£δY/Κ;ιλ¬Y<ςD:-ˆμ:υϋΖ Θ§ŠΚS1α½πUζLn=š½%œ°“§M§#GŽΣυλΧεΤXΥIψΑΗ¨λΜιSd²Y·DλwυκR̘ΡΕ΄δƒtXLaWζ©w°*%Ό;rη/d$͟;“²kηŒ ‹O ΨN]»Σ–­ΫŒτ K%J—7�!œηΣΗK/UΨμ™8d`ͺψmyς†fFΥvΖ/ΏΧDd:%Ό—0]0F?Τ<¦::₯κzDΉ”Bj"‡ΐιήύ{rzΈͺ‹εˆ‘ƒ $―2€UiππKŸ6 ?yΚnίΘw&—‘κz²„ΗΘΎύhΩςtππ£Š‚p•,V€Wž… /^Ο>A«V‹*Iΐ.Κpύƒ3›Nΐκy ³γƎ-e$ti”Ρ½TC+«ŽχE’D ι­ ν{χμ.Ÿ_ή<——­ψQΜJ°}lͺ}ΐk4Eς€2` •Gͺ/ XΘδ/TΜξ~ΒoC!©rU ~κšΕΈμέ)=ζΡWσσϊ¬5kTΧAqΆX)T ?M™4žvνΩGs…μΣgOν~ mGΤƒ κίGxεΩ:Ίη:΁Υΰ€¬ΰύω³πš‚y«ιΪ²έBΎβΩΘ…b#nάΟιΐ‘cv`ΜΔ‚"`eEρ'‘ώU©BY‚η Ό�V­έhx¦!ZzΛ&ί©’β7ώ!υθ;ΔΨN/<ͺ‹ ύuΐϋ„œ$H<³gΞoΎ<9©Ιw΅νΞ΅Ή«mόφ΄hΫUz™!܈+f YδCγο;Χ‚˜)OΌ+D‘ƒβz€‡―Μ0{ [ν+$₯yJΐκΪ‘ϊΰΓώƒGhζΌΕςΜχΌ:Ξ¦­:I\qύA:x*MΩAΓΗΙb‰„ΗaΓ’*±Δ7QμΟcΙtύF4S«V*'<ύ’Iού%+VKRy ήΖ€UiΨOs<;>ΌΛΑ;Ώ\©βτE’„tωΪ Z'Όz!]CήΘΑ}δ:ώθ,Άqm•.^Dnϋγ?i£ Qχ ς¦A‘"Ωξ”χΖtocόΞX fω·}ύΩ€?_ύێ7ε}Eΐ‚XνΪΞο»ς� Λ‡›&»ΟΟA½:9¨ζ~›ΙNxΚ’Mgο«ϊ…o\eAMΐͺύκKEΐvjέ„ΰύκΚpτ2Vzςͺr …A{bΑMΐ^„i‘„iͺxβ°gJ»nOίσœϊ�~l—fήθ_).5/lσ6>χO*>ς¦Ήˆ±]0mZήΚΣΆ‚H]!UW6½A"ϊφλhF‘%‡_RΗ₯εφ†Iν`g,Hζ’β8!ΑΰΜpό»»₯ hη—1λ%ςLΐZhφ€Eΐ¬‚ :nΩ²%MŸ>έ!= 7€ΜΩ~ZŽ™„‡§nΑIΐB{³p±RFwΰ}8wΦ4ƒ ƒ'Ό‘.\Ό(Λΰεαπώέ’θτUΆF]žƎ6ΆAΜ6ϋΎ΅”v@bχ�]$±  θΏπ[·j…ΚςxιnͺŠδΙ¨H‘BT£FU‘‡ηHˆ«ΐ“Rz0LOΩ.¦OƒμR†©΅ππR6{Ζ4ʝΛw•ξl OΠ�έ{Κlœ?xιbι‰yBΐ‚Μ)RΌ΄AΆ νs§ŽLf­ΕΉ³¦SΞ~€άBvAŸ&}όΘ9-TυΟ Ν,HKšΌΟΕΰJ©²ίSιΡφO[7Χ΄’α1� ZΒ I•?y’Ύkθη ’€‘�Μ4°%Š₯Q#†Κϋ€“&M₯Ysη©ζ¨l™R4r˜yadx°MΨ‹—.x«*8ζΞΫYκ «2ώYΜ3—Ζ YeŠW۞,‘횿p1£hυͺU¨_Ϋ΅h$Š+VΧ¬ά�Cg;Ϋ’%‹ΣΨ‘Γe3‘™€mΩ¬)΅lΡΤxζβ€Όy.ƒxȝΏ°έ΅ή»g7ͺ%€W` †EπnΦΝ—lίώƒμ΄―Νƒ>‡Ž₯&ΝZ»oΤ ΎΈvΫΛmΜjΐμef9‰α#F ΟQ›§ 4aα-―Μ<˜5kΖTΚ“+§ΚvXΊ{φ8Tπa<+!›>ad€?φ‘a¨<» έ ²M7xΒύέΑ}»Ω:ϋ…πt$<ήt»)ΌqϊΆyΐ›Ιn}ΕTχdq+.}Ώ‘>ύ”¦O΄΅£O›ΝώυWR3Qί§N˜Β“m¦πμR¦“7ž°ΊGdJΊmήΎ“–ύΈV&„Χ QΛ[Άοjt½~hO:y‰2Ί3Ά=%`½9g؏�οτFV4H θ„6>ΠAΏύσOμRxΑφ’΄©uςγΉ©ΐ’<ψσ]³ΆΡιͺΈωΪsUVε 3ΙπLΖΰ@χΞmU–τ°ν;Ψv]}%΅oΥΜΘΓ Hw5=ΏvυΚ’\Ά+‚7`)“ϋΙΘρƒP§$%τϋέLΐφνΡQ΄‘\U•K%Ι‚ ΥΟS�Η&`½D Xku£a―„w€ ΅  AΓ+ΓΊ%ΟSρB`J;Π =k�₯,8 X_ψU¦{•©4³§)>xAΤβEIχnΓ4²S'‰)ς©TU—K_°ΎΣω‡ξtΰ νΚΥK•*A m+eΑMΐ‚Ό,X€„κυι՝jV―flc^Άy$ήΨaΣ¦΅y4W ΡmΫ~’EςζΞexήΊͺ£ςΜμΟgNΘ,Ό€cZζΰjΠ°F 3dš§θƒd(RΌ”jRA „”εΘSΐ ‹ΜuQ& l—Nν©αwυΥ.δ�L²κδL>α­§‚±α£γπώ½�»Hoΐ\υŠ₯"(TZYΔLΐšƒ`=X(Rάh.ƒ"΄rωbcΫ?+εΎ­,ƒέ™λ€Τ­W§–₯¦¦Ή¬»mxΣε-PΔπ܍#ΌPwοΨκΤ›ΐY{Χoά€ςύ^&‘_ΫΆυχΕΝ¬™Gxΐ‚XΔs)‡Cb0Z Xσ •<ρΗ›ηςνΫw¨tωŠͺ)9νήμuŒϋ·h‰�ˆΒΎ$`υϋ©h?ω£SbE—Ν€§:4yafΟ_\/ h1ΐΰΞόKΐ‚̝ΏΘο>ά±u“˜Ή’ΐέn|’―< ρ�210My¬πΠ΅6uvpŸn”ΔbŠηχν»IAy»©~*’ΕL’ͺ|,Ab]ΏyKzC*’FM;Η»Ψμ)c,‡ž(=hΡƘaύ-½η<%`U?πΣο­¬E»��Σ�³&‘E λˆ@V°΄"`Ο�Ά™ ύQ^œH�‰,­H€V34ζ VκΦ³k;©iξθO»φ�Β₯+e2¦οc?L'`+–+εoΝL΄ηxΓ~˜βϊΚ+KrεΘFQ„ηα^ቩΘ6”χO„wδΗυ9iΜ;\δ—QλG΄” Γ~C›Ή"`ρύqξ—‹4{ώƒ€Œ.ζN=Δξ0Up4$šeΖO™)f€œ“ε­žκ~σ„€…^*ΌΝ¦KG@ί7‘˜SΟ¬λΟl+ƒDΑψΙ3ε¦ή€΅’EA]3Ψ,Y‘Ϊχd©ž'zY<οςδΚN΅ͺU’šΗzžΧg/X"£ΛjVƒ_ώm/ εBΐώ΄ϋ€xοx*w/nlI*b©ΫΒekθΘ‰ΣRχtΤΐΖ{§Y � ΄ϋvkgTU�πdήΟo0ή�c'Ο–z±(Œ•ψ=TμΪMΫ xθΦ­CK©s«�ž,4½«M�§‹˜-π™άΦIΤz5*Q�μYrη~ΉDΣη.1Ά+—/EE ζ1ΆυΊF’“•qΓϊ:ΙρKφ―jvƒ.=x'Ή;6αZqόm:rέFZB6ςΊιR ˜Χԏ”F9w°#6=₯5§^Λ@p³…”AϊDŸκΝS‘Bα‘­_‡{ =έ8ΆwΟ€°I;^’w�’ΖOGϋΨs#w…΄BυΙw€wlεlΡ©GyΫl-»ΞΡ°^Ν¬5€: Bτ¦ΠQΣ £Ϋ·o§�₯m/—zž7λ .€Ϊ΅mS§°5ΚϋΝ7ίΠ©SΆQ:΄œ¬ωcWяSΆnέn$ θΫ›ͺV©$·u}GUS]ᑉiξΉrη”D‰ΚΣ—Ύ `U{ΗOœWkh»ΠΤ§š«|΅Τ?τ‘άμ±γ'¨Aγfͺ{³„bκŒΩΰΕͺˆ§’Ε‹�ΨΡ6o"s9«νorε5¦‘[ΌVuTš™€UιΞ– I@bΔ/FΊU­QΗπ’™·WLe‡]Σ\+W―e7f$Α{T·€°z€%ΥΦξ½ϋ¨UΏ>xkƒƒ—wζ―ύ<ŠΛ—/Kˆžn63Ή3jψ*SΪF,λ,¦LοάΆΩ\t)ΘlXύ£CO@¨Ÿ:yZz&™§ε£Ύ z«}"°δ5”™u:UΊ»ε©Σ§©ξwbέΊv¦ϊukΫjΕLΐ�_³’R o4³!ˆΦΞ]{Œd ΰΓ&΄°Γ‡ ’ςεΚΗ£VΌy.οΣΏqί*sζΉκ¦νΆλB₯΅hTΗΠΎU-‚h΅kΡP‘#βχdας5Ζ6VŠΞGΛ–0�‚š€Ε±@rΐlc†τ2‹ήΏ�‹¦Ο[bW€BιbvZΈύ‡'xΡvψΎ1₯J‘T–Ε΅Ρ{π»€^ΘΪ·«‘εΨ3ο�ΦσΏΙ>ονž‚�&ˆ(ׁϊ•Έ΅­K2™fώ“ΉΧUBπ¬Ο> KWGΨaTUΏάWŸΡ¬Ζ‰U²ΗΛ…_P—εdωΉMSιΜ6Β; lΚ.—ιχw�Šί"’“ύSSΒα<ξGPdΦK΄™€΅P'`³gΟNGu(Έ`ΑjΠ CΊ7 £F’Ž;:4Q�\9ڼُ  NΦLh8tΦ"‘qΓο¨SΫ¨#"IΧͺΧΐ%鉩―­Z6³›Vf}Iΐκέ„ˆΝ»vΡ‘ΓG βR•-¦†—.URn7k₯Υ¨ϊιl™6mBτtOΜι{ΧO[eΐ OꒌXx$N7ڈL�οcω+©�ΐ!F’ς΄"†—Θ“ΗΣϊUα€°ͺ}Υ–.\€ͺ5λIŠ€5{ :#0!©Νceί7oF­[΅›:λLNCχψσ†€UϋΗtvˆιΨS§Ο2Όˆ‘n–y@š§fφ4 ¨χ+φgφžw6`&`U0;sŸΝΣΣAtƒπ­¬3‚Π›η2k κ7mtΑάY–χδζ-[ΕμΔΎ"`Νχ‰±7+ŠLG±.έzΠ¦Ν[Φ€ΆkΧΝ¨H‘veόKΐΞ[°FŒk΄±jωAΐ¦3ΆseΐΠ1†n"‚Tιcό»_¬πhDtr5PgΥ†3V'WΝυI«—Ωwΰ0Ν^t0]?�\ΧΌmφz4η[mW(SRjD"ΟΏ¬�giΥΆUššj?f‚ΰ$‚…Α†τοA‰xFλΎόCΐτœ‘?Ύ `[uθζ< m;3cYΣ Ψώ=;ˆL!uωCpΖxqγRΜΡ-w­ŠV—z%=°�;ΆΣΘ3Y֜:{^Ό{Μ3τDυv0›«Aݚ„»δΉV@IDAT >ž˜§R ž΄εͺLαy©a½š�Аޗ«‚ΐ»K»ο>w”‡Ύ.’Λ@?΅VυJ»πkφbWιΑύ«?;¬δRT],Uίuv€u¦™ͺ—ρ†€Υϋ‚uhF#θ  όeεul�γl{ΖάEBΫΫφ λμ8«λλt_°π…W¨²\bΰ­^MΗkLε[-[uξCy…dAm!] LyΤͺm,‘wή³S+#)¨ Ψ½�Š5›ŒύcΕμΉk—ιdcΖΌ₯Ι†=;ΧOŸ=§~ΓΖ9ΤΠ5bCϋνΈΫtτ†ΝΣυβΠ43Κ'―ΠμύlςΉRFv:-θΖ'²,ςΡϋAs�°Πf½x�=yσ7½ψύzώϋίtόΖ[ΪxΦ&CD., l ααͺίΚ›:2ΥΞƒŠ}ωEl?@&wL˜€υψ€°ˆ`Ίq›mT©\ΙΒvnωξΊΠ}ΊkΧ—ω:›/_>Ϊ·oŸCσΛ—/§Z΅ό<ρ  aβΔ‰Τͺ•ί^5QΉreZ»v­Ϊ VX€D‡@’Ή³FΎ£& Ε0~ΚΤ΄aΣ&ΓΣ�Θό°r Ϊ¦ K”«ΪΗ”š΅°‹^£ZUκΫΫF<θΗ―{aιm€8ΓqθZœαRυέ‘‡fβΣί#„ ͺ[.³|•Yž±Μ4%Nž:πζΜ3ΣTΕnΣ‹ώ¦J™Jz§5oΪΨiΠ3zP½GL+._Ή]Ώv]&C"b̈aͺˆ±t‡! š5`ύCΐ>ΑdŠ•*kμΧvΗmm΅bžNί�M+Β1Γ‚‹€U};{ξΥͺΫ@mJΟ^]ΩΘπ`Ε¬9μΜKΣƒ¦θςε+U� ΈΝf&`Ν:ΐͺ<ˆEŒΚΰI ‚Ψ|™uCQ~ΗΞέΤΆC'UUNyWž”��ŸϋPρR~žzxvΰ;rτ8A·Z™3V.‘¬žΛf,ζ̜NΉr:zο™eόKΐ:{.ή»_z{«cΔ3σ3‘™μΚŠ2{wn³σδAPΏΉσΡΟB7έ™ΥΑΉ΄L™ XxΏΒ V™BλΝsΩLBκΈ€‘2³Μ3ΦόΜSυ=ρbŸ1Λ7ͺιžβF’?V@Œœ>}–ŽŠίν΅λ7²ͺ ]oΩ|μΞnU·O�rπFmά·KxβΕP›Ίά&‹ °8±cΡθ‘ύέξ£=z*§±‚Œ‚ιz€Π7//¦UΟΧ.¨—�qυ Ώ�½Θύgύ*#uhν7¨ ]όξ'ž/πΐCΰ'�˜ X}š{Nδ₯Uӆ€7Lζcn`βΤYtόΤY™μ)λΝ9Î|Aΐφ0Œξ 2ζΜQfZόρ ǏGΛΦ“%ύ˜FlޝθΜ™fθΝ[·©Ώπ(Η³抨5·―Ά1΅ϋΈφΩΊcœY’�Ώ-[ŠͺTτ Uι!u©°ήH›ΌxωJj�β8Υ”}%?MVh³ZY`°Ψ—%τΰmΊw«―=`ΰ Χ^8A†Ί"D‘) miXύΪΥ¨Xa?§™θζ�Ϋ\¦DQͺYΝρϋ�M>Ν;lμTH iή 6eΘΞθΣΉŸ…n©6ε>«‚Φ€~ #�η‹Wθ„ΐεΜ ³sϊά/τ΅ψMj\―ΊQlεΊ-΄ϋƒf�JL2΅oΩHm’3ΟΪwh”ΓŠYΎ`ς¬…R.yΫ45eέ½�pΌΚ&²ύfbۊ€1άK—�λ·Ψ~ƒŒDΣ 4ί½{O=;·’„‚$βΩΪMΡfΓρβΈaΑMΐώωΧ�(yηKb0A8EG§¦–ύΪ"`5œuO�#VT!1ΰΞ~κšΒnjΏ;vϊžηΤw΅ν·G΅ώ“09b!iπ ύωώ_q σ–€UνοA·­Bξ�)Y₯c_�φ.ɍ az^P­3λ%�ΑA†Η>ύ “Nΐ&Nœ˜ξάΉγΠΔ‘•[ xΨϊΚ°μΟl_‹VgΜ1’ƒ“€…ΆhΧξ~/RΞH°‡"š"’GΒbƌ)Yα#κΟw~£:zp+”3OEύ*sfZΊh²€ι,“Ψ³Cey΄Τƒ7Ή"ŠΜYΊ†ͺ9°’š�¬:°‚"x�KΈ f&#όKΐ*=ΥΎ9J<G!€”Ω@ΔaτY|dΗηΐ™½NyΒΉjΗ—μΦν;¨cg?ΈG·.4d˜θ„vμ)!?€Qq³™ X3†(οŠ@Sν9“ @>‚„©ˆδ8Η‡Ep'xDλfΖbΓΪU”2ErY$°X³Χ­3RܟEKϊi‰Z°xα²ΒW?ΖAC†Σ’eˍ€CSΉ²₯m��ΌΟ‡¬ΩύHυ’E¬2™ Ψ’%‹ΣΨ‘φ/f2χΌ�†FuΗ�݌ξ!Ψ^•Κφ':aˆ‚!™€υζΉlφΨ΅Ίπ\Λ[°ˆl…Nΐzϋ\‰™0gτφBώ°pŸ„£ψ>ފηάΏx+Exp*Γ` ~―ty‚% ηR–―l^fZΞΠtvfϊ Κx;ιl?VιΆHΦ]ŒΑŽ.ν[Q¦/ύ>FΝu ΪΉG™ ΕGΙuHkίΊ™ψψΜd�JjŠ΄―Xμ@-π²9i΄ε τ8o QxŸ‚<ƒ΅νάSzδbPgκψαΡ¨e!'όKΐ’ΥO�Ύ§ιsȞ€O›šΊwvœLD#yσ”€υζœa?ώ%`­΄6'NŸCΗE €!’½§ζ VŸf^½J*WͺΈεξϋ-Ή!sԐΎ�;Y/ˆΑ€ξBƒU Β^Ωޘ�#›2y2κ+tdC‹ωŠ€Ερvι9@DhJ!θάΎ% 6VΒπ]κ2(š&κ~s†›«{X΅§_J‚yΊnΆ³ \–7i†lΚY._°*Ÿώ\VΗ’/υΰfujV¦’E λΩ.ΧAͺ΅ξΨ=ΔxΏ’³ή°Œυ^Šίχ1"XτQaΘοέ₯\ǟ+Χo�ψ©sm΅’t„1³ΰ7SGΑ¬”A}ψΈijS.Φ©&žy~Ώ•:Ϋ€~Mʚ9ƒQ~ΚμEτ‹ •A—ϊ΄Κ|Eΐ’=ƒ ίםz–λϊxο*’�ΧηΆw¨–λRΖτiŒbΐ…@\Κ€Q?°LaάlΟ•iφΎη²{�F¦­’ΚυΫΟώ’œ�Ιυ¦cΡΐ*ρΤ!xΌtGΐ&jQπΆζˆEurG§ Z �Ν‚nτφ«:WΫ·ώ …‡^�ͺ㯌~L…–·ϊB ς%°^BP2τΑ£'΄οΝ+΄@žb%�Η= θ>=ށ κ,^ϊρΡ-Z4‡–α­Ί~ύz‡τ€$δΙ“‡8ΰP#t 0Χ¦;'kερΆlρ;©s€θιS&ΙHχ[·ύDE@ efO'3yο½S'©βrΚ4¦N+Σ?€Uš«%=8‚7uδ%‚Ύ(»vνuθΪݘζŽtTš;=N'Δ=»w‘A^@ˆΠ?φύKΐš Zh†b ΆξQhd6ξLŒKu A‡@)ϋ�nϊ‘«ϋ”BΏO;,=§T;ž,Ν€£ς8τ€�ΉΜ{1Έ‘-GγC €« ˜† nξfež`θ-;~βdš>sΆ±{xIOž0Nx‘E’i %AN*ƒœΓO[6/3Eΐbz5œΗΡ#‡Q‘‚ b DWα]|υƒžκΤ�Yƒzυ°έ›Ο„@Χξ=Σίq}>ΨξAyΨ“§O©PQ›62Ά‘ƒ·sϋ»kιώ5Œs6Πb&`±Θ@(©τ­A£ftλφmcχΊG·YκSφφο+pΚ/_T—._A3κb%$°ή<—qlzΐ7lW«R™ Ώ‹λΔgϋ otδΓtΦΫη’Y«·}ΫVΤ¬IcێΔ_hWͺZݐ¬Ρ5‘1€$NΆmΪ@Ÿ‹`*Κ #9 eλW― T©RΙM³ξγ©“&8•FΡρπ»±}ΛΥl,u’ηζ‡Ž­€Ω Š`Xψ‡ʟ—‰D˜NζYyjN›½€9.Λϊ’€Υχk‘ώη —iΔXΫο=naΊ,LŸΪœ1C:κΪ‘•LWπ}άΫwm^0π΄ƒ$Μy£ˆΨ ³•uν5Π\³’z@€œΎƒFˆϋ⭐hˆL>χyϋφOjΩώΓ«$H%έtύW€„€υο9Γ~Ψ‘Bπκ'tnC‹ω’€E ,`Kš4 έΎ}WΎσΜ™:Φxχ1γ’ξCgd€«{X΅₯?uvώβR.ε0ψέ·»ί{1�ΰ‰Ϊ©[_CrEž˜°:ζ …v°ωzBߞβ=LΜPΠpΏE�π Oύ-ΫwQξίΘ`p(oΆ Sf οOΫχ+0hάζ-‹ώ›‰Πλ7οv–qhΓΕΤz<—a § bQ‘‘ ;Άj,$šlίσΊφ騁=μfjKWΩ~ίK+HeK±{·Υ ΨΚεKRQν™Bxύ–"8έ-¨/;Υ¬\Ξ��/ Ψο›Τ£/5νιν»φΣΊΝ?xΰx“‹{Q©\ι\¦x!yLͺΰkρΞ0kΑr1xu›βŠ ΘMΤ4xΈxbyY½q»Q΄©6UΐH +:‹ξlίΎŠs!?-"vηΚ•Λk/Xk;vμ Β…G7αω Xέ‚“€E?fΞC˜Žͺ ‚ˆ8¦³b4Yy2!_�HΕ5“#w~UM.1΅όλ¬Yθήύ{rκ΄"ؐ9rΨ*[¦”QΎwΏ΄jυZc+ hŠ.θ”ŒΣ Ÿ9{–jΧk¨'Ιu/)S¦€ΛW�Ψyx!^ΠTΔΪ₯K—©rυZm œU„y`γ X3ITH$>φΧ­Z!χ Γκ΅κΩυ!k–,”0a|ϊEL/ΡI'Β”πΈqβΨ•·ΪΠΩθ² Ve₯ω’€Ε>τ>ιϋtEΎ{‚‘·,�SΚΣ}AœTL„—²ŠΦ�ϊl&Ι“€1έ^¬�§ƒ"Ohοώ£΄�Π―ˆβš#’‡+ύΕ9 –ΡA’Απ›]ΆT1ρ‘˜CΤ}F+V­ήD~ƒΎ$` y‘z’ϋΕx‰–(VHθΉ‰ΗNˆιάgΞ°όysIMN¬ΓS^£πΒ†Ψ©V±œπ9sξgA° ΄ 3{­Ί"oρc&`oŠλ­οΰ‘²=όΙ“+»Π- ½�O9G[~ΪeΰŸC}iέΌ‘QVΗοuΠ͞ν+IΦξΨ΅~ΎpΙ(‹O X½]�ž3μΗvΣΆ΄|ε:—Œ₯J‘δNκ”~œ½…vιmα‘ ƒ~`έU(mšTtυΪ yψιΌ0ϋ‘ω©4}Aΐ’]ε uDΆ‡nk¦/ΣΛ)΅;χξ'άψƒXΑͺ 3‚:uο'œώIΈVr‹gφy¬†~,¦c:8 ΗVQ΄W\ΠΥάwπm٢Ӑ·ͺ!„ΎoέΦΑ#Κ�“bΒKΝ7¦]#υšu�KΤ\ΦΌ]¬ha7z€έεΕ‹©J:ζ’d€'ΆvέκΡΫο%ΛU|ˆC2ΙΓSZ1εΧΚP§β·ε ’Ϋώ!`AD/Y֎ΨSϋΡ½I§Ξ˜I'MUYN—cF§R%­§κ™+ιή]˜ξύM�š― Xσaτ„ω!1εί™y‚‘·,φ =ή­ΪΨ‘FV}jΡ¬ ΅mύ½]V`°ΨΡχ­Ϋў}ϋνφιlcκδ T0>#»o�AτγͺΥΖ6ξEs€.s 2_yΏb§ζsƒ}£Ί™ Xh›3o^Δn}`ΏήBb ’]Ϊ:‘Ϊ½W»4}£IΓ4kξ<#)€°ή<—qΔμ„mΫ~2ŽW_Αs¬fυjvΝte½y.’ώ~αaΟ}+ςωΚtOf€aΰ«jΝ:RΒF•±Zβ/˜#/τόf-[Ӂƒ‡τ$ΉŽ²ΨR†™ RζN�@•συ˜‡‘YξΪΖΗ·ξŠςπΤ‘₯ΌΝm„N~”!ψ‹/ XμgΝϊΝ΄fƒυo§κ>G κmη1tTL}Ÿ:sžA�©²ϊη·_χN’ Uι�Θg,κ.Xς#νΨ½O5cΉ0΄O»ΐ` GΰA«¦yZUi{μΓT~O XoΞϊΰ ‹λ εtς uG κ#§φb$}αύ«” έlζ)ηΎ"`Ÿ‰ΑΝ.=ϋ‹χν_γζΨFpšaμί›u^'Υμ’Ν™œuG�,EΑύ†χϊΠbΎ$`qΜƒGŒ£ΛW―‡ς$¬3ΣοQUƒ,{Ωδ§τ|gΪΓΞX΄/ΠΙΣg»Όf0HΥW<;'N¨Ί@Iΐb'Jˆΰ„ξ RmOˆιSYτΚ΅λ4hψ8£ZΕr₯uΣ–+-Ό_+WΠ³ƒmέ,:_§Ϊ·”'g6γ8>~BƒFϊ9΅^‘��9TΌ)Ό³'Θ/o° Bz¬JiΊαχ0z΄ΟŒ$€Eb·φ-(‰vύΕ "˜‡t_°hή¬eγκΉΧρΣζŠΩOQEZ‘s^«j»οl•‡₯~́IΐΒs΅V�θΖ�Ώώ‡Ξί}K—E ͺ_?h«"3f”OθXίT’|4 ‹¬*0䆑ԼπηT[΄Nθ΄ξ½ό;ήςΤhƒMΔfϊξWθΕο�ΘϊΥsF§ΊΉcP²Ψ U]‚ †Θ―Ÿ7%Ё~ϊω υ[ϋ„~„¨2oX]ην5/‹j‹Ύ|!ϊ²σΒo4mΧs:qΣ6€X&σg4§Ib΅Ϋ _²¬—KRt› E?©ž’° Ψ{π˜ά{ΑΌξ%Μδ+4ΪΚ•τŒμυςTέLΐ&›nήΌ)½«ΠΰεΛ—)Žπ(„χ%μΠ‘CΤ₯K:|ψ°άφτ<[‡ fι]‹6π"œ1cFρ¨[P°ξ4@A¦"Ίξˆ~βC^sΝ›5–ΗυΎcύΐ‘Γ4aβΛh՘ͺέΎMkιωͺ¦LθυQwœπΎ…·ͺ�πΚ&p\8o–^Με:7š}ςτW: 0‚U©`{—…ny§^ƒ2�Vό+Aΰͺ-•βsdAΪ²²1۞шM~δ²UHlΑ«"…·o£Σ²‡΄Xh¬κ¦k¬Zα�Λ–Θ•Ά�ό›Lς†€E“wώJΧ=Ρ›wX‡όΐΑ^) ‚Ψ‘@$0λJΒzΊλΠFΎβΈΜ,�,X@uλΦΕ*Υ©S‡Ž9B]»v₯ζΝ›Λ4όΉ$¦IξάΉS±K–,1�υ•jΥͺQώόω©P‘B’\ΥσΜλ[·n₯2eό¦P©όΐ"`ρc§ΏP[}©>θK| \Ώ~]J1ΔS7γΗ‹g7=D/«―C’ΰ‘Π2zρς₯τ΄Iœ8±ΠΪυaΤΛZ­γ₯Σ%ΜΑΌ¬ΚZ₯aJινΫw€ηΤ‹W/Ε΄§„”$IbJ–,™μU= „Γ­[·1ρ†�¦Mΰ~θmšΧA&`€ΡΞ^’Џ›7o 2π₯ >² ε‹™Ή-WΫ ]I¦+rUΗ*OΏ†π²α¬ΟVu­�pδ+XԎ [Ώf%₯J™ΒͺΈeš'ZVτg"ˆ·»χξRLα‘‹kήgΑmκΪΈ)΄Pοά½KΡ?‹FΙ’'•(jΙͺάΈrεͺΤΚΔK|P›YήΰΨαύvχ€«^n‘‡ϊΰΑJ*•Gχ�ΩΚ�IΏψΒ#ΉŽ Ζ# ϋ θsϋR¦IΪx4Λ˜ JΥG_<qNμ‘8/Q£D•,žό6ΰχλ‰σΰαI„ōΫΣί2\χκυ© ͺτϋ-yςV‡H΅jT£ή=»ΫΑΉBκτΉστθΡSρό!τή’Šk?Ήx±'¬ϊΟΚ«7Δΰ²ΈΗΣ’έΫη΅Υ>œ₯α\]Σ€ίΎ}'~³ό¦;+―§C&ΰWAͺΔ‹ύΉΈ6jΏρ‹)φ˜ ΟJ₯/«χΗΩ:|Μ¦ΣτΥ½³²ž¦Ε9Γ>πόΐ\΄Ο’:νHέΫwο Ο°¨τ…xwςδšsژ?3pέ_Ί|UΘW=€pβϊƐ΅@ Ύΐ6χύ„ΔΗ 96»Δτyθ6Γt)[�σΏxζƒ(…ιAƒœΧXτSA^"(’’9XKΎ©…γΎ"ž/7Ε·Θ}Ρ7Ό?¦H‘Œ�₯vύΜ€G£«{Σ7½σm+ž°Ύέ£Ν³’aΓ†KΟΕw�kvTχΎΤ—UiX‚pm(<_»—‹Cα…W¬ΩΰyΪνcZvδ%½λ0€Εφ,l° FU>�@„Ά.ώ9•͍ς ΎŽ$š+ΌRK οTΨJ4«υΒr}SΗd”-Y$ΉŽ?J·Δςψ:φΞ?kOΎ¦λŸΠƒε±"Ζ½©FΞΤ»B\ι l—ΔLΐϊπΐ"aC#ω H­ΨTβcώΌπ8Ĉ#~0»wοN›6m’ &8h·Άk׎&NτσrΤOΘΫ… κI–λψ̝;78a…� «οƒΧ�[T�πά…9Σό jDΰ™Φ»�@»iΡ ΅tΡΌ ξ ο/ˆΈ)t(ΛVπσνΦ΅3Υ―λημŠ€ β�zΌ;G{χξ½Ηεǎα ½ΰqε@(θ)»φ&ΝϊΊΎ₯o φrF€fπm€kT끣‚ΉkΌϋ€@p°Ύ:lO X_ν/4·γ ˜ΗχΧ?�£_ξ�)uY“~βGχΜ‰D<ΎθΩoΛ�ŌŽΒ ΒΣlw~ύ‹ξ>�‹�ď@q>σ¬]sžnΏ~+©ΏΗρ/}+%Žψƒ‹žφ XO‘ς œ―IΨΠJΎ*+ι}ϊτ‘~ύϊaU‹Θ‘#Εޞ}ϋφ•ΑΈοxΏ=}jν Ϛ—ΒγS{A+›£τŒi“ΕΤ§άΖvP―@α»FM€-ЏωsfPφoΎ κ.ρώ‚hCλ†ηεޝΫeΰl‡F6Cfk•:˜Κ•-m•,i�Uέ -iLmΧ¦5oΪ8XΞο”`†ΐΟ. oφλ΄�ΰQ‚N/,ˆΠ£KېΦUξO0"ΐl0‚„»n6υ?»+&`}|κ}EΒ†fς:#`1%qǎT €MrρβΕΤ²eK9=2EŠ”IƒϊEθ‹Β3Φ•έΪU˜nοΜΈ(εyσζ•d�U&`­Pα΄€"-άFMlx‘„ΤΑ½;�ΟήU€Iq4ΡJ„ΰ!Xp·A‚;wwwww9άέ!άέݝΰΑέ=@Bς�ύzιΩήYΉ½»=₯Š›™Άιy#;σΊϊ•.­_ΫφK½Sβϊ―U·‘]ΥΦ­ZP‹¦Mμ�9!t"€©μΠΰ½~ύ†<ΐΝ›PΛfMεzH$`‘ιϋΧ{[=IWg�W�"‚zWE5οK%`ΗΝρΩsηI¬S₯LIΖ˜Sυυ$σΞF€π%JcXUƒlΡΨαƒ�lŒ€B mΧ~†ͺJ )Kφ€uοLΑ ~ά°~ξζR!&`ΰΤω—„ ιδ+ uFΐ"/FŒ΄gΟ#ΈΡ!ChΠ AταΓd»eΠ M(΄ΘYhΔήzΞŒ XgΘpzh@@'`αωJ―–Ν(^«—nh8N>Ώ#°c§H 4²aaDPx‹²,—/_A‰f;ι,Έ!h"#ΐ0Œΐ—‹@ώCeΠΎ0aΎ‘"πeσΖυd@Ά/>rG΄κΤGh«γ(+D€₯Hfν}WίHJ…ˆτ@'?}ϊ—&Žΰ–Έ‰ΰŒ°tvΜ$¬_wNˆα—.V~ˆώ½_›’z�Xt¦6nάH3f”ύ{!‚Ύ@«υ‚VyΘ:λΌ3φκΥ«TΌxqPΙβρε¬>°ΞατΠ‚}ύΥW6pBΛ±ρq0Œ#ΐ0Œ#ΐ0_ z  ώύ/ΔzΑ~)ηΙ―Η οΧ°"RΤΘ!}όΪΧ !0€'ΚΏ$lH%_©O,ΚDЉ¦NJ5kZΓ °#ΊžvsKD$O ŠΆ~ύzͺ_Ώ>AoΞ'cΦ'„8Ÿ`F€`F€`F ¨˜:k:σ… χ-}#ˆΊ―„“[ΘGΔλΏ‚X�η%SjΪ VΘ?(>—0λ�g‚„έΊλ½žΎ±H‚€,Z0wˆσ|UΗέ’Ώ�v/ZuωςεiδΘ‘ XΨǏ :š�LΧ€½wουθΡƒ,XΰͺŠ‘%Jzςτ™±Ν+Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ@pDΰ…@=xψzύζMpμχɟD‰™ϊυμ@ΰ€ΨB7Lΐ†ξσdG—'w.:vμ˜Ϋϋ+€ͺW―NMš4‘ΡΊsδΘα².‚tAͺ`ζΜ™’xυ~lφμΩiοΎύ.ΫηLF€`F€`F€`F 8 πβΕKšΏh9έΈ}‡ώϊλ}pθχΑŸDˆπ%NŸκΧͺJΡ’Eυgk\=$ ΐlH8K!°σζΝ£¦M˞Ϝ5‹κΤ©,ϋƝbF€`F€`F€`F€]0ΊΞg°:ίzΑFη³fΝJϋ Œ]ρ>F€`F€`F€`F€`b–/‚Cΰξέ;TΊT)Ίxρb€νΓ7 §J•Š6nΪDργΫοςM\–`F€`F€`F€`F€π Lΐϊ-.λkήΏO ζΟ§1cFΣυλΧ}]ίά«}ϋT§n]ƒ{ybά#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ# `V!ΑKF€`F€`F€`F€`F€`<Œ°”›cF€`F€`F€`F€`F@!ΐ¬B‚—Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐx&`= (7Η0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ€B€ X…/F€`F€`F€`F€`F€π0LΐzPnŽ`F€`F€`F€`F€`…° ^2Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΰa˜€υ0 ά#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0 &`ΌdF€`F€`F€`F€`FΐΓ0λa@Ή9F€`F€`F€`F€`F€`Lΐ*$xΙ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ€‡`ΦΓ€rsŒ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ(˜€UHπ’`F€`F€`F€`F€`#ΐ¬‡εζF€`F€`F€`F€`F€P0«ΰ%#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0F€ XΚΝ1Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ# `V!ΑKF€`F€`F€`F€`F€`<Œ°”›cF€`F€`F€`F€`F@!ΐ¬B‚—Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐx&`= (7Η0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ€B Ψ°Ρ’FQ}γ%#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0!—―^ΛώgH›Β_ΗρΥ�„ω§…³�ΚκLΐϊE�Λ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Α `Gΐ¦I™48αΓ}aF€`F€`F€`F€`FΐΟ; &`ύ|.Ή"#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ3˜€ f'„»Γ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0‘&`CΟΉδ#aF€`F€`F€`F€``†°Αμ„pwF€`F€`F€`F€`F τ ΐlθ9—|$Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#Μ`6˜ξ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ„˜€ =璏„`F€`F€`F€`F€`‚Lΐ³ΒέaF€`F€`F€`F€`Πƒ°‘η\ς‘0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ@0C€ Ψ`vBΈ;Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#z`6τœK>F€`F€`F€`F€`F€f0ΜNw‡`F€`F€`F€`F€`BLΐ†žsΙGΒ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Α &`ƒΩ αξ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ@θA€ ΨΠs.ωHF€`F€`F€`F€`F ˜!ΐl0;!άF€`F€`F€`F€`F€=0zΞ% #ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ3˜€ f'„»Γ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0‘&`CΟΉδ#aF€`F€`F€`F€``†°Αμ„„Ζξ|συΧτΥW$ώ‹?A`�ϋί�θΏ�ύχίA°wή%#ΐ0Œ#ΐ0Œ#ΐ0Œ#ΐ0Œΐ—Œ°_ςΩΰcίj!_ƒ†x5ˆΨ +lŒ#ΐ0Œ#ΐ0Œ#ΐ0Œ@ˆ@ΰΝ›·τϋŠ΅tλΞ=zχξ―Ρgξ€k"FŒ@‰Δ§jKS”(‘]ζάP°‘β4ΟƒσΝΧταΓš5k;–�_Ώ$Mš4)uθЁ4h@αΓ‡§O�²'lœή)#ΐ0Œ#ΐ0Œ#ΐ0Œ€―ψλύ{6f*½zύΪWυΈpΘ@ j”(Τ₯]sŠỐΡaξ₯Ÿ`ΦΟΠqEW|-dξί»KE‹₯Λ—/»*hyi�€‘Ν›7Sάxρ„»ΑπΌ#F€`F€`F€`?!°pιj:vςŒŸκr₯@ΦΜ?S­ͺεCFgΉ—~F€ X?CΗ]!οΧ9rΠ±cΗ\ τΌάΉsΣή½{Ω 6Π‘η2Œ#ΐ0Œ#ΐ0Œ#ΐψήƒF�›·ο|[Λ‡ "GŠH{u A=ζ�ϊ&`ύ‚Χρ9³gQσζΝ},fϞM΅jΧ Š]σ>F€`F€`F€`·hΧ­ΏΫeΉ`ΘE`¬wߐΫyξΉ[0λL\Θ·δΛ›‡Ž9βΫj²όO?ύD €Œ3RβΔ‰)jΤ¨τ•ˆθυκΥ+Ί}ϋ69s†φμΩC§NςSϋΩ³g§½ϋφϋ©.WbF€`F€`F€` &` ι έ°A‹`μ Ψΐ@ω άGΜ?Πk_ˆ„GЉš4i"�§NΪ-ΔnάΈA3gΞ€©S§�‹/άͺƒBQ„Θυ“§Οά.Οƒοώϊ‹pώΣ ²ž`F€`F€`Πа‘υΜΪ°Άx„Ζ-&`CγY ΗτmΈ°nυž­5’AƒQ¬X±άͺc.τςεK0`M˜0ώύχ_sΆΓν�γ0ύ†ΐ�ώχ?zσζ­ ·#ϋ­_Τ:tψ(5mα%ΟuΒ„ hڕτΝ7ίψ’…ΐ-:aβzςμ©άiΕςe)γΟ?nhogΞ₯«ΦΘΦΏ’―¨[—Žτέw‘;r'ˆ�°aΓR8ρ? μν»wώΫo)L˜0m~πψίΆ}‡l3N¬ΨΤΚ+xΘΓΌ³FokεŠε)CϊτΖφ€©ΣθΡ£Ηr;kζΜT¦L)#WBgϝ£₯ΛWΚNGψ.uνά!X?·=…ξ?Ÿ>Ρτ9 θα£'T»Z%J•"™ΡτΊM[ezœΨ1©L‰’Fϊƒ‡hφόί峦IƒΪτ}΄¨F^h]ωοΏ�hγΦtύϊMzϋξ=%ˆ—κΤ¨Z—+!ΰμ>E‡hΚϋχΔ{^xcΫS+Υ�§ϊ\Ϊa6Έœ‰€ν°‹oph ΨΰpBaά!`cĈA , bŊyPυκΥιή½{>Άη ΆkΟήτΟ?Ύ'rψ>:υμήΕΗ>χ—.]¦ρ'Σω …G±…`+VLʝ+'΅φjA1Ε9φ΄5l�Œ±w›@έΊu›ώώϋoyxπΨO•2%uhΧΚΗσι ?�όίJ"ϋή½ϋΖR4!»’:uJjΫΪ‹~ΐΑU>ζ={φœ +iτ½}ΫVΤ€QCλF{χοS‘β₯]υνέƒͺU±’.Ωrε£·oίΚό_ €ρcFey%d!πϊυΚW¨ˆqb e³¦Ar#ΗM¦g/^Ί΅οŸΣύDΥ+—s«¬£B«Φm€Uk7Ι¬¨b€rΒ¨!F±VΊΣk1p1bš2v˜‘ήoπHΊ~σ–άΞ’)΅mΩΔΘ +/^Ύ’.½ž‡ΚΎ ŽfL χϋΚ5θΨ)kδςZU+QΊ΄©Τ‘Ϊ,‡ŒOoήYžy6¦΄©R~1υθ SΕ φs–M V&ˆ—�¦JAyrewX& έΗ½ίΐh�£xη™9w!;‘@’ΒΩφ]ψπΒ™ 5�_‹ΒϊaΐS -§£'N�_½7%|ψo)CΊ΄ΤΈ^-Β:›-LΐΪ<9³R™β…ιλ―Ώ’-;φ�φέμ QJάcS²Δ εή?|ό›Ž΄ώΈκ°�Π yLΐ†ŽσμŽΒ'6i�€΄yσfI αž°j‰ƒQλj©§ι«η#δkΙ’%ιœπΆqež `ΣfΘμjNσ"DψŽŽšˆΉσΠ…‹—dίR$Oζ'"€T§n=hΛ–mNQetν�‘κΥ�₯6=²>r α8”m^Ώ†ΰ «lοΎ΄~γFΉωυΧߐχΰ*+Π—«Χ¬£½-bκ §Οœ8"^Ύvُf-[ΡΎύ]–Q™+”£ξ];SΔT’G–ξ`Ϊ ΨΫ·οPϊŒΑgΐV�Tτνν,Ϋi:<ˆ5maσρα¨p±"…iτΘαςι(ί§΄&ΝZ�C‡e1 ˆμΨΊΡγΆ>υΑY>°Ξ yι½ϋ 0΄bEŠPαBμbΙ²εΤ •€\·z%KšΔ�\@'4φκ ˆ`χO%ŒO{wυs—\°­;φ W‚˜ώ� ΨΑΓΗ�ε«Χ Œαρ›(A|κΠΖκ©Ώlε:ϊσϊ Š!䭚�'€Ψ›·©οΰ6έ­Y­"�΅ MšΪ¨Ϋ€΅ZuΉΔ‡½χ€^.Λ„–LwοΧhQ£P—v^_xO{Κ?yJ³ζ-’ΝU([‚R§LaΧ΄³ϋΨ�`KΈzν:a@ΐΥΜB ” Π“bόΰώΰ;<ό{ π,Ÿœ"ςΝ7_SŸn)ΙgςΚiΑ/,Γ6±ψΝΚ”ΑΉ<fr=zό”�‰gΣΫ·οB<‚Γϋw“Ώ‘8 tθ1(ΨSJe$AŒa–Gλ.ύάκ°˜ξ>�‡ϊ�zDαΓ}M+Ζ¦θΏ1π±ρ)ύύι”/uDΚ›�³ίΐΖNp… ΨχKnΪ?~|ΪΏΏ Ν,£BžΖιΙ“'”/_>Ί|ω²Σ¦ΏTΆR΅štQ°)’ΣšKbδ,£gŸ~΄jυZgΩv飇{SρβEν�ύšπBHNLœ4…ΞύqͺW­L !u=f<͜3ΧH:ζ„ŸΙ+£?�΄iί‘ΆοΨ%kηι¦LοcKΎ!`ΡX�$‰iνͺε>»>ξX+ΰ†‘™€Ε j™rΕτΰΗ*ΞWϋυξIU«Tr^ΐ”σP|€)QΪξΓƒ3Ί7ˆͺV·vM!ρΠImΊ½Όxρ"Uͺf%+zυθJ5«Ws»~@d6 ΌφυΙυκRηŽνμvώIx=ύ’#α[¨@>š8~¬]Ή€NΠ (‘#Ήά]†τ?QS!ΰWƒ§<Θ‹ήκUΚΫH8#n@PΜύmΙg ‚ZUθΦ‡fk�ͺ“AήO5ΨαρΆοΪ‡ž=!½β¦ObΰPηXο°3ήΠπ¦„Αϋδ–3K:y5iΰ,;T₯λχ+HVepΐxϋξ/›ίQwγG ¦Θ>άΧͺ Ÿ–'NŸ₯q“fΘbΈK-lWEcσ@Š]Α”παΓGΒqΠ‚α9™ν—ΜτύχQιΦν»tμΔiΓ1?F ν'ΛΉσ§YλΞτώΓY4œ«Λ›+Ε‹GΚ±μ;pΨΘϋVΘ1M9˜=a5Pέ!`K+D%ŠΠj9^ύ$œiφ8B+Φnv\ „€Ž؝"|–?ΓΐjϋƒMΟ’€}ϋρ?ͺ=υŽΈν7μ7D©~ O„§L‰ΒSŠΨߊο`ϋrΑ=₯ζΤΫ΄σ‚e v�h4²ϊF—γ΄Ή(Χ+gJλxnΠΝΨA―0€?œ4‹L™E±jW£xέΪϊjO·z€ηk6Qτς%)Ρ 7ΚνŒ€Ε*ΘΧ,Y²x €ΌΛ/†)ͺ˜ΊφΓ?Υ―\ΉBΩ²es3+@@IDATΜμ€)ΣμFpϞ;k3=Ύp‘ΒΓ'™Ρ/¬D™πζ_φΑƒ‡r:³ήχϊuλPΑ‚ω(mš4tμψ ΪΈi3­ί°Ι(β�η§QΑŸ+ώά…[Υρq)kNƒlΨ―7UͺXΑΗΊfVΙU ½§OŸΣ‰“§Δ�“6νxzZΉ;†fvϊΜY4vό$cθ’6iΤ€ςδΞI—Ε³e™_X±r΅‘ιH0Έk#F₯9σζΕΡ~χ�₯ܞg7m‘~ωX9-Ό§}«=Ϋ±KwΪ΄y‹ΡΞαύ{E§ΩΨ‘+LΐϊPΚv‡€Εα@ΆΟeϋvmΏέξ{O©zώY*B'¨ “ΠHάψεΌ(―ΟΨBΎhΔΰ>›‰μΌ…KiΗξ}ςx~ˆώ½$±αŒ€½|υO<|œ,οߌ‚όg#ςι~½&²Ž8Cz“―dISί=έ—JΐκΧξOiRQΧ­lπΔ`H§ύωύŸLΨ« %Jd‰fSXΫ8*ˆΫ‰SgΙ”Θ‘"�xA°βAήsΡξρ� «W«*.WeρKO° Μ3\€ιsW›!nY OƒpήΉχ ”!.μΓWŸ(cο«njœ¨ahAΣ”^²a? Wο�£’?E’*Ω’zlLΐϊ εWβ‘逃χΉ’*qφ‚ε"J“2©J ρΛSιrΗΰ"U‘―ͺr¦?ͺΥ³tFΐŽ1‚:v΄}1*Z΄(νάΉ“ςζΝK:u’R₯JΉuœ»vν’αΓ‡ΣŽ;(]Ίtt�DJΝ›74pμ!ΰ ΦQ'WŠ D½ϊφ7²¦MžHyσX―#C[·Όu! πί�£4Bϋ1eŠ”‚¨υ™Ύ τW―ίΈIw…τ`Ε‹2‰ Oζ`XЁότο'jΠ¨έΌuKξΣφηΝΆŒμ‡�6Ό[ϋiςHYn©vΝjΣXz)΄--ΣΆΈτχ”ξ'ΛΗΌ�ž?·Ό\…„|ςdφχ<4eŸ<~"Ϋ 'Ό@’ Ήeπ€}$Ϊ€a:ΚΟSΒ 1ψώΓ{šψ₯K—θͺ˜Z?~–A4θeΦή“³,–•œ°»χ0ʌ�ΧWη�άθκ^»qK\—α₯œBͺΉsΏΎzύšΪvξ-§ωβ8ηϘΰ‘Γυ‹ϋλΓ‡Ώ…lA2ιΝξN‡π)}ύζMΤφ/Q/ΉŸΌ?qν=ο)Ε{3HNΏXηžΔ4uΛ;ψœ©cν~‡Πζ αُUX₯ς₯¨\)λo€LtπgΚΜytθΘq™Σ°NuΏ!·]©sη/ш±–π_„v›–MμΚ|© ~!`/_½NOaώ• “’²ΊΝZ°”NžωCOβu XlΨoΎ"¬Κ^ψ—^ύeQiX6-ˆ©όžΆΫZήρK�™f6Šο±ζ!AΠΝcϊ.άWΤΏ|lϊ^“ `X ΜLΐ:Έάξz₯'ΏY§x»CšΙΧθεJP’Α½΄Ό“°Š$5“!π|UVpTΚ•V6'Nœ bd²x)‰-š$t2 βΑƒ΄bΕ ό˜Ό/`#Z_6P§@΄oŸΕΑ(,V‚‹πΡc'Ψθ™κ}¬U£:uξΤή!ρ T 1ΘT½>Ψ«V�(΅AΦι3e΅™¦₯—Η:ύόώΫ\s²έΆ™XΕτQL#5Hΐ‰“§Ι5«UηΤςΣ�CgΪϊ9"»N…ΕΚΐΑCιχ%ΛdŽηά©cFφδiΣ…ΑTcϋτρΓβ#)™ƒs΄3™Ήaγfκ&‚©9�ΈB°¬±£‡ϋ9ΨΈ “hΪ ΛH|Aψlέ΄Nλ‰σUwXΤ�SΏ±'μΡCϋ(’ΈώΝΉƒϊχ΅“ipT�ΠΎέΤΎSgnG½Tš Xx²yIΐΤl&Υ΄qC»—>”ΧΊ]G9ˆ`�‡sί»G7‡ΣϋuΧ`Σ&Δ5Πάn ?°Ÿ4~Œ “››wΊέΎsWzϊΔBNηΣγš7mlWΦ|?wMАNπ:Σ„6ζ̜>…rεΘnΧg »φμ%―ΦνŒlxRγ™’›Nς’GμuͺοάΏO/ͺ"ž+Ί/Z’Œ‘δHŠ„aV1ν\Y»6ΈΙΝΐ$`uΝή=»‰ί–[τΫ"«ΧGιR%hψP a‚ΞωηΩπϋ’₯βζ­ΩX‚˜Ψ―eȜΝxζ΄iΥ�ΈΎ–‰`o} 2ΚoΩΈNDƒglceΗΞέβ~ι`€ιƒ[*ρΉψΝμΤ₯›Γ{χΞS₯ŠεUq›εΒίӘqμξ#ΒσΊcϋ6F ΄K—.SΕͺφpzƒ^-›‘WσfF~—υγO“&5­Xb¬3 ΰŠ;„Ž£έ£ο3η-<njσ§Κd«]½ε͝C%Ι%ΘQ―ΟΣΚσεΙ)‚ΛΤ4ς°·ξ ΕΛVΛr]Ϊ·26A²Sώ2ža/_Ύή>»ΙσΡhƒ’eK₯ŠεJiϊ ˆ*θ:Bζ@ޟ0Έ]«¦΄nγVI mήτρͺˆ[KτeυΊΝr O―€iα…ση•žŸJΑH&L™©³YWή° š·XΫH’0ΘΡ™“FΫΤ{.‚« 3IΞ—2 ~”.Q„*”)©’Œe―ΓθΆ ŒARvhέLτk½ό<Έ‡ΎΟ™jρJ5*Έ±�±;Όψ,Ώ!έ:Ά–ƒ! ¬`ΞΨ₯+Φ�ϊΝΫd`o&Id† 9Ό~Σ6»ΩYψmͺY₯εΜώ‹-ΏlwοΧώCF �ω¦<ε‘yϊμyB/XZαά€sαΘ ω±sΟ~™U«zE10ω”Άο² j;*_‘lIq-•Yϊ}<|`o %C‚ο(Œε§ΡYq_°_’?}³Xγ|K‘ΎυaφμϋIΗ΅Gι‘Ψ_’α(Aτ°ΑF —5`œTO'Ω«HX»2!˜|~f6Q’DrJ²£—ΗΈqγ�Γ‡ύϋwB€ϋ₯˜šŽ—³eδ�ιΣ–—2•Τμ˜qiΖ¬Ωͺ;b€0U¨P–ΒˆΔeΛWΩxš=ˆŠ—.'Ό5ξuαU•=kVΊ+¦Ρ.^ΌΜ˜ŠλΧ¬”AšZ΅i'FΦί�ι3gŒœ‹ŒB�†©₯ΠυΙN kΥmhS δSω²eθW1J�s†τ>κEΐNš:>FΧ�]#š―Œ>Β“?ψu1m²L?rτ5hl%@΄Φ«S[Ψ·�SΨ•Ήλ¬Κc‰πœy IσζΜ ¬šξ±‘α`ΕLΌ)SsQ³Ύη†΅«(IβD²ΌAŽΑpžO;d3uΨμE7d`*_� ωC3+w&ώ@j"R€tςΤ£Κ«Rω 1�GΤ1–Mΰtχή]Ϊ·� jR.ᝒL™Nΐͺ4h±¦ƒΗNœ΄Ω7ςΙe¨Ίξ,1%}οΎύ΄xΙR1uύ°QΕ‘η§‘ι`ε©πŒϊ΅x)£ΐ¦BΉ²T΄Θ―tOœ·BΚDT¨�ž“Ύ1έΛΧΐ‘!«^|U;:«�°‘+F )%‘ΟN@ήζυkDΕX•ΧXHτ€•�ό�')T0Ώ tζŸgΓ5A\•)odTϋωŸρη tOΜΪ9j6O°Ίg8φ•#{VΚ—7τ–œ;qΝ!oαόΩ„η# ^³yς–λψƒk²vΝκBΫ;΅ xoaE+―mh‚wιήKΦΡu©qΜΙ’%“ι΅jT£βΕl? ΝΣ+–,Χ\Y>0ώΈKθθ}ΩΊc7ύΆx…LQYͺΨ―βΌ¦ΏΕχι€ψέΉςy°ΝLΨΉ"`p ›f-ZΐsFΐ’#x––(Rˆ²ώ’Q >}ž[)kω(EȞοΔteΊυ%z0xΖU,[Rƒ\φ©tUyw Ψ»Bͺ€gΏ‘QZ onϊE|Θ‚θρxςτ9#―WΧvrj4ίoά²|ψf!Ε⠏©"f Χδ ƒρρŸΏ₯ΖηΫwοΔ;^C2Bψχpo*‚ϋ@V’ΗχCτhtμδiα™»I\ΏβkL˜YWR°2SόΑω((ށ`Ήsf“Kwώ@~‘M§r_θλdA¬#˜–;μ@ο1„iλpJ¨PΆ„ qΧ}Vϋ†Ξf—v^vSΛQυaΨ/H+x\γ]žœYf9ςVmΧ₯»χkoαɌk6D•ργώ(Χα OXX[―&”%cΉ�ώΐSΛ0ΰ οYœΗβ»$ΟΚ5d�λ<Ή,^xργΕ5H&uΛBhCH¦Ε Ÿ₯b0E zΐΉ…πHUvηΞ=κ9ΐ[mJR2ΏΨ‚^ ·μ0dςηΝIκZI(€EΈ§«T(C©ΕlŸϋΒΓ}Ρ�•) ΅1ΓΘu�ώA`�ISg<`qΕo¨χ€žn7ΫΊSOƒ€Ξšωgj$ΘrQΒ3aή’e΄wΏΕ»Χ*ξ™ί[άήQ(,θ)Δj—ΆΦo ;ΒλΨ{¬ΕSžŸƒzu4�og0šΙNxΚ’Mgη AΏπ«,° X΅_}©؎­KοW=ΟΌŽλΎΟ1�“Wε9μŽ%‹ώεr�<΄ό>6ΝUŽmΧνΣ·ίSγΩχS�uƒΌΑŒ†ρ(k’FςΕ{¨ΰ°ΖΆy₯pΪH΄°Ήε[yβ'š†¬{B3χ<£χ�ˆ ΝbDϊ†FֈKΕΣG�R‰–yEmή—i;&¦Μ‰,ήΜHpEΐή~φuΊ΄{.Ώ³ic¬Υ²G£A•βP!k”Ζl ‘oG°j$¬]^'_©™€ν�₯ y{[_2μψY€ΊξΚσ͐η„7Θ\³5Š:wξl“”,΄7u½•rζ°βnd8Y'h—ξ–Rœ?ίxxΉCΐBw±P‘!‚}œ=yΤ8NH@Aٜ™Σ({Ά¬j“Ί Ω…uλ6ΫΗ杻¬?¬ξ`h&`AΨ,]΄ΐΠδ‘SΌT9y‘m›ΧΧ΄’1Ν^΄„A’*;vβΥkΠDmΚλ�ž†«™€-ϊka9|¨Ό a9qβš9g�QΏTΙβ4Β{ˆ±ν›™…ž§" T]s§mκ «2Ξ–ΐgΐΐ!†‡³r5ͺUΈt±΅wVVOΟ_¨¨1γLΓ«λVC ΆmϋN6Z·Ε™6f„Ε[/€zΐ§ά9sΠ0οΑ†ώͺΒΞ?Ο tνά½W5EŊ¦Γ,Χ$ΝΪΝHσ$ i<_•™υUΝΔͺT)iΥ²Ε²ΈyfEίή= ©ΨΌemυ6\΄`.ŎKνŠt‰™μά±‘g^Y·~#uνa!n‘‡™… ΐj ˜"t@TΥΣ²ž‰jΚφμω‹ΕΖsRG―u‹F”"YR›jJ£‰Cϊv7ˆAW¬ςœσ+Ϋ·Gαu–Δ¦j:=υ)ΎG„gε$αa ΓqŒa£[Ÿ#Δτ�ΫF’»,ΌΪ-[%λ)”OH 3ΪΐΚΤYσ₯lΦKϋ•ͺW.‡UΓ<‘ϋϋ�U΄iΫNΩ&HΦ-lec@χθkyώƒΰœ1q€±€ϋclA&Y―M£›+ “ί¬aƒΌu‡€Υu7]νΏχΓφ²Ρˆύνχε΄uηY­YΓΊbΏΦί{$Nš1‡.|žšλ-¦ΙϋUΤUΏ*Oέ―ζϋDߟNdbπA—ΟΈ!4³ϋΆœoxθuλΨF―JΊόΘQuΟ£o4`Q>CΊ΄�kλΚτύ-*a•™ιΦgέSœaΊ¬ͺ Ο;”yƒγ?rEύ°X'`ρ,3{Χβ}₯iλN†…»χ³Ϊ·Zbߐ>A{x·B¬eΐ³uσΖrΠB₯ω΄Ρ ™Eΰ:*͎mZH2ΫQώ—šζ)ΆVΥς„ιωΚτ@\΅ͺ”£\Ω³¨,ιυyBxώOό+(pn”-\Ίš=)7[6�c#kπψ–=sξ"ύ+€ �‹Ω Ωu *φ±pyτψ©ό–˜Ώx₯ψ-OBυkZΞ1(Š`^0H0@Z@€ζύnˆ‰έΉMSγ» eξ‰οΚgΟ^Šϋα;ρۜHU“Λ &`/Β΄ΠgΒ4yμp΄Ώ§e\urΪξηΤw₯εY€�ΜΛώbQ³‚?Θδsw>P‘Ξ Ψό©"�―„Fm‘ΊTͺ�lZύxT.³υϊZtθ%uψύ¬²�}"Ψ ’Ή°8NH083��nI ΪΉAeLΐ"ςvD« a1$π|Ν&£!UσΥ8€Ο+f³ςηΟo.F-Z΄ iΣ¦Ω₯ϋ%ς90ΫyL'½˜š­[P° Ύ@€)Σ=ΚTšΩΣΣΓAΤβrΚ0Β>}ΚD1E>ΉJrΉτ‹@1Ίv§ύ,?P�vXΌxQιΉ§“{AMΐ‚Ό9₯LM§UΫXβ%3KΆ\αΦ’ijέͺ…^Δε:4D·Β’GyήΊ¬τ9ΣLΐώqϊΈΜ‡<5N‹WƒΌ‡Μiž’ ήBEŠn‘¨†Πΰ…ξ₯2gRžζΊ(γ„ ˆέΜ$«�cš§ΐ―Ζ1€?΄oτάqU_ŸFo&`́¬@6ε+dυΌK+<μ– O;ΏXιre°;s]ΊujΥ° ήd.ηh1sΙΏπχ%Ζuf.OΣ& 8Υλ4—Χ·3ώ’Γπv„W2dΜf&`Ν$8Κγ:Ι™· ΡGx¦B°JΐβvοΨb'βίgΓ/9r2 ηξέeθIΐΔHn@zC™' X ϊ(ΜL8Ό·7Κ€)Σ�•©ͺ£ΗŽSύFMU2ε^³ƒτ£ΔTpwΜ7,ΌΫρœS6°_oq;'BU9O-‘γS{foVWεΧlΨL+VoE σ οCX@°ρ…^ˆ^³ιœ Q R6zΌπό챦χO―οXxΙ*σ+a£κ«%"¦ƒ †©)ω*KO°m;χ’ή~πΎš5y΄Γ+οQ„GγΉkΘ@ζ¦°Γυ‘jd†/�θz£ ΔΗωΰ>Φί\wΨνΊΪ[@”=kAB%ηξι‹Ax؏B£$¬²₯Β[Ϊ―0GQλUΉΈTχ«#^iΏXΎj½αeš9czjηe}–α˜[ΆλFπ ym–!P!πlŸ=Ε:Θ„zΎ%`§aγuŽ6`^ν»I―Zσ>Τ΅w ¨ŽL\U]s+Y΄°,¦°HCžΩFŽ›,dS,Ξ~ μŒ›xu47-ۊ ©gzΣv>'ό%$°¦ ‚3η.žρζ²ι�¦¦†ukχ¨9�Kέφ »mΧ~Ck5v¬’TΔR·‹WΡa1HοΧ‘{ο f9€XB+Όo·ΆFU%]έΧaύΊιπv3i–Τ‹E"<°AVκ?AAΐ�ή°•€‡nέΪ·:·*mπ¨IΖ �†τι,="ΛlD­S­εȚIU£³η/Ρ΄9‹ŒνŠeŠ νσ\ΖΆ^ΧHt²2ΦΫϊ;μ€ωF‚@΅‘’Λezσα?‚ ΑQ©U2έzϊeπ§άγ<Τͺp ͺœΝB„.:τЦνzf䝐BόΒ„’Λ>ΘtEμfO†V‰-ΣbDC±’„‘λ+Ώ¦–σοΙυˆBn [ι˜”/eDΊςθoZuόm<ϋFζ}ζ+Ί5ΪΪ/Ώ°₯Ηά’γ7,ƒDe2E‘y£QϊψίΡξKο¨χЇ7μlx΅8T7χχrΏAρ‡ Ψ@FέLΒκ»-δ+ŽI'`ρBόJLƒ�d‘ $~όρGcΚ�όcF4{Θ膇Ό€KYP°fωreK«nKΌπlήΌΥΨΠ·7U�dω@-W©ͺέTΦΔβ˜α‘‰iξ9rf—ΣχŒΚڊ'XΥά±γΗiيU΄uΫƒθQyϊ�Lώ5k&€Y\1uΖl 2”Η#<Ωƌa.βt['bΌN+Š 3λͺ,ς@τlίΌbˆ#έ*W«exQΗΣΙχ T˜Y·qμθοQέόBΐ:�15‚‚·6ΌΆαε@<ΚΚ”)EΓT›Ζ�<|δ°!T²„…XΦ XL#ί±e£QO­θR 7X·�~€F•u΅‘~ςΔ)z�αƒA\λε}KΠ_Έp‘jΦm`sίΰΓ0ž˜ΦψZΘWθΨHςΙΖ9$τ~θλ:!ζˆdGY3»vΥrJnςμC9}Ϊ±s7V₯aPΟυJΐ:»ήόσl€·0HoeΞ<�‘Œʞ -iΘ AŠš4nhœ‡+‚ΘiΣ‘“Φ3‚_!–»¦b… YςιυΝ,€2@ά™ χ€OΘnή!•€uFϊηΩpύΖM‚§΄²ζMKy΅­–f­UO°ϊΐΪŸOΛΩ3¦IX”3ˊ˜λΒK«΅W ͺQ½šq­ͺ2ϊυζ _UΧwωΚΥΤ&uhί†7¨olτŠ"t@Φ u‘]'rdλ‡H΄%+ΦHBΡUƒ€…ηYmS-τIΤ₯°-Ϊ οΚΏώ’³ τΐUζγΐTmL™†ω†€ι O½GŸ8υjC›Aΐb –|cI¨ό™¨U¬3Βݝvu‚ΟΡΉq‡€‰ϊώγρΑYκj:Ϊ/’Σ―Z»If™½ψkύζmvψγ=AΫΥ«%’ΪΫΤ:Ϊǜ‹] rTΗ/iξήκ~υi8Ζv^Νz ‚(‚V+,MͺΤ½“…θΧεϊχμLI'΄ΩoXGΊͺ1γ8ΏΈT¬~M”.Q„ͺV,«ŠΫ,1eΏQΛ2-©ΠωοΧΣ­@ͺDyp#Π.™ΝLΐš΅€UωΑC‡ ©„ΕjSzSΓ«:΄°ώy6˜±ΠΝ ΰĊYζΐ·μφ»¨M{λtPέσ\—Α>έωm™4aŒˆ uΰ:uΪ ‘ϋ{ΐΈ~�f\¬[½άΖ#Ϋ7,fOΤkΨΤh²W�TSΊeŠΠqE˜˜ϋr ͺt™’žoŸ>ύ+=δ‘ο.«‚χ˜ϋαN.G$φνŒ€Uo|"»υž²χ-Bξ°Π †ω†€…6λΕ{ιρ›OτβέΏτόέ':vύ=­?c‘! "ζΆšπpΥƒoεNjζˆFΏώ™’F°ύ]6 V˜€ dΠ‘―ͺ ΡC «°yςδ‘½{χͺΓ4–K–,‘5j۞X™0ayyYGΨT›+V€Υ«W«Mρ"π±ξΙ‚ξ₯2= J?q2Mn‘¦σͺ|ί.�ΌvŽŸ8A»vﱋ_΅r%κΧΗ:ΕΛΏ,¦„c6,ž€η‘#3kΨ"7<­`:k&WU[Ί—°ΉŒ Ψγ'NRݍΥ�θ·y³(s&ΛTD#Ρ+:1X«FuκΩ½‹―Z3°ΞZ=·}Ր(ά€YKύψ°¬†©Δ“'Ž΅‰t>}κ$Υ7§]³MΐΒ;ύ§Ÿ³ϋ…€ΜζLΒεtœ=ιϋόωsΪ+Θ'eyr粓wPy:ιRjγΊU*Λι�|ύŽ9œŠύΥaω’e*ΠΝ[·ŒΌ3'ŽΪι䙦•\B·UI$M’˜Φ―Yi*a/A “yzasΰ=uMšIGGžŒf/ζvmΌ¨iγF²ω{χοS‘βΦιΒζΐO:‘θ.Α­χ[_ΧΟ•3M�<@vλϊά… 䣉γν="Μ2�ΨKQš4©υΓ ³—�~Ξ0­* χϋβ…σlκϊfΣ@/\Ό@xζoΪ².‹hήΊ™₯KάΑWΥ7#ΣgH¨2ΉT„Ž™ψt΅ΟzMΫž…Ω„—PΡΒω \Κφμ;D³ρs—€U䏹Aΐφž­Χ?{ΆN;ΜψpTύWΛf­;Ώρξ°zπ(hΣ–ή₯Y³d”όhžυ›΅•» Γχ 9Θ‘ά©όKΐžύγ7Ε‡½Ψgλސΐθڍ›²‚ΫEΡ<―υšπ4ξ;Ψς[ι(ΰ“^φω‹—΄_ΜHΪΆs―ᩈ|hΣB£6€˜_ξWGΗΆuΗnϊmρ ™‚„ργQΗξύδΆξ-�Χu‡€uvλν8"`ύ"AKHJ4oTW6­{·zΪV‘χ`ΒuκΜt’� �? Ώ f€3 ‘αΜ¦Οωφ΄8ξ8Σ¬vV74§ϋ…€υ3E�.ΝκΧƒ`ΦwгέRmΚ}¦ ?QγΊΦΑΠ?.^‘γ"—3Ì�SgΟ ω‹tΤ¨NU£ΨrΫf—ψMΤ-E²ΔΤ�EC#Ι οvέε°b–/˜4sΠσΎ*ΛtjέΔ”uGΘ|ΰx•M9@­’#š·£χ2Κΰ™ΉvΣcΫΡΚΩσ…tβίΤ³“ΕZά°7oίQ7AD› Η‹γ†6Sο«τΰΥ'‚’Λ½±±πŒυο—œβG·z�»Cΐb?Π`αλΚόKΐ>}ϋ/U‹ŒΛlqΏK½ΚΔ’ŠΏD1gϊ6°Ή™|…μΜ&W(!auΣ�=j‡τΎ}ϋζ²+θ‹„•+WRωςενj”,YRhͺn6�ƒ’€…Ά(‚₯(sF‚=zmˆ ϋώϋοeδb|`|ψh}¨θΑ­PΞLvόœ!ύώΫ\dIΣ XίzΤ‘Ω8Α63Ί†ͺ90“šΞlι!Ɉ­ωEπ$Eω—€…φ)ϊͺ Ίy Z /gd ˆ8 €E£υΡΕ9πΙΜ^§ϊτ^Ÿκͺ|O°f’£G·Ξ4ΔΫςρ†©ζ'…ό€£—k3kΖ}υ,κ#HΌQ`8Η‡D`'xDλfΖbέκ”,iY$ X³Χ-‚―A"ΑlΈ? +i$;"`ρΒeΖwξό4|δ£ž#�™¨›-W^wί°:y ―ιγ‡­€²ΪΉΩΆX±"4f„νKδΓ‡¨PQΛoκα^RzΒΈGAτ*sTίLgΦΏΟύωLφοΩaχά0_Σ: έο]Ί)8eΓJmΟτΑ)Τ Ψn=ϋΠΪuλe}άSϋ„Η΄Ω L=2φ'vl‚ΧβΓφ΅˜»υ)bρκ5λ¨GοΎF=―–ΝΘ«y3c['`K—*AΓ‡6ςΜ+³€¬…2wε;Ty�.}KθθD τΗ ³~Τ©ΎΜ˜»0₯ Ψsύ;"ϋηL?φΘ±“4iϊYά%`ω‰wϊξ»πFX9'‚“Œ;I¦ω—€u¦³Ω¦SO©Ώ‡>L7Μ.βΆM‡LΑ€E΄ϋ.½,ΧUŠdI©w·φ¦^Z6W―ίL+ΧX¦ΡκAΦΦ‡ŽO/[ x�–/]\Λ ή«Ύ½_ ~S‘³‹%dβB;~χ>Y|βθ‘Io€u†›_ XμXιγ7ΪY�©³ζΣΑΓΗd?ας$«λVCΦ‘{'Λΰ‰μ€ι n†dgΘTH›@βΉτΩ™ιΑΓΰ± Οm6αΐ�­Ώ0”.VˆJ)`”Σ Ψ8±cJυ^ gˆΡ"XτQaΘοέΩκUεΪ 7Εϊ› UϊΦ κί ς1ˆ£`VΚnί½OΓΖNU›rΩ Vϊ%Sz#M'`Χ­N™2€5ς&ΟϊΞ ςWti‘O«ΜS,ΪCπ0Hΐπ}έ±§ύ» ΌwρNS³9Z4ͺMι�€”iψƒ\Δ₯ υΛΦxξ΄ξ�Oe»\D��ό’tΊ$’…fkΤ0tj` Ω‡M"Vƒ™wε:‚`E>ΩΆ.Im¦φϋDΐNΫύœϊ�΄Ύw’ύ°ί|EΎύJH|Cώώ@œΒόKΐΚFğ]"θΦ ΅ιΒ½ς˜U:–qΔρoνœΔ¦ηΦ:°„΄#ς5Ρΰήrοvy‘€„Υ Ψψργ bΠςpΧα~#4Δσκ£OΟσλ:φƒύ™-sζΜtϊτi#9( Xhζ/TΤ˜ή BcρΒω6RΓ†’yΏ-4ϊ«rŒp}6ΨΈGΜˆΠώκK bυρR ’\Ÿφο[9 ŒC›»Άo&xVιf&`‘§Ÿ<‘ϊbͺΈξ…kφκΦ₯PΏwΟnY Α£8©kωΑ™€E�όσlθېLhυ4†χκΜi“…W^44MΊ<‰Lt^¦Έ�•<ΨΏ―ΈφςΚ—�ί—,₯ƒ½UΆ\κμώƒ‡¨is«Wž�„F4ΑpjΦi`ηCΪΡCϋΣo{χ@+V�F’΄Ή³¦‹ >Ώ¨M) £kJγyˆη’2€™ω ς92H(@JAΩαύ{(Κη(Γ*- —Ύ%ttѐ'ŒbΣ=xΝtμήWτ>ιϋtEΎ»ƒ‘ X\§ 3<Ρ7Δ‰DD\x"ΒY73I쀩Σh�δiϊξε‡-+π‰ ³ιΈΈ·q+Σ5αΕ^Nθπ"h“nΜH*Ό{xΛΆm[έφλCfoH=ίΌn–CΦ/4usDΐ"ηχ£ωΰ^„χ«ξ �Λ\θm;»Ÿƒ;λŸgk\ΣfΓ3φ•πΖΉ7›Nΐbΐ$Wή6^Ο(σӟν2AόΡ X€ΥkΠ„Ž Iex6gΟ‘^‹ύŸ9{Ξ¦ν*•*R�Ύ½dΡ=ϋφS ―6ͺšΌήρ›”2E :{φ›6QΘ\ήΰζkƒ$4_·y όj\[ ?ΠV`š"ΜS�]υA'2¦�‰~qbΕ€CGΣ‘+‡χ eξ°Ξ΄#B‚}›0e¦Τ"UύD€›?ό ŸΑj6ήΧ@VΒά%`u ‚Ψ“�Ε‹ˆχ’΄tIx\.ZΆΚfϊ»_ XhΜBk†k¦ŒZ”DόV(’χVΣ֝δ ”I$>˜«”/-˞ΧοŽέϋ ’Λ,Sΰ_ϋσΙvν9@s~[,‹Υ¬VΡПΥλM˜6›Ž?%“ΰ•^΅b*\0Ÿ˜.ϊ΅Τt:kžq�š=ΗOž!/Λΰ:ήwͺU,GΩ³e¦'Ÿ�α™ OOu^GιkΟϊώƒλΊ_ξWgΗςΗ…Λ4|ŒυέεjW―$$E 8¬ςF*^ŸƒwαήΘ—'ε2‰$0Θ&gχ±ή # δίΊ}—z΄4gSΐ δΛ- °sbz8žxη€εΛ““0_Y@°ζk±\ιb„ oΠtΖtkhbοΩΠΈ¦Jϋ•ͺW.'»¦Krΰaφ”1y†ΐ]η/^–εWΆT1*[²¨ό½ΑqnΫ΅‡–�XkάΗπRΖ` ›O° Qϋvm#1WΈκή›ωsg§ͺJ©,yŽο‹AθZǎΓ "Q`‡x�­\·E–-SΌ°x�ε7κω΄’°Y2¦§†΅«ψTΕΘχ$kφ ΖNΰεϊΧ_οΕρΖ”οjΗ7Εύ:bόtΉ ω‚A½:ΪΝΆψ$~‹ΒˆkΫlAIΐ‚dΝ1πOq.-½�p!%N›‹2#Eμoi_Ο€–BΎψ«ΨΒi#ΡΒζ ljκoΚ8ί�ήφν^ϋ„&l*λyš€Υ;ƒ b&sLL/ΠλLΐ0ΒvΔͺςUuΑ�l&auΗ·uλVϊυWλ΄ouΜ§N’9rψΫ /FΫ·o§‚ ͺ¦%<_α«[P°ΠΧkΩͺ‘Ο©χM_‰ρϋoσlΌγΜĊ^^_‡fβΨQ#l~,/^ΌH•ͺΥ�‹Ιuίθš§’Ϊ5¦%ΰ :†)SZG‘ H182Τ)_�Œα…mί°ˆτ\€X)bOνGχ&2}M˜8Ee9]ŽS²‹‹©Ωξ˜>ΣύkΧ΄'š}jΗΣ,44nf³[2Ε”gζ†ώ%`±oxH6χjm|T:돣ˆςIΐ’-[΅₯έ{-ӝυK₯O™4žςηΝ£6Ιμ iΦ/±YΊ\%‡Χ¨ΡˆΆbφ:Υ²œ�še@tXU2°�6{ξ|•m·Ψ―· Σ*Ψ€›eOl2Εt¨W¬ZmΑ€E�ύσlpδ₯ͺcύΫι3gI:‹Δ5kΧSχ^}Œ|σ Φ͜3ΧH6°ΠΥ­S―‘!οa4­€M“†0¨‘ΛΨΈz.λΥΝŒ Μά0›W !U ώ+3Λ<ψ$W κyrιBΗQ.½OΙΕΰɟΧoΘ$w XgžsEΐ‚€3a>w^οΊ±žMθΆ>ρΚ8w ΨΛb&ΐΰαγŒvΜ+ψˆ…WφοWφΐ‘£4mφ›¦Γ† C³&1�ŽςrʌΉaedh+xŸθΧ½£$hUrp!`Ό…ΥWΥ?σΗ=fΨ@›)σ˜6"x�̝ \�κEž_ξWWύQ―pΒτ`„jš°£zκ>Υσΰ© U˜Κw5 γŒ€Eύί—�’MΫvbΥ©$ΪΏ§ i,�ΕN=ϊ ggNϋ€2̞ΑΊ7:Κ ΨΛπΘ Oό—ΒσX7}ΰG₯COvΤΠώYx*³Yπ˜—ΤyIDAT‹–jU)GΉ²g1`} δΐ°Lx ―Π΄šW¨QP[ΉqλM˜>Oκ‘"„$τX•.ͺVT�ΎzύFxoG6’u‰έΪ5§&―Urp4Y$O°ΨΌYK-h ¨ύκKxΈŽ›:GΌ[=1’s‰A�•Λ:}~θΗTμό/¨ϋ2HZΊ]AθŸN©Ο8¬”y“Nέ~/Σ¦7ˆGe3Y<œU!Θ”}ƒžΎω—bG C{'SYr©Ψ"}Cη‡Xe©°‰b„₯#}’ΫΤEΫYϊ\₯Ÿ,μ°Ψ7ίSέιwdϋ2G₯A•cΫμ Ι;_¦·�cV!sφ‚…‘N“�žWeBΪς�χXzς›Εγ}‡ζ«ΩσΥ|L‘…„5°νΪ΅£Ρ£G›WnΟ›77nl| ;,δ"?ά£F"μΓ‘ 2„zυ²xω¨όΐ"`}�™:rτX;" Lš5md£_ͺϊ©¦γ'L6�¨t,αuΤ�u+ιωκθ₯uΗ =x«*¬,‚ ^0w¦ήŒΛux‰9ΦΞ+J―T£ZUραέΤα4Tx M˜4ΥΖKu&L =q/’XιdΒϋλτρΓFΣ3fΟ‘1c'Ϋ§O1¦†«DB(·nύFΓkΜLδ’μΩsη¨[>v―Θ+//΅ςiQαŽa::¦/+ΫΎyƒπ¨ύQmΊ½Τ‰?G}v»‘Ορ"5g’³^ΪΤ΅s—Mω„‘™(ΪΆy=Ε‹Χ¦Ν‹/ Βί걁 DN€tDϋυD;vν6�G•]Υ‘ƒϋΛiό*M-υ€C˜κ ’ίl5jΧ^― gΊΜuΤ6^–0ΨΰθώTe@¬vjίN^·* Λ?…§VυΪu%ζΈ~ηΚf'υooψοΘ³νΰΈ:whOπ¦φ‹ιšΟπŠ:zpŸΝ‹’™€=ζA~bι�v^ψ8xN82œηΆ: /ό{F6Ž»h‘Β4tΠΚ’=·qŒΊΔΌξ ¬ ’ΖP¦{Jκ:�*ί7K}ŠͺU*'‚nfΧ“CΔΊΊ_!•2y¬υ>ρkη§Μœgΰ ξhΓφκb3¨ ΚθGΞΚ¨²ζ%�Εy‹–Ι`Xψm0ξΏ*ΚPρ"…l²pvξΩ_z±"Ψδ4tƒ”ΖB mχΎƒKπM—#[jP»ΊΛ ^z›_ΚΊ;¬° ΏΛ†§Η&"ςƒzvΝ ;]+iσζ”Α―t�ιΈF>Nλ6οΐ¦Υ―Y‰�  Ίͺ7nή‘εk7Ωθ˚ Xτ Δpϊ΄© "ΧΰΫwΕοξ)}€kέZLυ‡5oXKΦΑΊYNaΔΐξq»qΫnΪ°Εω@GΚδI¨ͺT1{ωβz=!‘‘Ύ£Α±Τ)“‰Ω’^ΜΠiŸ<£ύ#X₯²–w\ ϊtμeωm–.ώψVž«5rD5Z|τϊ_:wη=]¨ž ‚SΩχΏ‘£}“KςQ₯a‰€Uω†\7’šόjŠφΒ|σνΉόŽFmzb΄ Α&b3Mχ+τβe?U³G₯Ϊ9£Qβα U]‚ šΘ―›;Εϋ>mϋγ υ[ύ˜ή BT™X]ην5+jŠΎ$}Ωqα-MέωœŽί°Ό?”Μ™f7Ž―vθKφ€ @ΘO₯Λe΄ξωͺ ›IΨLTY!fi&`όρGΊqγ†ρΑwωςeŠ)¦t+ΈƒRηΝιΠ‘CΎ:FxΆz{{;τ�ECψρI—.ΑσS·€"`±?ύEš;†ŠkΧ�IOΰ8qβˆis±mFΊ΅βεπΕΛ—RΗϊ·ΎΡ�ƒζ*¦Kθ^PΞφε(ύΡγΗtλΦmόλΕ«—B'*�ˆ�Ÿ'N,ϋ㨎ž"φζΝ›τϊΝJ•*•Ÿϋ‘·i^B£§Ži”G?nˆ)α/Ε1DώƒΠλŒkθ&šΫsΆ=uϊL?Ρ’¦*rVήYΊ~ αeΓYŸΥ7§γΙ“Ώ° ³vΥrJžΜύΑ.w04οΧ/Ϋ δξά½Cί ’Χ>>‚ΪΤ΅qγΦ-Ί}ηE…'I$΅χΤσΛQ1ΈqεΚUJž<ΉK`άƒΧ―_—S1…^ $€Db0Β/Ύή—M›·PG‘Η¬ΜπΟ«^p‘U}_xS¦ύW’ͺgKxφήDFd‘o�/gν‡tuώύςlΐΆλ7�K]rŸ0³ŒŒ#επΈ/4ρ?QΒ„nI  žΩpN ©‚ηHόxρ…ξΊυ#Α\VίF=μΗΙ <Χέ½Πwό¦…ΣUΝ$oρ�εδοφ…7Hw„4!/θΒ©`$!νœυWE5Ηs`ήτρΊ9Mρς•ΤY92Ψ ƒ'ž› δΜΏτύέΈy›ž 2(ΆΈζγ‰ 1ώύ-ΥΫθušu] �δWbq­ύ$H ψdx½�!=d4ή{pΊΒΙ§φB[>$ EλΤ�%eψΙ½Av1PΎοCΫW―ݐΧwςdI ς( φεn› Ž. ƒ›ΒγZΞqγΔΏοIδΰŠ«{ χ©«λδΪε«Χ οVϞ½ hΡ’RRρΜ@:Ύ^ŸwXΗ5ύžŠwRhύυWb`φΉχ²³–‘ƒFτχX4ŽΡΞθΑVg(3«ΪAΉxΒ‘¦‚ƒ©ΌΐZ&ΈŸ?iG^;λϊ ]o|SC#Φ?ζ[֝}ψQνG 'm9²Ρ[ž�π φ—zYHlΑ«Ύ kΫFΗΕh‘ΠXΥMΧXu„K/[4]$Ϊϊ‡E‚Π?,ڜ΄γ \σXoήnςz%3b»ΐl‚ό|ΥΊΥ{0Ε¬]•βwsμιlχŠ„υ qλ¬­ H7°θΓόωσ©vνΪ²;΅jΥ’Γ‡S—.]¨Y³fF/]ΊD;vμDμ’Eφm(X₯JΚ›7/(P@’«Fe+›7o¦’%KΪεk·#Nψb¨,€ΰΉ s4έ;(€€—eοώiΛ–mΖξκχίζΫΌz œΏp1Co3ož\„€~Κ\°ͺLp[B’γΰ‘#nw«zΥ*"Θ_·ΛtAw Ψ€ξGP΄αΒEͺ\έκ:lΘ *SΪώχ9(ϊΪχ �xΐP‹DD<1 ή·GG»CF .s‚EAV&ŒtΟ[Η�!N`‚)z@=OyΤΣCεn…B‚‚€υŒξ°žΪ_HnΗφΙ›O”Ύ§eφΈ£cτνΧ”(f8Jχ[ιqš5IGΕl�Ž\�‹šΝΉG_}²IαΪ@xΎv/“Β ―X³Ασ΄�κG΄ψπKz/Φa:‹ν™"Ψ`AŒͺ|€mUδ*•! ε| I4Gx₯–ή©°ε"hV«χεϊ†‰)Kβοδ:ώ(έZΛγjΩΞΎ\}β5 Xϋ˜ξΏψΗ(1Ι…ͺeF½ΛΖ"x₯1”θ‡β};"`α vNLω† =?^zΖΊΪοm‘3½SgvZPΉsη–d�£2Lΐ:B…ΣB :‹Š”)RWΛf”?―ΥK7΄+‡ίΨ±S%2-°0B―zψPžrμw4έ« =κξ=ϋΠ�Δ?XΕςŒ“Σ½Κ\Šπ'g�Έ@Ώ-^nΙY5ω�φξ(΄κ*Žψ±X’Ξιƒ>¨ΤB„1bLͺη’VαSˆ’,p>‘Βaƒb$Q{˜:θ©GΟ–υβC‘Ε¦O3%η¦V��₯³5qΧέξ™žϋχσπά»�ύŸ�ο|ΞΐρεΟY^ό_ρVΟkαν7^?�¨„@ωτwω­Έςο‘­[^ϋŠΝπΚίwVx�πΐμU­Tw¬uΣss{;”λ»NOΟΔSΪΚoφρŠ `+>Αjx °e=kΧ� gϞέ]~pp0=z4άΊukΡε–7m,6&ΉίQ†³ε±Ε†9 Ψ…dόΌ*eΠσD±‘JYUΕΤ8 Prc‰«Wk›Œ¬,6³κ|vcώTΑΦ °ο:RόM�hΧ�\ŠqιsNΰΝ»α‹‘|–Νš«Μ«”Ψ”šϊš¨ΐ–Z·n] [‹―Γ–Ηd±γvΉVλŸΕŽνe@Ÿ­ΌΟ? °γγγaϋφνŎφ—ξsΥ܏°s^ @€ @€@ž‡ϊ? ·οώΥ�OΑζ)›GUεΣ―mΕNQCƒGς(HK& €]2ΪΗ»γ°₯N{{{»vνš‡U�[>‘QοΈ|ωrΨ°aΓΌœ:u*τφφΞξψ=οδ=o°χ€xK€ @€Ω  ί�πSh{jyx²κ–ίrs΄Ύ@Όή-‚υΫ3Σα₯·„ύοξnύAA]l]'�―ΐͺφ•affqk»μΨ±# ΥΦ€-ο7==ΚM:κ�]φjρ5Ίώώώ0::Zο’ΩsαΧί~Ÿ}ο @€ΘQ`²Ψ€ϊ£O>ΧoάΘ±<55)Π±jUψΰ`hΐChMήΖε`3˜„*–πκ+/‡σηΟ/zhmmmaηΝ‘―――ΆHώΆmΫκ^{ϊτιΪR###΅ΰ΅‘υc»»»ΓΧߜ«ΫΏ“ @€ @ ΙΙkαδ—_…KΏL„›7§r(I M ¬XρtxfγϊΠ»ϋ°fΝκ&{sy+`[a–Z°Ζ'N„ύ}ϋ²¬|δψρ°gΟή,kS @€ @€@΅°ΥšΟ¬FΣθS°£ψ���pξΫοΖ­άƒ @€ @€@ΐϊ%X2+W&Β›==αΒ… KvF:ήΌys;s&¬_?σ�FϊπY @€ @€`ΡςΩ†¦¦¦ΒθΙ“αΨ±OΓΕ‹Ύ>ŝαΐƒaΟή½άά+ΕύτA€ @€ @ `£„– @€ @€‰°‰AuG€ @€ @€( €Z @€ @€$ΐ&Υ @€ @€’€6Jh  @€ @€ X@›Tw @€ @€ˆΨ(‘%@€ @€ @€@blbPέ @€ @€ @ `£„– @€ @€‰°‰AuG€ @€ @€( €Z @€ @€$ΐ&Υ @€ @€’€6Jh  @€ @€ X@›Tw @€ @€ˆΨ(‘%@€ @€ @€@blbPέ @€ @€ @ `£„– @€ @€‰°‰AuG€ @€ @€( €Z @€ @€$ΐ&Υ @€ @€’@vμšΥ±6- @€ @€ZZΰΪΧkυoy~SSγXφwq4ΣÏ?Χ.ΐ6£θZ @€ @€rΘ.€m6 Ξ W- @€ @€<ήρΑΣfsΟdOΐ6[Θγ=FO€ @€ @€@N؜fC- @€ @€TJ@[©ι4 @€ @€rΐζ4j!@€ @€ @ RΨJM§Α @€ @€ “€6§ΩP  @€ @€•ΐVj: † @€ @€œ°9Ν†Z @€ @€¨”€ΆRΣi0 @€ @€δ$ €Νi6ΤB€ @€ @€@₯°•šNƒ!@€ @€ @ 'lN³‘ @€ @€*% €­Τt  @€ @€9 € `�‚_(“^j:’IEND�B`‚pydantic-httpx2-9b7ee8e/docs/img/logo.jpg000066400000000000000000000363501521723372100204460ustar00rootroot00000000000000�Ψ�ΰJFIFdd�μDucky�ξAdobedΐ�Ϋ„   #%'%#//33//@@@@@@@@@@@@@@@&&0##0+.'''.+550055@@?@@@@@@@@@@@@�ΐΠ^"�Δ‰!1A"Qaq2‘‘R#±Bbr‚’Α’3CΡ²Scs“$πα�ƒ4DρΓ%5Β£U&�Ϊ ?τ (’€’±Eh’ŠŠ( (’ŠŠ( (’аHHΦkϊΗ4΄™’#—Š# {―Λ°λ ένπ λθ―:ΰώ«δψχHsζΈπB™Ύ&P@Υ[Τ< zRΕύh=Šσώ_Ο“Έd-Ώα‘ϋHŸ[scRb{kͺZ�a‡Epgλ~] :‘fικσSXŸ_m™‰§‹Bn•ΏΣAΩQUX�Rqs(ggΗ .;θΘυ5ΆύυcπΜ7E"Θ £χPIEPQEX¬ΡAWτΧ žΟω‘ŽΫϋnΆϋι,§σxWfβςšlr?τyΚMϊ‡[ό5ΠΡA>BΞ›‚΄m­γmq©]΄©©fč$“" ‘! δ½�ŠUUΪΝ₯o‹•T]؍ΐ,­ΤY•aζυQEQ@V•T³ ’t ΝUςΉ¦B$s€X'^ώ―γϋ44 ΞΛWtž.ίk{d:τvθv©Ύ–Χ­YΕ‰‹v†ŒΘw9U Ή½&ΥΌqΗkJ4UQ`π· (’ŠŠ( (’ŠŠ( (₯ς³°πΧ~Tι Ϊώv `5[/ΦOG�»=(¬Γν AuEs�όγιί Ψ�ε·φŠΟ�6ϊxhg`qΏΡAESAυoΣσΨ.b©> ύ·«X¦†eέ ¬Š|T†u”QE_Τ- βe1>Γt n”°Vπ>Όχκ<–“œŸ©@UΩT"ύΥι|†;δ`dC l–HΨFγ¨kyOΫ^aΝΕ1fpH±#[^βλfΤΠ$. k-{z½:zι₯Xτ(±]Ε‰ \›S|\QζΘΙFc ^4P·^Ζα”ίjλn•ΦqP "L†Δ•_8ΒΔΘοO1‡EK=οpoAΔφ²5/ͺ΅Š΅ŽΦ ¨Χ¦΅`˜Ψ a”Z‘-΅#RIto‹ΗΡ�ΊžCω₯8arb™oβέ$…ΥtPŽ—υU¦?6šη*G:ΘwΖ¦ΓvΕa�βτόoΣψxγζ!dPηr†Ί1]Λ‘#xτυ΅X/�Ό±aŠ νavςΨ[Kœπ˜Jwc™1[ύ̌ƒωnWξ­ϋ<”ς¦\•a΅ΏζG§χh"vV2,x’’Γ wRή€ϊ8ϋM/6}ωάeΗώλφώxvH=βžΘΟ|mάiœ2έήξͺA·›μZ�>oŠv σ+‹-β?d‘h fˆKΖr’μ?�LgΥvσ�zΆο}AŽŸ›iC ˜[hλu”β©d‹`dΒΙ\yI$Ι B­oΜSpί¦΄9œ–%Ύkζβ�oˆ5φ‘fέό€Πg›Βšo——~&G„9 Ϋ-ϋ§αoq« ―‘8ώP’)(ς0ΨκΙύ’τ³cMƒwŽI1Π³ΌΨ�Ε]“ψM¨.¨ͺ¨Ήy£ˆK— ΌW·Μc0•»nSβ};‡–?ιζYκ ω‡΅N’Š(’€€¦‰qrŽj=ν©ͺ»‹mΡε€P·74νk"$ˆΡΈάŽ ²Ÿt"€GWPθC# «pAρΆͺόGωL–γίH¬Κ?„B όΜ6“μ« Š+ rg(₯ζ™Φ(T~7ρφ­cΐ€ο–F2O-Ά™$mYˆŒhžLΙsdΡJˆ 6ν1fR‰oΡNPQEEC‘•‹s&U‰?·>~΄’ς“d遉$ͺF“Mωkθή7ŸrΠXΤ99˜Έ‰άΚ™!AβμτΥVAΝ’aΉLσ_vΒL³6βΩκ.‡SgdD’tO‰Υt�χoKPk7Τ+εy9ΕτVHΚFσ$°¨{ίWe‘ΫƒΔΚΖgϋJ΄Ÿ’Γ‚QŽ�nœτ†0]�•/o}Dgεf?τπGŽ—ψςsκŽ/νj οθœόΧ9\δˆ/ͺγΔ±‹~υ'?Α¬Κ²ggrhAΕ+ΚΰOhY}δUαβDΰPςΕξb6ŽωiΧψ‰­Ξw†’έέ.φ‘@ŸΊƒ˜Μϊ^NC/l\?”‚ίžrdέ#ۚώgcq§Qj›+θΌ¬’%9Γ*τ#cD ½‰;WO]t+Ÿό N�’d0S�-77Ϋjπ9IΝζδ )mS5M~Nα α2x8°€0Νbθβΰ‘qσ02›΄4žF&12\ώZ(έδasqζ7R+Ρσ8^3-‘²β3I΄F$7έ κΜ–τuͺο€δΔ†vÝ�Ρз1±P.²_©ΆšPp₯-qbHλ`~Ϊc#7D—V‚Eνr’ΗΣVƒ†ό―œ™’5VRθΗT2Γ΅/Bτ₯ςΈΥ…LΡ±eV 0SΌά�ο…nΆΌ}”'υΟyΧ”UCπœ₯6[“aΉ|/ιΨάZχΣ­λΘ dΌ.Ίΐ‚&–φ:­Τ·τΧ€Y?ψίo΅.Ξίo³ΈχvξΩ·vΫύέ(-ΕyηΥ8Œ9 ΈΠΤN7,Hκ-�½ U'Υ8Λ&y _dy;ςω―ΰ(8^3ŽΞ–`SiY,K€W1ΈθFς£C]^?Qc™g\σfiUηm˜Δήϋ-VLfG‘Ε€JGwςζΣΰίΔ5«Š ΨryΎΪχπ’2~±I¬ΎΰPšΫηy@Hn8›x€ΘoμέΆŸ$s 4€άΏΫ&L{�νό©sAΟr�›'όΘΏρΦί;Ÿo�_'όΘΏρ�}eΒ#mW’F½¬±žΏΕΆ™ƒ™“.�'ˆΣρμ@―ο δŠ ήnMʈq’0VμΣIπŸFΨΓ_ν­dγη̈ΗΘN6ψ‘…{hΓπ±bΞ}ΔTm?;>ί—ƒσ4Ξd`AΆ‹Ÿ}gδΉ)mσ<Aψq£XΏ½'pΠb^ιμxo6,q ΆηD_οUρα`r)ΪβqApsX†ΗQwΝό[Om[AΔαC ˜‘šq�i˜Κΰϊ‹“·έZΰ^f Pβt©…ΪίΖ­Aϊo‰’φ‰‘o|±ξΌΝγ[EΔόo–ϋ!c\_υu]½=•gE?$99“+³_'ϋΊήδ%‰χ‘¨&—)7�~Ωƒ%Ml=ΝΆΊIΥ "οaΡnύζ—›+Ν…EΉ4ˆΙδ³Xˆν`p%ΘΉσ(ΊGΧΖτŒ9x8“<3$²δ1ΫΉΠΌΉΐm¬ΎgΊƒθU­'ΚΝ$Y2H2dRW ϐΚMυ?αΔ Ž¦δ~*ΈόyŽΛεζŸ‚KεΪG•΅=/ΦΫEςΐ8ƒ.NΜčΈXί›’�Ώ²ϋ=ίΝPβp܌κW)ΗˆNΈ˜ŒL� ω‰φU�.ΖDί/xθδ}>ΆvΤϋθ„ςEaβE…ϋσΊC‘ikR²KΘγΙζI\lΜXTC΄‹vΫS°ίΕͺζ ˜rTΌ$²mΦ eΐΈ­έD)"‡FeapG¬ΞOuεΗΚ,–6!: |]OΎ£“šRZAΠ’ΐ€}±²Τ91δρ―€λ$"ΖΈSρ9ΫhdκΎΓqμ©�¬Η?;>)KFdOsΓΌP!&*<„“Φ硐b[ΐ+y4ά9ρβΖ#^3'<8‘‡Ω=3Λq™gn>TR?ΰ 7)Φ›” �VΕήcΫ6ρΤv%τ_�ΛV¨‚HLl†·ϋ²Ώλν§( ͺώ±”�˜’βς[i ±ν’άzΩι^@r9ΫœK²Ηslˆΐ z1O2’ΎιWτPq�Αυm$*΄ŒΚ{qε<–܏ρ(kxOyΆBM•Θ2e IQν’·ΆΛ§ΜIρ«i2s°Xfq₯"Ι‰Iš(Τ δίtFφλ^΅]—•cž?=Δώl“δ6άΔΪώ‹υ Fhp‰BtPH7ΫΤ­΅�γθ¬LœκŽ' 1Nλήϋδσϋτ§j2ρ’�IQIΠEΟΊ‚ZΝ-&t(ͺΌ›υ]‹ύ­aU―υ%ζ’ N?')γ°sl¨'ΐ°r“F2Ή8•΅ {Δxw^θŸbξ4ύRbfs%�₯2ΌΞYΪI£Pς¨ς†:(τSBnt›œ\pΎ ΜΧϋDTfEƒ!ΆN'|uέΪξa4Œ˜ŸNEΘ’• ٢ˎΩ²šηŽϊFCώΝlΩy›JδqξΚE›΄ρΚ:tr„ύ”}ΘύA˜Ω�MΛΘ‡ FZW{¦ο;7Zš¨9X2qΖO'+γΉM MΌ·’Νγεƒ!CαΌ \Ωζ]‘ΎΏ­ =½zτΪ“‰ΰςy\θΜcd0Ky¦FR±ΪΝ±N»šώΪμqΩ–Σ’Θ‹¬'�·ZŒY~MοΓ«Ά§h3ΠΞB½…­2\ŸkFSτTG3’„‘>u»ρœ9ώI6²τόΪFl2zž>τV§#ž‰¬Ψd.žh¦(}~YϋjUζp7l•ΫϊmZ/½ΐ}O.n,X�e4ͺa‰K;‚ ΠPγΝ7!ΜΝ‘,rc<(˜Λ»oΎMbΈ±ΈΤι]-Vππc”lθK”KΊ±k±%­b@χU•+5ŠΝ’.ψΩ?#νΜpg’Η“+ŽIbIχnU”΄£UΆαΠυ�ͺ¨ΉνΨ“Α›Τ™›n♀ΈMψ…ΕΡρ²ΎΉΩRdŸ_Ι‹ωcΤϋΙ¦‘ƒ6ΓDHP}Τ¬3fηEΡνΕ…ΕυΙmθό+χΤ‡ŽΖfί>ιΝοiX²b|?uϟŠ„ͺΏuΗκD φ%κHdy.Z6tΫΊΧ>α{R­Ιρπ±ƒσ₯_ς1—yχνςy­KσZ"&g«ΉΛξEςy4NaX™§`‘‰™Ά‹zΝΕ$όή.αrη5‡ώw φΘΕSο©ˆΔ'~NμΙ:ξΘ;ΐ?²Ÿχ t  ϋΉΉΞ‰zX™δώUΨ£ν5·τ‘%ώo*|‹‹2—ν!ΏμC³ο§θ [ΒΒ]Έ°$CΔ¨>ΣΤΣ4TSdγΐ7M*D=.ΑM”¬ό_o$ »ρ―‘Ώ™,ii~£βcΡf3v³άϊˆ>κŒσyR βqΣJ¦φf:zCν ΔŸMb]€‚I#”ƒmΕ\t�ύΕcχΤRq?“9†ςJ €�w.ίξԟ�Σe±ΒB:όR �8Έ€€γ ŠI+Κ0%Έ”: ΦΊX5΅π Μ²ςXŽXζ€£ΑƒΘAvφτM™’C₯œ,hΆRެΜΎΧŽ(7\z °?Πρα’5‹#9V6EΈό!Ω›ιεOUG“—(ϋαnjVH€b΁ˆfςωTƒmͺΊƒΧE ’Λ—"Ž6ω‡yUς#ŠXΠ“ζ)―q}—ΚC δ$±f(Yή4f1’ΩpΣαqNξΖ’a’’!Η@Ε€ΉeήγGmu#O]G…†ˆ™RγJκa[ l…•νχ6Ϋ©Ά— N@ςf¬`Ϊ8Λα@ώ>GωAeΊTμ)"ιΎNεΐ&ήU±ϋi„Ν‰d“ζsCά9:όZ¦ζk~;}UΌ�KΪ §ROgdΠ-Ωέ€‘λΎΎ.4xΰ δ0$BΰΙŒ¬6‚ήξ`lJ (rΉK.67ΡΖ‚ΕŠ€qί�ž>ΎΝ*FΗϊ‰ΐvž,HΣVσ’BƚAL€|�RAqp©4±± 6έιoΥύ5;αgvŠΗ™#!³–Y€<{Ρ0#ψ…ÌΜ³ΝΘnΉΥbŒm₯ξ<–©‚Ε�K<ƒΔw;`ϋD!B™μ>WTžΔήι΄Ϋΐ^“ύZ”s[ω¬wŒψμ!Ε½6mύΪ ›ιξΞηΕW>–,ίλX^ˆ³a‰0‹jί,ν'ΦΏέSΓΛqσ«0Wό2ώψΨ ‹ƒpzAZ0yhΰδ{Š:&DJίޏa­†_-Ϋ>”΄Ζ•Hχ¬έ³χšzGuΥPΈρ±ϋνQμe`²ΏeŽ€H _Ψ[CAˆω)%0 BΞ »Oδ} ΄V±>ꝷi΄¨½Ν΄ρπ5ΨψΩQμž4š3¨ h½&άCFw`εϊ|wz/ωrξϋˆ i²B³$Ρ: ξΉφ­νο±γΈ\ί:Γ °ύxμ¬?Š;YIyx4Ι†<€�kŽv7Ύ) ΎΖ¬�ψΌΙδ |¦Ϋεo²‚6αε\,όŒsΰ�ΒtώY·Ύ΅_λ˜›Οf ΠΜX˜ΨΑ!�ί ο_H¦N>t:γdwϋ<»μ‘,ίmλSΘΙ�­Ζ’!γ$Άιζυ ]yόuO�!>ƒw£&;ώϊnZW-8όΜΈ“ o$˜λΫzobΝφZ§‹&έJρ‘w>Φ:Π(ά«Ύ˜Xsδ“ΡŠφcώiΆύΒ±·Ÿβ||5> y½Ά/άi܌œ|dξdJ±'₯Θ_ΣUs}E‹q°>kŸ„"―™K °πΉ •›•; \w;Iqϋ0„­%Αϊs=Ωβ‚7½χKgrOοξcPΆ/Τ9j¦|Œ©1Αε ψƒ6¬}Δ}ϊOτφΨ‚Σ0 $ηYAέmζδ\υ4 Ιυ.>ώΞ$ΉN»€ ’5]‡iψ΅ΣΩZǝυmΔÍ΅Š³Ο ρŠO‡_}\¬XΠ( ©―Nƒ§�J['™γρŽΞθ–vΡ ŠΟ#@Qύ΄³p|ΎAS“Θ<ΎΦKG₯ΙT±bzZ±/Αq₯{ς”gmΝΏΝcγλ }֐δsܜ₯1γ\<.9k»BΫ�γόΤοΒaΰžν»ΩάΜϊ›ŸΒ:Σλ €06`hq’Ρά‘R Θn‚oo€ŸF–ͺŽ<|8v “2ΙΌΖγyΈVΩ+·π“―@/¦•}Θε�2α wœ*†Υ�vμ_5Ψϊ«�’—-ž6hpˆ±δΊ’–σ–nƒΐYF§OΥ N|”; 2k•w1± Θ/εκΜwiqχτηL}Θε—#»e3Ί/]TωwΓα―’�rΰ‚&˜Θ†h±‚ΦFΉξK!, ΅Έ:ψTΈψδq=Ι2dφ»¨ θ X₯υ? €XΟΚDRm,hϋΙ{έ…Ωl|ή?eZβηGςΡHγεR»mΆέƒΫK ›νM€\xŠ­—;Yέ;€^Μδ±Αύ�£βθ=τ$―>"FX3e ΩRδΆΨυ{₯[mΒΝ$ςǎ₯W%TDd]׊q`Έ ²«‘γBGCOqω=‰γ ςήΚ%Sζuύ–YE� ›φj€φš4†P²GΪ6VqΆΒδ2ΨΨ©±Τ/O†�8ιaΚ\–™γˆLŠ%ŽE…•ΌrhρV]?L­…4MΪψ­ζ}ͺΗΝΥ―oWZW„Ž�aH`Ώ”yJ\ ξΈ]Ίί‘·έkC7‘Œ Όlϋ^5Va) 7°°`ΓMξφŠg–ν[Sΰipnή“bZώΥfΚ%›κ )N‘δγ\Y˜φΆ§ςνώ―φPŸRΓcσΨ²E w—σbσj½mv�Ρ�DFΤ2›ƒο¬E$f'@Pώ­KΓς)Ύ޽ ˆ•#Ϊί}�;w8³ΌM�ΔάXxiΆ£ΟΰqςU[Ξ4ρ€©*p·½ΊŠV7ϊƒŒΈ˜P€ή‰C(Τϊ›ν gΉΟcX4Q槉Vφχ€>κΡΎ€ΐˆφΉ(₯Β&ΐχγ=²O†ρu4ΟΝ`g€±±Žb/Ψ”l“C΄θzΨι₯<θ’)GPΚz« ƒφΠ' |vJοÐγΎί΅PΫν6Μ¨£΄n'`ΝςΎΘΏΩIδύ9ΕOr‘Ά4„ξc³DΐŽ„m6ϋͺ1‰Οα/ύ6Zg ?αε.Η· K_x qΉ‡�W˜γΕΘίσ₯ΐχΪ₯dΔΝ†Μ"ιΡΧέUίό†,v)ΙβΝƒcnλ!’λFίj™1x¬λεaHGϊϋOρl6?Δ(6|Ψξ?+ja82Η§‘�}§ΩZ70Ψ§o'ŽψΛ㐿™οuΥˆ ά[Ε3’Θ¦�ΐίέͺξS’±#ŠCΰ™ k9qώM½FŏKiγA¬r˝Θ‚4‰r,�¦βC ρ<Ίnkτ>½t*ͺŠUQ`€KqΨζ u/ώ+ωŸKZώκn€’Š( (’€’Š(0ΚJ°Ί‘bˆ5Y.4˜s6V9© €€–θdτιπš³’‚–<ˆrœ/$ΜϊŸ*ωqομΎζώ*my\a ³θˆ„/oP™“YRW@^3u=>ڍ8ΜDέu/»βάo πφP-//9m˜Ψ₯›Α€uUρΧΛΈψΫZB~C9…ηΚ$žHαΖP²ΌŠ<θ­5�›Oμ§eΛQ,pγ&ΒΪEkΉθ[@ ܊Ϋ+±ΰIδ•;ˆΓykFŒ‹!IΫΈτSAΓE&o#”‘¬J’d !ie{άξ1-b4°ρ½zx™U„ΒΪͺΑ"A`‹�νΆΉi0Ζ?Ԉ1`[·(„ίhaΌ1΄[‰½―v"ΥΪ©%A=m­ƒ3όy³τ轴�U+ ΕΕ±’I²%V σ=τΏB€zjGΞ„9Žg”uH†λΪo…}ζ€Ή³/ζ2γ‚zGηk~σ }Τ dβπ˜;^hQζ?α+žδμξ ρ­ρΈΤ˜Œœ΄΅@£lh‡Γm†§Ζτ΄ΈQMΜΑ+ωxΚΣεΘNζv“ΛlΝs�¦ΥyA€KdΘξΒŸeΘξ?ˆvY`Φ§‘Š.ΰ₯΅Ρβ}Τ³Θ° ₯ψz:³έϊ ›ϊh+ω‚²BL˜Ÿj²ΕYΎΓXn#Χ―¬Υ~?’³1–Ο:yΑ'Ν½†ΑΫ7Τ�Ά-©«.7·ŸŒ¨UΙBn7ŸΥaΤΨ\λβu©άGάφB"ς;~ >!mΗ¨ ’“±&9T}Ϋ€`ΞΛw ЬΪ ₯γ~Ÿ‚LuyY―,r“’ͺ²›XψiWL³ˆ%–h€νΠ››³zƒϊTp�ςb9ΗΘ#‚‹H «>―/ €Ÿt€QΆ±c«άSp,­·ΓΣV˜1E‚UΉYšuŠCδt�ΛfψZώ꬛;%ς'(ϋΓΆ¦ΐ*ω� ­πƒqW\ΐάRΖθfσΛή7Τ!!|—τ{}” J%d1ΐ›Δ"^ΝΙξ™Pξ[~5ΧNΎ"₯β³ε&φŽηfάyˆ$―Γδξάπεrέ•Θ;Wσk)^Ω>UD`lΧρυP;ˆ‘&H₯Ιk*c†γŒόχ7”ž­φxT§ '-XgΙhΫ�m *Άύ©4vχXVΕπΈΠ#PL�λ±Ay₯#MΗΔϋN”,9y^l£ΨˆτǍ΅#ύδƒ_rύ¦32fΚψq™σP*+‘b¨�GeΪ£ήXΣ%6O›>Mΐ�ν’%b¦:3ϋτυSqΕH#‰B"θͺ’ΐVτΗq HΤ"Š’ΐ{…C•–ΈκS,Ο€P―Δηϋ€ψTrεI+΄6iΪI›XβφΫβoPχΪ₯ΗΕH.Ō“?Η+κΝύ€z…Ό\Γ&AΙ`ωr•’fU²€wm@έHP-V5K|όξ|s9Ηm,Ic΅―°-Ι4Τ™|ŒΡΈΖΕν?*Lƒ‘>;’2Xi@Τδν)±ΩYZεXxƒEQΚ_“—΄Žγyd†Ϊ>f Τz|=m[Gύ_#<αfd£γˆ·δ¦2μ ΈωQ™ξήa]©žE„8)Ž;/–έ˜£Όκέ/p΄q"FΑΘΆ|Ο U?°΅τ¬η†‹ ‰ ͺΐ.ΫkΈ‘㧆”ΚB£ό1(N£ ΠxRό«FL½Κ)3Θ\μ„io^ς΄™σOQ ·$ˆOUaP5ια\φ;ΗΕƒ.1˜�ΔKϋΜG·Ζ―9ΘYxΌΌVi F�)+ζ$7³ x“§ͺ¨px«ρ€…2‰7Iε…IϊmAΟe634hΘεΎ6ν2‹WUτ“β74}ΆuyP;=ˆ‹|uΤt�LA+»] ,ΫW‘°Ίλ~’Ζ ΔOάr’O0ν^ϋM ό^coΆζH°ς ΞDΜ‰Ρ€[�Η»a`?`ώŠΤαεQ‰%Θ"Ζ%”HGbXﱊ‘ΥΆ΅υρ¦Ο™ς,Š6J-,H[Έ‘tP|C €_Φ*ɍΛΑ… ρε‚ιε.X)O7λt £γ#δΈμy†1’H’ξFWΘJΟ¨έιeψ\_ΣW<\Ώ7'ΟG2I ‘j²ω ˆhώc}m}il}ΈΌ΄7M3`ΝΆxF݊�ہ1oθsX�qρ>gˆ³ΚΦ2γν=²Š|ΝhφάωΊ²‚ΗΩ¦œ"ΉΗ-άYέΓ‰Kλωdi±F”δ±G4oŠ9VSΠƒ‘K‹Ο˜qa“/ ‘Ő(†|oΟ„�ۏ*λό΅ilY,§`tήΉ cΦΫo{ξχP/Ε1‰dβζ;€Δ°ŒΆ¦HψmξψO¬T™\FSχdl½{ˆJ·έPr)–ά†!Α(“’Θ�4€ρƒΆHΤ]ˆ7π΅7˜’Ή†E0䨻Bφ½½*FŒ=b'Εζ±C<…ΘQπΗ?_fοϋΕQσj™ςAσў/ 2 rϋ6ƒrΡΚ‚Δώρ΅vTΆvF<ƒ”…ΰrΘMκ ψΈΧΛλ UxΨ•cΘβ₯X\F#WKΖ ki7Ί‘Y—%•-ΘΔ }TL‡|$φ ½cίPž$#'…Ι8,ήm±&4—ρhŽžυ"·NO'ςω˜*|Ώ7ߌ߽4Δ-λ ƒΈφΙhZ !v bdσ'Ɲ ‹xkVργcΔΕ’@PΚ‘δxόlIRlM°γeωHŠ*Jt’2¦ΛΈ\hΎŠΌΓ”M‹’ώe·_}τQEEPQEX¬Φ(3X¬Ρ@QEεΙہšκ·ςξc`7iU€:“κ˜LήH”Ά7,ς―ϋΓϊ€ϊΎΊίŽc8ΞΞa6_ωcόΈύXΤψϊ[©§θ4Š(αb‰B"‹*¨³³#ΒΗiά? q―Ε#Ÿ…ΦMK4ΡΑΝ+Ž0YΨτu€p£›.EδrΧh·ύ$kΧoΫaφ =4q˜2>a™ύΩHΥQ­΅Q=JΊVό–Zββ±σd!EψšFΡT M9T’ΆO%ΘJq­ΨΑ roϊ†CΉΧBΝΥs@η…<.ΔςNKeHlwΙπΆ–ψ|*$€ΟΙ‘v$`©}Œ>λ-ΧO"ŠxBFΖ fTΪΧ±έΣV=}?m)Β~n<Ή€XζM$£χνΗύΕΗ}ΞJΨ_BMό>κ―iΑ–|­φT%#]ΛΖ5όR5½Τζtν₯»� ψΘϊ/ΩΤϊͺ΅ΜH8‹ά’8άΰέ–Ϊ§ψ¦7Ώ¨ζI°²ΌΓε'$½έš DŒί²z ζa9ƒ³ŽςD«ϊΑΚίiΤt zιs>fY³–7BΈΨRΗ°XŸΝγvύξέλœΓŸ ΈydŠB�Α» BTƒΪg#KήϋZΧ €Y³ΠZI6Η+ΊH’Δήώm@τΧiτ€O‘Α`ΔQ$Xδ–@[ͺΌr]vŸ5―κ5ΗςŸ}P‰1q£Οe8r‰ϋ§F Ν΅Πͺ�£ΆmΆ­#ΫΪAŽ7 x -˜nίΤT͍ FΡ2έY;MrnS₯―֐ϊx²q�&䴘2>3Φџ!χ‘αͺρ<«α[n Ζ\cψgσcώ!ζϊb~9ρδ“;%rX—–.}>½ =χ£–ΐ—# Œ{ ΰq‘ΧόXΞυ[U>Ϊk-3pαΛAe™νκTžͺ}‡J ά.k;•ŠG#εδ2Γ Ϋ$L?+_‡¦­2q!Κ@²ƒuΥNΧCιVƒHς||<\¦ ―Ογ\:wβ#Ν>ŸΒ| 9‰—v0žT5Γ+ ͺ€Εx―& £~¦€N|nΒ}cίzΞ6d9@ΔΚbœΜǐYΐιΣ£/¬i[βfγfΕέΗpΐ2τdaΥ]NͺG Φ30 Μ@$ΊΘ†ρL‡l‘·βF�°>4ίRdcLq±αeΘ›C ΫyΨ§ΰcϋ:z©ξ†EΙ]η`fίd�Ϊυ·Ά’δr2+δ€gšL|€c˜•6V¨ώ�‡ΓΡL}9o‘;@ Ύΰ[UΠ]O°Π[QEQ@QEQ@QEQA«’ȌŽ.¬ °τƒ‘ͺ^"ΈΜι°ΩY~a‹γ3τm w=Ÿώ•yUϊd’šΎΙ{(Ε³]X1πΓΖτζeŒd]¨ešCΆWβvώΐ£Δ}ΓΒ¬δ’8£ie`‘ ,Μz(6$s ¬RΗ4bX›tmπ°θG€zͺ΄C•ΚΊΛ90ρW‹I?‘₯=UOΰώoEg“͐K€m›5p.1α4§ΓχG¦ƒYςΉί.Ίΰa89 α,λͺΕλ ‘o^•mPaβC…4ΡΖ,=$ψ±>$MM@―'–q0€•5”Ω!_Ε+ˆ?˜ΦΨiƒ‡2μfρg:³i7€ς?λy¨1ΊΓ€Ώ3/όWΊB=Γs}•k@Ÿ-3ΑΗNΡ›JΚ#ˆώά€FŸ{SBA πDͺ‹μQjW6σeα⏇yžOέ†ΫGσ²ΣsJΔσHl‘©v>₯4²Μ2yFMϋ B#jAΚΘήέ‰ώ΅DηΒ&ǝ’²lVΤ†UYQŸΔώ½+H»kΗ‘&™²τŽ?Λ—(5Ϋ�.3φ W—x%LL8#*ΆŒΘΊο―δ‘ ΤωEύΫ@Χ Š™δd2l“ I¦η₯μˆΚ|cO/Ϋ\Ώ ‰± ˜‹€ €›~1fuφhΒ»μLX± Δ, ’IΉ,ΜnΜo~¦ΉlIΔςlL�€k`ΕήέΖΏμ·ι ε2ρρ£.!±•ΒJZϊ*€£Χ^ΛD˜8Όj $ayΆ*ξ.‹e“ΓβZΉ.‹›;?\Z0λ3 X±υΪ½‘Ζ98rΖ£σv“�ΥoκΈ,‘Ν‹F)S‰?m˜֍ΖΒ5τ?E%™‹˜θ»L=¬¨}Ht`?ε[Ψi.1ΛΗd€¦Rέ‚z€f’/@ΧU«Έ™=ΆI7,lw%υύζ mdŠ€Βμ»”x•τύυ]ŒΏ/ΞeΔ£Λ‰2G£Έ‡΅'έΆΆΗW ]<¬1ά·^¦"/ϋκ+<μη`e^ΐ»c·¬L·_ο  °Έ½Όi=<ωx€Ώzϋ3]˜8jjGŽ9c,<�žΨoq`ΩKεήΜ\›ΩX˜$φIͺ}ŒΆχΠ;U9pΛΗf7+ηΗ—hΞΗΨ(°ύeύoHφSω­:bΙ&>²Ζ7ͺώ-ΎbΏΔ4­ΰš<ˆ#ž3xεPκ}L.(4ž |μ~ά I€2‰YXt> Τ8sOŸ%˜wJ ˜f�mρ?Ά?X{Εk|,Ÿ’c�O-ίŸΥ=ZwUυ{)ŒΌTΚ‹cŽ€4R―ΕŽŒ΄ ςCM7Οqςό§"’έΞ±ΚκLŸ¬=}EoΗς1#beGςά„@ &α—ύ€MϊΘ~ο— &I7cδ€ΉpΫΈŠΰό2'μ·άt­yαHΐ>k’—(ΨŊ;xωΞ³0ϋ—άkΫΛς_/ Ϋ&[�:Ÿ@ωνό7 Σ63ς2�žζ^–΄cΙϋSQΌ―ΘΚ·΄0Ζ‹·�ξKξSΖ‘Ζ± ² £Π°¨0Ω$ΘβWfΏ©,}ΛA?ζςyRήλΗϊŒώ²ΡΚ,qaq“ Y?α/žKϋBΫίYβΌΨ‚sΧ%šcμsuών©<Ύ_³Ÿ‘_™&4H7°-!άY‘@Ί srqŒΘ šd-'ΚdgYΫφR5ΧΤl5­x~*s*ς9ŽέΫ³φΘѝŌž'¦€xT^3ζζœΗΪΪi_MΕ#oα]i>CΒδG•σbΗΔ—A§( ¬αΈ>9…žYd^I'jτΐΦ¬ˆΈ±ιY’ƒšεψ΅ΕwΚΗR¨Lv?Y�ΓΔ7 ΥΆAΘDήwN·ήv•i*GŽΎšuΡ]J8Ίž’«&ΒʁAω,_ΊΚΫδ�Ζ½ΗΓ­θ4–'<# όpΚςΕ}uςδ/ήj~HŒž$δE�ΥL˜Οό2%’’ÔÝ:e:nΘΨχ ²H—‚―°[OJ›ˆPxο•}{ &;R1P?–ΤηψFuΧ΅Άu·μ�xœθŽN ‹�W|GφΧΞ‡ν΄γ—‰_b˜\χdΖEoΖ“ς‰|Pή&�Λ;Gά(%ŝrq’zJ­θΈ½©LI� ι8­‘§έ lΦaό-YβΟoζ0νo–™‚~䟚ΏλZ ζΰtμr)iπX³mΊ·t5ςλjs±>oΖdͺCΓ'ŠHΊ«§ΥXγςώo;.ɐ˜ηπHš0�Gͺ™V ‘”έX\H5Y›$|fbζ‹˜ςνρ.¬Ξ£Ι"―αoU…όΞΨaLΥqN;Ρ"ύΝΪ46ρί�…TM_;”Ÿ0ͺ1‡\°ΠK+&„©ΓPίˆίε³„Ε1cΩR:Η‘f~Κι1±βΖ…a‰B¨πΪψš°0"Α‡ΆžgmeυvόFš’ŠŠ( (’ŠŠ( (’ŠŠΕf€’Š( (’€­]Ρ‘ΕՁ = υ­¨ €›ιβ“bc*UR]HάuΞ»mΰAφΥf"ςΌNAŠ#šΙ.γ Θ:«jWΣ‘χW]QΛ S² p¬C Ω‡CAO‰Μαaqπœ…t[”’EEίρ³ΊΩ‰ΏJΨr‡+ˆaž9"‚)%p{ωO ^šΙαp§;”4/βΡ›\t±*Άo€ΡݘL&θ°΅΅>4YQG Œ�₯Υ•w ›}TΛΚγbρ끆NVZΕΫΫ˜#m±g„XϋιxώŽˆι·q,v]Ί 𺴃γα`εLŒ½7(φ*ΨPPΏ)ΙOaΒ―$jqμΞΐ ΊΘΓNŸͺ=υiΔπ]” •Τ6εŒ·Y/©n½jήlx?ΑSΨ*Z °ΠVh’€’Š( (’€¬Vh ͺδxƒ9gΖ*…‘Γ‘;1 sοj―73‰2Ε4eΣs<ΒF;ΑΪΎhΫPβޟΆΊšŽXb™JJΤθA ―β³±ήIβΏi€Λr„€3[Ršύ*x EΙd@~ ‘gΪ?.OΠ΅†β± «#5ΚH7¨ΏατEUdpYkšω”X"wVU?­χZτ壋’U±“Χΐ˜Hϋμτgε`€2cεdG™v»H ƒ‘ͺEΰ9, ο’Ϋ$cωo$�ςΖ—±Ed"Χ}4ςp Ήw¬)h«’Νέ½Γξ76ΐΠ(œΞd81αcΖ’fγΖi˜ΪΏ3h:Z΄Ζβ²sf"gyƒ-εšo+«_α|³JΊΔβ0±/±73 ?›ANPGcΔ"‰B πkβjZ( (’ŠŠ( (’ŠŠ( �Ωpydantic-httpx2-9b7ee8e/docs/img/rich-progress.gif000066400000000000000000002207641521723372100222660ustar00rootroot00000000000000GIF89aΨxτ***888IIIVVVhhhwwwŠŠŠ—‰–––¬¬¬···ΒΌΊΙΙΙΨΨΨηηηυυυ!ω!� NETSCAPE2.0!� ImageMagickgamma=0.454545,Ψxώ γDdižhͺ�lλΎp,Οtmίx�ο|ο�ΐ pH,ΉrΙl:ŸΠ¨tJ­Z―Xμ#ΛνzΏΰ°xL.›Οθ΄zΝn»ίπυc>‡ΐθŽωώ°Η�€:|[†‡ˆ‰6ƒ„u-u…,}Š–—Œ|Œ›z'~Yž4 —¦§iš™’)‘tƒ“„™¨΄p«ysΈt' ‘% %#N ¬2Ύ΅ΚΛWƒ«Ώ&™Ο£'―}ΜΪeΊyήΈήΥ Ρ ΒΑNy6ΙΫοπEΨ‘*συφγρϋTΓΓΊώΔμυ€Α‚`η,Θ£pAG@`°eβ1š¨G$TΗ―€I”ώμα³G …«kOΚ<ς/Χ7›Γ’άςœŸ‚v,ά΄0BΑΊ|8H&Ԏ.’[z–‹°sbΛ™X±φ‘Ζ«U'M]]Ϊƒ•΅,>αjϊ;F‘ΔQͺιHœ‹KΞ`4JΟ8I{E�e[Ήϋώrθ–€ΩΓρςιs;6¦Q�aKց§fΪΘTͺs7Ρ-:ΉŸΟƒΠ€ι₯€YιΆμH$-x0GΒ™ OήΝ ¦¬•œαƒ·ρ=7Χβd«9‚OέF?G—mW©ίΈ�zήβξνρο–°1ŠεΫ1γΰWΑ«ŽVωΈξκώ6u^ΤͺΡ`”τXJ)a‘QUDXwι­g /™ώ' 6.$xΰƒΦ(ΖG/?ι·1 8$ΤRυ΅%Z"pX‡ήDw1πA¨’•Ό°JqμΑΈ"x�€N ΆΠٌ<φθγLlb‡D:‡ΓŽ@&©δ’LV±I“PF)ε”TViε•Xf©εdvιε—`†)¦xc–)!dfz‰fše�Ιζ›pΖ)ηœsΊIgyw†igž{ζI¦Ÿωτ gj葈&ͺ蒌6κ裐F*ι€”Vjι₯˜fͺ馜vκι§ †*ꨀ–jꩨnJhͺ¬Άκ*§Δ*«¬―Φjλ­Έζͺλ�Όφκ+₯«ώ*μ°— ¨±Δ&«μ²Μ6λμ³Ι ν΄Ύώ"‹¨΅Τf«νΆάvλ­��*αšJ€¬€�§Δzξ§οzŠ­‘σ~kο½ψζ«/Ύα`~ ˆ:ΐΌDp« πiF*μi ,|μΎWlρΕί.FQ倨#ZπΑ©F0¨;ά©Ι'ZoΖ0Η,σΜ4ξ DPn£μ¬(ˆl0=+κsΡ”B,r₯εF ς�•² )�ΎόrΝXg­υΦΞ†ΫGA?:� „T¨δj@@0ΔMh496«²tp7 ‰Γθμ£MθτΝ19�:-²α‡°ΙX^ΒΣ‰Ž]6UώgC°nζ’[Νυ騧�Ί­α2L‚Ο‡ζΌΙΑ<€Τδΐ([πμθPθ0ΒDΓr@ΩΒ7jR<οpΕŸϋlQ@Αm?†σ‡}(υΖG€όξΠσNςσD/9£·ΟŒπ(]¨.˜Ύϊώόχο?Σ‰"ΐp>FΙyΓ‚A¨Ϋ5/ ˆΡVU° Krυ#YΑWAν}ŒΔͺ$Η0 βM¨ nΧ3x0eα{Z ΅Αδ=€†β›ΓOΆ(Ω‘+…*G‡¦Ώ�ρˆHάίΞnG‚Ρ)*g˜›H‘κ±²+d‡*XΔ %9ήPwZ4ώu;Μ±Μ‹†�ο,‡6Λ}p‹αΘ…ΖϋݐaZΕΘ9D•ΡPR@ύζ B1‰ˆL€"3Ά³œ1 Žd΄ yŠœρX΄™ψβ¨0ލŒ›£Λ$™Όˆy27¬ίRfššρic¬cξnψ<Šω#% <*0w’ƒΐΉΘbσ˜ΪκΧ-#`ΙFε¬y³ΓΆΰDŽIkŽ\ŒΨ “ΗΑΊρ±Q{\ �πHC)ζ¬—T69ΓC‘“›Ήl^ν)>t@’h±#%ο€Ω±u™ ¨@{u³pl Άμ‘Ι PΆj @ΤσV+W~˜ώά,ΚΕ>fq�²ΓτφφΆΨ²‰βή:ΗH•Šή(ι b€R¨€SyB u;€c5TTθ5±υ¨HeΥ5Q(›„*΄ Χ>υ9o�ΤaπH›ΗNη9‡qοΛͺ\Έͺ;τ!0”*« QΔ₯UCρ)8G‘žg”AΚΦ:gH€JΚό5©€ ¬`3ΥH >ʁ>+k’ Ψ‰Μ‰—bμ’$K*Κf²4Δ, ΈL$φ†DuΩ`GKΪ�Nφ΄bΫ[ €§&Υ‘‰€LέωWΣΪφΆIuljλU�Άˆ’oύ*ZάχΈΥmd5k[ΛΊsV³B�tώ§‹HεRχΊΨΝ.n­«έξzχ»ε.xΗKήςςOΌζM―zΧ 3τ²χ½ποΆά+ίϊΪχΎΎ’/~χΛίώšJΏώ °€ @ψΐŽl‚ΜΰCΝΑް€,α [8»Ύ°†7|Ϋ sψΓ ΞmˆGLβγzΈΔ(N±™«β»X‘'~±Œg,³ΣψΖ8Φ—sΜγ'ΣΗ@2#…Lδ"σΛΘHNrΆv¬δ&;YTL~²”§Œ©(SωΚXv”•³Με.γΣΛ`s•ΕLζ2OΝΜhNsΥΜf3oΉΝp–ρ›γLηΟΉΞxρσΜg οΉΟ€ŽπŸMθΊΠˆ&π‘ΟΝθώ.ΊΡΆ/‹#Mι ?Ί�˜Nο₯3ΝiπnΊΣ Ζp¨G αO“ϊΤΫE΅ͺ lκU»:°­~΅¬λYΫ™΅Ύ΅�aΌλ^kΪΧΐo�ƒMlΥ »ΨΘήΪ±“ΝlšMΊΩΠq΄§=ΪeSϋΪω²6Ά·ν-msϋΫK·Έινq›[Yε>·Ί•ξu»\±εMo�΅»ήψώoΎχ]c~ϋcχώ·ΐ ;π‚ΩΰοVΐΞpF-Όα_sΔ'Ύ¬gSόβ·r-Ζ7ž«<œγ!ω!� ImageMagickgamma=0.454545,²; …###$$$)))***+++,,,333===JJJNNNWWWYYYZZZ[[[\\\jjjnnnrrrvvvzzz|||€€€‡‡‡ŽŽŽ“““žžž¨¨¨ΆΆΆ···ΖΖΖΘΘΘΚΚΚΜΜΜΝΝΝΪΪΪήήήΰΰΰαααγγγδδδεεεηηηθθθιιικκκσσσψψψmΐ€pHfΕ$θζHAͺYӁ*Rͺ5€·άμ4μŽ‰ζ!θS¬ΔΌ`΄8ΰXWΩν& ©B€U 8%1_..7(O- "l&DB 13 T&#*9T1TIA!ω!� ImageMagickgamma=0.454545,² &/†###$$$)))***+++,,,---...333===JJJLLLNNNQQQTTTUUUWWWYYYZZZ[[[\\\jjjlllnnnrrrtttvvvzzz|||€€€‡‡‡ŒŒŒŽŽŽ“““žžžŸŸŸ¨¨¨―――ΆΆΆ···ΌΌΌΖΖΖΘΘΘΚΚΚΜΜΜΝΝΝΞΞΞΟΟΟΪΪΪάάάήήήΰΰΰαααγγγδδδεεεηηηθθθιιικκκλλλξξξσσσψψψϊ€K,/IŠ‹ˆŒŽ6IJ.А˜!›‹K>K—™Ÿ)“ŸŠ;K5‹šŽ‰›)7DžŸ%K³±**·›7<ŒΏ°ŸΑď2KΙ§΄)ŠΟΈŒI"ŽΚ¦Χ‹ΪŽθιι¨ΨγΠ«ς)οπΫσωυAψω«R¨`TBEŠDœgP‰ „v¬˜θmα*ƒ)–Δ@!ˆE€)|ψx>ΞKΡcΨ:ΜP)oCE ‚0„M€3\άX�αg> AN˜4šΟΣ§P£JJ΅ͺΥ«X³jέΚ΅«Χ―`ÊKΆ¬Ω³hΣv !ω!� ImageMagickgamma=0.454545,Ψx†***:::@@?GFFOOPOPPVVV_`___`_``gggpopwwwνNJθ\ZύWSκa^+΅C=΅QC·V€-ΖHν©>ώΆ?€€θ«NώΊ@ι¬S}Ί‡kΉέ_ΔσΛοgΘφsΜυxΠφˆˆ‡———Ώ‹«««ΈΈΈΧŒ‹ά‘Ψ·‰ΐΏΏ�½½ƒΑΊΚΌ�Θ½‘ΉΝ’ΎΣ¦»ΓΐΏΐ•ΓΩ¦Λά»ΞΧƒΛμ‹ΨόΜΜΜΣΜΛΓΣΖΠΠΟΟΟΠΨΨΨΰίίίίΰααασσσώ€).C„CA††BB‰Š„AŠ‹BA’“Ž…“…œC@œ‡„‹˜£’C‹‡•™¨’¨°–­ œ²ˆ•€£­‘ –›Ί�—Ž©Ώ@°Ζ§Ή¨Ν¦ΐͺΊ€ΝΥ�Ψ½Μ·ΉΓΚΈΆΟΌΰ£‡Š«”‘α•ͺ…‘§¬ς³±ΎΟ­“δΌΎͺφΡ†Σπ v/›6_άXχλ-hΉ€…fm AQα.υSθŠα±Yο2Ε»b-‹jLΔ£²†(χ”HΝb uθΐ½T)#NJ@?ΉƒEH(�BΙ„|Z”μ•±OKsκ΄Π(՝νšV‚κLκΜL2ΜhΚ“£O]%IS‹Ni§«ώΛ6嚢.cΞξ ­€iXChΡώδι1gQ€m=BBϋh/< υڊ«–Ώtƒ ƒ΅›΅hC»§t>†|³^DWύš|Ψiε©•/γ o±£Ύ¨ΩΞ6noκs«q―,:cUΔ€λΩθ[wiM§ΟUVΝ8°9v’―ΚΎKx·πΖΉ?ΟۻЎΕ<“Α�νγΔΐ{Š $__ά‘ΧR*^oN¨ΈύΒdYΓίk½y•ΜRυ–SŒαƒJΡ–˜ƒ€y՘] ’UTTΊ5HIƒvΰ†ΦM8œ‰'ώ΄ΰžW\[Ρ‡ίc,υΕ₯zm©3α‚žhΦiŠ0ώφΖ€–δf=~6’Z$ήgb•Dš₯’~f=‰d…XΖ’†l ž€S&(d(�™"]€Π'^’G )fZέ•)Ψ™T₯™f‰]b)Tp²H’‹u‚G€€‘­²§Œ!Rωί  κuίVJ©Wi}œ₯ž˜™Ξ'α!KΝ' §―ˆ‰Λ–PΘ§χ½Snϊ$‘¬Ωa¬•ΚJέ­±Z˜[”Y«―GζΨT §ΆΗ+**«l…Τς:aV­&ΫNk‚εΪι­’W_—Ί�ωb₯Σ¨XΤ†μbϊγ«ΨϊΧή΄νε%¬#ήGθ|E^ k_;b§IΝ[γΌΩβΛfk‘nι*Α<ςGξ·Άώœl«ηRkp¦χ«0·£xϋ0ΌβΞZ.˜Ϊ‚Ω°Κψn<$ΆW 2΄ϋ~‹lΙΧͺ―Ζλš,ΟωrΌ-³τΑΓ <π+lΊΨ¦,t€°ΐ«[φυΒLPΑ ΓΚo¨1‚J0Ό`ςΛ ²g3™ «™ŽlρƒCžόjΑ�κ+TΨwkκhΝwŸκ.Κ*^,χ†©eάΚn₯-ͺσΝι΅―ͺ mΰχR‚Cœ‡Α›β=y8/?ω³ί$^‹n¦λάc―n]œΥΰ/OΛψ©αZ¬8Ζ“σ +δCϊ*tε[^ή{ζ€GiΈˆ�κ>.οŒ;ώ»[‘ _:ͺΕϋΚΌιΝBΦϋφώ~'ώΌ�ίKΟς‡’=WΪγξv’ʏ{ψ–η�„<@ΑώόCΐΓ‚N3Ϊ8@@f`�#ΐ&Τƒ p큠@ΨΌΪ±Š^\ΰϊlΊ  ]њά˜ΑιUcS]λ>Ψ7α*G·! ?¨·Σ₯π\$ŒœόF?UΥ­o¬K!Φ<Ψ7Nθ:H’Bpƒ&:Ρ‰dΐη4(Bήπ` €a)ΗΆΎXΐ<Ό‘¦&'Ej―v¬«›·Ψ!εˆ\¬ c(Γκ^W‰XΕ6ϊ0„(Œ£²ζˆAŽπŽ’Σb/ΈC6Loς ‡ΘΆ"zpF΄€μώEAΥ Iό %dψΑΠ€Ψ)“α @‚π-hΘ* ‘„¬εΐ΄HΚ[VŠbμ#qΉΖ³«ζ0syIZϊr–«$α3υΨΜ:‚ιƒ7ΑD Νnj“›ΪΌΑ €‚ξ  °FbΚ˜΅acP‚j2sB(§=™Ήΐg2šύl'5οΌkςr«γ;›ωOdς�–kΤΰ1g¨LOβP‘ςdθ%'*M.’ ]( Ο’Fs‘LiT°Jœ20- VΉ΅WBπΡΜ©NwΚΣdφτ§@΅hPuΚьυ¨HMͺNm‚¦:υ©O΅Α}ώO ΄`H) @ di‚μ`B?ΒΎ:!Y*5š ¨gΜͺΤ€¬e…Y@N |ξ¬xΝ«^χΚΧΎϊυ―€ ,O% �PJ`•¦δL3pΚ¬�6}`ΚJΚΉ��²@ΐ¬`χͺٟvv³2όμQE›SΜ’φ¨LSU Φ:5όP€ Y%@P‚  &θͺj‹€dŒ5ξ^Π€€υT§0p΅Τu>iK€€²z=νeG(ήΎ–·§η%―zA;UΎv½μ―^π€”Φ—λ1`ΐΕ2–±«~'4N ΐœ@{εΛ`ώΣV6šB„Ν*ΰI–^°…-;W gvΐV―f'ΌΰφFψπ…?,β‡ΔVρŠ5ΫYΗvHaυA†s „ˆΰΗ@Vm,Υ )¨Ψ™Uμΰ]}2 ͺ[ @θj ΐΞ©R8ΓΆρ…@μ Ue€v€‚2ΣuΝVή*P%wyΖ.^―€kŒγΣ8Ζ v±ŽY,a??ΨyΦ0ƒW,cΚώωŌVqŽΑ\h:ьή3 =fHΓ—Π•.τ Cli?cZ†6λ} xBόU¬Λ šΗ>ˆ¬Α›αAΡ`«°ΝͺcJώ³ΓΈξτ’}έηa›ψΖ8žkg9YM_˜Ω²φ΅/ΜiXԝv¨³ V oΫΡ(f±ΆΣξ+;³6²Όlƒ“Ε%@j0€οfΉ™ςW}`‚όΰ0@jPVΐ ΈxΔ)ρ­&€ˆ6@t  žH€“%,[0ώ ίΖΦo²{­ςWΨά Η³ΈέξH˜Ηڞρ»›έξ™»Όά*ΖvfΣmnš³άζδ&χ†k~γ•+;η7ϊΈ₯=tŸ³ϋθ 7Τ{ŽjpcxԎF΄„}@XVGΰ°DΟ¬:ΠίΕ°{ή3dΉ†`Ιj;ι…žΰΧ‡ή^±‡ώ{Ηj?ΈΪx³�υλ;Ά¦ΏžΞlάΩÎ<τώε\μbgwΤ•ψ±sžςεφu±+νw°σ½¬(φφΰυfΏ£ΫΡ„5’s,pLY»¬χ8¦€PίϊKΖ<¦0¦΅Ψjώtk€hΐ[ώνš}π{›ΰ’tάcNμ §^ηƒfύΧ—^ϊΦo~φ|7zΙ6yΔ¦vΔ&¨G ˆz�Χk²€‡g°v“&x˜‡€`ΆVaw€δvz¦Χ€χ7ψwό·x±W΄g€^Η@8z*8'x‚Δώ¦f·RD‡y,π_²V@ΐ8x k\γψe—‡b#˜y8l`¦tx'€c€a&y΅wwΚ†yQ(xΆn©§c΄·^θyˆws,WœWlHH{Vθ…{v€8{ι&lΞl3§„hθyΗ…O(zQ8ί”{ΰˆ#0χΏ·gθΧoΧU:¦|[urπ;pZ•yˆψ„•–vΩ–m7tP)0%€b Άgμgr&0|kψƒρχ†§tsˆ„κ6vw†ΈX€i‡kςwuqψ‚‚ŒZ8‹Ε‡Ά¨‡½¨rvΘ‹¨‡^Œf({Ž‹Ηθ†ΙX‹ώ·v‹¦G…Kˆ‡ΎXxΔX΅GrΨΨ†”Ε‰hψx;J*wyΕΦ‰υRŒτΨ�Y‰qθ†LX™G‡νΘ†a¨Š‡rXUx„ l½Χ…τX‹»h—xˆg y‘™†G({)Χˆ„wΈ΅7{lψ©WŒ ©xΊ˜Œ,Y“(x„2 $ΠM;I¨M2@‘†ˆ:V@‰°~ΚgfS¦(€»εhΦ €(ωdχw‘Ω…Ι˜€˜Πo£h)Pζ·ΰ)ΠU¬ψ{Ei…ȍI“+ι‘YŒ “˜•y—1‰ŽΤ˜†{9—θˆώ’1Ι†΄(’. ‡žg‘G—"ω—΅θxtx-’“™’ν˜˜-Y˜Œ™†ω˜*ω‘ƒ7™$W™ƒ)—™9‘ ι…1ύγτH“>χS¬‰ˆ0Џ°$W(ω’,ι’G8—&ιc%€/Yœ_ˆ†^h“Š7›™™‰΄Ω«)˜[i‘΄Ήœ—7V‡‡y‰lŠ)Λ霻©�)‘ΟIž©cΙΩ’οωx3yp3@ψ‰Ÿ#Ÿό9A™z;pˆR©ˆ>ΠΥE‰@ŠΚηpdΖ5f–U₯H—ν9œτŸ:†  Πup :U©gΦ ΠOΦ~Ry”Α9šπ‰žΑώ©ž£)œΡiœ“‰‘yɜΙ’(hž­™‰…ω’\£Πιžs‰œΤy£Λ™£Ή£Οyž' €}©2ʝ̉„6Z₯Œ©ŒKZˆΐ<ΠQ35ΐiZ‹O–‰=ΰp`ΰΦ™³ Ÿˆ‡G₯tŠ‘}Jžw¨DJ›ΩiœΙ‰¨yœŒ:¨ˆ:—c•*¨E:©*Y©ΘI‰> ¨™Ί• i˜Ξι©—ͺc”©·VI«²« 0«@ξY§Ι8V”Ψ«G‰u ¬χdjœμ™ͺΩΌj₯Šb—j’ι‰ͺ *ͺž ­ ΉώΕj€vϊ£δ)ͺŸš¬ )­ˆH­j­AΊΩšͺ‘Κ­ΰj©έ�ͺ«δJ€Ζz�§―ρΉͺ¬κ­sΪͺ𚫠ͺͺy©[°{°›° »°uΊ°ΐΚ°{°Κϊ°[±{±Λ°›±λΪΪ± ¬ΪŠ[G²&K²‹h²,k°ΓΪ²»V0Ϋ± :³+³6‹±5›³‹³<[±;ϋ³B;΄DK³[΄{΄H»΄IΛ΄ λ³N»–N ΄S{°J;΅ΚZ΅V«΅›΅\K°Wλ΄^ϋ΅d{±c[Άh›Άe{Άj‹±o…±ΫΆhΛΆr‹΅uKΆt{·x»°oKΆqK°}Λώ²y{©+΄ƒ‹°…Ϋ²‡»‰›Ά«·HϋΈD+ΉdKΉBkΉ\‹Ή<«ΉUΛΉ6λΉ ϋ”’;Ί€[Ί¦{Ί€k¨»Ί¬ΫΊ�ϋΊ°»²;»΄[»²«ΊΆ›»Ί»»ΌΫ»Ύ›»Έϋ»Β;Ό₯ΌΔ{ΌΒkΌΘ»Ό»«Ό«½�;½Τ[½Φ{½Ψ›½Ϊ»½άΫ½ήϋ½ΰΎβ;Ύδ[Ύζ{Ύθ›Ύκ»ΎμΫΎξϋΎπΏς;Ώτ{ΎΠ[Ώψ›Ώϊ‹ΎΤΧΏΣ·Ώΐ<ΐ\ΐ|ΐœΐΰ{Ώ άΐ<ΎάΧΏΦχΐ\Α|ΑœΑ\Α ΌΑœΐώ[}�ϋΑ$\Β&|Β(œΒώάΑ�+CΐΒς{€Ώ0ΓκΥ'Γλ[ΓλΑΨ7Β*ΔB<ΔD\ΔF ΓkFkιΎGF½@€ΏDP;LVLΕκK&°Ύ?μΓFόΕ`Ζb<ΖΜΒ%@@@NζΎgμΔP,Ε[ΜΎOŒΕι;Ε=Β@LΖzΌΗ|άΗ~\½,μ @0œ½PΘΦΫΖΣϋΔ ‡l½ˆόΘΰ«ΕNΌΐ0lǐ,Ύ˜Ό½’œ½xœΗΚ’<Κ€μΑ,μDp„Ό½.œ&`Ε(½&06 @Λ`(@΅UΠϋΔpΖj|ΏV<½0τ4jΜ½ ΖW½ώΕlΕAΜQ<ΛΠλ°ΜΌΛΤ»ΙΤlΜDpΝΣ‹eΗάΘΡ›¨lΕq|½.Ό―<ΜΐΝ�{Λ Αύ[ΚώόΟΠΜΒ `Ε«¬½ƒL’H<”½ˆ`НŽL„ΰ―Μ= `;@pΡA0Ε―ΌΪΛD°\φΠ;ΰΡ MliŒO<O|%°ΡΣϋΖΣϋ��3 °� 0ΡQ °�-MΗΦ›ΠC°Π\MΣ>Ÿ|έΥ^ύΥ`-Ύ0|iΌ΅,ΟV<�OΛ`ΜΠλΠνΘ―όΛΚlΕpΡTŒ@½ΦΝώΛx­½žpΏvl{ύΜf6ΘZlΥ}}Χs,½-½z½Τ|ύΔ;PΧXΨΡ{ΥQΦΗn έΘ!Œ}a]Ϊ¦}Ϊ_]ȈMg]½ƒΌΤ0)½VMΕs-½ŠμΨWmΗ=�Ρ›AΠΩ�«ΩΥλΠ0άTάΫ� άM·ŒC°@ ά™ Υ@½ΚύΫΑ­Κq Μ`Υ°MάΤλΠα=ΫίmΗψ,Β!ŒΪμέήξΝΗͺMMΟΦλΠ(}ΡlMΣ¬­Ω―μΖαά¬-½ηqΡμ δ\½zΝOΌΕ]Λ�Χͺα³ΝΘΘ­ΫPέΰά*]ΤόΖ nΩΩ;Θχ½ΰΎίqώμΏ?œ½ ΠΪοέβ.ώβΜΒΠ;ΘƒLί�Mέά9„νΜgΫu]ΰv¬ΧμΌΜ±μέ՝½ΰ½»ΌΕ‘]Χ±ŒΨ πΔvŒδnέPύδψ­ΥΞύΫvΌδΠδ‹άΑ"½ ߐ}Ξ�՟œ½gΞβ0ηr>ητΫΑFώΚiμΫhmπΚ•ΤJL½σ= `ΡV^埐 ηΧ‡Υ€ŒΡ Όş°`ΜnΰnΜMα™Οk]}�›θ—ξΧƒ  π�UŽΡ ιδό~έα|~Ζ.½¨lήlξΓŒ½ηGΛtώλΐμιΛΒ`δΜ-pΧ!NΡ(ΐΝΣ[ΟώoμιWNΝ!mΕέΝΠ�βV ΕPναΨ-�žν™mΝ- ξqέά+=CΐΦ*}Ξ΅=½ΞΜΥnΠΛN½ΝΩκέΟΌ�ΰλΒ>π_πΧ߈<½ƒΜˆѐ, οΔpΎΐ?μ,nρπz ίπYΝούΚΤ« πΏς,�λ‘Μ½ƒ¬ΕMND€μσΥ[[»lσΉ~}’޽pά(―ς-_τFίήσDΰμ�λΜ]nπƒΌγMιΤΫΕώ~½@Η)ŸτGίυ^OΚOΎΐυ+―ρήζΨ[°­ΥD�υn�φφpΐΑL½ ΠφsŸώχzOΔrΏχ¬φΥ»xοχ„_ψάχ†ŸΏY?½Α\/Mφ‰ω’?Π“oΐpςzΟRY%Pΰ•�ω ―Ώˆϊξ{ωΛξNϊͺΏϊσ;ϊ¬ŸΎ%@. ½;ΐσ―ϋΈ/ΦΉOΏ ΠkQŒd»?όΔ―½�_όΰ‹ΣΤ<Ρ;ψΘ�ό·όΠΎR‹ζΣύяύο[S-ύΪ�ύpωΰ?ώδ?ύή_ώθŸώ€ώκίώξ_ψμ�ώς?�_�τ�ψ_πφŸ�όί�qΎ�€ 8HXhxˆ˜¨ΈΘΨθψ)9IYiy‰™©ΉΙΩιω *:JZPŠšͺΊΚΪκϊ +;ώK[kϋxz«»ΛΫλϋ ,N^~)`ž�ΎΞήξ.μύ.?O_oΏΟίο�ΟLΐ <J Β… :\¨π‘Δ‰+¦‹h1£Ζ“aμ2€Θ‘«>’<‰2₯J\+[Ί| SΙ˜4kΪ48σ¦Ξ<ί‘λ 4¨Pv9‡=ŠYΡ€L›:΅τ©Τ©TAE­Š5«V–[»zύ ι*Ψ±d™Š-‹6-Ο³jΫΊuΙφ­άΉ!γ�½‹w’έΌ|ϋόι7°`‹{>L±βΕ 3~ ΉšγΘ”+{΄Œ9σ·Ιš;~{–Εω³θΡ¨B“>š“ιΤ¬[KZν:Άμ|³kΫώψΆξέ“`σώύΩ7πα˜…?Ω8ςεˆ•3Ψ9τιx₯SΏώΦ:φνh΅s�ώΥ;ψρYΕ“?/57ϊυΝΩ»o�>~tωτωš―?ζύόόWͺοΰWH XμW`‚!ω!� ImageMagickgamma=0.454545,Φ&ƒ***888IIIVVVjjjwww‡‡‡–––§§§···ΘΘΘΨΨΨθθθσσσώΘI«½8λΝ»�`(Ždižhͺ�lλΎp,Οtmίx�ο|ο�ΐ pH,– £rΙl:ŸΠ¨tJΕ “Α#€+n„+P(Ύ+ouΝn»ίπΈI10‹ΔkP¨7,‡„+ƒrŒŽ‘/t  /–~€‚zcŠ‘’§¨©ͺ«kX [ \£Ά½Ώ ‹ΑΕΓ~·\¦Η¬�ΣΤΥΦ€ ΄έ ‡  Λ ρ\£–xΔο—}Όυ 0 _7 !@ όόUH&‘ΰ‘ϊ$ΘoBΐCώ-„+0.“9†ˆΉΖ²₯Λ—U(πvhY- x—Đ)  2ΙLΖaiΐ―ΐ1G)έ`ΰ$Ξ$ά1@ΰιΆr˜ όπ'g�―vQ`jΐ郕U―V%k" 8uς`θnƒM0 LX‡+ ¬Όω@%/“ήq™υjάΌŠ‡<&dˆΤŸΰ=Φ†‘Aƒ[‹Όaω @“g³leήLbηŠ@_ΒL*κg"C…,εΒΘ“+_.B¦„ΧŽ3Μ�–[B_疍σdjΡΠΕ@w^α62Bί'„ͺNΏ ξR€˜^kPC«?™²Βτ Υρώ΅ˆί0gΰ–MZxC^haVŽV*e5A.Δ|‚ŒυmŸ†όέu7ϊόΑα[κε  ¬¨›6Ι¨%A‡αU₯ZB"f"—ί„Ϋ< Εƒs ‘ΰ‘H&I…L“½e!³θcIFή`²ς6Aj>φβ–=–§!„¨†Ω?³ !2ΖH‘™ϋόη;œωdEDYΙT^"d ©δ „ϊΓaϋ(`‰• Y€%€M€Ι?uΐVΖh`"ԍ;’΅¦.9€O(L™ρ΍‡|±W›Οdr©¦¦Š¦Ev8°HY’"²–hΟ9σ¨UάA) p#¨‘Θ&«l Ωώ`‘€@ άΘH Ψ@UM@ΰ!όρΚ0άΡX~0~Z‡­+nGφi„’·™nyΡα5ΑPV ΰΐ„κ\r€|�KT΅ •­ Pΐ:Λ6μπΓ,Θ`�©‰Axΐ`m;BΗ€ƒΘΊxΜ‹ΙΌ\IΩΖνšp@™ C,σΜ4ϋ�AƒΔCΰΑ γμ;Ÿ€) £\σΡHΣμσ�]ΚΌ4ΐM—π²G1'mυΥV“ŒυΙ*LM΅Ρ[‡-φ4e”mφΨ@$\AΡh·νΆ*f˜]φΫ< mΫtη­χrŸ½χ ^Ϙ°±nΈ}Ο}ψ j F $Œΐ+‹Wn9˜‰ΐσε* =T9ϊr.ϊθ7dΎ9ι€ΖΫ6�’ξϊλ'$ώ*μ.Ÿ†₯ŽΓ��ϋξΘ~:οˆυœ όρ�—­ΉίΘ“ΗΏ7/=ηΎO?B@°lύφ•›Ξύχΰ[_}ψδ—O»ΩΛΟnώϊμw/{ϋπΗΏwίΛΛo�ύb�ώόΟ\FϊŠλŸˆ,ύπ€DΘΐΒ$!ω2!� ImageMagickgamma=0.454545, Α†<<ώΆ?€€θ«NώΊ@ι¬S}Ί‡ˆˆˆ™™™Ώ‹§§§―°―――°···ΧŒ‹ά‘Ψ·‰ΐΏΏΡ½½ƒΑΊΚΌΐΐΏ�Θ½ΐΏΐΔΦ΄ΕΜ΄ΛΥ½ΠٝΟζŸΠζ‘Οε€Ρε²ΨκΝΝΝ�ΝΛΗ�ΙΡΠΟΠΟΠΔΣΪΦΦΦώ€(@‡ˆ‰‰))Š’ˆ-,“›œžŸ ‘’£€₯¦§¨9ͺ8=¨�―°±²³¨ΆΆ;;½ΎŸΓΔ<΄ΙΚΛΜΝ±ͺΠ?�9Σ@?’ :Ξ’::!#&’ #Ι%²#δ§ §··ΏσΕΕΫϊϋόύ―98βΘa# ΑUΧ—H‡D%@μsPΑ89„q„DZ BΘjπ±TηJΉ»ehR σ~EšΔβή=MώrκάΩOUŸ@mΨ¨!΄`E R"2AΐΗ‘9υ‘-Y‡t ΐ:ΙΔ†$GιpΪIAINd%uC–”6ώͺντ@€€·(lςΰKƒ_˜½‚M²7¬Babωx*^ΜψίP #γPD€"F^ Y σ· Πa".DžrΐˆŒ ؝a€mv ( ϊιΫ ΄X€ΐφΩC :7@ Ρ‡œcξΗ:Fl†Ξΐ邏  χR’οZy;  τ4 „«Ί‡p+Β¦ }ύεK›ΨtO£΄²˜‚Š1Θ“ƒ9Ω„D͐ˆ(€έyE‚>„€Ϊ1C `=0°ΐ$i₯5I²αbˆ"b&P‚S ΔεCrݐ Šμˆώ‚PΥSŒ ΓsΑ'%|&€#`LωPžΩ@Ξw@„pΐ<ΐΗQdB%R`–$4T€&θ°ΐ>δvˆμδ·_�uΣ_€u@ΰ$Εv *­ΘJB°TZ ¦―hJ §�x: ¨h�Κ 6άπ“ͺ7΄ϊSQ"�ͺ­0€¦ŽπΰT€¨ΐEυΰT !$kB²Μ6›́°€™>π@€6 8Pm�@rUΒ΅#8 bαΐ‹>0%W h b΅‹Θ P@4@@›QuΩJΤ‘‰ΐ‡ψ@―S<š@―ˆ$&y&’Z+=ώšn7½ΥuW^{θ—/‚U—ab`Α(N!sΚΏ"‘')SκrΛ/wσΚ3“Us©*›Β²Ξ›@ˆκͺC΅zCQBYˆ0†#»«Ί­ˆb— r)nΈΪΆ<‚Π€tέ΅^W:d 0ΰΐd‘Δpž0p „Y 2Ή"_μYω¨³ LE½3oΧΦ#˜Ε@ΰR»Μœ l`]Α@`.WΗπ9ipN= ejځΈ’-'ΘZ°/} Ψ’)k»©”<Μ.“NVZ ‚£¦SM₯ρΖWέ»±»^ςΥ�|Λ�/²ς€3O}πΠϋ }Υώ–"½ΞΎ7oκλΓ_?}ψγ·―sρ,‹j@5mΏ«3;•ιγΰƒ άΒΡ―YDnΙ+XφŒχ―V0 ΰ«”ˆ^γ2ΘΝ,ΖκQv){QάJ@ΊκŽ*πςΑV*•Β: Ιa°(/‚Π:=±°†…D%ΰŸπzδ° ~hoWQέJ$Pί ohT_8ΠDου<°@Ι,ΰ+—ύ@xδ#ˆ|U<1 οB`Dί{πΕ3φΌd|ž‘'Gε™Ρ‹i|£γ8G7ͺρwbΔ£F>φQF¬#ˆτΖμύ 2ΈA@ξg?Τ@ΟλΓΨώζ .™BΤ° jHD„ΐ6–4žq*Œt™SΎEΒes€`UΈ‡υ©�CH‰¬α  °ΉN6Μλ1)_Δk‘(X :Ψΐ:I«¬§9Μ$χ§”~ ApV€œσ:θA…ΈΔ”Œ:xAηΑΟwŒlοaόsχ<€½§ΘΑqŽΩӟ" Π†ΚrEθDϋXQ1:£fŒh-ΊΘΫyτ’…„¨πΖ’ΏμER 8$L')FnDž$3  ΐzΰ"ς¨™$]¨iY-1>Gšήcζζώ� tkΠY€―Ξε½›�”άaŽ&…:±£φ²έI6 ΈΘy¬?tNV·©0脇mDb˜ ŸQΕX€!΄ςTι#2πˆψͺ•έΠδJyπK`βΧ£ψLm7ΜYΫυtΐΰνAάΨζή»1¦°«υpsεαύJψΒψ­1HWen o!"y$GEYVa^khpmws!{JJJSSShhhyyyˆ$™(’+ͺ-!²/"Ή1$ƒ"&†'+—,- //¦11«33³5Š$†’&Ž™(•‘*œ«,¦³.�Ά/±Ό1·Γ3½Λ5Ζ‚‚‚ššš¨¨¨ΈΈΈΚΚΚάάάεεεφφφώ€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“‰@(…&F”œžŸ ‘’£€₯¦§¨©ͺ«¬­�―°­(@†'š±ΈΉΊ»Ό½ΎΏΐΑΒΓΔ€@΄ƒ³@D·ΕΞΟΠΡ�ΣΤΒ‹ ΥΪͺ–(%ADΗέΫζηθλŠξŒπ…ςτ­Εω£7??; 1Έ‘Γƒ ?¦[ΘΙŠ#B@0Β°’Ε‹§`Π¨# 2jΤ ‘‘ξtθHH₯H–ƒ:ˆ”α‘‘FŽ5mˆA(CŒu0bΔ€ΡΑž‘ +\(ΐ(…ЧO (ͺ ‚�|PUTΨgˆ �Ÿϊ}h γΗ΅7B˜°ƒΖ·ώ‹PΡd„"&ΰκέΛΧΜ b \Τ!‚0jδ$€AfˆT@H&‚έ%Ύœ™p ΐmr6œn:‘€. ,R±’‚ν ²ΑŽ0ˆ…‹|-TL¨όPD ψ1B!–_πΓƒ}³)b·›‰!ΩΓ‹_( ΖA25Ϊιβq‚«¬Ž«¬˜ΆS+¨š~š’¨œ–ϊ+£©�z룉&Ϋj₯Μ.κμ�)…Ϋ©ͺΏφj*°°jk-€ήbj©²΄’‹­΄„R«ξ΅¨Ά£*£­Β{+€±βzΝΈΏ–‹λΉ»ξ{ͺ¬Β’Κν«τώΞKi·Βΰ:2ΐƒ Ždπ™!2(HD ²1Γ0Γ‚ƒ΅όr"'qμρ̈Υ§iΙ3 `@�#ΈΐΤlJ Φ!)$Ε[p²paΡ’&!gN`@GGς'v2πυ#ΨpC € "˜`B nΗ wάrΣmχάvην6ήzχνχί€λΝwΰ„Σ=xα‡aDo~Έί.ωδuS.yδ€?Ž9ζysnωη}{ϊޟkωε•η5Θ ͺ&λΜǟΖAžœ2°Χ {ξ(qΠ N κώ{Ξt̞ȦmTƒ F 4ΒuΎU₯H ¬ΒσE§” ώ*,MA `™%v6π<7€ϊp6°†”`�ύχ7ή8ώpχΟ�ώψΣίύ π6p°ίήψ§@’ށύ3`�Aϊ‚Œ ˜Ώ–  7θΑNpƒT`K˜Ώbπ…"d WθΒ�P‚,΄αwˆΐp€*„ΰ[8DЇ2τa3¨ΔΉQ°ˆKάαWh?)fh@b„μ Qž’eHZbFց—1e%Ι"ΝƘF h ςΨ|Lƒd€ΜcΔσ’‰3%G7𐠢χ‘9`,XW `΄B z’Δˆz Aθ ’‚@ Ϊώΰƒδθ“  ₯(U1ŸTI(‹0ŸC€q₯<%ODfJAΘ JˆΩ-JΡheν™#Έ$ˆ!Ή'h#qœe2 7J‰ΐσςq50ˆΨ7ΚvΊσπLΚhΰ‘ύ," 3ĐΒX€Ϋ³žχω§€ΔΫ)ɞ’9Οǜδ3(eΗD„ X@‰ U hZ"@>΄€CА›Q΄?F" JΕΩI ! ‰§LgJΣ%&HΜbtJˆΐ@½Œ-Mv2ˆ, ¨‰FpΚS,5§J„F#υ@u1†€ΑμΊ%(₯Yψ€)Νσ@±!„€ψΖ¬ rζ4Σ€‚­%e+ΰP!T lB“ΐό‘"D :πAjΚΨΖ:φ"ˆHvFˆP†P“¬zjvΙfΆJ‘Uή1#;و²¬—%”g)›PBSy§α§qΎχ½‹ Β7omYp€E`’ζχT-M)hΑχœωΝpετ{¬t§K]j «„Βξ! ]F ΅'Σ�΄‹Ως"p@^P ½pΒΗq«KίϊΪχΎψΝ―~χΛίώϊχΏ°€Lί@!ω!� ImageMagickgamma=0.454545,, †' 5 = ' ) 25<& %43><&&&:::E PWhr}!@>HVen o!"y#FDXVa^khxt{ xJJJRRRnnnzzzˆ$—(‘*¨,!²/"Ή1$‚"~°VmΡXv&‡(+—-- //¦11«33³5‰#…’&Žš(–‘)œ­,¨³.�Ά/±Ό1ΆΓ2½ύjΜ5Ζƒƒƒ™™™¨¨¨···ΙΙΙάάάδδδυυυώ€‚‡ˆ‚…‰ŒŽ‘’“”•–—˜‚)D(EHD£)™¦§¨©ͺ«¬­�―°―—³΄“Έ‰Ά•Ό±‘—Α‡:CΖ=‚;< ‚CΙΏΣΤΥ�D))KFJΦΰαβγδεζ58λ“ 4787 7Έ4τˆρ5όω»QcΑ€ϋ"q h Z3hИρA$ /2RT€EΖΓJ€p"ΘA=tŒ2 €ηbΚ|•B‰’K@rb¦ΟŸ@ƒ mυaƒ‚3pt΄Η  6X$G;βα0xθƒUπpy56�Ψwχ %ΥpΘZώ7hlθ`ƒa€ /*PρbΨ£, L̈Đ`C2bΔΏC#G&’Dη('ŽHήΜΉ³gs p4ˆ4£i»h|Π°υPUqΐ~ϋͺ#Ϊ<ΘV‹γƒ ΠoΨπ ΐήTF^:π’€ ΝA?€h@‚²RρηοζNθ!‰ ›ΰΣ«_ΟΎ‘ΧγˆͺΪnš+Z Z bM―)†¬Δΐ:¨5ΒώΗ[pΊwqΰ y ‚ ‘\ΠΒ!Όp $δπƒΒLC‘ƒ$ ΄θβ‹/Ά'#$G„²DO3ζ¨γŽζl`U$M5° l%RqˆδώgΑΥ0Γ 6—–“PBΒ$-UωHD8°UWpΓ ΐΪ|πΥΒ Τ=Χ— © ˆ<Α „¨C"ˆ€ΐ#αηŸ€š:š γͺ蒌’ΒZ’°FC xU€ Ζ1’δ!J)@§ΊyΪι#^κ–8š΄Έ΅N π1‚Ρ ,@ΦH.¬0FΉ"ŠΞ(’";°δH2$«μ²ΙΖpΒ³ΠF+ν΄ΤVkν΅Ψf«νΆΪšΐ-Ά&„ξ·δ–kξΉθžΰmΊμΆλξ»ι� ?<€‘β`.Ήφ£¦ϊ·ΥDΙdSνl₯RG‰*“O²Χ ώlW¬‡@w^-Ψʈ²pΐ nV7L‚π "D§0οΜ4Χ<σΈ6η¬σΞ<χμσΟ4›πH~P’’φ�o#›ξ§―]aυ΄ Q?ΒZ]TΘΘ TΥ₯Δ<ψ[—‘ΌP2…Xβa"Μ @A „3=ΐ|ΚΰMxηέχήxΈ€η=‹ήƒϋM8ŠλΝ·α}PΈαHωΰ…'ψε‹'ξψα‘g~Έθ˜3.Έαξ8η7ήzδ„{ώωι«C>ϊγ”[Ία€Ο²ωξ’σΞΈβy/ωγͺ/ξzκΆO~ϊλ₯{;κ§ονzοΕγŽwεΪGo;σώŠ―<ρΗ{ήϋμšσΌσ#ο}ςWM Φ‚,]Sη§Τ}»ε7�°Ϊ:θGp ₯‘Z«ˆΣ”KέͺB‚x*ΤΙp†P"ΉΑŒ9€@4EΒšπ„(œ„S4ΐB ,Ka’࣫‰i³ Tκ·$…IY€χ§4"ςPˆ?T Ύœ6±h i„ ZΰŒ€ν+ˆΞ!& ΌΈiΖ0ΖΌ'eτ #H‘ΧΘΖ6²ΗkλXG‘ϋπpEσT#hGQ…λΈ”I6DΈ…ρ!€qΐC€ΝUq±£#ΰ‚Œ˜-g2"²8˜‘’=%: αΖRšς”¨μŒ–βθb¬4Z,p”F¬’i³΄† ΰ±8'ΰε!!ω!� ImageMagickgamma=0.454545,, †* 4 ' ) 25;* )76>=&&&:::HXjsz B%@>HVen o!"y#FDYVa^hevr{ xJJJRRRnnnzzz‡$˜(’+«-!°."Ί1$ƒ"°VmΡXv&‡(+˜--‘//¦11«33³5†"‚’&Žš(–‘)œ­-¨³.�Ά/±Ό1ΆΓ3½ξd†ύjΜ5Ζƒƒƒ™™™¨¨¨···ΙΙΙάάάδδδυυυώ€‚ƒ„…†Š‹ŒŽ‘’“”•Š'C&DGC '–£€₯¦§¨©ͺ«¬­�“޲΄…±°Ά―Œ§ ; ‚ 8:‚ B »ΜΝΞ¨C''JEIΟΩΪΫάέήί„216η3δŠ5΄γ…56ι„σ5φψϊŒ2αdȊ!CFŒΊPΑ’ŊTP‘!B„؁C„vˆG²dͺI’ˆ §!ΐ`λ­·‘«�ΈήϊB ΐ+μ°Δkμ±ΘKB²Μ6λμ³Ζ’ ­΄ΠVk­³Λ^«νΆάvλm³Ω~+ξΈήr’HdPa—Α‰DΆΐfC)r¨lŽΕΫŽ2’xZ‹δk/Ώ“q £˜½C|Ε)»±ΐ *@b*:ώ`dq]‚θ€C!πΓ­-Ή$—lr²α"›ςΙ,·μς°+Ώ,σΜγΖν"ζhzN μ.b”Ι›Ω ˜%wE“Ε#I-Ÿ!1l ‘4› ήΙH€( 2A  8Θ\6ΐΦ? πΓ1;€rΔM@΄dwά·ήrΐ7}Ον7ίq0€ί½ΤψέrΣ7ΰrλ­7δ‘ΓM9yο wαƒο}ψα7Ί/}οMxάzg^9έ—;8εͺŸΎψε‚Η²ωά£;>{ΰΊ_.9ι}‡.wμ·›ξ9ζ»>zλoΉσ¬—^χλΓσ-»π7―<βΊc_ΈβώΎΣ |εŒcn}ρΝ πyςΈ#ΞΌνΞ—―wτOΟψθΉ7"‹‰° €wγ1ΤЁ“섦€δψ™Π θ?œmh3€w^ψh,HΑ VΎbb„ΰ’FΤ2•MO(L‘ WΘΒIπLΡΙ’hZ΄H^MΤaŽΐGVen o!"y#FEQNYWa^jgvs!{JJJRRRnnnzzz‡#—(‘*¨,!²/#Ή1$ƒ"°VmΡXv&‡(+—--‘//¦11«33³5Š$†’&š(•‘)œ¬,¦³.­Ά/±Ό1ΆΓ2½ξd†ύjΜ5Ζƒƒƒ™™™¨¨¨···ΙΙΙάάάδδδυυυώ€‚ƒ‡ƒˆ‹ŒŽ‘’“”•–—ƒ*F)GJF’*˜₯¦§¨©ͺ«¬­�――­³’΅ˆ²•Ή°ͺ>EΒ<< ‚EΌΞΟΠ�F**MHLΡΫάέήίΰᏠ5898 ‘5ι8΅λνˆζ6ξ‚φ8ψ’ϋύ8Τ8$p5h|Έε¨ 0XψšT‘EAΛz@p0B‘%ŠRBœΙ“�T0a‘ JP œI³¦Ν›¬δ Α`Α†Œ4˜Λ± ‘€ ΝAτΠ€ ΚΥzΊ!κ  ‹¨’‹χˆF ƒnδ˜…£Ζx!½ha`ΒΪIώ ^ΤγΗ’"QΘDœ€YςRI+^ΜΈq76*Υψ ‘)£ƒƒ&W.*θ(}9>{ύΩΡhφJ7ςϊA¦d[€‡υsoΤβnAŠŒΈ›¬ ΌŽ“‹Cρ@„%‚X*ŸN½ΊυΞH/)°Œ¨χYΫ9ؐ#Ξ7xώQεtμΣ�>7Λl8d{ΐιΒ‹AΐpA$ΌPΑo@€W >τ‚ <τ CAθIf˜!r¨a‡j¨αuŽ%J2‘¨βŠ,†σΡ–$:‰wˆ ²ή Œ€ 4ΠpΓl\)d@>&ώt€#}…_ >ζ'yͺ5RΑ YΓ XA€B?ό@ΒEˆΐ%ΔΐC#tδΘDΤiηxζ©η†΄ˆΣ LќŸ„j(*•Υ`TI²#"΄-ςθl9)@tP)mš>�iΨΧ•@zGYL‘WΫ!ΌΐΒΊ ‰ ,ΰ\ PΨ'>$Ba<ˆΤH3k¬±C$›μ±Κ.{l±2  ν΄ΤVkν΅Ψf«νΆάvλν·Χž �Έΰ–kξΉθ¦«ξΊμΆλξ»πΒλ #ή]%f‘LŠ]R’rΧ£NIΩC)ΐ¨ρηΘΏΩ Μ€=YΩ,7ΠΰΣ ‘ώuΙΒZ°ΐ₯#ΐ@~ ΐ2; rά =μ'B¨Ι ρΖ,σΜαv{Ν8η¬s΅7ομσΟπφΜν θD•ζΛέ½ς!2)y6€…Πx9ά uΣ‹l€ƒΥ‚LΝdG}υ0~²1€ΓŒ“Ό`Α#AδφoBτ0v ‚‘Œ.sΐK>€xΰ†ϋr8…ώwΰ…€ˆ�=ωΰSN€α•ΞyεŒpxδŸ7nyΰ’'ώ8γ›+>ϊ柷>ωκŽΗ>9λ’ nxμ‰η9μ’Ώ^;θ—k~{λ‡{>ϋβ½ ΏόﲜΈκΞϋΞzτΜ�m}ν«3NΉφώ‡yφ‘/nϊκ‘ŸΈ˜{zηΟο;ιθΟϊτ–ΧOΈυ¦“Ώ½δΆϋΰtw:Η9Gcš£–ζ’FƒΨNy0šν ƒ‚‘y„ΣqšΥtΐΨς#‚Qa:Δ_1άLΔi€„³¦– e jΖ‘vΘΓϊπ‡—θQRΘΓ―�]0‚>AΚ܁#F( ‰`€;Ό²xeŠD±βqΕCPQ‹ωΈΜ1Bžhΐ\yΔ$η–ZβbsAΔ!a!‚ΨάŠα!ˆ€ € ι'―0Εˆ°Α� ”ͺφDjŒLUZI΄Q2Uh„XQpˆK2%“b<ΔΨΔrŽ8-pΫΖα2βVˆϊΠ’ΈΜ₯.wy0+£#–ˆ SOdD0xΜhΐ+Dβψˆ@!ω!� ImageMagickgamma=0.454545, ‘†) 3 < #' ) 25<% $75><***777C PWjrz B%@>HVen o!"y$GEYWa^khqmws~ zJJJSSSgggwww†#˜(‘*«-!²/#Ί1$ƒ"�Xw&‡(+—,-‘//¦11¬33³5‹$†’&Žš(–’*¬,§².­Ά/±Ό1ΆΓ2½ξd†ύjΛ4Ε‹‹‹–––¨¨¨ΈΈΈΘΘΘΩΩΩιιισσσώ€M+…LI…(MFHL…FM‘…MG‘‹+M‘JK—™…›•¨ƒšŒŸ…‘œM*LHK*’€¬‘«‘� ’)³–«(L„¦Œ¨•‚Ι‡‰›ŽΜΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξέ‚*Ε₯JLLτ’”•—Ο›"ε ΐ©kΓRXΚ'K ,aM” ¦‘Ώ]…l8PE…œH8/[Ό’°ξ1|Η²₯Λ—0cʜI³¦Ν›…TΙΫ·sd“%MšT­Ψ?FΓvˆΆτh6E„$Ω”t!"A³.mΊ¨ŒWAŸJ£U0•ΤBH6 PIηPbώ…†г�έ»xσκέΛ—― #)&)AQ%G$¨PΘΥ £K˜¨@‘„ ΘΖ™-•\ydΙ”-ΠΨ„νTy˜—Πd"ΘΡ‘'O‰ο–½­L83Ωτ5€Ώ#nbΈ―ργΘ“+_Ξό%Φ&­ΩVꀕ#θ„R‡T]²QŒΨ<ώ<Ά,χ&ή¦=#τŸ‘ΜwοΩι§„%H ΡΟD΅ Υύφ^t¨¬ΐD€Ν%¨ΰ‚ 6θΰLρHΗL,ց„ΪXxކ�Υ‡ύxh‰ˆ–ΌRVΧPψΰŠ,Άθβ‹Ί… ”}£q2VBγl7φθγ@Ή>YzBΪώE$3Gφ”δ“PF)e8₯]uε–\vιε—`†)ζ˜d–iζ™h¦©ζšlΆιζ›pΖΉάZZC§œxζ©η;|Σ§6n(*ƒrSθ‚Τι€EΡΓ…8°C!ς@μ©ι¦œvΣA9ΰ°Α6 Τj ‡�Α  B  B¨6Δ 8δP+7Έκj+6ΤP ¨@C Θ~*3`ΠB¨4ϋ,7΄ -T@?h·…τ°C EΠ „ ¦«nΊδΐ³. 50Πΐ 6X#€»…lk T2λ Τ€ΓŸ Έ[κΑΪΜϊ�Ας›C‘ώܐCŸτrΠ½ΫLπB 1P‰Η ‹¬M/΄`ΐ0ΈPˆE8PΘE„@Ps @ΤΉξΟ@·ω…4Γ―Φppt!JS,«°…ΤB»²o…$ŒυΥYη€56\ u6³�PΘ φyͺ2œM ,Lr%pΛmr6ΐ-Δp' Eœ ³7“PA7νr`μ Ϊl Ϊ bτ―}*p$νƊvΒ*-ϊ©Ω„ΐθP_3+Γ€ lπAΫ@Rΐά‘θΞ{6ΐ‰1\͐`B;ΐC2„Ϋ ΐυΨ_ŸΑφΫgΟ}χώΨŸAφδWɟE Ιϋ0€ξ ΏϋοΫί~’ԏόw‚Δ°–ώUγ~ς;ίjξGΐŒΈο~ωλ_ϋΨr> Φ― L ύτ'Ώς"QνƒTϋ§Α>ApφKσ7ΐΖο|ϋΛΧ2šBp4 !ύτηB†p}Ϊz GS@֏ƒ%δ`PθΎJ!¬α CR‡κ ;˜B%Κ0†L! ΅ΨB#°}IόaqhΑ2PŠmΔaοdB>‘ς³šΆ6(«XΜiΨPڟ>eΆJΨ v•π\Υπ©>Ω€4 œ PH ‹ί!iώpIΧΩ £’ΧΕfΗ6₯IŽZΏ‹Δξ ΐ ˆ ΰG…€\BθΑjL a#Ω5@„bσ˜ΘL¦2—‰LD"Ќf P ΝjZσš�€f5΅yMnbσ›ΰΜζ7½iMrŽ3œθŒ¦9Υ™Ξmbsΰ„η4Ϋ)Οv²³›φΜ§>ριΞwξ3Ÿς¬g=ΕOhj³NŸ�UΔ z5`c‹D&™‘ΘH ‘»b‡QpXΈΛ€F±‚<�h“όιͺΚTb•Ϋ(ΆΛ”YŠEψA|@½HI/<Bς˜5ƒ’Υ¨CHjRͺΤ₯"΅©FMfς€ώ Πθͺ4š&V·ͺU�RΣ«]Εκ<·JV±~΅ͺY-kZΓzUΆΆυ¬k₯¦U½jΦyΞ5�h=+[΅κV΅~u―p5kY :X²φ―~­+ζΚWΓφ―r¬V›Φ»&Ά―cU¬c[ΨΙ¦U­™₯λf›Λ~φ­έ**”φvΩ`‘π  5^π‹’ŸSΥΡψ…+ŒzNr½ΕδnΫIkΠΰŸͺd»0Fƒp€^,LQ1]m€1pΑΰƌ]αΪF 3Ψ$Ι|œzΧ{“2rήΎf¬Φ‘’’ύ Ԑ₯έ`ΏφeF»ώ[XVΨ(—KΚώόŽ*¦.•n„O 0f™ΜP3ψΐΌηM€υΰLφšψΔ,ωm$r€ΘmP­hΉΕν"=·4�Ρ8VaγE"A…c―‘-sΗƒiWΟ=XΥm)+{‡ π.t £ α]σφ@„Λ0Š·ΜεωͺΏ·Ϊ�"Ρ€ψ­8€5ΰ\w-ΐV³R€β\NΚ™Ξ‘ΐsqpg>�ΈC¦6`·a£θ[°·@ΡΨ[!Z ·‘%Še³,£΅ƒj쀑ςHΠεR›ΪAF•{QρITΒT Α ύjU£Ξ~°/>ͺ#Βb�ζE�}m\ϊLΐh½v k d-˜τ³‘]‰±�Ω²,ʁ‘Κ§·Έ΄JΜfθυfq( έ …7ΊΧΌΘδ@�)@΄!ω!� ImageMagickgamma=0.454545,,˜ …) 4 > #' ) 25<) (0 .86=;IPYgs|!B%@>GVen o!"x#IGZXa^hfvsJJJSSS‰$˜(’+¨,!²/"Ή1$ƒ"�Xw&†'+—,- //¦11«33΄5†"‚’&Žš(–’*ͺ,₯³.�Ά/±Ό1ΆΓ2½ξd†ύjΝ5Ηώ@€pH,‡ƒΑqΙl:ŸΠ¨tJ­Z―Ψ¬vΛνzΏΰ°x,8ΝP΄Qe§UŽ€εΕ ‡6j6B?}o‡ˆ‰Š‹ŒŽ‘R/ E–P0332K2h™›DŸ0—C.23¬P.«­L/D0f.//.nK'D(++*PΜ*ŒΠρ�¨Ρ£H“*]zε…‡ ‰8…jP ƒ ŒψŒκΏΞΨ YͺΞ.νΨ‹3<Qπ‰£\€"9a"ζΙ#VDpRA…ΐδ8π6D1cA!ψ©ε˘3kήΜΕL‚¨�|�E•›«U=ƒ8γ�‚OΉ ^’;#ΩhΫ^B‹a‡Ίbάν γ‰&—XPA‡‰™L€ ³'‘κ9o°ψ±ƒΖΰΓ‡Ώ@žΌψςζΗ£?Ώ^ΌxLe‰(# I|IΜ—c¦ώ€ϊχεχί}σύgFsυ8_Yωΐ| *!„ώψί~ρω ώφ7a‚ αƒύ5ψ ‰#~X†}^¨_†Z˜  ž(βJ,¨‘ƒβΨ}, ‘†%ϊΨβŒhX† *Xδ’rτ ŠI$ƒF ‰£‡$Θδˆ:šεŠS’X₯–ϊ½ψ€G前f„œRh0άExΝ` .ΈCŸ:(ΜP ‚^τBΑ=j†pd ƒZN χW@χDK$mŠ]£β7 5μB 01€°Ζ*무Φjλ­³0a %ΐk―Ώ ¬°Όϊκ«°Η«μ²Ώ&‹μ²Ξm³ΓJΛμ΅ΚN[,΄άf[-΅Ψ†»­·δ«-°ώӞ+ξ³ε²k.·ι�ξΉτvϋnΌδλλ|Ρ―P΅EΔ1 Γ'Hx•ς ηŁ’·(šΧΒLΈΠ WΩΙΡ'΅ιe„¦FΔTAΡ¬€Bs₯‘2 ό Γ6π ‘΄`σΝ7χ ³Ξ8οΜsΞ>χ΄Ν΄6GΒΡH#n�G/΄ΣJ3έtΤRWέ«±V?5ΣPO}΅ΦRύuΥ` ΆΧY›m¬ΪjoέvΦ[s­uΫ]―6άq“=uήT£}7Ϋ|Σέ·ή{Ώ=vέvΛ 8α$𻚿7q•ΐ_ TŸ‰�%ŠΕe Z‡ŽRНœ_ΤA’]ω € .(  Ό@2ώ¨02VΣΙB¬ ΐΚ6Τ CπB;ΜΪgΜ7οόσ™ύ+ZδK|¦'[9^T1Ψφ kέ ρύm3„ΐψΌqBPMzT=1»ΘY Ε &ρ½?¦²� Ydpp<δηΰžΘΐ:Bz�;Β BGΤTo5ŸiMYΐ2= ²₯ ΌΔ+_ΰ*v™ €δ—œ!œMhσ !¨ΐ€@~τ!‡ ΰ‘ρc<…p —ΘΔ&>ov�€ZΕ€LQ*Β \.RDyβ—λ¬ΨŠ…(@ύΒ+ΘF�dQ2`㢏ΰΚ΅ou.`@,�„•tj@FπBFΰ%B8  “!#ΐA7°!Hr’•¬Α ό€ˆΐ‰  ₯(G©ŽGq¬6β;%*‡ΰ‰Τ¨ς-y‘ *m#S�°,¦”AόXωΈZ~B—N¨c=T'PΌ€4K83–y‚-s™όΒ26€`™ω£ΒfFΚnzσ›ΰD‡όΑ„+V!δ:0N~₯³(`δ„`:!ω!� ImageMagickgamma=0.454545,, †) 4 ? #( ) 25;% $0 /75>€€C²%ŠA6ω₯’€ˆi%™[ζ(εœU‚ˆ%‘\Ζ9&˜Kΰe’+By&ŸjZΙf–†Ιc°ΐ¦Rd ΑuŠΜ$ "Ci„X7ˆ5€Δt¦₯'Γͺ30r―Β #φΤ MTι‘€rΞ=ίVtUΐ�Eπ€eΠ#”ΐZ’PΒ >„"Š Δ·ΰ†+ξΈδ–kξΉθ~{ΐ 'œ`B»&ΌΫξΌσΚKoΌτζ«/Όξξ»―Όφϊ[oΐωμ�Ασ‹πΏό&<°ΐγλpΑύώN\ρΒϊJΜpΑϋϋnΗχ6<±Ζg rΙ'7œςΑ—|ρ»ϊ˜:Θ 0°i5γ°ΒM̘nΰͺνΰ³iέ }ΨΟE»·ͺ.¦TΧ€cT"Γ²Z *H€}  ,L`H A„0Hφ€ΓEϋΌΰφΫo� ·άpΟMwάvם7ήsλέ·ΫγΦοΰ„χϋρΰ†Œοα„#ήψβώ8γ…Gώ±β—S.ωδ˜;nyηž7zβ•ožω䔇^:κ §ž9ζ€;ή:δ’sξ:ν•Χnzμ‹Ο~{λ¦η^»ξšΫ‹Ί ‰Θ @{(,§…(·ΑK2y“!Κ[³’sη΄Ί=ώέ/’ύMαwΊ5«Ύ ΞΣ«°ς°Ϊl‚x -PΘAΈ0H7ΰΩ|ββϊΘΐ:PΚ›IΤ’½AΤ fhΞ “Γδš ΎfMΰ`&|°]@7ΐ  ˆ€’ΰ §8ΗΉŒNN…™’Ž jpœA0ΰ$\$šQΜ΅ͺ€ž5ΌgΤj8JvBŸΨΰg"`ΠΖAΔπ$Q©`k²ΒP=!Y‘@!°B¬ $++ !1LŠœ ©HGš @O @E&+aΙδAΟ€.I ΰΗ4“+ΕD !ω!� ImageMagickgamma=0.454545,,‘ …( 5 #( ) 25;' &65=;IXhs}!B%@>HVdn o!"x#FDYWa^jgvrJJJSSS‰$—'’+₯+ ±."Ή1$ƒ"�Xw&‡(+—-- //¦11«33΄5ˆ#„’&Žš(–’*¬-§±.¬Ά/±Ό1ΆΓ3½ξd†ύjΛ4Εώ@€pH,Ζ€rΙl:ŸΠ¨tJ­Z―Ψ¬vΛνzΏΰ°X)€–“ηhzœ ΊοamN§e3ްΑk°�€‚ƒ„…†‡ˆ‰E,D,‘’,PŽJ/gŒ—D+00-C/‘£M ’M”C–e+’kJ&(('F%O$Ί'Α1ΙΙ8842<6 ŠΧΨΩΪΫάέή_¦0 Dζζ--O ¨D0B. δ€0 ,šBͺψΩ2ςΙBΐ~K ©Wζ‹ ™^1@(Ž ! Kγ’'H !‘<@ ¬€7L~›I³¦Ν›8s*a±ΑΒώ8200<αΓݐYCxϊΌžPͺ„:υ”ΙT¨UΒΨ $¨†\`€1π#ŠDˆetB’D“6ήΈ ΐ#šxσκέΛ·―v ”¬Pηdμ…’F R†SŸ€’€d“,΅<™Ι§~ͺΘp6Γ )P˜ŒpΒZ&!0‰†ΐ 1xΰˆαΔΐίΐS>ό·oβŁ#§`όΐςΰΟ•#o=8p" 0@ΐφwά½Ώy³½<ψςΩ‡t��Ύ|™τMΓoκž}γμενΩΎ~||σϋuG_λι'„€ή ώWί}ή ^ ώΧέyΆΗށξώ)8ίzŒ ¨ŸψI …δ!ˆ!‰FxR‡ Κ"‹#–Έa|(ZΈF~,jh Ύχaƒθ±Ηb~Ψ•5„cIdbT^] Ω“-„E“BŒU +¬pš–΄Π₯ L€)ζ`ž±‰φΒ„σΤ�Ι&D(@€§GIΰY@%€Τ₯)̐ƒΤ–Δ;D*ι€”Vjι₯˜fͺ©¦ !‚!|ϊi¨’ŽZꩨžJͺ¨«ͺšκ«£Άκκ¬°Β*«¬¬ΦšjΈζJ«�¨ήϊj―΅ςjk°ΐϋk©ΔΪΪ,�Νκ*μ�Ι2ϋl°‘ʚ–DDω„˜œ•Ι@άfƒXώdip�ΉbiΒξμŽϋ�`ˆ)Ωa ‚™’F<€‚D˜@{6α/ &@€Ρ Bά`G 膃’?b§ΒΕc¬ΓΖgΜqΗμ±Θ!s<²Ι%ƒ¬B₯ςκςΛΖfϋr¬0Η\³Μ.ƒͺ3Μ βœmΟ3ϋ\3ΠΖΝσΝBοltΟDο|΄ΡGΟ uΞH/ύsΤM }5�IOmσΠO'ύυΦA{=6©\{m΅ΣTϋΜ6ΥfΣ\σΆ?ΡBfK¨k‡]ΐ<ςΑνXμΘS Ί…CuΪ„Η£ΈgŒΥ₯O ­€ΐρ;„Ώ!ΑYΤYώž  ΡAF”³–b4ΑQηC¨₯Λω|ΑΡC°6\FtJzΤ0;οCg@§ψχο��ώσŽ'Ε B1L)·Άχˆ©0°)YQ;^Π@drdAœά–Δ1a€CΑθš’!Œΐ-Bΐ Š0Ω9#…ςgHΓΪ0'ΰ[<€ p o1EπJ­t%ϊΝxEΐ'ŒGA%όp‡—ΰΔΰeNθή V  ΄!K@Α@Ζπ©`iy>'›: !Ό!w„ΐ€δΰ7Μ£χΘΗA O_!ZƒΐAˆY#$ˆ‡Ζό1|Œ!$( 9B2’ x%ιEΕδ ±βpΎσυ‚hB.FhΒσ‘O ¨XgIΛZΪςe·tΉ„n+xΉό%N>ΐ$A!ω!� ImageMagickgamma=0.454545,Ψx†* 3 > #( ) 25;' &0 .86><***888HPYfs|!B%@>HWen!p! o!"y$HFZWa^ifqmws~ zJJJTTTjjjwwwˆ$™(‘*«-!²/"Ή1$ƒ"�Xw&‡(+—,-‘//¦11«33³5‰#…’&Žš(–’*«,¦².­Ά/±Ό1ΆΓ2½ξd†ύjΜ5ƊŠŠ—‰–––­­­ΆΆΆΒΌΊΗΗΗΨΨΨηηηυυυώ€LNQ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£€₯¦§™M¨«¬­�―°±²³΄΅Ά·ΈΈOΉΌ½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΛPOΤOPΥNԐΣΥΧΡΰΏPΧγίαηθικΛΪήۍΤέςŒΣγΥολω­εQγύόώ91'«\ΐGψ8%Δ€ν�@}#²²vο£Šξ.b¬&±£¨rΦ Š$Hh Ι(L AdΚ “—KR*ZY¨Ι.O 75aYɀǟ@5uΫhMQ<ŠOr‡QiΠ§ά ΅7ϐΟCWŸΘ,ε„§ EW»~brSSΞN‘ͺ]Ϋ―Ϊώ-–XL„4ιΒBD²έΫHd<ͺ±:Ysα%ΪS“KxΉύΘ:δ©5ΚΞBd™ΔΤUσU(žYv&\ΆΠ`Δ9O3Ή&εΝΥZ]"&ds)αΦ ›ή|•Πc­…£@ξΧ›―ρgGY(g1Q^Žtλb=φMmBΦ c‘΅₯£b­Άš6bΉ$ƒQΚήmdZˆ–½ωT ‘l–ΚKήΤ3ΣsN1εNZ¦F$HΧ‘”•€·Š7$Žšeba~™}ϊK†ΦΩ£†X(’QvΖ^„–Jωί.ŽJ6œ΅7yͺ"—Οώλ·΅¬ΉΘ=ςά•Q~‚λΡ›obυLΓ)ˆ˜aώΙPΊ˜9:άYψ}Ežœq.%›ΪƒxτΙε²ήw§‹œ¨9,ώ'_ž°ͺ«1*¨Ζ«ŽtŒηΖ²²;’»Ϋ&š\διVeI#GβνnΙ~…(Œ‘ΉŒl²₯ζYΆΧ²em©έvΣi]­ΜΨ~π‚w[‘,u+i:2M;1«ιρΤφRόXR'+3₯ε₯\§­φΪ³ΣoogrΤ§¬tΆΩ$εΖφή|χ-+)�uˆ~nψαˆ'�ψβŒ7ξψγί>'ωδ”WN”ˆ–g~ΉζœgŽyηϊθ€—nϊ騧�ϊκ¬7Υ:θ’ΏN�μœΗN;š΄ΐξΌχξϋοΐ/όπΔoόρΘ'―όςΜ7οόσΠG/ύτΤWoύυΨg―ύφάwο}τώΊ/ώψδ—oώωθ§―ώϊμ·οώϋξ‡�ότΧo�ύψη―�ώόχ½ξ-`�Hΐπ€L H=ΈθN€½“0>H@|+Έ υ°‚jpzd GHΒšπ„Ρc{Χ"){Xο…ˆ/ H¨ž ή–CκEα…( ’‡HΔ"ξO…°αξΐα8{Lœa oΨCκ €†U”ΘΕ.zρ‹`€^ Θ»iH DޏΕή `Škτ]7Gδm‘wu4^0E:Κ/yw,ήΓHΘBςD’` xdJ²;%@A~,€Βώ ‚π¨ΰ“Ί£a ˜ˆήΰE2 ΐR.Αx+( OΉ”T>Α†–ΤέV°ΚVRά-Ω“Κέ1Η7‹\O€< ζ°±ι„,F™#ζ΅Š|γ"ΧιXu~Σ§Sλb£Κ;“–‘ »,LΞ»ΪφΆΈ5!LAͺPΕ,*3!Af6 Rμe£πAu’u΅Γϋf*iψBŒ6²;Μ7ϊ\Λςͺ,ΌgfπOƒΰ―2U(YY»»3N7§»#.Œ›ΫϊΪχΎδζ"yΖ3�—·Δh1wxΎ2ρέEjWωJώΡςn²½SmxrxZa‚ζΌ„P!!r˜ΰ*:Ψ›s]%l+ €”ΨPΒΎ@έ{Qυξξ›»θ+~gLγ·o·*~ wαXΏώp“t‚a) Ϋήύs«<ͺrU<L %_]²πVΙJ™τΠ+P”Λά“΄ΓίN’™ΜJ-;υ¨Ο|‡ϋΑŸdqζ-鏃μ»AΩΖxΞ³ž½§H*‘(Nˆσo­N�n’„°!˜ΟΛΤφΒF^Šlν›~ͺ“΄J~pρΒ; «Ÿ₯ιcŒ)ι`^£˜gO‘]ΌηV»ϊΥΝ `m1&�έdψ)oD€9Ύ;„ ŒςAΨέz`‚#B5ξHAτ¨ŽΒԎηHT*6ϊ¨bDυ9Fα(TξŽρˆlͺτο8Žι 9ύτYŽηHŽɎω ُτh`Žɐϊh Ι‘"ι+‘λθ’‘ ‘$‰ϋh8iAeŽΊcŽͺ„“™‘)“DΩ’Y’θGβ8*9“ςHq—†¨ƒ»γ; ƒht7π‚ΎƒrΨ;4(XIAh9@|8`h90'Œ@@T(@=@%P<`°›²9›΄Y›Άy›Έ™›Ίi›€lτ›ΐœ*œΐ9œΔyœΘ™œΕ©œΜٜΞωœΜiœΠ‰œ�IœΥ9Ψ™ΣyΪω›άٝΨωΰ9žΦ œΐC•Ό£:` €•yI<ΰ €Y7dqω;θΉ;lq©ˆπΨŸ(<ΘŸRW 08Ÿ6°‡VΉ{^χv»#˜½#‘Δ“w3Rθ;.€1ΰ0~Œ©wŠ~‹Χx@‰Α#‹Ω…?pBώ0@ Œ»γD0CšWw5°£<Κ£Eπ£?Ϊ£@€>:€Bj€E €Gͺ€IJ€;:€Eΐ£΄yqΫφIŸnΖ9œVϊIYΆ₯^ͺ₯Uj₯]z₯`ϊ₯fκ₯cŠ₯i*¦gZ¦hΚ₯a §VncΪ¦gΪ₯X*§aΪAnΪ§_Ч[Z§tΪ¦uЦ€Κ¦sκ§v¨dЍdše…Z¦i ©‰ §kͺ¨‹ ¦yꦃz§„z¨z§V:lωΉ; pu8Πx<z—Θf|ηy‡ό&(mˆ•4ˆ{Ά —΄ͺ«mƒ!`Σg °–8‘‘(Z<0ΰ}1‘Ό³‘y„ώŒι`2€‘¬hϊ}.Πw›‰<+ žΚ€\ΚΦ3Κ¦œΚͺΜ<¨ΌΚ�όʎΛ²<ΛΧΣΚ΄|Λ©lΛΈΌΛ ¬ΛΌόΛ—μΛΐ<̐,ΜΔ|Μ‡lΜΘΌΜ~άΕΜόΜ²¬ΜΠ<Νήo,ΝΤ|ΝhlΝΨΌΝ`¬ΝάόΝυλΝΰ<Ξ?+Ξδ|Ξ hΞθΌΞ<§ΞμόΞηΞπ<Ο'Οτ|ΟgΟψΌΟτ¦ΟόόΟΤζΟ=ΠηFΠ½Γ}Π Mc ½Π]_ ύΠ}W=ΡέR}ѝM½Ρ}HύΡ"q#]�ώ�&�B€l*έ��†�.Σ Σ2]ΣDΣ6ΣώƒΣ:έΣωΓΣ>ΤτΤB]ΤνCΤFΤθƒΤJέΤγΓΤNΥάΥR]Υ΅lΥXF,Υ\B‚ΦΥ`BI@Υa]ΦΕ!ω!� ImageMagickgamma=0.454545,,š †* 4 ( ) 25<* )76>=???HYht|!B%@>HWem o!"x#GEQOWUa^gdpmws{ xAAARRRˆ$—(’+©,!±."Ί1$ƒ"°Vm�Xw&‡(+˜-- //¦11«33³5‡"ƒ’&›(–‘)œ«,¦³.�Ά/°Ό1ΆΓ3½ξd†ύjΜ5Ζώ€‚‚†‡ˆ‰…‰Ž‘’“”•–—˜™š›œžŸ ‘’£€£§—ͺ¨“�ˆ¬•°₯˜—·‡! ΊΦˆ?¨l30‡š$Έ@]#°ΐ]"° Ρ#γ#H⑈9D6HrΐŒ4�XΑ7ֈcŽ6=βψ£Aς8γŽ ώiδH*™d5Ζ'ε”TVωT’2πΙR d P[ˆΘΐά!ών—\Θ 34Η¦›pB²&* ΥI\ ¦ΙΕζrΘ†_$ς•H"FR˜ €v‡x †°C Ψ ŒΠ=€# Δ©¨¦ͺκͺ¬Άκκ«°Ζ*λ¬­’jε­Έζκ™lΌΥ3 Ώ)ψ œuˆs‰€iˆ„Ν½sα44+ΐ…\X—Μ·›ΘaΧ85Θπ\"…&2έ’L§]'°)Qjˆ‹40^½‹ΧC7|ΧH/,°ΐ?\πΐLpΒ3Ό°Α Cό°Βώ'όCΔΏ`1Ζ° &„,ςΘ$—lςΙ(§¬ςΚ,·μςΛ0Η,σΜ4ΧlσΝ8Χ\$Θυšˆ±Βͺ@B΄e™ΘRjf•%q�Ή8LΫiΰ�qj»ζ›²)CΨ5ξ!ε2“L·Βb' PL1’ƒ/pK@K‘^φ�ؐσή|χνχί€.ψΰ„—Ό³#ώ™Κn$nȚα8ˆζΚ%H}²ΙpW}Ao.9"0h0WY°άq¦IΆ R@Ia� " ‚δΐΓΏ‚4Ά)ψ0€νήΨ Θ#?ΩρR%oόŸό)Hο|τ@<τΡ@ΐρώ @€χX�όρΪύψΙ_ϋ⻟ύ) /=ωΣCώφΨ§―?σν;_ϊΎW>λ%oyγ_ωζg@κpϋ ύΌ>ρ‘Ο|σ“ ςθΗΎόyΟ{ρ›χκ·ΐζ―D!�ξ@*πx·P ςξ§ΐσ50{4^GHΑνuπ~ˆk€3¨FΠ‘Cέ~‘,AψΗ@Ί±ΝΝQ›ΖƒŠŒ#ŽmVS Έ0g)d"Τ†‘K¬@m‚8A &„xΰπJ ‘)Aόξn-QρφΘΗ>ϊΡJLΉ€ »" ˜0 >�Τ\@XͺŠ™”H*@+‰L€„Η"qh’“†ΰΣ"iπI(jρ₯;β. ƒwʈŠbΑ‚GAΰ–ƒ sˆ Έ+±δTά|!Dθ1$˜tΰƒbώρ™ΠŒ¦4m2:pGX ΧΚDΉN‚k‚@V"ψdΝ»€γ£ΘIƒ0 ‚ 8Δ:ΑεΞω¬toι@$±Λ‹\Dm!ςηEΘf‹ΚνΊΊ2Ρ[M󑍨D£‘§€΄Q,€QJ  £ύY"m@ϊΡΡ —•2ΐf!ω!� ImageMagickgamma=0.454545,,‘ †) 3 > ( ) 25<& %76=;???IQXhr|!B%@>GVen o!"x#FEQNYWa^jgvs!{AAARRR‡#™(’+©,!²/"Ή1$ƒ"°Vm�Xw&‡(+—-- //¦11«33³5Š$†’&š(•‘)œ¬,¦³.­Ά/±Ό1ΆΓ2½ξd†ύjΜ5Ζώ€‚ƒ‡ƒ†ˆŒŽ‘’“”•–—˜™š›œžŸ ‘’£€žާ’ “ͺ¨–°₯š—΅ˆ£–‡ϊς‚XCe6€ 7¬"R‘‚ξZA\TtAx$ -p‘Α|… !Ρ—±υλΨ³kί�LͺΟD)‘R`™QƒςžΘξΜY½΅}•YΙ. ©ύό̍fn΅ΦΆ‡’ΤR€ Ώ0sА ‘PP)Δ}•ΐΓ!’Γ8 ρ’$ βˆ#b`’‰$žˆb‰*¦Ψ"‹'Ί#Œ+Ѝ"2֘ΐ9βH£$ŽΘݐDi$nDΩώ΄€>2h@ yBƒm‡@9@ƒ 2Τ–¨lΩ%$l%& \Νpƒ“ξδ@m· EΙ€VΰB-,€ ’0ΔB Ώ…0D=Γ"0@ 8θπΓ=2€”Vjι₯˜fͺ馜vκι§ †Jι"F–jκ©,Uš •΄AW’X‰H™VΙ Y·Vυ»�Šλ#Έϊšεelin`YS–nΠ9ˆ. QΠFΤΠ ·€ΰα":πˆ‡?θ’#Δ`ξΉη‘�Ίθ�ΛnΊξΆ/ΌλΚ[/½οšλnφζΓΎύς‹―ΐθΖ '¬πΒ 7μπΓG,ρΔώWlρΕg¬ρΖwμρΗGΙy«²Ϊ ,˜Mb« ΰ5b+–²aσ—0Λ93™@Ωμε#2t€%—•Ρ†Σ6ψ3‰³‚Ψ© \$Z A ,ΤBLƒ€4Θ9< ‰’Κ —mφΩh§­φΪl·½ΆΘސG₯ δΙp尐Η")»Œ^ea 2|ݘ5x}… ŽίU·fΠoΪvž“’ m  ,0€ š?βB ‚Π5άΧ; ’Γ^ˆΔ@ΓCΨb―€Τ^;!΄{fϋμ0»ν§ πϋξΎ Π{ν½ϋ΄0Λ0<ο΄ΟόοΡΧnόςΛ?Ο|οώΙP;φΆkί;υΘoύωΉ—O½υΜ?ΌνΈCίΌτΖΌόχ㏾σ§¨σ½ρ5}ΦΣ_φΎΗ=η™/Ύ3`Λ—Ώ�±o} t_ώΰΌωέ{χ£ήό:ΨΏΩY0€έcdΠĈΨ 2‹‹Ϋ φ6ˆσD©Jθq+>–¦d~³ΑMσˆ„3€\ l#ΚEBA‚‚3ΊAf@LD .  *"xŽ’†!�Qθ±K£ΧΘΖΨέDp”Š °δ$$BMπP΄€oLΙe ΰγ7f²Μd6(δ!ο(ΔCΘ ‘†€ W€x‘1ΐ([D �ΰ "*`NB Aΐ₯”hΑC€υ νb @Jη mΜ₯.wΙΛ–|FYΦ@M$­αDTƒ†‚&}hΥ5Σ,p¦ œ(€jXΓ‰‚8ζ!’©,lζˆϋ‰ dpΓF„²! Ξ9[ D€₯@˜:Awˆ@€T U/χΙΟ~ϊ3`€UGτ1ztYAYΆP( ‘%Ωd#€Jΰΐr !ω!� ImageMagickgamma=0.454545,,™ …* 4 " ( ( 25<' &0 .75>HVen o!"y$HFYWa^jgxt{ xJJJSSSŠ$š(‘*©,!΄/#Ή1$‚"~�Xw&‡(+—--‘//¦11¬33³5‰#„’&Žš(–‘)œ«,¦³.�Ά/±Ό1ΆΓ2½ξd†ύjΜ5Ζώ@€Π0Θ$£˜l:ŸΠ¨tJ­Z―Ψ¬vΛνzΏΰ°xL N΄UύdGέΖσ^� #ΝΗΗ5Ž37B 45B>vŽ‘’“”•–—˜V-122/G-. Q.£tB1j€HŸG11±R·Ή₯O.G.h-..-ͺI&G&�&''&Q(**)B" :9F;|F74 >E8"™στυφχψωϊ’  0^™u! Λ„xαBΑΑ’AΘN2| xͺ•YN!Œ²cB’.! D rI ME#(”˜@ώŠ(%"(PB΄#!ή aׁ‘ψθΗΎ«X³jέΚ΅« -LΜπQΩ'2 Α cAcF\pH› Ž eΙNΔ»Ρ,”±y‘ˆβ dA'41`u€‰l:  Β•*  p㆑< œ ™ ΐ‡;u^S«^ΝΊ΅k1Η,ͺU0 JL#΄ω1μ ueƒJP;-(Γ2":a ŠvrΑ2�ύ�ω—€ Ψ}όU@ΰ$Έ ‚Bˆ`€h_}G ‘ΗxώpΖ  Fˆˆ(ΐxš’"’x‡X"ΆΨ!1Κqb‡%ΚHγ‡%~Vβ‰"ήQγ8ͺΘa‹AΞψ£Œy )Φ†9©bwόθb‡C’ψc‰G9"ŒVΞθδ)κ8%Ez)δ–ZΙ’šJΦΈαŽ&>Y€™<’™"œ$ζ(֌&‘•’AXΘ΄l©qh HΘ•ΔoΑ-†h Š.ζQ’‹>Ρ(œ φ‚ *A Κ€UΡΫέ”„FU Aƒ :˜–žh4†0 :|πO ΠΓ±Θ&«μ²Μ6λμ³ΠF+ν΄ΤV›,±B@ΒΪjΛm·ή~ ξΈδz[nΉώβžKξιŽΫξΆοͺ nΌθΚ‹.½Ϋ�‹―ΌϋΞk―ΎκΎΛξΏυά/ΐη ο·ιަ,…]LLΉ,p( q(”a1ΕΨά vΏΘX«όD plΨ§,₯BE«IB­TD6A3f„zHŸ{ ‰D,4ν΄Σ„pDh¨a°”ζΑkθq€²<€οώϋπ_²lA$DlUΔ \Mθ@ZφU0ό9€χSN`6R]1Š1ŒJ€@=#Μκ(Μή «‘ρ ΨΑvˆœ/~­ΉΠPΘΒΊ° ©ΘobŠωQ9…Ž~£#όF-σϋa οr±N Q7 ΔK ’g—(†8ŒB…ΰ*H Α `0@ xΐ|πό{ηί>ψΒ6ΊρpLν2 ˆ’›@€ξxΠπ@ΓE:€(&w ` ό!Q$`jA p ©TT’†” —W,ΰ£jΜPf`%p‚ bu@&€ΈΗδ |7¨%€Α'!ω!� ImageMagickgamma=0.454545,,‘ …( 4 < #( ( 25;* )76>=E PWjsz B%@>HVem o!"y#FDYVa^hevr{ xJJJSSS‡#—(’*ͺ-!±."Ή1$ƒ"�Xw&‡(+˜--‘//¦11¬33΄5†"‚’&Žš(–‘)œ­-¨³.�Ά/±Ό1ΆΓ3½ξd†ύjΜ5Ζώ@€pH,£rΙl:ŸΠ¨tJ­Z―Ψ¬vΛνzΏΰpX +ΛP΄Qe›§Ij ^αΒ†νζ:~o‚ƒ„…†‡ˆ‰Š‹ŒS.3/ F/ R•—J2h–E.230šB€¦P«M/D•e./·nK'D'++'tM'*+*ΏC ??x86!?9#άέήίΰαβγ† 20E §Nν3οC2B1€“C­ /:‘š‘AA@]’f`(Ι#CbΜ(γE 3d9bX"*N€ Ε“! `,4i?.ψαAΔcδrκάΙ³§ώϟV8Μ(P^”’σ„ΨςΒ†ό˜‘a`Υ©U΄ΚΊ«Υ&\Y‰b!Ÿœ0aΕG!V4‹kΐΙ “JDόMΝ?¬=JΈ°αȃ‘-A£O0f€L„TzΪE}zIA$œXΞΨδι$²€Ξ(t"g}’„€Ϋ!T )°‚B“+$(ωβO {hόΨAγΙΠ£C·@:τηΥ­GΟnα:ξ�ΑoΟξ]»¬³�: m΅ΣZ[-ΆΜ6›-΅ίbkμ·Ω»mΉώέ’[,·ι";�ΊΪZ;m΄π�.΄έŽ‹SΙΐU b­ωL'Ίΐ)ΔCΙ9Γxv’#<ρ.l@§e“QI))Ρθ¨ΐΦ€!5ΡΦ]˜°BŒπΓπEs,·ƒ ;phD--΄Π=]τΠFMt�H3½΄ΡMCύ΄�A'έCΤT·`5ΦWOέuΥNƒ-΅ΨYo΄¬>«φΪΝ�νφ°nϋΆΉp« wέvΗέvά|Σέ·Ή|γν·ΰwλmΈΰϋέ7βr³­xή€;>7γ‹Gnxΰ“[8βœk>wίL‘P(0YιMn:AQM΅(;—9ΦΞώ=bβ)AZΙΠημΉƒ΅Fu>U† ., w2zΫnΙ Α ¨ΌL&œΐ Πd�’7Τ°ππbδc@¬=”―ώϊμsαΥ#œSρΛ―Tc°o6CEBά’θώρžΒ?=αΟ‹G„χšΨX†POΩT0&Ψ&zB˜€n†0bΰΑxΠŒ―}(d‚~Ό“ΒΊπ…R‘ f,•'Xζ4\‚Β2γŽV%—˜ΚšΠqCtΘΧΔ 6Ό;ΙςŒ )†¨)‚ π2QI#gγλžq`HΖ2šρŒ„Ρΐ%πˆyŒ~σσΜ)Π`vušh£Ϊ¨#ξMyΗ(πΗω Α\iβπЇ4„ 0@% !@`$±’ΡŒ ηQŸ$‚…Pδ<WΙΚVΊ�υψ `„7 3 ₯δˆ–Gαυӈ€ J…˜ ).u™!bΚΐ˜K’,3{₯:ΧΙΞvVAη˜‚ YΠ“ˆΜ$BjHων3(NBΤI"ΐt!ω!� ImageMagickgamma=0.454545,,‘ †( 8 > #( ( 25;& %64>HWfm o!"y$FDQOXVa^ifqmvs} yJJJSSSŠ$–'’+§, ³/#Ή1$ƒ"�Xw&‡(+˜-- //¦11«33³5Š#†’&Žš(–’*¬,§³.�Ά/±Ό1ΆΓ3½ξd†ύjΛ5Εώ€‚ƒ†† ‡Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’žŒ¦“₯¨¬‡�‘°£‹ŒΆ“΅Š#A½ ‚ 88‚A³ΙΚΛΜΝΞΟΠΡ�Σ 05Χ2 †Χ4ΦΨΪ‹4¨1 ‡α2λƒ45ξ‘β1†1¦021`p₯HŠ-XH04Β &T8θCΑ‚�qC„F;JPI²€Ι“(Sͺ,ΉA4d ΒP#Ck·Ή„)S‘aWcœ {Δ0w΄¦R¦Ž¬%]šS5ƒfΤ0E#F† 5τ=B@-‚ΠB΄ώΈ‘5‹V-€A=8 Θ~Iπˆ»²°αÈ+^ ŠCAhbPtΨE0ΔˆΡ¦Q544 Z4Η¦O…n΄‘5‚\35£ƒ n” ΄€ ˆ AZ˜€›7€άθa+ˆ‡ΎΌ0žN½ΊυλΨ™”‘&3(m?DΩ¨ •…ΦX';,šμ―i^Τ]›ωQk0uΌ Ϋ§=6I-ΰA[ πΫ€‚C=ψ%9Ψ‘ €ΐ†nhΑ‡n¨!ˆ!rH’""pb‡+šH"Œψ"Œ*ΞθαŒ2‚Θ"Ž5κ蒏7κc%ζXbEώ‰b‡0Ζhˆ.ƒœ3€S %•ΨbΛ”SšbŠ•Tv)–V@–₯p‰J™d~‰e•Qͺiε˜r°%–^Ϊ™¦˜gVIε˜`ͺ)›~κY'm" ηbΊ¦*}’i&šo�Yιœ„fg’‘.Jžgκωθ•ešζŸƒ†ͺκ6Μ@Ο ΦΘ@Vlΐ«ο"€† gT9¦ܘ" Γ6‚ΗώU 5|ΣU� @Sk‘H€ΰ hdΐ$Ϊ.4/Aμ`ζ$Έ°\52πΖ+οΌτΦkο½ψζ«οΎόφλοΏΟ{ΐ '|‚ #lπΑ /¬pΓ;ό0ΔώlBΕGμpΓg¬±ΖŒqΘμqΒ ›1Ι+SάqΗΗ\²ΚΓΜ0Η+LιΠ@CjΔbS•!ιh…νmPrί―λ—{Y#Qo55#0lp,eέΡvΝyε˜[Ξ7½q_lϊι¦Œ:Γ¨Ÿ�Ίλ­+ϋμ¬ΣnϋκϞ;ξ­[¬;ξ―χ~;μΑσ{οΕ�^{μΙ‡,|σΞο:τΡΗވc΄v§M3„mˆcώߌι"ΎΒΝ}AΕ4zAq ™²λyη~T”ƒ,M΄Α @4„ΙΪ†ΠΨ²‚΄)B7dD_p ‹ˆ`9ΈBό";„θ•Αzπƒ«X j›χŒ/"όΞ|z•Ξ@,1ΠGw^(ˆ:‚{0\!;6€žšΰΟ?’LψA$Π-@ΑZΆEΔΙD0‹ ΔΨΑAΘEP€ΘI] £­S°o5ΰU+ΖWF”ο<ΧXG{(Η.=4¨γθχ™όΔ}†Θˆ¨@`b *πˆ¬`>θAΰ ^‘8ΈΑ^ώ1ΖNzς“ τ Φq“υ"&λΰΖΡ •+ŒςLKyΗ�ξΈ?§ΌΓ €5nIƒ\ξ�±4 z©KSΊh”α €τΗ-H"Ψ…+P‹Ω 2ˆ€E, Λ4­)τ’7Δ r ψΰ‘Œ§<ηIΟ’όδk2 `ς552« ˆQζA+`-Z_s,»1D 4Z‡pf@£„Po<"k†ψγΧτχˆ δ£-˜€ ΰ„(ΡΞ JϊQ‘Κˆ›πVϚΪτ¦8ύ„\²ˆΚBΉDTuC₯ε"€ͺT”ΐ,i{j$!ω!� ImageMagickgamma=0.454545,,™ …) 4 " ( ) 25;) (65>=HXgs|!B%@>HVen o!"y$FDYVa^ifwt{ xJJJSSS‰$˜(’+¨,!΄/#Ή1$‚"~�Xw&‡(+˜--‘//¦11¬33³5‰#…’&Žš(–‘)œ­-¨³.�Ά/±Ό1ΆΓ2½ξd†ύjΜ5Ζώ@€pHƒ’�T:ŸΠ¨tJ­Z―Ψ¬vΛνzΏΰ°xL.›VeOέE8U~Vu€ΗΖΞz€7 B 35B =ƒyŽ‘’“”•–—J-C,1Ÿ- T œN0l›E€1.’01­S,΄ΆP-Dšj,--,tJ&))(Η%TΟE €}B! :8B53 =I8*˜θικλμνξοfŸ¦ 0½R€ -/θˆqAˆZ1d ΩΓΒΏT ώ ΘOb ˆPώωυιΓΧ/}�χ�Ω‡ί~ωH xΰ‘Ζp€Η€1H8xΔN(@Fώ8Έaxx˜!ƒGl8œ¦ˆΗƒi\θ JHα„wp˜‘„zˆ„ F8"†B(ŠAΎΘ’ƒIΌcŠBTXcŽΪ¨#ˆ=κHb'6XδŠ0Ά˜δƒ2 # qγ†9f˜$!*‘€D™ ‘Α/θςfj ΓΒ EΈΰ¦ Wž,μωDzς Ε $Z[ 1l€Οm0€ΥšYS@B3BΐΜ\yI‘ά_δ@ &„!9,Φ$*Μ ƒΕ<δͺλ�Όφκλ―ΐ+μ°Δkμ±Θ&«μ�Ά1‚#D m΄ΤJ;m΅Τ^›-ΆΫr[­Άήv nΈΟŽΫν·ώαš‹.ΉλͺΛ­�»�²Ϋ�½ΩΖϋnΊυ>ϋl/πΆS¬ΐ¦N8•A*€ψ‚ £ ±π‘L¬A\¨TΧ.q-,ΐΕ΅iΰ ’α©Ϋ'΅γD_ΨU V1j6=tΠ€`6s(„ < a€v9ό‘3¬`τΡGο ΄�H/Νt�N75ΤKK]5ΥOντVg½ΒΦ]s΅ΨZO]φΥg{ φΨa·ΝΆΡ½2οάtCk7έώލ·΅s—[·έ~γύwήƒή·ήπζxβ|'ώ·γ‹;^·α{#ψδ—OήΈε‡GΞ9ε}ƒ.zζ{/Ύωί Šδf)AΚF‹&DΠώWΏ  Ήρ[²Δοoϊ^ϋp}&|ΘpΪΪG,$€š T°L„t )€F135βύ5E ΠCΠ0CPseμΓs―;΄/�όπΨ†ς‘&xζ’=ν-§©ΒΖBΠΠ }_θ`ΎT1"‡xΜ£χH™Ι‰ΐS.ΒO$@‚‚Ÿ¨Μ\`¦0$"γ$IO 2NLΘ$™B•ύ„R,P€\π0' %x€* ˜!%‘:Ιυ ͺ46ι{8@fp*0ΐ9X!‡IΜbo2…Qζ‚τiw ‚Τ'`—1ΝΔ!°€4#Ešmz±Q1P€‚Ό)xΛ@G� δ|πƒ(‚+‡ “μyπƒ/‹Bp`hΗ ¨@JΠ2$@œRBΘ„j E@IΡ…Ύ#"tB!ω!� ImageMagickgamma=0.454545,, †* 4 < ( ) 25<& %76=;???GRYcr| B%@>HVen o!"y$FEQNYWa^jgvs!{AAARRRƒ#›)©-!²/#Ί1$ƒ"°Vm�Xw&‡(+˜--‘//¦11«33³5Š$†’&š(•‘)œ¬,¦³.­Ά/±Ό1ΆΓ2½ξd†ύjΜ5Ζώ€‚ƒ‡ƒˆŒŽ‘’“”•–—˜™š›œžŸ ‘’£€₯‡–©«’­ˆ―“±¦΄;BΉ99 ‚B΅ΕΖΗΘΙΚΛΜΝΞύ2 ‡ 3564Τ‘Ψ3ی5«ӈ166ί‡έλΰκμ2‡�©1321³\PQ‘@‚“R¨XΈΠa: 8ΐ$„ ΐΓ΄ CŠI²€ΙR ԁ[`#Ά³±AŒqŒΤΨ H6 fjXps•ΌšE#₯Σ`η£t Ρ°‘ͺ†Œ lά‹$aE‹uύ6’Š�Z(¨ƒ‡A!ώQΒνΙ»xσκέΛ·ο€›6ΐν«$ΐAς£Ϋ @Ζ @VœΐdΔ†YePωiKA Τ₯’ρAΠͺfSH{H…jΦ’T\@„@ΘFsΙΑ―οίΐƒ ž‰Νΐ‚ σ€™Zh­ˆ O eОΘYBoΰ9γFά½CJ‡Σƒh5J0/iQΨ‚άΓ‡δ!JμΠBP7αΓ ’$`ΰb  ‚.Θ`‚6!„ JX!…θ f˜ΐ†rˆ‘ˆNXβ…'zβˆ!ΆΘβ‹)’ˆ ΔΥh£3,mΪ6‘1ΐA?Db\*ύΔP"3¨ώwˆuƒ ΩX F`œe3@I$β Rε`OΙ`CV‘–ž-'Ι{e ‚ζ$*΄ΐ‚ ,‚<π@Bˆΐ%ܐƒ#Œ°‹#a葈&ͺ蒌6κ裐F*ι€”Vjι₯˜jȍœvjŠUv7d2ΜΐΒސS6ιΤ’‘ ’•”T±7k–­:rλ8Ή6CUJwZUκh%#k"’,WXΰ• € ΰ¦9쐈€>δ ‘#ΐΰν·ί!�ΈΰŽKnΈζ–›.ΊγͺΫ.»ηzk.ξΖ ΓΌυ� ―Ύς�Ϋο»�Ϊ‹οΎωLπΑσ ξ (4μπΓG,ρΔώWlρΕg¬ρΖwμρΗ s#ζiΐΐiC «Δπ]8ΡΔΩ‘ΙΙΜ“‚—OέΠΊσΜXΖΜ3͎ό*”ULV{Θ²jΞ7‰-L ‚” Δ :ΰ(?θιιΨΏςΩh§­φΪl·νvΖ']μά €€d―Œœf• 20ζ²#8«œΝV} 7α/#²2βγu�—I£§žt©F΅ —·ΧΒlBθ0v‰ Ρΐμ 6Ω¨σ%@@«Όώzλ΄Ϋ{λ‹θΎ»μ΅Ώ>@μΏΛ;ρΆ[6ϋμΆΟΎ:ςΞ#�{π――ή:υ²»Ύ'ρΓO<οώ―οy»λΕίΎ;ξΏΟŽ=ξΨ?ί»ξ±ΏOΐπΜ<σΙΗ―»σΰ› ώΣƒλR±»M5b�G b0.N%–ΩŒt�s³XU‚—y5.σˆ”Τ`ƒ6θ@γΰ22‰I=?;“ԐΉH € ςΡέf>ΠSΧξCŒΤωπ‡@ "qv4ˆ¬πδ4fjΜta$ ΫHR#p2š,`P|βtš¨Exά\„βx#ι(Έ†ΣXh ΄€(έG9 B,°#.p€ΐ+rΤV.°†Ορb? ΙΘF:ς#Dl`±DxˆΨ€§°€:Rg•₯Fxin[ΐ'Ώ$M’²’—Μ€:jPΉ’Q;Δ²Uΰαˆ6}ε+Π€-o™KAx%M,Έε pˆ@ΐ€ 0ΰ#—ΙΜf:“`ΐ,@KAΤ­՜§˜Mjr“/Π#ζ`Η@!ω!� ImageMagickgamma=0.454545,,™ †( 4 = ( ) 25;' &0 .86>ΆΆƒ:>ƒ ;=!‚EΎ―ΘΙΚΛΜΝΞΟΠΡ�’ 5ΦΦ ƒΥ¨6998‹7ͺΫ5έƒ 896λ4ξπσορ‡5„5¦ΧjtpΕ(ΐ U€γΕ„GX0d1ΛΗ(b h H„"E ς±ΓDE@NL[Ι²₯Λ—0cΚdVΓF‡›Ίip—#ί"( ΡӐ€q‚v†‹"GΠ8T}ΥQSͺ e0ȝ)56tΘΑΟ‘„ ’ƒBώ0f- ΰ‚…³-ωΠqˆ€ˆƒŠδ*βΉ3+^ΜΈ±γΗ“j€8$YCŽl“ΰΠ`ˆFY•/kΛΑAPΣ�H›vΪ(uiW₯!HA8S7&ΨP΅‹lΥ²CΠΒM€‘μ=Λ`A„)!²χοΰΓ‹ΟIς* DOjGAQA¦�cލ•m²,£rŸ‘~χ}vQUyp8θfΰ#±€!ΛQΐ /8bA…‚ƒ�δC ˆ`H‚π°WAπε,ΆΨ"0ΒθbŒ2ΎHγŒ7Ϊ#Ž;κX#‹4bΐγ9€>"ώ dŽKφΨ$‘F&yδ”RVω€’E2™₯“[ι"δ…)ζ%5ˆAςM²k…Ψ !i ΒA¦Ψ@ 7ΐAUvβΩȜuή™'#4€ΓXt"‚–‘‰ƒΙ — 6²ά, ­€&ΔD>2’.'Δ°C$ΐΡ"ακ«°Ζ*무Φjλ­Έζͺλ�Όφκλ―ΐK«"ck¬xŽ€θ©‰e²gVq0–žQ]»ΰ΄Χ2r-  κΑ 4Έ·ζWαΌ“Υ"*Đ !β p ½ΐB!(A!£�ŠAμ ±†0ΓΑ#<ΔΒ 'ΜpΓ ?μ°Δώ3<±ΕC|πΓC\¬ρ {άqΖ#oL±Ι£όqΘ$‹μrΛ0«\2Θ'Ӝ²Ν#,ƒ <χμσΟ@-τΠDmτΡH'­τ�L7νtΡ@2§£‚Tλˆ{Ρ’Υp:;§H΅£gO¬‰ΝΘΧaγ [kΦ@ƒeΈΡ o6D�ξ UΐΌŽ  όVΘE ΐοuƒτpκΎEŒpμγWBΐΣ”Wnωε˜g�ωεQ?’š]ΟΧH8€ή³ƒT»ζ eY“_¬ β:#ΌΕκ„ΠΠι9h·’Iυώh₯‚ΐp/lU0Ι†…cΒα$ 2ΒΐB γƒγ‘g―=#0€ώ0@ΰ @ψέ` ϊα›@ϋη£o>ο£ώϊμΧ_Ώϊη“ΏΏϊίΐψΠ7ΎςΕ/|υ»ŸύΤχΎς―{ΰ£_ϋΎ7ϋoσsϋ$˜Ύπα»ί�ψWΏωΙο|�αυwBώOTD!a›ΧTΝY„ Θμ αΡ….uK@j’•ž’ΈftA<"‘’U¨Χ}E7ια#ξI¨x(DΌ±΅θΑ§Vε@_πΕ„ΰ8ΕγΫ‹£ηHΗΗ€€`ΐ κS΅Ή9Eρ€J<Θβ;ίuΓM‡ʚ6ΐ€nΜC J7 IA’Lρ $%»Ή6BόŽ\ Π€ z3Ε<‡hΞ Z…\QiŽ $ ΆhJ; )†‘—\zΑD| „ηΥρ˜ΘL¦2™Α“wpEvι ‡€ΐ1ŸΤDS5Σ’Μ5Λ"p„ƒ3π)“8ΐ9p, ‡β^'ρ;ž€Ε'†C&b΄0$‹„ T€Z0ΟΘ₯ŒplDΆΜ‚τ ­D9 ΐΣ€΄Dΰ9ΡUPτ‘�0€βY’D !ω!� ImageMagickgamma=0.454545,,‘ †( 5 < #( ) 25:% $0 /75>ZΡ’‚Χ ¨@ΐ€Ša˜–CώC0ΒΔ‘xσκέΛ·―ίj ½Ρ�QΝ †κ š!#Γ žnpθyqδΙ|"fy³ζFΰP�ͺθ T­°ΰΘΐ‹XΈ@»πm!Ί†T¬υ··οίΐƒ §4C΄!74ž$ƒ†!™ZΙΣ1΄αΰ9¦Ά@Ή$–OId–[Z η•H βε›aF%™Pω šIjy“rΆε›Tjy₯œ‰ήωJ˜Y2CyW­BSΛE‚Za47i<‘&cΝ€š)4Θ ΓLŒdƒͺͺ¬.RΟOΨ0©)頁 ›5²A+P ί Ό`#Ό ki…P >μW¦ 'θπΓ#4ΐΘBtλν·ΰ†+ξΈδ–kξΉθ¦«ξΊμΆλξ»π²{ΐ )Τ› φβkοΎόήΫοΏϋκ °ΐωœ/ΐ#°Β�Μ―Γ(8μ―Βώ7ΜpΏΧ ±Ζ§0lt0ΥwΤ ΨΆΘ₯†Έjuƒ ΪxpΓΜ7»*³;9kΣΑΝOuΐt§–Ž8I)΄B!ΌP$-<Ν¬"' 1Β ψƒ-@ d—]vh£mvΪjŸΝφΪo»6άsΛέ6ΩlAχέ1δ½·ήvŽwάƒΧ]8ί~ώχβŠ7~Έΰ}Ήα“#NxΈSρζœϋΛωζžŽο蝓ήω½Ÿ‡^Ίι ³>:κ©»±κ³Λ�qμ°·n»λ΄·ž»οΈ‹~{ιΓ‹ŽΟ7ύ ”r@ABΙ�%§Μ‚ Ζr:¦>&ύ±b£ύMώάƒΖjͺ:†« μ:$;HΤS?�~+Α?… 0 ƒμΓ΅‚†Cΐΰ ‚Θΐθuΰ8ΪΡTFεF1Σ‹Nn 4ŽιΰΑΓΑοŒΠ%XΙO20”\:Q‰D€&Έΐ=[ˆΩR^”@"Β€ ‹ °HL’%t„%:ρ7€ι• ΓΠ@OT\υTΒ*I†‹ΛΉL#Vbjˆρ)“©‡ΜW2ѐ&†H±4bXv€kπ@  ψΑ΄5ΔξΐCˆΘΙΘF:�/X€@ƒ2"e…˜TKRΩeˆNMoΚaŠ7ΐ‘€c”6(ε)%eΙA�”™’f°ˆ, SIZ!,P€ .PΘ WbF -XA0‘¬΄A?’ r°A8€@ Α#·ΙΝnzsκG `�lς (D HWen p! o!"y$FDQOXVa^ifqmvs} yJJJSSSˆ$š( *©,!³/#Ή1$ƒ"�Xw&‡(+—--‘//₯11¬33³5Š#†’&Žš(–’*¬,§³.�Ά/±Ό1ΆΓ3½ξd†ύjΛ5Εώ€‚ƒ†† ‡Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£‡‘ ’¦‹ͺ“¬€•œ#A΅ ‚ 79‚A―ΑΒΓΔΕΖΗΘΙΚΛ”1ΟΟ ƒ455“1¨‹3ͺΞάƒ0Φ2γΥη‘ζθ‹1†Ϊ¦0210�) ‘hAPEH)ͺH˜BΠ‡ !ΰR(Η μ(Α¬£Η CŠI²X Rnΰv‘†εψ1J` ž .]˜aMΪ wΔ ‘ΚέΛ‘2•»©£₯ƒxššΓσAXAπΰ  lU‰‚Y³+V*DΠƒ_ώ‚XΔΓ²JκέΛ·―ίΏ€-Εθ°θͺ 5l.šxŒ¬·τ gAξ.[Ζ\γr£Νι:?­A€k¦h”¦–ΤP ZxU4‘EήHZH"€=dΥ „ΦƒΐΘ“+_ΞΌy§Αέr˜)ƒΛΖ‡3E“rKT ¬Νϋ | Θ‹Θ›G―¨ΡΠ5¦–ήP’,²-€„BΕνAτ — 8δ`C€6@‚ΐ‚ 2XΑƒ6a„N(‘…Bx‘†RΈΰ„lθ! Šb‡'~ˆ‘в8b‰(š(cŒ4Ί˜"‰+βΨ’Ž/棍 yH¦ ‹,ώd‘G*™δM„©δMD.Yˆ)Xy%U*ideQ.ΛMI&yd˜0Ι₯“ΰDY%•^N‰₯–`vi&˜e¦9feyž™§šU>‰§”…TΦε”‚Θ’ζb5`…+εΜ@œ†Ax6ΙPš!έM_d0L€u•Ι*u°&€©’6ςΨ5Π Γ§ͺ€AN‘ΰ7› PV@’Hΐ°‚ΠΔ…@‚ ΐ…Q#!ν΄ΤVkν΅Ψf«νΆάvλν·ΰ†+ξΈδ–kn· rΒΊλšΐξ»πΒλnΌμΞϋ� φήK―ΎόΖ›οΎς|ΒΏ<°ΐχ0Β οKπΏσήΐώl0+zΦΥ Ck†˜ZvΣΌwH§‚hPŸuΠ€Κ¬™μˆΛ¬‘κͺΕ0 vkj֜Ηρ!Ί‚B \νI-D`HAπP…Π@€=LΤτ/Tm΅Υ?dυΥZouΧ\ƒύ΅Φa“=ΆΧUwύCΩhΏ 6ΫkŸwΪbΣmΆέmΏ-7ά|ον7ήs»]·ΰwžχΰzn΅΅·αλψγŒοΑO.9δ”;žyεξb>y囃yη _>ϊε‘{>:ι§sώΉζ¬Gn:μ³;ވΙrk-}γ}Aέzι 8ε�Ι£&–“:ΙΣ”{¨2bσιΠπ”Τ„Ϊ�T0(€Vώ;�σ"΅Ι 2€88„ƒXΔCψp‹sψηΟΦκο`8Ω€ jΰŠεΘYΞΈρ˜™Τΐ;5 Š ža«f…‚θέΩ£”•XγΫ‹Uiƒ HŒOΉ™$"Πb9Ν7‚B‚Δ…;Έί�vΘΓd4θικ‘EB“ΛPo€›b„*΄3ΔPfdM³™)’4€Αk §π1α JsΔGœpHEƒD4`‘ίϊna ·cˆxΜ£χ¨Ώ,@ ΰ 7d… α" 3ΔiΖ‘©E$ΐ{.Q#€r0 ¨d"‡Έ‚`R“Š!‡gC+,ΰ2Y#PFΐ ΐb™‚aΉΖ–†X αZΤβ‚Π.tΰψρρ˜ΘL¦2?R sPκ0Ν$ΰ!f΅€E,R¬a”³"D~x³ϊfΗjPMβyV^4ΔήΣL¬„�5‰gCΐ‚x�ΐ|ΉΜO.)°ˆ8ΰMσΐΤ–IΠ‚τ ŸHΐl"0@&x§"%Ϊ…:R1½¨H Λ~Ί°!ω!� ImageMagickgamma=0.454545,,š …) 4 " ( ) 25;* )86>=HXgs|!B%@>HVen o!"y$FEQNYWa^hfvs}!zJJJSSS‰$˜(’+¨,!΄/#Ή1$ƒ"�Xw&‡(+˜--‘//¦11¬33΄5Š$†’&š(•‘)œ¬-§³.­Ά/±Ό1ΆΓ2½ξd†ύjΜ5Ζώ@€ Θ$ΐP:ŸΠ¨tJ­Z―Ψ¬vΛνzΏΰ°xL.'32=eŸ―n΅5Πμ6n>ߎόάψ 46B > rŠ‹ŒŽ‘’“”H .120H.œTž I1lŸH™/£-22�S±³―J.GΊi-..-qO&G(*ΝUΘC‡6 FC y€64 >F9"•εζηθικλμc 2- q²ΈOφ2ψ2B,d’‘ΰΘ† 0±9h!! bI&4%Φ‚!0d€‰αβB»’<`¦’ΐ‘(‘"™Ν\°γ nB|p 3DώŽv@ƒ J΄¨Q)-^ω  kExBήicƒ 2€˜(ρ €“*L9‘’₯>>8 Ψ |vp΄±γǐ#K†σΟI© X₯ΐŌoAζ~μΒ€‚L»�T�ΙUN¬ΟRόΈΆ­ 1€4iRΙu DHΑ/>„ΈAhšΘ¨ac…+€ΨΝ;…οί»ƒο}ΌxσεΑŸWŸžόφρΦ»?_~όφχί£ΧϞ�όϊψΩ'`€ϊ—}ϋ!؟‚�% BX`wΫ)ΡE0€ώpΨO‡p!!Φ‘††zΨΔ†f“†ˆht(Δ�a†Β(D†5z˜b‰ Ρ‘‘‰ύτΨĊ1ΊŒ)ΞXc ‘£ŒRΩδ‘JΌ£€.-X0Δ;$Ub†9ζ/Έ…„hCΐ•Ζ ΒδVΚ›-΄nŒ½ ƒ—Υ6ΜUb½dWΕ=^ΰεR>ΰ€4«l³Ξ[m³�"{mΆΚn+,΅Π~k­WΉπΒώ±x œ¦ΉT ˆ‰ΛœI°ωV\sj—ΎΜω�ΊΙο-dC žaΆ‘,³@δoIΤ%Α^&ΰ¨\—M 7 Βs |˜u¦ƒ•f“D,΄μ²Λ<ΔσΛ2Ο sΝ4γ|³Μ9σΌ³Ν-ΧΜCΟ@³ 4ΡC�œtΠ:3ν³ΣE­4�TOm5ΤKέ΄ΦOsυΦRc]΅ΨW«ά°h§έm·j›v΄l£=­ΫoΟέΆ°r»χ΄qΣέ·ήoψά۝7ήΡ~xίkžφW=$ΔTϊ6„YCPTžf(UeIˆ9ZΏUΖ ιe–•Ϋp₯~:ΑΐUηώUiΌy JMρO!A^$j�!3 ΞLy$ΣL4θOL&ύτΤ?q€ͺΥg†=j’ Γΰ;₯'ψ ³1•φ€ !@δν·¦f/Δ_Qώό)ΠFjz¦n»L&@4γ€1αI¦„PƒšAΡ‚v0€μδ‚Ρž7Ψ ωŠƒ ¬B ΰ5Ήάζ£‹‚P8Ο€πιΣ'ΎbΜ0,Pa?p;X<Δ3΅S“˜ώ…ΐ'€BpP—ήxμ9π€žw„.ΙR5 Α!Β.zρ‹`,ΚGΒ9KΈKO6T‚Ό†&τ)€sς˜\ ΐ €X€"t΄γ\ΰ.<ΦρŒH(δΦr0X€);‚J„—Œ¨€.xΐdrDγ αbC¨Aςȁ„- 5π@Ε0šς”¨Le#l!ƒ $αΈπΣ … Ί·P$ |_Hΰ'YόOΉόόδΉ¬“ˆRqεhΗYpd–I0 +ζHͺ G`†€Ι! ΐ*{Β©ΚršσœθΔΒ ©ˆο xg>ψhΊ}ςDG(ω„ !ω!� ImageMagickgamma=0.454545,,‘ †( 5 ( ) 25<% $75>HVen o!"y#GEYWa^khqmws~ zAAARRR‰$—'’+₯+ ±."Ή1$ƒ"°Vm�Xw&‡(+˜-- //₯11«33³5‹$†’&Žš(–’*¬,§².­Ά/±Ό1ΆΓ2½ξd†ύjΛ4Εώ€‚‚…†…‡‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£ŸŒ§‘©‘«‡­’―€ŒŠž΄† 9@@9„ 68‚@ ²ΘΙΚΛΜΝΞΟΠΡ�’ 0343…4Ψ‘0αβ0Œ3©0Ϊ†/έλ†Χ1μς4τδΫ0§/β4ΔZ!Ŋƒ’( Ι +T0 ΐC‡…εΈ‘"¦‰I²€Ι“(S’L@γER] »ρ8θδCΖ"30ΊpF‚x4.T;'Θ]Mk8 9]€»…bΠ85sό™ˆPΐ€‰ 8˜φ‘ώ' ˆ Θ‚>ιˆ{Eμ¨₯²°αÈ+^μ F FfZ`”Π ‹‚ΑaζQAhhāζИ”Nέ5iӏܽΔr+q«zΘΐ †’tΕ’< x@0žN½ΊυλΨI…ΊMΥ’)½x|ˆςg§TZΉ6Ή™Ϊά?ς @Ύ#wLK۞‘@δJ¬@˜+D0ά#kE°ˆ^Ύˆ„ ά€C @πPC$d¨‘†tΨα†~Θaˆ ’8’‡%’x’ˆ†XAŠ,ΰ"Œ/�Xc‹&β¨’Ž1Ξh#@ώ($7ʘ£‘;"ώΩγ‘>€“C*Yd“RnhevXBΒRΐπΒ7RαCV“pSOVύ²ε64βεxμ@ /Όΰ“#ζœ/„Χ@IΠ•mΈ€Α ¬Eb ‚‚ψom5β› `pΏ!LGš0@,ΨΠΓΰΥΘ?€ͺκͺ¬Άκκ«°Ζ*무Φjλ­Έζͺλ�Όφκλ―»ϊ’ε°†Μδξ€g71πVKά’η"ꝧA›»mΠζ΅qžΓ­#άζωνŸϋΌ@™œEΡΰΟ$¬0!)œ€΄‹ œ…i7‘C9\(φΠ―°‡ΰΒΒ 3μΓΓ7 qΔώO,±ΕC|±ΖSΌπΔ>lμ± ‹rΗ'Œ±Κ³0€)σ�όξ`�ύψ  Ώύτƒ_H€ωbώ3…όήΧ?φύΟ}  ηη?ϊ‚�λ_�ΗΎψ΅ο}„_νΑψΥ/‚ρσ1ƒΥ κ‰"§ς¬‡Z7Dž6\£CτΐΖκΙ†GsŸΡD|TXβχȘxRQ$L !ω!� ImageMagickgamma=0.454545,,š †( 4 = ( ) 25;' &0 /75>h :¨2€¦=ƒn$ΗcFλfZΐ�λAή¬Z‘"νΩA^:πb £ ½?`hGW=ψ μ—Δ_ΖΠ£KŸN½z¦3yΫ€c²#μ†pdͺfΡ έ,0W{QΦνqΟ¦€ΨCπLyh ΰΖkϋ=’H/ά&œZ¨ΰΒ[†TΰΒ Ό`A!90HDΡ !°0„r `β‰'b ’Š(�ΘbŠ.Ά#Œ+ΚX#/šθ"6ζˆΐŽ=ςˆ£:ΞXδGϊώδA6Ιδ“Iω£‘S"Y₯’T.₯“[By₯”Z~Ι₯˜^’ˆ€u-y#kH₯ nBφMγ§)5Μ0Oάα©'OŒτ @ž{6‚SύΡΐUύp$@m΅ΰqPΰ– ©@ˆ0#B 'ό aH˜ƒ@Œ0ΒF‹ 0Δ¬΄Φjλ­Έζͺλ�Όφκλ―ΐ+μ°Δkμ±Θ&«μ±’‰R} bƒjυy·΄†Δfˆyƒt€ƒίx €Έ±ΘΉ\™»Θ δΙζ’C΅#Ϋ!‘d R€ +HPΏ„ό`Λ"'!Β ˆ„A4Ϋ— G±ώS,qΕOŒρΕk\1Η{œ1Δ ςΘ2”|²Ι"³LrΗ/‡3Κ*·ΌςΝ6η<³Λ)Γά³Μ?ΣμsΝ;γ\΄ΞAσLt�F3tΔ1€ υΤTWmυΥXg­υΦ\wν5Φ(8RΓ}ϋ=εθyb«Vˆ7DKH}hΓ‰m9vvχΣg74"χέt£Φœ4Μ°™)Σ*° ψ@Z !šVV ω²ΏΠ6ˆDX+0 Β«‘Œ³€—n:b|­ϊκ¬·ξ:ΨςΕ <μΤn-!σYvhsgC=�ΰ;π»[ƒΓο‚οwMN Ξ¨ βi Έ€\“Ό€½ ;ƈ0ώ%"ΖQ¨§§―ώϊΞ @@@ΰ>ςη�ϋωΣ�Ύ�ωsόπ§?ωρO~ώƒ_ώδΠ€τS γ@B°σ3Ε €?όωο;Ε€)Xƒ6Co3%δέ jrƒlT†y.4M#`(BϊmvΥpžQι)dq‚ α‚ τε7@ΐvΠ—@ 6‚—ƒ}™cŸ·ΘΕ.V'OŒ`Νd50’s’Ι΅€t¬CX‡‰GΩ‘Ρ(t”£‘:@ηMkˆΜΌQ€hŠπ Z0 q+po!E€ΕSƒ‘!‚А!ΰ<Dzxρ”¨L₯*Ÿaƒ4BŒg¬“΄\©-C(ͺvρa jηCήQΑΑ!€_φr]|„Ωα•‚!iΘnΚrL‚I6 ’‚ΘŠšΆΚršσœθ\†nW°s†ΦJ€3EΟw.#0@Ύπ©/}"!ω,,‘ †) 4 < ( ( 25:& %64>HWdn!p! o!"x#FDQOXVa^ifqmvs} yAAARRR†#š(’+©-!±."Ί1$ƒ"°Vm�Xw&†'+—-- //₯11¬33³5Š#†’&Žš(–’*¬,§³.�Ά/±Ό1ΆΓ3½ξd†ύjΛ5Εώ€‚ƒ†† ‡Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£‡‘¦‘¨Šͺ’¬€―‚‡%DΆ"‚ ;< ‚D°ΒΓΔΕΖΗΘΙΚΛΜ†4ΟΠ4ƒ887Ρ4 ‹7¨Ϊ ‡3Υ5δƒ78θ‘λνι�ƒ4¦3543�Œ,¬(`H‹Y€d`…‹.Ad„."…zθ 1€ΝBŠI²€Ι“(C}XΉ�† AphH`ξί!58tθΐAή 2a²Γ‘ΐΠ™ h€dn¦R›†š&]ΪΘ6AμLέ ‘ΓVHZΌx±pΠ �VΨΘ€‹ώ L˜ΰA€ �‹o‰) LΈ°αΓ”€nδU’h|x4£Ι1‹ R,θθbΞ<;-Ί*ŽΙTӊšT³*"5΄Β₯³‹FT Θ,Ύˆp|€ΈΈργΘ“+Χ€Ο^Π/#£fτXž©aβ §‡΄˜ά«Y^ΐρŽΜα0ut=¨=ΰ€4«ΐl³Ά%x1Ρ"@ »δ`  ΰ‚ ^ΰ ƒ >aƒFX!…Z˜!†*(αvˆΐ‡!‚Θ‘‰^˜β†+ŠHβ‰%ΖγŒ-’8’Š7²˜£‹8ΎX£Œ?�Έ£> €‘BώY$ƒ,GŒΫEΥ @BƒxόSΓtƒ`§�]6CsaΪ0ftŒ|#€5Μπš‹Tv ήΉwΓΔ€$φ•%Θ ­@]πΒ !΅αC!„˜Γ@Œ`Q# ‘馜vκι§ †*ꨀ–jꩨ¦ͺκͺ¬Άκκ«°Ζ*«©:IŠj{BM;― ’Ψΰέ!j*βε Μη•ς,˜ΰ<;Ο|j6[=3<₯VΥxΧ«!}ˆ΅Β#²±ΐΒ*Ό  Ί@΅6 �ΥzH2τλ―ΏBπΏ pΑ#|°ΐ 3Ό°Αύ,DΓώΛ 1Ε?œqΔ sμ°Η_¬1Ζ$l2Θ[ά±Κ³ςΚ"£\²Μ'»œrΜ6ϜsΝ8γμo )-τΠDmτΡH'­τ�L Α#ϋε1Ωπ­!Ιζ PZr¬ Τ`·η:`nٍ„}φ ιq@͘1i5Clu5α.R»ŽΘζ]*œά‚ˆ ά <τ6AΰbλγG.94mωε˜gn9 Ž@ι3hΧυ#@q0HeŒ| @Υυ<”6΄>ž"¬ υ΅ΨαAάά©έUδ­Θ~ω1b_ρΌ€½$ B‚>@½ψΰψδΨg―½`@yχώΠύζ—�=ψι›2ψή“o~χk’O>ό[Λ?χεΗΟΎόχλήχϊGϋ‰rίKΟμΔ6ˆΣLB5‹ΐcΎtΥεŽ₯ΐ·†Σ5bƒ aD?P™<Ω 5Ψž#„wΌ€ϋ:Δ[8Aα G7=\$./Α؞‡HΔ""¦MŠΈ:₯�]Ι'X€`ƒ€cK‹H€š¨€t˜#ψ"SΆΖ( B)>™ΛψΉrxP;r[@j@•FΐΰΟΚbΰb!Βμ­?yμ@` [θ@:ΰA.z„ζρ’˜Μ€&~E0`(8!„EAPΪ JΠ²Ι•Ί5¬­­Rw?©A·TYvγ'«œSΫ ρnYƒmT Ζ2–sΰ!ciΑΑ‚C’]c)!ΰ€Z@_›Μ¦6·ΙMO@‹�ψ¦±ΊhrZB‹Y ¦8ΗY’ ƒ ( ) 25<' &53><***888GQYgs|!B%@>HVen o!"y$FDQOXVa^jgqmwt| yIIISSSjjjwwwˆ$˜(’+ͺ-!²/#Ή1$‚"~°Vm�Xw&‡(+˜-- //¦11«33³5Š$†’&Žš(–‘)œ­,¨³.�Ά/±Ό1ΆΓ3½ξd†ύjΜ5ƊŠŠ—‰–––­­­ΆΆΆΒΌΊΗΗΗΨΨΨηηηυυυώ€LNQ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£€₯¦§™M¨«¬­�―°±²³΄΅Ά·ΈΈOΉΌ½ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΛPOΤOPΥՐΣΥΧΡίΏPΧβήΰζηθιΛNΩ܎ΩΩοΦπκυ―δQβωψϊˆNε²Θυ{DνΣ?Nμ.΄Η°αͺyπ .κ‘Ρ?jά΄9άŠœ5 Z"2 “BP™rΒ€ε’“‹˜xs’²S“]›Z"Ι±§OM#ZS„1’»DAώ\z dQqEς<4υ ΜR4 Z΄€ΠΝOLpj {i*Σ³h‘V[²‚Ε’xώ‰ {H(Ε΄x9ύ8 $U'K^Š Ό„aj‚‚ς6YKY ±Œ�€ζΫΐ[i2y‰ΚζΒ’4αμο%Mœ,I?ήjrš –*&νXq‘ΩO̎΄*8Jγ|Ίσ wVt…ρpΩ­V³ξr‰Γ£ολλ±zΙ—„XWν |ρV«Q"C�Y9 xσ]{k"3jΪμ|“5ΩސdU+YΏ}υΫ²»αyM“Κ*n-Ο1OPζͺŠQ°γn'œΈ"Ϋ-zί‚ΖΨ /N¬"-‰υ€άΑη_‘…θfU‚ψ9(`n�ΑTκ|" œ~™ώΕhγ¨Τ›Ύ|ΖΪξΗ­€ŠQ#v9Β› ΟϊnHρžΗ°doέk›o8MIIΈ·™˜‘εω™JRŠ4ΫiΎ>¦§IΚ ₯‹˜‘¦ΨW& Ύ—υ–έU)g2=ε1"^k­2‰Ά’ωυ;X―‚³O]n*φΫpΗP>tΣ=N&Η’rίΩηΩ―r.ψΰΘπЉ!‚ύ!αŒ7ξψγG.ωδ”Wnω—f�ω暷Κωη.z枏Ύy馧�ϊκ¬·ξϊλ°Η�:κ²ΓZϋ†΄ί.Tξ²σή:/όπΔoόρΘ'―όςΜ7οόσΠG/ύτΤWoύυΨg―ύφάwούχώΰ‡/ώψδ_|ωθ§―ώϊμ·οώϋπΗ/�ότΧO�ωφη―�ώόχο��  h=ΰ±`L Θΐ:πŒ φΪ</P@ϊRτqp{P;¨½Jπ„(L‘ WΘBλ­ ƒ  €οI@Δ#@X€Ύ( a{) Ϋ΅…$΄πˆHL’—(ΐPxH0oœΰ½(ζp‡=¬αφ Γ!f/ Zd’ΗHΖ2š{,¨ π¦(hΠy\lž‡G(π0ŽΔΓcρτθΌ"Μ$°ΈGό=ŒΝ€!ΟΘΘF:ς‘ t"xΜ‘,‡‡*QR”5ρ’ρ4™„N@˜Β₯ ΙΝnzσ›δKγ$…§‚B,ršϋ@ΒI(D“Du(·DΑ‚ƒX ±MZƒœŒαρVγ$ωάgΆ 쒘 υ'Pα `’ΔK(?eXP²œO0¨4‹ΧFq¨σž’+IEpΊτ₯0ις$)P]†g›Ι+i?}Ό“―$' ’�’)@’YNJκ—:ŒBRpώPδMγ|L%€™pM'΄Œνδ"R@U/.UšAtκ+uΨRVΰ’Ox£;W�>΅§Qψ)JeΚΧΎϊ•›’|fπΪ™œ�΅ͺž ^ΘIόΝ–~ ^2=jXxκp₯ƒ)ρΪωL?RVxπτθ(I‚œ£z±ͺ $G+ϋ”3¨XL«πͺj<Ξ�± ŠM&6�ΚΫήϊ‰4%^Λ‰ΩΪFa–w}'(iϋΨΰΉU²?τh(-«ZΪ―œΘE€tAΫΪ :A εlθs3+Ό³ο³οl-AqΪFbΧΉΦξ^“‹Πεχ·ψΝ―~(Ξgj°m #:-θΡYΊ–n‘@ 9ήώ¬:•1Gν¬f‡'[tε‡MunbΏΊ‚Τ&³Α�T큃šΨΧΎU<¬pWŠΛΗαrΤΐ B‚χKγΫx~Α%+c’Έ Γ’ΌΥtΒίωJf‚U„žν` €ΰ$Iqςκ…΄gˆ�X ,Y`I†�π¨Κ$Ώ5ΛO–*ΪHΜ&\γ‡TΆς›‡·‹€Œ*ˆbK…· άήψΟ€tωKI% ₯ >aG²Θ“„ΰ‘”Χ\ΨΖ0ΎΔ#¨yΪ9ΔT𻫠3yƒηaσΟΣ…ˆ‘Go aQΊˆΣΓ»†ΏΚhβ9ZΠΈΞ΅�©wΐs�9―™¬²―ΊηώF`ΘΚ#ΐŒ₯§μγ5|Ο¦γ²ΙzlγΐΗm”€ρΰΉλn{ϋΫΞ>&3ΉW K +‰ώsΆ‹'4ΫάπŽw�‡έ< ¦γ, ν]ΌqTήψ~ι]½LΫΫΡΈΒή[‚3όα8 .ρŠ[όβ|₯8Ζ7ΞρŽ›QγΓC@ρ€€q#―δOΉΚ�h< ;/ΟcσbNjθΡ||€ρrώ<ž“OηΛ9Np„’@x=(ϊ‚π€ΰ! ?Aπ p„¦―όκοΐΆΎαq [Χ˜·€l= 0^tπF€ΰiž t°Έ[tΗAά•gƒ­Ϋώ=yΈΑπ8p Ϊΰ7°n>< Ό 2A„Χ‚ΘΛΰXžγ#ƒΙ'ο/^^ σΌΐ.ΈΠ‹g¬y ΑHΰaά(B0!=(Αν `ύψίΐ8 €ΎΏΡΜ_@ίχ~Όθΐ Pb.€εotί†‚嗝νΑ+?ΞΟψτο`μO^ί <°kP7ΰΐΪ―ΌP Py™pp0zύχ(x<•7Β2 s1πp1ΰΖS2@Μr(pΑ£UWπ3pώDΐΛ“ΰŽα˜δHŽβXŽζ8ŽθxŽλ¨ŽεȎοθŽιŽθ˜π8 Pχhςȏτ؎�‰ϊ؏ϋx™ιω )IY ‰©ɐ™‘Ι‘Ή‘ 9‘)Ž °D}—:€„ƒη}Ι£… Π‰ΧuΔƒ±8Ϊ£=š?€B €"T€Gš€Fκ£HΚ£BΪ€NΚ£>F<ŒΨΚ—CΦƒΐ<=ˆ~px%vΖ3›Β£uΦ7vx—“:θ}i:”kЦ:  u<©|t… ΐ:€₯ΛSΗŒΠ§2ΰœΦytθ-†Ψ@Έz–ΓSηΕrGπΑ3Gΐ—Δ³‚Ζ+§_ZxvΪ”±¨…Ωz<.Κ©ΣY^ΔγΉX¨p‡ε:Œn(©bhΙ3•ι*—ΜS—ΒGd…M‡zy+xt£JuV°t+h{švZ7‰u·|»ΤgvΤ—ώ·•Αγ”cʌΘΩ<}·0}Œ«ƒ[ŠΓΈr§Ž ΉΡϊ³šΘ”Χ·€^z<‘κ@yp™W•χzΠ©•2ΰ¨ϋk�΅ŒJ/`‹ji<.π0•d(ΆΛJwυΊ‚J'ˆΘ‡><Dΰ©u{½~Θ‰…=‹œ[§š`§’‘»u»ͺ“ΕcvήΛ€Ύ>Hjθ«KΫ”βχGμΏΕ#œΓs΄α‡3{<–gyhy0¨ΓC^<‘ϊΏgy»Γ“΅œηΨz'λ‹‘‡»΄τ<…<Χ(œΑ&\ΔF|ΔΈΔJΌΔt{pLόΔPμqBΕT\Ε7ΕVœΕZ¬kXΌΕ^όΕ4ΦΕ`<ΖdμWb\ΖhœΖήtΖjάΖn\FlόΖr<Η-Ηt|Ηxό@vœΗ|άΗ΄Η~Θ‚\?€<Θ†|ΘλSȈΌΘŒό=ŠάȐΙ'Ι”\ΙισΘ–œΙš ―›άɞL=˜όΙ’ΌΘ‘<Κ¦,Θ₯|ΚͺœΗ©ΌΚ�,Η­όΚ²œΖ±<ΛΆ Ζ΅|ΛΊœΕΉΌΛΎ Ε½όΛŒΔN<ΜΖόΖΑ|ΜΚL·ΙΌΜΞ¬ˆΝόΜ�||ΆΡ<Ν֜rΥ|ΝڌqΩΌΝήqέόΝβ¬pα<Ξζoε|ΞκάmιΌΞξ,hνόΞςlcΕ<Οφ,ΕχœΟΤ¬Οό¬rράΟ S�Π½Ζ}Π7Π½ΠΗΠ-o ύЍD=Ρ­B}ΡA½ΡΝ@υόΡ"-S=�&ύ?%}�*­?)½�.­ͺ/ΣΰΤ�2]ΣκCΣ6ΣγƒΣ:έΣή�>Τ'τnB]Τ,”HVen o!"y$FDQOXVa^ifqmvs} yAAARRR‡$–'’+¦, °."Ί1$ƒ"°Vm�Xw&‡'+˜-- //₯11¬33³5Š#†’&Žš(–’*¬,§³.�Ά/±Ό1ΆΓ3½ξd†ύjΛ5Εώ€‚ƒ†† ‡Š‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’ŸŒ₯ §©‡«‘­£Œ‹²”΅†!@Ί‚ 78‚ @ °ΖΗΘΙΚΛΜΝΞΟΠ‘443†ΣΤΧ’0Œ3§ή‡/Τ1ίƒιλν4κ0Ψ0₯/0ϋ―‹'T¬XQ`U|0αΒ@>ψR(‡ 譣Ǐ CŠIς£ ;u2εΚH¨½3$€Ζ6 3¨%0ΤΞBβ‘³€¨?CCm4tP ₯dΐΈa†=†+N(a+LlνΚP…V�^Gδ€ ώΐ ±£PΙ»xσκέΛ·―§ͺ‚ΠΨ 0Α„₯1sΠ‹ƒ`l8™ΈfAν0°Œ™†ζFœdv„nƒ ΤJΝ0 `ΪΡA'P,:qΒk€Ψ‹>D`ƒG!Έo1:πKΌΈργΘ“Γ:yνŌA-ΌiΪ…ΑŠ*31e ¨Ω;ω 5«ŒΎ'Θ‰~QΌRοΘ`mΈQ€έΟ/©~F7ΑΓπK ΦΙ 6Ψ Bθ`„>Hα„Z!†jX!ƒRΐᇄ8’ˆ’b†+vΨ"‰&¦xβŒ2Φψ’Š%²˜£‹;Β¨cŒ7�€=βd‘B"ώIδ‘Lώθ$Mςθΰ}‘Γ %– vAxk†t7Θ4‚ΐπΒc­A%ζšΤ5N)1ΐIΪSΧXεζj\0Γg€e€΄A ˆ „ž`¨#ˆjˆΊθ`Χ"°pHΤΘ?tκι§ †*ꨀ–jꩨ¦ͺκͺ¬Άκκ«°Ζ*무Φj뭟Ϊ₯W61¬ΒλkƒΘπxŒ2§"¨%– …‰£³ΛΆ&N΄D;'΅ŒΌA‚]§5η + €B&όGξ ) »Β’Œ¬ΫnΊ‹κ&Du Β€€<άΠƒ�‡ΰΒΐμΓΑŒpΒ/¬°Γ #ό°Δώ3<πΒ>Ll± kœqΕ_ ±Θ“ΌqΗ {¬rΚ,›2Η#Γ\²Μ'nj²Λ+γά2Ν/ίΜsΞ?ομσΠ6=3Ρ3άB L7ντΣPG-υΤO? ' œΤ« ΧeMƒ ΐ>λΣu>m‡�"f 2—’=·φΩ0€mΞqs!η !ω!� ImageMagickgamma=0.454545,,š †( 5 ( ) 25<& %64>HVen o!"y$GEYWa^khqmxt} yAAARRR‰$™(‘*¨, ²."Ή1$‚"~°Vm�Xw&‡(+—-- //¦11«33³5‹$‡’&Žš(–’*¬,§³.�Ά/±Ό1ΆΓ2½ξd†ύjΛ5Εώ€‚‚……„†Šˆ‹Ž‘’“”•–—˜™š›œžŸ ‘’£€₯₯¨—ͺ­’―†±“³¦‹Έ :AA:‰8ΏA;‚ 79‚AΘΆ�ΣΤΥΦΧΨΩΪΫά’ 1551­2α5” 1454 Ž4ͺ1π†α2ψ‚0αχ(ύ§@�††2Œ#F j)’‚ΕŠ @±ΒbI(B¦H@€;.x@Yˆ„‡|π€γ†ˆ „vθΖ³§ΟŸ@ƒ κsFŒ fΘ(Τ!ƒ‚�ϊ=RPΖf @'C» ύΓπmž }Φ™„V­Dώ5j‡ŠFŒ μN:!‘ΐF`qΒ@ Ή"UXΌx… ‚4"H3E$pς`³‡3‰ŠMΊ΄ιΣ¨Ce¨o΅\E βJ‚±4RΓB1:`[h놳54π \xͺΰΕmW΄ \έ‚δ½]48‚ ‰1X1‰…Ω©H‡A–7‡ΰœΊ½ϋχπγΛ7•·U‹τMߚRμ°Γo]±Uβ°<Ν%Ι‚€œY8 Πΐ —TΐB.°‘&'€@™fŒΔ -ΩΠ“ “ƒ Aτ`Γ$䨣ŽτΨγŽ>ώΘc@9€E"ώy€9iA’L"ΰ$”O.Ye“Fb©€–QNi%•`~)&—WJ™₯™[’Ωε™^’¦›cͺYf›rΎYgœtζΙζžiκΩ'ŸQξˆ@6¬₯Αr q U hπ‹Θ‘!x(*2ΐΓ \ @¦›Fβ)¨œBB[ ΪUΓsμf%ˆ(Θ`P’u•LX2AΰΰΑzAδPΘ2>Β #ΨpC €p$!ν΄ΤVkν΅Ψf«νΆάvλν·ΰ†+ξΈδ–kξΉθ¦«ξΊμš+L5[ΕΠ( 4ΐ`ΘnψI²[ 2d OΡ­E)lPC§σ\πΑ�U‰Βy ΰ°©ώdΫju#Γt†Dΐ…xŒB x8’$ƒ €9γ7*BγeŒΤΨ>ΌkH/τμ³Ο?τΟB tΡD#}΄ΠI3½΄Ρ=ύCΣPΏ 5ΥS?uΤJsν΄ΧU_­5Φdm6Ψ[[έ΅Ϊ_³φΪb£]Άάg»vάvϝwέxχ χίmϋ8ΰUϋμ‚ ˆ'�ψβŒ7�8( 20πP!»ύ6Ιnkέ&ŽPe)X\uΐᑦcΊ¨€«Ξ!Ε‡jΊ*3ΐ€ε”x rΘ%v ”m",2ΐx…ΰpΗρΑ|ΠG/ύτΤOB€γΨgΏx ”@ƒqώ `X Uφ,BŽTZΘjF βμ£�>$ρ»ώ#0l@;Μ~a†±T$ °‚ (b0„�&«ΐ8"2Ρ0ΔŒ%ˆδ,=:x^υ6ΘΑzp4F8B αR(€„X!1BŽ(,σ«D½ΔR›�HVen o!"y$FDQOXVa^ifqmvs} yAAARRR‡#›)¨,!²/"Ή1$ƒ"°Vm�Xw&‡(+—--‘//¦11¬33³5Š#†’&Žš(–’*¬,§³.�Ά/±Ό1ΆΓ3½ξd†ύjΛ5Εώ€‚ƒ†† ‡‹ŒŽ‘’“”•–—˜™š›œžŸ ‘’£žަ‘¨‘ͺ‡¬’�€±ƒŠ†$B·!‚ 9:‚B²ΓΔΕΖΗΘΙΚΛΜΝ• 2662¬�6”3 5¨2έ†1�ά†56ι‘λνεŽ2†Ϋ¦12ϊ°Œ* J‘’`A‘(΄X(A!"v )΄Lj‰x˜pΖ±£Η CŠiLΐ  2Τ¨'(ƒ Ξυ[”@š\#’’-Ψΐl•Hp)¬@KBψ ‚πrCƒ7D‚ΐ…bxΑ†fΘa‡~葈!r8’‰%‚xα‡œ¨",ΊΨbŠ3�H’(βψbŒ4Κθc@κX#Œ7™£‘;ώΙ£?2$’C. e“S>)ε•Jfy$–[j™d—`Ύ˜!’hΐ”5¨ΥNa‘(π’jŒ0Γ~†”7lΘC 3€η {φηȟ{φΩT4ΩP%­  Ri‘(  -° x9€Z[Ωf‹<BH . 'BDŽ Δͺ¬Άκκ«°Ζ*무Φjλ­Έζͺλ�Όφκλ―ΐ+μ°Δkl―’>’@ 1d` ³w’› 4 η!ίΐb§ Ψΰ§TχζmΆΦ<�­ŸΰœΫ€ͺ†'OΣL;ˆ€†D@A[© ‰B-((p&<δC² 4θC?${H04μ°Γ@DρΓώO qΕc|±ΔsΌ±Ε W DΗ Γ 2Ι#œrΘ³μ±Λ%Ÿ¬2Κ4Οl3Μ+›ά²Ξ/σσΞ2γ\³Π7ϋœsΠFtΡH7 τΣ=;5Τ?OmuΙΏ€ΒΦ[CΰˆηΜΐ€žΧqζ ±έ—؁—Sv4υmMΩ­σ-έ£ κΝb:yΐέΊίθιk1$`&5’ΠΛH-4τΘ-P`–‚Ηε HBŒ0ˆ¦πC.Ρ….ϊθ€— \w=I ₯Φh¦]sM9‘1²νz6P%ˆ>¦{žσ-r6KΌ―[6бΆŸKΩD`#΄P$-€ ˆ¬Ή BTζώόΰ  ›nώωθ§o>0€ςφ.7ή‚΄ *β ’x‡ά~|7žωrbGΤ€΄AαλδΓQ‹²j�ϊρΝˆ†4<  ΐ‹NΤ²ΑαΓΧlQ‡²SΟ‰A˜δΔ a‰AΦ “)`j"(•ππ”ZΘBτ¨r8D§κεΚ…XOp€’υ…ς—ΐ ¦05!€DqPΐ ‘yΚC( ™ΚZ$MxXLΫ)$]\γ,΄ €ΐ΄!ω,’K† & 6 = ) 25< *( &0 .65=;***777B QThr}!@>HVe1@%n o!"y$IGYWa^khpmws!{IIIVVVhhhwww†#™(‘*¨,!²/#Ή1$ƒ"&†'+—,-‘//¦11¬33³5wšY†�eΉkŠ$†’&Ž™'”‘*œ«,¦³.�Ά/±½1·Γ3½Μ5ƊŠŠ–––¬¬¬···ΙΙΙΨΨΨηηηυυυώ€N‚ƒL……Mƒ‰Š‚M†…‹NŽ‘•–—˜™š›œžŸ ‘’£Š“†›ˆ€ͺ«¬­�―°±²³°“¦‡–ΆŽL—·L“΄ΑΒΓΔΕ¬ΎΏMΛʊK©Ζ˜ŸΟΡΦΧΨΩΪ‰ŽΎ–Ώέ§•†ΊΣΫηθιι»KμLνΠ‚JρςƒMKΦν Iτκώ�Σ-Ϋ₯̜’]ϋ :„P\ΐ‡#z*΄€ΕŠίιKΔ―ΤΌ…J)t₯_$zρ:Ž”Θ²₯KM wEŠij&ΝF/sκ¨QγEŠοθ•T’d^“$HΫMRH “€ΚœΚγ΅ͺQ©’”h5ΙD+V¦^WξKΦØ6‘³Σ`Ω·ώpe5Κθ³η;ͺƒ’e„Ρže‚RmuΆ¨$wj葈Ύ€Μ’‹ Χh(|%*ι€”Vj)€ƒ^ͺ馜vκι§ †*ꨀ–jκ"-¦ͺκͺ»±κͺͺž½*k‰³ΦJ«­³ΖŠλ�Όφκλ―ΐκ ,MΓΊ*l±"›κ±΅ΰμ³ΠF+ν΄ΤVkν΅Ψf«νΆάvλν·ΰ†+ξΈδ–kξΉθ¦«ξΊμΆλξ»πN+@ΌτΦkο½ψζ«οΎόφλοΏ,πΐlπΑ'¬πΒ 7μπΓG,ρΔώWlqΓ41€½*4Po  [@ *¨ςΉ&_¬ςΚ,·μrΕ,ΰ£λN B΄8ΑB½Nn ƒμ|nΟ/mτΡH'νξ8ι΅.Mΰ¬3Ο4£+DŸΫDΥJwνυΧ`w݈NlΌνh{„R΄oO7·Y;+@Ϊάή-m>Íw·u_;wΨ„nψαϊώ’BΩΨfΌ1: ΅ΗΞ�Π„ €„)tžvΞ,¬½ΪΌ4π7P@+ˆ�DΆ*Vuΰ₯ΞΔΞL§ΝD «‡ŽΘλΟ 05΄΄#‚:΄,PΥ„Π¨€ΧΣ:ωj’7ρ·ε �ύφάwoνβώ‚˜m-ΩΚ� LΰΧνΐΒ"7ηόː£ΐ/,ΔξDφςσ]�΅+° θ3<#ψȞ–ξηδlύ£Ÿμ¬1\žώ²η>Ϋ¬ΰ}B ΰV@ΐρ Η|ΠΨ·οΉπ…0$œσξΑΑj‘/d9K‚³B’6υ‘/€`ΆœqNuDšΠrˆΔ#€oΧj„ΩΆΦΌα­ξuz!Τ‡6A€ ‚ άβ–H½Υ΅ž8i‘ΤΣ—ΒΪρŽx\™ϊ$QΓθ qΠ|΅ΏANj}€Οήw2΄/g\kc΄ΤΗ<’½―†ν{ί ώ³I4�οYu ΐ;ΨΘφ-Ξ~iά%A™H?2/‚$δΔ—ΗZΪς–#Ϋβ ηΖ: ’ΟzFΖ Η΄Ά±²ƒ˜d+ΩJi-.uX[δώ‚©ΜΕ- ‹ΣΚ2ι¬4Άς’Τ@Ώ²νμ™Ώ”$΄Θf?`:λ ".ηIΟzβkcd#/£ΕNg­-uUδE™FΊt2³ŠK„eοΈI-%bps4;ε/a™± Ρg c¨"‘5Ζ‰ΎN¬Γ`H|ζPl�•z{–.υ>€.N φŒ©Lgj�'&am0΅αϊT°Ά3>‹8Ρ ΰWΏ?fMq)Ι3ΚΖfβL+ψHߐͺώT6:!dηΫfSŸeSσ~MπjU3Ζ„T£PύτxρU}ͺr>}g iJΧΊΪυZH ŠΎJ-ςΕθo,υe΄6'·΅o0IH=yPk°5)€b9KΑφ!S«΅lTJΩg½―5θJεŒΩV" dΛ `;Π»Ίφ΅u%-©εΓZ‘–$°Ϊj ‘αp‰7άt€rΔ•[qΩGvφφΚ„­t§ΣΩφU°Πš€ζŽ8έ•Nr»|₯�xΗ;ӌ΅ΦYˆXžx½ ­τRΌπ/]°άψ�WΎψΝ―~χΛίώϊχΏ°€Lΰψΐ^"΅p-ώΑŽπ·n - cΛΒΡΒ°Όt›7 λλΑά2ˆŸE€αΡςŒpβg@Ε,F1π ˆΐY0$Μc 5H@΄hƒΨ@ΘΟ ŒŒδk™ΙΤκHχγ W8E>rπ° el)ΉΛΥA  ΕΜ‹5¨ Bΰαgeΰ.xœΰ,Έ@2pΑˆ«Υ<Λΰt€аβ?KΕ#€@Œΐ` Zь@|PF`(豦ΌYΠΒ2Pƒ);KΤ€6΅΅P]j pV§?κl@­>΅­Sέf`ωΦΉ�‘7π,OώΟ 5ΰΐ­8cΰΩ0 ηP /ΐ(``ΫYAψtLb#œΐY=0B *hnt«;FЌ  aΣψ.p B°€Ϊn9θ€�ώκ άZ―Έ―a--4?kίύώ7s`π…ΗΊΰΊŽu΅0Ύp…S‹Θ!p–Š|쐠9θυ 2 ­ Θ@Ϊ°€ °- ΘΰΑ~Ή5# 8+zΎγAθτž· Œ|;=ΐσJ€ΏŸΥo!<c�:Pδ1WKλWχ:ΥsΠδ¨O]ΦdίzΧφ΅=νa·Φ“η’&―{³[ - ΔώΰYΆ%ghιάΠ¨4ƒ‡πƒ!ρ‘‚~po F B°Υ€Ξ{ήσ}θ?/ϊΡƒΎτ€GύιEŸzΦ―ήτ/½ZϋȞφ³}ξc―zή»ήχ΅Ώ½ξqOόαψ»·}ο•�{ζωΒG~ρ₯|η'?ϊ֟~φ«ύξC�ϋΝχ~ψΑ�όρ›ΏφŸG.΄€.q”ΟΛ4 Α Nžrΐ_ώΦrΏύγ?hΩΐδλwvτχ~όGtύeυ‡€rWΆ7ΰ€σr4 ύ¦qΦrg1ΰπ,2b |w-10‡c;˜KG3`,ώ(ƒ/Ψ‚p=πE@$ΰΥ2<„B8„DX„Fx„H˜„JΈ„LΨ„Nψ„P…R8…TX…Vx…X˜…ZΈ…\8…ΦΕ~Ος9Λ&z'†d8ehX-h(e°†Ξβ†�†Ξ�†j8†hX†zfcθ†{ψq kυ·d]ΧkP€0gfHˆ-ΰ0ψ,‡χ,K§s$=P.¨cFŠ£XnD@*Φhp£°‹±Έ΄H‹²X‹Ά8‹Έx‹»¨‹΅Θ‹Ώθ‹Ή‹ΈΈΐ8Œ:PŒΗhŒΒȌΔΨ‹ΟŒΡˆŒΚ،ΛxΦ˜ΣθŒώɍέ(ίHήXΫˆε¨αȍ䘎ζȎ踎π8ŽςŽρHσ(Žφ˜Θ(‹:π…ˆrRkJFιk 8-Ιpι, €€νGv ‰9‘ω'‘I‘Βφ(§fύvl4€6€ˆΟbsΰ,Πg/€.0‚Ψ6GsΞ�‰<—yBB t=G9Ή“Ο>0‘X#πtHΩ_tθ,iΖ”NιuQωvO U 7-KΩ”W•^I•b7-Mib)wπjΆφ‘wgrƒHlΪ10x�"xΫ2°‰`“3Άb(Fνζ~Ιnη6ώtE@EpcBŠI٘ψ΅”R‡B†qR—v<h™‡v-R·Ο™“Ή™•9šG-₯‰A8pšΣB‡fhjx'r¨-§—ΟβrζbΥ‚—ψ@κ2:FΖιƒ`œ€œFΰƒˆy”B t2ζ˜ΦI] °MΙ €dD–πΞB8 α™vΟ"žι)™η‰d�Η•Ϊ kέ9ždמτ žκ •θyŸφ)l -l‰4°`ͺV-€€s Χ“Ξβ1‚2)bpg�Άh+tΞBBΠ‘7φ‘štŽΞβB@&p.ώ:]Xdn'1Z›(£pω,6 <1Šp)‡�R£3ϊ£9J£E€Ρβi‰€E–£χŸΟ2ˆΗ–€Vv-1ΰg1@“π~Φ{Φ₯2°›rιg0°›Φβ¦3†x‚ζŠ/§ϊ•\Ω™ΑΣdλΧ™σι- žsh§vƒ§‘)¨ρb‚Οb¨l:mˆͺ’‡*§©’:©”Z©–z©˜š©*S2œΪ©šϊ© ŠGηε,£ͺ¦zͺ…Sͺ₯Šͺ¬Ϊͺ“1ΦεLΣ²ͺ�Z«Άj01sϋ-ͺz«Ύϊ«ƒSGW³Z¬ΐz¬Θͺ/cΓ8Χ�«Ιϊ¬Πϊ.Ώ4±Κ«Ζ­~ؚ­ε>ƒ-Ξͺ­ΰ�έ’ξΡGΧΚQβš�κz-{Τζj­²Ί�ς:―εΤ@ŸT-ίJ―ϊš­i“OχJ-ωΊ―‹¬«sS­1Mψz�»°Ύ*yυ;α―πΚ°ϋ«²ε­ [±ΫͺΟ%±θΊ± ‹­²$ϋ«z²%›²—;pydantic-httpx2-9b7ee8e/docs/img/tqdm-progress.gif000066400000000000000000002471621521723372100223070ustar00rootroot00000000000000GIF89aΦwτ***888IIIVVVhhhwwwŠŠŠ–––¬¬¬···ΑΊΊΙΙΙΨΨΨΰέέηηηυυυ!ω!� NETSCAPE2.0!� ImageMagickgamma=0.454545,ΦwώΰΒ ΜKΜωΝκ& ή,αΐ”�PΨ+1°ΕΒ!ŸD 2±IΕ‘dL‘Ξ™)%ύ9NR$p(ώ«°λ·PΎ„4X `8αT€!MkVƒ™#Mž%‚ζLz4›ΜŸSJΕΥ€Ηl­Š$Z’ͺ3IX§Ίˆ*–cΛfόžΑ”ιj“›ƒ &e”IAl ~4ΰi`Ύ„Ί<-f­Αe£ ζρϊ@ZΣ­`ŒΞ±βΛAΤ¦E …‚DΗbš Έ!騳�Wͺœ//ˆ#½&˜Α,€HcލŠςΧΙ‘‡‘ό*™·ρ€Z&W»6�Αn ήΌ½�B P3ȎuΨ™¨9ύνj·¦χΤTgΪΰρχ}Ξ½4Ω·ͺr'>΅³ ΏΏ"ΟΌΔ™gΞ‘ΧP`%<ώ]nΠuG `…ΠMκΜFΠg1θί†w€sW£Q6R}!ρΗα‰(ΈD€Fǐ: £mΦΙ%Βκ‘£+HΕΘ„PA‘ΠŠDΒΡΛ}ΌΈ°ZqΔ<Ι&EF™XΛ‰Τbnν• M=—WθYΈC>κΝcMΫ΄T†ε%ε›˜XIˆ31x'‘ϋτ£'KUα€ΰ€*θ >xα zƒΈ’hκ裐Fͺ~’Vjι₯˜fͺ馜vκι§'ꨀ–jκ©’—*ͺ¬’ͺj«°Ζ*무Φjλ­Έζͺλ�Όφκλ―ΐ+μ°Γ`μ±Θ&«μ²Μ6λμ³ΠF+ν΄ΤώVkν΅Ψf«νΆάvλν·ΰ†+ξΈδ–kξΉθ¦«ξΊμΆλξ²Δ+―ΌοΦkο½ψζ«οΎόφλοΏΜmπ lπΑ'¬πΒ 7μπΓ第ΔWlρΕg¬q»D»°."@ .€K1²/o,σΜ4Χl³Εό˜ΐΈΔ@¬+›@τ·C»\πΝL7ντΣP£‹@n†;u²?­n�αώ|΄·\{³±cGmφΩh§u$WΐΗΡ^lΦΌ­¬έΛβM-_Χ 7΅ tށOφ³z7[vΩj7ξψγ',HC+ΐ$ΐ± <π·ώ έ€LΐΗYOάτ€Δ`ž€ D[ΐ?; €λ;tη;p:™W3χΰsσެκ< 5·›;³—ηžk=/ωχΰ‡/~»”—Pψ²»‚€5@@Σΐ)ό³“tΣ>L@-»ί4·Ώf 78ΰΡϊχΏ€΅γD~&:ΐ@ ( ΗΏ 6πσ‹@ @?­QΞ δ`²�wAφΉ~ΗΚτΌ7ΎΪπ†8€VHΠ€–9«cΰυ` ƒΖ €ζκv¬Ÿ9°nI{ŸΦ~V;'‚P…Ι*ά`(Ε$^O&@LώΐϋήV‚�Ν‹}λ"«ˆ 4K‹ΖΒβ±�'ΔΪ±rGlίβrΘΗ>ϊ‡@δή‘€ λ}D›έίδΦΔ°%~>δŸ 8=9λˆΟγ[#)?ϊ1―sΜƒβΧGΘMΖp’οΫέ0)ΈΎ)«c™\ΐ!aνρΈΜ₯.ΟΦ1ΚΉr…H€d #б逑^|ή#‰y¬<ŠΚό%Μ"»e–ŒΟ€ά^(‡hΆ²‘Ο3₯±ͺ€‚–Π£¦›Υ1U‘rwΛ]Ϊσžψ΄ΨΗ:VΜAJΜ“Ηz'�yΜʁ󛔛’!V@KΎPkέΨYB“xέ•`‚% Ϊώ7Ψ·ΓQN•†ό¨±¬45Ft…Θκ₯±θG12s†Λ§LgJS€ΰ&SγD$ΡΏh�ΙϊQ²˜€ž΅o£\›¬aFB:τ~0ΘΡ”ΚΤ72Σ…HύQv,ͺ>±c(,ŒF Ռ"‹ ΄h|*ΒdqB–d£aMηJΧΊ’+κh@Z©wŽ₯Κ�\ ‚ΖΠoκ+ξŒζ³Ά—›hς°I) "VDoΖ±£™c6ˆw,ϊ5VAΖ:`nπXc‘ ­@dHαH±zΪυ΅°νΆδyΎWf°Ά’dV€Ϋ»[»Υνo»6άΰϊV·;m'nεw,ΧΚφΉΠnΆώTš¬ξ‰°=βΨ¬[:˜ΙUΊΰ ―xSͺΞ,’Gƒv₯.²HΐYοΖtΌπ―|λΖΫψ `ΈΠ›ΧΌζΛίώϊχΏ°€LΰψΐN°‚Μΰ;ψΑް„'Lα [ψΒΞ°†7Μα{ψΓ ±ˆGLβ›ψΔ(N±ŠWΜβ»ψΕ0ޱŒgLγΫψΖ8Ξ±ŽwΜγϋψΗ@²‡Lδ"ωΘHN²’—Μδ&;ωΙP޲”§Lε*[ωΚXΞ²–·Με.{ωΛ`³˜ΗLζ2›ωΜhN³šΧΜζ6»ωΝp޳œηLη:ΫωΞxΞ³žχΜη>ϋωΟ€΄ MθBϊЈN΄’nΝθF;ϊѐŽ΄€'MιJ[ϊ�˜Ξ΄¦7ΝιN{ϊΣ ΅¨GMκR›ϊΤ¨N΅ͺWΝκV»ϊΥ°Ž΅¬gMλZΫϊΦΈΞ΅�wΝλ^ϋϊΧΐΆ°‡MμbϋΨΘNΆ²—Νμf;ϋΩЎΆ΄§Mνj[ϋΪΨVp!ω!� ImageMagickgamma=0.454545,‘ …φφφττττττχχχυυυεεεέέέψψψέέέΟΟΟααασσσψψψυυυυυυυυυυυυτττμμμΫΫΫΞΞΞΟΟΟάάάκκκςςςυυυυυυυυυυυυυυυυυυςςςλλλζζζθθθξξξςςςυυυυυυυυυυυυυυυυυυυυυυυυτττσσστττυυυυυυυυυυυυ0@@@0  DB±`4HD2‘T,LF³αt<PH4"•L'TJ΅b΅\/XL6 !ω!� ImageMagickgamma=0.454545,‘" †###$$$))),,,333===JJJNNNWWWYYYZZZ[[[\\\nnnrrrvvvzzz|||€€€‡‡‡ŽŽŽ“““žžž¨¨¨ΆΆΆ···ΖΖΖΘΘΘΚΚΚΜΜΜΝΝΝΥΥΥΧΧΧΨΨΨΩΩΩΪΪΪέέέήήήΰΰΰαααγγγδδδηηηθθθιιικκκλλλνννξξξοοοςςςσσστττυυυχχχψψψωωωύύύώ€C‚ƒ„…†‚D‡ƒ??CŒŽŽ”•”’Œ‚™›“š’˜–£€Ÿ₯› §‘€“£¦‘‘˜’ž΅°¨ͺΉ§―ΈΊ¦©·¨±΄­½Ύͺ’ΐ΄ΛΐΗΌ«ΑΌΆ�ΗΘ=Ž=Φ—•Ɛ;=D;Β­ΣΒη8;'CΪέ�ο­58CΰΞΡά«88υχςεjΕΟί?vνΜ5³T€C 쐍κΡΠαΑ€?\ΈX±Q£GŽ=j\‘β…A‹υ6r΄Θ²₯K‹NZ΄0ƒΑΛ›7c²ΜЁCŠ6q u¨Γ!RxXzaθИ~ˆΰ`†Σ«:ΜxΡΗ%"`}κ"€ώ‘+TΒW f(PCΫ«#@¬›pΧ)„ τ½Jΐe !ω!� ImageMagickgamma=0.454545,Φ)†***:::FFFOOPVVV__``_`gggopowwwνMJθ\ZύWSκa^+΅C=΅QC·V-ΖHν©>ώΆ?€€θ«NώΊ@ι¬R}Ί‡kΉέ_ΔσΛοgΘφsΜυxΠφˆˆˆ———Ώ‹«««ΈΈΈΧŒ‹ά‘Ψ·‰Ρ½½ƒΑΊΚΌΐΐΏ�ΘΌΉΜ‘ΉΝ’ΎΣ₯»ΓΐΏΐ•ΓΩ¦Λά»ΞΧƒΛμ‹ΨόΜΜΜΤΛΙΗ�ΙΡΠΟΟΠΠΨΨΨΰίίηηησσσώ€%%=?@…‡@†ŠŠˆ†ˆ…Œ‹‡“‘‹—•—‰›?›Œœ–’˜’މ‘¨Ÿ§”―¬Ž– ’¦€­« Ό�΄¨©Ή�³Δ‘ͺ·ΎšœΎ±½Γ²―ΐ»ΙΊ΄€Α˜�ΆΩ©Μ“ΞğΐΗβΈ§Β™ΫΘݭ߰ݚδΟΗαιάΧμΓξηινΕΝπέCnΥ²z΄j€ψᣑÇ#J|Θp"Ċ1JόΡƒbΖ†=ϊ¨¨ρΣĐQž΄x‘₯H—#WfμΨRεK—6SΒΉ3¦DB>izΜι“%Ρ›=‹ZlωΦΑvάGImw^όζŸk�‡ }Ϊ%v oΟΩη nγ΅7][γ­ζ܁Ή1ĐenνW_}Φφ‘uΞ}(ƒβ½wέ ψtbxβnψ!nWΙψγ€6β…£‹5�ώH’4ώψx­εˆ t:φ8c|'FΙδ“α }Y₯‰ζΙX^‰g ©$‘�‰™bϊX%˜i’ηe’tΊ $œTZyޟΤy7cΡ­vB 0Π€ dbˆBPp …Κεr*H0¨`©₯bθβ|ƒ†ά•₯†*ŸΌΡ˜r¦ζ$‡’Jክ*(ͺŽΆž κ­Ή½*ͺ¬q‚Jμ•·6$lͺ^Ζϊ€―₯ϊ@ƒ tΠA Θ>θμ �2„,³R"Ιl‘•rϋ+΄΄6ϋΫ±Άq«λ·9.Λ�•ζΆzn�ΛρΊξ»νΦzj²�βkj–υBkβ Βζxξ¬ΖΎΫbΌg«pΑιώπΆίJœ+·94ΰΐΗ 7CΉ•ϊ°C€œrŒμ§Δ,σθΠ"Όβόι˜ΟΪ»sΉ»­²\–ά+ΐλήό/�Ÿ.ν³Ρ« ½oΐ«ντΓ±*m*ΒΐκΌ/ 7„}C4”mΆΩ¨φΐ ]�μ!ΐΖ¦m.·ŠY Β”xgœΐ 3&\2­Ί—υΦHξλΦoόpΕOΐ€�Zџƒ,€ΚZΦEm ‘2άΤG[OΒZΡf]ν’YκΥΐ.t€ei[€{\Λ’Ά°_,n%m;R‘N6ΈiwՏΗ5oŠ]όέ!�VΕ΅ι{½Λe-g7…(/F‰λγ·‹±[­ΙQ,ς@UYnjdEζ–fPΎ±m₯ΌΥ<φΌnŽ―™»έ6g—₯dr ‡«Χ/ŸΠΣυςh…λE#GyΚΗ΅t₯ΑΚθη²Ψ«™½βŸΜeΧfΊ�’ζ.θK>žΆϊΥ€Α΅9€%R΅<AR§H€.:u‘NeͺS³ιPkώΰΨΘNΆQ½š€c@<8€*€£ώR–°PΛ΄Ί’V� ΝιT+ΉΈ nτ¨νg,»ΥΔ΄x5νΕr'ΪΙιξξΊω¬owSzΦ™VςΌ³ΌiDcϊΣθU· Ω}c‚OΊ�w3Gیΰ¨Ž―½§όξ—PΝ&n›{ ΒκŽRΥ&cxη hΰίο8Γ!>ςΦΥ8wq‘΅©r›γœ’#£΄Νgκ莟šθwh�a^οςϊ\ζRζy½₯~耏4θwρΘ­Ni€g<ζf¦ΉΣUώξ€kμτErͺΎWΏ€θΗ¬uΈq­λ(΅Χ;AR \Eώ Q€nΞ»ήτ”ƒ½ΒA A aΏO[›eΥ/j­ΝθJ:ΟΝϋsxΗ\ι_‡yΝΙNψ¨gwκ§―ϊ΅ŒuΤ}띟υη™~R±Οšτ±Goκmήsά_=σΆέόŠU-ϋ₯ƒ½φ›{ΞΡ­{•_:‹=°ΐ€@{‘ίΡ|†xΗVۦʞηX‘![ΦιΣγΰwΉ­»SNv²γ\πUητπ­^ψΒΓ}ώΓGϊӏvCΟΤπ7χo=ΐU+ζs†FgόΧfξ•^`Wv½Χ€ψWt"χtπ·U9Η{(sο'€.ˆ>mg>ζσF6yΰV`Έ6yΐTz'8 w°aώ eE8pΰ}xsθewŒWΏDKŠ—K+θK+ΰT"πmZdyΛ§ξχyύΧuμ·iFG€ΗsΘt…&\ ˆnRX|ϋ†Άw{x…¨…0Η…τφ…§F:7†p˜|π€§'€Xθ…jH†R¨]Q}Σ‡PΈƒ\Έ)ΐG²Σ)Π~*§:Πα—;,Σ^δ}:Θ+€~Α³^€1η~^·ƒ¨χ‡€Xo:xF©wŠύw}¬xsVθyύ׊¦xŠLEvͺX‹§¨y―‹Ύ¨s‘H‹½q·s:˜ŒΚΈŒ$HvϊeENΘ LYδLΌτJΐt2°xώΖ΄xu4Wp¦ΘL€·KΩυKΣdΣVUΐ”V&θEсΌΨ‹ξ'Цψ‡v8ŒΕyT7Œ�§‹³‹ΕŒ‘(‡¬ΈYԏώ8―XIwΒθY΄Š1‡pˆ‚ˆqXXΐX‘Y„‰f„&€(Šb\ΕTfTi(Ι9π(‘2)!™’—¨Šf€ “™’ΉΈQ!™]˜8‘—Ψ“BY”2ι“*™’;pF<Ή’Kι”EΉ”χ‘3©’3‰’ZΨ”L9”©Ψ“U9‘I •FΩ”\‰•™’M9•3Y•cI”=©•‡Ζ•·θ•hΩ•H ’p”*π—€˜| ώ–bι“!©w1”(“G)–wY—¨Έ˜”“@ITl©Š`9”Ty˜W™ŠŒΉ•AΉ–™—’ι™V šή”_™–fDš�ι–z©šr™r£i—¦ω˜ω™Q9uO —›Ι–)›Ό™•΅Ιš§I–™œV™š½‰œ(Ω Τig›KΩ–ž‰˜•ٝ‹—ήžέI—ήIž―ٝΖι”Œ)ž―ižΛžΰωμY™ξιžc©–Ž9ŸgδžρY™ύΉžϊ‰Ÿ‹iŸ ) ά)žQ) Ί  κŸϊ©˜γωžšž  κ ςι�)žυ‰žΰIž: z‘ –I™ϊ‘ω9Ÿφ’ώJ™.‘"κŸ*ϊ’α fΤ!@Τ9}#š‘&€B:€DZ€Fz€Hš€JΊ€LΪ€N’φ€R:₯TZ₯Vz₯Xš₯S:ΣΙ£©₯`¦b:¦dZ¦fz¦hš¦jΊ¦lΪ¦β G;κ₯_κ¦tZ§vz§xš§zΊ§|Ϊ§m:I `!pqBJˆš¨ŠΊ¨ŒΪ¨Žϊ¨©’:©”Z©•Ίa–š©šΊ©œΪ©žϊ© ͺ’:ͺ€Zͺ¦zͺ¨šͺͺΊͺ¬J©8ˆΏ"π‚0L™*§Έš«ΊΊ«ΌΪ«Ύϊ«ΐ¬Β:¬ΔZ¬Ζz¬Θš¬ΚΊ¬ΜΪ¬Ξϊ¬Π­�:­ΤZ­Φz­ώ^Ί!°@@0>€­β:�δZ�rŠl –lζΊ�μΪ�ξϊ�π―ς:―Ο !?€@―ώϊ―εͺlκ °[°{°›° Ϋ¬φͺ―!°£P ;±»«ϋwP±»±Ϋ±ϋ±ΐZϊ ψJ@ Μ*@0²ΨZ(Ϋ²/Λ¬P4³Λκ²ΞŠ±Ξ†l Ϋ³>ϋ³@΄ρZ.«¬PD­p΄<@Π₯Χ qΚ¬  U»¬T›³ bBϋ΅`Άb;ΆΐJ>°,‹¬!@}݊Ρ*@ §P+΅ΦΊ΅Ο ΅Y«¬@ \{±dϋ·€ώΈ‚;ΈΉΚψšΆΎˆ»«k+·Q Š‹«‘›«“+¬vK•¬ˆ;·”»ΈΏzΉ½šΉΊͺlικ΄„{Ί¨›Ίͺ;±<πΦιΉrŠ―·έJwΓ² π J²Dϊ:·k«΄#%>p΄ΰΈ”λ«Y₯ |K²Η ΙK�)«> ―ΆΌΝ«΄rϊΈ^jΌΘkΊ ΰ  ιZΊΗΆΊϊ»ΏόΫΏζ:}‰»^ͺ²Ÿ x@@{Λ£fάͺ ‰pk½?p«Ύϋϊ PGŒΎvsΐ½Š§ `·­»Αώ7ϋκ­=`΄P;P‹Ύ,˜ Ί¬6θ»Τ©@€Υ&Ύ'Μ pΒy»Ž`ΐ¬ΐΣ»―<]›Ώώ;ΕT\ΕVL¬€Ύ8`³Ή:†ΐΒP+ΏΗ«― Œΐ ·• ΅<Œ·p΅]΄:Α@Π―lΜ« 1² μΖ7μ­"¦²{«ΐŠ›\Ηœ΅z<Αή ΅n[ΘΤΙxάΔΉJΐ`\»0Ζί κ‹�ΚvŜάɞlΕ~|²ο+ΎΗ Ό΅³Κ²;Ύ l²;Κ­,LZ4ΑMŒΓrκΕR»΅ά³³Μ­φs7φCΛ< Ί€μΐ@ΛϋΪm pΓΣ‰ΛΓ|ΔLΚώ¦ΜΔ²š―PLΊRόΙάάΝή Έ*;}Œ«αΌΗ |²­L«ό΄€¬Λ’L%�P‹Α`Λ^:}ΚλΞΘ<ΛW«VΦ©VLΟ—ΛΉ<ΊΛ �'μΑ$ϋΈΦ™Ο�Μ£^ά̈ΜΐΊΫΚψ;°ίœΡ½Ρ«―*«²γŒΔ #½Μθk³k›Ά]Ο;j ΗΫ�φΜ£ ά₯$°ΐ0ΉqμΗ Ζ;JΣY Ί; Ήqlf|ΌΣyΣΤ™Σγl³*+Ράκ΄W›�Υ™l ζ΅½Υ\έΥώ Η$°Ά/ŒΜ‘Ό··‹|ΞΟΛ£'¬w ΑB½?€pΌƒάΞ}Γ>°6‰0ώ½­;Vvm²’|ΌΧ{όw Ώ'l½ œ΅θ›Ϊ ½Ϊ­m΄<ŠΥMΪΰή❬*+ΐ}ΐ°ΛTΊ`ήγΛΕΕΚήλ ίΞ*ίrKίφ-Ήd­² ήiΝ:›�γ=ΰ^ΰΛZΞ·ά»ΨMΪξ₯΅”Σ ~ΡώΆ?€€θ«NώΊ@ι­R€€}»‡ˆˆˆ˜˜˜Ώ‹Ÿ Ÿ«««°°―···ΧŒ‹ά‘Ψ·‰Ρ½½ƒΑΊΚΌΡΘΌΔΦ΄ΕΜ΄ΛΥΎΡڝΟζŸΠζ‘Οε€Ρε²ΨκΜΜΜΤΛΙΗΣΙΡΠΟΟΟΠΜΡ�ΨΨΨΰίίηηησσσώ€**ACD…D†‰‰…ŒŠ‡Žˆ‡“’•‘‹•‘”œ˜”ž Ÿ’Š—ˆ†š£›­–―±°³©³˜§C΅‘Ά¬«΄™€²₯ΌΐΑΔ ·Ή­ΔΊͺΓ˞Œ΅―Γ�¨ΐΣΛ²£ΫΟ¦ή€ΧΏΎΰΎΒΞηΜΈκΈΝΘ½ΨρδέσΏΗδ¨=.CBύώ��ψH° ΑƒсŸ@„# βŁ%Ft¨±£Η‹B,Μθ±€A’ύPšΒp₯Κ•!+Βψς%Ζ”uΨTs¦Ο~ EήόI³'Q˜A…€LxTζΞ¦P‘Fκ―%U˜V .ύ™υjΙ�·v[r+X—^Σ¦Υ©ΆίΩΆώίϊ#‹�GΉ@‘βmϋt)Ε‹ ιώ °�Ήaύ".Ό‘ఐ–ό·q^Ι@3nU<Ω°Vb=η%˜1f₯šM_FL:re‚’WΓΖΌyτgٍkΥ}ω5Ε…§OΏΖνZφγΫ³'‚.ήΩ6nΡ„&KNYΉΔΠΤ[SžzzpίΦ#b�^½τΰ�₯+›?|»ω„5Ώ?„7{ηڝW§myΏϋζό©v}½  gσωGž&—`mωνמ„ΪεαpλVίtν5`zH q» f_€�U¨ίˆζfgς}ΨŠ1Žxၫ=hά‹2—`‹!*Ά^ŽύΕφאυώΑ‚L`Α I–8Z-€°Α ΄ή‘ύΤ`B\ V¦z»™™f”€qΉ‘R\Jy€†f²™&kSΒ‰'CIF©'œ}–η¦šoώ9gou–y'~zZŸA‘ƒ7θί\Ž&šon©¨’Rβ¨&}g˜!mΪhc›—ρ)ί €β§)ͺ¬–gŸ ΒΪiœ†ΖJΩ¬uβIκŸB¨‘Έ Ϊ(‘›NI皾9ͺ¬΄λη�²Z겘:‹(΄Ώ’λ™C°s–z+ΑȞ©¨ 'ԜyΪΑ +ρa(»³Λ ZY !πΜ’›Γ‘²ΐ °Ζ;Μr΅gάrΣΠ²K(ž£f]΅ΗW³$φ΅?3-qΗ_Ϋ6Ζc·=υΕT£ΝΆ©šφiΊ|W@ΤIΊ οΰD δ›/-Χ_Άύ^χE(CύsΪ―U.³ΐjψηojžpγ”K.υΤ₯ uηΛ‚Ξy9θ{μ°Λ>»΅€€kΜP ¬°θ�C  4€Όο«χ^ί#PD<ΰ>‹3 P<ι~BΟΉπώχ`ΐ ά»ώΩ©~-κ]BΎ:·ΫήΎιΒΟ―>Άj‹~ώαπΗoΉΣσΪ±Έ5ΜIFώά ϊΦ7(A­€"/-AMŠ ΎΘδ:&πƒ ‘GHΒ†6H‘ WΈBΰ 7c^T€!%Pΐκ³Γμ IΥγα!ϊμ€Β‚„κ©@*¨žχfpΓ>νΰ‡<¬ήΧ~9 z<„A™ψƒ6ρ†7μƒπΕ$ω‰Jά’―˜;\ύ.p#ΧhΒ>ϊρ€ € )Θσqoη’@ tNp˜ $ίεΐ)ƒψΚ@ϋώΔD8ΦΗ“›a'AWEB‚r{§Œί(?WΚA¦²>”Ί gi1P€ ψ$πeHp‚Dΐ—ΨΑ΅7”ΰ“3cŸZω€$Φg `cƒ°ƒ„@—H’°8³>)Xΐπ€†ΐ @ΐΐ)%>ΐx@΄ηƒ\&ΰœmόBΠΔ” ˜ΗΐšΠ„ž3)Π₯Bω5ε) —ΊK�0 `(ΨΑ9k€Ȑ“#\₯αZ)ΘW‚Ξ₯�S)ΰXH˜Ξ¦Ÿ“)+AΘR–N]  €� lސΰ$)Jh^ _O…κ4 Ηώ/”6ˆΠ¬g}€πΚ1*ˆ=ΝͺCYΕꑬ`₯VqUJPzU«‘κ*4₯ιƒ°^ՌADλYΕZWU――›€Α dΙB°Π–7όΑ 4`‘*H@ ʘΓόΰμάA θ(pN�Š+$QŠ‚gwθYe`²@p€RΠƒγω@€νTƒ‚œ`#;Š‚DΰΡAB‚Ž ΅(H@fˆ€œΐ˜Α ΐ³6ΈPΒ"° >€§ πZ+"€*˜9…‘ΎVukVKΙΥ›Ξ5­S½λ~‘ΉΧ¦Φ―k πU³šΧώ$υW­›€«]αˆΧ­­Ÿ€)_ΦV“ΥΑr₯Y‡`αzRxΐ>c‰}πΣsu¨E½*zΤwI’‚Ψ€HΔ¨b2L€ε!Zαδ φΠΔME#4yœb;X«‰m"^™ΜV±61Θ;ΌaƒΟZE- 1ΛG}ςΓάΰ O΅Λ_υΑ”Γ\ε«ξ˜Νpμ` KKΪς―ΰYFΠ<& ŠA8κs‚ˆQ΅ hbπٯΐ%€΄€KiJŸΰΝβmΐFπ€<ίVέ-β@>l3Β-τͺG‚τ3΅·mο&°M( z΄ζαFέ„ € ¦{έ*ώ2€±r½γπσ*H¦w`žωΥΊγj¬­MCšU †σ—‘ΜD%“™Νmm₯Ή£¬ζOR9ΐDΖ2’λΙe ω«^.·V™δtŸΩΒ;lχ•Ω oNΚΫΛτ.0œo1/ωάξNr!žœζ5™ή(¬ΉΉΘFžΛoήq= Τ Fς Πγ_/ωγ ό΅zeLσ~ΝͺD˜ΏuΚfEx\λp!ΎΌηY­pΝ;Ω_~Ά�1_’”ννd+]ι‘Δy€tή_vϋόΚ@zΠߜα꽬@Hz‘χνƒΰΐ°8ΈΑΩΧΞvh™«@«³©RW/‡JΔlΜQ \πώ=6 ΐΒ'οπΙcΐή~ΌTύο¨Q0CR+Ρ!8kέ]PΤΥοΐ΄ΨήΏήϊ͚‚³anκ,—(p@ `ΆζšNoύΙ\Gΐœκ Aέ£„Q§€λΖ7bžzPόpŒOΏΉ»sždš½η;Ξϊ½£Ξυ3z½ιaοα_͘ο1«9πZΏ2υΛm}­�άΐc5rχ?„―gXμK'·ω£τιO½ϊ<§~*ΖU?΄D°cU$tKDt}υWZφr>°@ „.΄W"Aƒ38ΠH·I\e?v/&πy0—E?v"χ}όsj†Fet‚›ΤUώGΩ‡u/Θ‚wV=Pƒe€f=‡‚ΧnΩηƒf•‚Ÿ—€ƒαƒ^7ƒύUƒΩwƒΨ—s;Ψn=ˆƒ@8pBˆWw~'f—vƒ₯vkW†70_θ€eD π0`y>P‰f{–χΚ΅DΐφfOΧCJ'XM4¨f˜5 °Cέ¦f˜·c¨V^Β₯D­φ’ΧDuw|qejM$R#Ήφ< ΪSM \ nXhf”z_”^PF"EuGj6mη)|w|;Δ30$PF¨EοdZoˆKθ‚eδe2x„QH„>xƒGe…<ΈDZu!§~Cψ…ώΦ¨tΪ&r\₯„R¦ŒNXPψ~S(/7uW(ˆ>θΨΘc"η…Xg„q•‚αΘCΙ)/ȌηˆuiυC|FqεŽΧ8F}υŒgυfε2~cYˆ„$§”D„=¨f=8˜΄/χvJ4ˆˆF"’"y‚ X’)hƒ0—t7Ψ€%©mΛ¨ξΘUKŽ θ’ιΈ†€₯mύυ‚?‡‚+9”φψ‚&ΩƒˆiS˜”Xx“燓Z¦“Ρ˜e6 4g‡•k;ƒuv4p~;Φ†jF‹θjXhΏUhΡυzθ|π΄€Λ(“η'eNΉDΥδ„€˜ 0²8!`Y―ώQ€&Rm‰Pύ—>τZ`\% 0Oΐ•‘yLQDΰ?€jΐ—u ¨i?Πz­v™Vw ΑΥιR�&–³η‹›‹&ŒΎ$wਏ')”*ω›=h’Gy“Ϊx3™‚5ω”Iˆ—!Ή“ΪΨei’A™’!œ(ˆ@Ι”ΖΙ—ΥψyN™ο˜‘κΈ›Ω’½IBΘ’ΒιŽjΆE#p€αΗ”Ιy‚I‰žaηΗ7ΰω‘@€c‘δ1@…tι0ΐ‘ω’00cκχ’S¨;†jΆ. ϊή)žYˆθI‚Λ8 –ΰX„jžŠ„Θyƒ2‰‘Eώ¨‘6Ι‘έx”**“) ”Yˆ„vy’4Z„30;@€g7)8j<£‡qH_ωΔ;ΠσT °™�Œ‘₯lοˆ„'š’{‰e€&‹“Ι™˜w‚¨?€κ€P–œI›Η—};0™ Eš;¦ΰLeT‹e€£wYΠƒ€Y¦w:yz;„§πΤΠζ€\rw<;ΰl΅9YeΔΞ§’TΨ’Cη”% ”Ρž’ŠK)’έH’ †Tˆ’ͺ’Si‘’ψ©$8‘’Š£Z£§šŽFˆŸ&ΪͺGωͺœΚ’Ωη’Κͺ2:•>ΈEπy€–υΈͺͺHhYW$‹ώ>΄Π$°׊ >TF<Πp%ΠΧjYotƒW$pb"=€­ΰϊ‚κͺ�t)‹ΛJ―)i­χj­υ �κ:i―ϊ*‘ακCߊ―Λ―ιΈjτŠ―Θω―χΪ°μš‘νٍ ±·J±όбμ:20²$[²%;;šφz[›�ΧʊWT±²Θ°αχͺ¬ώŠ­W4—:K³ »D1[³›‘1‹―EΛ°LZ―+§ΦX΄oδ΄G‹’ ‹Gm³*λ‰λΚ�½j°›± +³›°«±7‹°ϋ³+±6»―?;±3 Άi ²±Κκ΅A‹Ά «Ά+±₯š³;΄KώΞ @j΄a °_{΄VΛΈ‹ΛΈA»°λΈŒΛ€w;Ήώš�Ή-ϋΆ1λI ΅’΅KΊPλΉWΔ,벐»Έα:ΉΫ²E Ί™[»Ά«ΉΆ»;»“ .ΰ0_.°00.0Ζ;Ί―λ΄ KYΪΊ˜{ΊΉ«Έ1«Nϊ[Π½¦›½‘ »›«»άλΊ·ϋ΅uRE[ πgέ»jΫKΉ§»Ή΄+Ύ£+½ΰΛΉ›«Ί9‹Ήβ»Ή¬«ΉπΊλΫΏœ;½ο[Ή«{»ΌΌ”+»ό ΐW΄2!0ΈΟΪΌσ«½|ΑœΑΌΑάΑόΑ Β"<Β Ή–ϋΑ4CΒώ̚nΘΏ*όΒ0|΄'G‹# 1œΓ:ΌΓ<άΓ>ŒΉyΑŸ'όΓF|ΔHœΔJΌΔLάΔNόΔPΕR<ΕTμ;B<ΔD@ΕZ¬ΏGμΒ[όΕ`Ζb<Ζd\ΖfœΓ{&Α0πYΌΑ(Ηr<Ηt\Ηv|ΗxœΗs|z|ΗnΩΗqόΗ€<Θy,ΘxlΘ(ΐΗ„<Lj\ȌLNJΌΘ’\LjΙ“lΗ–μΗuœΙ—άɞόɜœΘŸ<Κ’¬Η‘μΙ•LΚ’œΚͺLΘ¬άΚ€όΚ°άɍΌΗw ` '08Ό’,ΑΐΜΒ<ΜΔ\ΜΖ|ΜȜΜΚΌΜΜάΜΞόΜΠΝ�<ΝώΤ\ΝΦ|Ν؜ΝΪΌΝάάΝήόΝΰ!D€ BΞκΌΞμάΞξόΞπΟς<Οτ\Οφ|ΟψΜ#Π@G”Ο=Π]Π}НР½Π ­ΜϋόΟ$π©ΠlZ }ѝѽΡέΡνΡ πΟη<Ξ:ΠΜ)-Αύ,�κΜ'­Ξ ΣΥ ΐ3}Ν9ύΡ<έΣ>ύΣ@ΤΑ¬%ΰΖ πΜ+ν¬νDD­ΝpΤD ΡκL$ Σ§πžΦlΥBέΥ^ύΥ`ΦρΌC.�ƒ;YΞ; Ν$@ΐ,ΥT Ξ\ΝR­ΥΥ\Χb½Χ|έώΧ~ύΧۜΤ$&CpΦΗ†MΜoΧS ˆ̏=Μ‰}ΜzνΨ“mΜ†-ΧΒΩΜ\ΩΕΜΩ€Ϊ’=Ϊ€νΣIνCPΈ—Ν�C {ˆΞZB@Σ`�°)@   πΟr­ΦD"*€BΥ ΐτΪȜZ§pՎ]άDpάΞMBπΟ>ΠΫC°άΑ ̍Υ�Mέƒ›D’0Χ’υάΕLΨ�]Ξ±=Ϋƒλ&]Ϊτ]ίφ}ίοœΤρ‰«=Έύœ 7L  Χ«†Λ§p ΰΨΣ=#pD°�?Πέ `€ΐΰ!ρΰnΜριŽWΧN^^ώDΠR=Rα>ΰΞzΧΐβ#�ΞJΞ;PMαέαέΓόίCΠΕ=ΰξγ–…ίHžδJΎδΜΤΐBΕ4ύγ†pαRmΞPά�<γ%Χ‘-ΥD° ώž ήR ΫbNζ2^Μύ �\ΝhώέΏΥΟD₯ώΌζe>Έmξ¬gNΥiξΨCΰ1ή$η>.Μ�mεξεώ \ξδL>ι”^ιχ-ιv>NΜ\>ΧΌμη\½Λ.­ΦŒνγDπžδΌι nκx-ΜήΐΥ©>Έ?„ΰ uB°P­>Έ§.Α²Žΰͺ~λgγš]ΰsνΩΐάιƒϋιpζώW-κ–>νΤ^ν}ιDŸ‰ΜύΌΰ ~Άn�w.Α‹Υ²ώλδLΣ*Ξšν¬Κ.Α…‹ά΄N4}λ…k]χ�ζηŽΧν~γτnλιόΊν¬ύ,Ρρ^θΫΜέ^θΰξ¬;`�CPΦ>ρ_ρ<Τ�άΟύ,ρΔΌπ ΦήώδΣύοiύθ|~ξW]Έ+C οΙώκΑόηΊ\­ς1ώιvώbώžύ^ΩΏ>Έ6/θ]Έή^άο‰μ3�σ1~ΦOΞ!/ηQ>ε?υT_υ½ςCpoβ6ήρwΎOY<γL ΜΪΎX ήσZM²UάlΎοŸ=έ έЍΪk?π³ώοCΞώΰ/ς�FζΥέΪP4πύμ4�λ-χ…θ>`χώυoέΦμΖmυ”_ω–Ÿί+ύLˆ]ου§€† )ΜŽ-ΥIύσ`€ˆ`μ]ξξ0Μϋ\έ« 0?Ξ*M⠞ϊ―~ ¬Nπ¬?ΉOΞ8BΫ πΣ]δε ΰί ϊΐLΞP}ωΪΏύά?Ν’Nπ&Ώή~ΩGΎΩΠίQ-υΞκγνoΝμΩν�ζΟ�γ?ΜείύϊΏ�όΏΝ/Α€0 B΄pˆ˜¨ΈΘΨθψ)9Iω(@δ°(ˆRXιω *:JZjzŠšͺΊΚΪκϊ ;zυΩ°8DD!»ΛλI»(D4€Ϋ[l|Œœ¬ΌΜάμόΜ M-+0]­½Νένύ ΎΪΠ°0n^ž�ΎΞήξώ_|N/oŸ―ΏΟί_JΟΐ <ˆΠU Μ5d0’Δ‰+Z\7�αB;zό2€HO͍<‰2₯Κ•ϊžγΘ2¦Μ™4kΞ+‰Ξ¦Ξ<{ϊL΄Ρ₯˟D‹=z'D€L›:} OhΖqP«Z½ŠuΜY»zύ ΤC‘ Ú=‹ΦμΦ΄lΫΊEκp*Χ·tλΪM©ΰέ½|ϋV\λ7°ΰΑ-5žK8±βΕάβ:d 9²δc!ω!� ImageMagickgamma=0.454545,*Πƒ)))777EEEVVVfffwwwŠŠŠ™™™¨¨¨···ΙΙΙΧΧΧκκκσσσώΘI«½8λΝ»�`(Ždižhͺ�lλΎp,ΟtxžΫ|ο�ΐ pH,Θ$MΗT:ŸΠ¨tJ­Z―Ψ SW 6ƒΐΔ›-›Οθ΄,0‘?οJζΜΗίSΑηS‚^u'ˆn‹ ;"  šj§¨©ͺ©₯•—™v–±–˜£ b mc·΅―Έ ½»Μ bΗΕΦΉΨΓ°Ω₯˜%—˜γ  yΊΌΚμ8#– _ Κ ΰ  V)\Θ°‘‘ ;θγηΰ†‰κςLμgq“ƒώ€κ‰’°ΡŸ`ϋ8°τIB½Ž0ˆiŸΙ•5TάPRγG›0+$@0`€%a"(zΤ%ƒ»"VπQƒŽ ΰ !ΰAœ <( Ά@‚e :\ΛΆ­[­8tύj †Ή'½ϊ� Φ© Œ€w₯ƒqψZ2Ψo¨KA)(«Pxρ^Ί|ΗP¨|@bΜ_;y’Τ( $τ+5Ε«Y·‚­)ΤeΕξ*P!ξΫίΐƒ�Vˁ6Ϋ­-G`t›Pλ*Ξ%†ιζ#™/Η”π–¬73ΘμύRΒν·)τCŠώ|ωθΨ• €έ³ΦυBΜ”τλτώƒΙLΗα@VZρB9΄0+΅sIh'ά…f¨†…`Υ > ƒBH"ˆŽΡމεB"@–π⃦“A „wQr'�(γ†HA= ώdŒ3ΖψΗ.ρ’R$ R, @9σΓί Τ΄(9μ²O‘`ΥLE]6ˆ@ύπ%ώi(ηœt>α[‡"ξ"€™˜©§‡~VδαzZ`].€ϊ“hzv g1Κj(@ ‘y d {IX6Žώ™η¦šφΒ(-< ”$¬:$, t§E]z[‚"” HΡL&ΐΌΓaΔkl wf «=†ώαΉk³ΛςgbYJ`]‘ΛŽγh΄τΊ@X5ΰ‰Ž,ΐγXΜn‹�΄#’«­)X= ᩇέgH'ά[4”�€gΜR@@= € &ΚφΑhDΔΞ 3NU€$wμΕgL°ߘ—ŽΕiqχ1v ,Α_t\Η0ίΓίώj€`‘qy))ΠrΞg°ςΘ.γ¦sB¨Γ«Ην€G0ϋ¦–4Ύ‚,_Žh]υ‘ΒόΪΖg!εχIΑΖ©ρΨd—­œΨh 0…ΖP 6Χoσ5‡ϊzΙΦzΕmΠ·@σ“Ή}χΪ?€7ΫΟθ]ψαγHί98­/ώsϋΜμ­X{ Sœ0H‡’ Ηf§�z±¨_ΠθSRc6―‡.ΜηΆkιtμ!N£Ό θŽ•;ίό­ΑxΰΎήΙΖΗ>ΑμκEO|ν�7ώΈφήh9XŽ{#Mώ~AΠξC"@ΐΊˆpld~P,-u²‰:σ΅Ύϊώό§Ώ9ΒDK&@€?Π ΐ[R( ΠQ ύT4Α•P(5K†Εζ'@ vπUd’ΰ%Š$Bή@hg‚ΪκΑ6eŒ€°`ΐ(X[\Βi°S @fτP<μŸ‡œ Κο‡rˆογ $`}ψq⧘ζY`‰W”bT "W&b±l0Δ 7Ζ@1HγΒ?"ΊρpΜ0¦Β+œ*ƒ6˜‡:μΡΉ8ϊρ€dΛp?dέΒ#"‘€Iς‘Œ€$±°…D!ω!� ImageMagickgamma=0.454545,,šƒ(((777FFFWWWeeewww‰‰‰ššš¦¦¦ΈΈΈΙΙΙΨΨΨιιισσσώΘI«΅%‹Λ»�`(Ždižhͺ�lλΎp,ΟtmίΈ5S°I‚‡P‘+Θ€ryσΉ?J`GBԏӲU`°4:&uΛ£s¬°%Σ– k,WΙ€Α8H yAB LŠ‹ŒŽ+ " •–“ B B~ <vxR B‚ �y ¨ƒ ož||<­―=ΑΓZΕ°Θ ΐ³ΔΝ²� ›) šBΧ—–†w‚΅·ΉŸœ „ ‰’†›ςψωϊϋό2θ" tP@  8πγΐƒZύυaΐC …°ΐΑώ²&zω`C+p4ι’@±B«!E=άSςCG˜59>$ΉrΒMž’FΚπAA1›σΔˆZmΌ p`At}^”πiƒΤpP ΐƒΩnSzθ‘~pγʝۏ^‰ άΨ²P폺–ψLψVPy―YDόΰš¬~υΘΖΧΛδΦƒ‚f™/oφ°xtiΠΤV¨†ͺ―Au^Ύΐ+0μV_Χδa1Ω²neS°›ΚέγΘ“+·ρ―„^ή[+8Dλ”(R4` ΆpgΒ—^τ`’C’δIγ‘@HO °ΟγDή<}!J ?ΏxέςIώqΝyώ— 80Yj•ΜηΨ^+H4ΒspΠ›V°ηήΰ ΒG0oQPN=C,gβ‰(¦Ψq"T3ΩAΤ�Kε)€˜Σ;:ΐ†@†π,ΠΚ @6 d!w<4–J6HdAvτd”qޏP)%–TV !Άpid‚SjY%ŸLC5°`,Β„—‘„ΰbϊ€ΙKζ”]x @‚`,Έ‰’©¨θ’ŒΖ՜€ΤιP%ΌΤ ~ Žrw«ωΙ!lνΰ‰‘²V ©θ'# ?ΎΗ‘“}Ϊ^₯–4«!…*kͺΊΪš!„8@¦:€ͺ¨Ό{+Sώ‰ΪQ’TSž‘'8t‘Zžš­Ϊ˜ŸyVρ‰EA’Χ6ͺξΊμ"ρθ2Q–uaBHσŠTžjΥYΕ•g]κΩ†Ί@„π–«ρU@°ΐ©>μG¨<|ΝΐOœκ— +Δ²'"P JDβ[ž«„•�c9)AΈϊ!ό€mQ\ΨΓW‘))[Ζ΅+τΠDΓΐβ~š‘˜…]Xάά! ·΅εGΝqΪ`Φ%ς πEc\ρΈΆ Bάγˆdξώϋ™νΉ|5φεEK @5‘PτΈ‚Ms@εf6>”―6g‘Ιd¦¦ΐ―ΙΛST‘΄ΐRA°Ρu§Α4ΠDn&ΘAJ°P€ώh<ά―Nc‘œv€~„š˜ŠΧπTΐμ^Ω„Ϋτ“›=Do@+ό–ΘΔuΙ―Ό@0¦gtΈ-ΒALf¬ Dc؁“0PΦ4M|e?œψšΔmˆmG� γ:δ$€h@ngq’#98ΒQTC[xώ‡ndK+#΄°'ΔmP MˆbΎ8Δ4JΐvΪz ΄&zς“&Ϊ€ š)θ 9œ'ΚɌYzP½TRΝςΐ&YyΛΤPΛ”Υ3εΜβ/Δac!ΘΛ@ΙΜf:s.νιΕœΧDZuρ™ΨΜ¦6·Yƒ/ ΰ` &χΛGD!ω!� ImageMagickgamma=0.454545,,ƒ(((777FFFVVVdddxxxŠŠŠ———¦¦¦···ΙΙΙΨΨΨιιισσσώΘI«½7RzηΕ€dižhͺ�lλΎp,Οtmίx�ο|I@”™Θ€αk:ŸΠ¨tΚφΠΘZΊ2qSΐ_/ ]aŸάB5U‡₯,x|0`0 FJJ ‰‰ s‘’“’†+ D% Iš˜DwA  r €w„B H� H � €˜§ ~~A΅·³Ζ²\°ΚΘΆΈΜ±Ο·{&¬�yy.wy Χ# αβΡ^x ξ "  Ž… ˆŒ‹ύH˜PH° Αƒ&μKAΙ' ‚€@NΓ’’ΰ ^…ώH8d[ΐςbλ'°6θψ«ΒΐBΎd²G(UώlΉ³DΠ•ˆΒzhΑ@ΗA$P@U™‹vο˜Vΐšέ:t "―Νƒ=μ’ Pΐ"œK·�έ&mΧ¨3‰‘―3κ2.pρTΉm @•p$Ÿ-&“>`bk0A?Gά©ωδd·‘ϊsiΉ@  �ρη3[/Άp΅ –QΰΆ@’Ι=»Οœ π ΑΩ yAΏˆ$ίέηΠ£KOΈπ„qzZ)€y!=WΠ‚@“£Ÿγ#1^Ύ€$!ΜϋΒψW3*NΆPα·ΟΟ~›ϊτ"θώηήzΡ\  ¨ž~,[C|5ΈV ςόUBp7 ލƒ)~@£€˜πΓ\ύ87݊,ΆˆP‰'β�#4T€. p·ήŒ’ttq¨qψΝFOχ,L/ )Ο’w„dfάTΑ‘IΪΒ€=O>@AGγ`ωδ!τp©δ!gΠγe™Y’Ωd›_’GέΡΘ‚‡XxA3¦η…qƒ‰‘V4Ε ŒρIrGτƒ"#ΆΉ(ι€”>‘ χΰ$H„(†-Ρ�€¦‹-€£ eNjN`\Ζ πκ¬υ,RΛ©“Qy•6+­όκ₯&Ρ*«―^ΖΊˆτώ4g°ΙΦκ₯­©°,±΄ZŒ0pΐ Ž h'kΡ€Ζ=pŸ«!MR4Α¨šΚ9Κ\q•ζ«οΎ6Μ{Β"@θ9bͺ$΅ΐΠπI]EσΗOΫ₯&'=ά.‰q»Z.±ŠΥ7λ‚rΗkž,’–#lΌrΚά.ΐΌ‰ςβ²gL’:ί°›Μ&A¦5§£ Bf‹8e‘ζOƒΑ0ΡξHΥg/s‘ςkυΥXσV Ν$’έyΉΩ΅˜ϊ�‚xqXΆ³‘T £ξ§�xœ€ΐΩ!΅΅άχΥνφBuΰvίϋ Nχ>/1°(„σ}ψ ρ5 GyBεώ_ΌΆαkσ‚H:2ΊΥY—n:Φ—–„!y†0 ‘Α β92Jήεa νyκ΅Ζ»Ύ{|�.y΅χ»_α‹όy¨Ήξ�Cη9²ΌοΛD,_ΫοяfΑξ¬MΫΧ#θ DšB{b8₯ή€ΰΆ©>&&ςh#§η―�€©›ΠΠC(Φdτ΄ hΛTY`Ή9 l2ίY|BX„ΐA<˜�€Q2 ^π?€ H:&΄¬χΛ€°‚ƒ‘LE#ΉyFΈΐ>χ}‚„θ‘@ @ŠΉΟS’q ? £‰bKuu’{UmXΜ"ΙBϊWAPN’AB σαi€5ΫάD•™ά£IQQρF@²/¨c‡?»£LθΖ7*Íκpΐ)P€… €ŒΕ Α4ΒD¬‹θ„Š0°ΐ$8`‘“•1Ž�-€˜/ 2ΠpŠ3VΤ’*WiœrV MΑ^0‘ΈRO�”Αf Δ©Pf@+·΄@( †`rf–m _ ˆ34ΈR+±ΤN-Ο0L'€eˆΨTΖ―ΘΚnzσ›YΔ0@LU@(e"!ω!� ImageMagickgamma=0.454545,,ƒ(((777FFFVVVeeewwwŠŠŠ˜˜˜₯₯₯ΈΈΈΙΙΙΨΨΨιιισσσώΘI«½8—]οC&Ždižhͺ�lλΎp,Οtmίx�οξLAε'!ŒG‰ΰΑl:Ό¨tJ­Z―™`.0ΞΈHŒΦ2vˆšRf{Mmΰ»/Ξ[`X]TηΞ€  @NN ‘M ”OX™š›œšŽ&‚# M ! Fͺa D�Œ@ LΉG»½�° w  Λ ?ΐΒEΠ¨#ΟΌΎΦΑΎYΠΨΣ%· ێΌP-–Lζ|ί₯L Τ ςς Ž ƒJ.=@G‰ΰ₯~ž*\Θ°a†&ζΡ{$"Aœ@€ «]ώ&8xpgΐD4Ω–μR^vΉ„ΩκAH #U0„μδK’ΓN`ΰ@'…–?cϊ€))S§@EΉθθ?·‘Pyu—Ρ P½XΔXΟ‚ œ `3Α+—\2θ˜@uσκέΛΔKπŽ˜dd“\»$brgΩ T ˆ0”%•@)₯€’¨xRΐτςƒΜ‚‘nεΐ4j«wΉ.=€d•Z'(’¦‚Φβά£OΣ�` I€eΨ`;‰·„ΏG�­$ ΒΎΨ³kߎ:δpQ°€ς#“θζHΖ #oܞί₯¬ϊ™AΝθP`ߟ°Οƒΐώ ₯°2# ΘDC@‘ΰ�· ˜„IΐΥτΥ*!πL-RIψƒEˆG-¬,Œ©Δ%έ‹Υ Ζ݌4Φθ‰*)Lba $³Šn>M–ΜIl5Ϊ>,V€a#ψν³ΐ. Πδ=Ιΐ€‘¨eδ†­ε”O>"erTR„ΣΌιd•j–Ω F΄ωδ_’&#9'{H)# ₯Τ£g*`V)AY¨ˆ:q&@B'WA0 t˜fͺ)ή‘ J$„)ά Ψ§b ”Ί(h“Σ‘/– @Q±ΦJR¬ €Κΐͺ\Š6Aq΄P\­E6Ϋ+,~“ώΘz+~EHΩZ~²�Jg¬­w,p―Z �₯+ SΤ`tf ­¬DJͺ—„Ό“Μ’VΙt’ljο½ψΎ Κ€€%!‘wΖIΛε*ε2’ya¨t+”Ÿ²φeΔU.ΐΑ $<‚―£y’Δl(!#Β¦Η&Σg02I±˜(;[‚Γ|«οiS˜AΙ2³πs“h?Ό[sΙKɟω6ντӝ†˜!ΒΉI! ˜d“ΖVnTΝ*ψC©σ(xΉj}€"½z]vβ…έ &vΜάdΛέΞ Ι@€�‘2c»Α’9$t&Σ@.8£^™J-ώ6Ρ κTΗ^’Έ�‘€ϋτθ€ou–_\&™CΔ©ΓτCŒΖλaΐ§Z‡@ZξνΚ.ϋ+loμ%ο»{ΐjE Α»Iύ,―nœεBΌpΞƒ+K{AO.Ǝ‡k6Aγl(o<σ΄~vgΗ:€d΅?ηb�πίUϊότΫx:χ`P 6 ΐEϊ𐀄©…€:Π4 ε)r`ZA@�e€?(EΑ Nπ1ΩΣ θAVΐœ!α­„&|πlΩσ€ŸΘ–Cΰ†BΪ ('L‚aFΪ†]hΒωο%€Π׎ώ ₯5pDόζUοΥοŠXδΛΒύ. 8Υ‰7H{Η :ς‘K%,°ZΰŽΓ‹›ŠΤ°,ˆŽ•Ž@0R0άCη† `Τ£ψHθ9Cnόγ)*' θ± φ ce$Ρ] #M`"έΠΔARC-M€‡ό›©‘`RΙ’*W©dΕ \ χP Λ K·|·…Ka–Ή¬@0ΑAJaΣ ―, by .\`˜GΐE6‘–zXσšc₯6·ΙM†μ‚sλ&fΕ%D!ω!� ImageMagickgamma=0.454545,,˜ƒ(((777FFFWWWdddvvv‰‰‰ššš₯₯₯···ΚΚΚΨΨΨιιισσσώΘI«½8λMC!Epdižhͺ�lλΎp,Οtmίx�οΫ0JAεN~D@2 <žOoJ­Z―Ψ[πS]ζek!· ˆtΊσΆIζVόψζ́±μ~,~€ RGP’ “P –O•™›P‰Y ‘’£€6&ƒ~ͺ P­ D u ?© O²@ΐΒ΄DΈ ‡‡#ΔΒJ��ΡΑ�ΎvΥG°ΕΦcέ˜O-ΫΓΩ ν οO�ςŒ y  Ve’4°Σ$ƒ’(Ε°‘Γ‡ –¨GΟΑ< (ΰ`ώŸ,ΦπΰŠ€ λ‹J–ϋ>>SΓ^Ά” ΣA� :k’δΤeIC53utΨOCy–„9`ƒ‚« v5[`ΐή=�^<( Άΐ±%8αT°-[IŸ ʝK·ξ ‰$πuu₯Χ« L#€-°(©„C_χ τ'ӟΖΐόΓ©θΙΣ 7=€ΌIΞŒ,–ΚΈo8 ₯†N-3t ŸUKΐ$A± Σ£[£Ϊ<‚€_%|7*+“5›Έ΅„JsM“βڝN½:uδ%z�Φ~:C€vRcnzcΈπ μ˜>PaœΔFŒ_–½ϊ'8ΫW~P¬ͺLΉώχDZάyš~οtόg_Uλ1Ό¬P`€ϋQ–?œWo †&$#Π[Μ-7 1žXηβ‹0–b’ $…Sc 0γ€Μ”ΐ;I}§€ O?.Œ‘ Ω€’|Τ€όvAfω’θ“Η“ΜP`QˆL"ι”°5†>Qjyζ’nrIΑ”dj ¦GΨCζ EΖΉ$Fάo P˜† 'Υ'Š©˜Π${Ζhι₯˜Φ€W ©& 9ZΩ- ,β%9>yͺJ%ΊμC`˜Ψ»”ϊΐ©( α,QΖΚ*«ΎFΉŠ+ΐΊ*l‘„Z ςώυκΣ―½ξΓκ°ΐ*ν±ε€ΪB‘―>{¬¦RPδγzfΡ“I’–€Ξ± \™Ζ+οΌ)ΜXΊA•H±€ϊ�Υ$Ή–―*˜,rΞ’ —τ$΄Œˆ•9υΗ€Β°ͺΖb°±ΓΣJ€―˜8ΐμŸ£ρX‡™AΚ2I O])Γ·,/œœwΝT@R₯ƒVŠΙ?šΤθ‰)B:©��ΡλτΣτnJBΉžι»og΄’4Σΐ<ν*�_ι=@Yωα'x ( ΅\ΫδuΨ^z=ΛmqpŸέ_‘01ΐhήv+(φΩ^γ]ΜΨ‰5]¬B‘€ƒ·AzŒΞΈώΰ€ ­�rJ·ϊ»-Bmϊι˜JΝΥT‡AΑIV Χεωμ—ΦUΕ†»r’Ι@Ϋθj{ ΌWmOlt€I<ςΘVZΐ” 4’u Ί_ΔIL_΅?°+ρΐβjUΎA‘Ϊ3―– μΖ­Ί>νk~>‹Ίι£Iη)Σ¨χοuŸίϋΪ§ˆΊbJͺ€Πύ‹K�@03ΒB#ςΟXRZAb@)ά9x˜ f°„|1!ρ‚cΐ ‹aeΈB6H…Uω € £ύθSΤόqAœPn„:Σ %A™o@'ψ™’ώ‘œ΅X’WΘχ ύο‹`…κ2ΰD³i‰bς ώψ"N``»ψI§„)ιιvœ OC¦€pί Ζ'ω„JYΔ„Τc ΡhBΓ‰ƒt’!XΗ.N€#PŸD•—IP&¬ΐ!E9$€—iBwl`Ε(„ρ•°…V T� ίuɁYŠΑ–z8–PΓ@bŠ‘ ˜% pfS—Ύ3s!£±€™cΰ₯Ό~Τ‘;Ζς›ΰ η\˜αŒΈ‰sqE!ω!� ImageMagickgamma=0.454545,,ƒ(((777FFFWWWdddwwwŠŠŠššš€€€···ΚΚΚΨΨΨκκκσσσώΘI«½8λ]Cωpdižhͺ�lλΎp,Οtmίx�“Γ(‹―σ#N|Γaρ<¨aG­Z―Ψl ψ ‚&θqΈΒ1«€@ΪtG}¦―δq»―΅  SNQQ ‘‘“”Q —’𖐆}‘’£€₯-Œa Š « P ` CvŒ>ͺ¬?�Oΐ Q¬·Ή΅ „„#ΕΗΔΖΓgΒΘΎ°ΨΤGΩΐΣΧ ³ηη,άβMΏQ   ŽP.y’4°§‚ ‚2Ε°‘Γ‡Wό•8P\‚ 8h΄ΗAƒώ%3 H8IάH�ΐ;€‘LnXΐΐΒL˜潌Ήσš`(Fi‡a¨Ν›FΞΛΰtž‚«WCͺPš¨_Λ –(Y ΐƒ pυϋ'α‘ΐƒp5!άi!Δ»xσκΘ–ƒΊ^Θ€gΛy,§[ ΡΣV=%ό L€~P@‰Ω˜fW‘žΐ³g‘4;ιό3€¬5˜,XJٞ›΄F-ϋuΫέ™-8鍂Ά8γ2έ dΆl§³$ώ–χ-υλŸφjίΞ―τ3›kΗQ§!ΣD  Ϊ΄€†2“x wuόοπ‘(=­aΏ³οʁ8ώΦKŠH+Sxίl€SŽh¦ φΨJPς…’©₯ΒπΕ@<β r"¬bMzόαHuΑhvQΔΧݍ8ζx…‹&X x4,‘ cAURXc”Δ".ς@ϊ,$ΌTy%a°δcME&e> Xω–ψhΙ‘P؈&•e^9B0�Θ=pςtgšq� @›cͺ™€. MtŽΥ@OρΜ 0ΰ@C~ηVŒ4Ξhέ¦Rθθι§ Βπ !R$�a0ΐ3$°Q~·0€Θ=c0bG’“ΰŒ™Π+aΉ.λ¬`^ €˜˜μ”Κώβ3Ιˆ“λ�½Ξ ]χL:Β―ψp €«<λˆEg.;„‰/$j-0“œx"…AΦΊ¦e™&$£Ύ™ΪκΏL*&D)D&ώ"κΚGeή”ΐ=‹"J*Y€’›χ ›kΖ)ιzζ?@H`£Ipl‹guΌqΚ*9£Η-Ÿ9ΑMd‹@.,ί΄§Ζ~ϊ‘²f.�°( κJ¨0”Μσ—*1mX_—jŠ)§RW°ΐXg}γ¨ύbͺ˜₯™°(Er‡$Κ’Θ#¨³6mη—@Ωœ­*Ρ=7=υαg‡y?ΣΆ‰•ϊΝ7o�­Aγ‹�a 4―+Šώ‹8`Ω TΜ8Τϋ�E5ΏT_­υι¨CΔυ₯ZœZJδ­Θ7αrΆ{$І«…Gθi €§JvS…¬οœVΆ"§‘DΩΙg΄x‡Έ²ΐ<ΠλΖOφΝ�πΌ<αΉΖ%^œΰυΕΉ ζΔΘ­u@SΗ_5ις›žϊύψ‡²zΪl€ΒX Α 5°ˆΓ_0ΐ3Dς$ΜIΉλώ7›³ PiDΓ(PΌ0Yΐ†*BI ΙΗΙ  A ž',Œ!α%£ΒŠ„Π ›bΨ@u­…¬`α»\8½EF„Δ±'2‘ &Ž2rSώ¦HΕ,μοHσ[­I^!Ez\‹†QX€„E‰Ω ‹”ˆŒ>ŽŠ5BΑ΄;O±|rJ“Τ*ή»έDΑ€ά!ށ2^ (Η< ΐQ Jx@„rl0ΔWΞSΎ%(βˆ2tψB‡Νxΰ˜€œtg"‰4Φ¨U!ω!� ImageMagickgamma=0.454545, ,šƒ(((777FFFWWWdddvvv‰‰‰ššš€€€···ΚΚΚΨΨΨιιισσσώΘI«½8λΝ»�`(Ždižhͺ�lλΎp,Οτ$ δLpν 0H,ςŽFΐΠ(D:kΠ¨tJ­Zz Ϋ2θ£tμ΅k* ΞgŠΈ²ξ΄Ko.(.ΉΑΎdw€p<ώ  †6”” ••—˜ ›œžžš›’›V©ͺ«¬­’}~¨J  ½ ΐ C {|@ƒ…j·Ή»·Έ ΚΖΘ ‰‰;�Ί<ΟγαΠ‚„» βΡεμξΈζŒ ”8$Μμοπa¦έ[p`w"ύΩΥ`‚4H@α@ La�X‰#%ώŸ< ꀫ“(Sͺ4aΡAƒ%p;@ ίΎ (Ψ™ ΐ­EJόμπΐ$…Ž(ά’™―ΛΟƒ}> @θ†a–tΰΤΝw71hmϊja‡§οœ­UΪΆp@[‡”Ψ%(  @Ο oΓ2š*‘I•<(`jba±²HΛ₯0oUk₯ηΟ SFΡheT:o8-uφ0Έ(ΑČ%₯(5Πn™΄Zn‹“φ$ή·QF\ …ί½kίN¬A€ζΚ`gσΌyςڐO4Dˆ’yG΅ ^8ψεΛQtψΗEΣμ`!` Tΐ <’!-BΘ€7qΘb.΄ν›}Ȋ1ΎΘβˆΜΈaRAeΤ :R§F0I$-ωΪb$ςŒ3Ιe`(ζfa’‰‰¨ζšl†ΰ%‘ςPD έβA4Κδ‡δBœD\V6υΉ7|<€D‡JΒMQς‘₯VT*j(’-Zηψa_¦—Jΐ =Κ¨4šθ’©":§„²ͺj#<Ζ€•#j7yj€ͺͺχig�§&πΞa!HY™ϋώ1۟³�™‰IšmVkν΅ή%¬—p‰tΠH- ΓΐΈΔα‰Œ�έͺn'X#ΐyε6p.-Δ‰•"αΊ«h·€Λ© zύΛΌ‡89™,˜Θ©ΊηυΛU·SπΑœ"ζ K™ «LΌς†ΣΓO€˜Θ| QΉ(xŸqΦAK’Μ#Υμ_sΧζ¬s›Ωnpr₯˜δj;φ*₯ΐCγ΅₯δ;΄0’<τ΄ $€΄"ξM a’O‡+uQΒ ŒΑΧ&Y“2u>ζ�0‘ˆ•υb`}Ωa 1³y¬p—P57άe [ hXm^U΅δhωΡ|³ΝŽΈσδ”ψ&ώƒ«ψΗΎPFιdΥDM…Xy_`8$›Kπ!^έF’‘0:Šš»@0¬ΣΦωx=°ο‡θΚ–\α’ϋE½sΎ΅ζΐC”k<€wyω‘lAοΗ»Žή•μτaέ" ,.Ω²c6[ώ³ηGkώ΄•·οώIŒs°»nࠞ ”>AΥ>3;†L£Nθpπ›�LXό#Dfη–}%,D€ˆ‘„%Lp[τ›Gς±€}°Œ€ΒΊ υ,XΏŁr³ΓTv4₯§;όMŸnuΠδ5f E A™EΨ€G1Ž|"—Ύ™r›ΐΥϋ–ΘΔτŒΎ;€o€wœ@ώ>ζ‘ͺmΞn…rΐƒ—Cμ°6‹Αβ>¬¨FŸ ŒΕΙ_g΄Ζ9f±0Nb#Xp§3R`ƒ€ž³8Θ°l±Hvάžΰ#°aO @ `ˆxΰ ½0δ=ͺ8Η< ±¨ΘG%R”έτ’3ρ#Ÿ΄2 R¬�γLgIΛ<ρ§‚(ΰ·ͺ`©ScδŸΙ ’� ˆ’9Ϊ%U$" SpΤΧŽΉLeV 6°&+±<1ΪTB/ώΠKXρ œRΑ…υό`= όƒ)κ%6ιK1½\αφ*VΛ~ϊ󟫑žpΙ+&sAΡ³ΠPͺG`HOA3ΩpΠΙLΤ ­ΐ"ͺ†ŠfT@†|”8ƒhγ ¦γ(@WΚ�–Ίτ$ΦπΖ7_ϊƒb�"!ω!� ImageMagickgamma=0.454545,,‘ƒ(((777FFFWWWdddwwwŠŠŠššš€€€ΈΈΈΚΚΚΨΨΨιιισσσώΘI«½8λΝ»—A|dižhͺ�lλΎp,Οtmίl0ΫLεg!‚†H€XY*§q9• œvΛνz»A’NΊΣŽ9α’PU@ ξαZ.ž}ŸtΣΎΡWN.:|g Š  #@Š›› œœžŸŠ‘’€Ÿ¦ ’£ͺ¨X_±²³΄΅˜˜›ˆ›Ή  F |˜D – ‰Π ‹–ΕΗΙ  ΰ ?ΦΨ@ΧΣΠ�ΤΊŠΌ}ηνъτ†σι ›Γ(ΝΟ(HΓ’Γ»ρ$(  €ƒL,@π Pƒd±ΒΚΥ*Uώ[u ’d)XΆRͺ\Ι…F  p-C‡9Pdιš$ Šμ xp@Mι|H$δځ}ψΑ―HœBmϊΐΐ�¨”2•sfΝ bψKkuΫIp@‡xRX8ΐ!Δ°2iV²ΰ)@€Π–1η•’OF>e’ςδT9[jήΜYεΛ”~R(Œ†ί`©ΐ‹(gNΈ‚5/Ϊd’V €k X) ­}νφβΊ“pDžpBh Γsσ―x ΈmK``Œƒ± N ναωYN€ΈΒg%•S]~5�£δϋ”3wήΟΏχ\ώcGθuΐήQk)ςC(s„ΗΔNΠ ΨΫ"5‚oYœ³`Pέθ'!†βόD¨Φ„(]υΌXˆb.ŽΈώ„x!…C•FQ`€¬)°€ΒlΗ@( X€Μα'Ÿ“τAiŸeRŠ€ŸXf©% KrIΤhCΉ%O(U^EaΑIVΠγ%&Ρ5P$ηCJΕO]jΆEΨI ž™:ηδLqšη-_6A’†Κ蝏J ¨;:αb 0 c ;-JL˜5r@Ρ¨™Wm  Έ‘κ{MR©λ“»FΩλ”Ό¦ςΧ–Δk¬QWjpT›γώqw\‘NΨS1‘ ̝ΌΩ*’μ ΰ‰Bˆzβmœ PK E~Jθ^αVTΨ·έ~ΛdͺπΖI^ˆΜ‚@‘u ξΈΫΆκΐΈFΞ·β~‘8₯‚Ά§ΎzW+Qx"ΪPXθΞ_Ήλ«Ηΐ~,rΘ$[yμΙ(ϋ‡‹±ΥV„Εxr@D%V.E‘R"DŽhK™�ό₯7R)@8:£΅.§@Σ)tQς„Ψ—tJΠς“φ gΣ”NΝKΤ<0%Α C‰§ΜΔ–oΙπ]­π;�ρ,R}{W�ί)¦,ψΰ)¨ΑNoΓνςqςˆ›ΰΨ₯νQώqύP ζβD”a‘Oή‘{Ь»9…ž+[Ί?"ξ&?re΄zꜳžμέ¨Έo—’*άΝυLqΤ]RvWŠ7ί€3ŸwΙ€ίNψτΤί`x?7HP�FΞ ΊƒΒCƒρ0ѝ@t €oŒθaι§~ρσ?«άϊŠ oφΘώPί¦“?ό-ξ  nπ ·dF$€˜pΆ‡@]) €1Œ+Hβ;ή»[NγΌϊνy}ΛOυVΘB\/ q9€ Ÿ²6 €ƒ(QωΘ’―Ι10q<’ `‰Dΰ†f2"‡Q. ΐ/³²€q(7Δ,1‡Ώ›βώ‰#ͺ€όΰύ‘ˆΉP‘uY΄")‚¬JνΡ‰‰XΓ š Υˆ‘ ½2N0ΒHŽhέDΗšπW)Y"_!½:ς‘$xaDΑ .ΒT‰£›ΜΤ> θ [RόΔΊ΄‰E­Γΐθ€sVD˜ šF“€T„h4₯I%˜ζ  δό7Ž[Š&–ΈLT-9Λs *φΫΐ+WgI,`rSΉόDBD* jΐ`ΌB#!ΙΝnZ›+ fRe‚Ήœ`x¨:νB‚ΰ|3ΒQΏiΝLχ,9­PΟ!€‡aΥ98NoΦΰ0Ϋ4¨BΚPx"k(080[D!ω!� ImageMagickgamma=0.454545,,ƒ(((777FFFWWWdddwwwŠŠŠššš€€€ΈΈΈΚΚΚΨΨΨιιισσσώΘI«½8λΝ»ίAA|dižhͺ�lλΎp,Οtmί€ hC0;‹―2ώ(E!q 0"•§σٜ œvΛνzgΐά£ϋ„O=Ξ™TˆΩ¦“ΦΑΨ\�υA8ƒ} ‹# #V‹šš ›› žš ‘£‘¦ž¨Ÿ€₯¬ͺ’X_²³΄΅_— Š‹ ‰š{ ‹• FΊ C ΑMΔ?Υ ΨΘΚ …  ε >Γ‹ΫΩΕ•ιΦάΊœjΥΧμΦξΒχξΡ Χ‘€Φ`M5TΗm�μ`°Ατšp ‹„+ώ€^-Ω*€«“&Sž:ιΡ–Λ—0c~θθaΑξ™Δ’Δ ΔδΌ€˜ ˆRπ €šδm:4HΠͺSJHNΒ# WZm:@,Pͺf‹ή:ν‚Q¬S…¦Ν΄¬R€ ς&h;3)% (ΰ e†ΐcΐ ’kΠε„f”+U¦ΒΌYσ*Ο° ΛMΊτ,Λ$&im<%Γ•Δz[ iQŸr(ψ+)μΌφϊ@φ΅•�Ež§8ρ^Γ§n<2Α·PΣ'¨ζα\Ίπξ±™|ί½‚Ίy[Υ:{¦NHŽάIκΣ– 3λοΌ�sX ώΔ’ih ¨}@ΜLηTcLrάTψ0J»ΉγκA€„ΘA5ˆZhΫ 0ΗΡ_$Šψα"*2φ@0’XΑ‚œ‹-Ξψβ„Ή9@#‹0J@Q{%ψΐ”}Qd†““€ $F20Κy €gώρηe—`ψŸ€&-vΰ™h¦ι–%XδT”SΖ‡Ed΄ΐ˜ΰΩT…)—–K©G§x0hw>P”"D¦HWEΕhh…„*zh’?("Ο₯…Rΰ¦ΝXJ)’…vR'©fΤ¦£b ΐ.!ω‡ϋtƒ§4(pλ»„@PMδuΣ –ί—b"Kζ˜%ώ1K�³±¨)ν΄Σ&ΘTΣυΪΐΐΊ§θ8°·ΐ”“XΤF'p((σ\Δξ»ξ*je ”«_Qΐ.Ίμνoϋψn…+f¬5ΆΫξΐέ|λΐΐFπ·�`ΐτ8–‚Ίθš”Αxμά$ΞxΥSXΰh‰™Η†Ή¬²ΝΒ m€1―"΅8η<.μ–ΙCΰ–E“DBLQ XTΞ$Aΐw­έTΓ“MυΈJΧ{ο)f)ΩΤ…J »Cm΄’ψŒD' `„ΨSU 6Ϊs~Ω€MS΅F “†€b‡΄IΠInxη@|¨EFσΜΞr™¬Λ5‡¦σεώ˜ΏdmΪΫ…O*+T@�[”(°[a°δŠ₯gA:sN.°Χ"¬”h³K`zο―ήLπ¦ΠyC1Pl‘―†Θ|ρ/ιwž›ΐqŽέu@Ÿͺ*ΆnθΓ΅-G[>.ωΛ”C.σ€™·ο>›cΰ$@.Š„(aέΈ‹ {†€Ϊηώbό`²I†ξ4―κ,b W8Κ‘½(ΚGLΑ�ό,P€ƒ,`Ž­C…κ―‚΅qΠGψ’Z AχΛ ;|J‹cΜ(c―rθ›œƒHD Β{Ÿ—Θ‚ψ α8ˆ’P κΝwκ‘‘ώ`tr: ¬ŽOΥ“ήI2vΩΓAΆθ#ώM`ξ™ήΣxF6NCA## )Φκ…›#΅HΗ ΰ‘kΐ pE>’ι@Ȉ3@Δ ΟθŽp@“B’†(ͺΤ8@…χΙ„ωV9V�/‰LŒ₯,K$„B…Υ(…4•‡…ΰiΎΈΊ.°M0'#Շ"“ι•Ÿm ,Σΐ.~Ω„]<@+H‰d¦˜Ω„[^ ƒθ˜&6— ¬ βl’&¨YMb ˜EΒ!BμΓΛΛΜ`F @W$6Λ \‘–ύ ¨@ωΙ‰΅fΐ‰¬ͺΓBτ…Ÿ\A9+πΠ ΰ$G,¬¨ 4Zˆ!£ν( ##'4@£/Œ@m€Γι­τ₯0© @QŽG,T¦M—-"!ω!� ImageMagickgamma=0.454545, ,™ƒ)))666FFFVVVdddvvvŠŠŠ™™™€€€ΈΈΈΚΚΚΨΨΨιιισσσώΘI«½8λΝ»�_!Δ( `ͺ�lλΎp,Οtmίx�ο[0 –03L„#@)a*hσ€.)ΜkrŠνjŸΑcL.#xθ΄zΝξ =‚_rΘρΡ?Ύ,ζ½― X~K…|qz‰G‡{9v > d G c   bed ―°²c ΄ ΄±»·Ά΄Ώ²Α―ΌΒ·c mΚΛΜΝ0«˜ž©KŸ�š L ~J ΤΥcιœΣέία’ £ FΦνMύκφ”§kΜ™Φ°ύc0IBj H”Έ‰Ε9΄)ܐ ΰΑώpΰ`B§’ h°Κ ’M8P²‰―›ΐpΛΙs§ΟWΓΚ}uΠ™Ρ£H�τR€V: €‰^Σ‘5₯NΠugΐƒͺ ͺ;I Κ¨¦V€©”�ΌY Ϋΐ²k5Π=[%N +H₯Κw/½Α˜H˜ ‚ŠW £ξ*I“QvΊcˈW™xP € βΝ„F'PΧBa“ZKv힯MΚ»·οΠRΔB!τƒέqι΄ΐԘ;'δ3@zΒg΄gŠc―χ 9€S|3,`PΑλΑΠ­#Οr;ςοi5΄G?�x ζ·³U£κώ #Δβœ:0A5™b#mcš£ΕRΡL5΅†[lΞf.�Ζa†·έςήo$–h"fz *¨ΐ·Š‘₯ΏΠ ^Q³ ‹¬L x¬XcDŒW<€$u/Jη@dJ>ΐ ;s…§Θ72ɊΨy‰”3΅θ%,Ε`Υ㓉f ΨΣ@dδΣφΤγ_-„ΣJ‡€‚ψαOͺ‘ Θœ¨θ’ŒJΰ§q>•ŠKv²Τ ‘Ξ™‘Y˜fΦ0ρWšΤPzgž¦Zϊ@=Ίtϊ”•ΘEA§–”*ž«n•&·ζ9λW@N9½Ϊϊ’₯)κ2a±ώ±#Ϊ €V)”ˆtB�„‘> Σ€Γεb' 0ΰ@ Τg‘‘!ζ†ξ κΆ[¨»‡�kP£τΦΛ›Ή˜Ϊ£­ζ"€-ωκš7 œβ�ω-ΏΚuΫπͺ ΌΑΓ:yp«RgύΪp+•=όo�,ΚΤΚ°�ΈͺΏμ0qdΌςΖ3�Yͺ±°°Iϊš¬Α/vEK).–―x΅=C˜+@Aπ¦ϋξΤρFΝ.ΥRW5#ΪλυΧ<,UΙΠΌ’,�=½€cKS„W`Y°sΡgk4«υ°έ)A�̚£fƒ•KΩwžέ‚WHΟ ϋ,ΰ…Ϋ]·ˆ«lA,ώqλάbdS~u}�™Μd`Όfω8–κς°ζΚΊΖ(μ³[(ΨΈηžΎpμKΊιo έΔJΰφ¦δζS‹υx T1?†ρ †q˜MΖH:τΑ9F¬‰¦¨”uOΉT’ι<σκk°}σΑββΒΞh‡Θ=P‡\~J+ΦMO+E2η΄ΪmMv‚B ν΅/έ9π0xψ7ΕΨΟ Θ’ŽοFΨY�’Ά―^gbzς`υ(`$όT„Ι0a[αB0΅G"*€YΖπ…ν‘‘u€8Γ LΤβύπ3�ϋX§‰KΐE@€8ˆ+2˜(€ώ(žΦMgsΌbΝhh@­™1khΌΪΥhΊρ ΰώE$¦YZΌγΜB)Vq‹ŠYάfςQ .AΐTπ˜,’¦‘yδ ' «/ε‘‹l!τΈ0f2` )@Κ€θ°;ŒΤc!ΉGOfq“‘\€ΐ%L.AnΩ"? ?ΪL­μ£€„υΣdbB0ρ„[FŠΊμ¦€½ˆ¦,Ša5Qskל…4mg8zσ›γžvΜ#˜εΉ|Λ�ŒΙŽŠrnKΨΞIŒ%ζTfT|v<½\/ŸΣθi*ΐGE˜…$nc-Pπ-αœmB]J³Lθ‘ϊΔ¨'.šLŸe@ί»e9+Ί«ο@Mϋ@!€:–@ g ^· ™ΪΤ›-ύ€J“(–2ΒXP©`zHžvΐ§Αr© *YΏ"$υ§FEκ €Š§F!ͺJ΅Ž“¬ψ`₯AΰiPΕ›ςζi$I«Z»fΦΆΊυ­Θ> Χ΄…n!ω!� ImageMagickgamma=0.454545,,ƒ(((666FFFVVVdddvvvŠŠŠššš€€€···ΚΚΚΨΨΨιιισσσώΘI«½8λΝ»�_!Ž€€hͺ�lλΎp,Οtmίx�ƒ° 'IΐG VŒ€RhA&Μ‹ΣΈ”F'Υ UπθzŽn˜ +›Οθ4fψα‹=;ΕsJίEόͺ€@ϊywrzB@m„Iˆsin H ^  dX__ £^₯¦¨¦«£­€©ͺ±―§³Ά©΄¦žjΌ½ΎΏ  ’]”Δ`• bž F Ρ A EΝΙXήΖΠ�Τ  κ 'ΜΕΚIή»‹ς»Σ^ξίBφϋ�$hk@PœŠl θ!3˜a@ƒbDPΐA(  x @ƒώ4˜ΐΧ-V']₯„e²%J—*cy‘¬¦Ν›hDzHΡβ+Žά°ΐΑ’|430!Œž48ΰ€’G“ ŒŠτ�L%8%ΚΐB³¬^· UΦ�D¬-Ќ¦Y°pΝλ6*Ϋ΄?&ΜMŁ0(H t™JB”κψ @€ΚδBPς₯瘟Y†�S4θΣ¦cΩΕΙΊ΅k:QLΆ0;W€lΆ`S=κŽ-0XΒν­ϊŽηήύ ,N€3`ͺ ΌΘκΊ‘ΜΎά'« βΆΞ™;ω"°γn ƒαΕisΤ@΅0U«G^Ά¬»r…ΨI¬ώDΪh]δ"Ki’–`j 6¨ΛkF(αz_Q˜t#ys*xΟ ΔGΠ•uβs]”εα8]–ΞM°bŠSmΨ"’ΘxγŽ4ƒHϊόΨ\Ž(Γ£>κx$οΩAP'D†$πΐœ΄7NQΫΔ*^R€ΐf)X €k"Ψ&Βiΰœ2Ν4αxFxζ €)㗏ύyΑFeTΤUaΐcΡyTζPνB¨G 4ΐ€†n©MT‹>€ΘΣ™Ι₯–bZι–WϊχΙ¨†^4ΑFRaΝ–¦ͺe‘•Ί @πԊκC|$%%�Τg Fτ@o€ώr@4:Πǟ¦Ιΰ›jΖ™-nj{­·޲Zžδ–›F…D˝4>„ΫŒ[j)@)WAΓ'½q«%ΒC―Ό�nYΚΌ[ŽΩΐ½δKVτNζpΌ^ΡK=P[Žο ‘₯Q'h ΐCLpz‹,±ΰcΞ ύ2\ΤΊ@Ε€Z>)D)π@¬―ΊjmΈάΚΙ&ΈΨ~tΆ_Œkξ�LΧ Œ8QJXlΔ‰&–. ΐFκpBT±RPμ«•Eγ₯ekB―Φ\#ό)»5�zunhΟ-qΥiΣ-q?,FXmv©y[šΰX£JA)a§©ZZYAW”dtΔΊώοI»k¬Υ}΄Ρž‡ήνη©(έτι¨―€n—e,ΜPυδΑυκ|qD0°YUΪΨβ Κξ\† $ ³Έ΅{޳«$–/ν”ψhυ’0@νσΞ7OχM¨�BΛRΐ�ΑeϊPUϊ \ΖTœ£)ΊΠ£ΟΏ­ύͺ₯��ώͺ/ίΑϊαIX 3nˆη*»‰FςD„±Y"FTΚN#Έ› yn‰[`@ v D€ /A―Δ 3ΑγL0„XP Ν‡/8+>Ό †…$‹Yζ/ά€Q Ÿ]θ2υK"ύ–x?%ΚΔtό‹’§β?)(€<θQώ�˜ERΰ! © λEά-κz VOH’c„’΅¨΅2F4²ΐγΈG-NŒ<š£/“‰’&x³ϊθE9ΒяΣΓ!#ΉΑ 8`,―SΥD°ˆ`‹?„€ιa §,H|‡‚C%hΞF›Ie™:'Φ’–₯›’.w)Υ•oʐ%C0’Ι$KUΕ£€Χφ₯ΗQ8'Θ1 ŒdrιŽUŽI5xjb)¦7ΑYv!}(d‡1ΕΠM`Q³ΌΪ¦‚yΜwbΑ]@Ǝ„ ž‡X 0cώ„E ŠΌdΑΟ”Π†κο (ΏR ¨B\ΰ <„TE�WPήu”Ϊ€Ξj°\τ£ E©qTš„bΤ£½LγGQ)Š,uθMe‘žϊΤ"Υ©P‡:ΤR¬CD΅:ήf†!ω!� ImageMagickgamma=0.454545,,ƒ)))777FFFVVVcccwwwŠŠŠššš£££···ΙΙΙΩΩΩιιισσσώΘI«½8λΝ»�`XŒcžhͺ�lλΎp,Οtmί8:˜R0XΌ…‰“’1ΙVŽΞεπ9•F‘Νk6(xx½†œxL.Χ|ŸΐlΩqk`|e@ φα\‚{o=ƒ~fj+ ‹Œ  aŽ=_œ _  ^ £Ÿ§¦ ¨«ͺ¬―£’©§²₯Άœ“lΌ½ΎΏ™ _— š Ζ AΣ <ΝΟCΓΕI ^ΰΡΦΥ…₯‘‘&βίΠογΠήδΓ¦ωφ όςπΥΓ0/ž…j?Tl«ηΝΰd‹’)˜XʁΎΠ …ώ%tΙ΅κ–I’±Pr‚΅ςdI•_XΖμ΄λ—Ν›8e€τ €€BJ€tH/ΠΔM `*Π€$ψRO)aqΔΈͺQίƒ]M7,``A+Χ¬_ϊM‹UBΟ@…f°Ϊ] η²ν:RG-Qθω³θŠ Oΰ ΣΎ&0'uY—)_jΞΜΉ%LR˜=oέΉfΞΣ¨SsB”]l`°ΐ€` βΘRς(�ΪΆ‘1φhχμ§ΔΕΙΆ@B%ΎsuO@ŽΫ8μYΥeWΩ·νƒΌ¦@½ΈμαΩ©LΗn>I²yOΏ}MότIΪ]6pYδΛŒώ4ΪLŸy‚V L &h J¦©&ᄨ±–FD0@Aψ•”& ²GpLψυS]ςœ#$>GyœΫΎ)gζμ·ΟAψ <ήφ@Œ·.nb:@ι$^`ςθ?θ‚Gθ2„Ξ.Σ ]tε…Pgt—(OŠ@@ �<`Ž1žΒ$ΊΜI΄Βx½Tb hψ@ΰΘc$Ό†~πT•ω@ΓB—)ϊ*G>ΘιP}ιΛΦΞάGD̍ €ώ‘YaΐPυ @2‚\β€`ώS΅)§ΖF ρ'1’ρ H™1Π5Δ}팦{#)π†ΘΡIBS"$Ί”EζΔqŒΓHˆI(�QŽ|tΞ•r8ΔΎx±Š—Θγ9ŒΘ°aBœnφYF΄E(;1JN”}§β΄R9 Pb‹•,idgω­#^€)_hΐ‰Ι ˜ΒŽœx‘5ΒΆB4yΡ ά `ΈiY2ƒ²LebςkX²¦\‘K €ξ`¦ˆ†ΣΤΚ=Ϊ€€_β“Μ”e`_ K_ΆΛδa“V\<ΪίDB%ZΪδYƒσ§@}&€~ήr˜A (†f  ―)h =6uˆΆΑ O–E“€P‡ΞP‰miF+*RΞ=-pV Κ�Εε₯²l©LgΚ�O°œ4 A°M1D!ω!� ImageMagickgamma=0.454545, ,™ƒ(((888FFFVVVdddwwwŠŠŠššš£££ΈΈΈΙΙΙΨΨΨιιισσσώΘI«½8λΝ»�`(dAbͺ�lλΎp,ΟtmίxήΒ6 ή NˆΗJqiaE(%:}&―Ξ«Τͺ}fQ‚‡XlΠ™Οθτ�η Ψη¦ηG|Κ€θχ§zPBJo …Jƒ‰hn‹C ’A b e› acͺ ͺ«­c ―b±²΄―¬΅²Ά­Ό�Ήΐ―Ύ°ΊΎ jΘΙΚj¦ c b  ΪΫ§ E”z@ •S˜šGκμήΰΧ˜ž (κ €Pϋύ„άυ{f #ν2ςΟ%K*Μρ£@πAip=8@€ˆώ˜tzΠγ’$ pΐΑ‘b0ƒυŠ)ŒζL™ͺ†Ν²™“'1UΗ– JΤEK (ΰΰ‹ h³SAU«ΐt,+žKΑ(!$glBŽ”Δu‚Χ X0‹ΆμΖ³$ιέ­ AL]�spoΪ½y5ΠM,Αγˆ"Œθw©Α$‹ΔΔ&εG aVn}€ ΐƒ¦ $ψΖ�)€T5qώŒMϋfힲwζήεSχν Eƒ ~‘YV($[’L–C£ε†ƒΗΣ $χ+tξv‘cZ Ac €£zНτkφα•P?zδBΗ§ο]ώϊφφAώQΝ(+άcΰ§+H +'‘’έt0ši¬4ΐQ υΖΫn:}xΫlΆ•ˆΫˆΎ™Hβ‰dηβ‹ΒqψAJN1Xή.mx‚‚:(Π2‡ƒI€ΥrΚE€yrΤ#uτΈ&Φ&ζ2!’=6Α‘b¨„6Œ@‡₯EZIεuV>Y䬩 BΡ€–HVΪ9(ˆRX™'�˜l…έ,χˆ†hh‘ˆͺθo06κ(2‚r ΐM-—+δuΐŠ%ηl@SŒ₯€€υ“ηž}žΪŸ.uΚ‘Eη]Wͺς©U­ `@5d$ͺZI0i₯p9΅¦Š�ͺ}ώΊuΪΈ fg©-PKΑ°@vΠXΚ% )±τER,z"ΐ3}@&£i‹ͺ˜"‹π�(ο»σŠθ�½ρΎ ά£όφ+ƒŒ’R ί{Ÿΰ'vN°€7 ˆβ+šθa­Έ°"ƒδZLξΒoψ°bp†«±VαΖrρE@™V+8μΐAœΤ@iπ œ@Δ ζ<.Κ¨@†1IΘ₯δm™+L,l�0/h$±PΐINpRΒΝΦ:”Β!(lχΪnΎψΦλ5ŠaΣk6Ύϋϊ«φΪ‘9ΩAΕ€B&­ΚΠ,ΐIžˆΒX‘Š S‡nαυ©·ΜŸΔjΑ¬ ^3αq,ώ’‡;+eH½Νd~λi–kp�•ΌΡΣ€Pτΰ›Η½ΑII­#@Eͺ ™�q)Α=„Vθ�q φΨ]'J6ςΗ+obΪlG/}œnw Ÿξm0‘Β \}ΐl0P}cƒKV! o†Ya6§θ}΅ΰ7Yω½™%ϋ™e‰ώΑϊP κ²F6μ·Ύ]οJχ3 p7mΐhΈ#)α[œψΜυZ†24 p*žσšχ5±Π„%ΤΧτVΘB‡P` ’' ˆ―zΫΚ7β€ ΄)ƒVΟΥ$ž�)~ «ΐΥ6!ΔΟΠσqb�2 8z„ŠfτY%ΝΔΎ<ΟΘ0 TANΪ¦ΐ‚*qp]cp š…Τ³QΖ;ζO‡•}€pΰtj$5*³CT[0Ρ ΰΕbκΜ8Υω<υ] V›šUž6ax+XκX§ΰΐ DλΦ‘ΩΙυ�xΝ«°*d³κuJ!ω!� ImageMagickgamma=0.454545,,ƒ(((888FFFVVVdddwwwŠŠŠššš£££···ΙΙΙΨΨΨιιισσσώΘI«½8λΝ»�`(Ždižhͺ�lλΎp,Ο­0lC0w₯ϋ”ŸDψ»$08T-Δ§Τ)E:…ΡisŠ`GF.›Ο^Κ–Επ#^Ϋ‡ΦMβ ήύ Cƒ‚ˆi†d6&’  ’££ €€¦§’©ͺ¬§�¨ͺ«²°₯΄Ά³²Ή΅ΈΎ»€chΓΔΕ2Ÿ!=£” £ B†? ΛEΡb; ’δΥΧ Œ  ς :ζγΒEχθβόβπq°w.ŸΏ‚χε[χΝD·Τ$4›Δ‘ƒ1Xp`hώ,@π@@ (°Ϋρ«UΛW/c›ι’&L›2kκΌ)i‘±Ÿ@ƒ~Xω€€e=š‹ˆ!AΐH0—IB€Ap`ΤBͺKNΥ: ͺ�nΈdΑ\G³c „u7,\N‘J]ϋ@ξ]»b5ώc”S‰‘ Χ50 ΐ� "Gή;a““τM Ξ( ’pή­kgNž¨O«mšujΧ§} M{62HbZΉο‡t˜[ I� yDP kΚj(‰znŽ�πβ3°₯0}¬τΤ£/©ή»ΰsΘ‡§”υYυρ^Κo?Dχp!”3―`ωƒ¨gu•ώ€Yfΰ=ΰb‘ΔΫ‚₯½Φΰj2Ψ iΆα…XΫ†ώ„  8Π~cΡεCΔΎZ’χώ` ‹z@8]=WD d©΅J†faŸwκ‰η·γ:ξΉεΖ6θΊμ²pΫ! μcΥz0ͺ| XΓΐ&$έ‘Οκ +p˜]5 kΎρπΛβΫM^%™€Α SW¬b‘X[$"κ0qˆ lJΚΏ3°ΗE 8― 3)_όR°œΘδΩX¦g ζ)4Ήβ=΄ΉιΊh»L7ΝΑ»˜‚@$MύΓΞ!\μ[Ύ$Ι³\Y­YAΐ·z0IfΓ³‘]cς° ¬ZΆVσš6¬ M7­.gI €{KψVc χVŸš‚¨š™•iXγ/ώF]ZH "C,Νg�αŠξ§ΡDΫ΄΄Σ¬·.‘’DΚ ™ΗQ^ΎYυυυ’°S09W’©QWΠ€F $»» Φ;ρΒο½—g0ύρrQ^Ρ0@mπΤKίeυ\y@‰5KΩΤ>”ϊΤw¦RΒd�€Ψοz‹4κϋ›^zκμ_O\Gΐj‡(RD02Ne =I‰7°;a fΉλDwrwηDp#Χhžv²ΗΑζ”'ƒ&™'PΒ¬hŽ…τ‘Q4Πƒnπ()„ εσƒMπΖEΩO”‘ΐN3˜8€ ΑΟιGFΖ’SGΗ?*ϊ]U<ώW ΘE§}(ˆ=@β•Θέ,γbΰ“Φ¦39ΰ… Υ’SjD£eQί°Ζ|΅HKށςΨƒ;KπγΡ ΧˆF5&²E3\�"υ8Ipθ†)†\#|„HTΕPsœZ'x€RΚ‘ΌqUTA δ4G[CκV�'ΐZZqŠZ ΰκΊΘKΪ F #+) ƒΙϋcΏ. »β ! ŸΜΝ9ͺ’Μ ˆ¬Ο(’iίΣVΪGU4#₯q―φ©ί�ωI«€³μ΄@’‚ ža ™;"')δΉw H£ΐ›^P»4¨B‹AP¨S Ρa":d ιρ@ά0ΐ x$Ε(¦π‘Vΐ€A©@qC7‘žJ dεL θεΫέ ί ˜˜*μιJϊόtηφ©;wνŸ†|νΜ%€γO]΄g-Ζ5phMΥg$%ؘ Hƒώΰ iJz©¬Ε’WKb+]Κ„ω2ΧL›4oSΖ³§O (? Cmh'ΐΞ;cΧ P*αΐ΅£ž8ˆέ­"<ύuΓΌ‚νϊΐΐZ³mί‚+0 €΄žs£7¬†Ύ†ŒRa•ŒΓK Π|Aπ ˆ8¨Τφ«’bζ܌³σ/͞ƒΥό%α#οJ””ΐ€1&Ε>0ι8y"U€Ξόsξ�£_Qžψ «–T˜Zήϋσε�{‘žψ·{`°€·C œ΄ώvG~|F[LχrŸχh¨qah·@hš„RL…₯q˜š‡ϋۈ$ΚΐŒ«$MŠθw™wω8 ‚>*Έbˆ©0•:Iy\(=n²O(4`γ  υ’dy”]8ΐ^Ÿ¬a$πΎΏPЇ?4 }¨#,‘fλqpΞ±7 ‘;K„Οώx€ΕΈp; ,ά‚( ₯ ¨G_\‡€#ˆŒα όI#˜„΅δ…ΠŽbaExΗ|]…€ŒTΫ8 4!Qƒ6κ"±˜ +Uc ΰ-Hΰt1“0y LΥpEΜΐΘΚ΄ Nn²”š$₯C8I%Ί©€€¨xITž‰•˜*ΤΞA€KœΙΠ ‰ IIοXςzH¦[Θ5ͺ#k @&’Σ€›]†ŽΒΘ¦.΄ω‘aΒ›_'Δ© mš3δ$ηΩ�Θv&c(€Έ*p ‡@I5Μ9Oΰ¬!* ?θ0@υ%}F�Ϋmξ"ΠΫόQZPθC£λΨ$MψphCJΟ1f‰£b ζ]jw‚”- :Ε·0­ˆAmpΘ"5 €8Ήσ¦Ϋ9;qΚΣΤ4@Lι4„ρ5UΟO]0ΚνΌ�F=#c–J˜•eJ}jͺΥCPεAν©XΣ@’»0t¬hM+NΩaδM­‡ΰ'\ηJΧΊΪυ�i φπVΌ�Η~ ¬`KΨΒΆ_!ω!� ImageMagickgamma=0.454545,,‘ƒ(((999FFFVVVeeewwwŠŠŠ›››£££ΈΈΈΙΙΙΨΨΨιιισσσώΘI«½8λΝ»�`(†Qœ§‰ΑθΎp,Οtmίx�ο< ›AKς³ +Γ#‘’œ(Η¨Ή¬B™—&Φi½r­O―RΫ}Ž—‚‡zΝVzπΈ|W”ύΒ9!' Θφc‚LH‡|3‹F‰{r@w k šo imj ©ͺ¬˜¬«±�²©΅m°Ά΄�Ήm·lΏk½lΓkΑjΕ­�k£sΞΟΠ₯!”°Ÿ ” Gέ‘ C ΝP jΝνοιG ‘  ώ -βΉƒ'ήσΦI¨v-Bƒμξ)¨@·†"Π©£PN|ώkL8πΰ§},@€2@ƒΊ9Ω5«¦.›Ύhήά™'0=yώτil³hH“*΅hκ5ΧHšl§ΟΒSQυ˜ΰe…%IΠξ(•=λ΅έV ]«’e`a-Ϊ?eάέ`Χλ„«/π3»@_ΉYM–ψŁ�Xɚ$Π.πΎΙνFajŠ@,(§δρ) C…%ͺLuλ °SΗ^νϊΑ1Ϋ¨i/«Έ΄·ο¦=Έt3a3¨Θ†Gn·@B(ΏόE_`@τ°0 ?™&{;˜Μ«Al˜.…ξYΉΏΚšύΛ¦υΪEi@\vφΠkoίE�w'τ₯ώυ‚J$ρv\„ςIΔcN’Aˆ‰BΣH€Jm·e˜Ϋk²u¨›‡~(bˆ$βƚ‰Fψۊ,ŠPa˜Υv0`ΞG% ¨έ-Θ’HuππT32χ]I—<=Ž·捄ΥsHN©F”5κ@‘T—£ePˆ”d—\ͺΡ”hΝψF—Ψl‡œ- ‰UΠ™UW£ψ#‹Θdα†(ΞV’†'Š! † (ˆ‹²’b‹FЁŸ„b––YβYiIO©Υ•&Δε„|~…KΈ΄?ρ¨*«ι”τ}δuRͺŸ­ϊ@«©6 λ¨Φ-δͺ―¬wi`tΔλ«ώ,λΐͺΝrμ²Δξjl§1€ΕKςq–—xCD  %HC/^¨h’Œ²;b£ƒ"*o‘σ¦(ι½ψbπbrύ·Ž,η]ΥΥ±tH9‘Θ)Α*`"ΐf˜DŒ�*ρŠΒ|aiqΔc ±ΔŸ�ΠΘοϊΑo&;Ο-T,1Ζ2£T²…�ξJ²Κύ:ό‚ΟRς·Iό±”@u_g&?‡€[οΊO·υ»ξΖKο‰l<šοΦΏν›Α*ΐ- ­=b«HI,,Kώ„ςXΫPΰ3K–Φ,&y·cΨΫG2 wΗ·Š–ίxn퀆kβ7ΨboΗ‚ΛڈӸvώ­φ½ψ‰‹τ8§,©‡ΪVPΠœΞΔ‘bu«Rεί25ΣΥ‡�΅νRγNυΤ©hΝυοIQͺZ©‘y Ο ' €URu0pf>“Δ: Ty½tn;τ|MΏε•d?ώυζg`½yζίΖl1€.ωΨkΟΎΗ¬_Ύ)ξ³f@{J©hSm£€ ˜Ά�€m'?Όƒ—«6ΑRπ‚4J}€ΗΑ�EKBŠ έ&π€ζ8! œYŸμ> aΐgΞ{zœ„ϋ0<αœlEΰ>1ό!|ˆ ήg ›@Π²Jψp†P’ЊΕ#^!‰&ώΠ >&ZR‰6KΪ&Ϋ`εL˞oy§xj…?ε,πξ{ ;™ iύε”JτO Ή—�‚θBqΧ QΖ`κ3CTθ‘60σ–³cC·J0ΖΏŒgδL) :j/•Ί΄°γAΰ‰:Έ`�Σ@LΓSπΠ“ΰ)olzΟΘ`§€ -ƒTαΔD}©TcΖPYυͺbœͺV·ŠΗvόC‘\Γz!ω!� ImageMagickgamma=0.454545, ,™ƒ(((888FFFVVVeeewwwŠŠŠššš£££···ΚΚΚΨΨΨκκκσσσώΘI«½8λΝ»�`(Ž`PEš’j@Ύp,Οtmίx�ο|.I@p …c²r(™Kg9…J)ΝηuzlR£έjϋέj―‚‡zΝV|πΈœ4œOƒQΘ©[ό0ƒƒXD‡€0‹I‰v —w–o žwmk ¬j�― ―³²΄±¬ΆΊ΄»mΉmΎlΒkΔjΖΐΓΈΜ·΄k§’�Σq©–——§j–G ίAά Ρ §πហζθ ‘ Έ°'―^Ό‚}βΝ‹¦�Až άK’^Βp›*|{H‚›ŽώΪ1Δ0 ~.%”ΰ‘p¦&4X€ΰ€ P8Π I―ŸΞx T¨Q’C—%-VιQ₯O_€F΅* žT&Ψϊ0•›  ρMΌQΐ₯πΰ€―1'Δ;@ΐδ‘³dmˆ€Ϊ~ ,Μ%λΰξyA^l—―ύη5L·±Ό ;V£܌oaNe’‰ΐ˞)\˜i n€›'Π·SUΘ¦PκΞΝ›ι�cΈ}Gώ»VpβÍ?ƒl΅ΉσΦ:\½ υθ ₯FΕS  ”^ Pο­[β;OξΑΈν€Τ€˜Bτκάo?ŽΜφιΉώ—„Iε‘δ~ξ`U(˜Ÿ^Ηkd<ΠΥaγΐcžΌfΐk�€φ–xi‡ΜŠΗ)—‹*Άγ‹2�rΠr>§γŽ;‰·ΑL^HbρqΆ“#€:έ„'!ΐθ ΤδVzΰŒ˜ΙwN4ιf§¬€ ψ@MΰΤ«*ώ8pΐ�–e°@}ώ»λ°Ώbωl<€Ϊ77ρκk•”2’›σΰ¬ΆͺŒ νΦ6+νLΫ–�-«! YΌ€rˆ+ͺ€ΐl`6A―Έ d6HXέ–io"ό©Β‘2\)¦ƒΊs₯VΜcΑpΏ΄ /’—^> ”RS" h6oy�²³0‹Λ6΅Ό€�˜L+ΛVσΛ-ϊrΜwD#ta3γΨc kl–4–G Πς : ΜQοΊtŸ0Πϋl ‰�όSΑšΈV`φ<ώ$rͺ0I|π¦ߝ0ή|ονχΒ}ώ72lŒjραv`όΫ@k"\…‡°υκΚώΉΒΦ¬ΡšΜω+YΚΚ2«ŽζnωZ“»œg°ϊζΎΞ�mMμ7O«ΛΊκ‡Α>ι―§�Šμ‚Έgϋ X„yΔΣ@3UΖ­ζ ±~υ…qŠηέ}ΰ ƒ�°έί>ρLj§ŸψοLO ΜΧRθlΦΪ!α‘T^†Τw‰œjKIOΠ5ΰ~[Ϊ ώ—‘4₯ΔtΰŸ�ψб˜„Ρh j( ΦK€ +:σ±Iΐ„}<ΧΈΪΠm ΈάάΖη=ςΩ°†8ŸήΗCΒAC}@€Ζ©>ΐΒΒΛ —πΒΝ�£.Ιτͺ_Ψ#Eσ(=: OώxV‘Šœ©^δτσΎ0(ήZ‘Iπ/^ρ‹Ι°Β'ΜxE$€Ρ>$Μ αχ‡ t ΐK>rΒβ!ΰϊΑž…φ'žΧμ0|ζ{$ uXΎN’Ž ’&k Έ Rσx h‡H™”η5’8€ΖΜΉϋ λ£tb$ ‘€l΅Όe@G.–ΞΉΜΜC‚ 6 ˜$ΔTL):½p'™΄„ (iJdJS"ŠΫ�Π Δςžψζ,«ΩΛ 5υ©›Υ†Φ§$β¨Ν*Š£ŒV4ƒυ„E‹ς™Œ}ήσ�T?Ϊ’Βmς pθ$v΅†uΦ© ¦K—³XρžV֌t Πꃓ5τ₯£ς@ /'ΰKžA°VP8Ί™¨h@£,T ΐ€ˆ›‚ K% ‘•B±˜i‰#$Β�A΄Zd3₯ςδq^A²O&JUp―‘m˜jU·Ϊd�«O-BX9ΰΤx΅MΗƒ%0€‡ y5H{@λ ήjπ $€«"6§ƒΈ"­\ ¬ϊΆ9ΒVy‚M¬b‡3€Τt±2pF₯!ω!� ImageMagickgamma=0.454545,,‘ƒ(((888FFFVVVdddwww‰‰‰ššš£££···ΙΙΙΨΨΨιιισσσώΘI«½8λΝ»�`(Ždižhͺ�lλΎp,Οτ5S \8ΥK? 0{Ε‘/WI:™PΛ/xΔ ›Xιr›άFkఘ Κ» *wtyNΏŸωF€D|h2f) ˆ š›š œœžŸ’£€‘’§Ÿ© €«›―₯¨­±�΄·¦Έ³Ή€cΏΐa— ΗΗ › ”  i ?Š|–= Ξ> šΟFβδΧΩΥ ŽŽ8ηι@ΜθεDυϊŠˆΰ³gn\?ό&ΰΛgΒΈJΣ4ωςπ―Mˆ,@π@@€ώ (h€)’*]'yνZ™’%+•-cΎt εL™5ar:¬§O#=K@’p@ŒΌK‰‰ƒ$ašžx¦IίTΜ�ˆ;Ά#€©¬nXΐΐΒΨ²b€»V.έ Μπ5¬„Ύf5,p0Χ/€’–ΰ:‰Β‚ˆ;x!οޏ]mk4κΥͺ_Λn]šφ§‰?sλšƒΖ t™p@―„βΚΔ-ˆ€I#… lž€5δΩΎ2YηK9σΐ|ΫR¨ώ;¬Ήg‘@ώ:n̍5 /R;ύυηl7_!ψp DώŸ’(ΣG™MGˆΘΐΑHI‘ΩΫ…³Υ’‘…rh[lbb‡�Θίn(¦¨AoΠ1ΐ5u‘Χ @(rHW•S%’P³UcA’t8�Eα�™d[?P$�ε”$ΰƒΰΛ•š@I€&Kΐ€VŽ)€0’ΐγ€ˆ# Ηά’<γH(4V HI%n¨‡‚ΦV(k‡‚˜¨ˆ‹J€β£VR¦ψ€„ƒ-²Aqi·ά`Y=ˆ υ9ή€πΡβκͺƒ…ΰ80κZβU�¬ΈΊ«F±¦5?ΒρzηE{aΙ%ώyμ%ώΑΪΣHΨ¬΄@`jk²"τxGΈe žρ}Τ²@$ ΐ™uμΥ›h†*ο τΖ[/’σΪ+JΈ‘φ›‹€@b3Άn€Υ#Α=ΠΦΧ0 I³ ‚‡Χ€žΦQΖΑζ€žΠσŽΔΨY|ΑΊpΌq―r―˜θ£ςΛF4ΠVž>hΉ%-―¬±Ζ4ΗL'Λg¬¨Φ•ΰνg x�žΰ .= 0rN¨Ύψή«hΎ]sύ΅ΧŒ’²₯Ώh�;iΑi54U”Υ@Ώ-G6K’VnS°΄―γήΨ+GΗj7GŽH7§:Ή[8³›e%Έ„›—qΤώtd₯Œ—θΠͺkαƒGΞΣ;”‹~]žΐ=ΒίH—΄˜s„§@€  <ΙE\Sπ†νϋΨb—M6‰Α�ϋ&ό¦­Ό0Σz‰©˜4ύ†yc%—βΛ¬-ΑίΕ9,Œέ‹cυš ·’L{ψa~―=qθˆO�BœD† ϊ„οώκ·‰ώλ[Ϋƒ^'¬θcFB©έp描f}nϋS…†g’FUlΐ;žρ2ΘA%oy ”A01 ΜΗ ˆ’έdμι³%Θc=3g…ίh‘Ιά�Έσ`Δ‡!‘!ρSΓ!9ϊ(3π ¬ iˆElΟ’(=κœ‡ώλόw@€~‹O&  gI0I7(Όβ]‚Œ#EΤ·ΪγKR 0 3@83φ‚ }`ΰ£x FΕΥ zxΙ  §Ν4β‰f²δ Ος:μ ¦‡™LΚ&CyIBΒ‰’΄ΣΕ’Δ,‡”£De#TΉΎSj�8€X0i„ju€’€€f`€`.`eX·=;=η<μ [Ρ0QTSƒ&ΊζίXmnΒ›lœ 8!4GGέρœ/Θ#"ΒΥͺϊή°–‘τ€‘Π›%A?υΡpƒξ8ΩΘΖ ”˜™F@Π (žπq@<›I)‰G (’:jΑI Ty'™&: b £ν{Πm¨4Ο0V/‹ΐKΡIӚΪΤ¦2ύ€RΈEpΛΙ*Υ~ωSD& 9=ΚΊH™Θπΰ§2ύšJ7X ©γρ)$«ήτ«` «XΗͺψΞ]�ϊ+l¬ώ_ „¦A~μυΗήΈ½·'δQέ^a€š„αγΐ#[lt� M�΄β\sΖ£bn(*Χ"s+"χβr4ΞhcŒ'J%ݎΠQ·ulπhΰU¦<Η=@Τ’z ΰ؈THŸ’U>€dχ™Τd}(pMZ^yŸ•IJΕdh>'A'/AfΔwGš™ε–Xnδ›ι₯YΪ”D[.¨1Iƒ_ηt°“‹8¦Hι₯2Vκ’¦0bz"§nς(*U’v`’LJpΔθ/ΣδτγΧ'J2€ψ₯'A«―ΖΚk°�– 8―–]cNπ’½ώ�φk°ψE峉GV™Ύδl„― ΅«M ­²ά« Τ€œ#LYA겋AΊJΚYΛΊQ G†ΘI‰–fκiΐŸΌ©Α ¬pT£6\ oκLP‹Η’aw�O:  ·¬j“8Vvΰ1Κ+yΌΘ¦Œlί»«₯ K°²ΗA4Δ²Κεή§]ο(ΔΟ,ΐ1ΠΠPΞ6‡ΫΟ#€―²™‰βΤ2Ÿwΐii@8ώ%=η™°„(€ήτθΖ<Y{0tΔ: Έ JΰσΉΒωzŸΚυCψƒϋt՞Πδg‡Eœ‰ύΏ™Q‰G4bΥTΔ2!h ­ABώ8²€‰ ±?Pœ’“D ΄ε?h“—*ψΔ .ABg\Bg :·|π-β[J”BΖνΛdτTxBΎ0†ˆΑ 1pžΐ/C =€ΆΈ5„#8L™^Fτ½WHAί Π¨Ωhr"Ρ̚ΧIΖΜKsΓ3ε*‡$Klˆ΄T₯-³KΦh>©μˆJkϊL‘bΑ€‚pΝv Π¦65mqͺT=ΰ΄P^< γΤh@ 5†₯>P*~ΔZ‚ΐ\@?°@U·zV²–ΐi_€+[ΥκΦφd’Ζ+ΑfΤΘ#\uͺ€ ¬ :CΨΞδI°ˆMlUΘQ—*8Øt"!ω!� ImageMagickgamma=0.454545, ,™ƒ(((888FFFVVVeeewwwŠŠŠ™™™£££···ΚΚΚΨΨΨιιισσσώΘI«½8λΝ»�`(ŽdΉEZj*˜p,Οtmίx�ο<(Ό’A`V†$Ρ’”(‘Mη’}R1Πγ5Ή•zΉΪ­υK“›Ω08j�ͺ‘‚‡|ώpΘ½Ό^V ύφLB}LF%‰‰T†D'#„G‘“‚€! s   ₯ ‘tt ³s΅ΆΈΆ»³½΄ΉΊΑΏ·ΓΖΉΔrΙΒΘΗΌΞΎΠΐΝΤΑx›ΨΩ°s‘£ΰ’€ J p£�I r DτuχθJμ8@Ε`Αωμα“γ`Ÿ„υNψ7ξ!†� >Px"‘Γώvξ˜(W‘E£¨TΘj€ιͺ ‚4H@a&iΕͺE:νΡ F“UZt©Σ¦P‘>•UY09<΅iέκ³+/cJ8π©ΓL9�θ©’`§Ρ€$(;ή¨ΕϋœΪ m2°`—―ή „«x΄(7.œwρ]τΐ·$²+p,΅ζ)[žvΑb[¬΅ΐΚ‘€δn›νΉΘf �ž8Τn±ηš ΐ†wœ0ΉΣs©„€]ˆH `–HI)ΖVjŽ£šϊπŽsZρ§#‡•ͺ―Zο7pΑ’ΊΑ€ <ΚΚMF€τˆΑΤΒN2ΧR.ΝM¦ά+?›A΄Θμ¦5[[ ΡM†"OΡH'1П%p“Έ’k4Ξ3[΄,}uΣiφXΒ€: 6.°N™(ԁΔ(Lj Cinη ρΕ‘ς κίS¬·-YulΈ ¬f0Χ;ϊέ«Ι΄˜ςM¨ΜĐώΏx+q»ω½ΚN^f*>c €΄έr7ΝΥω»|ώϊΜβή$.SW}¨λ«_«Ί±΄~―Μr‰=6·΄#Wl`ΰζΎσY]0ςD5χλ8ή{n±χϋψχέ—/x.¨�Ύ‰cπVτnN$‚’+πb–Wοx‡‚f&yώƒW,Rv?δZ¨»“ž(₯ΐ�νοRb‚Χ`˜4‹ΰ"`ΣwΦ@ j €ΰ`ˆt1˜m)‰Β@|υ4ύōz3‰ƒ*D–¦ν/|ΰλ['ΎξΠE"YŸEπΔFZp+Ω¬†u|-€'£@ώζ2Ώ:δ~ΰHPώ‘Π€Ε'.KŠ₯»Π^H-b±P…Γ ³Ψ£!œmόΞ8ΞhF9°1L, €’ζρ'…τӐ!ηΗ?αΑMSφXp€ @ͺΘNEŠθ„κΠ|δ;Ÿ&3ΙIb�“ΖΩΨGιφ9>ŠόP Ή‚=Š‘πieΚ(`9b5QyŽ,ΕE p 8ν²—~ρΥψ³ž—|ͺžl€IOΘγ—Ι”Ÿ p‘ωμRΡ„&ΏNψΜe&σˆi;@bˆ` Ρ —γ”Π6Ch(ξ ΐv‡FH¨L:LΠL§p€ƒξfIώΠ‡ŸΌδ&AΩIΞ"}€LhL‰|θ ŒΰΆ³$Q=yq˜8q™’fa&0„B­ΓZ.ZΌAιǘ!E  δs²S"  K‘† „₯ 5J›I½Ά΄’]©ρ0PΡš^ΘK)GpC€B:Ζ©]S¨T§ϊξŽͺXεOUΨԐxΙΊΖ²Β`ŒΘDY»z„rFfŏ&¨ΒΈ1{8ψͺ8³Υ¬ϊυ―3€KΨΒ"°ˆMμ jA8U± (Wf€!ω!� ImageMagickgamma=0.454545,,‘ƒ(((999FFFVVVdddwwwŠŠŠ›››£££···ΙΙΙΨΨΨιιισσσώΘI«½8λΝ»�`(ŽdΉEA€kͺ)Οtmίx�ο|˜$0°+Β㐒œ(Η'ΤI.«WcvΫΔZΏΨ§x f’•έrT›M£%‚‡|N—~ψΌ‡f"|†2‹L‚Hˆ2” –Ez& œ w šus �r°± ±³�ΈuΊtΌ―ΆΎ²ΐΓ±Α·ΔΉΘ»Ά΅ΕΚ½ΟΏΆs©ΦΧ« ΤŸœ r© GŸ’B ΥPγ N δζθκ 0Θ F}ΚεΫW¨žB ρHΌwαC(ηa8Ȑƒ9ώLΐ“wαΫ“ΘαΔ`‚4H@α€'Ρ„9Ϋ™Œgf=ƒ.£•σ˜OhG₯ EΊTιPW@ŸNΣx­ͺ›N- 0ΰ€$•¨8θ3@`ܟ±δ¬πΰ€ͺnΖ–}ΐI߁Ήg”’πq…QΫβ…¨w°Ήf%HLApΓ$|7ραΒ–0—ͺ›v,€υ|,d™+‘   χœ’lpŠ›-»vRMqKeΊΫ)οίΎƒλ>\x�V“߀́A?#άΒjˆ€Ύϊ˜R[aΰ„–ΰ“ΐ–¦υ!Λ9ŽΑφΙ‡έSP>ύσΧ‘ΜΏΏ^±‚τεώ~θ1‘Δ€„™GΑ)γ‰žtNDY¨ΡE,/έΑš¬Υ’sqάfTn#φVά‰%—’q΄‰Ψ"‰/šΈ"Š1Ϊ‚œr8ΚΐœlΉu,X¨AwœbΟyΔ0‹$αUƒJΥY„‘ξ…7₯ξ!€$w‡±B•P €”aΚα₯γ€C¦˜΄$!­‰ε˜yf›B�YδœθγΧ¨Τ @B¨†žr—Νς_ Ϊ£€2ΦΘ"₯*ZJ#¦—Ί8 \9†ZÎ0x>–ΉθΌ€L θcέG°Ζ $2=Ί_5�ΒΊΐM/ΕΤ@¬79ΧVάΊ`ώλλ­&ω,5Ψλ°²έLRπ΄Χެ΄ΨB;7Φ’«Ήώh” –g©ςr"“{πBΑ,V±y*π€WΚι¦gzπŒ kzœ¨ΟπαI„P4ΰή)ZP °πρ§žμ΅ψ•/ΘΠ¦\K°rΜ$kl2|( ί1Οάr’>S ΐ<=Γ37ΟAρ’΅Κ 4L/ςǚύ³GΏ₯` l9©q †2vΎ@*� δ™ιη‘&ά)Αt,7Βu+|wΓ ΣΑjΔ€g@*F αΛ¨ψ›μˆΧΦyΦ5f§�ciώΎ€(ΛΡnN³δUΠ΍o.«ζw]’γneKA-ny+GΤ₯?~:λg€zλμ†χu +§ύ�β9―ύˆ KΏ†€ά7 ±°ΓΤOoύήΥcύ§ξ}MΡoΐ–vγιJΗpσ96Ιlιž ‡c₯ϊ¬ω@AΪfω˜ΌΏμtΊŸbάc?ωxGpκ#]lhR€φΜ£€  |Ζ†@jΛK*Ρ• VV: MΛsΒ)ζ'”’©ϊD+΄ΗΒΌΝΝn.Δ g¨·>μ{8ά€ !Έœ)#D‚ΪWυΜ:θπ_“0°²φέAD€z@“xΐρ©@ώΥγD)ςΗ ΨβγU0c‘H SC/DAmjZ6‚•‰°l―�B+―ΊεAQ:Sˆl˜=Bn†/¬!"e¨Hω-‡Δΐΰ0P ΰxΰXΈ1q@iŠά—`‚, N`ΗS 0€Pβι“‘\ΐΧ°˜3Ύ²•Œ.!ΓI xr—a₯>2‘m<€|Ώt₯'A9―^~G—‘d ͺ’vp K<@%zT™’²Γ3v”@ΎZB~•qL‚d†:‰ΒN¨¬Σ"Š δ9zΚΑžχyηOŠ‚Ο~κsž�¬gQΙ‚Β €—Ή§hζ₯-lj’ƒγ‘eΌ¨.‰3_ΦA>Κ“Cƒ*δ€ˆΞ²’`’γP0“¨ΦHη0ž %dP ΒGχbR‡ΐτ#σ˜©τκPFΤόδΣ)Š.ωm€ʚA—ΚΤ r*MδΠ@04Ζ}œ±κ)?(ΎδY ͺ2ιƒπUΟbŽ^W¨šV΅v }`έΓγvpΦ¨Ϊυ�+‘φΚΧΎ^―€ μ `Aό φ0s@R;!ω!� ImageMagickgamma=0.454545, ±4…(((999?@?@@???@@?@FFFOPOOPPWWW`_`gggopowww+΅B=΄QBΆV-ΖHν©>ώΆ?€€ηͺMώΊ@θ¬R€€}»‡‰‰‰™™™Ÿ Ÿ©©©°°―ΈΈΈΦ΅†ΊΚΌΡΘΌΔΦ΄ΕΜ³ΚԞΟζŸΠζ‘Οε’ΠδΜΜΜΡΞΙΟΠΟΠΠΟΟΟΠΟΠΠΤΤΤιιισσσώΐٌ&Μ`Ž•dεˆΙ‰B‘dB­Z%Ρgšε³Z0Ψ+“Ώε�zœ^ŸΟbο»½ ―ις8έ F©ώ)‚ƒ)(u ""” ‰ %Ž3%žvxQQ 3 §3.”« B!  -3 b  ’²Ί Θ1°B ” B Θ0ΟΊ3"½š03- ‰!Y-Š !σε Α€ul{ Μ x矿ώF),#PAƒΣ4˜MA‰ αΠ‘€DΙ’#B°Br‹m4FD‰P₯Λ‹οΌΔΈ’’Α™ aΪ΄3ӏώŠ? 2F"Z(θ&Ύ΄€ρα ^΄’žhΠ-'J1hyc0Γ‚3’ΖpB Z8@°N[  hΕϊΠ‚Γ€`PκΕ}†Lp_"8qΤάίͺZ|(πaUa§-4 žΡ 2ž(hΔΰ@Ό!1Z -‚YŒ°Bt…¨2cΝ…΄ΚLΙϋφJ.8c~Ξ³·Wά0~†#K–„,3²d•“{²kίΞ½6χοΔΑ‹?>Ύό Ÿ@­€‚Q!0TžΑaΑΊ"„dΣo „!?YˆΠˆ  ΞΫtΠ€|λPYgλ ί*­ώ„π 1I eŽiY,Π 5Θ°2C 0$`ΙY8P@ Ψ7™ B4Γα *F‘23Ό B p Ϊ|ž&Δ<σ‰ aU-΄pyX’—eyήm™]—^V&x`Ξ`Δs1αDSPQέcΖ †:YΠ)'vΒwηyΞΠηžsžH λ­°^ ,΄χή‹€ ’*RnhQP9ˆ­DΒ ,੝zκιl3ΜΕΥŽ’Υ™jρDκ§4BHyΒ€ϊρσ@W¬f!cΖ°«:*Ύ—0 ‘3|@— „†Œžς€1·p ‚ζ…ΆPRγAU€jΧηŸακYgΉώeŒ‹�κ�{ξ»xΞ0hFWΑζF±uUl`.y’ °ŸEpΎœp ν¬ Γ›pΔ λωpΔ �›ξΒ|ρΖO¬N >ΚΒΙ,jθ†ΠC£B€βX~1˜Γ `+b€1 H3ΒLg UpΞ$πδ§1 Α.‚X%Ttέκg€Y!2ZSΣ DίΘApQu€ΡIZδŠΗˆP<&©š.00権 @w€$ιÁŠ οΐ!Ξpΰϋ‰1Β†ŒΈΕŠƒΜ8АΏ›8Δ’MΉΗsŽ9»7^°ΊcΓ™τ&q₯—^d›%E0ώ F+^:Œ"›ώpν΄Γ(4|­Ϋn΄ξ΄Z»O{Qh!ΉνΔ±ρ½{ £οΌ7ο±Π�ίΌπΖ;Oύςπi�1τΣKoϋ 2Δp‚Κ+ œ²ΚνΠϊΛ @άAykP₯ςi‚}-% Fσ\‡=δu`D;žοΤa₯c EJ‘Α4p<)•ΐJ (ΰ,ΒΡ δ y(€Dΰ€pΘ…¦%¨  *€ bπΌhI‚+`Π½Ν?R�@bπ!*HbT°–$›β_aΆ<B,{ΐs]Σχ½Ϋ…ΟzΚ£ψΈ½2~ρŒΙΓσώ~xΎΦ‘1rfΌžψ�χΕ9�qŒwŒύΔGς’ŽΟ³£πάH½γ‘QŽ{$_P‚ Πλ( 6)ƒΫI’Φ‰ :ω‚›M²“0h_νƒNJP°< YΚ Ύ’―ΌŒJ©K ΪQ—Κ«e/eK`ςς‹Ήόeο‚)Kdϊ²˜Θ„Α1{ηKe3’Ν€ζ+Op²ψΙ―›ή<νT“?j±…TTŠ =`€ΰb'ΈVΦrΪr—·4#ΔΈβHb’HC²œv<‘ Όΐ «T’γ±Κ—-˜Π {Υ‚iΓtαρ@EžΝOIκ™dπ‹£1Π€B‰ώΑAγ"‘TTσ +†@‚ J2›™Λ|Z“–ΩΜ'4—9MŸώςš� jO΅iΜ{Vσ¨@uκ5“IT©N•Q&.Ÿ*Λ’R«Μ΄jψ”šΤ™r’.A(@ Œ “”δ+%9x@€@6ΠNV)�œlί-{<ΉΆ°΅<μΤζz³Γφ-pμ`΅ιΠΘ26±’½™e3λΟW.V‚₯Δ¬d!ΛΩgής³…m¬CMΐΪΦΊΦ΅'p5]°CXBv³UΚY•¦ζ‚`Hp³·4lg+WIc³·U­gSσWΘφ―ΐ½-\#»ΫιwΈΩ„«\­ άΕn΅…”βRώ₯ή¦Ζ‚1¨-hλXΚ΅­cI[ΪXV6ΈΚΝ,}Kλ^ψ†ΆΎϋεl―ϋί�8³Ζ―|‰;‡2w·’¬�„­αή–ΒΖ°vΉΫά CW»�pˆ%œά CxΔ$ώ«f=Œb §&Β'φπ‡C+γψΕ!†1‹Ulc§˜»I!Aο’”€ά₯Ί=Φπ�ώrγΤ5x@νkΠςΧΰώP=ύΩΟ�ώϋ��(}PοσW«ς—zϋώ€ψ€Ψyœ7€(Xyhyθy yθy#yπ—”W‚ ˆ€š§‚ψ‚0ƒ2X|@ ΰχη4π @ pQ` Θ4P!y χG ‚4πX"°ydq PXRy3 ΠƒD@ίpM(y(y^…Sy΄… [x,Xy5xƒ9Έƒfy?83Xˆ†xˆˆHz†4`-5Πp!X%π\Θ… πGˆƒ/πˆ Π5@ˆπ7ρχ5‰˜Η5Q Π€/@0Š₯ώŠ:ˆŠ °‰U¨ŠŸ¨‰oy€X‹€Hˆ•ψŠρ†�6±ˆ‚–·ˆœθˆ(‰,H‰‰˜ΪΈΩ(¦X:Phπˆ"8€H(‚χ‡Β˜ π†iΨ„πG„ν˜yDЁϋχŽ :Θ‹X=D€σ˜υy5πHςH/ Ž x‚|†ίŽγεŒάΨ‘ω‘ΈˆwHY°ˆΐ‡!xΙψ} ΒΘ‚Iyεx‡ϋg‰Θ8“4Œ?˜’έP“ π§’g‰2I“οȊ h’Γx““'’‘G’w’υ—’’\Ω•^Y}ώεθ”IŒ5°ˆ{ˆ.©“υΗ“Δ8Β¨“Iy Psx‚ΙΨ“ωs)sΩoY”nˆl y4ιτT9—u)•’–κψdi–_9™”Y™Ι·ˆ¬h‰¬¨—5€Š=Ή’5°•O9‘ω7—ϋh•£ 0yy'Ή€ 5ΰT˜…�Θσ˜©Ήšy¦©ŽM8—Ÿ…ςךχš{ˆ˜’‡™§™ΌΩ™·h™Π�‰{‹θΝςŠ“GŠ%y�XD ‰Ή‰€CπPȎα‰yiH‹"°„8‹δy˜χΗ}P‰ηi›’‘7žˆA‹X*-ΐžšΘ‰ π… ‡‰˜5`ώΨΩ‰…Σω ‘ͺχ9Έ•Ι8‡’§Šχ§Q‰‚@Š`ψ‰Ή—”‹‰•χ‘QŒh±œ·8’nxn™’ ͺ†‘g‰Yƒmψƒ'J‘KˆŸ)z‰ `‘–ˆ‘z€Hš€—·‘JŒɁΠ€(“£T ‡Wš€Yj₯Pꁟɀ–7J:¦dͺ€Κ9yΖπšμx€gژNQY¦r:§ΡΉˆF yKH‹Ij§”—§I§€¨–)Y*§\*¨ˆš¨ŠΊ¨ŒΪ¨Žϊ¨©’:©”Z©–z©ΤŸYy½h‚[š‚pͺšθ(‚&hͺο7ͺ’šŽ’šͺͺzͺ―ϊͺ.ώ(₯X«¨zͺΆz«² «»κͺ°Ϊ’ɫš«­J¬£ZƒœHqΚ•šϊy„š‚Κyš*₯™7­-X¨‡Jz�πΐw¨‰ΨZ¨——­€G�žJ‚…*›ͺzš*�΄Χ¬•§‘oΘd²Ι™kZ‰?©Ž—Θ…ςΊ―ύ*€ϋΚ―{�*°[°;°ΰ¨°―y° ‹°ω°λ°°Ϋ°;±‹±ώΚ°Ϋ±\x§y —Kx=)―ίjyeΘ…(¨•‘η YZ†ψ„3p―šX£χ‡`§Žς2›y―Y]Hψ…Κj‚F‹³˜΄mID€γj΄ΛΚ³4 ΄X£ΛΪ²z¨ˆώω³ Ϊ³šΗ‰?³3ΐ}_! �4Ky–HCey†!ΐ’QZI™―:° °zλ± ²Ϋ·‚Έ„»―{Λ…‡›ƒ{‰{±~[ΈŒ»Έˆ+Ή ϋ·"Ϋ‘$»yοxLτ}† ·ξ y3dEε)Žζˆ§qۘoψ'‹³P8‘ψ}―+q;Ÿ™Ί—2@yΒI»²›»™Χ»Β κΐ ²�“GΌ©Ϋ»€Ί¦;�ω}!ΠB΄k΅œΗΊλ˜‘ ΐ‰š‡ β ΎΆ‹ΊάWαP†3Š¦Γ˜‘-9—GX»H—<Έ•™›·KΉ ;Έ†«ΏϋΈύϋ·‘ΛΏ ώΉ“+ΐkΐŠKΐ¬ΐϋλΐ{ΉάΘΊœχ3Π€8yπΫys™‰PX’s‰»„Ι g$±Έ¬’ !°εˆ€+\ yο(Β•Oy- y/¬‘ …ΗΉ•9lΊ¨Ά—Β;Δ>μ«κΒRΩΑ’W7'lyͺH­ Γ 3|ΎmH·”'¦X †Ι^Ψƒπg› *Ώ“GΑϊšΏΌΐ ΐ|ϋΖm± \Ήl|Η€›ΗqΐόΏsμΈό+ΑΫ¨Ζ™—“•g˜0¬’š…ςyΨ°TκŠ;ΛΓχj‰μΒ0Œ—|1`Ί‘  ½6Ϋ’ΗΫΌŠRνྈiνδήͺ<|‹σŽμ|˜Χ•§ζ–'κΙΩΕXjβxΑ .ιXμ靎½&Θ‰@Ϊ8zzΎ―&HλlΝκ/ΗOΦΟέQŽέορ±nΦτά•κy8ΘIm€ιΩπ.yΊ³c.yϋmΠΟ!ΉkJнpŒ„)Ώq‹ϝΏτUοτ€Ψ½Q†SOŠa�’5@"` =™†«ΈyΐσυažΩ ©‘ψ™¨¨΄V)yGy�A2ί:ί§‰@ˆ άC*Ž$<0ЈX=δh=ω­žρ–/ςΈžωDŽω›οδš²^ Χ›χ…c©ΑΒ]μ¨ ΅σx‰ω'η8_–Ε]y‘x‰O³χ"h χNJ�τ’ŒΡ"xϋ›iϋ˜8yΊ‡Β_•\†•·-€„&ϋš¨ϋ�ŸϊpHύbΉ―,χΗiyΤΟɈ)ά@dόώ �bήϋ€ΏιQh%9=ί”·Βχ'‚Ζ “»ˆyBˆ©ι·ϊ%Ο•χ_™ΔGψ~@0@Ec``T.™JD²5 &Υ*ΥC±(φZe"›`₯ΊŠ—f%9œU΅Η\;P€•>~ξI*@€π1Qq‘±Ρρ2rN ¦²fA2Ss“³Σ“1€¦e΄EξσT3ΰƒΖΥυ6Vv–Ά‘�³Vw—·wAƒ#˜£—xi ‘Xy™ΉΩ9ςΆ2χ™ΊΪϊ;;*!ω, ,™ƒ(((777FFFVVVeeewww‰‰‰™™™£££···ΙΙΙΨΨΨιιισσσώΘI«½8λΝ»�`(ŽdižS‘�+1 p,Οtmίx�οΪLΑε'!‹#ΐΘ<+Dε…RͺN€vΊ΅rΏ�¦Sϊέ*Ε`ͺ7¬.—±LΑcώpΠηžά_}"€}IB'ŠŠW‡PŽ…'’ ”@ƒ~‚F žž   §’Eww ΅t·ΈΊΈ vΎ»ΌΒ½΅ΕΆ»ΗΉΔΐΖΔΠΈΚΡΑ»ΛsΏΦΤΟΪέ΅Σή»yšδ ²‘ι£₯° tγ Fοd D€¦W sνψ«kž ]π§JՁsψ(QD‚€kP€ƒώδp±"Ύx&φ΅£€π‡lHP@“¦±€΅c°Α$ p§9α%eΆΫ6₯Υ’r“ uͺΥͺX™RΥz•kV§M‡…3΄œYE=Τ€Y'•@ΐί)¬$ΨQ8ΐLEη¬τw€ΐΗC„S=xwΒή X lψ§Κ‡7`Ά ΐS‚Ο \Ζ}` 2☦5£Ξ @.ݏ’CxkΐœΨfΟυ§PNYž^Ρκψ €A’³ έ –ΉXηמwm>]ϊWλ^³SΏ½ϋSνΨ·ƒχ.μΑΈ³θ/œ α[ΑαrΞκγ‚V·+¨ΚΈ xΗ£”ώεΟPν΅fžχΰ gqIFA0@€—QxΕƒFΨ™ΰ€€Nβy]@ψ‘�δ%Β{ρAp=€\!a,–γ-�M-a‘έwβή‘BV—$wD"Ωδ’γ=Yž…ιUι£Q ht„m=zΰΟύ  $-"1a;³² d³½° (a0¦fΙΉ₯ζ’΅άΊη€hi*ˆ§{ Z”G {Š�β›ΐζ£p‰NΖ`?pYA1-6ŸyεC>ΈYκOΨX°žrR™κͺΆΚκ«J�««³:‡‡•ΈVg·„ £>SJL€Β`PVpγ>ώΤ ΰΤμ³ώ΄fΗΕΒ£‘U0mΠJϋ€³ΰFK=~� Ψ!ψ„¦δ�«�ΉŽΗμΈΤb)O•°l ¨ύΊ‰?7uι ‰ Ό 0ΰ€"±ύˆ*­Lb₯ΖFBΩ±¬Γr­$γRV�ιY܁+Oΰ0ZT.0 3ˆί"ηO:ίΐ/θ,s4›7ιB}Ξ$γ-AΫ³M3±RΟ<Λ@"σ<@ψLό¦rBM5˜F=JlO7M•�”d�Θw.PAτ/Kh‡Ρ:rκr%o,²ΰΜ±“‡{Œψΰ†ΫΚ6Κf©LΘέ΅¬Apώ'·¦€OͺwΘ„-»¬οΏΕψ >±l­ζœ―R·έ²TΊL§ϋνώZΊιΉ“Σ˜z=¦·‡ϊμj`ϋο:K€9 Œ€τK²'άλZp¦~ΡΚδ€Šη˜8Θ„¬~ϊμ7^ψβο+�ψ­£w*ΜrρmΙN σ„€ρά¨°η°Ωπ‰]’˜δ ΝΠΤ@)*`@&°Τ@h9p¨2 ¨Ψ :sΑv&i¦Β ΐΏ8μ#� n�°@ηZΒ›ΑŠ"V4 `CŸϋΦ7ΔφΑˆG4’ό„˜Δ"ށaυΣB>ΓΚΙΗYπ„ώ0”R@€eςή―ψI(?fδbkθΑU€§0#Ϙ9,’ΤΙ `—ΜQŽx¬£ώh!-Ra†=·$P`BγΨ» ε²κ™§§πL€σ+‹‰K<Ÿ(ΧΔR†’”§|Y’x–ϋm\΅±$JΣ(·ρΙΐε]ϊw΅Ÿ‹—• &έSΕΈδ#0¦ζ(ΠF Δ�–Ι”Ψ1‹ι¨Œ ™©ψΣϊ3άD!°1£©)RS›Φ\ 6•#δ2—Ή‰Š4@Y“ΆΑ <βiŠΰγ/Κ° ι ™8(›$:•ωPΙΔT‚²‘eόν"κ8(²RSτ@@υS‹€Α£G E‰'ΰΉ›]` # Κ?T€�:δe€6άV š„Οn+Ν’"—yαEZλψψή΄ggvΪ�£†”~K°Cζ2€RŠ.ͺ3(ιFbor»¨XΗJΦ |²S-kΦΒ.2Φ―~€¦]r½$ R}}$ښΧΐ ^5,I~wƒ·B.2U«d'KΩλ&˜Ν¬E+ΛΩΞ:“O ±«gQ΄Ρšφ΄¨M­jWK\"ΰŒ`- RAXΩΪφΆΈΝ­nwΛΫ\E!ω!� ImageMagickgamma=0.454545,Φw†(((999CZ ?@?@@???@@?@FFFOPOOPPWWW`_`gggopowwwΘ<;νNJθ\ZύXSκa^+΅B=΅QC·V-ΖHν©>ώΆ?€€θ«NώΊ@ι­R€€}»‡‰‰‰™™™Ώ‹Ÿ Ÿ¨¨¨°°―···ΧŒ‹ά‘Ψ·‰Ρ½½ƒΑΊΚΌΡΘΌΔΦ΄ΕΜ΄ΛΥΎΡڝΟζŸΠζ‘Οε€Ρε²ΨκΜΜΜΤΛΙΗΣΙΡΠΟΟΟΠΜΡ�ΨΨΨΰίίηηησσσώ€**ACD…C…††‡DŠŠ‰Œ’‘’ˆ“–ŽŒ•›–œ™ —ž’”₯£˜¦£Ž­ͺ©°¬«™�œ¨Ή±΅―‘€‡šΌ‹€ž§ŸΕšΚ¦Μ�±ΗŸΊΓΎΠΐ Α₯©‘ͺ°­�Ψ³›·Ηα΅΄βΤδ»³ΰΆΦίΓζι‰ή«ξθηΧπχΌC=.†H° Αƒƒˆ°aC†.L±’Ł /„¨‘£ΖŠ-z ™±γǍ'†tΘP`ɏ/St)ΣbL‰7OζDY³§Δ“#ξόωq₯O!FYΞ 4e�žOU.58TκΡ«X³jέΚ΅«Χ―`©V¬–"Σ²hΣͺ]ΛΆ­Ϋ·ώ2ɞΝS� :ΖήέΛwo^‚ 3ΖόλphU»gmRŒ±&☠ϋ|ΌΈρήΊf%σE Ψ²Β–ιφύ{S.cΟ¨;o$P³κy9Φ¨"ηΧz FξWγKΝ§SRΦέψΆΨ‹Ώ7§φ͜ψεΙΗCoŽΊ΄ςλΈ“σΞέωtIΖΙƒ)»rqΥΏKώŽ[(ψΎΑοͺnΉzστ±ΛΗΈΎ=�Δβ™Υžkμέχέ5„™ V·ίqzη`xπ%Τ_f€iGΥ{ZΘ_~Ω']ƒ V7‚Λyψ\‡~ˆ’ˆϊ!Θβ‡ϋ‘Έέ†ηΝψΰx% c|2ΆX£z‚±@ΑXώΐ ŽD l°-0IF/d Α˜ΰƒ‹9Κg₯“ό‘gΗδΣEΦ™+Ž9㘝‘φ¦rgΙ •b†φ&Ÿy–Ήη|B‘ƒ7ά βi�(fF¬]¦ηƒΌ ηzkΊhζ₯:ι]ž'zͺζ{’~j‚±έ©f˜}>z'‡r:ͺŸqΒ:)vt6f§£Ά :⎭žXjޱώš«_`v:l«Έ‚ΗgΛ*K$™Γ΄ηρΉΉž ' pB ο&¬f'€Ίͺ™υ~σŽό:Lc#”01{ύΦΰq ύ�(¦4²Ι4+pŸ›"\°ΑGέ/Ι-­pΞNKL΄ΔZSύ§ΥH/¬tΒb;ΪπΥ_oνvΦb+7 { �Έβ’Ϋτx5hΙξΊψςΎ₯’Œ΅αw+oΑωb]^Θo+5β{?nxγ”§Jωg΅ LΉΌ5δph‰Š>Ίθ7θ °)tΫƒ3Œ‡Β&—Ή7ζ<. 4Πΐ Δ.0 °χΐ‰.Έ¨Ία u;Ω<ε ωε=(Πzδ”w©εώ‡{ο©ζˆs^vτ†λŽ;ΧxŽΎψν{oΎϋɟ«Ύψ’‚ο9όγ‘yyλ δFΐ ¬ΐp-ΐ›9P%’‰ΰo�&HΑ Zπ‚Μ 7Ψ=Ψΰ6‘GBx  @A>6 @@B °Αύ ;؁“bθ€/]ΟDφπ*P€ ΎT½ Π έΚa'E’υŠMvpΓ t1@ΰα|FΡyΦ Β—7 ΈΰŒBδΑ0Oν?8#yΘΑ>ϊρ€ € 9ΘυωΐΨ’@ lνΠnxγ€$ΕεΓωm]`WNώΘ?>ςΟGlτž'=©Ζρ|±‡τή)+ΈJ †’•ηb#) ΧJ’Ρ Q$Μ₯ Lθ©D@X€ @L€˜ Α πΛ8`I„ή ’KψΡI#X€σ‚ˆΓ„ΐ0@π€@%O 0€<@‡#p@p€4j@ΐ`½ ΰθDγx‚–`™ΐpΓ&ξ€wMgR b>Š3˜g"€νyq °€€4@@„η©ZRπ•l₯,ΕηRψΥ”0 LSΩ½›ͺrƒ9είNΫ(=’ρqΨ*PlMΰ\1άΐ$Ιώ©V5\0₯·šIbς„lτ©§ByΓ²zq–‚σ «i8(Ž΅[A#\Ω*Έώ`–n-%*QωΕYžλ‹}•«ίJX£Ξυ°zΟ-A(BƎπΌΤbοTƒ< *θ(gXΓ(ΰλ ’Haπ,/§imιςΐΝ ”6$P€ΰb Ν€@pΠ^x„!B`)`@Y‚t FΌα€‚ψz"Eq•Ο   ΐμv€t '@̚[ιŽ`ƒx@Έ›€aŸ”Ννφb�β ψ.»;ώu°{l`{κ€ΐς1”―Œ+)azZώΉήυ\yEπ[L9ΐ>ςΐ…°a3 ພΒNl))Œ8 Γ!ρwˆa€^K©Lujj{(U«RυͺY pW½Ί%΅’��₯„b cΕΊήΠΗ<Μi ΙZ`­¦ΥÞ\λVO™Φ.Ί5΅]Ό!f¬b! 6ΛS.₯'―\J˜uΛa沉¬Υ0£�Μγ!³”΅ΌΦ#Λ‹}μAΘg.οβUγΰF:Žg†γ / f+[8` ψXUP �%¨τ₯/-Ρρ@€Ÿρ<@ ς¨€ρF‡pκ‰n7Ό.Ol¨qΆ]ήͺ[Bδ5 Υ?©JiOώ A8άΚθUοΏφβ@‚!« όμNpΓΨ6ΛΈ–¨ Πή;–ΝΦͺY=μ$9«ρΜu.σXΩΌU7ΞAp7˜Ρb/‹Qέ[ewœούξ­’yέ"&cΎΫlΦ7[™ΰϋζς+ύΝπ4 vΰς†3-Ž`zƒ™Κί‘‡Χ D^K‘ŒΜΦ‘0Ζρx ’“”$|lη\�«X²5Nπ%{ψ‹ψήΉ Όf§vθ,u~d¦λ΅‹Iq˜ΛŠdͺKβD}²m¨py›υλοϊΡ±\τ΅¦[ιR�ϊΦ՞ο[β`Ο7Θζ~ΊΗξΑ>€ }@‚όΊώΰ…7œα ={C `»?8ό©ΗxCψ� xΌδ- F2–“œP‘ˆk&Q νΗMiœυπ;ˆCqˆ^;SSόœφκΚκ$ 8Jπ€‚ŒόDγ΄Iΐς D›£ `@:YΠχVοWΗu XŽkn£Σ³:τ±”uNs�G=ή`§ϊχw.u…›½ΝγW;ՍΌυ«{=λδoωΣ?υ΅o}όΪΈΣΟNυW½ύΕχ~r₯uς'vi7ua‡dg~‡~Z‡fxdf+P@rΓψ¦Vd”@ 4.Ubfςχ&ΐcκ"AwZHgu₯V+W|(fΛΣ¨e+ώXe[ff-xZ,—eŒ—ƒ+—ox΄s3€#Vsddd,‡tςφƒ>Έ‚�V€^g58€9hJ;8…pΦ?¨‚οV€§ε74t—(u7wdXw3πƒx€wΫ�w@@z,'x>^ƒπ"ΕrΐθE…^Έv9聃ΕZθvd3”MjDzfζpWγΆε†G±εͺgfγΦ:iυkfR³Ηj[GMκe;@B?P P| 0ΠΠvjf–L.„ŠΠΦα&8‡7}gεP‚3‰A z@€VCζ…H˜ZJˆ…LΨ‡ν‡ePˆd[¨ƒ^Θ‚7dŒ@Έ…\Χ€,xFψvΖ~ώKΈ…MXΚˆ‚R€GΘƒ=(ZθΥXsDΘh…bfeYX|οxtφ…K6…�φŒ=ψdΨrΥB@rt„•§V/§@αR.5H?Πΐcξ�ŒgƒEΘθΦ}*h…Yƒ@)+I”7Έ‘θq37.pœE= ™7Ω‡,ω7π10ȏ-W„')ž-‡G!Y“fΆe5Έ‘)YŽζ˜ X„}Έ‘\”G5dfXˆϊ™ ±yœπΙ‘ šGͺ‘ ‘Z…ϋˆ *ŒώJ}ϊ' ‘"κ’xΤJi:¦3w:Š3Π‡G•Ω₯_Ή —αΰL΅E΅5{Οx‘1šƒ1κ¬₯‚"ʘ šPπ¬ffή–Cλ€Pο‰ο”Cίfƒ₯PŸv˜©§P₯6FγF| ΕPq8ΘOFz˜§£φ! Pςš*p€υ4•Ώ΄Έ 0%•ƒ °šκ’x‘Ί‘κY’(Ί’κ "*₯1Š©Β8’κYͺJ©Τ§©’Š’5šœΪ’šJ’ͺ‚«J£₯Jͺ§Šͺ²z©3ͺ«.ωͺ« Š₯Š »šC;°G2°<ΐEΘΚƒ[τ<Π %ώΠ9T…J}= p€" ₯0›– ­ͺ¦TΊƒ–šͺπz¬cTCΫ €<Έ­Σ‘υΪ�ρ ͺ54―0ϊ�z„Π*°χΚ―²Š¬k΄―K₯\”―ζΘ°ς ― Λ­;02±»±;;ΐΛxώ £>P€‘Ț�ΊEψj°έz°λh]šCjE³±4ϋ―犳:‹²υJ³—Θ°!Ϋ²)K’Eλ³κš²z‡¬‰‰λ©,λ²ύΚ― K―ο:΄λ²›�Tk³ω­ζθ©‘Λ΅(»°Wϋ�-KΆ[[Ά1Ϋ°`+­Β8Άd;± ›³,+­j›΅l+°Q΅)ώΈ Έ> Έ‚›³‡kΈQ;«„+Έ,kΈV»­) Ή“«°[Έƒ­ˆ[ΉŽ«Ή›³HKΉh[΅›ΛΉŸ΄ž[Ί‘;«ΫΊŸ›Ή9δ3ΰ0 »xI»³{±°+Ή»;Š€΄‚ °€[°’ΈHt€ά6Ό‘«Ό‡kΊΞ›Ί₯‹Ή“λ³ΐkΈF‹¬γ&]Ρ:C/τΌ »»ΕΛ»�jΌΟ»Έͺ»ΌΓΫ­•Ί‰‹ΎΫΎβ‹Ίβ뾞 Ήα;Άλ»»•«ΈΜ»Ήg‹΄�›ΎͺKΉΝ[ΐ|Gœΐ Όΐ άΐόΐΑ<Α\Α MZyΑ ¬# ½LΐΒ‡[\‹#€—"œΒ*ώΌΒ,άΒ.όΒ0Γ2<Γ4\Γ6|Γ8œΓ:<Ώ;άΓ>όΓ@ΔB<ΔD\ΔF|ΔHœΔJΌΔL<Γ£‰O ΕPμ•^)ΕQΕUlΕY|ΕWΌΕ\,Ε^ΜΕaLΕV<ΕeœdάΕZ|Ζf ΖkμΖUœΕqάΖmΌΕcόΖ_,ΖO<ΗnόΕrŒΗzάΗXLΗƒΜΖ‚¬Ζ*sΘΘ^ΌΘw¬Θ}ΜΗu\ƁLǏLΘ‡ŒΙ‹LΘvlΘ— Ι†lΙ”άΙ“Ι‘LʜŒΗ|LΚ¨ ΚyŒΚ’\Θ‚άΚ΄lʌ Θ©ŒΙ•Λ±ŒΘΉόˍŒ0ΜΔ\ΜΖ|ΜȜΜΚΌΜΜάΜΞόΜΠΝ�<ΝώΤ\ΝΦ|Ν؜ΝΪΌΝάάΝήόΝΰΞβ<Ξδ\Ξζ|ΞθœΞκΌΞμάΞξόΞπΟς<Οτ\Οφ|ΟψœΟϊΌΟόάΟώόΟΠ=Ξ@4Π}НР½Π έΠ-Ν]Μ@Ξ θΌΝΝΐ‘ΪΡΫΜ"ύΠ&}�(�*½�Π<ΡΓόND@iΰ< `Μ@€ΞD@έΌŸ0έΌΣ,=ΤD]ΤF}Τϋμ�#@A@�Ξ$@6Σ:ΝΣή|Σ@ΝΝBΤ\έΥ^ύΥ`mΝ.Ν(-ΝpΡΞΌΤSΣg}ΜmΜhΝ[=ΜoΝqMΜTνΦw ΝsΝώΜuΦ€Ψ‚=Ψν�MνΣ{Μ0»Χ)0Μ>#�0 ΪC   pΡ7KM)€Φ  5  ΖδΨΞlkŸ`Υ£]Ϊ§έ‹@BpΡAΐ0πΩ‘M̝mΣ€M¦]ΜA 9=Μ]ϊΪ˼؍νԐ-"ν”MΨΦ}έ؝έβμ� π ‰}̍'L=sΝE PΣ7#pδ=Μ;ΐΫ °D0¨MάCπήDπΜμD _@YύτmίψΝ]ΠΤ pΣΠήϋ]ύ]ΜnΜσΝ;φ­ΓD°¬•ΧώjΩΧΰ½ώ@Ϊ­η½Ϊέβ.ώβ0�Μ. ^�Šέψ}Σ'0Μ€}Ρζ=ΡΥu}ΣD°ω Τ>ά7ύΨFŽδPαΛ<h-Τ ΧMZYΡDΐ•mδάt-εΓΌδcξδ>ζYΝ(UžΥΙlήC°γΠ ?Aγxžηz.Ψ3\~ίΛlήΙε*0Μ*ΞΣ%0q­ΦΕ|ΣVε@Ναψ-ίAίNζΘ,θxΝΣ.�:N;>sY–ŽΧnεƒκDΰι•ξΣώί9my叞γƒ>…‡�劾ηΎώλΐΎ�}^Ρ^λ%ξc^Δlί­μΔΥώkmκͺ.�* °ΎιΛ ΰ§Υͺ>ιπιέ͈αŽζƒήΧ³ήνΛnν�α~NΥέ½ν$nΜΔ>ζ=.ί«οΑžοϊΎοώμ�]ΡΝήάD€μͺNπΰΣ6^�K}ΧbNλΠέB>δ.νΚ¬βɍB ρtλνήίFΤ OζάN̏ΪίέOΪ9mρÌρΖ^�σ^πΔ|ε Οο6σ8OΟQύ€�Μζ] Υ,^ΜφλΔ<ΰŽιΘςYMΉEΪa>λψάΔύΓmΥP―D˜=̍ Ρ€νίNoυͺIΜ[/υνξZσ]α»=X_΅ήΤμήξBOτΣ9ŸώχzΏχε\АNRΜόηN½Χ~ΪΕ,αΡ7ν�R.φέ―ήψ―ΜΞΤζmՐ� ―ών֎ξ”ου§ώ •>Μ›oΟα>BπΨ0ΰΔ­β§nγ @Μζύ (`ψD€ψ|ίϋΎ�ϋ-γί-οŸΜ9ΧώΜ€γΤΌόΘ?ΞΞoΣ̏ΪΣοη0_όΘ|όΐΏύάίύΪσŜΩ)pδ|ώΔ,ώδούκΏώμ―Μ‹ΝϋΓlγρ]ώC�p}ήώϊΏ�ϋ_Ωνύ€ 8HXhxˆ˜¨ΈΘΨθψ)9IYiy‰™©ΉΙΩιω *:JZjzŠšͺΊΚΪκϊ [Ϊώ@[[+‹›«»ΛΫλϋ ,ŒKΛP\<œ¬ΌΜάμό [klΛ)  80}ΘM@ή-ž^HΞmŽ.~Ύ~ξΞ^�Ύn�Žί.�NφκΩ#8_Βxϋtw° 8}ύ ‚qΘiΌ)σѐG‘ί,5₯Έ’+;²$„νΡΘu/ΝόsS€m‰H€@…Z„ Δθ Bˆ8`ΐŽ5 ’`P!zυzβλΧbΑ–uJφlΨ³(ΞY[�XΉ_ιšeλΦ�S½oέ¦-ϋw�ΫΆjσϊ5\ψlຈΛŽϋ΅ΗGΈ62ŠYHA*2ώ‘¬(3f(‚#!€f‰!αtN N…Σ!YΡΙ&’Q !§S/JAdκΤv·s۞][Q€β—6}j“y7ιΡg7δZHrJ�ƒl„κ"AœωVΊwΆF€¨)huHA)| BδΡG'N θ‘ ƒD°^ #!@B”@He]αE‘cƒ5&Φc‚U˜α…2–˜…!vψ‘W‚("d%:u’‰¦H’Š0‚6#6�_ŽπC%π£x‰”γ Κφΐ ψ½4~X" μΐ gN^™%’Jf©H ;R%—ί”‰%|Tae𑂁ώ.‚&˜uͺ9ȝ‚@ εw‘@ΰ•Ÿ @§άA,ΠΐΌΰ₯ K@Đ@Δf†ΰ€"Υ4@–~ pG ‚μ`š8C0œ.:ȍ`:"Š1n(γ¬_΅Θ"†·κzW­²ώΪ+­Ά»k¬.›+²DΰΊμ‹³�X£"#X ¦’ς˜¨’ΚζΒ›`2Υ ξš¦2κ«Dœ άΆpZεžτύPˆΉτ₯k/ν€.»ι€Τ|—�{―¨ωξ OWώ^λήSV²C @y'βeμΊ*x›ΝΩ°`MαŠcŽ-ξ' ©ά`ϊ€8ͺ¦JΦ§R «―ΗκΌ—³ώΐφ¬,³| νσΞΓ& γΟΝ*ΛΧΠE#-¬�MG­–B²Γα1rΛ₯ήΖ a,M|Ξ Χ‘ ΐU‘qV8E/Ψ€Εϋ½N©φfhηM–BΆ ΐΫkΓΜH#ΈΪτ.8}k<Θήζ½3¨Ÿ`v!de,$"d 2 θ6έΛκF„!dc‡₯Sc¦]M§ΖLB–xW5p‚?Δ<a’�΅©�ΨWΠΌΝσ�ΙOM<σΛ―|ΤΔN΅ΤΠ;mΌWΠV}ˆ«ŽΤ.�y%lψŒ6AŠ~λΰο„Tιͺ ”Ž#ύCœŸŸϊMΙ«―Χ bAψΣΙδ—ώΏϊ}‰Fχ›_ύ ͺάνN$”Ϊ_Έ?:p Œ_UΐAAΐο#„W hΉ»}ƒ,s~�W©,ΑI! ΒΦ!χ‘fPΐI¬R Ωm―W‰e¨ηI–P�9WεLzΘ;Zρ’f΄b=xDγβΣ�HE0*Y]Δbυ¨½1:kˆά»$tΓA8`%(O©QΔ<εnW)Ω Θ‘&]', ‹>GHC†e9'ΒήζΗ0Ω폩S$ι>gI˜l“ "€Γ %Z€‚‡+d%;yΙS’tΩ€*9ˆα:•hRr4&vξ˜ΪΑΘ2„ώ1©`}Μ’”ˆΰB܏ΐ±ΩR‚˜–9—„xk83Ι&!S6%ΩΚ„Μ(Ζ,’±Œa$γΝΩ<θ‘3yδΤ’gΕv’8Ϊk#Ζ�V8!°|™²‰>©t‚Mεmίh’ίw1Jε8φSU¦:LJ9’ ΏΩgCίφ€XΠ‘ α!ϊΠΤY3Y+G#pŽκ+u ΝhκzBŒκΛ£%¬Dζ–0`A:%ŸdΈ‡Q%XΠψ(Γ €O¬RΧA1g”Ρ+c£"7ˆAum™ΨŸΔ¦VαLdeΪαi½μ±σzge«YΣωVpjΘͺφτή"°ΚΛΣώέ•¨6@Ρ�N²‚lά‘™#ΊNAˆ[ ώκ0¦`°Š c79€αΣ &bι5¨ β~\Rκ݂ÍΖVΦnͺM Φ¦Y„�’ΆΧYv™š1κΪ„@d0„ί½­*£Ϊ,:"PžE©ŒM�l©p(ΐ粍ACθXŒˆάn”œhEcw«¨FΈr·­β}ηvΓψέ4z—jφμ΅!]D θZθ€H|1ƒ0Κ4Ώ]!J¨M¨Ψ+ΐύ"κ~ΨDˆ‰°Πi„œ/‹‚ΐ.‡g9C-‘ΒI<&X‡ΟUί C'ΒQ™ε₯p«ˆ›Šγ*~Βΰ†y`ŠŠώLLζΜC,¨*ΛυT$ςΗΟ€§κͺŠWί–)’w­^l²\έΊΕρ–םα•2“­OφΆ·v h»‘ ΰ ίw€ Πj2ΘA]{ίIlΨ€Ϊ`‰R\W‰@gΏνVΝ’₯μσlg,5 Ξ+Οv-=›RΘD�ζήuη$:Πͺ"4! ύ8@‹Η‡ Aœ»ŸŽ1‚Σpž- ιA<€z @Έ€6 2Ybσ!„ΠCPͺcΗ¨j$fL&―œK―ΐ†G( z‹Yo\Ε�lπ:;Κθ=Μ³ΣJmlWϋΪΒΖ]Ϋ8­Gw_Βφš’cΰκΠώΐrd †ŸΦyεuσЍΛa±˜rΦ FΔ‚Χρh§ά[Χ7!Π-Ž|ί;τ| "°ƒv(Ό?ΈͺΔQπ{Λ{±θΐ¬±qΛ"t—·­STŽWσΈ³ΩAmVŸ†λ΅Η H·% €o`δΓω–τGLρΫάσω%pŽβXΒ@“ΐ9Dœ~‰_JO§ΊHP υzε\θVΧ:D”>uς‘ϋ©œ{7ΐσ₯£Ψ" z&-|τΈΛ=CŸ»έ7œ©[μẃ^ $%šDΏ»αΏ‰Ί#~ρp@R’lΖΓΔεAχ ~"”ζJ~σœΊ–;ϊΠožώΆ(ΌθOϊΤ«~υ¬o½λ_ϋΨΛ~φ΄―½νoϋάλ~χΌο½οόΰ ψΔ/Ύρόδ+ωΜoΎσŸύθKϊΤ―Ύυ―ύμkϋάοΎχΏώπ‹όδ/ΏωϏώτ«ύμoΏϋί�ψΛώτ―Ώύο�όλ�όοΏ��€(€H€h€ˆ€ ¨€ Θ€ 老(Hhˆ¨ȁ聂!(‚#H‚%h‚'ˆ‚)¨‚+Θ‚-θ‚/ƒ1(ƒ3Hƒ5hƒ7ˆƒ9¨ƒ;Θƒ=θƒ?„A(„CH„Eh„Gˆ„I¨„KΘ„Mθ„O…Q(…SH…0Uh…Wˆ…Y¨…[Θ…]θ…_†a(†cH†eh†gˆ†i¨†kΘ†mθ†o‡q(‡V!ω!� ImageMagickgamma=0.454545,,‘ƒ(((777FFFVVVfffxxx‰‰‰›››£££ΈΈΈΚΚΚΨΨΨιιισσσώΘI«½8λΝ»�`(ŽdiždP¬ΔΚ’p,Οtmίx� Β6“@Ο¬‹AΚ1©d6%Θ%τ9½D©iu‹tv³Ζ­ψωνjΛN/σšώͺΫbsš+xΨοGCΗWO!<"nD~(Šˆ B„”’˜}'– v C {uxw ²³΅v ·΄·Ό΅Ύ²ΐxΒΆ½ΊΔvΘ»ΗΜΖΞΏΊΉΟΑΝΠΣΓΥΤΧΕΦ΅―œ:� z ζίΎ‘v‚ H�‰E ‚A v¬ ψΛS@j2#ώ!Θ\ƒ©CŸ@π’Θ{Iμ¦Q\¬¨BVpβζe•‰_eδ±9š(pΆΙη}y€§›{„I�zƒς™θ›€Ζ9p{2 „š&LϊΉθ©‘=Š–‹}ςρ’€ηA±€“M"yͺͺOJι*•―&ΙjͺSΚZ+tV^)C©μτR_Υf*Κ5ΐ€˜ p€Ž[ ώ7jƒi΄S>-ΰ;υ䀡 ¦,r‘ V<L[ν΅ζζtνd<ΦΣήΉέ›€9bž΄S·ιZϋVΎλΦ.ΆοͺΫνˆ*†°Ϋaͺ JŒΓ&7obΦqŠ4—€@}5ςR–D‘κρ¬ίΪ*¬$Ϋλͺ"ΣzςΘ&η‘λ Y�cβΌ°Άz ΰbπœRα‚φ v0Νέζ"@H³– DΛ1 JΆ 58�<-M F_=,]mt87€-υZμΦ@P-ΐΥlW=0,]Ν“ΦΊύ[₯P ή„=6a{ϋΣ;φ}"J²ˆσ£Κ%£Ό2γ-Gξxγ,O.yεώ·δϊ2 Šwΰ“Τξ"€³Έ6ζQ„><οd¬*€^ί;% ΐΥ±vυ μΔλQ—›aθώ�έΤ�Ξ΅nžΎ‡Εy π‘,;ρ?ϋΫ{_jB΄D+Ό“Β0™n •ΘY‹¨γz–ΘaΉεπ»ςγσSώΎόFjΎΉ 1o ©© κ�¦|ӊφΰn0~ρΟτΣ‘Νζζ€ΣΑ(P ž:5A Dπԟ)X(Ί+6fŽ0„α‰Κ2a‰`hΊΓ&°›ΒŒT— šP±G9GBρ»ŸλwΉ%‚μ‰)cbΑ#Βύ€W`ΰώˆκ΅ %˜ΑRӏ Ίθ|C  &5Ά‘DΈ#c4¨rQΐltγ`Μ—….θ‘DΖ γ7Ψα~ΰ1DPώΘGΎmm‡pd逆 tPC―0ΐΰŸΥ,ZΨ£†2E(�Ο”φ“"ώ’ˆΚ&ͺ�‰w¨’CΠ? lΛd)ΐΡ\w"GMM.ψbΙ%ž8 Œ¨P�Σ*‡ΞtT'@GΕ'9šρe3³ω+_B“›Θ‚ΙΛΡτ₯pΫ|ζω°©NjoΡδG v‚€e!XλHf=k³›…‚%τ$§˜Ϊα›"0δδΰ#Η–r �ΰΑ‘`i(CώkΡWUtGΝ(E'Ίθ\τ£}hH#:j΄£'Νί,w%ΛΙ<‹1™EπIh˜0ε Τ�‰‡ωδΙB;L‚Σ�‘Žfδ#hPj‡ ϊλ0L%j‰’vΐb¨Kjmhš·‘δ°§χt13Π°ζ4F\κM?AI˜rn+«\ηJWτθβˆuEOΑ&1]a‡\;*!Ή�ΉΑ°'0E%TΔ5+Ά­@¬${Θ*α±o%B9gˆ 6―  ­hG;Y·˜Φ΄-%­jCK †(v΅ΰΐr ΫΪΪφΆΈΝ­nwk£Fψ6³Ό%fφάβχΈΘM�r—ΛάD!ω!� ImageMagickgamma=0.454545, ,šƒ(((777FFFVVVfffwww‰‰‰ššš£££ΈΈΈΚΚΚΨΨΨιιισσσώΘI«½8λΝ»�`(Ždiž¨Dα²―Ξtmίx�ο| pU‚$Ρ’LŸN(EΩl.―Q€«εf«LξΆ+͚Ι^jX ^›Υ—6+§KΌ~ŸθՊ ?c~ZC€LF&SА‘”ˆG—˜›„† z•  ¨x{z’·yΉΊΌ·Ύ{ΐΈΊ»ΔΒΕΔΘΗΖΛΞΝΠΚΡ½ΣΏΥΑΧΓ�ΫΤάΦήΊ}ž(³Ό€΅ ± οο J —H¦μZ ς¬#πΑΐyυ& ΐ·!ΰͺUA<Pΰ? -R(Π@Ο€CώΩe4x1NΘR§Nτ£HAίGη&xp`@@#δaΗ`‚4'«‘lΙΊ)ύΆ8mM‘2κ4jRͺR«b½ͺ΅kΦ―\Α2{Ά¬γΘν0³ζMY:aup— n‚[IΠIiM 3wRx€ ς~€χ^|7(``°aFξ4ΑςfWp€sbΗ‹3ΣLݐ¦*ΔΛ-1Kpy^jhkΆ(Π±zΌΰ<γτš”»ƒt¬Uη[‘{5ϋŒ¬t±ΥŸgΎ}ϊuκΝ»což‡hZΛa>ς*ψ‚αsT~ ΐ+ΨVMhπ~6<βώΤ€§‘P}χ™ΐ”Uς@€ώα‚rA …βΈ3ˆ~A8ΰ„‘5…ƒŠΘ|%η_­ˆ(μΝvΐH΄ΈηXq’ΘCΑkIhxΰ ή‘F&©’K*Ι“O:©‹ˆη‘δ3‘Εΐ]ψU�=Ν·ήξZK ΊXϋμ’»νΏH{‚Α 6μJ θ&ΒΤ΅e#yΤ­E²Šλͺ ΣΚ1¬΅vςΗ"{lVyΌZiŽ@” Όχ@ΔσΎς“" `­Ώ‰"@Πλ]:τΏ87ΐ€Ξψa`'Ώ})™d­„}tl5pa΅ά[#ΥB @ΟVΧ’υΏe<ρΒ!P¬tž_Zp©AŠό”ΐL>μ’_©£ˆΖ̍,«α%“Œψβ*+ήψᏓGcΛ#΁ήώ|G"s’‚σO«ΜdΔ  όΣ+ž�{ϊ_Χ~+M3<�«{NΛ₯¨SAνζΙ₯)�]κΐ·Σζ~�q¬»}ξύζwέ L*AηŒΠTΐ†Ψ>˜Ή‘6y*.φ4<ΑUK␟lrΚκ;ή~ϊμǏςόλ‹Ε2ε!ψšAq fIτΐ΄p—<@tpό"ͺuϊq`ƒή± Ξ―¨Σ•΅(PP‚ `@AΚψ₯>gϋΧbDσ#ˆ…pOœΫ;(B °+Φ-$vϊx-€“ΐ1( ³Y§^sTPυ>τ9‘qM„’όκGEχMъφ«ώώ< Ώ–|(ΐζ΄°!UpAυ@ΰ™„Εΐ}€Cpc#D@4xψδG9Β±�ΛΝϋΐΏΞΙ‡YΐKό!FšG[lΤίV’DΟ8OhζH₯!.kΈ:Zπ°@B€θ‰&ΝWΈΘI‘~X¬"ό`9KY>Ρ•ΣΥA`9L@Š‘,)itΚόψG"@t‚hΙ(Υ*]υLγΌζ%‡IζŸΞψLMΖΩΌf­ΉΝύ¬(œεΌπ“zΩ'‘γ,€Κ™Νyfjœ�@g¦†I͍‰Jό,ζ^ΑΈ„Yΐ₯+ββΓqξ2ϊ‰γΕα~€βΌ�–₯FkΉΡ[F—%†yv©© f`™z@‘;ΈL�KπQ ΄ι Š@D₯SƒΘΤ<Zδ"΄(¦0θŠ…ΤΞΰb ˆd‘@ΣΣ’Μ₯R5ΘcVϊΐ–Ž”X86P††ρΐδ°'θ‘τ­p«\}` ]ΞmύZ4Ζq4¬ΪΊž@Θ« {Ώώ΅°k `d "8–±tuηόΊΧ»zφ³  - ΰ€�€΄¨έ•hWWQ<„ΨcνlŠΏ!ω!� ImageMagickgamma=0.454545,Φ<„(((777GGGWWWhhhwww‰‰‰ššš¦¦¦···ΑΊΊΘΘΘΨΨΨΰέέηηηυυυώΰΒlDM’al&C;|€6‚jΣ…l‡ZhΞ�ΣXesΔΐiΪΓΠΏ˜4@έ1–χB½Dvο\τJ�Hk|0ι¦ΜP‘ηm½Ρˆν«υͺΑΕ%³%šΖ½Pσ/ѐ(ОSŸέ΅S7HMώ”T"š#`f™`! Ž΅ΞeFΤBW΅γ^6ί…XΕ(D‘δ‰Γh7ˆν‘θ‰v"šB|‰ΩTTη}ΦίzFxΤ9±…Ξ7ΝU¨™ΕΑΒD\cYτ €θεB―ΨuQ†%@Τ/\βcWς"Q/Iε‘h‘0I₯„$œX`ŒpF‘"!$r”Ι=:Δ>,Ζ©Η4¬TSΠ5›¨V“θΩFΩXΰθ°Ω€†ͺˆFG§žsΦ‡ …›jζΐƒ₯&!…­m*Ϊ'Wφ7ΩNΆΔεU/ω)+x�Δ‚=ςsλ|x7+ Bή4Χ\zθ'Š~jΩj5ŠΓ£ΪUVDώŽ΅,fέ¨ Zk³ χ) ΚΆ₯α¨&»P·}cœ«Ώ,w€†ώ*/­Ι ”'KςΌ JΎσξ‘ ΅²“±GΆλfXΛ~bW Π6‰lL<΅Pn½M™”,UΑš%]‘υ_΅2υ)[ŸŠpen<‘φZGΫοΛCπΣ§ sΜ‚Μ0�Y }ƒ„wγ Q:Ρ0%_kΞH'­t €4m‚"Εi4g³$Ϊυζ�\wνuWqο),†ςυΩh§­φΪl·νφΫpΗ}Ea΅ξSχžwίM7―yο«7ž…ΉX«ΰ€ xή„λ½wLvί“x1‹?~ψί}WΞΈεƒ#n8ζœΣ‰xηώŠϊθžS>γ‘§ξ8ΰš[ώxι§Czέ’³>{ί―7;ͺΣΎ9!/όπΔoόρΘ'―όςΜ7οόσΠG/ύτΤWoύυΨg―ύφάwούχΰ‡/ώψδ—oώωθ§―ώϊμ·οώϋπΗ/�ότΧo�ύψη―�ώόχο�� JHΐπ€L Θ@θ ž"€Ύΐ|ΐφ@€ΰ‚Ϊ³`GHΒšπ„(Œή…g&, ή@ˆ€D°|@ΐφ `j/0L‘‡HΔ"7|•xo‰4΄‘ωrΨ½ϊ0{T<’·ΘΕ.z‘z+ώ@(&½ yP^ A3ύƃγσ pEΘΡyg$žߘGθeqywό’ IΘB0Œ‰ΰa‘'€ ‡ ^ ΠG@` €CΐΙ3ΦπKKπ™ΜЎed˜W€^ψ”%0eπA<ΰŒ @Κ¨qΒƒ₯oN<λΔ2‰­μaςGF Έ% /iΘjZσšΨ2M°ΘγMPpHπGs@P3¬! Ι2Α`μθ:ΆSy€ u¨€wΖ3σ” Q€@6PπΗΰ½³LΠ 5γ—=ςΠϋ¬cώρ&ΈŠ8䁒πΜ™Ν’šτ€(=^PΣ€yδ€f <‡œ‘œ+ $νΜΜӊι ΧθΛ4x 5ž ςHǠΎL@&Drš?&P…'ΤΰAՎ±ρδG‘Η€Jœiπ›F`‘)«\ηκEΈR5υ&0%Όκ0!}LcO―HΕΰu€ gͺQβ‘3‰"5l^yqN<`’ΦQ¬π Μ‰N6±!Ν©»ŠΤΖo‚Iδ«S�JIΊΊφ΅°EαJ@NšVx-M ΦQ°^faλΠΔ~r³· O TΓΎ΄`©fώΐΓζΠ²W<�π$;�θζsž@­t™+RFΎ5Έ»@,|ΫφΊχ½ γ'8ΑΕo‚§4,1yH‚Ό*±­ΏΔ�t‡ΚΧ†Ρ¬Γ#­CtHZ’†·0ͺ΅ΛΨα5”‡9ε+†k:Ϊ= H£/}p~#°_&†Ύ(N±Šέ—a,±ώέ( °D'Ο…ΔΛgd˜Nαϊ0ΐ&―‹άδ©3%€˜05yT†ψ£D.mO© ށBΐƒCž FΣ1aA Ή‘…¨r}i¬βQhΕhN³šΗ7@h‚₯Κz•P7υ[o—!PM1cιΧα‘ ΚδDH7σIΜ5{ϊΣ v\ƒGΖεα΄›#΅ρ€κγΰΔ�{΅«a½AXΛzΥ�φon[­ήC‡ϊΧΐΆ‘™‡ίβ €Ιp^qn‹ΗΙ! ϋΩЎ6#―\ΌMŒZΕΕ& š)νn{ϋΫ§₯υ― np›ϋάθN·ΊΧΝξύΰέπ†w»ηMοz±ΣΒΓ·½χ=Ζ›ΧόxψτΝ�θ½ΊΥδNήAƒiλ8ͺρχ* ™ΧκE<β¦ς.ή͎kγΉΓ?Nrž’Ϊγ%ηιΔWς‘·\δgyΙ-ξΌ»–€ΰλ»uσcκ  η€\ψΖi­ώsκΡH―cΡώΌ₯γΆάΈŽϊΞ‘.?§WηO:�pFœ#d+m© 48s¬‡U>@tƒ«;§ΐν(€ϋ δŽHΌ}t?ήνΞwέ] ‹ϋFLχHΈύyχ{ά‘6χΎΧέρ@ά{ΫWP-ΗH>"„§<ή_‘ˆΒg$oό �½>[:ΟνI<‘=Όžo[h0*}¬£™G`ΞΒ„@•…)K(@šΑ³%՝cO~FχΑ<~²γ¨όች@Wcσ½:}#W?ΌY>τlŸKγΩ2ϊ�x=ϋ šdβž$ΐΕa\υΕΛη„ά[εŽ%ƒ0�–ΘκώΛOνΈ₯y—5%`g²x‘χx—•'θx ¨w“7 ŠwβxŸ·€xO#zθψ€X ˜‚(¨πw>Θ<†5B}6ˆΰg €eΑ'φXΑsŠgυO $NP=˜gbTΙ#Ε£„L„6„„Κs„Uh ΐƒYx…[β„…QψVdH„>U=hΨd }ΛC…υηƒOxAšJ0aˆΨ<ˆv³”^ΜΓ έΤ,φ…©&< ρ]D φ`ΞHEΖ(]Θx‰O9ΤO­5P pqκΨY`ΥbοΘSδ”vGΕCwΘ]LιDώŸqFE©9i}�@LΏΰ©<ΛM΄TSλΔPLLϋH΄‡… =Υ"{“6α$E€hAG8ψkχ`±ι™΅X“x‘/Iy«)’,*›©€‚‹΄ΙšY™£Έˆ—h›Ȉ.κ’°“9£Ώ €8ڟπσΞΣ‘/εŒ —Oςωaΐ ΡΆ…Œ“k*I¦€SmI°S²±_:|] MeΪ[;% ΠkΊŸαg;₯¦gšO‘@’ΐ$‘”œ}Чvj§~ͺ§™4<‡*v Ϊ=cŠJNΔCυΨ§tΪVkΑ oκd±tbυώbΞ–oΦ‡Ξ³D ¨ο yDYΑ“i†ςRiTšI’˜Š¬˜£g€OΣ‰xš"™wΎΉ™49€|2 £Œˆy©y)’‘‡›4jΟJ¬ (¬2)­r­Άœθ3œΘ£ͺ¬ZgdY =IY /ΦωB Ω†ΦIbR€KΔC€kQc^ڏΕS•‡H―”�…― š<χZ―@yδα΅DlX{° ;°zZ<{°ΒS©ΤSΒ# |±Dšu«―μ ξZχG„ΐ7–³EΰΒuƒ9iο‡Gc1i v³ό8Rν CNΨ‹€Ζ­BKΉΊ­ŽW¬�Ψ‘-šyώ y³ψ4€π΄‹G΄.Κ™5Ί£ “Ν:€—Ψ΄™H΄ΏͺyM;xŽΈžς#�q€³ωΤX$ŒΖ¦³�%† @UΐC tΗS©†u‡₯•Y2K‰υB™ΆOpj•Ϋ·Ufˆ‹<ω€Έ}ΰT}·�ΤpΆ·6φΈ{hK`—nωΈ’z=•κ+ΰgΉ€+·ƒk·bΤ—[SqκUΆδ¨ |HΜ#h›UT±XCΨ[ά֜C˜’54ΆΌΊ¬Bš™(΅Iϋ’T‹¬ήΊ‚θ’ΝΪΌ!¨¬Έ*z_ °Θž½L:’�[“NσxάΛ΄Ψ;zςczΛσ εΆ«₯F§Έή)†4E~ο*ώ»κT˜ζ†δ˜id'R/$†υ+žŽε†λΘΏci_w„ΐλΈFͺ]ωF!Εΐ"EΑφ₯r±ͺΏεΥWϊsΟγ±ΕŒ2gΑr ΐ¬»΅aφΛz1H»i˜`υ$²όˆ„*EΛφ " A)ͺˆΉŠΪ‚8Ό7š™Δ{«'©Ό θέ:’ΜkΔΚ½CŒœ')Υ‘?κ­ΌΙ™Ϋ»΅V܊MϊΔ6jwXk0Μf­G‚πAtiG Phώ%OŽšC7AλZ ύΉ FfΰAΌΗΘewXk1<όuγι•‚L\LΠΘώfkiAƒό_6άΒΞwfŒ\ΘυȜώ<<’,<Ι}εΗ€Μv7‰‘9τnΤ —‘LΘƒόΏ„I‡^ͺvxŠJ|,<©4Γ‰©‘±ΛJ“|„珱šu₯lΖNΌΜ»*‚GΚ«Π\Δ͌¬ΤΜΜ₯©ΜΣlΝ?ZΝΩάΝΧΝάόΝ�,ΞΘ �.˜ΖΖSiβU‘Π{Ίμ€C 5e_οΚΖs6½@Lϊl+$Λφ7|‹άΟ7‡[OW$ΠiΠ U μ«\ ΰILϋ¬mπLΠάΖ[' jk΄ΑΙsqR1–ΠjTΡ%œoϊ”ˏ΄φ&)L˜ΏLqΗk™4JΊ΄L“*pk¦ˆζl>Ίs3νXG@WΣΛ3ΤcΡcΤ$tΤγ°χΕΤΈ₯}<χΤχυA5wΣ„ΥjTΤZ Hηš=S½QP =HνM¬fͺ“Σ:½Φ57#ΤΖΦΰhΕWM:uΛ)„ζg Χ|έΧΞ‡ „tΦDh9έ@Z'Ψ!ω!� ImageMagickgamma=0.454545,,‘ƒ(((777EEEWWWdddwwwŠŠŠ›››£££ΈΈΈΙΙΙΨΨΨιιισσσώΘI«½8λΝ»�`(ŽdižhŠlAj,ΟtmίxΓ6ΐžX!ΖΛ9Y2Ÿ”e²©ŒZƒ˜γτ*RΏ^,Ψ —ΕΞ�ωΌΦ‚‹W6PwWΕ‚‡^oΠ {BC„"8(AAΎ ϋBMXΰ`Υ* "TΘpCΖ…ώˆ©.ΓΗzM84©2₯FQBt°'ή’#%xp`@AB  x @ƒ8h²mœΣdέ Š“ZŽκSgM­jΕ•λT―UΑ^…φ•lX³cŸ©Ν*φ:J=μμωS'OŸD7$(  €ƒ₯χΜM ‰iO»zVR<@`ή‘‚Œ>GxΓ 7ΞΈ§d ‹7R@šτ_Λπ`p0χ`€ ΰΐ8H`„ΪτΖ€ψ! ,°oψεΦlh ύ€ αΖ%U’-Ψ…€xBjW$wD&9δ’F*Ω$“Hτ’³ΘE!ιΑU`Š !ρΰK%tΔ„a=jΛ+вӚzΠ’ cn ‚²<Π›n�ηW›ΜCΚ› –4~d‘|jΉgœ4ΰΐ ~BΚ(€#ΐ@ΤΥAˆN΄Π{«δ€μܓQ>ιj«°~Ηͺ¬P�ϊͺ­±F§«uΝ)΄Η”:¨κ©ΕΊP±$@Q€ώΰΗӍ Μfͺ ς7TF-PΧfKΡ=Ρ­‚™α)?Ψυm·κ&Mi²«ν˜BJώ,%οΊρyλ.ΡΖΫo»ά¬νΏ"ΖbΑ'Ύ0 ΜΙ½UJδ­»ŽΗ묉λΘ!ƒόq­%£|2Ηh›CΖ/T‰/HtE�ζ― Εz›l:P.bΦLtp@η’ΠΞ=“[ƒ˜€)HM΄5K]ΛJWMo‹‡E^€0‡΅JK ΄ΦsMοΩjΣK5Ρ%mΑNrπJΓ'°_ΝhΈEŒ‹„Θ)³μρ∯œ«γ$CžψγŒ›ΌΛώ8ΐΌΑP~Λ|�„ΫE.},ΐPϊqfίΨύωήΌ*ߚξOκ’C ‡ρ ϋ· υ»»F™[υ_βξ>|ΑΛΟ;νϊ>{έόI°_ήTΕξ$bŠ Ύ,ξnLyγ•«œΎβθ·oΉϋκΓΟGy:!œΕτ°_<:ζΏ�1BΚ`sμηψΑ€λ΄(€υI{Όωp@˘KKPΗ—v�ΐ/e`'”€ΥDΝ0`%DΠ’ACέM*|` M°@lŠZΚ½V7`œ«f8XΓ`fΎΘ­ο|οKbό”Θ>&"q‰PΒά § ‰Θ‡†Ή"ώΧΠ ™\¨ΰŠȟφ`@f€‡Ύˆ0:ν6.L#υΠΕAtΔ#‡hΜc€cΞ�¨!쁐ƒΜ£5v/(,R.¬P \x£ƒTν01BEŠΖ¨“ΡŠMεCIΚQš�ˆς;%yθ§9“d—D΄`i ΎE ! xΑ$ΥƒRΰ€7ΪbλQ ά‡G°i2uΌUPw²ΐ< ΜcRKχΊ₯±�ω0ζοψ£5« €i’S„Υ3'6ΗΉΞ ΐ« &  1ΰψμI€ͺ°oΆθ“ψ[ ‚T!σξμΰEBΟ²Π[4tΥCDζ«3Ρ‰>£’Κΐ(u4ZŽκΒ£cιsD*ь6Η’Ί’ Z™?ια›.uΐްZ΄=ϊβθNΜγ2Š”š­ω5σ—oœΘ‘PΤ ‘©/ͺ)Q‡:aφ‘κTUNmΥ©L₯κSs&]`FGΊΐΌZU% –-κRFΏΊΪυ�xΝ+ύΜ§�€�n…kήΊ A4°πl€ώκ„Ώ’@w`l†~π‡ Hφ—₯@fkΩX`³A[ «Χ�šφ΄¨M-^+ωd©φ΅¦=Eδ [ΰl₯!ω!� ImageMagickgamma=0.454545, ,‡ƒ(((777FFFWWWeeevvvŠŠŠ›››£££···ΚΚΚΨΨΨκκκσσσώΘI«½8λΝ»�`(Ždižhͺ�lλΎp,Ο€ C0w₯K? ΠŠΖΰy46‰;J‘ωLBΥ!ru./\lU)ώv}η,ušΆJΡΩ8Ω+ Ž|AΖΩR#9}D=&ŒŒR‰ ‡'“‘•;-„    §w Ά  ·· ΊΆΌ½Ώ½ΒΊΔ·ΉΐΖΎΐΑΜΚ ΟΝΙΞΤΐΘΓΥΨΣΫ½ΧΕΩίάαΪδγζΗΰ»·{1²ž ’€‚Ά Aς*ΰϋAΚ”” °;‚»~�fXΰ@ƒ:4t‹aΒ…ώ4~œΰ Ι’ 6ˆtΈc#H +ΆLΨq={Ψβx€d%ΘχjBƒΠ …)€[&N]Uͺε¬fΕzŽ«Φ�Π¦†½:vkY°�Μ¦E­­Ψ΅_γzεϊ²ΤB€,P5'@@η)„¬$δΣ4ΰΑ lΥD8XgΔ…BLRι† ,P.μΰ²γT₯?ŸΆ,!‚Χ ς¨6ΩteΟ(£6M›υˆΏE'$( θ¬šc=`w42¬Ό{Hΰοι, ΅ΤΊ% wξYΉί½wO~ΌωνΪί’g«Ύ=χυΰΟƒ«ΛΒδφ'nΎ<„+V:-ώΠ (š0Πέαν£  2ψ€€Έ‚ΫD‘Νσΐ‚>(α>o ²!„€¨‘‰xΨαˆ‹+rX" όΡ@.δ2+ κΠ;yW./έυβ{ξ₯‡δ’J6Ι“O:|βQYž•ς1)S;}iΐu#Dcq€Π ιπ $ΞEAζȝbaJq†Š„ž­ωY†p5§_~ΖCN8αgg—9UgϋΤω§£‚N@hŸr 靃π&&ΪC.J@@p ^φ]”¬N™d«UΎκ*”³J+­·Ϊz₯¬Ά4Š*€ͺrŸNHΑ¨ΐ^Τc ώ~r@^Ÿ$Β” ;ARΰΐ€-Sά>ΐ`>B†r!  τ@ΆG!δνΊΪr &ω,”ΤRΫvKA.8Ρ‚|Ϋ�Έ‡KA½ΧΒΫξ,»[‚΅ϋRΤ€ w¬‚ Ÿ@|D 0ΰ#ύy―»βZ²�Y’ŒεΚ$§ λΙ/»\+«Ι’ ²Y Ζ›v€ά‚ φΓ€+χ —Z£v€γ—ΰΈ΄RΌέΐΠ%ž{AΊDKΣβj]/A²―ΈLλΈ£c0šΗ³DΝ Χ7’­”ΩΨΥ€γΫ`k ΅Έ%τ !E,’Φ@GKͺδ³νΡ~Ήκ̐η3Λ&Λ,yδώ0cnyζ—wΞ9Μ5Ÿp³™ ^ψI{ΠA'Ε_1‹4©IΉςXlοΪ.!ƒ ΈΎŠΥτ£�ξξ֎ΆΓ;˜Ϊb¬ΆlK |ΫKwόΌLί­φΨ‡π#Ό$ΆΓŒ"ΦΐEΠ œ}=ξωζπS�rΛςON�ύ•Χ―ωz‘› ¬yA‘ί20*jQ` hŒt"Σaΰ{Κy@†:… J ST Έ§ T0*ŒΤΤ†΅³ φΕP¨ϋB&B:•ΚΐM(LŐ©Kω(eΈšΘB`Ed—*χ}.~ψ›_ώ’hΏ%:Q‰Plβ―dπ?Ÿ.‡.2!ώΨ¬p°Mΐ’Ρ§ŒQS#βb)ΌΌ `MDΙiΜ>ΞXΖ΄Q€Ž,€-@Έ ُfσθ<ΞQͺ"€Ψ>0@νΓ@dψ΄—€  §Έ€FΏτ%/O”’(χΗDR†�”QDε(%ΧΏŒ.”€E΅ˆa’ŸθH^Vqΰ0¬c ΈΒXΛKΒB'HErτΈen&˜m< Ζr�ΜI13™ΦΌΰαιL’„ŠŸ 7­‰Ld†Ϋ¬ζ2ǹ̞¬•΄ε Βc‚ψ(0")]„FˆkΐΗ¬C fx#>΅EBqaΠ·,tCm¨5ώ$ͺ–‡>4₯¨..ͺQtp'£ iE;ΚJ*"*ϊœPtr Œ!L*ΊΨ'ΐ@¦] ₯/dJBΔ§S<$f¦‰ζήH‹”ςTŸA¬ΐ'@�Σ€’Δ€(2‚Τ£ΪB|ŠιΟͺΊΥV (ΚKmPŽqφμ@¨@‹2Ρΰ­p«\ηJΧΈšU«0€[˜ΦKτKψ«τΚž€¨σp«a} XUυΥ(DΪ$k‰΄=Ά­LΘ‹μpΜΊzφ³  ­hGϋ‚U΅’΄¨B,2ΝΤ~6GŒs­lgKΫΪΪΆ�¦½­n_°ˆ0"z»…k*φάβχΈΘMmn“Λάζ:!ω!� ImageMagickgamma=0.454545,,ƒ(((666FFFWWWdddwwwŠŠŠ›››£££···ΙΙΙΨΨΨιιισσσώΘI«½8λΝ»�`(ŽdižhͺbAαΊΑ*Οtmίxώ ‚6Δ’ΐΐ NŠE0y¬ ‰M£::­ΥμΥΚΜ2ΏX°T»Όˆ΅γ'Ίšμz)jjZ~žcίcΆyK<B <)‡#?=DŽ&“p— )›š˜G :C C ƒ ~ͺΊ ΊΊ ½ͺΌΐΒΐΕ½Η»ΓΏΓΙΑΛρ�ΔΡΦΞΧΐΝΖΩΘέΚΓΫήΨδάεγζιθ½βΰκ©  όός> ε“  A+$pDΐ>SAr@+b  I0Γώ B2ˆ@βŒGLRd€²"€~ψψm(9ρŸ’–,'Ί€ωΗζ‡('μλΧΐηŽH(²ΐ€=,@π@@€Jk98ς Ϊ9x`½Ύ».μ΄�gΏ’5[MmΪ±oΛ�—-΅»hΫΒΥ+·.]Ύ`u8°•>ψ€πKΐ8D3‡™ Q0 Pp@•Ϗ0¨*AbθT=LOΈΌΑ•ΣP—Φ<`΄¨  E“  wo…=νΐQnΫ­i#§μ 4ƒβ$rωkγΗ {ƒΙGπ Η$τ$δΪ‹Χ-ΰΏνΩηίχ½ίϋφσΣ·;ΏΏϋύπωώ'ίW‚qή™�Ω? ,0Ο*œ•GΩΖ(ίM •³ΰΒΜlΰGV…(Q…²μζΡ-dFβ!Ž8[VXΘ8aˆΰΈ’ˆήȐ/*ec‰$4Ψu (@‚,dΆε‘Η‹Q�W€ψq©Ÿ€[‚ΙίbH晦&škΎS ‚,n°Π²8ωR…όB'1>ƒ0˜°’™Ή΄€…'phŠ·˜τη…(ΐ@ "zΛ’Q0D‹^dΑwnb§‰F ‡‰jθ§2Uj«žŽC‘š.ΰ ΐT10eH&ΩIB²9¦šΗΆ©l²Μώš‰¬³ΛBΫl—eRk¬*&yφ±ξφK…©œ”ΐ­΅xK!ίi>*^%μ΄J@UW-πσΦ{ο>κ²{� [•Ύ[ε+Υ½«I(―Ÿϊ> Πͺ€pψ2|pΑΫάK WLοΕls,.ΉP΅‡ό  š¨ <7ΙcYVϋε΅Φ>›s΄;O{³Ξ?σ΄Ο^-ζ›θΓIό’PΠI(RΣΐMΊ@―²PΙB’l/ΌχKzς"/%q £Š<žΏ¬ν'Ωu/T„Τ‘­@qdο‰γ;€@ tWΕvΪfϋ‰Kί�-€ή‰Ϋ=r‡ώDxΙ!C₯ΕiυA21.€m4ΞCKλzΟ―·ϋμ²ΧΎΊκ6ο‡t§w@€DEIeΑ/Sf@\π.Uξ&ε$»D•,›έ;½fΜQΆ<> pψο’Vp}υSŸ=οεa°O㲐α₯O~Εζ―ΑψΩγoΏρύ’Ιπ€' 4¨9@ gβ€%’ε»Π$θΐBwΜ *v‡₯y`]Έ#t9ζπžγTΜΨ€3©’IgΪ'“­eF3*Τΐ>(ˆIUGQ±’IfΘ"!‘:ΊaΝz(ώ‘ˆ,΄ ‘D|41Š!ώόπ.θ0νC‹&¦£A4 x5Σΰ/ΈF5Vƒplcί(Η²%iXμu–#8λP[£ŒATΘ‘=N zπ +JxCV|Hy‚lά²ΕFΐG–τZ€ΘKIŒ(ΐh` KΚ(“ŸΜ*•²Κ>`gˆ e7I#ΞΝp3œˆΨ BΦ‚©«#‡; “Δ€1•‰Μcꂃπ`’$€ΞT¨$QΔ4„9¨  šη�Ό·�.J€’€Q*2§lΚ€ε© „ ™ΉIΎΖ‡šŠηsLΡΞΪl³‰έD—>!ΤDWφŒͺ!λ§L―™ΘI9°˜YMs&QkE࠘HܜpΐA4Π0k*πΰU,°) @ƒΔ‘λψ/δ@Κ—-SΔΘdηʟ3‡ήμΉ4hΣ’Q“>Ν:uλΥ�cލPsνΡ·U?)Ar‡Ύ)&,a8b'ψέ5ΰΑή~Ώ w~Έ0u³’ q“°<- Ζ­ &�!ΌθΡ;pφϊqδξ‹N0όQ#€KŸ €€λqώ0U& ŠYΫ9vάW€sΝ=χΫ{p-`ΐ~”|#5Η4π@"€P$±'A9Άδ"f΄½Ψ"ŒΉ½V£l7ΖH£ŒΈρ¨›6‰£:Ξhd;Ό…σ  Xˆ‘†Εν–α‚ίέD³ W)v!8ΝU)%”^™%…,πdZΩ¦”¬HεysVPN’Ό9’žxΘ)ζžuZ9B“_bŽ]4 ήXΰΝ‚2f—₯`pα&`x€tŽ³©3–(b:OEv•ˆGώΈγͺ©Ιj―ͺΪꐱΊ:k‘°ήšγ�I@IhΡ8Ÿ:ΪT8œkφώΤRhΓς•μWΘ‚ͺl4ΜjΉALl*J§ΥKνzα.ΈpYL# �»Η&zŸ΄ΦR οkž@΄8ΆδŠ-ΊW³8 <›‘Y�δ+­™‚cSŽ-Ν―7ΰ€Ε Χ€=w{‹Ή–,«ΙΆ’L«�DςZλΚ*γzςΜ)Σ ³nIϊζAΔ$e¬ΨΕWΌ{Μ8W°^­82<ίε3ΗSό3{\:'"�ήUτΖ@?=4z•΅ΠSŽΉ[ΨTWΠ?wΜΆΕ*J5bΟRCύφΧ%4=C7€6z}•@a~ 1֌² ηEέ+lͺΏ0έ”ŽώζˆΚnfΑ‚ΆΞ¨Ζμ2Λ/Λ\σκ7³�zλ°Ώ.ϋι¦·l;9ΗέAsbgž€˜wόN—Ώ@LΫμF‘€θν;π™GίyΗΗ7ΐ€7Μg f›oΉπˆeNŽNΎ‡_v–Ύ�H—†W�9τΰo~θt¨χξ_Ύy ΌW ~ِ Π ½₯zΧS^’σ•]\Ξq:©ΐ…v‘)±ΩΔΟΙ܍&Ύ}5eh­–œPGΒΪ₯Žv6›ένJ˜BΊΞ…±ƒ‘ iδ+u@oΜ {rθΎγΩD”@„.Π?§a>;βŐ›XΟς9Ο’x¨€Žˆƒη»ΐώG�AΗ8Lj QώXΕ$bQTtΫŸs±ΌaΘ οΨN�ΑΖ&~%yUΐϊ‚"¦™b$$Χ§Iή Φ©κI4 ώ,kZ jV²²5‘|Y¨’jP΅‘#β*^―ŠδΨt‚»]§ZΥΌφU«†ΧD'ΠΛ4ύ±|ΝκV+7L6«kΤ^Κ¨½κ²Ÿ­lY‹ŸΛšKcsγΐ`νκŒ(€¨ ,\ήΈ€«ΐ/ΩYš±x=qo ³ϋ0›ΘQ—"—:Φώ€ hˆ­ΉχlδšΠ€GR ””\‡[γρ‘NdWίmYx»»~wΌΆA/Gt₯^Hd»T"/mr&Χ ΞΜ œž{ίR-6K`ιlΟa’ζ¦Έ+ρ―MΕYžΗBWŽ›ά$ ] l`ΐτΛ_sHxΆξ/γVrά‚m“Iκ‡=ΟςaΏ<—ϋ-Ξ_0€Ώ†5β9η Ά¨_€œϊIαΘHN²’W`d9ΘDΦqGπd;E™Ϋϋ1$ͺμžfθΚ$ΰςψ  -C™ΜF3¦ά/ž€Ν$€sžsδ.ωΞxΞ³žχ¬gh eˆβσˆχώ[AkME‹’‘ΝθF;ϊΡ"(2bιd#›†~E,ΪWιN{ϊΣ ΅¨G}‚˜ϊΤ§&΅ͺWΝκV»ϊΥ0ψp7`MλZΫϊΦΈ΅¬•λ^ϋϊΧΐφ ΚθY»TΨΘNΆ²—ΝμޘεΏΨυ�›Mνj[ϋڍvb@[icϋΫΰ·Έ‘PbsΐΫγN·ΊΧΝnTΧΕζυ±ΫMοzΫϋήxΤ^0ΌY|ϋϋίg7gcΚοyόΰOΈ²Yδ/£ί ΈΔ'kή-βέ¦ΈΖ7ΞρGk‘(6Ζ;Nς’›< Ѣ͝ρ“»όε0BLŒ‰i  ;ζ8ΟΉΞiPŽ'||η@ΊΠGoy·|θHOΊ�Gpσ₯;ύιPοͺQυͺ[}γ!ω2, Α†���―――°°°±±±²²²³³³΄΄΄΅΅΅ΆΆΆ···ΈΈΈΉΉΉΊΊΊ»»»ΌΌΌ½½½ΏΏΏΐΐΐΑΑΑΒΒΒΓΓΓΔΔΔΕΕΕΖΖΖΗΗΗΚΚΚΛΛΛΜΜΜΝΝΝΞΞΞΟΟΟΠΠΠΡΡΡ���ΣΣΣΤΤΤΥΥΥΦΦΦΧΧΧΨΨΨΩΩΩΪΪΪΫΫΫάάάέέέήήήίίίΰΰΰαααβββγγγδδδεεεζζζηηηθθθιιικκκλλλμμμνννξξξοοοπππρρρςςςσσστττυυυώ€&!!'0C‡‡DŠ‹ˆ0'&,BBC‹–Їނ…ˆ‰—Ÿ ‘’£€₯¦§¨©ͺ«¬­�―–0!!†·žDˆŸΉ°­»ΏΎΎ,Δ,”½˜>&'ΖΕ&”’B&ΕΝΗΐΒΩΪΫάέήί«0Ξ,Τ03ζη00Θ‹>˜–Ιΰ‘„­>ςσ ΔΝΔΠ•Ÿ¦GNH¨iύϊω¨―‘Γ‡#Β’5kPE‹‚B°π4€­Nχ2iΰ/Ÿ°&z©¬t‹ΐŒN-˜9ΣŒPβ¬Ρ΄Ζ§³Ζ ΕJ΄¨Ρn,BtXΚ΄)Σ›Ίx‰lˆο†°0ΐΧ·!†d$–a₯ͺ©štΈ³Ÿ‰PώΤj5–l΅ sίέΛ·―_F,œ.U:xiOF:ΠΐnjΕ0˜@ΉPƒDβƒΐ «6‚V·W x>€£e ™ ¨ξ +±μ:ŠΆ%‚Ώέ'Β2ΔD/Mc½�*_Ξ|ސ”Š}zτ;:ΠΡΆŽ©“N˜#²c#Mπ!BW²ΩΝF‹et 9νΖκnC° ` Ϋ\Ι}’‘qΗι]:υHsf¨a+IY4˜E b·Ψ™ΰ€Uω²U&Xr‡Dΰο,βOρΓ‚-ŠˆC >(¨Λeˆψ ƒaώΑKˆΨW‰‰ G\ΏΝu/vιΈ›„vιε—Dβ˜Υ’‹K.6€">Z©©Œ™@Ι 4Ψcx6ΰΐžδιlE€§Ÿ‘ΥiΣdfaιAfΒ‘ωœQΚΥ'?wι%™ΧΜ¦`†*ͺ_b^„FWΞ7•"'œ(D~“¬8DylΎx ΠX•/:ΔeW₯4’ˆρβg.±zβpεH³‹4[Π*"­ŽΖ@3κΆά‰ ΰ^”5d%&₯―ώΓšεέΣZΟΡΨL°Τ'‰ .klB4Νc™ΫjQAωΝhΧ>s0/�*€m·Gμ9ί«Šϋ-$©Ž8ƒ²‡tΐHBΤWHb”mΦΩ•'kA�jͺEλΞ&ΥΖηE‹ λŒrˆ3ŒΫ³(?Ο3‘܌7ή7&ΈDξUί,a΄βάŽΉr;pydantic-httpx2-9b7ee8e/docs/index.md000066400000000000000000000116771521723372100176660ustar00rootroot00000000000000

HTTPX2

---

Test Suite Package version

A next-generation HTTP client for Python.
HTTPX2 is a fully featured HTTP client for Python, which provides sync and async APIs, and support for both HTTP/1.1 and HTTP/2. !!! note HTTPX2 is a continuation of the wonderful work started by [@lovelydinosaur](https://github.com/lovelydinosaur) and the broader HTTPX community. We're enormously grateful for everything that has gone into HTTPX over the years - it has been a foundational piece of the modern Python ecosystem, and this project would not exist without it. With HTTPX itself seeing limited activity recently, Pydantic is picking up stewardship under the HTTPX2 name so that users have a reliably maintained path forward - including timely security updates for a library that sits in the critical path of so many production systems. Our aim is to honour the original project's design, keep it stable for everyone relying on it, and continue evolving it carefully. Thank you to [@lovelydinosaur](https://github.com/lovelydinosaur) and every past contributor for laying such a strong foundation. πŸ’™ --- Install HTTPX2 using pip: ```shell pip install httpx2 ``` Now, let's get started: ```pycon >>> import httpx2 >>> r = httpx2.get('https://www.example.org/') >>> r >>> r.status_code 200 >>> r.headers['content-type'] 'text/html; charset=UTF-8' >>> r.text '\n\n\nExample Domain...' ``` Or, using the command-line client. ```shell # The command line client is an optional dependency. pip install 'httpx2[cli]' ``` Which now allows us to use HTTPX2 directly from the command-line: ```shell httpx2 --help ``` ## Features HTTPX2 builds on the well-established usability of `requests`, and gives you: * A broadly [requests-compatible API](compatibility.md). * Standard synchronous interface, but with [async support if you need it](async.md). * HTTP/1.1 [and HTTP/2 support](http2.md). * Ability to make requests directly to [WSGI applications](advanced/transports.md#wsgi-transport) or [ASGI applications](advanced/transports.md#asgi-transport). * Strict timeouts everywhere. * Fully type annotated. * 100% test coverage. Plus all the standard features of `requests`... * International Domains and URLs * Keep-Alive & Connection Pooling * Sessions with Cookie Persistence * Browser-style SSL Verification * Basic/Digest Authentication * Elegant Key/Value Cookies * Automatic Decompression * Automatic Content Decoding * Unicode Response Bodies * Multipart File Uploads * HTTP(S) Proxy Support * Connection Timeouts * Streaming Downloads * .netrc Support * Chunked Requests ## Documentation For a run-through of all the basics, head over to the [QuickStart](quickstart.md). For more advanced topics, see the **Advanced** section, the [async support](async.md) section, or the [HTTP/2](http2.md) section. The [Developer Interface](api.md) provides a comprehensive API reference. To find out about tools that integrate with HTTPX2, see [Third Party Packages](third_party_packages.md). ## Dependencies The HTTPX2 project relies on these excellent libraries: * `httpcore2` - The underlying transport implementation for `httpx2`. * `h11` - HTTP/1.1 support. * `anyio` - Structured concurrency primitives, used to support both `asyncio` and `trio`. * `truststore` - SSL verification using the operating system's trust store. * `idna` - Internationalized domain name support. As well as these optional installs: * `h2` - HTTP/2 support. *(Optional, with `httpx2[http2]`)* * `socksio` - SOCKS proxy support. *(Optional, with `httpx2[socks]`)* * `rich` - Rich terminal support. *(Optional, with `httpx2[cli]`)* * `click` - Command line client support. *(Optional, with `httpx2[cli]`)* * `brotli` or `brotlicffi` - Decoding for "brotli" compressed responses. *(Optional, with `httpx2[brotli]`)* * `zstandard` - Decoding for "zstd" compressed responses on Python 3.13 and below. *(Optional, with `httpx2[zstd]`. On Python 3.14+, `zstd` is supported via the stdlib [`compression.zstd`][] module when it is available; the `httpx2[zstd]` extra installs nothing there, so decoding falls back to `zstandard` only on 3.13 and below.)* A huge amount of credit is due to `requests` for the API layout that much of this work follows, as well as to `urllib3` for plenty of design inspiration around the lower-level networking details. ## Installation Install with pip: ```shell pip install httpx2 ``` Or, to include the optional HTTP/2 support, use: ```shell pip install 'httpx2[http2]' ``` To include the optional brotli and zstandard decoders support, use: ```shell pip install 'httpx2[brotli,zstd]' ``` pydantic-httpx2-9b7ee8e/docs/logging.md000066400000000000000000000076031521723372100201770ustar00rootroot00000000000000# Logging If you need to inspect the internal behaviour of `httpx2`, you can use Python's standard logging to output information about the underlying network behaviour. For example, the following configuration... ```python import logging import httpx2 logging.basicConfig( format="%(levelname)s [%(asctime)s] %(name)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", level=logging.DEBUG ) httpx2.get("https://www.example.com") ``` Will send debug level output to the console, or wherever `stdout` is directed too... ``` DEBUG [2024-09-28 17:27:40] httpcore.connection - connect_tcp.started host='www.example.com' port=443 local_address=None timeout=5.0 socket_options=None DEBUG [2024-09-28 17:27:41] httpcore.connection - connect_tcp.complete return_value= DEBUG [2024-09-28 17:27:41] httpcore.connection - start_tls.started ssl_context=SSLContext(verify=True) server_hostname='www.example.com' timeout=5.0 DEBUG [2024-09-28 17:27:41] httpcore.connection - start_tls.complete return_value= DEBUG [2024-09-28 17:27:41] httpcore.http11 - send_request_headers.started request= DEBUG [2024-09-28 17:27:41] httpcore.http11 - send_request_headers.complete DEBUG [2024-09-28 17:27:41] httpcore.http11 - send_request_body.started request= DEBUG [2024-09-28 17:27:41] httpcore.http11 - send_request_body.complete DEBUG [2024-09-28 17:27:41] httpcore.http11 - receive_response_headers.started request= DEBUG [2024-09-28 17:27:41] httpcore.http11 - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Content-Encoding', b'gzip'), (b'Accept-Ranges', b'bytes'), (b'Age', b'407727'), (b'Cache-Control', b'max-age=604800'), (b'Content-Type', b'text/html; charset=UTF-8'), (b'Date', b'Sat, 28 Sep 2024 13:27:42 GMT'), (b'Etag', b'"3147526947+gzip"'), (b'Expires', b'Sat, 05 Oct 2024 13:27:42 GMT'), (b'Last-Modified', b'Thu, 17 Oct 2019 07:18:26 GMT'), (b'Server', b'ECAcc (dcd/7D43)'), (b'Vary', b'Accept-Encoding'), (b'X-Cache', b'HIT'), (b'Content-Length', b'648')]) INFO [2024-09-28 17:27:41] httpx2 - HTTP Request: GET https://www.example.com "HTTP/1.1 200 OK" DEBUG [2024-09-28 17:27:41] httpcore.http11 - receive_response_body.started request= DEBUG [2024-09-28 17:27:41] httpcore.http11 - receive_response_body.complete DEBUG [2024-09-28 17:27:41] httpcore.http11 - response_closed.started DEBUG [2024-09-28 17:27:41] httpcore.http11 - response_closed.complete DEBUG [2024-09-28 17:27:41] httpcore.connection - close.started DEBUG [2024-09-28 17:27:41] httpcore.connection - close.complete ``` Logging output includes information from both the high-level `httpx2` logger, and the network-level `httpcore` logger, which can be configured separately. For handling more complex logging configurations you might want to use the dictionary configuration style... ```python import logging.config import httpx2 LOGGING_CONFIG = { "version": 1, "handlers": { "default": { "class": "logging.StreamHandler", "formatter": "http", "stream": "ext://sys.stderr" } }, "formatters": { "http": { "format": "%(levelname)s [%(asctime)s] %(name)s - %(message)s", "datefmt": "%Y-%m-%d %H:%M:%S", } }, 'loggers': { 'httpx2': { 'handlers': ['default'], 'level': 'DEBUG', }, 'httpcore': { 'handlers': ['default'], 'level': 'DEBUG', }, } } logging.config.dictConfig(LOGGING_CONFIG) httpx2.get('https://www.example.com') ``` The exact formatting of the debug logging may be subject to change across different versions of `httpx2` and `httpcore`. If you need to rely on a particular format it is recommended that you pin installation of these packages to fixed versions. pydantic-httpx2-9b7ee8e/docs/quickstart.md000066400000000000000000000350141521723372100207400ustar00rootroot00000000000000# QuickStart First, start by importing HTTPX: ```pycon >>> import httpx2 ``` Now, let’s try to get a webpage. ```pycon >>> r = httpx2.get('https://httpbin.org/get') >>> r ``` Similarly, to make an HTTP POST request: ```pycon >>> r = httpx2.post('https://httpbin.org/post', data={'key': 'value'}) ``` The PUT, DELETE, HEAD, and OPTIONS requests all follow the same style: ```pycon >>> r = httpx2.put('https://httpbin.org/put', data={'key': 'value'}) >>> r = httpx2.delete('https://httpbin.org/delete') >>> r = httpx2.head('https://httpbin.org/get') >>> r = httpx2.options('https://httpbin.org/get') ``` ## Passing Parameters in URLs To include URL query parameters in the request, use the `params` keyword: ```pycon >>> params = {'key1': 'value1', 'key2': 'value2'} >>> r = httpx2.get('https://httpbin.org/get', params=params) ``` To see how the values get encoding into the URL string, we can inspect the resulting URL that was used to make the request: ```pycon >>> r.url URL('https://httpbin.org/get?key2=value2&key1=value1') ``` You can also pass a list of items as a value: ```pycon >>> params = {'key1': 'value1', 'key2': ['value2', 'value3']} >>> r = httpx2.get('https://httpbin.org/get', params=params) >>> r.url URL('https://httpbin.org/get?key1=value1&key2=value2&key2=value3') ``` ## Response Content HTTPX will automatically handle decoding the response content into Unicode text. ```pycon >>> r = httpx2.get('https://www.example.org/') >>> r.text '\n\n\nExample Domain...' ``` You can inspect what encoding will be used to decode the response. ```pycon >>> r.encoding 'UTF-8' ``` In some cases the response may not contain an explicit encoding, in which case HTTPX will attempt to automatically determine an encoding to use. ```pycon >>> r.encoding None >>> r.text '\n\n\nExample Domain...' ``` If you need to override the standard behaviour and explicitly set the encoding to use, then you can do that too. ```pycon >>> r.encoding = 'ISO-8859-1' ``` ## Binary Response Content The response content can also be accessed as bytes, for non-text responses: ```pycon >>> r.content b'\n\n\nExample Domain...' ``` Any `gzip` and `deflate` HTTP response encodings will automatically be decoded for you. If `brotlipy` is installed, then the `brotli` response encoding will be supported. The `zstd` response encoding is supported on Python 3.14+ via the stdlib [`compression.zstd`][] module when it is available; on Python 3.13 and below it requires the `zstandard` package. For example, to create an image from binary data returned by a request, you can use the following code: ```pycon >>> from PIL import Image >>> from io import BytesIO >>> i = Image.open(BytesIO(r.content)) ``` ## JSON Response Content Often Web API responses will be encoded as JSON. ```pycon >>> r = httpx2.get('https://api.github.com/events') >>> r.json() [{u'repository': {u'open_issues': 0, u'url': 'https://github.com/...' ... }}] ``` ## Custom Headers To include additional headers in the outgoing request, use the `headers` keyword argument: ```pycon >>> url = 'https://httpbin.org/headers' >>> headers = {'user-agent': 'my-app/0.0.1'} >>> r = httpx2.get(url, headers=headers) ``` ## Sending Form Encoded Data Some types of HTTP requests, such as `POST` and `PUT` requests, can include data in the request body. One common way of including that is as form-encoded data, which is used for HTML forms. ```pycon >>> data = {'key1': 'value1', 'key2': 'value2'} >>> r = httpx2.post("https://httpbin.org/post", data=data) >>> print(r.text) { ... "form": { "key2": "value2", "key1": "value1" }, ... } ``` Form encoded data can also include multiple values from a given key. ```pycon >>> data = {'key1': ['value1', 'value2']} >>> r = httpx2.post("https://httpbin.org/post", data=data) >>> print(r.text) { ... "form": { "key1": [ "value1", "value2" ] }, ... } ``` ## Sending Multipart File Uploads You can also upload files, using HTTP multipart encoding: ```pycon >>> with open('report.xls', 'rb') as report_file: ... files = {'upload-file': report_file} ... r = httpx2.post("https://httpbin.org/post", files=files) >>> print(r.text) { ... "files": { "upload-file": "<... binary content ...>" }, ... } ``` You can also explicitly set the filename and content type, by using a tuple of items for the file value: ```pycon >>> with open('report.xls', 'rb') as report_file: ... files = {'upload-file': ('report.xls', report_file, 'application/vnd.ms-excel')} ... r = httpx2.post("https://httpbin.org/post", files=files) >>> print(r.text) { ... "files": { "upload-file": "<... binary content ...>" }, ... } ``` If you need to include non-file data fields in the multipart form, use the `data=...` parameter: ```pycon >>> data = {'message': 'Hello, world!'} >>> with open('report.xls', 'rb') as report_file: ... files = {'file': report_file} ... r = httpx2.post("https://httpbin.org/post", data=data, files=files) >>> print(r.text) { ... "files": { "file": "<... binary content ...>" }, "form": { "message": "Hello, world!", }, ... } ``` ## Sending JSON Encoded Data Form encoded data is okay if all you need is a simple key-value data structure. For more complicated data structures you'll often want to use JSON encoding instead. ```pycon >>> data = {'integer': 123, 'boolean': True, 'list': ['a', 'b', 'c']} >>> r = httpx2.post("https://httpbin.org/post", json=data) >>> print(r.text) { ... "json": { "boolean": true, "integer": 123, "list": [ "a", "b", "c" ] }, ... } ``` ## Sending Binary Request Data For other encodings, you should use the `content=...` parameter, passing either a `bytes` type or a generator that yields `bytes`. ```pycon >>> content = b'Hello, world' >>> r = httpx2.post("https://httpbin.org/post", content=content) ``` You may also want to set a custom `Content-Type` header when uploading binary data. ## Response Status Codes We can inspect the HTTP status code of the response: ```pycon >>> r = httpx2.get('https://httpbin.org/get') >>> r.status_code 200 ``` HTTPX also includes an easy shortcut for accessing status codes by their text phrase. ```pycon >>> r.status_code == httpx2.codes.OK True ``` We can raise an exception for any responses which are not a 2xx success code: ```pycon >>> not_found = httpx2.get('https://httpbin.org/status/404') >>> not_found.status_code 404 >>> not_found.raise_for_status() Traceback (most recent call last): File "/Users/tomchristie/GitHub/encode/httpcore/httpx2/models.py", line 837, in raise_for_status raise HTTPStatusError(message, response=self) httpx2._exceptions.HTTPStatusError: 404 Client Error: Not Found for url: https://httpbin.org/status/404 For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/404 ``` Any successful response codes will return the `Response` instance rather than raising an exception. ```pycon >>> r.raise_for_status() ``` The method returns the response instance, allowing you to use it inline. For example: ```pycon >>> r = httpx2.get('...').raise_for_status() >>> data = httpx2.get('...').raise_for_status().json() ``` ## Response Headers The response headers are available as a dictionary-like interface. ```pycon >>> r.headers Headers({ 'content-encoding': 'gzip', 'transfer-encoding': 'chunked', 'connection': 'close', 'server': 'nginx/1.0.4', 'x-runtime': '148ms', 'etag': '"e1ca502697e5c9317743dc078f67693f"', 'content-type': 'application/json' }) ``` The `Headers` data type is case-insensitive, so you can use any capitalization. ```pycon >>> r.headers['Content-Type'] 'application/json' >>> r.headers.get('content-type') 'application/json' ``` Multiple values for a single response header are represented as a single comma-separated value, as per [RFC 7230](https://tools.ietf.org/html/rfc7230#section-3.2): > A recipient MAY combine multiple header fields with the same field name into one β€œfield-name: field-value” pair, without changing the semantics of the message, by appending each subsequent field-value to the combined field value in order, separated by a comma. ## Streaming Responses For large downloads you may want to use streaming responses that do not load the entire response body into memory at once. You can stream the binary content of the response... ```pycon >>> with httpx2.stream("GET", "https://www.example.com") as r: ... for data in r.iter_bytes(): ... print(data) ``` Or the text of the response... ```pycon >>> with httpx2.stream("GET", "https://www.example.com") as r: ... for text in r.iter_text(): ... print(text) ``` Or stream the text, on a line-by-line basis... ```pycon >>> with httpx2.stream("GET", "https://www.example.com") as r: ... for line in r.iter_lines(): ... print(line) ``` HTTPX will use universal line endings, normalising all cases to `\n`. In some cases you might want to access the raw bytes on the response without applying any HTTP content decoding. In this case any content encoding that the web server has applied such as `gzip`, `deflate`, `brotli`, or `zstd` will not be automatically decoded. ```pycon >>> with httpx2.stream("GET", "https://www.example.com") as r: ... for chunk in r.iter_raw(): ... print(chunk) ``` If you're using streaming responses in any of these ways then the `response.content` and `response.text` attributes will not be available, and will raise errors if accessed. However you can also use the response streaming functionality to conditionally load the response body: ```pycon >>> with httpx2.stream("GET", "https://www.example.com") as r: ... if int(r.headers['Content-Length']) < TOO_LONG: ... r.read() ... print(r.text) ``` ## Cookies Any cookies that are set on the response can be easily accessed: ```pycon >>> r = httpx2.get('https://httpbin.org/cookies/set?chocolate=chip') >>> r.cookies['chocolate'] 'chip' ``` To include cookies in an outgoing request, use the `cookies` parameter: ```pycon >>> cookies = {"peanut": "butter"} >>> r = httpx2.get('https://httpbin.org/cookies', cookies=cookies) >>> r.json() {'cookies': {'peanut': 'butter'}} ``` Cookies are returned in a `Cookies` instance, which is a dict-like data structure with additional API for accessing cookies by their domain or path. ```pycon >>> cookies = httpx2.Cookies() >>> cookies.set('cookie_on_domain', 'hello, there!', domain='httpbin.org') >>> cookies.set('cookie_off_domain', 'nope.', domain='example.org') >>> r = httpx2.get('http://httpbin.org/cookies', cookies=cookies) >>> r.json() {'cookies': {'cookie_on_domain': 'hello, there!'}} ``` ## Redirection and History By default, HTTPX will **not** follow redirects for all HTTP methods, although this can be explicitly enabled. For example, GitHub redirects all HTTP requests to HTTPS. ```pycon >>> r = httpx2.get('http://github.com/') >>> r.status_code 301 >>> r.history [] >>> r.next_request ``` You can modify the default redirection handling with the `follow_redirects` parameter: ```pycon >>> r = httpx2.get('http://github.com/', follow_redirects=True) >>> r.url URL('https://github.com/') >>> r.status_code 200 >>> r.history [] ``` The `history` property of the response can be used to inspect any followed redirects. It contains a list of any redirect responses that were followed, in the order in which they were made. ## Timeouts HTTPX defaults to including reasonable timeouts for all network operations, meaning that if a connection is not properly established then it should always raise an error rather than hanging indefinitely. The default timeout for network inactivity is five seconds. You can modify the value to be more or less strict: ```pycon >>> httpx2.get('https://github.com/', timeout=0.001) ``` You can also disable the timeout behavior completely... ```pycon >>> httpx2.get('https://github.com/', timeout=None) ``` For advanced timeout management, see [Timeout fine-tuning](advanced/timeouts.md#fine-tuning-the-configuration). ## Authentication HTTPX supports Basic and Digest HTTP authentication. To provide Basic authentication credentials, pass a 2-tuple of plaintext `str` or `bytes` objects as the `auth` argument to the request functions: ```pycon >>> httpx2.get("https://example.com", auth=("my_user", "password123")) ``` To provide credentials for Digest authentication you'll need to instantiate a `DigestAuth` object with the plaintext username and password as arguments. This object can be then passed as the `auth` argument to the request methods as above: ```pycon >>> auth = httpx2.DigestAuth("my_user", "password123") >>> httpx2.get("https://example.com", auth=auth) ``` ## Exceptions HTTPX will raise exceptions if an error occurs. The most important exception classes in HTTPX are `RequestError` and `HTTPStatusError`. The `RequestError` class is a superclass that encompasses any exception that occurs while issuing an HTTP request. These exceptions include a `.request` attribute. ```python try: response = httpx2.get("https://www.example.com/") except httpx2.RequestError as exc: print(f"An error occurred while requesting {exc.request.url!r}.") ``` The `HTTPStatusError` class is raised by `response.raise_for_status()` on responses which are not a 2xx success code. These exceptions include both a `.request` and a `.response` attribute. ```python response = httpx2.get("https://www.example.com/") try: response.raise_for_status() except httpx2.HTTPStatusError as exc: print(f"Error response {exc.response.status_code} while requesting {exc.request.url!r}.") ``` There is also a base class `HTTPError` that includes both of these categories, and can be used to catch either failed requests, or 4xx and 5xx responses. You can either use this base class to catch both categories... ```python try: response = httpx2.get("https://www.example.com/") response.raise_for_status() except httpx2.HTTPError as exc: print(f"Error while requesting {exc.request.url!r}.") ``` Or handle each case explicitly... ```python try: response = httpx2.get("https://www.example.com/") response.raise_for_status() except httpx2.RequestError as exc: print(f"An error occurred while requesting {exc.request.url!r}.") except httpx2.HTTPStatusError as exc: print(f"Error response {exc.response.status_code} while requesting {exc.request.url!r}.") ``` For a full list of available exceptions, see [Exceptions (API Reference)](exceptions.md). pydantic-httpx2-9b7ee8e/docs/sse.md000066400000000000000000000054511521723372100173420ustar00rootroot00000000000000# Server-Sent Events [Server-sent events][mdn] (SSE) let a server push a stream of events to the client over a single long-lived HTTP response with the `text/event-stream` content type. HTTPX has native support for consuming them through `client.sse()`. ## Consuming events `client.sse()` is a context manager that yields an `EventSource`. Iterating the `EventSource` decodes the stream and yields a `ServerSentEvent` for each event: ```pycon >>> with httpx2.Client() as client: ... with client.sse("https://example.com/sse") as source: ... for event in source: ... print(event.event, event.data) ``` It works the same way with the async client, using `async with` and `async for`: ```pycon >>> async with httpx2.AsyncClient() as client: ... async with client.sse("https://example.com/sse") as source: ... async for event in source: ... print(event.event, event.data) ``` `sse()` issues a `GET` request by default. Some APIs stream events in response to a `POST` - pass `method="POST"` along with the usual request arguments: ```pycon >>> with client.sse("https://example.com/sse", method="POST", json={"query": "..."}) as source: ... for event in source: ... print(event.data) ``` The `Accept: text/event-stream` and `Cache-Control: no-store` headers are set for you; any headers you pass take precedence. ## The `ServerSentEvent` Each event exposes the fields defined by the SSE specification: | Attribute | Description | | --------- | ----------- | | `event` | The event type. Defaults to `"message"`. | | `data` | The event payload. Multiple `data:` lines are joined with `\n`. | | `id` | The last event ID, which persists across events until changed. | | `retry` | The reconnection time in milliseconds, or `None`. | When the payload is JSON, `event.json()` decodes `event.data` for you: ```pycon >>> with client.sse("https://example.com/sse") as source: ... for event in source: ... print(event.json()) ``` ## Accessing the response The underlying [`Response`](api.md#response) is available as `source.response`, which is useful for inspecting the status code or headers before iterating: ```pycon >>> with client.sse("https://example.com/sse") as source: ... source.response.raise_for_status() ... for event in source: ... print(event.data) ``` ## Error handling If the response does not have a `text/event-stream` content type, iterating the `EventSource` raises `SSEError`: ```pycon >>> with client.sse("https://example.com/not-an-event-stream") as source: ... for event in source: # raises httpx2.SSEError ... ... ``` `SSEError` is a subclass of [`TransportError`](exceptions.md), so it is also caught by `except httpx2.TransportError`. [mdn]: https://developer.mozilla.org/en-US/docs/Web/API/Server-sent_events pydantic-httpx2-9b7ee8e/docs/third_party_packages.md000066400000000000000000000073621521723372100227420ustar00rootroot00000000000000# Third Party Packages As HTTPX usage grows, there is an expanding community of developers building tools and libraries that integrate with HTTPX, or depend on HTTPX. Here are some of them. ## Plugins ### Hishel [GitHub](https://github.com/karpetrosyan/hishel) - [Documentation](https://hishel.com/) An elegant HTTP Cache implementation for HTTPX and HTTP Core. ### HTTPX-Auth [GitHub](https://github.com/Colin-b/httpx_auth) - [Documentation](https://colin-b.github.io/httpx_auth/) Provides authentication classes to be used with HTTPX's [authentication parameter](advanced/authentication.md#custom-authentication-schemes). ### httpx-caching [Github](https://github.com/johtso/httpx-caching) This package adds caching functionality to HTTPX ### httpx-secure [GitHub](https://github.com/Zaczero/httpx-secure) Drop-in SSRF protection for httpx with DNS caching and custom validation support. ### httpx-socks [GitHub](https://github.com/romis2012/httpx-socks) Proxy (HTTP, SOCKS) transports for httpx. ### httpx-sse [GitHub](https://github.com/florimondmanca/httpx-sse) Allows consuming Server-Sent Events (SSE) with HTTPX. ### httpx-retries [GitHub](https://github.com/will-ockmore/httpx-retries) - [Documentation](https://will-ockmore.github.io/httpx-retries/) A retry layer for HTTPX. ### httpx-ws [GitHub](https://github.com/frankie567/httpx-ws) - [Documentation](https://frankie567.github.io/httpx-ws/) WebSocket support for HTTPX. ### httpx2-pytest [GitHub](https://github.com/angryfoxx/httpx2-pytest) - [Documentation](https://github.com/angryfoxx/httpx2-pytest#about-httpx2) Provides a [pytest](https://docs.pytest.org/en/latest/) fixture to mock HTTPX within test cases. This package is fork of the [pytest-httpx](https://github.com/Colin-b/pytest_httpx) package that compatible with httpx2 ### pytest-HTTPX [GitHub](https://github.com/Colin-b/pytest_httpx) - [Documentation](https://colin-b.github.io/pytest_httpx/) Provides a [pytest](https://docs.pytest.org/en/latest/) fixture to mock HTTPX within test cases. ### pytest-HTTPX2 [GitHub](https://github.com/lundberg/pytest-httpx2) A pytest plugin for mocking out HTTPX2 using RESPX. ### RESPX [GitHub](https://github.com/lundberg/respx) - [Documentation](https://lundberg.github.io/respx/) A utility for mocking out HTTPX. ### rpc.py [Github](https://github.com/abersheeran/rpc.py) - [Documentation](https://github.com/abersheeran/rpc.py#rpcpy) A fast and powerful RPC framework based on ASGI/WSGI. Use HTTPX as the client of the RPC service. ## Libraries with HTTPX support ### Authlib [GitHub](https://github.com/lepture/authlib) - [Documentation](https://docs.authlib.org/en/latest/) A python library for building OAuth and OpenID Connect clients and servers. Includes an [OAuth HTTPX client](https://docs.authlib.org/en/latest/client/httpx.html). ### Gidgethub [GitHub](https://github.com/brettcannon/gidgethub) - [Documentation](https://gidgethub.readthedocs.io/en/latest/index.html) An asynchronous GitHub API library. Includes [HTTPX support](https://gidgethub.readthedocs.io/en/latest/httpx.html). ### httpdbg [GitHub](https://github.com/cle-b/httpdbg) - [Documentation](https://httpdbg.readthedocs.io/) A tool for python developers to easily debug the HTTP(S) client requests in a python program. ### VCR.py [GitHub](https://github.com/kevin1024/vcrpy) - [Documentation](https://vcrpy.readthedocs.io/) Record and repeat requests. ## Gists ### urllib3-transport [GitHub](https://gist.github.com/florimondmanca/d56764d78d748eb9f73165da388e546e) This public gist provides an example implementation for a [custom transport](advanced/transports.md#custom-transports) implementation on top of the battle-tested [`urllib3`](https://urllib3.readthedocs.io) library. pydantic-httpx2-9b7ee8e/docs/troubleshooting.md000066400000000000000000000041551521723372100217770ustar00rootroot00000000000000# Troubleshooting This page lists some common problems or issues you could encounter while developing with HTTPX, as well as possible solutions. ## Proxies --- ### "`The handshake operation timed out`" on HTTPS requests when using a proxy **Description**: When using a proxy and making an HTTPS request, you see an exception looking like this: ```console httpx2.ProxyError: _ssl.c:1091: The handshake operation timed out ``` **Similar issues**: [encode/httpx#1412](https://github.com/encode/httpx/issues/1412), [encode/httpx#1433](https://github.com/encode/httpx/issues/1433) **Resolution**: it is likely that you've set up your proxies like this... ```python mounts = { "http://": httpx2.HTTPTransport(proxy="http://myproxy.org"), "https://": httpx2.HTTPTransport(proxy="https://myproxy.org"), } ``` Using this setup, you're telling HTTPX to connect to the proxy using HTTP for HTTP requests, and using HTTPS for HTTPS requests. But if you get the error above, it is likely that your proxy doesn't support connecting via HTTPS. Don't worry: that's a [common gotcha](advanced/proxies.md#http-proxies). Change the scheme of your HTTPS proxy to `http://...` instead of `https://...`: ```python mounts = { "http://": httpx2.HTTPTransport(proxy="http://myproxy.org"), "https://": httpx2.HTTPTransport(proxy="http://myproxy.org"), } ``` This can be simplified to: ```python proxy = "http://myproxy.org" with httpx2.Client(proxy=proxy) as client: ... ``` For more information, see [Proxies: FORWARD vs TUNNEL](advanced/proxies.md#forward-vs-tunnel). --- ### Error when making requests to an HTTPS proxy **Description**: your proxy _does_ support connecting via HTTPS, but you are seeing errors along the lines of... ```console httpx2.ProxyError: [SSL: PRE_MAC_LENGTH_TOO_LONG] invalid alert (_ssl.c:1091) ``` **Similar issues**: [encode/httpx#1424](https://github.com/encode/httpx/issues/1424). **Resolution**: HTTPX does not properly support HTTPS proxies at this time. If that's something you're interested in having, please see [encode/httpx#1434](https://github.com/encode/httpx/issues/1434) and consider lending a hand there. pydantic-httpx2-9b7ee8e/mkdocs.yml000066400000000000000000000043431521723372100173000ustar00rootroot00000000000000site_name: HTTPX2 site_description: A next-generation HTTP client for Python. theme: name: 'material' palette: - scheme: 'default' media: '(prefers-color-scheme: light)' toggle: icon: 'material/lightbulb' name: "Switch to dark mode" - scheme: 'slate' media: '(prefers-color-scheme: dark)' primary: 'blue' toggle: icon: 'material/lightbulb-outline' name: 'Switch to light mode' repo_name: pydantic/httpx2 repo_url: https://github.com/pydantic/httpx2/ edit_uri: "" nav: - Introduction: 'index.md' - QuickStart: 'quickstart.md' - Advanced: - Clients: 'advanced/clients.md' - Authentication: 'advanced/authentication.md' - SSL: 'advanced/ssl.md' - Proxies: 'advanced/proxies.md' - Timeouts: 'advanced/timeouts.md' - Resource Limits: 'advanced/resource-limits.md' - Event Hooks: 'advanced/event-hooks.md' - Transports: 'advanced/transports.md' - Text Encodings: 'advanced/text-encodings.md' - Extensions: 'advanced/extensions.md' - Guides: - Async Support: 'async.md' - HTTP/2 Support: 'http2.md' - Logging: 'logging.md' - Server-Sent Events: 'sse.md' - Requests Compatibility: 'compatibility.md' - Troubleshooting: 'troubleshooting.md' - API Reference: - Developer Interface: 'api.md' - Exceptions: 'exceptions.md' - Environment Variables: 'environment_variables.md' - Community: - Third Party Packages: 'third_party_packages.md' - Contributing: 'contributing.md' - Code of Conduct: 'code_of_conduct.md' plugins: - mkdocstrings: handlers: python: inventories: - https://docs.python.org/3/objects.inv options: show_root_heading: true show_source: false show_signature_annotations: true separate_signature: true line_length: 60 heading_level: 3 inherited_members: true markdown_extensions: - admonition - pymdownx.highlight: use_pygments: true pygments_lang_class: true - pymdownx.superfences extra_css: - css/custom.css pydantic-httpx2-9b7ee8e/pyproject.toml000066400000000000000000000050001521723372100202000ustar00rootroot00000000000000[tool.uv] package = false default-groups = ["dev", "docs", "bench"] required-version = ">=0.8.6" exclude-newer = "7 days" exclude-newer-package = { idna = "2026-06-03T00:00:00Z" } [tool.uv.workspace] members = ["src/httpx2", "src/httpcore2"] [tool.uv.sources] httpcore2 = { workspace = true } httpx2 = { workspace = true } [dependency-groups] dev = [ "httpx2[brotli,cli,http2,socks,zstd]", "httpcore2[asyncio,trio,http2,socks]", # Tests "chardet==6.0.0.post1", "coverage[toml]==7.10.6", "cryptography==46.0.7", "pytest>=9.0.3", "pytest-codspeed>=4.1.1", "pytest-httpbin==2.0.0", "pytest-trio==0.8.0", "trio==0.31.0", "trio-typing==0.10.0", "trustme==1.2.1", "uvicorn>=0.35", "werkzeug>=3.1.6", # Linting "mypy==1.17.1", "ruff==0.15.13", # Packaging "build==1.3.0", "twine==6.1.0", ] docs = ["zensical>=0.0.41", "mkdocstrings[python]>=0.27"] bench = [ "aiohttp>=3.10.2", "matplotlib>=3.9", "pyinstrument>=4.6.2", "urllib3>=2.2.2", ] [tool.ruff] line-length = 120 exclude = ["src/httpcore2/httpcore2/_sync", "tests/httpcore2/_sync"] [tool.ruff.lint] select = ["B", "C4", "E", "F", "I", "PERF", "PIE", "UP", "W"] ignore = ["B904", "B028", "C401", "PERF203"] [tool.ruff.lint.isort] combine-as-imports = true known-first-party = ["httpx2", "httpcore2"] [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F403", "F405"] [tool.mypy] ignore_missing_imports = true strict = true [tool.pytest.ini_options] addopts = "-rxXs --import-mode=importlib" testpaths = ["tests"] filterwarnings = [ "error", "ignore: You seem to already have a custom sys.excepthook handler installed. I'll skip installing Trio's custom handler, but this means MultiErrors will not show full tracebacks.:RuntimeWarning", # See: https://github.com/agronholm/anyio/issues/508 "ignore: trio.MultiError is deprecated since Trio 0.22.0:trio.TrioDeprecationWarning", ] markers = [ "copied_from(source, changes=None): mark test as copied from somewhere else, along with a description of changes made to accommodate e.g. our test setup", "network: marks tests which require network connection. Used in 3rd-party build environments that have network disabled.", "benchmark: marks CodSpeed benchmark tests under tests/test_benchmark.py.", ] [tool.coverage.run] source_pkgs = ["httpx2", "httpcore2", "tests"] omit = ["src/httpcore2/httpcore2/_sync/*", "tests/test_benchmark.py"] [tool.coverage.report] exclude_also = [ "if TYPE_CHECKING:", "if typing.TYPE_CHECKING:", "raise NotImplementedError", "@(typing\\.)?overload", ] pydantic-httpx2-9b7ee8e/scripts/000077500000000000000000000000001521723372100167605ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/scripts/benchmark000077500000000000000000000003631521723372100206420ustar00rootroot00000000000000#!/bin/sh -e # Usage: scripts/benchmark async|sync set -x uv run python tests/httpcore2/benchmark/server.py & SERVER_PID=$! EXIT_CODE=0 uv run python tests/httpcore2/benchmark/client.py "$@" || EXIT_CODE=$? kill $SERVER_PID exit $EXIT_CODE pydantic-httpx2-9b7ee8e/scripts/build000077500000000000000000000001571521723372100200100ustar00rootroot00000000000000#!/bin/sh -e set -x uv build --all-packages uv run twine check dist/* uv run zensical build -c -f mkdocs.yml pydantic-httpx2-9b7ee8e/scripts/check000077500000000000000000000003521521723372100177630ustar00rootroot00000000000000#!/bin/sh -e export SOURCE_FILES="src/httpx2 tests/httpx2 src/httpcore2 tests/httpcore2" set -x uv lock --check uv run ruff format --check --diff uv run mypy $SOURCE_FILES uv run ruff check uv run python scripts/unasync.py --check pydantic-httpx2-9b7ee8e/scripts/coverage000077500000000000000000000001341521723372100204770ustar00rootroot00000000000000#!/bin/sh -e set -x uv run coverage report --show-missing --skip-covered --fail-under=100 pydantic-httpx2-9b7ee8e/scripts/docs000077500000000000000000000000721521723372100176350ustar00rootroot00000000000000#!/bin/sh -e set -x uv run zensical serve -f mkdocs.yml pydantic-httpx2-9b7ee8e/scripts/install000077500000000000000000000000471521723372100203550ustar00rootroot00000000000000#!/bin/sh -e set -x uv sync --frozen pydantic-httpx2-9b7ee8e/scripts/lint000077500000000000000000000005361521723372100176600ustar00rootroot00000000000000#!/bin/sh -e export SOURCE_FILES="src/httpx2 tests/httpx2 src/httpcore2 tests/httpcore2" set -x uv run ruff format $SOURCE_FILES uv run ruff check --fix $SOURCE_FILES # Run unasync last because its `--check` mode is not aware of code formatters. # (This means sync code isn't prettified, and that's mostly okay.) uv run python scripts/unasync.py pydantic-httpx2-9b7ee8e/scripts/test000077500000000000000000000002461521723372100176670ustar00rootroot00000000000000#!/bin/sh set -ex if [ -z $GITHUB_ACTIONS ]; then scripts/check fi uv run coverage run -m pytest "$@" if [ -z $GITHUB_ACTIONS ]; then scripts/coverage fi pydantic-httpx2-9b7ee8e/scripts/unasync.py000066400000000000000000000063051521723372100210160ustar00rootroot00000000000000#!venv/bin/python import os import re import sys from pprint import pprint SUBS = [ ( "from .._backends.auto import AutoBackend", "from .._backends.sync import SyncBackend", ), ("import trio as concurrency", "from tests.httpcore2 import concurrency"), ("AsyncIterator", "Iterator"), ("Async([A-Z][A-Za-z0-9_]*)", r"\2"), ("async def", "def"), ("async with", "with"), ("async for", "for"), ("await ", ""), ("handle_async_request", "handle_request"), ("aclose", "close"), ("aiter_stream", "iter_stream"), ("aread", "read"), ("asynccontextmanager", "contextmanager"), ("safe_async_iterate", "safe_iterate"), ("__aenter__", "__enter__"), ("__aexit__", "__exit__"), ("__aiter__", "__iter__"), ("@pytest.mark.anyio", ""), ("@pytest.mark.trio", ""), ("AutoBackend", "SyncBackend"), ] COMPILED_SUBS = [(re.compile(r"(^|\b)" + regex + r"($|\b)"), repl) for regex, repl in SUBS] USED_SUBS = set() def unasync_line(line): for index, (regex, repl) in enumerate(COMPILED_SUBS): old_line = line line = re.sub(regex, repl, line) if old_line != line: USED_SUBS.add(index) return line def unasync_file(in_path, out_path): with open(in_path) as in_file: with open(out_path, "w", newline="") as out_file: for line in in_file.readlines(): line = unasync_line(line) out_file.write(line) def unasync_file_check(in_path, out_path): with open(in_path) as in_file: with open(out_path) as out_file: for in_line, out_line in zip(in_file.readlines(), out_file.readlines(), strict=True): expected = unasync_line(in_line) if out_line != expected: print(f"unasync mismatch between {in_path!r} and {out_path!r}") print(f"Async code: {in_line!r}") print(f"Expected sync code: {expected!r}") print(f"Actual sync code: {out_line!r}") sys.exit(1) def unasync_dir(in_dir, out_dir, check_only=False): for dirpath, _dirnames, filenames in os.walk(in_dir): for filename in filenames: if not filename.endswith(".py"): continue rel_dir = os.path.relpath(dirpath, in_dir) in_path = os.path.normpath(os.path.join(in_dir, rel_dir, filename)) out_path = os.path.normpath(os.path.join(out_dir, rel_dir, filename)) print(in_path, "->", out_path) if check_only: unasync_file_check(in_path, out_path) else: unasync_file(in_path, out_path) def main(): check_only = "--check" in sys.argv unasync_dir( "src/httpcore2/httpcore2/_async", "src/httpcore2/httpcore2/_sync", check_only=check_only, ) unasync_dir( "tests/httpcore2/_async", "tests/httpcore2/_sync", check_only=check_only, ) if len(USED_SUBS) != len(SUBS): unused_subs = [SUBS[i] for i in range(len(SUBS)) if i not in USED_SUBS] print("These patterns were not used:") pprint(unused_subs) exit(1) if __name__ == "__main__": main() pydantic-httpx2-9b7ee8e/src/000077500000000000000000000000001521723372100160605ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpcore2/000077500000000000000000000000001521723372100177725ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpcore2/.gitignore000066400000000000000000000001701521723372100217600ustar00rootroot00000000000000*.pyc .coverage .pytest_cache/ .mypy_cache/ __pycache__/ htmlcov/ site/ *.egg-info/ venv*/ .python-version build/ dist/ pydantic-httpx2-9b7ee8e/src/httpcore2/CHANGELOG.md000066400000000000000000000451771521723372100216210ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## 2.5.0 (June 25th, 2026) ### Fixed * Propagate the timeout through the SOCKS5 handshake. ([#1009](https://github.com/pydantic/httpx2/pull/1009)) ## 2.4.0 (June 11th, 2026) ### Fixed * Move HTTP/2 stream events cleanup inside `_state_lock`. ([#1013](https://github.com/pydantic/httpx2/pull/1013)) * Release the HTTP/2 semaphore permit on `NoAvailableStreamIDError`. ([#1012](https://github.com/pydantic/httpx2/pull/1012)) * Use `RLock` instead of `Lock` to prevent a thread deadlock. ([#1008](https://github.com/pydantic/httpx2/pull/1008)) ## 2.3.0 (June 1st, 2026) ### Changed * Use `truststore` instead of `certifi` for default SSL verification, loading the operating system's trust store. ([#1002](https://github.com/pydantic/httpx2/pull/1002)) * Rewrite `_assign_requests_to_connections` as a single-pass loop. ([#974](https://github.com/pydantic/httpx2/pull/974)) * Use `anyio`'s `fast_acquire` for `Lock` and `Semaphore`. ([#970](https://github.com/pydantic/httpx2/pull/970)) * Use `memoryview` in `write()` to avoid copies. ([#954](https://github.com/pydantic/httpx2/pull/954)) ## 2.2.0 (May 16th, 2026) No changes since `2.1.0`. Version bumped to stay in lockstep with `httpx2`. ## 2.1.0 (May 15th, 2026) ### Removed * Drop support for Python 3.8 and 3.9. ([#208](https://github.com/pydantic/httpx2/pull/208)) ### Added * Add support for Python 3.14. ([#208](https://github.com/pydantic/httpx2/pull/208)) * Bundle `LICENSE.md` in the sdist. ([#938](https://github.com/pydantic/httpx2/pull/938)) ### Fixed * Wait for positive flow-control credit when a peer's `SETTINGS` frame drives a stream's send window negative, instead of letting h2 raise `LocalProtocolError`. ([#935](https://github.com/pydantic/httpx2/pull/935)) ## 2.0.0 Official first release of `httpcore2`. No changes since `2.0.0b1`. ## 2.0.0b1 First release of `httpcore2`, a fork of [`httpcore`](https://github.com/encode/httpcore) maintained by Pydantic. Forked from `httpcore 1.0.9`. ### Breaking changes * **Renamed package**: `httpcore` -> `httpcore2`. `import httpcore` becomes `import httpcore2`. No other public API changed. ### Fixed * Fix `max_keepalive_connections` not being properly handled. (Inherited from upstream PR [encode/httpcore#1000](https://github.com/encode/httpcore/pull/1000).) --- Historical entries below are from upstream `encode/httpcore`. ## Version 1.0.9 (April 24th, 2025) - Resolve https://github.com/advisories/GHSA-vqfr-h8mv-ghfj with h11 dependency update. (#1008) ## Version 1.0.8 (April 11th, 2025) - Fix `AttributeError` when importing on Python 3.14. (#1005) ## Version 1.0.7 (November 15th, 2024) - Support `proxy=…` configuration on `ConnectionPool()`. (#974) ## Version 1.0.6 (October 1st, 2024) - Relax `trio` dependency pinning. (#956) - Handle `trio` raising `NotImplementedError` on unsupported platforms. (#955) - Handle mapping `ssl.SSLError` to `httpcore.ConnectError`. (#918) ## 1.0.5 (March 27th, 2024) - Handle `EndOfStream` exception for anyio backend. (#899) - Allow trio `0.25.*` series in package dependencies. (#903) ## 1.0.4 (February 21st, 2024) - Add `target` request extension. (#888) - Fix support for connection `Upgrade` and `CONNECT` when some data in the stream has been read. (#882) ## 1.0.3 (February 13th, 2024) - Fix support for async cancellations. (#880) - Fix trace extension when used with socks proxy. (#849) - Fix SSL context for connections using the "wss" scheme (#869) ## 1.0.2 (November 10th, 2023) - Fix `float("inf")` timeouts in `Event.wait` function. (#846) ## 1.0.1 (November 3rd, 2023) - Fix pool timeout to account for the total time spent retrying. (#823) - Raise a neater RuntimeError when the correct async deps are not installed. (#826) - Add support for synchronous TLS-in-TLS streams. (#840) ## 1.0.0 (October 6th, 2023) From version 1.0 our async support is now optional, as the package has minimal dependencies by default. For async support use either `pip install 'httpcore[asyncio]'` or `pip install 'httpcore[trio]'`. The project versioning policy is now explicitly governed by SEMVER. See https://semver.org/. - Async support becomes fully optional. (#809) - Add support for Python 3.12. (#807) ## 0.18.0 (September 8th, 2023) - Add support for HTTPS proxies. (#745, #786) - Drop Python 3.7 support. (#727) - Handle `sni_hostname` extension with SOCKS proxy. (#774) - Handle HTTP/1.1 half-closed connections gracefully. (#641) - Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#762) ## 0.17.3 (July 5th, 2023) - Support async cancellations, ensuring that the connection pool is left in a clean state when cancellations occur. (#726) - The networking backend interface has [been added to the public API](https://www.encode.io/httpcore/network-backends). Some classes which were previously private implementation detail are now part of the top-level public API. (#699) - Graceful handling of HTTP/2 GoAway frames, with requests being transparently retried on a new connection. (#730) - Add exceptions when a synchronous `trace callback` is passed to an asynchronous request or an asynchronous `trace callback` is passed to a synchronous request. (#717) - Drop Python 3.7 support. (#727) ## 0.17.2 (May 23th, 2023) - Add `socket_options` argument to `ConnectionPool` and `HTTProxy` classes. (#668) - Improve logging with per-module logger names. (#690) - Add `sni_hostname` request extension. (#696) - Resolve race condition during import of `anyio` package. (#692) - Enable TCP_NODELAY for all synchronous sockets. (#651) ## 0.17.1 (May 17th, 2023) - If 'retries' is set, then allow retries if an SSL handshake error occurs. (#669) - Improve correctness of tracebacks on network exceptions, by raising properly chained exceptions. (#678) - Prevent connection-hanging behaviour when HTTP/2 connections are closed by a server-sent 'GoAway' frame. (#679) - Fix edge-case exception when removing requests from the connection pool. (#680) - Fix pool timeout edge-case. (#688) ## 0.17.0 (March 16th, 2023) - Add DEBUG level logging. (#648) - Respect HTTP/2 max concurrent streams when settings updates are sent by server. (#652) - Increase the allowable HTTP header size to 100kB. (#647) - Add `retries` option to SOCKS proxy classes. (#643) ## 0.16.3 (December 20th, 2022) - Allow `ws` and `wss` schemes. Allows us to properly support websocket upgrade connections. (#625) - Forwarding HTTP proxies use a connection-per-remote-host. Required by some proxy implementations. (#637) - Don't raise `RuntimeError` when closing a connection pool with active connections. Removes some error cases when cancellations are used. (#631) - Lazy import `anyio`, so that it's no longer a hard dependency, and isn't imported if unused. (#639) ## 0.16.2 (November 25th, 2022) - Revert 'Fix async cancellation behaviour', which introduced race conditions. (#627) - Raise `RuntimeError` if attempting to us UNIX domain sockets on Windows. (#619) ## 0.16.1 (November 17th, 2022) - Fix HTTP/1.1 interim informational responses, such as "100 Continue". (#605) ## 0.16.0 (October 11th, 2022) - Support HTTP/1.1 informational responses. (#581) - Fix async cancellation behaviour. (#580) - Support `h11` 0.14. (#579) ## 0.15.0 (May 17th, 2022) - Drop Python 3.6 support (#535) - Ensure HTTP proxy CONNECT requests include `timeout` configuration. (#506) - Switch to explicit `typing.Optional` for type hints. (#513) - For `trio` map OSError exceptions to `ConnectError`. (#543) ## 0.14.7 (February 4th, 2022) - Requests which raise a PoolTimeout need to be removed from the pool queue. (#502) - Fix AttributeError that happened when Socks5Connection were terminated. (#501) ## 0.14.6 (February 1st, 2022) - Fix SOCKS support for `http://` URLs. (#492) - Resolve race condition around exceptions during streaming a response. (#491) ## 0.14.5 (January 18th, 2022) - SOCKS proxy support. (#478) - Add proxy_auth argument to HTTPProxy. (#481) - Improve error message on 'RemoteProtocolError' exception when server disconnects without sending a response. (#479) ## 0.14.4 (January 5th, 2022) - Support HTTP/2 on HTTPS tunnelling proxies. (#468) - Fix proxy headers missing on HTTP forwarding. (#456) - Only instantiate SSL context if required. (#457) - More robust HTTP/2 handling. (#253, #439, #440, #441) ## 0.14.3 (November 17th, 2021) - Fix race condition when removing closed connections from the pool. (#437) ## 0.14.2 (November 16th, 2021) - Failed connections no longer remain in the pool. (Pull #433) ## 0.14.1 (November 12th, 2021) - `max_connections` becomes optional. (Pull #429) - `certifi` is now included in the install dependencies. (Pull #428) - `h2` is now strictly optional. (Pull #428) ## 0.14.0 (November 11th, 2021) The 0.14 release is a complete reworking of `httpcore`, comprehensively addressing some underlying issues in the connection pooling, as well as substantially redesigning the API to be more user friendly. Some of the lower-level API design also makes the components more easily testable in isolation, and the package now has 100% test coverage. See [discussion #419](https://github.com/encode/httpcore/discussions/419) for a little more background. There's some other neat bits in there too, such as the "trace" extension, which gives a hook into inspecting the internal events that occur during the request/response cycle. This extension is needed for the HTTPX cli, in order to... * Log the point at which the connection is established, and the IP/port on which it is made. * Determine if the outgoing request should log as HTTP/1.1 or HTTP/2, rather than having to assume it's HTTP/2 if the --http2 flag was passed. (Which may not actually be true.) * Log SSL version info / certificate info. Note that `curio` support is not currently available in 0.14.0. If you're using `httpcore` with `curio` please get in touch, so we can assess if we ought to prioritize it as a feature or not. ## 0.13.7 (September 13th, 2021) - Fix broken error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #403) ## 0.13.6 (June 15th, 2021) ### Fixed - Close sockets when read or write timeouts occur. (Pull #365) ## 0.13.5 (June 14th, 2021) ### Fixed - Resolved niggles with AnyIO EOF behaviours. (Pull #358, #362) ## 0.13.4 (June 9th, 2021) ### Added - Improved error messaging when URL scheme is missing, or a non HTTP(S) scheme is used. (Pull #354) ### Fixed - Switched to `anyio` as the default backend implementation when running with `asyncio`. Resolves some awkward [TLS timeout issues](https://github.com/encode/httpx/discussions/1511). ## 0.13.3 (May 6th, 2021) ### Added - Support HTTP/2 prior knowledge, using `httpcore.SyncConnectionPool(http1=False)`. (Pull #333) ### Fixed - Handle cases where environment does not provide `select.poll` support. (Pull #331) ## 0.13.2 (April 29th, 2021) ### Added - Improve error message for specific case of `RemoteProtocolError` where server disconnects without sending a response. (Pull #313) ## 0.13.1 (April 28th, 2021) ### Fixed - More resilient testing for closed connections. (Pull #311) - Don't raise exceptions on ungraceful connection closes. (Pull #310) ## 0.13.0 (April 21st, 2021) The 0.13 release updates the core API in order to match the HTTPX Transport API, introduced in HTTPX 0.18 onwards. An example of making requests with the new interface is: ```python with httpcore.SyncConnectionPool() as http: status_code, headers, stream, extensions = http.handle_request( method=b'GET', url=(b'https', b'example.org', 443, b'/'), headers=[(b'host', b'example.org'), (b'user-agent', b'httpcore')] stream=httpcore.ByteStream(b''), extensions={} ) body = stream.read() print(status_code, body) ``` ### Changed - The `.request()` method is now `handle_request()`. (Pull #296) - The `.arequest()` method is now `.handle_async_request()`. (Pull #296) - The `headers` argument is no longer optional. (Pull #296) - The `stream` argument is no longer optional. (Pull #296) - The `ext` argument is now named `extensions`, and is no longer optional. (Pull #296) - The `"reason"` extension keyword is now named `"reason_phrase"`. (Pull #296) - The `"reason_phrase"` and `"http_version"` extensions now use byte strings for their values. (Pull #296) - The `httpcore.PlainByteStream()` class becomes `httpcore.ByteStream()`. (Pull #296) ### Added - Streams now support a `.read()` interface. (Pull #296) ### Fixed - Task cancellation no longer leaks connections from the connection pool. (Pull #305) ## 0.12.3 (December 7th, 2020) ### Fixed - Abort SSL connections on close rather than waiting for remote EOF when using `asyncio`. (Pull #167) - Fix exception raised in case of connect timeouts when using the `anyio` backend. (Pull #236) - Fix `Host` header precedence for `:authority` in HTTP/2. (Pull #241, #243) - Handle extra edge case when detecting for socket readability when using `asyncio`. (Pull #242, #244) - Fix `asyncio` SSL warning when using proxy tunneling. (Pull #249) ## 0.12.2 (November 20th, 2020) ### Fixed - Properly wrap connect errors on the asyncio backend. (Pull #235) - Fix `ImportError` occurring on Python 3.9 when using the HTTP/1.1 sync client in a multithreaded context. (Pull #237) ## 0.12.1 (November 7th, 2020) ### Added - Add connect retries. (Pull #221) ### Fixed - Tweak detection of dropped connections, resolving an issue with open files limits on Linux. (Pull #185) - Avoid leaking connections when establishing an HTTP tunnel to a proxy has failed. (Pull #223) - Properly wrap OS errors when using `trio`. (Pull #225) ## 0.12.0 (October 6th, 2020) ### Changed - HTTP header casing is now preserved, rather than always sent in lowercase. (#216 and python-hyper/h11#104) ### Added - Add Python 3.9 to officially supported versions. ### Fixed - Gracefully handle a stdlib asyncio bug when a connection is closed while it is in a paused-for-reading state. (#201) ## 0.11.1 (September 28nd, 2020) ### Fixed - Add await to async semaphore release() coroutine (#197) - Drop incorrect curio classifier (#192) ## 0.11.0 (September 22nd, 2020) The Transport API with 0.11.0 has a couple of significant changes. Firstly we've moved changed the request interface in order to allow extensions, which will later enable us to support features such as trailing headers, HTTP/2 server push, and CONNECT/Upgrade connections. The interface changes from: ```python def request(method, url, headers, stream, timeout): return (http_version, status_code, reason, headers, stream) ``` To instead including an optional dictionary of extensions on the request and response: ```python def request(method, url, headers, stream, ext): return (status_code, headers, stream, ext) ``` Having an open-ended extensions point will allow us to add later support for various optional features, that wouldn't otherwise be supported without these API changes. In particular: * Trailing headers support. * HTTP/2 Server Push * sendfile. * Exposing raw connection on CONNECT, Upgrade, HTTP/2 bi-di streaming. * Exposing debug information out of the API, including template name, template context. Currently extensions are limited to: * request: `timeout` - Optional. Timeout dictionary. * response: `http_version` - Optional. Include the HTTP version used on the response. * response: `reason` - Optional. Include the reason phrase used on the response. Only valid with HTTP/1.*. See https://github.com/encode/httpx/issues/1274#issuecomment-694884553 for the history behind this. Secondly, the async version of `request` is now namespaced as `arequest`. This allows concrete transports to support both sync and async implementations on the same class. ### Added - Add curio support. (Pull #168) - Add anyio support, with `backend="anyio"`. (Pull #169) ### Changed - Update the Transport API to use 'ext' for optional extensions. (Pull #190) - Update the Transport API to use `.request` and `.arequest` so implementations can support both sync and async. (Pull #189) ## 0.10.2 (August 20th, 2020) ### Added - Added Unix Domain Socket support. (Pull #139) ### Fixed - Always include the port on proxy CONNECT requests. (Pull #154) - Fix `max_keepalive_connections` configuration. (Pull #153) - Fixes behaviour in HTTP/1.1 where server disconnects can be used to signal the end of the response body. (Pull #164) ## 0.10.1 (August 7th, 2020) - Include `max_keepalive_connections` on `AsyncHTTPProxy`/`SyncHTTPProxy` classes. ## 0.10.0 (August 7th, 2020) The most notable change in the 0.10.0 release is that HTTP/2 support is now fully optional. Use either `pip install httpcore` for HTTP/1.1 support only, or `pip install httpcore[http2]` for HTTP/1.1 and HTTP/2 support. ### Added - HTTP/2 support becomes optional. (Pull #121, #130) - Add `local_address=...` support. (Pull #100, #134) - Add `PlainByteStream`, `IteratorByteStream`, `AsyncIteratorByteStream`. The `AsyncByteSteam` and `SyncByteStream` classes are now pure interface classes. (#133) - Add `LocalProtocolError`, `RemoteProtocolError` exceptions. (Pull #129) - Add `UnsupportedProtocol` exception. (Pull #128) - Add `.get_connection_info()` method. (Pull #102, #137) - Add better TRACE logs. (Pull #101) ### Changed - `max_keepalive` is deprecated in favour of `max_keepalive_connections`. (Pull #140) ### Fixed - Improve handling of server disconnects. (Pull #112) ## 0.9.1 (May 27th, 2020) ### Fixed - Proper host resolution for sync case, including IPv6 support. (Pull #97) - Close outstanding connections when connection pool is closed. (Pull #98) ## 0.9.0 (May 21th, 2020) ### Changed - URL port becomes an `Optional[int]` instead of `int`. (Pull #92) ### Fixed - Honor HTTP/2 max concurrent streams settings. (Pull #89, #90) - Remove incorrect debug log. (Pull #83) ## 0.8.4 (May 11th, 2020) ### Added - Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables and TRACE level logging. (Pull #79) ### Fixed - Reuse of connections on HTTP/2 in close concurrency situations. (Pull #81) ## 0.8.3 (May 6rd, 2020) ### Fixed - Include `Host` and `Accept` headers on proxy "CONNECT" requests. - De-duplicate any headers also contained in proxy_headers. - HTTP/2 flag not being passed down to proxy connections. ## 0.8.2 (May 3rd, 2020) ### Fixed - Fix connections using proxy forwarding requests not being added to the connection pool properly. (Pull #70) ## 0.8.1 (April 30th, 2020) ### Changed - Allow inherintance of both `httpcore.AsyncByteStream`, `httpcore.SyncByteStream` without type conflicts. ## 0.8.0 (April 30th, 2020) ### Fixed - Fixed tunnel proxy support. ###Β Added - New `TimeoutException` base class. ## 0.7.0 (March 5th, 2020) - First integration with HTTPX. pydantic-httpx2-9b7ee8e/src/httpcore2/LICENSE.md000066400000000000000000000030771521723372100214050ustar00rootroot00000000000000Copyright Β© 2026 to present Pydantic Services Inc. and individual contributors. Copyright Β© 2020, [Encode OSS Ltd](https://www.encode.io/). All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. pydantic-httpx2-9b7ee8e/src/httpcore2/README.md000066400000000000000000000064211521723372100212540ustar00rootroot00000000000000# HTTP Core [![Test Suite](https://github.com/encode/httpcore/workflows/Test%20Suite/badge.svg)](https://github.com/encode/httpcore/actions) [![Package version](https://badge.fury.io/py/httpcore.svg)](https://pypi.org/project/httpcore/) > *Do one thing, and do it well.* The HTTP Core package provides a minimal low-level HTTP client, which does one thing only. Sending HTTP requests. It does not provide any high level model abstractions over the API, does not handle redirects, multipart uploads, building authentication headers, transparent HTTP caching, URL parsing, session cookie handling, content or charset decoding, handling JSON, environment based configuration defaults, or any of that Jazz. Some things HTTP Core does do: * Sending HTTP requests. * Thread-safe / task-safe connection pooling. * HTTP(S) proxy & SOCKS proxy support. * Supports HTTP/1.1 and HTTP/2. * Provides both sync and async interfaces. * Async backend support for `asyncio` and `trio`. ## Installation For HTTP/1.1 only support, install with: ```shell pip install httpcore ``` There are also a number of optional extras available... ```shell pip install httpcore['asyncio,trio,http2,socks'] ``` ## Sending requests Send an HTTP request: ```python import httpcore response = httpcore.request("GET", "https://www.example.com/") print(response) # print(response.status) # 200 print(response.headers) # [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...] print(response.content) # b'\n\n\nExample Domain\n\n\n ...' ``` The top-level `httpcore.request()` function is provided for convenience. In practice whenever you're working with `httpcore` you'll want to use the connection pooling functionality that it provides. ```python import httpcore http = httpcore.ConnectionPool() response = http.request("GET", "https://www.example.com/") ``` Once you're ready to get going, [head over to the documentation](https://www.encode.io/httpcore/). ## Motivation You *probably* don't want to be using HTTP Core directly. It might make sense if you're writing something like a proxy service in Python, and you just want something at the lowest possible level, but more typically you'll want to use a higher level client library, such as `httpx`. The motivation for `httpcore` is: * To provide a reusable low-level client library, that other packages can then build on top of. * To provide a *really clear interface split* between the networking code and client logic, so that each is easier to understand and reason about in isolation. ## Dependencies The `httpcore` package has the following dependencies... * `h11` * `truststore` And the following optional extras... * `anyio` - Required by `pip install httpcore['asyncio']`. * `trio` - Required by `pip install httpcore['trio']`. * `h2` - Required by `pip install httpcore['http2']`. * `socksio` - Required by `pip install httpcore['socks']`. ## Versioning We use [SEMVER for our versioning policy](https://semver.org/). For changes between package versions please see our [project changelog](CHANGELOG.md). We recommend pinning your requirements either the most current major version, or a more specific version range: ```python pip install 'httpcore==1.*' ``` pydantic-httpx2-9b7ee8e/src/httpcore2/docs/000077500000000000000000000000001521723372100207225ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpcore2/docs/async.md000066400000000000000000000161121521723372100223620ustar00rootroot00000000000000# Async Support HTTPX offers a standard synchronous API by default, but also gives you the option of an async client if you need it. Async is a concurrency model that is far more efficient than multi-threading, and can provide significant performance benefits and enable the use of long-lived network connections such as WebSockets. If you're working with an async web framework then you'll also want to use an async client for sending outgoing HTTP requests. Launching concurrent async tasks is far more resource efficient than spawning multiple threads. The Python interpreter should be able to comfortably handle switching between over 1000 concurrent tasks, while a sensible number of threads in a thread pool might be to enable around 10 or 20 concurrent threads. ## Enabling Async support If you're using async with [Python's stdlib `asyncio` support](https://docs.python.org/3/library/asyncio.html), install the optional dependencies using: ```shell pip install 'httpcore[asyncio]' ``` Alternatively, if you're working with [the Python `trio` package](https://trio.readthedocs.io/en/stable/): ```shell pip install 'httpcore[trio]' ``` We highly recommend `trio` for async support. The `trio` project [pioneered the principles of structured concurrency](https://en.wikipedia.org/wiki/Structured_concurrency), and has a more carefully constrained API against which to work from. ## API differences When using async support, you need make sure to use an async connection pool class: ```python # The async variation of `httpcore.ConnectionPool` async with httpcore.AsyncConnectionPool() as http: ... ``` ### Sending requests Sending requests with the async version of `httpcore` requires the `await` keyword: ```python import asyncio import httpcore async def main(): async with httpcore.AsyncConnectionPool() as http: response = await http.request("GET", "https://www.example.com/") asyncio.run(main()) ``` When including content in the request, the content must either be bytes or an *async iterable* yielding bytes. ### Streaming responses Streaming responses also require a slightly different interface to the sync version: * `with .stream(...) as response` β†’ `async with .stream() as response`. * `for chunk in response.iter_stream()` β†’ `async for chunk in response.aiter_stream()`. * `response.read()` β†’ `await response.aread()`. * `response.close()` β†’ `await response.aclose()` For example: ```python import asyncio import httpcore async def main(): async with httpcore.AsyncConnectionPool() as http: async with http.stream("GET", "https://www.example.com/") as response: async for chunk in response.aiter_stream(): print(f"Downloaded: {chunk}") asyncio.run(main()) ``` ### Pool lifespans When using `httpcore` in an async environment it is strongly recommended that you instantiate and use connection pools using the context managed style: ```python async with httpcore.AsyncConnectionPool() as http: ... ``` To benefit from connection pooling it is recommended that you instantiate a single connection pool in this style, and pass it around throughout your application. If you do want to use a connection pool without this style then you'll need to ensure that you explicitly close the pool once it is no longer required: ```python try: http = httpcore.AsyncConnectionPool() ... finally: await http.aclose() ``` This is a little different to the threaded context, where it's okay to simply instantiate a globally available connection pool, and then allow Python's garbage collection to deal with closing any connections in the pool, once the `__del__` method is called. The reason for this difference is that asynchronous code is not able to run within the context of the synchronous `__del__` method, so there is no way for connections to be automatically closed at the point of garbage collection. This can lead to unterminated TCP connections still remaining after the Python interpreter quits. ## Supported environments HTTPX supports either `asyncio` or `trio` as an async environment. It will auto-detect which of those two to use as the backend for socket operations and concurrency primitives. ### AsyncIO AsyncIO is Python's [built-in library](https://docs.python.org/3/library/asyncio.html) for writing concurrent code with the async/await syntax. Let's take a look at sending several outgoing HTTP requests concurrently, using `asyncio`: ```python import asyncio import httpcore import time async def download(http, year): await http.request("GET", f"https://en.wikipedia.org/wiki/{year}") async def main(): async with httpcore.AsyncConnectionPool() as http: started = time.time() # Here we use `asyncio.gather()` in order to run several tasks concurrently... tasks = [download(http, year) for year in range(2000, 2020)] await asyncio.gather(*tasks) complete = time.time() for connection in http.connections: print(connection) print("Complete in %.3f seconds" % (complete - started)) asyncio.run(main()) ``` ### Trio Trio is [an alternative async library](https://trio.readthedocs.io/en/stable/), designed around the [the principles of structured concurrency](https://en.wikipedia.org/wiki/Structured_concurrency). ```python import httpcore import trio import time async def download(http, year): await http.request("GET", f"https://en.wikipedia.org/wiki/{year}") async def main(): async with httpcore.AsyncConnectionPool() as http: started = time.time() async with trio.open_nursery() as nursery: for year in range(2000, 2020): nursery.start_soon(download, http, year) complete = time.time() for connection in http.connections: print(connection) print("Complete in %.3f seconds" % (complete - started)) trio.run(main) ``` ### AnyIO AnyIO is an [asynchronous networking and concurrency library](https://anyio.readthedocs.io/) that works on top of either asyncio or trio. It blends in with native libraries of your chosen backend (defaults to asyncio). The `anyio` library is designed around the [the principles of structured concurrency](https://en.wikipedia.org/wiki/Structured_concurrency), and brings many of the same correctness and usability benefits that Trio provides, while interoperating with existing `asyncio` libraries. ```python import httpcore import anyio import time async def download(http, year): await http.request("GET", f"https://en.wikipedia.org/wiki/{year}") async def main(): async with httpcore.AsyncConnectionPool() as http: started = time.time() async with anyio.create_task_group() as task_group: for year in range(2000, 2020): task_group.start_soon(download, http, year) complete = time.time() for connection in http.connections: print(connection) print("Complete in %.3f seconds" % (complete - started)) anyio.run(main) ``` --- # Reference ## `httpcore.AsyncConnectionPool` ::: httpcore.AsyncConnectionPool handler: python rendering: show_source: False pydantic-httpx2-9b7ee8e/src/httpcore2/docs/connection-pools.md000066400000000000000000000106351521723372100245420ustar00rootroot00000000000000# Connection Pools While the top-level API provides convenience functions for working with `httpcore`, in practice you'll almost always want to take advantage of the connection pooling functionality that it provides. To do so, instantiate a pool instance, and use it to send requests: ```python import httpcore http = httpcore.ConnectionPool() r = http.request("GET", "https://www.example.com/") print(r) # ``` Connection pools support the same `.request()` and `.stream()` APIs [as described in the Quickstart](../quickstart). We can observe the benefits of connection pooling with a simple script like so: ```python import httpcore import time http = httpcore.ConnectionPool() for counter in range(5): started = time.time() response = http.request("GET", "https://www.example.com/") complete = time.time() print(response, "in %.3f seconds" % (complete - started)) ``` The output *should* demonstrate the initial request as being substantially slower than the subsequent requests: ``` in {0.529} seconds in {0.096} seconds in {0.097} seconds in {0.095} seconds in {0.098} seconds ``` This is to be expected. Once we've established a connection to `"www.example.com"` we're able to reuse it for following requests. ## Configuration The connection pool instance is also the main point of configuration. Let's take a look at the various options that it provides: ### SSL configuration * `ssl_context`: An SSL context to use for verifying connections. If not specified, the default `httpcore.default_ssl_context()` will be used. ### Pooling configuration * `max_connections`: The maximum number of concurrent HTTP connections that the pool should allow. Any attempt to send a request on a pool that would exceed this amount will block until a connection is available. * `max_keepalive_connections`: The maximum number of idle HTTP connections that will be maintained in the pool. * `keepalive_expiry`: The duration in seconds that an idle HTTP connection may be maintained for before being expired from the pool. ### HTTP version support * `http1`: A boolean indicating if HTTP/1.1 requests should be supported by the connection pool. Defaults to `True`. * `http2`: A boolean indicating if HTTP/2 requests should be supported by the connection pool. Defaults to `False`. ### Other options * `retries`: The maximum number of retries when trying to establish a connection. * `local_address`: Local address to connect from. Can also be used to connect using a particular address family. Using `local_address="0.0.0.0"` will connect using an `AF_INET` address (IPv4), while using `local_address="::"` will connect using an `AF_INET6` address (IPv6). * `uds`: Path to a Unix Domain Socket to use instead of TCP sockets. * `network_backend`: A backend instance to use for handling network I/O. * `socket_options`: Socket options that have to be included in the TCP socket when the connection was established. ## Pool lifespans Because connection pools hold onto network resources, careful developers may want to ensure that instances are properly closed once they are no longer required. Working with a single global instance isn't a bad idea for many use case, since the connection pool will automatically be closed when the `__del__` method is called on it: ```python # This is perfectly fine for most purposes. # The connection pool will automatically be closed when it is garbage collected, # or when the Python interpreter exits. http = httpcore.ConnectionPool() ``` However, to be more explicit around the resource usage, we can use the connection pool within a context manager: ```python with httpcore.ConnectionPool() as http: ... ``` Or else close the pool explicitly: ```python http = httpcore.ConnectionPool() try: ... finally: http.close() ``` ## Thread and task safety Connection pools are designed to be thread-safe. Similarly, when using `httpcore` in an async context connection pools are task-safe. This means that you can have a single connection pool instance shared by multiple threads. --- # Reference ## `httpcore.ConnectionPool` ::: httpcore.ConnectionPool handler: python rendering: show_source: False pydantic-httpx2-9b7ee8e/src/httpcore2/docs/connections.md000066400000000000000000000006271521723372100235730ustar00rootroot00000000000000# Connections TODO --- # Reference ## `httpcore.HTTPConnection` ::: httpcore.HTTPConnection handler: python rendering: show_source: False ## `httpcore.HTTP11Connection` ::: httpcore.HTTP11Connection handler: python rendering: show_source: False ## `httpcore.HTTP2Connection` ::: httpcore.HTTP2Connection handler: python rendering: show_source: False pydantic-httpx2-9b7ee8e/src/httpcore2/docs/exceptions.md000066400000000000000000000007601521723372100234300ustar00rootroot00000000000000# Exceptions The following exceptions may be raised when sending a request: * `httpcore.TimeoutException` * `httpcore.PoolTimeout` * `httpcore.ConnectTimeout` * `httpcore.ReadTimeout` * `httpcore.WriteTimeout` * `httpcore.NetworkError` * `httpcore.ConnectError` * `httpcore.ReadError` * `httpcore.WriteError` * `httpcore.ProtocolError` * `httpcore.RemoteProtocolError` * `httpcore.LocalProtocolError` * `httpcore.ProxyError` * `httpcore.UnsupportedProtocol` pydantic-httpx2-9b7ee8e/src/httpcore2/docs/extensions.md000066400000000000000000000257671521723372100234640ustar00rootroot00000000000000# Extensions The request/response API used by `httpcore` is kept deliberately simple and explicit. The `Request` and `Response` models are pretty slim wrappers around this core API: ``` # Pseudo-code expressing the essentials of the request/response model. ( status_code: int, headers: List[Tuple(bytes, bytes)], stream: Iterable[bytes] ) = handle_request( method: bytes, url: URL, headers: List[Tuple(bytes, bytes)], stream: Iterable[bytes] ) ``` This is everything that's needed in order to represent an HTTP exchange. Well... almost. There is a maxim in Computer Science that *"All non-trivial abstractions, to some degree, are leaky"*. When an expression is leaky, it's important that it ought to at least leak only in well-defined places. In order to handle cases that don't otherwise fit inside this core abstraction, `httpcore` requests and responses have 'extensions'. These are a dictionary of optional additional information. Let's expand on our request/response abstraction... ``` # Pseudo-code expressing the essentials of the request/response model, # plus extensions allowing for additional API that does not fit into # this abstraction. ( status_code: int, headers: List[Tuple(bytes, bytes)], stream: Iterable[bytes], extensions: dict ) = handle_request( method: bytes, url: URL, headers: List[Tuple(bytes, bytes)], stream: Iterable[bytes], extensions: dict ) ``` Several extensions are supported both on the request: ```python r = httpcore.request( "GET", "https://www.example.com", extensions={"timeout": {"connect": 5.0}} ) ``` And on the response: ```python r = httpcore.request("GET", "https://www.example.com") print(r.extensions["http_version"]) # When using HTTP/1.1 on the client side, the server HTTP response # could feasibly be one of b"HTTP/0.9", b"HTTP/1.0", or b"HTTP/1.1". ``` ## Request Extensions ### `"timeout"` A dictionary of `str: Optional[float]` timeout values. May include values for `'connect'`, `'read'`, `'write'`, or `'pool'`. For example: ```python # Timeout if a connection takes more than 5 seconds to established, or if # we are blocked waiting on the connection pool for more than 10 seconds. r = httpcore.request( "GET", "https://www.example.com", extensions={"timeout": {"connect": 5.0, "pool": 10.0}} ) ``` ### `"trace"` The trace extension allows a callback handler to be installed to monitor the internal flow of events within `httpcore`. The simplest way to explain this is with an example: ```python import httpcore def log(event_name, info): print(event_name, info) r = httpcore.request("GET", "https://www.example.com/", extensions={"trace": log}) # connection.connect_tcp.started {'host': 'www.example.com', 'port': 443, 'local_address': None, 'timeout': None} # connection.connect_tcp.complete {'return_value': } # connection.start_tls.started {'ssl_context': , 'server_hostname': b'www.example.com', 'timeout': None} # connection.start_tls.complete {'return_value': } # http11.send_request_headers.started {'request': } # http11.send_request_headers.complete {'return_value': None} # http11.send_request_body.started {'request': } # http11.send_request_body.complete {'return_value': None} # http11.receive_response_headers.started {'request': } # http11.receive_response_headers.complete {'return_value': (b'HTTP/1.1', 200, b'OK', [(b'Age', b'553715'), (b'Cache-Control', b'max-age=604800'), (b'Content-Type', b'text/html; charset=UTF-8'), (b'Date', b'Thu, 21 Oct 2021 17:08:42 GMT'), (b'Etag', b'"3147526947+ident"'), (b'Expires', b'Thu, 28 Oct 2021 17:08:42 GMT'), (b'Last-Modified', b'Thu, 17 Oct 2019 07:18:26 GMT'), (b'Server', b'ECS (nyb/1DCD)'), (b'Vary', b'Accept-Encoding'), (b'X-Cache', b'HIT'), (b'Content-Length', b'1256')])} # http11.receive_response_body.started {'request': } # http11.receive_response_body.complete {'return_value': None} # http11.response_closed.started {} # http11.response_closed.complete {'return_value': None} ``` The `event_name` and `info` arguments here will be one of the following: * `{event_type}.{event_name}.started`, `` * `{event_type}.{event_name}.complete`, `{"return_value": <...>}` * `{event_type}.{event_name}.failed`, `{"exception": <...>}` Note that when using the async variant of `httpcore` the handler function passed to `"trace"` must be an `async def ...` function. The following event types are currently exposed... **Establishing the connection** * `"connection.connect_tcp"` * `"connection.connect_unix_socket"` * `"connection.start_tls"` **HTTP/1.1 events** * `"http11.send_request_headers"` * `"http11.send_request_body"` * `"http11.receive_response"` * `"http11.receive_response_body"` * `"http11.response_closed"` **HTTP/2 events** * `"http2.send_connection_init"` * `"http2.send_request_headers"` * `"http2.send_request_body"` * `"http2.receive_response_headers"` * `"http2.receive_response_body"` * `"http2.response_closed"` The exact set of trace events may be subject to change across different versions of `httpcore`. If you need to rely on a particular set of events it is recommended that you pin installation of the package to a fixed version. ### `"sni_hostname"` The server's hostname, which is used to confirm the hostname supplied by the SSL certificate. For example: ``` python headers = {"Host": "www.encode.io"} extensions = {"sni_hostname": "www.encode.io"} response = httpcore.request( "GET", "https://185.199.108.153", headers=headers, extensions=extensions ) ``` ### `"target"` The target that is used as [the HTTP target instead of the URL path](https://datatracker.ietf.org/doc/html/rfc2616#section-5.1.2). This enables support constructing requests that would otherwise be unsupported. In particular... * Forward proxy requests using an absolute URI. * Tunneling proxy requests using `CONNECT` with hostname as the target. * Server-wide `OPTIONS *` requests. For example: ```python extensions = {"target": b"www.encode.io:443"} response = httpcore.request( "CONNECT", "http://your-tunnel-proxy.com", headers=headers, extensions=extensions ) ``` ## Response Extensions ### `"http_version"` The HTTP version, as bytes. Eg. `b"HTTP/1.1"`. When using HTTP/1.1 the response line includes an explicit version, and the value of this key could feasibly be one of `b"HTTP/0.9"`, `b"HTTP/1.0"`, or `b"HTTP/1.1"`. When using HTTP/2 there is no further response versioning included in the protocol, and the value of this key will always be `b"HTTP/2"`. ### `"reason_phrase"` The reason-phrase of the HTTP response, as bytes. For example `b"OK"`. Some servers may include a custom reason phrase, although this is not recommended. HTTP/2 onwards does not include a reason phrase on the wire. When no key is included, a default based on the status code may be used. ### `"stream_id"` When HTTP/2 is being used the `"stream_id"` response extension can be accessed to determine the ID of the data stream that the response was sent on. ### `"network_stream"` The `"network_stream"` extension allows developers to handle HTTP `CONNECT` and `Upgrade` requests, by providing an API that steps outside the standard request/response model, and can directly read or write to the network. The interface provided by the network stream: * `read(max_bytes, timeout = None) -> bytes` * `write(buffer, timeout = None)` * `close()` * `start_tls(ssl_context, server_hostname = None, timeout = None) -> NetworkStream` * `get_extra_info(info) -> Any` This API can be used as the foundation for working with HTTP proxies, WebSocket upgrades, and other advanced use-cases. See the [network backends documentation](network-backends.md) for more information on working directly with network streams. ##### `CONNECT` requests A proxy CONNECT request using the network stream: ```python # Formulate a CONNECT request... # # This will establish a connection to 127.0.0.1:8080, and then send the following... # # CONNECT http://www.example.com HTTP/1.1 url = "http://127.0.0.1:8080" extensions = {"target: "http://www.example.com"} with httpcore.stream("CONNECT", url, extensions=extensions) as response: network_stream = response.extensions["network_stream"] # Upgrade to an SSL stream... network_stream = network_stream.start_tls( ssl_context=httpcore.default_ssl_context(), hostname=b"www.example.com", ) # Manually send an HTTP request over the network stream, and read the response... # # For a more complete example see the httpcore `TunnelHTTPConnection` implementation. network_stream.write(b"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n") data = network_stream.read() print(data) ``` ##### `Upgrade` requests Using the `wsproto` package to handle a websockets session: ```python import httpcore import wsproto import os import base64 url = "http://127.0.0.1:8000/" headers = { b"Connection": b"Upgrade", b"Upgrade": b"WebSocket", b"Sec-WebSocket-Key": base64.b64encode(os.urandom(16)), b"Sec-WebSocket-Version": b"13" } with httpcore.stream("GET", url, headers=headers) as response: if response.status != 101: raise Exception("Failed to upgrade to websockets", response) # Get the raw network stream. network_steam = response.extensions["network_stream"] # Write a WebSocket text frame to the stream. ws_connection = wsproto.Connection(wsproto.ConnectionType.CLIENT) message = wsproto.events.TextMessage("hello, world!") outgoing_data = ws_connection.send(message) network_steam.write(outgoing_data) # Wait for a response. incoming_data = network_steam.read(max_bytes=4096) ws_connection.receive_data(incoming_data) for event in ws_connection.events(): if isinstance(event, wsproto.events.TextMessage): print("Got data:", event.data) # Write a WebSocket close to the stream. message = wsproto.events.CloseConnection(code=1000) outgoing_data = ws_connection.send(message) network_steam.write(outgoing_data) ``` ##### Extra network information The network stream abstraction also allows access to various low-level information that may be exposed by the underlying socket: ```python response = httpcore.request("GET", "https://www.example.com") network_stream = response.extensions["network_stream"] client_addr = network_stream.get_extra_info("client_addr") server_addr = network_stream.get_extra_info("server_addr") print("Client address", client_addr) print("Server address", server_addr) ``` The socket SSL information is also available through this interface, although you need to ensure that the underlying connection is still open, in order to access it... ```python with httpcore.stream("GET", "https://www.example.com") as response: network_stream = response.extensions["network_stream"] ssl_object = network_stream.get_extra_info("ssl_object") print("TLS version", ssl_object.version()) ``` pydantic-httpx2-9b7ee8e/src/httpcore2/docs/http2.md000066400000000000000000000177501521723372100223170ustar00rootroot00000000000000# HTTP/2 HTTP/2 is a major new iteration of the HTTP protocol, that provides a more efficient transport, with potential performance benefits. HTTP/2 does not change the core semantics of the request or response, but alters the way that data is sent to and from the server. Rather than the text format that HTTP/1.1 uses, HTTP/2 is a binary format. The binary format provides full request and response multiplexing, and efficient compression of HTTP headers. The stream multiplexing means that where HTTP/1.1 requires one TCP stream for each concurrent request, HTTP/2 allows a single TCP stream to handle multiple concurrent requests. HTTP/2 also provides support for functionality such as response prioritization, and server push. For a comprehensive guide to HTTP/2 you may want to check out "[HTTP2 Explained](https://http2-explained.haxx.se)". ## Enabling HTTP/2 When using the `httpcore` client, HTTP/2 support is not enabled by default, because HTTP/1.1 is a mature, battle-hardened transport layer, and our HTTP/1.1 implementation may be considered the more robust option at this point in time. It is possible that a future version of `httpcore` may enable HTTP/2 support by default. If you're issuing highly concurrent requests you might want to consider trying out our HTTP/2 support. You can do so by first making sure to install the optional HTTP/2 dependencies... ```shell pip install 'httpcore[http2]' ``` And then instantiating a connection pool with HTTP/2 support enabled: ```python import httpcore pool = httpcore.ConnectionPool(http2=True) ``` We can take a look at the difference in behaviour by issuing several outgoing requests in parallel. Start out by using a standard HTTP/1.1 connection pool: ```python import httpcore import concurrent.futures import time def download(http, year): http.request("GET", f"https://en.wikipedia.org/wiki/{year}") def main(): with httpcore.ConnectionPool() as http: started = time.time() with concurrent.futures.ThreadPoolExecutor(max_workers=10) as threads: for year in range(2000, 2020): threads.submit(download, http, year) complete = time.time() for connection in http.connections: print(connection) print("Complete in %.3f seconds" % (complete - started)) main() ``` If you run this with an HTTP/1.1 connection pool, you ought to see output similar to the following: ```python , , , , , , , Complete in 0.586 seconds ``` We can see that the connection pool required a number of connections in order to handle the parallel requests. If we now upgrade our connection pool to support HTTP/2: ```python with httpcore.ConnectionPool(http2=True) as http: ... ``` And run the same script again, we should end up with something like this: ```python Complete in 0.573 seconds ``` All of our requests have been handled over a single connection. Switching to HTTP/2 should not *necessarily* be considered an "upgrade". It is more complex, and requires more computational power, and so particularly in an interpreted language like Python it *could* be slower in some instances. Moreover, utilising multiple connections may end up connecting to multiple hosts, and could sometimes appear faster to the client, at the cost of requiring more server resources. Enabling HTTP/2 is most likely to be beneficial if you are sending requests in high concurrency, and may often be more well suited to an async context, rather than multi-threading. ## Inspecting the HTTP version Enabling HTTP/2 support on the client does not *necessarily* mean that your requests and responses will be transported over HTTP/2, since both the client *and* the server need to support HTTP/2. If you connect to a server that only supports HTTP/1.1 the client will use a standard HTTP/1.1 connection instead. You can determine which version of the HTTP protocol was used by examining the `"http_version"` response extension. ```python import httpcore pool = httpcore.ConnectionPool(http2=True) response = pool.request("GET", "https://www.example.com/") # Should be one of b"HTTP/2", b"HTTP/1.1", b"HTTP/1.0", or b"HTTP/0.9". print(response.extensions["http_version"]) ``` See [the extensions documentation](extensions.md) for more details. ## HTTP/2 negotiation Robust servers need to support both HTTP/2 and HTTP/1.1 capable clients, and so need some way to "negotiate" with the client which protocol version will be used. ### HTTP/2 over HTTPS Generally the method used is for the server to advertise if it has HTTP/2 support during the part of the SSL connection handshake. This is known as ALPN - "Application Layer Protocol Negotiation". Most browsers only provide HTTP/2 support over HTTPS connections, and this is also the default behaviour that `httpcore` provides. If you enable HTTP/2 support you should still expect to see HTTP/1.1 connections for any `http://` URLs. ### HTTP/2 over HTTP Servers can optionally also support HTTP/2 over HTTP by supporting the `Upgrade: h2c` header. This mechanism is not supported by `httpcore`. It requires an additional round-trip between the client and server, and also requires any request body to be sent twice. ### Prior Knowledge If you know in advance that the server you are communicating with will support HTTP/2, then you can enforce that the client uses HTTP/2, without requiring either ALPN support or an HTTP `Upgrade: h2c` header. This is managed by disabling HTTP/1.1 support on the connection pool: ```python pool = httpcore.ConnectionPool(http1=False, http2=True) ``` ## Request & response headers Because HTTP/2 frames the requests and responses somewhat differently to HTTP/1.1, there is a difference in some of the headers that are used. In order for the `httpcore` library to support both HTTP/1.1 and HTTP/2 transparently, the HTTP/1.1 style is always used throughout the API. Any differences in header styles are only mapped onto HTTP/2 at the internal network layer. ## Request headers The following pseudo-headers are used by HTTP/2 in the request: * `:method` - The request method. * `:path` - Taken from the URL of the request. * `:authority` - Equivalent to the `Host` header in HTTP/1.1. In `httpcore` this is represented using the request `Host` header, which is automatically populated from the request URL if no `Host` header is explicitly included. * `:scheme` - Taken from the URL of the request. These pseudo-headers are included in `httpcore` as part of the `request.method` and `request.url` attributes, and through the `request.headers["Host"]` header. *They are not exposed directly by their psuedo-header names.* The one other difference to be aware of is the `Transfer-Encoding: chunked` header. In HTTP/2 this header is never used, since streaming data is framed using a different mechanism. In `httpcore` the `Transfer-Encoding: chunked` header is always used to represent the presence of a streaming body on the request, and is automatically populated if required. However the header is only sent if the underlying connection ends up being HTTP/1.1, and is omitted if the underlying connection ends up being HTTP/2. ## Response headers The following pseudo-header is used by HTTP/2 in the response: * `:status` - The response status code. In `httpcore` this *is represented by the `response.status` attribute, rather than being exposed as a psuedo-header*. pydantic-httpx2-9b7ee8e/src/httpcore2/docs/index.md000066400000000000000000000033741521723372100223620ustar00rootroot00000000000000# HTTPCore [![Test Suite](https://github.com/encode/httpcore/workflows/Test%20Suite/badge.svg)](https://github.com/encode/httpcore/actions) [![Package version](https://badge.fury.io/py/httpcore.svg)](https://pypi.org/project/httpcore/) > *Do one thing, and do it well.* The HTTP Core package provides a minimal low-level HTTP client, which does one thing only. Sending HTTP requests. It does not provide any high level model abstractions over the API, does not handle redirects, multipart uploads, building authentication headers, transparent HTTP caching, URL parsing, session cookie handling, content or charset decoding, handling JSON, environment based configuration defaults, or any of that Jazz. Some things HTTP Core does do: * Sending HTTP requests. * Thread-safe / task-safe connection pooling. * HTTP(S) proxy & SOCKS proxy support. * Supports HTTP/1.1 and HTTP/2. * Provides both sync and async interfaces. * Async backend support for `asyncio` and `trio`. ## Installation For HTTP/1.1 only support, install with: ```shell pip install httpcore ``` For HTTP/1.1 and HTTP/2 support, install with: ```shell pip install httpcore[http2] ``` For SOCKS proxy support, install with: ```shell pip install httpcore[socks] ``` ## Example Let's check we're able to send HTTP requests: ```python import httpcore response = httpcore.request("GET", "https://www.example.com/") print(response) # print(response.status) # 200 print(response.headers) # [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...] print(response.content) # b'\n\n\nExample Domain\n\n\n ...' ``` Ready to get going? Head over to [the quickstart documentation](quickstart.md). pydantic-httpx2-9b7ee8e/src/httpcore2/docs/logging.md000066400000000000000000000053241521723372100226760ustar00rootroot00000000000000# Logging If you need to inspect the internal behaviour of `httpcore`, you can use Python's standard logging to output debug level information. For example, the following configuration... ```python import logging import httpcore logging.basicConfig( format="%(levelname)s [%(asctime)s] %(name)s - %(message)s", datefmt="%Y-%m-%d %H:%M:%S", level=logging.DEBUG ) httpcore.request('GET', 'https://www.example.com') ``` Will send debug level output to the console, or wherever `stdout` is directed too... ``` DEBUG [2023-01-09 14:44:00] httpcore.connection - connect_tcp.started host='www.example.com' port=443 local_address=None timeout=None DEBUG [2023-01-09 14:44:00] httpcore.connection - connect_tcp.complete return_value= DEBUG [2023-01-09 14:44:00] httpcore.connection - start_tls.started ssl_context= server_hostname='www.example.com' timeout=None DEBUG [2023-01-09 14:44:00] httpcore.connection - start_tls.complete return_value= DEBUG [2023-01-09 14:44:00] httpcore.http11 - send_request_headers.started request= DEBUG [2023-01-09 14:44:00] httpcore.http11 - send_request_headers.complete DEBUG [2023-01-09 14:44:00] httpcore.http11 - send_request_body.started request= DEBUG [2023-01-09 14:44:00] httpcore.http11 - send_request_body.complete DEBUG [2023-01-09 14:44:00] httpcore.http11 - receive_response_headers.started request= DEBUG [2023-01-09 14:44:00] httpcore.http11 - receive_response_headers.complete return_value=(b'HTTP/1.1', 200, b'OK', [(b'Age', b'572646'), (b'Cache-Control', b'max-age=604800'), (b'Content-Type', b'text/html; charset=UTF-8'), (b'Date', b'Mon, 09 Jan 2023 14:44:00 GMT'), (b'Etag', b'"3147526947+ident"'), (b'Expires', b'Mon, 16 Jan 2023 14:44:00 GMT'), (b'Last-Modified', b'Thu, 17 Oct 2019 07:18:26 GMT'), (b'Server', b'ECS (nyb/1D18)'), (b'Vary', b'Accept-Encoding'), (b'X-Cache', b'HIT'), (b'Content-Length', b'1256')]) DEBUG [2023-01-09 14:44:00] httpcore.http11 - receive_response_body.started request= DEBUG [2023-01-09 14:44:00] httpcore.http11 - receive_response_body.complete DEBUG [2023-01-09 14:44:00] httpcore.http11 - response_closed.started DEBUG [2023-01-09 14:44:00] httpcore.http11 - response_closed.complete DEBUG [2023-01-09 14:44:00] httpcore.connection - close.started DEBUG [2023-01-09 14:44:00] httpcore.connection - close.complete ``` The exact formatting of the debug logging may be subject to change across different versions of `httpcore`. If you need to rely on a particular format it is recommended that you pin installation of the package to a fixed version.pydantic-httpx2-9b7ee8e/src/httpcore2/docs/network-backends.md000066400000000000000000000212651521723372100245130ustar00rootroot00000000000000# Network Backends The API layer at which `httpcore` interacts with the network is described as the network backend. Various backend implementations are provided, allowing `httpcore` to handle networking in different runtime contexts. ## Working with network backends ### The default network backend Typically you won't need to specify a network backend, as a default will automatically be selected. However, understanding how the network backends fit in may be useful if you want to better understand the underlying architecture. Let's start by seeing how we can explicitly select the network backend. First we're making a standard HTTP request, using a connection pool: ```python import httpcore with httpcore.ConnectionPool() as http: response = http.request('GET', 'https://www.example.com') print(response) ``` We can also have the same behavior, but be explicit with our selection of the network backend: ```python import httpcore network_backend = httpcore.SyncBackend() with httpcore.ConnectionPool(network_backend=network_backend) as http: response = http.request('GET', 'https://www.example.com') print(response) ``` The `httpcore.SyncBackend()` implementation handles the opening of TCP connections, and operations on the socket stream, such as reading, writing, and closing the connection. We can get a better understanding of this by using a network backend to send a basic HTTP/1.1 request directly: ```python import httpcore # Create an SSL context using 'certifi' for the certificates. ssl_context = httpcore.default_ssl_context() # A basic HTTP/1.1 request as a plain bytestring. request = b'\r\n'.join([ b'GET / HTTP/1.1', b'Host: www.example.com', b'Accept: */*', b'Connection: close', b'' ]) # Open a TCP stream and upgrade it to SSL. network_backend = httpcore.SyncBackend() network_stream = network_backend.connect_tcp("www.example.com", 443) network_stream = network_stream.start_tls(ssl_context, server_hostname="www.example.com") # Send the HTTP request. network_stream.write(request) # Read the HTTP response. while True: response = network_stream.read(max_bytes=4096) if response == b'': break print(response) # The output should look something like this: # # b'HTTP/1.1 200 OK\r\nAge: 600005\r\n [...] Content-Length: 1256\r\nConnection: close\r\n\r\n' # b'\n\n\n Example Domain [...] \n' ``` ### Async network backends If we're working with an `async` codebase, then we need to select a different backend. The `httpcore.AnyIOBackend` is suitable for usage if you're running under `asyncio`. This is a networking backend implemented using [the `anyio` package](https://anyio.readthedocs.io/en/3.x/). ```python import httpcore import asyncio async def main(): network_backend = httpcore.AnyIOBackend() async with httpcore.AsyncConnectionPool(network_backend=network_backend) as http: response = await http.request('GET', 'https://www.example.com') print(response) asyncio.run(main()) ``` The `AnyIOBackend` will work when running under either `asyncio` or `trio`. However, if you're working with async using the [`trio` framework](https://trio.readthedocs.io/en/stable/), then we recommend using the `httpcore.TrioBackend`. This will give you the same kind of networking behavior you'd have using `AnyIOBackend`, but there will be a little less indirection so it will be marginally more efficient and will present cleaner tracebacks in error cases. ```python import httpcore import trio async def main(): network_backend = httpcore.TrioBackend() async with httpcore.AsyncConnectionPool(network_backend=network_backend) as http: response = await http.request('GET', 'https://www.example.com') print(response) trio.run(main) ``` ### Mock network backends There are also mock network backends available that can be useful for testing purposes. These backends accept a list of bytes, and return network stream interfaces that return those byte streams. Here's an example of mocking a simple HTTP/1.1 response... ```python import httpcore network_backend = httpcore.MockBackend([ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ]) with httpcore.ConnectionPool(network_backend=network_backend) as http: response = http.request("GET", "https://example.com/") print(response.extensions['http_version']) print(response.status) print(response.content) ``` Mocking a HTTP/2 response is more complex, since it uses a binary format... ```python import hpack import hyperframe.frame import httpcore content = [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame( stream_id=1, data=b"Hello, world!", flags=["END_STREAM"] ).serialize(), ] # Note that we instantiate the mock backend with an `http2=True` argument. # This ensures that the mock network stream acts as if the `h2` ALPN flag has been set, # and causes the connection pool to interact with the connection using HTTP/2. network_backend = httpcore.MockBackend(content, http2=True) with httpcore.ConnectionPool(network_backend=network_backend) as http: response = http.request("GET", "https://example.com/") print(response.extensions['http_version']) print(response.status) print(response.content) ``` ### Custom network backends The base interface for network backends is provided as public API, allowing you to implement custom networking behavior. You can use this to provide advanced networking functionality such as: * Network recording / replay. * In-depth debug tooling. * Handling non-standard SSL or DNS requirements. Here's an example that records the network response to a file on disk: ```python import httpcore class RecordingNetworkStream(httpcore.NetworkStream): def __init__(self, record_file, stream): self.record_file = record_file self.stream = stream def read(self, max_bytes, timeout=None): data = self.stream.read(max_bytes, timeout=timeout) self.record_file.write(data) return data def write(self, buffer, timeout=None): self.stream.write(buffer, timeout=timeout) def close(self) -> None: self.stream.close() def start_tls( self, ssl_context, server_hostname=None, timeout=None, ): self.stream = self.stream.start_tls( ssl_context, server_hostname=server_hostname, timeout=timeout ) return self def get_extra_info(self, info): return self.stream.get_extra_info(info) class RecordingNetworkBackend(httpcore.NetworkBackend): """ A custom network backend that records network responses. """ def __init__(self, record_file): self.record_file = record_file self.backend = httpcore.SyncBackend() def connect_tcp( self, host, port, timeout=None, local_address=None, socket_options=None, ): # Note that we're only using a single record file here, # so even if multiple connections are opened the network # traffic will all write to the same file. # An alternative implementation might automatically use # a new file for each opened connection. stream = self.backend.connect_tcp( host, port, timeout=timeout, local_address=local_address, socket_options=socket_options ) return RecordingNetworkStream(self.record_file, stream) # Once you make the request, the raw HTTP/1.1 response will be available #Β in the 'network-recording' file. # # Try switching to `http2=True` to see the difference when recording HTTP/2 binary network traffic, # or add `headers={'Accept-Encoding': 'gzip'}` to see HTTP content compression. with open("network-recording", "wb") as record_file: network_backend = RecordingNetworkBackend(record_file) with httpcore.ConnectionPool(network_backend=network_backend) as http: response = http.request("GET", "https://www.example.com/") print(response) ``` --- ## Reference ### Networking Backends * `httpcore.SyncBackend` * `httpcore.AnyIOBackend` * `httpcore.TrioBackend` ### Mock Backends * `httpcore.MockBackend` * `httpcore.MockStream` * `httpcore.AsyncMockBackend` * `httpcore.AsyncMockStream` ### Base Interface * `httpcore.NetworkBackend` * `httpcore.NetworkStream` * `httpcore.AsyncNetworkBackend` * `httpcore.AsyncNetworkStream` pydantic-httpx2-9b7ee8e/src/httpcore2/docs/proxies.md000066400000000000000000000062601521723372100227410ustar00rootroot00000000000000# Proxies The `httpcore` package provides support for HTTP proxies, using either "HTTP Forwarding" or "HTTP Tunnelling". Forwarding is a proxy mechanism for sending requests to `http` URLs via an intermediate proxy. Tunnelling is a proxy mechanism for sending requests to `https` URLs via an intermediate proxy. Sending requests via a proxy is very similar to sending requests using a standard connection pool: ```python import httpcore proxy = httpcore.Proxy("http://127.0.0.1:8080/") pool = httpcore.ConnectionPool(proxy=proxy) r = proxy.request("GET", "https://www.example.com/") print(r) # ``` You can test the `httpcore` proxy support, using the Python [`proxy.py`](https://pypi.org/project/proxy.py/) tool: ```shell pip install proxy.py proxy --hostname 127.0.0.1 --port 8080 ``` Requests will automatically use either forwarding or tunnelling, depending on if the scheme is `http` or `https`. ## Authentication Proxy authentication can be included in the initial configuration: ```python import httpcore # A `Proxy-Authorization` header will be included on the initial proxy connection. proxy = httpcore.Proxy( url="http://127.0.0.1:8080/", auth=("", "") ) pool = httpcore.ConnectionPool(proxy=proxy) ``` Custom headers can also be included: ```python import httpcore import base64 # Construct and include a `Proxy-Authorization` header. auth = base64.b64encode(b":") proxy = httpcore.Proxy( url="http://127.0.0.1:8080/", headers={"Proxy-Authorization": b"Basic " + auth} ) pool = httpcore.ConnectionPool(proxy=proxy) ``` ## Proxy SSL The `httpcore` package also supports HTTPS proxies for http and https destinations. HTTPS proxies can be used in the same way that HTTP proxies are. ```python proxy = httpcore.Proxy(url="https://127.0.0.1:8080/") ``` Also, when using HTTPS proxies, you may need to configure the SSL context, which you can do with the `ssl_context` argument. ```python import ssl import httpcore proxy_ssl_context = ssl.create_default_context() proxy_ssl_context.check_hostname = False proxy = httpcore.Proxy( url='https://127.0.0.1:8080/', ssl_context=proxy_ssl_context ) pool = httpcore.ConnectionPool(proxy=proxy) ``` ## HTTP Versions If you use proxies, keep in mind that the `httpcore` package only supports proxies to HTTP/1.1 servers. ## SOCKS proxy support The `httpcore` package also supports proxies using the SOCKS5 protocol. Make sure to install the optional dependency using `pip install 'httpcore[socks]'`. The `SOCKSProxy` class should be using instead of a standard connection pool: ```python import httpcore # Note that the SOCKS port is 1080. proxy = httpcore.Proxy(url="socks5://127.0.0.1:1080/") pool = httpcore.ConnectionPool(proxy=proxy) r = pool.request("GET", "https://www.example.com/") ``` Authentication via SOCKS is also supported: ```python import httpcore proxy = httpcore.Proxy( url="socks5://127.0.0.1:1080/", auth=("", ""), ) pool = httpcore.ConnectionPool(proxy=proxy) r = pool.request("GET", "https://www.example.com/") ``` --- # Reference ## `httpcore.Proxy` ::: httpcore.Proxy handler: python rendering: show_source: False pydantic-httpx2-9b7ee8e/src/httpcore2/docs/quickstart.md000066400000000000000000000120361521723372100234400ustar00rootroot00000000000000# Quickstart For convenience, the `httpcore` package provides a couple of top-level functions that you can use for sending HTTP requests. You probably don't want to integrate against functions if you're writing a library that uses `httpcore`, but you might find them useful for testing `httpcore` from the command-line, or if you're writing a simple script that doesn't require any of the connection pooling or advanced configuration that `httpcore` offers. ## Sending a request We'll start off by sending a request... ```python import httpcore response = httpcore.request("GET", "https://www.example.com/") print(response) # print(response.status) # 200 print(response.headers) # [(b'Accept-Ranges', b'bytes'), (b'Age', b'557328'), (b'Cache-Control', b'max-age=604800'), ...] print(response.content) # b'\n\n\nExample Domain\n\n\n ...' ``` ## Request headers Request headers may be included either in a dictionary style, or as a list of two-tuples. ```python import httpcore import json headers = {'User-Agent': 'httpcore'} r = httpcore.request('GET', 'https://httpbin.org/headers', headers=headers) print(json.loads(r.content)) # { # 'headers': { # 'Host': 'httpbin.org', # 'User-Agent': 'httpcore', # 'X-Amzn-Trace-Id': 'Root=1-616ff5de-5ea1b7e12766f1cf3b8e3a33' # } # } ``` The keys and values may either be provided as strings or as bytes. Where strings are provided they may only contain characters within the ASCII range `chr(0)` - `chr(127)`. To include characters outside this range you must deal with any character encoding explicitly, and pass bytes as the header keys/values. The `Host` header will always be automatically included in any outgoing request, as it is strictly required to be present by the HTTP protocol. *Note that the `X-Amzn-Trace-Id` header shown in the example above is not an outgoing request header, but has been added by a gateway server.* ## Request body A request body can be included either as bytes... ```python import httpcore import json r = httpcore.request('POST', 'https://httpbin.org/post', content=b'Hello, world') print(json.loads(r.content)) # { # 'args': {}, # 'data': 'Hello, world', # 'files': {}, # 'form': {}, # 'headers': { # 'Host': 'httpbin.org', # 'Content-Length': '12', # 'X-Amzn-Trace-Id': 'Root=1-61700258-00e338a124ca55854bf8435f' # }, # 'json': None, # 'origin': '68.41.35.196', # 'url': 'https://httpbin.org/post' # } ``` Or as an iterable that returns bytes... ```python import httpcore import json with open("hello-world.txt", "rb") as input_file: r = httpcore.request('POST', 'https://httpbin.org/post', content=input_file) print(json.loads(r.content)) # { # 'args': {}, # 'data': 'Hello, world', # 'files': {}, # 'form': {}, # 'headers': { # 'Host': 'httpbin.org', # 'Transfer-Encoding': 'chunked', # 'X-Amzn-Trace-Id': 'Root=1-61700258-00e338a124ca55854bf8435f' # }, # 'json': None, # 'origin': '68.41.35.196', # 'url': 'https://httpbin.org/post' # } ``` When a request body is included, either a `Content-Length` header or a `Transfer-Encoding: chunked` header will be automatically included. The `Content-Length` header is used when passing bytes, and indicates an HTTP request with a body of a pre-determined length. The `Transfer-Encoding: chunked` header is the mechanism that HTTP/1.1 uses for sending HTTP request bodies without a pre-determined length. ## Streaming responses When using the `httpcore.request()` function, the response body will automatically be read to completion, and made available in the `response.content` attribute. Sometimes you may be dealing with large responses and not want to read the entire response into memory. The `httpcore.stream()` function provides a mechanism for sending a request and dealing with a streaming response: ```python import httpcore with httpcore.stream('GET', 'https://example.com') as response: for chunk in response.iter_stream(): print(f"Downloaded: {chunk}") ``` Here's a more complete example that demonstrates downloading a response: ```python import httpcore with httpcore.stream('GET', 'https://speed.hetzner.de/100MB.bin') as response: with open("download.bin", "wb") as output_file: for chunk in response.iter_stream(): output_file.write(chunk) ``` The `httpcore.stream()` API also allows you to *conditionally* read the response... ```python import httpcore with httpcore.stream('GET', 'https://example.com') as response: content_length = [int(v) for k, v in response.headers if k.lower() == b'content-length'][0] if content_length > 100_000_000: raise Exception("Response too large.") response.read() # `response.content` is now available. ``` --- # Reference ## `httpcore.request()` ::: httpcore.request handler: python rendering: show_source: False ## `httpcore.stream()` ::: httpcore.stream handler: python rendering: show_source: False pydantic-httpx2-9b7ee8e/src/httpcore2/docs/requests-responses-urls.md000066400000000000000000000025571521723372100261320ustar00rootroot00000000000000# Requests, Responses, and URLs TODO ## Requests Request instances in `httpcore` are deliberately simple, and only include the essential information required to represent an HTTP request. Properties on the request are plain byte-wise representations. ```python >>> request = httpcore.Request("GET", "https://www.example.com/") >>> request.method b"GET" >>> request.url httpcore.URL(scheme=b"https", host=b"www.example.com", port=None, target=b"/") >>> request.headers [(b'Host', b'www.example.com')] >>> request.stream ``` The interface is liberal in the types that it accepts, but specific in the properties that it uses to represent them. For example, headers may be specified as a dictionary of strings, but internally are represented as a list of `(byte, byte)` tuples. ```python >>> headers = {"User-Agent": "custom"} >>> request = httpcore.Request("GET", "https://www.example.com/", headers=headers) >>> request.headers [(b'Host', b'www.example.com'), (b"User-Agent", b"custom")] ## Responses ... ## URLs ... --- # Reference ## `httpcore.Request` ::: httpcore.Request handler: python rendering: show_source: False ## `httpcore.Response` ::: httpcore.Response handler: python rendering: show_source: False ## `httpcore.URL` ::: httpcore.URL handler: python rendering: show_source: False pydantic-httpx2-9b7ee8e/src/httpcore2/docs/table-of-contents.md000066400000000000000000000027341521723372100245760ustar00rootroot00000000000000# API Reference * Quickstart * `httpcore.request()` * `httpcore.stream()` * Requests, Responses, and URLs * `httpcore.Request` * `httpcore.Response` * `httpcore.URL` * Connection Pools * `httpcore.ConnectionPool` * Proxies * `httpcore.Proxy` * Connections * `httpcore.HTTPConnection` * `httpcore.HTTP11Connection` * `httpcore.HTTP2Connection` * Async Support * `httpcore.AsyncConnectionPool` * `httpcore.AsyncHTTPConnection` * `httpcore.AsyncHTTP11Connection` * `httpcore.AsyncHTTP2Connection` * Network Backends * Sync * `httpcore.backends.sync.SyncBackend` * `httpcore.backends.mock.MockBackend` * Async * `httpcore.backends.auto.AutoBackend` * `httpcore.backends.asyncio.AsyncioBackend` * `httpcore.backends.trio.TrioBackend` * `httpcore.backends.mock.AsyncMockBackend` * Base interfaces * `httpcore.backends.base.NetworkBackend` * `httpcore.backends.base.AsyncNetworkBackend` * Exceptions * `httpcore.TimeoutException` * `httpcore.PoolTimeout` * `httpcore.ConnectTimeout` * `httpcore.ReadTimeout` * `httpcore.WriteTimeout` * `httpcore.NetworkError` * `httpcore.ConnectError` * `httpcore.ReadError` * `httpcore.WriteError` * `httpcore.ProtocolError` * `httpcore.RemoteProtocolError` * `httpcore.LocalProtocolError` * `httpcore.ProxyError` * `httpcore.UnsupportedProtocol` pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/000077500000000000000000000000001521723372100217045ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/__init__.py000066400000000000000000000066211521723372100240220ustar00rootroot00000000000000from importlib.metadata import version from ._api import request, stream from ._async import ( AsyncConnectionInterface, AsyncConnectionPool, AsyncHTTP2Connection, AsyncHTTP11Connection, AsyncHTTPConnection, AsyncHTTPProxy, AsyncSOCKSProxy, ) from ._backends.base import ( SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream, NetworkBackend, NetworkStream, ) from ._backends.mock import AsyncMockBackend, AsyncMockStream, MockBackend, MockStream from ._backends.sync import SyncBackend from ._exceptions import ( ConnectError, ConnectionNotAvailable, ConnectTimeout, LocalProtocolError, NetworkError, PoolTimeout, ProtocolError, ProxyError, ReadError, ReadTimeout, RemoteProtocolError, TimeoutException, UnsupportedProtocol, WriteError, WriteTimeout, ) from ._models import URL, Origin, Proxy, Request, Response from ._ssl import default_ssl_context from ._sync import ( ConnectionInterface, ConnectionPool, HTTP2Connection, HTTP11Connection, HTTPConnection, HTTPProxy, SOCKSProxy, ) # The 'httpcore2.AnyIOBackend' class is conditional on 'anyio' being installed. try: from ._backends.anyio import AnyIOBackend except ImportError: # pragma: no cover class AnyIOBackend: # type: ignore def __init__(self, *args, **kwargs): # type: ignore msg = "Attempted to use 'httpcore2.AnyIOBackend' but 'anyio' is not installed." raise RuntimeError(msg) # The 'httpcore2.TrioBackend' class is conditional on 'trio' being installed. try: from ._backends.trio import TrioBackend except ImportError: # pragma: no cover class TrioBackend: # type: ignore def __init__(self, *args, **kwargs): # type: ignore msg = "Attempted to use 'httpcore2.TrioBackend' but 'trio' is not installed." raise RuntimeError(msg) __all__ = [ # top-level requests "request", "stream", # models "Origin", "URL", "Request", "Response", "Proxy", # async "AsyncHTTPConnection", "AsyncConnectionPool", "AsyncHTTPProxy", "AsyncHTTP11Connection", "AsyncHTTP2Connection", "AsyncConnectionInterface", "AsyncSOCKSProxy", # sync "HTTPConnection", "ConnectionPool", "HTTPProxy", "HTTP11Connection", "HTTP2Connection", "ConnectionInterface", "SOCKSProxy", # network backends, implementations "SyncBackend", "AnyIOBackend", "TrioBackend", # network backends, mock implementations "AsyncMockBackend", "AsyncMockStream", "MockBackend", "MockStream", # network backends, interface "AsyncNetworkStream", "AsyncNetworkBackend", "NetworkStream", "NetworkBackend", # util "default_ssl_context", "SOCKET_OPTION", # exceptions "ConnectionNotAvailable", "ProxyError", "ProtocolError", "LocalProtocolError", "RemoteProtocolError", "UnsupportedProtocol", "TimeoutException", "PoolTimeout", "ConnectTimeout", "ReadTimeout", "WriteTimeout", "NetworkError", "ConnectError", "ReadError", "WriteError", ] __version__ = version("httpcore2") __locals = locals() for __name in __all__: # Exclude SOCKET_OPTION, it causes AttributeError on Python 3.14 if not __name.startswith(("__", "SOCKET_OPTION")): setattr(__locals[__name], "__module__", "httpcore2") # noqa pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_api.py000066400000000000000000000061601521723372100231710ustar00rootroot00000000000000from __future__ import annotations import contextlib import typing from collections.abc import Generator from ._models import URL, Extensions, HeaderTypes, Response from ._sync.connection_pool import ConnectionPool def request( method: bytes | str, url: URL | bytes | str, *, headers: HeaderTypes = None, content: bytes | typing.Iterator[bytes] | None = None, extensions: Extensions | None = None, ) -> Response: """ Sends an HTTP request, returning the response. ``` response = httpcore2.request("GET", "https://www.example.com/") ``` Arguments: method: The HTTP method for the request. Typically one of `"GET"`, `"OPTIONS"`, `"HEAD"`, `"POST"`, `"PUT"`, `"PATCH"`, or `"DELETE"`. url: The URL of the HTTP request. Either as an instance of `httpcore2.URL`, or as str/bytes. headers: The HTTP request headers. Either as a dictionary of str/bytes, or as a list of two-tuples of str/bytes. content: The content of the request body. Either as bytes, or as a bytes iterator. extensions: A dictionary of optional extra information included on the request. Possible keys include `"timeout"`. Returns: An instance of `httpcore2.Response`. """ with ConnectionPool() as pool: return pool.request( method=method, url=url, headers=headers, content=content, extensions=extensions, ) @contextlib.contextmanager def stream( method: bytes | str, url: URL | bytes | str, *, headers: HeaderTypes = None, content: bytes | typing.Iterator[bytes] | None = None, extensions: Extensions | None = None, ) -> Generator[Response]: """ Sends an HTTP request, returning the response within a content manager. ``` with httpcore2.stream("GET", "https://www.example.com/") as response: ... ``` When using the `stream()` function, the body of the response will not be automatically read. If you want to access the response body you should either use `content = response.read()`, or `for chunk in response.iter_content()`. Arguments: method: The HTTP method for the request. Typically one of `"GET"`, `"OPTIONS"`, `"HEAD"`, `"POST"`, `"PUT"`, `"PATCH"`, or `"DELETE"`. url: The URL of the HTTP request. Either as an instance of `httpcore2.URL`, or as str/bytes. headers: The HTTP request headers. Either as a dictionary of str/bytes, or as a list of two-tuples of str/bytes. content: The content of the request body. Either as bytes, or as a bytes iterator. extensions: A dictionary of optional extra information included on the request. Possible keys include `"timeout"`. Returns: An instance of `httpcore2.Response`. """ with ConnectionPool() as pool: with pool.stream( method=method, url=url, headers=headers, content=content, extensions=extensions, ) as response: yield response pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_async/000077500000000000000000000000001521723372100231605ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_async/__init__.py000066400000000000000000000023071521723372100252730ustar00rootroot00000000000000from .connection import AsyncHTTPConnection from .connection_pool import AsyncConnectionPool from .http11 import AsyncHTTP11Connection from .http_proxy import AsyncHTTPProxy from .interfaces import AsyncConnectionInterface try: from .http2 import AsyncHTTP2Connection except ImportError: # pragma: no cover class AsyncHTTP2Connection: # type: ignore def __init__(self, *args, **kwargs) -> None: # type: ignore raise RuntimeError( "Attempted to use http2 support, but the `h2` package is not " "installed. Use 'pip install httpcore[http2]'." ) try: from .socks_proxy import AsyncSOCKSProxy except ImportError: # pragma: no cover class AsyncSOCKSProxy: # type: ignore def __init__(self, *args, **kwargs) -> None: # type: ignore raise RuntimeError( "Attempted to use SOCKS support, but the `socksio` package is not " "installed. Use 'pip install httpcore[socks]'." ) __all__ = [ "AsyncHTTPConnection", "AsyncConnectionPool", "AsyncHTTPProxy", "AsyncHTTP11Connection", "AsyncHTTP2Connection", "AsyncConnectionInterface", "AsyncSOCKSProxy", ] pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_async/connection.py000066400000000000000000000175501521723372100257010ustar00rootroot00000000000000from __future__ import annotations import itertools import logging import ssl import types import typing from .._backends.auto import AutoBackend from .._backends.base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream from .._exceptions import ConnectError, ConnectTimeout from .._models import Origin, Request, Response from .._ssl import default_ssl_context from .._synchronization import AsyncLock from .._trace import Trace from .http11 import AsyncHTTP11Connection from .interfaces import AsyncConnectionInterface RETRIES_BACKOFF_FACTOR = 0.5 # 0s, 0.5s, 1s, 2s, 4s, etc. logger = logging.getLogger("httpcore2.connection") def exponential_backoff(factor: float) -> typing.Iterator[float]: """ Generate a geometric sequence that has a ratio of 2 and starts with 0. For example: - `factor = 2`: `0, 2, 4, 8, 16, 32, 64, ...` - `factor = 3`: `0, 3, 6, 12, 24, 48, 96, ...` """ yield 0 for n in itertools.count(): yield factor * 2**n class AsyncHTTPConnection(AsyncConnectionInterface): def __init__( self, origin: Origin, ssl_context: ssl.SSLContext | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, retries: int = 0, local_address: str | None = None, uds: str | None = None, network_backend: AsyncNetworkBackend | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> None: self._origin = origin self._ssl_context = ssl_context self._keepalive_expiry = keepalive_expiry self._http1 = http1 self._http2 = http2 self._retries = retries self._local_address = local_address self._uds = uds self._network_backend: AsyncNetworkBackend = AutoBackend() if network_backend is None else network_backend self._connection: AsyncConnectionInterface | None = None self._connect_failed: bool = False self._request_lock = AsyncLock() self._socket_options = socket_options async def handle_async_request(self, request: Request) -> Response: if not self.can_handle_request(request.url.origin): raise RuntimeError(f"Attempted to send request to {request.url.origin} on connection to {self._origin}") try: async with self._request_lock: if self._connection is None: stream = await self._connect(request) ssl_object = stream.get_extra_info("ssl_object") http2_negotiated = ssl_object is not None and ssl_object.selected_alpn_protocol() == "h2" if http2_negotiated or (self._http2 and not self._http1): from .http2 import AsyncHTTP2Connection self._connection = AsyncHTTP2Connection( origin=self._origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) else: self._connection = AsyncHTTP11Connection( origin=self._origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) except BaseException as exc: self._connect_failed = True raise exc return await self._connection.handle_async_request(request) async def _connect(self, request: Request) -> AsyncNetworkStream: timeouts = request.extensions.get("timeout", {}) sni_hostname = request.extensions.get("sni_hostname", None) timeout = timeouts.get("connect", None) retries_left = self._retries delays = exponential_backoff(factor=RETRIES_BACKOFF_FACTOR) while True: try: if self._uds is None: kwargs = { "host": self._origin.host.decode("ascii"), "port": self._origin.port, "local_address": self._local_address, "timeout": timeout, "socket_options": self._socket_options, } async with Trace("connect_tcp", logger, request, kwargs) as trace: stream = await self._network_backend.connect_tcp(**kwargs) trace.return_value = stream else: kwargs = { "path": self._uds, "timeout": timeout, "socket_options": self._socket_options, } async with Trace("connect_unix_socket", logger, request, kwargs) as trace: stream = await self._network_backend.connect_unix_socket(**kwargs) trace.return_value = stream if self._origin.scheme in (b"https", b"wss"): ssl_context = default_ssl_context() if self._ssl_context is None else self._ssl_context alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] ssl_context.set_alpn_protocols(alpn_protocols) kwargs = { "ssl_context": ssl_context, "server_hostname": sni_hostname or self._origin.host.decode("ascii"), "timeout": timeout, } async with Trace("start_tls", logger, request, kwargs) as trace: stream = await stream.start_tls(**kwargs) trace.return_value = stream return stream except (ConnectError, ConnectTimeout): if retries_left <= 0: raise retries_left -= 1 delay = next(delays) async with Trace("retry", logger, request, kwargs) as trace: await self._network_backend.sleep(delay) def can_handle_request(self, origin: Origin) -> bool: return origin == self._origin async def aclose(self) -> None: if self._connection is not None: async with Trace("close", logger, None, {}): await self._connection.aclose() def is_available(self) -> bool: if self._connection is None: # If HTTP/2 support is enabled, and the resulting connection could # end up as HTTP/2 then we should indicate the connection as being # available to service multiple requests. return self._http2 and (self._origin.scheme == b"https" or not self._http1) and not self._connect_failed return self._connection.is_available() def has_expired(self) -> bool: if self._connection is None: return self._connect_failed return self._connection.has_expired() def is_idle(self) -> bool: if self._connection is None: return self._connect_failed return self._connection.is_idle() def is_closed(self) -> bool: if self._connection is None: return self._connect_failed return self._connection.is_closed() def info(self) -> str: if self._connection is None: return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" return self._connection.info() def __repr__(self) -> str: return f"<{self.__class__.__name__} [{self.info()}]>" # These context managers are not used in the standard flow, but are # useful for testing or working with connection instances directly. async def __aenter__(self) -> AsyncHTTPConnection: return self async def __aexit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: await self.aclose() pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_async/connection_pool.py000066400000000000000000000420441521723372100267260ustar00rootroot00000000000000from __future__ import annotations import ssl import sys import types import typing from collections.abc import AsyncGenerator from .._backends.auto import AutoBackend from .._backends.base import SOCKET_OPTION, AsyncNetworkBackend from .._exceptions import ConnectionNotAvailable, UnsupportedProtocol from .._models import Origin, Proxy, Request, Response from .._synchronization import AsyncEvent, AsyncShieldCancellation, AsyncThreadLock from .._utils import safe_async_iterate from .connection import AsyncHTTPConnection from .interfaces import AsyncConnectionInterface, AsyncRequestInterface class AsyncPoolRequest: def __init__(self, request: Request) -> None: self.request = request self.connection: AsyncConnectionInterface | None = None self._connection_acquired = AsyncEvent() def assign_to_connection(self, connection: AsyncConnectionInterface | None) -> None: self.connection = connection self._connection_acquired.set() def clear_connection(self) -> None: self.connection = None self._connection_acquired = AsyncEvent() async def wait_for_connection(self, timeout: float | None = None) -> AsyncConnectionInterface: if self.connection is None: await self._connection_acquired.wait(timeout=timeout) assert self.connection is not None return self.connection def is_queued(self) -> bool: return self.connection is None class AsyncConnectionPool(AsyncRequestInterface): """ A connection pool for making HTTP requests. """ def __init__( self, ssl_context: ssl.SSLContext | None = None, proxy: Proxy | None = None, max_connections: int | None = 10, max_keepalive_connections: int | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, retries: int = 0, local_address: str | None = None, uds: str | None = None, network_backend: AsyncNetworkBackend | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> None: """ A connection pool for making HTTP requests. Parameters: ssl_context: An SSL context to use for verifying connections. If not specified, the default `httpcore2.default_ssl_context()` will be used. max_connections: The maximum number of concurrent HTTP connections that the pool should allow. Any attempt to send a request on a pool that would exceed this amount will block until a connection is available. max_keepalive_connections: The maximum number of idle HTTP connections that will be maintained in the pool. keepalive_expiry: The duration in seconds that an idle HTTP connection may be maintained for before being expired from the pool. http1: A boolean indicating if HTTP/1.1 requests should be supported by the connection pool. Defaults to True. http2: A boolean indicating if HTTP/2 requests should be supported by the connection pool. Defaults to False. retries: The maximum number of retries when trying to establish a connection. local_address: Local address to connect from. Can also be used to connect using a particular address family. Using `local_address="0.0.0.0"` will connect using an `AF_INET` address (IPv4), while using `local_address="::"` will connect using an `AF_INET6` address (IPv6). uds: Path to a Unix Domain Socket to use instead of TCP sockets. network_backend: A backend instance to use for handling network I/O. socket_options: Socket options that have to be included in the TCP socket when the connection was established. """ self._ssl_context = ssl_context self._proxy = proxy self._max_connections = sys.maxsize if max_connections is None else max_connections self._max_keepalive_connections = ( sys.maxsize if max_keepalive_connections is None else max_keepalive_connections ) self._max_keepalive_connections = min(self._max_connections, self._max_keepalive_connections) self._keepalive_expiry = keepalive_expiry self._http1 = http1 self._http2 = http2 self._retries = retries self._local_address = local_address self._uds = uds self._network_backend = AutoBackend() if network_backend is None else network_backend self._socket_options = socket_options # The mutable state on a connection pool is the queue of incoming requests, # and the set of connections that are servicing those requests. self._connections: list[AsyncConnectionInterface] = [] self._requests: list[AsyncPoolRequest] = [] # We only mutate the state of the connection pool within an 'optional_thread_lock' # context. This holds a threading lock unless we're running in async mode, # in which case it is a no-op. self._optional_thread_lock = AsyncThreadLock() def create_connection(self, origin: Origin) -> AsyncConnectionInterface: if self._proxy is not None: if self._proxy.url.scheme in (b"socks5", b"socks5h"): from .socks_proxy import AsyncSocks5Connection return AsyncSocks5Connection( proxy_origin=self._proxy.url.origin, proxy_auth=self._proxy.auth, remote_origin=origin, ssl_context=self._ssl_context, keepalive_expiry=self._keepalive_expiry, http1=self._http1, http2=self._http2, network_backend=self._network_backend, ) elif origin.scheme == b"http": from .http_proxy import AsyncForwardHTTPConnection return AsyncForwardHTTPConnection( proxy_origin=self._proxy.url.origin, proxy_headers=self._proxy.headers, proxy_ssl_context=self._proxy.ssl_context, remote_origin=origin, keepalive_expiry=self._keepalive_expiry, network_backend=self._network_backend, ) from .http_proxy import AsyncTunnelHTTPConnection return AsyncTunnelHTTPConnection( proxy_origin=self._proxy.url.origin, proxy_headers=self._proxy.headers, proxy_ssl_context=self._proxy.ssl_context, remote_origin=origin, ssl_context=self._ssl_context, keepalive_expiry=self._keepalive_expiry, http1=self._http1, http2=self._http2, network_backend=self._network_backend, ) return AsyncHTTPConnection( origin=origin, ssl_context=self._ssl_context, keepalive_expiry=self._keepalive_expiry, http1=self._http1, http2=self._http2, retries=self._retries, local_address=self._local_address, uds=self._uds, network_backend=self._network_backend, socket_options=self._socket_options, ) @property def connections(self) -> list[AsyncConnectionInterface]: """ Return a list of the connections currently in the pool. For example: ```python >>> pool.connections [ , , , ] ``` """ return list(self._connections) async def handle_async_request(self, request: Request) -> Response: """ Send an HTTP request, and return an HTTP response. This is the core implementation that is called into by `.request()` or `.stream()`. """ scheme = request.url.scheme.decode() if scheme == "": raise UnsupportedProtocol("Request URL is missing an 'http://' or 'https://' protocol.") if scheme not in ("http", "https", "ws", "wss"): raise UnsupportedProtocol(f"Request URL has an unsupported protocol '{scheme}://'.") timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("pool", None) with self._optional_thread_lock: # Add the incoming request to our request queue. pool_request = AsyncPoolRequest(request) self._requests.append(pool_request) try: while True: with self._optional_thread_lock: # Assign incoming requests to available connections, # closing or creating new connections as required. closing = self._assign_requests_to_connections() await self._close_connections(closing) # Wait until this request has an assigned connection. connection = await pool_request.wait_for_connection(timeout=timeout) try: # Send the request on the assigned connection. response = await connection.handle_async_request(pool_request.request) except ConnectionNotAvailable: # In some cases a connection may initially be available to # handle a request, but then become unavailable. # # In this case we clear the connection and try again. pool_request.clear_connection() else: break # pragma: no cover except BaseException as exc: with self._optional_thread_lock: # For any exception or cancellation we remove the request from # the queue, and then re-assign requests to connections. self._requests.remove(pool_request) closing = self._assign_requests_to_connections() await self._close_connections(closing) raise exc from None # Return the response. Note that in this case we still have to manage # the point at which the response is closed. assert isinstance(response.stream, typing.AsyncIterable) return Response( status=response.status, headers=response.headers, content=PoolByteStream(stream=response.stream, pool_request=pool_request, pool=self), extensions=response.extensions, ) def _assign_requests_to_connections(self) -> list[AsyncConnectionInterface]: """ Manage the state of the connection pool, assigning incoming requests to connections as available. Called whenever a new request is added or removed from the pool. Any closing connections are returned, allowing the I/O for closing those connections to be handled separately. """ closing_connections: list[AsyncConnectionInterface] = [] retained_connections: list[AsyncConnectionInterface] = [] # First we handle cleaning up any connections that are closed # or have expired their keep-alive, in a single pass. for connection in self._connections: if connection.is_closed(): continue elif connection.has_expired(): closing_connections.append(connection) else: retained_connections.append(connection) # Then we close any surplus idle connections, to enforce the # max_keepalive_connections setting. idle_surplus = ( sum(connection.is_idle() for connection in retained_connections) - self._max_keepalive_connections ) if idle_surplus > 0: kept: list[AsyncConnectionInterface] = [] for connection in retained_connections: if idle_surplus > 0 and connection.is_idle(): closing_connections.append(connection) idle_surplus -= 1 else: kept.append(connection) retained_connections = kept self._connections = retained_connections # Snapshot the set of reusable connections once, rather than rebuilding # it per queued request β€” this is what brings the loop from O(N*M) to # O(N+M) in the common case. available_connections = [connection for connection in self._connections if connection.is_available()] new_connection_budget = self._max_connections - len(self._connections) # Assign queued requests to connections. for pool_request in self._requests: if not pool_request.is_queued(): continue origin = pool_request.request.url.origin # There are three cases for how we may be able to handle the request: # # 1. There is an existing connection that can handle the request. # 2. We can create a new connection to handle the request. # 3. We can close an idle connection and then create a new connection # to handle the request. for connection in available_connections: if connection.can_handle_request(origin): pool_request.assign_to_connection(connection) break else: if new_connection_budget > 0: connection = self.create_connection(origin) self._connections.append(connection) pool_request.assign_to_connection(connection) new_connection_budget -= 1 continue for idx, connection in enumerate(available_connections): if connection.is_idle(): del available_connections[idx] self._connections.remove(connection) closing_connections.append(connection) connection = self.create_connection(origin) self._connections.append(connection) pool_request.assign_to_connection(connection) break return closing_connections async def _close_connections(self, closing: list[AsyncConnectionInterface]) -> None: # Close connections which have been removed from the pool. with AsyncShieldCancellation(): for connection in closing: await connection.aclose() async def aclose(self) -> None: # Explicitly close the connection pool. # Clears all existing requests and connections. with self._optional_thread_lock: closing_connections = list(self._connections) self._connections = [] await self._close_connections(closing_connections) async def __aenter__(self) -> AsyncConnectionPool: return self async def __aexit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: await self.aclose() def __repr__(self) -> str: class_name = self.__class__.__name__ with self._optional_thread_lock: request_is_queued = [request.is_queued() for request in self._requests] connection_is_idle = [connection.is_idle() for connection in self._connections] num_active_requests = request_is_queued.count(False) num_queued_requests = request_is_queued.count(True) num_active_connections = connection_is_idle.count(False) num_idle_connections = connection_is_idle.count(True) requests_info = f"Requests: {num_active_requests} active, {num_queued_requests} queued" connection_info = f"Connections: {num_active_connections} active, {num_idle_connections} idle" return f"<{class_name} [{requests_info} | {connection_info}]>" class PoolByteStream: def __init__( self, stream: typing.AsyncIterable[bytes], pool_request: AsyncPoolRequest, pool: AsyncConnectionPool, ) -> None: self._stream = stream self._pool_request = pool_request self._pool = pool self._closed = False async def __aiter__(self) -> AsyncGenerator[bytes]: async with safe_async_iterate(self._stream) as iterator: async for chunk in iterator: yield chunk async def aclose(self) -> None: if not self._closed: self._closed = True with AsyncShieldCancellation(): if hasattr(self._stream, "aclose"): await self._stream.aclose() with self._pool._optional_thread_lock: self._pool._requests.remove(self._pool_request) closing = self._pool._assign_requests_to_connections() await self._pool._close_connections(closing) pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_async/http11.py000066400000000000000000000325501521723372100246600ustar00rootroot00000000000000from __future__ import annotations import enum import logging import ssl import time import types import typing from collections.abc import AsyncGenerator import h11 from .._backends.base import AsyncNetworkStream from .._exceptions import ( ConnectionNotAvailable, LocalProtocolError, RemoteProtocolError, WriteError, map_exceptions, ) from .._models import Origin, Request, Response from .._synchronization import AsyncLock, AsyncShieldCancellation from .._trace import Trace from .._utils import safe_async_iterate from .interfaces import AsyncConnectionInterface logger = logging.getLogger("httpcore2.http11") # A subset of `h11.Event` types supported by `_send_event` H11SendEvent = h11.Request | h11.Data | h11.EndOfMessage class HTTPConnectionState(enum.IntEnum): NEW = 0 ACTIVE = 1 IDLE = 2 CLOSED = 3 class AsyncHTTP11Connection(AsyncConnectionInterface): READ_NUM_BYTES = 64 * 1024 MAX_INCOMPLETE_EVENT_SIZE = 100 * 1024 def __init__( self, origin: Origin, stream: AsyncNetworkStream, keepalive_expiry: float | None = None, ) -> None: self._origin = origin self._network_stream = stream self._keepalive_expiry: float | None = keepalive_expiry self._expire_at: float | None = None self._state = HTTPConnectionState.NEW self._state_lock = AsyncLock() self._request_count = 0 self._h11_state = h11.Connection( our_role=h11.CLIENT, max_incomplete_event_size=self.MAX_INCOMPLETE_EVENT_SIZE, ) async def handle_async_request(self, request: Request) -> Response: if not self.can_handle_request(request.url.origin): raise RuntimeError(f"Attempted to send request to {request.url.origin} on connection to {self._origin}") async with self._state_lock: if self._state in (HTTPConnectionState.NEW, HTTPConnectionState.IDLE): self._request_count += 1 self._state = HTTPConnectionState.ACTIVE self._expire_at = None else: raise ConnectionNotAvailable() try: kwargs = {"request": request} try: async with Trace("send_request_headers", logger, request, kwargs) as trace: await self._send_request_headers(**kwargs) async with Trace("send_request_body", logger, request, kwargs) as trace: await self._send_request_body(**kwargs) except WriteError: # If we get a write error while we're writing the request, # then we suppress this error and move on to attempting to # read the response. Servers can sometimes close the request # preemptively and then respond with a well formed HTTP # error response. pass async with Trace("receive_response_headers", logger, request, kwargs) as trace: ( http_version, status, reason_phrase, headers, trailing_data, ) = await self._receive_response_headers(**kwargs) trace.return_value = ( http_version, status, reason_phrase, headers, ) network_stream = self._network_stream # CONNECT or Upgrade request if (status == 101) or ((request.method == b"CONNECT") and (200 <= status < 300)): network_stream = AsyncHTTP11UpgradeStream(network_stream, trailing_data) return Response( status=status, headers=headers, content=HTTP11ConnectionByteStream(self, request), extensions={ "http_version": http_version, "reason_phrase": reason_phrase, "network_stream": network_stream, }, ) except BaseException as exc: with AsyncShieldCancellation(): async with Trace("response_closed", logger, request) as trace: await self._response_closed() raise exc # Sending the request... async def _send_request_headers(self, request: Request) -> None: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("write", None) with map_exceptions({h11.LocalProtocolError: LocalProtocolError}): event = h11.Request( method=request.method, target=request.url.target, headers=request.headers, ) await self._send_event(event, timeout=timeout) async def _send_request_body(self, request: Request) -> None: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("write", None) assert isinstance(request.stream, typing.AsyncIterable) async with safe_async_iterate(request.stream) as iterator: async for chunk in iterator: event = h11.Data(data=chunk) await self._send_event(event, timeout=timeout) await self._send_event(h11.EndOfMessage(), timeout=timeout) async def _send_event(self, event: h11.Event, timeout: float | None = None) -> None: bytes_to_send = self._h11_state.send(event) if bytes_to_send is not None: await self._network_stream.write(bytes_to_send, timeout=timeout) # Receiving the response... async def _receive_response_headers( self, request: Request ) -> tuple[bytes, int, bytes, list[tuple[bytes, bytes]], bytes]: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("read", None) while True: event = await self._receive_event(timeout=timeout) if isinstance(event, h11.Response): break if isinstance(event, h11.InformationalResponse) and event.status_code == 101: break http_version = b"HTTP/" + event.http_version # h11 version 0.11+ supports a `raw_items` interface to get the # raw header casing, rather than the enforced lowercase headers. headers = event.headers.raw_items() trailing_data, _ = self._h11_state.trailing_data return http_version, event.status_code, event.reason, headers, trailing_data async def _receive_response_body(self, request: Request) -> AsyncGenerator[bytes]: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("read", None) while True: event = await self._receive_event(timeout=timeout) if isinstance(event, h11.Data): yield bytes(event.data) elif isinstance(event, (h11.EndOfMessage, h11.PAUSED)): break async def _receive_event(self, timeout: float | None = None) -> h11.Event | type[h11.PAUSED]: while True: with map_exceptions({h11.RemoteProtocolError: RemoteProtocolError}): event = self._h11_state.next_event() if event is h11.NEED_DATA: data = await self._network_stream.read(self.READ_NUM_BYTES, timeout=timeout) # If we feed this case through h11 we'll raise an exception like: # # httpcore2.RemoteProtocolError: can't handle event type # ConnectionClosed when role=SERVER and state=SEND_RESPONSE # # Which is accurate, but not very informative from an end-user # perspective. Instead we handle this case distinctly and treat # it as a ConnectError. if data == b"" and self._h11_state.their_state == h11.SEND_RESPONSE: msg = "Server disconnected without sending a response." raise RemoteProtocolError(msg) self._h11_state.receive_data(data) else: # mypy fails to narrow the type in the above if statement above return event # type: ignore[return-value] async def _response_closed(self) -> None: async with self._state_lock: if self._h11_state.our_state is h11.DONE and self._h11_state.their_state is h11.DONE: self._state = HTTPConnectionState.IDLE self._h11_state.start_next_cycle() if self._keepalive_expiry is not None: now = time.monotonic() self._expire_at = now + self._keepalive_expiry else: await self.aclose() # Once the connection is no longer required... async def aclose(self) -> None: # Note that this method unilaterally closes the connection, and does # not have any kind of locking in place around it. self._state = HTTPConnectionState.CLOSED await self._network_stream.aclose() # The AsyncConnectionInterface methods provide information about the state of # the connection, allowing for a connection pooling implementation to # determine when to reuse and when to close the connection... def can_handle_request(self, origin: Origin) -> bool: return origin == self._origin def is_available(self) -> bool: # Note that HTTP/1.1 connections in the "NEW" state are not treated as # being "available". The control flow which created the connection will # be able to send an outgoing request, but the connection will not be # acquired from the connection pool for any other request. return self._state == HTTPConnectionState.IDLE def has_expired(self) -> bool: now = time.monotonic() keepalive_expired = self._expire_at is not None and now > self._expire_at # If the HTTP connection is idle but the socket is readable, then the # only valid state is that the socket is about to return b"", indicating # a server-initiated disconnect. server_disconnected = self._state == HTTPConnectionState.IDLE and self._network_stream.get_extra_info( "is_readable" ) return keepalive_expired or server_disconnected def is_idle(self) -> bool: return self._state == HTTPConnectionState.IDLE def is_closed(self) -> bool: return self._state == HTTPConnectionState.CLOSED def info(self) -> str: origin = str(self._origin) return f"{origin!r}, HTTP/1.1, {self._state.name}, Request Count: {self._request_count}" def __repr__(self) -> str: class_name = self.__class__.__name__ origin = str(self._origin) return f"<{class_name} [{origin!r}, {self._state.name}, Request Count: {self._request_count}]>" # These context managers are not used in the standard flow, but are # useful for testing or working with connection instances directly. async def __aenter__(self) -> AsyncHTTP11Connection: return self async def __aexit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: await self.aclose() class HTTP11ConnectionByteStream: def __init__(self, connection: AsyncHTTP11Connection, request: Request) -> None: self._connection = connection self._request = request self._closed = False async def __aiter__(self) -> AsyncGenerator[bytes]: kwargs = {"request": self._request} try: async with Trace("receive_response_body", logger, self._request, kwargs): async with safe_async_iterate(self._connection._receive_response_body(**kwargs)) as iterator: async for chunk in iterator: yield chunk except BaseException as exc: # If we get an exception while streaming the response, # we want to close the response (and possibly the connection) # before raising that exception. with AsyncShieldCancellation(): await self.aclose() raise exc async def aclose(self) -> None: if not self._closed: self._closed = True async with Trace("response_closed", logger, self._request): await self._connection._response_closed() class AsyncHTTP11UpgradeStream(AsyncNetworkStream): def __init__(self, stream: AsyncNetworkStream, leading_data: bytes) -> None: self._stream = stream self._leading_data = leading_data async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: if self._leading_data: buffer = self._leading_data[:max_bytes] self._leading_data = self._leading_data[max_bytes:] return buffer else: return await self._stream.read(max_bytes, timeout) async def write(self, buffer: bytes, timeout: float | None = None) -> None: await self._stream.write(buffer, timeout) async def aclose(self) -> None: await self._stream.aclose() async def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> AsyncNetworkStream: return await self._stream.start_tls(ssl_context, server_hostname, timeout) def get_extra_info(self, info: str) -> typing.Any: return self._stream.get_extra_info(info) pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_async/http2.py000066400000000000000000000561071521723372100246040ustar00rootroot00000000000000from __future__ import annotations import enum import logging import time import types import typing from collections.abc import AsyncGenerator import h2.config import h2.connection import h2.events import h2.exceptions import h2.settings from .._backends.base import AsyncNetworkStream from .._exceptions import ConnectionNotAvailable, LocalProtocolError, RemoteProtocolError from .._models import Origin, Request, Response from .._synchronization import AsyncLock, AsyncSemaphore, AsyncShieldCancellation from .._trace import Trace from .._utils import safe_async_iterate from .interfaces import AsyncConnectionInterface logger = logging.getLogger("httpcore2.http2") def has_body_headers(request: Request) -> bool: return any(k.lower() == b"content-length" or k.lower() == b"transfer-encoding" for k, _v in request.headers) class HTTPConnectionState(enum.IntEnum): ACTIVE = 1 IDLE = 2 CLOSED = 3 class AsyncHTTP2Connection(AsyncConnectionInterface): READ_NUM_BYTES = 64 * 1024 CONFIG = h2.config.H2Configuration(validate_inbound_headers=False) def __init__( self, origin: Origin, stream: AsyncNetworkStream, keepalive_expiry: float | None = None, ): self._origin = origin self._network_stream = stream self._keepalive_expiry: float | None = keepalive_expiry self._h2_state = h2.connection.H2Connection(config=self.CONFIG) self._state = HTTPConnectionState.IDLE self._expire_at: float | None = None self._request_count = 0 self._init_lock = AsyncLock() self._state_lock = AsyncLock() self._read_lock = AsyncLock() self._write_lock = AsyncLock() self._sent_connection_init = False self._used_all_stream_ids = False self._connection_error = False # Mapping from stream ID to response stream events. self._events: dict[ int, list[h2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEnded | h2.events.StreamReset,], ] = {} # Connection terminated events are stored as state since # we need to handle them for all streams. self._connection_terminated: h2.events.ConnectionTerminated | None = None self._read_exception: Exception | None = None self._write_exception: Exception | None = None async def handle_async_request(self, request: Request) -> Response: if not self.can_handle_request(request.url.origin): # This cannot occur in normal operation, since the connection pool # will only send requests on connections that handle them. # It's in place simply for resilience as a guard against incorrect # usage, for anyone working directly with httpcore connections. raise RuntimeError(f"Attempted to send request to {request.url.origin} on connection to {self._origin}") async with self._state_lock: if self._state in (HTTPConnectionState.ACTIVE, HTTPConnectionState.IDLE): self._request_count += 1 self._expire_at = None self._state = HTTPConnectionState.ACTIVE else: raise ConnectionNotAvailable() async with self._init_lock: if not self._sent_connection_init: try: sci_kwargs = {"request": request} async with Trace("send_connection_init", logger, request, sci_kwargs): await self._send_connection_init(**sci_kwargs) except BaseException as exc: with AsyncShieldCancellation(): await self.aclose() raise exc self._sent_connection_init = True # Initially start with just 1 until the remote server provides # its max_concurrent_streams value self._max_streams = 1 local_settings_max_streams = self._h2_state.local_settings.max_concurrent_streams self._max_streams_semaphore = AsyncSemaphore(local_settings_max_streams) for _ in range(local_settings_max_streams - self._max_streams): await self._max_streams_semaphore.acquire() await self._max_streams_semaphore.acquire() try: stream_id = self._h2_state.get_next_available_stream_id() self._events[stream_id] = [] except h2.exceptions.NoAvailableStreamIDError: # pragma: no cover self._used_all_stream_ids = True self._request_count -= 1 await self._max_streams_semaphore.release() raise ConnectionNotAvailable() try: kwargs = {"request": request, "stream_id": stream_id} async with Trace("send_request_headers", logger, request, kwargs): await self._send_request_headers(request=request, stream_id=stream_id) async with Trace("send_request_body", logger, request, kwargs): await self._send_request_body(request=request, stream_id=stream_id) async with Trace("receive_response_headers", logger, request, kwargs) as trace: status, headers = await self._receive_response(request=request, stream_id=stream_id) trace.return_value = (status, headers) return Response( status=status, headers=headers, content=HTTP2ConnectionByteStream(self, request, stream_id=stream_id), extensions={ "http_version": b"HTTP/2", "network_stream": self._network_stream, "stream_id": stream_id, }, ) except BaseException as exc: # noqa: PIE786 with AsyncShieldCancellation(): kwargs = {"stream_id": stream_id} async with Trace("response_closed", logger, request, kwargs): await self._response_closed(stream_id=stream_id) if isinstance(exc, h2.exceptions.ProtocolError): # One case where h2 can raise a protocol error is when a # closed frame has been seen by the state machine. # # This happens when one stream is reading, and encounters # a GOAWAY event. Other flows of control may then raise # a protocol error at any point they interact with the 'h2_state'. # # In this case we'll have stored the event, and should raise # it as a RemoteProtocolError. if self._connection_terminated: # pragma: no cover raise RemoteProtocolError(self._connection_terminated) # If h2 raises a protocol error in some other state then we # must somehow have made a protocol violation. raise LocalProtocolError(exc) # pragma: no cover raise exc async def _send_connection_init(self, request: Request) -> None: """ The HTTP/2 connection requires some initial setup before we can start using individual request/response streams on it. """ # Need to set these manually here instead of manipulating via # __setitem__() otherwise the H2Connection will emit SettingsUpdate # frames in addition to sending the undesired defaults. self._h2_state.local_settings = h2.settings.Settings( client=True, initial_values={ # Disable PUSH_PROMISE frames from the server since we don't do anything # with them for now. Maybe when we support caching? h2.settings.SettingCodes.ENABLE_PUSH: 0, # These two are taken from h2 for safe defaults h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 100, h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: 65536, }, ) # Some websites (*cough* Yahoo *cough*) balk at this setting being # present in the initial handshake since it's not defined in the original # RFC despite the RFC mandating ignoring settings you don't know about. del self._h2_state.local_settings[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] self._h2_state.initiate_connection() self._h2_state.increment_flow_control_window(2**24) await self._write_outgoing_data(request) # Sending the request... async def _send_request_headers(self, request: Request, stream_id: int) -> None: """ Send the request headers to a given stream ID. """ end_stream = not has_body_headers(request) # In HTTP/2 the ':authority' pseudo-header is used instead of 'Host'. # In order to gracefully handle HTTP/1.1 and HTTP/2 we always require # HTTP/1.1 style headers, and map them appropriately if we end up on # an HTTP/2 connection. authority = [v for k, v in request.headers if k.lower() == b"host"][0] headers = [ (b":method", request.method), (b":authority", authority), (b":scheme", request.url.scheme), (b":path", request.url.target), ] + [ (k.lower(), v) for k, v in request.headers if k.lower() not in ( b"host", b"transfer-encoding", ) ] self._h2_state.send_headers(stream_id, headers, end_stream=end_stream) self._h2_state.increment_flow_control_window(2**24, stream_id=stream_id) await self._write_outgoing_data(request) async def _send_request_body(self, request: Request, stream_id: int) -> None: """ Iterate over the request body sending it to a given stream ID. """ if not has_body_headers(request): return assert isinstance(request.stream, typing.AsyncIterable) async with safe_async_iterate(request.stream) as iterator: async for chunk in iterator: await self._send_stream_data(request, stream_id, chunk) await self._send_end_stream(request, stream_id) async def _send_stream_data(self, request: Request, stream_id: int, data: bytes) -> None: """ Send a single chunk of data in one or more data frames. """ while data: max_flow = await self._wait_for_outgoing_flow(request, stream_id) chunk_size = min(len(data), max_flow) chunk, data = data[:chunk_size], data[chunk_size:] self._h2_state.send_data(stream_id, chunk) await self._write_outgoing_data(request) async def _send_end_stream(self, request: Request, stream_id: int) -> None: """ Send an empty data frame on on a given stream ID with the END_STREAM flag set. """ self._h2_state.end_stream(stream_id) await self._write_outgoing_data(request) # Receiving the response... async def _receive_response(self, request: Request, stream_id: int) -> tuple[int, list[tuple[bytes, bytes]]]: """ Return the response status code and headers for a given stream ID. """ while True: event = await self._receive_stream_event(request, stream_id) if isinstance(event, h2.events.ResponseReceived): break status_code = 200 headers: list[tuple[bytes, bytes]] = [] assert event.headers is not None for k, v in event.headers: if k == b":status": status_code = int(v.decode("ascii", errors="ignore")) elif not k.startswith(b":"): headers.append((k, v)) return (status_code, headers) async def _receive_response_body(self, request: Request, stream_id: int) -> AsyncGenerator[bytes]: """ Iterator that returns the bytes of the response body for a given stream ID. """ while True: event = await self._receive_stream_event(request, stream_id) if isinstance(event, h2.events.DataReceived): assert event.flow_controlled_length is not None assert event.data is not None amount = event.flow_controlled_length self._h2_state.acknowledge_received_data(amount, stream_id) await self._write_outgoing_data(request) yield event.data elif isinstance(event, h2.events.StreamEnded): break async def _receive_stream_event( self, request: Request, stream_id: int ) -> h2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEnded: """ Return the next available event for a given stream ID. Will read more data from the network if required. """ while not self._events.get(stream_id): await self._receive_events(request, stream_id) event = self._events[stream_id].pop(0) if isinstance(event, h2.events.StreamReset): raise RemoteProtocolError(event) return event async def _receive_events(self, request: Request, stream_id: int | None = None) -> None: """ Read some data from the network until we see one or more events for a given stream ID. """ async with self._read_lock: if self._connection_terminated is not None: last_stream_id = self._connection_terminated.last_stream_id if stream_id and last_stream_id and stream_id > last_stream_id: self._request_count -= 1 raise ConnectionNotAvailable() raise RemoteProtocolError(self._connection_terminated) # This conditional is a bit icky. We don't want to block reading if we've # actually got an event to return for a given stream. We need to do that # check *within* the atomic read lock. Though it also need to be optional, # because when we call it from `_wait_for_outgoing_flow` we *do* want to # block until we've available flow control, event when we have events # pending for the stream ID we're attempting to send on. if stream_id is None or not self._events.get(stream_id): events = await self._read_incoming_data(request) for event in events: if isinstance(event, h2.events.RemoteSettingsChanged): async with Trace("receive_remote_settings", logger, request) as trace: await self._receive_remote_settings_change(event) trace.return_value = event elif isinstance( event, ( h2.events.ResponseReceived, h2.events.DataReceived, h2.events.StreamEnded, h2.events.StreamReset, ), ): if event.stream_id in self._events: self._events[event.stream_id].append(event) elif isinstance(event, h2.events.ConnectionTerminated): self._connection_terminated = event await self._write_outgoing_data(request) async def _receive_remote_settings_change(self, event: h2.events.RemoteSettingsChanged) -> None: max_concurrent_streams = event.changed_settings.get(h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS) if max_concurrent_streams: new_max_streams = min( max_concurrent_streams.new_value, self._h2_state.local_settings.max_concurrent_streams, ) if new_max_streams and new_max_streams != self._max_streams: while new_max_streams > self._max_streams: await self._max_streams_semaphore.release() self._max_streams += 1 while new_max_streams < self._max_streams: await self._max_streams_semaphore.acquire() self._max_streams -= 1 async def _response_closed(self, stream_id: int) -> None: await self._max_streams_semaphore.release() async with self._state_lock: del self._events[stream_id] if self._connection_terminated and not self._events: await self.aclose() elif self._state == HTTPConnectionState.ACTIVE and not self._events: self._state = HTTPConnectionState.IDLE if self._keepalive_expiry is not None: now = time.monotonic() self._expire_at = now + self._keepalive_expiry if self._used_all_stream_ids: # pragma: no cover await self.aclose() async def aclose(self) -> None: # Note that this method unilaterally closes the connection, and does # not have any kind of locking in place around it. self._h2_state.close_connection() self._state = HTTPConnectionState.CLOSED await self._network_stream.aclose() # Wrappers around network read/write operations... async def _read_incoming_data(self, request: Request) -> list[h2.events.Event]: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("read", None) if self._read_exception is not None: raise self._read_exception # pragma: no cover try: data = await self._network_stream.read(self.READ_NUM_BYTES, timeout) if data == b"": raise RemoteProtocolError("Server disconnected") except Exception as exc: # If we get a network error we should: # # 1. Save the exception and just raise it immediately on any future reads. # (For example, this means that a single read timeout or disconnect will # immediately close all pending streams. Without requiring multiple # sequential timeouts.) # 2. Mark the connection as errored, so that we don't accept any other # incoming requests. self._read_exception = exc self._connection_error = True raise exc events: list[h2.events.Event] = self._h2_state.receive_data(data) return events async def _write_outgoing_data(self, request: Request) -> None: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("write", None) async with self._write_lock: data_to_send = self._h2_state.data_to_send() if self._write_exception is not None: raise self._write_exception # pragma: no cover try: await self._network_stream.write(data_to_send, timeout) except Exception as exc: # pragma: no cover # If we get a network error we should: # # 1. Save the exception and just raise it immediately on any future write. # (For example, this means that a single write timeout or disconnect will # immediately close all pending streams. Without requiring multiple # sequential timeouts.) # 2. Mark the connection as errored, so that we don't accept any other # incoming requests. self._write_exception = exc self._connection_error = True raise exc # Flow control... async def _wait_for_outgoing_flow(self, request: Request, stream_id: int) -> int: """ Returns the maximum allowable outgoing flow for a given stream. If the allowable flow is zero, then waits on the network until WindowUpdated frames have increased the flow rate. https://tools.ietf.org/html/rfc7540#section-6.9 """ local_flow: int = self._h2_state.local_flow_control_window(stream_id) max_frame_size: int = self._h2_state.max_outbound_frame_size flow = min(local_flow, max_frame_size) while flow <= 0: await self._receive_events(request) local_flow = self._h2_state.local_flow_control_window(stream_id) max_frame_size = self._h2_state.max_outbound_frame_size flow = min(local_flow, max_frame_size) return flow # Interface for connection pooling... def can_handle_request(self, origin: Origin) -> bool: return origin == self._origin def is_available(self) -> bool: return ( self._state != HTTPConnectionState.CLOSED and not self._connection_error and not self._used_all_stream_ids and not (self._h2_state.state_machine.state == h2.connection.ConnectionState.CLOSED) ) def has_expired(self) -> bool: now = time.monotonic() return self._expire_at is not None and now > self._expire_at def is_idle(self) -> bool: return self._state == HTTPConnectionState.IDLE def is_closed(self) -> bool: return self._state == HTTPConnectionState.CLOSED def info(self) -> str: origin = str(self._origin) return f"{origin!r}, HTTP/2, {self._state.name}, Request Count: {self._request_count}" def __repr__(self) -> str: class_name = self.__class__.__name__ origin = str(self._origin) return f"<{class_name} [{origin!r}, {self._state.name}, Request Count: {self._request_count}]>" # These context managers are not used in the standard flow, but are # useful for testing or working with connection instances directly. async def __aenter__(self) -> AsyncHTTP2Connection: return self async def __aexit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: await self.aclose() class HTTP2ConnectionByteStream: def __init__(self, connection: AsyncHTTP2Connection, request: Request, stream_id: int) -> None: self._connection = connection self._request = request self._stream_id = stream_id self._closed = False async def __aiter__(self) -> AsyncGenerator[bytes]: kwargs = {"request": self._request, "stream_id": self._stream_id} try: async with Trace("receive_response_body", logger, self._request, kwargs): async with safe_async_iterate( self._connection._receive_response_body(request=self._request, stream_id=self._stream_id) ) as iterator: async for chunk in iterator: yield chunk except BaseException as exc: # If we get an exception while streaming the response, # we want to close the response (and possibly the connection) # before raising that exception. with AsyncShieldCancellation(): await self.aclose() raise exc async def aclose(self) -> None: if not self._closed: self._closed = True kwargs = {"stream_id": self._stream_id} async with Trace("response_closed", logger, self._request, kwargs): await self._connection._response_closed(stream_id=self._stream_id) pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_async/http_proxy.py000066400000000000000000000340151521723372100257550ustar00rootroot00000000000000from __future__ import annotations import base64 import logging import ssl import typing from .._backends.base import SOCKET_OPTION, AsyncNetworkBackend from .._exceptions import ProxyError from .._models import ( URL, Origin, Request, Response, enforce_bytes, enforce_headers, enforce_url, ) from .._ssl import default_ssl_context from .._synchronization import AsyncLock from .._trace import Trace from .connection import AsyncHTTPConnection from .connection_pool import AsyncConnectionPool from .http11 import AsyncHTTP11Connection from .interfaces import AsyncConnectionInterface ByteOrStr = bytes | str HeadersAsSequence = typing.Sequence[tuple[ByteOrStr, ByteOrStr]] HeadersAsMapping = typing.Mapping[ByteOrStr, ByteOrStr] logger = logging.getLogger("httpcore2.proxy") def merge_headers( default_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, override_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, ) -> list[tuple[bytes, bytes]]: """ Append default_headers and override_headers, de-duplicating if a key exists in both cases. """ default_headers = [] if default_headers is None else list(default_headers) override_headers = [] if override_headers is None else list(override_headers) has_override = set(key.lower() for key, _value in override_headers) default_headers = [(key, value) for key, value in default_headers if key.lower() not in has_override] return default_headers + override_headers class AsyncHTTPProxy(AsyncConnectionPool): # pragma: no cover """ A connection pool that sends requests via an HTTP proxy. """ def __init__( self, proxy_url: URL | bytes | str, proxy_auth: tuple[bytes | str, bytes | str] | None = None, proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, ssl_context: ssl.SSLContext | None = None, proxy_ssl_context: ssl.SSLContext | None = None, max_connections: int | None = 10, max_keepalive_connections: int | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, retries: int = 0, local_address: str | None = None, uds: str | None = None, network_backend: AsyncNetworkBackend | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> None: """ A connection pool for making HTTP requests. Parameters: proxy_url: The URL to use when connecting to the proxy server. For example `"http://127.0.0.1:8080/"`. proxy_auth: Any proxy authentication as a two-tuple of (username, password). May be either bytes or ascii-only str. proxy_headers: Any HTTP headers to use for the proxy requests. For example `{"Proxy-Authorization": "Basic :"}`. ssl_context: An SSL context to use for verifying connections. If not specified, the default `httpcore2.default_ssl_context()` will be used. proxy_ssl_context: The same as `ssl_context`, but for a proxy server rather than a remote origin. max_connections: The maximum number of concurrent HTTP connections that the pool should allow. Any attempt to send a request on a pool that would exceed this amount will block until a connection is available. max_keepalive_connections: The maximum number of idle HTTP connections that will be maintained in the pool. keepalive_expiry: The duration in seconds that an idle HTTP connection may be maintained for before being expired from the pool. http1: A boolean indicating if HTTP/1.1 requests should be supported by the connection pool. Defaults to True. http2: A boolean indicating if HTTP/2 requests should be supported by the connection pool. Defaults to False. retries: The maximum number of retries when trying to establish a connection. local_address: Local address to connect from. Can also be used to connect using a particular address family. Using `local_address="0.0.0.0"` will connect using an `AF_INET` address (IPv4), while using `local_address="::"` will connect using an `AF_INET6` address (IPv6). uds: Path to a Unix Domain Socket to use instead of TCP sockets. network_backend: A backend instance to use for handling network I/O. """ super().__init__( ssl_context=ssl_context, max_connections=max_connections, max_keepalive_connections=max_keepalive_connections, keepalive_expiry=keepalive_expiry, http1=http1, http2=http2, network_backend=network_backend, retries=retries, local_address=local_address, uds=uds, socket_options=socket_options, ) self._proxy_url = enforce_url(proxy_url, name="proxy_url") if self._proxy_url.scheme == b"http" and proxy_ssl_context is not None: # pragma: no cover raise RuntimeError("The `proxy_ssl_context` argument is not allowed for the http scheme") self._ssl_context = ssl_context self._proxy_ssl_context = proxy_ssl_context self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") if proxy_auth is not None: username = enforce_bytes(proxy_auth[0], name="proxy_auth") password = enforce_bytes(proxy_auth[1], name="proxy_auth") userpass = username + b":" + password authorization = b"Basic " + base64.b64encode(userpass) self._proxy_headers = [(b"Proxy-Authorization", authorization)] + self._proxy_headers def create_connection(self, origin: Origin) -> AsyncConnectionInterface: if origin.scheme == b"http": return AsyncForwardHTTPConnection( proxy_origin=self._proxy_url.origin, proxy_headers=self._proxy_headers, remote_origin=origin, keepalive_expiry=self._keepalive_expiry, network_backend=self._network_backend, proxy_ssl_context=self._proxy_ssl_context, ) return AsyncTunnelHTTPConnection( proxy_origin=self._proxy_url.origin, proxy_headers=self._proxy_headers, remote_origin=origin, ssl_context=self._ssl_context, proxy_ssl_context=self._proxy_ssl_context, keepalive_expiry=self._keepalive_expiry, http1=self._http1, http2=self._http2, network_backend=self._network_backend, ) class AsyncForwardHTTPConnection(AsyncConnectionInterface): def __init__( self, proxy_origin: Origin, remote_origin: Origin, proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, keepalive_expiry: float | None = None, network_backend: AsyncNetworkBackend | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, proxy_ssl_context: ssl.SSLContext | None = None, ) -> None: self._connection = AsyncHTTPConnection( origin=proxy_origin, keepalive_expiry=keepalive_expiry, network_backend=network_backend, socket_options=socket_options, ssl_context=proxy_ssl_context, ) self._proxy_origin = proxy_origin self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") self._remote_origin = remote_origin async def handle_async_request(self, request: Request) -> Response: headers = merge_headers(self._proxy_headers, request.headers) url = URL( scheme=self._proxy_origin.scheme, host=self._proxy_origin.host, port=self._proxy_origin.port, target=bytes(request.url), ) proxy_request = Request( method=request.method, url=url, headers=headers, content=request.stream, extensions=request.extensions, ) return await self._connection.handle_async_request(proxy_request) def can_handle_request(self, origin: Origin) -> bool: return origin == self._remote_origin async def aclose(self) -> None: await self._connection.aclose() def info(self) -> str: return self._connection.info() def is_available(self) -> bool: return self._connection.is_available() def has_expired(self) -> bool: return self._connection.has_expired() def is_idle(self) -> bool: return self._connection.is_idle() def is_closed(self) -> bool: return self._connection.is_closed() def __repr__(self) -> str: return f"<{self.__class__.__name__} [{self.info()}]>" class AsyncTunnelHTTPConnection(AsyncConnectionInterface): def __init__( self, proxy_origin: Origin, remote_origin: Origin, ssl_context: ssl.SSLContext | None = None, proxy_ssl_context: ssl.SSLContext | None = None, proxy_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, network_backend: AsyncNetworkBackend | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> None: self._connection: AsyncConnectionInterface = AsyncHTTPConnection( origin=proxy_origin, keepalive_expiry=keepalive_expiry, network_backend=network_backend, socket_options=socket_options, ssl_context=proxy_ssl_context, ) self._proxy_origin = proxy_origin self._remote_origin = remote_origin self._ssl_context = ssl_context self._proxy_ssl_context = proxy_ssl_context self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") self._keepalive_expiry = keepalive_expiry self._http1 = http1 self._http2 = http2 self._connect_lock = AsyncLock() self._connected = False async def handle_async_request(self, request: Request) -> Response: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("connect", None) async with self._connect_lock: if not self._connected: target = b"%b:%d" % (self._remote_origin.host, self._remote_origin.port) connect_url = URL( scheme=self._proxy_origin.scheme, host=self._proxy_origin.host, port=self._proxy_origin.port, target=target, ) connect_headers = merge_headers([(b"Host", target), (b"Accept", b"*/*")], self._proxy_headers) connect_request = Request( method=b"CONNECT", url=connect_url, headers=connect_headers, extensions=request.extensions, ) connect_response = await self._connection.handle_async_request(connect_request) if connect_response.status < 200 or connect_response.status > 299: reason_bytes = connect_response.extensions.get("reason_phrase", b"") reason_str = reason_bytes.decode("ascii", errors="ignore") msg = f"{connect_response.status} {reason_str}" await self._connection.aclose() raise ProxyError(msg) stream = connect_response.extensions["network_stream"] # Upgrade the stream to SSL ssl_context = default_ssl_context() if self._ssl_context is None else self._ssl_context alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] ssl_context.set_alpn_protocols(alpn_protocols) kwargs = { "ssl_context": ssl_context, "server_hostname": self._remote_origin.host.decode("ascii"), "timeout": timeout, } async with Trace("start_tls", logger, request, kwargs) as trace: stream = await stream.start_tls(**kwargs) trace.return_value = stream # Determine if we should be using HTTP/1.1 or HTTP/2 ssl_object = stream.get_extra_info("ssl_object") http2_negotiated = ssl_object is not None and ssl_object.selected_alpn_protocol() == "h2" # Create the HTTP/1.1 or HTTP/2 connection if http2_negotiated or (self._http2 and not self._http1): from .http2 import AsyncHTTP2Connection self._connection = AsyncHTTP2Connection( origin=self._remote_origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) else: self._connection = AsyncHTTP11Connection( origin=self._remote_origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) self._connected = True return await self._connection.handle_async_request(request) def can_handle_request(self, origin: Origin) -> bool: return origin == self._remote_origin async def aclose(self) -> None: await self._connection.aclose() def info(self) -> str: return self._connection.info() def is_available(self) -> bool: return self._connection.is_available() def has_expired(self) -> bool: return self._connection.has_expired() def is_idle(self) -> bool: return self._connection.is_idle() def is_closed(self) -> bool: return self._connection.is_closed() def __repr__(self) -> str: return f"<{self.__class__.__name__} [{self.info()}]>" pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_async/interfaces.py000066400000000000000000000106241521723372100256600ustar00rootroot00000000000000from __future__ import annotations import contextlib import typing from collections.abc import AsyncGenerator from .._models import ( URL, Extensions, HeaderTypes, Origin, Request, Response, enforce_bytes, enforce_headers, enforce_url, include_request_headers, ) class AsyncRequestInterface: async def request( self, method: bytes | str, url: URL | bytes | str, *, headers: HeaderTypes = None, content: bytes | typing.AsyncIterator[bytes] | None = None, extensions: Extensions | None = None, ) -> Response: # Strict type checking on our parameters. method = enforce_bytes(method, name="method") url = enforce_url(url, name="url") headers = enforce_headers(headers, name="headers") # Include Host header, and optionally Content-Length or Transfer-Encoding. headers = include_request_headers(headers, url=url, content=content) request = Request( method=method, url=url, headers=headers, content=content, extensions=extensions, ) response = await self.handle_async_request(request) try: await response.aread() finally: await response.aclose() return response @contextlib.asynccontextmanager async def stream( self, method: bytes | str, url: URL | bytes | str, *, headers: HeaderTypes = None, content: bytes | typing.AsyncIterator[bytes] | None = None, extensions: Extensions | None = None, ) -> AsyncGenerator[Response]: # Strict type checking on our parameters. method = enforce_bytes(method, name="method") url = enforce_url(url, name="url") headers = enforce_headers(headers, name="headers") # Include Host header, and optionally Content-Length or Transfer-Encoding. headers = include_request_headers(headers, url=url, content=content) request = Request( method=method, url=url, headers=headers, content=content, extensions=extensions, ) response = await self.handle_async_request(request) try: yield response finally: await response.aclose() async def handle_async_request(self, request: Request) -> Response: raise NotImplementedError() # pragma: no cover class AsyncConnectionInterface(AsyncRequestInterface): async def aclose(self) -> None: raise NotImplementedError() # pragma: no cover def info(self) -> str: raise NotImplementedError() # pragma: no cover def can_handle_request(self, origin: Origin) -> bool: raise NotImplementedError() # pragma: no cover def is_available(self) -> bool: """ Return `True` if the connection is currently able to accept an outgoing request. An HTTP/1.1 connection will only be available if it is currently idle. An HTTP/2 connection will be available so long as the stream ID space is not yet exhausted, and the connection is not in an error state. While the connection is being established we may not yet know if it is going to result in an HTTP/1.1 or HTTP/2 connection. The connection should be treated as being available, but might ultimately raise `NewConnectionRequired` required exceptions if multiple requests are attempted over a connection that ends up being established as HTTP/1.1. """ raise NotImplementedError() # pragma: no cover def has_expired(self) -> bool: """ Return `True` if the connection is in a state where it should be closed. This either means that the connection is idle and it has passed the expiry time on its keep-alive, or that server has sent an EOF. """ raise NotImplementedError() # pragma: no cover def is_idle(self) -> bool: """ Return `True` if the connection is currently idle. """ raise NotImplementedError() # pragma: no cover def is_closed(self) -> bool: """ Return `True` if the connection has been closed. Used when a response is closed to determine if the connection may be returned to the connection pool or not. """ raise NotImplementedError() # pragma: no cover pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_async/socks_proxy.py000066400000000000000000000326471521723372100261310ustar00rootroot00000000000000from __future__ import annotations import logging import ssl import socksio from .._backends.auto import AutoBackend from .._backends.base import AsyncNetworkBackend, AsyncNetworkStream from .._exceptions import ConnectionNotAvailable, ProxyError from .._models import URL, Origin, Request, Response, enforce_bytes, enforce_url from .._ssl import default_ssl_context from .._synchronization import AsyncLock from .._trace import Trace from .connection_pool import AsyncConnectionPool from .http11 import AsyncHTTP11Connection from .interfaces import AsyncConnectionInterface logger = logging.getLogger("httpcore2.socks") AUTH_METHODS = { b"\x00": "NO AUTHENTICATION REQUIRED", b"\x01": "GSSAPI", b"\x02": "USERNAME/PASSWORD", b"\xff": "NO ACCEPTABLE METHODS", } REPLY_CODES = { b"\x00": "Succeeded", b"\x01": "General SOCKS server failure", b"\x02": "Connection not allowed by ruleset", b"\x03": "Network unreachable", b"\x04": "Host unreachable", b"\x05": "Connection refused", b"\x06": "TTL expired", b"\x07": "Command not supported", b"\x08": "Address type not supported", } async def _init_socks5_connection( stream: AsyncNetworkStream, *, host: bytes, port: int, auth: tuple[bytes, bytes] | None = None, timeouts: dict[str, float | None] | None = None, ) -> None: timeouts = timeouts or {} write_timeout = timeouts.get("write", None) read_timeout = timeouts.get("read", None) conn = socksio.socks5.SOCKS5Connection() # Auth method request auth_method = ( socksio.socks5.SOCKS5AuthMethod.NO_AUTH_REQUIRED if auth is None else socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD ) conn.send(socksio.socks5.SOCKS5AuthMethodsRequest([auth_method])) outgoing_bytes = conn.data_to_send() await stream.write(outgoing_bytes, timeout=write_timeout) # Auth method response incoming_bytes = await stream.read(max_bytes=4096, timeout=read_timeout) response = conn.receive_data(incoming_bytes) assert isinstance(response, socksio.socks5.SOCKS5AuthReply) if response.method != auth_method: requested = AUTH_METHODS.get(auth_method, "UNKNOWN") responded = AUTH_METHODS.get(response.method, "UNKNOWN") raise ProxyError(f"Requested {requested} from proxy server, but got {responded}.") if response.method == socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD: # Username/password request assert auth is not None username, password = auth conn.send(socksio.socks5.SOCKS5UsernamePasswordRequest(username, password)) outgoing_bytes = conn.data_to_send() await stream.write(outgoing_bytes, timeout=write_timeout) # Username/password response incoming_bytes = await stream.read(max_bytes=4096, timeout=read_timeout) response = conn.receive_data(incoming_bytes) assert isinstance(response, socksio.socks5.SOCKS5UsernamePasswordReply) if not response.success: raise ProxyError("Invalid username/password") # Connect request conn.send(socksio.socks5.SOCKS5CommandRequest.from_address(socksio.socks5.SOCKS5Command.CONNECT, (host, port))) outgoing_bytes = conn.data_to_send() await stream.write(outgoing_bytes, timeout=write_timeout) # Connect response incoming_bytes = await stream.read(max_bytes=4096, timeout=read_timeout) response = conn.receive_data(incoming_bytes) assert isinstance(response, socksio.socks5.SOCKS5Reply) if response.reply_code != socksio.socks5.SOCKS5ReplyCode.SUCCEEDED: reply_code = REPLY_CODES.get(response.reply_code, "UNKOWN") raise ProxyError(f"Proxy Server could not connect: {reply_code}.") class AsyncSOCKSProxy(AsyncConnectionPool): # pragma: no cover """ A connection pool that sends requests via an HTTP proxy. """ def __init__( self, proxy_url: URL | bytes | str, proxy_auth: tuple[bytes | str, bytes | str] | None = None, ssl_context: ssl.SSLContext | None = None, max_connections: int | None = 10, max_keepalive_connections: int | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, retries: int = 0, network_backend: AsyncNetworkBackend | None = None, ) -> None: """ A connection pool for making HTTP requests. Parameters: proxy_url: The URL to use when connecting to the proxy server. For example `"http://127.0.0.1:8080/"`. ssl_context: An SSL context to use for verifying connections. If not specified, the default `httpcore2.default_ssl_context()` will be used. max_connections: The maximum number of concurrent HTTP connections that the pool should allow. Any attempt to send a request on a pool that would exceed this amount will block until a connection is available. max_keepalive_connections: The maximum number of idle HTTP connections that will be maintained in the pool. keepalive_expiry: The duration in seconds that an idle HTTP connection may be maintained for before being expired from the pool. http1: A boolean indicating if HTTP/1.1 requests should be supported by the connection pool. Defaults to True. http2: A boolean indicating if HTTP/2 requests should be supported by the connection pool. Defaults to False. retries: The maximum number of retries when trying to establish a connection. local_address: Local address to connect from. Can also be used to connect using a particular address family. Using `local_address="0.0.0.0"` will connect using an `AF_INET` address (IPv4), while using `local_address="::"` will connect using an `AF_INET6` address (IPv6). uds: Path to a Unix Domain Socket to use instead of TCP sockets. network_backend: A backend instance to use for handling network I/O. """ super().__init__( ssl_context=ssl_context, max_connections=max_connections, max_keepalive_connections=max_keepalive_connections, keepalive_expiry=keepalive_expiry, http1=http1, http2=http2, network_backend=network_backend, retries=retries, ) self._ssl_context = ssl_context self._proxy_url = enforce_url(proxy_url, name="proxy_url") if proxy_auth is not None: username, password = proxy_auth username_bytes = enforce_bytes(username, name="proxy_auth") password_bytes = enforce_bytes(password, name="proxy_auth") self._proxy_auth: tuple[bytes, bytes] | None = ( username_bytes, password_bytes, ) else: self._proxy_auth = None def create_connection(self, origin: Origin) -> AsyncConnectionInterface: return AsyncSocks5Connection( proxy_origin=self._proxy_url.origin, remote_origin=origin, proxy_auth=self._proxy_auth, ssl_context=self._ssl_context, keepalive_expiry=self._keepalive_expiry, http1=self._http1, http2=self._http2, network_backend=self._network_backend, ) class AsyncSocks5Connection(AsyncConnectionInterface): def __init__( self, proxy_origin: Origin, remote_origin: Origin, proxy_auth: tuple[bytes, bytes] | None = None, ssl_context: ssl.SSLContext | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, network_backend: AsyncNetworkBackend | None = None, ) -> None: self._proxy_origin = proxy_origin self._remote_origin = remote_origin self._proxy_auth = proxy_auth self._ssl_context = ssl_context self._keepalive_expiry = keepalive_expiry self._http1 = http1 self._http2 = http2 self._network_backend: AsyncNetworkBackend = AutoBackend() if network_backend is None else network_backend self._connect_lock = AsyncLock() self._connection: AsyncConnectionInterface | None = None self._connect_failed = False async def handle_async_request(self, request: Request) -> Response: timeouts = request.extensions.get("timeout", {}) sni_hostname = request.extensions.get("sni_hostname", None) timeout = timeouts.get("connect", None) async with self._connect_lock: if self._connection is None: try: # Connect to the proxy kwargs = { "host": self._proxy_origin.host.decode("ascii"), "port": self._proxy_origin.port, "timeout": timeout, } async with Trace("connect_tcp", logger, request, kwargs) as trace: stream = await self._network_backend.connect_tcp(**kwargs) trace.return_value = stream # Connect to the remote host using socks5 kwargs = { "stream": stream, "host": self._remote_origin.host.decode("ascii"), "port": self._remote_origin.port, "auth": self._proxy_auth, "timeouts": timeouts, } async with Trace("setup_socks5_connection", logger, request, kwargs) as trace: await _init_socks5_connection(**kwargs) trace.return_value = stream # Upgrade the stream to SSL if self._remote_origin.scheme == b"https": ssl_context = default_ssl_context() if self._ssl_context is None else self._ssl_context alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] ssl_context.set_alpn_protocols(alpn_protocols) kwargs = { "ssl_context": ssl_context, "server_hostname": sni_hostname or self._remote_origin.host.decode("ascii"), "timeout": timeout, } async with Trace("start_tls", logger, request, kwargs) as trace: stream = await stream.start_tls(**kwargs) trace.return_value = stream # Determine if we should be using HTTP/1.1 or HTTP/2 ssl_object = stream.get_extra_info("ssl_object") http2_negotiated = ssl_object is not None and ssl_object.selected_alpn_protocol() == "h2" # Create the HTTP/1.1 or HTTP/2 connection if http2_negotiated or (self._http2 and not self._http1): # pragma: no cover from .http2 import AsyncHTTP2Connection self._connection = AsyncHTTP2Connection( origin=self._remote_origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) else: self._connection = AsyncHTTP11Connection( origin=self._remote_origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) except Exception as exc: self._connect_failed = True raise exc elif not self._connection.is_available(): # pragma: no cover raise ConnectionNotAvailable() return await self._connection.handle_async_request(request) def can_handle_request(self, origin: Origin) -> bool: return origin == self._remote_origin async def aclose(self) -> None: if self._connection is not None: await self._connection.aclose() def is_available(self) -> bool: if self._connection is None: # pragma: no cover # If HTTP/2 support is enabled, and the resulting connection could # end up as HTTP/2 then we should indicate the connection as being # available to service multiple requests. return ( self._http2 and (self._remote_origin.scheme == b"https" or not self._http1) and not self._connect_failed ) return self._connection.is_available() def has_expired(self) -> bool: if self._connection is None: # pragma: no cover return self._connect_failed return self._connection.has_expired() def is_idle(self) -> bool: if self._connection is None: # pragma: no cover return self._connect_failed return self._connection.is_idle() def is_closed(self) -> bool: if self._connection is None: # pragma: no cover return self._connect_failed return self._connection.is_closed() def info(self) -> str: if self._connection is None: # pragma: no cover return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" return self._connection.info() def __repr__(self) -> str: return f"<{self.__class__.__name__} [{self.info()}]>" pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_backends/000077500000000000000000000000001521723372100236155ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_backends/__init__.py000066400000000000000000000000001521723372100257140ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_backends/anyio.py000066400000000000000000000125731521723372100253160ustar00rootroot00000000000000from __future__ import annotations import ssl import typing import anyio import anyio.abc import anyio.streams.tls from .._exceptions import ( ConnectError, ConnectTimeout, ReadError, ReadTimeout, WriteError, WriteTimeout, map_exceptions, ) from .._utils import is_socket_readable from .base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream class AnyIOStream(AsyncNetworkStream): def __init__(self, stream: anyio.abc.ByteStream) -> None: self._stream = stream async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: exc_map: dict[type[Exception], type[Exception]] = { TimeoutError: ReadTimeout, anyio.BrokenResourceError: ReadError, anyio.ClosedResourceError: ReadError, anyio.EndOfStream: ReadError, } with map_exceptions(exc_map): with anyio.fail_after(timeout): try: return await self._stream.receive(max_bytes=max_bytes) except anyio.EndOfStream: # pragma: no cover return b"" async def write(self, buffer: bytes, timeout: float | None = None) -> None: if not buffer: return exc_map: dict[type[Exception], type[Exception]] = { TimeoutError: WriteTimeout, anyio.BrokenResourceError: WriteError, anyio.ClosedResourceError: WriteError, } with map_exceptions(exc_map): with anyio.fail_after(timeout): await self._stream.send(item=buffer) async def aclose(self) -> None: await self._stream.aclose() async def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> AsyncNetworkStream: exc_map: dict[type[Exception], type[Exception]] = { TimeoutError: ConnectTimeout, anyio.BrokenResourceError: ConnectError, anyio.EndOfStream: ConnectError, ssl.SSLError: ConnectError, } with map_exceptions(exc_map): try: with anyio.fail_after(timeout): ssl_stream = await anyio.streams.tls.TLSStream.wrap( self._stream, ssl_context=ssl_context, hostname=server_hostname, standard_compatible=False, server_side=False, ) except Exception as exc: # pragma: no cover await self.aclose() raise exc return AnyIOStream(ssl_stream) def get_extra_info(self, info: str) -> typing.Any: if info == "ssl_object": return self._stream.extra(anyio.streams.tls.TLSAttribute.ssl_object, None) if info == "client_addr": return self._stream.extra(anyio.abc.SocketAttribute.local_address, None) if info == "server_addr": return self._stream.extra(anyio.abc.SocketAttribute.remote_address, None) if info == "socket": return self._stream.extra(anyio.abc.SocketAttribute.raw_socket, None) if info == "is_readable": sock = self._stream.extra(anyio.abc.SocketAttribute.raw_socket, None) return is_socket_readable(sock) return None class AnyIOBackend(AsyncNetworkBackend): async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: # pragma: no cover if socket_options is None: socket_options = [] exc_map: dict[type[Exception], type[Exception]] = { TimeoutError: ConnectTimeout, OSError: ConnectError, anyio.BrokenResourceError: ConnectError, } with map_exceptions(exc_map): with anyio.fail_after(timeout): stream: anyio.abc.ByteStream = await anyio.connect_tcp( remote_host=host, remote_port=port, local_host=local_address, ) # By default TCP sockets opened in `asyncio` include TCP_NODELAY. for option in socket_options: stream._raw_socket.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover return AnyIOStream(stream) async def connect_unix_socket( self, path: str, timeout: float | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: # pragma: no cover if socket_options is None: socket_options = [] exc_map: dict[type[Exception], type[Exception]] = { TimeoutError: ConnectTimeout, OSError: ConnectError, anyio.BrokenResourceError: ConnectError, } with map_exceptions(exc_map): with anyio.fail_after(timeout): stream: anyio.abc.ByteStream = await anyio.connect_unix(path) for option in socket_options: stream._raw_socket.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover return AnyIOStream(stream) async def sleep(self, seconds: float) -> None: await anyio.sleep(seconds) # pragma: no cover pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_backends/auto.py000066400000000000000000000031521521723372100251400ustar00rootroot00000000000000from __future__ import annotations import typing from .._synchronization import current_async_library from .base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream class AutoBackend(AsyncNetworkBackend): async def _init_backend(self) -> None: if not (hasattr(self, "_backend")): backend = current_async_library() if backend == "trio": from .trio import TrioBackend self._backend: AsyncNetworkBackend = TrioBackend() else: from .anyio import AnyIOBackend self._backend = AnyIOBackend() async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: await self._init_backend() return await self._backend.connect_tcp( host, port, timeout=timeout, local_address=local_address, socket_options=socket_options, ) async def connect_unix_socket( self, path: str, timeout: float | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: # pragma: no cover await self._init_backend() return await self._backend.connect_unix_socket(path, timeout=timeout, socket_options=socket_options) async def sleep(self, seconds: float) -> None: # pragma: no cover await self._init_backend() return await self._backend.sleep(seconds) pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_backends/base.py000066400000000000000000000056651521723372100251150ustar00rootroot00000000000000from __future__ import annotations import ssl import time import typing SOCKET_OPTION = tuple[int, int, int] | tuple[int, int, bytes | bytearray] | tuple[int, int, None, int] class NetworkStream: def read(self, max_bytes: int, timeout: float | None = None) -> bytes: raise NotImplementedError() # pragma: no cover def write(self, buffer: bytes, timeout: float | None = None) -> None: raise NotImplementedError() # pragma: no cover def close(self) -> None: raise NotImplementedError() # pragma: no cover def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> NetworkStream: raise NotImplementedError() # pragma: no cover def get_extra_info(self, info: str) -> typing.Any: return None # pragma: no cover class NetworkBackend: def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> NetworkStream: raise NotImplementedError() # pragma: no cover def connect_unix_socket( self, path: str, timeout: float | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> NetworkStream: raise NotImplementedError() # pragma: no cover def sleep(self, seconds: float) -> None: time.sleep(seconds) # pragma: no cover class AsyncNetworkStream: async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: raise NotImplementedError() # pragma: no cover async def write(self, buffer: bytes, timeout: float | None = None) -> None: raise NotImplementedError() # pragma: no cover async def aclose(self) -> None: raise NotImplementedError() # pragma: no cover async def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> AsyncNetworkStream: raise NotImplementedError() # pragma: no cover def get_extra_info(self, info: str) -> typing.Any: return None # pragma: no cover class AsyncNetworkBackend: async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: raise NotImplementedError() # pragma: no cover async def connect_unix_socket( self, path: str, timeout: float | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: raise NotImplementedError() # pragma: no cover async def sleep(self, seconds: float) -> None: raise NotImplementedError() # pragma: no cover pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_backends/mock.py000066400000000000000000000077571521723372100251400ustar00rootroot00000000000000from __future__ import annotations import ssl import typing from .._exceptions import ReadError from .base import ( SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream, NetworkBackend, NetworkStream, ) class MockSSLObject: def __init__(self, http2: bool): self._http2 = http2 def selected_alpn_protocol(self) -> str: return "h2" if self._http2 else "http/1.1" class MockStream(NetworkStream): def __init__(self, buffer: list[bytes], http2: bool = False) -> None: self._buffer = buffer self._http2 = http2 self._closed = False def read(self, max_bytes: int, timeout: float | None = None) -> bytes: if self._closed: raise ReadError("Connection closed") if not self._buffer: return b"" return self._buffer.pop(0) def write(self, buffer: bytes, timeout: float | None = None) -> None: pass def close(self) -> None: self._closed = True def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> NetworkStream: return self def get_extra_info(self, info: str) -> typing.Any: return MockSSLObject(http2=self._http2) if info == "ssl_object" else None def __repr__(self) -> str: return "" class MockBackend(NetworkBackend): def __init__(self, buffer: list[bytes], http2: bool = False) -> None: self._buffer = buffer self._http2 = http2 def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> NetworkStream: return MockStream(list(self._buffer), http2=self._http2) def connect_unix_socket( self, path: str, timeout: float | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> NetworkStream: return MockStream(list(self._buffer), http2=self._http2) def sleep(self, seconds: float) -> None: pass class AsyncMockStream(AsyncNetworkStream): def __init__(self, buffer: list[bytes], http2: bool = False) -> None: self._buffer = buffer self._http2 = http2 self._closed = False async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: if self._closed: raise ReadError("Connection closed") if not self._buffer: return b"" return self._buffer.pop(0) async def write(self, buffer: bytes, timeout: float | None = None) -> None: pass async def aclose(self) -> None: self._closed = True async def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> AsyncNetworkStream: return self def get_extra_info(self, info: str) -> typing.Any: return MockSSLObject(http2=self._http2) if info == "ssl_object" else None def __repr__(self) -> str: return "" class AsyncMockBackend(AsyncNetworkBackend): def __init__(self, buffer: list[bytes], http2: bool = False) -> None: self._buffer = buffer self._http2 = http2 async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: return AsyncMockStream(list(self._buffer), http2=self._http2) async def connect_unix_socket( self, path: str, timeout: float | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: return AsyncMockStream(list(self._buffer), http2=self._http2) async def sleep(self, seconds: float) -> None: pass pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_backends/sync.py000066400000000000000000000174271521723372100251560ustar00rootroot00000000000000from __future__ import annotations import functools import socket import ssl import sys import typing from .._exceptions import ( ConnectError, ConnectTimeout, ExceptionMapping, ReadError, ReadTimeout, WriteError, WriteTimeout, map_exceptions, ) from .._utils import is_socket_readable from .base import SOCKET_OPTION, NetworkBackend, NetworkStream class TLSinTLSStream(NetworkStream): # pragma: no cover """ Because the standard `SSLContext.wrap_socket` method does not work for `SSLSocket` objects, we need this class to implement TLS stream using an underlying `SSLObject` instance in order to support TLS on top of TLS. """ # Defined in RFC 8449 TLS_RECORD_SIZE = 16384 def __init__( self, sock: socket.socket, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ): self._sock = sock self._incoming = ssl.MemoryBIO() self._outgoing = ssl.MemoryBIO() self.ssl_obj = ssl_context.wrap_bio( incoming=self._incoming, outgoing=self._outgoing, server_hostname=server_hostname, ) self._sock.settimeout(timeout) self._perform_io(self.ssl_obj.do_handshake) def _perform_io( self, func: typing.Callable[..., typing.Any], ) -> typing.Any: ret = None while True: errno = None try: ret = func() except (ssl.SSLWantReadError, ssl.SSLWantWriteError) as e: errno = e.errno self._sock.sendall(self._outgoing.read()) if errno == ssl.SSL_ERROR_WANT_READ: buf = self._sock.recv(self.TLS_RECORD_SIZE) if buf: self._incoming.write(buf) else: self._incoming.write_eof() if errno is None: return ret def read(self, max_bytes: int, timeout: float | None = None) -> bytes: exc_map: ExceptionMapping = {socket.timeout: ReadTimeout, OSError: ReadError} with map_exceptions(exc_map): self._sock.settimeout(timeout) return typing.cast(bytes, self._perform_io(functools.partial(self.ssl_obj.read, max_bytes))) def write(self, buffer: bytes, timeout: float | None = None) -> None: exc_map: ExceptionMapping = {socket.timeout: WriteTimeout, OSError: WriteError} with map_exceptions(exc_map): self._sock.settimeout(timeout) view = memoryview(buffer) # zero-copy slicing; avoids copies while view: nsent = self._perform_io(functools.partial(self.ssl_obj.write, view)) view = view[nsent:] def close(self) -> None: self._sock.close() def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> NetworkStream: raise NotImplementedError() def get_extra_info(self, info: str) -> typing.Any: if info == "ssl_object": return self.ssl_obj if info == "client_addr": return self._sock.getsockname() if info == "server_addr": return self._sock.getpeername() if info == "socket": return self._sock if info == "is_readable": return is_socket_readable(self._sock) return None class SyncStream(NetworkStream): def __init__(self, sock: socket.socket) -> None: self._sock = sock def read(self, max_bytes: int, timeout: float | None = None) -> bytes: exc_map: ExceptionMapping = {socket.timeout: ReadTimeout, OSError: ReadError} with map_exceptions(exc_map): self._sock.settimeout(timeout) return self._sock.recv(max_bytes) def write(self, buffer: bytes, timeout: float | None = None) -> None: if not buffer: return exc_map: ExceptionMapping = {socket.timeout: WriteTimeout, OSError: WriteError} with map_exceptions(exc_map): view = memoryview(buffer) # zero-copy slicing; avoids copies while view: self._sock.settimeout(timeout) n = self._sock.send(view) view = view[n:] def close(self) -> None: self._sock.close() def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> NetworkStream: exc_map: ExceptionMapping = { socket.timeout: ConnectTimeout, OSError: ConnectError, } with map_exceptions(exc_map): try: if isinstance(self._sock, ssl.SSLSocket): # pragma: no cover # If the underlying socket has already been upgraded # to the TLS layer (i.e. is an instance of SSLSocket), # we need some additional smarts to support TLS-in-TLS. return TLSinTLSStream(self._sock, ssl_context, server_hostname, timeout) else: self._sock.settimeout(timeout) sock = ssl_context.wrap_socket(self._sock, server_hostname=server_hostname) except Exception as exc: # pragma: no cover self.close() raise exc return SyncStream(sock) def get_extra_info(self, info: str) -> typing.Any: if info == "ssl_object" and isinstance(self._sock, ssl.SSLSocket): return self._sock._sslobj # type: ignore if info == "client_addr": return self._sock.getsockname() if info == "server_addr": return self._sock.getpeername() if info == "socket": return self._sock if info == "is_readable": return is_socket_readable(self._sock) return None class SyncBackend(NetworkBackend): def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> NetworkStream: # Note that we automatically include `TCP_NODELAY` # in addition to any other custom socket options. if socket_options is None: socket_options = [] # pragma: no cover address = (host, port) source_address = None if local_address is None else (local_address, 0) exc_map: ExceptionMapping = { socket.timeout: ConnectTimeout, OSError: ConnectError, } with map_exceptions(exc_map): sock = socket.create_connection( address, timeout, source_address=source_address, ) for option in socket_options: sock.setsockopt(*option) # pragma: no cover sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1) return SyncStream(sock) def connect_unix_socket( self, path: str, timeout: float | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> NetworkStream: # pragma: no cover if sys.platform == "win32": raise RuntimeError("Attempted to connect to a UNIX socket on a Windows system.") if socket_options is None: socket_options = [] exc_map: ExceptionMapping = { socket.timeout: ConnectTimeout, OSError: ConnectError, } with map_exceptions(exc_map): sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) for option in socket_options: sock.setsockopt(*option) sock.settimeout(timeout) sock.connect(path) return SyncStream(sock) pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_backends/trio.py000066400000000000000000000135111521723372100251450ustar00rootroot00000000000000from __future__ import annotations import ssl import typing import trio from .._exceptions import ( ConnectError, ConnectTimeout, ExceptionMapping, ReadError, ReadTimeout, WriteError, WriteTimeout, map_exceptions, ) from .base import SOCKET_OPTION, AsyncNetworkBackend, AsyncNetworkStream class TrioStream(AsyncNetworkStream): def __init__(self, stream: trio.abc.Stream) -> None: self._stream = stream async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: timeout_or_inf = float("inf") if timeout is None else timeout exc_map: ExceptionMapping = { trio.TooSlowError: ReadTimeout, trio.BrokenResourceError: ReadError, trio.ClosedResourceError: ReadError, } with map_exceptions(exc_map): with trio.fail_after(timeout_or_inf): data: bytes = await self._stream.receive_some(max_bytes=max_bytes) return data async def write(self, buffer: bytes, timeout: float | None = None) -> None: if not buffer: return timeout_or_inf = float("inf") if timeout is None else timeout exc_map: ExceptionMapping = { trio.TooSlowError: WriteTimeout, trio.BrokenResourceError: WriteError, trio.ClosedResourceError: WriteError, } with map_exceptions(exc_map): with trio.fail_after(timeout_or_inf): await self._stream.send_all(data=buffer) async def aclose(self) -> None: await self._stream.aclose() async def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> AsyncNetworkStream: timeout_or_inf = float("inf") if timeout is None else timeout exc_map: ExceptionMapping = { trio.TooSlowError: ConnectTimeout, trio.BrokenResourceError: ConnectError, } ssl_stream = trio.SSLStream( self._stream, ssl_context=ssl_context, server_hostname=server_hostname, https_compatible=True, server_side=False, ) with map_exceptions(exc_map): try: with trio.fail_after(timeout_or_inf): await ssl_stream.do_handshake() except Exception as exc: # pragma: no cover await self.aclose() raise exc return TrioStream(ssl_stream) def get_extra_info(self, info: str) -> typing.Any: if info == "ssl_object" and isinstance(self._stream, trio.SSLStream): # Type checkers cannot see `_ssl_object` attribute because trio._ssl.SSLStream uses __getattr__/__setattr__. # Tracked at https://github.com/python-trio/trio/issues/542 return self._stream._ssl_object # type: ignore[attr-defined] if info == "client_addr": return self._get_socket_stream().socket.getsockname() if info == "server_addr": return self._get_socket_stream().socket.getpeername() if info == "socket": stream = self._stream while isinstance(stream, trio.SSLStream): stream = stream.transport_stream assert isinstance(stream, trio.SocketStream) return stream.socket if info == "is_readable": socket = self.get_extra_info("socket") return socket.is_readable() return None def _get_socket_stream(self) -> trio.SocketStream: stream = self._stream while isinstance(stream, trio.SSLStream): stream = stream.transport_stream assert isinstance(stream, trio.SocketStream) return stream class TrioBackend(AsyncNetworkBackend): async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: # By default for TCP sockets, trio enables TCP_NODELAY. # https://trio.readthedocs.io/en/stable/reference-io.html#trio.SocketStream if socket_options is None: socket_options = [] # pragma: no cover timeout_or_inf = float("inf") if timeout is None else timeout exc_map: ExceptionMapping = { trio.TooSlowError: ConnectTimeout, trio.BrokenResourceError: ConnectError, OSError: ConnectError, } with map_exceptions(exc_map): with trio.fail_after(timeout_or_inf): stream: trio.abc.Stream = await trio.open_tcp_stream(host=host, port=port, local_address=local_address) for option in socket_options: stream.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover return TrioStream(stream) async def connect_unix_socket( self, path: str, timeout: float | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: # pragma: no cover if socket_options is None: socket_options = [] timeout_or_inf = float("inf") if timeout is None else timeout exc_map: ExceptionMapping = { trio.TooSlowError: ConnectTimeout, trio.BrokenResourceError: ConnectError, OSError: ConnectError, } with map_exceptions(exc_map): with trio.fail_after(timeout_or_inf): stream: trio.abc.Stream = await trio.open_unix_socket(path) for option in socket_options: stream.setsockopt(*option) # type: ignore[attr-defined] # pragma: no cover return TrioStream(stream) async def sleep(self, seconds: float) -> None: await trio.sleep(seconds) # pragma: no cover pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_exceptions.py000066400000000000000000000023271521723372100246020ustar00rootroot00000000000000from __future__ import annotations import contextlib import typing from collections.abc import Generator ExceptionMapping = typing.Mapping[type[Exception], type[Exception]] @contextlib.contextmanager def map_exceptions(map: ExceptionMapping) -> Generator[None]: try: yield except Exception as exc: # noqa: PIE786 for from_exc, to_exc in map.items(): if isinstance(exc, from_exc): raise to_exc(exc) from exc raise # pragma: no cover class ConnectionNotAvailable(Exception): pass class ProxyError(Exception): pass class UnsupportedProtocol(Exception): pass class ProtocolError(Exception): pass class RemoteProtocolError(ProtocolError): pass class LocalProtocolError(ProtocolError): pass # Timeout errors class TimeoutException(Exception): pass class PoolTimeout(TimeoutException): pass class ConnectTimeout(TimeoutException): pass class ReadTimeout(TimeoutException): pass class WriteTimeout(TimeoutException): pass # Network errors class NetworkError(Exception): pass class ConnectError(NetworkError): pass class ReadError(NetworkError): pass class WriteError(NetworkError): pass pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_models.py000066400000000000000000000420161521723372100237030ustar00rootroot00000000000000from __future__ import annotations import base64 import ssl import typing import urllib.parse from collections.abc import AsyncGenerator from ._utils import safe_async_iterate # Functions for typechecking... ByteOrStr = bytes | str HeadersAsSequence = typing.Sequence[tuple[ByteOrStr, ByteOrStr]] HeadersAsMapping = typing.Mapping[ByteOrStr, ByteOrStr] HeaderTypes = HeadersAsSequence | HeadersAsMapping | None Extensions = typing.MutableMapping[str, typing.Any] def enforce_bytes(value: bytes | str, *, name: str) -> bytes: """ Any arguments that are ultimately represented as bytes can be specified either as bytes or as strings. However we enforce that any string arguments must only contain characters in the plain ASCII range. chr(0)...chr(127). If you need to use characters outside that range then be precise, and use a byte-wise argument. """ if isinstance(value, str): try: return value.encode("ascii") except UnicodeEncodeError: raise TypeError(f"{name} strings may not include unicode characters.") elif isinstance(value, bytes): return value seen_type = type(value).__name__ raise TypeError(f"{name} must be bytes or str, but got {seen_type}.") def enforce_url(value: URL | bytes | str, *, name: str) -> URL: """ Type check for URL parameters. """ if isinstance(value, (bytes, str)): return URL(value) elif isinstance(value, URL): return value seen_type = type(value).__name__ raise TypeError(f"{name} must be a URL, bytes, or str, but got {seen_type}.") def enforce_headers( value: HeadersAsMapping | HeadersAsSequence | None = None, *, name: str ) -> list[tuple[bytes, bytes]]: """ Convenience function that ensure all items in request or response headers are either bytes or strings in the plain ASCII range. """ if value is None: return [] elif isinstance(value, typing.Mapping): return [ ( enforce_bytes(k, name="header name"), enforce_bytes(v, name="header value"), ) for k, v in value.items() ] elif isinstance(value, typing.Sequence): return [ ( enforce_bytes(k, name="header name"), enforce_bytes(v, name="header value"), ) for k, v in value ] seen_type = type(value).__name__ raise TypeError(f"{name} must be a mapping or sequence of two-tuples, but got {seen_type}.") def enforce_stream( value: bytes | typing.Iterable[bytes] | typing.AsyncIterable[bytes] | None, *, name: str, ) -> typing.Iterable[bytes] | typing.AsyncIterable[bytes]: if value is None: return ByteStream(b"") elif isinstance(value, bytes): return ByteStream(value) return value # * https://tools.ietf.org/html/rfc3986#section-3.2.3 # * https://url.spec.whatwg.org/#url-miscellaneous # * https://url.spec.whatwg.org/#scheme-state DEFAULT_PORTS = { b"ftp": 21, b"http": 80, b"https": 443, b"ws": 80, b"wss": 443, } def include_request_headers( headers: list[tuple[bytes, bytes]], *, url: URL, content: None | bytes | typing.Iterable[bytes] | typing.AsyncIterable[bytes], ) -> list[tuple[bytes, bytes]]: headers_set = {k.lower() for k, _v in headers} if b"host" not in headers_set: default_port = DEFAULT_PORTS.get(url.scheme) if url.port is None or url.port == default_port: header_value = url.host else: header_value = b"%b:%d" % (url.host, url.port) headers = [(b"Host", header_value)] + headers if content is not None and b"content-length" not in headers_set and b"transfer-encoding" not in headers_set: if isinstance(content, bytes): content_length = str(len(content)).encode("ascii") headers += [(b"Content-Length", content_length)] else: headers += [(b"Transfer-Encoding", b"chunked")] # pragma: no cover return headers # Interfaces for byte streams... class ByteStream: """ A container for non-streaming content, and that supports both sync and async stream iteration. """ def __init__(self, content: bytes) -> None: self._content = content def __iter__(self) -> typing.Iterator[bytes]: yield self._content async def __aiter__(self) -> AsyncGenerator[bytes]: yield self._content def __repr__(self) -> str: return f"<{self.__class__.__name__} [{len(self._content)} bytes]>" class Origin: def __init__(self, scheme: bytes, host: bytes, port: int) -> None: self.scheme = scheme self.host = host self.port = port def __eq__(self, other: typing.Any) -> bool: return ( isinstance(other, Origin) and self.scheme == other.scheme and self.host == other.host and self.port == other.port ) def __str__(self) -> str: scheme = self.scheme.decode("ascii") host = self.host.decode("ascii") port = str(self.port) return f"{scheme}://{host}:{port}" class URL: """ Represents the URL against which an HTTP request may be made. The URL may either be specified as a plain string, for convenience: ```python url = httpcore2.URL("https://www.example.com/") ``` Or be constructed with explicitly pre-parsed components: ```python url = httpcore2.URL(scheme=b'https', host=b'www.example.com', port=None, target=b'/') ``` Using this second more explicit style allows integrations that are using `httpcore` to pass through URLs that have already been parsed in order to use libraries such as `rfc-3986` rather than relying on the stdlib. It also ensures that URL parsing is treated identically at both the networking level and at any higher layers of abstraction. The four components are important here, as they allow the URL to be precisely specified in a pre-parsed format. They also allow certain types of request to be created that could not otherwise be expressed. For example, an HTTP request to `http://www.example.com/` forwarded via a proxy at `http://localhost:8080`... ```python # Constructs an HTTP request with a complete URL as the target: # GET https://www.example.com/ HTTP/1.1 url = httpcore2.URL( scheme=b'http', host=b'localhost', port=8080, target=b'https://www.example.com/' ) request = httpcore2.Request( method="GET", url=url ) ``` Another example is constructing an `OPTIONS *` request... ```python # Constructs an 'OPTIONS *' HTTP request: # OPTIONS * HTTP/1.1 url = httpcore2.URL(scheme=b'https', host=b'www.example.com', target=b'*') request = httpcore2.Request(method="OPTIONS", url=url) ``` This kind of request is not possible to formulate with a URL string, because the `/` delimiter is always used to demark the target from the host/port portion of the URL. For convenience, string-like arguments may be specified either as strings or as bytes. However, once a request is being issue over-the-wire, the URL components are always ultimately required to be a bytewise representation. In order to avoid any ambiguity over character encodings, when strings are used as arguments, they must be strictly limited to the ASCII range `chr(0)`-`chr(127)`. If you require a bytewise representation that is outside this range you must handle the character encoding directly, and pass a bytes instance. """ def __init__( self, url: bytes | str = "", *, scheme: bytes | str = b"", host: bytes | str = b"", port: int | None = None, target: bytes | str = b"", ) -> None: """ Parameters: url: The complete URL as a string or bytes. scheme: The URL scheme as a string or bytes. Typically either `"http"` or `"https"`. host: The URL host as a string or bytes. Such as `"www.example.com"`. port: The port to connect to. Either an integer or `None`. target: The target of the HTTP request. Such as `"/items?search=red"`. """ if url: parsed = urllib.parse.urlparse(enforce_bytes(url, name="url")) self.scheme = parsed.scheme self.host = parsed.hostname or b"" self.port = parsed.port self.target = (parsed.path or b"/") + (b"?" + parsed.query if parsed.query else b"") else: self.scheme = enforce_bytes(scheme, name="scheme") self.host = enforce_bytes(host, name="host") self.port = port self.target = enforce_bytes(target, name="target") @property def origin(self) -> Origin: default_port = { b"http": 80, b"https": 443, b"ws": 80, b"wss": 443, b"socks5": 1080, b"socks5h": 1080, }[self.scheme] return Origin(scheme=self.scheme, host=self.host, port=self.port or default_port) def __eq__(self, other: typing.Any) -> bool: return ( isinstance(other, URL) and other.scheme == self.scheme and other.host == self.host and other.port == self.port and other.target == self.target ) def __bytes__(self) -> bytes: if self.port is None: return b"%b://%b%b" % (self.scheme, self.host, self.target) return b"%b://%b:%d%b" % (self.scheme, self.host, self.port, self.target) def __repr__(self) -> str: return ( f"{self.__class__.__name__}(scheme={self.scheme!r}, " f"host={self.host!r}, port={self.port!r}, target={self.target!r})" ) class Request: """ An HTTP request. """ def __init__( self, method: bytes | str, url: URL | bytes | str, *, headers: HeaderTypes = None, content: bytes | typing.Iterable[bytes] | typing.AsyncIterable[bytes] | None = None, extensions: Extensions | None = None, ) -> None: """ Parameters: method: The HTTP request method, either as a string or bytes. For example: `GET`. url: The request URL, either as a `URL` instance, or as a string or bytes. For example: `"https://www.example.com".` headers: The HTTP request headers. content: The content of the request body. extensions: A dictionary of optional extra information included on the request. Possible keys include `"timeout"`, and `"trace"`. """ self.method: bytes = enforce_bytes(method, name="method") self.url: URL = enforce_url(url, name="url") self.headers: list[tuple[bytes, bytes]] = enforce_headers(headers, name="headers") self.stream: typing.Iterable[bytes] | typing.AsyncIterable[bytes] = enforce_stream(content, name="content") self.extensions = {} if extensions is None else extensions if "target" in self.extensions: self.url = URL( scheme=self.url.scheme, host=self.url.host, port=self.url.port, target=self.extensions["target"], ) def __repr__(self) -> str: return f"<{self.__class__.__name__} [{self.method!r}]>" class Response: """ An HTTP response. """ def __init__( self, status: int, *, headers: HeaderTypes = None, content: bytes | typing.Iterable[bytes] | typing.AsyncIterable[bytes] | None = None, extensions: Extensions | None = None, ) -> None: """ Parameters: status: The HTTP status code of the response. For example `200`. headers: The HTTP response headers. content: The content of the response body. extensions: A dictionary of optional extra information included on the responseself.Possible keys include `"http_version"`, `"reason_phrase"`, and `"network_stream"`. """ self.status: int = status self.headers: list[tuple[bytes, bytes]] = enforce_headers(headers, name="headers") self.stream: typing.Iterable[bytes] | typing.AsyncIterable[bytes] = enforce_stream(content, name="content") self.extensions = {} if extensions is None else extensions self._stream_consumed = False @property def content(self) -> bytes: if not hasattr(self, "_content"): if isinstance(self.stream, typing.Iterable): raise RuntimeError( "Attempted to access 'response.content' on a streaming response. Call 'response.read()' first." ) else: raise RuntimeError( "Attempted to access 'response.content' on a streaming response. " "Call 'await response.aread()' first." ) return self._content def __repr__(self) -> str: return f"<{self.__class__.__name__} [{self.status}]>" # Sync interface... def read(self) -> bytes: if not isinstance(self.stream, typing.Iterable): # pragma: no cover raise RuntimeError( "Attempted to read an asynchronous response using 'response.read()'. " "You should use 'await response.aread()' instead." ) if not hasattr(self, "_content"): self._content = b"".join(list(self.iter_stream())) return self._content def iter_stream(self) -> typing.Iterator[bytes]: if not isinstance(self.stream, typing.Iterable): # pragma: no cover raise RuntimeError( "Attempted to stream an asynchronous response using 'for ... in " "response.iter_stream()'. " "You should use 'async for ... in response.aiter_stream()' instead." ) if self._stream_consumed: raise RuntimeError("Attempted to call 'for ... in response.iter_stream()' more than once.") self._stream_consumed = True yield from self.stream def close(self) -> None: if not isinstance(self.stream, typing.Iterable): # pragma: no cover raise RuntimeError( "Attempted to close an asynchronous response using 'response.close()'. " "You should use 'await response.aclose()' instead." ) if hasattr(self.stream, "close"): self.stream.close() # Async interface... async def aread(self) -> bytes: if not isinstance(self.stream, typing.AsyncIterable): # pragma: no cover raise RuntimeError( "Attempted to read an synchronous response using " "'await response.aread()'. " "You should use 'response.read()' instead." ) if not hasattr(self, "_content"): async with safe_async_iterate(self.aiter_stream()) as parts: self._content = b"".join([part async for part in parts]) return self._content async def aiter_stream(self) -> AsyncGenerator[bytes]: if not isinstance(self.stream, typing.AsyncIterable): # pragma: no cover raise RuntimeError( "Attempted to stream an synchronous response using 'async for ... in " "response.aiter_stream()'. " "You should use 'for ... in response.iter_stream()' instead." ) if self._stream_consumed: raise RuntimeError("Attempted to call 'async for ... in response.aiter_stream()' more than once.") self._stream_consumed = True async with safe_async_iterate(self.stream) as iterator: async for chunk in iterator: yield chunk async def aclose(self) -> None: if not isinstance(self.stream, typing.AsyncIterable): # pragma: no cover raise RuntimeError( "Attempted to close a synchronous response using " "'await response.aclose()'. " "You should use 'response.close()' instead." ) if hasattr(self.stream, "aclose"): await self.stream.aclose() class Proxy: def __init__( self, url: URL | bytes | str, auth: tuple[bytes | str, bytes | str] | None = None, headers: HeadersAsMapping | HeadersAsSequence | None = None, ssl_context: ssl.SSLContext | None = None, ): self.url = enforce_url(url, name="url") self.headers = enforce_headers(headers, name="headers") self.ssl_context = ssl_context if auth is not None: username = enforce_bytes(auth[0], name="auth") password = enforce_bytes(auth[1], name="auth") userpass = username + b":" + password authorization = b"Basic " + base64.b64encode(userpass) self.auth: tuple[bytes, bytes] | None = (username, password) self.headers = [(b"Proxy-Authorization", authorization)] + self.headers else: self.auth = None pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_ssl.py000066400000000000000000000006161521723372100232210ustar00rootroot00000000000000import os import ssl import truststore def default_ssl_context() -> ssl.SSLContext: if cafile := os.environ.get("SSL_CERT_FILE"): # pragma: no cover return ssl.create_default_context(cafile=cafile) if capath := os.environ.get("SSL_CERT_DIR"): # pragma: no cover return ssl.create_default_context(capath=capath) return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_sync/000077500000000000000000000000001521723372100230175ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_sync/__init__.py000066400000000000000000000021671521723372100251360ustar00rootroot00000000000000from .connection import HTTPConnection from .connection_pool import ConnectionPool from .http11 import HTTP11Connection from .http_proxy import HTTPProxy from .interfaces import ConnectionInterface try: from .http2 import HTTP2Connection except ImportError: # pragma: no cover class HTTP2Connection: # type: ignore def __init__(self, *args, **kwargs) -> None: # type: ignore raise RuntimeError( "Attempted to use http2 support, but the `h2` package is not " "installed. Use 'pip install httpcore[http2]'." ) try: from .socks_proxy import SOCKSProxy except ImportError: # pragma: no cover class SOCKSProxy: # type: ignore def __init__(self, *args, **kwargs) -> None: # type: ignore raise RuntimeError( "Attempted to use SOCKS support, but the `socksio` package is not " "installed. Use 'pip install httpcore[socks]'." ) __all__ = [ "HTTPConnection", "ConnectionPool", "HTTPProxy", "HTTP11Connection", "HTTP2Connection", "ConnectionInterface", "SOCKSProxy", ] pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_sync/connection.py000066400000000000000000000172251521723372100255370ustar00rootroot00000000000000from __future__ import annotations import itertools import logging import ssl import types import typing from .._backends.sync import SyncBackend from .._backends.base import SOCKET_OPTION, NetworkBackend, NetworkStream from .._exceptions import ConnectError, ConnectTimeout from .._models import Origin, Request, Response from .._ssl import default_ssl_context from .._synchronization import Lock from .._trace import Trace from .http11 import HTTP11Connection from .interfaces import ConnectionInterface RETRIES_BACKOFF_FACTOR = 0.5 # 0s, 0.5s, 1s, 2s, 4s, etc. logger = logging.getLogger("httpcore2.connection") def exponential_backoff(factor: float) -> typing.Iterator[float]: """ Generate a geometric sequence that has a ratio of 2 and starts with 0. For example: - `factor = 2`: `0, 2, 4, 8, 16, 32, 64, ...` - `factor = 3`: `0, 3, 6, 12, 24, 48, 96, ...` """ yield 0 for n in itertools.count(): yield factor * 2**n class HTTPConnection(ConnectionInterface): def __init__( self, origin: Origin, ssl_context: ssl.SSLContext | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, retries: int = 0, local_address: str | None = None, uds: str | None = None, network_backend: NetworkBackend | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> None: self._origin = origin self._ssl_context = ssl_context self._keepalive_expiry = keepalive_expiry self._http1 = http1 self._http2 = http2 self._retries = retries self._local_address = local_address self._uds = uds self._network_backend: NetworkBackend = SyncBackend() if network_backend is None else network_backend self._connection: ConnectionInterface | None = None self._connect_failed: bool = False self._request_lock = Lock() self._socket_options = socket_options def handle_request(self, request: Request) -> Response: if not self.can_handle_request(request.url.origin): raise RuntimeError(f"Attempted to send request to {request.url.origin} on connection to {self._origin}") try: with self._request_lock: if self._connection is None: stream = self._connect(request) ssl_object = stream.get_extra_info("ssl_object") http2_negotiated = ssl_object is not None and ssl_object.selected_alpn_protocol() == "h2" if http2_negotiated or (self._http2 and not self._http1): from .http2 import HTTP2Connection self._connection = HTTP2Connection( origin=self._origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) else: self._connection = HTTP11Connection( origin=self._origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) except BaseException as exc: self._connect_failed = True raise exc return self._connection.handle_request(request) def _connect(self, request: Request) -> NetworkStream: timeouts = request.extensions.get("timeout", {}) sni_hostname = request.extensions.get("sni_hostname", None) timeout = timeouts.get("connect", None) retries_left = self._retries delays = exponential_backoff(factor=RETRIES_BACKOFF_FACTOR) while True: try: if self._uds is None: kwargs = { "host": self._origin.host.decode("ascii"), "port": self._origin.port, "local_address": self._local_address, "timeout": timeout, "socket_options": self._socket_options, } with Trace("connect_tcp", logger, request, kwargs) as trace: stream = self._network_backend.connect_tcp(**kwargs) trace.return_value = stream else: kwargs = { "path": self._uds, "timeout": timeout, "socket_options": self._socket_options, } with Trace("connect_unix_socket", logger, request, kwargs) as trace: stream = self._network_backend.connect_unix_socket(**kwargs) trace.return_value = stream if self._origin.scheme in (b"https", b"wss"): ssl_context = default_ssl_context() if self._ssl_context is None else self._ssl_context alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] ssl_context.set_alpn_protocols(alpn_protocols) kwargs = { "ssl_context": ssl_context, "server_hostname": sni_hostname or self._origin.host.decode("ascii"), "timeout": timeout, } with Trace("start_tls", logger, request, kwargs) as trace: stream = stream.start_tls(**kwargs) trace.return_value = stream return stream except (ConnectError, ConnectTimeout): if retries_left <= 0: raise retries_left -= 1 delay = next(delays) with Trace("retry", logger, request, kwargs) as trace: self._network_backend.sleep(delay) def can_handle_request(self, origin: Origin) -> bool: return origin == self._origin def close(self) -> None: if self._connection is not None: with Trace("close", logger, None, {}): self._connection.close() def is_available(self) -> bool: if self._connection is None: # If HTTP/2 support is enabled, and the resulting connection could # end up as HTTP/2 then we should indicate the connection as being # available to service multiple requests. return self._http2 and (self._origin.scheme == b"https" or not self._http1) and not self._connect_failed return self._connection.is_available() def has_expired(self) -> bool: if self._connection is None: return self._connect_failed return self._connection.has_expired() def is_idle(self) -> bool: if self._connection is None: return self._connect_failed return self._connection.is_idle() def is_closed(self) -> bool: if self._connection is None: return self._connect_failed return self._connection.is_closed() def info(self) -> str: if self._connection is None: return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" return self._connection.info() def __repr__(self) -> str: return f"<{self.__class__.__name__} [{self.info()}]>" # These context managers are not used in the standard flow, but are # useful for testing or working with connection instances directly. def __enter__(self) -> HTTPConnection: return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: self.close() pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_sync/connection_pool.py000066400000000000000000000412451521723372100265670ustar00rootroot00000000000000from __future__ import annotations import ssl import sys import types import typing from collections.abc import Generator from .._backends.sync import SyncBackend from .._backends.base import SOCKET_OPTION, NetworkBackend from .._exceptions import ConnectionNotAvailable, UnsupportedProtocol from .._models import Origin, Proxy, Request, Response from .._synchronization import Event, ShieldCancellation, ThreadLock from .._utils import safe_iterate from .connection import HTTPConnection from .interfaces import ConnectionInterface, RequestInterface class PoolRequest: def __init__(self, request: Request) -> None: self.request = request self.connection: ConnectionInterface | None = None self._connection_acquired = Event() def assign_to_connection(self, connection: ConnectionInterface | None) -> None: self.connection = connection self._connection_acquired.set() def clear_connection(self) -> None: self.connection = None self._connection_acquired = Event() def wait_for_connection(self, timeout: float | None = None) -> ConnectionInterface: if self.connection is None: self._connection_acquired.wait(timeout=timeout) assert self.connection is not None return self.connection def is_queued(self) -> bool: return self.connection is None class ConnectionPool(RequestInterface): """ A connection pool for making HTTP requests. """ def __init__( self, ssl_context: ssl.SSLContext | None = None, proxy: Proxy | None = None, max_connections: int | None = 10, max_keepalive_connections: int | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, retries: int = 0, local_address: str | None = None, uds: str | None = None, network_backend: NetworkBackend | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> None: """ A connection pool for making HTTP requests. Parameters: ssl_context: An SSL context to use for verifying connections. If not specified, the default `httpcore2.default_ssl_context()` will be used. max_connections: The maximum number of concurrent HTTP connections that the pool should allow. Any attempt to send a request on a pool that would exceed this amount will block until a connection is available. max_keepalive_connections: The maximum number of idle HTTP connections that will be maintained in the pool. keepalive_expiry: The duration in seconds that an idle HTTP connection may be maintained for before being expired from the pool. http1: A boolean indicating if HTTP/1.1 requests should be supported by the connection pool. Defaults to True. http2: A boolean indicating if HTTP/2 requests should be supported by the connection pool. Defaults to False. retries: The maximum number of retries when trying to establish a connection. local_address: Local address to connect from. Can also be used to connect using a particular address family. Using `local_address="0.0.0.0"` will connect using an `AF_INET` address (IPv4), while using `local_address="::"` will connect using an `AF_INET6` address (IPv6). uds: Path to a Unix Domain Socket to use instead of TCP sockets. network_backend: A backend instance to use for handling network I/O. socket_options: Socket options that have to be included in the TCP socket when the connection was established. """ self._ssl_context = ssl_context self._proxy = proxy self._max_connections = sys.maxsize if max_connections is None else max_connections self._max_keepalive_connections = ( sys.maxsize if max_keepalive_connections is None else max_keepalive_connections ) self._max_keepalive_connections = min(self._max_connections, self._max_keepalive_connections) self._keepalive_expiry = keepalive_expiry self._http1 = http1 self._http2 = http2 self._retries = retries self._local_address = local_address self._uds = uds self._network_backend = SyncBackend() if network_backend is None else network_backend self._socket_options = socket_options # The mutable state on a connection pool is the queue of incoming requests, # and the set of connections that are servicing those requests. self._connections: list[ConnectionInterface] = [] self._requests: list[PoolRequest] = [] # We only mutate the state of the connection pool within an 'optional_thread_lock' # context. This holds a threading lock unless we're running in async mode, # in which case it is a no-op. self._optional_thread_lock = ThreadLock() def create_connection(self, origin: Origin) -> ConnectionInterface: if self._proxy is not None: if self._proxy.url.scheme in (b"socks5", b"socks5h"): from .socks_proxy import Socks5Connection return Socks5Connection( proxy_origin=self._proxy.url.origin, proxy_auth=self._proxy.auth, remote_origin=origin, ssl_context=self._ssl_context, keepalive_expiry=self._keepalive_expiry, http1=self._http1, http2=self._http2, network_backend=self._network_backend, ) elif origin.scheme == b"http": from .http_proxy import ForwardHTTPConnection return ForwardHTTPConnection( proxy_origin=self._proxy.url.origin, proxy_headers=self._proxy.headers, proxy_ssl_context=self._proxy.ssl_context, remote_origin=origin, keepalive_expiry=self._keepalive_expiry, network_backend=self._network_backend, ) from .http_proxy import TunnelHTTPConnection return TunnelHTTPConnection( proxy_origin=self._proxy.url.origin, proxy_headers=self._proxy.headers, proxy_ssl_context=self._proxy.ssl_context, remote_origin=origin, ssl_context=self._ssl_context, keepalive_expiry=self._keepalive_expiry, http1=self._http1, http2=self._http2, network_backend=self._network_backend, ) return HTTPConnection( origin=origin, ssl_context=self._ssl_context, keepalive_expiry=self._keepalive_expiry, http1=self._http1, http2=self._http2, retries=self._retries, local_address=self._local_address, uds=self._uds, network_backend=self._network_backend, socket_options=self._socket_options, ) @property def connections(self) -> list[ConnectionInterface]: """ Return a list of the connections currently in the pool. For example: ```python >>> pool.connections [ , , , ] ``` """ return list(self._connections) def handle_request(self, request: Request) -> Response: """ Send an HTTP request, and return an HTTP response. This is the core implementation that is called into by `.request()` or `.stream()`. """ scheme = request.url.scheme.decode() if scheme == "": raise UnsupportedProtocol("Request URL is missing an 'http://' or 'https://' protocol.") if scheme not in ("http", "https", "ws", "wss"): raise UnsupportedProtocol(f"Request URL has an unsupported protocol '{scheme}://'.") timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("pool", None) with self._optional_thread_lock: # Add the incoming request to our request queue. pool_request = PoolRequest(request) self._requests.append(pool_request) try: while True: with self._optional_thread_lock: # Assign incoming requests to available connections, # closing or creating new connections as required. closing = self._assign_requests_to_connections() self._close_connections(closing) # Wait until this request has an assigned connection. connection = pool_request.wait_for_connection(timeout=timeout) try: # Send the request on the assigned connection. response = connection.handle_request(pool_request.request) except ConnectionNotAvailable: # In some cases a connection may initially be available to # handle a request, but then become unavailable. # # In this case we clear the connection and try again. pool_request.clear_connection() else: break # pragma: no cover except BaseException as exc: with self._optional_thread_lock: # For any exception or cancellation we remove the request from # the queue, and then re-assign requests to connections. self._requests.remove(pool_request) closing = self._assign_requests_to_connections() self._close_connections(closing) raise exc from None # Return the response. Note that in this case we still have to manage # the point at which the response is closed. assert isinstance(response.stream, typing.Iterable) return Response( status=response.status, headers=response.headers, content=PoolByteStream(stream=response.stream, pool_request=pool_request, pool=self), extensions=response.extensions, ) def _assign_requests_to_connections(self) -> list[ConnectionInterface]: """ Manage the state of the connection pool, assigning incoming requests to connections as available. Called whenever a new request is added or removed from the pool. Any closing connections are returned, allowing the I/O for closing those connections to be handled separately. """ closing_connections: list[ConnectionInterface] = [] retained_connections: list[ConnectionInterface] = [] # First we handle cleaning up any connections that are closed # or have expired their keep-alive, in a single pass. for connection in self._connections: if connection.is_closed(): continue elif connection.has_expired(): closing_connections.append(connection) else: retained_connections.append(connection) # Then we close any surplus idle connections, to enforce the # max_keepalive_connections setting. idle_surplus = ( sum(connection.is_idle() for connection in retained_connections) - self._max_keepalive_connections ) if idle_surplus > 0: kept: list[ConnectionInterface] = [] for connection in retained_connections: if idle_surplus > 0 and connection.is_idle(): closing_connections.append(connection) idle_surplus -= 1 else: kept.append(connection) retained_connections = kept self._connections = retained_connections # Snapshot the set of reusable connections once, rather than rebuilding # it per queued request β€” this is what brings the loop from O(N*M) to # O(N+M) in the common case. available_connections = [connection for connection in self._connections if connection.is_available()] new_connection_budget = self._max_connections - len(self._connections) # Assign queued requests to connections. for pool_request in self._requests: if not pool_request.is_queued(): continue origin = pool_request.request.url.origin # There are three cases for how we may be able to handle the request: # # 1. There is an existing connection that can handle the request. # 2. We can create a new connection to handle the request. # 3. We can close an idle connection and then create a new connection # to handle the request. for connection in available_connections: if connection.can_handle_request(origin): pool_request.assign_to_connection(connection) break else: if new_connection_budget > 0: connection = self.create_connection(origin) self._connections.append(connection) pool_request.assign_to_connection(connection) new_connection_budget -= 1 continue for idx, connection in enumerate(available_connections): if connection.is_idle(): del available_connections[idx] self._connections.remove(connection) closing_connections.append(connection) connection = self.create_connection(origin) self._connections.append(connection) pool_request.assign_to_connection(connection) break return closing_connections def _close_connections(self, closing: list[ConnectionInterface]) -> None: # Close connections which have been removed from the pool. with ShieldCancellation(): for connection in closing: connection.close() def close(self) -> None: # Explicitly close the connection pool. # Clears all existing requests and connections. with self._optional_thread_lock: closing_connections = list(self._connections) self._connections = [] self._close_connections(closing_connections) def __enter__(self) -> ConnectionPool: return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: self.close() def __repr__(self) -> str: class_name = self.__class__.__name__ with self._optional_thread_lock: request_is_queued = [request.is_queued() for request in self._requests] connection_is_idle = [connection.is_idle() for connection in self._connections] num_active_requests = request_is_queued.count(False) num_queued_requests = request_is_queued.count(True) num_active_connections = connection_is_idle.count(False) num_idle_connections = connection_is_idle.count(True) requests_info = f"Requests: {num_active_requests} active, {num_queued_requests} queued" connection_info = f"Connections: {num_active_connections} active, {num_idle_connections} idle" return f"<{class_name} [{requests_info} | {connection_info}]>" class PoolByteStream: def __init__( self, stream: typing.Iterable[bytes], pool_request: PoolRequest, pool: ConnectionPool, ) -> None: self._stream = stream self._pool_request = pool_request self._pool = pool self._closed = False def __iter__(self) -> Generator[bytes]: with safe_iterate(self._stream) as iterator: for chunk in iterator: yield chunk def close(self) -> None: if not self._closed: self._closed = True with ShieldCancellation(): if hasattr(self._stream, "close"): self._stream.close() with self._pool._optional_thread_lock: self._pool._requests.remove(self._pool_request) closing = self._pool._assign_requests_to_connections() self._pool._close_connections(closing) pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_sync/http11.py000066400000000000000000000316611521723372100245210ustar00rootroot00000000000000from __future__ import annotations import enum import logging import ssl import time import types import typing from collections.abc import Generator import h11 from .._backends.base import NetworkStream from .._exceptions import ( ConnectionNotAvailable, LocalProtocolError, RemoteProtocolError, WriteError, map_exceptions, ) from .._models import Origin, Request, Response from .._synchronization import Lock, ShieldCancellation from .._trace import Trace from .._utils import safe_iterate from .interfaces import ConnectionInterface logger = logging.getLogger("httpcore2.http11") # A subset of `h11.Event` types supported by `_send_event` H11SendEvent = h11.Request | h11.Data | h11.EndOfMessage class HTTPConnectionState(enum.IntEnum): NEW = 0 ACTIVE = 1 IDLE = 2 CLOSED = 3 class HTTP11Connection(ConnectionInterface): READ_NUM_BYTES = 64 * 1024 MAX_INCOMPLETE_EVENT_SIZE = 100 * 1024 def __init__( self, origin: Origin, stream: NetworkStream, keepalive_expiry: float | None = None, ) -> None: self._origin = origin self._network_stream = stream self._keepalive_expiry: float | None = keepalive_expiry self._expire_at: float | None = None self._state = HTTPConnectionState.NEW self._state_lock = Lock() self._request_count = 0 self._h11_state = h11.Connection( our_role=h11.CLIENT, max_incomplete_event_size=self.MAX_INCOMPLETE_EVENT_SIZE, ) def handle_request(self, request: Request) -> Response: if not self.can_handle_request(request.url.origin): raise RuntimeError(f"Attempted to send request to {request.url.origin} on connection to {self._origin}") with self._state_lock: if self._state in (HTTPConnectionState.NEW, HTTPConnectionState.IDLE): self._request_count += 1 self._state = HTTPConnectionState.ACTIVE self._expire_at = None else: raise ConnectionNotAvailable() try: kwargs = {"request": request} try: with Trace("send_request_headers", logger, request, kwargs) as trace: self._send_request_headers(**kwargs) with Trace("send_request_body", logger, request, kwargs) as trace: self._send_request_body(**kwargs) except WriteError: # If we get a write error while we're writing the request, # then we suppress this error and move on to attempting to # read the response. Servers can sometimes close the request # preemptively and then respond with a well formed HTTP # error response. pass with Trace("receive_response_headers", logger, request, kwargs) as trace: ( http_version, status, reason_phrase, headers, trailing_data, ) = self._receive_response_headers(**kwargs) trace.return_value = ( http_version, status, reason_phrase, headers, ) network_stream = self._network_stream # CONNECT or Upgrade request if (status == 101) or ((request.method == b"CONNECT") and (200 <= status < 300)): network_stream = HTTP11UpgradeStream(network_stream, trailing_data) return Response( status=status, headers=headers, content=HTTP11ConnectionByteStream(self, request), extensions={ "http_version": http_version, "reason_phrase": reason_phrase, "network_stream": network_stream, }, ) except BaseException as exc: with ShieldCancellation(): with Trace("response_closed", logger, request) as trace: self._response_closed() raise exc # Sending the request... def _send_request_headers(self, request: Request) -> None: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("write", None) with map_exceptions({h11.LocalProtocolError: LocalProtocolError}): event = h11.Request( method=request.method, target=request.url.target, headers=request.headers, ) self._send_event(event, timeout=timeout) def _send_request_body(self, request: Request) -> None: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("write", None) assert isinstance(request.stream, typing.Iterable) with safe_iterate(request.stream) as iterator: for chunk in iterator: event = h11.Data(data=chunk) self._send_event(event, timeout=timeout) self._send_event(h11.EndOfMessage(), timeout=timeout) def _send_event(self, event: h11.Event, timeout: float | None = None) -> None: bytes_to_send = self._h11_state.send(event) if bytes_to_send is not None: self._network_stream.write(bytes_to_send, timeout=timeout) # Receiving the response... def _receive_response_headers( self, request: Request ) -> tuple[bytes, int, bytes, list[tuple[bytes, bytes]], bytes]: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("read", None) while True: event = self._receive_event(timeout=timeout) if isinstance(event, h11.Response): break if isinstance(event, h11.InformationalResponse) and event.status_code == 101: break http_version = b"HTTP/" + event.http_version # h11 version 0.11+ supports a `raw_items` interface to get the # raw header casing, rather than the enforced lowercase headers. headers = event.headers.raw_items() trailing_data, _ = self._h11_state.trailing_data return http_version, event.status_code, event.reason, headers, trailing_data def _receive_response_body(self, request: Request) -> Generator[bytes]: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("read", None) while True: event = self._receive_event(timeout=timeout) if isinstance(event, h11.Data): yield bytes(event.data) elif isinstance(event, (h11.EndOfMessage, h11.PAUSED)): break def _receive_event(self, timeout: float | None = None) -> h11.Event | type[h11.PAUSED]: while True: with map_exceptions({h11.RemoteProtocolError: RemoteProtocolError}): event = self._h11_state.next_event() if event is h11.NEED_DATA: data = self._network_stream.read(self.READ_NUM_BYTES, timeout=timeout) # If we feed this case through h11 we'll raise an exception like: # # httpcore2.RemoteProtocolError: can't handle event type # ConnectionClosed when role=SERVER and state=SEND_RESPONSE # # Which is accurate, but not very informative from an end-user # perspective. Instead we handle this case distinctly and treat # it as a ConnectError. if data == b"" and self._h11_state.their_state == h11.SEND_RESPONSE: msg = "Server disconnected without sending a response." raise RemoteProtocolError(msg) self._h11_state.receive_data(data) else: # mypy fails to narrow the type in the above if statement above return event # type: ignore[return-value] def _response_closed(self) -> None: with self._state_lock: if self._h11_state.our_state is h11.DONE and self._h11_state.their_state is h11.DONE: self._state = HTTPConnectionState.IDLE self._h11_state.start_next_cycle() if self._keepalive_expiry is not None: now = time.monotonic() self._expire_at = now + self._keepalive_expiry else: self.close() # Once the connection is no longer required... def close(self) -> None: # Note that this method unilaterally closes the connection, and does # not have any kind of locking in place around it. self._state = HTTPConnectionState.CLOSED self._network_stream.close() # The ConnectionInterface methods provide information about the state of # the connection, allowing for a connection pooling implementation to # determine when to reuse and when to close the connection... def can_handle_request(self, origin: Origin) -> bool: return origin == self._origin def is_available(self) -> bool: # Note that HTTP/1.1 connections in the "NEW" state are not treated as # being "available". The control flow which created the connection will # be able to send an outgoing request, but the connection will not be # acquired from the connection pool for any other request. return self._state == HTTPConnectionState.IDLE def has_expired(self) -> bool: now = time.monotonic() keepalive_expired = self._expire_at is not None and now > self._expire_at # If the HTTP connection is idle but the socket is readable, then the # only valid state is that the socket is about to return b"", indicating # a server-initiated disconnect. server_disconnected = self._state == HTTPConnectionState.IDLE and self._network_stream.get_extra_info( "is_readable" ) return keepalive_expired or server_disconnected def is_idle(self) -> bool: return self._state == HTTPConnectionState.IDLE def is_closed(self) -> bool: return self._state == HTTPConnectionState.CLOSED def info(self) -> str: origin = str(self._origin) return f"{origin!r}, HTTP/1.1, {self._state.name}, Request Count: {self._request_count}" def __repr__(self) -> str: class_name = self.__class__.__name__ origin = str(self._origin) return f"<{class_name} [{origin!r}, {self._state.name}, Request Count: {self._request_count}]>" # These context managers are not used in the standard flow, but are # useful for testing or working with connection instances directly. def __enter__(self) -> HTTP11Connection: return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: self.close() class HTTP11ConnectionByteStream: def __init__(self, connection: HTTP11Connection, request: Request) -> None: self._connection = connection self._request = request self._closed = False def __iter__(self) -> Generator[bytes]: kwargs = {"request": self._request} try: with Trace("receive_response_body", logger, self._request, kwargs): with safe_iterate(self._connection._receive_response_body(**kwargs)) as iterator: for chunk in iterator: yield chunk except BaseException as exc: # If we get an exception while streaming the response, # we want to close the response (and possibly the connection) # before raising that exception. with ShieldCancellation(): self.close() raise exc def close(self) -> None: if not self._closed: self._closed = True with Trace("response_closed", logger, self._request): self._connection._response_closed() class HTTP11UpgradeStream(NetworkStream): def __init__(self, stream: NetworkStream, leading_data: bytes) -> None: self._stream = stream self._leading_data = leading_data def read(self, max_bytes: int, timeout: float | None = None) -> bytes: if self._leading_data: buffer = self._leading_data[:max_bytes] self._leading_data = self._leading_data[max_bytes:] return buffer else: return self._stream.read(max_bytes, timeout) def write(self, buffer: bytes, timeout: float | None = None) -> None: self._stream.write(buffer, timeout) def close(self) -> None: self._stream.close() def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> NetworkStream: return self._stream.start_tls(ssl_context, server_hostname, timeout) def get_extra_info(self, info: str) -> typing.Any: return self._stream.get_extra_info(info) pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_sync/http2.py000066400000000000000000000550061521723372100244400ustar00rootroot00000000000000from __future__ import annotations import enum import logging import time import types import typing from collections.abc import Generator import h2.config import h2.connection import h2.events import h2.exceptions import h2.settings from .._backends.base import NetworkStream from .._exceptions import ConnectionNotAvailable, LocalProtocolError, RemoteProtocolError from .._models import Origin, Request, Response from .._synchronization import Lock, Semaphore, ShieldCancellation from .._trace import Trace from .._utils import safe_iterate from .interfaces import ConnectionInterface logger = logging.getLogger("httpcore2.http2") def has_body_headers(request: Request) -> bool: return any(k.lower() == b"content-length" or k.lower() == b"transfer-encoding" for k, _v in request.headers) class HTTPConnectionState(enum.IntEnum): ACTIVE = 1 IDLE = 2 CLOSED = 3 class HTTP2Connection(ConnectionInterface): READ_NUM_BYTES = 64 * 1024 CONFIG = h2.config.H2Configuration(validate_inbound_headers=False) def __init__( self, origin: Origin, stream: NetworkStream, keepalive_expiry: float | None = None, ): self._origin = origin self._network_stream = stream self._keepalive_expiry: float | None = keepalive_expiry self._h2_state = h2.connection.H2Connection(config=self.CONFIG) self._state = HTTPConnectionState.IDLE self._expire_at: float | None = None self._request_count = 0 self._init_lock = Lock() self._state_lock = Lock() self._read_lock = Lock() self._write_lock = Lock() self._sent_connection_init = False self._used_all_stream_ids = False self._connection_error = False # Mapping from stream ID to response stream events. self._events: dict[ int, list[h2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEnded | h2.events.StreamReset,], ] = {} # Connection terminated events are stored as state since # we need to handle them for all streams. self._connection_terminated: h2.events.ConnectionTerminated | None = None self._read_exception: Exception | None = None self._write_exception: Exception | None = None def handle_request(self, request: Request) -> Response: if not self.can_handle_request(request.url.origin): # This cannot occur in normal operation, since the connection pool # will only send requests on connections that handle them. # It's in place simply for resilience as a guard against incorrect # usage, for anyone working directly with httpcore connections. raise RuntimeError(f"Attempted to send request to {request.url.origin} on connection to {self._origin}") with self._state_lock: if self._state in (HTTPConnectionState.ACTIVE, HTTPConnectionState.IDLE): self._request_count += 1 self._expire_at = None self._state = HTTPConnectionState.ACTIVE else: raise ConnectionNotAvailable() with self._init_lock: if not self._sent_connection_init: try: sci_kwargs = {"request": request} with Trace("send_connection_init", logger, request, sci_kwargs): self._send_connection_init(**sci_kwargs) except BaseException as exc: with ShieldCancellation(): self.close() raise exc self._sent_connection_init = True # Initially start with just 1 until the remote server provides # its max_concurrent_streams value self._max_streams = 1 local_settings_max_streams = self._h2_state.local_settings.max_concurrent_streams self._max_streams_semaphore = Semaphore(local_settings_max_streams) for _ in range(local_settings_max_streams - self._max_streams): self._max_streams_semaphore.acquire() self._max_streams_semaphore.acquire() try: stream_id = self._h2_state.get_next_available_stream_id() self._events[stream_id] = [] except h2.exceptions.NoAvailableStreamIDError: # pragma: no cover self._used_all_stream_ids = True self._request_count -= 1 self._max_streams_semaphore.release() raise ConnectionNotAvailable() try: kwargs = {"request": request, "stream_id": stream_id} with Trace("send_request_headers", logger, request, kwargs): self._send_request_headers(request=request, stream_id=stream_id) with Trace("send_request_body", logger, request, kwargs): self._send_request_body(request=request, stream_id=stream_id) with Trace("receive_response_headers", logger, request, kwargs) as trace: status, headers = self._receive_response(request=request, stream_id=stream_id) trace.return_value = (status, headers) return Response( status=status, headers=headers, content=HTTP2ConnectionByteStream(self, request, stream_id=stream_id), extensions={ "http_version": b"HTTP/2", "network_stream": self._network_stream, "stream_id": stream_id, }, ) except BaseException as exc: # noqa: PIE786 with ShieldCancellation(): kwargs = {"stream_id": stream_id} with Trace("response_closed", logger, request, kwargs): self._response_closed(stream_id=stream_id) if isinstance(exc, h2.exceptions.ProtocolError): # One case where h2 can raise a protocol error is when a # closed frame has been seen by the state machine. # # This happens when one stream is reading, and encounters # a GOAWAY event. Other flows of control may then raise # a protocol error at any point they interact with the 'h2_state'. # # In this case we'll have stored the event, and should raise # it as a RemoteProtocolError. if self._connection_terminated: # pragma: no cover raise RemoteProtocolError(self._connection_terminated) # If h2 raises a protocol error in some other state then we # must somehow have made a protocol violation. raise LocalProtocolError(exc) # pragma: no cover raise exc def _send_connection_init(self, request: Request) -> None: """ The HTTP/2 connection requires some initial setup before we can start using individual request/response streams on it. """ # Need to set these manually here instead of manipulating via # __setitem__() otherwise the H2Connection will emit SettingsUpdate # frames in addition to sending the undesired defaults. self._h2_state.local_settings = h2.settings.Settings( client=True, initial_values={ # Disable PUSH_PROMISE frames from the server since we don't do anything # with them for now. Maybe when we support caching? h2.settings.SettingCodes.ENABLE_PUSH: 0, # These two are taken from h2 for safe defaults h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS: 100, h2.settings.SettingCodes.MAX_HEADER_LIST_SIZE: 65536, }, ) # Some websites (*cough* Yahoo *cough*) balk at this setting being # present in the initial handshake since it's not defined in the original # RFC despite the RFC mandating ignoring settings you don't know about. del self._h2_state.local_settings[h2.settings.SettingCodes.ENABLE_CONNECT_PROTOCOL] self._h2_state.initiate_connection() self._h2_state.increment_flow_control_window(2**24) self._write_outgoing_data(request) # Sending the request... def _send_request_headers(self, request: Request, stream_id: int) -> None: """ Send the request headers to a given stream ID. """ end_stream = not has_body_headers(request) # In HTTP/2 the ':authority' pseudo-header is used instead of 'Host'. # In order to gracefully handle HTTP/1.1 and HTTP/2 we always require # HTTP/1.1 style headers, and map them appropriately if we end up on # an HTTP/2 connection. authority = [v for k, v in request.headers if k.lower() == b"host"][0] headers = [ (b":method", request.method), (b":authority", authority), (b":scheme", request.url.scheme), (b":path", request.url.target), ] + [ (k.lower(), v) for k, v in request.headers if k.lower() not in ( b"host", b"transfer-encoding", ) ] self._h2_state.send_headers(stream_id, headers, end_stream=end_stream) self._h2_state.increment_flow_control_window(2**24, stream_id=stream_id) self._write_outgoing_data(request) def _send_request_body(self, request: Request, stream_id: int) -> None: """ Iterate over the request body sending it to a given stream ID. """ if not has_body_headers(request): return assert isinstance(request.stream, typing.Iterable) with safe_iterate(request.stream) as iterator: for chunk in iterator: self._send_stream_data(request, stream_id, chunk) self._send_end_stream(request, stream_id) def _send_stream_data(self, request: Request, stream_id: int, data: bytes) -> None: """ Send a single chunk of data in one or more data frames. """ while data: max_flow = self._wait_for_outgoing_flow(request, stream_id) chunk_size = min(len(data), max_flow) chunk, data = data[:chunk_size], data[chunk_size:] self._h2_state.send_data(stream_id, chunk) self._write_outgoing_data(request) def _send_end_stream(self, request: Request, stream_id: int) -> None: """ Send an empty data frame on on a given stream ID with the END_STREAM flag set. """ self._h2_state.end_stream(stream_id) self._write_outgoing_data(request) # Receiving the response... def _receive_response(self, request: Request, stream_id: int) -> tuple[int, list[tuple[bytes, bytes]]]: """ Return the response status code and headers for a given stream ID. """ while True: event = self._receive_stream_event(request, stream_id) if isinstance(event, h2.events.ResponseReceived): break status_code = 200 headers: list[tuple[bytes, bytes]] = [] assert event.headers is not None for k, v in event.headers: if k == b":status": status_code = int(v.decode("ascii", errors="ignore")) elif not k.startswith(b":"): headers.append((k, v)) return (status_code, headers) def _receive_response_body(self, request: Request, stream_id: int) -> Generator[bytes]: """ Iterator that returns the bytes of the response body for a given stream ID. """ while True: event = self._receive_stream_event(request, stream_id) if isinstance(event, h2.events.DataReceived): assert event.flow_controlled_length is not None assert event.data is not None amount = event.flow_controlled_length self._h2_state.acknowledge_received_data(amount, stream_id) self._write_outgoing_data(request) yield event.data elif isinstance(event, h2.events.StreamEnded): break def _receive_stream_event( self, request: Request, stream_id: int ) -> h2.events.ResponseReceived | h2.events.DataReceived | h2.events.StreamEnded: """ Return the next available event for a given stream ID. Will read more data from the network if required. """ while not self._events.get(stream_id): self._receive_events(request, stream_id) event = self._events[stream_id].pop(0) if isinstance(event, h2.events.StreamReset): raise RemoteProtocolError(event) return event def _receive_events(self, request: Request, stream_id: int | None = None) -> None: """ Read some data from the network until we see one or more events for a given stream ID. """ with self._read_lock: if self._connection_terminated is not None: last_stream_id = self._connection_terminated.last_stream_id if stream_id and last_stream_id and stream_id > last_stream_id: self._request_count -= 1 raise ConnectionNotAvailable() raise RemoteProtocolError(self._connection_terminated) # This conditional is a bit icky. We don't want to block reading if we've # actually got an event to return for a given stream. We need to do that # check *within* the atomic read lock. Though it also need to be optional, # because when we call it from `_wait_for_outgoing_flow` we *do* want to # block until we've available flow control, event when we have events # pending for the stream ID we're attempting to send on. if stream_id is None or not self._events.get(stream_id): events = self._read_incoming_data(request) for event in events: if isinstance(event, h2.events.RemoteSettingsChanged): with Trace("receive_remote_settings", logger, request) as trace: self._receive_remote_settings_change(event) trace.return_value = event elif isinstance( event, ( h2.events.ResponseReceived, h2.events.DataReceived, h2.events.StreamEnded, h2.events.StreamReset, ), ): if event.stream_id in self._events: self._events[event.stream_id].append(event) elif isinstance(event, h2.events.ConnectionTerminated): self._connection_terminated = event self._write_outgoing_data(request) def _receive_remote_settings_change(self, event: h2.events.RemoteSettingsChanged) -> None: max_concurrent_streams = event.changed_settings.get(h2.settings.SettingCodes.MAX_CONCURRENT_STREAMS) if max_concurrent_streams: new_max_streams = min( max_concurrent_streams.new_value, self._h2_state.local_settings.max_concurrent_streams, ) if new_max_streams and new_max_streams != self._max_streams: while new_max_streams > self._max_streams: self._max_streams_semaphore.release() self._max_streams += 1 while new_max_streams < self._max_streams: self._max_streams_semaphore.acquire() self._max_streams -= 1 def _response_closed(self, stream_id: int) -> None: self._max_streams_semaphore.release() with self._state_lock: del self._events[stream_id] if self._connection_terminated and not self._events: self.close() elif self._state == HTTPConnectionState.ACTIVE and not self._events: self._state = HTTPConnectionState.IDLE if self._keepalive_expiry is not None: now = time.monotonic() self._expire_at = now + self._keepalive_expiry if self._used_all_stream_ids: # pragma: no cover self.close() def close(self) -> None: # Note that this method unilaterally closes the connection, and does # not have any kind of locking in place around it. self._h2_state.close_connection() self._state = HTTPConnectionState.CLOSED self._network_stream.close() # Wrappers around network read/write operations... def _read_incoming_data(self, request: Request) -> list[h2.events.Event]: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("read", None) if self._read_exception is not None: raise self._read_exception # pragma: no cover try: data = self._network_stream.read(self.READ_NUM_BYTES, timeout) if data == b"": raise RemoteProtocolError("Server disconnected") except Exception as exc: # If we get a network error we should: # # 1. Save the exception and just raise it immediately on any future reads. # (For example, this means that a single read timeout or disconnect will # immediately close all pending streams. Without requiring multiple # sequential timeouts.) # 2. Mark the connection as errored, so that we don't accept any other # incoming requests. self._read_exception = exc self._connection_error = True raise exc events: list[h2.events.Event] = self._h2_state.receive_data(data) return events def _write_outgoing_data(self, request: Request) -> None: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("write", None) with self._write_lock: data_to_send = self._h2_state.data_to_send() if self._write_exception is not None: raise self._write_exception # pragma: no cover try: self._network_stream.write(data_to_send, timeout) except Exception as exc: # pragma: no cover # If we get a network error we should: # # 1. Save the exception and just raise it immediately on any future write. # (For example, this means that a single write timeout or disconnect will # immediately close all pending streams. Without requiring multiple # sequential timeouts.) # 2. Mark the connection as errored, so that we don't accept any other # incoming requests. self._write_exception = exc self._connection_error = True raise exc # Flow control... def _wait_for_outgoing_flow(self, request: Request, stream_id: int) -> int: """ Returns the maximum allowable outgoing flow for a given stream. If the allowable flow is zero, then waits on the network until WindowUpdated frames have increased the flow rate. https://tools.ietf.org/html/rfc7540#section-6.9 """ local_flow: int = self._h2_state.local_flow_control_window(stream_id) max_frame_size: int = self._h2_state.max_outbound_frame_size flow = min(local_flow, max_frame_size) while flow <= 0: self._receive_events(request) local_flow = self._h2_state.local_flow_control_window(stream_id) max_frame_size = self._h2_state.max_outbound_frame_size flow = min(local_flow, max_frame_size) return flow # Interface for connection pooling... def can_handle_request(self, origin: Origin) -> bool: return origin == self._origin def is_available(self) -> bool: return ( self._state != HTTPConnectionState.CLOSED and not self._connection_error and not self._used_all_stream_ids and not (self._h2_state.state_machine.state == h2.connection.ConnectionState.CLOSED) ) def has_expired(self) -> bool: now = time.monotonic() return self._expire_at is not None and now > self._expire_at def is_idle(self) -> bool: return self._state == HTTPConnectionState.IDLE def is_closed(self) -> bool: return self._state == HTTPConnectionState.CLOSED def info(self) -> str: origin = str(self._origin) return f"{origin!r}, HTTP/2, {self._state.name}, Request Count: {self._request_count}" def __repr__(self) -> str: class_name = self.__class__.__name__ origin = str(self._origin) return f"<{class_name} [{origin!r}, {self._state.name}, Request Count: {self._request_count}]>" # These context managers are not used in the standard flow, but are # useful for testing or working with connection instances directly. def __enter__(self) -> HTTP2Connection: return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: self.close() class HTTP2ConnectionByteStream: def __init__(self, connection: HTTP2Connection, request: Request, stream_id: int) -> None: self._connection = connection self._request = request self._stream_id = stream_id self._closed = False def __iter__(self) -> Generator[bytes]: kwargs = {"request": self._request, "stream_id": self._stream_id} try: with Trace("receive_response_body", logger, self._request, kwargs): with safe_iterate( self._connection._receive_response_body(request=self._request, stream_id=self._stream_id) ) as iterator: for chunk in iterator: yield chunk except BaseException as exc: # If we get an exception while streaming the response, # we want to close the response (and possibly the connection) # before raising that exception. with ShieldCancellation(): self.close() raise exc def close(self) -> None: if not self._closed: self._closed = True kwargs = {"stream_id": self._stream_id} with Trace("response_closed", logger, self._request, kwargs): self._connection._response_closed(stream_id=self._stream_id) pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_sync/http_proxy.py000066400000000000000000000334371521723372100256230ustar00rootroot00000000000000from __future__ import annotations import base64 import logging import ssl import typing from .._backends.base import SOCKET_OPTION, NetworkBackend from .._exceptions import ProxyError from .._models import ( URL, Origin, Request, Response, enforce_bytes, enforce_headers, enforce_url, ) from .._ssl import default_ssl_context from .._synchronization import Lock from .._trace import Trace from .connection import HTTPConnection from .connection_pool import ConnectionPool from .http11 import HTTP11Connection from .interfaces import ConnectionInterface ByteOrStr = bytes | str HeadersAsSequence = typing.Sequence[tuple[ByteOrStr, ByteOrStr]] HeadersAsMapping = typing.Mapping[ByteOrStr, ByteOrStr] logger = logging.getLogger("httpcore2.proxy") def merge_headers( default_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, override_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, ) -> list[tuple[bytes, bytes]]: """ Append default_headers and override_headers, de-duplicating if a key exists in both cases. """ default_headers = [] if default_headers is None else list(default_headers) override_headers = [] if override_headers is None else list(override_headers) has_override = set(key.lower() for key, _value in override_headers) default_headers = [(key, value) for key, value in default_headers if key.lower() not in has_override] return default_headers + override_headers class HTTPProxy(ConnectionPool): # pragma: no cover """ A connection pool that sends requests via an HTTP proxy. """ def __init__( self, proxy_url: URL | bytes | str, proxy_auth: tuple[bytes | str, bytes | str] | None = None, proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, ssl_context: ssl.SSLContext | None = None, proxy_ssl_context: ssl.SSLContext | None = None, max_connections: int | None = 10, max_keepalive_connections: int | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, retries: int = 0, local_address: str | None = None, uds: str | None = None, network_backend: NetworkBackend | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> None: """ A connection pool for making HTTP requests. Parameters: proxy_url: The URL to use when connecting to the proxy server. For example `"http://127.0.0.1:8080/"`. proxy_auth: Any proxy authentication as a two-tuple of (username, password). May be either bytes or ascii-only str. proxy_headers: Any HTTP headers to use for the proxy requests. For example `{"Proxy-Authorization": "Basic :"}`. ssl_context: An SSL context to use for verifying connections. If not specified, the default `httpcore2.default_ssl_context()` will be used. proxy_ssl_context: The same as `ssl_context`, but for a proxy server rather than a remote origin. max_connections: The maximum number of concurrent HTTP connections that the pool should allow. Any attempt to send a request on a pool that would exceed this amount will block until a connection is available. max_keepalive_connections: The maximum number of idle HTTP connections that will be maintained in the pool. keepalive_expiry: The duration in seconds that an idle HTTP connection may be maintained for before being expired from the pool. http1: A boolean indicating if HTTP/1.1 requests should be supported by the connection pool. Defaults to True. http2: A boolean indicating if HTTP/2 requests should be supported by the connection pool. Defaults to False. retries: The maximum number of retries when trying to establish a connection. local_address: Local address to connect from. Can also be used to connect using a particular address family. Using `local_address="0.0.0.0"` will connect using an `AF_INET` address (IPv4), while using `local_address="::"` will connect using an `AF_INET6` address (IPv6). uds: Path to a Unix Domain Socket to use instead of TCP sockets. network_backend: A backend instance to use for handling network I/O. """ super().__init__( ssl_context=ssl_context, max_connections=max_connections, max_keepalive_connections=max_keepalive_connections, keepalive_expiry=keepalive_expiry, http1=http1, http2=http2, network_backend=network_backend, retries=retries, local_address=local_address, uds=uds, socket_options=socket_options, ) self._proxy_url = enforce_url(proxy_url, name="proxy_url") if self._proxy_url.scheme == b"http" and proxy_ssl_context is not None: # pragma: no cover raise RuntimeError("The `proxy_ssl_context` argument is not allowed for the http scheme") self._ssl_context = ssl_context self._proxy_ssl_context = proxy_ssl_context self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") if proxy_auth is not None: username = enforce_bytes(proxy_auth[0], name="proxy_auth") password = enforce_bytes(proxy_auth[1], name="proxy_auth") userpass = username + b":" + password authorization = b"Basic " + base64.b64encode(userpass) self._proxy_headers = [(b"Proxy-Authorization", authorization)] + self._proxy_headers def create_connection(self, origin: Origin) -> ConnectionInterface: if origin.scheme == b"http": return ForwardHTTPConnection( proxy_origin=self._proxy_url.origin, proxy_headers=self._proxy_headers, remote_origin=origin, keepalive_expiry=self._keepalive_expiry, network_backend=self._network_backend, proxy_ssl_context=self._proxy_ssl_context, ) return TunnelHTTPConnection( proxy_origin=self._proxy_url.origin, proxy_headers=self._proxy_headers, remote_origin=origin, ssl_context=self._ssl_context, proxy_ssl_context=self._proxy_ssl_context, keepalive_expiry=self._keepalive_expiry, http1=self._http1, http2=self._http2, network_backend=self._network_backend, ) class ForwardHTTPConnection(ConnectionInterface): def __init__( self, proxy_origin: Origin, remote_origin: Origin, proxy_headers: HeadersAsMapping | HeadersAsSequence | None = None, keepalive_expiry: float | None = None, network_backend: NetworkBackend | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, proxy_ssl_context: ssl.SSLContext | None = None, ) -> None: self._connection = HTTPConnection( origin=proxy_origin, keepalive_expiry=keepalive_expiry, network_backend=network_backend, socket_options=socket_options, ssl_context=proxy_ssl_context, ) self._proxy_origin = proxy_origin self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") self._remote_origin = remote_origin def handle_request(self, request: Request) -> Response: headers = merge_headers(self._proxy_headers, request.headers) url = URL( scheme=self._proxy_origin.scheme, host=self._proxy_origin.host, port=self._proxy_origin.port, target=bytes(request.url), ) proxy_request = Request( method=request.method, url=url, headers=headers, content=request.stream, extensions=request.extensions, ) return self._connection.handle_request(proxy_request) def can_handle_request(self, origin: Origin) -> bool: return origin == self._remote_origin def close(self) -> None: self._connection.close() def info(self) -> str: return self._connection.info() def is_available(self) -> bool: return self._connection.is_available() def has_expired(self) -> bool: return self._connection.has_expired() def is_idle(self) -> bool: return self._connection.is_idle() def is_closed(self) -> bool: return self._connection.is_closed() def __repr__(self) -> str: return f"<{self.__class__.__name__} [{self.info()}]>" class TunnelHTTPConnection(ConnectionInterface): def __init__( self, proxy_origin: Origin, remote_origin: Origin, ssl_context: ssl.SSLContext | None = None, proxy_ssl_context: ssl.SSLContext | None = None, proxy_headers: typing.Sequence[tuple[bytes, bytes]] | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, network_backend: NetworkBackend | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> None: self._connection: ConnectionInterface = HTTPConnection( origin=proxy_origin, keepalive_expiry=keepalive_expiry, network_backend=network_backend, socket_options=socket_options, ssl_context=proxy_ssl_context, ) self._proxy_origin = proxy_origin self._remote_origin = remote_origin self._ssl_context = ssl_context self._proxy_ssl_context = proxy_ssl_context self._proxy_headers = enforce_headers(proxy_headers, name="proxy_headers") self._keepalive_expiry = keepalive_expiry self._http1 = http1 self._http2 = http2 self._connect_lock = Lock() self._connected = False def handle_request(self, request: Request) -> Response: timeouts = request.extensions.get("timeout", {}) timeout = timeouts.get("connect", None) with self._connect_lock: if not self._connected: target = b"%b:%d" % (self._remote_origin.host, self._remote_origin.port) connect_url = URL( scheme=self._proxy_origin.scheme, host=self._proxy_origin.host, port=self._proxy_origin.port, target=target, ) connect_headers = merge_headers([(b"Host", target), (b"Accept", b"*/*")], self._proxy_headers) connect_request = Request( method=b"CONNECT", url=connect_url, headers=connect_headers, extensions=request.extensions, ) connect_response = self._connection.handle_request(connect_request) if connect_response.status < 200 or connect_response.status > 299: reason_bytes = connect_response.extensions.get("reason_phrase", b"") reason_str = reason_bytes.decode("ascii", errors="ignore") msg = f"{connect_response.status} {reason_str}" self._connection.close() raise ProxyError(msg) stream = connect_response.extensions["network_stream"] # Upgrade the stream to SSL ssl_context = default_ssl_context() if self._ssl_context is None else self._ssl_context alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] ssl_context.set_alpn_protocols(alpn_protocols) kwargs = { "ssl_context": ssl_context, "server_hostname": self._remote_origin.host.decode("ascii"), "timeout": timeout, } with Trace("start_tls", logger, request, kwargs) as trace: stream = stream.start_tls(**kwargs) trace.return_value = stream # Determine if we should be using HTTP/1.1 or HTTP/2 ssl_object = stream.get_extra_info("ssl_object") http2_negotiated = ssl_object is not None and ssl_object.selected_alpn_protocol() == "h2" # Create the HTTP/1.1 or HTTP/2 connection if http2_negotiated or (self._http2 and not self._http1): from .http2 import HTTP2Connection self._connection = HTTP2Connection( origin=self._remote_origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) else: self._connection = HTTP11Connection( origin=self._remote_origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) self._connected = True return self._connection.handle_request(request) def can_handle_request(self, origin: Origin) -> bool: return origin == self._remote_origin def close(self) -> None: self._connection.close() def info(self) -> str: return self._connection.info() def is_available(self) -> bool: return self._connection.is_available() def has_expired(self) -> bool: return self._connection.has_expired() def is_idle(self) -> bool: return self._connection.is_idle() def is_closed(self) -> bool: return self._connection.is_closed() def __repr__(self) -> str: return f"<{self.__class__.__name__} [{self.info()}]>" pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_sync/interfaces.py000066400000000000000000000104401521723372100255130ustar00rootroot00000000000000from __future__ import annotations import contextlib import typing from collections.abc import Generator from .._models import ( URL, Extensions, HeaderTypes, Origin, Request, Response, enforce_bytes, enforce_headers, enforce_url, include_request_headers, ) class RequestInterface: def request( self, method: bytes | str, url: URL | bytes | str, *, headers: HeaderTypes = None, content: bytes | typing.Iterator[bytes] | None = None, extensions: Extensions | None = None, ) -> Response: # Strict type checking on our parameters. method = enforce_bytes(method, name="method") url = enforce_url(url, name="url") headers = enforce_headers(headers, name="headers") # Include Host header, and optionally Content-Length or Transfer-Encoding. headers = include_request_headers(headers, url=url, content=content) request = Request( method=method, url=url, headers=headers, content=content, extensions=extensions, ) response = self.handle_request(request) try: response.read() finally: response.close() return response @contextlib.contextmanager def stream( self, method: bytes | str, url: URL | bytes | str, *, headers: HeaderTypes = None, content: bytes | typing.Iterator[bytes] | None = None, extensions: Extensions | None = None, ) -> Generator[Response]: # Strict type checking on our parameters. method = enforce_bytes(method, name="method") url = enforce_url(url, name="url") headers = enforce_headers(headers, name="headers") # Include Host header, and optionally Content-Length or Transfer-Encoding. headers = include_request_headers(headers, url=url, content=content) request = Request( method=method, url=url, headers=headers, content=content, extensions=extensions, ) response = self.handle_request(request) try: yield response finally: response.close() def handle_request(self, request: Request) -> Response: raise NotImplementedError() # pragma: no cover class ConnectionInterface(RequestInterface): def close(self) -> None: raise NotImplementedError() # pragma: no cover def info(self) -> str: raise NotImplementedError() # pragma: no cover def can_handle_request(self, origin: Origin) -> bool: raise NotImplementedError() # pragma: no cover def is_available(self) -> bool: """ Return `True` if the connection is currently able to accept an outgoing request. An HTTP/1.1 connection will only be available if it is currently idle. An HTTP/2 connection will be available so long as the stream ID space is not yet exhausted, and the connection is not in an error state. While the connection is being established we may not yet know if it is going to result in an HTTP/1.1 or HTTP/2 connection. The connection should be treated as being available, but might ultimately raise `NewConnectionRequired` required exceptions if multiple requests are attempted over a connection that ends up being established as HTTP/1.1. """ raise NotImplementedError() # pragma: no cover def has_expired(self) -> bool: """ Return `True` if the connection is in a state where it should be closed. This either means that the connection is idle and it has passed the expiry time on its keep-alive, or that server has sent an EOF. """ raise NotImplementedError() # pragma: no cover def is_idle(self) -> bool: """ Return `True` if the connection is currently idle. """ raise NotImplementedError() # pragma: no cover def is_closed(self) -> bool: """ Return `True` if the connection has been closed. Used when a response is closed to determine if the connection may be returned to the connection pool or not. """ raise NotImplementedError() # pragma: no cover pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_sync/socks_proxy.py000066400000000000000000000323041521723372100257560ustar00rootroot00000000000000from __future__ import annotations import logging import ssl import socksio from .._backends.sync import SyncBackend from .._backends.base import NetworkBackend, NetworkStream from .._exceptions import ConnectionNotAvailable, ProxyError from .._models import URL, Origin, Request, Response, enforce_bytes, enforce_url from .._ssl import default_ssl_context from .._synchronization import Lock from .._trace import Trace from .connection_pool import ConnectionPool from .http11 import HTTP11Connection from .interfaces import ConnectionInterface logger = logging.getLogger("httpcore2.socks") AUTH_METHODS = { b"\x00": "NO AUTHENTICATION REQUIRED", b"\x01": "GSSAPI", b"\x02": "USERNAME/PASSWORD", b"\xff": "NO ACCEPTABLE METHODS", } REPLY_CODES = { b"\x00": "Succeeded", b"\x01": "General SOCKS server failure", b"\x02": "Connection not allowed by ruleset", b"\x03": "Network unreachable", b"\x04": "Host unreachable", b"\x05": "Connection refused", b"\x06": "TTL expired", b"\x07": "Command not supported", b"\x08": "Address type not supported", } def _init_socks5_connection( stream: NetworkStream, *, host: bytes, port: int, auth: tuple[bytes, bytes] | None = None, timeouts: dict[str, float | None] | None = None, ) -> None: timeouts = timeouts or {} write_timeout = timeouts.get("write", None) read_timeout = timeouts.get("read", None) conn = socksio.socks5.SOCKS5Connection() # Auth method request auth_method = ( socksio.socks5.SOCKS5AuthMethod.NO_AUTH_REQUIRED if auth is None else socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD ) conn.send(socksio.socks5.SOCKS5AuthMethodsRequest([auth_method])) outgoing_bytes = conn.data_to_send() stream.write(outgoing_bytes, timeout=write_timeout) # Auth method response incoming_bytes = stream.read(max_bytes=4096, timeout=read_timeout) response = conn.receive_data(incoming_bytes) assert isinstance(response, socksio.socks5.SOCKS5AuthReply) if response.method != auth_method: requested = AUTH_METHODS.get(auth_method, "UNKNOWN") responded = AUTH_METHODS.get(response.method, "UNKNOWN") raise ProxyError(f"Requested {requested} from proxy server, but got {responded}.") if response.method == socksio.socks5.SOCKS5AuthMethod.USERNAME_PASSWORD: # Username/password request assert auth is not None username, password = auth conn.send(socksio.socks5.SOCKS5UsernamePasswordRequest(username, password)) outgoing_bytes = conn.data_to_send() stream.write(outgoing_bytes, timeout=write_timeout) # Username/password response incoming_bytes = stream.read(max_bytes=4096, timeout=read_timeout) response = conn.receive_data(incoming_bytes) assert isinstance(response, socksio.socks5.SOCKS5UsernamePasswordReply) if not response.success: raise ProxyError("Invalid username/password") # Connect request conn.send(socksio.socks5.SOCKS5CommandRequest.from_address(socksio.socks5.SOCKS5Command.CONNECT, (host, port))) outgoing_bytes = conn.data_to_send() stream.write(outgoing_bytes, timeout=write_timeout) # Connect response incoming_bytes = stream.read(max_bytes=4096, timeout=read_timeout) response = conn.receive_data(incoming_bytes) assert isinstance(response, socksio.socks5.SOCKS5Reply) if response.reply_code != socksio.socks5.SOCKS5ReplyCode.SUCCEEDED: reply_code = REPLY_CODES.get(response.reply_code, "UNKOWN") raise ProxyError(f"Proxy Server could not connect: {reply_code}.") class SOCKSProxy(ConnectionPool): # pragma: no cover """ A connection pool that sends requests via an HTTP proxy. """ def __init__( self, proxy_url: URL | bytes | str, proxy_auth: tuple[bytes | str, bytes | str] | None = None, ssl_context: ssl.SSLContext | None = None, max_connections: int | None = 10, max_keepalive_connections: int | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, retries: int = 0, network_backend: NetworkBackend | None = None, ) -> None: """ A connection pool for making HTTP requests. Parameters: proxy_url: The URL to use when connecting to the proxy server. For example `"http://127.0.0.1:8080/"`. ssl_context: An SSL context to use for verifying connections. If not specified, the default `httpcore2.default_ssl_context()` will be used. max_connections: The maximum number of concurrent HTTP connections that the pool should allow. Any attempt to send a request on a pool that would exceed this amount will block until a connection is available. max_keepalive_connections: The maximum number of idle HTTP connections that will be maintained in the pool. keepalive_expiry: The duration in seconds that an idle HTTP connection may be maintained for before being expired from the pool. http1: A boolean indicating if HTTP/1.1 requests should be supported by the connection pool. Defaults to True. http2: A boolean indicating if HTTP/2 requests should be supported by the connection pool. Defaults to False. retries: The maximum number of retries when trying to establish a connection. local_address: Local address to connect from. Can also be used to connect using a particular address family. Using `local_address="0.0.0.0"` will connect using an `AF_INET` address (IPv4), while using `local_address="::"` will connect using an `AF_INET6` address (IPv6). uds: Path to a Unix Domain Socket to use instead of TCP sockets. network_backend: A backend instance to use for handling network I/O. """ super().__init__( ssl_context=ssl_context, max_connections=max_connections, max_keepalive_connections=max_keepalive_connections, keepalive_expiry=keepalive_expiry, http1=http1, http2=http2, network_backend=network_backend, retries=retries, ) self._ssl_context = ssl_context self._proxy_url = enforce_url(proxy_url, name="proxy_url") if proxy_auth is not None: username, password = proxy_auth username_bytes = enforce_bytes(username, name="proxy_auth") password_bytes = enforce_bytes(password, name="proxy_auth") self._proxy_auth: tuple[bytes, bytes] | None = ( username_bytes, password_bytes, ) else: self._proxy_auth = None def create_connection(self, origin: Origin) -> ConnectionInterface: return Socks5Connection( proxy_origin=self._proxy_url.origin, remote_origin=origin, proxy_auth=self._proxy_auth, ssl_context=self._ssl_context, keepalive_expiry=self._keepalive_expiry, http1=self._http1, http2=self._http2, network_backend=self._network_backend, ) class Socks5Connection(ConnectionInterface): def __init__( self, proxy_origin: Origin, remote_origin: Origin, proxy_auth: tuple[bytes, bytes] | None = None, ssl_context: ssl.SSLContext | None = None, keepalive_expiry: float | None = None, http1: bool = True, http2: bool = False, network_backend: NetworkBackend | None = None, ) -> None: self._proxy_origin = proxy_origin self._remote_origin = remote_origin self._proxy_auth = proxy_auth self._ssl_context = ssl_context self._keepalive_expiry = keepalive_expiry self._http1 = http1 self._http2 = http2 self._network_backend: NetworkBackend = SyncBackend() if network_backend is None else network_backend self._connect_lock = Lock() self._connection: ConnectionInterface | None = None self._connect_failed = False def handle_request(self, request: Request) -> Response: timeouts = request.extensions.get("timeout", {}) sni_hostname = request.extensions.get("sni_hostname", None) timeout = timeouts.get("connect", None) with self._connect_lock: if self._connection is None: try: # Connect to the proxy kwargs = { "host": self._proxy_origin.host.decode("ascii"), "port": self._proxy_origin.port, "timeout": timeout, } with Trace("connect_tcp", logger, request, kwargs) as trace: stream = self._network_backend.connect_tcp(**kwargs) trace.return_value = stream # Connect to the remote host using socks5 kwargs = { "stream": stream, "host": self._remote_origin.host.decode("ascii"), "port": self._remote_origin.port, "auth": self._proxy_auth, "timeouts": timeouts, } with Trace("setup_socks5_connection", logger, request, kwargs) as trace: _init_socks5_connection(**kwargs) trace.return_value = stream # Upgrade the stream to SSL if self._remote_origin.scheme == b"https": ssl_context = default_ssl_context() if self._ssl_context is None else self._ssl_context alpn_protocols = ["http/1.1", "h2"] if self._http2 else ["http/1.1"] ssl_context.set_alpn_protocols(alpn_protocols) kwargs = { "ssl_context": ssl_context, "server_hostname": sni_hostname or self._remote_origin.host.decode("ascii"), "timeout": timeout, } with Trace("start_tls", logger, request, kwargs) as trace: stream = stream.start_tls(**kwargs) trace.return_value = stream # Determine if we should be using HTTP/1.1 or HTTP/2 ssl_object = stream.get_extra_info("ssl_object") http2_negotiated = ssl_object is not None and ssl_object.selected_alpn_protocol() == "h2" # Create the HTTP/1.1 or HTTP/2 connection if http2_negotiated or (self._http2 and not self._http1): # pragma: no cover from .http2 import HTTP2Connection self._connection = HTTP2Connection( origin=self._remote_origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) else: self._connection = HTTP11Connection( origin=self._remote_origin, stream=stream, keepalive_expiry=self._keepalive_expiry, ) except Exception as exc: self._connect_failed = True raise exc elif not self._connection.is_available(): # pragma: no cover raise ConnectionNotAvailable() return self._connection.handle_request(request) def can_handle_request(self, origin: Origin) -> bool: return origin == self._remote_origin def close(self) -> None: if self._connection is not None: self._connection.close() def is_available(self) -> bool: if self._connection is None: # pragma: no cover # If HTTP/2 support is enabled, and the resulting connection could # end up as HTTP/2 then we should indicate the connection as being # available to service multiple requests. return ( self._http2 and (self._remote_origin.scheme == b"https" or not self._http1) and not self._connect_failed ) return self._connection.is_available() def has_expired(self) -> bool: if self._connection is None: # pragma: no cover return self._connect_failed return self._connection.has_expired() def is_idle(self) -> bool: if self._connection is None: # pragma: no cover return self._connect_failed return self._connection.is_idle() def is_closed(self) -> bool: if self._connection is None: # pragma: no cover return self._connect_failed return self._connection.is_closed() def info(self) -> str: if self._connection is None: # pragma: no cover return "CONNECTION FAILED" if self._connect_failed else "CONNECTING" return self._connection.info() def __repr__(self) -> str: return f"<{self.__class__.__name__} [{self.info()}]>" pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_synchronization.py000066400000000000000000000222361521723372100256630ustar00rootroot00000000000000from __future__ import annotations import threading import types from ._exceptions import ExceptionMapping, PoolTimeout, map_exceptions # Our async synchronization primitives use either 'anyio' or 'trio' depending # on if they're running under asyncio or trio. try: import trio except (ImportError, NotImplementedError): # pragma: no cover trio = None # type: ignore try: import anyio except ImportError: # pragma: no cover anyio = None # type: ignore def current_async_library() -> str: # Determine if we're running under trio or asyncio. # See https://sniffio.readthedocs.io/en/latest/ try: import sniffio except ImportError: # pragma: no cover environment = "asyncio" else: environment = sniffio.current_async_library() if environment not in ("asyncio", "trio"): # pragma: no cover raise RuntimeError("Running under an unsupported async environment.") if environment == "asyncio" and anyio is None: # pragma: no cover raise RuntimeError("Running with asyncio requires installation of 'httpcore[asyncio]'.") if environment == "trio" and trio is None: # pragma: no cover raise RuntimeError("Running with trio requires installation of 'httpcore[trio]'.") return environment class AsyncLock: """ This is a standard lock. In the sync case `Lock` provides thread locking. In the async case `AsyncLock` provides async locking. """ def __init__(self) -> None: self._backend = "" def setup(self) -> None: """ Detect if we're running under 'asyncio' or 'trio' and create a lock with the correct implementation. """ self._backend = current_async_library() if self._backend == "trio": self._trio_lock = trio.Lock() elif self._backend == "asyncio": self._anyio_lock = anyio.Lock(fast_acquire=True) async def __aenter__(self) -> AsyncLock: if not self._backend: self.setup() if self._backend == "trio": await self._trio_lock.acquire() elif self._backend == "asyncio": await self._anyio_lock.acquire() return self async def __aexit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: if self._backend == "trio": self._trio_lock.release() elif self._backend == "asyncio": self._anyio_lock.release() class AsyncThreadLock: """ This is a threading-only lock for no-I/O contexts. In the sync case `ThreadLock` provides thread locking. In the async case `AsyncThreadLock` is a no-op. """ def __enter__(self) -> AsyncThreadLock: return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: pass class AsyncEvent: def __init__(self) -> None: self._backend = "" def setup(self) -> None: """ Detect if we're running under 'asyncio' or 'trio' and create a lock with the correct implementation. """ self._backend = current_async_library() if self._backend == "trio": self._trio_event = trio.Event() elif self._backend == "asyncio": self._anyio_event = anyio.Event() def set(self) -> None: if not self._backend: self.setup() if self._backend == "trio": self._trio_event.set() elif self._backend == "asyncio": self._anyio_event.set() async def wait(self, timeout: float | None = None) -> None: if not self._backend: self.setup() if self._backend == "trio": trio_exc_map: ExceptionMapping = {trio.TooSlowError: PoolTimeout} timeout_or_inf = float("inf") if timeout is None else timeout with map_exceptions(trio_exc_map): with trio.fail_after(timeout_or_inf): await self._trio_event.wait() elif self._backend == "asyncio": anyio_exc_map: ExceptionMapping = {TimeoutError: PoolTimeout} with map_exceptions(anyio_exc_map): with anyio.fail_after(timeout): await self._anyio_event.wait() class AsyncSemaphore: def __init__(self, bound: int) -> None: self._bound = bound self._backend = "" def setup(self) -> None: """ Detect if we're running under 'asyncio' or 'trio' and create a semaphore with the correct implementation. """ self._backend = current_async_library() if self._backend == "trio": self._trio_semaphore = trio.Semaphore(initial_value=self._bound, max_value=self._bound) elif self._backend == "asyncio": self._anyio_semaphore = anyio.Semaphore(initial_value=self._bound, max_value=self._bound, fast_acquire=True) async def acquire(self) -> None: if not self._backend: self.setup() if self._backend == "trio": await self._trio_semaphore.acquire() elif self._backend == "asyncio": await self._anyio_semaphore.acquire() async def release(self) -> None: if self._backend == "trio": self._trio_semaphore.release() elif self._backend == "asyncio": self._anyio_semaphore.release() class AsyncShieldCancellation: # For certain portions of our codebase where we're dealing with # closing connections during exception handling we want to shield # the operation from being cancelled. # # with AsyncShieldCancellation(): # ... # clean-up operations, shielded from cancellation. def __init__(self) -> None: """ Detect if we're running under 'asyncio' or 'trio' and create a shielded scope with the correct implementation. """ self._backend = current_async_library() if self._backend == "trio": self._trio_shield = trio.CancelScope(shield=True) elif self._backend == "asyncio": self._anyio_shield = anyio.CancelScope(shield=True) def __enter__(self) -> AsyncShieldCancellation: if self._backend == "trio": self._trio_shield.__enter__() elif self._backend == "asyncio": self._anyio_shield.__enter__() return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: if self._backend == "trio": self._trio_shield.__exit__(exc_type, exc_value, traceback) elif self._backend == "asyncio": self._anyio_shield.__exit__(exc_type, exc_value, traceback) # Our thread-based synchronization primitives... class Lock: """ This is a standard lock. In the sync case `Lock` provides thread locking. In the async case `AsyncLock` provides async locking. """ def __init__(self) -> None: self._lock = threading.Lock() def __enter__(self) -> Lock: self._lock.acquire() return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: self._lock.release() class ThreadLock: """ This is a threading-only lock for no-I/O contexts. In the sync case `ThreadLock` provides thread locking. In the async case `AsyncThreadLock` is a no-op. """ def __init__(self) -> None: self._lock = threading.RLock() def __enter__(self) -> ThreadLock: self._lock.acquire() return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: self._lock.release() class Event: def __init__(self) -> None: self._event = threading.Event() def set(self) -> None: self._event.set() def wait(self, timeout: float | None = None) -> None: if timeout == float("inf"): # pragma: no cover timeout = None if not self._event.wait(timeout=timeout): raise PoolTimeout() # pragma: no cover class Semaphore: def __init__(self, bound: int) -> None: self._semaphore = threading.Semaphore(value=bound) def acquire(self) -> None: self._semaphore.acquire() def release(self) -> None: self._semaphore.release() class ShieldCancellation: # Thread-synchronous codebases don't support cancellation semantics. # We have this class because we need to mirror the async and sync # cases within our package, but it's just a no-op. def __enter__(self) -> ShieldCancellation: return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: pass pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_trace.py000066400000000000000000000075301521723372100235200ustar00rootroot00000000000000from __future__ import annotations import inspect import logging import types import typing from ._models import Request class Trace: def __init__( self, name: str, logger: logging.Logger, request: Request | None = None, kwargs: dict[str, typing.Any] | None = None, ) -> None: self.name = name self.logger = logger self.trace_extension = None if request is None else request.extensions.get("trace") self.debug = self.logger.isEnabledFor(logging.DEBUG) self.kwargs = kwargs or {} self.return_value: typing.Any = None self.should_trace = self.debug or self.trace_extension is not None self.prefix = self.logger.name.split(".")[-1] def trace(self, name: str, info: dict[str, typing.Any]) -> None: if self.trace_extension is not None: prefix_and_name = f"{self.prefix}.{name}" ret = self.trace_extension(prefix_and_name, info) if inspect.iscoroutine(ret): # pragma: no cover raise TypeError( "If you are using a synchronous interface, " "the callback of the `trace` extension should " "be a normal function instead of an asynchronous function." ) if self.debug: if not info or "return_value" in info and info["return_value"] is None: message = name else: args = " ".join([f"{key}={value!r}" for key, value in info.items()]) message = f"{name} {args}" self.logger.debug(message) def __enter__(self) -> Trace: if self.should_trace: info = self.kwargs self.trace(f"{self.name}.started", info) return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: if self.should_trace: if exc_value is None: info = {"return_value": self.return_value} self.trace(f"{self.name}.complete", info) else: info = {"exception": exc_value} self.trace(f"{self.name}.failed", info) async def atrace(self, name: str, info: dict[str, typing.Any]) -> None: if self.trace_extension is not None: prefix_and_name = f"{self.prefix}.{name}" coro = self.trace_extension(prefix_and_name, info) if not inspect.iscoroutine(coro): # pragma: no cover raise TypeError( "If you're using an asynchronous interface, " "the callback of the `trace` extension should " "be an asynchronous function rather than a normal function." ) await coro if self.debug: if not info or "return_value" in info and info["return_value"] is None: message = name else: args = " ".join([f"{key}={value!r}" for key, value in info.items()]) message = f"{name} {args}" self.logger.debug(message) async def __aenter__(self) -> Trace: if self.should_trace: info = self.kwargs await self.atrace(f"{self.name}.started", info) return self async def __aexit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: types.TracebackType | None = None, ) -> None: if self.should_trace: if exc_value is None: info = {"return_value": self.return_value} await self.atrace(f"{self.name}.complete", info) else: info = {"exception": exc_value} await self.atrace(f"{self.name}.failed", info) pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/_utils.py000066400000000000000000000047401521723372100235620ustar00rootroot00000000000000from __future__ import annotations import select import socket import sys import typing from collections.abc import ( AsyncGenerator, AsyncIterable, AsyncIterator, Generator, Iterable, Iterator, ) from contextlib import asynccontextmanager, contextmanager from inspect import isasyncgen T = typing.TypeVar("T") def is_socket_readable(sock: socket.socket | None) -> bool: """ Return whether a socket, as identified by its file descriptor, is readable. "A socket is readable" means that the read buffer isn't empty, i.e. that calling .recv() on it would immediately return some data. """ # NOTE: we want check for readability without actually attempting to read, because # we don't want to block forever if it's not readable. # In the case that the socket no longer exists, or cannot return a file # descriptor, we treat it as being readable, as if it the next read operation # on it is ready to return the terminating `b""`. sock_fd = None if sock is None else sock.fileno() if sock_fd is None or sock_fd < 0: # pragma: no cover return True # The implementation below was stolen from: # https://github.com/python-trio/trio/blob/20ee2b1b7376db637435d80e266212a35837ddcc/trio/_socket.py#L471-L478 # See also: https://github.com/encode/httpcore/pull/193#issuecomment-703129316 # Use select.select on Windows, and when poll is unavailable and select.poll # everywhere else. (E.g. When eventlet is in use. See #327) if sys.platform == "win32" or getattr(select, "poll", None) is None: # pragma: no cover rready, _, _ = select.select([sock_fd], [], [], 0) return bool(rready) p = select.poll() p.register(sock_fd, select.POLLIN) return bool(p.poll(0)) @asynccontextmanager async def safe_async_iterate( iterable_or_iterator: AsyncIterable[T] | AsyncIterator[T], / ) -> AsyncGenerator[AsyncIterator[T]]: iterator = ( iterable_or_iterator if isinstance(iterable_or_iterator, AsyncIterator) else iterable_or_iterator.__aiter__() ) try: yield iterator finally: if isasyncgen(iterator): await iterator.aclose() @contextmanager def safe_iterate(iterable_or_iterator: Iterable[T] | Iterator[T], /) -> Generator[Iterator[T], None, None]: # This is boilerplate code, only needed to make unasync happy iterator = iterable_or_iterator if isinstance(iterable_or_iterator, Iterator) else iterable_or_iterator.__iter__() yield iterator pydantic-httpx2-9b7ee8e/src/httpcore2/httpcore2/py.typed000066400000000000000000000000001521723372100233710ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpcore2/mkdocs.yml000066400000000000000000000015051521723372100217760ustar00rootroot00000000000000site_name: HTTPCore site_description: A minimal HTTP client for Python. site_url: https://www.encode.io/httpcore/ repo_name: encode/httpcore repo_url: https://github.com/encode/httpcore/ nav: - Introduction: 'index.md' - Quickstart: 'quickstart.md' - Connection Pools: 'connection-pools.md' - Proxies: 'proxies.md' - HTTP/2: 'http2.md' - Async Support: 'async.md' - Network Backends: 'network-backends.md' - Extensions: 'extensions.md' - Logging: 'logging.md' - Exceptions: 'exceptions.md' theme: name: "material" plugins: - search - mkdocstrings: default_handler: python watch: - httpcore handlers: python: members_order: - "source" markdown_extensions: - codehilite: css_class: highlight pydantic-httpx2-9b7ee8e/src/httpcore2/pyproject.toml000066400000000000000000000040171521723372100227100ustar00rootroot00000000000000[build-system] requires = [ "hatchling", "hatch-fancy-pypi-readme", "uv-dynamic-versioning>=0.8.0", ] build-backend = "hatchling.build" [tool.hatch.version] source = "uv-dynamic-versioning" [tool.uv-dynamic-versioning] vcs = "git" style = "pep440" bump = true fallback-version = "0.0.0" [project] name = "httpcore2" dynamic = ["readme", "version"] description = "A minimal low-level HTTP client." license = "BSD-3-Clause" requires-python = ">=3.10" authors = [{ name = "Tom Christie", email = "tom@tomchristie.com" }] maintainers = [ { name = "Pydantic Services Inc.", email = "engineering@pydantic.dev" }, ] classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: AnyIO", "Framework :: AsyncIO", "Framework :: Trio", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", ] dependencies = ["truststore>=0.10", "h11>=0.16"] [project.optional-dependencies] http2 = ["h2>=3,<5"] socks = ["socksio==1.*"] trio = ["trio>=0.22.0,<1.0"] asyncio = ["anyio>=4.5.0,<5.0"] [project.urls] Changelog = "https://github.com/pydantic/httpx2/blob/main/src/httpcore2/CHANGELOG.md" Homepage = "https://github.com/pydantic/httpx2" Source = "https://github.com/pydantic/httpx2/blob/main/src/httpcore2" [tool.hatch.build.targets.sdist] include = ["/httpcore2", "/CHANGELOG.md", "/LICENSE.md", "/README.md", "/tests"] [tool.hatch.metadata.hooks.fancy-pypi-readme] content-type = "text/markdown" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] path = "README.md" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] path = "CHANGELOG.md" pydantic-httpx2-9b7ee8e/src/httpx2/000077500000000000000000000000001521723372100173115ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpx2/CHANGELOG.md000066400000000000000000001572521521723372100211360ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## 2.5.0 (June 25th, 2026) ### Added * Add native server-sent events support via `client.sse()`. ([#1046](https://github.com/pydantic/httpx2/pull/1046)) * Support `|` and `|=` operators for `Headers`. ([#1047](https://github.com/pydantic/httpx2/pull/1047)) ### Fixed * Allow IPv6 CIDR notation in `no_proxy`. ([#967](https://github.com/pydantic/httpx2/pull/967)) ## 2.4.0 (June 11th, 2026) ### Added * Add `HTTPXDeprecationWarning`, a `UserWarning` subclass shown by default so deprecations are visible without enabling warnings. ([#1029](https://github.com/pydantic/httpx2/pull/1029)) ### Changed * Limit the number of chained `Content-Encoding` decoders to 5. ([#1027](https://github.com/pydantic/httpx2/pull/1027)) * Allow version 15 of `rich` in the `cli` extra. ([#1015](https://github.com/pydantic/httpx2/pull/1015)) ### Fixed * Parse an empty `Digest` auth realm without crashing. ([#1023](https://github.com/pydantic/httpx2/pull/1023)) * Decode IDNA labels in non-leading host positions. ([#1018](https://github.com/pydantic/httpx2/pull/1018)) ## 2.3.0 (June 1st, 2026) ### Changed * Use `truststore` instead of `certifi` for default SSL verification, loading the operating system's trust store. ([#209](https://github.com/pydantic/httpx2/pull/209)) ### Fixed * Raise when `verify` is a string path and a client-side `cert` is also provided to `create_ssl_context`. ([#990](https://github.com/pydantic/httpx2/pull/990)) * Allow a `default_encoding` callable to return `None`. ([#951](https://github.com/pydantic/httpx2/pull/951)) * Make the `zstd` import optional on Python 3.14. ([#1000](https://github.com/pydantic/httpx2/pull/1000)) * Store elapsed time on the stream wrapper to avoid reference cycles. ([#948](https://github.com/pydantic/httpx2/pull/948)) ## 2.2.0 (May 16th, 2026) ### Fixed * Handle multi-frame zstd streams split across chunks. ([#946](https://github.com/pydantic/httpx2/pull/946)) ### Changed * Lazily import the `_main` CLI module to speed up `import httpx2`. ([#947](https://github.com/pydantic/httpx2/pull/947)) ## 2.1.0 (May 15th, 2026) ### Removed * Drop support for Python 3.9. ([#208](https://github.com/pydantic/httpx2/pull/208)) ### Added * Add support for Python 3.14. ([#208](https://github.com/pydantic/httpx2/pull/208)) * Use stdlib `compression.zstd` for Zstd decompression on Python 3.14+; fall back to the `zstandard` package on older versions. ([#932](https://github.com/pydantic/httpx2/pull/932)) * Bundle `LICENSE.md` in the sdist. ([#938](https://github.com/pydantic/httpx2/pull/938)) ## 2.0.0 Official first release of `httpx2`. No changes since `2.0.0b1`. ## 2.0.0b1 First release of `httpx2`, a fork of [`httpx`](https://github.com/encode/httpx) maintained by Pydantic. Forked from `httpx 0.28.1` (commit [`b5addb6`](https://github.com/encode/httpx/commit/b5addb6)). ### Breaking changes * **Renamed package**: `httpx` -> `httpx2`. `import httpx` becomes `import httpx2`. The CLI is now `httpx2`, the User-Agent header is `python-httpx2/`, and the logger is `httpx2`. No other public API changed. * **Renamed transitive dependency**: `httpcore` -> `httpcore2`, vendored into the same repository as a uv workspace member. Code that imports `httpcore` directly should switch to `httpcore2`. `httpx2` always depends on a specific `httpcore2` version, pinned exactly. ### Added * Expose `FunctionAuth` from the public API. (Inherited from upstream PR [encode/httpx#3699](https://github.com/encode/httpx/pull/3699).) ### Fixed * Eliminate `PytestUnraisableExceptionWarning` from async generator finalization during stream teardown under trio. ([#137](https://github.com/pydantic/httpx2/pull/137), backporting [encode/httpcore#1019](https://github.com/encode/httpcore/pull/1019) by @agronholm.) --- Historical entries below are from upstream `encode/httpx`. ## 0.28.1 (6th December, 2024) * Fix SSL case where `verify=False` together with client side certificates. ## 0.28.0 (28th November, 2024) Be aware that the default *JSON request bodies now use a more compact representation*. This is generally considered a preferred style, tho may require updates to test suites. The 0.28 release includes a limited set of deprecations... **Deprecations**: We are working towards a simplified SSL configuration API. *For users of the standard `verify=True` or `verify=False` cases, or `verify=` case this should require no changes. The following cases have been deprecated...* * The `verify` argument as a string argument is now deprecated and will raise warnings. * The `cert` argument is now deprecated and will raise warnings. Our revised [SSL documentation](docs/advanced/ssl.md) covers how to implement the same behaviour with a more constrained API. **The following changes are also included**: * The deprecated `proxies` argument has now been removed. * The deprecated `app` argument has now been removed. * JSON request bodies use a compact representation. (#3363) * Review URL percent escape sets, based on WHATWG spec. (#3371, #3373) * Ensure `certifi` and `httpcore` are only imported if required. (#3377) * Treat `socks5h` as a valid proxy scheme. (#3178) * Cleanup `Request()` method signature in line with `client.request()` and `httpx.request()`. (#3378) * Bugfix: When passing `params={}`, always strictly update rather than merge with an existing querystring. (#3364) ## 0.27.2 (27th August, 2024) ### Fixed * Reintroduced supposedly-private `URLTypes` shortcut. (#2673) ## 0.27.1 (27th August, 2024) ### Added * Support for `zstd` content decoding using the python `zstandard` package is added. Installable using `httpx[zstd]`. (#3139) ### Fixed * Improved error messaging for `InvalidURL` exceptions. (#3250) * Fix `app` type signature in `ASGITransport`. (#3109) ## 0.27.0 (21st February, 2024) ### Deprecated * The `app=...` shortcut has been deprecated. Use the explicit style of `transport=httpx.WSGITransport()` or `transport=httpx.ASGITransport()` instead. ### Fixed * Respect the `http1` argument while configuring proxy transports. (#3023) * Fix RFC 2069 mode digest authentication. (#3045) ## 0.26.0 (20th December, 2023) ### Added * The `proxy` argument was added. You should use the `proxy` argument instead of the deprecated `proxies`, or use `mounts=` for more complex configurations. (#2879) ### Deprecated * The `proxies` argument is now deprecated. It will still continue to work, but it will be removed in the future. (#2879) ### Fixed * Fix cases of double escaping of URL path components. Allow / as a safe character in the query portion. (#2990) * Handle `NO_PROXY` envvar cases when a fully qualified URL is supplied as the value. (#2741) * Allow URLs where username or password contains unescaped '@'. (#2986) * Ensure ASGI `raw_path` does not include URL query component. (#2999) * Ensure `Response.iter_text()` cannot yield empty strings. (#2998) ## 0.25.2 (24th November, 2023) ### Added * Add missing type hints to few `__init__()` methods. (#2938) ## 0.25.1 (3rd November, 2023) ### Added * Add support for Python 3.12. (#2854) * Add support for httpcore 1.0 (#2885) ### Fixed * Raise `ValueError` on `Response.encoding` being set after `Response.text` has been accessed. (#2852) ## 0.25.0 (11th September, 2023) ### Removed * Drop support for Python 3.7. (#2813) ### Added * Support HTTPS proxies. (#2845) * Change the type of `Extensions` from `Mapping[Str, Any]` to `MutableMapping[Str, Any]`. (#2803) * Add `socket_options` argument to `httpx.HTTPTransport` and `httpx.AsyncHTTPTransport` classes. (#2716) * The `Response.raise_for_status()` method now returns the response instance. For example: `data = httpx.get('...').raise_for_status().json()`. (#2776) ### Fixed * Return `500` error response instead of exceptions when `raise_app_exceptions=False` is set on `ASGITransport`. (#2669) * Ensure all `WSGITransport` environs have a `SERVER_PROTOCOL`. (#2708) * Always encode forward slashes as `%2F` in query parameters (#2723) * Use Mozilla documentation instead of `httpstatuses.com` for HTTP error reference (#2768) ## 0.24.1 (17th May, 2023) ### Added * Provide additional context in some `InvalidURL` exceptions. (#2675) ### Fixed * Fix optional percent-encoding behaviour. (#2671) * More robust checking for opening upload files in binary mode. (#2630) * Properly support IP addresses in `NO_PROXY` environment variable. (#2659) * Set default file for `NetRCAuth()` to `None` to use the stdlib default. (#2667) * Set logging request lines to INFO level for async requests, in line with sync requests. (#2656) * Fix which gen-delims need to be escaped for path/query/fragment components in URL. (#2701) ## 0.24.0 (6th April, 2023) ### Changed * The logging behaviour has been changed to be more in-line with other standard Python logging usages. We no longer have a custom `TRACE` log level, and we no longer use the `HTTPX_LOG_LEVEL` environment variable to auto-configure logging. We now have a significant amount of `DEBUG` logging available at the network level. Full documentation is available at https://www.python-httpx.org/logging/ (#2547, encode/httpcore#648) * The `Response.iter_lines()` method now matches the stdlib behaviour and does not include the newline characters. It also resolves a performance issue. (#2423) * Query parameter encoding switches from using + for spaces and %2F for forward slash, to instead using %20 for spaces and treating forward slash as a safe, unescaped character. This differs from `requests`, but is in line with browser behavior in Chrome, Safari, and Firefox. Both options are RFC valid. (#2543) * NetRC authentication is no longer automatically handled, but is instead supported by an explicit `httpx.NetRCAuth()` authentication class. See the documentation at https://www.python-httpx.org/advanced/authentication/#netrc-authentication (#2525) ### Removed * The `rfc3986` dependency has been removed. (#2252) ## 0.23.3 (4th January, 2023) ### Fixed * Version 0.23.2 accidentally included stricter type checking on query parameters. This shouldn've have been included in a minor version bump, and is now reverted. (#2523, #2539) ## 0.23.2 (2nd January, 2023) ### Added * Support digest auth nonce counting to avoid multiple auth requests. (#2463) ### Fixed * Multipart file uploads where the file length cannot be determine now use chunked transfer encoding, rather than loading the entire file into memory in order to determine the `Content-Length`. (#2382) * Raise `TypeError` if content is passed a dict-instance. (#2495) * Partially revert the API breaking change in 0.23.1, which removed `RawURL`. We continue to expose a `url.raw` property which is now a plain named-tuple. This API is still expected to be deprecated, but we will do so with a major version bump. (#2481) ## 0.23.1 (18th November, 2022) **Note**: The 0.23.1 release should have used a proper version bump, rather than a minor point release. There are API surface area changes that may affect some users. See the "Removed" section of these release notes for details. ### Added * Support for Python 3.11. (#2420) * Allow setting an explicit multipart boundary in `Content-Type` header. (#2278) * Allow `tuple` or `list` for multipart values, not just `list`. (#2355) * Allow `str` content for multipart upload files. (#2400) * Support connection upgrades. See https://www.encode.io/httpcore/extensions/#upgrade-requests ### Fixed * Don't drop empty query parameters. (#2354) ### Removed * Upload files *must* always be opened in binary mode. (#2400) * Drop `.read`/`.aread` from `SyncByteStream`/`AsyncByteStream`. (#2407) * Drop `RawURL`. (#2241) ## 0.23.0 (23rd May, 2022) ### Changed * Drop support for Python 3.6. (#2097) * Use `utf-8` as the default character set, instead of falling back to `charset-normalizer` for auto-detection. To enable automatic character set detection, see [the documentation](https://www.python-httpx.org/advanced/text-encodings/#using-auto-detection). (#2165) ### Fixed * Fix `URL.copy_with` for some oddly formed URL cases. (#2185) * Digest authentication should use case-insensitive comparison for determining which algorithm is being used. (#2204) * Fix console markup escaping in command line client. (#1866) * When files are used in multipart upload, ensure we always seek to the start of the file. (#2065) * Ensure that `iter_bytes` never yields zero-length chunks. (#2068) * Preserve `Authorization` header for redirects that are to the same origin, but are an `http`-to-`https` upgrade. (#2074) * When responses have binary output, don't print the output to the console in the command line client. Use output like `<16086 bytes of binary data>` instead. (#2076) * Fix display of `--proxies` argument in the command line client help. (#2125) * Close responses when task cancellations occur during stream reading. (#2156) * Fix type error on accessing `.request` on `HTTPError` exceptions. (#2158) ## 0.22.0 (26th January, 2022) ### Added * Support for [the SOCKS5 proxy protocol](https://www.python-httpx.org/advanced/proxies/#socks) via [the `socksio` package](https://github.com/sethmlarson/socksio). (#2034) * Support for custom headers in multipart/form-data requests (#1936) ### Fixed * Don't perform unreliable close/warning on `__del__` with unclosed clients. (#2026) * Fix `Headers.update(...)` to correctly handle repeated headers (#2038) ## 0.21.3 (6th January, 2022) ### Fixed * Fix streaming uploads using `SyncByteStream` or `AsyncByteStream`. Regression in 0.21.2. (#2016) ## 0.21.2 (5th January, 2022) ### Fixed * HTTP/2 support for tunnelled proxy cases. (#2009) * Improved the speed of large file uploads. (#1948) ## 0.21.1 (16th November, 2021) ### Fixed * The `response.url` property is now correctly annotated as `URL`, instead of `Optional[URL]`. (#1940) ## 0.21.0 (15th November, 2021) The 0.21.0 release integrates against a newly redesigned `httpcore` backend. Both packages ought to automatically update to the required versions, but if you are seeing any issues, you should ensure that you have `httpx==0.21.*` and `httpcore==0.14.*` installed. ### Added * The command-line client will now display connection information when `-v/--verbose` is used. * The command-line client will now display server certificate information when `-v/--verbose` is used. * The command-line client is now able to properly detect if the outgoing request should be formatted as HTTP/1.1 or HTTP/2, based on the result of the HTTP/2 negotiation. ### Removed * Curio support is no longer currently included. Please get in touch if you require this, so that we can assess priorities. ## 0.20.0 (13th October, 2021) The 0.20.0 release adds an integrated command-line client, and also includes some design changes. The most notable of these is that redirect responses are no longer automatically followed, unless specifically requested. This design decision prioritises a more explicit approach to redirects, in order to avoid code that unintentionally issues multiple requests as a result of misconfigured URLs. For example, previously a client configured to send requests to `http://api.github.com/` would end up sending every API request twice, as each request would be redirected to `https://api.github.com/`. If you do want auto-redirect behaviour, you can enable this either by configuring the client instance with `Client(follow_redirects=True)`, or on a per-request basis, with `.get(..., follow_redirects=True)`. This change is a classic trade-off between convenience and precision, with no "right" answer. See [discussion #1785](https://github.com/encode/httpx/discussions/1785) for more context. The other major design change is an update to the Transport API, which is the low-level interface against which requests are sent. Previously this interface used only primitive datastructures, like so... ```python (status_code, headers, stream, extensions) = transport.handle_request(method, url, headers, stream, extensions) try ... finally: stream.close() ``` Now the interface is much simpler... ```python response = transport.handle_request(request) try ... finally: response.close() ``` ### Changed * The `allow_redirects` flag is now `follow_redirects` and defaults to `False`. * The `raise_for_status()` method will now raise an exception for any responses except those with 2xx status codes. Previously only 4xx and 5xx status codes would result in an exception. * The low-level transport API changes to the much simpler `response = transport.handle_request(request)`. * The `client.send()` method no longer accepts a `timeout=...` argument, but the `client.build_request()` does. This required by the signature change of the Transport API. The request timeout configuration is now stored on the request instance, as `request.extensions['timeout']`. ### Added * Added the `httpx` command-line client. * Response instances now include `.is_informational`, `.is_success`, `.is_redirect`, `.is_client_error`, and `.is_server_error` properties for checking 1xx, 2xx, 3xx, 4xx, and 5xx response types. Note that the behaviour of `.is_redirect` is slightly different in that it now returns True for all 3xx responses, in order to allow for a consistent set of properties onto the different HTTP status code types. The `response.has_redirect_location` location may be used to determine responses with properly formed URL redirects. ### Fixed * `response.iter_bytes()` no longer raises a ValueError when called on a response with no content. (Pull #1827) * The `'wsgi.error'` configuration now defaults to `sys.stderr`, and is corrected to be a `TextIO` interface, not a `BytesIO` interface. Additionally, the WSGITransport now accepts a `wsgi_error` configuration. (Pull #1828) * Follow the WSGI spec by properly closing the iterable returned by the application. (Pull #1830) ## 0.19.0 (19th August, 2021) ### Added * Add support for `Client(allow_redirects=)`. (Pull #1790) * Add automatic character set detection, when no `charset` is included in the response `Content-Type` header. (Pull #1791) ### Changed * Event hooks are now also called for any additional redirect or auth requests/responses. (Pull #1806) * Strictly enforce that upload files must be opened in binary mode. (Pull #1736) * Strictly enforce that client instances can only be opened and closed once, and cannot be re-opened. (Pull #1800) * Drop `mode` argument from `httpx.Proxy(..., mode=...)`. (Pull #1795) ## 0.18.2 (17th June, 2021) ### Added * Support for Python 3.10. (Pull #1687) * Expose `httpx.USE_CLIENT_DEFAULT`, used as the default to `auth` and `timeout` parameters in request methods. (Pull #1634) * Support [HTTP/2 "prior knowledge"](https://python-hyper.org/projects/hyper-h2/en/v2.3.1/negotiating-http2.html#prior-knowledge), using `httpx.Client(http1=False, http2=True)`. (Pull #1624) ### Fixed * Clean up some cases where warnings were being issued. (Pull #1687) * Prefer Content-Length over Transfer-Encoding: chunked for content= cases. (Pull #1619) ## 0.18.1 (29th April, 2021) ### Changed * Update brotli support to use the `brotlicffi` package (Pull #1605) * Ensure that `Request(..., stream=...)` does not auto-generate any headers on the request instance. (Pull #1607) ### Fixed * Pass through `timeout=...` in top-level httpx.stream() function. (Pull #1613) * Map httpcore transport close exceptions to httpx exceptions. (Pull #1606) ## 0.18.0 (27th April, 2021) The 0.18.x release series formalises our low-level Transport API, introducing the base classes `httpx.BaseTransport` and `httpx.AsyncBaseTransport`. See the "[Custom transports](https://www.python-httpx.org/advanced/transports/#custom-transports)" documentation and the [`httpx.BaseTransport.handle_request()`](https://github.com/encode/httpx/blob/397aad98fdc8b7580a5fc3e88f1578b4302c6382/httpx/_transports/base.py#L77-L147) docstring for more complete details on implementing custom transports. Pull request #1522 includes a checklist of differences from the previous `httpcore` transport API, for developers implementing custom transports. The following API changes have been issuing deprecation warnings since 0.17.0 onwards, and are now fully deprecated... * You should now use httpx.codes consistently instead of httpx.StatusCodes. * Use limits=... instead of pool_limits=.... * Use proxies={"http://": ...} instead of proxies={"http": ...} for scheme-specific mounting. ### Changed * Transport instances now inherit from `httpx.BaseTransport` or `httpx.AsyncBaseTransport`, and should implement either the `handle_request` method or `handle_async_request` method. (Pull #1522, #1550) * The `response.ext` property and `Response(ext=...)` argument are now named `extensions`. (Pull #1522) * The recommendation to not use `data=` in favour of `content=` has now been escalated to a deprecation warning. (Pull #1573) * Drop `Response(on_close=...)` from API, since it was a bit of leaking implementation detail. (Pull #1572) * When using a client instance, cookies should always be set on the client, rather than on a per-request basis. We prefer enforcing a stricter API here because it provides clearer expectations around cookie persistence, particularly when redirects occur. (Pull #1574) * The runtime exception `httpx.ResponseClosed` is now named `httpx.StreamClosed`. (#1584) * The `httpx.QueryParams` model now presents an immutable interface. There is a discussion on [the design and motivation here](https://github.com/encode/httpx/discussions/1599). Use `client.params = client.params.merge(...)` instead of `client.params.update(...)`. The basic query manipulation methods are `query.set(...)`, `query.add(...)`, and `query.remove()`. (#1600) ### Added * The `Request` and `Response` classes can now be serialized using pickle. (#1579) * Handle `data={"key": [None|int|float|bool]}` cases. (Pull #1539) * Support `httpx.URL(**kwargs)`, for example `httpx.URL(scheme="https", host="www.example.com", path="/')`, or `httpx.URL("https://www.example.com/", username="tom@gmail.com", password="123 456")`. (Pull #1601) * Support `url.copy_with(params=...)`. (Pull #1601) * Add `url.params` parameter, returning an immutable `QueryParams` instance. (Pull #1601) * Support query manipulation methods on the URL class. These are `url.copy_set_param()`, `url.copy_add_param()`, `url.copy_remove_param()`, `url.copy_merge_params()`. (Pull #1601) * The `httpx.URL` class now performs port normalization, so `:80` ports are stripped from `http` URLs and `:443` ports are stripped from `https` URLs. (Pull #1603) * The `URL.host` property returns unicode strings for internationalized domain names. The `URL.raw_host` property returns byte strings with IDNA escaping applied. (Pull #1590) ### Fixed * Fix Content-Length for cases of `files=...` where unicode string is used as the file content. (Pull #1537) * Fix some cases of merging relative URLs against `Client(base_url=...)`. (Pull #1532) * The `request.content` attribute is now always available except for streaming content, which requires an explicit `.read()`. (Pull #1583) ## 0.17.1 (March 15th, 2021) ### Fixed * Type annotation on `CertTypes` allows `keyfile` and `password` to be optional. (Pull #1503) * Fix httpcore pinned version. (Pull #1495) ## 0.17.0 (February 28th, 2021) ### Added * Add `httpx.MockTransport()`, allowing to mock out a transport using pre-determined responses. (Pull #1401, Pull #1449) * Add `httpx.HTTPTransport()` and `httpx.AsyncHTTPTransport()` default transports. (Pull #1399) * Add mount API support, using `httpx.Client(mounts=...)`. (Pull #1362) * Add `chunk_size` parameter to `iter_raw()`, `iter_bytes()`, `iter_text()`. (Pull #1277) * Add `keepalive_expiry` parameter to `httpx.Limits()` configuration. (Pull #1398) * Add repr to `httpx.Cookies` to display available cookies. (Pull #1411) * Add support for `params=` (previously only `params=` was supported). (Pull #1426) ### Fixed * Add missing `raw_path` to ASGI scope. (Pull #1357) * Tweak `create_ssl_context` defaults to use `trust_env=True`. (Pull #1447) * Properly URL-escape WSGI `PATH_INFO`. (Pull #1391) * Properly set default ports in WSGI transport. (Pull #1469) * Properly encode slashes when using `base_url`. (Pull #1407) * Properly map exceptions in `request.aclose()`. (Pull #1465) ## 0.16.1 (October 8th, 2020) ### Fixed * Support literal IPv6 addresses in URLs. (Pull #1349) * Force lowercase headers in ASGI scope dictionaries. (Pull #1351) ## 0.16.0 (October 6th, 2020) ### Changed * Preserve HTTP header casing. (Pull #1338, encode/httpcore#216, python-hyper/h11#104) * Drop `response.next()` and `response.anext()` methods in favour of `response.next_request` attribute. (Pull #1339) * Closed clients now raise a runtime error if attempting to send a request. (Pull #1346) ### Added * Add Python 3.9 to officially supported versions. * Type annotate `__enter__`/`__exit__`/`__aenter__`/`__aexit__` in a way that supports subclasses of `Client` and `AsyncClient`. (Pull #1336) ## 0.15.5 (October 1st, 2020) ### Added * Add `response.next_request` (Pull #1334) ## 0.15.4 (September 25th, 2020) ### Added * Support direct comparisons between `Headers` and dicts or lists of two-tuples. Eg. `assert response.headers == {"Content-Length": 24}` (Pull #1326) ### Fixed * Fix automatic `.read()` when `Response` instances are created with `content=` (Pull #1324) ## 0.15.3 (September 24th, 2020) ### Fixed * Fixed connection leak in async client due to improper closing of response streams. (Pull #1316) ## 0.15.2 (September 23nd, 2020) ### Fixed * Fixed `response.elapsed` property. (Pull #1313) * Fixed client authentication interaction with `.stream()`. (Pull #1312) ## 0.15.1 (September 23nd, 2020) ### Fixed * ASGITransport now properly applies URL decoding to the `path` component, as-per the ASGI spec. (Pull #1307) ## 0.15.0 (September 22nd, 2020) ### Added * Added support for curio. (Pull https://github.com/encode/httpcore/pull/168) * Added support for event hooks. (Pull #1246) * Added support for authentication flows which require either sync or async I/O. (Pull #1217) * Added support for monitoring download progress with `response.num_bytes_downloaded`. (Pull #1268) * Added `Request(content=...)` for byte content, instead of overloading `Request(data=...)` (Pull #1266) * Added support for all URL components as parameter names when using `url.copy_with(...)`. (Pull #1285) * Neater split between automatically populated headers on `Request` instances, vs default `client.headers`. (Pull #1248) * Unclosed `AsyncClient` instances will now raise warnings if garbage collected. (Pull #1197) * Support `Response(content=..., text=..., html=..., json=...)` for creating usable response instances in code. (Pull #1265, #1297) * Support instantiating requests from the low-level transport API. (Pull #1293) * Raise errors on invalid URL types. (Pull #1259) ### Changed * Cleaned up expected behaviour for URL escaping. `url.path` is now URL escaped. (Pull #1285) * Cleaned up expected behaviour for bytes vs str in URL components. `url.userinfo` and `url.query` are not URL escaped, and so return bytes. (Pull #1285) * Drop `url.authority` property in favour of `url.netloc`, since "authority" was semantically incorrect. (Pull #1285) * Drop `url.full_path` property in favour of `url.raw_path`, for better consistency with other parts of the API. (Pull #1285) * No longer use the `chardet` library for auto-detecting charsets, instead defaulting to a simpler approach when no charset is specified. (#1269) ### Fixed * Swapped ordering of redirects and authentication flow. (Pull #1267) * `.netrc` lookups should use host, not host+port. (Pull #1298) ### Removed * The `URLLib3Transport` class no longer exists. We've published it instead as an example of [a custom transport class](https://gist.github.com/florimondmanca/d56764d78d748eb9f73165da388e546e). (Pull #1182) * Drop `request.timer` attribute, which was being used internally to set `response.elapsed`. (Pull #1249) * Drop `response.decoder` attribute, which was being used internally. (Pull #1276) * `Request.prepare()` is now a private method. (Pull #1284) * The `Headers.getlist()` method had previously been deprecated in favour of `Headers.get_list()`. It is now fully removed. * The `QueryParams.getlist()` method had previously been deprecated in favour of `QueryParams.get_list()`. It is now fully removed. * The `URL.is_ssl` property had previously been deprecated in favour of `URL.scheme == "https"`. It is now fully removed. * The `httpx.PoolLimits` class had previously been deprecated in favour of `httpx.Limits`. It is now fully removed. * The `max_keepalive` setting had previously been deprecated in favour of the more explicit `max_keepalive_connections`. It is now fully removed. * The verbose `httpx.Timeout(5.0, connect_timeout=60.0)` style had previously been deprecated in favour of `httpx.Timeout(5.0, connect=60.0)`. It is now fully removed. * Support for instantiating a timeout config missing some defaults, such as `httpx.Timeout(connect=60.0)`, had previously been deprecated in favour of enforcing a more explicit style, such as `httpx.Timeout(5.0, connect=60.0)`. This is now strictly enforced. ## 0.14.3 (September 2nd, 2020) ### Added * `http.Response()` may now be instantiated without a `request=...` parameter. Useful for some unit testing cases. (Pull #1238) * Add `103 Early Hints` and `425 Too Early` status codes. (Pull #1244) ### Fixed * `DigestAuth` now handles responses that include multiple 'WWW-Authenticate' headers. (Pull #1240) * Call into transport `__enter__`/`__exit__` or `__aenter__`/`__aexit__` when client is used in a context manager style. (Pull #1218) ## 0.14.2 (August 24th, 2020) ### Added * Support `client.get(..., auth=None)` to bypass the default authentication on a clients. (Pull #1115) * Support `client.auth = ...` property setter. (Pull #1185) * Support `httpx.get(..., proxies=...)` on top-level request functions. (Pull #1198) * Display instances with nicer import styles. (Eg. ) (Pull #1155) * Support `cookies=[(key, value)]` list-of-two-tuples style usage. (Pull #1211) ### Fixed * Ensure that automatically included headers on a request may be modified. (Pull #1205) * Allow explicit `Content-Length` header on streaming requests. (Pull #1170) * Handle URL quoted usernames and passwords properly. (Pull #1159) * Use more consistent default for `HEAD` requests, setting `allow_redirects=True`. (Pull #1183) * If a transport error occurs while streaming the response, raise an `httpx` exception, not the underlying `httpcore` exception. (Pull #1190) * Include the underlying `httpcore` traceback, when transport exceptions occur. (Pull #1199) ## 0.14.1 (August 11th, 2020) ### Added * The `httpx.URL(...)` class now raises `httpx.InvalidURL` on invalid URLs, rather than exposing the underlying `rfc3986` exception. If a redirect response includes an invalid 'Location' header, then a `RemoteProtocolError` exception is raised, which will be associated with the request that caused it. (Pull #1163) ### Fixed * Handling multiple `Set-Cookie` headers became broken in the 0.14.0 release, and is now resolved. (Pull #1156) ## 0.14.0 (August 7th, 2020) The 0.14 release includes a range of improvements to the public API, intended on preparing for our upcoming 1.0 release. * Our HTTP/2 support is now fully optional. **You now need to use `pip install httpx[http2]` if you want to include the HTTP/2 dependencies.** * Our HSTS support has now been removed. Rewriting URLs from `http` to `https` if the host is on the HSTS list can be beneficial in avoiding roundtrips to incorrectly formed URLs, but on balance we've decided to remove this feature, on the principle of least surprise. Most programmatic clients do not include HSTS support, and for now we're opting to remove our support for it. * Our exception hierarchy has been overhauled. Most users will want to stick with their existing `httpx.HTTPError` usage, but we've got a clearer overall structure now. See https://www.python-httpx.org/exceptions/ for more details. When upgrading you should be aware of the following public API changes. Note that deprecated usages will currently continue to function, but will issue warnings. * You should now use `httpx.codes` consistently instead of `httpx.StatusCodes`. * Usage of `httpx.Timeout()` should now always include an explicit default. Eg. `httpx.Timeout(None, pool=5.0)`. * When using `httpx.Timeout()`, we now have more concisely named keyword arguments. Eg. `read=5.0`, instead of `read_timeout=5.0`. * Use `httpx.Limits()` instead of `httpx.PoolLimits()`, and `limits=...` instead of `pool_limits=...`. * The `httpx.Limits(max_keepalive=...)` argument is now deprecated in favour of a more explicit `httpx.Limits(max_keepalive_connections=...)`. * Keys used with `Client(proxies={...})` should now be in the style of `{"http://": ...}`, rather than `{"http": ...}`. * The multidict methods `Headers.getlist()` and `QueryParams.getlist()` are deprecated in favour of more consistent `.get_list()` variants. * The `URL.is_ssl` property is deprecated in favour of `URL.scheme == "https"`. * The `URL.join(relative_url=...)` method is now `URL.join(url=...)`. This change does not support warnings for the deprecated usage style. One notable aspect of the 0.14.0 release is that it tightens up the public API for `httpx`, by ensuring that several internal attributes and methods have now become strictly private. The following previously had nominally public names on the client, but were all undocumented and intended solely for internal usage. They are all now replaced with underscored names, and should not be relied on or accessed. These changes should not affect users who have been working from the `httpx` documentation. * `.merge_url()`, `.merge_headers()`, `.merge_cookies()`, `.merge_queryparams()` * `.build_auth()`, `.build_redirect_request()` * `.redirect_method()`, `.redirect_url()`, `.redirect_headers()`, `.redirect_stream()` * `.send_handling_redirects()`, `.send_handling_auth()`, `.send_single_request()` * `.init_transport()`, `.init_proxy_transport()` * `.proxies`, `.transport`, `.netrc`, `.get_proxy_map()` See pull requests #997, #1065, #1071. Some areas of API which were already on the deprecation path, and were raising warnings or errors in 0.13.x have now been escalated to being fully removed. * Drop `ASGIDispatch`, `WSGIDispatch`, which have been replaced by `ASGITransport`, `WSGITransport`. * Drop `dispatch=...`` on client, which has been replaced by `transport=...`` * Drop `soft_limit`, `hard_limit`, which have been replaced by `max_keepalive` and `max_connections`. * Drop `Response.stream` and` `Response.raw`, which have been replaced by ``.aiter_bytes` and `.aiter_raw`. * Drop `proxies=` in favor of `proxies=httpx.Proxy(...)`. See pull requests #1057, #1058. ### Added * Added dedicated exception class `httpx.HTTPStatusError` for `.raise_for_status()` exceptions. (Pull #1072) * Added `httpx.create_ssl_context()` helper function. (Pull #996) * Support for proxy exclusions like `proxies={"https://www.example.com": None}`. (Pull #1099) * Support `QueryParams(None)` and `client.params = None`. (Pull #1060) ### Changed * Use `httpx.codes` consistently in favour of `httpx.StatusCodes` which is placed into deprecation. (Pull #1088) * Usage of `httpx.Timeout()` should now always include an explicit default. Eg. `httpx.Timeout(None, pool=5.0)`. (Pull #1085) * Switch to more concise `httpx.Timeout()` keyword arguments. Eg. `read=5.0`, instead of `read_timeout=5.0`. (Pull #1111) * Use `httpx.Limits()` instead of `httpx.PoolLimits()`, and `limits=...` instead of `pool_limits=...`. (Pull #1113) * Keys used with `Client(proxies={...})` should now be in the style of `{"http://": ...}`, rather than `{"http": ...}`. (Pull #1127) * The multidict methods `Headers.getlist` and `QueryParams.getlist` are deprecated in favour of more consistent `.get_list()` variants. (Pull #1089) * `URL.port` becomes `Optional[int]`. Now only returns a port if one is explicitly included in the URL string. (Pull #1080) * The `URL(..., allow_relative=[bool])` parameter no longer exists. All URL instances may be relative. (Pull #1073) * Drop unnecessary `url.full_path = ...` property setter. (Pull #1069) * The `URL.join(relative_url=...)` method is now `URL.join(url=...)`. (Pull #1129) * The `URL.is_ssl` property is deprecated in favour of `URL.scheme == "https"`. (Pull #1128) ### Fixed * Add missing `Response.next()` method. (Pull #1055) * Ensure all exception classes are exposed as public API. (Pull #1045) * Support multiple items with an identical field name in multipart encodings. (Pull #777) * Skip HSTS preloading on single-label domains. (Pull #1074) * Fixes for `Response.iter_lines()`. (Pull #1033, #1075) * Ignore permission errors when accessing `.netrc` files. (Pull #1104) * Allow bare hostnames in `HTTP_PROXY` etc... environment variables. (Pull #1120) * Settings `app=...` or `transport=...` bypasses any environment based proxy defaults. (Pull #1122) * Fix handling of `.base_url` when a path component is included in the base URL. (Pull #1130) --- ## 0.13.3 (May 29th, 2020) ### Fixed * Include missing keepalive expiry configuration. (Pull #1005) * Improved error message when URL redirect has a custom scheme. (Pull #1002) ## 0.13.2 (May 27th, 2020) ### Fixed * Include explicit "Content-Length: 0" on POST, PUT, PATCH if no request body is used. (Pull #995) * Add `http2` option to `httpx.Client`. (Pull #982) * Tighten up API typing in places. (Pull #992, #999) ## 0.13.1 (May 22nd, 2020) ### Fixed * Fix pool options deprecation warning. (Pull #980) * Include `httpx.URLLib3ProxyTransport` in top-level API. (Pull #979) ## 0.13.0 (May 22nd, 2020) This release switches to `httpcore` for all the internal networking, which means: * We're using the same codebase for both our sync and async clients. * HTTP/2 support is now available with the sync client. * We no longer have a `urllib3` dependency for our sync client, although there is still an *optional* `URLLib3Transport` class. It also means we've had to remove our UDS support, since maintaining that would have meant having to push back our work towards a 1.0 release, which isn't a trade-off we wanted to make. We also now have [a public "Transport API"](https://www.python-httpx.org/advanced/transports/#custom-transports), which you can use to implement custom transport implementations against. This formalises and replaces our previously private "Dispatch API". ### Changed * Use `httpcore` for underlying HTTP transport. Drop `urllib3` requirement. (Pull #804, #967) * Rename pool limit options from `soft_limit`/`hard_limit` to `max_keepalive`/`max_connections`. (Pull #968) * The previous private "Dispatch API" has now been promoted to a public "Transport API". When customizing the transport use `transport=...`. The `ASGIDispatch` and `WSGIDispatch` class naming is deprecated in favour of `ASGITransport` and `WSGITransport`. (Pull #963) ### Added * Added `URLLib3Transport` class for optional `urllib3` transport support. (Pull #804, #963) * Streaming multipart uploads. (Pull #857) * Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables and TRACE level logging. (Pull encode/httpcore#79) ### Fixed * Performance improvement in brotli decoder. (Pull #906) * Proper warning level of deprecation notice in `Response.stream` and `Response.raw`. (Pull #908) * Fix support for generator based WSGI apps. (Pull #887) * Reuse of connections on HTTP/2 in close concurrency situations. (Pull encode/httpcore#81) * Honor HTTP/2 max concurrent streams settings (Pull encode/httpcore#89, encode/httpcore#90) * Fix bytes support in multipart uploads. (Pull #974) * Improve typing support for `files=...`. (Pull #976) ### Removed * Dropped support for `Client(uds=...)` (Pull #804) ## 0.13.0.dev2 (May 12th, 2020) The 0.13.0.dev2 is a *pre-release* version. To install it, use `pip install httpx --pre`. ### Added * Logging via HTTPCORE_LOG_LEVEL and HTTPX_LOG_LEVEL environment variables and TRACE level logging. (HTTPCore Pull #79) ### Fixed * Reuse of connections on HTTP/2 in close concurrency situations. (HTTPCore Pull #81) * When using an `app=` observe neater disconnect behaviour instead of sending empty body messages. (Pull #919) ## 0.13.0.dev1 (May 6th, 2020) The 0.13.0.dev1 is a *pre-release* version. To install it, use `pip install httpx --pre`. ### Fixed * Passing `http2` flag to proxy dispatchers. (Pull #934) * Use [`httpcore` v0.8.3](https://github.com/encode/httpcore/releases/tag/0.8.3) which addresses problems in handling of headers when using proxies. ## 0.13.0.dev0 (April 30th, 2020) The 0.13.0.dev0 is a *pre-release* version. To install it, use `pip install httpx --pre`. This release switches to `httpcore` for all the internal networking, which means: * We're using the same codebase for both our sync and async clients. * HTTP/2 support is now available with the sync client. * We no longer have a `urllib3` dependency for our sync client, although there is still an *optional* `URLLib3Dispatcher` class. It also means we've had to remove our UDS support, since maintaining that would have meant having to push back our work towards a 1.0 release, which isn't a trade-off we wanted to make. ### Changed * Use `httpcore` for underlying HTTP transport. Drop `urllib3` requirement. (Pull #804) ### Added * Added `URLLib3Dispatcher` class for optional `urllib3` transport support. (Pull #804) * Streaming multipart uploads. (Pull #857) ### Fixed * Performance improvement in brotli decoder. (Pull #906) * Proper warning level of deprecation notice in `Response.stream` and `Response.raw`. (Pull #908) * Fix support for generator based WSGI apps. (Pull #887) ### Removed * Dropped support for `Client(uds=...)` (Pull #804) --- ## 0.12.1 (March 19th, 2020) ### Fixed * Resolved packaging issue, where additional files were being included. ## 0.12.0 (March 9th, 2020) The 0.12 release tightens up the API expectations for `httpx` by switching to private module names to enforce better clarity around public API. All imports of `httpx` should import from the top-level package only, such as `from httpx import Request`, rather than importing from privately namespaced modules such as `from httpx._models import Request`. ### Added * Support making response body available to auth classes with `.requires_response_body`. (Pull #803) * Export `NetworkError` exception. (Pull #814) * Add support for `NO_PROXY` environment variable. (Pull #835) ### Changed * Switched to private module names. (Pull #785) * Drop redirect looping detection and the `RedirectLoop` exception, instead using `TooManyRedirects`. (Pull #819) * Drop `backend=...` parameter on `AsyncClient`, in favour of always autodetecting `trio`/`asyncio`. (Pull #791) ### Fixed * Support basic auth credentials in proxy URLs. (Pull #780) * Fix `httpx.Proxy(url, mode="FORWARD_ONLY")` configuration. (Pull #788) * Fallback to setting headers as UTF-8 if no encoding is specified. (Pull #820) * Close proxy dispatches classes on client close. (Pull #826) * Support custom `cert` parameters even if `verify=False`. (Pull #796) * Don't support invalid dict-of-dicts form data in `data=...`. (Pull #811) --- ## 0.11.1 (January 17th, 2020) ### Fixed * Fixed usage of `proxies=...` on `Client()`. (Pull #763) * Support both `zlib` and `deflate` style encodings on `Content-Encoding: deflate`. (Pull #758) * Fix for streaming a redirect response body with `allow_redirects=False`. (Pull #766) * Handle redirect with malformed Location headers missing host. (Pull #774) ## 0.11.0 (January 9th, 2020) The 0.11 release reintroduces our sync support, so that `httpx` now supports both a standard thread-concurrency API, and an async API. Existing async `httpx` users that are upgrading to 0.11 should ensure that: * Async codebases should always use a client instance to make requests, instead of the top-level API. * The async client is named as `httpx.AsyncClient()`, instead of `httpx.Client()`. * When instantiating proxy configurations use the `httpx.Proxy()` class, instead of the previous `httpx.HTTPProxy()`. This new configuration class works for configuring both sync and async clients. We believe the API is now pretty much stable, and are aiming for a 1.0 release sometime on or before April 2020. ### Changed - Top level API such as `httpx.get(url, ...)`, `httpx.post(url, ...)`, `httpx.request(method, url, ...)` becomes synchronous. - Added `httpx.Client()` for synchronous clients, with `httpx.AsyncClient` being used for async clients. - Switched to `proxies=httpx.Proxy(...)` for proxy configuration. - Network connection errors are wrapped in `httpx.NetworkError`, rather than exposing lower-level exception types directly. ### Removed - The `request.url.origin` property and `httpx.Origin` class are no longer available. - The per-request `cert`, `verify`, and `trust_env` arguments are escalated from raising errors if used, to no longer being available. These arguments should be used on a per-client instance instead, or in the top-level API. - The `stream` argument has escalated from raising an error when used, to no longer being available. Use the `client.stream(...)` or `httpx.stream()` streaming API instead. ### Fixed - Redirect loop detection matches against `(method, url)` rather than `url`. (Pull #734) --- ## 0.10.1 (December 31st, 2019) ### Fixed - Fix issue with concurrent connection acquisition. (Pull #700) - Fix write error on closing HTTP/2 connections. (Pull #699) ## 0.10.0 (December 29th, 2019) The 0.10.0 release makes some changes that will allow us to support both sync and async interfaces. In particular with streaming responses the `response.read()` method becomes `response.aread()`, and the `response.close()` method becomes `response.aclose()`. If following redirects explicitly the `response.next()` method becomes `response.anext()`. ### Fixed - End HTTP/2 streams immediately on no-body requests, rather than sending an empty body message. (Pull #682) - Improve typing for `Response.request`: switch from `Optional[Request]` to `Request`. (Pull #666) - `Response.elapsed` now reflects the entire download time. (Pull #687, #692) ### Changed - Added `AsyncClient` as a synonym for `Client`. (Pull #680) - Switch to `response.aread()` for conditionally reading streaming responses. (Pull #674) - Switch to `response.aclose()` and `client.aclose()` for explicit closing. (Pull #674, #675) - Switch to `response.anext()` for resolving the next redirect response. (Pull #676) ### Removed - When using a client instance, the per-request usage of `verify`, `cert`, and `trust_env` have now escalated from raising a warning to raising an error. You should set these arguments on the client instead. (Pull #617) - Removed the undocumented `request.read()`, since end users should not require it. --- ## 0.9.5 (December 20th, 2019) ### Fixed - Fix Host header and HSTS rewrites when an explicit `:80` port is included in URL. (Pull #649) - Query Params on the URL string are merged with any `params=...` argument. (Pull #653) - More robust behavior when closing connections. (Pull #640) - More robust behavior when handling HTTP/2 headers with trailing whitespace. (Pull #637) - Allow any explicit `Content-Type` header to take precedence over the encoding default. (Pull #633) ## 0.9.4 (December 12th, 2019) ### Fixed - Added expiry to Keep-Alive connections, resolving issues with acquiring connections. (Pull #627) - Increased flow control windows on HTTP/2, resolving download speed issues. (Pull #629) ## 0.9.3 (December 7th, 2019) ### Fixed - Fixed HTTP/2 with autodetection backend. (Pull #614) ## 0.9.2 (December 7th, 2019) * Released due to packaging build artifact. ## 0.9.1 (December 6th, 2019) * Released due to packaging build artifact. ## 0.9.0 (December 6th, 2019) The 0.9 releases brings some major new features, including: * A new streaming API. * Autodetection of either asyncio or trio. * Nicer timeout configuration. * HTTP/2 support off by default, but can be enabled. We've also removed all private types from the top-level package export. In order to ensure you are only ever working with public API you should make sure to only import the top-level package eg. `import httpx`, rather than importing modules within the package. ### Added - Added concurrency backend autodetection. (Pull #585) - Added `Client(backend='trio')` and `Client(backend='asyncio')` API. (Pull #585) - Added `response.stream_lines()` API. (Pull #575) - Added `response.is_error` API. (Pull #574) - Added support for `timeout=Timeout(5.0, connect_timeout=60.0)` styles. (Pull #593) ### Fixed - Requests or Clients with `timeout=None` now correctly always disable timeouts. (Pull #592) - Request 'Authorization' headers now have priority over `.netrc` authentication info. (Commit 095b691) - Files without a filename no longer set a Content-Type in multipart data. (Commit ed94950) ### Changed - Added `httpx.stream()` API. Using `stream=True` now results in a warning. (Pull #600, #610) - HTTP/2 support is switched to "off by default", but can be enabled explicitly. (Pull #584) - Switched to `Client(http2=True)` API from `Client(http_versions=["HTTP/1.1", "HTTP/2"])`. (Pull #586) - Removed all private types from the top-level package export. (Pull #608) - The SSL configuration settings of `verify`, `cert`, and `trust_env` now raise warnings if used per-request when using a Client instance. They should always be set on the Client instance itself. (Pull #597) - Use plain strings "TUNNEL_ONLY" or "FORWARD_ONLY" on the HTTPProxy `proxy_mode` argument. The `HTTPProxyMode` enum still exists, but its usage will raise warnings. (#610) - Pool timeouts are now on the timeout configuration, not the pool limits configuration. (Pull #563) - The timeout configuration is now named `httpx.Timeout(...)`, not `httpx.TimeoutConfig(...)`. The old version currently remains as a synonym for backwards compatibility. (Pull #591) --- ## 0.8.0 (November 27, 2019) ### Removed - The synchronous API has been removed, in order to allow us to fundamentally change how we approach supporting both sync and async variants. (See #588 for more details.) --- ## 0.7.8 (November 17, 2019) ### Added - Add support for proxy tunnels for Python 3.6 + asyncio. (Pull #521) ## 0.7.7 (November 15, 2019) ### Fixed - Resolve an issue with cookies behavior on redirect requests. (Pull #529) ### Added - Add request/response DEBUG logs. (Pull #502) - Use TRACE log level for low level info. (Pull #500) ## 0.7.6 (November 2, 2019) ### Removed - Drop `proxies` parameter from the high-level API. (Pull #485) ### Fixed - Tweak multipart files: omit null filenames, add support for `str` file contents. (Pull #482) - Cache NETRC authentication per-client. (Pull #400) - Rely on `getproxies` for all proxy environment variables. (Pull #470) - Wait for the `asyncio` stream to close when closing a connection. (Pull #494) ## 0.7.5 (October 10, 2019) ### Added - Allow lists of values to be passed to `params`. (Pull #386) - `ASGIDispatch`, `WSGIDispatch` are now available in the `httpx.dispatch` namespace. (Pull #407) - `HTTPError` is now available in the `httpx` namespace. (Pull #421) - Add support for `start_tls()` to the Trio concurrency backend. (Pull #467) ### Fixed - Username and password are no longer included in the `Host` header when basic authentication credentials are supplied via the URL. (Pull #417) ### Removed - The `.delete()` function no longer has `json`, `data`, or `files` parameters to match the expected semantics of the `DELETE` method. (Pull #408) - Removed the `trio` extra. Trio support is detected automatically. (Pull #390) ## 0.7.4 (September 25, 2019) ### Added - Add Trio concurrency backend. (Pull #276) - Add `params` parameter to `Client` for setting default query parameters. (Pull #372) - Add support for `SSL_CERT_FILE` and `SSL_CERT_DIR` environment variables. (Pull #307) - Add debug logging to calls into ASGI apps. (Pull #371) - Add debug logging to SSL configuration. (Pull #378) ### Fixed - Fix a bug when using `Client` without timeouts in Python 3.6. (Pull #383) - Propagate `Client` configuration to HTTP proxies. (Pull #377) ## 0.7.3 (September 20, 2019) ### Added - HTTP Proxy support. (Pulls #259, #353) - Add Digest authentication. (Pull #332) - Add `.build_request()` method to `Client` and `AsyncClient`. (Pull #319) - Add `.elapsed` property on responses. (Pull #351) - Add support for `SSLKEYLOGFILE` in Python 3.8b4+. (Pull #301) ### Removed - Drop NPN support for HTTP version negotiation. (Pull #314) ### Fixed - Fix distribution of type annotations for mypy (Pull #361). - Set `Host` header when redirecting cross-origin. (Pull #321) - Drop `Content-Length` headers on `GET` redirects. (Pull #310) - Raise `KeyError` if header isn't found in `Headers`. (Pull #324) - Raise `NotRedirectResponse` in `response.next()` if there is no redirection to perform. (Pull #297) - Fix bug in calculating the HTTP/2 maximum frame size. (Pull #153) ## 0.7.2 (August 28, 2019) - Enforce using `httpx.AsyncioBackend` for the synchronous client. (Pull #232) - `httpx.ConnectionPool` will properly release a dropped connection. (Pull #230) - Remove the `raise_app_exceptions` argument from `Client`. (Pull #238) - `DecodeError` will no longer be raised for an empty body encoded with Brotli. (Pull #237) - Added `http_versions` parameter to `Client`. (Pull #250) - Only use HTTP/1.1 on short-lived connections like `httpx.get()`. (Pull #284) - Convert `Client.cookies` and `Client.headers` when set as a property. (Pull #274) - Setting `HTTPX_DEBUG=1` enables debug logging on all requests. (Pull #277) ## 0.7.1 (August 18, 2019) - Include files with source distribution to be installable. (Pull #233) ## 0.7.0 (August 17, 2019) - Add the `trust_env` property to `BaseClient`. (Pull #187) - Add the `links` property to `BaseResponse`. (Pull #211) - Accept `ssl.SSLContext` instances into `SSLConfig(verify=...)`. (Pull #215) - Add `Response.stream_text()` with incremental encoding detection. (Pull #183) - Properly updated the `Host` header when a redirect changes the origin. (Pull #199) - Ignore invalid `Content-Encoding` headers. (Pull #196) - Use `~/.netrc` and `~/_netrc` files by default when `trust_env=True`. (Pull #189) - Create exception base class `HTTPError` with `request` and `response` properties. (Pull #162) - Add HSTS preload list checking within `BaseClient` to upgrade HTTP URLs to HTTPS. (Pull #184) - Switch IDNA encoding from IDNA 2003 to IDNA 2008. (Pull #161) - Expose base classes for alternate concurrency backends. (Pull #178) - Improve Multipart parameter encoding. (Pull #167) - Add the `headers` property to `BaseClient`. (Pull #159) - Add support for Google's `brotli` library. (Pull #156) - Remove deprecated TLS versions (TLSv1 and TLSv1.1) from default `SSLConfig`. (Pull #155) - Fix `URL.join(...)` to work similarly to RFC 3986 URL joining. (Pull #144) --- ## 0.6.8 (July 25, 2019) - Check for disconnections when searching for an available connection in `ConnectionPool.keepalive_connections` (Pull #145) - Allow string comparison for `URL` objects (Pull #139) - Add HTTP status codes 418 and 451 (Pull #135) - Add support for client certificate passwords (Pull #118) - Enable post-handshake client cert authentication for TLSv1.3 (Pull #118) - Disable using `commonName` for hostname checking for OpenSSL 1.1.0+ (Pull #118) - Detect encoding for `Response.json()` (Pull #116) ## 0.6.7 (July 8, 2019) - Check for connection aliveness on re-acquisition (Pull #111) ## 0.6.6 (July 3, 2019) - Improve `USER_AGENT` (Pull #110) - Add `Connection: keep-alive` by default to HTTP/1.1 connections. (Pull #110) ## 0.6.5 (June 27, 2019) - Include `Host` header by default. (Pull #109) - Improve HTTP protocol detection. (Pull #107) ## 0.6.4 (June 25, 2019) - Implement read and write timeouts (Pull #104) ## 0.6.3 (June 24, 2019) - Handle early connection closes (Pull #103) ## 0.6.2 (June 23, 2019) - Use urllib3's `DEFAULT_CIPHERS` for the `SSLConfig` object. (Pull #100) ## 0.6.1 (June 21, 2019) - Add support for setting a `base_url` on the `Client`. ## 0.6.0 (June 21, 2019) - Honor `local_flow_control_window` for HTTP/2 connections (Pull #98) pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/000077500000000000000000000000001521723372100205425ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/__init__.py000066400000000000000000000044361521723372100226620ustar00rootroot00000000000000from .__version__ import __description__, __title__, __version__ from ._api import * from ._auth import * from ._client import * from ._config import * from ._content import * from ._exceptions import * from ._models import * from ._sse import * from ._status_codes import * from ._transports import * from ._types import * from ._urls import * __all__ = [ "__description__", "__title__", "__version__", "ASGITransport", "AsyncBaseTransport", "AsyncByteStream", "AsyncClient", "AsyncHTTPTransport", "Auth", "BaseTransport", "BasicAuth", "ByteStream", "Client", "CloseError", "codes", "ConnectError", "ConnectTimeout", "CookieConflict", "Cookies", "create_ssl_context", "DecodingError", "delete", "DigestAuth", "EventSource", "FunctionAuth", "get", "head", "Headers", "HTTPError", "HTTPStatusError", "HTTPTransport", "InvalidURL", "Limits", "LocalProtocolError", "MockTransport", "NetRCAuth", "NetworkError", "options", "patch", "PoolTimeout", "post", "ProtocolError", "Proxy", "ProxyError", "put", "QueryParams", "ReadError", "ReadTimeout", "RemoteProtocolError", "request", "Request", "RequestError", "RequestNotRead", "Response", "ResponseNotRead", "ServerSentEvent", "SSEError", "stream", "StreamClosed", "StreamConsumed", "StreamError", "SyncByteStream", "Timeout", "TimeoutException", "TooManyRedirects", "TransportError", "UnsupportedProtocol", "URL", "USE_CLIENT_DEFAULT", "WriteError", "WriteTimeout", "WSGITransport", ] __locals = locals() for __name in __all__: if not __name.startswith("__"): setattr(__locals[__name], "__module__", "httpx2") # noqa def __getattr__(name: str) -> object: # pragma: no cover if name == "main": import warnings warnings.warn( "`httpx2.main` is deprecated and will be removed in a future release. " "Use the `httpx2` CLI entry point instead.", DeprecationWarning, stacklevel=2, ) from ._main import main return main raise AttributeError(f"module {__name__!r} has no attribute {name!r}") pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/__version__.py000066400000000000000000000002361521723372100233760ustar00rootroot00000000000000from importlib.metadata import version __title__ = "httpx2" __description__ = "A next generation HTTP client, for Python 3." __version__ = version("httpx2") pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_api.py000066400000000000000000000266731521723372100220420ustar00rootroot00000000000000from __future__ import annotations import typing from collections.abc import Generator from contextlib import contextmanager from ._client import Client from ._config import DEFAULT_TIMEOUT_CONFIG from ._models import Response from ._types import ( AuthTypes, CookieTypes, HeaderTypes, ProxyTypes, QueryParamTypes, RequestContent, RequestData, RequestFiles, TimeoutTypes, ) from ._urls import URL if typing.TYPE_CHECKING: import ssl # pragma: no cover __all__ = [ "delete", "get", "head", "options", "patch", "post", "put", "request", "stream", ] def request( method: str, url: URL | str, *, params: QueryParamTypes | None = None, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | None = None, proxy: ProxyTypes | None = None, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, follow_redirects: bool = False, verify: ssl.SSLContext | str | bool = True, trust_env: bool = True, ) -> Response: """Sends an HTTP request. Parameters: method: HTTP method for the new `Request` object: `GET`, `OPTIONS`, `HEAD`, `POST`, `PUT`, `PATCH`, or `DELETE`. url: URL for the new `Request` object. params: *(optional)* Query parameters to include in the URL, as a string, dictionary, or sequence of two-tuples. content: *(optional)* Binary content to include in the body of the request, as bytes or a byte iterator. data: *(optional)* Form data to include in the body of the request, as a dictionary. files: *(optional)* A dictionary of upload files to include in the body of the request. json: *(optional)* A JSON serializable object to include in the body of the request. headers: *(optional)* Dictionary of HTTP headers to include in the request. cookies: *(optional)* Dictionary of Cookie items to include in the request. auth: *(optional)* An authentication class to use when sending the request. proxy: *(optional)* A proxy URL where all the traffic should be routed. timeout: *(optional)* The timeout configuration to use when sending the request. follow_redirects: *(optional)* Enables or disables HTTP redirects. verify: *(optional)* Either `True` to use an SSL context with the default CA bundle, `False` to disable verification, or an instance of `ssl.SSLContext` to use a custom context. trust_env: *(optional)* Enables or disables usage of environment variables for configuration. Returns: The `Response` object. Usage: ``` >>> import httpx2 >>> response = httpx2.request('GET', 'https://httpbin.org/get') >>> response ``` """ with Client( cookies=cookies, proxy=proxy, verify=verify, timeout=timeout, trust_env=trust_env, ) as client: return client.request( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, auth=auth, follow_redirects=follow_redirects, ) @contextmanager def stream( method: str, url: URL | str, *, params: QueryParamTypes | None = None, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | None = None, proxy: ProxyTypes | None = None, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, follow_redirects: bool = False, verify: ssl.SSLContext | str | bool = True, trust_env: bool = True, ) -> Generator[Response]: """ Alternative to `httpx2.request()` that streams the response body instead of loading it into memory at once. **Parameters**: See `httpx2.request`. See also: [Streaming Responses][0] [0]: /quickstart#streaming-responses """ with Client( cookies=cookies, proxy=proxy, verify=verify, timeout=timeout, trust_env=trust_env, ) as client: with client.stream( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, auth=auth, follow_redirects=follow_redirects, ) as response: yield response def get( url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | None = None, proxy: ProxyTypes | None = None, follow_redirects: bool = False, verify: ssl.SSLContext | str | bool = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `GET` request. **Parameters**: See `httpx2.request`. Note that the `data`, `files`, `json` and `content` parameters are not available on this function, as `GET` requests should not include a request body. """ return request( "GET", url, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, follow_redirects=follow_redirects, verify=verify, timeout=timeout, trust_env=trust_env, ) def options( url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | None = None, proxy: ProxyTypes | None = None, follow_redirects: bool = False, verify: ssl.SSLContext | str | bool = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends an `OPTIONS` request. **Parameters**: See `httpx2.request`. Note that the `data`, `files`, `json` and `content` parameters are not available on this function, as `OPTIONS` requests should not include a request body. """ return request( "OPTIONS", url, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, follow_redirects=follow_redirects, verify=verify, timeout=timeout, trust_env=trust_env, ) def head( url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | None = None, proxy: ProxyTypes | None = None, follow_redirects: bool = False, verify: ssl.SSLContext | str | bool = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `HEAD` request. **Parameters**: See `httpx2.request`. Note that the `data`, `files`, `json` and `content` parameters are not available on this function, as `HEAD` requests should not include a request body. """ return request( "HEAD", url, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, follow_redirects=follow_redirects, verify=verify, timeout=timeout, trust_env=trust_env, ) def post( url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | None = None, proxy: ProxyTypes | None = None, follow_redirects: bool = False, verify: ssl.SSLContext | str | bool = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `POST` request. **Parameters**: See `httpx2.request`. """ return request( "POST", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, follow_redirects=follow_redirects, verify=verify, timeout=timeout, trust_env=trust_env, ) def put( url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | None = None, proxy: ProxyTypes | None = None, follow_redirects: bool = False, verify: ssl.SSLContext | str | bool = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `PUT` request. **Parameters**: See `httpx2.request`. """ return request( "PUT", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, follow_redirects=follow_redirects, verify=verify, timeout=timeout, trust_env=trust_env, ) def patch( url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | None = None, proxy: ProxyTypes | None = None, follow_redirects: bool = False, verify: ssl.SSLContext | str | bool = True, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, trust_env: bool = True, ) -> Response: """ Sends a `PATCH` request. **Parameters**: See `httpx2.request`. """ return request( "PATCH", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, follow_redirects=follow_redirects, verify=verify, timeout=timeout, trust_env=trust_env, ) def delete( url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | None = None, proxy: ProxyTypes | None = None, follow_redirects: bool = False, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, verify: ssl.SSLContext | str | bool = True, trust_env: bool = True, ) -> Response: """ Sends a `DELETE` request. **Parameters**: See `httpx2.request`. Note that the `data`, `files`, `json` and `content` parameters are not available on this function, as `DELETE` requests should not include a request body. """ return request( "DELETE", url, params=params, headers=headers, cookies=cookies, auth=auth, proxy=proxy, follow_redirects=follow_redirects, verify=verify, timeout=timeout, trust_env=trust_env, ) pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_auth.py000066400000000000000000000266001521723372100222200ustar00rootroot00000000000000from __future__ import annotations import hashlib import os import re import time import typing from base64 import b64encode from urllib.request import parse_http_list from ._exceptions import ProtocolError from ._models import Cookies, Request, Response from ._utils import to_bytes, to_str if typing.TYPE_CHECKING: from hashlib import _Hash __all__ = ["Auth", "BasicAuth", "DigestAuth", "FunctionAuth", "NetRCAuth"] class Auth: """ Base class for all authentication schemes. To implement a custom authentication scheme, subclass `Auth` and override the `.auth_flow()` method. If the authentication scheme does I/O such as disk access or network calls, or uses synchronization primitives such as locks, you should override `.sync_auth_flow()` and/or `.async_auth_flow()` instead of `.auth_flow()` to provide specialized implementations that will be used by `Client` and `AsyncClient` respectively. """ requires_request_body = False requires_response_body = False def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: """ Execute the authentication flow. To dispatch a request, `yield` it: ``` yield request ``` The client will `.send()` the response back into the flow generator. You can access it like so: ``` response = yield request ``` A `return` (or reaching the end of the generator) will result in the client returning the last response obtained from the server. You can dispatch as many requests as is necessary. """ yield request def sync_auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: """ Execute the authentication flow synchronously. By default, this defers to `.auth_flow()`. You should override this method when the authentication scheme does I/O and/or uses concurrency primitives. """ if self.requires_request_body: request.read() flow = self.auth_flow(request) request = next(flow) while True: response = yield request if self.requires_response_body: response.read() try: request = flow.send(response) except StopIteration: break async def async_auth_flow(self, request: Request) -> typing.AsyncGenerator[Request, Response]: """ Execute the authentication flow asynchronously. By default, this defers to `.auth_flow()`. You should override this method when the authentication scheme does I/O and/or uses concurrency primitives. """ if self.requires_request_body: await request.aread() flow = self.auth_flow(request) request = next(flow) while True: response = yield request if self.requires_response_body: await response.aread() try: request = flow.send(response) except StopIteration: break class FunctionAuth(Auth): """ Allows the 'auth' argument to be passed as a simple callable function, that takes the request, and returns a new, modified request. """ def __init__(self, func: typing.Callable[[Request], Request]) -> None: self._func = func def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: yield self._func(request) class BasicAuth(Auth): """ Allows the 'auth' argument to be passed as a (username, password) pair, and uses HTTP Basic authentication. """ def __init__(self, username: str | bytes, password: str | bytes) -> None: self._auth_header = self._build_auth_header(username, password) def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: request.headers["Authorization"] = self._auth_header yield request def _build_auth_header(self, username: str | bytes, password: str | bytes) -> str: userpass = b":".join((to_bytes(username), to_bytes(password))) token = b64encode(userpass).decode() return f"Basic {token}" class NetRCAuth(Auth): """ Use a 'netrc' file to lookup basic auth credentials based on the url host. """ def __init__(self, file: str | None = None) -> None: # Lazily import 'netrc'. # There's no need for us to load this module unless 'NetRCAuth' is being used. import netrc self._netrc_info = netrc.netrc(file) def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: auth_info = self._netrc_info.authenticators(request.url.host) if auth_info is None or not auth_info[2]: # The netrc file did not have authentication credentials for this host. yield request else: # Build a basic auth header with credentials from the netrc file. request.headers["Authorization"] = self._build_auth_header(username=auth_info[0], password=auth_info[2]) yield request def _build_auth_header(self, username: str | bytes, password: str | bytes) -> str: userpass = b":".join((to_bytes(username), to_bytes(password))) token = b64encode(userpass).decode() return f"Basic {token}" class DigestAuth(Auth): _ALGORITHM_TO_HASH_FUNCTION: dict[str, typing.Callable[[bytes], _Hash]] = { "MD5": hashlib.md5, "MD5-SESS": hashlib.md5, "SHA": hashlib.sha1, "SHA-SESS": hashlib.sha1, "SHA-256": hashlib.sha256, "SHA-256-SESS": hashlib.sha256, "SHA-512": hashlib.sha512, "SHA-512-SESS": hashlib.sha512, } def __init__(self, username: str | bytes, password: str | bytes) -> None: self._username = to_bytes(username) self._password = to_bytes(password) self._last_challenge: _DigestAuthChallenge | None = None self._nonce_count = 1 def auth_flow(self, request: Request) -> typing.Generator[Request, Response, None]: if self._last_challenge: request.headers["Authorization"] = self._build_auth_header(request, self._last_challenge) response = yield request if response.status_code != 401 or "www-authenticate" not in response.headers: # If the response is not a 401 then we don't # need to build an authenticated request. return for auth_header in response.headers.get_list("www-authenticate"): if auth_header.lower().startswith("digest "): break else: # If the response does not include a 'WWW-Authenticate: Digest ...' # header, then we don't need to build an authenticated request. return self._last_challenge = self._parse_challenge(request, response, auth_header) self._nonce_count = 1 request.headers["Authorization"] = self._build_auth_header(request, self._last_challenge) if response.cookies: Cookies(response.cookies).set_cookie_header(request=request) yield request def _parse_challenge(self, request: Request, response: Response, auth_header: str) -> _DigestAuthChallenge: """ Returns a challenge from a Digest WWW-Authenticate header. These take the form of: `Digest realm="realm@host.com",qop="auth,auth-int",nonce="abc",opaque="xyz"` """ scheme, _, fields = auth_header.partition(" ") # This method should only ever have been called with a Digest auth header. assert scheme.lower() == "digest" header_dict: dict[str, str] = {} for field in parse_http_list(fields): key, value = field.strip().split("=", 1) header_dict[key] = value.strip('"') try: realm = header_dict["realm"].encode() nonce = header_dict["nonce"].encode() algorithm = header_dict.get("algorithm", "MD5") opaque = header_dict["opaque"].encode() if "opaque" in header_dict else None qop = header_dict["qop"].encode() if "qop" in header_dict else None return _DigestAuthChallenge(realm=realm, nonce=nonce, algorithm=algorithm, opaque=opaque, qop=qop) except KeyError as exc: message = "Malformed Digest WWW-Authenticate header" raise ProtocolError(message, request=request) from exc def _build_auth_header(self, request: Request, challenge: _DigestAuthChallenge) -> str: hash_func = self._ALGORITHM_TO_HASH_FUNCTION[challenge.algorithm.upper()] def digest(data: bytes) -> bytes: return hash_func(data).hexdigest().encode() A1 = b":".join((self._username, challenge.realm, self._password)) path = request.url.raw_path A2 = b":".join((request.method.encode(), path)) # TODO: implement auth-int HA2 = digest(A2) nc_value = b"%08x" % self._nonce_count cnonce = self._get_client_nonce(self._nonce_count, challenge.nonce) self._nonce_count += 1 HA1 = digest(A1) if challenge.algorithm.lower().endswith("-sess"): HA1 = digest(b":".join((HA1, challenge.nonce, cnonce))) qop = self._resolve_qop(challenge.qop, request=request) if qop is None: # Following RFC 2069 digest_data = [HA1, challenge.nonce, HA2] else: # Following RFC 2617/7616 digest_data = [HA1, challenge.nonce, nc_value, cnonce, qop, HA2] format_args = { "username": self._username, "realm": challenge.realm, "nonce": challenge.nonce, "uri": path, "response": digest(b":".join(digest_data)), "algorithm": challenge.algorithm.encode(), } if challenge.opaque: format_args["opaque"] = challenge.opaque if qop: format_args["qop"] = b"auth" format_args["nc"] = nc_value format_args["cnonce"] = cnonce return "Digest " + self._get_header_value(format_args) def _get_client_nonce(self, nonce_count: int, nonce: bytes) -> bytes: s = str(nonce_count).encode() s += nonce s += time.ctime().encode() s += os.urandom(8) return hashlib.sha1(s).hexdigest()[:16].encode() def _get_header_value(self, header_fields: dict[str, bytes]) -> str: NON_QUOTED_FIELDS = ("algorithm", "qop", "nc") QUOTED_TEMPLATE = '{}="{}"' NON_QUOTED_TEMPLATE = "{}={}" header_value = "" for i, (field, value) in enumerate(header_fields.items()): if i > 0: header_value += ", " template = QUOTED_TEMPLATE if field not in NON_QUOTED_FIELDS else NON_QUOTED_TEMPLATE header_value += template.format(field, to_str(value)) return header_value def _resolve_qop(self, qop: bytes | None, request: Request) -> bytes | None: if qop is None: return None qops = re.split(b", ?", qop) if b"auth" in qops: return b"auth" if qops == [b"auth-int"]: raise NotImplementedError("Digest auth-int support is not yet implemented") message = f'Unexpected qop value "{qop!r}" in digest auth' raise ProtocolError(message, request=request) class _DigestAuthChallenge(typing.NamedTuple): realm: bytes nonce: bytes algorithm: str opaque: bytes | None qop: bytes | None pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_client.py000066400000000000000000002053211521723372100225340ustar00rootroot00000000000000from __future__ import annotations import datetime import enum import logging import time import typing import warnings from collections.abc import AsyncGenerator, Generator from contextlib import asynccontextmanager, contextmanager from types import TracebackType from .__version__ import __version__ from ._auth import Auth, BasicAuth, FunctionAuth from ._config import ( DEFAULT_LIMITS, DEFAULT_MAX_REDIRECTS, DEFAULT_TIMEOUT_CONFIG, Limits, Proxy, Timeout, ) from ._decoders import SUPPORTED_DECODERS from ._exceptions import ( InvalidURL, RemoteProtocolError, TooManyRedirects, request_context, ) from ._models import Cookies, Headers, Request, Response from ._sse import EventSource from ._status_codes import codes from ._transports.base import AsyncBaseTransport, BaseTransport from ._transports.default import AsyncHTTPTransport, HTTPTransport from ._types import ( AsyncByteStream, AuthTypes, CertTypes, CookieTypes, HeaderTypes, ProxyTypes, QueryParamTypes, RequestContent, RequestData, RequestExtensions, RequestFiles, SyncByteStream, TimeoutTypes, ) from ._urls import URL, QueryParams from ._utils import URLPattern, get_environment_proxies if typing.TYPE_CHECKING: import ssl # pragma: no cover __all__ = ["USE_CLIENT_DEFAULT", "AsyncClient", "Client"] # The type annotation for @classmethod and context managers here follows PEP 484 # https://www.python.org/dev/peps/pep-0484/#annotating-instance-and-class-methods T = typing.TypeVar("T", bound="Client") U = typing.TypeVar("U", bound="AsyncClient") def _is_https_redirect(url: URL, location: URL) -> bool: """ Return 'True' if 'location' is a HTTPS upgrade of 'url' """ if url.host != location.host: return False return ( url.scheme == "http" and _port_or_default(url) == 80 and location.scheme == "https" and _port_or_default(location) == 443 ) def _port_or_default(url: URL) -> int | None: if url.port is not None: return url.port return {"http": 80, "https": 443}.get(url.scheme) def _same_origin(url: URL, other: URL) -> bool: """ Return 'True' if the given URLs share the same origin. """ return url.scheme == other.scheme and url.host == other.host and _port_or_default(url) == _port_or_default(other) class UseClientDefault: """ For some parameters such as `auth=...` and `timeout=...` we need to be able to indicate the default "unset" state, in a way that is distinctly different to using `None`. The default "unset" state indicates that whatever default is set on the client should be used. This is different to setting `None`, which explicitly disables the parameter, possibly overriding a client default. For example we use `timeout=USE_CLIENT_DEFAULT` in the `request()` signature. Omitting the `timeout` parameter will send a request using whatever default timeout has been configured on the client. Including `timeout=None` will ensure no timeout is used. Note that user code shouldn't need to use the `USE_CLIENT_DEFAULT` constant, but it is used internally when a parameter is not included. """ USE_CLIENT_DEFAULT = UseClientDefault() logger = logging.getLogger("httpx2") USER_AGENT = f"python-httpx2/{__version__}" ACCEPT_ENCODING = ", ".join([key for key in SUPPORTED_DECODERS.keys() if key != "identity"]) class ClientState(enum.Enum): # UNOPENED: # The client has been instantiated, but has not been used to send a request, # or been opened by entering the context of a `with` block. UNOPENED = 1 # OPENED: # The client has either sent a request, or is within a `with` block. OPENED = 2 # CLOSED: # The client has either exited the `with` block, or `close()` has # been called explicitly. CLOSED = 3 class BoundSyncStream(SyncByteStream): """ A byte stream that tracks elapsed time for a response. Once closed, the elapsed time is available via the `elapsed` attribute, and the response can read it back from `response.stream.elapsed`. """ def __init__(self, stream: SyncByteStream, start: float) -> None: self._stream = stream self._start = start self.elapsed: datetime.timedelta | None = None def __iter__(self) -> typing.Iterator[bytes]: yield from self._stream def close(self) -> None: self.elapsed = datetime.timedelta(seconds=time.perf_counter() - self._start) self._stream.close() class BoundAsyncStream(AsyncByteStream): """ An async byte stream that tracks elapsed time for a response. Once closed, the elapsed time is available via the `elapsed` attribute, and the response can read it back from `response.stream.elapsed`. """ def __init__(self, stream: AsyncByteStream, start: float) -> None: self._stream = stream self._start = start self.elapsed: datetime.timedelta | None = None async def __aiter__(self) -> typing.AsyncIterator[bytes]: async for chunk in self._stream: yield chunk async def aclose(self) -> None: self.elapsed = datetime.timedelta(seconds=time.perf_counter() - self._start) await self._stream.aclose() EventHook = typing.Callable[..., typing.Any] class BaseClient: def __init__( self, *, auth: AuthTypes | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, follow_redirects: bool = False, max_redirects: int = DEFAULT_MAX_REDIRECTS, event_hooks: None | (typing.Mapping[str, list[EventHook]]) = None, base_url: URL | str = "", trust_env: bool = True, default_encoding: str | typing.Callable[[bytes], str | None] = "utf-8", ) -> None: event_hooks = {} if event_hooks is None else event_hooks self._base_url = self._enforce_trailing_slash(URL(base_url)) self._auth = self._build_auth(auth) self._params = QueryParams(params) self.headers = Headers(headers) self._cookies = Cookies(cookies) self._timeout = Timeout(timeout) self.follow_redirects = follow_redirects self.max_redirects = max_redirects self._event_hooks = { "request": list(event_hooks.get("request", [])), "response": list(event_hooks.get("response", [])), } self._trust_env = trust_env self._default_encoding = default_encoding self._state = ClientState.UNOPENED @property def is_closed(self) -> bool: """ Check if the client being closed """ return self._state == ClientState.CLOSED @property def trust_env(self) -> bool: return self._trust_env def _enforce_trailing_slash(self, url: URL) -> URL: if url.raw_path.endswith(b"/"): return url return url.copy_with(raw_path=url.raw_path + b"/") def _get_proxy_map(self, proxy: ProxyTypes | None, allow_env_proxies: bool) -> dict[str, Proxy | None]: if proxy is None: if allow_env_proxies: return {key: None if url is None else Proxy(url=url) for key, url in get_environment_proxies().items()} return {} else: proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy return {"all://": proxy} @property def timeout(self) -> Timeout: return self._timeout @timeout.setter def timeout(self, timeout: TimeoutTypes) -> None: self._timeout = Timeout(timeout) @property def event_hooks(self) -> dict[str, list[EventHook]]: return self._event_hooks @event_hooks.setter def event_hooks(self, event_hooks: dict[str, list[EventHook]]) -> None: self._event_hooks = { "request": list(event_hooks.get("request", [])), "response": list(event_hooks.get("response", [])), } @property def auth(self) -> Auth | None: """ Authentication class used when none is passed at the request-level. See also [Authentication][0]. [0]: /quickstart/#authentication """ return self._auth @auth.setter def auth(self, auth: AuthTypes) -> None: self._auth = self._build_auth(auth) @property def base_url(self) -> URL: """ Base URL to use when sending requests with relative URLs. """ return self._base_url @base_url.setter def base_url(self, url: URL | str) -> None: self._base_url = self._enforce_trailing_slash(URL(url)) @property def headers(self) -> Headers: """ HTTP headers to include when sending requests. """ return self._headers @headers.setter def headers(self, headers: HeaderTypes) -> None: client_headers = Headers( { b"Accept": b"*/*", b"Accept-Encoding": ACCEPT_ENCODING.encode("ascii"), b"Connection": b"keep-alive", b"User-Agent": USER_AGENT.encode("ascii"), } ) client_headers.update(headers) self._headers = client_headers @property def cookies(self) -> Cookies: """ Cookie values to include when sending requests. """ return self._cookies @cookies.setter def cookies(self, cookies: CookieTypes) -> None: self._cookies = Cookies(cookies) @property def params(self) -> QueryParams: """ Query parameters to include in the URL when sending requests. """ return self._params @params.setter def params(self, params: QueryParamTypes) -> None: self._params = QueryParams(params) def build_request( self, method: str, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Request: """ Build and return a request instance. * The `params`, `headers` and `cookies` arguments are merged with any values set on the client. * The `url` argument is merged with any `base_url` set on the client. See also: [Request instances][0] [0]: /advanced/clients/#request-instances """ url = self._merge_url(url) headers = self._merge_headers(headers) cookies = self._merge_cookies(cookies) params = self._merge_queryparams(params) extensions = {} if extensions is None else extensions if "timeout" not in extensions: timeout = self.timeout if isinstance(timeout, UseClientDefault) else Timeout(timeout) extensions = dict(**extensions, timeout=timeout.as_dict()) return Request( method, url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, extensions=extensions, ) def _merge_url(self, url: URL | str) -> URL: """ Merge a URL argument together with any 'base_url' on the client, to create the URL used for the outgoing request. """ merge_url = URL(url) if merge_url.is_relative_url: # To merge URLs we always append to the base URL. To get this # behaviour correct we always ensure the base URL ends in a '/' # separator, and strip any leading '/' from the merge URL. # # So, eg... # # >>> client = Client(base_url="https://www.example.com/subpath") # >>> client.base_url # URL('https://www.example.com/subpath/') # >>> client.build_request("GET", "/path").url # URL('https://www.example.com/subpath/path') merge_raw_path = self.base_url.raw_path + merge_url.raw_path.lstrip(b"/") return self.base_url.copy_with(raw_path=merge_raw_path) return merge_url def _merge_cookies(self, cookies: CookieTypes | None = None) -> CookieTypes | None: """ Merge a cookies argument together with any cookies on the client, to create the cookies used for the outgoing request. """ if cookies or self.cookies: merged_cookies = Cookies(self.cookies) merged_cookies.update(cookies) return merged_cookies return cookies def _merge_headers(self, headers: HeaderTypes | None = None) -> HeaderTypes | None: """ Merge a headers argument together with any headers on the client, to create the headers used for the outgoing request. """ merged_headers = Headers(self.headers) merged_headers.update(headers) return merged_headers def _merge_queryparams(self, params: QueryParamTypes | None = None) -> QueryParamTypes | None: """ Merge a queryparams argument together with any queryparams on the client, to create the queryparams used for the outgoing request. """ if params or self.params: merged_queryparams = QueryParams(self.params) return merged_queryparams.merge(params) return params def _build_auth(self, auth: AuthTypes | None) -> Auth | None: if auth is None: return None elif isinstance(auth, tuple): return BasicAuth(username=auth[0], password=auth[1]) elif isinstance(auth, Auth): return auth elif callable(auth): return FunctionAuth(func=auth) else: raise TypeError(f'Invalid "auth" argument: {auth!r}') def _build_request_auth( self, request: Request, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, ) -> Auth: auth = self._auth if isinstance(auth, UseClientDefault) else self._build_auth(auth) if auth is not None: return auth username, password = request.url.username, request.url.password if username or password: return BasicAuth(username=username, password=password) return Auth() def _build_redirect_request(self, request: Request, response: Response) -> Request: """ Given a request and a redirect response, return a new request that should be used to effect the redirect. """ method = self._redirect_method(request, response) url = self._redirect_url(request, response) headers = self._redirect_headers(request, url, method) stream = self._redirect_stream(request, method) cookies = Cookies(self.cookies) return Request( method=method, url=url, headers=headers, cookies=cookies, stream=stream, extensions=request.extensions, ) def _redirect_method(self, request: Request, response: Response) -> str: """ When being redirected we may want to change the method of the request based on certain specs or browser behavior. """ method = request.method # https://tools.ietf.org/html/rfc7231#section-6.4.4 if response.status_code == codes.SEE_OTHER and method != "HEAD": method = "GET" # Do what the browsers do, despite standards... # Turn 302s into GETs. if response.status_code == codes.FOUND and method != "HEAD": method = "GET" # If a POST is responded to with a 301, turn it into a GET. # This bizarre behaviour is explained in 'requests' issue 1704. if response.status_code == codes.MOVED_PERMANENTLY and method == "POST": method = "GET" return method def _redirect_url(self, request: Request, response: Response) -> URL: """ Return the URL for the redirect to follow. """ location = response.headers["Location"] try: url = URL(location) except InvalidURL as exc: raise RemoteProtocolError(f"Invalid URL in location header: {exc}.", request=request) from None # Handle malformed 'Location' headers that are "absolute" form, have no host. # See: https://github.com/encode/httpx/issues/771 if url.scheme and not url.host: url = url.copy_with(host=request.url.host) # Facilitate relative 'Location' headers, as allowed by RFC 7231. # (e.g. '/path/to/resource' instead of 'http://domain.tld/path/to/resource') if url.is_relative_url: url = request.url.join(url) # Attach previous fragment if needed (RFC 7231 7.1.2) if request.url.fragment and not url.fragment: url = url.copy_with(fragment=request.url.fragment) return url def _redirect_headers(self, request: Request, url: URL, method: str) -> Headers: """ Return the headers that should be used for the redirect request. """ headers = Headers(request.headers) if not _same_origin(url, request.url): if not _is_https_redirect(request.url, url): # Strip Authorization headers when responses are redirected # away from the origin. (Except for direct HTTP to HTTPS redirects.) headers.pop("Authorization", None) # Update the Host header. headers["Host"] = url.netloc.decode("ascii") if method != request.method and method == "GET": # If we've switch to a 'GET' request, then strip any headers which # are only relevant to the request body. headers.pop("Content-Length", None) headers.pop("Transfer-Encoding", None) # We should use the client cookie store to determine any cookie header, # rather than whatever was on the original outgoing request. headers.pop("Cookie", None) return headers def _redirect_stream(self, request: Request, method: str) -> SyncByteStream | AsyncByteStream | None: """ Return the body that should be used for the redirect request. """ if method != request.method and method == "GET": return None return request.stream def _set_timeout(self, request: Request) -> None: if "timeout" not in request.extensions: timeout = self.timeout if isinstance(self.timeout, UseClientDefault) else Timeout(self.timeout) request.extensions = dict(**request.extensions, timeout=timeout.as_dict()) class Client(BaseClient): """ An HTTP client, with connection pooling, HTTP/2, redirects, cookie persistence, etc. It can be shared between threads. Usage: ```python >>> client = httpx2.Client() >>> response = client.get('https://example.org') ``` **Parameters:** * **auth** - *(optional)* An authentication class to use when sending requests. * **params** - *(optional)* Query parameters to include in request URLs, as a string, dictionary, or sequence of two-tuples. * **headers** - *(optional)* Dictionary of HTTP headers to include when sending requests. * **cookies** - *(optional)* Dictionary of Cookie items to include when sending requests. * **verify** - *(optional)* Either `True` to use an SSL context with the default CA bundle, `False` to disable verification, or an instance of `ssl.SSLContext` to use a custom context. * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be enabled. Defaults to `False`. * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. * **mounts** - *(optional)* A dictionary mapping URL patterns to transports, used to route requests through specific transports based on the URL. * **timeout** - *(optional)* The timeout configuration to use when sending requests. * **limits** - *(optional)* The limits configuration to use. * **max_redirects** - *(optional)* The maximum number of redirect responses that should be followed. * **base_url** - *(optional)* A URL to use as the base when building request URLs. * **transport** - *(optional)* A transport class to use for sending requests over the network. * **trust_env** - *(optional)* Enables or disables usage of environment variables for configuration. * **default_encoding** - *(optional)* The default encoding to use for decoding response text, if no charset information is included in a response Content-Type header. Set to a callable for automatic character set detection. Default: "utf-8". """ def __init__( self, *, auth: AuthTypes | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, verify: ssl.SSLContext | str | bool = True, cert: CertTypes | None = None, trust_env: bool = True, http1: bool = True, http2: bool = False, proxy: ProxyTypes | None = None, mounts: None | (typing.Mapping[str, BaseTransport | None]) = None, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, follow_redirects: bool = False, limits: Limits = DEFAULT_LIMITS, max_redirects: int = DEFAULT_MAX_REDIRECTS, event_hooks: None | (typing.Mapping[str, list[EventHook]]) = None, base_url: URL | str = "", transport: BaseTransport | None = None, default_encoding: str | typing.Callable[[bytes], str | None] = "utf-8", ) -> None: super().__init__( auth=auth, params=params, headers=headers, cookies=cookies, timeout=timeout, follow_redirects=follow_redirects, max_redirects=max_redirects, event_hooks=event_hooks, base_url=base_url, trust_env=trust_env, default_encoding=default_encoding, ) if http2: try: import h2 # noqa except ImportError: # pragma: no cover raise ImportError( "Using http2=True, but the 'h2' package is not installed. " "Make sure to install httpx using `pip install httpx[http2]`." ) from None allow_env_proxies = trust_env and transport is None proxy_map = self._get_proxy_map(proxy, allow_env_proxies) self._transport = self._init_transport( verify=verify, cert=cert, trust_env=trust_env, http1=http1, http2=http2, limits=limits, transport=transport, ) self._mounts: dict[URLPattern, BaseTransport | None] = { URLPattern(key): None if proxy is None else self._init_proxy_transport( proxy, verify=verify, cert=cert, trust_env=trust_env, http1=http1, http2=http2, limits=limits, ) for key, proxy in proxy_map.items() } if mounts is not None: self._mounts.update({URLPattern(key): transport for key, transport in mounts.items()}) self._mounts = dict(sorted(self._mounts.items())) def _init_transport( self, verify: ssl.SSLContext | str | bool = True, cert: CertTypes | None = None, trust_env: bool = True, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, transport: BaseTransport | None = None, ) -> BaseTransport: if transport is not None: return transport return HTTPTransport( verify=verify, cert=cert, trust_env=trust_env, http1=http1, http2=http2, limits=limits, ) def _init_proxy_transport( self, proxy: Proxy, verify: ssl.SSLContext | str | bool = True, cert: CertTypes | None = None, trust_env: bool = True, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, ) -> BaseTransport: return HTTPTransport( verify=verify, cert=cert, trust_env=trust_env, http1=http1, http2=http2, limits=limits, proxy=proxy, ) def _transport_for_url(self, url: URL) -> BaseTransport: """ Returns the transport instance that should be used for a given URL. This will either be the standard connection pool, or a proxy. """ for pattern, transport in self._mounts.items(): if pattern.matches(url): return self._transport if transport is None else transport return self._transport def request( self, method: str, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Build and send a request. Equivalent to: ```python request = client.build_request(...) response = client.send(request, ...) ``` See `Client.build_request()`, `Client.send()` and [Merging of configuration][0] for how the various parameters are merged with client-level configuration. [0]: /advanced/clients/#merging-of-configuration """ if cookies is not None: message = ( "Setting per-request cookies=<...> is being deprecated, because " "the expected behaviour on cookie persistence is ambiguous. Set " "cookies directly on the client instance instead." ) warnings.warn(message, DeprecationWarning, stacklevel=2) request = self.build_request( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, timeout=timeout, extensions=extensions, ) return self.send(request, auth=auth, follow_redirects=follow_redirects) @contextmanager def stream( self, method: str, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Generator[Response]: """ Alternative to `httpx2.request()` that streams the response body instead of loading it into memory at once. **Parameters**: See `httpx2.request`. See also: [Streaming Responses][0] [0]: /quickstart#streaming-responses """ request = self.build_request( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, timeout=timeout, extensions=extensions, ) response = self.send( request=request, auth=auth, follow_redirects=follow_redirects, stream=True, ) try: yield response finally: response.close() @contextmanager def sse( self, url: URL | str, *, method: str = "GET", content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Generator[EventSource]: """ Connect to a server-sent events endpoint and yield an `EventSource`. Iterating the `EventSource` yields `ServerSentEvent` instances. **Parameters**: See `httpx2.request`. """ with self.stream( method, url, content=content, data=data, files=files, json=json, params=params, headers={"Accept": "text/event-stream", "Cache-Control": "no-store"} | Headers(headers), cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) as response: yield EventSource(response) def send( self, request: Request, *, stream: bool = False, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, ) -> Response: """ Send a request. The request is sent as-is, unmodified. Typically you'll want to build one with `Client.build_request()` so that any client-level configuration is merged into the request, but passing an explicit `httpx2.Request()` is supported as well. See also: [Request instances][0] [0]: /advanced/clients/#request-instances """ if self._state == ClientState.CLOSED: raise RuntimeError("Cannot send a request, as the client has been closed.") self._state = ClientState.OPENED follow_redirects = self.follow_redirects if isinstance(follow_redirects, UseClientDefault) else follow_redirects self._set_timeout(request) auth = self._build_request_auth(request, auth) response = self._send_handling_auth( request, auth=auth, follow_redirects=follow_redirects, history=[], ) try: if not stream: response.read() return response except BaseException as exc: response.close() raise exc def _send_handling_auth( self, request: Request, auth: Auth, follow_redirects: bool, history: list[Response], ) -> Response: auth_flow = auth.sync_auth_flow(request) try: request = next(auth_flow) while True: response = self._send_handling_redirects( request, follow_redirects=follow_redirects, history=history, ) try: try: next_request = auth_flow.send(response) except StopIteration: return response response.history = list(history) response.read() request = next_request history.append(response) except BaseException as exc: response.close() raise exc finally: auth_flow.close() def _send_handling_redirects( self, request: Request, follow_redirects: bool, history: list[Response], ) -> Response: while True: if len(history) > self.max_redirects: raise TooManyRedirects("Exceeded maximum allowed redirects.", request=request) for hook in self._event_hooks["request"]: hook(request) response = self._send_single_request(request) try: for hook in self._event_hooks["response"]: hook(response) response.history = list(history) if not response.has_redirect_location: return response request = self._build_redirect_request(request, response) history = history + [response] if follow_redirects: response.read() else: response.next_request = request return response except BaseException as exc: response.close() raise exc def _send_single_request(self, request: Request) -> Response: """ Sends a single request, without handling any redirections. """ transport = self._transport_for_url(request.url) start = time.perf_counter() if not isinstance(request.stream, SyncByteStream): raise RuntimeError("Attempted to send an async request with a sync Client instance.") with request_context(request=request): response = transport.handle_request(request) assert isinstance(response.stream, SyncByteStream) response.request = request response.stream = BoundSyncStream(response.stream, start=start) self.cookies.extract_cookies(response) response.default_encoding = self._default_encoding logger.info( 'HTTP Request: %s %s "%s %d %s"', request.method, request.url, response.http_version, response.status_code, response.reason_phrase, ) return response def get( self, url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `GET` request. **Parameters**: See `httpx2.request`. """ return self.request( "GET", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def options( self, url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send an `OPTIONS` request. **Parameters**: See `httpx2.request`. """ return self.request( "OPTIONS", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def head( self, url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `HEAD` request. **Parameters**: See `httpx2.request`. """ return self.request( "HEAD", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def post( self, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `POST` request. **Parameters**: See `httpx2.request`. """ return self.request( "POST", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def put( self, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `PUT` request. **Parameters**: See `httpx2.request`. """ return self.request( "PUT", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def patch( self, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `PATCH` request. **Parameters**: See `httpx2.request`. """ return self.request( "PATCH", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def delete( self, url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `DELETE` request. **Parameters**: See `httpx2.request`. """ return self.request( "DELETE", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) def close(self) -> None: """ Close transport and proxies. """ if self._state != ClientState.CLOSED: self._state = ClientState.CLOSED self._transport.close() for transport in self._mounts.values(): if transport is not None: transport.close() def __enter__(self: T) -> T: if self._state != ClientState.UNOPENED: msg = { ClientState.OPENED: "Cannot open a client instance more than once.", ClientState.CLOSED: ("Cannot reopen a client instance, once it has been closed."), }[self._state] raise RuntimeError(msg) self._state = ClientState.OPENED self._transport.__enter__() for transport in self._mounts.values(): if transport is not None: transport.__enter__() return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: TracebackType | None = None, ) -> None: self._state = ClientState.CLOSED self._transport.__exit__(exc_type, exc_value, traceback) for transport in self._mounts.values(): if transport is not None: transport.__exit__(exc_type, exc_value, traceback) class AsyncClient(BaseClient): """ An asynchronous HTTP client, with connection pooling, HTTP/2, redirects, cookie persistence, etc. It can be shared between tasks. Usage: ```python >>> async with httpx2.AsyncClient() as client: >>> response = await client.get('https://example.org') ``` **Parameters:** * **auth** - *(optional)* An authentication class to use when sending requests. * **params** - *(optional)* Query parameters to include in request URLs, as a string, dictionary, or sequence of two-tuples. * **headers** - *(optional)* Dictionary of HTTP headers to include when sending requests. * **cookies** - *(optional)* Dictionary of Cookie items to include when sending requests. * **verify** - *(optional)* Either `True` to use an SSL context with the default CA bundle, `False` to disable verification, or an instance of `ssl.SSLContext` to use a custom context. * **http2** - *(optional)* A boolean indicating if HTTP/2 support should be enabled. Defaults to `False`. * **proxy** - *(optional)* A proxy URL where all the traffic should be routed. * **mounts** - *(optional)* A dictionary mapping URL patterns to transports, used to route requests through specific transports based on the URL. * **timeout** - *(optional)* The timeout configuration to use when sending requests. * **limits** - *(optional)* The limits configuration to use. * **max_redirects** - *(optional)* The maximum number of redirect responses that should be followed. * **base_url** - *(optional)* A URL to use as the base when building request URLs. * **transport** - *(optional)* A transport class to use for sending requests over the network. * **trust_env** - *(optional)* Enables or disables usage of environment variables for configuration. * **default_encoding** - *(optional)* The default encoding to use for decoding response text, if no charset information is included in a response Content-Type header. Set to a callable for automatic character set detection. Default: "utf-8". """ def __init__( self, *, auth: AuthTypes | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, verify: ssl.SSLContext | str | bool = True, cert: CertTypes | None = None, http1: bool = True, http2: bool = False, proxy: ProxyTypes | None = None, mounts: None | (typing.Mapping[str, AsyncBaseTransport | None]) = None, timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG, follow_redirects: bool = False, limits: Limits = DEFAULT_LIMITS, max_redirects: int = DEFAULT_MAX_REDIRECTS, event_hooks: None | (typing.Mapping[str, list[EventHook]]) = None, base_url: URL | str = "", transport: AsyncBaseTransport | None = None, trust_env: bool = True, default_encoding: str | typing.Callable[[bytes], str | None] = "utf-8", ) -> None: super().__init__( auth=auth, params=params, headers=headers, cookies=cookies, timeout=timeout, follow_redirects=follow_redirects, max_redirects=max_redirects, event_hooks=event_hooks, base_url=base_url, trust_env=trust_env, default_encoding=default_encoding, ) if http2: try: import h2 # noqa except ImportError: # pragma: no cover raise ImportError( "Using http2=True, but the 'h2' package is not installed. " "Make sure to install httpx using `pip install httpx[http2]`." ) from None allow_env_proxies = trust_env and transport is None proxy_map = self._get_proxy_map(proxy, allow_env_proxies) self._transport = self._init_transport( verify=verify, cert=cert, trust_env=trust_env, http1=http1, http2=http2, limits=limits, transport=transport, ) self._mounts: dict[URLPattern, AsyncBaseTransport | None] = { URLPattern(key): None if proxy is None else self._init_proxy_transport( proxy, verify=verify, cert=cert, trust_env=trust_env, http1=http1, http2=http2, limits=limits, ) for key, proxy in proxy_map.items() } if mounts is not None: self._mounts.update({URLPattern(key): transport for key, transport in mounts.items()}) self._mounts = dict(sorted(self._mounts.items())) def _init_transport( self, verify: ssl.SSLContext | str | bool = True, cert: CertTypes | None = None, trust_env: bool = True, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, transport: AsyncBaseTransport | None = None, ) -> AsyncBaseTransport: if transport is not None: return transport return AsyncHTTPTransport( verify=verify, cert=cert, trust_env=trust_env, http1=http1, http2=http2, limits=limits, ) def _init_proxy_transport( self, proxy: Proxy, verify: ssl.SSLContext | str | bool = True, cert: CertTypes | None = None, trust_env: bool = True, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, ) -> AsyncBaseTransport: return AsyncHTTPTransport( verify=verify, cert=cert, trust_env=trust_env, http1=http1, http2=http2, limits=limits, proxy=proxy, ) def _transport_for_url(self, url: URL) -> AsyncBaseTransport: """ Returns the transport instance that should be used for a given URL. This will either be the standard connection pool, or a proxy. """ for pattern, transport in self._mounts.items(): if pattern.matches(url): return self._transport if transport is None else transport return self._transport async def request( self, method: str, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Build and send a request. Equivalent to: ```python request = client.build_request(...) response = await client.send(request, ...) ``` See `AsyncClient.build_request()`, `AsyncClient.send()` and [Merging of configuration][0] for how the various parameters are merged with client-level configuration. [0]: /advanced/clients/#merging-of-configuration """ if cookies is not None: # pragma: no cover message = ( "Setting per-request cookies=<...> is being deprecated, because " "the expected behaviour on cookie persistence is ambiguous. Set " "cookies directly on the client instance instead." ) warnings.warn(message, DeprecationWarning, stacklevel=2) request = self.build_request( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, timeout=timeout, extensions=extensions, ) return await self.send(request, auth=auth, follow_redirects=follow_redirects) @asynccontextmanager async def stream( self, method: str, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> AsyncGenerator[Response]: """ Alternative to `httpx2.request()` that streams the response body instead of loading it into memory at once. **Parameters**: See `httpx2.request`. See also: [Streaming Responses][0] [0]: /quickstart#streaming-responses """ request = self.build_request( method=method, url=url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, timeout=timeout, extensions=extensions, ) response = await self.send( request=request, auth=auth, follow_redirects=follow_redirects, stream=True, ) try: yield response finally: await response.aclose() @asynccontextmanager async def sse( self, url: URL | str, *, method: str = "GET", content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> AsyncGenerator[EventSource]: """ Connect to a server-sent events endpoint and yield an `EventSource`. Iterating the `EventSource` yields `ServerSentEvent` instances. **Parameters**: See `httpx2.request`. """ async with self.stream( method, url, content=content, data=data, files=files, json=json, params=params, headers={"Accept": "text/event-stream", "Cache-Control": "no-store"} | Headers(headers), cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) as response: yield EventSource(response) async def send( self, request: Request, *, stream: bool = False, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, ) -> Response: """ Send a request. The request is sent as-is, unmodified. Typically you'll want to build one with `AsyncClient.build_request()` so that any client-level configuration is merged into the request, but passing an explicit `httpx2.Request()` is supported as well. See also: [Request instances][0] [0]: /advanced/clients/#request-instances """ if self._state == ClientState.CLOSED: raise RuntimeError("Cannot send a request, as the client has been closed.") self._state = ClientState.OPENED follow_redirects = self.follow_redirects if isinstance(follow_redirects, UseClientDefault) else follow_redirects self._set_timeout(request) auth = self._build_request_auth(request, auth) response = await self._send_handling_auth( request, auth=auth, follow_redirects=follow_redirects, history=[], ) try: if not stream: await response.aread() return response except BaseException as exc: await response.aclose() raise exc async def _send_handling_auth( self, request: Request, auth: Auth, follow_redirects: bool, history: list[Response], ) -> Response: auth_flow = auth.async_auth_flow(request) try: request = await auth_flow.__anext__() while True: response = await self._send_handling_redirects( request, follow_redirects=follow_redirects, history=history, ) try: try: next_request = await auth_flow.asend(response) except StopAsyncIteration: return response response.history = list(history) await response.aread() request = next_request history.append(response) except BaseException as exc: await response.aclose() raise exc finally: await auth_flow.aclose() async def _send_handling_redirects( self, request: Request, follow_redirects: bool, history: list[Response], ) -> Response: while True: if len(history) > self.max_redirects: raise TooManyRedirects("Exceeded maximum allowed redirects.", request=request) for hook in self._event_hooks["request"]: await hook(request) response = await self._send_single_request(request) try: for hook in self._event_hooks["response"]: await hook(response) response.history = list(history) if not response.has_redirect_location: return response request = self._build_redirect_request(request, response) history = history + [response] if follow_redirects: await response.aread() else: response.next_request = request return response except BaseException as exc: await response.aclose() raise exc async def _send_single_request(self, request: Request) -> Response: """ Sends a single request, without handling any redirections. """ transport = self._transport_for_url(request.url) start = time.perf_counter() if not isinstance(request.stream, AsyncByteStream): raise RuntimeError("Attempted to send a sync request with an AsyncClient instance.") with request_context(request=request): response = await transport.handle_async_request(request) assert isinstance(response.stream, AsyncByteStream) response.request = request response.stream = BoundAsyncStream(response.stream, start=start) self.cookies.extract_cookies(response) response.default_encoding = self._default_encoding logger.info( 'HTTP Request: %s %s "%s %d %s"', request.method, request.url, response.http_version, response.status_code, response.reason_phrase, ) return response async def get( self, url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault | None = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `GET` request. **Parameters**: See `httpx2.request`. """ return await self.request( "GET", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def options( self, url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send an `OPTIONS` request. **Parameters**: See `httpx2.request`. """ return await self.request( "OPTIONS", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def head( self, url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `HEAD` request. **Parameters**: See `httpx2.request`. """ return await self.request( "HEAD", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def post( self, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `POST` request. **Parameters**: See `httpx2.request`. """ return await self.request( "POST", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def put( self, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `PUT` request. **Parameters**: See `httpx2.request`. """ return await self.request( "PUT", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def patch( self, url: URL | str, *, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `PATCH` request. **Parameters**: See `httpx2.request`. """ return await self.request( "PATCH", url, content=content, data=data, files=files, json=json, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def delete( self, url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, auth: AuthTypes | UseClientDefault = USE_CLIENT_DEFAULT, follow_redirects: bool | UseClientDefault = USE_CLIENT_DEFAULT, timeout: TimeoutTypes | UseClientDefault = USE_CLIENT_DEFAULT, extensions: RequestExtensions | None = None, ) -> Response: """ Send a `DELETE` request. **Parameters**: See `httpx2.request`. """ return await self.request( "DELETE", url, params=params, headers=headers, cookies=cookies, auth=auth, follow_redirects=follow_redirects, timeout=timeout, extensions=extensions, ) async def aclose(self) -> None: """ Close transport and proxies. """ if self._state != ClientState.CLOSED: self._state = ClientState.CLOSED await self._transport.aclose() for proxy in self._mounts.values(): if proxy is not None: await proxy.aclose() async def __aenter__(self: U) -> U: if self._state != ClientState.UNOPENED: msg = { ClientState.OPENED: "Cannot open a client instance more than once.", ClientState.CLOSED: ("Cannot reopen a client instance, once it has been closed."), }[self._state] raise RuntimeError(msg) self._state = ClientState.OPENED await self._transport.__aenter__() for proxy in self._mounts.values(): if proxy is not None: await proxy.__aenter__() return self async def __aexit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: TracebackType | None = None, ) -> None: self._state = ClientState.CLOSED await self._transport.__aexit__(exc_type, exc_value, traceback) for proxy in self._mounts.values(): if proxy is not None: await proxy.__aexit__(exc_type, exc_value, traceback) pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_config.py000066400000000000000000000210011521723372100225120ustar00rootroot00000000000000from __future__ import annotations import os import typing from ._models import Headers from ._types import CertTypes, HeaderTypes, TimeoutTypes from ._urls import URL if typing.TYPE_CHECKING: import ssl # pragma: no cover __all__ = ["Limits", "Proxy", "Timeout", "create_ssl_context"] class UnsetType: pass # pragma: no cover UNSET = UnsetType() def create_ssl_context( verify: ssl.SSLContext | str | bool = True, cert: CertTypes | None = None, trust_env: bool = True, ) -> ssl.SSLContext: import ssl import warnings import truststore if verify is True: if trust_env and os.environ.get("SSL_CERT_FILE"): # pragma: no cover ctx = ssl.create_default_context(cafile=os.environ["SSL_CERT_FILE"]) elif trust_env and os.environ.get("SSL_CERT_DIR"): # pragma: no cover ctx = ssl.create_default_context(capath=os.environ["SSL_CERT_DIR"]) else: # Default case: rely on the system trust store via `truststore`. ctx = truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) elif verify is False: ctx = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) ctx.check_hostname = False ctx.verify_mode = ssl.CERT_NONE elif isinstance(verify, str): if cert: raise TypeError( "`verify=` cannot be combined with `cert=...`. " "Build an `ssl.SSLContext` and pass it as `verify=`, " "using `.load_cert_chain()` to configure the certificate chain." ) message = ( "`verify=` is deprecated. " "Use `verify=ssl.create_default_context(cafile=...)` " "or `verify=ssl.create_default_context(capath=...)` instead." ) warnings.warn(message, DeprecationWarning) if os.path.isdir(verify): # pragma: no cover return ssl.create_default_context(capath=verify) return ssl.create_default_context(cafile=verify) else: ctx = verify if cert: # pragma: no cover message = ( "`cert=...` is deprecated. Use `verify=` instead," "with `.load_cert_chain()` to configure the certificate chain." ) warnings.warn(message, DeprecationWarning) if isinstance(cert, str): ctx.load_cert_chain(cert) else: ctx.load_cert_chain(*cert) return ctx class Timeout: """ Timeout configuration. **Usage**: Timeout(None) # No timeouts. Timeout(5.0) # 5s timeout on all operations. Timeout(None, connect=5.0) # 5s timeout on connect, no other timeouts. Timeout(5.0, connect=10.0) # 10s timeout on connect. 5s timeout elsewhere. Timeout(5.0, pool=None) # No timeout on acquiring connection from pool. # 5s timeout elsewhere. """ connect: float | None read: float | None write: float | None pool: float | None def __init__( self, timeout: TimeoutTypes | UnsetType = UNSET, *, connect: None | float | UnsetType = UNSET, read: None | float | UnsetType = UNSET, write: None | float | UnsetType = UNSET, pool: None | float | UnsetType = UNSET, ) -> None: if isinstance(timeout, Timeout): # Passed as a single explicit Timeout. assert connect is UNSET assert read is UNSET assert write is UNSET assert pool is UNSET self.connect = timeout.connect self.read = timeout.read self.write = timeout.write self.pool = timeout.pool elif isinstance(timeout, tuple): # Passed as a tuple. self.connect = timeout[0] self.read = timeout[1] self.write = None if len(timeout) < 3 else timeout[2] self.pool = None if len(timeout) < 4 else timeout[3] elif not ( isinstance(connect, UnsetType) or isinstance(read, UnsetType) or isinstance(write, UnsetType) or isinstance(pool, UnsetType) ): self.connect = connect self.read = read self.write = write self.pool = pool else: if isinstance(timeout, UnsetType): raise ValueError("httpx2.Timeout must either include a default, or set all four parameters explicitly.") self.connect = timeout if isinstance(connect, UnsetType) else connect self.read = timeout if isinstance(read, UnsetType) else read self.write = timeout if isinstance(write, UnsetType) else write self.pool = timeout if isinstance(pool, UnsetType) else pool def as_dict(self) -> dict[str, float | None]: return { "connect": self.connect, "read": self.read, "write": self.write, "pool": self.pool, } def __eq__(self, other: typing.Any) -> bool: return ( isinstance(other, self.__class__) and self.connect == other.connect and self.read == other.read and self.write == other.write and self.pool == other.pool ) def __repr__(self) -> str: class_name = self.__class__.__name__ if len({self.connect, self.read, self.write, self.pool}) == 1: return f"{class_name}(timeout={self.connect})" return f"{class_name}(connect={self.connect}, read={self.read}, write={self.write}, pool={self.pool})" class Limits: """ Configuration for limits to various client behaviors. **Parameters:** * **max_connections** - The maximum number of concurrent connections that may be established. * **max_keepalive_connections** - Allow the connection pool to maintain keep-alive connections below this point. Should be less than or equal to `max_connections`. * **keepalive_expiry** - Time limit on idle keep-alive connections in seconds. """ def __init__( self, *, max_connections: int | None = None, max_keepalive_connections: int | None = None, keepalive_expiry: float | None = 5.0, ) -> None: self.max_connections = max_connections self.max_keepalive_connections = max_keepalive_connections self.keepalive_expiry = keepalive_expiry def __eq__(self, other: typing.Any) -> bool: return ( isinstance(other, self.__class__) and self.max_connections == other.max_connections and self.max_keepalive_connections == other.max_keepalive_connections and self.keepalive_expiry == other.keepalive_expiry ) def __repr__(self) -> str: class_name = self.__class__.__name__ return ( f"{class_name}(max_connections={self.max_connections}, " f"max_keepalive_connections={self.max_keepalive_connections}, " f"keepalive_expiry={self.keepalive_expiry})" ) class Proxy: def __init__( self, url: URL | str, *, ssl_context: ssl.SSLContext | None = None, auth: tuple[str, str] | None = None, headers: HeaderTypes | None = None, ) -> None: url = URL(url) headers = Headers(headers) if url.scheme not in ("http", "https", "socks5", "socks5h"): raise ValueError(f"Unknown scheme for proxy URL {url!r}") if url.username or url.password: # Remove any auth credentials from the URL. auth = (url.username, url.password) url = url.copy_with(username=None, password=None) self.url = url self.auth = auth self.headers = headers self.ssl_context = ssl_context @property def raw_auth(self) -> tuple[bytes, bytes] | None: # The proxy authentication as raw bytes. return None if self.auth is None else (self.auth[0].encode("utf-8"), self.auth[1].encode("utf-8")) def __repr__(self) -> str: # The authentication is represented with the password component masked. auth = (self.auth[0], "********") if self.auth else None # Build a nice concise representation. url_str = f"{str(self.url)!r}" auth_str = f", auth={auth!r}" if auth else "" headers_str = f", headers={dict(self.headers)!r}" if self.headers else "" return f"Proxy({url_str}{auth_str}{headers_str})" DEFAULT_TIMEOUT_CONFIG = Timeout(timeout=5.0) DEFAULT_LIMITS = Limits(max_connections=100, max_keepalive_connections=20) DEFAULT_MAX_REDIRECTS = 20 pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_content.py000066400000000000000000000177161521723372100227410ustar00rootroot00000000000000from __future__ import annotations import inspect import warnings from collections.abc import AsyncIterable, AsyncIterator, Iterable, Iterator, Mapping from json import dumps as json_dumps from typing import ( Any, ) from urllib.parse import urlencode from ._exceptions import StreamClosed, StreamConsumed from ._multipart import MultipartStream from ._types import ( AsyncByteStream, RequestContent, RequestData, RequestFiles, ResponseContent, SyncByteStream, ) from ._utils import peek_filelike_length, primitive_value_to_str __all__ = ["ByteStream"] class ByteStream(AsyncByteStream, SyncByteStream): def __init__(self, stream: bytes) -> None: self._stream = stream def __iter__(self) -> Iterator[bytes]: yield self._stream async def __aiter__(self) -> AsyncIterator[bytes]: yield self._stream class IteratorByteStream(SyncByteStream): CHUNK_SIZE = 65_536 def __init__(self, stream: Iterable[bytes]) -> None: self._stream = stream self._is_stream_consumed = False self._is_generator = inspect.isgenerator(stream) def __iter__(self) -> Iterator[bytes]: if self._is_stream_consumed and self._is_generator: raise StreamConsumed() self._is_stream_consumed = True if hasattr(self._stream, "read"): # File-like interfaces should use 'read' directly. chunk = self._stream.read(self.CHUNK_SIZE) while chunk: yield chunk chunk = self._stream.read(self.CHUNK_SIZE) else: # Otherwise iterate. yield from self._stream class AsyncIteratorByteStream(AsyncByteStream): CHUNK_SIZE = 65_536 def __init__(self, stream: AsyncIterable[bytes]) -> None: self._stream = stream self._is_stream_consumed = False self._is_generator = inspect.isasyncgen(stream) async def __aiter__(self) -> AsyncIterator[bytes]: if self._is_stream_consumed and self._is_generator: raise StreamConsumed() self._is_stream_consumed = True if hasattr(self._stream, "aread"): # File-like interfaces should use 'aread' directly. chunk = await self._stream.aread(self.CHUNK_SIZE) while chunk: yield chunk chunk = await self._stream.aread(self.CHUNK_SIZE) else: # Otherwise iterate. async for part in self._stream: yield part class UnattachedStream(AsyncByteStream, SyncByteStream): """ If a request or response is serialized using pickle, then it is no longer attached to a stream for I/O purposes. Any stream operations should result in `httpx2.StreamClosed`. """ def __iter__(self) -> Iterator[bytes]: raise StreamClosed() async def __aiter__(self) -> AsyncIterator[bytes]: raise StreamClosed() yield b"" # pragma: no cover def encode_content( content: str | bytes | Iterable[bytes] | AsyncIterable[bytes], ) -> tuple[dict[str, str], SyncByteStream | AsyncByteStream]: if isinstance(content, (bytes, str)): body = content.encode("utf-8") if isinstance(content, str) else content content_length = len(body) headers = {"Content-Length": str(content_length)} if body else {} return headers, ByteStream(body) elif isinstance(content, Iterable) and not isinstance(content, dict): # `not isinstance(content, dict)` is a bit oddly specific, but it # catches a case that's easy for users to make in error, and would # otherwise pass through here, like any other bytes-iterable, # because `dict` happens to be iterable. See issue #2491. content_length_or_none = peek_filelike_length(content) if content_length_or_none is None: headers = {"Transfer-Encoding": "chunked"} else: headers = {"Content-Length": str(content_length_or_none)} return headers, IteratorByteStream(content) # type: ignore elif isinstance(content, AsyncIterable): headers = {"Transfer-Encoding": "chunked"} return headers, AsyncIteratorByteStream(content) raise TypeError(f"Unexpected type for 'content', {type(content)!r}") def encode_urlencoded_data(data: RequestData) -> tuple[dict[str, str], ByteStream]: plain_data: list[tuple[str, str]] = [] for key, value in data.items(): if isinstance(value, (list, tuple)): plain_data.extend([(key, primitive_value_to_str(item)) for item in value]) else: plain_data.append((key, primitive_value_to_str(value))) body = urlencode(plain_data, doseq=True).encode("utf-8") content_length = str(len(body)) content_type = "application/x-www-form-urlencoded" headers = {"Content-Length": content_length, "Content-Type": content_type} return headers, ByteStream(body) def encode_multipart_data( data: RequestData, files: RequestFiles, boundary: bytes | None ) -> tuple[dict[str, str], MultipartStream]: multipart = MultipartStream(data=data, files=files, boundary=boundary) headers = multipart.get_headers() return headers, multipart def encode_text(text: str) -> tuple[dict[str, str], ByteStream]: body = text.encode("utf-8") content_length = str(len(body)) content_type = "text/plain; charset=utf-8" headers = {"Content-Length": content_length, "Content-Type": content_type} return headers, ByteStream(body) def encode_html(html: str) -> tuple[dict[str, str], ByteStream]: body = html.encode("utf-8") content_length = str(len(body)) content_type = "text/html; charset=utf-8" headers = {"Content-Length": content_length, "Content-Type": content_type} return headers, ByteStream(body) def encode_json(json: Any) -> tuple[dict[str, str], ByteStream]: body = json_dumps(json, ensure_ascii=False, separators=(",", ":"), allow_nan=False).encode("utf-8") content_length = str(len(body)) content_type = "application/json" headers = {"Content-Length": content_length, "Content-Type": content_type} return headers, ByteStream(body) def encode_request( content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: Any | None = None, boundary: bytes | None = None, ) -> tuple[dict[str, str], SyncByteStream | AsyncByteStream]: """ Handles encoding the given `content`, `data`, `files`, and `json`, returning a two-tuple of (, ). """ if data is not None and not isinstance(data, Mapping): # We prefer to separate `content=` # for raw request content, and `data=
` for url encoded or # multipart form content. # # However for compat with requests, we *do* still support # `data=` usages. We deal with that case here, treating it # as if `content=<...>` had been supplied instead. message = "Use 'content=<...>' to upload raw bytes/text content." warnings.warn(message, DeprecationWarning, stacklevel=2) return encode_content(data) if content is not None: return encode_content(content) elif files: return encode_multipart_data(data or {}, files, boundary) elif data: return encode_urlencoded_data(data) elif json is not None: return encode_json(json) return {}, ByteStream(b"") def encode_response( content: ResponseContent | None = None, text: str | None = None, html: str | None = None, json: Any | None = None, ) -> tuple[dict[str, str], SyncByteStream | AsyncByteStream]: """ Handles encoding the given `content`, returning a two-tuple of (, ). """ if content is not None: return encode_content(content) elif text is not None: return encode_text(text) elif html is not None: return encode_html(html) elif json is not None: return encode_json(json) return {}, ByteStream(b"") pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_decoders.py000066400000000000000000000321251521723372100230460ustar00rootroot00000000000000""" Handlers for Content-Encoding. See: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding """ from __future__ import annotations import codecs import functools import io import sys import typing import zlib from ._exceptions import DecodingError # Brotli support is optional try: # The C bindings in `brotli` are recommended for CPython. import brotli except ImportError: # pragma: no cover try: # The CFFI bindings in `brotlicffi` are recommended for PyPy # and other environments. import brotlicffi as brotli except ImportError: brotli = None # Zstandard support is optional on Python <= 3.13. # On Python 3.14+, the stdlib includes an optional built-in zstd implementation. if typing.TYPE_CHECKING: # We keep checking Python version in the type checker path because try..except doesn't help type checkers. if sys.version_info >= (3, 14): from compression.zstd import ZstdDecompressor, ZstdError else: from zstandard import ZstdDecompressor as _ZstdDecompressor, ZstdError ZstdDecompressor = functools.partial(_ZstdDecompressor().decompressobj) _zstandard_installed: bool = False else: # pragma: no cover _zstandard_installed = False try: from compression.zstd import ZstdDecompressor, ZstdError _zstandard_installed = True # Either Python <3.14 or the distro doesn't have `compression.zstd`. except ImportError: try: from zstandard import ZstdDecompressor as _ZstdDecompressor, ZstdError ZstdDecompressor = functools.partial(_ZstdDecompressor().decompressobj) _zstandard_installed = True except ImportError: pass class ContentDecoder: def decode(self, data: bytes) -> bytes: raise NotImplementedError() # pragma: no cover def flush(self) -> bytes: raise NotImplementedError() # pragma: no cover class IdentityDecoder(ContentDecoder): """ Handle unencoded data. """ def decode(self, data: bytes) -> bytes: return data def flush(self) -> bytes: return b"" class DeflateDecoder(ContentDecoder): """ Handle 'deflate' decoding. See: https://stackoverflow.com/questions/1838699 """ def __init__(self) -> None: self.first_attempt = True self.decompressor = zlib.decompressobj() def decode(self, data: bytes) -> bytes: was_first_attempt = self.first_attempt self.first_attempt = False try: return self.decompressor.decompress(data) except zlib.error as exc: if was_first_attempt: self.decompressor = zlib.decompressobj(-zlib.MAX_WBITS) return self.decode(data) raise DecodingError(str(exc)) from exc def flush(self) -> bytes: try: return self.decompressor.flush() except zlib.error as exc: # pragma: no cover raise DecodingError(str(exc)) from exc class GZipDecoder(ContentDecoder): """ Handle 'gzip' decoding. See: https://stackoverflow.com/questions/1838699 """ def __init__(self) -> None: self.decompressor = zlib.decompressobj(zlib.MAX_WBITS | 16) def decode(self, data: bytes) -> bytes: try: return self.decompressor.decompress(data) except zlib.error as exc: raise DecodingError(str(exc)) from exc def flush(self) -> bytes: try: return self.decompressor.flush() except zlib.error as exc: # pragma: no cover raise DecodingError(str(exc)) from exc class BrotliDecoder(ContentDecoder): """ Handle 'brotli' decoding. Requires `pip install brotlipy`. See: https://brotlipy.readthedocs.io/ or `pip install brotli`. See https://github.com/google/brotli Supports both 'brotlipy' and 'Brotli' packages since they share an import name. The top branches are for 'brotlipy' and bottom branches for 'Brotli' """ def __init__(self) -> None: if brotli is None: # pragma: no cover raise ImportError( "Using 'BrotliDecoder', but neither of the 'brotlicffi' or 'brotli' " "packages have been installed. " "Make sure to install httpx using `pip install httpx[brotli]`." ) from None self.decompressor = brotli.Decompressor() self.seen_data = False self._decompress: typing.Callable[[bytes], bytes] if hasattr(self.decompressor, "decompress"): # The 'brotlicffi' package. self._decompress = self.decompressor.decompress # pragma: no cover else: # The 'brotli' package. self._decompress = self.decompressor.process # pragma: no cover def decode(self, data: bytes) -> bytes: if not data: return b"" self.seen_data = True try: return self._decompress(data) except brotli.error as exc: raise DecodingError(str(exc)) from exc def flush(self) -> bytes: if not self.seen_data: return b"" try: if hasattr(self.decompressor, "finish"): # Only available in the 'brotlicffi' package. # As the decompressor decompresses eagerly, this # will never actually emit any data. However, it will potentially throw # errors if a truncated or damaged data stream has been used. self.decompressor.finish() # pragma: no cover return b"" except brotli.error as exc: # pragma: no cover raise DecodingError(str(exc)) from exc class ZStandardDecoder(ContentDecoder): """Handle 'zstd' RFC 8878 decoding. If running on Python 3.14+ or a distro that doesn't have the `compression.zstd` stdlib module, requires either: `pip install zstandard` or `pip install httpx2[zstd]`. """ # inspired by the ZstdDecoder implementation in urllib3 def __init__(self) -> None: if not _zstandard_installed: # pragma: no cover raise ImportError( "Using 'ZStandardDecoder', ...Make sure to install httpx using `pip install httpx[zstd]`." ) from None self.decompressor = ZstdDecompressor() self.seen_data = False def decode(self, data: bytes) -> bytes: if not data: return b"" self.seen_data = True output = io.BytesIO() try: if self.decompressor.eof: data = self.decompressor.unused_data + data self.decompressor = ZstdDecompressor() output.write(self.decompressor.decompress(data)) while self.decompressor.eof and self.decompressor.unused_data: unused_data = self.decompressor.unused_data self.decompressor = ZstdDecompressor() output.write(self.decompressor.decompress(unused_data)) except ZstdError as exc: raise DecodingError(str(exc)) from exc return output.getvalue() def flush(self) -> bytes: if not self.seen_data: return b"" if not self.decompressor.eof: raise DecodingError("Zstandard data is incomplete") # pragma: no cover return b"" class MultiDecoder(ContentDecoder): """ Handle the case where multiple encodings have been applied. """ max_decode_links: typing.ClassVar[int] = 5 def __init__(self, encodings: typing.Sequence[str]) -> None: """ 'encodings' should be the content codings in the order in which each was applied. """ codings = [encoding for encoding in encodings if encoding in SUPPORTED_DECODERS] if len(codings) > self.max_decode_links: raise DecodingError(f"Cannot apply more than {self.max_decode_links} content encodings.") # Note that we reverse the order for decoding. self.children: list[ContentDecoder] = [SUPPORTED_DECODERS[coding]() for coding in reversed(codings)] def decode(self, data: bytes) -> bytes: for child in self.children: data = child.decode(data) return data def flush(self) -> bytes: data = b"" for child in self.children: data = child.decode(data) + child.flush() return data class ByteChunker: """ Handles returning byte content in fixed-size chunks. """ def __init__(self, chunk_size: int | None = None) -> None: self._buffer = io.BytesIO() self._chunk_size = chunk_size def decode(self, content: bytes) -> list[bytes]: if self._chunk_size is None: return [content] if content else [] self._buffer.write(content) if self._buffer.tell() >= self._chunk_size: value = self._buffer.getvalue() chunks = [value[i : i + self._chunk_size] for i in range(0, len(value), self._chunk_size)] if len(chunks[-1]) == self._chunk_size: self._buffer.seek(0) self._buffer.truncate() return chunks else: self._buffer.seek(0) self._buffer.write(chunks[-1]) self._buffer.truncate() return chunks[:-1] else: return [] def flush(self) -> list[bytes]: value = self._buffer.getvalue() self._buffer.seek(0) self._buffer.truncate() return [value] if value else [] class TextChunker: """ Handles returning text content in fixed-size chunks. """ def __init__(self, chunk_size: int | None = None) -> None: self._buffer = io.StringIO() self._chunk_size = chunk_size def decode(self, content: str) -> list[str]: if self._chunk_size is None: return [content] if content else [] self._buffer.write(content) if self._buffer.tell() >= self._chunk_size: value = self._buffer.getvalue() chunks = [value[i : i + self._chunk_size] for i in range(0, len(value), self._chunk_size)] if len(chunks[-1]) == self._chunk_size: self._buffer.seek(0) self._buffer.truncate() return chunks else: self._buffer.seek(0) self._buffer.write(chunks[-1]) self._buffer.truncate() return chunks[:-1] else: return [] def flush(self) -> list[str]: value = self._buffer.getvalue() self._buffer.seek(0) self._buffer.truncate() return [value] if value else [] class TextDecoder: """ Handles incrementally decoding bytes into text """ def __init__(self, encoding: str = "utf-8") -> None: self.decoder = codecs.getincrementaldecoder(encoding)(errors="replace") def decode(self, data: bytes) -> str: return self.decoder.decode(data) def flush(self) -> str: return self.decoder.decode(b"", True) class LineDecoder: """ Handles incrementally reading lines from text. Has the same behaviour as the stdllib splitlines, but handling the input iteratively. """ def __init__(self) -> None: self.buffer: list[str] = [] self.trailing_cr: bool = False def decode(self, text: str) -> list[str]: # See https://docs.python.org/3/library/stdtypes.html#str.splitlines NEWLINE_CHARS = "\n\r\x0b\x0c\x1c\x1d\x1e\x85\u2028\u2029" # We always push a trailing `\r` into the next decode iteration. if self.trailing_cr: text = "\r" + text self.trailing_cr = False if text.endswith("\r"): self.trailing_cr = True text = text[:-1] if not text: # NOTE: the edge case input of empty text doesn't occur in practice, # because other httpx internals filter out this value return [] # pragma: no cover trailing_newline = text[-1] in NEWLINE_CHARS lines = text.splitlines() if len(lines) == 1 and not trailing_newline: # No new lines, buffer the input and continue. self.buffer.append(lines[0]) return [] if self.buffer: # Include any existing buffer in the first portion of the # splitlines result. lines = ["".join(self.buffer) + lines[0]] + lines[1:] self.buffer = [] if not trailing_newline: # If the last segment of splitlines is not newline terminated, # then drop it from our output and start a new buffer. self.buffer = [lines.pop()] return lines def flush(self) -> list[str]: if not self.buffer and not self.trailing_cr: return [] lines = ["".join(self.buffer)] self.buffer = [] self.trailing_cr = False return lines SUPPORTED_DECODERS: dict[str, type[ContentDecoder]] = { "identity": IdentityDecoder, "gzip": GZipDecoder, "deflate": DeflateDecoder, "br": BrotliDecoder, "zstd": ZStandardDecoder, } if brotli is None: SUPPORTED_DECODERS.pop("br") # pragma: no cover if not _zstandard_installed: SUPPORTED_DECODERS.pop("zstd") # pragma: no cover pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_exceptions.py000066400000000000000000000212311521723372100234330ustar00rootroot00000000000000""" Our exception hierarchy: * HTTPError x RequestError + TransportError - TimeoutException Β· ConnectTimeout Β· ReadTimeout Β· WriteTimeout Β· PoolTimeout - NetworkError Β· ConnectError Β· ReadError Β· WriteError Β· CloseError - ProtocolError Β· LocalProtocolError Β· RemoteProtocolError - ProxyError - UnsupportedProtocol + DecodingError + TooManyRedirects x HTTPStatusError * InvalidURL * CookieConflict * StreamError x StreamConsumed x StreamClosed x ResponseNotRead x RequestNotRead """ from __future__ import annotations import contextlib import typing from collections.abc import Generator if typing.TYPE_CHECKING: from ._models import Request, Response # pragma: no cover __all__ = [ "CloseError", "ConnectError", "ConnectTimeout", "CookieConflict", "DecodingError", "HTTPError", "HTTPStatusError", "InvalidURL", "LocalProtocolError", "NetworkError", "PoolTimeout", "ProtocolError", "ProxyError", "ReadError", "ReadTimeout", "RemoteProtocolError", "RequestError", "RequestNotRead", "ResponseNotRead", "StreamClosed", "StreamConsumed", "StreamError", "TimeoutException", "TooManyRedirects", "TransportError", "UnsupportedProtocol", "WriteError", "WriteTimeout", ] class HTTPXDeprecationWarning(UserWarning): """A custom deprecation warning for HTTPX. Unlike the built-in `DeprecationWarning`, this inherits from `UserWarning` to ensure it is visible by default, helping users discover deprecated features without needing to enable warnings explicitly. Reference: https://sethmlarson.dev/deprecations-via-warnings-dont-work-for-python-libraries """ class HTTPError(Exception): """ Base class for `RequestError` and `HTTPStatusError`. Useful for `try...except` blocks when issuing a request, and then calling `.raise_for_status()`. For example: ``` try: response = httpx2.get("https://www.example.com") response.raise_for_status() except httpx2.HTTPError as exc: print(f"HTTP Exception for {exc.request.url} - {exc}") ``` """ def __init__(self, message: str) -> None: super().__init__(message) self._request: Request | None = None @property def request(self) -> Request: if self._request is None: raise RuntimeError("The .request property has not been set.") return self._request @request.setter def request(self, request: Request) -> None: self._request = request class RequestError(HTTPError): """ Base class for all exceptions that may occur when issuing a `.request()`. """ def __init__(self, message: str, *, request: Request | None = None) -> None: super().__init__(message) # At the point an exception is raised we won't typically have a request # instance to associate it with. # # The 'request_context' context manager is used within the Client and # Response methods in order to ensure that any raised exceptions # have a `.request` property set on them. self._request = request class TransportError(RequestError): """ Base class for all exceptions that occur at the level of the Transport API. """ # Timeout exceptions... class TimeoutException(TransportError): """ The base class for timeout errors. An operation has timed out. """ class ConnectTimeout(TimeoutException): """ Timed out while connecting to the host. """ class ReadTimeout(TimeoutException): """ Timed out while receiving data from the host. """ class WriteTimeout(TimeoutException): """ Timed out while sending data to the host. """ class PoolTimeout(TimeoutException): """ Timed out waiting to acquire a connection from the pool. """ # Core networking exceptions... class NetworkError(TransportError): """ The base class for network-related errors. An error occurred while interacting with the network. """ class ReadError(NetworkError): """ Failed to receive data from the network. """ class WriteError(NetworkError): """ Failed to send data through the network. """ class ConnectError(NetworkError): """ Failed to establish a connection. """ class CloseError(NetworkError): """ Failed to close a connection. """ # Other transport exceptions... class ProxyError(TransportError): """ An error occurred while establishing a proxy connection. """ class UnsupportedProtocol(TransportError): """ Attempted to make a request to an unsupported protocol. For example issuing a request to `ftp://www.example.com`. """ class ProtocolError(TransportError): """ The protocol was violated. """ class LocalProtocolError(ProtocolError): """ A protocol was violated by the client. For example if the user instantiated a `Request` instance explicitly, failed to include the mandatory `Host:` header, and then issued it directly using `client.send()`. """ class RemoteProtocolError(ProtocolError): """ The protocol was violated by the server. For example, returning malformed HTTP. """ # Other request exceptions... class DecodingError(RequestError): """ Decoding of the response failed, due to a malformed encoding. """ class TooManyRedirects(RequestError): """ Too many redirects. """ # Client errors class HTTPStatusError(HTTPError): """ The response had an error HTTP status of 4xx or 5xx. May be raised when calling `response.raise_for_status()` """ def __init__(self, message: str, *, request: Request, response: Response) -> None: super().__init__(message) self.request = request self.response = response class InvalidURL(Exception): """ URL is improperly formed or cannot be parsed. """ def __init__(self, message: str) -> None: super().__init__(message) class CookieConflict(Exception): """ Attempted to lookup a cookie by name, but multiple cookies existed. Can occur when calling `response.cookies.get(...)`. """ def __init__(self, message: str) -> None: super().__init__(message) # Stream exceptions... # These may occur as the result of a programming error, by accessing # the request/response stream in an invalid manner. class StreamError(RuntimeError): """ The base class for stream exceptions. The developer made an error in accessing the request stream in an invalid way. """ def __init__(self, message: str) -> None: super().__init__(message) class StreamConsumed(StreamError): """ Attempted to read or stream content, but the content has already been streamed. """ def __init__(self) -> None: message = ( "Attempted to read or stream some content, but the content has " "already been streamed. For requests, this could be due to passing " "a generator as request content, and then receiving a redirect " "response or a secondary request as part of an authentication flow." "For responses, this could be due to attempting to stream the response " "content more than once." ) super().__init__(message) class StreamClosed(StreamError): """ Attempted to read or stream response content, but the request has been closed. """ def __init__(self) -> None: message = "Attempted to read or stream content, but the stream has been closed." super().__init__(message) class ResponseNotRead(StreamError): """ Attempted to access streaming response content, without having called `read()`. """ def __init__(self) -> None: message = "Attempted to access streaming response content, without having called `read()`." super().__init__(message) class RequestNotRead(StreamError): """ Attempted to access streaming request content, without having called `read()`. """ def __init__(self) -> None: message = "Attempted to access streaming request content, without having called `read()`." super().__init__(message) @contextlib.contextmanager def request_context(request: Request | None = None) -> Generator[None]: """ A context manager that can be used to attach the given request context to any `RequestError` exceptions that are raised within the block. """ try: yield except RequestError as exc: if request is not None: exc.request = request raise exc pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_main.py000066400000000000000000000361121521723372100222020ustar00rootroot00000000000000from __future__ import annotations import functools import json import sys import typing import click import pygments.lexers import pygments.util import rich.console import rich.markup import rich.progress import rich.syntax import rich.table from ._client import Client from ._exceptions import RequestError from ._models import Response from ._status_codes import codes if typing.TYPE_CHECKING: import httpcore2 # pragma: no cover def print_help() -> None: console = rich.console.Console() console.print("[bold]HTTPX :butterfly:", justify="center") console.print() console.print("A next generation HTTP client.", justify="center") console.print() console.print("Usage: [bold]httpx2[/bold] [cyan] [OPTIONS][/cyan] ", justify="left") console.print() table = rich.table.Table.grid(padding=1, pad_edge=True) table.add_column("Parameter", no_wrap=True, justify="left", style="bold") table.add_column("Description") table.add_row( "-m, --method [cyan]METHOD", "Request method, such as GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD.\n" "[Default: GET, or POST if a request body is included]", ) table.add_row( "-p, --params [cyan] ...", "Query parameters to include in the request URL.", ) table.add_row("-c, --content [cyan]TEXT", "Byte content to include in the request body.") table.add_row("-d, --data [cyan] ...", "Form data to include in the request body.") table.add_row( "-f, --files [cyan] ...", "Form files to include in the request body.", ) table.add_row("-j, --json [cyan]TEXT", "JSON data to include in the request body.") table.add_row( "-h, --headers [cyan] ...", "Include additional HTTP headers in the request.", ) table.add_row("--cookies [cyan] ...", "Cookies to include in the request.") table.add_row( "--auth [cyan]", "Username and password to include in the request. Specify '-' for the password" " to use a password prompt. Note that using --verbose/-v will expose" " the Authorization header, including the password encoding" " in a trivially reversible format.", ) table.add_row( "--proxy [cyan]URL", "Send the request via a proxy. Should be the URL giving the proxy address.", ) table.add_row( "--timeout [cyan]FLOAT", "Timeout value to use for network operations, such as establishing the" " connection, reading some data, etc... [Default: 5.0]", ) table.add_row("--follow-redirects", "Automatically follow redirects.") table.add_row("--no-verify", "Disable SSL verification.") table.add_row("--http2", "Send the request using HTTP/2, if the remote server supports it.") table.add_row( "--download [cyan]FILE", "Save the response content as a file, rather than displaying it.", ) table.add_row("-v, --verbose", "Verbose output. Show request as well as response.") table.add_row("--help", "Show this message and exit.") console.print(table) def get_lexer_for_response(response: Response) -> str: content_type = response.headers.get("Content-Type") if content_type is not None: mime_type, _, _ = content_type.partition(";") try: return typing.cast(str, pygments.lexers.get_lexer_for_mimetype(mime_type.strip()).name) except pygments.util.ClassNotFound: # pragma: no cover pass return "" # pragma: no cover def format_request_headers(request: httpcore2.Request, http2: bool = False) -> str: version = "HTTP/2" if http2 else "HTTP/1.1" headers = [(name.lower() if http2 else name, value) for name, value in request.headers] method = request.method.decode("ascii") target = request.url.target.decode("ascii") lines = [f"{method} {target} {version}"] + [ f"{name.decode('ascii')}: {value.decode('ascii')}" for name, value in headers ] return "\n".join(lines) def format_response_headers( http_version: bytes, status: int, reason_phrase: bytes | None, headers: list[tuple[bytes, bytes]], ) -> str: version = http_version.decode("ascii") reason = codes.get_reason_phrase(status) if reason_phrase is None else reason_phrase.decode("ascii") lines = [f"{version} {status} {reason}"] + [ f"{name.decode('ascii')}: {value.decode('ascii')}" for name, value in headers ] return "\n".join(lines) def print_request_headers(request: httpcore2.Request, http2: bool = False) -> None: console = rich.console.Console() http_text = format_request_headers(request, http2=http2) syntax = rich.syntax.Syntax(http_text, "http", theme="ansi_dark", word_wrap=True) console.print(syntax) syntax = rich.syntax.Syntax("", "http", theme="ansi_dark", word_wrap=True) console.print(syntax) def print_response_headers( http_version: bytes, status: int, reason_phrase: bytes | None, headers: list[tuple[bytes, bytes]], ) -> None: console = rich.console.Console() http_text = format_response_headers(http_version, status, reason_phrase, headers) syntax = rich.syntax.Syntax(http_text, "http", theme="ansi_dark", word_wrap=True) console.print(syntax) syntax = rich.syntax.Syntax("", "http", theme="ansi_dark", word_wrap=True) console.print(syntax) def print_response(response: Response) -> None: console = rich.console.Console() lexer_name = get_lexer_for_response(response) if lexer_name: if lexer_name.lower() == "json": try: data = response.json() text = json.dumps(data, indent=4) except ValueError: # pragma: no cover text = response.text else: text = response.text syntax = rich.syntax.Syntax(text, lexer_name, theme="ansi_dark", word_wrap=True) console.print(syntax) else: console.print(f"<{len(response.content)} bytes of binary data>") _PCTRTT = tuple[tuple[str, str], ...] _PCTRTTT = tuple[_PCTRTT, ...] _PeerCertRetDictType = dict[str, str | _PCTRTTT | _PCTRTT] def format_certificate(cert: _PeerCertRetDictType) -> str: # pragma: no cover lines: list[str] = [] for key, value in cert.items(): if isinstance(value, (list, tuple)): lines.append(f"* {key}:") for item in value: if key in ("subject", "issuer"): lines.extend(f"* {sub_item[0]}: {sub_item[1]!r}" for sub_item in item) elif isinstance(item, tuple) and len(item) == 2: lines.append(f"* {item[0]}: {item[1]!r}") else: lines.append(f"* {item!r}") else: lines.append(f"* {key}: {value!r}") return "\n".join(lines) def trace(name: str, info: typing.Mapping[str, typing.Any], verbose: bool = False) -> None: console = rich.console.Console() if name == "connection.connect_tcp.started" and verbose: host = info["host"] console.print(f"* Connecting to {host!r}") elif name == "connection.connect_tcp.complete" and verbose: stream = info["return_value"] server_addr = stream.get_extra_info("server_addr") console.print(f"* Connected to {server_addr[0]!r} on port {server_addr[1]}") elif name == "connection.start_tls.complete" and verbose: # pragma: no cover stream = info["return_value"] ssl_object = stream.get_extra_info("ssl_object") version = ssl_object.version() cipher = ssl_object.cipher() server_cert = ssl_object.getpeercert() alpn = ssl_object.selected_alpn_protocol() console.print(f"* SSL established using {version!r} / {cipher[0]!r}") console.print(f"* Selected ALPN protocol: {alpn!r}") if server_cert: console.print("* Server certificate:") console.print(format_certificate(server_cert)) elif name == "http11.send_request_headers.started" and verbose: request = info["request"] print_request_headers(request, http2=False) elif name == "http2.send_request_headers.started" and verbose: # pragma: no cover request = info["request"] print_request_headers(request, http2=True) elif name == "http11.receive_response_headers.complete": http_version, status, reason_phrase, headers = info["return_value"] print_response_headers(http_version, status, reason_phrase, headers) elif name == "http2.receive_response_headers.complete": # pragma: no cover status, headers = info["return_value"] http_version = b"HTTP/2" reason_phrase = None print_response_headers(http_version, status, reason_phrase, headers) def download_response(response: Response, download: typing.BinaryIO) -> None: console = rich.console.Console() console.print() content_length = response.headers.get("Content-Length") with rich.progress.Progress( "[progress.description]{task.description}", "[progress.percentage]{task.percentage:>3.0f}%", rich.progress.BarColumn(bar_width=None), rich.progress.DownloadColumn(), rich.progress.TransferSpeedColumn(), ) as progress: description = f"Downloading [bold]{rich.markup.escape(download.name)}" download_task = progress.add_task( description, total=int(content_length or 0), start=content_length is not None, ) for chunk in response.iter_bytes(): download.write(chunk) progress.update(download_task, completed=response.num_bytes_downloaded) def validate_json( ctx: click.Context, param: click.Option | click.Parameter, value: typing.Any, ) -> typing.Any: if value is None: return None try: return json.loads(value) except json.JSONDecodeError: # pragma: no cover raise click.BadParameter("Not valid JSON") def validate_auth( ctx: click.Context, param: click.Option | click.Parameter, value: typing.Any, ) -> typing.Any: if value == (None, None): return None username, password = value if password == "-": # pragma: no cover password = click.prompt("Password", hide_input=True) return (username, password) def handle_help( ctx: click.Context, param: click.Option | click.Parameter, value: typing.Any, ) -> None: if not value or ctx.resilient_parsing: return print_help() ctx.exit() @click.command(add_help_option=False) @click.argument("url", type=str) @click.option( "--method", "-m", "method", type=str, help=( "Request method, such as GET, POST, PUT, PATCH, DELETE, OPTIONS, HEAD. " "[Default: GET, or POST if a request body is included]" ), ) @click.option( "--params", "-p", "params", type=(str, str), multiple=True, help="Query parameters to include in the request URL.", ) @click.option( "--content", "-c", "content", type=str, help="Byte content to include in the request body.", ) @click.option( "--data", "-d", "data", type=(str, str), multiple=True, help="Form data to include in the request body.", ) @click.option( "--files", "-f", "files", type=(str, click.File(mode="rb")), multiple=True, help="Form files to include in the request body.", ) @click.option( "--json", "-j", "json", type=str, callback=validate_json, help="JSON data to include in the request body.", ) @click.option( "--headers", "-h", "headers", type=(str, str), multiple=True, help="Include additional HTTP headers in the request.", ) @click.option( "--cookies", "cookies", type=(str, str), multiple=True, help="Cookies to include in the request.", ) @click.option( "--auth", "auth", type=(str, str), default=(None, None), callback=validate_auth, help=( "Username and password to include in the request. " "Specify '-' for the password to use a password prompt. " "Note that using --verbose/-v will expose the Authorization header, " "including the password encoding in a trivially reversible format." ), ) @click.option( "--proxy", "proxy", type=str, default=None, help="Send the request via a proxy. Should be the URL giving the proxy address.", ) @click.option( "--timeout", "timeout", type=float, default=5.0, help=( "Timeout value to use for network operations, such as establishing the " "connection, reading some data, etc... [Default: 5.0]" ), ) @click.option( "--follow-redirects", "follow_redirects", is_flag=True, default=False, help="Automatically follow redirects.", ) @click.option( "--no-verify", "verify", is_flag=True, default=True, help="Disable SSL verification.", ) @click.option( "--http2", "http2", type=bool, is_flag=True, default=False, help="Send the request using HTTP/2, if the remote server supports it.", ) @click.option( "--download", type=click.File("wb"), help="Save the response content as a file, rather than displaying it.", ) @click.option( "--verbose", "-v", type=bool, is_flag=True, default=False, help="Verbose. Show request as well as response.", ) @click.option( "--help", is_flag=True, is_eager=True, expose_value=False, callback=handle_help, help="Show this message and exit.", ) def main( url: str, method: str, params: list[tuple[str, str]], content: str, data: list[tuple[str, str]], files: list[tuple[str, click.File]], json: str, headers: list[tuple[str, str]], cookies: list[tuple[str, str]], auth: tuple[str, str] | None, proxy: str, timeout: float, follow_redirects: bool, verify: bool, http2: bool, download: typing.BinaryIO | None, verbose: bool, ) -> None: """ An HTTP command line client. Sends a request and displays the response. """ if not method: method = "POST" if content or data or files or json else "GET" try: with Client(proxy=proxy, timeout=timeout, http2=http2, verify=verify) as client: with client.stream( method, url, params=list(params), content=content, data=dict(data), files=files, # type: ignore[arg-type] json=json, headers=headers, cookies=dict(cookies), auth=auth, follow_redirects=follow_redirects, extensions={"trace": functools.partial(trace, verbose=verbose)}, ) as response: if download is not None: download_response(response, download) else: response.read() if response.content: print_response(response) except RequestError as exc: console = rich.console.Console() console.print(f"[red]{type(exc).__name__}[/red]: {exc}") sys.exit(1) sys.exit(0 if response.is_success else 1) pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_models.py000066400000000000000000001273031521723372100225440ustar00rootroot00000000000000from __future__ import annotations import codecs import datetime import email.message import json as jsonlib import re import typing import urllib.request from collections.abc import Mapping from http.cookiejar import Cookie, CookieJar from ._content import ByteStream, UnattachedStream, encode_request, encode_response from ._decoders import ( ByteChunker, ContentDecoder, IdentityDecoder, LineDecoder, MultiDecoder, TextChunker, TextDecoder, ) from ._exceptions import ( CookieConflict, HTTPStatusError, RequestNotRead, ResponseNotRead, StreamClosed, StreamConsumed, request_context, ) from ._multipart import get_multipart_boundary_from_content_type from ._status_codes import codes from ._types import ( AsyncByteStream, CookieTypes, HeaderTypes, QueryParamTypes, RequestContent, RequestData, RequestExtensions, RequestFiles, ResponseContent, ResponseExtensions, SyncByteStream, ) from ._urls import URL from ._utils import to_bytes_or_str, to_str __all__ = ["Cookies", "Headers", "Request", "Response"] SENSITIVE_HEADERS = {"authorization", "proxy-authorization"} def _is_known_encoding(encoding: str) -> bool: """ Return `True` if `encoding` is a known codec. """ try: codecs.lookup(encoding) except LookupError: return False return True def _normalize_header_key(key: str | bytes, encoding: str | None = None) -> bytes: """ Coerce str/bytes into a strictly byte-wise HTTP header key. """ return key if isinstance(key, bytes) else key.encode(encoding or "ascii") def _normalize_header_value(value: str | bytes, encoding: str | None = None) -> bytes: """ Coerce str/bytes into a strictly byte-wise HTTP header value. """ if isinstance(value, bytes): return value if not isinstance(value, str): raise TypeError(f"Header value must be str or bytes, not {type(value)}") return value.encode(encoding or "ascii") def _parse_content_type_charset(content_type: str) -> str | None: # We used to use `cgi.parse_header()` here, but `cgi` became a dead battery. # See: https://peps.python.org/pep-0594/#cgi msg = email.message.Message() msg["content-type"] = content_type return msg.get_content_charset(failobj=None) def _parse_header_links(value: str) -> list[dict[str, str]]: """ Returns a list of parsed link headers, for more info see: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Link The generic syntax of those is: Link: < uri-reference >; param1=value1; param2="value2" So for instance: Link; '; type="image/jpeg",;' would return [ {"url": "http:/.../front.jpeg", "type": "image/jpeg"}, {"url": "http://.../back.jpeg"}, ] :param value: HTTP Link entity-header field :return: list of parsed link headers """ links: list[dict[str, str]] = [] replace_chars = " '\"" value = value.strip(replace_chars) if not value: return links for val in re.split(", *<", value): try: url, params = val.split(";", 1) except ValueError: url, params = val, "" link = {"url": url.strip("<> '\"")} for param in params.split(";"): try: key, value = param.split("=") except ValueError: break link[key.strip(replace_chars)] = value.strip(replace_chars) links.append(link) return links def _obfuscate_sensitive_headers( items: typing.Iterable[tuple[typing.AnyStr, typing.AnyStr]], ) -> typing.Iterator[tuple[typing.AnyStr, typing.AnyStr]]: for k, v in items: if to_str(k.lower()) in SENSITIVE_HEADERS: v = to_bytes_or_str("[secure]", match_type_of=v) yield k, v class Headers(typing.MutableMapping[str, str]): """ HTTP headers, as a case-insensitive multi-dict. """ def __init__( self, headers: HeaderTypes | None = None, encoding: str | None = None, ) -> None: self._list: list[tuple[bytes, bytes, bytes]] = [] if isinstance(headers, Headers): self._list = list(headers._list) elif isinstance(headers, Mapping): for k, v in headers.items(): bytes_key = _normalize_header_key(k, encoding) bytes_value = _normalize_header_value(v, encoding) self._list.append((bytes_key, bytes_key.lower(), bytes_value)) elif headers is not None: for k, v in headers: bytes_key = _normalize_header_key(k, encoding) bytes_value = _normalize_header_value(v, encoding) self._list.append((bytes_key, bytes_key.lower(), bytes_value)) self._encoding = encoding @property def encoding(self) -> str: """ Header encoding is mandated as ascii, but we allow fallbacks to utf-8 or iso-8859-1. """ if self._encoding is None: for encoding in ["ascii", "utf-8"]: for key, value in self.raw: try: key.decode(encoding) value.decode(encoding) except UnicodeDecodeError: break else: # The else block runs if 'break' did not occur, meaning # all values fitted the encoding. self._encoding = encoding break else: # The ISO-8859-1 encoding covers all 256 code points in a byte, # so will never raise decode errors. self._encoding = "iso-8859-1" return self._encoding @encoding.setter def encoding(self, value: str) -> None: self._encoding = value @property def raw(self) -> list[tuple[bytes, bytes]]: """ Returns a list of the raw header items, as byte pairs. """ return [(raw_key, value) for raw_key, _, value in self._list] def keys(self) -> typing.KeysView[str]: return {key.decode(self.encoding): None for _, key, _value in self._list}.keys() def values(self) -> typing.ValuesView[str]: values_dict: dict[str, str] = {} for _, key, value in self._list: str_key = key.decode(self.encoding) str_value = value.decode(self.encoding) if str_key in values_dict: values_dict[str_key] += f", {str_value}" else: values_dict[str_key] = str_value return values_dict.values() def items(self) -> typing.ItemsView[str, str]: """ Return `(key, value)` items of headers. Concatenate headers into a single comma separated value when a key occurs multiple times. """ values_dict: dict[str, str] = {} for _, key, value in self._list: str_key = key.decode(self.encoding) str_value = value.decode(self.encoding) if str_key in values_dict: values_dict[str_key] += f", {str_value}" else: values_dict[str_key] = str_value return values_dict.items() def multi_items(self) -> list[tuple[str, str]]: """ Return a list of `(key, value)` pairs of headers. Allow multiple occurrences of the same key without concatenating into a single comma separated value. """ return [(key.decode(self.encoding), value.decode(self.encoding)) for _, key, value in self._list] def get(self, key: str, default: typing.Any = None) -> typing.Any: """ Return a header value. If multiple occurrences of the header occur then concatenate them together with commas. """ try: return self[key] except KeyError: return default def get_list(self, key: str, split_commas: bool = False) -> list[str]: """ Return a list of all header values for a given key. If `split_commas=True` is passed, then any comma separated header values are split into multiple return strings. """ get_header_key = key.lower().encode(self.encoding) values = [ item_value.decode(self.encoding) for _, item_key, item_value in self._list if item_key.lower() == get_header_key ] if not split_commas: return values split_values: list[str] = [] for value in values: split_values.extend([item.strip() for item in value.split(",")]) return split_values def update(self, headers: HeaderTypes | None = None) -> None: # type: ignore headers = Headers(headers) for key in headers.keys(): if key in self: self.pop(key) self._list.extend(headers._list) def copy(self) -> Headers: return Headers(self, encoding=self.encoding) def __or__(self, other: Mapping[str, str]) -> Headers: if not isinstance(other, Mapping): return NotImplemented merged = self.copy() merged.update(other) return merged def __ror__(self, other: Mapping[str, str]) -> Headers: if not isinstance(other, Mapping): return NotImplemented merged = Headers(other) merged.update(self) return merged def __ior__(self, other: HeaderTypes) -> Headers: self.update(other) return self def __getitem__(self, key: str) -> str: """ Return a single header value. If there are multiple headers with the same key, then we concatenate them with commas. See: https://tools.ietf.org/html/rfc7230#section-3.2.2 """ normalized_key = key.lower().encode(self.encoding) items = [ header_value.decode(self.encoding) for _, header_key, header_value in self._list if header_key == normalized_key ] if items: return ", ".join(items) raise KeyError(key) def __setitem__(self, key: str, value: str) -> None: """ Set the header `key` to `value`, removing any duplicate entries. Retains insertion order. """ set_key = key.encode(self._encoding or "utf-8") set_value = value.encode(self._encoding or "utf-8") lookup_key = set_key.lower() found_indexes = [idx for idx, (_, item_key, _) in enumerate(self._list) if item_key == lookup_key] for idx in reversed(found_indexes[1:]): del self._list[idx] if found_indexes: idx = found_indexes[0] self._list[idx] = (set_key, lookup_key, set_value) else: self._list.append((set_key, lookup_key, set_value)) def __delitem__(self, key: str) -> None: """ Remove the header `key`. """ del_key = key.lower().encode(self.encoding) pop_indexes = [idx for idx, (_, item_key, _) in enumerate(self._list) if item_key.lower() == del_key] if not pop_indexes: raise KeyError(key) for idx in reversed(pop_indexes): del self._list[idx] def __contains__(self, key: typing.Any) -> bool: header_key = key.lower().encode(self.encoding) return header_key in [key for _, key, _ in self._list] def __iter__(self) -> typing.Iterator[typing.Any]: return iter(self.keys()) def __len__(self) -> int: return len(self._list) def __eq__(self, other: typing.Any) -> bool: try: other_headers = Headers(other) except ValueError: return False self_list = [(key, value) for _, key, value in self._list] other_list = [(key, value) for _, key, value in other_headers._list] return sorted(self_list) == sorted(other_list) def __repr__(self) -> str: class_name = self.__class__.__name__ encoding_str = "" if self.encoding != "ascii": encoding_str = f", encoding={self.encoding!r}" as_list = list(_obfuscate_sensitive_headers(self.multi_items())) as_dict = dict(as_list) no_duplicate_keys = len(as_dict) == len(as_list) if no_duplicate_keys: return f"{class_name}({as_dict!r}{encoding_str})" return f"{class_name}({as_list!r}{encoding_str})" class Request: def __init__( self, method: str, url: URL | str, *, params: QueryParamTypes | None = None, headers: HeaderTypes | None = None, cookies: CookieTypes | None = None, content: RequestContent | None = None, data: RequestData | None = None, files: RequestFiles | None = None, json: typing.Any | None = None, stream: SyncByteStream | AsyncByteStream | None = None, extensions: RequestExtensions | None = None, ) -> None: self.method = method.upper() self.url = URL(url) if params is None else URL(url, params=params) self.headers = Headers(headers) self.extensions = {} if extensions is None else dict(extensions) if cookies: Cookies(cookies).set_cookie_header(self) if stream is None: content_type: str | None = self.headers.get("content-type") headers, stream = encode_request( content=content, data=data, files=files, json=json, boundary=get_multipart_boundary_from_content_type( content_type=content_type.encode(self.headers.encoding) if content_type else None ), ) self._prepare(headers) self.stream = stream # Load the request body, except for streaming content. if isinstance(stream, ByteStream): self.read() else: # There's an important distinction between `Request(content=...)`, # and `Request(stream=...)`. # # Using `content=...` implies automatically populated `Host` and content # headers, of either `Content-Length: ...` or `Transfer-Encoding: chunked`. # # Using `stream=...` will not automatically include *any* # auto-populated headers. # # As an end-user you don't really need `stream=...`. It's only # useful when: # # * Preserving the request stream when copying requests, eg for redirects. # * Creating request instances on the *server-side* of the transport API. self.stream = stream def _prepare(self, default_headers: dict[str, str]) -> None: for key, value in default_headers.items(): # Ignore Transfer-Encoding if the Content-Length has been set explicitly. if key.lower() == "transfer-encoding" and "Content-Length" in self.headers: continue self.headers.setdefault(key, value) auto_headers: list[tuple[bytes, bytes]] = [] has_host = "Host" in self.headers has_content_length = "Content-Length" in self.headers or "Transfer-Encoding" in self.headers if not has_host and self.url.host: auto_headers.append((b"Host", self.url.netloc)) if not has_content_length and self.method in ("POST", "PUT", "PATCH"): auto_headers.append((b"Content-Length", b"0")) self.headers = Headers(auto_headers + self.headers.raw) @property def content(self) -> bytes: if not hasattr(self, "_content"): raise RequestNotRead() return self._content def read(self) -> bytes: """ Read and return the request content. """ if not hasattr(self, "_content"): assert isinstance(self.stream, typing.Iterable) self._content = b"".join(self.stream) if not isinstance(self.stream, ByteStream): # If a streaming request has been read entirely into memory, then # we can replace the stream with a raw bytes implementation, # to ensure that any non-replayable streams can still be used. self.stream = ByteStream(self._content) return self._content async def aread(self) -> bytes: """ Read and return the request content. """ if not hasattr(self, "_content"): assert isinstance(self.stream, typing.AsyncIterable) self._content = b"".join([part async for part in self.stream]) if not isinstance(self.stream, ByteStream): # If a streaming request has been read entirely into memory, then # we can replace the stream with a raw bytes implementation, # to ensure that any non-replayable streams can still be used. self.stream = ByteStream(self._content) return self._content def __repr__(self) -> str: class_name = self.__class__.__name__ url = str(self.url) return f"<{class_name}({self.method!r}, {url!r})>" def __getstate__(self) -> dict[str, typing.Any]: return {name: value for name, value in self.__dict__.items() if name not in ["extensions", "stream"]} def __setstate__(self, state: dict[str, typing.Any]) -> None: for name, value in state.items(): setattr(self, name, value) self.extensions = {} self.stream = UnattachedStream() class Response: def __init__( self, status_code: int, *, headers: HeaderTypes | None = None, content: ResponseContent | None = None, text: str | None = None, html: str | None = None, json: typing.Any = None, stream: SyncByteStream | AsyncByteStream | None = None, request: Request | None = None, extensions: ResponseExtensions | None = None, history: list[Response] | None = None, default_encoding: str | typing.Callable[[bytes], str | None] = "utf-8", ) -> None: self.status_code = status_code self.headers = Headers(headers) self._request: Request | None = request # When follow_redirects=False and a redirect is received, # the client will set `response.next_request`. self.next_request: Request | None = None self.extensions = {} if extensions is None else dict(extensions) self.history = [] if history is None else list(history) self.is_closed = False self.is_stream_consumed = False self.default_encoding = default_encoding if stream is None: headers, stream = encode_response(content, text, html, json) self._prepare(headers) self.stream = stream if isinstance(stream, ByteStream): # Load the response body, except for streaming content. self.read() else: # There's an important distinction between `Response(content=...)`, # and `Response(stream=...)`. # # Using `content=...` implies automatically populated content headers, # of either `Content-Length: ...` or `Transfer-Encoding: chunked`. # # Using `stream=...` will not automatically include any content headers. # # As an end-user you don't really need `stream=...`. It's only # useful when creating response instances having received a stream # from the transport API. self.stream = stream self._num_bytes_downloaded = 0 def _prepare(self, default_headers: dict[str, str]) -> None: for key, value in default_headers.items(): # Ignore Transfer-Encoding if the Content-Length has been set explicitly. if key.lower() == "transfer-encoding" and "content-length" in self.headers: continue self.headers.setdefault(key, value) @property def elapsed(self) -> datetime.timedelta: """ Returns the time taken for the complete request/response cycle to complete. """ if not hasattr(self, "_elapsed"): stream_elapsed: datetime.timedelta | None = getattr(self.stream, "elapsed", None) if stream_elapsed is not None: return stream_elapsed raise RuntimeError("'.elapsed' may only be accessed after the response has been read or closed.") return self._elapsed @elapsed.setter def elapsed(self, elapsed: datetime.timedelta) -> None: self._elapsed = elapsed @property def request(self) -> Request: """ Returns the request instance associated to the current response. """ if self._request is None: raise RuntimeError("The request instance has not been set on this response.") return self._request @request.setter def request(self, value: Request) -> None: self._request = value @property def http_version(self) -> str: try: http_version: bytes = self.extensions["http_version"] except KeyError: return "HTTP/1.1" else: return http_version.decode("ascii", errors="ignore") @property def reason_phrase(self) -> str: try: reason_phrase: bytes = self.extensions["reason_phrase"] except KeyError: return codes.get_reason_phrase(self.status_code) else: return reason_phrase.decode("ascii", errors="ignore") @property def url(self) -> URL: """ Returns the URL for which the request was made. """ return self.request.url @property def content(self) -> bytes: if not hasattr(self, "_content"): raise ResponseNotRead() return self._content @property def text(self) -> str: if not hasattr(self, "_text"): content = self.content if not content: self._text = "" else: decoder = TextDecoder(encoding=self.encoding or "utf-8") self._text = "".join([decoder.decode(self.content), decoder.flush()]) return self._text @property def encoding(self) -> str | None: """ Return an encoding to use for decoding the byte content into text. The priority for determining this is given by... * `.encoding = <>` has been set explicitly. * The encoding as specified by the charset parameter in the Content-Type header. * The encoding as determined by `default_encoding`, which may either be a string like "utf-8" indicating the encoding to use, or may be a callable which enables charset autodetection. """ if not hasattr(self, "_encoding"): encoding = self.charset_encoding if encoding is None or not _is_known_encoding(encoding): if isinstance(self.default_encoding, str): encoding = self.default_encoding elif hasattr(self, "_content"): encoding = self.default_encoding(self._content) self._encoding = encoding or "utf-8" return self._encoding @encoding.setter def encoding(self, value: str) -> None: """ Set the encoding to use for decoding the byte content into text. If the `text` attribute has been accessed, attempting to set the encoding will throw a ValueError. """ if hasattr(self, "_text"): raise ValueError("Setting encoding after `text` has been accessed is not allowed.") self._encoding = value @property def charset_encoding(self) -> str | None: """ Return the encoding, as specified by the Content-Type header. """ content_type = self.headers.get("Content-Type") if content_type is None: return None return _parse_content_type_charset(content_type) def _get_content_decoder(self) -> ContentDecoder: """ Returns a decoder instance which can be used to decode the raw byte content, depending on the Content-Encoding used in the response. """ if not hasattr(self, "_decoder"): values = self.headers.get_list("content-encoding", split_commas=True) encodings = [value.strip().lower() for value in values] decoder = MultiDecoder([encoding for encoding in encodings if encoding != "identity"]) if len(decoder.children) == 1: self._decoder = decoder.children[0] elif decoder.children: self._decoder = decoder else: self._decoder = IdentityDecoder() return self._decoder @property def is_informational(self) -> bool: """ A property which is `True` for 1xx status codes, `False` otherwise. """ return codes.is_informational(self.status_code) @property def is_success(self) -> bool: """ A property which is `True` for 2xx status codes, `False` otherwise. """ return codes.is_success(self.status_code) @property def is_redirect(self) -> bool: """ A property which is `True` for 3xx status codes, `False` otherwise. Note that not all responses with a 3xx status code indicate a URL redirect. Use `response.has_redirect_location` to determine responses with a properly formed URL redirection. """ return codes.is_redirect(self.status_code) @property def is_client_error(self) -> bool: """ A property which is `True` for 4xx status codes, `False` otherwise. """ return codes.is_client_error(self.status_code) @property def is_server_error(self) -> bool: """ A property which is `True` for 5xx status codes, `False` otherwise. """ return codes.is_server_error(self.status_code) @property def is_error(self) -> bool: """ A property which is `True` for 4xx and 5xx status codes, `False` otherwise. """ return codes.is_error(self.status_code) @property def has_redirect_location(self) -> bool: """ Returns True for 3xx responses with a properly formed URL redirection, `False` otherwise. """ return ( self.status_code in ( # 301 (Cacheable redirect. Method may change to GET.) codes.MOVED_PERMANENTLY, # 302 (Uncacheable redirect. Method may change to GET.) codes.FOUND, # 303 (Client should make a GET or HEAD request.) codes.SEE_OTHER, # 307 (Equiv. 302, but retain method) codes.TEMPORARY_REDIRECT, # 308 (Equiv. 301, but retain method) codes.PERMANENT_REDIRECT, ) and "Location" in self.headers ) def raise_for_status(self) -> Response: """ Raise the `HTTPStatusError` if one occurred. """ request = self._request if request is None: raise RuntimeError( "Cannot call `raise_for_status` as the request instance has not been set on this response." ) if self.is_success: return self if self.has_redirect_location: message = ( "{error_type} '{0.status_code} {0.reason_phrase}' for url '{0.url}'\n" "Redirect location: '{0.headers[location]}'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/{0.status_code}" ) else: message = ( "{error_type} '{0.status_code} {0.reason_phrase}' for url '{0.url}'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/{0.status_code}" ) status_class = self.status_code // 100 error_types = { 1: "Informational response", 3: "Redirect response", 4: "Client error", 5: "Server error", } error_type = error_types.get(status_class, "Invalid status code") message = message.format(self, error_type=error_type) raise HTTPStatusError(message, request=request, response=self) def json(self, **kwargs: typing.Any) -> typing.Any: return jsonlib.loads(self.content, **kwargs) @property def cookies(self) -> Cookies: if not hasattr(self, "_cookies"): self._cookies = Cookies() self._cookies.extract_cookies(self) return self._cookies @property def links(self) -> dict[str | None, dict[str, str]]: """ Returns the parsed header links of the response, if any """ header = self.headers.get("link") if header is None: return {} return {(link.get("rel") or link.get("url")): link for link in _parse_header_links(header)} @property def num_bytes_downloaded(self) -> int: return self._num_bytes_downloaded def __repr__(self) -> str: return f"" def __getstate__(self) -> dict[str, typing.Any]: return { name: value for name, value in self.__dict__.items() if name not in ["extensions", "stream", "is_closed", "_decoder"] } def __setstate__(self, state: dict[str, typing.Any]) -> None: for name, value in state.items(): setattr(self, name, value) self.is_closed = True self.extensions = {} self.stream = UnattachedStream() def read(self) -> bytes: """ Read and return the response content. """ if not hasattr(self, "_content"): self._content = b"".join(self.iter_bytes()) return self._content def iter_bytes(self, chunk_size: int | None = None) -> typing.Iterator[bytes]: """ A byte-iterator over the decoded response content. This allows us to handle gzip, deflate, brotli, and zstd encoded responses. """ if hasattr(self, "_content"): chunk_size = len(self._content) if chunk_size is None else chunk_size for i in range(0, len(self._content), max(chunk_size, 1)): yield self._content[i : i + chunk_size] else: decoder = self._get_content_decoder() chunker = ByteChunker(chunk_size=chunk_size) with request_context(request=self._request): for raw_bytes in self.iter_raw(): decoded = decoder.decode(raw_bytes) for chunk in chunker.decode(decoded): yield chunk decoded = decoder.flush() for chunk in chunker.decode(decoded): yield chunk # pragma: no cover for chunk in chunker.flush(): yield chunk def iter_text(self, chunk_size: int | None = None) -> typing.Iterator[str]: """ A str-iterator over the decoded response content that handles both gzip, deflate, etc but also detects the content's string encoding. """ decoder = TextDecoder(encoding=self.encoding or "utf-8") chunker = TextChunker(chunk_size=chunk_size) with request_context(request=self._request): for byte_content in self.iter_bytes(): text_content = decoder.decode(byte_content) for chunk in chunker.decode(text_content): yield chunk text_content = decoder.flush() for chunk in chunker.decode(text_content): yield chunk # pragma: no cover for chunk in chunker.flush(): yield chunk def iter_lines(self) -> typing.Iterator[str]: decoder = LineDecoder() with request_context(request=self._request): for text in self.iter_text(): for line in decoder.decode(text): yield line for line in decoder.flush(): yield line def iter_raw(self, chunk_size: int | None = None) -> typing.Iterator[bytes]: """ A byte-iterator over the raw response content. """ if self.is_stream_consumed: raise StreamConsumed() if self.is_closed: raise StreamClosed() if not isinstance(self.stream, SyncByteStream): raise RuntimeError("Attempted to call a sync iterator on an async stream.") self.is_stream_consumed = True self._num_bytes_downloaded = 0 chunker = ByteChunker(chunk_size=chunk_size) with request_context(request=self._request): for raw_stream_bytes in self.stream: self._num_bytes_downloaded += len(raw_stream_bytes) for chunk in chunker.decode(raw_stream_bytes): yield chunk for chunk in chunker.flush(): yield chunk self.close() def close(self) -> None: """ Close the response and release the connection. Automatically called if the response body is read to completion. """ if not isinstance(self.stream, SyncByteStream): raise RuntimeError("Attempted to call a sync close on an async stream.") if not self.is_closed: self.is_closed = True with request_context(request=self._request): self.stream.close() async def aread(self) -> bytes: """ Read and return the response content. """ if not hasattr(self, "_content"): self._content = b"".join([part async for part in self.aiter_bytes()]) return self._content async def aiter_bytes(self, chunk_size: int | None = None) -> typing.AsyncIterator[bytes]: """ A byte-iterator over the decoded response content. This allows us to handle gzip, deflate, brotli, and zstd encoded responses. """ if hasattr(self, "_content"): chunk_size = len(self._content) if chunk_size is None else chunk_size for i in range(0, len(self._content), max(chunk_size, 1)): yield self._content[i : i + chunk_size] else: decoder = self._get_content_decoder() chunker = ByteChunker(chunk_size=chunk_size) with request_context(request=self._request): async for raw_bytes in self.aiter_raw(): decoded = decoder.decode(raw_bytes) for chunk in chunker.decode(decoded): yield chunk decoded = decoder.flush() for chunk in chunker.decode(decoded): yield chunk # pragma: no cover for chunk in chunker.flush(): yield chunk async def aiter_text(self, chunk_size: int | None = None) -> typing.AsyncIterator[str]: """ A str-iterator over the decoded response content that handles both gzip, deflate, etc but also detects the content's string encoding. """ decoder = TextDecoder(encoding=self.encoding or "utf-8") chunker = TextChunker(chunk_size=chunk_size) with request_context(request=self._request): async for byte_content in self.aiter_bytes(): text_content = decoder.decode(byte_content) for chunk in chunker.decode(text_content): yield chunk text_content = decoder.flush() for chunk in chunker.decode(text_content): yield chunk # pragma: no cover for chunk in chunker.flush(): yield chunk async def aiter_lines(self) -> typing.AsyncIterator[str]: decoder = LineDecoder() with request_context(request=self._request): async for text in self.aiter_text(): for line in decoder.decode(text): yield line for line in decoder.flush(): yield line async def aiter_raw(self, chunk_size: int | None = None) -> typing.AsyncIterator[bytes]: """ A byte-iterator over the raw response content. """ if self.is_stream_consumed: raise StreamConsumed() if self.is_closed: raise StreamClosed() if not isinstance(self.stream, AsyncByteStream): raise RuntimeError("Attempted to call an async iterator on a sync stream.") self.is_stream_consumed = True self._num_bytes_downloaded = 0 chunker = ByteChunker(chunk_size=chunk_size) with request_context(request=self._request): async for raw_stream_bytes in self.stream: self._num_bytes_downloaded += len(raw_stream_bytes) for chunk in chunker.decode(raw_stream_bytes): yield chunk for chunk in chunker.flush(): yield chunk await self.aclose() async def aclose(self) -> None: """ Close the response and release the connection. Automatically called if the response body is read to completion. """ if not isinstance(self.stream, AsyncByteStream): raise RuntimeError("Attempted to call an async close on a sync stream.") if not self.is_closed: self.is_closed = True with request_context(request=self._request): await self.stream.aclose() class Cookies(typing.MutableMapping[str, str]): """ HTTP Cookies, as a mutable mapping. """ def __init__(self, cookies: CookieTypes | None = None) -> None: if cookies is None or isinstance(cookies, dict): self.jar = CookieJar() if isinstance(cookies, dict): for key, value in cookies.items(): self.set(key, value) elif isinstance(cookies, list): self.jar = CookieJar() for key, value in cookies: self.set(key, value) elif isinstance(cookies, Cookies): self.jar = CookieJar() for cookie in cookies.jar: self.jar.set_cookie(cookie) else: self.jar = cookies def extract_cookies(self, response: Response) -> None: """ Loads any cookies based on the response `Set-Cookie` headers. """ urllib_response = self._CookieCompatResponse(response) urllib_request = self._CookieCompatRequest(response.request) self.jar.extract_cookies(urllib_response, urllib_request) # type: ignore def set_cookie_header(self, request: Request) -> None: """ Sets an appropriate 'Cookie:' HTTP header on the `Request`. """ urllib_request = self._CookieCompatRequest(request) self.jar.add_cookie_header(urllib_request) def set(self, name: str, value: str, domain: str = "", path: str = "/") -> None: """ Set a cookie value by name. May optionally include domain and path. """ kwargs = { "version": 0, "name": name, "value": value, "port": None, "port_specified": False, "domain": domain, "domain_specified": bool(domain), "domain_initial_dot": domain.startswith("."), "path": path, "path_specified": bool(path), "secure": False, "expires": None, "discard": True, "comment": None, "comment_url": None, "rest": {"HttpOnly": None}, "rfc2109": False, } cookie = Cookie(**kwargs) # type: ignore self.jar.set_cookie(cookie) def get( # type: ignore self, name: str, default: str | None = None, domain: str | None = None, path: str | None = None, ) -> str | None: """ Get a cookie by name. May optionally include domain and path in order to specify exactly which cookie to retrieve. """ value = None for cookie in self.jar: if cookie.name == name: if domain is None or cookie.domain == domain: if path is None or cookie.path == path: if value is not None: message = f"Multiple cookies exist with name={name}" raise CookieConflict(message) value = cookie.value if value is None: return default return value def delete( self, name: str, domain: str | None = None, path: str | None = None, ) -> None: """ Delete a cookie by name. May optionally include domain and path in order to specify exactly which cookie to delete. """ if domain is not None and path is not None: return self.jar.clear(domain, path, name) remove = [ cookie for cookie in self.jar if cookie.name == name and (domain is None or cookie.domain == domain) and (path is None or cookie.path == path) ] for cookie in remove: self.jar.clear(cookie.domain, cookie.path, cookie.name) def clear(self, domain: str | None = None, path: str | None = None) -> None: """ Delete all cookies. Optionally include a domain and path in order to only delete a subset of all the cookies. """ args: list[str] = [] if domain is not None: args.append(domain) if path is not None: assert domain is not None args.append(path) self.jar.clear(*args) def update(self, cookies: CookieTypes | None = None) -> None: # type: ignore cookies = Cookies(cookies) for cookie in cookies.jar: self.jar.set_cookie(cookie) def __setitem__(self, name: str, value: str) -> None: return self.set(name, value) def __getitem__(self, name: str) -> str: value = self.get(name) if value is None: raise KeyError(name) return value def __delitem__(self, name: str) -> None: return self.delete(name) def __len__(self) -> int: return len(self.jar) def __iter__(self) -> typing.Iterator[str]: return (cookie.name for cookie in self.jar) def __bool__(self) -> bool: for _ in self.jar: return True return False def __repr__(self) -> str: cookies_repr = ", ".join( [f"" for cookie in self.jar] ) return f"" class _CookieCompatRequest(urllib.request.Request): """ Wraps a `Request` instance up in a compatibility interface suitable for use with `CookieJar` operations. """ def __init__(self, request: Request) -> None: super().__init__( url=str(request.url), headers=dict(request.headers), method=request.method, ) self.request = request def add_unredirected_header(self, key: str, val: str) -> None: super().add_unredirected_header(key, val) self.request.headers[key] = val class _CookieCompatResponse: """ Wraps a `Request` instance up in a compatibility interface suitable for use with `CookieJar` operations. """ def __init__(self, response: Response) -> None: self.response = response def info(self) -> email.message.Message: info = email.message.Message() for key, value in self.response.headers.multi_items(): # Note that setting `info[key]` here is an "append" operation, # not a "replace" operation. # https://docs.python.org/3/library/email.compat32-message.html#email.message.Message.__setitem__ info[key] = value return info pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_multipart.py000066400000000000000000000225341521723372100233020ustar00rootroot00000000000000from __future__ import annotations import io import mimetypes import os import re import typing from pathlib import Path from ._types import ( AsyncByteStream, FileContent, FileTypes, RequestData, RequestFiles, SyncByteStream, ) from ._utils import ( peek_filelike_length, primitive_value_to_str, to_bytes, ) _HTML5_FORM_ENCODING_REPLACEMENTS = {'"': "%22", "\\": "\\\\"} _HTML5_FORM_ENCODING_REPLACEMENTS.update({chr(c): f"%{c:02X}" for c in range(0x1F + 1) if c != 0x1B}) _HTML5_FORM_ENCODING_RE = re.compile(r"|".join([re.escape(c) for c in _HTML5_FORM_ENCODING_REPLACEMENTS.keys()])) def _format_form_param(name: str, value: str) -> bytes: """ Encode a name/value pair within a multipart form. """ def replacer(match: typing.Match[str]) -> str: return _HTML5_FORM_ENCODING_REPLACEMENTS[match.group(0)] value = _HTML5_FORM_ENCODING_RE.sub(replacer, value) return f'{name}="{value}"'.encode() def _guess_content_type(filename: str | None) -> str | None: """ Guesses the mimetype based on a filename. Defaults to `application/octet-stream`. Returns `None` if `filename` is `None` or empty. """ if filename: return mimetypes.guess_type(filename)[0] or "application/octet-stream" return None def get_multipart_boundary_from_content_type( content_type: bytes | None, ) -> bytes | None: if not content_type or not content_type.startswith(b"multipart/form-data"): return None # parse boundary according to # https://www.rfc-editor.org/rfc/rfc2046#section-5.1.1 if b";" in content_type: for section in content_type.split(b";"): if section.strip().lower().startswith(b"boundary="): return section.strip()[len(b"boundary=") :].strip(b'"') return None class DataField: """ A single form field item, within a multipart form field. """ def __init__(self, name: str, value: str | bytes | int | float | None) -> None: if not isinstance(name, str): raise TypeError(f"Invalid type for name. Expected str, got {type(name)}: {name!r}") if value is not None and not isinstance(value, (str, bytes, int, float)): raise TypeError(f"Invalid type for value. Expected primitive type, got {type(value)}: {value!r}") self.name = name self.value: str | bytes = value if isinstance(value, bytes) else primitive_value_to_str(value) def render_headers(self) -> bytes: if not hasattr(self, "_headers"): name = _format_form_param("name", self.name) self._headers = b"".join([b"Content-Disposition: form-data; ", name, b"\r\n\r\n"]) return self._headers def render_data(self) -> bytes: if not hasattr(self, "_data"): self._data = to_bytes(self.value) return self._data def get_length(self) -> int: headers = self.render_headers() data = self.render_data() return len(headers) + len(data) def render(self) -> typing.Iterator[bytes]: yield self.render_headers() yield self.render_data() class FileField: """ A single file field item, within a multipart form field. """ CHUNK_SIZE = 64 * 1024 def __init__(self, name: str, value: FileTypes) -> None: self.name = name fileobj: FileContent headers: dict[str, str] = {} content_type: str | None = None # This large tuple based API largely mirror's requests' API # It would be good to think of better APIs for this that we could # include in httpx 2.0 since variable length tuples(especially of 4 elements) # are quite unwieldy if isinstance(value, tuple): if len(value) == 2: # neither the 3rd parameter (content_type) nor the 4th (headers) # was included filename, fileobj = value elif len(value) == 3: filename, fileobj, content_type = value else: # all 4 parameters included filename, fileobj, content_type, headers = value # type: ignore else: filename = Path(str(getattr(value, "name", "upload"))).name fileobj = value if content_type is None: content_type = _guess_content_type(filename) has_content_type_header = any("content-type" in key.lower() for key in headers) if content_type is not None and not has_content_type_header: # note that unlike requests, we ignore the content_type provided in the 3rd # tuple element if it is also included in the headers requests does # the opposite (it overwrites the headerwith the 3rd tuple element) headers["Content-Type"] = content_type if isinstance(fileobj, io.StringIO): raise TypeError("Multipart file uploads require 'io.BytesIO', not 'io.StringIO'.") if isinstance(fileobj, io.TextIOBase): raise TypeError("Multipart file uploads must be opened in binary mode, not text mode.") self.filename = filename self.file = fileobj self.headers = headers def get_length(self) -> int | None: headers = self.render_headers() if isinstance(self.file, (str, bytes)): return len(headers) + len(to_bytes(self.file)) file_length = peek_filelike_length(self.file) # If we can't determine the filesize without reading it into memory, # then return `None` here, to indicate an unknown file length. if file_length is None: return None return len(headers) + file_length def render_headers(self) -> bytes: if not hasattr(self, "_headers"): parts = [ b"Content-Disposition: form-data; ", _format_form_param("name", self.name), ] if self.filename: filename = _format_form_param("filename", self.filename) parts.extend([b"; ", filename]) for header_name, header_value in self.headers.items(): key, val = f"\r\n{header_name}: ".encode(), header_value.encode() parts.extend([key, val]) parts.append(b"\r\n\r\n") self._headers = b"".join(parts) return self._headers def render_data(self) -> typing.Iterator[bytes]: if isinstance(self.file, (str, bytes)): yield to_bytes(self.file) return if hasattr(self.file, "seek"): try: self.file.seek(0) except io.UnsupportedOperation: pass chunk = self.file.read(self.CHUNK_SIZE) while chunk: yield to_bytes(chunk) chunk = self.file.read(self.CHUNK_SIZE) def render(self) -> typing.Iterator[bytes]: yield self.render_headers() yield from self.render_data() class MultipartStream(SyncByteStream, AsyncByteStream): """ Request content as streaming multipart encoded form data. """ def __init__( self, data: RequestData, files: RequestFiles, boundary: bytes | None = None, ) -> None: if boundary is None: boundary = os.urandom(16).hex().encode("ascii") self.boundary = boundary self.content_type = f"multipart/form-data; boundary={boundary.decode('ascii')}" self.fields = list(self._iter_fields(data, files)) def _iter_fields(self, data: RequestData, files: RequestFiles) -> typing.Iterator[FileField | DataField]: for name, value in data.items(): if isinstance(value, (tuple, list)): for item in value: yield DataField(name=name, value=item) else: yield DataField(name=name, value=value) file_items = files.items() if isinstance(files, typing.Mapping) else files for name, value in file_items: yield FileField(name=name, value=value) def iter_chunks(self) -> typing.Iterator[bytes]: for field in self.fields: yield b"--%s\r\n" % self.boundary yield from field.render() yield b"\r\n" yield b"--%s--\r\n" % self.boundary def get_content_length(self) -> int | None: """ Return the length of the multipart encoded content, or `None` if any of the files have a length that cannot be determined upfront. """ boundary_length = len(self.boundary) length = 0 for field in self.fields: field_length = field.get_length() if field_length is None: return None length += 2 + boundary_length + 2 # b"--{boundary}\r\n" length += field_length length += 2 # b"\r\n" length += 2 + boundary_length + 4 # b"--{boundary}--\r\n" return length # Content stream interface. def get_headers(self) -> dict[str, str]: content_length = self.get_content_length() content_type = self.content_type if content_length is None: return {"Transfer-Encoding": "chunked", "Content-Type": content_type} return {"Content-Length": str(content_length), "Content-Type": content_type} def __iter__(self) -> typing.Iterator[bytes]: yield from self.iter_chunks() async def __aiter__(self) -> typing.AsyncIterator[bytes]: for chunk in self.iter_chunks(): yield chunk pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_sse.py000066400000000000000000000110731521723372100220470ustar00rootroot00000000000000""" Server-sent events support, derived from httpx-sse (https://github.com/florimondmanca/httpx-sse). Copyright (c) 2022 Florimond Manca, MIT License (https://github.com/florimondmanca/httpx-sse/blob/master/LICENSE). """ from __future__ import annotations import json as jsonlib from collections.abc import AsyncIterator, Iterator from dataclasses import dataclass from ._exceptions import TransportError from ._models import Response __all__ = ["EventSource", "SSEError", "ServerSentEvent"] class SSEError(TransportError): """ An error that occurred while connecting to a server-sent events endpoint. """ @dataclass(frozen=True) class ServerSentEvent: event: str = "message" data: str = "" id: str = "" retry: int | None = None def json(self) -> object: return jsonlib.loads(self.data) class _SSEDecoder: def __init__(self) -> None: self._event = "" self._data: list[str] = [] self._last_event_id = "" self._retry: int | None = None self._pending = False def decode(self, line: str) -> ServerSentEvent | None: if not line: if not self._pending: return None sse = ServerSentEvent( event=self._event or "message", data="\n".join(self._data), id=self._last_event_id, retry=self._retry, ) self._event = "" self._data = [] self._retry = None self._pending = False return sse if line.startswith(":"): return None fieldname, _, value = line.partition(":") value = value[1:] if value.startswith(" ") else value if fieldname == "event": self._event = value self._pending = True elif fieldname == "data": self._data.append(value) self._pending = True elif fieldname == "id": if "\0" not in value: self._last_event_id = value self._pending = True elif fieldname == "retry": try: self._retry = int(value) self._pending = True except ValueError: pass return None class _SSELineDecoder: def __init__(self) -> None: self._buffer = "" self._trailing_cr = False def decode(self, text: str) -> list[str]: if self._trailing_cr: text = "\r" + text self._trailing_cr = False if text.endswith("\r"): self._trailing_cr = True text = text[:-1] text = self._buffer + text.replace("\r\n", "\n").replace("\r", "\n") lines = text.split("\n") self._buffer = lines.pop() return lines def flush(self) -> list[str]: if self._trailing_cr: self._buffer += "\n" self._trailing_cr = False if not self._buffer: return [] lines = self._buffer.split("\n") self._buffer = "" return lines class EventSource: def __init__(self, response: Response) -> None: self._response = response @property def response(self) -> Response: return self._response def _check_content_type(self) -> None: content_type, _, _ = self._response.headers.get("content-type", "").partition(";") if content_type.strip().lower() != "text/event-stream": raise SSEError( f"Expected response with content type 'text/event-stream', got {content_type.strip()!r}.", request=self._response.request, ) def __iter__(self) -> Iterator[ServerSentEvent]: self._check_content_type() decoder = _SSEDecoder() lines = _SSELineDecoder() for chunk in self._response.iter_text(): for line in lines.decode(chunk): sse = decoder.decode(line) if sse is not None: yield sse for line in lines.flush(): sse = decoder.decode(line) if sse is not None: yield sse async def __aiter__(self) -> AsyncIterator[ServerSentEvent]: self._check_content_type() decoder = _SSEDecoder() lines = _SSELineDecoder() async for chunk in self._response.aiter_text(): for line in lines.decode(chunk): sse = decoder.decode(line) if sse is not None: yield sse for line in lines.flush(): sse = decoder.decode(line) if sse is not None: yield sse pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_status_codes.py000066400000000000000000000130071521723372100237540ustar00rootroot00000000000000from __future__ import annotations from enum import IntEnum __all__ = ["codes"] class codes(IntEnum): """HTTP status codes and reason phrases Status codes from the following RFCs are all observed: * RFC 7231: Hypertext Transfer Protocol (HTTP/1.1), obsoletes 2616 * RFC 6585: Additional HTTP Status Codes * RFC 3229: Delta encoding in HTTP * RFC 4918: HTTP Extensions for WebDAV, obsoletes 2518 * RFC 5842: Binding Extensions to WebDAV * RFC 7238: Permanent Redirect * RFC 2295: Transparent Content Negotiation in HTTP * RFC 2774: An HTTP Extension Framework * RFC 7540: Hypertext Transfer Protocol Version 2 (HTTP/2) * RFC 2324: Hyper Text Coffee Pot Control Protocol (HTCPCP/1.0) * RFC 7725: An HTTP Status Code to Report Legal Obstacles * RFC 8297: An HTTP Status Code for Indicating Hints * RFC 8470: Using Early Data in HTTP """ def __new__(cls, value: int, phrase: str = "") -> codes: obj = int.__new__(cls, value) obj._value_ = value obj.phrase = phrase # type: ignore[attr-defined] return obj def __str__(self) -> str: return str(self.value) @classmethod def get_reason_phrase(cls, value: int) -> str: try: return codes(value).phrase # type: ignore except ValueError: return "" @classmethod def is_informational(cls, value: int) -> bool: """ Returns `True` for 1xx status codes, `False` otherwise. """ return 100 <= value <= 199 @classmethod def is_success(cls, value: int) -> bool: """ Returns `True` for 2xx status codes, `False` otherwise. """ return 200 <= value <= 299 @classmethod def is_redirect(cls, value: int) -> bool: """ Returns `True` for 3xx status codes, `False` otherwise. """ return 300 <= value <= 399 @classmethod def is_client_error(cls, value: int) -> bool: """ Returns `True` for 4xx status codes, `False` otherwise. """ return 400 <= value <= 499 @classmethod def is_server_error(cls, value: int) -> bool: """ Returns `True` for 5xx status codes, `False` otherwise. """ return 500 <= value <= 599 @classmethod def is_error(cls, value: int) -> bool: """ Returns `True` for 4xx or 5xx status codes, `False` otherwise. """ return 400 <= value <= 599 # informational CONTINUE = 100, "Continue" SWITCHING_PROTOCOLS = 101, "Switching Protocols" PROCESSING = 102, "Processing" EARLY_HINTS = 103, "Early Hints" # success OK = 200, "OK" CREATED = 201, "Created" ACCEPTED = 202, "Accepted" NON_AUTHORITATIVE_INFORMATION = 203, "Non-Authoritative Information" NO_CONTENT = 204, "No Content" RESET_CONTENT = 205, "Reset Content" PARTIAL_CONTENT = 206, "Partial Content" MULTI_STATUS = 207, "Multi-Status" ALREADY_REPORTED = 208, "Already Reported" IM_USED = 226, "IM Used" # redirection MULTIPLE_CHOICES = 300, "Multiple Choices" MOVED_PERMANENTLY = 301, "Moved Permanently" FOUND = 302, "Found" SEE_OTHER = 303, "See Other" NOT_MODIFIED = 304, "Not Modified" USE_PROXY = 305, "Use Proxy" TEMPORARY_REDIRECT = 307, "Temporary Redirect" PERMANENT_REDIRECT = 308, "Permanent Redirect" # client error BAD_REQUEST = 400, "Bad Request" UNAUTHORIZED = 401, "Unauthorized" PAYMENT_REQUIRED = 402, "Payment Required" FORBIDDEN = 403, "Forbidden" NOT_FOUND = 404, "Not Found" METHOD_NOT_ALLOWED = 405, "Method Not Allowed" NOT_ACCEPTABLE = 406, "Not Acceptable" PROXY_AUTHENTICATION_REQUIRED = 407, "Proxy Authentication Required" REQUEST_TIMEOUT = 408, "Request Timeout" CONFLICT = 409, "Conflict" GONE = 410, "Gone" LENGTH_REQUIRED = 411, "Length Required" PRECONDITION_FAILED = 412, "Precondition Failed" REQUEST_ENTITY_TOO_LARGE = 413, "Request Entity Too Large" REQUEST_URI_TOO_LONG = 414, "Request-URI Too Long" UNSUPPORTED_MEDIA_TYPE = 415, "Unsupported Media Type" REQUESTED_RANGE_NOT_SATISFIABLE = 416, "Requested Range Not Satisfiable" EXPECTATION_FAILED = 417, "Expectation Failed" IM_A_TEAPOT = 418, "I'm a teapot" MISDIRECTED_REQUEST = 421, "Misdirected Request" UNPROCESSABLE_ENTITY = 422, "Unprocessable Entity" LOCKED = 423, "Locked" FAILED_DEPENDENCY = 424, "Failed Dependency" TOO_EARLY = 425, "Too Early" UPGRADE_REQUIRED = 426, "Upgrade Required" PRECONDITION_REQUIRED = 428, "Precondition Required" TOO_MANY_REQUESTS = 429, "Too Many Requests" REQUEST_HEADER_FIELDS_TOO_LARGE = 431, "Request Header Fields Too Large" UNAVAILABLE_FOR_LEGAL_REASONS = 451, "Unavailable For Legal Reasons" # server errors INTERNAL_SERVER_ERROR = 500, "Internal Server Error" NOT_IMPLEMENTED = 501, "Not Implemented" BAD_GATEWAY = 502, "Bad Gateway" SERVICE_UNAVAILABLE = 503, "Service Unavailable" GATEWAY_TIMEOUT = 504, "Gateway Timeout" HTTP_VERSION_NOT_SUPPORTED = 505, "HTTP Version Not Supported" VARIANT_ALSO_NEGOTIATES = 506, "Variant Also Negotiates" INSUFFICIENT_STORAGE = 507, "Insufficient Storage" LOOP_DETECTED = 508, "Loop Detected" NOT_EXTENDED = 510, "Not Extended" NETWORK_AUTHENTICATION_REQUIRED = 511, "Network Authentication Required" # Include lower-case styles for `requests` compatibility. for code in codes: setattr(codes, code._name_.lower(), int(code)) pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_transports/000077500000000000000000000000001521723372100231205ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_transports/__init__.py000066400000000000000000000005671521723372100252410ustar00rootroot00000000000000from .asgi import ASGITransport from .base import AsyncBaseTransport, BaseTransport from .default import AsyncHTTPTransport, HTTPTransport from .mock import MockTransport from .wsgi import WSGITransport __all__ = [ "ASGITransport", "AsyncBaseTransport", "BaseTransport", "AsyncHTTPTransport", "HTTPTransport", "MockTransport", "WSGITransport", ] pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_transports/asgi.py000066400000000000000000000124651521723372100244250ustar00rootroot00000000000000from __future__ import annotations import typing from .._models import Request, Response from .._types import AsyncByteStream from .base import AsyncBaseTransport if typing.TYPE_CHECKING: import asyncio import trio Event = asyncio.Event | trio.Event _Message = typing.MutableMapping[str, typing.Any] _Receive = typing.Callable[[], typing.Awaitable[_Message]] _Send = typing.Callable[[typing.MutableMapping[str, typing.Any]], typing.Awaitable[None]] _ASGIApp = typing.Callable[[typing.MutableMapping[str, typing.Any], _Receive, _Send], typing.Awaitable[None]] __all__ = ["ASGITransport"] def is_running_trio() -> bool: try: # sniffio is a dependency of trio. # See https://github.com/python-trio/trio/issues/2802 import sniffio if sniffio.current_async_library() == "trio": return True except ImportError: # pragma: no cover pass return False def create_event() -> Event: if is_running_trio(): import trio return trio.Event() import asyncio return asyncio.Event() class ASGIResponseStream(AsyncByteStream): def __init__(self, body: list[bytes]) -> None: self._body = body async def __aiter__(self) -> typing.AsyncIterator[bytes]: yield b"".join(self._body) class ASGITransport(AsyncBaseTransport): """ A custom AsyncTransport that handles sending requests directly to an ASGI app. ```python transport = httpx2.ASGITransport( app=app, root_path="/submount", client=("1.2.3.4", 123) ) client = httpx2.AsyncClient(transport=transport) ``` Arguments: app: The ASGI application. raise_app_exceptions: Boolean indicating if exceptions in the application should be raised. Default to `True`. Can be set to `False` for use cases such as testing the content of a client 500 response. root_path: The root path on which the ASGI application should be mounted. client: A two-tuple indicating the client IP and port of incoming requests. """ def __init__( self, app: _ASGIApp, raise_app_exceptions: bool = True, root_path: str = "", client: tuple[str, int] = ("127.0.0.1", 123), ) -> None: self.app = app self.raise_app_exceptions = raise_app_exceptions self.root_path = root_path self.client = client async def handle_async_request(self, request: Request) -> Response: assert isinstance(request.stream, AsyncByteStream) # ASGI scope. scope = { "type": "http", "asgi": {"version": "3.0"}, "http_version": "1.1", "method": request.method, "headers": [(k.lower(), v) for (k, v) in request.headers.raw], "scheme": request.url.scheme, "path": request.url.path, "raw_path": request.url.raw_path.split(b"?")[0], "query_string": request.url.query, "server": (request.url.host, request.url.port), "client": self.client, "root_path": self.root_path, } # Request. request_body_chunks = request.stream.__aiter__() request_complete = False # Response. status_code = None response_headers = None body_parts: list[bytes] = [] response_started = False response_complete = create_event() # ASGI callables. async def receive() -> dict[str, typing.Any]: nonlocal request_complete if request_complete: await response_complete.wait() return {"type": "http.disconnect"} try: body = await request_body_chunks.__anext__() except StopAsyncIteration: request_complete = True return {"type": "http.request", "body": b"", "more_body": False} return {"type": "http.request", "body": body, "more_body": True} async def send(message: typing.MutableMapping[str, typing.Any]) -> None: nonlocal status_code, response_headers, response_started if message["type"] == "http.response.start": assert not response_started status_code = message["status"] response_headers = message.get("headers", []) response_started = True elif message["type"] == "http.response.body": assert not response_complete.is_set() body = message.get("body", b"") more_body = message.get("more_body", False) if body and request.method != "HEAD": body_parts.append(body) if not more_body: response_complete.set() try: await self.app(scope, receive, send) except Exception: if self.raise_app_exceptions: raise response_complete.set() if status_code is None: status_code = 500 if response_headers is None: response_headers = {} assert response_complete.is_set() assert status_code is not None assert response_headers is not None stream = ASGIResponseStream(body_parts) return Response(status_code, headers=response_headers, stream=stream) pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_transports/base.py000066400000000000000000000050301521723372100244020ustar00rootroot00000000000000from __future__ import annotations import typing from types import TracebackType from .._models import Request, Response # TODO(Marcelo): When Python 3.10 reaches EOF, we can use `typing.Self` instead of defining those two. T = typing.TypeVar("T", bound="BaseTransport") A = typing.TypeVar("A", bound="AsyncBaseTransport") __all__ = ["AsyncBaseTransport", "BaseTransport"] class BaseTransport: def __enter__(self: T) -> T: return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: TracebackType | None = None, ) -> None: self.close() def handle_request(self, request: Request) -> Response: """ Send a single HTTP request and return a response. Developers shouldn't typically ever need to call into this API directly, since the Client class provides all the higher level user-facing API niceties. In order to properly release any network resources, the response stream should *either* be consumed immediately, with a call to `response.stream.read()`, or else the `handle_request` call should be followed with a try/finally block to ensuring the stream is always closed. Example usage: with httpx2.HTTPTransport() as transport: req = httpx2.Request( method=b"GET", url=(b"https", b"www.example.com", 443, b"/"), headers=[(b"Host", b"www.example.com")], ) resp = transport.handle_request(req) body = resp.stream.read() print(resp.status_code, resp.headers, body) Takes a `Request` instance as the only argument. Returns a `Response` instance. """ raise NotImplementedError("The 'handle_request' method must be implemented.") # pragma: no cover def close(self) -> None: pass class AsyncBaseTransport: async def __aenter__(self: A) -> A: return self async def __aexit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: TracebackType | None = None, ) -> None: await self.aclose() async def handle_async_request( self, request: Request, ) -> Response: raise NotImplementedError("The 'handle_async_request' method must be implemented.") # pragma: no cover async def aclose(self) -> None: pass pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_transports/default.py000066400000000000000000000331311521723372100251170ustar00rootroot00000000000000""" Custom transports, with nicely configured defaults. The following additional keyword arguments are currently supported by httpcore... * uds: str * local_address: str * retries: int Example usages... # Disable HTTP/2 on a single specific domain. mounts = { "all://": httpx2.HTTPTransport(http2=True), "all://*example.org": httpx2.HTTPTransport() } # Using advanced httpcore configuration, with connection retries. transport = httpx2.HTTPTransport(retries=1) client = httpx2.Client(transport=transport) # Using advanced httpcore configuration, with unix domain sockets. transport = httpx2.HTTPTransport(uds="socket.uds") client = httpx2.Client(transport=transport) """ from __future__ import annotations import contextlib import typing from collections.abc import Generator from types import TracebackType if typing.TYPE_CHECKING: # pragma: no cover import ssl import httpx2 from .._config import DEFAULT_LIMITS, Limits, Proxy, create_ssl_context from .._exceptions import ( ConnectError, ConnectTimeout, LocalProtocolError, NetworkError, PoolTimeout, ProtocolError, ProxyError, ReadError, ReadTimeout, RemoteProtocolError, TimeoutException, UnsupportedProtocol, WriteError, WriteTimeout, ) from .._models import Request, Response from .._types import AsyncByteStream, CertTypes, ProxyTypes, SyncByteStream from .._urls import URL from .base import AsyncBaseTransport, BaseTransport T = typing.TypeVar("T", bound="HTTPTransport") A = typing.TypeVar("A", bound="AsyncHTTPTransport") SOCKET_OPTION = tuple[int, int, int] | tuple[int, int, bytes | bytearray] | tuple[int, int, None, int] __all__ = ["AsyncHTTPTransport", "HTTPTransport"] HTTPCORE_EXC_MAP: dict[type[Exception], type[httpx2.HTTPError]] = {} def _load_httpcore_exceptions() -> dict[type[Exception], type[httpx2.HTTPError]]: import httpcore2 return { httpcore2.TimeoutException: TimeoutException, httpcore2.ConnectTimeout: ConnectTimeout, httpcore2.ReadTimeout: ReadTimeout, httpcore2.WriteTimeout: WriteTimeout, httpcore2.PoolTimeout: PoolTimeout, httpcore2.NetworkError: NetworkError, httpcore2.ConnectError: ConnectError, httpcore2.ReadError: ReadError, httpcore2.WriteError: WriteError, httpcore2.ProxyError: ProxyError, httpcore2.UnsupportedProtocol: UnsupportedProtocol, httpcore2.ProtocolError: ProtocolError, httpcore2.LocalProtocolError: LocalProtocolError, httpcore2.RemoteProtocolError: RemoteProtocolError, } @contextlib.contextmanager def map_httpcore_exceptions() -> Generator[None]: global HTTPCORE_EXC_MAP if len(HTTPCORE_EXC_MAP) == 0: HTTPCORE_EXC_MAP = _load_httpcore_exceptions() try: yield except Exception as exc: mapped_exc = None for from_exc, to_exc in HTTPCORE_EXC_MAP.items(): if not isinstance(exc, from_exc): continue # We want to map to the most specific exception we can find. # Eg if `exc` is an `httpcore2.ReadTimeout`, we want to map to # `httpx2.ReadTimeout`, not just `httpx2.TimeoutException`. if mapped_exc is None or issubclass(to_exc, mapped_exc): mapped_exc = to_exc if mapped_exc is None: # pragma: no cover raise message = str(exc) raise mapped_exc(message) from exc class ResponseStream(SyncByteStream): def __init__(self, httpcore_stream: typing.Iterable[bytes]) -> None: self._httpcore_stream = httpcore_stream def __iter__(self) -> typing.Iterator[bytes]: with map_httpcore_exceptions(): yield from self._httpcore_stream def close(self) -> None: if hasattr(self._httpcore_stream, "close"): self._httpcore_stream.close() class HTTPTransport(BaseTransport): def __init__( self, verify: ssl.SSLContext | str | bool = True, cert: CertTypes | None = None, trust_env: bool = True, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, proxy: ProxyTypes | None = None, uds: str | None = None, local_address: str | None = None, retries: int = 0, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> None: import httpcore2 proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy ssl_context = create_ssl_context(verify=verify, cert=cert, trust_env=trust_env) if proxy is None: self._pool = httpcore2.ConnectionPool( ssl_context=ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, uds=uds, local_address=local_address, retries=retries, socket_options=socket_options, ) elif proxy.url.scheme in ("http", "https"): self._pool = httpcore2.HTTPProxy( proxy_url=httpcore2.URL( scheme=proxy.url.raw_scheme, host=proxy.url.raw_host, port=proxy.url.port, target=proxy.url.raw_path, ), proxy_auth=proxy.raw_auth, proxy_headers=proxy.headers.raw, ssl_context=ssl_context, proxy_ssl_context=proxy.ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, socket_options=socket_options, ) elif proxy.url.scheme in ("socks5", "socks5h"): try: import socksio # noqa except ImportError: # pragma: no cover raise ImportError( "Using SOCKS proxy, but the 'socksio' package is not installed. " "Make sure to install httpx using `pip install httpx[socks]`." ) from None self._pool = httpcore2.SOCKSProxy( proxy_url=httpcore2.URL( scheme=proxy.url.raw_scheme, host=proxy.url.raw_host, port=proxy.url.port, target=proxy.url.raw_path, ), proxy_auth=proxy.raw_auth, ssl_context=ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, ) else: # pragma: no cover raise ValueError( f"Proxy protocol must be either 'http', 'https', 'socks5', or 'socks5h', but got {proxy.url.scheme!r}." ) def __enter__(self: T) -> T: # Use generics for subclass support. self._pool.__enter__() return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: TracebackType | None = None, ) -> None: with map_httpcore_exceptions(): self._pool.__exit__(exc_type, exc_value, traceback) def handle_request( self, request: Request, ) -> Response: assert isinstance(request.stream, SyncByteStream) import httpcore2 req = httpcore2.Request( method=request.method, url=httpcore2.URL( scheme=request.url.raw_scheme, host=request.url.raw_host, port=request.url.port, target=request.url.raw_path, ), headers=request.headers.raw, content=request.stream, extensions=request.extensions, ) with map_httpcore_exceptions(): resp = self._pool.handle_request(req) assert isinstance(resp.stream, typing.Iterable) return Response( status_code=resp.status, headers=resp.headers, stream=ResponseStream(resp.stream), extensions=resp.extensions, ) def close(self) -> None: self._pool.close() class AsyncResponseStream(AsyncByteStream): def __init__(self, httpcore_stream: typing.AsyncIterable[bytes]) -> None: self._httpcore_stream = httpcore_stream async def __aiter__(self) -> typing.AsyncIterator[bytes]: with map_httpcore_exceptions(): async for part in self._httpcore_stream: yield part async def aclose(self) -> None: if hasattr(self._httpcore_stream, "aclose"): await self._httpcore_stream.aclose() class AsyncHTTPTransport(AsyncBaseTransport): def __init__( self, verify: ssl.SSLContext | str | bool = True, cert: CertTypes | None = None, trust_env: bool = True, http1: bool = True, http2: bool = False, limits: Limits = DEFAULT_LIMITS, proxy: ProxyTypes | None = None, uds: str | None = None, local_address: str | None = None, retries: int = 0, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> None: import httpcore2 proxy = Proxy(url=proxy) if isinstance(proxy, (str, URL)) else proxy ssl_context = create_ssl_context(verify=verify, cert=cert, trust_env=trust_env) if proxy is None: self._pool = httpcore2.AsyncConnectionPool( ssl_context=ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, uds=uds, local_address=local_address, retries=retries, socket_options=socket_options, ) elif proxy.url.scheme in ("http", "https"): self._pool = httpcore2.AsyncHTTPProxy( proxy_url=httpcore2.URL( scheme=proxy.url.raw_scheme, host=proxy.url.raw_host, port=proxy.url.port, target=proxy.url.raw_path, ), proxy_auth=proxy.raw_auth, proxy_headers=proxy.headers.raw, proxy_ssl_context=proxy.ssl_context, ssl_context=ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, socket_options=socket_options, ) elif proxy.url.scheme in ("socks5", "socks5h"): try: import socksio # noqa except ImportError: # pragma: no cover raise ImportError( "Using SOCKS proxy, but the 'socksio' package is not installed. " "Make sure to install httpx using `pip install httpx[socks]`." ) from None self._pool = httpcore2.AsyncSOCKSProxy( proxy_url=httpcore2.URL( scheme=proxy.url.raw_scheme, host=proxy.url.raw_host, port=proxy.url.port, target=proxy.url.raw_path, ), proxy_auth=proxy.raw_auth, ssl_context=ssl_context, max_connections=limits.max_connections, max_keepalive_connections=limits.max_keepalive_connections, keepalive_expiry=limits.keepalive_expiry, http1=http1, http2=http2, ) else: # pragma: no cover raise ValueError( f"Proxy protocol must be either 'http', 'https', 'socks5', or 'socks5h', but got {proxy.url.scheme!r}." ) async def __aenter__(self: A) -> A: # Use generics for subclass support. await self._pool.__aenter__() return self async def __aexit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: TracebackType | None = None, ) -> None: with map_httpcore_exceptions(): await self._pool.__aexit__(exc_type, exc_value, traceback) async def handle_async_request( self, request: Request, ) -> Response: assert isinstance(request.stream, AsyncByteStream) import httpcore2 req = httpcore2.Request( method=request.method, url=httpcore2.URL( scheme=request.url.raw_scheme, host=request.url.raw_host, port=request.url.port, target=request.url.raw_path, ), headers=request.headers.raw, content=request.stream, extensions=request.extensions, ) with map_httpcore_exceptions(): resp = await self._pool.handle_async_request(req) assert isinstance(resp.stream, typing.AsyncIterable) return Response( status_code=resp.status, headers=resp.headers, stream=AsyncResponseStream(resp.stream), extensions=resp.extensions, ) async def aclose(self) -> None: await self._pool.aclose() pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_transports/mock.py000066400000000000000000000022711521723372100244250ustar00rootroot00000000000000from __future__ import annotations import typing from .._models import Request, Response from .base import AsyncBaseTransport, BaseTransport SyncHandler = typing.Callable[[Request], Response] AsyncHandler = typing.Callable[[Request], typing.Coroutine[None, None, Response]] __all__ = ["MockTransport"] class MockTransport(AsyncBaseTransport, BaseTransport): def __init__(self, handler: SyncHandler | AsyncHandler) -> None: self.handler = handler def handle_request( self, request: Request, ) -> Response: request.read() response = self.handler(request) if not isinstance(response, Response): # pragma: no cover raise TypeError("Cannot use an async handler in a sync Client") return response async def handle_async_request(self, request: Request) -> Response: await request.aread() response = self.handler(request) # Allow handler to *optionally* be an `async` function. # If it is, then the `response` variable need to be awaited to actually # return the result. if not isinstance(response, Response): response = await response return response pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_transports/wsgi.py000066400000000000000000000112361521723372100244460ustar00rootroot00000000000000from __future__ import annotations import io import itertools import sys import typing from .._models import Request, Response from .._types import SyncByteStream from .base import BaseTransport if typing.TYPE_CHECKING: from _typeshed import OptExcInfo # pragma: no cover from _typeshed.wsgi import WSGIApplication # pragma: no cover _T = typing.TypeVar("_T") __all__ = ["WSGITransport"] def _skip_leading_empty_chunks(body: typing.Iterable[_T]) -> typing.Iterable[_T]: body = iter(body) for chunk in body: if chunk: return itertools.chain([chunk], body) return [] class WSGIByteStream(SyncByteStream): def __init__(self, result: typing.Iterable[bytes]) -> None: self._close = getattr(result, "close", None) self._result = _skip_leading_empty_chunks(result) def __iter__(self) -> typing.Iterator[bytes]: yield from self._result def close(self) -> None: if self._close is not None: self._close() class WSGITransport(BaseTransport): """ A custom transport that handles sending requests directly to an WSGI app. The simplest way to use this functionality is to use the `app` argument. ``` client = httpx2.Client(app=app) ``` Alternatively, you can setup the transport instance explicitly. This allows you to include any additional configuration arguments specific to the WSGITransport class: ``` transport = httpx2.WSGITransport( app=app, script_name="/submount", remote_addr="1.2.3.4" ) client = httpx2.Client(transport=transport) ``` Arguments: app: The WSGI application. raise_app_exceptions: Boolean indicating if exceptions in the application should be raised. Default to `True`. Can be set to `False` for use cases such as testing the content of a client 500 response. script_name: The root path on which the WSGI application should be mounted. remote_addr: A string indicating the client IP of incoming requests. """ def __init__( self, app: WSGIApplication, raise_app_exceptions: bool = True, script_name: str = "", remote_addr: str = "127.0.0.1", wsgi_errors: typing.TextIO | None = None, ) -> None: self.app = app self.raise_app_exceptions = raise_app_exceptions self.script_name = script_name self.remote_addr = remote_addr self.wsgi_errors = wsgi_errors def handle_request(self, request: Request) -> Response: request.read() wsgi_input = io.BytesIO(request.content) port = request.url.port or {"http": 80, "https": 443}[request.url.scheme] environ = { "wsgi.version": (1, 0), "wsgi.url_scheme": request.url.scheme, "wsgi.input": wsgi_input, "wsgi.errors": self.wsgi_errors or sys.stderr, "wsgi.multithread": True, "wsgi.multiprocess": False, "wsgi.run_once": False, "REQUEST_METHOD": request.method, "SCRIPT_NAME": self.script_name, "PATH_INFO": request.url.path, "QUERY_STRING": request.url.query.decode("ascii"), "SERVER_NAME": request.url.host, "SERVER_PORT": str(port), "SERVER_PROTOCOL": "HTTP/1.1", "REMOTE_ADDR": self.remote_addr, } for header_key, header_value in request.headers.raw: key = header_key.decode("ascii").upper().replace("-", "_") if key not in ("CONTENT_TYPE", "CONTENT_LENGTH"): key = "HTTP_" + key environ[key] = header_value.decode("ascii") seen_status = None seen_response_headers = None seen_exc_info = None def start_response( status: str, response_headers: list[tuple[str, str]], exc_info: OptExcInfo | None = None, ) -> typing.Callable[[bytes], typing.Any]: nonlocal seen_status, seen_response_headers, seen_exc_info seen_status = status seen_response_headers = response_headers seen_exc_info = exc_info return lambda _: None result = self.app(environ, start_response) stream = WSGIByteStream(result) assert seen_status is not None assert seen_response_headers is not None if seen_exc_info and seen_exc_info[0] and self.raise_app_exceptions: raise seen_exc_info[1] status_code = int(seen_status.split()[0]) headers = [(key.encode("ascii"), value.encode("ascii")) for key, value in seen_response_headers] return Response(status_code, headers=headers, stream=stream) pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_types.py000066400000000000000000000051571521723372100224270ustar00rootroot00000000000000""" Type definitions for type checking purposes. """ from collections.abc import AsyncIterable, AsyncIterator, Callable, Iterable, Iterator, Mapping, Sequence from http.cookiejar import CookieJar from typing import IO, TYPE_CHECKING, Any, Union if TYPE_CHECKING: from ._auth import Auth # noqa: F401 from ._config import Proxy, Timeout # noqa: F401 from ._models import Cookies, Headers, Request # noqa: F401 from ._urls import URL, QueryParams # noqa: F401 PrimitiveData = str | int | float | bool | None URLTypes = Union["URL", str] QueryParamTypes = Union[ "QueryParams", Mapping[str, PrimitiveData | Sequence[PrimitiveData]], list[tuple[str, PrimitiveData]], tuple[tuple[str, PrimitiveData], ...], str, bytes, ] HeaderTypes = Union[ "Headers", Mapping[str, str], Mapping[bytes, bytes], Sequence[tuple[str, str]], Sequence[tuple[bytes, bytes]], ] CookieTypes = Union["Cookies", CookieJar, dict[str, str], list[tuple[str, str]]] TimeoutTypes = Union[float | None, tuple[float | None, float | None, float | None, float | None], "Timeout"] ProxyTypes = Union["URL", str, "Proxy"] CertTypes = str | tuple[str, str] | tuple[str, str, str] AuthTypes = Union[tuple[str | bytes, str | bytes], Callable[["Request"], "Request"], "Auth"] RequestContent = str | bytes | Iterable[bytes] | AsyncIterable[bytes] ResponseContent = str | bytes | Iterable[bytes] | AsyncIterable[bytes] ResponseExtensions = Mapping[str, Any] RequestData = Mapping[str, Any] FileContent = IO[bytes] | bytes | str FileTypes = ( # # file (or bytes) FileContent # # (filename, file (or bytes)) | tuple[str | None, FileContent] # # (filename, file (or bytes), content_type) | tuple[str | None, FileContent, str | None] | tuple[str | None, FileContent, str | None, Mapping[str, str]] ) RequestFiles = Mapping[str, FileTypes] | Sequence[tuple[str, FileTypes]] RequestExtensions = Mapping[str, Any] __all__ = ["AsyncByteStream", "SyncByteStream"] class SyncByteStream: def __iter__(self) -> Iterator[bytes]: raise NotImplementedError("The '__iter__' method must be implemented.") # pragma: no cover yield b"" # pragma: no cover def close(self) -> None: """ Subclasses can override this method to release any network resources after a request/response cycle is complete. """ class AsyncByteStream: async def __aiter__(self) -> AsyncIterator[bytes]: raise NotImplementedError("The '__aiter__' method must be implemented.") # pragma: no cover yield b"" # pragma: no cover async def aclose(self) -> None: pass pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_urlparse.py000066400000000000000000000436231521723372100231200ustar00rootroot00000000000000""" An implementation of `urlparse` that provides URL validation and normalization as described by RFC3986. We rely on this implementation rather than the one in Python's stdlib, because: * It provides more complete URL validation. * It properly differentiates between an empty querystring and an absent querystring, to distinguish URLs with a trailing '?'. * It handles scheme, hostname, port, and path normalization. * It supports IDNA hostnames, normalizing them to their encoded form. * The API supports passing individual components, as well as the complete URL string. Previously we relied on the excellent `rfc3986` package to handle URL parsing and validation, but this module provides a simpler alternative, with less indirection required. """ from __future__ import annotations import ipaddress import re import typing import idna from ._exceptions import InvalidURL MAX_URL_LENGTH = 65536 # https://datatracker.ietf.org/doc/html/rfc3986.html#section-2.3 UNRESERVED_CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~" SUB_DELIMS = "!$&'()*+,;=" PERCENT_ENCODED_REGEX = re.compile("%[A-Fa-f0-9]{2}") # https://url.spec.whatwg.org/#percent-encoded-bytes # The fragment percent-encode set is the C0 control percent-encode set # and U+0020 SPACE, U+0022 ("), U+003C (<), U+003E (>), and U+0060 (`). FRAG_SAFE = "".join([chr(i) for i in range(0x20, 0x7F) if i not in (0x20, 0x22, 0x3C, 0x3E, 0x60)]) # The query percent-encode set is the C0 control percent-encode set # and U+0020 SPACE, U+0022 ("), U+0023 (#), U+003C (<), and U+003E (>). QUERY_SAFE = "".join([chr(i) for i in range(0x20, 0x7F) if i not in (0x20, 0x22, 0x23, 0x3C, 0x3E)]) # The path percent-encode set is the query percent-encode set # and U+003F (?), U+0060 (`), U+007B ({), and U+007D (}). PATH_SAFE = "".join( [chr(i) for i in range(0x20, 0x7F) if i not in (0x20, 0x22, 0x23, 0x3C, 0x3E) + (0x3F, 0x60, 0x7B, 0x7D)] ) # The userinfo percent-encode set is the path percent-encode set # and U+002F (/), U+003A (:), U+003B (;), U+003D (=), U+0040 (@), # U+005B ([) to U+005E (^), inclusive, and U+007C (|). USERNAME_SAFE = "".join( [ chr(i) for i in range(0x20, 0x7F) if i not in (0x20, 0x22, 0x23, 0x3C, 0x3E) + (0x3F, 0x60, 0x7B, 0x7D) + (0x2F, 0x3A, 0x3B, 0x3D, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x7C) ] ) PASSWORD_SAFE = "".join( [ chr(i) for i in range(0x20, 0x7F) if i not in (0x20, 0x22, 0x23, 0x3C, 0x3E) + (0x3F, 0x60, 0x7B, 0x7D) + (0x2F, 0x3A, 0x3B, 0x3D, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x7C) ] ) # Note... The terminology 'userinfo' percent-encode set in the WHATWG document # is used for the username and password quoting. For the joint userinfo component # we remove U+003A (:) from the safe set. USERINFO_SAFE = "".join( [ chr(i) for i in range(0x20, 0x7F) if i not in (0x20, 0x22, 0x23, 0x3C, 0x3E) + (0x3F, 0x60, 0x7B, 0x7D) + (0x2F, 0x3B, 0x3D, 0x40, 0x5B, 0x5C, 0x5D, 0x5E, 0x7C) ] ) # {scheme}: (optional) # //{authority} (optional) # {path} # ?{query} (optional) # #{fragment} (optional) URL_REGEX = re.compile( ( r"(?:(?P{scheme}):)?" r"(?://(?P{authority}))?" r"(?P{path})" r"(?:\?(?P{query}))?" r"(?:#(?P{fragment}))?" ).format( scheme="([a-zA-Z][a-zA-Z0-9+.-]*)?", authority="[^/?#]*", path="[^?#]*", query="[^#]*", fragment=".*", ) ) # {userinfo}@ (optional) # {host} # :{port} (optional) AUTHORITY_REGEX = re.compile( (r"(?:(?P{userinfo})@)?" r"(?P{host})" r":?(?P{port})?").format( userinfo=".*", # Any character sequence. host="(\\[.*\\]|[^:@]*)", # Either any character sequence excluding ':' or '@', # or an IPv6 address enclosed within square brackets. port=".*", # Any character sequence. ) ) # If we call urlparse with an individual component, then we need to regex # validate that component individually. # Note that we're duplicating the same strings as above. Shock! Horror!! COMPONENT_REGEX = { "scheme": re.compile("([a-zA-Z][a-zA-Z0-9+.-]*)?"), "authority": re.compile("[^/?#]*"), "path": re.compile("[^?#]*"), "query": re.compile("[^#]*"), "fragment": re.compile(".*"), "userinfo": re.compile("[^@]*"), "host": re.compile("(\\[.*\\]|[^:]*)"), "port": re.compile(".*"), } # We use these simple regexs as a first pass before handing off to # the stdlib 'ipaddress' module for IP address validation. IPv4_STYLE_HOSTNAME = re.compile(r"^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$") IPv6_STYLE_HOSTNAME = re.compile(r"^\[.*\]$") class ParseResult(typing.NamedTuple): scheme: str userinfo: str host: str port: int | None path: str query: str | None fragment: str | None @property def authority(self) -> str: return "".join( [ f"{self.userinfo}@" if self.userinfo else "", f"[{self.host}]" if ":" in self.host else self.host, f":{self.port}" if self.port is not None else "", ] ) @property def netloc(self) -> str: return "".join( [ f"[{self.host}]" if ":" in self.host else self.host, f":{self.port}" if self.port is not None else "", ] ) def copy_with(self, **kwargs: str | None) -> ParseResult: if not kwargs: return self defaults = { "scheme": self.scheme, "authority": self.authority, "path": self.path, "query": self.query, "fragment": self.fragment, } defaults.update(kwargs) return urlparse("", **defaults) def __str__(self) -> str: authority = self.authority return "".join( [ f"{self.scheme}:" if self.scheme else "", f"//{authority}" if authority else "", self.path, f"?{self.query}" if self.query is not None else "", f"#{self.fragment}" if self.fragment is not None else "", ] ) def urlparse(url: str = "", **kwargs: str | None) -> ParseResult: # Initial basic checks on allowable URLs. # --------------------------------------- # Hard limit the maximum allowable URL length. if len(url) > MAX_URL_LENGTH: raise InvalidURL("URL too long") # If a URL includes any ASCII control characters including \t, \r, \n, # then treat it as invalid. if any(char.isascii() and not char.isprintable() for char in url): char = next(char for char in url if char.isascii() and not char.isprintable()) idx = url.find(char) error = f"Invalid non-printable ASCII character in URL, {char!r} at position {idx}." raise InvalidURL(error) # Some keyword arguments require special handling. # ------------------------------------------------ # Coerce "port" to a string, if it is provided as an integer. if "port" in kwargs: port = kwargs["port"] kwargs["port"] = str(port) if isinstance(port, int) else port # Replace "netloc" with "host and "port". if "netloc" in kwargs: netloc = kwargs.pop("netloc") or "" kwargs["host"], _, kwargs["port"] = netloc.partition(":") # Replace "username" and/or "password" with "userinfo". if "username" in kwargs or "password" in kwargs: username = quote(kwargs.pop("username", "") or "", safe=USERNAME_SAFE) password = quote(kwargs.pop("password", "") or "", safe=PASSWORD_SAFE) kwargs["userinfo"] = f"{username}:{password}" if password else username # Replace "raw_path" with "path" and "query". if "raw_path" in kwargs: raw_path = kwargs.pop("raw_path") or "" kwargs["path"], separator, kwargs["query"] = raw_path.partition("?") if not separator: kwargs["query"] = None # Ensure that IPv6 "host" addresses are always escaped with "[...]". if "host" in kwargs: host = kwargs.get("host") or "" if ":" in host and not (host.startswith("[") and host.endswith("]")): kwargs["host"] = f"[{host}]" # If any keyword arguments are provided, ensure they are valid. # ------------------------------------------------------------- for key, value in kwargs.items(): if value is not None: if len(value) > MAX_URL_LENGTH: raise InvalidURL(f"URL component '{key}' too long") # If a component includes any ASCII control characters including \t, \r, \n, # then treat it as invalid. if any(char.isascii() and not char.isprintable() for char in value): char = next(char for char in value if char.isascii() and not char.isprintable()) idx = value.find(char) error = f"Invalid non-printable ASCII character in URL {key} component, {char!r} at position {idx}." raise InvalidURL(error) # Ensure that keyword arguments match as a valid regex. if not COMPONENT_REGEX[key].fullmatch(value): raise InvalidURL(f"Invalid URL component '{key}'") # The URL_REGEX will always match, but may have empty components. url_match = URL_REGEX.match(url) assert url_match is not None url_dict = url_match.groupdict() # * 'scheme', 'authority', and 'path' may be empty strings. # * 'query' may be 'None', indicating no trailing "?" portion. # Any string including the empty string, indicates a trailing "?". # * 'fragment' may be 'None', indicating no trailing "#" portion. # Any string including the empty string, indicates a trailing "#". scheme = kwargs.get("scheme", url_dict["scheme"]) or "" authority = kwargs.get("authority", url_dict["authority"]) or "" path = kwargs.get("path", url_dict["path"]) or "" query = kwargs.get("query", url_dict["query"]) frag = kwargs.get("fragment", url_dict["fragment"]) # The AUTHORITY_REGEX will always match, but may have empty components. authority_match = AUTHORITY_REGEX.match(authority) assert authority_match is not None authority_dict = authority_match.groupdict() # * 'userinfo' and 'host' may be empty strings. # * 'port' may be 'None'. userinfo = kwargs.get("userinfo", authority_dict["userinfo"]) or "" host = kwargs.get("host", authority_dict["host"]) or "" port = kwargs.get("port", authority_dict["port"]) # Normalize and validate each component. # We end up with a parsed representation of the URL, # with components that are plain ASCII bytestrings. parsed_scheme: str = scheme.lower() parsed_userinfo: str = quote(userinfo, safe=USERINFO_SAFE) parsed_host: str = encode_host(host) parsed_port: int | None = normalize_port(port, scheme) has_scheme = parsed_scheme != "" has_authority = parsed_userinfo != "" or parsed_host != "" or parsed_port is not None validate_path(path, has_scheme=has_scheme, has_authority=has_authority) if has_scheme or has_authority: path = normalize_path(path) parsed_path: str = quote(path, safe=PATH_SAFE) parsed_query: str | None = None if query is None else quote(query, safe=QUERY_SAFE) parsed_frag: str | None = None if frag is None else quote(frag, safe=FRAG_SAFE) # The parsed ASCII bytestrings are our canonical form. # All properties of the URL are derived from these. return ParseResult( parsed_scheme, parsed_userinfo, parsed_host, parsed_port, parsed_path, parsed_query, parsed_frag, ) def encode_host(host: str) -> str: if not host: return "" elif IPv4_STYLE_HOSTNAME.match(host): # Validate IPv4 hostnames like #.#.#.# # # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 # # IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet try: ipaddress.IPv4Address(host) except ipaddress.AddressValueError: raise InvalidURL(f"Invalid IPv4 address: {host!r}") return host elif IPv6_STYLE_HOSTNAME.match(host): # Validate IPv6 hostnames like [...] # # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 # # "A host identified by an Internet Protocol literal address, version 6 # [RFC3513] or later, is distinguished by enclosing the IP literal # within square brackets ("[" and "]"). This is the only place where # square bracket characters are allowed in the URI syntax." try: ipaddress.IPv6Address(host[1:-1]) except ipaddress.AddressValueError: raise InvalidURL(f"Invalid IPv6 address: {host!r}") return host[1:-1] elif host.isascii(): # Regular ASCII hostnames # # From https://datatracker.ietf.org/doc/html/rfc3986/#section-3.2.2 # # reg-name = *( unreserved / pct-encoded / sub-delims ) WHATWG_SAFE = '"`{}%|\\' return quote(host.lower(), safe=SUB_DELIMS + WHATWG_SAFE) # IDNA hostnames try: return idna.encode(host.lower()).decode("ascii") except idna.IDNAError: raise InvalidURL(f"Invalid IDNA hostname: {host!r}") def normalize_port(port: str | int | None, scheme: str) -> int | None: # From https://tools.ietf.org/html/rfc3986#section-3.2.3 # # "A scheme may define a default port. For example, the "http" scheme # defines a default port of "80", corresponding to its reserved TCP # port number. The type of port designated by the port number (e.g., # TCP, UDP, SCTP) is defined by the URI scheme. URI producers and # normalizers should omit the port component and its ":" delimiter if # port is empty or if its value would be the same as that of the # scheme's default." if port is None or port == "": return None try: port_as_int = int(port) except ValueError: raise InvalidURL(f"Invalid port: {port!r}") # See https://url.spec.whatwg.org/#url-miscellaneous default_port = {"ftp": 21, "http": 80, "https": 443, "ws": 80, "wss": 443}.get(scheme) if port_as_int == default_port: return None return port_as_int def validate_path(path: str, has_scheme: bool, has_authority: bool) -> None: """ Path validation rules that depend on if the URL contains a scheme or authority component. See https://datatracker.ietf.org/doc/html/rfc3986.html#section-3.3 """ if has_authority: # If a URI contains an authority component, then the path component # must either be empty or begin with a slash ("/") character." if path and not path.startswith("/"): raise InvalidURL("For absolute URLs, path must be empty or begin with '/'") if not has_scheme and not has_authority: # If a URI does not contain an authority component, then the path cannot begin # with two slash characters ("//"). if path.startswith("//"): raise InvalidURL("Relative URLs cannot have a path starting with '//'") # In addition, a URI reference (Section 4.1) may be a relative-path reference, # in which case the first path segment cannot contain a colon (":") character. if path.startswith(":"): raise InvalidURL("Relative URLs cannot have a path starting with ':'") def normalize_path(path: str) -> str: """ Drop "." and ".." segments from a URL path. For example: normalize_path("/path/./to/somewhere/..") == "/path/to" """ # Fast return when no '.' characters in the path. if "." not in path: return path components = path.split("/") # Fast return when no '.' or '..' components in the path. if "." not in components and ".." not in components: return path # https://datatracker.ietf.org/doc/html/rfc3986#section-5.2.4 output: list[str] = [] for component in components: if component == ".": pass elif component == "..": if output and output != [""]: output.pop() else: output.append(component) return "/".join(output) def PERCENT(string: str) -> str: return "".join([f"%{byte:02X}" for byte in string.encode("utf-8")]) def percent_encoded(string: str, safe: str) -> str: """ Use percent-encoding to quote a string. """ NON_ESCAPED_CHARS = UNRESERVED_CHARACTERS + safe # Fast path for strings that don't need escaping. if not string.rstrip(NON_ESCAPED_CHARS): return string return "".join([char if char in NON_ESCAPED_CHARS else PERCENT(char) for char in string]) def quote(string: str, safe: str) -> str: """ Use percent-encoding to quote a string, omitting existing '%xx' escape sequences. See: https://www.rfc-editor.org/rfc/rfc3986#section-2.1 * `string`: The string to be percent-escaped. * `safe`: A string containing characters that may be treated as safe, and do not need to be escaped. Unreserved characters are always treated as safe. See: https://www.rfc-editor.org/rfc/rfc3986#section-2.3 """ parts: list[str] = [] current_position = 0 for match in re.finditer(PERCENT_ENCODED_REGEX, string): start_position, end_position = match.start(), match.end() matched_text = match.group(0) # Add any text up to the '%xx' escape sequence. if start_position != current_position: leading_text = string[current_position:start_position] parts.append(percent_encoded(leading_text, safe=safe)) # Add the '%xx' escape sequence. parts.append(matched_text) current_position = end_position # Add any text after the final '%xx' escape sequence. if current_position != len(string): trailing_text = string[current_position:] parts.append(percent_encoded(trailing_text, safe=safe)) return "".join(parts) pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_urls.py000066400000000000000000000521321521723372100222430ustar00rootroot00000000000000from __future__ import annotations import sys import typing from urllib.parse import parse_qs, unquote, urlencode import idna if sys.version_info >= (3, 13): from warnings import deprecated # pragma: no cover else: from typing_extensions import deprecated # pragma: no cover from ._exceptions import HTTPXDeprecationWarning from ._types import QueryParamTypes from ._urlparse import urlparse from ._utils import primitive_value_to_str __all__ = ["URL", "QueryParams"] class URL: """ url = httpx2.URL("HTTPS://jo%40email.com:a%20secret@mΓΌller.de:1234/pa%20th?search=ab#anchorlink") assert url.scheme == "https" assert url.username == "jo@email.com" assert url.password == "a secret" assert url.userinfo == b"jo%40email.com:a%20secret" assert url.host == "mΓΌller.de" assert url.raw_host == b"xn--mller-kva.de" assert url.port == 1234 assert url.netloc == b"xn--mller-kva.de:1234" assert url.path == "/pa th" assert url.query == b"?search=ab" assert url.raw_path == b"/pa%20th?search=ab" assert url.fragment == "anchorlink" The components of a URL are broken down like this: https://jo%40email.com:a%20secret@mΓΌller.de:1234/pa%20th?search=ab#anchorlink [scheme] [ username ] [password] [ host ][port][ path ] [ query ] [fragment] [ userinfo ] [ netloc ][ raw_path ] Note that: * `url.scheme` is normalized to always be lowercased. * `url.host` is normalized to always be lowercased. Internationalized domain names are represented in unicode, without IDNA encoding applied. For instance: url = httpx2.URL("http://δΈ­ε›½.icom.museum") assert url.host == "δΈ­ε›½.icom.museum" url = httpx2.URL("http://xn--fiqs8s.icom.museum") assert url.host == "δΈ­ε›½.icom.museum" * `url.raw_host` is normalized to always be lowercased, and is IDNA encoded. url = httpx2.URL("http://δΈ­ε›½.icom.museum") assert url.raw_host == b"xn--fiqs8s.icom.museum" url = httpx2.URL("http://xn--fiqs8s.icom.museum") assert url.raw_host == b"xn--fiqs8s.icom.museum" * `url.port` is either None or an integer. URLs that include the default port for "http", "https", "ws", "wss", and "ftp" schemes have their port normalized to `None`. assert httpx2.URL("http://example.com") == httpx2.URL("http://example.com:80") assert httpx2.URL("http://example.com").port is None assert httpx2.URL("http://example.com:80").port is None * `url.userinfo` is raw bytes, without URL escaping. Usually you'll want to work with `url.username` and `url.password` instead, which handle the URL escaping. * `url.raw_path` is raw bytes of both the path and query, without URL escaping. This portion is used as the target when constructing HTTP requests. Usually you'll want to work with `url.path` instead. * `url.query` is raw bytes, without URL escaping. A URL query string portion can only be properly URL escaped when decoding the parameter names and values themselves. """ def __init__(self, url: URL | str = "", **kwargs: typing.Any) -> None: if kwargs: allowed = { "scheme": str, "username": str, "password": str, "userinfo": bytes, "host": str, "port": int, "netloc": bytes, "path": str, "query": bytes, "raw_path": bytes, "fragment": str, "params": object, } # Perform type checking for all supported keyword arguments. for key, value in kwargs.items(): if key not in allowed: message = f"{key!r} is an invalid keyword argument for URL()" raise TypeError(message) if value is not None and not isinstance(value, allowed[key]): expected = allowed[key].__name__ seen = type(value).__name__ message = f"Argument {key!r} must be {expected} but got {seen}" raise TypeError(message) if isinstance(value, bytes): kwargs[key] = value.decode("ascii") if "params" in kwargs: # Replace any "params" keyword with the raw "query" instead. # # Ensure that empty params use `kwargs["query"] = None` rather # than `kwargs["query"] = ""`, so that generated URLs do not # include an empty trailing "?". params = kwargs.pop("params") kwargs["query"] = None if not params else str(QueryParams(params)) if isinstance(url, str): self._uri_reference = urlparse(url, **kwargs) elif isinstance(url, URL): self._uri_reference = url._uri_reference.copy_with(**kwargs) else: raise TypeError(f"Invalid type for url. Expected str or httpx2.URL, got {type(url)}: {url!r}") @property def scheme(self) -> str: """ The URL scheme, such as "http", "https". Always normalised to lowercase. """ return self._uri_reference.scheme @property def raw_scheme(self) -> bytes: """ The raw bytes representation of the URL scheme, such as b"http", b"https". Always normalised to lowercase. """ return self._uri_reference.scheme.encode("ascii") @property def userinfo(self) -> bytes: """ The URL userinfo as a raw bytestring. For example: b"jo%40email.com:a%20secret". """ return self._uri_reference.userinfo.encode("ascii") @property def username(self) -> str: """ The URL username as a string, with URL decoding applied. For example: "jo@email.com" """ userinfo = self._uri_reference.userinfo return unquote(userinfo.partition(":")[0]) @property def password(self) -> str: """ The URL password as a string, with URL decoding applied. For example: "a secret" """ userinfo = self._uri_reference.userinfo return unquote(userinfo.partition(":")[2]) @property def host(self) -> str: """ The URL host as a string. Always normalized to lowercase, with IDNA hosts decoded into unicode. Examples: url = httpx2.URL("http://www.EXAMPLE.org") assert url.host == "www.example.org" url = httpx2.URL("http://δΈ­ε›½.icom.museum") assert url.host == "δΈ­ε›½.icom.museum" url = httpx2.URL("http://xn--fiqs8s.icom.museum") assert url.host == "δΈ­ε›½.icom.museum" url = httpx2.URL("https://[::ffff:192.168.0.1]") assert url.host == "::ffff:192.168.0.1" """ host: str = self._uri_reference.host if "xn--" in host: host = idna.decode(host, display=True) return host @property def raw_host(self) -> bytes: """ The raw bytes representation of the URL host. Always normalized to lowercase, and IDNA encoded. Examples: url = httpx2.URL("http://www.EXAMPLE.org") assert url.raw_host == b"www.example.org" url = httpx2.URL("http://δΈ­ε›½.icom.museum") assert url.raw_host == b"xn--fiqs8s.icom.museum" url = httpx2.URL("http://xn--fiqs8s.icom.museum") assert url.raw_host == b"xn--fiqs8s.icom.museum" url = httpx2.URL("https://[::ffff:192.168.0.1]") assert url.raw_host == b"::ffff:192.168.0.1" """ return self._uri_reference.host.encode("ascii") @property def port(self) -> int | None: """ The URL port as an integer. Note that the URL class performs port normalization as per the WHATWG spec. Default ports for "http", "https", "ws", "wss", and "ftp" schemes are always treated as `None`. For example: assert httpx2.URL("http://www.example.com") == httpx2.URL("http://www.example.com:80") assert httpx2.URL("http://www.example.com:80").port is None """ return self._uri_reference.port @property def netloc(self) -> bytes: """ Either `` or `:` as bytes. Always normalized to lowercase, and IDNA encoded. This property may be used for generating the value of a request "Host" header. """ return self._uri_reference.netloc.encode("ascii") @property def path(self) -> str: """ The URL path as a string. Excluding the query string, and URL decoded. For example: url = httpx2.URL("https://example.com/pa%20th") assert url.path == "/pa th" """ path = self._uri_reference.path or "/" return unquote(path) @property def query(self) -> bytes: """ The URL query string, as raw bytes, excluding the leading b"?". This is necessarily a bytewise interface, because we cannot perform URL decoding of this representation until we've parsed the keys and values into a QueryParams instance. For example: url = httpx2.URL("https://example.com/?filter=some%20search%20terms") assert url.query == b"filter=some%20search%20terms" """ query = self._uri_reference.query or "" return query.encode("ascii") @property def params(self) -> QueryParams: """ The URL query parameters, neatly parsed and packaged into an immutable multidict representation. """ return QueryParams(self._uri_reference.query) @property def raw_path(self) -> bytes: """ The complete URL path and query string as raw bytes. Used as the target when constructing HTTP requests. For example: GET /users?search=some%20text HTTP/1.1 Host: www.example.org Connection: close """ path = self._uri_reference.path or "/" if self._uri_reference.query is not None: path += "?" + self._uri_reference.query return path.encode("ascii") @property def fragment(self) -> str: """ The URL fragments, as used in HTML anchors. As a string, without the leading '#'. """ return unquote(self._uri_reference.fragment or "") @property def is_absolute_url(self) -> bool: """ Return `True` for absolute URLs such as 'http://example.com/path', and `False` for relative URLs such as '/path'. """ # We don't use `.is_absolute` from `rfc3986` because it treats # URLs with a fragment portion as not absolute. # What we actually care about is if the URL provides # a scheme and hostname to which connections should be made. return bool(self._uri_reference.scheme and self._uri_reference.host) @property def is_relative_url(self) -> bool: """ Return `False` for absolute URLs such as 'http://example.com/path', and `True` for relative URLs such as '/path'. """ return not self.is_absolute_url def copy_with(self, **kwargs: typing.Any) -> URL: """ Copy this URL, returning a new URL with some components altered. Accepts the same set of parameters as the components that are made available via properties on the `URL` class. For example: url = httpx2.URL("https://www.example.com").copy_with( username="jo@gmail.com", password="a secret" ) assert url == "https://jo%40email.com:a%20secret@www.example.com" """ return URL(self, **kwargs) def copy_set_param(self, key: str, value: typing.Any = None) -> URL: return self.copy_with(params=self.params.set(key, value)) def copy_add_param(self, key: str, value: typing.Any = None) -> URL: return self.copy_with(params=self.params.add(key, value)) def copy_remove_param(self, key: str) -> URL: return self.copy_with(params=self.params.remove(key)) def copy_merge_params(self, params: QueryParamTypes) -> URL: return self.copy_with(params=self.params.merge(params)) def join(self, url: URL | str) -> URL: """ Return an absolute URL, using this URL as the base. Eg. url = httpx2.URL("https://www.example.com/test") url = url.join("/new/path") assert url == "https://www.example.com/new/path" """ from urllib.parse import urljoin return URL(urljoin(str(self), str(URL(url)))) def __hash__(self) -> int: return hash(str(self)) def __eq__(self, other: typing.Any) -> bool: return isinstance(other, (URL, str)) and str(self) == str(URL(other)) def __str__(self) -> str: return str(self._uri_reference) def __repr__(self) -> str: scheme, userinfo, host, port, path, query, fragment = self._uri_reference if ":" in userinfo: # Mask any password component. userinfo = f"{userinfo.split(':')[0]}:[secure]" authority = "".join( [ f"{userinfo}@" if userinfo else "", f"[{host}]" if ":" in host else host, f":{port}" if port is not None else "", ] ) url = "".join( [ f"{self.scheme}:" if scheme else "", f"//{authority}" if authority else "", path, f"?{query}" if query is not None else "", f"#{fragment}" if fragment is not None else "", ] ) return f"{self.__class__.__name__}({url!r})" @property @deprecated("URL.raw is deprecated.", category=HTTPXDeprecationWarning) def raw(self) -> tuple[bytes, bytes, int, bytes]: # pragma: no cover import collections RawURL = collections.namedtuple("RawURL", ["raw_scheme", "raw_host", "port", "raw_path"]) return RawURL( raw_scheme=self.raw_scheme, raw_host=self.raw_host, port=self.port, raw_path=self.raw_path, ) class QueryParams(typing.Mapping[str, str]): """ URL query parameters, as a multi-dict. """ def __init__(self, *args: QueryParamTypes | None, **kwargs: typing.Any) -> None: assert len(args) < 2, "Too many arguments." assert not (args and kwargs), "Cannot mix named and unnamed arguments." value = args[0] if args else kwargs if value is None or isinstance(value, (str, bytes)): value = value.decode("ascii") if isinstance(value, bytes) else value self._dict = parse_qs(value, keep_blank_values=True) elif isinstance(value, QueryParams): self._dict = {k: list(v) for k, v in value._dict.items()} else: dict_value: dict[typing.Any, list[typing.Any]] = {} if isinstance(value, (list, tuple)): # Convert list inputs like: # [("a", "123"), ("a", "456"), ("b", "789")] # To a dict representation, like: # {"a": ["123", "456"], "b": ["789"]} for item in value: dict_value.setdefault(item[0], []).append(item[1]) else: # Convert dict inputs like: # {"a": "123", "b": ["456", "789"]} # To dict inputs where values are always lists, like: # {"a": ["123"], "b": ["456", "789"]} dict_value = {k: list(v) if isinstance(v, (list, tuple)) else [v] for k, v in value.items()} # Ensure that keys and values are neatly coerced to strings. # We coerce values `True` and `False` to JSON-like "true" and "false" # representations, and coerce `None` values to the empty string. self._dict = {str(k): [primitive_value_to_str(item) for item in v] for k, v in dict_value.items()} def keys(self) -> typing.KeysView[str]: """ Return all the keys in the query params. Usage: q = httpx2.QueryParams("a=123&a=456&b=789") assert list(q.keys()) == ["a", "b"] """ return self._dict.keys() def values(self) -> typing.ValuesView[str]: """ Return all the values in the query params. If a key occurs more than once only the first item for that key is returned. Usage: q = httpx2.QueryParams("a=123&a=456&b=789") assert list(q.values()) == ["123", "789"] """ return {k: v[0] for k, v in self._dict.items()}.values() def items(self) -> typing.ItemsView[str, str]: """ Return all items in the query params. If a key occurs more than once only the first item for that key is returned. Usage: q = httpx2.QueryParams("a=123&a=456&b=789") assert list(q.items()) == [("a", "123"), ("b", "789")] """ return {k: v[0] for k, v in self._dict.items()}.items() def multi_items(self) -> list[tuple[str, str]]: """ Return all items in the query params. Allow duplicate keys to occur. Usage: q = httpx2.QueryParams("a=123&a=456&b=789") assert list(q.multi_items()) == [("a", "123"), ("a", "456"), ("b", "789")] """ multi_items: list[tuple[str, str]] = [] for k, v in self._dict.items(): multi_items.extend([(k, i) for i in v]) return multi_items def get(self, key: typing.Any, default: typing.Any = None) -> typing.Any: """ Get a value from the query param for a given key. If the key occurs more than once, then only the first value is returned. Usage: q = httpx2.QueryParams("a=123&a=456&b=789") assert q.get("a") == "123" """ if key in self._dict: return self._dict[str(key)][0] return default def get_list(self, key: str) -> list[str]: """ Get all values from the query param for a given key. Usage: q = httpx2.QueryParams("a=123&a=456&b=789") assert q.get_list("a") == ["123", "456"] """ return list(self._dict.get(str(key), [])) def set(self, key: str, value: typing.Any = None) -> QueryParams: """ Return a new QueryParams instance, setting the value of a key. Usage: q = httpx2.QueryParams("a=123") q = q.set("a", "456") assert q == httpx2.QueryParams("a=456") """ q = QueryParams() q._dict = dict(self._dict) q._dict[str(key)] = [primitive_value_to_str(value)] return q def add(self, key: str, value: typing.Any = None) -> QueryParams: """ Return a new QueryParams instance, setting or appending the value of a key. Usage: q = httpx2.QueryParams("a=123") q = q.add("a", "456") assert q == httpx2.QueryParams("a=123&a=456") """ q = QueryParams() q._dict = dict(self._dict) q._dict[str(key)] = q.get_list(key) + [primitive_value_to_str(value)] return q def remove(self, key: str) -> QueryParams: """ Return a new QueryParams instance, removing the value of a key. Usage: q = httpx2.QueryParams("a=123") q = q.remove("a") assert q == httpx2.QueryParams("") """ q = QueryParams() q._dict = dict(self._dict) q._dict.pop(str(key), None) return q def merge(self, params: QueryParamTypes | None = None) -> QueryParams: """ Return a new QueryParams instance, updated with. Usage: q = httpx2.QueryParams("a=123") q = q.merge({"b": "456"}) assert q == httpx2.QueryParams("a=123&b=456") q = httpx2.QueryParams("a=123") q = q.merge({"a": "456", "b": "789"}) assert q == httpx2.QueryParams("a=456&b=789") """ q = QueryParams(params) q._dict = {**self._dict, **q._dict} return q def __getitem__(self, key: typing.Any) -> str: return self._dict[key][0] def __contains__(self, key: typing.Any) -> bool: return key in self._dict def __iter__(self) -> typing.Iterator[typing.Any]: return iter(self.keys()) def __len__(self) -> int: return len(self._dict) def __bool__(self) -> bool: return bool(self._dict) def __hash__(self) -> int: return hash(str(self)) def __eq__(self, other: typing.Any) -> bool: if not isinstance(other, self.__class__): return False return sorted(self.multi_items()) == sorted(other.multi_items()) def __str__(self) -> str: return urlencode(self.multi_items()) def __repr__(self) -> str: class_name = self.__class__.__name__ query_string = str(self) return f"{class_name}({query_string!r})" def update(self, params: QueryParamTypes | None = None) -> None: raise RuntimeError("QueryParams are immutable since 0.18.0. Use `q = q.merge(...)` to create an updated copy.") def __setitem__(self, key: str, value: str) -> None: raise RuntimeError( "QueryParams are immutable since 0.18.0. Use `q = q.set(key, value)` to create an updated copy." ) pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/_utils.py000066400000000000000000000201321521723372100224110ustar00rootroot00000000000000from __future__ import annotations import ipaddress import os import re import typing from urllib.request import getproxies from ._types import PrimitiveData if typing.TYPE_CHECKING: from ._urls import URL def primitive_value_to_str(value: PrimitiveData) -> str: """ Coerce a primitive data type into a string value. Note that we prefer JSON-style 'true'/'false' for boolean values here. """ if value is True: return "true" elif value is False: return "false" elif value is None: return "" return str(value) def get_environment_proxies() -> dict[str, str | None]: """Gets proxy information from the environment""" # urllib.request.getproxies() falls back on System # Registry and Config for proxies on Windows and macOS. # We don't want to propagate non-HTTP proxies into # our configuration such as 'TRAVIS_APT_PROXY'. proxy_info = getproxies() mounts: dict[str, str | None] = {} for scheme in ("http", "https", "all"): if proxy_info.get(scheme): hostname = proxy_info[scheme] mounts[f"{scheme}://"] = hostname if "://" in hostname else f"http://{hostname}" no_proxy_hosts = [host.strip() for host in proxy_info.get("no", "").split(",")] for hostname in no_proxy_hosts: # See https://curl.haxx.se/libcurl/c/CURLOPT_NOPROXY.html for details # on how names in `NO_PROXY` are handled. if hostname == "*": # If NO_PROXY=* is used or if "*" occurs as any one of the comma # separated hostnames, then we should just bypass any information # from HTTP_PROXY, HTTPS_PROXY, ALL_PROXY, and always ignore # proxies. return {} elif hostname: # NO_PROXY=.google.com is marked as "all://*.google.com, # which disables "www.google.com" but not "google.com" # NO_PROXY=google.com is marked as "all://*google.com, # which disables "www.google.com" and "google.com". # (But not "wwwgoogle.com") # NO_PROXY can include domains, IPv6, IPv4 addresses and "localhost" # NO_PROXY=example.com,::1,localhost,192.168.0.0/16 if "://" in hostname: mounts[hostname] = None elif is_ipv4_hostname(hostname): mounts[f"all://{hostname}"] = None elif is_ipv6_hostname(hostname): if "/" in hostname: addr, _, subnet = hostname.partition("/") mounts[f"all://[{addr}]/{subnet}"] = None else: mounts[f"all://[{hostname}]"] = None elif hostname.lower() == "localhost": mounts[f"all://{hostname}"] = None else: mounts[f"all://*{hostname}"] = None return mounts def to_bytes(value: str | bytes, encoding: str = "utf-8") -> bytes: return value.encode(encoding) if isinstance(value, str) else value def to_str(value: str | bytes, encoding: str = "utf-8") -> str: return value if isinstance(value, str) else value.decode(encoding) def to_bytes_or_str(value: str, match_type_of: typing.AnyStr) -> typing.AnyStr: return value if isinstance(match_type_of, str) else value.encode() def peek_filelike_length(stream: typing.Any) -> int | None: """ Given a file-like stream object, return its length in number of bytes without reading it into memory. """ try: # Is it an actual file? fd = stream.fileno() # Yup, seems to be an actual file. length = os.fstat(fd).st_size except (AttributeError, OSError): # No... Maybe it's something that supports random access, like `io.BytesIO`? try: # Assuming so, go to end of stream to figure out its length, # then put it back in place. offset = stream.tell() length = stream.seek(0, os.SEEK_END) stream.seek(offset) except (AttributeError, OSError): # Not even that? Sorry, we're doomed... return None return length class URLPattern: """ A utility class currently used for making lookups against proxy keys... # Wildcard matching... >>> pattern = URLPattern("all://") >>> pattern.matches(httpx2.URL("http://example.com")) True # Witch scheme matching... >>> pattern = URLPattern("https://") >>> pattern.matches(httpx2.URL("https://example.com")) True >>> pattern.matches(httpx2.URL("http://example.com")) False # With domain matching... >>> pattern = URLPattern("https://example.com") >>> pattern.matches(httpx2.URL("https://example.com")) True >>> pattern.matches(httpx2.URL("http://example.com")) False >>> pattern.matches(httpx2.URL("https://other.com")) False # Wildcard scheme, with domain matching... >>> pattern = URLPattern("all://example.com") >>> pattern.matches(httpx2.URL("https://example.com")) True >>> pattern.matches(httpx2.URL("http://example.com")) True >>> pattern.matches(httpx2.URL("https://other.com")) False # With port matching... >>> pattern = URLPattern("https://example.com:1234") >>> pattern.matches(httpx2.URL("https://example.com:1234")) True >>> pattern.matches(httpx2.URL("https://example.com")) False """ def __init__(self, pattern: str) -> None: from ._urls import URL if pattern and ":" not in pattern: raise ValueError( f"Proxy keys should use proper URL forms rather " f"than plain scheme strings. " f'Instead of "{pattern}", use "{pattern}://"' ) url = URL(pattern) self.pattern = pattern self.scheme = "" if url.scheme == "all" else url.scheme self.host = "" if url.host == "*" else url.host self.port = url.port if not url.host or url.host == "*": self.host_regex: typing.Pattern[str] | None = None elif url.host.startswith("*."): # *.example.com should match "www.example.com", but not "example.com" domain = re.escape(url.host[2:]) self.host_regex = re.compile(f"^.+\\.{domain}$") elif url.host.startswith("*"): # *example.com should match "www.example.com" and "example.com" domain = re.escape(url.host[1:]) self.host_regex = re.compile(f"^(.+\\.)?{domain}$") else: # example.com should match "example.com" but not "www.example.com" domain = re.escape(url.host) self.host_regex = re.compile(f"^{domain}$") def matches(self, other: URL) -> bool: if self.scheme and self.scheme != other.scheme: return False if self.host and self.host_regex is not None and not self.host_regex.match(other.host): return False if self.port is not None and self.port != other.port: return False return True @property def priority(self) -> tuple[int, int, int]: """ The priority allows URLPattern instances to be sortable, so that we can match from most specific to least specific. """ # URLs with a port should take priority over URLs without a port. port_priority = 0 if self.port is not None else 1 # Longer hostnames should match first. host_priority = -len(self.host) # Longer schemes should match first. scheme_priority = -len(self.scheme) return (port_priority, host_priority, scheme_priority) def __hash__(self) -> int: return hash(self.pattern) def __lt__(self, other: URLPattern) -> bool: return self.priority < other.priority def __eq__(self, other: typing.Any) -> bool: return isinstance(other, URLPattern) and self.pattern == other.pattern def is_ipv4_hostname(hostname: str) -> bool: try: ipaddress.IPv4Address(hostname.split("/")[0]) except Exception: return False return True def is_ipv6_hostname(hostname: str) -> bool: try: ipaddress.IPv6Address(hostname.split("/")[0]) except Exception: return False return True pydantic-httpx2-9b7ee8e/src/httpx2/httpx2/py.typed000066400000000000000000000000001521723372100222270ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/src/httpx2/pyproject.toml000066400000000000000000000060651521723372100222340ustar00rootroot00000000000000[build-system] requires = ["hatchling", "hatch-fancy-pypi-readme", "uv-dynamic-versioning>=0.8.0"] build-backend = "hatchling.build" [tool.hatch.version] source = "uv-dynamic-versioning" [tool.uv-dynamic-versioning] vcs = "git" style = "pep440" bump = true fallback-version = "0.0.0" [project] name = "httpx2" description = "The next generation HTTP client." license = "BSD-3-Clause" requires-python = ">=3.10" authors = [ { name = "Tom Christie", email = "tom@tomchristie.com" }, ] maintainers = [ { name = "Pydantic Services Inc.", email = "engineering@pydantic.dev" } ] classifiers = [ "Development Status :: 5 - Production/Stable", "Environment :: Web Environment", "Framework :: AnyIO", "Framework :: AsyncIO", "Framework :: Trio", "Intended Audience :: Developers", "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: 3.13", "Programming Language :: Python :: 3.14", "Topic :: Internet :: WWW/HTTP", ] dynamic = ["readme", "version", "dependencies"] [tool.hatch.metadata.hooks.uv-dynamic-versioning] dependencies = [ "truststore>=0.10", "httpcore2=={{ version }}", "anyio", "idna>=3.18", "typing_extensions>=4.5.0; python_version < '3.13'", ] [project.optional-dependencies] brotli = [ "brotli; platform_python_implementation == 'CPython'", "brotlicffi; platform_python_implementation != 'CPython'", ] cli = [ "click==8.*", "pygments==2.*", "rich>=10,<16", ] http2 = [ "h2>=3,<5", ] socks = [ "socksio==1.*", ] # TODO(Marcelo): Remove when Python 3.13 reaches EOL. zstd = [ "zstandard>=0.18.0; python_version <= '3.13'", ] [project.scripts] httpx2 = "httpx2._main:main" [project.urls] Changelog = "https://github.com/pydantic/httpx2/blob/main/src/httpx2/CHANGELOG.md" Homepage = "https://github.com/pydantic/httpx2" Source = "https://github.com/pydantic/httpx2" [tool.hatch.build.targets.sdist] include = ["/httpx2", "/CHANGELOG.md"] [tool.hatch.build.targets.sdist.force-include] "../../README.md" = "README.md" "../../LICENSE.md" = "LICENSE.md" [tool.hatch.build.targets.wheel] packages = ["httpx2"] [tool.hatch.metadata.hooks.fancy-pypi-readme] content-type = "text/markdown" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] path = "../../README.md" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] text = "\n## Release Information\n\n" [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] path = "CHANGELOG.md" pattern = "\n(###.+?\n)## " [[tool.hatch.metadata.hooks.fancy-pypi-readme.fragments]] text = "\n---\n\n[Full changelog](https://github.com/pydantic/httpx2/blob/main/src/httpx2/CHANGELOG.md)\n" [[tool.hatch.metadata.hooks.fancy-pypi-readme.substitutions]] pattern = 'src="(docs/img/.*?)"' replacement = 'src="https://raw.githubusercontent.com/pydantic/httpx2/main/\1"' pydantic-httpx2-9b7ee8e/tests/000077500000000000000000000000001521723372100164335ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/__init__.py000066400000000000000000000000001521723372100205320ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpcore2/000077500000000000000000000000001521723372100203455ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpcore2/__init__.py000066400000000000000000000000001521723372100224440ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpcore2/_async/000077500000000000000000000000001521723372100216215ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpcore2/_async/__init__.py000066400000000000000000000000001521723372100237200ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpcore2/_async/test_connection.py000066400000000000000000000300231521723372100253670ustar00rootroot00000000000000import ssl import typing import hpack import hyperframe.frame import pytest from httpcore2 import ( SOCKET_OPTION, AsyncHTTPConnection, AsyncMockBackend, AsyncMockStream, AsyncNetworkStream, ConnectError, ConnectionNotAvailable, Origin, RemoteProtocolError, WriteError, ) @pytest.mark.anyio async def test_http_connection() -> None: origin = Origin(b"https", b"example.com", 443) network_backend = AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with AsyncHTTPConnection(origin=origin, network_backend=network_backend, keepalive_expiry=5.0) as conn: assert not conn.is_idle() assert not conn.is_closed() assert not conn.is_available() assert not conn.has_expired() assert repr(conn) == "" async with conn.stream("GET", "https://example.com/") as response: assert repr(conn) == "" await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" assert conn.is_idle() assert not conn.is_closed() assert conn.is_available() assert not conn.has_expired() assert repr(conn) == "" @pytest.mark.anyio async def test_concurrent_requests_not_available_on_http11_connections() -> None: """ Attempting to issue a request against an already active HTTP/1.1 connection will raise a `ConnectionNotAvailable` exception. """ origin = Origin(b"https", b"example.com", 443) network_backend = AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with AsyncHTTPConnection(origin=origin, network_backend=network_backend, keepalive_expiry=5.0) as conn: async with conn.stream("GET", "https://example.com/"): with pytest.raises(ConnectionNotAvailable): await conn.request("GET", "https://example.com/") @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") @pytest.mark.anyio async def test_write_error_with_response_sent() -> None: """ If a server half-closes the connection while the client is sending the request, it may still send a response. In this case the client should successfully read and return the response. See also the `test_write_error_without_response_sent` test above. """ class ErrorOnRequestTooLargeStream(AsyncMockStream): def __init__(self, buffer: list[bytes], http2: bool = False) -> None: super().__init__(buffer, http2) self.count = 0 async def write(self, buffer: bytes, timeout: float | None = None) -> None: self.count += len(buffer) if self.count > 1_000_000: raise WriteError() class ErrorOnRequestTooLarge(AsyncMockBackend): async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncMockStream: return ErrorOnRequestTooLargeStream(list(self._buffer), http2=self._http2) origin = Origin(b"https", b"example.com", 443) network_backend = ErrorOnRequestTooLarge( [ b"HTTP/1.1 413 Payload Too Large\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 37\r\n", b"\r\n", b"Request body exceeded 1,000,000 bytes", ] ) async with AsyncHTTPConnection(origin=origin, network_backend=network_backend, keepalive_expiry=5.0) as conn: content = b"x" * 10_000_000 response = await conn.request("POST", "https://example.com/", content=content) assert response.status == 413 assert response.content == b"Request body exceeded 1,000,000 bytes" @pytest.mark.anyio @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") async def test_write_error_without_response_sent() -> None: """ If a server fully closes the connection while the client is sending the request, then client should raise an error. See also the `test_write_error_with_response_sent` test above. """ class ErrorOnRequestTooLargeStream(AsyncMockStream): def __init__(self, buffer: list[bytes], http2: bool = False) -> None: super().__init__(buffer, http2) self.count = 0 async def write(self, buffer: bytes, timeout: float | None = None) -> None: self.count += len(buffer) if self.count > 1_000_000: raise WriteError() class ErrorOnRequestTooLarge(AsyncMockBackend): async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncMockStream: return ErrorOnRequestTooLargeStream(list(self._buffer), http2=self._http2) origin = Origin(b"https", b"example.com", 443) network_backend = ErrorOnRequestTooLarge([]) async with AsyncHTTPConnection(origin=origin, network_backend=network_backend, keepalive_expiry=5.0) as conn: content = b"x" * 10_000_000 with pytest.raises(RemoteProtocolError) as exc_info: await conn.request("POST", "https://example.com/", content=content) assert str(exc_info.value) == "Server disconnected without sending a response." @pytest.mark.anyio @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") async def test_http2_connection() -> None: origin = Origin(b"https", b"example.com", 443) network_backend = AsyncMockBackend( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ], http2=True, ) async with AsyncHTTPConnection(origin=origin, network_backend=network_backend, http2=True) as conn: response = await conn.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" assert response.extensions["http_version"] == b"HTTP/2" @pytest.mark.anyio async def test_request_to_incorrect_origin() -> None: """ A connection can only send requests whichever origin it is connected to. """ origin = Origin(b"https", b"example.com", 443) network_backend = AsyncMockBackend([]) async with AsyncHTTPConnection(origin=origin, network_backend=network_backend) as conn: with pytest.raises(RuntimeError): await conn.request("GET", "https://other.com/") class NeedsRetryBackend(AsyncMockBackend): def __init__( self, buffer: list[bytes], http2: bool = False, connect_tcp_failures: int = 2, start_tls_failures: int = 0, ) -> None: self._connect_tcp_failures = connect_tcp_failures self._start_tls_failures = start_tls_failures super().__init__(buffer, http2) async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: if self._connect_tcp_failures > 0: self._connect_tcp_failures -= 1 raise ConnectError() stream = await super().connect_tcp(host, port, timeout=timeout, local_address=local_address) return self._NeedsRetryAsyncNetworkStream(self, stream) class _NeedsRetryAsyncNetworkStream(AsyncNetworkStream): def __init__(self, backend: "NeedsRetryBackend", stream: AsyncNetworkStream) -> None: self._backend = backend self._stream = stream async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: return await self._stream.read(max_bytes, timeout) async def write(self, buffer: bytes, timeout: float | None = None) -> None: await self._stream.write(buffer, timeout) async def aclose(self) -> None: await self._stream.aclose() async def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> "AsyncNetworkStream": if self._backend._start_tls_failures > 0: self._backend._start_tls_failures -= 1 raise ConnectError() stream = await self._stream.start_tls(ssl_context, server_hostname, timeout) return self._backend._NeedsRetryAsyncNetworkStream(self._backend, stream) def get_extra_info(self, info: str) -> typing.Any: return self._stream.get_extra_info(info) @pytest.mark.anyio async def test_connection_retries() -> None: origin = Origin(b"https", b"example.com", 443) content = [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] network_backend = NeedsRetryBackend(content) async with AsyncHTTPConnection(origin=origin, network_backend=network_backend, retries=3) as conn: response = await conn.request("GET", "https://example.com/") assert response.status == 200 network_backend = NeedsRetryBackend(content) async with AsyncHTTPConnection( origin=origin, network_backend=network_backend, ) as conn: with pytest.raises(ConnectError): await conn.request("GET", "https://example.com/") @pytest.mark.anyio async def test_connection_retries_tls() -> None: origin = Origin(b"https", b"example.com", 443) content = [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] network_backend = NeedsRetryBackend(content, connect_tcp_failures=0, start_tls_failures=2) async with AsyncHTTPConnection(origin=origin, network_backend=network_backend, retries=3) as conn: response = await conn.request("GET", "https://example.com/") assert response.status == 200 network_backend = NeedsRetryBackend(content, connect_tcp_failures=0, start_tls_failures=2) async with AsyncHTTPConnection( origin=origin, network_backend=network_backend, ) as conn: with pytest.raises(ConnectError): await conn.request("GET", "https://example.com/") @pytest.mark.anyio async def test_uds_connections() -> None: # We're not actually testing Unix Domain Sockets here, because we're just # using a mock backend, but at least we're covering the UDS codepath # in `connection.py` which we may as well do. origin = Origin(b"https", b"example.com", 443) network_backend = AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with AsyncHTTPConnection(origin=origin, network_backend=network_backend, uds="/mock/example") as conn: response = await conn.request("GET", "https://example.com/") assert response.status == 200 pydantic-httpx2-9b7ee8e/tests/httpcore2/_async/test_connection_pool.py000066400000000000000000000753401521723372100264330ustar00rootroot00000000000000import logging import typing import hpack import hyperframe.frame import pytest import trio as concurrency import httpcore2 @pytest.mark.anyio async def test_connection_pool_with_keepalive() -> None: """ By default HTTP/1.1 requests should be returned to the connection pool. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncConnectionPool(network_backend=network_backend, max_keepalive_connections=1) as pool: # Sending an initial request, which once complete will return to the pool, IDLE. async with pool.stream("GET", "https://example.com/") as response: info = [repr(c) for c in pool.connections] assert info == [""] assert repr(pool) == "" await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [""] assert repr(pool) == "" # Sending a second request to the same origin will reuse the existing IDLE connection. async with pool.stream("GET", "https://example.com/") as response: info = [repr(c) for c in pool.connections] assert info == [""] assert repr(pool) == "" await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [""] assert repr(pool) == "" # Sending a request to a different origin will not reuse the existing IDLE connection. async with ( pool.stream("GET", "http://example.com/") as response_1, pool.stream("GET", "http://example.com/") as response_2, ): info = [repr(c) for c in pool.connections] assert info == [ "", "", "", ] assert repr(pool) == "" await response_1.aread() await response_2.aread() assert response_1.status == 200 assert response_1.content == b"Hello, world!" assert response_2.status == 200 assert response_2.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [ "", ] assert repr(pool) == "" @pytest.mark.anyio async def test_connection_pool_with_close() -> None: """ HTTP/1.1 requests that include a 'Connection: Close' header should not be returned to the connection pool. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncConnectionPool(network_backend=network_backend) as pool: # Sending an initial request, which once complete will not return to the pool. async with pool.stream("GET", "https://example.com/", headers={"Connection": "close"}) as response: info = [repr(c) for c in pool.connections] assert info == [""] await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [] @pytest.mark.anyio async def test_connection_pool_with_http2() -> None: """ Test a connection pool with HTTP/2 requests. """ network_backend = httpcore2.AsyncMockBackend( buffer=[ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), hyperframe.frame.HeadersFrame( stream_id=3, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=3, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ], http2=True, ) async with httpcore2.AsyncConnectionPool( network_backend=network_backend, ) as pool: # Sending an initial request, which once complete will return to the pool, IDLE. response = await pool.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [""] # Sending a second request to the same origin will reuse the existing IDLE connection. response = await pool.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [""] @pytest.mark.anyio async def test_connection_pool_with_http2_goaway() -> None: """ Test a connection pool with HTTP/2 requests, that cleanly disconnects with a GoAway frame after the first request. """ network_backend = httpcore2.AsyncMockBackend( buffer=[ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), hyperframe.frame.GoAwayFrame(stream_id=0, error_code=0, last_stream_id=1).serialize(), b"", ], http2=True, ) async with httpcore2.AsyncConnectionPool( network_backend=network_backend, ) as pool: # Sending an initial request, which once complete will return to the pool, IDLE. response = await pool.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [""] # Sending a second request to the same origin will require a new connection. # The original connection has now been closed. response = await pool.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [ "", ] @pytest.mark.anyio async def test_trace_request() -> None: """ The 'trace' request extension allows for a callback function to inspect the internal events that occur while sending a request. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) called: list[str] = [] async def trace(name: str, kwargs: dict[str, typing.Any]) -> None: called.append(name) async with httpcore2.AsyncConnectionPool(network_backend=network_backend) as pool: await pool.request("GET", "https://example.com/", extensions={"trace": trace}) assert called == [ "connection.connect_tcp.started", "connection.connect_tcp.complete", "connection.start_tls.started", "connection.start_tls.complete", "http11.send_request_headers.started", "http11.send_request_headers.complete", "http11.send_request_body.started", "http11.send_request_body.complete", "http11.receive_response_headers.started", "http11.receive_response_headers.complete", "http11.receive_response_body.started", "http11.receive_response_body.complete", "http11.response_closed.started", "http11.response_closed.complete", ] @pytest.mark.anyio async def test_debug_request(caplog: pytest.LogCaptureFixture) -> None: """ The 'trace' request extension allows for a callback function to inspect the internal events that occur while sending a request. """ caplog.set_level(logging.DEBUG) network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncConnectionPool(network_backend=network_backend) as pool: await pool.request("GET", "http://example.com/") assert caplog.record_tuples == [ ( "httpcore2.connection", logging.DEBUG, "connect_tcp.started host='example.com' port=80 local_address=None timeout=None socket_options=None", ), ( "httpcore2.connection", logging.DEBUG, "connect_tcp.complete return_value=", ), ( "httpcore2.http11", logging.DEBUG, "send_request_headers.started request=", ), ("httpcore2.http11", logging.DEBUG, "send_request_headers.complete"), ( "httpcore2.http11", logging.DEBUG, "send_request_body.started request=", ), ("httpcore2.http11", logging.DEBUG, "send_request_body.complete"), ( "httpcore2.http11", logging.DEBUG, "receive_response_headers.started request=", ), ( "httpcore2.http11", logging.DEBUG, "receive_response_headers.complete return_value=" "(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'plain/text'), (b'Content-Length', b'13')])", ), ( "httpcore2.http11", logging.DEBUG, "receive_response_body.started request=", ), ("httpcore2.http11", logging.DEBUG, "receive_response_body.complete"), ("httpcore2.http11", logging.DEBUG, "response_closed.started"), ("httpcore2.http11", logging.DEBUG, "response_closed.complete"), ("httpcore2.connection", logging.DEBUG, "close.started"), ("httpcore2.connection", logging.DEBUG, "close.complete"), ] @pytest.mark.anyio async def test_connection_pool_with_http_exception() -> None: """ HTTP/1.1 requests that result in an exception during the connection should not be returned to the connection pool. """ network_backend = httpcore2.AsyncMockBackend([b"Wait, this isn't valid HTTP!"]) called: list[str] = [] async def trace(name: str, kwargs: dict[str, typing.Any]) -> None: called.append(name) async with httpcore2.AsyncConnectionPool(network_backend=network_backend) as pool: # Sending an initial request, which once complete will not return to the pool. with pytest.raises(httpcore2.RemoteProtocolError): await pool.request("GET", "https://example.com/", extensions={"trace": trace}) info = [repr(c) for c in pool.connections] assert info == [] assert called == [ "connection.connect_tcp.started", "connection.connect_tcp.complete", "connection.start_tls.started", "connection.start_tls.complete", "http11.send_request_headers.started", "http11.send_request_headers.complete", "http11.send_request_body.started", "http11.send_request_body.complete", "http11.receive_response_headers.started", "http11.receive_response_headers.failed", "http11.response_closed.started", "http11.response_closed.complete", ] @pytest.mark.anyio async def test_connection_pool_with_connect_exception() -> None: """ HTTP/1.1 requests that result in an exception during connection should not be returned to the connection pool. """ class FailedConnectBackend(httpcore2.AsyncMockBackend): async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[httpcore2.SOCKET_OPTION] | None = None, ) -> httpcore2.AsyncNetworkStream: raise httpcore2.ConnectError("Could not connect") network_backend = FailedConnectBackend([]) called: list[str] = [] async def trace(name: str, kwargs: dict[str, typing.Any]) -> None: called.append(name) async with httpcore2.AsyncConnectionPool(network_backend=network_backend) as pool: # Sending an initial request, which once complete will not return to the pool. with pytest.raises(httpcore2.ConnectError): await pool.request("GET", "https://example.com/", extensions={"trace": trace}) info = [repr(c) for c in pool.connections] assert info == [] assert called == [ "connection.connect_tcp.started", "connection.connect_tcp.failed", ] @pytest.mark.anyio async def test_connection_pool_with_immediate_expiry() -> None: """ Connection pools with keepalive_expiry=0.0 should immediately expire keep alive connections. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncConnectionPool( keepalive_expiry=0.0, network_backend=network_backend, ) as pool: # Sending an initial request, which once complete will not return to the pool. async with pool.stream("GET", "https://example.com/") as response: info = [repr(c) for c in pool.connections] assert info == [""] await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [] @pytest.mark.anyio async def test_connection_pool_with_no_keepalive_connections_allowed() -> None: """ When 'max_keepalive_connections=0' is used, IDLE connections should not be returned to the pool. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncConnectionPool(max_keepalive_connections=0, network_backend=network_backend) as pool: # Sending an initial request, which once complete will not return to the pool. async with pool.stream("GET", "https://example.com/") as response: info = [repr(c) for c in pool.connections] assert info == [""] await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [] @pytest.mark.anyio async def test_connection_pool_closes_idle_connection_for_different_origin() -> None: """ When the pool is at 'max_connections' and an incoming request is for an origin with no reusable connection, an IDLE connection to a different origin is closed to make room for the new connection. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncConnectionPool(network_backend=network_backend, max_connections=1) as pool: # An initial request to a.com leaves a single IDLE connection in the pool. response = await pool.request("GET", "https://a.com/") assert response.status == 200 info = [repr(c) for c in pool.connections] assert info == [""] # A request to b.com cannot reuse the a.com connection and the pool is full, # so the IDLE a.com connection is closed and replaced with a b.com connection. response = await pool.request("GET", "https://b.com/") assert response.status == 200 info = [repr(c) for c in pool.connections] assert info == [""] @pytest.mark.trio async def test_connection_pool_concurrency() -> None: """ HTTP/1.1 requests made in concurrency must not ever exceed the maximum number of allowable connection in the pool. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async def fetch(pool: httpcore2.AsyncConnectionPool, domain: str, info_list: list[list[str]]) -> None: async with pool.stream("GET", f"http://{domain}/") as response: info = [repr(c) for c in pool.connections] info_list.append(info) await response.aread() async with httpcore2.AsyncConnectionPool(max_connections=1, network_backend=network_backend) as pool: info_list: list[list[str]] = [] async with concurrency.open_nursery() as nursery: for domain in ["a.com", "b.com", "c.com", "d.com", "e.com"]: nursery.start_soon(fetch, pool, domain, info_list) for item in info_list: # Check that each time we inspected the connection pool, only a # single connection was established at any one time. assert len(item) == 1 # Each connection was to a different host, and only sent a single # request on that connection. assert item[0] in [ "", "", "", "", "", ] @pytest.mark.trio async def test_connection_pool_concurrency_same_domain_closing() -> None: """ HTTP/1.1 requests made in concurrency must not ever exceed the maximum number of allowable connection in the pool. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"Connection: close\r\n", b"\r\n", b"Hello, world!", ] ) async def fetch(pool: httpcore2.AsyncConnectionPool, domain: str, info_list: list[list[str]]) -> None: async with pool.stream("GET", f"https://{domain}/") as response: info = [repr(c) for c in pool.connections] info_list.append(info) await response.aread() async with httpcore2.AsyncConnectionPool(max_connections=1, network_backend=network_backend, http2=True) as pool: info_list: list[list[str]] = [] async with concurrency.open_nursery() as nursery: for domain in ["a.com", "a.com", "a.com", "a.com", "a.com"]: nursery.start_soon(fetch, pool, domain, info_list) for item in info_list: # Check that each time we inspected the connection pool, only a # single connection was established at any one time. assert len(item) == 1 # Only a single request was sent on each connection. assert item[0] == "" @pytest.mark.trio async def test_connection_pool_concurrency_same_domain_keepalive() -> None: """ HTTP/1.1 requests made in concurrency must not ever exceed the maximum number of allowable connection in the pool. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] * 5 ) async def fetch(pool: httpcore2.AsyncConnectionPool, domain: str, info_list: list[list[str]]) -> None: async with pool.stream("GET", f"https://{domain}/") as response: info = [repr(c) for c in pool.connections] info_list.append(info) await response.aread() async with httpcore2.AsyncConnectionPool(max_connections=1, network_backend=network_backend, http2=True) as pool: info_list: list[list[str]] = [] async with concurrency.open_nursery() as nursery: for domain in ["a.com", "a.com", "a.com", "a.com", "a.com"]: nursery.start_soon(fetch, pool, domain, info_list) for item in info_list: # Check that each time we inspected the connection pool, only a # single connection was established at any one time. assert len(item) == 1 # The connection sent multiple requests. assert item[0] in [ "", "", "", "", "", ] assert repr(pool) == "" @pytest.mark.anyio async def test_unsupported_protocol() -> None: async with httpcore2.AsyncConnectionPool() as pool: with pytest.raises(httpcore2.UnsupportedProtocol): await pool.request("GET", "ftp://www.example.com/") with pytest.raises(httpcore2.UnsupportedProtocol): await pool.request("GET", "://www.example.com/") @pytest.mark.anyio async def test_connection_pool_closed_while_request_in_flight() -> None: """ Closing a connection pool while a request/response is still in-flight should raise an error. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncConnectionPool( network_backend=network_backend, ) as pool: # Send a request, and then close the connection pool while the # response has not yet been streamed. async with pool.stream("GET", "https://example.com/") as response: await pool.aclose() with pytest.raises(httpcore2.ReadError): await response.aread() @pytest.mark.anyio async def test_connection_pool_timeout() -> None: """ Ensure that exceeding max_connections can cause a request to timeout. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncConnectionPool(network_backend=network_backend, max_connections=1) as pool: # Send a request to a pool that is configured to only support a single # connection, and then ensure that a second concurrent request # fails with a timeout. async with pool.stream("GET", "https://example.com/"): with pytest.raises(httpcore2.PoolTimeout): extensions = {"timeout": {"pool": 0.0001}} await pool.request("GET", "https://example.com/", extensions=extensions) @pytest.mark.anyio async def test_connection_pool_timeout_zero() -> None: """ A pool timeout of 0 shouldn't raise a PoolTimeout if there's no need to wait on a new connection. """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) # Use a pool timeout of zero. extensions = {"timeout": {"pool": 0}} # A connection pool configured to allow only one connection at a time. async with httpcore2.AsyncConnectionPool(network_backend=network_backend, max_connections=1) as pool: # Two consecutive requests with a pool timeout of zero. # Both succeed without raising a timeout. response = await pool.request("GET", "https://example.com/", extensions=extensions) assert response.status == 200 assert response.content == b"Hello, world!" response = await pool.request("GET", "https://example.com/", extensions=extensions) assert response.status == 200 assert response.content == b"Hello, world!" # A connection pool configured to allow only one connection at a time. async with httpcore2.AsyncConnectionPool(network_backend=network_backend, max_connections=1) as pool: # Two concurrent requests with a pool timeout of zero. # Only the first will succeed without raising a timeout. async with pool.stream("GET", "https://example.com/", extensions=extensions) as response: # The first response hasn't yet completed. with pytest.raises(httpcore2.PoolTimeout): # So a pool timeout occurs. await pool.request("GET", "https://example.com/", extensions=extensions) # The first response now completes. await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" @pytest.mark.anyio async def test_http11_upgrade_connection() -> None: """ HTTP "101 Switching Protocols" indicates an upgraded connection. We should return the response, so that the network stream may be used for the upgraded connection. https://httpwg.org/specs/rfc9110.html#status.101 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/101 """ network_backend = httpcore2.AsyncMockBackend( [ b"HTTP/1.1 101 Switching Protocols\r\n", b"Connection: upgrade\r\n", b"Upgrade: custom\r\n", b"\r\n", b"...", ] ) called: list[str] = [] async def trace(name: str, kwargs: dict[str, typing.Any]) -> None: called.append(name) async with httpcore2.AsyncConnectionPool(network_backend=network_backend, max_connections=1) as pool: async with pool.stream( "GET", "wss://example.com/", headers={"Connection": "upgrade", "Upgrade": "custom"}, extensions={"trace": trace}, ) as response: assert response.status == 101 network_stream = response.extensions["network_stream"] content = await network_stream.read(max_bytes=1024) assert content == b"..." assert called == [ "connection.connect_tcp.started", "connection.connect_tcp.complete", "connection.start_tls.started", "connection.start_tls.complete", "http11.send_request_headers.started", "http11.send_request_headers.complete", "http11.send_request_body.started", "http11.send_request_body.complete", "http11.receive_response_headers.started", "http11.receive_response_headers.complete", "http11.response_closed.started", "http11.response_closed.complete", ] pydantic-httpx2-9b7ee8e/tests/httpcore2/_async/test_http11.py000066400000000000000000000306671521723372100243670ustar00rootroot00000000000000import pytest import httpcore2 @pytest.mark.anyio async def test_http11_connection() -> None: origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: response = await conn.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" assert conn.is_idle() assert not conn.is_closed() assert conn.is_available() assert not conn.has_expired() assert repr(conn) == "" @pytest.mark.anyio async def test_http11_connection_unread_response() -> None: """ If the client releases the response without reading it to termination, then the connection will not be reusable. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream) as conn: async with conn.stream("GET", "https://example.com/") as response: assert response.status == 200 assert not conn.is_idle() assert conn.is_closed() assert not conn.is_available() assert not conn.has_expired() assert repr(conn) == "" @pytest.mark.anyio async def test_http11_connection_with_remote_protocol_error() -> None: """ If a remote protocol error occurs, then no response will be returned, and the connection will not be reusable. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream([b"Wait, this isn't valid HTTP!", b""]) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream) as conn: with pytest.raises(httpcore2.RemoteProtocolError): await conn.request("GET", "https://example.com/") assert not conn.is_idle() assert conn.is_closed() assert not conn.is_available() assert not conn.has_expired() assert repr(conn) == "" @pytest.mark.anyio async def test_http11_connection_with_incomplete_response() -> None: """ We should be gracefully handling the case where the connection ends prematurely. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, wor", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream) as conn: with pytest.raises(httpcore2.RemoteProtocolError): await conn.request("GET", "https://example.com/") assert not conn.is_idle() assert conn.is_closed() assert not conn.is_available() assert not conn.has_expired() assert repr(conn) == "" @pytest.mark.anyio async def test_http11_connection_with_local_protocol_error() -> None: """ If a local protocol error occurs, then no response will be returned, and the connection will not be reusable. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream) as conn: with pytest.raises(httpcore2.LocalProtocolError) as exc_info: await conn.request("GET", "https://example.com/", headers={"Host": "\0"}) assert str(exc_info.value) == "Illegal header value b'\\x00'" assert not conn.is_idle() assert conn.is_closed() assert not conn.is_available() assert not conn.has_expired() assert repr(conn) == "" @pytest.mark.anyio async def test_http11_connection_handles_one_active_request() -> None: """ Attempting to send a request while one is already in-flight will raise a ConnectionNotAvailable exception. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream) as conn: async with conn.stream("GET", "https://example.com/"): with pytest.raises(httpcore2.ConnectionNotAvailable): await conn.request("GET", "https://example.com/") @pytest.mark.anyio async def test_http11_connection_attempt_close() -> None: """ A connection can only be closed when it is idle. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream) as conn: async with conn.stream("GET", "https://example.com/") as response: await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" @pytest.mark.anyio async def test_http11_request_to_incorrect_origin() -> None: """ A connection can only send requests to whichever origin it is connected to. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream([]) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream) as conn: with pytest.raises(RuntimeError): await conn.request("GET", "https://other.com/") @pytest.mark.anyio async def test_http11_expect_continue() -> None: """ HTTP "100 Continue" is an interim response. We simply ignore it and return the final response. https://httpwg.org/specs/rfc9110.html#status.100 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100 """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ b"HTTP/1.1 100 Continue\r\n", b"\r\n", b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: response = await conn.request( "GET", "https://example.com/", headers={"Expect": "continue"}, ) assert response.status == 200 assert response.content == b"Hello, world!" @pytest.mark.anyio async def test_http11_upgrade_connection() -> None: """ HTTP "101 Switching Protocols" indicates an upgraded connection. We should return the response, so that the network stream may be used for the upgraded connection. https://httpwg.org/specs/rfc9110.html#status.101 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/101 """ origin = httpcore2.Origin(b"wss", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ b"HTTP/1.1 101 Switching Protocols\r\n", b"Connection: upgrade\r\n", b"Upgrade: custom\r\n", b"\r\n", b"...", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: async with conn.stream( "GET", "wss://example.com/", headers={"Connection": "upgrade", "Upgrade": "custom"}, ) as response: assert response.status == 101 network_stream = response.extensions["network_stream"] content = await network_stream.read(max_bytes=1024) assert content == b"..." @pytest.mark.anyio async def test_http11_upgrade_with_trailing_data() -> None: """ HTTP "101 Switching Protocols" indicates an upgraded connection. In `CONNECT` and `Upgrade:` requests, we need to handover the trailing data in the h11.Connection object. https://h11.readthedocs.io/en/latest/api.html#switching-protocols """ origin = httpcore2.Origin(b"wss", b"example.com", 443) stream = httpcore2.AsyncMockStream( # The first element of this mock network stream buffer simulates networking # in which response headers and data are received at once. # This means that "foobar" becomes trailing data. [ (b"HTTP/1.1 101 Switching Protocols\r\nConnection: upgrade\r\nUpgrade: custom\r\n\r\nfoobar"), b"baz", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: async with conn.stream( "GET", "wss://example.com/", headers={"Connection": "upgrade", "Upgrade": "custom"}, ) as response: assert response.status == 101 network_stream = response.extensions["network_stream"] content = await network_stream.read(max_bytes=3) assert content == b"foo" content = await network_stream.read(max_bytes=3) assert content == b"bar" content = await network_stream.read(max_bytes=3) assert content == b"baz" # Lazy tests for AsyncHTTP11UpgradeStream await network_stream.write(b"spam") invalid = network_stream.get_extra_info("invalid") assert invalid is None await network_stream.aclose() @pytest.mark.anyio async def test_http11_early_hints() -> None: """ HTTP "103 Early Hints" is an interim response. We simply ignore it and return the final response. https://datatracker.ietf.org/doc/rfc8297/ """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ b"HTTP/1.1 103 Early Hints\r\n", b"Link: ; rel=preload; as=style\r\n", b"Link: ; rel=preload; as=style\r\n", b"\r\n", b"HTTP/1.1 200 OK\r\n", b"Content-Type: text/html; charset=utf-8\r\n", b"Content-Length: 30\r\n", b"Link: ; rel=preload; as=style\r\n", b"Link: ; rel=preload; as=script\r\n", b"\r\n", b"Hello, world! ...", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: response = await conn.request( "GET", "https://example.com/", headers={"Expect": "continue"}, ) assert response.status == 200 assert response.content == b"Hello, world! ..." @pytest.mark.anyio async def test_http11_header_sub_100kb() -> None: """ A connection should be able to handle a http header size up to 100kB. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ b"HTTP/1.1 200 OK\r\n", # 17 b"Content-Type: plain/text\r\n", # 43 b"Cookie: " + b"x" * (100 * 1024 - 72) + b"\r\n", # 102381 b"Content-Length: 0\r\n", # 102400 b"\r\n", b"", ] ) async with httpcore2.AsyncHTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: response = await conn.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"" pydantic-httpx2-9b7ee8e/tests/httpcore2/_async/test_http2.py000066400000000000000000000371431521723372100243030ustar00rootroot00000000000000import hpack import hyperframe.frame import pytest import httpcore2 @pytest.mark.anyio async def test_http2_connection() -> None: origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ] ) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: response = await conn.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" assert conn.is_idle() assert conn.is_available() assert not conn.is_closed() assert not conn.has_expired() assert conn.info() == "'https://example.com:443', HTTP/2, IDLE, Request Count: 1" assert repr(conn) == "" @pytest.mark.anyio async def test_http2_connection_closed() -> None: origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), # Connection is closed after the first response hyperframe.frame.GoAwayFrame(stream_id=0, error_code=0, last_stream_id=1).serialize(), ] ) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: await conn.request("GET", "https://example.com/") with pytest.raises(httpcore2.ConnectionNotAvailable): await conn.request("GET", "https://example.com/") assert not conn.is_available() @pytest.mark.anyio async def test_http2_connection_post_request() -> None: origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ] ) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream) as conn: response = await conn.request( "POST", "https://example.com/", headers={b"content-length": b"17"}, content=b'{"data": "upload"}', ) assert response.status == 200 assert response.content == b"Hello, world!" @pytest.mark.anyio async def test_http2_connection_with_remote_protocol_error() -> None: """ If a remote protocol error occurs, then no response will be returned, and the connection will not be reusable. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream([b"Wait, this isn't valid HTTP!", b""]) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream) as conn: with pytest.raises(httpcore2.RemoteProtocolError): await conn.request("GET", "https://example.com/") @pytest.mark.anyio async def test_http2_connection_with_rst_stream() -> None: """ If a stream reset occurs, then no response will be returned, but the connection will remain reusable for other requests. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), # Stream is closed midway through the first response... hyperframe.frame.RstStreamFrame(stream_id=1, error_code=8).serialize(), # ...Which doesn't prevent the second response. hyperframe.frame.HeadersFrame( stream_id=3, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=3, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), b"", ] ) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream) as conn: with pytest.raises(httpcore2.RemoteProtocolError): await conn.request("GET", "https://example.com/") response = await conn.request("GET", "https://example.com/") assert response.status == 200 @pytest.mark.anyio async def test_http2_connection_with_goaway() -> None: """ If a GoAway frame occurs, then no response will be returned, and the connection will not be reusable for other requests. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), # Connection is closed midway through the first response... hyperframe.frame.GoAwayFrame(stream_id=0, error_code=0).serialize(), # ...We'll never get to this second response. hyperframe.frame.HeadersFrame( stream_id=3, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=3, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), b"", ] ) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream) as conn: # The initial request has been closed midway, with an unrecoverable error. with pytest.raises(httpcore2.RemoteProtocolError): await conn.request("GET", "https://example.com/") # The second request can receive a graceful `ConnectionNotAvailable`, # and may be retried on a new connection. with pytest.raises(httpcore2.ConnectionNotAvailable): await conn.request("GET", "https://example.com/") @pytest.mark.anyio async def test_http2_connection_with_negative_flow_control_window() -> None: """A negative stream flow-control window must be awaited, not sent into. After the 65535-byte window is exhausted, the server reduces INITIAL_WINDOW_SIZE by 32767, which adjusts the just-exhausted stream window from 0 to -32767. `_wait_for_outgoing_flow` must park the stream until WINDOW_UPDATE restores positive credit; otherwise `h2` raises `LocalProtocolError` on the next send_data. """ origin = httpcore2.Origin(b"https", b"example.com", 443) reduce_settings = hyperframe.frame.SettingsFrame(stream_id=0) reduce_settings.settings = {hyperframe.frame.SettingsFrame.INITIAL_WINDOW_SIZE: 32768} stream = httpcore2.AsyncMockStream( [ hyperframe.frame.SettingsFrame(stream_id=0).serialize(), # This frame reduces INITIAL_WINDOW_SIZE to 32768, which adjusts the just-exhausted stream window to -32767. reduce_settings.serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=0, window_increment=100_000).serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=1, window_increment=100_000).serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"response", flags=["END_STREAM"]).serialize(), ] ) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream) as conn: response = await conn.request("POST", "https://example.com/", content=b"x" * 100_000) assert response.status == 200 assert response.content == b"response" @pytest.mark.anyio async def test_http2_connection_with_flow_control() -> None: origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ hyperframe.frame.SettingsFrame().serialize(), # Available flow: 65,535 hyperframe.frame.WindowUpdateFrame(stream_id=0, window_increment=10_000).serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=1, window_increment=10_000).serialize(), # Available flow: 75,535 hyperframe.frame.WindowUpdateFrame(stream_id=0, window_increment=10_000).serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=1, window_increment=10_000).serialize(), # Available flow: 85,535 hyperframe.frame.WindowUpdateFrame(stream_id=0, window_increment=10_000).serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=1, window_increment=10_000).serialize(), # Available flow: 95,535 hyperframe.frame.WindowUpdateFrame(stream_id=0, window_increment=10_000).serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=1, window_increment=10_000).serialize(), # Available flow: 105,535 hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"100,000 bytes received", flags=["END_STREAM"]).serialize(), ] ) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream) as conn: response = await conn.request( "POST", "https://example.com/", content=b"x" * 100_000, ) assert response.status == 200 assert response.content == b"100,000 bytes received" @pytest.mark.anyio async def test_http2_connection_attempt_close() -> None: """ A connection can only be closed when it is idle. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ] ) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream) as conn: async with conn.stream("GET", "https://example.com/") as response: await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" await conn.aclose() with pytest.raises(httpcore2.ConnectionNotAvailable): await conn.request("GET", "https://example.com/") @pytest.mark.anyio async def test_http2_request_to_incorrect_origin() -> None: """ A connection can only send requests to whichever origin it is connected to. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream([]) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream) as conn: with pytest.raises(RuntimeError): await conn.request("GET", "https://other.com/") @pytest.mark.anyio async def test_http2_remote_max_streams_update() -> None: """ If the remote server updates the maximum concurrent streams value, we should be adjusting how many streams we will allow. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.AsyncMockStream( [ hyperframe.frame.SettingsFrame( settings={hyperframe.frame.SettingsFrame.MAX_CONCURRENT_STREAMS: 1000} ).serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!").serialize(), hyperframe.frame.SettingsFrame( settings={hyperframe.frame.SettingsFrame.MAX_CONCURRENT_STREAMS: 50} ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world...again!", flags=["END_STREAM"]).serialize(), ] ) async with httpcore2.AsyncHTTP2Connection(origin=origin, stream=stream) as conn: async with conn.stream("GET", "https://example.com/") as response: i = 0 async for chunk in response.aiter_stream(): if i == 0: assert chunk == b"Hello, world!" assert conn._h2_state.remote_settings.max_concurrent_streams == 1000 assert conn._max_streams == min( conn._h2_state.remote_settings.max_concurrent_streams, conn._h2_state.local_settings.max_concurrent_streams, ) elif i == 1: assert chunk == b"Hello, world...again!" assert conn._h2_state.remote_settings.max_concurrent_streams == 50 assert conn._max_streams == min( conn._h2_state.remote_settings.max_concurrent_streams, conn._h2_state.local_settings.max_concurrent_streams, ) i += 1 pydantic-httpx2-9b7ee8e/tests/httpcore2/_async/test_http_proxy.py000066400000000000000000000213431521723372100254550ustar00rootroot00000000000000import ssl import typing import hpack import hyperframe.frame import pytest from httpcore2 import ( SOCKET_OPTION, AsyncConnectionPool, AsyncMockBackend, AsyncMockStream, AsyncNetworkStream, Origin, Proxy, ProxyError, ) @pytest.mark.anyio async def test_proxy_forwarding() -> None: """ Send an HTTP request via a proxy. """ network_backend = AsyncMockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with AsyncConnectionPool( proxy=Proxy("http://localhost:8080/"), max_connections=10, network_backend=network_backend, ) as proxy: # Sending an initial request, which once complete will return to the pool, IDLE. async with proxy.stream("GET", "http://example.com/") as response: info = [repr(c) for c in proxy.connections] assert info == [ "" ] await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in proxy.connections] assert info == [""] assert proxy.connections[0].is_idle() assert proxy.connections[0].is_available() assert not proxy.connections[0].is_closed() # A connection on a forwarding proxy can only handle HTTP requests to the same origin. assert proxy.connections[0].can_handle_request(Origin(b"http", b"example.com", 80)) assert not proxy.connections[0].can_handle_request(Origin(b"http", b"other.com", 80)) assert not proxy.connections[0].can_handle_request(Origin(b"https", b"example.com", 443)) assert not proxy.connections[0].can_handle_request(Origin(b"https", b"other.com", 443)) @pytest.mark.anyio async def test_proxy_tunneling() -> None: """ Send an HTTPS request via a proxy. """ network_backend = AsyncMockBackend( [ # The initial response to the proxy CONNECT b"HTTP/1.1 200 OK\r\n\r\n", # The actual response from the remote server b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with AsyncConnectionPool( proxy=Proxy("http://localhost:8080/"), network_backend=network_backend, ) as proxy: # Sending an initial request, which once complete will return to the pool, IDLE. async with proxy.stream("GET", "https://example.com/") as response: info = [repr(c) for c in proxy.connections] assert info == [ "" ] await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in proxy.connections] assert info == [""] assert proxy.connections[0].is_idle() assert proxy.connections[0].is_available() assert not proxy.connections[0].is_closed() # A connection on a tunneled proxy can only handle HTTPS requests to the same origin. assert not proxy.connections[0].can_handle_request(Origin(b"http", b"example.com", 80)) assert not proxy.connections[0].can_handle_request(Origin(b"http", b"other.com", 80)) assert proxy.connections[0].can_handle_request(Origin(b"https", b"example.com", 443)) assert not proxy.connections[0].can_handle_request(Origin(b"https", b"other.com", 443)) # We need to adapt the mock backend here slightly in order to deal # with the proxy case. We do not want the initial connection to the proxy # to indicate an HTTP/2 connection, but we do want it to indicate HTTP/2 # once the SSL upgrade has taken place. class HTTP1ThenHTTP2Stream(AsyncMockStream): async def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> AsyncNetworkStream: self._http2 = True return self class HTTP1ThenHTTP2Backend(AsyncMockBackend): async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> AsyncNetworkStream: return HTTP1ThenHTTP2Stream(list(self._buffer)) @pytest.mark.anyio async def test_proxy_tunneling_http2() -> None: """ Send an HTTP/2 request via a proxy. """ network_backend = HTTP1ThenHTTP2Backend( [ # The initial response to the proxy CONNECT b"HTTP/1.1 200 OK\r\n\r\n", # The actual response from the remote server hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ], ) async with AsyncConnectionPool( proxy=Proxy("http://localhost:8080/"), network_backend=network_backend, http2=True, ) as proxy: # Sending an initial request, which once complete will return to the pool, IDLE. async with proxy.stream("GET", "https://example.com/") as response: info = [repr(c) for c in proxy.connections] assert info == [""] await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in proxy.connections] assert info == [""] assert proxy.connections[0].is_idle() assert proxy.connections[0].is_available() assert not proxy.connections[0].is_closed() # A connection on a tunneled proxy can only handle HTTPS requests to the same origin. assert not proxy.connections[0].can_handle_request(Origin(b"http", b"example.com", 80)) assert not proxy.connections[0].can_handle_request(Origin(b"http", b"other.com", 80)) assert proxy.connections[0].can_handle_request(Origin(b"https", b"example.com", 443)) assert not proxy.connections[0].can_handle_request(Origin(b"https", b"other.com", 443)) @pytest.mark.anyio async def test_proxy_tunneling_with_403() -> None: """ Send an HTTPS request via a proxy. """ network_backend = AsyncMockBackend( [ b"HTTP/1.1 403 Permission Denied\r\n\r\n", ] ) async with AsyncConnectionPool( proxy=Proxy("http://localhost:8080/"), network_backend=network_backend, ) as proxy: with pytest.raises(ProxyError) as exc_info: await proxy.request("GET", "https://example.com/") assert str(exc_info.value) == "403 Permission Denied" assert not proxy.connections @pytest.mark.anyio async def test_proxy_tunneling_with_auth() -> None: """ Send an authenticated HTTPS request via a proxy. """ network_backend = AsyncMockBackend( [ # The initial response to the proxy CONNECT b"HTTP/1.1 200 OK\r\n\r\n", # The actual response from the remote server b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with AsyncConnectionPool( proxy=Proxy( url="http://localhost:8080/", auth=("username", "password"), ), network_backend=network_backend, ) as proxy: response = await proxy.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" def test_proxy_headers() -> None: proxy = Proxy( url="http://localhost:8080/", auth=("username", "password"), ) assert proxy.headers == [(b"Proxy-Authorization", b"Basic dXNlcm5hbWU6cGFzc3dvcmQ=")] pydantic-httpx2-9b7ee8e/tests/httpcore2/_async/test_integration.py000066400000000000000000000034251521723372100255610ustar00rootroot00000000000000import ssl import pytest from pytest_httpbin.serve import Server import httpcore2 @pytest.mark.anyio async def test_request(httpbin: Server) -> None: async with httpcore2.AsyncConnectionPool() as pool: response = await pool.request("GET", httpbin.url) assert response.status == 200 @pytest.mark.anyio async def test_ssl_request(httpbin_secure: Server) -> None: ssl_context = ssl.create_default_context() ssl_context.check_hostname = False ssl_context.verify_mode = ssl.CERT_NONE async with httpcore2.AsyncConnectionPool(ssl_context=ssl_context) as pool: response = await pool.request("GET", httpbin_secure.url) assert response.status == 200 @pytest.mark.anyio async def test_extra_info(httpbin_secure: Server) -> None: ssl_context = ssl.create_default_context() ssl_context.check_hostname = False ssl_context.verify_mode = ssl.CERT_NONE async with httpcore2.AsyncConnectionPool(ssl_context=ssl_context) as pool: async with pool.stream("GET", httpbin_secure.url) as response: assert response.status == 200 stream = response.extensions["network_stream"] ssl_object = stream.get_extra_info("ssl_object") assert ssl_object.version() == "TLSv1.3" local_addr = stream.get_extra_info("client_addr") assert local_addr[0] == "127.0.0.1" remote_addr = stream.get_extra_info("server_addr") assert f"https://{remote_addr[0]}:{remote_addr[1]}" == httpbin_secure.url sock = stream.get_extra_info("socket") assert hasattr(sock, "family") assert hasattr(sock, "type") invalid = stream.get_extra_info("invalid") assert invalid is None stream.get_extra_info("is_readable") pydantic-httpx2-9b7ee8e/tests/httpcore2/_async/test_socks_proxy.py000066400000000000000000000147141521723372100256240ustar00rootroot00000000000000import pytest import httpcore2 @pytest.mark.anyio async def test_socks5_request() -> None: """ Send an HTTP request via a SOCKS proxy. """ network_backend = httpcore2.AsyncMockBackend( [ # The initial socks CONNECT # v5 NOAUTH b"\x05\x00", # v5 SUC RSV IP4 127 .0 .0 .1 :80 b"\x05\x00\x00\x01\xff\x00\x00\x01\x00\x50", # The actual response from the remote server b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncConnectionPool( proxy=httpcore2.Proxy("socks5://localhost:8080/"), network_backend=network_backend, ) as proxy: # Sending an initial request, which once complete will return to the pool, IDLE. async with proxy.stream("GET", "https://example.com/") as response: info = [repr(c) for c in proxy.connections] assert info == [""] await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in proxy.connections] assert info == [""] assert proxy.connections[0].is_idle() assert proxy.connections[0].is_available() assert not proxy.connections[0].is_closed() # A connection on a tunneled proxy can only handle HTTPS requests to the same origin. assert not proxy.connections[0].can_handle_request(httpcore2.Origin(b"http", b"example.com", 80)) assert not proxy.connections[0].can_handle_request(httpcore2.Origin(b"http", b"other.com", 80)) assert proxy.connections[0].can_handle_request(httpcore2.Origin(b"https", b"example.com", 443)) assert not proxy.connections[0].can_handle_request(httpcore2.Origin(b"https", b"other.com", 443)) @pytest.mark.anyio async def test_authenticated_socks5_request() -> None: """ Send an HTTP request via a SOCKS proxy. """ network_backend = httpcore2.AsyncMockBackend( [ # The initial socks CONNECT # v5 USERNAME/PASSWORD b"\x05\x02", # v1 VALID USERNAME/PASSWORD b"\x01\x00", # v5 SUC RSV IP4 127 .0 .0 .1 :80 b"\x05\x00\x00\x01\xff\x00\x00\x01\x00\x50", # The actual response from the remote server b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) async with httpcore2.AsyncConnectionPool( proxy=httpcore2.Proxy( url="socks5://localhost:8080/", auth=(b"username", b"password"), ), network_backend=network_backend, ) as proxy: # Sending an initial request, which once complete will return to the pool, IDLE. async with proxy.stream("GET", "https://example.com/") as response: info = [repr(c) for c in proxy.connections] assert info == [""] await response.aread() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in proxy.connections] assert info == [""] assert proxy.connections[0].is_idle() assert proxy.connections[0].is_available() assert not proxy.connections[0].is_closed() @pytest.mark.anyio async def test_socks5_request_connect_failed() -> None: """ Attempt to send an HTTP request via a SOCKS proxy, resulting in a connect failure. """ network_backend = httpcore2.AsyncMockBackend( [ # The initial socks CONNECT # v5 NOAUTH b"\x05\x00", # v5 NO RSV IP4 0 .0 .0 .0 :00 b"\x05\x05\x00\x01\x00\x00\x00\x00\x00\x00", ] ) async with httpcore2.AsyncConnectionPool( proxy=httpcore2.Proxy("socks5://localhost:8080/"), network_backend=network_backend, ) as proxy: # Sending a request, which the proxy rejects with pytest.raises(httpcore2.ProxyError) as exc_info: await proxy.request("GET", "https://example.com/") assert str(exc_info.value) == "Proxy Server could not connect: Connection refused." assert not proxy.connections @pytest.mark.anyio async def test_socks5_request_failed_to_provide_auth() -> None: """ Attempt to send an HTTP request via an authenticated SOCKS proxy, without providing authentication credentials. """ network_backend = httpcore2.AsyncMockBackend( [ # v5 USERNAME/PASSWORD b"\x05\x02", ] ) async with httpcore2.AsyncConnectionPool( proxy=httpcore2.Proxy("socks5://localhost:8080/"), network_backend=network_backend, ) as proxy: # Sending a request, which the proxy rejects with pytest.raises(httpcore2.ProxyError) as exc_info: await proxy.request("GET", "https://example.com/") assert ( str(exc_info.value) == "Requested NO AUTHENTICATION REQUIRED from proxy server, but got USERNAME/PASSWORD." ) assert not proxy.connections @pytest.mark.anyio async def test_socks5_request_incorrect_auth() -> None: """ Attempt to send an HTTP request via an authenticated SOCKS proxy, with incorrect authentication credentials. """ network_backend = httpcore2.AsyncMockBackend( [ # v5 USERNAME/PASSWORD b"\x05\x02", # v1 INVALID USERNAME/PASSWORD b"\x01\x01", ] ) async with httpcore2.AsyncConnectionPool( proxy=httpcore2.Proxy( url="socks5://localhost:8080/", auth=(b"invalid", b"invalid"), ), network_backend=network_backend, ) as proxy: # Sending a request, which the proxy rejects with pytest.raises(httpcore2.ProxyError) as exc_info: await proxy.request("GET", "https://example.com/") assert str(exc_info.value) == "Invalid username/password" assert not proxy.connections pydantic-httpx2-9b7ee8e/tests/httpcore2/_sync/000077500000000000000000000000001521723372100214605ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpcore2/_sync/__init__.py000066400000000000000000000000001521723372100235570ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpcore2/_sync/test_connection.py000066400000000000000000000266521521723372100252430ustar00rootroot00000000000000import ssl import typing import hpack import hyperframe.frame import pytest from httpcore2 import ( SOCKET_OPTION, HTTPConnection, MockBackend, MockStream, NetworkStream, ConnectError, ConnectionNotAvailable, Origin, RemoteProtocolError, WriteError, ) def test_http_connection() -> None: origin = Origin(b"https", b"example.com", 443) network_backend = MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with HTTPConnection(origin=origin, network_backend=network_backend, keepalive_expiry=5.0) as conn: assert not conn.is_idle() assert not conn.is_closed() assert not conn.is_available() assert not conn.has_expired() assert repr(conn) == "" with conn.stream("GET", "https://example.com/") as response: assert repr(conn) == "" response.read() assert response.status == 200 assert response.content == b"Hello, world!" assert conn.is_idle() assert not conn.is_closed() assert conn.is_available() assert not conn.has_expired() assert repr(conn) == "" def test_concurrent_requests_not_available_on_http11_connections() -> None: """ Attempting to issue a request against an already active HTTP/1.1 connection will raise a `ConnectionNotAvailable` exception. """ origin = Origin(b"https", b"example.com", 443) network_backend = MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with HTTPConnection(origin=origin, network_backend=network_backend, keepalive_expiry=5.0) as conn: with conn.stream("GET", "https://example.com/"): with pytest.raises(ConnectionNotAvailable): conn.request("GET", "https://example.com/") @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") def test_write_error_with_response_sent() -> None: """ If a server half-closes the connection while the client is sending the request, it may still send a response. In this case the client should successfully read and return the response. See also the `test_write_error_without_response_sent` test above. """ class ErrorOnRequestTooLargeStream(MockStream): def __init__(self, buffer: list[bytes], http2: bool = False) -> None: super().__init__(buffer, http2) self.count = 0 def write(self, buffer: bytes, timeout: float | None = None) -> None: self.count += len(buffer) if self.count > 1_000_000: raise WriteError() class ErrorOnRequestTooLarge(MockBackend): def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> MockStream: return ErrorOnRequestTooLargeStream(list(self._buffer), http2=self._http2) origin = Origin(b"https", b"example.com", 443) network_backend = ErrorOnRequestTooLarge( [ b"HTTP/1.1 413 Payload Too Large\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 37\r\n", b"\r\n", b"Request body exceeded 1,000,000 bytes", ] ) with HTTPConnection(origin=origin, network_backend=network_backend, keepalive_expiry=5.0) as conn: content = b"x" * 10_000_000 response = conn.request("POST", "https://example.com/", content=content) assert response.status == 413 assert response.content == b"Request body exceeded 1,000,000 bytes" @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") def test_write_error_without_response_sent() -> None: """ If a server fully closes the connection while the client is sending the request, then client should raise an error. See also the `test_write_error_with_response_sent` test above. """ class ErrorOnRequestTooLargeStream(MockStream): def __init__(self, buffer: list[bytes], http2: bool = False) -> None: super().__init__(buffer, http2) self.count = 0 def write(self, buffer: bytes, timeout: float | None = None) -> None: self.count += len(buffer) if self.count > 1_000_000: raise WriteError() class ErrorOnRequestTooLarge(MockBackend): def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> MockStream: return ErrorOnRequestTooLargeStream(list(self._buffer), http2=self._http2) origin = Origin(b"https", b"example.com", 443) network_backend = ErrorOnRequestTooLarge([]) with HTTPConnection(origin=origin, network_backend=network_backend, keepalive_expiry=5.0) as conn: content = b"x" * 10_000_000 with pytest.raises(RemoteProtocolError) as exc_info: conn.request("POST", "https://example.com/", content=content) assert str(exc_info.value) == "Server disconnected without sending a response." @pytest.mark.filterwarnings("ignore::pytest.PytestUnraisableExceptionWarning") def test_http2_connection() -> None: origin = Origin(b"https", b"example.com", 443) network_backend = MockBackend( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ], http2=True, ) with HTTPConnection(origin=origin, network_backend=network_backend, http2=True) as conn: response = conn.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" assert response.extensions["http_version"] == b"HTTP/2" def test_request_to_incorrect_origin() -> None: """ A connection can only send requests whichever origin it is connected to. """ origin = Origin(b"https", b"example.com", 443) network_backend = MockBackend([]) with HTTPConnection(origin=origin, network_backend=network_backend) as conn: with pytest.raises(RuntimeError): conn.request("GET", "https://other.com/") class NeedsRetryBackend(MockBackend): def __init__( self, buffer: list[bytes], http2: bool = False, connect_tcp_failures: int = 2, start_tls_failures: int = 0, ) -> None: self._connect_tcp_failures = connect_tcp_failures self._start_tls_failures = start_tls_failures super().__init__(buffer, http2) def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> NetworkStream: if self._connect_tcp_failures > 0: self._connect_tcp_failures -= 1 raise ConnectError() stream = super().connect_tcp(host, port, timeout=timeout, local_address=local_address) return self._NeedsRetryAsyncNetworkStream(self, stream) class _NeedsRetryAsyncNetworkStream(NetworkStream): def __init__(self, backend: "NeedsRetryBackend", stream: NetworkStream) -> None: self._backend = backend self._stream = stream def read(self, max_bytes: int, timeout: float | None = None) -> bytes: return self._stream.read(max_bytes, timeout) def write(self, buffer: bytes, timeout: float | None = None) -> None: self._stream.write(buffer, timeout) def close(self) -> None: self._stream.close() def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> "NetworkStream": if self._backend._start_tls_failures > 0: self._backend._start_tls_failures -= 1 raise ConnectError() stream = self._stream.start_tls(ssl_context, server_hostname, timeout) return self._backend._NeedsRetryAsyncNetworkStream(self._backend, stream) def get_extra_info(self, info: str) -> typing.Any: return self._stream.get_extra_info(info) def test_connection_retries() -> None: origin = Origin(b"https", b"example.com", 443) content = [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] network_backend = NeedsRetryBackend(content) with HTTPConnection(origin=origin, network_backend=network_backend, retries=3) as conn: response = conn.request("GET", "https://example.com/") assert response.status == 200 network_backend = NeedsRetryBackend(content) with HTTPConnection( origin=origin, network_backend=network_backend, ) as conn: with pytest.raises(ConnectError): conn.request("GET", "https://example.com/") def test_connection_retries_tls() -> None: origin = Origin(b"https", b"example.com", 443) content = [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] network_backend = NeedsRetryBackend(content, connect_tcp_failures=0, start_tls_failures=2) with HTTPConnection(origin=origin, network_backend=network_backend, retries=3) as conn: response = conn.request("GET", "https://example.com/") assert response.status == 200 network_backend = NeedsRetryBackend(content, connect_tcp_failures=0, start_tls_failures=2) with HTTPConnection( origin=origin, network_backend=network_backend, ) as conn: with pytest.raises(ConnectError): conn.request("GET", "https://example.com/") def test_uds_connections() -> None: # We're not actually testing Unix Domain Sockets here, because we're just # using a mock backend, but at least we're covering the UDS codepath # in `connection.py` which we may as well do. origin = Origin(b"https", b"example.com", 443) network_backend = MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with HTTPConnection(origin=origin, network_backend=network_backend, uds="/mock/example") as conn: response = conn.request("GET", "https://example.com/") assert response.status == 200 pydantic-httpx2-9b7ee8e/tests/httpcore2/_sync/test_connection_pool.py000066400000000000000000000727311521723372100262730ustar00rootroot00000000000000import logging import typing import hpack import hyperframe.frame import pytest from tests.httpcore2 import concurrency import httpcore2 def test_connection_pool_with_keepalive() -> None: """ By default HTTP/1.1 requests should be returned to the connection pool. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.ConnectionPool(network_backend=network_backend, max_keepalive_connections=1) as pool: # Sending an initial request, which once complete will return to the pool, IDLE. with pool.stream("GET", "https://example.com/") as response: info = [repr(c) for c in pool.connections] assert info == [""] assert repr(pool) == "" response.read() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [""] assert repr(pool) == "" # Sending a second request to the same origin will reuse the existing IDLE connection. with pool.stream("GET", "https://example.com/") as response: info = [repr(c) for c in pool.connections] assert info == [""] assert repr(pool) == "" response.read() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [""] assert repr(pool) == "" # Sending a request to a different origin will not reuse the existing IDLE connection. with ( pool.stream("GET", "http://example.com/") as response_1, pool.stream("GET", "http://example.com/") as response_2, ): info = [repr(c) for c in pool.connections] assert info == [ "", "", "", ] assert repr(pool) == "" response_1.read() response_2.read() assert response_1.status == 200 assert response_1.content == b"Hello, world!" assert response_2.status == 200 assert response_2.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [ "", ] assert repr(pool) == "" def test_connection_pool_with_close() -> None: """ HTTP/1.1 requests that include a 'Connection: Close' header should not be returned to the connection pool. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.ConnectionPool(network_backend=network_backend) as pool: # Sending an initial request, which once complete will not return to the pool. with pool.stream("GET", "https://example.com/", headers={"Connection": "close"}) as response: info = [repr(c) for c in pool.connections] assert info == [""] response.read() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [] def test_connection_pool_with_http2() -> None: """ Test a connection pool with HTTP/2 requests. """ network_backend = httpcore2.MockBackend( buffer=[ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), hyperframe.frame.HeadersFrame( stream_id=3, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=3, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ], http2=True, ) with httpcore2.ConnectionPool( network_backend=network_backend, ) as pool: # Sending an initial request, which once complete will return to the pool, IDLE. response = pool.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [""] # Sending a second request to the same origin will reuse the existing IDLE connection. response = pool.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [""] def test_connection_pool_with_http2_goaway() -> None: """ Test a connection pool with HTTP/2 requests, that cleanly disconnects with a GoAway frame after the first request. """ network_backend = httpcore2.MockBackend( buffer=[ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), hyperframe.frame.GoAwayFrame(stream_id=0, error_code=0, last_stream_id=1).serialize(), b"", ], http2=True, ) with httpcore2.ConnectionPool( network_backend=network_backend, ) as pool: # Sending an initial request, which once complete will return to the pool, IDLE. response = pool.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [""] # Sending a second request to the same origin will require a new connection. # The original connection has now been closed. response = pool.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [ "", ] def test_trace_request() -> None: """ The 'trace' request extension allows for a callback function to inspect the internal events that occur while sending a request. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) called: list[str] = [] def trace(name: str, kwargs: dict[str, typing.Any]) -> None: called.append(name) with httpcore2.ConnectionPool(network_backend=network_backend) as pool: pool.request("GET", "https://example.com/", extensions={"trace": trace}) assert called == [ "connection.connect_tcp.started", "connection.connect_tcp.complete", "connection.start_tls.started", "connection.start_tls.complete", "http11.send_request_headers.started", "http11.send_request_headers.complete", "http11.send_request_body.started", "http11.send_request_body.complete", "http11.receive_response_headers.started", "http11.receive_response_headers.complete", "http11.receive_response_body.started", "http11.receive_response_body.complete", "http11.response_closed.started", "http11.response_closed.complete", ] def test_debug_request(caplog: pytest.LogCaptureFixture) -> None: """ The 'trace' request extension allows for a callback function to inspect the internal events that occur while sending a request. """ caplog.set_level(logging.DEBUG) network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.ConnectionPool(network_backend=network_backend) as pool: pool.request("GET", "http://example.com/") assert caplog.record_tuples == [ ( "httpcore2.connection", logging.DEBUG, "connect_tcp.started host='example.com' port=80 local_address=None timeout=None socket_options=None", ), ( "httpcore2.connection", logging.DEBUG, "connect_tcp.complete return_value=", ), ( "httpcore2.http11", logging.DEBUG, "send_request_headers.started request=", ), ("httpcore2.http11", logging.DEBUG, "send_request_headers.complete"), ( "httpcore2.http11", logging.DEBUG, "send_request_body.started request=", ), ("httpcore2.http11", logging.DEBUG, "send_request_body.complete"), ( "httpcore2.http11", logging.DEBUG, "receive_response_headers.started request=", ), ( "httpcore2.http11", logging.DEBUG, "receive_response_headers.complete return_value=" "(b'HTTP/1.1', 200, b'OK', [(b'Content-Type', b'plain/text'), (b'Content-Length', b'13')])", ), ( "httpcore2.http11", logging.DEBUG, "receive_response_body.started request=", ), ("httpcore2.http11", logging.DEBUG, "receive_response_body.complete"), ("httpcore2.http11", logging.DEBUG, "response_closed.started"), ("httpcore2.http11", logging.DEBUG, "response_closed.complete"), ("httpcore2.connection", logging.DEBUG, "close.started"), ("httpcore2.connection", logging.DEBUG, "close.complete"), ] def test_connection_pool_with_http_exception() -> None: """ HTTP/1.1 requests that result in an exception during the connection should not be returned to the connection pool. """ network_backend = httpcore2.MockBackend([b"Wait, this isn't valid HTTP!"]) called: list[str] = [] def trace(name: str, kwargs: dict[str, typing.Any]) -> None: called.append(name) with httpcore2.ConnectionPool(network_backend=network_backend) as pool: # Sending an initial request, which once complete will not return to the pool. with pytest.raises(httpcore2.RemoteProtocolError): pool.request("GET", "https://example.com/", extensions={"trace": trace}) info = [repr(c) for c in pool.connections] assert info == [] assert called == [ "connection.connect_tcp.started", "connection.connect_tcp.complete", "connection.start_tls.started", "connection.start_tls.complete", "http11.send_request_headers.started", "http11.send_request_headers.complete", "http11.send_request_body.started", "http11.send_request_body.complete", "http11.receive_response_headers.started", "http11.receive_response_headers.failed", "http11.response_closed.started", "http11.response_closed.complete", ] def test_connection_pool_with_connect_exception() -> None: """ HTTP/1.1 requests that result in an exception during connection should not be returned to the connection pool. """ class FailedConnectBackend(httpcore2.MockBackend): def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[httpcore2.SOCKET_OPTION] | None = None, ) -> httpcore2.NetworkStream: raise httpcore2.ConnectError("Could not connect") network_backend = FailedConnectBackend([]) called: list[str] = [] def trace(name: str, kwargs: dict[str, typing.Any]) -> None: called.append(name) with httpcore2.ConnectionPool(network_backend=network_backend) as pool: # Sending an initial request, which once complete will not return to the pool. with pytest.raises(httpcore2.ConnectError): pool.request("GET", "https://example.com/", extensions={"trace": trace}) info = [repr(c) for c in pool.connections] assert info == [] assert called == [ "connection.connect_tcp.started", "connection.connect_tcp.failed", ] def test_connection_pool_with_immediate_expiry() -> None: """ Connection pools with keepalive_expiry=0.0 should immediately expire keep alive connections. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.ConnectionPool( keepalive_expiry=0.0, network_backend=network_backend, ) as pool: # Sending an initial request, which once complete will not return to the pool. with pool.stream("GET", "https://example.com/") as response: info = [repr(c) for c in pool.connections] assert info == [""] response.read() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [] def test_connection_pool_with_no_keepalive_connections_allowed() -> None: """ When 'max_keepalive_connections=0' is used, IDLE connections should not be returned to the pool. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.ConnectionPool(max_keepalive_connections=0, network_backend=network_backend) as pool: # Sending an initial request, which once complete will not return to the pool. with pool.stream("GET", "https://example.com/") as response: info = [repr(c) for c in pool.connections] assert info == [""] response.read() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in pool.connections] assert info == [] def test_connection_pool_closes_idle_connection_for_different_origin() -> None: """ When the pool is at 'max_connections' and an incoming request is for an origin with no reusable connection, an IDLE connection to a different origin is closed to make room for the new connection. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.ConnectionPool(network_backend=network_backend, max_connections=1) as pool: # An initial request to a.com leaves a single IDLE connection in the pool. response = pool.request("GET", "https://a.com/") assert response.status == 200 info = [repr(c) for c in pool.connections] assert info == [""] # A request to b.com cannot reuse the a.com connection and the pool is full, # so the IDLE a.com connection is closed and replaced with a b.com connection. response = pool.request("GET", "https://b.com/") assert response.status == 200 info = [repr(c) for c in pool.connections] assert info == [""] def test_connection_pool_concurrency() -> None: """ HTTP/1.1 requests made in concurrency must not ever exceed the maximum number of allowable connection in the pool. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) def fetch(pool: httpcore2.ConnectionPool, domain: str, info_list: list[list[str]]) -> None: with pool.stream("GET", f"http://{domain}/") as response: info = [repr(c) for c in pool.connections] info_list.append(info) response.read() with httpcore2.ConnectionPool(max_connections=1, network_backend=network_backend) as pool: info_list: list[list[str]] = [] with concurrency.open_nursery() as nursery: for domain in ["a.com", "b.com", "c.com", "d.com", "e.com"]: nursery.start_soon(fetch, pool, domain, info_list) for item in info_list: # Check that each time we inspected the connection pool, only a # single connection was established at any one time. assert len(item) == 1 # Each connection was to a different host, and only sent a single # request on that connection. assert item[0] in [ "", "", "", "", "", ] def test_connection_pool_concurrency_same_domain_closing() -> None: """ HTTP/1.1 requests made in concurrency must not ever exceed the maximum number of allowable connection in the pool. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"Connection: close\r\n", b"\r\n", b"Hello, world!", ] ) def fetch(pool: httpcore2.ConnectionPool, domain: str, info_list: list[list[str]]) -> None: with pool.stream("GET", f"https://{domain}/") as response: info = [repr(c) for c in pool.connections] info_list.append(info) response.read() with httpcore2.ConnectionPool(max_connections=1, network_backend=network_backend, http2=True) as pool: info_list: list[list[str]] = [] with concurrency.open_nursery() as nursery: for domain in ["a.com", "a.com", "a.com", "a.com", "a.com"]: nursery.start_soon(fetch, pool, domain, info_list) for item in info_list: # Check that each time we inspected the connection pool, only a # single connection was established at any one time. assert len(item) == 1 # Only a single request was sent on each connection. assert item[0] == "" def test_connection_pool_concurrency_same_domain_keepalive() -> None: """ HTTP/1.1 requests made in concurrency must not ever exceed the maximum number of allowable connection in the pool. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] * 5 ) def fetch(pool: httpcore2.ConnectionPool, domain: str, info_list: list[list[str]]) -> None: with pool.stream("GET", f"https://{domain}/") as response: info = [repr(c) for c in pool.connections] info_list.append(info) response.read() with httpcore2.ConnectionPool(max_connections=1, network_backend=network_backend, http2=True) as pool: info_list: list[list[str]] = [] with concurrency.open_nursery() as nursery: for domain in ["a.com", "a.com", "a.com", "a.com", "a.com"]: nursery.start_soon(fetch, pool, domain, info_list) for item in info_list: # Check that each time we inspected the connection pool, only a # single connection was established at any one time. assert len(item) == 1 # The connection sent multiple requests. assert item[0] in [ "", "", "", "", "", ] assert repr(pool) == "" def test_unsupported_protocol() -> None: with httpcore2.ConnectionPool() as pool: with pytest.raises(httpcore2.UnsupportedProtocol): pool.request("GET", "ftp://www.example.com/") with pytest.raises(httpcore2.UnsupportedProtocol): pool.request("GET", "://www.example.com/") def test_connection_pool_closed_while_request_in_flight() -> None: """ Closing a connection pool while a request/response is still in-flight should raise an error. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.ConnectionPool( network_backend=network_backend, ) as pool: # Send a request, and then close the connection pool while the # response has not yet been streamed. with pool.stream("GET", "https://example.com/") as response: pool.close() with pytest.raises(httpcore2.ReadError): response.read() def test_connection_pool_timeout() -> None: """ Ensure that exceeding max_connections can cause a request to timeout. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.ConnectionPool(network_backend=network_backend, max_connections=1) as pool: # Send a request to a pool that is configured to only support a single # connection, and then ensure that a second concurrent request # fails with a timeout. with pool.stream("GET", "https://example.com/"): with pytest.raises(httpcore2.PoolTimeout): extensions = {"timeout": {"pool": 0.0001}} pool.request("GET", "https://example.com/", extensions=extensions) def test_connection_pool_timeout_zero() -> None: """ A pool timeout of 0 shouldn't raise a PoolTimeout if there's no need to wait on a new connection. """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) # Use a pool timeout of zero. extensions = {"timeout": {"pool": 0}} # A connection pool configured to allow only one connection at a time. with httpcore2.ConnectionPool(network_backend=network_backend, max_connections=1) as pool: # Two consecutive requests with a pool timeout of zero. # Both succeed without raising a timeout. response = pool.request("GET", "https://example.com/", extensions=extensions) assert response.status == 200 assert response.content == b"Hello, world!" response = pool.request("GET", "https://example.com/", extensions=extensions) assert response.status == 200 assert response.content == b"Hello, world!" # A connection pool configured to allow only one connection at a time. with httpcore2.ConnectionPool(network_backend=network_backend, max_connections=1) as pool: # Two concurrent requests with a pool timeout of zero. # Only the first will succeed without raising a timeout. with pool.stream("GET", "https://example.com/", extensions=extensions) as response: # The first response hasn't yet completed. with pytest.raises(httpcore2.PoolTimeout): # So a pool timeout occurs. pool.request("GET", "https://example.com/", extensions=extensions) # The first response now completes. response.read() assert response.status == 200 assert response.content == b"Hello, world!" def test_http11_upgrade_connection() -> None: """ HTTP "101 Switching Protocols" indicates an upgraded connection. We should return the response, so that the network stream may be used for the upgraded connection. https://httpwg.org/specs/rfc9110.html#status.101 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/101 """ network_backend = httpcore2.MockBackend( [ b"HTTP/1.1 101 Switching Protocols\r\n", b"Connection: upgrade\r\n", b"Upgrade: custom\r\n", b"\r\n", b"...", ] ) called: list[str] = [] def trace(name: str, kwargs: dict[str, typing.Any]) -> None: called.append(name) with httpcore2.ConnectionPool(network_backend=network_backend, max_connections=1) as pool: with pool.stream( "GET", "wss://example.com/", headers={"Connection": "upgrade", "Upgrade": "custom"}, extensions={"trace": trace}, ) as response: assert response.status == 101 network_stream = response.extensions["network_stream"] content = network_stream.read(max_bytes=1024) assert content == b"..." assert called == [ "connection.connect_tcp.started", "connection.connect_tcp.complete", "connection.start_tls.started", "connection.start_tls.complete", "http11.send_request_headers.started", "http11.send_request_headers.complete", "http11.send_request_body.started", "http11.send_request_body.complete", "http11.receive_response_headers.started", "http11.receive_response_headers.complete", "http11.response_closed.started", "http11.response_closed.complete", ] pydantic-httpx2-9b7ee8e/tests/httpcore2/_sync/test_http11.py000066400000000000000000000274211521723372100242200ustar00rootroot00000000000000import pytest import httpcore2 def test_http11_connection() -> None: origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: response = conn.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" assert conn.is_idle() assert not conn.is_closed() assert conn.is_available() assert not conn.has_expired() assert repr(conn) == "" def test_http11_connection_unread_response() -> None: """ If the client releases the response without reading it to termination, then the connection will not be reusable. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream) as conn: with conn.stream("GET", "https://example.com/") as response: assert response.status == 200 assert not conn.is_idle() assert conn.is_closed() assert not conn.is_available() assert not conn.has_expired() assert repr(conn) == "" def test_http11_connection_with_remote_protocol_error() -> None: """ If a remote protocol error occurs, then no response will be returned, and the connection will not be reusable. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream([b"Wait, this isn't valid HTTP!", b""]) with httpcore2.HTTP11Connection(origin=origin, stream=stream) as conn: with pytest.raises(httpcore2.RemoteProtocolError): conn.request("GET", "https://example.com/") assert not conn.is_idle() assert conn.is_closed() assert not conn.is_available() assert not conn.has_expired() assert repr(conn) == "" def test_http11_connection_with_incomplete_response() -> None: """ We should be gracefully handling the case where the connection ends prematurely. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, wor", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream) as conn: with pytest.raises(httpcore2.RemoteProtocolError): conn.request("GET", "https://example.com/") assert not conn.is_idle() assert conn.is_closed() assert not conn.is_available() assert not conn.has_expired() assert repr(conn) == "" def test_http11_connection_with_local_protocol_error() -> None: """ If a local protocol error occurs, then no response will be returned, and the connection will not be reusable. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream) as conn: with pytest.raises(httpcore2.LocalProtocolError) as exc_info: conn.request("GET", "https://example.com/", headers={"Host": "\0"}) assert str(exc_info.value) == "Illegal header value b'\\x00'" assert not conn.is_idle() assert conn.is_closed() assert not conn.is_available() assert not conn.has_expired() assert repr(conn) == "" def test_http11_connection_handles_one_active_request() -> None: """ Attempting to send a request while one is already in-flight will raise a ConnectionNotAvailable exception. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream) as conn: with conn.stream("GET", "https://example.com/"): with pytest.raises(httpcore2.ConnectionNotAvailable): conn.request("GET", "https://example.com/") def test_http11_connection_attempt_close() -> None: """ A connection can only be closed when it is idle. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream) as conn: with conn.stream("GET", "https://example.com/") as response: response.read() assert response.status == 200 assert response.content == b"Hello, world!" def test_http11_request_to_incorrect_origin() -> None: """ A connection can only send requests to whichever origin it is connected to. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream([]) with httpcore2.HTTP11Connection(origin=origin, stream=stream) as conn: with pytest.raises(RuntimeError): conn.request("GET", "https://other.com/") def test_http11_expect_continue() -> None: """ HTTP "100 Continue" is an interim response. We simply ignore it and return the final response. https://httpwg.org/specs/rfc9110.html#status.100 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/100 """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ b"HTTP/1.1 100 Continue\r\n", b"\r\n", b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: response = conn.request( "GET", "https://example.com/", headers={"Expect": "continue"}, ) assert response.status == 200 assert response.content == b"Hello, world!" def test_http11_upgrade_connection() -> None: """ HTTP "101 Switching Protocols" indicates an upgraded connection. We should return the response, so that the network stream may be used for the upgraded connection. https://httpwg.org/specs/rfc9110.html#status.101 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/101 """ origin = httpcore2.Origin(b"wss", b"example.com", 443) stream = httpcore2.MockStream( [ b"HTTP/1.1 101 Switching Protocols\r\n", b"Connection: upgrade\r\n", b"Upgrade: custom\r\n", b"\r\n", b"...", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: with conn.stream( "GET", "wss://example.com/", headers={"Connection": "upgrade", "Upgrade": "custom"}, ) as response: assert response.status == 101 network_stream = response.extensions["network_stream"] content = network_stream.read(max_bytes=1024) assert content == b"..." def test_http11_upgrade_with_trailing_data() -> None: """ HTTP "101 Switching Protocols" indicates an upgraded connection. In `CONNECT` and `Upgrade:` requests, we need to handover the trailing data in the h11.Connection object. https://h11.readthedocs.io/en/latest/api.html#switching-protocols """ origin = httpcore2.Origin(b"wss", b"example.com", 443) stream = httpcore2.MockStream( # The first element of this mock network stream buffer simulates networking # in which response headers and data are received at once. # This means that "foobar" becomes trailing data. [ (b"HTTP/1.1 101 Switching Protocols\r\nConnection: upgrade\r\nUpgrade: custom\r\n\r\nfoobar"), b"baz", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: with conn.stream( "GET", "wss://example.com/", headers={"Connection": "upgrade", "Upgrade": "custom"}, ) as response: assert response.status == 101 network_stream = response.extensions["network_stream"] content = network_stream.read(max_bytes=3) assert content == b"foo" content = network_stream.read(max_bytes=3) assert content == b"bar" content = network_stream.read(max_bytes=3) assert content == b"baz" # Lazy tests for HTTP11UpgradeStream network_stream.write(b"spam") invalid = network_stream.get_extra_info("invalid") assert invalid is None network_stream.close() def test_http11_early_hints() -> None: """ HTTP "103 Early Hints" is an interim response. We simply ignore it and return the final response. https://datatracker.ietf.org/doc/rfc8297/ """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ b"HTTP/1.1 103 Early Hints\r\n", b"Link: ; rel=preload; as=style\r\n", b"Link: ; rel=preload; as=style\r\n", b"\r\n", b"HTTP/1.1 200 OK\r\n", b"Content-Type: text/html; charset=utf-8\r\n", b"Content-Length: 30\r\n", b"Link: ; rel=preload; as=style\r\n", b"Link: ; rel=preload; as=script\r\n", b"\r\n", b"Hello, world! ...", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: response = conn.request( "GET", "https://example.com/", headers={"Expect": "continue"}, ) assert response.status == 200 assert response.content == b"Hello, world! ..." def test_http11_header_sub_100kb() -> None: """ A connection should be able to handle a http header size up to 100kB. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ b"HTTP/1.1 200 OK\r\n", # 17 b"Content-Type: plain/text\r\n", # 43 b"Cookie: " + b"x" * (100 * 1024 - 72) + b"\r\n", # 102381 b"Content-Length: 0\r\n", # 102400 b"\r\n", b"", ] ) with httpcore2.HTTP11Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: response = conn.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"" pydantic-httpx2-9b7ee8e/tests/httpcore2/_sync/test_http2.py000066400000000000000000000360671521723372100241460ustar00rootroot00000000000000import hpack import hyperframe.frame import pytest import httpcore2 def test_http2_connection() -> None: origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ] ) with httpcore2.HTTP2Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: response = conn.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" assert conn.is_idle() assert conn.is_available() assert not conn.is_closed() assert not conn.has_expired() assert conn.info() == "'https://example.com:443', HTTP/2, IDLE, Request Count: 1" assert repr(conn) == "" def test_http2_connection_closed() -> None: origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), # Connection is closed after the first response hyperframe.frame.GoAwayFrame(stream_id=0, error_code=0, last_stream_id=1).serialize(), ] ) with httpcore2.HTTP2Connection(origin=origin, stream=stream, keepalive_expiry=5.0) as conn: conn.request("GET", "https://example.com/") with pytest.raises(httpcore2.ConnectionNotAvailable): conn.request("GET", "https://example.com/") assert not conn.is_available() def test_http2_connection_post_request() -> None: origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ] ) with httpcore2.HTTP2Connection(origin=origin, stream=stream) as conn: response = conn.request( "POST", "https://example.com/", headers={b"content-length": b"17"}, content=b'{"data": "upload"}', ) assert response.status == 200 assert response.content == b"Hello, world!" def test_http2_connection_with_remote_protocol_error() -> None: """ If a remote protocol error occurs, then no response will be returned, and the connection will not be reusable. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream([b"Wait, this isn't valid HTTP!", b""]) with httpcore2.HTTP2Connection(origin=origin, stream=stream) as conn: with pytest.raises(httpcore2.RemoteProtocolError): conn.request("GET", "https://example.com/") def test_http2_connection_with_rst_stream() -> None: """ If a stream reset occurs, then no response will be returned, but the connection will remain reusable for other requests. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), # Stream is closed midway through the first response... hyperframe.frame.RstStreamFrame(stream_id=1, error_code=8).serialize(), # ...Which doesn't prevent the second response. hyperframe.frame.HeadersFrame( stream_id=3, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=3, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), b"", ] ) with httpcore2.HTTP2Connection(origin=origin, stream=stream) as conn: with pytest.raises(httpcore2.RemoteProtocolError): conn.request("GET", "https://example.com/") response = conn.request("GET", "https://example.com/") assert response.status == 200 def test_http2_connection_with_goaway() -> None: """ If a GoAway frame occurs, then no response will be returned, and the connection will not be reusable for other requests. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), # Connection is closed midway through the first response... hyperframe.frame.GoAwayFrame(stream_id=0, error_code=0).serialize(), # ...We'll never get to this second response. hyperframe.frame.HeadersFrame( stream_id=3, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=3, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), b"", ] ) with httpcore2.HTTP2Connection(origin=origin, stream=stream) as conn: # The initial request has been closed midway, with an unrecoverable error. with pytest.raises(httpcore2.RemoteProtocolError): conn.request("GET", "https://example.com/") # The second request can receive a graceful `ConnectionNotAvailable`, # and may be retried on a new connection. with pytest.raises(httpcore2.ConnectionNotAvailable): conn.request("GET", "https://example.com/") def test_http2_connection_with_negative_flow_control_window() -> None: """A negative stream flow-control window must be awaited, not sent into. After the 65535-byte window is exhausted, the server reduces INITIAL_WINDOW_SIZE by 32767, which adjusts the just-exhausted stream window from 0 to -32767. `_wait_for_outgoing_flow` must park the stream until WINDOW_UPDATE restores positive credit; otherwise `h2` raises `LocalProtocolError` on the next send_data. """ origin = httpcore2.Origin(b"https", b"example.com", 443) reduce_settings = hyperframe.frame.SettingsFrame(stream_id=0) reduce_settings.settings = {hyperframe.frame.SettingsFrame.INITIAL_WINDOW_SIZE: 32768} stream = httpcore2.MockStream( [ hyperframe.frame.SettingsFrame(stream_id=0).serialize(), # This frame reduces INITIAL_WINDOW_SIZE to 32768, which adjusts the just-exhausted stream window to -32767. reduce_settings.serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=0, window_increment=100_000).serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=1, window_increment=100_000).serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"response", flags=["END_STREAM"]).serialize(), ] ) with httpcore2.HTTP2Connection(origin=origin, stream=stream) as conn: response = conn.request("POST", "https://example.com/", content=b"x" * 100_000) assert response.status == 200 assert response.content == b"response" def test_http2_connection_with_flow_control() -> None: origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ hyperframe.frame.SettingsFrame().serialize(), # Available flow: 65,535 hyperframe.frame.WindowUpdateFrame(stream_id=0, window_increment=10_000).serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=1, window_increment=10_000).serialize(), # Available flow: 75,535 hyperframe.frame.WindowUpdateFrame(stream_id=0, window_increment=10_000).serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=1, window_increment=10_000).serialize(), # Available flow: 85,535 hyperframe.frame.WindowUpdateFrame(stream_id=0, window_increment=10_000).serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=1, window_increment=10_000).serialize(), # Available flow: 95,535 hyperframe.frame.WindowUpdateFrame(stream_id=0, window_increment=10_000).serialize(), hyperframe.frame.WindowUpdateFrame(stream_id=1, window_increment=10_000).serialize(), # Available flow: 105,535 hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"100,000 bytes received", flags=["END_STREAM"]).serialize(), ] ) with httpcore2.HTTP2Connection(origin=origin, stream=stream) as conn: response = conn.request( "POST", "https://example.com/", content=b"x" * 100_000, ) assert response.status == 200 assert response.content == b"100,000 bytes received" def test_http2_connection_attempt_close() -> None: """ A connection can only be closed when it is idle. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ] ) with httpcore2.HTTP2Connection(origin=origin, stream=stream) as conn: with conn.stream("GET", "https://example.com/") as response: response.read() assert response.status == 200 assert response.content == b"Hello, world!" conn.close() with pytest.raises(httpcore2.ConnectionNotAvailable): conn.request("GET", "https://example.com/") def test_http2_request_to_incorrect_origin() -> None: """ A connection can only send requests to whichever origin it is connected to. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream([]) with httpcore2.HTTP2Connection(origin=origin, stream=stream) as conn: with pytest.raises(RuntimeError): conn.request("GET", "https://other.com/") def test_http2_remote_max_streams_update() -> None: """ If the remote server updates the maximum concurrent streams value, we should be adjusting how many streams we will allow. """ origin = httpcore2.Origin(b"https", b"example.com", 443) stream = httpcore2.MockStream( [ hyperframe.frame.SettingsFrame( settings={hyperframe.frame.SettingsFrame.MAX_CONCURRENT_STREAMS: 1000} ).serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!").serialize(), hyperframe.frame.SettingsFrame( settings={hyperframe.frame.SettingsFrame.MAX_CONCURRENT_STREAMS: 50} ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world...again!", flags=["END_STREAM"]).serialize(), ] ) with httpcore2.HTTP2Connection(origin=origin, stream=stream) as conn: with conn.stream("GET", "https://example.com/") as response: i = 0 for chunk in response.iter_stream(): if i == 0: assert chunk == b"Hello, world!" assert conn._h2_state.remote_settings.max_concurrent_streams == 1000 assert conn._max_streams == min( conn._h2_state.remote_settings.max_concurrent_streams, conn._h2_state.local_settings.max_concurrent_streams, ) elif i == 1: assert chunk == b"Hello, world...again!" assert conn._h2_state.remote_settings.max_concurrent_streams == 50 assert conn._max_streams == min( conn._h2_state.remote_settings.max_concurrent_streams, conn._h2_state.local_settings.max_concurrent_streams, ) i += 1 pydantic-httpx2-9b7ee8e/tests/httpcore2/_sync/test_http_proxy.py000066400000000000000000000206331521723372100253150ustar00rootroot00000000000000import ssl import typing import hpack import hyperframe.frame import pytest from httpcore2 import ( SOCKET_OPTION, ConnectionPool, MockBackend, MockStream, NetworkStream, Origin, Proxy, ProxyError, ) def test_proxy_forwarding() -> None: """ Send an HTTP request via a proxy. """ network_backend = MockBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with ConnectionPool( proxy=Proxy("http://localhost:8080/"), max_connections=10, network_backend=network_backend, ) as proxy: # Sending an initial request, which once complete will return to the pool, IDLE. with proxy.stream("GET", "http://example.com/") as response: info = [repr(c) for c in proxy.connections] assert info == [ "" ] response.read() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in proxy.connections] assert info == [""] assert proxy.connections[0].is_idle() assert proxy.connections[0].is_available() assert not proxy.connections[0].is_closed() # A connection on a forwarding proxy can only handle HTTP requests to the same origin. assert proxy.connections[0].can_handle_request(Origin(b"http", b"example.com", 80)) assert not proxy.connections[0].can_handle_request(Origin(b"http", b"other.com", 80)) assert not proxy.connections[0].can_handle_request(Origin(b"https", b"example.com", 443)) assert not proxy.connections[0].can_handle_request(Origin(b"https", b"other.com", 443)) def test_proxy_tunneling() -> None: """ Send an HTTPS request via a proxy. """ network_backend = MockBackend( [ # The initial response to the proxy CONNECT b"HTTP/1.1 200 OK\r\n\r\n", # The actual response from the remote server b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with ConnectionPool( proxy=Proxy("http://localhost:8080/"), network_backend=network_backend, ) as proxy: # Sending an initial request, which once complete will return to the pool, IDLE. with proxy.stream("GET", "https://example.com/") as response: info = [repr(c) for c in proxy.connections] assert info == [ "" ] response.read() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in proxy.connections] assert info == [""] assert proxy.connections[0].is_idle() assert proxy.connections[0].is_available() assert not proxy.connections[0].is_closed() # A connection on a tunneled proxy can only handle HTTPS requests to the same origin. assert not proxy.connections[0].can_handle_request(Origin(b"http", b"example.com", 80)) assert not proxy.connections[0].can_handle_request(Origin(b"http", b"other.com", 80)) assert proxy.connections[0].can_handle_request(Origin(b"https", b"example.com", 443)) assert not proxy.connections[0].can_handle_request(Origin(b"https", b"other.com", 443)) # We need to adapt the mock backend here slightly in order to deal # with the proxy case. We do not want the initial connection to the proxy # to indicate an HTTP/2 connection, but we do want it to indicate HTTP/2 # once the SSL upgrade has taken place. class HTTP1ThenHTTP2Stream(MockStream): def start_tls( self, ssl_context: ssl.SSLContext, server_hostname: str | None = None, timeout: float | None = None, ) -> NetworkStream: self._http2 = True return self class HTTP1ThenHTTP2Backend(MockBackend): def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[SOCKET_OPTION] | None = None, ) -> NetworkStream: return HTTP1ThenHTTP2Stream(list(self._buffer)) def test_proxy_tunneling_http2() -> None: """ Send an HTTP/2 request via a proxy. """ network_backend = HTTP1ThenHTTP2Backend( [ # The initial response to the proxy CONNECT b"HTTP/1.1 200 OK\r\n\r\n", # The actual response from the remote server hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!", flags=["END_STREAM"]).serialize(), ], ) with ConnectionPool( proxy=Proxy("http://localhost:8080/"), network_backend=network_backend, http2=True, ) as proxy: # Sending an initial request, which once complete will return to the pool, IDLE. with proxy.stream("GET", "https://example.com/") as response: info = [repr(c) for c in proxy.connections] assert info == [""] response.read() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in proxy.connections] assert info == [""] assert proxy.connections[0].is_idle() assert proxy.connections[0].is_available() assert not proxy.connections[0].is_closed() # A connection on a tunneled proxy can only handle HTTPS requests to the same origin. assert not proxy.connections[0].can_handle_request(Origin(b"http", b"example.com", 80)) assert not proxy.connections[0].can_handle_request(Origin(b"http", b"other.com", 80)) assert proxy.connections[0].can_handle_request(Origin(b"https", b"example.com", 443)) assert not proxy.connections[0].can_handle_request(Origin(b"https", b"other.com", 443)) def test_proxy_tunneling_with_403() -> None: """ Send an HTTPS request via a proxy. """ network_backend = MockBackend( [ b"HTTP/1.1 403 Permission Denied\r\n\r\n", ] ) with ConnectionPool( proxy=Proxy("http://localhost:8080/"), network_backend=network_backend, ) as proxy: with pytest.raises(ProxyError) as exc_info: proxy.request("GET", "https://example.com/") assert str(exc_info.value) == "403 Permission Denied" assert not proxy.connections def test_proxy_tunneling_with_auth() -> None: """ Send an authenticated HTTPS request via a proxy. """ network_backend = MockBackend( [ # The initial response to the proxy CONNECT b"HTTP/1.1 200 OK\r\n\r\n", # The actual response from the remote server b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with ConnectionPool( proxy=Proxy( url="http://localhost:8080/", auth=("username", "password"), ), network_backend=network_backend, ) as proxy: response = proxy.request("GET", "https://example.com/") assert response.status == 200 assert response.content == b"Hello, world!" def test_proxy_headers() -> None: proxy = Proxy( url="http://localhost:8080/", auth=("username", "password"), ) assert proxy.headers == [(b"Proxy-Authorization", b"Basic dXNlcm5hbWU6cGFzc3dvcmQ=")] pydantic-httpx2-9b7ee8e/tests/httpcore2/_sync/test_integration.py000066400000000000000000000032321521723372100254140ustar00rootroot00000000000000import ssl import pytest from pytest_httpbin.serve import Server import httpcore2 def test_request(httpbin: Server) -> None: with httpcore2.ConnectionPool() as pool: response = pool.request("GET", httpbin.url) assert response.status == 200 def test_ssl_request(httpbin_secure: Server) -> None: ssl_context = ssl.create_default_context() ssl_context.check_hostname = False ssl_context.verify_mode = ssl.CERT_NONE with httpcore2.ConnectionPool(ssl_context=ssl_context) as pool: response = pool.request("GET", httpbin_secure.url) assert response.status == 200 def test_extra_info(httpbin_secure: Server) -> None: ssl_context = ssl.create_default_context() ssl_context.check_hostname = False ssl_context.verify_mode = ssl.CERT_NONE with httpcore2.ConnectionPool(ssl_context=ssl_context) as pool: with pool.stream("GET", httpbin_secure.url) as response: assert response.status == 200 stream = response.extensions["network_stream"] ssl_object = stream.get_extra_info("ssl_object") assert ssl_object.version() == "TLSv1.3" local_addr = stream.get_extra_info("client_addr") assert local_addr[0] == "127.0.0.1" remote_addr = stream.get_extra_info("server_addr") assert f"https://{remote_addr[0]}:{remote_addr[1]}" == httpbin_secure.url sock = stream.get_extra_info("socket") assert hasattr(sock, "family") assert hasattr(sock, "type") invalid = stream.get_extra_info("invalid") assert invalid is None stream.get_extra_info("is_readable") pydantic-httpx2-9b7ee8e/tests/httpcore2/_sync/test_socks_proxy.py000066400000000000000000000143041521723372100254560ustar00rootroot00000000000000import pytest import httpcore2 def test_socks5_request() -> None: """ Send an HTTP request via a SOCKS proxy. """ network_backend = httpcore2.MockBackend( [ # The initial socks CONNECT # v5 NOAUTH b"\x05\x00", # v5 SUC RSV IP4 127 .0 .0 .1 :80 b"\x05\x00\x00\x01\xff\x00\x00\x01\x00\x50", # The actual response from the remote server b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.ConnectionPool( proxy=httpcore2.Proxy("socks5://localhost:8080/"), network_backend=network_backend, ) as proxy: # Sending an initial request, which once complete will return to the pool, IDLE. with proxy.stream("GET", "https://example.com/") as response: info = [repr(c) for c in proxy.connections] assert info == [""] response.read() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in proxy.connections] assert info == [""] assert proxy.connections[0].is_idle() assert proxy.connections[0].is_available() assert not proxy.connections[0].is_closed() # A connection on a tunneled proxy can only handle HTTPS requests to the same origin. assert not proxy.connections[0].can_handle_request(httpcore2.Origin(b"http", b"example.com", 80)) assert not proxy.connections[0].can_handle_request(httpcore2.Origin(b"http", b"other.com", 80)) assert proxy.connections[0].can_handle_request(httpcore2.Origin(b"https", b"example.com", 443)) assert not proxy.connections[0].can_handle_request(httpcore2.Origin(b"https", b"other.com", 443)) def test_authenticated_socks5_request() -> None: """ Send an HTTP request via a SOCKS proxy. """ network_backend = httpcore2.MockBackend( [ # The initial socks CONNECT # v5 USERNAME/PASSWORD b"\x05\x02", # v1 VALID USERNAME/PASSWORD b"\x01\x00", # v5 SUC RSV IP4 127 .0 .0 .1 :80 b"\x05\x00\x00\x01\xff\x00\x00\x01\x00\x50", # The actual response from the remote server b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 13\r\n", b"\r\n", b"Hello, world!", ] ) with httpcore2.ConnectionPool( proxy=httpcore2.Proxy( url="socks5://localhost:8080/", auth=(b"username", b"password"), ), network_backend=network_backend, ) as proxy: # Sending an initial request, which once complete will return to the pool, IDLE. with proxy.stream("GET", "https://example.com/") as response: info = [repr(c) for c in proxy.connections] assert info == [""] response.read() assert response.status == 200 assert response.content == b"Hello, world!" info = [repr(c) for c in proxy.connections] assert info == [""] assert proxy.connections[0].is_idle() assert proxy.connections[0].is_available() assert not proxy.connections[0].is_closed() def test_socks5_request_connect_failed() -> None: """ Attempt to send an HTTP request via a SOCKS proxy, resulting in a connect failure. """ network_backend = httpcore2.MockBackend( [ # The initial socks CONNECT # v5 NOAUTH b"\x05\x00", # v5 NO RSV IP4 0 .0 .0 .0 :00 b"\x05\x05\x00\x01\x00\x00\x00\x00\x00\x00", ] ) with httpcore2.ConnectionPool( proxy=httpcore2.Proxy("socks5://localhost:8080/"), network_backend=network_backend, ) as proxy: # Sending a request, which the proxy rejects with pytest.raises(httpcore2.ProxyError) as exc_info: proxy.request("GET", "https://example.com/") assert str(exc_info.value) == "Proxy Server could not connect: Connection refused." assert not proxy.connections def test_socks5_request_failed_to_provide_auth() -> None: """ Attempt to send an HTTP request via an authenticated SOCKS proxy, without providing authentication credentials. """ network_backend = httpcore2.MockBackend( [ # v5 USERNAME/PASSWORD b"\x05\x02", ] ) with httpcore2.ConnectionPool( proxy=httpcore2.Proxy("socks5://localhost:8080/"), network_backend=network_backend, ) as proxy: # Sending a request, which the proxy rejects with pytest.raises(httpcore2.ProxyError) as exc_info: proxy.request("GET", "https://example.com/") assert ( str(exc_info.value) == "Requested NO AUTHENTICATION REQUIRED from proxy server, but got USERNAME/PASSWORD." ) assert not proxy.connections def test_socks5_request_incorrect_auth() -> None: """ Attempt to send an HTTP request via an authenticated SOCKS proxy, with incorrect authentication credentials. """ network_backend = httpcore2.MockBackend( [ # v5 USERNAME/PASSWORD b"\x05\x02", # v1 INVALID USERNAME/PASSWORD b"\x01\x01", ] ) with httpcore2.ConnectionPool( proxy=httpcore2.Proxy( url="socks5://localhost:8080/", auth=(b"invalid", b"invalid"), ), network_backend=network_backend, ) as proxy: # Sending a request, which the proxy rejects with pytest.raises(httpcore2.ProxyError) as exc_info: proxy.request("GET", "https://example.com/") assert str(exc_info.value) == "Invalid username/password" assert not proxy.connections pydantic-httpx2-9b7ee8e/tests/httpcore2/benchmark/000077500000000000000000000000001521723372100222775ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpcore2/benchmark/client.py000066400000000000000000000131621521723372100241320ustar00rootroot00000000000000import asyncio import os import sys import time from collections.abc import Callable, Coroutine, Generator, Iterator from concurrent.futures import ThreadPoolExecutor from contextlib import contextmanager from typing import Any import aiohttp import matplotlib.pyplot as plt import pyinstrument import urllib3 from matplotlib.axes import Axes import httpcore2 PORT = 1234 URL = f"http://localhost:{PORT}/req" REPEATS = 10 REQUESTS = 500 CONCURRENCY = 20 POOL_LIMIT = 100 PROFILE = False os.environ["HTTPCORE_PREFER_ANYIO"] = "0" def duration(start: float) -> int: return int((time.monotonic() - start) * 1000) @contextmanager def profile() -> Generator[None]: if not PROFILE: yield return with pyinstrument.Profiler() as profiler: yield profiler.open_in_browser() async def run_async_requests(axis: Axes) -> None: async def gather_limited_concurrency( coros: Iterator[Coroutine[Any, Any, Any]], concurrency: int = CONCURRENCY ) -> None: sem = asyncio.Semaphore(concurrency) async def coro_with_sem(coro: Coroutine[Any, Any, Any]) -> None: async with sem: await coro await asyncio.gather(*(coro_with_sem(c) for c in coros)) async def httpcore_get(pool: httpcore2.AsyncConnectionPool, timings: list[int]) -> None: start = time.monotonic() res = await pool.request("GET", URL) assert len(await res.aread()) == 2000 assert res.status == 200, f"status_code={res.status}" timings.append(duration(start)) async def aiohttp_get(session: aiohttp.ClientSession, timings: list[int]) -> None: start = time.monotonic() async with session.request("GET", URL) as res: assert len(await res.read()) == 2000 assert res.status == 200, f"status={res.status}" timings.append(duration(start)) async with httpcore2.AsyncConnectionPool(max_connections=POOL_LIMIT) as pool: # warmup await gather_limited_concurrency((httpcore_get(pool, []) for _ in range(REQUESTS)), CONCURRENCY * 2) timings: list[int] = [] start = time.monotonic() with profile(): for _ in range(REPEATS): await gather_limited_concurrency(httpcore_get(pool, timings) for _ in range(REQUESTS)) axis.plot([*range(len(timings))], timings, label=f"httpcore (tot={duration(start)}ms)") connector = aiohttp.TCPConnector(limit=POOL_LIMIT) async with aiohttp.ClientSession(connector=connector) as session: # warmup await gather_limited_concurrency((aiohttp_get(session, []) for _ in range(REQUESTS)), CONCURRENCY * 2) timings = [] start = time.monotonic() for _ in range(REPEATS): await gather_limited_concurrency(aiohttp_get(session, timings) for _ in range(REQUESTS)) axis.plot([*range(len(timings))], timings, label=f"aiohttp (tot={duration(start)}ms)") def run_sync_requests(axis: Axes) -> None: def run_in_executor(fns: Iterator[Callable[[], None]], executor: ThreadPoolExecutor) -> None: futures = [executor.submit(fn) for fn in fns] for future in futures: future.result() def httpcore_get(pool: httpcore2.ConnectionPool, timings: list[int]) -> None: start = time.monotonic() res = pool.request("GET", URL) assert len(res.read()) == 2000 assert res.status == 200, f"status_code={res.status}" timings.append(duration(start)) def urllib3_get(pool: urllib3.HTTPConnectionPool, timings: list[int]) -> None: start = time.monotonic() res = pool.request("GET", "/req") assert len(res.data) == 2000 assert res.status == 200, f"status={res.status}" timings.append(duration(start)) with httpcore2.ConnectionPool(max_connections=POOL_LIMIT) as pool: # warmup with ThreadPoolExecutor(max_workers=CONCURRENCY * 2) as exec: run_in_executor( (lambda: httpcore_get(pool, []) for _ in range(REQUESTS)), exec, ) timings: list[int] = [] exec = ThreadPoolExecutor(max_workers=CONCURRENCY) start = time.monotonic() with profile(): for _ in range(REPEATS): run_in_executor((lambda: httpcore_get(pool, timings) for _ in range(REQUESTS)), exec) exec.shutdown(wait=True) axis.plot([*range(len(timings))], timings, label=f"httpcore (tot={duration(start)}ms)") with urllib3.HTTPConnectionPool("localhost", PORT, maxsize=POOL_LIMIT) as urllib3_pool: # warmup with ThreadPoolExecutor(max_workers=CONCURRENCY * 2) as exec: run_in_executor( (lambda: urllib3_get(urllib3_pool, []) for _ in range(REQUESTS)), exec, ) timings = [] exec = ThreadPoolExecutor(max_workers=CONCURRENCY) start = time.monotonic() for _ in range(REPEATS): run_in_executor( (lambda: urllib3_get(urllib3_pool, timings) for _ in range(REQUESTS)), exec, ) exec.shutdown(wait=True) axis.plot([*range(len(timings))], timings, label=f"urllib3 (tot={duration(start)}ms)") def main() -> None: mode = sys.argv[1] if len(sys.argv) == 2 else None assert mode in ("async", "sync"), "Usage: python client.py " _fig, ax = plt.subplots() if mode == "async": asyncio.run(run_async_requests(ax)) else: run_sync_requests(ax) plt.legend(loc="upper left") ax.set_xlabel("# request") ax.set_ylabel("[ms]") plt.show() print("DONE", flush=True) if __name__ == "__main__": main() pydantic-httpx2-9b7ee8e/tests/httpcore2/benchmark/server.py000066400000000000000000000021171521723372100241600ustar00rootroot00000000000000import asyncio from collections.abc import Awaitable, Callable from typing import Any import uvicorn PORT = 1234 RESP = b"a" * 2000 SLEEP = 0.01 async def app( scope: dict[str, Any], receive: Callable[[], Awaitable[dict[str, Any]]], send: Callable[[dict[str, Any]], Awaitable[None]], ) -> None: assert scope["type"] == "http" assert scope["path"] == "/req" assert not (await receive()).get("more_body", False) await asyncio.sleep(SLEEP) await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"text/plain"]], } ) await send( { "type": "http.response.body", "body": RESP, } ) if __name__ == "__main__": uvicorn.run( app, port=PORT, log_level="error", # Keep warmed up connections alive during the test to have consistent results across test runs. # This avoids timing differences with connections getting closed and reopened in the background. timeout_keep_alive=100, ) pydantic-httpx2-9b7ee8e/tests/httpcore2/concurrency.py000066400000000000000000000022701521723372100232520ustar00rootroot00000000000000""" Some of our tests require branching of flow control. We'd like to have the same kind of test for both async and sync environments, and so we have functionality here that replicate's Trio's `open_nursery` API, but in a plain old multi-threaded context. We don't do any smarts around cancellations, or managing exceptions from children, because we don't need that for our use-case. """ import threading from collections.abc import Callable from types import TracebackType from typing import Any class Nursery: def __init__(self) -> None: self._threads: list[threading.Thread] = [] def __enter__(self) -> "Nursery": return self def __exit__( self, exc_type: type[BaseException] | None = None, exc_value: BaseException | None = None, traceback: TracebackType | None = None, ) -> None: for thread in self._threads: thread.start() for thread in self._threads: thread.join() def start_soon(self, func: Callable[..., object], *args: Any) -> None: thread = threading.Thread(target=func, args=args) self._threads.append(thread) def open_nursery() -> Nursery: return Nursery() pydantic-httpx2-9b7ee8e/tests/httpcore2/test_api.py000066400000000000000000000011461521723372100225310ustar00rootroot00000000000000import json from pytest_httpbin.serve import Server import httpcore2 def test_request(httpbin: Server) -> None: response = httpcore2.request("GET", httpbin.url) assert response.status == 200 def test_stream(httpbin: Server) -> None: with httpcore2.stream("GET", httpbin.url) as response: assert response.status == 200 def test_request_with_content(httpbin: Server) -> None: url = f"{httpbin.url}/post" response = httpcore2.request("POST", url, content=b'{"hello":"world"}') assert response.status == 200 assert json.loads(response.content)["json"] == {"hello": "world"} pydantic-httpx2-9b7ee8e/tests/httpcore2/test_cancellations.py000066400000000000000000000163711521723372100246050ustar00rootroot00000000000000import typing import anyio import hpack import hyperframe.frame import pytest import httpcore2 class SlowWriteStream(httpcore2.AsyncNetworkStream): """ A stream that we can use to test cancellations during the request writing. """ async def write(self, buffer: bytes, timeout: float | None = None) -> None: await anyio.sleep(999) async def aclose(self) -> None: await anyio.sleep(0) class HandshakeThenSlowWriteStream(httpcore2.AsyncNetworkStream): """ A stream that we can use to test cancellations during the HTTP/2 request writing, after allowing the initial handshake to complete. """ def __init__(self) -> None: self._handshake_complete = False async def write(self, buffer: bytes, timeout: float | None = None) -> None: if not self._handshake_complete: self._handshake_complete = True else: await anyio.sleep(999) async def aclose(self) -> None: await anyio.sleep(0) class SlowReadStream(httpcore2.AsyncNetworkStream): """ A stream that we can use to test cancellations during the response reading. """ def __init__(self, buffer: list[bytes]): self._buffer = buffer async def write(self, buffer: bytes, timeout: float | None = None) -> None: pass async def read(self, max_bytes: int, timeout: float | None = None) -> bytes: if not self._buffer: await anyio.sleep(999) return self._buffer.pop(0) async def aclose(self) -> None: await anyio.sleep(0) class SlowWriteBackend(httpcore2.AsyncNetworkBackend): async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[httpcore2.SOCKET_OPTION] | None = None, ) -> httpcore2.AsyncNetworkStream: return SlowWriteStream() class SlowReadBackend(httpcore2.AsyncNetworkBackend): def __init__(self, buffer: list[bytes]): self._buffer = buffer async def connect_tcp( self, host: str, port: int, timeout: float | None = None, local_address: str | None = None, socket_options: typing.Iterable[httpcore2.SOCKET_OPTION] | None = None, ) -> httpcore2.AsyncNetworkStream: return SlowReadStream(self._buffer) @pytest.mark.anyio async def test_connection_pool_timeout_during_request() -> None: """ An async timeout when writing an HTTP/1.1 response on the connection pool should leave the pool in a consistent state. In this case, that means the connection will become closed, and no longer remain in the pool. """ network_backend = SlowWriteBackend() async with httpcore2.AsyncConnectionPool(network_backend=network_backend) as pool: with anyio.move_on_after(0.01): await pool.request("GET", "http://example.com") assert not pool.connections @pytest.mark.anyio async def test_connection_pool_timeout_during_response() -> None: """ An async timeout when reading an HTTP/1.1 response on the connection pool should leave the pool in a consistent state. In this case, that means the connection will become closed, and no longer remain in the pool. """ network_backend = SlowReadBackend( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 1000\r\n", b"\r\n", b"Hello, world!...", ] ) async with httpcore2.AsyncConnectionPool(network_backend=network_backend) as pool: with anyio.move_on_after(0.01): await pool.request("GET", "http://example.com") assert not pool.connections @pytest.mark.anyio async def test_h11_timeout_during_request() -> None: """ An async timeout on an HTTP/1.1 during the request writing should leave the connection in a neatly closed state. """ origin = httpcore2.Origin(b"http", b"example.com", 80) stream = SlowWriteStream() async with httpcore2.AsyncHTTP11Connection(origin, stream) as conn: with anyio.move_on_after(0.01): await conn.request("GET", "http://example.com") assert conn.is_closed() @pytest.mark.anyio async def test_h11_timeout_during_response() -> None: """ An async timeout on an HTTP/1.1 during the response reading should leave the connection in a neatly closed state. """ origin = httpcore2.Origin(b"http", b"example.com", 80) stream = SlowReadStream( [ b"HTTP/1.1 200 OK\r\n", b"Content-Type: plain/text\r\n", b"Content-Length: 1000\r\n", b"\r\n", b"Hello, world!...", ] ) async with httpcore2.AsyncHTTP11Connection(origin, stream) as conn: with anyio.move_on_after(0.01): await conn.request("GET", "http://example.com") assert conn.is_closed() @pytest.mark.anyio async def test_h2_timeout_during_handshake() -> None: """ An async timeout on an HTTP/2 during the initial handshake should leave the connection in a neatly closed state. """ origin = httpcore2.Origin(b"http", b"example.com", 80) stream = SlowWriteStream() async with httpcore2.AsyncHTTP2Connection(origin, stream) as conn: with anyio.move_on_after(0.01): await conn.request("GET", "http://example.com") assert conn.is_closed() @pytest.mark.anyio async def test_h2_timeout_during_request() -> None: """ An async timeout on an HTTP/2 during a request should leave the connection in a neatly idle state. The connection is not closed because it is multiplexed, and a timeout on one request does not require the entire connection be closed. """ origin = httpcore2.Origin(b"http", b"example.com", 80) stream = HandshakeThenSlowWriteStream() async with httpcore2.AsyncHTTP2Connection(origin, stream) as conn: with anyio.move_on_after(0.01): await conn.request("GET", "http://example.com") assert not conn.is_closed() assert conn.is_idle() @pytest.mark.anyio async def test_h2_timeout_during_response() -> None: """ An async timeout on an HTTP/2 during the response reading should leave the connection in a neatly idle state. The connection is not closed because it is multiplexed, and a timeout on one request does not require the entire connection be closed. """ origin = httpcore2.Origin(b"http", b"example.com", 80) stream = SlowReadStream( [ hyperframe.frame.SettingsFrame().serialize(), hyperframe.frame.HeadersFrame( stream_id=1, data=hpack.Encoder().encode( [ (b":status", b"200"), (b"content-type", b"plain/text"), ] ), flags=["END_HEADERS"], ).serialize(), hyperframe.frame.DataFrame(stream_id=1, data=b"Hello, world!...", flags=[]).serialize(), ] ) async with httpcore2.AsyncHTTP2Connection(origin, stream) as conn: with anyio.move_on_after(0.01): await conn.request("GET", "http://example.com") assert not conn.is_closed() assert conn.is_idle() pydantic-httpx2-9b7ee8e/tests/httpcore2/test_models.py000066400000000000000000000135721521723372100232510ustar00rootroot00000000000000import typing import pytest import httpcore2 # URL def test_url() -> None: url = httpcore2.URL("https://www.example.com/") assert url == httpcore2.URL(scheme="https", host="www.example.com", port=None, target="/") assert bytes(url) == b"https://www.example.com/" def test_url_with_port() -> None: url = httpcore2.URL("https://www.example.com:443/") assert url == httpcore2.URL(scheme="https", host="www.example.com", port=443, target="/") assert bytes(url) == b"https://www.example.com:443/" def test_url_with_invalid_argument() -> None: with pytest.raises(TypeError) as exc_info: httpcore2.URL(123) # type: ignore assert str(exc_info.value) == "url must be bytes or str, but got int." def test_url_cannot_include_unicode_strings() -> None: """ URLs instantiated with strings outside of the plain ASCII range are disallowed, but the explicit style allows for these ambiguous cases to be precisely expressed. """ with pytest.raises(TypeError) as exc_info: httpcore2.URL("https://www.example.com/☺") assert str(exc_info.value) == "url strings may not include unicode characters." httpcore2.URL(scheme=b"https", host=b"www.example.com", target="/☺".encode()) def test_url_origin_socks5() -> None: url = httpcore2.URL("socks5://127.0.0.1") origin = url.origin assert origin == httpcore2.Origin(scheme=b"socks5", host=b"127.0.0.1", port=1080) assert str(origin) == "socks5://127.0.0.1:1080" url = httpcore2.URL("socks5h://127.0.0.1") origin = url.origin assert origin == httpcore2.Origin(scheme=b"socks5h", host=b"127.0.0.1", port=1080) assert str(origin) == "socks5h://127.0.0.1:1080" # Request def test_request() -> None: request = httpcore2.Request("GET", "https://www.example.com/") assert request.method == b"GET" assert request.url == httpcore2.URL("https://www.example.com/") assert request.headers == [] assert request.extensions == {} assert repr(request) == "" assert repr(request.url) == "URL(scheme=b'https', host=b'www.example.com', port=None, target=b'/')" assert repr(request.stream) == "" def test_request_with_target_extension() -> None: extensions = {"target": b"/another_path"} request = httpcore2.Request("GET", "https://www.example.com/path", extensions=extensions) assert request.url.target == b"/another_path" extensions = {"target": b"/unescaped|path"} request = httpcore2.Request("GET", "https://www.example.com/path", extensions=extensions) assert request.url.target == b"/unescaped|path" def test_request_with_invalid_method() -> None: with pytest.raises(TypeError) as exc_info: httpcore2.Request(123, "https://www.example.com/") # type: ignore assert str(exc_info.value) == "method must be bytes or str, but got int." def test_request_with_invalid_url() -> None: with pytest.raises(TypeError) as exc_info: httpcore2.Request("GET", 123) # type: ignore assert str(exc_info.value) == "url must be a URL, bytes, or str, but got int." def test_request_with_invalid_headers() -> None: with pytest.raises(TypeError) as exc_info: httpcore2.Request("GET", "https://www.example.com/", headers=123) # type: ignore assert str(exc_info.value) == "headers must be a mapping or sequence of two-tuples, but got int." # Response def test_response() -> None: response = httpcore2.Response(200) assert response.status == 200 assert response.headers == [] assert response.extensions == {} assert repr(response) == "" assert repr(response.stream) == "" # Tests for reading and streaming sync byte streams... class ByteIterator: def __init__(self, chunks: list[bytes]) -> None: self._chunks = chunks def __iter__(self) -> typing.Iterator[bytes]: yield from self._chunks def test_response_sync_read() -> None: stream = ByteIterator([b"Hello, ", b"world!"]) response = httpcore2.Response(200, content=stream) assert response.read() == b"Hello, world!" assert response.content == b"Hello, world!" def test_response_sync_streaming() -> None: stream = ByteIterator([b"Hello, ", b"world!"]) response = httpcore2.Response(200, content=stream) content = b"".join(list(response.iter_stream())) assert content == b"Hello, world!" # We streamed the response rather than reading it, so .content is not available. with pytest.raises(RuntimeError): _ = response.content # Once we've streamed the response, we can't access the stream again. with pytest.raises(RuntimeError): for _chunk in response.iter_stream(): pass # pragma: no cover # Tests for reading and streaming async byte streams... class AsyncByteIterator: def __init__(self, chunks: list[bytes]) -> None: self._chunks = chunks async def __aiter__(self) -> typing.AsyncIterator[bytes]: for chunk in self._chunks: yield chunk @pytest.mark.trio async def test_response_async_read() -> None: stream = AsyncByteIterator([b"Hello, ", b"world!"]) response = httpcore2.Response(200, content=stream) assert await response.aread() == b"Hello, world!" assert response.content == b"Hello, world!" @pytest.mark.trio async def test_response_async_streaming() -> None: stream = AsyncByteIterator([b"Hello, ", b"world!"]) response = httpcore2.Response(200, content=stream) content = b"".join([chunk async for chunk in response.aiter_stream()]) assert content == b"Hello, world!" # We streamed the response rather than reading it, so .content is not available. with pytest.raises(RuntimeError): _ = response.content # Once we've streamed the response, we can't access the stream again. with pytest.raises(RuntimeError): async for _chunk in response.aiter_stream(): pass # pragma: no cover pydantic-httpx2-9b7ee8e/tests/httpx2/000077500000000000000000000000001521723372100176645ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpx2/__init__.py000066400000000000000000000000001521723372100217630ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpx2/client/000077500000000000000000000000001521723372100211425ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpx2/client/__init__.py000066400000000000000000000000001521723372100232410ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpx2/client/test_async_client.py000066400000000000000000000300421521723372100252250ustar00rootroot00000000000000from __future__ import annotations import typing from datetime import timedelta import pytest import httpx2 if typing.TYPE_CHECKING: from conftest import TestServer @pytest.mark.anyio async def test_get(server: TestServer) -> None: url = server.url async with httpx2.AsyncClient(http2=True) as client: response = await client.get(url) assert response.status_code == 200 assert response.text == "Hello, world!" assert response.http_version == "HTTP/1.1" assert response.headers assert repr(response) == "" assert response.elapsed > timedelta(seconds=0) @pytest.mark.parametrize( "url", [ pytest.param("invalid://example.org", id="scheme-not-http(s)"), pytest.param("://example.org", id="no-scheme"), pytest.param("http://", id="no-host"), ], ) @pytest.mark.anyio async def test_get_invalid_url(server: TestServer, url: str) -> None: async with httpx2.AsyncClient() as client: with pytest.raises((httpx2.UnsupportedProtocol, httpx2.LocalProtocolError)): await client.get(url) @pytest.mark.anyio async def test_build_request(server: TestServer) -> None: url = server.url.copy_with(path="/echo_headers") headers = {"Custom-header": "value"} async with httpx2.AsyncClient() as client: request = client.build_request("GET", url) request.headers.update(headers) response = await client.send(request) assert response.status_code == 200 assert response.url == url assert response.json()["Custom-header"] == "value" @pytest.mark.anyio async def test_post(server: TestServer) -> None: url = server.url async with httpx2.AsyncClient() as client: response = await client.post(url, content=b"Hello, world!") assert response.status_code == 200 @pytest.mark.anyio async def test_post_json(server: TestServer) -> None: url = server.url async with httpx2.AsyncClient() as client: response = await client.post(url, json={"text": "Hello, world!"}) assert response.status_code == 200 @pytest.mark.anyio async def test_stream_response(server: TestServer) -> None: async with httpx2.AsyncClient() as client: async with client.stream("GET", server.url) as response: body = await response.aread() assert response.status_code == 200 assert body == b"Hello, world!" assert response.content == b"Hello, world!" @pytest.mark.anyio async def test_access_content_stream_response(server: TestServer) -> None: async with httpx2.AsyncClient() as client: async with client.stream("GET", server.url) as response: pass assert response.status_code == 200 with pytest.raises(httpx2.ResponseNotRead): response.content # noqa: B018 @pytest.mark.anyio async def test_stream_request(server: TestServer) -> None: async def hello_world() -> typing.AsyncIterator[bytes]: yield b"Hello, " yield b"world!" async with httpx2.AsyncClient() as client: response = await client.post(server.url, content=hello_world()) assert response.status_code == 200 @pytest.mark.anyio async def test_cannot_stream_sync_request(server: TestServer) -> None: def hello_world() -> typing.Iterator[bytes]: # pragma: no cover yield b"Hello, " yield b"world!" async with httpx2.AsyncClient() as client: with pytest.raises(RuntimeError): await client.post(server.url, content=hello_world()) @pytest.mark.anyio async def test_raise_for_status(server: TestServer) -> None: async with httpx2.AsyncClient() as client: for status_code in (200, 400, 404, 500, 505): response = await client.request("GET", server.url.copy_with(path=f"/status/{status_code}")) if 400 <= status_code < 600: with pytest.raises(httpx2.HTTPStatusError) as exc_info: response.raise_for_status() assert exc_info.value.response == response else: assert response.raise_for_status() is response @pytest.mark.anyio async def test_options(server: TestServer) -> None: async with httpx2.AsyncClient() as client: response = await client.options(server.url) assert response.status_code == 200 assert response.text == "Hello, world!" @pytest.mark.anyio async def test_head(server: TestServer) -> None: async with httpx2.AsyncClient() as client: response = await client.head(server.url) assert response.status_code == 200 assert response.text == "" @pytest.mark.anyio async def test_put(server: TestServer) -> None: async with httpx2.AsyncClient() as client: response = await client.put(server.url, content=b"Hello, world!") assert response.status_code == 200 @pytest.mark.anyio async def test_patch(server: TestServer) -> None: async with httpx2.AsyncClient() as client: response = await client.patch(server.url, content=b"Hello, world!") assert response.status_code == 200 @pytest.mark.anyio async def test_delete(server: TestServer) -> None: async with httpx2.AsyncClient() as client: response = await client.delete(server.url) assert response.status_code == 200 assert response.text == "Hello, world!" @pytest.mark.anyio async def test_100_continue(server: TestServer) -> None: headers = {"Expect": "100-continue"} content = b"Echo request body" async with httpx2.AsyncClient() as client: response = await client.post(server.url.copy_with(path="/echo_body"), headers=headers, content=content) assert response.status_code == 200 assert response.content == content @pytest.mark.anyio async def test_context_managed_transport() -> None: class Transport(httpx2.AsyncBaseTransport): def __init__(self) -> None: self.events: list[str] = [] async def aclose(self) -> None: # The base implementation of httpx2.AsyncBaseTransport just # calls into `.aclose`, so simple transport cases can just override # this method for any cleanup, where more complex cases # might want to additionally override `__aenter__`/`__aexit__`. self.events.append("transport.aclose") async def __aenter__(self) -> Transport: await super().__aenter__() self.events.append("transport.__aenter__") return self async def __aexit__(self, *args: typing.Any) -> None: await super().__aexit__(*args) self.events.append("transport.__aexit__") transport = Transport() async with httpx2.AsyncClient(transport=transport): pass assert transport.events == [ "transport.__aenter__", "transport.aclose", "transport.__aexit__", ] @pytest.mark.anyio async def test_context_managed_transport_and_mount() -> None: class Transport(httpx2.AsyncBaseTransport): def __init__(self, name: str) -> None: self.name: str = name self.events: list[str] = [] async def aclose(self) -> None: # The base implementation of httpx2.AsyncBaseTransport just # calls into `.aclose`, so simple transport cases can just override # this method for any cleanup, where more complex cases # might want to additionally override `__aenter__`/`__aexit__`. self.events.append(f"{self.name}.aclose") async def __aenter__(self) -> Transport: await super().__aenter__() self.events.append(f"{self.name}.__aenter__") return self async def __aexit__(self, *args: typing.Any) -> None: await super().__aexit__(*args) self.events.append(f"{self.name}.__aexit__") transport = Transport(name="transport") mounted = Transport(name="mounted") async with httpx2.AsyncClient(transport=transport, mounts={"http://www.example.org": mounted}): pass assert transport.events == [ "transport.__aenter__", "transport.aclose", "transport.__aexit__", ] assert mounted.events == [ "mounted.__aenter__", "mounted.aclose", "mounted.__aexit__", ] def hello_world(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, text="Hello, world!") @pytest.mark.anyio async def test_client_closed_state_using_implicit_open() -> None: client = httpx2.AsyncClient(transport=httpx2.MockTransport(hello_world)) assert not client.is_closed await client.get("http://example.com") assert not client.is_closed await client.aclose() assert client.is_closed # Once we're close we cannot make any more requests. with pytest.raises(RuntimeError): await client.get("http://example.com") # Once we're closed we cannot reopen the client. with pytest.raises(RuntimeError): async with client: pass # pragma: no cover @pytest.mark.anyio async def test_client_closed_state_using_with_block() -> None: transport = httpx2.MockTransport(hello_world) async with httpx2.AsyncClient(transport=transport) as client: assert not client.is_closed await client.get("http://example.com") assert client.is_closed with pytest.raises(RuntimeError): await client.get("http://example.com") def unmounted(request: httpx2.Request) -> httpx2.Response: data = {"app": "unmounted"} return httpx2.Response(200, json=data) def mounted(request: httpx2.Request) -> httpx2.Response: data = {"app": "mounted"} return httpx2.Response(200, json=data) @pytest.mark.anyio async def test_mounted_transport() -> None: transport = httpx2.MockTransport(unmounted) mounts = {"custom://": httpx2.MockTransport(mounted)} async with httpx2.AsyncClient(transport=transport, mounts=mounts) as client: response = await client.get("https://www.example.com") assert response.status_code == 200 assert response.json() == {"app": "unmounted"} response = await client.get("custom://www.example.com") assert response.status_code == 200 assert response.json() == {"app": "mounted"} @pytest.mark.anyio async def test_async_mock_transport() -> None: async def hello_world(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, text="Hello, world!") transport = httpx2.MockTransport(hello_world) async with httpx2.AsyncClient(transport=transport) as client: response = await client.get("https://www.example.com") assert response.status_code == 200 assert response.text == "Hello, world!" @pytest.mark.anyio async def test_cancellation_during_stream() -> None: """ If any BaseException is raised during streaming the response, then the stream should be closed. This includes: * `asyncio.CancelledError` (A subclass of BaseException from Python 3.8 onwards.) * `trio.Cancelled` * `KeyboardInterrupt` * `SystemExit` See https://github.com/encode/httpx/issues/2139 """ stream_was_closed = False def response_with_cancel_during_stream(request: httpx2.Request) -> httpx2.Response: class CancelledStream(httpx2.AsyncByteStream): async def __aiter__(self) -> typing.AsyncIterator[bytes]: yield b"Hello" raise KeyboardInterrupt() yield b", world" # pragma: no cover async def aclose(self) -> None: nonlocal stream_was_closed stream_was_closed = True return httpx2.Response(200, headers={"Content-Length": "12"}, stream=CancelledStream()) transport = httpx2.MockTransport(response_with_cancel_during_stream) async with httpx2.AsyncClient(transport=transport) as client: with pytest.raises(KeyboardInterrupt): await client.get("https://www.example.com") assert stream_was_closed @pytest.mark.anyio async def test_server_extensions(server: TestServer) -> None: url = server.url async with httpx2.AsyncClient(http2=True) as client: response = await client.get(url) assert response.status_code == 200 assert response.extensions["http_version"] == b"HTTP/1.1" pydantic-httpx2-9b7ee8e/tests/httpx2/client/test_auth.py000066400000000000000000000607541521723372100235300ustar00rootroot00000000000000""" Integration tests for authentication. Unit tests for auth classes also exist in tests/test_auth.py """ import hashlib import netrc import os import sys import threading import typing from urllib.request import parse_keqv_list import anyio import pytest import httpx2 from ..common import FIXTURES_DIR class App: """ A mock app to test auth credentials. """ def __init__(self, auth_header: str = "", status_code: int = 200) -> None: self.auth_header = auth_header self.status_code = status_code def __call__(self, request: httpx2.Request) -> httpx2.Response: headers = {"www-authenticate": self.auth_header} if self.auth_header else {} data = {"auth": request.headers.get("Authorization")} return httpx2.Response(self.status_code, headers=headers, json=data) class DigestApp: def __init__( self, algorithm: str = "SHA-256", send_response_after_attempt: int = 1, qop: str = "auth", regenerate_nonce: bool = True, ) -> None: self.algorithm = algorithm self.send_response_after_attempt = send_response_after_attempt self.qop = qop self._regenerate_nonce = regenerate_nonce self._response_count = 0 def __call__(self, request: httpx2.Request) -> httpx2.Response: if self._response_count < self.send_response_after_attempt: return self.challenge_send(request) data = {"auth": request.headers.get("Authorization")} return httpx2.Response(200, json=data) def challenge_send(self, request: httpx2.Request) -> httpx2.Response: self._response_count += 1 nonce = ( hashlib.sha256(os.urandom(8)).hexdigest() if self._regenerate_nonce else "ee96edced2a0b43e4869e96ebe27563f369c1205a049d06419bb51d8aeddf3d3" ) challenge_data = { "nonce": nonce, "qop": self.qop, "opaque": ("ee6378f3ee14ebfd2fff54b70a91a7c9390518047f242ab2271380db0e14bda1"), "algorithm": self.algorithm, "stale": "FALSE", } challenge_str = ", ".join(f'{key}="{value}"' for key, value in challenge_data.items() if value) headers = { "www-authenticate": f'Digest realm="httpx@example.org", {challenge_str}', } return httpx2.Response(401, headers=headers) class RepeatAuth(httpx2.Auth): """ A mock authentication scheme that requires clients to send the request a fixed number of times, and then send a last request containing an aggregation of nonces that the server sent in 'WWW-Authenticate' headers of intermediate responses. """ requires_request_body = True def __init__(self, repeat: int) -> None: self.repeat = repeat def auth_flow(self, request: httpx2.Request) -> typing.Generator[httpx2.Request, httpx2.Response, None]: nonces: list[str] = [] for index in range(self.repeat): request.headers["Authorization"] = f"Repeat {index}" response = yield request nonces.append(response.headers["www-authenticate"]) key = ".".join(nonces) request.headers["Authorization"] = f"Repeat {key}" yield request class ResponseBodyAuth(httpx2.Auth): """ A mock authentication scheme that requires clients to send an 'Authorization' header, then send back the contents of the response in the 'Authorization' header. """ requires_response_body = True def __init__(self, token: str) -> None: self.token = token def auth_flow(self, request: httpx2.Request) -> typing.Generator[httpx2.Request, httpx2.Response, None]: request.headers["Authorization"] = self.token response = yield request data = response.text request.headers["Authorization"] = data yield request class SyncOrAsyncAuth(httpx2.Auth): """ A mock authentication scheme that uses a different implementation for the sync and async cases. """ def __init__(self) -> None: self._lock = threading.Lock() self._async_lock = anyio.Lock() def sync_auth_flow(self, request: httpx2.Request) -> typing.Generator[httpx2.Request, httpx2.Response, None]: with self._lock: request.headers["Authorization"] = "sync-auth" yield request async def async_auth_flow(self, request: httpx2.Request) -> typing.AsyncGenerator[httpx2.Request, httpx2.Response]: async with self._async_lock: request.headers["Authorization"] = "async-auth" yield request @pytest.mark.anyio async def test_basic_auth() -> None: url = "https://example.org/" auth = ("user", "password123") app = App() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "Basic dXNlcjpwYXNzd29yZDEyMw=="} @pytest.mark.anyio async def test_basic_auth_with_stream() -> None: """ See: https://github.com/encode/httpx/pull/1312 """ url = "https://example.org/" auth = ("user", "password123") app = App() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app), auth=auth) as client: async with client.stream("GET", url) as response: await response.aread() assert response.status_code == 200 assert response.json() == {"auth": "Basic dXNlcjpwYXNzd29yZDEyMw=="} @pytest.mark.anyio async def test_basic_auth_in_url() -> None: url = "https://user:password123@example.org/" app = App() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url) assert response.status_code == 200 assert response.json() == {"auth": "Basic dXNlcjpwYXNzd29yZDEyMw=="} @pytest.mark.anyio async def test_basic_auth_on_session() -> None: url = "https://example.org/" auth = ("user", "password123") app = App() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app), auth=auth) as client: response = await client.get(url) assert response.status_code == 200 assert response.json() == {"auth": "Basic dXNlcjpwYXNzd29yZDEyMw=="} @pytest.mark.anyio async def test_custom_auth() -> None: url = "https://example.org/" app = App() def auth(request: httpx2.Request) -> httpx2.Request: request.headers["Authorization"] = "Token 123" return request async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "Token 123"} def test_netrc_auth_credentials_exist() -> None: """ When netrc auth is being used and a request is made to a host that is in the netrc file, then the relevant credentials should be applied. """ netrc_file = str(FIXTURES_DIR / ".netrc") url = "http://netrcexample.org" app = App() auth = httpx2.NetRCAuth(netrc_file) with httpx2.Client(transport=httpx2.MockTransport(app), auth=auth) as client: response = client.get(url) assert response.status_code == 200 assert response.json() == {"auth": "Basic ZXhhbXBsZS11c2VybmFtZTpleGFtcGxlLXBhc3N3b3Jk"} def test_netrc_auth_credentials_do_not_exist() -> None: """ When netrc auth is being used and a request is made to a host that is not in the netrc file, then no credentials should be applied. """ netrc_file = str(FIXTURES_DIR / ".netrc") url = "http://example.org" app = App() auth = httpx2.NetRCAuth(netrc_file) with httpx2.Client(transport=httpx2.MockTransport(app), auth=auth) as client: response = client.get(url) assert response.status_code == 200 assert response.json() == {"auth": None} @pytest.mark.skipif( sys.version_info >= (3, 11), reason="netrc files without a password are valid from Python >= 3.11", ) def test_netrc_auth_nopassword_parse_error() -> None: # pragma: no cover """ Python has different netrc parsing behaviours with different versions. For Python < 3.11 a netrc file with no password is invalid. In this case we want to allow the parse error to be raised. """ netrc_file = str(FIXTURES_DIR / ".netrc-nopassword") with pytest.raises(netrc.NetrcParseError): httpx2.NetRCAuth(netrc_file) @pytest.mark.anyio async def test_auth_disable_per_request() -> None: url = "https://example.org/" auth = ("user", "password123") app = App() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app), auth=auth) as client: response = await client.get(url, auth=None) assert response.status_code == 200 assert response.json() == {"auth": None} def test_auth_hidden_url() -> None: url = "http://example-username:example-password@example.org/" expected = "URL('http://example-username:[secure]@example.org/')" assert url == httpx2.URL(url) assert expected == repr(httpx2.URL(url)) @pytest.mark.anyio async def test_auth_hidden_header() -> None: url = "https://example.org/" auth = ("example-username", "example-password") app = App() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert "'authorization': '[secure]'" in str(response.request.headers) @pytest.mark.anyio async def test_auth_property() -> None: app = App() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: assert client.auth is None client.auth = ("user", "password123") assert isinstance(client.auth, httpx2.BasicAuth) url = "https://example.org/" response = await client.get(url) assert response.status_code == 200 assert response.json() == {"auth": "Basic dXNlcjpwYXNzd29yZDEyMw=="} @pytest.mark.anyio async def test_auth_invalid_type() -> None: app = App() with pytest.raises(TypeError): client = httpx2.AsyncClient( transport=httpx2.MockTransport(app), auth="not a tuple, not a callable", # type: ignore ) async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: with pytest.raises(TypeError): await client.get(auth="not a tuple, not a callable") # type: ignore with pytest.raises(TypeError): client.auth = "not a tuple, not a callable" # type: ignore @pytest.mark.anyio async def test_digest_auth_returns_no_auth_if_no_digest_header_in_response() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = App() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": None} assert len(response.history) == 0 def test_digest_auth_returns_no_auth_if_alternate_auth_scheme() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") auth_header = "Token ..." app = App(auth_header=auth_header, status_code=401) client = httpx2.Client(transport=httpx2.MockTransport(app)) response = client.get(url, auth=auth) assert response.status_code == 401 assert response.json() == {"auth": None} assert len(response.history) == 0 @pytest.mark.anyio async def test_digest_auth_200_response_including_digest_auth_header() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") auth_header = 'Digest realm="realm@host.com",qop="auth",nonce="abc",opaque="xyz"' app = App(auth_header=auth_header, status_code=200) async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": None} assert len(response.history) == 0 @pytest.mark.anyio async def test_digest_auth_401_response_without_digest_auth_header() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = App(auth_header="", status_code=401) async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 401 assert response.json() == {"auth": None} assert len(response.history) == 0 @pytest.mark.parametrize( "algorithm,expected_hash_length,expected_response_length", [ ("MD5", 64, 32), ("MD5-SESS", 64, 32), ("SHA", 64, 40), ("SHA-SESS", 64, 40), ("SHA-256", 64, 64), ("SHA-256-SESS", 64, 64), ("SHA-512", 64, 128), ("SHA-512-SESS", 64, 128), ], ) @pytest.mark.anyio async def test_digest_auth(algorithm: str, expected_hash_length: int, expected_response_length: int) -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = DigestApp(algorithm=algorithm) async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert len(response.history) == 1 authorization = typing.cast(dict[str, typing.Any], response.json())["auth"] scheme, _, fields = authorization.partition(" ") assert scheme == "Digest" response_fields = [field.strip() for field in fields.split(",")] digest_data = dict(field.split("=") for field in response_fields) assert digest_data["username"] == '"user"' assert digest_data["realm"] == '"httpx@example.org"' assert "nonce" in digest_data assert digest_data["uri"] == '"/"' assert len(digest_data["response"]) == expected_response_length + 2 # extra quotes assert len(digest_data["opaque"]) == expected_hash_length + 2 assert digest_data["algorithm"] == algorithm assert digest_data["qop"] == "auth" assert digest_data["nc"] == "00000001" assert len(digest_data["cnonce"]) == 16 + 2 @pytest.mark.anyio async def test_digest_auth_no_specified_qop() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = DigestApp(qop="") async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert len(response.history) == 1 authorization = typing.cast(dict[str, typing.Any], response.json())["auth"] scheme, _, fields = authorization.partition(" ") assert scheme == "Digest" response_fields = [field.strip() for field in fields.split(",")] digest_data = dict(field.split("=") for field in response_fields) assert "qop" not in digest_data assert "nc" not in digest_data assert "cnonce" not in digest_data assert digest_data["username"] == '"user"' assert digest_data["realm"] == '"httpx@example.org"' assert len(digest_data["nonce"]) == 64 + 2 # extra quotes assert digest_data["uri"] == '"/"' assert len(digest_data["response"]) == 64 + 2 assert len(digest_data["opaque"]) == 64 + 2 assert digest_data["algorithm"] == "SHA-256" @pytest.mark.parametrize("qop", ("auth, auth-int", "auth,auth-int", "unknown,auth")) @pytest.mark.anyio async def test_digest_auth_qop_including_spaces_and_auth_returns_auth(qop: str) -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = DigestApp(qop=qop) async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert len(response.history) == 1 @pytest.mark.anyio async def test_digest_auth_qop_auth_int_not_implemented() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = DigestApp(qop="auth-int") async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: with pytest.raises(NotImplementedError): await client.get(url, auth=auth) @pytest.mark.anyio async def test_digest_auth_qop_must_be_auth_or_auth_int() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = DigestApp(qop="not-auth") async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: with pytest.raises(httpx2.ProtocolError): await client.get(url, auth=auth) @pytest.mark.anyio async def test_digest_auth_incorrect_credentials() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = DigestApp(send_response_after_attempt=2) async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 401 assert len(response.history) == 1 @pytest.mark.anyio async def test_digest_auth_reuses_challenge() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = DigestApp() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response_1 = await client.get(url, auth=auth) response_2 = await client.get(url, auth=auth) assert response_1.status_code == 200 assert response_2.status_code == 200 assert len(response_1.history) == 1 assert len(response_2.history) == 0 @pytest.mark.anyio async def test_digest_auth_resets_nonce_count_after_401() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = DigestApp() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response_1 = await client.get(url, auth=auth) assert response_1.status_code == 200 assert len(response_1.history) == 1 first_nonce = parse_keqv_list(response_1.request.headers["Authorization"].split(", "))["nonce"] first_nc = parse_keqv_list(response_1.request.headers["Authorization"].split(", "))["nc"] # with this we now force a 401 on a subsequent (but initial) request app.send_response_after_attempt = 2 # we expect the client again to try to authenticate, # i.e. the history length must be 1 response_2 = await client.get(url, auth=auth) assert response_2.status_code == 200 assert len(response_2.history) == 1 second_nonce = parse_keqv_list(response_2.request.headers["Authorization"].split(", "))["nonce"] second_nc = parse_keqv_list(response_2.request.headers["Authorization"].split(", "))["nc"] assert first_nonce != second_nonce # ensures that the auth challenge was reset assert first_nc == second_nc # ensures the nonce count is reset when the authentication failed @pytest.mark.parametrize( "auth_header", [ 'Digest realm="httpx@example.org", qop="auth"', # missing fields 'Digest realm="httpx@example.org", qop="auth,au', # malformed fields list ], ) @pytest.mark.anyio async def test_async_digest_auth_raises_protocol_error_on_malformed_header( auth_header: str, ) -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = App(auth_header=auth_header, status_code=401) async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: with pytest.raises(httpx2.ProtocolError): await client.get(url, auth=auth) @pytest.mark.parametrize( "auth_header", [ 'Digest realm="httpx@example.org", qop="auth"', # missing fields 'Digest realm="httpx@example.org", qop="auth,au', # malformed fields list ], ) def test_sync_digest_auth_raises_protocol_error_on_malformed_header( auth_header: str, ) -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = App(auth_header=auth_header, status_code=401) with httpx2.Client(transport=httpx2.MockTransport(app)) as client: with pytest.raises(httpx2.ProtocolError): client.get(url, auth=auth) @pytest.mark.anyio async def test_async_auth_history() -> None: """ Test that intermediate requests sent as part of an authentication flow are recorded in the response history. """ url = "https://example.org/" auth = RepeatAuth(repeat=2) app = App(auth_header="abc") async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "Repeat abc.abc"} assert len(response.history) == 2 resp1, resp2 = response.history assert resp1.json() == {"auth": "Repeat 0"} assert resp2.json() == {"auth": "Repeat 1"} assert len(resp2.history) == 1 assert resp2.history == [resp1] assert len(resp1.history) == 0 def test_sync_auth_history() -> None: """ Test that intermediate requests sent as part of an authentication flow are recorded in the response history. """ url = "https://example.org/" auth = RepeatAuth(repeat=2) app = App(auth_header="abc") with httpx2.Client(transport=httpx2.MockTransport(app)) as client: response = client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "Repeat abc.abc"} assert len(response.history) == 2 resp1, resp2 = response.history assert resp1.json() == {"auth": "Repeat 0"} assert resp2.json() == {"auth": "Repeat 1"} assert len(resp2.history) == 1 assert resp2.history == [resp1] assert len(resp1.history) == 0 class ConsumeBodyTransport(httpx2.MockTransport): async def handle_async_request(self, request: httpx2.Request) -> httpx2.Response: assert isinstance(request.stream, httpx2.AsyncByteStream) [_ async for _ in request.stream] return self.handler(request) # type: ignore[return-value] @pytest.mark.anyio async def test_digest_auth_unavailable_streaming_body() -> None: url = "https://example.org/" auth = httpx2.DigestAuth(username="user", password="password123") app = DigestApp() async def streaming_body() -> typing.AsyncIterator[bytes]: yield b"Example request body" # pragma: no cover async with httpx2.AsyncClient(transport=ConsumeBodyTransport(app)) as client: with pytest.raises(httpx2.StreamConsumed): await client.post(url, content=streaming_body(), auth=auth) @pytest.mark.anyio async def test_async_auth_reads_response_body() -> None: """ Test that we can read the response body in an auth flow if `requires_response_body` is set. """ url = "https://example.org/" auth = ResponseBodyAuth("xyz") app = App() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": '{"auth":"xyz"}'} def test_sync_auth_reads_response_body() -> None: """ Test that we can read the response body in an auth flow if `requires_response_body` is set. """ url = "https://example.org/" auth = ResponseBodyAuth("xyz") app = App() with httpx2.Client(transport=httpx2.MockTransport(app)) as client: response = client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": '{"auth":"xyz"}'} @pytest.mark.anyio async def test_async_auth() -> None: """ Test that we can use an auth implementation specific to the async case, to support cases that require performing I/O or using concurrency primitives (such as checking a disk-based cache or fetching a token from a remote auth server). """ url = "https://example.org/" auth = SyncOrAsyncAuth() app = App() async with httpx2.AsyncClient(transport=httpx2.MockTransport(app)) as client: response = await client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "async-auth"} def test_sync_auth() -> None: """ Test that we can use an auth implementation specific to the sync case. """ url = "https://example.org/" auth = SyncOrAsyncAuth() app = App() with httpx2.Client(transport=httpx2.MockTransport(app)) as client: response = client.get(url, auth=auth) assert response.status_code == 200 assert response.json() == {"auth": "sync-auth"} pydantic-httpx2-9b7ee8e/tests/httpx2/client/test_client.py000066400000000000000000000374311521723372100240410ustar00rootroot00000000000000from __future__ import annotations import typing from datetime import timedelta import chardet import pytest import httpx2 if typing.TYPE_CHECKING: from conftest import TestServer def autodetect(content: bytes) -> str | None: return chardet.detect(content).get("encoding") def test_get(server: TestServer) -> None: url = server.url with httpx2.Client(http2=True) as http: response = http.get(url) assert response.status_code == 200 assert response.url == url assert response.content == b"Hello, world!" assert response.text == "Hello, world!" assert response.http_version == "HTTP/1.1" assert response.encoding == "utf-8" assert response.request.url == url assert response.headers assert response.is_redirect is False assert repr(response) == "" assert response.elapsed > timedelta(0) @pytest.mark.parametrize( "url", [ pytest.param("invalid://example.org", id="scheme-not-http(s)"), pytest.param("://example.org", id="no-scheme"), pytest.param("http://", id="no-host"), ], ) def test_get_invalid_url(server: TestServer, url: str) -> None: with httpx2.Client() as client: with pytest.raises((httpx2.UnsupportedProtocol, httpx2.LocalProtocolError)): client.get(url) def test_build_request(server: TestServer) -> None: url = server.url.copy_with(path="/echo_headers") headers = {"Custom-header": "value"} with httpx2.Client() as client: request = client.build_request("GET", url) request.headers.update(headers) response = client.send(request) assert response.status_code == 200 assert response.url == url assert response.json()["Custom-header"] == "value" def test_build_post_request(server: TestServer) -> None: url = server.url.copy_with(path="/echo_headers") headers = {"Custom-header": "value"} with httpx2.Client() as client: request = client.build_request("POST", url) request.headers.update(headers) response = client.send(request) assert response.status_code == 200 assert response.url == url assert response.json()["Content-length"] == "0" assert response.json()["Custom-header"] == "value" def test_post(server: TestServer) -> None: with httpx2.Client() as client: response = client.post(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_post_json(server: TestServer) -> None: with httpx2.Client() as client: response = client.post(server.url, json={"text": "Hello, world!"}) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_stream_response(server: TestServer) -> None: with httpx2.Client() as client: with client.stream("GET", server.url) as response: content = response.read() assert response.status_code == 200 assert content == b"Hello, world!" def test_stream_iterator(server: TestServer) -> None: body = b"" with httpx2.Client() as client: with client.stream("GET", server.url) as response: for chunk in response.iter_bytes(): body += chunk assert response.status_code == 200 assert body == b"Hello, world!" def test_raw_iterator(server: TestServer) -> None: body = b"" with httpx2.Client() as client: with client.stream("GET", server.url) as response: for chunk in response.iter_raw(): body += chunk assert response.status_code == 200 assert body == b"Hello, world!" def test_cannot_stream_async_request(server: TestServer) -> None: async def hello_world() -> typing.AsyncIterator[bytes]: # pragma: no cover yield b"Hello, " yield b"world!" with httpx2.Client() as client: with pytest.raises(RuntimeError): client.post(server.url, content=hello_world()) def test_raise_for_status(server: TestServer) -> None: with httpx2.Client() as client: for status_code in (200, 400, 404, 500, 505): response = client.request("GET", server.url.copy_with(path=f"/status/{status_code}")) if 400 <= status_code < 600: with pytest.raises(httpx2.HTTPStatusError) as exc_info: response.raise_for_status() assert exc_info.value.response == response assert exc_info.value.request.url.path == f"/status/{status_code}" else: assert response.raise_for_status() is response def test_options(server: TestServer) -> None: with httpx2.Client() as client: response = client.options(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_head(server: TestServer) -> None: with httpx2.Client() as client: response = client.head(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_put(server: TestServer) -> None: with httpx2.Client() as client: response = client.put(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_patch(server: TestServer) -> None: with httpx2.Client() as client: response = client.patch(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_delete(server: TestServer) -> None: with httpx2.Client() as client: response = client.delete(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_base_url(server: TestServer) -> None: base_url = server.url with httpx2.Client(base_url=base_url) as client: response = client.get("/") assert response.status_code == 200 assert response.url == base_url def test_merge_absolute_url() -> None: client = httpx2.Client(base_url="https://www.example.com/") request = client.build_request("GET", "http://www.example.com/") assert request.url == "http://www.example.com/" def test_merge_relative_url() -> None: client = httpx2.Client(base_url="https://www.example.com/") request = client.build_request("GET", "/testing/123") assert request.url == "https://www.example.com/testing/123" def test_merge_relative_url_with_path() -> None: client = httpx2.Client(base_url="https://www.example.com/some/path") request = client.build_request("GET", "/testing/123") assert request.url == "https://www.example.com/some/path/testing/123" def test_merge_relative_url_with_dotted_path() -> None: client = httpx2.Client(base_url="https://www.example.com/some/path") request = client.build_request("GET", "../testing/123") assert request.url == "https://www.example.com/some/testing/123" def test_merge_relative_url_with_path_including_colon() -> None: client = httpx2.Client(base_url="https://www.example.com/some/path") request = client.build_request("GET", "/testing:123") assert request.url == "https://www.example.com/some/path/testing:123" def test_merge_relative_url_with_encoded_slashes() -> None: client = httpx2.Client(base_url="https://www.example.com/") request = client.build_request("GET", "/testing%2F123") assert request.url == "https://www.example.com/testing%2F123" client = httpx2.Client(base_url="https://www.example.com/base%2Fpath") request = client.build_request("GET", "/testing") assert request.url == "https://www.example.com/base%2Fpath/testing" def test_context_managed_transport() -> None: class Transport(httpx2.BaseTransport): def __init__(self) -> None: self.events: list[str] = [] def close(self) -> None: # The base implementation of httpx2.BaseTransport just # calls into `.close`, so simple transport cases can just override # this method for any cleanup, where more complex cases # might want to additionally override `__enter__`/`__exit__`. self.events.append("transport.close") def __enter__(self) -> Transport: super().__enter__() self.events.append("transport.__enter__") return self def __exit__(self, *args: typing.Any) -> None: super().__exit__(*args) self.events.append("transport.__exit__") transport = Transport() with httpx2.Client(transport=transport): pass assert transport.events == [ "transport.__enter__", "transport.close", "transport.__exit__", ] def test_context_managed_transport_and_mount() -> None: class Transport(httpx2.BaseTransport): def __init__(self, name: str) -> None: self.name: str = name self.events: list[str] = [] def close(self) -> None: # The base implementation of httpx2.BaseTransport just # calls into `.close`, so simple transport cases can just override # this method for any cleanup, where more complex cases # might want to additionally override `__enter__`/`__exit__`. self.events.append(f"{self.name}.close") def __enter__(self) -> Transport: super().__enter__() self.events.append(f"{self.name}.__enter__") return self def __exit__(self, *args: typing.Any) -> None: super().__exit__(*args) self.events.append(f"{self.name}.__exit__") transport = Transport(name="transport") mounted = Transport(name="mounted") with httpx2.Client(transport=transport, mounts={"http://www.example.org": mounted}): pass assert transport.events == [ "transport.__enter__", "transport.close", "transport.__exit__", ] assert mounted.events == [ "mounted.__enter__", "mounted.close", "mounted.__exit__", ] def hello_world(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, text="Hello, world!") def test_client_closed_state_using_implicit_open() -> None: client = httpx2.Client(transport=httpx2.MockTransport(hello_world)) assert not client.is_closed client.get("http://example.com") assert not client.is_closed client.close() assert client.is_closed # Once we're close we cannot make any more requests. with pytest.raises(RuntimeError): client.get("http://example.com") # Once we're closed we cannot reopen the client. with pytest.raises(RuntimeError): with client: pass # pragma: no cover def test_client_closed_state_using_with_block() -> None: with httpx2.Client(transport=httpx2.MockTransport(hello_world)) as client: assert not client.is_closed client.get("http://example.com") assert client.is_closed with pytest.raises(RuntimeError): client.get("http://example.com") def echo_raw_headers(request: httpx2.Request) -> httpx2.Response: data = [(name.decode("ascii"), value.decode("ascii")) for name, value in request.headers.raw] return httpx2.Response(200, json=data) def test_raw_client_header() -> None: """ Set a header in the Client. """ url = "http://example.org/echo_headers" headers = {"Example-Header": "example-value"} client = httpx2.Client(transport=httpx2.MockTransport(echo_raw_headers), headers=headers) response = client.get(url) assert response.status_code == 200 assert response.json() == [ ["Host", "example.org"], ["Accept", "*/*"], ["Accept-Encoding", "gzip, deflate, br, zstd"], ["Connection", "keep-alive"], ["User-Agent", f"python-httpx2/{httpx2.__version__}"], ["Example-Header", "example-value"], ] def unmounted(request: httpx2.Request) -> httpx2.Response: data = {"app": "unmounted"} return httpx2.Response(200, json=data) def mounted(request: httpx2.Request) -> httpx2.Response: data = {"app": "mounted"} return httpx2.Response(200, json=data) def test_mounted_transport() -> None: transport = httpx2.MockTransport(unmounted) mounts = {"custom://": httpx2.MockTransport(mounted)} client = httpx2.Client(transport=transport, mounts=mounts) response = client.get("https://www.example.com") assert response.status_code == 200 assert response.json() == {"app": "unmounted"} response = client.get("custom://www.example.com") assert response.status_code == 200 assert response.json() == {"app": "mounted"} def test_all_mounted_transport() -> None: mounts = {"all://": httpx2.MockTransport(mounted)} client = httpx2.Client(mounts=mounts) response = client.get("https://www.example.com") assert response.status_code == 200 assert response.json() == {"app": "mounted"} def test_server_extensions(server: TestServer) -> None: url = server.url.copy_with(path="/http_version_2") with httpx2.Client(http2=True) as client: response = client.get(url) assert response.status_code == 200 assert response.extensions["http_version"] == b"HTTP/1.1" def test_client_decode_text_using_autodetect() -> None: # Ensure that a 'default_encoding=autodetect' on the response allows for # encoding autodetection to be used when no "Content-Type: text/plain; charset=..." # info is present. # # Here we have some french text encoded with WINDOWS-1252, rather than UTF-8. # The curly quotes and em dash occupy bytes 0x80-0x9F, which are control # characters in ISO-8859-1, so the encoding is unambiguously WINDOWS-1252. text = ( "Non-seulement DesprΓ©aux ne se trompait pas β€” mais de tous les Γ©crivains " "que la France a produits, sans excepter Voltaire lui-mΓͺme, imprΓ©gnΓ© de " "l’esprit anglais par son sΓ©jour Γ  Londres, c’est incontestablement " "β€œMoliΓ¨re” ou Poquelin qui reproduit avec l’exactitude la plus vive et la " "plus complΓ¨te le fond du gΓ©nie franΓ§ais." ) def cp1252_but_no_content_type(request: httpx2.Request) -> httpx2.Response: content = text.encode("WINDOWS-1252") return httpx2.Response(200, content=content) transport = httpx2.MockTransport(cp1252_but_no_content_type) with httpx2.Client(transport=transport, default_encoding=autodetect) as client: response = client.get("http://www.example.com") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.encoding == "WINDOWS-1252" assert response.text == text def test_client_decode_text_using_explicit_encoding() -> None: # Ensure that a 'default_encoding="..."' on the response is used for text decoding # when no "Content-Type: text/plain; charset=..."" info is present. # # Here we have some french text encoded with WINDOWS-1252, rather than UTF-8. # The curly quotes and em dash occupy bytes 0x80-0x9F, which are control # characters in ISO-8859-1, so the encoding is unambiguously WINDOWS-1252. text = ( "Non-seulement DesprΓ©aux ne se trompait pas β€” mais de tous les Γ©crivains " "que la France a produits, sans excepter Voltaire lui-mΓͺme, imprΓ©gnΓ© de " "l’esprit anglais par son sΓ©jour Γ  Londres, c’est incontestablement " "β€œMoliΓ¨re” ou Poquelin qui reproduit avec l’exactitude la plus vive et la " "plus complΓ¨te le fond du gΓ©nie franΓ§ais." ) def cp1252_but_no_content_type(request: httpx2.Request) -> httpx2.Response: content = text.encode("WINDOWS-1252") return httpx2.Response(200, content=content) transport = httpx2.MockTransport(cp1252_but_no_content_type) with httpx2.Client(transport=transport, default_encoding=autodetect) as client: response = client.get("http://www.example.com") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.encoding == "WINDOWS-1252" assert response.text == text pydantic-httpx2-9b7ee8e/tests/httpx2/client/test_cookies.py000066400000000000000000000115231521723372100242110ustar00rootroot00000000000000from http.cookiejar import Cookie, CookieJar import pytest import httpx2 def get_and_set_cookies(request: httpx2.Request) -> httpx2.Response: if request.url.path == "/echo_cookies": data = {"cookies": request.headers.get("cookie")} return httpx2.Response(200, json=data) elif request.url.path == "/set_cookie": headers = {"set-cookie": "example-name=example-value"} return httpx2.Response(200, headers=headers) else: raise NotImplementedError() # pragma: no cover def test_set_cookie() -> None: """ Send a request including a cookie. """ url = "http://example.org/echo_cookies" cookies = {"example-name": "example-value"} client = httpx2.Client(cookies=cookies, transport=httpx2.MockTransport(get_and_set_cookies)) response = client.get(url) assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} def test_set_per_request_cookie_is_deprecated() -> None: """ Sending a request including a per-request cookie is deprecated. """ url = "http://example.org/echo_cookies" cookies = {"example-name": "example-value"} client = httpx2.Client(transport=httpx2.MockTransport(get_and_set_cookies)) with pytest.warns(DeprecationWarning): response = client.get(url, cookies=cookies) assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} def test_set_cookie_with_cookiejar() -> None: """ Send a request including a cookie, using a `CookieJar` instance. """ url = "http://example.org/echo_cookies" cookies = CookieJar() cookie = Cookie( version=0, name="example-name", value="example-value", port=None, port_specified=False, domain="", domain_specified=False, domain_initial_dot=False, path="/", path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={"HttpOnly": ""}, rfc2109=False, ) cookies.set_cookie(cookie) client = httpx2.Client(cookies=cookies, transport=httpx2.MockTransport(get_and_set_cookies)) response = client.get(url) assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} def test_setting_client_cookies_to_cookiejar() -> None: """ Send a request including a cookie, using a `CookieJar` instance. """ url = "http://example.org/echo_cookies" cookies = CookieJar() cookie = Cookie( version=0, name="example-name", value="example-value", port=None, port_specified=False, domain="", domain_specified=False, domain_initial_dot=False, path="/", path_specified=True, secure=False, expires=None, discard=True, comment=None, comment_url=None, rest={"HttpOnly": ""}, rfc2109=False, ) cookies.set_cookie(cookie) client = httpx2.Client(cookies=cookies, transport=httpx2.MockTransport(get_and_set_cookies)) response = client.get(url) assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} def test_set_cookie_with_cookies_model() -> None: """ Send a request including a cookie, using a `Cookies` instance. """ url = "http://example.org/echo_cookies" cookies = httpx2.Cookies() cookies["example-name"] = "example-value" client = httpx2.Client(transport=httpx2.MockTransport(get_and_set_cookies)) client.cookies = cookies response = client.get(url) assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} def test_get_cookie() -> None: url = "http://example.org/set_cookie" client = httpx2.Client(transport=httpx2.MockTransport(get_and_set_cookies)) response = client.get(url) assert response.status_code == 200 assert response.cookies["example-name"] == "example-value" assert client.cookies["example-name"] == "example-value" def test_cookie_persistence() -> None: """ Ensure that Client instances persist cookies between requests. """ client = httpx2.Client(transport=httpx2.MockTransport(get_and_set_cookies)) response = client.get("http://example.org/echo_cookies") assert response.status_code == 200 assert response.json() == {"cookies": None} response = client.get("http://example.org/set_cookie") assert response.status_code == 200 assert response.cookies["example-name"] == "example-value" assert client.cookies["example-name"] == "example-value" response = client.get("http://example.org/echo_cookies") assert response.status_code == 200 assert response.json() == {"cookies": "example-name=example-value"} pydantic-httpx2-9b7ee8e/tests/httpx2/client/test_event_hooks.py000066400000000000000000000171641521723372100251100ustar00rootroot00000000000000from __future__ import annotations import typing import pytest import httpx2 if typing.TYPE_CHECKING: from conftest import TestServer def app(request: httpx2.Request) -> httpx2.Response: if request.url.path == "/redirect": return httpx2.Response(303, headers={"server": "testserver", "location": "/"}) elif request.url.path.startswith("/status/"): status_code = int(request.url.path[-3:]) return httpx2.Response(status_code, headers={"server": "testserver"}) return httpx2.Response(200, headers={"server": "testserver"}) def test_event_hooks() -> None: events = [] def on_request(request: httpx2.Request) -> None: events.append({"event": "request", "headers": dict(request.headers)}) def on_response(response: httpx2.Response) -> None: events.append({"event": "response", "headers": dict(response.headers)}) event_hooks: dict[str, list[typing.Callable[..., typing.Any]]] = { "request": [on_request], "response": [on_response], } with httpx2.Client(event_hooks=event_hooks, transport=httpx2.MockTransport(app)) as http: http.get("http://127.0.0.1:8000/", auth=("username", "password")) assert events == [ { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx2/{httpx2.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"server": "testserver"}, }, ] def test_event_hooks_raising_exception(server: TestServer) -> None: def raise_on_4xx_5xx(response: httpx2.Response) -> None: response.raise_for_status() event_hooks = {"response": [raise_on_4xx_5xx]} with httpx2.Client(event_hooks=event_hooks, transport=httpx2.MockTransport(app)) as http: try: http.get("http://127.0.0.1:8000/status/400") except httpx2.HTTPStatusError as exc: assert exc.response.is_closed @pytest.mark.anyio async def test_async_event_hooks() -> None: events = [] async def on_request(request: httpx2.Request) -> None: events.append({"event": "request", "headers": dict(request.headers)}) async def on_response(response: httpx2.Response) -> None: events.append({"event": "response", "headers": dict(response.headers)}) event_hooks: dict[str, list[typing.Callable[..., typing.Any]]] = { "request": [on_request], "response": [on_response], } async with httpx2.AsyncClient(event_hooks=event_hooks, transport=httpx2.MockTransport(app)) as http: await http.get("http://127.0.0.1:8000/", auth=("username", "password")) assert events == [ { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx2/{httpx2.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"server": "testserver"}, }, ] @pytest.mark.anyio async def test_async_event_hooks_raising_exception() -> None: async def raise_on_4xx_5xx(response: httpx2.Response) -> None: response.raise_for_status() event_hooks = {"response": [raise_on_4xx_5xx]} async with httpx2.AsyncClient(event_hooks=event_hooks, transport=httpx2.MockTransport(app)) as http: try: await http.get("http://127.0.0.1:8000/status/400") except httpx2.HTTPStatusError as exc: assert exc.response.is_closed def test_event_hooks_with_redirect() -> None: """ A redirect request should trigger additional 'request' and 'response' event hooks. """ events = [] def on_request(request: httpx2.Request) -> None: events.append({"event": "request", "headers": dict(request.headers)}) def on_response(response: httpx2.Response) -> None: events.append({"event": "response", "headers": dict(response.headers)}) event_hooks: dict[str, list[typing.Callable[..., typing.Any]]] = { "request": [on_request], "response": [on_response], } with httpx2.Client( event_hooks=event_hooks, transport=httpx2.MockTransport(app), follow_redirects=True, ) as http: http.get("http://127.0.0.1:8000/redirect", auth=("username", "password")) assert events == [ { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx2/{httpx2.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"location": "/", "server": "testserver"}, }, { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx2/{httpx2.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"server": "testserver"}, }, ] @pytest.mark.anyio async def test_async_event_hooks_with_redirect() -> None: """ A redirect request should trigger additional 'request' and 'response' event hooks. """ events = [] async def on_request(request: httpx2.Request) -> None: events.append({"event": "request", "headers": dict(request.headers)}) async def on_response(response: httpx2.Response) -> None: events.append({"event": "response", "headers": dict(response.headers)}) event_hooks: dict[str, list[typing.Callable[..., typing.Any]]] = { "request": [on_request], "response": [on_response], } async with httpx2.AsyncClient( event_hooks=event_hooks, transport=httpx2.MockTransport(app), follow_redirects=True, ) as http: await http.get("http://127.0.0.1:8000/redirect", auth=("username", "password")) assert events == [ { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx2/{httpx2.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"location": "/", "server": "testserver"}, }, { "event": "request", "headers": { "host": "127.0.0.1:8000", "user-agent": f"python-httpx2/{httpx2.__version__}", "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", }, }, { "event": "response", "headers": {"server": "testserver"}, }, ] pydantic-httpx2-9b7ee8e/tests/httpx2/client/test_headers.py000077500000000000000000000215001521723372100241670ustar00rootroot00000000000000#!/usr/bin/env python3 import pytest import httpx2 def echo_headers(request: httpx2.Request) -> httpx2.Response: data = {"headers": dict(request.headers)} return httpx2.Response(200, json=data) def echo_repeated_headers_multi_items(request: httpx2.Request) -> httpx2.Response: data = {"headers": list(request.headers.multi_items())} return httpx2.Response(200, json=data) def echo_repeated_headers_items(request: httpx2.Request) -> httpx2.Response: data = {"headers": list(request.headers.items())} return httpx2.Response(200, json=data) def test_client_header() -> None: """ Set a header in the Client. """ url = "http://example.org/echo_headers" headers = {"Example-Header": "example-value"} transport = httpx2.MockTransport(echo_headers) client = httpx2.Client(transport=transport, headers=headers) response = client.get(url) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "example-header": "example-value", "host": "example.org", "user-agent": f"python-httpx2/{httpx2.__version__}", } } def test_header_merge() -> None: url = "http://example.org/echo_headers" client_headers = {"User-Agent": "python-myclient/0.2.1"} request_headers = {"X-Auth-Token": "FooBarBazToken"} client = httpx2.Client(transport=httpx2.MockTransport(echo_headers), headers=client_headers) response = client.get(url, headers=request_headers) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "host": "example.org", "user-agent": "python-myclient/0.2.1", "x-auth-token": "FooBarBazToken", } } def test_header_merge_conflicting_headers() -> None: url = "http://example.org/echo_headers" client_headers = {"X-Auth-Token": "FooBar"} request_headers = {"X-Auth-Token": "BazToken"} client = httpx2.Client(transport=httpx2.MockTransport(echo_headers), headers=client_headers) response = client.get(url, headers=request_headers) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "host": "example.org", "user-agent": f"python-httpx2/{httpx2.__version__}", "x-auth-token": "BazToken", } } def test_header_update() -> None: url = "http://example.org/echo_headers" client = httpx2.Client(transport=httpx2.MockTransport(echo_headers)) first_response = client.get(url) client.headers.update({"User-Agent": "python-myclient/0.2.1", "Another-Header": "AThing"}) second_response = client.get(url) assert first_response.status_code == 200 assert first_response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "host": "example.org", "user-agent": f"python-httpx2/{httpx2.__version__}", } } assert second_response.status_code == 200 assert second_response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "another-header": "AThing", "connection": "keep-alive", "host": "example.org", "user-agent": "python-myclient/0.2.1", } } def test_header_repeated_items() -> None: url = "http://example.org/echo_headers" client = httpx2.Client(transport=httpx2.MockTransport(echo_repeated_headers_items)) response = client.get(url, headers=[("x-header", "1"), ("x-header", "2,3")]) assert response.status_code == 200 echoed_headers = response.json()["headers"] # as per RFC 7230, the whitespace after a comma is insignificant # so we split and strip here so that we can do a safe comparison assert ["x-header", ["1", "2", "3"]] in [[k, [subv.lstrip() for subv in v.split(",")]] for k, v in echoed_headers] def test_header_repeated_multi_items() -> None: url = "http://example.org/echo_headers" client = httpx2.Client(transport=httpx2.MockTransport(echo_repeated_headers_multi_items)) response = client.get(url, headers=[("x-header", "1"), ("x-header", "2,3")]) assert response.status_code == 200 echoed_headers = response.json()["headers"] assert ["x-header", "1"] in echoed_headers assert ["x-header", "2,3"] in echoed_headers def test_remove_default_header() -> None: """ Remove a default header from the Client. """ url = "http://example.org/echo_headers" client = httpx2.Client(transport=httpx2.MockTransport(echo_headers)) del client.headers["User-Agent"] response = client.get(url) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "host": "example.org", } } def test_header_does_not_exist() -> None: headers = httpx2.Headers({"foo": "bar"}) with pytest.raises(KeyError): del headers["baz"] def test_header_with_incorrect_value() -> None: with pytest.raises( TypeError, match=f"Header value must be str or bytes, not {type(None)}", ): httpx2.Headers({"foo": None}) # type: ignore def test_host_with_auth_and_port_in_url() -> None: """ The Host header should only include the hostname, or hostname:port (for non-default ports only). Any userinfo or default port should not be present. """ url = "http://username:password@example.org:80/echo_headers" client = httpx2.Client(transport=httpx2.MockTransport(echo_headers)) response = client.get(url) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "host": "example.org", "user-agent": f"python-httpx2/{httpx2.__version__}", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", } } def test_host_with_non_default_port_in_url() -> None: """ If the URL includes a non-default port, then it should be included in the Host header. """ url = "http://username:password@example.org:123/echo_headers" client = httpx2.Client(transport=httpx2.MockTransport(echo_headers)) response = client.get(url) assert response.status_code == 200 assert response.json() == { "headers": { "accept": "*/*", "accept-encoding": "gzip, deflate, br, zstd", "connection": "keep-alive", "host": "example.org:123", "user-agent": f"python-httpx2/{httpx2.__version__}", "authorization": "Basic dXNlcm5hbWU6cGFzc3dvcmQ=", } } def test_request_auto_headers() -> None: request = httpx2.Request("GET", "https://www.example.org/") assert "host" in request.headers def test_same_origin() -> None: origin = httpx2.URL("https://example.com") request = httpx2.Request("GET", "HTTPS://EXAMPLE.COM:443") client = httpx2.Client() headers = client._redirect_headers(request, origin, "GET") assert headers["Host"] == request.url.netloc.decode("ascii") def test_not_same_origin() -> None: origin = httpx2.URL("https://example.com") request = httpx2.Request("GET", "HTTP://EXAMPLE.COM:80") client = httpx2.Client() headers = client._redirect_headers(request, origin, "GET") assert headers["Host"] == origin.netloc.decode("ascii") def test_is_https_redirect() -> None: url = httpx2.URL("https://example.com") request = httpx2.Request("GET", "http://example.com", headers={"Authorization": "empty"}) client = httpx2.Client() headers = client._redirect_headers(request, url, "GET") assert "Authorization" in headers def test_is_not_https_redirect() -> None: url = httpx2.URL("https://www.example.com") request = httpx2.Request("GET", "http://example.com", headers={"Authorization": "empty"}) client = httpx2.Client() headers = client._redirect_headers(request, url, "GET") assert "Authorization" not in headers def test_is_not_https_redirect_if_not_default_ports() -> None: url = httpx2.URL("https://example.com:1337") request = httpx2.Request("GET", "http://example.com:9999", headers={"Authorization": "empty"}) client = httpx2.Client() headers = client._redirect_headers(request, url, "GET") assert "Authorization" not in headers pydantic-httpx2-9b7ee8e/tests/httpx2/client/test_properties.py000066400000000000000000000041041521723372100247460ustar00rootroot00000000000000from __future__ import annotations import httpx2 def test_client_base_url() -> None: client = httpx2.Client() client.base_url = "https://www.example.org/" assert isinstance(client.base_url, httpx2.URL) assert client.base_url == "https://www.example.org/" def test_client_base_url_without_trailing_slash() -> None: client = httpx2.Client() client.base_url = "https://www.example.org/path" assert isinstance(client.base_url, httpx2.URL) assert client.base_url == "https://www.example.org/path/" def test_client_base_url_with_trailing_slash() -> None: client = httpx2.Client() client.base_url = "https://www.example.org/path/" assert isinstance(client.base_url, httpx2.URL) assert client.base_url == "https://www.example.org/path/" def test_client_headers() -> None: client = httpx2.Client() client.headers = {"a": "b"} assert isinstance(client.headers, httpx2.Headers) assert client.headers["A"] == "b" def test_client_cookies() -> None: client = httpx2.Client() client.cookies = {"a": "b"} assert isinstance(client.cookies, httpx2.Cookies) mycookies = list(client.cookies.jar) assert len(mycookies) == 1 assert mycookies[0].name == "a" and mycookies[0].value == "b" def test_client_timeout() -> None: expected_timeout = 12.0 client = httpx2.Client() client.timeout = expected_timeout assert isinstance(client.timeout, httpx2.Timeout) assert client.timeout.connect == expected_timeout assert client.timeout.read == expected_timeout assert client.timeout.write == expected_timeout assert client.timeout.pool == expected_timeout def test_client_event_hooks() -> None: def on_request(request: httpx2.Request) -> None: pass # pragma: no cover client = httpx2.Client() client.event_hooks = {"request": [on_request]} assert client.event_hooks == {"request": [on_request], "response": []} def test_client_trust_env() -> None: client = httpx2.Client() assert client.trust_env client = httpx2.Client(trust_env=False) assert not client.trust_env pydantic-httpx2-9b7ee8e/tests/httpx2/client/test_proxies.py000066400000000000000000000233101521723372100242430ustar00rootroot00000000000000from __future__ import annotations import typing import pytest import httpcore2 import httpx2 def url_to_origin(url: str) -> httpcore2.URL: """ Given a URL string, return the origin in the raw tuple format that `httpcore` uses for it's representation. """ u = httpx2.URL(url) return httpcore2.URL(scheme=u.raw_scheme, host=u.raw_host, port=u.port, target="/") def test_socks_proxy() -> None: url = httpx2.URL("http://www.example.com") for proxy in ("socks5://localhost/", "socks5h://localhost/"): client = httpx2.Client(proxy=proxy) transport = client._transport_for_url(url) assert isinstance(transport, httpx2.HTTPTransport) assert isinstance(transport._pool, httpcore2.SOCKSProxy) async_client = httpx2.AsyncClient(proxy=proxy) async_transport = async_client._transport_for_url(url) assert isinstance(async_transport, httpx2.AsyncHTTPTransport) assert isinstance(async_transport._pool, httpcore2.AsyncSOCKSProxy) PROXY_URL = "http://[::1]" @pytest.mark.parametrize( ["url", "proxies", "expected"], [ ("http://example.com", {}, None), ("http://example.com", {"https://": PROXY_URL}, None), ("http://example.com", {"http://example.net": PROXY_URL}, None), # Using "*" should match any domain name. ("http://example.com", {"http://*": PROXY_URL}, PROXY_URL), ("https://example.com", {"http://*": PROXY_URL}, None), # Using "example.com" should match example.com, but not www.example.com ("http://example.com", {"http://example.com": PROXY_URL}, PROXY_URL), ("http://www.example.com", {"http://example.com": PROXY_URL}, None), # Using "*.example.com" should match www.example.com, but not example.com ("http://example.com", {"http://*.example.com": PROXY_URL}, None), ("http://www.example.com", {"http://*.example.com": PROXY_URL}, PROXY_URL), # Using "*example.com" should match example.com and www.example.com ("http://example.com", {"http://*example.com": PROXY_URL}, PROXY_URL), ("http://www.example.com", {"http://*example.com": PROXY_URL}, PROXY_URL), ("http://wwwexample.com", {"http://*example.com": PROXY_URL}, None), # ... ("http://example.com:443", {"http://example.com": PROXY_URL}, PROXY_URL), ("http://example.com", {"all://": PROXY_URL}, PROXY_URL), ("http://example.com", {"http://": PROXY_URL}, PROXY_URL), ("http://example.com", {"all://example.com": PROXY_URL}, PROXY_URL), ("http://example.com", {"http://example.com": PROXY_URL}, PROXY_URL), ("http://example.com", {"http://example.com:80": PROXY_URL}, PROXY_URL), ("http://example.com:8080", {"http://example.com:8080": PROXY_URL}, PROXY_URL), ("http://example.com:8080", {"http://example.com": PROXY_URL}, PROXY_URL), ( "http://example.com", { "all://": PROXY_URL + ":1", "http://": PROXY_URL + ":2", "all://example.com": PROXY_URL + ":3", "http://example.com": PROXY_URL + ":4", }, PROXY_URL + ":4", ), ( "http://example.com", { "all://": PROXY_URL + ":1", "http://": PROXY_URL + ":2", "all://example.com": PROXY_URL + ":3", }, PROXY_URL + ":3", ), ( "http://example.com", {"all://": PROXY_URL + ":1", "http://": PROXY_URL + ":2"}, PROXY_URL + ":2", ), ], ) def test_transport_for_request(url: str, proxies: dict[str, str], expected: str | None) -> None: mounts = {key: httpx2.HTTPTransport(proxy=value) for key, value in proxies.items()} client = httpx2.Client(mounts=mounts) transport = client._transport_for_url(httpx2.URL(url)) if expected is None: assert transport is client._transport else: assert isinstance(transport, httpx2.HTTPTransport) assert isinstance(transport._pool, httpcore2.HTTPProxy) assert transport._pool._proxy_url == url_to_origin(expected) @pytest.mark.anyio @pytest.mark.network async def test_async_proxy_close() -> None: transport = httpx2.AsyncHTTPTransport(proxy=PROXY_URL) client = httpx2.AsyncClient(mounts={"https://": transport}) try: await client.get("http://example.com") finally: await client.aclose() @pytest.mark.network def test_sync_proxy_close() -> None: transport = httpx2.HTTPTransport(proxy=PROXY_URL) client = httpx2.Client(mounts={"https://": transport}) try: client.get("http://example.com") finally: client.close() def test_unsupported_proxy_scheme() -> None: with pytest.raises(ValueError): httpx2.Client(proxy="ftp://127.0.0.1") @pytest.mark.parametrize( ["url", "env", "expected"], [ ("http://google.com", {}, None), ( "http://google.com", {"HTTP_PROXY": "http://example.com"}, "http://example.com", ), # Auto prepend http scheme ("http://google.com", {"HTTP_PROXY": "example.com"}, "http://example.com"), ( "http://google.com", {"HTTP_PROXY": "http://example.com", "NO_PROXY": "google.com"}, None, ), # Everything proxied when NO_PROXY is empty/unset ( "http://127.0.0.1", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": ""}, "http://localhost:123", ), # Not proxied if NO_PROXY matches URL. ( "http://127.0.0.1", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "127.0.0.1"}, None, ), # Proxied if NO_PROXY scheme does not match URL. ( "http://127.0.0.1", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "https://127.0.0.1"}, "http://localhost:123", ), # Proxied if NO_PROXY scheme does not match host. ( "http://127.0.0.1", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "1.1.1.1"}, "http://localhost:123", ), # Not proxied if NO_PROXY matches host domain suffix. ( "http://courses.mit.edu", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "mit.edu"}, None, ), # Proxied even though NO_PROXY matches host domain *prefix*. ( "https://mit.edu.info", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "mit.edu"}, "http://localhost:123", ), # Not proxied if one item in NO_PROXY case matches host domain suffix. ( "https://mit.edu.info", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "mit.edu,edu.info"}, None, ), # Not proxied if one item in NO_PROXY case matches host domain suffix. # May include whitespace. ( "https://mit.edu.info", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "mit.edu, edu.info"}, None, ), # Proxied if no items in NO_PROXY match. ( "https://mit.edu.info", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "mit.edu,mit.info"}, "http://localhost:123", ), # Proxied if NO_PROXY domain doesn't match. ( "https://foo.example.com", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "www.example.com"}, "http://localhost:123", ), # Not proxied for subdomains matching NO_PROXY, with a leading ".". ( "https://www.example1.com", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": ".example1.com"}, None, ), # Proxied, because NO_PROXY subdomains only match if "." separated. ( "https://www.example2.com", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "ample2.com"}, "http://localhost:123", ), # No requests are proxied if NO_PROXY="*" is set. ( "https://www.example3.com", {"ALL_PROXY": "http://localhost:123", "NO_PROXY": "*"}, None, ), ], ) @pytest.mark.parametrize("client_class", [httpx2.Client, httpx2.AsyncClient]) def test_proxies_environ( monkeypatch: pytest.MonkeyPatch, client_class: type[typing.Any], url: str, env: dict[str, str], expected: str | None, ) -> None: for name, value in env.items(): monkeypatch.setenv(name, value) client = client_class() transport = client._transport_for_url(httpx2.URL(url)) if expected is None: assert transport == client._transport else: assert transport._pool._proxy_url == url_to_origin(expected) @pytest.mark.parametrize( ["proxies", "is_valid"], [ ({"http": "http://127.0.0.1"}, False), ({"https": "http://127.0.0.1"}, False), ({"all": "http://127.0.0.1"}, False), ({"http://": "http://127.0.0.1"}, True), ({"https://": "http://127.0.0.1"}, True), ({"all://": "http://127.0.0.1"}, True), ], ) def test_for_deprecated_proxy_params(proxies: dict[str, str], is_valid: bool) -> None: mounts = {key: httpx2.HTTPTransport(proxy=value) for key, value in proxies.items()} if not is_valid: with pytest.raises(ValueError): httpx2.Client(mounts=mounts) else: httpx2.Client(mounts=mounts) def test_proxy_with_mounts() -> None: proxy_transport = httpx2.HTTPTransport(proxy="http://127.0.0.1") client = httpx2.Client(mounts={"http://": proxy_transport}) transport = client._transport_for_url(httpx2.URL("http://example.com")) assert transport == proxy_transport pydantic-httpx2-9b7ee8e/tests/httpx2/client/test_queryparams.py000066400000000000000000000021211521723372100251200ustar00rootroot00000000000000import httpx2 def hello_world(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, text="Hello, world") def test_client_queryparams() -> None: client = httpx2.Client(params={"a": "b"}) assert isinstance(client.params, httpx2.QueryParams) assert client.params["a"] == "b" def test_client_queryparams_string() -> None: client = httpx2.Client(params="a=b") assert isinstance(client.params, httpx2.QueryParams) assert client.params["a"] == "b" client = httpx2.Client() client.params = "a=b" assert isinstance(client.params, httpx2.QueryParams) assert client.params["a"] == "b" def test_client_queryparams_echo() -> None: url = "http://example.org/echo_queryparams" client_queryparams = "first=str" request_queryparams = {"second": "dict"} client = httpx2.Client(transport=httpx2.MockTransport(hello_world), params=client_queryparams) response = client.get(url, params=request_queryparams) assert response.status_code == 200 assert response.url == "http://example.org/echo_queryparams?first=str&second=dict" pydantic-httpx2-9b7ee8e/tests/httpx2/client/test_redirects.py000066400000000000000000000422541521723372100245460ustar00rootroot00000000000000import typing import pytest import httpx2 def redirects(request: httpx2.Request) -> httpx2.Response: if request.url.scheme not in ("http", "https"): msg = f"Scheme {request.url.scheme!r} not supported." raise httpx2.UnsupportedProtocol(msg) if request.url.path == "/redirect_301": status_code = httpx2.codes.MOVED_PERMANENTLY content = b"here" headers = {"location": "https://example.org/"} return httpx2.Response(status_code, headers=headers, content=content) elif request.url.path == "/redirect_302": status_code = httpx2.codes.FOUND headers = {"location": "https://example.org/"} return httpx2.Response(status_code, headers=headers) elif request.url.path == "/redirect_303": status_code = httpx2.codes.SEE_OTHER headers = {"location": "https://example.org/"} return httpx2.Response(status_code, headers=headers) elif request.url.path == "/relative_redirect": status_code = httpx2.codes.SEE_OTHER headers = {"location": "/"} return httpx2.Response(status_code, headers=headers) elif request.url.path == "/malformed_redirect": status_code = httpx2.codes.SEE_OTHER headers = {"location": "https://:443/"} return httpx2.Response(status_code, headers=headers) elif request.url.path == "/invalid_redirect": status_code = httpx2.codes.SEE_OTHER raw_headers = [(b"location", "https://πŸ˜‡/".encode())] return httpx2.Response(status_code, headers=raw_headers) elif request.url.path == "/no_scheme_redirect": status_code = httpx2.codes.SEE_OTHER headers = {"location": "//example.org/"} return httpx2.Response(status_code, headers=headers) elif request.url.path == "/multiple_redirects": params = httpx2.QueryParams(request.url.query) count = int(params.get("count", "0")) redirect_count = count - 1 status_code = httpx2.codes.SEE_OTHER if count else httpx2.codes.OK if count: location = "/multiple_redirects" if redirect_count: location += f"?count={redirect_count}" headers = {"location": location} else: headers = {} return httpx2.Response(status_code, headers=headers) if request.url.path == "/redirect_loop": status_code = httpx2.codes.SEE_OTHER headers = {"location": "/redirect_loop"} return httpx2.Response(status_code, headers=headers) elif request.url.path == "/cross_domain": status_code = httpx2.codes.SEE_OTHER headers = {"location": "https://example.org/cross_domain_target"} return httpx2.Response(status_code, headers=headers) elif request.url.path == "/cross_domain_target": status_code = httpx2.codes.OK data = { "body": request.content.decode("ascii"), "headers": dict(request.headers), } return httpx2.Response(status_code, json=data) elif request.url.path == "/redirect_body": status_code = httpx2.codes.PERMANENT_REDIRECT headers = {"location": "/redirect_body_target"} return httpx2.Response(status_code, headers=headers) elif request.url.path == "/redirect_no_body": status_code = httpx2.codes.SEE_OTHER headers = {"location": "/redirect_body_target"} return httpx2.Response(status_code, headers=headers) elif request.url.path == "/redirect_body_target": data = { "body": request.content.decode("ascii"), "headers": dict(request.headers), } return httpx2.Response(200, json=data) elif request.url.path == "/cross_subdomain": if request.headers["Host"] != "www.example.org": status_code = httpx2.codes.PERMANENT_REDIRECT headers = {"location": "https://www.example.org/cross_subdomain"} return httpx2.Response(status_code, headers=headers) else: return httpx2.Response(200, text="Hello, world!") elif request.url.path == "/redirect_custom_scheme": status_code = httpx2.codes.MOVED_PERMANENTLY headers = {"location": "market://details?id=42"} return httpx2.Response(status_code, headers=headers) if request.method == "HEAD": return httpx2.Response(200) return httpx2.Response(200, html="Hello, world!") def test_redirect_301() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) response = client.post("https://example.org/redirect_301", follow_redirects=True) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org/" assert len(response.history) == 1 def test_redirect_302() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) response = client.post("https://example.org/redirect_302", follow_redirects=True) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org/" assert len(response.history) == 1 def test_redirect_303() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) response = client.get("https://example.org/redirect_303", follow_redirects=True) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org/" assert len(response.history) == 1 def test_next_request() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) request = client.build_request("POST", "https://example.org/redirect_303") response = client.send(request, follow_redirects=False) assert response.status_code == httpx2.codes.SEE_OTHER assert response.url == "https://example.org/redirect_303" assert response.next_request is not None response = client.send(response.next_request, follow_redirects=False) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org/" assert response.next_request is None @pytest.mark.anyio async def test_async_next_request() -> None: async with httpx2.AsyncClient(transport=httpx2.MockTransport(redirects)) as client: request = client.build_request("POST", "https://example.org/redirect_303") response = await client.send(request, follow_redirects=False) assert response.status_code == httpx2.codes.SEE_OTHER assert response.url == "https://example.org/redirect_303" assert response.next_request is not None response = await client.send(response.next_request, follow_redirects=False) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org/" assert response.next_request is None def test_head_redirect() -> None: """ Contrary to Requests, redirects remain enabled by default for HEAD requests. """ client = httpx2.Client(transport=httpx2.MockTransport(redirects)) response = client.head("https://example.org/redirect_302", follow_redirects=True) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org/" assert response.request.method == "HEAD" assert len(response.history) == 1 assert response.text == "" def test_relative_redirect() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) response = client.get("https://example.org/relative_redirect", follow_redirects=True) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org/" assert len(response.history) == 1 def test_malformed_redirect() -> None: # https://github.com/encode/httpx/issues/771 client = httpx2.Client(transport=httpx2.MockTransport(redirects)) response = client.get("http://example.org/malformed_redirect", follow_redirects=True) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org:443/" assert len(response.history) == 1 def test_invalid_redirect() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) with pytest.raises(httpx2.RemoteProtocolError): client.get("http://example.org/invalid_redirect", follow_redirects=True) def test_no_scheme_redirect() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) response = client.get("https://example.org/no_scheme_redirect", follow_redirects=True) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org/" assert len(response.history) == 1 def test_fragment_redirect() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) response = client.get("https://example.org/relative_redirect#fragment", follow_redirects=True) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org/#fragment" assert len(response.history) == 1 def test_multiple_redirects() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) response = client.get("https://example.org/multiple_redirects?count=20", follow_redirects=True) assert response.status_code == httpx2.codes.OK assert response.url == "https://example.org/multiple_redirects" assert len(response.history) == 20 assert response.history[0].url == "https://example.org/multiple_redirects?count=20" assert response.history[1].url == "https://example.org/multiple_redirects?count=19" assert len(response.history[0].history) == 0 assert len(response.history[1].history) == 1 @pytest.mark.anyio async def test_async_too_many_redirects() -> None: async with httpx2.AsyncClient(transport=httpx2.MockTransport(redirects)) as client: with pytest.raises(httpx2.TooManyRedirects): await client.get("https://example.org/multiple_redirects?count=21", follow_redirects=True) def test_sync_too_many_redirects() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) with pytest.raises(httpx2.TooManyRedirects): client.get("https://example.org/multiple_redirects?count=21", follow_redirects=True) def test_redirect_loop() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) with pytest.raises(httpx2.TooManyRedirects): client.get("https://example.org/redirect_loop", follow_redirects=True) def test_cross_domain_redirect_with_auth_header() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) url = "https://example.com/cross_domain" headers = {"Authorization": "abc"} response = client.get(url, headers=headers, follow_redirects=True) assert response.url == "https://example.org/cross_domain_target" assert "authorization" not in response.json()["headers"] def test_cross_domain_https_redirect_with_auth_header() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) url = "http://example.com/cross_domain" headers = {"Authorization": "abc"} response = client.get(url, headers=headers, follow_redirects=True) assert response.url == "https://example.org/cross_domain_target" assert "authorization" not in response.json()["headers"] def test_cross_domain_redirect_with_auth() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) url = "https://example.com/cross_domain" response = client.get(url, auth=("user", "pass"), follow_redirects=True) assert response.url == "https://example.org/cross_domain_target" assert "authorization" not in response.json()["headers"] def test_same_domain_redirect() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) url = "https://example.org/cross_domain" headers = {"Authorization": "abc"} response = client.get(url, headers=headers, follow_redirects=True) assert response.url == "https://example.org/cross_domain_target" assert response.json()["headers"]["authorization"] == "abc" def test_same_domain_https_redirect_with_auth_header() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) url = "http://example.org/cross_domain" headers = {"Authorization": "abc"} response = client.get(url, headers=headers, follow_redirects=True) assert response.url == "https://example.org/cross_domain_target" assert response.json()["headers"]["authorization"] == "abc" def test_body_redirect() -> None: """ A 308 redirect should preserve the request body. """ client = httpx2.Client(transport=httpx2.MockTransport(redirects)) url = "https://example.org/redirect_body" content = b"Example request body" response = client.post(url, content=content, follow_redirects=True) assert response.url == "https://example.org/redirect_body_target" assert response.json()["body"] == "Example request body" assert "content-length" in response.json()["headers"] def test_no_body_redirect() -> None: """ A 303 redirect should remove the request body. """ client = httpx2.Client(transport=httpx2.MockTransport(redirects)) url = "https://example.org/redirect_no_body" content = b"Example request body" response = client.post(url, content=content, follow_redirects=True) assert response.url == "https://example.org/redirect_body_target" assert response.json()["body"] == "" assert "content-length" not in response.json()["headers"] def test_can_stream_if_no_redirect() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) url = "https://example.org/redirect_301" with client.stream("GET", url, follow_redirects=False) as response: pass assert response.status_code == httpx2.codes.MOVED_PERMANENTLY assert response.headers["location"] == "https://example.org/" class ConsumeBodyTransport(httpx2.MockTransport): def handle_request(self, request: httpx2.Request) -> httpx2.Response: assert isinstance(request.stream, httpx2.SyncByteStream) list(request.stream) return self.handler(request) # type: ignore[return-value] def test_cannot_redirect_streaming_body() -> None: client = httpx2.Client(transport=ConsumeBodyTransport(redirects)) url = "https://example.org/redirect_body" def streaming_body() -> typing.Iterator[bytes]: yield b"Example request body" # pragma: no cover with pytest.raises(httpx2.StreamConsumed): client.post(url, content=streaming_body(), follow_redirects=True) def test_cross_subdomain_redirect() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) url = "https://example.com/cross_subdomain" response = client.get(url, follow_redirects=True) assert response.url == "https://www.example.org/cross_subdomain" def cookie_sessions(request: httpx2.Request) -> httpx2.Response: if request.url.path == "/": cookie = request.headers.get("Cookie") if cookie is not None: content = b"Logged in" else: content = b"Not logged in" return httpx2.Response(200, content=content) elif request.url.path == "/login": status_code = httpx2.codes.SEE_OTHER headers = { "location": "/", "set-cookie": ("session=eyJ1c2VybmFtZSI6ICJ0b21; path=/; Max-Age=1209600; httponly; samesite=lax"), } return httpx2.Response(status_code, headers=headers) else: assert request.url.path == "/logout" status_code = httpx2.codes.SEE_OTHER headers = { "location": "/", "set-cookie": ("session=null; path=/; expires=Thu, 01 Jan 1970 00:00:00 GMT; httponly; samesite=lax"), } return httpx2.Response(status_code, headers=headers) def test_redirect_cookie_behavior() -> None: client = httpx2.Client(transport=httpx2.MockTransport(cookie_sessions), follow_redirects=True) # The client is not logged in. response = client.get("https://example.com/") assert response.url == "https://example.com/" assert response.text == "Not logged in" # Login redirects to the homepage, setting a session cookie. response = client.post("https://example.com/login") assert response.url == "https://example.com/" assert response.text == "Logged in" # The client is logged in. response = client.get("https://example.com/") assert response.url == "https://example.com/" assert response.text == "Logged in" # Logout redirects to the homepage, expiring the session cookie. response = client.post("https://example.com/logout") assert response.url == "https://example.com/" assert response.text == "Not logged in" # The client is not logged in. response = client.get("https://example.com/") assert response.url == "https://example.com/" assert response.text == "Not logged in" def test_redirect_custom_scheme() -> None: client = httpx2.Client(transport=httpx2.MockTransport(redirects)) with pytest.raises(httpx2.UnsupportedProtocol) as e: client.post("https://example.org/redirect_custom_scheme", follow_redirects=True) assert str(e.value) == "Scheme 'market' not supported." @pytest.mark.anyio async def test_async_invalid_redirect() -> None: async with httpx2.AsyncClient(transport=httpx2.MockTransport(redirects)) as client: with pytest.raises(httpx2.RemoteProtocolError): await client.get("http://example.org/invalid_redirect", follow_redirects=True) pydantic-httpx2-9b7ee8e/tests/httpx2/common.py000066400000000000000000000001401521723372100215210ustar00rootroot00000000000000import pathlib TESTS_DIR = pathlib.Path(__file__).parent FIXTURES_DIR = TESTS_DIR / "fixtures" pydantic-httpx2-9b7ee8e/tests/httpx2/concurrency.py000066400000000000000000000005041521723372100225670ustar00rootroot00000000000000""" Async environment-agnostic concurrency utilities that are only used in tests. """ import asyncio import sniffio import trio async def sleep(seconds: float) -> None: if sniffio.current_async_library() == "trio": await trio.sleep(seconds) # pragma: no cover else: await asyncio.sleep(seconds) pydantic-httpx2-9b7ee8e/tests/httpx2/conftest.py000066400000000000000000000212741521723372100220710ustar00rootroot00000000000000import asyncio import json import os import socket import threading import time import typing import pytest import trustme from cryptography.hazmat.backends import default_backend from cryptography.hazmat.primitives.serialization import ( BestAvailableEncryption, Encoding, PrivateFormat, load_pem_private_key, ) from uvicorn.config import Config from uvicorn.server import Server import httpx2 from tests.httpx2.concurrency import sleep ENVIRONMENT_VARIABLES = { "SSL_CERT_FILE", "SSL_CERT_DIR", "HTTP_PROXY", "HTTPS_PROXY", "ALL_PROXY", "NO_PROXY", "SSLKEYLOGFILE", } @pytest.fixture(scope="function", autouse=True) def clean_environ() -> typing.Iterator[None]: """Keeps os.environ clean for every test without having to mock os.environ""" original_environ = os.environ.copy() os.environ.clear() os.environ.update( { k: v for k, v in original_environ.items() if k not in ENVIRONMENT_VARIABLES and k.lower() not in ENVIRONMENT_VARIABLES } ) yield os.environ.clear() os.environ.update(original_environ) Message = dict[str, typing.Any] Receive = typing.Callable[[], typing.Awaitable[Message]] Send = typing.Callable[[dict[str, typing.Any]], typing.Coroutine[None, None, None]] Scope = dict[str, typing.Any] async def app(scope: Scope, receive: Receive, send: Send) -> None: assert scope["type"] == "http" if scope["path"].startswith("/slow_response"): await slow_response(scope, receive, send) elif scope["path"].startswith("/status"): await status_code(scope, receive, send) elif scope["path"].startswith("/echo_body"): await echo_body(scope, receive, send) elif scope["path"].startswith("/echo_binary"): await echo_binary(scope, receive, send) elif scope["path"].startswith("/echo_headers"): await echo_headers(scope, receive, send) elif scope["path"].startswith("/redirect_301"): await redirect_301(scope, receive, send) elif scope["path"].startswith("/json"): await hello_world_json(scope, receive, send) else: await hello_world(scope, receive, send) async def hello_world(scope: Scope, receive: Receive, send: Send) -> None: await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"text/plain"]], } ) await send({"type": "http.response.body", "body": b"Hello, world!"}) async def hello_world_json(scope: Scope, receive: Receive, send: Send) -> None: await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"application/json"]], } ) await send({"type": "http.response.body", "body": b'{"Hello": "world!"}'}) async def slow_response(scope: Scope, receive: Receive, send: Send) -> None: await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"text/plain"]], } ) await sleep(1.0) # Allow triggering a read timeout. await send({"type": "http.response.body", "body": b"Hello, world!"}) async def status_code(scope: Scope, receive: Receive, send: Send) -> None: status_code = int(scope["path"].replace("/status/", "")) await send( { "type": "http.response.start", "status": status_code, "headers": [[b"content-type", b"text/plain"]], } ) await send({"type": "http.response.body", "body": b"Hello, world!"}) async def echo_body(scope: Scope, receive: Receive, send: Send) -> None: body = b"" more_body = True while more_body: message = await receive() body += message.get("body", b"") more_body = message.get("more_body", False) await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"text/plain"]], } ) await send({"type": "http.response.body", "body": body}) async def echo_binary(scope: Scope, receive: Receive, send: Send) -> None: body = b"" more_body = True while more_body: message = await receive() body += message.get("body", b"") more_body = message.get("more_body", False) await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"application/octet-stream"]], } ) await send({"type": "http.response.body", "body": body}) async def echo_headers(scope: Scope, receive: Receive, send: Send) -> None: body = {name.capitalize().decode(): value.decode() for name, value in scope.get("headers", [])} await send( { "type": "http.response.start", "status": 200, "headers": [[b"content-type", b"application/json"]], } ) await send({"type": "http.response.body", "body": json.dumps(body).encode()}) async def redirect_301(scope: Scope, receive: Receive, send: Send) -> None: await send({"type": "http.response.start", "status": 301, "headers": [[b"location", b"/"]]}) await send({"type": "http.response.body"}) @pytest.fixture(scope="session") def cert_authority() -> trustme.CA: return trustme.CA() @pytest.fixture(scope="session") def localhost_cert(cert_authority: trustme.CA) -> trustme.LeafCert: return cert_authority.issue_cert("localhost") @pytest.fixture(scope="session") def cert_pem_file(localhost_cert: trustme.LeafCert) -> typing.Iterator[str]: with localhost_cert.cert_chain_pems[0].tempfile() as tmp: yield tmp @pytest.fixture(scope="session") def cert_private_key_file(localhost_cert: trustme.LeafCert) -> typing.Iterator[str]: with localhost_cert.private_key_pem.tempfile() as tmp: yield tmp @pytest.fixture(scope="session") def cert_encrypted_private_key_file(localhost_cert: trustme.LeafCert) -> typing.Iterator[str]: # Deserialize the private key and then reserialize with a password private_key = load_pem_private_key(localhost_cert.private_key_pem.bytes(), password=None, backend=default_backend()) encrypted_private_key_pem = trustme.Blob( private_key.private_bytes( Encoding.PEM, PrivateFormat.TraditionalOpenSSL, BestAvailableEncryption(password=b"password"), ) ) with encrypted_private_key_pem.tempfile() as tmp: yield tmp class TestServer(Server): @property def url(self) -> httpx2.URL: protocol = "https" if self.config.is_ssl else "http" return httpx2.URL(f"{protocol}://{self.config.host}:{self.config.port}/") def install_signal_handlers(self) -> None: # Disable the default installation of handlers for signals such as SIGTERM, # because it can only be done in the main thread. pass # pragma: no cover async def serve(self, sockets: list[socket.socket] | None = None) -> None: self.restart_requested = asyncio.Event() loop = asyncio.get_running_loop() tasks = { loop.create_task(super().serve(sockets=sockets)), loop.create_task(self.watch_restarts()), } await asyncio.wait(tasks) async def restart(self) -> None: # pragma: no cover # This coroutine may be called from a different thread than the one the # server is running on, and from an async environment that's not asyncio. # For this reason, we use an event to coordinate with the server # instead of calling shutdown()/startup() directly, and should not make # any asyncio-specific operations. self.started = False self.restart_requested.set() while not self.started: await sleep(0.2) async def watch_restarts(self) -> None: # pragma: no cover while True: if self.should_exit: return try: await asyncio.wait_for(self.restart_requested.wait(), timeout=0.1) except asyncio.TimeoutError: continue self.restart_requested.clear() await self.shutdown() await self.startup() def serve_in_thread(server: TestServer) -> typing.Iterator[TestServer]: thread = threading.Thread(target=server.run) thread.start() try: while not server.started: time.sleep(1e-3) yield server finally: server.should_exit = True thread.join() @pytest.fixture(scope="session") def server(free_tcp_port_factory: typing.Callable[[], int]) -> typing.Iterator[TestServer]: config = Config(app=app, lifespan="off", loop="asyncio", port=free_tcp_port_factory()) server = TestServer(config=config) yield from serve_in_thread(server) pydantic-httpx2-9b7ee8e/tests/httpx2/fixtures/000077500000000000000000000000001521723372100215355ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpx2/fixtures/.netrc000066400000000000000000000001111521723372100226420ustar00rootroot00000000000000machine netrcexample.org login example-username password example-passwordpydantic-httpx2-9b7ee8e/tests/httpx2/fixtures/.netrc-nopassword000066400000000000000000000000601521723372100250420ustar00rootroot00000000000000machine netrcexample.org login example-username pydantic-httpx2-9b7ee8e/tests/httpx2/models/000077500000000000000000000000001521723372100211475ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpx2/models/__init__.py000066400000000000000000000000001521723372100232460ustar00rootroot00000000000000pydantic-httpx2-9b7ee8e/tests/httpx2/models/test_cookies.py000066400000000000000000000056301521723372100242200ustar00rootroot00000000000000import http.cookiejar import pytest import httpx2 def test_cookies() -> None: cookies = httpx2.Cookies({"name": "value"}) assert cookies["name"] == "value" assert "name" in cookies assert len(cookies) == 1 assert dict(cookies) == {"name": "value"} assert bool(cookies) is True del cookies["name"] assert "name" not in cookies assert len(cookies) == 0 assert dict(cookies) == {} assert bool(cookies) is False def test_cookies_update() -> None: cookies = httpx2.Cookies() more_cookies = httpx2.Cookies() more_cookies.set("name", "value", domain="example.com") cookies.update(more_cookies) assert dict(cookies) == {"name": "value"} assert cookies.get("name", domain="example.com") == "value" def test_cookies_with_domain() -> None: cookies = httpx2.Cookies() cookies.set("name", "value", domain="example.com") cookies.set("name", "value", domain="example.org") with pytest.raises(httpx2.CookieConflict): cookies["name"] cookies.clear(domain="example.com") assert len(cookies) == 1 def test_cookies_with_domain_and_path() -> None: cookies = httpx2.Cookies() cookies.set("name", "value", domain="example.com", path="/subpath/1") cookies.set("name", "value", domain="example.com", path="/subpath/2") cookies.clear(domain="example.com", path="/subpath/1") assert len(cookies) == 1 cookies.delete("name", domain="example.com", path="/subpath/2") assert len(cookies) == 0 def test_multiple_set_cookie() -> None: jar = http.cookiejar.CookieJar() headers = [ ( b"Set-Cookie", b"1P_JAR=2020-08-09-18; expires=Tue, 08-Sep-2099 18:33:35 GMT; path=/; domain=.example.org; Secure", ), ( b"Set-Cookie", b"NID=204=KWdXOuypc86YvRfBSiWoW1dEXfSl_5qI7sxZY4umlk4J35yNTeNEkw15" b"MRaujK6uYCwkrtjihTTXZPp285z_xDOUzrdHt4dj0Z5C0VOpbvdLwRdHatHAzQs7" b"7TsaiWY78a3qU9r7KP_RbSLvLl2hlhnWFR2Hp5nWKPsAcOhQgSg; expires=Mon, " b"08-Feb-2099 18:33:35 GMT; path=/; domain=.example.org; HttpOnly", ), ] request = httpx2.Request("GET", "https://www.example.org") response = httpx2.Response(200, request=request, headers=headers) cookies = httpx2.Cookies(jar) cookies.extract_cookies(response) assert len(cookies) == 2 def test_cookies_can_be_a_list_of_tuples() -> None: cookies_val = [("name1", "val1"), ("name2", "val2")] cookies = httpx2.Cookies(cookies_val) assert len(cookies.items()) == 2 for k, v in cookies_val: assert cookies[k] == v def test_cookies_repr() -> None: cookies = httpx2.Cookies() cookies.set(name="foo", value="bar", domain="http://blah.com") cookies.set(name="fizz", value="buzz", domain="http://hello.com") assert repr(cookies) == ( ", ]>" ) pydantic-httpx2-9b7ee8e/tests/httpx2/models/test_headers.py000066400000000000000000000205061521723372100241760ustar00rootroot00000000000000from __future__ import annotations import pytest import httpx2 def test_headers() -> None: h = httpx2.Headers([("a", "123"), ("a", "456"), ("b", "789")]) assert "a" in h assert "A" in h assert "b" in h assert "B" in h assert "c" not in h assert h["a"] == "123, 456" assert h.get("a") == "123, 456" assert h.get("nope", default=None) is None assert h.get_list("a") == ["123", "456"] assert list(h.keys()) == ["a", "b"] assert list(h.values()) == ["123, 456", "789"] assert list(h.items()) == [("a", "123, 456"), ("b", "789")] assert h.multi_items() == [("a", "123"), ("a", "456"), ("b", "789")] assert list(h) == ["a", "b"] assert dict(h) == {"a": "123, 456", "b": "789"} assert repr(h) == "Headers([('a', '123'), ('a', '456'), ('b', '789')])" assert h == [("a", "123"), ("b", "789"), ("a", "456")] assert h == [("a", "123"), ("A", "456"), ("b", "789")] assert h == {"a": "123", "A": "456", "b": "789"} assert h != "a: 123\nA: 456\nb: 789" h = httpx2.Headers({"a": "123", "b": "789"}) assert h["A"] == "123" assert h["B"] == "789" assert h.raw == [(b"a", b"123"), (b"b", b"789")] assert repr(h) == "Headers({'a': '123', 'b': '789'})" def test_header_mutations() -> None: h = httpx2.Headers() assert dict(h) == {} h["a"] = "1" assert dict(h) == {"a": "1"} h["a"] = "2" assert dict(h) == {"a": "2"} h.setdefault("a", "3") assert dict(h) == {"a": "2"} h.setdefault("b", "4") assert dict(h) == {"a": "2", "b": "4"} del h["a"] assert dict(h) == {"b": "4"} assert h.raw == [(b"b", b"4")] def test_copy_headers_method() -> None: headers = httpx2.Headers({"custom": "example"}) headers_copy = headers.copy() assert headers == headers_copy assert headers is not headers_copy def test_copy_headers_init() -> None: headers = httpx2.Headers({"custom": "example"}) headers_copy = httpx2.Headers(headers) assert headers == headers_copy def test_headers_or() -> None: left = httpx2.Headers({"a": "1", "b": "2"}) merged = left | {"b": "3", "c": "4"} assert isinstance(merged, httpx2.Headers) assert dict(merged) == {"a": "1", "b": "3", "c": "4"} assert dict(left) == {"a": "1", "b": "2"} def test_headers_or_with_headers() -> None: merged = httpx2.Headers({"a": "1"}) | httpx2.Headers({"a": "2"}) assert dict(merged) == {"a": "2"} def test_headers_ror() -> None: merged = {"a": "1", "b": "2"} | httpx2.Headers({"b": "3"}) assert isinstance(merged, httpx2.Headers) assert dict(merged) == {"a": "1", "b": "3"} def test_headers_ior() -> None: headers = httpx2.Headers({"a": "1"}) original = headers headers |= {"a": "2", "b": "3"} assert headers is original assert dict(headers) == {"a": "2", "b": "3"} def test_headers_ior_accepts_update_inputs() -> None: headers = httpx2.Headers({"a": "1"}) headers |= [("a", "2"), ("b", "3")] assert dict(headers) == {"a": "2", "b": "3"} def test_headers_or_unsupported_type() -> None: with pytest.raises(TypeError): httpx2.Headers({"a": "1"}) | [("b", "2")] # type: ignore[operator] with pytest.raises(TypeError): [("b", "2")] | httpx2.Headers({"a": "1"}) # type: ignore[operator] def test_headers_insert_retains_ordering() -> None: headers = httpx2.Headers({"a": "a", "b": "b", "c": "c"}) headers["b"] = "123" assert list(headers.values()) == ["a", "123", "c"] def test_headers_insert_appends_if_new() -> None: headers = httpx2.Headers({"a": "a", "b": "b", "c": "c"}) headers["d"] = "123" assert list(headers.values()) == ["a", "b", "c", "123"] def test_headers_insert_removes_all_existing() -> None: headers = httpx2.Headers([("a", "123"), ("a", "456")]) headers["a"] = "789" assert dict(headers) == {"a": "789"} def test_headers_delete_removes_all_existing() -> None: headers = httpx2.Headers([("a", "123"), ("a", "456")]) del headers["a"] assert dict(headers) == {} def test_headers_dict_repr() -> None: """ Headers should display with a dict repr by default. """ headers = httpx2.Headers({"custom": "example"}) assert repr(headers) == "Headers({'custom': 'example'})" def test_headers_encoding_in_repr() -> None: """ Headers should display an encoding in the repr if required. """ headers = httpx2.Headers({b"custom": "example β˜ƒ".encode()}) assert repr(headers) == "Headers({'custom': 'example β˜ƒ'}, encoding='utf-8')" def test_headers_list_repr() -> None: """ Headers should display with a list repr if they include multiple identical keys. """ headers = httpx2.Headers([("custom", "example 1"), ("custom", "example 2")]) assert repr(headers) == "Headers([('custom', 'example 1'), ('custom', 'example 2')])" def test_headers_decode_ascii() -> None: """ Headers should decode as ascii by default. """ raw_headers = [(b"Custom", b"Example")] headers = httpx2.Headers(raw_headers) assert dict(headers) == {"custom": "Example"} assert headers.encoding == "ascii" def test_headers_decode_utf_8() -> None: """ Headers containing non-ascii codepoints should default to decoding as utf-8. """ raw_headers = [(b"Custom", "Code point: β˜ƒ".encode())] headers = httpx2.Headers(raw_headers) assert dict(headers) == {"custom": "Code point: β˜ƒ"} assert headers.encoding == "utf-8" def test_headers_decode_iso_8859_1() -> None: """ Headers containing non-UTF-8 codepoints should default to decoding as iso-8859-1. """ raw_headers = [(b"Custom", "Code point: ΓΏ".encode("iso-8859-1"))] headers = httpx2.Headers(raw_headers) assert dict(headers) == {"custom": "Code point: ΓΏ"} assert headers.encoding == "iso-8859-1" def test_headers_decode_explicit_encoding() -> None: """ An explicit encoding may be set on headers in order to force a particular decoding. """ raw_headers = [(b"Custom", "Code point: β˜ƒ".encode())] headers = httpx2.Headers(raw_headers) headers.encoding = "iso-8859-1" assert dict(headers) == {"custom": "Code point: Γ’\x98\x83"} assert headers.encoding == "iso-8859-1" def test_multiple_headers() -> None: """ `Headers.get_list` should support both split_commas=False and split_commas=True. """ h = httpx2.Headers([("set-cookie", "a, b"), ("set-cookie", "c")]) assert h.get_list("Set-Cookie") == ["a, b", "c"] h = httpx2.Headers([("vary", "a, b"), ("vary", "c")]) assert h.get_list("Vary", split_commas=True) == ["a", "b", "c"] @pytest.mark.parametrize("header", ["authorization", "proxy-authorization"]) def test_sensitive_headers(header: str) -> None: """ Some headers should be obfuscated because they contain sensitive data. """ value = "s3kr3t" h = httpx2.Headers({header: value}) assert repr(h) == f"Headers({{'{header}': '[secure]'}})" @pytest.mark.parametrize( "headers, output", [ ([("content-type", "text/html")], [("content-type", "text/html")]), ([("authorization", "s3kr3t")], [("authorization", "[secure]")]), ([("proxy-authorization", "s3kr3t")], [("proxy-authorization", "[secure]")]), ], ) def test_obfuscate_sensitive_headers(headers: list[tuple[str, str]], output: list[tuple[str, str]]) -> None: as_dict = dict(output) headers_class = httpx2.Headers(dict(headers)) assert repr(headers_class) == f"Headers({as_dict!r})" @pytest.mark.parametrize( "value, expected", ( ( '; rel=front; type="image/jpeg"', [{"url": "http:/.../front.jpeg", "rel": "front", "type": "image/jpeg"}], ), ("", [{"url": "http:/.../front.jpeg"}]), (";", [{"url": "http:/.../front.jpeg"}]), ( '; type="image/jpeg",;', [ {"url": "http:/.../front.jpeg", "type": "image/jpeg"}, {"url": "http://.../back.jpeg"}, ], ), ("", []), ), ) def test_parse_header_links(value: str, expected: list[dict[str, str]]) -> None: all_links = httpx2.Response(200, headers={"link": value}).links.values() assert all(link in all_links for link in expected) def test_parse_header_links_no_link() -> None: all_links = httpx2.Response(200).links assert all_links == {} pydantic-httpx2-9b7ee8e/tests/httpx2/models/test_queryparams.py000066400000000000000000000071571521723372100251430ustar00rootroot00000000000000from __future__ import annotations import typing import pytest import httpx2 @pytest.mark.parametrize( "source", [ "a=123&a=456&b=789", {"a": ["123", "456"], "b": 789}, {"a": ("123", "456"), "b": 789}, [("a", "123"), ("a", "456"), ("b", "789")], (("a", "123"), ("a", "456"), ("b", "789")), ], ) def test_queryparams(source: typing.Any) -> None: q = httpx2.QueryParams(source) assert "a" in q assert "A" not in q assert "c" not in q assert q["a"] == "123" assert q.get("a") == "123" assert q.get("nope", default=None) is None assert q.get_list("a") == ["123", "456"] assert list(q.keys()) == ["a", "b"] assert list(q.values()) == ["123", "789"] assert list(q.items()) == [("a", "123"), ("b", "789")] assert len(q) == 2 assert list(q) == ["a", "b"] assert dict(q) == {"a": "123", "b": "789"} assert str(q) == "a=123&a=456&b=789" assert repr(q) == "QueryParams('a=123&a=456&b=789')" assert httpx2.QueryParams({"a": "123", "b": "456"}) == httpx2.QueryParams([("a", "123"), ("b", "456")]) assert httpx2.QueryParams({"a": "123", "b": "456"}) == httpx2.QueryParams("a=123&b=456") assert httpx2.QueryParams({"a": "123", "b": "456"}) == httpx2.QueryParams({"b": "456", "a": "123"}) assert httpx2.QueryParams() == httpx2.QueryParams({}) assert httpx2.QueryParams([("a", "123"), ("a", "456")]) == httpx2.QueryParams("a=123&a=456") assert httpx2.QueryParams({"a": "123", "b": "456"}) != "invalid" q = httpx2.QueryParams([("a", "123"), ("a", "456")]) assert httpx2.QueryParams(q) == q def test_queryparam_types() -> None: q = httpx2.QueryParams(None) assert str(q) == "" q = httpx2.QueryParams({"a": True}) assert str(q) == "a=true" q = httpx2.QueryParams({"a": False}) assert str(q) == "a=false" q = httpx2.QueryParams({"a": ""}) assert str(q) == "a=" q = httpx2.QueryParams({"a": None}) assert str(q) == "a=" q = httpx2.QueryParams({"a": 1.23}) assert str(q) == "a=1.23" q = httpx2.QueryParams({"a": 123}) assert str(q) == "a=123" q = httpx2.QueryParams({"a": [1, 2]}) assert str(q) == "a=1&a=2" def test_empty_query_params() -> None: q = httpx2.QueryParams({"a": ""}) assert str(q) == "a=" q = httpx2.QueryParams("a=") assert str(q) == "a=" q = httpx2.QueryParams("a") assert str(q) == "a=" def test_queryparam_update_is_hard_deprecated() -> None: q = httpx2.QueryParams("a=123") with pytest.raises(RuntimeError): q.update({"a": "456"}) def test_queryparam_setter_is_hard_deprecated() -> None: q = httpx2.QueryParams("a=123") with pytest.raises(RuntimeError): q["a"] = "456" def test_queryparam_set() -> None: q = httpx2.QueryParams("a=123") q = q.set("a", "456") assert q == httpx2.QueryParams("a=456") def test_queryparam_add() -> None: q = httpx2.QueryParams("a=123") q = q.add("a", "456") assert q == httpx2.QueryParams("a=123&a=456") def test_queryparam_remove() -> None: q = httpx2.QueryParams("a=123") q = q.remove("a") assert q == httpx2.QueryParams("") def test_queryparam_merge() -> None: q = httpx2.QueryParams("a=123") q = q.merge({"b": "456"}) assert q == httpx2.QueryParams("a=123&b=456") q = q.merge({"a": "000", "c": "789"}) assert q == httpx2.QueryParams("a=000&b=456&c=789") def test_queryparams_are_hashable() -> None: params = ( httpx2.QueryParams("a=123"), httpx2.QueryParams({"a": 123}), httpx2.QueryParams("b=456"), httpx2.QueryParams({"b": 456}), ) assert len(set(params)) == 2 pydantic-httpx2-9b7ee8e/tests/httpx2/models/test_requests.py000066400000000000000000000203521521723372100244350ustar00rootroot00000000000000from __future__ import annotations import pickle import typing import pytest import httpx2 def test_request_repr() -> None: request = httpx2.Request("GET", "http://example.org") assert repr(request) == "" def test_no_content() -> None: request = httpx2.Request("GET", "http://example.org") assert "Content-Length" not in request.headers def test_content_length_header() -> None: request = httpx2.Request("POST", "http://example.org", content=b"test 123") assert request.headers["Content-Length"] == "8" def test_iterable_content() -> None: class Content: def __iter__(self) -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover request = httpx2.Request("POST", "http://example.org", content=Content()) assert request.headers == {"Host": "example.org", "Transfer-Encoding": "chunked"} def test_generator_with_transfer_encoding_header() -> None: def content() -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover request = httpx2.Request("POST", "http://example.org", content=content()) assert request.headers == {"Host": "example.org", "Transfer-Encoding": "chunked"} def test_generator_with_content_length_header() -> None: def content() -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover headers = {"Content-Length": "8"} request = httpx2.Request("POST", "http://example.org", content=content(), headers=headers) assert request.headers == {"Host": "example.org", "Content-Length": "8"} def test_url_encoded_data() -> None: request = httpx2.Request("POST", "http://example.org", data={"test": "123"}) request.read() assert request.headers["Content-Type"] == "application/x-www-form-urlencoded" assert request.content == b"test=123" def test_json_encoded_data() -> None: request = httpx2.Request("POST", "http://example.org", json={"test": 123}) request.read() assert request.headers["Content-Type"] == "application/json" assert request.content == b'{"test":123}' def test_headers() -> None: request = httpx2.Request("POST", "http://example.org", json={"test": 123}) assert request.headers == { "Host": "example.org", "Content-Type": "application/json", "Content-Length": "12", } def test_read_and_stream_data() -> None: # Ensure a request may still be streamed if it has been read. # Needed for cases such as authentication classes that read the request body. request = httpx2.Request("POST", "http://example.org", json={"test": 123}) request.read() assert request.stream is not None assert isinstance(request.stream, typing.Iterable) content = b"".join(list(request.stream)) assert content == request.content @pytest.mark.anyio async def test_aread_and_stream_data() -> None: # Ensure a request may still be streamed if it has been read. # Needed for cases such as authentication classes that read the request body. request = httpx2.Request("POST", "http://example.org", json={"test": 123}) await request.aread() assert request.stream is not None assert isinstance(request.stream, typing.AsyncIterable) content = b"".join([part async for part in request.stream]) assert content == request.content def test_cannot_access_streaming_content_without_read() -> None: # Ensure that streaming requests def streaming_body() -> typing.Iterator[bytes]: # pragma: no cover yield b"" request = httpx2.Request("POST", "http://example.org", content=streaming_body()) with pytest.raises(httpx2.RequestNotRead): request.content # noqa: B018 def test_transfer_encoding_header() -> None: async def streaming_body(data: bytes) -> typing.AsyncIterator[bytes]: yield data # pragma: no cover data = streaming_body(b"test 123") request = httpx2.Request("POST", "http://example.org", content=data) assert "Content-Length" not in request.headers assert request.headers["Transfer-Encoding"] == "chunked" def test_ignore_transfer_encoding_header_if_content_length_exists() -> None: """ `Transfer-Encoding` should be ignored if `Content-Length` has been set explicitly. See https://github.com/encode/httpx/issues/1168 """ def streaming_body(data: bytes) -> typing.Iterator[bytes]: yield data # pragma: no cover data = streaming_body(b"abcd") headers = {"Content-Length": "4"} request = httpx2.Request("POST", "http://example.org", content=data, headers=headers) assert "Transfer-Encoding" not in request.headers assert request.headers["Content-Length"] == "4" def test_override_host_header() -> None: headers = {"host": "1.2.3.4:80"} request = httpx2.Request("GET", "http://example.org", headers=headers) assert request.headers["Host"] == "1.2.3.4:80" def test_override_accept_encoding_header() -> None: headers = {"Accept-Encoding": "identity"} request = httpx2.Request("GET", "http://example.org", headers=headers) assert request.headers["Accept-Encoding"] == "identity" def test_override_content_length_header() -> None: async def streaming_body(data: bytes) -> typing.AsyncIterator[bytes]: yield data # pragma: no cover data = streaming_body(b"test 123") headers = {"Content-Length": "8"} request = httpx2.Request("POST", "http://example.org", content=data, headers=headers) assert request.headers["Content-Length"] == "8" def test_url() -> None: url = "http://example.org" request = httpx2.Request("GET", url) assert request.url.scheme == "http" assert request.url.port is None assert request.url.path == "/" assert request.url.raw_path == b"/" url = "https://example.org/abc?foo=bar" request = httpx2.Request("GET", url) assert request.url.scheme == "https" assert request.url.port is None assert request.url.path == "/abc" assert request.url.raw_path == b"/abc?foo=bar" def test_request_picklable() -> None: request = httpx2.Request("POST", "http://example.org", json={"test": 123}) pickle_request = pickle.loads(pickle.dumps(request)) assert pickle_request.method == "POST" assert pickle_request.url.path == "/" assert pickle_request.headers["Content-Type"] == "application/json" assert pickle_request.content == b'{"test":123}' assert pickle_request.stream is not None assert request.headers == { "Host": "example.org", "Content-Type": "application/json", "content-length": "12", } @pytest.mark.anyio async def test_request_async_streaming_content_picklable() -> None: async def streaming_body(data: bytes) -> typing.AsyncIterator[bytes]: yield data data = streaming_body(b"test 123") request = httpx2.Request("POST", "http://example.org", content=data) pickle_request = pickle.loads(pickle.dumps(request)) with pytest.raises(httpx2.RequestNotRead): pickle_request.content # noqa: B018 with pytest.raises(httpx2.StreamClosed): await pickle_request.aread() request = httpx2.Request("POST", "http://example.org", content=data) await request.aread() pickle_request = pickle.loads(pickle.dumps(request)) assert pickle_request.content == b"test 123" def test_request_generator_content_picklable() -> None: def content() -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover request = httpx2.Request("POST", "http://example.org", content=content()) pickle_request = pickle.loads(pickle.dumps(request)) with pytest.raises(httpx2.RequestNotRead): pickle_request.content # noqa: B018 with pytest.raises(httpx2.StreamClosed): pickle_request.read() request = httpx2.Request("POST", "http://example.org", content=content()) request.read() pickle_request = pickle.loads(pickle.dumps(request)) assert pickle_request.content == b"test 123" def test_request_params() -> None: request = httpx2.Request("GET", "http://example.com", params={}) assert str(request.url) == "http://example.com" request = httpx2.Request("GET", "http://example.com?c=3", params={"a": "1", "b": "2"}) assert str(request.url) == "http://example.com?a=1&b=2" request = httpx2.Request("GET", "http://example.com?a=1", params={}) assert str(request.url) == "http://example.com" pydantic-httpx2-9b7ee8e/tests/httpx2/models/test_responses.py000066400000000000000000000750211521723372100246060ustar00rootroot00000000000000from __future__ import annotations import datetime import json import pickle import typing import chardet import pytest import httpx2 class StreamingBody: def __iter__(self) -> typing.Iterator[bytes]: yield b"Hello, " yield b"world!" def streaming_body() -> typing.Iterator[bytes]: yield b"Hello, " yield b"world!" async def async_streaming_body() -> typing.AsyncIterator[bytes]: yield b"Hello, " yield b"world!" def autodetect(content: bytes) -> str | None: return chardet.detect(content).get("encoding") def test_response() -> None: response = httpx2.Response( 200, content=b"Hello, world!", request=httpx2.Request("GET", "https://example.org"), ) assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.request.method == "GET" assert response.request.url == "https://example.org" assert not response.is_error def test_response_content() -> None: response = httpx2.Response(200, content="Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.headers == {"Content-Length": "13"} def test_response_text() -> None: response = httpx2.Response(200, text="Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.headers == { "Content-Length": "13", "Content-Type": "text/plain; charset=utf-8", } def test_response_html() -> None: response = httpx2.Response(200, html="Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.headers == { "Content-Length": "39", "Content-Type": "text/html; charset=utf-8", } def test_response_json() -> None: response = httpx2.Response(200, json={"hello": "world"}) assert response.status_code == 200 assert response.reason_phrase == "OK" assert str(response.json()) == "{'hello': 'world'}" assert response.headers == { "Content-Length": "17", "Content-Type": "application/json", } def test_raise_for_status() -> None: request = httpx2.Request("GET", "https://example.org") # 2xx status codes are not an error. response = httpx2.Response(200, request=request) response.raise_for_status() # 1xx status codes are informational responses. response = httpx2.Response(101, request=request) assert response.is_informational with pytest.raises(httpx2.HTTPStatusError) as exc_info: response.raise_for_status() assert str(exc_info.value) == ( "Informational response '101 Switching Protocols' for url 'https://example.org'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/101" ) # 3xx status codes are redirections. headers = {"location": "https://other.org"} response = httpx2.Response(303, headers=headers, request=request) assert response.is_redirect with pytest.raises(httpx2.HTTPStatusError) as exc_info: response.raise_for_status() assert str(exc_info.value) == ( "Redirect response '303 See Other' for url 'https://example.org'\n" "Redirect location: 'https://other.org'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/303" ) # 4xx status codes are a client error. response = httpx2.Response(403, request=request) assert response.is_client_error assert response.is_error with pytest.raises(httpx2.HTTPStatusError) as exc_info: response.raise_for_status() assert str(exc_info.value) == ( "Client error '403 Forbidden' for url 'https://example.org'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403" ) # 5xx status codes are a server error. response = httpx2.Response(500, request=request) assert response.is_server_error assert response.is_error with pytest.raises(httpx2.HTTPStatusError) as exc_info: response.raise_for_status() assert str(exc_info.value) == ( "Server error '500 Internal Server Error' for url 'https://example.org'\n" "For more information check: https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/500" ) # Calling .raise_for_status without setting a request instance is # not valid. Should raise a runtime error. response = httpx2.Response(200) with pytest.raises(RuntimeError): response.raise_for_status() def test_response_repr() -> None: response = httpx2.Response( 200, content=b"Hello, world!", ) assert repr(response) == "" def test_response_content_type_encoding() -> None: """ Use the charset encoding in the Content-Type header if possible. """ headers = {"Content-Type": "text-plain; charset=latin-1"} content = "Latin 1: ΓΏ".encode("latin-1") response = httpx2.Response( 200, content=content, headers=headers, ) assert response.text == "Latin 1: ΓΏ" assert response.encoding == "latin-1" def test_response_default_to_utf8_encoding() -> None: """ Default to utf-8 encoding if there is no Content-Type header. """ content = "γŠγ―γ‚ˆγ†γ”γ–γ„γΎγ™γ€‚".encode() response = httpx2.Response( 200, content=content, ) assert response.text == "γŠγ―γ‚ˆγ†γ”γ–γ„γΎγ™γ€‚" assert response.encoding == "utf-8" def test_response_fallback_to_utf8_encoding() -> None: """ Fallback to utf-8 if we get an invalid charset in the Content-Type header. """ headers = {"Content-Type": "text-plain; charset=invalid-codec-name"} content = "γŠγ―γ‚ˆγ†γ”γ–γ„γΎγ™γ€‚".encode() response = httpx2.Response( 200, content=content, headers=headers, ) assert response.text == "γŠγ―γ‚ˆγ†γ”γ–γ„γΎγ™γ€‚" assert response.encoding == "utf-8" def test_response_no_charset_with_ascii_content() -> None: """ A response with ascii encoded content should decode correctly, even with no charset specified. """ content = b"Hello, world!" headers = {"Content-Type": "text/plain"} response = httpx2.Response( 200, content=content, headers=headers, ) assert response.status_code == 200 assert response.encoding == "utf-8" assert response.text == "Hello, world!" def test_response_no_charset_with_utf8_content() -> None: """ A response with UTF-8 encoded content should decode correctly, even with no charset specified. """ content = "Unicode Snowman: β˜ƒ".encode() headers = {"Content-Type": "text/plain"} response = httpx2.Response( 200, content=content, headers=headers, ) assert response.text == "Unicode Snowman: β˜ƒ" assert response.encoding == "utf-8" def test_response_no_charset_with_iso_8859_1_content() -> None: """ A response with ISO 8859-1 encoded content should decode correctly, even with no charset specified, if autodetect is enabled. """ content = "Accented: Γ–sterreich abcdefghijklmnopqrstuzwxyz".encode("iso-8859-1") headers = {"Content-Type": "text/plain"} response = httpx2.Response(200, content=content, headers=headers, default_encoding=autodetect) assert response.text == "Accented: Γ–sterreich abcdefghijklmnopqrstuzwxyz" assert response.charset_encoding is None def test_response_no_charset_with_cp_1252_content() -> None: """ A response with Windows 1252 encoded content should decode correctly, even with no charset specified, if autodetect is enabled. """ content = "Euro Currency: € abcdefghijklmnopqrstuzwxyz".encode("cp1252") headers = {"Content-Type": "text/plain"} response = httpx2.Response(200, content=content, headers=headers, default_encoding=autodetect) assert response.text == "Euro Currency: € abcdefghijklmnopqrstuzwxyz" assert response.charset_encoding is None def test_response_non_text_encoding() -> None: """ Default to attempting utf-8 encoding for non-text content-type headers. """ headers = {"Content-Type": "image/png"} response = httpx2.Response( 200, content=b"xyz", headers=headers, ) assert response.text == "xyz" assert response.encoding == "utf-8" def test_response_set_explicit_encoding() -> None: headers = {"Content-Type": "text-plain; charset=utf-8"} # Deliberately incorrect charset response = httpx2.Response( 200, content="Latin 1: ΓΏ".encode("latin-1"), headers=headers, ) response.encoding = "latin-1" assert response.text == "Latin 1: ΓΏ" assert response.encoding == "latin-1" def test_response_force_encoding() -> None: response = httpx2.Response( 200, content="Snowman: β˜ƒ".encode(), ) response.encoding = "iso-8859-1" assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Snowman: Γ’\x98\x83" assert response.encoding == "iso-8859-1" def test_response_force_encoding_after_text_accessed() -> None: response = httpx2.Response( 200, content=b"Hello, world!", ) assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.encoding == "utf-8" with pytest.raises(ValueError): response.encoding = "UTF8" with pytest.raises(ValueError): response.encoding = "iso-8859-1" def test_read() -> None: response = httpx2.Response( 200, content=b"Hello, world!", ) assert response.status_code == 200 assert response.text == "Hello, world!" assert response.encoding == "utf-8" assert response.is_closed content = response.read() assert content == b"Hello, world!" assert response.content == b"Hello, world!" assert response.is_closed def test_empty_read() -> None: response = httpx2.Response(200) assert response.status_code == 200 assert response.text == "" assert response.encoding == "utf-8" assert response.is_closed content = response.read() assert content == b"" assert response.content == b"" assert response.is_closed @pytest.mark.anyio async def test_aread() -> None: response = httpx2.Response( 200, content=b"Hello, world!", ) assert response.status_code == 200 assert response.text == "Hello, world!" assert response.encoding == "utf-8" assert response.is_closed content = await response.aread() assert content == b"Hello, world!" assert response.content == b"Hello, world!" assert response.is_closed @pytest.mark.anyio async def test_empty_aread() -> None: response = httpx2.Response(200) assert response.status_code == 200 assert response.text == "" assert response.encoding == "utf-8" assert response.is_closed content = await response.aread() assert content == b"" assert response.content == b"" assert response.is_closed def test_iter_raw() -> None: response = httpx2.Response( 200, content=streaming_body(), ) raw = b"" for part in response.iter_raw(): raw += part assert raw == b"Hello, world!" def test_iter_raw_with_chunksize() -> None: response = httpx2.Response(200, content=streaming_body()) parts = list(response.iter_raw(chunk_size=5)) assert parts == [b"Hello", b", wor", b"ld!"] response = httpx2.Response(200, content=streaming_body()) parts = list(response.iter_raw(chunk_size=7)) assert parts == [b"Hello, ", b"world!"] response = httpx2.Response(200, content=streaming_body()) parts = list(response.iter_raw(chunk_size=13)) assert parts == [b"Hello, world!"] response = httpx2.Response(200, content=streaming_body()) parts = list(response.iter_raw(chunk_size=20)) assert parts == [b"Hello, world!"] def test_iter_raw_doesnt_return_empty_chunks() -> None: def streaming_body_with_empty_chunks() -> typing.Iterator[bytes]: yield b"Hello, " yield b"" yield b"world!" yield b"" response = httpx2.Response(200, content=streaming_body_with_empty_chunks()) parts = list(response.iter_raw()) assert parts == [b"Hello, ", b"world!"] def test_iter_raw_on_iterable() -> None: response = httpx2.Response( 200, content=StreamingBody(), ) raw = b"" for part in response.iter_raw(): raw += part assert raw == b"Hello, world!" def test_iter_raw_on_async() -> None: response = httpx2.Response( 200, content=async_streaming_body(), ) with pytest.raises(RuntimeError): list(response.iter_raw()) def test_close_on_async() -> None: response = httpx2.Response( 200, content=async_streaming_body(), ) with pytest.raises(RuntimeError): response.close() def test_iter_raw_increments_updates_counter() -> None: response = httpx2.Response(200, content=streaming_body()) num_downloaded = response.num_bytes_downloaded for part in response.iter_raw(): assert len(part) == (response.num_bytes_downloaded - num_downloaded) num_downloaded = response.num_bytes_downloaded @pytest.mark.anyio async def test_aiter_raw() -> None: response = httpx2.Response(200, content=async_streaming_body()) raw = b"" async for part in response.aiter_raw(): raw += part assert raw == b"Hello, world!" @pytest.mark.anyio async def test_aiter_raw_with_chunksize() -> None: response = httpx2.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_raw(chunk_size=5)] assert parts == [b"Hello", b", wor", b"ld!"] response = httpx2.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_raw(chunk_size=13)] assert parts == [b"Hello, world!"] response = httpx2.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_raw(chunk_size=20)] assert parts == [b"Hello, world!"] @pytest.mark.anyio async def test_aiter_raw_on_sync() -> None: response = httpx2.Response( 200, content=streaming_body(), ) with pytest.raises(RuntimeError): [part async for part in response.aiter_raw()] @pytest.mark.anyio async def test_aclose_on_sync() -> None: response = httpx2.Response( 200, content=streaming_body(), ) with pytest.raises(RuntimeError): await response.aclose() @pytest.mark.anyio async def test_aiter_raw_increments_updates_counter() -> None: response = httpx2.Response(200, content=async_streaming_body()) num_downloaded = response.num_bytes_downloaded async for part in response.aiter_raw(): assert len(part) == (response.num_bytes_downloaded - num_downloaded) num_downloaded = response.num_bytes_downloaded def test_iter_bytes() -> None: response = httpx2.Response(200, content=b"Hello, world!") content = b"" for part in response.iter_bytes(): content += part assert content == b"Hello, world!" def test_iter_bytes_with_chunk_size() -> None: response = httpx2.Response(200, content=streaming_body()) parts = list(response.iter_bytes(chunk_size=5)) assert parts == [b"Hello", b", wor", b"ld!"] response = httpx2.Response(200, content=streaming_body()) parts = list(response.iter_bytes(chunk_size=13)) assert parts == [b"Hello, world!"] response = httpx2.Response(200, content=streaming_body()) parts = list(response.iter_bytes(chunk_size=20)) assert parts == [b"Hello, world!"] def test_iter_bytes_with_empty_response() -> None: response = httpx2.Response(200, content=b"") parts = list(response.iter_bytes()) assert parts == [] def test_iter_bytes_doesnt_return_empty_chunks() -> None: def streaming_body_with_empty_chunks() -> typing.Iterator[bytes]: yield b"Hello, " yield b"" yield b"world!" yield b"" response = httpx2.Response(200, content=streaming_body_with_empty_chunks()) parts = list(response.iter_bytes()) assert parts == [b"Hello, ", b"world!"] @pytest.mark.anyio async def test_aiter_bytes() -> None: response = httpx2.Response( 200, content=b"Hello, world!", ) content = b"" async for part in response.aiter_bytes(): content += part assert content == b"Hello, world!" @pytest.mark.anyio async def test_aiter_bytes_with_chunk_size() -> None: response = httpx2.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_bytes(chunk_size=5)] assert parts == [b"Hello", b", wor", b"ld!"] response = httpx2.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_bytes(chunk_size=13)] assert parts == [b"Hello, world!"] response = httpx2.Response(200, content=async_streaming_body()) parts = [part async for part in response.aiter_bytes(chunk_size=20)] assert parts == [b"Hello, world!"] def test_iter_text() -> None: response = httpx2.Response( 200, content=b"Hello, world!", ) content = "" for part in response.iter_text(): content += part assert content == "Hello, world!" def test_iter_text_with_chunk_size() -> None: response = httpx2.Response(200, content=b"Hello, world!") parts = list(response.iter_text(chunk_size=5)) assert parts == ["Hello", ", wor", "ld!"] response = httpx2.Response(200, content=b"Hello, world!!") parts = list(response.iter_text(chunk_size=7)) assert parts == ["Hello, ", "world!!"] response = httpx2.Response(200, content=b"Hello, world!") parts = list(response.iter_text(chunk_size=7)) assert parts == ["Hello, ", "world!"] response = httpx2.Response(200, content=b"Hello, world!") parts = list(response.iter_text(chunk_size=13)) assert parts == ["Hello, world!"] response = httpx2.Response(200, content=b"Hello, world!") parts = list(response.iter_text(chunk_size=20)) assert parts == ["Hello, world!"] @pytest.mark.anyio async def test_aiter_text() -> None: response = httpx2.Response( 200, content=b"Hello, world!", ) content = "" async for part in response.aiter_text(): content += part assert content == "Hello, world!" @pytest.mark.anyio async def test_aiter_text_with_chunk_size() -> None: response = httpx2.Response(200, content=b"Hello, world!") parts = [part async for part in response.aiter_text(chunk_size=5)] assert parts == ["Hello", ", wor", "ld!"] response = httpx2.Response(200, content=b"Hello, world!") parts = [part async for part in response.aiter_text(chunk_size=13)] assert parts == ["Hello, world!"] response = httpx2.Response(200, content=b"Hello, world!") parts = [part async for part in response.aiter_text(chunk_size=20)] assert parts == ["Hello, world!"] def test_iter_lines() -> None: response = httpx2.Response( 200, content=b"Hello,\nworld!", ) content = list(response.iter_lines()) assert content == ["Hello,", "world!"] @pytest.mark.anyio async def test_aiter_lines() -> None: response = httpx2.Response( 200, content=b"Hello,\nworld!", ) content = [line async for line in response.aiter_lines()] assert content == ["Hello,", "world!"] def test_sync_streaming_response() -> None: response = httpx2.Response( 200, content=streaming_body(), ) assert response.status_code == 200 assert not response.is_closed content = response.read() assert content == b"Hello, world!" assert response.content == b"Hello, world!" assert response.is_closed @pytest.mark.anyio async def test_async_streaming_response() -> None: response = httpx2.Response( 200, content=async_streaming_body(), ) assert response.status_code == 200 assert not response.is_closed content = await response.aread() assert content == b"Hello, world!" assert response.content == b"Hello, world!" assert response.is_closed def test_cannot_read_after_stream_consumed() -> None: response = httpx2.Response( 200, content=streaming_body(), ) content = b"" for part in response.iter_bytes(): content += part with pytest.raises(httpx2.StreamConsumed): response.read() @pytest.mark.anyio async def test_cannot_aread_after_stream_consumed() -> None: response = httpx2.Response( 200, content=async_streaming_body(), ) content = b"" async for part in response.aiter_bytes(): content += part with pytest.raises(httpx2.StreamConsumed): await response.aread() def test_cannot_read_after_response_closed() -> None: response = httpx2.Response( 200, content=streaming_body(), ) response.close() with pytest.raises(httpx2.StreamClosed): response.read() @pytest.mark.anyio async def test_cannot_aread_after_response_closed() -> None: response = httpx2.Response( 200, content=async_streaming_body(), ) await response.aclose() with pytest.raises(httpx2.StreamClosed): await response.aread() @pytest.mark.anyio async def test_elapsed_not_available_until_closed() -> None: response = httpx2.Response( 200, content=async_streaming_body(), ) with pytest.raises(RuntimeError): response.elapsed # noqa: B018 def test_elapsed_set_directly() -> None: response = httpx2.Response(200) response.elapsed = datetime.timedelta(seconds=1) assert response.elapsed == datetime.timedelta(seconds=1) def test_unknown_status_code() -> None: response = httpx2.Response( 600, ) assert response.status_code == 600 assert response.reason_phrase == "" assert response.text == "" def test_json_with_specified_encoding() -> None: data = {"greeting": "hello", "recipient": "world"} content = json.dumps(data).encode("utf-16") headers = {"Content-Type": "application/json, charset=utf-16"} response = httpx2.Response( 200, content=content, headers=headers, ) assert response.json() == data def test_json_with_options() -> None: data = {"greeting": "hello", "recipient": "world", "amount": 1} content = json.dumps(data).encode("utf-16") headers = {"Content-Type": "application/json, charset=utf-16"} response = httpx2.Response( 200, content=content, headers=headers, ) assert response.json(parse_int=str)["amount"] == "1" @pytest.mark.parametrize( "encoding", [ "utf-8", "utf-8-sig", "utf-16", "utf-16-be", "utf-16-le", "utf-32", "utf-32-be", "utf-32-le", ], ) def test_json_without_specified_charset(encoding: str) -> None: data = {"greeting": "hello", "recipient": "world"} content = json.dumps(data).encode(encoding) headers = {"Content-Type": "application/json"} response = httpx2.Response( 200, content=content, headers=headers, ) assert response.json() == data @pytest.mark.parametrize( "encoding", [ "utf-8", "utf-8-sig", "utf-16", "utf-16-be", "utf-16-le", "utf-32", "utf-32-be", "utf-32-le", ], ) def test_json_with_specified_charset(encoding: str) -> None: data = {"greeting": "hello", "recipient": "world"} content = json.dumps(data).encode(encoding) headers = {"Content-Type": f"application/json; charset={encoding}"} response = httpx2.Response( 200, content=content, headers=headers, ) assert response.json() == data @pytest.mark.parametrize( "headers, expected", [ ( {"Link": "; rel='preload'"}, {"preload": {"rel": "preload", "url": "https://example.com"}}, ), ( {"Link": '; rel="hub", ; rel="self"'}, { "hub": {"url": "/hub", "rel": "hub"}, "self": {"url": "/resource", "rel": "self"}, }, ), ], ) def test_link_headers(headers: dict[str, str], expected: dict[str, dict[str, str]]) -> None: response = httpx2.Response( 200, content=None, headers=headers, ) assert response.links == expected @pytest.mark.parametrize("header_value", (b"deflate", b"gzip", b"br")) def test_decode_error_with_request(header_value: bytes) -> None: headers = [(b"Content-Encoding", header_value)] broken_compressed_body = b"xxxxxxxxxxxxxx" with pytest.raises(httpx2.DecodingError): httpx2.Response( 200, headers=headers, content=broken_compressed_body, ) with pytest.raises(httpx2.DecodingError): httpx2.Response( 200, headers=headers, content=broken_compressed_body, request=httpx2.Request("GET", "https://www.example.org/"), ) @pytest.mark.parametrize("header_value", (b"deflate", b"gzip", b"br")) def test_value_error_without_request(header_value: bytes) -> None: headers = [(b"Content-Encoding", header_value)] broken_compressed_body = b"xxxxxxxxxxxxxx" with pytest.raises(httpx2.DecodingError): httpx2.Response(200, headers=headers, content=broken_compressed_body) def test_response_with_unset_request() -> None: response = httpx2.Response(200, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert not response.is_error def test_set_request_after_init() -> None: response = httpx2.Response(200, content=b"Hello, world!") response.request = httpx2.Request("GET", "https://www.example.org") assert response.request.method == "GET" assert response.request.url == "https://www.example.org" def test_cannot_access_unset_request() -> None: response = httpx2.Response(200, content=b"Hello, world!") with pytest.raises(RuntimeError): response.request # noqa: B018 def test_generator_with_transfer_encoding_header() -> None: def content() -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover response = httpx2.Response(200, content=content()) assert response.headers == {"Transfer-Encoding": "chunked"} def test_generator_with_content_length_header() -> None: def content() -> typing.Iterator[bytes]: yield b"test 123" # pragma: no cover headers = {"Content-Length": "8"} response = httpx2.Response(200, content=content(), headers=headers) assert response.headers == {"Content-Length": "8"} def test_response_picklable() -> None: response = httpx2.Response( 200, content=b"Hello, world!", request=httpx2.Request("GET", "https://example.org"), ) pickle_response = pickle.loads(pickle.dumps(response)) assert pickle_response.is_closed is True assert pickle_response.is_stream_consumed is True assert pickle_response.next_request is None assert pickle_response.stream is not None assert pickle_response.content == b"Hello, world!" assert pickle_response.status_code == 200 assert pickle_response.request.url == response.request.url assert pickle_response.extensions == {} assert pickle_response.history == [] @pytest.mark.anyio async def test_response_async_streaming_picklable() -> None: response = httpx2.Response(200, content=async_streaming_body()) pickle_response = pickle.loads(pickle.dumps(response)) with pytest.raises(httpx2.ResponseNotRead): pickle_response.content # noqa: B018 with pytest.raises(httpx2.StreamClosed): await pickle_response.aread() assert pickle_response.is_stream_consumed is False assert pickle_response.num_bytes_downloaded == 0 assert pickle_response.headers == {"Transfer-Encoding": "chunked"} response = httpx2.Response(200, content=async_streaming_body()) await response.aread() pickle_response = pickle.loads(pickle.dumps(response)) assert pickle_response.is_stream_consumed is True assert pickle_response.content == b"Hello, world!" assert pickle_response.num_bytes_downloaded == 13 def test_response_decode_text_using_autodetect() -> None: # Ensure that a 'default_encoding="autodetect"' on the response allows for # encoding autodetection to be used when no "Content-Type: text/plain; charset=..." # info is present. # # Here we have some french text encoded with WINDOWS-1252, rather than UTF-8. # The curly quotes and em dash occupy bytes 0x80-0x9F, which are control # characters in ISO-8859-1, so the encoding is unambiguously WINDOWS-1252. text = ( "Non-seulement DesprΓ©aux ne se trompait pas β€” mais de tous les Γ©crivains " "que la France a produits, sans excepter Voltaire lui-mΓͺme, imprΓ©gnΓ© de " "l’esprit anglais par son sΓ©jour Γ  Londres, c’est incontestablement " "β€œMoliΓ¨re” ou Poquelin qui reproduit avec l’exactitude la plus vive et la " "plus complΓ¨te le fond du gΓ©nie franΓ§ais." ) content = text.encode("WINDOWS-1252") response = httpx2.Response(200, content=content, default_encoding=autodetect) assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.encoding == "WINDOWS-1252" assert response.text == text def test_response_decode_text_using_explicit_encoding() -> None: # Ensure that a 'default_encoding="..."' on the response is used for text decoding # when no "Content-Type: text/plain; charset=..."" info is present. # # Here we have some french text encoded with Windows-1252, rather than UTF-8. # https://en.wikipedia.org/wiki/Windows-1252 text = ( "Non-seulement DesprΓ©aux ne se trompait pas, mais de tous les Γ©crivains " "que la France a produits, sans excepter Voltaire lui-mΓͺme, imprΓ©gnΓ© de " "l'esprit anglais par son sΓ©jour Γ  Londres, c'est incontestablement " "MoliΓ¨re ou Poquelin qui reproduit avec l'exactitude la plus vive et la " "plus complΓ¨te le fond du gΓ©nie franΓ§ais." ) content = text.encode("cp1252") response = httpx2.Response(200, content=content, default_encoding="cp1252") assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.encoding == "cp1252" assert response.text == text pydantic-httpx2-9b7ee8e/tests/httpx2/models/test_url.py000066400000000000000000000664601521723372100233760ustar00rootroot00000000000000from __future__ import annotations import pytest import httpx2 # Tests for `httpx2.URL` instantiation and property accessors. def test_basic_url() -> None: url = httpx2.URL("https://www.example.com/") assert url.scheme == "https" assert url.userinfo == b"" assert url.netloc == b"www.example.com" assert url.host == "www.example.com" assert url.port is None assert url.path == "/" assert url.query == b"" assert url.fragment == "" assert str(url) == "https://www.example.com/" assert repr(url) == "URL('https://www.example.com/')" def test_complete_url() -> None: url = httpx2.URL("https://example.org:123/path/to/somewhere?abc=123#anchor") assert url.scheme == "https" assert url.host == "example.org" assert url.port == 123 assert url.path == "/path/to/somewhere" assert url.query == b"abc=123" assert url.raw_path == b"/path/to/somewhere?abc=123" assert url.fragment == "anchor" assert str(url) == "https://example.org:123/path/to/somewhere?abc=123#anchor" assert repr(url) == "URL('https://example.org:123/path/to/somewhere?abc=123#anchor')" def test_url_with_empty_query() -> None: """ URLs with and without a trailing `?` but an empty query component should preserve the information on the raw path. """ url = httpx2.URL("https://www.example.com/path") assert url.path == "/path" assert url.query == b"" assert url.raw_path == b"/path" url = httpx2.URL("https://www.example.com/path?") assert url.path == "/path" assert url.query == b"" assert url.raw_path == b"/path?" def test_url_no_scheme() -> None: url = httpx2.URL("://example.com") assert url.scheme == "" assert url.host == "example.com" assert url.path == "/" def test_url_no_authority() -> None: url = httpx2.URL("http://") assert url.scheme == "http" assert url.host == "" assert url.path == "/" # Tests for percent encoding across path, query, and fragment... @pytest.mark.parametrize( "url,raw_path,path,query,fragment", [ # URL with unescaped chars in path. ( "https://example.com/!$&'()*+,;= abc ABC 123 :/[]@", b"/!$&'()*+,;=%20abc%20ABC%20123%20:/[]@", "/!$&'()*+,;= abc ABC 123 :/[]@", b"", "", ), # URL with escaped chars in path. ( "https://example.com/!$&'()*+,;=%20abc%20ABC%20123%20:/[]@", b"/!$&'()*+,;=%20abc%20ABC%20123%20:/[]@", "/!$&'()*+,;= abc ABC 123 :/[]@", b"", "", ), # URL with mix of unescaped and escaped chars in path. # WARNING: This has the incorrect behaviour, adding the test as an interim step. ( "https://example.com/ %61%62%63", b"/%20%61%62%63", "/ abc", b"", "", ), # URL with unescaped chars in query. ( "https://example.com/?!$&'()*+,;= abc ABC 123 :/[]@?", b"/?!$&'()*+,;=%20abc%20ABC%20123%20:/[]@?", "/", b"!$&'()*+,;=%20abc%20ABC%20123%20:/[]@?", "", ), # URL with escaped chars in query. ( "https://example.com/?!$&%27()*+,;=%20abc%20ABC%20123%20:%2F[]@?", b"/?!$&%27()*+,;=%20abc%20ABC%20123%20:%2F[]@?", "/", b"!$&%27()*+,;=%20abc%20ABC%20123%20:%2F[]@?", "", ), # URL with mix of unescaped and escaped chars in query. ( "https://example.com/?%20%97%98%99", b"/?%20%97%98%99", "/", b"%20%97%98%99", "", ), # URL encoding characters in fragment. ( "https://example.com/#!$&'()*+,;= abc ABC 123 :/[]@?#", b"/", "/", b"", "!$&'()*+,;= abc ABC 123 :/[]@?#", ), ], ) def test_path_query_fragment(url: str, raw_path: bytes, path: str, query: bytes, fragment: str) -> None: parsed = httpx2.URL(url) assert parsed.raw_path == raw_path assert parsed.path == path assert parsed.query == query assert parsed.fragment == fragment def test_url_query_encoding() -> None: url = httpx2.URL("https://www.example.com/?a=b c&d=e/f") assert url.raw_path == b"/?a=b%20c&d=e/f" url = httpx2.URL("https://www.example.com/?a=b+c&d=e/f") assert url.raw_path == b"/?a=b+c&d=e/f" url = httpx2.URL("https://www.example.com/", params={"a": "b c", "d": "e/f"}) assert url.raw_path == b"/?a=b+c&d=e%2Ff" def test_url_params() -> None: url = httpx2.URL("https://example.org:123/path/to/somewhere", params={"a": "123"}) assert str(url) == "https://example.org:123/path/to/somewhere?a=123" assert url.params == httpx2.QueryParams({"a": "123"}) url = httpx2.URL("https://example.org:123/path/to/somewhere?b=456", params={"a": "123"}) assert str(url) == "https://example.org:123/path/to/somewhere?a=123" assert url.params == httpx2.QueryParams({"a": "123"}) # Tests for username and password @pytest.mark.parametrize( "url,userinfo,username,password", [ # username and password in URL. ( "https://username:password@example.com", b"username:password", "username", "password", ), # username and password in URL with percent escape sequences. ( "https://username%40gmail.com:pa%20ssword@example.com", b"username%40gmail.com:pa%20ssword", "username@gmail.com", "pa ssword", ), ( "https://user%20name:p%40ssword@example.com", b"user%20name:p%40ssword", "user name", "p@ssword", ), # username and password in URL without percent escape sequences. ( "https://username@gmail.com:pa ssword@example.com", b"username%40gmail.com:pa%20ssword", "username@gmail.com", "pa ssword", ), ( "https://user name:p@ssword@example.com", b"user%20name:p%40ssword", "user name", "p@ssword", ), ], ) def test_url_username_and_password(url: str, userinfo: bytes, username: str, password: str) -> None: parsed = httpx2.URL(url) assert parsed.userinfo == userinfo assert parsed.username == username assert parsed.password == password # Tests for different host types def test_url_valid_host() -> None: url = httpx2.URL("https://example.com/") assert url.host == "example.com" def test_url_normalized_host() -> None: url = httpx2.URL("https://EXAMPLE.com/") assert url.host == "example.com" def test_url_percent_escape_host() -> None: url = httpx2.URL("https://exam le.com/") assert url.host == "exam%20le.com" def test_url_ipv4_like_host() -> None: """rare host names used to quality as IPv4""" url = httpx2.URL("https://023b76x43144/") assert url.host == "023b76x43144" # Tests for different port types def test_url_valid_port() -> None: url = httpx2.URL("https://example.com:123/") assert url.port == 123 def test_url_normalized_port() -> None: # If the port matches the scheme default it is normalized to None. url = httpx2.URL("https://example.com:443/") assert url.port is None def test_url_invalid_port() -> None: with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL("https://example.com:abc/") assert str(exc.value) == "Invalid port: 'abc'" # Tests for path handling def test_url_normalized_path() -> None: url = httpx2.URL("https://example.com/abc/def/../ghi/./jkl") assert url.path == "/abc/ghi/jkl" def test_url_escaped_path() -> None: url = httpx2.URL("https://example.com/ /🌟/") assert url.raw_path == b"/%20/%F0%9F%8C%9F/" def test_url_leading_dot_prefix_on_absolute_url() -> None: url = httpx2.URL("https://example.com/../abc") assert url.path == "/abc" def test_url_leading_dot_prefix_on_relative_url() -> None: url = httpx2.URL("../abc") assert url.path == "../abc" # Tests for query parameter percent encoding. # # Percent-encoding in `params={}` should match browser form behavior. def test_param_with_space() -> None: # Params passed as form key-value pairs should be form escaped, # Including the special case of "+" for space separators. url = httpx2.URL("http://webservice", params={"u": "with spaces"}) assert str(url) == "http://webservice?u=with+spaces" def test_param_requires_encoding() -> None: # Params passed as form key-value pairs should be escaped. url = httpx2.URL("http://webservice", params={"u": "%"}) assert str(url) == "http://webservice?u=%25" def test_param_with_percent_encoded() -> None: # Params passed as form key-value pairs should always be escaped, # even if they include a valid escape sequence. # We want to match browser form behaviour here. url = httpx2.URL("http://webservice", params={"u": "with%20spaces"}) assert str(url) == "http://webservice?u=with%2520spaces" def test_param_with_existing_escape_requires_encoding() -> None: # Params passed as form key-value pairs should always be escaped, # even if they include a valid escape sequence. # We want to match browser form behaviour here. url = httpx2.URL("http://webservice", params={"u": "http://example.com?q=foo%2Fa"}) assert str(url) == "http://webservice?u=http%3A%2F%2Fexample.com%3Fq%3Dfoo%252Fa" # Tests for query parameter percent encoding. # # Percent-encoding in `url={}` should match browser URL bar behavior. def test_query_with_existing_percent_encoding() -> None: # Valid percent encoded sequences should not be double encoded. url = httpx2.URL("http://webservice?u=phrase%20with%20spaces") assert str(url) == "http://webservice?u=phrase%20with%20spaces" def test_query_requiring_percent_encoding() -> None: # Characters that require percent encoding should be encoded. url = httpx2.URL("http://webservice?u=phrase with spaces") assert str(url) == "http://webservice?u=phrase%20with%20spaces" def test_query_with_mixed_percent_encoding() -> None: # When a mix of encoded and unencoded characters are present, # characters that require percent encoding should be encoded, # while existing sequences should not be double encoded. url = httpx2.URL("http://webservice?u=phrase%20with spaces") assert str(url) == "http://webservice?u=phrase%20with%20spaces" # Tests for invalid URLs def test_url_invalid_hostname() -> None: """ Ensure that invalid URLs raise an `httpx2.InvalidURL` exception. """ with pytest.raises(httpx2.InvalidURL): httpx2.URL("https://πŸ˜‡/") def test_url_excessively_long_url() -> None: with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL("https://www.example.com/" + "x" * 100_000) assert str(exc.value) == "URL too long" def test_url_excessively_long_component() -> None: with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL("https://www.example.com", path="/" + "x" * 100_000) assert str(exc.value) == "URL component 'path' too long" def test_url_non_printing_character_in_url() -> None: with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL("https://www.example.com/\n") assert str(exc.value) == ("Invalid non-printable ASCII character in URL, '\\n' at position 24.") def test_url_non_printing_character_in_component() -> None: with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL("https://www.example.com", path="/\n") assert str(exc.value) == ("Invalid non-printable ASCII character in URL path component, '\\n' at position 1.") # Test for url components def test_url_with_components() -> None: url = httpx2.URL(scheme="https", host="www.example.com", path="/") assert url.scheme == "https" assert url.userinfo == b"" assert url.host == "www.example.com" assert url.port is None assert url.path == "/" assert url.query == b"" assert url.fragment == "" assert str(url) == "https://www.example.com/" def test_urlparse_with_invalid_component() -> None: with pytest.raises(TypeError) as exc: httpx2.URL(scheme="https", host="www.example.com", incorrect="/") assert str(exc.value) == "'incorrect' is an invalid keyword argument for URL()" def test_urlparse_with_invalid_scheme() -> None: with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL(scheme="~", host="www.example.com", path="/") assert str(exc.value) == "Invalid URL component 'scheme'" def test_urlparse_with_invalid_path() -> None: with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL(scheme="https", host="www.example.com", path="abc") assert str(exc.value) == "For absolute URLs, path must be empty or begin with '/'" with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL(path="//abc") assert str(exc.value) == "Relative URLs cannot have a path starting with '//'" with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL(path=":abc") assert str(exc.value) == "Relative URLs cannot have a path starting with ':'" def test_url_with_relative_path() -> None: # This path would be invalid for an absolute URL, but is valid as a relative URL. url = httpx2.URL(path="abc") assert url.path == "abc" # Tests for `httpx2.URL` python built-in operators. def test_url_eq_str() -> None: """ Ensure that `httpx2.URL` supports the equality operator. """ url = httpx2.URL("https://example.org:123/path/to/somewhere?abc=123#anchor") assert url == "https://example.org:123/path/to/somewhere?abc=123#anchor" assert str(url) == url def test_url_set() -> None: """ Ensure that `httpx2.URL` instances can be used in sets. """ urls = ( httpx2.URL("http://example.org:123/path/to/somewhere"), httpx2.URL("http://example.org:123/path/to/somewhere/else"), ) url_set = set(urls) assert all(url in urls for url in url_set) # Tests for TypeErrors when instantiating `httpx2.URL`. def test_url_invalid_type() -> None: """ Ensure that invalid types on `httpx2.URL()` raise a `TypeError`. """ class ExternalURLClass: # representing external URL class pass with pytest.raises(TypeError): httpx2.URL(ExternalURLClass()) # type: ignore def test_url_with_invalid_component() -> None: with pytest.raises(TypeError) as exc: httpx2.URL(scheme="https", host="www.example.com", incorrect="/") assert str(exc.value) == "'incorrect' is an invalid keyword argument for URL()" # Tests for `URL.join()`. def test_url_join() -> None: """ Some basic URL joining tests. """ url = httpx2.URL("https://example.org:123/path/to/somewhere") assert url.join("/somewhere-else") == "https://example.org:123/somewhere-else" assert url.join("somewhere-else") == "https://example.org:123/path/to/somewhere-else" assert url.join("../somewhere-else") == "https://example.org:123/path/somewhere-else" assert url.join("../../somewhere-else") == "https://example.org:123/somewhere-else" def test_relative_url_join() -> None: url = httpx2.URL("/path/to/somewhere") assert url.join("/somewhere-else") == "/somewhere-else" assert url.join("somewhere-else") == "/path/to/somewhere-else" assert url.join("../somewhere-else") == "/path/somewhere-else" assert url.join("../../somewhere-else") == "/somewhere-else" def test_url_join_rfc3986() -> None: """ URL joining tests, as-per reference examples in RFC 3986. https://tools.ietf.org/html/rfc3986#section-5.4 """ url = httpx2.URL("http://example.com/b/c/d;p?q") assert url.join("g") == "http://example.com/b/c/g" assert url.join("./g") == "http://example.com/b/c/g" assert url.join("g/") == "http://example.com/b/c/g/" assert url.join("/g") == "http://example.com/g" assert url.join("//g") == "http://g" assert url.join("?y") == "http://example.com/b/c/d;p?y" assert url.join("g?y") == "http://example.com/b/c/g?y" assert url.join("#s") == "http://example.com/b/c/d;p?q#s" assert url.join("g#s") == "http://example.com/b/c/g#s" assert url.join("g?y#s") == "http://example.com/b/c/g?y#s" assert url.join(";x") == "http://example.com/b/c/;x" assert url.join("g;x") == "http://example.com/b/c/g;x" assert url.join("g;x?y#s") == "http://example.com/b/c/g;x?y#s" assert url.join("") == "http://example.com/b/c/d;p?q" assert url.join(".") == "http://example.com/b/c/" assert url.join("./") == "http://example.com/b/c/" assert url.join("..") == "http://example.com/b/" assert url.join("../") == "http://example.com/b/" assert url.join("../g") == "http://example.com/b/g" assert url.join("../..") == "http://example.com/" assert url.join("../../") == "http://example.com/" assert url.join("../../g") == "http://example.com/g" assert url.join("../../../g") == "http://example.com/g" assert url.join("../../../../g") == "http://example.com/g" assert url.join("/./g") == "http://example.com/g" assert url.join("/../g") == "http://example.com/g" assert url.join("g.") == "http://example.com/b/c/g." assert url.join(".g") == "http://example.com/b/c/.g" assert url.join("g..") == "http://example.com/b/c/g.." assert url.join("..g") == "http://example.com/b/c/..g" assert url.join("./../g") == "http://example.com/b/g" assert url.join("./g/.") == "http://example.com/b/c/g/" assert url.join("g/./h") == "http://example.com/b/c/g/h" assert url.join("g/../h") == "http://example.com/b/c/h" assert url.join("g;x=1/./y") == "http://example.com/b/c/g;x=1/y" assert url.join("g;x=1/../y") == "http://example.com/b/c/y" assert url.join("g?y/./x") == "http://example.com/b/c/g?y/./x" assert url.join("g?y/../x") == "http://example.com/b/c/g?y/../x" assert url.join("g#s/./x") == "http://example.com/b/c/g#s/./x" assert url.join("g#s/../x") == "http://example.com/b/c/g#s/../x" def test_resolution_error_1833() -> None: """ See https://github.com/encode/httpx/issues/1833 """ url = httpx2.URL("https://example.com/?[]") assert url.join("/") == "https://example.com/" # Tests for `URL.copy_with()`. def test_copy_with() -> None: url = httpx2.URL("https://www.example.com/") assert str(url) == "https://www.example.com/" url = url.copy_with() assert str(url) == "https://www.example.com/" url = url.copy_with(scheme="http") assert str(url) == "http://www.example.com/" url = url.copy_with(netloc=b"example.com") assert str(url) == "http://example.com/" url = url.copy_with(path="/abc") assert str(url) == "http://example.com/abc" def test_url_copywith_authority_subcomponents() -> None: copy_with_kwargs = { "username": "username", "password": "password", "port": 444, "host": "example.net", } url = httpx2.URL("https://example.org") new = url.copy_with(**copy_with_kwargs) assert str(new) == "https://username:password@example.net:444" def test_url_copywith_netloc() -> None: copy_with_kwargs = { "netloc": b"example.net:444", } url = httpx2.URL("https://example.org") new = url.copy_with(**copy_with_kwargs) assert str(new) == "https://example.net:444" def test_url_copywith_userinfo_subcomponents() -> None: copy_with_kwargs = { "username": "tom@example.org", "password": "abc123@ %", } url = httpx2.URL("https://example.org") new = url.copy_with(**copy_with_kwargs) assert str(new) == "https://tom%40example.org:abc123%40%20%@example.org" assert new.username == "tom@example.org" assert new.password == "abc123@ %" assert new.userinfo == b"tom%40example.org:abc123%40%20%" def test_url_copywith_invalid_component() -> None: url = httpx2.URL("https://example.org") with pytest.raises(TypeError): url.copy_with(pathh="/incorrect-spelling") with pytest.raises(TypeError): url.copy_with(userinfo="should be bytes") def test_url_copywith_urlencoded_path() -> None: url = httpx2.URL("https://example.org") url = url.copy_with(path="/path to somewhere") assert url.path == "/path to somewhere" assert url.query == b"" assert url.raw_path == b"/path%20to%20somewhere" def test_url_copywith_query() -> None: url = httpx2.URL("https://example.org") url = url.copy_with(query=b"a=123") assert url.path == "/" assert url.query == b"a=123" assert url.raw_path == b"/?a=123" def test_url_copywith_raw_path() -> None: url = httpx2.URL("https://example.org") url = url.copy_with(raw_path=b"/some/path") assert url.path == "/some/path" assert url.query == b"" assert url.raw_path == b"/some/path" url = httpx2.URL("https://example.org") url = url.copy_with(raw_path=b"/some/path?") assert url.path == "/some/path" assert url.query == b"" assert url.raw_path == b"/some/path?" url = httpx2.URL("https://example.org") url = url.copy_with(raw_path=b"/some/path?a=123") assert url.path == "/some/path" assert url.query == b"a=123" assert url.raw_path == b"/some/path?a=123" def test_url_copywith_security() -> None: """ Prevent unexpected changes on URL after calling copy_with (CVE-2021-41945) """ with pytest.raises(httpx2.InvalidURL): httpx2.URL("https://u:p@[invalid!]//evilHost/path?t=w#tw") url = httpx2.URL("https://example.com/path?t=w#tw") bad = "https://xxxx:xxxx@xxxxxxx/xxxxx/xxx?x=x#xxxxx" with pytest.raises(httpx2.InvalidURL): url.copy_with(scheme=bad) # Tests for copy-modifying-parameters methods. # # `URL.copy_set_param()` # `URL.copy_add_param()` # `URL.copy_remove_param()` # `URL.copy_merge_params()` def test_url_set_param_manipulation() -> None: """ Some basic URL query parameter manipulation. """ url = httpx2.URL("https://example.org:123/?a=123") assert url.copy_set_param("a", "456") == "https://example.org:123/?a=456" def test_url_add_param_manipulation() -> None: """ Some basic URL query parameter manipulation. """ url = httpx2.URL("https://example.org:123/?a=123") assert url.copy_add_param("a", "456") == "https://example.org:123/?a=123&a=456" def test_url_remove_param_manipulation() -> None: """ Some basic URL query parameter manipulation. """ url = httpx2.URL("https://example.org:123/?a=123") assert url.copy_remove_param("a") == "https://example.org:123/" def test_url_merge_params_manipulation() -> None: """ Some basic URL query parameter manipulation. """ url = httpx2.URL("https://example.org:123/?a=123") assert url.copy_merge_params({"b": "456"}) == "https://example.org:123/?a=123&b=456" # Tests for IDNA hostname support. @pytest.mark.parametrize( "given,idna,host,raw_host,scheme,port", [ ( "http://δΈ­ε›½.icom.museum:80/", "http://xn--fiqs8s.icom.museum:80/", "δΈ­ε›½.icom.museum", b"xn--fiqs8s.icom.museum", "http", None, ), ( "http://KΓΆnigsgÀßchen.de", "http://xn--knigsgchen-b4a3dun.de", "kΓΆnigsgÀßchen.de", b"xn--knigsgchen-b4a3dun.de", "http", None, ), ( "https://faß.de", "https://xn--fa-hia.de", "faß.de", b"xn--fa-hia.de", "https", None, ), ( "https://Ξ²ΟŒΞ»ΞΏΟ‚.com:443", "https://xn--nxasmm1c.com:443", "Ξ²ΟŒΞ»ΞΏΟ‚.com", b"xn--nxasmm1c.com", "https", None, ), ( "http://ΰ·ΰ·Šβ€ΰΆ»ΰ·“.com:444", "http://xn--10cl1a0b660p.com:444", "ΰ·ΰ·Šβ€ΰΆ»ΰ·“.com", b"xn--10cl1a0b660p.com", "http", 444, ), ( "https://Ω†Ψ§Ω…Ω‡β€ŒΨ§ΫŒ.com:4433", "https://xn--mgba3gch31f060k.com:4433", "Ω†Ψ§Ω…Ω‡β€ŒΨ§ΫŒ.com", b"xn--mgba3gch31f060k.com", "https", 4433, ), ( "https://www.Γ©galitΓ©-femmes-hommes.gouv.fr", "https://www.xn--galit-femmes-hommes-9ybf.gouv.fr", "www.Γ©galitΓ©-femmes-hommes.gouv.fr", b"www.xn--galit-femmes-hommes-9ybf.gouv.fr", "https", None, ), ], ids=[ "http_with_port", "unicode_tr46_compat", "https_without_port", "https_with_port", "http_with_custom_port", "https_with_custom_port", "idna_label_after_ascii_label", ], ) def test_idna_url(given: str, idna: str, host: str, raw_host: bytes, scheme: str, port: int | None) -> None: url = httpx2.URL(given) assert url == httpx2.URL(idna) assert url.host == host assert url.raw_host == raw_host assert url.scheme == scheme assert url.port == port def test_url_unescaped_idna_host() -> None: url = httpx2.URL("https://δΈ­ε›½.icom.museum/") assert url.raw_host == b"xn--fiqs8s.icom.museum" def test_url_escaped_idna_host() -> None: url = httpx2.URL("https://xn--fiqs8s.icom.museum/") assert url.raw_host == b"xn--fiqs8s.icom.museum" def test_url_malformed_idna_label_after_ascii_label() -> None: url = httpx2.URL("https://a.b.c.xn--pokxncvks/") assert url.host == "a.b.c.xn--pokxncvks" def test_url_mixed_valid_and_malformed_idna_labels() -> None: url = httpx2.URL("https://xn--fiqs8s.xn--pokxncvks/") assert url.host == "δΈ­ε›½.xn--pokxncvks" def test_url_invalid_idna_host() -> None: with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL("https://β˜ƒ.com/") assert str(exc.value) == "Invalid IDNA hostname: 'β˜ƒ.com'" # Tests for IPv4 hostname support. def test_url_valid_ipv4() -> None: url = httpx2.URL("https://1.2.3.4/") assert url.host == "1.2.3.4" def test_url_invalid_ipv4() -> None: with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL("https://999.999.999.999/") assert str(exc.value) == "Invalid IPv4 address: '999.999.999.999'" # Tests for IPv6 hostname support. def test_ipv6_url() -> None: url = httpx2.URL("http://[::ffff:192.168.0.1]:5678/") assert url.host == "::ffff:192.168.0.1" assert url.netloc == b"[::ffff:192.168.0.1]:5678" def test_url_valid_ipv6() -> None: url = httpx2.URL("https://[2001:db8::ff00:42:8329]/") assert url.host == "2001:db8::ff00:42:8329" def test_url_invalid_ipv6() -> None: with pytest.raises(httpx2.InvalidURL) as exc: httpx2.URL("https://[2001]/") assert str(exc.value) == "Invalid IPv6 address: '[2001]'" @pytest.mark.parametrize("host", ["[::ffff:192.168.0.1]", "::ffff:192.168.0.1"]) def test_ipv6_url_from_raw_url(host: str) -> None: url = httpx2.URL(scheme="https", host=host, port=443, path="/") assert url.host == "::ffff:192.168.0.1" assert url.netloc == b"[::ffff:192.168.0.1]" assert str(url) == "https://[::ffff:192.168.0.1]/" @pytest.mark.parametrize( "url_str", [ "http://127.0.0.1:1234", "http://example.com:1234", "http://[::ffff:127.0.0.1]:1234", ], ) @pytest.mark.parametrize("new_host", ["[::ffff:192.168.0.1]", "::ffff:192.168.0.1"]) def test_ipv6_url_copy_with_host(url_str: str, new_host: str) -> None: url = httpx2.URL(url_str).copy_with(host=new_host) assert url.host == "::ffff:192.168.0.1" assert url.netloc == b"[::ffff:192.168.0.1]:1234" assert str(url) == "http://[::ffff:192.168.0.1]:1234" pydantic-httpx2-9b7ee8e/tests/httpx2/models/test_whatwg.py000066400000000000000000000037111521723372100240630ustar00rootroot00000000000000# The WHATWG have various tests that can be used to validate the URL parsing. # # https://url.spec.whatwg.org/ from __future__ import annotations import json import typing import pytest from httpx2._urlparse import urlparse # URL test cases from... # https://github.com/web-platform-tests/wpt/blob/master/url/resources/urltestdata.json with open("tests/httpx2/models/whatwg.json", encoding="utf-8") as input: test_cases = json.load(input) test_cases = [item for item in test_cases if not isinstance(item, str) and not item.get("failure")] @pytest.mark.parametrize("test_case", test_cases) def test_urlparse(test_case: dict[str, typing.Any]) -> None: if test_case["href"] in ("a: foo.com", "lolscheme:x x#x%20x"): # Skip these two test cases. # WHATWG cases where are not using percent-encoding for the space character. # Anyone know what's going on here? return p = urlparse(test_case["href"]) # Test cases include the protocol with the trailing ":" protocol = p.scheme + ":" # Include the square brackets for IPv6 addresses. hostname = f"[{p.host}]" if ":" in p.host else p.host # The test cases use a string representation of the port. port = "" if p.port is None else str(p.port) # I have nothing to say about this one. path = p.path # The 'search' and 'hash' components in the whatwg tests are semantic, not literal. # Our parsing differentiates between no query/hash and empty-string query/hash. search = "" if p.query in (None, "") else "?" + str(p.query) hash = "" if p.fragment in (None, "") else "#" + str(p.fragment) # URL hostnames are case-insensitive. # We normalize these, unlike the WHATWG test cases. assert protocol == test_case["protocol"] assert hostname.lower() == test_case["hostname"].lower() assert port == test_case["port"] assert path == test_case["pathname"] assert search == test_case["search"] assert hash == test_case["hash"] pydantic-httpx2-9b7ee8e/tests/httpx2/models/whatwg.json000066400000000000000000006277141521723372100233640ustar00rootroot00000000000000[ "See ../README.md for a description of the format.", { "input": "http://example\t.\norg", "base": "http://example.org/foo/bar", "href": "http://example.org/", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://user:pass@foo:21/bar;par?b#c", "base": "http://example.org/foo/bar", "href": "http://user:pass@foo:21/bar;par?b#c", "origin": "http://foo:21", "protocol": "http:", "username": "user", "password": "pass", "host": "foo:21", "hostname": "foo", "port": "21", "pathname": "/bar;par", "search": "?b", "hash": "#c" }, { "input": "https://test:@test", "base": null, "href": "https://test@test/", "origin": "https://test", "protocol": "https:", "username": "test", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "https://:@test", "base": null, "href": "https://test/", "origin": "https://test", "protocol": "https:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "non-special://test:@test/x", "base": null, "href": "non-special://test@test/x", "origin": "null", "protocol": "non-special:", "username": "test", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/x", "search": "", "hash": "" }, { "input": "non-special://:@test/x", "base": null, "href": "non-special://test/x", "origin": "null", "protocol": "non-special:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/x", "search": "", "hash": "" }, { "input": "http:foo.com", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/foo.com", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/foo.com", "search": "", "hash": "" }, { "input": "\t :foo.com \n", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/:foo.com", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/:foo.com", "search": "", "hash": "" }, { "input": " foo.com ", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/foo.com", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/foo.com", "search": "", "hash": "" }, { "input": "a:\t foo.com", "base": "http://example.org/foo/bar", "href": "a: foo.com", "origin": "null", "protocol": "a:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": " foo.com", "search": "", "hash": "" }, { "input": "http://f:21/ b ? d # e ", "base": "http://example.org/foo/bar", "href": "http://f:21/%20b%20?%20d%20#%20e", "origin": "http://f:21", "protocol": "http:", "username": "", "password": "", "host": "f:21", "hostname": "f", "port": "21", "pathname": "/%20b%20", "search": "?%20d%20", "hash": "#%20e" }, { "input": "lolscheme:x x#x x", "base": null, "href": "lolscheme:x x#x%20x", "protocol": "lolscheme:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "x x", "search": "", "hash": "#x%20x" }, { "input": "http://f:/c", "base": "http://example.org/foo/bar", "href": "http://f/c", "origin": "http://f", "protocol": "http:", "username": "", "password": "", "host": "f", "hostname": "f", "port": "", "pathname": "/c", "search": "", "hash": "" }, { "input": "http://f:0/c", "base": "http://example.org/foo/bar", "href": "http://f:0/c", "origin": "http://f:0", "protocol": "http:", "username": "", "password": "", "host": "f:0", "hostname": "f", "port": "0", "pathname": "/c", "search": "", "hash": "" }, { "input": "http://f:00000000000000/c", "base": "http://example.org/foo/bar", "href": "http://f:0/c", "origin": "http://f:0", "protocol": "http:", "username": "", "password": "", "host": "f:0", "hostname": "f", "port": "0", "pathname": "/c", "search": "", "hash": "" }, { "input": "http://f:00000000000000000000080/c", "base": "http://example.org/foo/bar", "href": "http://f/c", "origin": "http://f", "protocol": "http:", "username": "", "password": "", "host": "f", "hostname": "f", "port": "", "pathname": "/c", "search": "", "hash": "" }, { "input": "http://f:b/c", "base": "http://example.org/foo/bar", "failure": true }, { "input": "http://f: /c", "base": "http://example.org/foo/bar", "failure": true }, { "input": "http://f:\n/c", "base": "http://example.org/foo/bar", "href": "http://f/c", "origin": "http://f", "protocol": "http:", "username": "", "password": "", "host": "f", "hostname": "f", "port": "", "pathname": "/c", "search": "", "hash": "" }, { "input": "http://f:fifty-two/c", "base": "http://example.org/foo/bar", "failure": true }, { "input": "http://f:999999/c", "base": "http://example.org/foo/bar", "failure": true }, { "input": "non-special://f:999999/c", "base": "http://example.org/foo/bar", "failure": true }, { "input": "http://f: 21 / b ? d # e ", "base": "http://example.org/foo/bar", "failure": true }, { "input": "", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "", "hash": "" }, { "input": " \t", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "", "hash": "" }, { "input": ":foo.com/", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/:foo.com/", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/:foo.com/", "search": "", "hash": "" }, { "input": ":foo.com\\", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/:foo.com/", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/:foo.com/", "search": "", "hash": "" }, { "input": ":", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/:", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/:", "search": "", "hash": "" }, { "input": ":a", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/:a", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/:a", "search": "", "hash": "" }, { "input": ":/", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/:/", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/:/", "search": "", "hash": "" }, { "input": ":\\", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/:/", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/:/", "search": "", "hash": "" }, { "input": ":#", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/:#", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/:", "search": "", "hash": "" }, { "input": "#", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar#", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "", "hash": "" }, { "input": "#/", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar#/", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "", "hash": "#/" }, { "input": "#\\", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar#\\", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "", "hash": "#\\" }, { "input": "#;?", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar#;?", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "", "hash": "#;?" }, { "input": "?", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar?", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "", "hash": "" }, { "input": "/", "base": "http://example.org/foo/bar", "href": "http://example.org/", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": ":23", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/:23", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/:23", "search": "", "hash": "" }, { "input": "/:23", "base": "http://example.org/foo/bar", "href": "http://example.org/:23", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/:23", "search": "", "hash": "" }, { "input": "\\x", "base": "http://example.org/foo/bar", "href": "http://example.org/x", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/x", "search": "", "hash": "" }, { "input": "\\\\x\\hello", "base": "http://example.org/foo/bar", "href": "http://x/hello", "origin": "http://x", "protocol": "http:", "username": "", "password": "", "host": "x", "hostname": "x", "port": "", "pathname": "/hello", "search": "", "hash": "" }, { "input": "::", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/::", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/::", "search": "", "hash": "" }, { "input": "::23", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/::23", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/::23", "search": "", "hash": "" }, { "input": "foo://", "base": "http://example.org/foo/bar", "href": "foo://", "origin": "null", "protocol": "foo:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "", "search": "", "hash": "" }, { "input": "http://a:b@c:29/d", "base": "http://example.org/foo/bar", "href": "http://a:b@c:29/d", "origin": "http://c:29", "protocol": "http:", "username": "a", "password": "b", "host": "c:29", "hostname": "c", "port": "29", "pathname": "/d", "search": "", "hash": "" }, { "input": "http::@c:29", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/:@c:29", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/:@c:29", "search": "", "hash": "" }, { "input": "http://&a:foo(b]c@d:2/", "base": "http://example.org/foo/bar", "href": "http://&a:foo(b%5Dc@d:2/", "origin": "http://d:2", "protocol": "http:", "username": "&a", "password": "foo(b%5Dc", "host": "d:2", "hostname": "d", "port": "2", "pathname": "/", "search": "", "hash": "" }, { "input": "http://::@c@d:2", "base": "http://example.org/foo/bar", "href": "http://:%3A%40c@d:2/", "origin": "http://d:2", "protocol": "http:", "username": "", "password": "%3A%40c", "host": "d:2", "hostname": "d", "port": "2", "pathname": "/", "search": "", "hash": "" }, { "input": "http://foo.com:b@d/", "base": "http://example.org/foo/bar", "href": "http://foo.com:b@d/", "origin": "http://d", "protocol": "http:", "username": "foo.com", "password": "b", "host": "d", "hostname": "d", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://foo.com/\\@", "base": "http://example.org/foo/bar", "href": "http://foo.com//@", "origin": "http://foo.com", "protocol": "http:", "username": "", "password": "", "host": "foo.com", "hostname": "foo.com", "port": "", "pathname": "//@", "search": "", "hash": "" }, { "input": "http:\\\\foo.com\\", "base": "http://example.org/foo/bar", "href": "http://foo.com/", "origin": "http://foo.com", "protocol": "http:", "username": "", "password": "", "host": "foo.com", "hostname": "foo.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http:\\\\a\\b:c\\d@foo.com\\", "base": "http://example.org/foo/bar", "href": "http://a/b:c/d@foo.com/", "origin": "http://a", "protocol": "http:", "username": "", "password": "", "host": "a", "hostname": "a", "port": "", "pathname": "/b:c/d@foo.com/", "search": "", "hash": "" }, { "input": "http://a:b@c\\", "base": null, "href": "http://a:b@c/", "origin": "http://c", "protocol": "http:", "username": "a", "password": "b", "host": "c", "hostname": "c", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "ws://a@b\\c", "base": null, "href": "ws://a@b/c", "origin": "ws://b", "protocol": "ws:", "username": "a", "password": "", "host": "b", "hostname": "b", "port": "", "pathname": "/c", "search": "", "hash": "" }, { "input": "foo:/", "base": "http://example.org/foo/bar", "href": "foo:/", "origin": "null", "protocol": "foo:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "foo:/bar.com/", "base": "http://example.org/foo/bar", "href": "foo:/bar.com/", "origin": "null", "protocol": "foo:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/bar.com/", "search": "", "hash": "" }, { "input": "foo://///////", "base": "http://example.org/foo/bar", "href": "foo://///////", "origin": "null", "protocol": "foo:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "///////", "search": "", "hash": "" }, { "input": "foo://///////bar.com/", "base": "http://example.org/foo/bar", "href": "foo://///////bar.com/", "origin": "null", "protocol": "foo:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "///////bar.com/", "search": "", "hash": "" }, { "input": "foo:////://///", "base": "http://example.org/foo/bar", "href": "foo:////://///", "origin": "null", "protocol": "foo:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//://///", "search": "", "hash": "" }, { "input": "c:/foo", "base": "http://example.org/foo/bar", "href": "c:/foo", "origin": "null", "protocol": "c:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/foo", "search": "", "hash": "" }, { "input": "//foo/bar", "base": "http://example.org/foo/bar", "href": "http://foo/bar", "origin": "http://foo", "protocol": "http:", "username": "", "password": "", "host": "foo", "hostname": "foo", "port": "", "pathname": "/bar", "search": "", "hash": "" }, { "input": "http://foo/path;a??e#f#g", "base": "http://example.org/foo/bar", "href": "http://foo/path;a??e#f#g", "origin": "http://foo", "protocol": "http:", "username": "", "password": "", "host": "foo", "hostname": "foo", "port": "", "pathname": "/path;a", "search": "??e", "hash": "#f#g" }, { "input": "http://foo/abcd?efgh?ijkl", "base": "http://example.org/foo/bar", "href": "http://foo/abcd?efgh?ijkl", "origin": "http://foo", "protocol": "http:", "username": "", "password": "", "host": "foo", "hostname": "foo", "port": "", "pathname": "/abcd", "search": "?efgh?ijkl", "hash": "" }, { "input": "http://foo/abcd#foo?bar", "base": "http://example.org/foo/bar", "href": "http://foo/abcd#foo?bar", "origin": "http://foo", "protocol": "http:", "username": "", "password": "", "host": "foo", "hostname": "foo", "port": "", "pathname": "/abcd", "search": "", "hash": "#foo?bar" }, { "input": "[61:24:74]:98", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/[61:24:74]:98", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/[61:24:74]:98", "search": "", "hash": "" }, { "input": "http:[61:27]/:foo", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/[61:27]/:foo", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/[61:27]/:foo", "search": "", "hash": "" }, { "input": "http://[1::2]:3:4", "base": "http://example.org/foo/bar", "failure": true }, { "input": "http://2001::1", "base": "http://example.org/foo/bar", "failure": true }, { "input": "http://2001::1]", "base": "http://example.org/foo/bar", "failure": true }, { "input": "http://2001::1]:80", "base": "http://example.org/foo/bar", "failure": true }, { "input": "http://[2001::1]", "base": "http://example.org/foo/bar", "href": "http://[2001::1]/", "origin": "http://[2001::1]", "protocol": "http:", "username": "", "password": "", "host": "[2001::1]", "hostname": "[2001::1]", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://[::127.0.0.1]", "base": "http://example.org/foo/bar", "href": "http://[::7f00:1]/", "origin": "http://[::7f00:1]", "protocol": "http:", "username": "", "password": "", "host": "[::7f00:1]", "hostname": "[::7f00:1]", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://[::127.0.0.1.]", "base": "http://example.org/foo/bar", "failure": true }, { "input": "http://[0:0:0:0:0:0:13.1.68.3]", "base": "http://example.org/foo/bar", "href": "http://[::d01:4403]/", "origin": "http://[::d01:4403]", "protocol": "http:", "username": "", "password": "", "host": "[::d01:4403]", "hostname": "[::d01:4403]", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://[2001::1]:80", "base": "http://example.org/foo/bar", "href": "http://[2001::1]/", "origin": "http://[2001::1]", "protocol": "http:", "username": "", "password": "", "host": "[2001::1]", "hostname": "[2001::1]", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http:/example.com/", "base": "http://example.org/foo/bar", "href": "http://example.org/example.com/", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "ftp:/example.com/", "base": "http://example.org/foo/bar", "href": "ftp://example.com/", "origin": "ftp://example.com", "protocol": "ftp:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "https:/example.com/", "base": "http://example.org/foo/bar", "href": "https://example.com/", "origin": "https://example.com", "protocol": "https:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "madeupscheme:/example.com/", "base": "http://example.org/foo/bar", "href": "madeupscheme:/example.com/", "origin": "null", "protocol": "madeupscheme:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "file:/example.com/", "base": "http://example.org/foo/bar", "href": "file:///example.com/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "file://example:1/", "base": null, "failure": true }, { "input": "file://example:test/", "base": null, "failure": true }, { "input": "file://example%/", "base": null, "failure": true }, { "input": "file://[example]/", "base": null, "failure": true }, { "input": "ftps:/example.com/", "base": "http://example.org/foo/bar", "href": "ftps:/example.com/", "origin": "null", "protocol": "ftps:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "gopher:/example.com/", "base": "http://example.org/foo/bar", "href": "gopher:/example.com/", "origin": "null", "protocol": "gopher:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "ws:/example.com/", "base": "http://example.org/foo/bar", "href": "ws://example.com/", "origin": "ws://example.com", "protocol": "ws:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "wss:/example.com/", "base": "http://example.org/foo/bar", "href": "wss://example.com/", "origin": "wss://example.com", "protocol": "wss:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "data:/example.com/", "base": "http://example.org/foo/bar", "href": "data:/example.com/", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "javascript:/example.com/", "base": "http://example.org/foo/bar", "href": "javascript:/example.com/", "origin": "null", "protocol": "javascript:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "mailto:/example.com/", "base": "http://example.org/foo/bar", "href": "mailto:/example.com/", "origin": "null", "protocol": "mailto:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "http:example.com/", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/example.com/", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/example.com/", "search": "", "hash": "" }, { "input": "ftp:example.com/", "base": "http://example.org/foo/bar", "href": "ftp://example.com/", "origin": "ftp://example.com", "protocol": "ftp:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "https:example.com/", "base": "http://example.org/foo/bar", "href": "https://example.com/", "origin": "https://example.com", "protocol": "https:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "madeupscheme:example.com/", "base": "http://example.org/foo/bar", "href": "madeupscheme:example.com/", "origin": "null", "protocol": "madeupscheme:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "ftps:example.com/", "base": "http://example.org/foo/bar", "href": "ftps:example.com/", "origin": "null", "protocol": "ftps:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "gopher:example.com/", "base": "http://example.org/foo/bar", "href": "gopher:example.com/", "origin": "null", "protocol": "gopher:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "ws:example.com/", "base": "http://example.org/foo/bar", "href": "ws://example.com/", "origin": "ws://example.com", "protocol": "ws:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "wss:example.com/", "base": "http://example.org/foo/bar", "href": "wss://example.com/", "origin": "wss://example.com", "protocol": "wss:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "data:example.com/", "base": "http://example.org/foo/bar", "href": "data:example.com/", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "javascript:example.com/", "base": "http://example.org/foo/bar", "href": "javascript:example.com/", "origin": "null", "protocol": "javascript:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "mailto:example.com/", "base": "http://example.org/foo/bar", "href": "mailto:example.com/", "origin": "null", "protocol": "mailto:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "/a/b/c", "base": "http://example.org/foo/bar", "href": "http://example.org/a/b/c", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/a/b/c", "search": "", "hash": "" }, { "input": "/a/ /c", "base": "http://example.org/foo/bar", "href": "http://example.org/a/%20/c", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/a/%20/c", "search": "", "hash": "" }, { "input": "/a%2fc", "base": "http://example.org/foo/bar", "href": "http://example.org/a%2fc", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/a%2fc", "search": "", "hash": "" }, { "input": "/a/%2f/c", "base": "http://example.org/foo/bar", "href": "http://example.org/a/%2f/c", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/a/%2f/c", "search": "", "hash": "" }, { "input": "#Ξ²", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar#%CE%B2", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "", "hash": "#%CE%B2" }, { "input": "data:text/html,test#test", "base": "http://example.org/foo/bar", "href": "data:text/html,test#test", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "text/html,test", "search": "", "hash": "#test" }, { "input": "tel:1234567890", "base": "http://example.org/foo/bar", "href": "tel:1234567890", "origin": "null", "protocol": "tel:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "1234567890", "search": "", "hash": "" }, "# Based on https://felixfbecker.github.io/whatwg-url-custom-host-repro/", { "input": "ssh://example.com/foo/bar.git", "base": "http://example.org/", "href": "ssh://example.com/foo/bar.git", "origin": "null", "protocol": "ssh:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/bar.git", "search": "", "hash": "" }, "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/file.html", { "input": "file:c:\\foo\\bar.html", "base": "file:///tmp/mock/path", "href": "file:///c:/foo/bar.html", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/c:/foo/bar.html", "search": "", "hash": "" }, { "input": " File:c|////foo\\bar.html", "base": "file:///tmp/mock/path", "href": "file:///c:////foo/bar.html", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/c:////foo/bar.html", "search": "", "hash": "" }, { "input": "C|/foo/bar", "base": "file:///tmp/mock/path", "href": "file:///C:/foo/bar", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/foo/bar", "search": "", "hash": "" }, { "input": "/C|\\foo\\bar", "base": "file:///tmp/mock/path", "href": "file:///C:/foo/bar", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/foo/bar", "search": "", "hash": "" }, { "input": "//C|/foo/bar", "base": "file:///tmp/mock/path", "href": "file:///C:/foo/bar", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/foo/bar", "search": "", "hash": "" }, { "input": "//server/file", "base": "file:///tmp/mock/path", "href": "file://server/file", "protocol": "file:", "username": "", "password": "", "host": "server", "hostname": "server", "port": "", "pathname": "/file", "search": "", "hash": "" }, { "input": "\\\\server\\file", "base": "file:///tmp/mock/path", "href": "file://server/file", "protocol": "file:", "username": "", "password": "", "host": "server", "hostname": "server", "port": "", "pathname": "/file", "search": "", "hash": "" }, { "input": "/\\server/file", "base": "file:///tmp/mock/path", "href": "file://server/file", "protocol": "file:", "username": "", "password": "", "host": "server", "hostname": "server", "port": "", "pathname": "/file", "search": "", "hash": "" }, { "input": "file:///foo/bar.txt", "base": "file:///tmp/mock/path", "href": "file:///foo/bar.txt", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/foo/bar.txt", "search": "", "hash": "" }, { "input": "file:///home/me", "base": "file:///tmp/mock/path", "href": "file:///home/me", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/home/me", "search": "", "hash": "" }, { "input": "//", "base": "file:///tmp/mock/path", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "///", "base": "file:///tmp/mock/path", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "///test", "base": "file:///tmp/mock/path", "href": "file:///test", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "", "hash": "" }, { "input": "file://test", "base": "file:///tmp/mock/path", "href": "file://test/", "protocol": "file:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "file://localhost", "base": "file:///tmp/mock/path", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "file://localhost/", "base": "file:///tmp/mock/path", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "file://localhost/test", "base": "file:///tmp/mock/path", "href": "file:///test", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "", "hash": "" }, { "input": "test", "base": "file:///tmp/mock/path", "href": "file:///tmp/mock/test", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/tmp/mock/test", "search": "", "hash": "" }, { "input": "file:test", "base": "file:///tmp/mock/path", "href": "file:///tmp/mock/test", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/tmp/mock/test", "search": "", "hash": "" }, "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/path.js", { "input": "http://example.com/././foo", "base": null, "href": "http://example.com/foo", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo", "search": "", "hash": "" }, { "input": "http://example.com/./.foo", "base": null, "href": "http://example.com/.foo", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/.foo", "search": "", "hash": "" }, { "input": "http://example.com/foo/.", "base": null, "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/", "search": "", "hash": "" }, { "input": "http://example.com/foo/./", "base": null, "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/", "search": "", "hash": "" }, { "input": "http://example.com/foo/bar/..", "base": null, "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/", "search": "", "hash": "" }, { "input": "http://example.com/foo/bar/../", "base": null, "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/", "search": "", "hash": "" }, { "input": "http://example.com/foo/..bar", "base": null, "href": "http://example.com/foo/..bar", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/..bar", "search": "", "hash": "" }, { "input": "http://example.com/foo/bar/../ton", "base": null, "href": "http://example.com/foo/ton", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/ton", "search": "", "hash": "" }, { "input": "http://example.com/foo/bar/../ton/../../a", "base": null, "href": "http://example.com/a", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/a", "search": "", "hash": "" }, { "input": "http://example.com/foo/../../..", "base": null, "href": "http://example.com/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://example.com/foo/../../../ton", "base": null, "href": "http://example.com/ton", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/ton", "search": "", "hash": "" }, { "input": "http://example.com/foo/%2e", "base": null, "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/", "search": "", "hash": "" }, { "input": "http://example.com/foo/%2e%2", "base": null, "href": "http://example.com/foo/%2e%2", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/%2e%2", "search": "", "hash": "" }, { "input": "http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar", "base": null, "href": "http://example.com/%2e.bar", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/%2e.bar", "search": "", "hash": "" }, { "input": "http://example.com////../..", "base": null, "href": "http://example.com//", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "//", "search": "", "hash": "" }, { "input": "http://example.com/foo/bar//../..", "base": null, "href": "http://example.com/foo/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/", "search": "", "hash": "" }, { "input": "http://example.com/foo/bar//..", "base": null, "href": "http://example.com/foo/bar/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo/bar/", "search": "", "hash": "" }, { "input": "http://example.com/foo", "base": null, "href": "http://example.com/foo", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo", "search": "", "hash": "" }, { "input": "http://example.com/%20foo", "base": null, "href": "http://example.com/%20foo", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/%20foo", "search": "", "hash": "" }, { "input": "http://example.com/foo%", "base": null, "href": "http://example.com/foo%", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo%", "search": "", "hash": "" }, { "input": "http://example.com/foo%2", "base": null, "href": "http://example.com/foo%2", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo%2", "search": "", "hash": "" }, { "input": "http://example.com/foo%2zbar", "base": null, "href": "http://example.com/foo%2zbar", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo%2zbar", "search": "", "hash": "" }, { "input": "http://example.com/foo%2©zbar", "base": null, "href": "http://example.com/foo%2%C3%82%C2%A9zbar", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo%2%C3%82%C2%A9zbar", "search": "", "hash": "" }, { "input": "http://example.com/foo%41%7a", "base": null, "href": "http://example.com/foo%41%7a", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo%41%7a", "search": "", "hash": "" }, { "input": "http://example.com/foo\t\u0091%91", "base": null, "href": "http://example.com/foo%C2%91%91", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo%C2%91%91", "search": "", "hash": "" }, { "input": "http://example.com/foo%00%51", "base": null, "href": "http://example.com/foo%00%51", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foo%00%51", "search": "", "hash": "" }, { "input": "http://example.com/(%28:%3A%29)", "base": null, "href": "http://example.com/(%28:%3A%29)", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/(%28:%3A%29)", "search": "", "hash": "" }, { "input": "http://example.com/%3A%3a%3C%3c", "base": null, "href": "http://example.com/%3A%3a%3C%3c", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/%3A%3a%3C%3c", "search": "", "hash": "" }, { "input": "http://example.com/foo\tbar", "base": null, "href": "http://example.com/foobar", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/foobar", "search": "", "hash": "" }, { "input": "http://example.com\\\\foo\\\\bar", "base": null, "href": "http://example.com//foo//bar", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "//foo//bar", "search": "", "hash": "" }, { "input": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd", "base": null, "href": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/%7Ffp3%3Eju%3Dduvgw%3Dd", "search": "", "hash": "" }, { "input": "http://example.com/@asdf%40", "base": null, "href": "http://example.com/@asdf%40", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/@asdf%40", "search": "", "hash": "" }, { "input": "http://example.com/δ½ ε₯½δ½ ε₯½", "base": null, "href": "http://example.com/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD", "search": "", "hash": "" }, { "input": "http://example.com/β€₯/foo", "base": null, "href": "http://example.com/%E2%80%A5/foo", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/%E2%80%A5/foo", "search": "", "hash": "" }, { "input": "http://example.com/ο»Ώ/foo", "base": null, "href": "http://example.com/%EF%BB%BF/foo", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/%EF%BB%BF/foo", "search": "", "hash": "" }, { "input": "http://example.com/β€�/foo/‭/bar", "base": null, "href": "http://example.com/%E2%80%AE/foo/%E2%80%AD/bar", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/%E2%80%AE/foo/%E2%80%AD/bar", "search": "", "hash": "" }, "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/relative.js", { "input": "http://www.google.com/foo?bar=baz#", "base": null, "href": "http://www.google.com/foo?bar=baz#", "origin": "http://www.google.com", "protocol": "http:", "username": "", "password": "", "host": "www.google.com", "hostname": "www.google.com", "port": "", "pathname": "/foo", "search": "?bar=baz", "hash": "" }, { "input": "http://www.google.com/foo?bar=baz# Β»", "base": null, "href": "http://www.google.com/foo?bar=baz#%20%C2%BB", "origin": "http://www.google.com", "protocol": "http:", "username": "", "password": "", "host": "www.google.com", "hostname": "www.google.com", "port": "", "pathname": "/foo", "search": "?bar=baz", "hash": "#%20%C2%BB" }, { "input": "data:test# Β»", "base": null, "href": "data:test#%20%C2%BB", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "test", "search": "", "hash": "#%20%C2%BB" }, { "input": "http://www.google.com", "base": null, "href": "http://www.google.com/", "origin": "http://www.google.com", "protocol": "http:", "username": "", "password": "", "host": "www.google.com", "hostname": "www.google.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://192.0x00A80001", "base": null, "href": "http://192.168.0.1/", "origin": "http://192.168.0.1", "protocol": "http:", "username": "", "password": "", "host": "192.168.0.1", "hostname": "192.168.0.1", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://www/foo%2Ehtml", "base": null, "href": "http://www/foo%2Ehtml", "origin": "http://www", "protocol": "http:", "username": "", "password": "", "host": "www", "hostname": "www", "port": "", "pathname": "/foo%2Ehtml", "search": "", "hash": "" }, { "input": "http://www/foo/%2E/html", "base": null, "href": "http://www/foo/html", "origin": "http://www", "protocol": "http:", "username": "", "password": "", "host": "www", "hostname": "www", "port": "", "pathname": "/foo/html", "search": "", "hash": "" }, { "input": "http://user:pass@/", "base": null, "failure": true }, { "input": "http://%25DOMAIN:foobar@foodomain.com/", "base": null, "href": "http://%25DOMAIN:foobar@foodomain.com/", "origin": "http://foodomain.com", "protocol": "http:", "username": "%25DOMAIN", "password": "foobar", "host": "foodomain.com", "hostname": "foodomain.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http:\\\\www.google.com\\foo", "base": null, "href": "http://www.google.com/foo", "origin": "http://www.google.com", "protocol": "http:", "username": "", "password": "", "host": "www.google.com", "hostname": "www.google.com", "port": "", "pathname": "/foo", "search": "", "hash": "" }, { "input": "http://foo:80/", "base": null, "href": "http://foo/", "origin": "http://foo", "protocol": "http:", "username": "", "password": "", "host": "foo", "hostname": "foo", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://foo:81/", "base": null, "href": "http://foo:81/", "origin": "http://foo:81", "protocol": "http:", "username": "", "password": "", "host": "foo:81", "hostname": "foo", "port": "81", "pathname": "/", "search": "", "hash": "" }, { "input": "httpa://foo:80/", "base": null, "href": "httpa://foo:80/", "origin": "null", "protocol": "httpa:", "username": "", "password": "", "host": "foo:80", "hostname": "foo", "port": "80", "pathname": "/", "search": "", "hash": "" }, { "input": "http://foo:-80/", "base": null, "failure": true }, { "input": "https://foo:443/", "base": null, "href": "https://foo/", "origin": "https://foo", "protocol": "https:", "username": "", "password": "", "host": "foo", "hostname": "foo", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "https://foo:80/", "base": null, "href": "https://foo:80/", "origin": "https://foo:80", "protocol": "https:", "username": "", "password": "", "host": "foo:80", "hostname": "foo", "port": "80", "pathname": "/", "search": "", "hash": "" }, { "input": "ftp://foo:21/", "base": null, "href": "ftp://foo/", "origin": "ftp://foo", "protocol": "ftp:", "username": "", "password": "", "host": "foo", "hostname": "foo", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "ftp://foo:80/", "base": null, "href": "ftp://foo:80/", "origin": "ftp://foo:80", "protocol": "ftp:", "username": "", "password": "", "host": "foo:80", "hostname": "foo", "port": "80", "pathname": "/", "search": "", "hash": "" }, { "input": "gopher://foo:70/", "base": null, "href": "gopher://foo:70/", "origin": "null", "protocol": "gopher:", "username": "", "password": "", "host": "foo:70", "hostname": "foo", "port": "70", "pathname": "/", "search": "", "hash": "" }, { "input": "gopher://foo:443/", "base": null, "href": "gopher://foo:443/", "origin": "null", "protocol": "gopher:", "username": "", "password": "", "host": "foo:443", "hostname": "foo", "port": "443", "pathname": "/", "search": "", "hash": "" }, { "input": "ws://foo:80/", "base": null, "href": "ws://foo/", "origin": "ws://foo", "protocol": "ws:", "username": "", "password": "", "host": "foo", "hostname": "foo", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "ws://foo:81/", "base": null, "href": "ws://foo:81/", "origin": "ws://foo:81", "protocol": "ws:", "username": "", "password": "", "host": "foo:81", "hostname": "foo", "port": "81", "pathname": "/", "search": "", "hash": "" }, { "input": "ws://foo:443/", "base": null, "href": "ws://foo:443/", "origin": "ws://foo:443", "protocol": "ws:", "username": "", "password": "", "host": "foo:443", "hostname": "foo", "port": "443", "pathname": "/", "search": "", "hash": "" }, { "input": "ws://foo:815/", "base": null, "href": "ws://foo:815/", "origin": "ws://foo:815", "protocol": "ws:", "username": "", "password": "", "host": "foo:815", "hostname": "foo", "port": "815", "pathname": "/", "search": "", "hash": "" }, { "input": "wss://foo:80/", "base": null, "href": "wss://foo:80/", "origin": "wss://foo:80", "protocol": "wss:", "username": "", "password": "", "host": "foo:80", "hostname": "foo", "port": "80", "pathname": "/", "search": "", "hash": "" }, { "input": "wss://foo:81/", "base": null, "href": "wss://foo:81/", "origin": "wss://foo:81", "protocol": "wss:", "username": "", "password": "", "host": "foo:81", "hostname": "foo", "port": "81", "pathname": "/", "search": "", "hash": "" }, { "input": "wss://foo:443/", "base": null, "href": "wss://foo/", "origin": "wss://foo", "protocol": "wss:", "username": "", "password": "", "host": "foo", "hostname": "foo", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "wss://foo:815/", "base": null, "href": "wss://foo:815/", "origin": "wss://foo:815", "protocol": "wss:", "username": "", "password": "", "host": "foo:815", "hostname": "foo", "port": "815", "pathname": "/", "search": "", "hash": "" }, { "input": "http:/example.com/", "base": null, "href": "http://example.com/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "ftp:/example.com/", "base": null, "href": "ftp://example.com/", "origin": "ftp://example.com", "protocol": "ftp:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "https:/example.com/", "base": null, "href": "https://example.com/", "origin": "https://example.com", "protocol": "https:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "madeupscheme:/example.com/", "base": null, "href": "madeupscheme:/example.com/", "origin": "null", "protocol": "madeupscheme:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "file:/example.com/", "base": null, "href": "file:///example.com/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "ftps:/example.com/", "base": null, "href": "ftps:/example.com/", "origin": "null", "protocol": "ftps:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "gopher:/example.com/", "base": null, "href": "gopher:/example.com/", "origin": "null", "protocol": "gopher:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "ws:/example.com/", "base": null, "href": "ws://example.com/", "origin": "ws://example.com", "protocol": "ws:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "wss:/example.com/", "base": null, "href": "wss://example.com/", "origin": "wss://example.com", "protocol": "wss:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "data:/example.com/", "base": null, "href": "data:/example.com/", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "javascript:/example.com/", "base": null, "href": "javascript:/example.com/", "origin": "null", "protocol": "javascript:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "mailto:/example.com/", "base": null, "href": "mailto:/example.com/", "origin": "null", "protocol": "mailto:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/example.com/", "search": "", "hash": "" }, { "input": "http:example.com/", "base": null, "href": "http://example.com/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "ftp:example.com/", "base": null, "href": "ftp://example.com/", "origin": "ftp://example.com", "protocol": "ftp:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "https:example.com/", "base": null, "href": "https://example.com/", "origin": "https://example.com", "protocol": "https:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "madeupscheme:example.com/", "base": null, "href": "madeupscheme:example.com/", "origin": "null", "protocol": "madeupscheme:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "ftps:example.com/", "base": null, "href": "ftps:example.com/", "origin": "null", "protocol": "ftps:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "gopher:example.com/", "base": null, "href": "gopher:example.com/", "origin": "null", "protocol": "gopher:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "ws:example.com/", "base": null, "href": "ws://example.com/", "origin": "ws://example.com", "protocol": "ws:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "wss:example.com/", "base": null, "href": "wss://example.com/", "origin": "wss://example.com", "protocol": "wss:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "data:example.com/", "base": null, "href": "data:example.com/", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "javascript:example.com/", "base": null, "href": "javascript:example.com/", "origin": "null", "protocol": "javascript:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, { "input": "mailto:example.com/", "base": null, "href": "mailto:example.com/", "origin": "null", "protocol": "mailto:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "example.com/", "search": "", "hash": "" }, "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/segments-userinfo-vs-host.html", { "input": "http:@www.example.com", "base": null, "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http:/@www.example.com", "base": null, "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://@www.example.com", "base": null, "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http:a:b@www.example.com", "base": null, "href": "http://a:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "a", "password": "b", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http:/a:b@www.example.com", "base": null, "href": "http://a:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "a", "password": "b", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://a:b@www.example.com", "base": null, "href": "http://a:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "a", "password": "b", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://@pple.com", "base": null, "href": "http://pple.com/", "origin": "http://pple.com", "protocol": "http:", "username": "", "password": "", "host": "pple.com", "hostname": "pple.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http::b@www.example.com", "base": null, "href": "http://:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "b", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http:/:b@www.example.com", "base": null, "href": "http://:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "b", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://:b@www.example.com", "base": null, "href": "http://:b@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "b", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http:/:@/www.example.com", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "http://user@/www.example.com", "base": null, "failure": true }, { "input": "http:@/www.example.com", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "http:/@/www.example.com", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "http://@/www.example.com", "base": null, "failure": true }, { "input": "https:@/www.example.com", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "http:a:b@/www.example.com", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "http:/a:b@/www.example.com", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "http://a:b@/www.example.com", "base": null, "failure": true }, { "input": "http::@/www.example.com", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "http:a:@www.example.com", "base": null, "href": "http://a@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "a", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http:/a:@www.example.com", "base": null, "href": "http://a@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "a", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://a:@www.example.com", "base": null, "href": "http://a@www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "a", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://www.@pple.com", "base": null, "href": "http://www.@pple.com/", "origin": "http://pple.com", "protocol": "http:", "username": "www.", "password": "", "host": "pple.com", "hostname": "pple.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http:@:www.example.com", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "http:/@:www.example.com", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "http://@:www.example.com", "base": null, "failure": true }, { "input": "http://:@www.example.com", "base": null, "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, "# Others", { "input": "/", "base": "http://www.example.com/test", "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "/test.txt", "base": "http://www.example.com/test", "href": "http://www.example.com/test.txt", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/test.txt", "search": "", "hash": "" }, { "input": ".", "base": "http://www.example.com/test", "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "..", "base": "http://www.example.com/test", "href": "http://www.example.com/", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "test.txt", "base": "http://www.example.com/test", "href": "http://www.example.com/test.txt", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/test.txt", "search": "", "hash": "" }, { "input": "./test.txt", "base": "http://www.example.com/test", "href": "http://www.example.com/test.txt", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/test.txt", "search": "", "hash": "" }, { "input": "../test.txt", "base": "http://www.example.com/test", "href": "http://www.example.com/test.txt", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/test.txt", "search": "", "hash": "" }, { "input": "../aaa/test.txt", "base": "http://www.example.com/test", "href": "http://www.example.com/aaa/test.txt", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/aaa/test.txt", "search": "", "hash": "" }, { "input": "../../test.txt", "base": "http://www.example.com/test", "href": "http://www.example.com/test.txt", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/test.txt", "search": "", "hash": "" }, { "input": "δΈ­/test.txt", "base": "http://www.example.com/test", "href": "http://www.example.com/%E4%B8%AD/test.txt", "origin": "http://www.example.com", "protocol": "http:", "username": "", "password": "", "host": "www.example.com", "hostname": "www.example.com", "port": "", "pathname": "/%E4%B8%AD/test.txt", "search": "", "hash": "" }, { "input": "http://www.example2.com", "base": "http://www.example.com/test", "href": "http://www.example2.com/", "origin": "http://www.example2.com", "protocol": "http:", "username": "", "password": "", "host": "www.example2.com", "hostname": "www.example2.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "//www.example2.com", "base": "http://www.example.com/test", "href": "http://www.example2.com/", "origin": "http://www.example2.com", "protocol": "http:", "username": "", "password": "", "host": "www.example2.com", "hostname": "www.example2.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "file:...", "base": "http://www.example.com/test", "href": "file:///...", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/...", "search": "", "hash": "" }, { "input": "file:..", "base": "http://www.example.com/test", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "file:a", "base": "http://www.example.com/test", "href": "file:///a", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/a", "search": "", "hash": "" }, { "input": "file:.", "base": null, "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "file:.", "base": "http://www.example.com/test", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/host.html", "Basic canonicalization, uppercase should be converted to lowercase", { "input": "http://ExAmPlE.CoM", "base": "http://other.com/", "href": "http://example.com/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://example example.com", "base": "http://other.com/", "failure": true }, { "input": "http://Goo%20 goo%7C|.com", "base": "http://other.com/", "failure": true }, { "input": "http://[]", "base": "http://other.com/", "failure": true }, { "input": "http://[:]", "base": "http://other.com/", "failure": true }, "U+3000 is mapped to U+0020 (space) which is disallowed", { "input": "http://GOO\u00a0\u3000goo.com", "base": "http://other.com/", "failure": true }, "Other types of space (no-break, zero-width, zero-width-no-break) are name-prepped away to nothing. U+200B, U+2060, and U+FEFF, are ignored", { "input": "http://GOO\u200b\u2060\ufeffgoo.com", "base": "http://other.com/", "href": "http://googoo.com/", "origin": "http://googoo.com", "protocol": "http:", "username": "", "password": "", "host": "googoo.com", "hostname": "googoo.com", "port": "", "pathname": "/", "search": "", "hash": "" }, "Leading and trailing C0 control or space", { "input": "\u0000\u001b\u0004\u0012 http://example.com/\u001f \u000d ", "base": null, "href": "http://example.com/", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/", "search": "", "hash": "" }, "Ideographic full stop (full-width period for Chinese, etc.) should be treated as a dot. U+3002 is mapped to U+002E (dot)", { "input": "http://www.foo。bar.com", "base": "http://other.com/", "href": "http://www.foo.bar.com/", "origin": "http://www.foo.bar.com", "protocol": "http:", "username": "", "password": "", "host": "www.foo.bar.com", "hostname": "www.foo.bar.com", "port": "", "pathname": "/", "search": "", "hash": "" }, "Invalid unicode characters should fail... U+FDD0 is disallowed; %ef%b7%90 is U+FDD0", { "input": "http://\ufdd0zyx.com", "base": "http://other.com/", "failure": true }, "This is the same as previous but escaped", { "input": "http://%ef%b7%90zyx.com", "base": "http://other.com/", "failure": true }, "U+FFFD", { "input": "https://\ufffd", "base": null, "failure": true }, { "input": "https://%EF%BF%BD", "base": null, "failure": true }, { "input": "https://x/\ufffd?\ufffd#\ufffd", "base": null, "href": "https://x/%EF%BF%BD?%EF%BF%BD#%EF%BF%BD", "origin": "https://x", "protocol": "https:", "username": "", "password": "", "host": "x", "hostname": "x", "port": "", "pathname": "/%EF%BF%BD", "search": "?%EF%BF%BD", "hash": "#%EF%BF%BD" }, "Domain is ASCII, but a label is invalid IDNA", { "input": "http://a.b.c.xn--pokxncvks", "base": null, "failure": true }, { "input": "http://10.0.0.xn--pokxncvks", "base": null, "failure": true }, "IDNA labels should be matched case-insensitively", { "input": "http://a.b.c.XN--pokxncvks", "base": null, "failure": true }, { "input": "http://a.b.c.Xn--pokxncvks", "base": null, "failure": true }, { "input": "http://10.0.0.XN--pokxncvks", "base": null, "failure": true }, { "input": "http://10.0.0.xN--pokxncvks", "base": null, "failure": true }, "Test name prepping, fullwidth input should be converted to ASCII and NOT IDN-ized. This is 'Go' in fullwidth UTF-8/UTF-16.", { "input": "http://Go.com", "base": "http://other.com/", "href": "http://go.com/", "origin": "http://go.com", "protocol": "http:", "username": "", "password": "", "host": "go.com", "hostname": "go.com", "port": "", "pathname": "/", "search": "", "hash": "" }, "URL spec forbids the following. https://www.w3.org/Bugs/Public/show_bug.cgi?id=24257", { "input": "http://οΌ…οΌ”οΌ‘.com", "base": "http://other.com/", "failure": true }, { "input": "http://%ef%bc%85%ef%bc%94%ef%bc%91.com", "base": "http://other.com/", "failure": true }, "...%00 in fullwidth should fail (also as escaped UTF-8 input)", { "input": "http://%00.com", "base": "http://other.com/", "failure": true }, { "input": "http://%ef%bc%85%ef%bc%90%ef%bc%90.com", "base": "http://other.com/", "failure": true }, "Basic IDN support, UTF-8 and UTF-16 input should be converted to IDN", { "input": "http://δ½ ε₯½δ½ ε₯½", "base": "http://other.com/", "href": "http://xn--6qqa088eba/", "origin": "http://xn--6qqa088eba", "protocol": "http:", "username": "", "password": "", "host": "xn--6qqa088eba", "hostname": "xn--6qqa088eba", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "https://faß.ExAmPlE/", "base": null, "href": "https://xn--fa-hia.example/", "origin": "https://xn--fa-hia.example", "protocol": "https:", "username": "", "password": "", "host": "xn--fa-hia.example", "hostname": "xn--fa-hia.example", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "sc://faß.ExAmPlE/", "base": null, "href": "sc://fa%C3%9F.ExAmPlE/", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "fa%C3%9F.ExAmPlE", "hostname": "fa%C3%9F.ExAmPlE", "port": "", "pathname": "/", "search": "", "hash": "" }, "Invalid escaped characters should fail and the percents should be escaped. https://www.w3.org/Bugs/Public/show_bug.cgi?id=24191", { "input": "http://%zz%66%a.com", "base": "http://other.com/", "failure": true }, "If we get an invalid character that has been escaped.", { "input": "http://%25", "base": "http://other.com/", "failure": true }, { "input": "http://hello%00", "base": "http://other.com/", "failure": true }, "Escaped numbers should be treated like IP addresses if they are.", { "input": "http://%30%78%63%30%2e%30%32%35%30.01", "base": "http://other.com/", "href": "http://192.168.0.1/", "origin": "http://192.168.0.1", "protocol": "http:", "username": "", "password": "", "host": "192.168.0.1", "hostname": "192.168.0.1", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://%30%78%63%30%2e%30%32%35%30.01%2e", "base": "http://other.com/", "href": "http://192.168.0.1/", "origin": "http://192.168.0.1", "protocol": "http:", "username": "", "password": "", "host": "192.168.0.1", "hostname": "192.168.0.1", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://192.168.0.257", "base": "http://other.com/", "failure": true }, "Invalid escaping in hosts causes failure", { "input": "http://%3g%78%63%30%2e%30%32%35%30%2E.01", "base": "http://other.com/", "failure": true }, "A space in a host causes failure", { "input": "http://192.168.0.1 hello", "base": "http://other.com/", "failure": true }, { "input": "https://x x:12", "base": null, "failure": true }, "Fullwidth and escaped UTF-8 fullwidth should still be treated as IP", { "input": "http://οΌοΌΈο½ƒοΌοΌŽοΌοΌ’οΌ•οΌοΌŽοΌοΌ‘", "base": "http://other.com/", "href": "http://192.168.0.1/", "origin": "http://192.168.0.1", "protocol": "http:", "username": "", "password": "", "host": "192.168.0.1", "hostname": "192.168.0.1", "port": "", "pathname": "/", "search": "", "hash": "" }, "Domains with empty labels", { "input": "http://./", "base": null, "href": "http://./", "origin": "http://.", "protocol": "http:", "username": "", "password": "", "host": ".", "hostname": ".", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://../", "base": null, "href": "http://../", "origin": "http://..", "protocol": "http:", "username": "", "password": "", "host": "..", "hostname": "..", "port": "", "pathname": "/", "search": "", "hash": "" }, "Non-special domains with empty labels", { "input": "h://.", "base": null, "href": "h://.", "origin": "null", "protocol": "h:", "username": "", "password": "", "host": ".", "hostname": ".", "port": "", "pathname": "", "search": "", "hash": "" }, "Broken IPv6", { "input": "http://[www.google.com]/", "base": null, "failure": true }, { "input": "http://[google.com]", "base": "http://other.com/", "failure": true }, { "input": "http://[::1.2.3.4x]", "base": "http://other.com/", "failure": true }, { "input": "http://[::1.2.3.]", "base": "http://other.com/", "failure": true }, { "input": "http://[::1.2.]", "base": "http://other.com/", "failure": true }, { "input": "http://[::.1.2]", "base": "http://other.com/", "failure": true }, { "input": "http://[::1.]", "base": "http://other.com/", "failure": true }, { "input": "http://[::.1]", "base": "http://other.com/", "failure": true }, { "input": "http://[::%31]", "base": "http://other.com/", "failure": true }, { "input": "http://%5B::1]", "base": "http://other.com/", "failure": true }, "Misc Unicode", { "input": "http://foo:πŸ’©@example.com/bar", "base": "http://other.com/", "href": "http://foo:%F0%9F%92%A9@example.com/bar", "origin": "http://example.com", "protocol": "http:", "username": "foo", "password": "%F0%9F%92%A9", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/bar", "search": "", "hash": "" }, "# resolving a fragment against any scheme succeeds", { "input": "#", "base": "test:test", "href": "test:test#", "origin": "null", "protocol": "test:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "test", "search": "", "hash": "" }, { "input": "#x", "base": "mailto:x@x.com", "href": "mailto:x@x.com#x", "origin": "null", "protocol": "mailto:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "x@x.com", "search": "", "hash": "#x" }, { "input": "#x", "base": "data:,", "href": "data:,#x", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": ",", "search": "", "hash": "#x" }, { "input": "#x", "base": "about:blank", "href": "about:blank#x", "origin": "null", "protocol": "about:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "blank", "search": "", "hash": "#x" }, { "input": "#x:y", "base": "about:blank", "href": "about:blank#x:y", "origin": "null", "protocol": "about:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "blank", "search": "", "hash": "#x:y" }, { "input": "#", "base": "test:test?test", "href": "test:test?test#", "origin": "null", "protocol": "test:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "test", "search": "?test", "hash": "" }, "# multiple @ in authority state", { "input": "https://@test@test@example:800/", "base": "http://doesnotmatter/", "href": "https://%40test%40test@example:800/", "origin": "https://example:800", "protocol": "https:", "username": "%40test%40test", "password": "", "host": "example:800", "hostname": "example", "port": "800", "pathname": "/", "search": "", "hash": "" }, { "input": "https://@@@example", "base": "http://doesnotmatter/", "href": "https://%40%40@example/", "origin": "https://example", "protocol": "https:", "username": "%40%40", "password": "", "host": "example", "hostname": "example", "port": "", "pathname": "/", "search": "", "hash": "" }, "non-az-09 characters", { "input": "http://`{}:`{}@h/`{}?`{}", "base": "http://doesnotmatter/", "href": "http://%60%7B%7D:%60%7B%7D@h/%60%7B%7D?`{}", "origin": "http://h", "protocol": "http:", "username": "%60%7B%7D", "password": "%60%7B%7D", "host": "h", "hostname": "h", "port": "", "pathname": "/%60%7B%7D", "search": "?`{}", "hash": "" }, "byte is ' and url is special", { "input": "http://host/?'", "base": null, "href": "http://host/?%27", "origin": "http://host", "protocol": "http:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/", "search": "?%27", "hash": "" }, { "input": "notspecial://host/?'", "base": null, "href": "notspecial://host/?'", "origin": "null", "protocol": "notspecial:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/", "search": "?'", "hash": "" }, "# Credentials in base", { "input": "/some/path", "base": "http://user@example.org/smth", "href": "http://user@example.org/some/path", "origin": "http://example.org", "protocol": "http:", "username": "user", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/some/path", "search": "", "hash": "" }, { "input": "", "base": "http://user:pass@example.org:21/smth", "href": "http://user:pass@example.org:21/smth", "origin": "http://example.org:21", "protocol": "http:", "username": "user", "password": "pass", "host": "example.org:21", "hostname": "example.org", "port": "21", "pathname": "/smth", "search": "", "hash": "" }, { "input": "/some/path", "base": "http://user:pass@example.org:21/smth", "href": "http://user:pass@example.org:21/some/path", "origin": "http://example.org:21", "protocol": "http:", "username": "user", "password": "pass", "host": "example.org:21", "hostname": "example.org", "port": "21", "pathname": "/some/path", "search": "", "hash": "" }, "# a set of tests designed by zcorpan for relative URLs with unknown schemes", { "input": "i", "base": "sc:sd", "failure": true }, { "input": "i", "base": "sc:sd/sd", "failure": true }, { "input": "i", "base": "sc:/pa/pa", "href": "sc:/pa/i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/pa/i", "search": "", "hash": "" }, { "input": "i", "base": "sc://ho/pa", "href": "sc://ho/i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "ho", "hostname": "ho", "port": "", "pathname": "/i", "search": "", "hash": "" }, { "input": "i", "base": "sc:///pa/pa", "href": "sc:///pa/i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/pa/i", "search": "", "hash": "" }, { "input": "../i", "base": "sc:sd", "failure": true }, { "input": "../i", "base": "sc:sd/sd", "failure": true }, { "input": "../i", "base": "sc:/pa/pa", "href": "sc:/i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/i", "search": "", "hash": "" }, { "input": "../i", "base": "sc://ho/pa", "href": "sc://ho/i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "ho", "hostname": "ho", "port": "", "pathname": "/i", "search": "", "hash": "" }, { "input": "../i", "base": "sc:///pa/pa", "href": "sc:///i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/i", "search": "", "hash": "" }, { "input": "/i", "base": "sc:sd", "failure": true }, { "input": "/i", "base": "sc:sd/sd", "failure": true }, { "input": "/i", "base": "sc:/pa/pa", "href": "sc:/i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/i", "search": "", "hash": "" }, { "input": "/i", "base": "sc://ho/pa", "href": "sc://ho/i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "ho", "hostname": "ho", "port": "", "pathname": "/i", "search": "", "hash": "" }, { "input": "/i", "base": "sc:///pa/pa", "href": "sc:///i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/i", "search": "", "hash": "" }, { "input": "?i", "base": "sc:sd", "failure": true }, { "input": "?i", "base": "sc:sd/sd", "failure": true }, { "input": "?i", "base": "sc:/pa/pa", "href": "sc:/pa/pa?i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/pa/pa", "search": "?i", "hash": "" }, { "input": "?i", "base": "sc://ho/pa", "href": "sc://ho/pa?i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "ho", "hostname": "ho", "port": "", "pathname": "/pa", "search": "?i", "hash": "" }, { "input": "?i", "base": "sc:///pa/pa", "href": "sc:///pa/pa?i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/pa/pa", "search": "?i", "hash": "" }, { "input": "#i", "base": "sc:sd", "href": "sc:sd#i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "sd", "search": "", "hash": "#i" }, { "input": "#i", "base": "sc:sd/sd", "href": "sc:sd/sd#i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "sd/sd", "search": "", "hash": "#i" }, { "input": "#i", "base": "sc:/pa/pa", "href": "sc:/pa/pa#i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/pa/pa", "search": "", "hash": "#i" }, { "input": "#i", "base": "sc://ho/pa", "href": "sc://ho/pa#i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "ho", "hostname": "ho", "port": "", "pathname": "/pa", "search": "", "hash": "#i" }, { "input": "#i", "base": "sc:///pa/pa", "href": "sc:///pa/pa#i", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/pa/pa", "search": "", "hash": "#i" }, "# make sure that relative URL logic works on known typically non-relative schemes too", { "input": "about:/../", "base": null, "href": "about:/", "origin": "null", "protocol": "about:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "data:/../", "base": null, "href": "data:/", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "javascript:/../", "base": null, "href": "javascript:/", "origin": "null", "protocol": "javascript:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "mailto:/../", "base": null, "href": "mailto:/", "origin": "null", "protocol": "mailto:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, "# unknown schemes and their hosts", { "input": "sc://Γ±.test/", "base": null, "href": "sc://%C3%B1.test/", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "%C3%B1.test", "hostname": "%C3%B1.test", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "sc://%/", "base": null, "href": "sc://%/", "protocol": "sc:", "username": "", "password": "", "host": "%", "hostname": "%", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "sc://@/", "base": null, "failure": true }, { "input": "sc://te@s:t@/", "base": null, "failure": true }, { "input": "sc://:/", "base": null, "failure": true }, { "input": "sc://:12/", "base": null, "failure": true }, { "input": "x", "base": "sc://Γ±", "href": "sc://%C3%B1/x", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "%C3%B1", "hostname": "%C3%B1", "port": "", "pathname": "/x", "search": "", "hash": "" }, "# unknown schemes and backslashes", { "input": "sc:\\../", "base": null, "href": "sc:\\../", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "\\../", "search": "", "hash": "" }, "# unknown scheme with path looking like a password", { "input": "sc::a@example.net", "base": null, "href": "sc::a@example.net", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": ":a@example.net", "search": "", "hash": "" }, "# unknown scheme with bogus percent-encoding", { "input": "wow:%NBD", "base": null, "href": "wow:%NBD", "origin": "null", "protocol": "wow:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "%NBD", "search": "", "hash": "" }, { "input": "wow:%1G", "base": null, "href": "wow:%1G", "origin": "null", "protocol": "wow:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "%1G", "search": "", "hash": "" }, "# unknown scheme with non-URL characters", { "input": "wow:\uFFFF", "base": null, "href": "wow:%EF%BF%BF", "origin": "null", "protocol": "wow:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "%EF%BF%BF", "search": "", "hash": "" }, { "input": "http://example.com/\uD800\uD801\uDFFE\uDFFF\uFDD0\uFDCF\uFDEF\uFDF0\uFFFE\uFFFF?\uD800\uD801\uDFFE\uDFFF\uFDD0\uFDCF\uFDEF\uFDF0\uFFFE\uFFFF", "base": null, "href": "http://example.com/%EF%BF%BD%F0%90%9F%BE%EF%BF%BD%EF%B7%90%EF%B7%8F%EF%B7%AF%EF%B7%B0%EF%BF%BE%EF%BF%BF?%EF%BF%BD%F0%90%9F%BE%EF%BF%BD%EF%B7%90%EF%B7%8F%EF%B7%AF%EF%B7%B0%EF%BF%BE%EF%BF%BF", "origin": "http://example.com", "protocol": "http:", "username": "", "password": "", "host": "example.com", "hostname": "example.com", "port": "", "pathname": "/%EF%BF%BD%F0%90%9F%BE%EF%BF%BD%EF%B7%90%EF%B7%8F%EF%B7%AF%EF%B7%B0%EF%BF%BE%EF%BF%BF", "search": "?%EF%BF%BD%F0%90%9F%BE%EF%BF%BD%EF%B7%90%EF%B7%8F%EF%B7%AF%EF%B7%B0%EF%BF%BE%EF%BF%BF", "hash": "" }, "Forbidden host code points", { "input": "sc://a\u0000b/", "base": null, "failure": true }, { "input": "sc://a b/", "base": null, "failure": true }, { "input": "sc://ab", "base": null, "failure": true }, { "input": "sc://a[b/", "base": null, "failure": true }, { "input": "sc://a\\b/", "base": null, "failure": true }, { "input": "sc://a]b/", "base": null, "failure": true }, { "input": "sc://a^b", "base": null, "failure": true }, { "input": "sc://a|b/", "base": null, "failure": true }, "Forbidden host codepoints: tabs and newlines are removed during preprocessing", { "input": "foo://ho\u0009st/", "base": null, "hash": "", "host": "host", "hostname": "host", "href":"foo://host/", "password": "", "pathname": "/", "port":"", "protocol": "foo:", "search": "", "username": "" }, { "input": "foo://ho\u000Ast/", "base": null, "hash": "", "host": "host", "hostname": "host", "href":"foo://host/", "password": "", "pathname": "/", "port":"", "protocol": "foo:", "search": "", "username": "" }, { "input": "foo://ho\u000Dst/", "base": null, "hash": "", "host": "host", "hostname": "host", "href":"foo://host/", "password": "", "pathname": "/", "port":"", "protocol": "foo:", "search": "", "username": "" }, "Forbidden domain code-points", { "input": "http://a\u0000b/", "base": null, "failure": true }, { "input": "http://a\u0001b/", "base": null, "failure": true }, { "input": "http://a\u0002b/", "base": null, "failure": true }, { "input": "http://a\u0003b/", "base": null, "failure": true }, { "input": "http://a\u0004b/", "base": null, "failure": true }, { "input": "http://a\u0005b/", "base": null, "failure": true }, { "input": "http://a\u0006b/", "base": null, "failure": true }, { "input": "http://a\u0007b/", "base": null, "failure": true }, { "input": "http://a\u0008b/", "base": null, "failure": true }, { "input": "http://a\u000Bb/", "base": null, "failure": true }, { "input": "http://a\u000Cb/", "base": null, "failure": true }, { "input": "http://a\u000Eb/", "base": null, "failure": true }, { "input": "http://a\u000Fb/", "base": null, "failure": true }, { "input": "http://a\u0010b/", "base": null, "failure": true }, { "input": "http://a\u0011b/", "base": null, "failure": true }, { "input": "http://a\u0012b/", "base": null, "failure": true }, { "input": "http://a\u0013b/", "base": null, "failure": true }, { "input": "http://a\u0014b/", "base": null, "failure": true }, { "input": "http://a\u0015b/", "base": null, "failure": true }, { "input": "http://a\u0016b/", "base": null, "failure": true }, { "input": "http://a\u0017b/", "base": null, "failure": true }, { "input": "http://a\u0018b/", "base": null, "failure": true }, { "input": "http://a\u0019b/", "base": null, "failure": true }, { "input": "http://a\u001Ab/", "base": null, "failure": true }, { "input": "http://a\u001Bb/", "base": null, "failure": true }, { "input": "http://a\u001Cb/", "base": null, "failure": true }, { "input": "http://a\u001Db/", "base": null, "failure": true }, { "input": "http://a\u001Eb/", "base": null, "failure": true }, { "input": "http://a\u001Fb/", "base": null, "failure": true }, { "input": "http://a b/", "base": null, "failure": true }, { "input": "http://a%b/", "base": null, "failure": true }, { "input": "http://ab", "base": null, "failure": true }, { "input": "http://a[b/", "base": null, "failure": true }, { "input": "http://a]b/", "base": null, "failure": true }, { "input": "http://a^b", "base": null, "failure": true }, { "input": "http://a|b/", "base": null, "failure": true }, { "input": "http://a\u007Fb/", "base": null, "failure": true }, "Forbidden domain codepoints: tabs and newlines are removed during preprocessing", { "input": "http://ho\u0009st/", "base": null, "hash": "", "host": "host", "hostname": "host", "href":"http://host/", "password": "", "pathname": "/", "port":"", "protocol": "http:", "search": "", "username": "" }, { "input": "http://ho\u000Ast/", "base": null, "hash": "", "host": "host", "hostname": "host", "href":"http://host/", "password": "", "pathname": "/", "port":"", "protocol": "http:", "search": "", "username": "" }, { "input": "http://ho\u000Dst/", "base": null, "hash": "", "host": "host", "hostname": "host", "href":"http://host/", "password": "", "pathname": "/", "port":"", "protocol": "http:", "search": "", "username": "" }, "Encoded forbidden domain codepoints in special URLs", { "input": "http://ho%00st/", "base": null, "failure": true }, { "input": "http://ho%01st/", "base": null, "failure": true }, { "input": "http://ho%02st/", "base": null, "failure": true }, { "input": "http://ho%03st/", "base": null, "failure": true }, { "input": "http://ho%04st/", "base": null, "failure": true }, { "input": "http://ho%05st/", "base": null, "failure": true }, { "input": "http://ho%06st/", "base": null, "failure": true }, { "input": "http://ho%07st/", "base": null, "failure": true }, { "input": "http://ho%08st/", "base": null, "failure": true }, { "input": "http://ho%09st/", "base": null, "failure": true }, { "input": "http://ho%0Ast/", "base": null, "failure": true }, { "input": "http://ho%0Bst/", "base": null, "failure": true }, { "input": "http://ho%0Cst/", "base": null, "failure": true }, { "input": "http://ho%0Dst/", "base": null, "failure": true }, { "input": "http://ho%0Est/", "base": null, "failure": true }, { "input": "http://ho%0Fst/", "base": null, "failure": true }, { "input": "http://ho%10st/", "base": null, "failure": true }, { "input": "http://ho%11st/", "base": null, "failure": true }, { "input": "http://ho%12st/", "base": null, "failure": true }, { "input": "http://ho%13st/", "base": null, "failure": true }, { "input": "http://ho%14st/", "base": null, "failure": true }, { "input": "http://ho%15st/", "base": null, "failure": true }, { "input": "http://ho%16st/", "base": null, "failure": true }, { "input": "http://ho%17st/", "base": null, "failure": true }, { "input": "http://ho%18st/", "base": null, "failure": true }, { "input": "http://ho%19st/", "base": null, "failure": true }, { "input": "http://ho%1Ast/", "base": null, "failure": true }, { "input": "http://ho%1Bst/", "base": null, "failure": true }, { "input": "http://ho%1Cst/", "base": null, "failure": true }, { "input": "http://ho%1Dst/", "base": null, "failure": true }, { "input": "http://ho%1Est/", "base": null, "failure": true }, { "input": "http://ho%1Fst/", "base": null, "failure": true }, { "input": "http://ho%20st/", "base": null, "failure": true }, { "input": "http://ho%23st/", "base": null, "failure": true }, { "input": "http://ho%25st/", "base": null, "failure": true }, { "input": "http://ho%2Fst/", "base": null, "failure": true }, { "input": "http://ho%3Ast/", "base": null, "failure": true }, { "input": "http://ho%3Cst/", "base": null, "failure": true }, { "input": "http://ho%3Est/", "base": null, "failure": true }, { "input": "http://ho%3Fst/", "base": null, "failure": true }, { "input": "http://ho%40st/", "base": null, "failure": true }, { "input": "http://ho%5Bst/", "base": null, "failure": true }, { "input": "http://ho%5Cst/", "base": null, "failure": true }, { "input": "http://ho%5Dst/", "base": null, "failure": true }, { "input": "http://ho%7Cst/", "base": null, "failure": true }, { "input": "http://ho%7Fst/", "base": null, "failure": true }, "Allowed host/domain code points", { "input": "http://!\"$&'()*+,-.;=_`{}~/", "base": null, "href": "http://!\"$&'()*+,-.;=_`{}~/", "origin": "http://!\"$&'()*+,-.;=_`{}~", "protocol": "http:", "username": "", "password": "", "host": "!\"$&'()*+,-.;=_`{}~", "hostname": "!\"$&'()*+,-.;=_`{}~", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "sc://\u0001\u0002\u0003\u0004\u0005\u0006\u0007\u0008\u000B\u000C\u000E\u000F\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001A\u001B\u001C\u001D\u001E\u001F\u007F!\"$%&'()*+,-.;=_`{}~/", "base": null, "href": "sc://%01%02%03%04%05%06%07%08%0B%0C%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%7F!\"$%&'()*+,-.;=_`{}~/", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "%01%02%03%04%05%06%07%08%0B%0C%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%7F!\"$%&'()*+,-.;=_`{}~", "hostname": "%01%02%03%04%05%06%07%08%0B%0C%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F%7F!\"$%&'()*+,-.;=_`{}~", "port": "", "pathname": "/", "search": "", "hash": "" }, "# Hosts and percent-encoding", { "input": "ftp://example.com%80/", "base": null, "failure": true }, { "input": "ftp://example.com%A0/", "base": null, "failure": true }, { "input": "https://example.com%80/", "base": null, "failure": true }, { "input": "https://example.com%A0/", "base": null, "failure": true }, { "input": "ftp://%e2%98%83", "base": null, "href": "ftp://xn--n3h/", "origin": "ftp://xn--n3h", "protocol": "ftp:", "username": "", "password": "", "host": "xn--n3h", "hostname": "xn--n3h", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "https://%e2%98%83", "base": null, "href": "https://xn--n3h/", "origin": "https://xn--n3h", "protocol": "https:", "username": "", "password": "", "host": "xn--n3h", "hostname": "xn--n3h", "port": "", "pathname": "/", "search": "", "hash": "" }, "# tests from jsdom/whatwg-url designed for code coverage", { "input": "http://127.0.0.1:10100/relative_import.html", "base": null, "href": "http://127.0.0.1:10100/relative_import.html", "origin": "http://127.0.0.1:10100", "protocol": "http:", "username": "", "password": "", "host": "127.0.0.1:10100", "hostname": "127.0.0.1", "port": "10100", "pathname": "/relative_import.html", "search": "", "hash": "" }, { "input": "http://facebook.com/?foo=%7B%22abc%22", "base": null, "href": "http://facebook.com/?foo=%7B%22abc%22", "origin": "http://facebook.com", "protocol": "http:", "username": "", "password": "", "host": "facebook.com", "hostname": "facebook.com", "port": "", "pathname": "/", "search": "?foo=%7B%22abc%22", "hash": "" }, { "input": "https://localhost:3000/jqueryui@1.2.3", "base": null, "href": "https://localhost:3000/jqueryui@1.2.3", "origin": "https://localhost:3000", "protocol": "https:", "username": "", "password": "", "host": "localhost:3000", "hostname": "localhost", "port": "3000", "pathname": "/jqueryui@1.2.3", "search": "", "hash": "" }, "# tab/LF/CR", { "input": "h\tt\nt\rp://h\to\ns\rt:9\t0\n0\r0/p\ta\nt\rh?q\tu\ne\rry#f\tr\na\rg", "base": null, "href": "http://host:9000/path?query#frag", "origin": "http://host:9000", "protocol": "http:", "username": "", "password": "", "host": "host:9000", "hostname": "host", "port": "9000", "pathname": "/path", "search": "?query", "hash": "#frag" }, "# Stringification of URL.searchParams", { "input": "?a=b&c=d", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar?a=b&c=d", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "?a=b&c=d", "searchParams": "a=b&c=d", "hash": "" }, { "input": "??a=b&c=d", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar??a=b&c=d", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "??a=b&c=d", "searchParams": "%3Fa=b&c=d", "hash": "" }, "# Scheme only", { "input": "http:", "base": "http://example.org/foo/bar", "href": "http://example.org/foo/bar", "origin": "http://example.org", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/foo/bar", "search": "", "searchParams": "", "hash": "" }, { "input": "http:", "base": "https://example.org/foo/bar", "failure": true }, { "input": "sc:", "base": "https://example.org/foo/bar", "href": "sc:", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "", "search": "", "searchParams": "", "hash": "" }, "# Percent encoding of fragments", { "input": "http://foo.bar/baz?qux#foo\bbar", "base": null, "href": "http://foo.bar/baz?qux#foo%08bar", "origin": "http://foo.bar", "protocol": "http:", "username": "", "password": "", "host": "foo.bar", "hostname": "foo.bar", "port": "", "pathname": "/baz", "search": "?qux", "searchParams": "qux=", "hash": "#foo%08bar" }, { "input": "http://foo.bar/baz?qux#foo\"bar", "base": null, "href": "http://foo.bar/baz?qux#foo%22bar", "origin": "http://foo.bar", "protocol": "http:", "username": "", "password": "", "host": "foo.bar", "hostname": "foo.bar", "port": "", "pathname": "/baz", "search": "?qux", "searchParams": "qux=", "hash": "#foo%22bar" }, { "input": "http://foo.bar/baz?qux#foobar", "base": null, "href": "http://foo.bar/baz?qux#foo%3Ebar", "origin": "http://foo.bar", "protocol": "http:", "username": "", "password": "", "host": "foo.bar", "hostname": "foo.bar", "port": "", "pathname": "/baz", "search": "?qux", "searchParams": "qux=", "hash": "#foo%3Ebar" }, { "input": "http://foo.bar/baz?qux#foo`bar", "base": null, "href": "http://foo.bar/baz?qux#foo%60bar", "origin": "http://foo.bar", "protocol": "http:", "username": "", "password": "", "host": "foo.bar", "hostname": "foo.bar", "port": "", "pathname": "/baz", "search": "?qux", "searchParams": "qux=", "hash": "#foo%60bar" }, "# IPv4 parsing (via https://github.com/nodejs/node/pull/10317)", { "input": "http://1.2.3.4/", "base": "http://other.com/", "href": "http://1.2.3.4/", "origin": "http://1.2.3.4", "protocol": "http:", "username": "", "password": "", "host": "1.2.3.4", "hostname": "1.2.3.4", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://1.2.3.4./", "base": "http://other.com/", "href": "http://1.2.3.4/", "origin": "http://1.2.3.4", "protocol": "http:", "username": "", "password": "", "host": "1.2.3.4", "hostname": "1.2.3.4", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://192.168.257", "base": "http://other.com/", "href": "http://192.168.1.1/", "origin": "http://192.168.1.1", "protocol": "http:", "username": "", "password": "", "host": "192.168.1.1", "hostname": "192.168.1.1", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://192.168.257.", "base": "http://other.com/", "href": "http://192.168.1.1/", "origin": "http://192.168.1.1", "protocol": "http:", "username": "", "password": "", "host": "192.168.1.1", "hostname": "192.168.1.1", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://192.168.257.com", "base": "http://other.com/", "href": "http://192.168.257.com/", "origin": "http://192.168.257.com", "protocol": "http:", "username": "", "password": "", "host": "192.168.257.com", "hostname": "192.168.257.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://256", "base": "http://other.com/", "href": "http://0.0.1.0/", "origin": "http://0.0.1.0", "protocol": "http:", "username": "", "password": "", "host": "0.0.1.0", "hostname": "0.0.1.0", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://256.com", "base": "http://other.com/", "href": "http://256.com/", "origin": "http://256.com", "protocol": "http:", "username": "", "password": "", "host": "256.com", "hostname": "256.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://999999999", "base": "http://other.com/", "href": "http://59.154.201.255/", "origin": "http://59.154.201.255", "protocol": "http:", "username": "", "password": "", "host": "59.154.201.255", "hostname": "59.154.201.255", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://999999999.", "base": "http://other.com/", "href": "http://59.154.201.255/", "origin": "http://59.154.201.255", "protocol": "http:", "username": "", "password": "", "host": "59.154.201.255", "hostname": "59.154.201.255", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://999999999.com", "base": "http://other.com/", "href": "http://999999999.com/", "origin": "http://999999999.com", "protocol": "http:", "username": "", "password": "", "host": "999999999.com", "hostname": "999999999.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://10000000000", "base": "http://other.com/", "failure": true }, { "input": "http://10000000000.com", "base": "http://other.com/", "href": "http://10000000000.com/", "origin": "http://10000000000.com", "protocol": "http:", "username": "", "password": "", "host": "10000000000.com", "hostname": "10000000000.com", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://4294967295", "base": "http://other.com/", "href": "http://255.255.255.255/", "origin": "http://255.255.255.255", "protocol": "http:", "username": "", "password": "", "host": "255.255.255.255", "hostname": "255.255.255.255", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://4294967296", "base": "http://other.com/", "failure": true }, { "input": "http://0xffffffff", "base": "http://other.com/", "href": "http://255.255.255.255/", "origin": "http://255.255.255.255", "protocol": "http:", "username": "", "password": "", "host": "255.255.255.255", "hostname": "255.255.255.255", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://0xffffffff1", "base": "http://other.com/", "failure": true }, { "input": "http://256.256.256.256", "base": "http://other.com/", "failure": true }, { "input": "https://0x.0x.0", "base": null, "href": "https://0.0.0.0/", "origin": "https://0.0.0.0", "protocol": "https:", "username": "", "password": "", "host": "0.0.0.0", "hostname": "0.0.0.0", "port": "", "pathname": "/", "search": "", "hash": "" }, "More IPv4 parsing (via https://github.com/jsdom/whatwg-url/issues/92)", { "input": "https://0x100000000/test", "base": null, "failure": true }, { "input": "https://256.0.0.1/test", "base": null, "failure": true }, "# file URLs containing percent-encoded Windows drive letters (shouldn't work)", { "input": "file:///C%3A/", "base": null, "href": "file:///C%3A/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C%3A/", "search": "", "hash": "" }, { "input": "file:///C%7C/", "base": null, "href": "file:///C%7C/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C%7C/", "search": "", "hash": "" }, { "input": "file://%43%3A", "base": null, "failure": true }, { "input": "file://%43%7C", "base": null, "failure": true }, { "input": "file://%43|", "base": null, "failure": true }, { "input": "file://C%7C", "base": null, "failure": true }, { "input": "file://%43%7C/", "base": null, "failure": true }, { "input": "https://%43%7C/", "base": null, "failure": true }, { "input": "asdf://%43|/", "base": null, "failure": true }, { "input": "asdf://%43%7C/", "base": null, "href": "asdf://%43%7C/", "origin": "null", "protocol": "asdf:", "username": "", "password": "", "host": "%43%7C", "hostname": "%43%7C", "port": "", "pathname": "/", "search": "", "hash": "" }, "# file URLs relative to other file URLs (via https://github.com/jsdom/whatwg-url/pull/60)", { "input": "pix/submit.gif", "base": "file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html", "href": "file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/pix/submit.gif", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/pix/submit.gif", "search": "", "hash": "" }, { "input": "..", "base": "file:///C:/", "href": "file:///C:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "..", "base": "file:///", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, "# More file URL tests by zcorpan and annevk", { "input": "/", "base": "file:///C:/a/b", "href": "file:///C:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "/", "base": "file://h/C:/a/b", "href": "file://h/C:/", "protocol": "file:", "username": "", "password": "", "host": "h", "hostname": "h", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "/", "base": "file://h/a/b", "href": "file://h/", "protocol": "file:", "username": "", "password": "", "host": "h", "hostname": "h", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "//d:", "base": "file:///C:/a/b", "href": "file:///d:", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/d:", "search": "", "hash": "" }, { "input": "//d:/..", "base": "file:///C:/a/b", "href": "file:///d:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/d:/", "search": "", "hash": "" }, { "input": "..", "base": "file:///ab:/", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "..", "base": "file:///1:/", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "", "base": "file:///test?test#test", "href": "file:///test?test", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "?test", "hash": "" }, { "input": "file:", "base": "file:///test?test#test", "href": "file:///test?test", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "?test", "hash": "" }, { "input": "?x", "base": "file:///test?test#test", "href": "file:///test?x", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "?x", "hash": "" }, { "input": "file:?x", "base": "file:///test?test#test", "href": "file:///test?x", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "?x", "hash": "" }, { "input": "#x", "base": "file:///test?test#test", "href": "file:///test?test#x", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "?test", "hash": "#x" }, { "input": "file:#x", "base": "file:///test?test#test", "href": "file:///test?test#x", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "?test", "hash": "#x" }, "# File URLs and many (back)slashes", { "input": "file:\\\\//", "base": null, "href": "file:////", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//", "search": "", "hash": "" }, { "input": "file:\\\\\\\\", "base": null, "href": "file:////", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//", "search": "", "hash": "" }, { "input": "file:\\\\\\\\?fox", "base": null, "href": "file:////?fox", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//", "search": "?fox", "hash": "" }, { "input": "file:\\\\\\\\#guppy", "base": null, "href": "file:////#guppy", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//", "search": "", "hash": "#guppy" }, { "input": "file://spider///", "base": null, "href": "file://spider///", "protocol": "file:", "username": "", "password": "", "host": "spider", "hostname": "spider", "port": "", "pathname": "///", "search": "", "hash": "" }, { "input": "file:\\\\localhost//", "base": null, "href": "file:////", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//", "search": "", "hash": "" }, { "input": "file:///localhost//cat", "base": null, "href": "file:///localhost//cat", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/localhost//cat", "search": "", "hash": "" }, { "input": "file://\\/localhost//cat", "base": null, "href": "file:////localhost//cat", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//localhost//cat", "search": "", "hash": "" }, { "input": "file://localhost//a//../..//", "base": null, "href": "file://///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "///", "search": "", "hash": "" }, { "input": "/////mouse", "base": "file:///elephant", "href": "file://///mouse", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "///mouse", "search": "", "hash": "" }, { "input": "\\//pig", "base": "file://lion/", "href": "file:///pig", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/pig", "search": "", "hash": "" }, { "input": "\\/localhost//pig", "base": "file://lion/", "href": "file:////pig", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//pig", "search": "", "hash": "" }, { "input": "//localhost//pig", "base": "file://lion/", "href": "file:////pig", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//pig", "search": "", "hash": "" }, { "input": "/..//localhost//pig", "base": "file://lion/", "href": "file://lion//localhost//pig", "protocol": "file:", "username": "", "password": "", "host": "lion", "hostname": "lion", "port": "", "pathname": "//localhost//pig", "search": "", "hash": "" }, { "input": "file://", "base": "file://ape/", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, "# File URLs with non-empty hosts", { "input": "/rooibos", "base": "file://tea/", "href": "file://tea/rooibos", "protocol": "file:", "username": "", "password": "", "host": "tea", "hostname": "tea", "port": "", "pathname": "/rooibos", "search": "", "hash": "" }, { "input": "/?chai", "base": "file://tea/", "href": "file://tea/?chai", "protocol": "file:", "username": "", "password": "", "host": "tea", "hostname": "tea", "port": "", "pathname": "/", "search": "?chai", "hash": "" }, "# Windows drive letter handling with the 'file:' base URL", { "input": "C|", "base": "file://host/dir/file", "href": "file://host/C:", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:", "search": "", "hash": "" }, { "input": "C|", "base": "file://host/D:/dir1/dir2/file", "href": "file://host/C:", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:", "search": "", "hash": "" }, { "input": "C|#", "base": "file://host/dir/file", "href": "file://host/C:#", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:", "search": "", "hash": "" }, { "input": "C|?", "base": "file://host/dir/file", "href": "file://host/C:?", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:", "search": "", "hash": "" }, { "input": "C|/", "base": "file://host/dir/file", "href": "file://host/C:/", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "C|\n/", "base": "file://host/dir/file", "href": "file://host/C:/", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "C|\\", "base": "file://host/dir/file", "href": "file://host/C:/", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "C", "base": "file://host/dir/file", "href": "file://host/dir/C", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/dir/C", "search": "", "hash": "" }, { "input": "C|a", "base": "file://host/dir/file", "href": "file://host/dir/C|a", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/dir/C|a", "search": "", "hash": "" }, "# Windows drive letter quirk in the file slash state", { "input": "/c:/foo/bar", "base": "file:///c:/baz/qux", "href": "file:///c:/foo/bar", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/c:/foo/bar", "search": "", "hash": "" }, { "input": "/c|/foo/bar", "base": "file:///c:/baz/qux", "href": "file:///c:/foo/bar", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/c:/foo/bar", "search": "", "hash": "" }, { "input": "file:\\c:\\foo\\bar", "base": "file:///c:/baz/qux", "href": "file:///c:/foo/bar", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/c:/foo/bar", "search": "", "hash": "" }, { "input": "/c:/foo/bar", "base": "file://host/path", "href": "file://host/c:/foo/bar", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/c:/foo/bar", "search": "", "hash": "" }, "# Do not drop the host in the presence of a drive letter", { "input": "file://example.net/C:/", "base": null, "href": "file://example.net/C:/", "protocol": "file:", "username": "", "password": "", "host": "example.net", "hostname": "example.net", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "file://1.2.3.4/C:/", "base": null, "href": "file://1.2.3.4/C:/", "protocol": "file:", "username": "", "password": "", "host": "1.2.3.4", "hostname": "1.2.3.4", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "file://[1::8]/C:/", "base": null, "href": "file://[1::8]/C:/", "protocol": "file:", "username": "", "password": "", "host": "[1::8]", "hostname": "[1::8]", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, "# Copy the host from the base URL in the following cases", { "input": "C|/", "base": "file://host/", "href": "file://host/C:/", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "/C:/", "base": "file://host/", "href": "file://host/C:/", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "file:C:/", "base": "file://host/", "href": "file://host/C:/", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "file:/C:/", "base": "file://host/", "href": "file://host/C:/", "protocol": "file:", "username": "", "password": "", "host": "host", "hostname": "host", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, "# Copy the empty host from the input in the following cases", { "input": "//C:/", "base": "file://host/", "href": "file:///C:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "file://C:/", "base": "file://host/", "href": "file:///C:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "///C:/", "base": "file://host/", "href": "file:///C:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "file:///C:/", "base": "file://host/", "href": "file:///C:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, "# Windows drive letter quirk (no host)", { "input": "file:/C|/", "base": null, "href": "file:///C:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, { "input": "file://C|/", "base": null, "href": "file:///C:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/C:/", "search": "", "hash": "" }, "# file URLs without base URL by Rimas Misevičius", { "input": "file:", "base": null, "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "file:?q=v", "base": null, "href": "file:///?q=v", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "?q=v", "hash": "" }, { "input": "file:#frag", "base": null, "href": "file:///#frag", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "#frag" }, "# file: drive letter cases from https://crbug.com/1078698", { "input": "file:///Y:", "base": null, "href": "file:///Y:", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/Y:", "search": "", "hash": "" }, { "input": "file:///Y:/", "base": null, "href": "file:///Y:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/Y:/", "search": "", "hash": "" }, { "input": "file:///./Y", "base": null, "href": "file:///Y", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/Y", "search": "", "hash": "" }, { "input": "file:///./Y:", "base": null, "href": "file:///Y:", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/Y:", "search": "", "hash": "" }, { "input": "\\\\\\.\\Y:", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, "# file: drive letter cases from https://crbug.com/1078698 but lowercased", { "input": "file:///y:", "base": null, "href": "file:///y:", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/y:", "search": "", "hash": "" }, { "input": "file:///y:/", "base": null, "href": "file:///y:/", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/y:/", "search": "", "hash": "" }, { "input": "file:///./y", "base": null, "href": "file:///y", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/y", "search": "", "hash": "" }, { "input": "file:///./y:", "base": null, "href": "file:///y:", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/y:", "search": "", "hash": "" }, { "input": "\\\\\\.\\y:", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, "# Additional file URL tests for (https://github.com/whatwg/url/issues/405)", { "input": "file://localhost//a//../..//foo", "base": null, "href": "file://///foo", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "///foo", "search": "", "hash": "" }, { "input": "file://localhost////foo", "base": null, "href": "file://////foo", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "////foo", "search": "", "hash": "" }, { "input": "file:////foo", "base": null, "href": "file:////foo", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//foo", "search": "", "hash": "" }, { "input": "file:///one/two", "base": "file:///", "href": "file:///one/two", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/one/two", "search": "", "hash": "" }, { "input": "file:////one/two", "base": "file:///", "href": "file:////one/two", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//one/two", "search": "", "hash": "" }, { "input": "//one/two", "base": "file:///", "href": "file://one/two", "protocol": "file:", "username": "", "password": "", "host": "one", "hostname": "one", "port": "", "pathname": "/two", "search": "", "hash": "" }, { "input": "///one/two", "base": "file:///", "href": "file:///one/two", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/one/two", "search": "", "hash": "" }, { "input": "////one/two", "base": "file:///", "href": "file:////one/two", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//one/two", "search": "", "hash": "" }, { "input": "file:///.//", "base": "file:////", "href": "file:////", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//", "search": "", "hash": "" }, "File URL tests for https://github.com/whatwg/url/issues/549", { "input": "file:.//p", "base": null, "href": "file:////p", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//p", "search": "", "hash": "" }, { "input": "file:/.//p", "base": null, "href": "file:////p", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//p", "search": "", "hash": "" }, "# IPv6 tests", { "input": "http://[1:0::]", "base": "http://example.net/", "href": "http://[1::]/", "origin": "http://[1::]", "protocol": "http:", "username": "", "password": "", "host": "[1::]", "hostname": "[1::]", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://[0:1:2:3:4:5:6:7:8]", "base": "http://example.net/", "failure": true }, { "input": "https://[0::0::0]", "base": null, "failure": true }, { "input": "https://[0:.0]", "base": null, "failure": true }, { "input": "https://[0:0:]", "base": null, "failure": true }, { "input": "https://[0:1:2:3:4:5:6:7.0.0.0.1]", "base": null, "failure": true }, { "input": "https://[0:1.00.0.0.0]", "base": null, "failure": true }, { "input": "https://[0:1.290.0.0.0]", "base": null, "failure": true }, { "input": "https://[0:1.23.23]", "base": null, "failure": true }, "# Empty host", { "input": "http://?", "base": null, "failure": true }, { "input": "http://#", "base": null, "failure": true }, "Port overflow (2^32 + 81)", { "input": "http://f:4294967377/c", "base": "http://example.org/", "failure": true }, "Port overflow (2^64 + 81)", { "input": "http://f:18446744073709551697/c", "base": "http://example.org/", "failure": true }, "Port overflow (2^128 + 81)", { "input": "http://f:340282366920938463463374607431768211537/c", "base": "http://example.org/", "failure": true }, "# Non-special-URL path tests", { "input": "sc://Γ±", "base": null, "href": "sc://%C3%B1", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "%C3%B1", "hostname": "%C3%B1", "port": "", "pathname": "", "search": "", "hash": "" }, { "input": "sc://Γ±?x", "base": null, "href": "sc://%C3%B1?x", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "%C3%B1", "hostname": "%C3%B1", "port": "", "pathname": "", "search": "?x", "hash": "" }, { "input": "sc://Γ±#x", "base": null, "href": "sc://%C3%B1#x", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "%C3%B1", "hostname": "%C3%B1", "port": "", "pathname": "", "search": "", "hash": "#x" }, { "input": "#x", "base": "sc://Γ±", "href": "sc://%C3%B1#x", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "%C3%B1", "hostname": "%C3%B1", "port": "", "pathname": "", "search": "", "hash": "#x" }, { "input": "?x", "base": "sc://Γ±", "href": "sc://%C3%B1?x", "origin": "null", "protocol": "sc:", "username": "", "password": "", "host": "%C3%B1", "hostname": "%C3%B1", "port": "", "pathname": "", "search": "?x", "hash": "" }, { "input": "sc://?", "base": null, "href": "sc://?", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "", "search": "", "hash": "" }, { "input": "sc://#", "base": null, "href": "sc://#", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "", "search": "", "hash": "" }, { "input": "///", "base": "sc://x/", "href": "sc:///", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "////", "base": "sc://x/", "href": "sc:////", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//", "search": "", "hash": "" }, { "input": "////x/", "base": "sc://x/", "href": "sc:////x/", "protocol": "sc:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//x/", "search": "", "hash": "" }, { "input": "tftp://foobar.com/someconfig;mode=netascii", "base": null, "href": "tftp://foobar.com/someconfig;mode=netascii", "origin": "null", "protocol": "tftp:", "username": "", "password": "", "host": "foobar.com", "hostname": "foobar.com", "port": "", "pathname": "/someconfig;mode=netascii", "search": "", "hash": "" }, { "input": "telnet://user:pass@foobar.com:23/", "base": null, "href": "telnet://user:pass@foobar.com:23/", "origin": "null", "protocol": "telnet:", "username": "user", "password": "pass", "host": "foobar.com:23", "hostname": "foobar.com", "port": "23", "pathname": "/", "search": "", "hash": "" }, { "input": "ut2004://10.10.10.10:7777/Index.ut2", "base": null, "href": "ut2004://10.10.10.10:7777/Index.ut2", "origin": "null", "protocol": "ut2004:", "username": "", "password": "", "host": "10.10.10.10:7777", "hostname": "10.10.10.10", "port": "7777", "pathname": "/Index.ut2", "search": "", "hash": "" }, { "input": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz", "base": null, "href": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz", "origin": "null", "protocol": "redis:", "username": "foo", "password": "bar", "host": "somehost:6379", "hostname": "somehost", "port": "6379", "pathname": "/0", "search": "?baz=bam&qux=baz", "hash": "" }, { "input": "rsync://foo@host:911/sup", "base": null, "href": "rsync://foo@host:911/sup", "origin": "null", "protocol": "rsync:", "username": "foo", "password": "", "host": "host:911", "hostname": "host", "port": "911", "pathname": "/sup", "search": "", "hash": "" }, { "input": "git://github.com/foo/bar.git", "base": null, "href": "git://github.com/foo/bar.git", "origin": "null", "protocol": "git:", "username": "", "password": "", "host": "github.com", "hostname": "github.com", "port": "", "pathname": "/foo/bar.git", "search": "", "hash": "" }, { "input": "irc://myserver.com:6999/channel?passwd", "base": null, "href": "irc://myserver.com:6999/channel?passwd", "origin": "null", "protocol": "irc:", "username": "", "password": "", "host": "myserver.com:6999", "hostname": "myserver.com", "port": "6999", "pathname": "/channel", "search": "?passwd", "hash": "" }, { "input": "dns://fw.example.org:9999/foo.bar.org?type=TXT", "base": null, "href": "dns://fw.example.org:9999/foo.bar.org?type=TXT", "origin": "null", "protocol": "dns:", "username": "", "password": "", "host": "fw.example.org:9999", "hostname": "fw.example.org", "port": "9999", "pathname": "/foo.bar.org", "search": "?type=TXT", "hash": "" }, { "input": "ldap://localhost:389/ou=People,o=JNDITutorial", "base": null, "href": "ldap://localhost:389/ou=People,o=JNDITutorial", "origin": "null", "protocol": "ldap:", "username": "", "password": "", "host": "localhost:389", "hostname": "localhost", "port": "389", "pathname": "/ou=People,o=JNDITutorial", "search": "", "hash": "" }, { "input": "git+https://github.com/foo/bar", "base": null, "href": "git+https://github.com/foo/bar", "origin": "null", "protocol": "git+https:", "username": "", "password": "", "host": "github.com", "hostname": "github.com", "port": "", "pathname": "/foo/bar", "search": "", "hash": "" }, { "input": "urn:ietf:rfc:2648", "base": null, "href": "urn:ietf:rfc:2648", "origin": "null", "protocol": "urn:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "ietf:rfc:2648", "search": "", "hash": "" }, { "input": "tag:joe@example.org,2001:foo/bar", "base": null, "href": "tag:joe@example.org,2001:foo/bar", "origin": "null", "protocol": "tag:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "joe@example.org,2001:foo/bar", "search": "", "hash": "" }, "Serialize /. in path", { "input": "non-spec:/.//", "base": null, "href": "non-spec:/.//", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//", "search": "", "hash": "" }, { "input": "non-spec:/..//", "base": null, "href": "non-spec:/.//", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//", "search": "", "hash": "" }, { "input": "non-spec:/a/..//", "base": null, "href": "non-spec:/.//", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//", "search": "", "hash": "" }, { "input": "non-spec:/.//path", "base": null, "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//path", "search": "", "hash": "" }, { "input": "non-spec:/..//path", "base": null, "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//path", "search": "", "hash": "" }, { "input": "non-spec:/a/..//path", "base": null, "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//path", "search": "", "hash": "" }, { "input": "/.//path", "base": "non-spec:/p", "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//path", "search": "", "hash": "" }, { "input": "/..//path", "base": "non-spec:/p", "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//path", "search": "", "hash": "" }, { "input": "..//path", "base": "non-spec:/p", "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//path", "search": "", "hash": "" }, { "input": "a/..//path", "base": "non-spec:/p", "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//path", "search": "", "hash": "" }, { "input": "", "base": "non-spec:/..//p", "href": "non-spec:/.//p", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//p", "search": "", "hash": "" }, { "input": "path", "base": "non-spec:/..//p", "href": "non-spec:/.//path", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "//path", "search": "", "hash": "" }, "Do not serialize /. in path", { "input": "../path", "base": "non-spec:/.//p", "href": "non-spec:/path", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/path", "search": "", "hash": "" }, "# percent encoded hosts in non-special-URLs", { "input": "non-special://%E2%80%A0/", "base": null, "href": "non-special://%E2%80%A0/", "protocol": "non-special:", "username": "", "password": "", "host": "%E2%80%A0", "hostname": "%E2%80%A0", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "non-special://H%4fSt/path", "base": null, "href": "non-special://H%4fSt/path", "protocol": "non-special:", "username": "", "password": "", "host": "H%4fSt", "hostname": "H%4fSt", "port": "", "pathname": "/path", "search": "", "hash": "" }, "# IPv6 in non-special-URLs", { "input": "non-special://[1:2:0:0:5:0:0:0]/", "base": null, "href": "non-special://[1:2:0:0:5::]/", "protocol": "non-special:", "username": "", "password": "", "host": "[1:2:0:0:5::]", "hostname": "[1:2:0:0:5::]", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "non-special://[1:2:0:0:0:0:0:3]/", "base": null, "href": "non-special://[1:2::3]/", "protocol": "non-special:", "username": "", "password": "", "host": "[1:2::3]", "hostname": "[1:2::3]", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "non-special://[1:2::3]:80/", "base": null, "href": "non-special://[1:2::3]:80/", "protocol": "non-special:", "username": "", "password": "", "host": "[1:2::3]:80", "hostname": "[1:2::3]", "port": "80", "pathname": "/", "search": "", "hash": "" }, { "input": "non-special://[:80/", "base": null, "failure": true }, { "input": "blob:https://example.com:443/", "base": null, "href": "blob:https://example.com:443/", "origin": "https://example.com", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "https://example.com:443/", "search": "", "hash": "" }, { "input": "blob:http://example.org:88/", "base": null, "href": "blob:http://example.org:88/", "origin": "http://example.org:88", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "http://example.org:88/", "search": "", "hash": "" }, { "input": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf", "base": null, "href": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf", "origin": "null", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "d3958f5c-0777-0845-9dcf-2cb28783acaf", "search": "", "hash": "" }, { "input": "blob:", "base": null, "href": "blob:", "origin": "null", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "", "search": "", "hash": "" }, "blob: in blob:", { "input": "blob:blob:", "base": null, "href": "blob:blob:", "origin": "null", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "blob:", "search": "", "hash": "" }, { "input": "blob:blob:https://example.org/", "base": null, "href": "blob:blob:https://example.org/", "origin": "null", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "blob:https://example.org/", "search": "", "hash": "" }, "Non-http(s): in blob:", { "input": "blob:about:blank", "base": null, "href": "blob:about:blank", "origin": "null", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "about:blank", "search": "", "hash": "" }, { "input": "blob:file://host/path", "base": null, "href": "blob:file://host/path", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "file://host/path", "search": "", "hash": "" }, { "input": "blob:ftp://host/path", "base": null, "href": "blob:ftp://host/path", "origin": "null", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "ftp://host/path", "search": "", "hash": "" }, { "input": "blob:ws://example.org/", "base": null, "href": "blob:ws://example.org/", "origin": "null", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "ws://example.org/", "search": "", "hash": "" }, { "input": "blob:wss://example.org/", "base": null, "href": "blob:wss://example.org/", "origin": "null", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "wss://example.org/", "search": "", "hash": "" }, "Percent-encoded http: in blob:", { "input": "blob:http%3a//example.org/", "base": null, "href": "blob:http%3a//example.org/", "origin": "null", "protocol": "blob:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "http%3a//example.org/", "search": "", "hash": "" }, "Invalid IPv4 radix digits", { "input": "http://0x7f.0.0.0x7g", "base": null, "href": "http://0x7f.0.0.0x7g/", "protocol": "http:", "username": "", "password": "", "host": "0x7f.0.0.0x7g", "hostname": "0x7f.0.0.0x7g", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://0X7F.0.0.0X7G", "base": null, "href": "http://0x7f.0.0.0x7g/", "protocol": "http:", "username": "", "password": "", "host": "0x7f.0.0.0x7g", "hostname": "0x7f.0.0.0x7g", "port": "", "pathname": "/", "search": "", "hash": "" }, "Invalid IPv4 portion of IPv6 address", { "input": "http://[::127.0.0.0.1]", "base": null, "failure": true }, "Uncompressed IPv6 addresses with 0", { "input": "http://[0:1:0:1:0:1:0:1]", "base": null, "href": "http://[0:1:0:1:0:1:0:1]/", "protocol": "http:", "username": "", "password": "", "host": "[0:1:0:1:0:1:0:1]", "hostname": "[0:1:0:1:0:1:0:1]", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "http://[1:0:1:0:1:0:1:0]", "base": null, "href": "http://[1:0:1:0:1:0:1:0]/", "protocol": "http:", "username": "", "password": "", "host": "[1:0:1:0:1:0:1:0]", "hostname": "[1:0:1:0:1:0:1:0]", "port": "", "pathname": "/", "search": "", "hash": "" }, "Percent-encoded query and fragment", { "input": "http://example.org/test?\u0022", "base": null, "href": "http://example.org/test?%22", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "?%22", "hash": "" }, { "input": "http://example.org/test?\u0023", "base": null, "href": "http://example.org/test?#", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "", "hash": "" }, { "input": "http://example.org/test?\u003C", "base": null, "href": "http://example.org/test?%3C", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "?%3C", "hash": "" }, { "input": "http://example.org/test?\u003E", "base": null, "href": "http://example.org/test?%3E", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "?%3E", "hash": "" }, { "input": "http://example.org/test?\u2323", "base": null, "href": "http://example.org/test?%E2%8C%A3", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "?%E2%8C%A3", "hash": "" }, { "input": "http://example.org/test?%23%23", "base": null, "href": "http://example.org/test?%23%23", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "?%23%23", "hash": "" }, { "input": "http://example.org/test?%GH", "base": null, "href": "http://example.org/test?%GH", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "?%GH", "hash": "" }, { "input": "http://example.org/test?a#%EF", "base": null, "href": "http://example.org/test?a#%EF", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "?a", "hash": "#%EF" }, { "input": "http://example.org/test?a#%GH", "base": null, "href": "http://example.org/test?a#%GH", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "?a", "hash": "#%GH" }, "URLs that require a non-about:blank base. (Also serve as invalid base tests.)", { "input": "a", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "a/", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "a//", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, "Bases that don't fail to parse but fail to be bases", { "input": "test-a-colon.html", "base": "a:", "failure": true }, { "input": "test-a-colon-b.html", "base": "a:b", "failure": true }, "Other base URL tests, that must succeed", { "input": "test-a-colon-slash.html", "base": "a:/", "href": "a:/test-a-colon-slash.html", "protocol": "a:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test-a-colon-slash.html", "search": "", "hash": "" }, { "input": "test-a-colon-slash-slash.html", "base": "a://", "href": "a:///test-a-colon-slash-slash.html", "protocol": "a:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test-a-colon-slash-slash.html", "search": "", "hash": "" }, { "input": "test-a-colon-slash-b.html", "base": "a:/b", "href": "a:/test-a-colon-slash-b.html", "protocol": "a:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test-a-colon-slash-b.html", "search": "", "hash": "" }, { "input": "test-a-colon-slash-slash-b.html", "base": "a://b", "href": "a://b/test-a-colon-slash-slash-b.html", "protocol": "a:", "username": "", "password": "", "host": "b", "hostname": "b", "port": "", "pathname": "/test-a-colon-slash-slash-b.html", "search": "", "hash": "" }, "Null code point in fragment", { "input": "http://example.org/test?a#b\u0000c", "base": null, "href": "http://example.org/test?a#b%00c", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "?a", "hash": "#b%00c" }, { "input": "non-spec://example.org/test?a#b\u0000c", "base": null, "href": "non-spec://example.org/test?a#b%00c", "protocol": "non-spec:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/test", "search": "?a", "hash": "#b%00c" }, { "input": "non-spec:/test?a#b\u0000c", "base": null, "href": "non-spec:/test?a#b%00c", "protocol": "non-spec:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "?a", "hash": "#b%00c" }, "First scheme char - not allowed: https://github.com/whatwg/url/issues/464", { "input": "10.0.0.7:8080/foo.html", "base": "file:///some/dir/bar.html", "href": "file:///some/dir/10.0.0.7:8080/foo.html", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/some/dir/10.0.0.7:8080/foo.html", "search": "", "hash": "" }, "Subsequent scheme chars - not allowed", { "input": "a!@$*=/foo.html", "base": "file:///some/dir/bar.html", "href": "file:///some/dir/a!@$*=/foo.html", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/some/dir/a!@$*=/foo.html", "search": "", "hash": "" }, "First and subsequent scheme chars - allowed", { "input": "a1234567890-+.:foo/bar", "base": "http://example.com/dir/file", "href": "a1234567890-+.:foo/bar", "protocol": "a1234567890-+.:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "foo/bar", "search": "", "hash": "" }, "IDNA ignored code points in file URLs hosts", { "input": "file://a\u00ADb/p", "base": null, "href": "file://ab/p", "protocol": "file:", "username": "", "password": "", "host": "ab", "hostname": "ab", "port": "", "pathname": "/p", "search": "", "hash": "" }, { "input": "file://a%C2%ADb/p", "base": null, "href": "file://ab/p", "protocol": "file:", "username": "", "password": "", "host": "ab", "hostname": "ab", "port": "", "pathname": "/p", "search": "", "hash": "" }, "IDNA hostnames which get mapped to 'localhost'", { "input": "file://loC𝐀𝐋𝐇𝐨𝐬𝐭/usr/bin", "base": null, "href": "file:///usr/bin", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/usr/bin", "search": "", "hash": "" }, "Empty host after the domain to ASCII", { "input": "file://\u00ad/p", "base": null, "failure": true }, { "input": "file://%C2%AD/p", "base": null, "failure": true }, { "input": "file://xn--/p", "base": null, "failure": true }, "https://bugzilla.mozilla.org/show_bug.cgi?id=1647058", { "input": "#link", "base": "https://example.org/##link", "href": "https://example.org/#link", "protocol": "https:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/", "search": "", "hash": "#link" }, "UTF-8 percent-encode of C0 control percent-encode set and supersets", { "input": "non-special:cannot-be-a-base-url-\u0000\u0001\u001F\u001E\u007E\u007F\u0080", "base": null, "hash": "", "host": "", "hostname": "", "href": "non-special:cannot-be-a-base-url-%00%01%1F%1E~%7F%C2%80", "origin": "null", "password": "", "pathname": "cannot-be-a-base-url-%00%01%1F%1E~%7F%C2%80", "port": "", "protocol": "non-special:", "search": "", "username": "" }, { "input": "https://www.example.com/path{\u007Fpath.html?query'\u007F=query#fragment<\u007Ffragment", "base": null, "hash": "#fragment%3C%7Ffragment", "host": "www.example.com", "hostname": "www.example.com", "href": "https://www.example.com/path%7B%7Fpath.html?query%27%7F=query#fragment%3C%7Ffragment", "origin": "https://www.example.com", "password": "", "pathname": "/path%7B%7Fpath.html", "port": "", "protocol": "https:", "search": "?query%27%7F=query", "username": "" }, { "input": "https://user:pass[\u007F@foo/bar", "base": "http://example.org", "hash": "", "host": "foo", "hostname": "foo", "href": "https://user:pass%5B%7F@foo/bar", "origin": "https://foo", "password": "pass%5B%7F", "pathname": "/bar", "port": "", "protocol": "https:", "search": "", "username": "user" }, "Tests for the distinct percent-encode sets", { "input": "foo:// !\"$%&'()*+,-.;<=>@[\\]^_`{|}~@host/", "base": null, "hash": "", "host": "host", "hostname": "host", "href": "foo://%20!%22$%&'()*+,-.%3B%3C%3D%3E%40%5B%5C%5D%5E_%60%7B%7C%7D~@host/", "origin": "null", "password": "", "pathname": "/", "port":"", "protocol": "foo:", "search": "", "username": "%20!%22$%&'()*+,-.%3B%3C%3D%3E%40%5B%5C%5D%5E_%60%7B%7C%7D~" }, { "input": "wss:// !\"$%&'()*+,-.;<=>@[]^_`{|}~@host/", "base": null, "hash": "", "host": "host", "hostname": "host", "href": "wss://%20!%22$%&'()*+,-.%3B%3C%3D%3E%40%5B%5D%5E_%60%7B%7C%7D~@host/", "origin": "wss://host", "password": "", "pathname": "/", "port":"", "protocol": "wss:", "search": "", "username": "%20!%22$%&'()*+,-.%3B%3C%3D%3E%40%5B%5D%5E_%60%7B%7C%7D~" }, { "input": "foo://joe: !\"$%&'()*+,-.:;<=>@[\\]^_`{|}~@host/", "base": null, "hash": "", "host": "host", "hostname": "host", "href": "foo://joe:%20!%22$%&'()*+,-.%3A%3B%3C%3D%3E%40%5B%5C%5D%5E_%60%7B%7C%7D~@host/", "origin": "null", "password": "%20!%22$%&'()*+,-.%3A%3B%3C%3D%3E%40%5B%5C%5D%5E_%60%7B%7C%7D~", "pathname": "/", "port":"", "protocol": "foo:", "search": "", "username": "joe" }, { "input": "wss://joe: !\"$%&'()*+,-.:;<=>@[]^_`{|}~@host/", "base": null, "hash": "", "host": "host", "hostname": "host", "href": "wss://joe:%20!%22$%&'()*+,-.%3A%3B%3C%3D%3E%40%5B%5D%5E_%60%7B%7C%7D~@host/", "origin": "wss://host", "password": "%20!%22$%&'()*+,-.%3A%3B%3C%3D%3E%40%5B%5D%5E_%60%7B%7C%7D~", "pathname": "/", "port":"", "protocol": "wss:", "search": "", "username": "joe" }, { "input": "foo://!\"$%&'()*+,-.;=_`{}~/", "base": null, "hash": "", "host": "!\"$%&'()*+,-.;=_`{}~", "hostname": "!\"$%&'()*+,-.;=_`{}~", "href":"foo://!\"$%&'()*+,-.;=_`{}~/", "origin": "null", "password": "", "pathname": "/", "port":"", "protocol": "foo:", "search": "", "username": "" }, { "input": "wss://!\"$&'()*+,-.;=_`{}~/", "base": null, "hash": "", "host": "!\"$&'()*+,-.;=_`{}~", "hostname": "!\"$&'()*+,-.;=_`{}~", "href":"wss://!\"$&'()*+,-.;=_`{}~/", "origin": "wss://!\"$&'()*+,-.;=_`{}~", "password": "", "pathname": "/", "port":"", "protocol": "wss:", "search": "", "username": "" }, { "input": "foo://host/ !\"$%&'()*+,-./:;<=>@[\\]^_`{|}~", "base": null, "hash": "", "host": "host", "hostname": "host", "href": "foo://host/%20!%22$%&'()*+,-./:;%3C=%3E@[\\]^_%60%7B|%7D~", "origin": "null", "password": "", "pathname": "/%20!%22$%&'()*+,-./:;%3C=%3E@[\\]^_%60%7B|%7D~", "port":"", "protocol": "foo:", "search": "", "username": "" }, { "input": "wss://host/ !\"$%&'()*+,-./:;<=>@[\\]^_`{|}~", "base": null, "hash": "", "host": "host", "hostname": "host", "href": "wss://host/%20!%22$%&'()*+,-./:;%3C=%3E@[/]^_%60%7B|%7D~", "origin": "wss://host", "password": "", "pathname": "/%20!%22$%&'()*+,-./:;%3C=%3E@[/]^_%60%7B|%7D~", "port":"", "protocol": "wss:", "search": "", "username": "" }, { "input": "foo://host/dir/? !\"$%&'()*+,-./:;<=>?@[\\]^_`{|}~", "base": null, "hash": "", "host": "host", "hostname": "host", "href": "foo://host/dir/?%20!%22$%&'()*+,-./:;%3C=%3E?@[\\]^_`{|}~", "origin": "null", "password": "", "pathname": "/dir/", "port":"", "protocol": "foo:", "search": "?%20!%22$%&'()*+,-./:;%3C=%3E?@[\\]^_`{|}~", "username": "" }, { "input": "wss://host/dir/? !\"$%&'()*+,-./:;<=>?@[\\]^_`{|}~", "base": null, "hash": "", "host": "host", "hostname": "host", "href": "wss://host/dir/?%20!%22$%&%27()*+,-./:;%3C=%3E?@[\\]^_`{|}~", "origin": "wss://host", "password": "", "pathname": "/dir/", "port":"", "protocol": "wss:", "search": "?%20!%22$%&%27()*+,-./:;%3C=%3E?@[\\]^_`{|}~", "username": "" }, { "input": "foo://host/dir/# !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", "base": null, "hash": "#%20!%22#$%&'()*+,-./:;%3C=%3E?@[\\]^_%60{|}~", "host": "host", "hostname": "host", "href": "foo://host/dir/#%20!%22#$%&'()*+,-./:;%3C=%3E?@[\\]^_%60{|}~", "origin": "null", "password": "", "pathname": "/dir/", "port":"", "protocol": "foo:", "search": "", "username": "" }, { "input": "wss://host/dir/# !\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", "base": null, "hash": "#%20!%22#$%&'()*+,-./:;%3C=%3E?@[\\]^_%60{|}~", "host": "host", "hostname": "host", "href": "wss://host/dir/#%20!%22#$%&'()*+,-./:;%3C=%3E?@[\\]^_%60{|}~", "origin": "wss://host", "password": "", "pathname": "/dir/", "port":"", "protocol": "wss:", "search": "", "username": "" }, "Ensure that input schemes are not ignored when resolving non-special URLs", { "input": "abc:rootless", "base": "abc://host/path", "hash": "", "host": "", "hostname": "", "href":"abc:rootless", "password": "", "pathname": "rootless", "port":"", "protocol": "abc:", "search": "", "username": "" }, { "input": "abc:rootless", "base": "abc:/path", "hash": "", "host": "", "hostname": "", "href":"abc:rootless", "password": "", "pathname": "rootless", "port":"", "protocol": "abc:", "search": "", "username": "" }, { "input": "abc:rootless", "base": "abc:path", "hash": "", "host": "", "hostname": "", "href":"abc:rootless", "password": "", "pathname": "rootless", "port":"", "protocol": "abc:", "search": "", "username": "" }, { "input": "abc:/rooted", "base": "abc://host/path", "hash": "", "host": "", "hostname": "", "href":"abc:/rooted", "password": "", "pathname": "/rooted", "port":"", "protocol": "abc:", "search": "", "username": "" }, "Empty query and fragment with blank should throw an error", { "input": "#", "base": null, "failure": true, "relativeTo": "any-base" }, { "input": "?", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, "Last component looks like a number, but not valid IPv4", { "input": "http://1.2.3.4.5", "base": "http://other.com/", "failure": true }, { "input": "http://1.2.3.4.5.", "base": "http://other.com/", "failure": true }, { "input": "http://0..0x300/", "base": null, "failure": true }, { "input": "http://0..0x300./", "base": null, "failure": true }, { "input": "http://256.256.256.256.256", "base": "http://other.com/", "failure": true }, { "input": "http://256.256.256.256.256.", "base": "http://other.com/", "failure": true }, { "input": "http://1.2.3.08", "base": null, "failure": true }, { "input": "http://1.2.3.08.", "base": null, "failure": true }, { "input": "http://1.2.3.09", "base": null, "failure": true }, { "input": "http://09.2.3.4", "base": null, "failure": true }, { "input": "http://09.2.3.4.", "base": null, "failure": true }, { "input": "http://01.2.3.4.5", "base": null, "failure": true }, { "input": "http://01.2.3.4.5.", "base": null, "failure": true }, { "input": "http://0x100.2.3.4", "base": null, "failure": true }, { "input": "http://0x100.2.3.4.", "base": null, "failure": true }, { "input": "http://0x1.2.3.4.5", "base": null, "failure": true }, { "input": "http://0x1.2.3.4.5.", "base": null, "failure": true }, { "input": "http://foo.1.2.3.4", "base": null, "failure": true }, { "input": "http://foo.1.2.3.4.", "base": null, "failure": true }, { "input": "http://foo.2.3.4", "base": null, "failure": true }, { "input": "http://foo.2.3.4.", "base": null, "failure": true }, { "input": "http://foo.09", "base": null, "failure": true }, { "input": "http://foo.09.", "base": null, "failure": true }, { "input": "http://foo.0x4", "base": null, "failure": true }, { "input": "http://foo.0x4.", "base": null, "failure": true }, { "input": "http://foo.09..", "base": null, "hash": "", "host": "foo.09..", "hostname": "foo.09..", "href":"http://foo.09../", "password": "", "pathname": "/", "port":"", "protocol": "http:", "search": "", "username": "" }, { "input": "http://0999999999999999999/", "base": null, "failure": true }, { "input": "http://foo.0x", "base": null, "failure": true }, { "input": "http://foo.0XFfFfFfFfFfFfFfFfFfAcE123", "base": null, "failure": true }, { "input": "http://πŸ’©.123/", "base": null, "failure": true }, "U+0000 and U+FFFF in various places", { "input": "https://\u0000y", "base": null, "failure": true }, { "input": "https://x/\u0000y", "base": null, "hash": "", "host": "x", "hostname": "x", "href": "https://x/%00y", "password": "", "pathname": "/%00y", "port": "", "protocol": "https:", "search": "", "username": "" }, { "input": "https://x/?\u0000y", "base": null, "hash": "", "host": "x", "hostname": "x", "href": "https://x/?%00y", "password": "", "pathname": "/", "port": "", "protocol": "https:", "search": "?%00y", "username": "" }, { "input": "https://x/?#\u0000y", "base": null, "hash": "#%00y", "host": "x", "hostname": "x", "href": "https://x/?#%00y", "password": "", "pathname": "/", "port": "", "protocol": "https:", "search": "", "username": "" }, { "input": "https://\uFFFFy", "base": null, "failure": true }, { "input": "https://x/\uFFFFy", "base": null, "hash": "", "host": "x", "hostname": "x", "href": "https://x/%EF%BF%BFy", "password": "", "pathname": "/%EF%BF%BFy", "port": "", "protocol": "https:", "search": "", "username": "" }, { "input": "https://x/?\uFFFFy", "base": null, "hash": "", "host": "x", "hostname": "x", "href": "https://x/?%EF%BF%BFy", "password": "", "pathname": "/", "port": "", "protocol": "https:", "search": "?%EF%BF%BFy", "username": "" }, { "input": "https://x/?#\uFFFFy", "base": null, "hash": "#%EF%BF%BFy", "host": "x", "hostname": "x", "href": "https://x/?#%EF%BF%BFy", "password": "", "pathname": "/", "port": "", "protocol": "https:", "search": "", "username": "" }, { "input": "non-special:\u0000y", "base": null, "hash": "", "host": "", "hostname": "", "href": "non-special:%00y", "password": "", "pathname": "%00y", "port": "", "protocol": "non-special:", "search": "", "username": "" }, { "input": "non-special:x/\u0000y", "base": null, "hash": "", "host": "", "hostname": "", "href": "non-special:x/%00y", "password": "", "pathname": "x/%00y", "port": "", "protocol": "non-special:", "search": "", "username": "" }, { "input": "non-special:x/?\u0000y", "base": null, "hash": "", "host": "", "hostname": "", "href": "non-special:x/?%00y", "password": "", "pathname": "x/", "port": "", "protocol": "non-special:", "search": "?%00y", "username": "" }, { "input": "non-special:x/?#\u0000y", "base": null, "hash": "#%00y", "host": "", "hostname": "", "href": "non-special:x/?#%00y", "password": "", "pathname": "x/", "port": "", "protocol": "non-special:", "search": "", "username": "" }, { "input": "non-special:\uFFFFy", "base": null, "hash": "", "host": "", "hostname": "", "href": "non-special:%EF%BF%BFy", "password": "", "pathname": "%EF%BF%BFy", "port": "", "protocol": "non-special:", "search": "", "username": "" }, { "input": "non-special:x/\uFFFFy", "base": null, "hash": "", "host": "", "hostname": "", "href": "non-special:x/%EF%BF%BFy", "password": "", "pathname": "x/%EF%BF%BFy", "port": "", "protocol": "non-special:", "search": "", "username": "" }, { "input": "non-special:x/?\uFFFFy", "base": null, "hash": "", "host": "", "hostname": "", "href": "non-special:x/?%EF%BF%BFy", "password": "", "pathname": "x/", "port": "", "protocol": "non-special:", "search": "?%EF%BF%BFy", "username": "" }, { "input": "non-special:x/?#\uFFFFy", "base": null, "hash": "#%EF%BF%BFy", "host": "", "hostname": "", "href": "non-special:x/?#%EF%BF%BFy", "password": "", "pathname": "x/", "port": "", "protocol": "non-special:", "search": "", "username": "" }, { "input": "", "base": null, "failure": true, "relativeTo": "non-opaque-path-base" }, { "input": "https://example.com/\"quoted\"", "base": null, "hash": "", "host": "example.com", "hostname": "example.com", "href": "https://example.com/%22quoted%22", "origin": "https://example.com", "password": "", "pathname": "/%22quoted%22", "port": "", "protocol": "https:", "search": "", "username": "" }, { "input": "https://a%C2%ADb/", "base": null, "hash": "", "host": "ab", "hostname": "ab", "href": "https://ab/", "origin": "https://ab", "password": "", "pathname": "/", "port": "", "protocol": "https:", "search": "", "username": "" }, { "comment": "Empty host after domain to ASCII", "input": "https://\u00AD/", "base": null, "failure": true }, { "input": "https://%C2%AD/", "base": null, "failure": true }, { "input": "https://xn--/", "base": null, "failure": true }, "Non-special schemes that some implementations might incorrectly treat as special", { "input": "data://example.com:8080/pathname?search#hash", "base": null, "href": "data://example.com:8080/pathname?search#hash", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "example.com:8080", "hostname": "example.com", "port": "8080", "pathname": "/pathname", "search": "?search", "hash": "#hash" }, { "input": "data:///test", "base": null, "href": "data:///test", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "", "hash": "" }, { "input": "data://test/a/../b", "base": null, "href": "data://test/b", "origin": "null", "protocol": "data:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/b", "search": "", "hash": "" }, { "input": "data://:443", "base": null, "failure": true }, { "input": "data://test:test", "base": null, "failure": true }, { "input": "data://[:1]", "base": null, "failure": true }, { "input": "javascript://example.com:8080/pathname?search#hash", "base": null, "href": "javascript://example.com:8080/pathname?search#hash", "origin": "null", "protocol": "javascript:", "username": "", "password": "", "host": "example.com:8080", "hostname": "example.com", "port": "8080", "pathname": "/pathname", "search": "?search", "hash": "#hash" }, { "input": "javascript:///test", "base": null, "href": "javascript:///test", "origin": "null", "protocol": "javascript:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "", "hash": "" }, { "input": "javascript://test/a/../b", "base": null, "href": "javascript://test/b", "origin": "null", "protocol": "javascript:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/b", "search": "", "hash": "" }, { "input": "javascript://:443", "base": null, "failure": true }, { "input": "javascript://test:test", "base": null, "failure": true }, { "input": "javascript://[:1]", "base": null, "failure": true }, { "input": "mailto://example.com:8080/pathname?search#hash", "base": null, "href": "mailto://example.com:8080/pathname?search#hash", "origin": "null", "protocol": "mailto:", "username": "", "password": "", "host": "example.com:8080", "hostname": "example.com", "port": "8080", "pathname": "/pathname", "search": "?search", "hash": "#hash" }, { "input": "mailto:///test", "base": null, "href": "mailto:///test", "origin": "null", "protocol": "mailto:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "", "hash": "" }, { "input": "mailto://test/a/../b", "base": null, "href": "mailto://test/b", "origin": "null", "protocol": "mailto:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/b", "search": "", "hash": "" }, { "input": "mailto://:443", "base": null, "failure": true }, { "input": "mailto://test:test", "base": null, "failure": true }, { "input": "mailto://[:1]", "base": null, "failure": true }, { "input": "intent://example.com:8080/pathname?search#hash", "base": null, "href": "intent://example.com:8080/pathname?search#hash", "origin": "null", "protocol": "intent:", "username": "", "password": "", "host": "example.com:8080", "hostname": "example.com", "port": "8080", "pathname": "/pathname", "search": "?search", "hash": "#hash" }, { "input": "intent:///test", "base": null, "href": "intent:///test", "origin": "null", "protocol": "intent:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "", "hash": "" }, { "input": "intent://test/a/../b", "base": null, "href": "intent://test/b", "origin": "null", "protocol": "intent:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/b", "search": "", "hash": "" }, { "input": "intent://:443", "base": null, "failure": true }, { "input": "intent://test:test", "base": null, "failure": true }, { "input": "intent://[:1]", "base": null, "failure": true }, { "input": "urn://example.com:8080/pathname?search#hash", "base": null, "href": "urn://example.com:8080/pathname?search#hash", "origin": "null", "protocol": "urn:", "username": "", "password": "", "host": "example.com:8080", "hostname": "example.com", "port": "8080", "pathname": "/pathname", "search": "?search", "hash": "#hash" }, { "input": "urn:///test", "base": null, "href": "urn:///test", "origin": "null", "protocol": "urn:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "", "hash": "" }, { "input": "urn://test/a/../b", "base": null, "href": "urn://test/b", "origin": "null", "protocol": "urn:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/b", "search": "", "hash": "" }, { "input": "urn://:443", "base": null, "failure": true }, { "input": "urn://test:test", "base": null, "failure": true }, { "input": "urn://[:1]", "base": null, "failure": true }, { "input": "turn://example.com:8080/pathname?search#hash", "base": null, "href": "turn://example.com:8080/pathname?search#hash", "origin": "null", "protocol": "turn:", "username": "", "password": "", "host": "example.com:8080", "hostname": "example.com", "port": "8080", "pathname": "/pathname", "search": "?search", "hash": "#hash" }, { "input": "turn:///test", "base": null, "href": "turn:///test", "origin": "null", "protocol": "turn:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "", "hash": "" }, { "input": "turn://test/a/../b", "base": null, "href": "turn://test/b", "origin": "null", "protocol": "turn:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/b", "search": "", "hash": "" }, { "input": "turn://:443", "base": null, "failure": true }, { "input": "turn://test:test", "base": null, "failure": true }, { "input": "turn://[:1]", "base": null, "failure": true }, { "input": "stun://example.com:8080/pathname?search#hash", "base": null, "href": "stun://example.com:8080/pathname?search#hash", "origin": "null", "protocol": "stun:", "username": "", "password": "", "host": "example.com:8080", "hostname": "example.com", "port": "8080", "pathname": "/pathname", "search": "?search", "hash": "#hash" }, { "input": "stun:///test", "base": null, "href": "stun:///test", "origin": "null", "protocol": "stun:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/test", "search": "", "hash": "" }, { "input": "stun://test/a/../b", "base": null, "href": "stun://test/b", "origin": "null", "protocol": "stun:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/b", "search": "", "hash": "" }, { "input": "stun://:443", "base": null, "failure": true }, { "input": "stun://test:test", "base": null, "failure": true }, { "input": "stun://[:1]", "base": null, "failure": true }, { "input": "w://x:0", "base": null, "href": "w://x:0", "origin": "null", "protocol": "w:", "username": "", "password": "", "host": "x:0", "hostname": "x", "port": "0", "pathname": "", "search": "", "hash": "" }, { "input": "west://x:0", "base": null, "href": "west://x:0", "origin": "null", "protocol": "west:", "username": "", "password": "", "host": "x:0", "hostname": "x", "port": "0", "pathname": "", "search": "", "hash": "" }, "Scheme relative path starting with multiple slashes", { "input": "///test", "base": "http://example.org/", "href": "http://test/", "protocol": "http:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "///\\//\\//test", "base": "http://example.org/", "href": "http://test/", "protocol": "http:", "username": "", "password": "", "host": "test", "hostname": "test", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "///example.org/path", "base": "http://example.org/", "href": "http://example.org/path", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/path", "search": "", "hash": "" }, { "input": "///example.org/../path", "base": "http://example.org/", "href": "http://example.org/path", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/path", "search": "", "hash": "" }, { "input": "///example.org/../../", "base": "http://example.org/", "href": "http://example.org/", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "///example.org/../path/../../", "base": "http://example.org/", "href": "http://example.org/", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "///example.org/../path/../../path", "base": "http://example.org/", "href": "http://example.org/path", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/path", "search": "", "hash": "" }, { "input": "/\\/\\//example.org/../path", "base": "http://example.org/", "href": "http://example.org/path", "protocol": "http:", "username": "", "password": "", "host": "example.org", "hostname": "example.org", "port": "", "pathname": "/path", "search": "", "hash": "" }, { "input": "///abcdef/../", "base": "file:///", "href": "file:///", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "/", "search": "", "hash": "" }, { "input": "/\\//\\/a/../", "base": "file:///", "href": "file://////", "protocol": "file:", "username": "", "password": "", "host": "", "hostname": "", "port": "", "pathname": "////", "search": "", "hash": "" }, { "input": "//a/../", "base": "file:///", "href": "file://a/", "protocol": "file:", "username": "", "password": "", "host": "a", "hostname": "a", "port": "", "pathname": "/", "search": "", "hash": "" } ] pydantic-httpx2-9b7ee8e/tests/httpx2/test_api.py000066400000000000000000000056741521723372100220620ustar00rootroot00000000000000from __future__ import annotations import typing import pytest import httpx2 if typing.TYPE_CHECKING: from conftest import TestServer def test_get(server: TestServer) -> None: response = httpx2.get(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.http_version == "HTTP/1.1" def test_post(server: TestServer) -> None: response = httpx2.post(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_post_byte_iterator(server: TestServer) -> None: def data() -> typing.Iterator[bytes]: yield b"Hello" yield b", " yield b"world!" response = httpx2.post(server.url, content=data()) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_post_byte_stream(server: TestServer) -> None: class Data(httpx2.SyncByteStream): def __iter__(self) -> typing.Iterator[bytes]: yield b"Hello" yield b", " yield b"world!" response = httpx2.post(server.url, content=Data()) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_options(server: TestServer) -> None: response = httpx2.options(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_head(server: TestServer) -> None: response = httpx2.head(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_put(server: TestServer) -> None: response = httpx2.put(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_patch(server: TestServer) -> None: response = httpx2.patch(server.url, content=b"Hello, world!") assert response.status_code == 200 assert response.reason_phrase == "OK" def test_delete(server: TestServer) -> None: response = httpx2.delete(server.url) assert response.status_code == 200 assert response.reason_phrase == "OK" def test_stream(server: TestServer) -> None: with httpx2.stream("GET", server.url) as response: response.read() assert response.status_code == 200 assert response.reason_phrase == "OK" assert response.text == "Hello, world!" assert response.http_version == "HTTP/1.1" def test_get_invalid_url() -> None: with pytest.raises(httpx2.UnsupportedProtocol): httpx2.get("invalid://example.org") # check that httpcore isn't imported until we do a request def test_httpcore_lazy_loading(server: TestServer) -> None: import sys # unload our module if it is already loaded if "httpx2" in sys.modules: del sys.modules["httpx2"] del sys.modules["httpcore2"] import httpx2 assert "httpcore2" not in sys.modules _response = httpx2.get(server.url) assert "httpcore2" in sys.modules pydantic-httpx2-9b7ee8e/tests/httpx2/test_asgi.py000066400000000000000000000202701521723372100222210ustar00rootroot00000000000000import json import typing import pytest import httpx2 Message = typing.MutableMapping[str, typing.Any] Receive = typing.Callable[[], typing.Awaitable[Message]] Send = typing.Callable[[typing.MutableMapping[str, typing.Any]], typing.Awaitable[None]] Scope = typing.MutableMapping[str, typing.Any] async def hello_world(scope: Scope, receive: Receive, send: Send) -> None: status = 200 output = b"Hello, World!" headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))] await send({"type": "http.response.start", "status": status, "headers": headers}) await send({"type": "http.response.body", "body": output}) async def echo_path(scope: Scope, receive: Receive, send: Send) -> None: status = 200 output = json.dumps({"path": scope["path"]}).encode("utf-8") headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))] await send({"type": "http.response.start", "status": status, "headers": headers}) await send({"type": "http.response.body", "body": output}) async def echo_raw_path(scope: Scope, receive: Receive, send: Send) -> None: status = 200 output = json.dumps({"raw_path": scope["raw_path"].decode("ascii")}).encode("utf-8") headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))] await send({"type": "http.response.start", "status": status, "headers": headers}) await send({"type": "http.response.body", "body": output}) async def echo_body(scope: Scope, receive: Receive, send: Send) -> None: status = 200 headers = [(b"content-type", "text/plain")] await send({"type": "http.response.start", "status": status, "headers": headers}) more_body = True while more_body: message = await receive() body = message.get("body", b"") more_body = message.get("more_body", False) await send({"type": "http.response.body", "body": body, "more_body": more_body}) async def echo_headers(scope: Scope, receive: Receive, send: Send) -> None: status = 200 output = json.dumps({"headers": [[k.decode(), v.decode()] for k, v in scope["headers"]]}).encode("utf-8") headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))] await send({"type": "http.response.start", "status": status, "headers": headers}) await send({"type": "http.response.body", "body": output}) async def raise_exc(scope: Scope, receive: Receive, send: Send) -> None: raise RuntimeError() async def raise_exc_after_response(scope: Scope, receive: Receive, send: Send) -> None: status = 200 output = b"Hello, World!" headers = [(b"content-type", "text/plain"), (b"content-length", str(len(output)))] await send({"type": "http.response.start", "status": status, "headers": headers}) await send({"type": "http.response.body", "body": output}) raise RuntimeError() @pytest.mark.anyio async def test_asgi_transport() -> None: async with httpx2.ASGITransport(app=hello_world) as transport: request = httpx2.Request("GET", "http://www.example.com/") response = await transport.handle_async_request(request) await response.aread() assert response.status_code == 200 assert response.content == b"Hello, World!" @pytest.mark.anyio async def test_asgi_transport_no_body() -> None: async with httpx2.ASGITransport(app=echo_body) as transport: request = httpx2.Request("GET", "http://www.example.com/") response = await transport.handle_async_request(request) await response.aread() assert response.status_code == 200 assert response.content == b"" @pytest.mark.anyio async def test_asgi() -> None: transport = httpx2.ASGITransport(app=hello_world) async with httpx2.AsyncClient(transport=transport) as client: response = await client.get("http://www.example.org/") assert response.status_code == 200 assert response.text == "Hello, World!" @pytest.mark.anyio async def test_asgi_urlencoded_path() -> None: transport = httpx2.ASGITransport(app=echo_path) async with httpx2.AsyncClient(transport=transport) as client: url = httpx2.URL("http://www.example.org/").copy_with(path="/user@example.org") response = await client.get(url) assert response.status_code == 200 assert response.json() == {"path": "/user@example.org"} @pytest.mark.anyio async def test_asgi_raw_path() -> None: transport = httpx2.ASGITransport(app=echo_raw_path) async with httpx2.AsyncClient(transport=transport) as client: url = httpx2.URL("http://www.example.org/").copy_with(path="/user@example.org") response = await client.get(url) assert response.status_code == 200 assert response.json() == {"raw_path": "/user@example.org"} @pytest.mark.anyio async def test_asgi_raw_path_should_not_include_querystring_portion() -> None: """ See https://github.com/encode/httpx/issues/2810 """ transport = httpx2.ASGITransport(app=echo_raw_path) async with httpx2.AsyncClient(transport=transport) as client: url = httpx2.URL("http://www.example.org/path?query") response = await client.get(url) assert response.status_code == 200 assert response.json() == {"raw_path": "/path"} @pytest.mark.anyio async def test_asgi_upload() -> None: transport = httpx2.ASGITransport(app=echo_body) async with httpx2.AsyncClient(transport=transport) as client: response = await client.post("http://www.example.org/", content=b"example") assert response.status_code == 200 assert response.text == "example" @pytest.mark.anyio async def test_asgi_headers() -> None: transport = httpx2.ASGITransport(app=echo_headers) async with httpx2.AsyncClient(transport=transport) as client: response = await client.get("http://www.example.org/") assert response.status_code == 200 assert response.json() == { "headers": [ ["host", "www.example.org"], ["accept", "*/*"], ["accept-encoding", "gzip, deflate, br, zstd"], ["connection", "keep-alive"], ["user-agent", f"python-httpx2/{httpx2.__version__}"], ] } @pytest.mark.anyio async def test_asgi_exc() -> None: transport = httpx2.ASGITransport(app=raise_exc) async with httpx2.AsyncClient(transport=transport) as client: with pytest.raises(RuntimeError): await client.get("http://www.example.org/") @pytest.mark.anyio async def test_asgi_exc_after_response() -> None: transport = httpx2.ASGITransport(app=raise_exc_after_response) async with httpx2.AsyncClient(transport=transport) as client: with pytest.raises(RuntimeError): await client.get("http://www.example.org/") @pytest.mark.anyio async def test_asgi_disconnect_after_response_complete() -> None: disconnect = False async def read_body(scope: Scope, receive: Receive, send: Send) -> None: nonlocal disconnect status = 200 headers = [(b"content-type", "text/plain")] await send({"type": "http.response.start", "status": status, "headers": headers}) more_body = True while more_body: message = await receive() more_body = message.get("more_body", False) await send({"type": "http.response.body", "body": b"", "more_body": False}) # The ASGI spec says of the Disconnect message: # "Sent to the application when a HTTP connection is closed or if receive is # called after a response has been sent." # So if receive() is called again, the disconnect message should be received message = await receive() disconnect = message.get("type") == "http.disconnect" transport = httpx2.ASGITransport(app=read_body) async with httpx2.AsyncClient(transport=transport) as client: response = await client.post("http://www.example.org/", content=b"example") assert response.status_code == 200 assert disconnect @pytest.mark.anyio async def test_asgi_exc_no_raise() -> None: transport = httpx2.ASGITransport(app=raise_exc, raise_app_exceptions=False) async with httpx2.AsyncClient(transport=transport) as client: response = await client.get("http://www.example.org/") assert response.status_code == 500 pydantic-httpx2-9b7ee8e/tests/httpx2/test_auth.py000066400000000000000000000271641521723372100222500ustar00rootroot00000000000000""" Unit tests for auth classes. Integration tests also exist in tests/client/test_auth.py """ from urllib.request import parse_keqv_list import pytest import httpx2 def test_basic_auth() -> None: auth = httpx2.BasicAuth(username="user", password="pass") request = httpx2.Request("GET", "https://www.example.com") # The initial request should include a basic auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert request.headers["Authorization"].startswith("Basic") # No other requests are made. response = httpx2.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def test_digest_auth_with_200() -> None: auth = httpx2.DigestAuth(username="user", password="pass") request = httpx2.Request("GET", "https://www.example.com") # The initial request should not include an auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers # If a 200 response is returned, then no other requests are made. response = httpx2.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def test_digest_auth_with_401() -> None: auth = httpx2.DigestAuth(username="user", password="pass") request = httpx2.Request("GET", "https://www.example.com") # The initial request should not include an auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers # If a 401 response is returned, then a digest auth request is made. headers = {"WWW-Authenticate": 'Digest realm="...", qop="auth", nonce="...", opaque="..."'} response = httpx2.Response(content=b"Auth required", status_code=401, headers=headers, request=request) request = flow.send(response) assert request.headers["Authorization"].startswith("Digest") # No other requests are made. response = httpx2.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def test_digest_auth_with_401_nonce_counting() -> None: auth = httpx2.DigestAuth(username="user", password="pass") request = httpx2.Request("GET", "https://www.example.com") # The initial request should not include an auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers # If a 401 response is returned, then a digest auth request is made. headers = {"WWW-Authenticate": 'Digest realm="...", qop="auth", nonce="...", opaque="..."'} response = httpx2.Response(content=b"Auth required", status_code=401, headers=headers, request=request) first_request = flow.send(response) assert first_request.headers["Authorization"].startswith("Digest") # Each subsequent request contains the digest header by default... request = httpx2.Request("GET", "https://www.example.com") flow = auth.sync_auth_flow(request) second_request = next(flow) assert second_request.headers["Authorization"].startswith("Digest") # ... and the client nonce count (nc) is increased first_nc = parse_keqv_list(first_request.headers["Authorization"].split(", "))["nc"] second_nc = parse_keqv_list(second_request.headers["Authorization"].split(", "))["nc"] assert int(first_nc, 16) + 1 == int(second_nc, 16) # No other requests are made. response = httpx2.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def set_cookies(request: httpx2.Request) -> httpx2.Response: headers = { "Set-Cookie": "session=.session_value...", "WWW-Authenticate": 'Digest realm="...", qop="auth", nonce="...", opaque="..."', } if request.url.path == "/auth": return httpx2.Response(content=b"Auth required", status_code=401, headers=headers) else: raise NotImplementedError() # pragma: no cover def test_digest_auth_setting_cookie_in_request() -> None: url = "https://www.example.com/auth" client = httpx2.Client(transport=httpx2.MockTransport(set_cookies)) request = client.build_request("GET", url) auth = httpx2.DigestAuth(username="user", password="pass") flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers response = client.get(url) assert len(response.cookies) > 0 assert response.cookies["session"] == ".session_value..." request = flow.send(response) assert request.headers["Authorization"].startswith("Digest") assert request.headers["Cookie"] == "session=.session_value..." # No other requests are made. response = httpx2.Response(content=b"Hello, world!", status_code=200, request=request) with pytest.raises(StopIteration): flow.send(response) def test_digest_auth_rfc_2069() -> None: # Example from https://datatracker.ietf.org/doc/html/rfc2069#section-2.4 # with corrected response from https://www.rfc-editor.org/errata/eid749 auth = httpx2.DigestAuth(username="Mufasa", password="CircleOfLife") request = httpx2.Request("GET", "https://www.example.com/dir/index.html") # The initial request should not include an auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers # If a 401 response is returned, then a digest auth request is made. headers = { "WWW-Authenticate": ( 'Digest realm="testrealm@host.com", ' 'nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093", ' 'opaque="5ccc069c403ebaf9f0171e9517f40e41"' ) } response = httpx2.Response(content=b"Auth required", status_code=401, headers=headers, request=request) request = flow.send(response) assert request.headers["Authorization"].startswith("Digest") assert 'username="Mufasa"' in request.headers["Authorization"] assert 'realm="testrealm@host.com"' in request.headers["Authorization"] assert 'nonce="dcd98b7102dd2f0e8b11d0f600bfb0c093"' in request.headers["Authorization"] assert 'uri="/dir/index.html"' in request.headers["Authorization"] assert 'opaque="5ccc069c403ebaf9f0171e9517f40e41"' in request.headers["Authorization"] assert 'response="1949323746fe6a43ef61f9606e7febea"' in request.headers["Authorization"] # No other requests are made. response = httpx2.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def test_digest_auth_rfc_7616_md5(monkeypatch: pytest.MonkeyPatch) -> None: # Example from https://datatracker.ietf.org/doc/html/rfc7616#section-3.9.1 def mock_get_client_nonce(nonce_count: int, nonce: bytes) -> bytes: return b"f2/wE4q74E6zIJEtWaHKaf5wv/H5QzzpXusqGemxURZJ" auth = httpx2.DigestAuth(username="Mufasa", password="Circle of Life") monkeypatch.setattr(auth, "_get_client_nonce", mock_get_client_nonce) request = httpx2.Request("GET", "https://www.example.com/dir/index.html") # The initial request should not include an auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers # If a 401 response is returned, then a digest auth request is made. headers = { "WWW-Authenticate": ( 'Digest realm="http-auth@example.org", ' 'qop="auth, auth-int", ' "algorithm=MD5, " 'nonce="7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v", ' 'opaque="FQhe/qaU925kfnzjCev0ciny7QMkPqMAFRtzCUYo5tdS"' ) } response = httpx2.Response(content=b"Auth required", status_code=401, headers=headers, request=request) request = flow.send(response) assert request.headers["Authorization"].startswith("Digest") assert 'username="Mufasa"' in request.headers["Authorization"] assert 'realm="http-auth@example.org"' in request.headers["Authorization"] assert 'uri="/dir/index.html"' in request.headers["Authorization"] assert "algorithm=MD5" in request.headers["Authorization"] assert 'nonce="7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v"' in request.headers["Authorization"] assert "nc=00000001" in request.headers["Authorization"] assert 'cnonce="f2/wE4q74E6zIJEtWaHKaf5wv/H5QzzpXusqGemxURZJ"' in request.headers["Authorization"] assert "qop=auth" in request.headers["Authorization"] assert 'opaque="FQhe/qaU925kfnzjCev0ciny7QMkPqMAFRtzCUYo5tdS"' in request.headers["Authorization"] assert 'response="8ca523f5e9506fed4657c9700eebdbec"' in request.headers["Authorization"] # No other requests are made. response = httpx2.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def test_digest_auth_rfc_7616_sha_256(monkeypatch: pytest.MonkeyPatch) -> None: # Example from https://datatracker.ietf.org/doc/html/rfc7616#section-3.9.1 def mock_get_client_nonce(nonce_count: int, nonce: bytes) -> bytes: return b"f2/wE4q74E6zIJEtWaHKaf5wv/H5QzzpXusqGemxURZJ" auth = httpx2.DigestAuth(username="Mufasa", password="Circle of Life") monkeypatch.setattr(auth, "_get_client_nonce", mock_get_client_nonce) request = httpx2.Request("GET", "https://www.example.com/dir/index.html") # The initial request should not include an auth header. flow = auth.sync_auth_flow(request) request = next(flow) assert "Authorization" not in request.headers # If a 401 response is returned, then a digest auth request is made. headers = { "WWW-Authenticate": ( 'Digest realm="http-auth@example.org", ' 'qop="auth, auth-int", ' "algorithm=SHA-256, " 'nonce="7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v", ' 'opaque="FQhe/qaU925kfnzjCev0ciny7QMkPqMAFRtzCUYo5tdS"' ) } response = httpx2.Response(content=b"Auth required", status_code=401, headers=headers, request=request) request = flow.send(response) assert request.headers["Authorization"].startswith("Digest") assert 'username="Mufasa"' in request.headers["Authorization"] assert 'realm="http-auth@example.org"' in request.headers["Authorization"] assert 'uri="/dir/index.html"' in request.headers["Authorization"] assert "algorithm=SHA-256" in request.headers["Authorization"] assert 'nonce="7ypf/xlj9XXwfDPEoM4URrv/xwf94BcCAzFZH4GiTo0v"' in request.headers["Authorization"] assert "nc=00000001" in request.headers["Authorization"] assert 'cnonce="f2/wE4q74E6zIJEtWaHKaf5wv/H5QzzpXusqGemxURZJ"' in request.headers["Authorization"] assert "qop=auth" in request.headers["Authorization"] assert 'opaque="FQhe/qaU925kfnzjCev0ciny7QMkPqMAFRtzCUYo5tdS"' in request.headers["Authorization"] assert ( 'response="753927fa0e85d155564e2e272a28d1802ca10daf4496794697cf8db5856cb6c1"' in request.headers["Authorization"] ) # No other requests are made. response = httpx2.Response(content=b"Hello, world!", status_code=200) with pytest.raises(StopIteration): flow.send(response) def test_digest_auth_empty_realm() -> None: auth = httpx2.DigestAuth(username="user", password="pass") request = httpx2.Request("GET", "https://www.example.com") flow = auth.sync_auth_flow(request) request = next(flow) # Digest realm has been left empty. headers = {"WWW-Authenticate": 'Digest realm=, qop="auth", nonce="...", opaque="..."'} response = httpx2.Response(content=b"Auth required", status_code=401, headers=headers, request=request) request = flow.send(response) assert request.headers["Authorization"].startswith('Digest username="user", realm="", nonce="..."') pydantic-httpx2-9b7ee8e/tests/httpx2/test_config.py000066400000000000000000000131301521723372100225400ustar00rootroot00000000000000from __future__ import annotations import ssl import typing import pytest import httpx2 if typing.TYPE_CHECKING: from conftest import TestServer def test_load_ssl_config() -> None: context = httpx2.create_ssl_context() assert context.verify_mode == ssl.VerifyMode.CERT_REQUIRED assert context.check_hostname is True def test_load_ssl_config_verify_non_existing_file() -> None: with pytest.raises(IOError): context = httpx2.create_ssl_context() context.load_verify_locations(cafile="/path/to/nowhere") def test_load_ssl_config_cert_and_key(cert_pem_file: str, cert_private_key_file: str) -> None: context = httpx2.create_ssl_context() context.load_cert_chain(cert_pem_file, cert_private_key_file) assert context.verify_mode == ssl.VerifyMode.CERT_REQUIRED assert context.check_hostname is True @pytest.mark.parametrize("password", [b"password", "password"]) def test_load_ssl_config_cert_and_encrypted_key( cert_pem_file: str, cert_encrypted_private_key_file: str, password: bytes | str ) -> None: context = httpx2.create_ssl_context() context.load_cert_chain(cert_pem_file, cert_encrypted_private_key_file, password) assert context.verify_mode == ssl.VerifyMode.CERT_REQUIRED assert context.check_hostname is True def test_load_ssl_config_cert_and_key_invalid_password( cert_pem_file: str, cert_encrypted_private_key_file: str ) -> None: with pytest.raises(ssl.SSLError): context = httpx2.create_ssl_context() context.load_cert_chain(cert_pem_file, cert_encrypted_private_key_file, "password1") def test_load_ssl_config_cert_without_key_raises(cert_pem_file: str) -> None: with pytest.raises(ssl.SSLError): context = httpx2.create_ssl_context() context.load_cert_chain(cert_pem_file) def test_load_ssl_config_no_verify() -> None: context = httpx2.create_ssl_context(verify=False) assert context.verify_mode == ssl.VerifyMode.CERT_NONE assert context.check_hostname is False def test_create_ssl_context_verify_str(cert_pem_file: str) -> None: with pytest.warns(DeprecationWarning, match="`verify=` is deprecated"): context = httpx2.create_ssl_context(verify=cert_pem_file) assert context.verify_mode == ssl.VerifyMode.CERT_REQUIRED def test_create_ssl_context_verify_str_with_cert_raises(cert_pem_file: str, cert_private_key_file: str) -> None: with pytest.raises(TypeError, match="cannot be combined with `cert=...`"): httpx2.create_ssl_context(verify=cert_pem_file, cert=(cert_pem_file, cert_private_key_file)) def test_SSLContext_with_get_request(server: TestServer, cert_pem_file: str) -> None: context = httpx2.create_ssl_context() context.load_verify_locations(cert_pem_file) response = httpx2.get(server.url, verify=context) assert response.status_code == 200 def test_limits_repr() -> None: limits = httpx2.Limits(max_connections=100) expected = "Limits(max_connections=100, max_keepalive_connections=None, keepalive_expiry=5.0)" assert repr(limits) == expected def test_limits_eq() -> None: limits = httpx2.Limits(max_connections=100) assert limits == httpx2.Limits(max_connections=100) def test_timeout_eq() -> None: timeout = httpx2.Timeout(timeout=5.0) assert timeout == httpx2.Timeout(timeout=5.0) def test_timeout_all_parameters_set() -> None: timeout = httpx2.Timeout(connect=5.0, read=5.0, write=5.0, pool=5.0) assert timeout == httpx2.Timeout(timeout=5.0) def test_timeout_from_nothing() -> None: timeout = httpx2.Timeout(None) assert timeout.connect is None assert timeout.read is None assert timeout.write is None assert timeout.pool is None def test_timeout_from_none() -> None: timeout = httpx2.Timeout(timeout=None) assert timeout == httpx2.Timeout(None) def test_timeout_from_one_none_value() -> None: timeout = httpx2.Timeout(None, read=None) assert timeout == httpx2.Timeout(None) def test_timeout_from_one_value() -> None: timeout = httpx2.Timeout(None, read=5.0) assert timeout == httpx2.Timeout(timeout=(None, 5.0, None, None)) def test_timeout_from_one_value_and_default() -> None: timeout = httpx2.Timeout(5.0, pool=60.0) assert timeout == httpx2.Timeout(timeout=(5.0, 5.0, 5.0, 60.0)) def test_timeout_missing_default() -> None: with pytest.raises(ValueError): httpx2.Timeout(pool=60.0) def test_timeout_from_tuple() -> None: timeout = httpx2.Timeout(timeout=(5.0, 5.0, 5.0, 5.0)) assert timeout == httpx2.Timeout(timeout=5.0) def test_timeout_from_config_instance() -> None: timeout = httpx2.Timeout(timeout=5.0) assert httpx2.Timeout(timeout) == httpx2.Timeout(timeout=5.0) def test_timeout_repr() -> None: timeout = httpx2.Timeout(timeout=5.0) assert repr(timeout) == "Timeout(timeout=5.0)" timeout = httpx2.Timeout(None, read=5.0) assert repr(timeout) == "Timeout(connect=None, read=5.0, write=None, pool=None)" def test_proxy_from_url() -> None: proxy = httpx2.Proxy("https://example.com") assert str(proxy.url) == "https://example.com" assert proxy.auth is None assert proxy.headers == {} assert repr(proxy) == "Proxy('https://example.com')" def test_proxy_with_auth_from_url() -> None: proxy = httpx2.Proxy("https://username:password@example.com") assert str(proxy.url) == "https://example.com" assert proxy.auth == ("username", "password") assert proxy.headers == {} assert repr(proxy) == "Proxy('https://example.com', auth=('username', '********'))" def test_invalid_proxy_scheme() -> None: with pytest.raises(ValueError): httpx2.Proxy("invalid://example.com") pydantic-httpx2-9b7ee8e/tests/httpx2/test_content.py000066400000000000000000000421721521723372100227550ustar00rootroot00000000000000import io import typing import pytest import httpx2 method = "POST" url = "https://www.example.com" @pytest.mark.anyio async def test_empty_content() -> None: request = httpx2.Request(method, url) assert isinstance(request.stream, httpx2.SyncByteStream) assert isinstance(request.stream, httpx2.AsyncByteStream) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == {"Host": "www.example.com", "Content-Length": "0"} assert sync_content == b"" assert async_content == b"" @pytest.mark.anyio async def test_bytes_content() -> None: request = httpx2.Request(method, url, content=b"Hello, world!") assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == {"Host": "www.example.com", "Content-Length": "13"} assert sync_content == b"Hello, world!" assert async_content == b"Hello, world!" # Support 'data' for compat with requests. with pytest.warns(DeprecationWarning): request = httpx2.Request(method, url, data=b"Hello, world!") # type: ignore assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == {"Host": "www.example.com", "Content-Length": "13"} assert sync_content == b"Hello, world!" assert async_content == b"Hello, world!" @pytest.mark.anyio async def test_bytesio_content() -> None: request = httpx2.Request(method, url, content=io.BytesIO(b"Hello, world!")) assert isinstance(request.stream, typing.Iterable) assert not isinstance(request.stream, typing.AsyncIterable) content = b"".join(list(request.stream)) assert request.headers == {"Host": "www.example.com", "Content-Length": "13"} assert content == b"Hello, world!" @pytest.mark.anyio async def test_async_bytesio_content() -> None: class AsyncBytesIO: def __init__(self, content: bytes) -> None: self._idx = 0 self._content = content async def aread(self, chunk_size: int) -> bytes: chunk = self._content[self._idx : self._idx + chunk_size] self._idx = self._idx + chunk_size return chunk async def __aiter__(self) -> typing.AsyncIterator[bytes]: yield self._content # pragma: no cover request = httpx2.Request(method, url, content=AsyncBytesIO(b"Hello, world!")) assert not isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Transfer-Encoding": "chunked", } assert content == b"Hello, world!" @pytest.mark.anyio async def test_iterator_content() -> None: def hello_world() -> typing.Iterator[bytes]: yield b"Hello, " yield b"world!" request = httpx2.Request(method, url, content=hello_world()) assert isinstance(request.stream, typing.Iterable) assert not isinstance(request.stream, typing.AsyncIterable) content = b"".join(list(request.stream)) assert request.headers == { "Host": "www.example.com", "Transfer-Encoding": "chunked", } assert content == b"Hello, world!" with pytest.raises(httpx2.StreamConsumed): list(request.stream) # Support 'data' for compat with requests. with pytest.warns(DeprecationWarning): request = httpx2.Request(method, url, data=hello_world()) # type: ignore assert isinstance(request.stream, typing.Iterable) assert not isinstance(request.stream, typing.AsyncIterable) content = b"".join(list(request.stream)) assert request.headers == { "Host": "www.example.com", "Transfer-Encoding": "chunked", } assert content == b"Hello, world!" @pytest.mark.anyio async def test_aiterator_content() -> None: async def hello_world() -> typing.AsyncIterator[bytes]: yield b"Hello, " yield b"world!" request = httpx2.Request(method, url, content=hello_world()) assert not isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Transfer-Encoding": "chunked", } assert content == b"Hello, world!" with pytest.raises(httpx2.StreamConsumed): [part async for part in request.stream] # Support 'data' for compat with requests. with pytest.warns(DeprecationWarning): request = httpx2.Request(method, url, data=hello_world()) # type: ignore assert not isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Transfer-Encoding": "chunked", } assert content == b"Hello, world!" @pytest.mark.anyio async def test_json_content() -> None: request = httpx2.Request(method, url, json={"Hello": "world!"}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "18", "Content-Type": "application/json", } assert sync_content == b'{"Hello":"world!"}' assert async_content == b'{"Hello":"world!"}' @pytest.mark.anyio async def test_urlencoded_content() -> None: request = httpx2.Request(method, url, data={"Hello": "world!"}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "14", "Content-Type": "application/x-www-form-urlencoded", } assert sync_content == b"Hello=world%21" assert async_content == b"Hello=world%21" @pytest.mark.anyio async def test_urlencoded_boolean() -> None: request = httpx2.Request(method, url, data={"example": True}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "12", "Content-Type": "application/x-www-form-urlencoded", } assert sync_content == b"example=true" assert async_content == b"example=true" @pytest.mark.anyio async def test_urlencoded_none() -> None: request = httpx2.Request(method, url, data={"example": None}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "8", "Content-Type": "application/x-www-form-urlencoded", } assert sync_content == b"example=" assert async_content == b"example=" @pytest.mark.anyio async def test_urlencoded_list() -> None: request = httpx2.Request(method, url, data={"example": ["a", 1, True]}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "32", "Content-Type": "application/x-www-form-urlencoded", } assert sync_content == b"example=a&example=1&example=true" assert async_content == b"example=a&example=1&example=true" @pytest.mark.anyio async def test_multipart_files_content() -> None: files = {"file": io.BytesIO(b"")} headers = {"Content-Type": "multipart/form-data; boundary=+++"} request = httpx2.Request( method, url, files=files, headers=headers, ) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "138", "Content-Type": "multipart/form-data; boundary=+++", } assert sync_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) assert async_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) @pytest.mark.anyio async def test_multipart_data_and_files_content() -> None: data = {"message": "Hello, world!"} files = {"file": io.BytesIO(b"")} headers = {"Content-Type": "multipart/form-data; boundary=+++"} request = httpx2.Request(method, url, data=data, files=files, headers=headers) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "210", "Content-Type": "multipart/form-data; boundary=+++", } assert sync_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="message"\r\n', b"\r\n", b"Hello, world!\r\n", b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) assert async_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="message"\r\n', b"\r\n", b"Hello, world!\r\n", b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) @pytest.mark.anyio async def test_empty_request() -> None: request = httpx2.Request(method, url, data={}, files={}) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == {"Host": "www.example.com", "Content-Length": "0"} assert sync_content == b"" assert async_content == b"" def test_invalid_argument() -> None: with pytest.raises(TypeError): httpx2.Request(method, url, content=123) # type: ignore with pytest.raises(TypeError): httpx2.Request(method, url, content={"a": "b"}) # type: ignore @pytest.mark.anyio async def test_multipart_multiple_files_single_input_content() -> None: files = [ ("file", io.BytesIO(b"")), ("file", io.BytesIO(b"")), ] headers = {"Content-Type": "multipart/form-data; boundary=+++"} request = httpx2.Request(method, url, files=files, headers=headers) assert isinstance(request.stream, typing.Iterable) assert isinstance(request.stream, typing.AsyncIterable) sync_content = b"".join(list(request.stream)) async_content = b"".join([part async for part in request.stream]) assert request.headers == { "Host": "www.example.com", "Content-Length": "271", "Content-Type": "multipart/form-data; boundary=+++", } assert sync_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) assert async_content == b"".join( [ b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--+++--\r\n", ] ) @pytest.mark.anyio async def test_response_empty_content() -> None: response = httpx2.Response(200) assert isinstance(response.stream, typing.Iterable) assert isinstance(response.stream, typing.AsyncIterable) sync_content = b"".join(list(response.stream)) async_content = b"".join([part async for part in response.stream]) assert response.headers == {} assert sync_content == b"" assert async_content == b"" @pytest.mark.anyio async def test_response_bytes_content() -> None: response = httpx2.Response(200, content=b"Hello, world!") assert isinstance(response.stream, typing.Iterable) assert isinstance(response.stream, typing.AsyncIterable) sync_content = b"".join(list(response.stream)) async_content = b"".join([part async for part in response.stream]) assert response.headers == {"Content-Length": "13"} assert sync_content == b"Hello, world!" assert async_content == b"Hello, world!" @pytest.mark.anyio async def test_response_iterator_content() -> None: def hello_world() -> typing.Iterator[bytes]: yield b"Hello, " yield b"world!" response = httpx2.Response(200, content=hello_world()) assert isinstance(response.stream, typing.Iterable) assert not isinstance(response.stream, typing.AsyncIterable) content = b"".join(list(response.stream)) assert response.headers == {"Transfer-Encoding": "chunked"} assert content == b"Hello, world!" with pytest.raises(httpx2.StreamConsumed): list(response.stream) @pytest.mark.anyio async def test_response_aiterator_content() -> None: async def hello_world() -> typing.AsyncIterator[bytes]: yield b"Hello, " yield b"world!" response = httpx2.Response(200, content=hello_world()) assert not isinstance(response.stream, typing.Iterable) assert isinstance(response.stream, typing.AsyncIterable) content = b"".join([part async for part in response.stream]) assert response.headers == {"Transfer-Encoding": "chunked"} assert content == b"Hello, world!" with pytest.raises(httpx2.StreamConsumed): [part async for part in response.stream] def test_response_invalid_argument() -> None: with pytest.raises(TypeError): httpx2.Response(200, content=123) # type: ignore def test_ensure_ascii_false_with_french_characters() -> None: data = {"greeting": "Bonjour, Γ§a va ?"} response = httpx2.Response(200, json=data) assert "Γ§a va" in response.text, "ensure_ascii=False should preserve French accented characters" assert response.headers["Content-Type"] == "application/json" def test_separators_for_compact_json() -> None: data = {"clΓ©": "valeur", "liste": [1, 2, 3]} response = httpx2.Response(200, json=data) assert response.text == '{"clΓ©":"valeur","liste":[1,2,3]}', ( "separators=(',', ':') should produce a compact representation" ) assert response.headers["Content-Type"] == "application/json" def test_allow_nan_false() -> None: data_with_nan = {"nombre": float("nan")} data_with_inf = {"nombre": float("inf")} with pytest.raises(ValueError, match="Out of range float values are not JSON compliant"): httpx2.Response(200, json=data_with_nan) with pytest.raises(ValueError, match="Out of range float values are not JSON compliant"): httpx2.Response(200, json=data_with_inf) pydantic-httpx2-9b7ee8e/tests/httpx2/test_decoders.py000066400000000000000000000306021521723372100230660ustar00rootroot00000000000000from __future__ import annotations import io import sys import typing import zlib import chardet import pytest import httpx2 if sys.version_info >= (3, 14): # pragma: no cover from compression import zstd else: # pragma: no cover import zstandard as zstd def test_deflate() -> None: """ Deflate encoding may use either 'zlib' or 'deflate' in the wild. https://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib#answer-22311297 """ body = b"test 123" compressor = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS) compressed_body = compressor.compress(body) + compressor.flush() headers = [(b"Content-Encoding", b"deflate")] response = httpx2.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_zlib() -> None: """ Deflate encoding may use either 'zlib' or 'deflate' in the wild. https://stackoverflow.com/questions/1838699/how-can-i-decompress-a-gzip-stream-with-zlib#answer-22311297 """ body = b"test 123" compressed_body = zlib.compress(body) headers = [(b"Content-Encoding", b"deflate")] response = httpx2.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_gzip() -> None: body = b"test 123" compressor = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16) compressed_body = compressor.compress(body) + compressor.flush() headers = [(b"Content-Encoding", b"gzip")] response = httpx2.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_brotli() -> None: body = b"test 123" compressed_body = b"\x8b\x03\x80test 123\x03" headers = [(b"Content-Encoding", b"br")] response = httpx2.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_zstd() -> None: body = b"test 123" compressed_body = zstd.compress(body) headers = [(b"Content-Encoding", b"zstd")] response = httpx2.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_zstd_decoding_error() -> None: compressed_body = "this_is_not_zstd_compressed_data" headers = [(b"Content-Encoding", b"zstd")] with pytest.raises(httpx2.DecodingError): httpx2.Response( 200, headers=headers, content=compressed_body, ) def test_zstd_empty() -> None: headers = [(b"Content-Encoding", b"zstd")] response = httpx2.Response(200, headers=headers, content=b"") assert response.content == b"" def test_zstd_truncated() -> None: body = b"test 123" compressed_body = zstd.compress(body) headers = [(b"Content-Encoding", b"zstd")] with pytest.raises(httpx2.DecodingError): httpx2.Response( 200, headers=headers, content=compressed_body[1:3], ) def test_zstd_multiframe() -> None: # test inspired by urllib3 test suite data = ( # Zstandard frame zstd.compress(b"foo") # skippable frame (must be ignored) + bytes.fromhex( "50 2A 4D 18" # Magic_Number (little-endian) "07 00 00 00" # Frame_Size (little-endian) "00 00 00 00 00 00 00" # User_Data ) # Zstandard frame + zstd.compress(b"bar") ) compressed_body = io.BytesIO(data) headers = [(b"Content-Encoding", b"zstd")] response = httpx2.Response(200, headers=headers, content=compressed_body) response.read() assert response.content == b"foobar" def test_zstd_streaming_multiple_frames() -> None: body1 = b"test 123 " body2 = b"another frame" # Create two separate complete frames frame1 = zstd.compress(body1) frame2 = zstd.compress(body2) # Create an iterator that yields frames separately def content_iterator() -> typing.Iterator[bytes]: yield frame1 yield frame2 headers = [(b"Content-Encoding", b"zstd")] response = httpx2.Response(200, headers=headers, content=content_iterator()) response.read() assert response.content == body1 + body2 def test_zstd_empty_decode_after_eof() -> None: # An empty `decode(b"")` after a complete frame must not raise EOFError on # stdlib `compression.zstd`. This path is reached via `MultiDecoder.flush()`, # which feeds b"" through each child to drain residue across stacked encodings. body = b"test 123" compressed_body = zstd.compress(body) headers = [(b"Content-Encoding", b"zstd, identity")] response = httpx2.Response(200, headers=headers, content=compressed_body) assert response.content == body def test_multi() -> None: body = b"test 123" deflate_compressor = zlib.compressobj(9, zlib.DEFLATED, -zlib.MAX_WBITS) compressed_body = deflate_compressor.compress(body) + deflate_compressor.flush() gzip_compressor = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16) compressed_body = gzip_compressor.compress(compressed_body) + gzip_compressor.flush() headers = [(b"Content-Encoding", b"deflate, gzip")] response = httpx2.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_multi_with_identity() -> None: body = b"test 123" compressed_body = b"\x8b\x03\x80test 123\x03" headers = [(b"Content-Encoding", b"br, identity")] response = httpx2.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body headers = [(b"Content-Encoding", b"identity, br")] response = httpx2.Response( 200, headers=headers, content=compressed_body, ) assert response.content == body def test_multi_brotli_zstd() -> None: body = b"test 123" compressed_body = zstd.compress(b"\x8b\x03\x80test 123\x03") headers = [(b"Content-Encoding", b"br, zstd")] response = httpx2.Response(200, headers=headers, content=compressed_body) assert response.content == body def test_multi_decode_links_limit() -> None: headers = [(b"Content-Encoding", b", ".join([b"gzip"] * 6))] with pytest.raises(httpx2.DecodingError, match="Cannot apply more than 5 content encodings"): httpx2.Response(200, headers=headers, content=b"") def test_multi_decode_links_limit_ignores_identity_and_unsupported() -> None: body = b"test 123" compressed = zlib.compress(body) headers = [(b"Content-Encoding", b"identity, identity, identity, identity, identity, deflate")] response = httpx2.Response(200, headers=headers, content=compressed) assert response.content == body @pytest.mark.anyio async def test_streaming() -> None: body = b"test 123" compressor = zlib.compressobj(9, zlib.DEFLATED, zlib.MAX_WBITS | 16) async def compress(body: bytes) -> typing.AsyncIterator[bytes]: yield compressor.compress(body) yield compressor.flush() headers = [(b"Content-Encoding", b"gzip")] response = httpx2.Response( 200, headers=headers, content=compress(body), ) assert not hasattr(response, "body") assert await response.aread() == body @pytest.mark.parametrize("header_value", (b"deflate", b"gzip", b"br", b"identity")) def test_empty_content(header_value: bytes) -> None: headers = [(b"Content-Encoding", header_value)] response = httpx2.Response( 200, headers=headers, content=b"", ) assert response.content == b"" @pytest.mark.parametrize("header_value", (b"deflate", b"gzip", b"br", b"identity")) def test_decoders_empty_cases(header_value: bytes) -> None: headers = [(b"Content-Encoding", header_value)] response = httpx2.Response(content=b"", status_code=200, headers=headers) assert response.read() == b"" @pytest.mark.parametrize("header_value", (b"deflate", b"gzip", b"br")) def test_decoding_errors(header_value: bytes) -> None: headers = [(b"Content-Encoding", header_value)] compressed_body = b"invalid" with pytest.raises(httpx2.DecodingError): request = httpx2.Request("GET", "https://example.org") httpx2.Response(200, headers=headers, content=compressed_body, request=request) with pytest.raises(httpx2.DecodingError): httpx2.Response(200, headers=headers, content=compressed_body) @pytest.mark.parametrize( ["data", "encoding"], [ ((b"Hello,", b" world!"), "ascii"), ((b"\xe3\x83", b"\x88\xe3\x83\xa9", b"\xe3", b"\x83\x99\xe3\x83\xab"), "utf-8"), ((b"Euro character: \x88! abcdefghijklmnopqrstuvwxyz", b""), "cp1252"), ((b"Accented: \xd6sterreich abcdefghijklmnopqrstuvwxyz", b""), "iso-8859-1"), ], ) @pytest.mark.anyio async def test_text_decoder_with_autodetect(data: tuple[bytes, ...], encoding: str) -> None: async def iterator() -> typing.AsyncIterator[bytes]: nonlocal data for chunk in data: yield chunk def autodetect(content: bytes) -> str | None: return chardet.detect(content).get("encoding") # Accessing `.text` on a read response. response = httpx2.Response(200, content=iterator(), default_encoding=autodetect) await response.aread() assert response.text == (b"".join(data)).decode(encoding) # Streaming `.aiter_text` iteratively. # Note that if we streamed the text *without* having read it first, then # we won't get a `charset_normalizer` guess, and will instead always rely # on utf-8 if no charset is specified. text = "".join([part async for part in response.aiter_text()]) assert text == (b"".join(data)).decode(encoding) @pytest.mark.anyio async def test_text_decoder_known_encoding() -> None: async def iterator() -> typing.AsyncIterator[bytes]: yield b"\x83g" yield b"\x83" yield b"\x89\x83x\x83\x8b" response = httpx2.Response( 200, headers=[(b"Content-Type", b"text/html; charset=shift-jis")], content=iterator(), ) await response.aread() assert "".join(response.text) == "γƒˆγƒ©γƒ™γƒ«" def test_text_decoder_empty_cases() -> None: response = httpx2.Response(200, content=b"") assert response.text == "" response = httpx2.Response(200, content=[b""]) response.read() assert response.text == "" @pytest.mark.parametrize( ["data", "expected"], [((b"Hello,", b" world!"), ["Hello,", " world!"])], ) def test_streaming_text_decoder(data: typing.Iterable[bytes], expected: list[str]) -> None: response = httpx2.Response(200, content=iter(data)) assert list(response.iter_text()) == expected def test_line_decoder_nl() -> None: response = httpx2.Response(200, content=[b""]) assert list(response.iter_lines()) == [] response = httpx2.Response(200, content=[b"", b"a\n\nb\nc"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] # Issue #1033 response = httpx2.Response(200, content=[b"", b"12345\n", b"foo ", b"bar ", b"baz\n"]) assert list(response.iter_lines()) == ["12345", "foo bar baz"] def test_line_decoder_cr() -> None: response = httpx2.Response(200, content=[b"", b"a\r\rb\rc"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] response = httpx2.Response(200, content=[b"", b"a\r\rb\rc\r"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] # Issue #1033 response = httpx2.Response(200, content=[b"", b"12345\r", b"foo ", b"bar ", b"baz\r"]) assert list(response.iter_lines()) == ["12345", "foo bar baz"] def test_line_decoder_crnl() -> None: response = httpx2.Response(200, content=[b"", b"a\r\n\r\nb\r\nc"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] response = httpx2.Response(200, content=[b"", b"a\r\n\r\nb\r\nc\r\n"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] response = httpx2.Response(200, content=[b"", b"a\r", b"\n\r\nb\r\nc"]) assert list(response.iter_lines()) == ["a", "", "b", "c"] # Issue #1033 response = httpx2.Response(200, content=[b"", b"12345\r\n", b"foo bar baz\r\n"]) assert list(response.iter_lines()) == ["12345", "foo bar baz"] def test_invalid_content_encoding_header() -> None: headers = [(b"Content-Encoding", b"invalid-header")] body = b"test 123" response = httpx2.Response( 200, headers=headers, content=body, ) assert response.content == body pydantic-httpx2-9b7ee8e/tests/httpx2/test_exceptions.py000066400000000000000000000034201521723372100234550ustar00rootroot00000000000000from __future__ import annotations import typing import pytest import httpcore2 import httpx2 if typing.TYPE_CHECKING: from conftest import TestServer def test_httpcore_all_exceptions_mapped() -> None: """ All exception classes exposed by HTTPCore are properly mapped to an HTTPX-specific exception class. """ expected_mapped_httpcore_exceptions = { value.__name__ for _, value in vars(httpcore2).items() if isinstance(value, type) and issubclass(value, Exception) and value is not httpcore2.ConnectionNotAvailable } httpx_exceptions = { value.__name__ for _, value in vars(httpx2).items() if isinstance(value, type) and issubclass(value, Exception) } unmapped_exceptions = expected_mapped_httpcore_exceptions - httpx_exceptions if unmapped_exceptions: # pragma: no cover pytest.fail(f"Unmapped httpcore exceptions: {unmapped_exceptions}") def test_httpcore_exception_mapping(server: TestServer) -> None: """ HTTPCore exception mapping works as expected. """ impossible_port = 123456 with pytest.raises(httpx2.ConnectError): httpx2.get(server.url.copy_with(port=impossible_port)) with pytest.raises(httpx2.ReadTimeout): httpx2.get( server.url.copy_with(path="/slow_response"), timeout=httpx2.Timeout(5, read=0.01), ) def test_request_attribute() -> None: # Exception without request attribute exc = httpx2.ReadTimeout("Read operation timed out") with pytest.raises(RuntimeError): exc.request # noqa: B018 # Exception with request attribute request = httpx2.Request("GET", "https://www.example.com") exc = httpx2.ReadTimeout("Read operation timed out", request=request) assert exc.request == request pydantic-httpx2-9b7ee8e/tests/httpx2/test_exported_members.py000066400000000000000000000005111521723372100246360ustar00rootroot00000000000000import httpx2 def test_all_imports_are_exported() -> None: included_private_members = ["__description__", "__title__", "__version__"] assert httpx2.__all__ == sorted( (member for member in vars(httpx2).keys() if not member.startswith("_") or member in included_private_members), key=str.casefold, ) pydantic-httpx2-9b7ee8e/tests/httpx2/test_main.py000066400000000000000000000133061521723372100222240ustar00rootroot00000000000000from __future__ import annotations import os import typing from click.testing import CliRunner import httpx2 from httpx2._main import main if typing.TYPE_CHECKING: from conftest import TestServer def splitlines(output: str) -> typing.Iterable[str]: return [line.strip() for line in output.splitlines()] def remove_date_header(lines: typing.Iterable[str]) -> typing.Iterable[str]: return [line for line in lines if not line.startswith("date:")] def test_help() -> None: runner = CliRunner() result = runner.invoke(main, ["--help"]) assert result.exit_code == 0 assert "A next generation HTTP client." in result.output def test_get(server: TestServer) -> None: url = str(server.url) runner = CliRunner() result = runner.invoke(main, [url]) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 200 OK", "server: uvicorn", "content-type: text/plain", "Transfer-Encoding: chunked", "", "Hello, world!", ] def test_json(server: TestServer) -> None: url = str(server.url.copy_with(path="/json")) runner = CliRunner() result = runner.invoke(main, [url]) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 200 OK", "server: uvicorn", "content-type: application/json", "Transfer-Encoding: chunked", "", "{", '"Hello": "world!"', "}", ] def test_binary(server: TestServer) -> None: url = str(server.url.copy_with(path="/echo_binary")) runner = CliRunner() content = "Hello, world!" result = runner.invoke(main, [url, "-c", content]) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 200 OK", "server: uvicorn", "content-type: application/octet-stream", "Transfer-Encoding: chunked", "", f"<{len(content)} bytes of binary data>", ] def test_redirects(server: TestServer) -> None: url = str(server.url.copy_with(path="/redirect_301")) runner = CliRunner() result = runner.invoke(main, [url]) assert result.exit_code == 1 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 301 Moved Permanently", "server: uvicorn", "location: /", "Transfer-Encoding: chunked", "", ] def test_follow_redirects(server: TestServer) -> None: url = str(server.url.copy_with(path="/redirect_301")) runner = CliRunner() result = runner.invoke(main, [url, "--follow-redirects"]) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 301 Moved Permanently", "server: uvicorn", "location: /", "Transfer-Encoding: chunked", "", "HTTP/1.1 200 OK", "server: uvicorn", "content-type: text/plain", "Transfer-Encoding: chunked", "", "Hello, world!", ] def test_post(server: TestServer) -> None: url = str(server.url.copy_with(path="/echo_body")) runner = CliRunner() result = runner.invoke(main, [url, "-m", "POST", "-j", '{"hello": "world"}']) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "HTTP/1.1 200 OK", "server: uvicorn", "content-type: text/plain", "Transfer-Encoding: chunked", "", '{"hello":"world"}', ] def test_verbose(server: TestServer) -> None: url = str(server.url) runner = CliRunner() result = runner.invoke(main, [url, "-v"]) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "* Connecting to '127.0.0.1'", f"* Connected to '127.0.0.1' on port {server.url.port}", "GET / HTTP/1.1", f"Host: {server.url.netloc.decode('ascii')}", "Accept: */*", "Accept-Encoding: gzip, deflate, br, zstd", "Connection: keep-alive", f"User-Agent: python-httpx2/{httpx2.__version__}", "", "HTTP/1.1 200 OK", "server: uvicorn", "content-type: text/plain", "Transfer-Encoding: chunked", "", "Hello, world!", ] def test_auth(server: TestServer) -> None: url = str(server.url) runner = CliRunner() result = runner.invoke(main, [url, "-v", "--auth", "username", "password"]) print(result.output) assert result.exit_code == 0 assert remove_date_header(splitlines(result.output)) == [ "* Connecting to '127.0.0.1'", f"* Connected to '127.0.0.1' on port {server.url.port}", "GET / HTTP/1.1", f"Host: {server.url.netloc.decode('ascii')}", "Accept: */*", "Accept-Encoding: gzip, deflate, br, zstd", "Connection: keep-alive", f"User-Agent: python-httpx2/{httpx2.__version__}", "Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ=", "", "HTTP/1.1 200 OK", "server: uvicorn", "content-type: text/plain", "Transfer-Encoding: chunked", "", "Hello, world!", ] def test_download(server: TestServer) -> None: url = str(server.url) runner = CliRunner() with runner.isolated_filesystem(): runner.invoke(main, [url, "--download", "index.txt"]) assert os.path.exists("index.txt") with open("index.txt") as input_file: assert input_file.read() == "Hello, world!" def test_errors() -> None: runner = CliRunner() result = runner.invoke(main, ["invalid://example.org"]) assert result.exit_code == 1 assert splitlines(result.output) == [ "UnsupportedProtocol: Request URL has an unsupported protocol 'invalid://'.", ] pydantic-httpx2-9b7ee8e/tests/httpx2/test_multipart.py000066400000000000000000000415271521723372100233270ustar00rootroot00000000000000from __future__ import annotations import io import tempfile import typing import pytest import httpx2 def echo_request_content(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=request.content) @pytest.mark.parametrize(("value,output"), (("abc", b"abc"), (b"abc", b"abc"))) def test_multipart(value: str | bytes, output: bytes) -> None: client = httpx2.Client(transport=httpx2.MockTransport(echo_request_content)) # Test with a single-value 'data' argument, and a plain file 'files' argument. data = {"text": value} files = {"file": io.BytesIO(b"")} response = client.post("http://127.0.0.1:8000/", data=data, files=files) boundary = response.request.headers["Content-Type"].split("boundary=")[-1] boundary_bytes = boundary.encode("ascii") assert response.status_code == 200 assert response.content == b"".join( [ b"--" + boundary_bytes + b"\r\n", b'Content-Disposition: form-data; name="text"\r\n', b"\r\n", b"abc\r\n", b"--" + boundary_bytes + b"\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--" + boundary_bytes + b"--\r\n", ] ) @pytest.mark.parametrize( "header", [ "multipart/form-data; boundary=+++; charset=utf-8", "multipart/form-data; charset=utf-8; boundary=+++", "multipart/form-data; boundary=+++", "multipart/form-data; boundary=+++ ;", 'multipart/form-data; boundary="+++"; charset=utf-8', 'multipart/form-data; charset=utf-8; boundary="+++"', 'multipart/form-data; boundary="+++"', 'multipart/form-data; boundary="+++" ;', ], ) def test_multipart_explicit_boundary(header: str) -> None: client = httpx2.Client(transport=httpx2.MockTransport(echo_request_content)) files = {"file": io.BytesIO(b"")} headers = {"content-type": header} response = client.post("http://127.0.0.1:8000/", files=files, headers=headers) boundary_bytes = b"+++" assert response.status_code == 200 assert response.request.headers["Content-Type"] == header assert response.content == b"".join( [ b"--" + boundary_bytes + b"\r\n", b'Content-Disposition: form-data; name="file"; filename="upload"\r\n', b"Content-Type: application/octet-stream\r\n", b"\r\n", b"\r\n", b"--" + boundary_bytes + b"--\r\n", ] ) @pytest.mark.parametrize( "header", [ "multipart/form-data; charset=utf-8", "multipart/form-data; charset=utf-8; ", ], ) def test_multipart_header_without_boundary(header: str) -> None: client = httpx2.Client(transport=httpx2.MockTransport(echo_request_content)) files = {"file": io.BytesIO(b"")} headers = {"content-type": header} response = client.post("http://127.0.0.1:8000/", files=files, headers=headers) assert response.status_code == 200 assert response.request.headers["Content-Type"] == header @pytest.mark.parametrize(("key"), (b"abc", 1, 2.3, None)) def test_multipart_invalid_key(key: typing.Any) -> None: client = httpx2.Client(transport=httpx2.MockTransport(echo_request_content)) data = {key: "abc"} files = {"file": io.BytesIO(b"")} with pytest.raises(TypeError) as e: client.post( "http://127.0.0.1:8000/", data=data, files=files, ) assert "Invalid type for name" in str(e.value) assert repr(key) in str(e.value) @pytest.mark.parametrize(("value"), (object(), {"key": "value"})) def test_multipart_invalid_value(value: typing.Any) -> None: client = httpx2.Client(transport=httpx2.MockTransport(echo_request_content)) data = {"text": value} files = {"file": io.BytesIO(b"")} with pytest.raises(TypeError) as e: client.post("http://127.0.0.1:8000/", data=data, files=files) assert "Invalid type for value" in str(e.value) def test_multipart_file_tuple() -> None: client = httpx2.Client(transport=httpx2.MockTransport(echo_request_content)) # Test with a list of values 'data' argument, # and a tuple style 'files' argument. data = {"text": ["abc"]} files = {"file": ("name.txt", io.BytesIO(b""))} response = client.post("http://127.0.0.1:8000/", data=data, files=files) boundary = response.request.headers["Content-Type"].split("boundary=")[-1] boundary_bytes = boundary.encode("ascii") assert response.status_code == 200 assert response.content == b"".join( [ b"--" + boundary_bytes + b"\r\n", b'Content-Disposition: form-data; name="text"\r\n', b"\r\n", b"abc\r\n", b"--" + boundary_bytes + b"\r\n", b'Content-Disposition: form-data; name="file"; filename="name.txt"\r\n', b"Content-Type: text/plain\r\n", b"\r\n", b"\r\n", b"--" + boundary_bytes + b"--\r\n", ] ) @pytest.mark.parametrize("file_content_type", [None, "text/plain"]) def test_multipart_file_tuple_headers(file_content_type: str | None) -> None: file_name = "test.txt" file_content = io.BytesIO(b"") file_headers = {"Expires": "0"} url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": (file_name, file_content, file_content_type, file_headers)} request = httpx2.Request("POST", url, headers=headers, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( f'--BOUNDARY\r\nContent-Disposition: form-data; name="file"; ' f'filename="{file_name}"\r\nExpires: 0\r\nContent-Type: ' f"text/plain\r\n\r\n\r\n--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_headers_include_content_type() -> None: """ Content-Type from 4th tuple parameter (headers) should override the 3rd parameter (content_type) """ file_name = "test.txt" file_content = io.BytesIO(b"") file_content_type = "text/plain" file_headers = {"Content-Type": "image/png"} url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": (file_name, file_content, file_content_type, file_headers)} request = httpx2.Request("POST", url, headers=headers, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( f'--BOUNDARY\r\nContent-Disposition: form-data; name="file"; ' f'filename="{file_name}"\r\nContent-Type: ' f"image/png\r\n\r\n\r\n--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_encode(tmp_path: typing.Any) -> None: path = str(tmp_path / "name.txt") with open(path, "wb") as f: f.write(b"") url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} data = { "a": "1", "b": b"C", "c": ["11", "22", "33"], "d": "", "e": True, "f": "", } with open(path, "rb") as input_file: files = {"file": ("name.txt", input_file)} request = httpx2.Request("POST", url, headers=headers, data=data, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( '--BOUNDARY\r\nContent-Disposition: form-data; name="a"\r\n\r\n1\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="b"\r\n\r\nC\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="c"\r\n\r\n11\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="c"\r\n\r\n22\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="c"\r\n\r\n33\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="d"\r\n\r\n\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="e"\r\n\r\ntrue\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="f"\r\n\r\n\r\n' '--BOUNDARY\r\nContent-Disposition: form-data; name="file";' ' filename="name.txt"\r\n' "Content-Type: text/plain\r\n\r\n\r\n" "--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_encode_unicode_file_contents() -> None: url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": ("name.txt", b"")} request = httpx2.Request("POST", url, headers=headers, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( b'--BOUNDARY\r\nContent-Disposition: form-data; name="file";' b' filename="name.txt"\r\n' b"Content-Type: text/plain\r\n\r\n\r\n" b"--BOUNDARY--\r\n" ) def test_multipart_encode_files_allows_filenames_as_none() -> None: url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": (None, io.BytesIO(b""))} request = httpx2.Request("POST", url, headers=headers, data={}, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( '--BOUNDARY\r\nContent-Disposition: form-data; name="file"\r\n\r\n\r\n--BOUNDARY--\r\n'.encode( "ascii" ) ) @pytest.mark.parametrize( "file_name,expected_content_type", [ ("example.json", "application/json"), ("example.txt", "text/plain"), ("no-extension", "application/octet-stream"), ], ) def test_multipart_encode_files_guesses_correct_content_type(file_name: str, expected_content_type: str) -> None: url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": (file_name, io.BytesIO(b""))} request = httpx2.Request("POST", url, headers=headers, data={}, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( f'--BOUNDARY\r\nContent-Disposition: form-data; name="file"; ' f'filename="{file_name}"\r\nContent-Type: ' f"{expected_content_type}\r\n\r\n\r\n--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_encode_files_allows_bytes_content() -> None: url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": ("test.txt", b"", "text/plain")} request = httpx2.Request("POST", url, headers=headers, data={}, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( '--BOUNDARY\r\nContent-Disposition: form-data; name="file"; ' 'filename="test.txt"\r\n' "Content-Type: text/plain\r\n\r\n\r\n" "--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_encode_files_allows_str_content() -> None: url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} files = {"file": ("test.txt", "", "text/plain")} request = httpx2.Request("POST", url, headers=headers, data={}, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Content-Length": str(len(request.content)), } assert request.content == ( '--BOUNDARY\r\nContent-Disposition: form-data; name="file"; ' 'filename="test.txt"\r\n' "Content-Type: text/plain\r\n\r\n\r\n" "--BOUNDARY--\r\n" "".encode("ascii") ) def test_multipart_encode_files_raises_exception_with_StringIO_content() -> None: url = "https://www.example.com" files = {"file": ("test.txt", io.StringIO("content"), "text/plain")} with pytest.raises(TypeError): httpx2.Request("POST", url, data={}, files=files) # type: ignore[arg-type] def test_multipart_encode_files_raises_exception_with_text_mode_file() -> None: url = "https://www.example.com" with tempfile.TemporaryFile(mode="w") as upload: files = {"file": ("test.txt", upload, "text/plain")} with pytest.raises(TypeError): httpx2.Request("POST", url, data={}, files=files) # type: ignore[arg-type] def test_multipart_encode_non_seekable_filelike() -> None: """ Test that special readable but non-seekable filelike objects are supported. In this case uploads with use 'Transfer-Encoding: chunked', instead of a 'Content-Length' header. """ class IteratorIO(io.IOBase): def __init__(self, iterator: typing.Iterator[bytes]) -> None: self._iterator = iterator def read(self, *args: typing.Any) -> bytes: return b"".join(self._iterator) def data() -> typing.Iterator[bytes]: yield b"Hello" yield b"World" url = "https://www.example.com/" headers = {"Content-Type": "multipart/form-data; boundary=BOUNDARY"} fileobj: typing.Any = IteratorIO(data()) files = {"file": fileobj} request = httpx2.Request("POST", url, headers=headers, files=files) request.read() assert request.headers == { "Host": "www.example.com", "Content-Type": "multipart/form-data; boundary=BOUNDARY", "Transfer-Encoding": "chunked", } assert request.content == ( b"--BOUNDARY\r\n" b'Content-Disposition: form-data; name="file"; filename="upload"\r\n' b"Content-Type: application/octet-stream\r\n" b"\r\n" b"HelloWorld\r\n" b"--BOUNDARY--\r\n" ) def test_multipart_rewinds_files() -> None: with tempfile.TemporaryFile() as upload: upload.write(b"Hello, world!") transport = httpx2.MockTransport(echo_request_content) client = httpx2.Client(transport=transport) files = {"file": upload} response = client.post("http://127.0.0.1:8000/", files=files) assert response.status_code == 200 assert b"\r\nHello, world!\r\n" in response.content # POSTing the same file instance a second time should have the same content. files = {"file": upload} response = client.post("http://127.0.0.1:8000/", files=files) assert response.status_code == 200 assert b"\r\nHello, world!\r\n" in response.content class TestHeaderParamHTML5Formatting: def test_unicode(self) -> None: filename = "n\u00e4me" expected = b'filename="n\xc3\xa4me"' files = {"upload": (filename, b"")} request = httpx2.Request("GET", "https://www.example.com", files=files) assert expected in request.read() def test_ascii(self) -> None: filename = "name" expected = b'filename="name"' files = {"upload": (filename, b"")} request = httpx2.Request("GET", "https://www.example.com", files=files) assert expected in request.read() def test_unicode_escape(self) -> None: filename = "hello\\world\u0022" expected = b'filename="hello\\\\world%22"' files = {"upload": (filename, b"")} request = httpx2.Request("GET", "https://www.example.com", files=files) assert expected in request.read() def test_unicode_with_control_character(self) -> None: filename = "hello\x1a\x1b\x1c" expected = b'filename="hello%1A\x1b%1C"' files = {"upload": (filename, b"")} request = httpx2.Request("GET", "https://www.example.com", files=files) assert expected in request.read() pydantic-httpx2-9b7ee8e/tests/httpx2/test_sse.py000066400000000000000000000266001521723372100220730ustar00rootroot00000000000000from __future__ import annotations from collections.abc import AsyncIterator, Iterator import pytest import httpx2 SSE_BODY = b": this is a comment\nevent: ping\ndata: hello\nid: 1\nretry: 500\n\ndata: first\ndata: second\n\n" def sse_handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=SSE_BODY, headers={"Content-Type": "text/event-stream"}) def test_sse_sync() -> None: with httpx2.Client(transport=httpx2.MockTransport(sse_handler)) as client: with client.sse("http://testserver/sse") as source: events = list(source) assert events == [ httpx2.ServerSentEvent(event="ping", data="hello", id="1", retry=500), httpx2.ServerSentEvent(event="message", data="first\nsecond", id="1"), ] @pytest.mark.anyio async def test_sse_async() -> None: async with httpx2.AsyncClient(transport=httpx2.MockTransport(sse_handler)) as client: async with client.sse("http://testserver/sse") as source: events = [event async for event in source] assert events == [ httpx2.ServerSentEvent(event="ping", data="hello", id="1", retry=500), httpx2.ServerSentEvent(event="message", data="first\nsecond", id="1"), ] def test_default_event_is_message() -> None: def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=b"data: hi\n\n", headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: (event,) = list(source) assert event.event == "message" assert event.data == "hi" assert event.id == "" assert event.retry is None def test_json() -> None: def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=b'data: {"x": 1}\n\n', headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: (event,) = list(source) assert event.json() == {"x": 1} def test_invalid_retry_is_ignored() -> None: def handler(request: httpx2.Request) -> httpx2.Response: body = b"retry: not-a-number\ndata: hi\n\n" return httpx2.Response(200, content=body, headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: (event,) = list(source) assert event.retry is None def test_id_with_null_is_ignored() -> None: def handler(request: httpx2.Request) -> httpx2.Response: body = b"id: a\0b\ndata: hi\n\n" return httpx2.Response(200, content=body, headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: (event,) = list(source) assert event.id == "" def test_field_without_value() -> None: def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=b"data\n\n", headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: (event,) = list(source) assert event.data == "" def test_last_event_id_persists() -> None: def handler(request: httpx2.Request) -> httpx2.Response: body = b"id: 1\ndata: a\n\ndata: b\n\n" return httpx2.Response(200, content=body, headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: events = list(source) assert [event.id for event in events] == ["1", "1"] def test_blank_lines_after_id_do_not_dispatch() -> None: def handler(request: httpx2.Request) -> httpx2.Response: body = b"id: 1\ndata: a\n\n\n\ndata: b\n\n" return httpx2.Response(200, content=body, headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: events = list(source) assert [event.data for event in events] == ["a", "b"] def test_id_only_block_is_dispatched() -> None: def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=b"id: 1\n\n", headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: (event,) = list(source) assert event.id == "1" assert event.data == "" @pytest.mark.parametrize( "content_type", ["text/event-stream", "text/event-stream; charset=utf-8", "Text/Event-Stream", "TEXT/EVENT-STREAM"], ) def test_content_type_accepted(content_type: str) -> None: def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=b"data: hi\n\n", headers={"Content-Type": content_type}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: (event,) = list(source) assert event.data == "hi" def test_content_type_mismatch_raises() -> None: def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=b"data: hi\n\n", headers={"Content-Type": "application/json"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: with pytest.raises(httpx2.SSEError, match="text/event-stream"): list(source) @pytest.mark.anyio async def test_content_type_mismatch_raises_async() -> None: def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=b"data: hi\n\n", headers={"Content-Type": "application/json"}) async with httpx2.AsyncClient(transport=httpx2.MockTransport(handler)) as client: async with client.sse("http://testserver/sse") as source: with pytest.raises(httpx2.SSEError, match="text/event-stream"): [event async for event in source] def test_sets_sse_headers() -> None: captured: dict[str, str] = {} def handler(request: httpx2.Request) -> httpx2.Response: captured.update(request.headers) return httpx2.Response(200, content=b"data: hi\n\n", headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: list(source) assert captured["accept"] == "text/event-stream" assert captured["cache-control"] == "no-store" def test_user_headers_take_precedence() -> None: captured: dict[str, str] = {} def handler(request: httpx2.Request) -> httpx2.Response: captured.update(request.headers) return httpx2.Response(200, content=b"data: hi\n\n", headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse", headers={"Accept": "text/event-stream, application/json"}) as source: list(source) assert captured["accept"] == "text/event-stream, application/json" def test_response_is_accessible() -> None: with httpx2.Client(transport=httpx2.MockTransport(sse_handler)) as client: with client.sse("http://testserver/sse") as source: assert isinstance(source.response, httpx2.Response) assert source.response.status_code == 200 def test_post_method() -> None: captured: list[str] = [] def handler(request: httpx2.Request) -> httpx2.Response: captured.append(request.method) return httpx2.Response(200, content=b"data: hi\n\n", headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse", method="POST", json={"q": 1}) as source: list(source) assert captured == ["POST"] def test_chunk_boundaries_and_crlf_sync() -> None: def chunks() -> Iterator[bytes]: yield b"data: he" yield b"llo\r\n\r" yield b"\ndata: wor" yield b"ld\r\n\r\n" def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=chunks(), headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: events = list(source) assert [event.data for event in events] == ["hello", "world"] @pytest.mark.anyio async def test_chunk_boundaries_and_crlf_async() -> None: async def chunks() -> AsyncIterator[bytes]: yield b"data: he" yield b"llo\r\n\r" yield b"\ndata: wor" yield b"ld\r\n\r\n" def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=chunks(), headers={"Content-Type": "text/event-stream"}) async with httpx2.AsyncClient(transport=httpx2.MockTransport(handler)) as client: async with client.sse("http://testserver/sse") as source: events = [event async for event in source] assert [event.data for event in events] == ["hello", "world"] def test_event_without_trailing_blank_line() -> None: def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=b"data: hi", headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: events = list(source) assert events == [] def test_leading_blank_line_is_ignored() -> None: def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=b"\ndata: hi\n\n", headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: (event,) = list(source) assert event.data == "hi" def test_event_dispatched_at_eof_on_trailing_cr_sync() -> None: def chunks() -> Iterator[bytes]: yield b"data: hi\n" yield b"\r" def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=chunks(), headers={"Content-Type": "text/event-stream"}) with httpx2.Client(transport=httpx2.MockTransport(handler)) as client: with client.sse("http://testserver/sse") as source: (event,) = list(source) assert event.data == "hi" @pytest.mark.anyio async def test_event_dispatched_at_eof_on_trailing_cr_async() -> None: async def chunks() -> AsyncIterator[bytes]: yield b"data: hi\n" yield b"\r" def handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=chunks(), headers={"Content-Type": "text/event-stream"}) async with httpx2.AsyncClient(transport=httpx2.MockTransport(handler)) as client: async with client.sse("http://testserver/sse") as source: events = [event async for event in source] assert [event.data for event in events] == ["hi"] pydantic-httpx2-9b7ee8e/tests/httpx2/test_status_codes.py000066400000000000000000000013771521723372100240050ustar00rootroot00000000000000import httpx2 def test_status_code_as_int() -> None: # mypy doesn't (yet) recognize that IntEnum members are ints, so ignore it here assert httpx2.codes.NOT_FOUND == 404 # type: ignore[comparison-overlap] assert str(httpx2.codes.NOT_FOUND) == "404" def test_status_code_value_lookup() -> None: assert httpx2.codes(404) == 404 def test_status_code_phrase_lookup() -> None: assert httpx2.codes["NOT_FOUND"] == 404 def test_lowercase_status_code() -> None: assert httpx2.codes.not_found == 404 # type: ignore def test_reason_phrase_for_status_code() -> None: assert httpx2.codes.get_reason_phrase(404) == "Not Found" def test_reason_phrase_for_unknown_status_code() -> None: assert httpx2.codes.get_reason_phrase(499) == "" pydantic-httpx2-9b7ee8e/tests/httpx2/test_timeouts.py000066400000000000000000000036371521723372100231570ustar00rootroot00000000000000from __future__ import annotations import typing import pytest import httpx2 if typing.TYPE_CHECKING: from conftest import TestServer @pytest.mark.anyio async def test_read_timeout(server: TestServer) -> None: timeout = httpx2.Timeout(None, read=1e-6) async with httpx2.AsyncClient(timeout=timeout) as client: with pytest.raises(httpx2.ReadTimeout): await client.get(server.url.copy_with(path="/slow_response")) @pytest.mark.anyio async def test_write_timeout(server: TestServer) -> None: timeout = httpx2.Timeout(None, write=1e-6) async with httpx2.AsyncClient(timeout=timeout) as client: with pytest.raises(httpx2.WriteTimeout): data = b"*" * 1024 * 1024 * 100 await client.put(server.url.copy_with(path="/slow_response"), content=data) @pytest.mark.anyio @pytest.mark.network async def test_connect_timeout(server: TestServer) -> None: timeout = httpx2.Timeout(None, connect=1e-6) async with httpx2.AsyncClient(timeout=timeout) as client: with pytest.raises(httpx2.ConnectTimeout): # See https://stackoverflow.com/questions/100841/ await client.get("http://10.255.255.1/") @pytest.mark.anyio async def test_pool_timeout(server: TestServer) -> None: limits = httpx2.Limits(max_connections=1) timeout = httpx2.Timeout(None, pool=1e-4) async with httpx2.AsyncClient(limits=limits, timeout=timeout) as client: with pytest.raises(httpx2.PoolTimeout): async with client.stream("GET", server.url): await client.get(server.url) @pytest.mark.anyio async def test_async_client_new_request_send_timeout(server: TestServer) -> None: timeout = httpx2.Timeout(1e-6) async with httpx2.AsyncClient(timeout=timeout) as client: with pytest.raises(httpx2.TimeoutException): await client.send(httpx2.Request("GET", server.url.copy_with(path="/slow_response"))) pydantic-httpx2-9b7ee8e/tests/httpx2/test_utils.py000066400000000000000000000115301521723372100224350ustar00rootroot00000000000000from __future__ import annotations import json import logging import os import random import typing import pytest import httpx2 from httpx2._utils import URLPattern, get_environment_proxies if typing.TYPE_CHECKING: from conftest import TestServer @pytest.mark.parametrize( "encoding", ( "utf-32", "utf-8-sig", "utf-16", "utf-8", "utf-16-be", "utf-16-le", "utf-32-be", "utf-32-le", ), ) def test_encoded(encoding: str) -> None: content = '{"abc": 123}'.encode(encoding) response = httpx2.Response(200, content=content) assert response.json() == {"abc": 123} def test_bad_utf_like_encoding() -> None: content = b"\x00\x00\x00\x00" response = httpx2.Response(200, content=content) with pytest.raises(json.decoder.JSONDecodeError): response.json() @pytest.mark.parametrize( ("encoding", "expected"), ( ("utf-16-be", "utf-16"), ("utf-16-le", "utf-16"), ("utf-32-be", "utf-32"), ("utf-32-le", "utf-32"), ), ) def test_guess_by_bom(encoding: str, expected: str) -> None: content = '\ufeff{"abc": 123}'.encode(encoding) response = httpx2.Response(200, content=content) assert response.json() == {"abc": 123} def test_logging_request(server: TestServer, caplog: pytest.LogCaptureFixture) -> None: caplog.set_level(logging.INFO) with httpx2.Client() as client: response = client.get(server.url) assert response.status_code == 200 assert caplog.record_tuples == [ ( "httpx2", logging.INFO, f'HTTP Request: GET {server.url} "HTTP/1.1 200 OK"', ) ] def test_logging_redirect_chain(server: TestServer, caplog: pytest.LogCaptureFixture) -> None: caplog.set_level(logging.INFO) redirect_url = server.url.copy_with(path="/redirect_301") with httpx2.Client(follow_redirects=True) as client: response = client.get(redirect_url) assert response.status_code == 200 assert caplog.record_tuples == [ ( "httpx2", logging.INFO, f'HTTP Request: GET {redirect_url} "HTTP/1.1 301 Moved Permanently"', ), ( "httpx2", logging.INFO, f'HTTP Request: GET {server.url} "HTTP/1.1 200 OK"', ), ] @pytest.mark.parametrize( ["environment", "proxies"], [ ({}, {}), ({"HTTP_PROXY": "http://127.0.0.1"}, {"http://": "http://127.0.0.1"}), ( {"https_proxy": "http://127.0.0.1", "HTTP_PROXY": "https://127.0.0.1"}, {"https://": "http://127.0.0.1", "http://": "https://127.0.0.1"}, ), ({"all_proxy": "http://127.0.0.1"}, {"all://": "http://127.0.0.1"}), ({"TRAVIS_APT_PROXY": "http://127.0.0.1"}, {}), ({"no_proxy": "127.0.0.1"}, {"all://127.0.0.1": None}), ({"no_proxy": "192.168.0.0/16"}, {"all://192.168.0.0/16": None}), ({"no_proxy": "::1"}, {"all://[::1]": None}), ({"no_proxy": "fe11::/16"}, {"all://[fe11::]/16": None}), ({"no_proxy": "localhost"}, {"all://localhost": None}), ({"no_proxy": "github.com"}, {"all://*github.com": None}), ({"no_proxy": ".github.com"}, {"all://*.github.com": None}), ({"no_proxy": "http://github.com"}, {"http://github.com": None}), ], ) def test_get_environment_proxies(environment: dict[str, str], proxies: dict[str, str | None]) -> None: os.environ.update(environment) assert get_environment_proxies() == proxies @pytest.mark.parametrize( ["pattern", "url", "expected"], [ ("http://example.com", "http://example.com", True), ("http://example.com", "https://example.com", False), ("http://example.com", "http://other.com", False), ("http://example.com:123", "http://example.com:123", True), ("http://example.com:123", "http://example.com:456", False), ("http://example.com:123", "http://example.com", False), ("all://example.com", "http://example.com", True), ("all://example.com", "https://example.com", True), ("http://", "http://example.com", True), ("http://", "https://example.com", False), ("all://", "https://example.com:123", True), ("", "https://example.com:123", True), ], ) def test_url_matches(pattern: str, url: str, expected: bool) -> None: url_pattern = URLPattern(pattern) assert url_pattern.matches(httpx2.URL(url)) == expected def test_pattern_priority() -> None: matchers = [ URLPattern("all://"), URLPattern("http://"), URLPattern("http://example.com"), URLPattern("http://example.com:123"), ] random.shuffle(matchers) assert sorted(matchers) == [ URLPattern("http://example.com:123"), URLPattern("http://example.com"), URLPattern("http://"), URLPattern("all://"), ] pydantic-httpx2-9b7ee8e/tests/httpx2/test_wsgi.py000066400000000000000000000142051521723372100222500ustar00rootroot00000000000000from __future__ import annotations import sys import typing import wsgiref.validate from functools import partial from io import StringIO import pytest import httpx2 if typing.TYPE_CHECKING: from _typeshed.wsgi import StartResponse, WSGIApplication, WSGIEnvironment def application_factory(output: typing.Iterable[bytes]) -> WSGIApplication: def application(environ: WSGIEnvironment, start_response: StartResponse) -> typing.Iterator[bytes]: status = "200 OK" response_headers = [ ("Content-type", "text/plain"), ] start_response(status, response_headers) yield from output return wsgiref.validate.validator(application) def echo_body(environ: WSGIEnvironment, start_response: StartResponse) -> typing.Iterable[bytes]: status = "200 OK" output = environ["wsgi.input"].read() response_headers = [ ("Content-type", "text/plain"), ] start_response(status, response_headers) return [output] def echo_body_with_response_stream(environ: WSGIEnvironment, start_response: StartResponse) -> typing.Iterable[bytes]: status = "200 OK" response_headers = [("Content-Type", "text/plain")] start_response(status, response_headers) def output_generator(f: typing.IO[bytes]) -> typing.Iterator[bytes]: while True: output = f.read(2) if not output: break yield output return output_generator(f=environ["wsgi.input"]) def raise_exc( environ: WSGIEnvironment, start_response: StartResponse, exc: type[Exception] = ValueError, ) -> typing.Iterable[bytes]: status = "500 Server Error" output = b"Nope!" response_headers = [ ("Content-type", "text/plain"), ] try: raise exc() except exc: exc_info = sys.exc_info() start_response(status, response_headers, exc_info) return [output] def log_to_wsgi_log_buffer(environ: WSGIEnvironment, start_response: StartResponse) -> typing.Iterable[bytes]: print("test1", file=environ["wsgi.errors"]) environ["wsgi.errors"].write("test2") return echo_body(environ, start_response) def test_wsgi() -> None: transport = httpx2.WSGITransport(app=application_factory([b"Hello, World!"])) client = httpx2.Client(transport=transport) response = client.get("http://www.example.org/") assert response.status_code == 200 assert response.text == "Hello, World!" def test_wsgi_upload() -> None: transport = httpx2.WSGITransport(app=echo_body) client = httpx2.Client(transport=transport) response = client.post("http://www.example.org/", content=b"example") assert response.status_code == 200 assert response.text == "example" def test_wsgi_upload_with_response_stream() -> None: transport = httpx2.WSGITransport(app=echo_body_with_response_stream) client = httpx2.Client(transport=transport) response = client.post("http://www.example.org/", content=b"example") assert response.status_code == 200 assert response.text == "example" def test_wsgi_exc() -> None: transport = httpx2.WSGITransport(app=raise_exc) client = httpx2.Client(transport=transport) with pytest.raises(ValueError): client.get("http://www.example.org/") def test_wsgi_http_error() -> None: transport = httpx2.WSGITransport(app=partial(raise_exc, exc=RuntimeError)) client = httpx2.Client(transport=transport) with pytest.raises(RuntimeError): client.get("http://www.example.org/") def test_wsgi_generator() -> None: output = [b"", b"", b"Some content", b" and more content"] transport = httpx2.WSGITransport(app=application_factory(output)) client = httpx2.Client(transport=transport) response = client.get("http://www.example.org/") assert response.status_code == 200 assert response.text == "Some content and more content" def test_wsgi_generator_empty() -> None: output = [b"", b"", b"", b""] transport = httpx2.WSGITransport(app=application_factory(output)) client = httpx2.Client(transport=transport) response = client.get("http://www.example.org/") assert response.status_code == 200 assert response.text == "" def test_logging() -> None: buffer = StringIO() transport = httpx2.WSGITransport(app=log_to_wsgi_log_buffer, wsgi_errors=buffer) client = httpx2.Client(transport=transport) response = client.post("http://www.example.org/", content=b"example") assert response.status_code == 200 # no errors buffer.seek(0) assert buffer.read() == "test1\ntest2" @pytest.mark.parametrize( "url, expected_server_port", [ pytest.param("http://www.example.org", "80", id="auto-http"), pytest.param("https://www.example.org", "443", id="auto-https"), pytest.param("http://www.example.org:8000", "8000", id="explicit-port"), ], ) def test_wsgi_server_port(url: str, expected_server_port: str) -> None: """ SERVER_PORT is populated correctly from the requested URL. """ hello_world_app = application_factory([b"Hello, World!"]) server_port: str | None = None def app(environ: WSGIEnvironment, start_response: StartResponse) -> typing.Iterable[bytes]: nonlocal server_port server_port = environ["SERVER_PORT"] return hello_world_app(environ, start_response) transport = httpx2.WSGITransport(app=app) client = httpx2.Client(transport=transport) response = client.get(url) assert response.status_code == 200 assert response.text == "Hello, World!" assert server_port == expected_server_port def test_wsgi_server_protocol() -> None: server_protocol = None def app(environ: WSGIEnvironment, start_response: StartResponse) -> typing.Iterable[bytes]: nonlocal server_protocol server_protocol = environ["SERVER_PROTOCOL"] start_response("200 OK", [("Content-Type", "text/plain")]) return [b"success"] transport = httpx2.WSGITransport(app=app) with httpx2.Client(transport=transport, base_url="http://testserver") as client: response = client.get("/") assert response.status_code == 200 assert response.text == "success" assert server_protocol == "HTTP/1.1" pydantic-httpx2-9b7ee8e/tests/test_benchmark.py000066400000000000000000000121461521723372100220020ustar00rootroot00000000000000from __future__ import annotations import gzip import json from typing import TYPE_CHECKING, Any import pytest import httpx2 from httpx2._decoders import GZipDecoder, LineDecoder if TYPE_CHECKING: from pytest_codspeed import BenchmarkFixture pytestmark = pytest.mark.benchmark TYPICAL_URL = "https://www.example.org:8443/path/to/resource?key=value&other=1#frag" HEADERS: list[tuple[str, str]] = [ ("host", "example.org"), ("user-agent", "httpx2-bench/1.0"), ("accept", "*/*"), ("accept-encoding", "gzip, deflate, br"), *[(f"x-custom-{i}", f"value-{i}") for i in range(16)], ] SMALL_JSON: dict[str, Any] = { "id": 12345, "items": [{"sku": f"SKU-{i}", "qty": i, "price": i * 1.5} for i in range(50)], } MEDIUM_JSON: dict[str, Any] = { "records": [ {"id": i, "name": f"record-{i}", "tags": [f"t{j}" for j in range(8)], "active": bool(i % 2)} for i in range(256) ], } MEDIUM_JSON_BODY = json.dumps(MEDIUM_JSON).encode() QUERY_STRING = "key=value&other=1&" + "&".join(f"f{i}={i}" for i in range(16)) GZIP_BODY = gzip.compress(MEDIUM_JSON_BODY) SET_COOKIE_HEADERS: list[tuple[str, str]] = [ ("set-cookie", f"session{i}=value{i}; Path=/; Domain=example.org; HttpOnly") for i in range(8) ] DIGEST_CHALLENGE = 'Digest realm="httpx@example.org", qop="auth", nonce="abc123nonce", opaque="xyz789opaque"' # --- Micro: pure httpx2 hot paths ------------------------------------------------- def test_bench_url_parse(benchmark: BenchmarkFixture) -> None: benchmark(httpx2.URL, TYPICAL_URL) def test_bench_url_join(benchmark: BenchmarkFixture) -> None: base = httpx2.URL(TYPICAL_URL) benchmark(base.join, "/path/to/resource?key=value") def test_bench_headers_construct(benchmark: BenchmarkFixture) -> None: benchmark(httpx2.Headers, HEADERS) def test_bench_headers_raw(benchmark: BenchmarkFixture) -> None: headers = httpx2.Headers(HEADERS) benchmark(lambda: headers.raw) def test_bench_headers_lookup(benchmark: BenchmarkFixture) -> None: headers = httpx2.Headers(HEADERS) benchmark(lambda: headers["accept-encoding"]) def test_bench_queryparams_parse(benchmark: BenchmarkFixture) -> None: benchmark(httpx2.QueryParams, QUERY_STRING) def test_bench_queryparams_merge(benchmark: BenchmarkFixture) -> None: params = httpx2.QueryParams(QUERY_STRING) benchmark(lambda: params.merge({"added": "1", "other": "2"})) def test_bench_gzip_decode(benchmark: BenchmarkFixture) -> None: def decode() -> bytes: decoder = GZipDecoder() return decoder.decode(GZIP_BODY) + decoder.flush() benchmark(decode) def test_bench_line_decoder(benchmark: BenchmarkFixture) -> None: text = "\n".join(f"line number {i} with some content" for i in range(256)) + "\n" def split() -> list[str]: decoder = LineDecoder() return decoder.decode(text) + decoder.flush() benchmark(split) def test_bench_extract_cookies(benchmark: BenchmarkFixture) -> None: request = httpx2.Request("GET", "https://example.org/") def extract() -> None: response = httpx2.Response(200, headers=SET_COOKIE_HEADERS, request=request) httpx2.Cookies().extract_cookies(response) benchmark(extract) def test_bench_digest_auth_flow(benchmark: BenchmarkFixture) -> None: challenge = httpx2.Response( 401, headers=[("www-authenticate", DIGEST_CHALLENGE)], request=httpx2.Request("GET", "https://example.org/path/to/resource"), ) def flow() -> None: auth = httpx2.DigestAuth(username="user", password="password123") generator = auth.sync_auth_flow(httpx2.Request("GET", "https://example.org/path/to/resource")) next(generator) try: generator.send(challenge) except StopIteration: pass benchmark(flow) def test_bench_request_json_post(benchmark: BenchmarkFixture) -> None: benchmark(lambda: httpx2.Request("POST", TYPICAL_URL, headers=HEADERS, json=SMALL_JSON)) def test_bench_request_multipart(benchmark: BenchmarkFixture) -> None: def build() -> None: request = httpx2.Request( "POST", "https://example.org/upload", data={"name": "value", "other": "field", "description": "a longer text field"}, files={"small": ("hello.txt", b"x" * 4096, "text/plain")}, ) request.read() benchmark(build) def test_bench_response_read_json(benchmark: BenchmarkFixture) -> None: def build() -> Any: response = httpx2.Response( 200, headers=[("content-type", "application/json")], content=MEDIUM_JSON_BODY, ) return response.json() benchmark(build) # --- Macro: end-to-end client cycle via MockTransport ----------------------------- def _json_handler(request: httpx2.Request) -> httpx2.Response: return httpx2.Response(200, content=MEDIUM_JSON_BODY, headers=[("content-type", "application/json")]) def test_bench_client_post_json(benchmark: BenchmarkFixture) -> None: with httpx2.Client(transport=httpx2.MockTransport(_json_handler)) as client: benchmark(lambda: client.post(TYPICAL_URL, json=MEDIUM_JSON).json()) pydantic-httpx2-9b7ee8e/uv.lock000066400000000000000000027527121521723372100166150ustar00rootroot00000000000000version = 1 revision = 3 requires-python = ">=3.10" resolution-markers = [ "python_full_version >= '3.13'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", "python_full_version < '3.11'", ] [options] exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values. exclude-newer-span = "P7D" [options.exclude-newer-package] idna = "2026-06-03T00:00:00Z" [manifest] members = [ "httpcore2", "httpx2", ] [manifest.dependency-groups] bench = [ { name = "aiohttp", specifier = ">=3.10.2" }, { name = "matplotlib", specifier = ">=3.9" }, { name = "pyinstrument", specifier = ">=4.6.2" }, { name = "urllib3", specifier = ">=2.2.2" }, ] dev = [ { name = "build", specifier = "==1.3.0" }, { name = "chardet", specifier = "==6.0.0.post1" }, { name = "coverage", extras = ["toml"], specifier = "==7.10.6" }, { name = "cryptography", specifier = "==46.0.7" }, { name = "httpcore2", extras = ["asyncio", "trio", "http2", "socks"], editable = "src/httpcore2" }, { name = "httpx2", extras = ["brotli", "cli", "http2", "socks", "zstd"], editable = "src/httpx2" }, { name = "mypy", specifier = "==1.17.1" }, { name = "pytest", specifier = ">=9.0.3" }, { name = "pytest-codspeed", specifier = ">=4.1.1" }, { name = "pytest-httpbin", specifier = "==2.0.0" }, { name = "pytest-trio", specifier = "==0.8.0" }, { name = "ruff", specifier = "==0.15.13" }, { name = "trio", specifier = "==0.31.0" }, { name = "trio-typing", specifier = "==0.10.0" }, { name = "trustme", specifier = "==1.2.1" }, { name = "twine", specifier = "==6.1.0" }, { name = "uvicorn", specifier = ">=0.35" }, { name = "werkzeug", specifier = ">=3.1.6" }, ] docs = [ { name = "mkdocstrings", extras = ["python"], specifier = ">=0.27" }, { name = "zensical", specifier = ">=0.0.41" }, ] [[package]] name = "aiohappyeyeballs" version = "2.6.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, ] [[package]] name = "aiohttp" version = "3.13.5" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, { name = "async-timeout", marker = "python_full_version < '3.11'" }, { name = "attrs" }, { name = "frozenlist" }, { name = "multidict" }, { name = "propcache" }, { name = "yarl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/77/9a/152096d4808df8e4268befa55fba462f440f14beab85e8ad9bf990516918/aiohttp-3.13.5.tar.gz", hash = "sha256:9d98cc980ecc96be6eb4c1994ce35d28d8b1f5e5208a23b421187d1209dbb7d1", size = 7858271, upload-time = "2026-03-31T22:01:03.343Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/bd/85/cebc47ee74d8b408749073a1a46c6fcba13d170dc8af7e61996c6c9394ac/aiohttp-3.13.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:02222e7e233295f40e011c1b00e3b0bd451f22cf853a0304c3595633ee47da4b", size = 750547, upload-time = "2026-03-31T21:56:30.024Z" }, { url = "https://files.pythonhosted.org/packages/05/98/afd308e35b9d3d8c9ec54c0918f1d722c86dc17ddfec272fcdbcce5a3124/aiohttp-3.13.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bace460460ed20614fa6bc8cb09966c0b8517b8c58ad8046828c6078d25333b5", size = 503535, upload-time = "2026-03-31T21:56:31.935Z" }, { url = "https://files.pythonhosted.org/packages/6f/4d/926c183e06b09d5270a309eb50fbde7b09782bfd305dec1e800f329834fb/aiohttp-3.13.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f546a4dc1e6a5edbb9fd1fd6ad18134550e096a5a43f4ad74acfbd834fc6670", size = 497830, upload-time = "2026-03-31T21:56:33.654Z" }, { url = "https://files.pythonhosted.org/packages/e4/d6/f47d1c690f115a5c2a5e8938cce4a232a5be9aac5c5fb2647efcbbbda333/aiohttp-3.13.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c86969d012e51b8e415a8c6ce96f7857d6a87d6207303ab02d5d11ef0cad2274", size = 1682474, upload-time = "2026-03-31T21:56:35.513Z" }, { url = "https://files.pythonhosted.org/packages/01/44/056fd37b1bb52eac760303e5196acc74d9d546631b035704ae5927f7b4ac/aiohttp-3.13.5-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b6f6cd1560c5fa427e3b6074bb24d2c64e225afbb7165008903bd42e4e33e28a", size = 1655259, upload-time = "2026-03-31T21:56:37.843Z" }, { url = "https://files.pythonhosted.org/packages/91/9f/78eb1a20c1c28ae02f6a3c0f4d7b0dcc66abce5290cadd53d78ce3084175/aiohttp-3.13.5-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:636bc362f0c5bbc7372bc3ae49737f9e3030dbce469f0f422c8f38079780363d", size = 1736204, upload-time = "2026-03-31T21:56:39.822Z" }, { url = "https://files.pythonhosted.org/packages/de/6c/d20d7de23f0b52b8c1d9e2033b2db1ac4dacbb470bb74c56de0f5f86bb4f/aiohttp-3.13.5-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6a7cbeb06d1070f1d14895eeeed4dac5913b22d7b456f2eb969f11f4b3993796", size = 1826198, upload-time = "2026-03-31T21:56:41.378Z" }, { url = "https://files.pythonhosted.org/packages/2f/86/a6f3ff1fd795f49545a7c74b2c92f62729135d73e7e4055bf74da5a26c82/aiohttp-3.13.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca9ef7517fd7874a1a08970ae88f497bf5c984610caa0bf40bd7e8450852b95", size = 1681329, upload-time = "2026-03-31T21:56:43.374Z" }, { url = "https://files.pythonhosted.org/packages/fb/68/84cd3dab6b7b4f3e6fe9459a961acb142aaab846417f6e8905110d7027e5/aiohttp-3.13.5-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:019a67772e034a0e6b9b17c13d0a8fe56ad9fb150fc724b7f3ffd3724288d9e5", size = 1560023, upload-time = "2026-03-31T21:56:45.031Z" }, { url = "https://files.pythonhosted.org/packages/41/2c/db61b64b0249e30f954a65ab4cb4970ced57544b1de2e3c98ee5dc24165f/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f34ecee82858e41dd217734f0c41a532bd066bcaab636ad830f03a30b2a96f2a", size = 1652372, upload-time = "2026-03-31T21:56:47.075Z" }, { url = "https://files.pythonhosted.org/packages/25/6f/e96988a6c982d047810c772e28c43c64c300c943b0ed5c1c0c4ce1e1027c/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:4eac02d9af4813ee289cd63a361576da36dba57f5a1ab36377bc2600db0cbb73", size = 1662031, upload-time = "2026-03-31T21:56:48.835Z" }, { url = "https://files.pythonhosted.org/packages/b7/26/a56feace81f3d347b4052403a9d03754a0ab23f7940780dada0849a38c92/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4beac52e9fe46d6abf98b0176a88154b742e878fdf209d2248e99fcdf73cd297", size = 1708118, upload-time = "2026-03-31T21:56:50.833Z" }, { url = "https://files.pythonhosted.org/packages/78/6e/b6173a8ff03d01d5e1a694bc06764b5dad1df2d4ed8f0ceec12bb3277936/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:c180f480207a9b2475f2b8d8bd7204e47aec952d084b2a2be58a782ffcf96074", size = 1548667, upload-time = "2026-03-31T21:56:52.81Z" }, { url = "https://files.pythonhosted.org/packages/16/13/13296ffe2c132d888b3fe2c195c8b9c0c24c89c3fa5cc2c44464dc23b22e/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2837fb92951564d6339cedae4a7231692aa9f73cbc4fb2e04263b96844e03b4e", size = 1724490, upload-time = "2026-03-31T21:56:54.541Z" }, { url = "https://files.pythonhosted.org/packages/7a/b4/1f1c287f4a79782ef36e5a6e62954c85343bc30470d862d30bd5f26c9fa2/aiohttp-3.13.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d9010032a0b9710f58012a1e9c222528763d860ba2ee1422c03473eab47703e7", size = 1667109, upload-time = "2026-03-31T21:56:56.21Z" }, { url = "https://files.pythonhosted.org/packages/ef/42/8461a2aaf60a8f4ea4549a4056be36b904b0eb03d97ca9a8a2604681a500/aiohttp-3.13.5-cp310-cp310-win32.whl", hash = "sha256:7c4b6668b2b2b9027f209ddf647f2a4407784b5d88b8be4efcc72036f365baf9", size = 439478, upload-time = "2026-03-31T21:56:58.292Z" }, { url = "https://files.pythonhosted.org/packages/e5/71/06956304cb5ee439dfe8d86e1b2e70088bd88ed1ced1f42fb29e5d855f0e/aiohttp-3.13.5-cp310-cp310-win_amd64.whl", hash = "sha256:cd3db5927bf9167d5a6157ddb2f036f6b6b0ad001ac82355d43e97a4bde76d76", size = 462047, upload-time = "2026-03-31T21:57:00.257Z" }, { url = "https://files.pythonhosted.org/packages/d6/f5/a20c4ac64aeaef1679e25c9983573618ff765d7aa829fa2b84ae7573169e/aiohttp-3.13.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ab7229b6f9b5c1ba4910d6c41a9eb11f543eadb3f384df1b4c293f4e73d44d6", size = 757513, upload-time = "2026-03-31T21:57:02.146Z" }, { url = "https://files.pythonhosted.org/packages/75/0a/39fa6c6b179b53fcb3e4b3d2b6d6cad0180854eda17060c7218540102bef/aiohttp-3.13.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f14c50708bb156b3a3ca7230b3d820199d56a48e3af76fa21c2d6087190fe3d", size = 506748, upload-time = "2026-03-31T21:57:04.275Z" }, { url = "https://files.pythonhosted.org/packages/87/ec/e38ce072e724fd7add6243613f8d1810da084f54175353d25ccf9f9c7e5a/aiohttp-3.13.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7d2f8616f0ff60bd332022279011776c3ac0faa0f1b463f7bb12326fbc97a1c", size = 501673, upload-time = "2026-03-31T21:57:06.208Z" }, { url = "https://files.pythonhosted.org/packages/ba/ba/3bc7525d7e2beaa11b309a70d48b0d3cfc3c2089ec6a7d0820d59c657053/aiohttp-3.13.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2567b72e1ffc3ab25510db43f355b29eeada56c0a622e58dcdb19530eb0a3cb", size = 1763757, upload-time = "2026-03-31T21:57:07.882Z" }, { url = "https://files.pythonhosted.org/packages/5e/ab/e87744cf18f1bd78263aba24924d4953b41086bd3a31d22452378e9028a0/aiohttp-3.13.5-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fb0540c854ac9c0c5ad495908fdfd3e332d553ec731698c0e29b1877ba0d2ec6", size = 1720152, upload-time = "2026-03-31T21:57:09.946Z" }, { url = "https://files.pythonhosted.org/packages/6b/f3/ed17a6f2d742af17b50bae2d152315ed1b164b07a5fd5cc1754d99e4dfa5/aiohttp-3.13.5-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9883051c6972f58bfc4ebb2116345ee2aa151178e99c3f2b2bbe2af712abd13", size = 1818010, upload-time = "2026-03-31T21:57:12.157Z" }, { url = "https://files.pythonhosted.org/packages/53/06/ecbc63dc937192e2a5cb46df4d3edb21deb8225535818802f210a6ea5816/aiohttp-3.13.5-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2294172ce08a82fb7c7273485895de1fa1186cc8294cfeb6aef4af42ad261174", size = 1907251, upload-time = "2026-03-31T21:57:14.023Z" }, { url = "https://files.pythonhosted.org/packages/7e/a5/0521aa32c1ddf3aa1e71dcc466be0b7db2771907a13f18cddaa45967d97b/aiohttp-3.13.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a807cabd5115fb55af198b98178997a5e0e57dead43eb74a93d9c07d6d4a7dc", size = 1759969, upload-time = "2026-03-31T21:57:16.146Z" }, { url = "https://files.pythonhosted.org/packages/f6/78/a38f8c9105199dd3b9706745865a8a59d0041b6be0ca0cc4b2ccf1bab374/aiohttp-3.13.5-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:aa6d0d932e0f39c02b80744273cd5c388a2d9bc07760a03164f229c8e02662f6", size = 1616871, upload-time = "2026-03-31T21:57:17.856Z" }, { url = "https://files.pythonhosted.org/packages/6f/41/27392a61ead8ab38072105c71aa44ff891e71653fe53d576a7067da2b4e8/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:60869c7ac4aaabe7110f26499f3e6e5696eae98144735b12a9c3d9eae2b51a49", size = 1739844, upload-time = "2026-03-31T21:57:19.679Z" }, { url = "https://files.pythonhosted.org/packages/6e/55/5564e7ae26d94f3214250009a0b1c65a0c6af4bf88924ccb6fdab901de28/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:26d2f8546f1dfa75efa50c3488215a903c0168d253b75fba4210f57ab77a0fb8", size = 1731969, upload-time = "2026-03-31T21:57:22.006Z" }, { url = "https://files.pythonhosted.org/packages/6d/c5/705a3929149865fc941bcbdd1047b238e4a72bcb215a9b16b9d7a2e8d992/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f1162a1492032c82f14271e831c8f4b49f2b6078f4f5fc74de2c912fa225d51d", size = 1795193, upload-time = "2026-03-31T21:57:24.256Z" }, { url = "https://files.pythonhosted.org/packages/a6/19/edabed62f718d02cff7231ca0db4ef1c72504235bc467f7b67adb1679f48/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:8b14eb3262fad0dc2f89c1a43b13727e709504972186ff6a99a3ecaa77102b6c", size = 1606477, upload-time = "2026-03-31T21:57:26.364Z" }, { url = "https://files.pythonhosted.org/packages/de/fc/76f80ef008675637d88d0b21584596dc27410a990b0918cb1e5776545b5b/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ca9ac61ac6db4eb6c2a0cd1d0f7e1357647b638ccc92f7e9d8d133e71ed3c6ac", size = 1813198, upload-time = "2026-03-31T21:57:28.316Z" }, { url = "https://files.pythonhosted.org/packages/e5/67/5b3ac26b80adb20ea541c487f73730dc8fa107d632c998f25bbbab98fcda/aiohttp-3.13.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7996023b2ed59489ae4762256c8516df9820f751cf2c5da8ed2fb20ee50abab3", size = 1752321, upload-time = "2026-03-31T21:57:30.549Z" }, { url = "https://files.pythonhosted.org/packages/88/06/e4a2e49255ea23fa4feeb5ab092d90240d927c15e47b5b5c48dff5a9ce29/aiohttp-3.13.5-cp311-cp311-win32.whl", hash = "sha256:77dfa48c9f8013271011e51c00f8ada19851f013cde2c48fca1ba5e0caf5bb06", size = 439069, upload-time = "2026-03-31T21:57:32.388Z" }, { url = "https://files.pythonhosted.org/packages/c0/43/8c7163a596dab4f8be12c190cf467a1e07e4734cf90eebb39f7f5d53fc6a/aiohttp-3.13.5-cp311-cp311-win_amd64.whl", hash = "sha256:d3a4834f221061624b8887090637db9ad4f61752001eae37d56c52fddade2dc8", size = 462859, upload-time = "2026-03-31T21:57:34.455Z" }, { url = "https://files.pythonhosted.org/packages/be/6f/353954c29e7dcce7cf00280a02c75f30e133c00793c7a2ed3776d7b2f426/aiohttp-3.13.5-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:023ecba036ddd840b0b19bf195bfae970083fd7024ce1ac22e9bba90464620e9", size = 748876, upload-time = "2026-03-31T21:57:36.319Z" }, { url = "https://files.pythonhosted.org/packages/f5/1b/428a7c64687b3b2e9cd293186695affc0e1e54a445d0361743b231f11066/aiohttp-3.13.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15c933ad7920b7d9a20de151efcd05a6e38302cbf0e10c9b2acb9a42210a2416", size = 499557, upload-time = "2026-03-31T21:57:38.236Z" }, { url = "https://files.pythonhosted.org/packages/29/47/7be41556bfbb6917069d6a6634bb7dd5e163ba445b783a90d40f5ac7e3a7/aiohttp-3.13.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab2899f9fa2f9f741896ebb6fa07c4c883bfa5c7f2ddd8cf2aafa86fa981b2d2", size = 500258, upload-time = "2026-03-31T21:57:39.923Z" }, { url = "https://files.pythonhosted.org/packages/67/84/c9ecc5828cb0b3695856c07c0a6817a99d51e2473400f705275a2b3d9239/aiohttp-3.13.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a60eaa2d440cd4707696b52e40ed3e2b0f73f65be07fd0ef23b6b539c9c0b0b4", size = 1749199, upload-time = "2026-03-31T21:57:41.938Z" }, { url = "https://files.pythonhosted.org/packages/f0/d3/3c6d610e66b495657622edb6ae7c7fd31b2e9086b4ec50b47897ad6042a9/aiohttp-3.13.5-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:55b3bdd3292283295774ab585160c4004f4f2f203946997f49aac032c84649e9", size = 1721013, upload-time = "2026-03-31T21:57:43.904Z" }, { url = "https://files.pythonhosted.org/packages/49/a0/24409c12217456df0bae7babe3b014e460b0b38a8e60753d6cb339f6556d/aiohttp-3.13.5-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c2b2355dc094e5f7d45a7bb262fe7207aa0460b37a0d87027dcf21b5d890e7d5", size = 1781501, upload-time = "2026-03-31T21:57:46.285Z" }, { url = "https://files.pythonhosted.org/packages/98/9d/b65ec649adc5bccc008b0957a9a9c691070aeac4e41cea18559fef49958b/aiohttp-3.13.5-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b38765950832f7d728297689ad78f5f2cf79ff82487131c4d26fe6ceecdc5f8e", size = 1878981, upload-time = "2026-03-31T21:57:48.734Z" }, { url = "https://files.pythonhosted.org/packages/57/d8/8d44036d7eb7b6a8ec4c5494ea0c8c8b94fbc0ed3991c1a7adf230df03bf/aiohttp-3.13.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b18f31b80d5a33661e08c89e202edabf1986e9b49c42b4504371daeaa11b47c1", size = 1767934, upload-time = "2026-03-31T21:57:51.171Z" }, { url = "https://files.pythonhosted.org/packages/31/04/d3f8211f273356f158e3464e9e45484d3fb8c4ce5eb2f6fe9405c3273983/aiohttp-3.13.5-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:33add2463dde55c4f2d9635c6ab33ce154e5ecf322bd26d09af95c5f81cfa286", size = 1566671, upload-time = "2026-03-31T21:57:53.326Z" }, { url = "https://files.pythonhosted.org/packages/41/db/073e4ebe00b78e2dfcacff734291651729a62953b48933d765dc513bf798/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:327cc432fdf1356fb4fbc6fe833ad4e9f6aacb71a8acaa5f1855e4b25910e4a9", size = 1705219, upload-time = "2026-03-31T21:57:55.385Z" }, { url = "https://files.pythonhosted.org/packages/48/45/7dfba71a2f9fd97b15c95c06819de7eb38113d2cdb6319669195a7d64270/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:7c35b0bf0b48a70b4cb4fc5d7bed9b932532728e124874355de1a0af8ec4bc88", size = 1743049, upload-time = "2026-03-31T21:57:57.341Z" }, { url = "https://files.pythonhosted.org/packages/18/71/901db0061e0f717d226386a7f471bb59b19566f2cae5f0d93874b017271f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:df23d57718f24badef8656c49743e11a89fd6f5358fa8a7b96e728fda2abf7d3", size = 1749557, upload-time = "2026-03-31T21:57:59.626Z" }, { url = "https://files.pythonhosted.org/packages/08/d5/41eebd16066e59cd43728fe74bce953d7402f2b4ddfdfef2c0e9f17ca274/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:02e048037a6501a5ec1f6fc9736135aec6eb8a004ce48838cb951c515f32c80b", size = 1558931, upload-time = "2026-03-31T21:58:01.972Z" }, { url = "https://files.pythonhosted.org/packages/30/e6/4a799798bf05740e66c3a1161079bda7a3dd8e22ca392481d7a7f9af82a6/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31cebae8b26f8a615d2b546fee45d5ffb76852ae6450e2a03f42c9102260d6fe", size = 1774125, upload-time = "2026-03-31T21:58:04.007Z" }, { url = "https://files.pythonhosted.org/packages/84/63/7749337c90f92bc2cb18f9560d67aa6258c7060d1397d21529b8004fcf6f/aiohttp-3.13.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:888e78eb5ca55a615d285c3c09a7a91b42e9dd6fc699b166ebd5dee87c9ccf14", size = 1732427, upload-time = "2026-03-31T21:58:06.337Z" }, { url = "https://files.pythonhosted.org/packages/98/de/cf2f44ff98d307e72fb97d5f5bbae3bfcb442f0ea9790c0bf5c5c2331404/aiohttp-3.13.5-cp312-cp312-win32.whl", hash = "sha256:8bd3ec6376e68a41f9f95f5ed170e2fcf22d4eb27a1f8cb361d0508f6e0557f3", size = 433534, upload-time = "2026-03-31T21:58:08.712Z" }, { url = "https://files.pythonhosted.org/packages/aa/ca/eadf6f9c8fa5e31d40993e3db153fb5ed0b11008ad5d9de98a95045bed84/aiohttp-3.13.5-cp312-cp312-win_amd64.whl", hash = "sha256:110e448e02c729bcebb18c60b9214a87ba33bac4a9fa5e9a5f139938b56c6cb1", size = 460446, upload-time = "2026-03-31T21:58:10.945Z" }, { url = "https://files.pythonhosted.org/packages/78/e9/d76bf503005709e390122d34e15256b88f7008e246c4bdbe915cd4f1adce/aiohttp-3.13.5-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5029cc80718bbd545123cd8fe5d15025eccaaaace5d0eeec6bd556ad6163d61", size = 742930, upload-time = "2026-03-31T21:58:13.155Z" }, { url = "https://files.pythonhosted.org/packages/57/00/4b7b70223deaebd9bb85984d01a764b0d7bd6526fcdc73cca83bcbe7243e/aiohttp-3.13.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4bb6bf5811620003614076bdc807ef3b5e38244f9d25ca5fe888eaccea2a9832", size = 496927, upload-time = "2026-03-31T21:58:15.073Z" }, { url = "https://files.pythonhosted.org/packages/9c/f5/0fb20fb49f8efdcdce6cd8127604ad2c503e754a8f139f5e02b01626523f/aiohttp-3.13.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a84792f8631bf5a94e52d9cc881c0b824ab42717165a5579c760b830d9392ac9", size = 497141, upload-time = "2026-03-31T21:58:17.009Z" }, { url = "https://files.pythonhosted.org/packages/3b/86/b7c870053e36a94e8951b803cb5b909bfbc9b90ca941527f5fcafbf6b0fa/aiohttp-3.13.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57653eac22c6a4c13eb22ecf4d673d64a12f266e72785ab1c8b8e5940d0e8090", size = 1732476, upload-time = "2026-03-31T21:58:18.925Z" }, { url = "https://files.pythonhosted.org/packages/b5/e5/4e161f84f98d80c03a238671b4136e6530453d65262867d989bbe78244d0/aiohttp-3.13.5-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5e5f7debc7a57af53fdf5c5009f9391d9f4c12867049d509bf7bb164a6e295b", size = 1706507, upload-time = "2026-03-31T21:58:21.094Z" }, { url = "https://files.pythonhosted.org/packages/d4/56/ea11a9f01518bd5a2a2fcee869d248c4b8a0cfa0bb13401574fa31adf4d4/aiohttp-3.13.5-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c719f65bebcdf6716f10e9eff80d27567f7892d8988c06de12bbbd39307c6e3a", size = 1773465, upload-time = "2026-03-31T21:58:23.159Z" }, { url = "https://files.pythonhosted.org/packages/eb/40/333ca27fb74b0383f17c90570c748f7582501507307350a79d9f9f3c6eb1/aiohttp-3.13.5-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d97f93fdae594d886c5a866636397e2bcab146fd7a132fd6bb9ce182224452f8", size = 1873523, upload-time = "2026-03-31T21:58:25.59Z" }, { url = "https://files.pythonhosted.org/packages/f0/d2/e2f77eef1acb7111405433c707dc735e63f67a56e176e72e9e7a2cd3f493/aiohttp-3.13.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3df334e39d4c2f899a914f1dba283c1aadc311790733f705182998c6f7cae665", size = 1754113, upload-time = "2026-03-31T21:58:27.624Z" }, { url = "https://files.pythonhosted.org/packages/fb/56/3f653d7f53c89669301ec9e42c95233e2a0c0a6dd051269e6e678db4fdb0/aiohttp-3.13.5-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe6970addfea9e5e081401bcbadf865d2b6da045472f58af08427e108d618540", size = 1562351, upload-time = "2026-03-31T21:58:29.918Z" }, { url = "https://files.pythonhosted.org/packages/ec/a6/9b3e91eb8ae791cce4ee736da02211c85c6f835f1bdfac0594a8a3b7018c/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7becdf835feff2f4f335d7477f121af787e3504b48b449ff737afb35869ba7bb", size = 1693205, upload-time = "2026-03-31T21:58:32.214Z" }, { url = "https://files.pythonhosted.org/packages/98/fc/bfb437a99a2fcebd6b6eaec609571954de2ed424f01c352f4b5504371dd3/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:676e5651705ad5d8a70aeb8eb6936c436d8ebbd56e63436cb7dd9bb36d2a9a46", size = 1730618, upload-time = "2026-03-31T21:58:34.728Z" }, { url = "https://files.pythonhosted.org/packages/e4/b6/c8534862126191a034f68153194c389addc285a0f1347d85096d349bbc15/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:9b16c653d38eb1a611cc898c41e76859ca27f119d25b53c12875fd0474ae31a8", size = 1745185, upload-time = "2026-03-31T21:58:36.909Z" }, { url = "https://files.pythonhosted.org/packages/0b/93/4ca8ee2ef5236e2707e0fd5fecb10ce214aee1ff4ab307af9c558bda3b37/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:999802d5fa0389f58decd24b537c54aa63c01c3219ce17d1214cbda3c2b22d2d", size = 1557311, upload-time = "2026-03-31T21:58:39.38Z" }, { url = "https://files.pythonhosted.org/packages/57/ae/76177b15f18c5f5d094f19901d284025db28eccc5ae374d1d254181d33f4/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:ec707059ee75732b1ba130ed5f9580fe10ff75180c812bc267ded039db5128c6", size = 1773147, upload-time = "2026-03-31T21:58:41.476Z" }, { url = "https://files.pythonhosted.org/packages/01/a4/62f05a0a98d88af59d93b7fcac564e5f18f513cb7471696ac286db970d6a/aiohttp-3.13.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2d6d44a5b48132053c2f6cd5c8cb14bc67e99a63594e336b0f2af81e94d5530c", size = 1730356, upload-time = "2026-03-31T21:58:44.049Z" }, { url = "https://files.pythonhosted.org/packages/e4/85/fc8601f59dfa8c9523808281f2da571f8b4699685f9809a228adcc90838d/aiohttp-3.13.5-cp313-cp313-win32.whl", hash = "sha256:329f292ed14d38a6c4c435e465f48bebb47479fd676a0411936cc371643225cc", size = 432637, upload-time = "2026-03-31T21:58:46.167Z" }, { url = "https://files.pythonhosted.org/packages/c0/1b/ac685a8882896acf0f6b31d689e3792199cfe7aba37969fa91da63a7fa27/aiohttp-3.13.5-cp313-cp313-win_amd64.whl", hash = "sha256:69f571de7500e0557801c0b51f4780482c0ec5fe2ac851af5a92cfce1af1cb83", size = 458896, upload-time = "2026-03-31T21:58:48.119Z" }, { url = "https://files.pythonhosted.org/packages/5d/ce/46572759afc859e867a5bc8ec3487315869013f59281ce61764f76d879de/aiohttp-3.13.5-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:eb4639f32fd4a9904ab8fb45bf3383ba71137f3d9d4ba25b3b3f3109977c5b8c", size = 745721, upload-time = "2026-03-31T21:58:50.229Z" }, { url = "https://files.pythonhosted.org/packages/13/fe/8a2efd7626dbe6049b2ef8ace18ffda8a4dfcbe1bcff3ac30c0c7575c20b/aiohttp-3.13.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:7e5dc4311bd5ac493886c63cbf76ab579dbe4641268e7c74e48e774c74b6f2be", size = 497663, upload-time = "2026-03-31T21:58:52.232Z" }, { url = "https://files.pythonhosted.org/packages/9b/91/cc8cc78a111826c54743d88651e1687008133c37e5ee615fee9b57990fac/aiohttp-3.13.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:756c3c304d394977519824449600adaf2be0ccee76d206ee339c5e76b70ded25", size = 499094, upload-time = "2026-03-31T21:58:54.566Z" }, { url = "https://files.pythonhosted.org/packages/0a/33/a8362cb15cf16a3af7e86ed11962d5cd7d59b449202dc576cdc731310bde/aiohttp-3.13.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecc26751323224cf8186efcf7fbcbc30f4e1d8c7970659daf25ad995e4032a56", size = 1726701, upload-time = "2026-03-31T21:58:56.864Z" }, { url = "https://files.pythonhosted.org/packages/45/0c/c091ac5c3a17114bd76cbf85d674650969ddf93387876cf67f754204bd77/aiohttp-3.13.5-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:10a75acfcf794edf9d8db50e5a7ec5fc818b2a8d3f591ce93bc7b1210df016d2", size = 1683360, upload-time = "2026-03-31T21:58:59.072Z" }, { url = "https://files.pythonhosted.org/packages/23/73/bcee1c2b79bc275e964d1446c55c54441a461938e70267c86afaae6fba27/aiohttp-3.13.5-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f7a18f258d124cd678c5fe072fe4432a4d5232b0657fca7c1847f599233c83a", size = 1773023, upload-time = "2026-03-31T21:59:01.776Z" }, { url = "https://files.pythonhosted.org/packages/c7/ef/720e639df03004fee2d869f771799d8c23046dec47d5b81e396c7cda583a/aiohttp-3.13.5-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:df6104c009713d3a89621096f3e3e88cc323fd269dbd7c20afe18535094320be", size = 1853795, upload-time = "2026-03-31T21:59:04.568Z" }, { url = "https://files.pythonhosted.org/packages/bd/c9/989f4034fb46841208de7aeeac2c6d8300745ab4f28c42f629ba77c2d916/aiohttp-3.13.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:241a94f7de7c0c3b616627aaad530fe2cb620084a8b144d3be7b6ecfe95bae3b", size = 1730405, upload-time = "2026-03-31T21:59:07.221Z" }, { url = "https://files.pythonhosted.org/packages/ce/75/ee1fd286ca7dc599d824b5651dad7b3be7ff8d9a7e7b3fe9820d9180f7db/aiohttp-3.13.5-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c974fb66180e58709b6fc402846f13791240d180b74de81d23913abe48e96d94", size = 1558082, upload-time = "2026-03-31T21:59:09.484Z" }, { url = "https://files.pythonhosted.org/packages/c3/20/1e9e6650dfc436340116b7aa89ff8cb2bbdf0abc11dfaceaad8f74273a10/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:6e27ea05d184afac78aabbac667450c75e54e35f62238d44463131bd3f96753d", size = 1692346, upload-time = "2026-03-31T21:59:12.068Z" }, { url = "https://files.pythonhosted.org/packages/d8/40/8ebc6658d48ea630ac7903912fe0dd4e262f0e16825aa4c833c56c9f1f56/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a79a6d399cef33a11b6f004c67bb07741d91f2be01b8d712d52c75711b1e07c7", size = 1698891, upload-time = "2026-03-31T21:59:14.552Z" }, { url = "https://files.pythonhosted.org/packages/d8/78/ea0ae5ec8ba7a5c10bdd6e318f1ba5e76fcde17db8275188772afc7917a4/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c632ce9c0b534fbe25b52c974515ed674937c5b99f549a92127c85f771a78772", size = 1742113, upload-time = "2026-03-31T21:59:17.068Z" }, { url = "https://files.pythonhosted.org/packages/8a/66/9d308ed71e3f2491be1acb8769d96c6f0c47d92099f3bc9119cada27b357/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:fceedde51fbd67ee2bcc8c0b33d0126cc8b51ef3bbde2f86662bd6d5a6f10ec5", size = 1553088, upload-time = "2026-03-31T21:59:19.541Z" }, { url = "https://files.pythonhosted.org/packages/da/a6/6cc25ed8dfc6e00c90f5c6d126a98e2cf28957ad06fa1036bd34b6f24a2c/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f92995dfec9420bb69ae629abf422e516923ba79ba4403bc750d94fb4a6c68c1", size = 1757976, upload-time = "2026-03-31T21:59:22.311Z" }, { url = "https://files.pythonhosted.org/packages/c1/2b/cce5b0ffe0de99c83e5e36d8f828e4161e415660a9f3e58339d07cce3006/aiohttp-3.13.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:20ae0ff08b1f2c8788d6fb85afcb798654ae6ba0b747575f8562de738078457b", size = 1712444, upload-time = "2026-03-31T21:59:24.635Z" }, { url = "https://files.pythonhosted.org/packages/6c/cf/9e1795b4160c58d29421eafd1a69c6ce351e2f7c8d3c6b7e4ca44aea1a5b/aiohttp-3.13.5-cp314-cp314-win32.whl", hash = "sha256:b20df693de16f42b2472a9c485e1c948ee55524786a0a34345511afdd22246f3", size = 438128, upload-time = "2026-03-31T21:59:27.291Z" }, { url = "https://files.pythonhosted.org/packages/22/4d/eaedff67fc805aeba4ba746aec891b4b24cebb1a7d078084b6300f79d063/aiohttp-3.13.5-cp314-cp314-win_amd64.whl", hash = "sha256:f85c6f327bf0b8c29da7d93b1cabb6363fb5e4e160a32fa241ed2dce21b73162", size = 464029, upload-time = "2026-03-31T21:59:29.429Z" }, { url = "https://files.pythonhosted.org/packages/79/11/c27d9332ee20d68dd164dc12a6ecdef2e2e35ecc97ed6cf0d2442844624b/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:1efb06900858bb618ff5cee184ae2de5828896c448403d51fb633f09e109be0a", size = 778758, upload-time = "2026-03-31T21:59:31.547Z" }, { url = "https://files.pythonhosted.org/packages/04/fb/377aead2e0a3ba5f09b7624f702a964bdf4f08b5b6728a9799830c80041e/aiohttp-3.13.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fee86b7c4bd29bdaf0d53d14739b08a106fdda809ca5fe032a15f52fae5fe254", size = 512883, upload-time = "2026-03-31T21:59:34.098Z" }, { url = "https://files.pythonhosted.org/packages/bb/a6/aa109a33671f7a5d3bd78b46da9d852797c5e665bfda7d6b373f56bff2ec/aiohttp-3.13.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:20058e23909b9e65f9da62b396b77dfa95965cbe840f8def6e572538b1d32e36", size = 516668, upload-time = "2026-03-31T21:59:36.497Z" }, { url = "https://files.pythonhosted.org/packages/79/b3/ca078f9f2fa9563c36fb8ef89053ea2bb146d6f792c5104574d49d8acb63/aiohttp-3.13.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cf20a8d6868cb15a73cab329ffc07291ba8c22b1b88176026106ae39aa6df0f", size = 1883461, upload-time = "2026-03-31T21:59:38.723Z" }, { url = "https://files.pythonhosted.org/packages/b7/e3/a7ad633ca1ca497b852233a3cce6906a56c3225fb6d9217b5e5e60b7419d/aiohttp-3.13.5-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:330f5da04c987f1d5bdb8ae189137c77139f36bd1cb23779ca1a354a4b027800", size = 1747661, upload-time = "2026-03-31T21:59:41.187Z" }, { url = "https://files.pythonhosted.org/packages/33/b9/cd6fe579bed34a906d3d783fe60f2fa297ef55b27bb4538438ee49d4dc41/aiohttp-3.13.5-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6f1cbf0c7926d315c3c26c2da41fd2b5d2fe01ac0e157b78caefc51a782196cf", size = 1863800, upload-time = "2026-03-31T21:59:43.84Z" }, { url = "https://files.pythonhosted.org/packages/c0/3f/2c1e2f5144cefa889c8afd5cf431994c32f3b29da9961698ff4e3811b79a/aiohttp-3.13.5-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:53fc049ed6390d05423ba33103ded7281fe897cf97878f369a527070bd95795b", size = 1958382, upload-time = "2026-03-31T21:59:46.187Z" }, { url = "https://files.pythonhosted.org/packages/66/1d/f31ec3f1013723b3babe3609e7f119c2c2fb6ef33da90061a705ef3e1bc8/aiohttp-3.13.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:898703aa2667e3c5ca4c54ca36cd73f58b7a38ef87a5606414799ebce4d3fd3a", size = 1803724, upload-time = "2026-03-31T21:59:48.656Z" }, { url = "https://files.pythonhosted.org/packages/0e/b4/57712dfc6f1542f067daa81eb61da282fab3e6f1966fca25db06c4fc62d5/aiohttp-3.13.5-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0494a01ca9584eea1e5fbd6d748e61ecff218c51b576ee1999c23db7066417d8", size = 1640027, upload-time = "2026-03-31T21:59:51.284Z" }, { url = "https://files.pythonhosted.org/packages/25/3c/734c878fb43ec083d8e31bf029daae1beafeae582d1b35da234739e82ee7/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:6cf81fe010b8c17b09495cbd15c1d35afbc8fb405c0c9cf4738e5ae3af1d65be", size = 1806644, upload-time = "2026-03-31T21:59:53.753Z" }, { url = "https://files.pythonhosted.org/packages/20/a5/f671e5cbec1c21d044ff3078223f949748f3a7f86b14e34a365d74a5d21f/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c564dd5f09ddc9d8f2c2d0a301cd30a79a2cc1b46dd1a73bef8f0038863d016b", size = 1791630, upload-time = "2026-03-31T21:59:56.239Z" }, { url = "https://files.pythonhosted.org/packages/0b/63/fb8d0ad63a0b8a99be97deac8c04dacf0785721c158bdf23d679a87aa99e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:2994be9f6e51046c4f864598fd9abeb4fba6e88f0b2152422c9666dcd4aea9c6", size = 1809403, upload-time = "2026-03-31T21:59:59.103Z" }, { url = "https://files.pythonhosted.org/packages/59/0c/bfed7f30662fcf12206481c2aac57dedee43fe1c49275e85b3a1e1742294/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:157826e2fa245d2ef46c83ea8a5faf77ca19355d278d425c29fda0beb3318037", size = 1634924, upload-time = "2026-03-31T22:00:02.116Z" }, { url = "https://files.pythonhosted.org/packages/17/d6/fd518d668a09fd5a3319ae5e984d4d80b9a4b3df4e21c52f02251ef5a32e/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:a8aca50daa9493e9e13c0f566201a9006f080e7c50e5e90d0b06f53146a54500", size = 1836119, upload-time = "2026-03-31T22:00:04.756Z" }, { url = "https://files.pythonhosted.org/packages/78/b7/15fb7a9d52e112a25b621c67b69c167805cb1f2ab8f1708a5c490d1b52fe/aiohttp-3.13.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3b13560160d07e047a93f23aaa30718606493036253d5430887514715b67c9d9", size = 1772072, upload-time = "2026-03-31T22:00:07.494Z" }, { url = "https://files.pythonhosted.org/packages/7e/df/57ba7f0c4a553fc2bd8b6321df236870ec6fd64a2a473a8a13d4f733214e/aiohttp-3.13.5-cp314-cp314t-win32.whl", hash = "sha256:9a0f4474b6ea6818b41f82172d799e4b3d29e22c2c520ce4357856fced9af2f8", size = 471819, upload-time = "2026-03-31T22:00:10.277Z" }, { url = "https://files.pythonhosted.org/packages/62/29/2f8418269e46454a26171bfdd6a055d74febf32234e474930f2f60a17145/aiohttp-3.13.5-cp314-cp314t-win_amd64.whl", hash = "sha256:18a2f6c1182c51baa1d28d68fea51513cb2a76612f038853c0ad3c145423d3d9", size = 505441, upload-time = "2026-03-31T22:00:12.791Z" }, ] [[package]] name = "aiosignal" version = "1.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "frozenlist" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, ] [[package]] name = "anyio" version = "4.13.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/19/14/2c5dd9f512b66549ae92767a9c7b330ae88e1932ca57876909410251fe13/anyio-4.13.0.tar.gz", hash = "sha256:334b70e641fd2221c1505b3890c69882fe4a2df910cba14d97019b90b24439dc", size = 231622, upload-time = "2026-03-24T12:59:09.671Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/da/42/e921fccf5015463e32a3cf6ee7f980a6ed0f395ceeaa45060b61d86486c2/anyio-4.13.0-py3-none-any.whl", hash = "sha256:08b310f9e24a9594186fd75b4f73f4a4152069e3853f1ed8bfbf58369f4ad708", size = 114353, upload-time = "2026-03-24T12:59:08.246Z" }, ] [[package]] name = "async-generator" version = "1.10" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ce/b6/6fa6b3b598a03cba5e80f829e0dadbb49d7645f523d209b2fb7ea0bbb02a/async_generator-1.10.tar.gz", hash = "sha256:6ebb3d106c12920aaae42ccb6f787ef5eefdcdd166ea3d628fa8476abe712144", size = 29870, upload-time = "2018-08-01T03:36:21.69Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/71/52/39d20e03abd0ac9159c162ec24b93fbcaa111e8400308f2465432495ca2b/async_generator-1.10-py3-none-any.whl", hash = "sha256:01c7bf666359b4967d2cda0000cc2e4af16a0ae098cbffcb8472fb9e8ad6585b", size = 18857, upload-time = "2018-08-01T03:36:20.029Z" }, ] [[package]] name = "async-timeout" version = "5.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, ] [[package]] name = "attrs" version = "26.1.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, ] [[package]] name = "backports-tarfile" version = "1.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406, upload-time = "2024-05-28T17:01:54.731Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181, upload-time = "2024-05-28T17:01:53.112Z" }, ] [[package]] name = "blinker" version = "1.9.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460, upload-time = "2024-11-08T17:25:47.436Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458, upload-time = "2024-11-08T17:25:46.184Z" }, ] [[package]] name = "brotli" version = "1.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632, upload-time = "2025-11-05T18:39:42.86Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/64/10/a090475284fc4a71aed40a96f32e44a7fe5bda39687353dd977720b211b6/brotli-1.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b90b767916ac44e93a8e28ce6adf8d551e43affb512f2377c732d486ac6514e", size = 863089, upload-time = "2025-11-05T18:38:01.181Z" }, { url = "https://files.pythonhosted.org/packages/03/41/17416630e46c07ac21e378c3464815dd2e120b441e641bc516ac32cc51d2/brotli-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6be67c19e0b0c56365c6a76e393b932fb0e78b3b56b711d180dd7013cb1fd984", size = 445442, upload-time = "2025-11-05T18:38:02.434Z" }, { url = "https://files.pythonhosted.org/packages/24/31/90cc06584deb5d4fcafc0985e37741fc6b9717926a78674bbb3ce018957e/brotli-1.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0bbd5b5ccd157ae7913750476d48099aaf507a79841c0d04a9db4415b14842de", size = 1532658, upload-time = "2025-11-05T18:38:03.588Z" }, { url = "https://files.pythonhosted.org/packages/62/17/33bf0c83bcbc96756dfd712201d87342732fad70bb3472c27e833a44a4f9/brotli-1.2.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3f3c908bcc404c90c77d5a073e55271a0a498f4e0756e48127c35d91cf155947", size = 1631241, upload-time = "2025-11-05T18:38:04.582Z" }, { url = "https://files.pythonhosted.org/packages/48/10/f47854a1917b62efe29bc98ac18e5d4f71df03f629184575b862ef2e743b/brotli-1.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b557b29782a643420e08d75aea889462a4a8796e9a6cf5621ab05a3f7da8ef2", size = 1424307, upload-time = "2025-11-05T18:38:05.587Z" }, { url = "https://files.pythonhosted.org/packages/e4/b7/f88eb461719259c17483484ea8456925ee057897f8e64487d76e24e5e38d/brotli-1.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81da1b229b1889f25adadc929aeb9dbc4e922bd18561b65b08dd9343cfccca84", size = 1488208, upload-time = "2025-11-05T18:38:06.613Z" }, { url = "https://files.pythonhosted.org/packages/26/59/41bbcb983a0c48b0b8004203e74706c6b6e99a04f3c7ca6f4f41f364db50/brotli-1.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ff09cd8c5eec3b9d02d2408db41be150d8891c5566addce57513bf546e3d6c6d", size = 1597574, upload-time = "2025-11-05T18:38:07.838Z" }, { url = "https://files.pythonhosted.org/packages/8e/e6/8c89c3bdabbe802febb4c5c6ca224a395e97913b5df0dff11b54f23c1788/brotli-1.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a1778532b978d2536e79c05dac2d8cd857f6c55cd0c95ace5b03740824e0e2f1", size = 1492109, upload-time = "2025-11-05T18:38:08.816Z" }, { url = "https://files.pythonhosted.org/packages/ed/9a/4b19d4310b2dbd545c0c33f176b0528fa68c3cd0754e34b2f2bcf56548ae/brotli-1.2.0-cp310-cp310-win32.whl", hash = "sha256:b232029d100d393ae3c603c8ffd7e3fe6f798c5e28ddca5feabb8e8fdb732997", size = 334461, upload-time = "2025-11-05T18:38:10.729Z" }, { url = "https://files.pythonhosted.org/packages/ac/39/70981d9f47705e3c2b95c0847dfa3e7a37aa3b7c6030aedc4873081ed005/brotli-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef87b8ab2704da227e83a246356a2b179ef826f550f794b2c52cddb4efbd0196", size = 369035, upload-time = "2025-11-05T18:38:11.827Z" }, { url = "https://files.pythonhosted.org/packages/7a/ef/f285668811a9e1ddb47a18cb0b437d5fc2760d537a2fe8a57875ad6f8448/brotli-1.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:15b33fe93cedc4caaff8a0bd1eb7e3dab1c61bb22a0bf5bdfdfd97cd7da79744", size = 863110, upload-time = "2025-11-05T18:38:12.978Z" }, { url = "https://files.pythonhosted.org/packages/50/62/a3b77593587010c789a9d6eaa527c79e0848b7b860402cc64bc0bc28a86c/brotli-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:898be2be399c221d2671d29eed26b6b2713a02c2119168ed914e7d00ceadb56f", size = 445438, upload-time = "2025-11-05T18:38:14.208Z" }, { url = "https://files.pythonhosted.org/packages/cd/e1/7fadd47f40ce5549dc44493877db40292277db373da5053aff181656e16e/brotli-1.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:350c8348f0e76fff0a0fd6c26755d2653863279d086d3aa2c290a6a7251135dd", size = 1534420, upload-time = "2025-11-05T18:38:15.111Z" }, { url = "https://files.pythonhosted.org/packages/12/8b/1ed2f64054a5a008a4ccd2f271dbba7a5fb1a3067a99f5ceadedd4c1d5a7/brotli-1.2.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1ad3fda65ae0d93fec742a128d72e145c9c7a99ee2fcd667785d99eb25a7fe", size = 1632619, upload-time = "2025-11-05T18:38:16.094Z" }, { url = "https://files.pythonhosted.org/packages/89/5a/7071a621eb2d052d64efd5da2ef55ecdac7c3b0c6e4f9d519e9c66d987ef/brotli-1.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40d918bce2b427a0c4ba189df7a006ac0c7277c180aee4617d99e9ccaaf59e6a", size = 1426014, upload-time = "2025-11-05T18:38:17.177Z" }, { url = "https://files.pythonhosted.org/packages/26/6d/0971a8ea435af5156acaaccec1a505f981c9c80227633851f2810abd252a/brotli-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2a7f1d03727130fc875448b65b127a9ec5d06d19d0148e7554384229706f9d1b", size = 1489661, upload-time = "2025-11-05T18:38:18.41Z" }, { url = "https://files.pythonhosted.org/packages/f3/75/c1baca8b4ec6c96a03ef8230fab2a785e35297632f402ebb1e78a1e39116/brotli-1.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9c79f57faa25d97900bfb119480806d783fba83cd09ee0b33c17623935b05fa3", size = 1599150, upload-time = "2025-11-05T18:38:19.792Z" }, { url = "https://files.pythonhosted.org/packages/0d/1a/23fcfee1c324fd48a63d7ebf4bac3a4115bdb1b00e600f80f727d850b1ae/brotli-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:844a8ceb8483fefafc412f85c14f2aae2fb69567bf2a0de53cdb88b73e7c43ae", size = 1493505, upload-time = "2025-11-05T18:38:20.913Z" }, { url = "https://files.pythonhosted.org/packages/36/e5/12904bbd36afeef53d45a84881a4810ae8810ad7e328a971ebbfd760a0b3/brotli-1.2.0-cp311-cp311-win32.whl", hash = "sha256:aa47441fa3026543513139cb8926a92a8e305ee9c71a6209ef7a97d91640ea03", size = 334451, upload-time = "2025-11-05T18:38:21.94Z" }, { url = "https://files.pythonhosted.org/packages/02/8b/ecb5761b989629a4758c394b9301607a5880de61ee2ee5fe104b87149ebc/brotli-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:022426c9e99fd65d9475dce5c195526f04bb8be8907607e27e747893f6ee3e24", size = 369035, upload-time = "2025-11-05T18:38:22.941Z" }, { url = "https://files.pythonhosted.org/packages/11/ee/b0a11ab2315c69bb9b45a2aaed022499c9c24a205c3a49c3513b541a7967/brotli-1.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:35d382625778834a7f3061b15423919aa03e4f5da34ac8e02c074e4b75ab4f84", size = 861543, upload-time = "2025-11-05T18:38:24.183Z" }, { url = "https://files.pythonhosted.org/packages/e1/2f/29c1459513cd35828e25531ebfcbf3e92a5e49f560b1777a9af7203eb46e/brotli-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a61c06b334bd99bc5ae84f1eeb36bfe01400264b3c352f968c6e30a10f9d08b", size = 444288, upload-time = "2025-11-05T18:38:25.139Z" }, { url = "https://files.pythonhosted.org/packages/3d/6f/feba03130d5fceadfa3a1bb102cb14650798c848b1df2a808356f939bb16/brotli-1.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acec55bb7c90f1dfc476126f9711a8e81c9af7fb617409a9ee2953115343f08d", size = 1528071, upload-time = "2025-11-05T18:38:26.081Z" }, { url = "https://files.pythonhosted.org/packages/2b/38/f3abb554eee089bd15471057ba85f47e53a44a462cfce265d9bf7088eb09/brotli-1.2.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:260d3692396e1895c5034f204f0db022c056f9e2ac841593a4cf9426e2a3faca", size = 1626913, upload-time = "2025-11-05T18:38:27.284Z" }, { url = "https://files.pythonhosted.org/packages/03/a7/03aa61fbc3c5cbf99b44d158665f9b0dd3d8059be16c460208d9e385c837/brotli-1.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:072e7624b1fc4d601036ab3f4f27942ef772887e876beff0301d261210bca97f", size = 1419762, upload-time = "2025-11-05T18:38:28.295Z" }, { url = "https://files.pythonhosted.org/packages/21/1b/0374a89ee27d152a5069c356c96b93afd1b94eae83f1e004b57eb6ce2f10/brotli-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adedc4a67e15327dfdd04884873c6d5a01d3e3b6f61406f99b1ed4865a2f6d28", size = 1484494, upload-time = "2025-11-05T18:38:29.29Z" }, { url = "https://files.pythonhosted.org/packages/cf/57/69d4fe84a67aef4f524dcd075c6eee868d7850e85bf01d778a857d8dbe0a/brotli-1.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7a47ce5c2288702e09dc22a44d0ee6152f2c7eda97b3c8482d826a1f3cfc7da7", size = 1593302, upload-time = "2025-11-05T18:38:30.639Z" }, { url = "https://files.pythonhosted.org/packages/d5/3b/39e13ce78a8e9a621c5df3aeb5fd181fcc8caba8c48a194cd629771f6828/brotli-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:af43b8711a8264bb4e7d6d9a6d004c3a2019c04c01127a868709ec29962b6036", size = 1487913, upload-time = "2025-11-05T18:38:31.618Z" }, { url = "https://files.pythonhosted.org/packages/62/28/4d00cb9bd76a6357a66fcd54b4b6d70288385584063f4b07884c1e7286ac/brotli-1.2.0-cp312-cp312-win32.whl", hash = "sha256:e99befa0b48f3cd293dafeacdd0d191804d105d279e0b387a32054c1180f3161", size = 334362, upload-time = "2025-11-05T18:38:32.939Z" }, { url = "https://files.pythonhosted.org/packages/1c/4e/bc1dcac9498859d5e353c9b153627a3752868a9d5f05ce8dedd81a2354ab/brotli-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:b35c13ce241abdd44cb8ca70683f20c0c079728a36a996297adb5334adfc1c44", size = 369115, upload-time = "2025-11-05T18:38:33.765Z" }, { url = "https://files.pythonhosted.org/packages/6c/d4/4ad5432ac98c73096159d9ce7ffeb82d151c2ac84adcc6168e476bb54674/brotli-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9e5825ba2c9998375530504578fd4d5d1059d09621a02065d1b6bfc41a8e05ab", size = 861523, upload-time = "2025-11-05T18:38:34.67Z" }, { url = "https://files.pythonhosted.org/packages/91/9f/9cc5bd03ee68a85dc4bc89114f7067c056a3c14b3d95f171918c088bf88d/brotli-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c", size = 444289, upload-time = "2025-11-05T18:38:35.6Z" }, { url = "https://files.pythonhosted.org/packages/2e/b6/fe84227c56a865d16a6614e2c4722864b380cb14b13f3e6bef441e73a85a/brotli-1.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8565e3cdc1808b1a34714b553b262c5de5fbda202285782173ec137fd13709f", size = 1528076, upload-time = "2025-11-05T18:38:36.639Z" }, { url = "https://files.pythonhosted.org/packages/55/de/de4ae0aaca06c790371cf6e7ee93a024f6b4bb0568727da8c3de112e726c/brotli-1.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:26e8d3ecb0ee458a9804f47f21b74845cc823fd1bb19f02272be70774f56e2a6", size = 1626880, upload-time = "2025-11-05T18:38:37.623Z" }, { url = "https://files.pythonhosted.org/packages/5f/16/a1b22cbea436642e071adcaf8d4b350a2ad02f5e0ad0da879a1be16188a0/brotli-1.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67a91c5187e1eec76a61625c77a6c8c785650f5b576ca732bd33ef58b0dff49c", size = 1419737, upload-time = "2025-11-05T18:38:38.729Z" }, { url = "https://files.pythonhosted.org/packages/46/63/c968a97cbb3bdbf7f974ef5a6ab467a2879b82afbc5ffb65b8acbb744f95/brotli-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ecdb3b6dc36e6d6e14d3a1bdc6c1057c8cbf80db04031d566eb6080ce283a48", size = 1484440, upload-time = "2025-11-05T18:38:39.916Z" }, { url = "https://files.pythonhosted.org/packages/06/9d/102c67ea5c9fc171f423e8399e585dabea29b5bc79b05572891e70013cdd/brotli-1.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3e1b35d56856f3ed326b140d3c6d9db91740f22e14b06e840fe4bb1923439a18", size = 1593313, upload-time = "2025-11-05T18:38:41.24Z" }, { url = "https://files.pythonhosted.org/packages/9e/4a/9526d14fa6b87bc827ba1755a8440e214ff90de03095cacd78a64abe2b7d/brotli-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54a50a9dad16b32136b2241ddea9e4df159b41247b2ce6aac0b3276a66a8f1e5", size = 1487945, upload-time = "2025-11-05T18:38:42.277Z" }, { url = "https://files.pythonhosted.org/packages/5b/e8/3fe1ffed70cbef83c5236166acaed7bb9c766509b157854c80e2f766b38c/brotli-1.2.0-cp313-cp313-win32.whl", hash = "sha256:1b1d6a4efedd53671c793be6dd760fcf2107da3a52331ad9ea429edf0902f27a", size = 334368, upload-time = "2025-11-05T18:38:43.345Z" }, { url = "https://files.pythonhosted.org/packages/ff/91/e739587be970a113b37b821eae8097aac5a48e5f0eca438c22e4c7dd8648/brotli-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:b63daa43d82f0cdabf98dee215b375b4058cce72871fd07934f179885aad16e8", size = 369116, upload-time = "2025-11-05T18:38:44.609Z" }, { url = "https://files.pythonhosted.org/packages/17/e1/298c2ddf786bb7347a1cd71d63a347a79e5712a7c0cba9e3c3458ebd976f/brotli-1.2.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6c12dad5cd04530323e723787ff762bac749a7b256a5bece32b2243dd5c27b21", size = 863080, upload-time = "2025-11-05T18:38:45.503Z" }, { url = "https://files.pythonhosted.org/packages/84/0c/aac98e286ba66868b2b3b50338ffbd85a35c7122e9531a73a37a29763d38/brotli-1.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3219bd9e69868e57183316ee19c84e03e8f8b5a1d1f2667e1aa8c2f91cb061ac", size = 445453, upload-time = "2025-11-05T18:38:46.433Z" }, { url = "https://files.pythonhosted.org/packages/ec/f1/0ca1f3f99ae300372635ab3fe2f7a79fa335fee3d874fa7f9e68575e0e62/brotli-1.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:963a08f3bebd8b75ac57661045402da15991468a621f014be54e50f53a58d19e", size = 1528168, upload-time = "2025-11-05T18:38:47.371Z" }, { url = "https://files.pythonhosted.org/packages/d6/a6/2ebfc8f766d46df8d3e65b880a2e220732395e6d7dc312c1e1244b0f074a/brotli-1.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9322b9f8656782414b37e6af884146869d46ab85158201d82bab9abbcb971dc7", size = 1627098, upload-time = "2025-11-05T18:38:48.385Z" }, { url = "https://files.pythonhosted.org/packages/f3/2f/0976d5b097ff8a22163b10617f76b2557f15f0f39d6a0fe1f02b1a53e92b/brotli-1.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cf9cba6f5b78a2071ec6fb1e7bd39acf35071d90a81231d67e92d637776a6a63", size = 1419861, upload-time = "2025-11-05T18:38:49.372Z" }, { url = "https://files.pythonhosted.org/packages/9c/97/d76df7176a2ce7616ff94c1fb72d307c9a30d2189fe877f3dd99af00ea5a/brotli-1.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7547369c4392b47d30a3467fe8c3330b4f2e0f7730e45e3103d7d636678a808b", size = 1484594, upload-time = "2025-11-05T18:38:50.655Z" }, { url = "https://files.pythonhosted.org/packages/d3/93/14cf0b1216f43df5609f5b272050b0abd219e0b54ea80b47cef9867b45e7/brotli-1.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1530af5c3c275b8524f2e24841cbe2599d74462455e9bae5109e9ff42e9361", size = 1593455, upload-time = "2025-11-05T18:38:51.624Z" }, { url = "https://files.pythonhosted.org/packages/b3/73/3183c9e41ca755713bdf2cc1d0810df742c09484e2e1ddd693bee53877c1/brotli-1.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2d085ded05278d1c7f65560aae97b3160aeb2ea2c0b3e26204856beccb60888", size = 1488164, upload-time = "2025-11-05T18:38:53.079Z" }, { url = "https://files.pythonhosted.org/packages/64/6a/0c78d8f3a582859236482fd9fa86a65a60328a00983006bcf6d83b7b2253/brotli-1.2.0-cp314-cp314-win32.whl", hash = "sha256:832c115a020e463c2f67664560449a7bea26b0c1fdd690352addad6d0a08714d", size = 339280, upload-time = "2025-11-05T18:38:54.02Z" }, { url = "https://files.pythonhosted.org/packages/f5/10/56978295c14794b2c12007b07f3e41ba26acda9257457d7085b0bb3bb90c/brotli-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:e7c0af964e0b4e3412a0ebf341ea26ec767fa0b4cf81abb5e897c9338b5ad6a3", size = 375639, upload-time = "2025-11-05T18:38:55.67Z" }, ] [[package]] name = "brotlicffi" version = "1.2.0.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8a/b6/017dc5f852ed9b8735af77774509271acbf1de02d238377667145fcee01d/brotlicffi-1.2.0.1.tar.gz", hash = "sha256:c20d5c596278307ad06414a6d95a892377ea274a5c6b790c2548c009385d621c", size = 478156, upload-time = "2026-03-05T19:54:11.547Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ef/f9/dfa56316837fa798eac19358351e974de8e1e2ca9475af4cb90293cd6576/brotlicffi-1.2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c85e65913cf2b79c57a3fdd05b98d9731d9255dc0cb696b09376cc091b9cddd", size = 433046, upload-time = "2026-03-05T19:53:46.209Z" }, { url = "https://files.pythonhosted.org/packages/4a/f5/f8f492158c76b0d940388801f04f747028971ad5774287bded5f1e53f08d/brotlicffi-1.2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:535f2d05d0273408abc13fc0eebb467afac17b0ad85090c8913690d40207dac5", size = 1541126, upload-time = "2026-03-05T19:53:48.248Z" }, { url = "https://files.pythonhosted.org/packages/3b/e1/ff87af10ac419600c63e9287a0649c673673ae6b4f2bcf48e96cb2f89f60/brotlicffi-1.2.0.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce17eb798ca59ecec67a9bb3fd7a4304e120d1cd02953ce522d959b9a84d58ac", size = 1541983, upload-time = "2026-03-05T19:53:50.317Z" }, { url = "https://files.pythonhosted.org/packages/47/c0/80ecd9bd45776109fab14040e478bf63e456967c9ddee2353d8330ed8de1/brotlicffi-1.2.0.1-cp314-cp314t-win32.whl", hash = "sha256:3c9544f83cb715d95d7eab3af4adbbef8b2093ad6382288a83b3a25feb1a57ec", size = 349047, upload-time = "2026-03-05T19:53:52.215Z" }, { url = "https://files.pythonhosted.org/packages/ab/98/13e5b250236a281b6cd9e92a01ee1ae231029fa78faee932ef3766e1cb24/brotlicffi-1.2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:625f8115d32ae9c0740d01ea51518437c3fbaa3e78d41cb18459f6f7ac326000", size = 385652, upload-time = "2026-03-05T19:53:53.892Z" }, { url = "https://files.pythonhosted.org/packages/9a/9f/b98dcd4af47994cee97aebac866996a006a2e5fc1fd1e2b82a8ad95cf09c/brotlicffi-1.2.0.1-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:91ba5f0ccc040f6ff8f7efaf839f797723d03ed46acb8ae9408f99ffd2572cf4", size = 432608, upload-time = "2026-03-05T19:53:56.736Z" }, { url = "https://files.pythonhosted.org/packages/b1/7a/ac4ee56595a061e3718a6d1ea7e921f4df156894acffb28ed88a1fd52022/brotlicffi-1.2.0.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be9a670c6811af30a4bd42d7116dc5895d3b41beaa8ed8a89050447a0181f5ce", size = 1534257, upload-time = "2026-03-05T19:53:58.667Z" }, { url = "https://files.pythonhosted.org/packages/99/39/e7410db7f6f56de57744ea52a115084ceb2735f4d44973f349bb92136586/brotlicffi-1.2.0.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3314a3476f59e5443f9f72a6dff16edc0c3463c9b318feaef04ae3e4683f5a", size = 1536838, upload-time = "2026-03-05T19:54:00.705Z" }, { url = "https://files.pythonhosted.org/packages/a6/75/6e7977d1935fc3fbb201cbd619be8f2c7aea25d40a096967132854b34708/brotlicffi-1.2.0.1-cp38-abi3-win32.whl", hash = "sha256:82ea52e2b5d3145b6c406ebd3efb0d55db718b7ad996bd70c62cec0439de1187", size = 343337, upload-time = "2026-03-05T19:54:02.446Z" }, { url = "https://files.pythonhosted.org/packages/d8/ef/e7e485ce5e4ba3843a0a92feb767c7b6098fd6e65ce752918074d175ae71/brotlicffi-1.2.0.1-cp38-abi3-win_amd64.whl", hash = "sha256:da2e82a08e7778b8bc539d27ca03cdd684113e81394bfaaad8d0dfc6a17ddede", size = 379026, upload-time = "2026-03-05T19:54:04.322Z" }, { url = "https://files.pythonhosted.org/packages/7f/53/6262c2256513e6f530d81642477cb19367270922063eaa2d7b781d8c723d/brotlicffi-1.2.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e015af99584c6db1490a69a210c765953e473e63adc2d891ac3062a737c9e851", size = 402265, upload-time = "2026-03-05T19:54:05.858Z" }, { url = "https://files.pythonhosted.org/packages/1f/d9/d5340b43cf5fbe7fe5a083d237e5338cc1caa73bea523be1c5e452c26290/brotlicffi-1.2.0.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37cb587d32bf7168e2218c455e22e409ad1f3157c6c71945879a311f3e6b6abf", size = 406710, upload-time = "2026-03-05T19:54:07.272Z" }, { url = "https://files.pythonhosted.org/packages/a3/82/dbced4c1e0792efdf23fd90ff6d2a320c64ff4dfef7aacc85c04fde9ddd2/brotlicffi-1.2.0.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d6ba65dd528892b4d9960beba2ae011a753620bcfc66cf6fa3cee18d7b0baa4", size = 402787, upload-time = "2026-03-05T19:54:08.73Z" }, { url = "https://files.pythonhosted.org/packages/ef/6f/534205ba7590c9a8716a614f270c5c2ec419b5b7079b3f9cd31b7b5580de/brotlicffi-1.2.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2a5575653b0672638ba039b82fda56854934d7a6a24d4b8b5033f73ab43cbc1", size = 375108, upload-time = "2026-03-05T19:54:10.079Z" }, ] [[package]] name = "build" version = "1.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "os_name == 'nt'" }, { name = "importlib-metadata", marker = "python_full_version < '3.10.2'" }, { name = "packaging" }, { name = "pyproject-hooks" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/25/1c/23e33405a7c9eac261dff640926b8b5adaed6a6eb3e1767d441ed611d0c0/build-1.3.0.tar.gz", hash = "sha256:698edd0ea270bde950f53aed21f3a0135672206f3911e0176261a31e0e07b397", size = 48544, upload-time = "2025-08-01T21:27:09.268Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/8c/2b30c12155ad8de0cf641d76a8b396a16d2c36bc6d50b621a62b7c4567c1/build-1.3.0-py3-none-any.whl", hash = "sha256:7145f0b5061ba90a1500d60bd1b13ca0a8a4cebdd0cc16ed8adf1c0e739f43b4", size = 23382, upload-time = "2025-08-01T21:27:07.844Z" }, ] [[package]] name = "certifi" version = "2026.4.22" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/25/ee/6caf7a40c36a1220410afe15a1cc64993a1f864871f698c0f93acb72842a/certifi-2026.4.22.tar.gz", hash = "sha256:8d455352a37b71bf76a79caa83a3d6c25afee4a385d632127b6afb3963f1c580", size = 137077, upload-time = "2026-04-22T11:26:11.191Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/22/30/7cd8fdcdfbc5b869528b079bfb76dcdf6056b1a2097a662e5e8c04f42965/certifi-2026.4.22-py3-none-any.whl", hash = "sha256:3cb2210c8f88ba2318d29b0388d1023c8492ff72ecdde4ebdaddbb13a31b1c4a", size = 135707, upload-time = "2026-04-22T11:26:09.372Z" }, ] [[package]] name = "cffi" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, ] [[package]] name = "chardet" version = "6.0.0.post1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7f/42/fb9436c103a881a377e34b9f58d77b5f503461c702ff654ebe86151bcfe9/chardet-6.0.0.post1.tar.gz", hash = "sha256:6b78048c3c97c7b2ed1fbad7a18f76f5a6547f7d34dbab536cc13887c9a92fa4", size = 12521798, upload-time = "2026-02-22T15:09:17.925Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/66/42/5de54f632c2de53cd3415b3703383d5fff43a94cbc0567ef362515261a21/chardet-6.0.0.post1-py3-none-any.whl", hash = "sha256:c894a36800549adf7bb5f2af47033281b75fdfcd2aa0f0243be0ad22a52e2dcb", size = 627245, upload-time = "2026-02-22T15:09:15.876Z" }, ] [[package]] name = "charset-normalizer" version = "3.4.7" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/26/08/0f303cb0b529e456bb116f2d50565a482694fbb94340bf56d44677e7ed03/charset_normalizer-3.4.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cdd68a1fb318e290a2077696b7eb7a21a49163c455979c639bf5a5dcdc46617d", size = 315182, upload-time = "2026-04-02T09:25:40.673Z" }, { url = "https://files.pythonhosted.org/packages/24/47/b192933e94b546f1b1fe4df9cc1f84fcdbf2359f8d1081d46dd029b50207/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e17b8d5d6a8c47c85e68ca8379def1303fd360c3e22093a807cd34a71cd082b8", size = 209329, upload-time = "2026-04-02T09:25:42.354Z" }, { url = "https://files.pythonhosted.org/packages/c2/b4/01fa81c5ca6141024d89a8fc15968002b71da7f825dd14113207113fabbd/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:511ef87c8aec0783e08ac18565a16d435372bc1ac25a91e6ac7f5ef2b0bff790", size = 231230, upload-time = "2026-04-02T09:25:44.281Z" }, { url = "https://files.pythonhosted.org/packages/20/f7/7b991776844dfa058017e600e6e55ff01984a063290ca5622c0b63162f68/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:007d05ec7321d12a40227aae9e2bc6dca73f3cb21058999a1df9e193555a9dcc", size = 225890, upload-time = "2026-04-02T09:25:45.475Z" }, { url = "https://files.pythonhosted.org/packages/20/e7/bed0024a0f4ab0c8a9c64d4445f39b30c99bd1acd228291959e3de664247/charset_normalizer-3.4.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf29836da5119f3c8a8a70667b0ef5fdca3bb12f80fd06487cfa575b3909b393", size = 216930, upload-time = "2026-04-02T09:25:46.58Z" }, { url = "https://files.pythonhosted.org/packages/e2/ab/b18f0ab31cdd7b3ddb8bb76c4a414aeb8160c9810fdf1bc62f269a539d87/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:12d8baf840cc7889b37c7c770f478adea7adce3dcb3944d02ec87508e2dcf153", size = 202109, upload-time = "2026-04-02T09:25:48.031Z" }, { url = "https://files.pythonhosted.org/packages/82/e5/7e9440768a06dfb3075936490cb82dbf0ee20a133bf0dd8551fa096914ec/charset_normalizer-3.4.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d560742f3c0d62afaccf9f41fe485ed69bd7661a241f86a3ef0f0fb8b1a397af", size = 214684, upload-time = "2026-04-02T09:25:49.245Z" }, { url = "https://files.pythonhosted.org/packages/71/94/8c61d8da9f062fdf457c80acfa25060ec22bf1d34bbeaca4350f13bcfd07/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b14b2d9dac08e28bb8046a1a0434b1750eb221c8f5b87a68f4fa11a6f97b5e34", size = 212785, upload-time = "2026-04-02T09:25:50.671Z" }, { url = "https://files.pythonhosted.org/packages/66/cd/6e9889c648e72c0ab2e5967528bb83508f354d706637bc7097190c874e13/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bc17a677b21b3502a21f66a8cc64f5bfad4df8a0b8434d661666f8ce90ac3af1", size = 203055, upload-time = "2026-04-02T09:25:51.802Z" }, { url = "https://files.pythonhosted.org/packages/92/2e/7a951d6a08aefb7eb8e1b54cdfb580b1365afdd9dd484dc4bee9e5d8f258/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:750e02e074872a3fad7f233b47734166440af3cdea0add3e95163110816d6752", size = 232502, upload-time = "2026-04-02T09:25:53.388Z" }, { url = "https://files.pythonhosted.org/packages/58/d5/abcf2d83bf8e0a1286df55cd0dc1d49af0da4282aa77e986df343e7de124/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4e5163c14bffd570ef2affbfdd77bba66383890797df43dc8b4cc7d6f500bf53", size = 214295, upload-time = "2026-04-02T09:25:54.765Z" }, { url = "https://files.pythonhosted.org/packages/47/3a/7d4cd7ed54be99973a0dc176032cba5cb1f258082c31fa6df35cff46acfc/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6ed74185b2db44f41ef35fd1617c5888e59792da9bbc9190d6c7300617182616", size = 227145, upload-time = "2026-04-02T09:25:55.904Z" }, { url = "https://files.pythonhosted.org/packages/1d/98/3a45bf8247889cf28262ebd3d0872edff11565b2a1e3064ccb132db3fbb0/charset_normalizer-3.4.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:94e1885b270625a9a828c9793b4d52a64445299baa1fea5a173bf1d3dd9a1a5a", size = 218884, upload-time = "2026-04-02T09:25:57.074Z" }, { url = "https://files.pythonhosted.org/packages/ad/80/2e8b7f8915ed5c9ef13aa828d82738e33888c485b65ebf744d615040c7ea/charset_normalizer-3.4.7-cp310-cp310-win32.whl", hash = "sha256:6785f414ae0f3c733c437e0f3929197934f526d19dfaa75e18fdb4f94c6fb374", size = 148343, upload-time = "2026-04-02T09:25:58.199Z" }, { url = "https://files.pythonhosted.org/packages/35/1b/3b8c8c77184af465ee9ad88b5aea46ea6b2e1f7b9dc9502891e37af21e30/charset_normalizer-3.4.7-cp310-cp310-win_amd64.whl", hash = "sha256:6696b7688f54f5af4462118f0bfa7c1621eeb87154f77fa04b9295ce7a8f2943", size = 159174, upload-time = "2026-04-02T09:25:59.322Z" }, { url = "https://files.pythonhosted.org/packages/be/c1/feb40dca40dbb21e0a908801782d9288c64fc8d8e562c2098e9994c8c21b/charset_normalizer-3.4.7-cp310-cp310-win_arm64.whl", hash = "sha256:66671f93accb62ed07da56613636f3641f1a12c13046ce91ffc923721f23c008", size = 147805, upload-time = "2026-04-02T09:26:00.756Z" }, { url = "https://files.pythonhosted.org/packages/c2/d7/b5b7020a0565c2e9fa8c09f4b5fa6232feb326b8c20081ccded47ea368fd/charset_normalizer-3.4.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7641bb8895e77f921102f72833904dcd9901df5d6d72a2ab8f31d04b7e51e4e7", size = 309705, upload-time = "2026-04-02T09:26:02.191Z" }, { url = "https://files.pythonhosted.org/packages/5a/53/58c29116c340e5456724ecd2fff4196d236b98f3da97b404bc5e51ac3493/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:202389074300232baeb53ae2569a60901f7efadd4245cf3a3bf0617d60b439d7", size = 206419, upload-time = "2026-04-02T09:26:03.583Z" }, { url = "https://files.pythonhosted.org/packages/b2/02/e8146dc6591a37a00e5144c63f29fb7c97a734ea8a111190783c0e60ab63/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:30b8d1d8c52a48c2c5690e152c169b673487a2a58de1ec7393196753063fcd5e", size = 227901, upload-time = "2026-04-02T09:26:04.738Z" }, { url = "https://files.pythonhosted.org/packages/fb/73/77486c4cd58f1267bf17db420e930c9afa1b3be3fe8c8b8ebbebc9624359/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:532bc9bf33a68613fd7d65e4b1c71a6a38d7d42604ecf239c77392e9b4e8998c", size = 222742, upload-time = "2026-04-02T09:26:06.36Z" }, { url = "https://files.pythonhosted.org/packages/a1/fa/f74eb381a7d94ded44739e9d94de18dc5edc9c17fb8c11f0a6890696c0a9/charset_normalizer-3.4.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fe249cb4651fd12605b7288b24751d8bfd46d35f12a20b1ba33dea122e690df", size = 214061, upload-time = "2026-04-02T09:26:08.347Z" }, { url = "https://files.pythonhosted.org/packages/dc/92/42bd3cefcf7687253fb86694b45f37b733c97f59af3724f356fa92b8c344/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:65bcd23054beab4d166035cabbc868a09c1a49d1efe458fe8e4361215df40265", size = 199239, upload-time = "2026-04-02T09:26:09.823Z" }, { url = "https://files.pythonhosted.org/packages/4c/3d/069e7184e2aa3b3cddc700e3dd267413dc259854adc3380421c805c6a17d/charset_normalizer-3.4.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:08e721811161356f97b4059a9ba7bafb23ea5ee2255402c42881c214e173c6b4", size = 210173, upload-time = "2026-04-02T09:26:10.953Z" }, { url = "https://files.pythonhosted.org/packages/62/51/9d56feb5f2e7074c46f93e0ebdbe61f0848ee246e2f0d89f8e20b89ebb8f/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e060d01aec0a910bdccb8be71faf34e7799ce36950f8294c8bf612cba65a2c9e", size = 209841, upload-time = "2026-04-02T09:26:12.142Z" }, { url = "https://files.pythonhosted.org/packages/d2/59/893d8f99cc4c837dda1fe2f1139079703deb9f321aabcb032355de13b6c7/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:38c0109396c4cfc574d502df99742a45c72c08eff0a36158b6f04000043dbf38", size = 200304, upload-time = "2026-04-02T09:26:13.711Z" }, { url = "https://files.pythonhosted.org/packages/7d/1d/ee6f3be3464247578d1ed5c46de545ccc3d3ff933695395c402c21fa6b77/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:1c2a768fdd44ee4a9339a9b0b130049139b8ce3c01d2ce09f67f5a68048d477c", size = 229455, upload-time = "2026-04-02T09:26:14.941Z" }, { url = "https://files.pythonhosted.org/packages/54/bb/8fb0a946296ea96a488928bdce8ef99023998c48e4713af533e9bb98ef07/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:1a87ca9d5df6fe460483d9a5bbf2b18f620cbed41b432e2bddb686228282d10b", size = 210036, upload-time = "2026-04-02T09:26:16.478Z" }, { url = "https://files.pythonhosted.org/packages/9a/bc/015b2387f913749f82afd4fcba07846d05b6d784dd16123cb66860e0237d/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d635aab80466bc95771bb78d5370e74d36d1fe31467b6b29b8b57b2a3cd7d22c", size = 224739, upload-time = "2026-04-02T09:26:17.751Z" }, { url = "https://files.pythonhosted.org/packages/17/ab/63133691f56baae417493cba6b7c641571a2130eb7bceba6773367ab9ec5/charset_normalizer-3.4.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ae196f021b5e7c78e918242d217db021ed2a6ace2bc6ae94c0fc596221c7f58d", size = 216277, upload-time = "2026-04-02T09:26:18.981Z" }, { url = "https://files.pythonhosted.org/packages/06/6d/3be70e827977f20db77c12a97e6a9f973631a45b8d186c084527e53e77a4/charset_normalizer-3.4.7-cp311-cp311-win32.whl", hash = "sha256:adb2597b428735679446b46c8badf467b4ca5f5056aae4d51a19f9570301b1ad", size = 147819, upload-time = "2026-04-02T09:26:20.295Z" }, { url = "https://files.pythonhosted.org/packages/20/d9/5f67790f06b735d7c7637171bbfd89882ad67201891b7275e51116ed8207/charset_normalizer-3.4.7-cp311-cp311-win_amd64.whl", hash = "sha256:8e385e4267ab76874ae30db04c627faaaf0b509e1ccc11a95b3fc3e83f855c00", size = 159281, upload-time = "2026-04-02T09:26:21.74Z" }, { url = "https://files.pythonhosted.org/packages/ca/83/6413f36c5a34afead88ce6f66684d943d91f233d76dd083798f9602b75ae/charset_normalizer-3.4.7-cp311-cp311-win_arm64.whl", hash = "sha256:d4a48e5b3c2a489fae013b7589308a40146ee081f6f509e047e0e096084ceca1", size = 147843, upload-time = "2026-04-02T09:26:22.901Z" }, { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, ] [[package]] name = "click" version = "8.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/60/6c/8ca2efa64cf75a977a0d7fac081354553ebe483345c734fb6b6515d96bbc/click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202", size = 286342, upload-time = "2025-05-20T23:19:49.832Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/85/32/10bb5764d90a8eee674e9dc6f4db6a0ab47c8c4d0d83c27f7c39ac415a4d/click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b", size = 102215, upload-time = "2025-05-20T23:19:47.796Z" }, ] [[package]] name = "colorama" version = "0.4.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] [[package]] name = "contourpy" version = "1.3.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version < '3.11'", ] dependencies = [ { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, { url = "https://files.pythonhosted.org/packages/2e/61/5673f7e364b31e4e7ef6f61a4b5121c5f170f941895912f773d95270f3a2/contourpy-1.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb", size = 271630, upload-time = "2025-04-15T17:38:19.142Z" }, { url = "https://files.pythonhosted.org/packages/ff/66/a40badddd1223822c95798c55292844b7e871e50f6bfd9f158cb25e0bd39/contourpy-1.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08", size = 255670, upload-time = "2025-04-15T17:38:23.688Z" }, { url = "https://files.pythonhosted.org/packages/1e/c7/cf9fdee8200805c9bc3b148f49cb9482a4e3ea2719e772602a425c9b09f8/contourpy-1.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c", size = 306694, upload-time = "2025-04-15T17:38:28.238Z" }, { url = "https://files.pythonhosted.org/packages/dd/e7/ccb9bec80e1ba121efbffad7f38021021cda5be87532ec16fd96533bb2e0/contourpy-1.3.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f", size = 345986, upload-time = "2025-04-15T17:38:33.502Z" }, { url = "https://files.pythonhosted.org/packages/dc/49/ca13bb2da90391fa4219fdb23b078d6065ada886658ac7818e5441448b78/contourpy-1.3.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85", size = 318060, upload-time = "2025-04-15T17:38:38.672Z" }, { url = "https://files.pythonhosted.org/packages/c8/65/5245ce8c548a8422236c13ffcdcdada6a2a812c361e9e0c70548bb40b661/contourpy-1.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841", size = 322747, upload-time = "2025-04-15T17:38:43.712Z" }, { url = "https://files.pythonhosted.org/packages/72/30/669b8eb48e0a01c660ead3752a25b44fdb2e5ebc13a55782f639170772f9/contourpy-1.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422", size = 1308895, upload-time = "2025-04-15T17:39:00.224Z" }, { url = "https://files.pythonhosted.org/packages/05/5a/b569f4250decee6e8d54498be7bdf29021a4c256e77fe8138c8319ef8eb3/contourpy-1.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef", size = 1379098, upload-time = "2025-04-15T17:43:29.649Z" }, { url = "https://files.pythonhosted.org/packages/19/ba/b227c3886d120e60e41b28740ac3617b2f2b971b9f601c835661194579f1/contourpy-1.3.2-cp313-cp313-win32.whl", hash = "sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f", size = 178535, upload-time = "2025-04-15T17:44:44.532Z" }, { url = "https://files.pythonhosted.org/packages/12/6e/2fed56cd47ca739b43e892707ae9a13790a486a3173be063681ca67d2262/contourpy-1.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9", size = 223096, upload-time = "2025-04-15T17:44:48.194Z" }, { url = "https://files.pythonhosted.org/packages/54/4c/e76fe2a03014a7c767d79ea35c86a747e9325537a8b7627e0e5b3ba266b4/contourpy-1.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f", size = 285090, upload-time = "2025-04-15T17:43:34.084Z" }, { url = "https://files.pythonhosted.org/packages/7b/e2/5aba47debd55d668e00baf9651b721e7733975dc9fc27264a62b0dd26eb8/contourpy-1.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739", size = 268643, upload-time = "2025-04-15T17:43:38.626Z" }, { url = "https://files.pythonhosted.org/packages/a1/37/cd45f1f051fe6230f751cc5cdd2728bb3a203f5619510ef11e732109593c/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823", size = 310443, upload-time = "2025-04-15T17:43:44.522Z" }, { url = "https://files.pythonhosted.org/packages/8b/a2/36ea6140c306c9ff6dd38e3bcec80b3b018474ef4d17eb68ceecd26675f4/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5", size = 349865, upload-time = "2025-04-15T17:43:49.545Z" }, { url = "https://files.pythonhosted.org/packages/95/b7/2fc76bc539693180488f7b6cc518da7acbbb9e3b931fd9280504128bf956/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532", size = 321162, upload-time = "2025-04-15T17:43:54.203Z" }, { url = "https://files.pythonhosted.org/packages/f4/10/76d4f778458b0aa83f96e59d65ece72a060bacb20cfbee46cf6cd5ceba41/contourpy-1.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b", size = 327355, upload-time = "2025-04-15T17:44:01.025Z" }, { url = "https://files.pythonhosted.org/packages/43/a3/10cf483ea683f9f8ab096c24bad3cce20e0d1dd9a4baa0e2093c1c962d9d/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52", size = 1307935, upload-time = "2025-04-15T17:44:17.322Z" }, { url = "https://files.pythonhosted.org/packages/78/73/69dd9a024444489e22d86108e7b913f3528f56cfc312b5c5727a44188471/contourpy-1.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd", size = 1372168, upload-time = "2025-04-15T17:44:33.43Z" }, { url = "https://files.pythonhosted.org/packages/0f/1b/96d586ccf1b1a9d2004dd519b25fbf104a11589abfd05484ff12199cca21/contourpy-1.3.2-cp313-cp313t-win32.whl", hash = "sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1", size = 189550, upload-time = "2025-04-15T17:44:37.092Z" }, { url = "https://files.pythonhosted.org/packages/b0/e6/6000d0094e8a5e32ad62591c8609e269febb6e4db83a1c75ff8868b42731/contourpy-1.3.2-cp313-cp313t-win_amd64.whl", hash = "sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69", size = 238214, upload-time = "2025-04-15T17:44:40.827Z" }, { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, ] [[package]] name = "contourpy" version = "1.3.3" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] dependencies = [ { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, { url = "https://files.pythonhosted.org/packages/68/35/0167aad910bbdb9599272bd96d01a9ec6852f36b9455cf2ca67bd4cc2d23/contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5", size = 293257, upload-time = "2025-07-26T12:01:39.367Z" }, { url = "https://files.pythonhosted.org/packages/96/e4/7adcd9c8362745b2210728f209bfbcf7d91ba868a2c5f40d8b58f54c509b/contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1", size = 274034, upload-time = "2025-07-26T12:01:40.645Z" }, { url = "https://files.pythonhosted.org/packages/73/23/90e31ceeed1de63058a02cb04b12f2de4b40e3bef5e082a7c18d9c8ae281/contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286", size = 334672, upload-time = "2025-07-26T12:01:41.942Z" }, { url = "https://files.pythonhosted.org/packages/ed/93/b43d8acbe67392e659e1d984700e79eb67e2acb2bd7f62012b583a7f1b55/contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5", size = 381234, upload-time = "2025-07-26T12:01:43.499Z" }, { url = "https://files.pythonhosted.org/packages/46/3b/bec82a3ea06f66711520f75a40c8fc0b113b2a75edb36aa633eb11c4f50f/contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67", size = 385169, upload-time = "2025-07-26T12:01:45.219Z" }, { url = "https://files.pythonhosted.org/packages/4b/32/e0f13a1c5b0f8572d0ec6ae2f6c677b7991fafd95da523159c19eff0696a/contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9", size = 362859, upload-time = "2025-07-26T12:01:46.519Z" }, { url = "https://files.pythonhosted.org/packages/33/71/e2a7945b7de4e58af42d708a219f3b2f4cff7386e6b6ab0a0fa0033c49a9/contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659", size = 1332062, upload-time = "2025-07-26T12:01:48.964Z" }, { url = "https://files.pythonhosted.org/packages/12/fc/4e87ac754220ccc0e807284f88e943d6d43b43843614f0a8afa469801db0/contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7", size = 1403932, upload-time = "2025-07-26T12:01:51.979Z" }, { url = "https://files.pythonhosted.org/packages/a6/2e/adc197a37443f934594112222ac1aa7dc9a98faf9c3842884df9a9d8751d/contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d", size = 185024, upload-time = "2025-07-26T12:01:53.245Z" }, { url = "https://files.pythonhosted.org/packages/18/0b/0098c214843213759692cc638fce7de5c289200a830e5035d1791d7a2338/contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263", size = 226578, upload-time = "2025-07-26T12:01:54.422Z" }, { url = "https://files.pythonhosted.org/packages/8a/9a/2f6024a0c5995243cd63afdeb3651c984f0d2bc727fd98066d40e141ad73/contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9", size = 193524, upload-time = "2025-07-26T12:01:55.73Z" }, { url = "https://files.pythonhosted.org/packages/c0/b3/f8a1a86bd3298513f500e5b1f5fd92b69896449f6cab6a146a5d52715479/contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d", size = 306730, upload-time = "2025-07-26T12:01:57.051Z" }, { url = "https://files.pythonhosted.org/packages/3f/11/4780db94ae62fc0c2053909b65dc3246bd7cecfc4f8a20d957ad43aa4ad8/contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216", size = 287897, upload-time = "2025-07-26T12:01:58.663Z" }, { url = "https://files.pythonhosted.org/packages/ae/15/e59f5f3ffdd6f3d4daa3e47114c53daabcb18574a26c21f03dc9e4e42ff0/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae", size = 326751, upload-time = "2025-07-26T12:02:00.343Z" }, { url = "https://files.pythonhosted.org/packages/0f/81/03b45cfad088e4770b1dcf72ea78d3802d04200009fb364d18a493857210/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20", size = 375486, upload-time = "2025-07-26T12:02:02.128Z" }, { url = "https://files.pythonhosted.org/packages/0c/ba/49923366492ffbdd4486e970d421b289a670ae8cf539c1ea9a09822b371a/contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99", size = 388106, upload-time = "2025-07-26T12:02:03.615Z" }, { url = "https://files.pythonhosted.org/packages/9f/52/5b00ea89525f8f143651f9f03a0df371d3cbd2fccd21ca9b768c7a6500c2/contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b", size = 352548, upload-time = "2025-07-26T12:02:05.165Z" }, { url = "https://files.pythonhosted.org/packages/32/1d/a209ec1a3a3452d490f6b14dd92e72280c99ae3d1e73da74f8277d4ee08f/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a", size = 1322297, upload-time = "2025-07-26T12:02:07.379Z" }, { url = "https://files.pythonhosted.org/packages/bc/9e/46f0e8ebdd884ca0e8877e46a3f4e633f6c9c8c4f3f6e72be3fe075994aa/contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e", size = 1391023, upload-time = "2025-07-26T12:02:10.171Z" }, { url = "https://files.pythonhosted.org/packages/b9/70/f308384a3ae9cd2209e0849f33c913f658d3326900d0ff5d378d6a1422d2/contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3", size = 196157, upload-time = "2025-07-26T12:02:11.488Z" }, { url = "https://files.pythonhosted.org/packages/b2/dd/880f890a6663b84d9e34a6f88cded89d78f0091e0045a284427cb6b18521/contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8", size = 240570, upload-time = "2025-07-26T12:02:12.754Z" }, { url = "https://files.pythonhosted.org/packages/80/99/2adc7d8ffead633234817ef8e9a87115c8a11927a94478f6bb3d3f4d4f7d/contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301", size = 199713, upload-time = "2025-07-26T12:02:14.4Z" }, { url = "https://files.pythonhosted.org/packages/72/8b/4546f3ab60f78c514ffb7d01a0bd743f90de36f0019d1be84d0a708a580a/contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a", size = 292189, upload-time = "2025-07-26T12:02:16.095Z" }, { url = "https://files.pythonhosted.org/packages/fd/e1/3542a9cb596cadd76fcef413f19c79216e002623158befe6daa03dbfa88c/contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77", size = 273251, upload-time = "2025-07-26T12:02:17.524Z" }, { url = "https://files.pythonhosted.org/packages/b1/71/f93e1e9471d189f79d0ce2497007731c1e6bf9ef6d1d61b911430c3db4e5/contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5", size = 335810, upload-time = "2025-07-26T12:02:18.9Z" }, { url = "https://files.pythonhosted.org/packages/91/f9/e35f4c1c93f9275d4e38681a80506b5510e9327350c51f8d4a5a724d178c/contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4", size = 382871, upload-time = "2025-07-26T12:02:20.418Z" }, { url = "https://files.pythonhosted.org/packages/b5/71/47b512f936f66a0a900d81c396a7e60d73419868fba959c61efed7a8ab46/contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36", size = 386264, upload-time = "2025-07-26T12:02:21.916Z" }, { url = "https://files.pythonhosted.org/packages/04/5f/9ff93450ba96b09c7c2b3f81c94de31c89f92292f1380261bd7195bea4ea/contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3", size = 363819, upload-time = "2025-07-26T12:02:23.759Z" }, { url = "https://files.pythonhosted.org/packages/3e/a6/0b185d4cc480ee494945cde102cb0149ae830b5fa17bf855b95f2e70ad13/contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b", size = 1333650, upload-time = "2025-07-26T12:02:26.181Z" }, { url = "https://files.pythonhosted.org/packages/43/d7/afdc95580ca56f30fbcd3060250f66cedbde69b4547028863abd8aa3b47e/contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36", size = 1404833, upload-time = "2025-07-26T12:02:28.782Z" }, { url = "https://files.pythonhosted.org/packages/e2/e2/366af18a6d386f41132a48f033cbd2102e9b0cf6345d35ff0826cd984566/contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d", size = 189692, upload-time = "2025-07-26T12:02:30.128Z" }, { url = "https://files.pythonhosted.org/packages/7d/c2/57f54b03d0f22d4044b8afb9ca0e184f8b1afd57b4f735c2fa70883dc601/contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd", size = 232424, upload-time = "2025-07-26T12:02:31.395Z" }, { url = "https://files.pythonhosted.org/packages/18/79/a9416650df9b525737ab521aa181ccc42d56016d2123ddcb7b58e926a42c/contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339", size = 198300, upload-time = "2025-07-26T12:02:32.956Z" }, { url = "https://files.pythonhosted.org/packages/1f/42/38c159a7d0f2b7b9c04c64ab317042bb6952b713ba875c1681529a2932fe/contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772", size = 306769, upload-time = "2025-07-26T12:02:34.2Z" }, { url = "https://files.pythonhosted.org/packages/c3/6c/26a8205f24bca10974e77460de68d3d7c63e282e23782f1239f226fcae6f/contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77", size = 287892, upload-time = "2025-07-26T12:02:35.807Z" }, { url = "https://files.pythonhosted.org/packages/66/06/8a475c8ab718ebfd7925661747dbb3c3ee9c82ac834ccb3570be49d129f4/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13", size = 326748, upload-time = "2025-07-26T12:02:37.193Z" }, { url = "https://files.pythonhosted.org/packages/b4/a3/c5ca9f010a44c223f098fccd8b158bb1cb287378a31ac141f04730dc49be/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe", size = 375554, upload-time = "2025-07-26T12:02:38.894Z" }, { url = "https://files.pythonhosted.org/packages/80/5b/68bd33ae63fac658a4145088c1e894405e07584a316738710b636c6d0333/contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f", size = 388118, upload-time = "2025-07-26T12:02:40.642Z" }, { url = "https://files.pythonhosted.org/packages/40/52/4c285a6435940ae25d7410a6c36bda5145839bc3f0beb20c707cda18b9d2/contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0", size = 352555, upload-time = "2025-07-26T12:02:42.25Z" }, { url = "https://files.pythonhosted.org/packages/24/ee/3e81e1dd174f5c7fefe50e85d0892de05ca4e26ef1c9a59c2a57e43b865a/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4", size = 1322295, upload-time = "2025-07-26T12:02:44.668Z" }, { url = "https://files.pythonhosted.org/packages/3c/b2/6d913d4d04e14379de429057cd169e5e00f6c2af3bb13e1710bcbdb5da12/contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f", size = 1391027, upload-time = "2025-07-26T12:02:47.09Z" }, { url = "https://files.pythonhosted.org/packages/93/8a/68a4ec5c55a2971213d29a9374913f7e9f18581945a7a31d1a39b5d2dfe5/contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae", size = 202428, upload-time = "2025-07-26T12:02:48.691Z" }, { url = "https://files.pythonhosted.org/packages/fa/96/fd9f641ffedc4fa3ace923af73b9d07e869496c9cc7a459103e6e978992f/contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc", size = 250331, upload-time = "2025-07-26T12:02:50.137Z" }, { url = "https://files.pythonhosted.org/packages/ae/8c/469afb6465b853afff216f9528ffda78a915ff880ed58813ba4faf4ba0b6/contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b", size = 203831, upload-time = "2025-07-26T12:02:51.449Z" }, { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, ] [[package]] name = "coverage" version = "7.10.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/14/70/025b179c993f019105b79575ac6edb5e084fb0f0e63f15cdebef4e454fb5/coverage-7.10.6.tar.gz", hash = "sha256:f644a3ae5933a552a29dbb9aa2f90c677a875f80ebea028e5a52a4f429044b90", size = 823736, upload-time = "2025-08-29T15:35:16.668Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/a8/1d/2e64b43d978b5bd184e0756a41415597dfef30fcbd90b747474bd749d45f/coverage-7.10.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:70e7bfbd57126b5554aa482691145f798d7df77489a177a6bef80de78860a356", size = 217025, upload-time = "2025-08-29T15:32:57.169Z" }, { url = "https://files.pythonhosted.org/packages/23/62/b1e0f513417c02cc10ef735c3ee5186df55f190f70498b3702d516aad06f/coverage-7.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e41be6f0f19da64af13403e52f2dec38bbc2937af54df8ecef10850ff8d35301", size = 217419, upload-time = "2025-08-29T15:32:59.908Z" }, { url = "https://files.pythonhosted.org/packages/e7/16/b800640b7a43e7c538429e4d7223e0a94fd72453a1a048f70bf766f12e96/coverage-7.10.6-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c61fc91ab80b23f5fddbee342d19662f3d3328173229caded831aa0bd7595460", size = 244180, upload-time = "2025-08-29T15:33:01.608Z" }, { url = "https://files.pythonhosted.org/packages/fb/6f/5e03631c3305cad187eaf76af0b559fff88af9a0b0c180d006fb02413d7a/coverage-7.10.6-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10356fdd33a7cc06e8051413140bbdc6f972137508a3572e3f59f805cd2832fd", size = 245992, upload-time = "2025-08-29T15:33:03.239Z" }, { url = "https://files.pythonhosted.org/packages/eb/a1/f30ea0fb400b080730125b490771ec62b3375789f90af0bb68bfb8a921d7/coverage-7.10.6-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:80b1695cf7c5ebe7b44bf2521221b9bb8cdf69b1f24231149a7e3eb1ae5fa2fb", size = 247851, upload-time = "2025-08-29T15:33:04.603Z" }, { url = "https://files.pythonhosted.org/packages/02/8e/cfa8fee8e8ef9a6bb76c7bef039f3302f44e615d2194161a21d3d83ac2e9/coverage-7.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2e4c33e6378b9d52d3454bd08847a8651f4ed23ddbb4a0520227bd346382bbc6", size = 245891, upload-time = "2025-08-29T15:33:06.176Z" }, { url = "https://files.pythonhosted.org/packages/93/a9/51be09b75c55c4f6c16d8d73a6a1d46ad764acca0eab48fa2ffaef5958fe/coverage-7.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:c8a3ec16e34ef980a46f60dc6ad86ec60f763c3f2fa0db6d261e6e754f72e945", size = 243909, upload-time = "2025-08-29T15:33:07.74Z" }, { url = "https://files.pythonhosted.org/packages/e9/a6/ba188b376529ce36483b2d585ca7bdac64aacbe5aa10da5978029a9c94db/coverage-7.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7d79dabc0a56f5af990cc6da9ad1e40766e82773c075f09cc571e2076fef882e", size = 244786, upload-time = "2025-08-29T15:33:08.965Z" }, { url = "https://files.pythonhosted.org/packages/d0/4c/37ed872374a21813e0d3215256180c9a382c3f5ced6f2e5da0102fc2fd3e/coverage-7.10.6-cp310-cp310-win32.whl", hash = "sha256:86b9b59f2b16e981906e9d6383eb6446d5b46c278460ae2c36487667717eccf1", size = 219521, upload-time = "2025-08-29T15:33:10.599Z" }, { url = "https://files.pythonhosted.org/packages/8e/36/9311352fdc551dec5b973b61f4e453227ce482985a9368305880af4f85dd/coverage-7.10.6-cp310-cp310-win_amd64.whl", hash = "sha256:e132b9152749bd33534e5bd8565c7576f135f157b4029b975e15ee184325f528", size = 220417, upload-time = "2025-08-29T15:33:11.907Z" }, { url = "https://files.pythonhosted.org/packages/d4/16/2bea27e212c4980753d6d563a0803c150edeaaddb0771a50d2afc410a261/coverage-7.10.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c706db3cabb7ceef779de68270150665e710b46d56372455cd741184f3868d8f", size = 217129, upload-time = "2025-08-29T15:33:13.575Z" }, { url = "https://files.pythonhosted.org/packages/2a/51/e7159e068831ab37e31aac0969d47b8c5ee25b7d307b51e310ec34869315/coverage-7.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e0c38dc289e0508ef68ec95834cb5d2e96fdbe792eaccaa1bccac3966bbadcc", size = 217532, upload-time = "2025-08-29T15:33:14.872Z" }, { url = "https://files.pythonhosted.org/packages/e7/c0/246ccbea53d6099325d25cd208df94ea435cd55f0db38099dd721efc7a1f/coverage-7.10.6-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:752a3005a1ded28f2f3a6e8787e24f28d6abe176ca64677bcd8d53d6fe2ec08a", size = 247931, upload-time = "2025-08-29T15:33:16.142Z" }, { url = "https://files.pythonhosted.org/packages/7d/fb/7435ef8ab9b2594a6e3f58505cc30e98ae8b33265d844007737946c59389/coverage-7.10.6-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:689920ecfd60f992cafca4f5477d55720466ad2c7fa29bb56ac8d44a1ac2b47a", size = 249864, upload-time = "2025-08-29T15:33:17.434Z" }, { url = "https://files.pythonhosted.org/packages/51/f8/d9d64e8da7bcddb094d511154824038833c81e3a039020a9d6539bf303e9/coverage-7.10.6-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec98435796d2624d6905820a42f82149ee9fc4f2d45c2c5bc5a44481cc50db62", size = 251969, upload-time = "2025-08-29T15:33:18.822Z" }, { url = "https://files.pythonhosted.org/packages/43/28/c43ba0ef19f446d6463c751315140d8f2a521e04c3e79e5c5fe211bfa430/coverage-7.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b37201ce4a458c7a758ecc4efa92fa8ed783c66e0fa3c42ae19fc454a0792153", size = 249659, upload-time = "2025-08-29T15:33:20.407Z" }, { url = "https://files.pythonhosted.org/packages/79/3e/53635bd0b72beaacf265784508a0b386defc9ab7fad99ff95f79ce9db555/coverage-7.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:2904271c80898663c810a6b067920a61dd8d38341244a3605bd31ab55250dad5", size = 247714, upload-time = "2025-08-29T15:33:21.751Z" }, { url = "https://files.pythonhosted.org/packages/4c/55/0964aa87126624e8c159e32b0bc4e84edef78c89a1a4b924d28dd8265625/coverage-7.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5aea98383463d6e1fa4e95416d8de66f2d0cb588774ee20ae1b28df826bcb619", size = 248351, upload-time = "2025-08-29T15:33:23.105Z" }, { url = "https://files.pythonhosted.org/packages/eb/ab/6cfa9dc518c6c8e14a691c54e53a9433ba67336c760607e299bfcf520cb1/coverage-7.10.6-cp311-cp311-win32.whl", hash = "sha256:e3fb1fa01d3598002777dd259c0c2e6d9d5e10e7222976fc8e03992f972a2cba", size = 219562, upload-time = "2025-08-29T15:33:24.717Z" }, { url = "https://files.pythonhosted.org/packages/5b/18/99b25346690cbc55922e7cfef06d755d4abee803ef335baff0014268eff4/coverage-7.10.6-cp311-cp311-win_amd64.whl", hash = "sha256:f35ed9d945bece26553d5b4c8630453169672bea0050a564456eb88bdffd927e", size = 220453, upload-time = "2025-08-29T15:33:26.482Z" }, { url = "https://files.pythonhosted.org/packages/d8/ed/81d86648a07ccb124a5cf1f1a7788712b8d7216b593562683cd5c9b0d2c1/coverage-7.10.6-cp311-cp311-win_arm64.whl", hash = "sha256:99e1a305c7765631d74b98bf7dbf54eeea931f975e80f115437d23848ee8c27c", size = 219127, upload-time = "2025-08-29T15:33:27.777Z" }, { url = "https://files.pythonhosted.org/packages/26/06/263f3305c97ad78aab066d116b52250dd316e74fcc20c197b61e07eb391a/coverage-7.10.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5b2dd6059938063a2c9fee1af729d4f2af28fd1a545e9b7652861f0d752ebcea", size = 217324, upload-time = "2025-08-29T15:33:29.06Z" }, { url = "https://files.pythonhosted.org/packages/e9/60/1e1ded9a4fe80d843d7d53b3e395c1db3ff32d6c301e501f393b2e6c1c1f/coverage-7.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:388d80e56191bf846c485c14ae2bc8898aa3124d9d35903fef7d907780477634", size = 217560, upload-time = "2025-08-29T15:33:30.748Z" }, { url = "https://files.pythonhosted.org/packages/b8/25/52136173c14e26dfed8b106ed725811bb53c30b896d04d28d74cb64318b3/coverage-7.10.6-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:90cb5b1a4670662719591aa92d0095bb41714970c0b065b02a2610172dbf0af6", size = 249053, upload-time = "2025-08-29T15:33:32.041Z" }, { url = "https://files.pythonhosted.org/packages/cb/1d/ae25a7dc58fcce8b172d42ffe5313fc267afe61c97fa872b80ee72d9515a/coverage-7.10.6-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:961834e2f2b863a0e14260a9a273aff07ff7818ab6e66d2addf5628590c628f9", size = 251802, upload-time = "2025-08-29T15:33:33.625Z" }, { url = "https://files.pythonhosted.org/packages/f5/7a/1f561d47743710fe996957ed7c124b421320f150f1d38523d8d9102d3e2a/coverage-7.10.6-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf9a19f5012dab774628491659646335b1928cfc931bf8d97b0d5918dd58033c", size = 252935, upload-time = "2025-08-29T15:33:34.909Z" }, { url = "https://files.pythonhosted.org/packages/6c/ad/8b97cd5d28aecdfde792dcbf646bac141167a5cacae2cd775998b45fabb5/coverage-7.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99c4283e2a0e147b9c9cc6bc9c96124de9419d6044837e9799763a0e29a7321a", size = 250855, upload-time = "2025-08-29T15:33:36.922Z" }, { url = "https://files.pythonhosted.org/packages/33/6a/95c32b558d9a61858ff9d79580d3877df3eb5bc9eed0941b1f187c89e143/coverage-7.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:282b1b20f45df57cc508c1e033403f02283adfb67d4c9c35a90281d81e5c52c5", size = 248974, upload-time = "2025-08-29T15:33:38.175Z" }, { url = "https://files.pythonhosted.org/packages/0d/9c/8ce95dee640a38e760d5b747c10913e7a06554704d60b41e73fdea6a1ffd/coverage-7.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8cdbe264f11afd69841bd8c0d83ca10b5b32853263ee62e6ac6a0ab63895f972", size = 250409, upload-time = "2025-08-29T15:33:39.447Z" }, { url = "https://files.pythonhosted.org/packages/04/12/7a55b0bdde78a98e2eb2356771fd2dcddb96579e8342bb52aa5bc52e96f0/coverage-7.10.6-cp312-cp312-win32.whl", hash = "sha256:a517feaf3a0a3eca1ee985d8373135cfdedfbba3882a5eab4362bda7c7cf518d", size = 219724, upload-time = "2025-08-29T15:33:41.172Z" }, { url = "https://files.pythonhosted.org/packages/36/4a/32b185b8b8e327802c9efce3d3108d2fe2d9d31f153a0f7ecfd59c773705/coverage-7.10.6-cp312-cp312-win_amd64.whl", hash = "sha256:856986eadf41f52b214176d894a7de05331117f6035a28ac0016c0f63d887629", size = 220536, upload-time = "2025-08-29T15:33:42.524Z" }, { url = "https://files.pythonhosted.org/packages/08/3a/d5d8dc703e4998038c3099eaf77adddb00536a3cec08c8dcd556a36a3eb4/coverage-7.10.6-cp312-cp312-win_arm64.whl", hash = "sha256:acf36b8268785aad739443fa2780c16260ee3fa09d12b3a70f772ef100939d80", size = 219171, upload-time = "2025-08-29T15:33:43.974Z" }, { url = "https://files.pythonhosted.org/packages/bd/e7/917e5953ea29a28c1057729c1d5af9084ab6d9c66217523fd0e10f14d8f6/coverage-7.10.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ffea0575345e9ee0144dfe5701aa17f3ba546f8c3bb48db62ae101afb740e7d6", size = 217351, upload-time = "2025-08-29T15:33:45.438Z" }, { url = "https://files.pythonhosted.org/packages/eb/86/2e161b93a4f11d0ea93f9bebb6a53f113d5d6e416d7561ca41bb0a29996b/coverage-7.10.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:95d91d7317cde40a1c249d6b7382750b7e6d86fad9d8eaf4fa3f8f44cf171e80", size = 217600, upload-time = "2025-08-29T15:33:47.269Z" }, { url = "https://files.pythonhosted.org/packages/0e/66/d03348fdd8df262b3a7fb4ee5727e6e4936e39e2f3a842e803196946f200/coverage-7.10.6-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e23dd5408fe71a356b41baa82892772a4cefcf758f2ca3383d2aa39e1b7a003", size = 248600, upload-time = "2025-08-29T15:33:48.953Z" }, { url = "https://files.pythonhosted.org/packages/73/dd/508420fb47d09d904d962f123221bc249f64b5e56aa93d5f5f7603be475f/coverage-7.10.6-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:0f3f56e4cb573755e96a16501a98bf211f100463d70275759e73f3cbc00d4f27", size = 251206, upload-time = "2025-08-29T15:33:50.697Z" }, { url = "https://files.pythonhosted.org/packages/e9/1f/9020135734184f439da85c70ea78194c2730e56c2d18aee6e8ff1719d50d/coverage-7.10.6-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:db4a1d897bbbe7339946ffa2fe60c10cc81c43fab8b062d3fcb84188688174a4", size = 252478, upload-time = "2025-08-29T15:33:52.303Z" }, { url = "https://files.pythonhosted.org/packages/a4/a4/3d228f3942bb5a2051fde28c136eea23a761177dc4ff4ef54533164ce255/coverage-7.10.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d8fd7879082953c156d5b13c74aa6cca37f6a6f4747b39538504c3f9c63d043d", size = 250637, upload-time = "2025-08-29T15:33:53.67Z" }, { url = "https://files.pythonhosted.org/packages/36/e3/293dce8cdb9a83de971637afc59b7190faad60603b40e32635cbd15fbf61/coverage-7.10.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:28395ca3f71cd103b8c116333fa9db867f3a3e1ad6a084aa3725ae002b6583bc", size = 248529, upload-time = "2025-08-29T15:33:55.022Z" }, { url = "https://files.pythonhosted.org/packages/90/26/64eecfa214e80dd1d101e420cab2901827de0e49631d666543d0e53cf597/coverage-7.10.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:61c950fc33d29c91b9e18540e1aed7d9f6787cc870a3e4032493bbbe641d12fc", size = 250143, upload-time = "2025-08-29T15:33:56.386Z" }, { url = "https://files.pythonhosted.org/packages/3e/70/bd80588338f65ea5b0d97e424b820fb4068b9cfb9597fbd91963086e004b/coverage-7.10.6-cp313-cp313-win32.whl", hash = "sha256:160c00a5e6b6bdf4e5984b0ef21fc860bc94416c41b7df4d63f536d17c38902e", size = 219770, upload-time = "2025-08-29T15:33:58.063Z" }, { url = "https://files.pythonhosted.org/packages/a7/14/0b831122305abcc1060c008f6c97bbdc0a913ab47d65070a01dc50293c2b/coverage-7.10.6-cp313-cp313-win_amd64.whl", hash = "sha256:628055297f3e2aa181464c3808402887643405573eb3d9de060d81531fa79d32", size = 220566, upload-time = "2025-08-29T15:33:59.766Z" }, { url = "https://files.pythonhosted.org/packages/83/c6/81a83778c1f83f1a4a168ed6673eeedc205afb562d8500175292ca64b94e/coverage-7.10.6-cp313-cp313-win_arm64.whl", hash = "sha256:df4ec1f8540b0bcbe26ca7dd0f541847cc8a108b35596f9f91f59f0c060bfdd2", size = 219195, upload-time = "2025-08-29T15:34:01.191Z" }, { url = "https://files.pythonhosted.org/packages/d7/1c/ccccf4bf116f9517275fa85047495515add43e41dfe8e0bef6e333c6b344/coverage-7.10.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c9a8b7a34a4de3ed987f636f71881cd3b8339f61118b1aa311fbda12741bff0b", size = 218059, upload-time = "2025-08-29T15:34:02.91Z" }, { url = "https://files.pythonhosted.org/packages/92/97/8a3ceff833d27c7492af4f39d5da6761e9ff624831db9e9f25b3886ddbca/coverage-7.10.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:8dd5af36092430c2b075cee966719898f2ae87b636cefb85a653f1d0ba5d5393", size = 218287, upload-time = "2025-08-29T15:34:05.106Z" }, { url = "https://files.pythonhosted.org/packages/92/d8/50b4a32580cf41ff0423777a2791aaf3269ab60c840b62009aec12d3970d/coverage-7.10.6-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:b0353b0f0850d49ada66fdd7d0c7cdb0f86b900bb9e367024fd14a60cecc1e27", size = 259625, upload-time = "2025-08-29T15:34:06.575Z" }, { url = "https://files.pythonhosted.org/packages/7e/7e/6a7df5a6fb440a0179d94a348eb6616ed4745e7df26bf2a02bc4db72c421/coverage-7.10.6-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d6b9ae13d5d3e8aeca9ca94198aa7b3ebbc5acfada557d724f2a1f03d2c0b0df", size = 261801, upload-time = "2025-08-29T15:34:08.006Z" }, { url = "https://files.pythonhosted.org/packages/3a/4c/a270a414f4ed5d196b9d3d67922968e768cd971d1b251e1b4f75e9362f75/coverage-7.10.6-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:675824a363cc05781b1527b39dc2587b8984965834a748177ee3c37b64ffeafb", size = 264027, upload-time = "2025-08-29T15:34:09.806Z" }, { url = "https://files.pythonhosted.org/packages/9c/8b/3210d663d594926c12f373c5370bf1e7c5c3a427519a8afa65b561b9a55c/coverage-7.10.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:692d70ea725f471a547c305f0d0fc6a73480c62fb0da726370c088ab21aed282", size = 261576, upload-time = "2025-08-29T15:34:11.585Z" }, { url = "https://files.pythonhosted.org/packages/72/d0/e1961eff67e9e1dba3fc5eb7a4caf726b35a5b03776892da8d79ec895775/coverage-7.10.6-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:851430a9a361c7a8484a36126d1d0ff8d529d97385eacc8dfdc9bfc8c2d2cbe4", size = 259341, upload-time = "2025-08-29T15:34:13.159Z" }, { url = "https://files.pythonhosted.org/packages/3a/06/d6478d152cd189b33eac691cba27a40704990ba95de49771285f34a5861e/coverage-7.10.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d9369a23186d189b2fc95cc08b8160ba242057e887d766864f7adf3c46b2df21", size = 260468, upload-time = "2025-08-29T15:34:14.571Z" }, { url = "https://files.pythonhosted.org/packages/ed/73/737440247c914a332f0b47f7598535b29965bf305e19bbc22d4c39615d2b/coverage-7.10.6-cp313-cp313t-win32.whl", hash = "sha256:92be86fcb125e9bda0da7806afd29a3fd33fdf58fba5d60318399adf40bf37d0", size = 220429, upload-time = "2025-08-29T15:34:16.394Z" }, { url = "https://files.pythonhosted.org/packages/bd/76/b92d3214740f2357ef4a27c75a526eb6c28f79c402e9f20a922c295c05e2/coverage-7.10.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6b3039e2ca459a70c79523d39347d83b73f2f06af5624905eba7ec34d64d80b5", size = 221493, upload-time = "2025-08-29T15:34:17.835Z" }, { url = "https://files.pythonhosted.org/packages/fc/8e/6dcb29c599c8a1f654ec6cb68d76644fe635513af16e932d2d4ad1e5ac6e/coverage-7.10.6-cp313-cp313t-win_arm64.whl", hash = "sha256:3fb99d0786fe17b228eab663d16bee2288e8724d26a199c29325aac4b0319b9b", size = 219757, upload-time = "2025-08-29T15:34:19.248Z" }, { url = "https://files.pythonhosted.org/packages/d3/aa/76cf0b5ec00619ef208da4689281d48b57f2c7fde883d14bf9441b74d59f/coverage-7.10.6-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6008a021907be8c4c02f37cdc3ffb258493bdebfeaf9a839f9e71dfdc47b018e", size = 217331, upload-time = "2025-08-29T15:34:20.846Z" }, { url = "https://files.pythonhosted.org/packages/65/91/8e41b8c7c505d398d7730206f3cbb4a875a35ca1041efc518051bfce0f6b/coverage-7.10.6-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5e75e37f23eb144e78940b40395b42f2321951206a4f50e23cfd6e8a198d3ceb", size = 217607, upload-time = "2025-08-29T15:34:22.433Z" }, { url = "https://files.pythonhosted.org/packages/87/7f/f718e732a423d442e6616580a951b8d1ec3575ea48bcd0e2228386805e79/coverage-7.10.6-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0f7cb359a448e043c576f0da00aa8bfd796a01b06aa610ca453d4dde09cc1034", size = 248663, upload-time = "2025-08-29T15:34:24.425Z" }, { url = "https://files.pythonhosted.org/packages/e6/52/c1106120e6d801ac03e12b5285e971e758e925b6f82ee9b86db3aa10045d/coverage-7.10.6-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c68018e4fc4e14b5668f1353b41ccf4bc83ba355f0e1b3836861c6f042d89ac1", size = 251197, upload-time = "2025-08-29T15:34:25.906Z" }, { url = "https://files.pythonhosted.org/packages/3d/ec/3a8645b1bb40e36acde9c0609f08942852a4af91a937fe2c129a38f2d3f5/coverage-7.10.6-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd4b2b0707fc55afa160cd5fc33b27ccbf75ca11d81f4ec9863d5793fc6df56a", size = 252551, upload-time = "2025-08-29T15:34:27.337Z" }, { url = "https://files.pythonhosted.org/packages/a1/70/09ecb68eeb1155b28a1d16525fd3a9b65fbe75337311a99830df935d62b6/coverage-7.10.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4cec13817a651f8804a86e4f79d815b3b28472c910e099e4d5a0e8a3b6a1d4cb", size = 250553, upload-time = "2025-08-29T15:34:29.065Z" }, { url = "https://files.pythonhosted.org/packages/c6/80/47df374b893fa812e953b5bc93dcb1427a7b3d7a1a7d2db33043d17f74b9/coverage-7.10.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:f2a6a8e06bbda06f78739f40bfb56c45d14eb8249d0f0ea6d4b3d48e1f7c695d", size = 248486, upload-time = "2025-08-29T15:34:30.897Z" }, { url = "https://files.pythonhosted.org/packages/4a/65/9f98640979ecee1b0d1a7164b589de720ddf8100d1747d9bbdb84be0c0fb/coverage-7.10.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:081b98395ced0d9bcf60ada7661a0b75f36b78b9d7e39ea0790bb4ed8da14747", size = 249981, upload-time = "2025-08-29T15:34:32.365Z" }, { url = "https://files.pythonhosted.org/packages/1f/55/eeb6603371e6629037f47bd25bef300387257ed53a3c5fdb159b7ac8c651/coverage-7.10.6-cp314-cp314-win32.whl", hash = "sha256:6937347c5d7d069ee776b2bf4e1212f912a9f1f141a429c475e6089462fcecc5", size = 220054, upload-time = "2025-08-29T15:34:34.124Z" }, { url = "https://files.pythonhosted.org/packages/15/d1/a0912b7611bc35412e919a2cd59ae98e7ea3b475e562668040a43fb27897/coverage-7.10.6-cp314-cp314-win_amd64.whl", hash = "sha256:adec1d980fa07e60b6ef865f9e5410ba760e4e1d26f60f7e5772c73b9a5b0713", size = 220851, upload-time = "2025-08-29T15:34:35.651Z" }, { url = "https://files.pythonhosted.org/packages/ef/2d/11880bb8ef80a45338e0b3e0725e4c2d73ffbb4822c29d987078224fd6a5/coverage-7.10.6-cp314-cp314-win_arm64.whl", hash = "sha256:a80f7aef9535442bdcf562e5a0d5a5538ce8abe6bb209cfbf170c462ac2c2a32", size = 219429, upload-time = "2025-08-29T15:34:37.16Z" }, { url = "https://files.pythonhosted.org/packages/83/c0/1f00caad775c03a700146f55536ecd097a881ff08d310a58b353a1421be0/coverage-7.10.6-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:0de434f4fbbe5af4fa7989521c655c8c779afb61c53ab561b64dcee6149e4c65", size = 218080, upload-time = "2025-08-29T15:34:38.919Z" }, { url = "https://files.pythonhosted.org/packages/a9/c4/b1c5d2bd7cc412cbeb035e257fd06ed4e3e139ac871d16a07434e145d18d/coverage-7.10.6-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6e31b8155150c57e5ac43ccd289d079eb3f825187d7c66e755a055d2c85794c6", size = 218293, upload-time = "2025-08-29T15:34:40.425Z" }, { url = "https://files.pythonhosted.org/packages/3f/07/4468d37c94724bf6ec354e4ec2f205fda194343e3e85fd2e59cec57e6a54/coverage-7.10.6-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:98cede73eb83c31e2118ae8d379c12e3e42736903a8afcca92a7218e1f2903b0", size = 259800, upload-time = "2025-08-29T15:34:41.996Z" }, { url = "https://files.pythonhosted.org/packages/82/d8/f8fb351be5fee31690cd8da768fd62f1cfab33c31d9f7baba6cd8960f6b8/coverage-7.10.6-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f863c08f4ff6b64fa8045b1e3da480f5374779ef187f07b82e0538c68cb4ff8e", size = 261965, upload-time = "2025-08-29T15:34:43.61Z" }, { url = "https://files.pythonhosted.org/packages/e8/70/65d4d7cfc75c5c6eb2fed3ee5cdf420fd8ae09c4808723a89a81d5b1b9c3/coverage-7.10.6-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2b38261034fda87be356f2c3f42221fdb4171c3ce7658066ae449241485390d5", size = 264220, upload-time = "2025-08-29T15:34:45.387Z" }, { url = "https://files.pythonhosted.org/packages/98/3c/069df106d19024324cde10e4ec379fe2fb978017d25e97ebee23002fbadf/coverage-7.10.6-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0e93b1476b79eae849dc3872faeb0bf7948fd9ea34869590bc16a2a00b9c82a7", size = 261660, upload-time = "2025-08-29T15:34:47.288Z" }, { url = "https://files.pythonhosted.org/packages/fc/8a/2974d53904080c5dc91af798b3a54a4ccb99a45595cc0dcec6eb9616a57d/coverage-7.10.6-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ff8a991f70f4c0cf53088abf1e3886edcc87d53004c7bb94e78650b4d3dac3b5", size = 259417, upload-time = "2025-08-29T15:34:48.779Z" }, { url = "https://files.pythonhosted.org/packages/30/38/9616a6b49c686394b318974d7f6e08f38b8af2270ce7488e879888d1e5db/coverage-7.10.6-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ac765b026c9f33044419cbba1da913cfb82cca1b60598ac1c7a5ed6aac4621a0", size = 260567, upload-time = "2025-08-29T15:34:50.718Z" }, { url = "https://files.pythonhosted.org/packages/76/16/3ed2d6312b371a8cf804abf4e14895b70e4c3491c6e53536d63fd0958a8d/coverage-7.10.6-cp314-cp314t-win32.whl", hash = "sha256:441c357d55f4936875636ef2cfb3bee36e466dcf50df9afbd398ce79dba1ebb7", size = 220831, upload-time = "2025-08-29T15:34:52.653Z" }, { url = "https://files.pythonhosted.org/packages/d5/e5/d38d0cb830abede2adb8b147770d2a3d0e7fecc7228245b9b1ae6c24930a/coverage-7.10.6-cp314-cp314t-win_amd64.whl", hash = "sha256:073711de3181b2e204e4870ac83a7c4853115b42e9cd4d145f2231e12d670930", size = 221950, upload-time = "2025-08-29T15:34:54.212Z" }, { url = "https://files.pythonhosted.org/packages/f4/51/e48e550f6279349895b0ffcd6d2a690e3131ba3a7f4eafccc141966d4dea/coverage-7.10.6-cp314-cp314t-win_arm64.whl", hash = "sha256:137921f2bac5559334ba66122b753db6dc5d1cf01eb7b64eb412bb0d064ef35b", size = 219969, upload-time = "2025-08-29T15:34:55.83Z" }, { url = "https://files.pythonhosted.org/packages/44/0c/50db5379b615854b5cf89146f8f5bd1d5a9693d7f3a987e269693521c404/coverage-7.10.6-py3-none-any.whl", hash = "sha256:92c4ecf6bf11b2e85fd4d8204814dc26e6a19f0c9d938c207c5cb0eadfcabbe3", size = 208986, upload-time = "2025-08-29T15:35:14.506Z" }, ] [package.optional-dependencies] toml = [ { name = "tomli", marker = "python_full_version <= '3.11'" }, ] [[package]] name = "cryptography" version = "46.0.7" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/47/93/ac8f3d5ff04d54bc814e961a43ae5b0b146154c89c61b47bb07557679b18/cryptography-46.0.7.tar.gz", hash = "sha256:e4cfd68c5f3e0bfdad0d38e023239b96a2fe84146481852dffbcca442c245aa5", size = 750652, upload-time = "2026-04-08T01:57:54.692Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0b/5d/4a8f770695d73be252331e60e526291e3df0c9b27556a90a6b47bccca4c2/cryptography-46.0.7-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:ea42cbe97209df307fdc3b155f1b6fa2577c0defa8f1f7d3be7d31d189108ad4", size = 7179869, upload-time = "2026-04-08T01:56:17.157Z" }, { url = "https://files.pythonhosted.org/packages/5f/45/6d80dc379b0bbc1f9d1e429f42e4cb9e1d319c7a8201beffd967c516ea01/cryptography-46.0.7-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b36a4695e29fe69215d75960b22577197aca3f7a25b9cf9d165dcfe9d80bc325", size = 4275492, upload-time = "2026-04-08T01:56:19.36Z" }, { url = "https://files.pythonhosted.org/packages/4a/9a/1765afe9f572e239c3469f2cb429f3ba7b31878c893b246b4b2994ffe2fe/cryptography-46.0.7-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5ad9ef796328c5e3c4ceed237a183f5d41d21150f972455a9d926593a1dcb308", size = 4426670, upload-time = "2026-04-08T01:56:21.415Z" }, { url = "https://files.pythonhosted.org/packages/8f/3e/af9246aaf23cd4ee060699adab1e47ced3f5f7e7a8ffdd339f817b446462/cryptography-46.0.7-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:73510b83623e080a2c35c62c15298096e2a5dc8d51c3b4e1740211839d0dea77", size = 4280275, upload-time = "2026-04-08T01:56:23.539Z" }, { url = "https://files.pythonhosted.org/packages/0f/54/6bbbfc5efe86f9d71041827b793c24811a017c6ac0fd12883e4caa86b8ed/cryptography-46.0.7-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cbd5fb06b62bd0721e1170273d3f4d5a277044c47ca27ee257025146c34cbdd1", size = 4928402, upload-time = "2026-04-08T01:56:25.624Z" }, { url = "https://files.pythonhosted.org/packages/2d/cf/054b9d8220f81509939599c8bdbc0c408dbd2bdd41688616a20731371fe0/cryptography-46.0.7-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:420b1e4109cc95f0e5700eed79908cef9268265c773d3a66f7af1eef53d409ef", size = 4459985, upload-time = "2026-04-08T01:56:27.309Z" }, { url = "https://files.pythonhosted.org/packages/f9/46/4e4e9c6040fb01c7467d47217d2f882daddeb8828f7df800cb806d8a2288/cryptography-46.0.7-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:24402210aa54baae71d99441d15bb5a1919c195398a87b563df84468160a65de", size = 3990652, upload-time = "2026-04-08T01:56:29.095Z" }, { url = "https://files.pythonhosted.org/packages/36/5f/313586c3be5a2fbe87e4c9a254207b860155a8e1f3cca99f9910008e7d08/cryptography-46.0.7-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:8a469028a86f12eb7d2fe97162d0634026d92a21f3ae0ac87ed1c4a447886c83", size = 4279805, upload-time = "2026-04-08T01:56:30.928Z" }, { url = "https://files.pythonhosted.org/packages/69/33/60dfc4595f334a2082749673386a4d05e4f0cf4df8248e63b2c3437585f2/cryptography-46.0.7-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:9694078c5d44c157ef3162e3bf3946510b857df5a3955458381d1c7cfc143ddb", size = 4892883, upload-time = "2026-04-08T01:56:32.614Z" }, { url = "https://files.pythonhosted.org/packages/c7/0b/333ddab4270c4f5b972f980adef4faa66951a4aaf646ca067af597f15563/cryptography-46.0.7-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:42a1e5f98abb6391717978baf9f90dc28a743b7d9be7f0751a6f56a75d14065b", size = 4459756, upload-time = "2026-04-08T01:56:34.306Z" }, { url = "https://files.pythonhosted.org/packages/d2/14/633913398b43b75f1234834170947957c6b623d1701ffc7a9600da907e89/cryptography-46.0.7-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91bbcb08347344f810cbe49065914fe048949648f6bd5c2519f34619142bbe85", size = 4410244, upload-time = "2026-04-08T01:56:35.977Z" }, { url = "https://files.pythonhosted.org/packages/10/f2/19ceb3b3dc14009373432af0c13f46aa08e3ce334ec6eff13492e1812ccd/cryptography-46.0.7-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5d1c02a14ceb9148cc7816249f64f623fbfee39e8c03b3650d842ad3f34d637e", size = 4674868, upload-time = "2026-04-08T01:56:38.034Z" }, { url = "https://files.pythonhosted.org/packages/1a/bb/a5c213c19ee94b15dfccc48f363738633a493812687f5567addbcbba9f6f/cryptography-46.0.7-cp311-abi3-win32.whl", hash = "sha256:d23c8ca48e44ee015cd0a54aeccdf9f09004eba9fc96f38c911011d9ff1bd457", size = 3026504, upload-time = "2026-04-08T01:56:39.666Z" }, { url = "https://files.pythonhosted.org/packages/2b/02/7788f9fefa1d060ca68717c3901ae7fffa21ee087a90b7f23c7a603c32ae/cryptography-46.0.7-cp311-abi3-win_amd64.whl", hash = "sha256:397655da831414d165029da9bc483bed2fe0e75dde6a1523ec2fe63f3c46046b", size = 3488363, upload-time = "2026-04-08T01:56:41.893Z" }, { url = "https://files.pythonhosted.org/packages/7b/56/15619b210e689c5403bb0540e4cb7dbf11a6bf42e483b7644e471a2812b3/cryptography-46.0.7-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:d151173275e1728cf7839aaa80c34fe550c04ddb27b34f48c232193df8db5842", size = 7119671, upload-time = "2026-04-08T01:56:44Z" }, { url = "https://files.pythonhosted.org/packages/74/66/e3ce040721b0b5599e175ba91ab08884c75928fbeb74597dd10ef13505d2/cryptography-46.0.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:db0f493b9181c7820c8134437eb8b0b4792085d37dbb24da050476ccb664e59c", size = 4268551, upload-time = "2026-04-08T01:56:46.071Z" }, { url = "https://files.pythonhosted.org/packages/03/11/5e395f961d6868269835dee1bafec6a1ac176505a167f68b7d8818431068/cryptography-46.0.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ebd6daf519b9f189f85c479427bbd6e9c9037862cf8fe89ee35503bd209ed902", size = 4408887, upload-time = "2026-04-08T01:56:47.718Z" }, { url = "https://files.pythonhosted.org/packages/40/53/8ed1cf4c3b9c8e611e7122fb56f1c32d09e1fff0f1d77e78d9ff7c82653e/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:b7b412817be92117ec5ed95f880defe9cf18a832e8cafacf0a22337dc1981b4d", size = 4271354, upload-time = "2026-04-08T01:56:49.312Z" }, { url = "https://files.pythonhosted.org/packages/50/46/cf71e26025c2e767c5609162c866a78e8a2915bbcfa408b7ca495c6140c4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:fbfd0e5f273877695cb93baf14b185f4878128b250cc9f8e617ea0c025dfb022", size = 4905845, upload-time = "2026-04-08T01:56:50.916Z" }, { url = "https://files.pythonhosted.org/packages/c0/ea/01276740375bac6249d0a971ebdf6b4dc9ead0ee0a34ef3b5a88c1a9b0d4/cryptography-46.0.7-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:ffca7aa1d00cf7d6469b988c581598f2259e46215e0140af408966a24cf086ce", size = 4444641, upload-time = "2026-04-08T01:56:52.882Z" }, { url = "https://files.pythonhosted.org/packages/3d/4c/7d258f169ae71230f25d9f3d06caabcff8c3baf0978e2b7d65e0acac3827/cryptography-46.0.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:60627cf07e0d9274338521205899337c5d18249db56865f943cbe753aa96f40f", size = 3967749, upload-time = "2026-04-08T01:56:54.597Z" }, { url = "https://files.pythonhosted.org/packages/b5/2a/2ea0767cad19e71b3530e4cad9605d0b5e338b6a1e72c37c9c1ceb86c333/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:80406c3065e2c55d7f49a9550fe0c49b3f12e5bfff5dedb727e319e1afb9bf99", size = 4270942, upload-time = "2026-04-08T01:56:56.416Z" }, { url = "https://files.pythonhosted.org/packages/41/3d/fe14df95a83319af25717677e956567a105bb6ab25641acaa093db79975d/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:c5b1ccd1239f48b7151a65bc6dd54bcfcc15e028c8ac126d3fada09db0e07ef1", size = 4871079, upload-time = "2026-04-08T01:56:58.31Z" }, { url = "https://files.pythonhosted.org/packages/9c/59/4a479e0f36f8f378d397f4eab4c850b4ffb79a2f0d58704b8fa0703ddc11/cryptography-46.0.7-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:d5f7520159cd9c2154eb61eb67548ca05c5774d39e9c2c4339fd793fe7d097b2", size = 4443999, upload-time = "2026-04-08T01:57:00.508Z" }, { url = "https://files.pythonhosted.org/packages/28/17/b59a741645822ec6d04732b43c5d35e4ef58be7bfa84a81e5ae6f05a1d33/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fcd8eac50d9138c1d7fc53a653ba60a2bee81a505f9f8850b6b2888555a45d0e", size = 4399191, upload-time = "2026-04-08T01:57:02.654Z" }, { url = "https://files.pythonhosted.org/packages/59/6a/bb2e166d6d0e0955f1e9ff70f10ec4b2824c9cfcdb4da772c7dd69cc7d80/cryptography-46.0.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:65814c60f8cc400c63131584e3e1fad01235edba2614b61fbfbfa954082db0ee", size = 4655782, upload-time = "2026-04-08T01:57:04.592Z" }, { url = "https://files.pythonhosted.org/packages/95/b6/3da51d48415bcb63b00dc17c2eff3a651b7c4fed484308d0f19b30e8cb2c/cryptography-46.0.7-cp314-cp314t-win32.whl", hash = "sha256:fdd1736fed309b4300346f88f74cd120c27c56852c3838cab416e7a166f67298", size = 3002227, upload-time = "2026-04-08T01:57:06.91Z" }, { url = "https://files.pythonhosted.org/packages/32/a8/9f0e4ed57ec9cebe506e58db11ae472972ecb0c659e4d52bbaee80ca340a/cryptography-46.0.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e06acf3c99be55aa3b516397fe42f5855597f430add9c17fa46bf2e0fb34c9bb", size = 3475332, upload-time = "2026-04-08T01:57:08.807Z" }, { url = "https://files.pythonhosted.org/packages/a7/7f/cd42fc3614386bc0c12f0cb3c4ae1fc2bbca5c9662dfed031514911d513d/cryptography-46.0.7-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:462ad5cb1c148a22b2e3bcc5ad52504dff325d17daf5df8d88c17dda1f75f2a4", size = 7165618, upload-time = "2026-04-08T01:57:10.645Z" }, { url = "https://files.pythonhosted.org/packages/a5/d0/36a49f0262d2319139d2829f773f1b97ef8aef7f97e6e5bd21455e5a8fb5/cryptography-46.0.7-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:84d4cced91f0f159a7ddacad249cc077e63195c36aac40b4150e7a57e84fffe7", size = 4270628, upload-time = "2026-04-08T01:57:12.885Z" }, { url = "https://files.pythonhosted.org/packages/8a/6c/1a42450f464dda6ffbe578a911f773e54dd48c10f9895a23a7e88b3e7db5/cryptography-46.0.7-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:128c5edfe5e5938b86b03941e94fac9ee793a94452ad1365c9fc3f4f62216832", size = 4415405, upload-time = "2026-04-08T01:57:14.923Z" }, { url = "https://files.pythonhosted.org/packages/9a/92/4ed714dbe93a066dc1f4b4581a464d2d7dbec9046f7c8b7016f5286329e2/cryptography-46.0.7-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:5e51be372b26ef4ba3de3c167cd3d1022934bc838ae9eaad7e644986d2a3d163", size = 4272715, upload-time = "2026-04-08T01:57:16.638Z" }, { url = "https://files.pythonhosted.org/packages/b7/e6/a26b84096eddd51494bba19111f8fffe976f6a09f132706f8f1bf03f51f7/cryptography-46.0.7-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:cdf1a610ef82abb396451862739e3fc93b071c844399e15b90726ef7470eeaf2", size = 4918400, upload-time = "2026-04-08T01:57:19.021Z" }, { url = "https://files.pythonhosted.org/packages/c7/08/ffd537b605568a148543ac3c2b239708ae0bd635064bab41359252ef88ed/cryptography-46.0.7-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:1d25aee46d0c6f1a501adcddb2d2fee4b979381346a78558ed13e50aa8a59067", size = 4450634, upload-time = "2026-04-08T01:57:21.185Z" }, { url = "https://files.pythonhosted.org/packages/16/01/0cd51dd86ab5b9befe0d031e276510491976c3a80e9f6e31810cce46c4ad/cryptography-46.0.7-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:cdfbe22376065ffcf8be74dc9a909f032df19bc58a699456a21712d6e5eabfd0", size = 3985233, upload-time = "2026-04-08T01:57:22.862Z" }, { url = "https://files.pythonhosted.org/packages/92/49/819d6ed3a7d9349c2939f81b500a738cb733ab62fbecdbc1e38e83d45e12/cryptography-46.0.7-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:abad9dac36cbf55de6eb49badd4016806b3165d396f64925bf2999bcb67837ba", size = 4271955, upload-time = "2026-04-08T01:57:24.814Z" }, { url = "https://files.pythonhosted.org/packages/80/07/ad9b3c56ebb95ed2473d46df0847357e01583f4c52a85754d1a55e29e4d0/cryptography-46.0.7-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:935ce7e3cfdb53e3536119a542b839bb94ec1ad081013e9ab9b7cfd478b05006", size = 4879888, upload-time = "2026-04-08T01:57:26.88Z" }, { url = "https://files.pythonhosted.org/packages/b8/c7/201d3d58f30c4c2bdbe9b03844c291feb77c20511cc3586daf7edc12a47b/cryptography-46.0.7-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:35719dc79d4730d30f1c2b6474bd6acda36ae2dfae1e3c16f2051f215df33ce0", size = 4449961, upload-time = "2026-04-08T01:57:29.068Z" }, { url = "https://files.pythonhosted.org/packages/a5/ef/649750cbf96f3033c3c976e112265c33906f8e462291a33d77f90356548c/cryptography-46.0.7-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7bbc6ccf49d05ac8f7d7b5e2e2c33830d4fe2061def88210a126d130d7f71a85", size = 4401696, upload-time = "2026-04-08T01:57:31.029Z" }, { url = "https://files.pythonhosted.org/packages/41/52/a8908dcb1a389a459a29008c29966c1d552588d4ae6d43f3a1a4512e0ebe/cryptography-46.0.7-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a1529d614f44b863a7b480c6d000fe93b59acee9c82ffa027cfadc77521a9f5e", size = 4664256, upload-time = "2026-04-08T01:57:33.144Z" }, { url = "https://files.pythonhosted.org/packages/4b/fa/f0ab06238e899cc3fb332623f337a7364f36f4bb3f2534c2bb95a35b132c/cryptography-46.0.7-cp38-abi3-win32.whl", hash = "sha256:f247c8c1a1fb45e12586afbb436ef21ff1e80670b2861a90353d9b025583d246", size = 3013001, upload-time = "2026-04-08T01:57:34.933Z" }, { url = "https://files.pythonhosted.org/packages/d2/f1/00ce3bde3ca542d1acd8f8cfa38e446840945aa6363f9b74746394b14127/cryptography-46.0.7-cp38-abi3-win_amd64.whl", hash = "sha256:506c4ff91eff4f82bdac7633318a526b1d1309fc07ca76a3ad182cb5b686d6d3", size = 3472985, upload-time = "2026-04-08T01:57:36.714Z" }, { url = "https://files.pythonhosted.org/packages/63/0c/dca8abb64e7ca4f6b2978769f6fea5ad06686a190cec381f0a796fdcaaba/cryptography-46.0.7-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fc9ab8856ae6cf7c9358430e49b368f3108f050031442eaeb6b9d87e4dcf4e4f", size = 3476879, upload-time = "2026-04-08T01:57:38.664Z" }, { url = "https://files.pythonhosted.org/packages/3a/ea/075aac6a84b7c271578d81a2f9968acb6e273002408729f2ddff517fed4a/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:d3b99c535a9de0adced13d159c5a9cf65c325601aa30f4be08afd680643e9c15", size = 4219700, upload-time = "2026-04-08T01:57:40.625Z" }, { url = "https://files.pythonhosted.org/packages/6c/7b/1c55db7242b5e5612b29fc7a630e91ee7a6e3c8e7bf5406d22e206875fbd/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:d02c738dacda7dc2a74d1b2b3177042009d5cab7c7079db74afc19e56ca1b455", size = 4385982, upload-time = "2026-04-08T01:57:42.725Z" }, { url = "https://files.pythonhosted.org/packages/cb/da/9870eec4b69c63ef5925bf7d8342b7e13bc2ee3d47791461c4e49ca212f4/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:04959522f938493042d595a736e7dbdff6eb6cc2339c11465b3ff89343b65f65", size = 4219115, upload-time = "2026-04-08T01:57:44.939Z" }, { url = "https://files.pythonhosted.org/packages/f4/72/05aa5832b82dd341969e9a734d1812a6aadb088d9eb6f0430fc337cc5a8f/cryptography-46.0.7-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:3986ac1dee6def53797289999eabe84798ad7817f3e97779b5061a95b0ee4968", size = 4385479, upload-time = "2026-04-08T01:57:46.86Z" }, { url = "https://files.pythonhosted.org/packages/20/2a/1b016902351a523aa2bd446b50a5bc1175d7a7d1cf90fe2ef904f9b84ebc/cryptography-46.0.7-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:258514877e15963bd43b558917bc9f54cf7cf866c38aa576ebf47a77ddbc43a4", size = 3412829, upload-time = "2026-04-08T01:57:48.874Z" }, ] [[package]] name = "cycler" version = "0.12.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, ] [[package]] name = "decorator" version = "5.2.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, ] [[package]] name = "deepmerge" version = "2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a8/3a/b0ba594708f1ad0bc735884b3ad854d3ca3bdc1d741e56e40bbda6263499/deepmerge-2.0.tar.gz", hash = "sha256:5c3d86081fbebd04dd5de03626a0607b809a98fb6ccba5770b62466fe940ff20", size = 19890, upload-time = "2024-08-30T05:31:50.308Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2d/82/e5d2c1c67d19841e9edc74954c827444ae826978499bde3dfc1d007c8c11/deepmerge-2.0-py3-none-any.whl", hash = "sha256:6de9ce507115cff0bed95ff0ce9ecc31088ef50cbdf09bc90a09349a318b3d00", size = 13475, upload-time = "2024-08-30T05:31:48.659Z" }, ] [[package]] name = "docutils" version = "0.22.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/ae/b6/03bb70946330e88ffec97aefd3ea75ba575cb2e762061e0e62a213befee8/docutils-0.22.4.tar.gz", hash = "sha256:4db53b1fde9abecbb74d91230d32ab626d94f6badfc575d6db9194a49df29968", size = 2291750, upload-time = "2025-12-18T19:00:26.443Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/02/10/5da547df7a391dcde17f59520a231527b8571e6f46fc8efb02ccb370ab12/docutils-0.22.4-py3-none-any.whl", hash = "sha256:d0013f540772d1420576855455d050a2180186c91c15779301ac2ccb3eeb68de", size = 633196, upload-time = "2025-12-18T19:00:18.077Z" }, ] [[package]] name = "exceptiongroup" version = "1.3.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, ] [[package]] name = "flasgger" version = "0.9.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "flask" }, { name = "jsonschema" }, { name = "mistune" }, { name = "packaging" }, { name = "pyyaml" }, { name = "six" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8a/e4/05e80adeadc39f171b51bd29b24a6d9838127f3aaa1b07c1501e662a8cee/flasgger-0.9.7.1.tar.gz", hash = "sha256:ca098e10bfbb12f047acc6299cc70a33851943a746e550d86e65e60d4df245fb", size = 3979409, upload-time = "2023-05-18T17:15:21.328Z" } [[package]] name = "flask" version = "3.1.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "blinker" }, { name = "click" }, { name = "itsdangerous" }, { name = "jinja2" }, { name = "markupsafe" }, { name = "werkzeug" }, ] sdist = { url = "https://files.pythonhosted.org/packages/26/00/35d85dcce6c57fdc871f3867d465d780f302a175ea360f62533f12b27e2b/flask-3.1.3.tar.gz", hash = "sha256:0ef0e52b8a9cd932855379197dd8f94047b359ca0a78695144304cb45f87c9eb", size = 759004, upload-time = "2026-02-19T05:00:57.678Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7f/9c/34f6962f9b9e9c71f6e5ed806e0d0ff03c9d1b0b2340088a0cf4bce09b18/flask-3.1.3-py3-none-any.whl", hash = "sha256:f4bcbefc124291925f1a26446da31a5178f9483862233b23c0c96a20701f670c", size = 103424, upload-time = "2026-02-19T05:00:56.027Z" }, ] [[package]] name = "fonttools" version = "4.62.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/5a/ff/532ed43808b469c807e8cb6b21358da3fe6fd51486b3a8c93db0bb5d957f/fonttools-4.62.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad5cca75776cd453b1b035b530e943334957ae152a36a88a320e779d61fc980c", size = 2873740, upload-time = "2026-03-13T13:52:11.822Z" }, { url = "https://files.pythonhosted.org/packages/85/e4/2318d2b430562da7227010fb2bb029d2fa54d7b46443ae8942bab224e2a0/fonttools-4.62.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b3ae47e8636156a9accff64c02c0924cbebad62854c4a6dbdc110cd5b4b341a", size = 2417649, upload-time = "2026-03-13T13:52:14.605Z" }, { url = "https://files.pythonhosted.org/packages/4c/28/40f15523b5188598018e7956899fed94eb7debec89e2dd70cb4a8df90492/fonttools-4.62.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b9e288b4da2f64fd6180644221749de651703e8d0c16bd4b719533a3a7d6e3", size = 4935213, upload-time = "2026-03-13T13:52:17.399Z" }, { url = "https://files.pythonhosted.org/packages/42/09/7dbe3d7023f57d9b580cfa832109d521988112fd59dddfda3fddda8218f9/fonttools-4.62.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7bca7a1c1faf235ffe25d4f2e555246b4750220b38de8261d94ebc5ce8a23c23", size = 4892374, upload-time = "2026-03-13T13:52:20.175Z" }, { url = "https://files.pythonhosted.org/packages/d1/2d/84509a2e32cb925371560ef5431365d8da2183c11d98e5b4b8b4e42426a5/fonttools-4.62.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b4e0fcf265ad26e487c56cb12a42dffe7162de708762db951e1b3f755319507d", size = 4911856, upload-time = "2026-03-13T13:52:22.777Z" }, { url = "https://files.pythonhosted.org/packages/a5/80/df28131379eed93d9e6e6fccd3bf6e3d077bebbfe98cc83f21bbcd83ed02/fonttools-4.62.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:2d850f66830a27b0d498ee05adb13a3781637b1826982cd7e2b3789ef0cc71ae", size = 5031712, upload-time = "2026-03-13T13:52:25.14Z" }, { url = "https://files.pythonhosted.org/packages/3d/03/3c8f09aad64230cd6d921ae7a19f9603c36f70930b00459f112706f6769a/fonttools-4.62.1-cp310-cp310-win32.whl", hash = "sha256:486f32c8047ccd05652aba17e4a8819a3a9d78570eb8a0e3b4503142947880ed", size = 1507878, upload-time = "2026-03-13T13:52:28.149Z" }, { url = "https://files.pythonhosted.org/packages/dd/ec/f53f626f8f3e89f4cadd8fc08f3452c8fd182c951ad5caa35efac22b29ab/fonttools-4.62.1-cp310-cp310-win_amd64.whl", hash = "sha256:5a648bde915fba9da05ae98856987ca91ba832949a9e2888b48c47ef8b96c5a9", size = 1556766, upload-time = "2026-03-13T13:52:30.814Z" }, { url = "https://files.pythonhosted.org/packages/88/39/23ff32561ec8d45a4d48578b4d241369d9270dc50926c017570e60893701/fonttools-4.62.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:40975849bac44fb0b9253d77420c6d8b523ac4dcdcefeff6e4d706838a5b80f7", size = 2871039, upload-time = "2026-03-13T13:52:33.127Z" }, { url = "https://files.pythonhosted.org/packages/24/7f/66d3f8a9338a9b67fe6e1739f47e1cd5cee78bd3bc1206ef9b0b982289a5/fonttools-4.62.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9dde91633f77fa576879a0c76b1d89de373cae751a98ddf0109d54e173b40f14", size = 2416346, upload-time = "2026-03-13T13:52:35.676Z" }, { url = "https://files.pythonhosted.org/packages/aa/53/5276ceba7bff95da7793a07c5284e1da901cf00341ce5e2f3273056c0cca/fonttools-4.62.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6acb4109f8bee00fec985c8c7afb02299e35e9c94b57287f3ea542f28bd0b0a7", size = 5100897, upload-time = "2026-03-13T13:52:38.102Z" }, { url = "https://files.pythonhosted.org/packages/cc/a1/40a5c4d8e28b0851d53a8eeeb46fbd73c325a2a9a165f290a5ed90e6c597/fonttools-4.62.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1c5c25671ce8805e0d080e2ffdeca7f1e86778c5cbfbeae86d7f866d8830517b", size = 5071078, upload-time = "2026-03-13T13:52:41.305Z" }, { url = "https://files.pythonhosted.org/packages/e3/be/d378fca4c65ea1956fee6d90ace6e861776809cbbc5af22388a090c3c092/fonttools-4.62.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a5d8825e1140f04e6c99bb7d37a9e31c172f3bc208afbe02175339e699c710e1", size = 5076908, upload-time = "2026-03-13T13:52:44.122Z" }, { url = "https://files.pythonhosted.org/packages/f8/d9/ae6a1d0693a4185a84605679c8a1f719a55df87b9c6e8e817bfdd9ef5936/fonttools-4.62.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:268abb1cb221e66c014acc234e872b7870d8b5d4657a83a8f4205094c32d2416", size = 5202275, upload-time = "2026-03-13T13:52:46.591Z" }, { url = "https://files.pythonhosted.org/packages/54/6c/af95d9c4efb15cabff22642b608342f2bd67137eea6107202d91b5b03184/fonttools-4.62.1-cp311-cp311-win32.whl", hash = "sha256:942b03094d7edbb99bdf1ae7e9090898cad7bf9030b3d21f33d7072dbcb51a53", size = 2293075, upload-time = "2026-03-13T13:52:48.711Z" }, { url = "https://files.pythonhosted.org/packages/d3/97/bf54c5b3f2be34e1f143e6db838dfdc54f2ffa3e68c738934c82f3b2a08d/fonttools-4.62.1-cp311-cp311-win_amd64.whl", hash = "sha256:e8514f4924375f77084e81467e63238b095abda5107620f49421c368a6017ed2", size = 2344593, upload-time = "2026-03-13T13:52:50.725Z" }, { url = "https://files.pythonhosted.org/packages/47/d4/dbacced3953544b9a93088cc10ef2b596d348c983d5c67a404fa41ec51ba/fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974", size = 2870219, upload-time = "2026-03-13T13:52:53.664Z" }, { url = "https://files.pythonhosted.org/packages/66/9e/a769c8e99b81e5a87ab7e5e7236684de4e96246aae17274e5347d11ebd78/fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9", size = 2414891, upload-time = "2026-03-13T13:52:56.493Z" }, { url = "https://files.pythonhosted.org/packages/69/64/f19a9e3911968c37e1e620e14dfc5778299e1474f72f4e57c5ec771d9489/fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936", size = 5033197, upload-time = "2026-03-13T13:52:59.179Z" }, { url = "https://files.pythonhosted.org/packages/9b/8a/99c8b3c3888c5c474c08dbfd7c8899786de9604b727fcefb055b42c84bba/fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392", size = 4988768, upload-time = "2026-03-13T13:53:02.761Z" }, { url = "https://files.pythonhosted.org/packages/d1/c6/0f904540d3e6ab463c1243a0d803504826a11604c72dd58c2949796a1762/fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04", size = 4971512, upload-time = "2026-03-13T13:53:05.678Z" }, { url = "https://files.pythonhosted.org/packages/29/0b/5cbef6588dc9bd6b5c9ad6a4d5a8ca384d0cea089da31711bbeb4f9654a6/fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d", size = 5122723, upload-time = "2026-03-13T13:53:08.662Z" }, { url = "https://files.pythonhosted.org/packages/4a/47/b3a5342d381595ef439adec67848bed561ab7fdb1019fa522e82101b7d9c/fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c", size = 2281278, upload-time = "2026-03-13T13:53:10.998Z" }, { url = "https://files.pythonhosted.org/packages/28/b1/0c2ab56a16f409c6c8a68816e6af707827ad5d629634691ff60a52879792/fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42", size = 2331414, upload-time = "2026-03-13T13:53:13.992Z" }, { url = "https://files.pythonhosted.org/packages/3b/56/6f389de21c49555553d6a5aeed5ac9767631497ac836c4f076273d15bd72/fonttools-4.62.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c22b1014017111c401469e3acc5433e6acf6ebcc6aa9efb538a533c800971c79", size = 2865155, upload-time = "2026-03-13T13:53:16.132Z" }, { url = "https://files.pythonhosted.org/packages/03/c5/0e3966edd5ec668d41dfe418787726752bc07e2f5fd8c8f208615e61fa89/fonttools-4.62.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:68959f5fc58ed4599b44aad161c2837477d7f35f5f79402d97439974faebfebe", size = 2412802, upload-time = "2026-03-13T13:53:18.878Z" }, { url = "https://files.pythonhosted.org/packages/52/94/e6ac4b44026de7786fe46e3bfa0c87e51d5d70a841054065d49cd62bb909/fonttools-4.62.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef46db46c9447103b8f3ff91e8ba009d5fe181b1920a83757a5762551e32bb68", size = 5013926, upload-time = "2026-03-13T13:53:21.379Z" }, { url = "https://files.pythonhosted.org/packages/e2/98/8b1e801939839d405f1f122e7d175cebe9aeb4e114f95bfc45e3152af9a7/fonttools-4.62.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6706d1cb1d5e6251a97ad3c1b9347505c5615c112e66047abbef0f8545fa30d1", size = 4964575, upload-time = "2026-03-13T13:53:23.857Z" }, { url = "https://files.pythonhosted.org/packages/46/76/7d051671e938b1881670528fec69cc4044315edd71a229c7fd712eaa5119/fonttools-4.62.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:2e7abd2b1e11736f58c1de27819e1955a53267c21732e78243fa2fa2e5c1e069", size = 4953693, upload-time = "2026-03-13T13:53:26.569Z" }, { url = "https://files.pythonhosted.org/packages/1f/ae/b41f8628ec0be3c1b934fc12b84f4576a5c646119db4d3bdd76a217c90b5/fonttools-4.62.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:403d28ce06ebfc547fbcb0cb8b7f7cc2f7a2d3e1a67ba9a34b14632df9e080f9", size = 5094920, upload-time = "2026-03-13T13:53:29.329Z" }, { url = "https://files.pythonhosted.org/packages/f2/f6/53a1e9469331a23dcc400970a27a4caa3d9f6edbf5baab0260285238b884/fonttools-4.62.1-cp313-cp313-win32.whl", hash = "sha256:93c316e0f5301b2adbe6a5f658634307c096fd5aae60a5b3412e4f3e1728ab24", size = 2279928, upload-time = "2026-03-13T13:53:32.352Z" }, { url = "https://files.pythonhosted.org/packages/38/60/35186529de1db3c01f5ad625bde07c1f576305eab6d86bbda4c58445f721/fonttools-4.62.1-cp313-cp313-win_amd64.whl", hash = "sha256:7aa21ff53e28a9c2157acbc44e5b401149d3c9178107130e82d74ceb500e5056", size = 2330514, upload-time = "2026-03-13T13:53:34.991Z" }, { url = "https://files.pythonhosted.org/packages/36/f0/2888cdac391807d68d90dcb16ef858ddc1b5309bfc6966195a459dd326e2/fonttools-4.62.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fa1d16210b6b10a826d71bed68dd9ec24a9e218d5a5e2797f37c573e7ec215ca", size = 2864442, upload-time = "2026-03-13T13:53:37.509Z" }, { url = "https://files.pythonhosted.org/packages/4b/b2/e521803081f8dc35990816b82da6360fa668a21b44da4b53fc9e77efcd62/fonttools-4.62.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:aa69d10ed420d8121118e628ad47d86e4caa79ba37f968597b958f6cceab7eca", size = 2410901, upload-time = "2026-03-13T13:53:40.55Z" }, { url = "https://files.pythonhosted.org/packages/00/a4/8c3511ff06e53110039358dbbdc1a65d72157a054638387aa2ada300a8b8/fonttools-4.62.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd13b7999d59c5eb1c2b442eb2d0c427cb517a0b7a1f5798fc5c9e003f5ff782", size = 4999608, upload-time = "2026-03-13T13:53:42.798Z" }, { url = "https://files.pythonhosted.org/packages/28/63/cd0c3b26afe60995a5295f37c246a93d454023726c3261cfbb3559969bb9/fonttools-4.62.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8d337fdd49a79b0d51c4da87bc38169d21c3abbf0c1aa9367eff5c6656fb6dae", size = 4912726, upload-time = "2026-03-13T13:53:45.405Z" }, { url = "https://files.pythonhosted.org/packages/70/b9/ac677cb07c24c685cf34f64e140617d58789d67a3dd524164b63648c6114/fonttools-4.62.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d241cdc4a67b5431c6d7f115fdf63335222414995e3a1df1a41e1182acd4bcc7", size = 4951422, upload-time = "2026-03-13T13:53:48.326Z" }, { url = "https://files.pythonhosted.org/packages/e6/10/11c08419a14b85b7ca9a9faca321accccc8842dd9e0b1c8a72908de05945/fonttools-4.62.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c05557a78f8fa514da0f869556eeda40887a8abc77c76ee3f74cf241778afd5a", size = 5060979, upload-time = "2026-03-13T13:53:51.366Z" }, { url = "https://files.pythonhosted.org/packages/4e/3c/12eea4a4cf054e7ab058ed5ceada43b46809fce2bf319017c4d63ae55bb4/fonttools-4.62.1-cp314-cp314-win32.whl", hash = "sha256:49a445d2f544ce4a69338694cad575ba97b9a75fff02720da0882d1a73f12800", size = 2283733, upload-time = "2026-03-13T13:53:53.606Z" }, { url = "https://files.pythonhosted.org/packages/6b/67/74b070029043186b5dd13462c958cb7c7f811be0d2e634309d9a1ffb1505/fonttools-4.62.1-cp314-cp314-win_amd64.whl", hash = "sha256:1eecc128c86c552fb963fe846ca4e011b1be053728f798185a1687502f6d398e", size = 2335663, upload-time = "2026-03-13T13:53:56.23Z" }, { url = "https://files.pythonhosted.org/packages/42/c5/4d2ed3ca6e33617fc5624467da353337f06e7f637707478903c785bd8e20/fonttools-4.62.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:1596aeaddf7f78e21e68293c011316a25267b3effdaccaf4d59bc9159d681b82", size = 2947288, upload-time = "2026-03-13T13:53:59.397Z" }, { url = "https://files.pythonhosted.org/packages/1f/e9/7ab11ddfda48ed0f89b13380e5595ba572619c27077be0b2c447a63ff351/fonttools-4.62.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:8f8fca95d3bb3208f59626a4b0ea6e526ee51f5a8ad5d91821c165903e8d9260", size = 2449023, upload-time = "2026-03-13T13:54:01.642Z" }, { url = "https://files.pythonhosted.org/packages/b2/10/a800fa090b5e8819942e54e19b55fc7c21fe14a08757c3aa3ca8db358939/fonttools-4.62.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee91628c08e76f77b533d65feb3fbe6d9dad699f95be51cf0d022db94089cdc4", size = 5137599, upload-time = "2026-03-13T13:54:04.495Z" }, { url = "https://files.pythonhosted.org/packages/37/dc/8ccd45033fffd74deb6912fa1ca524643f584b94c87a16036855b498a1ed/fonttools-4.62.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5f37df1cac61d906e7b836abe356bc2f34c99d4477467755c216b72aa3dc748b", size = 4920933, upload-time = "2026-03-13T13:54:07.557Z" }, { url = "https://files.pythonhosted.org/packages/99/eb/e618adefb839598d25ac8136cd577925d6c513dc0d931d93b8af956210f0/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:92bb00a947e666169c99b43753c4305fc95a890a60ef3aeb2a6963e07902cc87", size = 5016232, upload-time = "2026-03-13T13:54:10.611Z" }, { url = "https://files.pythonhosted.org/packages/d9/5f/9b5c9bfaa8ec82def8d8168c4f13615990d6ce5996fe52bd49bfb5e05134/fonttools-4.62.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:bdfe592802ef939a0e33106ea4a318eeb17822c7ee168c290273cbd5fabd746c", size = 5042987, upload-time = "2026-03-13T13:54:13.569Z" }, { url = "https://files.pythonhosted.org/packages/90/aa/dfbbe24c6a6afc5c203d90cc0343e24bcbb09e76d67c4d6eef8c2558d7ba/fonttools-4.62.1-cp314-cp314t-win32.whl", hash = "sha256:b820fcb92d4655513d8402d5b219f94481c4443d825b4372c75a2072aa4b357a", size = 2348021, upload-time = "2026-03-13T13:54:16.98Z" }, { url = "https://files.pythonhosted.org/packages/13/6f/ae9c4e4dd417948407b680855c2c7790efb52add6009aaecff1e3bc50e8e/fonttools-4.62.1-cp314-cp314t-win_amd64.whl", hash = "sha256:59b372b4f0e113d3746b88985f1c796e7bf830dd54b28374cd85c2b8acd7583e", size = 2414147, upload-time = "2026-03-13T13:54:19.416Z" }, { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, ] [[package]] name = "frozenlist" version = "1.8.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647, upload-time = "2025-10-06T05:36:03.409Z" }, { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064, upload-time = "2025-10-06T05:36:04.368Z" }, { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937, upload-time = "2025-10-06T05:36:05.669Z" }, { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, ] [[package]] name = "ghp-import" version = "2.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "python-dateutil" }, ] sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, ] [[package]] name = "greenlet" version = "2.0.2" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version == '3.11.*'", "python_full_version < '3.11'", ] sdist = { url = "https://files.pythonhosted.org/packages/1e/1e/632e55a04d732c8184201238d911207682b119c35cecbb9a573a6c566731/greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0", size = 164980, upload-time = "2023-01-28T14:19:28.808Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/34/27/ca6f6deccf2bf7dce5c50953d354d22743f9e2bbce36815f31966687a4d1/greenlet-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d967650d3f56af314b72df7089d96cda1083a7fc2da05b375d2bc48c82ab3f3c", size = 197506, upload-time = "2023-08-30T19:46:52.052Z" }, { url = "https://files.pythonhosted.org/packages/0a/46/96b37dcfe9c9d39b2d2f060a5775139ce8a440315a1ca2667a6b83a2860e/greenlet-2.0.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:30bcf80dda7f15ac77ba5af2b961bdd9dbc77fd4ac6105cee85b0d0a5fcf74df", size = 242120, upload-time = "2023-01-28T14:24:44.869Z" }, { url = "https://files.pythonhosted.org/packages/c5/ab/a69a875a45474cc5776b879258bfa685e99aae992ab310a0b8f773fe56a0/greenlet-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26fbfce90728d82bc9e6c38ea4d038cba20b7faf8a0ca53a9c07b67318d46088", size = 608292, upload-time = "2023-01-28T14:49:46.379Z" }, { url = "https://files.pythonhosted.org/packages/cd/e8/1ebc8f07d795c3677247e37dae23463a655636a4be387b0d739fa8fd9b2f/greenlet-2.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9190f09060ea4debddd24665d6804b995a9c122ef5917ab26e1566dcc712ceeb", size = 622726, upload-time = "2023-01-28T14:44:39.156Z" }, { url = "https://files.pythonhosted.org/packages/6e/11/a1f1af20b6a1a8069bc75012569d030acb89fd7ef70f888b6af2f85accc6/greenlet-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d75209eed723105f9596807495d58d10b3470fa6732dd6756595e89925ce2470", size = 613701, upload-time = "2023-01-28T14:24:05.899Z" }, { url = "https://files.pythonhosted.org/packages/c4/92/bbd9373fb022c21d1c41bc74b043d8d007825f80bb9534f0dd2f7ed62bca/greenlet-2.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3a51c9751078733d88e013587b108f1b7a1fb106d402fb390740f002b6f6551a", size = 1134345, upload-time = "2023-01-28T14:49:59.283Z" }, { url = "https://files.pythonhosted.org/packages/17/f9/7f5d755380d329e44307c2f6e52096740fdebb92e7e22516811aeae0aec0/greenlet-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76ae285c8104046b3a7f06b42f29c7b73f77683df18c49ab5af7983994c2dd91", size = 1156603, upload-time = "2023-01-28T14:26:39.223Z" }, { url = "https://files.pythonhosted.org/packages/53/0f/637f6e18e1980ebd2eedd8a9918a7898a6fe44f6188f6f39c6d9181c9891/greenlet-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:2d4686f195e32d36b4d7cf2d166857dbd0ee9f3d20ae349b6bf8afc8485b3645", size = 192171, upload-time = "2023-01-28T15:06:05.899Z" }, { url = "https://files.pythonhosted.org/packages/a8/7a/5542d863a91b3309585219bae7d97aa82fe0482499a840c100297262ec8f/greenlet-2.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c4302695ad8027363e96311df24ee28978162cdcdd2006476c43970b384a244c", size = 243039, upload-time = "2023-01-28T14:24:38.834Z" }, { url = "https://files.pythonhosted.org/packages/03/1a/dae7e4abc978e3eff4b8e90e76fb6619ba38d3cabac5f10131880fc03091/greenlet-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d4606a527e30548153be1a9f155f4e283d109ffba663a15856089fb55f933e47", size = 197881, upload-time = "2023-08-30T19:46:54.788Z" }, { url = "https://files.pythonhosted.org/packages/e8/3a/ebc4fa1e813ae1fa718eb88417c31587e2efb743ed5f6ff0ae066502c349/greenlet-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c48f54ef8e05f04d6eff74b8233f6063cb1ed960243eacc474ee73a2ea8573ca", size = 612431, upload-time = "2023-01-28T14:49:47.917Z" }, { url = "https://files.pythonhosted.org/packages/6b/2f/1cb3f376df561c95cb61b199676f51251f991699e325a2aa5e12693d10b8/greenlet-2.0.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a1846f1b999e78e13837c93c778dcfc3365902cfb8d1bdb7dd73ead37059f0d0", size = 627807, upload-time = "2023-01-28T14:44:41.138Z" }, { url = "https://files.pythonhosted.org/packages/86/8d/3a18311306830f6db5f5676a1cb8082c8943bfa6c928b40006e5358170fc/greenlet-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a06ad5312349fec0ab944664b01d26f8d1f05009566339ac6f63f56589bc1a2", size = 618820, upload-time = "2023-01-28T14:24:07.185Z" }, { url = "https://files.pythonhosted.org/packages/f0/2e/20eab0fa6353a08b0de055dd54e2575a6869ee693d86387076430475832d/greenlet-2.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:eff4eb9b7eb3e4d0cae3d28c283dc16d9bed6b193c2e1ace3ed86ce48ea8df19", size = 1138292, upload-time = "2023-01-28T14:50:01.666Z" }, { url = "https://files.pythonhosted.org/packages/71/c5/c26840ce91bcbbfc42c1a246289d9d4c758663652669f24e37f84bcdae2a/greenlet-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5454276c07d27a740c5892f4907c86327b632127dd9abec42ee62e12427ff7e3", size = 1161342, upload-time = "2023-01-28T14:26:41.487Z" }, { url = "https://files.pythonhosted.org/packages/7e/a6/0a34cde83fe520fa4e8192a1bc0fc7bf9f755215fefe3f42c9b97c45c620/greenlet-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:7cafd1208fdbe93b67c7086876f061f660cfddc44f404279c1585bbf3cdc64c5", size = 192458, upload-time = "2023-01-28T15:03:33.159Z" }, ] [[package]] name = "greenlet" version = "3.5.0" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13'", "python_full_version == '3.12.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/3c/3f/dbf99fb14bfeb88c28f16729215478c0e265cacd6dc22270c8f31bb6892f/greenlet-3.5.0.tar.gz", hash = "sha256:d419647372241bc68e957bf38d5c1f98852155e4146bd1e4121adea81f4f01e4", size = 196995, upload-time = "2026-04-27T13:37:15.544Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b0/03/84359833f7e1d49a883e92777637c592306030e30cee5e2b1e6476f95c88/greenlet-3.5.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:29ea813b2e1f45fa9649a17853b2b5465c4072fbcb072e5af6cd3a288216574a", size = 283502, upload-time = "2026-04-27T12:20:55.213Z" }, { url = "https://files.pythonhosted.org/packages/25/ce/6f9f008266273aa14a2e011945797ac5802b97b8b40efe7afe1ee6c1afc9/greenlet-3.5.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:804a70b328e706b785c6ef16187051c394a63dd1a906d89be24b6ad77759f13f", size = 600508, upload-time = "2026-04-27T12:52:37.876Z" }, { url = "https://files.pythonhosted.org/packages/e0/6d/b0f3272c2368ea2c1aa19a5ad70db0be8f8dff6e6d3d1eb82efa00cbcf19/greenlet-3.5.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:884f649de075b84739713d41dd4dfd41e2b910bfb769c4a3ea02ec1da52cd9bb", size = 613283, upload-time = "2026-04-27T12:59:37.957Z" }, { url = "https://files.pythonhosted.org/packages/e5/ae/1db979ff6ae7958d80b288f63d5f6c30df96682700ea9fc340ce994d94a1/greenlet-3.5.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4d0eadc7e4d9ffb2af4247b606cae307be8e448911e5a0d0b16d72fc3d224cfd", size = 619894, upload-time = "2026-04-27T13:02:35.13Z" }, { url = "https://files.pythonhosted.org/packages/ed/ac/0b509b6fb93551ce5a01612ee1acda7f7dda4bbb66c99aeb2ab403d205dc/greenlet-3.5.0-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4b28037cb07768933c54d81bfe47a85f9f402f57d7d69743b991a713b63954eb", size = 613418, upload-time = "2026-04-27T12:25:23.852Z" }, { url = "https://files.pythonhosted.org/packages/ce/94/b0590e3d1978f02419f30502341c40d72f77eb0a2198119fe27df47714ee/greenlet-3.5.0-cp310-cp310-manylinux_2_39_riscv64.whl", hash = "sha256:f8c30c2225f40dd76c50790f0eb3b5c7c18431efb299e2782083e1981feed243", size = 415681, upload-time = "2026-04-27T13:05:11.494Z" }, { url = "https://files.pythonhosted.org/packages/03/03/2b2b680ec87aaa97998fb5b8d76658d4d3560386864f17efab33ba7c2e24/greenlet-3.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cda05425526240807408156b6960a17a79a0c760b813573b67027823be760977", size = 1572229, upload-time = "2026-04-27T12:53:23.509Z" }, { url = "https://files.pythonhosted.org/packages/61/e4/42b259e7a19aff1a270a4bd82caf6353109ed6860c9454e18f37162b83ae/greenlet-3.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9c615f869163e14bb1ced20322d8038fb680b08236521ac3f30cd4c1288785a0", size = 1639886, upload-time = "2026-04-27T12:25:22.325Z" }, { url = "https://files.pythonhosted.org/packages/6f/b4/733ca47b883b67c57f90d3ecb21055c9ec753597d10754ac201644061f9d/greenlet-3.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:ba8f0bdc2fae6ce915dfd0c16d2d00bca7e4247c1eae4416e06430e522137858", size = 237795, upload-time = "2026-04-27T12:21:40.118Z" }, { url = "https://files.pythonhosted.org/packages/8b/0f/a91f143f356523ff682309732b175765a9bc2836fd7c081c2c67fedc1ad4/greenlet-3.5.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8f1cc966c126639cd152fdaa52624d2655f492faa79e013fea161de3e6dda082", size = 284726, upload-time = "2026-04-27T12:20:51.402Z" }, { url = "https://files.pythonhosted.org/packages/95/82/800646c7ffc5dbabd75ddd2f6b519bb898c0c9c969e5d0473bfe5d20bcce/greenlet-3.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:362624e6a8e5bca3b8233e45eef33903a100e9539a2b995c364d595dbc4018b3", size = 604264, upload-time = "2026-04-27T12:52:39.494Z" }, { url = "https://files.pythonhosted.org/packages/ca/ac/354867c0bba812fc33b15bc55aedafedd0aee3c7dd91dfca22444157dc0c/greenlet-3.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5ecd83806b0f4c2f53b1018e0005cd82269ea01d42befc0368730028d850ed1c", size = 616099, upload-time = "2026-04-27T12:59:39.623Z" }, { url = "https://files.pythonhosted.org/packages/c9/ab/192090c4a5b30df148c22bf4b8895457d739a7c7c5a7b9c41e5dd7f537f2/greenlet-3.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fa94cb2288681e3a11645958f1871d48ee9211bd2f66628fdace505927d6e564", size = 623976, upload-time = "2026-04-27T13:02:37.363Z" }, { url = "https://files.pythonhosted.org/packages/ff/b0/815bece7399e01cadb69014219eebd0042339875c59a59b0820a46ece356/greenlet-3.5.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0ff251e9a0279522e62f6176412869395a64ddf2b5c5f782ff609a8216a4e662", size = 615198, upload-time = "2026-04-27T12:25:25.928Z" }, { url = "https://files.pythonhosted.org/packages/24/11/05eb2b9b188c6df7d68a89c99134d644a7af616a40b9808e8e6ced315d5d/greenlet-3.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:64d6ac45f7271f48e45f67c95b54ef73534c52ec041fcda8edf520c6d811f4bc", size = 418379, upload-time = "2026-04-27T13:05:12.755Z" }, { url = "https://files.pythonhosted.org/packages/10/80/3b2c0a895d6698f6ddb31b07942ebfa982f3e30888bc5546a5b5990de8b2/greenlet-3.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d874e79afd41a96e11ff4c5d0bc90a80973e476fda1c2c64985667397df432b", size = 1574927, upload-time = "2026-04-27T12:53:25.81Z" }, { url = "https://files.pythonhosted.org/packages/44/0e/f354af514a4c61454dbc68e44d47544a5a4d6317e30b77ddfa3a09f4c5f3/greenlet-3.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0ed006e4b86c59de7467eb2601cd1b77b5a7d657d1ee55e30fe30d76451edba4", size = 1642683, upload-time = "2026-04-27T12:25:23.9Z" }, { url = "https://files.pythonhosted.org/packages/fa/6a/87f38255201e993a1915265ebb80cd7c2c78b04a45744995abbf6b259fd8/greenlet-3.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:703cb211b820dbffbbc55a16bfc6e4583a6e6e990f33a119d2cc8b83211119c8", size = 238115, upload-time = "2026-04-27T12:21:48.845Z" }, { url = "https://files.pythonhosted.org/packages/e3/f8/450fe3c5938fa737ea4d22699772e6e34e8e24431a47bf4e8a1ceed4a98e/greenlet-3.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:6c18dfb59c70f5a94acd271c72e90128c3c776e41e5f07767908c8c1b74ad339", size = 235017, upload-time = "2026-04-27T12:22:26.768Z" }, { url = "https://files.pythonhosted.org/packages/ef/32/f2ce6d4cac3e55bc6173f92dbe627e782e1850f89d986c3606feb63aafa7/greenlet-3.5.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:db2910d3c809444e0a20147361f343fe2798e106af8d9d8506f5305302655a9f", size = 286228, upload-time = "2026-04-27T12:20:34.421Z" }, { url = "https://files.pythonhosted.org/packages/b7/aa/caed9e5adf742315fc7be2a84196373aab4816e540e38ba0d76cb7584d68/greenlet-3.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ec9ea74e7268ace7f9aab1b1a4e730193fc661b39a993cd91c606c32d4a3628", size = 601775, upload-time = "2026-04-27T12:52:41.045Z" }, { url = "https://files.pythonhosted.org/packages/c7/af/90ae08497400a941595d12774447f752d3dfe0fbb012e35b76bc5c0ff37e/greenlet-3.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54d243512da35485fc7a6bf3c178fdda6327a9d6506fcdd62b1abd1e41b2927b", size = 614436, upload-time = "2026-04-27T12:59:41.595Z" }, { url = "https://files.pythonhosted.org/packages/3f/e9/4eeadf8cb3403ac274245ba75f07844abc7fa5f6787583fc9156ba741e0f/greenlet-3.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:41353ec2ecedf7aa8f682753a41919f8718031a6edac46b8d3dc7ed9e1ceb136", size = 620610, upload-time = "2026-04-27T13:02:39.194Z" }, { url = "https://files.pythonhosted.org/packages/2b/e0/2e13df68f367e2f9960616927d60857dd7e56aaadd59a47c644216b2f920/greenlet-3.5.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d280a7f5c331622c69f97eb167f33577ff2d1df282c41cd15907fc0a3ca198c", size = 611388, upload-time = "2026-04-27T12:25:28.008Z" }, { url = "https://files.pythonhosted.org/packages/ee/ef/f913b3c0eb7d26d86a2401c5e1546c9d46b657efee724b06f6f4ac5d8824/greenlet-3.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:58c1c374fe2b3d852f9b6b11a7dff4c85404e51b9a596fd9e89cf904eb09866d", size = 422775, upload-time = "2026-04-27T13:05:14.261Z" }, { url = "https://files.pythonhosted.org/packages/82/f7/393c64055132ac0d488ef6be549253b7e6274194863967ddc0bc8f5b87b8/greenlet-3.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1eb67d5adefb5bd2e182d42678a328979a209e4e82eb93575708185d31d1f588", size = 1570768, upload-time = "2026-04-27T12:53:28.099Z" }, { url = "https://files.pythonhosted.org/packages/b8/4b/eaf7735253522cf56d1b74d672a58f54fc114702ceaf05def59aae72f6e1/greenlet-3.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2628d6c86f6cb0cb45e0c3c54058bbec559f57eaae699447748cb3928150577e", size = 1635983, upload-time = "2026-04-27T12:25:26.903Z" }, { url = "https://files.pythonhosted.org/packages/4c/fe/4fb3a0805bd5165da5ebf858da7cc01cce8061674106d2cf5bdab32cbfde/greenlet-3.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:d4d9f0624c775f2dfc56ba54d515a8c771044346852a918b405914f6b19d7fd8", size = 238840, upload-time = "2026-04-27T12:23:54.806Z" }, { url = "https://files.pythonhosted.org/packages/cb/cb/baa584cb00532126ffe12d9787db0a60c5a4f55c27bfe2666df5d4c30a32/greenlet-3.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:83ed9f27f1680b50e89f40f6df348a290ea234b249a4003d366663a12eab94f2", size = 235615, upload-time = "2026-04-27T12:21:38.57Z" }, { url = "https://files.pythonhosted.org/packages/0c/58/fc576f99037ce19c5aa16628e4c3226b6d1419f72a62c79f5f40576e6eb3/greenlet-3.5.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:5a5ed18de6a0f6cc7087f1563f6bd93fc7df1c19165ca01e9bde5a5dc281d106", size = 285066, upload-time = "2026-04-27T12:23:05.033Z" }, { url = "https://files.pythonhosted.org/packages/4a/ba/b28ddbe6bfad6a8ac196ef0e8cff37bc65b79735995b9e410923fffeeb70/greenlet-3.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a717fbc46d8a354fa675f7c1e813485b6ba3885f9bef0cd56e5ba27d758ff5b", size = 604414, upload-time = "2026-04-27T12:52:42.358Z" }, { url = "https://files.pythonhosted.org/packages/09/06/4b69f8f0b67603a8be2790e55107a190b376f2627fe0eaf5695d85ffb3cd/greenlet-3.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ddc090c5c1792b10246a78e8c2163ebbe04cf877f9d785c230a7b27b39ad038e", size = 617349, upload-time = "2026-04-27T12:59:43.32Z" }, { url = "https://files.pythonhosted.org/packages/6a/15/a643b4ecd09969e30b8a150d5919960caae0abe4f5af75ab040b1ab85e78/greenlet-3.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4964101b8585c144cbda5532b1aa644255126c08a265dae90c16e7a0e63aaa9d", size = 623234, upload-time = "2026-04-27T13:02:40.611Z" }, { url = "https://files.pythonhosted.org/packages/8a/17/a3918541fd0ddefe024a69de6d16aa7b46d36ac19562adaa63c7fa180eff/greenlet-3.5.0-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2094acd54b272cb6eae8c03dd87b3fa1820a4cef18d6889c378d503500a1dc13", size = 613927, upload-time = "2026-04-27T12:25:30.28Z" }, { url = "https://files.pythonhosted.org/packages/77/18/3b13d5ef1275b0ffaf933b05efa21408ac4ca95823c7411d79682e4fdcff/greenlet-3.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:7022615368890680e67b9965d33f5773aade330d5343bbe25560135aaa849eae", size = 425243, upload-time = "2026-04-27T13:05:15.689Z" }, { url = "https://files.pythonhosted.org/packages/ee/e1/bd0af6213c7dd33175d8a462d4c1fe1175124ebed4855bc1475a5b5242c2/greenlet-3.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5e05ba267789ea87b5a155cf0e810b1ab88bf18e9e8740813945ceb8ee4350ba", size = 1570893, upload-time = "2026-04-27T12:53:29.483Z" }, { url = "https://files.pythonhosted.org/packages/9b/2a/0789702f864f5382cb476b93d7a9c823c10472658102ccd65f415747d2e2/greenlet-3.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0ecec963079cd58cbd14723582384f11f166fd58883c15dcbfb342e0bc9b5846", size = 1636060, upload-time = "2026-04-27T12:25:28.845Z" }, { url = "https://files.pythonhosted.org/packages/b2/8f/22bf9df92bbff0eb07842b60f7e63bf7675a9742df628437a9f02d09137f/greenlet-3.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:728d9667d8f2f586644b748dbd9bb67e50d6a9381767d1357714ea6825bb3bf5", size = 238740, upload-time = "2026-04-27T12:24:01.341Z" }, { url = "https://files.pythonhosted.org/packages/b6/b7/9c5c3d653bd4ff614277c049ac676422e2c557db47b4fe43e6313fc005dc/greenlet-3.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:47422135b1d308c14b2c6e758beedb1acd33bb91679f5670edf77bf46244722b", size = 235525, upload-time = "2026-04-27T12:23:12.308Z" }, { url = "https://files.pythonhosted.org/packages/94/5e/a70f31e3e8d961c4ce589c15b28e4225d63704e431a23932a3808cbcc867/greenlet-3.5.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:f35807464c4c58c55f0d31dfa83c541a5615d825c2fe3d2b95360cf7c4e3c0a8", size = 285564, upload-time = "2026-04-27T12:23:08.555Z" }, { url = "https://files.pythonhosted.org/packages/af/a6/046c0a28e21833e4086918218cfb3d8bed51c075a1b700f20b9d7861c0f4/greenlet-3.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55fa7ea52771be44af0de27d8b80c02cd18c2c3cddde6c847ecebdf72418b6a1", size = 651166, upload-time = "2026-04-27T12:52:43.644Z" }, { url = "https://files.pythonhosted.org/packages/47/f8/4af27f71c5ff32a7fbc516adb46370d9c4ae2bc7bd3dc7d066ac542b4b15/greenlet-3.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a97e4821aa710603f94de0da25f25096454d78ffdace5dc77f3a006bc01abba3", size = 663792, upload-time = "2026-04-27T12:59:44.93Z" }, { url = "https://files.pythonhosted.org/packages/fb/89/2dadb89793c37ee8b4c237857188293e9060dc085f19845c292e00f8e091/greenlet-3.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bf2d8a80bec89ab46221ae45c5373d5ba0bd36c19aa8508e85c6cd7e5106cd37", size = 668086, upload-time = "2026-04-27T13:02:42.314Z" }, { url = "https://files.pythonhosted.org/packages/a3/59/1bd6d7428d6ed9106efbb8c52310c60fd04f6672490f452aeaa3829aa436/greenlet-3.5.0-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f52a464e4ed91780bdfbbdd2b97197f3accaa629b98c200f4dffada759f3ae7", size = 660933, upload-time = "2026-04-27T12:25:33.276Z" }, { url = "https://files.pythonhosted.org/packages/82/35/75722be7e26a2af4cbd2dc35b0ed382dacf9394b7e75551f76ed1abe87f2/greenlet-3.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:1bae92a1dd94c5f9d9493c3a212dd874c202442047cf96446412c862feca83a2", size = 470799, upload-time = "2026-04-27T13:05:17.094Z" }, { url = "https://files.pythonhosted.org/packages/83/e4/b903e5a5fae1e8a28cdd32a0cfbfd560b668c25b692f67768822ddc5f40f/greenlet-3.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:762612baf1161ccb8437c0161c668a688223cba28e1bf038f4eb47b13e39ccdf", size = 1618401, upload-time = "2026-04-27T12:53:31.062Z" }, { url = "https://files.pythonhosted.org/packages/0e/e3/5ec408a329acb854fb607a122e1ee5fb3ff649f9a97952948a90803c0d8e/greenlet-3.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:57a43c6079a89713522bc4bcb9f75070ecf5d3dbad7792bfe42239362cbf2a16", size = 1682038, upload-time = "2026-04-27T12:25:31.838Z" }, { url = "https://files.pythonhosted.org/packages/91/20/6b165108058767ee643c55c5c4904d591a830ee2b3c7dbd359828fbc829f/greenlet-3.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:3bc59be3945ae9750b9e7d45067d01ae3fe90ea5f9ade99239dabdd6e28a5033", size = 239835, upload-time = "2026-04-27T12:24:54.136Z" }, { url = "https://files.pythonhosted.org/packages/4e/62/1c498375cee177b55d980c1db319f26470e5309e54698c8f8fc06c0fd539/greenlet-3.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:a96fcee45e03fe30a62669fd16ab5c9d3c172660d3085605cb1e2d1280d3c988", size = 236862, upload-time = "2026-04-27T12:23:24.957Z" }, { url = "https://files.pythonhosted.org/packages/78/a8/4522939255bb5409af4e87132f915446bf3622c2c292d14d3c38d128ae82/greenlet-3.5.0-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:a10a732421ab4fec934783ce3e54763470d0181db6e3468f9103a275c3ed1853", size = 293614, upload-time = "2026-04-27T12:24:12.874Z" }, { url = "https://files.pythonhosted.org/packages/15/5e/8744c52e2c027b5a8772a01561934c8835f869733e101f62075c60430340/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7fc391b1566f2907d17aaebe78f8855dc45675159a775fcf9e61f8ee0078e87f", size = 650723, upload-time = "2026-04-27T12:52:45.412Z" }, { url = "https://files.pythonhosted.org/packages/00/ef/7b4c39c03cf46ceca512c5d3f914afd85aa30b2cc9a93015b0dd73e4be6c/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:680bd0e7ad5e8daa8a4aa89f68fd6adc834b8a8036dc256533f7e08f4a4b01f7", size = 656529, upload-time = "2026-04-27T12:59:46.295Z" }, { url = "https://files.pythonhosted.org/packages/5f/5c/0602239503b124b70e39355cbdb39361ecfe65b87a5f2f63752c32f5286f/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1aa4ce8debcd4ea7fb2e150f3036588c41493d1d52c43538924ae1819003f4ce", size = 657015, upload-time = "2026-04-27T13:02:43.973Z" }, { url = "https://files.pythonhosted.org/packages/0b/b5/c7768f352f5c010f92064d0063f987e7dc0cd290a6d92a34109015ce4aa1/greenlet-3.5.0-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ddb36c7d6c9c0a65f18c7258634e0c416c6ab59caac8c987b96f80c2ebda0112", size = 654364, upload-time = "2026-04-27T12:25:35.64Z" }, { url = "https://files.pythonhosted.org/packages/38/51/8699f865f125dc952384cb432b0f7138aa4d8f2969a7d12d0df5b94d054d/greenlet-3.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:728a73687e39ae9ca34e4694cbf2f049d3fbc7174639468d0f67200a97d8f9e2", size = 488275, upload-time = "2026-04-27T13:05:18.28Z" }, { url = "https://files.pythonhosted.org/packages/ef/d0/079ebe12e4b1fc758857ce5be1a5e73f06870f2101e52611d1e71925ce54/greenlet-3.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e5ddf316ced87539144621453c3aef229575825fe60c604e62bedc4003f372b2", size = 1614204, upload-time = "2026-04-27T12:53:32.618Z" }, { url = "https://files.pythonhosted.org/packages/6d/89/6c2fb63df3596552d20e58fb4d96669243388cf680cff222758812c7bfaa/greenlet-3.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4a448128607be0de65342dc9b31be7f948ef4cc0bc8832069350abefd310a8f2", size = 1675480, upload-time = "2026-04-27T12:25:34.168Z" }, { url = "https://files.pythonhosted.org/packages/15/32/77ee8a6c1564fc345a491a4e85b3bf360e4cf26eac98c4532d2fdb96e01f/greenlet-3.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d60097128cb0a1cab9ea541186ea13cd7b847b8449a7787c2e2350da0cb82d86", size = 245324, upload-time = "2026-04-27T12:24:40.295Z" }, ] [[package]] name = "griffelib" version = "2.0.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9d/82/74f4a3310cdabfbb10da554c3a672847f1ed33c6f61dd472681ce7f1fe67/griffelib-2.0.2.tar.gz", hash = "sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e", size = 166461, upload-time = "2026-03-27T11:34:51.091Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/11/8c/c9138d881c79aa0ea9ed83cbd58d5ca75624378b38cee225dcf5c42cc91f/griffelib-2.0.2-py3-none-any.whl", hash = "sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1", size = 142357, upload-time = "2026-03-27T11:34:46.275Z" }, ] [[package]] name = "h11" version = "0.16.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, ] [[package]] name = "h2" version = "4.3.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "hpack" }, { name = "hyperframe" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" }, ] [[package]] name = "hpack" version = "4.1.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2c/48/71de9ed269fdae9c8057e5a4c0aa7402e8bb16f2c6e90b3aa53327b113f8/hpack-4.1.0.tar.gz", hash = "sha256:ec5eca154f7056aa06f196a557655c5b009b382873ac8d1e66e79e87535f1dca", size = 51276, upload-time = "2025-01-22T21:44:58.347Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/07/c6/80c95b1b2b94682a72cbdbfb85b81ae2daffa4291fbfa1b1464502ede10d/hpack-4.1.0-py3-none-any.whl", hash = "sha256:157ac792668d995c657d93111f46b4535ed114f0c9c8d672271bbec7eae1b496", size = 34357, upload-time = "2025-01-22T21:44:56.92Z" }, ] [[package]] name = "httpbin" version = "0.10.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "brotlicffi" }, { name = "decorator" }, { name = "flasgger" }, { name = "flask" }, { name = "greenlet", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, { name = "greenlet", version = "3.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, { name = "six" }, { name = "werkzeug" }, ] sdist = { url = "https://files.pythonhosted.org/packages/61/90/e2eeeedc96fbfd9345dff0407574b8edb8ff97ad1682ef518bdfaf096dd5/httpbin-0.10.2.tar.gz", hash = "sha256:632148698261c8684ea2d2b624cdea845b402b1fe91736e89df886408c6317a9", size = 107327, upload-time = "2024-02-20T21:30:15.221Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1f/2a/12e12f8f07070cd12b46c60fd8fd709ff01414830213bfc5153ab527331f/httpbin-0.10.2-py2.py3-none-any.whl", hash = "sha256:8e28e67f72ead4419977c9f2dba4ce86ce08768ada30ef9a87288527bb925d00", size = 100343, upload-time = "2024-02-20T21:30:12.383Z" }, ] [[package]] name = "httpcore2" source = { editable = "src/httpcore2" } dependencies = [ { name = "h11" }, { name = "truststore" }, ] [package.optional-dependencies] asyncio = [ { name = "anyio" }, ] http2 = [ { name = "h2" }, ] socks = [ { name = "socksio" }, ] trio = [ { name = "trio" }, ] [package.metadata] requires-dist = [ { name = "anyio", marker = "extra == 'asyncio'", specifier = ">=4.5.0,<5.0" }, { name = "h11", specifier = ">=0.16" }, { name = "h2", marker = "extra == 'http2'", specifier = ">=3,<5" }, { name = "socksio", marker = "extra == 'socks'", specifier = "==1.*" }, { name = "trio", marker = "extra == 'trio'", specifier = ">=0.22.0,<1.0" }, { name = "truststore", specifier = ">=0.10" }, ] provides-extras = ["asyncio", "http2", "socks", "trio"] [[package]] name = "httpx2" source = { editable = "src/httpx2" } dependencies = [ { name = "anyio" }, { name = "httpcore2" }, { name = "idna" }, { name = "truststore" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] [package.optional-dependencies] brotli = [ { name = "brotli", marker = "platform_python_implementation == 'CPython'" }, { name = "brotlicffi", marker = "platform_python_implementation != 'CPython'" }, ] cli = [ { name = "click" }, { name = "pygments" }, { name = "rich" }, ] http2 = [ { name = "h2" }, ] socks = [ { name = "socksio" }, ] zstd = [ { name = "zstandard", marker = "python_full_version < '3.14'" }, ] [package.metadata] requires-dist = [ { name = "anyio" }, { name = "brotli", marker = "platform_python_implementation == 'CPython' and extra == 'brotli'" }, { name = "brotlicffi", marker = "platform_python_implementation != 'CPython' and extra == 'brotli'" }, { name = "click", marker = "extra == 'cli'", specifier = "==8.*" }, { name = "h2", marker = "extra == 'http2'", specifier = ">=3,<5" }, { name = "httpcore2", editable = "src/httpcore2" }, { name = "idna", specifier = ">=3.18" }, { name = "pygments", marker = "extra == 'cli'", specifier = "==2.*" }, { name = "rich", marker = "extra == 'cli'", specifier = ">=10,<16" }, { name = "socksio", marker = "extra == 'socks'", specifier = "==1.*" }, { name = "truststore", specifier = ">=0.10" }, { name = "typing-extensions", marker = "python_full_version < '3.13'", specifier = ">=4.5.0" }, { name = "zstandard", marker = "python_full_version < '3.14' and extra == 'zstd'", specifier = ">=0.18.0" }, ] provides-extras = ["brotli", "cli", "http2", "socks", "zstd"] [[package]] name = "hyperframe" version = "6.1.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" }, ] [[package]] name = "id" version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/6d/04/c2156091427636080787aac190019dc64096e56a23b7364d3c1764ee3a06/id-1.6.1.tar.gz", hash = "sha256:d0732d624fb46fd4e7bc4e5152f00214450953b9e772c182c1c22964def1a069", size = 18088, upload-time = "2026-02-04T16:19:41.26Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/42/77/de194443bf38daed9452139e960c632b0ef9f9a5dd9ce605fdf18ca9f1b1/id-1.6.1-py3-none-any.whl", hash = "sha256:f5ec41ed2629a508f5d0988eda142e190c9c6da971100612c4de9ad9f9b237ca", size = 14689, upload-time = "2026-02-04T16:19:40.051Z" }, ] [[package]] name = "idna" version = "3.18" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, ] [[package]] name = "importlib-metadata" version = "9.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "zipp" }, ] sdist = { url = "https://files.pythonhosted.org/packages/a9/01/15bb152d77b21318514a96f43af312635eb2500c96b55398d020c93d86ea/importlib_metadata-9.0.0.tar.gz", hash = "sha256:a4f57ab599e6a2e3016d7595cfd72eb4661a5106e787a95bcc90c7105b831efc", size = 56405, upload-time = "2026-03-20T06:42:56.999Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/38/3d/2d244233ac4f76e38533cfcb2991c9eb4c7bf688ae0a036d30725b8faafe/importlib_metadata-9.0.0-py3-none-any.whl", hash = "sha256:2d21d1cc5a017bd0559e36150c21c830ab1dc304dedd1b7ea85d20f45ef3edd7", size = 27789, upload-time = "2026-03-20T06:42:55.665Z" }, ] [[package]] name = "iniconfig" version = "2.3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, ] [[package]] name = "itsdangerous" version = "2.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, ] [[package]] name = "jaraco-classes" version = "3.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, ] sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780, upload-time = "2024-03-31T07:27:36.643Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777, upload-time = "2024-03-31T07:27:34.792Z" }, ] [[package]] name = "jaraco-context" version = "6.1.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/af/50/4763cd07e722bb6285316d390a164bc7e479db9d90daa769f22578f698b4/jaraco_context-6.1.2.tar.gz", hash = "sha256:f1a6c9d391e661cc5b8d39861ff077a7dc24dc23833ccee564b234b81c82dfe3", size = 16801, upload-time = "2026-03-20T22:13:33.922Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f2/58/bc8954bda5fcda97bd7c19be11b85f91973d67a706ed4a3aec33e7de22db/jaraco_context-6.1.2-py3-none-any.whl", hash = "sha256:bf8150b79a2d5d91ae48629d8b427a8f7ba0e1097dd6202a9059f29a36379535", size = 7871, upload-time = "2026-03-20T22:13:32.808Z" }, ] [[package]] name = "jaraco-functools" version = "4.4.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "more-itertools" }, ] sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943, upload-time = "2025-12-21T09:29:43.6Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/fd/c4/813bb09f0985cb21e959f21f2464169eca882656849adf727ac7bb7e1767/jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176", size = 10481, upload-time = "2025-12-21T09:29:42.27Z" }, ] [[package]] name = "jeepney" version = "0.9.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758, upload-time = "2025-02-27T18:51:01.684Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010, upload-time = "2025-02-27T18:51:00.104Z" }, ] [[package]] name = "jinja2" version = "3.1.6" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, ] [[package]] name = "jsonschema" version = "4.26.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "jsonschema-specifications" }, { name = "referencing" }, { name = "rpds-py" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, ] [[package]] name = "jsonschema-specifications" version = "2025.9.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "referencing" }, ] sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, ] [[package]] name = "keyring" version = "25.7.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, { name = "jaraco-classes" }, { name = "jaraco-context" }, { name = "jaraco-functools" }, { name = "jeepney", marker = "sys_platform == 'linux'" }, { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, { name = "secretstorage", marker = "sys_platform == 'linux'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516, upload-time = "2025-11-16T16:26:09.482Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, ] [[package]] name = "kiwisolver" version = "1.5.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ac/f8/06549565caa026e540b7e7bab5c5a90eb7ca986015f4c48dace243cd24d9/kiwisolver-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32cc0a5365239a6ea0c6ed461e8838d053b57e397443c0ca894dcc8e388d4374", size = 122802, upload-time = "2026-03-09T13:12:37.515Z" }, { url = "https://files.pythonhosted.org/packages/84/eb/8476a0818850c563ff343ea7c9c05dcdcbd689a38e01aa31657df01f91fa/kiwisolver-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc0b66c1eec9021353a4b4483afb12dfd50e3669ffbb9152d6842eb34c7e29fd", size = 66216, upload-time = "2026-03-09T13:12:38.812Z" }, { url = "https://files.pythonhosted.org/packages/f3/c4/f9c8a6b4c21aed4198566e45923512986d6cef530e7263b3a5f823546561/kiwisolver-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86e0287879f75621ae85197b0877ed2f8b7aa57b511c7331dce2eb6f4de7d476", size = 63917, upload-time = "2026-03-09T13:12:40.053Z" }, { url = "https://files.pythonhosted.org/packages/f1/0e/ba4ae25d03722f64de8b2c13e80d82ab537a06b30fc7065183c6439357e3/kiwisolver-1.5.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:62f59da443c4f4849f73a51a193b1d9d258dcad0c41bc4d1b8fb2bcc04bfeb22", size = 1628776, upload-time = "2026-03-09T13:12:41.976Z" }, { url = "https://files.pythonhosted.org/packages/8a/e4/3f43a011bc8a0860d1c96f84d32fa87439d3feedf66e672fef03bf5e8bac/kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9190426b7aa26c5229501fa297b8d0653cfd3f5a36f7990c264e157cbf886b3b", size = 1228164, upload-time = "2026-03-09T13:12:44.002Z" }, { url = "https://files.pythonhosted.org/packages/4b/34/3a901559a1e0c218404f9a61a93be82d45cb8f44453ba43088644980f033/kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c8277104ded0a51e699c8c3aff63ce2c56d4ed5519a5f73e0fd7057f959a2b9e", size = 1246656, upload-time = "2026-03-09T13:12:45.557Z" }, { url = "https://files.pythonhosted.org/packages/87/9e/f78c466ea20527822b95ad38f141f2de1dcd7f23fb8716b002b0d91bbe59/kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8f9baf6f0a6e7571c45c8863010b45e837c3ee1c2c77fcd6ef423be91b21fedb", size = 1295562, upload-time = "2026-03-09T13:12:47.562Z" }, { url = "https://files.pythonhosted.org/packages/0a/66/fd0e4a612e3a286c24e6d6f3a5428d11258ed1909bc530ba3b59807fd980/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cff8e5383db4989311f99e814feeb90c4723eb4edca425b9d5d9c3fefcdd9537", size = 2178473, upload-time = "2026-03-09T13:12:50.254Z" }, { url = "https://files.pythonhosted.org/packages/dc/8e/6cac929e0049539e5ee25c1ee937556f379ba5204840d03008363ced662d/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ebae99ed6764f2b5771c522477b311be313e8841d2e0376db2b10922daebbba4", size = 2274035, upload-time = "2026-03-09T13:12:51.785Z" }, { url = "https://files.pythonhosted.org/packages/ca/d3/9d0c18f1b52ea8074b792452cf17f1f5a56bd0302a85191f405cfbf9da16/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d5cd5189fc2b6a538b75ae45433140c4823463918f7b1617c31e68b085c0022c", size = 2443217, upload-time = "2026-03-09T13:12:53.329Z" }, { url = "https://files.pythonhosted.org/packages/45/2a/6e19368803a038b2a90857bf4ee9e3c7b667216d045866bf22d3439fd75e/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f42c23db5d1521218a3276bb08666dcb662896a0be7347cba864eca45ff64ede", size = 2249196, upload-time = "2026-03-09T13:12:55.057Z" }, { url = "https://files.pythonhosted.org/packages/75/2b/3f641dfcbe72e222175d626bacf2f72c3b34312afec949dd1c50afa400f5/kiwisolver-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:94eff26096eb5395136634622515b234ecb6c9979824c1f5004c6e3c3c85ccd2", size = 73389, upload-time = "2026-03-09T13:12:56.496Z" }, { url = "https://files.pythonhosted.org/packages/da/88/299b137b9e0025d8982e03d2d52c123b0a2b159e84b0ef1501ef446339cf/kiwisolver-1.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:dd952e03bfbb096cfe2dd35cd9e00f269969b67536cb4370994afc20ff2d0875", size = 64782, upload-time = "2026-03-09T13:12:57.609Z" }, { url = "https://files.pythonhosted.org/packages/12/dd/a495a9c104be1c476f0386e714252caf2b7eca883915422a64c50b88c6f5/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c", size = 122798, upload-time = "2026-03-09T13:12:58.963Z" }, { url = "https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb", size = 66216, upload-time = "2026-03-09T13:13:00.155Z" }, { url = "https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac", size = 63911, upload-time = "2026-03-09T13:13:01.671Z" }, { url = "https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27", size = 1438209, upload-time = "2026-03-09T13:13:03.385Z" }, { url = "https://files.pythonhosted.org/packages/fd/d6/76621246f5165e5372f02f5e6f3f48ea336a8f9e96e43997d45b240ed8cd/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398", size = 1248888, upload-time = "2026-03-09T13:13:05.231Z" }, { url = "https://files.pythonhosted.org/packages/b2/c1/31559ec6fb39a5b48035ce29bb63ade628f321785f38c384dee3e2c08bc1/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db", size = 1266304, upload-time = "2026-03-09T13:13:06.743Z" }, { url = "https://files.pythonhosted.org/packages/5e/ef/1cb8276f2d29cc6a41e0a042f27946ca347d3a4a75acf85d0a16aa6dcc82/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc", size = 1319650, upload-time = "2026-03-09T13:13:08.607Z" }, { url = "https://files.pythonhosted.org/packages/4c/e4/5ba3cecd7ce6236ae4a80f67e5d5531287337d0e1f076ca87a5abe4cd5d0/kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679", size = 970949, upload-time = "2026-03-09T13:13:10.299Z" }, { url = "https://files.pythonhosted.org/packages/5a/69/dc61f7ae9a2f071f26004ced87f078235b5507ab6e5acd78f40365655034/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309", size = 2199125, upload-time = "2026-03-09T13:13:11.841Z" }, { url = "https://files.pythonhosted.org/packages/e5/7b/abbe0f1b5afa85f8d084b73e90e5f801c0939eba16ac2e49af7c61a6c28d/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2", size = 2293783, upload-time = "2026-03-09T13:13:14.399Z" }, { url = "https://files.pythonhosted.org/packages/8a/80/5908ae149d96d81580d604c7f8aefd0e98f4fd728cf172f477e9f2a81744/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c", size = 1960726, upload-time = "2026-03-09T13:13:16.047Z" }, { url = "https://files.pythonhosted.org/packages/84/08/a78cb776f8c085b7143142ce479859cfec086bd09ee638a317040b6ef420/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08", size = 2464738, upload-time = "2026-03-09T13:13:17.897Z" }, { url = "https://files.pythonhosted.org/packages/b1/e1/65584da5356ed6cb12c63791a10b208860ac40a83de165cb6a6751a686e3/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4", size = 2270718, upload-time = "2026-03-09T13:13:19.421Z" }, { url = "https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b", size = 73480, upload-time = "2026-03-09T13:13:20.818Z" }, { url = "https://files.pythonhosted.org/packages/d8/0e/2ee5debc4f77a625778fec5501ff3e8036fe361b7ee28ae402a485bb9694/kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac", size = 64930, upload-time = "2026-03-09T13:13:21.997Z" }, { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, { url = "https://files.pythonhosted.org/packages/9d/69/024d6711d5ba575aa65d5538042e99964104e97fa153a9f10bc369182bc2/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:fd40bb9cd0891c4c3cb1ddf83f8bbfa15731a248fdc8162669405451e2724b09", size = 123166, upload-time = "2026-03-09T13:13:48.032Z" }, { url = "https://files.pythonhosted.org/packages/ce/48/adbb40df306f587054a348831220812b9b1d787aff714cfbc8556e38fccd/kiwisolver-1.5.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c0e1403fd7c26d77c1f03e096dc58a5c726503fa0db0456678b8668f76f521e3", size = 66395, upload-time = "2026-03-09T13:13:49.365Z" }, { url = "https://files.pythonhosted.org/packages/a8/3a/d0a972b34e1c63e2409413104216cd1caa02c5a37cb668d1687d466c1c45/kiwisolver-1.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:dda366d548e89a90d88a86c692377d18d8bd64b39c1fb2b92cb31370e2896bbd", size = 64065, upload-time = "2026-03-09T13:13:50.562Z" }, { url = "https://files.pythonhosted.org/packages/2b/0a/7b98e1e119878a27ba8618ca1e18b14f992ff1eda40f47bccccf4de44121/kiwisolver-1.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:332b4f0145c30b5f5ad9374881133e5aa64320428a57c2c2b61e9d891a51c2f3", size = 1477903, upload-time = "2026-03-09T13:13:52.084Z" }, { url = "https://files.pythonhosted.org/packages/18/d8/55638d89ffd27799d5cc3d8aa28e12f4ce7a64d67b285114dbedc8ea4136/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0c50b89ffd3e1a911c69a1dd3de7173c0cd10b130f56222e57898683841e4f96", size = 1278751, upload-time = "2026-03-09T13:13:54.673Z" }, { url = "https://files.pythonhosted.org/packages/b8/97/b4c8d0d18421ecceba20ad8701358453b88e32414e6f6950b5a4bad54e65/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4db576bb8c3ef9365f8b40fe0f671644de6736ae2c27a2c62d7d8a1b4329f099", size = 1296793, upload-time = "2026-03-09T13:13:56.287Z" }, { url = "https://files.pythonhosted.org/packages/c4/10/f862f94b6389d8957448ec9df59450b81bec4abb318805375c401a1e6892/kiwisolver-1.5.0-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0b85aad90cea8ac6797a53b5d5f2e967334fa4d1149f031c4537569972596cb8", size = 1346041, upload-time = "2026-03-09T13:13:58.269Z" }, { url = "https://files.pythonhosted.org/packages/a3/6a/f1650af35821eaf09de398ec0bc2aefc8f211f0cda50204c9f1673741ba9/kiwisolver-1.5.0-cp313-cp313-manylinux_2_39_riscv64.whl", hash = "sha256:d36ca54cb4c6c4686f7cbb7b817f66f5911c12ddb519450bbe86707155028f87", size = 987292, upload-time = "2026-03-09T13:13:59.871Z" }, { url = "https://files.pythonhosted.org/packages/de/19/d7fb82984b9238115fe629c915007be608ebd23dc8629703d917dbfaffd4/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:38f4a703656f493b0ad185211ccfca7f0386120f022066b018eb5296d8613e23", size = 2227865, upload-time = "2026-03-09T13:14:01.401Z" }, { url = "https://files.pythonhosted.org/packages/7f/b9/46b7f386589fd222dac9e9de9c956ce5bcefe2ee73b4e79891381dda8654/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3ac2360e93cb41be81121755c6462cff3beaa9967188c866e5fce5cf13170859", size = 2324369, upload-time = "2026-03-09T13:14:02.972Z" }, { url = "https://files.pythonhosted.org/packages/92/8b/95e237cf3d9c642960153c769ddcbe278f182c8affb20cecc1cc983e7cc5/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c95cab08d1965db3d84a121f1c7ce7479bdd4072c9b3dafd8fecce48a2e6b902", size = 1977989, upload-time = "2026-03-09T13:14:04.503Z" }, { url = "https://files.pythonhosted.org/packages/1b/95/980c9df53501892784997820136c01f62bc1865e31b82b9560f980c0e649/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:fc20894c3d21194d8041a28b65622d5b86db786da6e3cfe73f0c762951a61167", size = 2491645, upload-time = "2026-03-09T13:14:06.106Z" }, { url = "https://files.pythonhosted.org/packages/cb/32/900647fd0840abebe1561792c6b31e6a7c0e278fc3973d30572a965ca14c/kiwisolver-1.5.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:7a32f72973f0f950c1920475d5c5ea3d971b81b6f0ec53b8d0a956cc965f22e0", size = 2295237, upload-time = "2026-03-09T13:14:08.891Z" }, { url = "https://files.pythonhosted.org/packages/be/8a/be60e3bbcf513cc5a50f4a3e88e1dcecebb79c1ad607a7222877becaa101/kiwisolver-1.5.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bf3acf1419fa93064a4c2189ac0b58e3be7872bf6ee6177b0d4c63dc4cea276", size = 73573, upload-time = "2026-03-09T13:14:12.327Z" }, { url = "https://files.pythonhosted.org/packages/4d/d2/64be2e429eb4fca7f7e1c52a91b12663aeaf25de3895e5cca0f47ef2a8d0/kiwisolver-1.5.0-cp313-cp313-win_arm64.whl", hash = "sha256:fa8eb9ecdb7efb0b226acec134e0d709e87a909fa4971a54c0c4f6e88635484c", size = 64998, upload-time = "2026-03-09T13:14:13.469Z" }, { url = "https://files.pythonhosted.org/packages/b0/69/ce68dd0c85755ae2de490bf015b62f2cea5f6b14ff00a463f9d0774449ff/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:db485b3847d182b908b483b2ed133c66d88d49cacf98fd278fadafe11b4478d1", size = 125700, upload-time = "2026-03-09T13:14:14.636Z" }, { url = "https://files.pythonhosted.org/packages/74/aa/937aac021cf9d4349990d47eb319309a51355ed1dbdc9c077cdc9224cb11/kiwisolver-1.5.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:be12f931839a3bdfe28b584db0e640a65a8bcbc24560ae3fdb025a449b3d754e", size = 67537, upload-time = "2026-03-09T13:14:15.808Z" }, { url = "https://files.pythonhosted.org/packages/ee/20/3a87fbece2c40ad0f6f0aefa93542559159c5f99831d596050e8afae7a9f/kiwisolver-1.5.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:16b85d37c2cbb3253226d26e64663f755d88a03439a9c47df6246b35defbdfb7", size = 65514, upload-time = "2026-03-09T13:14:18.035Z" }, { url = "https://files.pythonhosted.org/packages/f0/7f/f943879cda9007c45e1f7dba216d705c3a18d6b35830e488b6c6a4e7cdf0/kiwisolver-1.5.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4432b835675f0ea7414aab3d37d119f7226d24869b7a829caeab49ebda407b0c", size = 1584848, upload-time = "2026-03-09T13:14:19.745Z" }, { url = "https://files.pythonhosted.org/packages/37/f8/4d4f85cc1870c127c88d950913370dd76138482161cd07eabbc450deff01/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b0feb50971481a2cc44d94e88bdb02cdd497618252ae226b8eb1201b957e368", size = 1391542, upload-time = "2026-03-09T13:14:21.54Z" }, { url = "https://files.pythonhosted.org/packages/04/0b/65dd2916c84d252b244bd405303220f729e7c17c9d7d33dca6feeff9ffc4/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56fa888f10d0f367155e76ce849fa1166fc9730d13bd2d65a2aa13b6f5424489", size = 1404447, upload-time = "2026-03-09T13:14:23.205Z" }, { url = "https://files.pythonhosted.org/packages/39/5c/2606a373247babce9b1d056c03a04b65f3cf5290a8eac5d7bdead0a17e21/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:940dda65d5e764406b9fb92761cbf462e4e63f712ab60ed98f70552e496f3bf1", size = 1455918, upload-time = "2026-03-09T13:14:24.74Z" }, { url = "https://files.pythonhosted.org/packages/d5/d1/c6078b5756670658e9192a2ef11e939c92918833d2745f85cd14a6004bdf/kiwisolver-1.5.0-cp313-cp313t-manylinux_2_39_riscv64.whl", hash = "sha256:89fc958c702ee9a745e4700378f5d23fddbc46ff89e8fdbf5395c24d5c1452a3", size = 1072856, upload-time = "2026-03-09T13:14:26.597Z" }, { url = "https://files.pythonhosted.org/packages/cb/c8/7def6ddf16eb2b3741d8b172bdaa9af882b03c78e9b0772975408801fa63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9027d773c4ff81487181a925945743413f6069634d0b122d0b37684ccf4f1e18", size = 2333580, upload-time = "2026-03-09T13:14:28.237Z" }, { url = "https://files.pythonhosted.org/packages/9e/87/2ac1fce0eb1e616fcd3c35caa23e665e9b1948bb984f4764790924594128/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:5b233ea3e165e43e35dba1d2b8ecc21cf070b45b65ae17dd2747d2713d942021", size = 2423018, upload-time = "2026-03-09T13:14:30.018Z" }, { url = "https://files.pythonhosted.org/packages/67/13/c6700ccc6cc218716bfcda4935e4b2997039869b4ad8a94f364c5a3b8e63/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:ce9bf03dad3b46408c08649c6fbd6ca28a9fce0eb32fdfffa6775a13103b5310", size = 2062804, upload-time = "2026-03-09T13:14:32.888Z" }, { url = "https://files.pythonhosted.org/packages/1b/bd/877056304626943ff0f1f44c08f584300c199b887cb3176cd7e34f1515f1/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:fc4d3f1fb9ca0ae9f97b095963bc6326f1dbfd3779d6679a1e016b9baaa153d3", size = 2597482, upload-time = "2026-03-09T13:14:34.971Z" }, { url = "https://files.pythonhosted.org/packages/75/19/c60626c47bf0f8ac5dcf72c6c98e266d714f2fbbfd50cf6dab5ede3aaa50/kiwisolver-1.5.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f443b4825c50a51ee68585522ab4a1d1257fac65896f282b4c6763337ac9f5d2", size = 2394328, upload-time = "2026-03-09T13:14:36.816Z" }, { url = "https://files.pythonhosted.org/packages/47/84/6a6d5e5bb8273756c27b7d810d47f7ef2f1f9b9fd23c9ee9a3f8c75c9cef/kiwisolver-1.5.0-cp313-cp313t-win_arm64.whl", hash = "sha256:893ff3a711d1b515ba9da14ee090519bad4610ed1962fbe298a434e8c5f8db53", size = 68410, upload-time = "2026-03-09T13:14:38.695Z" }, { url = "https://files.pythonhosted.org/packages/e4/d7/060f45052f2a01ad5762c8fdecd6d7a752b43400dc29ff75cd47225a40fd/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8df31fe574b8b3993cc61764f40941111b25c2d9fea13d3ce24a49907cd2d615", size = 123231, upload-time = "2026-03-09T13:14:41.323Z" }, { url = "https://files.pythonhosted.org/packages/c2/a7/78da680eadd06ff35edef6ef68a1ad273bad3e2a0936c9a885103230aece/kiwisolver-1.5.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:1d49a49ac4cbfb7c1375301cd1ec90169dfeae55ff84710d782260ce77a75a02", size = 66489, upload-time = "2026-03-09T13:14:42.534Z" }, { url = "https://files.pythonhosted.org/packages/49/b2/97980f3ad4fae37dd7fe31626e2bf75fbf8bdf5d303950ec1fab39a12da8/kiwisolver-1.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0cbe94b69b819209a62cb27bdfa5dc2a8977d8de2f89dfd97ba4f53ed3af754e", size = 64063, upload-time = "2026-03-09T13:14:44.759Z" }, { url = "https://files.pythonhosted.org/packages/e7/f9/b06c934a6aa8bc91f566bd2a214fd04c30506c2d9e2b6b171953216a65b6/kiwisolver-1.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:80aa065ffd378ff784822a6d7c3212f2d5f5e9c3589614b5c228b311fd3063ac", size = 1475913, upload-time = "2026-03-09T13:14:46.247Z" }, { url = "https://files.pythonhosted.org/packages/6b/f0/f768ae564a710135630672981231320bc403cf9152b5596ec5289de0f106/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e7f886f47ab881692f278ae901039a234e4025a68e6dfab514263a0b1c4ae05", size = 1282782, upload-time = "2026-03-09T13:14:48.458Z" }, { url = "https://files.pythonhosted.org/packages/e2/9f/1de7aad00697325f05238a5f2eafbd487fb637cc27a558b5367a5f37fb7f/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5060731cc3ed12ca3a8b57acd4aeca5bbc2f49216dd0bec1650a1acd89486bcd", size = 1300815, upload-time = "2026-03-09T13:14:50.721Z" }, { url = "https://files.pythonhosted.org/packages/5a/c2/297f25141d2e468e0ce7f7a7b92e0cf8918143a0cbd3422c1ad627e85a06/kiwisolver-1.5.0-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a4aa69609f40fce3cbc3f87b2061f042eee32f94b8f11db707b66a26461591a", size = 1347925, upload-time = "2026-03-09T13:14:52.304Z" }, { url = "https://files.pythonhosted.org/packages/b9/d3/f4c73a02eb41520c47610207b21afa8cdd18fdbf64ffd94674ae21c4812d/kiwisolver-1.5.0-cp314-cp314-manylinux_2_39_riscv64.whl", hash = "sha256:d168fda2dbff7b9b5f38e693182d792a938c31db4dac3a80a4888de603c99554", size = 991322, upload-time = "2026-03-09T13:14:54.637Z" }, { url = "https://files.pythonhosted.org/packages/7b/46/d3f2efef7732fcda98d22bf4ad5d3d71d545167a852ca710a494f4c15343/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:413b820229730d358efd838ecbab79902fe97094565fdc80ddb6b0a18c18a581", size = 2232857, upload-time = "2026-03-09T13:14:56.471Z" }, { url = "https://files.pythonhosted.org/packages/3f/ec/2d9756bf2b6d26ae4349b8d3662fb3993f16d80c1f971c179ce862b9dbae/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5124d1ea754509b09e53738ec185584cc609aae4a3b510aaf4ed6aa047ef9303", size = 2329376, upload-time = "2026-03-09T13:14:58.072Z" }, { url = "https://files.pythonhosted.org/packages/8f/9f/876a0a0f2260f1bde92e002b3019a5fabc35e0939c7d945e0fa66185eb20/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e4415a8db000bf49a6dd1c478bf70062eaacff0f462b92b0ba68791a905861f9", size = 1982549, upload-time = "2026-03-09T13:14:59.668Z" }, { url = "https://files.pythonhosted.org/packages/6c/4f/ba3624dfac23a64d54ac4179832860cb537c1b0af06024936e82ca4154a0/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d618fd27420381a4f6044faa71f46d8bfd911bd077c555f7138ed88729bfbe79", size = 2494680, upload-time = "2026-03-09T13:15:01.364Z" }, { url = "https://files.pythonhosted.org/packages/39/b7/97716b190ab98911b20d10bf92eca469121ec483b8ce0edd314f51bc85af/kiwisolver-1.5.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5092eb5b1172947f57d6ea7d89b2f29650414e4293c47707eb499ec07a0ac796", size = 2297905, upload-time = "2026-03-09T13:15:03.925Z" }, { url = "https://files.pythonhosted.org/packages/a3/36/4e551e8aa55c9188bca9abb5096805edbf7431072b76e2298e34fd3a3008/kiwisolver-1.5.0-cp314-cp314-win_amd64.whl", hash = "sha256:d76e2d8c75051d58177e762164d2e9ab92886534e3a12e795f103524f221dd8e", size = 75086, upload-time = "2026-03-09T13:15:07.775Z" }, { url = "https://files.pythonhosted.org/packages/70/15/9b90f7df0e31a003c71649cf66ef61c3c1b862f48c81007fa2383c8bd8d7/kiwisolver-1.5.0-cp314-cp314-win_arm64.whl", hash = "sha256:fa6248cd194edff41d7ea9425ced8ca3a6f838bfb295f6f1d6e6bb694a8518df", size = 66577, upload-time = "2026-03-09T13:15:09.139Z" }, { url = "https://files.pythonhosted.org/packages/17/01/7dc8c5443ff42b38e72731643ed7cf1ed9bf01691ae5cdca98501999ed83/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:d1ffeb80b5676463d7a7d56acbe8e37a20ce725570e09549fe738e02ca6b7e1e", size = 125794, upload-time = "2026-03-09T13:15:10.525Z" }, { url = "https://files.pythonhosted.org/packages/46/8a/b4ebe46ebaac6a303417fab10c2e165c557ddaff558f9699d302b256bc53/kiwisolver-1.5.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:bc4d8e252f532ab46a1de9349e2d27b91fce46736a9eedaa37beaca66f574ed4", size = 67646, upload-time = "2026-03-09T13:15:12.016Z" }, { url = "https://files.pythonhosted.org/packages/60/35/10a844afc5f19d6f567359bf4789e26661755a2f36200d5d1ed8ad0126e5/kiwisolver-1.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6783e069732715ad0c3ce96dbf21dbc2235ab0593f2baf6338101f70371f4028", size = 65511, upload-time = "2026-03-09T13:15:13.311Z" }, { url = "https://files.pythonhosted.org/packages/f8/8a/685b297052dd041dcebce8e8787b58923b6e78acc6115a0dc9189011c44b/kiwisolver-1.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e7c4c09a490dc4d4a7f8cbee56c606a320f9dc28cf92a7157a39d1ce7676a657", size = 1584858, upload-time = "2026-03-09T13:15:15.103Z" }, { url = "https://files.pythonhosted.org/packages/9e/80/04865e3d4638ac5bddec28908916df4a3075b8c6cc101786a96803188b96/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a075bd7bd19c70cf67c8badfa36cf7c5d8de3c9ddb8420c51e10d9c50e94920", size = 1392539, upload-time = "2026-03-09T13:15:16.661Z" }, { url = "https://files.pythonhosted.org/packages/ba/01/77a19cacc0893fa13fafa46d1bba06fb4dc2360b3292baf4b56d8e067b24/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bdd3e53429ff02aa319ba59dfe4ceeec345bf46cf180ec2cf6fd5b942e7975e9", size = 1405310, upload-time = "2026-03-09T13:15:18.229Z" }, { url = "https://files.pythonhosted.org/packages/53/39/bcaf5d0cca50e604cfa9b4e3ae1d64b50ca1ae5b754122396084599ef903/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cdcb35dc9d807259c981a85531048ede628eabcffb3239adf3d17463518992d", size = 1456244, upload-time = "2026-03-09T13:15:20.444Z" }, { url = "https://files.pythonhosted.org/packages/d0/7a/72c187abc6975f6978c3e39b7cf67aeb8b3c0a8f9790aa7fd412855e9e1f/kiwisolver-1.5.0-cp314-cp314t-manylinux_2_39_riscv64.whl", hash = "sha256:70d593af6a6ca332d1df73d519fddb5148edb15cd90d5f0155e3746a6d4fcc65", size = 1073154, upload-time = "2026-03-09T13:15:22.039Z" }, { url = "https://files.pythonhosted.org/packages/c7/ca/cf5b25783ebbd59143b4371ed0c8428a278abe68d6d0104b01865b1bbd0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:377815a8616074cabbf3f53354e1d040c35815a134e01d7614b7692e4bf8acfa", size = 2334377, upload-time = "2026-03-09T13:15:23.741Z" }, { url = "https://files.pythonhosted.org/packages/4a/e5/b1f492adc516796e88751282276745340e2a72dcd0d36cf7173e0daf3210/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0255a027391d52944eae1dbb5d4cc5903f57092f3674e8e544cdd2622826b3f0", size = 2425288, upload-time = "2026-03-09T13:15:25.789Z" }, { url = "https://files.pythonhosted.org/packages/e6/e5/9b21fbe91a61b8f409d74a26498706e97a48008bfcd1864373d32a6ba31c/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:012b1eb16e28718fa782b5e61dc6f2da1f0792ca73bd05d54de6cb9561665fc9", size = 2063158, upload-time = "2026-03-09T13:15:27.63Z" }, { url = "https://files.pythonhosted.org/packages/b1/02/83f47986138310f95ea95531f851b2a62227c11cbc3e690ae1374fe49f0f/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0e3aafb33aed7479377e5e9a82e9d4bf87063741fc99fc7ae48b0f16e32bdd6f", size = 2597260, upload-time = "2026-03-09T13:15:29.421Z" }, { url = "https://files.pythonhosted.org/packages/07/18/43a5f24608d8c313dd189cf838c8e68d75b115567c6279de7796197cfb6a/kiwisolver-1.5.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7a116ae737f0000343218c4edf5bd45893bfeaff0993c0b215d7124c9f77646", size = 2394403, upload-time = "2026-03-09T13:15:31.517Z" }, { url = "https://files.pythonhosted.org/packages/3b/b5/98222136d839b8afabcaa943b09bd05888c2d36355b7e448550211d1fca4/kiwisolver-1.5.0-cp314-cp314t-win_amd64.whl", hash = "sha256:1dd9b0b119a350976a6d781e7278ec7aca0b201e1a9e2d23d9804afecb6ca681", size = 79687, upload-time = "2026-03-09T13:15:33.204Z" }, { url = "https://files.pythonhosted.org/packages/99/a2/ca7dc962848040befed12732dff6acae7fb3c4f6fc4272b3f6c9a30b8713/kiwisolver-1.5.0-cp314-cp314t-win_arm64.whl", hash = "sha256:58f812017cd2985c21fbffb4864d59174d4903dd66fa23815e74bbc7a0e2dd57", size = 70032, upload-time = "2026-03-09T13:15:34.411Z" }, { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, { url = "https://files.pythonhosted.org/packages/17/6f/6fd4f690a40c2582fa34b97d2678f718acf3706b91d270c65ecb455d0a06/kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:295d9ffe712caa9f8a3081de8d32fc60191b4b51c76f02f951fd8407253528f4", size = 59606, upload-time = "2026-03-09T13:15:40.81Z" }, { url = "https://files.pythonhosted.org/packages/82/a0/2355d5e3b338f13ce63f361abb181e3b6ea5fffdb73f739b3e80efa76159/kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:51e8c4084897de9f05898c2c2a39af6318044ae969d46ff7a34ed3f96274adca", size = 57537, upload-time = "2026-03-09T13:15:42.071Z" }, { url = "https://files.pythonhosted.org/packages/c8/b9/1d50e610ecadebe205b71d6728fd224ce0e0ca6aba7b9cbe1da049203ac5/kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b83af57bdddef03c01a9138034c6ff03181a3028d9a1003b301eb1a55e161a3f", size = 79888, upload-time = "2026-03-09T13:15:43.317Z" }, { url = "https://files.pythonhosted.org/packages/cd/ee/b85ffcd75afed0357d74f0e6fc02a4507da441165de1ca4760b9f496390d/kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf4679a3d71012a7c2bf360e5cd878fbd5e4fcac0896b56393dec239d81529ed", size = 77584, upload-time = "2026-03-09T13:15:44.605Z" }, { url = "https://files.pythonhosted.org/packages/6b/dd/644d0dde6010a8583b4cd66dd41c5f83f5325464d15c4f490b3340ab73b4/kiwisolver-1.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:41024ed50e44ab1a60d3fe0a9d15a4ccc9f5f2b1d814ff283c8d01134d5b81bc", size = 73390, upload-time = "2026-03-09T13:15:45.832Z" }, { url = "https://files.pythonhosted.org/packages/e9/eb/5fcbbbf9a0e2c3a35effb88831a483345326bbc3a030a3b5b69aee647f84/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232", size = 59532, upload-time = "2026-03-09T13:15:47.047Z" }, { url = "https://files.pythonhosted.org/packages/c3/9b/e17104555bb4db148fd52327feea1e96be4b88e8e008b029002c281a21ab/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a", size = 57420, upload-time = "2026-03-09T13:15:48.199Z" }, { url = "https://files.pythonhosted.org/packages/48/44/2b5b95b7aa39fb2d8d9d956e0f3d5d45aef2ae1d942d4c3ffac2f9cfed1a/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737", size = 79892, upload-time = "2026-03-09T13:15:49.694Z" }, { url = "https://files.pythonhosted.org/packages/52/7d/7157f9bba6b455cfb4632ed411e199fc8b8977642c2b12082e1bd9e6d173/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16", size = 77603, upload-time = "2026-03-09T13:15:50.945Z" }, { url = "https://files.pythonhosted.org/packages/0a/dd/8050c947d435c8d4bc94e3252f4d8bb8a76cfb424f043a8680be637a57f1/kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1", size = 73558, upload-time = "2026-03-09T13:15:52.112Z" }, ] [[package]] name = "markdown" version = "3.10.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, ] [[package]] name = "markdown-it-py" version = "4.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mdurl" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, ] [[package]] name = "markupsafe" version = "3.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, ] [[package]] name = "matplotlib" version = "3.10.9" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "cycler" }, { name = "fonttools" }, { name = "kiwisolver" }, { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, { name = "numpy", version = "2.4.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "pillow" }, { name = "pyparsing" }, { name = "python-dateutil" }, ] sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233, upload-time = "2026-04-24T00:14:13.539Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/18/6f/340b04986e67aac6f66c5145ce68bf72c64bed30f92c8913499a6e6b8f99/matplotlib-3.10.9-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77210dce9cb8153dffc967efaae990543392563d5a376d4dd8539bebcb0ed217", size = 8296625, upload-time = "2026-04-24T00:11:43.376Z" }, { url = "https://files.pythonhosted.org/packages/bb/2f/127081eb83162053ebb9678ceac64220b93a663e0167432566e9c7c82aab/matplotlib-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1e7698ac9868428e84d2c967424803b2472ff7167d9d6590d4204ed775343c3b", size = 8188790, upload-time = "2026-04-24T00:11:46.556Z" }, { url = "https://files.pythonhosted.org/packages/fc/b7/d8bcec2626c35f96972bff656299fef4578113ea6193c8fdad324710410c/matplotlib-3.10.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1aa972116abb4c9d201bf245620b433726cb6856f3bef6a78f776a00f5c92d37", size = 8769389, upload-time = "2026-04-24T00:11:48.959Z" }, { url = "https://files.pythonhosted.org/packages/12/49/b78e214a527ea732033b7f4d37f7afb504d74ba9d134bd47938230dfb8b1/matplotlib-3.10.9-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae2f11957b27ce53497dd4d7b235c4d4f1faf383dfb39d0c5beb833bff883294", size = 9589657, upload-time = "2026-04-24T00:11:51.915Z" }, { url = "https://files.pythonhosted.org/packages/5f/15/5246f7b43beae19c74dfee651d58d6cc8112e06f77adb4e88cc04f2e3a23/matplotlib-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b049278ddce116aaa1c1377ebf58adea909132dfce0281cf7e3a1ea9fc2e2c65", size = 9651983, upload-time = "2026-04-24T00:11:54.766Z" }, { url = "https://files.pythonhosted.org/packages/75/77/5acecfe672ba0fa1b8c0454f69ce155d1e6fc5852fa7206bf9afaf767121/matplotlib-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:82834c3c292d24d3a8aae77cd2d20019de69d692a34a970e4fdb8d33e2ea3dda", size = 8199701, upload-time = "2026-04-24T00:11:58.389Z" }, { url = "https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb", size = 8306860, upload-time = "2026-04-24T00:12:01.207Z" }, { url = "https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb", size = 8199254, upload-time = "2026-04-24T00:12:04.239Z" }, { url = "https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb", size = 8777092, upload-time = "2026-04-24T00:12:06.793Z" }, { url = "https://files.pythonhosted.org/packages/55/fa/3ce7adfe9ba101748f465211660d9c6374c876b671bdb8c2bb6d347e8b94/matplotlib-3.10.9-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9", size = 9595691, upload-time = "2026-04-24T00:12:09.706Z" }, { url = "https://files.pythonhosted.org/packages/36/c4/6960a76686ed668f2c60f84e9799ba4c0d56abdb36b1577b60c1d061d1ec/matplotlib-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb", size = 9659771, upload-time = "2026-04-24T00:12:12.766Z" }, { url = "https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f", size = 8205112, upload-time = "2026-04-24T00:12:15.773Z" }, { url = "https://files.pythonhosted.org/packages/e2/ee/cb57ad4754f3e7b9174ce6ce66d9205fb827067e48a9f58ac09d7e7d6b77/matplotlib-3.10.9-cp311-cp311-win_arm64.whl", hash = "sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80", size = 8132310, upload-time = "2026-04-24T00:12:18.645Z" }, { url = "https://files.pythonhosted.org/packages/35/c6/5581e26c72233ebb2a2a6fed2d24fb7c66b4700120b813f51b0555acf0b6/matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1", size = 8319908, upload-time = "2026-04-24T00:12:21.323Z" }, { url = "https://files.pythonhosted.org/packages/b7/18/4880dd762e40cd360c1bf06e890c5a97b997e91cb324602b1a19950ad5ce/matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320", size = 8216016, upload-time = "2026-04-24T00:12:23.4Z" }, { url = "https://files.pythonhosted.org/packages/32/91/d024616abdba99e83120e07a20658976f6a343646710760c4a51df126029/matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285", size = 8789336, upload-time = "2026-04-24T00:12:26.096Z" }, { url = "https://files.pythonhosted.org/packages/5c/04/030a2f61ef2158f5e4c259487a92ac877732499fb33d871585d89e03c42d/matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2", size = 9604602, upload-time = "2026-04-24T00:12:29.052Z" }, { url = "https://files.pythonhosted.org/packages/fc/c2/541e4d09d87bb6b5830fc28b4c887a9a8cf4e1c6cee698a8c05552ae2003/matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf", size = 9670966, upload-time = "2026-04-24T00:12:32.131Z" }, { url = "https://files.pythonhosted.org/packages/04/a1/4571fc46e7702de8d0c2dc54ad1b2f8e29328dea3ee90831181f7353d93c/matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6", size = 8217462, upload-time = "2026-04-24T00:12:35.226Z" }, { url = "https://files.pythonhosted.org/packages/4b/d0/2269edb12aa30c13c8bcc9382892e39943ce1d28aab4ec296e0381798e81/matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42", size = 8136688, upload-time = "2026-04-24T00:12:37.442Z" }, { url = "https://files.pythonhosted.org/packages/aa/d3/8d4f6afbecb49fc04e060a57c0fce39ea51cc163a6bd87303ccd698e4fa6/matplotlib-3.10.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f", size = 8320331, upload-time = "2026-04-24T00:12:39.688Z" }, { url = "https://files.pythonhosted.org/packages/63/d9/9e14bc7564bf92d5ffa801ae5fac819ce74b925dfb55e3ebde61a3bbad3e/matplotlib-3.10.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e", size = 8216461, upload-time = "2026-04-24T00:12:42.494Z" }, { url = "https://files.pythonhosted.org/packages/8a/17/4402d0d14ccf1dfc70932600b68097fbbf9c898a4871d2cbbe79c7801a32/matplotlib-3.10.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f", size = 8790091, upload-time = "2026-04-24T00:12:44.789Z" }, { url = "https://files.pythonhosted.org/packages/3e/0b/322aeec06dd9b91411f92028b37d447342770a24392aa4813e317064dad5/matplotlib-3.10.9-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838", size = 9605027, upload-time = "2026-04-24T00:12:47.583Z" }, { url = "https://files.pythonhosted.org/packages/74/88/5f13482f55e7b00bcfc09838b093c2456e1379978d2a146844aae05350ad/matplotlib-3.10.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2", size = 9671269, upload-time = "2026-04-24T00:12:50.878Z" }, { url = "https://files.pythonhosted.org/packages/c5/e0/0840fd2f93da988ec660b8ad1984abe9f25d2aed22a5e394ff1c68c88307/matplotlib-3.10.9-cp313-cp313-win_amd64.whl", hash = "sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921", size = 8217588, upload-time = "2026-04-24T00:12:53.784Z" }, { url = "https://files.pythonhosted.org/packages/47/b9/d706d06dd605c49b9f83a2aed8c13e3e5db70697d7a80b7e3d7915de6b17/matplotlib-3.10.9-cp313-cp313-win_arm64.whl", hash = "sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8", size = 8136913, upload-time = "2026-04-24T00:12:56.501Z" }, { url = "https://files.pythonhosted.org/packages/9b/45/6e32d96978264c8ca8c4b1010adb955a1a49cfaf314e212bbc8908f04a61/matplotlib-3.10.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9", size = 8368019, upload-time = "2026-04-24T00:12:58.896Z" }, { url = "https://files.pythonhosted.org/packages/86/0a/c8e3d3bba245f0f7fc424937f8ff7ef77291a36af3edb97ccd78aa93d84f/matplotlib-3.10.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4", size = 8264645, upload-time = "2026-04-24T00:13:01.406Z" }, { url = "https://files.pythonhosted.org/packages/3d/aa/5bf5a14fe4fed73a4209a155606f8096ff797aad89c6c35179026571133e/matplotlib-3.10.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc", size = 8802194, upload-time = "2026-04-24T00:13:03.702Z" }, { url = "https://files.pythonhosted.org/packages/dd/5e/b4be852d6bba6fd15893fadf91ff26ae49cb91aac789e95dde9d342e664f/matplotlib-3.10.9-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99", size = 9622684, upload-time = "2026-04-24T00:13:06.647Z" }, { url = "https://files.pythonhosted.org/packages/4c/3d/ed428c971139112ef730f62770654d609467346d09d4b62617e1afd68a5a/matplotlib-3.10.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d", size = 9680790, upload-time = "2026-04-24T00:13:10.009Z" }, { url = "https://files.pythonhosted.org/packages/e7/09/052e884aaf2b985c63cb79f715f1d5b6a3eaa7de78f6a52b9dbc077d5b53/matplotlib-3.10.9-cp313-cp313t-win_amd64.whl", hash = "sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8", size = 8287571, upload-time = "2026-04-24T00:13:13.087Z" }, { url = "https://files.pythonhosted.org/packages/f4/38/ae27288e788c35a4250491422f3db7750366fc8c97d6f36fbdecfc1f5518/matplotlib-3.10.9-cp313-cp313t-win_arm64.whl", hash = "sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38", size = 8188292, upload-time = "2026-04-24T00:13:15.546Z" }, { url = "https://files.pythonhosted.org/packages/d6/e6/3bd8afd04949f02eabc1c17115ea5255e19cacd4d06fc5abdde4eeb0052c/matplotlib-3.10.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d", size = 8321276, upload-time = "2026-04-24T00:13:18.318Z" }, { url = "https://files.pythonhosted.org/packages/41/86/86231232fff41c9f8e4a1a7d7a597d349a02527109c3af7d618366122139/matplotlib-3.10.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f", size = 8218218, upload-time = "2026-04-24T00:13:20.974Z" }, { url = "https://files.pythonhosted.org/packages/85/8f/becc9722cafc64f5d2eb0b7c1bf5f585271c618a45dbd8fabeb021f898b6/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b", size = 9608145, upload-time = "2026-04-24T00:13:23.228Z" }, { url = "https://files.pythonhosted.org/packages/32/5d/f7e914f7d9325abff4057cee62c0fa70263683189f774473cbfb534cd13b/matplotlib-3.10.9-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2", size = 9885085, upload-time = "2026-04-24T00:13:25.849Z" }, { url = "https://files.pythonhosted.org/packages/a5/fd/fa69f2221534e80cc5772ac2b7d222011a2acafc2ec7216d5dd174c864ae/matplotlib-3.10.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716", size = 9672358, upload-time = "2026-04-24T00:13:28.906Z" }, { url = "https://files.pythonhosted.org/packages/ab/1a/5a4f747a8b271cbb024946d2dd3c913ab5032ba430626f8c3528ada96b4b/matplotlib-3.10.9-cp314-cp314-win_amd64.whl", hash = "sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f", size = 8349970, upload-time = "2026-04-24T00:13:31.904Z" }, { url = "https://files.pythonhosted.org/packages/64/dc/95d60ecaefe30680a154b52ea96ab4b0dab547f1fd6aa12f5fb655e89cae/matplotlib-3.10.9-cp314-cp314-win_arm64.whl", hash = "sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456", size = 8272785, upload-time = "2026-04-24T00:13:34.511Z" }, { url = "https://files.pythonhosted.org/packages/70/a0/005d68bc8b8418300ce6591f18586910a8526806e2ab663933d9f20a41e9/matplotlib-3.10.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe", size = 8367999, upload-time = "2026-04-24T00:13:36.962Z" }, { url = "https://files.pythonhosted.org/packages/22/05/1236cc9290be70b2498af20ca348add76e3fffe7f67b477db5133a84f3ea/matplotlib-3.10.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6", size = 8264543, upload-time = "2026-04-24T00:13:39.851Z" }, { url = "https://files.pythonhosted.org/packages/cd/c2/071f5a5ff6c5bd63aaaf2f45c811d9bf2ced94bde188d9e1a519e21d0cba/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c", size = 9622800, upload-time = "2026-04-24T00:13:42.296Z" }, { url = "https://files.pythonhosted.org/packages/95/57/da7d1f10a85624b9e7db68e069dd94e58dc41dbf9463c5921632ecbe3661/matplotlib-3.10.9-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4", size = 9888561, upload-time = "2026-04-24T00:13:45.026Z" }, { url = "https://files.pythonhosted.org/packages/67/b2/ef8d6bb59b0edb6c16c968b70f548aa13b54348972def5aa6ac85df67145/matplotlib-3.10.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf", size = 9680884, upload-time = "2026-04-24T00:13:48.066Z" }, { url = "https://files.pythonhosted.org/packages/61/1c/d21bfeb9931881ebe96bcfcff27c7ae4b160ae0ec291a714c42641a56d75/matplotlib-3.10.9-cp314-cp314t-win_amd64.whl", hash = "sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39", size = 8432333, upload-time = "2026-04-24T00:13:51.008Z" }, { url = "https://files.pythonhosted.org/packages/78/23/92493c3e6e1b635ccfff146f7b99e674808787915420373ac399283764c2/matplotlib-3.10.9-cp314-cp314t-win_arm64.whl", hash = "sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c", size = 8324785, upload-time = "2026-04-24T00:13:53.633Z" }, { url = "https://files.pythonhosted.org/packages/2c/2b/0e92ad0ac446633f928a1563db4aa8add407e1924faf0ded5b95b35afb27/matplotlib-3.10.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1872fb212a05b729e649754a72d5da61d03e0554d76e80303b6f83d1d2c0552b", size = 8293058, upload-time = "2026-04-24T00:13:56.339Z" }, { url = "https://files.pythonhosted.org/packages/4b/23/74682fd369f5299ceda438fea2a0662e6383b85c9383fb9cdfcf04713e07/matplotlib-3.10.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:985f2238880e2e69093f588f5fe2e46771747febf0649f3cf7f7b7480875317f", size = 8186627, upload-time = "2026-04-24T00:13:58.623Z" }, { url = "https://files.pythonhosted.org/packages/ca/e8/368aab88f3c4cd8992800f31abfe0670c3e47540ba20a97e9fdbcde594b3/matplotlib-3.10.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6640f75af2c6148293caa0a2b39dd806a492dd66c8a8b04035813e33d0fd2585", size = 8764117, upload-time = "2026-04-24T00:14:01.684Z" }, { url = "https://files.pythonhosted.org/packages/63/e2/9f66ca6a651a52abfe0d4964ce01439ed34f3f1e119de10ff3a07f403043/matplotlib-3.10.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20", size = 8304420, upload-time = "2026-04-24T00:14:04.57Z" }, { url = "https://files.pythonhosted.org/packages/e8/e8/467c03568218792906aa87b5e7bb379b605e056ed0c74fe00c051786d925/matplotlib-3.10.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba", size = 8197981, upload-time = "2026-04-24T00:14:07.233Z" }, { url = "https://files.pythonhosted.org/packages/6f/87/afead29192170917537934c6aff4b008c805fff7b1ccea0c79120d96beda/matplotlib-3.10.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4", size = 8774002, upload-time = "2026-04-24T00:14:09.816Z" }, ] [[package]] name = "mdurl" version = "0.1.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, ] [[package]] name = "mergedeep" version = "1.3.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, ] [[package]] name = "mistune" version = "3.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ca/84/620cc3f7e3adf6f5067e10f4dbae71295d8f9e16d5d3f9ef97c40f2f592c/mistune-3.2.1.tar.gz", hash = "sha256:7c8e5501d38bac1582e067e46c8343f17d57ea1aaa735823f3aba1fd59c88a28", size = 98003, upload-time = "2026-05-03T14:33:22.312Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2a/7f/a946aa4f8752b37102b41e64dca18a1976ac705c3a0d1dfe74d820a02552/mistune-3.2.1-py3-none-any.whl", hash = "sha256:78cdb0ba5e938053ccf63651b352508d2efa9411dc8810bfb05f2dc5140c0048", size = 53749, upload-time = "2026-05-03T14:33:20.551Z" }, ] [[package]] name = "mkdocs" version = "1.6.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "ghp-import" }, { name = "jinja2" }, { name = "markdown" }, { name = "markupsafe" }, { name = "mergedeep" }, { name = "mkdocs-get-deps" }, { name = "packaging" }, { name = "pathspec" }, { name = "pyyaml" }, { name = "pyyaml-env-tag" }, { name = "watchdog" }, ] sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, ] [[package]] name = "mkdocs-autorefs" version = "1.4.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "markupsafe" }, { name = "mkdocs" }, ] sdist = { url = "https://files.pythonhosted.org/packages/52/c0/f641843de3f612a6b48253f39244165acff36657a91cc903633d456ae1ac/mkdocs_autorefs-1.4.4.tar.gz", hash = "sha256:d54a284f27a7346b9c38f1f852177940c222da508e66edc816a0fa55fc6da197", size = 56588, upload-time = "2026-02-10T15:23:55.105Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl", hash = "sha256:834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089", size = 25530, upload-time = "2026-02-10T15:23:53.817Z" }, ] [[package]] name = "mkdocs-get-deps" version = "0.2.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mergedeep" }, { name = "platformdirs" }, { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/ce/25/b3cccb187655b9393572bde9b09261d267c3bf2f2cdabe347673be5976a6/mkdocs_get_deps-0.2.2.tar.gz", hash = "sha256:8ee8d5f316cdbbb2834bc1df6e69c08fe769a83e040060de26d3c19fad3599a1", size = 11047, upload-time = "2026-03-10T02:46:33.632Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/88/29/744136411e785c4b0b744d5413e56555265939ab3a104c6a4b719dad33fd/mkdocs_get_deps-0.2.2-py3-none-any.whl", hash = "sha256:e7878cbeac04860b8b5e0ca31d3abad3df9411a75a32cde82f8e44b6c16ff650", size = 9555, upload-time = "2026-03-10T02:46:32.256Z" }, ] [[package]] name = "mkdocstrings" version = "1.0.4" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "jinja2" }, { name = "markdown" }, { name = "markupsafe" }, { name = "mkdocs" }, { name = "mkdocs-autorefs" }, { name = "pymdown-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1d/5d/f888d4d3eb31359b327bc9b17a212d6ef03fe0b0682fbb3fc2cb849fb12b/mkdocstrings-1.0.4.tar.gz", hash = "sha256:3969a6515b77db65fd097b53c1b7aa4ae840bd71a2ee62a6a3e89503446d7172", size = 100088, upload-time = "2026-04-15T09:16:53.376Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/6e/94/be70f8ee9c45f2f62b39a1f0e9303bc20e138a8f3b8e50ffd89498e177e1/mkdocstrings-1.0.4-py3-none-any.whl", hash = "sha256:63464b4b29053514f32a1dbbf604e52876d5e638111b0c295ab7ed3cac73ca9b", size = 35560, upload-time = "2026-04-15T09:16:51.436Z" }, ] [package.optional-dependencies] python = [ { name = "mkdocstrings-python" }, ] [[package]] name = "mkdocstrings-python" version = "2.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "griffelib" }, { name = "mkdocs-autorefs" }, { name = "mkdocstrings" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/29/33/c225eaf898634bdda489a6766fc35d1683c640bffe0e0acd10646b13536d/mkdocstrings_python-2.0.3.tar.gz", hash = "sha256:c518632751cc869439b31c9d3177678ad2bfa5c21b79b863956ad68fc92c13b8", size = 199083, upload-time = "2026-02-20T10:38:36.368Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl", hash = "sha256:0b83513478bdfd803ff05aa43e9b1fca9dd22bcd9471f09ca6257f009bc5ee12", size = 104779, upload-time = "2026-02-20T10:38:34.517Z" }, ] [[package]] name = "more-itertools" version = "11.0.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/f7/139d22fef48ac78127d18e01d80cf1be40236ae489769d17f35c3d425293/more_itertools-11.0.2.tar.gz", hash = "sha256:392a9e1e362cbc106a2457d37cabf9b36e5e12efd4ebff1654630e76597df804", size = 144659, upload-time = "2026-04-09T15:01:33.297Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/cb/98/6af411189d9413534c3eb691182bff1f5c6d44ed2f93f2edfe52a1bbceb8/more_itertools-11.0.2-py3-none-any.whl", hash = "sha256:6e35b35f818b01f691643c6c611bc0902f2e92b46c18fffa77ae1e7c46e912e4", size = 71939, upload-time = "2026-04-09T15:01:32.21Z" }, ] [[package]] name = "multidict" version = "6.7.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/84/0b/19348d4c98980c4851d2f943f8ebafdece2ae7ef737adcfa5994ce8e5f10/multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5", size = 77176, upload-time = "2026-01-26T02:42:59.784Z" }, { url = "https://files.pythonhosted.org/packages/ef/04/9de3f8077852e3d438215c81e9b691244532d2e05b4270e89ce67b7d103c/multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8", size = 44996, upload-time = "2026-01-26T02:43:01.674Z" }, { url = "https://files.pythonhosted.org/packages/31/5c/08c7f7fe311f32e83f7621cd3f99d805f45519cd06fafb247628b861da7d/multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872", size = 44631, upload-time = "2026-01-26T02:43:03.169Z" }, { url = "https://files.pythonhosted.org/packages/b7/7f/0e3b1390ae772f27501199996b94b52ceeb64fe6f9120a32c6c3f6b781be/multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991", size = 242561, upload-time = "2026-01-26T02:43:04.733Z" }, { url = "https://files.pythonhosted.org/packages/dd/f4/8719f4f167586af317b69dd3e90f913416c91ca610cac79a45c53f590312/multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03", size = 242223, upload-time = "2026-01-26T02:43:06.695Z" }, { url = "https://files.pythonhosted.org/packages/47/ab/7c36164cce64a6ad19c6d9a85377b7178ecf3b89f8fd589c73381a5eedfd/multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981", size = 222322, upload-time = "2026-01-26T02:43:08.472Z" }, { url = "https://files.pythonhosted.org/packages/f5/79/a25add6fb38035b5337bc5734f296d9afc99163403bbcf56d4170f97eb62/multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6", size = 254005, upload-time = "2026-01-26T02:43:10.127Z" }, { url = "https://files.pythonhosted.org/packages/4a/7b/64a87cf98e12f756fc8bd444b001232ffff2be37288f018ad0d3f0aae931/multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190", size = 251173, upload-time = "2026-01-26T02:43:11.731Z" }, { url = "https://files.pythonhosted.org/packages/4b/ac/b605473de2bb404e742f2cc3583d12aedb2352a70e49ae8fce455b50c5aa/multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92", size = 243273, upload-time = "2026-01-26T02:43:13.063Z" }, { url = "https://files.pythonhosted.org/packages/03/65/11492d6a0e259783720f3bc1d9ea55579a76f1407e31ed44045c99542004/multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee", size = 238956, upload-time = "2026-01-26T02:43:14.843Z" }, { url = "https://files.pythonhosted.org/packages/5f/a7/7ee591302af64e7c196fb63fe856c788993c1372df765102bd0448e7e165/multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2", size = 233477, upload-time = "2026-01-26T02:43:16.025Z" }, { url = "https://files.pythonhosted.org/packages/9c/99/c109962d58756c35fd9992fed7f2355303846ea2ff054bb5f5e9d6b888de/multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568", size = 243615, upload-time = "2026-01-26T02:43:17.84Z" }, { url = "https://files.pythonhosted.org/packages/d5/5f/1973e7c771c86e93dcfe1c9cc55a5481b610f6614acfc28c0d326fe6bfad/multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40", size = 249930, upload-time = "2026-01-26T02:43:19.06Z" }, { url = "https://files.pythonhosted.org/packages/5d/a5/f170fc2268c3243853580203378cd522446b2df632061e0a5409817854c7/multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962", size = 243807, upload-time = "2026-01-26T02:43:20.286Z" }, { url = "https://files.pythonhosted.org/packages/de/01/73856fab6d125e5bc652c3986b90e8699a95e84b48d72f39ade6c0e74a8c/multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505", size = 239103, upload-time = "2026-01-26T02:43:21.508Z" }, { url = "https://files.pythonhosted.org/packages/e7/46/f1220bd9944d8aa40d8ccff100eeeee19b505b857b6f603d6078cb5315b0/multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122", size = 41416, upload-time = "2026-01-26T02:43:22.703Z" }, { url = "https://files.pythonhosted.org/packages/68/00/9b38e272a770303692fc406c36e1a4c740f401522d5787691eb38a8925a8/multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df", size = 46022, upload-time = "2026-01-26T02:43:23.77Z" }, { url = "https://files.pythonhosted.org/packages/64/65/d8d42490c02ee07b6bbe00f7190d70bb4738b3cce7629aaf9f213ef730dd/multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db", size = 43238, upload-time = "2026-01-26T02:43:24.882Z" }, { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" }, { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706, upload-time = "2026-01-26T02:43:27.607Z" }, { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" }, { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355, upload-time = "2026-01-26T02:43:31.165Z" }, { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433, upload-time = "2026-01-26T02:43:32.581Z" }, { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376, upload-time = "2026-01-26T02:43:34.417Z" }, { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365, upload-time = "2026-01-26T02:43:35.741Z" }, { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747, upload-time = "2026-01-26T02:43:36.976Z" }, { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293, upload-time = "2026-01-26T02:43:38.258Z" }, { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962, upload-time = "2026-01-26T02:43:40.034Z" }, { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360, upload-time = "2026-01-26T02:43:41.752Z" }, { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940, upload-time = "2026-01-26T02:43:43.042Z" }, { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502, upload-time = "2026-01-26T02:43:44.371Z" }, { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065, upload-time = "2026-01-26T02:43:45.745Z" }, { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870, upload-time = "2026-01-26T02:43:47.054Z" }, { url = "https://files.pythonhosted.org/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", size = 41302, upload-time = "2026-01-26T02:43:48.753Z" }, { url = "https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", size = 45981, upload-time = "2026-01-26T02:43:49.921Z" }, { url = "https://files.pythonhosted.org/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", size = 43159, upload-time = "2026-01-26T02:43:51.635Z" }, { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, ] [[package]] name = "mypy" version = "1.17.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "mypy-extensions" }, { name = "pathspec" }, { name = "tomli", marker = "python_full_version < '3.11'" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/8e/22/ea637422dedf0bf36f3ef238eab4e455e2a0dcc3082b5cc067615347ab8e/mypy-1.17.1.tar.gz", hash = "sha256:25e01ec741ab5bb3eec8ba9cdb0f769230368a22c959c4937360efb89b7e9f01", size = 3352570, upload-time = "2025-07-31T07:54:19.204Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/77/a9/3d7aa83955617cdf02f94e50aab5c830d205cfa4320cf124ff64acce3a8e/mypy-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3fbe6d5555bf608c47203baa3e72dbc6ec9965b3d7c318aa9a4ca76f465bd972", size = 11003299, upload-time = "2025-07-31T07:54:06.425Z" }, { url = "https://files.pythonhosted.org/packages/83/e8/72e62ff837dd5caaac2b4a5c07ce769c8e808a00a65e5d8f94ea9c6f20ab/mypy-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80ef5c058b7bce08c83cac668158cb7edea692e458d21098c7d3bce35a5d43e7", size = 10125451, upload-time = "2025-07-31T07:53:52.974Z" }, { url = "https://files.pythonhosted.org/packages/7d/10/f3f3543f6448db11881776f26a0ed079865926b0c841818ee22de2c6bbab/mypy-1.17.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a580f8a70c69e4a75587bd925d298434057fe2a428faaf927ffe6e4b9a98df", size = 11916211, upload-time = "2025-07-31T07:53:18.879Z" }, { url = "https://files.pythonhosted.org/packages/06/bf/63e83ed551282d67bb3f7fea2cd5561b08d2bb6eb287c096539feb5ddbc5/mypy-1.17.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd86bb649299f09d987a2eebb4d52d10603224500792e1bee18303bbcc1ce390", size = 12652687, upload-time = "2025-07-31T07:53:30.544Z" }, { url = "https://files.pythonhosted.org/packages/69/66/68f2eeef11facf597143e85b694a161868b3b006a5fbad50e09ea117ef24/mypy-1.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a76906f26bd8d51ea9504966a9c25419f2e668f012e0bdf3da4ea1526c534d94", size = 12896322, upload-time = "2025-07-31T07:53:50.74Z" }, { url = "https://files.pythonhosted.org/packages/a3/87/8e3e9c2c8bd0d7e071a89c71be28ad088aaecbadf0454f46a540bda7bca6/mypy-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:e79311f2d904ccb59787477b7bd5d26f3347789c06fcd7656fa500875290264b", size = 9507962, upload-time = "2025-07-31T07:53:08.431Z" }, { url = "https://files.pythonhosted.org/packages/46/cf/eadc80c4e0a70db1c08921dcc220357ba8ab2faecb4392e3cebeb10edbfa/mypy-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad37544be07c5d7fba814eb370e006df58fed8ad1ef33ed1649cb1889ba6ff58", size = 10921009, upload-time = "2025-07-31T07:53:23.037Z" }, { url = "https://files.pythonhosted.org/packages/5d/c1/c869d8c067829ad30d9bdae051046561552516cfb3a14f7f0347b7d973ee/mypy-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:064e2ff508e5464b4bd807a7c1625bc5047c5022b85c70f030680e18f37273a5", size = 10047482, upload-time = "2025-07-31T07:53:26.151Z" }, { url = "https://files.pythonhosted.org/packages/98/b9/803672bab3fe03cee2e14786ca056efda4bb511ea02dadcedde6176d06d0/mypy-1.17.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70401bbabd2fa1aa7c43bb358f54037baf0586f41e83b0ae67dd0534fc64edfd", size = 11832883, upload-time = "2025-07-31T07:53:47.948Z" }, { url = "https://files.pythonhosted.org/packages/88/fb/fcdac695beca66800918c18697b48833a9a6701de288452b6715a98cfee1/mypy-1.17.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e92bdc656b7757c438660f775f872a669b8ff374edc4d18277d86b63edba6b8b", size = 12566215, upload-time = "2025-07-31T07:54:04.031Z" }, { url = "https://files.pythonhosted.org/packages/7f/37/a932da3d3dace99ee8eb2043b6ab03b6768c36eb29a02f98f46c18c0da0e/mypy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c1fdf4abb29ed1cb091cf432979e162c208a5ac676ce35010373ff29247bcad5", size = 12751956, upload-time = "2025-07-31T07:53:36.263Z" }, { url = "https://files.pythonhosted.org/packages/8c/cf/6438a429e0f2f5cab8bc83e53dbebfa666476f40ee322e13cac5e64b79e7/mypy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:ff2933428516ab63f961644bc49bc4cbe42bbffb2cd3b71cc7277c07d16b1a8b", size = 9507307, upload-time = "2025-07-31T07:53:59.734Z" }, { url = "https://files.pythonhosted.org/packages/17/a2/7034d0d61af8098ec47902108553122baa0f438df8a713be860f7407c9e6/mypy-1.17.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:69e83ea6553a3ba79c08c6e15dbd9bfa912ec1e493bf75489ef93beb65209aeb", size = 11086295, upload-time = "2025-07-31T07:53:28.124Z" }, { url = "https://files.pythonhosted.org/packages/14/1f/19e7e44b594d4b12f6ba8064dbe136505cec813549ca3e5191e40b1d3cc2/mypy-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b16708a66d38abb1e6b5702f5c2c87e133289da36f6a1d15f6a5221085c6403", size = 10112355, upload-time = "2025-07-31T07:53:21.121Z" }, { url = "https://files.pythonhosted.org/packages/5b/69/baa33927e29e6b4c55d798a9d44db5d394072eef2bdc18c3e2048c9ed1e9/mypy-1.17.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:89e972c0035e9e05823907ad5398c5a73b9f47a002b22359b177d40bdaee7056", size = 11875285, upload-time = "2025-07-31T07:53:55.293Z" }, { url = "https://files.pythonhosted.org/packages/90/13/f3a89c76b0a41e19490b01e7069713a30949d9a6c147289ee1521bcea245/mypy-1.17.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03b6d0ed2b188e35ee6d5c36b5580cffd6da23319991c49ab5556c023ccf1341", size = 12737895, upload-time = "2025-07-31T07:53:43.623Z" }, { url = "https://files.pythonhosted.org/packages/23/a1/c4ee79ac484241301564072e6476c5a5be2590bc2e7bfd28220033d2ef8f/mypy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c837b896b37cd103570d776bda106eabb8737aa6dd4f248451aecf53030cdbeb", size = 12931025, upload-time = "2025-07-31T07:54:17.125Z" }, { url = "https://files.pythonhosted.org/packages/89/b8/7409477be7919a0608900e6320b155c72caab4fef46427c5cc75f85edadd/mypy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:665afab0963a4b39dff7c1fa563cc8b11ecff7910206db4b2e64dd1ba25aed19", size = 9584664, upload-time = "2025-07-31T07:54:12.842Z" }, { url = "https://files.pythonhosted.org/packages/5b/82/aec2fc9b9b149f372850291827537a508d6c4d3664b1750a324b91f71355/mypy-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:93378d3203a5c0800c6b6d850ad2f19f7a3cdf1a3701d3416dbf128805c6a6a7", size = 11075338, upload-time = "2025-07-31T07:53:38.873Z" }, { url = "https://files.pythonhosted.org/packages/07/ac/ee93fbde9d2242657128af8c86f5d917cd2887584cf948a8e3663d0cd737/mypy-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:15d54056f7fe7a826d897789f53dd6377ec2ea8ba6f776dc83c2902b899fee81", size = 10113066, upload-time = "2025-07-31T07:54:14.707Z" }, { url = "https://files.pythonhosted.org/packages/5a/68/946a1e0be93f17f7caa56c45844ec691ca153ee8b62f21eddda336a2d203/mypy-1.17.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:209a58fed9987eccc20f2ca94afe7257a8f46eb5df1fb69958650973230f91e6", size = 11875473, upload-time = "2025-07-31T07:53:14.504Z" }, { url = "https://files.pythonhosted.org/packages/9f/0f/478b4dce1cb4f43cf0f0d00fba3030b21ca04a01b74d1cd272a528cf446f/mypy-1.17.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:099b9a5da47de9e2cb5165e581f158e854d9e19d2e96b6698c0d64de911dd849", size = 12744296, upload-time = "2025-07-31T07:53:03.896Z" }, { url = "https://files.pythonhosted.org/packages/ca/70/afa5850176379d1b303f992a828de95fc14487429a7139a4e0bdd17a8279/mypy-1.17.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa6ffadfbe6994d724c5a1bb6123a7d27dd68fc9c059561cd33b664a79578e14", size = 12914657, upload-time = "2025-07-31T07:54:08.576Z" }, { url = "https://files.pythonhosted.org/packages/53/f9/4a83e1c856a3d9c8f6edaa4749a4864ee98486e9b9dbfbc93842891029c2/mypy-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:9a2b7d9180aed171f033c9f2fc6c204c1245cf60b0cb61cf2e7acc24eea78e0a", size = 9593320, upload-time = "2025-07-31T07:53:01.341Z" }, { url = "https://files.pythonhosted.org/packages/38/56/79c2fac86da57c7d8c48622a05873eaab40b905096c33597462713f5af90/mypy-1.17.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:15a83369400454c41ed3a118e0cc58bd8123921a602f385cb6d6ea5df050c733", size = 11040037, upload-time = "2025-07-31T07:54:10.942Z" }, { url = "https://files.pythonhosted.org/packages/4d/c3/adabe6ff53638e3cad19e3547268482408323b1e68bf082c9119000cd049/mypy-1.17.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55b918670f692fc9fba55c3298d8a3beae295c5cded0a55dccdc5bbead814acd", size = 10131550, upload-time = "2025-07-31T07:53:41.307Z" }, { url = "https://files.pythonhosted.org/packages/b8/c5/2e234c22c3bdeb23a7817af57a58865a39753bde52c74e2c661ee0cfc640/mypy-1.17.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:62761474061feef6f720149d7ba876122007ddc64adff5ba6f374fda35a018a0", size = 11872963, upload-time = "2025-07-31T07:53:16.878Z" }, { url = "https://files.pythonhosted.org/packages/ab/26/c13c130f35ca8caa5f2ceab68a247775648fdcd6c9a18f158825f2bc2410/mypy-1.17.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c49562d3d908fd49ed0938e5423daed8d407774a479b595b143a3d7f87cdae6a", size = 12710189, upload-time = "2025-07-31T07:54:01.962Z" }, { url = "https://files.pythonhosted.org/packages/82/df/c7d79d09f6de8383fe800521d066d877e54d30b4fb94281c262be2df84ef/mypy-1.17.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:397fba5d7616a5bc60b45c7ed204717eaddc38f826e3645402c426057ead9a91", size = 12900322, upload-time = "2025-07-31T07:53:10.551Z" }, { url = "https://files.pythonhosted.org/packages/b8/98/3d5a48978b4f708c55ae832619addc66d677f6dc59f3ebad71bae8285ca6/mypy-1.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:9d6b20b97d373f41617bd0708fd46aa656059af57f2ef72aa8c7d6a2b73b74ed", size = 9751879, upload-time = "2025-07-31T07:52:56.683Z" }, { url = "https://files.pythonhosted.org/packages/1d/f3/8fcd2af0f5b806f6cf463efaffd3c9548a28f84220493ecd38d127b6b66d/mypy-1.17.1-py3-none-any.whl", hash = "sha256:a9f52c0351c21fe24c21d8c0eb1f62967b262d6729393397b6f443c3b773c3b9", size = 2283411, upload-time = "2025-07-31T07:53:24.664Z" }, ] [[package]] name = "mypy-extensions" version = "1.1.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/6e/371856a3fb9d31ca8dac321cda606860fa4548858c0cc45d9d1d4ca2628b/mypy_extensions-1.1.0.tar.gz", hash = "sha256:52e68efc3284861e772bbcd66823fde5ae21fd2fdb51c62a211403730b916558", size = 6343, upload-time = "2025-04-22T14:54:24.164Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/79/7b/2c79738432f5c924bef5071f933bcc9efd0473bac3b4aa584a6f7c1c8df8/mypy_extensions-1.1.0-py3-none-any.whl", hash = "sha256:1be4cccdb0f2482337c4743e60421de3a356cd97508abadd57d47403e94f5505", size = 4963, upload-time = "2025-04-22T14:54:22.983Z" }, ] [[package]] name = "nh3" version = "0.3.5" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9c/5f/1d19bdc7d27238e37f3672cdc02cb77c56a4a86d140cd4f4f23c90df6e16/nh3-0.3.5.tar.gz", hash = "sha256:45855e14ff056064fec77133bfcf7cd691838168e5e17bbef075394954dc9dc8", size = 20743, upload-time = "2026-04-25T10:44:16.066Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/63/b0/8587ac42a9627ab88e7e221601f1dfccbf4db80b2a29222ea63266dc9abc/nh3-0.3.5-cp314-cp314t-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:23a312224875f72cd16bde417f49071451877e29ef646a60e50fcb69407cc18a", size = 1420126, upload-time = "2026-04-25T10:43:39.834Z" }, { url = "https://files.pythonhosted.org/packages/c0/1b/1dbc4d0c43f12e8c1784ede17eaee6f061d4fbe5505757c65c49b2ceab95/nh3-0.3.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:387abd011e81959d5a35151a11350a0795c6edeb53ebfa02d2e882dc01299263", size = 793943, upload-time = "2026-04-25T10:43:41.363Z" }, { url = "https://files.pythonhosted.org/packages/47/9f/d6758d7a14ee964bf439cc35ae4fa24a763a93399c8ef6f22bd11d532d29/nh3-0.3.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:48f45e3e914be93a596431aa143dedf1582557bf41a58153c296048d6e3798c9", size = 841150, upload-time = "2026-04-25T10:43:43.007Z" }, { url = "https://files.pythonhosted.org/packages/b6/36/d5d1ae8374612c98f390e1ea7c610fa6c9716259a03bbf4d15b269f40073/nh3-0.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0a09f51806fd51b4fedbf9ea2b61fef388f19aef0d62fe51199d41648be14588", size = 1008415, upload-time = "2026-04-25T10:43:44.324Z" }, { url = "https://files.pythonhosted.org/packages/ba/8f/d13a9c3fd2d9c131a2a281737380e9379eb0f8c33fea24c2b923aaafbb15/nh3-0.3.5-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:c357f1d042c67f135a5e6babb2b0e3b9d9224ff4a3543240f597767b01384ffd", size = 1092706, upload-time = "2026-04-25T10:43:45.653Z" }, { url = "https://files.pythonhosted.org/packages/bb/57/2f3add7f8680fcc896afa6a675cb2bab09982853ee8af40bad621f6b61c4/nh3-0.3.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:38748140bf76383ab7ce2dce0ad4cb663855d8fbc9098f7f3483673d09616a17", size = 1048346, upload-time = "2026-04-25T10:43:46.974Z" }, { url = "https://files.pythonhosted.org/packages/c1/c3/2f9e4ffa82863074d1361bfe949bc46393d91b3411579dfbbd090b24cac5/nh3-0.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:84bdeb082544fbcb77a12c034dd77d7da0556fdc0727b787eb6214b958c15e29", size = 1029038, upload-time = "2026-04-25T10:43:48.569Z" }, { url = "https://files.pythonhosted.org/packages/e8/10/2804deb3f3315184c9cae41702e293c87524b5a21f766b07d7fe3ffbcfbb/nh3-0.3.5-cp314-cp314t-win32.whl", hash = "sha256:c3aae321f67ae66cff2a627115f106a377d4475d10b0e13d97959a13486b9a88", size = 603263, upload-time = "2026-04-25T10:43:49.851Z" }, { url = "https://files.pythonhosted.org/packages/eb/a2/f6685248b49f7548fc9a8c335ab3a52f68610b72e8a61576447151e4e2e6/nh3-0.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c88605d8d468f7fc1b31e06129bc91d6c96f6c621776c9b504a0da9beac9df5f", size = 616866, upload-time = "2026-04-25T10:43:51.005Z" }, { url = "https://files.pythonhosted.org/packages/ca/b6/d8c9018635d4acfefde6b68470daa510eed715a350cbaa2f928ba0609f81/nh3-0.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:72c5bdedec27fa33de6a5326346ea8aa3fe54f6ac294d54c4b204fb66a9f1e79", size = 602566, upload-time = "2026-04-25T10:43:52.283Z" }, { url = "https://files.pythonhosted.org/packages/85/30/d162e99746a2fb1d98bb0ef23af3e201b156cf09f7de867c7390c8fe1c06/nh3-0.3.5-cp38-abi3-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:3bb854485c9b33e5bb143ff3e49e577073bc6bc320f0ff8fc316dd89c0d3c101", size = 1442393, upload-time = "2026-04-25T10:43:53.556Z" }, { url = "https://files.pythonhosted.org/packages/25/8c/072120d506978ab053e1732d0efa7c86cb478fee0ee098fda0ac0d31cb34/nh3-0.3.5-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50d401ab2d8e86d59e2126e3ab2a2f45840c405842b626d9a51624b3a33b6878", size = 837722, upload-time = "2026-04-25T10:43:55.073Z" }, { url = "https://files.pythonhosted.org/packages/52/86/d4e06e28c5ad1c4b065f89737d02631bd49f1660b6ebcf17a87ffcd201da/nh3-0.3.5-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:acfd354e61accbe4c74f8017c6e397a776916dfe47c48643cf7fd84ade826f93", size = 822872, upload-time = "2026-04-25T10:43:56.581Z" }, { url = "https://files.pythonhosted.org/packages/0a/62/50659255213f241ec5797ae7427464c969397373e83b3659372b341ae869/nh3-0.3.5-cp38-abi3-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:52d877980d7ca01dc3baf3936bf844828bc6f332962227a684ed79c18cce14c3", size = 1100031, upload-time = "2026-04-25T10:43:58.098Z" }, { url = "https://files.pythonhosted.org/packages/00/7a/a12ae77593b2fcf3be25df7bc1c01967d0de448bdb4b6c7ec80fe4f5a74f/nh3-0.3.5-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:207c01801d3e9bb8ec08f08689346bdd30ce15b8bf60013a925d08b5388962a4", size = 1057669, upload-time = "2026-04-25T10:43:59.328Z" }, { url = "https://files.pythonhosted.org/packages/2d/71/5647dc04c0233192a3956fc91708822b21403a06508cacf78083c68e7bf0/nh3-0.3.5-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea232933394d1d58bf7c4bb348dc4660eae6604e1ae81cd2ba6d9ed80d390f3b", size = 914795, upload-time = "2026-04-25T10:44:00.52Z" }, { url = "https://files.pythonhosted.org/packages/1b/0e/bf298920729f216adcb002acf7ea01b90842603d2e4e2ce9b900d9ee8fab/nh3-0.3.5-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe3a787dc76b50de6bee54ef242f26c41dfe47654428e3e94f0fae5bb6dd2cc1", size = 806976, upload-time = "2026-04-25T10:44:01.743Z" }, { url = "https://files.pythonhosted.org/packages/85/01/26761e1dc2b848e65a62c19e5d39ad446283287cd4afddc89f364ab86bc9/nh3-0.3.5-cp38-abi3-manylinux_2_31_riscv64.whl", hash = "sha256:488928988caad25ba14b1eb5bc74e25e21f3b5e40341d956f3ce4a8bc19460dc", size = 834904, upload-time = "2026-04-25T10:44:03.454Z" }, { url = "https://files.pythonhosted.org/packages/33/53/0766113e679540ac1edc1b82b1295aecd321eeb75d6fead70109a838b6ee/nh3-0.3.5-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2c069570b06aa848457713ad7af4a9905691291548c4466a9ad78ee95808382b", size = 857159, upload-time = "2026-04-25T10:44:05.003Z" }, { url = "https://files.pythonhosted.org/packages/58/36/734d353dfaf292fed574b8b3092f0ef79dc6404f3879f7faaa61a4701fad/nh3-0.3.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:eeedc90ed8c42c327e8e10e621ccfa314fc6cce35d5929f4297ff1cdb89667c4", size = 1018600, upload-time = "2026-04-25T10:44:06.18Z" }, { url = "https://files.pythonhosted.org/packages/6b/aa/d9c59c1b49669fcb7bababa55df82385f029ad5c2651f583c3a1141cfdd1/nh3-0.3.5-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:de8e8621853b6470fe928c684ee0d3f39ea8086cebafe4c416486488dea7b68d", size = 1103530, upload-time = "2026-04-25T10:44:07.68Z" }, { url = "https://files.pythonhosted.org/packages/90/b0/cdd210bfb8d9d43fb02fc3c868336b9955934d8e15e66eb1d15a147b8af0/nh3-0.3.5-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:6ea58cc44d274c643b83547ca9654a0b1a817609b160601356f76a2b744c49ad", size = 1061754, upload-time = "2026-04-25T10:44:09.362Z" }, { url = "https://files.pythonhosted.org/packages/ce/cb/7a39e72e668c8445bdd95e494b3e21cfdddc68329be8ea3522c8befb46c4/nh3-0.3.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e49c9b564e6bcb03ecd2f057213df9a0de15a95812ac9db9600b590db23d3ae9", size = 1040938, upload-time = "2026-04-25T10:44:10.775Z" }, { url = "https://files.pythonhosted.org/packages/af/4c/fc2f9ed208a3801a319f59b5fea03cdc20cf3bd8af14be930d3a8de01224/nh3-0.3.5-cp38-abi3-win32.whl", hash = "sha256:559e4c73b689e9a7aa97ac9760b1bc488038d7c1a575aa4ab5a0e19ee9630c0f", size = 611445, upload-time = "2026-04-25T10:44:12.317Z" }, { url = "https://files.pythonhosted.org/packages/db/1a/e4c9b5e2ae13e6092c9ec16d8ca30646cb01fcdea245f36c5b08fd21fbd5/nh3-0.3.5-cp38-abi3-win_amd64.whl", hash = "sha256:45e6a65dc88a300a2e3502cb9c8e6d1d6b831d6fba7470643333609c6aab1f30", size = 626502, upload-time = "2026-04-25T10:44:13.682Z" }, { url = "https://files.pythonhosted.org/packages/80/7c/19cd0671d1ba2762fb388fc149697d20d0568ccfeef833b11280a619e526/nh3-0.3.5-cp38-abi3-win_arm64.whl", hash = "sha256:8f85285700a18e9f3fc5bff41fe573fa84f81542ef13b48a89f9fecca0474d3b", size = 611069, upload-time = "2026-04-25T10:44:14.934Z" }, ] [[package]] name = "numpy" version = "2.2.6" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version < '3.11'", ] sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, ] [[package]] name = "numpy" version = "2.4.4" source = { registry = "https://pypi.org/simple" } resolution-markers = [ "python_full_version >= '3.13'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ef/c6/4218570d8c8ecc9704b5157a3348e486e84ef4be0ed3e38218ab473c83d2/numpy-2.4.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f983334aea213c99992053ede6168500e5f086ce74fbc4acc3f2b00f5762e9db", size = 16976799, upload-time = "2026-03-29T13:18:15.438Z" }, { url = "https://files.pythonhosted.org/packages/dd/92/b4d922c4a5f5dab9ed44e6153908a5c665b71acf183a83b93b690996e39b/numpy-2.4.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72944b19f2324114e9dc86a159787333b77874143efcf89a5167ef83cfee8af0", size = 14971552, upload-time = "2026-03-29T13:18:18.606Z" }, { url = "https://files.pythonhosted.org/packages/8a/dc/df98c095978fa6ee7b9a9387d1d58cbb3d232d0e69ad169a4ce784bde4fd/numpy-2.4.4-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:86b6f55f5a352b48d7fbfd2dbc3d5b780b2d79f4d3c121f33eb6efb22e9a2015", size = 5476566, upload-time = "2026-03-29T13:18:21.532Z" }, { url = "https://files.pythonhosted.org/packages/28/34/b3fdcec6e725409223dd27356bdf5a3c2cc2282e428218ecc9cb7acc9763/numpy-2.4.4-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:ba1f4fc670ed79f876f70082eff4f9583c15fb9a4b89d6188412de4d18ae2f40", size = 6806482, upload-time = "2026-03-29T13:18:23.634Z" }, { url = "https://files.pythonhosted.org/packages/68/62/63417c13aa35d57bee1337c67446761dc25ea6543130cf868eace6e8157b/numpy-2.4.4-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a87ec22c87be071b6bdbd27920b129b94f2fc964358ce38f3822635a3e2e03d", size = 15973376, upload-time = "2026-03-29T13:18:26.677Z" }, { url = "https://files.pythonhosted.org/packages/cf/c5/9fcb7e0e69cef59cf10c746b84f7d58b08bc66a6b7d459783c5a4f6101a6/numpy-2.4.4-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3775294accfdd75f32c74ae39fcba920c9a378a2fc18a12b6820aa8c1fb502", size = 16925137, upload-time = "2026-03-29T13:18:30.14Z" }, { url = "https://files.pythonhosted.org/packages/7e/43/80020edacb3f84b9efdd1591120a4296462c23fd8db0dde1666f6ef66f13/numpy-2.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d4e437e295f18ec29bc79daf55e8a47a9113df44d66f702f02a293d93a2d6dd", size = 17329414, upload-time = "2026-03-29T13:18:33.733Z" }, { url = "https://files.pythonhosted.org/packages/fd/06/af0658593b18a5f73532d377188b964f239eb0894e664a6c12f484472f97/numpy-2.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6aa3236c78803afbcb255045fbef97a9e25a1f6c9888357d205ddc42f4d6eba5", size = 18658397, upload-time = "2026-03-29T13:18:37.511Z" }, { url = "https://files.pythonhosted.org/packages/e6/ce/13a09ed65f5d0ce5c7dd0669250374c6e379910f97af2c08c57b0608eee4/numpy-2.4.4-cp311-cp311-win32.whl", hash = "sha256:30caa73029a225b2d40d9fae193e008e24b2026b7ee1a867b7ee8d96ca1a448e", size = 6239499, upload-time = "2026-03-29T13:18:40.372Z" }, { url = "https://files.pythonhosted.org/packages/bd/63/05d193dbb4b5eec1eca73822d80da98b511f8328ad4ae3ca4caf0f4db91d/numpy-2.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:6bbe4eb67390b0a0265a2c25458f6b90a409d5d069f1041e6aff1e27e3d9a79e", size = 12614257, upload-time = "2026-03-29T13:18:42.95Z" }, { url = "https://files.pythonhosted.org/packages/87/c5/8168052f080c26fa984c413305012be54741c9d0d74abd7fbeeccae3889f/numpy-2.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:fcfe2045fd2e8f3cb0ce9d4ba6dba6333b8fa05bb8a4939c908cd43322d14c7e", size = 10486775, upload-time = "2026-03-29T13:18:45.835Z" }, { url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" }, { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, { url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" }, { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, { url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" }, { url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" }, { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, { url = "https://files.pythonhosted.org/packages/6b/33/8fae8f964a4f63ed528264ddf25d2b683d0b663e3cba26961eb838a7c1bd/numpy-2.4.4-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:58c8b5929fcb8287cbd6f0a3fae19c6e03a5c48402ae792962ac465224a629a4", size = 16854491, upload-time = "2026-03-29T13:21:38.03Z" }, { url = "https://files.pythonhosted.org/packages/bc/d0/1aabee441380b981cf8cdda3ae7a46aa827d1b5a8cce84d14598bc94d6d9/numpy-2.4.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:eea7ac5d2dce4189771cedb559c738a71512768210dc4e4753b107a2048b3d0e", size = 14895830, upload-time = "2026-03-29T13:21:41.509Z" }, { url = "https://files.pythonhosted.org/packages/a5/b8/aafb0d1065416894fccf4df6b49ef22b8db045187949545bced89c034b8e/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:51fc224f7ca4d92656d5a5eb315f12eb5fe2c97a66249aa7b5f562528a3be38c", size = 5400927, upload-time = "2026-03-29T13:21:44.747Z" }, { url = "https://files.pythonhosted.org/packages/d6/77/063baa20b08b431038c7f9ff5435540c7b7265c78cf56012a483019ca72d/numpy-2.4.4-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:28a650663f7314afc3e6ec620f44f333c386aad9f6fc472030865dc0ebb26ee3", size = 6715557, upload-time = "2026-03-29T13:21:47.406Z" }, { url = "https://files.pythonhosted.org/packages/c7/a8/379542d45a14f149444c5c4c4e7714707239ce9cc1de8c2803958889da14/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:19710a9ca9992d7174e9c52f643d4272dcd1558c5f7af7f6f8190f633bd651a7", size = 15804253, upload-time = "2026-03-29T13:21:50.753Z" }, { url = "https://files.pythonhosted.org/packages/a2/c8/f0a45426d6d21e7ea3310a15cf90c43a14d9232c31a837702dba437f3373/numpy-2.4.4-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b2aec6af35c113b05695ebb5749a787acd63cafc83086a05771d1e1cd1e555f", size = 16753552, upload-time = "2026-03-29T13:21:54.344Z" }, { url = "https://files.pythonhosted.org/packages/04/74/f4c001f4714c3ad9ce037e18cf2b9c64871a84951eaa0baf683a9ca9301c/numpy-2.4.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2cf083b324a467e1ab358c105f6cad5ea950f50524668a80c486ff1db24e119", size = 12509075, upload-time = "2026-03-29T13:21:57.644Z" }, ] [[package]] name = "outcome" version = "1.3.0.post0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, ] sdist = { url = "https://files.pythonhosted.org/packages/98/df/77698abfac98571e65ffeb0c1fba8ffd692ab8458d617a0eed7d9a8d38f2/outcome-1.3.0.post0.tar.gz", hash = "sha256:9dcf02e65f2971b80047b377468e72a268e15c0af3cf1238e6ff14f7f91143b8", size = 21060, upload-time = "2023-10-26T04:26:04.361Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/55/8b/5ab7257531a5d830fc8000c476e63c935488d74609b50f9384a643ec0a62/outcome-1.3.0.post0-py2.py3-none-any.whl", hash = "sha256:e771c5ce06d1415e356078d3bdd68523f284b4ce5419828922b6871e65eda82b", size = 10692, upload-time = "2023-10-26T04:26:02.532Z" }, ] [[package]] name = "packaging" version = "26.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, ] [[package]] name = "pathspec" version = "1.1.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/5a/82/42f767fc1c1143d6fd36efb827202a2d997a375e160a71eb2888a925aac1/pathspec-1.1.1.tar.gz", hash = "sha256:17db5ecd524104a120e173814c90367a96a98d07c45b2e10c2f3919fff91bf5a", size = 135180, upload-time = "2026-04-27T01:46:08.907Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f1/d9/7fb5aa316bc299258e68c73ba3bddbc499654a07f151cba08f6153988714/pathspec-1.1.1-py3-none-any.whl", hash = "sha256:a00ce642f577bf7f473932318056212bc4f8bfdf53128c78bbd5af0b9b20b189", size = 57328, upload-time = "2026-04-27T01:46:07.06Z" }, ] [[package]] name = "pillow" version = "12.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/8c/21/c2bcdd5906101a30244eaffc1b6e6ce71a31bd0742a01eb89e660ebfac2d/pillow-12.2.0.tar.gz", hash = "sha256:a830b1a40919539d07806aa58e1b114df53ddd43213d9c8b75847eee6c0182b5", size = 46987819, upload-time = "2026-04-01T14:46:17.687Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3a/aa/d0b28e1c811cd4d5f5c2bfe2e022292bd255ae5744a3b9ac7d6c8f72dd75/pillow-12.2.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:a4e8f36e677d3336f35089648c8955c51c6d386a13cf6ee9c189c5f5bd713a9f", size = 5354355, upload-time = "2026-04-01T14:42:15.402Z" }, { url = "https://files.pythonhosted.org/packages/27/8e/1d5b39b8ae2bd7650d0c7b6abb9602d16043ead9ebbfef4bc4047454da2a/pillow-12.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e589959f10d9824d39b350472b92f0ce3b443c0a3442ebf41c40cb8361c5b97", size = 4695871, upload-time = "2026-04-01T14:42:18.234Z" }, { url = "https://files.pythonhosted.org/packages/f0/c5/dcb7a6ca6b7d3be41a76958e90018d56c8462166b3ef223150360850c8da/pillow-12.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a52edc8bfff4429aaabdf4d9ee0daadbbf8562364f940937b941f87a4290f5ff", size = 6269734, upload-time = "2026-04-01T14:42:20.608Z" }, { url = "https://files.pythonhosted.org/packages/ea/f1/aa1bb13b2f4eba914e9637893c73f2af8e48d7d4023b9d3750d4c5eb2d0c/pillow-12.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:975385f4776fafde056abb318f612ef6285b10a1f12b8570f3647ad0d74b48ec", size = 8076080, upload-time = "2026-04-01T14:42:23.095Z" }, { url = "https://files.pythonhosted.org/packages/a1/2a/8c79d6a53169937784604a8ae8d77e45888c41537f7f6f65ed1f407fe66d/pillow-12.2.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bd9c0c7a0c681a347b3194c500cb1e6ca9cab053ea4d82a5cf45b6b754560136", size = 6382236, upload-time = "2026-04-01T14:42:25.82Z" }, { url = "https://files.pythonhosted.org/packages/b5/42/bbcb6051030e1e421d103ce7a8ecadf837aa2f39b8f82ef1a8d37c3d4ebc/pillow-12.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:88d387ff40b3ff7c274947ed3125dedf5262ec6919d83946753b5f3d7c67ea4c", size = 7070220, upload-time = "2026-04-01T14:42:28.68Z" }, { url = "https://files.pythonhosted.org/packages/3f/e1/c2a7d6dd8cfa6b231227da096fd2d58754bab3603b9d73bf609d3c18b64f/pillow-12.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:51c4167c34b0d8ba05b547a3bb23578d0ba17b80a5593f93bd8ecb123dd336a3", size = 6493124, upload-time = "2026-04-01T14:42:31.579Z" }, { url = "https://files.pythonhosted.org/packages/5f/41/7c8617da5d32e1d2f026e509484fdb6f3ad7efaef1749a0c1928adbb099e/pillow-12.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:34c0d99ecccea270c04882cb3b86e7b57296079c9a4aff88cb3b33563d95afaa", size = 7194324, upload-time = "2026-04-01T14:42:34.615Z" }, { url = "https://files.pythonhosted.org/packages/2d/de/a777627e19fd6d62f84070ee1521adde5eeda4855b5cf60fe0b149118bca/pillow-12.2.0-cp310-cp310-win32.whl", hash = "sha256:b85f66ae9eb53e860a873b858b789217ba505e5e405a24b85c0464822fe88032", size = 6376363, upload-time = "2026-04-01T14:42:37.19Z" }, { url = "https://files.pythonhosted.org/packages/e7/34/fc4cb5204896465842767b96d250c08410f01f2f28afc43b257de842eed5/pillow-12.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:673aa32138f3e7531ccdbca7b3901dba9b70940a19ccecc6a37c77d5fdeb05b5", size = 7083523, upload-time = "2026-04-01T14:42:39.62Z" }, { url = "https://files.pythonhosted.org/packages/2d/a0/32852d36bc7709f14dc3f64f929a275e958ad8c19a6deba9610d458e28b3/pillow-12.2.0-cp310-cp310-win_arm64.whl", hash = "sha256:3e080565d8d7c671db5802eedfb438e5565ffa40115216eabb8cd52d0ecce024", size = 2463318, upload-time = "2026-04-01T14:42:42.063Z" }, { url = "https://files.pythonhosted.org/packages/68/e1/748f5663efe6edcfc4e74b2b93edfb9b8b99b67f21a854c3ae416500a2d9/pillow-12.2.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:8be29e59487a79f173507c30ddf57e733a357f67881430449bb32614075a40ab", size = 5354347, upload-time = "2026-04-01T14:42:44.255Z" }, { url = "https://files.pythonhosted.org/packages/47/a1/d5ff69e747374c33a3b53b9f98cca7889fce1fd03d79cdc4e1bccc6c5a87/pillow-12.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:71cde9a1e1551df7d34a25462fc60325e8a11a82cc2e2f54578e5e9a1e153d65", size = 4695873, upload-time = "2026-04-01T14:42:46.452Z" }, { url = "https://files.pythonhosted.org/packages/df/21/e3fbdf54408a973c7f7f89a23b2cb97a7ef30c61ab4142af31eee6aebc88/pillow-12.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f490f9368b6fc026f021db16d7ec2fbf7d89e2edb42e8ec09d2c60505f5729c7", size = 6280168, upload-time = "2026-04-01T14:42:49.228Z" }, { url = "https://files.pythonhosted.org/packages/d3/f1/00b7278c7dd52b17ad4329153748f87b6756ec195ff786c2bdf12518337d/pillow-12.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8bd7903a5f2a4545f6fd5935c90058b89d30045568985a71c79f5fd6edf9b91e", size = 8088188, upload-time = "2026-04-01T14:42:51.735Z" }, { url = "https://files.pythonhosted.org/packages/ad/cf/220a5994ef1b10e70e85748b75649d77d506499352be135a4989c957b701/pillow-12.2.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3997232e10d2920a68d25191392e3a4487d8183039e1c74c2297f00ed1c50705", size = 6394401, upload-time = "2026-04-01T14:42:54.343Z" }, { url = "https://files.pythonhosted.org/packages/e9/bd/e51a61b1054f09437acfbc2ff9106c30d1eb76bc1453d428399946781253/pillow-12.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e74473c875d78b8e9d5da2a70f7099549f9eb37ded4e2f6a463e60125bccd176", size = 7079655, upload-time = "2026-04-01T14:42:56.954Z" }, { url = "https://files.pythonhosted.org/packages/6b/3d/45132c57d5fb4b5744567c3817026480ac7fc3ce5d4c47902bc0e7f6f853/pillow-12.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:56a3f9c60a13133a98ecff6197af34d7824de9b7b38c3654861a725c970c197b", size = 6503105, upload-time = "2026-04-01T14:42:59.847Z" }, { url = "https://files.pythonhosted.org/packages/7d/2e/9df2fc1e82097b1df3dce58dc43286aa01068e918c07574711fcc53e6fb4/pillow-12.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:90e6f81de50ad6b534cab6e5aef77ff6e37722b2f5d908686f4a5c9eba17a909", size = 7203402, upload-time = "2026-04-01T14:43:02.664Z" }, { url = "https://files.pythonhosted.org/packages/bd/2e/2941e42858ebb67e50ae741473de81c2984e6eff7b397017623c676e2e8d/pillow-12.2.0-cp311-cp311-win32.whl", hash = "sha256:8c984051042858021a54926eb597d6ee3012393ce9c181814115df4c60b9a808", size = 6378149, upload-time = "2026-04-01T14:43:05.274Z" }, { url = "https://files.pythonhosted.org/packages/69/42/836b6f3cd7f3e5fa10a1f1a5420447c17966044c8fbf589cc0452d5502db/pillow-12.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6e6b2a0c538fc200b38ff9eb6628228b77908c319a005815f2dde585a0664b60", size = 7082626, upload-time = "2026-04-01T14:43:08.557Z" }, { url = "https://files.pythonhosted.org/packages/c2/88/549194b5d6f1f494b485e493edc6693c0a16f4ada488e5bd974ed1f42fad/pillow-12.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:9a8a34cc89c67a65ea7437ce257cea81a9dad65b29805f3ecee8c8fe8ff25ffe", size = 2463531, upload-time = "2026-04-01T14:43:10.743Z" }, { url = "https://files.pythonhosted.org/packages/58/be/7482c8a5ebebbc6470b3eb791812fff7d5e0216c2be3827b30b8bb6603ed/pillow-12.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2d192a155bbcec180f8564f693e6fd9bccff5a7af9b32e2e4bf8c9c69dbad6b5", size = 5308279, upload-time = "2026-04-01T14:43:13.246Z" }, { url = "https://files.pythonhosted.org/packages/d8/95/0a351b9289c2b5cbde0bacd4a83ebc44023e835490a727b2a3bd60ddc0f4/pillow-12.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f3f40b3c5a968281fd507d519e444c35f0ff171237f4fdde090dd60699458421", size = 4695490, upload-time = "2026-04-01T14:43:15.584Z" }, { url = "https://files.pythonhosted.org/packages/de/af/4e8e6869cbed569d43c416fad3dc4ecb944cb5d9492defaed89ddd6fe871/pillow-12.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:03e7e372d5240cc23e9f07deca4d775c0817bffc641b01e9c3af208dbd300987", size = 6284462, upload-time = "2026-04-01T14:43:18.268Z" }, { url = "https://files.pythonhosted.org/packages/e9/9e/c05e19657fd57841e476be1ab46c4d501bffbadbafdc31a6d665f8b737b6/pillow-12.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b86024e52a1b269467a802258c25521e6d742349d760728092e1bc2d135b4d76", size = 8094744, upload-time = "2026-04-01T14:43:20.716Z" }, { url = "https://files.pythonhosted.org/packages/2b/54/1789c455ed10176066b6e7e6da1b01e50e36f94ba584dc68d9eebfe9156d/pillow-12.2.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7371b48c4fa448d20d2714c9a1f775a81155050d383333e0a6c15b1123dda005", size = 6398371, upload-time = "2026-04-01T14:43:23.443Z" }, { url = "https://files.pythonhosted.org/packages/43/e3/fdc657359e919462369869f1c9f0e973f353f9a9ee295a39b1fea8ee1a77/pillow-12.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62f5409336adb0663b7caa0da5c7d9e7bdbaae9ce761d34669420c2a801b2780", size = 7087215, upload-time = "2026-04-01T14:43:26.758Z" }, { url = "https://files.pythonhosted.org/packages/8b/f8/2f6825e441d5b1959d2ca5adec984210f1ec086435b0ed5f52c19b3b8a6e/pillow-12.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:01afa7cf67f74f09523699b4e88c73fb55c13346d212a59a2db1f86b0a63e8c5", size = 6509783, upload-time = "2026-04-01T14:43:29.56Z" }, { url = "https://files.pythonhosted.org/packages/67/f9/029a27095ad20f854f9dba026b3ea6428548316e057e6fc3545409e86651/pillow-12.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc3d34d4a8fbec3e88a79b92e5465e0f9b842b628675850d860b8bd300b159f5", size = 7212112, upload-time = "2026-04-01T14:43:32.091Z" }, { url = "https://files.pythonhosted.org/packages/be/42/025cfe05d1be22dbfdb4f264fe9de1ccda83f66e4fc3aac94748e784af04/pillow-12.2.0-cp312-cp312-win32.whl", hash = "sha256:58f62cc0f00fd29e64b29f4fd923ffdb3859c9f9e6105bfc37ba1d08994e8940", size = 6378489, upload-time = "2026-04-01T14:43:34.601Z" }, { url = "https://files.pythonhosted.org/packages/5d/7b/25a221d2c761c6a8ae21bfa3874988ff2583e19cf8a27bf2fee358df7942/pillow-12.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:7f84204dee22a783350679a0333981df803dac21a0190d706a50475e361c93f5", size = 7084129, upload-time = "2026-04-01T14:43:37.213Z" }, { url = "https://files.pythonhosted.org/packages/10/e1/542a474affab20fd4a0f1836cb234e8493519da6b76899e30bcc5d990b8b/pillow-12.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:af73337013e0b3b46f175e79492d96845b16126ddf79c438d7ea7ff27783a414", size = 2463612, upload-time = "2026-04-01T14:43:39.421Z" }, { url = "https://files.pythonhosted.org/packages/4a/01/53d10cf0dbad820a8db274d259a37ba50b88b24768ddccec07355382d5ad/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:8297651f5b5679c19968abefd6bb84d95fe30ef712eb1b2d9b2d31ca61267f4c", size = 4100837, upload-time = "2026-04-01T14:43:41.506Z" }, { url = "https://files.pythonhosted.org/packages/0f/98/f3a6657ecb698c937f6c76ee564882945f29b79bad496abcba0e84659ec5/pillow-12.2.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:50d8520da2a6ce0af445fa6d648c4273c3eeefbc32d7ce049f22e8b5c3daecc2", size = 4176528, upload-time = "2026-04-01T14:43:43.773Z" }, { url = "https://files.pythonhosted.org/packages/69/bc/8986948f05e3ea490b8442ea1c1d4d990b24a7e43d8a51b2c7d8b1dced36/pillow-12.2.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:766cef22385fa1091258ad7e6216792b156dc16d8d3fa607e7545b2b72061f1c", size = 3640401, upload-time = "2026-04-01T14:43:45.87Z" }, { url = "https://files.pythonhosted.org/packages/34/46/6c717baadcd62bc8ed51d238d521ab651eaa74838291bda1f86fe1f864c9/pillow-12.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5d2fd0fa6b5d9d1de415060363433f28da8b1526c1c129020435e186794b3795", size = 5308094, upload-time = "2026-04-01T14:43:48.438Z" }, { url = "https://files.pythonhosted.org/packages/71/43/905a14a8b17fdb1ccb58d282454490662d2cb89a6bfec26af6d3520da5ec/pillow-12.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56b25336f502b6ed02e889f4ece894a72612fe885889a6e8c4c80239ff6e5f5f", size = 4695402, upload-time = "2026-04-01T14:43:51.292Z" }, { url = "https://files.pythonhosted.org/packages/73/dd/42107efcb777b16fa0393317eac58f5b5cf30e8392e266e76e51cff28c3d/pillow-12.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f1c943e96e85df3d3478f7b691f229887e143f81fedab9b20205349ab04d73ed", size = 6280005, upload-time = "2026-04-01T14:43:54.242Z" }, { url = "https://files.pythonhosted.org/packages/a8/68/b93e09e5e8549019e61acf49f65b1a8530765a7f812c77a7461bca7e4494/pillow-12.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:03f6fab9219220f041c74aeaa2939ff0062bd5c364ba9ce037197f4c6d498cd9", size = 8090669, upload-time = "2026-04-01T14:43:57.335Z" }, { url = "https://files.pythonhosted.org/packages/4b/6e/3ccb54ce8ec4ddd1accd2d89004308b7b0b21c4ac3d20fa70af4760a4330/pillow-12.2.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cdfebd752ec52bf5bb4e35d9c64b40826bc5b40a13df7c3cda20a2c03a0f5ed", size = 6395194, upload-time = "2026-04-01T14:43:59.864Z" }, { url = "https://files.pythonhosted.org/packages/67/ee/21d4e8536afd1a328f01b359b4d3997b291ffd35a237c877b331c1c3b71c/pillow-12.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eedf4b74eda2b5a4b2b2fb4c006d6295df3bf29e459e198c90ea48e130dc75c3", size = 7082423, upload-time = "2026-04-01T14:44:02.74Z" }, { url = "https://files.pythonhosted.org/packages/78/5f/e9f86ab0146464e8c133fe85df987ed9e77e08b29d8d35f9f9f4d6f917ba/pillow-12.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:00a2865911330191c0b818c59103b58a5e697cae67042366970a6b6f1b20b7f9", size = 6505667, upload-time = "2026-04-01T14:44:05.381Z" }, { url = "https://files.pythonhosted.org/packages/ed/1e/409007f56a2fdce61584fd3acbc2bbc259857d555196cedcadc68c015c82/pillow-12.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:1e1757442ed87f4912397c6d35a0db6a7b52592156014706f17658ff58bbf795", size = 7208580, upload-time = "2026-04-01T14:44:08.39Z" }, { url = "https://files.pythonhosted.org/packages/23/c4/7349421080b12fb35414607b8871e9534546c128a11965fd4a7002ccfbee/pillow-12.2.0-cp313-cp313-win32.whl", hash = "sha256:144748b3af2d1b358d41286056d0003f47cb339b8c43a9ea42f5fea4d8c66b6e", size = 6375896, upload-time = "2026-04-01T14:44:11.197Z" }, { url = "https://files.pythonhosted.org/packages/3f/82/8a3739a5e470b3c6cbb1d21d315800d8e16bff503d1f16b03a4ec3212786/pillow-12.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:390ede346628ccc626e5730107cde16c42d3836b89662a115a921f28440e6a3b", size = 7081266, upload-time = "2026-04-01T14:44:13.947Z" }, { url = "https://files.pythonhosted.org/packages/c3/25/f968f618a062574294592f668218f8af564830ccebdd1fa6200f598e65c5/pillow-12.2.0-cp313-cp313-win_arm64.whl", hash = "sha256:8023abc91fba39036dbce14a7d6535632f99c0b857807cbbbf21ecc9f4717f06", size = 2463508, upload-time = "2026-04-01T14:44:16.312Z" }, { url = "https://files.pythonhosted.org/packages/4d/a4/b342930964e3cb4dce5038ae34b0eab4653334995336cd486c5a8c25a00c/pillow-12.2.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:042db20a421b9bafecc4b84a8b6e444686bd9d836c7fd24542db3e7df7baad9b", size = 5309927, upload-time = "2026-04-01T14:44:18.89Z" }, { url = "https://files.pythonhosted.org/packages/9f/de/23198e0a65a9cf06123f5435a5d95cea62a635697f8f03d134d3f3a96151/pillow-12.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd025009355c926a84a612fecf58bb315a3f6814b17ead51a8e48d3823d9087f", size = 4698624, upload-time = "2026-04-01T14:44:21.115Z" }, { url = "https://files.pythonhosted.org/packages/01/a6/1265e977f17d93ea37aa28aa81bad4fa597933879fac2520d24e021c8da3/pillow-12.2.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:88ddbc66737e277852913bd1e07c150cc7bb124539f94c4e2df5344494e0a612", size = 6321252, upload-time = "2026-04-01T14:44:23.663Z" }, { url = "https://files.pythonhosted.org/packages/3c/83/5982eb4a285967baa70340320be9f88e57665a387e3a53a7f0db8231a0cd/pillow-12.2.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d362d1878f00c142b7e1a16e6e5e780f02be8195123f164edf7eddd911eefe7c", size = 8126550, upload-time = "2026-04-01T14:44:26.772Z" }, { url = "https://files.pythonhosted.org/packages/4e/48/6ffc514adce69f6050d0753b1a18fd920fce8cac87620d5a31231b04bfc5/pillow-12.2.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c727a6d53cb0018aadd8018c2b938376af27914a68a492f59dfcaca650d5eea", size = 6433114, upload-time = "2026-04-01T14:44:29.615Z" }, { url = "https://files.pythonhosted.org/packages/36/a3/f9a77144231fb8d40ee27107b4463e205fa4677e2ca2548e14da5cf18dce/pillow-12.2.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:efd8c21c98c5cc60653bcb311bef2ce0401642b7ce9d09e03a7da87c878289d4", size = 7115667, upload-time = "2026-04-01T14:44:32.773Z" }, { url = "https://files.pythonhosted.org/packages/c1/fc/ac4ee3041e7d5a565e1c4fd72a113f03b6394cc72ab7089d27608f8aaccb/pillow-12.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9f08483a632889536b8139663db60f6724bfcb443c96f1b18855860d7d5c0fd4", size = 6538966, upload-time = "2026-04-01T14:44:35.252Z" }, { url = "https://files.pythonhosted.org/packages/c0/a8/27fb307055087f3668f6d0a8ccb636e7431d56ed0750e07a60547b1e083e/pillow-12.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dac8d77255a37e81a2efcbd1fc05f1c15ee82200e6c240d7e127e25e365c39ea", size = 7238241, upload-time = "2026-04-01T14:44:37.875Z" }, { url = "https://files.pythonhosted.org/packages/ad/4b/926ab182c07fccae9fcb120043464e1ff1564775ec8864f21a0ebce6ac25/pillow-12.2.0-cp313-cp313t-win32.whl", hash = "sha256:ee3120ae9dff32f121610bb08e4313be87e03efeadfc6c0d18f89127e24d0c24", size = 6379592, upload-time = "2026-04-01T14:44:40.336Z" }, { url = "https://files.pythonhosted.org/packages/c2/c4/f9e476451a098181b30050cc4c9a3556b64c02cf6497ea421ac047e89e4b/pillow-12.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:325ca0528c6788d2a6c3d40e3568639398137346c3d6e66bb61db96b96511c98", size = 7085542, upload-time = "2026-04-01T14:44:43.251Z" }, { url = "https://files.pythonhosted.org/packages/00/a4/285f12aeacbe2d6dc36c407dfbbe9e96d4a80b0fb710a337f6d2ad978c75/pillow-12.2.0-cp313-cp313t-win_arm64.whl", hash = "sha256:2e5a76d03a6c6dcef67edabda7a52494afa4035021a79c8558e14af25313d453", size = 2465765, upload-time = "2026-04-01T14:44:45.996Z" }, { url = "https://files.pythonhosted.org/packages/bf/98/4595daa2365416a86cb0d495248a393dfc84e96d62ad080c8546256cb9c0/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:3adc9215e8be0448ed6e814966ecf3d9952f0ea40eb14e89a102b87f450660d8", size = 4100848, upload-time = "2026-04-01T14:44:48.48Z" }, { url = "https://files.pythonhosted.org/packages/0b/79/40184d464cf89f6663e18dfcf7ca21aae2491fff1a16127681bf1fa9b8cf/pillow-12.2.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:6a9adfc6d24b10f89588096364cc726174118c62130c817c2837c60cf08a392b", size = 4176515, upload-time = "2026-04-01T14:44:51.353Z" }, { url = "https://files.pythonhosted.org/packages/b0/63/703f86fd4c422a9cf722833670f4f71418fb116b2853ff7da722ea43f184/pillow-12.2.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:6a6e67ea2e6feda684ed370f9a1c52e7a243631c025ba42149a2cc5934dec295", size = 3640159, upload-time = "2026-04-01T14:44:53.588Z" }, { url = "https://files.pythonhosted.org/packages/71/e0/fb22f797187d0be2270f83500aab851536101b254bfa1eae10795709d283/pillow-12.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:2bb4a8d594eacdfc59d9e5ad972aa8afdd48d584ffd5f13a937a664c3e7db0ed", size = 5312185, upload-time = "2026-04-01T14:44:56.039Z" }, { url = "https://files.pythonhosted.org/packages/ba/8c/1a9e46228571de18f8e28f16fabdfc20212a5d019f3e3303452b3f0a580d/pillow-12.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80b2da48193b2f33ed0c32c38140f9d3186583ce7d516526d462645fd98660ae", size = 4695386, upload-time = "2026-04-01T14:44:58.663Z" }, { url = "https://files.pythonhosted.org/packages/70/62/98f6b7f0c88b9addd0e87c217ded307b36be024d4ff8869a812b241d1345/pillow-12.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:22db17c68434de69d8ecfc2fe821569195c0c373b25cccb9cbdacf2c6e53c601", size = 6280384, upload-time = "2026-04-01T14:45:01.5Z" }, { url = "https://files.pythonhosted.org/packages/5e/03/688747d2e91cfbe0e64f316cd2e8005698f76ada3130d0194664174fa5de/pillow-12.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7b14cc0106cd9aecda615dd6903840a058b4700fcb817687d0ee4fc8b6e389be", size = 8091599, upload-time = "2026-04-01T14:45:04.5Z" }, { url = "https://files.pythonhosted.org/packages/f6/35/577e22b936fcdd66537329b33af0b4ccfefaeabd8aec04b266528cddb33c/pillow-12.2.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cbeb542b2ebc6fcdacabf8aca8c1a97c9b3ad3927d46b8723f9d4f033288a0f", size = 6396021, upload-time = "2026-04-01T14:45:07.117Z" }, { url = "https://files.pythonhosted.org/packages/11/8d/d2532ad2a603ca2b93ad9f5135732124e57811d0168155852f37fbce2458/pillow-12.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4bfd07bc812fbd20395212969e41931001fd59eb55a60658b0e5710872e95286", size = 7083360, upload-time = "2026-04-01T14:45:09.763Z" }, { url = "https://files.pythonhosted.org/packages/5e/26/d325f9f56c7e039034897e7380e9cc202b1e368bfd04d4cbe6a441f02885/pillow-12.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9aba9a17b623ef750a4d11b742cbafffeb48a869821252b30ee21b5e91392c50", size = 6507628, upload-time = "2026-04-01T14:45:12.378Z" }, { url = "https://files.pythonhosted.org/packages/5f/f7/769d5632ffb0988f1c5e7660b3e731e30f7f8ec4318e94d0a5d674eb65a4/pillow-12.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:deede7c263feb25dba4e82ea23058a235dcc2fe1f6021025dc71f2b618e26104", size = 7209321, upload-time = "2026-04-01T14:45:15.122Z" }, { url = "https://files.pythonhosted.org/packages/6a/7a/c253e3c645cd47f1aceea6a8bacdba9991bf45bb7dfe927f7c893e89c93c/pillow-12.2.0-cp314-cp314-win32.whl", hash = "sha256:632ff19b2778e43162304d50da0181ce24ac5bb8180122cbe1bf4673428328c7", size = 6479723, upload-time = "2026-04-01T14:45:17.797Z" }, { url = "https://files.pythonhosted.org/packages/cd/8b/601e6566b957ca50e28725cb6c355c59c2c8609751efbecd980db44e0349/pillow-12.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:4e6c62e9d237e9b65fac06857d511e90d8461a32adcc1b9065ea0c0fa3a28150", size = 7217400, upload-time = "2026-04-01T14:45:20.529Z" }, { url = "https://files.pythonhosted.org/packages/d6/94/220e46c73065c3e2951bb91c11a1fb636c8c9ad427ac3ce7d7f3359b9b2f/pillow-12.2.0-cp314-cp314-win_arm64.whl", hash = "sha256:b1c1fbd8a5a1af3412a0810d060a78b5136ec0836c8a4ef9aa11807f2a22f4e1", size = 2554835, upload-time = "2026-04-01T14:45:23.162Z" }, { url = "https://files.pythonhosted.org/packages/b6/ab/1b426a3974cb0e7da5c29ccff4807871d48110933a57207b5a676cccc155/pillow-12.2.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:57850958fe9c751670e49b2cecf6294acc99e562531f4bd317fa5ddee2068463", size = 5314225, upload-time = "2026-04-01T14:45:25.637Z" }, { url = "https://files.pythonhosted.org/packages/19/1e/dce46f371be2438eecfee2a1960ee2a243bbe5e961890146d2dee1ff0f12/pillow-12.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d5d38f1411c0ed9f97bcb49b7bd59b6b7c314e0e27420e34d99d844b9ce3b6f3", size = 4698541, upload-time = "2026-04-01T14:45:28.355Z" }, { url = "https://files.pythonhosted.org/packages/55/c3/7fbecf70adb3a0c33b77a300dc52e424dc22ad8cdc06557a2e49523b703d/pillow-12.2.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c0a9f29ca8e79f09de89293f82fc9b0270bb4af1d58bc98f540cc4aedf03166", size = 6322251, upload-time = "2026-04-01T14:45:30.924Z" }, { url = "https://files.pythonhosted.org/packages/1c/3c/7fbc17cfb7e4fe0ef1642e0abc17fc6c94c9f7a16be41498e12e2ba60408/pillow-12.2.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1610dd6c61621ae1cf811bef44d77e149ce3f7b95afe66a4512f8c59f25d9ebe", size = 8127807, upload-time = "2026-04-01T14:45:33.908Z" }, { url = "https://files.pythonhosted.org/packages/ff/c3/a8ae14d6defd2e448493ff512fae903b1e9bd40b72efb6ec55ce0048c8ce/pillow-12.2.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a34329707af4f73cf1782a36cd2289c0368880654a2c11f027bcee9052d35dd", size = 6433935, upload-time = "2026-04-01T14:45:36.623Z" }, { url = "https://files.pythonhosted.org/packages/6e/32/2880fb3a074847ac159d8f902cb43278a61e85f681661e7419e6596803ed/pillow-12.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8e9c4f5b3c546fa3458a29ab22646c1c6c787ea8f5ef51300e5a60300736905e", size = 7116720, upload-time = "2026-04-01T14:45:39.258Z" }, { url = "https://files.pythonhosted.org/packages/46/87/495cc9c30e0129501643f24d320076f4cc54f718341df18cc70ec94c44e1/pillow-12.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:fb043ee2f06b41473269765c2feae53fc2e2fbf96e5e22ca94fb5ad677856f06", size = 6540498, upload-time = "2026-04-01T14:45:41.879Z" }, { url = "https://files.pythonhosted.org/packages/18/53/773f5edca692009d883a72211b60fdaf8871cbef075eaa9d577f0a2f989e/pillow-12.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:f278f034eb75b4e8a13a54a876cc4a5ab39173d2cdd93a638e1b467fc545ac43", size = 7239413, upload-time = "2026-04-01T14:45:44.705Z" }, { url = "https://files.pythonhosted.org/packages/c9/e4/4b64a97d71b2a83158134abbb2f5bd3f8a2ea691361282f010998f339ec7/pillow-12.2.0-cp314-cp314t-win32.whl", hash = "sha256:6bb77b2dcb06b20f9f4b4a8454caa581cd4dd0643a08bacf821216a16d9c8354", size = 6482084, upload-time = "2026-04-01T14:45:47.568Z" }, { url = "https://files.pythonhosted.org/packages/ba/13/306d275efd3a3453f72114b7431c877d10b1154014c1ebbedd067770d629/pillow-12.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:6562ace0d3fb5f20ed7290f1f929cae41b25ae29528f2af1722966a0a02e2aa1", size = 7225152, upload-time = "2026-04-01T14:45:50.032Z" }, { url = "https://files.pythonhosted.org/packages/ff/6e/cf826fae916b8658848d7b9f38d88da6396895c676e8086fc0988073aaf8/pillow-12.2.0-cp314-cp314t-win_arm64.whl", hash = "sha256:aa88ccfe4e32d362816319ed727a004423aab09c5cea43c01a4b435643fa34eb", size = 2556579, upload-time = "2026-04-01T14:45:52.529Z" }, { url = "https://files.pythonhosted.org/packages/4e/b7/2437044fb910f499610356d1352e3423753c98e34f915252aafecc64889f/pillow-12.2.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0538bd5e05efec03ae613fd89c4ce0368ecd2ba239cc25b9f9be7ed426b0af1f", size = 5273969, upload-time = "2026-04-01T14:45:55.538Z" }, { url = "https://files.pythonhosted.org/packages/f6/f4/8316e31de11b780f4ac08ef3654a75555e624a98db1056ecb2122d008d5a/pillow-12.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:394167b21da716608eac917c60aa9b969421b5dcbbe02ae7f013e7b85811c69d", size = 4659674, upload-time = "2026-04-01T14:45:58.093Z" }, { url = "https://files.pythonhosted.org/packages/d4/37/664fca7201f8bb2aa1d20e2c3d5564a62e6ae5111741966c8319ca802361/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5d04bfa02cc2d23b497d1e90a0f927070043f6cbf303e738300532379a4b4e0f", size = 5288479, upload-time = "2026-04-01T14:46:01.141Z" }, { url = "https://files.pythonhosted.org/packages/49/62/5b0ed78fce87346be7a5cfcfaaad91f6a1f98c26f86bdbafa2066c647ef6/pillow-12.2.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0c838a5125cee37e68edec915651521191cef1e6aa336b855f495766e77a366e", size = 7032230, upload-time = "2026-04-01T14:46:03.874Z" }, { url = "https://files.pythonhosted.org/packages/c3/28/ec0fc38107fc32536908034e990c47914c57cd7c5a3ece4d8d8f7ffd7e27/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a6c9fa44005fa37a91ebfc95d081e8079757d2e904b27103f4f5fa6f0bf78c0", size = 5355404, upload-time = "2026-04-01T14:46:06.33Z" }, { url = "https://files.pythonhosted.org/packages/5e/8b/51b0eddcfa2180d60e41f06bd6d0a62202b20b59c68f5a132e615b75aecf/pillow-12.2.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25373b66e0dd5905ed63fa3cae13c82fbddf3079f2c8bf15c6fb6a35586324c1", size = 6002215, upload-time = "2026-04-01T14:46:08.83Z" }, { url = "https://files.pythonhosted.org/packages/bc/60/5382c03e1970de634027cee8e1b7d39776b778b81812aaf45b694dfe9e28/pillow-12.2.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:bfa9c230d2fe991bed5318a5f119bd6780cda2915cca595393649fc118ab895e", size = 7080946, upload-time = "2026-04-01T14:46:11.734Z" }, ] [[package]] name = "platformdirs" version = "4.9.6" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, ] [[package]] name = "pluggy" version = "1.6.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] [[package]] name = "propcache" version = "0.4.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534, upload-time = "2025-10-08T19:46:02.083Z" }, { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526, upload-time = "2025-10-08T19:46:03.884Z" }, { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263, upload-time = "2025-10-08T19:46:05.405Z" }, { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012, upload-time = "2025-10-08T19:46:07.165Z" }, { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491, upload-time = "2025-10-08T19:46:08.909Z" }, { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319, upload-time = "2025-10-08T19:46:10.7Z" }, { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856, upload-time = "2025-10-08T19:46:12.003Z" }, { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241, upload-time = "2025-10-08T19:46:13.495Z" }, { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552, upload-time = "2025-10-08T19:46:14.938Z" }, { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113, upload-time = "2025-10-08T19:46:16.695Z" }, { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778, upload-time = "2025-10-08T19:46:18.023Z" }, { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047, upload-time = "2025-10-08T19:46:19.449Z" }, { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093, upload-time = "2025-10-08T19:46:20.643Z" }, { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638, upload-time = "2025-10-08T19:46:21.935Z" }, { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229, upload-time = "2025-10-08T19:46:23.368Z" }, { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] [[package]] name = "pycparser" version = "3.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, ] [[package]] name = "pygments" version = "2.20.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, ] [[package]] name = "pyinstrument" version = "5.1.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/32/7f/d3c4ef7c43f3294bd5a475dfa6f295a9fee5243c292d5c8122044fa83bcb/pyinstrument-5.1.2.tar.gz", hash = "sha256:af149d672da9493fa37334a1cc68f7b80c3e6cb9fd99b9e426c447db5c650bf0", size = 266889, upload-time = "2026-01-04T18:38:58.464Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/43/74/c66e1bf3565600d78f53195efb6f8fd31610f85a58aa3fee39c56bf71d1b/pyinstrument-5.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f224fe80ba288a00980af298d3808219f9d246fd95b4f91729c9c33a0dc54fe6", size = 131470, upload-time = "2026-01-04T18:37:22.536Z" }, { url = "https://files.pythonhosted.org/packages/1a/6b/606c5bfa311b5be74f58ef505c678216dda2be3b76a2ac770c2b0fccff77/pyinstrument-5.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:7df09fc0d5b72daf48b73cdf07738761bff7f656c81aff686b3ccdd7d2abe236", size = 124567, upload-time = "2026-01-04T18:37:24.161Z" }, { url = "https://files.pythonhosted.org/packages/15/70/c8a88defb77873513971f590549c48ceb70f7ef10f30a689762ef36dd877/pyinstrument-5.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:75a7e17377d4405666bbaf126b1fd7bbb7e206d7246e6db3d62864d3d4790ae3", size = 149205, upload-time = "2026-01-04T18:37:25.696Z" }, { url = "https://files.pythonhosted.org/packages/8f/4b/0e64fefb939af472c3fbc63ab45224766447bde73f51579f3ecc335b0a49/pyinstrument-5.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5381cc6583d26e04d9298acded4242f4fe71986f1472c8aee6992c6816f0cac5", size = 147900, upload-time = "2026-01-04T18:37:27.343Z" }, { url = "https://files.pythonhosted.org/packages/38/6e/b4209711c61176acfeb6c351e9f88a37ed3d3bc3b749c374c0a655ee8f50/pyinstrument-5.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ec08a530bef8d3492d31d8b0b12d0cfde09539f2a1c4b9678662ebc3c843e478", size = 148133, upload-time = "2026-01-04T18:37:29.047Z" }, { url = "https://files.pythonhosted.org/packages/26/28/f323b70789833baf0628af7b9f797b8c1a13b695bd8aa582b1312f14b602/pyinstrument-5.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d671168508129b472be570bc9aee361190ba917b997c703bd134bb4de445ce7", size = 147652, upload-time = "2026-01-04T18:37:30.682Z" }, { url = "https://files.pythonhosted.org/packages/16/cd/9b0af0307a3a2cffb48ca76275c50b8bec3f85ca6e7b996e2e6cfbda1207/pyinstrument-5.1.2-cp310-cp310-win32.whl", hash = "sha256:5957a94f84564b374a7f856d1b322345d600964280b0d687b8ddcc483f21e576", size = 125793, upload-time = "2026-01-04T18:37:31.906Z" }, { url = "https://files.pythonhosted.org/packages/05/89/fe4c650c252aefb8064bfdff6c0a020d33d15c55dc22abfa1f352dcc2dd1/pyinstrument-5.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:38a2180a7801c51610b50e5d423674b21872efd019ccf05a11b7f9016cb1dcfc", size = 126679, upload-time = "2026-01-04T18:37:33.59Z" }, { url = "https://files.pythonhosted.org/packages/79/ef/0288edd620fb0cf2074d8c8e3567007a6bac66307b839d99988563de4eb8/pyinstrument-5.1.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3739a05583ea6312c385eb59fe985cd20d9048e95f9eeeb6a2f6c35202e2d36e", size = 131284, upload-time = "2026-01-04T18:37:35.01Z" }, { url = "https://files.pythonhosted.org/packages/0b/4e/2a90a6997d9f7a39a6998d56de72e52673ebf5a9169a1c39dbf173e95105/pyinstrument-5.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7c9ee05dc75ac5fb18498c311e624f77f7f321f7ff325b251aa09e52e46f1d6a", size = 124468, upload-time = "2026-01-04T18:37:36.628Z" }, { url = "https://files.pythonhosted.org/packages/04/74/7bfd403e81f9b5ec523f60cced8f516ee52312752bb2e0fafabfd90bbd78/pyinstrument-5.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a49a55ca5b75218767e29cacbe515d0b66fc18cb48a937bca0f77b8dafc7202", size = 148057, upload-time = "2026-01-04T18:37:37.998Z" }, { url = "https://files.pythonhosted.org/packages/50/3a/7205d7c199947d18edcd013af4ddf4d3cca85c5488fbe493050035947f7c/pyinstrument-5.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0c45c14974ff04b1bfdc6c2a448627c6da7409c7800d0eb7bd03fb435dcb41d7", size = 146526, upload-time = "2026-01-04T18:37:39.642Z" }, { url = "https://files.pythonhosted.org/packages/24/e8/f6864172e7ebe4bc5209bafbc574a619b4c511b9506b941789b11441be7c/pyinstrument-5.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:22b9c04b3982c41c04b1c5ed05d1bc3a2ba26533450084058119f6dc160e70a3", size = 147179, upload-time = "2026-01-04T18:37:41.332Z" }, { url = "https://files.pythonhosted.org/packages/6d/04/89ef2d1c34767bfdbcc74ab0c7e0d021d7fac5e79873239e4ca26e97d6da/pyinstrument-5.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5c4995ee0774801790c138f0dfec17d4e7a7ef09a6d56d53cbcbf0578a711021", size = 146354, upload-time = "2026-01-04T18:37:42.808Z" }, { url = "https://files.pythonhosted.org/packages/2e/d4/64441547ec12391b92c739a3b0685059e7dfa088d928df8364676ef7abc7/pyinstrument-5.1.2-cp311-cp311-win32.whl", hash = "sha256:fe449e4a8ee60a2a27cf509350a584670f4c3704649601be7937598f09dbe7ca", size = 125790, upload-time = "2026-01-04T18:37:44.141Z" }, { url = "https://files.pythonhosted.org/packages/4d/8b/0a5f6b239294decb0ecd932711f3470bfbd42fc2e08a94cd5c1f4f6da7f1/pyinstrument-5.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:3fb839429671a42bf349335af4c1ce5cf83386ac11f04df0bc40720d4cb7d77d", size = 126578, upload-time = "2026-01-04T18:37:45.423Z" }, { url = "https://files.pythonhosted.org/packages/26/d9/8fa5571ddd21b2b7189bd8b0bb4e90be1659a54dda5af51c7f6bf2b5666f/pyinstrument-5.1.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2519865d4bf58936f2506c1c46a82d29a20f3239aa50c941df1ca9618c7da5f0", size = 131419, upload-time = "2026-01-04T18:37:46.843Z" }, { url = "https://files.pythonhosted.org/packages/6f/50/0512adb83cadfeaa1a215dc9784defff5043c5aa052d15015e3d8013af75/pyinstrument-5.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:059442106b8b5de29ae5ac1bdc20d044fed4da534b8caba434b6ffb119037bf5", size = 124446, upload-time = "2026-01-04T18:37:48.572Z" }, { url = "https://files.pythonhosted.org/packages/9b/78/c45f0b668fb3c8c0d32058a451a8e1d34737cd7586387982185e12df1977/pyinstrument-5.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cd51f2d54fc39a4cfd73ba6be27cd0187123132ce3f445b639bff5e1b23d7e26", size = 149694, upload-time = "2026-01-04T18:37:49.876Z" }, { url = "https://files.pythonhosted.org/packages/91/4d/2ca3ca9906ce6e05070f431c54d54ccbaf57a980cfa58032d35b0b0ac1f8/pyinstrument-5.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12af1e83795b6c640d657d339014dd1ff718b182dec736d7d1f1d8a97534eb53", size = 148461, upload-time = "2026-01-04T18:37:51.544Z" }, { url = "https://files.pythonhosted.org/packages/18/d2/bfe84a4326172ef68655b65b49fd041eeb94c8e59ee47258589b8b79dd3b/pyinstrument-5.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2565513658e742c5eb691a779cb29d19d01bc9ee951d0eb76482e9f343c38c2e", size = 148560, upload-time = "2026-01-04T18:37:52.931Z" }, { url = "https://files.pythonhosted.org/packages/d0/00/db7f5def351e869230b0165828c4edacbf3fdda8d66aff30dd73a62082c2/pyinstrument-5.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5afd0ba788a1d112da49fb77966918e01df1f9e7d62e72894d82f7acb0996c2d", size = 148178, upload-time = "2026-01-04T18:37:54.278Z" }, { url = "https://files.pythonhosted.org/packages/5e/bc/aea3329576e20b987d205027b8e6442ece845d681b9f9d8682d5404f81f3/pyinstrument-5.1.2-cp312-cp312-win32.whl", hash = "sha256:554077b031b278593cb2301f0057be771ea62a729878c69aaf29fcdfb7b71281", size = 125927, upload-time = "2026-01-04T18:37:55.615Z" }, { url = "https://files.pythonhosted.org/packages/14/e2/d928434ec3a840478e95fd0d73b0dfc0b8060a07b06f4b45e9df30444e9a/pyinstrument-5.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:55a905384ba43efc924b8863aa6cfd276f029e4aa70c4a0e3b7389e27b191e45", size = 126675, upload-time = "2026-01-04T18:37:57.278Z" }, { url = "https://files.pythonhosted.org/packages/b4/8e/b9aea969eec67c129652000446384d550a0df45c297adc9fd74da2f8482c/pyinstrument-5.1.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7b8bab2334bf1d4c9e92d61db574300b914b594588a6b6dd67c45450152dfc29", size = 131418, upload-time = "2026-01-04T18:37:58.642Z" }, { url = "https://files.pythonhosted.org/packages/8f/62/76418eb29b5591f3e5500369a6777ce928135c3aa6ccdb0c861a9c6ca93b/pyinstrument-5.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:13dcc138a61298ef4994b7aebff509d2c06db89dfd6e2021f0b9cd96aaa44ec3", size = 124448, upload-time = "2026-01-04T18:37:59.95Z" }, { url = "https://files.pythonhosted.org/packages/07/73/874bccc04bcf6f4babc3de1a9568e209e7e40998563974f5030b0fb4d3e0/pyinstrument-5.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8abd4a7ffa2e7f9e00039a5e549e8eebc80d7ca8d43f0fb51a50ff2b117ce4a", size = 149853, upload-time = "2026-01-04T18:38:01.405Z" }, { url = "https://files.pythonhosted.org/packages/cf/85/268446c4388d77ff4abdeaff202356e1527b3ff9576f5587443a24980bec/pyinstrument-5.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:eb3a05108edebc30f31e2c69c904576042f1158b2513ab80adc08f7848a7a8f0", size = 148641, upload-time = "2026-01-04T18:38:03.086Z" }, { url = "https://files.pythonhosted.org/packages/fc/15/4f8dea3381483e68d00582a9b823a21a088acfe77a847a7991a1a8feed76/pyinstrument-5.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f70d588b53f3f35829d1d1ddfa05e07fcebf1434b3b1509d542ca317d8e9a2a5", size = 148674, upload-time = "2026-01-04T18:38:04.805Z" }, { url = "https://files.pythonhosted.org/packages/fa/61/72c180454b6511d5b90166f8828e1bab3b45d0489952a1fe48c5c585233d/pyinstrument-5.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b007327e0d6a6a01d5064883dd27c19996f044ce7488d507826fee7884e6a32e", size = 148315, upload-time = "2026-01-04T18:38:06.114Z" }, { url = "https://files.pythonhosted.org/packages/2c/f0/4c27cebddf22a8840bd8b419366bb321ce41f921ca1893e309c932ab28bf/pyinstrument-5.1.2-cp313-cp313-win32.whl", hash = "sha256:9ba0e6b17a7e86c3dc02d208e4c25506e8f914d9964ae89449f1f37f0b70abc0", size = 125926, upload-time = "2026-01-04T18:38:07.507Z" }, { url = "https://files.pythonhosted.org/packages/6c/20/6b1bee88ddef065b0df3a3ba4ba60ed8a9ca443d5cded7152a8a9750914f/pyinstrument-5.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:660d7fc486a839814db0b2f716bc13d8b99b9c780aaeb47f74a70a34adc02a7b", size = 126678, upload-time = "2026-01-04T18:38:08.826Z" }, { url = "https://files.pythonhosted.org/packages/66/0f/7d5154c92904bdf25be067a7fe4cad4ba48919f16ccbb51bb953d9ae1a20/pyinstrument-5.1.2-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:0baed297beee2bb9897e737bbd89e3b9d45a2fbbea9f1ad4e809007d780a9b1e", size = 131388, upload-time = "2026-01-04T18:38:10.491Z" }, { url = "https://files.pythonhosted.org/packages/17/28/bf83231a3f951e11b4dfaf160e1eeba1ce29377eab30e3d2eb6ee22ff3ba/pyinstrument-5.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ebb910a32a45bde6c3fc30c578efc28a54517990e11e94b5e48a0d5479728568", size = 124456, upload-time = "2026-01-04T18:38:11.792Z" }, { url = "https://files.pythonhosted.org/packages/ac/98/762cf10896d907268629e1db08a48f128984a53e8d92b99ea96f862597e5/pyinstrument-5.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bad403c157f9c6dba7f731a6fca5bfcd8ca2701a39bcc717dcc6e0b10055ffc4", size = 149594, upload-time = "2026-01-04T18:38:13.434Z" }, { url = "https://files.pythonhosted.org/packages/1a/1b/48580e16e623d89af58b89c552c95a2ae65f70a1f4fab1d97879f34791db/pyinstrument-5.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f456cabdb95fd343c798a7f2a56688b028f981522e283c5f59bd59195b66df5", size = 148339, upload-time = "2026-01-04T18:38:14.767Z" }, { url = "https://files.pythonhosted.org/packages/62/7e/38157a8a6ec67789d8ee109fd09877ea3340df44e1a7add8f249e30a8ade/pyinstrument-5.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:4e9c4dcc1f2c4a0cd6b576e3604abc37496a7868243c9a1443ad3b9db69d590f", size = 148485, upload-time = "2026-01-04T18:38:16.121Z" }, { url = "https://files.pythonhosted.org/packages/4b/34/31ee72b19cfc48a82801024b5d653f07982154a11381a3ae65bbfdbf2c7b/pyinstrument-5.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:acf93b128328c6d80fdb85431068ac17508f0f7845e89505b0ea6130dead5ca6", size = 148106, upload-time = "2026-01-04T18:38:17.623Z" }, { url = "https://files.pythonhosted.org/packages/3b/b4/7ab20243187262d66ab062778b1ccac4ca55090752f32a83f603f4e5e3a2/pyinstrument-5.1.2-cp314-cp314-win32.whl", hash = "sha256:9c7f0167903ecff8b1d744f7e37b2bd4918e05a69cca724cb112f5ed59d1e41b", size = 126593, upload-time = "2026-01-04T18:38:18.968Z" }, { url = "https://files.pythonhosted.org/packages/9e/a0/db6a8ae3182546227f5a043b1be29b8d5f98bf973e20d922981ef206de85/pyinstrument-5.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:ce3f6b1f9a2b5d74819ecc07d631eadececf915f551474a75ad65ac580ec5a0e", size = 127358, upload-time = "2026-01-04T18:38:20.28Z" }, { url = "https://files.pythonhosted.org/packages/59/d2/719f439972b3f80e35fb5b1bcd888c3218d60dbc91957b99ffafd7ac9221/pyinstrument-5.1.2-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:af8651b239049accbeecd389d35823233f649446f76f47fd005316b05d08cef2", size = 132317, upload-time = "2026-01-04T18:38:21.669Z" }, { url = "https://files.pythonhosted.org/packages/e2/1c/0ebfef69ae926665fae635424c5647411235c3689c9a9ad69fd68de6cae2/pyinstrument-5.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c6082f1c3e43e1d22834e91ba8975f0080186df4018a04b4dd29f9623c59df1d", size = 124917, upload-time = "2026-01-04T18:38:23.385Z" }, { url = "https://files.pythonhosted.org/packages/a6/ee/5599f769f515a0f1c97443edc7394fe2b9829bf39f404c046499c1a62378/pyinstrument-5.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c031eb066ddc16425e1e2f56aad5c1ce1e27b2432a70329e5385b85e812decee", size = 157407, upload-time = "2026-01-04T18:38:24.774Z" }, { url = "https://files.pythonhosted.org/packages/fd/40/32aa865252288caef301237488ee309bd6701125888bf453d23ab764e357/pyinstrument-5.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f447ec391cad30667ba412dce41607aaa20d4a2496a7ab867e0c199f0fe3ae3d", size = 155068, upload-time = "2026-01-04T18:38:26.112Z" }, { url = "https://files.pythonhosted.org/packages/91/68/0b56a1540fe1c357dfcda82d4f5b52c87fada5962cbf18703ea39ccbbe69/pyinstrument-5.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:50299bddfc1fe0039898f895b10ef12f9db08acffb4d85326fad589cda24d2ee", size = 155186, upload-time = "2026-01-04T18:38:27.914Z" }, { url = "https://files.pythonhosted.org/packages/7a/48/7ef84abfc3e41148cf993095214f104e75ecff585e94c6e8be001e672573/pyinstrument-5.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a193ff08825ece115ececa136832acb14c491c77ab1e6b6a361905df8753d5c6", size = 153979, upload-time = "2026-01-04T18:38:29.236Z" }, { url = "https://files.pythonhosted.org/packages/8f/cf/a28ad117d58b33c1d74bcdfbbcf1603b67346883800ac7d510cff8d3bcee/pyinstrument-5.1.2-cp314-cp314t-win32.whl", hash = "sha256:de887ba19e1057bd2d86e6584f17788516a890ae6fe1b7eed9927873f416b4d8", size = 127267, upload-time = "2026-01-04T18:38:30.619Z" }, { url = "https://files.pythonhosted.org/packages/8e/97/03635143a12a5d941f545548b00f8ac39d35565321a2effb4154ed267338/pyinstrument-5.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:b6a71f5e7f53c86c9b476b30cf19509463a63581ef17ddbd8680fee37ae509db", size = 128164, upload-time = "2026-01-04T18:38:32.281Z" }, ] [[package]] name = "pymdown-extensions" version = "10.21.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown" }, { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9e/26/d1015444da4d952a1ca487a236b522eb979766f0295a0bd0c5fc089989a9/pymdown_extensions-10.21.3.tar.gz", hash = "sha256:72cfcf55f07aea0d4af2c4f11dd4e52466ddfb1bb819673146398e0bd3a77354", size = 854140, upload-time = "2026-05-13T12:57:32.267Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7e/85/545a951eecc270fcd688288c600017e2050a1aacb56c711d208586d3e470/pymdown_extensions-10.21.3-py3-none-any.whl", hash = "sha256:d7a5d08014fc571e80ca21dd6f854e31f94c489800350564d55d15b3c41e76b6", size = 269002, upload-time = "2026-05-13T12:57:30.296Z" }, ] [[package]] name = "pyparsing" version = "3.3.2" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, ] [[package]] name = "pyproject-hooks" version = "1.2.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e7/82/28175b2414effca1cdac8dc99f76d660e7a4fb0ceefa4b4ab8f5f6742925/pyproject_hooks-1.2.0.tar.gz", hash = "sha256:1e859bd5c40fae9448642dd871adf459e5e2084186e8d2c2a79a824c970da1f8", size = 19228, upload-time = "2024-09-29T09:24:13.293Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/bd/24/12818598c362d7f300f18e74db45963dbcb85150324092410c8b49405e42/pyproject_hooks-1.2.0-py3-none-any.whl", hash = "sha256:9e5c6bfa8dcc30091c74b0cf803c81fdd29d94f01992a7707bc97babb1141913", size = 10216, upload-time = "2024-09-29T09:24:11.978Z" }, ] [[package]] name = "pytest" version = "9.0.3" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "iniconfig" }, { name = "packaging" }, { name = "pluggy" }, { name = "pygments" }, { name = "tomli", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/7d/0d/549bd94f1a0a402dc8cf64563a117c0f3765662e2e668477624baeec44d5/pytest-9.0.3.tar.gz", hash = "sha256:b86ada508af81d19edeb213c681b1d48246c1a91d304c6c81a427674c17eb91c", size = 1572165, upload-time = "2026-04-07T17:16:18.027Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d4/24/a372aaf5c9b7208e7112038812994107bc65a84cd00e0354a88c2c77a617/pytest-9.0.3-py3-none-any.whl", hash = "sha256:2c5efc453d45394fdd706ade797c0a81091eccd1d6e4bccfcd476e2b8e0ab5d9", size = 375249, upload-time = "2026-04-07T17:16:16.13Z" }, ] [[package]] name = "pytest-codspeed" version = "4.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cffi" }, { name = "pytest" }, { name = "rich" }, ] sdist = { url = "https://files.pythonhosted.org/packages/9e/1e/213eb4d263140fb907e9fcc5813fdcadb864d6832bf8e2d3f7fd88ca0096/pytest_codspeed-4.5.0.tar.gz", hash = "sha256:deb6ab9c9b07eba56fcb7b97206c7e48aaff697b6f73a013d8dbe4f62e76afd3", size = 209664, upload-time = "2026-04-28T13:12:17.726Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/27/2d/dd7be8a84dac07f0b72a1372252fc66688533a7771910cdd58544a8b6f36/pytest_codspeed-4.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ddc80dda2018aae3bcac9571d47de26aacd9cfb1764b3a1704fa269474cc83f7", size = 222525, upload-time = "2026-04-28T13:11:49.264Z" }, { url = "https://files.pythonhosted.org/packages/09/06/1daee2c11b5873dd42799f989a0d4b39ba1c33dbe4adc6339f1c48edb28e/pytest_codspeed-4.5.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:108ae3fecf8a665f017f2abc92a4d9740c57eb8432436baeb489053787427504", size = 822704, upload-time = "2026-04-28T13:11:51.732Z" }, { url = "https://files.pythonhosted.org/packages/9d/47/85b5a6f3ee82cd19374abd244df6fc011e9acd559fc283bdf8cbc6e156f6/pytest_codspeed-4.5.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d8b7a880f2cac69d167affe5e85d9fc7f21beeb1c7591ef2109fbc0983b806a4", size = 823667, upload-time = "2026-04-28T13:11:53.15Z" }, { url = "https://files.pythonhosted.org/packages/60/f9/be1fa43649c9f71cc06d9f2330fb1cac3beddf6357effc9a1817f4831728/pytest_codspeed-4.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b6da6f26435512110736dd258021bbf7859caf4d2a21c7ed06a86b67a999fac7", size = 222523, upload-time = "2026-04-28T13:11:54.638Z" }, { url = "https://files.pythonhosted.org/packages/b3/89/9237a2d569b60f84183f6ae6193c6a4a135e5644ee08fed44bcf03d26545/pytest_codspeed-4.5.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be191120b1cb0252b443ef37887c94772bab4ca0c42cad7c15bcbcfcbb656ac4", size = 822696, upload-time = "2026-04-28T13:11:55.811Z" }, { url = "https://files.pythonhosted.org/packages/c7/15/7dd0a37fb85e19d8b2b7366f9615c4e17335f23060275dcfa792ce8b482f/pytest_codspeed-4.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:474730e996d424b17f7301d4b846261cca92d195b9fcb7de38599be9d68ee9ac", size = 823671, upload-time = "2026-04-28T13:11:57.147Z" }, { url = "https://files.pythonhosted.org/packages/6e/3d/bf21b10c6d497378785b47e9cefcfc4a43e543443e120c03469940f14a61/pytest_codspeed-4.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:db706a7a4200e8e236c31c77935fedcc0edbf44959ab8c156297909d9e8cfd33", size = 222601, upload-time = "2026-04-28T13:11:58.24Z" }, { url = "https://files.pythonhosted.org/packages/bc/65/97823f28ae60921bf353773490906f9095e9d208a6d4bec2e7913695a5e6/pytest_codspeed-4.5.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac844078bd8760e7fc66debe1e90b4593dfce15f60f26b334e1137d4902df3a9", size = 822916, upload-time = "2026-04-28T13:11:59.648Z" }, { url = "https://files.pythonhosted.org/packages/95/10/4763d26e8255f243c96e39543d398afb2c64900d3785b8af1898b23a6ce0/pytest_codspeed-4.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:66ecd52a277a5e5f0013e29084b49f9c5f60026d0585f58b86463cb188df5029", size = 823963, upload-time = "2026-04-28T13:12:00.976Z" }, { url = "https://files.pythonhosted.org/packages/5b/7b/8108a06fcad6160759efc0a1d44e359414a4d23e52bb7079ca95be24058e/pytest_codspeed-4.5.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:fcc3309d046082a6e0dbd1d9f2bc5c83b0446c93ff011e3880b47c69bf8042cf", size = 222602, upload-time = "2026-04-28T13:12:01.974Z" }, { url = "https://files.pythonhosted.org/packages/28/b4/4a43ce824cabe2ab8a727e31f90aa403dd2cd580576057024065a3ea74a3/pytest_codspeed-4.5.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:12b49954268ed6828ce5a8d87aff13888946c254bff4ef9472bb4d5ae5272667", size = 822868, upload-time = "2026-04-28T13:12:02.988Z" }, { url = "https://files.pythonhosted.org/packages/54/f0/a319da002c800915b9f6a63b2da1e6cdd3230cafb9dea255cec4033e85f8/pytest_codspeed-4.5.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cbeeb76d98335037670068c0d30319415f896e9c37eca510249b74684b460925", size = 823928, upload-time = "2026-04-28T13:12:04.467Z" }, { url = "https://files.pythonhosted.org/packages/da/5b/d46caecce8aa7519477df75351e312203a20836bec2fcc15256ec34c001b/pytest_codspeed-4.5.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1b73f71e7cb5c83cf5d765d5ca39d08bb1090a9d2d2268496a22ca24b1776e3a", size = 222618, upload-time = "2026-04-28T13:12:05.482Z" }, { url = "https://files.pythonhosted.org/packages/81/1d/8f34de29cfc3516df25a4553a6d7912735fbde9a276d448b1e00eb35a345/pytest_codspeed-4.5.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:399e146240a52458aa4b5fc861a88551bc52eb9e2d30c8f8b328ddebc084e4f6", size = 822814, upload-time = "2026-04-28T13:12:06.425Z" }, { url = "https://files.pythonhosted.org/packages/75/3d/089614f7bd75fee1388885b886c3f6c1a332ffdce28a4b6b77d3aac7014f/pytest_codspeed-4.5.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2d4b43f59d1c31e7c193567369f767647e466f95126671c90be084c58633544f", size = 823857, upload-time = "2026-04-28T13:12:08.081Z" }, { url = "https://files.pythonhosted.org/packages/df/69/5f4a032df6508e8c59049b2fcfce568b79e40b82878df12a2e401a034336/pytest_codspeed-4.5.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4ef8651294386c032d86070893f8349929280162cf22210dbd488697ce26de21", size = 222781, upload-time = "2026-04-28T13:12:09.448Z" }, { url = "https://files.pythonhosted.org/packages/63/42/86a1efde2968bfc83e4fcd60ef1a1094be7f83460799296a12d563522a67/pytest_codspeed-4.5.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ca31f5d0e783823a78442d5434382eb32f3885153d1833eb645c92d0c499470b", size = 828703, upload-time = "2026-04-28T13:12:10.502Z" }, { url = "https://files.pythonhosted.org/packages/58/4e/eae070c50cb82e44f831dd5b24c854cb641906732bdf74f6314e71c1f266/pytest_codspeed-4.5.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:16ddd1a9f2dc0615479b2ba3f445a2e3587ce1316296fc79224700e73db06408", size = 829278, upload-time = "2026-04-28T13:12:11.879Z" }, { url = "https://files.pythonhosted.org/packages/a3/2d/8dd5e44a5518ba3cd1d63d1f2e631e318330d28cfbe15e548e89d429e289/pytest_codspeed-4.5.0-py3-none-any.whl", hash = "sha256:b19bfb734dcbd47b78022285a6eb9f2bf6331ef1bb8c15c2775058945d5f4ce3", size = 214090, upload-time = "2026-04-28T13:12:16.755Z" }, ] [[package]] name = "pytest-httpbin" version = "2.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "httpbin" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f1/ef/84a42d941283ab6dd04a11743650abae40c1945ff8c3d6ea071426fb00bf/pytest-httpbin-2.0.0.tar.gz", hash = "sha256:3e739cad9b8f8df58952df7329d9295fe17449d3a647f49c4ce634fd81d71b8e", size = 16081, upload-time = "2023-05-08T20:12:08.108Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2e/ff/aec307ae2a6193db3f87dd5fd75738007bbb212b5237d31a4ab638215f42/pytest_httpbin-2.0.0-py2.py3-none-any.whl", hash = "sha256:d977f8095796e27a45911bbafa3587c081c9025e060e2fdb559794db2d45e82d", size = 9877, upload-time = "2023-05-08T20:12:03.997Z" }, ] [[package]] name = "pytest-trio" version = "0.8.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "outcome" }, { name = "pytest" }, { name = "trio" }, ] sdist = { url = "https://files.pythonhosted.org/packages/13/08/056279526554c6c6e6ad6d4a479a338d14dc785ac30be8bdc6ca0153c1be/pytest-trio-0.8.0.tar.gz", hash = "sha256:8363db6336a79e6c53375a2123a41ddbeccc4aa93f93788651641789a56fb52e", size = 46525, upload-time = "2022-11-01T17:24:29.352Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e9/22/71953f47e0da5852c899f58cd7a31e6100f37c632b7b9ee52d067613a844/pytest_trio-0.8.0-py3-none-any.whl", hash = "sha256:e6a7e7351ae3e8ec3f4564d30ee77d1ec66e1df611226e5618dbb32f9545c841", size = 27221, upload-time = "2022-11-01T17:24:27.501Z" }, ] [[package]] name = "python-dateutil" version = "2.9.0.post0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "six" }, ] sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] [[package]] name = "pywin32-ctypes" version = "0.2.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471, upload-time = "2024-08-14T10:15:34.626Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756, upload-time = "2024-08-14T10:15:33.187Z" }, ] [[package]] name = "pyyaml" version = "6.0.3" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, ] [[package]] name = "pyyaml-env-tag" version = "1.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "pyyaml" }, ] sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, ] [[package]] name = "readme-renderer" version = "44.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "docutils" }, { name = "nh3" }, { name = "pygments" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5a/a9/104ec9234c8448c4379768221ea6df01260cd6c2ce13182d4eac531c8342/readme_renderer-44.0.tar.gz", hash = "sha256:8712034eabbfa6805cacf1402b4eeb2a73028f72d1166d6f5cb7f9c047c5d1e1", size = 32056, upload-time = "2024-07-08T15:00:57.805Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e1/67/921ec3024056483db83953ae8e48079ad62b92db7880013ca77632921dd0/readme_renderer-44.0-py3-none-any.whl", hash = "sha256:2fbca89b81a08526aadf1357a8c2ae889ec05fb03f5da67f9769c9a592166151", size = 13310, upload-time = "2024-07-08T15:00:56.577Z" }, ] [[package]] name = "referencing" version = "0.37.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "rpds-py" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, ] [[package]] name = "requests" version = "2.33.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "certifi" }, { name = "charset-normalizer" }, { name = "idna" }, { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, ] [[package]] name = "requests-toolbelt" version = "1.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "requests" }, ] sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, ] [[package]] name = "rfc3986" version = "2.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/85/40/1520d68bfa07ab5a6f065a186815fb6610c86fe957bc065754e47f7b0840/rfc3986-2.0.0.tar.gz", hash = "sha256:97aacf9dbd4bfd829baad6e6309fa6573aaf1be3f6fa735c8ab05e46cecb261c", size = 49026, upload-time = "2022-01-10T00:52:30.832Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/ff/9a/9afaade874b2fa6c752c36f1548f718b5b83af81ed9b76628329dab81c1b/rfc3986-2.0.0-py2.py3-none-any.whl", hash = "sha256:50b1502b60e289cb37883f3dfd34532b8873c7de9f49bb546641ce9cbd256ebd", size = 31326, upload-time = "2022-01-10T00:52:29.594Z" }, ] [[package]] name = "rich" version = "15.0.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, ] [[package]] name = "rpds-py" version = "0.30.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, ] [[package]] name = "ruff" version = "0.15.13" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/24/21/a7d5c126d5b557715ef81098f3db2fe20f622a039ff2e626af28d674ab80/ruff-0.15.13.tar.gz", hash = "sha256:f9d89f17f7ba7fb2ed42921f0df75da797a9a5d71bc39049e2c687cf2baf44b7", size = 4678180, upload-time = "2026-05-14T13:44:37.869Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/c6/61/11d458dc6ac22504fd8e237b29dfd40504c7fbbcc8930402cfe51a8e63ed/ruff-0.15.13-py3-none-linux_armv6l.whl", hash = "sha256:444b580fc72fd6887e650acd3e575e18cdc79dbcf42fb4030b491057921f61f8", size = 10738279, upload-time = "2026-05-14T13:44:18.7Z" }, { url = "https://files.pythonhosted.org/packages/86/ca/caa871ee7be718c45256fada4e16a218ee3e33f0c4a46b729a60a24912e6/ruff-0.15.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6590d009e7cb7ebf36f83dbdd44a3fa48a0994ff6f1cdc1b08006abe58f98dc7", size = 11124798, upload-time = "2026-05-14T13:44:06.427Z" }, { url = "https://files.pythonhosted.org/packages/d3/19/43f5f2e568dddde567fc41f8471f9432c09563e19d3e617a48cfa52f8f0a/ruff-0.15.13-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1c26d2f66163deeb6e08d8b39fbbe983ce3c71cea06a6d7591cfd1421793c629", size = 10460761, upload-time = "2026-05-14T13:44:04.375Z" }, { url = "https://files.pythonhosted.org/packages/99/df/cf938cd6de3003178f03ad7c1ea2a6c099468c03a35037985070b37e76be/ruff-0.15.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dbd6f94b434f896308e4d57fb7bfde0d02b99f7a64b3bdab0fdfa6a864203a5", size = 10804451, upload-time = "2026-05-14T13:44:25.221Z" }, { url = "https://files.pythonhosted.org/packages/c7/7d/5d0973129b154ded2225729169d7068f26b467760b146493fde138415f23/ruff-0.15.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:bf3259f3be4d181bda591da5db2571aed6853c6a048157756448020bc6c5cd22", size = 10534285, upload-time = "2026-05-14T13:44:08.888Z" }, { url = "https://files.pythonhosted.org/packages/1f/e3/6b999bbc66cd51e5f073842bc2a3995e99c5e0e72e16b15e7261f7abf57a/ruff-0.15.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae9c17e5eb4430c154e76abc25d79a318190f5a997f38fb6b114416c5319ffc9", size = 11312063, upload-time = "2026-05-14T13:44:11.274Z" }, { url = "https://files.pythonhosted.org/packages/af/5a/642639e9f5db04f1e97fbd6e091c6fd20725bdf072fb114d00eefb9e6eb8/ruff-0.15.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e2e39bff6c341f4b577a21b801326fab0b11847f48fcaa83f00a113c9b3cb55", size = 12183079, upload-time = "2026-05-14T13:44:01.634Z" }, { url = "https://files.pythonhosted.org/packages/19/4c/7585735f6b53b0f12de13618b2f7d250a844f018822efc899df2e7b8295f/ruff-0.15.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e8d9a8e08013542e94d3220bc5b62cc3e5ef87c5f74bff367d3fac14fab013e6", size = 11440833, upload-time = "2026-05-14T13:43:59.043Z" }, { url = "https://files.pythonhosted.org/packages/e8/31/bf1a0803d077e679cfeee5f2f67290a0fa79c7385b5d9a8c17b9db2c48f0/ruff-0.15.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc411dfebe5eebe55ce041c6ae080eb7668955e866daa2fbb16692a784f1c4ca", size = 11434486, upload-time = "2026-05-14T13:44:27.761Z" }, { url = "https://files.pythonhosted.org/packages/e1/4e/62c9b999875d4f14db80f277c030578f5e249c9852d65b7ac7ad0b43c041/ruff-0.15.13-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:768494eb08b9cee54e2fd27969966f74db5a57f6eaa7a90fcb3306af34dfc4bd", size = 11385189, upload-time = "2026-05-14T13:44:13.704Z" }, { url = "https://files.pythonhosted.org/packages/fc/89/7e959047a104df3eb12863447c110140191fc5b6c4f379ea2e803fcdb0e4/ruff-0.15.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:fb75f9a3a7e42ffe117d734494e6c5e5cb3565d66e12612cb63d0e572a41a5b6", size = 10781380, upload-time = "2026-05-14T13:43:56.734Z" }, { url = "https://files.pythonhosted.org/packages/ff/52/5fd18f3b88cab63e88aa11516b3b4e1e5f720e5c330f8dbe5c26210f41f8/ruff-0.15.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:8cb74dd33bb2f6613faf7fc03b660053b5ac4f80e706d5788c6335e2a8048d51", size = 10540605, upload-time = "2026-05-14T13:44:20.748Z" }, { url = "https://files.pythonhosted.org/packages/e8/e0/9e35f338990d3e41a82875ff7053ffe97541dae81c9d02143177f381d572/ruff-0.15.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:7ef823f817fcd191dc934e984be9cf4094f808effa16f2542ad8e821ba02bbf2", size = 11036554, upload-time = "2026-05-14T13:44:16.256Z" }, { url = "https://files.pythonhosted.org/packages/c2/13/070fb048c24080fba188f66371e2a92785be257ad02242066dc7255ac6e9/ruff-0.15.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f345a13937bd7f09f6f5d19fa0721b0c103e00e7f62bc67089a8e5e037719e0b", size = 11528133, upload-time = "2026-05-14T13:44:22.808Z" }, { url = "https://files.pythonhosted.org/packages/6b/8c/b1e1666aef7fc6555094d73ae6cd981701781ae85b97ceefc0eebd0b4668/ruff-0.15.13-py3-none-win32.whl", hash = "sha256:4044f94208b3b05ba0fc4a4abd0558cf4d6459bd18325eead7fd8cc66f909b41", size = 10721455, upload-time = "2026-05-14T13:44:35.697Z" }, { url = "https://files.pythonhosted.org/packages/ab/a6/870a3e8a50590bb92be184ad928c2922f088b00d9dc5c5ec7b924ee08c22/ruff-0.15.13-py3-none-win_amd64.whl", hash = "sha256:7064884d442b7d477b4e7473d12da7f08851d2b1982763c5d3f388a19468a1a4", size = 11900409, upload-time = "2026-05-14T13:44:30.389Z" }, { url = "https://files.pythonhosted.org/packages/9b/36/9c015cd052fca743dae8cb2aeb16b551444787467db42ceab0fc968865af/ruff-0.15.13-py3-none-win_arm64.whl", hash = "sha256:2471da9bd1068c8c064b5fd9c0c4b6dddffd6369cb1cd68b29993b1709ff1b21", size = 11179336, upload-time = "2026-05-14T13:44:33.026Z" }, ] [[package]] name = "secretstorage" version = "3.5.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "jeepney" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884, upload-time = "2025-11-23T19:02:53.191Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554, upload-time = "2025-11-23T19:02:51.545Z" }, ] [[package]] name = "six" version = "1.17.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] [[package]] name = "sniffio" version = "1.3.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, ] [[package]] name = "socksio" version = "1.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/f8/5c/48a7d9495be3d1c651198fd99dbb6ce190e2274d0f28b9051307bdec6b85/socksio-1.0.0.tar.gz", hash = "sha256:f88beb3da5b5c38b9890469de67d0cb0f9d494b78b106ca1845f96c10b91c4ac", size = 19055, upload-time = "2020-04-17T15:50:34.664Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/37/c3/6eeb6034408dac0fa653d126c9204ade96b819c936e136c5e8a6897eee9c/socksio-1.0.0-py3-none-any.whl", hash = "sha256:95dc1f15f9b34e8d7b16f06d74b8ccf48f609af32ab33c608d08761c5dcbb1f3", size = 12763, upload-time = "2020-04-17T15:50:31.878Z" }, ] [[package]] name = "sortedcontainers" version = "2.4.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, ] [[package]] name = "tomli" version = "2.4.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, { url = "https://files.pythonhosted.org/packages/07/06/b823a7e818c756d9a7123ba2cda7d07bc2dd32835648d1a7b7b7a05d848d/tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54", size = 155866, upload-time = "2026-03-25T20:21:31.65Z" }, { url = "https://files.pythonhosted.org/packages/14/6f/12645cf7f08e1a20c7eb8c297c6f11d31c1b50f316a7e7e1e1de6e2e7b7e/tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a", size = 149887, upload-time = "2026-03-25T20:21:33.028Z" }, { url = "https://files.pythonhosted.org/packages/5c/e0/90637574e5e7212c09099c67ad349b04ec4d6020324539297b634a0192b0/tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897", size = 243704, upload-time = "2026-03-25T20:21:34.51Z" }, { url = "https://files.pythonhosted.org/packages/10/8f/d3ddb16c5a4befdf31a23307f72828686ab2096f068eaf56631e136c1fdd/tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f", size = 251628, upload-time = "2026-03-25T20:21:36.012Z" }, { url = "https://files.pythonhosted.org/packages/e3/f1/dbeeb9116715abee2485bf0a12d07a8f31af94d71608c171c45f64c0469d/tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d", size = 247180, upload-time = "2026-03-25T20:21:37.136Z" }, { url = "https://files.pythonhosted.org/packages/d3/74/16336ffd19ed4da28a70959f92f506233bd7cfc2332b20bdb01591e8b1d1/tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5", size = 251674, upload-time = "2026-03-25T20:21:38.298Z" }, { url = "https://files.pythonhosted.org/packages/16/f9/229fa3434c590ddf6c0aa9af64d3af4b752540686cace29e6281e3458469/tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd", size = 97976, upload-time = "2026-03-25T20:21:39.316Z" }, { url = "https://files.pythonhosted.org/packages/6a/1e/71dfd96bcc1c775420cb8befe7a9d35f2e5b1309798f009dca17b7708c1e/tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36", size = 108755, upload-time = "2026-03-25T20:21:40.248Z" }, { url = "https://files.pythonhosted.org/packages/83/7a/d34f422a021d62420b78f5c538e5b102f62bea616d1d75a13f0a88acb04a/tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd", size = 95265, upload-time = "2026-03-25T20:21:41.219Z" }, { url = "https://files.pythonhosted.org/packages/3c/fb/9a5c8d27dbab540869f7c1f8eb0abb3244189ce780ba9cd73f3770662072/tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf", size = 155726, upload-time = "2026-03-25T20:21:42.23Z" }, { url = "https://files.pythonhosted.org/packages/62/05/d2f816630cc771ad836af54f5001f47a6f611d2d39535364f148b6a92d6b/tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac", size = 149859, upload-time = "2026-03-25T20:21:43.386Z" }, { url = "https://files.pythonhosted.org/packages/ce/48/66341bdb858ad9bd0ceab5a86f90eddab127cf8b046418009f2125630ecb/tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662", size = 244713, upload-time = "2026-03-25T20:21:44.474Z" }, { url = "https://files.pythonhosted.org/packages/df/6d/c5fad00d82b3c7a3ab6189bd4b10e60466f22cfe8a08a9394185c8a8111c/tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853", size = 252084, upload-time = "2026-03-25T20:21:45.62Z" }, { url = "https://files.pythonhosted.org/packages/00/71/3a69e86f3eafe8c7a59d008d245888051005bd657760e96d5fbfb0b740c2/tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15", size = 247973, upload-time = "2026-03-25T20:21:46.937Z" }, { url = "https://files.pythonhosted.org/packages/67/50/361e986652847fec4bd5e4a0208752fbe64689c603c7ae5ea7cb16b1c0ca/tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba", size = 256223, upload-time = "2026-03-25T20:21:48.467Z" }, { url = "https://files.pythonhosted.org/packages/8c/9a/b4173689a9203472e5467217e0154b00e260621caa227b6fa01feab16998/tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6", size = 98973, upload-time = "2026-03-25T20:21:49.526Z" }, { url = "https://files.pythonhosted.org/packages/14/58/640ac93bf230cd27d002462c9af0d837779f8773bc03dee06b5835208214/tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7", size = 109082, upload-time = "2026-03-25T20:21:50.506Z" }, { url = "https://files.pythonhosted.org/packages/d5/2f/702d5e05b227401c1068f0d386d79a589bb12bf64c3d2c72ce0631e3bc49/tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232", size = 96490, upload-time = "2026-03-25T20:21:51.474Z" }, { url = "https://files.pythonhosted.org/packages/45/4b/b877b05c8ba62927d9865dd980e34a755de541eb65fffba52b4cc495d4d2/tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4", size = 164263, upload-time = "2026-03-25T20:21:52.543Z" }, { url = "https://files.pythonhosted.org/packages/24/79/6ab420d37a270b89f7195dec5448f79400d9e9c1826df982f3f8e97b24fd/tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c", size = 160736, upload-time = "2026-03-25T20:21:53.674Z" }, { url = "https://files.pythonhosted.org/packages/02/e0/3630057d8eb170310785723ed5adcdfb7d50cb7e6455f85ba8a3deed642b/tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d", size = 270717, upload-time = "2026-03-25T20:21:55.129Z" }, { url = "https://files.pythonhosted.org/packages/7a/b4/1613716072e544d1a7891f548d8f9ec6ce2faf42ca65acae01d76ea06bb0/tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41", size = 278461, upload-time = "2026-03-25T20:21:56.228Z" }, { url = "https://files.pythonhosted.org/packages/05/38/30f541baf6a3f6df77b3df16b01ba319221389e2da59427e221ef417ac0c/tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c", size = 274855, upload-time = "2026-03-25T20:21:57.653Z" }, { url = "https://files.pythonhosted.org/packages/77/a3/ec9dd4fd2c38e98de34223b995a3b34813e6bdadf86c75314c928350ed14/tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f", size = 283144, upload-time = "2026-03-25T20:21:59.089Z" }, { url = "https://files.pythonhosted.org/packages/ef/be/605a6261cac79fba2ec0c9827e986e00323a1945700969b8ee0b30d85453/tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8", size = 108683, upload-time = "2026-03-25T20:22:00.214Z" }, { url = "https://files.pythonhosted.org/packages/12/64/da524626d3b9cc40c168a13da8335fe1c51be12c0a63685cc6db7308daae/tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26", size = 121196, upload-time = "2026-03-25T20:22:01.169Z" }, { url = "https://files.pythonhosted.org/packages/5a/cd/e80b62269fc78fc36c9af5a6b89c835baa8af28ff5ad28c7028d60860320/tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396", size = 100393, upload-time = "2026-03-25T20:22:02.137Z" }, { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, ] [[package]] name = "trio" version = "0.31.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "attrs" }, { name = "cffi", marker = "implementation_name != 'pypy' and os_name == 'nt'" }, { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "outcome" }, { name = "sniffio" }, { name = "sortedcontainers" }, ] sdist = { url = "https://files.pythonhosted.org/packages/76/8f/c6e36dd11201e2a565977d8b13f0b027ba4593c1a80bed5185489178e257/trio-0.31.0.tar.gz", hash = "sha256:f71d551ccaa79d0cb73017a33ef3264fde8335728eb4c6391451fe5d253a9d5b", size = 605825, upload-time = "2025-09-09T15:17:15.242Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/31/5b/94237a3485620dbff9741df02ff6d8acaa5fdec67d81ab3f62e4d8511bf7/trio-0.31.0-py3-none-any.whl", hash = "sha256:b5d14cd6293d79298b49c3485ffd9c07e3ce03a6da8c7dfbe0cb3dd7dc9a4774", size = 512679, upload-time = "2025-09-09T15:17:13.821Z" }, ] [[package]] name = "trio-typing" version = "0.10.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "async-generator" }, { name = "importlib-metadata" }, { name = "mypy-extensions" }, { name = "packaging" }, { name = "trio" }, { name = "typing-extensions" }, ] sdist = { url = "https://files.pythonhosted.org/packages/b5/74/a87aafa40ec3a37089148b859892cbe2eef08d132c816d58a60459be5337/trio-typing-0.10.0.tar.gz", hash = "sha256:065ee684296d52a8ab0e2374666301aec36ee5747ac0e7a61f230250f8907ac3", size = 38747, upload-time = "2023-12-01T02:54:55.508Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/89/ff/9bd795273eb14fac7f6a59d16cc8c4d0948a619a1193d375437c7f50f3eb/trio_typing-0.10.0-py3-none-any.whl", hash = "sha256:6d0e7ec9d837a2fe03591031a172533fbf4a1a95baf369edebfc51d5a49f0264", size = 42224, upload-time = "2023-12-01T02:54:54.1Z" }, ] [[package]] name = "trustme" version = "1.2.1" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "cryptography" }, { name = "idna" }, ] sdist = { url = "https://files.pythonhosted.org/packages/4b/c5/931476f4cf1cd9e736f32651005078061a50dc164a2569fb874e00eb2786/trustme-1.2.1.tar.gz", hash = "sha256:6528ba2bbc7f2db41f33825c8dd13e3e3eb9d334ba0f909713c8c3139f4ae47f", size = 26844, upload-time = "2025-01-02T01:55:32.632Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/b5/f3/c34dbabf6da5eda56fe923226769d40e11806952cd7f46655dd06e10f018/trustme-1.2.1-py3-none-any.whl", hash = "sha256:d768e5fc57c86dfc5ec9365102e9b092541cd6954b35d8c1eea01a84f35a762a", size = 16530, upload-time = "2025-01-02T01:55:30.181Z" }, ] [[package]] name = "truststore" version = "0.10.4" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/53/a3/1585216310e344e8102c22482f6060c7a6ea0322b63e026372e6dcefcfd6/truststore-0.10.4.tar.gz", hash = "sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301", size = 26169, upload-time = "2025-08-12T18:49:02.73Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/19/97/56608b2249fe206a67cd573bc93cd9896e1efb9e98bce9c163bcdc704b88/truststore-0.10.4-py3-none-any.whl", hash = "sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981", size = 18660, upload-time = "2025-08-12T18:49:01.46Z" }, ] [[package]] name = "twine" version = "6.1.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "id" }, { name = "keyring", marker = "platform_machine != 'ppc64le' and platform_machine != 's390x'" }, { name = "packaging" }, { name = "readme-renderer" }, { name = "requests" }, { name = "requests-toolbelt" }, { name = "rfc3986" }, { name = "rich" }, { name = "urllib3" }, ] sdist = { url = "https://files.pythonhosted.org/packages/c8/a2/6df94fc5c8e2170d21d7134a565c3a8fb84f9797c1dd65a5976aaf714418/twine-6.1.0.tar.gz", hash = "sha256:be324f6272eff91d07ee93f251edf232fc647935dd585ac003539b42404a8dbd", size = 168404, upload-time = "2025-01-21T18:45:26.758Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7c/b6/74e927715a285743351233f33ea3c684528a0d374d2e43ff9ce9585b73fe/twine-6.1.0-py3-none-any.whl", hash = "sha256:a47f973caf122930bf0fbbf17f80b83bc1602c9ce393c7845f289a3001dc5384", size = 40791, upload-time = "2025-01-21T18:45:24.584Z" }, ] [[package]] name = "typing-extensions" version = "4.15.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, ] [[package]] name = "urllib3" version = "2.7.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, ] [[package]] name = "uvicorn" version = "0.46.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] sdist = { url = "https://files.pythonhosted.org/packages/1f/93/041fca8274050e40e6791f267d82e0e2e27dd165627bd640d3e0e378d877/uvicorn-0.46.0.tar.gz", hash = "sha256:fb9da0926999cc6cb22dc7cd71a94a632f078e6ae47ff683c5c420750fb7413d", size = 88758, upload-time = "2026-04-23T07:16:00.151Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/31/a3/5b1562db76a5a488274b2332a97199b32d0442aca0ed193697fd47786316/uvicorn-0.46.0-py3-none-any.whl", hash = "sha256:bbebbcbed972d162afca128605223022bedd345b7bc7855ce66deb31487a9048", size = 70926, upload-time = "2026-04-23T07:15:58.355Z" }, ] [[package]] name = "watchdog" version = "6.0.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/0c/56/90994d789c61df619bfc5ce2ecdabd5eeff564e1eb47512bd01b5e019569/watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26", size = 96390, upload-time = "2024-11-01T14:06:24.793Z" }, { url = "https://files.pythonhosted.org/packages/55/46/9a67ee697342ddf3c6daa97e3a587a56d6c4052f881ed926a849fcf7371c/watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112", size = 88389, upload-time = "2024-11-01T14:06:27.112Z" }, { url = "https://files.pythonhosted.org/packages/44/65/91b0985747c52064d8701e1075eb96f8c40a79df889e59a399453adfb882/watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3", size = 89020, upload-time = "2024-11-01T14:06:29.876Z" }, { url = "https://files.pythonhosted.org/packages/e0/24/d9be5cd6642a6aa68352ded4b4b10fb0d7889cb7f45814fb92cecd35f101/watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c", size = 96393, upload-time = "2024-11-01T14:06:31.756Z" }, { url = "https://files.pythonhosted.org/packages/63/7a/6013b0d8dbc56adca7fdd4f0beed381c59f6752341b12fa0886fa7afc78b/watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2", size = 88392, upload-time = "2024-11-01T14:06:32.99Z" }, { url = "https://files.pythonhosted.org/packages/d1/40/b75381494851556de56281e053700e46bff5b37bf4c7267e858640af5a7f/watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c", size = 89019, upload-time = "2024-11-01T14:06:34.963Z" }, { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, { url = "https://files.pythonhosted.org/packages/30/ad/d17b5d42e28a8b91f8ed01cb949da092827afb9995d4559fd448d0472763/watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881", size = 87902, upload-time = "2024-11-01T14:06:53.119Z" }, { url = "https://files.pythonhosted.org/packages/5c/ca/c3649991d140ff6ab67bfc85ab42b165ead119c9e12211e08089d763ece5/watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11", size = 88380, upload-time = "2024-11-01T14:06:55.19Z" }, { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, ] [[package]] name = "werkzeug" version = "3.1.8" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "markupsafe" }, ] sdist = { url = "https://files.pythonhosted.org/packages/dd/b2/381be8cfdee792dd117872481b6e378f85c957dd7c5bca38897b08f765fd/werkzeug-3.1.8.tar.gz", hash = "sha256:9bad61a4268dac112f1c5cd4630a56ede601b6ed420300677a869083d70a4c44", size = 875852, upload-time = "2026-04-02T18:49:14.268Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/93/8c/2e650f2afeb7ee576912636c23ddb621c91ac6a98e66dc8d29c3c69446e1/werkzeug-3.1.8-py3-none-any.whl", hash = "sha256:63a77fb8892bf28ebc3178683445222aa500e48ebad5ec77b0ad80f8726b1f50", size = 226459, upload-time = "2026-04-02T18:49:12.72Z" }, ] [[package]] name = "yarl" version = "1.23.0" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] sdist = { url = "https://files.pythonhosted.org/packages/23/6e/beb1beec874a72f23815c1434518bfc4ed2175065173fb138c3705f658d4/yarl-1.23.0.tar.gz", hash = "sha256:53b1ea6ca88ebd4420379c330aea57e258408dd0df9af0992e5de2078dc9f5d5", size = 194676, upload-time = "2026-03-01T22:07:53.373Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/8b/0d/9cc638702f6fc3c7a3685bcc8cf2a9ed7d6206e932a49f5242658047ef51/yarl-1.23.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cff6d44cb13d39db2663a22b22305d10855efa0fa8015ddeacc40bc59b9d8107", size = 123764, upload-time = "2026-03-01T22:04:09.7Z" }, { url = "https://files.pythonhosted.org/packages/7a/35/5a553687c5793df5429cd1db45909d4f3af7eee90014888c208d086a44f0/yarl-1.23.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e4c53f8347cd4200f0d70a48ad059cabaf24f5adc6ba08622a23423bc7efa10d", size = 86282, upload-time = "2026-03-01T22:04:11.892Z" }, { url = "https://files.pythonhosted.org/packages/68/2e/c5a2234238f8ce37a8312b52801ee74117f576b1539eec8404a480434acc/yarl-1.23.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2a6940a074fb3c48356ed0158a3ca5699c955ee4185b4d7d619be3c327143e05", size = 86053, upload-time = "2026-03-01T22:04:13.292Z" }, { url = "https://files.pythonhosted.org/packages/74/3f/bbd8ff36fb038622797ffbaf7db314918bb4d76f1cc8a4f9ca7a55fe5195/yarl-1.23.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ed5f69ce7be7902e5c70ea19eb72d20abf7d725ab5d49777d696e32d4fc1811d", size = 99395, upload-time = "2026-03-01T22:04:15.133Z" }, { url = "https://files.pythonhosted.org/packages/77/04/9516bc4e269d2a3ec9c6779fcdeac51ce5b3a9b0156f06ac7152e5bba864/yarl-1.23.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:389871e65468400d6283c0308e791a640b5ab5c83bcee02a2f51295f95e09748", size = 92143, upload-time = "2026-03-01T22:04:16.829Z" }, { url = "https://files.pythonhosted.org/packages/c7/63/88802d1f6b1cb1fc67d67a58cd0cf8a1790de4ce7946e434240f1d60ab4a/yarl-1.23.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:dda608c88cf709b1d406bdfcd84d8d63cff7c9e577a403c6108ce8ce9dcc8764", size = 107643, upload-time = "2026-03-01T22:04:18.519Z" }, { url = "https://files.pythonhosted.org/packages/8e/db/4f9b838f4d8bdd6f0f385aed8bbf21c71ed11a0b9983305c302cbd557815/yarl-1.23.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8c4fe09e0780c6c3bf2b7d4af02ee2394439d11a523bbcf095cf4747c2932007", size = 108700, upload-time = "2026-03-01T22:04:20.373Z" }, { url = "https://files.pythonhosted.org/packages/50/12/95a1d33f04a79c402664070d43b8b9f72dc18914e135b345b611b0b1f8cc/yarl-1.23.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:31c9921eb8bd12633b41ad27686bbb0b1a2a9b8452bfdf221e34f311e9942ed4", size = 102769, upload-time = "2026-03-01T22:04:23.055Z" }, { url = "https://files.pythonhosted.org/packages/86/65/91a0285f51321369fd1a8308aa19207520c5f0587772cfc2e03fc2467e90/yarl-1.23.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5f10fd85e4b75967468af655228fbfd212bdf66db1c0d135065ce288982eda26", size = 101114, upload-time = "2026-03-01T22:04:25.031Z" }, { url = "https://files.pythonhosted.org/packages/58/80/c7c8244fc3e5bc483dc71a09560f43b619fab29301a0f0a8f936e42865c7/yarl-1.23.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dbf507e9ef5688bada447a24d68b4b58dd389ba93b7afc065a2ba892bea54769", size = 98883, upload-time = "2026-03-01T22:04:27.281Z" }, { url = "https://files.pythonhosted.org/packages/86/e7/71ca9cc9ca79c0b7d491216177d1aed559d632947b8ffb0ee60f7d8b23e3/yarl-1.23.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:85e9beda1f591bc73e77ea1c51965c68e98dafd0fec72cdd745f77d727466716", size = 94172, upload-time = "2026-03-01T22:04:28.554Z" }, { url = "https://files.pythonhosted.org/packages/6a/3f/6c6c8a0fe29c26fb2db2e8d32195bb84ec1bfb8f1d32e7f73b787fcf349b/yarl-1.23.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:0e1fdaa14ef51366d7757b45bde294e95f6c8c049194e793eedb8387c86d5993", size = 107010, upload-time = "2026-03-01T22:04:30.385Z" }, { url = "https://files.pythonhosted.org/packages/56/38/12730c05e5ad40a76374d440ed8b0899729a96c250516d91c620a6e38fc2/yarl-1.23.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:75e3026ab649bf48f9a10c0134512638725b521340293f202a69b567518d94e0", size = 100285, upload-time = "2026-03-01T22:04:31.752Z" }, { url = "https://files.pythonhosted.org/packages/34/92/6a7be9239f2347234e027284e7a5f74b1140cc86575e7b469d13fba1ebfe/yarl-1.23.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:80e6d33a3d42a7549b409f199857b4fb54e2103fc44fb87605b6663b7a7ff750", size = 108230, upload-time = "2026-03-01T22:04:33.844Z" }, { url = "https://files.pythonhosted.org/packages/5e/81/4aebccfa9376bd98b9d8bfad20621a57d3e8cfc5b8631c1fa5f62cdd03f4/yarl-1.23.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ec2f42d41ccbd5df0270d7df31618a8ee267bfa50997f5d720ddba86c4a83a6", size = 103008, upload-time = "2026-03-01T22:04:35.856Z" }, { url = "https://files.pythonhosted.org/packages/38/0f/0b4e3edcec794a86b853b0c6396c0a888d72dfce19b2d88c02ac289fb6c1/yarl-1.23.0-cp310-cp310-win32.whl", hash = "sha256:debe9c4f41c32990771be5c22b56f810659f9ddf3d63f67abfdcaa2c6c9c5c1d", size = 83073, upload-time = "2026-03-01T22:04:38.268Z" }, { url = "https://files.pythonhosted.org/packages/a0/71/ad95c33da18897e4c636528bbc24a1dd23fe16797de8bc4ec667b8db0ba4/yarl-1.23.0-cp310-cp310-win_amd64.whl", hash = "sha256:ab5f043cb8a2d71c981c09c510da013bc79fd661f5c60139f00dd3c3cc4f2ffb", size = 87328, upload-time = "2026-03-01T22:04:39.558Z" }, { url = "https://files.pythonhosted.org/packages/e2/14/dfa369523c79bccf9c9c746b0a63eb31f65db9418ac01275f7950962e504/yarl-1.23.0-cp310-cp310-win_arm64.whl", hash = "sha256:263cd4f47159c09b8b685890af949195b51d1aa82ba451c5847ca9bc6413c220", size = 82463, upload-time = "2026-03-01T22:04:41.454Z" }, { url = "https://files.pythonhosted.org/packages/a2/aa/60da938b8f0997ba3a911263c40d82b6f645a67902a490b46f3355e10fae/yarl-1.23.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b35d13d549077713e4414f927cdc388d62e543987c572baee613bf82f11a4b99", size = 123641, upload-time = "2026-03-01T22:04:42.841Z" }, { url = "https://files.pythonhosted.org/packages/24/84/e237607faf4e099dbb8a4f511cfd5efcb5f75918baad200ff7380635631b/yarl-1.23.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cbb0fef01f0c6b38cb0f39b1f78fc90b807e0e3c86a7ff3ce74ad77ce5c7880c", size = 86248, upload-time = "2026-03-01T22:04:44.757Z" }, { url = "https://files.pythonhosted.org/packages/b2/0d/71ceabc14c146ba8ee3804ca7b3d42b1664c8440439de5214d366fec7d3a/yarl-1.23.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc52310451fc7c629e13c4e061cbe2dd01684d91f2f8ee2821b083c58bd72432", size = 85988, upload-time = "2026-03-01T22:04:46.365Z" }, { url = "https://files.pythonhosted.org/packages/8c/6c/4a90d59c572e46b270ca132aca66954f1175abd691f74c1ef4c6711828e2/yarl-1.23.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2c6b50c7b0464165472b56b42d4c76a7b864597007d9c085e8b63e185cf4a7a", size = 100566, upload-time = "2026-03-01T22:04:47.639Z" }, { url = "https://files.pythonhosted.org/packages/49/fb/c438fb5108047e629f6282a371e6e91cf3f97ee087c4fb748a1f32ceef55/yarl-1.23.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:aafe5dcfda86c8af00386d7781d4c2181b5011b7be3f2add5e99899ea925df05", size = 92079, upload-time = "2026-03-01T22:04:48.925Z" }, { url = "https://files.pythonhosted.org/packages/d9/13/d269aa1aed3e4f50a5a103f96327210cc5fa5dd2d50882778f13c7a14606/yarl-1.23.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ee33b875f0b390564c1fb7bc528abf18c8ee6073b201c6ae8524aca778e2d83", size = 108741, upload-time = "2026-03-01T22:04:50.838Z" }, { url = "https://files.pythonhosted.org/packages/85/fb/115b16f22c37ea4437d323e472945bea97301c8ec6089868fa560abab590/yarl-1.23.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c41e021bc6d7affb3364dc1e1e5fa9582b470f283748784bd6ea0558f87f42c", size = 108099, upload-time = "2026-03-01T22:04:52.499Z" }, { url = "https://files.pythonhosted.org/packages/9a/64/c53487d9f4968045b8afa51aed7ca44f58b2589e772f32745f3744476c82/yarl-1.23.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:99c8a9ed30f4164bc4c14b37a90208836cbf50d4ce2a57c71d0f52c7fb4f7598", size = 102678, upload-time = "2026-03-01T22:04:55.176Z" }, { url = "https://files.pythonhosted.org/packages/85/59/cd98e556fbb2bf8fab29c1a722f67ad45c5f3447cac798ab85620d1e70af/yarl-1.23.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f2af5c81a1f124609d5f33507082fc3f739959d4719b56877ab1ee7e7b3d602b", size = 100803, upload-time = "2026-03-01T22:04:56.588Z" }, { url = "https://files.pythonhosted.org/packages/9e/c0/b39770b56d4a9f0bb5f77e2f1763cd2d75cc2f6c0131e3b4c360348fcd65/yarl-1.23.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6b41389c19b07c760c7e427a3462e8ab83c4bb087d127f0e854c706ce1b9215c", size = 100163, upload-time = "2026-03-01T22:04:58.492Z" }, { url = "https://files.pythonhosted.org/packages/e7/64/6980f99ab00e1f0ff67cb84766c93d595b067eed07439cfccfc8fb28c1a6/yarl-1.23.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1dc702e42d0684f42d6519c8d581e49c96cefaaab16691f03566d30658ee8788", size = 93859, upload-time = "2026-03-01T22:05:00.268Z" }, { url = "https://files.pythonhosted.org/packages/38/69/912e6c5e146793e5d4b5fe39ff5b00f4d22463dfd5a162bec565ac757673/yarl-1.23.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:0e40111274f340d32ebcc0a5668d54d2b552a6cca84c9475859d364b380e3222", size = 108202, upload-time = "2026-03-01T22:05:02.273Z" }, { url = "https://files.pythonhosted.org/packages/59/97/35ca6767524687ad64e5f5c31ad54bc76d585585a9fcb40f649e7e82ffed/yarl-1.23.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:4764a6a7588561a9aef92f65bda2c4fb58fe7c675c0883862e6df97559de0bfb", size = 99866, upload-time = "2026-03-01T22:05:03.597Z" }, { url = "https://files.pythonhosted.org/packages/d3/1c/1a3387ee6d73589f6f2a220ae06f2984f6c20b40c734989b0a44f5987308/yarl-1.23.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:03214408cfa590df47728b84c679ae4ef00be2428e11630277be0727eba2d7cc", size = 107852, upload-time = "2026-03-01T22:05:04.986Z" }, { url = "https://files.pythonhosted.org/packages/a4/b8/35c0750fcd5a3f781058bfd954515dd4b1eab45e218cbb85cf11132215f1/yarl-1.23.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:170e26584b060879e29fac213e4228ef063f39128723807a312e5c7fec28eff2", size = 102919, upload-time = "2026-03-01T22:05:06.397Z" }, { url = "https://files.pythonhosted.org/packages/e5/1c/9a1979aec4a81896d597bcb2177827f2dbee3f5b7cc48b2d0dadb644b41d/yarl-1.23.0-cp311-cp311-win32.whl", hash = "sha256:51430653db848d258336cfa0244427b17d12db63d42603a55f0d4546f50f25b5", size = 82602, upload-time = "2026-03-01T22:05:08.444Z" }, { url = "https://files.pythonhosted.org/packages/93/22/b85eca6fa2ad9491af48c973e4c8cf6b103a73dbb271fe3346949449fca0/yarl-1.23.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf49a3ae946a87083ef3a34c8f677ae4243f5b824bfc4c69672e72b3d6719d46", size = 87461, upload-time = "2026-03-01T22:05:10.145Z" }, { url = "https://files.pythonhosted.org/packages/93/95/07e3553fe6f113e6864a20bdc53a78113cda3b9ced8784ee52a52c9f80d8/yarl-1.23.0-cp311-cp311-win_arm64.whl", hash = "sha256:b39cb32a6582750b6cc77bfb3c49c0f8760dc18dc96ec9fb55fbb0f04e08b928", size = 82336, upload-time = "2026-03-01T22:05:11.554Z" }, { url = "https://files.pythonhosted.org/packages/88/8a/94615bc31022f711add374097ad4144d569e95ff3c38d39215d07ac153a0/yarl-1.23.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1932b6b8bba8d0160a9d1078aae5838a66039e8832d41d2992daa9a3a08f7860", size = 124737, upload-time = "2026-03-01T22:05:12.897Z" }, { url = "https://files.pythonhosted.org/packages/e3/6f/c6554045d59d64052698add01226bc867b52fe4a12373415d7991fdca95d/yarl-1.23.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:411225bae281f114067578891bc75534cfb3d92a3b4dfef7a6ca78ba354e6069", size = 87029, upload-time = "2026-03-01T22:05:14.376Z" }, { url = "https://files.pythonhosted.org/packages/19/2a/725ecc166d53438bc88f76822ed4b1e3b10756e790bafd7b523fe97c322d/yarl-1.23.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:13a563739ae600a631c36ce096615fe307f131344588b0bc0daec108cdb47b25", size = 86310, upload-time = "2026-03-01T22:05:15.71Z" }, { url = "https://files.pythonhosted.org/packages/99/30/58260ed98e6ff7f90ba84442c1ddd758c9170d70327394a6227b310cd60f/yarl-1.23.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9cbf44c5cb4a7633d078788e1b56387e3d3cf2b8139a3be38040b22d6c3221c8", size = 97587, upload-time = "2026-03-01T22:05:17.384Z" }, { url = "https://files.pythonhosted.org/packages/76/0a/8b08aac08b50682e65759f7f8dde98ae8168f72487e7357a5d684c581ef9/yarl-1.23.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:53ad387048f6f09a8969631e4de3f1bf70c50e93545d64af4f751b2498755072", size = 92528, upload-time = "2026-03-01T22:05:18.804Z" }, { url = "https://files.pythonhosted.org/packages/52/07/0b7179101fe5f8385ec6c6bb5d0cb9f76bd9fb4a769591ab6fb5cdbfc69a/yarl-1.23.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4a59ba56f340334766f3a4442e0efd0af895fae9e2b204741ef885c446b3a1a8", size = 105339, upload-time = "2026-03-01T22:05:20.235Z" }, { url = "https://files.pythonhosted.org/packages/d3/8a/36d82869ab5ec829ca8574dfcb92b51286fcfb1e9c7a73659616362dc880/yarl-1.23.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:803a3c3ce4acc62eaf01eaca1208dcf0783025ef27572c3336502b9c232005e7", size = 105061, upload-time = "2026-03-01T22:05:22.268Z" }, { url = "https://files.pythonhosted.org/packages/66/3e/868e5c3364b6cee19ff3e1a122194fa4ce51def02c61023970442162859e/yarl-1.23.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a3d2bff8f37f8d0f96c7ec554d16945050d54462d6e95414babaa18bfafc7f51", size = 100132, upload-time = "2026-03-01T22:05:23.638Z" }, { url = "https://files.pythonhosted.org/packages/cf/26/9c89acf82f08a52cb52d6d39454f8d18af15f9d386a23795389d1d423823/yarl-1.23.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c75eb09e8d55bceb4367e83496ff8ef2bc7ea6960efb38e978e8073ea59ecb67", size = 99289, upload-time = "2026-03-01T22:05:25.749Z" }, { url = "https://files.pythonhosted.org/packages/6f/54/5b0db00d2cb056922356104468019c0a132e89c8d3ab67d8ede9f4483d2a/yarl-1.23.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877b0738624280e34c55680d6054a307aa94f7d52fa0e3034a9cc6e790871da7", size = 96950, upload-time = "2026-03-01T22:05:27.318Z" }, { url = "https://files.pythonhosted.org/packages/f6/40/10fa93811fd439341fad7e0718a86aca0de9548023bbb403668d6555acab/yarl-1.23.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b5405bb8f0e783a988172993cfc627e4d9d00432d6bbac65a923041edacf997d", size = 93960, upload-time = "2026-03-01T22:05:28.738Z" }, { url = "https://files.pythonhosted.org/packages/bc/d2/8ae2e6cd77d0805f4526e30ec43b6f9a3dfc542d401ac4990d178e4bf0cf/yarl-1.23.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c3a3598a832590c5a3ce56ab5576361b5688c12cb1d39429cf5dba30b510760", size = 104703, upload-time = "2026-03-01T22:05:30.438Z" }, { url = "https://files.pythonhosted.org/packages/2f/0c/b3ceacf82c3fe21183ce35fa2acf5320af003d52bc1fcf5915077681142e/yarl-1.23.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:8419ebd326430d1cbb7efb5292330a2cf39114e82df5cc3d83c9a0d5ebeaf2f2", size = 98325, upload-time = "2026-03-01T22:05:31.835Z" }, { url = "https://files.pythonhosted.org/packages/9d/e0/12900edd28bdab91a69bd2554b85ad7b151f64e8b521fe16f9ad2f56477a/yarl-1.23.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:be61f6fff406ca40e3b1d84716fde398fc08bc63dd96d15f3a14230a0973ed86", size = 105067, upload-time = "2026-03-01T22:05:33.358Z" }, { url = "https://files.pythonhosted.org/packages/15/61/74bb1182cf79c9bbe4eb6b1f14a57a22d7a0be5e9cedf8e2d5c2086474c3/yarl-1.23.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3ceb13c5c858d01321b5d9bb65e4cf37a92169ea470b70fec6f236b2c9dd7e34", size = 100285, upload-time = "2026-03-01T22:05:35.4Z" }, { url = "https://files.pythonhosted.org/packages/69/7f/cd5ef733f2550de6241bd8bd8c3febc78158b9d75f197d9c7baa113436af/yarl-1.23.0-cp312-cp312-win32.whl", hash = "sha256:fffc45637bcd6538de8b85f51e3df3223e4ad89bccbfca0481c08c7fc8b7ed7d", size = 82359, upload-time = "2026-03-01T22:05:36.811Z" }, { url = "https://files.pythonhosted.org/packages/f5/be/25216a49daeeb7af2bec0db22d5e7df08ed1d7c9f65d78b14f3b74fd72fc/yarl-1.23.0-cp312-cp312-win_amd64.whl", hash = "sha256:f69f57305656a4852f2a7203efc661d8c042e6cc67f7acd97d8667fb448a426e", size = 87674, upload-time = "2026-03-01T22:05:38.171Z" }, { url = "https://files.pythonhosted.org/packages/d2/35/aeab955d6c425b227d5b7247eafb24f2653fedc32f95373a001af5dfeb9e/yarl-1.23.0-cp312-cp312-win_arm64.whl", hash = "sha256:6e87a6e8735b44816e7db0b2fbc9686932df473c826b0d9743148432e10bb9b9", size = 81879, upload-time = "2026-03-01T22:05:40.006Z" }, { url = "https://files.pythonhosted.org/packages/9a/4b/a0a6e5d0ee8a2f3a373ddef8a4097d74ac901ac363eea1440464ccbe0898/yarl-1.23.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:16c6994ac35c3e74fb0ae93323bf8b9c2a9088d55946109489667c510a7d010e", size = 123796, upload-time = "2026-03-01T22:05:41.412Z" }, { url = "https://files.pythonhosted.org/packages/67/b6/8925d68af039b835ae876db5838e82e76ec87b9782ecc97e192b809c4831/yarl-1.23.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4a42e651629dafb64fd5b0286a3580613702b5809ad3f24934ea87595804f2c5", size = 86547, upload-time = "2026-03-01T22:05:42.841Z" }, { url = "https://files.pythonhosted.org/packages/ae/50/06d511cc4b8e0360d3c94af051a768e84b755c5eb031b12adaaab6dec6e5/yarl-1.23.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7c6b9461a2a8b47c65eef63bb1c76a4f1c119618ffa99ea79bc5bb1e46c5821b", size = 85854, upload-time = "2026-03-01T22:05:44.85Z" }, { url = "https://files.pythonhosted.org/packages/c4/f4/4e30b250927ffdab4db70da08b9b8d2194d7c7b400167b8fbeca1e4701ca/yarl-1.23.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2569b67d616eab450d262ca7cb9f9e19d2f718c70a8b88712859359d0ab17035", size = 98351, upload-time = "2026-03-01T22:05:46.836Z" }, { url = "https://files.pythonhosted.org/packages/86/fc/4118c5671ea948208bdb1492d8b76bdf1453d3e73df051f939f563e7dcc5/yarl-1.23.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e9d9a4d06d3481eab79803beb4d9bd6f6a8e781ec078ac70d7ef2dcc29d1bea5", size = 92711, upload-time = "2026-03-01T22:05:48.316Z" }, { url = "https://files.pythonhosted.org/packages/56/11/1ed91d42bd9e73c13dc9e7eb0dd92298d75e7ac4dd7f046ad0c472e231cd/yarl-1.23.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f514f6474e04179d3d33175ed3f3e31434d3130d42ec153540d5b157deefd735", size = 106014, upload-time = "2026-03-01T22:05:50.028Z" }, { url = "https://files.pythonhosted.org/packages/ce/c9/74e44e056a23fbc33aca71779ef450ca648a5bc472bdad7a82339918f818/yarl-1.23.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fda207c815b253e34f7e1909840fd14299567b1c0eb4908f8c2ce01a41265401", size = 105557, upload-time = "2026-03-01T22:05:51.416Z" }, { url = "https://files.pythonhosted.org/packages/66/fe/b1e10b08d287f518994f1e2ff9b6d26f0adeecd8dd7d533b01bab29a3eda/yarl-1.23.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34b6cf500e61c90f305094911f9acc9c86da1a05a7a3f5be9f68817043f486e4", size = 101559, upload-time = "2026-03-01T22:05:52.872Z" }, { url = "https://files.pythonhosted.org/packages/72/59/c5b8d94b14e3d3c2a9c20cb100119fd534ab5a14b93673ab4cc4a4141ea5/yarl-1.23.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d7504f2b476d21653e4d143f44a175f7f751cd41233525312696c76aa3dbb23f", size = 100502, upload-time = "2026-03-01T22:05:54.954Z" }, { url = "https://files.pythonhosted.org/packages/77/4f/96976cb54cbfc5c9fd73ed4c51804f92f209481d1fb190981c0f8a07a1d7/yarl-1.23.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:578110dd426f0d209d1509244e6d4a3f1a3e9077655d98c5f22583d63252a08a", size = 98027, upload-time = "2026-03-01T22:05:56.409Z" }, { url = "https://files.pythonhosted.org/packages/63/6e/904c4f476471afdbad6b7e5b70362fb5810e35cd7466529a97322b6f5556/yarl-1.23.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:609d3614d78d74ebe35f54953c5bbd2ac647a7ddb9c30a5d877580f5e86b22f2", size = 95369, upload-time = "2026-03-01T22:05:58.141Z" }, { url = "https://files.pythonhosted.org/packages/9d/40/acfcdb3b5f9d68ef499e39e04d25e141fe90661f9d54114556cf83be8353/yarl-1.23.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4966242ec68afc74c122f8459abd597afd7d8a60dc93d695c1334c5fd25f762f", size = 105565, upload-time = "2026-03-01T22:06:00.286Z" }, { url = "https://files.pythonhosted.org/packages/5e/c6/31e28f3a6ba2869c43d124f37ea5260cac9c9281df803c354b31f4dd1f3c/yarl-1.23.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e0fd068364a6759bc794459f0a735ab151d11304346332489c7972bacbe9e72b", size = 99813, upload-time = "2026-03-01T22:06:01.712Z" }, { url = "https://files.pythonhosted.org/packages/08/1f/6f65f59e72d54aa467119b63fc0b0b1762eff0232db1f4720cd89e2f4a17/yarl-1.23.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:39004f0ad156da43e86aa71f44e033de68a44e5a31fc53507b36dd253970054a", size = 105632, upload-time = "2026-03-01T22:06:03.188Z" }, { url = "https://files.pythonhosted.org/packages/a3/c4/18b178a69935f9e7a338127d5b77d868fdc0f0e49becd286d51b3a18c61d/yarl-1.23.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e5723c01a56c5028c807c701aa66722916d2747ad737a046853f6c46f4875543", size = 101895, upload-time = "2026-03-01T22:06:04.651Z" }, { url = "https://files.pythonhosted.org/packages/8f/54/f5b870b5505663911dba950a8e4776a0dbd51c9c54c0ae88e823e4b874a0/yarl-1.23.0-cp313-cp313-win32.whl", hash = "sha256:1b6b572edd95b4fa8df75de10b04bc81acc87c1c7d16bcdd2035b09d30acc957", size = 82356, upload-time = "2026-03-01T22:06:06.04Z" }, { url = "https://files.pythonhosted.org/packages/7a/84/266e8da36879c6edcd37b02b547e2d9ecdfea776be49598e75696e3316e1/yarl-1.23.0-cp313-cp313-win_amd64.whl", hash = "sha256:baaf55442359053c7d62f6f8413a62adba3205119bcb6f49594894d8be47e5e3", size = 87515, upload-time = "2026-03-01T22:06:08.107Z" }, { url = "https://files.pythonhosted.org/packages/00/fd/7e1c66efad35e1649114fa13f17485f62881ad58edeeb7f49f8c5e748bf9/yarl-1.23.0-cp313-cp313-win_arm64.whl", hash = "sha256:fb4948814a2a98e3912505f09c9e7493b1506226afb1f881825368d6fb776ee3", size = 81785, upload-time = "2026-03-01T22:06:10.181Z" }, { url = "https://files.pythonhosted.org/packages/9c/fc/119dd07004f17ea43bb91e3ece6587759edd7519d6b086d16bfbd3319982/yarl-1.23.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aecfed0b41aa72b7881712c65cf764e39ce2ec352324f5e0837c7048d9e6daaa", size = 130719, upload-time = "2026-03-01T22:06:11.708Z" }, { url = "https://files.pythonhosted.org/packages/e6/0d/9f2348502fbb3af409e8f47730282cd6bc80dec6630c1e06374d882d6eb2/yarl-1.23.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a41bcf68efd19073376eb8cf948b8d9be0af26256403e512bb18f3966f1f9120", size = 89690, upload-time = "2026-03-01T22:06:13.429Z" }, { url = "https://files.pythonhosted.org/packages/50/93/e88f3c80971b42cfc83f50a51b9d165a1dbf154b97005f2994a79f212a07/yarl-1.23.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cde9a2ecd91668bcb7f077c4966d8ceddb60af01b52e6e3e2680e4cf00ad1a59", size = 89851, upload-time = "2026-03-01T22:06:15.53Z" }, { url = "https://files.pythonhosted.org/packages/1c/07/61c9dd8ba8f86473263b4036f70fb594c09e99c0d9737a799dfd8bc85651/yarl-1.23.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5023346c4ee7992febc0068e7593de5fa2bf611848c08404b35ebbb76b1b0512", size = 95874, upload-time = "2026-03-01T22:06:17.553Z" }, { url = "https://files.pythonhosted.org/packages/9e/e9/f9ff8ceefba599eac6abddcfb0b3bee9b9e636e96dbf54342a8577252379/yarl-1.23.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d1009abedb49ae95b136a8904a3f71b342f849ffeced2d3747bf29caeda218c4", size = 88710, upload-time = "2026-03-01T22:06:19.004Z" }, { url = "https://files.pythonhosted.org/packages/eb/78/0231bfcc5d4c8eec220bc2f9ef82cb4566192ea867a7c5b4148f44f6cbcd/yarl-1.23.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a8d00f29b42f534cc8aa3931cfe773b13b23e561e10d2b26f27a8d309b0e82a1", size = 101033, upload-time = "2026-03-01T22:06:21.203Z" }, { url = "https://files.pythonhosted.org/packages/cd/9b/30ea5239a61786f18fd25797151a17fbb3be176977187a48d541b5447dd4/yarl-1.23.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:95451e6ce06c3e104556d73b559f5da6c34a069b6b62946d3ad66afcd51642ea", size = 100817, upload-time = "2026-03-01T22:06:22.738Z" }, { url = "https://files.pythonhosted.org/packages/62/e2/a4980481071791bc83bce2b7a1a1f7adcabfa366007518b4b845e92eeee3/yarl-1.23.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:531ef597132086b6cf96faa7c6c1dcd0361dd5f1694e5cc30375907b9b7d3ea9", size = 97482, upload-time = "2026-03-01T22:06:24.21Z" }, { url = "https://files.pythonhosted.org/packages/e5/1e/304a00cf5f6100414c4b5a01fc7ff9ee724b62158a08df2f8170dfc72a2d/yarl-1.23.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88f9fb0116fbfcefcab70f85cf4b74a2b6ce5d199c41345296f49d974ddb4123", size = 95949, upload-time = "2026-03-01T22:06:25.697Z" }, { url = "https://files.pythonhosted.org/packages/68/03/093f4055ed4cae649ac53bca3d180bd37102e9e11d048588e9ab0c0108d0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e7b0460976dc75cb87ad9cc1f9899a4b97751e7d4e77ab840fc9b6d377b8fd24", size = 95839, upload-time = "2026-03-01T22:06:27.309Z" }, { url = "https://files.pythonhosted.org/packages/b9/28/4c75ebb108f322aa8f917ae10a8ffa4f07cae10a8a627b64e578617df6a0/yarl-1.23.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:115136c4a426f9da976187d238e84139ff6b51a20839aa6e3720cd1026d768de", size = 90696, upload-time = "2026-03-01T22:06:29.048Z" }, { url = "https://files.pythonhosted.org/packages/23/9c/42c2e2dd91c1a570402f51bdf066bfdb1241c2240ba001967bad778e77b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:ead11956716a940c1abc816b7df3fa2b84d06eaed8832ca32f5c5e058c65506b", size = 100865, upload-time = "2026-03-01T22:06:30.525Z" }, { url = "https://files.pythonhosted.org/packages/74/05/1bcd60a8a0a914d462c305137246b6f9d167628d73568505fce3f1cb2e65/yarl-1.23.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:fe8f8f5e70e6dbdfca9882cd9deaac058729bcf323cf7a58660901e55c9c94f6", size = 96234, upload-time = "2026-03-01T22:06:32.692Z" }, { url = "https://files.pythonhosted.org/packages/90/b2/f52381aac396d6778ce516b7bc149c79e65bfc068b5de2857ab69eeea3b7/yarl-1.23.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:a0e317df055958a0c1e79e5d2aa5a5eaa4a6d05a20d4b0c9c3f48918139c9fc6", size = 100295, upload-time = "2026-03-01T22:06:34.268Z" }, { url = "https://files.pythonhosted.org/packages/e5/e8/638bae5bbf1113a659b2435d8895474598afe38b4a837103764f603aba56/yarl-1.23.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f0fd84de0c957b2d280143522c4f91a73aada1923caee763e24a2b3fda9f8a5", size = 97784, upload-time = "2026-03-01T22:06:35.864Z" }, { url = "https://files.pythonhosted.org/packages/80/25/a3892b46182c586c202629fc2159aa13975d3741d52ebd7347fd501d48d5/yarl-1.23.0-cp313-cp313t-win32.whl", hash = "sha256:93a784271881035ab4406a172edb0faecb6e7d00f4b53dc2f55919d6c9688595", size = 88313, upload-time = "2026-03-01T22:06:37.39Z" }, { url = "https://files.pythonhosted.org/packages/43/68/8c5b36aa5178900b37387937bc2c2fe0e9505537f713495472dcf6f6fccc/yarl-1.23.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dd00607bffbf30250fe108065f07453ec124dbf223420f57f5e749b04295e090", size = 94932, upload-time = "2026-03-01T22:06:39.579Z" }, { url = "https://files.pythonhosted.org/packages/c6/cc/d79ba8292f51f81f4dc533a8ccfb9fc6992cabf0998ed3245de7589dc07c/yarl-1.23.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ac09d42f48f80c9ee1635b2fcaa819496a44502737660d3c0f2ade7526d29144", size = 84786, upload-time = "2026-03-01T22:06:41.988Z" }, { url = "https://files.pythonhosted.org/packages/90/98/b85a038d65d1b92c3903ab89444f48d3cee490a883477b716d7a24b1a78c/yarl-1.23.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:21d1b7305a71a15b4794b5ff22e8eef96ff4a6d7f9657155e5aa419444b28912", size = 124455, upload-time = "2026-03-01T22:06:43.615Z" }, { url = "https://files.pythonhosted.org/packages/39/54/bc2b45559f86543d163b6e294417a107bb87557609007c007ad889afec18/yarl-1.23.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:85610b4f27f69984932a7abbe52703688de3724d9f72bceb1cca667deff27474", size = 86752, upload-time = "2026-03-01T22:06:45.425Z" }, { url = "https://files.pythonhosted.org/packages/24/f9/e8242b68362bffe6fb536c8db5076861466fc780f0f1b479fc4ffbebb128/yarl-1.23.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:23f371bd662cf44a7630d4d113101eafc0cfa7518a2760d20760b26021454719", size = 86291, upload-time = "2026-03-01T22:06:46.974Z" }, { url = "https://files.pythonhosted.org/packages/ea/d8/d1cb2378c81dd729e98c716582b1ccb08357e8488e4c24714658cc6630e8/yarl-1.23.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4a80f77dc1acaaa61f0934176fccca7096d9b1ff08c8ba9cddf5ae034a24319", size = 99026, upload-time = "2026-03-01T22:06:48.459Z" }, { url = "https://files.pythonhosted.org/packages/0a/ff/7196790538f31debe3341283b5b0707e7feb947620fc5e8236ef28d44f72/yarl-1.23.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:bd654fad46d8d9e823afbb4f87c79160b5a374ed1ff5bde24e542e6ba8f41434", size = 92355, upload-time = "2026-03-01T22:06:50.306Z" }, { url = "https://files.pythonhosted.org/packages/c1/56/25d58c3eddde825890a5fe6aa1866228377354a3c39262235234ab5f616b/yarl-1.23.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:682bae25f0a0dd23a056739f23a134db9f52a63e2afd6bfb37ddc76292bbd723", size = 106417, upload-time = "2026-03-01T22:06:52.1Z" }, { url = "https://files.pythonhosted.org/packages/51/8a/882c0e7bc8277eb895b31bce0138f51a1ba551fc2e1ec6753ffc1e7c1377/yarl-1.23.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a82836cab5f197a0514235aaf7ffccdc886ccdaa2324bc0aafdd4ae898103039", size = 106422, upload-time = "2026-03-01T22:06:54.424Z" }, { url = "https://files.pythonhosted.org/packages/42/2b/fef67d616931055bf3d6764885990a3ac647d68734a2d6a9e1d13de437a2/yarl-1.23.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c57676bdedc94cd3bc37724cf6f8cd2779f02f6aba48de45feca073e714fe52", size = 101915, upload-time = "2026-03-01T22:06:55.895Z" }, { url = "https://files.pythonhosted.org/packages/18/6a/530e16aebce27c5937920f3431c628a29a4b6b430fab3fd1c117b26ff3f6/yarl-1.23.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c7f8dc16c498ff06497c015642333219871effba93e4a2e8604a06264aca5c5c", size = 100690, upload-time = "2026-03-01T22:06:58.21Z" }, { url = "https://files.pythonhosted.org/packages/88/08/93749219179a45e27b036e03260fda05190b911de8e18225c294ac95bbc9/yarl-1.23.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5ee586fb17ff8f90c91cf73c6108a434b02d69925f44f5f8e0d7f2f260607eae", size = 98750, upload-time = "2026-03-01T22:06:59.794Z" }, { url = "https://files.pythonhosted.org/packages/d9/cf/ea424a004969f5d81a362110a6ac1496d79efdc6d50c2c4b2e3ea0fc2519/yarl-1.23.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:17235362f580149742739cc3828b80e24029d08cbb9c4bda0242c7b5bc610a8e", size = 94685, upload-time = "2026-03-01T22:07:01.375Z" }, { url = "https://files.pythonhosted.org/packages/e2/b7/14341481fe568e2b0408bcf1484c652accafe06a0ade9387b5d3fd9df446/yarl-1.23.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:0793e2bd0cf14234983bbb371591e6bea9e876ddf6896cdcc93450996b0b5c85", size = 106009, upload-time = "2026-03-01T22:07:03.151Z" }, { url = "https://files.pythonhosted.org/packages/0a/e6/5c744a9b54f4e8007ad35bce96fbc9218338e84812d36f3390cea616881a/yarl-1.23.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3650dc2480f94f7116c364096bc84b1d602f44224ef7d5c7208425915c0475dd", size = 100033, upload-time = "2026-03-01T22:07:04.701Z" }, { url = "https://files.pythonhosted.org/packages/0c/23/e3bfc188d0b400f025bc49d99793d02c9abe15752138dcc27e4eaf0c4a9e/yarl-1.23.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f40e782d49630ad384db66d4d8b73ff4f1b8955dc12e26b09a3e3af064b3b9d6", size = 106483, upload-time = "2026-03-01T22:07:06.231Z" }, { url = "https://files.pythonhosted.org/packages/72/42/f0505f949a90b3f8b7a363d6cbdf398f6e6c58946d85c6d3a3bc70595b26/yarl-1.23.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:94f8575fbdf81749008d980c17796097e645574a3b8c28ee313931068dad14fe", size = 102175, upload-time = "2026-03-01T22:07:08.4Z" }, { url = "https://files.pythonhosted.org/packages/aa/65/b39290f1d892a9dd671d1c722014ca062a9c35d60885d57e5375db0404b5/yarl-1.23.0-cp314-cp314-win32.whl", hash = "sha256:c8aa34a5c864db1087d911a0b902d60d203ea3607d91f615acd3f3108ac32169", size = 83871, upload-time = "2026-03-01T22:07:09.968Z" }, { url = "https://files.pythonhosted.org/packages/a9/5b/9b92f54c784c26e2a422e55a8d2607ab15b7ea3349e28359282f84f01d43/yarl-1.23.0-cp314-cp314-win_amd64.whl", hash = "sha256:63e92247f383c85ab00dd0091e8c3fa331a96e865459f5ee80353c70a4a42d70", size = 89093, upload-time = "2026-03-01T22:07:11.501Z" }, { url = "https://files.pythonhosted.org/packages/e0/7d/8a84dc9381fd4412d5e7ff04926f9865f6372b4c2fd91e10092e65d29eb8/yarl-1.23.0-cp314-cp314-win_arm64.whl", hash = "sha256:70efd20be968c76ece7baa8dafe04c5be06abc57f754d6f36f3741f7aa7a208e", size = 83384, upload-time = "2026-03-01T22:07:13.069Z" }, { url = "https://files.pythonhosted.org/packages/dd/8d/d2fad34b1c08aa161b74394183daa7d800141aaaee207317e82c790b418d/yarl-1.23.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:9a18d6f9359e45722c064c97464ec883eb0e0366d33eda61cb19a244bf222679", size = 131019, upload-time = "2026-03-01T22:07:14.903Z" }, { url = "https://files.pythonhosted.org/packages/19/ff/33009a39d3ccf4b94d7d7880dfe17fb5816c5a4fe0096d9b56abceea9ac7/yarl-1.23.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:2803ed8b21ca47a43da80a6fd1ed3019d30061f7061daa35ac54f63933409412", size = 89894, upload-time = "2026-03-01T22:07:17.372Z" }, { url = "https://files.pythonhosted.org/packages/0c/f1/dab7ac5e7306fb79c0190766a3c00b4cb8d09a1f390ded68c85a5934faf5/yarl-1.23.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:394906945aa8b19fc14a61cf69743a868bb8c465efe85eee687109cc540b98f4", size = 89979, upload-time = "2026-03-01T22:07:19.361Z" }, { url = "https://files.pythonhosted.org/packages/aa/b1/08e95f3caee1fad6e65017b9f26c1d79877b502622d60e517de01e72f95d/yarl-1.23.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:71d006bee8397a4a89f469b8deb22469fe7508132d3c17fa6ed871e79832691c", size = 95943, upload-time = "2026-03-01T22:07:21.266Z" }, { url = "https://files.pythonhosted.org/packages/c0/cc/6409f9018864a6aa186c61175b977131f373f1988e198e031236916e87e4/yarl-1.23.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:62694e275c93d54f7ccedcfef57d42761b2aad5234b6be1f3e3026cae4001cd4", size = 88786, upload-time = "2026-03-01T22:07:23.129Z" }, { url = "https://files.pythonhosted.org/packages/76/40/cc22d1d7714b717fde2006fad2ced5efe5580606cb059ae42117542122f3/yarl-1.23.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31de1613658308efdb21ada98cbc86a97c181aa050ba22a808120bb5be3ab94", size = 101307, upload-time = "2026-03-01T22:07:24.689Z" }, { url = "https://files.pythonhosted.org/packages/8f/0d/476c38e85ddb4c6ec6b20b815bdd779aa386a013f3d8b85516feee55c8dc/yarl-1.23.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb1e8b8d66c278b21d13b0a7ca22c41dd757a7c209c6b12c313e445c31dd3b28", size = 100904, upload-time = "2026-03-01T22:07:26.287Z" }, { url = "https://files.pythonhosted.org/packages/72/32/0abe4a76d59adf2081dcb0397168553ece4616ada1c54d1c49d8936c74f8/yarl-1.23.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50f9d8d531dfb767c565f348f33dd5139a6c43f5cbdf3f67da40d54241df93f6", size = 97728, upload-time = "2026-03-01T22:07:27.906Z" }, { url = "https://files.pythonhosted.org/packages/b7/35/7b30f4810fba112f60f5a43237545867504e15b1c7647a785fbaf588fac2/yarl-1.23.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:575aa4405a656e61a540f4a80eaa5260f2a38fff7bfdc4b5f611840d76e9e277", size = 95964, upload-time = "2026-03-01T22:07:30.198Z" }, { url = "https://files.pythonhosted.org/packages/2d/86/ed7a73ab85ef00e8bb70b0cb5421d8a2a625b81a333941a469a6f4022828/yarl-1.23.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:041b1a4cefacf65840b4e295c6985f334ba83c30607441ae3cf206a0eed1a2e4", size = 95882, upload-time = "2026-03-01T22:07:32.132Z" }, { url = "https://files.pythonhosted.org/packages/19/90/d56967f61a29d8498efb7afb651e0b2b422a1e9b47b0ab5f4e40a19b699b/yarl-1.23.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:d38c1e8231722c4ce40d7593f28d92b5fc72f3e9774fe73d7e800ec32299f63a", size = 90797, upload-time = "2026-03-01T22:07:34.404Z" }, { url = "https://files.pythonhosted.org/packages/72/00/8b8f76909259f56647adb1011d7ed8b321bcf97e464515c65016a47ecdf0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:d53834e23c015ee83a99377db6e5e37d8484f333edb03bd15b4bc312cc7254fb", size = 101023, upload-time = "2026-03-01T22:07:35.953Z" }, { url = "https://files.pythonhosted.org/packages/ac/e2/cab11b126fb7d440281b7df8e9ddbe4851e70a4dde47a202b6642586b8d9/yarl-1.23.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2e27c8841126e017dd2a054a95771569e6070b9ee1b133366d8b31beb5018a41", size = 96227, upload-time = "2026-03-01T22:07:37.594Z" }, { url = "https://files.pythonhosted.org/packages/c2/9b/2c893e16bfc50e6b2edf76c1a9eb6cb0c744346197e74c65e99ad8d634d0/yarl-1.23.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:76855800ac56f878847a09ce6dba727c93ca2d89c9e9d63002d26b916810b0a2", size = 100302, upload-time = "2026-03-01T22:07:39.334Z" }, { url = "https://files.pythonhosted.org/packages/28/ec/5498c4e3a6d5f1003beb23405671c2eb9cdbf3067d1c80f15eeafe301010/yarl-1.23.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e09fd068c2e169a7070d83d3bde728a4d48de0549f975290be3c108c02e499b4", size = 98202, upload-time = "2026-03-01T22:07:41.717Z" }, { url = "https://files.pythonhosted.org/packages/fe/c3/cd737e2d45e70717907f83e146f6949f20cc23cd4bf7b2688727763aa458/yarl-1.23.0-cp314-cp314t-win32.whl", hash = "sha256:73309162a6a571d4cbd3b6a1dcc703c7311843ae0d1578df6f09be4e98df38d4", size = 90558, upload-time = "2026-03-01T22:07:43.433Z" }, { url = "https://files.pythonhosted.org/packages/e1/19/3774d162f6732d1cfb0b47b4140a942a35ca82bb19b6db1f80e9e7bdc8f8/yarl-1.23.0-cp314-cp314t-win_amd64.whl", hash = "sha256:4503053d296bc6e4cbd1fad61cf3b6e33b939886c4f249ba7c78b602214fabe2", size = 97610, upload-time = "2026-03-01T22:07:45.773Z" }, { url = "https://files.pythonhosted.org/packages/51/47/3fa2286c3cb162c71cdb34c4224d5745a1ceceb391b2bd9b19b668a8d724/yarl-1.23.0-cp314-cp314t-win_arm64.whl", hash = "sha256:44bb7bef4ea409384e3f8bc36c063d77ea1b8d4a5b2706956c0d6695f07dcc25", size = 86041, upload-time = "2026-03-01T22:07:49.026Z" }, { url = "https://files.pythonhosted.org/packages/69/68/c8739671f5699c7dc470580a4f821ef37c32c4cb0b047ce223a7f115757f/yarl-1.23.0-py3-none-any.whl", hash = "sha256:a2df6afe50dea8ae15fa34c9f824a3ee958d785fd5d089063d960bae1daa0a3f", size = 48288, upload-time = "2026-03-01T22:07:51.388Z" }, ] [[package]] name = "zensical" version = "0.0.41" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "click" }, { name = "deepmerge" }, { name = "jinja2" }, { name = "markdown" }, { name = "pygments" }, { name = "pymdown-extensions" }, { name = "pyyaml" }, { name = "tomli" }, ] sdist = { url = "https://files.pythonhosted.org/packages/89/d6/b3e931233e53a2377ef5915cc6e786845c3263306874a469af8fb569ef9c/zensical-0.0.41.tar.gz", hash = "sha256:6c3c90301123749dfc26a210d6c080f0691253c7c765ad308a10b4518369a6fe", size = 3927788, upload-time = "2026-05-09T14:35:29.005Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/72/08/ee18207c9b4e3ada74a0f4adf253bea90da39ae43772761cd91072e3a1fc/zensical-0.0.41-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:f06a0015dcfdf7aeca73f4998a401db65db0ae2dd72da9629a7be8f9a4d0b7b6", size = 12701539, upload-time = "2026-05-09T14:34:48.6Z" }, { url = "https://files.pythonhosted.org/packages/4c/93/d4635fbbce8171cf71dd64285d9f6d5773a2b624b928f1dd8acaf1ee9f9f/zensical-0.0.41-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:4e524ce68c9ff082ffaded9f742407097cf51bab692b7bc18d3c174b966174fe", size = 12560038, upload-time = "2026-05-09T14:34:51.666Z" }, { url = "https://files.pythonhosted.org/packages/f2/4a/1730a30377bbb0914ed740e0e289d379b0552673b6cf912aefe7a205440c/zensical-0.0.41-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a4afe35331cd2394c408cd362458936479cc0ed4fb272478498e4794aafc7414", size = 12942926, upload-time = "2026-05-09T14:34:54.393Z" }, { url = "https://files.pythonhosted.org/packages/32/e3/d9a0416ef4edc043ce9f404a66f1934f102bcb645b103abb26b180ba5680/zensical-0.0.41-cp310-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:15a850285050f03aeb3b67ce7d99943093059fe8d32fc7731fa9f27be45c64cc", size = 12912711, upload-time = "2026-05-09T14:34:57.174Z" }, { url = "https://files.pythonhosted.org/packages/68/d0/775852783bef835425306a2fcd8236ef14fd19160e1b4261e192bf2d9f54/zensical-0.0.41-cp310-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:35052e9dbefabe3a71c4836cfc4afa6c9469e5eeddc2a3ee750803ae3fe777dc", size = 13275869, upload-time = "2026-05-09T14:34:59.93Z" }, { url = "https://files.pythonhosted.org/packages/c3/95/554273cc09a270ced0213d3e0aac8b3fc2b472fc2b26771d56fc8fd55047/zensical-0.0.41-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a47f459205fb55f64dcb6c65e9f3c2fa00a2b4306c5ef1b71b9a50c45007071d", size = 12980177, upload-time = "2026-05-09T14:35:02.81Z" }, { url = "https://files.pythonhosted.org/packages/ec/b5/d74d5040b3121db5c72b0134f0455641b90b1277fb1330a8e5e0029ca8d3/zensical-0.0.41-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:aa3b3b3a4e6f75f6bb3c1aca1fad7a96cebf54cbd4e31122f6876503b8801666", size = 13119629, upload-time = "2026-05-09T14:35:07.105Z" }, { url = "https://files.pythonhosted.org/packages/62/9a/93527acd7750092d7fca2e6c43fe2b8f1e85e1c96a1002baf6a08201c6f7/zensical-0.0.41-cp310-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:565133fd48b2ce939698c174c0c1c6470407a8fb6a90a2bb0eeec97cd4344444", size = 13182183, upload-time = "2026-05-09T14:35:10.105Z" }, { url = "https://files.pythonhosted.org/packages/b2/7e/d77e4c809bfcbad40db85a6a7beeda2ee5c964232e0186783c3a837a7d0b/zensical-0.0.41-cp310-abi3-musllinux_1_2_i686.whl", hash = "sha256:cec0a2b05eaaace0c7424bab3f2884da03ade212cac4ba4487c58691ec13ec65", size = 13330444, upload-time = "2026-05-09T14:35:13.245Z" }, { url = "https://files.pythonhosted.org/packages/fd/e8/ecbb7e34bff88aa892c676b8b2e2ddf425f94d66cbb84b80016095191b77/zensical-0.0.41-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1736f0cb7686628cc6f53952d208423f20b542f0c16b0c2ddd7e702bf6e41fdd", size = 13263093, upload-time = "2026-05-09T14:35:20.826Z" }, { url = "https://files.pythonhosted.org/packages/c1/6f/48b2f81ce708d19bb807d94716f2772ec4b74389b6d29024669fc470df08/zensical-0.0.41-cp310-abi3-win32.whl", hash = "sha256:34a78645c68fba152faacb66516c895283166154f8b15b61440a6c21c84f0974", size = 12253644, upload-time = "2026-05-09T14:35:23.598Z" }, { url = "https://files.pythonhosted.org/packages/a0/92/5cf943133f61b996965743deeaff467f278135521f58d83ca68d2601ded3/zensical-0.0.41-cp310-abi3-win_amd64.whl", hash = "sha256:00d80cd573152e0efb655143bbdfe8788eb4b33167a802639fdb1b1800b724ac", size = 12483190, upload-time = "2026-05-09T14:35:26.43Z" }, ] [[package]] name = "zipp" version = "3.23.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/30/21/093488dfc7cc8964ded15ab726fad40f25fd3d788fd741cc1c5a17d78ee8/zipp-3.23.1.tar.gz", hash = "sha256:32120e378d32cd9714ad503c1d024619063ec28aad2248dc6672ad13edfa5110", size = 25965, upload-time = "2026-04-13T23:21:46.6Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/08/8a/0861bec20485572fbddf3dfba2910e38fe249796cb73ecdeb74e07eeb8d3/zipp-3.23.1-py3-none-any.whl", hash = "sha256:0b3596c50a5c700c9cb40ba8d86d9f2cc4807e9bedb06bcdf7fac85633e444dc", size = 10378, upload-time = "2026-04-13T23:21:45.386Z" }, ] [[package]] name = "zstandard" version = "0.25.0" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/fd/aa/3e0508d5a5dd96529cdc5a97011299056e14c6505b678fd58938792794b1/zstandard-0.25.0.tar.gz", hash = "sha256:7713e1179d162cf5c7906da876ec2ccb9c3a9dcbdffef0cc7f70c3667a205f0b", size = 711513, upload-time = "2025-09-14T22:15:54.002Z" } wheels = [ { url = "https://files.pythonhosted.org/packages/56/7a/28efd1d371f1acd037ac64ed1c5e2b41514a6cc937dd6ab6a13ab9f0702f/zstandard-0.25.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e59fdc271772f6686e01e1b3b74537259800f57e24280be3f29c8a0deb1904dd", size = 795256, upload-time = "2025-09-14T22:15:56.415Z" }, { url = "https://files.pythonhosted.org/packages/96/34/ef34ef77f1ee38fc8e4f9775217a613b452916e633c4f1d98f31db52c4a5/zstandard-0.25.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4d441506e9b372386a5271c64125f72d5df6d2a8e8a2a45a0ae09b03cb781ef7", size = 640565, upload-time = "2025-09-14T22:15:58.177Z" }, { url = "https://files.pythonhosted.org/packages/9d/1b/4fdb2c12eb58f31f28c4d28e8dc36611dd7205df8452e63f52fb6261d13e/zstandard-0.25.0-cp310-cp310-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:ab85470ab54c2cb96e176f40342d9ed41e58ca5733be6a893b730e7af9c40550", size = 5345306, upload-time = "2025-09-14T22:16:00.165Z" }, { url = "https://files.pythonhosted.org/packages/73/28/a44bdece01bca027b079f0e00be3b6bd89a4df180071da59a3dd7381665b/zstandard-0.25.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e05ab82ea7753354bb054b92e2f288afb750e6b439ff6ca78af52939ebbc476d", size = 5055561, upload-time = "2025-09-14T22:16:02.22Z" }, { url = "https://files.pythonhosted.org/packages/e9/74/68341185a4f32b274e0fc3410d5ad0750497e1acc20bd0f5b5f64ce17785/zstandard-0.25.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:78228d8a6a1c177a96b94f7e2e8d012c55f9c760761980da16ae7546a15a8e9b", size = 5402214, upload-time = "2025-09-14T22:16:04.109Z" }, { url = "https://files.pythonhosted.org/packages/8b/67/f92e64e748fd6aaffe01e2b75a083c0c4fd27abe1c8747fee4555fcee7dd/zstandard-0.25.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:2b6bd67528ee8b5c5f10255735abc21aa106931f0dbaf297c7be0c886353c3d0", size = 5449703, upload-time = "2025-09-14T22:16:06.312Z" }, { url = "https://files.pythonhosted.org/packages/fd/e5/6d36f92a197c3c17729a2125e29c169f460538a7d939a27eaaa6dcfcba8e/zstandard-0.25.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4b6d83057e713ff235a12e73916b6d356e3084fd3d14ced499d84240f3eecee0", size = 5556583, upload-time = "2025-09-14T22:16:08.457Z" }, { url = "https://files.pythonhosted.org/packages/d7/83/41939e60d8d7ebfe2b747be022d0806953799140a702b90ffe214d557638/zstandard-0.25.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:9174f4ed06f790a6869b41cba05b43eeb9a35f8993c4422ab853b705e8112bbd", size = 5045332, upload-time = "2025-09-14T22:16:10.444Z" }, { url = "https://files.pythonhosted.org/packages/b3/87/d3ee185e3d1aa0133399893697ae91f221fda79deb61adbe998a7235c43f/zstandard-0.25.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:25f8f3cd45087d089aef5ba3848cd9efe3ad41163d3400862fb42f81a3a46701", size = 5572283, upload-time = "2025-09-14T22:16:12.128Z" }, { url = "https://files.pythonhosted.org/packages/0a/1d/58635ae6104df96671076ac7d4ae7816838ce7debd94aecf83e30b7121b0/zstandard-0.25.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3756b3e9da9b83da1796f8809dd57cb024f838b9eeafde28f3cb472012797ac1", size = 4959754, upload-time = "2025-09-14T22:16:14.225Z" }, { url = "https://files.pythonhosted.org/packages/75/d6/57e9cb0a9983e9a229dd8fd2e6e96593ef2aa82a3907188436f22b111ccd/zstandard-0.25.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:81dad8d145d8fd981b2962b686b2241d3a1ea07733e76a2f15435dfb7fb60150", size = 5266477, upload-time = "2025-09-14T22:16:16.343Z" }, { url = "https://files.pythonhosted.org/packages/d1/a9/ee891e5edf33a6ebce0a028726f0bbd8567effe20fe3d5808c42323e8542/zstandard-0.25.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a5a419712cf88862a45a23def0ae063686db3d324cec7edbe40509d1a79a0aab", size = 5440914, upload-time = "2025-09-14T22:16:18.453Z" }, { url = "https://files.pythonhosted.org/packages/58/08/a8522c28c08031a9521f27abc6f78dbdee7312a7463dd2cfc658b813323b/zstandard-0.25.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e7360eae90809efd19b886e59a09dad07da4ca9ba096752e61a2e03c8aca188e", size = 5819847, upload-time = "2025-09-14T22:16:20.559Z" }, { url = "https://files.pythonhosted.org/packages/6f/11/4c91411805c3f7b6f31c60e78ce347ca48f6f16d552fc659af6ec3b73202/zstandard-0.25.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75ffc32a569fb049499e63ce68c743155477610532da1eb38e7f24bf7cd29e74", size = 5363131, upload-time = "2025-09-14T22:16:22.206Z" }, { url = "https://files.pythonhosted.org/packages/ef/d6/8c4bd38a3b24c4c7676a7a3d8de85d6ee7a983602a734b9f9cdefb04a5d6/zstandard-0.25.0-cp310-cp310-win32.whl", hash = "sha256:106281ae350e494f4ac8a80470e66d1fe27e497052c8d9c3b95dc4cf1ade81aa", size = 436469, upload-time = "2025-09-14T22:16:25.002Z" }, { url = "https://files.pythonhosted.org/packages/93/90/96d50ad417a8ace5f841b3228e93d1bb13e6ad356737f42e2dde30d8bd68/zstandard-0.25.0-cp310-cp310-win_amd64.whl", hash = "sha256:ea9d54cc3d8064260114a0bbf3479fc4a98b21dffc89b3459edd506b69262f6e", size = 506100, upload-time = "2025-09-14T22:16:23.569Z" }, { url = "https://files.pythonhosted.org/packages/2a/83/c3ca27c363d104980f1c9cee1101cc8ba724ac8c28a033ede6aab89585b1/zstandard-0.25.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:933b65d7680ea337180733cf9e87293cc5500cc0eb3fc8769f4d3c88d724ec5c", size = 795254, upload-time = "2025-09-14T22:16:26.137Z" }, { url = "https://files.pythonhosted.org/packages/ac/4d/e66465c5411a7cf4866aeadc7d108081d8ceba9bc7abe6b14aa21c671ec3/zstandard-0.25.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3f79487c687b1fc69f19e487cd949bf3aae653d181dfb5fde3bf6d18894706f", size = 640559, upload-time = "2025-09-14T22:16:27.973Z" }, { url = "https://files.pythonhosted.org/packages/12/56/354fe655905f290d3b147b33fe946b0f27e791e4b50a5f004c802cb3eb7b/zstandard-0.25.0-cp311-cp311-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:0bbc9a0c65ce0eea3c34a691e3c4b6889f5f3909ba4822ab385fab9057099431", size = 5348020, upload-time = "2025-09-14T22:16:29.523Z" }, { url = "https://files.pythonhosted.org/packages/3b/13/2b7ed68bd85e69a2069bcc72141d378f22cae5a0f3b353a2c8f50ef30c1b/zstandard-0.25.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:01582723b3ccd6939ab7b3a78622c573799d5d8737b534b86d0e06ac18dbde4a", size = 5058126, upload-time = "2025-09-14T22:16:31.811Z" }, { url = "https://files.pythonhosted.org/packages/c9/dd/fdaf0674f4b10d92cb120ccff58bbb6626bf8368f00ebfd2a41ba4a0dc99/zstandard-0.25.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5f1ad7bf88535edcf30038f6919abe087f606f62c00a87d7e33e7fc57cb69fcc", size = 5405390, upload-time = "2025-09-14T22:16:33.486Z" }, { url = "https://files.pythonhosted.org/packages/0f/67/354d1555575bc2490435f90d67ca4dd65238ff2f119f30f72d5cde09c2ad/zstandard-0.25.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:06acb75eebeedb77b69048031282737717a63e71e4ae3f77cc0c3b9508320df6", size = 5452914, upload-time = "2025-09-14T22:16:35.277Z" }, { url = "https://files.pythonhosted.org/packages/bb/1f/e9cfd801a3f9190bf3e759c422bbfd2247db9d7f3d54a56ecde70137791a/zstandard-0.25.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9300d02ea7c6506f00e627e287e0492a5eb0371ec1670ae852fefffa6164b072", size = 5559635, upload-time = "2025-09-14T22:16:37.141Z" }, { url = "https://files.pythonhosted.org/packages/21/88/5ba550f797ca953a52d708c8e4f380959e7e3280af029e38fbf47b55916e/zstandard-0.25.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:bfd06b1c5584b657a2892a6014c2f4c20e0db0208c159148fa78c65f7e0b0277", size = 5048277, upload-time = "2025-09-14T22:16:38.807Z" }, { url = "https://files.pythonhosted.org/packages/46/c0/ca3e533b4fa03112facbe7fbe7779cb1ebec215688e5df576fe5429172e0/zstandard-0.25.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f373da2c1757bb7f1acaf09369cdc1d51d84131e50d5fa9863982fd626466313", size = 5574377, upload-time = "2025-09-14T22:16:40.523Z" }, { url = "https://files.pythonhosted.org/packages/12/9b/3fb626390113f272abd0799fd677ea33d5fc3ec185e62e6be534493c4b60/zstandard-0.25.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6c0e5a65158a7946e7a7affa6418878ef97ab66636f13353b8502d7ea03c8097", size = 4961493, upload-time = "2025-09-14T22:16:43.3Z" }, { url = "https://files.pythonhosted.org/packages/cb/d3/23094a6b6a4b1343b27ae68249daa17ae0651fcfec9ed4de09d14b940285/zstandard-0.25.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:c8e167d5adf59476fa3e37bee730890e389410c354771a62e3c076c86f9f7778", size = 5269018, upload-time = "2025-09-14T22:16:45.292Z" }, { url = "https://files.pythonhosted.org/packages/8c/a7/bb5a0c1c0f3f4b5e9d5b55198e39de91e04ba7c205cc46fcb0f95f0383c1/zstandard-0.25.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:98750a309eb2f020da61e727de7d7ba3c57c97cf6213f6f6277bb7fb42a8e065", size = 5443672, upload-time = "2025-09-14T22:16:47.076Z" }, { url = "https://files.pythonhosted.org/packages/27/22/503347aa08d073993f25109c36c8d9f029c7d5949198050962cb568dfa5e/zstandard-0.25.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:22a086cff1b6ceca18a8dd6096ec631e430e93a8e70a9ca5efa7561a00f826fa", size = 5822753, upload-time = "2025-09-14T22:16:49.316Z" }, { url = "https://files.pythonhosted.org/packages/e2/be/94267dc6ee64f0f8ba2b2ae7c7a2df934a816baaa7291db9e1aa77394c3c/zstandard-0.25.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:72d35d7aa0bba323965da807a462b0966c91608ef3a48ba761678cb20ce5d8b7", size = 5366047, upload-time = "2025-09-14T22:16:51.328Z" }, { url = "https://files.pythonhosted.org/packages/7b/a3/732893eab0a3a7aecff8b99052fecf9f605cf0fb5fb6d0290e36beee47a4/zstandard-0.25.0-cp311-cp311-win32.whl", hash = "sha256:f5aeea11ded7320a84dcdd62a3d95b5186834224a9e55b92ccae35d21a8b63d4", size = 436484, upload-time = "2025-09-14T22:16:55.005Z" }, { url = "https://files.pythonhosted.org/packages/43/a3/c6155f5c1cce691cb80dfd38627046e50af3ee9ddc5d0b45b9b063bfb8c9/zstandard-0.25.0-cp311-cp311-win_amd64.whl", hash = "sha256:daab68faadb847063d0c56f361a289c4f268706b598afbf9ad113cbe5c38b6b2", size = 506183, upload-time = "2025-09-14T22:16:52.753Z" }, { url = "https://files.pythonhosted.org/packages/8c/3e/8945ab86a0820cc0e0cdbf38086a92868a9172020fdab8a03ac19662b0e5/zstandard-0.25.0-cp311-cp311-win_arm64.whl", hash = "sha256:22a06c5df3751bb7dc67406f5374734ccee8ed37fc5981bf1ad7041831fa1137", size = 462533, upload-time = "2025-09-14T22:16:53.878Z" }, { url = "https://files.pythonhosted.org/packages/82/fc/f26eb6ef91ae723a03e16eddb198abcfce2bc5a42e224d44cc8b6765e57e/zstandard-0.25.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7b3c3a3ab9daa3eed242d6ecceead93aebbb8f5f84318d82cee643e019c4b73b", size = 795738, upload-time = "2025-09-14T22:16:56.237Z" }, { url = "https://files.pythonhosted.org/packages/aa/1c/d920d64b22f8dd028a8b90e2d756e431a5d86194caa78e3819c7bf53b4b3/zstandard-0.25.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:913cbd31a400febff93b564a23e17c3ed2d56c064006f54efec210d586171c00", size = 640436, upload-time = "2025-09-14T22:16:57.774Z" }, { url = "https://files.pythonhosted.org/packages/53/6c/288c3f0bd9fcfe9ca41e2c2fbfd17b2097f6af57b62a81161941f09afa76/zstandard-0.25.0-cp312-cp312-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:011d388c76b11a0c165374ce660ce2c8efa8e5d87f34996aa80f9c0816698b64", size = 5343019, upload-time = "2025-09-14T22:16:59.302Z" }, { url = "https://files.pythonhosted.org/packages/1e/15/efef5a2f204a64bdb5571e6161d49f7ef0fffdbca953a615efbec045f60f/zstandard-0.25.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dffecc361d079bb48d7caef5d673c88c8988d3d33fb74ab95b7ee6da42652ea", size = 5063012, upload-time = "2025-09-14T22:17:01.156Z" }, { url = "https://files.pythonhosted.org/packages/b7/37/a6ce629ffdb43959e92e87ebdaeebb5ac81c944b6a75c9c47e300f85abdf/zstandard-0.25.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:7149623bba7fdf7e7f24312953bcf73cae103db8cae49f8154dd1eadc8a29ecb", size = 5394148, upload-time = "2025-09-14T22:17:03.091Z" }, { url = "https://files.pythonhosted.org/packages/e3/79/2bf870b3abeb5c070fe2d670a5a8d1057a8270f125ef7676d29ea900f496/zstandard-0.25.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:6a573a35693e03cf1d67799fd01b50ff578515a8aeadd4595d2a7fa9f3ec002a", size = 5451652, upload-time = "2025-09-14T22:17:04.979Z" }, { url = "https://files.pythonhosted.org/packages/53/60/7be26e610767316c028a2cbedb9a3beabdbe33e2182c373f71a1c0b88f36/zstandard-0.25.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5a56ba0db2d244117ed744dfa8f6f5b366e14148e00de44723413b2f3938a902", size = 5546993, upload-time = "2025-09-14T22:17:06.781Z" }, { url = "https://files.pythonhosted.org/packages/85/c7/3483ad9ff0662623f3648479b0380d2de5510abf00990468c286c6b04017/zstandard-0.25.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:10ef2a79ab8e2974e2075fb984e5b9806c64134810fac21576f0668e7ea19f8f", size = 5046806, upload-time = "2025-09-14T22:17:08.415Z" }, { url = "https://files.pythonhosted.org/packages/08/b3/206883dd25b8d1591a1caa44b54c2aad84badccf2f1de9e2d60a446f9a25/zstandard-0.25.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:aaf21ba8fb76d102b696781bddaa0954b782536446083ae3fdaa6f16b25a1c4b", size = 5576659, upload-time = "2025-09-14T22:17:10.164Z" }, { url = "https://files.pythonhosted.org/packages/9d/31/76c0779101453e6c117b0ff22565865c54f48f8bd807df2b00c2c404b8e0/zstandard-0.25.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1869da9571d5e94a85a5e8d57e4e8807b175c9e4a6294e3b66fa4efb074d90f6", size = 4953933, upload-time = "2025-09-14T22:17:11.857Z" }, { url = "https://files.pythonhosted.org/packages/18/e1/97680c664a1bf9a247a280a053d98e251424af51f1b196c6d52f117c9720/zstandard-0.25.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:809c5bcb2c67cd0ed81e9229d227d4ca28f82d0f778fc5fea624a9def3963f91", size = 5268008, upload-time = "2025-09-14T22:17:13.627Z" }, { url = "https://files.pythonhosted.org/packages/1e/73/316e4010de585ac798e154e88fd81bb16afc5c5cb1a72eeb16dd37e8024a/zstandard-0.25.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:f27662e4f7dbf9f9c12391cb37b4c4c3cb90ffbd3b1fb9284dadbbb8935fa708", size = 5433517, upload-time = "2025-09-14T22:17:16.103Z" }, { url = "https://files.pythonhosted.org/packages/5b/60/dd0f8cfa8129c5a0ce3ea6b7f70be5b33d2618013a161e1ff26c2b39787c/zstandard-0.25.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:99c0c846e6e61718715a3c9437ccc625de26593fea60189567f0118dc9db7512", size = 5814292, upload-time = "2025-09-14T22:17:17.827Z" }, { url = "https://files.pythonhosted.org/packages/fc/5f/75aafd4b9d11b5407b641b8e41a57864097663699f23e9ad4dbb91dc6bfe/zstandard-0.25.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:474d2596a2dbc241a556e965fb76002c1ce655445e4e3bf38e5477d413165ffa", size = 5360237, upload-time = "2025-09-14T22:17:19.954Z" }, { url = "https://files.pythonhosted.org/packages/ff/8d/0309daffea4fcac7981021dbf21cdb2e3427a9e76bafbcdbdf5392ff99a4/zstandard-0.25.0-cp312-cp312-win32.whl", hash = "sha256:23ebc8f17a03133b4426bcc04aabd68f8236eb78c3760f12783385171b0fd8bd", size = 436922, upload-time = "2025-09-14T22:17:24.398Z" }, { url = "https://files.pythonhosted.org/packages/79/3b/fa54d9015f945330510cb5d0b0501e8253c127cca7ebe8ba46a965df18c5/zstandard-0.25.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffef5a74088f1e09947aecf91011136665152e0b4b359c42be3373897fb39b01", size = 506276, upload-time = "2025-09-14T22:17:21.429Z" }, { url = "https://files.pythonhosted.org/packages/ea/6b/8b51697e5319b1f9ac71087b0af9a40d8a6288ff8025c36486e0c12abcc4/zstandard-0.25.0-cp312-cp312-win_arm64.whl", hash = "sha256:181eb40e0b6a29b3cd2849f825e0fa34397f649170673d385f3598ae17cca2e9", size = 462679, upload-time = "2025-09-14T22:17:23.147Z" }, { url = "https://files.pythonhosted.org/packages/35/0b/8df9c4ad06af91d39e94fa96cc010a24ac4ef1378d3efab9223cc8593d40/zstandard-0.25.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec996f12524f88e151c339688c3897194821d7f03081ab35d31d1e12ec975e94", size = 795735, upload-time = "2025-09-14T22:17:26.042Z" }, { url = "https://files.pythonhosted.org/packages/3f/06/9ae96a3e5dcfd119377ba33d4c42a7d89da1efabd5cb3e366b156c45ff4d/zstandard-0.25.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a1a4ae2dec3993a32247995bdfe367fc3266da832d82f8438c8570f989753de1", size = 640440, upload-time = "2025-09-14T22:17:27.366Z" }, { url = "https://files.pythonhosted.org/packages/d9/14/933d27204c2bd404229c69f445862454dcc101cd69ef8c6068f15aaec12c/zstandard-0.25.0-cp313-cp313-manylinux2010_i686.manylinux2014_i686.manylinux_2_12_i686.manylinux_2_17_i686.whl", hash = "sha256:e96594a5537722fdfb79951672a2a63aec5ebfb823e7560586f7484819f2a08f", size = 5343070, upload-time = "2025-09-14T22:17:28.896Z" }, { url = "https://files.pythonhosted.org/packages/6d/db/ddb11011826ed7db9d0e485d13df79b58586bfdec56e5c84a928a9a78c1c/zstandard-0.25.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bfc4e20784722098822e3eee42b8e576b379ed72cca4a7cb856ae733e62192ea", size = 5063001, upload-time = "2025-09-14T22:17:31.044Z" }, { url = "https://files.pythonhosted.org/packages/db/00/87466ea3f99599d02a5238498b87bf84a6348290c19571051839ca943777/zstandard-0.25.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:457ed498fc58cdc12fc48f7950e02740d4f7ae9493dd4ab2168a47c93c31298e", size = 5394120, upload-time = "2025-09-14T22:17:32.711Z" }, { url = "https://files.pythonhosted.org/packages/2b/95/fc5531d9c618a679a20ff6c29e2b3ef1d1f4ad66c5e161ae6ff847d102a9/zstandard-0.25.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:fd7a5004eb1980d3cefe26b2685bcb0b17989901a70a1040d1ac86f1d898c551", size = 5451230, upload-time = "2025-09-14T22:17:34.41Z" }, { url = "https://files.pythonhosted.org/packages/63/4b/e3678b4e776db00f9f7b2fe58e547e8928ef32727d7a1ff01dea010f3f13/zstandard-0.25.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e735494da3db08694d26480f1493ad2cf86e99bdd53e8e9771b2752a5c0246a", size = 5547173, upload-time = "2025-09-14T22:17:36.084Z" }, { url = "https://files.pythonhosted.org/packages/4e/d5/ba05ed95c6b8ec30bd468dfeab20589f2cf709b5c940483e31d991f2ca58/zstandard-0.25.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3a39c94ad7866160a4a46d772e43311a743c316942037671beb264e395bdd611", size = 5046736, upload-time = "2025-09-14T22:17:37.891Z" }, { url = "https://files.pythonhosted.org/packages/50/d5/870aa06b3a76c73eced65c044b92286a3c4e00554005ff51962deef28e28/zstandard-0.25.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:172de1f06947577d3a3005416977cce6168f2261284c02080e7ad0185faeced3", size = 5576368, upload-time = "2025-09-14T22:17:40.206Z" }, { url = "https://files.pythonhosted.org/packages/5d/35/398dc2ffc89d304d59bc12f0fdd931b4ce455bddf7038a0a67733a25f550/zstandard-0.25.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3c83b0188c852a47cd13ef3bf9209fb0a77fa5374958b8c53aaa699398c6bd7b", size = 4954022, upload-time = "2025-09-14T22:17:41.879Z" }, { url = "https://files.pythonhosted.org/packages/9a/5c/36ba1e5507d56d2213202ec2b05e8541734af5f2ce378c5d1ceaf4d88dc4/zstandard-0.25.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:1673b7199bbe763365b81a4f3252b8e80f44c9e323fc42940dc8843bfeaf9851", size = 5267889, upload-time = "2025-09-14T22:17:43.577Z" }, { url = "https://files.pythonhosted.org/packages/70/e8/2ec6b6fb7358b2ec0113ae202647ca7c0e9d15b61c005ae5225ad0995df5/zstandard-0.25.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:0be7622c37c183406f3dbf0cba104118eb16a4ea7359eeb5752f0794882fc250", size = 5433952, upload-time = "2025-09-14T22:17:45.271Z" }, { url = "https://files.pythonhosted.org/packages/7b/01/b5f4d4dbc59ef193e870495c6f1275f5b2928e01ff5a81fecb22a06e22fb/zstandard-0.25.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:5f5e4c2a23ca271c218ac025bd7d635597048b366d6f31f420aaeb715239fc98", size = 5814054, upload-time = "2025-09-14T22:17:47.08Z" }, { url = "https://files.pythonhosted.org/packages/b2/e5/fbd822d5c6f427cf158316d012c5a12f233473c2f9c5fe5ab1ae5d21f3d8/zstandard-0.25.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f187a0bb61b35119d1926aee039524d1f93aaf38a9916b8c4b78ac8514a0aaf", size = 5360113, upload-time = "2025-09-14T22:17:48.893Z" }, { url = "https://files.pythonhosted.org/packages/8e/e0/69a553d2047f9a2c7347caa225bb3a63b6d7704ad74610cb7823baa08ed7/zstandard-0.25.0-cp313-cp313-win32.whl", hash = "sha256:7030defa83eef3e51ff26f0b7bfb229f0204b66fe18e04359ce3474ac33cbc09", size = 436936, upload-time = "2025-09-14T22:17:52.658Z" }, { url = "https://files.pythonhosted.org/packages/d9/82/b9c06c870f3bd8767c201f1edbdf9e8dc34be5b0fbc5682c4f80fe948475/zstandard-0.25.0-cp313-cp313-win_amd64.whl", hash = "sha256:1f830a0dac88719af0ae43b8b2d6aef487d437036468ef3c2ea59c51f9d55fd5", size = 506232, upload-time = "2025-09-14T22:17:50.402Z" }, { url = "https://files.pythonhosted.org/packages/d4/57/60c3c01243bb81d381c9916e2a6d9e149ab8627c0c7d7abb2d73384b3c0c/zstandard-0.25.0-cp313-cp313-win_arm64.whl", hash = "sha256:85304a43f4d513f5464ceb938aa02c1e78c2943b29f44a750b48b25ac999a049", size = 462671, upload-time = "2025-09-14T22:17:51.533Z" }, { url = "https://files.pythonhosted.org/packages/3d/5c/f8923b595b55fe49e30612987ad8bf053aef555c14f05bb659dd5dbe3e8a/zstandard-0.25.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e29f0cf06974c899b2c188ef7f783607dbef36da4c242eb6c82dcd8b512855e3", size = 795887, upload-time = "2025-09-14T22:17:54.198Z" }, { url = "https://files.pythonhosted.org/packages/8d/09/d0a2a14fc3439c5f874042dca72a79c70a532090b7ba0003be73fee37ae2/zstandard-0.25.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:05df5136bc5a011f33cd25bc9f506e7426c0c9b3f9954f056831ce68f3b6689f", size = 640658, upload-time = "2025-09-14T22:17:55.423Z" }, { url = "https://files.pythonhosted.org/packages/5d/7c/8b6b71b1ddd517f68ffb55e10834388d4f793c49c6b83effaaa05785b0b4/zstandard-0.25.0-cp314-cp314-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f604efd28f239cc21b3adb53eb061e2a205dc164be408e553b41ba2ffe0ca15c", size = 5379849, upload-time = "2025-09-14T22:17:57.372Z" }, { url = "https://files.pythonhosted.org/packages/a4/86/a48e56320d0a17189ab7a42645387334fba2200e904ee47fc5a26c1fd8ca/zstandard-0.25.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223415140608d0f0da010499eaa8ccdb9af210a543fac54bce15babbcfc78439", size = 5058095, upload-time = "2025-09-14T22:17:59.498Z" }, { url = "https://files.pythonhosted.org/packages/f8/ad/eb659984ee2c0a779f9d06dbfe45e2dc39d99ff40a319895df2d3d9a48e5/zstandard-0.25.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e54296a283f3ab5a26fc9b8b5d4978ea0532f37b231644f367aa588930aa043", size = 5551751, upload-time = "2025-09-14T22:18:01.618Z" }, { url = "https://files.pythonhosted.org/packages/61/b3/b637faea43677eb7bd42ab204dfb7053bd5c4582bfe6b1baefa80ac0c47b/zstandard-0.25.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ca54090275939dc8ec5dea2d2afb400e0f83444b2fc24e07df7fdef677110859", size = 6364818, upload-time = "2025-09-14T22:18:03.769Z" }, { url = "https://files.pythonhosted.org/packages/31/dc/cc50210e11e465c975462439a492516a73300ab8caa8f5e0902544fd748b/zstandard-0.25.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e09bb6252b6476d8d56100e8147b803befa9a12cea144bbe629dd508800d1ad0", size = 5560402, upload-time = "2025-09-14T22:18:05.954Z" }, { url = "https://files.pythonhosted.org/packages/c9/ae/56523ae9c142f0c08efd5e868a6da613ae76614eca1305259c3bf6a0ed43/zstandard-0.25.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a9ec8c642d1ec73287ae3e726792dd86c96f5681eb8df274a757bf62b750eae7", size = 4955108, upload-time = "2025-09-14T22:18:07.68Z" }, { url = "https://files.pythonhosted.org/packages/98/cf/c899f2d6df0840d5e384cf4c4121458c72802e8bda19691f3b16619f51e9/zstandard-0.25.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:a4089a10e598eae6393756b036e0f419e8c1d60f44a831520f9af41c14216cf2", size = 5269248, upload-time = "2025-09-14T22:18:09.753Z" }, { url = "https://files.pythonhosted.org/packages/1b/c0/59e912a531d91e1c192d3085fc0f6fb2852753c301a812d856d857ea03c6/zstandard-0.25.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f67e8f1a324a900e75b5e28ffb152bcac9fbed1cc7b43f99cd90f395c4375344", size = 5430330, upload-time = "2025-09-14T22:18:11.966Z" }, { url = "https://files.pythonhosted.org/packages/a0/1d/7e31db1240de2df22a58e2ea9a93fc6e38cc29353e660c0272b6735d6669/zstandard-0.25.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:9654dbc012d8b06fc3d19cc825af3f7bf8ae242226df5f83936cb39f5fdc846c", size = 5811123, upload-time = "2025-09-14T22:18:13.907Z" }, { url = "https://files.pythonhosted.org/packages/f6/49/fac46df5ad353d50535e118d6983069df68ca5908d4d65b8c466150a4ff1/zstandard-0.25.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4203ce3b31aec23012d3a4cf4a2ed64d12fea5269c49aed5e4c3611b938e4088", size = 5359591, upload-time = "2025-09-14T22:18:16.465Z" }, { url = "https://files.pythonhosted.org/packages/c2/38/f249a2050ad1eea0bb364046153942e34abba95dd5520af199aed86fbb49/zstandard-0.25.0-cp314-cp314-win32.whl", hash = "sha256:da469dc041701583e34de852d8634703550348d5822e66a0c827d39b05365b12", size = 444513, upload-time = "2025-09-14T22:18:20.61Z" }, { url = "https://files.pythonhosted.org/packages/3a/43/241f9615bcf8ba8903b3f0432da069e857fc4fd1783bd26183db53c4804b/zstandard-0.25.0-cp314-cp314-win_amd64.whl", hash = "sha256:c19bcdd826e95671065f8692b5a4aa95c52dc7a02a4c5a0cac46deb879a017a2", size = 516118, upload-time = "2025-09-14T22:18:17.849Z" }, { url = "https://files.pythonhosted.org/packages/f0/ef/da163ce2450ed4febf6467d77ccb4cd52c4c30ab45624bad26ca0a27260c/zstandard-0.25.0-cp314-cp314-win_arm64.whl", hash = "sha256:d7541afd73985c630bafcd6338d2518ae96060075f9463d7dc14cfb33514383d", size = 476940, upload-time = "2025-09-14T22:18:19.088Z" }, ] pydantic-httpx2-9b7ee8e/wrangler.toml000066400000000000000000000002671521723372100200140ustar00rootroot00000000000000name = "httpx2-docs" compatibility_date = "2026-05-22" [[routes]] pattern = "httpx2.pydantic.dev" custom_domain = true [assets] directory = "./site" not_found_handling = "404-page"