pax_global_header00006660000000000000000000000064152125347610014520gustar00rootroot0000000000000052 comment=beb0672aa8444ea7647aee056f624effe5996346 accelerate-1.14.0/000077500000000000000000000000001521253476100136735ustar00rootroot00000000000000accelerate-1.14.0/.devcontainer/000077500000000000000000000000001521253476100164325ustar00rootroot00000000000000accelerate-1.14.0/.devcontainer/devcontainer.json000066400000000000000000000022271521253476100220110ustar00rootroot00000000000000// File only needed for VSCode users to have proper Docker based interpreters { "name": "accelerate_dev_environment", "build": { // ACTION NEEDED: comment/uncomment the relevant line depending on whether you are in a CPU/GPU environment "dockerfile": "../docker/accelerate-cpu/Dockerfile" // "dockerfile": "../docker/accelerate-gpu/Dockerfile" }, "runArgs": [ // ACTION NEEDED: uncomment the next line if your local machine has GPUs available // "--gpus", "all", // Enable the docker container to access system resources "--ipc", "host" ], "remoteEnv": { "PYTHONPATH": "${containerEnv:PATH}:${containerWorkspaceFolder}" }, "customizations": { "vscode": { "extensions": [ // Ensure we have IntelliSense in VSCode when running inside container "ms-python.python" ] } }, "workspaceFolder": "/workspaces/accelerate", // Need git for VSCode to color code modifications. Only runs when building environment. "onCreateCommand": "apt-get update && apt-get install -y git && pip install -e '.[dev]'" }accelerate-1.14.0/.github/000077500000000000000000000000001521253476100152335ustar00rootroot00000000000000accelerate-1.14.0/.github/ISSUE_TEMPLATE/000077500000000000000000000000001521253476100174165ustar00rootroot00000000000000accelerate-1.14.0/.github/ISSUE_TEMPLATE/bug-report.yml000066400000000000000000000047451521253476100222410ustar00rootroot00000000000000name: "\U0001F41B Bug Report" description: Submit a bug report to help us improve Accelerate body: - type: markdown attributes: value: | Thanks for taking the time to submit a bug report! � If this is not a bug related to the Accelerate library directly, but instead a general question about your code or the library specifically please use the [forums](https://discuss.huggingface.co/c/accelerate/18). - type: textarea id: system-info attributes: label: System Info description: Please share your accelerate configuration with us. You can run the command `accelerate env` and copy-paste its outputs below render: Shell placeholder: accelerate version, OS, python version, numpy version, torch version, and accelerate's configuration validations: required: true - type: checkboxes id: information-scripts-examples attributes: label: Information description: 'The problem arises when using:' options: - label: "The official example scripts" - label: "My own modified scripts" - type: checkboxes id: information-tasks attributes: label: Tasks description: "The tasks I am working on are:" options: - label: "One of the scripts in the examples/ folder of Accelerate or an officially supported `no_trainer` script in the `examples` folder of the `transformers` repo (such as `run_no_trainer_glue.py`)" - label: "My own task or dataset (give details below)" - type: textarea id: reproduction validations: required: true attributes: label: Reproduction description: | Please provide a code sample that reproduces the problem you ran into. It can be a Colab link or just a code snippet. If you have code snippets, error messages, stack traces please provide them here as well. Important! Use code tags to correctly format your code. See https://help.github.com/en/github/writing-on-github/creating-and-highlighting-code-blocks#syntax-highlighting Do not use screenshots, as they are hard to read and (more importantly) don't allow others to copy-and-paste your code. placeholder: | Steps to reproduce the behavior: 1. 2. 3. - type: textarea id: expected-behavior validations: required: true attributes: label: Expected behavior description: "A clear and concise description of what you would expect to happen." accelerate-1.14.0/.github/PULL_REQUEST_TEMPLATE.md000066400000000000000000000044531521253476100210420ustar00rootroot00000000000000# What does this PR do? Fixes # (issue) ## Before submitting - [ ] This PR fixes a typo or improves the docs (you can dismiss the other checks if that's the case). - [ ] Did you read the [contributor guideline](https://github.com/huggingface/accelerate/blob/main/CONTRIBUTING.md#submitting-a-pull-request-pr), Pull Request section? - [ ] Was this discussed/approved via a Github issue or the [forum](https://discuss.huggingface.co/)? Please add a link to it if that's the case. - [ ] Did you make sure to update the documentation with your changes? Here are the [documentation guidelines](https://github.com/huggingface/accelerate/tree/main/docs), and [here are tips on formatting docstrings](https://github.com/huggingface/accelerate/tree/main/docs#writing-documentation---specification). - [ ] Did you write any new necessary tests? ## Who can review? Anyone in the community is free to review the PR once the tests have passed. Feel free to tag members/contributors who may be interested in your PR. accelerate-1.14.0/.github/dependabot.yml000066400000000000000000000003151521253476100200620ustar00rootroot00000000000000version: 2 updates: - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" cooldown: default-days: 7 groups: actions: patterns: ["*"] accelerate-1.14.0/.github/workflows/000077500000000000000000000000001521253476100172705ustar00rootroot00000000000000accelerate-1.14.0/.github/workflows/build-docker-images-release.yml000066400000000000000000000076711521253476100252530ustar00rootroot00000000000000name: Build Docker images (releases) on: workflow_dispatch: release: types: [published] concurrency: group: docker-image-builds cancel-in-progress: false jobs: get-version: runs-on: ubuntu-latest outputs: version: ${{ steps.step1.outputs.version }} steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - id: step1 run: | version=$(python setup.py --version) if ! echo "$version" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+(\.[0-9]+)?([a-zA-Z0-9.-]*)?$'; then echo "Invalid version format: $version" >&2 exit 1 fi echo "version=$version" >> $GITHUB_OUTPUT version-cpu: name: "Latest Accelerate CPU [version]" runs-on: group: aws-general-8-plus needs: get-version steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0 - name: Login to DockerHub uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build and Push CPU uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 with: file: docker/accelerate-cpu/Dockerfile push: true tags: huggingface/accelerate:cpu-release-${{ needs.get-version.outputs.version }} version-cuda: name: "Latest Accelerate GPU [version]" runs-on: group: aws-g6-4xlarge-plus needs: get-version steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0 - name: Login to DockerHub uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build and Push GPU uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 with: file: docker/accelerate-gpu/Dockerfile push: true tags: huggingface/accelerate:gpu-release-${{needs.get-version.outputs.version}} version-cuda-deepspeed: name: "Latest Accelerate GPU DeepSpeed [version]" runs-on: group: aws-g6-4xlarge-plus needs: get-version steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0 - name: Login to DockerHub uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build and Push GPU uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 with: file: docker/accelerate-gpu-deepspeed/Dockerfile push: true tags: huggingface/accelerate:gpu-deepspeed-release-${{needs.get-version.outputs.version}} version-cuda-fp8-transformerengine: name: "Latest Accelerate GPU FP8 TransformerEngine [version]" runs-on: group: aws-g6-4xlarge-plus needs: get-version steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@d7f5e7f509e45cec5c76c4d5afdd7de93d0b3df5 # v4.1.0 - name: Login to DockerHub uses: docker/login-action@650006c6eb7dba73a995cc03b0b2d7f5ca915bee # v4.2.0 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Build and Push GPU uses: docker/build-push-action@f9f3042f7e2789586610d6e8b85c8f03e5195baf # v7.2.0 with: file: docker/accelerate-gpu/Dockerfile push: true tags: huggingface/accelerate:gpu-fp8-transformerengine-release-${{needs.get-version.outputs.version}}accelerate-1.14.0/.github/workflows/build_and_run_tests.yml000066400000000000000000000024751521253476100240520ustar00rootroot00000000000000name: Trigger docker images and run tests on: push: branches: - main workflow_dispatch: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} jobs: check-for-source: runs-on: ubuntu-latest name: Check if setup was changed outputs: changed: ${{ steps.was_changed.outputs.changed }} steps: - uses: actions/checkout@v6 with: fetch-depth: "2" - name: Get changed files id: changed-files uses: tj-actions/changed-files@9426d40962ed5378910ee2e21d5f8c6fcbf2dd96 #v42 - name: Was setup changed id: was_changed run: | for file in ${{ steps.changed-files.outputs.all_changed_files }}; do if [ `basename "${file}"` == "setup.py" ]; then echo "changed=1" >> $GITHUB_OUTPUT fi done build-docker-containers: needs: check-for-source if: (github.event_name == 'push') && (needs.check-for-source.outputs.changed == '1') uses: ./.github/workflows/build_docker_images.yml secrets: inherit run-merge-tests: needs: build-docker-containers if: always() uses: ./.github/workflows/run_merge_tests.yml run-integration-tests: needs: build-docker-containers if: always() uses: ./.github/workflows/self_hosted_integration_tests.yml accelerate-1.14.0/.github/workflows/build_docker_images.yml000066400000000000000000000072021521253476100237670ustar00rootroot00000000000000name: Build Docker images (scheduled) on: workflow_dispatch: workflow_call: schedule: - cron: "0 1 * * *" concurrency: group: docker-image-builds cancel-in-progress: false jobs: latest-cpu: name: "Latest Accelerate CPU [dev]" runs-on: group: aws-general-8-plus steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Login to DockerHub uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Get current date id: date run: | echo "date=$(date '+%Y-%m-%d')" >> $GITHUB_ENV - name: Build and Push CPU uses: docker/build-push-action@v7 with: file: docker/accelerate-cpu/Dockerfile push: true tags: | huggingface/accelerate:cpu-nightly huggingface/accelerate:cpu-nightly-${{ env.date }} latest-cuda: name: "Latest Accelerate GPU [dev]" runs-on: group: aws-g6-4xlarge-plus steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Login to DockerHub uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Get current date id: date run: | echo "date=$(date '+%Y-%m-%d')" >> $GITHUB_ENV - name: Build and Push GPU uses: docker/build-push-action@v7 with: file: docker/accelerate-gpu/Dockerfile push: true tags: | huggingface/accelerate:gpu-nightly huggingface/accelerate:gpu-nightly-${{ env.date }} latest-cuda-deepspeed: name: "Latest Accelerate GPU DeepSpeed [dev]" runs-on: group: aws-g6-4xlarge-plus steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Login to DockerHub uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Get current date id: date run: | echo "date=$(date '+%Y-%m-%d')" >> $GITHUB_ENV - name: Build and Push GPU uses: docker/build-push-action@v7 with: file: docker/accelerate-gpu-deepspeed/Dockerfile push: true tags: | huggingface/accelerate:gpu-deepspeed-nightly huggingface/accelerate:gpu-deepspeed-nightly-${{ env.date }} latest-cuda-fp8-transformerengine: name: "Latest Accelerate GPU FP8 TransformerEngine [dev]" runs-on: group: aws-g6-4xlarge-plus steps: - name: Set up Docker Buildx uses: docker/setup-buildx-action@v4 - name: Login to DockerHub uses: docker/login-action@v4 with: username: ${{ secrets.DOCKERHUB_USERNAME }} password: ${{ secrets.DOCKERHUB_PASSWORD }} - name: Get current date id: date run: | echo "date=$(date '+%Y-%m-%d')" >> $GITHUB_ENV # Get the previous month echo "base_year=$(date -d 'last month' '+%y')" >> $GITHUB_ENV echo "base_month=$(date -d 'last month' '+%m')" >> $GITHUB_ENV - name: Build and Push GPU uses: docker/build-push-action@v7 with: file: benchmarks/fp8/transformer_engine/Dockerfile push: true tags: huggingface/accelerate:gpu-fp8-transformerengine-nightly-${{ env.date }} build-args: | BASE_YEAR=${{ env.base_year }} BASE_MONTH=${{ env.base_month }}accelerate-1.14.0/.github/workflows/build_documentation.yml000066400000000000000000000007001521253476100240400ustar00rootroot00000000000000name: Build documentation on: push: branches: - main - doc-builder* - v*-release jobs: build: uses: huggingface/doc-builder/.github/workflows/build_main_documentation.yml@bcff59fca682130d2e7271ca8589911b7ac0b8bf # main with: commit_sha: ${{ github.sha }} package: accelerate custom_container: huggingface/transformers-doc-builder secrets: hf_token: ${{ secrets.HF_DOC_BUILD_PUSH }} accelerate-1.14.0/.github/workflows/build_pr_documentation.yml000066400000000000000000000007741521253476100245540ustar00rootroot00000000000000name: Build PR Documentation on: pull_request: concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: build: uses: huggingface/doc-builder/.github/workflows/build_pr_documentation.yml@bcff59fca682130d2e7271ca8589911b7ac0b8bf # main with: commit_sha: ${{ github.event.pull_request.head.sha }} pr_number: ${{ github.event.number }} package: accelerate custom_container: huggingface/transformers-doc-builder accelerate-1.14.0/.github/workflows/gaudi3_scheduled.yml000066400000000000000000000052021521253476100232060ustar00rootroot00000000000000name: Gaudi3 tests (scheduled) on: workflow_dispatch: schedule: # every day at 6 AM UTC - cron: "0 6 * * *" concurrency: group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} cancel-in-progress: true jobs: run-gaudi3-tests: runs-on: group: itac-bm-emr-gaudi3-dell-2gaudi container: image: docker://vault.habana.ai/gaudi-docker/1.21.1/ubuntu22.04/habanalabs/pytorch-installer-2.6.0:latest options: --runtime=habana --shm-size=64G --cap-add=sys_nice --env HABANA_VISIBLE_DEVICES env: OMPI_MCA_btl_vader_single_copy_mechanism: none PT_ENABLE_INT64_SUPPORT: 1 PT_HPU_LAZY_MODE: 0 RUN_SLOW: 1 steps: - name: HL-SMI (1) run: | hl-smi echo "HABANA_VISIBLE_DEVICES=${HABANA_VISIBLE_DEVICES}" echo "HABANA_VISIBLE_MODULES=${HABANA_VISIBLE_MODULES}" - name: Extract HPU visible modules id: add-modules run: | export HABANA_VISIBLE_MODULES=$(hl-smi -Q module_id -f csv,noheader | tr '\n' ',' | sed 's/,$//') echo "HABANA_VISIBLE_MODULES=${HABANA_VISIBLE_MODULES}" >> $GITHUB_ENV - name: HL-SMI (2) run: | hl-smi echo "HABANA_VISIBLE_DEVICES=${HABANA_VISIBLE_DEVICES}" echo "HABANA_VISIBLE_MODULES=${HABANA_VISIBLE_MODULES}" - name: Checkout to Accelerate uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Install Accelerate with Transformers & DeepSpeed run: | pip install -e .[testing] \ git+https://github.com/HabanaAI/DeepSpeed.git@1.20.0 \ git+https://github.com/huggingface/transformers.git - name: Run CLI tests if: ${{ !cancelled() && (success() || failure()) }} run: | make test_cli - name: Run Core tests if: ${{ !cancelled() && (success() || failure()) }} run: | make test_core - name: Run Big Modeling tests if: ${{ !cancelled() && (success() || failure()) }} run: | make test_big_modeling - name: Run DeepSpeed integration tests if: ${{ !cancelled() && (success() || failure()) }} run: | make test_deepspeed - name: Run FSDP integration tests if: ${{ !cancelled() && (success() || failure()) }} run: | make test_fsdp - name: Run TP integration tests if: ${{ !cancelled() && (success() || failure()) }} run: | make test_tp - name: Run Examples tests if: ${{ !cancelled() && (success() || failure()) }} run: | make test_examples accelerate-1.14.0/.github/workflows/integration_tests.yml000066400000000000000000000030201521253476100235530ustar00rootroot00000000000000# CI for specifically ensuring integrations work fine (`transformers` mainly) # Useful tips: # - New integrations to test should have its own job, and follow a strategy method where we check both # the pypi and github versions. # - When checking the latest release of the integration, use # git checkout $(git describe --tags `git rev-list --tags --max-count=1`) to get the latest release. name: Integration Tests on: pull_request: paths: - "src/**" - "tests/**" - ".github/**" - "examples/**" - "setup.py" types: [opened, synchronize, reopened] env: HF_HOME: ~/hf_cache jobs: run-trainer-tests: runs-on: ubuntu-latest strategy: fail-fast: false steps: - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 - name: Set up python 3.10 uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 with: python-version: '3.10' cache: 'pip' cache-dependency-path: 'setup.py' - name: Install Accelerate from source run: | pip install --upgrade pip pip install -e . - name: Clone and install transformers run: | cd .. git clone https://github.com/huggingface/transformers cd transformers pip install .[torch,testing] - name: Show installed libraries run: | pip freeze - name: Run Trainer tests env: WANDB_DISABLED: true run: | cd ../transformers pytest -sv tests/trainer accelerate-1.14.0/.github/workflows/nightly.yml000066400000000000000000000047201521253476100214740ustar00rootroot00000000000000name: Self-hosted runner with slow tests (scheduled) on: workflow_dispatch: schedule: - cron: "0 2 * * *" env: RUN_SLOW: "yes" IS_GITHUB_CI: "1" SLACK_API_TOKEN: ${{ secrets.SLACK_API_TOKEN }} jobs: run_tests: name: run_tests_${{ matrix.test_type }} strategy: fail-fast: false matrix: include: - test_type: single_gpu runner: aws-g6-4xlarge-plus image: huggingface/accelerate:gpu-nightly cuda_visible_devices: "0" targets: test test_examples - test_type: single_gpu_deepspeed runner: aws-g6-4xlarge-plus image: huggingface/accelerate:gpu-deepspeed-nightly cuda_visible_devices: "0" targets: test_deepspeed - test_type: multi_gpu runner: aws-g6-12xlarge-plus image: huggingface/accelerate:gpu-nightly cuda_visible_devices: "0,1" targets: test test_examples - test_type: multi_gpu_deepspeed runner: aws-g6-12xlarge-plus image: huggingface/accelerate:gpu-deepspeed-nightly cuda_visible_devices: "0,1" targets: test_deepspeed runs-on: group: ${{ matrix.runner }} env: CUDA_VISIBLE_DEVICES: ${{ matrix.cuda_visible_devices }} TEST_TYPE: ${{ matrix.test_type }} container: image: ${{ matrix.image }} options: --gpus all --shm-size "16gb" defaults: run: shell: bash steps: - name: Update clone & pip install run: | source activate accelerate git clone https://github.com/huggingface/accelerate; cd accelerate; git checkout ${{ github.sha }}; pip install -e . --no-deps pip install pytest-reportlog tabulate - name: Show installed libraries run: | source activate accelerate; pip freeze - name: Run test suites working-directory: accelerate run: | source activate accelerate status=0 for target in ${{ matrix.targets }}; do make $target || status=1 done exit $status - name: Generate Report working-directory: accelerate if: always() run: | pip install slack_sdk tabulate python utils/log_reports.py >> $GITHUB_STEP_SUMMARY run-integration-tests: if: always() uses: ./.github/workflows/self_hosted_integration_tests.yml accelerate-1.14.0/.github/workflows/pr_style_bot.yml000066400000000000000000000010011521253476100225100ustar00rootroot00000000000000# To run this bot, comment "@bot /style" on a PR name: Style Bot on: issue_comment: types: [created] permissions: pull-requests: write contents: read jobs: style: uses: huggingface/huggingface_hub/.github/workflows/style-bot-action.yml@e2867e92c07d15e1bf18994d0a945ef5ad6b8d65 with: python_quality_dependencies: "[quality]" style_command_type: "default" secrets: app_id: ${{ secrets.HF_BOT_STYLE_APP_ID }} app_private_key: ${{ secrets.HF_BOT_STYLE_SECRET_PEM }} accelerate-1.14.0/.github/workflows/quality.yml000066400000000000000000000012641521253476100215060ustar00rootroot00000000000000name: Quality Check on: [pull_request] jobs: quality: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Set up Python 3.10 uses: actions/setup-python@v6 with: python-version: '3.10' cache: 'pip' cache-dependency-path: 'setup.py' - name: Install Python dependencies run: pip install -e .[quality] - name: Run Quality check run: make quality - name: Check if failure if: ${{ failure() }} run: | echo "Quality check failed. Please ensure the right dependency versions are installed with 'pip install -e .[quality]' and rerun 'make style; make quality;'" >> $GITHUB_STEP_SUMMARY accelerate-1.14.0/.github/workflows/run_merge_tests.yml000066400000000000000000000115461521253476100232270ustar00rootroot00000000000000name: Self-hosted runner tests (push to "main") on: workflow_call: workflow_dispatch: env: TESTING_MOCKED_DATALOADERS: "1" IS_GITHUB_CI: "1" jobs: run_core_tests_single_gpu: runs-on: group: aws-g6-4xlarge-plus env: CUDA_VISIBLE_DEVICES: "0" container: image: huggingface/accelerate:gpu-nightly options: --gpus all --shm-size "16gb" defaults: run: shell: bash steps: - name: Install accelerate run: | source activate accelerate; git clone https://github.com/huggingface/accelerate; cd accelerate; git checkout ${{ github.sha }}; pip install -e .[testing,test_trackers] -U; pip install pytest-reportlog tabulate ; - name: Show installed libraries run: | source activate accelerate; pip freeze - name: Run CLI tests (use make cli) working-directory: accelerate run: | source activate accelerate; make test_cli - name: Run test on GPUs working-directory: accelerate if: always() run: | source activate accelerate; make test - name: Run examples on GPUs working-directory: accelerate if: always() run: | source activate accelerate; make test_examples - name: Generate Report working-directory: accelerate if: always() run: | pip install tabulate; python utils/log_reports.py >> $GITHUB_STEP_SUMMARY run_deepspeed_tests_single_gpu: runs-on: group: aws-g6-4xlarge-plus env: CUDA_VISIBLE_DEVICES: "0" container: image: huggingface/accelerate:gpu-deepspeed-nightly options: --gpus all --shm-size "16gb" defaults: run: shell: bash steps: - name: Install accelerate run: | source activate accelerate; git clone https://github.com/huggingface/accelerate; cd accelerate; git checkout ${{ github.sha }}; pip install -e .[testing,test_trackers] -U; pip install pytest-reportlog tabulate ; - name: Show installed libraries run: | source activate accelerate; pip freeze - name: Run test on GPUs working-directory: accelerate if: always() run: | source activate accelerate; make test_deepspeed - name: Generate Report working-directory: accelerate if: always() run: | pip install tabulate; python utils/log_reports.py >> $GITHUB_STEP_SUMMARY run_core_tests_multi_gpu: runs-on: group: aws-g6-12xlarge-plus env: CUDA_VISIBLE_DEVICES: 0,1 container: image: huggingface/accelerate:gpu-nightly options: --gpus all --shm-size "16gb" defaults: run: shell: bash steps: - name: Update clone run: | source activate accelerate; git clone https://github.com/huggingface/accelerate; cd accelerate; git checkout ${{ github.sha }}; pip install -e .[testing,test_trackers] -U; pip install pytest-reportlog tabulate - name: Show installed libraries run: | source activate accelerate; pip freeze - name: Run test on GPUs working-directory: accelerate run: | source activate accelerate; make test - name: Run examples on GPUs working-directory: accelerate if: always() run: | source activate accelerate; make test_examples - name: Generate Report working-directory: accelerate if: always() run: | source activate accelerate; python utils/log_reports.py >> $GITHUB_STEP_SUMMARY run_deepspeed_tests_multi_gpu: runs-on: group: aws-g6-12xlarge-plus container: image: huggingface/accelerate:gpu-deepspeed-nightly options: --gpus all --shm-size "16gb" defaults: run: shell: bash steps: - name: Install accelerate run: | source activate accelerate; git clone https://github.com/huggingface/accelerate; cd accelerate; git checkout ${{ github.sha }}; pip install -e .[testing,test_trackers] -U; pip install pytest-reportlog tabulate ; - name: Show installed libraries run: | source activate accelerate; pip freeze - name: Run test on GPUs working-directory: accelerate if: always() run: | source activate accelerate; make test_deepspeed - name: Generate Report working-directory: accelerate if: always() run: | pip install tabulate; python utils/log_reports.py >> $GITHUB_STEP_SUMMARY accelerate-1.14.0/.github/workflows/self_hosted_integration_tests.yml000066400000000000000000000062121521253476100261400ustar00rootroot00000000000000# CI for specifically ensuring integrations work fine (`transformers` mainly) on GPUs # Useful tips: # - `working-directory` should be set to the root of the repo, which is cloned on the actual CI runner. # It follows the directory structure of `actions-runner/_work/{repo_name}/{repo_name}/{cloned_repo} on # prem, but in Actions setting `working-directory` looks just in the `{repo_name}` level. # - New integrations to test should have its own job, and follow a strategy method where we check both # the pypi and github versions. # - Workflow call lets this be called from `build_and_run_tests.yml` # - When using a docker container, it's recommended to set `--shm-size`, we use 16gb. name: Integration Tests (push to "main") on: workflow_call: workflow_dispatch: env: HF_HOME: ~/hf_cache defaults: run: shell: bash jobs: run-trainer-tests: container: image: huggingface/accelerate:gpu-deepspeed-nightly options: --gpus all --shm-size "16gb" runs-on: group: aws-g6-12xlarge-plus strategy: fail-fast: false matrix: cuda_visible_devices: [ "0", "0,1" ] steps: - name: Install transformers run: | source activate accelerate; git clone https://github.com/huggingface/transformers --depth 1; cd transformers; pip install .[torch,deepspeed-testing]; cd ..; - name: Install accelerate run: | source activate accelerate; git clone https://github.com/huggingface/accelerate; cd accelerate; git checkout ${{ github.sha }} ; pip install -e .[testing]; pip uninstall wandb dvclive -y cd ..; - name: Show installed libraries run: | source activate accelerate; pip freeze - name: Run trainer tests working-directory: transformers/ env: CUDA_VISIBLE_DEVICES: ${{ matrix.cuda_visible_devices }} WANDB_DISABLED: true run: | source activate accelerate; pytest -sv tests/trainer run-skorch-tests: container: image: huggingface/accelerate:gpu-nightly options: --gpus all --shm-size "16gb" runs-on: group: aws-g6-12xlarge-plus strategy: fail-fast: false steps: - name: Install accelerate run: source activate accelerate; git clone https://github.com/huggingface/accelerate; cd accelerate; git checkout ${{ github.sha }}; pip install -e .[testing]; cd .. - name: Install skorch run: | source activate accelerate git clone https://github.com/skorch-dev/skorch; cd skorch; git config --global --add safe.directory '*' git checkout master && git pull pip install .[test] pip install flaky - name: Show installed libraries run: | source activate accelerate; pip freeze - name: Run skorch tests working-directory: skorch/ run: | source activate accelerate; pytest -sv -k TestAccelerate accelerate-1.14.0/.github/workflows/stale.yml000066400000000000000000000013041521253476100211210ustar00rootroot00000000000000name: Stale Bot on: schedule: - cron: "0 15 * * *" workflow_dispatch: jobs: close_stale_issues: name: Close Stale Issues if: github.repository == 'huggingface/accelerate' runs-on: ubuntu-latest permissions: issues: write pull-requests: write env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} steps: - uses: actions/checkout@v6 - name: Setup Python uses: actions/setup-python@v6 with: python-version: '3.10' cache: 'pip' cache-dependency-path: 'setup.py' - name: Install requirements run: | pip install PyGithub - name: Close stale issues run: | python utils/stale.py accelerate-1.14.0/.github/workflows/test.yml000066400000000000000000000033071521253476100207750ustar00rootroot00000000000000name: Run Tests on: pull_request: paths: - "src/**" - "tests/**" - ".github/**" - "examples/**" - "setup.py" types: [opened, synchronize, reopened] env: HF_HOME: ~/hf_cache TESTING_MOCKED_DATALOADERS: "1" IS_GITHUB_CI: "1" jobs: run-tests: runs-on: group: aws-general-8-plus strategy: fail-fast: false matrix: pytorch-version: [ latest, minimum, ] test-kind: [ test_prod, test_core, test_cli, test_big_modeling, test_deepspeed, test_fsdp, test_example_differences, test_checkpoint_step, test_checkpoint_epoch, test_rest ] steps: - uses: actions/checkout@v6 - name: Set up python 3.10 uses: actions/setup-python@v6 with: python-version: '3.10' cache: 'pip' cache-dependency-path: 'setup.py' - name: Install the library run: | if [[ ${{ matrix.test-kind }} = test_prod ]]; then pip install -e .[test_prod]; fi if [[ ${{ matrix.test-kind }} != test_prod ]]; then pip install -e .[testing,test_trackers]; fi if [[ ${{ matrix.pytorch-version }} = minimum ]]; then pip install torchvision==0.19.0 torch==2.4.0; fi pip install pytest-reportlog tabulate setuptools importlib_metadata - name: Show installed libraries run: | pip freeze - name: Run Tests env: PYTORCH_VERSION: ${{ matrix.pytorch-version }} run: | make ${{ matrix.test-kind }} - name: Generate Report if: always() run: | python utils/log_reports.py >> $GITHUB_STEP_SUMMARY accelerate-1.14.0/.github/workflows/test_imports.yml000066400000000000000000000022461521253476100225530ustar00rootroot00000000000000name: Run Import Tests on: pull_request: paths: - "src/**" - "tests/**" - ".github/**" - "examples/**" - "setup.py" types: [opened, synchronize, reopened] env: HF_HOME: ~/hf_cache TESTING_MOCKED_DATALOADERS: "1" IS_GITHUB_CI: "1" jobs: run-tests: runs-on: ubuntu-latest strategy: fail-fast: false matrix: pytorch-version: [ latest, minimum, ] steps: - uses: actions/checkout@v6 - name: Set up python 3.10 uses: actions/setup-python@v6 with: python-version: '3.10' cache: 'pip' cache-dependency-path: 'setup.py' - name: Install the library run: | pip install -e . pip install pytest-reportlog tabulate setuptools git+https://github.com/muellerzr/import-timer - name: Show installed libraries run: | pip freeze - name: Run Import Tests env: PYTORCH_VERSION: ${{ matrix.pytorch-version }} run: | pytest -sv tests/test_imports.py - name: Generate Report if: always() run: | python utils/log_reports.py >> $GITHUB_STEP_SUMMARY accelerate-1.14.0/.github/workflows/trufflehog.yml000066400000000000000000000005341521253476100221620ustar00rootroot00000000000000on: push: name: Secret Leaks jobs: trufflehog: runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: fetch-depth: 0 - name: Secret Scanning uses: trufflesecurity/trufflehog@d411fff7b8879a62509f3fa98c07f247ac089a51 # main accelerate-1.14.0/.github/workflows/upload_pr_documentation.yml000066400000000000000000000007341521253476100247350ustar00rootroot00000000000000name: Upload PR Documentation on: workflow_run: workflows: ["Build PR Documentation"] types: - completed permissions: contents: read packages: read jobs: build: uses: huggingface/doc-builder/.github/workflows/upload_pr_documentation.yml@bcff59fca682130d2e7271ca8589911b7ac0b8bf # main with: package_name: accelerate secrets: hf_token: ${{ secrets.HF_DOC_BUILD_PUSH }} comment_bot_token: ${{ secrets.COMMENT_BOT_TOKEN }} accelerate-1.14.0/.gitignore000066400000000000000000000035641521253476100156730ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # VSCode .vscode # IntelliJ .idea # Mac .DS_Store .DS_Store # More test things wandb # ruff .ruff_cache accelerate-1.14.0/.pre-commit-config.yaml000066400000000000000000000004561521253476100201610ustar00rootroot00000000000000repos: - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.2.1 hooks: - id: ruff args: - --fix - id: ruff-format - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 hooks: - id: check-merge-conflict - id: check-yaml accelerate-1.14.0/CODE_OF_CONDUCT.md000066400000000000000000000121521521253476100164730ustar00rootroot00000000000000 # Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at feedback@huggingface.co. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.0, available at https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder](https://github.com/mozilla/diversity). [homepage]: https://www.contributor-covenant.org For answers to common questions about this code of conduct, see the FAQ at https://www.contributor-covenant.org/faq. Translations are available at https://www.contributor-covenant.org/translations. accelerate-1.14.0/CONTRIBUTING.md000066400000000000000000000230631521253476100161300ustar00rootroot00000000000000 # How to contribute to 🤗 Accelerate? Everyone is welcome to contribute, and we value everybody's contribution. Code is thus not the only way to help the community. Answering questions, helping others, reaching out and improving the documentations are immensely valuable to the community. It also helps us if you spread the word: reference the library from blog posts on the awesome projects it made possible, shout out on Twitter every time it has helped you, or simply star the repo to say "thank you". Whichever way you choose to contribute, please be mindful to respect our [code of conduct](https://github.com/huggingface/accelerate/blob/main/CODE_OF_CONDUCT.md). ## You can contribute in so many ways! Some of the ways you can contribute to Accelerate: * Fixing outstanding issues with the existing code; * Contributing to the examples or to the documentation; * Submitting issues related to bugs or desired new features. ## Submitting a new issue or feature request Do your best to follow these guidelines when submitting an issue or a feature request. It will make it easier for us to come back to you quickly and with good feedback. ### Did you find a bug? The 🤗 Accelerate library is robust and reliable thanks to the users who notify us of the problems they encounter. So thank you for reporting an issue. First, we would really appreciate it if you could **make sure the bug was not already reported** (use the search bar on Github under Issues). Did not find it? :( So we can act quickly on it, please follow these steps: * Include your **OS type and version**, the versions of **Python** and **PyTorch**. * A short, self-contained, code snippet that allows us to reproduce the bug in less than 30s; * Provide the with your Accelerate configuration (located by default in `~/.cache/huggingface/accelerate/default_config.yaml`) ### Do you want a new feature? A good feature request addresses the following points: 1. Motivation first: * Is it related to a problem/frustration with the library? If so, please explain why. Providing a code snippet that demonstrates the problem is best. * Is it related to something you would need for a project? We'd love to hear about it! * Is it something you worked on and think could benefit the community? Awesome! Tell us what problem it solved for you. 2. Write a *full paragraph* describing the feature; 3. Provide a **code snippet** that demonstrates its future use; 4. In case this is related to a paper, please attach a link; 5. Attach any additional information (drawings, screenshots, etc.) you think may help. If your issue is well written we're already 80% of the way there by the time you post it. ## Submitting a pull request (PR) Before writing code, we strongly advise you to search through the existing PRs or issues to make sure that nobody is already working on the same thing. If you are unsure, it is always a good idea to open an issue to get some feedback. You will need basic `git` proficiency to be able to contribute to 🤗 Accelerate. `git` is not the easiest tool to use but it has the greatest manual. Type `git --help` in a shell and enjoy. If you prefer books, [Pro Git](https://git-scm.com/book/en/v2) is a very good reference. Follow these steps to start contributing: 1. Fork the [repository](https://github.com/huggingface/accelerate) by clicking on the 'Fork' button on the repository's page. This creates a copy of the code under your GitHub user account. 2. Clone your fork to your local disk, and add the base repository as a remote. The following command assumes you have your public SSH key uploaded to GitHub. See the following guide for more [information](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository). ```bash $ git clone git@github.com:/accelerate.git $ cd accelerate $ git remote add upstream https://github.com/huggingface/accelerate.git ``` 3. Create a new branch to hold your development changes, and do this for every new PR you work on. Start by synchronizing your `main` branch with the `upstream/main` branch (ore details in the [GitHub Docs](https://docs.github.com/en/github/collaborating-with-issues-and-pull-requests/syncing-a-fork)): ```bash $ git checkout main $ git fetch upstream $ git merge upstream/main ``` Once your `main` branch is synchronized, create a new branch from it: ```bash $ git checkout -b a-descriptive-name-for-my-changes ``` **Do not** work on the `main` branch. 4. Set up a development environment by running the following command in a conda or a virtual environment you've created for working on this library: ```bash $ pip install -e ".[dev]" ``` This will install all testing and linting/code quality dependencies for the library (see `quality`, `test_dev`, `test_prod` targets in [`setup.py`](./setup.py)). (If accelerate was already installed in the virtual environment, remove it with `pip uninstall accelerate` before reinstalling it in editable mode with the `-e` flag). Alternatively, if you are using [Visual Studio Code](https://code.visualstudio.com/Download), the fastest way to get set up is by using the provided Dev Container. Documentation on how to get started with dev containers is available [here](https://code.visualstudio.com/docs/remote/containers). 5. Develop the features on your branch. As you work on the features, you should make sure that the test suite passes. You should run the tests impacted by your changes like this (see below an explanation regarding the environment variable): ```bash $ pytest tests/.py ``` > For the following commands leveraging the `make` utility, we recommend using the WSL system when running on > Windows. More information [here](https://docs.microsoft.com/en-us/windows/wsl/about). You can also run the full suite with the following command. ```bash $ make test ``` `accelerate` relies on `ruff` to format its source code consistently. After you make changes, apply automatic style corrections and code verifications that can't be automated in one go with: This target is also optimized to only work with files modified by the PR you're working on. If you prefer to run the checks one after the other, the following command apply the style corrections: ```bash $ make style ``` `accelerate` also uses a few custom scripts to check for coding mistakes. Quality control runs in CI, however you can also run the same checks with: ```bash $ make quality ``` You can also set up [`pre-commit`](https://pre-commit.com/) to run these checks automatically as Git commit hooks. ```bash $ pip install pre-commit $ pre-commit install ``` Once you're happy with your changes, add changed files using `git add` and make a commit with `git commit` to record your changes locally: ```bash $ git add modified_file.py $ git commit ``` Please write [good commit messages](https://chris.beams.io/posts/git-commit/). It is a good idea to sync your copy of the code with the original repository regularly. This way you can quickly account for changes: ```bash $ git fetch upstream $ git rebase upstream/main ``` Push the changes to your account using: ```bash $ git push -u origin a-descriptive-name-for-my-changes ``` 6. Once you are satisfied (**and the checklist below is happy too**), go to the webpage of your fork on GitHub. Click on 'Pull request' to send your changes to the project maintainers for review. 7. It's ok if maintainers ask you for changes. It happens to core contributors too! So everyone can see the changes in the Pull request, work in your local branch and push the changes to your fork. They will automatically appear in the pull request. ### Checklist 1. The title of your pull request should be a summary of its contribution; 2. If your pull request addresses an issue, please mention the issue number in the pull request description to make sure they are linked (and people consulting the issue know you are working on it); 3. To indicate a work in progress please prefix the title with `[WIP]`, or mark the PR as a draft PR. These are useful to avoid duplicated work, and to differentiate it from PRs ready to be merged; 4. Make sure existing tests pass; 5. Add high-coverage tests. No quality testing = no merge. See an example of a good PR here: https://github.com/huggingface/accelerate/pull/255 ### Tests An extensive test suite is included to test the library behavior and several examples. Library tests can be found in the [tests folder](https://github.com/huggingface/accelerate/tree/main/tests). We use `pytest` in order to run the tests. From the root of the repository, here's how to run tests with `pytest` for the library: ```bash $ python -m pytest -sv ./tests ``` In fact, that's how `make test` is implemented (sans the `pip install` line)! You can specify a smaller set of tests in order to test only the feature you're working on. accelerate-1.14.0/LICENSE000066400000000000000000000261351521253476100147070ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. accelerate-1.14.0/Makefile000066400000000000000000000063441521253476100153420ustar00rootroot00000000000000.PHONY: quality style test docs utils check_dirs := . # Check that source code meets quality standards # this target runs checks on all files quality: ruff check $(check_dirs) ruff format --check $(check_dirs) # Format source code automatically and check is there are any problems left that need manual fixing style: ruff check $(check_dirs) --fix ruff format $(check_dirs) # Run tests for the library test_core: python -m pytest -s -v ./tests/ \ --ignore=./tests/test_big_modeling.py \ --ignore=./tests/test_modeling_utils.py \ --ignore=./tests/test_examples.py \ --ignore=./tests/test_cli.py \ --ignore=./tests/deepspeed \ --ignore=./tests/fsdp \ --ignore=./tests/tp \ $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_core.log",) test_cli: python -m pytest -s -v ./tests/test_cli.py $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_cli.log",) test_big_modeling: python -m pytest -s -v ./tests/test_big_modeling.py ./tests/test_modeling_utils.py $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_big_modeling.log",) test_deepspeed: python -m pytest -s -v ./tests/deepspeed $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_deepspeed.log",) test_fsdp: python -m pytest -s -v ./tests/fsdp $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_fsdp.log",) test_tp: python -m pytest -s -v ./tests/tp $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_tp.log",) # Since the new version of pytest will *change* how things are collected, we need `deepspeed` to # run after test_core and test_cli test: @status=0; \ for target in test_core test_cli test_big_modeling test_deepspeed test_fsdp test_tp; do \ $(MAKE) $$target || status=1; \ done; \ exit $$status test_examples: python -m pytest -s -v ./tests/test_examples.py $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_examples.log",) # Example-suite shards used by test.yml test_example_differences: python -m pytest -s -v ./tests/test_examples.py::ExampleDifferenceTests $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_example_diff.log",) test_checkpoint_epoch: python -m pytest -s -v ./tests/test_examples.py::FeatureExamplesTests -k "by_epoch" $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_checkpoint_epoch.log",) test_checkpoint_step: python -m pytest -s -v ./tests/test_examples.py::FeatureExamplesTests -k "by_step" $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_checkpoint_step.log",) # Same as test but used to install only the base dependencies test_prod: $(MAKE) test_core test_rest: python -m pytest -s -v ./tests/test_examples.py::FeatureExamplesTests -k "not by_step and not by_epoch" $(if $(IS_GITHUB_CI),--report-log "$(PYTORCH_VERSION)_rest.log",) # For developers to prepare a release prepare_release: rm -rf dist build python setup.py bdist_wheel sdist # Make sure this is ran in a fresh venv of some form install_test_release: pip uninstall accelerate -y pip install -i https://testpypi.python.org/pypi --extra-index-url https://pypi.org/simple accelerate$(if $(version),==$(version),) # Run as `make target=testpypi upload_release` upload_release: @if [ "$(target)" != "testpypi" ] && [ "$(target)" != "pypi" ]; then \ echo "Error: target must be either 'testpypi' or 'pypi'"; \ exit 1; \ fi twine upload dist/* -r $(target)accelerate-1.14.0/README.md000066400000000000000000000355231521253476100151620ustar00rootroot00000000000000



License Documentation GitHub release Contributor Covenant

Run your *raw* PyTorch training script on any kind of device

## Easy to integrate 🤗 Accelerate was created for PyTorch users who like to write the training loop of PyTorch models but are reluctant to write and maintain the boilerplate code needed to use multi-GPUs/TPU/fp16. 🤗 Accelerate abstracts exactly and only the boilerplate code related to multi-GPUs/TPU/fp16 and leaves the rest of your code unchanged. Here is an example: ```diff import torch import torch.nn.functional as F from datasets import load_dataset + from accelerate import Accelerator + accelerator = Accelerator() - device = 'cpu' + device = accelerator.device model = torch.nn.Transformer().to(device) optimizer = torch.optim.Adam(model.parameters()) dataset = load_dataset('my_dataset') data = torch.utils.data.DataLoader(dataset, shuffle=True) + model, optimizer, data = accelerator.prepare(model, optimizer, data) model.train() for epoch in range(10): for source, targets in data: source = source.to(device) targets = targets.to(device) optimizer.zero_grad() output = model(source) loss = F.cross_entropy(output, targets) - loss.backward() + accelerator.backward(loss) optimizer.step() ``` As you can see in this example, by adding 5-lines to any standard PyTorch training script you can now run on any kind of single or distributed node setting (single CPU, single GPU, multi-GPUs and TPUs) as well as with or without mixed precision (fp8, fp16, bf16). In particular, the same code can then be run without modification on your local machine for debugging or your training environment. 🤗 Accelerate even handles the device placement for you (which requires a few more changes to your code, but is safer in general), so you can even simplify your training loop further: ```diff import torch import torch.nn.functional as F from datasets import load_dataset + from accelerate import Accelerator - device = 'cpu' + accelerator = Accelerator() - model = torch.nn.Transformer().to(device) + model = torch.nn.Transformer() optimizer = torch.optim.Adam(model.parameters()) dataset = load_dataset('my_dataset') data = torch.utils.data.DataLoader(dataset, shuffle=True) + model, optimizer, data = accelerator.prepare(model, optimizer, data) model.train() for epoch in range(10): for source, targets in data: - source = source.to(device) - targets = targets.to(device) optimizer.zero_grad() output = model(source) loss = F.cross_entropy(output, targets) - loss.backward() + accelerator.backward(loss) optimizer.step() ``` Want to learn more? Check out the [documentation](https://huggingface.co/docs/accelerate) or have a look at our [examples](https://github.com/huggingface/accelerate/tree/main/examples). ## Launching script 🤗 Accelerate also provides an optional CLI tool that allows you to quickly configure and test your training environment before launching the scripts. No need to remember how to use `torch.distributed.run` or to write a specific launcher for TPU training! On your machine(s) just run: ```bash accelerate config ``` and answer the questions asked. This will generate a config file that will be used automatically to properly set the default options when doing ```bash accelerate launch my_script.py --args_to_my_script ``` For instance, here is how you would run the GLUE example on the MRPC task (from the root of the repo): ```bash accelerate launch examples/nlp_example.py ``` This CLI tool is **optional**, and you can still use `python my_script.py` or `python -m torchrun my_script.py` at your convenience. You can also directly pass in the arguments you would to `torchrun` as arguments to `accelerate launch` if you wish to not run` accelerate config`. For example, here is how to launch on two GPUs: ```bash accelerate launch --multi_gpu --num_processes 2 examples/nlp_example.py ``` To learn more, check the CLI documentation available [here](https://huggingface.co/docs/accelerate/package_reference/cli). Or view the configuration zoo [here](https://github.com/huggingface/accelerate/blob/main/examples/config_yaml_templates/) ## Launching multi-CPU run using MPI 🤗 Here is another way to launch multi-CPU run using MPI. You can learn how to install Open MPI on [this page](https://www.open-mpi.org/faq/?category=building#easy-build). You can use Intel MPI or MVAPICH as well. Once you have MPI setup on your cluster, just run: ```bash accelerate config ``` Answer the questions that are asked, selecting to run using multi-CPU, and answer "yes" when asked if you want accelerate to launch mpirun. Then, use `accelerate launch` with your script like: ```bash accelerate launch examples/nlp_example.py ``` Alternatively, you can use mpirun directly, without using the CLI like: ```bash mpirun -np 2 python examples/nlp_example.py ``` ## Launching training using DeepSpeed 🤗 Accelerate supports training on single/multiple GPUs using DeepSpeed. To use it, you don't need to change anything in your training code; you can set everything using just `accelerate config`. However, if you desire to tweak your DeepSpeed related args from your Python script, we provide you the `DeepSpeedPlugin`. ```python from accelerate import Accelerator, DeepSpeedPlugin # deepspeed needs to know your gradient accumulation steps beforehand, so don't forget to pass it # Remember you still need to do gradient accumulation by yourself, just like you would have done without deepspeed deepspeed_plugin = DeepSpeedPlugin(zero_stage=2, gradient_accumulation_steps=2) accelerator = Accelerator(mixed_precision='fp16', deepspeed_plugin=deepspeed_plugin) # How to save your 🤗 Transformer? accelerator.wait_for_everyone() unwrapped_model = accelerator.unwrap_model(model) unwrapped_model.save_pretrained(save_dir, save_function=accelerator.save, state_dict=accelerator.get_state_dict(model)) ``` Note: DeepSpeed support is experimental for now. In case you get into some problem, please open an issue. ## Launching your training from a notebook 🤗 Accelerate also provides a `notebook_launcher` function you can use in a notebook to launch a distributed training. This is especially useful for Colab or Kaggle notebooks with a TPU backend. Just define your training loop in a `training_function` then in your last cell, add: ```python from accelerate import notebook_launcher notebook_launcher(training_function) ``` An example can be found in [this notebook](https://github.com/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_nlp_example.ipynb). [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_nlp_example.ipynb) ## Why should I use 🤗 Accelerate? You should use 🤗 Accelerate when you want to easily run your training scripts in a distributed environment without having to renounce full control over your training loop. This is not a high-level framework above PyTorch, just a thin wrapper so you don't have to learn a new library. In fact, the whole API of 🤗 Accelerate is in one class, the `Accelerator` object. ## Why shouldn't I use 🤗 Accelerate? You shouldn't use 🤗 Accelerate if you don't want to write a training loop yourself. There are plenty of high-level libraries above PyTorch that will offer you that, 🤗 Accelerate is not one of them. ## Frameworks using 🤗 Accelerate If you like the simplicity of 🤗 Accelerate but would prefer a higher-level abstraction around its capabilities, some frameworks and libraries that are built on top of 🤗 Accelerate are listed below: * [Amphion](https://github.com/open-mmlab/Amphion) is a toolkit for Audio, Music, and Speech Generation. Its purpose is to support reproducible research and help junior researchers and engineers get started in the field of audio, music, and speech generation research and development. * [Animus](https://github.com/Scitator/animus) is a minimalistic framework to run machine learning experiments. Animus highlights common "breakpoints" in ML experiments and provides a unified interface for them within [IExperiment](https://github.com/Scitator/animus/blob/main/animus/core.py#L76). * [Catalyst](https://github.com/catalyst-team/catalyst#getting-started) is a PyTorch framework for Deep Learning Research and Development. It focuses on reproducibility, rapid experimentation, and codebase reuse so you can create something new rather than write yet another train loop. Catalyst provides a [Runner](https://catalyst-team.github.io/catalyst/api/core.html#runner) to connect all parts of the experiment: hardware backend, data transformations, model training, and inference logic. * [fastai](https://github.com/fastai/fastai#installing) is a PyTorch framework for Deep Learning that simplifies training fast and accurate neural nets using modern best practices. fastai provides a [Learner](https://docs.fast.ai/learner.html#Learner) to handle the training, fine-tuning, and inference of deep learning algorithms. * [Finetuner](https://github.com/jina-ai/finetuner) is a service that enables models to create higher-quality embeddings for semantic search, visual similarity search, cross-modal text<->image search, recommendation systems, clustering, duplication detection, anomaly detection, or other uses. * [InvokeAI](https://github.com/invoke-ai/InvokeAI) is a creative engine for Stable Diffusion models, offering industry-leading WebUI, terminal usage support, and serves as the foundation for many commercial products. * [Kornia](https://kornia.readthedocs.io/en/latest/get-started/introduction.html) is a differentiable library that allows classical computer vision to be integrated into deep learning models. Kornia provides a [Trainer](https://kornia.readthedocs.io/en/latest/x.html#kornia.x.Trainer) with the specific purpose to train and fine-tune the supported deep learning algorithms within the library. * [Open Assistant](https://projects.laion.ai/Open-Assistant/) is a chat-based assistant that understands tasks, can interact with their party systems, and retrieve information dynamically to do so. * [pytorch-accelerated](https://github.com/Chris-hughes10/pytorch-accelerated) is a lightweight training library, with a streamlined feature set centered around a general-purpose [Trainer](https://pytorch-accelerated.readthedocs.io/en/latest/trainer.html), that places a huge emphasis on simplicity and transparency; enabling users to understand exactly what is going on under the hood, but without having to write and maintain the boilerplate themselves! * [Stable Diffusion web UI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) is an open-source browser-based easy-to-use interface based on the Gradio library for Stable Diffusion. * [torchkeras](https://github.com/lyhue1991/torchkeras) is a simple tool for training pytorch model just in a keras style, a dynamic and beautiful plot is provided in notebook to monitor your loss or metric. * [transformers](https://github.com/huggingface/transformers) as a tool for helping train state-of-the-art machine learning models in PyTorch, Tensorflow, and JAX. (Accelerate is the backend for the PyTorch side). ## Installation This repository is tested on Python 3.8+ and PyTorch 1.10.0+ You should install 🤗 Accelerate in a [virtual environment](https://docs.python.org/3/library/venv.html). If you're unfamiliar with Python virtual environments, check out the [user guide](https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/). First, create a virtual environment with the version of Python you're going to use and activate it. Then, you will need to install PyTorch: refer to the [official installation page](https://pytorch.org/get-started/locally/#start-locally) regarding the specific install command for your platform. Then 🤗 Accelerate can be installed using pip as follows: ```bash pip install accelerate ``` ## Supported integrations - CPU only - multi-CPU on one node (machine) - multi-CPU on several nodes (machines) - single GPU - multi-GPU on one node (machine) - multi-GPU on several nodes (machines) - TPU - FP16/BFloat16 mixed precision - FP8 mixed precision with [Transformer Engine](https://github.com/NVIDIA/TransformerEngine) or [MS-AMP](https://github.com/Azure/MS-AMP/) - DeepSpeed support (Experimental) - PyTorch Fully Sharded Data Parallel (FSDP) support (Experimental) - Megatron-LM support (Experimental) ## Citing 🤗 Accelerate If you use 🤗 Accelerate in your publication, please cite it by using the following BibTeX entry. ```bibtex @Misc{accelerate, title = {Accelerate: Training and inference at scale made simple, efficient and adaptable.}, author = {Sylvain Gugger and Lysandre Debut and Thomas Wolf and Philipp Schmid and Zachary Mueller and Sourab Mangrulkar and Marc Sun and Benjamin Bossan}, howpublished = {\url{https://github.com/huggingface/accelerate}}, year = {2022} } ``` accelerate-1.14.0/benchmarks/000077500000000000000000000000001521253476100160105ustar00rootroot00000000000000accelerate-1.14.0/benchmarks/README.md000066400000000000000000000002241521253476100172650ustar00rootroot00000000000000# Benchmarks The folders below contain suites to test various functionalities in Accelerate. See their relevant README.md's for more information. accelerate-1.14.0/benchmarks/big_model_inference/000077500000000000000000000000001521253476100217475ustar00rootroot00000000000000accelerate-1.14.0/benchmarks/big_model_inference/README.md000066400000000000000000000037641521253476100232400ustar00rootroot00000000000000# Big model inference benchmarks Running inference with Accelerate on big models. ## Setup These benchmarks use the `transformers` library: ```bash pip install transformers ``` To reproduce or test a new setup, run ```py python big_model_inference.py model_name ``` This script supports `gpt-j-6b`, `gpt-neox`, `opt` (30B version) and `T0pp` out of the box, but you can specify any valid checkpoint for `model_name`. To force a different `torch_dtype` than the one in the config: `--torch_dtype xxx`. If you get an error linked to disk offload, you need to add the option `--disk-offload` ## Results On a setup with two Titan RTXs (24GB of RAM) and 32GB of RAM, we get the following benchmarks (T0pp does not run in float16, which is why it's not included). | Model | Model load time | Generation time | dtype | GPU 0 use | GPU 1 use | CPU use | Disk offload | |:-----:|:---------------:|:---------------:|:-----:|:---------:|:---------:|:-------:|:------------:| | GPT-J-6B | 8.7s | 0.05s per token | float16 | 11.7GB | 0GB | 0GB | no | | GPT-J-6B | 12.4s | 0.06s per token | float32 | 21.9GB | 1.5GB | 0GB | no | | GPT-Neo-X-20B | 30.9s | 0.08s per token | float16 | 21.5GB | 18GB | 0GB | no | | GPT-Neo-X-20B | 78.2s | 10.72s per token | float32 | 20.3GB | 22.7 GB | 24.4GB | yes | | T0pp (11B) | 29.4s | 0.05s per token | float32 | 21.1GB | 21.3GB | 0GB | no | | OPT-30B | 34.5s | 2.37s per token | float16 | 20.7GB | 22.3GB | 14.1GB | no | | OPT-30B | 112.3s | 33.9s per token | float32 | 20.2GB | 21.2GB | 23.5GB | yes | Note on the results: - using two GPUs instead of one does not slow down generation - using CPU offload slows down a bit (see OPT-30b) - using disk offload slows down a lot (need to implement prefetching) You will also note that Accelerate does not use anymore GPU and CPU RAM than necessary: - peak GPU memory is exactly the size of the model put on a given GPU - peak CPU memory is either the size of the biggest checkpoint shard or the part of the model offloaded on CPU, whichever is bigger. accelerate-1.14.0/benchmarks/big_model_inference/big_model_inference.py000066400000000000000000000133371521253476100262670ustar00rootroot00000000000000# Copyright 2022 The HuggingFace Team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import time import torch import transformers from measures_util import end_measure, log_measures, start_measure from transformers import AutoConfig, AutoModelForCausalLM, AutoModelForSeq2SeqLM, AutoTokenizer from accelerate.utils import compute_module_sizes DEFAULT_MODELS = { "gpt-j-6b": {"is_causal": True, "model": "sgugger/sharded-gpt-j-6B", "tokenizer": "EleutherAI/gpt-j-6B"}, "gpt-neox": {"is_causal": True, "model": "EleutherAI/gpt-neox-20b"}, "opt": {"is_causal": True, "model": "facebook/opt-30b"}, "T0pp": {"is_causal": False, "model": "bigscience/T0pp", "model_revision": "sharded"}, } PROMPTS = [ "Hello, my name is", "Are unicorns real? Unicorns are", "For the first time in several years,", "My name is Julien and I am", "The goal of life is", "Whenever I'm sad, I like to", ] def parse_args(): parser = argparse.ArgumentParser(description="Run and time generations on a big model using Accelerate.") parser.add_argument("model_name", type=str, default=None, help="The name of the model to try.") parser.add_argument( "--tokenizer_name", type=str, default=None, help="The name of the tokenizer (if different from the model." ) parser.add_argument("--is_causal", type=bool, default=None, help="Whether or not the model is causal.") parser.add_argument( "--model_revision", type=str, default=None, help="The revision to use for the model checkpoint." ) parser.add_argument("--torch_dtype", type=str, default=None, help="The dtype for the model.") parser.add_argument("--disk_offload", action="store_true") args = parser.parse_args() # Sanitize args if args.model_name in DEFAULT_MODELS: defaults = DEFAULT_MODELS[args.model_name] args.model_name = defaults["model"] if args.tokenizer_name is None: args.tokenizer_name = defaults.get("tokenizer", args.model_name) if args.is_causal is None: args.is_causal = defaults["is_causal"] if args.model_revision is None: args.model_revision = defaults.get("model_revision", "main") if args.is_causal is None: raise ValueError("Could not infer the default for `--is_causal`, pass either True or False for it.") if args.tokenizer_name is None: args.tokenizer_name = args.model_name if args.model_revision is None: args.model_revision = "main" return args def main(): transformers.utils.logging.set_verbosity_error() args = parse_args() if args.torch_dtype is None: config = AutoConfig.from_pretrained(args.model_name) torch_dtype = getattr(config, "torch_dtype", torch.float32) else: torch_dtype = getattr(torch, args.torch_dtype) model_cls = AutoModelForCausalLM if args.is_causal else AutoModelForSeq2SeqLM kwargs = { "torch_dtype": torch_dtype, "revision": args.model_revision, } if args.disk_offload: kwargs["offload_folder"] = "tmp_offload" kwargs["offload_state_dict"] = True start_measures = start_measure() model = model_cls.from_pretrained(args.model_name, device_map="auto", **kwargs) end_measures = end_measure(start_measures) log_measures(end_measures, "Model loading") module_sizes = compute_module_sizes(model) device_size = {v: 0 for v in model.hf_device_map.values()} for module, device in model.hf_device_map.items(): device_size[device] += module_sizes[module] message = "\n".join([f"- {device}: {size // 2**20}MiB" for device, size in device_size.items()]) print(f"\nTheoretical use:\n{message}") tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_name) start_measures = start_measure() generation_times = [] gen_tokens = [] texts_outs = [] for prompt in PROMPTS: inputs = tokenizer(prompt, return_tensors="pt").to(0) tokens = inputs["input_ids"][0].tolist() before_generate = time.time() outputs = model.generate(inputs["input_ids"]) after_generate = time.time() outputs = outputs[0].tolist() num_gen_tokens = len(outputs) if outputs[: len(tokens)] != tokens else len(outputs) - len(tokens) generation_time = after_generate - before_generate text_out = tokenizer.decode(outputs, skip_special_tokens=True) texts_outs.append(text_out) generation_times.append(generation_time) gen_tokens.append(num_gen_tokens) print(f"Prompt: {prompt}\nGeneration {text_out}\nIn {generation_time:.2f}s for {num_gen_tokens} tokens\n") end_measures = end_measure(start_measures) log_measures(end_measures, "Model generation") generation_times_per_token = [gen / tok for gen, tok in zip(generation_times, gen_tokens)] avg_gen = sum(generation_times_per_token) / len(generation_times) print(f"Average time of generation per token: {avg_gen:.2f}s") print(f"First generation (avg time per token): {generation_times_per_token[0]:.2f}s") avg_gen = sum(generation_times_per_token[1:]) / (len(generation_times_per_token) - 1) print(f"Average time of generation per token (excluding the first): {avg_gen:.2f}s") if __name__ == "__main__": main() accelerate-1.14.0/benchmarks/big_model_inference/measures_util.py000066400000000000000000000062761521253476100252150ustar00rootroot00000000000000# Copyright 2023 The HuggingFace Team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import gc import threading import time import psutil import torch from accelerate.test_utils.testing import get_backend torch_device_type, _, _ = get_backend() torch_accelerator_module = getattr(torch, torch_device_type, torch.cuda) class PeakCPUMemory: def __init__(self): self.process = psutil.Process() self.peak_monitoring = False def peak_monitor(self): self.cpu_memory_peak = -1 while True: self.cpu_memory_peak = max(self.process.memory_info().rss, self.cpu_memory_peak) # can't sleep or will not catch the peak right (this comment is here on purpose) if not self.peak_monitoring: break def start(self): self.peak_monitoring = True self.thread = threading.Thread(target=self.peak_monitor) self.thread.daemon = True self.thread.start() def stop(self): self.peak_monitoring = False self.thread.join() return self.cpu_memory_peak cpu_peak_tracker = PeakCPUMemory() def start_measure(): # Time measures = {"time": time.time()} gc.collect() torch_accelerator_module.empty_cache() # CPU mem measures["cpu"] = psutil.Process().memory_info().rss cpu_peak_tracker.start() # GPU mem for i in range(torch_accelerator_module.device_count()): measures[str(i)] = torch_accelerator_module.memory_allocated(i) torch_accelerator_module.reset_peak_memory_stats() return measures def end_measure(start_measures): # Time measures = {"time": time.time() - start_measures["time"]} gc.collect() torch_accelerator_module.empty_cache() # CPU mem measures["cpu"] = (psutil.Process().memory_info().rss - start_measures["cpu"]) / 2**20 measures["cpu-peak"] = (cpu_peak_tracker.stop() - start_measures["cpu"]) / 2**20 # GPU mem for i in range(torch_accelerator_module.device_count()): measures[str(i)] = (torch_accelerator_module.memory_allocated(i) - start_measures[str(i)]) / 2**20 measures[f"{i}-peak"] = (torch_accelerator_module.max_memory_allocated(i) - start_measures[str(i)]) / 2**20 return measures def log_measures(measures, description): print(f"{description}:") print(f"- Time: {measures['time']:.2f}s") for i in range(torch_accelerator_module.device_count()): print(f"- {torch_device_type} {i} allocated: {measures[str(i)]:.2f}MiB") peak = measures[f"{i}-peak"] print(f"- {torch_device_type} {i} peak: {peak:.2f}MiB") print(f"- CPU RAM allocated: {measures['cpu']:.2f}MiB") print(f"- CPU RAM peak: {measures['cpu-peak']:.2f}MiB") accelerate-1.14.0/benchmarks/fp8/000077500000000000000000000000001521253476100165055ustar00rootroot00000000000000accelerate-1.14.0/benchmarks/fp8/ms_amp/000077500000000000000000000000001521253476100177615ustar00rootroot00000000000000accelerate-1.14.0/benchmarks/fp8/ms_amp/Dockerfile000066400000000000000000000003311521253476100217500ustar00rootroot00000000000000FROM ghcr.io/azure/msamp RUN pip install transformers evaluate datasets RUN git clone https://github.com/huggingface/accelerate RUN cd accelerate && \ pip install -e . && \ cd benchmarks/fp8 CMD ["bash"] accelerate-1.14.0/benchmarks/fp8/ms_amp/ddp.py000066400000000000000000000124661521253476100211130ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `MS-AMP`. This particular script verifies this for DDP training. """ import evaluate import msamp import torch from fp8_utils import evaluate_model, get_training_utilities from torch.nn.parallel import DistributedDataParallel as DDP from accelerate import Accelerator from accelerate.state import AcceleratorState from accelerate.utils import FP8RecipeKwargs, get_grad_scaler, set_seed MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") def train_baseline(opt_level="O2"): set_seed(42) scaler = get_grad_scaler() model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities(MODEL_NAME) accelerator = Accelerator() device = accelerator.device model, optimizer = msamp.initialize(model, optimizer, opt_level=opt_level) model.to(device) # Convert the model to DDP device_ids, output_device = [accelerator.local_process_index], accelerator.local_process_index model = DDP(model, device_ids=device_ids, output_device=output_device) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for i, batch in enumerate(train_dataloader): with torch.autocast(device_type="cuda", dtype=torch.bfloat16): outputs = model(**batch) loss = outputs.loss scaler.scale(loss).backward() optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results def train_integration(opt_level="O2"): kwargs_handlers = [FP8RecipeKwargs(backend="msamp", opt_level=opt_level)] AcceleratorState()._reset_state(True) accelerator = Accelerator(mixed_precision="fp8", kwargs_handlers=kwargs_handlers) set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model, optimizer = accelerator.prepare(model, optimizer) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for i, batch in enumerate(train_dataloader): with torch.autocast(device_type="cuda", dtype=torch.bfloat16): outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results if __name__ == "__main__": for opt_level in ["O1", "O2"]: baseline_not_trained, baseline_trained = train_baseline(opt_level) accelerator_not_trained, accelerator_trained = train_integration(opt_level) assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"Accuracy not the same for untrained baseline and accelerator using opt_level={opt_level}: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"F1 not the same for untrained baseline and accelerator using opt_level={opt_level}: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"Accuracy not the same for trained baseline and accelerator using opt_level={opt_level}: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"F1 not the same for trained baseline and accelerator using opt_level={opt_level}: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) accelerate-1.14.0/benchmarks/fp8/ms_amp/distrib_deepspeed.py000066400000000000000000000146501521253476100240170ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `MS-AMP`. This particular script verifies this for DeepSpeed training. NOTE: MS-AMP does *not* support ZeRO-3. """ # import msamp.deepspeed as msamp_deepspeed import evaluate import torch from fp8_utils import evaluate_model, get_training_utilities from msamp import deepspeed as msamp_deepspeed from accelerate import Accelerator, DeepSpeedPlugin from accelerate.state import AcceleratorState from accelerate.utils import set_seed MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") def train_baseline(zero_stage: int = 1, opt_level: str = "O1"): set_seed(42) accelerator = Accelerator() model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) import numpy as np config = { "train_batch_size": 32, "train_micro_batch_size_per_gpu": 16, "gradient_accumulation_steps": 1, "zero_optimization": { "stage": zero_stage, "offload_optimizer": {"device": "none", "nvme_path": None}, "offload_param": {"device": "none", "nvme_path": None}, }, "gradient_clipping": 1.0, "steps_per_print": np.inf, "bf16": {"enabled": True}, "fp16": {"enabled": False}, "zero_allow_untested_optimizer": True, "msamp": { "enabled": True, "opt_level": opt_level, }, } ( model, optimizer, _, _, ) = msamp_deepspeed.initialize( model=model, optimizer=optimizer, config_params=config, ) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for _ in range(2): for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss model.backward(loss) model.step() for _ in range(accelerator.num_processes): lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.destroy() torch.cuda.empty_cache() AcceleratorState()._reset_state(True) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results def train_integration(zero_stage: int = 1, opt_level: str = "O1"): set_seed(42) deepspeed_plugin = DeepSpeedPlugin( zero_stage=zero_stage, enable_msamp=True, msamp_opt_level=opt_level, ) accelerator = Accelerator(mixed_precision="fp8", deepspeed_plugin=deepspeed_plugin) accelerator.state.deepspeed_plugin.deepspeed_config["train_micro_batch_size_per_gpu"] = 16 model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model, optimizer, lr_scheduler = accelerator.prepare(model, optimizer, lr_scheduler) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for _ in range(2): for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.destroy() torch.cuda.empty_cache() assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) AcceleratorState()._reset_state(True) return base_model_results, trained_model_results if __name__ == "__main__": for zero_stage in [1, 2]: for opt_level in ["O1", "O2", "O3"]: baseline_not_trained, baseline_trained = train_baseline(zero_stage, opt_level) accelerator_not_trained, accelerator_trained = train_integration(zero_stage, opt_level) assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"ZERO stage {zero_stage}, opt_level={opt_level}:\nAccuracy should be the same for the baseline and accelerator: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"ZERO stage {zero_stage}, opt_level={opt_level}:\nF1 score should be the same for the baseline and accelerator: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"ZERO stage {zero_stage}, opt_level={opt_level}:\nAccuracy should be the same for the baseline and accelerator: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"ZERO stage {zero_stage}, opt_level={opt_level}:\nF1 score should be the same for the baseline and accelerator: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) torch.distributed.destroy_process_group() accelerate-1.14.0/benchmarks/fp8/ms_amp/fp8_utils.py000066400000000000000000000106601521253476100222530ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import torch def get_dataloaders(model_name: str, batch_size: int = 16): from datasets import load_dataset from torch.utils.data import DataLoader from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained(model_name) datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): return tokenizer.pad( examples, padding="longest", pad_to_multiple_of=16, # Specific for FP8 return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size, drop_last=True ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=16, drop_last=True, ) return train_dataloader, eval_dataloader def get_training_utilities(model_name: str, batch_size: int = 16, accelerator=None): """ Returns a tuple of: - Model - Optimizer - Train dataloader (prepared) - Eval dataloader (prepared) - LR Scheduler Suitable for training on the MRPC dataset """ from torch.optim import AdamW from transformers import AutoModelForSequenceClassification, get_linear_schedule_with_warmup from accelerate import Accelerator if accelerator is None: accelerator = Accelerator() model = AutoModelForSequenceClassification.from_pretrained(model_name) train_dataloader, eval_dataloader = get_dataloaders(model_name, batch_size) optimizer = AdamW(model.parameters(), lr=0.0001) lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=len(train_dataloader) * 2, ) train_dataloader, eval_dataloader = accelerator.prepare(train_dataloader, eval_dataloader) return model, optimizer, train_dataloader, eval_dataloader, lr_scheduler def get_named_parameters(model): """ Same thing as `Accelerator.get_named_parameters` Returns a list of the named parameters of the model (extracted from parallel) """ from accelerate.utils import extract_model_from_parallel model = extract_model_from_parallel(model) return {n: p for n, p in model.named_parameters()} def evaluate_model(model, dataloader, metric, accelerator=None): "Turns model to .eval(), runs dataloader, calculates metric, then turns eval back on" model.eval() for step, batch in enumerate(dataloader): with torch.no_grad(): # W/ MS-AMP, we need to cast while evaluating with torch.autocast(device_type="cuda", dtype=torch.bfloat16): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) references = batch["labels"] if accelerator is not None and accelerator.num_processes > 1: predictions, references = accelerator.gather_for_metrics((predictions, references)) metric.add_batch(predictions=predictions, references=references) return metric.compute() accelerate-1.14.0/benchmarks/fp8/ms_amp/non_distributed.py000066400000000000000000000114211521253476100235260ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `MS-AMP`. This particular script verifies this for single GPU training. """ import evaluate import msamp import torch from fp8_utils import evaluate_model, get_training_utilities from accelerate import Accelerator from accelerate.state import AcceleratorState from accelerate.utils import FP8RecipeKwargs, get_grad_scaler, set_seed MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") def train_baseline(opt_level="O2"): set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities(MODEL_NAME) model, optimizer = msamp.initialize(model, optimizer, opt_level=opt_level) model.to("cuda") base_model_results = evaluate_model(model, eval_dataloader, METRIC) model.train() scaler = get_grad_scaler() for batch in train_dataloader: batch = batch.to("cuda") with torch.autocast(device_type="cuda", dtype=torch.bfloat16): outputs = model(**batch) loss = outputs.loss loss = scaler.scale(loss) loss.backward() optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results def train_integration(opt_level="O2"): kwargs_handlers = [FP8RecipeKwargs(backend="msamp", opt_level=opt_level)] AcceleratorState()._reset_state(True) accelerator = Accelerator(mixed_precision="fp8", kwargs_handlers=kwargs_handlers) set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model, optimizer, lr_scheduler = accelerator.prepare(model, optimizer, lr_scheduler) base_model_results = evaluate_model(model, eval_dataloader, METRIC) model.train() for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results if __name__ == "__main__": for opt_level in ["O1", "O2"]: baseline_not_trained, baseline_trained = train_baseline(opt_level) accelerator_not_trained, accelerator_trained = train_integration(opt_level) assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) accelerate-1.14.0/benchmarks/fp8/torchao/000077500000000000000000000000001521253476100201445ustar00rootroot00000000000000accelerate-1.14.0/benchmarks/fp8/torchao/Dockerfile000066400000000000000000000003531521253476100221370ustar00rootroot00000000000000FROM nvcr.io/nvidia/pytorch:24.07-py3 RUN pip install transformers evaluate datasets RUN git clone https://github.com/huggingface/accelerate.git RUN cd accelerate && \ pip install -e . && \ cd benchmarks/fp8 RUN /bin/bash accelerate-1.14.0/benchmarks/fp8/torchao/README.md000066400000000000000000000020651521253476100214260ustar00rootroot00000000000000# FP8 Benchmarks Comparing and running [torchao](https://github.com/pytorch/ao/tree/main/torchao/float8) FP8 with accelerate ## Overview This repo provides scripts which compare native `torchao` model training against `accelerate`'s own integration. Each modeling type is segmented out via a script, supporting the following: * Single GPU training (`non_distributed.py`) * Multi-GPU training via DistributedDataParallelism (`ddp.py`) * Fully Sharded Data Parallelism (`fsdp.py`) * DeepSpeed ZeRO 1-3 (`deepspeed.py`) To run them, it's recommended to use a docker image (see the attached `Dockerfile`) and not install `torchao` manually. ## Running: There are official Docker images located at `huggingface/accelerate:gpu-fp8-torchao-nightly` which can be used. You can run all scripts using the core `accelerate launch` command without any `accelerate config` being needed. For single GPU, run it via `python`: ```bash python non_distributed.py ``` For the rest, run it via `accelerate launch`: ```bash accelerate launch ddp.py # or distrib_deepspeed.py, ddp.py ```accelerate-1.14.0/benchmarks/fp8/torchao/ddp.py000066400000000000000000000146101521253476100212670ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `torchao`. This particular script verifies this for DDP training. """ from functools import partial import evaluate import torch from fp8_utils import get_training_utilities from torch.nn.parallel import DistributedDataParallel as DDP from torchao.float8 import convert_to_float8_training from accelerate import Accelerator from accelerate.state import AcceleratorState from accelerate.utils import AORecipeKwargs, set_seed MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") def evaluate_model(model, dataloader, metric, accelerator=None): "Turns model to .eval(), runs dataloader, calculates metric, then turns eval back on" model.eval() for step, batch in enumerate(dataloader): with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) references = batch["labels"] if accelerator is not None and accelerator.num_processes > 1: predictions, references = accelerator.gather_for_metrics((predictions, references)) metric.add_batch(predictions=predictions, references=references) return metric.compute() def filter_linear_layers(module, fqn, first_layer_name=None, last_layer_name=None): if isinstance(module, torch.nn.Linear): if module.in_features % 16 != 0 or module.out_features % 16 != 0: return False # For stability reasons, we skip the first and last linear layers # Otherwise can lead to the model not training or converging properly if fqn in (first_layer_name, last_layer_name): return False return True def train_baseline(): set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities(MODEL_NAME) first_linear = None last_linear = None for name, module in model.named_modules(): if isinstance(module, torch.nn.Linear): if first_linear is None: first_linear = name last_linear = name func = partial(filter_linear_layers, first_layer_name=first_linear, last_layer_name=last_linear) accelerator = Accelerator() device = accelerator.device model.to(device) convert_to_float8_training(model, module_filter_fn=func) # Convert the model to DDP device_ids, output_device = [accelerator.local_process_index], accelerator.local_process_index model = DDP(model, device_ids=device_ids, output_device=output_device) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for batch in train_dataloader: with torch.autocast(device_type=device.type, dtype=torch.bfloat16): batch = batch.to(device) outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results def train_integration(): AcceleratorState()._reset_state(True) accelerator = Accelerator(mixed_precision="fp8", kwargs_handlers=[AORecipeKwargs()]) set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model, optimizer = accelerator.prepare(model, optimizer) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results if __name__ == "__main__": baseline_not_trained, baseline_trained = train_baseline() accelerator_not_trained, accelerator_trained = train_integration() assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) torch.distributed.destroy_process_group() accelerate-1.14.0/benchmarks/fp8/torchao/distrib_deepspeed.py000066400000000000000000000203201521253476100241710ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `torchao`. This particular script verifies this for deepspeed training. """ from functools import partial from unittest.mock import patch import deepspeed import evaluate import torch from fp8_utils import evaluate_model, get_training_utilities from torchao.float8 import convert_to_float8_training from transformers.integrations import HfDeepSpeedConfig from accelerate import Accelerator, DeepSpeedPlugin from accelerate.state import AcceleratorState from accelerate.utils import AORecipeKwargs, set_seed MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") def filter_linear_layers(module, fqn, first_layer_name=None, last_layer_name=None): if isinstance(module, torch.nn.Linear): if module.in_features % 16 != 0 or module.out_features % 16 != 0: return False # For stability reasons, we skip the first and last linear layers # Otherwise can lead to the model not training or converging properly if fqn in (first_layer_name, last_layer_name): return False return True def train_baseline(zero_stage: int = 1): set_seed(42) # This forces transformers to think Zero-3 Init should be used with patch("transformers.integrations.deepspeed.is_deepspeed_zero3_enabled") as mock: mock.return_value = zero_stage == 3 config = HfDeepSpeedConfig( { "train_micro_batch_size_per_gpu": 16, "gradient_accumulation_steps": 1, "zero_optimization": {"stage": zero_stage}, } ) plugin = DeepSpeedPlugin(hf_ds_config=config) accelerator = Accelerator(deepspeed_plugin=plugin) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) first_linear = None last_linear = None for name, module in model.named_modules(): if isinstance(module, torch.nn.Linear): if first_linear is None: first_linear = name last_linear = name func = partial(filter_linear_layers, first_layer_name=first_linear, last_layer_name=last_linear) convert_to_float8_training(model, module_filter_fn=func) import numpy as np config = { "train_batch_size": 32, "train_micro_batch_size_per_gpu": 16, "gradient_accumulation_steps": 1, "zero_optimization": { "stage": zero_stage, "offload_optimizer": {"device": "none", "nvme_path": None}, "offload_param": {"device": "none", "nvme_path": None}, "stage3_gather_16bit_weights_on_model_save": False, }, "gradient_clipping": 1.0, "steps_per_print": np.inf, "bf16": {"enabled": True}, "fp16": {"enabled": False}, "zero_allow_untested_optimizer": True, } ( model, optimizer, _, lr_scheduler, ) = deepspeed.initialize( model=model, optimizer=optimizer, lr_scheduler=lr_scheduler, config_params=config, ) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() model_outputs = [] data = [] for batch in train_dataloader: outputs = model(**batch) data.append(batch.to("cpu")) model_outputs.append(outputs.logits.to("cpu")) loss = outputs.loss model.backward(loss) model.step() for _ in range(accelerator.num_processes): lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.destroy() assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) del config return base_model_results, trained_model_results, model_outputs, data def train_integration(zero_stage: int = 1): set_seed(42) AcceleratorState()._reset_state(True) config = HfDeepSpeedConfig( { "train_micro_batch_size_per_gpu": 16, "gradient_accumulation_steps": 1, "zero_optimization": {"stage": zero_stage}, } ) deepspeed_plugin = DeepSpeedPlugin( hf_ds_config=config, ) # This forces transformers to think Zero-3 Init should be used with patch("transformers.integrations.deepspeed.is_deepspeed_zero3_enabled") as mock: mock.return_value = zero_stage == 3 accelerator = Accelerator( mixed_precision="fp8", kwargs_handlers=[AORecipeKwargs()], deepspeed_plugin=deepspeed_plugin ) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model, optimizer, lr_scheduler, train_dataloader, eval_dataloader = accelerator.prepare( model, optimizer, lr_scheduler, train_dataloader, eval_dataloader ) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() model_outputs = [] data = [] for batch in train_dataloader: outputs = model(**batch) data.append(batch.to("cpu")) model_outputs.append(outputs.logits.to("cpu")) loss = outputs.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.destroy() assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) del config return base_model_results, trained_model_results, model_outputs, data if __name__ == "__main__": for zero_stage in [1, 2, 3]: baseline_not_trained, baseline_trained, baseline_outputs, baseline_data = train_baseline(zero_stage) accelerator_not_trained, accelerator_trained, accelerator_outputs, accelerator_data = train_integration( zero_stage ) assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"ZERO stage {zero_stage}: Accuracy should be the same for the baseline and accelerator: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"ZERO stage {zero_stage}: F1 score should be the same for the baseline and accelerator: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"ZERO stage {zero_stage}: Accuracy should be the same for the baseline and accelerator: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"ZERO stage {zero_stage}: F1 score should be the same for the baseline and accelerator: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) AcceleratorState()._reset_state(True) torch.distributed.destroy_process_group() accelerate-1.14.0/benchmarks/fp8/torchao/fp8_utils.py000066400000000000000000000104651521253476100224410ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import torch def get_dataloaders(model_name: str, batch_size: int = 16): from datasets import load_dataset from torch.utils.data import DataLoader from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained(model_name) datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): return tokenizer.pad( examples, padding="longest", pad_to_multiple_of=16, # Specific for FP8 return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size, drop_last=True ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=16, drop_last=True, ) return train_dataloader, eval_dataloader def get_training_utilities(model_name: str, batch_size: int = 16, accelerator=None, prepare=True): """ Returns a tuple of: - Model - Optimizer - Train dataloader (prepared) - Eval dataloader (prepared) - LR Scheduler Suitable for training on the MRPC dataset """ from torch.optim import AdamW from transformers import AutoModelForSequenceClassification, get_linear_schedule_with_warmup from accelerate import Accelerator if accelerator is None: accelerator = Accelerator() model = AutoModelForSequenceClassification.from_pretrained(model_name) train_dataloader, eval_dataloader = get_dataloaders(model_name, batch_size) optimizer = AdamW(model.parameters(), lr=0.0001) lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=len(train_dataloader) * 2, ) train_dataloader, eval_dataloader = accelerator.prepare(train_dataloader, eval_dataloader) return model, optimizer, train_dataloader, eval_dataloader, lr_scheduler def get_named_parameters(model): """ Same thing as `Accelerator.get_named_parameters` Returns a list of the named parameters of the model (extracted from parallel) """ from accelerate.utils import extract_model_from_parallel model = extract_model_from_parallel(model) return {n: p for n, p in model.named_parameters()} def evaluate_model(model, dataloader, metric, accelerator=None): "Turns model to .eval(), runs dataloader, calculates metric, then turns eval back on" model.eval() for step, batch in enumerate(dataloader): with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) references = batch["labels"] if accelerator is not None and accelerator.num_processes > 1: predictions, references = accelerator.gather_for_metrics((predictions, references)) metric.add_batch(predictions=predictions, references=references) return metric.compute() accelerate-1.14.0/benchmarks/fp8/torchao/fsdp.py000066400000000000000000000157371521253476100214670ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `torchao`. This particular script verifies this for FSDP training. """ from functools import partial import evaluate import torch from fp8_utils import get_training_utilities from torch.distributed.fsdp import FullyShardedDataParallel as FSDP from torch.distributed.fsdp import MixedPrecision from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy from torchao.float8 import convert_to_float8_training from transformers.models.bert import BertLayer from accelerate import Accelerator from accelerate import FullyShardedDataParallelPlugin as FSDPPlugin from accelerate.state import AcceleratorState from accelerate.utils import AORecipeKwargs, set_seed MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") FSDP_WRAP_POLICY = partial(transformer_auto_wrap_policy, transformer_layer_cls={BertLayer}) def filter_linear_layers(module, fqn, first_layer_name=None, last_layer_name=None): if isinstance(module, torch.nn.Linear): if module.in_features % 16 != 0 or module.out_features % 16 != 0: return False # For stability reasons, we skip the first and last linear layers # Otherwise can lead to the model not training or converging properly if fqn in (first_layer_name, last_layer_name): return False return True def evaluate_model(model, dataloader, metric, accelerator=None): "Turns model to .eval(), runs dataloader, calculates metric, then turns eval back on" model.eval() for step, batch in enumerate(dataloader): with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) references = batch["labels"] if accelerator is not None and accelerator.num_processes > 1: predictions, references = accelerator.gather_for_metrics((predictions, references)) metric.add_batch(predictions=predictions, references=references) return metric.compute() def train_baseline(): set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities(MODEL_NAME) first_linear = None last_linear = None for name, module in model.named_modules(): if isinstance(module, torch.nn.Linear): if first_linear is None: first_linear = name last_linear = name func = partial(filter_linear_layers, first_layer_name=first_linear, last_layer_name=last_linear) accelerator = Accelerator() device = accelerator.device model.to(device) convert_to_float8_training(model, module_filter_fn=func) # Convert the model to FSDP model = FSDP( model, use_orig_params=True, mixed_precision=MixedPrecision(param_dtype=torch.bfloat16, reduce_dtype=torch.float32), auto_wrap_policy=FSDP_WRAP_POLICY, ) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for batch in train_dataloader: with torch.autocast(device_type=device.type, dtype=torch.bfloat16): batch = batch.to(device) outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results def train_integration(): AcceleratorState()._reset_state(True) fsdp_plugin = FSDPPlugin( auto_wrap_policy=FSDP_WRAP_POLICY, use_orig_params=True, mixed_precision_policy=MixedPrecision(param_dtype=torch.bfloat16, reduce_dtype=torch.float32), ) accelerator = Accelerator(mixed_precision="fp8", fsdp_plugin=fsdp_plugin, kwargs_handlers=[AORecipeKwargs()]) set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model, optimizer = accelerator.prepare(model, optimizer) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results if __name__ == "__main__": baseline_not_trained, baseline_trained = train_baseline() accelerator_not_trained, accelerator_trained = train_integration() assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) torch.distributed.destroy_process_group() accelerate-1.14.0/benchmarks/fp8/torchao/non_distributed.py000066400000000000000000000136461521253476100237240ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `torchao`. This particular script verifies this for single GPU training. """ from functools import partial import evaluate import torch from fp8_utils import get_training_utilities from torchao.float8 import convert_to_float8_training from accelerate import Accelerator from accelerate.state import AcceleratorState from accelerate.utils import AORecipeKwargs, set_seed MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") def evaluate_model(model, dataloader, metric, accelerator=None): "Turns model to .eval(), runs dataloader, calculates metric, then turns eval back on" model.eval() for step, batch in enumerate(dataloader): with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) references = batch["labels"] if accelerator is not None and accelerator.num_processes > 1: predictions, references = accelerator.gather_for_metrics((predictions, references)) metric.add_batch(predictions=predictions, references=references) return metric.compute() def filter_linear_layers(module, fqn, first_layer_name=None, last_layer_name=None): if isinstance(module, torch.nn.Linear): if module.in_features % 16 != 0 or module.out_features % 16 != 0: return False # For stability reasons, we skip the first and last linear layers # Otherwise can lead to the model not training or converging properly if fqn in (first_layer_name, last_layer_name): return False return True def train_baseline(): set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities(MODEL_NAME) first_linear = None last_linear = None for name, module in model.named_modules(): if isinstance(module, torch.nn.Linear): if first_linear is None: first_linear = name last_linear = name func = partial(filter_linear_layers, first_layer_name=first_linear, last_layer_name=last_linear) accelerator = Accelerator() device = accelerator.device model.to(device) convert_to_float8_training(model, module_filter_fn=func) base_model_results = evaluate_model(model, eval_dataloader, METRIC) model.train() for batch in train_dataloader: with torch.autocast(device_type=device.type, dtype=torch.bfloat16): outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results def train_integration(): set_seed(42) accelerator = Accelerator(mixed_precision="fp8", kwargs_handlers=[AORecipeKwargs()]) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model = accelerator.prepare(model) base_model_results = evaluate_model(model, eval_dataloader, METRIC) model.train() for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results if __name__ == "__main__": baseline_not_trained, baseline_trained = train_baseline() AcceleratorState._reset_state(True) accelerator_not_trained, accelerator_trained = train_integration() assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) accelerate-1.14.0/benchmarks/fp8/transformer_engine/000077500000000000000000000000001521253476100223745ustar00rootroot00000000000000accelerate-1.14.0/benchmarks/fp8/transformer_engine/Dockerfile000066400000000000000000000004571521253476100243740ustar00rootroot00000000000000ARG BASE_YEAR=25 ARG BASE_MONTH=03 FROM nvcr.io/nvidia/pytorch:${BASE_YEAR}.${BASE_MONTH}-py3 RUN pip install transformers evaluate datasets RUN git clone https://github.com/huggingface/accelerate.git RUN cd accelerate && \ pip install -e .[deepspeed] && \ cd benchmarks/fp8 RUN /bin/bash accelerate-1.14.0/benchmarks/fp8/transformer_engine/README.md000066400000000000000000000021201521253476100236460ustar00rootroot00000000000000# FP8 Benchmarks Comparing and running [TransformerEngine](https://github.com/NVIDIA/TransformerEngine) FP8 with accelerate ## Overview This repo provides scripts which compare native TransformerEngine model training against `accelerate`'s own integration. Each modeling type is segmented out via a script, supporting the following: * Single GPU training (`non_distributed.py`) * Multi-GPU training via DistributedDataParallelism (`ddp.py`) * Fully Sharded Data Parallelism (`fsdp.py`) * DeepSpeed ZeRO 1-3 (`deepspeed.py`) To run them, it's recommended to use a docker image (see the attached `Dockerfile`) and not install `TransformerEngine` manually. ## Running: There are official Docker images located at `huggingface/accelerate:gpu-fp8-transformerengine-nightly` which can be used. You can run all scripts using the core `accelerate launch` command without any `accelerate config` being needed. For single GPU, run it via `python`: ```bash python non_distributed.py ``` For the rest, run it via `accelerate launch`: ```bash accelerate launch ddp.py # or distrib_deepspeed.py, ddp.py ```accelerate-1.14.0/benchmarks/fp8/transformer_engine/ddp.py000066400000000000000000000137441521253476100235260ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `TransformersEngine`. This particular script verifies this for DDP training. """ import evaluate import torch import transformer_engine.common.recipe as te_recipe import transformer_engine.pytorch as te from fp8_utils import evaluate_model, get_named_parameters, get_training_utilities from torch.nn.parallel import DistributedDataParallel as DDP from transformer_engine.common.recipe import DelayedScaling from accelerate import Accelerator from accelerate.state import AcceleratorState from accelerate.utils import FP8RecipeKwargs, set_seed from accelerate.utils.transformer_engine import convert_model MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") def train_baseline(): set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities(MODEL_NAME) accelerator = Accelerator() device = accelerator.device model.to(device) # Convert the model to TE old_named_params = get_named_parameters(model) with torch.no_grad(): convert_model(model) FP8_RECIPE_KWARGS = {"fp8_format": te_recipe.Format.HYBRID, "amax_history_len": 32, "amax_compute_algo": "max"} fp8_recipe = DelayedScaling(**FP8_RECIPE_KWARGS) new_named_params = get_named_parameters(model) # Convert the model to DDP device_ids, output_device = [accelerator.local_process_index], accelerator.local_process_index model = DDP(model, device_ids=device_ids, output_device=output_device) mapping = {p: new_named_params[n] for n, p in old_named_params.items()} for param_group in optimizer.param_groups: param_group["params"] = [mapping[p] for p in param_group["params"]] base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for _ in range(2): for batch in train_dataloader: with te.fp8_autocast(enabled=True, fp8_recipe=fp8_recipe): with torch.autocast(device_type="cuda", dtype=torch.bfloat16): batch = batch.to(device) outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results def train_integration(): FP8_RECIPE_KWARGS = {"fp8_format": "HYBRID", "amax_history_len": 32, "amax_compute_algo": "max"} kwargs_handlers = [FP8RecipeKwargs(backend="TE", **FP8_RECIPE_KWARGS)] AcceleratorState()._reset_state(True) accelerator = Accelerator(mixed_precision="fp8", kwargs_handlers=kwargs_handlers) set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model, optimizer = accelerator.prepare(model, optimizer) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for _ in range(2): for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results if __name__ == "__main__": baseline_not_trained, baseline_trained = train_baseline() accelerator_not_trained, accelerator_trained = train_integration() assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) torch.distributed.destroy_process_group() accelerate-1.14.0/benchmarks/fp8/transformer_engine/distrib_deepspeed.py000066400000000000000000000171751521253476100264370ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `TransformersEngine`. This particular script verifies this for DDP training. """ from unittest.mock import patch import deepspeed import evaluate import torch import transformer_engine.common.recipe as te_recipe import transformer_engine.pytorch as te from fp8_utils import evaluate_model, get_named_parameters, get_training_utilities from transformer_engine.common.recipe import DelayedScaling from accelerate import Accelerator, DeepSpeedPlugin from accelerate.state import AcceleratorState from accelerate.utils import FP8RecipeKwargs, set_seed from accelerate.utils.transformer_engine import convert_model MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") def train_baseline(zero_stage: int = 1): # This forces transformers to think Zero-3 Init should be used with patch("transformers.integrations.deepspeed.is_deepspeed_zero3_enabled") as mock: mock.return_value = zero_stage == 3 set_seed(42) accelerator = Accelerator() model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) # Convert the model to TE old_named_params = get_named_parameters(model) with torch.no_grad(): convert_model(model) new_named_params = get_named_parameters(model) mapping = {p: new_named_params[n] for n, p in old_named_params.items()} for param_group in optimizer.param_groups: param_group["params"] = [mapping[p] for p in param_group["params"]] FP8_RECIPE_KWARGS = {"fp8_format": te_recipe.Format.HYBRID, "amax_history_len": 32, "amax_compute_algo": "max"} fp8_recipe = DelayedScaling(**FP8_RECIPE_KWARGS) import numpy as np config = { "train_batch_size": 16, "train_micro_batch_size_per_gpu": 16, "gradient_accumulation_steps": 1, "zero_optimization": { "stage": zero_stage, "offload_optimizer": {"device": "none", "nvme_path": None}, "offload_param": {"device": "none", "nvme_path": None}, "stage3_gather_16bit_weights_on_model_save": False, }, "gradient_clipping": 1.0, "steps_per_print": np.inf, "bf16": {"enabled": True}, "fp16": {"enabled": False}, "zero_allow_untested_optimizer": True, } ( model, optimizer, _, _, ) = deepspeed.initialize( model=model, optimizer=optimizer, config_params=config, ) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() model_outputs = [] data = [] for _ in range(2): for batch in train_dataloader: with te.fp8_autocast(enabled=True, fp8_recipe=fp8_recipe): outputs = model(**batch) data.append(batch.to("cpu")) model_outputs.append(outputs.logits.to("cpu")) loss = outputs.loss model.backward(loss) model.step() for _ in range(accelerator.num_processes): lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.destroy() assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results, model_outputs, data def train_integration(zero_stage: int = 1): set_seed(42) FP8_RECIPE_KWARGS = {"fp8_format": "HYBRID", "amax_history_len": 32, "amax_compute_algo": "max"} kwargs_handlers = [FP8RecipeKwargs(backend="TE", **FP8_RECIPE_KWARGS)] AcceleratorState()._reset_state(True) deepspeed_plugin = DeepSpeedPlugin( zero_stage=zero_stage, zero3_init_flag=zero_stage == 3, ) accelerator = Accelerator( mixed_precision="fp8", kwargs_handlers=kwargs_handlers, deepspeed_plugin=deepspeed_plugin ) accelerator.state.deepspeed_plugin.deepspeed_config["train_micro_batch_size_per_gpu"] = 16 model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model, optimizer, lr_scheduler = accelerator.prepare(model, optimizer, lr_scheduler) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() model_outputs = [] data = [] for _ in range(2): for batch in train_dataloader: outputs = model(**batch) data.append(batch.to("cpu")) model_outputs.append(outputs.logits.to("cpu")) loss = outputs.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.destroy() assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results, model_outputs, data if __name__ == "__main__": for zero_stage in [1, 2, 3]: baseline_not_trained, baseline_trained, baseline_outputs, baseline_data = train_baseline(zero_stage) accelerator_not_trained, accelerator_trained, accelerator_outputs, accelerator_data = train_integration( zero_stage ) assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"ZERO stage {zero_stage}: Accuracy should be the same for the baseline and accelerator: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"ZERO stage {zero_stage}: F1 score should be the same for the baseline and accelerator: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"ZERO stage {zero_stage}: Accuracy should be the same for the baseline and accelerator: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"ZERO stage {zero_stage}: F1 score should be the same for the baseline and accelerator: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) torch.distributed.destroy_process_group() accelerate-1.14.0/benchmarks/fp8/transformer_engine/fp8_utils.py000066400000000000000000000104471521253476100246710ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import torch def get_dataloaders(model_name: str, batch_size: int = 16): from datasets import load_dataset from torch.utils.data import DataLoader from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained(model_name) datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): return tokenizer.pad( examples, padding="longest", pad_to_multiple_of=16, # Specific for FP8 return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size, drop_last=True ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=16, drop_last=True, ) return train_dataloader, eval_dataloader def get_training_utilities(model_name: str, batch_size: int = 16, accelerator=None): """ Returns a tuple of: - Model - Optimizer - Train dataloader (prepared) - Eval dataloader (prepared) - LR Scheduler Suitable for training on the MRPC dataset """ from torch.optim import AdamW from transformers import AutoModelForSequenceClassification, get_linear_schedule_with_warmup from accelerate import Accelerator if accelerator is None: accelerator = Accelerator() model = AutoModelForSequenceClassification.from_pretrained(model_name) train_dataloader, eval_dataloader = get_dataloaders(model_name, batch_size) optimizer = AdamW(model.parameters(), lr=0.0001) lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=len(train_dataloader) * 2, ) train_dataloader, eval_dataloader = accelerator.prepare(train_dataloader, eval_dataloader) return model, optimizer, train_dataloader, eval_dataloader, lr_scheduler def get_named_parameters(model): """ Same thing as `Accelerator.get_named_parameters` Returns a list of the named parameters of the model (extracted from parallel) """ from accelerate.utils import extract_model_from_parallel model = extract_model_from_parallel(model) return {n: p for n, p in model.named_parameters()} def evaluate_model(model, dataloader, metric, accelerator=None): "Turns model to .eval(), runs dataloader, calculates metric, then turns eval back on" model.eval() for step, batch in enumerate(dataloader): with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) references = batch["labels"] if accelerator is not None and accelerator.num_processes > 1: predictions, references = accelerator.gather_for_metrics((predictions, references)) metric.add_batch(predictions=predictions, references=references) return metric.compute() accelerate-1.14.0/benchmarks/fp8/transformer_engine/fsdp.py000066400000000000000000000151421521253476100237050ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `TransformersEngine`. This particular script verifies this for FSDP training. """ from functools import partial import evaluate import torch import transformer_engine.common.recipe as te_recipe import transformer_engine.pytorch as te from fp8_utils import evaluate_model, get_named_parameters, get_training_utilities from torch.distributed.fsdp import FullyShardedDataParallel as FSDP from torch.distributed.fsdp import MixedPrecision from torch.distributed.fsdp.wrap import transformer_auto_wrap_policy from transformer_engine.common.recipe import DelayedScaling from transformers.models.bert import BertLayer from accelerate import Accelerator from accelerate import FullyShardedDataParallelPlugin as FSDPPlugin from accelerate.state import AcceleratorState from accelerate.utils import FP8RecipeKwargs, set_seed from accelerate.utils.transformer_engine import convert_model MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") FSDP_WRAP_POLICY = partial(transformer_auto_wrap_policy, transformer_layer_cls={BertLayer}) def train_baseline(): set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities(MODEL_NAME) accelerator = Accelerator() device = accelerator.device model.to(device) # Convert the model to TE old_named_params = get_named_parameters(model) with torch.no_grad(): convert_model(model) FP8_RECIPE_KWARGS = {"fp8_format": te_recipe.Format.HYBRID, "amax_history_len": 32, "amax_compute_algo": "max"} fp8_recipe = DelayedScaling(**FP8_RECIPE_KWARGS) new_named_params = get_named_parameters(model) # Convert the model to FSDP model = FSDP( model, use_orig_params=True, mixed_precision=MixedPrecision(param_dtype=torch.bfloat16, reduce_dtype=torch.float32), auto_wrap_policy=FSDP_WRAP_POLICY, ) mapping = {p: new_named_params[n] for n, p in old_named_params.items()} for param_group in optimizer.param_groups: param_group["params"] = [mapping[p] for p in param_group["params"]] base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for _ in range(2): for batch in train_dataloader: with te.fp8_autocast(enabled=True, fp8_recipe=fp8_recipe): with torch.autocast(device_type="cuda", dtype=torch.bfloat16): batch = batch.to(device) outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results def train_integration(): FP8_RECIPE_KWARGS = {"fp8_format": "HYBRID", "amax_history_len": 32, "amax_compute_algo": "max"} kwargs_handlers = [FP8RecipeKwargs(backend="TE", **FP8_RECIPE_KWARGS)] AcceleratorState()._reset_state(True) fsdp_plugin = FSDPPlugin( auto_wrap_policy=FSDP_WRAP_POLICY, use_orig_params=True, mixed_precision_policy=MixedPrecision(param_dtype=torch.bfloat16, reduce_dtype=torch.float32), ) accelerator = Accelerator(mixed_precision="fp8", fsdp_plugin=fsdp_plugin, kwargs_handlers=kwargs_handlers) set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model, optimizer = accelerator.prepare(model, optimizer) base_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) model.train() for _ in range(2): for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC, accelerator=accelerator) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results if __name__ == "__main__": baseline_not_trained, baseline_trained = train_baseline() accelerator_not_trained, accelerator_trained = train_integration() assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) torch.distributed.destroy_process_group() accelerate-1.14.0/benchmarks/fp8/transformer_engine/non_distributed.py000066400000000000000000000126661521253476100261550ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ This script tests to ensure that `accelerate` performs at the same level as raw `TransformersEngine`. This particular script verifies this for single GPU training. """ import evaluate import torch import transformer_engine.common.recipe as te_recipe import transformer_engine.pytorch as te from fp8_utils import evaluate_model, get_named_parameters, get_training_utilities from transformer_engine.common.recipe import DelayedScaling from accelerate import Accelerator from accelerate.state import AcceleratorState from accelerate.utils import FP8RecipeKwargs, set_seed from accelerate.utils.transformer_engine import convert_model MODEL_NAME = "bert-base-cased" METRIC = evaluate.load("glue", "mrpc") def train_baseline(): set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities(MODEL_NAME) # Convert the model to TE old_named_params = get_named_parameters(model) with torch.no_grad(): convert_model(model) new_named_params = get_named_parameters(model) mapping = {p: new_named_params[n] for n, p in old_named_params.items()} for param_group in optimizer.param_groups: param_group["params"] = [mapping[p] for p in param_group["params"]] FP8_RECIPE_KWARGS = {"fp8_format": te_recipe.Format.HYBRID, "amax_history_len": 32, "amax_compute_algo": "max"} fp8_recipe = DelayedScaling(**FP8_RECIPE_KWARGS) model.to("cuda") base_model_results = evaluate_model(model, eval_dataloader, METRIC) model.train() for batch in train_dataloader: with te.fp8_autocast(enabled=True, fp8_recipe=fp8_recipe): with torch.autocast(device_type="cuda", dtype=torch.bfloat16): batch = batch.to("cuda") outputs = model(**batch) loss = outputs.loss loss.backward() optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results def train_integration(): FP8_RECIPE_KWARGS = {"fp8_format": "HYBRID", "amax_history_len": 32, "amax_compute_algo": "max"} kwargs_handlers = [FP8RecipeKwargs(backend="TE", **FP8_RECIPE_KWARGS)] AcceleratorState()._reset_state(True) accelerator = Accelerator(mixed_precision="fp8", kwargs_handlers=kwargs_handlers) set_seed(42) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = get_training_utilities( MODEL_NAME, accelerator=accelerator ) model, optimizer, lr_scheduler = accelerator.prepare(model, optimizer, lr_scheduler) base_model_results = evaluate_model(model, eval_dataloader, METRIC) model.train() for batch in train_dataloader: outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() optimizer.zero_grad() lr_scheduler.step() trained_model_results = evaluate_model(model, eval_dataloader, METRIC) assert trained_model_results["accuracy"] > base_model_results["accuracy"], ( f"Accuracy should be higher for the trained model: {trained_model_results['accuracy']} > {base_model_results['accuracy']}" ) assert trained_model_results["f1"] > base_model_results["f1"], ( f"F1 score should be higher for the trained model: {trained_model_results['f1']} > {base_model_results['f1']}" ) return base_model_results, trained_model_results if __name__ == "__main__": baseline_not_trained, baseline_trained = train_baseline() accelerator_not_trained, accelerator_trained = train_integration() assert baseline_not_trained["accuracy"] == accelerator_not_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_not_trained['accuracy']} == {accelerator_not_trained['accuracy']}" ) assert baseline_not_trained["f1"] == accelerator_not_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_not_trained['f1']} == {accelerator_not_trained['f1']}" ) assert baseline_trained["accuracy"] == accelerator_trained["accuracy"], ( f"Accuracy should be the same for the baseline and accelerator: {baseline_trained['accuracy']} == {accelerator_trained['accuracy']}" ) assert baseline_trained["f1"] == accelerator_trained["f1"], ( f"F1 score should be the same for the baseline and accelerator: {baseline_trained['f1']} == {accelerator_trained['f1']}" ) accelerate-1.14.0/benchmarks/fsdp2/000077500000000000000000000000001521253476100170265ustar00rootroot00000000000000accelerate-1.14.0/benchmarks/fsdp2/README.md000066400000000000000000000073531521253476100203150ustar00rootroot00000000000000# FSDP2 Benchmarks This benchmark showcases `FSDP2` in 🤗 `accelerate` and compares it to `torch` baseline. ## Overview This benchmark consists of two parts: - `main.py` is the main script that runs the benchmark - `visualize.py` is the script that visualizes the results (if `--output_dir` was specified for the previous command) ## Motivation We want to showcase that 🤗 `accelerate`'s integration of `FSDP2` is on par raw PyTorch, and highlight a "broken" part in PyTorch that creating an optimizer before applying `FSDP2` **doesn't result in a working training loop**. (more on this later) This script showcases **matching memory usage and convergence between `accelerate` and `torch`'s baseline.** To deal with this breaking change (and maintain backward compatibility with FSDP1 in terms of an API), `accelerate` had to come up with a workaround since `accelerate` assumes that the user will nearly always create a model, optimizer, scheduler, etc beforehand and bring them themselves. This lead to an issue of a stark increase in memory as well as the model not even training if the user creates an optimizer beforehand. To workaround this, we replace the parameters inside the optimizer with the newly created FSDP2 sharded ones. More about this can be found in this [blog post (TBD)](TODO) > [!WARNING] > This script is intended to fit on 2x 24GB GPUs, though on so few GPUs it's not possible to see the memory difference (discrepancies in grad allocation result in lower memory usage in the non-fixed case), only the difference in convergence. Below are attached results from 8x H100 GPUs where the difference is visible. > TLDR: more GPUs = bigger memory difference between fixed and non-fixed cases. ## Results Here are the results from running the benchmark on 8x H100 GPUs:

Allocated Memory Usage

Reserved Memory Usage

As you can see, the memory usage of `accelerate` and `torch_post_shard` (the **intended** way) are very similar, while `torch_pre_shard_not_fixed` uses significantly more memory. Our fix in `torch_pre_shard_fixed` brings the memory usage back in line with the **intended** approach. > [!WARNING] > Timing discrepancies are due to the benchmarks being ran in 1 script. ## Running To run the benchmark, you can either use `accelerate launch` or `torchrun`: ```bash accelerate launch main.py ``` ```bash # For two GPUs torchrun --nproc_per_node 2 main.py ``` This supports multiple configurable options, you can learn about them by running: ```bash python3 main.py --help ``` This script will run 4 different benchmarks: - `torch_optimizer_after_fsdp`: `torch` baseline where optimizer is created after applying `FSDP2`, this is the **intended** way to do it - `torch_optimizer_before_fsdp_not_fixed`: `torch` baseline where optimizer is created before applying `FSDP2` without fixing the optimizer parameters - `torch_optimizer_before_fsdp_fixed`: `torch` baseline where optimizer is created before applying `FSDP2` with our fix to the optimizer - `accelerate`: `accelerate`'s own integration of `FSDP2` where optimizer is created before applying `FSDP2`, but we apply our fix to the optimizer Memory results are saved in a folder specified by `--output_dir` argument. Optionally, you can specify `--save_memory_snapshot` to save the torch memory snapshot, which can then be viewed using [`torch memory viz`](https://pytorch.org/memory_viz) ## Visualizing results To visualize the results, you can run: ```bash python3 visualize.py --dir ``` This will then create two plots, showcasing allocated and reserved memory usage between all the different benchmarks discussed above. accelerate-1.14.0/benchmarks/fsdp2/imgs/000077500000000000000000000000001521253476100177655ustar00rootroot00000000000000accelerate-1.14.0/benchmarks/fsdp2/imgs/allocated_memory.png000066400000000000000000003710251521253476100240230ustar00rootroot00000000000000‰PNG  IHDRÜô'…ï,:tEXtSoftwareMatplotlib version3.10.1, https://matplotlib.org/soþå pHYsaa¨?§iIDATxœì�wxUÛÆïÙžžÐ{U‘.͇ EAååµbÁ Š"b/(Š¢"  ]ŠRD)JPEšt”^B’MÙͶ™ùþXvÙ™ól2@0àûü¾Ëë{™�9sæÌ™3™ûyÎ}$UUU0 Ã0 Ã0 Ã0 Ã0 Ã0 sQ˜J» Ã0 Ã0 Ã0 Ã0 Ã0 óo€w†a†a†a†a†a†)Xpg†a†a†a†a†a˜€w†a†a†a†a†a†)Xpg†a†a†a†a†a˜€w†a†a†a†a†a†)Xpg†a†a†a†a†a˜€w†a†a†a†a†a†)Xpg†a†a†a†a†a˜€w†a†a†a†a†a†)Xpg†a†a†a†a†a˜€w†a†a†a†a†a†)Xpg†a†a†a†a†a˜€w†a†a†a†a†a†)Xpg†a†ù—ñøã�£^½z¸çž{¢îóâ‹/¢^½z8yò$`Ó¦M¨W¯Æ�÷OU³Ô=z4êÕ«‡M›6¹ß¸qãP¯^=\{íµáv¢p:�hܸñÿLûE#Ô§þþûï¨û,Z´õêÕÃW_}õÖìŸÁåraêÔ©èÛ·/n¼ñF4jÔ7Üpz÷î�É“'£   ´«¨!ôÌù¯_¿~ÿScÃ0 Ã0ÌÅ`)í 0 Ã0 Ã0%ÇÉ“'ñóÏ?#)) ;wîÄž={аaÃÒ®ÖѳgO´o߃.ÕzX­VÌŸ?C‡%ÿî»ïþá1—{÷îÅ“O> §Ó‰»ï¾>ø Ê”)§Ó‰ß~û &LÀÌ™31~üx4iÒ¤´« hذ!,X Ù6~üx¬]»cÇŽEõêÕÃÛãââP¡B,X°*Tø§«Ê0 Ã0 sEÁî Ã0 Ã0ÿ"æÌ™EQðúë¯fÏž]ºº@rss±oß¾Ò®ছn¢E‹Èß,X€ë¯¿þ®s¹pæÌ<úè£X¸p!^~ùetìØÍš5CûöíñÒK/añâÅ0™Lxì±ÇpúôéÒ®2 >>�7Öü—œœ ¸êª«4ÛëÔ©Þ¿bÅŠ¥[q†a†a˜Ë܆a†aþ%x½^,\¸õêÕÃí·ßŽfÍšaùòåÈËË»à2úé'ôë×-Z´@£F�бcG¼ýöÛÈÉÉö]¼x1î½÷^4kÖ 7Ýt~øalß¾]³Ovv6F��:„-7zõê…U«V…÷Y´h®¿þz(Š‚Ï>û õêÕâE‹Â¿oذ>ø Z¶l‰Æ�£sçÎ;v,Ün·æ\.— ¯¿þ:Z·n�Æ�ãŽ;lô[o½X·n�ðÛŽ;ð÷ߣS§Nä±xõÕWqË-· Q£F¸ñÆ1xð`ìß¿_³_ÈŽåÔ©S9r$nºé&\wÝuèÛ·/>Œ¬¬,<û쳸á†pýõ×cРAÈÊÊÒ”‘““ƒ·ß~;ܶ-Z´@¿~ýðÓO?iö Yåüþûïxøá‡Ñ´iS¬^½×]wþóŸÿ�×ñþûï‡�)i²³³1jÔ(Üzë­hÚ´)Zµj…{î¹GȾ‚}ì¾ûîC³fÍдiStéÒcÇŽìZ�>ýôStèÐ�7F—.]0oÞ<¬]»–´´1Ú§(¾üòKdffâÕW_EݺuÉ}jÖ¬‰7ÞxÙÙÙøüóÏœ»çT`iÏž=¨W¯FŒÞ¶sçN<ñĸá†ШQ#´oßo½õ²³³5ÇvèÐwÝuÖ¯_�Ûn» ­[·.öŒ@YÊôë×-[¶Dff&ž~úi´jÕ Í›7Çã�?ŽÌÌL=z�=öZ¶l‰Ö­[cĈp¹\šr�># Ã0 Ã0W ,¸3 Ã0 ÃüKXºt)œN'zõêèÕ« 5bõù0þ|<ùä“°Z­5j¦L™‚>}ú`þüùèß¿?<Ox߉'bøðáhÒ¤ &Mš„Q£FÁår¡ÿþaÑ]Q<òÈ#øê«¯Ð¯_?̘1£F�B À Aƒ°víZ@ûöíñÆoî½÷^,X°íÛ·,[¶ �<ò|>Þ}÷]Lž<Ý»wÇ´iÓððÃC–åp�^xáÌ�;Ý»wǤI“ðÄO`öìÙX¿~ýyµÃ 7Ü€ *à믿&Û¨\¹r¤¨™���ûî»+W®Äƒ>ˆéÓ§cĈ8xð zõê…={öǼøâ‹(W®>þøc <[¶lÁ°aÃ0hÐ \{íµ7nî½÷^¬Zµ |ðAø8—Ë…>}ú`áÂ…èÓ§¦L™‚÷Þ{&“ O>ù$/^,œëã�?F£F�0cÆ 4oÞ·ß~;öîÝ‹�;wjöSË–-C­Zµpã�7žWÛaРAX²d }ôQL�:~ø!êÔ©ƒ‘#Gj„ñ3f`øðá¨X±"Æ�‡É“'ã–[nÁ矎—^zISæ{gñãÇãºë®ÃgŸ}†gžyß|ó ¦N�*œÿ|úÅŠ+�’’5è¢]»v¨X±"V¬XUUÃÁ�¥K— û.Y²ðßÿþ°eËôéÓ'OžÄ+¯¼‚iÓ¦¡ÿþøþûïÑ»wo!ààñx0zôh<ÿüó˜8qb‘õºXdYÆÓO?�¦M›büøñèÝ»7Ö®]‹#F`ðàÁ¸å–[0~üx´k׋-”)SÂÇ^È3Â0 Ã0 s¹Ãî Ã0 Ã0ÿfÏž�ØØXÜyç�€®]»âÝwßÅܹsñÀ@’$Ãey½^Œ3Õ«WÇçŸ›Í (>K’„Ñ£GcñâÅèÕ«rss1aÂtèÐ/¿ür¸Œ¦M›¢k×®X°`š5k†ŒŒ T©R]»vŃ>Þ¯F�èÞ½;¾ýö[´oß)))¨]»6 B… hܸ1Àï÷cÔ¨Q¨]»6¦L™‡Ã¸ñƃ>ø?þø#ºuë†#GŽ`õêÕaK�mÚ´A‡Ϋ]M&zöì‰I“&!-- UªT¸Ýn,_¾½zõ‚ÙlŽûâ‹/�––†™3gâ†n´lÙ­ZµB—.]ðÑGiÄG¨W¯^Ø+þ†nÀªU«°}ûv <�>ú( U«VX²d‰&ã~îܹ8|ø0Þ~ûmÍb¹mÚ´A§N�ðÑGáÎ;ï„Ét.ß&99YãKß«W/,\¸ß|ó�Æg|Ó¦MHOOǰaÃΫ݌�››‹­[·¢ÿþšz·mÛ×^{-*UªÞvæÌ´k×~ø!¬V+àúë¯ÇæÍ›±råJ¸\.ÄÅÅ!??óæÍÃUW]…?ü0Üï[·n�.]ºhÎ>}Š¢  ©©©¸ñÆ5mK!I4h€µk×"++ ×_=ªU«†åË—cذaáz†µk×FË–-ï¼óâãã1cÆ ”)S@°TªT C† Áœ9sÂýŽ=ŠO?ý·Þzkñ7á"q»ÝèÒ¥ xà�p½–.]Šõë×ã½÷Þ 7nî·O?ý4€ {F†a†a.w8Ã�a†aæ_ÀŸþ‰={öàŽ;î@||<Àn·ã?ÿùŽ=Š�7žWy»ví‚ÓéDÇŽÃb{ˆ�ˆ²ùõ×_áóùЮ];Í~eÊ”Á¦M›ðÎ;ï*Uª„Ï>û ÔìW§N@ZZZ±uÊÊÊB—.]ÂÂhˆ��ºeËÀ¶mÛ…ÛHqÓM7yŠ»ï¾ªªbþüùámË–-ƒËå g!ëY·n*W®CT©RM›6ÅÖ­[…cB™ü!ªV­ ¸ùæ›ÃÛ$IBåÊ•‘››Þ¶aÃ嘘´iÓ§OŸÆ‘#G4¿E– Mš4AÆ ±lÙ2MÆô÷߫Պž={’×y1ÄÄÄ 99?üðV­ZŸÏþíÁÔd�?û쳘4iRXlQ§N¨ªŠS§NvïÞ ¿ß�¶mÛj‚LIII‚p~>}Š"d�gèzCÏfAA$IB�=�––î¯@0À‘‘‘nïÓ§OcïÞ½hÛ¶mXlѱcGX­V²Žú¾)‰ì·¡þ hûXll,RRR4ýöBž†a†a˜ËÎpg†a†ù²ÞèÚµ«ÆÓ¹sçΘ6mfÏž�ÿû¿ÿ3\^haÇ�pIhÑÄÐ>ééé€råÊ[îï¿ÿ޹sçbÛ¶mÈÉÉ�ßïÿ¦(J‘džÕ &`„ Eîò7¯P¡BÔúŸÕ«WÇ 7Ü€… bРA0›ÍáÌýºuëâäÉ“Â1iiiðù|¨W¯^Ôr�Ngx¡J‚ —©íªª†ÿ�žžŽøøx$$$爼_‘ãTÛôêÕ ¯¼ò –,Y‚Þ½{ÃëõbåÊ•èСÊ–-õ:.›Í†/¾øÏ?ÿ< »ÝŽ&Mšà¦›nBÏž=5ý/++ Ó¦MÃÚµkqêÔ)Á_=ÔB÷žºÏz�õóéS¡ö6ºNB~~>€ ø=zôÀøñã±téR´hÑ@0Àa6›Ñ£GÍù¿ûkèë�˜˜Cu* ¢õ[}ŸÑ÷Û yF†a†a.wXpg†a†¹Â9sæ ~üñGÀ€È}Ö­[‡S§N‘:E(38R‹¶OÈJ#2;™býúõ8p *W®Œ§žz W_}5bcc ,.©Sÿþý£f[‡Ê+ªÞEýV÷Üsž{î9üüóϨQ£þüóO¼ýöÛEÖ·Zµjøì³Ï¢îªoä1ÑÊ* I’н.}‹ø)н{wŒ=óçÏGïÞ½ñÓO?¡  @c÷�ÐLˆÈ Šž�ïäu_wÝuX±b¶lÙ‚ß~û ¿ýöÆ�‡/¾ø}ô:uê�ǃ޽{ãäÉ“xà�жm[$%%Ád2á“O> ûÿçî/ÕfúmçÓ§¢ýV«V-ìÝ»>ŸO˜ ‰ªªØ»w/*W®¨«W¯ŽV­ZáÇÄÈ‘#!Ë2V®\‰¶mÛ†"¡:véÒ�?þ8Y¶>럺·—’‹é·çûŒ0 Ã0 Ã\î°àÎ0 Ã0 s…óÍ7ßÀï÷cðàÁhÞ¼¹ðûîÝ»ñá‡bÞ¼yÏî¢ù”S6/¡Œö�xÚ—ÊÎË˃¢(HNNÆüùó¡ª*Æ�� „÷)ÎJ&DÈ^% ~ýúEîʬ=sæŒð•�n„[o½IIIX¶l*W®ŒØØXtíÚµÈúfddàšk®!=ÞK’*UªàðáÃÈËËCbb¢æ·Ð}1l‰��ÅwÜ�¹sçâàÁƒX´hªV­jhvDÈwÿСChذ!¹ÏþýûW]u•f»ÉdÂõ×_�믿Ï<ó Ž9‚þýûcÔ¨QèÔ©~ûí7?~ýúõË/¾¨9VŸé³#gz„8zô¨æßçÓ§¢qÇw`ܸqøî»ïŠ LüüóÏÈÈÈÀ#�<¢ÙþŸÿü#FŒÀï¿ÿŽ‚‚àî»ïêXXXxÁu¼\ù'Ÿ†a†a˜ öpg†a†¹‚‘e_ý5’““1pà@´nÝZøï¡‡B… °`Á‚"³�#iذ!Ê•+‡Ÿ~úIÈ\_±b€sþÌÍ›7‡ÕjÅòåË5¶0hÛ¶-†  (j¢ÍÄäÉ“Ã×"”:4h€òåËcùòå�q (ä¾úê«8|ø0„ýŒÌ|‚"ìüa¨ ôØívÜyç�ذaV¯^�Î�;‡=¹)n¹å`ùòåšíŠ¢à�7ÞÀ²eË.¨ÑÎ@(ÓåraÆ ¨Q£jÕªe¨¬^½z¦L™‚�7â¿ÿýo± ‚Àí·ßŽ˜˜Œ?>œÉÉ�ðÝwß¡aÆá…pwî܉áÇ###C³oíڵѠAäää8×7ô}çÏ?ÿ û—‡ö©_¿>L&~ýõW;Xºt©fÛùô©h<ðÀ¨Zµ*Þÿ}ìܹ“Üçĉxýõ×Q¹reApïܹ3bcc±zõj,]ºåÊ• ßO hÕÔ¨Q#lܸ©©©šc322ðâ‹/F=ïåÎ?ùŒ0 Ã0 ÃüS°àÎ0 Ã0 s³zõjœ:u ={ö„Ýn'÷±X,¸çž{�••…•+W*×jµbøðáHKKÃO<�Ÿ~ú ¿ÿþ;>ÿüsŒ7Íš5 /@Y®\9<öØcؽ{7† ‚M›6aݺuxì±Ç0hÐ gI¿þúëøã�?ðóÏ?ã©§ž‚ßïG­ZµpäÈüüóÏÈÎÎûo¯Y³+V¬ÀîÝ»aµZñÒK/!//½{÷ƪU«°uëVÌ™3�<ò6lØ€””@½zõpÓM7aíÚµ5j~ûí7,_¾ýúõ gb_wß}7œN'Ž9u±Ô�>ú(ªV­Š‘#GbÊ”)ضmV¯^�GyóæÍ+Önã|¸çž{P¯^=¼ÿþû˜>}:6oÞŒüDnn®�^×^{-š5k†E‹€&Ûº(*V¬ˆ·Þz 'OžD�=ðÍ7ßà�?þÀÚµkñé§Ÿ¢W¯^HJJ‡~¾öråÊaåÊ•xøá‡±xñblÛ¶ üñÆ�‡ 6àÎ;ï´�‰��ÅìÙ³ñÃ?`Ë–-˜8q"^xáôíÛ@ÐãüСC([¶,ºvíŠ]»váÕW_ů¿þŠ+V`À€‚Wøùô©h$$$`òäÉHNNFŸ>}ðꫯ⧟~ÂöíÛ±nÝ:Œ=wÞy'¬V+¾üòK¡¼¸¸8tîÜk×® _³Þ楗^‚$IèÛ·/–,Y‚mÛ¶áÛo¿E¿~ý°fÍaVÕÂ?ùŒ0 Ã0 ÃüS°¥ Ã0 Ã0ÌÌìÙ³!IúôéSä~÷Þ{/>ÿüsÌ™3',”Ç�wÞ‰¤¤$Lš4 Æ ƒßïGÕªUñàƒâ±ÇÓøF<+VÄܹsñè£�B’$4mÚ_}õ®»î:@ïÞ½‘™™‰ï¾û?ü0ªT©‚ž={bàÀ�X¶lÞ~ûm<ûì³øì³ÏpÓM7aÀ€øæ›oð /`ðàÁhÔ¨n¿ýv¤¤¤`òäÉ1b Q®\9´o߃ Òˆ™Ÿ|ò Þ{ï=|÷Ýw˜3gjÕª…�"##{öì9ÿÆFPŒnܸ1òòòЪU«"÷MIIÁ7ß|ƒÏ>û ³fÍÂG}„˜˜4jÔ_|ñÚ¶m{Au p8˜5kÆ�‡™3gâôéÓˆ��EÓ¦M1cÆŒb몧W¯^ؾ};Ú¶m{^‹ÌÞqǸúê«1}út|þùçÈÈÈ€ÅbA­Zµ0`À<ðÀq¸J•*˜?>&Nœˆ?ü999ˆ‹‹CÕªU1tèÐðšåʕÄ 0fÌŒ1111¸ñÆ1mÚ4X,lÚ´ _}õ\.Þzë-¼õÖ[ˆ��ǪU«°xñbÔ©S�>ú(<6lØ rϧOE£nݺX²d æÍ›‡Õ«WcÅŠ(((@||<®¹æ<û쳸çž{àp8ÈãÿóŸÿàÛo¿@8Z´h�yóæa„ xûí·‘ŸŸ�””Üxã�xê©§ Ï^¸Üø'Ÿ†a†a˜ I½ÐU£†a†a†ùW²zõj<õÔS˜ ›ÍVÚÕc†a†aþ¥°àÎ0 Ã0 Ã0 Ã0 Ã0 Ã0%{¸3 Ã0 Ã0 Ã0 Ã0 Ã0L À‚;Ã0 Ã0 Ã0 Ã0 Ã0 Ô,¸3 Ã0 Ã0 Ã0 Ã0 Ã0L À‚;Ã0 Ã0 Ã0 Ã0 Ã0 Ô,¸3 Ã0 Ã0 Ã0 Ã0 Ã0L À‚;Ã0 Ã0 Ã0 Ã0 Ã0 Ô,¸3 Ã0 Ã0 Ã0 Ã0 Ã0L À‚;Ã0 Ã0 Ã0 Ã0 Ã0 Ô,¸3 Ã0 Ã0 Ã0 Ã0 Ã0L À‚;Ã0 Ã0 Ã0 Ã0 Ã0 Ô,¸3 Ã0 Ã0 Ã0 Ã0 Ã0L À‚;Ã0 Ã0 Ã0 Ã0 Ã0 Ô—­à¾~ýz´nÝC‡~[¾|9î¸ã4kÖ ={öĆ ¿)Š‚±cÇ¢cÇŽhÕª~øaœ8q"ü»ÓéÄ�!Cкuk´iÓ#GŽ„Çã ÿ¾oß>ôíÛ-Z´Àm·Ý†©S§^Ú e†a†a†a†a†aþ\–‚ûäÉ“ñöÛo£fÍšÂoûöíÃðáÃ1lØ0üþûï0` „ôôtÀìÙ³±dÉLš4 k×®E­ZµðÔSOAUUÀ+¯¼‚ÂÂB,]º .Ä¡C‡0fÌ€ÇãÁc�=†o¼ë×¯ÇØ±cñÅ_`åÊ•ÿÜÅ3 Ã0 Ã0 Ã0 Ã0 Ã0W$—¥àn·Û±`ÁRpŸ?>Úµk‡víÚÁn·ãÎ;ïÄ5×\ƒï¿ÿðõ×_cÀ€¨[·.âãã1tèP:t;vì@VVV¯^�¡C‡¢L™2¨X±"ž|òI,\¸~¿ëÖ­ƒßïÇO<�ØØX4lØ÷Üs¾þúëº †a†a†a†a†a˜+ŒËRpïß¿?ÈßöìÙƒ h¶5hлví‚ÇãÁÁƒ5¿ÇÇÇ£f͚صköíÛ³ÙŒzõê…oذ!Ün7>Œ={ö ^½z0›Íš²wïÞ]ÂWÈ0 Ã0 Ã0 Ã0 Ã0 ÃüÛ°”vΧӉ¤¤$Ͷ¤¤$_݆‘÷&>Þ.ôu·Û‹@@!ÛÐï—QXèƒ$IHH(ªÛ4Á,à\ÿ¦ÛP†ËUTÿö@UUÄÄØ`µFëßç߆¡{STšÍE÷ï¢Úðüû÷¿cŒ�$@’$x<>x<�bÛ�Ç##BüÛÇˆÐø ª*<ž`ÿæ1‚Lj}¹çö)ªÜЀH•Kµa¨\U-îÞ”l†Ž ~xE+÷Ò´aqý»¨6ü_#BãCèÚyŒ8�AxŒøß#BãƒÛüHxŒˆ„Lj (Š.—Ljsð„Ç#.dŒ°Ûã£îSWœàž’’§Ó©Ùæt:Q¦L$''Ãd2‘¿—-[eÊ”AAAdYG¶Bû†~?zô¨pl¨\#¨jÑ¢~èÆŸïo—ªÜ‹«“ŠÈ*©ªŠÂB_¸ž—Ûµ^ŽåêÛ°äêt©Êå6¼ør/¿6ü'ÆˆÐø¹ÿåv­—c¹Ü¿/¾\nÃK[îÅÕI ׫°ÐYV4mz¹]ëåX.÷ï‹/—ÛðÒ–{quâ1âbËåþ}ñår^Úr/®N*d™.®Ü+« ¹—n¹Ü†—¶Ü‹«Ó¥#ŒrYz¸E£F�Oõ]»v¡iÓ¦°Ûí¸ú꫱gÏžðoyyy8~ü8š4i‚úõëCUUìß¿_slbb"j×®�F�᯿þB ÊfŠGUƒQ­¢†aþ7áñ�a˜hðøÀ0LQðÁ0L4x|`¦(JsŒ¸â÷{ï½7nĺuëàõz±`Á=zwÞy' wïÞ˜9s&:„‚‚Œ3õë×GãÆ�Q¦LtîÜü1²³³‘žžŽñãÇãî»ï†ÅbA»ví�‰'¢°°;vìÀ‚ лwïR¾ê+Il63ÎÃ�‡a˜ÿx|`&<>0 S…É“'^б:´ÆæÍ¿—p�.Ÿ|ò!n½µ-¾újziWå²â¥—žÇ—_~~ÞÇ­^½C†ýKX­V¨ª »Ý�k®©‡îÝïÂm·u —¹_ *TÄí·wÇý÷?³™¶QZ¼x!ÒÒRñæ›ï^Ð56kÖâ¼�;pà/¬[÷f̘‡ºu¯Â­·v)ö˜5j¢oßðúë#1yò ˜L£d†a†a†a†a¢Ã‚;S$›7ÿŽ#†aÀ€Gðâ‹/#!!ÇŽÅøñã‰'ƤIÓWl9[·nÆ’%‹Ã‚û•Ä?¬…Ýn‡¢(øóÏmxá…!¨R¥*Ú·ïTì±n·P½z�K]M ¡:SÌ�ûæÏŸ‹7ß|×^[²,cÕªñê«/âÓO?G“&×ê×oˆI“¦²²2±}ûV|öÙXlß¾ Ç� —¹Ÿ¢(Ø¿/FŽ|’dB¿~„óû|>LŸþ% ‹åü‡ mÛ¶bäÈ×Îû8—˨V­úy×£ÇÝøê«X¿~ÚµëpÞçe†a†a†a†aþwàtM&*Š¢àƒÞEÏž÷¢oßHLL‚$I¨U«6F��§3gN,_¾÷Ý×K—.F�]Ñ©S¼ÿþ;X³f5^}$öíÛƒZ#5õ$ z'ŽÌ’>|(¦Lù]º´Ç]wuÆ/¿¬ÃòåKгg7téÒ3fL ׫M›–øý÷�HO?…ZkþkÓ¦%¦N�ðz=øè£ÑèÙ³:ujƒÁƒÑ#‡5å|ýõlÜuWgÌš5½Øö0™LhÞ¼%jÕªƒãÇÏ-ŒyàÀßxæ™'Ð¥Ë-èÞ½>þx �Ž?†Þ½{ è�éÓ¿Ìî¾ÿþ»Ñ±ãÿ¡OŸÿâ§ŸV†Ë4èQL˜ð)x žþ@zú) >ݺuD—.íñÖ[¯Âå*¸�[ ؼyZ·¾�5†Åb�ÝnG÷îwá�7ÞE™2eÉcÊ•+�[o킱cÇcùòï±mÛ–¨mÔ A#ôèñ_üòËrŸõë†×ëÅ-·tôìÙ 6üþýÉ'ÁÀ�çflÙòºuëUU‘™™�3g2Q¿~CÀáÇðôÓ�£K—[Э[GŒó.¼^ÑÒeóæß1tèS€®]ÛãÇ—…û ×ëÁ}÷õÀÂ…ß„÷ÿüóÏðÐC}!Ë2ìv;ºté†Å‹Õ¬ Ã0 Ã0 Ã0 Ã0 Â;�¿ÿÞ�´´TÜsO/á7«ÕŠ=þ‹uë~ oËÌÌÄÞ½{0oÞ·øòËYøõ×_°hÑ|tèÐ ýû?„úõbÍš�¨ZµšPÞ®];Q¶lY,Y²­[·Å‡¾‹}ûöbîÜExæ™ç0uê$äädkŽ©T©2Ö¬Ùþï�w>@\\\Ø*dâÄq8pà/Lš4Ë–­Fýú 0räóPÕs«¯_ÿ3¦M›ƒ¾}‹·ˆñûýøõ×õHM=‰›onðx<6l0Z¶¼K–¬Â¤I3°}ûÌ™35jÔÄœ9A‘vúô¹0àlØð &Nü/¼0+VüŒ‡~ o¾ù :>ÏêÕ+0|øËxÿý�¡ª*^|ñ9T¨P .Ãܹ ‘••‰Ï>û¤ØúF£F�šX¿~¶oߪÙÞ®]ûb³¿ëÔ¹ ­ZÝ€5kV¹Ÿ¢(0™h;™­[ÿÀu×5 ÛÍ4kÖ»wïx½^¤¦žÀ™3Yðx<€;¶£yóV�$ Û·oE£FM`±Xàóùð쳃РA#|÷Ý�˜4iþüs¦L}á[µº}ô€`ö—.Ý¿Ùí 6S¦|�Ü\'RSObá¯1bÄ+š:îÚµ~¿¿Èëf†¹øÛ—†%ù›áV¢¯)!« ÖºvãOÏ‘ó.›ç0Fe-À>ïÉ‹©&c€<Ù�ïòÿÀ ViW¥ÄÈ“ÝX˜÷úN•vU.KdUÆ[±Þ½÷¼�u+^¬síFŽ|቗#Û cmÞnÍßðL·âÅ·ù¿c�×øzC!þ(<€_Ýû.I»zf8×`qþ¦/ûßÌNÏQÌÌ]{E<ç9˜Ÿ÷+Ò9¥]•c—ç¾Ëß„BÅWÚUaæ_[Ê”"?»÷`†s Üê?7 ÇJ6 H± ‹Ý75õ$Ê—¯@þ^£F-œ:•þ#ÍçóbàÀ'áp8P«VmtêÔ7®Ç½÷ö.ö\AÿnÀM7ý–,ù}û>»ÝŽ6mÚA–_Gjj*RRÊ�Çgeeâ�w^ǰa#P½z (Š‚åË—âÍ7ßE¹rå>‰ ¾ÁÞ½{аa#@ûö�¢fu‡èÚµ=@–eH’„‡~µk×lܸª ôë÷  J•ªèÝ»fÍš†þýÊZ¶ì;Üzk4mÚ Ð±ãm˜7ï+¬[÷êÖ½ РA#4h¬ß¾}{päÈ!Lœ8‡‡=ô(ž}v^xá%HÒù/üðÐC�"--ƒ?†²eË¢qãëpà 7¡cÇ[ ÙÕ¨QÇŽ#“eû÷ïÃwß-BŸ>ýÈ}Ž9ŒæÍ[†ÿÝ¢E+,_¾°wïnÔ®]‹{÷îFóæ-±sçŸaûžmÛ¶„�ýý÷�ðx ñÐC�Âf³¡jÕjèÙó^Ìž=O>ùÌyµI«V7àÿþïfLš4gÎdáî»{áê«ë…¯S§.<ÒÒRQ³f­ó*› ¢(*òó ÁßÊ si)T|œ>2ñŸÆÓeºùÒqÌŸ‰6±õa“,XïÞ‹wÎÌLªô$êØ*>Ç 3kÜ»°ºÆQ÷;äK‡Sv¡¹£$IÂ1&FŸY„«¬•1´ÌáwØ…Žk\»pŸ‰»[#Îä8¿ƒ/EUðká~$˜bp�£öyû³{vyŽ¡wÒÍ(k6¶þ LÈù«Ý;á�¬ø¾ÚK0IWV®L@•±¹ð ®¶UF9K"`\Î2¬uï,¯þ l’i�l,Îß„c꡹£À§�æÏFMkù ú{§8Žû3ñmþ&ÜÛ |Î’$Wvã÷´pÔE+ý÷+œðgáˆ?7Å\«dÁZ÷n|˜ý=`l…‡ÐØQÓð9?Î^‚5î]¨g«Šñ•½èk0Êßiä+…hl¯Yâ÷ê˜?ÃNO¼Rî^´3ð S'ýYØë=‰›cë#ÆDÛ/úÕ–lC’)·Ä5:¯ò÷{SqÜŸ‰[âÁ&ÑŸÚ>5€_Ü{PÓZWÛªœ÷5D2'ïÌËÛXPõ$›é¿å�² {½'ÐÂQv“|ix)ó+Àåzáÿbë_T=ô|›¿ ³ò~T±”Áõ1W“ûóg`•k:Ä69¯÷�Q<Š¿îG=[UT³¿ùNœXV°7ÆÔCûùYM^(~5€ß ÿF]k¥ðx�¯b�k'šÚk£–­¼ŠÏfg�ïñžÀè ýÿ‘ºAVeü^ø7*[RPÇV ðzæ<ò§cyÁ6L«2ø¢Ê?#çcQþï¸Î^­b‚ßÄ.Ńõî}hb¯YäªÿBUUìôƒC²¢ž½jÔã 6{¢‰½&’Íqȕݚ1�ÈÆ“)]Éã|j«];PÙ’‚fE¼;re¶{Ž eÌUˆÿþFa†¦4uÜK‘oò~ÅñÀ?Ÿ±ôMÞ¯†w ˜©¬ª*ùdz>"!!)))áW¬X›6ýnè<*œõC ~†„þп}>:SOQ¼ñÆË¸ùæváìöœœl¸Ý.Œñœ¦î²,###=,¸WªT¹ØºEz¸Ÿ8q£G¿�S§Rñ #‘šz99ÙèСuxUUaµŠ‹–@ZZš7o¥ÙVµjuœ:•þwd�RSOB–etëÖQsŒ,Ëp:�šöŽ$$ˆdĈWqë­]�˜˜ˆ÷ß‹´´TlÞ¼ ;vlÇøñŸà‹/Æãã�'ફè?ˆ#Ïm6ŸûàY€$I¨\¹ î»ï~Ü}·83.$›˜˜þwóæ-ñÑG£°cÇv4nÜ&“ ;wþ‰&M®Ãž=»ð AÏømÛ¶ {÷»§N¥¢J•ªšb«U«ŽÓ§ÓÏfØŸŸ(1xðPÜÿ=ˆ��ÅohsMJJ8�9,¸_,¶3Ì¥ç˜?2À÷›ñt™îp).Õƒ‡’:¢OR[Lqž›E¸0ÿ·óÜ׸wþò¥" Ê°HôlCŠÎ5ØïKÅà”nEŠ[é�Ä›bÂÒé€�¥O„o—¿7Æ\ ˜=]¨úÐ6¦Áy‰ð…Š|§ÐÐ^fÉŒy¿…ûàÌ·hÛ0Ø×¼‡!« Z9® —_ "NrD=Ÿ¬Êx.c:ÎÈùØç;‰gÎ$ÿôÁ_¾Tt‹o‰x“+\b\Î2@Ys;jBQò§£–µ¬Q„ô\Ù…A§ƒÖ–r.ú&µ —FÎG»Ø†°Hf|›ÿ;&;W8'’ïõžÀJן¸#¾êF[(Bb;l÷Fû¸Æ(P<Øí=ަöZˆ1Ù ª*†eLÇQzÄ߀AenÇÜÜõáã>É^Upßë=�iΟpK\#t‹&½üâÞƒ-…‡Ð'éfT:ûœ÷g"=àDKG]˜$äo —±Úµ×Ç\PëÚ*† /eÌÆiÙ‰åÛ°èìsr:àÄ^ïIÜs5bÏEre ªZ‹N”Ò33w¾Éÿ1’ « ‡M²àƒ3‹ñ§÷æä­ÇŠê¯Á,™�-çãW÷~´Š¹*|M¹²ùRÑÄ^ýmGáWXïÞ‡šÖòá{ùuÞLÏ]‹dSfW »ÉŠÏsV`…k;L0ayõ—‘«¸Ãelõ ÿï¾4÷gáæØúQÇwUUqÔŸ�Ör0ŸÇso”]Û16{ ì’³« E²9‡üé€zFV |§Ð"¦NÔºR|’½ ÷ãklÀâj#or`²s–lA%s fTyæ(çÓ'L�PÞ’Øî=‚2f@‚„/+?‰šÖ PT;½Ç�bŽGMk0ïãì%øÉ½ lÕñi¥G°Ïw"\æ¢üߣ îË ¶`|΀镟F5kYøÕöxO ž­J8�÷ZÖ<ìöGÛ˜xµü}€Åù›�)ç¡ob;ÄœGŸbæâ(-‚÷Rä¾ÄÿÃôRÈp¿7ñÿ í[£FMø|>¤¥¥’60Ç�Cõê5#2ÔdÝ*Œþ}-/P£‚éôé_"7׉1cÎÙ¬ØíÁ�€‰§âÚk£gl„,CŒ`2™P³f- øž~úq<ýôs°Ûí¨]»fÎüÚP~?}¯#? "ëd·Û‹U«~¡‹JQ‹¦†¨R¥*''Ün z 3fLÁ[o½Wäqÿý6lþw䢩F‰¼ÞJ•*£L™²8pà/üùç6ÜPˆ˜;wþúk?’“SPµj5¤§§#''×^ÛàóÑö.šYåtæÀï÷#??ùùy°ÛË eòTæ Çd’àpXáñø¡(ÜŽ s© 26ÿô…G Ž™Ór×àþ¤vH4ÅÀ-Ùyrax_§ìBœÉUPÒPeøÕž:+îòÇkåïÃò‚­P|Ö_Ïš‡Õ5ÞÀÿéðqÇý™aÁÝ ?RbãŠdU† %ü¿¥ðœÛ‚üß‚û.Ï1¤²Ñ!®qÔkø.¶{ŽàÑäÛPÅZY�¼p¶ÿqÞ«Ðû½©xúô—°IfL®ü*[RðqöÒpsóÖcd¹{„²UÁÓ§§ 5pרª`B¥Ç�p†ßî=·–ŒKñÀ*™Ã×47o=¦æþ„«¬•1¡Ò£B6{®â"÷þt<•> ò¥ã±”Îäu•»_çÿ ‡dÃ7U‡!Öd‡ªªØí=›d)2�«ø!C b‹ 6…EˆPfö¬¼u€L9Gý™‚�èU‚ýr¿/5¼-ï¬èô·/˜Œ0Ù¹*ªà.« ¾/øf˜pG|«¨ÌÎûÓs×àZ[5|Zña˜$Rç¬ Ýª’*áͳ•½¾ø²òSQ¯=_)„æ°`òyÎ�ø¾`3€sÁ˜õ…AK˜\Å Ÿê‡f<žþ9N²0´Ìèß{}'áRƒzSsBŸ¤¶ˆ39�)ç OÔ:‡Sv…g8eWÔÌg 8%”�üZÖ=+ˆPá4sÔÁ:×n¼{f!Ú«ãà ’}áŒ\€3r~¸ŒgÊtÇ!_:†eL¸/JÎs–™K 6£±£&&æüˆo 6¡¥ã*¼W�žÅ¹Ùsn\šž»}“ÚáW÷>¼–5àWet‰oÛ�` ¯k|s<}:¸ÖÓò‚­XYãuÀÊ‚?qZvâî„Öá¾–ÈÆŸž#hÛñ¦Íùó”àX>2s6öx�£sÜux¾ìà‡Œ£þ ÁçtP™Û‘1–„Ž£xöô4 c»÷:Å6E2Þ<@Üç;‰É•ŸÄß¾4<�þ%�òX“=, ‡ìÍÆe/Çj÷XaƬ*CPÎ’ˆÓ²ólÜPU.ÕƒÇÓ?G¾Rˆ›càµò÷!Ovãþ´�áQ}áûm”oò Ìógâj[eüé=g¥–§¸‘hŠÅÓé_"]v¢nA%|Qù øÕžHÿr.®w\�QúF=Gš?›=qKlC$™ã°8¾p®„C²bV•!H1ÇczîZ€Sqa·ï8Z8êb…k;@�‚,9ˆß¥û¼'ñÌé/¡@Å©@‡p'WvÃ!YÃÄIΕ˜Ÿ¿78®Á;î7Ü>F›œ�ìUýXéúSÐ|j^Õ�GÓ'"Oq£Sl¼XËßX¸?ü¿Orpµ­2–× K—s�§¸‘bއ¢*ÈW ‘tv<;æÏÄÀS¨˜ZeªYÊaÂÙ÷� _ä¬Ä¨ }1=w æä­‡&̪2,Iøél@{¯ïdUFœd, =ôž‚Á¤Éðî™EøÅ½GÓWvŸµyúåì»`�÷8>ËY ”‰&è3 S²”¦Á‚{)Ò6¶¡áLóÒફ®Aõê50þ< 2Ló[ À’%ߢk×îám.— N§ÉÉÉ‚‹}–/_òT‘lß¾óæÍƤIÓÃ";ÄÇÇ#)) ‡Ðî§N¥¡rå‹›º …W¯×ƒªU«!--n·±±Á?\ss�°Z­¤=KÕªÕpìØQͶãÇ�¢m[1#=´a¡iiÁlnp»]ðûýá¬ëóÁívaÒ¤ ¸÷Þ>áò 66�7AZZjG\ݵkžyfX‘ûEbbrss5Ûš7o‰íÛ·aÿþ½hÔ¨ TUÁ¾}{±cÇ6´ly=`ûö-hÜø:X,Áa+Ôö~¿Vkð�ÍcÇŽ¢rå*ç�Ý®ª*Þúô釬¬L|øáh¼ûî˜ðïNgЛ09Ùx¶#b±˜°>Ã\JdU¶%êDH4Ç"=Bè‚Y˜/fÌBs<¦Wl(;-Wqã¤ÿLX4 ‰Œ±Q¬BxÎ ­“sVâëü_qÙ¶x8¡S”k’ñdú$õgà­ò}p}ÌÕ°�úÝÞãáéà^Õ�;®ö)P 1îì#X\}„f¶á–³‚Ù‚ü�P À£*ø8{ FWè�X“9JÁÙrh!Ô©¸�8 (Tv¢�ù31(}¬’Ó*B’9Ssƒ"ßAÿ)¤œB–±Sv¡†µ¼PÖï (gg5ÌÏßUpÿú¬ðäQ}Øê9„›c`aþoøÜ¹@ñÖB^Åwre:õ¼j*=ŠÖòšÌìMž¿…Ìl¿ªOÌÞ'=¹²;<« 8~qï ‹ ¦X´�bÿ1=7¸�û~ßIüí;…kuÁýý ‰“À¹`{HÀ=æÏÄSé_À 3¦U„2æ„°Ø|§„Ùyr!²äüp&èØì%álj=‘Û.FpÏQ\(‡DÌp®Á¬¼ŸÑ-¾†–¹“Ü7Òƒ920¦çÍ̯¡BE�êÁ¢üßÐ?©=ý[=+¼ÏÊ]ÞöqöRÌ«J î9r¶{Žàú˜«oŠ�¬ÊáàK(�–@Œ_3#ÊßèÞ�fŽ:xûlÐl§÷úÓqµMœÅj‚(ÂoˆðÊÿ±`JîˆXɆ<Çų‰Q߽ȷxBV•p¶mäLàI÷¾+ø#ü¿vïF—øfšß ukm„‚|§ð~ö·g÷ñáÑ”Û�'»ñØ©‰(T}øË—*ÜÏü³cyÈÏ}…ëO<_ö?Pˆ÷Bd»|6ÿôÁØìïqCÌ5x"¹ $I ÿª~5þw¨¯üæÞÞoqþ¸/±�F¼t©Ák\íÞðCÆA:Êèžs·êÅqòÏBï“Å›à9{FfÎÆòê¯fSïñ�À Ž« e {_î\Ù YUÂïÃCþtȪŒS�dÈÁï•?<Î]³ï4N˹¸ÞqL’ J0@àV½Øç=‰ËõÄΕÁó©~üX°½“nÖœ32È"_)D¢I ¨þVøW¸OüP° }“Úá€/ O§OAŒÉ†é•#Ñ‹ùgglòü Y•ÃYî‘ãv4¼ŠÇ™¨c­5‹<Êß>½{ŸËð°Ùl˜6m¼^Ž9ŒÕ«Wâÿþ/ø†ÝnÇ™3YÈËË…ÏW2ýN§o¾ù † †ZµD/Õ;ïì‰3¦àر£øúëÙ8°x1Î áôétLŸþ%n¼±5’’’qà 7!99ãÇ —«gÎdá•W^Ä„ ãÈã;w¾«Vý€Ý»w!`ùò%8rä0:v¼�Ü¿N�«Ð¸q|òÉ8�Näççãý÷Gá­·^½ úÇÆÆáàÁxë­WpàÀ_ðûýØ´é7¬^½mÚ´#�óz½X³f5ÞxãeôîݯÈYÅQ»v>|H³­yóVXºt1ªW¯�˜˜ÄÆÆ¡bÅJX¾|)Z´Zðl߾͚µsã�­a±X0mÚdø|>?~óçÏÕ�Œ²téw8s& ½{÷ÃÀ�Ob×®X»öœppäÈ!Øívr¦Ã0Ìå„ ­¨©ª*™éùaú@~9s�‘!ç⇂m†Î—+»Â6Ñʧ‰X!xö™_�+»³æ÷x�ÃwVØ9âÏŠ PÂY³ „³EÖ?�µÖ�U{¼ÇÃð®ˆù‚³A+‘UYú_Þ )„æGBõ�\Å-Ü 8}¾Põ!OqcJD6m§â¶åœÝV b—çXXD;Û�§Î ¬!±¶FdçútBø›Yßஓïbµ+(˜}•û3r7<ªï�Y0E|VP þˆvðP‚»â (ÅñmÄ‚Œ! ‹£¾ 9=%œå¨'‰¤@ñÀL|åÊ.<’>Ó'„…•Ïs~„GõÃ¥zðyΠᘼ[ˆùJ!L„pB Àñ¡òÂÿf Õ7”¹¾¬`+€à˜ð^Ö"<�öIx�C2fmPQŸP0€Z?!$¼瞥“þ,¼–9 #žÓW2çbÔ™øèLÐâŠK¨ Dä˜vZÎ~eT«ªöT�V~dý³ÏÔ"Å[J\ ec¿‘ù5îKÎd�%Dߘˆ¶=N,~\HÌtVTþþw(K{·÷xxÿÐýÔÖKrªlC¨ªJb';W!5��Eù¿kf�„ëªxÉç$²½2ÏÞ�È «‹/seܪVXuÊ.a UUJÄ ÓÐ{Áy6è÷VÖ7˜q6{ü„? ¯fÎÅ·ù´¥)às*â;,O)êáSýÈ•Ýtz2^Μ�i¡ ž÷dø:B…ÈwJZÄLšùÄ‘+»Ð%}ª_Ó§B³>É^ ?ÈSÜšàVdý`nîzÜqr¾ Æ©Ès<‘þ9žHÿeÞ~ÄwY�<òÑg�Š›|¾(UÁF÷~œŒ²¸“h§â©@vx�B�FEŽ5§ÎÎ&‹ &ÑmM¼_e—ðœÀ¦Âx1sžHÿƒ >ųϾ«ÕŠ„„<ñÄ`|üñÈË þ¡¹}ûV4ir]8“žaær% û8s©^R¼Œ[Bç‘ÑNùl–škJ‡ÛÉóå(¢@Pe�ÈDA}°g�µzxÿÌ·xæô¼›µ�¼&€þÈ�Μ'æüˆgNOÁçƣ@ñ‚€Gñ‘Ymɦs³ÔB"c¤ð:ÿ1Æfþ×—ï”]Bf·ªªpFÒ!%’BpÊPTƒÓ¿ÄÐŒ©á…5©ûPeLw®ÁTçO�‰ÌrªýBçœêü wœ…w²œÝ^€_Ü{€×#!ñ>NÓ>b†¢^L‚¤P Z¸ÅEˆzgûñWy?c·÷8åÿޝ#ü­C¸‰ºå+…¤X4;ïógâ¨?s~<{žs×™ Y=yJ!lÄÄbJà¡2Ü /&äü€Î,6,ÀP×Pƒ™Å«Ý;�ÈÆÐÓÁ!Žb2`CDfކÄKj6K¤ŸtVrŸŸ¿¿îÇDç�á ìý¾“ÎY.ÈÄ}§‚I=ª½CYØ/dÌÄ Ó“ðЩÏ�Èîqd¶v$±™êzQ>×ý§°¾p/²• 9=H1º8ᙲ-P).æÉnÁþ0—B=ªŸ÷þŠÙC÷F[//ùœHÄ=Š|6©¾èT\Bà’¿]ª‡¬ëfÏÁð½Yu6øMÞ¯ØX¸ãs~À>¯Xª­sˆ q18e7Žû3Ãý~îÙŒiêžDÚõP³Tò‰ÀuŸœ²[ÈŒÜ7D*!臞SrWC�Î~‚û雳ƒ¾ôð,¯®?ß�épÚXìð  ¨zT¿ÐϨ`IÈ2¬@ñh‚°óó7âÕ¬¹x,ýs¤ùÅú‡ÞuúkV‰ñ2ÒfÍyö–@ü}£)Ÿh;ù.݈þ䬭\¤•u©1É)» ( ˜y²Ì ­ñRæWð©ìñ�ÀNï1á†a®ØR†)–k¯m€Ñ£ÇÚ7ä ®§F�ZX´hYøßŸ}6)ü¿~ø1<üðcáßxcklذ%üo»Ý®ùwäÿ.*›Ùn·ã¹ç†ã¹ç†“¿G–CѼyËb÷€«¯¾Fs=‘T®\E(£oßèÛw¹?UN¥J•ñþû[ÀX�ãââ1xð³<øÙ¨ûèïÉÅîÉÍ7·Ã¸qáçŸ×¢C‡ }@¹rå„zëïÝ‚K„²4h„ ¾4t^}ÛD¶õ?¬ÑìÛ­Û�èÖ-8M×çóáÇ—GíG Ã0—zQÓ)Á²*ë2ÀÄR‚BTH`ý {1:Ç7#?²õ¨ùJ!)$:$[Xh§„§ÐtÿÐÂ�!;ýG°¬*‚P¦ªª¦¡,ÈugèÌ�sñ·/ ̉šãr7™yL‰]q„:2cÒå,+ØŠUÕ_„b§ì‚U—�îR=šŒP*ë’Ì ”]ÈUÜa[’®íVæ.òþnñÄWg3›ªŒGSnƒ),X„êo—¬áóçŸÍ꜓\7f­{†(ÝIÁÂn:÷ jë8“™g»u)K™ÅCôYQ ÙvlõŠ‚íx8¹*Z’Iqz]Ä¢¬;=ÇÿwJ qÁUU‘!m÷}Ÿ#go>k©a…þ³üN"X’¯jDâzQɧúI1g�{�ÍÚÝí=†U‚ÉE-ŒJ‰œnÅ«™½@õ½H6¸÷á�/½“n†M²À&YÂÇx•y 4¡þ™‘ý{áßhh“M(1—Ú™)J CQÍš srA/]_pFÉj�)6ýPx®:€)Þ‡¬UL�ÂûR6'Їœu oëP¦zh ÏS …ñÒ£ø`ÑY-æ*ôuGâ#‚.ÕƒDU+ªªJZ™Å׉Sv çpÊ.a§ì"÷<ùœ¨Pp�›™õGáߨo×ÎL]�·mch¶å*.¡]ód·`ÃâŒÒfúceUF¼É^+€š¥B�©9Ä»ÚI´�`ÀérΖ%Š»9„ \x6¸ü詉88ƒ‡“:¡wÒÍÂx¥¨ ÖŸµY’¡`Šs5>­ôb$[øZ Ÿ0cÉ©¸„1Ω¸àPmèŸö U/ž-sºÄ7æ E�Wõcaþo\¦›pœP¾ì‚Ù&"­‹BÇ$ó÷ 5F;eÊëþ>ð«MÀ-÷lŸK09�~¶zùÄýu*.ño%ÅE6ODdùŸð‹³¯¨ú3 såÀî Ãü£Øl6 ðfÍšŠ@€Î,ºœX¼x!Ê•+�›o¾¥´«rE£ª*<1#†a˜’E/NQÓ¤ó”B2k4*ó³@ñb•Õ–+‹– ²ªh²Æ© nJØ¢ìòˆL@Jд™l…Š�Èdt“‚5REf퇄‡tùœ÷µ[³?�Š+,Ć·É.M¦pÈÏ>Jp§fxU?y÷{Ïeª†ì(≠t}àEoS x„é÷§9°‚ÜEÏæH¨>E‰ëÔýõ©¤ù³1g‘YØ”ÕPŽR@gfëêOÕ�ÚïI®âÖXŽ„­—"¶‘"°âž%Ꜳ*k‚~Ѳ©õ�œ %K6NžµÔš’»úìñÚvÌWØã=—ê�c²ÐÎ ¢äߊ‹œùDõ êÙ‰|çR‰\bvE¾R¨yGºÂ³Ý"Ÿ9b¶‚,fË;eºþ‘ã530´p,Ã0Niê,¸3 ó�Ó£ÇQ©RLŸn,;½´8qâ8fÍš†7ÞuÞ ±2ZTðù`½�a.-ÂG0ñÍ«Ô^ŒˆõÑ™ï1‡Êú£DìŃdsœæ8=…„𜧸ũå„XM ‰Ä£úËŠÙ!öyOjúl¨üÈk�æ§®§€°�ð¨~T²hKßï=‰¤ˆÀì ‘bÕ·)Ëš€*‹3"ˆö€ªíºªªbiÁfxU?Öºw mÐ"§Kñ÷øW÷~âP4 üÁ@Kd{ÿZ¸ªª ý»PÕ¶Bÿ;²¯--Ø"œ“²öˆ<>„ÞZ‚ NTYêU!Å\Qsk|³© úBE±/ü‹´×¢®)ò¹¦‚ŠÕ‹î3½€x>�º±Ä­z…g§PñѶM„0  sAWª|¿ÐuCÇDŽÎh¢¤~ Uè w½ÐìSýšÌæ•gíQªYʆ·ÅJvø¡Ëª'Dþ\Â^„—ªLß“ˆþËõÖ?ÂõD{¯é³ï•B��J.QVŽ\ ŒÛ”½™¬Êâ~ŠK0 �«‘ý,G.Ê ÖU´3¢,w"3á׺w íJAdÚ#žZ£† ÜEö *(Jý]”¯’6QÅ-l´Òv Èúû"ú#ÕÏ©º2 s~”¦Á S"Ü~ûøþûè ²0Œžw߃Gy¼´«Q$Õ«×À’%+‹ôØgŒ\œa˜K •!'|Ì¢žÞËü×6!ä—½¤  &(áÙ¥xе� „³l¹@ø¦D~J4Ñ <ª˜áNe2ógVAXÔ·Ï9+ÁÁ©¸È H¤]DQ–2‘" uߨ¬}§âÒz¡ý"³ÁC"K¤HžGˆ#.Å#o¹Š[s¼Ÿ‘â1e)Cm£úg!V¼–9�Êôõ ©Gè:#3–)�¤@ñõ üý©{œpîœd†»ìúÆA_:l �Ôß—Õ£YÔ’Z˜‘zƾt®&Í(VD¿ªi-¯Ù–!ç Â[Ž\ Ü¿€*kn€¸Àóÿiá¹. N�ðF-¼ëWeṓ¡ÐÁ}ö·¢��Bg¸{£ˆ÷Ú²\ÄÌ EU4Y¹>UElÕ'´¡‹ðO×Ï¢Æ*³Ÿ÷ôÏE4 (}?.$föPç ¦È÷‰ªÄÀL,l-fX»QƯ٦ªª&ÛÙ£ú…@L4qW¨‡" ¦nâž8·fÜgˆñ72£™ò§Î™+k3è©5r—0nGËä§ö‹±Cý@Ñ�qÔø`d õ]ĵé =Kˆš«G-yMÔì2¸AäíBå¤àNOˆ  ]`7Ô‘ï«â¬Ÿ†1Fié,¸3 Ã0—“IBl¬ &SÑ6 Ã\ú2Iqš5r7jèÄ4}a‚)Fü Žòa¬‹ T�fa=JÌ9 L äÐb‘�©÷ú�j�âDÕ™¹kE›BDÉ“ÝB�õBÜ¡(*• 9=Ÿòp‰ˆfɤ9NÈ^%ì"œ²KX\n•ëOMûçŸÍŠDaÑ]ÑB‚òYÞá9ªéä"‰gÅÁx½èFd ö�âµ `dy!_úÈ© wÊÆÆ£ú ñ�•—¦¿Sî”·6•õN À…ª˜A¬õ?È^,€(K™-žƒ†f‡äÙ¤9²KBÏ"1æcBœn­}fîÈÌÙBÝvxŽ åë­%¨@]¡*zL¨ wE\œÑ)k…1j¡Æ`†»(Ò—EÙp¹T¯Fp§²¤©±Ê£ŠçÔ�…nÕKöÑRFìÇ.E;FS�@jl¤D~*ë]UUM[RËQg¼÷€ égŸ¨Ú€‡S ”�MÔgS÷Œmö¤Ç߈ýB�B³$Ú,E>9Dݨ€vžâ.V‚¥ñ2Ø ß–#húgH��l#§"¾×rˆ÷G0` ¾ë#åбÚz‰}#7J0ÒȬ˜U¸#=܉€5ë ÐÎv£ž£Á‡` @;Ú…¢õ–n Ü?¥©C°àÎ0 Ã0 ó/�ô€>² )Gv¡œ9A³-W7•_VA\ =â Á4(<�Û�²d9â÷·³æ‹Á�(×Tœ(Ie¸Ÿ œ!mZ¨ %œGúÒ§ËNRh¤²÷"3Ü© ÝãþLÚ©ñ”8B{ ‹Y‘y:)”ay,•íèRÄL^§âÖÐYü„/õÔÜŸ„Åm#l8(ñ Ö' D @Ûf*Tä)nMv#íŸ,fRý…zžôB“Gõ ³+ò ᦀÈ~ÎQDäh&=:Ïj*è¾ñDP.l;Êú�´– ÛM»ß¹@¨%S6GÔ·‘ä+nQ\Œ"æêƒƒÑ¼¢#™èüÑPà"Ÿ¨žìÖdÈ ZÊLÍ]- 犟|Ö#ëJ Ý.böFÑß �Fü£2û©²æÿf(¨ž¨…[iKQ´UÔh³‘6b›Kõã-½Ž!¸ýçÝ3 é{B¼ë"ëFå¢e�S–2ÅÙ§­pm7dŸD=KN…Îp×Ï*Ñ{—G îS‚µþœ¡f#Ë¢2ÄÅw@ù¬7/(¤Ë‚e›¾,jí UU…ýÄñGÌŒ§DxŸдu¨¯Èš¾"þ=Å0Ì• î Ã0 Ã0ÿ¨ì=*#—ÜFdóF~¸ºU/¼:Ÿõ\R?ŒõÖ>5 |¤R¡Eç ˆ…û¢]S$”@¸nÊ!/Šp®_°M_ל(‚d¤/l²àé{È—¬[D} T��Í»ËsÌЬÚìÞ<¥P­T¨ÈÖ‰ ŠG¸îÜ(6‚5dÍ⪰ţõ€#~m …njXÊG8µûeËùÅz‡,"mC¨ %^FÏÀ%D«1‡É¢ÍDž Gq ¾î9º{Gy¸ÔB­âµ{T™mKk$c˜æõ"¸ Ø@™ÞúçnzîZñy¥uѼº‹4ƒÇjŸÙ¢ßºˆELó”BÍs‘êÏ®ñ˜?S¨ÒÕ?YʩŠ�DŸ*P\£f¥eÅí“«ˆ‰Kg©áG@ÌàT}‚O�ÓÅ?™ÚÉ9_ØÇ³h%B-2HXÊäçÙDû ‚üâÞƒ æ¤ð¿ÝgE31P[~–œG·…î8¿nñF ÙŽz”Ê0Ž*ŠéÎéUýH4k-H²ä\¡?êÏI ÌdÀƒ°ØYéú“Ì,Œê²)ßbÊR†Z€ŽÊÜ;Eàâ|´1Cót W8.YÈN£ÄÆ<ÅM,~*Z·èÛÌ©¸è{"Ôß­±ù Y’ˆ‚¸V˜øÁµM¼nÊWŸ± ‘\/FeÊy†1NÂÚÆ«‘R…h¢¿O~È‚ØHe‚I‘L—‰FÙgÙ¼{¼Ç5ÿ¦2  [Ñ î^cúŠ ŽÛ�âC… ÊÃ�Z„‘Lô‚¡ê}ê8ý9ýE¾b²Áˆ^º3Œ©áôY‹û½'i/]žÐ^E̤¬ô3QÀP  ¢ÃÅ“ôA!Ê'}«çi+! œÅŸ“²)¢²Þ©,K*™œ9!XʈÏ ö!ª�AyFÎ3dÙáT\ðêwÒv‡õõ6TÝfåý,´·[ñ ×åUý°éì�¨g]°Á (Äý¤Æ&½Hì£Ä= ,û£¸®€¾|ª ©…Góô‚;5k‚ìP�Ò 9W3Sc§÷¨@F¾¬­?5†RÙÂdêÆ7`9È2¢´¸«÷òdƒ;J†»ÞΈZ�ö˜?ƒK dü“îú¶UĬnÒ]ƒ¼†ÂÔ;]ÿ®ˆzN"3yOÅg½/Èß(”¿ÅsÈP`*‡XËF ø‰ë&œ ˆ66ú±×fÉUÜðëÚ:C—áˆ�ŒPý†¹pJS‡`Á�)†} “'O¼ c;th�Í›/á]:>ùäCÜzk[|õÕôÒ®ÊeÅK/=�/¿üü¼�[½z† y’ümΜ™èÒåŒó¦Oÿƒ=ZdY>ŸýúÝ‹U«~<ïz0 Ã\ŽPâ •Lú‹ÜÅK½Ÿ/‹¢*5uý´nÊ{¡"ÚGPçtGYè­8ÏÔ\B¦ÊÏ!²á<Š�´”)N„€¬@ñ"�É+f„R"ezÀ)”_œÍ@‹Ìú{žNdyç)nø¡™DQØCÔŸ\‘ÈÞÓYÚ€¶}(Ú¿-fyn›BdO¦G±­ }¢©Å„ÏíWHˆÄÑ,eŒd\y^©çˆö k·íô#m¨zøˆE(ÉŠ÷p§z'g4ÿök1ô¥+kÖl¼àcχmÛ¶à駇͜Ji6›Q¾|tëv'î¿ÿCeäååbþü¹xï½�ЦMÛKY]b�#éÛwz((@óÍ,[ö=ÒÒÒ (2êÔ©‹~ýBÛ¶·¦LùÓ§ «Õ UUa·;pÍ5õнû]¸í¶®á2#÷ "¡B…Џýöî¸ÿþ`6›A±xñB¤¥¥âÍ7ß½ klÖ¬ùÛŒS0pà¸ûî^€)²,›Í†‘#ßÀ�!O I“ëP±b¥ó®c “IB|¼œåÎ0—}$ 9² ŠUŸeL}ü/†PÛ(ßbjAA½xäV½¤ †à+®z`‡U³Í)»PE·ˆ¤^¥‚Tù§å\Á×£ú댠`R¼ˆ¨&ò·�éQýBûì5 ¢PÛ(q3šïzqÂG¾R(ˆu€Ø§r·f¡=Øì9%{X/ŠëgúºyU¿°0¨“ò^&$JPÓ [i�láyÊW E�™¢u×Ie¸¯vïDsG]íqdF«hUB�SXðVõ�,#}¨PñÂnŸ±²fíßýNųd¶éýÔ©Œ|ò³Nr4ÿ¦ �JæÍ6#ôÈ‚Ø�«¸PF�×ÖŸÔŒ´#%lç¾âz+ Ú3 ®grh¶é-e€àÚšó©ž(AÑâ³°SÙD]µ×ý—7MxΗl‚T€Eß(Q€°�d´™FfnQýB/˜F;V_ßÙ%ØQVQTÛR}V\P´eLÚï«ãѲF\®âÞaÔá”]�­Ôdd†Š¶ú‰ç‹{é{bì½�aÀ†‡ ™­W x„÷ÚZ÷.4±×Ê×C­¡¡¿Î¥[p�½¶f[¦¬MDˆV>Ã0Æ)M‚w¦H6oþ#F À�àÅ_FBB"Ž;Šñã?ÆO<ŒI“¦!66®Ør¶nÝŒ%K‡÷+‰~X »ÝEQðçŸÛð CP¥JU´oß©ØcÝîà½Õ«×¸ÔÕÔª3Åܹ_aþü¹xóÍ÷píµõ!Ë2V­ú¯¾ú">ýôs4ir ~ý†˜4i: ++Û·oÅgŸ�ÅöíÛ0|øÈpy‘û)Š‚ýû÷bäÈ I&ôë7@8¿ÏçÃôé_bðà¡°XÎÚ¶m+FŽ|�üÍår¡Zµókëk¯­�¦M›aîÜY2äùó®s>èÿle¦¤1"°yTŸ�æ”]ˆ1iƒµ”×­±ÂCØ dYmT¶à‰@–°�ÊxL6iÿöÈS ›òZÝ«³±¡Êßí9†zöªšmÁÅ‹ŸzO TÆš~¿½ÞBû|•ûó‰E…ª�ôªÖ £T¦$%¢¬Ð‰uÁsŠ­ &í©¤÷8µ¸-!fRSôi�Gô)6I’°�שuôüVø—°M°ú0`Ǥ@ /žÉÏAÍ¿©ŒVjáGºï‰ísÌŸ!l3Ú‡¡˜zô÷=GvÁaÑŽ%NÅ%»ŒfµêVnUœ-ˆ³{ŒX^ô"²5¬ú¾a,]¿miÁ´ÐU¨€Á~ïI¢¬â3ps7ì’Uئç˜?SóoŸú#µ6µ˜p®�àÃiÙ©ñ~èg‰Už¨{©s:e­…@Û÷íwF‚¿T}ݪWl[U fä(¢ÿx!¶R‹J'Q‚~1Ü TrÑs›®Í¨À÷�Û„z}¾ôÖ0³åÆî ùÌéfCåÈ.Äšt?ÂÍȽüÛ—†«m•…ý(ë>=T ÚH 9‹°”¡Þ‘ Ü/¥£C°¥ EQðÁï¢gÏ{Ñ·ï$&&A’$ÔªU£F��ÇSˆ™3§–/_‚ûîë�¥K£G�®èÔ© Þÿ¬Y³¯¿>ûöíA‡­‘šzƒ=ЉÇfI>S¦|�.]Úã®»:ã—_Öaùò%èÙ³ºti�3¦„ëÕ¦MKüþûF¤§ŸB‡­5ÿµiÓS§Nx½|ôÑhôìÙ �:µÁàÁ�áȑÚr¾þz63fÍš^l{˜L&4oÞµjÕÁñãÇÂÛøÏ<óºt¹Ý»wÂÇ�A ÀñãÇлwOÀ€½1}ú—‚ÙÝ÷ß7:vü?ôéó_üôÓÊpYƒ=Š >ÅôÂóÏ?HO?…áÇ¢[·ŽèÒ¥=ÞzëU¸\>µlóæMhÝúf4jÔ‹v»ݻ߅7ÞxeÊ”%�)W®tèÐðâ‹Ïbôè·1eÊxôÑ€×_‰—_ÞÓ¦ßpÛmí�žž¸ë®ÿbÙ²ïá÷‹à Ã0W2!LYü”²& N#"S0›W\T¬¸Œb è¿*–¯­ÇÿiÁG˜š®M}Pÿ­[H‘Ú/[)l<Š_ð_Í&}:c³ø©÷”'ñ!:!ˆówlxˆá¨Å÷¨6£2î!"àñcÁvC™†Tö%~ʨ@iK±ï¨â9�`Ñü�õö�¶¥é²·"S�È’6:#eŸ�r‹}ÜŠO˜½Ay½=ܵ;Q38¨åÝO=?úòƒöKb†š‘àõüèw·êêOõGʲ†ªª_k‰CYEÍÏgïêýªñšTâžèÇ.€#ôõ§lCrÁšê?úöŠfg¤‡²ŽÒ—¯Bf²bÿ!히5FwêœFÞ€h“UH,K «™�âÇÚà ‰âÇjŒÓ¿Ó÷yO Ï9@ÑÅï#ª|# !ÿZ¸_8ÖEŒ½tß }qF„1K™âïåiÙ)ôm@|ž([4*`CÕ_ÿŽ9Íî ó¯‚w&*ÿ½ii©¸çž^ÂoV«=züëÖýÞ–™™‰½{÷`Þ¼oñå—³ð믿`Ñ¢ùèСú÷õë7Äš5Qµj5¡¼]»v¢lÙ²X²d%Z·n‹?|ûöíÅܹ‹ðÌ3ÏaêÔIÈÉÑNa¬T©2Ö¬Ùþï�w>@\\n½µ `âÄq8pà/Lš4Ë–­Fýú 0räóšiâë×ÿŒiÓæ oßâ-bü~?~ýu=RSOâæ›Û<† Œ–-¯Ç’%«0iÒ lß¾sæÌD�51gÎBÀôés1`À#ذáLœø)^xa$V¬ø?üÞ|ó:t.Ãiõê>üe¼ÿþÇPU/¾ø*T¨„… —aîÜ…ÈÊÊÄgŸ}Rl}£Q£FM¬_¿Û·oÕlo×®=ªU«^ä±uê\…V­nÀš5«‹ÜOQ˜tÓClÝú®»®YØn¦Y³ؽ{'Àëõ"5õΜɂÇüãkÇŽíhÞ¼$IÂöí[ѨQ!3Þf³…­†Þ{ï# þ²æ÷gžyÛ¶mÁ¶m[ðé§â±ÇžB¥JA ™¦M¯ƒÏçÃÞ½{м.†a˜Ë£T–®>‹PŸOˆÂ� � ô°Ö[ʈì_çm¶Qþ½[ a^_Eáé”;@&5 ´­Qñ›²Óí]ľ—¯òD§ÄW#ÞæÔ¢—€øüûÔ€à}о֔�SqåSD³¡2Jõèíi:Ð"ÚdíbýÓe§æßÔXhª}ôã5Ñã¶v,¡;¹„`MÍÔÐãV½†®‘3�, ­,}`„²r¡Ú‡Ìp7` m›>@=O”5�~Ä™ùJ¡¡ñ†ºOzq:[) û¿þý÷‡ç€°U–‘ö¡Ð×5X–xœþœ”=[ŽRü©ýN7X qj¼§’ô÷i1Û…3ÜæÊ…-eJuóz(‹¿<Æ>nJG,Lÿé©e›bwMM= ‡Ã�òå+�¿×¨Q §N¥…lŸÏ‹�Ÿ„Ãá@­ZµÑ©Sglܸ÷ÞÛ»Øsü»7ÝôX²ä[ôíûìv;Ú´iY~©©©HI)CŸ••‰wÞyÆ�@õê5 ( –/_Š7ß|åÊ• ø$,ø{÷îAÆ�íÛwŠšÕ¢k×öY–!I~øqÔ®œºqã¨*Я߃€*Uª¢wï~˜5kú÷H(kÙ²ïpë­]дi3@ÇŽ·aÞ¼¯°nÝO¨[÷*@ƒ�РA°~ûöíÁ‘#‡0qâ88<ôУxöÙAxá…— Iç?5桇EZZ*~ eË–EãÆ×á†nBÇŽ·²ªQ£&Ž;Fþ&Ë2öï߇ï¾[„>}ú‘û9rÍ›· ÿ»E‹VX¾| `ïÞݨ]»., öîÝ�æÍ[bçÎ?Ãö=Û¶mÑk”””24h>þøtéÒ ‰‰IèÙóžðïqqñ¨P¡"Ž9ˆ¦M¯;ïò†a.ŒL½DÑM†BŠsz¨¬3 }v Gõ#ÚiÞù²1ñØ(”p«G/~töÞiÝ~ùJ¡ Râ‚QôúFÄÇh!¬DôäÉb†»Q(ÑŠ‹ôÛ¨ w *;�BØ¡Ð/` g衲˜)ŒÜ;Ë“^ès«^Ä@\›G�~![€jQèE¥Â(Ê”ø¤VñY¤ž1 #bîß ”3' Û)�ÔHùÔ}× 6þ]lÙ�©«§�X<Ô(F®‘ºçÔuÉp§q#*>(æ »Fº®Æú±~\ÊSܰIÅËÔý0j)c䞸‰…_ÓÁÝ Tá9¤êEAÙÄQv.FÆU£P"³è@XñeQ–vF» k¬ïé÷£þö8ìß1Fú e«§f3 såÀ‚{)¢ü¸8%fØ\ZÎ@ùaÌw ˜©¬ª*)ìêKHHDJʹ‹*V¬ŒM›~7tž Ήú¡?CBèß>ý’Ro¼ñ2n¾¹]8»=''n· #F<§©»,ËÈÈH î•*‰¾lz"=ÜOœ8ŽÑ£ßÆ©S©xá…‘HM=‰œœì°� l«•þ0JKKCóæ­4ÛªV­ŽS§ÒÂÿެSjêIȲŒnÝ:jŽ‘eN§SÓÞ‘„‚‘Œñ*n½µ ñþûc‘––ŠÍ›7aÇŽí?þ|ñÅx|üñ\uÕÕE¶‡,Ë0›ÏMŽ Y€$I¨\¹ î»ïþðÂ¥zòòr‘˜xîC©yó–øè£Ñرc;7n “É„�;ÿD“&×aÏž]xá… gü¶m[нû]EÖ/·ß~V¬XŽÉ“'bÚ´9BŸNJJ†Óé¼ ²™âQ^0•a.1Tæ'•Fad?£Œ^¬ð‹FÍÖ¾È�sÉ`Æ¥„P�bDÔÎS I/ìK‰Ñk2*¸*‹9v^þGü¢åË…B V”(fäyr+^¤˜ŠOˆ ¸Ðg¬@õ�kP\¨({1PÖ0 e¢ÐŒeFùË—ŠŠæä+O�áY*z+ÕCÎ&ºœŠ •TúåB0 Ó£@5ìÑC-zy¡ý€�© ¥Qô&F„hÀx °$)ÉgÇH Ê«ø�u ÖËÈJ‰÷Fÿî2ÂÅô†aJW‡`Á½1u½Ê·³þù ÷®wÚµF�šðù|HKK%m`Ž?†êÕk†…KEшª0š€-I¢»‘ÉdÌñhúô/‘›ëĘ1çlVìv`âÄ©¸öÚúQ� ÙšÁd2¡fÍZ8ð <ýôãxúéç`·ÛQ»vÌœùµ¡2ü~:c Rü�¬“ÝnGLL,V­ú…:,*E-š¢J•ª¸ë®ž¸ë®žp»]4è1̘1o½õ^‘Çýý÷_hذqøß‘‹¦%òz+UªŒ2eÊâÀ�¿ðçŸÛpÿýA{Ÿ¹sg᯿ö#99U«VCzz:rr²qíµ Îë\!|>²²2a±XqêT*jÕÒ® /Ib‰)YXlg˜K�Þz0.r^ŒÀ«ç°.ƒX†"ˆ&”7øåJf R/W²ä<2+ýr€Êš¾Ôè–,iŒdoSœ‘óQÆ,Ú áB³Kà¨�YÿJ2›×(—²PõÄùJ!Ì%è6»Ÿ°Ô¸PJÃÃz—‡žÍ{!¸/|øüSèß�Fg[� 8…mFfe\IxT‰ ÔFXÔ¬§tY´¯ºP‚3ì°˜­Á0 MiéüÔ–"RË6†3ÍKƒ«®ºÕ«×Àüùó0dÈ0Ío�@K–|‹®]»‡·¹\.8�N$''.öY¾|ÅKZÇíÛ·bÞ¼Ù˜4izXd€øøx$%%áСÁýÔ©4T®\å¢Ï«ª*¼^ªV­†´´T¸ÝnÄÆWŒÏÍuÂjµ’ö,U«VñcG5ÛŽ?жmÅŒôÐþ……n¤¥¥¢J•ª·Û¿ß�¤¤äó®·Ûí¤Ipï½}Âå@ll7n‚´´Ô"�ß¼yvíÚ�gžVä~E‘˜˜„Ü\íŠÍ›·ÄöíÛ°ÿ^4jÔªª`ß¾½Ø±cZ¶¼°}û4n|�àßn”™3§¢B…Šxä‘ÇñÁï⫯¾ÑÜ£`ß-¹lF‹$Ip8,ðxØ`˜KÈå" Sþ´úL±+)këŸÎnÿ'88SüNL©#CÁ~_ÑŸE#•ï1s\.ï=Tñ%?§Ÿq£d^&ÁÍ’ ª_®xTNøE[–+�\Ù�rÑJ‹a˜â)M‚Me¢"I† �ï¿ÿ'ŽƒÓ鄪ª8vì(† yñññèÝûœO·Ífôi“àõzpäÈa¬^½ÿ÷7fjŸ9“…¼¼\ø|%“Iât:ñ曯`È�aB¶2ÜygO̘1ÇŽE À×_ÏÆÀ�ýËq^§O§cúô/qã�­‘””Œn¸ ÉÉ)?þc¸\8s& ¯¼ò"&LGß¹óíXµêìÞ½ �@Ë—/Á‘#‡Ñ±ãmäþuê\…Æ�›à“OÆÀét"??ï¿? o½õêÕ?66À[o½‚þB €ßïǦM¿aõêhÓ¦yœ×ëÅš5«ñÆ/£wï~EÎ(ŽÚµëàðaíbwÍ›·ÂÒ¥‹Q½z ÄÄÄ 66+VÂòåKÑ¢EЂgûö­hÖ¬Å�óÈ‘Ãøúë9:ô´oß 5kÖÂçŸþÝív!#ã4êԹꂯ‹)I¬V‹áY/ Ã\Ô¢©W*‰¦ØüœÖË Åô/üóüb®©$³nÿ׸Ôv¥MbaáË•’ìÇ1Rñžþÿ&.f½ŒË£6? � Æ?¨†ÖÙ¸Ò0²F Ã04¥©C”þWsYÓ¢E+L˜0Ó¦MFŸ>ÿ…ÇãAùòåѾ}'ôïÿ ŽÈ¬òÔ©sî»ï?((ÈGçη£G�ÿÚ¶½‹ÍGÏžÝ0vìø©Ûo¿m@ffÆŒycƼÞÞ´i3Œ;<‚‚‚<ùäÃðû¸úêk0f̧š:!Ò=11 mÚ´Ãc�=°X,x÷ÝñÉ'cpç���6mÚbР!dY�:uFzú)¼ýö«ÈÎÎFÍš5ñÑGŸ¡zõQÏÿÚkïà£�Fãž{î€ÍfC‹×cäÈ×Ïë"=ú#L�: /¿<gÎ3jÖ¬�'žŒîÝ{„÷‹ôf7™L¨]». ‚.]º]ð¹ E‹ëñá‡ï�õ‚Úç4oÞo¾ù2Ox¿Æ�›bñâá ÷mÛ¶àÎ;{ž÷ùTUÅûᅢ»ï¾5jÔ ú< ¸�:uF“&×aÇŽí°ÙlhРáE]Ã0Ì?Í^ï X% ®¶×ÿ�/ƒ,º’¢¼9ñ’ ±’]ðqM4Ç+RÖ°”Çñ@ÉØ�$˜b„ÌÿDSL‰}\—5'ü㢫 ªÎ úb®)Ñ+d›šaºl³qK L†¼ˆ­0_Ù³Ôód¤ ò¯f-‹lï¥Ë~¶À\b³[j[+â ÿT‰”UÙ’‚ÃÖ°KÖ ²22Ú÷ôT4'—ŠsñÄKŽ l8$[‰Z5•5'^Qt—‚Ò°Ubæâ‘TžÛ_¢dfÒ5^oði{òobùò%øüóÏðý÷+J»*ÌeŽÏçý÷Þ…§Ÿ~:t*íêFŒx+VÂ�!Ï_Ðñ^¯k×®†ËUUUq÷Ý÷–p ¯|L& ññ^8•aJ�ížÃx>cL0რ ©£ÞÍZˆŸÜ;ÉýË›qFÎ/±…ñ.”DS¬ ¤Û$‹°øâõŽ«ñ‡ç€f›Í´ø$S¬`M£ßRLñ‚h[ÇZQ#ZI�PÝR®X1½…£.¶z´3µŒÀÉ$�(I•UÝR'Ú)ñTûè¡ÄÁj–²†¬c¨ò©ûTÞœT¬ðA‰nÔ5¥†¥ŽGë�lˆ•lÈŽ¸Ÿ”èì�¬Â‚‰T?0BŒdƒE2»€Þ… Ç&˜`‘Lš{@Ý;êm[J¯`NBFÄý¤êoTD­i-oÈŸ ÈTµ”l¨Œ:Æ6‰:ÞE#Ù4Y¯å͉†…M6Å �"}YTy”`ÝÊq6{j¶]¨°ÝÔ^ ;¼G‹¬`ìž”1Åkž%¨j)+ØQ×­ïSרªà¨?CÓ�© "ÕÖF Ž3Ú®F’TyFû�.‡@E]k%Ò­½BAµ™þYM1Å£@ñhÞÃÔ;†êTl`«Ž½¾šmF‚IF﯑÷B%sÊû²}ôD¾>®ø0Ù£'è1 �‹Õ!Ê—O¸ðs_ð‘ Ã0€ÍfÀ�`Ö¬©JßKðï¿÷cûöm{$†a˜+�Í…AñF�‚ç2¦AUÕ"³1ãM1‚­A¬$.°MY¹XQü"ãÔ´o±ÈWY³ø‡ë5q}j¿úví"îq&1‘!Æ$Ú-$™ÅkŠ7Åhþm�“UØO�C÷I6‹ë¶èí.âM˜u‹ÄSõOÐÕ+xNñšâ%í±åˆö¢Ž£ ,*ôío—¬°ëî§¾@ð:õP×d¤OQÇÆ™ìšÅ× ‰hÿJq]ªo”7' Ûô÷˜zv¨~PÅRFØF¡oo»dŸM“ølRç¤Ú–‚º/Iºg=F²Ã®;õìP÷.†K¨¶¥êKm£î©ž8ƒmTF×—+˜“„ö6Ú—Ë™Eeý˜™H\�¾] ™kõõ— ¡¦µ¼n±7µ×¶é�5…mTýõã% Ž9Á ¢¶]+�Ï—X}]Ëí ˆïª®•‰gŸ·MÅ÷1€~•¤åuŸ¨w³¨w®âLvHºw¸ÑñFÿ³KVá]J]Ù®ÄxC½Û¨û®G?¾ô=O4(‹¨—QŒÔ•²]ëß}Ûâ¡¤Ž¨o«FÅ0Ìå î Ãüãôèñ_TªTÓ§Yªõðù|xûí×ðÜsÃQ±b¥R­Ë¿�àBÃ~^0•aJ½¼ý³{²Ú,ËH‚žö(êC�úH¥Ä/Q€´ ÕU-e…ã¨�ì²&q›^Ä6Ã$l£>â)‘€Gt"�U2¨mDùFÚŒ4b ”X§/?Ù'ÜsJ`¦ÚŸºn½ÈorA•³è¡M�“º¦&ŽZÄ9E‘MÜ%»Pªý©ë4*z&™Ä{W\½à:‡¸¦…¾|»dúFÕ·‰¶¥„y }}%HBŠ1Ù„zP>éÔx@õå äýEl*𤿧µm GÝ}_Ž5Ù…ò© )Á]߯$H¸”dŽú¨‘gûF¼É!<ŸT`°,Q#‚;%@ÒAª-´çtHVá½D ç͈çDßÖvÉ*Œï&˜„ºQ�êÙ7è¡Ð�vÉjø¹3‚þÚ%H˜ctŒ2Ä»T�ÌIBÐÌ!‰Ï~16RÏ„ ¸›,Â{˜j/£÷Il¼ä€E*>`K©à».ØVÕRVx~�öºÚcM�„ÀH"H”`ŠÁCÉÑ'©­¬gÆ8¥©Cð“Ë”·ß~ÛÉ0çÅ»ïŽÁ#�<^ªu°Ùl˜9ókÜzk—R­Çÿª x½°ÞÎ0%‡[7½ÿí3óqÄŸ¨dNÄôXÉ“TüG$•aV†V¯±i³Òm’E[SA‰ÊV‹�ö8$ác9Îä€M'Ä$-¸Ÿ•g“D‘€BŸå,_l3ý9í„EgzYû²êãL¡þTæzEs²°�õYÁq’ú€ u© ÕϪÁJp׋1dàÈXŸ%ûÑßõB�C² Œ‘Œ_ h—¢§¼N¥w£îÔ~]ãš Ûô÷ –µbuý#F² }ôZ{U¡,ªmkÛ* Û(˜j7}Ÿ‰•ì°ê5JH4ÑßÏ“]쨾G úú{\ÓZ^x΂A mK�í£ß'Q™ÇÄ,âh’)VÈ–·Ia±hêºõ÷Í&Y„Ì`*`SÞ"f¸W"Æ ý}³KVá}g² ×NEÄþI�Ô±z¨wÑ5¶*Âx@¨…r©ñQx×IváX#}’‰ñLŸñŸ`Š�U×m’Exö©v¤ž/*X¢¿OÔ»ˆ/©{¢vÌ1B?£ ÚšzNôýÝ!Y…þBÕËÈ 3LÂû5V² Ï5+ãmqd†¹T”¦Á‚;Ã0 ó�`6ó+‡aJ—".pòÓ-cN ²©‰ 6b*5õAZÛªÓì’Uø°t‰´() Ií9m’Uø˜�#D2ÊÆ‚ÊÖ<;$› hX%³plÇØ&BY”8MÚØçEUêƒ�j3êšôbK%€é+,BÝbÎzák¶íCefSí­5,0£ºµœf›]² 66tÛj¯)É+<;eLñ¨¨³Ù°bÙ· F/šG«›~[‚)�Äv4’åZÛ*f›W·”¶Q"$%²égÁû¤Ë´·Ä ÷=ް�Ñ_§‰È@§úY/6 ¦¡¬kìU e¸_kƒut�‹8bf Õ�IÁ]×>1„xo‘D+-*è§ß/™÷Ä;†ìº@ŒfAT¥Þ'Õ-å �qÔÌ#Bq輑Ø$‹0þR³}jè@p�=T€L/øÿ-7-º€3ea¥Ÿ!ܦ{E Të¯I?vôûCŸìQÞßzŒf¸ëûF¼ä”ijJµ5õÞ¡w}@"xϵ3Ô$ÆAýß7Ôó[ÅZF (œ-Æ0Ì…QZ:« Ã0Ì%Çd’g‡ÉT|F Ã0Æp+Þ¨¿íK´ÄÛ(q—njèHJp°‰”/2å­]Æ®÷ ·¼q’CØc…3JŒÒìSö.É,L³/oID*SU/Úš ô„àN|PSÙ´ÿ°ö>ÅJvaÚ9%(ÑþƺLRÉA{§ëE BÜ¡„bÊ…šÚ¯oë Í�Np7‰YØT& e×QÁ’,lÓ—_Þ’(l£2Ð�ÌšH4Å ÛÊY["‡É&ú¤?9a%¢•¬ÄZ$a?J`£SêÚ)qÑèXBÚéú‡�¨[{¼ØO XÊP3?‚A q–„þù§fÐèg~Ø$‹pï’M±B¥Æ ꨡ \Pc95nPý]œ"Ž—VI»©{©ßgrAËbU’9VÓL0 66q&Ñ&ŠzŸT´$ � jŒ#}º K%ý3a† ìÕ…zÐï˜âÇjÖ‡‘ ÷“ØŽÍɰèÆwꜴp[ü³o#®Ix ÖU hQ[³NP¦®›ºOú¶0Á$®·`rÏD›8“ˆàn“,Bÿ�39`ÓÕŸ²2£Þ¥”›~ü ÞKmùT Àè, ÃMiê,¸3 Ã0 Ã\�ø‹X 5ÎäD 2Ã�+ô$¤è²…ã$±|»d„OªüòæDa:µ>ÓÞ.Y…l²8“h3A]%øê?¼ã$» hXa¶ÅJ¢×3%~ë?Œm’Uøˆ·KbùTY´ /fê÷£³“�-(¨Ï’Ž79„¬`Jä ‹¥„b#‡C² ×­Â~ú¾§|Ì0¡®M\›¥!ëÅËS qïD; :;Vß,BŸ�“‚-QEs² æPmFeISÙ¥úúÇbQÐBB#ô}”Ü©üè¬hc‚ �ánÛ;Á#\¿K™8ÉN<+âó_ôYÖ¢à¥ïóÔÌ1#‚z®õÏ¿ƒ´Q¡Æòâ3Ü­0ÃnÒ]71^ZaÚÕH†{±4JÐ-8+ÙÈŒqý5ÆšlÄýŸª�]k'ú§Þþ†˜åTÉ’"d(Û‰çÄ&Y‰þCØðg1@& ¾”µSEKR±ÖBI¦XT³j­ºÌ0ÁÂ>†Cõ×D¯}¢ŸÙ&¶cÐI 5žQ3¤ôå[%3ŒþTðж7sûPuþÄ /ª|!Ã]²ë'gëé‚{T?fK†¹òaÁ�a†aæ DQ•¨¿Å™ì8#çk¶Q‚¬‘¬Ô˜h‰^„0Y‰ìCz¤he!2rí’UsâLá#•ÊØ¤Ó¸ê3þ‚ç´ˆÂ�I\œ�Z4U¬¿(¢Pb)µ�á+é2³ƒÙvÚºÚ$ á3N-'Šäz>Îä ²PÅ{orYÁÅgpbv&•Ao“¬‚ÀF‰†Tæ³¾Í0ájݺÁcÅŒY½HN‰Î”@¢ï”gàÊ–ÒnHßi;�àn² eD-pIÍ® ìn(ÑÜHV4!xPî¢ ovíK‰œb¿rÏ,Õ‡¨þM-\©¿ïäÌR„ד`žá`ÐIw�„}½«vܦ®‡zX%s±ã¶�°Ø ²Ò)«žxSŒ¦ïŘlÂ3KXÝÄãAœIœå¤[Ì0‘3+ŒÌعÆV…ží/OŒ.4K϶ÒB¿«Åû©RÌñb°Íd‡™|ö©Àš–X“M ŽÙøzb‰¾A îúà•MxÇSïµ8b� È#w]à…j×X"HGÍ 0b“C>‡’MxÇP³ØR†a®|Xpg†a†¹‘Q„àNdÖQÙ«ú ¼8É!øÂÆ›„倘íl—ˆLI»;ÎäЈ$´�ý‘­ÿHuÖô4omÖ% U´$"¿]”õb‹fAµ•�ü`/Þr'Á#|Ø—³$ u¥|Æ£<ôõ×{*ÇëîQh›¾þ ¦! AeýU#ü½õÕ§( JŒ-`ĬTŠÐ�M0‰a]d7‰åéëo�hIDÙQÄÏS={U¡ü Ñv€²rÑÏN -è`%˜RBe=£ÇHV4ô/ŽÄ )nQëMÏD_ÓÏСÚ;–°%¢2Xõ�*XB$(‘VµO ™ÕM ÏzŒ°¨w@Pp/ZĦn¥2Ü©þ¯³ž‰‘ìb„¨+•y'Ù‰l|jqjí‘èE¸õãe³¸N€�þPÏTŒ#Æ_!xå>QAEj¿Hl„õޤêOµ›ƒ†›"â]k²“3ìô胺T`°‚9I¨?õ¬Ö´‰c£‘0WÙ*“³]„çÕ$ÎºÓ ú±’]œMG¦L6áÙ‰%‚לáÎ0W>,¸3 Ã0ÿji, Î0ÿbEd¸SÿT¶”^+kN ³¼õ‚ íçohº¼ÉKÄ9¢e–ŠÓÔÅÌãXÂëVŸÁ�lŠM$DÛÊ–ÑÆ†_m‚_-á7mŽ<`ƒðE gÉ*d'™b…ºV·”#Q/Þæ#žXô‘Z –²}ˆ'w½ d‚$ØØ$‹h�AØU2§²[ ,}ôת‹ö81«3î3Üm’&!"fÂÅm*gNêQÉœ¬9g´ ýXÂ"AÈ’Ž’+ˆbÄŒ»Iôv¦¬C¨1‡ ø\e­¬-‹�)1Z/Ü¢à-Ø Î’E0J¼×—OiñRáStb.%䯶JqD ŠÜctY¹ôb«â;ÀBØ6 †ÅK„‡;1®ê³×c‰ wꙦ²¤éà/ñ÷Öˆí ¨K2ÅûÑýS5þêÂTv?i•F¼ëô÷Ó.‰³[(Aœš!QÁ,ZÖèûcŒd#.· ‹/Ó*Ã]‹¶æˆ‘Å’kÙEÁ�²—+¯[°º±À|0ÐNÙŠDˆ39Èmd ƒ×Å5jÄú3 sa”–Á‚;S* ú&OžxAÇvèЛ7ÿ^Â5º0>ˆÞ½{¢S§6¥]†¹¬Qùù( ‹î SR™áN-¸eº$A¿T±,ZÒ‰ÀÖr‚pCgýÙ5 ªÅJvx=¡|½xI‰Àå ‘@/]c«b(“7ÑKÄsê u˜¬‚àPÝRNøxN1Ç+ò%˜bÑŸšòÌĤÄÝóÏp§Ê�'¬t(k‹"+¯²0C"FÈ@O2Å‘™¼TÀ€Êp„DÂÒGßAĬc*[^/¶T0' Ï…¾m)�Ðn"2Ü%Q4´@ô)N4ÇjŽM6Ç‘³ôþç1&Q¸¡ÄEúÚiKÊ×=L†²Þ’�´¤ -Y´˜½fMV(%$&˜bÈk3ªÅ¬_J Ö îµ­é`Œ¾}L¢8WÝZN³-Ú *`PܸZ09²|*€@.š ‹ð|êß±DÛÔµUÆhÑÏbL6øÕsã{ ‘¥î ž“XIÌ’¦f+èûSð~hë@Ú†DY¨Ul «ܤž�hÁeýq”/=µ˜¶¾1„ˆMY±éŸýò–Dá8*HDÚZ™´îT;R}в¢Äoj!^}YA›èö#‚1~±ýõÏoŒdC5‹6øk‘Ì„à.&ØIß~1›] $ma²� dj·YuQÏ0Ã0çOiêbÚÃèØ¿fΜŠ�;·£°°eË–Ã-·t@¿~!!Aô’¤ÈËËÅÏ?¯ÅwôŒ;þ‚ë³fÍÆ >öBøî»EøàƒQxòɧѧOÍoß¿ññ ˜5ëÀÏ?¯AݺW£ZµêTQçÍ;.+–ÃbÕY³¾AÕªÕ�••‰I“&`óæMÈÍuÂnwàúëoÄO<�J•‚ †Ý}÷ÈÌÌ€Ù|‘§¤”Aóæ-ѧOÔ®]'\¦~?«ÕŠºu¯ÆÀ�O Y³%rM Ã0LÉ ŸÍp·ÀŒ8“¹Š;ü�Yü¢šVâã3^=�ãMä)…šm)æ8äÊ®"Ë JD°€Ê¥2c?Ù Hp$!ì²%E´> ,%âMä(šmÕ­å�M/(—3' ÿe /ÝÖòÅfER~¾Ñ½¥E±¨¸ wÊ#—š­/‰~ùF„y+,¤¡�jXË‘Þé”0A-šª¿ö º¬EJ l+oÅ(›É*ÜóJD–¥ÞÂ#–ðÕ§ÄX*€e%<½ØBy,¢H_#!Û–Ê™XÛ'­°� ë¯ÓÑ<ál Í3g}¦²›ËšàR<ºsh3ªI�o‰¶º"‘%�­mÛJ–da Š5ÙàTDAS_V²)p -uMÍpDY(TœY"ŽàWeÍq” ¯v‚ ‹ ñ|Úã*ZRèuBˆ¬ýȾ©ÅPc$›0c«¦µ<þôÑl‹#pú¶ ²Ôã‰@LqM”•Q=[UlñÔl‹%Æi#kPÏ\Ð~ÅîG='úlm»dp´ÅZà‹ƒ%º¬kj¶…ƒ¨WMkl*< ÙVÁ¢­« ’¬¥Äé –$¤²5Û¨û©·§Äç·ž­ª t[aê+Ù‰…ÜÅ™ú B¼ÉA®'"¶«]°ósèÚºŠ¥Œp�†¹òà w¦H6oþƒ Dƒ 1gÎB¬^½ï¿ÿ1Ž9Œ'žxn·«øBlݺK–,¾´•½D,]º;Þ†åË—¿¹Ý.T©R%,ˆùåç8yòD‰ž¿}ûŽX³f£ð_ÕªÕ ª*ž{n0�&Ož�Ÿ~ú3fÌE àǰaƒ¡(çþx:ôy¬Y³+Wþ‚?‡¤¤d<òH?lݺYs¾Ð~kÖlÄwß­ÀÍ7߂矩©'Kôº˜ÿ-L& ˜LüÇ#Ô¡ w³dB¢n‘8jʵ^ 2Ã$ˆ>¤ðgÐÃ=F² ³T65xUx›ÃdElŒø‘ª_èÍ.Y…¬ëD�Ý %¤Q‹OÆH¢0DYV¤˜ãñÉ¢3«èDÿPýõ"sYs‚FX±@º¢-L*Î:Å4JäÓ^(a4še…þ:©ýâM1qšô›&¬'Ê™�ezJ´ý„þëƒ T[bÎ{¥(‹•R³ÄÙ:+“Mè³ÑçÔ_»� téî1D ú6™m0÷’%… HšzP–bŒ3Q¢v°Í"û %rEB]Ý’4}’ f$×i—¬¢-a¯E Ô„e�>mQDÁ^—UOeÇý�šY">×ÁG2Im"9�˜�B#¨¾§¼±/Ñ[ß„�Ó•_ÕZ– Bé�MÑYpE 8V9Q ,è3Ü+[RÄ5Xˆ¿ybMv¡ÝìºþN¾¿%ÊRF|’U ƘlP"‚N”Ã0Fiê,¸3QQ|ð.zö¼}û@bb$IB­Zµ1jÔx<…˜9s`ùò%¸ï¾Xºt1zôèŠN�Úàý÷ßA Àš5«ñúë#±oßtèЩ©'1hУ˜8q`Ê”/0|øPL™òºti�»îêŒ_~Y‡åË— gÏnèÒ¥=f̘®W›6-ñû~ :´ÖüצMKL�: àõzðÑG£Ñ³g7têÔƒ?†#GkÊùúëÙ¸ë®Î˜5k:Ù‡ÄáÇ0dÈ0ddd`÷î�áßÞzëUüøã2¬]û:th�è�#GãşŨQoøÏ<óºt¹Ý»wÂÇ�A ·Y¿~÷bܸ±èÔ© ²²2ÏûegŸÁ¡Cq÷Ý÷¡\¹ò�$ *TÄóÏ�Ä< ¿ß/c±XP«Vm 4wßÝ ï½÷6dY&Jz÷î‹råÊcÓ¦ßλ~  gj0LÉÊp7Ã$,H J�`íã–ʦÕ#¶ XT´p(k׫œ³°IVÂ>ÆAf ëÅ®“ nÕþw5B¤¡Ê§„!ÊÆЊƒÔÇŠ9žR@ Rx•sïåjÖ²¢à ‰‹Á‘b¦$.X¨_pÎA´%˜PâQa)C/šªÝ�Ú‡ö~ƒ8¤pIdÃ:K/lÙˆY„ò“̱B0ƒòטÌ0 ÏXPÀ6&~ëý ­�¶|½ EÙä�"Yÿdª_é÷»ÊV ŠÎçT_ì„÷»Ñ™!Q2r;%Ø¥˜ãÅúšµc%ŽR™¯”àN‰­q„…‰^<£,;¨ç“²ÒrHVøÐí#ÞOÑ_¼Ÿúu(«!ÒÊ‚|)+0# ˜Ú$ 9s(òš’•X’Èp'fÑ g‹ë+PÖZd†»�>Kê¨ò¨¶pÄŒÑ׃'DÀ†è‘ÛÍâÚvÉ‚$“è‹N­1bÈ7^²ÁaÌÊ.þ8ÊÖGßg)y*�o�²ö‰~¿D‹8ÀZŒY˜ÍA;cMvaÝ}À“òÔ�79„÷B´™[âì3«Æ&Pÿžcæâ(-‚w&*ÿ½ii©¸çž^ÂoV«=züëÖýÞ–™™‰½{÷`Þ¼oñå—³ð믿`Ñ¢ùèСú÷õë7 gfëÙµk'Ê–-‹%KV¢uë¶øðÃw±oß^Ì�»Ï<ó¦N�„œít²J•*k2¾ßyçÄÅÅáÖ[»&N‡þ¤IÓ±lÙjÔ¯ß#G>¯Y0aýúŸ1mÚôíûÙK–,F›6m‘’R·ÜÒK—~þí•WÞDçη‡3Ðg̘ xï½�ðÒK¯Áãñ`ذÁhÙòz,Y² “&ÍÀöí[0gÎÌpYYY°ÛíøñÇu(WN\ì¥8’’’‘””„Ù³g +++¼=99·ÞÚv{ÑÞo÷Ý×§N¥â¯¿ö¹Ÿ,+0™x¸`†¹œÐf¸k?6õ‹PƬµ�£1“$æÓâh „o“è?¬‚*��Þ™áNez}ÞEÁ]Ÿm®ÄjY+�þÞú,`Jø 2Ühe‹d"V¥Å*û-?Â&ƒ²˜¡¬b(aŽÊN®¡óˆ&­hˆ™Ñ‚'úéþzáÜ lº ëóY¬W²³¨lØ2ºÅ')AÃAdòRÁ’h¹b "F8'å9mĢ `Yuâb(iB='b[+±È É�BÅ'ÖMÅ[%½_55¶Ð}M¼öP.2H–@Š¡tF~ š„òѦ‚;vÂ7›ùõÂ6µæ�áNˆÝºçÓ ³(Ô›ÄàZ ± ¨^„¬dN!m¡Ä:P3F´Á’XÉŽòæDÍ5IgÿO8ŽxNŠ{ž(_ÿááNжQî/ñÎÒG„¨ãâLÈЗ¨Åzm’¹ŠvF75B\.P=»”§£yùëÑÛõP³’ ‰fÑ�nG±|j,Œ|WÇïRp'Ö0Ð÷Qý¸®—’8nSï"JÀ§ê¥·„²Jf¡«XÊîúg:8Š×HYÊPm¦W¦˜ã5¶JT`æÊƒ=ÜK‘õ'=øj_Üþμ?Ö*¡_ƒx´©Zü4¥ÔÔ“p8(_¾ù{�µpêTZXÀöù¼8ðI8ÔªU�:uÆÆ�ëqï½½‹=WPÀ¿pÓMÿ‡%K¾Eß¾Àn·£M›v�å×‘ššŠ””2äñYY™xç�×1lØT¯^Š¢`ùò¥xóÍwÃBöÀ�ObÁ‚o°wï4lØо}'”)S–,ÓçóaåÊðòËoºté†_|Ï<3 11b]ÏÆ� ª@¿~ªT©ŠÞ½ûaÖ¬ièßÿ!€ËU€ûïïOz´Áb±àÍ7ßèQo gÏÛQ»v]4kÖ7ß| Z´hUìñeÊ”E||N�JCƒ�„ßÝn7/^§37ÝôTG†aæÒ™áNù=ë©hÑ.0J‰Åe¡ºâ¸tîzÑ¼Ž­"�àN,:ª÷k]S¤ph›øoQ$£>xsáÖl£Î j„(C-ngrÀ¥xuÛì�u™Âñ&äHÁ�€£eˆë±V"åu^òÑTpCÈ´5‰ö=zá&dc!øFKbûë¡Ö ÖpHVÁ¦HoW`Tì ŠŠ¢À©ßf—,‚h¢Ï줞� –$"ˆà@> …mª¤íÁàFä5Ÿg_Dv)åá™}¢¶µ"ô_q’ùº¶¥DçhDîEfSSë øÔ´V ƒ|b¦«Ys½ÔªÔq6"+]/3±µ³ ’Mq„xo¥µbfPÙªÔB¶1Q2Ü•ˆ;j“,ä¤ÇaÛ'Ù¯™ÁPÍZ&ɤɬ¥f9Q}ÅNe¸ë2è)Á=–²‰"Ê·X¤m¢¨bp1]-q&;|²v&°~¼Îãþ,Í6ªÔsA¶#Q¾#Âv4?x½P-ØY¾…ÙÏÎN�#D`‹dýæM6¨áX}ý©÷¹j,׸q|§„z€Ü }`*™“qL—á^ÕRFó†Ödˆ$Þälú¨1/ÆdÆ›dÑ<‡Tû0 såÁ‚{)²ð€ 'òi+�KŰào—!ÁÚʨªJ¾ÄT݇dBB"RRRÂÿ®X±26múÝÐy*T8'êÛlÁPHèýÛçóŠž­ão¼Œ›onÎnÏÉɆÛíˆÏiê.Ë222ÒÂ{¥J•£Öé—_ÖÂd2áúëo4kÖñññX³fºu»³ØkJM=‰œœltèÐ:¼MUUX­ç^° ˆ‹‹§³víOX¿¾µf›ÙlƪUë-Z´Â7ß|‡Ý»waÛ¶ÍØºu3-š�n¸ £G�-63]–eÍ>cÇ~€O?ý`³ÙqÍ5õðñÇP±b¥b¯™a†ùçˆÌp× }z‘fÑF Ý”à£@%ÅKCîDv¦ž�£Íp§=¡õè”pKeÁ‹‚ ek@-z'úÆ@ BP¶�Ùv1šŒÝPý=Њ9vɪù`× @t?uý’vÉ"Üs³dÖbI¡Å˜OùåÇKzÁ=(0y"ýø£dÂê¡Ä©$s) ëûT²)N#LÐÞò¢-#72`…>ÁJDX›@´.©k­$,¿GùhÇ›ìð©Ú¾a•Ì!+´ ž¢`Œø°Û%«F¨h‹  æ$áØhø"¬P(q7N¢lƒD‘“ ég,b_‚ÓÁ#-™¨läÒRÆEà=Gh\*ˆxΪXEŸë`0¦x˳dÄQ=Ѭ&(wÄý´Jô"�z‚‹Ûê3wS4e…žMí'ö :]ôpwè²Ë©Ù-±&;añ%¶!)DíHú« þä@;›Cïù¬‡5xÕµ¬Ç¢…eéC½³’L±¤Ÿz¤øm–†Yo»FdÂëŒ Ý'Ñg#ßY&˜„s&™â„Ås­º M° ÄʺÅs-3УïHh…%ù›#ê …:§~v¼oú¾f–Ìšë¬b“ãL´‡;õÞ¡f E^;ÕŸ†¹ò`Á½¹ûš8ÌÚûÏg¸ß}�¸x E�5áóù�––JÚÀ?~ Õ«× ÿA (úà�*DÁ£!/£&Ó§‰Ü\'ÆŒù$¼Ín¾x'NœŠk¯­õX³YŒj‡X²ä;äçç¡k×öám>ŸË–}oHp·Ûí¨]»fÎüºˆóÿ¶oßo¼ñn‘û˜Íf4mzš6½>8;wþ‰'Ÿ|›6mÄM7µ‰zÜÉ“'PXèFÍšµÂÛ†}><Û€aJ EQáry¡(ÿÜxÇ0ÿvä³"‰ùìgp$ÔǸ#2±©ÌL*‘S¬½@ggê ‰(‘‚© ø¼Z�0š`ª¹»bù¤ a`ÑÔ8Âs€fš75½½œ9Yr®¶,“Cïôç£Äûh‚x¡NЧÄc(TÏÙ†PA‘h~íT›ém+¢ÙEŠÇ´%ƒø·NHèûOü ø¶`’×Ùk#ÕF³Õ§$IúöÎ;>Š¢ÿãŸ-Wsi@½£€ ŠPQQDT|ô±T,Xöòèc×Ç¢b/"ÒE¥*¨ ¢ô!„�^.¹¾ûûcsewgï.—Ã#É÷ýz¡—ÙÝÙÙÙ™ïî~æ;ß�[Ò±6^?`hÒÜ#ûOG±C°cįg ê»b´H«ö¸ ÞÆße�WV‡ÒaÏRÑ–U_?-…tÕàIð\>Í "Kìõh‰´á¤¥#²˜¡Qƒ¬¾É ÅZc#q�•fç-º§ kË̘ñ’ÆYt³²X°b¢³òg-0Ê ë£ZlÜ æº–Ý0s¢n½-ÁÅW#ý¹]_Ö=¾Ãª4ŽSïÇŠÑÏêfˆpCúÊĈ±®�žÆYPSã�;"l–Ñ"ÓZX1Üe6ž¹Î.�vœªÛÞRHgÚv½ànÕµ• ÞÎ|—‰œÇšmGDb¤R‡ Á=…œÑÞ·§y*èÑãtìØ 3g~…»ï¾OµÍï÷cÞ¼oqþù†ÒjjjPQQ�¬¬,@aá!äääÑ2þùçøê«Ï1mÚG!‘233±{÷N•à~èPÚ¶m3ß‚‚ƒX¿~-^xá5têÔYuü=÷ÜŽ¼¼ýªtíÛw@AÁAÔÖÖÂnW^Z*++`2™`·Ç7è‹¿þú¿ÿþ+nºé6Uz¿~ý‘––—Ëmp¤ÂôéÓн{tëÖ#)å!ˆhRì�‚ˆ›HwÖtühÇÊ£V¬“d}?Mczé²½3c x,og3g‚ö´L¯0Þ ¿np_“?#v,ká¾ ÞÎôØdy•ùUÁ‚Nôéan‹mÞƒª4oÕ TZXBsÑTÞŠ’@U\eU¨0Ê4Y£-++޹S<ÒÓVùŒðè<ÜÕ°îypÚýÕ™CÑBHÇq–ŽÈìqÅ´ Z|’)¼2⩳چ�·èÂ!´[ÀÌëÏ©¬Ò_§¨¯o†ggCÀ«ÂÅ×^çIÖîØï/V¥)1¡Õ‚>˳<ÑÄØ!eØ!‚´×Þ²n‰Ë2ÁÊ›ÐÃÔ9¢ÞÓ^[—΄@@Ò­ýOÜïvb æ �VÔÒ͜˜= …e«0ýHX6´�˜­³/VÎÌèw,�e5&NT‰¥Áý´ƒT¡ºX!e¬œY7k‚~EÔ„ýa{¸Ä'gxG¦ �±Â¥Ê̇í,$Vc Þ p°¼Áµè×ч°b=¿[‹™êÎ 'ªýX"¶Qh!fûd”¿,bý†vuë­D °ÊÚRÔ ÏJþa´ï€¢E Ïqàeõ~¬™`'¨zí¼¥Î>DÌÞàYáåX3ÿØ‚{:oÃr®ÂvïA\èЇie º¦qV��`Ù‡ Á®óäÔ³ ´3’‚h©Ò!hèŒ0„ã8Üwߨ;÷[L™ò&*** Ë2öï߇»ïž‡Ã�+¯¼:´¿ÙlƇNƒÇãÆÞ½{ðã�K0xð™oïÒÒTUUÂëõ�²^TTTàé§ÃÝw߇.]ºê¶_|ñX|üñØ¿ü~?fÌø7Ýt Üîè"4,X0ݺõÀ Ag C‡Ž¡§œrzõêƒ æ2�3›-ÈÏÏCM�§�6YYÙxûí×QSãDii {ì!¼óΛ ¾ö ééøê«ÏðÞ{SPV¦x…•——cÚ´wÀqN/¦78ÃC—#€F¬S®Ï£‹3[¤ Š(‚Wfž‰ã­]°=BY"‰6¶9ËÓ�%Ƴd;S6³Ì‘‚+䉙1“‚%¶˜9“Næ8NçA¯…‰c,rlaÆøV{ó¶2¨à´‹ ‘-è�F =Ü5¥ëaVB9Úy .Ï8'Ùº+×£ÍXx,QsßõB(kʶb6³ Eöu–`ªÔ‡Þ+Z‹²øfd=*ý"²¬Æ!eÔ䙺ý´‹çÖËÃ]³ŸÈ ªrûa FØ,öbŸúüõL�x=ÜY¡€µ`ͪ{€Ã�!„²ÂY8“ÎÞ³„‚n?�TƒÓñ–�õ¬P¸©ÑŠ­¹bVh_U^šëÔ.ô ¾GÉZc •´‘!eôwÉÁˆQ®93Lo“:™rtÇðà™3ÁXÏeíà²b"g[éû ë½ÈÌ$r¢µ®È8“i�YÏM#^;x æl=òp'ˆä‘J‚z2•“N:ï¼óöíÛƒ .Åðágà�îFß¾Çã­·¦Áj�ô*OG·n=pùåcpÓM×àÌ3ÏÂ%—\ 2d(dYÆØ±£°}ûÖ¤”mÍšŸQ\\„—_~gŸ=(ôïž{n\{í�8í´A˜8ñ\pÁp¬\¹/¿ü?U™YH’„E‹æcÔ¨‹˜ÛG�º‹/@  .¹d,Þyçxæ™Ç!Š"žþìß¿_<×]w:tèˆ;Áפ[·îxã�©Ø¹s®½vÎ>{þõ¯qØ·o/Þ~û}Õ"³¯½öÎ>{† ˆÿû cÚ´�™‹¥D²á8‹~*6A‰£Šá®y¥‹Ç;Š%TæŠYL�A-¬�T'ª<�Y?þǧ‡âdï³I»Ð˜E÷Áé`ˆðúüõ"��‘W6ï`~dK2Kp�\4N/F±êZŠ£ ˜&Fø¦:§æŒT|ªXÛz±—%ò±}­hÛ‚WÖ›‰þ‚b]¤Â{Yêñz«Z bݲâPG§/tœ¬ÏŸ7ëî¹™3!‹O ]ói'P_§Q�Å#üì…µÇ鮉ᵯøfêÅjÖšˆ¸ÎàVÃÛ9’cÍíuiAÑ8`ÖRH-€ÚVÌVõ‰x’6šÕ£…ã8õà@]NµöÄi'!ß_‚ZŽÑ'’_,A4 Hp'‚ ‚h„D†”‰üxά[ì,’¶uñX#áÁé>.Û™Z Ü£Üë>"_ϽßUÿ† ŠÇ/Kpïcéˆeœ…=¾Ã¸3ûÝö Hkç-¸&sX¸,Œ�8Ú41DFxe!<ýÇ++ƺv±Imš`ï••¦]tT +vlÃ3›µigQ‰|,F£Åhµí š Ÿµ3úYÃÞw*±Žq},¯ãÖ ÑÍ(Ö?K(€ó'â<lj¡ôH�D3+¦5ܯ‹ñ`$¸@S+t0µbncyJ²êÑj°®AoÅ#-Ça­{®ÊÂÜ®…Ž‚%¸›¡Ÿ9a5¸NY.‚uMZXû±êƒÕÖX}Ú­7;«lÚüÌœI'bÅÆW[_‡Ÿ][qq݈n† ¯*+c@2x�™‚£êÄp v=y¾jÍ‚Âçq–N8ÎÒ)”.iâhëóWÚK+1÷·¼$”ÎZY³xŽÇÕ™CÃÇ1úa¬EšY66³?’à½|¬ÕxÌ®þCí}Ás¼z!íºrÕª„J¥n²Þk;%�jô·tQ°C}à¡u“κ4@F!¼_ÐÛ<òÚí Á:WÌÔÕ®˜¥ ¹‡2«‰X[‚µn‚ÒVôö@‹Ñl¨Èm–½ ú ¯ògÍðbõ%ÖÀN$Á¾kæL8×q‚á5´ÌòGÞ÷`¿87f�0Ì+¸ß­.ÇÇ•Ë0ÌÞVÞÌœ¹ £Pf€bk¾©^²êÁ¥­p‡{[^l˜¿@1Ü ¢I@‚;AAD## "BÊÄþ0cÆÇåôœ¬}ƒÐ}-�Ð7BrF|°GŠü×f�mX£iÒ¬xê.I/ˆ·Ã1ŽYƒ,¯}gfz®GzË?œû+BiAaèdkwló*ž¢§X{@ˆSp�5u•µ�œ•3ë$–HÉq\ÌEYYåby¸³Âô•=–0Á!:Ô-Ž×ZÈ yGFÞGuYê?Ý×Ä ÌAV›b-Ä[ÿ`u¡…aP´ui‚`802,­†¥õcnc ا0`Åp êÂd0ϪÇÈn0˦ÁÎX06^wªxÌÏ]mþ¬ðEAŽ·v ­ÄôyV{1˜íÙ†XWȲU,¯_£~'Ç8«üFe‘b °ÊaåLÌ~⊯]dÜ� ˜ÞÕœ‹É-G‡Ò#EÉ ÀìŽðp�Œ39ÆÉú>­m£±óŽ$Ã"sŠaÙP}@"Å«>ß_W9"kÖ€ k„5èaæDæ@räs&—1(j7oÄ‚·?Öl¨xm�`Ã=£~¯[L»®ûX:â…ÖׄÒc ˜±ÏÉ¢ÛÖàI�S­=ñ»{'%$A�š«B$… .¸sç~Ÿêbq”"Ë€ÏçgÆa$¢þò—‡~k§ÆÇë�Í3—@c‹ß,"Cϰb̲`}ÌÊ2˜ë¢8"D† �ÐÑÔ ÿΆ-Ý🜫ôù3â.‹�á�-1D¬`ˆ¸4ýtÀgà,ûqfï‹+3Ï`Š,Ïû¼½Í·d�«Û®„”Ñ”Ÿ1ë€ÛÒÃÃ] ‰¡‹¦òàâº}šXÒp}æðPÚ`[/½Çu�ø\οp’µ;nÊÁx… Ÿ®0Zœ³þ&žáYΊïÏq\L�kv«mzœ‹ã~ËÙ®Xýœu>V½²bò³kVß æªÅ£Ä}>?ú[º„Òz˜ÛƵhª¬�5Ú²²3XÄÄ[3C¡o/ñÀ:ÂP8gÙÛ÷œ•k�QȲB¿ûX:æ3!ãL@'1‡ÊP‹÷ÁûÙwŒ×}ОS_<Ç3{!+-RäçCý„Et‘–5ÀgæÄ˜3MX°w §�G<ß¹7àDKWLnq1NP=ŸXõØšqOŒÖ�a]käzÁ�Õà¬�=‹—X”“9æ7kñ_vþ‘ë[Ä+¸³Ö+a|EøG‹Í~O‹‹pªµ'ƦŸ®Z�� ˆ†‘J‚<Ü ‚ ˆ#Ž,Ëp¹b{cy¾’ÐïN¦V(ˆàY‰�ñŠó,"=üâY¤`{ʲ ŸGï�ÞÁÔ —8NÃz÷U˜„«3‡li†Ï¸"À˜y×gÇòÚM˜ÈŒg¯04­/¶yó!A…X°òf<Öj|h_/caXÖ¢kÇáµÜëQè/g†&ayIó¯[Ä“ÏÌ?VH@/F±ÂذBÏé¼ç—¦D†`G'±rÄLUll ,w1·Vy²�øbyt‰Ó,‘<‘ï/VßQÎÉnßõ…%˜óŒë –&¾ýô¨eâøfi°»xô ^fŒéYˆp¹|¸¯å%xµô;t6µÆ)Öº™+Ê P¼×wšáAϾDZ}ÕX—Èš bbÄ 7"– h´˜t}<»£!x�ÏŒ_\Ûà–½˜Üb´n{°¾þ�9 'X»¡‡©�aYÕas‚Ï“ØB¨Îžqì¾/R"¿v?vûg”ÃhÀ&†‰` ‹Œ¹VÁþuœ¥^ʽ–YVV]°Ú'k&À¾V• \Wg‘3ÈX"³Q_bƶ¡ñ|c½§$ò 0s&HŒð@Ìüã|䈙x®õ¿( AÑH¥A‚;Añ�Àó$‰\Ü "äù‹C¿;™rb î¬�l–0ÄnB-Ň‘ð!ðìô;ZèãÀGƒ%’ÿž�92Ãñ²Y"–™1©…ñ‚쀑Á¶m"'Æg ’,‘F0ˆñÛ¾.T œÈX –cˆÎLzƒvÀ‚¥XxShqG@/:D­tùǽgÖ=À3ÅÖŒ‚XÞ¥,X’6㜉åϵ�„½xÒ˜ý5†dä¹oXõÍ‚•*i;žçÐVÌV ‰Úp"õ™­ Ë3µ>Âm¤ ï=2qB̰S¡ü#~×ÏÃ=:q/b Ž9ègç-˜Öæ6å\ÌA"%Mà °v‹ZVûŒ§çè½¼õ>îFý^û`ÐŽµ¶&X!áŒH$F|N¶0Ä…÷Wä<×ú_˜ÒöVãEH™‚~â"P¬0 Fç<’y›³CoèEòÄüêõíŠ5£Hl�å)o,°Å¾N¥úcâ ue‹3¤ŒÀëú$‘J?›‚Cüö+úùY±À�`Õ­:/}+¼S<°l•a¨’zçÌOßO’5SÃÖš‘v5ÞgÏñúP]`{–³P�“±�)(,lÍ*+¼HLwƒ6•ÈÌ$v?g…|©Ïà˜¾.bÏÊHl„Y¦8ß+â[”8>êŠ ˆæJ£Ü‹‹‹Q\\ŒÑ£GÃl6#;;#FŒÀÖ­[1oÞ%¤L®�Ï^,FìñÊLR ÁÁèœ,’%ÉÅîf‘ÈBiZ‚‹[&/,‰>$N×=Xºì�2<â•âÛK+Ö%OX1‚UgñÄpW3ês°¼Jø †)I$fHOâx6Mtö«ñ”!©"^ÔRªÏ™HOf†ì¨� £¬¬A âì¤!kŒ|mc •qÚãDg‚$:ؾ ê*Ækãâ;g¬úˆ7Ôâ({ðÐhÀœ•tù›5Àg¼H-£¯2Ú§êœqHèËÌŸ¹kÔ2)éj ûIŒþ$rñcgM¨þÉÃ� š�.†{nn.z÷î�3fà®»î‚ÛíÆ’%K0tèPlÞ¼}úôQíß§O,Z´°yóf\pA8(ÏóèÝ»76n܈޽{£ººÇw\h{÷îÝaµZ±yófäææÆU>ŽÓ?@R±.A©ƒ5])3ÌÈF_ö¢ËÚ&Ë2d™�o¬cãÉ7‘cÃ×Ê…Þ±ƒûE1ñ|“[‡Ñò�÷Ø#uo"ëP›o"eŠžï‘©ÃT·ï¦X‡%þjÔÊ@g³>>x0ž©:M^�gĺå9<¯KÓ¢õÒã5û]«È‡- Ö!ϳÅÑúÖ!`2…çbÞ.b_£sFÞ›ç[ÿ Kk6b|æ`z‘ ˜O´òòœ^\y>9 Jý5…ÊÍh‡¬rD毕!L<¯S& ÛwÄuãj ^«¨i?‘ÇjßÚrDÆÜ4¼çŒA QT‹ö�dMÛÇs°r¬Áý‰6µYàyÝvæ` ¯ïë¬>¬%Øï"C³ì+‘Ó—Mäf9tÇF\Wä}eWµÐcÝý�uoD^?€Âj£:ÁÌxžyýL{hÐÿµå�Ä,ˆºµ+´ÇE^kŽcÝ'}ýK’³\¬¼€“ôõ NãÇo`#ÔåbÛ¦�U‰žu÷:ò|× Eäy� b ÖŒ¾©M3ŠG®”!²}êûëœ"/@;þÈóÑm¸’¿þ>‰»} ;ùîÍêçŒAÑÈ{ù.Æz?ˆ¼O¬üYi"¯<×t}™Q¬gºêïû */´çTÖMеCMýÏ©µ /ä^ƒ/*Wb�­l¢BÀ`áWm?Ö8'$ú~HïÉô­¡äÛ4ëðHêÁíZ‘H¾õ¥Ñ î<ÏãÍ7ßĵ×^‹�?þpê©§bòäɘ8q¢NÏÊÊ Åa¯¨¨@ff¦j{ff&ÊËËQQQÈÈÈPmÏÈȨWw³Y„Å¢^xÇçóÃíŽ;‹fÏ¡C¸ì²‹ñùç³Ð¹s—T‡ âÂd ‹Hv»¼æ…´¶Ö¿_2´.—/_LKU• `³™!ê|]./|¾L&V«ÚËÕï ¶Ö Ì|««]�eÀj5AÕ6·Û¯×Q`·«ó $ÔÔxêòµ@ûvìtº!I2¬V&“ò˜á8E42›E¸\>�´4‹ê8Y–Q]­Ë´4‹î�]SãA �HʨªRòeÕam­~&“«U�o°9Ž]‡Á{îC/¼ÞDQ€Í­õù²ê0ˆÇãƒÇã‡(ò°ÛÕu(IœN%ßhuh±ˆ0›Õùz½~¸Ýì:Œ¼7ÑÚ7«}¾\.o(¯–pû6AÔulßì:  ¦&ZûvC–eX­&Uÿ"Ûwýë0xo¢Õa¬öÝP±Õ™ÚÖÍÞFÉ?bÖ=E^—f5›µ¶ ‡ÃŠ4·ºìF6"Rt!”¿ÞF„I³[Àû9Uûæ8ÀäQ矈�”�e‹I]‡•i#ÄÊÈs*yÅk#†;ŽÇp¯²³ÚsÑm„(ðÐÚÏt‡ ¢¤>¿Ãa…©VÝÖ‚B4ËFxý=O³[À»´ç´Ã"©ę̈}G f³Ê_{ot×äáã²Ús:Ö¨6P>¦L¢ú¸Œ4<Ÿ./¿_ÝàyŽ×Ýo‡ÃÕF„Ϋù;#Ý‘0ÇâtÛ1°ZM0›EˆÕuG±Úw$V‹¨»wfƵ;V8¼V}š[o#ûk°m¥êÁí9m“Îý6Ín�îßO{¬EÔ/DêH³Á!Zu6¬iAa=ˆI!ŠJ�¹ÝÊ3�U‡Ž4+àQ8²\‘ï‘X-&X­ê4»ÍŒ4‹þ±lD¤"i C×ý Yfºv^S~ÍqÁ÷prè>˜E}Ûp¤Yá0«ÓœN·nfŒö8�ñ¬�$ Î*õ‡k†Ã“[]?F6"’4›…i#XÏÀÈúêê�ãzFgì°ž÷‘¤§Ù�.ÚTi<ǃÔ7Àá°B¨Ò§‰‘ý5x|äýUúNä`•IdÝsýó)=Í‹¬>™jõ};«Å¬ï›V6uûEžù¡½&]^6ý,9‡Ý¢ô'¨¿5ì¢z_«Õ¤Bõ£@ÑÚ}G𦀍ûÖ0ûôÏ3“Y]?:[cÛYŽxOÖØÌôtó=B(×ßsÖ»Ø1¾¶xPz�HØ6\g#"}FŸ£o úÖs4|khiÌz„Ù,†ê+ÒF$ú­Q�àîõzqë­·â¼óÎ Å_ê©§pß}÷Åu<+nZ}¶Ç.Ÿ>Ÿúe¾)x¸ÿþû¯¸÷Þ;0fÌe˜<ùÁT§A<˜�;¶aذsR]¢ ÙïYâKp¤4š��$N§ñèœË¥Ï7h³|¾ü~ãcYùÏëvûø4Û”�~ j™‚/ ‘¯ÕíöÃãQ|ó ¤¨ù ¬|“]‡Á|}>¿NŒ‰Ì?Z¾ «Cý¶xêÐïO¼=¿îÃ8Þ:ŒÖ¾YuÌW–cÝ›äÖaðXEœ1Ê÷ÈÔa¬öÝP±­ê`h[;´ÐåŪëãZý¾8^ÿ‚êòªËgÔ¾#?²¥ûþjm„§ÖIÔ·o§G½_"6PDmý9�nfûöùüªã€Äm„vÑTmÙYu(d�(ãªñ VR—ÁétÃãÕÅF‘}ÙãòÃÌ©?²jkhbÙ·æ:#ógÙ@â~µ7»«Æ ôí 6 o7>?«½D·¬ESk�𯳑õ<"Vûözôu+K/èûk­_ß^´}XK°mDÞ œîœ>¯hts�˧¤ÝO_^É/é¾4]µ^�‡¬Óé�Ë¥¾/Šwv˜€_BE…²æV´÷O­_çá¹O¤��Äë ÀíV§¹]>¸üúzŒö.°ûe–ÍmnÀ§Ëq®ã8�î:»À.kd¾‘}/Àxºk½pz5õ/é?@Ymʨ}GâªñèlP<6ÂíöÁÉŶT3RäºçI@ §qàb¾GJ«áÕíI) ¶N§>¿>Í«²\]ÙÂlw‘÷œõ|e‰4®Zóž{¼lÄëõëû¦'—¬®GÝõhß#´×¤ë7n? ÑÁ<.?œ²²_ä·†ÖF+×£oÿ‘í�§»nw�vÁ_Wîp›v{ômC[?Úò{=þ�}ˆ,¯ˆþ\¾Gø÷<žw1#;«µª¾hÐç‚ùÓ·†}k¤þ[Èæ¨GX,Ã}bÑè÷5kÖ ??÷Þ{/A@zz:&Mš„Ñ£GãÌ3Ï yª)//G‹ÊÇhvv¶n{EEzöìÚ§¢¢iii¡í•••hÙ²eÜåSM‹mBÌ›7ÇŸ‹üwÜq7, ��ÆÂŠ˰}û܉#ë#'H,íØTäÛ°2é§B''߯U‡ É÷ÈÕaó¹7M±wy…þî"¶fd¢?‡Ì:¯¬Q!IúëŠe#僚µ뜡ŸuȺäDê�µè¨vßà߯I½7ÚÐ F猄!Zâ 3Ž5Šá­²î 'C>FÒ×E¬ö­äç=—€`8àúöåÈ¿�î Nç… ÆyXm[Ù5‘{Ç!«cíëÐ(þv¬¶¦»wugÕ•M­*iÌëÔïëÚ™ù0ÊF[`ÆB–ôƒSFí[U6Ö9 ʫ͋uœöt£½(m•q ¬übÔcÐCú8s'ü·õ5á}â´µ‘ù3Û†ÄÊΜSç�-éבˆÇF@Šó¾�Ý>™YƺNI* ¨ëù°l„$GŠü¬Âqú¾Ã¸'ÌXÝŒz”$9ö5ô9MÔ¬ð&M{ŽüÍsŒ¶ÂʇõÁè’$ë¼ÕÖÏz?ÐäÜÎl/±ú´Á³HÊÉȶkÃq>« ê_wMH¢Dßé=9˜/}k4<ߣ¯›/�nÑÔ@ I’T7Ò[7º8hÐ lÚ´Iµÿ¦M›Ð¿@ß¾}±yófU^[¶lAÿþýѱcGdffª¶ïر^¯}ûö=’—tÔSYY�_~Y‰o¼™™YX¹rYh›ÛíÆ /ü\0^x^xá?¡ûm›ÇãÆ«¯¾€±cGáœsÎÀ�wÞ‚½{÷0Ï_UU‰§Ÿ~ £G�ĈCðÐC÷¢¸¸€~æŒ3NÆ·ßÎÂùçŸ�~X ˜1ãsŒ?#Fœ‰«®‡+–¾øâSL�ú&–-û gŸ=�@ ^e!"1xžCZš%)±Ð¢¹³ÛW@ùpëjRBéic„ƃÑ^ -š×ìXÆ<Ï!�1¥=X ‘ÃB!g –—4+9 ô…½�%D�EXçL&,ñ;ÞES½ß9Ù ˜²Hdq^VÙð̶ÁÊ1öyâ«V.¬…YiõY45–àÎs|\ïÊ9¸Ÿõš¬˜�ú@b‹²2ò7h‹±Û6û8mvÇ%fƒêaVYר–qヵ(_Ÿ…›#NlÌ…m6–aÝ:£º•nã±ë‡cÚ‡ÄÞê!¸Ç;à‘ÄÁ}‚ #U:D£ )“���>ø/¼ð† ³ÙŒSO=O>ù$Z¶l‰wß}Ï>û,žzê)´oß/½ôzõê2dî½÷^Ü}÷Ý(--E¿~ý0mÚ4X­JвI“&¡¦¦£G�†ßïǰaÃðä“O±ká«çC(}œäP^^†_~Y…Ï?ŸZÐöÖ[ïÀ¥—^ˆÒÒ’Ð~ç�7 iiJl¥ã�?ß}÷=ÒÓÓ#Fœ‡çž{ {÷îFvöɪk‹U–ãŽkÞ³‚ ˆ£‹?={àƒ‹ðxKççס)1Ï݆yzÆÌŸRƈD½Úbå?l/éXbi=r×¥yz&”0#ó¢e"°=ÜYçLà”HÌû9^‰µ>B¨ÑâÁõ‡-ëéòf´!fâlÛÛ;2-Þë14caT®¸ïq¤Wt=ú]¼í!¶}üñœ=y6(~X‚¸,×ÿS¯úa…‹1s+$ËÇ(s6W‚÷ÉÈ–%kp¹>m6ö`^Ý`IÌú1z±Òœo LpD;;ÛÐw ‚ �Np”Ð0Ÿ~ú)sÛ)§œ‚ï¾ûÎðØ &`„ Ìmf³O<ñžx≤”3BÙTðÞ]ÿȹ‚pP>5nÁ}Ó¦�8p ÇŸ hß¾Ž;®.œ‡K/½Ng5ÚµkÚ¿G�ž”XøFÛJKKP[[ƒ‡ž¬zèª÷ƒ•…á®»N}ÏA@QÑade)b~›6mBÛ$IÂG½‡eË~BEEy(ÝËXؤ¼¼,jYHp'‚ Ž&ÖºÂï ƒl½B¿”{&¸Ç™X} &&ê1º&‰ˆ9†y%è™Í"Yb Vè Ѱ*ñQŸ{›èL6Gn0#(wÕû¨81òB�WLŒ%ê„Cv$*Î2…/bÁôú�ìŸõ˜As¤Û›èõhÔïâmñ±ôÀúÌPsdmPb¾Â÷#™!eâ-}¼ÞÎ±ÊÆžáÁyó. ^Å['±<¬™áolìp@É|`—É(ýÈz Çm˜IDDÓ Q îM…@‹Û€Ò—ÿy÷ì[ãÞþü9¸ì²‹Bi>ŸÅÅE¸ì²+,¶S‰µÍbQfL™2½zõÖm?t¨ b_eqÖo¿]ˆÌÌ,Ã}!Ü”?üð=,]ú#^xáUôèq dYÆYg�Ƽ¾Xe!‚ ˆ£‰]uñÛ ŸµSƒò2’ ‹M‚‘×\½¾ê/‘5ü#8!ÁÚàšYBD²Dcoóä èÊQ¯{›<±%Þî‰�¨‡{Cê¬>ƒIñ¶¡XžÓñ ‰B¼!eŒ|˜1Ü#Ëçus‰­G`d±%,Œú]üv#±ñ±…\ƒtf^GVpgÅüNlvHb³x¹Ç'NÇ*»Ÿ$f˜õÈÕ§~ëßÏ�ãÆGË=þÁ¼úÌ:ˆ'¤ ;½þÔç˜Df$˹€ ˆÆ î)DJU¯Ð.ÿ4µµµøé§pß}㤓N ¥»\.Ü|ó¿±}ûV8éÈËÛ‡c�U¼ì¶o߆}ûö`äÈ ¢nËÌÌÄîÝ;U"÷¡ChÛ¶�ª mÛ¶Ïóؽ{ PÂÁøý~TT”‡BÀhÙºu3Î8ã,sL¯ÐßF8ޏËBDâH’ŒÚZoRVû&ˆæF@–€ìõ´2áàm ÌÙÈÃ=> )Ã\´R’áqùãAII1*++ðÚk/bÏžÝuÛÅ�ÅÇ€ýû÷Áï÷cÆŒÏqÓM×Àív«Êàp80|ø¹˜2å(*: �Ç�©SßÂÝwßnèÁÒ¦M[ìÚµn·{÷îÁçŸ ‡Ã�’e‘9‹Å‚Ç£ºº~¿?î²Ñ0üþ@ª‹@�—äÁu‡ÞÄå_Æo=€®¦\õŽ †G‰7†8‹Äb¸³÷ ô ¥%B½BÊ$åŒ ÉZ|Ò(=Y!eŒ8:äöd‡ˆ/-±šMÔSµa°¤ø¼kY¢O,/ò†üõ¿Ù>jûÏ;>¡Á£††”I,pKü]±ÅË=Ü ý’cƒ )úë3Ë��ô,¯ú`=°Ê+Ö»Ñ Tb‹¦²ûx²Ö+a§äÅ(,;¤L¢³2©£oŒ#7 ÙÙ€A$—TéäáN2þ\Œq>L&“nÛ¨Qã‘GîÇ7ß̇ËåÂUW�ƒÉdÆ™gÅõ×߸õÖ;ñÚk/2·]{í�p:�˜8ñø|~ôìy ^~ù¡l#¹çžûñê«/âê«ÇƒãxôíÛÿýï+†¹k®¹�?þ0F�Žnݺãᇟ@NN.^{í%deecĈó°lÙ�7îB|üñŒz•… ˆÄà8Àdáóù]›ˆ š%³ª× À_x´ø‹PzoK‡zåSŸ˜ÐÉZˆ�Ûë0™„8sˆŽÑ5±H$ÔGÉ ×S?/ÚäÌá"þ«*K=f2„·3ÊÆ<$>ûÀÏê'¶êÜTa8fsìwŽã˜yÅ‚5K‚{á]6±ÄEoÞ8|¬�‘D×f¨ONÖ,ãüãº�a‘?2Íx€+–ײQûg-Õ߃>Ú9tùÇ�¯Ï{@ÌõꎓbØ–dÖg` ûUŸ6[ë@!e"¤R‡ Á�0dêÔé†ÛŒ¥KWxà<ðÀ#º}L&“á6‹Å‚É“ÄäÉê¶µmÛ?ÿ¼.ôwFF&ž|ò?Ìrh÷÷iÓ>R¥Ýu×dÜu×äÐß ü¤ÚnT‚ ’Çq°ZMðû ÅW%ˆæJy€½ÎËk7Ãcâö°6ˆQ¯)%°¨!KR>–“#¸ÞˆqTƒC>$0ÃÀ`7¦à~„íæ‘Óâ'ñÛ ìò%§Ìõ¹ôä îl8^/ôdÁ|ã )cKÖŠ`ñ¾C$Ò–�Íøˆ- Ç/^Æ:»U•4±�2Ìœ’?žüã�“^âõ"g-p[ðÕ§éÅ¢�ÍÕ�Y+J^úÒFößЂ·»ñES ìÑ^@=þÞK!e"•¤R‡ �2AAG)¬Å “I½ŽI¢!A»<9B"À^418ÔG$KÞKwl¯H=F‚Ñ\4Õˆ#."þrÔŸú”ƒY· ‰-‰‰2qÏ1˜j˜,y„^ÐŒ1E=,÷ú„”‰õ\ñ2Y ×OÐŒ²Ãð¸ø�bäŸhH™úðφ”‰o&GC‰7ÌL$¡Ù!²^dVígtí̘,1Ú?ëž À1O™€ªŸ:븶Å0†{¬{¢çÈ˜ï •È¶rDª ‚8Z!Á� ‚ â(E`)9B|2ž±¥øã GæGZª×Br zµ1óŠšCÏ‘ŽŸ\?QøèÜKëQvÝFæï9ã'ÑpìóÆï)­¡´$…ð©OŒf±CŸÔgJAò§’µD}¼…“ILÏì#l#ê+Îu"kcÄ“?‹úΑbXŽdzJ?+âÍ¿þƒƃD1f£ÔýŸåõ,;áú9‚ú㌉ïŸ ˆ¦ îAAG),wÝ‚©:â÷Te¥Çû™H¨ #¯×d‰9Š‘È4ûä îñŠ G:ä@}8²r~}øç…ÿdz2óODÔ6ð’nȵ²ËQÿØÎ,X!eê¿;:GÜÃÝÀfÆ} ±bd×Û7É SoÛd†êaçÏKr„Cq°®)qÔhFJ¼çLd`D™ñ’ȳNOýBʰÒôƒŠ‰>³’U?‘e©‰¶Ùø!É� š$¸Aÿ©Zœ 3,÷“­Ýui }°Ny�¯l‰-Ê~õ ê¿Ð!›Ä¦Ù7ôXÇ8·›²FZðŽz-|›ì…=Oµöœië“pþGÂÃ=’YŠø=Üëçã^ßã ý5ã�âõ�Õj™‹2Ã[4ì“rxÚñ°rfÀ-Æ0÷‰÷¢!Âðõ™Ã­„ ô0·Mš ÙÐ�2ñäÅâ\Ç °r&Àƒ-Ç&p¶0GZ\Œå1~ä‰OägÇ—?²µ©#RÆøõ€5S†eã�‹®ÏÿòŒ3BÎÏ´š /*×°oŒD=Љá~t<5 ¢ù‘*‚M%‚h0ÿìâ�I’Q[ëMu1¢ÑÁòpogjõ˜ú„ÅHÄ›,¼_D^q �¬ý$I†Ë›û�èÇl2Åãh"ȸô�èfjƒ®¦Ö0q‰½†7L´Ux´ÕeøÛ³ý-]*C}ÊQKS°àm¢¢L¼YCC<Ä.‰þ؆\{CÛ‚ƒ·â½¶qØ_�ã-�™ùÇÿ‘øàÑåƒÑÓÜÝ̹9>Ùç /r¤º¼ ÓÚND‘¿Ò°^áHô“HŒb–7„„bƒ‡¼µ£‡9i¨ œø€yÜÌ5â¯ïX!_³¢ç_Z éx¿íí¨Ô ¯¥“þüô�q¤CÊ$s6Aõ'•:y¸ÿCð<I"ïN‚hŠx<òÞŽZ'ˆ ê+æy[1[—vEÆ™¡ß³ÏŒM?=”ÖÃÜp‘ãÊG_SKX8¶:ÏÒ!öã­ÅÌ�Çêyi'–íöºóÀåéƒ ÷;Ýz ‹O3ܧƒ9<ˆp¡ãdÃýX\�vÅ˶­˜ <œãþ [oÃãÔuv^½Î©%²®ïjq¡á~'à[´3BiDåÚ�‹Z 逓­=„ïLn1Ú0ÿ³Î ýdïèiRî}wS›Ð6;oÁé¶caã•{ôt€[²Î5Ì?òžŸ�ÖÏp¿à¹‚玗óÓ„~ßÝâ"Ãý®Î8+ôûDk7@'QYH¸�¹ch[k!SÙ'b`!X·§ÔÕíèôÓBÛîmq±á9ÇG´ñ>åm¥/ö·t1<A¡ßwd_`¸ßG¸ÝêÂF]qß;™Z÷£Óêú•�3‡úðP{ߺ}ì0× èœcï¸&sX(¯àL‹G¤ÝX—6Ê¡ô'ÚŠ-Ty˜9™¼0ئ´¯tÞÙNª›}ÓJ·ï^fe&GSkÃk»v‚µkÈæEÞÿóÓ¾Cóï\·�ôöp[^'‹«3††~¨kCÁþl#"¤ÅaK®Ï®û=2í€ B(?-½ÍáY.ã£ØÐÉírT�} ¶¹`4¢�ØBU¯·e…mݰºöÂBÛ¶ãµA£§†~Ǻç‘DÞ«ÕõïH[:&ÂÆj ÖcÐ@�Ý;Û~|hÛĺ:Ñ÷ï©ko2†„ÒnÍ ¸9Â&^�9Tµd>Áöy¿µíÿ {¸íuä3/X·¬öùœéfÊ.®gëš"ó ÖÑȺç½AÕ‡#‰¼§Á{ùü¼"ã Õuá¶n³Y†eÑ&ƒe€Ž¦Vègí´¿6óìжÓl= íCð^gu±ÞS¸9Ûøù§¥­˜zW ¾‡°ˆl+c£´c‚ Ž©Ò!89Þ啉¸(.®f¦Ë²ŒÊÊRdf¶lð‚IA=ȲŒ}ûvbýú¿B�7>Å¥:úày‡N§’D�‚ˆ—/*WbzåO¡¿s„L|Ñîæ»Äz÷¸%/N·žãá–¼XY»=ÍmÑÕ¬x.É‹Uµ[ÐËÒ�êªþrïÙö>¡ÅXøJ°ÙsCì}`ç-̲I²„5®°ñæ� À¢ZráçÚ-8ÑÚ mƒAû°¥ì6»•sÚ ÎÉÂ%y°²v úX:¢c�(yÈ_Ž î½8ÓÞÞfxìz÷¸$/ÖÕYCøË½UR-Ùz1CQâ¯Âïî�dë…,ASû+ð‡{7Ûz#SPÎ�îý(—œlëm˜¿Oöceít[âXK{@yÀ‰5®í8Ýv Z°Ísþ2œiïmè}ï—XU»¹bfHtfQ¨Æ¯®1ÏÉb³'%�jœaë�˜ûxeVÖnASëÐ`R°ÚŽE¶àù+±Î½KU�‡ýX_W·ªº­Áà(÷Î#ù°ÒµÝMmЭ®?×å?ÈÖ ™‚ñ€Ò÷^ÔHn ´kØÎ‚ýõs;t1+¢V°¿ki”ƒå?ÃÞéum»ÀW†¿<ê>œï+Å&Ožª¯s킜f=ÇA–e¬sïFN³öÇqpI^¬¬ÝŒÞ–!Q[×ÇúZ:¡CÝ §äªڭ8ÁÚ54X¨Åj×V °vG®˜ ÜþN³c(<³ÈüìÚ†–B:Ž·u6|‡æªµgh +ž¶ì•ýXY»YÕ†X„í£±-‘ekÝ» CÆ©uõ®³ŽèPg—XìõÆNï!œe?ÞdP~qmE !=äá¬ë“­=�#fæ¯%؇ۈYQÃZû+±Ö½ ƒ#Úv<6(ØŽ�µ´Cçzî²,ã7÷P=åºW»¶!ƒ·£¿µ‹á±¬6À²A[=ù(ô—ãL{ˆu¶åo÷>THµª¾ÿ‡k7<²mdžúÉoî!àä(e« ÔâƒöY¶ížƒÈ÷—bˆ½O¨}nòä¡,Pª[–�cÙˆxŸuÚkbåo›Ýï+ÆvÏAœiïo†$KøÕµÞt¶ÙlÞ�~VevEe «]Ûb¶Ùmž|ÒÜ'-^Ù�Uµ[ÐÉÔ ÇZÛÚ–½g±Îµ >9€ÓmÇÔK«9à+ÁOô÷–xÛ1AG††ê99õ{��„÷$c$¸@ àGuuÁ³Ù ŠâE��¥¥EøûïÍðû•iÇ$¸³!Á� cFÕÏx¯â‡Ðßç¦�€Z²c7VÈ> ²AAö� ˆh¤Rp§îÿ ‚ "3³%þüó>|¨Izº›L|> ­A4üþ<u<0e0� "9hc¸Gó*&‚ ‚ ‚ R îÿ0Ç¡wïã�——¿ßߤDwŽÌf^¯4o‚hŽøý~œp‚q¼c‚ ˆú¢�¶œ™w‚ ‚ ‚ ˆ£ÜS€Ífù瞇õë×Áãñ0WûnŒð<‹Å�ÇGÓ¹ˆf‡ÉdBçÎ]Ñ¥K—T… ˆ&¯ñpÆq&‚ ‚ ‚ ŽNHpOv»gœ1$öŽAMI’QUåJu1¢ÑÁkÖ{ièžG#d‚ˆÙ‚ Œ û@D4Ri#šÞWAADAFxÆØ­Y#SX‚ ‚ ‚ "Hp'’Ïs°ÛÍàù¦—ž ˆä@ö� #RpÏÒRX’#Ù‚ ¢A6‚ #È>�TÚ܉¤"ŠBª‹@ÄQ Ù‚¨?R„àΡé~L’} "d#‚0‚ìAÑH•� Á� ‚ â(%raumD¢4w²ADƒlAF�} "©´â?~F¢É"Ë€×Hu1‚8 !û@‰¡òpo²‚;Ù‚ Œ!A„d‚ˆF*my¸Iƒã“IÍx'B Ù‚H Inúîd‚ˆÙ‚ Œ û@D4Ri#Hp'’Çq°ÙÌàèiG„²‘Í!†;Ù‚ ¢A6‚ #È>�TÚÜ ‚ ‚ ŽRäfÃ� ‚ ‚ ¢)A‚;AAÄQJsX4• ‚ ‚ ¢)‘”ESwïÞ�Ÿ~ú ¿ÿþ;Š‹‹Q]]�ôôtäääàÔSOÅðáÃѽ{÷dœŠ ‚ ¢Ù ËMÑT‚ ‚ ‚ ˆ¦Dƒ÷‚‚¼òÊ+X¸p!xžÇ±Ç‹6mÚ gÏž¨®®Fqq1Þxã ¼þúë8ï¼ópß}÷¡]»vÉ*;qH©.AG)d¢þ¨<Ü›p|R²ADƒlAF�} "©² îkÖ¬ÁÝwß�Ö­[㥗^ÂYg�…ôôtÝ~ÕÕÕX¾|9¦M›†1cÆàõ×_ÇÀ�ThâèD’dÔÔxR] ‚ ŽBÈ>Db¨Mm¢îd‚ˆÙ‚ Œ û@D4Ri#Ü'Nœˆûî»&Lˆêq•žžŽ‹.º]t¾üòKÜ~ûíX¿~}¢§%‚ ‚h6P w‚ ‚ ‚ ˆÆE‚û§Ÿ~о}ûÖë˜+¯¼ýúõKô”ÄQÏsp8¬p:Ý�$9öA4È>Db4‡îd‚ˆÙ‚ Œ û@D4Ri#Ü£‰í«V­ÂŽ;ЦMŒ1f³9®ã‚ ‚ ˆ0äáNAAѸhТ©Ÿ|ò –.]ŠÌÌL\}õÕ8ùä“qß}÷aþüù¡}Ž?þx¼÷Þ{ÈÌÌlpa ‚ ‚ šªîMxÑT‚ ‚ ‚ ˆ¦Ÿè�3gÎÄsÏ=‡¢¢"ìܹ×_=fΜ‰ßÿ~ø!Ö®]‹¯¾ú •••xÿý÷“Yf‚ ‚ ˆf�¤Z45á×6‚ ‚ ‚ â"á/·¯¿þ×_=.\ˆ… âî»ïÆóÏ?�I“&aàÀ�HOOÇ 'œ€|K–,If™ ‚ ‚ š‘1Ü)¤ AAAÄÑO‚{^^ÆŽúûÊ+¯Dmm­.F{¯^½PXX˜x ‰Fƒ$É´X ALÈ>DbHÍ ¤ Ù‚ ¢A6‚ #È>�TÚˆ„÷ÊÊJdgg‡þ¶Ùl°ÙlHKKSíg6›áõz/!Ѩ AF�} ˆú#7“ESÉ> ²AAö� ˆh¤ÊFP0P"ip›Í®‰zà‘8d"1ü²ú-4QÁ�ìAÑ A„d‚ˆF*m„Ø�ƒóòòPUU¥JËÏχßïý]VVÖ�S�ŽL&�2 2Ù‚H §ä ýNã­),É‘ƒìAÑ A„d‚ˆF*mDƒ÷ &¨þ–e×_½.�F ‚ ‚ êOµäýv4QÁ� ‚ ‚ ¢)‘°àþüóÏ'³AAÍšb%Þ)_ŒBy(퀿Àƒ‡�³¤ªhAAADœ$,¸�3&™å ‚ ‚hÖÌs®Ã*׿¶,ÞN3 ‚ ‚ ‚  )C‘Ȳ �Ç™‚§¡�ìAĦJª ýæÁƒ¯[$ÕÊ™pUæY©*Ö‡ìAÑ A„d‚ˆF*mDƒ÷’’ÌŸ?×^{m(íÄO„ÛŽ7zÝu×á�hÈiˆF‚,�?öŽA4;È>Dl¤ˆÁ©mnA7s›–柃ìAÑ A„d‚ˆF*mD‚{ee%&L˜§Ó‰k®¹<χ¶Mž<-[¶Ä®]»ðá‡bôèÑ8öØc“R`âèFyøýRª‹AÄQÙ‚ˆŽŒ°àΡy…�!û@D4ÈFaÙ‚ ¢‘*ÁÇÞ…ÍÇ ·Û�™3gªÄv9r$ÆŒƒûᅢ ÂW_}Õà‚G?<ÏÁn·€ç›—H@DlÈ>Dl¤Á�oFñÚÉ> ²AAö� ˆh¤ÒF$,¸ÿðøýöÛѾ}û¨û�?¿ÿþ{¢§!‚ ‚h4gw‚ ‚ ‚ ˆ¦B‚{^^N:é$]z×®]a2™BsÌ1(,,Lô4AAÍ‚Èî< îAAA�’„c¸Ë²Œ´´4]úìÙ³Õ'E�DOCAÑ, w‚ ‚ ‚ ˆÆOÂî­[·Æž={bî·mÛ6´iÓ&ÑÓ� I¢ÅJ‚`Cö� ¢Ã�kF1ܲAD‡lAF�} "©² îƒ ÂÇu¿ß�÷Þ{g�uV¢§!’$Ãéô@’äØ;Ѭ û@±‰ôpoN!eÈ> ²AAö� ˆh¤ÒF$,¸ßxã�øý÷ßqÿý÷£¤¤D·}ÿþý¸å–[°wï^Üpà *$AADSG¢�2AAA�ž„c¸wêÔ ¯½öî¿ÿ~,Z´½zõB»vípàÀìÚµ ÙÙÙxç�wкuëd–™8JáyiiÔÔÐ3AjÈ>Dläfºh*Ù‚ ¢A6‚ #È>�TÚˆ„w6l-Z„¯¿þk×®ÅÎ�;Áó<Úµk‡±cÇbìØ±ÈÈÈHVY‰F@s‹9KDü�} ˆè¨BÊp OBl”�} "d#‚0‚ìAÑH•�h�à999¸ýöÛ“Q‚ ‚ ˆf‹ÔLc¸AAA4%vŸºí¶Ûàt:ëuŒÓéÄĉ=%AAD“E¦îAAA�ž„w¿ß�‹/¾sçÎUÅ5bÞ¼y¸ä’K=%AAD“% K¡ß$¸AAA4N89µœ�,Ëxíµ×0}út´iÓÆ ÃÉ'ŸŒœœ¤§§£ººEEEX·nV¬X�C‡áºë®Ã½÷ÞÛ¤clW§º)ExRì ‚hv�} ˆè<\ô)Öºw¾íðÒy[ŠKôÏAö� ˆh�� ²AD£!6"''=áó&,¸Ù·o¦L™‚eË–¡ªªJ%¦Ë²ŒŒŒ 6 ·Þz+ºvíÚ�S5 š»àNADb|8•—KAD3 2¤LS^`ž ‚ ‚ ¢)Óè÷Ç#??•••¸à‚ B¡_ÊÊʰyófôéÓGµŸ>}Bac´ÛyžGïÞ½±qãFäå塺ºÇw\h{÷îÝaµZ±yóææâ‚ ‚h¶Dz¸ äáNAAÑ(ið¢©ÿ4………€Å‹ãÃ?„,˘4i}ôQ¸ÝnäææªöÏÊÊ Åa¯¨¨@ff¦j{ff&ÊËËQQQÈÈÈPmÏÈȨWwŽÓ{¥Ér8.+Ïë? %Éx›,Ë�ev¾±Ž�'ßDŽ nã8N‰ã8x½þ$ä›Ü:Œ–o¼Ç©{£­ÃÈ|)Sô|�L¦º}S6Áq|¾€j¿£¥ÉFómší»1Õad w�çÁ×� Õux¤mDÐ>('#_²GcûVò%Ñë�lÙ%ߦپ©�v¶<Ÿ¬|ÉFPû®O™¨›‹�¨/IÜï½÷^\vÙe8p`2²‹J°Üxã�!qýÎ;ïÄM7Ý„AƒÅ}|¢Ûca6‹°XLª4ŸÏ—ËžçàpXuÇTU¹6›‚ žtàryáó`2 °Zͪm~µµ^`æ[]í‚,V« ¢(¨¶¹Ý>x½~ˆ¢»]�o ¡¦ÆS—¯ÐxÙ9�nH’ «U„ɤnB�²,Cx¤¥YTÛdYFuµ�–fÑuÆš)�:”QU¥ä˪ÃÚZ/üþL&V«:ß`r»ƒ÷†]‡^x½ˆ¢›-Zêó�U‡�¢ÈÃnWס$Ip:•|£Õ¡Å"ÂlVçëõúáv³ë0òÞØífh;®­õÀï—˜uèóàryÁq±Ú· ‚ ®Ã`ûf×a55ÑÚ·²,Ãj5Ád2jßõ¯ÃཉV‡±Úw´:lî6B’$x<~²d#B��P¨­õ¨<ÜӶй›‹�0™„Pû&A6"Ùz�  Ùˆ0d#š»�Þ#² d#Â��P ÑpQ_8¹¡ 3€óÏ?{÷îE‡0nÜ8Œ3Fçiž,òóó1|øpÌž=;þeÏž=8ÿüóqê©§¢C‡xþùçCûO›6 ßÿ=¾ùæœy晸÷Þ{1f̘Ðöo¼={öÄå—_Ž‘#GbéÒ¥hß¾}h{ÿþýñÆo`èСq•¯¤¤º™�©·q]#n4¢Ì·iކR6Áó‰¼NêU&jßÍ©ï(œ†mÞƒàÀá§.O%%߯b#xžƒ$Éä™Vï25žö­äK6¢)Ö!Ù²J¾M³}Sý6"h’—/Ùjßõ)ÕaS¶-[:tûÄKR<Ü-Z„­[·bÁ‚˜9s&Þzë-œqƸì²Ë0lØ0hGVB›6màp8°uëÖ�à~ðàA˜L&œuÖYøî»ïTûoÚ´ ýû÷ôíÛ›7o î�@[¶lÁ¸qãбcGdffbóæÍ!Á}ÇŽðz½èÛ·oÜå‹l¨,‚7¯¾ÛŽT¾ +S¸¡JƒLK³†F“޶k=óÕÖaòÊt¤ò¥:lx¾G_þ6‚ç9Øí8�îP9�¶k=ó¥öÝð|S=Ü9pÆûe÷¦aeRêPm’‘ïÑש}ó¥:lx¾G_’�8zó¥öÝð|©�l¾ +“ Ž Ûí¾GÛµ�ùRûnx¾T‡G6߆•éÈØˆxIšÞ»woÜwß}øé§ŸðÙgŸ¡sçÎxòÉ'qÖYgáõ×_GqqqRÎ#Š"Æ�‡©S§bÿþý(--ÅÛo¿�‹.ºcÆŒÁÁƒ1sæLx<¬X±+V¬ÀøñãW^y%æÌ™ƒ 6ÀåraÊ”)0›Í:t(AÀøñã1uêT:tåååxõÕW1bÄ´jÕ*)e'‚ ‚0"äYB ¦AAA4ZŽÈ¢©'œp$I‚ÛíÆ7ß|ƒéÓ§cúôé¸á†pÇwèâ&Õ—É“'Ãëõâ²Ë.ƒÏçÃÈ‘#ñè£�"-- ï¾û.ž}öY<õÔShß¾=^zé%ôêÕ 0dÈÜ{クûî»QZZŠ~ýúaÚ´i°Z•XB“&MBMM F� ¿ß�aÆáÉ'ŸlhuAAÄ$ÒÃ� ‚ ‚ ‚hœ$%†{�üü|Ì™3ß~û- pÚi§áòË/Ç9眃eË–á‰'žÀ%—\‚|0Y§<ê(.®NuRÏ+ ,°¦jѼ!û@±¹éÐ;Øë; g‚Ž�¦º8ÿd‚ˆÙ‚ Œ û@D4j#rrÒ>wR<ÜçÌ™ƒÙ³gcݺuÈÈÈÀ˜1c0~üxtíÚ5´Ï¹çž ³ÙŒ‡~¸I îÍ�$ŽßÑÄ û@Ñ‘›±‡;Ù‚ ¢A6‚ #È>�TÙˆ¤î=ôN<ñD<ÿüó8ÿüóa6›™ûõë×É8%q"I2ª«Ý©.AG!d"6R3�áNö� ˆh�� ²AD#•6")‚û£�>ŠK/½6›-ê~-[¶Ä÷ߟŒSAA4)‚îÍMp'‚ ‚ ‚hJðÉÈä•W^Aiii2²"1Jl$ xž„‚ Ô�} ˆØ„MåšW?!û@D4ÈFaÙ‚ ¢‘J‘ÁýüóÏÇ'Ÿ|’Œ¬ˆFÏ'¥IÑ!û@ÑñÈ>€!Å%ùç!û@D4ÈFaÙ‚ ¢‘*‘”�2iiiX±b.\ˆÞ½{3ã´¿òÊ+É8AAD“Ã/P¨äˆ´Þ AAADc%)‚ûO?ý0›Íؽ{·n{s›MAQJÕ¡�2­…Ì—† ‚ ‚ ‚H”¤îK—.MF6AAÍ’J©6ô;[p¤°$AAADCHŠàÄçóaïÞ½¨©©AFFºtéAh~qH›+’$£¶ÖI’S]‚ Ž2È>Dtª®Ðïtޚ’üó�} "d#‚0‚ìAÑH¥�HŠàðòË/㫯¾‚Ûí¥;\ýõ¸í¶Û’q¢à÷K©.AG)d˜Һøí�ÎÛRX’Ô@ö� ˆh�� ²AD#U6")‚û;#Ï?ÿãÇ�lj'ž‡Ã�êêj¬[·o¿ý6ÒÒÒpÍ5×$ãTÄQ Ç&“ŸÏ™˜ ‚ˆ€ìADgYíÆÐïL>-…%ùç!û@D4ÈFaÙ‚ ¢‘J‘Á}îܹxôÑG1~üxUú…^ˆîÝ»ã‹/¾ Á½Àq¬VüþdzÚÙ‚0Æ'û±Á½`æD ²›ÚýÃ�} "d#‚0‚ìAÑH¥�à“‘É¡C‡0pà@æ¶¡C‡"???§!‚ ‚hrú+àƒ0ÈÖ ŽfR† ‚ ‚ ¢©�Á===dn+,,DZZóšMA/URmèw Á‘Â’AAA %)‚û Aƒðì³ÏbÓ¦Mªô¿ÿþO?ý4œŒÓAA49ª®Ðï òn'‚ ‚ ‚hÔ$%†û<€k®¹—]v, ÒÒÒPSS�ǃnݺᡇJÆiˆ£Y|¾-VB„²aL¤‡{oOaIRÙ‚ ¢A6‚ #È>�TÚˆ¤î¹¹¹˜7o–,Y‚M›6Áét"==ýû÷ÇðáÃa2™’qâ(G–e¸\ÞTƒ ˆ£²aLe³ÜÉ>a Ù‚ Œ û@D4Ri#’"¸€ÙlÆ…^ˆ /¼0YY�Žãhup‚ ˜�} 6*w¡ù îÙ‚ ¢C6‚ #È>�TÙˆ¤ îë֭Ö-[P]]­»Žãpûí·'ëTÄQ Ïsp8¬p:Ý�$zà†ìAÓÜc¸“} "d#‚0‚ìAÑH¥�HŠàþÒK/áƒ>0ÜN‚;AA›æÃ� ‚ ‚ ¢)‘ÁýÛo¿ÅM7Ý„n¸YYYÉÈ’ ‚ ¢YP%5ow‚ ‚ ‚ ˆ¦ŸŒL�Æ�Ob;AAD= z¸›9VÞœâÒAAA !)‚ûÈ‘#±lÙ²ddEAѬ¨®óp§p2AAA�NNÂR­^¯×^{-l6zõê›M=º9Åp/.®Nu‚ ‚h$ȲŒ <èfÊÅ´¶S]$‚ ‚ ‚ ˆfONNzÂÇ&%†û믿Žõë×~ùåÝöæ$¸AAÄ‹[ö‡ “<Ü ‚ ‚ ‚ =IÜ¿ùæZ4•Ïs°ÙLp¹|�¤Oœ ¢ Aö� ØTÖÅo€t¡y îd‚ˆÙ‚ Œ û@D4Ri#’Ã]’$Z4•‚�ê"q”Bö� ôTÕÅo€ ÞeϦ Ù‚ ¢A6‚ #È>�TÙˆ¤îÇÇš5k’‘AAD³¡,à ýÎâÓRX‚ ‚ ‚ "$%¤ÌÀ�ñî»ïbíÚµ8î¸ãt‹¦Àå—_žŒSAA4ò}%¡ßíÄ), AAA‘ ’"¸?øàƒ€={ö`Þ¼yºíÇ‘àNA¡¡Ð_úÝÞD‚;AAADc')‚ûO?ý”ŒlˆFŽ,Ëp¹¼�eZ¬„ 5d‚M�ìýNo¦1ÜÉ> ²AAö� ˆh¤ÒF$Epoß¾½êo¿ßQLJÖD#B–Ÿ/�êbqBö� ØÔJžÐï4ޚ’¤²ADƒlAF�} "©´IY4~ÿýwÜpà 8p Ž?þx8p555xá…h´±™Àq€É$€ãR]‚ Ž6È>›HÁÝÎYRX’ÔAö� ˆh�� ²AD#•6")‚û²eËpíµ×¢¬¬ £G�y·WTTà»ï¾Ã{ï½—ŒÓG9ÇÁf3ƒ£§AÈ>§¤„”áÁÁÊ™R\šÔ@ö� ˆh�� ²AD#•6")‚û[o½…«¯¾ß~û-zè!‚@ 5óè£�bÖ¬YÉ8 AAD“Á%y±ÏW ÈäÓèc‘ ‚ ‚ ¢ �Á}×®]¸üòË™Ûú÷ï�‚‚‚dœ† ‚ ¢É°ÛWü€“mÝS\‚ ‚ ‚ "$EpÏÊÊBee%sÛáÇ‘–––ŒÓAA4fU­ýî$椰$AAAD²HŠà~üñÇã™gžA~~¾*½¬¬ ¯½öN?ýôdœ†h´B8AlÈ>„š ©&ô»¿µKê r@ö� ˆh�� ²AD#U6‚“eYnh&ûöíÃUW]…òòrtìØ@ÇŽQXXˆÌÌL|þùçèØ±c2Ê{ÔS\\�ê"AѸ4ÿTJµ€;=•âÒAAAArrÒ>VLFºté‚ àë¯¿ÆÆ�Ñ®];dddàŠ+®Àرc‘™™™ŒÓAA4 ür $¶÷6wHqi‚ ‚ ‚ ˆd‘ÁPâ¸ß|óÍÉÊŽh„ð<‡Ã §Ó IjðÄ ‚ šdBMµä ýÎäí),Iê!û@D4ÈFaÙ‚ ¢‘J‘°à^PPP¯ýÛµk—è©‚ ‚ šû|E¡ßBóÜ ‚ ‚ ‚ š îÇ�k?Y–Áq¶nÝšè©‚ ‚ š«j·„~;xk KBAAA$“„wA`2™pÚi§áì³ÏF—.]’X,‚ ‚ ˆ¦Ki ¼Èú@Û±), AAA‘LÜW®\‰ùóçcΜ9xâ‰'лwo\|ñÅ5jrrr’YF‚ ‚ ˆ&E¾¿`‚€ã-]R[‚ ‚ ‚ "ip²,78jüöíÛ1gÎÌ›7ååå8õÔSqñÅcĈp8É(g£¡¸¸:öNMŽã�„&ED„ìA(ÔHnŒÎÐÙ”ƒÚޑ⥲ADƒlAF�} " ±99鉟7‚{�@ €U«VáÛo¿Å²eËÀq† †‹.º(î˜ï��æ.¸A�%Î x±ì[@_K'¼ž{CŠKDAAADÒÁ�Ob9 †Š×_¯¿þ::vìˆÅ‹ãŽ;Ès«9Àql638ŽKuQ‚8Ê û@aÊ%gè÷ –®ß2ÿ=ñuIDAT),ÉÑÙ‚ ¢A6‚ #È>�TÚˆ„c¸³Ø¿?fÏž�9sæ ¨¨�:uÂwÜ�Ñ£G'ó4ÄQ Ç&“�ÇšÑED$d"Ly ,¸÷·vI]AŽÈ> ²AAö� ˆh¤ÒF4Xp¯­­Å¢E‹0{ölüñÇÈÊÊÂ\€Ñ£G£ÿþÉ(#AAD“aVõšÐïLޞ’AAAÉ&aÁ}íÚµ˜={6/^ Y–1tèP¼óÎ;2dD1©ŽóAAM‚€,A„?€¶bvŠKDAAA$“„•ñ«¯¾v»§Ÿ~:Î8ã ¤¥¥¡ªª óçÏgîÉ%—$z*‚ ‚ ˆ&AI *$¶·[ÀÆ[R\"=\íoàE�ç9QAGÕ^ ?îwá¸Vf“mJuqêE@–±¦Àƒ 3�ãsÌ©.Aq„iÐWTmm-–-[†eË–EÝ�ã8Ü›²,ÃíöA¦àiAh û@ ‡üå¡ß§ÛŽMaIØpÞ]0ç�ør_†”yù?'Ù‚ ¢A6‚ò¿õUø¥ÀøvtkX„ƳPæòn¼²® 0圖èœAÚÉ€ìAÑH¥�à=pÛ¶mqÿÛºuk2ËL¥È2àõúi±‚ t�} …HÁ=eáddð37ñŸ†~‹‡ï�?OÉx÷ʝ‘Æ@k*Üj}ûØ@8÷_€l°]užZ@öGÝ% Ë�‰a’nýÇ‚T È>õ~ndOMìüü>È¥;/P  œw·áæüj?ª<ìû$;« çï ýí È�|>È®Úð>²ŒJÆñ²,C®®ŒëÃI.+�ì©E¬‡O(¯Xû¹]�+Ëbž·¡È~_”�õh¯¬~ïñ¾@ ’,÷Ç$#É2 œ~4eŒõ!û|�}QêL•W8“rw¾@õ!Õ*ÿ€ìóF¿¯ [ª;ÖE¶—ùà�R^Y–!—A–‘‰ì¾"9õi 8ÏV¥-¨ôHðIìóË’9P§UWû—)6?²Ïu{­OBaµ/$¶@‰+åˆÄ‘«*!—®ÇþP¿’d¾Ê È’ºÏø$ÿ[_ú{ÞîZ8ýpûe@ ÛëCN?Ê4×%»]1ëä’Ã�·lÐÝïÝ>•-•ÈE‡â³¡•e�ýÑŸ£ »jÃe”†v&Ú9mK–$ÈÎ*Ã}„Þ%d¨ªõÁåKî³\6ê;²ŒÝ>Uù£"¹_^\ço(rU¥ê¹z$�ýU@õFý=×ô{Ÿ¤¯OŸ$ã±i~IÆ�Ò±û·ì÷ëòôdø5÷BâjÇ Eö¸u}¿±"{bÛíÆB*uˆ„w‚`!ŠÔ¤‚`Cö� €Â#(¸óåB,z T‡Ò8×ZÅϾC¡4ñÐ-°ì¡ì­ðÁ�rˆ‡î‚X1=œÆ±§¼óÕ !Þƒšš½ØSáƒ,`Ê»–}gâpþûøïïø»8,$Ÿmqâ£MÕ�œ«`Þ}æ¼ !”O”¹Øth?„C÷@(WÊþñf'Þ]½¦]ý`Ú?”£Â-áÕµÅ(Ü~-ÄW�rø2îZZ†o×< ÿž‹Á¹7 œ~¼þG%~>þبòHø¿UåxzM…Z “½ð”‡€Kí\òý>fî¨Q}€ÿº}6~þãnü™¿'”¶£Ü‡ÉËËðùÖ°øUî<ŒkïÃg«§£Ü­ÔWý¬»{¢zóÉX½S,á¼»`Ú}2<ÛNŧ€$Ë�+ËaZs ,Û�ö|ÊSúu9¤)ÏC.P>òeY†ðýXKÏÖ]�?‹øÎ…ióñ�œ«pûO¥¸þ‡2 N_Ž×»Þ€!?BàØÞíþÚxÞyÒ´C¢‘,˼õ,÷ýò.Å^Ë�/>ùõ ìºðîGUy%¦|ø=¾™:ÒŸ¿…òÜVæÃŠîЭ,Ëxc}^úe#Äݧüï ¼…¸kÎn\±¸µ«.€)Oy®¼ûÛaŒžS„Èq«…{]¸qI)æÿ1æ]} Þƒ¿ kqÓ÷ŸyA–(6C>\€}O<ˆ?þó „=·C}%Š6?Ó�Ë€ê?!=q; ß~¥+þ SÞEà+¿Ââ•›pçÒ2Üùý!T{•HSÿ‹YÓfâ‘Y‘W¥ˆ�rAžR?K€¯øBÉ �~ü?ó4¦¼EÕÀ_¹¤Õÿyï|üo^¡ø?Àžï!Ýû/lyöiü½eÌ;��)ÿJÈ7>ÜT�§V—£Ô€ìóAzöî¹ òþð`­´x6¾xë \ú]!fîPÚ‡4åyH“®€gÞ×J» ”CÞ±�ç&CZò-xç÷0ï>¦üq¨t»qã’LXPŒåšA-Y†PòÄC·�ð`)ïüâá_>ÊÝ<´ª ï¯ý\á£Àª7à}ø&Ü?n[¼•y��¯^Ñ`]ŠŸ…Pú: ðêº*ܹ´ ¯þa<@9¨k:p),{C(SÞcæï®Å}+ʰ©$üìxëÏ*ÜÿýrÈ[ûC\ÚÒŒw Ë2Ty�¼gÁ¯¸ ò†ðó�¯ž ¡èqÀ¯ ½¿±Ÿ¯ú�_‡oŒ qž- n_5PTÀKk+1wÎJþ÷4äâB@YM5äý`:0ð—¾Þ^ƒIó÷ãï)S!ïPÞ—ò*Ýðl= –C€[3€2hôãºg`ÙÕÜá§;Ë}ø×ÂbLZZÃ=·ýXŠËæƆõÛBuôäpË '>œö]h°@öû!M �wžƒ\£<¼e¥øøí¯ñùkŸÀ_X(© àÚ9pÕ7û±÷�б«^Ÿ‚[¾Ø„9?ï0¼G ïß…À+�Búá»èûUU@zÿHs¿•[Þ¸Ò�—Czú®°Ýñû!}ò¤÷^NÊÀ‡ ðÊ#y+öÎ�„Té¤~Iƒç9Øíð|ã™ÚGÄ?Ù‚Pˆôpo“DÁ�óøqA<¬|ô@ÀTp+Äòw`>0¶Î O‚àT>Å’BIBÕlÕ³5™šK.ˆ…wC¨šï¾ ¸ci~ܳ¼Wy¡ïTû~?X�‡V•C–epî (<ð6¾ÛQˆ¯wÔ¢èÀTp² ¼ço”|ã?/Wý=x÷Z´*½> pzýØ»ýÿ šx÷áó­5°¡äÕ•ýyøü.LZV†]{Þ…X= bñ¨-_ŽÛkÐ…û<¼à½; ”¾ŽowÕÀ^3�¹Ÿ ¸~�Xô¶”ùPî<Œ ­¦!Íÿ§2àÓ-N,Ë«BNÑxp»‡€óîÁ7;k°¡Ø‹_yðŶ°`Txà=dßû�sQ^½°£ÔçÁç`/}ßlWÄñ@ åû1<ý´+¿R�Ôì L�\ò&6+‘å{ßÀ¹™3pC«'0ó�æC×rÌEð—?o@†Pü,x¹B ÚÔ¾„ŸòÜàv~ ¡}%8kÿ$ü|Ð Ùë�üÕ+à+çCzõ^åã°ª¦žŠàaÉø�ü\�ç~­·î]X/Y…­¦ °º/¯«BUÍaˆ¥¯Àä^ƒ[�ÇÎ ?¦ýñ78ÿA€éð¸nQnþ± æ^?ƒO«@oÿ}§OÆ!y.L]6Ãìz{ò—àÞŸ«±`Ho˜N+�)cʾƒŸ §]@Æù»!š—Àtð,Ù¯Â˜“Þ…)s>L{DzŒù{ÝX8áD˜:,…éàÕà¼{1õ¯*Ü´¤s Ü®v ¾ßR‚ô.ÅH³T�÷€éÐm�þX�7ƒð»­öî{ü¡û ¯^ˆŸm=0ªÍ,˜8ÒËŸü‡Q¶}>ݰ]kîÅÒͳ�¼=@i1ÄK šA,}œs1¤_þX qÛx˜ó.‚XžòŶäUðÉ–(­�¼7öTøðg‘å “óÛ@>tò·Ÿ@Î߇%û\xn—í9àò¿ƒ­ê] ²ƒ‘Ö§ñô¯àk–‚óçÃ*À­¹ñz×±(Ù¸ òâoðÃ~6{±p¯ _}ºbÙ›à$'ºzÃË1xÌ4æ’ÛÁIå+>ÄÄ%{ñïE%ð<±ü]8J謹Dznlß?$p�2\Ðâ ø9Oåe©<Þ¦þU…ë€+¸Båç0yïG•³[ÿÜ sá­à½Ûa²¼‹çzþ ;¹,¼óWuÈ“qW¹ë{Qâ’p÷ò°¶"_Éá^ò– ð¿§ðÛ×ó°ïðœjšÑõ L-¿¶lÀÔ¥»0o� þZ gE%àõ`Åì%ØZæÃêÞߨô§½•~ô>E{ó~´i³\‡2Èý…¿Ä9ãʯ`Ëne�Å'Éøp³»+ýxhU9|’ Þõ ©v¾W§ß¤ ŽùA¨ü 6i7®K›€{——" ÉK^„Ù·c»¾„­z`ïÇÓ!”¿Þ÷'Ì'ïÅúr±zê‡ ®f¼w'8Á‡ Nýj­˜øS)PrÈß‹íOüzȃò‚i°ì>üÞXµÿ–æ¹q`ß›àí%û—£¦r!îù¾ ÿž‡Ág¹`:æKLY±_luB¨øH±£eocÊúÜöc)v¯ýØ¿ Ø¿ 3çýŠowÕ¢°l‰ò(ýh]ù0$0û6Á”¶¼½–êáëí5¸ra)žÏøý¨}ãY|¼Å‰må´é«ˆr‚u>Ûðò�¼¿Ñ©ó’—ÌPþ¿øÈ…ùÊï>�©óVð¦rØ & ¸VRoÈ} ýÒþÂ�‚9°¯®«Ä¿ã�Êç{•GÂ�KÊp]Ö¥8ü×FÈ_¾«œ$<Ö¢Òé†ôÜdȲŒékbbÛq0�³¢´æƒðÃß1¿ãY˜Þçr,�½²,£ÔÀý+ÊðÂÚJ|¶E±ÿÛË}ø~Ÿ m H‡Áùòà;pvËéè”±-Únïþæ¼óðÝAæ-\•ý<8HªfaÅÆ}�8µ¼Ï,Uê¡bý:ÜuòX0èˆþ¹ª¿ƒéÀ$Lû#?Ç�ަ÷Á»~…©ð6Á†[†>Oöðî 0¾?(ï%~_l¬¤Tý½ö¹„\ܵTSåù_aÿŽ}x¼‚ƒ©èAˆeoÁ$¿ˆ‡=Œo²OAÑŽ`Ùs"LùÿÆOr.æ§�ž¾G –O…Ù}*÷½®šààïúåų1sG-~+ôâ™_+€=Û ïÝ�W»^Š[—Wbo¥²· ò¬÷ðY»áðÊ<>ÜäTfhüñ 6¶8\§âǵϲûx˜«®ò6Aþê= ¦€“½à]¿£b÷k(sKpdܽ¬LñL_÷3äM€ól„Xö„ê¹0ܦTºä‚xèN•_À”–å¹ðw±ÃMOÀ\õ1Ì­_FžÀŸã²ßEk÷G0ºœëOT{%ì?0 bù»K_7ûb,; Ø­àÿƒ”¹X¸}+j6N÷î9�>}”‚÷ü­ô¿’ÿÀ�ñÞÆjl)õá�•åðK2’Œ…{]¸0ûkX…2Ê TNÇW+wbêšïaq¿ SÛ_!l½C™Eâ/…xèˆÂtàräUú0{g-.nñ"Òº”À:v#¤�^VúbÉ‹œ `*¼ðåá³-N,;àÆTéXìÛ�é¿÷£ÀéÇG¿Î†Õ³ ¼ë7ˆ‡ï…Ó+á£ÍNìòZñ9Cúïý�=nÌÞ¼™–€¹ÕLÈÎj,Ü먌iJZåû༻ðüöÊØ]éÇû•�üå>8ðËþo_6¤y3 Ë2Ö×(kÍÎŒ’o¾T*sózÈ?ÿ¬ûÒô×kÖîÀׇã‹.çaÆ—?Öí*BgAµ`Ã]ëënDÞn|ÝâTä;ÚbZQ&V…eü’Œ5î�ƒ‡4÷K`ózTÌúUÛÙƒÌ /_yõO�ç|ùå=MZ:ðû€¼Ý�ç~¡ì¸éeß5K!ôFøøšjHŸO‰)ìëØ½Øü'PRé¹ÉÆåóy!6ؼÒ3wÇž]¥=¾®üòò…�ó÷Ö¯ŒG!©Ô!Hp'‚ ‚ø�eKk7xph#d%-oÎ~!œ‹”©¼�Rp�"e»?\í/4StÊÇ6ïüAŸ§ä„eg'Xvt„iÿy@ ð'+KmLù8Ö¶ _m­TwA‹9gá˜ó.B7Ï ¸¯ý3JÙüûBûåÖþ¾€¼¿ ”–Ãï@¶PŠY pVÚªçÁ²ïLœž¾ "§ž\S2en £Z„ ÒÊŸ püJ+¦cþ®btµ„=KùêEðd˜ùpx~ P�ù N_ŽãÓþ„9°¦—a[™íÌ0µûU¸ÙÔ[ñê“%tv‡=DÛ:ð‚»l&&ä|„±-gàjá$È®õð¹óaæïµN–ýØYø' Ëx4ë\Ÿ;7ä¾ùÐc€®BøzF¤½ª»/#²aù†�àüE¡´ [|‹Mù ½¿?n^ˆßw—ÂrÞ.XÆæÁ~óo8°á ì«T×åU9ïã�"øAëÁ·òàô?c^Ÿ¡ÈJ±t_X-2ñ~kÛ„Uê�·s³æ LR/`hâ”ëÍmž:Ï•|è›þW(m°ù5ð£�9¯”Ÿ÷¬Gó~´·íÇK» ”½Žé}Æclë/ëîY�â70w· ýMß «óNÎù0ç�ÇÖ´d‹á.Þ½þƒ›Pmvà4Ç/¸¨Ål˜ªgÀÔò[”ØZ¨Êî=<û>ú´ çd-Âø´{` <@†é´p8&±èYÀY‰€U†ØSx…êÙÀÆo!}ò? 6½†g:݃L¡ fýé©;Qû‹zí«�-{& ÞuÏcöæMX�Ó�ž~?øvao¸Y‹PXy.OÄ s:[vc^×s ÿ>ì5³�)(Û?O? ZŠì­T r5jý2Ê*·„Ò®i= € Ѷ'íÌù¡ßÒJE€­pK˜»Ûø !B ùt'Þw9î?ã1Õy<¦p»((ßHN”ÔÍÜÈ*pmë)È?¸Òu½Ì^½Øðvä• ‡5ì¡'tRη!£G(mqça€Ý™�•² €…{]pO5…E8=ãçоå@W>l#òÏ@TëÂË,Ís«B¯¤ Õøfg-$Mx™�éËðK�'doàdǯø½B„P='”Öúô�øÏ)“°aÓ> ú¸WÇÚU·`éÎbÈ�pži‚r�ž°¥¬B¯ d ¥”òYªÑÞ*åã²–ŸúY¾×ÑàRl¯P^Ì[ºñGu>Ûªö0ÿûÐ~ì¯òcRù±X×ãXpé>,I?�)V„öË0+Ï ¯×îU궺»€ªsÝðgJ`EÖhi ÷›ƒ?ý¹¼• �ÿRŽÿP„�šEsðú•ø²2]uüJûèlÝJ³¿Œóܨòx°øï9ð¸ö`æŽIfTX3ðã “€ís ;ÃSZЉCÿƒÇ/º;OÊ�ó�5ø¦ÈO–Á¬ØCΗ'þt0ïG͹µà6ÍÄžJ?‚M£¨ðpù×ÁTþ>v!\Ÿ™�upðU°ñêöì—-Åb ÉøVžíéšé ÛÚ<1E¥øÅ— ¿`BWkøù%ø–“.¢�9å_p‰6œéPdøŒJˆ'–á÷Öýáñ‡¯±Uù7¡óôµoÀÞßgBzç9l™þÞX½>´ïZ�=Å»ñâêm¡÷Þ·®Ê¥dô²+¶�ã{w¥ÎÍš®�ÒWðŸß*°·pu(ÍÜïoX9W]]ºá®Ø iù"Èùûðéß»1B‹–y°œ½ü�/±qÃ6Õ=/]4 > hg>€›sß@é¾Ç!¹¡÷DÇÚð=ïP‹OK3ÑÃ�M'•AÞ¶Ÿý½¼u׳µU¿ÂʹÐʾ—Bú:åÿ5?…ÓJ¦àÇ<7xpšãgìîž ”—bÞo{ÑÉž� Ô,E…Kyϳr.´·ÀÞôŽ�—ÌÁ¶ru¨#yé<¬Žû|ÙÖ„ßMÞü³¥®€ÎNü¾ú/]Úܲßß�ýX“{" í9ÀŸ¿B./ÁV¯-´ßç�σ|(¾ªð,¯`ÆÁ¿·~öÔ=`Ö¯û”²nûŸ|µ ÏüZ‰ÉËËPë“P¾e3&žõ,þ5òM\»Ñ޼*?ä‚2k>xN¯rH†âíÓªúùpZæR´3ÀnwÏpžœ„‘ÙóÁqê/¬kZOÀˆMøOç{`ⴱʕ�ý®>¡4³;ºYv¢È×Fµïc�žDU 3ô7?:º^uÙÍy£�!Tã±NÿÞ7P„^Ž<ÜÚæuô´)»bùT@ wø´‘~R¥™\ ¿·P•¶íàï�}!páûq²õT•¡ÂÙ!”Ö˾.§~-$¾ìÈbŽ*mr«« Ë6UÚó]î Û=º…EÞi¯àñ ê¶q}îT Ëüætuüè+r>Âoù媴krÞÏ©ÛÑàŒåº2^Öê3Øy'8S¸ŽÓŠø®=þôôUh)ªÛVën¸%õõˆ¥¯Âlò Ô¾vsÍ0qLjû_Õ¾£r£&�¦J³õø€Œcla‘Yl½Yõ5,\�4WUH€¿‚ëSÙþ|ây¨<Ë�šsÔ"äžšØ÷-&ä|„A«0»÷,Ë:nÁŒŒƒï㉎÷‡€fuóˆdôYˆ{ŽÅO}O†3͆²´LUž£ZÌÆŸ[Ô÷íÚÖïbQça0O؇+3ÃìÞ#0 í7ÄCº Õ~G(­‡múÙÿDu #”fçÂâ Å=PS¶¥5ʽjeRß³«[¿Ÿ‚8¥í ÍX‚^eg¼$jª•븼Õ'¸ºõè^s+¸%OD\×TœßãT·àãE˜9µ¨#Õ‰³r¦ãÑcå1àãEäÖcPúrÌé}6êð~ÌóÀõÑ›8äm:¶¸E&déõ@aáÁOϼ×ã <Öñ!ˆœ36–Á'éCk­;¤LoÊ} ßîT‡“È*PaIG æ˜PÚ16El{mg ̯Af«8#w! ßÃËëYqet•n�å’˜Õ{$Þîöoˆœ™\X˜½¨Å7pðUØé /Â��UŒ>¶¿à’ìªÜƵú\wG];èi݆!ãfÁvû6Ì;qrM¨„Eï4>hCÔöú_9€‡ot»mìDë[þÄmm^� y&Y"„úßþÜ ßœ‡ñíÎr¬;ìÅ�ÎÄ'ãG¢b „YÅV,ÙïÆ]†¨Ž¿ºõ{à€7b`/ÿ™B9ƵüOw¾ÎÂÕ¦3ÐÁ¼Ò~Ç�§¼Ûu»`-8%îE�2d¼×ó*ô±éþ;-ÅÕy.iù>8HøOç»1>÷3X,“QáRD¬cm›ñHÇGa®ý}ÏãôôŸU}®j=‚fà3C¨ ã�n7à‰NaAŸ!ºú€ N á á¾öO�/�³ÒÇ"û!Œi96MšG0ÃÄ©ÅÎN>eÀìéÎaoج~ÑݺVÎ…é=Ç£sɹ°?´|‡´ÐÔG¦XŽlQ½nŰv‹�¦9w›v �w" ‡í£äTúù iëðJ×Û`µ<ˆãn_ˆãí §uÎÎZ à3|¸*G 7±Í«°¾æ‘¸ÿ˜'ÈÈÃ}U8µ/œv+v¹ÃíÝdV®¹Úx£Û�è�=ö‡6â›óÏ‚]PÛöªÝ�£Ô©~�L{GW¿\šrÊü-Ékðw±O÷üº¨Å,Øø|Û{82‹† rß+�ž½•CöÄ�EXý‡Zp¯Z£ ”ÝÙöE\žó):ù?‚#ºYw Ü1lUÎéªUÇ»¾ÅnÍz¹î÷Ф¾�¦y€ìUÝ¡ò«:‡…x®Ëݸè¼� Þ¾i»tïuÖÊÁÃ�©=®ÂGnjúqíQûÃ<ðš¶.ýôZ[·d ¥ñ•stû=¶²D·~Ηnj†¿²B•¶°ó0Tÿ²Ÿ»Ûâ¹S&ᦳ_ÄS§Ü…¼ÅßÃÍ«®ùy)—ú>î\¶ ðû‘é Ûç�¥Êâ™Òô×1˪ .–¹%ü°ß�» Ã�ôö7oÆc+Š Íúòª%�^re]{ʈ˜¡êv;6�kõ@^»¨Q¯•!/œ©üE8D‘¼}#Œ�«*  ; ZýÜ’¾ùXñ¨ÿê=È‹fBþ ÎI£BÝgåÅß@vÕBzãIÈ?Î…ôÖ³†ç¤…ß äßVÔoM B îAAÿ;¼aOQöL�Ç¥PþPp‰%Ï‚¯Q{‘ 5?@,z�õ õiª¿§Yè«—}³N´îhÙÿÊù äõ:Þ¶ 6^}î�«àÒ­pjú/ª¿Ûx¿Ä™?鄸–ý¨ôg©ÒNs,¯ö;û¦âø´õª4Η‡QÙß@ËYÖiœ±B•&?­ÛÏ\û<’ Jãá‡àúU•6>ó9>¼Dwüþý&õGdá/ŸêöÜö;ÈuH"çÏëczŽi1C—vQ ½ÇÒM¹oêÒrLEà¡n[§¦ÿ!¾)t²ìÓ{Cî;˜Ôî•·gûô½8Ö¶™‚ú£ñéÎ÷£_ÚUÚS�@7«Þóë‚sTmN@†d,…‰W X§¶›«Æ×ä8„nÖ�º6Ó³óߪ¿{¥ÏGfý¢vƒô®»mnC›¾ê¸Ü½[ü…Ú³Õíú´œ•X—{<Žö+†d.Ã;ݯüÙº/�Õ"ÙÃÇþ\õ ÑØ–_a/¯g¬€Ï,Bl¾Î—ºÞŽ4^-ÊX8·â9AzH¸Q_Ó•9¡&þØN‹ŒFvœ�%—£kÙX92… Õ±ÇÚ¶¢³U½�nFݽÓR‰SÏùòÐ-ÿaÀÙáéôÖ+÷¢³i7Z‰‡quë÷Ñ7í/ä^³Uæ4šÙ-µ&Ú˜â†Üw0,ë<Ùë~,k?'à™Î÷!M¨Áˆ¬EÈ;9NÑ®ºÙ*ãï–½aÕyVÕ4˜+>E7ë. Íü—µü …>·è§Ó/Þ£®ß–<´ü¨»î¼ô@™zPB€9Öƒàø°-¼´å—ðÉúX_�l1ìÅÜ˾g¤/ƒñ ojqqËY:¯ê+r>� ¹çÝý)£Np?3C=PxS›7QQo6±n=�pvjú ÊX©J×êK\Úê UZ{sØ«ú¤s— }ðbt«}D¹.ÛfÜÞí%´;k3: Tú¢V ëfÝ�‘ÙóàŽDà¹zÚ¶á¦6á8Ãé|®ný>îk¯¶Ï2¾Âè–3C[ZãŠV!KT ²­Í{pfÆRtˆ˜]Ó³ê!@o›Z»¶õTÝóot‹™¡Á¬ BÒx'ÚšÃïKúžŽ Mÿ1”¾2,s ÎÏž‡û~ évxT³ à’3�k:¤J+·dêl«Å¬Ü·vfu\› 9¢§m›JL¿ªç4]}¤ UÈÔ¤uÍÞ‰S«Ui&‹ãZ}®ä X•�±;Û¾¤Ú÷áŽ�#ǤðÎËž‹–b1Nr„ û¥mÀˆ¬ªý„4Ffχ7BÐ ÎP¸CsžÛ?©šå§µX‰¾ö¿TiíÅÍèbQ?;¹�À¶¼Ù ~�Ý;Á±dÏ�¥nÆ\›AÛ�ôJ�Ýڻй•úYq 't÷òÒ–_Â1à%[;­m-Z­RÍB€6ò2oW¿Ûð™^ìÙ÷ ¸{Ïñ~Œkõ9èðT(ÍœîÆ ýnÖ]cŽûô²mFG‹ò\üwî{Øw§æßïq>ªË«à‘¬áss^Ý@Á¾EäŽdWVW¬Ý¢¾—ɆyÆ·\·PÚºÜðˆ|œšEÕo‘ÁéQ×yA�y×Xa{[`i‰•«·%ê�—y»k±¶åqª´bŸ€Š-á�wù·åÊ�u—Í4‹¥Ê‹¾œêë–W,Ò‹×"ÛùF®­�ôÈÍ�» Òê:û¬ð±éÈ…gkÉkWA®ªÐ•å%�WE¼sjÖ‘×ý é‡ï _G–I’ ÿ-ˆÄ Á�H*RY•™ ˆäCö�hîä×-<Wdœ‘ÜÌ%�w–ÿ¸@™n7Ó¡›uiBõl�`o„P·ÐV�Næ}º�Ê,±Bçå }íBaU‚´2é¦×·KUkAFd-Ô¥=ÙéA�gZ¶X¦¤‚ôÓ|€åyV¦>¼N{n�.͈ Y¿(¢Ýù™.­³ë ]Z7| Aã¡X­ñЀ,säR}|Q—y­.íâ–zqýˆ0ªK;;ó{ˆÁ¼W]hƒH2,eè—¦¿çmM¸ ÷>™SÄ€È6Ó§ã*ä˜ u÷qú±—£‹UÝ6.êÿ¹NÔññ¢Jxê`ÉÃÂÎÃàÔýþžcþƒåN‡W‹sÞ‰ù]‡ƒçÕõ‘e.CZí'¡¿ƒá¶Ö¨c¾¦ñÕ(rëÛ@äà •rŽC@R×Q†P©³Ä Ý€ž™s£¥ÆKFfχ¨¹—#³æëúéÀô•HÓˆ\!rMŠ|‚ãUú™K¡^2snݽ€ó5×(ý4’›Û¼ ;ï„™sã8»Ò·Fd-Ààôeè.eTî·8űšyž ²¿ÓykÅm’±-ÄRUšE¬B_ûUÚMmÞB¶f?@?cçXÛ<´1DK“zßž¶í86b¶ Xx†dª/‚“y/Ç´T†¶ÍR옶œov»N××2Ä*œžþ³*-/½­n?»Ui[jûªÒÏÌX¦;O+Çaô²mV¥¥ U¡A³H‚¡ã"˜¾B5«È›¥ôíó¸µé0ú§©Û›™÷áÌŒŸÐÙªà:/{®î<çfÍWµ¾Np—eõy2ÄJôшëtDtá’½n�aM}¦ Õº´ ¡J×Þì7íT…ü r\Gõuïè®Ìh3ñj[8,s rxð^lå‚•séÎí�8#s©î<#²èÒüstެw ªpn`FÎÉZ¤J;é„8Ù¡v&È<á*]>]ÿeõÓ_zti›9uiK²ûÃÏ©Ê¬ÙØáU¿'–›Òñ±§“*­Úœù�Õ�4φ·Â—=G«Ò jØÚ¢'´llÙ;ô[þê=È>/Ð<þ^ ¹L¦åÀÈÛ4ï~?äeš{#¼SìÚØå÷_Qâ°kÏ @Þ¤nSòò…ìýÖÿ¢Kéë”Å׿|7´ž†nð`Õ÷ª5\#©Ò!ÜÏ>ûl ><îDÓG’d8�H¬À}A4kÈ>Pä´¶Mâ‚©Àiwà¼zQÓðø€^Ôe¢ñš· .¦ws¤Wl�l±L¢­ù ÎÃ]à:oM@çYØõ¾Yb¹N\À<´Óç¨ÄŸ ‚~?#Òy}9ÍÐl²h!ƒÓÔ™zA|‚^ —ù ]Zk“~?­àgD/û&Ø÷¢­Æ[ÐOubåõÕ¹æBÆžñÑB,ÑÝßžÖmpjÂÇzñzÛõÓ·[dÄÏ”ÿhë}¼:ÜË-mþ‡“¿BàÕyÚx—NXØ÷²³Eï�ÝQÓ'ÛYòuápÚu Ìlˆ$èýl�èk�v|„)¢di<0ïìù:[öèÂ=Ûé^ÔjBžz¡¶Ûµ:Îì‹·éÄz:§UÀÑ©Du��,{Qe·ëBYiim*D†P�Z“ZÔ9ƶUç9è=T3êÂ`”Û2uéY¢~0´»U=€vNÖb¦¬= Ä×ö ž“uíŸu¿ú¦)‚dP"r�ÐúT§ûuÝÐÖ¤·,qI˯uíõéÎ÷Ã/«gõü·Ë$�'= \§öü¬k2ó^ÝŒ:¯j@ßÞèÂ¥Jˆ¬l†=Ñ>J‹äXûf� (žý‘!rú·^‘óéDÕ^ö-ÌãµíhâiÏéìuÇö{€Àpc›·uéZÓÓ¶M7#HÙOoÃí|­*œ[Ït%|Šö¹@×§`(c°»£ÎµíÀ**qȵ6rD½mw0ڌ֣۞­´}­}Ì*ƒ>•Ìk¢™5œE}l›J=èC0ytýïÎv/2ûk@$Ks=û½,�q,]ˆ7€={qpúrÕß׿Nƒè¨�«ŸÕêûxq©þ=¢ÜšÅ,c‰9S—&sêÒÑT•ëcà‹c/aæ«¥ -W��¿O'HŠaWJôýDÎß§NÈc÷Q¹\Ýçå5ËØçÕz½æCfíçÔ×­ìvA^žÕ)ÏùLÖµÇ{=@U³œ��Tê îýû÷Wýóx<¨©©A×®]Ñ·o_tîÜÕÕÕ8óÌ3“Yf‚ ‚ ˆFGQÝtqDdñzq°A0B°<Ü ñëEöyô´ýÒþÔ¥±ÄW»P«û0ìdÙÏüpgy@‰ÄMx“,¡Œ)Öh§ïzï5L±¾>Èàbïd€C¨�I3‘iÑø€dÓßs+Ÿ°/YbS¤ÒŠûƒúH�.Të>æû¥ý…|Ogݾ¬r²ÚVº�-:$›VYú¶Œ]‰Àta{€ð⋪™ã8ûæµWúõ‚¥ö99"ksð�e[-¼ª¿omóŠ}­uû²ž+¬Á{Ös;C¨ÒÙ­væ|ûsuûjûÝ ?]œúÜô˜8¯î<b…nÀ-C¨„êA#ºY'€ÞNû˜¶ÿ+ûªÓÎËž§Z !|}š6¾¿Ñ~ffßÕ÷}ÀøžkÛòKý:/ÒϺý*=z\lJ×¥5D"]Þa ün7ùúà4i†¦9œq¾GhŒɫ‚ìd¼?Ujâ°/üZµj·º�ÉÎj¶×¼G½_àæÑ�|­ÛMþù¶°/“Ó\"$,¸¿öÚkxõÕWñꫯ⤓NÂI'�„U«Váý÷ßÇo¼�éÓ§cåÊ•èÛ·/zöÔOÍ š<Ï!=Ý žOüC“ ˆ¦ Ù‚{¸çˆà¸$÷†Ž@E܇kC5>�þ£0[Ð ÚÒ¡}âËs�õ1nD†¨þÈɢ¡.‚þ”%ø5ìØx±k®Ç.Ö Ö—¥ÛÏÁðV³ ñ…ªZ!`{ÔyÊ%3ïÕ M»>2D–¶^€±˜þ™©ÒÕR†.­?#ì ÕB�AX^»¬8÷>Y-¸OÈùˆáqX ~¦Ç$K@½¬•~-VÛè§ S(â¾6t 8úú`Ù–g¿6$EGÛ~ðŒúiiÖ{EÛÅæ@ƒ/ Ž¥kå=¸¨•>üÒ¤v/éÒt!?êÄ©2{¶&]Û™u<œË Áj€zöAí ¥ÀI:�î ÚÀØNLÓ‡­b‰É}útÜvÛm0™4/)V+n¿ýv|ðÁÉ8 ÑHº€@D“�ìÑœqJnÔÊŠ(ÑZÐ{•5Yÿ¢w˜œÄÈuû1Äd­à (B‚OÒ{|±<Y¢K‰—lƒ�2,êÍ΂åñU´bgšP�=ÞN{yX5ëž·¨‡§é‘€N€K4û§¨Ï«_°è© Ebt–À5ºåLw}¿pIñÍÊa…Ø0ÊSëm ­! ´k?@µF¬¿¹ãÿ`Oc…L¨Ö‰BÝ2¶3CÊð|â‚‚¶Î[Š¥d}H ±‚é1Ìòjn(¬�±>Œ�JýÓÖ±�gôs– 73ÊÎqœ‹®Š·1ëø\F¬kVø ’NÍ5B…¿…n_m¬j#XƒXÞ­ŠŸ„=P¢¿—Z¯÷~iÌX©Ðÿ\绘¡ÎXÏV蛪ûý‚åmiB Ó«š……ó0íI+F87£�£xay¾³âʳ`y¸w0ëíÖ‰½¸™)T0Ãp±wVŸfµ¡^¶MÌçW¼Ï Öýa *˜ î#k°š…v½€]FçÓٸܴ´Ò<{Œ.àƒg ÜàÃ>—7ÌÃݬ~öÉ¥EÌwî¸Ñ ßä-ôû±¼Ô‹ ôinͽ.+f‹ÿŒó2))TBÈh‘÷Zl©Ò!’"¸¿¸ru{Cyî¹çpì±Ç†þ^³f Æ�‡`Ô¨Q˜;W½ÐÆ'Ÿ|‚‘#GbÀ€¸òÊ+±iSx‘%�ǃÇC† Ái§�†I“&¡¼<þ�U‚ ‚ ;¼á—ä6bÖ8C¬‘ŽÀ; ÃÃ�% ö³o`~x³Â°D¡†ˆÖ,yq¨²>~�6NbŠOÿ¬Y YŒY Z�ã#†. –øóOQÁ=Þëa‰:,ñftKýÔñSk˜î¬~ÁZ—K”ž‘'«ŸÇ+”jã~À žKtiéB¥îÇuþ <¯¿QH\ôÖ(dˆ•ž¹XgOu¬f> [�‡- gx“‚!sàDßV9ÈðÉjg¼6¦CLᙟœUN²Þ»X¨`ÆÏnVÞÍÒYa?Xåd¥ ÎXÆØÏ§«ÏL±}‹@³` DUùõ³FŒÊ/ñÚL3ïe†Ø9°î�v1áú˲[£²õá�޳ÿÍ|·a{³ú¹>�µ8ÿ=c ¦°ê‚5Ë`¿ƒ±`‰ø,{ÀAéÿú2Ŷ¯ÚÅQ“+ÜX¼¸‹êoyåb Ðñ™áá‹UŸï"ŸÚý*Ë!oøU¿_¼øF4^÷”’Á½G�xúé§±w¯z��Ý»wãùçŸG·nÝ’q[·nÅwß…WE/**ÂĉqÅW`Íš5xä‘GðØc�ý?{ç&IUµñ÷VUçž°³³9–ewaÉ KIŠ€¢ßšˆŠ1  ò™³¢(ú)" s3*",9ì.›ÓÌÎLO‡ªº÷û£fº»êžê©™éÞIç÷<<ÌÞ®¾·ººêtÕ{Ï}ܛɿÿþûñ•¯|ŸûÜçð÷¿ÿÇ{,.¾øbôöz'ý¾ð¬Y³wÞy'~ó›ß@)…øÃ Ùw†a†a&O+ÂöO.¨ÿd†{´¬õÁ�£?RY�‡4=HZHPbå:&Y»0�ð…§hDVi#hÙCv-KROimó’kµ¶C²”çòžƒÃ(±ª!*ƒU£Š-Q…š×´éÖ(+3“ÙÖtÖb4Q“®:�Vò¸SpQ¡¾ïEíOkmY³›ŒEmI]D4 }sD1^ ê˜�=ùv-öè–ûÉÂÌ�°·Š*ŸÐú«a½Ÿ~ (ÍV"möbQJ·@¢sJ¸¥ÎÕÁd`G…Êèk-jÖûÑ-ºànI~¦áV ˜F£²È  *{¼Ôûz¡lʨBëǵþš<_ÓÄDéïO´Úô7ÒK=êäß(Â&$¢ÚÁQûHNŒ —ܧ� U€kè©õ@CöÔ,mÖ¿t†×¾¸CâûjÑWé K „܇ËÏp)ê"¸ô£ÅóÏ?�SN9pŽ<òHxà�8í´ÓðØc�áCúP=†ñ!¥ÄÕW_�Õ«W—Ûî»ï>ÌŸ?¯{Ýë�H$pÄGà¸ãŽÃ]wyEuî¼óNœ}öÙX¹r%’É$Þþö·xà8Žƒ»ï¾—^z)f̘�ÖÖV\qÅøãÿˆ­[£ûˆ2 Ã0 ÃùÎî?”ÿžÓ ˆ AáPó6!Qúƒ&•áNB #jVÚ`ˆ*À G„Ø“P…ßö”—+Å´XÄ» "ª¥ÌH2‘(êç¡EÑhïMÅÛýº lC((QÆ€$¯5Ê^$*ÔgLʼn L!IQ”.ô©CejRÅ&I«ˆô“d?e»Óˆó—ô…&D¼°EQ ‚ôù"@‹ÉÔ„LŒ?ªØ ߯+Uô;l|꼎z� "c¸„M"çZ›LØ<…‘j@ J¸Q¬�¯®u,£Öˆ¡®ó°‚ã{jr˜²UŠ 9ár_EÅÒ �ÈpoÏï„$¬j¢2ÿ÷ÈPÅP)õ‘d {¸�$u™B:è ƒð»ßý¿ýíoñÜsÏ!—Ë!•JaÑ¢E8餓0yòäz ããŽ;î@"‘Àk^ó|ñ‹_¬Y³Ë–-óm·lÙ2üêW¿*¿~Ê)§”_3 ûì³üqì³Ï>èîîÆòåË˯/Z´ÉdkÖ¬Á´izÕk !t ¥Õw‚RFýR†¿¦”‚Rt¿½7J¿CyoÿkBw)—+ yŸ*ýÖ÷Öê7ê{õÝPǰQßM£ŽáHŸß| ÇNŒèí-–?çðúåÁç÷`öiä�aQúo¤çÆÛµ¾‡ ‰B>ÑÄš¨ž �‚*âG1,e€èl#IÊÜ3™�aDÍÀI'¸Ýi0ã�vÄu#²˜£–ñ8œóz0«S†“ 5«9lŒ¨¢[½D€ #âÑâz´ý4„‚AdDR¶ÔdÎpÆ.TÆ>} ê~šB’–NÃ!,gb;ìx�ÛcÕÊ`hÄŠ� Ôä!=öP«pèÉÌèçÛhƒ¶Í¡÷;ʹNy¸—’–¼ÂÜ‹ßý½”ŠöpIj<‡Œv=ðtˆþm‡Óï`©Ûš�––œsÎ9õê®&;vìÀW¾òÜzë­¾öÎÎNMomm-û°wvv¢¥ÅŸ‘ÐÒÒ‚ŽŽtvvš›ý¾gÍÍ̓òq�Ç-$~¿:Ûv�ÏÛ0 �lV÷gêêòntS©8LÓ òùlÛE,f"™ôWmv½½^€¦úíîÎC) ™ŒÁ²üÁ«P°Q*9°,é´¿_וÈåŠ}ý&€@�ééñDõdÒB,æ?…ŠE®ëÀ4 d2¿+¥ÐÝíÝde2 íbÌåŠp]9„c¨ÐÕåõKÃÞÞÇE,f!™ô÷Û … �aÿwCÃJ%–e"•ªu õ~:†Å¢Ë2�Nû�¡”==^¿µŽa"a!÷÷[*9(ècXýݤÓqFðá8’<†¶í"Ÿ/Aˆ�ÎïLÓ ûÏoúºÈåj�ß(¥�LÆ‹…�߃?†ýßM­c8Ðù]ërŒðÎoŽ#ú™1bk¡³ü÷,k2Ú²ÙúÇ"Ã�*p:\ÈLú $c¡Ã@ôâ±ð@G™ Y)0–N–^5R‰È>âƒe0þÆQE;ÚÃ=ú8¤//e2Œ K8{,“7lü¡BZ= BdŠ*ÒÖëühœáÚEÏÞ¦3Ü© ž¨Ç³“ƒ!ª}Ó`VNÕû7¨6iƒ™ÌÜS¿©{bò%lÕIÔÕ(TÝŠÁØu�…û“ÁÄK:pjØÆ¸Ã,�Jö9LOd¸vÑwßÓS€®çz½éS¨'º1Xê&¸¿ôÒKøîw¿‹'Ÿ|;vìÀm·Ý†)S¦àG?ú.¸à‚z øô§?�³Ï>‹/Ɔ ~CÕÙ•Cy} J%¶í¿8ú»”R¡§'|‰s>¯Ûþý±mŽþ^ªßþq Ábjýý:Ž[sŸúE‡júg| Åb%  !‹™BÀueÍ~û/ªßzÃþ~mÛ�ãÐ�K)úö3¼c¨¿v ýýý‹J¥`¿•mjõÛ©~©cØß¯R}7õ=†ýï-l‹aý6æt~×:†5F!�[åÏÎ1¢Ç�ñ#Öç+ÅãW¥—7(Fèç®’…ºçå(eï‰\ŸqT ñ Q—Ï7JXÝÓ”dÖZÊ?Þ±U|XÞâµ\ÑÔ¨î”àýA=ÑÎc8+!Æ‚¥Þ…)á7옓«ö�ýÑps`x«'Â2Ü£ž›{jRb0 wµÝçèÜ£ÚI{nž£ÃbÌp&ôs^�Ë;*¾…M®B"&íš‚»Ó€ w{Ø}6þ®W ¾û{/Ã}”­lì‹çcQ�(•\ÄãJ%§/»Ý{-ª‘HdC·ˆºî�<òÞúÖ·"“ÉàÀÄÓO? )%6oÞŒo¼ñx¯ýëë1|ðA<òÈ#øùÏ®½6iÒ¤r¦z?hkk }½³³{íµWy›ÎÎNd2•â8»wï”%Nõ²oŠþ/~°¯5ªßáíSe)ªNäÑ÷YGc¿ÁcX¿}jT¿| ‡ßïè;†{"F‹™>ás´}ÖÑØ/ŸßÃïw4ÃN§"„¶éÆ|V2ýþk�ès(”Ti„ Ì-ÛÛV±�7b"a«yÁ=ê¶�ب‰¨áŒÓK¤=•áNŽ=á·Þ“ƒ�¾'¸S6@ƒyÿÐãðhÌî¥-B¢£þ+?ên ÆRf$'“êMØgŽà>˜ï{,XÞ f%Š€„%]%õB¤}¸ ðpnŸ{ÄÃ]Jýþ~”f¸�U=¢_‡n;œ}ŠB]ÖlÜxã�8î¸ãpÿý÷ãË_þ2b1ï¦Þ¼yøð‡?¬Y¿ ‡{ï½;wîıÇ‹Ã; gŸ}6à°ÃÃ’%KðÄOø¶â‰'°råJÀŠ+°fÍšòk®ëâÉ'ŸÄÊ•+1gδ´´ø^öÙgQ*•°bÅŠºí?Ã0 Ã0‹gJË·˜™[ƒQbõ²§°U|à�زn‹9G5,¸×�¨çÖPh„X¹§ŠÅŽ6�üÁ|î‘oé è=ó� Æú&rŸƒ˜tÎDËhœ4 …™G~ÀžùÞöDAÑÐU+‘÷áíãhœt 2Û* ¦t!j²n�ì÷¡2Ü>÷ˆ‡;•Í>J=Ü™ÁQÁ}Íš5¸øâ‹�ë7¨GqÖ®][�aúЇð›ßü÷Üsî¹çÜ|óÍ€{yÍk°qãFÜu×](‹øÓŸþ„?ýéOåìúóÏ??ûÙÏðè£�"ŸÏ㦛nB<Ç1ÇÓ4ñú׿ßøÆ7°yóftttàóŸÿ‚Ãü­ "`£ Å«™Æ³§Îƒ±`yGíc¨‡»�°” £ÿsU3œ‚«‘!ì·Ô(ÍpgG]¦�Òé4Ü�¢³³“â‡JKK‹¯ð©ãxôôéÓßüæ7qÝu×áŸøfÍš…믿K—.}ôÑxï{ß‹+®¸;wîľûî‹›o¾ɤgÞùå—#—ËáŒ3΀ã88öØcqÍ5×Ôm߆a†™X(¥°ÑÙYþ÷ŠÄÜzvkë•ÎË€»»ö¦rÌQcS [F»·,ªRЋô ‡FÕ ŽŠAEÒVñËzã(kÔe²62Ã�FR(M�ù#—)½oæ¿ÃzÿhŠ}ÌØÂ–Ö¨›¸c*”d|PöAa„Å/ÃÝ©™á>y¾uJ†…¸là¹;2ÜÕãÿ†X°d¤wcÌQÁ}Ÿ}öÁõ×_�/ùË>ÿsÛ¶qóÍ7〨Ç0$³gÏÆ3Ïë•É0ã�¨“œÃ�<md M& ¼L¢µWK!¼¢©Æ0TOJD7¤ iê÷@fH»Ö§t!�Úöv¡Â½0H;};A‹ê¦¸�á>ÊwØc÷9~$uˆºLù¬\¹?ýéOqê©§¢££3gÎD.—ë^õ*üìg?òeËê1 30#5†a&&˜‰È&gWùïsšŽÁ=!T&otÿjÊÜ�èÉu;€eKEÑ’LÔÝ·Ü!òUÜaæ°PŸÑ%Dtz;kXE½¨Ï3!<ò8DŸƒñØ�ºOƒÙwª¨nTÁ}0çðp ÎƒáÒˆ"»Q¯I† Œd=‹¨1f¸×TQÖÂy8°âŒb0±¹Ñžn"P�©†öo@ÁTµ‹¦Ø±Ó Y•Ö>”íŒ0QÝŠx¿a†lgõýSýd)Ö§¶]�îUÄèª4XFJ‡¨ËÝô¦M›0oÞ<|âŸÐ^ëîîÆÿû_¬\¹²C1£ÃÈdèé)@Jö�`¦Çf¢ÒéæÊO6›êÜû0¯%AÛ]n+€õZŸ¶²´ŒÉ^™FÊÌ86õ�õ¸ÑW}<�_Ž9‰õn×í6cJl[¤>ó2¥yÖFrN“â»|mÃõò§Ž/µ?]N³vn nœú‹ÙÃ)P\’qíŒÝÐpÈËd¤˜Õé´j×Þ`ŒwNfÑjøÇòއ_²ULËÎ¥VÁ †Á2m8*†8‚«®ôÏ#• …ã°•=õ†²z¡bG^ê“ôÔgÌ8ô1Š~ÎPÇ3êûÃwê¸;D,¤® JD—Jô�ãïs8¶=^‘Ñ‘ñ…;ÂŽ›¶’‹ˆÔ „zN, ¨¾¢©ÃÈp'îuÂîRn�Qú$2ä÷î^�ÿ´--ÿ;ÔR&‘r�º“§;÷ ±�ó,Ótìôþ–ÒoÿÒ¹3|§M0"ÞÛÆbÀÀ·hÃzû�Ö´aÃ<òÈ#Bà–[n!·I&“¸ôÒK‡3 Ã0 Ã0̘ã{Kùg¼T�IÁêøf¤m© weM‹ô^WèpÚ0;áç»ÜLÇæߟ“´Áÿ0!C2M»‰ÌfJ0̹mÀ–qÈ:?%t¹ÍZ[AéûX”I$Œ�Åo[]ˆØfOÇ‚ä‹þ¶Òt,L>ïks”9“«×Í`’å_•ÚíèŸ'ì!›jï•LF�Ã>rD&ý`÷^7C´¥5ë€.'Z&<@ ZÔ¹åJ¦á?ÆëºcvÚþ—T"²Fá�í?‡ó2�–À¤@·;<Á}·Û:ä÷6¢O[Å‘ (ÕØ~ýäܦH‚{�Û4,Á}«=3ã}m/çj“H½nšÌº§& ºÝf-æ•d´m(ÎÅlb²ª H”xÚx¬IÙnLë“Êî%Ú$ ²Ð45y8\‹ JäÍË4â†ÿ|§ТJ" Ý.…¢W1Sf´˜IÅ�0ºÜdÖQ97«]CÝn“V •œ¬v3¤üJ}o=DŸT†{Q&!‰É÷áî=² ÍzŽ<Ž›ÕŽy^¦´ïQ*�·I‹ ÔyMÅêûé•mì¡N> H˜Ã,šjgK˜ÝKJêâ™R¹¸ÿº ÞŸ \ó¡¾óé °+�l‘"V³&ˆg!€TÕ¾(‰þL%] ³ï^-™ Å<ÓŒÈI7‰ˆ“á†A[Û”÷—k± …aµÏ|æ3øÍo~¥xà<öØcÚ�>ú(.¼ðÂzí/3ÊÑ–Â0 ÃôÁñ�™hü¤ëÁòß+ó0‚~M©ØÜèo7[‰¶)zŸÆ$­­Ûm& ®ˆ¶Oôêµ}¨‡ä¼L’6(T[‡Ó¦o§âš°Òãf†U(­‡ÜKÐ?w·Ô÷'Œñ Ûé´km®Þ§£,Dµ‘ÍI]ô¦&6•f“ï§DJH§è%Äí© îy—΂¤„pê|£>OŽëÚ²�üŒ%ý3Ú%ý|nQÀ1A‹ ó§Úí´ëýÔõ³›˜èè 9îZÃ\ýê<èµõï–Ê ¦&g ÓÖã#EÞÕßOeâöÊ ¹*‡:WŸê]¡µuSñ)DTìp&ãÔßúŒ:ž´%YŒ´£b;µïÔÊ‹‚L’±”@M]Ó»lý¸…MôQ×õ½S±™ú<Ô8a¶HÔù¾¦w¿HãPû½ÃnÇ6[Ÿ”§~©ý,ÖkOåW�ç;u?Ù»¯ÖF}Fê|+¨9É2Kjõ;G�«ë‹ ȸ™'¶¥Ž%ù[CßÁü~tVmkS9Ã*šj7;)©Or %‘$¬b–v¾ µ™RßÎ2ýñ!ÔÃ=MÜÿPw<©{ 'SþŒöj±;ß[)¤Úܪ÷—ÉFÀ“czl€kaŒg¸�”Q—iЧŸ~3fÌ@<×þëììÄG>ò‘z ÃŒr¤Tèîæ‚ˆ Ãèp|`&"[ÝJ¶Ú ™=S<^ÅæDß–ÜÉ6K~{e†Ì£²¥ó„`ÑE<°m&DÞ·™|§„ZJ”)Ym]në°²Þ)ÏsW4à <Ì— ï#õ𠊘l(HJ8&ÄA•Ô`)ÏÖ°ñ©ëŠ ôqd;}B†zð'Ç&¶#³Þ‰ï ½ÙiÁ½Uk{¹8�ì3²@WÔ·¶~ ÇVð²Bµ±eR+ŠK (ƒ�ÊF§Dô^B$îß§ Ôq�ºŸÔy@‰YÔdÌ`<Ø;]/ØDÖ­MüèÚÔ÷H�ÿ”žs³dl¥Ä0ê˜S×%@ö�„ö)ñ5¬O 꺠&¶\e…L6DŒ¨}§Ž[I&ÉqèïHÿœÔ¹IM‚åe’Ÿè“ŠÍôw®�æÛO]Ô¾G=·ºÝfR´Žz<¨ó çf#÷I‰ÉÔï¾MNÞ§àÖ;Ã=â¤`Ø„oT¨÷‡ÅLêÞ&Gœ�. C2Ü£´…QýýHÄ¥ ”{´ÙT†û¢Â­-é–H‘¼¥¨¯HH¹ºRÌôŸ+Ô> ÷8%¸'t ˜TÆ/šWßÇ«ö‰̳̀ñ>6j†{lÏØ¸�#©CÔm]ÀöíÛñ›ßüwÞygù¿;ýìgñ‹_ü¢^Ã0 Ã0 ÃŒ 6;ëŽC’‹÷Ì „%Œ2õl<U4•j3uÁ½(ă)™nÔàºâ|­­ÇÍ’�”èMekz‚½ÿý»�V­-ŒíöT­�¤Ñ¬ oô}ì y@7©lO"kž:n=nDà!‚¨ 2A�£:J˜ÜXšC®jˆ,¸¢%–PB‚--RX¥2í¢Šð@tá¸XÔ…AÔ3+œ=nÝ%ÿ÷N ²^»¾ï%• wz@T¨ /:‹’ÍÚyP� òX† öA¨Iê§Îëçò{GYC¬T豩,Qú˜·Åw¶£EVêÚ¥VõädFû¾½~õÏuÅJX!a:£[§—g0“Kôê%ÊÎ)FÆ{²˜#1©HõIŠð*IfÒS1Š,4Mœ¯¤hí´’Â>5YA}Ô¾S¿?a5¨sŽºN©}§~òaíÔä965ù×$TG™!¿aÑö“Ìp—t†ûæÒ,­�‚šì#'ˆ˜G]§¡ãPq”x?}¾¤é‰¤ˆ‚=un�bÿ >OgUÌ5 ‘µ{É ÷4‘¥N‘º0?YêKI·DÞå%\ý‡{¯Î—´6Ëòßo„eå‹4qÿCf¸'ô ÷TÚ/šWg¸«ì“ÄoO*­g¸û¯µ?qÊö¦zŒ1žâ>BÔÅ¤í¡‡ÂE]„ÞÞ^!ÊéúB˜¦‰7¾ñ�õ†å†@:Goo‰³X†ñÁñ�™h¸Jb§ëy�.‰Ï„»„¥Œ¡?Éä�0s¿ÓßNf¸¾î„`_”IÄrVJHìr[0 [}mÔÃøÓ½ËñêI÷ùÚzˆŒº^7M ¿¤à.›4!|·ÛªõY” $ =ËiKi¦V€“zЕ†ž‰ï ê�˜~PUÐtÒqbI>ñ0ßã6ÁAÁ=¥yËæe†´ü¤DR´vZ`»T–u<©‡ô' {ê¡ß âÂö3H˜ÀM‰:Ô¶¥ñÀZÒ÷Çvuáë™ü2,‰=íkëu3¤qh†{ m0†=ÄwÑí6iʼn½qvøÚ^.ÎC«å/›s³¡þþQ >7i¯CMh„¬ˆ è¤,™Š„lÓbVÊ[¼ Óƒs ÁÝÍbRàøzãSvT< ÷ -jŸèq2@ äR"z”º¡4ÓãþzÛìé˜_«mK ­»ÝIh7¶¸�áž@Üô o¶´Èlgª-ì:Õ÷±-f‡ÖNõ5Ã�Š·ŽŠá·§â¤Iþ$GªOj¢„^Õ@­Ò 'Шk0ê¹Ey«çܬ6)nK .!]Q×4und Òìôµm-Mó µØTš�E©ç|maÇ(è­ž#®Ÿ0Š2‰T ö eGEÅ£^™F³ê$Ú£ îäµñ½aø2Ü…BÆîÕŠ¦ÆÝRä{äfâ$eèÙçiY€'!m­ Ú z¼�Y� w%½Â§v@°'wOè£$€aÕÅkµ ÷jÁ½Ê³�ÜE" ¥YÔ¤�‹ /¼‹-LŸ>p®½öZ477ã†n¨Ç0 Ã0 Ã0c‚]nOùïf£þEèB1Ò€ðßLSYïJd¡‹#а”¡Þ_”I@øör®.ȺÊ$ÅR|"4{dV볇È~è‡ßœÛ¤=€zâ^Pp׿# ‹Î¤2U…ž‰/ÌhîE™€"²ô„¡‹:’Ì¢l�¡YÊPÂS&±,š;Cüsƒ"ÈæÒ¬ëh>ÁQ30me‘î�!>ÃA(�¬§Ø¤�¯-Ž8Ž~­ÄJ®Ö–ﱚ î!"19Áã¦uKbÂj‹­[#„Y Dõγ- _97KÚQvßßö­�OCŠŒ‹>Râš’´åYÔ¹@X~Øt¡Mm;2¶¥ÉøDsÒ7_fÈk*8Õ+õóÂÛOJÔ ±‰œåÑ�;dõ=“_¦µu9-š VT íxx‚a´¬ß0uݦ)Mƺ¶!dç«ç©M‰øÑ¬¹¨k²(õãá¨yÎ�!¿ AèsCŸ *ÊDèÄ‘>¶~ΔTœœTŽSR‰Èþþ´mŽ^ £ÇmÒ²æÃÄñ¨¹¤}Ë ,X¨}ûŒÁ8Üëê RZì(¸úäàM:Qc'xHÛ7â7Ò{åx(dí^¦ìIÅNí}-Å.ÒÆ¥‰ÐŠÓ¦¾Ýt§K»šSpÈØœ•„‡{< ¸CÓû¡¨ES“)Mp©t@p¯öp¯Zå�¢÷¤žqNM$Súê�LÈùHy¸§”04�¨‹à^*•�{?Fét���å×Î9çÜ{ï½õ†a†afLðûÜË7›Ãó["¤¨ {³YÏŽè wb€²”¡Ä…œ›Ñ²Œ€�b•d!9=›�ZnÐâD—Û¢ áT†<%29DÑS€¡:Äq/¢ÌV{:,C”Lâ¼QÄq{ºw‚+ªÃ²Tƒî% yÀ'2‰bŽTñܼL’")‚�Ù–úy`«8)¶Pv”¸A‰ð;»§ê¶¥8i�"]]œˆåuÁ½ØE #Á<ª¨@Otl(ÍÕÚ(4L\£ †­&ÑÇ¡m.è wÿú--l·õŒ»g²–Ky×Scït¦àŸÝGøÚ¨Ò1Éó…:Œ^BÏG›0¢3i£ÇDا'ˆc¤)°õF\é@úχˆ•dö7‘M­¢)É„ö9½ó?šÏ=½2!¡Ç-W?¯��~òıÌ¿_%'ÅNêØuEÈ‹DÁ×]N»ÖgIƱ•¸þè¥Ѳ²½Iý÷˜š¨ WEçA‘Ò{Ü&Òö�'êŠ*û»¤ZÁÙ°ÕPTAø¨1“žl£jꚤ'?ôÉÔ^b2´è& ™ðE79vdJ;‡©ú%bu—÷þJ»!$2N/D@(N9ºà�vòDæzS\ßï$±(¡)aiö1i8º €,tÿx+ >JB¤ˆ{yJ¼¦Døöi}–2U¤2~^UÝS”ª‹¦ã&tOx:n ®QÛ!–2Uç3õÌÀ H]ŽÚâÅ‹ñãÿ®ëbîܹøÙÏ~V~mÓ¦M(õ‹ˆa†af¼ò¯BÅësAŒÈ:© þ‡ %’Þ ± îD†»Ñ M˜�áN îy™Ö-e!;'³¤øVŒ1µôŸe 2AŠ_» ûJТ,XlÑB® ¥öÝ�n]cî%RÊBhŸ'…±ìWÊ˸U³”!3ÜÝ´öš#VxãÓ¢�&â+U¨6lŸ(ñ§Dˆ2TgÞM…XzDËÞÞÜ9O;·Üíï¸úw‘Èë^²nAQl7®eVÒvq¸Ž~Mn.ÍÖ2ä)a‘ò2¥‰-aÙÁQ-e 2Ez.­¶Ú3ÈLÞ<1 @ 8”pµ®¸Pû<ÔäŽrLr¢�šÐ0{‰UyÂÎÉÑÏ�° w*æQ¶Ô¾çˆ ÷­ö B\£ XR(ô˜.¤tIzߣ Ñýc¡ÏÁŒ.´ª¤^ÇCfAyªm)ÍÔÚ¶Ùúïïg Ëh»:=bÆ?ñ[C�Ý?~ê|-*]x^_œOœ3ÓÉ}¢¾‹-¶~ÜBW·hÙèúwжqa“VÔŠ™à8EÂz&¬ÏD±sê|/ɸ·r2‹¯m~¯ö~j²Ž.Í.�ºçBlªÂ,e´Éî41ñ’ж+¸ôµO_§úo<µ?6±ßÒ5|Ø"ÄR&éêZaÖî% LšúodÊÒ?K&'2ÜõIr€.Ä téy¸V1TÑTJО<•(š´”©Ä45PÑÔDRÀ)?yj\jŸˆ¶v½±zì±í(3bÔEp_½z5¾þõ¯cíÚµ8ûì³qÛm·á¼óÎÃ¥—^ŠË.» ‡zh=†aF9R*ôö¹ "Ã0˜‰DA–°Ö®Ú<.½ïž¸,ŒûH”AxÍÞ*ăȪ&¼È7—fjî”КsiÁ=j¶gž°Mð²uOkJ¡ÙáèŸ=,Ã�:NÔ÷›“ºÐºËžLLšÒ«6•fkmëŠ µ¶— �º@L(:ÊÔÎU€þ.wØÄwILž¼\œGöIÆ-IÀÕ' ·Mâ�ï0žªí"¶�Œ¤â˜?8N?ýtÌœ9³fÍ¢E‹�Ëåpï½÷âå—_Æi§�†+®¸¢Ã0cÇ¡ \0 Ãp|`& ë�¾' zéðð d¸}E½î^†»Te÷(³Y¿y6² SXˆ ÷Íö,b­¯�òøÎÉ, á¿ömi‘—TÖ/% õ^ñžˆH î­dö\ðý”_´&¸b‹g)ãDzôí²”¸­ÒÈ ýóÄMÁ„,+N[]D¶” l–áN ”•%Àô¸Íˆ ý–Ú'*—ÜwÚSÈeí”pL}—”í¸1=C¸`’¾Ø.‘áN‰ëFAos.Õð#&Îÿ7‹8!¸÷¸Mš% iùCÙ\¶#”%LQêÖ °�°¤ 2s2« W”?²'è- “¤Èìú$â¿üŸôÃw„vííYd4ž#² †O¨ ÷õÅù80û�¿e‚(NL �k 1Ø+šê‡Ê"λR€¤Ž5•ÑVüv !ÈR¢&)ÌÛíZ6¼«Œv:þ}Z[\„&³Ë×Ö+³0á¿V\e’ã‡e&k×…«[Že2dµ‚>ÎÚâ"­�ú­ê! yÑW­”¾ê«¨’Ú„o^¦alK^(ìE°¥Š úwST®ªhj�Ôí_€°¬l=n=—_ª}ž§óËqXöo¾¶óK"‹Äa5D‚×KI&IÿøàDC�ÛDÞ_�ES#z¸w¹Í˜†-Ä~Ò‰T›6 G�înŸTt“‘3Ü 2­�[¤Õqí)iùÎuCHd }]NÒ) HÚéÕ®<˵‘HéÇ'=©ÁC™± =¡Ü�š¥ŒP iW²åÿ]Ëp§<ÎEZ�áˆ'uK™t¨š¨.šZªÎpópIÊë=ž¬™¬¾©´WÄÆ·Y½m 3R:D]w8øàƒË¯^½«W¯®W×ÌA ·P*9ãéÚd¦p|`&ì�å¿ßÚrüW%–ôýEy¸œá*¸6&ÝN ‘á® 97ƒ„á_=kJ䥗¿Sâ^ð‘�Êp—J„ º²þmÑ ÿƒ˜‚I šµq(÷v"»ÆFJ³çÉË4â‘UMˆø™Ô¾µ0 3h)â¿KÙEPV”ˆÑí6c²µÝ×¶Ëž¬}?ž¨¡�M‰¼ë‹ ô w·™Aú‹zU*uŽÜ _ø‚Hms¥I¹W@uñÖìÕ·3‹J‡ò,ϹYÄ\ÝK¶ÛmŠd)C[2¥4Á°ÿ\—Ò€Ñ7ãÙ è¬-è""õ�{‚”ž)J­ˆ@ÔP Wd)©„OBlL"0[eÛtñMôïÑÈ =ž‚;)¸Iݺ)ÌÆg·ÓªµQ¢s‘°Ö ó1§âÓ.[·  í ôx Йã”HK ‹­Î•¤^´´ü`lît&!kvûÇq³h6;ïÍ’*ôµ¢ Ž”PI%HiJT¥²�©ŒýQ¶(Úõ#•ñþ&TÂ6$/ÓÚ¤F·ÛrÜi�ZÏp×WË…ÕT‰šáNA÷ŠçêBxtzlÍŽJÅ ®9WŸ<ÌÉLÈ„¾þ�G]ùAý¸Ò kˆ„eÈëB8áSïêç•È„6§l„¨ ÒÁ½jl…Œí: ³” žÍv×�[2©Ç¼dÜÐ-e,¡}–´*ÁTú¤ë¼¸ÿ·Ø0„?ÛÛk¤ ¤RäqÝs©´¿­Zp¯¶ä¦Æ <Üɧñ¸^œÚ¿˜~-h"üÎpI¢nÎ÷·ß~;n¾ùf_ÛG?úQÜvÛmõ‚å!�HÄôJÈ ÃLx8>0‰]nE˜né¢Dýd¸[}Be Ã]QBºÑÍRÆHkm•÷ûé‘Y†ž¦e®Ê¬fcæLïÔ‹€åܬvÃ\Tz†{�Û S÷›&,eò”')š¡=€Ph¸B·f¡Ž[Jê‚�£ÒÚ’ß‚L"#²q“”§oŒfÑ\mÐâ¿Kg¸ëºy"û­ÛmÖDª ¥¹zÆ1•™ `SiŽÖÖé¶’+œ@î�R‚.ÂG®Ó¾3QÚ8ʵô}w®þ{FR•¶.Ø?›_ªmçYÊèïÏ‚;�‰­øm¿UýÙ)a ¥|HáÄàõ—“ºÚoËP}ŒK®î£Ü?ŽV�JŸÉ/ÓÞ«ˆ wÛÖ'X nŠ|ø6 RÜmýz¤ü–½¢©þël›=�üŒÔ÷H ‹Þ9MxŽ>�--R<í"UBH ±˜êtõß1*û:,Ã\²ã¤àG­¸ñއîN¿7bí"Fl³§ëb%±¥×�^¬Ö;ž¦¶ei¦Ù~¸ºà ;�vm[OÄ×3ÜK�s˜ª‰ôMêiŸ'¥]¿” ë ÔÑlw¨ëÅËÎ'>1©@÷h±p§3…ô…×ïôÉÃW·/ëŸÐ²¶ ¯&! â±Õvè JàÞfO�T‡ »Ô¢'(¸ºÕ˜÷~ý¸Qõ#¨Ud"Æ@ùk¢(dbB9Ix«§�¼ÖÖTÊAÅõû†TBŸ ‰Çˆ¢©-ú>f”Mfq·3Üc1h?ÄÉ´že„îqm[ôp¯Þ�*wAd® ÂÃ�ô“�'¢YÊÄD†{&Ð6vŸáGR‡¨‹à~ë­·âºë®ƒ¸Iœ:u*>ó™Ï°èÎ0 Ã0Ì„¡KVÒ\[;–†aô=Lh–2-3E™!îÔÍhL/¨Öã6iîÝDvbÎÍBˆ àN?ô‡{PëV"”¥LУÿ�–ò›ÖްžƒŒþxaÐþÌB˜ZŸ®¥7“ÜEF{ ÊË4â÷]öd$ÄòeÄ|¢>OÞÍèES‰c„õ$3Üõ%ù=„‡ûšÞý´cI‰úðDïJ­Í›dÑÏ· 0âÂ[=A�‡A7¦}v3¯Ÿ/v^¼‹n’|H'íIlƒÌÎÒã6Á’úû{d—]|0d…HpçûŨêãéµQµh1‹ZÕ@‰TA!Îî0«ÅÁ0Ïs*ÛË䥯sŽ¡}·¤Þ-ºI@êç¢×!2Ü£­Êé•i­ˆñæÒ¬ÈvTÆp‰¨Ÿ@ù5o(Í%ÅOê|ÛjO×'NB,¦¨L~J¤Úzˆ:¶"V— Å�.èR¾áAa’²4èc\$Îaê;*–2½’ö�ÔwAì÷,ƒôϳ®¸€Ž©,f;ÇK„hí*“œp¦<Ü©sŽšèȹ™èõ9d\{?%®SÂ|ÁM„Œ£·­-,Ô½ï%±2Gfµ‰Ü.·EÛΛÑ'Ñ'=wQˆ�:q—Hfš2ä7¼µa­÷ßcÿ®´·ë6{H$£M�ë™ðäv±¸öùD25n,eF’ºî›6m¡‡J¾v衇bÓ¦Mõ†a†afT£”B^V¼ÛM]¨¨ãhþ…d¸+¡{¸+ÒR&£µÉäÁäMv�ÌzE=«Û\ý�6'õìFJpƒ¶¯Ð3é{]p/[gT}vךӗ�æÿn"+ÍEJ_Þmèv€—@T-H%CïSH*+£ÓÊ˦ÛÝN 21ý¸Y†€�§{—kÛQ>Ý9©gޝ+.õÀØáL&-e‚°ÝD†{Q%µcI‰úaP“,”‡»«ú<«öI©8)XHW_rŽ¢¾RÁî˜È€sì˜fãé¢îE‹’ ³\ƒädf`µp�Û Sé²µôŸñiÁÜk«¶¬à%_[§ÓFfŠE·~á§úxœ©Od 1Ã?�Q¤ü«‰Ï­vèç›*™š8çºeÏ�Ö|·6!¤HÁ�ZU�Ö ÃÄ`jò#çfa,¨ÏM]{^&­þ‰¨ó·;‰´ �™ÐÄF L\×Û¼lØ@†»ÔW—t:­èr[‘4üB[Nfµ�”#²æ=ÿy�° wKøÏ-ê;¢&bsRϮǛpÖ¿K=f6ëIn‚œ”(ÉÒFÎß'i)“Òb¬#õÕP½2MƲ‚La’µ+Ð'U$[_YÐå6“ûžWD­GÜðÇ;ä:¶uÛÍä½D�XyR”Iì•z&°Ÿzæ:U8x·ÓÒwì*X ™à¡V½è'5±¼«{*´‰iL¢c³J¢)PÛ ×Mcz|£ÿý2ŽLà|)¶HÒÕûзªg’Õák¦‹¸êŸG ÿä� ‘ÎÀ:³Xú¹Be¸7—z<c® 3¡ÿ$’1ˆê£RqK{JHDm� �n¶MFð»ñ,\(u¢¿DÒgÓ¿­ê­|7ò¦OC~üRÈ�_ ìî»öÒY KÅàþÌâàZX"Ã�²”ú͵²¦éï…÷0ž±ôŒVݾE¨ 2IfÔQPÙðT‘5ªh*õà+M¯x ž¥GÕDJÛweM×ĉàóJÈ’ÞžÊÕ…«t<«M¥2Üs2‹lœð 7uA·@y™!3܃ï}<·¿ö^X[\W袎þýèÞ÷%™Ð}œC<Ü)¨‚¼=®.Œô îÕ"ŒýÐè¸q�yÈצ Á²²€(éEi][Ï–€Œ£‹¢¤ÛÔPV$=nÌ€¥LA&á–öÛ&"ÉBzQZÓ¬ŒU�)2y�ÎMbNb½¯­¤âš÷>™áÞ÷}Å« )ï0ÚC-e‚PÂ>õ¹U^·@Áо‡I©¤`wmM¤¶J´è„*¾Iù�aî,N=ëk+ÙÞd¤n�\�uíSÙI£H£¨–2yâx8oghµ:-Önm?'ÇvøÚ<S?ÆÔ~RçpQ%1/ù’¯­Gf‘ “»�VBØ×Å~ \pß+ð]Rþä”Õ‹!\P¿½¦Vˆ¼ÓiÓ>g^¦µ®«÷éñÍd¦váÛß+Óh1ýâ+¹âLÒÙù6¹ªI`FÜŸœYT ´Šâ–ˆ"%I× VOQq¢$ãØbû­ßzÜ&ìtüE†K*;PŒ¸5Ñba¤‹ÑÔª/ª®B±”Ö®_)èÉP@hy™Á‚䋾¶Mñ˜8¾™ÔŽ/-FÓ Ú6íÏŸaíeøWD!�”¾:%iêŸ�ܳvN;3r[I;”x[;ò%ÿïi*ni–2–mB½og}ÿ4“„�œaÐ…P©‡Ýl3н;°mxì!}Ûjì’ž¡“§ê÷˜IÂë½}*‘ OMM€ô¨¯>6c8Ã}$uÂ`hðœ{úê«ñä“Ob¿ýöC&“ÁîÝ»ñÐCá§?ý)Þýîw×cf”£”B>o¼!Ã0ŽÌDáϽkÊ¿:sà[™5<܃ÛÍúMçëj‰t¿ U±GôùWkBáñ ÂÈÒ3ДÈÀ~Û�¢ ™hqtÁ}J&ë=TU‘—i#˜íÜ„ù–~ܼ¥Ï•vʺ¢ÿýÁ¶9™A¦ä™v8t¢Lžðï¥ àv´'FŽŠ!NLJ�“‚ <ú'!ê1ò¬‘tû3 ¥¿½Åp?JL§ÆB­x¡V·ˆ,ŽS63Ž£×Qˆ!,é�â§»Îõ�#t»¼¼L£G6£§ÊÆ-EŸà¡ÈCŸÈEÌo—�E �ñ}cÙR)®g,ý¾3.m¨À±ˆI:kÙEÓÿ;›&Цš }r'34‘Û Äl¥ ó"¥×¬ Yà‰êâà£`|ú[0>usß{åTÅ彚Î{sÕØ„�= �4) 2„O|Ðg g¸�¤QÁ½×u¡”B©T¢—N0 Ã0 ÃŒSvKÏw²ÅHÃÑÅ�!Ì<1û3¦ªÆ5è‡B%2„¥ U\5<Ã=xé58sœ‚OL ŠÞòû@†{ßòw¿àäm«ÎÈDQM‘"—H; ²~õ 4az/i£â9Z*ÄàþçAýólØ®µ™É½5qýä½Óî£me!AœR­ þ wýX~gÛ¥ [ʸYÍ®$LHt!´H|”‡{‘ÈX ûÎ)zeš°®Ñ‹¦¤çOnU‰“RÑ‚{�›Ö—êˆÂqÊ‚ |ŽCg¸S$ó¶&ŒRYÙÏä—¡½ÐékëϦñÊ÷F‰¼€¾Ìÿ·§’â`p’ðDøàv;Ú[½î:Eq'î\ûoŸ‚…ûžê wÏ×9(2…?C†eûph>x®*©�Ó?I<·¨‚¸ÔJƒ¼Lk¢™«t¡‡òzƒ*¤êe¸Äq˜ˆ*Îõó_»ŽÕ®qWƒ­ƒP“9á"¾N¯Ô÷óÅÂb?§£t{ ¼›BT‘·¤Hˆ °OgÒS–AQéq³Ú8Tö¶#£OJz<ÝÚW«Á7ŽHhÇýÆMW B؇VÔÖ«¥ALšö�Êö⿯ Çpaiç;µDÆ~-«"Êö'u !µÏXti�3jÌìrô wIXÊ(6ÁFp]ßO»¯lõo}Øê‡¨ô ÝRFYYßù–�E å��-¥nÏ6%@†°Ï3¥«‰˜«¯<ê'˜áž²t{7ò´{é”%´ûc#®ÿNyîA[—L¤¬pqHeÕ�˜6«,¶ðYÌÀŒ…kªÕ«LúÄ& ×÷1I\Ä*¡ùѳ¶;êâáîº.n¸áÜqÇ(*? Ùlo}ë[qÉ%—Ôc†a†a˜QÍ6w7 Ù ¹ùm$ý–2Õ N±¹ ¥Lš¥ŒÐwO yxвn„ö°ëy¸ûE^ªpõÀ^Þ/íZ_2ÞÛ'^U�Õ¿×ÕÙ´ÂÝÞ×çÀRÐU ]¤•©C`÷(¤Ížr[¼g+œ;¾ Ë=þ0pª¿)kó,eªS[«î³í*‹|ðZÐb;*û4ÉÚ¥mÓ0‚G2'³È*¿€RK§²‰ƒmTæ%âײ®¡ÆŽãy¸ûevÛ{ï¦w\a x³«¢.r)‡ó ™\%áL²²ã%]Š:7oy�¦b�¯½_,éŠøôL~rœ ·m+Ù¾µ4Ck³•¥e;{bã0 }«b‚Å‘ë=3*cQç[-1–�4bÏ]=>Y®YÔ¤ŠøQxö<�¡‰lå°Z .,´ÄüßOQ%´ÈLM¦„‘“YߪÛŽõ]cþ½¼÷€èÙèdÑT"Ã]éãP<Ù}}5L—ÛªmëP“ÄjŽp„f C­¬±UŒ(œý»”°üìaãÀŠ<)è¿«›ˆ/E¡×dÙiOÑÚjáαœÌ’«¢‚Ç�ú,;¶ÎfjÍ@¬èÈø'ÏÑ÷³8nµ¤NjµEê6 ´{”-yý7D†»$2ÜÝ‚GR!>,™³£¤gž÷¾û%¥‹ÑƒÁµˆI'3 c²‘ÊÀ­gW²0õ¸•ŠëçËŒÜ6l Þ° wZò”¥¾É)]ìOÇ ]¤& ³Rá^+Óºº¦•Yß�/Ã=dÅ…PûGa}ÆâúDA0ž“©‡D]2Ü¿þõ¯ã¶ÛnÃk_ûZÜpà øÆ7¾�믿§žz*¾öµ¯áûßÿ~=†a†a†µ<]ÜXþ»Ùˆž½8tKnEßM´³µÒ¤<‘È™ñÍÀ¶I¨xÀnšÝf& Xº@÷ñÃ[*6U,k÷ßôçÜ,¾¸éC¾¶g û`w@0)õ=Ìþ¾óärÛ}Îm<‹’ Aaif³'~6Uç[0ÉËzï©z¿©¼×ç%×–Û„Êã´…)ܰñ*_ŸÏhÅM[®ðµ¹­oµ¯¿­íÝØwJÜ—U=#»íù]ø{×+ËmýÞª¿üLßû-Ó@KÚ_T�Ö)ë W™8oiñ\Nßþ…£x™týBçæ�oòmÓëfЙö‹Ôµ2ˆ©} ÀžWîG}m97‹»_ék«åáþ[/ÔÚ¼¬Ö “c)M™¶àí}±´7¡ð‹]gúÚ�Ûð7|ió•þ�K¶æç{ÁAÓÃþïcVûTÌìÙâkëŸTعÉÿþ„´ÑfèÅP‹÷õy…K ¿ê8ÃÛ¶(‚)ãÚ8/çdA žyâ@ÀÖÒ4lêË„ï·H€ßu¾/—ækïSÊÀ‹OúÏë¢L"G}€»wœO¶L §¬{€.¦ÿtçyÚæ‹w®Å#¹Cý]HÚÆêÀm�iâÞ¾ ?ܾÚצl7=ñÿ›]�ƒŸ|Ò×”)å±pçËX_ôê%ܵã�8í¥ßŽmõg!'Ý"$VhûdÇ/öý;/SØôøé¾¶œ›-ýP¿ýühǾ§œ<�æÿÜŽ²4ñ³Ãiÿ{÷�Ó'H>š;PÛ§¿vSþ÷Æ/àÙDUsÃÆ�… q?ßu–ïß¶Jທ¯óµTJ›ü‘0CÏ­_w¼¦ü÷=»=Ïí»v¼±Üöì/¶cŒ£’ÚŠŠuÒï]] CIülçë}m9™ÅW6}Ð×–1 -–5„Ê;·¿IkûMçk|ÿîq›ðBa‰¯Í…jïõxn¥ÖŒÍÔdC^¦µßÎåö6m»µO{…DïÛu¶öÚ�wú¯ýœ›Åš^ÿþ$zí|�;º0:³K;Œ^™Á¿ú&`úÙfLÃÆ’bÁ�ábgØ5×?Üõ(×Ûf]a~ùõ/<¯ÿ^ý²]ë§ôŸvtºz¦7<Øå?g„íÞ(^t´{ˆÖ®I·'úê°gë[_;ÃûŒÕ+ÞšŠ9í’ݺî>ß„Ëöo†¢ß2ñ‚½ÓøÖ–wúÚbV«o­Yt© º3•‚¼y+1{>^³Ð¾É>rHåÞí¸—ÿ†Å]ëpøLÿ÷PKp�û¢ïß)ËÀÿL÷ß+�»(�ÔêwùÚÒ–L§¿ø[ÀÂÝë`Åb'øã:š[u!>•fD°“¬%^ÛUŸ‰Ç)ú„yqä úkÁ¢©ÄêËý ñÄk¿ë©4Œsß^éæN¢ uÜï½÷^\uÕU¸êª«pê©§bÕªU8í´ÓpÍ5×àÊ+¯Äí·ß^�a†a†aF-�×–ÿŽ‹º,"¬‰P%²]¶œ«·e޼9 ˜­¾&›áO-·-„�çcï-·T3Ÿ™„Ûâ…¾ÿêvœ²Ð/ÂçeÏäWàA×{°tÍ}â‰ð‰ýÂÜ�¯Â÷:?‡â‚qüÒWâšW´âÈåz¦n0ãñ‡zirÕE ç¶{íe/|¯Üæ¶]Š;O›‚?çüÇèû6á×þ‡©d<‹�­:—¼x~¸ûZìšý`NÂÇ^1ç=ós|êåOâÕkþ ˜Í˜•µ°#S•ξ%ó¬ ðÒÖ‹ññu7àܧ‰Ÿî:âü‹phË1Úç‰5†â6ï¸çþT*ì|kùïþ¢°�k+s%éùº»ÎkËm;í>{�c¿…žŽ+pÑ ·ÁîÏ”žâ_Âß#³�Y¿p�2{qøŒì‡&#È/;ÎÔڞɯ€´½}ûW�'*<™÷‹·^¤2Fö­ ÄÛ{w�ãû÷·OšŒç K}mï;b¾&MiiÁÅ�ë Êm\¶ã~üh‡_ø:pû8å¯÷µ_¸ øÇ·Ê߯âlˆC^‡¹;·ú¶kÕÉX»}y¹­_�IÿÎ?Ù6ëÂwAMö×´úÐŒ]p×ÏCþ‰sðöçï,gì&{ý×tQ%ñᇿækë¿Vº~êŸ(9hÛc˜ùËŠ�¿O5ß]—^ܱ7Šâ‹ÈÍyŸÙðIP¼âå‡qѿJôV ܘˆzÛšÛqä^‚LxßñÿS¹n–Ä @,†Uÿ�å;ŸÑ2J-[÷A_ºãEØ*ŽtUn ±ëçƒÿù†–Ñz俇ð½mù7,šxÝ_ð5©’‰³žü=ìêâ~0•B¬õ&<&¿„?Íáík~˜—õ‹þ1é ”ò‹É çù'm$L[Ûà´y"ΦÒ,ü½{‰• Ë*Ûõe™>Û¤'¦µÎ®q[ŸŸ�¯ýñ*Ëýl.ÍÒ²ý¾ëµ°UëZU5Žw||Ý�¾m]Xx&¿?+ wÎÇä¿xǼG6ãÍÏþëÒÿ‹â¢Ç°Íž@àšõŸÕöó«›ß¯µ=°ûU¾d[móÞ““øÔQ“PüCerj‡ãÅ�/oº_~áÃ(<ûnœ²¿w¼~Ñq>öÜ�(|oæÄöÂûnÆ“ù}ñp—÷”Hã”W㢕þ˜µxÉ5¸ê¡/ùÚz§úÿÝÏ7öêÀ¿_çk»ò i8%`ÕpôüÉøÐƒ7ÁÙT¹Îã}¢ØÕë?§õûÝm—à¡nodû¤ÏþÑ}”o›–¼…Ž¿¯ Kû~7¥¼ïð3®ÕÆ [™tUß÷®ŒVü¦ó4MÄÿñz�‡)ñ¿¯m~y%†ýˆ÷»ó«Ž3ðÀî½¶çáš|AûO=†+üœªï=(Î sB^nü뵘۹Ñ×f«¸öв9�¢Jâ¹üÞå¶TZOv(å^�ëV(\{D+òÓ¾w÷"~°°üú-[/ýö]°Û¾‰ïåý¦\½þt–ö‚ýHŽþÇc¸ä¡[}}.xÙÿ›ò¹, ܲÕ/L¾þ¹ûðéÀwöÖåiü"0aµÏ†—°!0!êˆHX8ÿ™Ÿ{cM”îš‹L`u–ìŒay�wþöOò¸©3pîÓqÕá-Xÿ_Ï6Æ\†ù‡{¿¹ÕÙøæ>ûk+ÑJ÷ÌÅEûùÜ¥ÀñsSøð:ÿu4­-­MböQè–•û‹¶Ø �Æk–øû¯~Þ¶o -‘‘³SølñÏøÖýÄ{þûmžh^�Õ—ÅþæY»¡ýv<xÕª}qè–G¯Øüo$-�g¾_ûãGq݃ŸÃO~ù4e+@³Y‰÷)K¦…ÕOý×üóFüï?>£¥bR;ŒKû ï6·Bœv>D,pÝ¥2¦ ±êÕ¨‰>áŠj›Ë;Å[®Ð·«özï‹Aâ‚KõíÑ^u¢¿!ž€˜Xn’Ê@Ì[ 㣟‡ñ¡ë�ÅËÀ žºî›7oÆ+^A{psÌ1ذaC=†aF9R*tuå!kÌ,3 31áøÀL69+� šWÕØ²N(ÝS” |ÓƒÙ4}ÿ¶gÜ %�飡âÞì3õ¡Dnö4¨>�èã-ØTš…¢LàA³/[Þš™ò2Š�ÉïC{ÊôlEÅnä9±ÅE�ÃYø7,i÷–8OOWö)“ð„ú’Jbά³€Øl˜†À¡3˜;i&dÜËþëùƒÙfÉxî9s*ìiŸ‡B ÊšÕòœ² …Íöl\ºî7è�óÈìÉhŠ8b–ÿá.fêEÞ ˜Ódá‹'‰×òdÒž'nKÂÀv{:þ°ûÕ>¹iÆe��“!»-”îŸqÜi8íU¯Ä¥c±Ã™Š«k�qâHÈ’€x î÷ç!ÿÍ%V2äzž8›J³ð·®£ñ�þ¬Ê*ßéþã 0Ň۱µ0ŸZÿI|òÈVˆd±ÃÞ‡mU^¾“šüÔ™ò–Ç*"þêýæá£‡µøžú3G_(,�ž0T�¹iïóG”æüÙß‚e@+îÚKd³:†.è÷cìff-Ü÷ó·ÀyÌ;62u(ZS1ØA ‘À©ë@ëKUES­éhnÑíg€£7=„âó­^Ÿéc š[‘½ò:|cËxÇó?ÄE/Ü$‰ë)ÖãÞsJåµ,V¸�Ø}¦ú3£�~Å2_¼ÆÙŸÇ†Ò¼r»Yô¿wÕsÿÂünÿs”èËJŒåü‚ð5ÿúL) w/Áásæá3˜–¸æè©À^¯…•Ò…µ~æ¯Ûޤ[‚û\eÂlm_Öw§ÓêÛöÌ—~‹–Bö¼_¢¸×zð»õØg×s˜–Û†´obžÂÿþãsxÓã?ñ½÷°-�ð2±ËŸ§ÇÄi/ýn•õAˆ=OÆÉcE‡?K�²{À oGÓ»>{úW¡ ·' ×g`)fºj2¨o•À¤)ó±dêÑX¶ó˜}"”0ýûÐdçk*œI¢[NÁg77¬š n“— Ü/¬f[[à¶…ÿÂ/rwàˆ¬�‹�[eUΗ~’\츙ã ìzo_€ÛÌ?cÕÜfü…Û é'L)ì‚z±Ø -S¿§¼W ÒÃ4c8i^GÏ�Šüý3¡\`û#±ñ¹Â>�/5Á¬º?ÛXš ·õ €9©lÃðÏî#Q,ö­âøç2˜剼~î=s*¾rPЫÞ¬7+‰IËÂþSpÿ=î†4T�…ïï¾±ü‹Ÿ qÚû±÷$ ÇNh*æpòŸþ¹9 ‘Lãø¹)üòìéXqÐPšóS”æß�)ÙÉX9Í­Æb“ðŠ7ø³´URÏwÚÞ‰YMŽÜò_ûü©Sqê B™•XONÇAÛŸvWÎ9Õ7¹õ÷®UXW˜�ü4o¢ÌVq|hÝWѳh=dSÿĨ(¯¨’‰}qžãb~×Ëè,V¾7×Ôí_rYO$ërývVóšMrõ<ؽ ·—~‰âü¿  Óš8ÞÔÖª½Çè ¿¶Šãä5¢4ï~¸GÞ†7>óSH˜øÎöO¡wñ‹°?ûïx?ûù[‘àp(˜P±¹ˆ½í^zÙ…-�œ²q3/»Ÿy…ÿ·¸ôç©XÒù²¥Š@¯¬ÊoØ×~R™�q¼¸Ö›ðÜéTD]Oâ´@¶4–]�—LÇÁÓ0Z^ƒÒãgBn¨þMPéý \…ÖéÓpï™Sñ©ãFR~öofÁT +¶<ïë’ŠPÆê÷àû§ÐéøÛ¦æwh[U<©eܧ:½‰Žw¿øm¯v‚Ñ„� oµ×6{:Žâ!lýÚ!P[SXbù3µí§–oónÞún|pÓoàÌþ ,Càˆ™IL›ÿf”ýöÂ_–ïÿ|v“¦jû#w$´"¥¢½¦¡{РÄ„…ló$Jæ+ “qÁ¾‹ÊÛ,Ï?˜Ž™“D&æíÃÅ+› IÄM�v¬³áA éÝ›,o�cz¯^û¦Ÿx_†ûY Øg׳˜Ý½ ïyô[ û÷—ñÃß¼³é�Ë¢I÷ü÷y½÷ ó”µ %¸ʺ¦ÏW^,Z ±dù˜®Ï9’:D]÷¦¦&lܸ‘|mË–-Èd¢a†a†‹lsv—ÿžÆÍvTª2Üeª’ø âó+í±…¨…lz5J‹‡=ëå‡0Ù|6J‹Ÿ‚3ó¦r[Q%°úÙãuOÿ]fŸ5�°g߉Òüà¶õgwÓ™ýÍ áeÔ‹>yd+¾óªvŸwf:» —¬lÂ;÷oÂ�%ÃÞ8·Ážq3œ)@Øž 1C`rû*”>„Ò‚?F oß· 8¤W±7ÌÔÀÙ9/*‡0¡žççªÙ $Là#‡U=)þx2 __ µ3 X1$-�oŸÔŽ›OœŒ#fõ=‰þÚ{rn·íþŒ×fZ€c@uø?{b{?øÝøÌ ×áÊ ÷z›Vù_—·¦¸¿›�ä—gཿýšFÛµd2)8ÿõD�G{ ð¶}›`Ïü?ÈÄ ¸Í¯ÇÌ)¯€i¨–JööC}6ŽŠ¡4ï'èžòUü_uV±‘„JŒE“2¸õÕSðýWû³æ)�þM}B³U完&?7‰N§ »\O s&yÙ‚â¼w ô‡¹(>ìYßC:f`å¶§ü� ïsÇ~ßU0 Ü8œ)ƒ{À¡>Ëî½3QÜôfØ3¾X09�©i/–à¼eÓÊ�þq¼scj²2é•éë_$ô,n›_þ[&={Ÿþ‡×KV6!i œÿìÏ€R ®Âƒží�ý‡PÖlÈøbü¶Ç³J9nN Ït!Û{9>÷÷Oá[\‰™ fy^°L%±x×zßæ«ŸþÚó»ð¥—ÿJ$!»Òp›„ ×܆#{*Ï’ª—(büx+àmÛ×Á5¼IŸÒŸ+YÁtö‰‘ÉÓ`œzDû4Èæ3PZðO¾»WYÄw¦|« �Òï=\$SZá>ðØ�™ÀÔ™p§| ñ½Æ»�>Ë&{ŸÕ™ö9|ð¥¯âš—½ çä)ž°*b3ðæÃæãC'.À¤T Õ6`ý™ç¦aÀ™õ=÷~ÆÅ·£õô×õm‡|9 HïœPB¿†‚ÙʇËÍ€yÕ:�ˆáŠƒZð®›�ý?ƒüç—Ãü묲`øª‚ôPžÚŸßs�7 “pº¿¿7 wÍCê‰øâ±møß£Zálì+2[:–!°0X¥Ñ£üžÜ}Ǻ¥Å,BþkKñª¥[¡ËðÆBàý+SøÁï.Ç;ú&Zª3Î…€J Äúü´EðwÁ€Ø÷`_“eÄ0§¸Ã¿�*9Ïn¬ôGÏ‚C¦�*ÿØ3¿%R�±…�Íçû¬ŒŠpc™&&' H˜øoö>”ü¢Ùoc@²ÊCúWg¢·õ—°çÞ‹Iû€/ÿùãhq»Ê¯KâûιÞ÷T]üSÆàㇷâŒÅ­ÚöýÌ–÷zð·ÓûOõ·‰ÿy/ößéÅÖ“d¡{AÌž�sß~>»øâ Sa1Àõ¾S j×|ï·wþéIsfE²zÚ þ1ì7#_û'”«Â›i\¶¿wR?Üs8¶˜?Cá[K úއ¯&†Ù†K÷ÚÝòºÛôLåú· áÝŸL¯²Å™¿¯öžW¯½ßß0y*ŽYЄ×-õ¬]µñh6%îÚñF8ÈÀžv#¦¦½ëº_ –;’@G´íÆ:çü!þJ þeV[Ô˜}>Û6mö�­€&Yù=Š'fê‰ÖT@T>gµÝž2t½N¼þ"¸ø[WÅšI%–Á€·æ»ÎDÎÍ øSoÂþ”)|wÛ%¸býÏà.ð,—N[ˆžü^Pˆo�L›‰¦¸�/Ó†k^ÑŠST®ç�.S¸ö×ã]�}âxïúG�d¼ý4®øà�î3å÷¸ý ïóN™ŠÏmø¾þ§�bÊé}“lsB ÉÎÁ8Þ=–?cŸðüöª û×.I—ì2M•sJ$’~ôtÕù×·¯biebOu9vÆ*÷VÆù}Ï­º7= ï~ß­Š©Õ1¼ïuqÜiÞ¿£ØÒ¶3ä½3hê²Þùˆ#ŽÀu×]‡Ï|æ3X±¢’ÁñØc�áÚk¯Å‘GY�a˜QŽa¤Rqäó%ÎbeÆÇf"°½ïa9­ÄÃKÝ©Êpw¦U–û«ô*¸M¯�(<á‰æa…Äû%WÁ……^™E¬:óSÄ|^ð*�án`rÒÀñs+c˜B`zÆ„#>„؆×"…ļkp†“ �ÖtȦþ%º]µ 'Z�1i ;‡*”¦�sÆ¢4>¾þF|xñ�°×œ“#|Œ+m…-bÁÂW¶]ÉÎíËÊÄ -ã{ï}>‹¿l½'-ìË É2N;ïüÔûqÉ·!víWû¶­¹ê«p_:…¸Ä�?xý’4ŸiÌEIÑþ»- ﳺM§Ãì¾2Uñݽvý§ññ¹†Ü�Â#yÏæèÎÿƒÓÛî†!ì™ß‹šqú¢4’™ŸÂ.ý2í­1N: êØSË‚.|BþË?x¿à–‹!ÿÕ} Îz#Œ}ÀMæaBÂ%²t0Œ>‹%Óøò±“±®ÛÁòÉ1{‹–¢ô§íˆ¯Úe4C¦½ ˆ˜¨dÒ§„…"¹9 ÕkB¤]ØS= •Ø Î”k JÏÃióûܾfQ§,L÷Ü•œËVÿ ¥ßÍ9 w½</–àœçî ¯sX•©<¯>päT¨Ÿ|ßË‚›6 ª«2ñ¨ÙþíG�[âÿ€q›PÂÑPë6îû „@|éµP½ç²€Ò½sðñ T[¦›{½ÆñE§ž 'sÜîÿÀyôE¬Nmħ7|Í_€÷å÷yFl†oUˆJì…Ò‚!¿ñY¨Žç ë[�XîÆÇ¿Ñ/Ê á?üF¹Ä+QÈÙh�ÆÝ7¹oÃò_ý«3ú‡V˜VUˆ1ÓL� lÛqÊ9€ð{ùèß_ÅÜwŸ T7>röJ¬Ýí`ï‚úËYTÅrqØ1Óf!Ý:_B3žÞe㸹I{ßôöà¸-IÜ¿¾€ýÚcå8Ô¬$¾q‚…–MÏ#ý+ ¹³Æ;/Ä¢V¯_wÊýp ë Ró½A¦Í¬Œ `vSv?Ùy.�ñ€lö&$Œ÷ý/Ôý÷Az4OŠáóÇ´PØ»­ê÷ÇŠù�u²FáKB¤Ö·±ðÉuwÀÝß„iöÅå‹öI8ÿ˜ ¹×%Ǭ.¿E¥AiÑ‘„ ãò«!Ö¾ào^—"†›N˜Œm½®WÄZ´j—§ Óÿ»cNõD\±h)ŒÕ—Ãé¾±´'âþ#§{1ÏoIè…„…» ßÂYÓþ gÒÛ0#náüåÓ _>FþïpÚýþöñªs™ò…¿öˆV *�[,?WïÝ‚rK&UŽ©5eö�RÙÎ8ÿBÈëÞãýý¦Ë«êENû‡atÿ€‹ÒßWà‹/_TÍ#¢ú_¬ìœËŽ·­¹·,?32&V´ëÇEL�ñú·랇8ïB`ë�¾×/2ž ¼Ã€Ó§Ÿ Yü2Dïs(Þ5I·„›çoÅî…×ÁÍþ/ LÞ¬pÔ¬è¾ Ç¶�„Ém3`\¼aîBœ¯DßJ2CøW2ö¤ž“ L¸*àíGÎÁ£Oz±é’ýõìëj^5?…Omø$¾¸àFnÛ;ñÁC²@•ó�qô©8ɉãòß~]n+öš¶sû@ô‰þŸßt¾¸éø癷Ä'ZïÛDzÉS`ô ÙÂ0`íû{×= \°¼,pÏn²0»Éÿý§^q 4 ˆæ7BÌñláD* ã³·=ÝS½,ó×Êç1åñ¿`n÷F´”¼`#„€ñÑ�­›€YÞd¾H$a|üKP/= qØ15�ÇQ³�ª™˜�¥mq¨m�s3hS…ñžk!¿}#Ð>Xâýh‰%˽sfÛ&ˆ³ô:µóøök€0!fy“¢­Æ%ö>ËÉ}+eëžíÍÆuÀìù^ƒI'ˆÓ΃úùÞvÍÞÄŽ8þt¨?Ü Ì]HŠ£Œ¤QÁýƒü Þüæ7ãœsÎA"‘@&“A.—C±XÄÂ… ñ¡}hàN˜q�rA3 Ãp|`Æ;;ú÷v«yÏ,½¬ÊfRÕ~ìBÀ™ñums7},ÌÞàfOôPvÕ ª&2Wx°½õÕíÈÆ ¿Hß¿ÏéÃQšÿ'V3’É™@OAÛ&Œš‚û¹heÞ°ÏhŠDÈñ:äq°û²;MK_²[EsÂÀ±sýôÆe…üÛïaœRñ/‹—Á¸úË0¬DßCä";Ïß>³á¸qß¾ËÏÞôæ ZüEÛ>zX+žÚUò²q�" ÈuYì�gaN?Ž"3 Ί_ÃpžÙ‹�‰s÷Îô}öз•q¦]ÙtdêPÞ¹ú§®‘ÿúÿA¥fãÒ÷·ã}êÀv{:6侎i{ÏRÂ{MŠ˜÷g ýRÍ .¶TM*Ug¸:`y¢ƒT@Ü kxù‰šöMTú2>|dnl<™X ôE®6=ï²ù[ö‚õÙOB¥*E\ÝIo ^¸é,ÐÛ ¹=cJΤ‹`¼é�P ÷†Øg%Ü™{áä){ýè ìÝù"Tªr­ÉŽªÏ]Ch^°Ç½ùµ@áÕÀò¡ú„cãê/›7 ÷.gE6ÅEŸ5öŒ¯AlþJ¿~JëS´M�xûûªÆ¯ŠA{�7^\%97C,l†ñÉo– 1mJî?¡dxÓv“Hö·Ë[Ç÷?Îþû––UÛL×lÛŒ×í½ûw)Ìišƒº×XqðÄÕÌÀØLˆ·â¹5ÀÞ}™«Á,o+�ñž©-`}äÐüyc‡Í¿¦ÜöÃÌyEYû'±´Ð�ãÂ0`|äF`ÝsÀÒ•@÷-å×”�À+Ï9FkÚ'¸[†ÀâI1¨®c�îŸzc6W Õ !€ž=×b‹ûÅÔ¶)@Û\>CáØ9I,móÇñ¹ÍTÓÞÀåW{"Oÿqô:­ˆíè³–0gÁp½ 8S_X9õpâiÈì)Þ¶³æB¼©Rß 8®÷¡m‰Z‚{”ß…Év7ìÏ�ùúµPRÀ�t!D,í][6ûìËà[ñ$I¸ þæÚcöô/ 7��׌µî Œ£O†”«àìü"`¶â¡Ž pïÎ×âôÉ?†Lì‡TÌ—Žmó6Ž›{ëd_öìÎF 6WRÀgÚ�¤)ðªù•cFývZÄoY"™À²�õòçY¸7Œ� 0Lˆ~q¯šØ”>(⽓0¹c'ЭÛ+‘�P}Yç}1Ã7Y§˜†À+g{;Ô/†îÓáÍl³§ãk½à�û§  ¿è@·‹ë+JyÆK¿Årc7fàcä1£_Ü »�†Ñûg¸É`\ú6Ëö6ÜRµuyö ö¼ß½ä ä�GM†‹æ*�Ù9¬µï_~ÿþêóÄœ3ýb·ˆù¿GqÖj̘?·Î“0„ð­¦ ¸lÿ&<µóXôdÿ‚D, X“±j¶ž«î4†¦¸�ë�ß�…/bv«Uý)½cReC“´VÆüÂ0¢ ¹¶�iB¼âX½=�õe‘'N:Çÿn5 %Œw}¬jw㑹¿mÞbˆy;µ�þów`ùå&S[•¢ÅÊr¥ŒEKa~ú[Z»qÒ™¡ï©Y4€˜½@o;䕇Tß­¶”©úý¦é æý(úŽVœyÄŠ�9 Ëçœ8÷mû,Ü{L[ÈPŒ”QÁ}Ú´i¸ï¾ûðÛßþO<ñzzzÐÔÔ„•+Wâøã�G¬Æ Ê0 Ã0 3ÖÉ˺¥—ÔnêY �ÀW4U ðd À™ùuÈÞB¦éº;µ¨®uX[Sð‹“’5 C@|�—?Þ¹î^.*‡¦“éÜ£,á :æAúªÐàâӑÁ;žÿ!bÂÆ3ùŠí‹ˆÅ�ý¸$-�¦öy½ ï�tÃZˆc£O¼œ¶È¿´ØÀ /îvðê!˜‘†ÌzK©÷mß…ÇwØxåÆBuÅ�¤‰}&Çñ•ãÚ7¦5�y_ªÍ­@u⯫/‡ú¿/†q¸÷ð~ÄÌn¢2¡Ì€(C-§®îÖ0€¦vHø ¡9S?�øzoßíŽóÜã½�‹AõeÁGÅøà§!ïúŠ¥7Áœ5*}„ˆA¼úuåmÒ1ËúD&ôZ°³WÁÀ#°»VðŠú‰ckK±d¹Þ–΋–[{Ȧӡ^ž ä?2ð©ü‹\ÿ@9ƒ`¶B˜­ÀR/“ÑÞýy;*¾"s �³ýïmŸ´Oƒ°Ä?ÏäøäÃÀÓÿõ„ëþ÷¦ÒÀ~U"P ÃÝm{+ÌÎoAÀ�=ã›~Žö´‰³÷ª½²I%–à÷æ=øÉ³�åk׬ÿDs‹'þp[ß³ãfÀ퀽àVˆôá@ñYò}²é 8¥g Ün¸“/pßû‰›"ÔŽJìX¤~œÙ·ÂÜõ%ÈÌ ˜ÚÔ‚‹û»‹÷DÞ—2Ák35ø wgÊ'`m¿2±°fRB®Ë¢ðý…PÓ—ÂXÚg-4}¶ßF¤*¾¥y¿d*¹?¹Í§Žš„û^èÅ©UžâÇÌIâ�/tŸq0Rp§|ØëÛ(|}Ë{±;~<^¿ÈÚöšë›�¤>¿ ôÕã8zvSÓ“09eú~ׂµ,ÊíS>kûµ�Ƀ€`|¬�˜¿Wí ,oµ‡ˆ˜1Û·ú¡ÿû²g}± çF3œ®#<´NÐg±£«“ú~_Úö^ûü/°}ÕÙ¸ð°9€k{³«Á}„ëŸDïË ö*m‡ñwßžñu½‡L1—š€«êG˜g¼ê®ïx«U–¬ ¶˜`®‚¡¤×ߊ�ª¿¢­ ÞoD,C`ß)q•"šÀÚ7éÔž2½=UÛ-Šð‚�ĉëÿ<˜�SĤvŸøн»2a:Œ·½8üÏ*ŒÀïA­Š!"‚ŠjK™à ­°íª†¡�—Šù™aSÁâñ8N;í4œvÚÐn˜†a†aÆ*;«¼W*¸—^ò¨…é/šô®¥0²�Ùã# £”Âsšâ3²–?Ã�ÈV¯ìGã“,^µ …ÙÉI@OÇÕÓ lZ,^æ=¼ôg50ÙÄP /– é½BïÿðÂSÀò‡¼B\wä$<¹³„Cºj®:¼�~÷VìÿØ=ý=@Ù–¢žˆ£N„hžL™^.4–‰øäªÅx~×5˜oþ²ýÉÚôJ®DiîϘP/¿4¼ýž»æûþ×ë7â{ÜÌ9�-Ó%Œ+­“!ÚÚ~ãPhn­ü]+Û»êXªžÜæó`ôüÎôÏzHÙrŠéÃ`Ħ#)Lö€ï¡©´?+›BËpŸîÙ,9Û¡Òõ³GíÄR<“ïxà F¥d·çÅ èYØýnûÈ­0W‰½àÌøj]úÒD@ª(`ZÚp'½næ8Ïë]@IrShjò¾©Ä>5_ßj\óGÿÁÍxÃÒ fe£Å[%ðœýJ¯Ê B`ŸÉÔ}ýûíNzÜÌ @lö€Ù·ÃÁžùX[®€Ì¾ è+†ªÒ¯@iÁ?³ Æ….ÔÓ�BÍ[ìþ4@fEè­J¦õê§ïFìCoC6e¢§‡Ž*X�ÅÖ‹MFÂl©²¶#~±[œxÄÔ™Àìyt1Ëçã¬w]cÖÜ!÷7ö´`m¿nKm”kÛÖaÍ/~‹¶=Ñ�ýˆþCzo* |Tí�s^ŒN•¥ Q‡£Œ ±ÓcöC>“>ÿùè7MB¼ç=C˜Ñf†a†l¯ܧ4Hp7w~ÖÎ!ûÁž÷‹²à®`… /Cäß[K¸úï�€Ï= ¥*Á=^ÓR¦ñ)¦Øoú”²ç¬ŠÍ­ý†¡¤ ùÉwÛ·@¼v5Ä©¯¯<È×°õ.VóðÎ/ÑÜ:°ø�Ö¤Q);MqGä_Üè¶ACE&™‰;+kÙ·Áaí"†¾²A%û²ää CîcȘބ…0Œ†g¥‰Ùó!N8êÙÇa¼åŠðíb�3ýz@}fè1*6wЫ`†µ|^%–‰ðÌÿ¡0,ûX#嫹Q½RCVæ×Ô´”©qžTï÷+úâáÄBó®5Äu‹z#³'¢´è1=ļU-¢‡®‚TGÀ•k Ü.8S®òoA -Íù¬mƒÌžX™ ê§©ªØy]'(‚»:"dÛh˜�sÚÜ÷`­ s=‘-ç¢ÔüºãukÒÄ+¶ü§aû1âÔ°G ­m@çNЬ}„d¸3{†!ŸI7ß|sämYpŸ(¥�Ï— ê±D†a˜qÇf¼³Ý©Ü­ÆîÖÎFñ1˜Û®©d¸GÉn$_úOåó|ðÏ8£ÊR$Vë9l‚û�⃑…=ý«0r”eBÕ¨U ñáuËF¯Ð$õãÿƒ:ä•K™ î“Þr)úåãøOûr\²l µªþ~ë¨8“.ƒÕñ58“.z'õX.>¿o{8 ÏxC´c,Ž<êo¿‡8íܾ†áß=u!=ê_†8ó‚†�Q×O`6Þþ¹àN~w={µˆ:œóÆ—B^}™gAuî;ê°W�¥Þ ç»ìÉh‹í„Œ-ªoÇQ‰D ÎŒ¯Ñ¯ÄP*>¨ÔA°çý’|»qþ…�O= @À8¿zÏu쫯Ǡ¥LعPÏØåûYy˜W yû—_]¿±G C°ÜÓo¹Â+Z�Cœþ†ð ¥ m‚0’:Ä�±ž~úézî3P °mžAcF‡ã3ÞÙæv–ÿÞîVç-Pf¿­@ýE×ÝEÿ ú=/ô–ÿ®Y4u·–C�²ù Èæ3ý¾º¸q—×(õM‚4ÐRFÌY€O¼q2vK “šÓ¿a´à;^õS�Ü)‚Ûvñ -| àáqÄqP?þ?À.AÔȯ+C´Âi4â­ï�8û &M®K{êB\t%Ĺï¨Û~SÈ:?ðËæ3!›Ï¬kŸã1uŒoõê<$kdÌ�SÞýÒ·ñ�½ÿ޽gŸ=Ò»24bè`ヘ2½1߬x‚·[£¥�¥°,¯àuoÏ_%²G¨Ã=A£sÀøü­€«m1T}½ŒÒ{†F3’:Äè?“˜1ƒ@8>0ã� ¶ç£hÀÀ¬XÛž¼–2L�ã‘m%òµx­¢©C`dâC²­ ùð×F©Ê„QŸsZÌš ÌjlMqÖ› >˜12µ F‚ñtÁ‹û�xË»!N8˜=°Ç¸3í³p&¿ °Æ¨˜ÜG£Oó1¢'’! Ž; êÏ¿†8ÿ¢Qo)ÎØŽ‹£qâ™Pü|LØNÕBdš`|î»@®bÚ¬‘Þ�a$cÄ�÷X—Ê2 Ã0 ÃŒ%:¥g¹Òb¤kDáÐ7ˆJD+\Y§áçõ‘ÅZ‚;ß'kŒq¡t´ „æŽ�÷23l–M®Ä†WÎC5Fa˜À¼Å7@lNcwˆqŒ .…:÷£é·vÅ·Ã0ù~kÄ0οêuo]çØÙf Ûx»KFgÈO„·Þzk=÷ƒa†afÌÒÕ'¸7› Z¢® á¯5ÀýXÃS&V+Ã}Œˆª¢îŠ3܇ªÊímé•£m˜qËòÉq¼mE{\üÏòìHï3Já�40£Om¼‡;³g}ç3ÖhèœÙÖ­[qÓM7áU¯zU#‡a†a†1ŠÒFQÙ¼ ÷†PSp¯¿¸ëÖÎky¸«øB¨˜guá´½§îû5ªèØþ?¤é¤ª®�tfäöƒ‚E fòÚ%\~`3Zœ¾ÊÐ4ÜR¦±ÝOPê_�Òà™†ÓÔ}ͳmÛøýï�ÿøÇxðÁ!„ÀQGUïa˜QŠãŒLõ_†aF?˜ñÊ·«üw«Ù ŒE¹g3Üe­¢©µž)…‰ÒœŸAŸ€JG¿ÿÛÓñAYK•X>´>þû¯Ð×Fk1Ë‘Ä8÷�ÿý Œÿy÷HïN5F;|Á0L£">4ÂR†š¦.ŒTŒ¨›àþôÓOãî»ïÆÏþsìÞ½‡r®½öZœxâ‰hnf¿ ‰€” ½½t�5†a&6˜ñÌFgWùï™Ö¤Æ R#Ã]íAÁÝ€9PÆ•5Ê:6úX#ÜÖÕ0ºï…pwÀ™ñ•A¿_=õ_à¹5áXœáD´OƒqÃ÷)!Z÷paafLÃ÷ S_ÆSâôè‰#Y4•a˜0F2F KpïêêÂ}÷݇ÿøÇxê©§0{öl¼ùÍoÆW¾ò|ä#ÁÒ¥K뵟 Ã0 Ã0£’�UîÓÌÖ†Œ!F‰¥L-;™1…‘„=÷$ · \Iò«Ÿ¬½g¸“ˆæÖ‘Þ1žÔ'†af�£°RjÀ‡ªÑ†} yî½ï}/^ùÊWâsŸû.\ˆï|ç;øÝï~‡K/½jŒÌbê‹a47§`Œ—‡q†aêÇf<Ó%+Å3[Ìy¸WYÊÈØ"ÿkFã2ÜÓ–ÿš�×ߢtä⃃ۥ�ïõ·­8Èÿoöp[°à>ªá{†©/ãéJ=ñ�3Ü™ˆ°^ºGÉ1ä ÷_þò—Xºt)>õ©OaÙ²eõÜ'†a†a˜1CµàÞd¤3Hu†»5 °_¨ü»!îÞÿM˜”0ÐQ”ÆQ†ûpp­IÌYõÄÕ¶”a†a˜‰C&nÙÃ�aÆ6Cž†{ç;߉îîn¼öµ¯ÅùçŸ�Ÿüä'(j,wf†a†‡t¹•lçf£AîªXù38†HÖ}8ééë0„?Ã*ÆO€këmÁm¶”a†a˜‰C²– ¶”a˜1Ͱ÷?üáøö·¿�iÓ¦áꫯƑG‰«®º BöBd†afB°½Êý¥A‚»ÏÃ=0F#Цö{¸›Bø÷ú¯˜{Ø”à80,¸�-ø¹…a˜ k5cÎq`˜±Í°Š¦À‘G‰#�<���øÙÏ~†ÿøÇPJáŠ+®Ài§�†SN9 ,¨Ç¾2 Ã0 ÃŒ:ž)mL2²˜l65f�*wˆ`†{ýÅÝ~wCø‹vÅÙRpuKÍ—=ÜÇ,>1 Ã0£ ¾åb˜±MÝò”Z[[±zõjÜwß}¸óÎ;qÐAá;ßùN9åœ}öÙõ†ÅH©ÐÝ�‡”¼¤‰a?˜ñŠ£\t÷y¸ÏŒµ5.k¬¦¥L㊦š>1¹–2c.>îZ†;{¸�-XpÕŒ¹Á0£œññFO|h„¥LÝ»d˜ ÇHƈ†, ^¹r%®»î:üõ¯ŵ×^‹xœ—ÕN¸à2Ã0ap|`Æ#ÝUS›U0ðM îFã,e ! «.Þxƒ,eÆT|pØÃ�aö4c*F0Ì(dqkÅÜ`n³9‚{RÆk|`ëŸqÄ¢}ÊŠYsGpG&&##êÄ™J¥pÎ9çàŽ;îhä0Ì(Á0Òé8 žŠe&Çf¼R-¸g�ú/íGŒ�¥Œ)WVÚc ¸†Ç\| 2Ü öpÛŒ‘so‚2æbÃŒB>rX+žǹ{g°´müüFq|`ÆÆE–qÒYûì?Ò»3¡É1lw†©Æ²LDæÃ0ŽÌx¤«Jpojh†{ÅRfÏMíJTþc)Œ±ø@e¸l)3úIe€|Îû»µmd÷…�1#f˜¬h�ãO¼‰öE­õù=™ž1qí‘“êÒ×hcTÄ£A5|B�ñÅ0JÏTŒ3¦G;¢}Ì÷]7Ò»1a©ÑÐ w†a†a˜ñÌ.·»ü÷$#Û¸�ª,e”‘ñ¿ÖwOe7 §Êó0ÆwŽ!–2Á wÜG;Æ? ÌšqÌ) –Œôî0 Ô¹xe–OŽá�iqœ½8=ð˜¡4ç'�‰p&¿°&7dŒwЄ->~x‹¯Ý™ùmÈä�p[.€JÑ�±†œáÎ0 Ã0 3DvV î“Íf7U{¸‹@&}#3ÜáÏp�7(Ã}La‚{p™*[ÊŒzļÅ0?yÓHïÃ0ŒFKÂÀõ«xåÍhG¥�=ïW ãÕ Òxõ}ÒEÅÁž{OCÇffxpžÃ0 Ã0ÌÙåö”ÿn¤àîópßî}¾í†\_†; îªT ZYpg†a†aƃw¦n(¥P(ØPãµL8Ã0C†ã3^©Îpo3i)SñpWFc‹¦*¥Ð_'Õ4„/ÃÝjÀ�㘋ù¼Þ¦e¸³¥ ÃÔ‹1#†Ùcp|`¦##ØR†©J¥’3Ò»Á0Ì(„ã3^ñ î ´”‘•Lz¼âë]4µ*¡]+šj5 Ã}ÌŇ|¯Þôp·8Ã�aêŘ‹ Ãì18>0 S‹‘ŒœáÎÔ¯ú/Ã0ŒÇf<²Åé$D ÍFªöÆÃ@8› ÊšîÑhœà´lo”…û˜Š¿à.ÎztKÎpg˜z2¦bÃ0{Ž ÃÔb¤b îLÝ0 �t:ƒý]† Àñ��””�ÍÎ.À\«B4îü¶'¸Ãœ¢{¶×ÙR&g‡{¶7Bpsñ¡JpG�qòkÙR†aȘ‹ Ãì18>0 S‹‘Œ,¸3 Ã0 à �mN$„®®.ÀSO=… .¸tN:é$|ç;ßñ½÷—¿ü%^óš×à€ÀÙgŸ�¿þõ¯åפ”øÂ¾€ã�?‡rÞö¶·áå—_Þ£Ÿ�a†a˜±Án·"¸·˜�ÜËv2”5AqWÕÙRæO å¿—¶ù÷j»™ ˶¾ï#“…ÈöÊ5‚ESÙR†a†a†a&*cRp¿øâ‹ÑÜÜŒûï¿?ùÉOðÜsÏ᳟ý, ….ºè"~øáøË_þ‚/|á øæ7¿‰ßþö·<1þÊ+¯Äûßÿ~üãÿÀêÕ«ñÎw¾[¶lÜvÛm¸ï¾ûpóÍ7ã�ÀüùóqÙe—A)~¸ŒŠëʑކaF)˜ñF§ì)ÿÝØ‚©›+ÿˆQîõ³”É;[r.`q«…i™XEàï*5æ:+ñAÙ%`×ïSgV^XÊ“ ¸1L=+1‚a˜=džaj1R1bÌ î]]]X±bÞ÷¾÷!“É`úôé8묳ðïÿüãaÛ6.¹ä¤Ói,_¾çœsî¼óNÀ]wÝ…U«VaÕªUH$8ýôÓ±dÉÜ{ï½€;KW¯Æ¢E‹�Ífñž÷¼/¼ðþûßÿŽäG3H©�Ë!%OP0 ã‡ã3Ùât–ÿžjµ6laWVÛ)«±î›zÜòß Z<ÿöó—V²÷�™S_û`ŒÅ‡í[€¾D 1uF¥½�sf¢3¦bÃ0{Ž ÃÔb$c„5ð&£‹ææf|úÓŸöµmÞ¼S§NÅš5k°÷Þ{ìÊ*Z¶lîºë.Àš5k°jÕ*ß{—-[†Ç…BÏ?ÿ<–-[V~-›ÍbÞ¼yxüñDZÿþûGÚ?!xèR å,yª2nÿO½¦”‚Rt¿½7J¿CyoÿkBíù²>ýÖ÷Öê7ê{õÝ4îRý6æŽôùÍÇ�c„×/Ljá÷;>ÏïFÃ-ng¹}v¬ Bˆ†CQz¶ò�ÄbFàö­ÏR¦ÇpS®"¸ÏÊz㜵W¶¦À¡3åÏ9c¶WVˆé³`Â{=0^?cùüæ�!íÓD<†|Á÷^¿ãóüæcÈ1Âë—cÄðûŸç7É#˘܃<þøãøÁ~€›nº ¿úÕ¯ÐÜÜì{½µµ����R¢³³---¾×[ZZðüóÏc÷îÝPJ‘¯wttDÞŸxÜB"á÷í´mù¼ ÃÈfõ̰®®< •ŠÃ4ýYkù| ¶í"3‘Lú=ZÇEoo È~»»óP H&c°,ÿÒæBÁF©äÀ²L¤Óþ~]W"—+öõ›@Ð+¶§§)’I ±Xåò.0 ««!2Æ�R ÝÝž/l&“Ð.Æ\®וC8† ]]^¿Ô1ìí-Áq\Äb’I¿ýÇPúö7ô1,¡TraY&R©ZÇPï7ì@±h£Xt`YÒiÿ1”R¢§Çë·Ö1L$,Äãþ~K%…} «¿›t:ÃÃ"G’Çж]äó%1ÐùóM†•ó›>†.r¹ZçwJ)$“1Äbaç÷à�aÿwS뚦Qóü®u 'jŒ0Mù| ùüÀÇ�cÇ`ôLjäËís[Úw­†Äˆ¢ýŒ×,dÚ–Cq«7èÜë#¶—*þí³›¼ã–IÇñŽCü–9õŒýñÁu% ïü­1�ÛÊßzrî<˜É˜# £¯¬-|Ç“c„ÇD�|1ñbßGpŒàQaOĈxÜ*Ç¥*ç7ÇŽýpŒðà1ü1XÆ´àþðÃã’K.ÁûÞ÷>qÄøÕ¯~EnW}�òc®_{©äÀ¶]_[—R*ôôˆwyäó¥Ðý±mŽþ^ªßþq €Möë8nÍ}êÕôÏø ŠE§Ün¢L\WÖì·ÿâ ú­÷1ìï×¶8Ž«½Þß­~‡w õ×ÂŽ¡¿ß¡ÃbÑA©ì·²M­~û"Õ/u ûûUj ï¦¾Ç°ÿ½ÞƒWX¿�9†�ßµŽáD�ýñ¡ÿ˜rŒ¨À1Âc,ƈ;0`@õED;¿#” «ð_ˆ\¯P€ï6¹ï>§1âÅ�•mff¼ÛÄFLjþøÐÛ[,{,ŽÖ!_^_n/¶L�QðŽ‹"nô«á11cßGL¼Á÷#ªááý¿‘1¶Ýr|�R•ûåQ�c„ÇŽC‰‰D6t›�³‚ûý÷ß�|àøØÇ>†3Ï<ÐÖÖ†µk×ú¶ëììDkk+ ÃÀ¤I“ÐÙÙ©½ÞÖÖVÞ†z}òäÉ‘÷«z)Eÿ?Ø×Õïðö©²£¾ýŽ­c8œ~w 'ÎwÃǰ±ýoŸôcXýïÑöYGc¿|~¿ßFÃ.×Ëöh2’}cT¶¯×gÅ— ún@U|IÃ�áÖ*K™YsÀ~z}0ß�w\�~wÊ­›*ÿnŸQÙ>�ìg,žß#†»OçrŒ½ýòù=ü~ù6¶ßáí“‚”•íóÛ;žŽ!Ÿß#Û/ÃÆö;¼}jLŒˆÊ˜+š ÿùÏpå•WâK_úRYl€+Và™gž�ãTf�üq¬\¹²üúO<áë«ÿõD"�½öÚ kÖ¬)¿ÖÕÕ…õë×c¿ýökìb†afLá*‰Née¸7©¶¢ø,¬Í—Âèú)¬í/·«ÄÞu‡¢Çön.¦çÙÎØÚçážJMU6†Ã\rÊ0 Ã0 Ã0ÌøaÌ îŽãફ®Âûßÿ~uÔQ¾×V­Z…l6‹›nº ù|ÿýïq÷Ýwãüóϼþõ¯Çßÿþwüñ�D±XÄÝwß�µk×âôÓOœþùøþ÷¿�^x===¸á†°Ï>û`ß}÷Ý㟓a†a˜Ñ˓ŗQPÞ²Êù±©uí;¶á<˜Ý÷!¶år½-·+kZ]Ç âJ…u]}¶8ÃOêw¨RعÍûÇÔ™~_ÇZ)H Ã0 Ã0 ÃL(Æœ¥Ì£�>Š^x×]w®»î:ßk¿þõ¯ñ�o|W_}5n¾ùf´··ã=ïyŽ9æÀ’%Kpà 7àÓŸþ46n܈ŋã›ßü&¦L™8ï¼ó°}ûv¼éMoB.—Ãa‡†¯~õ«{ú#ŽY¤Tåâ Ã0Õp|`Æÿ)¼Pþû°Ô’ºö-Üíô FK]Ç ò‡õCG6t(c&>¼ô, ¼#æ,ô¿æ:Ć©c&F0 ³ÇáøÀ0L-F2FŒ9ÁýàƒÆ3Ï0ã�n™/ÿÝdÖ×Ã=QÇ�z­'¶›MÃêrWÞÅÕïÔÚgfÌaõ;ÆL|ÈuWþNeü¯q†;Ã4Œ1#†Ùãp|`¦##Æœ‡;3zˆÅ,®Æ0ŒÇf¼ÑU%¸7×¹hj*¹Âß0L±ž Éj¿êðÖa÷•±Ô¾^þ[¤Òþ�‘[À0ã�±#†Ùóp|`¦##8Ã�a†af�ìv=KÒ"áÑíày};R¡0ÈäçÑÖ3ùS(ØV¹ßz±3¯÷—‰ Ìoá[ÄšÄß[Ê0 Ã0 Ã0 Ó?M1 Ã0 à ’]®g/2ÉÌÀ} •‚µém0s¿+o—�!Þ?X®þ÷$<š )¦ZgÚ’¼r@JEÿ¿ÙR†a†a†a˜>ø‰Ša†af8ÊE§Ì&WÛº8|b{=y¹8¿!ýR¤­‰{{¨”‚¼í&¸X y÷w+íA˘¥+ýÿæ w†a†a†aúà w¦n(¥P,Ú\¬„a ŽÌxâ©âHxçò,kr¹]¨RùoeNËÅ%Ø‘wÙ˜3¢wàÒÄ_}ÿÎË&,˜< PóÁ’«ðØ¿˜üLÇžõ#-ñA=üwÈ~èØáýû—wA÷ˆ¶v 7WÙpÒdˆlÀ?Ÿ=ܦaŒ–Á0ÌèƒãÃ0µÉÁ‚;S7”ŠEÎðbF‡ã3žxÑÞRþ{ÿäüÊ ªâ‡.3«ð£Ž�ã÷ë €ož8sš¢Ýv9Û>«³’]�H/ÁµKÛ†·Ó!¸Já5?ÝÖ�¾£2âƒ*ä!¿u½nÓÛ´µCÝùír“Ø{_½ƒê w+Ö ½d˜‰Éhˆ ÃŒN8>0 S‹‘ŒwÍ0ÓL“O)†ah8>0ã‚ÒZ¼óZü_ñ§ødé~Ìó•¼wËým“]Û .7]ø…yßkhûSè{véÊ&bËÆ2âñ!×­‹í@9s]=x¹I Úfb¿C*Ÿpzý÷�a&8##†µp|`¦##821uÃ02™ £þKÞ†Ûp|`Æ fç÷°°ô©#×b~ïU¯V–*v•üïÜ©Ü�܃db§.Lí±ñ€Q\—n·KZ“Øk™¾ÝÊC!^÷ˆW� qÆë¼s 3±1‚a˜Q džaj1’1‚-e†a†a""d§ïß)Õ[ùGµ¥Œòç4‰ä5ñߞɾ w•ë†ú÷߀‚7¦˜1Xq„Q¿ü‰ç¥ µ³ã7d©©cCõtûšÄq§i› ! N9§{Æ0 Ã0 Ã0̃w†a†a˜¨T‰êP%³W6 ,"4e*ÌpßÏëý–Ï�þ³j ÀxçUÀ�G ¢ïÚÌÊšuëkLšánÛ7—ÿ)V½"‘ÜC;Å0 Ã0 Ã0ÌX„-e†a†a"ãܪ+Þ»U[ùöÁ¬b΃5ÙûÿúµmÑ6f²àîDZ�îÝ•·6¦x-Ã0 Ã0 Ã0ãÎpgêŠRjà�†™�p|`ÆR¹ðKÒUçuÕ9.•«Á¸´gC¥ŸØ‚ªÁ¥¾± ЇÈ–X]û‹ÊˆÇ‡KåØå©€TzíÃ0ÕŒxŒ`fÔÂñ�a˜ZŒTŒà w¦nH©ÐÝ]€”üƒÇ0ŒŽÌx¡  ¾ T ÞÕ–2� ÷Á ¢ªÞØœªvJp'ÚÉ!Óâ€%“,´$öü­á¨ˆÕ‚{,^ù;×ìÜVùwrÏ”ef”ĆaF%†©ÅHÆÎpg†a†‰H^ÐTÝàÁ«Ý܇^4Õi¿ñ—Ï‚‚ gê'«ºoŒàþ¾ƒ[ðÏ-E85>ðÆã•jK™D°Kuë×üÛ±àÎ0 Ã0 Ã0Ìp†;S7 C ©) c0Fµ ÃL8>0ã…‚,Zªï*ñ]© ‡{ôs_¥FiÞoaÏ¿*¾°j(B\óÍ 'ÎKarjdüÛGE|¨ÎpoŸ¾]©Ôø}aÆÇ¨ˆ ÃŒJ8>0 S‹‘ŒœáÎÔ1˜>†a&˜ñ€£‚^ßt†{Ðé}°g¿JìC4K!ëìá>RŒx|¨š¸ûì{0Ô‹ÏxKžx¸òÚü½FbïfÂ3â1‚a˜Q džaj1R1‚w†a†a˜ˆ¸î*ÄÃ=�á^—û`Á�©R*ärEH92Ë ÃŒ^8>0ã…¢ ͤw©‚îu�Üûw3VÜñôc�|ËðûA$€®‘Þ‰jL¾=f˜ÑßC0 džaj1’1Âx†‰Žë²—,Ã04˜±NNK™ªb›>K¿À^K™ª w¦aˆÉSGz† À÷ ÄÁñ�a˜ZŒTŒà'6¦nÄãJ%‡´™efâÂñ�ltvA pGµ”©KÑÔÁ}ÅAél!`ÂË<éø0o°ßÁ#¼ ÃTÃ÷ ÄÁñ�a˜ZŒdŒ`Á�©B$1ض;b¬ ÃŒN8>0ã� öNLÕáê×°”æØ¾ëÆŠùû>ï3çs„‘Ã0²Ù$zz ¼$œa ¾‡`& Ž ÃÔb$c[Ê0 Ã0 ÃD`ƒ³†v£V±”�ÏR¦Îî²*“> ¸ÃàÛ9†a†a†a˜Ñ?¡1 Ã0 ÃD`‡ÓÙRF÷áîÜ  s¸½3 Ã0 Ã0 Ã0u‚w†a†a˜tÉ^š¥L˜‡»_bÃMqW52ÜM܆a†a†aF ,¸3uC)À¶¹X Ã0:˜ñÀ_óO™êUB¸/۽ηX53ÜÇöídžajÁ1‚a˜08>0 S‹‘Œ\4•©J)äóöHïÃ0£ŽÌXg·›-Ã]¨*w_†{�³ÎkMë–2†©Ç†aÂàøÀ0L-F2FŒí”(fÔaÃv©efœÂñ�Ëlsw€îáî³”©¼¦†]%58L•°Ìp–2†©Ç†aÂàøÀ0L-F*F°àÎÔ ÃÈf“üƒÇ0ŒÇf¬Ó’áñe»7ÐRÆ_ES9>0 S Ž ÄÁñ�a˜ZŒdŒ`Á�a†af:Ë‚{ºhjÝo±ª-e‚û÷pg†a†a†OðÃ0 Ã0ÌtÈ”¥LuV{•¥L½=Ü«3܃v5ãÀR†a†a†af¼À‚;Ã0 Ã0Ìt†ZÊTý»Ú^u^¶XÝw0£}Œ[Ê0 Ã0 Ã0 ÃŒ'XpgêL0ó�a¦ŽÌØ¥Sz‚{í¢©•lw%çá.‚îãÂR†ãÃ0µàÁ0L†©ÅÈĈñð„ÆŒ¤Tèê*@JþÁcÆÇf¬ó\i3–ÈX¨:¯x"û³6îxª£Üš6.Õ–2�ŒvM€cp|`¦#† ƒãÃ0µÉQç§A†a†a˜ñE^–`ŸÆ-¥{µ×Dñ9˜ë_wG '5m,··5Í6×q'|ESǶÀÎ0 Ã0 Ã0 3žá w¦n†@&“€ÁBÃ08>0c™ÞŽïãÿJ?#_*«ð öÏ>Œiñ-åötzA}w¢cGÕ ãëö�ãÃ0µàÁ0L†©ÅHÆÎpgêŠiŽ/€a˜úÁñ�sÈX[Þ‡™=¿$_VˆAÀö¿E üªã ,]>—¬,áOõ༽3CÞU*BÝsÔ¯î®4ÆbCîo´Âñ�a˜ZpŒ`& Ž ÃÔb¤b î Ã0 Ã0ý(QøDñqĶ}¬æ¦Ÿïy¿[—ó¿Ã/·0»ÉÂi SCöXWO= yýGô&OR Ã0 Ã0 Ã0LãaÁ�a†a¦c÷ÛFˆÜ¿\ëHÔÜf(b»ÚÝyËç�'¦7˜6â�WB=ô`ùƒîŸa†a†a†i,¸3 Ã0 À²#‹í�B>ð ¨[¿Vs1u&ð–+ ?Ø{ß=´g Ã0 Ã0 Ã0LXpgꆔ ½½%H©FzW†ep|`Ɖç¸Í¦ø«1³ô+ܳóœÐmÎ_:8Ïv¥ðòK�_ø°»£öÆV ˜6 "™8|PãŒV8>0 S Ž ÄÁñ�a˜ZŒdŒ`Á�©+ŽãŽô.0 3JáøÀŒfŒî_ ¸Í[¬³°þ?ÁÔØeØfÓ>êß|Čّûkp|`¦#† ƒãÃ0µÉÁ‚;Ã0 Ã0–غj¾Þm-Å»ŸºŠsC·1ð©£&!nŠHcª|/äåç¸�xÇû!?BDë—a†a†a†yXpg†afBb½–|­”9›;žÇGŸý 6—jg—ñØ6LIGóm—Þõ­jn#N:✷A˜Ñ½à†a†a†a˜Ñ î Ã0 ÃL8Dá1X»¾D¾æ´¾W¬yžé°ìçÂý²XÔ‹4¦rì�Åö“_ ãõo‹ÔÃ0 Ã0 Ã0 3ú`Á�©+\!œa˜08>0£å ¾þÔЗŸïNGÛ¯?z–·Ç£ )]È÷\0ð†SgDêo¼Áñ�a˜ZpŒ`& Ž ÃÔb¤b îLÝ�R¡··4Ò»Á0Ì(„ã3jP ‰ç„¾l£ W>~æ€Ý|ê¨ÁˆíòÚw¹îÚN›qdmOùñdžajÁ1‚a˜08>0 S‹‘Œ,¸3uE€‹ƒ3 CÁñ� X[?úZ^ÌÆ¹knEN6Õìã¬Åiì?5šØò³Wë_ ß ¹â´ó Ž;˜˜¾í†©Ç†aÂàøÀ0L-F*F°àÎÔ ÃÈf“èé)@JþÅc¦Çf4`î¸f×�¡¯ß¶ùŒÅöO¿rVN‰.¶»W¿x¹†Ø>©Æ ߃"rŸã Ž ÃÔ‚cÃ0ap|`¦##Xpg†afÜcôüÖ®/‡¾þ·®£q÷Î7ÖìãÕóS‘Åvµkäûß<ð~½ëcZlg†a†a†o°àÎ0 Ã0ÌøÆÞˆØ¦·†¾œwSøøúèÂwiùí€UÀ×g¼ KÒÍ‘†SO= yýGÜNœüZˆù{Eê“a†a†a†°àÎ0 Ã0ÌøE9ˆ¯{UèË¿í8wìøPb; ÕX�šm¸'…¼¡†Ø¾â ïx?°î`é~‘úd†a†a†aÆ,¸3 Ã0 3n±¶¼Bî}ýÿ¶]Œ­öLò5exígZmˆ‰�o™ä¿€ºõk5·1Þs­g!³âÀûc†a†a†aÆ,¸3uCJ…®®üHïÃ0£ŽÌH`ôüf÷OÈ×zÜ,þ¸ûÄP±œ%÷I.p,y×w¡~u×€Û±_»Ç†ajÁ1‚a˜08>0 S‹‘Œ,¸3 Ã0 3îÅgÛôŽÐ×Ïxê„ÚÈØß§ð¯ÄV@‹™ÝN)ù…�O<<ð>½áâ·a†a†a†aÆ6ÆHï3~0 �t:Ãàì=†aüp|`ö4Æî;B_ëq3¨%¶_óŠV<–ü[ùß{Çg‘Û©|/äVGÛ_ÿv'œ>àvŽ ÃÔ‚cÃ0ap|`¦##8Ã�©+–e°Gz7†…p|`ö$BæÈön þÐ^Dõ+ǵaJ“�ÂÆR¹í`ÂRFmZyU´ŒuqÎ[`œ|v¤m'*†©Ç†aÂàøÀ0L-F*F°àÎ0 Ã0Ìø#Ä+ý–­—imÓÓ&N[”ÂÙ{eî}Ö÷º)ô�êß�¶o}Ä‘'DÚ–a†a†a†û°àÎ0 Ã0ÌøCêÅq¾°ñCä¦_?a2’VE ÿMÏ£å¿/i=™îë¦wÁ¸üjˆýp;†a†a†afüÀî6n܈ /¼‡vŽ=öX\ýõ�RŽôn1 Ã0 3d—ë~3~Þñ:m³cæ$}b;äUÅNæðÔ²{µ}sÍá�w}ŒÅv†a†a†a˜ g¸x×»Þ…åË—ã÷¿ÿ=vî܉‹.ºíííxË[Þ2Ò»6ªù˺»1¯ëëÈÝ#½+ ÃŒRvŒô0б-å¿ÿܽ 7¼|@XE4/û-z_^‰XË<6íy\°ÑÿÞ®÷[fÅ&Ól Ücq7ýÂ0‡ý& J) %(¥FzW†…pŒ`& Ž ÃÔb$c îU<þøãxúé§ñÝï~MMMhjjÂêÕ«ñ½ï}�÷hÙ};öJ>7Ò»Á0 Ã0>6•fáën,ÿÛMtb{üe`ÑË} áï�iµ‘í*ß tujíâµÿqÈÑ,¶¥€R©ÆÁ0Ì„†cÃ0ap|`¦##Xp¯bÍš5˜5kZZZÊmË—/ÇK/½„žžd³ÙÜ»ÑÍîäéx¹°Y“3܆a˜ÑA¯Ìàë¯@Rõ⪀wý³þ2ðz‹¸°pp²2v‡öšZÿ‚þ†s`œzî°÷y""`Y&Ç'¨1 „cÃ0ap|`¦##Xp¯¢³³ÍÍ;¶~ñ½££#’à. „ß V)”—/†ÐÞ#eøkJ)(E÷;Ð{£ô;”÷ö¿&„@ÿ.ù—�PkТmÏ0 Ã0#AÀGñ=ßbÏaÀû²XÆYo‚qòY€Cþ½¯ü¶N¼ûÃH¥âèí-Âueú­ï1¬ÕoÔ÷6껩¾ ö;”}ªÝocŽáHŸß| 9FxûË1bøýŽÏó›�á莦Y‰Rª:õË1‚ÏïÁìÉ# î†ëë�[H$b¾6Ûv�ÏÛ0 �l6©½§«+H¥â0MÛ|¾Ûþÿöî=(ªú�ãøgaÙ%njVÖOIF\D Å¡fÈò2V^0ñ–S“VšiJ!cº˜1æØÅKI¥d’ å”™9:6áˆvC3ЦH /¨€Àþþ ÖVØõ²Æû5Ãû=ç<ûì—3Ïž=|·^þ ´¹m«««×©S�_ìÖRÜÊÊÓr:¥ÀÀY­îÿÞ^]}Fµµu²Zýä·¾¾A'OÖü×.ÉýD«ªªVCƒS��V4žB§ºtQM‹3À“%8DaK²äÞU’T[[§êê3ò÷÷Sp°Ým_§Ó©ÊÊjIRP�M~~îï÷§NÕ¨®®¡C^GX,rÍYuõÕÔÔ�wƒƒíÍ.êOžllÆ]ü:UQÑ·¥9]+‹å|çw€üýÝç°éünyëuò¤·ó»ZN§S�� ðt~_ü6ýn¼Í!5‚Ñ„шшÑèbj„ÍfuÍ—Óyöü¦FP#šP#Q#|¯ËâäÛ%\>úè#-_¾\[·nu�ýøã�š4i’öìÙ£àààóÆ8z´²C}ZÔ”’Ó锥¤H¶3Õ�_HÐà”¥¥çm:ÖË6yøÄ­)a#ã^è±-ns:%§oqåáÓЦ[*/ýµ¶üihkÌ¡Oq™Cßã0‡^ã^ʱ-Ì¡Åb‘Ý ššZ5Ô·³9¤FüWÿÉó»5çÐï†eé|v�wî:¹¸¸ÿ¾{5(ÈÎÝ«—”wU1‡æÏ!5‚Ñ÷¿y~3‡í»FøûŸ­Üá~)9q~3‡æÏa{®]º\úÒâÜáþ/‡C‡ÖñãÇÞøt~~¾""".¨Ù.¹Ÿ¨-iúå]ì¶ÖŠë[NgOTI²ôî+[H jÿù4©%ÍOgß·™u,q[7®/Ç×÷c�Žkñ³¸êƒÅK]i/ùq,q[7®/Çש5àÏÑÞÞï/‡ëˆÆ‹`#â^^sèKÜsçиœZ+.sè{Üö7‡Ôˆö—óÛ÷¸ÌaëÆõ-'§Îîwî¾ííµ¶Ç¸œß¾Çe[7®o9µN�¸P~çߥ㈊ŠRtt´233UUU¥ââbeeeiÊ”)f§vÙ¨¯o0;íõ€'ÔÞP#xB}à�Y5‚%eÎqäÈ¥§§k×®] ÑäÉ“5kÖ¬ ^»§¬¬²•3´–nÝB/ùXî£á—/_î,)ÃøùYvE‹_< c£>ð„úÀjO¨¼1³FÐpÀ4Ü0 w @ÃXœN§Óì$þKÊÊ*ÍNÁT~~54pJhŽúÀêo¨<¡>ðÆ—Ñ­[è¥?ï% ´€7:žPxB}à 5€'ÔÞ˜U#h¸Ã0‹EW\ ‹Åbv*ÚêO¨¼¡Fð„úÀ3k wÆb‘¬â½À¹¨<¡>ð†Àêo̬4Ü0 w @ÃXœN'_é €�¸ÃÐpÀ4Ü0 w @ÃÐpÀ4Ü0 w @ÃÐp‡ÏJKK5}útÅÅÅièСZ¼x±ÌN €IvìØ¡øøx¥¤¤4ÛöùçŸkôèÑ8p Æ�¯o¾ùÆ„ ˜¥´´T3gÎT\\œâãã•ššªŠŠ IRaa¡¦M›¦›o¾Y#FŒÐêÕ«MÎ@[+**Ò< ›o¾Yñññzâ‰'TVV&IÊÍÍÕ„ tÓM7é®»îÒ§Ÿ~jr¶ÌòÒK/)22Òõ˜ú 22R‡CÑÑÑ®Ÿ^xA’95‚†;|öøã�«{÷îÚ²e‹²²²´e˽ÿþûf§À«V­RFF†zöìÙl[aa¡æÏŸ¯¹sçjçÎ�JNNÖ¬Y³täÈ2`†GyDaaaÚºu«6lØ hÑ¢Eª®®ÖŒ34dÈíØ±CK–,ÑŠ+´yóf³SÐFjkkõàƒjðàÁÊÍÍÕÆ�uìØ1=ûì³ú믿ôØc�iòäÉÊÍÍUZZšÒÓÓ•ŸŸovÚÚXaa¡rrr\�©šlÚ´Iùùù®ŸôôtÓj wø$??_EEEš;w®BCCÕ«W/%''kݺuf§Àv»]ÙÙÙ-6Üׯ_¯„„%$$Èn·k̘1êÓ§w DEE…‡æÌ™£àà`]}õÕJLLÔîÝ»µmÛ6�9sF�>ú¨‚‚‚Ô¯_?%%%q=t §OŸVJJŠf̘!›Í¦ððp >\ÐgŸ}¦^½zi„ ²ÛíŠ��×í·ß®õë×›�6€6ÔÐР… *99Ù5F}à�Y5‚†;|RPP =z¨S§N®±~ýúéàÁƒªªª213f¸ÿþûÚâ¶‚‚EEE¹�EEEq÷ ÐA„……éå—_V×®]]c‡ÖUW]¥‚‚EFFÊßßßµ-**J{÷î5#U&èÔ©“’’’dµZ%I%%%úä“O4jÔ(�×Ô cùðÃe·Û5zôh×õ@“ÌÌLÝvÛmŠ��UzzºNž Wyy¹ÛXyy¹,‹ÂÃÃÍI @»tå•W¶X/¨@DzuëVMŸ>]Ï<óŒî¿ÿ~I�×çÞeR^^®Î�;ËÏ�ËU £±X,êÕ«—RRR´qãFY­Öf×'Nœàè rssõý÷ßkæÌ™Í¶µô7õÀu×]§úúzùùù™R#ø >q8:|ø°Ž?îËÏÏWDD„‚ƒƒMÌ @{ãp8š­“–ŸŸ¯˜˜“2ÐÖ¾ûî;ÍŸ?_K—.Õ¸qã\ã‡Cû÷ïW]]�kŒút,¹¹¹9r¤Û2RM¸õïß¿Ù5ÄÞ½{©@ñé§ŸêØ±c:t¨âââ4~üxIR\\œúôéC}:¸}ûöé•W^q+..–ÍfSBB‚)5‚†;|¥èèheffªªªJÅÅÅÊÊÊÒ”)SÌN @;3qâD}ûí·Ú¶m›jjj”��­C‡i̘1f§  ÔÕÕiÁ‚š;w®n½õV·m ÑÛo¿­Ó§OëÇTvv6×@âp8TUU¥Å‹ëôéÓ:~ü¸–-[¦ØØXM™2E¥¥¥Z¿~½jjj´}ûvmß¾]'N4;mm 55U_~ù¥rrr”““£•+WJ’rrr4zôhêÐÁuéÒEëÖ­ÓÊ•+U[[«ƒjéÒ¥š4i’ÆŽkJ�°8YP>:räˆÒÓÓµk×.…„„hòäÉš5kë®Ptt´$¹îRµZ­’ïT•¤Í›7+33S¥¥¥ŠˆˆPZZš dN²ÚÔîÝ»uï½÷Êf³5Û¶iÓ&�P^^ž233µÿ~Ùl6%&&*%%Ev»Ý”A𤠠á€h¸`; á€h¸`;pJMMUdd¤×Ÿûî»O6lPdd¤Š‹‹MÍwãÆ�Š��Õ¯¿þzÞ}gÏž­äädÕÕÕµAf€q,N§Óiv.Nee¥ª««]�.\¨‚‚egg»Æ¨ÊÊJ…‡‡ËßßߌTUTT¤I“&iñâÅ1bÄy÷¯ªªRbb¢n¿ýv=ýôÓm�!` «Ù ¸x¡¡¡ u=¶Ûíò÷÷W·nÝšíØ–©5“‘‘¡˜˜˜ j¶KRHHˆRRR4gÎM˜0A7Þxc+gƒ%e€ÿ°s—”IMMÕÝwß­íÛ·ëÎ;ïTtt´Æ�§ÂÂBåææjìØ±Š‰‰Ñ=÷Ü£¢¢"·X999JJJÒM7ݤÁƒ+%%Eþù§×çß¹s§òòòôØc�¹ÆœN§–/_®‘#Gªÿþ2dˆfÍš¥ß~û͵ϨQ£Ô³gO½ùæ›Îкh¸̉'´fÍeffjíÚµ:~ü¸æÍ›§·ÞzKZ³f�ÊÊÊôâ‹/ºŽÉÉÉѼyó4`ÀmذAo½õ–JJJ”œœ¬ÚÚZ�ÏõÕW_),,Lƒ r�eggkÅŠzê©§´iÓ&­\¹Rš1c†k‹Å¢¡C‡jûöí^ãí w ƒ9zô¨ÒÒÒÔ·o_ÅÄÄhøðáúùçŸõÄO(::Zýû÷×ðáÃUXXè:fùòå4h�ÒÒÒÔ«W/ÅÆÆê•W^QII‰¾üòK�ϵk×. 8Ðmýø‚‚]sÍ56l˜®½öZõïß_¯¿þº^}õU544¸ö‹��Õ©S§TPPÐ:Œ†;ÐÁé†np=îÔ©“$©oß¾nc•••’¿Ä´¤¤D·Ür‹[œ¾}ûªsçÎÚ·oŸÇç*++k¶®üСCuèÐ!%''ë“O>ÑáÇ.‡Ã!?¿³¢4WVVv‰¯h[4Ü€&((Èí±Åbi6Þ4&56Ü%éÍ7ßÔÀ�Ý~þþûoýõ×_Ÿ«²²ÒíË]%)!!A|ð�ÂÂÂôâ‹/ê¶ÛnÓĉµgÏ·ýÂÂÂ$I—ð*€¶g5;í[SÃ<99YIIIͶŸÛÀ?÷ئ;åÿ-66V±±±ª««Óž={ôÆoèá‡Ö¶mÛš5Ú›í w^«OŸ>:xð zöìé¶íÀ�ºþúë=Û­[·fwÀïØ±C×\s�"""dµZ§ÐÐP%&&ê·ß~S¿~ý$�]JæÜ%i€öŠ%eœ×Œ3ôõ×_kÙ²e*..Ö/¿ü¢E‹)11ÑëîƒÖ÷߯úúzר† 4sæL}óÍ7úã�?ôóÏ?+++K]ºtQïÞ½]ûååå)((ÈÕ€Ú;îpp^wß}·üüü´jÕ*­X±BV«UÑÑÑzç�wäp8<7lØ0­]»Vyyy2dˆ$é…^Ðk¯½¦´´4;vLaaaЉ‰ÑêÕ«(Ir:�Ú¶m›d³ÙÚä5¾²8�N§ÙIøïš:uªl6›Þ{ï½ >æ‹/¾Ð“O>©œœõéÓ§õ’ Ä’2ZÕ‚ ôÝwßiË–-´UU•–,Y¢iÓ¦ÑlÀe…;Ü´ºÏ>ûLÏ?ÿ¼>þøcýïÿóºïìÙ³õ÷ßëÝwß•ÕÊ*˜¸|ÐpÀ,)€h¸`; á€h¸`; á€h¸`; á€h¸`€ÿy!B%—²#IEND®B`‚accelerate-1.14.0/benchmarks/fsdp2/imgs/reserved_memory.png000066400000000000000000001604671521253476100237200ustar00rootroot00000000000000‰PNG  IHDRÜô'…ï,:tEXtSoftwareMatplotlib version3.10.1, https://matplotlib.org/soþå pHYsaa¨?§ià£IDATxœìÝyœ�åÿÇñ×9sf1ÆNö]dÏ–HvB’BäW)d�’P(I‰JödK%”lmBé+ŠP„ÈØ—aö³Ý¿?¦9æ˜9g¶Ã™ïçãáñ˜9÷}_÷u®¹çíÌç\çºM†aˆˆˆˆˆˆˆˆˆˆˆH¦˜ýÝ‘œ@wPÁ]DDDDDDDDDDÄTpñÜEDDDDDDDDDD|@wPÁ]DDDDDDDDDDÄTpñÜEDDDDDDDDDD|@wPÁ]DDDDDDDDDDÄTpñÜEDDDDDDDDDD|@w°ø»""""’qŸþ9£G�Nq[pp0%K–¤yóæôë×�‚ ÞäÞem‡â�àÁä�7Þð¸ßÉ“'iÕªƒfРA÷:t(_ý5%K–dÓ¦M>ïsv°cÇúôéÃO<Á¨Q£<îW¥JªW¯ÎçŸ~{wsüøã�|ñÅüöÛo\¼x‘€€Š-Ê]wÝEÏž=¹ãŽ;üÝE7-[¶$<<ÿüsªT©Â¢E‹’=›ÍFÆ iݺ5†a¤«ÿkÖ¬¡cÇŽÔ¨Qƒ&Mš0aÂWQ1­jÔ¨AñâÅY¾|yŠÛW®\IóæÍ L¶Í0 –-[ƃ>H­Zµ¨S§=ô+V¬pÛoÇŽ®1øüóϹÿþû©Y³&­[·ví»hÑ"î»ï>j×®Í<À?ü�ì|«V­âᇦN�:Ô¬Y“víÚ1}útâââ\ûœ�ØØX×Ï|Ò¤I)óÀP·n]×õÅ”)ShÓ¦ 5jÔ Aƒ<ùä“ìܹÓí¸3fP¥J¶oßΓO>IíÚµÙ¼ysªÏ#-Z¶lIË–-]ß'þînܸ‘ùóçÓ²eKjÖ¬I‡øþûï±ÛíLŸ>�æÍ›sç�wÒ½{wöîÝëÖfZGDDDD²:ÍpÉá<@Ù²e]�]ºt‰Gy„ØØX @õêÕ gΜ9<úè£,[¶ŒêÕ«ðòË/óÝwß1|øpªW¯ŽÍfcóæÍL�:•‹/ºŠ¯¿þú+}ûö¥|ùòŒ7Ž¢E‹òÇ0kÖ,~úé'V­ZEXX˜«qqqL™2…矞Ûn»�J•*ñꫯ²~ýzúöíëö¶nÝJDD�?þ8&“)]ý߸q#Ï?ÿ<µjÕâí·ß&wîÜüðÃŒ7.]ãh2™èر# .äìÙ³-ZÔµm×®]9r„矞?ü0Ù±ãÇ�çÓO?塇âùçŸÇf³±aÃÆŽˉ'1b„Ûþ7nÄl63jÔ(S¦LaìØ±üþûï\¾|™—_~™«W¯òꫯòÜsϱyófòæÍ ÀôéÓ™3g:t ÿþ„††²cÇæÎ�˾}ûX°`&“Éu®½{÷b2™˜>}:… &""‚µkײ|ùr^yå·~}ùå—tïÞ=]c—+V¬`ìØ±ôîÝ›áÇÈüÁûï¿ÏîÝ»]k½‡‡‡Ó«W/òäÉË/¾H©R¥øçŸxûí·éÓ§kÖ¬¡X±b®çöôÓOS¬X1&L˜Àm·ÝÆ÷ßÏ3Ï~õêU~þùgìv;íÚµKv®Ä76¶oßîöxÕªUÝŠí�<ò‘‘‘lذÁõد¿þJxxø ™Ý ×Ydd$Ó§OçìÙ³®Ç7nÌÿýßÿ‘;wnî¹çæÌ™ãö¦@… €„ð‰~ûí7 ,è*¶'JúæS¢ôüN¤$** ÀÕOo?é‘xL—.]0™Ln×½a¬_¿žŠ+R§NWèØ±c²öš4i±cÇ’-ßtý8ÝH×ßÛ ñú¼¾¥J•®]·ùɪ4Ã]DDD$xúé§iß¾½ëû³gÏ2pà@îºë.æÎ�›lÿS§NaµZ½Þü0""‚üùó3cÆ † ÆèÑ£7nÕªU£Q£FtîÜ™Š+púôi aÉ‘ÄeG®—¸O¢°°0×ìéDwÝu¥J•býúõ 0HX^%..އz(Ýý·Z­ØíödÅvÀU¼O¯nݺ1jÔ(þ÷¿ÿqï½÷²nÝ:bbbÜú—Ô©S§’-““Ô™3gܾOúæàZvÃÓã‰ÅÿÄBuñâÅ“�#qvpÒb6�âØtéÒ…·ß~›åË—»ž×š5k J±(ê #FŒàüùóÌ�;—9sæP¾|yîºë.î¿ÿ~·Y߆aðù石zõj>Ì•+WÜî%�¸Æ?À… \…ø¤*Uª”ì±ôüN¤$qIŸ+W®¸¾ö$±Ðœ¸_éÒ¥iРß~û-/¿ü2AAAüú믜:uŠçŸÞ­�‡#Å™&:}ú´Û›^·Ýv›×¾øRF¯ÛŒüŽˆˆˆˆdU*¸‹ˆˆˆäE‹u[Ê¢jÕªôìÙ“¥K—²fÍ:uêä¶¿Éd¢T©R¼ÿþûÛ fu¯^½š½{÷²mÛ6¶oß΂ ˜?>cÇŽ¥W¯^®5ÁÛµkGÿþýSlïú›‰&Ý®ïWâòþù'wÜqk×®%þü´jÕ*Ýý���÷¸ýú¾¦U»víxíµ×øì³Ï¸÷Þ{Y¹r%uëÖ¥|ùò)îŸ86o¾ù&•+WNqŸëg˜']c=-�_/iÑ9µ6RºÉkž}:sçÎ¥~ýú¼üòË”*UʵÞ{ÒåhÇ!éšèžÆ ñ±´þN¤¤Zµj|ýõ×üþûï”.]Úã~û÷ïp[þÁdôèÑlݺ•V­Z±víZ,‹ëS$‰} â³Ï>óØöõë´§ô{v£dôºÍÈˆˆHV¥‚»ˆˆˆH5tèP¾úê+&OžLÓ¦MÝfæ–,Y’sçÎQ¹rå—AII­Zµ¨U«ýû÷çܹs<ù䓼ñÆ<üðî¥#bccÓ´†µ7]ºtaæÌ™lذ�B… ñóÏ?Ó«W/‚‚‚ÒÝÿ `6›“-³pòäÉ õ/$$„Ž;²råJöîÝ˾}û˜4i’ÇýÇ&(((Óc“šÄs%ÎN*q†p‰%ÒÔÖ£�>ʪU«øòË/©^½:W®\áá‡Nõ¸2eÊ`6›9räˆÇ}oä›ÒLóÒ¥KÓ³gOzöì‰Õj套^bíÚµ<òÈ#4lØ�åË—S°`A.\èvMüõ×_ÉÚ*P /^Löø±cÇ’=–‘߉¤Ú·oÏ»ï¾ËÇL‡<™ãããY»v-ÅŠs[ ¿mÛ¶¼úê«lذ�{ï½—o¾ù†fÍš¹šK–,ÉÑ£G)Z´h²¥›²³›ù;""""r£i w‘*Ož<<ÿüó\ºt‰)S¦¸mkÞ¼9QQQnktC¬ï &¸Ö’>vìcÇŽåÏ?ÿtÛï¶Ûn£AƒX­V¢££)\¸05jÔ`Û¶mnkhœ;wŽ_|‘½{÷¦©ß‰Ëklܸ‘¯¾ú ‡ÃáºidzûŸXÀÛ·o.\pÛ÷›o¾ISRòðÃc³Ùxýõ× åþûï÷¸oâM,W®\™lÛ—_~ÉÛo¿í¶6~f4jÔˆ   ¾úê«dÛŸoZ×ô®U«Õ«WgíÚµ¬ZµŠ²eËr÷Ýw§z\Á‚iÞ¼9?ÿü3Û¶mK¶Ýn·óî»ïb6›]|«ÕÊäÉ“]7 MDëÖ­�„å\yòäq+¶[­V/^ìj?QõêÕ9wîÿý·[»Ÿ~úi²~¥õšò¤téÒ<öØcìÚµ‹wÞy'Å}/¿ü2§OŸfÔ¨QnÏ!wîÜ´mÛ–~ø�Í›7‘ìºoÑ¢@Š3ܧOŸÎ²e˼ö1«º™¿#""""7šf¸‹ˆˆˆä`]ºtá³Ï>ãóÏ?§sçή‚éÓO?Í7ß|Ø1c8wîuêÔáÒ¥K|üñÇüüóÏ4hÐHXªfË–-üôÓOôïßß5#ù�?þà‹/¾àÞ{ïu-1òÒK/Ñ·o_{ì1ž{î9J–,ÉñãÇ™3g—/_ö¸ÔLJ—×X¶l5jÔH¶®vZûðøã�ó /ðÌ3Ï0`ÀBBBøê«¯8~üx†ÇµzõêT«V�={öеkW¯7ʬ\¹2½zõbÙ²e 2„G}”€€~þùg>øàš4i’¦m¦EÁ‚yöÙg™>}:#FŒ S§NX,þ÷¿ÿ±|ùrÚµkGýúõÓÜÞ#�<ÂË/¿ÌÙ³g1bDš—´?~§çšòäùçŸ'22’9sæðË/¿ÐµkWÊ—/�ÃáàСC|öÙg=z”qãÆ¹Ýs!у>È_|Á´iÓ(R¤H²› ?üðìZµŠwß}—ØØXî½÷^¢££Y½z56là…^HÓÏ'«¹™¿#""""7š î""""9Ü+¯¼B×®]yå•WX³f ÁÁÁ(P€Ï>ûŒ÷ߟ¥K—2mÚ4råÊE�5˜;w®«ÐÊÊ•+™9s&óæÍãÂ… R¢D úôéÃ3Ï<ã:O½zõøôÓO™5k¯½ö‘‘‘(P€»ï¾›gŸ}–råÊ¥¹Ï‰ËküóÏ?¼òÊ+ɶ§µÿ�;w&66–… 2lØ0òåËGëÖ­™>}:÷Ýw_†Çµ[·nLœ8ÑãÍR“7n·ß~;+V¬`À€8Ê”)Àèׯ_†û�’þýûS¬X1–.]Ê�!C0 ƒ²eË2bį7¥LIÇŽ™2e V«•®]»¦ù¸¢E‹òÅ_°xñb6nÜÈG}„Íf£H‘"Ô¯_Ÿ &$»ñç»ï¾Ëܹsùúë¯Y°`‡ÃõIŠgŸ}ÖuƒÑñãÇÈgŸ}Æ’%K¨T©ƒ â¾ûîãÌ™3¬\¹’aÆñÕW_Ñ´iSÞ|óMæÎ�Ë /¼@Á‚iÛ¶-ï½÷uêÔq{!=×”'���Lž<™N�:ñÙgŸ1kÖ,.\¸€Åb¡xñâ4nܘ÷ߟ²e˦x|âMƒÿùçžzê©d믱dÉæÌ™Ã† X°`���T©R…©S§òÀ¤ùg”ÕÜÌß‘Édx»£’ˆˆˆˆˆÜ²¬V+-[¶¤AƒLŸ>ÝßÝñ™ÈÈHêׯÏÝwßíZŠFDDDDÄ´†»ˆˆˆˆˆ¤hÑ¢E\¸p�ÿû¿ÿówW2dÇŽ 6Œ;v¸=¾iÓ&€d³ìEDDDD2KKʈˆˆˆˆˆKdd$ÿý7ÿûßÿ˜5k={ö¤V­ZþîV†”(Q‚Ÿ~ú‰Ý»w3lØ0Ê”)Ã_ýÅ{ï½G¾|ùèÕ«—¿»(""""9Œ–”—_ý•Ç{Œ¼yóÒ£G† B@@€¿»•aýõ3gÎd÷îÝDDD�7o^îºë.† B… üÝ=ÉaTpñ­á.""""""""""â*¸‹ˆˆˆˆˆˆˆˆˆˆø€ î"""""""""""> ‚»ˆˆˆˆˆˆˆˆˆˆˆ¨à.""""""""""â*¸‹ˆˆˆˆˆˆˆˆˆˆø€ î"""""""""""> ‚»ˆˆˆˆˆˆˆˆˆˆˆ¨à.""""""""""â*¸‹ˆˆˆˆˆˆˆˆˆˆø€ î"""""""""""> ‚»ˆˆˆˆˆˆˆˆˆˆˆ¨à.""""""""""â*¸‹ˆˆˆˆˆˆˆˆˆˆø€ î"""""""""""> ‚»ˆˆˆˆˆˆˆˆˆˆˆXüÝO¶nÝʨQ£hذ!Ó§OwÛöí·ßòþûïóï¿ÿrÛm·ñä“OÒ½{w×ö%K–°lÙ2Ο?O•*U3f 5jÔ >>žI“&±eËâããiذ!&L @�„‡‡3aÂ~ÿýwBCCiß¾=#FŒÀlNÛ{çÏGúh²“ ‚‚,X­v Ãß½‘¬Dù "Þ(#DÄ僈x¢|o2›EŠäÉð¹³ä ÷ùóçóÚk¯Q¶lÙdÛöîÝËÈ‘#2d;wî䥗^bâĉüúë¯lÚ´‰3fðæ›o²mÛ6Z´hAÿþý‰‰‰`úôéìß¿ŸåË—óÍ7ß`£G�vµ?xð`Š-ÊÆ�Y¸p!7ndñâÅ7ç‰gs&“‰àà@L&“¿»""YŒòAD¼QFˆˆ'ÊñDù "Þø3#²dÁ=88˜•+W¦Xp�ˆˆà™gž¡uëÖX,š5kFåÊ•]÷åË—ÓµkWj×®MHHO=õ›7oÆn·³råJHñâÅÉŸ??Æ cË–-œ={–}ûöñçŸ2räHòäÉC¹råèÛ·/Ë—/¿©Ï?»2 ƒØX+†ÞZ‘ë(DÄe„ˆx¢|O”"â�?3"K.)Ó§O�Ûš6mJÓ¦M]ßÛívΟ?OÑ¢EØ¿?íÛ·wm7›ÍT­Z•}ûöQµjU"##©^½ºk{ÅŠ aÿþýœ;wŽ’%K’/_>×öêÕ«sìØ1¢¢¢ Kµï&ÉÞ91 \?\³9ù»*N§çm†a`)·›Ú±ii7#Ç&n3™L\ß%»Ýáƒv};†ÞÚMë±7êg“ÒÞ¨ŸÍ�C_ßÃ쓇Óm¿¬2†ÊˆÄvsæõ­1TF$ôW‘ùvsæõ­1Ìáp8ÿëŸ/ÚUFèúNOŸ4†Y=#óÁdòU»Ê]ßé铯ðVɈôÊ’÷ô˜:uªk­uH˜Ÿ´`�/_>._¾LDDyóæuÛž7o^×öë·%¶uùòå4܃‚,º=f³Ù‰�µa6› IvÌÕ«±äÊD@€û‡bc­Øl rÛf·;ˆ‰±¤Øndd,†!!�X,nÛââlX­v,–BCÝÛu8œDGÇÿ×n0à~¡EEÅát„„X ¼v ™L×úd6›É�;Øí8Ã0ˆŒŒ wîàd¿ŒÑÑñ8Î Œ¡ÁÕ« í¦4†11Vìv��BBÜÛMì¯É”ò&þlRC+V«‹%€\¹¼�aòv=�!@|¼�øx;‹™ÐP÷1t:�DE%´ëm ƒƒ-¹·kµÚ‰‹Ky “þlBCƒ¸þž11ñØíÎÇÐfskÅdJíú$ À} ¯ï”ÇÐAt´·ë;Ã0 $0ÐÓõ�þ1LüÙxÀï×··1¼U3"ñ?à¸8+qqöTÇP¡ŒeD"eDeÄ5ʈʈ9=#óÁ0 ââ®oe„2"‘2"Á­šAAW>Ƶë[¡ŒH¤ŒH ŒÈ|F¤—ÉÈŸ½yñʼn��OvÓTHˆ©S§òå—_²dÉ*T¨@�5˜1c-Z´pí;räHxä‘GèÑ£»wï&wîÜ®íM›6eèСœ?žo¿ý–Ï?ÿܵíøñãÜwß}lܸ‘Ò¥K§Úç "o¹w‹™Í&BCƒ]wVyÇMï('¶›3ß Õf�ŒḢèè8ެ5†ÊˆÄvsæõ­1TF$ôW‘ùvsæõ­1Ìú‘˜11 …œÌ·«ŒÐõ�ž>i ³rF\˧ÓðQ»Ê]ßé铯0'gD¡B©O¼ö$[Îpw:�Œ=š½{÷òÉ'Ÿ¸ (àšÉž(""‚Ûo¿�‚ º¾OZp¿rå … Âáp¤x¬Édr›š¤jJ'v» §ÓéqŸì*á 4ñññäÀ§'’ŒÙlÆbI~ŽÄ�NIjáíX´›¹>]ûÏìÚc¾h7{�afÚMi }Ó§Õ®Æ0óíf½1TFdÝvu}g¾]�á�m7s}2’e‚2"½ÇêúÎl»ÃÛnæúd¸êN§‘l߬ö\³b»º¾3ß®Æðƶ›¹>ݘŒH«,yÓÔÔ¼þúë>|8Y±f¸ïß¿ßõ½ÃáàÀ�Ô®]›Ò¥K“/_>·í‡ÂjµR£F jÔ¨ÁéÓ§¹té’kû¾}û¨T©’[�>£;W®\Än·eº­¬ÈéLø‘Šír«°Ûm\¹r‡ÃîﮈˆˆˆˆˆˆˆH�íf¸ïÚµ‹5kÖ°aÃòçÏŸl{�=xî¹çèØ±#UªTaÁ‚ѼysèÞ½;sæÌ¡fÍš„„„0mÚ4Ú´iCáÂ…)\¸05kÖäí·ßfôèÑœ={–… òÄOdºß kE�/_¡L¯$"YGHH(W®\ÔﶈˆˆˆˆˆˆˆdÍ5ÜkÖ¬ €Ýž0kÔbIx_`ß¾}¼ôÒK|ñÅ®Ç5hЀ?ü€�?þ˜yóæqñâEj֬ɸñã©\¹2V«•É“'³~ýzìv;-Z´`üøñäÉ“€3gÎ0nÜ8~ùåÂÂÂxôÑG4hPš içÏG¦ø¸ÍfÅn·‘+WægÊ‹HÖy…}ûöR¬X *T¨èïîdIf³‰��@ââl>ùx–ˆä,ÊñDù "ž(DÄ›ÌfD‘"y2|î,YpÏÎ<Üããîtœüμ"’½ÅÇDzyó÷DD\¥ví;©Zµš¿»$""""""""”™‚{¶\Ã]D$kIøL`` ü±×ëÍBDDDDDDDD$çRÁ]übøðg™?v†ŽmÙ²1;wn÷q�nœwß}›6mšòÑG‹üÝ•,套žçƒæ¤û¸�¿aذ�é>Î0 ÆŽEëÖMøî»¯Ót ž8qœ¸�ÿ=‘æó8¬Vkºû—Ó™Í&òæÍ…Ù¬uîE$9e„ˆx¢|O”"â�?3"ÛÝ4Un¾?ÿ<È’%²wïbcc)T¨0Í›·¤wï'\kß§æêÕ+üðÃfx  Ó§ÏÌp6mÚ–ácÓc÷î_2¤?AAAP¤ÈmtèЉ^½OSW¯^aÅŠOxã�i4iÒôFvHÞç¤{¬/O<ñ4Ÿ}ö1ëׯáÔ©S8�*T¨HïÞOдis,˜Ë¢Eˆa‡P¹r:vìÌ}÷Ýïj3é~ LÜv[QÚ·ïH¯^��b?W¯^Å©SáLœ89CϱN�zé>îðá¿Ø²å{/þ”Š+ѦM»T�)S¦,�=ö8ãÇ�aþüŘÍi{�R3ÜEDDDDDDDnM*¸‹W;wngôè‘ôíû/¾8–ZÌÖ­[hÖ¬eºÏ+""""""""·-)#9�NÞzk2]»vç±Çú’7o>L&åÊ•çõ×§Ë’% ذa-�<Ò…uëVÓ¥Ëý´nÝ„7ßœ„ÝngÓ¦�Œ?†ƒ÷Ó²ecÂÃO2hÐÓÌž=H˜%=jÔp,˜K»v-èܹ-?þ¸… ÖÒµkÚµkÁâÅ \ýjÒ¤>Û·oã̙ӴlÙØí_“&õùðÃy@Â�j§M›B×®hݺ ƒ?ñcGÝÚY¾|�;·eéÒE©Ž‡Ùl¦nÝú”+W�'Ž»?|øC‡ ]»ætìØšwÞ™ŠÝnçĉãôèÑ€¾}{°hÑ@Âìî^½ºÑªÕ=ôìùßÿ­«­AƒžfÖ¬÷xüñGyþù¡œ9sšQ£†Ó¡C+ÚµkÁ«¯¾LttTF~¤ìܹƒÆ�ï¥F�šX,‚ƒƒéر3&L¦`ÁB)S¸pÚ´iÇôé3Ù°a »wÿêqŒªU«A—.ñã�›RÜgëÖˆ��§yóVtíÚ�Ÿ~úѵ}àÀ§è×ïÚ'~ýõ:th…aœ?Ž‹ÏSµjuŽ=Â�!ýi×®9:´bêÔÉÄÇǧðœ·3|ø³Ü ¾þz½ëŒ��ã‘Gº°jÕg®ýçÌyŸ'žx ‡ÃApp0íÚu`õêUÞ†UDDDDDDDDD3ÜųC‡þäÔ©p~øÑdÛéÒå!Ö­û’þýpþüyØÏ§Ÿ~Á™3§:´?åÊU {÷;v„;~vÍ„¾Þ¾}{iÔèÖ®ý–iÓÞäí·'Ó´iK>ùäs6múŽ7Þx•N�¤@�‚®cŠ+î¶¼ÌÏ?ÿ�ñã_r-2{ö þ‹yó‘'O,˜Ë˜1ϳlÙJL¦„õ›¶ný�… ?vk×›ÍÆ/¿l'<ü$÷ÞÛ €¸¸8FŽL·n�2uê{œ?ŽÑ£GðñÇKèÓç >þx?܉E‹>¡lÙrüôÓ�Ìžýo¾ùÕ«×ä‡61qâ8Ê•«@ÅŠ•€„5Ê_{m U«VÇ0 ^|q5kÖfÕªÉÄÆÆ0~üÞÿ]·YæéQ¦LY6oÞH«VmÜ–fiÖ¬EªÇV¨P‰ ²iÓFêÖ­ïq?§Ó‰Ùœòr2»výÂ�wÖq-7S§N=þøc/Mš4%>>žðð °GHH¿ÿ¾‡ºu`2™Ø³g5jÔÂb±`µZyî¹A´k×�·Þz‡ .ü÷ÆÍêvÎ îfÚ´÷2¤¿köÿºu_ÂÈ‘£yå•—hÝú>¢¢¢Xµj9³f}àÖÇ/¾X�ÍfK²|ŽˆHÖvÙÅ9k�ðwWRg‚€3‡´*—ˆ$¥|Orx>T .Eß|- 0i®¬Hv£‚»Ÿý³ŸÅ›ˆ1nÎMCMAôÍß’¦¡ÕSÝ7<ü$!!!)r[ŠÛË”)ÇéÓ§\ëU[­ñôë7���Ê•+OëÖmÙ¶m+Ý»÷Hõ\ ünÿÞ¿à±Ç'88˜&MšápŒ'<<ÜcaüÂ…óLš4ž‘#GSºtœN'6¬câÄÉ.\€~ý²råg8°ŸêÕkТEk�³ºÝB!Úáp`2™xòÉþ”/_€mÛ~Â0 wïÿ D‰’ôèÑ›¥KÒ§ÏÉÚZ¿þKÚ´iGíÚuhÕê>>ýô#¶lùÞUp¯V­Õª%ôïàÁý;v„Ù³BHHO<ñ4Ï=7ˆ^xÉõÆAz<ñÄÓœ:ÎàÁÏP¨P!jÖ¼“† ѪU›4-T¦LYŽ?žâ6‡ÃÁŸäË/?§gÏÞ)îsìØQ·b}½z ذa-üAùò±X,8ðuëÖgïÞß\Ë÷ìÞý«ëØíÛ·ËON‰%Ýn[ªTiΞ=óß ûôÍéMSÓ*éó-V¬8 âðá¿øí·Ýôê•°~û'Ÿ,寿þ$þ”,YŠ3gÎpùò%V«-Õ¶Ó#"â26›�ÈÈH"#¯\$Y›×¿É$ig6› $.Άөq¹®8b8h=éúþ¤í¢ëë%Ÿ'ÔäýÿRFˆˆ'Êñ$§çC�É’á¿oEÄ¿¡‚»Ÿ5 ­žæÙæ7[¥J•)]º +V|ʰa#ݶÙívÖ®ý‚ûïïèz,::šˆˆòçÏ$Üì³H‘¢7´�{öìâÓO—1oÞ"W‘ ,,Œ|ùòqäÈa·‚ûéÓ§(^¼D¦Ïkññq”,YŠS§Â‰‰‰!44€+W" Lqy–’%Kqüø?n��8ñM›¦¼~zÉ’¥ˆ��áÔ©„ÙÜ11ÑØl6׬ëôˆ‰‰fÞ¼YtïÞÓÕ@hhnj֬ũSá^�ß¹sûöýÎС#½îçMÞ¼ù¸råŠÛcuëÖgÏžÝüùçjÔ¨…a89xð¿ÿ¾›úõï`Ïž_©YóN,–„ØJû¤ëª?þÅ‹—H÷ìvÃ0xóÍ×éÙ³7.œçí·§0yòT×öˆˆ„Y¢ùó§ü‰I‹%Hù�Éœ(g,½O½CŒ‘üÓ`��ßœ;KÿÁf6›È‚agN\„UD2Lù "ž(D$5þªCèÎ â‘ÉdbäÈѬYó³gÏ ""Ã08~ü† HXX=z\[§;((ˆ… çDZcGÙ¸ñ[î¹ç^ a¦öÅ‹¸zõ V«ofóGDD0qâ8† I¹rÉ×4ëÔ©+‹/àøñ°Ûí,_¾Œ~ýú—ásž={†E‹>à/_~6lDþü˜9ó¢££¸xñãÆ½È¬Y3R<¾mÛö|÷ÝWüñÇ>ìv;6¬åر£´ju_ŠûW¨P‰š5kñî»S‰ˆˆ 22’7ß|�W_}9Cý ÍÍßæÕWÇqøð_Øívl6;vüÌÆ�ßФI³�‹��gÓ¦�L˜0–=z{ýÔ@jÊ—¯ÀÑ£GÜ«[·ëÖ­¦té2äÊ•‹ÐÐÜ-ZŒ ÖQ¯^Â<{öìr»ÉëÝw7Æb±°pá|¬V+'NüÊŸ¸½ ”VëÖ}ÉÅ‹èÑ£7ýú dß¾ßÙ¼y£kû±cGNñ“""YÁ_ÖS)Û*•ÈÒÅv‘œD3ÜÅ«zõ0kÖ|.œOÏžG‘"EhÑ¢5}úü!!Ig•ç¡B…J<òȃDEEÒ¶m{ºty€¦M›óùç+èÚµÓ§ÏôIß~þù'Ο?ÇÔ©“™:õÚšÛµk×aúô™ôíûQQQ ø$6›�Ûo¯ÌÔ©ï¹õ9-’®‡ž7o>š4iÆ3Ï< €Åbaòä·y÷Ý©têԖܹÃhÒ¤)ƒ K±­Ö­ÛræÌi^{íe.]ºDÙ²e™6í}J—.ãñü¯¼2‰iÓ¦ððÃD½zw1fÌøt=‡¤¦L™Æ‡ÎcìØQ\¼˜pÿ€²eË3`À`:vìâÚ/éÚìf³™òå+2hÐ0Úµë�ásÔ«wo¿ýÆkÁ',ŸS·n}&NË#�ôtíW³fmV¯^éšá¾{÷¯têÔÕµ=44”7ß|‡÷߇hCÞ¼ùi×®½ë¶iuéÒEfÍz�‰_'00�ÀÀ@ Ì;ï¼E½zw‘7o^öìÙE­ZwºfÒ‹ˆd5Î$K^Ý\Þus­S ÍCkø«[""""""·“¡E‰}êüùÈ��O˜U�tÙ“œdƵ̙ó>kÖ|ãï®HgµZéÞ½3C†Œ eËÖþîNª¬V+ݺ=Àˆ£hÖ¬eŠûÄÇDZyóF¢£c±Ù¬téòPºßØÉéÌfaa!DEÅåÈõEüí—ØÃ¼tþ#ÏׂÞùšû·C餌O”"â‰òAD¼ÉlF)’'ãçÎð‘""Dß¾O±t釨ívw'U«W¯¢pá"Ü{osw%[3 ƒ¸8›n<+rƒ8qº¾6‘ý–�QFˆˆ'ÊñDù "Þø3#Tp‘›®K—‡(V¬‹}àï®xõï¿'Xºt!&¼žî±Š;ëՎ^ ‹ÜI—”1gË‚»2BDR¦|O”"â�?3Bk¸‹O´oÿíÛ?àïnH62yòTw!U¥K—aíÚoýÝ�Ãb Ànwø»"9’A’‚{6½Aª2BDˆˆ'ÊñÆ_¡)›""rÙÍ&BCƒ0›³g!P$«s&)¸gÇ%e”"â‰òADˆˆ7þÌÜEDDD²¹¤÷츤ŒˆˆˆˆˆHN¡‚»ˆˆˆH6羆»^Þ‰ˆˆˆˆˆø‹þ"ÉærÂî""""""9� î""rS8NwA$Çrrí÷+;®áÊñLù "ž(DÄe„Å/g‘[ŠÓiïïnˆäXîKÊd¿‚»2BDˆˆ'ÊñÆŸ¡îâÇ?Ëüù³3tlË–�Ù¹s»�{tã¼ûîÛ´iÓ”�>Zäï®d)/½ô<|0'ÝÇmÜø Æ LqÛÇ/¡]»æL�ú‹}À AO{mËjµÒ»ww¾ûîët÷CD$+1tÓT‘,A3Ü%Uþy�%K>dïÞ=ÄÆÆR¨Paš7oIïÞO�'Ož4µqõê~øa3<ЀéÓgf¸?›6mËð±é±{÷¯ ÒŸ   (Rä6:tèD¯^�§©�«W¯°bÅ'¼ñÆ4š4iz#» $ïsR�=Ö—'žH(@öÙǬ_¿†S§Nát:¨P¡"½{?AÓ¦ÍX°`.‹}@`` †aBåÊUèØ±3÷Ýw¿«Í¤û%0qÛmEiß¾#½z=N@@@Šý\½z§N…3qâä =Ç:uꥸmñâôë7€nÝ oß§¼¶Ę16lµjÝIÑ¢ÅÒÝI³ÙDXX0QQñ8�FêˆHº¸-)“ ×pWFˆˆ'ÊñDù "Þø3#Tp¯vîÜÎèÑ#éÛ÷)^|q,yòäåøñ˜9ó x’yóš;ÕvvíÚÉÚµ«]÷ì䫯6ŒÓéä·ßvó Ã(Q¢$-Z´Nõؘ˜J—.s£»é&±Ï)ùä“�X±â&N|ƒ;Ãáà»ï¾æå—_ä½÷æP«Ö�T­Z�yópáÂyöìÙÅûïOgϞ݌5ÆÕ^ÒýœN'þy€1c^Àd2Ó»wßdç·Z­,ZôƒÇbIíÞ½‹1c^Iq[tt4¥J¥o¬ï¸£*µk×á“O–2lØóéî�¤Gö+ŠdN·îÙõŒÊñDù "ž(DÄÿdDvý‹Ln§ÓÉ[oM¦k×î<öX_òæÍ‡Éd¢\¹ò¼þúTââbY²d!6¬å‘Gº°nÝjºt¹ŸÖ­›ð曓°ÛílÚ´‘ñãÇpðà~Z¶lLxøI zšÙ³g ³¤G�΂si×®�;·åÇ·°aÃZºví@»v-X¼x�«_MšÔgûömœ9sš–-»ýkÒ¤>~8€øø8¦M›B×®hݺ ƒ?ñcGÝÚY¾|�;·eéÒE©Ž‡Ùl¦nÝú”+W�'Ž»?|øC‡ ]»ætìØšwÞ™ŠÝnçĉãôèÑ€¾}{°hÑ@Âìî^½ºÑªÕ=ôìùßÿ­«­AƒžfÖ¬÷xüñGyþù¡œ9sšQ£†Ó¡C+ÚµkÁ«¯¾LttTF~¤ìܹƒÆ�ï¥F�šX,‚ƒƒéر3&L¦`ÁB)S¸pÚ´iÇôé3Ù°a »wÿêqŒªU«A—.ñã�›RÜgëÖˆ��§yóVtíÚ�Ÿ~úѵ}àÀ§è×ïÚ'~ýõ:th…aœ?Ž‹ÏSµju·6­V+-[6àÅŸcÊ”×X°`.O?Ý€ñãÇ0vì(×þ;vüÌ}÷5ãÌ™3tîüëׯÁf³y:‘,ËÈæk¸‹ˆˆˆˆˆä*¸‹G‡ýÉ©Sá<üð£É¶Ò¥ËClÙò½ë±óçÏsàÀ~>ýô >ø`)ÿûß�|þù Z¶lMŸ>OPµju6mÚFÉ’¥’µ·oß^ *ÄÚµßÒ¸qSÞ~{2à“O>gèÐ|øá<._¾ävL±bÅÙ´i›ëߤIo‘;wnÚ´iÀìÙ38|ø/æÍ[Äúõ©ZµcÆ<ïV”غõ.ü˜ÇK}‰›ÍÆÿþ·•ðð“Ü{o3âââ9r0õëßÅÚµß1oÞböìù•�?^B™2eùøãU,Zô }û>ÅO?ýÈìÙïñ cøæ›xòÉg˜8qGŽüí:ÏÆ�ß0jÔXÞ|ó ÃàÅGpÛmÅXµj=Ÿ|²Š Îóþûï¦Ú_OÊ”)ËÖ­[سg—ÛãÍšµ T©Ò^�­P¡ 4dÓ¦�^÷s:�˜Í)/'³k×/Üyg×r3uêÔã�?öOxø¿\¼x�¸¸8~ÿ}uë6Àd2±gÏ.jÔ¨•lf|PP�k©¡7ޘƨQcݶ:‚Ý»e÷î_±Ûí¼÷ÞÛ<ó̳+–°„LíÚwbµZ9p`¿×ç%"’U9’Ìp7©à."""""â7ZRÆÏŒ�[q®þâbnÎ CB1?ØSý&©î~’��й-ÅíeÊ”ãôéS®¶ÕO¿~ ¡\¹ò´nÝ–mÛ¶Ò½{�TÏ•PÀï@£F÷°ví<öØãÓ¤I3Žñ„‡‡S @Á�¿pá<“&�gäÈÑ”.]§ÓɆ ë˜8q2…  _¿�¬\ùì§zõ´hÑÚã¬îD÷ß߇Ã�ÉdâÉ'ûS¾|E¶mû À޽ÿ€%JÒ£Go–.]HŸ>O$kkýú/iÓ¦µk× U«ûøôÓ�زå{*V¬@µj5¨V-¡îçØ±#Ìž½€��BBBx≧yî¹A¼ðÂKZ§÷‰'žæÔ©p~†B… Q³æ�4l؈V­Ú¤iy 2eÊrüøñ·9þüó _~ù9={öNqŸcÇŽR·n}×÷õê5`Ƶ8ðåËWÄb±pàÀÔ­[Ÿ½{s-ß³{÷¯nǦU�4hï¼óíÚu oÞ|tíú°k{îÜaÜv[QŽû›ÚµïLwû""þ–ô¦©&ͧñÜýÌùõ*8ýïM<ãEœ_­$ wH˜©lFŠ…Ý¤3ÅòäÉK�\ß-Zœ;¶§é<·Ýv­¨ŸxÃÏÄBâ÷Vk¼Ç>N˜0–{ïmæšÝ~ùò%bb¢=z„[ßçÎ�qÜ‹+žjß’®áþï¿'˜2å5NŸç…Æ~’Ë—/¹–3�„q L~ÓR€S§NQ·n·ÇJ–,ÍéÓ§\ß'íSxøI:´r;Æápá6ÞI%¾I�ÔèÑ/Ó¦M;òæÍË›oNçÔ©pvîÜÁï¿ïaæÌw™;w&ï¼3‹J•n÷:‡ƒ€€kŜĥ‚ áF}Å‹—à‘Gz¹n\z½«W¯�7o^×÷uëÖgÚ´)Øív~ÿ}5kÖÆl6³wïoÔªu'û÷ïã…֌߽ûW:vì쵞´oÿß|³�ùóg³páÇÉ®é|ùò‘¡¶%uN§ATTœnf$rƒÙ|†»2BDˆˆ'ÊñÆŸ¡‚»Ÿ™ïï†ó‹¥7w†ûýÝÒ´k™2e±Z­œ:žâ20'N§t鲮¥Óé¸nƒ´NÀ6¥0ÏlNÛ ½E‹>àÊ•¦N½¶ÌJpp³gÈwTõxlâ²&ia6›)[¶ýú `È�þ 2‚àà`Ê—¯À’%ËÓÔ†ÍfMññ¤Åߤ} &W®P¾ûîÇ”óÈÛMS•(Q’Î�»Ò¹sWbb¢4è/^À«¯¾áõ¸C‡þ¢zõš®ï“Þ45­’>ßbÅŠS°`!þ‹ß~ÛM¯^ Ëû|òÉRþúëOòç/@É’¥8sæ —/_âŽ;ª¥ë\‰¬V+.œÇb äôépÊ•+]Ÿ’¿‰$¾¥Â"7ŽÓÈÞwPFˆˆgÊñDù "Þø+#Tp÷3Sý&ižm~³UªT™Ò¥Ë°bŧ 6Òm›ÝngíÚ/¸ÿþŽ®Ç¢££‰ˆˆ þü@ÂÍ>‹)zCû¸gÏ.>ýtóæ-rÙÂÂÂÈ—/GŽv+¸Ÿ>}ŠâÅKdú¼†aGÉ’¥8u*œ˜˜BCC¸r%‚ÀÀÀ—g)Y²Ç�ÿãö؉ÿдiòé‰ûÇÆÆpêT8%J” &&›ÍF¾|ùÓÝhæÍ›E÷î=]턆æ¦fÍZœ:îõø�;w°oßï :Òë~ÞäÍ›�+W®¸=V·n}öìÙÍŸ F�Z†“ƒðûﻩ_ÿ.öìù•š5ïL¶~{Z-Yò!·ÝV”§žêÏ[oMæ£�>sû%\»)b@2Ïd2b!.ή76Dn'N××XnÌß”"â‰òADˆˆ7þÌ-ò)™L&FŽÍš5_0{ö """0 ƒãÇÿaذ�„……ѣǵuºƒ‚‚X¸pññq;v”�¿åž{îfj_¼x�«W¯`µ¦<Ë;½"""˜8qÆ�L6[ S§®,^¼€ãÇÿÁn·³|ù2úõëãºgFœ={†E‹>à/_~6lDþü˜9ó¢££¸xñãÆ½È¬Y3R<¾mÛö|÷ÝWüñÇ>ìv;6¬åر£´ju_ŠûW¨P‰š5kñî»S‰ˆˆ 22’7ß|�W_}9Cý ÍÍßæÕWÇqøð_Øívl6;vüÌÆ�ßФI³�‹��gÓ¦�L˜0–=z{ýÔ@jÊ—¯ÀÑ£GÜ«[·ëÖ­¦té2äÊ•‹ÐÐÜ-ZŒ ÖQ¯^Â<{öì¢N�z:ç±cGY¾üc†�-ZS¶l9æÌyßµ=&&šsçÎR¡B¥ ?/ñÎd‚À@Kš?õ""éãÌæKÊ(#DÄ僈x¢|oü™šá.^Õ«×€Y³æ³pá|zö|ˆ¸¸8Š)B‹­éÓçÿ I:«<*Tâ‘G$**’¶mÛÓ¥ËC4mÚœÏ?_A×®˜>}¦OúöóÏ?qþü9¦N�ÌÔ©“]�×®]‡éÓgÒ·ïSDEE1pà“Ølvn¿½2S§¾çÖç´HºzÞ¼ùhÒ¤Ï<ó,‹…ɓ߿Ýw§Ò©S[rç£I“¦ 4,ŶZ·nË™3§yíµ—¹téeË–eÚ´÷)]ºŒÇó¿òÊ$¦M›ÂÃ?@PPõêÝŘ1ãÓõ’š2e~8�±cGqñâÊ–-Ï€ƒéر‹k¿¤k³›ÍfÊ—¯È AÃh×®C†Ï P¯Þ]¼ýöÿ­Ÿ°|Nݺõ™8q,�<ÒÓµ_ÍšµY½z¥k†ûîݿҩS×tŸÏ0 Þ|sݺ=B™2e>üyúöíEëÖm©UëN~ÿ}AAAT«V=SÏMDÄ_’®ánΆw‘œÂdès7>uþ|dŠ�ÇÇ'̪NºìIN²aÃZæÌyŸ5k¾ñwW$‹³Z­tïÞ™!CFвekw€Ñ£GP´h1† {>CÇÇÇDZyóF¢£c±Ù¬téòPºßØÉéÌfaa!º©‘È òñ•ùðÊ÷¼Z¸'�B«ø¹G飌O”"â‰òAD¼ÉlF)’'ãçÎð‘""Dß¾O±t釨ívw‡C‡þdÏžÝnË#‰ˆd7nKÊèsÕ""""""~£‚»ˆÜt]ºˆˆ'ÊñÆ_¡‚»øÅðáÏ2þì Û²ecvîÜîãeÌÑ£Ó£GWZ·nâﮈdiN§AddN§^‹ÜÇmç]_ß�Ï�=Ée„ˆx¢|O”"â�?3ÂrÓÏ(ÙΟdÉ’Ù»w±±±*T˜æÍ[Ò»÷äÉ“'Mm\½z…~ØÌt`úô™îϦMÛ2|lF|ùåç¼õÖë 8„ž=û¸m[³f5aayXºô3~øa+ÞN©R¥}rîI“ÆóÍ7°X’ÿª.]ú%K–âÂ…óÌ›7‹�;wpåJÁÁ!Üu×Ý 0„bÅŠЭÛœ?Ž€€ (HݺõéÙ³åËWpµyý~���T¬x;ýú  N�z>yN""â{ÇmçÈoÎMaK^?÷FDDDDDäÖ¥îâÕÎ�Û4¨ÕªUçã�W±qãO¼ùæ;;v”ž$&&:MíìÚµ“µkWߨÎÞ ëÖ­¦U«ûذam²m11Ñ”(QÂUÿàƒ9œ<ù¯OÏߢE+6mÚ–ì_É’¥0 ƒ#c·Û™?1ßÿ?/þ»ÝÆÈ‘ƒq:�®v†žM›¶ñí·?òöÛ3È—/?O=Õ›]»vº�/q¿M›¶ñå—ßpï½Íyþù¡„‡Ÿôéó’[‹Ùl"OžÌæì¹Ô…HVëŒç’3 €’�…üÜ›ŒQFˆˆ'ÊñDù "Þø3#Tp�œN'o½5™®]»óØc}É›7&“‰råÊóúëS‰‹‹eÉ’…lذ–Géºu«éÒå~Z·n›oNÂn·³iÓFÆ�ÃÁƒûiÙ²1áá'4èifÏžÀ‚s5j8 Ì¥]»tîÜ–܆ kéÚµíÚµ`ñâ®~5iRŸíÛ·qæÌiZ¶lìö¯I“ú|øá<âãã˜6m ]»v uë& ü ÇŽukgùòetîÜ–¥K¥8GŽüÍÑ£G6l$çÎ�ã�?öº¶½úêË|ýõz6oþž–-óøã=8vì(/¾ø¯¿>€Ã‡1tèÚµkNÇŽ­yç�©ØívטõîÝ�3¦Óºu.\8Ÿb¼¹té"GŽüM·n�P¸pL&·ÝV”çŸÃã�?‰ÍfKvŒÅb¡\¹ò 4ŒnÝå�7^Ãáp¤Ð:„„„УÇc.\„;~NwÿD’Ò�EnŒÓöË®¯KX ø±'™£ŒO”"â‰òAD¼ñWF¨à.:ô'§N…óðÃ�&ÛH—.±eË÷®ÇΟ?Ï�ûùôÓ/øàƒ¥üï?òùç+hÙ²5}úgèÐ|øá<._¾ävL±bÅÝf|Ošô¹sç¦M›vÌž=ƒÃ‡ÿbÞ¼E¬_¿‘ªU«1fÌón7Lغõ.ü˜Ç{<Å1X»v5Mš4¥@�‚4oÞ’uë¾tm7n"mÛ¶wÍ@_¼øÞxc/½ô qqqŒ9˜úõïbíÚï˜7o1{öüÊÇ/qµqႃƒùúë-.\$-?7ùòå'_¾|,[¶˜ .¸ÏŸ??mÚ´#88Øëñ�<Ò“Ó§Ãù믃^÷s8œ˜ÍŠ ‘¬(Ü~íÿÇ’–‚~쉈ˆˆˆˆˆh w?Ûz2Ž�Fc»9 ø‡šè]-Œ&%CRÝ7<ü$!!!)r[ŠÛË”)ÇéÓ§\l«5ž~ýB¹råiݺ-Û¶m¥{÷©ž+¡€ß €F�îaíÚ/xì±Ç ¦I“f8ã §@�” .œgÒ¤ñŒ9šÒ¥Ëàt:Ù°a'Nv²ûõÈÊ•ŸqàÀ~ªW¯@‹­)X0å�ß[­V¾ýö+ÆŽM˜­Þ®]^|qC‡Ž$W®\©>§mÛ~Â0 wïÿ D‰’ôèÑ›¥KÒ§ÏDGGÑ«WŸ×hO ‹ÅÂĉoðúëèÚµ=åËW¤N�ºÜ{osêÕk�êñ ",,§OŸ¢ZµɶÇÄİzõ*"".Ó¨Ñ=꣈ˆÜX§’Ü‹«à."""""âW*¸ûÙªÃÑü™òr7ÂÅ8Xy(:MwHXVÆ0Œ?‚‘t¦8@ž}ºÛ¶ 60{ölNžxð “&MâàÁƒ*TˆG}”'žxâ†=Ïn•s³ôÀÍ�áÞ­rî4í[¦LY¬V+§N…§¸ ̉Ç)]º¬« ít^ÿÆ�AZ—J2™’…Óº„É¢EpåJS§¾ëz,88áç9{ö‡ÜqGU�Çxܶví—DF^åþû[¸³Z­¬_¿&M÷àà`Ê—¯À’%˽œ?õ_Á-Z1aÂd¯ûP»ö�Ô®}'ÿ÷ýØ»÷7|Š;¶Ñ¨Q�Ç�<ù/±±1”-[ÎõØðáÏ»>m â+N§Atteذ‘nÛìv;k×~Áý÷wt=MDDùóçàÌ™Ó)Rô†öqÏž]|úé2æÍ[ä*²„……‘/_>Ž9ìVp?}úÅ‹—HµÝS§ÂÙ½{'S¦L§L™k×áéÓ§>üYNœ8îöxJJ–,Å©SáÄÄÄ À•+š¶7=Róûï{øå—íôë7Àíñš5k“;wnbcã¼ÿá‡ó¨X±*TòID¼q8œþî‚HŽ”8Ã=ÌB^sêKžeUÊñDù "ž(DÄeD–¼ bpp°Ç‚ûŠ+h͚֬5#88˜N�:Q¹reÖ¬YÀòåËéÛ·/+V$,,ŒáÇsäÈ~ÿýw.\¸ÀÆ�>|8 ¤hÑ¢ 8�U«Va³Ùزe 6›�JõêÕyøá‡Y¾Üó åœÌd21rähÖ¬ù‚Ù³g�a?þÆ $,,Œ=z»ö báÂyÄÇÇqìØQ6nü–{î¹Hø™^¼x�«W¯`µZ}Ò¿ˆˆ&Nǰa#)W®|²í�:ueñâ?þv»�å˗ѯ_â⼡֯_C… •hܸ ¥J•výkР!wÜQ�õëפx\PP0'Ož ::І ‘?fÎ|‡èè(.^¼À¸q/2kÖŒL?÷DyòäåÓO?bþüÙ\ºt€Ë—/3oÞ,L&uêÔMñ¸ Î3cÆ4¶nݨQc}ÖOL&¶¤ùS/"’6VÃÎyÇJLq ¸ì@!"ž(DÄ僈xãόȒ3ÜûôéãqÛþýûiÖ¬™ÛcÕªUcß¾}ÄÅÅñ÷ßS­Z5×¶°°0Ê–-˾}ûˆŒŒ$ €*Uª¸¶W¯^�˜˜Ž=Êþýû©R¥ŠÛ2#ÕªUcÅŠ>|vÙK½z ˜5k> Χgχˆ‹‹£H‘"´hÑš>}þϵ@XX*T¨Ä#�àé§&ÛÖ¥KWfÍz�_ý…7Þ˜ÆäÉoóî»SéÔ©-¹s‡Ñ¤IS –©ç�T… y÷Ý9,Yò!}ûö$**’\¹rQ«VfÎüÀí&³‰k³†Ahh(õêÝży‹)_¾‚Ïú#â‰Éd"88›Í‘ìþ"’qgí8Iø�*‘M—“e„ˆx¦|O”"â�?3ÂddáTzñʼn��w[ýmÛ¶ôéÓ‡^½®C§OŸÎ®]»xûí·iÚ´)ëÖ­ãöÛowmïÑ£�5¢|ùòLš4‰íÛ¯ÝÈÓn·S½zu/^Ìúõë¹rå ï½÷žkû¶mÛø¿ÿû?<˜¦5Å/\ˆL6»Ì0 ..ÀmÙ“œdƵ̙ó>kÖ|ãﮈÜtññqlÞ¼‘èèXl6+]»vKöÆNâša&)fDb›ÍÉßzM<6¥m†a`)·›Ú±ii7#Ç^{®&×;Éf³‰ÐÐ`¢£ãp82Ö§5†ÞÚMë±7êg“t ¯o7#}òÞî�C_ß9} ·ÇüÅKç–Ð+_Sž,Ðúºc• ýUFd¾]eDæÛÍ™cx£3"1bbâq8œ>hW¡ë;=}Òf匸–N§á£v•º¾ÓÓ'�aNΈB…Â’í“VYr†{jR{�ÀÛöŒ¼¿�ž�gYt{Ìf³“†ULD$ ¼öɘÐÐ BCÝ î11ñØíN�kÃl6–üM¹«WÞ°Ë•+ˆ€÷7þbc­Øl rÛf·;ˆ‰IXÂ)¥v##c1  Äbq¿�p\œ «ÕŽÅ@h¨{»‡“èèøÿÚ Ü32**§Ó $ÄB``Â3&˜ ²k# ÀLîÜÁndžAddBXæÎœ,{££þÐNÿ\½šÐnJccÅnwh!$ĽÝÄ14™RÃÄŸMÊchÅju`±�+—·1LÞnJc˜(>ÞF|¼‹ÅLh¨û:�N¢¢Úõ6†ÁÁ‚‚ÜÛµZíÄÅ¥<†I6¡¡AÉÞ€N¼¾SC›ÍAl¬“)µë;0Ù�¬¯ï”ÇÐAt´·ë;Ã0 tûý„¤×wúÇ0ñgãm S»¾½�az¯ï q‘®¯Ë‡Þ–l»2"�2"�2âš[%# û¿ŽḢܹƒ‰‹K¸¾•ʈDʈ·jFY\ãe×®oe„2"‘2"�2"ó‘^Ù®à^ @"""Ü‹ˆˆ `Á‚äÏŸ³ÙœâöB… Q°`A¢¢¢p8®_´Ä}·ÿóÏ?ÉŽMl7-¬V;6›Ãí±¬ûñ•¤¿÷11VœN÷ÌH|§Ô[F8�QQžß�‹�M~ÿƒÄ7m6v»çcSj7ñ¼qq6À–b»v»ÃkŸ_,$•ø\ãâìÄÇÛ�k³Ó¬Ö„ï§×vÿM©]_�ab»6›»Ý‘l{bûÞÚÍÜ&ß–Ò&o7ãcowý,®µ{moí&¾hJ©Ý”Æ0±]ÃHígãÛ1L<6¡8ã©Ý3†©]ßÞÆ0½×÷Ñè³®¯‹ù’mWF¸?eÄ5ʈ[##’Ê®¯#®Ÿáʈ¤” ”·fFØlŽd³WA‘”2"�2B‘‘Œ¾…f¸×¨Qƒ?þøÃí±}ûöÑ¡C‚ƒƒ¹ýöÛÙ¿?wÝuW¯^åĉÔªU‹’%Kbþù'Õ«Ww›7o^Ê—/O�5øä“O°ÛíX,×öÚµk§¹I?Šq+ißþÚ·ÀßÝÉœNÃò×K-#<—Ú¶Õnæúd$y”ðÉ™äáYí¹fÅv“Ž¡oût£ÚÕf¾Ýô=×pÛE××Å ÜôìÉ̱ʈ̷›Ó¯ï›Ñ®Æðƶ›¹>ÿõ+!÷1ÍjÏ5+¶«ë;óíj ol»™ë“�Ñ4Ü÷ÍjÏ5+¶«ë;óíj ol»™ëÓ�Ɉ´JÛ´í,¤{÷îlÛ¶�-[¶ÏÊ•+ùçŸèÔ©�°^û’%K8räQQQL�:•ªU«R³fM ,HÛ¶myç�w¸tégΜaæÌ™tëÖ ‹ÅB³fÍ cöìÙÄÆÆòû￳råJzôèáçg-"’½†Al¬í–|CRäF:a»@.SÌŸ�áoÊñDù "ž(DÄfD–œá^³fM ᆦ7nf›W®\™©S§2yòdÂÃéT©sçÎ¥H‘"<ú補?žÞ½{MÆ yÿý÷]mOœ8‘W^y…V­ZHÇŽ>|8AAAÌ™3‡W^y…yóæQ¸pa†NóæÍoâ³É™Ìf“OÞ)‘QÎXÎ:"¨T,Óë ú›2BDˆˆ'ÊñÆ_a2ôV O�?™âãññ k'¿Q€ˆdoññqlÞ¼‘èèXl6+]ºo¿=Åß]É´ðð“lÞ¼Ñßݹ¥8�W¯êfF"¾ä0®¯-¦ìý’N!"ž(DÄ僈xãÏŒÈÞ�ÉM³víjZµº��¿!>>ÞßÝÉ”~ØÌ–-ßû»"""™b7®ÍpÐK:‘,A�Iª®\‰àÿû‘§žêO¾|ùùñÇÍ®mqqqL™2‰öí[ѱck¦L™„ÕjMu[||Ó¦M¡k×´nÝ„ÁƒŸáر£)žÿêÕ+Lœ8ŽÎ�ÛÒ¦MS^|ñ9ΟO¸Q\âò3_|±’ûïoÉwß} ÀòåËèÞ½3mÚÜK¯^Ýøá‡M|üñRæÌ™ÁæÍßÓ²ecGºú""c6›È�;³ÙäﮈäI—” 0eï%e”"â‰òADˆˆ7þÌÜ%U_½žJ•*SºtëÖ­qm›;w&ÿüs”eËV²té þúë ÎOuÛìÙ38|ø/æÍ[Äúõ©ZµcÆ<�a$ÿ˜Ç¤I㉋‹céÒ¬^½�\¹Byýõ nûìÙ³‹•+×кu[~ûm7sçÎä�7ÞæÛo¤W¯Ç™0a—/_¦gÏÞ´mÛž-Z±iÓ6ÒÕɸ€ý—#âKnKÊ䀗tÊñDù "ž(DÄe„Å/gsä:.¾�ÉuSÎg˜Ãp‰3O‡4³nÝ—téÒ €¶mÛ³hÑœ>}ŠbÅŠóÕWë=úe (ÀK/½BdäU Ãð¸Íét²aÃ:&NœLáÂEè×o +W~Æ�û)X° ëÜ—/_âÿÛʲe+É›7/ýû⡇:rñâ×~íÚu wî0jÕº“/¿ü†Àå9i.¸ÿñÇ>þý÷­ZÝ@É’¥¨^½&6¬å¡‡!**’%J¸ö¯Tév"""þx .œçÊ•¦O“£G�xÝÖ©SW/^Àñãÿ`·ÛY¾|ýúõ!..έaaa´ju³g¿Ç¹sg‰��cΜ÷6ìY�75-V¬8ÿ}ˆ¸¸8Ž;ʲe‹ ãÂ…s@¬ù³gωÝnOs_D$sìvGê;‰HšÙIø� È!/ç”"â‰òADˆˆ7þÊÍp�Ö­[C›6÷˜l[‡�3æyV­ZGll,½zu#00ˆ{ïmÎOô ÿÁLŸþfŠÛúö}Ѝ¨(|›ÍÎí·WfêÔ÷ Iv®áßgÚ´7éÝ»;&“™5jòÆo{üø|Ÿ>OðòË£éС*TdôèW(R¤(Ó§¿EþühÓ¦›7o¤[·Ž,^¼<]}‘Œ1™ 0ЂÍfÇÃ{e"’N×f¸gÿõÛ•"â‰òADˆˆ7þÌ“áiš°dÈùó‘)>Ÿ0[:qÍpÉ9âããØ¼y#ÑѱØlVºtyHoØ\Çl6BTTœ>ò)â#�…¿ÃÇeò›s³²Ô þîN¦(#DÄ僈x¢|o2›EŠäÉø¹3|¤ˆˆˆˆø�#qI™°†»ˆˆˆˆˆHN¡¿ÐDDDD²!×’2dÿ%eDDDDDDr ÜEDDD²!;‰k¸ë圈ˆˆˆˆHV¡¿ÐDDä¦ð×ÝÁEr*»ñß’29äåœ2BDˆˆ'ÊñÆ_añËYEDrÝ '5N§ALŒÕßÝÉQÿÍp0eÿ%e”"â‰òADˆˆ7þ̈œ1%*0›Í8�zçU$'Š��×ÌŠ40™üÝ‘œåÚî9ãåœ2BDˆˆ'ÊñÆ_‘3þBË,–@âãc1 Í„ÉI ÃàâÅsÄÇkf…7f³‰ˆˆ7þÌ-)s“˜L&òäÉÏ•+±X‚ ôŸ‚HöeÏÅ‹çØ»w¿Û“¦YˆÈ æüo9€Ý4UDDDDD$ËPÁý& °�/_!þ‹C‡þÂbÉþ3Ò®€Í¦¥5äÖ`·;’Íl ((ÈO=‘[…#IÁ=§,)#"""""’¨à~“™L&*T¨ÄßÿMdd4fsÎù#Ùd‚  V«­œ#·"›ÍFõêÕ5Ã]Dn8»‘¤àž–”É)Tp÷‹ÅB›6mùõ×_ˆ‰‰É1뺛Í&‚ƒ‰�·átæŒç$’V‹…âÅKP¥ÊþÜìÆµO“h†»ˆˆˆˆˆH–¡‚»ŸÒ¨Ñ=þÈMát\½ëïnˆä޶†»2BDˆˆ'ÊñÆŸ‘ýÿB¹Å8’.)ƒ–”É*TpŸ1›M„†a6kýjq§|ñ-;I–”É3Ü•"â‰òADˆˆ7þ̈ìÿšd)‹fÙ‰HÊ”"¾ãvÓÔòrN!"ž(DÄ僈x㯌È¡‰ˆˆˆÜBÜ×pך""""""Y… î""""ٌø¶¤Œ%,)#"""""’Sè/4‘lÆžt†»^Ήˆˆˆˆˆdú M|Æ0 â⬆áﮈH£|ñ­X§Õõu ÉâÇžø†2BDˆˆ'ÊñÆŸ‘ýÿB“,Ã0Àju¤¾£ˆÜr”"¾õ�íœëëR–B~ì‰o(#DÄ僈x¢|oü™šá.>c2A``&“¿{""Y�òAÄ·ŽÙκ¾®TÔ�=ñ e„ˆx¢|O”"â�?3Bwñ“ÉD®\A˜ô¿�ˆ\Gù â[‡­§]_— ¼Í�=ñ e„ˆx¢|O”"â�?3§KÊ\¸p�óçÏsõêUòæÍKáÂ…)R¤ˆ/O!"""rK‹qÆsØz €²�EÈmñs�DDDDDD$Q¦ î—/_æÃ?ä»ï¾ãøñãɶ—-[–ûî»�¾}ûR°`ÁÌžNDDDä–vÄz' 7þ©\ÆÏ½‘¤2Upÿè£�xç�w0™L4jÔˆ^½zQ¤HòæÍËÕ«W9þ<;wîäÓO?eÙ²e 6ŒÞ½{ûªï""""·œÄÙí·•ðcODDDDDDäz.¸�=šM›6ñÌ3ÏлwoBBRþ8sïÞ½‰‹‹ã£�>bæÌ™8p€É“'g¸Ã’µ9NwAD²(僈o¶][¿½r*¸+#DÄ僈x¢|oü•.¸;vŒ/¿ü’bÅŠ¥ºoHHO=õ<ðC‡Íè)%‹s: ¢£ãýÝ É‚”"¾sè¿î˜sÄ SA!"ž)DÄ僈xãÏŒ0†adä@»ÝŽÅ’þz}F�Ë.Ο�ôwDDD$‡:i»@ßÓ3¸#¨$ï{ÚÏ=ÉyŠÉ“ácÍ=0±h~æÌ¢££]�Ÿ8q‚çž{ŽŽ;òä“OòÛo¿¥xœä‹ˆˆˆÜ’ÄŸt}Ý(W?öDDDDDDDR’áéæsçÎåìÙ³<÷Üs†ÁÇLDD+VdöìÙX, Ã`Ô¨QÌ�;—™3gú²ß""""·Ã0øÓšPpÏcÎE KA?÷HDDDDDD®—á‚ûæÍ›yå•WhÛ¶- 6äÑGeþüù®ecL&�?þ8ýû÷÷MoEDDDnQÇlg¹âŒÖo7™ôñi‘¬&SKÊÔ¨qmíК5k@É’%Ýö+R¤/^ÌxEDDD„ß⎹¾¾+×í~쉈ˆˆˆˆˆx’á‚{\\!!!×2› LvST³ÙŒaï¡dN§ATTN§~Þ"âNù ’yÇíç]_W *éeÏìG!"ž(DÄ僈xãÏŒÈpÁ]$%ú�NDˆdÎqÛµ‚{™À"~ìÉ�¡ŒO”"â‰òAD¼ñWFdx w€9sæ�+W.×÷v»� �7o^×c111™9…d#&“‰� qqv}ªADÜ(D2Ça88f=@ြ„™CR9"{QFˆˆ'ÊñDù "Þø3#2Up_ºti²Ç>ýôÓd�ùú¦^à�7ÞàÀ�Ó¨Q#^zé% ,ÈÏ?ÿÌÛo¿ÍÑ£G)^¼8Ï<ó �:ur»dÉ–-[Æùóç©R¥ cÆŒq­EϤI“زe ñññ4lØ� &P @Ÿö?§2™ 0ÐB|¼ý_'"I)D2ç�õ4ÑFÕ‚Jù¹7¾§ŒO”"â‰òAD¼ñgFd¸àþçŸú²if·Ûyúé§éÚµ+|ðÑÑÑŒ1‚ñãÇ3vìXȘ1cxà�صk  |ùòÔ¬Y“M›61cÆ >øàªT©Â’%Kèß¿?ß~û-¡¡¡LŸ>�ýû÷³|ùrråÊŸqã=z4sæÌñËs8j;ãúºfHY?öDDDDDDD¼Évk¸Ÿ?žóçÏÓ¹sg‚‚‚(P mÚ´áàÁƒ¬]»–råÊÑ­[7‚ƒƒiܸ1-[¶dÅŠ,_¾œ®]»R»vmBBBxꩧؼy3v»�•+W2pà@Š/Nþüù6l[¶láìÙ³þ|Ê"""r‹Ûû·ëëò�EýØñ&SKÊ8�NÌækuûuëÖa·Û]ß7jÔˆ¢E}÷‡aÑ¢E©Zµ*Ë—/gèСÄÅÅñí·ßÒ¼ysöïßOµjÕÜö¯V­_}õû÷ï§}ûö®mf³™ªU«²oß>ªV­Jdd$Õ«Wwm¯X±"!!!ìß¿?ÍÏÁdJ¾„ŽaàZ+ÈlN¾¼Nâþ)m3 ÃH¹ÝÔŽMK»96q›Éd"i—®ß7ãíúv ½µ›ÖcoÔÏæú1LÚnFúä½Ý3†þ¾¾5†Ù##÷ó–ioW¡ë;=}ÊþcxÖv…m± Ÿ,,�‡Z¹ÊbN²�2âúv•ÙéúVF¤·Ý¬7†7:#÷1›M>jW¡ë;=}ÒfåŒHš¾kW¡ë;=}ÒÞ*‘^™*¸¯_¿ž¥K—º­Û>nÜ8bcc]ßW«V�U«V¥8ða6›™1c}ûöeñâÅÜu×]Œ1‚�&+ŒçÏŸŸË—/A¾|ùܶçË—�Ë—/àvÃ×Äï�O‹  ÁÁ�n�Ùlvbcm˜Í&ÂÂ’ßäìêÕ„ñÊ•+ˆ€÷ÄÆZ±Ùä¶ÍnwcH±ÝÈÈX BB±XܶÅÅÙ°ZíX,„†º·ëp8‰ŽŽÿ¯Ý`Àýg‡Óib!0ðÚ%d2%kfrçv;Î0 "#ÖŸÍ�;8Ù5�ÃáÌÀ\½šÐnJccÅnwh!$ĽÝÄ14™RÃÄŸMÊchÅju`±�+—·1LÞ®§1ˆ�·oÇb1ê>†N§“¨¨„v½�ap°…  ÷v­V;qq)�aÒŸMhhIßDˆ‰‰Çnw¦8†6›ƒØX+&Sj×w îc˜x}§<†¢£½]ßq†AHH ��ž®ïô�aâÏÆÛ¦v}{Ã[5#ÿ Àá°+#”.ʈÞ2âÛó¿á$áÅ߃’?On·íʈʈʈ·RFäô׉ù�;w0qq ×·2B‘H‘àV͈  ‹+ ãÚõ­ŒPF$RF$PFd>#ÒËddð6­{÷î¥gÏž4oÞœ÷Þ{ÏõìS§kÖ¬¡téÒ9r„nݺ1qâDxà�Lu4‘ÕjåÁ¤yóæôïߟ˜˜&L˜€Ùl&&&†*Uª0jÔ(×þ+V¬`Ö¬YlÞ¼™5j0cÆ Z´háÚ>räHxä‘GèÑ£»wï&wîkÈ6mÚ”¡C‡òÐC¥©.DÞRïݘwòôŽ²Þ MOŸ4†Êe„oÚÍ™×wNÃ7ðEäv¦}œº¹*¦¹]eDb»ÊˆÌ·«ŒÈ|»9s •ʈ„vsæõ­1TF$´«ŒÈ|»9óúÖæìŒ(T(,Ù>i•áîK–,áî»ïæý÷ß÷¸OÅŠéÙ³'_}õ•Ï î?ÿü3'Ožä¹çž# €ú(CÌnΟ�ôwüÆlN¸£qâ�ED)D2æ¨õ,OŸ™Àý¹ë2¢Pg?÷èÆPFˆˆ'ÊñDù "Þd6#ŠÉ“ñsgôÀû￟Y³fqîÜ9�û>|˜yóæÑ©S§ŒžF²§3ù�DD@ù ’±F¼ëëPs°{rã)#DÄ僈x¢|oü•.¸÷êÕ‹ Ð¥K>üðCþþûo¢££‰ŒŒäÀ�¼óÎ;tïÞ�Ê•+Ó­[7_öY²(§Ó **^ï,‹H2Ê‘Œq&ù ¢™œ{C0e„ˆx¢|O”"â�?3"Ãk¸±páB^yåÞzë-Þzë-·ítíÚ•Q£Fa6g¸®/"""rËrrkÜEDDDDDrŠ ÜòçÏÏ»ï¾Ë©S§Ø¹s'gÏžÅl6S¢D 6lH¡B…|ÕOÉÌf¹s­w˜EÄ�òA$cŒ¤wSÎ�À ŒO”"â‰òAD¼ñgFd¸àþï¿ÿRºtiJ”(AçÎi»‰WÒã$ç1™4ûNDR¦|I?×Ö4åðîÊñDù "ž(DÄeD†§JuíÚ•�7¦ë˜�7j=w‘42n‘5ÜEDDDDDrŠ Ïpå•W9r$uêÔaàÀ�Ô¯_?Åw Ã`çÎ�Ì™3‡Ý»wóÚk¯eªÃ""""· ·5Ü5ƒKDDDDD$ËËpÁ½cÇŽTªT‰×^{�Þ½{“/_>êÔ©C‘"E #**ŠsçαgÏ"##©[·.Ÿ|ò U«VõeÿEDDDr,Ý4UDDDDD${ÉÔMSï¸ã>úè#¶oßÎwß}ÇÎ�;ùý÷߉ŒŒ$Ož<)R„N�:Ѻukî¾ûn_õY²(§ÓÐÍJD$EÊ‘ŒIº¤LN^Ã]!"ž(DÄ僈xãÏŒÈTÁ=ÑÝwß­‚ºàp8SßIDnIÊ‘ôsŸážá[ïd ÊñDù "ž(DÄeDÎþËMn*“ÉDHH î."É(D2ÆÉµˆ9y we„ˆx¢|O”"â�?3Bwñ“ ‚‚,èÿ:¹žòA$c n�%e”"â‰òADˆˆ7þÌÜEDDD²(§¡›¦Šˆˆˆˆˆd'*¸‹ˆˆˆdQ*¸‹ˆˆˆˆˆd'>)¸GFFú¢I"éMSµ>©ˆˆˆˆˆHÖç“‚{“&Mxá…عs§/š“lÊ0Àjµ“äÓï""€òA$£œ·È we„ˆx¢|O”"â�?3Â'÷gŸ}–C‡Ñ»woÚ¶mËüùó¹xñ¢/š–lÄ0 ââlúßND®£|ÉÃm ÷œ» 2BDˆˆ'ÊñÆŸá“¿Üž~úiV¯^Íúõë騱#_|ñÍš5cРAüðà ¿[ˆÙœsg߉Hæ(DÒÏ�ÓõuN_RF!"ž(DÄ僈x㯌ðéT©Š+2xð`6lØÀÊ•+)Q¢Ï>û,-[¶dÑ¢EÄÇÇûòt’ŘÍ&ÂÂBôžˆ$£|ɘ[妩ÊñDù "ž(DÄfÄ ùlòŽ;X¶l_~ù%¹sçæî»ïæƒ> S§Nœ8qâFœRDDD$Çq_Ã=ç.)#"""""’SX|ÕPxx8_|ñ«W¯æäÉ“Üyç�Œ=šöíÛDLL C‡eܸq,^¼ØW§ɱœÆµ%erò w‘œÂ'÷Þ½{³k×.BCCéÔ©�>ú(•+WvÛ'44”Q£Fñàƒúâ”""""9^Ò%e2µ†»áĹSü>èUÚœŠrp1Ö‘¦}M€9ÀŒÓ‘tN¿ˆˆòADd}1Fa8ºO>w%Ýjäî!þî†dS>)¸ÇÄÄ0aÂ:vìH®\¹<îW¬X1ž}öY_œR²(Ý WDˆ¤ŸÓGk¸›b¶xf¨/º”fe€2é}¥é³Ï^ŠHŽ£|O”YÚ©+g˜sf¸¿»‘n_ü sZ[(“WXvæ¯:„O®šR¥JѺuk¯Åv€°°0ú÷ïï‹SJätDFÆù»"’)D2Æiø¦àn¶ñEwDDDDDÒåßø²þîB†„š(¢{(egþ¬Cø¤à¾k×.NŸ>M�|ÑœˆˆˆˆpÝ’2™YÃݰ¹¾´‰3ôžÌt+U»ÎÆóñÁhš– ¡v‘Àz>Ézlæ"´(T†þîH”Ïg!—EwÉŸÜÇ�Ï[o½Eß¾}©Q£yòäI¶OPP�/N%Y˜Ùl"44ˆ˜+N§–Ž‘k”"㶤Œ)3/ø¯Ü�à;0rÕÏD[©»@,b¯Ð2wÊ õº¿2BDˆˆ'ÊñÆŸá“‚ûèÑ£±Ûí—‹1™L8pÀ§’,ÎlÖ»"’2åƒHú>ZÃÞä›?ÛÜžä­Åœ¶~+#DÄ僈x¢|oü•>)¸÷éÓ“)ŠˆˆˆH2Ãéú:sKÊX¯}iºñwG’ $ú$®ˆˆˆˆˆÜJ|RpyùçUÒîiœá."""""’øì/®ØØX6nÜÈ�ˆŽŽ&Ož<ÔªU‹–-[¨e‰ˆˆˆ¤—ïnšzm†;¦_ûµ‰ùXTo‘[ˆO î'Nœ oß¾œ:uŠàà`BCC‰ŽŽÆjµR©R%-ZDáÂ…}q*ÉœNƒ˜˜xݬDD’Q>ˆdŒÃðMÁÝdØ’|sÖp7Ò·†»2BDˆˆ'ÊñÆŸá“U5§N�JžÜ§ɱ¾�þ��¯¦¼ Ÿy͹ÒÔŽ9ê.ÍãZ‘Ödû÷Ú>.¸ÿvÎʲƒQÄÚ¯ý¡{!ÖáúÚ¢z{†9—ÍÆø~­¿»!âWN Òß�‘,Iù rƒ™Ì˜úÁ|ï}þîI¶ã“‚ûSO=Ett4K–,aÙ²e®ÇóäÉÀxâ‰'|q‘ëœÃó|íÃê�Æ5Ü-çÆc²ŸLq›�ÒX¸O«…Dr8Âîq{®@UÜ3ÊøE÷A?1œp⨿{‘-ù¤à0tèPÈÑ£G‰ŠŠ"oÞ¼”/_‹Åg§�,Î0Àfs`è“\"råƒHê ®ý‚Œ+Ü�êA¥4YÈ�ŽõÛ¯µi ¾ö¸)G¾ÇÁ–é¾&uÅêt}”d½v“ š– ¡dXꯕØÿ[ (4 Sƒ{ýÛ? °˜qØ�©ï("·åƒÈ ”¯¦–ýÝ‹ óçß>­†R¥J_6)ÙˆaÄÆZýÝ É‚”"©s×þXÌoÎMaKÞŒ5ôß R�Á5°•ýÊ]ó*ñoÜ"¹Ì,¾¿H†ÚPFxàøoiž‚…1?>Ø¿}ñ#HÃý—Eä¤|Oüù7†O îgΜá½÷ÞãàÁƒDFFb\÷Ö�ÉdbãÆ�¾8•dq&“)ÙÏ_D”"©q&™án&ƒË°&þ›mº9Ÿ2L¼Aª%“7GUF¤ÀñßR=úĨÜÚ”"â‰òAD¼ñWFøäÕû¨Q£Ø»w/ 6¤J•*˜LZ«óVd6› !**§î."I(DRçVpÏðk)G’¯}{sTOg¸[21½L‘œa×f¸¤mý~‘œHù "ž(DÄf„O î{÷îeΜ94lØÐ͉ˆˆˆÜr’.)cÎ臣 Ûµ¯M7§àî0|3Ã]®ãHr#ZÝIDDDD$ÛðÉRWE‹¥pá¾hJDDDä–”t†»)ÃKÊ$-¸ßœ"­-q†»êí¾åHòi-)#""""’mø¤à>dÈÞzë-Î�;ç‹æDDDDn9I î^RæÚ¬hã&Ìpw‰ŸÎÔ wK:Ã]w‘lÃ'¯ÞëԩâE‹hÖ¬  W®\nÛuÓTï _Ïp÷ÍË<¯×VÁÉÔî’{Ò‚»ÖpÉ.|ò—؈#8|ø0Íš5#þüºiê-Êé4¸z5ÖßÝ‘,Hù ’:‡OÖpOR¤½ 3ÜmIn>�‰îʈh w@ù "ž)DÄf„O^½ïß¿Ÿ9sæÐ¨Q#_4'"""rËI:ÃÝì“5Üo|ÁÝq­Ëj¾…o%YÃݤ%eDDDDD² Ÿ|ø·H‘"ÜvÛm¾hJ²1³ÙDîÜA˜µ†«ˆ\Gù ’º¤k¸›3øiAÓM¾iª¯f¸+#RàÐ’2" |Ï”"â�?3Â'÷Aƒñþûïí‹æ$ Є"â�òAÄ;§‘É—¯}ƒg¸ÛœWâ¯-ƒ“Ù5ܕׇþÀøñÛkh†»Üâ”"â‰òAD¼ñWFøäÕû×_ÍáÇiÒ¤ ¥K—&444Ù>Ÿ~ú©/N%"""’#9ÉÄî¶ÓýÛ“ýd’o\Á}ßy+¯n� ÊvíM‚@Í.ó ãè_8ßxÁýAÜEDDDD² Ÿ¼z�ŽŽ¦D‰”(QÂ͉ˆˆˆÜr2³¤Œ9ú»ëŠí`óI¿R²éß8·b;@¡\>ùàä-Ï8q$ùƒ•kÜüŽˆˆˆˆˆH†ø¤à¾téR_4“.³gÏfÙ²eDEEqç�wòÚk¯QªT)~þùgÞ~ûmŽ=JñâÅyæ™gèÔ©“ë¸%K–°lÙ2Ο?O•*U3f 5j$üϤI“زe ñññ4lØ� &P @�›þüDDDäÖ’´ànJç’2&#îZ;Á5pæj€#_/ŸõízÖ$wK­Y8�Òy,t©”üŽ’Io–Úª¦Æ-¡Üí~ì�ˆˆˆˆˆ¤‡O§"�;wŽ~ø�+V$±}mÙ²e¬Y³†%K–ðÓO?Q©R%-ZĹsç8p �>ú(?ÿü3cÆŒaܸqìÛ·€M›61cÆ Þ|óM¶mÛF‹-èß¿?111LŸ>�ýû÷³|ùr¾ùæ Ã`ôèÑ>ïNe±±V ÃH}g¹¥(DRç4®-)�Þ—hƵl: ÁqÛD¸q’þ&«›—AuòR0$ãë#*#’Hz³ÔÛ«a*_So¢+’(DÄ僈xãÏŒðIÁÝjµ2fÌš7oÎ3Ï<ÃË/¿ÌåË—9yò$íÚµ#<<ܧqùðÃ>|8*T ,,Œ±cÇ2vìXÖ®]K¹råèÖ­ÁÁÁ4nܘ–-[²bÅ –/_N×®]©]»6!!!<õÔSlÞ¼»ÝÎÊ•+8p Å‹'þü 6Œ-[¶pöìYŸö?§2 °Ùèÿ:¹žòA$uFÒîé-°¶k_ßà›¥n/ZÓ»üMÊí)#\’Îp×�àD”"â‘òAD¼ñgFødI™3f°qãFF�ÅÝwßÍ£�> @¡B…¨X±"Ó§OgêÔ©¾8gÏžåäÉ“\¹r…öíÛsñâE6lÈøñãÙ¿?ÕªUsÛ¿Zµj|õÕWìß¿ŸöíÛ»¶™ÍfªV­Ê¾}û¨Zµ*‘‘‘T¯^ݵ½bÅŠ„„„°ÿ~Š-š¦þ™LÉÿH6Œk˜šS¸¡˜Óéy›aFÊí¦vlZÚÍȱ‰ÛL&I»d2A@€Ùu1g¼]ߎ¡·vÓzì�úÙ\?†IÛÍHŸ¼·{cÆÐß×·Æ0{d„ÉK6›§3³í*#t}§§OÙg “.)c1›]û¥©]#I‘ÖlIrì�Ég’­¦dû(#Rßæégc8×®„K޹¾ÚUFäÄ1¼Ñ¯#óÁnwàtú¢Ýì�éë“®o�¡ÿÇðFf„Ù|-Ÿ§2"=}Òõ­1ôÿf—ŒH/ŸÜ×®]Ë„ h×®�Ûã¹råbðàÁ<ýôÓ¾8 gΜà믿fáÂ…†Á�!C;v,qqqÉ ãùóççòåËDDD�/_>·íùòåãòåËDDD�7o^·íyóæuŸAA‚ƒÝg–Ùlvbcm˜Í&ÂÂB’sõj,¹ràþ¡ƒØX+6›ƒÀÀBB‚ܶÙíbb¬)¶‹a@HH ‹û ©¸8V«‹%€ÐP÷v'ÑÑñÿµ ×­#‡Óib!0ðÚ%”ø võj,f³‰Ü¹ƒÝŽ3 ƒÈÈ„5fsçNöË�ÃáÌÀ\½šÐnJccÅnwh!$ĽÝÄ14™RÃÄŸMÊchÅju`±�+—·1LÞ®§1ˆ�·oÇb1ê>†N§“¨¨„v½�ap°…  ÷v­V;qq)�aÒŸMhhfóõc�ÝîLq m6±±VL¦Ô®ï@®›©—x}§<†¢£½]ßq†AHH ��ž®ïô�aâÏÆÛ˜½^ßÞÆðV͈Ä7äbcMÄÆ¦>†ÊeÜzáL|õäÉ�‹0KÂóJ[F\›áž+47æÿö»Q‘ô/€°ÜÁ„å¾6ʈk2’±®ùÍfe„2¸µ_G$æƒÃá$..áú¾•3ô:")eD‚[5#‚‚,®|0Œk×·2B‘H‘@‘ùŒH/ŸÜ/_¾ì63<©‚ í‹Ó×Þuyê©§\ÅõÁƒÓ¯_?7nœæã3º=5V«›ÍáöXb“N§ATT\ G%ˆ�µzì�ÍæÀn÷|lJí&ž7.ÎFÒ?Ä“¶k·;¼ö)1’J|Ç'.ÎN|üµuFÍf“+L§×v9Rj××c˜Ø®ÍfÇnw$۞ؾ·v37†É·yC÷v3>†ññv¬ÖëÛ½¶�·v1¥vSÃÄv #µŸ�oÇ0ñØ„?¼<µ{cÆ0µëÛÛÞª‘˜‰cªŒ¸F‘@aàäÚî±ÑV,ÿýQ�¦ŸM’5Ücãœæ¸ÿ޽1áH2Å=6&ž(Ã},®µ«Œ€ôe„#&És °(#þ£Œ¸u_G$æCLLB!n팸ž2"�2âÖÌ›Íáʇ„OÀ$lSF\£ŒH ŒPFd$#‚ƒÃ<ÜK—.ÍŽ;(]ºt²m»ví¢xñâ¾8 … Üg¢—,YÃ0°Ùl®™ê‰._¾LÁ‚(P @²íÜ~ûí®}"""È�;·kû•+W(T¨Pšû—ô£)IüÁÿ{wU}ïü}f IH0l"*¨‚X7(Z­x«‚BqÁÖ–jë^+Å«V[q«µ¶×Üz«ýÝ"T/j+z­‚¶âwˆ¨ˆ ˆì²ÏvÎï�ÉLfÈÌ@fάy=åÌœ™ïù曓wf>ùÎ÷tu_¶ÚͬOŰ·ÝâÃLÚÍÞvŸï c˜Ýv3ëSç1Œ½]h_k!¶Ëù�y»Å4†±KÊÈJü¸¤íƼMË)k—ÇÙý½‰»Ë²’MdD—Ûµ‚1o®œÎ’9¿ÃíÞ÷†1Ìn»™õÉê” dDWŸËù�i»ŒavÛͬO–"ËЙfç×"…öµb»œß™·Ëf·ÝÌú”�ŒØS¶\4õÄOÔœ9stï½÷êÝwß•$}òÉ'züñÇuÛm·éôÓO·ã0’¤½÷Þ[•••ZµjUô¾õë×ËívkܸqZ¹reÜãW®\©Q£FI’jkkUWWÝ …ôá‡jÔ¨QÚo¿ýT]]·ÿ“O>‘ßïWmm­mýH$vI‡ºöFC1EZÖù)Åõ5Ã�[bf̬#.š [ î—\r‰N9åÝÿý:çœsÔÚÚªK/½T·ß~»N:é$]|ñÅvF’är¹4mÚ4=øàƒúòË/µmÛ6Ýwß}š4i’¦L™¢õë×kÁ‚òù|Zºt©–.]ª3ÏH†|�J>3°2½J(âlÙÒ˜ï.€"ôóM�¨Î·V’ôÂ~¿’³ …sׯ™r6,”$ù/‘å9(+}Œ¸î_;ôîæð‹×…“úªÜmˇ&!ÉüÓÊzu±$Éñ›ûdì{@ž{t?}ûöLû¹iÏp¿÷Þ{»ôøË.»,ÝC¡H8†*+ËÔÔÔfË”òؽØ9FWç�ÇÌp·ìùcJñKÊd>Ç�Œˆ»¤Œƒîù ò@*ù̈Œ î=zôPMMMÊ+ÑJá�ESpH®Õ ÏwÉ)‡‘Áî9¸hjܸfª½â.šÊî@±IûUüñǯW_}U=zôÐ 'œ SN9EC‡µ³oÝÆöPxYºgeןl:¶sPpeᢩhÇî@QK{ÁÍûï¿_¯½öšÎ:ë,½öÚk:í´Ó4yòd=üðÃÚ´i“�}(i+¨�f‹$©Æ™ÎZ�1EZÃmO§Rˆýl#«·ÛËŠ]R†‚;Pt2z�´×^{éÜsÏÕSO=¥E‹é˜cŽÑŸþô'M˜0Açž{®ž|òI544ØÕW€’´#ÔÝî�Æ w#v†»²_¤µ˜áž=!³c›%e€¢cÛ¤¤¡C‡êšk®Ñ«¯¾ªx@ýû÷×]wÝ¥cŽ9†õÛ» Ó´ÔØÈÅJtF>©}ì_Ýî�Î ÷¸5ܳ?Ã=·†{æw2"Mâ�’!¤’ÏŒ°ýSÀ‡CN§Sn·[�GÁ`P;wî´û0(P»»€.€î‹|’{bçÒèvzKÊäú¢©áí|!IF´3YÃØù ò@*ùÊÛÞ‘­]»VûÛß´hÑ"mÚ´IƒÖ9眣ɓ'kàÀ�vÌ0 ••¹ÕÖà—€8ä�Z«å�nÛã�®7;Ãݾ—wÉ×þ¯]ËÉ�1¸h*‡|� ù •|fDFïÈZ[[õüóÏë©§žÒ[o½¥Þ½{ëä“OÖäÉ“5räH»úˆ"a’Ûí”Ï¿ëÄ"€ä,ËÒ¶P£¤ðr2ƒ=ýÒh$¼†»%‡ddÿ2¦‘OeÚ°šL´2¢]0ö¢©¬á�’!¤’ÏŒHûUüµ×^«^xAn·[ãÆ�Ó¼yótÌ1ÇÈÉL€=ÖlµÉ×^0äî›f+í³¢s°~»ÔQpç‚©Y»¤Œ#û<`¯´ îO?ý´zôè¡!C†hãÆ�zøá‡õðÃ'}üŸÿüçtP²"³Û¥4/˜*Eg¸K¹™ø`¶OqØ5Å"KÊ8�¶\�@n¥]p?ýôÓy�¡­¶Üs;Ã=ò‰L^ fA´àÎr2@1Jû•üí·ßng?P,Ëâb%"€ä¶3/¸jŸánä¦Hk÷’2dDŒPûî,'H"$G>H%ŸÁÔØÆ²$¿?¸ûèvÈ ¹Ø%eú8«ÒkÄŠü|åjI™ð¿öÜɈ(f¸qÈÉ�RÉgF0u¶r¹8¥$F>‰m 5D·Ó_R¦ý…d®–”i/¸Û¹º ÑÎìXÃ@ù ò@*ùÊ’ ¶q8 •—{å°kº€’A>ÉÙrÑTE î¹™Š\4Õ¦UÜɈ‘%e(¸’ÈÉ‘RÉgFPpȣ؂{�³2½FÚg¸[9Z-0² "ïo³ d†ÿeI (QpÈ£HÁ½—£Bîtg¨[¹�ánÙ¼†;bD/šÊ w ¥ý®lùòå]züQG•î¡J’i™Új’”Éúí~Éj o^›z–\È´ÔèÏÂ.sQq·“å÷Im-áîܬÇÀ^iÜÏ=÷\]¸RÖªU«Ò=Šˆišùî€E>�5˜­ *|‘Ìt î†ÿK ÿ|YžÁvu-©¯›Cj¯·kP•}3êÉI«?”BáóÁ8`Xž;ò@2ä€Tò•i¿Kz衇¢Û úýï¯ &èðÃWEE…´|ùr-[¶L7Üpƒ-�Ea3MKMM¾|w@"€Ä6ë£ÛiÜk¢Û–û L»´[ŸîD·¨¶§àNF„Y_~ÚqcØÈüu( ä€dÈ©ä3#Ò~—ôío;º}å•WêüóÏ×9çœ÷˜I“&é/ù‹-Z¤ãŽ;.ý^” Ï›£ÛƒÜ}÷øyFókrmÿƒd6Éáû0z¿å±¿àþuSPó>hÔÖÖðì�m³D†îŲ'¶Ú¼!ºiì³_; ]¶LKZºt©.¿üò„û¾ýíoëî»ï¶ã0(p‡¡Š ¯š›}2M+ßÝP@È ±�ÁÑíý»Ppwm½Mߊ¸û,2˳«kQϬiÑ›ý ÷ éeOÁ½Ø3²,Ys+ëƒ7¥Lºˆ™�Ó»_ÆýJA±ç€ì!¤’ÏŒ°¥ànš¦êêê´ÿþûwÚ÷ñdz¦V7Ò•uýt/äÐY£ÙÝ®r”ïñóŒÐöè¶ex%ãP¯ó%Ï [û'I;}/N]É!Éé04ù rU{¶§¨3âËOe½¹Ô¾özTH=«ík(rE�²Š|�J¾2–‚û„ týõ×kÕªU>|¸ÊËËÕÖÖ¦÷ß_O>ù$ËÉ$ÐWpï±çO´‚á\ûÈàÿÙÝ­8¦ÕQpxbõ+wfõxE©­ãû¨Ê*©z¯ôÛr¹eœ4…P¤l)¸ßtÓMr8zì±Çt\HËåréøã�×M7ÝdÇaJJ}¨)ºÝÓÙ…‚»Bá {.ZšòH1Ÿ¾tPN,æÓœÆøïÊ1õGùë €¼²å]Zee¥~ûÛßê7¿ù�¾øâ 555©¼¼\ƒ REE…‡()~+¨:ÿ:IR¥Q¦ ûçOŽÌpWög›Ç.wè¤àž˜êØvð  ;³uZ”Óé”ËåR Ð�¨²²2;›G�3MKMMm\¬@'äÐÙ¿[>’¿½p~T�ƒå0º²zøy¹˜á»¤Œ#KËœ}FÄ^¯ÈaߺöJ d ù •|f„mïî¿ÿ~}ë[ßÒ©§žªóÎ;O[¶lÑ–-[4mÚ4Õ××Ûu8~ÑH†|â½ÙöIt{wŸ®=¹½P¯ÌpÏÕ’2E�!f¸ÙTÔù «È©ä+#l)¸?ôÐCš;w®¦N�ªûï¿_^oø#Ñn·[’t÷ÝwÛq8Ã0TVææ"_:!€Î¾ðoŽnŸ\yDמlEÖpwÛØ£Är±¤LÑgDì w'3Ü;}>Èò@*ùÌ[Þ<ù䓺þúëõË_þRÇ|ô éÕ«—®¾új½ôÒKvÎ0$�Ç%~רùt¶1T/IÚÛ¹—z;{vñÙ‘%er1Ã=ûKÊ}FĮឃï Ð�}>Èò@*ùÌ[ î›6mÒ˜1cî8p vîÜiÇaJ‚ß ªÑl•$õvu±Øn…d(RÏÅîÛ\451‹îÚÙòŽ`À€úðÃî[µj•úôé⺤%ìµ–Ž×M5ŽÊ®=9º~»r2›:¶àÎõ@“0YÃ@˜-Ó¢Ž=öXÝtÓMjmmÕØ±ce†vîܩիWë–[nÑI'�dÇaJÂ'þ¯£Û5Î.ÜSÜÍÁ ÷PÌämêíIÄÎpç¯@·fË»´™3gjÍš5š={¶ Ã�eY:ãŒ3dY–Ž=öXÍœ9ӎàÀY–ä÷eq‘p» €xŸ6E·§W}»kOŽ›áž‹%eÂ?¸)k*úŒ1ÃÈ–¢ÏYC>H%ŸaË»´ÊÊJýéOÒû￯>ø@MMMªªªÒa‡¦#FØq˲ÔÖÈw7 òèÐjúõNÛg’¤jGyúL•då¤àþ7›·‹>#˜ádMÑ瀬!¤’ÏŒ°å]Úý×iÒ¤I5j”F�eG“(RN§C¡ØÏž@;ò{»mMt»ÒÑ£ë³Æcg¸+û³©Cí÷l_0µ¨3‚5Ü�¬*ê|�Uä€Tò•¶LÁ¹ãŽ;tÜqÇé‚ .Ð?þñù|>;šE‘q8 UTxåpdù9€¢C>¶…£Ûß.?¤ë X1ÅÝ\.)“¥åd¤ȈØîNf¸v*ú|�5ä€Tò™¶¼K[²d‰žþy=ÿüóš5k–ÊËË5qâD�~úé=z´‡( ÚùrtûPïà4ZÈíá^Ôâf¸Spº3[Þôë×O?úÑ�ô׿þU/¿ü².¹ä­^½Z?úÑ�4~üxÝu×]v è9c^~ r÷ízqKÊäp w îÉÅÌp7XRèÖlŸ‚3`À�þùZ¸p¡žxâ ÕÔÔèᇶû0Egg¨EõfsôvW¯.·aÄÜ�ìws±¤LÑ 1Ã@˜íÓ¢Ö­[§Å‹kñâÅúðÃÕ·o_͘1Ãîà@YíoÊ`Wä ­ l‰nO®<*ÍVr;Ã=WKÊuFÄ®áÎ wÀvE�²Š|�J¾2–wik×®�ÙW­Z¥ÊÊJMœ8QW^y¥ÆŒ#ƒQÝ‚iZjllËw7 òû"°9º�Ör2Rü’29™áþ7›KÊ}FÄ®áî¤àØ©èó@Ö�RÉgFØRpŸ8q¢<�Æ�¯‹.ºHãÇ�—Çã±£i€’±&°1º} {ï´Ú0_E·-gŸŒû´;ÁöŠ»“ É…bþÂ’2@·fKÁý—¿ü¥N;í4UWWÛÑŠ”Ãa¨¼Ü£–¿L“�uè@>á�3>×ôVôöžþiµcø?îhÓ{HÆýJ¥%`ªÁþ™­é‘½BrÑgĦ¯;¶{eÿ� @wRôù kÈ©ä3#lyçô»ßýNmm|Œ’ƒY]’ ÐÝ­òwÌLïë¬R¥£,­vŒÀ—ÑmËs@ÆýJeCsÇR)+³»TJ1g„õõÚð†Ë%í=0¿�JP1ç€ì"¤’¯Œ°å¨Ã‡׿ÿýo;š(I«ý³ ‡x¤ÝŽXݶÜûgÔ§Ýùª)¶àžý ´#˲¤-íKõÙ[k¸Ýš-÷½ïéá‡Ö«¯¾ª#F¨ªªªÓcÎ:ë,;P”¾ l‰nŸUulÚíþð wËÙGrTdܯTÖ7v¬MžíîE«a‡ä÷…·û¦·.?€ÒaKÁý†n�$}öÙgZ¼xq§ý†aPpÝÚ×ÁÑí�®šô1[e„6I’,÷ ;º•Òú˜îûPpOlKÇ…p î@·gKÁýŸÿü§Í È™¦¥–+Ð ùH‚Û%I= �z¥93Ýt¬Ÿíåd$é븂{ö–”)挰6oè¸Ñ/ý¥‚$VÌù »È©ä3#lYÃ}àÀ�qÿõïß¿Ó}Ùrë­·jذaÑÛË–-Ó´iÓtøá‡ë”SNÑ3Ï<÷ø?ÿùÏ:餓tøá‡kúôéZ¹retŸÏçÓ¯~õ+wÜq=z´.¿üríØ±CØsÁ ™ï.(Päº3¿ÐÆ`½$iW� ÃH«�¸ ¦f¹ànY–Ö7…—”éÛÃ!¯3½>ï©¢Íf¸YW´ù ëÈ©ä+#l»Të›o¾©óÏ?_ßúÖ·t衇jݺujnnÖwܾ˜T¬ZµJ‹-ŠÞÞ¼y³.¹ä�}öÙZ¶l™®»î:Ýpà Z±b…$éå—_Ö=÷Ü£ßþö·zýõ×5aÂ]tÑEjii‘$Ý}÷ݪ««Óüùóõ /Ȳ,]{íµYé{)2 Éëu)Í€F> »[ÞºF!…_ìèéŸv;ñLÍî’2 ~KM�ðk¸�=³{ÁԢΈ˜‚»ú2ð[Q瀬"¤’ÏŒ°¥àþÊ+¯hƌھ}»N;í4¹\á7eõõõZ´h‘zè!;Ç4MÝxã�š1cFô¾gŸ}VƒÖ´iÓäõz5vìXüñZ°`�$iþüùš:uªF�¥²²2ýä'?‰ö? jáÂ…ºä’K4`ÀõêÕKW\q…–,Y¢M›6ÙÞÿRd†¼^wÚ³ö”.òÝݼú£Ûßê1,Å#w#®àžÝî‘Ùí’4°"»ë·sFÄ-)à wÀvÅœ²‹|�J>3–‚û½÷Þ«sÏ=WO?ý´fÏž-§3ü¦làÀ�ºþúëµpáB;ç¯ý«¼^¯&M𽝮®NÇ�{ÜðáÃ£ËÆìºßápè�CÑŠ+´víZ566jĈÑýt�ÊÊÊTWWg{ÿ@÷`Y–êCÍÑÛC<éÏ‚Îå’2±ë·ìÉS“ŠÌp¯ÚK†·,¿}�w¶|>øÓO?Õ�wÞ™pߨQ£ôõ×_Ûq˜¨­[·êž{îÑã�?w}}½ú÷�ÿ˜v¯^½¢ë°××׫ºº:nuuµvìØ¡úúzIRUUUÜþªªª.­ãnêô—ËRtY‡£ó_U"‹÷'ÚgY–,+q»»{îž´›Îs#û ÈûXÆ®�M¿]{Ç0U»{úÜl}ovÃØvÓéSêv³3†ù>¿ÃâȈÈãReÆž·KFp~w¥OùÃíÁ&5[mÑÛûzz§hw7cØ^p· ¯ž½%ÃÈÚ®�)¸ïÛÓ÷2¢½]_›´3|1\£ß€NÏïçw×Ú%#Jq ³ý:"ò‡Ã°©]^Gp~w¥OŒa!gDl>Ø×.ÁùÝ•>1†Ý%#ºÊ–‚{¯^½´sç΄û6mÚ¤ŠŠ ;uÛm·iêÔ©2dˆ¾úê«.=wwëÉgºÞ¼Çã’×뎻/ªµ5 ‡ÃPeeç™O ­’¤=­òèô3B>þÏ$I޲ƒUÙ³\Rö2b}ÓŽèöÐþ媬ìèæÛ²^‘…wÜû TÅ.m“adD¯#ºš‘|¨¨ðª­-|~KFð:"ŒŒè@F„Ù•�+:^–Õq~“dDFFdž]eKÁýÐCÕÍ7߬ÿüÏÿÔ¾ûî½ûöíºûî»5fÌ;#IZ¶l™Þ}÷]=÷Üs�öíµ×^Ñ™ê;vìPMMMÒýõõõ:øàƒ£�©¯¯�ûÁÎ�;Õ»wç™hÉøýA¡¸û"5|Ó´ÔÔÔ–àYa­­þN÷Eþ„ &n¢v#Çmk H $l7 ¥ìS$bEþâÓÖ”Ï×±¾«aòxœ²¬Hˆ$o7òѨ]»Ç0Òn T0ê´?Ò~ªv3ÃÎû’�a|»é�¡Ï”ß¿k»�IÕn$µ›h #íZÖî¾7öŽaä¹á7^ÉÚÍΆB©ÛM5†Ý5#Âk§¹¢·w7†dyŽTü±¦©ã¢š5ÎÊ´3ÂjûXRx_Èý�N}·;#"KÊ8 ©§‚jŠ™ñNF´ïûj]t;¸Wߤm“dD¸Ý𿼎ˆmw÷›¦¾øt±dDlû¼Ž##ȈØv3Í¿?͇ðÌÕð>2¢FF�éd„×[™ô1»cKÁ}Ö¬Yúþ÷¿¯‰'j¿ýö“ÏçÓO~òmܸQÕÕÕºõÖ[í8Œ$é™gžÑ¶mÛ4aÂI߄ѣGë¼óÎëTˆ_¹r¥F�%Iª­­U]]�¦L™")ü«?üPÓ¦MÓ~ûí§êêjÕÕÕiàÀ�’¤O>ùD~¿_µµµ{Ü¿Ø�b$ùÆwu_¶ÚͬOÅh¿G­­¦ í×fÒnç1´«OÙj—1̼ÝÂÃÜd„Õé¡}­…Ø.çwæíÂ.hx=º]ã¬Lûk5|u´ï=¤S;vŽ¡iYÑ‹¦î]ᔑ¢ýîœæ×1±í3 ­1*öó»kí’™·[xc˜ý×�ó!³v‹k 9¿óÛ.c˜Ýv3ë“¥P(q>dÖnq�!çw~Ûe ³Ûnf}ÊNFì)[ îƒÖßÿþw=ùä“Z±b…öÙgUUUéì³ÏÖÔ©S;­›ž‰Ù³gëç?ÿyôöÆ�uÖYgiÑ¢E2MSsçÎÕ‚ 4yòd½ñÆZºt©æÏŸ/Iš>}º~ñ‹_èÔSOÕ°aÃôÈ#�Èãñhüøñr:�:óÌ3õàƒjäÈ‘*++Óïÿ{�xâ‰êÓ§�mý/u‡aˉ  ô�èŽ,ËÒ'þŽkÙŒôN»­ø ¦”I·vk{«)_ûä—�•¹¹`j1f„µòÝè¶1øà<ö(mŘrƒ|�J¾2–‚»^Çý‚ .°«¹¤ª««ã øÁ`û쫽÷–$Í�;WsæÌѯýk 8PwÞy§¾ñ�oH’Ž;î8ýâ¿ÐW\¡mÛ¶iäÈ‘š7ožÊÊÂk ]~ùåjnnÖi§�¦`0¨ &覛nÊú×T*"ë=EÖK€òÝU�¿cÉ�áÒ¾î=_¦nWF £-˽_FýÚ�¯b–�XiÛËŤŠ6#¶lÿ[Q)càþùí P¢Š6dù •|f„-ï LÓÔ£�>ªSN9E PSS“æÌ™£U«Véè£�ÖUW]%�dzû†Ò°ï¾ûêã�?ŽÞ>ꨣ´hÑ¢¤�?çœstÎ9ç$Üçñxtã�7êÆo´½Ÿ ûY3»ýˆ²Ìf¥ç²àþuSÇš‘ûäh†{±±B!iÇÖð�ÞýóÛñû‡ìÞý÷߯yóæ©¥¥E’tÛm·é•W^ÑÑG­—_~Y÷Üs�‡(*_¶G·ÏìyLFm�ðzá–³¯äè‘Q[»³>Ç3Ü‹Rý6)Ô>N½ûå·/ †-÷E‹éæ›oÖA$ŸÏ§¿ÿýïºêª«tÝu×éæ›oÖ‹/¾hÇaŠÊ–PCt»�«*³ÆB;$I–+û³©7µtÜ0Ã=!ëÕ¢ÛFf¸³¥à¾iÓ&�5J’´|ùrMœ8Q’tà�jãÆ�v h„,Sÿj]½½—£"ýÆ,K†ámÃ�aÏv/³Æa™ÓÈúñŠ‘õÖ¿:n04PPl)¸WUU©¾¾^’´téR�9RUUáY\õõõÑ‹’¢´™¦¥††V.V òÝQìúí’TæÈäz63Îed‰+æGÕ‘ƒz{QfDkKtÓ8úÛyìPÚŠ2äù •|f„-÷£Ž:J·ß~»~øa-X°@“&M’¾˜êã�?®ÚÚZ;P4þÖøFt{By†¯…¬@Ì�ìÏpÏuÁ½(…Ú/,Û§¿ Ëî³¥à~ÕUWÉï÷ëÞ{ïÕ 'œ ³Ï>[’ôÜsÏéÿø‡~þóŸÛq8‡ÃPE…WÞ™Øù€îhkÌúíßëù­Ì³‚Û9˜á3Ÿ^¹ø©-ÊŒˆ\0ÕÉEe�l*Ê|�ä€Tò™¶¼CØgŸ}ôÿþßÿëtÿ¸qãôÊ+¯¨W¯^vEÀé´åo8Jù€îæ«À6I’[N}ûo†­uÜ­¬á?Ã=7/P‹.#"3Ü]Ü�l+º|�3ä€Tò•¶¾Cxï½÷TWW§-[¶hÆŒêÕ«—6oÞlç! ^È ©Þl–$èÙ;óã–”Éþò%VLÅ�IcID îN–“ÐÁ–‚{cc£~ö³ŸéÿþïÿdY– ÃÐ÷¾÷=mÛ¶Mg�u–þò—¿hذav  à­öo”¥pѺÆY™yƒqKÊd†»³�£ îŇ%e$`˼ú;ï¼Sk×®Õ=÷Ü£·ÞzKeee’¤8@Ǽî¾ûn;Pþ·ù½èv•£<ócg¸ç` w3vI™¬­øXf¨cÝf¸ˆaË{¨þóŸúÍo~£ï|ç;ª¬ì˜Ååp8ôãÿXo½õ–‡A�³,K­­þ¸�¡€D> {±,K‹šÞŒÞ>¡âÐŒÛ4”Ûîñk¸gýpÅ—¡˜ËÊ2ÃȪ¢Ë9C>H%ŸaË;„–– 4(á¾òòrù|>;ƒgYR Úýt;亓­¡†¸Û£¼‰_#uIÜî¹�ánä`M™¢Ëˆ`Ì@˜ádUÑ倜!¤’ÏŒ°e†û Aƒô /$Ü÷ꫯjÿý÷·ã0(p†!yÒ ù€îd[Ì ÷üØÓhÌ w+Mmÿ1ÍÅr2RfD(æÜ�¬*º|�3ä€Tò™¶¼C˜1c†ZZZôè£�êé§Ÿ–$Ý|óͪªªÒ¥—^ªïÿûv à½ÑúIt»ÆY™â‘]‘Ûî‘‚;3Æ’`IIØöŽí’K.Ñ\ 5kÖ¨©©IÕÕÕ:à€ääMèFÞn[Ý®qö´§ÑØ%e”ƒ‹¦¶ÿ›«îÅÆ¼ÿÖè¶áb†;€¶¾Cp¹\6lX§û}>Ÿ¼^¯�‡(8›‚õj‹Yþe¨g{ÎñîfûG. QqOhmÇUÔ`þú àdt-¬•+Wêšk®ÑøC]{íµúàƒ:=æõ×_ש§žšÉaPD‚A® 1òÝÁ+-+¢Ûc{|CNÞˎqKÊ”ÞîRñd„e†â.šjœ45�½º‡bɹG>H%_‘ö»ÀwÞyGÓ§O×+¯¼¢ÖÖV½òÊ+:çœsôÚk¯I’tíµ×ê¼óÎSyy¹mFá2MK--~™&+�|@wñ™StûäÊÃík8fÖ¼”ýåú¬Ü‹*#1ß‹CFÉèÁë\ ›Š*äù •|fDÚŸI¾ÿþû5fÌÝsÏ=*++“ßïׯ~õ+ýáPcc£n¹åµ¶¶FgÀ”ºMÁúèöáeÚ×°•ãî‘C±¢Lg~_Ƕۓ¿~(HiÏpÿý÷uñÅ«¬¬L’äñxtÕUW©®®N³fÍÒG¡çŸ^?þñ�¹pj7ápªªê!WX° òÝE��$©§£‡H%Ÿ‘ö;¶ÆÆFí·ß~q÷õîÝ[eeeºõÖ[uòÉ'gÜ9€bñ…st{/G¥Í­wÌp·rPp·Ú×”qpÑÔÎbf¸Ìp°‹Œ®äåpt~ºa9rd&Í�|_D·½vÅãÖpÏÝESYR&?3Ü$—QÁak[£Ûíõö6·†{f¸·ÿË'´ˆ]R†îv‘vÁÝ0 L{�$mîˆntÕØÛx®/š™ážõ#¡Ø‹¦z(¸ˆ—ö)˲4iÒ¤NE÷¶¶6�uÖYqË͆¡×^{-ý^¢(˜¦¥ÆÆVYÖî  {!ÐD îÃ¥ÞΞ¶¶m(·Mµr|ÑÔ¢Ê.š äTQ倜"¤’ÏŒHûÛ”)SììJ¿è$C> ”™–©�¡pÁ}€k/û?;Ã=k¸·/*“ËO3MFÄÎpgI 'Š&äù •|eDÚ÷Ûn»ÍÎ~ 8†ÊÊÜjk È4ù­ ù€R·=Ô${Q|€s/û`åv†»™ãîÅ”3Ü�œ*¦|�[ä€Tò™\4¶r¹œùî€E> ”Å®ß>À•�‚{Ç w+—KÊdýHŠ&#ü\4ȵ¢É9G>H%_AÁ C_·G·³RpWì’2¹›ážÃeŠM�w€ ­ lŒnr÷³ÿ±k¸çb†{û¿*î�Å,)c¸YR@< îúÜ¿)º=ij·ýˆ[Ã=Mm_S&Wk¸f¸H�‚;lcY–ÚÚ²¸L8€]�(u›C ’¤rëjg…íí;üŸÆÜ¨²½ýXïmöÉ o÷tç¦â^TÁES�œ*ª|�Sä€Tò™ÙÿL2º Ë’üþàî Û!PÊ,ËÒÖö‚{§ýÅp£åßr´, Ë5@–ç`Û�Ñ´ôû·¢·�Ø;7å¢ÊˆúŽõúUQ™¿~ÝDQ倜"¤’ÏŒ`†;lÅÂ$C> T5š­òµ/ùÒ×esÁÝôɵivôf°æÒ¬^ÉtþÇÍÚÚjJ’†÷vkòAåY;Ö®Š!#,Ó”µæ£ð Ã�úí“ßÝD1ä€ü ¤’¯Œ àÛ8†ÊË=r°à+€]�(e[B3ÂûÚ<Ãݹý>9_H’ÌGˬ>×Ööcmléo«›%I.‡4óˆ*y�¹ù™-–Œ°ÞxEÚüuøÆ�Ãd°¤ �uÅ’r�|�J>3‚‚;@²Up7|«äÜþGI’%§‚ýæHFö^º=²¢QÁðävMR®�•¬<Ë øe=ýçèmÇ”æ±7 w€ l îŒn÷±kIË’kó¯d(\Õ\*Ë{ˆ=m'°øóýûkŸ$i/¯Cg ³ÿ¯ÅÎzòiÛ–ð�‘GÊ~X^û 0QpÈÀæ¸îÕ¶´é¬DŽÖ7$I¦{°B5—ÛÒn"[ZBšûAcôöO­T¹›—ˆ±¬�WÈúç³áN§gü8¿P°x7[…Bf¾» @‘(Uë[£Ûý]™Ü�Ö·äÜ2'z;ØïfÉ‘½µÂç~Ð(_(¼ýÝÁ=4~¿Y;V*…š–eÉ|âþèmãÌóeì{@{t?…šò�|�J¾2‚Å9aÓ´ÔÜìËw7 ò¥lµƒ$©Üðj_WŸŒÛsÖ?!Cá x°×OdUŒÏ¸Ídšü¦^o_J¦Êcèǵ•Y;V*…–ÖWŸËúx¥ÔP/kÃ:iý—ზq¤üvèf -ò@*ùÌ îØa6I’ú¹ªå4’Ù*µÌC–%_ÐêR{•þµr¶o7V_!²7+c}S(º}ÔÞ^Uzøð£µu“Ì__.…B�ö§Èp8< Â(¸Ã6‡¡ÊJ¯šš|2Í®”6ò¥ªÕôËg$IÕŽr¹6]#ÇÎÿ–¡Žó¼<Ͷ›Cšö÷6Im™wtôé‘¿Br!e„õé‡ ‹í~˜Œ£¾�ûÝ\!å€ÂB>H%ŸAÁ63òÝ‹|@é©7›£ÛýN9wü?ÛÚ^çd[[{bŸKe¾·.§ÇŒ° ©ÅíT(’•ç÷ËÖWŸwÜ8b¬ÇO’ÊzHƒbv;�7¼†� ù •üdw€4m 6D·ûžè¶å¬ÑW�aÚÜž)]î2ätìù‹½6³B¯´ýX‡õó$~@ý6iýÚô:�À Æ¯ôí�Ê2ƒ¶µÙ–¤B\�ÕqÂdß84ßÝPD(¸¤ishgt»Ÿ³"ºmö£§šîÔ3_´J’~?¾Fߨqw©ía)ö™{FÖÿÍïR{è¢Þý¤S} 3 îiÚ¬�n÷�)¸Ëp)³4ŠÓîO2†:f¢?¼LÆ !6 · C*/÷ª¥Å—÷%e¢ö=@†»k$ î°�iZjjjãb%:!Pªbg¸÷qôˆÙãVÈì¸årØ|`³ã¢žÆ¾ƒe0Ôæä^›Ã�L‹•XÄá5€dÈ©ä3#ì~û‡nŽ_t’!PŠÖ¶G·û:Ë:v.…b¦j; ›ËÈ¡Ž‚»œ¥1‚Œ� ù ò@*ùÊ î°�aêÑÃ-Ã¢G> Y–¥O$I{9*ÕÓˆY~Äp+3ÃÝi÷+®Ø‚»Ãisã¹GFH†|� ù •|fwØÆ0$·Û%~רù€RÔ`¶ªÑ _õ@OêXW]†KfVg¸ÇËY w2@bä€dÈ©ä3#вà¾~ýz]zé¥=z´ÆŽ«Ù³g«¡¡A’´jÕ*ýà?ÐG¡‰'êÑG�{î?þñMš4Ißüæ75uêTýë_ÿŠî3MSwß}·N8áuÔQ:ÿüóµnݺœ~m 8l5F·û8{JVGÜ’+n†»Ëîyfìôùâ/¸@©(Ê‚ûE]¤ªª*½üòËzê©§´zõjÝqÇjkkÓ…^¨1cÆèµ×^ÓÝwß­¹sçêÅ_”.Æ_sÍ5ºòÊ+õÆohÆŒºì²Ë´qãFIÒ_þò=û쳚7ož^yå 8l_R&v†{i¬á¥ è î ª­­Õ¬Y³TQQ¡½÷Þ[S¦LÑ[o½¥%K–(èâ‹/Vyy¹FŒ¡3Î8CóçÏ—$-X°@ãÆ�Ó¸qãäõz5yòd :TÏ<óŒ$iþüùš1c†:è UVVjæÌ™Z³f�Þÿý|~É }ì¸`j?gõ.w—B1èqe󢩶Wóé*º)QUUUºí¶ÛâîÛ°aƒúõ맺º: 6LΘ�V>\ ,�$ÕÕÕiܸqqÏ>|¸V¬X¡¶¶6}úé§>|xt_ee¥ ¤+Vè°ÃÛ£þ†:-ÆoYŠÎ’w8:¿áŽ\17Ñ>˲dY‰ÛÝÝs÷¤ÝtžÙgFÜ:H†!ùý�´¿ÖŽvíÃTíîés³õ½Ùu cÛM§O©ÛÍÎæûüf ‹##Âù”ÔQ€,”1$#"í–æù�Í1\ܽ°·¯ŒÀgÑÛ†#~†»;fM;ÆÐ4c îí3ÜÉ2"¶ÝtúDFÄ·›NŸºãf;#"ùÙμ]2‚ó»+}b =#"ùàp6µKFp~w¥OŒawɈ®*º‚û®V¬X¡'žxB<ð€žþyUUUÅíïÕ«—êëëeš¦êëëU]]·¿ººZŸ~ú©vîÜ)˲îß±cÇ÷ÇãqÉëuÇÝÕÚ�Ãa¨²²¬ÓsÂ\ëÑÃ#§3~–Zk«_�@Hn·Seež¸}Á`H--~IJØncc«,K*+sËåŠ_ßµ­- ¿?(—Ë©òòøvC!SÍ;öv½’âO´¦¦6™¦¥²2—ÜîøSÈç Ȳ$§Ó¡Š oÜ>Ë²ÔØØ&Iª¨ðvúalnö)2ÓCK áv�aK‹_Á`Hn·KeeñíFÆÐ0�aä{“x ýòûCr¹œêÑ#Õvnwwcèóår9T^?†¦iª©)Ünª1ôz]òxâÛõûƒjkK<†±ß›òr�Ž]ÇЧ`ÐL8†�@H­­~ÆîÎowÜäŽó;ñ†ÔÜœêün“eY*+sËíNv~w} #ß›Tc¸»ó;Õv÷Œ°,K>_�Œ #¢Š9#v-ÑûWõ—{çšèm�·‡3NU•^ZÃýµ##š ):Ÿ¾}ÜÈ2B"#" !#xaoFx<®èùMF�dDXwψÈX’adD2"ŒŒÈ<#ºª¨ îo¿ý¶.¾øbÍš5KcÇŽÕóÏ?Ÿðq±ƒ´»õØ3]¯Ýï*ÅÝiÒ4-55µ%}nkûñDý B “?7Q»‘ã¶µó¶<®Ý`0”²O‘ ˆù‹O[[P>_0n_ä¯@¡�™²ÝÈG¢víÃH»�@PÁ`¨ÓþHû©ÚÍl ;ïK5†í¦?†>_°}¦`l»�IÕn$µ›h #íZÖî¾7öŽaä¹mmù|ÉÚÍÎîîüN5†Ý9#œNGôü!#:�aŘÛü Ñû=m.mм|õû%_ÌyÚÖêWäe¤ôÅ´Ñþæ�Œ #âÛ%#"xVÌát: ™ÑvɈdDÑ}3"’±í’Ȉ02‚ŒˆmwO3Âë­Lú˜Ý)Ú‚ûË/¿¬«®ºJ7ÜpƒN?ýtIRMM�¾øâ‹¸ÇÕ×׫W¯^r8Úk¯½T__ßiMMMô1‰ö÷îÝ{�ûûQŒD"ßø®îËV»™õ©ã£R¸Ø^^î�þ5©Ð¾ÖBlw×1´¯OÙj—1̼ÝÂÃ\d„Ãa¨G�ššÚ¢ý,´¯µÛåüμÝl}­ò­Ñ‰ÍÏi‚Ù §ªØt“œ;ÿÜñ\GuüES-K‘Ï…ÚñµZÁ˜à§mívu_&Ï%#2o—ŒÈ¼]Æ0»ífÖ§ðÆçƒí×r~ç·]Æ0»ífÖ'K†Ñ‘»>¶Ð¾ÖBl—ó;óvÃì¶›YŸ²“{ª(¯²õÎ;ïèšk®ÑÿøÇh±]’jkkõñÇ+ó&tÅŠ5jTtÿÊ•+ãÚŠì÷z½:øàƒUWWÝ×ÐРµk×êÐCÍîŠJpÃ¥šxSSCé´Ð‡qÅvI²<Ãl¡æPâ5 3»†»«hçO@É)º‚{0Ôõ×_¯+¯¼RÇ{lܾqãÆ©²²R<ð€Z[[õþûïkáÂ…š>}º$éÌ3ÏÔ믿®%K–ÈçóiáÂ…úâ‹/4yòdIÒôéÓõç?ÿYkÖ¬QSS“~÷»ßé�CÑÈ‘#sþu€Âåñ¯NºÏô •U6RM�pÁ½Âcs±]’B13ÜwY��?E7%ê½÷ÞÓš5k4gÎÍ™3'nßâÅ‹õàƒêÆoÔ¼yóÔ§OÍœ9SãÇ�—$ :T¿ûÝïtÛm·iýúõ2dˆæÎ�«¾}ûJ’Î>ûlmÙ²Eçž{®š››5zôhÝ{ï½¹þ@! n“Ë ¯ë÷‘Ñ[þþ·ëž�í;juÕŽC;}áµ{y³0¿¡µý‚­N—dÝü (Y†•éUBgË–Æ|w!oC^57ûlYï@é P*ŒÖwåY79z{‰c°úï¿@zö–$}´Ý¯ëþU¯Ö`Çy>¢·[wŽ«±­–eɼtšÔÖ*õÛGÎÛ¶­í|!#$C>H†|�J¦Ñ·oÏ´�]t3ÜQ¸LÓRccò«üè¾È” GÓ q·¿0ª5ÔY½ýïõ¾¸b»$í_eÏË-kÓzY/þ�Ô¸3\l—¤>ýli;ßÈÉ�’!¤’ÏŒ à°ÇüÑ­÷Œ½õ7×H�éè(¸ÍŽGÞÏ£AU.}ïàr[ŽlÎDzï�¸ûŒÞ¥Qp€RÁ¢Ÿ°�Ãa¨gÏ29Y¸8€¢F> dXõÜGªÌÕ_Θ5Ô-uÌn?wx¥~zhOÕô°é¢¦Û7Çßöxeó{ÚÎ32@2ä€dÈ©ä3#˜á[¿è$F> 4tÜ-æÝ'no(f5Û_×EÖt{ä¸e®Ô³Z†·Ìæƒä ò@2ä€Tò•Üö�a…¢Û!:²ì ¸ýV6 î‘Ùõ§Œ>ýmn`–”ØcfÌ–¡}]}â÷fu†{¤àÎL.(TÜöXü’2{9+ã÷ÆLqwØýñÅhÁ�—oP¨xÇÛ˜¦¥æfŸÌØé} ò%$梩!ê嬈Û{ŠÛ>=RÌ7Jïå ò@2ä€Tò™¥÷Ž y ™»€n‰|@ièXÃÝ)—* oÜÞØ—rY[ýD/FFH†|� ù •|ewØÆ0$¯×Uªu P*BV0º½·»w§«Þçf ÷Ò{ùFFH†|� ù •|fDé½cCÞ†!¯×Ý©øäJE“ÙÝÞÏݯÓþ¬®á^ÂKÊ�’!$C>H%ŸQzïØ²¤Ål�nïçJTpïØ¶ýu] Ïp€RÁ;6€=´üÑí^®ž�öÇÜ�v¼Ä×p€R@Á`Í@t»§£¢ÓþØ‹¦2úޱÁ6–%AYÖî  {!P*VlÁ½²Óþ¬^4µ„×p'#$C>H†|�J>3•ûC¢TY–¥ÖÖÀî Û!P*Ú¬Ž5Üû¹öê´?«M-áîd€dÈÉ�RÉgF”Þ;6ä•Ãöé|Jù€b²Bj3}ÑÛ^gY§Çdw†{i¯áNFH†|� ù •|ewØÆá0TYYÆ/<��(_·K2cîé|>Ç~\Ñö³½„g¸“’!$C>H%ŸQzïØ²à3ÿF9â.‹êìô˜PÌ6k¸@÷Ã;6€=°.¸5¾àž ðmÅ-)c÷î¡HÃö¶ ° w€=°=Ô´ÛîñMµ¹Ìp€‚Ç;6ØÌÚýCtSäŠÛsMoÉ;…=Á*í±MµýÚ¦%¼†{ ò@2ä€Tò“®¼%É4-54´å» ù€b×h¶J’Œ¸%eÍpïØ¶s†»eY3ÜK°àNFH†|� ù •|fDé½c°ÙÖ`ƒ$É7C"Áî)÷fÀ2;¶mŸ:° wØÆá0TQᕃ‹¹Øù€b·-Ô(I»¬áÞùeTd wC’agaH†|�J>3¢ôÞ±!¯œNN)‰‘(f[Û î‘%e, gšGêâö_05v†{iþ,‘’!$C>H%_A2ìÆ¶Ð®KÊ$Z¿ÝR[°}†{¶.˜*•ä w(\4`7Ö¶jLh�†YÛÂwìrÁÔ%ëZõÛå ÑÛNÛg¸Ç^¬•�M@¡¢à�‚تiõw¨ÖÜÐq_ÙáÑígÖ´èÁ÷ãžsH�ÇÞN˜¥¿¤ ” î°�iZjiñËŒ½°ˆ|@‘ n•{ý¹røVªv—]�þwȲ,ýá�ýï—mqûÆîãÕyµ•¶uÃÚ¼Aæ¼ßvÜQ‚KÊ�’!$C>H%ŸAÁ¶ Cùî€E> Xþ5rmø¹¾÷î÷´R!£J?^¼U[[͸}÷�P£ªÝ¶ôÃÚ±Uæc”V¾ß¿ ûŠù…„Œ� ù ò@*ùÊ î°�aHn·K�@0n©Y P,ͯȽþ‡ ÷Ýæ:Výz_¨8«uÛõ�ŠíOMî§2Wæë«[«Þ—yß-RKSÂýÆLËø…†Œ� ù ò@*ùÌ î°�a*+s+ Éâ·€äŠB¨!a±}eÏé2¿¡�áÐŽ ½²¶U¯í‹î÷:¥ù§ö“'ƒ+¥ZM ²þý’¬'•,3ácŒï_,cÜwe¸Jïå ò@2ä€Tò™¥÷Ž  «ÌVy׌ˆ»+0à™=OÕ;—(xE’´ü“~ZþeCô1.‡ô·Éýä0Ò+¶[Û6Ëü˃Ò{o$~€Û#ã‡?“ñ­ñ2δŽÈ î {³Bò~:4î®`¯ódör\t�ŒƒG$Þ(HÜ@÷e¶Èûé°¸»‚½~¢P¿£·?Þá—gå�žúÈI½5 "½—R–e%,¶'Ÿ!ã?¾'£²*­vùEÁ¶â á’!Pp‚[äýìð¸»BÕ?ˆ+¶Ï[Q¯«'Æ=¦§ÇÐc'õQ¹Û‘Öa­­›d^ýã¸ûŒ³/�1î?dxË’<«ô‘’!$C>H%_aX\YÂV[¶4æ» `w¬€¼«Œ»+Tñ>&IÚé3uÞ [ÕŒ™4ù ºðО2Ò]FfÕ{2ïüeÜ}Æw§ÉqÆyiµ°_ß¾=Ó~.3Üa+Ã�ø€DÈçÖÛân‡ª¤`ÿ9’$Ó²4ýï[:=gòÑëtѾG¦}Lsñßd=ùHü�GK±½ ò@2ä€Tò•Üa‡ÃPee™ššÚdšüÆÐ�|@!qn¿O®Eo‡zž-¶ohêü¶Å=Þ,߬à7žÒQ½�Öñ¬€_æ K›7ÄÝoœ?KŽcNH«ÍRCFH†|� ù •|fwÐ=X¦\¯�³ñ鸻ƒýï”eYzö³V=ø~üÒpfåz‡-’ i¸w¿®ró™³Ïït¿ãöGdôÐåö…�‚;(}–%Ïß–Xw·ï€ÿSÀòê’—¶i}SüuFíÛ¦å{/’$}Ó{€z8<];dC}çb»aÈqÏ|å•]ÿÏ‘ïdU¨QžÕƒ:Û|[Ï®í¥ÓmîTl¿~LµZ½½=©çÑ{|8˲d.{EæçÄÝoŒ=AއŸ£Ø%Œî 4Y–Ú&Ïãe¨c;�smÞg©^ýÂÔ¼â—�)wzä¤>ªòúÕºŽý wß=;äÎí2¯œ!…‚q÷ã¾+Ç�~–þ×( ÜaÓ´ÔÐКïn(@ärÎ ÉýÕ™r´¾w÷›�cuí—”ÞßÙé)?Q©³†UH’Þjý4nßþ®>©gYÒÛÿ–yÿ­�ö§}_ÆÉgvõ+èVÈÉ�’!¤’ÏŒ àJŽÑö^§bûG­‡ëÚ/ÿ3áãÿrríUæŒÞþGÓÛÑíÓ*�–aI�eµµÊ¼j†Ô?[^ýö‘cöoeôªéú(JÜa‡ÃPY™[mm™¦µû'è6Èäšáÿ$ºmzk(­«?ü¡$©ÊchxïðP+݆¦RWlY!½ÚúaôöäžG%<†eY²þú�¬ÿýŸÎÇÿÁ%rª_J·@FH†|� ù •|fwØbõ޵eÝݪÒ6åâN>ÏÐn¹ù�4Jì8¹”»¯)wc—«ó{OÆÎޝ:wçw.•ÖÏlçãte4 3Wúº6«_û«œëמ«÷ZŽ�Ï /cU¯Ó¶ß“$m“t{“¤¦Žç~Ø×Öþ®Îë·[¡�Ì_]"mX¿£ª—¿¼KF¿6}%݇Ëå”Èw7 ò@2ä€Tò•Üa‹�_ݧï”-Îw7èdõŽQò{Eoïð¬Ó6ßÚäOˆ1µç˜ÄËɼóz§b;³ÚÜa‹PÅX5û^R…³%ß]@’²œzvûTmv\ðÔ*Û!³÷Ç{ôü�®}¯ç·î³¾Œ¿¨ªãþ¿É(ë‘~g%�‚û.Ö¯_¯_ÿú×zÿý÷U^^®“O>Y³fÍ’ÃáÈw× Úø¿¯–ÀijuûÔÚâËÍÚH†‘ò"v6(æÿÙ=NÇ—“í£)neóH’‘•£ –�¯+Õù`ß­Ýœwö~m‰Ç¯coæGs8 UT”©¹9œ©ZÌøÇÚH¸¹ûgù`™©ë?³é}ßÒˆô¾¶t`»v´ §Nˆ¹íPÆU{ô\‡’ÿž±¾î˜ÝîøícÛ’(¸wò³ŸýL#FŒÐK/½¤mÛ¶é /TŸ>}ôãÿ8ß]+xžJ¹ÝÕ !Y…¹¤/€<1 É-§7ù€Òðuû’4¯TÓy�wt�eYjkóË" ì‚|� ù •|fÓ¶c¬X±B}ô‘®¼òJõìÙSƒÖŒ34þü|w­(X–ä÷SlÐù€RbµµJ[6„o $ƒOÁeŒŒ� ù ò@*ùÌf¸Ç¨««ÓÀ�U]]½oĈúüóÏÕÔÔ¤ÊÊÊ<ö®°Y¾6iù«r4ì�iZüÂÇ0ÂËÊ�( ;9‘�ýÌsgJƒaH.—SÁ ošÄ#$C>H%ŸAÁ=F}}½ªªªâî‹ßwìØ±GwÃP§õ^-KÑ�/8�ׂ�¬wžhŸe…‹S‰ÚÝÝs÷¤ÝtžÙgkއž_ ó™ÿ–ÙéÑ Yù€’d :(ú»2“ß÷¿[»çë‡ÃP�57·)*¬1LÕîž>7[ß›Ø1ܵÝtú”ºÝÒ<¿ÃÂψH>´´ø ™6´KFp~w¥OŒa!g„ÓÙ‘á‰=v´KFp~w¥OŒawɈ®¢à¾‹L×õñx\òzÝq÷Aµ¶äpª¬,ëôœ††VIR�9�ñKomõ+Éívª¬Ì·/ ©¥Å/I Ûmll•eIeen¹\θ}mmùýA¹\N•—Ç· ™jnöµ·ëÕ®¨kjj“iZ*+sÉíŸBm}ú¨5áˆP¢ÜnU~ëX9ÛûýAµµät:TQá�{¨eYjll“$•—{:]Œ½¥Å§`Ð춯# Cr:òx\jmÝýVTx;½¨onãº>†–Âí&Ö¿‚Á�Ün—ÊÊâÛ�Œ¡a$ÃÈ÷&ñúå÷‡är9Õ£Gª1ìÜn¢1Œðùòù‚r¹*/�CÓ4ÕÔn7Õz½.y<ñíFÎïDc¸§çw¢1 BjmõË0vw~»åtÆ�aäüN<†!57§:¿ÛdY–ÊÊÜr»“�ß]ÃÈ÷&Õ’]ˈH>TTxÕÖ>¿É2"‚Œë®áñ¸¢ãeYç7AFD�adDæÑU†ÅÕ%¢ž|òI=øàƒzùå—£÷½ÿþû:묳ôöÛo«¢¢b·mlÝÚØ­þZ×¥µkäii_�À´d$:nä¹)ö)É_ܢ߷±Ý=}nÂ}–ž¶›A»Jò×PEv§ýµ&þkh6Æ0£vÃÌÛµa S¶›ÎsŒ¡aòzÝòùü2C6†dD{»*Éó;›cèH…Œ� ù ò@*ùÌ î°�aHn·Kü®°+ò@*d€dÈÉ�RÉgFPpÀܰwl`X–Å%�È3ܰwl@ÁPpÀܰwl@ÁPpÀܰwdlýúõºà‚ 4zôhM˜0AwÞy§LÓÌw·äÉk¯½¦±cÇjæÌ™�öýãÿФI“ôÍo~SS§NÕ¿þõ¯<ô@>­_¿^—^z©F�­±cÇjöìÙjhh�$­ZµJ?øÁtÄGhâĉzôÑGóÜ[¹ôÑGéG?ú‘Ž8â�;VW\q…¶lÙ"IZ¶l™¦M›¦Ã?\§œrŠžyæ™<÷@¾Üzë­6lXô6ù`ذaª­­ÕÈ‘#£ÿÝ|óÍ’ò“Ü‘±Ÿýìgêß¿¿^zé%=öØcz饗ô_ÿõ_ùX¼x±V¬Xýï†nÈ[FPpGFV¬X¡�>úHW^y¥zöì©ÁƒkÆŒš?~¾» ¼^¯.\˜°à¾`Á�7NãÆ�“×ëÕäÉ“5tèPf ÝHCCƒjkk5kÖ,UTThï½÷Ö”)SôÖ[oiÉ’% ºøâ‹U^^®#FèŒ3Îà5ÐM´¶¶jæÌ™ºð åñxTSS£O«ÁƒkÚ´iòz½;v¬Ž?þx-X° ßÝ�C¦iêÆoÔŒ3¢÷‘RÉWFPpGFêêê4pà@UWWGï1b„>ÿüs555å±gòá‡?ü¡zöì™p_]]�†wßðáÙ}t#UUUºí¶ÛÔ§OŸè}6lP¿~ýTWW§aÆÉétF÷ >\+W®ÌGWäXuuµÎ8ã ¹\.IÒgŸ}¦§Ÿ~Zßýîw“¾† €îå¯ý«¼^¯&Mš½�|q×]wiüøñ:òÈ#uà 7¨¹¹9oAÁ©¯¯WUUUÜ}‘âûŽ;òÑ%ª¾¾>î�sR8/È  ûZ±b…žxâ ]|ñÅ _SôêÕKõõõ\èFÖ¯_¯ÚÚZ�|òÉ9r¤.¿üò¤ùÀk ûغu«î¹çÝxã�q÷“$é°ÃÓØ±cõâ‹/jþüùzï½÷ôë_ÿ:oAÁ³,+ß]P$È o¿ý¶Î?ÿ|Íš5KcÇŽMú8Ã0rØ+ù6pà@­X±B‹/Ö_|¡«¯¾:ß]Pn»í6M�:UC† ÉwW ùóçëŒ3Î�ÇãÑA¤+¯¼RÏ=÷œ�@^úCÁ©©©Q}}}Ü}õõõ2 C555ù适´×^{%Ì ²è~^~ùe]pÁúå/©þð‡’¯)v�iR__¯^½zÉáà%+Ð�†¡ÁƒkæÌ™zî¹çär¹:½†Ø±c¯!€nbÙ²ez÷Ýwu饗vÚ—è=ù`ß}÷U(’ÃáÈKFðî©­­Õ† ´}ûöè}+V¬Ð�!CTQQ‘Çž(4µµµ�ÖI[±b…F�•§ȇwÞyG×\s�þøÇ?êôÓO�Þ_[[«�?þXÁ`0ztË–-ÓI'�·„Tä�m‡zh§×+W®$€nâ™gžÑ¶mÛ4aÂ�=ZS§N•$�=ZC‡%€nîÃ?Ôí·ßwßš5käñx4nܸ¼dwddøðá9r¤îºë.555iÍš5zì±Ç4}úô|w @�9óÌ3õúë¯kÉ’%òù|Z¸p¡¾øâ Mž<9ß]�#Á`P×_½®¼òJ{ì±qûÆ�§ÊÊJ=ðÀjmmÕû￯… òšè&jkkÕÔÔ¤;ï¼S­­­Ú¾}»î¹çy䑚>}ºÖ¯_¯ ÈçóiéÒ¥Zºt©Î<óÌ|w@Ìž=[/¼ð‚-Z¤E‹iÞ¼y’¤E‹iÒ¤IäÐÍõîÝ[óçÏ×¼yóä÷ûõùçŸë�ü£Î:ë,�vÚiyÉÃbA]dhãÆ�ºá†ôæ›oª²²RgŸ}¶.»ì2Ö\º¡‘#GJRt†ªËå’ž¥*I/¾ø¢îºë.­_¿^C† Ñu×]§£Ž:*?��so½õ–¾ÿýïËãñtÚ·xñb577ëÆoÔÊ•+Õ§Oýô§?Õ9眓‡žȇ�?þXsæÌÑ| òòr�3F³gÏVÿþýµ|ùrÍ™3GkÖ¬ÑÀ�5kÖ,Mœ81ß]�_}õ•N8á}üñÇ’D>ÐòåËu×]wéã�?–ÇãÑ”)S4sæLy½Þ¼dwlÀ’2Ø€‚;6 à€ (¸` îØ€‚;6 à€ (¸` î@š={¶† –ò¿sÏ=WO=õ”† ¦5kÖ䵿Ï=÷œŽ<òH}ùå—»}ìå—_®3f( æ g€} ˲¬|w@×466ª­­-zûÆoT]]�.\½Ïív«¬¬L���ª©©‘ÓéÌGWõÑG鬳ÎÒ�wÞ©‰'îöñMMMš2eŠŽ?þx]{íµ9è!`W¾; ëzö쩞={Fo{½^9�NõíÛ·ÓcËÊÊrÙµNæÌ™£Q£FíQ±]’*++5sæLÍš5KÓ¦MÓÁœåö`I „íº¤ÌìÙ³uê©§jéÒ¥:ùä“5räH�~úéZµj•–-[¦ÓN;M£F�Ò÷¾÷=}ôÑGqm-Z´Hgœq†?üp}ôÑš9s¦6mÚ”òøo¼ñ†–/_®K.¹$zŸeYzðÁuÒI'éÐCÕ˜1ctÙe—iݺuÑÇ|÷»ßÕ Aƒtß}÷Ù8@vQpº™;vèñÇ×]wÝ¥'žxBÛ·o×ÕW_­ûï¿_sæÌÑã�?®-[¶è–[n‰>gÑ¢Eºúê«uØa‡é©§žÒý÷߯Ï>ûL3fÌ�ßïOz¬ÿýßÿUUU•Ž:ê¨è} .ÔܹsuÕUWiñâÅš7ožtá…Fc†&L˜ ¥K—¦l($Ü€nfëÖ­ºîºëtÈ!‡hÔ¨Q:ñÄõÉ'ŸèŠ+®ÐÈ‘#u衇êÄOÔªU«¢ÏyðÁuÔQGéºë®ÓàÁƒuä‘GêöÛo×gŸ}¦^x!é±Þ|óM}ó›ßŒ[?¾®®N Ðw¾óí³Ï>:ôÐCõ‡?üA¿ýíoešfôqGy¤ZZZTWW—��lFÁèfÊËËuÀDoWWWK’9ä�¸û%…/búÙgŸé˜cމkç�CQ¯^½ôá‡&=Ö–-[:­+?aÂ}ñÅš1c†ž~úimذA555ª­­•ÃÑñ%ò¼-[¶¤ù•¹EÁèfÊËËãn†ÑéþÈ}R¸à.I÷ÝwŸ¾ùÍoÆý·sçNmÞ¼9é±ã.î*IãÆ�ÓŸÿügUUUé–[nÑøñãuæ™gêí·ßŽ{\UU•$©¡¡!�¯È=W¾; °E æ3fÌÐgœÑiÿ®ü]Ÿ™)ëÈ#�Ô‘G©`0¨·ß~[÷Þ{¯~úÓŸjÉ’%� í‘Û@¡£à ¥ŠŠ :TŸþ¹ ·oõêÕÚo¿ý’>·oß¾�fÀ¿öÚk0`€† "—˥ѣG«gÏžš2eŠÖ­[§#FHêXJf×%i€BÅ’2vë /Ô?ÿùOÝsÏ=Z³f�>ýôSÝqÇš2eJÊ5Ü�>úh½ûî» …BÑûžzê)]zé¥ú׿þ¥¯¿þZŸ|ò‰{ì1õîÝ[tPôqË—/Wyyy´:f¸Ø­SO=U‡C=ô�æÎ�+—Ë¥‘#Gêá‡VmmmÒç}ç;ßÑO<¡åË—k̘1’¤›o¾Y¿ûÝïtÝu×iÛ¶mªªªÒ¨Q£ôè£�ª¬¬L’dY––,Y¢qãÆÉãñääk2eX–eå»J×9çœ#�Ç£?ýéO{üœçŸ^¿øÅ/´hÑ" :4{�lÄ’2²êúë¯×;ï¼£—^zi�ßÔÔ¤»ï¾[?øÁ(¶ ¨0Ã@Ö=ûì³úÍo~£¿ýíoÚÿýS>öòË/×Î�;õÈ#�ÈåbL îØ€%e°wl@ÁPpÀܰwl@ÁPpÀܰwl@ÁPpÀܰwlðÿºy��†%=IEND®B`‚accelerate-1.14.0/benchmarks/fsdp2/main.py000066400000000000000000000072111521253476100203250ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import functools from typing import Callable import torch from accelerate import Accelerator from utils import parse_args, prepare_accelerate, prepare_torch MODEL_NAME = "Qwen/Qwen2.5-1.5B-Instruct" LEARNING_RATE = 3e-5 CONFIG = { "model_name": MODEL_NAME, "learning_rate": LEARNING_RATE, } def train( model: torch.nn.Module, optimizer: torch.optim.Optimizer, train_dataloader: torch.utils.data.DataLoader, accelerator: Accelerator, ) -> torch.Tensor: losses = [] for batch in train_dataloader: optimizer.zero_grad() outputs = model(**batch, use_cache=False) loss = outputs.loss losses.append(loss.item()) accelerator.backward(loss) optimizer.step() return torch.tensor(losses) def evaluate(args, config: dict, init_fn: Callable, run_name: str) -> torch.Tensor: model, optimizer, dataloader, accelerator, memory_tracker = init_fn(args, config) loss = train(model, optimizer, dataloader, accelerator) memory_tracker.stop() msg = f"""Results for {run_name} (rank 0): Loss: {loss[-1].item()} Peak Allocated Memory: {float(memory_tracker.peak_allocated_memory):.2f} MB Peak Reserved Memory: {float(memory_tracker.peak_reserved_memory):.2f} MB {"-" * 34}""" accelerator.print(msg) return loss def main(): args = parse_args() evaluations = [ functools.partial( evaluate, init_fn=functools.partial(prepare_torch, post_shard_optimizer=False, apply_optimizer_fix=True), run_name="Optimizer Before FSDP (w/ fix)", ), functools.partial( evaluate, init_fn=functools.partial(prepare_torch, post_shard_optimizer=False, apply_optimizer_fix=False), run_name="Optimizer Before FSDP (w/o fix)", ), functools.partial( evaluate, init_fn=functools.partial(prepare_torch, post_shard_optimizer=True), run_name="Optimizer After FSDP", ), functools.partial(evaluate, init_fn=prepare_accelerate, run_name="Accelerate"), ] labels = [ "Optimizer Before FSDP (w/ fix)", "Optimizer Before FSDP (w/o fix)", "Optimizer After FSDP", "Accelerate", ] results = {} torch.use_deterministic_algorithms(True) for evaluation, label in zip(evaluations, labels): results[label] = evaluation(args, CONFIG) torch.testing.assert_close( results["Optimizer After FSDP"], results["Optimizer Before FSDP (w/ fix)"], msg="Optimizer After FSDP and Optimizer Before FSDP (w/ fix) should be the same", ) torch.testing.assert_close( results["Optimizer After FSDP"], results["Accelerate"], msg="Optimizer After FSDP and Accelerate should be the same", ) torch.testing.assert_close( results["Accelerate"], results["Optimizer Before FSDP (w/ fix)"], msg="Accelerate and Optimizer Before FSDP (w/ fix) should be the same", ) torch.distributed.destroy_process_group() if __name__ == "__main__": main() accelerate-1.14.0/benchmarks/fsdp2/measure_utils.py000066400000000000000000000110171521253476100222610ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import gc import json import os import threading import time import psutil import torch from accelerate import PartialState class MemoryTracker: def __init__( self, device: torch.device, output_directory: str, run_name: str, save_memory_snapshot: bool, log_interval: float = 0.01, ): """Class for tracking gpu and cpu memory usage of the process. Args: device (`torch.device`): PyTorch device to monitor. output_directory (`str`): Directory to save the memory usage data to, will be created if it doesn't exist. run_name (`str`): Name of the run, will be used to name the output files. save_memory_snapshot (`bool`): Whether to also save `torch.cuda.memory._dump_snapshot` to the output directory. log_interval (`float`, *optional*): Interval in seconds between memory measurements. Defaults to 0.01. """ self.log_interval = log_interval self.save_memory_snapshot = save_memory_snapshot self.output_directory = output_directory self.run_name = run_name self.timestamps = [] self.allocated_memory = [] self.reserved_memory = [] self.virtual_memory = [] self.start_time = None self.running = False self._thread = None self._state = PartialState() self._process = psutil.Process() self._device = device self.torch_accelerator_module = getattr(torch, device.type, torch.cuda) def _monitor(self): self.start_time = time.time() while self.running: allocated = self.torch_accelerator_module.memory_allocated(self._device) / (1024 * 1024) reserved = self.torch_accelerator_module.memory_reserved(self._device) / (1024 * 1024) virtual_memory = self._process.memory_info().rss / (1024 * 1024) self.allocated_memory.append(allocated) self.reserved_memory.append(reserved) self.virtual_memory.append(virtual_memory) self.timestamps.append(time.time() - self.start_time) time.sleep(self.log_interval) def start(self): gc.collect() self.torch_accelerator_module.empty_cache() if self.output_directory: os.makedirs(self.output_directory, exist_ok=True) if self.save_memory_snapshot: self.torch_accelerator_module.memory._record_memory_history() self.running = True self._thread = threading.Thread(target=self._monitor) self._thread.daemon = True self._thread.start() def stop(self): self.running = False if self._thread: self._thread.join() if self.save_memory_snapshot and self._state.is_main_process and self.output_directory: output_file = os.path.join(self.output_directory, f"{self.run_name}_memory_snapshot.pkl") self.torch_accelerator_module.memory._dump_snapshot(output_file) if self._state.is_main_process and self.output_directory: path = os.path.join(self.output_directory, f"{self.run_name}_memory_usage.json") with open(path, "w") as f: json.dump( { "timestamps": self.timestamps, "allocated_memory": self.allocated_memory, "reserved_memory": self.reserved_memory, "virtual_memory": self.virtual_memory, }, f, ) if self.save_memory_snapshot: self.torch_accelerator_module.memory._record_memory_history(False) self.torch_accelerator_module.empty_cache() @property def peak_allocated_memory(self): return max(self.allocated_memory) @property def peak_reserved_memory(self): return max(self.reserved_memory) accelerate-1.14.0/benchmarks/fsdp2/utils.py000066400000000000000000000272141521253476100205460ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse from types import MethodType from typing import Union import torch from datasets import load_dataset from measure_utils import MemoryTracker from torch.distributed.fsdp import MixedPrecisionPolicy, fully_shard from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoConfig, AutoModelForCausalLM, AutoTokenizer, DataCollatorForLanguageModeling from transformers.models.qwen2.modeling_qwen2 import Qwen2DecoderLayer from accelerate import Accelerator, FullyShardedDataParallelPlugin from accelerate.state import AcceleratorState, is_initialized from accelerate.utils import convert_outputs_to_fp32, set_seed SEED = 421 def get_named_parameters(model: torch.nn.Module, drop_refs: bool = False) -> dict[str, Union[torch.Tensor, int]]: """ This function returns a dictionary mapping the parameter names to their data pointers or the original parameters if `drop_refs` is `False`. It is used to get the original parameter names before `fully_shard` is applied. We only return the data pointers, so we drop the references to the original parameters and `fully_shard` will then trigger a new allocation for the sharded ones. Args: model (`torch.nn.Module`): Model instance to get the named parameters from drop_refs (`bool`, *optional*, defaults to `False`): Whether to drop the references to the original parameters Returns: `dict[str, Union[torch.Tensor, int]]`: Dictionary mapping the parameter names to their data pointers or the original parameters if `drop_refs` is `False` """ named_parameters = {} for n, p in model.named_parameters(): # We only preserve the data pointers to have the unique 1:1 mapping between the original and the sharded parameters named_parameters[n] = p.data_ptr() if drop_refs else p return named_parameters def replace_optimizer_params(optimizer: torch.optim.Optimizer): """ This function is called before using `fully_shard` on the model. It replaces the parameters of the optimizer with empty tensors, so `fully_shard` can trigger a new allocation for the sharded ones. After this, we swap the parameters `data_ptr` to the original one, so we can reuse that later to map the sharded parameters to the original ones. This function modifies the optimizer in-place. Args: optimizer (torch.optim.Optimizer): Optimizer instance which contains the original model parameters """ for param_group in optimizer.param_groups: for i, p in enumerate(param_group["params"]): # We drop a reference to the original param here, so that _move_states_to_device triggers a reallocation # This is required or else the `fully_shard` -> `_move_states_to_device` uses the original memory address # for the sharded parameters, and we get a weird/undefined behavior. param_group["params"][i] = torch.empty_like(p) # We save the original data_ptr, so we can swap back the parameters later param_group["params"][i].data_ptr = p.data_ptr() def swap_back_optimizer_params( model: torch.nn.Module, optimizer: torch.optim.Optimizer, old_named_parameter_pointers: dict[str, int] ): """ This function is the counterpart of `replace_optimizer_params`. It is called after `fully_shard` being applied to the model. It swaps the parameters of the optimizer to their sharded counterparts. It is done using the `data_ptr` mapping prepared in `replace_optimizer_params` and `get_named_parameters`. Args: model (`torch.nn.Module`): Model instance to get the new named parameters from optimizer (`torch.optim.Optimizer`): Optimizer instance to swap the parameters of old_named_parameter_pointers (`dict[str, int]`): Dictionary mapping the original parameter names: data_ptrs to the new ones """ # We get the new named parameters after `fully_shard` being applied # We don't drop the references as we need the sharded parameters now new_named_parameters = get_named_parameters(model, drop_refs=False) # We create a mapping from the original data_ptr to the new sharded param corresponding to it mapping = {p: new_named_parameters[n] for n, p in old_named_parameter_pointers.items()} for param_group in optimizer.param_groups: # We swap the parameters of the optimizer to the new sharded ones param_group["params"] = [mapping[p.data_ptr] for p in param_group["params"]] def parse_args(): parser = argparse.ArgumentParser() parser.add_argument( "--output_dir", type=str, help="Directory to save the benchmarking results.", ) parser.add_argument( "--save_memory_snapshot", action="store_true", default=False, help="If True, `torch.cuda.memory._dump_snapshot` will be used to additionally save the memory trace.", ) ###################### # Training arguments # ###################### parser.add_argument( "--batch_size", type=int, default=2, help="Batch size for the training loop.", ) parser.add_argument( "--block_size", type=int, default=128, help="The maximum sequence length to use with the model.", ) parser.add_argument( "--dataset_fraction", type=float, default=1.0, help="Fraction of the dataset to use.", ) return parser.parse_args() def prepare_dataloader(tokenizer, args, accelerator: Accelerator) -> DataLoader: dataset = load_dataset("tiny_shakespeare", split="train", trust_remote_code=True) def tokenize_function(example): return tokenizer( example["text"], ) dataset = dataset.map( tokenize_function, batched=True, remove_columns=["text"], ) block_size = min(tokenizer.model_max_length, args.block_size) def group_texts(examples): concatenated_examples = {k: sum(examples[k], []) for k in examples.keys()} total_length = len(concatenated_examples[list(examples.keys())[0]]) total_length = (total_length // block_size) * block_size result = { k: [t[i : i + block_size] for i in range(0, total_length, block_size)] for k, t in concatenated_examples.items() } result["labels"] = result["input_ids"].copy() return result dataset = dataset.map(group_texts, batched=True) dataset = dataset.select(range(int(len(dataset) * args.dataset_fraction))) def collate_fn(examples): return DataCollatorForLanguageModeling( tokenizer=tokenizer, mlm=False, )(examples) dataloader = DataLoader( dataset, batch_size=args.batch_size, collate_fn=collate_fn, ) dataloader = accelerator.prepare(dataloader) return dataloader def get_model(model_name: str): # We require model to be loaded in fp32, otherwise benchmarks don't match as accelerate does upcasting of parameters to fp32 config = AutoConfig.from_pretrained(model_name, trust_remote_code=True, torch_dtype=torch.float32) model = AutoModelForCausalLM.from_config(config) return model def get_tokenizer(model_name: str): tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) tokenizer.pad_token = tokenizer.eos_token return tokenizer def prepare_torch( args, config: dict, post_shard_optimizer: bool = False, apply_optimizer_fix: bool = False ) -> tuple[torch.nn.Module, torch.optim.Optimizer, torch.utils.data.DataLoader, Accelerator]: mp_policy = MixedPrecisionPolicy( param_dtype=torch.bfloat16, reduce_dtype=torch.bfloat16, output_dtype=torch.bfloat16, ) accelerator = Accelerator(mixed_precision="bf16") set_seed(SEED) is_fixed = "fixed" if apply_optimizer_fix else "not_fixed" is_post_shard = "optimizer_after_fsdp" if post_shard_optimizer else "optimizer_before_fsdp" run_name = f"torch_{is_post_shard}" if post_shard_optimizer else f"torch_{is_post_shard}_{is_fixed}" tokenizer = get_tokenizer(config["model_name"]) train_dataloader = prepare_dataloader(tokenizer, args, accelerator) memory_tracker = MemoryTracker(accelerator.device, args.output_dir, run_name, args.save_memory_snapshot) memory_tracker.start() model = get_model(config["model_name"]) optimizer = None if not post_shard_optimizer: optimizer = AdamW(model.parameters(), lr=config["learning_rate"]) if apply_optimizer_fix: # We drop the references to the original parameters, so that `fully_shard` can trigger a new allocation # Then we get the `module_name: data_ptr` mapping, so we can swap back the parameters later old_named_parameters = get_named_parameters(model, drop_refs=True) # We replace the parameters of the optimizer with empty tensors, so that `fully_shard` can trigger a new allocation # We also change the `data_ptr` of the parameters to the original ones, so we can swap back the parameters later replace_optimizer_params(optimizer) for module in model.modules(): if isinstance(module, Qwen2DecoderLayer): fully_shard(module, mp_policy=mp_policy) fully_shard(model, mp_policy=mp_policy) # We do this to imitate how accelerate forces outputs to be in fp32 via `convert_outputs_to_fp32` autocast_context = torch.autocast(device_type=accelerator.state.device.type, dtype=torch.bfloat16) model_forward_func = model.forward.__func__ new_forward = autocast_context(model_forward_func) model.forward = MethodType(new_forward, model) model.forward = MethodType(convert_outputs_to_fp32(model.forward.__func__), model) if post_shard_optimizer: optimizer = AdamW(model.parameters(), lr=config["learning_rate"]) if not post_shard_optimizer and apply_optimizer_fix: # We swap back the parameters of the optimizer to the original ones swap_back_optimizer_params(model, optimizer, old_named_parameters) return model, optimizer, train_dataloader, accelerator, memory_tracker def prepare_accelerate( args, config: dict ) -> tuple[torch.nn.Module, torch.optim.Optimizer, torch.utils.data.DataLoader, Accelerator]: if is_initialized(): AcceleratorState()._reset_state(True) fsdp_plugin = FullyShardedDataParallelPlugin( fsdp_version=2, auto_wrap_policy="transformer_based_wrap", transformer_cls_names_to_wrap=["Qwen2DecoderLayer"], ) accelerator = Accelerator( fsdp_plugin=fsdp_plugin, mixed_precision="bf16", ) set_seed(SEED) tokenizer = get_tokenizer(config["model_name"]) train_dataloader = prepare_dataloader(tokenizer, args, accelerator) memory_tracker = MemoryTracker(accelerator.device, args.output_dir, "accelerate", args.save_memory_snapshot) memory_tracker.start() model = get_model(config["model_name"]) optimizer = AdamW(model.parameters(), lr=config["learning_rate"]) model, optimizer = accelerator.prepare(model, optimizer) return model, optimizer, train_dataloader, accelerator, memory_tracker accelerate-1.14.0/benchmarks/fsdp2/visualize.py000066400000000000000000000104521521253476100214150ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import json import matplotlib.pyplot as plt def parse_args(): parser = argparse.ArgumentParser() parser.add_argument("--dir", type=str, help="Directory containing the memory usage data") parser.add_argument( "--memory_threshold", type=int, default=0, help="Memory threshold to filter data that is below this value (only filters 1st `--filter_partition` of the points which should roughly correspond to the model loading)", ) parser.add_argument( "--filter_partition", type=float, default=1 / 3, help="Partition to drop data from that are below the memory threshold", ) return parser.parse_args() def filter_data(data, memory_threshold, filter_partition, key): timestamps = data["timestamps"] memory = data[key] mid_point = int(len(timestamps) * filter_partition) filtered_times = [] filtered_memory = [] for i, (t, m) in enumerate(zip(timestamps, memory)): if i < mid_point and m < memory_threshold: continue filtered_times.append(t) filtered_memory.append(m) return filtered_times, filtered_memory def compare_memory_usage(data, labels, memory_threshold, filter_partition): plt.style.use("seaborn-v0_8") colors = ["#2ecc71", "#e74c3c", "#3498db", "#f1c40f"] fig1, ax1 = plt.subplots(figsize=(15, 5)) for data_item, label, color in zip(data, labels, colors): timestamps, allocated = filter_data(data_item, memory_threshold, filter_partition, "allocated_memory") ax1.plot(timestamps, allocated, label=label, color=color, linewidth=2) ax1.set_xlabel("Time (s)", fontsize=12) ax1.set_ylabel("Allocated Memory (GB)", fontsize=12) ax1.set_title("Allocated Memory Usage Over Time", fontsize=14, pad=15) ax1.grid(True, linestyle="--", alpha=0.7) ax1.legend(frameon=True, fancybox=True, shadow=True, fontsize=10) ax1.spines["top"].set_visible(False) ax1.spines["right"].set_visible(False) plt.tight_layout() fig2, ax2 = plt.subplots(figsize=(15, 5)) for data_item, label, color in zip(data, labels, colors): timestamps, reserved = filter_data(data_item, memory_threshold, filter_partition, "reserved_memory") ax2.plot(timestamps, reserved, label=label, color=color, linewidth=2) ax2.set_xlabel("Time (s)", fontsize=12) ax2.set_ylabel("Reserved Memory (GB)", fontsize=12) ax2.set_title("Reserved Memory Usage Over Time", fontsize=14, pad=15) ax2.grid(True, linestyle="--", alpha=0.7) ax2.legend(frameon=True, fancybox=True, shadow=True, fontsize=10) ax2.spines["top"].set_visible(False) ax2.spines["right"].set_visible(False) plt.tight_layout() return fig1, fig2 if __name__ == "__main__": args = parse_args() DIR = args.dir with open(f"{DIR}/torch_optimizer_before_fsdp_not_fixed_memory_usage.json") as f: optimizer_before_fsdp_not_fixed = json.load(f) with open(f"{DIR}/torch_optimizer_after_fsdp_memory_usage.json") as f: optimizer_after_fsdp = json.load(f) with open(f"{DIR}/torch_optimizer_before_fsdp_fixed_memory_usage.json") as f: optimizer_before_fsdp_fixed = json.load(f) with open(f"{DIR}/accelerate_memory_usage.json") as f: accelerate = json.load(f) data = [optimizer_before_fsdp_not_fixed, optimizer_before_fsdp_fixed, optimizer_after_fsdp, accelerate] labels = [ "Optimizer Before FSDP (w/o fix)", "Optimizer Before FSDP (w/ fix)", "Optimizer After FSDP", "Accelerate", ] fig1, fig2 = compare_memory_usage(data, labels, args.memory_threshold, args.filter_partition) fig1.savefig(f"{DIR}/allocated_memory.png") fig2.savefig(f"{DIR}/reserved_memory.png") accelerate-1.14.0/benchmarks/torch.compile/000077500000000000000000000000001521253476100205565ustar00rootroot00000000000000accelerate-1.14.0/benchmarks/torch.compile/README.md000066400000000000000000000150201521253476100220330ustar00rootroot00000000000000# Regional Compilation Benchmark This benchmark compares different compilation strategies using PyTorch's `torch.compile` and Accelerate's `compile_regions` utility, which is based on the recipe in [PyTorch documentation](https://pytorch.org/tutorials/recipes/regional_compilation.html). ## Overview The benchmark evaluates three approaches: - **Baseline**: No compilation, standard PyTorch eager execution. - **Full compilation**: Using PyTorch's `torch.compile()` on the entire model. - **Regional compilation**: Using `accelerate.utils.compile_regions()` which targets specific blocks of the model to optimize compilation time. Each approach is tested with different batch sizes (1 and 4) and sequence lengths (128) on various LLaMA-based models ranging from 1B to 13B parameters. We purposefully run the forward pass outside of the `torch.no_grad()` context to simulate performance in a training environment, where gradients are needed. ## Usage To run this benchmark: ```bash python regional_compilation.py ``` The script will automatically download the model configurations, create models, and benchmark both compilation and inference times across different scenarios. ## Requirements - Suitable GPU memory for the models being tested. - PyTorch with CUDA support. - Transformers library. - Accelerate library. ## Results The benchmark results are summarized in the following figures: - Compilation time is how long it takes to run the first forward pass. - Speedup factor is the ratio of non-compiled baseline inference time to the fully/regionally compiled inference time.

Compilation Time

Speedup Factor

Full results are available in the tables below: ```markdown [-------------------------------------------------- NousResearch/Llama-3.2-1B ---------------------------------------------------] | Inference time (1x128) | Inference time (4x128) | Compile time (1x128) | Compile time (4x128) 1 threads: ----------------------------------------------------------------------------------------------------------------------- Baseline | 18.3 | 18.4 | | Full compilation | 6.3 | 10.0 | 10696.4 | 10248.0 Regional compilation | 9.7 | 10.0 | 1952.7 | 2903.9 Times are in milliseconds (ms). [---------------------------------------------- NousResearch/Hermes-3-Llama-3.2-3B ----------------------------------------------] | Inference time (1x128) | Inference time (4x128) | Compile time (1x128) | Compile time (4x128) 1 threads: ----------------------------------------------------------------------------------------------------------------------- Baseline | 33.4 | 33.6 | | Full compilation | 11.2 | 23.9 | 17857.5 | 17736.5 Regional compilation | 17.3 | 23.7 | 2993.2 | 2478.8 Times are in milliseconds (ms). [---------------------------------------------- NousResearch/Hermes-3-Llama-3.1-8B ----------------------------------------------] | Inference time (1x128) | Inference time (4x128) | Compile time (1x128) | Compile time (4x128) 1 threads: ----------------------------------------------------------------------------------------------------------------------- Baseline | 40.3 | 59.5 | | Full compilation | 18.9 | 54.4 | 20437.8 | 20152.3 Regional compilation | 19.7 | 54.0 | 2903.1 | 2438.0 Times are in milliseconds (ms). [--------------------------------------------- NousResearch/Nous-Hermes-Llama2-13b ----------------------------------------------] | Inference time (1x128) | Inference time (4x128) | Compile time (1x128) | Compile time (4x128) 1 threads: ----------------------------------------------------------------------------------------------------------------------- Baseline | 45.5 | 100.4 | | Full compilation | 29.4 | 89.7 | 23099.4 | 22885.9 Regional compilation | 29.4 | 87.5 | 2945.5 | 2526.2 Times are in milliseconds (ms). ``` ## Results Summary ### Compilation Time Regional compilation provides significantly faster compilation times compared to full model compilation: - **Full compilation**: Takes ~10-23 seconds depending on model size. - **Regional compilation**: Takes only ~2-3 seconds across all model sizes. - **Speed improvement**: Regional compilation is **5-9x faster** to compile. ### Inference Time Regional compilation delivers inference performance close to full compilation: - For batch size 1: - For smaller models (1B-3B): Full compilation has a slight edge over regional compilation. - For larger models (8B-13B): Regional compilation performs similarly to full compilation. - For batch size 4: Regional compilation performs similarly to full compilation across all models. ## Key Takeaways 1. **Comparable Performance**: Regional compilation delivers performance speedups similar to full compilation, especially for larger models. 2. **Faster Compilation**: Regional compilation significantly reduces the time taken to compile models, making it a more efficient choice for deployment. 3. **Batch Size Impact**: At batch size 4, full compilation and regional compilation perform nearly identically. 4. **Model Size Impact**: Even with a small batch size, full compilation and regional compilation perform similarly for larger models (8B-13B). 5. **Practical Application**: For real-world applications, regional compilation is a practical choice for optimizing training cold start times, especially when working with large models. accelerate-1.14.0/benchmarks/torch.compile/imgs/000077500000000000000000000000001521253476100215155ustar00rootroot00000000000000accelerate-1.14.0/benchmarks/torch.compile/imgs/compilation_time.png000066400000000000000000007446021521253476100255740ustar00rootroot00000000000000‰PNG  IHDRúÛiÜu€:tEXtSoftwareMatplotlib version3.10.1, https://matplotlib.org/soþå pHYs.#.#x¥?vIDATxœìÝw”Ö7à;À0ä(AT]À (f0ë*˜ÃÁ°æœqÁÝU„E_#`NÀwDT‚JP’H`H30óýáÑOìœÐ€ç9‡säVÕ­Û=]ÝUcñë´üüüüJ¤Ry›AŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ T)ïøÿfÏž]ºtI¨¿÷Þ{ѬY³Bõ8è ƒbΜ9ëÕî¾ûîèÞ½{Jf„�ÉK/½×]wÝzµÌÌÌxÿý÷ µ}*ŽÉÍÅèÑ£ãŒ3ÎH¨O™2¥¦€ÍÀbàÀ�ëÕ:tèO=õT9MDi;ýôÓc̘1ëÕzõê½{÷.§‰ ü¤âd‡vH¨=ùä“ѱcÇͶ©qm ES©¼€MA•ò`ôèÑqÆg”ê>^y啨qÇKu°1š3gN¼úê«EÚ&---ªW¯µjÕŠZµjEãÆ�£M›6Q£F�Rš6‚>6Ë–-‹'žx"¡~æ™gF�:uÊa"*‚Ù³gGÿþýKܧR¥J±í¶ÛÆ^{íÇw\üå/IÁt@a 0 ¡Ö­[·hÖ¬Y9L›/AŸ›‰JW¾VÞ#�byÿ<º¼G`#³lÙ²8p`B½[·n‚>¡”͸¯jy�@е¸,§¼G¨pòòòbúôé1}úô:thüå/‰Ûn»-ÚµkWÞ£Àf!Ùõ^‡}@«TÞ›žI“&ÅI'�÷Ýw_y�e¦JyP�Ž;F§N�RÒ«Q£F)éÞºuëâ�ˆˆˆË.»¬|‡€2 訰öÜsϸ袋Ê{ `#Ö½{÷èÞ½{y�±YèØ±cL™2¥¼Ç …zõê½{÷.pyvvv,]º4¦L™£G�ŽW^y%²²²’®ûÀD›6mâ°Ã+¥i7O½{÷ÞàÏ`Sæ¤ì4kÖÌs EP©¼6>µjÕŠÌÌÌ8è ƒâºë®‹?ü0N:é¤×ÿ÷¿ÿk×®-à  ì úJ¬zõêqûí·Ç¹çž›tù?üo¼ñFOeKÐ'�2W\qE´jÕ*é²�?þ¸Œ§€²U¥¼6OsæÌ‰)S¦Ä¼yóbÅŠQµjÕhذal¿ýö±Ã;DZZZy�C¥J•¢gÏžqã�7&,ûßÿþùùù›Üç|~~~L™2%¾ûî»X´hQäääDÍš5£iӦѦM›ÈÌÌ,ïÊÔ‚ âÛo¿�9sæDvvvT®\94h-[¶Œ�vÚ)*W®\Þ#”AŸ”‹ìììøøã�cܸqñí·ßÆÜ¹s#+++Ö¬YQ³fÍhܸql¿ýöѦM›Ø{ï½c‡vHɾsrrâ¿ÿýoŒ5*&Mš³fÍŠeË–ENNNdddDÆ c›m¶‰�wÞ9öÛo¿Øe—]R²ßÂ3fL¼ûî»1~üøøñÇcÙ²eQ©R¥¨_¿þoÏÅ1ÇõêÕ+T¿U«VÅûï¿}ôQ|ûí·1þüX±bEÔ©S'¶Øb‹Øyç�ãàƒŽ}öÙ§ÔÃV²³³ã¹çž‹^x!¦M›Vàz�5Šc�=6Î<óÌhÔ¨Q©ÎTÖ²³³cìØ±ñõ×_ÇôéÓcÆŒ±xñâX±bEäääD�:u¢nݺѰaÃhß¾}ì±Ç±çž{F�:uе¿AƒýößË—/OºÎСC£víÚÚ«N�:Ñ£G�bÍQý˜�:ujŒ92¾øâ‹˜>}z,]º4ÒÒÒ¢Aƒ±Å[Ä{ìûí·_tìØ1*UªT¦³”—Î�;'­/^¼8–.]Zèó˜ ùöÛoã“O>‰¯¾ú*fΜ?ÿüs¬Zµ*ÒÒÒ¢víÚ±ÕV[ÅN;í�:uŠ<0jÔ¨Qâ}þÑüùóãñÇ�áÇÇÂ… \¯U«Vq 'ĉ'ž¸Þo¼ñF¼ñÆë­»ýöÛÇå—_žòY‹jÙ²eñÞ{ïŘ1cbêÔ©1wîÜÈÎÎŽ¼¼¼¨Q£F4iÒ$Z´h»í¶[tíÚ5š7o^f³åççǨQ£â½÷Þ‹ &Ä?ü+V¬ˆŒŒŒhРAl¹å–ѹsç8à€Rv ñ«¼¼¼øæ›obìØ±ñý÷ßÇôéÓcÞ¼y‘��+W®ŒjÕªEݺu£^½zѲeËØsÏ=cÏ=÷Œ-Z¤tŽŠnÍš5ñßÿþ7>ÿüóøæ›obΜ9±xñâX½zu¤§§G­Zµb‹-¶ˆV­ZÅ;ì�:uжmÛ¦ä\)///F�ÿýïc„ 1kÖ¬X²dI¬^½:ªU«õêÕ‹æÍ›G»víbŸ}ö)ós´‰'ÆÛo¿_~ùe̘1#–-[ùùùQ·nÝØ~ûí£S§Nqì±ÇF“&M Õ/'''>ýôÓxÿý÷{®W¬X5kÖŒ-¶Ø"vÜqÇ8øàƒã€ˆŒŒŒR}l999ñÊ+¯Ä3Ï<ß|óMäçç']¯N�:qä‘GÆÙgŸ[o½u©ÎTÖV¯^_~ùe|ùå—1mÚ´˜1cF,\¸0²³³cÍš5Q«V­¨W¯^Ô¯_?vÚi§Øc�=¢cǎѰaÃbíoÈ�!±lÙ² ®óꫯÆ_|Q¨~]tQ±æ(‰Š~ÌΚ5+FŒcÆŒ‰ï¿ÿ>²²²bݺuQ¿~ýhذaì²Ë.±ß~ûEçÎ�£jÕªe6[Z~AwN°I©tåkå=)–÷Ï£Ë{„”=ztœqÆ õ^½zEïÞ½Km¿×^{m¼üòËëÕºuëÿøÇ?ŠÝsöìÙÑ¥K—„ú{ï½Íš5+õí#":è ˜3gÎzµ»ï¾;ºwï^¨íKÛ”)Sâ‘G‰‘#GFNNN‘¶mܸq{ì±qâ‰'+HhÅŠñøã�Ç“O>YYY…ÞnÛm·� /¼0Ž9æ˜HKK+ò~#" \¯Ö¡C‡xê©§~ûûgŸ}wß}wLž<ùOûÕ¨Q#zõêg�uV�k×®�'žx"zè¡B=Þ�vÚ)n»í¶hß¾ýŸ®›Ìé§ŸcÆŒY¯öûãøã�?Žo¼1æÏŸ_èž5kÖŒ«®º*N9å”bÍôÒK/Åu×]·^-333ÞÿýBmŸŠc2"bÞ¼yñæ›oÆÛo¿&LˆuëÖzÛˆˆêÕ«ÇI'�gŸ}v¡~•Êp« =w½—O™2¥Øû«èÇì´iÓ¢OŸ>ñé§ŸªçN;í×\sMtêÔ©X3±q›qŸÐŸMM‹ËŠvS‘•ÖùxûöícÍš5 õ‘#G;ô0///†ƒŽ©S§z»5jÄ©§žçŸ~±Ã³/???žx≸ï¾ûbÕªU…ÞnË-·Œ>}úÄÞ{ï…û¼Ù�’nŸÌœ9sbРAñꫯFnnn¡·ëÔ©SôîÝ;öØc�bïûÏÎ'#">øàƒøç?ÿßÿ}¡zrÈ!qÕUW•(LpÍš5ñÑGÅo¼ÿûßÿþ4T/™N�:Å\{íµW±çˆ(ÜsTžfÍš�>úh¼òÊ+±råÊ"m[¯^½8ꨣâ„Nˆ6mÚyß¹¹¹ñÌ3ÏÄàÁƒcÞ¼y…Þ®I“&qî¹çÆ)§œéééEÞoDá®;¾ýöÛ¸óÎ;cìØ±Ú/===zöì—\rɃ_xá…8p`¡oóæÍãÖ[o�}öÙçO×MæÏ~‡2~üø¸æškbúôé…ž\pA\xá…ÅúÒ‰T\ƒ$»^zòÉ'£cÇŽ…î±xñâ9rdŒ92¾üòË"ÿ®#===Ž>úè8ï¼óŠüù˜ìw@%QÐs—ªkãß«èÇìO?ý}ûö�‘#GF^^ÞŸöÜzë­ãÊ+¯ŒC=´X3°i)»¯°`³¶jÕª¸í¶ÛâØc��áÇ9ø""âçŸއz(Î<óÌ"o;f̘8úè£ãþûï/R``DÄÌ™3ãšk®‰ÓN;-¥¿ÊÏÏ�{ï½7zöìY¨�ψˆ•+WF¿~ýâÒK/Mú\Ο??zôèýúõ+ôãýæ›oâ”SN‰wß}·(ãÊsÏ=çŸ~‘B>#~ z¼õÖ[ãúë¯/r8fEñØc�Å�ýúõ‹¯¾úªX�cÕªUñøã�Ç!‡¯¿þz)LYñTäc6"â™gž‰cŽ9¦Ð!Ÿ¿c={öŒ'žx¢Tf¨hêÖ­›´^Ô÷õ_M™2%Ž?þø¸æškŠòñ˹Ó#�<GqDüïÿ+Öþ•››W^yeÜ}÷ÝE ùŒø%üûÜsÏ�^x¡D3”–¡C‡Æ‘G/¼ðB‘B>#~ ­?í´Ó⦛nŠÕ«W§|¶ÜÜܸ馛₠.(tÈgDÄÛo¿ݺu+T¸b2sæÌ‰½÷Þ;z÷î#GŽ,VÈgÄ/ÏOÏž=ãŠ+®(•ç§¼­]»6 GqD 6¬È!Ÿ¿¼7 2$Ž9æ˜"o;eÊ”èÞ½{Üyç�E ŒøåÚé®»îŠnݺúz¬¨†Ç|¡_‡¹¹¹ñðÃGÏž=“¾æ–/_\pAÜpà …~¼³fÍŠsÎ9'†Z¤Ù ãƒ>ˆÓO?½H!Ÿ¿<ÎÄ\°Ñ#FŒˆ}÷Ý7n»í¶=zt±~ב››/½ôRyä‘ñØc�•”OE?fß{ï½8òÈ#ãÍ7ß,TÈgDÄ�?þ—\rI‰¾@€M‡ OJÝìÙ³ãøã��aÆ: !•^~ùå8묳Jø÷Å_Ä 'œ“&MJÑd¿¸ãŽ;âÁŒüüü"oûöÛoÇ-·Ü²^mÞ¼yÑ£G�øòË/‹ÜoíÚµqÙe—ÅèÑ£‹¼mAÞ{クå–[Jô³ñÅãæ›oNÙLeiÑ¢EÅúÙ&³zõê¸âŠ+bÀ€)éWQUôcö�ˆ[n¹¥Èh¿ûöéÓ'† ’Ò™*¢‚BÛªT©Rä^#GŽŒ“N:©Äïé ,ˆsÏ=7^zé¥bmŸŸŸ×^{m‰‚·×­[7ÝtS|øá‡Åî‘jùùùqóÍ7Çí·ß^äðÒ?zî¹ç¢G�ÅtM&777.¾øâxî¹çе}vvvœ{î¹1~üø"o»zõêÈÎÎ.Ö~“yýõ×ã´ÓN‹%K–¤¬gyËÊÊŠ3Ï<3X¬�Ã’úä“Oâä“O.rð}÷ÝwqÊ)§ÄÇœ¢É~1xðà¸ýöÛcíÚµEÞö‹/¾ˆK/½t½m—-[g�uV|ðÁÅšçŽ;îˆ×^{­XÛ&3~üø¸ì²ËJÔùñÇÇÅ_\¬ç¨¼eee¥lîuëÖÅ?þñ�¸îºëRv YUôcö•W^‰^½zû½ÿ±Ç‹¾}û¦t&6>E¿KŠ`Ö¬YÑ£G�øé§Ÿ \§F�±ûî»GÓ¦M£aÆ‘——K—.�yóæÅĉcñâÅÅÞÿÛo¿×_}�!“ÕªU‹N�:EfffÔ©S'-Z3f̈/¾ø"é6‹-гÏ>;žyæ™hÑ¢E±çúÕ�!CbèСëÕªW¯:tˆfÍšEݺucÙ²e1eÊ”7n\¬[·.¡ÇK/½x`rÈ!±zõê¸à‚ âÇ\o�­¶Ú*öØc�Øb‹-¢jÕª±`Á‚3fLÌš5+¡_nnnÜ|óÍñÚk¯EÕªUKôø,X×]wÝzÏeƒ â˜cމƒ>8š5kõë×�E‹ÅÌ™3cĈñúë¯ÇŠ+z½ð Ѿ}û8餓J4SEQ«V­Øa‡b›m¶‰ZµjEíÚµ#777–-[Ó§O�I“&%}""­[·ŽC=´Œ§.}ý˜}ùå—ã¾ûî[¯V¹råhß¾}´jÕ*6lk×®�ùóçÇgŸ} ,HÚçž{î‰ýöÛ/¶ÞzëÏP­Y³&–/_žtY½zõŠÔë�7Þˆ«®º*éyPÄ/Ÿ ;ï¼sl»í¶Q¯^½ÈÏÏ�… ÆW_}Ó§OOXݺuqà 7DÆ cÿý÷/Ò,C† )0ä³^½zñ׿þ5>øàØzë­£Aƒ‘••sæÌ‰÷ß?^}õÕ˜?~DDäååÅ5×\‡~x‘ö_ZúôéÏ>ûl�Ë6l:tˆ&MšDFFFÌŸ??¾ùæ›CÚ&L˜çœsN<ýôÓ%>ŸŒˆ¸ùæ›ã£�>Z¯V½zõØsÏ=#333êׯ+V¬ˆY³fÅgŸ}+W®Lè±jÕª¸á†⥗^ŠôôôÏT¹råhÑ¢El¿ýöQ¯^½¨]»vT©R%–/_?ÿüsLœ8±ÀÐò‰'Æu×]>ø`‰ç(oYYYqúé§o0°¯jÕª±Ûn»ÅV[m 6ŒÊ•+ÇÒ¥K{ž~=.ŠãË/¿Œ^½zm0X¸C‡ѼyóߎÉY³fÅèÑ£“†¶¯\¹2zõê�=öXì¾ûîÅžëWï½÷^ÜsÏ=ëÕÒÓÓc�=öˆm¶Ù&4hÙÙÙ1}úôgúßÿþO=õTœuÖY‘——ÿûßc„ ë­Ó°aÃèØ±c4nÜ8ªW¯‹/ŽqãÆÅwß}—Ð/???î¼óÎèܹs4hРD�ï×/"øýó_³fÍ8ꨣâðÃ�m·Ý66lK–,‰Y³fÅ;ï¼ÇOz�ÿé§ŸÆý÷ßÿûßK4SEQ½zõØ~ûí£E‹Q§N�¨]»väååÅòåËã‡~ˆ‰'ˆüÒK/ÅöÛogŸ}vÙ]*ú1;jÔ¨¸á†Ö»¶LKK‹6mÚÄN;í 4ˆJ•*Å‚ âóÏ?Oú;•ˆ_Â>»víš’™Ø8 ú ÔdggÇùçŸ_`Ègûöí£W¯^±×^{m0hÆŒ1bĈxã�7âûï¿/ôþçÏŸ7ÞxcÒð¿5jÄe—]Çw\ÔªU+é¶�<òH<õÔS‘ŸŸ¿Þ²¬¬¬¸æškâé§ŸŽÊ•+zž?š3gNôë×﷿ׯ_?.½ôÒèÞ½{ddd$]ÿ–[n‰O>ù$aY¿~ý¢k×®q÷ÝwÇäÉ“«ï±ÇqÕUWÅ.»ì’t†wß}7n¹å–X¸pázõ™3gÆ“O>çž{n1Ý/^|ñÅX»vío?üðÃãÖ[oMøÚrË-cË-·Œ½öÚ+Î?ÿü¸öÚkc̘1 ýî¹çž8ðÀ£qãÆ%š«<¤¥¥Å.»ì‡rHtÐA±Í6ÛDZZZ�ëçææÆ{ï½=ôPLš4)aù�7Þ»ì²K4iÒdƒû�2eÊoÿ={öìèÒ¥KÂ:ï½÷^4kÖ¬�¦tl Çìm·Ý¶ÞL={öŒ3Ï<3ih]~~~¼ùæ›Ñ§OŸ„clõêÕq÷ÝwÇø †§�vZ±f©Ö®]½{÷.0ä³E‹qÉ%—Ä5jÔ(°Ï¼yóâ­·ÞŠ7Þx#Æ�_èý¯X±"®ºêª¤��éééqÞyçE�=’ãYYY1lذ4hPÂëdÍš5qÕUWÅðáÓžwe¾o¼ñ·÷Â5jÄùçŸ=zôHÚwñâÅñ�ü#^}õÕ„eŒN8!† ¶Þõ`ëÖ­ãꫯŽÎ�;G¥J•¶;vl\ýõñÃ?¬WÏÊÊŠÄ-·ÜRìÇñÎ;ï¬w½×©S§¸ûî»c«­¶Zo½&MšD“&Mb�=öˆ .¸ n¹å–xë­·ú <8Ž8âˆhÓ¦M‰æ*/;í´StíÚ5ºvíÛo¿}ҟɯòóóãÓO?�ÁƒǨQ£–ÿûßÿ޽öÚ+vÜqÇ îóý÷ß_ïï;ì°CÂ:O>ùdtìØ±��¢ôl Çì•W^ùÛk:===N:é¤8ï¼ó ¼îþïÿ·Ýv[Â1–ŸŸ·ß~{Òã€ÍCÁw @ õéÓ'¦M›–P¯R¥JÜvÛmñÜsÏÅþûï¿Á�ψ_b.ºè¢xã�7âÁŒöíÛjÿ×_},]º4¡Þ¼yó>|xœy晆@4iÒ$n¸á†xôÑG£Zµj Ë¿þúëxðÁ 5GAæÌ™kÖ¬‰ˆ_Â8^ýõ8å”S ÊÌÌŒ|08à€„e³fÍŠþýûdzÏ>û[íüóÏ�¡C‡òѵk×xüñÇ£víÚ Ëžþù¢= $~úrÜqÇÅ}÷Ý—4ñ÷233cðàÁ±×^{%,[¾|yôéÓ§Äs•¥ªU«ÆqÇo¼ñF<óÌ3qöÙgǶÛn»Á�ψ_BE;ì°xþùçã /LX¾lÙ²xâ‰'Jkìr±1³«V­Šˆ_‚Ï^z饸ôÒK |M§¥¥Å‘GC† ‰-¶Ø"aùG}óçÏ/ÑLÕ믿ž´¾óÎ;o0øì÷V­ZW\qEäää$,;ûì³ãå—_Ž¿þõ¯<—lÙ²e 80n¾ùæ„ý.\¸°H!w}úô‰+V$Ô»wï÷Ýwߟ†Ö¬Y3n»í¶¸à‚ ~«ý1¬¬¬eeeÅ 7Ü�tÙ�Ç�.]º”ݦM› ï¿ÿ~Üxã�Ñ¡C‡? ùŒøåÿöÛo�!C†$=_xðÁ×;_ÞØüßÿý_�?ß^½zÅ믿GqÄC>#~ PíÙ³g<ÿüó1tèÐØgŸ} µÿ¾}ûƬY³êõêÕ‹gŸ}6.¹ä’�ËzõêÅE]/¼ðBÒuæÌ™Sâ뎬¬¬X¼xqDüò_|ñÅ¸à‚ <ŸmРAôë×/N:餄eÙÙÙ1pàÀ4hÐoµcŽ9&^~ùåØwß} |_Ýc�=â©§žJÞŒˆxíµ×~»-®ß¿~÷ÙgŸxä‘G’îë÷êׯ÷ß{ì±IûÝtÓM%š©¬U®\9=ôÐxþùçãå—_Ž‹/¾8vØa‡?ý¬KKK‹}÷Ý7üñ¸å–[ÖÏÍÍ-ñõKE³1³¿~AC½zõbÈ�!qÓM7mðË5:wîO?ýt´hÑ"aÙäÉ“ã믿.ÑLl¼}Ö矃 *ÑŸÉ“'—÷ÃØl}õÕWñâ‹/&ÔÓÓÓãþûï�“O>ùOƒ“9ðÀã¾ûîûÓõ>ýôÓøôÓOê 6ŒG}4š7o^¨ýí½÷Þqß}÷% 7ú¿ÿû¿X²dI¡úlÈV[mO=õTÒ À?ªR¥JÜ~ûíQ½zõ„e>ø`äççGDÄ™gžY`àÒm¿ýöqÑE%ÔgΜãÇ�/T�?³Ë.»Äí·ß^èõ«V­L3räȘ={vJæ* ½zõŠ>}úDË–-‹µ}åÊ•ã²Ë.‹³Î:+aÙ‹/¾«W¯.éˆÂÆtÌ6hÐ † –4Ì%™-Z$ Q[·n] >¼ÄóT4S¦L‰W^y%é²£Ž:ªÐ}þïÿþ/i Øßÿþ÷¸æšk¢J•*…îuÚi§Å5×\“Pç�w’ÓÿÑO?ýï¼óNBý/ùKÜqÇE:¯½üòËãÀ,ôú¥éÑG� $ÔwÛm·è߿ԬYóO{¤¥¥ÅùçŸûÛß–åååE¿~ýR2k‡âÁ,ÔL|pÒÀÄiÓ¦é·E‹ñüóÏÇ!‡Rè�Ú?Ú}÷ÝcðàÁ‘žž¾^ý矎·ß~»X=ËÛœ9s !¼õÖ[£wïÞE:FµÇ{ÄàÁƒÿt½éÓ§' m­^½z<ôÐCñ—¿ü¥PûkÓ¦M<ôÐCIÃH_|ñÅøî»ï ÕgCjÕªO=õTl·Ýv…ZÿÚk¯�Æ�'Ô{ì±ßBç>øàèÛ·o¡žã&MšÄµ×^›P_¾|y¼÷Þ{…šéÏdffÆý÷ߟðß�;ï¼3Úµk—P?~|‰‚ËÒñÇ÷ß¡¿�$™SO=5®¿þú„ú»ï¾»É|1ÀÆtÌfddÄO<±Á/Mù½† Æ?þñ�¤ç/¿ür‰ç`ã$訰F�ýû÷/ÑŸo¾ù¦¼ÆfkÀ€Ië½zõŠ.]º”úþ‡š´~ýõ×ÇÖ[o]¤^x`Ò� 5kÖÄóÏ?_¬ù~ïî»ïŽºuëzý&MšÄa‡Vàò–-[Æ•W^Y¤N>ùä¨V­ZBýóÏ?/RŸdÒÒÒâ†n(rÐO­ZµâŠ+®H¨ççç§äy/+Å „ú£Ë.»,!ø4+++>þøã”ô/oÓ1{ç�wF“&MŠ´ÍG‘4ô‹/¾(ñ<É?ü^xaäææ&,ËÌÌŒ£�>ºP}²²²â‰'žH¨zè¡qþùçk¶ž={ÆÞ{ï½^-???ž|òÉ?Ýö…^ˆ¼¼¼„zqÎq""®»îº"╆œœœ¤Ÿ‹ѯ_¿ÈÈÈ(R¿Ë/¿üðÄú®»îGuT±z^zé¥Q§N�„ú3Ï<“4ô©°öÜsÏèÔ©S‘·ÛPXê¹çžU«V-R¿5jÄ^{í•PÿöÛo‹<Ûí³Ï> �%…uÔQGŶÛn›P饗J8ÕÆ§ZµjIÃѾúꫲ&Å6¦c¶]»vÅ+>òÈ#j©�MÅÒ¥Kã‘G‰nݺŜ9s–WªT)n¹å–B‡G¾ú꫱råÊõjéééqÕUW•h΋.º(¡6|øð¤Á¤¿÷Úk¯%Ôvß}÷Ø}÷Ý‹5Ç6Ûl‡rH±¶M•#FÄâÅ‹êg�uV‘B U¹rå¸þúë“.+(л°N:館rË-‹¼]“&Mb�=öH¨—×ço²ðÆ’† –‡ììì¤ÇDãÆ�ãšk®)õý¯\¹2^yå•„z³fÍ⬳Î*VÏ3Î8#i¸üðáÃ#;;»X=�©[·nEÞnCç›§žzj4hÐ %=Sq½×²eË8üðËµí®»îš4ñí·ß.Ñó¾1JKK‹ã�?>¡¾)\ïmLÇlãÆ�‹Vœìzoúôé±fÍšbÏÀÆKÐ')7bĈÈÏÏO¨÷ìÙ3*W®\êûÿè£�’ù7¬!"¢^½zIÃKæÌ™S§N-vßN8¡XÛµiÓ&i½F�IÃ% cÇwL¨}ÿý÷Åêõ{Å jÜÐö?ÿüsÌœ9³D}7F;vL¨�?¾&I­�é˜-ÉLÉoçÏŸË–-+vO€ÒôùçŸÇ Aƒ üóÏþ3n¾ùæ8ñÄ£sçÎqÏ=÷ÄŠ+ú¤¥¥Åµ×^ûï¿¡÷ýúë¯'ÔºtéR¬ÊßÛsÏ=#33s½ÚÊ•+7v·xñâ¤çÅ=çúUIÏ‘Jêƒ>H¨¥¥¥ÅI'�Tìž{íµW´hÑ"¡þÑG%½>(¬’|þ¶k×.¡–ŠsÜâhÑ¢E4nÜx½ÚâÅ‹cÖ¬Yå2Oq}øá‡ A¼¿üœjÕªUêûÿüóÏcùòå õãŽ;®È_xð«ªU«& Y\¹re|öÙgÅêùëL•*ýŸm´jÕ*ªT©’tY²ÀØÂHv ™Šc¡4Þ ×¬Y³Q†à–Ô¦z½·1³'œpB¤§§kÛd×{k×®�3f{6^‚>H¹O>ù$¡V·nݤ¡{¥!Y HõêÕ£k×®%êû׿þ5iý«¯¾*vÏdA…‘™™™4|bç�wŽŒŒŒbõÜf›mjYYYÅêõ«´´´8è ƒJÔ£ ŸÛ„ JÔwcÔ¨Q£„Úwß}W“¤ÖÆtÌvêÔ©ØÛn·ÝvIëK—.-vO€Ò4zôèèß¿�~øáxöÙgã믿ŽÜÜܤ=êÕ«ýû÷�3Ï<³Ðû]¼xqLœ81¡~衇û±üÞž{î™P7n\�ëtαß~û•hŽÎ�;—I~A’}þî±Ç±ÕV[•¨ïÑG�PËÊÊ*vÐYfff‰^[¶l™P+ÏÏÞdçsåùä"÷kذa4mÚ´X³TªT)jÔ¨‘RÔ¶mÛbõ‹ˆ¨]»vB-;;»Øý""¶Új«¨S§N‰z´lÙ2ÒÓÓÄ&L˜Pâ`�ò–““Ó¦M‹ü1V¬XÙÙÙ±råÊÃv–/_^¨ÚÆfc9f4h™™™Åž§nݺIë%=Î*¢ÌÌÌèÖ­[ôìÙ3é9ƆŒ?>égán»í–’Ù’…›óÍ7®Ÿìܶf͚ѬY³Í‘‘‘Ûn»mL›6­D}ŠãçŸ޹sç&Ô÷Øc�÷.(Øð믿.0ôzCÚµkW¢y’}þ¦òüiΜ9ñý÷ßÇÒ¥K#;;;V¬XQ`ðmDòÀ·�-ô{üøñ µV­ZEãÆ�ËdÿÉBüš6mZ¢@؈_®]233cöìÙëÕK_’ë³Zµj•z¿ˆ_ÎE‹{Í–žžž4L·(êÖ­µUÂ{Ò¦ô¹víÚ˜1cFüðñ|ùòX±bE¬X±"Ö­[W¤>Ë–-+ñµQyÚ˜ŽÙ’|æT©R%jÔ¨‘ðãz`ó$耔š3gN¬\¹2¡Þ¾}û2ÙNNNüðà õwܱĽÓÓÓ£U«V APS§N-V¿† –hždAŸ 4(Q¿?Z±bE±ûED´nݺDÛGDT­Z5Z´h‘ð<' §ÚL›6-†ï¿ÿ~LŸ>=Ö®][¢~ëÖ­‹ìììƒ{*ºÍé˜-ègTÒã  "Úi§�â¯ýk‘C>#"¦L™’P«Q£F±Òÿ¨^½z µÅ‹¸þ‚ j-[¶Œ´´´ÏÒªU«r úüî»ï’ÖSñùÛ¦M›HKK‹üüüõêåõù›,¯$Ÿ½Ë—/�·Þz+Þ|óÍ?~|JBC7¦àöÜÜܘ9sfB½¬®÷"’¿–RñÚýµÏC :^þL�5¢ZµjÅž%ÙõYI®÷ Š\±bE±ƒ>[´héééÅžéW;ì°CÂõÝÆz½7gΜxýõ×ãí·ßŽ©S§&|é@q,[¶,¶ÜrËLW>6¦c¶zõê%š§V­Z‚>ˆAŸ¤Ø¼yó’Ö·ß~û2Ùÿ²eËB…"~ I…í¶Û.!4ð�a›…Uœà«ß«T©RJ{&ë———Wì~[l±E‰¶ÿU²@›â>ïåeÚ´iqÇwĨQ£RÞ{cúÜÜ�Ùˆ_ÂZ65ï¼óN|òÉ'qÏ=÷Ä!‡R¤mçÌ™“P[¹reì°Ã©/Á²eË \–,„±nݺ)Ùo²ÐѲPÐga*>k×®[l±EB@jEúü-Î9îêÕ«ãÁŒG}4Ö¬YS¢™þhc úüù矓>­Zµ*³’½–RyîøG¿ž¯5Ü·¸á™¿Jõõ^Aó—ä\ÔõÞÿ7þüèÓ§O¼õÖ[I¯oJbcz�Hfc9fKúyQ:¿W`ã$耔Z²dIÒz* £ �¦T… &{ †Ú�Ê•+—tœ2éY©zÞ“õÙ˜ÂNžzê©èÛ·oäææ–Jÿµk×–Jß²°1³Uª¸åؼôêÕ+z÷î�tÙÊ•+#+++¾ûî»øðÃãµ×^Køl^½zu\vÙeÑ¿ÿ8øàƒ ½ß… –hîâØP \²sŽš5k¦d¿©êST}¦êœ½N�: AŸóçï´iÓâ¼ó΋ٳg—Jÿ�)ô» ë½’†ZVNNNÒ ÕÒÓõÞÈ‘#ãºë®‹•+W–Jÿ�é=â�6¦c¶"|Þ°éHüªH(�Õ«W'­—UðKi‡@’ŸŸŸ’þ›šjÕª¥¤OõêÕj¥¢’j�=öXÜyç�¥ò¹±sÌlœjÔ¨[mµUì¿ÿþqË-·ÄÛo¿‡rHÂzëÖ­‹«®º*¦N�ZèÞ�O–¦ }Nçää$ÔªV­š’ý¦ªOQ•Ççï†ÂT+²iÓ¦ÅgœQj!Ÿ›ò¾Þ+èuTš¯Ý íwsçz/âÍ7ߌ+®¸b£™·¬9fØ\ùºIÊDZZÚ&±ÿò~›Tu­Zµ*¡V£F�”ô.MãÇ��¾}û¸¼]»v±çž{FÛ¶m£iӦѴiÓ¨Y³fdddDµjÕ^o³gÏŽ.]º”öØ‚c`ãÒ Aƒèß¿\}õÕñÚk¯­·lÕªUqÅWÄ‹/¾X¨`Ëuë֕֘Œ,DlÅŠ)é�ª>©âów}ëÖ­‹Ë/¿<.\˜tyãÆ�£S§N±Ûn»EóæÍcË-·ŒúõëGÕªU####ÒÓÓ¶9ýôÓc̘1¥=úfÇk·|lî×{sçÎ�믿>Ö®]›tùöÛo:tˆöíÛGfff4mÚ4jÕªõÛõ^¥J•¶Ùa‡J{ì Á1 À¦NÐ')U­Zµ¤õeË–•Éþk×®�´ž���’þË—/OºOáÉ¥êyOÖ§ ŸuErÇwD~~~B}Ÿ}ö‰«¯¾ºÈ!.¹¹¹©­ÂpÌl:*UªwÝuWLŸ>=&Mš´Þ²©S§ÆÃ?_|ñŸöÉÈÈH¨ÕªU+Î9眔ÍúGuêÔ)pY²Ïª�=èsCŸ¿É‚M‹*ÙçoݺuKÜ·¬=ûì³1eÊ”„zƒ âÆoŒC=4ªT)Ú-ùûù\A×{É~楡 cµ4Ï#6Î×oYØÜ¯÷úõë—4¤ô/ùKÜpà ±û_NNNªF«0³l®}¤ÐºuëÊ{„rW¿~ý¤õ² ú,(Ì!UÁ3Éúl(js·hÑ¢”ôY¼xqB­¢?ï“'OŽñãÇ'Ô�<òÈøç?ÿ•*U*rÏ¥K—¦b´ Å1 °iÉÈȈ>}úÄqÇk×®]oÙÃ?Ý»w�-·Ürƒ=’½OçççÇE]”ÒY +ÙgÕ¼yóRÒ;U}Šª ÏßeË–EÓ¦MKÜSùü}î¹çjõë×�_|1¶Új«bõÌÊÊ*áTå« ë½²:OÍÈȈŒŒŒX³fÍzõT�;& ¬\¹rÔ¬Y3%ý75›óõ^VVV¼ýöÛ õ=÷Ü3œ4´úÏlŠ×{ŽY6WE¿S`‘–––PËËË+QÏM1”¡¨ núþûïËdÿ…�Ìœ93%ýg̘Qè}1eÊ”÷ÈÉÉIú¼ÿYHXy{ÿý÷jµk׎Ûn»­X!ŸK–,)éXŽc`ÓÓ¦M›8õÔSê«V­Š�þéöÉW¬X¹¹¹)™¯¨¶ÝvÛ„Ú¬Y³båÊ•%î=yòä÷(Ž‚‚>øá‡÷ÎÎÎŽ zŸÕ¼yóâÛo¿M¨_}õÕÅùŒØøÏçš4i•+WN¨O›6­ÌfHöZ*ÍsÇÚµk'ýýÓ§OOÉ{s²ëÆŠ~½÷ÑG%|ÙK¥J•âî»ï.VÈgÄÆÿþPÇ,›#AŸÀf«fÍš µ’†õ,^¼¸DÛo š5k5jÔH¨�?¾Lö_µjÕ¤aL©QZ»vmÒÀÒÖ­[—¸÷¦jîܹ±lÙ²õ˜6mZÒð˜víÚ•¨oi›8qbBí ƒŠÚµk»ç¤I“J2R…ä˜Ø4]xá…IÏ·_yå•? ÷jÙ²eÒúôéÓS1Z‘%;çÈËËKúY_³fÍ*·P·V­Z%­' ¶,ªÉ“'G~~~B}ûí·/qï²”ì¼+###;ì°b÷œ;wndee•`ªòW¥J•hÑ¢EB½¬®÷"’¿–Rš›ìpîX°ÜÜ܇¼.]º4æÎ�›P߯÷vÛm·hÞ¼y±{~óÍ7%©Âr̰9ô l¶jÕª•P[ºti‰z–e¸IE•–––4�ã‹/¾ˆœœœ2™a—]vI¨Mš4)V­ZU¢¾ãÇ��5kÖjü"???Þÿýõx÷Ýw“ÖÛ·o_¢¾¥mÑ¢E µ’\}ùå—%Ú¾R¥ä·Œ% ã*KŽY€MOƒ âÌ3ÏL¨¯]»6 ´Ám zŸ3fL*F+²Ö­[GµjÕê#GŽ,Qß#F”hû’hÒ¤IlµÕV õÏ?ÿ¼Ä½ÇŽ›´¾±}þ.\¸0¡VЗVIÏå*Šdçáß}÷],X° LöŸìµ4wîܘ3gN‰úΟ??fÍšU¨ýñÿ½÷Þ{¥²ýæx½7nܸmñËïdþ¨"^ï9fØÔ ú6[õêÕK¨M›6­D=Ë+|¨¢Ùwß}jYYY%C*¬�wÞ9¡¶råÊ� >¡¶xñâxøá‡‹Õï…^ˆï¿ÿ¾¤c•È�˜PËËË+Ñçï˜1c’>®ý÷߿Ÿ»ýQªÏåf̘üq &ª8ößÿ¤ç•O?ýt¬X±¢Ô÷¿çž{FíÚµê/¾øb±Ï—sss“•Ö¨Q#:uêT¬ž›‹iÓ¦ûK=¾üòËøïÿ›P?ä�C’þŒ+’dïK–,)v¿áǧäº,Ù±YÞ×{ŽY6G‚>€ÍÖ_þò—¤õdÁp…qÿý÷—dœMJ³fÍb¿ýöK¨Oš4)\êûÏÌÌŒ8 ¡>f̘xë­·ŠÕóþûï�¥K—&ÔO>ù䤅üùùùѧOŸX»vm‘¶ËÎÎŽþóŸ õ´´´8á„R5^©iРABí‹/¾(V¯ï¿ÿ>{ì±’ŽéééQ¯^½„úŒ3JÜ»$³›®³Î:+jÕª•Pã�7búôénwÒI'EÕªUêwÜqG¬^½:¥3Æ�5J¨<8&L˜P¤^?þøcüûßÿNÕhÅvøá‡'=_yôÑGcÞ¼yEî———}úôIºì´ÓN+r¿ò–ì¹ùá‡bÑ¢EEŸ7ß|säçç§b´rW³fÍ8æ˜cêóçÏ�¾}û–úþkÔ¨Ç{lBý‡~ˆ§žzªX=‡ ’ô þú׿&}c}÷ÜsO‘C^×®]wÝuWÒeëõÞ¸qãŠÕkáÂ…ñ¯ý«¤#ED$ý¬*ïë=Ç,›#w+›­úõëG«V­êO>ùddgg©×³Ï>ï¼óNªFÛ$ôîÝ;ÒÒÒê÷ß|ôÑG¥¾ÿ‚„î¸ãŽ˜;wn‘z}üñÇ1lذ„zFFÆF@R|ùå—qË-·zýÜÜÜèÝ»wÒŸÕ!‡Í›7Oåx¥b§�vJ¨}úé§1mÚ´"õYºti\qűfÍš”̵Ã;$ÔÊâ˜ü3ŽY€MSݺuãôÓOO¨çååÅþóŸ·kܸqôèÑ#¡>iÒ¤¸æškŠ ^�ÜÜÜøöÛoÿt½*UªÄ¥—^šP_½zuüío‹)S¦jsæÌ‰³Ï>;–,YRäYS­jÕªI?W­Z×\sMäää©_ÿþý“>—mÛ¶��wÞ¹Øs–—dçryyyñä“O¹×€b̘1©«Â8ÿüó####¡þì³ÏÆóÏ?_êû?õÔS“^o0 ¾ùæ›"õúæ›o üâŽdïC$š={v\rÉ%Ezo¾ñÆ“%·mÛ6:vì˜ÊñJE²÷ˆï¾û.F�U¤>999qÍ5פìs¡¢^ï9fØÜú6kÇ{lBmÁ‚qã�7ƺuë Õcذaqë­·¦v°M@»víâÄOL¨çææÆÅ_\ìð—>ø .»ì²?]oŸ}ö‰}öÙ'¡¾`Á‚8ûì³ øÙgŸÅ¥—^šôõpþùçGýúõ ÕgsU¥J•ßþû…^ˆË/¿<²²²6¸ÍܹsãœsΉÿýï ËjÕª7ÜpCªÇ,�;wN¨­]»6þþ÷¿Ç²eË ÕcþüùqÆgÄäÉ“S6W² ­wß}7^xá…”í£8³›®³Î:+jÕª•PóÍ77€}ñÅ' ÷9rdœ~úéñÓO?{¦¥K—ÆàÁƒ£k×®ñÐCj›ã�?>öÜsÏ„ú’%Kâøã��AƒÅÒ¥K“n»bÅŠ2dH}ôÑ1kÖ¬ßê­[·.ÞH‘³Ï>;5j”P=zt\y啱zõêBõyä‘GâÁL¨WªT)®¾úêÏYZ¶l[n¹eB}ðàÁñÉ'ŸªG^^^üóŸÿÜ`¨íƪiӦѫW¯¤Ën¼ñÆ4hP¡¯©oìØ±qÎ9çüézÛm·]ÒëÍ•+W)|wÊ”)ñ·¿ý-V®\™°ì¸ãŽ‹í·ß¾P}6W¿¿ÞûôÓOãÜsÏ�yóæmp›¬¬¬¸ôÒKãå—_NÚïÎ;ïLYÑ$»v‰ˆ¸öÚk }í²|ùò8ï¼óâÓO?MÙ\É®÷¾ùæ›8p`±ŽÉTq̰¹ô lÖŽ=öØÈÈÈH¨�1"Î;89sf�ÛNœ81Î=÷ܸí¶Û"///""ZµjUZ£n”®¹æš¤! ¹¹¹qã�7Ɖ'žüqäääl°ÏÌ™3ã�ˆ#Ž8".¸à‚?~|¡öß§OŸ¨[·nB}ÆŒqôÑGÇСC“†CDDüüóÏq÷ÝwÇYg�•t�öíÛÇ\P¨96gÇwÜz?ƒ7ß|3?üðèÛ·oŒ7.,X999ñÓO?ŨQ£âæ›oŽ£Ž:*F��´ßW\Mš4)«ñK¤cÇŽIß&OžÝ»w��>ú(òóó“n»téÒxä‘GâðÃ_/ä³mÛ¶%žë¯ýkB-???n¸á†èÒ¥K\uÕUñ¯ý+þóŸÿÄ AƒÖû3dÈ�ïC³›¦ºuëF�=êyyy @¬U«VüûßÿŽêÕ«',7n\vØaqûí·Ç÷ß_¨9fÍšÏ?ÿ|œ{î¹Ñ¹sçèׯ_‘ÂBÓÒÒâÎ;ïŒÚµk',ËÉɉþýûGçÎ�ãœsΉ[o½5ú÷ïwÜqG\pÁ±÷Þ{ÇwÜ+V¬øm›ƒ:(9ä�Bï¿4Ô«W/îºë®¤ËÞzë­8æ˜câ£�>*0nÊ”)qÎ9çÄ=÷Ü“tù™gž;vLÙ¼eíÔSOM¨åææÆ…^ŒåË—'Ýnݺuñé§ŸF÷îÝãá‡þ­^«V­ØvÛmKkÜ2wÎ9çÄ^{í•tYÿþýãè£�Ž#FĪU«6ØgÞ¼yñøã�Çñǧ�vZ¡C¯¹æš¤aÀ .ŒãŽ;. Tà— ,]º4xà�8þøãcáÂ… Ë333ãúë¯/Ô›³®]»ÆÖ[oýÛßG�GydÜ|óÍ1jÔ¨øé§Ÿ"''',XãÆ�‹¾}ûÆá‡#GŽLÚ¯gÏž±ãŽ;–Õø%Ò¼yó¤aŸ?ýôSwÜq1|øðX»vmÒmW®\Ï?ÿ|zè¡1jÔ¨ß꩸Þ;ì°Ã¢jÕª õÄþûï—]vYÜsÏ=1pàÀ„ë½Aƒ•xÿâ˜`sRåÏWØt5jÔ(zõêÿú׿–}úé§qØa‡E»ví¢mÛ¶Q¯^½X½zu,X° ¾øâ‹˜;wnB¯;ï¼3N>ù䲿«Y³f<øàƒqÚi§% Qúúë¯ãoû[Ô¨Q#öØc�hÚ´i4hÐ òóócéÒ¥1oÞ¼˜0aB,^¼¸XûoÒ¤IÜyç�q饗þÆú«ììì¸ýöÛãž{î‰N�:EfffÔ©S'-Z3f̈±cÇ&ló«zõêE¿~ý¢råÊÅšksÒ¨Q£èÓ§OôîÝû·çsñâÅñè£�Æ£�>Z¤^Ý»wO¶TQUªT).»ì²èÕ«W²Y³fÅyç�[mµUì¶Ûn±å–[F•*UbñâÅ1sæÌøâ‹/Ba5j·ÜrKœp %škûí·�8 >üðÄe³gÏŽÙ³g¸mfffÒ ¶TqÌlºÎ:ë¬2dHdgg¯W1bD\tÑEæ·oß>ú÷ï½{÷Ž5kÖ¬·lÕªU1tèÐ:th4lØ0vÙe—hÔ¨QÔ«W/*UªË—/�e˖żyóbòäɱlÙ²?Žm·Ý6þóŸÿÄù矟4¼077·P!…­[·Ž{î¹'{채eÉÚJÓþûïgœqF<ùä“ ËfΜç�w^4jÔ(öÜsÏhÒ¤IdddÄÏ?ÿ'NŒ©S§Ø·mÛ¶qùå——æè¥®G�ñÔSOÅÏ?ÿ¼^=777 ƒŽÝvÛ-Z¶lµk׎eË–Åüùóc̘1±dÉ’„~7ß|s¼ð üB‰�IåÊ•£ÿþqúé§Ç”)S–O›6-.»ì²ÈÈȈÝvÛ-233£AƒQ©R¥ßž«I“&)p÷÷jÖ¬÷ÜsOœyæ™ ï¹¹¹Ñ¿ÿ4hPtìØ1š7oõë×�¬¬¬øñÇcôèÑ‘›››´oFFFÜsÏ=Q«V­b͵9©^½züë_ÿŠÓO?=V¯^+V¬ˆgŸ}6ž}öÙ"õÚ{ï½7º÷ŒË.»,F�•†¼xñâ¸êª«¢oß¾±ûî»G³fÍ¢Zµj±xñâ˜={vŒ3&á5[£F�èׯ_qÄ%š©^½zq 'ÄСC–-X° FŒ±Áí/ºè¢íC³lN}›½³Ï>;>øàƒ7n\²üüü?~|Œ?~ƒ=êÔ©�<òˆP�$š5kC† ‰óÏ??¦M›–t�•+WÆÇ\*û?ä�CâÎ;o¾9!81â—€¨>ø Ðý4h?üp´hÑ"•cnÒºví·ÞzkÜzë­1þ™nݺÅ�wÞ™âÉJßÁ={öŒÇ<éò¹sç&„'S»víxøá‡£víÚ)™«OŸ>q 'Äœ9sRÒ/•³›¦zõêE�=âÁ\¯ž——ŒûÀm÷ßÿxôÑGã’K.‰E‹%]gÑ¢EñÞ{ï¥räuìØ1žxâ‰èÝ»wÌŸ?¿ÈÛïºë®ñÀD­ZµbåÊ• ËË:è3"âúë¯�Õ«WÇsÏ=—tù‚ âÍ7ß,t¿¶mÛÆàÁƒ####U#–‹5jÄþóŸèÑ£GB(]Ä/×1Ÿ~úi¡Â]{õêÇsL¼ð ¥1j¹©[·n<ñÄqÑE%½¦ŽˆX³fMŒ5ªTö¿ë®»ÆÀ�ãÒK/Mz<6|÷W5jÔˆûî»/vß}÷T޹Ikß¾}Üwß}qÙe—ýöYTûì³O 80ªTÙ¸þ‰K»víâÚk¯�»îº+éò… Æ[o½õ§}ÒÓÓãþûï�–-[¦d®«¯¾:¾ú꫘4iRJú¥’c€ÍE¥ò ¼U©R%yä‘èØ±c±¶oÞ¼y<óÌ3ѦM›O¶éhÞ¼y<ÿüóqüñÇGZZZ‰ûµÇqÇ�>úhl¹å–%Úï®»îÏ?ÿ|´mÛ¶D}6G'�tRüßÿý_4nܸHÛÕ¨Q#nºé¦øÇ?þ•+W.¥éJ×ÕW_§Ÿ~z±·oÞ¼y<ýôÓ±ãŽ;¦l¦† ÆK/½GuT…|^³›¦³Î:+i0þÈ‘#cêÔ©Üv�=öˆáÇÇa‡–Ò™êÖ­»í¶[‘·Ûyç�cøðáqê©§Fzzz¡¶©W¯^\yå•1tèШ_¿~DD,[¶,a½_—•¥´´´¸ãŽ;âÆoŒêÕ«—¨×ñÇC‡�zõê¥f¸rÖ¾}û4hP±OzzzÜxã�Ñ»wïÔV�Ô¯_?ž|òÉ8ï¼ó }‹©S§Æ¢E‹"777jÔ¨M›6�6mÚľûî]»v�š5k®×cáÂ… }5jT¬yRáôÓO�8  ¯½öZ‘žßŽ;FïÞ½cÏ=÷,Å ËÇ>ûì/¾øbôíÛ7Þyç�B�#¥¥¥EçÎ�ãšk®‰Ö­[—Á”å+===®¸âŠèÖ­[<ôÐCñÆoDNNN‘zl±Åñ׿þ5N:é¤"ï¿M›6ñÒK/ÅÓO?�>úhüôÓO…Þ¶I“&qöÙgÇ©§žZì÷~ Å}õÕWãå—_ŽgŸ}6&MšTີk׎#Ž8"Î9çœØf›mÊpÊÒqÞyçÅ.»ì}ûö�‰'j›ŒŒŒ8öØcãòË//•€çjÕªý2üÖ[oÅ×_“'OŽ ÄŠ+båÊ•‘———òý–c€M]Z~yÞ‰ P-[¶,>øàƒøøã�cÊ”)±xñâXºtiT­Z5¶Øb‹hݺutîÜ9;ì°hРAy�»ÑZ¼xq¼ÿþûñÅ_ÄÔ©ScÞ¼y±|ùòX·n]T¯^=jÖ¬[n¹el·Ýv±ãŽ;FçÎ�£eË–)ÙwNNN|úé§ñ¿ÿý/&Mš³gÏŽ¥K—FnnnT«V-4hÛl³M´oß>öÛo¿Øm·ÝR²ßMÝé§ŸcÆŒY¯Ö«W¯èÝ»wÒõçÌ™“'OŽyóæÅÊ•+£J•*ѰaÃØa‡b‡vˆ´´´²»LåååÅG}ÿýïcܸqñóÏ?GVVV¤¥¥EÍš5#333Z·n{ï½wtÐA a`¹¹¹ñã�?&ôÝzë­#==½¬F™sÌ�ÌòåËã“O>‰qãÆÅ”)SbΜ9±dÉ’X³fMT©R%jÖ¬µjÕŠ¦M›ÆvÛm-[¶Œ]vÙ%Ú¶m[a‚ ÷Úk¯X¼xñzµ¾}ûƱÇ[>ýÎÒ¥KãÝwß�Ï?ÿ<¦N�sçÎ�ìììÈËË‹êÕ«G“&Mb»í¶‹ÝvÛ-ºví[o½uy�\&¦M›ï¼óNŒ3&fΜùÛk®zõê±Å[ÄvÛm»ï¾{téÒ%Z´h‘°ýܹscÕªUëÕêׯ¿É][fggÇ|ðÛëgöìÙ±lÙ²ßÎßjÖ¬�7Ž–-[Æ;ì{ï½wì¸ãŽ)¹ÈËˋѣGÇ'Ÿ|&LˆY³fEVVV¬Y³&222¢^½zѼyóhÛ¶mì»ï¾Ñ±cǨ\¹r õ¦íÚk¯�—_~y½Z·nÝâÿøGÒõ,Xß|óMÌ™3'²³³£råÊQ¿~ýhÕªUì´ÓNQ¥J•²»Ì�=:>úè£;vlüôÓO‘••yyyQ³fÍhÚ´i´jÕ*:uê]ºtIzÜO›6-¡¶ÕV[•Ê—?TŽY6E‚>€”(jÐ'ÀælÚ´iqÄG$Ô_}õÕhÓ¦M9LP°¢}lÎ*ÆWQlFž~úé„Z½zõb‡v(‡iHAŸehîܹñÒK/%Ô<ðÀHKK+‡‰HAŸe$'''þþ÷¿ÇŠ+–{ì±e?)%è �n½õÖøöÛo‹µíÂ… ãÌ3ÏŒ/¿ü2aY»ví¢S§N%€rV¥¼ØX¼þúëñôÓOÇ{ì‡~xtíÚ5š6mºÁmæÏŸÏ<óL :4–.]š°<---n¼ñÆÒ€2$蠈ƎcÇŽ�;î¸#š4i;î¸c4mÚ4êÔ©ééé±lÙ²X²dILœ81fΜ¹Á^½zõŠ]vÙ¥Læ t ú(�ùóçÇüùó‹µíÅ_½zõJñD”AŸe¬fÍšqóÍ7DZÇ[Þ£�B•Ê{€�ÅÕW_;vŒÊ•+kûš5kÆ\ï½÷ž�O€MP•ò`cqâ‰'Ɖ'žË–-‹¯¾ú*¾ú꫘6mZÌ™3'æÏŸ+W®ŒÕ«WGåÊ•£N�:Q¿~ýhذaìºë®Ñ¡C‡Øm·Ý"##£¼¥$-???¿¼‡€�]¥ò6‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ T)ï <½ôÒKqÝu×%Ô»uëÿøÇ?ŠÔë ƒŠ9sæ$Ôß{ï½hÖ¬Y±gÜœ 0 ˜PïÕ«WôîÝ»&bs3{öìèÒ¥KB=333Þÿýr˜ˆMÑÚµk£[·n1uêÔõêwÞygœp å4l^n¿ýö:tèzµÃ;,ú÷ï_NÀæÉ}�›û:)oîë¤,¸¯ÊßàÁƒ£_¿~ëÕÚ·oÏ=÷\¤¥¥•ÓTES©¼6~999±pá˜5kVL›6-~üñÇøùçŸ#77·¼G¨ð† –p3hË–-£{÷îå4›’uëÖEVVVÌš5+~øá‡X²dI¬[·®¼ÇÚ Õ«WÇÏ?ÿÓ§O�¹sçFvvväçç—ê>/ºè¢¨Q£Æzµ‘#GƘ1cJu¿¥Á}�Åç¾NJS^^^,[¶,fÏž3f̈ŋÇÚµkË{¬ úõúbÆŒ1{öìX¶lYäåå•ê>{ôèM›6]¯6~üøxå•WJu¿©T¥¼6. .ŒÑ£GÇ—_~'NŒÙ³gÇÂ… “拉¥Eƒ ¢E‹ѺuëØm·Ý¢C‡ѤI“r˜€ò¶lÙ²øé§ŸÊ{Œ ª^½z4oÞ¼¼Ç`3²xñâ0`@Býïÿ{T®\¹Tö™““S§N� &ÄÂ… “®Ó¡C‡èرc©ìS‘��“&MŠI“&ÅŠ+’®Ó­[·hÖ¬Y™Í´xñâøì³ÏbÒ¤IñÝwßÅwß}óæÍK8WOKK‹:uêÄŽ;î»îºkì¶ÛnÑ©S§¨Zµj™Íú«¬¬¬xÿý÷ã믿ŽñãÇÇ÷ß999 ëUªT)233£]»vÑ®]»Øo¿ý¢U«V)›c‹-¶ˆ3Î8#|ðÁõêwÞyg¼üòË¥v<””û:(.÷uB¢ò¸¯³ yyyqÊ)§ÄW_}Uà::tˆ§žzªì†ªÀV¯^ß|óMLœ81–.]št�®]»ÆŽ;îXf3-_¾<ÆŒ&Lˆï¾û.¦N�³gÏN’Y«V­hݺõo÷uî½÷Þ _`^V®\|ðA|ùå—1a„˜2eJ¬Zµ*a½´´´hܸq´k×.Ú·o{íµW´oß>esdddD¯^½âÆo\¯þ¯ý+>øà¨U«VÊöPZ}jÍš51|øð>|xŒ;¶Ðߺ˜ŸŸ‹-ŠE‹ÅرccذaѶmÛ8ì°Ã¢[·n±Å[”æèT ï¾ûn\wÝuå=ƹÙ�²ö¯ý+–-[¶^m×]w�®]»¦¤^^^LŸ>=&L˜ðÛŸÉ“'' Rü½^½z úü�5kÖÄäÉ“×{g̘ñ§çÅ:t(Õ Ïüüüøâ‹/âÝwß�Q£FÅ”)S’þC­dÛ-]º4>ûì³øì³Ï""¢Q£FqÒI'ÅÉ'Ÿ�5*µ™5qâÄxòÉ'cäÈ‘±fÍš?]?///fÍš³fÍŠ7ß|3úöí»í¶[œ|òÉqôÑGG¥J•J<Ó¹çžÏ<óLdeeýV›2eJ<óÌ3qÚi§•¸?@ª¸¯€Tp_'$*íû:‹bذa ùÜœåææÆwß}·Þ}�ßÿ}¬]»vƒÛeff–zÐç¤I“âí·ßŽQ£FÅĉcݺu…Ú.;;;Æ�ãÆ�‹ÁƒGíÚµã¸ãŽ‹=z”IàñŒ3âÉ'ŸŒáÇGvvöŸ®ŸŸŸóçÏ�ùóçÇ»ï¾mÚ´‰O<1N8á„”|ù|÷îÝcðàÁ1cÆŒßj ,ˆAƒÅÕW_]âþ¥MÐ'P œœœxüñÇãñÇ�E‹¥¬ïĉcâĉѿÿ8ì°Ãâ /Œ–-[¦¬?Pú^z饘3gNB½[·n¥h°)ùþûï㥗^J¨_xá…ÅîùÓO?Ÿqãb„ ¿�s­\¹²$cn–¦L™ãÇ�ÿíyœ:ujäææ–÷X¿™±óÎ;—¨_åÊ•ã¼óÎK¥~ê©§âŒ3Έ¦M›–¨?@iô $5jÔ¨¸õÖ[Sö?˜“ÉÍÍ�×^{-Þxã�èÞ½{\qÅÑ AƒRÛ�:/¿ürŒ3&¡Þ¡C7„Òý÷ߟt¸Ã;Äþûï_ìž·ß~{¼÷Þ{%m³wÚi§ÅòåËË{Œ 4(Þzë­Ré½zõê¸óÎ;ãÃ?Œ~ýúEÆ SÖ{Ö¬Yñ·¿ým½oVO…qãÆÅ±Çwß}wyä‘%êuÚi§ÅàÁƒcÕªU¿Õ-ZC† ‰óÎ;¯¤£›û:� q_'@É•Æ}�Åuûí·ÇŠ+Ê|¿Õ%—\“'O.ï1 4lذxôÑGK¥÷ºuëâ�ˆ�?þ8î½÷ÞØf›mRÖ{É’%qá…Æ—_~™²ž¿„æž|òÉqÕUWÅÙgŸ]¢^G}tôïß?~úé§ßj9991hР¸ýöÛK:*@©ªTÞK^^^ 80Î>ûìR½ô�û|á…¢{÷îe²?€òöÍ7ßÄÛo¿�P?÷ÜsËaHôé§ŸÆi§�óçÏOI¿ùóçG�=Ròù«5kÖÄ•W^#FŒ(QŸ ÄñÇŸPûì»í¶[´jÕ*š5kõêÕ‹êÕ«ÇÚµkcÅŠñóÏ?ÇÌ™3câĉ1f̘˜0aB·›þžà`sqÿý÷G~~þzµ-·Ü2Ž8âˆršˆMIffftîÜ9Ú·o­[·ŽÌĮ̀]»v¤¥¥Å’%KbîܹñùçŸÇÈ‘#cÒ¤Iö™1cF\xá…1lذ¨V­Z±çY·n]\zé¥ë}›úU®\9ºvíûï¿´oß>¶Øb‹¨]»v¬Zµ*–,Y“&MŠQ£FÅk¯½+W®LÚ#///®½öÚØa‡b»í¶+ö¼g�uV :t½k—¬¬¬xâ‰'ââ‹/.v_€¢r_'@Ù¨(÷ufggÇwÜQ¦û¤ô5jÔ(öÞ{ïØyç�£M›6ѬY³¨S§NT©R%²²²bþüù1vìØxï½÷b̘1öY¸paœwÞyñüóÏGÆ K4Ó 7Ü“'O.pyZZZtîÜ9ºví»ì²K4iÒ$j×®kÖ¬‰¥K—ÆäÉ“c̘1ñÊ+¯DVVV�}úõëmÛ¶�:{ÖO<1þóŸÿÄòåË«åææÆ Aƒ¢OŸ>Åî PÚ}ñËÍ —^zéŸ~ëçÎ;ïçž{npÀQµjÕ¤ëT®\9222¢AƒѦM›8ì°Ã""bþüùñÚk¯Å°aÃbΜ9) PÝ»w�îÝ»—÷ wïÞÑ»wïòƒIÅñ6{öìèÒ¥KÒe½zõJùë¥Y³f1eÊ””ö„iӦŇ~˜P?þøã£J•²ù_7ÕªU‹wܱԾ…{sQ¯^½hÚ´éot,+�7ŽcŽ9&þú׿FëÖ­ \¯I“&ѤI“Øu×]ã¼ó΋O>ù$n¹å–ÏÏ'Mš÷Þ{o\wÝuÅží™gžÙàk­C‡q÷ÝwG³fÍ–Õ®];j×®[o½u~øáqÕUWÅ?þñ�xá…’öZ½zuÜqÇñØc�{ÞÌÌÌØgŸ}âã�?^¯>dÈ�øÛßþVàu@*¹¯“Í•û:+6÷unZÜ× ¿¨÷uþêŸÿügüüóÏëÕš7oõë×�ñãÇ—é,£š5kF‹-bâĉå=JÔ­[7Ž>úè8úè£cç�wŽ´´´¤ë5jÔ(5jmÛ¶�ž={Æ×_7ß|s�÷¦Î™3'n¹å–8p`±gûè£�bäÈ‘.oÓ¦MôíÛ7Ú´i“°,===jÕª™™™Ñ¥K—¸üòËã�ˆ‡z(é—äççÇ-·Ü¯¿þzT®\¹XóÖ¬Y3Ž:ê¨xúé§×«><.¿üòhÔ¨Q±ú”¶Jå=P1Üu×]¼´Q£FÑ¿ÿxî¹çâ�C)V¸M“&MâÜsÏ�·ß~;úôé㤛¥'žx"á[ß+W®Ç|©ì/===vÚi§8餓âŽ;îˆW^y%¾øâ‹xæ™gJe›ªš5kÆž{îgŸ}vÜ{ï½ñÎ;ïÄèÑ£ãúë¯/×¹vÚi§ø÷¿ÿï¿ÿ~\yå• ùLfß}÷�—_~9:vìXà:O=õT̘1£Xó­[·.zè¡—}ôÑñÄO$ ùL¦víÚq×]wmðyÿßÿþWâšO8á„„ÚâÅ‹cøðá%ê PXîë(e}_gAÆ�—ôÞΛnº)ªU«V¦³l 222b—]v‰=zDß¾}ãÍ7ߌ±cÇFÿþýËu®m¶Ù&n¿ýöøè£�⦛nŠ]vÙ¥À�ÏdvÞyçxî¹çâÈ#�,p�wÞy'F�Uìxà�—uèÐ!ž{!ŸÉT«V-.¿üò¸ÿþû£R¥ä6Ó§O�·ß~»X³þ*Ù}�¹¹¹1lذõ(Meûõ!@…ô /lðlîºë®1pàÀØb‹-R²¿*UªÄqLJzhÜ{ï½1dÈ�”ô¨è–,Y¯¾újB}ß}÷�¦M›–¸åÊ•£eË–Ñ®]»ßþì¸ãŽÅúÇ<›³jÕªÅvÛmmÛ¶ýíyÜn»í ¼±<´nÝ:.»ì²èÒ¥K‰{Õ­[7 §œrJL�:5aùºuëâÑG�;Ƚ?ûì³øé§Ÿ’.kݺuÜ}÷ÝÅz^Ï<ó̘8.¾øâ0`@Ò寽öZ~øáEîû«¿üå/±ÓN;Å7ß|³^ýÙgŸ� /¼Ð½Ò@…Tq®Z€r1wîÜèÓ§O�Ë;uê=ôP±þ'ퟩU«VÜtÓMѹsç¸îºëbݺu)ß@EòüóÏÇêÕ«êÝ»wOIÿûÄ7ñÑGUèçñ¼ó΋wÜ1¥3ÖªU+î¾ûî8þøãnŽˆ1bDÜ|óÍ‘žž^¤¾Ý`q饗¹ßï]~ùåñúë¯GNNN²Ï>û¬Ø}#"ÒÓÓãè£�ŽÇ{l½úäÉ“c̘1Ñ¡C‡õ(ˆû:ÊNiß×YX=ôP|÷ÝwëÕjÖ¬7ÜpC™ÎQQ=÷Üsú¾ÎcŽ9&.¿üò”†M¦§§ÇÝw߇zhÒ×è¨Q£bÁ‚ѨQ£"õÝÐ}�çŸ~Ô©S§È³þêÜsÏ�§Ÿ~:áKÖ#"F�ùùù‘––VìþÝ»wOú\´hQ¼ñÆÑ­[·b÷(-•Ê{ |ÝvÛm±bÅŠ¤ËZµjƒ *•›Aï ƒŠgžy&š7o^ªû(o/¿ürB­zõê±ß~û¥¤E¾‰qcRџǶmÛ–ÊŒmÛ¶�.]º$]¶|ùò˜0aB‘{N™2%i½F�±ÿþû¹ßï5nÜ8vß}÷¤Ëf̘QâpvÈ!‡$­';ŽRÅ}�e§´ïë,Œ3fă>˜P¿ôÒK£I“&e6GEVÑïëlÓ¦MJC>Õ´iÓ8餓’.ËËË+Ö—¢t_gDÄá‡^ä~¿W­Zµ8à€’.ËÎÎŽŸ~ú©Dý9ä�¤A¡îë**AŸ°;vl|øá‡I—eddDÿþý£fÍše2K‹ÿ�½û �ªjß>|¥„Š¡ z•"ˆô"JQº RRéATDADTŠé"Eé-„JH}?ø’¿Ãì�Ìdf’~çqøaîµ÷½VÊLse­§µxñâ™ i_TT”BBBtúôi]¸pAwïÞMí%à°#GŽèôéÓVõZµj)C† ©°"ÀZƒ LÇþúë/»û…„„ÖK—.-///»û=ªB… †õèèhݾ}ÛáÞF'ÝoܸQ÷ïßw¨7!׉´Š\' =J+¹ÎQ£F)**Ê¢VªT)½þúë)¶¤]‰å:�;fw?³\g`` råÊew¿G™å:%)44Ô¡Þ¹sçVÙ²e­ê{öìqxQpÏÔ^H=sæÌ1ëÞ½»žyæ™\�äïïï”>111Ú½{·öìÙ££G�êÂ… ºyó¦"##åî3*Ož<*X° *V¬¨š5kªhÑ¢N™;¹îÞ½«­[·jÇŽ:yò¤._¾¬{÷îÉÃÃCY²dQ‘"ET±bE5kÖLO?ý´Ýý¯\¹¢Ÿ~úIЉ'tëÖ-…‡‡ËÛÛ[*Z´¨jÔ¨¡&Mš(kÖ¬Îÿ“¯�;wjãÆ�Ú»w¯Î�;§˜˜‹kræÌ©Š+ª^½zjÔ¨‘|||R|�©íêÕ«Ú·oŸN�:¥Ó§OëìÙ³º}û¶îÝ»§û÷ïËËËK™2eRîܹU @•.]Z5jÔPÉ’% O-µUtt´Îœ9cQ‹ˆˆ0¼öâŋʖ-›Í½ýýýÓÌ)Ãþù§vîÜ©C‡éܹsºvíš"""¯ 2({öì*P €Ê”)£jÕª©R¥JrwOݳ”<¨_ý5!dvûömÅÄÄ([¶lÊ‘#‡ ,¨Úµk«víÚ†•!m»qã†~ýõWýþûï:uê”BBB.///ùûû+((H•*URóæÍ•'O»ûŸ>}Z?ÿü³>¬S§N),,LòññQž>ÞjìÒ¥Kv÷{œs�’ôâ‹/êСCµøøx­]»V={öt¸?8“[¼Ñ¿æ@ºwúôi5jÔÈp,kÖ¬Ú²eKІ?œáæÍ›Z¼x±V®\©›7oÚuoñâÅÕ­[75mÚÔ)aˆŽ;Z…-$iÉ’%ªZµjÂã;wîè£�>Ò7ß|c°{T½zõ4bÄ&yí‰'4kÖ,mÙ²Åð—ú�òõõU—.]Ô»woy{{Û´3/¼ð‚ah`óæÍÊ—/_ÂãmÛ¶iÚ´i:yò¤Í½³e˦¾}ûª]»v½V¯^­aÆYÕ[µj¥I“&ÙÕËÖ�ÙV±±±úý÷ßõóÏ?k÷îÝ:{ö¬Ý=$)_¾|êСƒ:tè�¬“…/^¼¨zõê%kî¤$õyž3gŽæÎ�kUïÓ§�úöíëðüQQQúöÛoõÅ_X…^“’+W.µoß^�:u’ŸŸŸÃk±çcÝ´i“æÌ™£ãÇ�ÛÔÛÝÝ]/¿ü²ú÷ïŸhpæq�Ø÷£³¾/l™/00P¿þú«]½l}� ÑìÙ³µvíZ›ÂLjÑ¢…Þ}÷]›VûöíÓ¬Y³´wï^›Öíïï¯^½z©S§N. AÇÆÆjݺuZºt©Ž9b×½™3gÖË/¿¬7Þx#MŸãããõÜsÏY�Díææ¦]»vÙ¦w¦bÅŠÖ�ý|:yò¤^yåÃp`¾|ùôý÷ß;åµtîܹ¦ôÔ±cG½÷Þ{Ïñ¨Ý»w«S§N†c�¾÷{Ü»wOÏ>û¬áXÛ¶m5vìX»úµhÑÂðçÕK/½¤Ù³g'k�ÿµlÙ2Ó5r¨7ü¹NKä:ÿE®óÿ�ëü?ä:�‘ëLä:­‘ë$×i«ëׯ«qãÆº}û¶E½C‡zÿý÷-jfïeªT©¢¥K—Ú=whh¨Z´h¡7nX�ùûûkÍš5zê©§ìîû¨5kÖhÈ�!†c/¼ð‚>þøc‡çxTb¯K'NTëÖ­�>§«U­ZUaaaVõZµjiáÂ…võêÕ«—6oÞlU/S¦ŒV­Z•Ü%&غu«Þ|óMñõë×;|xÁßÿ­&MšXÕK”(¡5kÖ8Ôœ-u�%©&±_¾¶oßþ± ƒÆÇÇ뫯¾Rýúõõé§ŸÚ•¤ãÇ�kðàÁjÕª•ÝA”äÚµk—7n¬Å‹Û•þ 5kÖL¿ýö›é5qqqš7ožZµj¥_ýÕ¦0¨ôïÉœŸ|ò‰^}õU]»vÍæ5%Gll¬ÆŒ£ž={Ú•¤[·niìØ±êÔ©“BBB\´ÂÔ5qâD=÷ÜsêÖ­›V¬X‘ì0¨ôoPeÊ”)jذ¡¶lÙâ¼E>ævïÞ­¦M›jôèÑv‡A%éÚµkš={¶êׯ¯~øÁ+´v÷î]õíÛW½{÷¶9 *ýûš°råJ½øâ‹Ú¶m› WG­_¿^Mš4Ñ·ß~kó‰Å±±±Z½zµš7o®£G�š^¥±cÇêµ×^³9 *I·oßÖĉÕ½{wÝ»wÏæûlµ{÷n5iÒDƒNÖÏà»wïjñâÅjذ¡–/_îôõ9Ëñãǭ ’T´hÑTÛä3%þ†ôïÏ©‘#G:<Ǿ}û4oÞ<ñ%JhðàÁÏñ$Hì�‚’s~ YP=9ïÙ�\¿~ݰž%K‡7ù”¤gŸ}Öð�víÚ唓åà!r�–Èuþ‹\gÚA®ÓõÈu"-"×I®Ó•Æ�oµÉg@@€‚ƒƒ]>w@@€&Mš$777«±Û·okàÀ�Š��uh޳gÏj̘1†cyòäÑĉêÿ$ñòò2¬?N¹N777åÊ•ËáþÏ<óŒáÇpüøq—¿_{±Ñ'O¨�7šŽ½üòË)¸ÇDFFª_¿~3fŒÂÃÃîwâÄ µoß^+W®tÂêÌ­[·N=zô0 †Ø"<<\o¿ý¶a°+::ZýúõÓìÙ³“¬øë¯¿Ô±cGÃ?�!66Vï¼ó޾úê+‡úìÛ·OíÛ·×¹s眴²´ã›o¾1<×!!!zûí·M7A{’ÌŸ?_]ºtqÊ÷έ[·4hÐ �5Ê¥~]¹rEíÚµKôõ;)áááêÝ»·~ùå'® β`Á 8PwïÞMÖý¡¡¡êر£þüóO«±{÷î©sçÎZ¶lY²×·sçNõìÙSQQQÉîñ_qqqš1c†:uꔬPö£ÂÃÃ5zôh 4Èikt¦ÿýï†õ*Uª¤ðJRO»víÔ°aCñ 68ôþ+,,Lƒ 2|ï“1cF͘1#Ñ ,ñÌ–’äççgw¿Ò¥KÖÿüóO§üÜr�®E®“\gZD®Ó1ä:·mÛ6mذÁª>tèPeΜ9EÖP»vmuíÚÕplÿþýúðÓÝ;**JÁÁÁ†›§{xxhÚ´iÊš5k²û?IbbbLß:3×yùòe§l”i–ë,R¤ˆ²dÉâpIª\¹²U->>Þôy ©…�>x�>}Z.\0+]º´òçÏŸÂ+Jžû÷ï«gÏžúùçŸ�Ú7::Zï½÷ž/^ìÔ¾mß¾]C† q88£àà`�?>¡¯�:{èìÙ³5j”Ã}ŒLœ8Q›6mrJ¯K—.©k×®NO¦Wñññš={¶æÏŸŸÚKI5Ó¦MÓôéÓçÔ¾+V¬Ppp°bbbœÚWú÷tÜnݺéï¿ÿv¸Wtt´¨³gÏ:¾08ͪU«4uêÔd�ªü_êÝ»·ÅéÞ<Ðo¼¡ýû÷;ºLýñÇš9s¦Ã}bbb4`À}úé§÷zÔ?ü þýû»ä¹è³à˜QÐ,=?~¼MÇþùçŸdõ1b„®\¹b86räH.\8Y}ŸDÇŽ3Ë—/ŸÝýªW¯nX×o¿ýfw¿ÿ Õ¾}û ÇêÔ©ãPïÿªZµªa�@(g!×™8r�ÿ"×™>‘ë$×I®3m"×é<ä:­EDDh̘1Võš5kªiÓ¦.Ÿÿ¿‚ƒƒU¶lYñùóçë÷ßOVß©S§nr+Io¿ýö—ŸuÄßÿmú>Õ™¹ÎøøxýôÓOv÷û¯û÷ïkË–-†cä:<‰ûì³D¯ TãÆ�U¢D åÎ�[^^^ ÑéÓ§µ~ýz�0 ^%W\\œ‚ƒƒuúôi‹z† TµjUÕªUKùòåSŽ9«7nhÿþýÚ¸q£iøÿÁƒ9r¤ás)ïøñã=z´U=((HõêÕS‰%”3gNy{{ëÆ�:|ø°~þùgÓ€ð•+W4{öì„PÿرcuàÀ‹k|||TµjU=ÿüó ß?<еk×´}ûvmܸÑôú¥K—êå—_Ö3Ï<“ì�yÈ�!‰ÁÜÜÜT¶lYU©RE¥J•R¶lÙ”%KݹsG¡¡¡Ú»w¯¶nݪ��Ãû7oÞ¬I“&é½÷ÞKö�)::ÚôtêR¥J¥ìbRYæÌ™5cÆ ½öÚkVï‡"##Õ¿­ZµJ>>>6÷üòË/MÿФY³fjݺµCk~ÒlÛ¶Ít¬dÉ’v÷«^½º ,¨sçÎY�Íž=[µk×–———Ý}%iÖ¬YŠŠŠ²ªûûû«eË–ÉêiÄìôú¤þ-¶"×I®“\çã‰\§ãÈuþ‹\gÚB®Ó¹Nçš={¶.]ºdQóööÖûï¿ïò¹ååå¥3f¨eË–ºwïžÅX\\œÞ}÷]}ÿý÷Êž=»Í=·lÙ¢%K–ŽU®\Y½zõrhÍOš­[·šŽ%'×Y°`AU«VÍp×O?ýT­[·–ŸŸŸÝ}%iÑ¢E†ïc===õÚk¯%«§r�lô ÀÈìTLIªT©R ®$ù–.]šè‰ïÅ‹ׄ LCM›6ÕàÁƒõí·ßjâĉ 7¼î½÷ÞSéÒ¥U°`A§¬{Ê”)§ñæÍ›WƒVãÆ� ¯þùçÕ³gO­_¿^ï½÷ž"""¬®Ùºu«öïß/OOOÍ�;×b¬nݺ:t¨ *dØÿÅ_Ô€4aÂ}ûí·¦kþþûïmü“6mÚ4‹ÇY²dÑÈ‘#Õ¼ys«kóçϯüùó«zõê8p Æ�¯Õ«WöÝ·oŸ.\¨=z8m­i�»»»*Uª¤Æ�«aÆ6d:tè èèhýôÓOš1c†._¾luM\\œF�¥ 6$¹¹V¾|ùtâÄ ‹ZÇŽ CK–,1=5µ=zT“&M2Ïž=»FŽ©F�ÉÍÍÍðš·ÞzKûöíÓðáà 7,“¤¯¿þZUªTqZ˜|ÕªUºvíZÂcOOOµk×N½{÷6ý~¨_¿¾‚ƒƒµtéRM›6Íðì={öè×_Õ /¼à”u"ùF�mqÊò3Ï<£áÇ›†ñëÔ©£>}úhÙ²eš4i’á×÷믿Öo¼¡Ã‡kÕªU u777µlÙRÁÁÁÊ•+—aÿÆ�kÀ€9r¤á‰ÊÑÑÑš1c†æÍ›gï‡*Iúì³Ï´nÝ:ÓñfÍšé­·ÞJ4pÚ¬Y3ÅÄÄhùòåš;w®á ,]ºT5jÔHßã'Ož4ÜŒ0cÆŒÉ:IûqW¾|yõë×OÓ§O·;yò¤&Nœh’6rüøqMž<Ùp¬@�6÷Á¿îÝ»§ 6Žùùù™#ãææ¦^½ziÈ�!Vc'NœÐˆ#4yòdÓŸ½f–-[fñúö_TÆŒí^«™bÅŠÖOœ8¡èèèdoT ‘ë$×ù¹Î´�\§ó�ë´D®3í ×i‰\§s=zÔpSß7ß|Óiïoì•?~}ðÁ0`€Õصk×4tèP}úé§6åüBBB4tèPñ¬Y³jÚ´iòððpxÍOЏ¸8Ó÷„îîîÉþß§OíÞ½[ñññõëׯ«OŸ>š?¾¼½½íê¹yóf«÷¾uïÞ]O=õT²Öj¤hÑ¢rss³Zÿ�7tåÊåÍ›×is€#Òï1XÀÔ_ýe:f¶‰MZrõêU͘1Ãt¼uëÖZµjU’'©º»»ë•W^ÑÚµk•?~Ãk"""œºAÔOâ.S¦ŒÖ¬Ycý¯&Mšè“O>1 î-]ºT£F�R\\\BmàÀ�úä“OLàùùùi„ zùå— Ç�?žè÷Œ½þ{Êk@@€V¯^m5ZçĉN262oÞ¼DO;œxxx¨yóæZ¿~½–.]ªöíÛÛu ®———š5k¦µkך†¡ÎŸ?¯5kÖ8iÅiÛÃìCwÿU²dI­[·N�7N2€T©R%}ÿý÷ª[·®é5ãÇ�·;â¿aÐL™2iÁ‚9rd’ßžžžêÚµ«f̘!wwãÿlúAÊúïëV�:u´zõjÓ0èCîîîêØ±£&Nœh8«E‹iüøñ 5OOOMž 9sæ¨V­Z†ãÛ¶mÓÍ›7íaäøñãš={¶áXæÌ™õÑGiÚ´i6�*ïé驎;jÅŠ¦¡Ê±cÇêÁƒv¯ÓÙÌþ'((ÈîÍ Ó‹=z˜~-_¾\7nL²GDD„ `¶}xÂ|rOR-[¶Ìâ½Ú½øâ‹ÉÞвeË–¦?7¿ÿþ{uëÖÍðXŒÜ»wOï¿ÿ¾ÆŽk8Þ°aCµmÛ6Yë4S¨P!ÃÀêƒtêÔ)§ÎàÉD®ó_ä:ÿE®3m"×é\ä:Éu¦eä:ÿE®Óùbcc5räHÅÆÆZÔ *¤ž={ºl^[4nÜX¯¼òŠáضmÛ´xñâ${ÄÅÅiРA†½JÒ„ ”'OVùäÙ°aƒÎŸ?o8V¹re$«oåÊ•õú믎íÚµKmÛ¶ÕÉ“'mê¥9sæ¨oß¾VßÛ’T¡BõéÓ'Yë4“1cFÓ/=zÔ©s€#Øè€'�Ù/yýüü”;wî^�ýæÎ�kxº$Õ«WOãÆ�³k¢|ùòiáÂ…Ê‘#‡áøÎ�;õÛo¿%k­f‚‚‚´xñbeÍšÕæ{ªV­ªvíÚŽmذÁ"´9`À»ƒ#FŒ0ý%ÿÚµkíêe‹Œ3êÓO?5ý庙×^{Íôc‹ˆˆÐüùó�±¼T÷ÝwßiêÔ©*\¸°C}2gάٳg«J•*†ã_}õ•CýëÖ­3 d(P@ ,0} 0’!CÍš5K*T0¿qã†>ûì³d­ÕŒ———>ÿüsU¯^Ý®û6l¨6mÚŽ%7Ôר^½ºæÎ�+›ïiÞ¼¹i8yéÒ¥�âI“&©E‹6÷öòòÒ¸qãäëëk5£ 6ØÜë¡1cƳ3dÈ Ï?ÿ\õë×·»g¡B…ôå—_þL½råŠV¬XawOg3{ý±%øš^¹¹¹iòäÉÊ™3§áø{ï½—äÆ�|ð�NŸ>m86pà@•)SÆáu>IBBB}Õ±cG‡úOŸ>]åË—7Û¹s§4h ~ýúé»ï¾Ó?ÿü£Û·o+66V÷îÝÓ… ôóÏ?ëý÷ßWíÚµõõ×_ö©[·®¦M›æÐ:�xxx¨H‘"†cfÏo°¹NKä:ÿE®3m!×é\ä:Éu>Èu’ët¶Å‹ëرcVõÑ£GF�ÒFŒaú9˜>}z’(Λ7O{öì1ëØ±£êÕ«çðŸ$‰n¦ß©S'‡ú:Ôô9~ìØ15oÞ\o¼ñ†V¬X¡ãÇ�ëæÍ›Š‰‰Qxx¸._¾¬-[¶hòäɪ]»¶æÎ�k¸Ég¹råôÙgŸ¹äû;((ȰÎFŸÒ6úà ©;wîŽ='c†„„˜žT )S¦ÈÃÃÃî¾ ´8÷QÎ vyyyiòäÉòóó³ûÞ7ß|Óôç‡*Uª”¬Ó\3eÊdú‹þíÛ·ÛÝ/)o¿ý¶J•*•¬{ûõëg Yµj•Åéò�+{ƒ²‰ñööÖäÉ“ ÃÇŽ3Ý$-=1{»¹¹iúôév…AòõõÕ‡~¨Œ3Ž/_¾Ü©ß‹ýúõS¹rå’uoÿþýåééiU�ŽŽÖüáèÒàY²dѤI“ìúƒ†‡zõê•ä5M›6U³fÍìî�7o^µlÙÒpÌÞŸ ¿ýö›öïßo86iÒ$‡6eÌ›7¯éÏñ%K–(>>>Ù½�áìÙ³†õ¼yó¦ìBÒ˜œ9sjÊ”)rss³»}û¶¨˜˜Ã{×­[§Õ«WŽÕ®][]ºtqæRŸï¿ÿ¾éÏ­zõê©dÉ’õÏ”)“.\¨Æ�ŽÇÄÄè§Ÿ~ÒСCÕ¸qcU©RE%K–Ô³Ï>«úõëë�wÞÑ×_­ððp«{½¼¼4pà@Í›7Ïeag³çë™3g\2€'¹Ncä:Éu¦5ä:�‹\'¹Î´Ž\'¹Ng»pá‚æÌ™cUoÚ´©Ý»J† 4sæLÃÍd£££lú:ºoß>Í›7Ïp¬xñâ}º.]ºd8V²dI‡7NõôôÔÌ™3M‚���×ÿþ÷?�5J-Z´PõêÕUªT)U¬XQuëÖÕ[o½¥E‹éÖ­[V÷º»»«sçÎúòË/•9sf‡ÖiÆìùjöü€ÔÀFŸ>^W®\1c£Ïõë×O*T0›?¾~ÿý÷„ÇO„·ºÖÝÝ]S§NUöìÙ]¶ÖôèðáÚ4i’éxß¾}U @§ÎÙ¨Q#ýðÃZ´h‘š4i’¬%K–Ô¼yó4jÔ(ÓSÙ�ÉìùzéÒ%—Ï }#×™8r�ä:Ó3r�–Èuþ‹\gê#×I®ÓÙÖ®]«íÛ·[Õ �&7vo×®�醲?üðƒ¾ûî;‹Úˆ#L?§#GŽTáÂ…�¾ÆôìâÅ‹:t¨âãã ÇÛµk—èkLrT¯^]+V¬ÐòåËÕ¶m[Ãט¤(P@3gÎÔ¤I“Lß:¹N�6úà sÿþ}Ó±´~Bæ­[·LO(nÖ¬™SN£,[¶¬ž~úiÃ1gœŽýÌ3Ï(((È¡‰…œqr®Ù/Ô/^¼èpoéß^ãÆ��ÒˬÏÞ½{ Oƒ}ÒU¬XѰḭ̂oZdŠ’¤gŸ}V���÷÷öö6}îýñÇzðà�Ãs8ã9cöÚC�%õU«VÍá� ]ù³ÁÛÛ[ùòå3³õgÖ-[gU/X° Ê–-ëÐúþ«zõê†ïvïÞí´9ìuãÆ EGGŽ¥ÅpfjðôôÔôéÓ ÿ8)..Nï¾û®nÞ¼)Iš1c†Ž9bاgÏžª^½ºKךބ„„¨wïÞŠŠŠ2¯X±¢ºwïîôycccµ~ýz-\¸P7nLV�cÇŽ©cÇŽzá…´lÙ2§ü¼MŒÙóÕ,œ ¶"×™8r�ä:Ó3r�–Èuþ‹\gê#×I®Ó™ÂÂÂ4qâD«zÙ²eÕ®];§Ïç,ãÇ�7}M;v¬Îœ9#IúòË/µiÓ&Ãëš6mªÖ­[»l�éQxx¸Þ~ûmÓM{ ,¨Áƒ»dî-[¶hÁ‚úþûï“õ¾íüùózûí·U«V-}üñǺwïž Vù ë7nÜ0ÍÅ@Jc£Ož0f�éßM–Ò²ýû÷›žH鬀¡$5iÒİ~èÐ!‡C†åË—wè~I‰ØÊ•+ç²þwïÞu¸·$•,YRO=õ”Sz5hÐÀ°®'N8eŽô$C† ʘ1£U==ïÞ½kxM‰×�èèÑ£õΟ?¿C§v?T°`Aú«4Hš«6¸²¿­?vìØaX¯W¯^²×d${öì†ØqâĉTûC�Äžc¾¾¾)¸’´-00PãÆ�3»v횆ªmÛ¶éóÏ?7¼¦B… êÛ·¯+—˜îDFFªW¯^ºvíšáx¶lÙ4sæÌd�Êž˜M›6饗^Ò Aƒ´cÇŽDÿ}b‹Ë—/kìØ±jܸ±8à¤UZË�!ƒa=<<Üesx2�ëL¹Nr�é¹NKä:ÿE®3õ‘ëtr�ÒäÉ“;ÈÃÃCcÇŽ•»{ÚÝî#sæÌš1c†áûшˆ 0@‡ÖäÉ“ ï/P €ÆŒãêe¦+±±±8p Nžûl²{;ëûØÏÏϰN 4õ9ãklöÚ�-[6åÎ�Ûeým A™£‹/žì5™É�;·NŸ>mQ{ðà�._¾¬üùó;}¾¤$vc£OK 6T»víôõ×_[�mÛ¶M;wî4|MÏ’%‹¦OŸžæÿ¸)-‰‰‰QÿþýMŸ›^^^š1c†òäÉã´9£££5nÜ8ïïCO?ý´jÖ¬© *(GŽò÷÷WDD„ÂÂÂtòäIíÙ³G{öì1 x_¼xQ¯¿þºF�¥¶mÛ:mÝ™=_ ´¹Î¤‘ë$×™ž‘ëü?ä:ÿE®3õ‘ët®'9×ùûï¿kõêÕVõ×_Ý)ï\­|ùòêׯŸ¦OŸn5ö×_©C‡†ïWfÍ^ç`l̘1‰nŒ9f̧ßÌ�;WóæÍ3Ýx÷©§žRÍš5õì³Ï*W®\Êš5«¢¢¢¦Ó§OkÏž=Úµk—­ >\û÷ï7üC ³?^úàƒèꥥñññ1b„¶nÝj8îææ¦ñãÇ«F�N›3&&FÔÏ?ÿl8¤àà`Õ­[×´GýúõÕ«W/�?^óæÍÓwß}g8Ïûï¿/oooµjÕÊië—Ìÿ—nÿ°@Ê ×™4r�ä:Ó2r�ö!×ùÈu¦]ä:�ëIÍu>xð@ï¿ÿ¾U=wîÜzç�wœ6�«õèÑC»wïÖöíÛ­ÆÌr�ÁÁÁNݼùI0{öl­X±Ât¼ÿþNÏEN˜0A_|ñ…áØSO=¥þýû«iÓ¦òðð0¼¦nݺêÞ½»BCCµ`Á-Y²ÄpƒíyóæÉÓÓS½{÷vêú{Ÿôè&ê�ZØè€'Lb§†ß¾};Wb¿k×®Ö h PÖ¬Yfól•9sf‡î—$wwwÃz–,Yî-Éô—ðF¿pOŽ‚ :¥ÏûBCCC�:OjºvíšV¯^­uëÖéÔ©S.™ÃèÕôÀì9èôlÑ¢E ÃŸŽ¾nøûû;tÿC®~n#ùÒûφ˗/›ŽµiÓ&Ùk²—ÑÏõ”�XPßìëö$óññѬY³ôòË/'¦}¨mÛ¶z饗R`eéÇĉµfÍÓñáÇ«E‹N�sÊ”)¦›|6mÚTãÇ�·9 ] @Mš4I5jÔЈ#¬þ¨->>^£F�R™2eôÌ3Ï8¼ö‡<=Í­“.ÿ°@Ê ×™4r�ä:Ór�ÉG®óÿ�ëL»ÒûÏr�)“ëüè£� 771b„üüüœ6�«¹¹¹iòäÉjÑ¢…®_¿žäõµk×V×®]S`eéÇâÅ‹5oÞ<Óñ.]ºèí·ßvêœ_|ñ…é&ŸÕ«W×Ì™3mÞ˜8 @Æ SíÚµ5`ÀÃÃÌ™3G+VTõêÕZ÷%–ëLîFëàlü)O˜Ü¹s›Ž¥õÝÍ›7 ëÎÒØÚÓl ¶òöövèþÔêíLÎ¥˜õ»uë–SçI ÑÑÑúì³ÏÔ°aCÍœ9ÓeaP)ýxÝÀã ½ÿlp4í,÷ïßO•yÛ¼0½†ñU¤H�1"Éë‚‚‚4|øðXQú1wî\Ó`¦$õíÛW�:urêœ{÷îÕ’%K ÇžþyM�:ÕæM>ÿ«yóæúàƒ Ç¢¢¢4lØ0»{&&±×� 28u.Or�¶yóYi!»c r�¶#×é8^7ð8Hï?Èuº>×yâÄ -Z´ÈªþüóÏ«aÆN™#%åÌ™SS¦L‘››[¢×hòäÉI^‡ÿ³zõjMš4Ét¼uëÖ:t¨Sç>>…Wd;³_ºâ4S³žlÈå¸L™29µŸÙ×*µ‚?ÎrõêUµiÓFÓ¦MSDDDj/ç±eöœåuH9áá᩽Iÿ†ìSCbA1^̽òÊ+ªZµªé¸¯¯¯f̘‘¬ "ŸT‹/Öœ9sLÇ;wî¬>}ú8}ÞéÓ§þÃßß_Ó¦M“»{ò]Ù²eKµhÑÂpìðáÃÚµkW²{?Êì½¥���C�ë´ ù,×!×ir�ÎA®H}ä:]›ëŒ‹‹Ó¨Q£¬>>___�9Òáþ©¥fÍšjÕª•鸻»»¦N�ªìÙ³§àªo?ÿü³Þ{ï=Ó÷û 6Ô¸q㜾qêܹs ß—yzzjöìÙm’Y­Z5õìÙÓpìòåËúᇒÝûQlô àqÀ_�ð*T¨�a=22R/^LÙÅØ!&&ưîŠ_ÀšõL­0Izâì ¹Ìú™}¿<®_¿®×_]Ç�Oí¥<öÌž³¼n)'***µ— I©öG/‰½Þ<î¼àJG�Õþýû½†ßm·råÊDO|oÓ¦�† æôy�=ªŽuêÔIY²dqxŽÞ½{ËÃÃÃplùòå÷È,ÀM€3�ëLù,×!×™4r�ÎC®H}ä:]›ë\¾|¹—YO///§Ïõ¤qö)æfýׯU||¼¬ .$z]îܹU¶lY=óÌ3 TŽ9äçç§Œ3ÊÓÓSîîÆgütïÞ]×®]sÅÒÓ$³ï^7€”cözô¤È–-›éØ�;wRp%��ððp'¨¿ÿ¾  U«VÉÇÇ'W÷øY¿~½F�eŠnܸ±>øà—lœú믿šŽµhÑÂ)s,XPåÊ•3Üv÷îÝŠ��wÊÇvûömÃzöìÙî ä:“F>ËuÈu&Ž\§s‘ëR¹N׿:wìØaU ÐsÏ=§“'O&»¯ÙÏ׈ˆÓ¾2dpÊûÈØØX 8Ð4G'Iqqqz÷ÝwµvíZruIسg�ÞyçÓœlåÊ•5wî\y{{;}îß~ûÍtÞæÍ›;eŽ,Y²¨N�:úᇬƎ;¦Û·oËßßßáy̾}}}åçççpp6úà TªT)ӱݻw«Aƒ)¸Û™�¨xïÞ=§ÏeÖ“�¤îÔ~f_+Wœì�6nÜhî‘þ UµiÓF:tP‰%’ÕßÙ'º¦ufÏY^7€”“Øëñ'Ÿ|¢ÀÀÀYGž}ZEŠqx³çëSO=åpo ×™4òY®C®3qä:�‹\'�úÈu¦|®344T­ZµrIï£G�ªY³f†cUªTÑÒ¥KžcΜ9†½G…††jèСúôÓO]røxzpèÐ!½ù曺ÿ¾áx™2eôÉ'Ÿ˜¾Ïv”Y®ÓÛÛ[+VtÚ<ÕªU3Üè3>>^ÔóÏ?ïðfÏ×¼yó:Üœ…�>xÕ¬YÓtlûöí)¸û˜�êy÷î]§ÏeÖ““Eçì¯WzûZ}þùç†õL™2iöìÙzî¹çêŸØ)ºé¯@êËš5«éX¶lÙ”r‹I%O=õ}Úè»ï¾ÓÚµkm¾~ùòåªY³fšýƒ¦Ô´cÇ 0@111†ãÕªUÓìÙ³åååå²5œ?Þ°^ @§ÎS°`AÓ±��—nô™R¡vé¹Î¤‘Ïrr�‰#×é\¼n©�\'¹N{üþûïúôÓOm¾~Û¶múâ‹/Ô¥K×-ê1uüøqõèÑC†ãAAAZ°`�üüü\¶³\gžä:¤%�òòäÉc¾8s挎?žÂ+²M®\¹ ëÿüó�Sç¹qã†ÂÂÂìZlçì¯×éÓ§ ë�ã×êÊ•+:pà€áبQ£ƒFGG›†BÒ+³ïƒK—.éÁƒN�ëï¿ÿ¶k À“"±S‘Ÿ”�z¾|ù ëB-�9sFcÇŽ5 T¶lÙ ÇÞ{ï=]¹rÅ•K{ììÛ·O½{÷VTT”áx… ôñÇ;5”iÄì=ubAñäH¬ŸÙìE €+‘ëL¹N×"×iŽ\§ó‘ëR¹Nr�¶ºyó¦Þ}÷]ÅÅÅY�eÉ’ÅôÐïiÓ¦éÏ?ÿtõò+§OŸV·nÝLŸc… ÒçŸîô|å£ÒB®óÖ­[N™ƒÜ<Øè€'T£F�LǾþúë\‰í *dX?qâ„âãã�6ϱcÇLÇž~úi§Íó¤:qâ„ÓzEEEéÌ™3†c�ã×ê�?þ0¬(P@-[¶t¸ÿ… îñ¸1{݈‰‰ÑÉ“'�6Odd¤Îž=k8ö8~/Δ7o^e̘ÑpÌìy“Þ+V̰þ¤|ü¶ˆŠŠRpp°á.xzzjæÌ™š8q¢á½aaa4h�bcc]½ÌÇ‘#Gôæ›o*22Òp¼dÉ’úì³ÏLŸ—Îäì?¾0ãææf:æ¬ï ³÷œÅ‹wJ ×iŽ\§k‘ë4G®ÓùÈu©�\'¹N[ 6Ìô�ìqãÆiÖ¬Yòòò²‹ŽŽVpp°ÂÃÃ]½ÄÇÂ… Ô¥KݸqÃpü©§žÒâÅ‹•3gN—¯%-ä:�6ŽM³÷œfÏoH lô Àêå—_–‡‡‡áØwß}gú äÔdöËÖððp§ž&~èÐ!ú���i¸ ¶;räˆÓz;vÌtó¦Çñ—ófAƒºuë:¥¿Yà4= 2 ‰>|Øió=zÔ4pä´y€Ç‘»»»J—.m8¶wïÞ^Mê(Uª”aÝ™ÁôÇÝÔ©SMÿ(§_¿~*W®œêÖ­«N�:^³oß>}ôÑG®\âcáäÉ“zã�7tïÞ=Ãñ"EŠháÂ…Êœ9sЬÇÇÇǰnv"|rݼyÓt,C† Néj8föúö"×iŽ\§k‘ë4G®ÓùÈu©�\'¹N[,^¼X[·n5kÛ¶­6l¨R¥JiРA†×œ={VcÇŽuá !!!êÚµ«BBB Ç´xñbåÍ›7EÖãëëkXÜr�ñññ¦Ï×2eÊ8Üœ…�>xBåÎ�[õë×7»ÿ¾f̘‘Â+JZ… Lƒ]?þø£ÓæÙ°aƒa½\¹r¦!ZØîôéÓúûï¿�Òë§Ÿ~2¬gË–M… vÊ))±Z�á÷ßwJé߀—‘èèh§Íá ™3g6 dš}ÿ$Çúõë ë>>>lHªV­ša}ïÞ½iîuÃÌ^._¾¬»wï¦ðjÒž-[¶hÉ’%†c5jÔP�=¿ûî»*Y²¤áµüñ26rîÜ9uëÖÍ4lY @}þùçÊž={Š­)GކõóçÏ;užÄúåÊ•Ëáþfaмyóš~Œ`/r�æÈuº¹Nsä:��\'�6�ët]®sÞ¼y:qâ„Óÿ«R¥Šá|UªT1½géÒ¥ÉúþüóOM›6Íp¬hÑ¢>|xÂãÎ�;«N�:†×®Y³Fk×®MÖÒƒ›7oªk×®ºpá‚áx¶lÙôù矫`Á‚)¶&³ iHHˆ¢¢¢œ6�«s�/^TDD„UÝËËKÅ‹w¸?8 }ðëÛ·¯i¨kõêÕÚµkWŠ®ÇìÔ뇲eËfº±Ó?üà”5üù矦§È׬YÓ)s@Z·n�Ã=âããMƒÀÕ«W7 §ef¡(³SSíqýúumܸÑá>ùøøÖïß¿ï´9œÅì¹»wï^]¹rÅáþÑÑѦߋ•*U2ý\O’ ÖÞˆ_Ž9h8vâĉ^MÚ¢aÆŽeÏž]S¦L±ø™îíí­3f(cÆŒV×ÇÅÅiРAN?UüqpåÊuíÚU¡¡¡†ãyóæÕâÅ‹•;wî]W� ë—.]2 ®&Gbÿn1[ƒ=Ìž§eË–u¸7ü¹Nkä:S¹Ncä:]ƒ\'�úÈu’ë4®àà`ß�>>>š1c†ÅÏA777Mœ8Q†ýF�íôÃÁwïÞU÷îÝMßÇfΜY‹-RÑ¢ESt]f™ÊhÿþýN›'±·8ccS³çi±bÅäííípp6úà V´hQµjÕÊpìáFIW¯^M‘µìܹSݺuKòºÆ�ÖÏ�;gzò²=æÌ™c÷ܰßòåËuç·z¬Y³Æôû³Q£FõN-þþþ†õk×®9Üû‹/¾pê «fk qÚÎböý¯�?þØáþ_~ù¥é¦r¼nÿ 2ÝoþüùЉ‰Iá¥<³pº3Cq�›‡ï7oݺe5æææ¦I“&?Ÿ~úi�9Ò°çÕ«W-NŠܸqC]ºtÑ¥K— ÇsæÌ©Å‹›†’]©téÒ¦cÎ ƒŸ9sF‡6+X° ²fÍêðüñ‡a½V­Z÷€ÿ"×i�\gÊ ×iŒ\§k�ëR¹Nr�fÆŒ£³gÏŽ 6LAAAVõìÙ³kêÔ©†Ö‡‡‡kÀ€¦›g§G‘‘‘êÑ£‡Ž;f8ž1cFÍŸ?ßtÃ|WJ‰\çíÛ·µuëVÃ1___Ãï!{‘ëð¸`£OžpC† 1=9óúõëêÒ¥‹®_¿î²ùããã5þ|õèÑCwïÞMòúæÍ›ËËËËplêÔ©ŠŒŒLöZþ÷¿ÿiË–-†cUªT1=¹ö Óܹs“}dd¤f̘a8–#GÕ©S'Ù½SSöìÙ ë‰�fj‹Ã‡kÑ¢EõxTž!½‰ŠŠRïÞ½uàÀÃqÍ›7O+VLá•ý+±\çÚµkuá‡çX¸p¡îÝ»g8V­Z5yzz:<‡Ùó”\'€´†�>xÂùûûk„ †'gJÒ™3gôÊ+¯8˜2sæÌuéÒEÓ§O·ùÄ×\¹r©eË–†cW®\ѰaÃg÷Z.^¼¨aÆ™Ž›�|_~ù¥i71ñññ>|¸éiè:t�···£ËKf'²îß¿ßôÄѤ„„„hàÀ�N?U¹H‘"†õ­[·&ë9èj=zô0¬ÇÅÅ)88X·nݲ»gTT”ú÷ïofïСƒüüüìî ¤W�52=zÙ²eZ²d‰ÓçŒ��ÕO?ýäô¾ÉQ£F Ã`ÚþýûM7)LÏöíÛg¨/Uª”˜d�1cƘþÁÎäÉ“uüøq‡Ö˜ÖEDD¨gÏž¦§ŸŸŸ.\蔓ϓ«råÊÊ•+—áXXX˜Þ}÷]‡Þ7|ûí·Z·n�éx“&M’Ýû¡S§NéæÍ›VõgžyFyóæu¸?<Š\ç¿Èu¦ÿüsýöÛo­1­‹��Upp°vìØa8îåå¥9sæ¨zõê)¼²ÿ“?~•-[Öp,::Zýû÷×ýû÷“ÝçÎ�Z°`�é¸3r�÷îÝ3ü·PæÌ™U¾|y‡û€3±Ñ'PíÚµ5hÐ ÓñË—/ë•W^Ñœ9sú…íC¡¡¡š>^#FŒÐ/¿üb8îáá¡iÓ¦éùçŸOá•YëÚµ«éØÑ£GÕ»woݾ}Ûî¾ÿûßÿÔ¯_?Ó�róæÍ«F�ÙÝ÷Q{öì1œãùçŸ7ܼRÿJ’¤îÝ»ëúõëZ´h‘áxtt´æÎ�«åË—ëµ×^SóæÍ•?~›ûÇÆÆjÏž=úþûïµaǹsçÖ€4~üxÃñ¯¿þZG�ÕøñãU¼xqÓ>qqqZ³f�&L˜`zrsÆŒ5jÔ¨d¯ÖòäÉ£«W¯J’"##Õ¹sgõèÑC½zõ’���é}gÏžÕ°aôÿ~Ók† òXŸ´ííí­† jÍš5Vc.\PÛ¶m5nÜ8ÕªU+Ñ>Z°`�-Zd±Á™ŸŸŸÜÜÜL¿ßíQ°`A)RDÿüó�ÕØœ9s´eË5lØPÅŠS¶lÙäãã#777«kýýý•;wn‡×“www�3FíÛ·Wtt´Õø¡C‡Ô´iS�=Zõë×O´×þýû5|øp�9sÆôšáÇÛfž4%K–Ô Aƒ4qâDÃñU«ViçÎ�êÒ¥‹^yåÓ?1¡mÛ¶éçŸÖ¶mÛ†NY»34kÖÌð”î_~ùÅ©'H_¸pÁá .oܸ¡“'OÚtm¾|ùìúZ�1B—/_6{ÿý÷U¨P!›{•-[V Д)S¬Æþùç�7Îô=cRlýø/^¼˜èX¶lÙlêdÓu’¬�;wšŽ÷ë×O™3g¶ùc°•———ž~úi»îéÔ©“¾þúk]ºtÉpüûï¿×ñãÇ5pà@›¬gÏžÕG}¤µkך^ãææ¦¡C‡ÚµN3f¡ÛfÍš9¥?˜!×I®3¥�ë4G®ÓuÈui¹Î”Éu¦uÓ¦MÓŸþi8Ö«W/UªTÉæ^���úàƒÔ¯_?«±7nhÈ�!Z¸p¡áÏ ¤œ9sÆðgÆ£®]»f:bs¶òé§Ÿ6Ý÷Q“&MÒwß}g:ÞµkW.\Øé¹Nɾü©$5jÔH_|ñ…ýüóφãG�U‹-T®\95lØP T®\¹¥k×®éÈ‘#Z¿~}’'i�7ήͦ�´#F¨ÿþ 'hÆÆÆê“O>ѲeËÔ°aCU©RE¹sç–ŸŸŸ®_¿® .hãÆ�Ú»w¯âããMû6nÜX-Z´H©Ãeúôé£õë×P®\¹¢îÝ»«dÉ’ªW¯žJ—.­ìÙ³ËÍÍM7oÞÔ•+W´cÇíØ±CáááV÷>\}ô‘Óž‹¯½öšÆŽk8vôèQ=z4É­ZµÒ¤I“œ²ž¤”)SFC† Ѹqã ÇCCCÕ»woåÏŸ_Mš4Q±bÅ”;wnyyyéÚµk:}ú´Ö¯_¯ãÇ�':OÛ¶mÕ´iSW|@ºÐ¥K]¼xQK—.5¿|ù²&L˜ Y³f©|ùòªT©’ .¬¬Y³Êßß_111ºsçŽîܹ£k×®éøñã:vì˜þùçÅÄĤðGcŸ hôèѺÿ¾Eý—_~Ñ»ï¾ë´y†®={ö8ÔcùòåZ¾|¹M×.Y²ÄðT{#Ë–-3 Ø5oÞ\-[¶´u‰ ºuë¦�;wjûöíVc«V­RÍš5Õ¸qc»û:#ð7|øp›¯=qâ„Íך}2 ];*00P¿þú«]÷øúújÊ”)êܹ³ésôĉêÙ³§ .¬š5kªB… Ê‘#‡²dÉ¢ÈÈH………éøñãÚ³g�öìÙ“hT’zöì© *صN#·nÝÒ¾}û¬ê%K–TÑ¢EîI!×i�\§ó‘ëL¹N×!× ¤ ä:]ŸëL˶nݪ%K–ŽU©RE½zõ²»çK/½¤¶mÛjÅŠVc;vìÐgŸ}¦ž={ÚÝ·{÷ŽÛjÖ¬Yš5k–M×nÞ¼Yùòå³éÚ¤r� ,Ђ lêe/{ò§Ò¿‡©Oœ8QmÚ´1|"I—.]Rpp°¦M›¦ZµjéÙgŸUîܹåïﯨ¨(………éï¿ÿÖž={´k×.EEE%:gÓ¦MÕ¤I»Öi$66Ö0Çš={ö$7^€ÔÀFŸÀBÿþý¤#F$œ˜jæäÉ“N=M²T©Rv]?eÊݺu+Ñ�¬:¤C‡%k=C† qÊ/’a©dÉ’\üñ‡þþûo«±?üPÕªUSÙ²e“ÕŽ+\¸°æÌ™£·ß~[<0½îòåËúæ›oôÍ7ß${®*Uª˜nêm¯={ö(,,̪ޤIyz²}€´'yÿªéZãÆ�µfÍš;Í0Ož<š8q¢/^l×}¾¾¾š?¾6lèÔõxyyéƒ>P·nÝœÚÿ§K—.êÞ½»Sz•-[V‹-R† œÒ/-xë­·ÔªU+§õkݺµKBŠ^^^úøã�U¨P!§÷v¥wß}WLvèÈÌ«¯¾ª™3glàææ¦!C†hÒ¤Iʘ1cj/'EµmÛÖ°¾aÆ^IÊŠŒŒÔ€ À^^^š>}ºüüü’Ý?GŽš\ÞÞÞÉîñòË/kéÒ¥ò÷÷wâÊÒ† &¨OŸ>…}||4dÈMœ8ÑéáLJõí·ßê�7Þphƒ¶”Ö³gO}þùç*P €Ã½²e˦©S§êƒ>�———V<9Zµj¥µk×êÅ_tzo=÷Üsš6mšÓ{;¢J•**Y²¤U}õêÕéz#ÊñãÇëŸþ1 V™2ež£fÍšzã�7 Ç<¨Ù³g;<S·n]ýðÃzᅜڷ`Á‚Z²d‰ú÷ïï´M>/]º¤]»vYÕ›5kæ²ÍJ 1ä:Éuº¹ÎÄ‘ët-r�@Ú@®óÿ¤÷\ç§Ÿ~ªÝ»w޽þúëªW¯žÃsiذa†c.\pɦװO… ôý÷ßëå—_NÖ{3úè£�ôÁ8m“ψˆ­_¿Þª^½zu9ep6Ž ‰ªW¯žêÕ«§ýû÷kíÚµúå—_týúõd÷Ë‘#‡êÕ«§Æ�«ZµjNùE°›››^{í55jÔHŸþ¹V®\izª¨™âÅ‹«k×®jÖ¬™Ó6BÒ:wî¬ZµjiÖ¬YÚ´i“âââlº¯\¹r0`€ªW¯îâ¦wwwõíÛW5jÔÐG}¤;vØ|¯———š4i¢Þ½{;%ð˜???½ûî»êÓ§�vìØ¡}ûöéĉºté’nݺ¥ˆˆˆ4rªV­šÖ¯_¯U«ViÉ’%:sæŒ]÷çÊ•KíÚµS§N�”9sf­Hÿòçϯ9sæèøñãZºt©~þùgݽ{7Y½2f̨J•*©fÍšjÔ¨‘C'‰»RçÎ�5dÈ‹Zhh¨¶nݪúõë§Òª\gÆ Z¹r¥áØsÏ=§®]»:m®þýûkÏž=:tè�ÕØgŸ}¦êÕ««F�N›öË™3§>þøc?~\_}õ•~øáEDD$«WõêÕõúë¯ë…^pú¿¬ZµÊð½i§N�œ:Ø‹\'\‰\§9r�®G®HÈuþ+­å:[µj¥*UªXÕíîµÿ~Í�;×p¬X±bVŸ G´oß^;wîÔÆ�­ÆÖ¯_¯5j¨M›6N›öóóóÓ„ ôÖ[oiùòåZ½zµÂÂÂ’Õ«L™2zýõ×Õ¸qc‡6�7²aÃ…‡‡[Õ;wîìÔyÀ™ÜâãããS{àñ§“'OêÀ�:vì˜.\¸ Ë—/ëöíÛŠŒŒTTT”¼¼¼”!CeÏž]yòäÑÓO?­bÅŠ©bÅŠ*Z´¨SOy4£]»viÏž=:vì˜Î�;§›7oêþýûrwwW¦L™”;wn*TH*TPÍš59½Ñ^xá]ºtɪ¾yófå˗Ϫ~éÒ%mÞ¼YûöíÓ©S§týúuEDDÈÃÃCþþþ*\¸°*T¨ úõë«téÒ)ñ!¤)'OžÔo¿ý¦½{÷êìÙ³ ÓÝ»wåíí­L™2)_¾|*R¤ˆªV­ªçž{NÙ³g7ì%£ÿ%èíííòçfZwôèQíܹS‡Ò¹sç¢ÈÈHÅÇÇË××W9sæT�TºtiU«VM•+Wvú¦b¤èèhíÝ»Wû÷ï×_ý¥‹/*$$DŠŽŽ–¯¯¯2eÊ$???åÎ�[EŠQáÂ…U¼xq•-[Öé¡0WˆŠŠÒ /¼ ÐÐP‹z�:uôé§Ÿ¦Òª€Ô©#GŽèСC:|ø°.]º¤;wîèîÝ»ºwïž¼½½•%KeÉ’E9räP©R¥T¾|y•/_^.YS\\œêÖ­««W¯ZÔ«W¯®Å‹»dNH.r�°¹Nç"×ézä:�´�\'¹N �"× ¤]F¹Î§Ÿ~ZÍ›7O…Õ€íØè …ùøøè­·Þ²ª¯Y³F¡¡¡©°"’´k×.=zÔªÞ¿ÿ”_ E�ëÒ¦³gÏê—_~±ª÷íÛW©°"°}¤‚W^yEùóç·¨EEEé‹/¾H¥0:õ½N�:*_¾|Ê/�bÈuiÏ¢E‹gQ R£F�RiE`;6úH^^^2dˆU}Ù²eº~ýz*¬x²íÝ»WÛ·o·¨™=Oé ¹N m9þ¼V¯^mU>|¸ÜÝÙ.@ÚÇ¿\RIƒ T³fM‹ZDD„>úè£TZðäš>}ºU­cÇŽ*\¸p*¬�ÒÈuiǬY³mQkذ¡ªW¯žJ+û°Ñ'@*1b„¼¼¼,j+W®ÔùóçSiEÀ“gÓ¦M:pà€E- @½{÷N¥R¹N õýõ×_Ú°aƒEÍ××WC† I¥€ýµJ•*ÉÏÏ/•VH ä:�ÔbuX{±bŘJ+û±Ñ'@*kÚ´ij/x¢5oÞ<µ—H#Èu©«N�:ªS§Nj/âžÚ Ò6úœ€�>'`£OÀ ÜâãããS{ÀãÎ=µ¤lô 8}NÀFŸ€°Ñ'àlô 8�gj/€ëÄÅÅéÁƒ5¹¹¹¥ÒŠ }Š��Wll¬EÍÇÇGîîœÉ€L'¤¤ÔÎu²Ñ'�Ž=xð@ÇŽKíeÀ©dÉ’Ê�!Cj/@@¦RWJæ:9&p6úœ€�>'ðLíp«ZÉ’%åéÉS@Útÿþ}�'`£OÀ Øèp6úœ€�>'`£OÀ Øèp6úœ€�>'`£OÀ Øèp6úœ€�>'`£OÀ Øèp6úœ€�>'`£OÀ ØèpÏÔ^Ò¾«W¯êäÉ“ºråŠnß¾-Iò÷÷WŽ9T¦LåÎ�ÛisÅÇÇëâÅ‹ºxñ¢®\¹¢;wî(22R^^^Êœ9³råÊ¥’%K:uÎÿŠŠŠÒÁƒuúôiݾ}[nnnÊ–-›Š-ª2eÊÈÃÃÃés^¸pAG�ÕÍ›7uçÎùúú*oÞ¼*Uª”òçÏïôù$)$$D‡Ö�7&///åÊ•K%J”Ð3Ï<ã’9€cR2Ó)I·oßÖ©S§tîÜ9ݹsG.nݺ¥¿ÿþ[ÇŽSxx8T0ÀFŸ°rýúuýúë¯Úµk—vïÞ­7n$z}þüùÕ¦M½úê«Êž=»]sEDDhëÖ­Ú¿¿:¤¿ÿþ[IÞ¨–-[êÕW_Už}ÔµkW¹»»'«ÇÊ•+5nÜ8Ý¿ߦë³fͪ)S¦èùçŸOÖ|Û·o×�!Ctýúu›ï)Q¢„fÏž­‚ &kÎ?ÿüSýû÷OtSÑGjÖ¬Y*[¶l²æt³÷Zß|ó�FŽix}H äµ$†×�#þß7€ëð^ Àux¯HOR:Ó¦1cÆhëÖ­6Øþ(777uîÜY”···Ý÷KÒ¦M›4zôh…††Úu_† Ô¯_?uéÒEnnnvÝ»oß> >\çÎ�³ë>OOOuíÚUýúõ³ù÷ÿ�ëFŸ�kÀ“-µ3[ÉûˤKG�ÕîÝ»“•¤ððp�1Bï¿ÿ¾“Wf.""BS¦LÑ�!Ck÷ý ,Ð{ï½gó&ŸÒ¿aÖ·ÞzK6l°{¾o¾ùF={ö´k“OIú믿Զm[�%)&&FŸ}ö™ú÷ï¯èèh»ï\¤· *¤ÏÔ^Ò¶‚ ªF�ªR¥ŠŠ)¢9rÈÇÇG¡¡¡:pà€¾ù櫊+ªH‘"*P €²dÉ"___EDDèÊ•+:tè�Ö¬Y££G�ZÜ»víZåÉ“G´y¾-[¶hÚ´i5///µlÙR­ZµR¡B…­Ó§Oëë¯¿ÖÆ�/IŠ‹‹Ó�!CT°`A•*UʦùvíڥѣG[mHZ³fMµiÓFeË–UÖ¬Y¦Ã‡ë›o¾Ñ®]»®»uë–Þzë-}ûí·Ê–-›Msž:uJÁÁÁŠŒŒ´¨—-[Ví۷׳Ï>«9rèÎ�;:~ü¸Ö¬Y£Ÿþ9áºû÷ï«OŸ>Z½zµ (`Óœ®6nÜ8ݹs'µ—@ŠJÉL§$eÍšUµjÕR•*UTªT)åÌ™S~~~ºsçŽþüóO­_¿^?ÿü³Åf¤GŽÑÛo¿­/¾øBîîî6ͳoß>½ÿþû ͇Š/ž�u �»»»®_¿®ƒê›o¾Ñ�,®_¶l™‚‚‚Ô®]»$çlQ+[¶¬¼¼¼RiE�¸ÈÈH;v,áqÉ’%•!C†T\@úÁ{-×âý =Y¾|¹F�-OOO5nÜX¯¼òŠªT©’ä}+V¬Ð|`vôôôÔš5kT´hÑDï=uꔾÿþ{5hÐ@eË–•›››Mk]µj•F�m5çÚµkU¤H‘$ïðà�4h ���„ZæÌ™5oÞ<Ó�yýúõ2dˆÅœ¥K—Ö·ß~›ä|÷îÝSƒ tóæÍ„š‡‡‡ÆŽ«6mÚ˜Þ·bÅ �=Ú"ûꫯÚtê|\\œš5k¦¿ÿþÛ¢þÎ;ï¨W¯^¦Ÿë_ýU Ðýû÷j5kÖÔ¢E‹’œÓÙ}¯¢$<®U«–¶oßnqÏ’%KTµjÕ[#Häµ$Ž×�#þß7€ëð^ Àux¯HOR:ÓùÏ?ÿ¨qãÆ’¤*Uª¨]»vjР�¼½½�oÿþýzç�wjQ3fŒMnJR‹-tüøq‹Z�=œèf¡‹/Öĉ-jþþþúõ×_åçç—èœo¿ý¶~ýõW‹ZóæÍ5nÜ8ùøø˜Þ·aà <Øâóëåå¥üQùóçOtÎÝ»w«S§N �­Ö�V˜ePÛ´i£V­ZÉÍÍÍð½VZÊ x²¥vf˶­®ðDpwwWÓ¦MµaÃM�:Õ¦@¨$µmÛVcÆŒ±¨ÅÄÄè£�>JòÞ¢E‹jРA*W®œÍ›|Jÿß{ï=«9W¯^mÓý_}õ•Å&Ÿ’4iÒ¤D?æ&MšhРAµ£G�ê—_~±i¾ÿnò)IƒNt“OéßÏí£§¼¯^½ZgΜIrÎüÑ*`Ù±cGõîÝ;ÑÏõ /¼ I“&YÔvìØ¡]»v%9§+EDDXrŸyæuëÖ-W€k¤F¦³B… Z²d‰–.]ª&Mš$¹É§$U¬XQ .TÆŒ-êsçε8äÜÌ_ýeµÉgƒ 4hРD7ù”¤.]º¨cÇŽµÛ·oë·ß~Kô¾›7ojÛ¶mµÒ¥KkÒ¤I‰nò)I�7¶Ê’FGGëÇLô¾Ç�Qµ}ûöjݺõc™A€”ÆFŸHЦMMŸ>] ´ûÞ—_~Ù*DúÛo¿)**ÊY˳Ҷm[ZÔ¶oßžä}ÑÑÑš?¾E­^½zª_¿~’÷vêÔI%K–´¨Ù~]ºt©ÅãbÅŠ©sçÎIÞ'IݺuSPPPÂc[·�Ι#G«p©™F�©víÚµ?üЦ{]å믿ֵk×$Innn3fŒ<==SuM¸BJg: *¤¯¿þZU«Vµ{¾bÅŠYܪC‡%yïÎ�;­j={ö´yî7ß|ÓjãÉÝ»w'zÏž={kQ{ã�7äááaÓœ¯½öš2gÎlÕ3=1Ê öë×Ϧ{ÓbR} �­E3-[¶´x®'N8Ô31nnnªV­šEíêÕ«IÞ·{÷nݼyÓ¢Ö©S'›ætwwW‡,jýõ—Î�;gzÏ©S§6¨|¨]»v‰žhþèœíÚµ³¨mÞ¼9ÑÀí½{÷tøða‹Z«V­äëëkÓœ’ôúë¯[<>pà€MŸ_W8qâ„6oÞœðøå—_V¥J•Re-¸ZJg:�=Ÿ$íß¿?ÉûBBB,ûúúªL™26Ï B… YÔÍl&5§$U®\Ùæ9½¼¼T®\9»æ|œ¤· *¤6ú€Ó/^ܪêÒ9sæÌiñ8<<<É{þ»a¤$=õÔSv�@ߤIùøø$Úó¿öíÛgU«Q£†ÍóIRõêÕ-GDDhÇŽ¦×ïß¿ßê´y{ç¬\¹²Ep7>>^›6m²«‡3ÄÄÄhÁ‚Š��—$eÏž]ï¾ûnН€ÇEJg:óçϯL™2Ù=_dd¤Åã,Y²Ø|�úCY³fµxmל’äïïïÒ9'é)ƒ ©…�>à4F'u…!�éÎ�;�säÈ‘ä=¿ýö›ÅãÊ•+Û ͘1£J—.mQÛºu«éõ�žüîíímuz|Rž~úiyyyYÔ¶lÙbóœ’T´hQ»æÌ˜1£òçÏo󜮲fÍ]ºt)áñ�!C¬²àÿ¤F¦óÑ9#""’¼'{öì�ïÞ½›p0¸­nß¾mñ8 À®9%ë<ª½s>zpýã,=eP µ°Ñ'œæòåËV5£0¤3ýñÇ�Ë•+—èõáááºxñ¢E­bÅŠvÏûè='Ož4½6,,Ìâq–,YìžÏÍÍÍê¾'NØ<§dÿió’õZ›ÓNŸ>­µk×&<®T©’Z¶l™¢kàq“Ò™ÎèæÍ›5[oôàõÈÈH;vÌæyoÞ¼©³gÏZÔ’Ê…>:§d�GMLLLŒ:dל�“ô’A€Ôä™Ú @ú±wï^«Z�\6ߦM›¬6ØLjÈÓ§O[ÕŠ)b÷Ü�ÞsëÖ-………)kÖ¬V×>z²¼›››ÝóÝ÷Ï?ÿ˜^ktš}ræ}ôžÐÐPݹs'Y›•Ú+>>^cÆŒQLLŒ$ÉÓÓSï½÷žËçàq—ҙν{÷Zem™¯V­Zò÷÷×íÛ·jóçÏ×ìÙ³mš÷³Ï>S\\\ÂãL™2饗^Jôž%J¨H‘"9Ì… ª~ýúrwwOrί¿þZwîÜIxìîî®Ö­[Û´ÞGݹsGÐùóç&///ùûû+ @*T°i³TgKTHmlô §ˆ��ÕÚµk-jEŠQ`` KæÛ±c‡lQ«Q£†êÖ­›è}F›cæÍ›×îùóäÉcØûÙgŸµª?zŠùÃ�öxô¾»wï*$$D¹sçNrNIº}û¶ìšó¿ÁÙ‡þþûï9yþ«¯¾²8ñ¾yóæ*T¨�Ëçàq–Ò™NIúî»ï,»¹¹©V­ZIÞ—!CõêÕK'NL¨ýôÓOš3gŽúôé“è“Ë—/×çŸnQ8p 2gΜèœnnn VïÞ½jÔÈ‘#õþûïËÛÛÛôÞÍ›7kòäɵ.]º¨`Á‚‰ÎiäÊ•+ªZµªÅF¥�*R¤ˆÚ´i£¶mÛ*S¦LvÏ‘fT???»ú¤fR[ÒÛF6X¹r¥®\¹bQkܸ±Óú‡‡‡ëìÙ³úá‡ôÖ[o©[·n O/^¼¸f̘‘ä‰á×®]³xìææf¸QfRžzê)«ZHHˆáµ�ž¦þàÁ�?Þ®ùΞ=«¨¨¨dÏ)ýŽ´Çýû÷uñâE›çt¦��͘1#áqžxð`åÍ›WÓ¦MÓýû÷%ý»±æ˜1c’¼×ßß_½zõRçÎ�“<¤Þnß¾­�êàÁƒzï½÷\:—Yµ|ùò6÷HÍ *¤<Þbbb4pà@ݽ{×¢>`ÀeÍšÕ¥s·nÝZ¿üò‹FŽiÓ&Ÿ’u@ÐÇÇ'YsÝg>,Uª”2fÌhQûúë¯mž+>>^+V¬03›3 @… ²¨­^½Úâù¤,_¾Ü®9�å§Ÿ~ÒæÍ›׬YSeÊ”qéœ<îR#Ó9{öl«Í87n¬jÕªÙÕÇÓÓS ÐO?ý¤®]»*{öìIÞ“)S&�1B›7o¶{“χ:vì¨Í›7«W¯^ Lòz///õêÕK¿þú«ºté’¬M>}}}U§N�9RË–-ÓöíÛuèÐ!>|X¿ýö›,X nݺÉßßßêÞ¥K—jîܹvÏi�Ç9ƒ i}À!&Lо}û,jµjÕR»ví\>÷êÕ«Õ­[7­ZµJñññ6Ýiñ8¹}úúúZÕ̇^^^VÒ?ÿüÓ4Äø¨eË–éØ±c†c‰Û´icñøÚµkúðÃmšsË–-›mÚ:§£îܹ£qãÆ%<Î’%‹^ýu—Í@z‘ҙΟ~úIóçÏ·¨åÊ•K£F�JV¿¨¨(íÚµKûöíÓ­[·’¼><<\&LPŸ>}täÈ‘dͧ={öhß¾}ºzõj’×GGGkÞ¼yêÙ³§víÚe×\Ù²eÓ°aô}ûv}úé§zýõ×U©R%È××W>>>Ê�;·ž{î9 2D[¶lQÛ¶m­úÌ™3Çî¹íe”Aýøã�mº7µ2¨�–x¦öðøZºt©–-[fQË“'�¦N�š¬Ê*_¾¼zôè‘ð8..NwïÞÕ•+WtäÈ………%Œ�>}Z#FŒÐ?ü ?üÐðôò´ [·nZ¹r¥bbbjãÇ�—¿¿¿7nlzßÚµk5qâDÓñÄ>ÏíÛ·×üùóuçÎ�„Ú‚ ”3gNuéÒÅô¾]»v)888Ys:jÊ”) Mxܯ_¿4û5 ­pU¦ÓÌ¡C‡4tèP‹ƒÚ===5sæLeË–Íî~ÇŽSpp°Îœ9cQPÅŠ•+W.IÒÍ›7uðàA]ºtI’¯mÛ¶iûöíêׯŸÞ|óM›ç¼pá‚ ¤ƒZÔ³fͪŠ+*Ož<òööÖÍ›7uôèQ�>}:áš?þøC]ºtÑ믿®#FÈÝÝ=Éù‚‚‚dóú2eʤ±cÇ*oÞ¼š5k–ÅØôéÓµjÕ*›{ÙË(ƒºxñbEGG'š{MÍ *¤%lô €dY¿~½&L˜`QËœ9³>ýôSeϞݡÞUªTQ•*U Çâââ´mÛ6}øá‡:vìXBý÷ßW·nÝ´lÙ2ùúúšöÎ�!ƒÅã$k�÷ïß·ªe̘Ñôú (88XS¦LI¨EGGkÀ€Z·n�^yå•)SFþþþº}û¶>¬o¾ùF[¶lI¸>[¶lV'ÔgΜÙtN???�;Výû÷O¨ÅÇÇkâĉڴi“:tè gŸ}VÙ³g×Ý»wuüøq­Y³Fk×®MÞÚ;§#öìÙc:­P¡‚Z·n­¿þúË%ó�¸2ÓiäŸþQÏž=iQ7nœ*Uªdw¿ýû÷«{÷ˆH¨,XPÆ S�:u 7‡Ü³g�&Mš¤?ÿüS’«3f(&&F½{÷NrÎ3gΨcÇŽ‡“çÌ™SC† Q“&MäááauÏ_ý¥É“'k×®] µ/¿üR‘‘‘VŸgzûí·uèÐ!‹Lé‘#G´wï^U®\Ù%sšeP¿üòKíÛ·O/¾ø¢ræÌ©§žz*MdP ­a£OØí·ß~Ó�!C—PóõõÕ'Ÿ|¢âÅ‹»tnwwwÕ­[WµjÕÒ¨Q£´zõꄱ£G�jöìÙ2dˆéý�nÆ™Ü�>�îKl£OIêÖ­›Nœ8¡ï¿ÿÞ¢¾yófmÞ¼9Ñ{ ( ·ÞzKÇ·¨gÉ’%Ñû5j¤'Nèã�?¶¨ïÝ»W{÷îMôÞ¬Y³êƒ>PŸ>}ìš39¢¢¢4räÈ„p§§§§ÆŽËÉí$"¥3�—.]R·nÝfQ{öì„ÃÎ]¡X±b*T¨�EmÏž=.›ï¡Ç!ƒ i}ÀfG�Õ›o¾©ÈÈÈ„š»»»&Ož¬:uê¤øzÜÝÝlQ‹ŠŠÒ/¿übzO®\¹,ÇÇÇ[NmqåÊ•${qssÓ;ï¼£~øA�7–¯¯¯éµÙ³gWpp°¾þúkåÏŸ_wîܱ÷ööVþüùmZo»víôË/¿¨mÛ¶‰†_3eʤnݺiÍš5*Uª”Õœ’ôÌ3ÏØ4§­N�:¥… &< TïÞ½�:éIJg:ÃÂÂÔµkW‹C½%©C‡VYN[ÅÅÅéÛo¿µ¨µhÑByòä±¹‡ŸŸŸ:vìhQûý÷ß͆~óÍ7�kÖ¬©2eÊØ<§§§§zôèaQ;wîœþøã›{$G… ,_»vÍ¥ó=ô0ƒúòË/+cÆŒ¦×¥FÒ*ÏÔ^§N�R÷îÝuïÞ=‹ú˜1cÔ¤I“TZ•ôì³ÏÊßß_·oßN¨µk×ÖÌ™3-jû÷ïWãÆ�­®½}û¶Nœ8áðœÏ=÷œUíÀ�ªT©’ݽl•={v‹Ç7oÞtÙ\�Ê“'�FŽ©–-[êŸþÑ¥K—”!CEGG§jÒ*6ú@’Î�;§®]»Z…)‡ªW_}5uõÿ¹»»+00Ðb£Ï7n˜^o´Ñç?ÿü£Ê•+Û5ïéÓ§-gË–MÙ²e³«‡$y{{«zõêª^½z’×>�µçôøÿòôôTÅŠU±bśӻwïÖîÝ»“}ÿºuë¬jlô HR:Óyÿþ}½ýöÛ:|ø°E½Aƒš0a‚ÜÜÜ’ÝûÒ¥KV5{n7»çÚµk†×^¾|YñññÏ™5kVeΜYwïÞM¨…„„ØÝÇ�®Û‘Ï}ryxx(((HAAA*Y²¤2dÈ`zmjdP ­pOí m»r劺víªÐÐP‹zß¾}Õµk×TZ•%OOËón .úùùY28`÷œüñ‡Åã   »{ØãÞ½{:zô¨E­F�.�3>>^{öìIÑ9€±”ÎtFEE©wïÞVYÂZµjiÆŒVùM{EFFZÕ|}}íîctOTT”Kç4ºÏlNg¹qã†ÅãäPŸRÈ xÒ±Ñ'L]¿~]]ºt±:1½[·nêÓ§O*­ÊÚ£�Õ9r$z}íÚµ-ïÝ»×®ù"##­6ݬS§Ž]=ìõË/¿èþýû �ôüóÏ»tν{÷êÊ•+ �½½½Õ¼ys—Î ¬¥t¦366VÔöíÛ-ê•*UÒܹsåíííðY²d±ªÝºuËî>F÷dÍšÕðZ§Ì§°°0‹š«7ÞG�Að¤sl+l¤[aaaêÚµ«Îž=kQoÛ¶­† ’:‹2pþüy‹  $åË—/Ñ{êÕ«§¯¾ú*áñ¥K—´{÷nU­ZÕ¦97lØ Xõt•¸¸8-]ºÔ¢Öºukyzº6þóÅ_X<~ñÅMƒ¯ŽhݺµZ·nm8©cÇŽ%<.Y²¤2dÈ�ðx÷îÝêÔ©“Å=K–,±ùk @Z—Ò™Îøøx 6L7n´¨—.]ZŸ~ú©EŽÏVµC‡©B… võytL³Þ’ñaò‡RÓ¦MíšóرcŠŽŽ¶iNg8vì˜Î�;gQ«\¹²ËæsTJeP ­rOí í W�=tòäI‹zóæÍ5f̘TZ•±%K–XÕêÔ©“è=U«VUöìÙ-j�n¤i&..NË–-³¨•(QB ´éþäX±b…þüóÏ„Ç~~~zíµ×\6Ÿ$ýöÛoÚ´iSÂc½ñÆ.�XJ�LçØ±cõý÷ß[Ô‚‚‚´páBùùù9mž   eʔɢ¶víZ»û|÷Ýw�ÝÝÝU±bEÃk³fͪ… [Ô~üñG«àí�S’*UªdW{LŸ>ݪöÜsϹl>G�A6úÀ#}º<<<œ:ßñãÇU¯^=-\¸P7nܰk�Ÿ}ö™úô飘˜‹±aÆÙÔãµ×^³Ú,sðàÁÚ·oŸé=6lÐÔ©S-j¥K—Vƒ lšsÓ¦MÚ´i“bcc“¼6&&F‹/V¯^½,N‰¯X±¢:tè`Ó|’´wï^­Y³FQQQ6]¿fÍuéÒEaaa µ ¨oß¾6Ï “Ò™NIš?¾æÏŸoQ ÔâÅ‹•3gN§Ï'Io¼ñ†UmüøñViùñÇ­6•”¤·Þz+Ñû:uê$ooo‹ÚgŸ}¦¹sç*...Ñ{÷ìÙ£7ß|SÑÑÑõ7ß|3Ñ�WÇŽ«Î�;kûöí6åH%éÎ�;:t¨æÍ›g56hÐ —lôú_dP ùÏ}îs¾Îäõpu{¾ìŸ}§óí·ßŽx X¼K—.ñÜsÏ•«^�:uâŠ+®(qO×®]£oß¾ñÒK/%bùùùñ³Ÿý,Æ�ç�w^üñѨQ£HKK‹µkׯ‡~/½ôRL�:µØy={öŒ=z”XóÈ#�Œ+®¸"~ýë_'ÅG�¯½öZ\pÁqâ‰'Æá‡ÙÙÙ±~ýú˜5kV¼öÚkñæ›o&Ý%�øïKãÏ;ï¼kÆ”)SbÊ”)ѰaÃøÆ7¾ÇsLtèÐ!;ì°¨]»v¤¥¥Å† bÞ¼yñÎ;ïÄK/½[·n-vÖµ×^'Ÿ|r‰õR¡èÔã�?>²³³£AƒQ½zõX¹relÚ´ÉT€=0耄•+W‹Ä3ÏŠuëÖ%^$_«V­¨W¯^tèÐ!Zµjiii)­¹råʘ5kV¬]»66mÚ;wîŒÚµkGݺu£m۶Ѿ}û”Üa]¹re,^¼8–/_6lˆÜÜÜHKKKÜ—mÑ¢E|å+_9hîäææÆÌ™3cÊ”)±qãÆÈËË‹#�<27n|ÐÞAm•}g+5ÿÕ¤@ZZZ´lÙ2Z¶lYi=T«V-N<ñÄ8ñÄ+´N­Zµ¢[·nÑ­[· ­³»êիDZÇÇ{ì« PÍ›7�æÍ›К�7ŽÆ�W™:©R½zõ8æ˜c"3óÿ�®3T`ïö$4`Ð'¤‚AŸ�}@ ô )`Ð'¤€AŸ�}@ dVvTé7¾ZÙ-PE½wá‘•Ý|©¸×IEp§`ßÒ+»¨ ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ O’¬ aIDATHƒ>  ú€0èRÀ OHƒ>  ú€0èRÀ OH�ÌÊn UV¬XóæÍ‹åË—ÇÆ�#"¢nݺѰaÃèÒ¥K4nܸBênݺ5>üðÃX´hQlÚ´)233ã°Ã‹£�>:¾ò•¯DZZZ…Ô=PÖ¯_K–,‰eË–ÅÚµk#777víÚµk׎:uêD»ví¢]»v‘‘‘QÙ­Vº 6ÄÂ… ã£�>ŠíÛ·GaaaÔªU+6l;vŒæÍ›Wv‹@2èøÒZ³fMüío‹wß}7¦N�k×®-qóæÍãÜsÏ�óÏ??4h°ßõçÎ�cÆŒ‰I“&E~~þ÷~øá1`À€C‡�K.¹$ÒÒÒ*¸Kà@90ÿ…#@ Íž=;¦N�Z¦!Ÿ»ÛºukÜvÛm1|øðrå�1"F޹Ï!Ÿ»ûüóÏcàÀ�ñÞ{ï•«fIV­Z÷ßÊÏ-¯7ß|3 ‹/®´N:é¤ ¯ñÇ?þ1®¹æšRùÜ]nnnÜsÏ=qÇwT@g@eɬìR¡eË–qòÉ'G÷îÝ£M›6ѰaèV­Z¬^½:f̘Ï?ÿ||øá‡I9øÃ¢aÆ1dÈ�R×yî¹çâw¿û]R¬F�qÁD¯^½¢yóæ±uëÖ˜7o^<ûì³ñ¯ý+±oûöíqÍ5×ÄË/¿Mš4Ù¯çÝÝ�wÞ›6mJÙy_ÈÊÊŠÎ�;G·nÝ¢C‡ѪU«8ì°Ã¢fÍšQPPëׯ��?þ8&Mšo¼ñFäçç'r—/_—^zi¼úê«Q½zõë|õ«_�Ë/¿¼Ü}¾÷Þ{Å~¶ýúõ+÷y¥1}úô>|x&Å[¶lßüæ7¿ ééé±fÍšøðÃãùçŸ�3f$íî¹ç¢}ûöqÁTh¿À�aÐ'𥕙™½{÷ŽóÎ;/ºwï¾Ç=µk׎֭[Gÿþýã�ücÜqÇI){ì±èÕ«W´k×nŸõÖ¬Y÷ßR¬qãÆñøã�'åׯ_?š5kgœqF<ñÄqß}÷%Bnذ!î¾ûî5jTy¹˜/†l~á”SN‰·ß~{¿ÎüÖ·¾�;wŽ=zDÍš5÷º¯^½zѪU«èÕ«WüèG?Š!C†ÄüùóŸ/]º4}ôѸþúëK¬wòÉ'ÇÉ'Ÿ\î~‹õ¬]»v|ë[ß*÷y¥qÇwòùÝï~7 éééѶmÛÄ€Ó:uêDëÖ­£_¿~ñÔSOÅÝwß�”÷àƒFŸ>}¢V­ZÚ3Pñ ú¾tÒÓÓ£OŸ>1dÈ�hÙ²e©ó ™™™që­·&bñðÃǯ~õ«}æ?ú裑›››XgddÄ#�€/�ý}ƒö9眓4èsëÖ­1wîÜèÒ¥Ë^sÞ|óͤ‹ŸiiiqñÅ—ª^�5¢ÿþ1f̘DlòäɱuëÖ¨Y³f9žà¿—w<Ú¿ÿèÖ­[L�:µ\ç¥ÊI'�TìBéòåË+dÐgAAA¼úê«I±Ö­[DZÇ›òZ»ûb¸êrrr¢S§NñŸÿü§Tù�5Š£Ž:*>ýôÓD¬4—Jà`3kÖ¬¸ÿþûã½÷ÞKr¹/K—.�‡z(~ó›ßÄ­·Þçž{n¹êƘ1câᇎ‚‚‚÷®Zµ*F�&Lˆ‘#GÆ1ÇS¦ZS¦L‰¿þõ¯1sæÌøøã�#//¯\=Ì^yå•;vlÌ›7¯Ô9»v튙3gÆÌ™3ã‘G‰ûî»/Ž;î¸ ì2ÙÍ7ßK–,)SNnnnLœ81&Nœ={öŒáÇGãÆ�+¨CEé•ÝÀ�Ö¡C‡b±Õ«W—˜óæ›o&­¿úÕ¯FóæÍK]³_¿~Ië¼¼¼xûí·K�_4÷§?ýiFDDƒ ⦛n*×Y©Ö°aÃb±mÛ¶UH­É“'Çš5k’b}ûö­�Z»+úVú:uêDZZZ™Î¨W¯^Òz÷!²ðe1{öì˜:uj™†|înëÖ­qÛm·ÅðáÃË•?bĈ9rä>‡|îîóÏ?��Æ{ï½W¦Z/¿ür<ûì³1sæÌ*9ä3"â­·Þ*Ó�Ï¢–,Y]tQ¼òÊ+)ìªb½ùæ›1`À€X¼xqe·@’YÙ h999ÅbE‡7î.///Þ}÷ݤX÷îÝËT³E‹qÄGÄŠ+±¿ÿýïñío»LçDD<öØc±`Á‚ÄzذaÅGV–Í›7‹íiøg*¼ôÒKI댌ŒøÞ÷¾W!µv× Aƒ¤õæÍ›CWKkãÆ�IëF�íw_p0hÙ²eœ|òÉѽ{÷hÓ¦M4lØ0ªU««W¯Ž3fÄóÏ?~øaRÎþð‡hذa 2¤Ôuž{î¹øÝï~—«Q£F\pÁÑ«W¯hÞ¼ylݺ5æÍ›Ï>ûlüë_ÿJìÛ¾}{\sÍ5ñòË/G“&Möëy¤öíÛG�=ʜעE‹r×ìÚµk|ík_‹N8!š6m 6Œ�;wÆòåËãÝwß�çž{.>ÿüóÄþ�;wÆ-·Ü 4ˆSN9¥ÜuË*+++:wîÇ{lÔ¬Y3š4iuëÖ�ãŽ;.233cýúõññÇǤI“â�7ÞHzIûòåËãÒK/�W_}5ªW¯~Àz ê2è8äì~™ð E‡7înÑ¢EÅÞ¼~üñÇ—¹îñǯ¿þzb]ž7ž/X° {ì±Äº{÷îqÎ9ç”ùœŠòþûï'­322¢S§N)¯³~ýúxë­·’b_ÿú×£qãÆ)¯UTçÎ�“Ö¹¹¹ññÇ—:ݺu±hÑ¢¤Xy~Ÿà`‘™™½{÷ŽóÎ;o¯/S¯]»v´nÝ:ú÷ïüããŽ;îH¶øØc�E¯^½¢]»vû¬·fÍš¸ÿþû“b�7ŽÇ<)¿~ýúѬY³8ãŒ3â‰'žˆûî»/ñrï 6ÄÝwߣF�*Ï#Gzzz´iÓ&ºté�;wŽ7ß|3i˜hEèÔ©SÜxã�Z#"¢^½zÑ¿ÿ8ï¼ó¢U«V{ÜÓ AƒèÔ©S\|ñÅqç�wÆÿøÇÄg1|øðxýõ×£ZµjÚë·¾õ­èܹsôèÑ#jÖ¬¹¹¹ñÑG%>¯Y³fT¯^=êÕ«­ZµŠ^½zÅ�~ô£2dHÌŸ??±oéÒ¥ñè£�Æõ×__¡ýph0è8ä¼÷Þ{Åb%½©|áÂ…ÅbmÚ´)sÝ¢9Ÿ~úi™ò ã¶ÛnK\jÍÊÊŠÛo¿½Ì}T”­[·ÆÓO?�ëÙ³gÔ©S'åµ&Nœ˜t¹7"¢oß¾)¯³'§œrJÔ­[76nܘˆ=ñÄ1hРRå�;6víÚ•X׬Y3¾ó�祿O¨héééѧOŸ2dH´lÙ²Ôy ˆÌÌ̸õÖ[±‚‚‚xøá‡ãW¿úÕ>ó}ôÑÈÍÍM¬322â‘G)qHèàÁƒcùòå1nܸDì/ùKÌ™3§T/5oܸqôîÝ;ºté]ºt‰Ž;FÍš5ŸÏš5kŸgìjÔ¨W]uU\vÙeQ»víRådggLj#bÇŽñòË/'âŸ}öYL˜0!¾ÿýïWP·ÿõãÿ¸Ì9mÚ´‰§žz*Î:묤û &Lˆ¡C‡Fzzz*[àäo–À!eçÎ�ñÊ+¯$ÅÚ´iM›6Ýk΂ ’ÖѸqã2×>âˆ#’Ö[·n�•+W–:ÿw¿û]̘1#±¾âŠ+¢uëÖeî£"¬]»6®¼òÊX¾|y"–““ÿû¿ÿ[!õ^z饤uݺuã›ßüf…Ô*ªzõêñ£ý()ö׿þ5Æ�………%æþþ÷¿�'Ÿ|2)và 7”ú2,LÎ=÷Üxà�Ê4äó ýû÷�îÝ»'Å&Ožyyy%æ­Y³&þð‡?$Å.ºè¢èܹó>k^ýõqøá‡'Ö………ñÈ#�”ªß믿>zè¡«Š#FÄõ×__®{�·Þzk±—ÿù曩j-å5jLŠ­^½:æÎ�[IP•ô R^xá…¤a”½{÷.1gÕªUIëF�EFFF™kyä‘Åb¥ô¹råÊxðÁ룎:*®ºêª2÷�*yyy±zõêx÷Ýwãî»ïŽï|ç;ñÞ{ï%>ÏÎÎŽ‘#GF«V­R^{îܹ1gΜ¤ØYg�ÙÙÙ)¯µ7_|q±ß›_|1†“'OŽÏ>û,vìØyyyñùçŸÇ믿?üáãç?ÿyÒ0Ћ/¾8.ºè¢Ö7¤RyîSîîœsÎIZoݺuŸƒß|óÍÈÏÏO¬ÓÒÒââ‹/.U½5jDÿþý“b“'OŽ­[·–®á*n~žuëÖ�3Î8#)öÁìoKꤓN*+zÏÊ#³²8PV¬X¿üå/“buëÖ�üà%æmÛ¶-i]«V­rÕßS^i/†Þ~ûí±eË–Äzøðál°åêÕ«ã”SN)õþ®]»Æˆ#¢C‡ÒÏK/½T,Ö¯_¿ ©µ7éééqÿý÷G‹-â·¿ýmDDÄüùócþüùñè£�–˜øá‡Ç�7ÞßûÞ÷D»pPÚÓ]ÃÕ«W—˜óæ›o&­¿úÕ¯FóæÍK]³_¿~1f̘Ä:///Þ~ûíøö·¿]ê3س¢?ÏmÛ¶Å–-[Ê}÷¶¢5lذX¬è½a(�ôÊnà@(((ˆn¸!6oÞœ¿þúë£^½z%æ½°W­Zµrõ°§¼Ò\üóŸÿœt)õ»ßýnœ|òÉåê¡"µmÛ6üñxþùç+lÈgAAA¼úê«I±öíÛG—.]*¤^I233ãúë¯�?ÿùÏ1pàÀ¨S§Î>sjÖ¬·Ýv[¼ù曆|pÈËÉÉ)ËÍÍÝëþ¼¼¼x÷Ýw“bÝ»w/SÍ-ZÄG‘ûûßÿ^¦3س=Ý•-éçYÙŠÞ+ŽØóðO(+ƒ>€CÂ]wÝÓ§OOŠ�rÊ)qÁì3·èÃòúÜÓeÔ} úÜ´iSÜyç�‰uݺuã–[n)WýŠ6þü¸öÚkã¿øE¬Y³¦BjLž<¹ØÙ}ûö­�Z¥ñÅ…á>ø`�—=‹ÚºukÜu×]qÍ5×ĬY³@‡pðúüóÏ‹Å4h°×ý‹-м¼¼¤ØñÇ_æºEsæÍ›Wæ3(nùòåIë´´´¨_¿~%u³oï¿ÿ~Ò:###:uêTIÝP•dVví™gž‰çž{.)vÄGÄý÷ßiii•ÔUéÜwß}±zõêÄúÆo<ào ¯Q£F\~ùåI±m۶ņ bΜ9±xñâ(,,LÄÇ�¯¾új<øàƒqòÉ'§´——^z)i�™™gŸ}vJk”ÖG}ÿû¿ÿŸ~úiR¼^½zÑ­[·hÒ¤IDD¬[·.>üðÃX¶lYDDÆ?þñ�xûí·cèСqå•WðÞà`ðÞ{hÑb¯û.\X,Ö¦M›2×-šSô.àÁlùòå1cÆŒX¹relÚ´)jÔ¨õêÕ‹fÍšE×®]£F�•Ö[ÑŸç‘G™™çh“­[·ÆÓO?�ëÙ³gÔ©S§’: *98ÿ6 �"¯½öZÜu×]I±ÚµkÇc�=VâßwW½zõ¤õŽ;ÊÕËöíÛ‹ÅJºL9mÚ´?~|b}ÜqÇÅyç�W®Úû£fÍšqã�7îõóE‹ÅO<Ï?ÿ|bàçúõë㪫®Š'žx"ºuë–’>Ö¯_o½õVRìÔSO�Ã;,%ç—Å|—^zilÛ¶-kܸq 80Ž;î¸èÔ©S±ß›iÓ¦Å=÷ÜsæÌ‰ˆˆ�;wƃ>ñ?ÿó?´¨l;wîŒW^y%)Ö¦M›hÚ´é^s,X�´ÎÈȈÆ�—¹öG‘´Þºuk¬\¹²\gH¯¾új±—¦ï.+++ºví?øÁâÛßþv¤§§°Þ>ýôÓ˜1cFRì´ÓN;`õËbíÚµ1tèÐX¾|y"–““ÿû¿ÿ[‰]P•¸¿‘`“'OŽaÆŮ]»±œœœxôÑG£C‡¥>§è0ÎòúÜSÞÞ}æååÅOúÓÄàÌÌÌÌ1bD¤¥¥•«vE:ꨣbĈñè£�FVVV"¾cÇŽøñ�[·nMI�‰'F~~~R¬_¿~)9»,6lØC† IòÙ©S§øÅ/~Çü^FÝ»w�ßÿþ÷Ñ£G�¤ø¯ýëøàƒ*´g8ؼð Iƒ#"z÷î]bΪU«’Ö�5ŠŒŒŒ2×>òÈ#‹ÅV®\Yæs´‚‚‚?ÏÏÏ�éÓ§Çu×]}úô‰ÿüç?¨³ˆÑ£G‹íëçy äååÅêÕ«ãÝwß�»ï¾;¾ó�ïÄ{ï½—ø<;;;FŽ­ZµªÄ.¨J2+»€Š0}úô2dHÒ`Ȭ¬¬9rdtëÖ­LgƹeË–rõ´§¼š5kîqïÃ?‹-J¬ íÛ·/WÝåôÓO�Ÿüä'1|øðDlÙ²e1a„¸øâ‹÷ûü¢o ¯W¯^œ~úéû}nYýæ7¿‰Õ«W'Ö999ñàƒÆÚµk÷™[­ZµxðÁãÛßþv¬Y³&""víÚ#GŽŒ§Ÿ~ºÂz€ƒÉŠ+â—¿üeR¬nݺñƒü Ä¼Ý_ÒQ«V­rÕßS^ª^l~°X°`A 0 î¼óÎ8ûì³+´Ö[o½¯½öZRì„NˆîÝ»WhÝ=Y³fM|ÿûß/õþ®]»Æˆ#¢C‡Ø‡šôÊn ÕfÏžW^yeäææ&béééqï½÷–k0äᇞ´^½zuìܹ³Ìç}ëüžÎŽˆøä“OâñÇO¬›6mÿó?ÿSæz•áüóÏ�-Z$Å^ýõý>wîܹ1gΜ¤Øw¿ûÝÈÎÎÞï³Ëb×®]1a„¤Ø÷¾÷½hܸq©Ï¨U«V 80)6eÊ”X±bEJz€ƒYAAAÜpà ±y󿤸õ×_õêÕ+1·è ÏjÕª•«‡=å=û`Ò Aƒ8çœsâÞ{ï�_|1Þ}÷ݘ={v¼ÿþû1iÒ¤x衇âì³Ïެ¬¬¤¼;vÄ-·Üï¾ûn…õ¶råʸå–[’bYYYñ“Ÿü¤Âj¦BÛ¶mãñÇ�çŸÞ�OR.³²H¥O>ù$.½ôÒØ²eKRüöÛo�³Î:«\g¶nÝ:i½sçÎX¹reyä‘e:§è Ïš5kÆGQl߬Y³"???±nÖ¬Y<üðÃåªñüóÏÇ?ÿùϤØ�7ÞXªóÊ*===N?ýô7n\"6{öìØ¹sgddd”ûÜ—^z©X¬_¿~å>¯¼æÎ�6lHŠ�vÚie>ç´ÓN‹‡z()öÁDïÞ½÷§=8èÝu×]1}úô¤Ø)§œ\pÁ>sw |Dù}æä䋌ƒ>�>úèøÕ¯~ßúÖ·"3³øˆ�¬¬¬¨U«V4oÞøàƒÄž‚‚‚:th¼ñÆQ¿~ý”ö·cÇŽøŸÿùŸX¿~}RüÚk¯=è‡gΟ??®½öÚ8÷ÜsãÊ+¯ŒÃ;¬²[  1è¨2/^ƒ *6ˆñæ›oŽóÏ?¿Üç¶iÓ¦XlÁ‚eô¹pá¤u«V­J•7uêÔ˜:uj™jínâĉÅb5è3"¢yóæIëüüüظqc4hР\çÄ«¯¾šëСCtìØ±Ü=–ײeËŠÅš5kVæsö”³jÕªrõ_Ï<óL<÷ÜsI±#Ž8"î¿ÿþHKK«¤®^gžyf™ö7kÖ,žy晸úê«còäɉøÆ�ã7¿ùM 6,e½íÚµ+nºé¦˜5kVRü´ÓN‹+®¸"euʪF�ñÝï~7±>ì°Ã"///6lØsæÌ‰Å‹GaaaDüw¸ë¸qãâÕW_�|0N>ùäÊj€*Æ O JX¾|y 4(V¯^�¿öÚkcРAûuöQGÙÙÙ‘———ˆÍ˜1#N=õÔ2�³ûÛÑ#"Ú·o¿_}¬öôÆøý1yòäX³fMR¬oß¾)­QZ¹¹¹Åb999e>gO9»ÿ~@UóÚk¯Å]wÝ•«]»v<öØc¥~™xõêÕ“Ö;vì(W/Û·o/«Q£F¹Î:ØdffÆC=ßùÎw’îÕþþ÷¿�ë®».ªU«–’:wÜqG¼ñÆI±:ÄC=T©C[kÔ¨^xabݱcǤߛE‹ÅO<Ï?ÿ|bàçúõë㪫®Š'žx"ºuëvÀ{ êI¯ìöך5kâ’K.‰eË–%Å×\sÍ~ŸŸ��'�tRRlÚ´ie:céÒ¥±|ùò¤Øé§Ÿ¾¿­”Š[ÍÌÌŒúõë—û¼—^z)i�••gŸ}v¹ÏÛuêÔ)[¿~}™ÏÙSN½zõÊÓô&OžÆ ‹]»v%b999ñè£�F‡J}NÑaœåô¹§¼ª2è3"¢V­Zqå•W&Årssã½÷ÞKÉù#GŽŒßýîwI±-ZÄoûÛ¨U«VJjT”£Ž:*FŒ�>úhdee%â;vìˆÿøÇ±uëÖJ쀪 OàKmÆ 1hРX´hQR|À€1lذ”ÕéÙ³gÒzúôé±téÒRçV™��§œrÊ÷öë×/æÎ�[®?ãÆ�+vÞ¸qãŠí«HS§NMZyä‘å~3ûúõëã­·ÞJŠõèÑ#4hPîþöG£F�ŠÅþýï—ùœ?ü°TgÀ—ÝôéÓcÈ�!‘ŸŸŸˆeeeÅÈ‘#£[·ne:«è0Î-[¶”«§=åÕ¬Y³\g¬¾ýío‹¥bÐç“O>�<òHRìðÃ�'žxâKuòôÓO�Ÿüä'I±eË–Å„ *©#ªƒ>€/­­[·Æå—_óæÍKŠŸ}öÙqûí·§´VÏž=“ÞÚ]XXÏ>ûl©rssscüøñI±ÓN;­Ê]�ˆ˜={v̘1#)Ö£G�rŸ7qâĤ‹½ÿ„ZYÚ·o_ìçöÊ+¯”ùœ¢ƒ_ÓÓÓãøã�߯Þà`3{öì¸òÊ+#777KOO�{ï½7N?ýô2Ÿwøá‡'­W¯^;wî,ó9Ë—/ßçÙ_v‡~x4mÚ4)¶råÊý:óùçŸ�{î¹')V¿~ýxòÉ'£yóæûuve8ÿüó£E‹I±×_½’º *1èøRÚ±cG\uÕU1sæÌ¤ø™gž÷ÜsO¤¥¥¥´Þa‡ HŠ=ûì³ñÑGí3÷W¿úUÒÅÈ´´´øÑ�~”ÒþReOWKkýúõqË-·Ä®]»’â}úô)÷™Eb6lØp¿‡înêÔ©qôÑG'ý=zt‰9™™™ñõ¯=)6gΜxá…J]wÒ¤IñÖ[o%ÅŽ=öب[·n雀ƒÜ'Ÿ|—^zilÙ²%)~ûí·ÇYg�U®3[·n�´Þ¹sg¹†W½/Y³fÍ8âˆ#ÊÕÓÁ¬AƒIëuëÖ•û¬‰'ÆðáÓbµjÕŠßþö·Ñ¶mÛrŸ[™ÒÓÓ‹ œ�={v¹†ÇÀî ú¾t bèС1mÚ´¤øi§�<ð@dddTHÝ«®º*ªW¯žÔÇ�~ô£˜?þ^sžzê©xúé§“bgžyftêÔ©BzÜ_Œ›nº)fÏž]¦¼éÓ§Ç÷¿ÿý˜7o^R¼wïÞqì±Ç–«—¹sçÆœ9s’bgŸ}vdff–ë¼T¹ì²ËŠÅî½÷ÞxóÍ7÷™û§?ý)nºé¦bñ«®º*%½ÀÁ`ñâÅ1hРذaCRüæ›oŽóÏ?¿Üç¶iÓ¦XlÁ‚e>gáÂ…IëV­Z•»§ƒYaaaÒ:--­\çLš4)† –ô2øêÕ«Çc�=�;wÞ¯+[óæÍ“Öùùù±qãÆJꀪ¢rÿ+H€r=zt¼õÖ[I±ÌÌÌhÙ²eŒ5ª\gvêÔ)zõêUâžF�Å�7ÞwÜqG"¶|ùò8ÿüóã‚ .ˆÞ½{G³fÍbÛ¶m1wîÜxöÙgãí·ßN:£^½zqóÍ7—«Ça×®]ñÊ+¯Ä+¯¼-[¶Œ=zD§N�¢}ûöQ¿~ý¨]»vìÚµ+¶lÙŸ}öYÌ™3'Þxã�˜1cF±³Z´h·Þzk¹{y饗ŠÅúöí[îóR¥k׮ѷoߤþ âñÇ�¿ÿýïñ�o|#ªU«Í›7�´´´X»vm|øá‡ñÒK/ÅÔ©S‹�׳gÏèÑ£Ç�|¨0Ë—/�AƒÅêÕ«“â×^{m 4h¿Î>ꨣ";;;òòò±3fÄ©§žZ¦s>øàƒ¤uûöí÷«¯ƒÕÚµk“Ö 4(óo¿ýv\ýõQPP�ˆeeeůýëèÖ­Û~÷XÙ*ûôTMþ¶ |é¬\¹²X¬   žyæ™rŸÙ·oß}úŒˆøÁ~óçÏ�ßÿþ÷‰ØÖ­[ãñÇ�ǼÄÜœœœ=ztyä‘åîó@Z¼xqŒ7®\¹GuT<õÔSѨQ£råÄ«¯¾šëÔ©S}ôÑå:/ÕFŒË—/�)S¦$Å,X ,ˆßþö·¥:§k×®ñÀTD‹pÀ­Y³&.¹ä’X¶lYR|ðàÁqÍ5×ì÷ùÙÙÙqÒI'Å?þñ�DlÚ´ie:céÒ¥±|ùò¤Øé§Ÿ¾ß½lV®\Yì9Ëz¯súôéqÍ5×$ VÍÌÌŒ‡z(N9å””ôYÙŠ¤ÍÌÌŒúõëWR7Té•ÝÀ—ÍðáÃãÚk¯�ŒŒŒRç4iÒ$Æ�Ý»w¯ÀÎ*_FFF <8^~ùåhÒ¤I¹Ï™[ªÜÜÜÜ?~|Rì´ÓN‹š5k¦´ÇʶiÓ¦;vlR,''§Ôƒ>çÏŸ—]vYlÙ²%)þóŸÿ<Î>ûì”õYÙfÏž3fÌHŠõèÑ£’º *ɬìÊêž{î‰{î¹§²Ûˆ:ÄÈ‘#cË–-1cÆŒX¼xqlÞ¼9222¢aÆѡC‡èرã}«÷‰'žsçÎ-w~ƒ âœsΉsÎ9'""Ö¯_Ÿ~úi,[¶,Ö­[¹¹¹‘––µjÕŠš5kF³fÍ¢cÇŽQ£F�=Á�5*¥çíÉþþ³úBëÖ­cذañÝï~7V®\‹/Žš5kÆöíÛ#"¢V­ZQ¯^½èСC´jÕÊ[Þ¨RvìØW]uUÌœ93)~æ™gÆ=÷Ü“ò{s‡vX 0 i¸ç³Ï>ßûÞ÷¢cÇŽ%æþêW¿Š•+W&Öiiiñ£ý(¥ý¥ÊÊ•+£qãÆeÎËËË‹¡C‡Æš5k’â^xaäääì3éÒ¥1hРX¿~}Rü–[n‰”¹ŸÒøì³Ï¢gÏžI±¾}ûîó¾ðòåË£I“&媹~ýú¸å–[b×®]IñƒíÅô|9ô °ŸjÕª§žzjœzê©•ÝJÊÕ¯_?êׯÇ|e·ò¥Ð¸qãhܸqtìØ1ªW¯^Ùí@…*((ˆ¡C‡Æ´iÓ’â§�vZ<ðÀ‘‘‘Q!u¯ºêª˜0aBäææ&úøÑ�~¿ýío£mÛ¶{Ìyê©§âé§ŸNŠ�yæ™Ñ©S§ éq}ï{ß‹3Î8#.¾øâèСC©r-Z7ÞxcÌš5+)^§N�¸òÊ+÷™¿råʸä’KbÕªUIñ¡C‡Æ%—\RêÞ”�ÆqÇ?üá£sçΥΛ>}züô§?�… &Å{÷îÇ{lŠ»àPdÐ'e6zôèxë­·’b™™™Ñ²eË5jT¹ÎìÔ©SôêÕ«Ä=�5Šo¼1î¸ãŽDlùòåqþùçÇ\½{÷Žf͚ŶmÛbîܹñì³ÏÆÛo¿�tF½zõâæ›o.So¿üå/÷úÙœ9s’Ö7n,qÿ€¢yóæ{ý¼   &L˜&LˆV­ZÅ7¾ñ�èØ±c´k×.êׯ5kÖŒ¼¼¼X¿~}Ìš5+þö·¿Å¤I“bçÎ�IçdeeÅÈ‘#£~ýúû|¾¡C‡ÆgŸ}–kÔ¨QlÛ¶­Äg)Éw¾ó�2 á,‹]»vÅ+¯¼¯¼òJ´lÙ2zôèíÚµ‹ŒŒŒ¨]»vT¯^=6mÚëׯ�Ï>û,æÌ™o¼ñF̘1£ØY-Z´ˆ[o½µBúàÐcÐ'e¶råÊb±‚‚‚xæ™gÊ}fß¾}÷9è3"â?øAÌŸ??~ÿûß'b[·n�Ç<üñssrrbôèÑqä‘G–©·±cÇ–zï–-[JÜê©§–8èswŸ~úi|úé§¥®ý…5jÄ]wÝ'Ÿ|r©ö¯ZµªXlõêÕezî¢Z·n]aƒ>w·xñâ7n\¹r�:ê¨xê©§¢Q£F)î €CUze7e5|øð¸öÚk###£Ô9Mš4‰qãÆE÷îÝ+°³Êwì±ÇÆ‹/¾Xª¡©‡ªŒŒŒüðÃXºté>sÒÓÓ£mÛ¶qÖYgEß¾}£qãÆ S5}Pf÷ÜsOÜsÏ=•ÝFtèÐ!FŽ[¶l‰3fÄâÅ‹cóæÍ‘‘‘ 6Œ:DÇŽ#--m¿êÌ�;7EïÛ)§œ§œrJDDìÚµ+/^Ë–-‹+VĦM›bûöí‘••uëÖ�ºuëF»ví¢uëÖûUóoû[*Z/³fÍš•ëŸmƒ âœsΉsÎ9'""Ö¯_üq¼÷Þ{±iӦرcG4nÜ8êׯ5kÖŒfÍšEÇŽ£F�)~HfÐ'_zµjÕŠSO=5N=õÔÊn%¥ÒÓÓ£U«VѪU«Ênå V¿~ý8öØc#;;;ëØ±cT¯^½»àP”^Ù @U�YÙ À—Yaaa|öÙg1oÞ¼X±bElÞ¼9²³³£N�:qÔQGE—.]¢Zµj)­¹eË–øàƒbÑ¢E±eË–ÈÉɉ#�<2Ž;î¸hܸqJk}òÉ'1gΜXµjUìÚµ+êÕ«íÚµ‹®]»Fffê®#WÅgàÐãpÈI¿ñÕÊn�*ê½ �¬ì€dãÆ�1iÒ¤øç?ÿS¦L‰õë×ïuoVVVôèÑ#~øÃF÷îÝ÷«îÒ¥KcÔ¨Qñ§?ý)òóó‹}ž––'œpB 2$N8á„r×),,Œ &ÄØ±ccÑ¢E{ÜS¯^½¸ð ãŠ+®ˆ5j”»VU|&]é•Ý|™Ü~ûíñõ¯=n½õÖøÓŸþTâ�ψˆüüü˜4iR 80† [¶l)WÝ×_=¾ûÝïÆ+¯¼²Ç�˜ÿf9mÚ´8p`üò—¿ŒÂÂÂ2×Ù´iS\zé¥qÛm·íu fDĆ b̘1qöÙgÇ'Ÿ|Ræ:Uó™8´ô eðïÿ{�C)322âˆ#ŽˆN�:ÅÑGµk×.¶çå—_ŽAƒÅÖ­[ËTóOúSÜpà ‘›››oРAtêÔ)Ž8âˆHKKKÄ cìØ±q÷Ýw—©ÎöíÛãÒK/�ýë_Iñ¬¬¬8ꨣ¢}ûöQ£F�¤Ï–.]_|q,^¼ø�&Ȭìà˪N�:ѧOŸ8ýôÓã«_ýjÔªU+ñÙÎ�;cúôé1jÔ¨˜>}z">sæÌ¸å–[bÔ¨Q¥ª±dÉ’¸õÖ[c×®]‰X‡â–[n‰¯}ík‰ØÂ… 㡇Š¿üå/‰ØÓO?ݺu‹3Ï<³Tµî¾ûî˜9sfb�žžW]uU\rÉ%Q·n݈ˆÈËË‹‰'Æ=÷Ü7nŒˆˆuëÖÅu×]ãÇ��ŒŒŒCò™ ""½²€/›¦M›Æ�wÞÿüç?cøðáÑ£G�¤!Ÿqâ‰'ƸqãbÀ€IŸ½ñÆ1eÊ”RÕ9rdlÛ¶-±îÒ¥K<÷ÜsI1#"Z·n£F�*Vëþûï�‚‚‚}ÖY°`A¼ð År‡šˆ‘��ýúõ‹çž{.êÔ©“ˆôÑGñòË/²Ï}@™ 2$þüç?Çyç�999ûÜŸ‘‘Ç�Î�;'Å‹ Ü“O>ù$^ýõÄ:+++î½÷ÞbCE¿�––·Ýv[uÔQ‰Ø’%KâÅ_Üg­Ñ£GÇÎ�;ëï}ï{ѧOŸ½îo×®]üøÇ?NŠ=üðÑŸŸ_b�ªøLð…ÌÊn¾LN?ýô2çdddÄe—]×]w]"ööÛoï3o„ ±k×®Äú¬³ÎŠ6mÚ”˜S­Zµ¸üòËã¶ÛnKÄ^xá…8ÿüó÷š³qãÆøë_ÿšX§¥¥Åµ×^»Ïþú÷ïcÆŒ‰eË–EDIJeËâ�wÞ‰=zRÏ@ù¤ßøje·@õÞ…GVv ÂÒ+»8tëÖ-i½aÆÈÍÍ-1çoû[ÒúÜsÏ-U­Þ½{G�5ëY³fÅÊ•+÷ºÿïÿ{$ÖÝ»w�æÍ›ï³Nzzzôë×/)öæ›o–˜SŸ ¾`Ð'uëÖ-Û¼yó^÷/\¸0/^œXרQ#Ž;î¸RÕ*º·°°0þñ�ìuÑÏN9å”RÕ‰ˆ8ùä““Öo½õÖ^÷VÅg€Ýô ÀÊ•+‹ÅêÕ«·×ýüqÒºK—.‘™™YêzÇ|Òú?ÿùÏ^÷ý¬´Ã7#":wîÙÙÙ‰õªU«bݺu{Ü[Ÿ vgÐ'Ó§OOZ7mÚ4i˜dQ ,HZ·mÛ¶LõÚ´iSây_ÈÏÏ�%K–”˜[’ìììhÑ¢E©jUÅg€Ý•þõ×t ã³Ï>‹yóæÅŠ+bóæÍ‘��uêÔ‰£Ž:*ºtéÕªUKiÍ-[¶Ä|‹-Š-[¶DNNNyä‘qÜqÇEãÆ�SZë“O>‰9sæÄªU«b×®]Q¯^½h×®]tíÚµLonß—ªøLÀÁg„ IëÓN;­ÄýŸ~úiÒúˆ#Ž(S½&Mš”xÞ–.]‰uNNN4hРLµŽ8∘?~R­N8¡Ø¾ªøL°;“¿d6nÜ“&MŠþóŸ1eÊ”X¿~ý^÷feeE�=â‡?üatïÞ}¿ê.]º4F�úÓŸ"??¿Øçiiiq 'Ä�!CöëcaaaL˜0!ÆŽ‹-ÚãžzõêÅ…^W\qEÔ¨Q£Üµªâ3§üãñÞ{ï%ÅúõëWbÎÚµk“ÖeŠYô…ç{»wºnݺóÊS«hï{‹W…g€Ýôù%rûí·Ç /¼°Ç¡”{’ŸŸ“&MŠI“&Å9çœ?ýéO£V­Ze®ûúë¯Ç­·Þ¹¹¹{ÝSXXÓ¦M‹�Æe—]7ÜpC¤¥¥•©Î¦M›âºë®‹ýë_%îÛ°aCŒ3&&NœcÆŒ‰víÚ•©NDÕ|&àà´aÆøÙÏ~–ûæ7¿ÇsL‰yÛ¶mKZ—õeâÕ«WOZçççG^^^dgg'Å·nÝZb^ií­hï{‹W…g*¯íÛ·GAAAJÏH¥íÛ·—¸ ü|×8p|ר8¾k³Ê¾›eÐç—È¿ÿýï=ùÌÈȈF�EÆ £   >ÿüóؼysÒž—_~9.\O=õTÔ¬Y³Ô5ÿô§?Å 7Ü»víJŠ7hÐ š4ik×®�•+WFaaaDüw8æØ±c#///n½õÖR×Ù¾}{\zé¥1sæÌ¤xVVV4mÚ4²³³ã³Ï>Kº ¹téÒ¸øâ‹ãøC´lÙò�~&àà´k×®¸é¦›bÅŠ‰XíÚµã'?ùÉ>s‹–,:Ìr_rrrŠÅ¶nÝZ윢uªU«V¦:{Ê)í ÏªðLå5oÞ¼”žPÑ.\XÙ-TY¾kTßµ*ŽïZ{gÐç—T�:u¢OŸ>qúé§ÇW¿úÕ¨U«Vâ³�;wÆôéÓcÔ¨Q1}úôD|æÌ™qË-·Ä¨Q£JUcÉ’%që­·& ÄìСCÜrË-ñµ¯}-[¸pa<ôÐCñ—¿ü%{úé§£[·nqæ™g–ªÖÝwß�43===®ºêª¸ä’K¢nݺ‘——'NŒ{î¹'6nÜëÖ­‹ë®».Æ�‡ä3¯ûî»/&Ožœ1bD4iÒdŸ¹;vìHZgee•©öž†h=3uöTkûöí{ÜWŸ v—^Ù P6M›6�;ï¼3þùÏÆðáãG�IC>#"222âÄOŒqãÆÅ€’>{ã�7bÊ”)¥ª5räȤ7�wéÒ%ž{�˜­[·ŽQ£F«uÿý÷GAAÁ>ë,X° ^xá…b¹C‡M ÄŒøïeÉ~ýúÅsÏ=uêÔIÄ?úè£xùå—ÙgNãÆ�‹'Ÿ|2)vÙe—EïÞ½K•_­Zµ¤u~~~™êçåå‹íiPæþÖÙS­¢g¦ªÖÁøL°»ÌÊn€Ò2dHœ|òÉ{¼Œ¸'1|øð˜3gNÌž=;á…Š ¶,ê“O>‰×_=±ÎÊÊŠ{ï½·ØPÑ/¤¥¥Åm·ÝS§N�E‹EDÄ’%KâÅ_ŒóÏ?¿ÄZ£G�Ž�;w&ÖßûÞ÷¢OŸ>{Ýß®]»øñ�?ùÉO±‡~8Î>ûìß¶^Ÿ 88½úê«q×]w%Åúõë7Þxc©Ï¨Q£FÒzOC.K²}ûöb±š5kî³ÎŽ;ÊTgO9EÏÜ[¼*23]ç^Û·o�… &Ö­[·ŽœœœJì êð] v÷ye7@ç»ø¾EÅñ] 8˜ļyó*­¾›a_"§Ÿ~z™s222â²Ë.‹ë®».{ûí·÷™7a„صkWb}ÖYgE›6mJÌ©V­Z\~ùåqÛm·%b/¼ðB‰C17nÜýë_ë´´´¸öÚk÷Ù_ÿþýc̘1±lÙ²ˆˆX¶lY¼óÎ;Ñ£G�CꙀƒÏ[o½7ß|s&bgžyfÜyç�‘––VêsŠ–ܶm[™úÈÍÍMZgffFµjÕŠí+:(³h^ií­´ƒ>«Â3•WNNŽÂ_*999Q½zõÊn Jò]  âø®Pq|×fùùù•Z?½R«s@tëÖ-i½aÆ}^VüÛßþ–´>÷ÜsKU«wïÞI—gÍš+W®Üëþ¿ÿýïQPP�XwïÞ=š7o¾Ï:éééѯ_¿¤Ø›o¾YbNU|&àà2eÊ”:thÒ]¯ýëñÀDFFF™ÎjذaÒzÅŠeÊ/zß±~ýú{Ü× AƒóÊS«hï{‹W…g€Ýôy¨[·n±ØæÍ›÷ºáÂ…±xñâĺF�qÜqÇ•ªVѽ………ñ�üc¯û‹~vÊ)§”ªNDÄÉ'Ÿœ´~ë­·öº·*>ppù÷¿ÿW_}uìØ±#;î¸ãâ׿þudgg—ù¼V­Z%­—/_^¦üÏ?ÿìΠÏCÀžÞ@^¯^½½îÿøã�“Ö]ºtIºè¸/Ç|Òú?ÿùÏ^÷ý¬´Ã7#":wîœtéuÕªU{½€YŸ 8x|üñÇqùå—ǶmÛ±Ž;ÆØ±c£F�å:³è`Éùóç—)áÂ…%ž÷…¬¬¬hÞ¼y¹kåååÅÒ¥KKU«*>ìΠÏCÀôéÓ“ÖM›6-ñ­ð ,HZ·mÛ¶LõÚ´iSây_ÈÏÏ�%K–”˜[’ìììhÑ¢E©jUÅg .ŒÁƒÇÆ�±6mÚÄã�?µk×.÷¹:tHZÏž=; J�ÿÁ$­¿ò•¯ìuoÑÏf̘Qê:³gÏŽ¼¼¼ÄºQ£FѰaÃ=î­ŠÏ»3èó0a„¤õi§�VâþO?ý4i}ÄG”©^“&MJ<ï K—.Mº˜™““ 4(S­¢½í­VU|& ò-[¶, k×®MÄš5kO>ùd™ïÕ¦M›¤ˆoÛ¶­ÔÃ*‹îMKK‹ÓO?}¯û‹~ö¯ý«Ô}¾óÎ;Ië3Î8c¯{«â3Àî2+»*Ö?þñ�xï½÷’býúõ+1g÷‹¦eŠÙ¸qã¤õúõë÷¸oݺu%æ•§VÑÞ÷¯ ÏT^Û·oOF p0Ù¾}{‰kÊÏw-€Ë÷-€Šã»p°r/ëдjÕª¸ä’KbÅŠ‰XãÆ�ã©§ž*×Â=9ãŒ3â©§žJ¬Ç�'œpÂ>ó^ýõضm[bݹsç{êÑ£Gdff&~—§M›K—.�æÍ›—X§°°0^|ñŤXÏž=KÌ©ŠÏ_0è³ Û°aCüìg?KŠ}ó›ßŒcŽ9¦Ä¼Ý/@FDÔ¨Q£Lu«W¯ž´ÎÏÏ�¼¼¼ÈÎÎNŠoݺµÄ¼Ò(Ú[ÑÞ÷¯ ÏT^óæÍKéyiáÂ…•Ý@•å»@Åò}  âø®ÀÁbÆ 1xðàX²dI"Ö AƒxòÉ'÷9H²,ú÷ïO?ýtFDÄk¯½W\qE´iÓf¯9;v숱cÇ&ÅÎ=÷ÜëÔ«W/zöìo¼ñFDüwØåèÑ£ã¾ûî+1oüøñ±lٲĺiÓ¦qÒI'rÏ_H¯ì¨»v튛nº)é ñµk׎Ÿüä'ûÌ-:X²è0Ë}ÉÉÉ)+:sOuªU«V¦:{Ê)í ÏªðL@娲eK\vÙeñÉ'Ÿ$buêÔ‰'žx¢Äa•åѾ}ûèÕ«Wb�ŸŸÆ ‹-[¶ìqaaaü⿈E‹%bÍ›7�þýûï³Ö�!C"=ýÿ_/þ¿ÿû¿˜8qâ^÷ÏŸ?¿ØÐÌ«¯¾zŸ÷4«â3À ú¬¢î»ï¾˜«œW_}5îºë®¤X¿~ýâÆo,õ5jÔHZïiÈeI¶oß^,V³fÍ}ÖÙ±cG™êì)§è™{‹W…g*¯œœœR½Áà`�““Õ«W¯ì6ª$ßµ*–ï[Çw-à`UžCCYœuÖYQXX·Ýv[Ò½ÆuëÖźuëö˜3xðàøñ�\¦:Õ«W�Ç<†S¦LIÄóóóãÓO?ÝcNÓ¦Mc̘1ѪU«2ÕªŠÏé•Ý©óÖ[oÅÍ7ßœôÖò3Ï<3î¼óÎHKK+õ9EK};ù¾äææ&­333£ZµjÅö”Y4¯4ŠöVÚAŸUᙀCKŸ>}bâĉѧOŸ_ú} 'Ä3Ï<Æ +ÓÒ/Ô«W/ž|òɸãŽ;¢eË–%î»êª«âÕW_�£�>ºÌu"ªæ3phˬìH�)S¦ÄСC£   ûú׿<ð@ddd”鬆 &­W¬XQ¦ü•+W&­ëׯ¿Ç} 4(1¯<µŠö¾·xUx& rÌ�;·Òj7oÞ<xà�¸ýöÛãý÷ß�E‹ÅÖ­[£ZµjѤI“øêW¿�7Þï:éééqþùçÇùçŸsçÎ��>ú(V¯^;wîŒzõêE»ví¢k×®%ç<”Ÿ €C—AŸUÀ¿ÿýï¸úê«cÇŽ‰ØqÇ¿þõ¯#;;»ÌçµjÕ*i½|ùò2åþùçIëÖ­[ïq_óæÍ#3331œtûöí±nݺbÃ2KR´·½ÕªŠÏºjÕª=zôˆ=zTx­£�>:Ž>úè ¯SŸ €COze7Àþùøã�ãòË/�mÛ¶%b;vŒ±cÇF�5ÊufÑÁ’óçÏ/SþÂ… K<ï YYYѼyór×ÊËË‹¥K—–ªVU|&ààbÐç—ØÂ… cðàÁ±qãÆD¬M›6ñøã�GíÚµË}n‡’Ö³gÏŽ‚‚‚RçðÁIë¯|å+{Ý[ô³3f”ºÎìÙ³#///±nÔ¨Q4lØp�{«â3ƒ>¿¤–-[ƒ еk×&bÍš5‹'Ÿ|24h°_g·iÓ&Z´h‘XoÛ¶­ÔÃ*‹îMKK‹ÓO?}¯û‹~ö¯ý«Ô}¾óÎ;Ië3Î8c¯{«â3ƒ>¿„V­Z—\rI¬X±"kܸq<õÔSѸqã”Ô(:`rüøñ¥Ê{ýõ×cÛ¶m‰uçÎ�Kì©G�‘™™™XO›6-–.]ºÏ:………ñâ‹/&ÅzöìYbNU|&ààaÐç—̆ bðàÁ±dÉ’D¬Aƒñä“OFóæÍSV§ÿþ‘–––X¿öÚk±`Á‚svìØcÇŽMŠ�{î¹%æÔ«W/i˜eaaaŒ=zŸý�?>–-[–X7mÚ4N:é¤sªâ3ƒ>¿D¶lÙ—]vY|òÉ'‰X�:uâ‰'žˆ6mÚ¤´Vûöí£W¯^‰u~~~ 6,¶lÙ²Çý………ñ‹_ü"-Z”ˆ5oÞ<ú÷ï¿ÏZC† ‰ôôÿÿ«øÿ÷1qâĽîŸ?~Üwß}I±«¯¾:²³³K¬SŸ 8xôù%rõÕWǬY³’b—\rI¬_¿>Þyç�2ýÙ¸qã>ë]wÝuQ½zõÄzÖ¬YqÑEÅÔ©S“ö}úé§1dÈ�øãÿ˜¿á†"++kŸuÚ¶mç�w^R즛nŠ‘#G&õ™ŸŸ/¾øb|ÿûß�M›6%âG}tôíÛwŸuªê3‡ÌÊn€Ò›6mZ±Ø¨Q£ÊuÖ¸qãâÄO,qOË–-ã¿øEÜpà QXXüq\|ñÅÑ AƒhÒ¤I¬[·.V¬X‘øü Œ^½z•ºŸ[n¹%æÌ™³gÏŽˆˆ]»vÅ#�<cÇŽ�fÍšEvvv,]º4¶mÛ–”W¿~ý9rddf–îW¹*>ppH¯ì8¸�uÖYñË_þ2rrr’âëÖ­‹9sæÄòåË‹ ÄýôÓ˜;wn±�˜M›6�§Ÿ~:ZµjU¦ZUñ™€ÊgÐ'ûÔ§OŸ˜8qbôéÓ'²²²öºï„Nˆgžy&† iiie®S¯^½xòÉ'ãŽ;-[–¸ïª«®ŠW_}5Ž>úè2׉¨šÏü?öî=:ËêÌÿ•�Ž�„³�i9H8VQÇ3’z¬ÕÑΠ­ØQk�·Úöí8=h_g¦WQ§:à,l}ÕŽÈ€ØÚA*Õ*‚" "¼€Z�r’€4!�@~t™OÎ ÷“Dù|ÖêZÝ×½÷¾ö�Õ®>«ëö»ZWVk€Æ[»vm«õ0`@üË¿üKÜsÏ=ñÆoÄûï¿%%%‘““ýúõ‹O<1úôésÄ}233ãŠ+®ˆ+®¸"Ö®]ï¼óNìØ±#<Ý»w�c�=6Ž?þøzÃ9�æwZ� Oš¤K—.1qâĘ8qbÚ{FaaaÚû|ß hy™­}ø,ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ô ÈjíðÙñ§?ý)>üðÃØ²eKìÞ½;ÊÊÊ"333rss#???† Hû96nÜëÖ­‹­[·Fiii´oß>rss£ÿþ1dÈ�èÝ»wÚÏ}}G•âââxûí·cÕªU±råÊxûí·cÇŽ)sn¹å–øú׿ެý7mÚ“'ONâ¨)î½÷Þ(**ªóyaaaâ=ú;”——ÇK/½o¾ùf¬X±"Ö®]{÷împßž={ÆÅ_W\qE 4(±ónÛ¶-üñøïÿþïØºuk½s bܸqqñÅÇ©§žšØjó­o}+æÌ™sÄûÌ›7/†šÀ‰€tô ¤Eeee¼ÿþû±fÍš(..޽{÷FVVVäææFŸ>}bÔ¨Q‘ŸŸßÚÇŽ³fͪ öüðÃ[û8Í’™™Ùæz~ôÑG1}úô&ï»sçΘ5kVÌž=;n¸á†øú׿999Í=f:t(yä‘x衇bß¾}�Z³yóæøÕ¯~[·nM{Ð'pôô -ä³zó{u|ðAüò—¿Œ¹sçFqqq½s‡—]vY|ñ‹_Œ.]º4é\-}«yRýWPP/¾øb¢{ÎÍïðÿ»ï¾ûZûG$33³UÂ(Ç�—Öý+**â‘G‰·ß~;zè¡èرc“÷())‰¯ýëñÊ+¯¤á„M#èÒèhºùýàÁƒñóŸÿ¾üå/Ç9çœcÇŽ�víÚÕ:¯S§NÑ£G�6lX\~ùåñ»ßý.¾ñ�oDIIIÕœçž{.¾øÅ/Æi§�Öèsÿã?þcJÈgFFFÜpà qË-·DçÎ�kÌÏÏÏ�!C†Ä…^ßùÎwbÙ²eñÎ;ï4º_RŽ;ì²Ë""bĈѱcÇ?�‚>à3¢µn~�ˆxøá‡k ùœ4iRL™2%Ž;î¸ÈËˋĖ-[bÉ’%ñ‹_ü"6oÞ\5÷àÁƒñÿðqì±ÇÆÐ¡C›|þ1cÆÄ‰'žØäu�½Õ|âĉѳgÏ&ïÿ‰_|16lØ�RkÌǯIró;G³Ñ£GǨQ£ªþ5hРÈÌ̬zždÐ瑚3gNʸk×®qÎ9ç´hÏÌÌ̸ôÒK\—ŸŸßýîw›ÜïÌ3ÏŒŸþô§5¾}úé§ôùòË/§œ;###î¹çž¸òÊ+}Ž“N:)N:é¤FÏhˆ OhAŸÅ›ß·mÛÿþïÿžRËÎÎŽý×�sÏ=·Æüüüü8î¸ãâšk®‰oûÛ1þüªgqï½÷ƬY³š|þñãÇÇ׿þõ&¯k¬óÏ??Î?ÿüf­­¨¨¨ññëÀ�ã„NHâh�ææwŽfO?ýtk¡QÖ®]«W¯N©]pÁ‘“““¶žÅÅűhÑ¢”Úøñã£OŸ>iëqÆgÄÉ'Ÿ¯¿þzUíå—_nÔÚ}ûöÅ÷¾÷½”ÚßüÍß4)ä }@ 7¿?ÿüóQVV–R»óÎ;k ù<\‡âÇ?þq¼÷Þ{)£¾ú꫱}ûöèÝ»wNß¶-^¼8vîÜ™RkLˆ*pô©þMgDDQQQZ{Ο??ÊËË[´ç'N=õÔ” Ï½{÷ÆŸÿüçèÒ¥K½ëæÏŸ›6mª÷îÝ;­—Æ4– OH££áæ÷W_}5eœ››_úÒ—Õ7+++þîïþ.%ð´²²2–-[\pA£öø4¨þÁmfff\z饭s Íª¨¨ˆyóæ¥Ô _øÂÒÚ·ú·Ž¹¹¹qöÙg§µç'zöìY£VZZÚ`ÐçSO=•2¾âŠ+\Ð2[û@ë;’›ß·mÛ–2>þøã#;;»Ñ½ÇŽ[£¶}ûöF¯o늋‹cÑ¢E)µñãÇGŸ>}ZéD@[µxñâØ¹sgJmêÔ©iíy$Æ'áã�?N·k×.ºwï^ïšµk×ÆÊ•+Sj]tQÒGhAŸp”;Ò›ß÷íÛ—2îÖ­[“ú×ö!æ�š´G[6þü(//O©}ñ‹_l¥ÓmYõËÛÛµkS¦LiÑž-û­ão¼‘26lX´oß¾Þ5¯¼òJʸ_¿~1pàÀÄÏÐY­} uéÍïyyyñþûïW�«ßªÞ�={öÔ¨õêÕ«I{´eÕ?~ÍÍÍ�³Ï>»•N´UÅÅűhÑ¢”Úi§�}úôI[ÏÚ.Œ2dHŒ=:m=·zõêx饗Rj�ùŽuåÊ•)ãÂÂÂsÖ¬Y+W®Œ;vDFFFäççG¿~ý⤓NŠ.]ºÙÁ²uëÖX¿~},]º4öïß]»v�nݺÅç>÷¹=ztƒ�§@Û$èŽrGzóûqÇË—/¯¯X±"***"+«qÿ·Cõ[Ø#"ÆŒÓèþmÙÚµkcõêÕ)µ /¼ÐG—@ óçÏ�òòò”ZQQQZ{é…ñGbõêÕñÕ¯~5:TU;öØcãÊ+¯lpíªU«Rƃ®ú÷Ï>ûl<øàƒñÁÔº6+++N:餸ùæ›ã”SNiæé�Üܹsã™gž©óyNNNœ|òÉqýõ×Çé§ŸÞ‚'Ž” O8Š%qóûE]³gÏ®ïÙ³'ž|òɸæšk\{ðàÁxôÑGSjcÇŽ�Ï}îs�î¸>ø V¬X;vìˆ?ÿùÏ­~«yõÕˆôpÛ7¿@ÛTý»ÃîÝ»ÇäÉ“[´gS/ŒoŠ}ûöÅG}kÖ¬‰_ÿú×ñüóÏÇÁƒ«ž÷ë×/zè¡¿eÜ¿lÚ´)¥Ö½{÷سgOÜu×]±páÂz×WTTÄk¯½¯½öZœwÞyqß}÷EÇŽ›ÿbÍtø»×fÿþýñûßÿ>~ÿûßÇ 'œÿüÏÿýû÷o¡ÓGBÐ'Å’¸ùý _øBLž<9å£ÈÿøÇÑ¿ÿ˜8qb�ë8ßûÞ÷båÊ•Uµììì¸ûî»›Ôÿ?üpüìg?«óyKßj^QQóæÍK© 2$F��öÞuqó;´Mk×®�Õ«W§Ô.¼ð´^à]Û…ñ&Lˆ^½zñÞÏ=÷\|ãßhÔÜÌÌÌ¸à‚ âÛßþväçç78Ïž=5jYYYñµ¯}-Þxã�&�ó׿þulÚ´)þó?ÿ3ºtéÒ¤µ-iùòåQTTÿöoÿãÆ�kíã ô G±¤n~ÿÁ~ï¿ÿ~lذ!"þrƒøM7Ýç�w^L™2%Ž;î¸èÞ½{”——Ç–-[bÉ’%1{öìxï½÷ªöÈÎÎŽûï¿?FŒѬw©¨¨¨÷yKßj¾xñâØ¹sgJmêÔ©ië×n~€¶©ú7�éÿî°¶ ã[ú[ÇI“&Å�wÞƒnôš½{÷Ö¨=òÈ#±k×®ªñÈ‘#ãÚk¯�“O>9zõê%%%±~ýúxî¹çâé§ŸNùîôí·ßŽ»ï¾;xà�#{™FêÛ·oL˜0!úôé ˆ¼¼¼3fLDDìܹ3Þzë­øío/¾øbTVVV­Û³gOLŸ>=žxâ‰(,,l‘³Í#èŽRIÞüžŸŸ�?þx|ç;߉… FDDeee<ÿüóñüóÏ7¸~äÈ‘ñ�ÿø�1zôè&÷nŽ–¸Õ¼ú·íÚµ‹)S¦¤¥W:¸ùZFEEEÌ›7/¥6tèÐ5jTZûÖvaüYg�•ÖžÕ-Z´(Þ}÷Ýø›¿ù›¸æškõkmAŸ‡‡|~õ«_�[o½5233«jíÛ·�±cÇÆØ±cãòË/�iÓ¦ÅG}Tõü7¿ùM,X° .¸à‚#|£º�xâ‰qá…Æé§ŸeeeñÎ;ïT=ËÊÊŠŽ;F×®]càÀ�1uêÔx÷ÝwãßøFlذ¡j^IIIÜrË-ñÜsÏ5ë›_ eú€£TÒ7¿çççǃ>Ë–-‹'Ÿ|2žþù·¼W7`À€øÎw¾gžyf³ûöíÛ7Î<óÌ8ùä“ãØc��Þ½{G—.]bß¾}­v«yqqq,Z´(¥6a„èÕ«W¢}ËÍïÐv-^¼8vîÜ™R;’o:£¶ ã/ºè¢ÄÂ#Ó¦M«WVVÆÞ½{cÇŽ±jժرcGÕ³?ýéOqß}÷ÅܹscÆŒQPPPïÞ‡ªóÙW\·ß~{½ëGŽ?ÿùÏãÊ+¯ŒŠŠŠªúÏþó´}^~ùåMš?lذxúé§ãË_þrJ(èÿøÇxúé§ãšk®Iúˆ@B}ÀQ(]7¿ïÚµ+^~ùåX¾|yƒ!Ÿ~øaÜzë­1uêÔøÚ×¾}úôit¯Ão5ÏÈȨñ¼k×®­v«ùüùók¼QQQbû7–›ß í«~y{VVV\rÉ%-Ú3"Ùo‡ Æ «óù믿3f̈×^{­ª¶fÍš¸îºëâ©§žŠ=zÔ¹¶S§NµÖsssãý¯ÿÕ¨ówÜqqõÕWÇìÙ³Sú¯\¹2F�ݨ=ZBçÎ�ãÁŒóÎ;/ÊÊʪê3gÎô mXfkhyé¸ù}þüùqî¹çÆC=~øaU}ðàÁ1eÊ”¸þúëãK_úRLš4)ºwï^õ¼¬¬,žx≸ä’KbñâÅ�îwùå—Ç„ j ù¬Í'·š�1"¥þÉ­æIªþñk÷îÝcÒ¤I‰öhŒ¶ü7"Š‹‹cÑ¢E)µ &DÏž=ÓÖ³® ãGŽ™¶žÕ�|òÉñØc�Å×¾öµ”ú¦M›âž{î©wmçÎ�k­O™2%ºtéÒè3|éK_ªQ{ýõ×½¾¥ôë×/®¾úê”Ú¦M›â½÷Þk¥ ô G¡¤o~Ÿ={vÜqDZwïÞªÚé§ŸsçÎ� Äÿù?ÿ'îºë®øÞ÷¾?üp¼òÊ+ñãÿ8òóó«æïÞ½;n¾ùæxõÕW›}ކ|r«y‡Rê3gÎL¬ÇÚµkcõêÕ)µ‹/¾8Ú·oŸX�tj‰¿ðóçÏ�òòò”ZQQQZ{Öva|º{Ö&###n»í¶¸ð Sê¿ùÍoâÝwß­s]§N�j­Ÿzê©Mê?hРèÝ»wJmÅŠMÚ£¥üõ_ÿu�ÚÒ¥K[á$@cú€£LÒ7¿¿ñÆñ£ý(¥vÕUWÅ£�>Æ «uMVVV\zé¥1gΜ8æ˜cªêåååqç�wÆž={šu–ÆH÷­æÕCT#"¦N�šÈÞ-ÅÍïÐ2ªw˜——“&MjÑžGzaü‘ºãŽ;jÔ,XPçü¼¼¼ÈÉÉ©Q?öØc›Ü{èС)ãê¨mÅèÑ£#33õ Þ¶m[+�hˆ O8Ê$}óû½÷Þ‡ª><¾ûÝïFFFFƒkûöí?ýéOSj;vìˆÇ¼ÙçiŒtÝj^QQóæÍK© :4FŽyÄ{·47¿@z­]»6V¯^�R»è¢‹";;;m=k»0þŒ3Έ=z¤­gC j\.ÿÖ[oÕ9?333>ÿùÏ×¨çææ6¹wõ5鼬þH´k×.ºwïžRÛµkWëh� O8Ê$yóûš5kbÕªU)µiÓ¦EVVV£÷8þøãã´ÓNK©=ûì³Í:Oc¥ëVóÅ‹׸Éý‹_üâïÛÜüéUý›ÎˆôwXÛ…ñmá[ǤŒ?úè£zç2¤F­²²²É}«¯iÌE÷­åÓtV8Ú ú€£HÒ7¿/Y²$eœ‘‘§Ÿ~z“÷9ãŒ3RÆüãü@óH¤ëVóêÜfeeÅÅ_|Äû¶7¿@úTTTļyóRjÆ ‹áǧµoõoóóócâĉiíÙÕ/™o(Ärذa5jüq“ûV_“——×ä=ZBEEEìÙ³'¥–ŸŸßJ§"èŽ"Ißü¾yóæ”qnnntëÖ­Éûôïß¿FmÛ¶mÍ>Wc$}«yqqq,Z´(¥6qâÄèÑ£ÇíÛšÜüé±xñâØ¹sgJ­¨¨(­=k»0þâ‹/nö…ñIÚ±cGʸ¡ï/Ï<ó̵uëÖ5¹oõ5½{÷nò-aÅŠqèС”Z¯^½Zé4@C}ÀQ"7¿—••¥ŒsrršµO‡jÔ8Ь½#·šÏŸ??ÊËËSjéþà6�ÜüéSýòöììì¸øâ‹[´gDÛøÖ±´´4V®\™R«íùà :4>ÿùϧÔþð‡?4©ïúõëkŒžxâ‰MÚ£¥<ÿüó5jcÇŽm…“�!èŽé¸ù=777e¼{÷¬lò>»víªQëÞ½{s�Õ tÜj^ýã×üüü˜8qâíÙšÜüéQ\\‹-J©�yæ™i½�»¶ ãGŒÆ K[ÏÆzê©§j\æ™g6¸î‚ .HÏ›7/öîÝÛè¾�?þx�Úøñã½¾¥|øá‡ñä“O¦Ô bРA­t" !‚>à(‘ޛ߫?8p Þ}÷Ý&ï³bÅŠ”qFFFôìÙóˆÎVŸ¤o5_»vm¬^½:¥vñÅGvvv³÷lmn~€ô˜?~”——§Ô¦N�šÖžµ]ŸDϲ²²(..nöúU«VÅ<�RëÞ½{œvÚi ®½þúëS.­ÿóŸÿ?üáÕ÷­·ÞЧžz*¥vúé§ÇÀ�ë]÷Ì3ÏDaaaÊ¿žyæ™z×”——ÇG}Ô¨sU·wïÞ¸ùæ›k¡Þpà ÍÚh‚>à(�®›ßO8ᄵgŸ}¶I{ìÛ·/~ýë_§Ô†]ºt9’£Õ)·šWQ�ˆ(**jö~­ÍÍï�>Õ¿;ìÙ³gLœ8±E{&qa|DÄÎ�;còäÉñÓŸþ4¶lÙÒèu•••ñ«_ý*n¸á†())IyvÛm·E§N�Ü£[·n1mÚ´”Úœ9sâÇ?þqSìÛ·/&Ož÷Þ{o|ðÁ�^·råʸì²Ëbݺu)õÄ•W^™ô1€eµö€ôK×Íï£F�ŠüüüصkWUí‰'žˆ)S¦Äˆ#µÇO~ò“7ÄŸqÆuÎ///��?þ8zôèÑäó¦ãVóŠŠŠ˜7o^JmĈ1lذfïy¸gžy&îºë®”Ú½÷Þ[o�h[û@[ðöÛo׸œ¼>øÃbÿþýµ>ËÍÍ�o¼±ÉgX»vm¬^½:¥vñÅGVVúþqÏÚ.ŒŸ4iRäåå%²III<ôÐCñðÃǾð…7n\ >< ¹¹¹Ñ¹sç8pà@ìÝ»76nÜo½õVÌŸ??>üðÃ{�uÖYM ±¼þúëã…^ˆU«VUÕfΜ/¿ür\{íµqòÉ'GÏž=£¤¤$Ö¯_Ï=÷\<ûì³5‚@§OŸ'œpBóÿ Ø·o_<öØcñØc�ÅÈ‘#ãÔSO�.]ºDAAAtîÜ9JKK£´´4vìØ+V¬ˆ^x!^~ùåûtíÚ5f̘íÛ·OÛY€#'èŽéºù=333¾ò•¯Ä?ÿó?WÕöïß7Þxc<ðÀ1f̘:×}zS�Ûl«W¯®öÚyyyñÀDaaaN$IÐ'¤ÑÑpóûµ×^sæÌ‰ 6TÕvìØ×\sMœsÎ9qÁÄÈ‘##///8[·n�×_=žxâ‰�’·ÞzkôèÑ£ÞžÕo5Ÿ0aB ><ݺu‹Î�;GYYY‹Üj^ýƒÛììì¸è¢‹š½_RÜümKEEEÌ›7/¥6räÈ:thZûVÿÖ±W¯^1a„DöÎÈÈ8â=ºuëwÞyg\~ùåÍZß§OŸxâ‰'â›ßüf¼òÊ+�^×¾}û¸õÖ[ãïþîïšÕ·%Mœ81~ðƒDïÞ½[û(@#ú€4:n~ïСC<òÈ#qÕUWÅöí۫ꇊßüæ7ñ›ßü¦Ñ{}ùË_Žë¯¿¾Iý[óVóâââX´hQJí¬³ÎŠ¼¼¼fï™n~€Ö÷ûßÿ>vîÜ™RKò›ÎÚ¬[·.­Æįýëx饗âµ×^‹+VÄ®]»\×¾}ûøÂ¾S¦L‰óÏ??:wî|DçÈÏÏ�™3gÆ /¼3gÎŒ·Þz+*++k�›——ý×_ýêW£_¿~GÔ·1ºté?ûÙÏbÉ’%ñÆoÄÿûÿ/ÊËË\׫W¯8ãŒ3âÚk¯�áǧýœ@r}ÀgXKÝü^PPsæÌ‰»ï¾;^zé¥&¯ïرcÜu×]qå•W&z®º$u«ùüùók|h9uêÔ#Ú³­pó;Ÿ5EEEi֬ϤI“bíÚµ-ÚsèСiï9pàÀ8p`Õeï[¶l‰>ø ¶lÙ{÷î�ÒÒÒÈÎÎŽ.]ºDnnn 4(Ž=öØÄÂFwî¹çƹçž;vìˆ+VĦM›¢´´4:uêùùù1xðà1bDddd4kÿæüg(333Î9çœ8çœs""¢¼¼<Þ}÷ÝX²dIGiiiäååEçÎ�#777òòòbذaÑ¿ÿf�h}‚>à3¬%o~ïÙ³güüç?�W_}5žxâ‰øý便¥õ®éß¿L�:5®ºêªèÙ³g£ú´¥[ÍçÌ™S£Ç„ ÙûH´¥¿pt9æ˜câ˜cŽiÕ3ôêÕ+Î>ûìV=C]²³³cÈ�!qàÀ�ªÚˆ#¢cÇŽ­x* I‚> �ŽÆ›ßÇ�ãÆ�‹ƒƺuëbýúõ±gÏžøóŸÿYYY‘››={öŒQ£FE¯^½š¼m·š¿ÿþû±e˖ضm[ìÝ»7öïß999i¿Õü™gžI|ÏêÜüðé!èH‹víÚÅðáÃcøðáií“��Ç{l{ì±iíóiææw€–‘ÙÚ€ÏAŸ�AŸ�AŸ�AŸ�AŸ�€¬Ö>@[•ùÍy­}>£–^}LkHƒÌÖ>|ú€dµö€Úe~s^k�Ï ¥WÓÚGøÌÊlíÀg� OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH€ OH@Vkh»þøÇ?ÆÊ•+cëÖ­Q^^¹¹¹1hР3fLäää$Ögÿþýñæ›oÆÆ�ãã�?ŽìììèÛ·oüñ1`À€ÄúD´Ü;pôô GhÛ¶m±råÊX±bE¬\¹2Þ~ûí())©z^PP/¾øb³ö.,,<¢³-\¸0ú÷ïßäuÿó?ÿ>ø`¬^½ºÖç�:uŠ¢¢¢˜>}zäçç7û|»v튟ýìg1gΜ(--­uÎÈ‘#ãæ›o޳Ï>»Ù}"Zî�8z ú€fxã�7bÖ¬Y±bŊؾ}{k'1ˆ»ï¾;æÍ›Wï¼ÒÒÒxüñÇcÁ‚ñÀÄØ±c›ÜkÉ’%që­·Fqqq½óV¯^Ó§O�K/½4¾ÿýïGûöí›Ô§%ß €£[fk>�V­Z¿ýío?S!Ÿ‡ŠÛn»­F f»ví¢ÿþ1|øðèÚµkʳ]»vÅ´iÓbùòåMêµlÙ²¸ñÆk„|æææÆˆ#¢   Úµk—òìÙgŸ�;î¸#*++Ûä;@Vk>k:uꥥ¥‰ï[XXßúÖ·š´¦W¯^�žûè£�ÆÂ… SjW]uUÜ|óÍѧOŸˆøKpæÂ… ãG?úQlÙ²%""öíÛ·Ýv[ÌŸ?¿FhfmöìÙ·ß~{”••UÕ âî»ïŽÉ“'GFFFDDlݺ5|ðÁxòÉ'«æ½ð ñØc�Å 7ÜÐ¦Þ "}ÀéܹsŒ92F�£G�ŽQ£FŦM›âºë®K¼W·nÝbüøñ‰ïQ\\?üpJíŽ;îˆo¼1¥–™™çœsNŒ=:®¾úêØ¼ysDü%”sÖ¬Yñ÷ÿ÷ öú�ÿø�ؾ}{Õ¸ÿþñË_þ²*xó}ûö�ú§ŠcŽ9&~ò“ŸTÕg̘EEEÑ­[·6óN‘ÙÚ€O£³Î:+ž{î¹X¶lYÌž=;þáþ!Î;ï¼(((hí£5Ë£�>%%%Uã±cÇÆ´iÓêœß§OŸøá˜R{ì±Ç¢¸¸¸Þ>»víŠÙ³g§Ô~ðƒÔù<ÜM7ÝcÇŽ­ïÝ»7fΜYoŸˆ–{'ø„ Oh†¿ú«¿Š!C†Dfæ§ÿ“ÜC‡Å3Ï<“R»å–["##£ÞuãÆ�‹“N:©j\RRÏ?ÿ|½kž{î¹(--­�;6Æ�WŒŒ˜>}zJí¿þë¿¢²²²Î5-ùNð‰OÿW…ÀyóÍ7c×®]UãÄ)§œÒ¨µ—]vYÊxáÂ…õίþ¼úúºœzê©Ñ¿ÿªñŽ;â­·Þªs~K¾|"«µµùãÿ+W®Œ­[·FyyyäææÆ Aƒb̘1‘“““XŸýû÷Ç›o¾7nŒ�?þ8²³³£oß¾qüñÇÇ€ëÑrïÐT/½ôRÊxüøñ‘‘‘ѨµãÇ�O/Y²$JKK£S§N5æ–””IJeËRj§�vZ£údddÄøñãã©§žªªýîw¿‹N8¡Öù-õNp8AŸŸbÛ¶m‹•+WÆŠ+båÊ•ñöÛoGIIIÕó‚‚‚xñÅ›µwaaá�máÂ…)7¦7ÖÿüÏÿă>«W¯®õy§N�¢¨¨(¦OŸùùùÍ>ß®]»âg?ûYÌ™3'JKKk�3räȸùæ›ãì³ÏnvŸˆ–{'€æZ³fMÊx̘1�^Û§OŸ(((ˆÍ›7GDDyyy¬_¿>F�]cîúõ룼¼¼jÜ¿ÿèÕ«W£{�3&%è³ú¹×Rï‡ôù)óÆoĬY³bÅŠ±}ûöÖ>Nb8wß}wÌ›7¯Þy¥¥¥ñøã�Ç‚ â�ˆ±cÇ6¹×’%KâÖ[o�âââzç­^½:¦OŸ—^zi|ÿûß�öíÛ7©OK¾ptÙ¾}{lß¾=öíÛ¹¹¹‘——½{÷nö~7nL<¸Ië‡ RŠùÉ~µ…bnذ¡Æº¦¨~®êû®¥Þ 'èóSfÕªUñÛßþ¶µ�‘¨C‡Åm·Ý .L©·k×.úõë]»v�M›6ÅÞ½{«žíÚµ+¦M›³fÍŠN8¡Ñ½–-[7Þxc”••¥Ôsss£ÿþ±gϞغuk¥¥¥ñÀDFFF›{'àè±nݺ˜úè£51¯ºêª¸ù曣OŸ>ñ—àÌ… Æ�~ô£ª�.÷íÛ·Ýv[ÌŸ??ºvíÚ`Ÿ={öÄí·ßžòYPPwß}wLž<¹*ÄsëÖ­ñàƒÆ“O>Y5ï…^ˆÇ{,n¸á†6õNÀÑe÷îݱ{÷îZŸíر#,X ,ˆ#FÄ}÷Ý……… îY\\•••UãìììèÑ£G“ÎõÉ÷‘Ÿøè£�j�W½ÞÔ Ïž={FVVVTTTDÄ_¾Çܽ{w�þ-ùNp8AŸŸR�;wŽ‘#GƨQ£bôèÑ1jԨشiS\wÝu‰÷êÖ­[Œ?>ñ}#þòåÃ?œR»ãŽ;âÆoL©effÆ9眣G�Ž«¯¾:6oÞ åœ5kVüýßÿ}ƒ½þã?þ#¶oß^5îß¿üò—¿¬ñfß¾}ãŸþéŸâ˜cމŸüä'Uõ3fDQQQtë֭ͼ@mÞyç�¸âŠ+â¾ûî‹óÏ?¿Þ¹Õ/šïСCÕê�Õ©S§z÷¬«Þ±cÇ&õÉÈȈœœœª Ïˆˆ’’’û¤ó�𫬬,å=Úš²²²zÇ$Ço-€ôñ[ }üÖÚ²Öþ6KÐç§ÌYg�§Ÿ~z 4(233SžmÚ´©•NÕ|�>úhÊÇ•cÇŽ�iÓ¦Õ9¿OŸ>ñÃþ0®¿þúªÚc�=×^{mäååÕ¹n×®]1{öì”Ú~ðƒ!Ÿ‡»é¦›âå—_Ž¥K—FDÄÞ½{cæÌ™qûí··‰wŽyyy1iÒ¤7n\Fß¾}£sçÎQZZ[¶l‰7Þx#žzê©x÷Ýw«Ö”••Å�wÞ={öŒ±cÇÖ¹wõ Ìœœœ&Ÿ¯úšÆ}6§W‡RÎ\[¯–|§æZ·n]¢û¤ÛÆ�[ûŸY~k¤�ßZéã·@Ý2žB[òWõW1dÈ�!ŸŸF‡Šgžy&¥vË-·4x[ú¸qã⤓Nª—””ÄóÏ?_ïšçž{.åãʱcÇÆ¸qãê]“‘‘Ó§OO©ý×ýWTVVÖ¹¦%ß 8:Üÿý±xñâ¸÷Þ{ã’K.‰ÂÂÂèÖ­[deeEnnn 6,®¹æš˜;wnÜsÏ=Ѿ}ûªµåååqÇwÄþýûëÜÿÀ�)ãììì&Ÿñðž ­Mõs¤«WK¾îÓŸɧ֛o¾»víª0 N9å”F­½ì²ËRÆ .¬w~õçÕ××åÔSO�þýûW�wìØo½õV�ó[ò�€£Ã%—\R#t².W]uUüË¿üKÊ¥òÛ¶m‹_üâu®©¾wyyy“ÏX=X3''§ÖyÕëéêÕ’ï‡Ëjípôz饗RÆãÇ��ŒŒŒF­?~|ÊxÉ’%QZZ�:uª1·¤¤$–-[–R;í´ÓÕ'###Æ�O=õTUíw¿û]œp µÎo©w¨Ë¹çžS¦L‰9sæTÕæÎ�_ùÊWj�ß¹sç”ñþýû›Ü³úšº¾¬^oN¯²²²{µä;5×СC#+ËçÜ@ÛUVV7n¬4(:tèЊ'€Ö´¥µÀgœßZÝüÖ"½üÖ¿·H¿µ€¶¬¢¢"Ö­[×jý}F«Y³fMÊx̘1�^Û§OŸ(((ˆÍ›7GÄ_nY_¿~}Œ=ºÆÜõë×§ÜÂÞ¿ÿèÕ«W£{�3&%è³ú¹×RïPŸn¸!%èsíÚµ±sçÎèÙ³g�¹Õ,ËÊÊ¢²²²Ñ—�GD”––Ö»g]õ}ûö5ºGDDeee�ÎꡞµõIç;5W‡";;;Ñ=Ò©C‡ѱcÇÖ>Àg’ßZéã·@úø­´e‡ç¶†ÌVíΧÊöíÛãí·ßŽ¥K—ÆÚµkcûöíG´ßá7ûFD <¸Ië‡ Rï~ŸØ°aC½ëRý\Õ÷«ï éz'€úF�=ªÆ•••ñþûï×:7///%³¼¼<>úè£&õÛ¶m[ÊøðÞõÕ·nÝÚ¤>;wîŒŠŠŠªqfffäåå՘גï‡ËjíÐö­[·.&Ož›6mªñ¬W¯^1vìØ˜:ujœqÆ�Þ³¬¬,¶lÙ’Rëׯ_“ÎÕ·oß”ñ{ï½Wë¼êõêëRý\[¶l‰ýû÷GNNNJ½%ß  !}ûöM ·ÜµkW­ó:tèÇsLlÞ¼¹ª¶eË–èÙ³g£{ýéOJ4¨Öy¬w]SûsÌ15¾éŒhÙw€Ã ú¤A»wïŽÝ»w×úlÇŽ±`Á‚X°`AŒ1"î»ï¾(,,lpÏââ⨬¬¬ggg7ù–ó>}ú¤Œëºe½z½©AŸ={öŒ¬¬¬ªÛß:»wï®Ñ¿%ßéH”••¥ÜdЖ”••Õ; 9~k¤—ß[éã·ÐVù.‹¶(++õSáúþs:pàÀ”PÌ 6ÄèÑ£ÝkÆ )ãºB1«×ׯ_ßèMéÑrï‡ôIbÞyç�¸âŠ+â¾ûî‹óÏ?¿Þ¹¥¥¥)ã:DFFF“úuêÔ©Þ=ëªwìØ±I}222"'''åãÖ’’’û¤ó�ŽÄºuëß ]6nÜØÚGøÌò[ ½üÞH¿µ ñvîÜ™2ÎËË«sîðáÃãå—_®/_¾<¦N�Ú¨>Û·oO ÔÌÎÎŽÁƒ×:wÈ�!‘��ååå±y󿨾}{ôîÝ»Q½Þ|óÍç®KK½.³µ@Û•——EEEqÿý÷Çÿ÷Ç믿«W¯Ž¥K—ÆÜ¹sãÿïÿÆ KYSVVwÞyg,]º´Þ½«eæää4ù|Õ×46è³9½:tèÐ`¯–|'€úlݺ5%¨2"¢_¿~uÎ?óÌ3SÆøÃ¢²²²Q½^yå•”ñ)§œ�;w®un—.]⤓NªÑ«1*++kÌ�4iR�ó[ê�àp‚>©Õý÷ß‹/Ž{ï½7.¹ä’(,,ŒnݺEVVVäææÆ°aÃâšk®‰¹sçÆ=÷ÜíÛ·¯Z[^^wÜqGìß¿¿Îý8�2ÎÎÎnòïñ—�ÑÚT?Gºzµä;ÔçW¿úUʸ_¿~ñùϾÎùcÆŒ‰¼¼¼ªñ‡~K–,iV¯³Î:«ÞùÕŸW__—×^{-6mÚT5îÙ³güñuÎoÉw€Odµöh›.¹ä’FϽꪫ"???n½õÖ8tèPDDlÛ¶-~ñ‹_ÄW¾ò•Z×T´,//oò«kæääÔ:¯z=]½Zò�ŽÄСC#+Ëõ�¶©¬¬,6nÜX54hPtèСO­mKk€Ï0¿µÀo-ÒËï-Žn~k‘^~kmUEEE¬[·®µ�±aƘ9sfJíì³Ï®wMfffL�:5eÝŒ3â”SN‰ŒŒŒ:×½ú꫱lÙ²ªqçÎ�ãüóϯ·×…^?ùÉO¢´´4""–.]¯¾újŒ7®Î5•••1cÆŒ”ZQQQdff¶‰w€OHû#çž{nL™2%æÌ™SU›;wn�AŸ�;wNïß¿¿É=«¯éÔ©S­óª×›Ó«¬¬¬Á^-ùNG¢C‡‘���ø¾éСC‡èرckà3Éo-€ôò{ }üÖÚªæ\ Y³fM,Y²$®¼òÊFÿïßš5kâæ›oŽ’’’ªZ‡bÚ´i ®�6mZüßÿû«8_ýõxä‘GâÆo¬uþ¶mÛâÛßþvJíºë®‹üüüzûôèÑ#®¹æšxä‘GªjßùÎwâ—¿üeôéÓ§Ö5ÿþïÿK—.­wíÚ5þöoÿ¶Í¼ðÿ±wßaV•W߀׆CTP”ö‚ÆX{&blHðE?õµÄ¨±§aâ«bÁÄŽ]!‰±+Ä,EAahSö÷‡G33p`¸ïë:ó}âꫯŽÃ;,=9wîܸûî»ãé§ŸÎ8?`À€hܸñfõL!è“,êÔ©S4kÖ,¾ýöÛˆø~htúôée}6iÒ$R©T$I………ñí·ß–ymyæÍ›—±nÖ¬Y™×­¹?wîÜ ×ˆˆX°`A¥×999ѤI“R×mÊg6—_~yÌž={�×-X° úöí[æw'�tRÜtÓMåž]´hQ :4†Í›7�&MšDýúõcùòå1oÞ¼X¼xq™gÏ9çœ8묳*ð$ßëß¿Œ7.FŽ™Þ{òÉ'cèСѺuëhذaÌš5+òóó3ÎÕ©S' yyyªÓ¸qã¸í¶Û¢_¿~é ÔÙ³gÇùçŸyyy±ÝvÛE~~~|ýõ×Q\\œq¶G�ѯ_¿Íî™ ""§ª`˲í¶Ûf¬.\XæuuêÔ‰Ö­[gìýøíçñõ×_g¬wÚi§2¯ÛqÇ×z®²uZ·nµk×.uݦ|&`ëµ`Á‚øì³Ïbüøñ1uêÔ2C>4h7ß|s\qÅ•ºwNNNÜ~ûíqÌ1ÇdìÇW_}S¦L)ˆÙ¸qã¸÷Þ{c¯½öªT­}öÙ'î¹çžhܸqÆ~~~~L™2%fÍšU*äóØc��AƒE*•Ú,Ÿ }’U¹¹¹뢢¢r¯]3€sÚ´i•ªµæõå…b®¹ÿùçŸo”:›î™€-_ÇŽã7¿ùMtÐA¥Â0˳ÓN;Åå—_#FŒˆã�?~½êÖ®];n½õÖ¸ãŽ;b×]w-÷ºzõêÅi§�/¾øbì·ß~ëU«{÷îñ /DŸ>}¢nݺå^×¹sç¸óÎ;ã–[n‰ZµjUºÎ¦|&¶n¹ë¾*nÁ‚ë&Mš”{í®»îï¼óNz=nܸ8餓*Tç›o¾‰Ù³g§×5kÖŒöíÛ—ym‡¢fÍšQXX³gÏŽo¾ù&Z´hQ¡Z~øa©¾Ë³©ž Ø<Œ1b£Ý»I“&Ñ¿ÿèß¿D|?9cÆŒ˜3gNäççGAAAÔ®];òòò¢E‹Ñ­[·µÎnVÖGGqD̘1#&L˜óæÍ‹ÂÂÂÈËË‹öíÛÇž{îµk×Þà:Í›7�n¸!®¼òÊ7n\L›6-òóó£f͚ѲeËØm·Ý¢mÛ¶Yx¢M÷Ll½}’5sçÎͪŒˆhÕªU¹×rÈ!qß}÷¥×£G�Ž$I"•J­³Ö¨Q£2Öûí·_Ô¯_¿Ìk4h{ï½wŒ3&£Ö‰'ž¸Î:I’ÄèÑ£3ö=ôÐr¯ßTÏl}Ú´imÚ´ÙäuÛ¶m›µ Íµ©S§NtïÞ=ºwï¾Ñkmªg`ë“SÕ °åøÇ?þ‘±nÕªU´k×®Üë÷ÜsÏŒ·ÆõÕWñßÿþw½jvØak½~Íï×<_žwß}7fÍš•^7oÞqõÕWÇa‡©T*""æÎ�wß}w<ýôÓç �7Þ¬ž Ø|ú¬†.¿üò˜={ö:¯[°`AôíÛ·ÌïN:餸馛Ê=»hÑ¢:th :4""š7oMš4‰úõëÇòåËcÞ¼y±xñâ2ÏžsÎ9qÖYgUàI¾×¿ÿ7n\Œ92½÷ä“OÆÐ¡C£uëÖѰaØ5kVäççgœ«S§N 4(òòò*T§qãÆqÛm·E¿~ýÒA©³gÏŽóÏ??òòòb»í¶‹üüüøú믣¸¸8ãl�=¢_¿~›Ý3›�œªn€êaÁ‚ñÙgŸÅøñãcêÔ©e†|6hÐ n¾ùæ¸âŠ+*uœ¸ýöÛã˜cŽÉØ/..ޝ¾ú*¦L™R*³qãÆqï½÷Æ^{íU©Zûì³OÜsÏ=ѸqãŒýüüü˜2eJÌš5«TÈç±Çƒ ŠT*µY>°yôI†Ž;Æo~ó›8è ƒJ…a–g§�vŠË/¿}úDݺu˽®sçÎqç�wÆ-·ÜµjÕªt�MùL@Õ˭꨼#Fl´{7iÒ$ú÷ïýû÷�ˆˆÙ³gÇŒ3bΜ9‘ŸŸQ»víÈËË‹-ZD·nÝ¢I“&Y«ÄGÄG3f̈ &ļyó¢°°0òòò¢}ûö±çž{FíÚµ7¸NóæÍã†nˆ+¯¼2Æ�Ó¦M‹üüü¨Y³f´lÙ2vÛm·hÛ¶mžhÓ=Pµ}²VmÚ´‰6mÚlòºmÛ¶ÍZÐæÚÔ©S'ºwïÝ»wßèµ6Õ3U#§ª€-� OÈAŸ�‚> }@ú€,ô Y è²@Ð'd� OȂܪn ÛV®\Ë—/�+VDqqqÔ©S'êÖ­õêÕ‹œ¹¦›Š¹N`kSmƒ>¿üò˘4iRLš4)¦OŸ³gÏŽÙ³gGAAA™×çääÄ6Ûl­[·Ží¶Û.vÙe—èÒ¥Küä'?‰úõëoâî¶æ:¾Wm‚>.\o½õV¼õÖ[1jÔ¨ÈÏÏÏø>I’µž/..޹sçÆ¼yóbܸqñüóÏGDD*•Š]wÝ5>øàøÙÏ~»í¶[¤R©�öÕ�¹N€²mÖAŸË—/�W_}5†cÇŽ�’’’ˆ(ø³"ƒœkžM’$&OžS¦L‰¿ýíoѬY³8î¸ãâøã��]wÝuÃ` `®`Ý6Ë ÏiÓ¦ÅÃ?Ï?ÿ|DDæ 熼™½¬³I’¤ï¿`Á‚2dH 2$:vìgžyfwÜqQ«V­õ® P]™ë¨¸Í*ès̘1qÿý÷ÇèÑ£#¢âC å½ ~m~|¿5ï½ú~Ÿ~úi\sÍ5që­·FŸ>}âÌ3ÏŒ¼¼¼JרnÌuTÞfô9nܸ¸í¶Ûâ½÷Þ‹ˆ2Ë{Kûj©T*Z·n­[·Ž–-[ƶÛnyyyQ»ví¨S§NÔ¨Q#V®\±bÅŠ˜?~Ì›7/æÍ›Ó§O�+VdÜ{u½Õ®~#ü·ß~ƒއ~8úöíg�uVÔ¯_£ü]T%s�ë¯Jƒ>§OŸ7ÝtS¼ùæ›Qö è�@[´hûî»oì½÷ÞÑ©S§èرãzf&I_}õU|úé§1iÒ¤øïÿ“&MŠ¢¢¢tkö±dÉ’¸óÎ;ãÑG� .¸ úôé999ëU`sb®`ÃUIÐçòåËãî»ïއ~8ŠŠŠÊM¥R±çž{Æá‡‡rH´k×.k=¤R©Øa‡b‡vˆ^½zEDÄŠ+bìØ±ñÚk¯Åˆ#báÂ…ékü6øï¾û.þøÇ?ưaÃâšk®‰½÷Þ;k}lJæ:²§J‚>�8âˆX°`A©AÐÕë:Ä)§œG}tl³Í6›¬¯ºuëÆÁ|p”””Ä{ï½ÿøÇ?âÕW_�•+W– ýä“OâŒ3Έßÿþ÷qÊ)§l²>²Å\'@öTIÐçüùóK WæææÆÑG§žzjì¹çžUÑV†œœœØo¿ýb¿ýö‹k¯½6†�=öX̘1#"¾b]=À:oÞ¼ªl`½™ëÈž* ú\-I’¨[·nôîÝ;Î9çœhÕªUU¶S®¼¼¼8ãŒ3âôÓO�—_~9î¿ÿþ˜ }@ú€,È­êªÊܹsãÃ?Œ ĪU«¢E‹Ñ®]»èÖ­[U·°U1× l)¶º ÏÑ£GÇ Aƒâ£�>*óûV­ZÅgœgŸ}v¤R©MÜÀÖÃ\'°¥©6AŸ#FŒˆ»ï¾;cï°Ã‹óÏ?¿Â÷¸óÎ;Ó÷H’¤ÌkæÌ™ýë_㥗^Š»ï¾;š7o¾þMl�Ìu”-§ª¨¨gžy&&Mš“'ONÿyÐAUøüã�?ƒŽ$I"I’H¥Rå~’$‰‰'F¿~ýbÉ’%ñ©ªs�e«AŸ+V¬ˆ·ß~;=¬±Ûn»E×®]+tþ«¯¾Š›nº)cèsmV?uêÔ¸á†6¨w€-‰¹N€òU‹ ÏI“&ŪU«ÒëT*={ö¬ðù»îº+ #"Ò¥«ÎÍÍ�æÍ›GÍš53¾[=|úâ‹/ÆØ±c³ðÕŸ¹N€òU‹ ÏñãÇ—Ú;ì°Ã*tváÂ…ñ /¤ßæ¾úÏF�Å_ÿú×øàƒâí·ßŽqãÆÅí·ßÍ›7/u�{ï½wý›Ø‚˜ë(_µúœ6mZƺaƱÓN;Uèì¿ÿýï(**J¯“$‰5jă>Ç|ÔªU+""jÔ¨GqD<þøã‘——?¼ý}̘11þü,= @õe® |Õ"èsöìÙéŸS©TtìØ±Âg_yå•ôÏI’D*•ŠO<1:wî\æõ;ì°CœwÞy‘$Iz¯¤¤$þóŸÿT¾q€-Œ¹N€òU‹ Ï9sæ¤ßÂѶmÛ �[±bEL˜0!R©TÆþi§�¶Ös?ÿùÏ#777coòäÉ•è`Ëd® |Õ"èséҥ뼼¼ �{ÿý÷£¨¨(c¯M›6å¾õ}µ† F—.]ÒoŠ�ˆøä“O*Ñ1À–É\'@ùªEÐgAAAƺ~ýú:÷Á¤^=ÜyÈ!‡Tèlûöí3Î~óÍ7:°%3× P¾jô¹æÛÛ‹‹‹+tîÃ?,µ·Ï>ûTèl³fÍ2ÖË–-«Ð9€-™¹N€òU‹ Ï5ßô¾téÒužYµjUL˜0!R©TÆ~EBkÕª•±6 `®`mªEÐgƒ 2Ö³fÍZç™>ø V®\™±×¶mÛhÚ´i…j®9Z³fÍ �Ø’™ë(_µúlÑ¢E$I©T*’$‰�?þx�gÞxã�ôÏ«Ïî»ï¾®™ŸŸŸ±®W¯^ÅØB™ë(_µúìܹsÆzÞ¼y1yòär¯/,,Œ—^z)R©TÆþþûï_ášóçÏÏX7jÔ¨Âg¶Tæ:ÊW-‚>»víZjoðàÁå^ÿÌ3ÏÄ·ß~›±—““S©�ÐÉ“'§ß4ŸJ¥bûí·¯xÃ[(s�å«AŸ=zôˆZµjED¤‡4GŽ·ÜrK$I’qíĉãÿþïÿÒo}_=йÿþûGÓ¦M+Toîܹ¥J „˜ëX›Üªn "òòò¢gÏžñâ‹/F*•J…ÞÿýñÒK/ÅAyyy1mÚ´øÏþEEEé�ÐÕz÷î]ázï¾ûn©½N�:mðsTwæ:ÊW-‚>#".½ôÒ1bD¬\¹2"~xü¬Y³â©§žJ_·úMï?þ¹cÇŽqÔQGU¸ÖË/¿\jo�=öØÀ'Ø2˜ë([NU7PQÛm·]\~ùå‘$IzïÇo�_ýYó�ï¹¹¹qã�7V¸N~~~¼óÎ;÷ÉËË‹:løClÌu”­Ú}FDüêW¿ŠË.»¬ÔþêÁÐq&I¹¹¹ñ‡?ü!vß}÷ ×xöÙg£¨¨(}�T*ûí·ß÷°%1× PZµ úŒˆèß¿<öØc±ë®»f¼ñ}ÍO·nÝâ‘G‰O<±Â÷.**Š!C†”z{ü¡‡šå§¨þÌudÊ­êÖÇ^{íÏ>ûlLŸ>=F�sçÎ�Å‹G½zõ¢uëÖ±ï¾ûÆ.»ìRéû¾ýöÛ‘““­ZµJï¥R©8øàƒ³Ù>ÀÃ\'ÀªeÐçjíÚµ‹víÚeí~‡z¨·¼¬s�9UÝl }@ú€,ô Y è²@Ð'd� OȂܪn`C}ôÑGñþûïÇÇŸþy,Z´(–.]Ë–-‹’’’¬ÔH¥R1eÊ”¬Ü `Ke®ØÚUË ÏÂÂÂxôÑGcذa1}úôô~’$U×ÀVÈ\'Àª]Ðç{ï½×^{m̘1£ÌÐT*•Õz†LÊf® Sµ ú|ýõ×ãÒK/�ÂÂÂH’$ëßTŒ¹N€ÒªMÐçG}_|qE*•*5 ê 훆¹N€²U‹ Ï’’’¸þúëÓà?–$IÔ©S'ºwï»îºk´mÛ66lõêÕ‹œœœ*ê`Ëd® |Õ"èó�wÞ‰)S¦d ƒ&I 6ŒóÏ??N=õÔ¨[·nv°u0× P¾jôùÚk¯e¬“$‰æÍ›Ç�!C¢C‡UÔÀÖÇ\'@ùrªº�Š˜0aBú­ïI’D*•Šo¼Ñ0(À&f® |Õ"èsÁ‚ëí·ß>zôèQEÝl½Ìu”¯Z}æççGÄo}ßwß}«¸#€­“¹N€òU‹ Ïúõëg¬·Ùf›*ê`ëf® |Õ"è³E‹ëU«VUQ'[7s�å«AŸ�;wŽ$I"•JEDÄ‚ ª¸#€­“¹N€òU‹ Ïƒ>8ýs’$ñÞ{ïUa7[/s�å«AŸ‡vX4nÜ8½þúë¯câĉU×ÀVÊ\'@ùªEÐg�:u¢ÿþ‘$I¤R©ˆˆ¸ù曫¸+€­�¹N€òU‹ Ïˆˆ³Ï>;vß}÷H’$’$‰÷ß? TÕmluÌu”­Ú}Ö¨Q#n¿ýöØ~ûí#•JE’$qÏ=÷Ä_þò—(,,¬êö¶æ:ÊVm‚>#"Z¶l�<òHtìØ1½7dÈ�8餓â¹çž‹U«VUaw[s�¥åVu•ÕªU«:thüùÏŽ¡C‡F’$ñùçŸÇUW]øÃb·Ýv‹.]ºDÓ¦M£aÆQ£F�¬Ô=ñijr€-…¹N€LÕ.è3"¢víÚqà 7DãÆ�ãž{î‰T*I’IJeËb̘11f̘¬×4 Pš¹N€TË Ï×_=þú׿ÆW_}©T*""ýg’$Y¯·úÞd2× ðƒjôYTT×]w]üóŸÿ,sð3•Je}xsc ˜Twæ:J«6AŸI’Ä¥—^¯½öZ$IâmìUÄ\'@ÙªMÐçC=¯¾új™owÿñÛÙsss£~ýúQ¯^=C£�¹N€²U‹ ÏÅ‹Ç]wÝUæ hݺuãÈ#�Œ=zD§N�b»í¶3 °‘˜ë(_µú>|x,_¾<=è¹úMï‡rHÜxã�Ѳe˪l`«a® |Õ"èsôèÑ韓$‰T*tPÜ}÷Ý‘““S…�l]Ìu”¯ZLS~òÉ'é·¾GDÔ¨Q#n¼ñFà›˜¹N€òU‹‰Êï¾û."~xëû{ì­Zµªâ®¶>æ:ÊW-‚>KJJ2Ö�:uª¢N¶næ:ÊW-‚>óòò2Ö�5ª¢N¶næ:ÊW-‚>wØa‡H’$½^¼xqv°õ2× P¾jôÙ­[·ˆˆH¥R1kÖ¬ªl`«e® |Õ"è³gϞ韓$‰ÿþ÷¿±jÕª*ì`ëd® |Õ"èsŸ}ö‰N�:¥×ñÜsÏU]C[)s�å«AŸW]uUDD¤R©H’$  .¬â®¶>æ:ÊVm‚>÷ßÿ8÷Üs#I’H¥R±páÂèׯ_,]º´ª[ت˜ë([µ úŒˆ¸ä’Kâ´ÓNK…~üñÇq 'Ä{ï½WÕ­lUÌu”V­‚>#"®»îº¸öÚk£V­Z‘J¥böìÙqæ™gÆgœÏ?ÿ|Ì›7¯ª[Ø*˜ëÈ”[Õ TÔ™gž™±nÖ¬YÌ™3'R©T$Iï¿ÿ~¼ÿþûéïš6myyy‘“³áY¦©T*~øá ¾À–À\'@ÙªMÐçØ±c#•J•ùÝê¡ÐÕ,X ,(÷úÊH’$+÷ØR˜ë([µ ú\íǃŸ?^¯9´™$I©k+Ë (@ùÌudªvAŸÒ4Ì °q™ëÈT­‚>7ôMîd‡¹N€ÒªMÐç\PÕ-æ:Ê#è€J1× P¶œªn¶‚> }@ú€,ô Y è²@Ð'd� OÈ‚* ú|ë­·ª¢ìF±xñâøè£�ªº €õb® {ª$èóÜsÏ�¾}ûÆ”)Sª¢|V¬\¹2î½÷ÞèÙ³g¼ùæ›UÝÀz1× �=¹UUøÝwß�Þ½{G¯^½âþç¢sçÎUÕJ¥¬X±"ž~úéxðÁcþüùUÝÀ3× �UôQRR¯¾új¼úê«qÀDÿþýcÿý÷¯Ê–Êõí·ßÆã�?�?þxäççG’$‘J¥ª¸3€ g®`ÃUiÐg*•JVŽ=:F�mÛ¶�_üâqâ‰'FÓ¦M«²½ˆˆ5jT<ýôÓ1bĈ(..6 l‘Ìul¸* úüÛßþþóŸã«¯¾JV®´œ>}zÜ|óÍqÛm·Å‡~xôèÑ#7n¼Éú{ÿý÷ã•W^‰×_=æÎ�›Ñß�ûÍÉɉ޽{Çé§Ÿ¾ÉzÈ&s�ÙS%AŸ‡zhxà�qï½÷Æý÷ßoRO’$ ã­·ÞŠ·Þz+®¿þúèÚµkì»ï¾±ß~ûÅ{ìuëÖÍZ?Ó¦M‹ÿþ÷¿1vìØ;vl|÷Ýwé>V[spu÷Ýw�k¯½6~ò“Ÿd­€MÍ\'@öTIÐgDD­Zµâ‚ .ˆSN9%Ï>ûlE*•*5|YTTãÇ��ñãÇǽ÷Þ©T*¶ß~ûèØ±ctèÐ!Z·n-[¶Œ–-[F^^^Ô®];êÔ©5jÔˆ•+WFAAA¬X±"æÏŸóæÍ‹¹sçÆôéÓcêÔ©ñÙgŸÅŠ+Ò}•5úãïÚ·o]tQqÄ›ào `ã3× �Uô¹ZË–-ã÷¿ÿ}ôïß?î¼óÎxñÅK †Fdj&I3f̈™3gÆë¯¿¾Aõ|߈²‡@#"Ú¶mçŸ~üñ¥®Ø˜ëØ09UÝÀjÛo¿}üõ¯�×_=úöí 4ˆ$IÒ™«DüYýý†|Ö¼çj«¿ßwß}ãî»ïŽW^y%N8áàÀÏ\'ÀúÉ­êÖ´í¶ÛÆW\^xa¼ð ñ¯ý+ÞÿýŒÁÐÕ²=œ¹ºFóæÍãØc��“N:):uê”ÕÕ…¹N€ÊÙì‚>W«W¯^œrÊ)qÊ)§Äœ9s⥗^Š7ß|3>üðÃ(**J_·¾C¡«‡?Wkݺuüìg?‹=zÄ�999Ô?À–Â\'@Ål¶AŸ?Öºuëèׯ_ôë×/–-[cÇŽ�ñãÇÇäÉ“còäÉñÝwßUê~¹¹¹Ñ¡C‡èÒ¥KtéÒ%öÙgŸhß¾ýFê`Ëa® |Õ"èóÇêׯ‡zhzè¡é½üüü˜3gNÌž=;.\+V¬ˆ‚‚‚(**ŠºuëF�:u¢AƒѪU«hݺul»í¶Þì°�ÌudªvAŸeÉËË‹¼¼¼Øe—]ªº€­š¹N`kæõç�‚> }@ú€,ô Y è²@Ð'd� OÈAŸ�‚> }@ú€,ô Y è²@Ð'd� OÈAŸ�‚> }@ú€,ô Y è²@Ð'd� OÈAŸ�¹UÝ@¶Ç”)Sbܸq1eÊ”X¸paäççÇâÅ‹cÕªUqÎ9çį~õ«*î`Ëf®ØZUû Ï/¾ø"}ôÑ>|x¬X±¢Ô÷I’DDD*•Š%K–¬õ^Ÿ|òIÜwß}{{î¹§!R€ 0× líªmÐçwß}×_}¼þúë‘$IzðsM©TªÜïÖÔ¡C‡øàƒbÞ¼yñý0é;_øÅ/¢fÍšYë`Kb®à{9UÝÀúxûí·ã¸ãŽ‹×^{-JJJ"I’H¥Re~*#777Î8㌌Òüüü1bD¶`‹`®àÕ.èóŸÿüg 0 ,X�1ºÚê·À¯ímðksÊ)§DnnnÆÞK/½´Á}liÌudÊ]÷%›�1cÆÄ5×\ÅÅÅ¥†@#"Ú´iûì³O´mÛ67n7Þxc¥käååE÷îÝãí·ßŽT*I’Ļロµgؘë(­Ú}.Y²$~ûÛß–9 zÀÄùçŸ{ï½wÆ™õ�ˆ8üðÃãí·ßN¯/^“&MŠ.]º¬_ó[s�e«6AŸ÷ÜsOÌŸ??= š$IäääÄ•W^g�uVVkuïÞ½ÔÞøñã „„¹N€òäTu±bÅŠxâ‰'2†AS©T\{íµY�ˆØn»í"///coÚ´iY¯Pݘë(_µú9rd,_¾<"~íÕ«WôéÓg£ÕìÔ©SºVDÄ_|±ÑjTæ:ÊW-‚>ß}÷ÝR{_|ñF­ÙºuëôÏI’Äܹs7j=€êÀ\'@ùªEÐç”)S2Ö;í´Sì´ÓNµfÆ 3ÖK—.ݨõªs�å«AŸsæÌ‰T*I’D*•ŠÝwß}£×ÌËËËX/[¶l£×ØÜ™ë(_µú\²dIƺyóæ½fqqqƺ¨¨h£×ØÜ™ë(_µúL’d“×\¼xqƺvíÚ›¼€Í�¹N€òU‹ Ïºuëf¬-Z´ÑkΟ??cݤI“�^`sg® |Õ"è³E‹ë3flôšãÇ��T*I’D*•ŠÖ­[oôš›;s�å«AŸíÚµKf&I&Lˆ¢¢¢�VoÚ´iñí·ßfìuêÔi£Õ¨.Ìu”¯Z}î¶Ûnë‚‚‚xå•W6Z½'žx¢ÔÞž{î¹ÑêTæ:ÊW-‚>ö³Ÿe¬“$‰{î¹'JJJ²^kÞ¼yñì³ÏF*•JïåææÆA”õZÕ�¹N€òU‹ Ï]vÙ%vÞy爈ô ægŸ}·ÞzkVëÇ%—\+V¬ˆˆïOS©TôìÙ34h�ÕZÕ‘¹N€òU‹ Ïˆˆ~ýúE’$ñýPh’$ñÀÄ}÷Ý—•û¯Zµ*~ó›ßć~˜ñÖ÷ˆˆ¾}ûf¥À–À\'@ÙªMÐç 'œ�;wN¯W…Þzë­qñÅÇìÙ³×ûÞ&Lˆ>}úÄË/¿œ]ýÖ÷#�<2ºuë¶Áýl)Ìu”-·ª¨¨T*ŒSO=5 Ò{I’Ä+¯¼#FŒˆ=zÄG{ì±G´lÙ²Ü{Ç_|cÇŽ�W_}5ÆŽ? �®Ö¬Y³¸öÚk7îƒT3æ:ÊVm‚>#":uêŒË.»,JJJ"⇡ÐU«VÅË/¿/¿ürDDÔ«W¯Ôùx î¿ÿþX¶lYÆ~’$é{­^שS'n¿ýöhÚ´éÆ|$€jÉ\'@iÕ*è3"âÈ#�Œâââ¸êª«¢°°0"29W[=ô¹z/I’X²dI™÷üñÛÞ“$‰ºuëÆ Aƒb¯½öÚ(ϰ%0× �)§ªXÇsL<úè£Ñ¦M›Œ!ÐT*•ñYӚ߯y]’$±ýöÛÇ#�<|ð&y€êÌ\'ÀªeÐgDÄn»íÿþ÷¿cÀ€Q·nÝH’$c84bÝ¢«%I5kÖŒsÎ9'ž{î¹èÚµëÆn`‹a®à{¹UÝÀ†¨S§N\|ñÅÑ·oßxî¹çâ…^ˆI“&EIII…ïѶmÛ8î¸ãâ—¿üel³Í6±[€-—¹N€jô¹Z£F�⬳Ί³Î:+¾û8qb|úé§1{öìX°`ADqqqÔ®];òòò¢uëÖѾ}ûØ}÷Ýc‡v¨êö¶æ:€­ÙôùcMš4‰ƒ>8>øàªn`«f®ØÚäTu°%È­êàÇ-ZãÇ��™3gƲeË¢V­ZÑ¢E‹èܹs´oß~£Ö.**Š�?þ8¦M› .Œ‚‚‚¨S§N4mÚ4¶ß~ûèÔ©S4hÐ +µ¾ú꫘4iR,\¸0òóó£N�:ѪU«øÉO~Ûo¿}Vj¬Í¬Y³â“O>‰9sæÄ²eË¢F�ѰaÃhÓ¦M´oß>Ú´i³Ñ{€-� O2|÷Ýw1iÒ¤øè£�bâĉ1iÒ¤˜?~Æ5\pA\xá…Y­ûþûïÇßÿþ÷=zt—yMÛ¶mãôÓO�>}úDÍš5³V{Ò¤Iñè£�Æë¯¿K—.-÷ºœœœØyç�ã ƒŠÞ½{ÇŽ;îX©:Ë—/�G}4þñ�ÄÌ™3˽nç�wŽÓO?=z÷î¹¹ÙûU½xñâxâ‰'â¹çž‹éÓ§¯õÚm¶Ù&öÛo¿8òÈ#£W¯^YëaCýö·¿�áÇ—Ú8p`œ|òÉUÐü@Ð'ñÐC¥ƒ=¿úê«MZ»°°0�?þø:¯�1cFüéOŠaÆÅ�wÞíÚµÛ ÚùùùñÇ?þ1þõ¯E’$ë¼¾¤¤$>ýôÓøôÓO£Q£Fqî¹çV¸Ö;ï¼W\qE,X°`�×~öÙgqýõ×ÇSO=·ß~{´mÛ¶ÂuÊ3lذ¸ùæ›cñâź~þüùñïÿ;&Ož¼Ù}Ž5ªÌ�OØ\ú nºé¦*©[TTÿû¿ÿo¼ñF¥ÎM�:5úôé�=öX´oß~½jñÅñë_ÿ:fÏž½^ç+cèСqà 7Dqqq¥Î}üñÇñË_þ2yä‘èØ±ãzÕ.,,Œk®¹&ž{î¹õ:¿¹X±bE\wÝuUݬ• OªÌ-·ÜR*ä³I“&qúé§GÏž=£U«V±hÑ¢˜4iR 2$&Nœ˜¾náÂ…1`À€øç?ÿ 4¨TÝ3fÄé§Ÿß~ûmÆ~ÇŽãÈ#�Œ8 Z´h�5ŠåË—Ç7ß|üq¼ûî»ñöÛoÇâÅ‹+\k̘1e†|xà�Ñ»wïèÖ­[4nÜ8-Z'NŒ¡C‡Æ˜1cÒ×}÷Ýw1`À€xæ™g¢I“&•zÎ’’’¸ì²Ëâ•W^ÉØÏËË‹#�<2=ôÐhÛ¶m4oÞø`tëÖ­BçkÖ¬ÇsL…®}â‰'báÂ…{¿ýíoK…|®é—¿üe,Y²$n¾ùæôÞ³Ï>çœsNì¸ãŽª=uêÔ¸çž{2ö P©–»ì²Kì²Ë.¾~c(**Šk®¹&–Ú¬Y³¸ì²Ë}l¦Ìu[»jôYXX�>úh 6,¦OŸžÞÿq`7lذMZïã�?Ž‘#Gfì]tÑEѪU«už½á†bÔ¨QQPPñÀÄï~÷»užýôÓOã�ÈØûË_þRá�ÏÊzôÑG3Ö�:uгÎ:«BgÏ9çœ>|xL�:5"¾¼_ýõèׯ_̘1#’$1À PM½ñÆë^½zEƒ *|þä“OÎXÏ�;7&Mš´Ö3‹/ŽW_}5c¯oß¾®YYï¿ÿ~©½8 R÷èÞ½{Æzùòå1jÔ¨už:thÆúÈ#�ŒV­ZUªöæàþûï�‚‚‚ˆˆ¨U«VÜpà UÛÌu”Vm‚>?ú裸øâ‹cÕªU¥†?üøl~È®9sæÄ矞±·ï¾ûVê{ì±GÔ¬Y3cï?ÿùÏZÏüë_ÿŠ•+W¦×-[¶Œ}öÙ§Ru+cÞ¼yëZµjE»ví*u�wܱÔsŽ9r­g.\¯¿þzÆÞ±Ç[©º›ƒ7ß|3&Ožœ^ÿÏÿüO¥ÿþØxÌu”-·ª¨ˆ’’’¸þú루¨¨ÌAÐ:uêD÷îÝc×]w�¶mÛFÆ £^½z‘“SmrL¶Ÿ~úi©½=÷ܳR÷¨S§NtîÜ9&L˜�Þ›:uêZÏŒ5*c½ÿþûoÔß‹-ÊXçååUú©T*òòòâÛo¿Mï•õ÷÷cï½÷^¦×¹¹¹•R­j‹/ŽÇ<½ÞqÇãÜsÏ­ÂŽø1s�å«AŸï¼óNL™2%c4I’hذaœþùqê©§Fݺu«°C*ê‹/¾ÈXçææF»ví*}ŸöíÛg}~ùå—k½þ£�>ÊXwêÔ)c]XX|ðA|úé§±hÑ¢¨[·n4iÒ$vÜqÇØm·Ý¢fÍš•ê/I’ŒõšÿBCE­ynÚ´ik½~âĉëwÜ1jÕª•±÷Å_ĸqãâ믿Ž$I¢iӦѢE‹Øk¯½¢iÓ¦ëÕg6=òÈ#±téÒôú†n(õ Ts�å«AŸ¯½öZÆ:I’hÞ¼y 2$:tèPE]°>Ö ªlÙ²eäääTú>Ûn»mÆzúôéQ\\5jÔ(uíœ9sbÁ‚{«¬\¹2þþ÷¿Çã�?‹/.³V½zõ¢W¯^qÁÄ;ìP¡þ5j”±ÎÏϯй5­ynÉ’%1oÞ¼hÙ²e™×¯hÚ¾}ûôÏo¾ùf 4(¦L™RæÙT*]»v�sÏ=7zõêµ^ýn¨·ß~;ÆŒ“^{ì±±ÿþûWI/”Í\'@ù*Ÿ¬V&L˜�~ë{’$‘J¥âÆo4 P }óÍ7ë5;+ªuëÖëU«VÅ¢E‹Ê¼vÍpшïƒ8?ýôÓøùÏwß}w¹!ŸË—/�áÇÇQG÷Þ{o…úkÖ¬YÆzåÊ•1sæÌ �]múôé±jÕªRûóæÍ+÷Ì_|‘±nÔ¨Q¬\¹2®½öÚ8÷ÜsË ùŒøþwìĉã‚ .ˆ3Î8#.\X©~7Ô²eËâÏþszÝ Aƒ¸ôÒK7i¬›¹N€òU‹ Ï d¬·ß~ûèÑ£GuÀ†X¾|yƺAƒëuŸúõë¯óÞ«•â¹páÂèÛ·o|öÙg®YTT·ÜrK\{íµë¼v·Ýv+µ÷î»ïV¸ÖÚ®/ï9#J?k½zõâŠ+®ˆ¡C‡Vªöرcã—¿üe|ýõו:·!n»í¶Œz}úô‰¦M›n²úTŒ¹N€òåVu‘ŸŸ?¼õ}ß}÷­âŽX_k†TÖ©Sg½îSÖ¹eË–•yíêß#?võÕWÇÂ… Óë#Ž8"N>ùäèÒ¥KäååÅ¢E‹b„ 1tèÐxë­·2Î:4:uê§Ÿ~z¹ýýä'?‰zõêe<ïSO=¿øÅ/ÖùlßÿÎ{úé§Ëü®¼ Ï‚‚‚XµjUÆÞðáÃ3ž³]»vqÖYgÅ�-[¶ŒU«VÅôéÓãÕW_�Ç{,V¬X‘¾væÌ™qÉ%—Äc�=¹¹÷ÿ2Lœ81üñôºS§NqÈ!‡lÔš¬s�åË©ê*¢~ýúëm¶Ù¦Š:`Cý8H2"¢V­ZëuŸ²‚>Ë À\ºti©½Õá—µk׎ÁƒÇw܇rH4oÞùä:Ÿ-"âñÇ�)S¦”ù]yϹdÉ’R{?ù<餓âùçŸ�ÓN;-Ú¶muêÔ‰¼¼¼èÖ­[üæ7¿‰çŸ>Úµk—q~ܸqñàƒV¨çõUXXW_}u”””DDD�5¢_¿~‘J¥6j]Ö�¹N€òU‹ Ï-Zd¬W­ZUE�P­�,ËŸþô§èÙ³çZÏŸ|òÉqÅWdìÆC=´ÖsçœsNäææ–ª÷â‹/®õÜ¿þõ¯8p`¹ß—€¹¶çüéO\k°êöÛo=ôP4lØ0cÿᇎ•+W®µç qÿý÷ÇÔ©SÓëc�=6¶Ûn»�V€ c® |Õ"è³sçΑ$I:ØlÁ‚UÜë«nݺëõò/(((µW¯^½2¯-o¿{÷îqÜqÇU¨Þ™gž»ì²KÆÞ3Ï<ÅÅÅåžÙa‡âÒK/ÍØ+,,ŒK.¹$Î?ÿü9rd,X° cÁ‚1bĈ0`@\~ùåQTTMš4)uß5ƒ8W«_¿~™û5jÔˆßÿþ÷å„þXëÖ­ã‚ .ÈØ[°`A¼ñÆë<»>¾üòËøÛßþ–^o·ÝvqÒI'm”Zd‡¹N€òU‹ Ïƒ>8ýs’$ñÞ{ïUa7lˆ5C7Ë ì¬ˆ²Î•tY^Ðçi§�Váz©T*úô铱·lÙ²˜úè8à€bÊ”)Y¯@ö˜ëØz,Z´(Æ�3gÎŒeË–E­Zµ¢E‹ѹsçhß¾}Vk-^¼8>û쳘1cFäççÇÊ•+£aÆѤI“èÔ©Sì´ÓN‘J¥²Z³*-]º4&Mš³fÍŠ%K–DAAA4hÐ 5j;vŒ�wÞ9jÔ¨QÕm¦ÇĉcæÌ™ñÝwßE’$ѨQ£Øi§�b÷Ýw÷¢w€©AŸuêÔ‰þýûÇÍ7ßœ̹ùæ›ãÑG­âΨ¬-Zd¬çÎ�»^÷ùúë¯3ÖµjÕŠÆ�—yí¶Ûn[f�5ªTÍvíÚE­ZµbÕªUé½ ¬ó\*•Š‹.º(Ž9昸뮻bĈ¥Â8WkÚ´iœ}öÙѯ_¿ÈÍÍ�·Þz+ãûZµjÅöÛo_n­m·Ý6¦OŸž±×±cÇuö¸¦Ž;f}Vä9+ãÛo¿�›o¾9½nذa\uÕUY­ÀÆa®`Óùî»ïbÒ¤IñÑGÅĉcÒ¤I1þüŒk.¸à‚¸ð ³Z÷ý÷ß�¿ÿýï1zôèr_rÞ¶mÛ8ýôÓ£OŸ>Q³fÍJ×X±bE¼ýöÛ1jÔ¨x÷ÝwKÍ?®©qãÆqÔQGÅgœ‘õ�Ѳüö·¿�áÇ—Ú8p`œ|òÉëuÏâââxñÅãé§ŸŽ>ø JJJʽ¶nݺqøá‡Çi§�»ï¾ûzÕˆüüüø×¿þo¾ùf,[¶¬ÌkêÕ«ÇsL 0 ¶Ûn»MÜ!Àæ§Z}FDœ}öÙñÚk¯Åøñã#âûÁ¡AƒÅÅ_\¥}P9;í´SÆzÞ¼yQRR999•ºÏšAŸíÚµ+÷­åe sV6äsµ¼¼¼ŒÐËÅ‹Wølûöíã¶Ûn‹U«VÅ|3gÎŒ… ÆÊ•+£Y³f±ë®»Æî»ï¹¹?üzþüóÏ3î±ë®»®uv§�v*5èš——WáË;S™ç¬ˆÏ?ÿ<òóóÓëvØ!yä‘(**ÊøûmÞ¼yÆßGDÄ’%KJÝïå—_Ž/¾ø"c¯ÿþëýÏ€µ3× °ñ<ôÐCé`ϯ¾új“Ö.,,Œ�Æã�?¾Îkg̘úÓŸbذaqç�wF»ví*TcÑ¢Eqã�7ÆþóŸX¾|y…{[´hQ<ùä“ñÔSOÅYg�—]vYÔªU«Âç+cÔ¨Qe†|nˆÏ>û,®¸âŠ˜<†½{÷Ž«®º*4h�ÕžÖå­·ÞŠßýîw±téÒµ^·|ùò6lXüûßÿŽk®¹&z÷:Ø}z©ÐuY3ÔqÇw,÷ÚF�Å6Ûl“ñû$I*U¯¼s©TªÒ÷¨U«VtïÞ=ºwï¾Îk§N�š±îÚµëZ¯ïСCŒ1"co}ž5ÏY“'O®ðàjYÞ|óÍxóÍ73öN=õTAŸ‰¹N€�禛nª’ºEEEñ¿ÿû¿ñÆoTêÜÔ©S£OŸ>ñØc�•ùrö5}ûí·ñâ‹/®o›‘$I 2$>øàƒ2dHÖÃ/W¬X×]w]VïùÑGEß¾}Ë|ÙyEüãÿˆÏ?ÿ<xà�Möù /Äo~ó›())©ð™+VÄÕW_‹/Ž~ýúmÄî6o9UÝ@e´lÙ2yä‘èØ±czoÈ�!qÒI'ÅsÏ=«V­ªÂN�:•Ú7n\¥îQPPP*òÇ¿*RwñâÅ•ªñý`h~~~Æ^“&M*}ŸŠZºtiLš4)cï€Xë™]vÙ¥ÔÞš=WĦ|Nª's�[–[n¹¥TÈg“&Mâ /ŒáÃ‡ÇØ±cãÕW_�[o½5ºuë–qÝÂ… cÀ€±téÒõªÝ¸qã8öØcã÷¿ÿ}<óÌ3ñæ›oÆ|#GŽŒ»îº+Ž:ê¨ÈÉÉü×>úè£8ï¼ó*DYwÜqGÌš5+k÷[¼xqœ{î¹¥B>·Ùf›¸è¢‹bèС1zôèøàƒbĈ1xðà8æ˜cJ=ïøñã³@ZžÉ“'Ç•W^™ñw›J¥¢W¯^1dÈ�xë­·bÔ¨Qñøã�ÇÏþóRß7ß|sŒ9r“ô °9Ê­ê*«U«V1tèÐøóŸÿC‡�$IâóÏ?�«®º*þð‡?Än»í]ºt‰¦M›FÆ £F�Y©{â‰'få>[»Ö­[G‡âóÏ?Oï�;6~þóŸWøãÆ�‹ÂÂÂŒ½C9d­g=ôÐxç�wÒëo¾ù&-Z�7®pÝ/¿ü²TÝ-ZTø|e½öÚkQPP�^o³Í6qðÁ¯õÌOúÓÈÍÍ�¢¢¢ôÞÔ©SãÀ¬Tí©S§f¬7æsP}™ëØøêÕ«]ºt‰.]ºD×®]ã’K.Éz�O>ù$z行½�wÞ9xà�hÙ²ez¯Q£FѶmÛ8úè£càÀ�ñðç¿›9sf <8®¸âŠ ×Ýwß}ãÔSO�^½zE­ZµJ}ß AƒhݺuôêÕ+>üðø袋bþüùéïÇŽC‡�SO=µ2�[®É“'g<ÓOúÓŒùÓõqç�wÆÂ… 3ö<ðÀ4hPäååeì7hÐ Ú´i={öŒSO=5Î;,ðÔ^x!N;í´Ø{ï½7¨§u¹öÚk3»sssãüóÏ�sÎ9'êÖ­›ÞoÞ¼yì½÷Þq 'Äÿûÿ/fš$I\ýõqÀDíÚµ7j¯›£jôQ»ví¸á†¢qãÆqÏ=÷D*•Š$IbÙ²e1f̘3fLÖkÈž=zd}¾úê«qÝu×Eýúõ+tþ¹çžËXo»í¶Ñ¥K—µžéÙ³güñ�Œ$IÒ{£G�Ž£�>ºÂ}—õûec J–””Ä£�>š±wòÉ'GnîÚu7jÔ(öÝwß=ztzoôèÑÑ·oß ×^¼xqL™2%co¯½öªðùŠØo¿ýâÓO?-µ¿bÅŠŒÚ�;wÎ�ˆ˜5kVôèÑ#coàÀ�qòÉ'gµG*Æ\'@vuëÖ-ºvíšþì´ÓN‘“““þ~c}4(cƲ~ýúqß}÷e„|þX*•Šßýîw1kÖ¬xã�7ÒûO<ñDœ}öÙåž[m�=öˆK.¹$öÛo¿ ÷¸çž{Æ<§žzj,_¾<½×]wÅ/~ñ‹Œ¿£õQTT×\sMGDD³fÍâ²Ë.Û  Ïâââxþùç3öZµjwÞyç:çf÷Ýw߸馛₠.ÈØþùç7jÐ端¾“'OÎØëÓ§Oì¿ÿþåžÙo¿ý⦛nŠÿ÷ÿþ_zoÞ¼yñä“OÆÙgŸ½±ZØlmØ$Kyýõ×ãˆ#Žˆ{ï½7R©TD|?(´z04Û²ëÈ#�ÌX/_¾<žyæ™ ��?~¼üòË{GqÄ:Ïm»í¶¥Â*Ÿ|òÉ ÕŒø>xó©§žÊØkÑ¢EtèСÂ÷¨Œ§Ÿ~:cH²Aƒñ«_ýªBg�9昌õ;ï¼3gάpí¡C‡f¼…="
ðy¶.æ:²kذaqÝu×ÅI'�:tØàËuùøã�cäÈ‘{]tQ´jÕj�go¸á†¨S§Nz]PP<ðÀZÏ´k×.žzê©J…|®Ö©S§8çœs2öæÏŸ&L¨ô½ÖôÐCe¼¬üÊ+¯Œ¼¼¼ ºç”)SbÑ¢E{§Ÿ~ú:C>WëÕ«W´oß>coìØ±ÔÓº <8cÝ®]» ÍêöìÙ³Ô‹Üï½÷Þ(,,ÌjÕAµ ú,**Šßýîwqá…ÆÌ™3ËÜ\=š­Ù×¹sç8ôÐC3öî¸ãŽ˜7oÞ:ÏÞxã�QPP�^×®];úõëW¡º^xaÆzìØ±ñì³ÏVèìƒ>S§NÍØ;ãŒ3*t¶²F�ÌØ»ôÒK×ùvûÕN8á„hÛ¶mz]RR×^{m”””¬óìW_}wß}wÆ^ûöíãÀ\ë¹ÿþ÷¿Ñ©S§ŒÏ�wÞY¡~¨žÌul^z饌u½zõ¢wïÞ:Û¢E‹8üðÃ3ö^y啵ž©Q£Få\É'žXjïÃ?Ü {Μ93îºë®ôº{÷îqüñÇoÐ=#¢ÌÙØ}öÙ§R÷Ø{ï½3Öß|óÍõ´6_~ùe|òÉ'{‡~x…Ãfל­ýöÛoã½÷ÞËZÕEµ úL’$.½ôÒøç?ÿI’Þ¨æ.¾øâŒÿí^²dIüú׿.7ì3I’¸é¦›âµ×^ËØÿÕ¯~UáÌý÷ß?:è Œ½ë®»®Ô€êšž~úé¸å–[2öš5k§�vÚ:k¾þúëñúë¯Gqqñ:¯-**Š!C†ÄùçŸ+W®Lïï¹çžªµZÍš5ãâ‹/ÎØ{÷ÝwãòË/ϸüòË8ûì³cùòåû\p�ß³d0× °åxã�72Ö½zõŠ TøüÉ'Ÿœ±ž;wnLš4)+½•eûí·�úõëgìÍŸ?ƒîyÝu×¥_D_«V­¸á†6è~«­X±¢Ô^£F�*u�&Mšd¬ 7¨§µYó? µk׎ý÷ÿÿìÝ{¸•e�?þÏÚìÍÞœ¶œä¤i¨i"¨å±ËÒš”±I4�A§Á/™–“©Y95†x¨�cšY&e¨áyÆP‚�h2àH6'Á [X¿?º\?ž}^›g»aí×뺸®îÏzîûþܲæbýqÏûÑèù#FŒˆ}öÙ§Þ5Zƒâ–n ±î¼óΘ9sf­—??zë{DDqqqtèÐ!Ú·oï’(@#½üòËñØc�5úùY³fÕY^^ãÇ�op�O~ò“1f̘¸ãŽ;rµ%K–Äi§�çœsNœp ±Ï>ûĆ âå—_Ž»îº+.\˜X£ÿþ1a„F÷ñýï?F�7nŒˆ\vœ8qbüáˆQ£FÅ!‡ååå±~ýúX´hQüæ7¿‰^x!±F›6mâúë¯oÔ%ÖW_}5n¾ùæèÖ­[wÜq1lذøä'?{ï½w´k×.Ö¯_«V­Šçž{.yä‘xóÍ7óûöí7ÝtSÞÿ¦�rÊ)ñ§?ý)q9òOúS,X° Î=÷Ü8ú裣gÏž±mÛ¶xóÍ7cæÌ™qÿý÷×ø{5jTœrÊ)yí @ás¯ 0¬\¹2–.]š¨yä‘y­qøá‡GIII"€ò™gž‰C9$•kSVV›7oÎ�«¿ä<¿ÿýïãùçŸÏ�/¸à‚Øo¿ýv¥½œ®]»Ö¨}t‡µ±Ö¯_ŸwïÞ}WZª×ÿüÏÿ$Æ|p”••5z~&“‰aÆÅÿøÇ\í™gž‰ï}ï{©õ°'Ø#‚>7lØ7ß|s­AÛµkŸÿüçãÄOŒ<0úöíë"(@ž–,YÓ¦MkôóóçÏ�ùóç×úYŸ>}ô1iÒ¤xã�7âé§ŸÎÕ***bÊ”)1eÊ”zçvéÒ%~ñ‹_äõÆøˆ¼Åý–[n‰ñãÇ'Þ’þôÓO'ú¨Kqqq|ÿûß�‘#GæµïÚµkãÁŒ|°Ñs ·Ýv[“/dþä'?‰óÏ??,X�«­X±"~üã7jþ1Ç“Úé(îuŽ×^{­FmÈ�!y­QVVtPâ…îK–,ÙåÞê²uëÖ¨¨¨HÔºuëÖ¤µÖ®]ÿùŸÿ™ï¿ÿþ�¾Û|pd2™Dö‹/¾‡zh£×¨~g7ß¿Ÿ|Tÿ>|úÓŸÎ{�!C†$‚>W¬X[¶l‰öíÛïj{{Œ¢–n 1þð‡?$Þ°›Íf#›ÍÆqÇ�=öXüøÇ?Ž“N:)úõëç2(À¤¸¸8nºé¦=zt^ó>ñ‰OÄý÷߃ jÒ¾GydÜ{ï½Ñ¿ÿ¼æuïÞ=¦N�ÿò/ÿÒ¤}«¨¨(¾úÕ¯ÆoûÛØgŸ}š¼NÇŽãŽ;îˆ/}éKyÍkÓ¦MŒ3&¦N�¥¥¥MÞ€Âä^'@áxýõ×ãâââØo¿ýò^gàÀ�‰ño¼±+mÕkîܹ‰à̈ÈûNèG~øÃÆúõësã«®º*Ú¶m»+í%tîÜ9Ž>úèDíž{î‰ÊÊÊFÍúé§k„¦žqÆ©õ·³ŠŠŠÄ‹ˆŸæ«úw!›ÍÖøžº="èsÖ¬Y¹ÿ�Íf#“ÉÄg?ûÙøùÏ={ölÁÎØU%%%qÕUWŽ÷ÞÇsLÕýOS¿~ýâ»ßýn<ôÐCMºDº³ƒ>8þô§?Åå—_ÞàåÎþýûǤI“âñǯqÙ²!§œrJœwÞyqÀÔ{¶ˆˆòòò8ãŒ3búôéqÍ5פòæòöíÛÇý×ÅÝwßÇsL´iÓ¦Îg;vì_úÒ—âᇎË/¿¼Þgh½Üë(Ë–-KŒ{öìÙà}ÇÚôêÕ+1~óÍ7cûöí»Ô[]zè¡Ä8“ÉÄ1Ç“÷:Ï>ûl̘1#7>í´ÓbĈ»Ü_u'NLÜÉ\±bE|ó›ßŒ÷ß¿Þy/½ôR\vÙe‰ÚÉ'ŸÜ,=FÔ }�¨ù÷Úµ½ä^Ð'ÐÚ·t�ñ·¿ý-ñF÷6mÚÄÕW_ݤ DÔ4jÔ¨5jT‹ö0tèиýöÛcݺuñÒK/ÅÛo¿›7oŽ’’’èÑ£G|ðÁ1hРT÷,--�1cÆÄ˜1cbÙ²eñꫯÆêÕ«cÛ¶mQ^^]»v�C9$úõë×ä=—]vY\vÙeñþûïÇßþö·xç�w¢¢¢"*++£´´4ºwïƒ ŠÁƒ7[¸æˆ#bĈ±aÆx饗⭷ފ÷ß?Úµk]ºt‰þýûÇ¡‡ÅÅMûi0|øðxíµ×Rîºv}ûöýØö &÷: Çš5kã¦;FDôîÝ;1Þ¶m[¬_¿>ºuëÖäÞjóÿ÷ñè£�&jÆ ‹½÷Þ;¯u6oÞW]uUnܹs硚iùÔ§>W\qE\sÍ5¹Ú³Ï>_úÒ—âk_ûZ}ôÑѯ_¿(--��7Æ+¯¼3f̈?þñ�ñá‡ææqÄñãÿ¸YzŒ¨ù]ˆøÇ÷aÓ¦My­Ó«W¯Èd2‘ÍfsµÕ«Wïr{’="èsݺuñÿ¿õýðïõ-¯ìùºtéÇüǾïÀ�càÀ�ͺGÇŽcèС1tèÐfݧ>{íµW{ì±-¶?{>÷: Ç–-[ãŽ;6i�:ÔºvšAŸÛ·o�+®¸"¶oßž¨O˜0!ïµ&Ož+W®Ì�¿õ­oE×®]w¹Çºœ}öÙÑ¥K—¸úê«cýúõ±råÊøÉO~ÒàÜvíÚÅ¿þë¿Æ„ ¢mÛ¶ÍÖãæÍ›kÔ:tè�wÐgIII”––Feee®Vý{Pèöˆ Ï;v$Æx` uк¹× P8ª0–••5i�ÚæÕ¹+¦L™ .LÔN9å”1bD^ë,Z´(î½÷ÞÜøˆ#Žˆ3Î8#•ësÊ)§Äg>ó™¸ÿþû㡇ŠeË–Õû|&“‰Ñ£GÇ¿ýÛ¿5kéGj ãܕO 5+j飼¼<1Þk¯½Z¨€ÖͽN€ÂñÁ$ÆmÛ¶mÒ:µB¦îøØc�ÅÔ©Sµ=zÄ•W^™×:UUUqÅWäB«KJJâšk®‰L&“Z¯õY¸paÌ�;7Þyç�ŸÍf³qß}÷Å׿þõxôÑG›½·êß…ˆ¦JKKcAŸ@kSÜÒ 4FÿþýcíÚµ¹ñ† Z°€Ö˽N>N .ŒË/¿<²Ùl®V\\“'OŽ.]ºäµÖm·ÝK–,É�ÇŽƒ J­×ºTTTÄw¾ó�xæ™gõ:Ä�!C¢OŸ>Ñ®]»Ø°aC¼úê«ñÚk¯åÂH_{íµ˜8qb<úè£ñ“Ÿü¤ÖPUv/{DÐ硇 ,Ƚ%wùòå-Ü@ëä^'@áh×®]b¼mÛ¶&­SYYY£Ö¾}û&­µ³eË–Åøñããƒ>HÔ¯½öÚ:th^k½ñÆñ‹_ü"7îׯ_|ãߨå²víÚ8çœsbÙ²e¹ZûöícÒ¤Iñ•¯|%JKKkÌyûí·còäÉñÈ#�äjþóŸcóæÍ1uêÔhÓ¦Mê}Vÿ.D4ýû°uëÖÄ8�ïÀž¤¨¥hŒ“N:)÷¿³ÙlÌž=»ÉFh:÷: GõÆÚ;£¶y:thÒZY±bEœwÞy±~ýúDýÛßþvœ~úéy­•ÍfãÊ+¯LP~ÿûß�²²²]ê±1¾ýío'B>÷Úk¯xà�âk_ûZ­!Ÿýû÷�É“'Ç7¿ùÍDý¹çž‹Ûo¿½Yú¬-Œ3­ïƒ O µÙ#‚>‡ x`n\YYÓ§Oo¹†Z)÷: GõÆ÷ß¿IëlÞ¼¹ÁµóñÞ{ïÅyç�«V­JÔ/¸à‚;vlÞëýö·¿�9sæäƧœrJ|æ3Ÿir�õì³ÏÆsÏ=—¨ýà?ˆO|â�š?a„øìg?›¨M�:µÖÿÞ»ª¶`Ö¦ìSUU•T�ô ´>{DÐgDÄw¾ó�ˆˆÈd2‘Ífã†nˆŠŠŠî  õq¯ 0ôèÑ#1®¬ÙXï¾ûnbܶmÛèܹs“ÖZ¿~}Œ3&Þ|óÍDý¬³ÎŠÿ÷ÿþ_Þë­]»6~úÓŸæÆ�:uÊý;ÖÜ~ó›ß$Æ ˆ“O>9¯5¾ñ�o$Æ›6mŠ'žxb—{«®úw!¢i߇U«VE6›mpm€BVÜÒ 4Öˆ#büøñqë­·F&“‰ŠŠŠ;vlÜsÏ=ѱcÇ–n Õp¯ 0 0 1^½zuìØ±#ŠŠŠòZ§zÐç~ûímÚ´É»Ÿ÷ß?Æ�K–,IÔ¿üå/Ç•W^™÷zK—.��7æÆýû÷�ÿþïÿnÔÜM›6Õ¨=öØcñúë¯'jãÆ�‹½öÚ+QËf³1oÞ¼Dí3ŸùLcÛÎùô§?ååå‰3,X° ¾üå/ç½V}ª"þÚ9pàÀ¼Ö©þ]ˆˆ¼×ØÓí1AŸ—\rIlÚ´)î»ï¾Èd2ñꫯƗ¿üå¸îºëbذa-Ý@«Tô­‡[º ÐÜѽ[ºà^'Àž¯zã‡~o¾ùf­¡�õ©|¹ÿþûçÝKeee|ã߈E‹%êŸûÜçâG?úQd2™¼×¬ÍâÅ‹cñâÅMžÿì³ÏƳÏ>›¨�yæ™5‚>7mÚ6lHÔúöí›÷~EEEÑ»wïDÐçêÕ«ó^§!]»v�Î�;Çúõësµ7Þx#ï�Îêß…L&Ó¤ïÀž,¿×ìòÊøÞ÷¾mÛ¶�L&+V¬ˆsÏ=7Î9çœxøá‡›å 5¹× °g;ðÀkÔ,X�ו••5‚38à€¼ÖØ¶m[L˜0!æÌ™“¨sÌ1ñ³Ÿý,Š‹‹óZowðÁÔ¨•••5i­víÚ%ÆÛ¶mkÒ: ©þ}X¸paÞk¼øâ‹‰qŸ>}¢C‡»ÔÀžf�¹írî¹ç&ÆÝºu‹•+WF&“‰l6óæÍ‹yóæå>ëÚµk”——GQÑ®g™f2™¸ûî»wy€Bà^'@aèÝ»w 4(–.]š«Í™3'þùŸÿ¹Ñk,X° ªªªµãŽ;®Ñó·oß“&MŠçž{.Q:thÜ|óÍѶmÛF¯µ;Ùk¯½jÔÖ­[פµ***ãÎ�;7i�†|ö³Ÿ�Ù³gçÆ‹/Ž­[·Fiii£æô`gù| Åô9gΜÈd2µ~öÑ¥Ð�¼÷Þ{ñÞ{ïÕù|>²Ùl*ë ÷: lj'ž˜úœ9sf\yå•Ñ¡C‡FÍŸ>}zbÜ«W¯8ä�C57›ÍÆw¾ó�˜9sf¢~È!‡Ä­·ÞíÚµkÔ:õ>|x¼öÚkMš»|ùò8ñĵÿøÇ1jԨ疕•EÇŽãý÷ßÏÕ.\˜wñöÛo'j=zôÈ{�Æ8ñÄã§?ýin\YY/¼ðB{ì±�š?{öìX¹re�5Z›]-úÇ,›Íæþì<Îd2‰?ÕŸmÊêæ^'ÀžïóŸÿ|b¼eË–xðÁ5÷ïÿ{<öØc‰ÚÉ'ŸÜ软¹æšøÃþ�¨pÀqûí·GÇŽ½ÎîêðÃOŒÿò—¿Ä{ï½—×Ó§O¯ñïàСCw¹·Úì¿ÿþñÉO~2Q›9sf£ÿþÕ¯~•wíÚ5† –Z{Š=.è³úÅÏ�/€6æ¹|þP7÷:ö|tPüñ‰Ú�7Þ«W¯npîÕW_•••¹qiiiŒ;¶Qû^ýõqß}÷%jûí·_Üyç�ѹsçF­±»;öØcãÊÊÊøÑ�~Ôèùï¼óNÜzë­‰ZYYY >¼Þy³gÏŽ<0ñ禛njÔž]tQbüÆoÄÌ™3œ÷ä“OÆã�?ž¨]pÁQRRÒ¨} Éô¹«or÷öw€t¸× P8&Nœ˜UÞ´iSœþùu†}f³Ù¸îºëj;ž}öÙѳgÏ÷›:ujL�:5QëÓ§OÜu×]ѽ{÷&œ`÷4jÔ¨èÚµk¢6cÆŒøÞ÷¾Û¶m«wîk¯½ç�w^¬_¿>QÿÚ×¾;vL»Õœ“O>9>øàDí¾ûî‹Ù³g×9gΜ9qùå—'j={öŒÑ£G7K�»»â–n ±.¾øâ–n€p¯ 9½üòËñØc�5úùY³fÅÖ­[ký¬¼¼<Æ�ßàŸüä'c̘1qÇwäjK–,‰ÓN;-Î9çœ8á„bŸ}ö‰ 6ÄË/¿wÝuW,\¸0±Fÿþýc„ îõÜsÏÅõ×__£þ©O}*î½÷Þçצ±çü¸uèÐ!.½ôÒøÎw¾“¨?ðÀñ¿ÿû¿1zôè9rdôéÓ'ÊÊÊbÆ ñÊ+¯Äã�?3f̈ªªªÄ¼>}ú|,ç¼æškâÌ3ÏÌí_UU7Þxcüío‹³Î:+ mÚ´‰7ß|3z衘>}z¢×L&W_}u”––6{¯»#AŸäŽN€æ³dÉ’˜6mZ£ŸŸ?~ÌŸ?¿ÖÏò †œ4iR¼ñÆñôÓOçj1eÊ”˜2eJ½s»té¿øÅ/¢cÇŽ î³fÍšZëù„›V÷q`6ŨQ£â­·ÞŠ_þò—‰ú»ï¾?ûÙϽN—.]bÚ´i±×^{¥Ýb ‡rH\wÝuq饗Ǝ;"""›ÍÆŸÿüçøóŸÿÜàüI“&ÅñÇßÜmì¶ŠZº eÇM7Ý£G�ÎkÞ'>ñ‰¸ÿXOãÁIDATþûcРAÍÔÙžï’K.‰Ÿüä'Ñ©S§&Í>|xLŸ>=˜rguûâ¿“'OŽ:4zNYYY\{íµ1nܸfì `÷'舒’’¸êª«âÞ{ï�cŽ9&ŠŠêþ9èׯ_|÷»ß�‡z(öÛo¿�¯É=Ô—¿üå˜9sfLš4)ößÿŸ/--�ã�?>¦M›wß}wôêÕëcè2éØc��믿>¾ð…/Dûöíë|®]»vqÆgÄŒ3â+_ùÊÇØ!À¥þaÔ¨Q1jÔ¨íaèСqûí·Çºuë⥗^Š·ß~;6oÞ%%%Ñ£G�8øàƒcРAMZ{w8_cõíÛ7^{íµÔÖëÚµkŒ?>Æ�ñ׿þ5Ö¬Y7nŒmÛ¶EÇŽ£¼¼<ößÿ€ºtéÇ|K·Q�ºvíÇ{lK·ÑhmÚ´‰O}êS1räÈ–n`·WÔÒ @!ô )ô )ô )ô )(n‰MÏ=÷ÜZë™L&î¾ûî¼æ|êë `Oæ^'@zZ$èsΜ9‘Édµl6[£ÖМ�CC}ìÉÜëHO‹}~$›ÍFDäuáò£9A€Ö½Î=ËÖ­[cþüùñúë¯ÇÆ�£¤¤$zõê‡vXôë×/Õ½Þ~ûíX´hQ¬Zµ*ªªª¢¼¼< C† ‰ÒÒÒÔö)Ä3Ðú´hÐgS.\º¤ �>÷:wÍêÕ«cÑ¢E±páÂX´hQ¼üò˱yóæÜç}úô‰§žzj—÷©¨¨ˆ›o¾9zè¡Ø²eK­Ï|ðÁqÑEÅI'�´K{=ñÄñóŸÿ</^\ëçíÛ·�Q£FÅ„ ¢k×®MÞ§Ï-¡è[·t ¨¹£{·t {” úlÊÜ?η¾´îu6Í‹/¾wÞyg,\¸0Ö¬YÓìûÍž=;þýßÿ=Ö­[Wïs‹/Ž &Äi§�?øÁ¢mÛ¶yí³mÛ¶øîw¿?\hà–-[âW¿úU<òÈ#qã�7ưaÃòÚ'¢0Ï@ëÖ"AŸ_|ñÇ2€ú¹×Ùtýë_ãñÇÿXöš7o^Œ?>*++õòòòèÛ·olذ!V­ZÛ·oÏ}6}úôزeKÜxã�‘ÉdµÏŽ;bâĉñä“O&êmÚ´‰}öÙ':uêË—/�M›6å>«¨¨ˆqãÆÅ�wÞ‡~x«>úhÅÜëlíÛ·�-[¶¤²Ö† â’K.IböéÓ'¾ûÝïÆ‰'ž˜ ¼\µjUüüç?�ßüæ7¹çfΜwÝuWŒ3¦Q{ÝvÛm51Ï<ó̸袋¢gÏžñ�àÌ'Ÿ|2~ô£ÅÊ•+#"âƒ>ˆ‰'ÆŸþô§èÔ©S«<DDµt°'ëСCyä‘1vìØ˜2eJ<õÔSñË_þ2µõo¿ýöX³fMnÜ·oßøõ¯'�tR.3"¢W¯^qÍ5×Ä%—\’˜Ë-·Ä† Ügݺu5úž4iR\}õÕ¹@̈ˆ¢¢¢øÜç>÷ßôéÓ'W_µjUÜyç�­öLQÜ’›ß{ï½qÇw䯙L&žxâ‰ìˆúlݺ5æÏŸ¯¿þzlܸ1JJJ¢W¯^qØa‡E¿~ýRÝëí·ßŽE‹ŪU«¢ªª*ÊËËcÀ€1dÈ�(--MmŸB<4…{�ù;á„â˜cމDQQQâ³åË—§²GEEEÜsÏ=‰Úµ×^›©¬î‚ .ˆçž{.æÎ�›6mŠ;FXfu·Ýv[lÞ¼976lXŒ7®Îç{öì?üáãë_ÿz®v×]wÅ9çœ]ºtiUg€�´hÐçÆ�cÅŠ‘Éd"›Í&Þ¾MÃV¯^‹-Š… Æ¢E‹âå—_N\DìÓ§O<õÔS»¼OEEEÜ|óÍñÐCÅ–-[j}æàƒŽ‹.º(N:é¤]Úë‰'žˆŸÿüç±xñâZ?oß¾}Œ5*&L˜]»vmò>…x&Øîuæ¯ÿþ;nj3w‡ #GެwN&“‰ &$Â*|ðÁ˜8qb�¯;vìˆßÿþ÷‰ÚÅ_Üà÷`äÈ‘1tèИ7o^DDlÞ¼9}ôÑ8묳ZÕ™à#E ?ÂîäÅ_Œ‹/¾8>ó™ÏÄg?ûÙ¸øâ‹cÚ´i1{öìDÈgZfÏž§œrJÜ{ï½ubFD,^¼8&L˜—]vYlÛ¶-ï}¶mÛßúÖ·b„ ubFDlÙ²%~õ«_Å©§žš{#{¾ ñL@azòÉ'ã3Î8£QóFŒ}ûöÍ�ÿþ÷¿ÇK/½TçóóçÏ�ŠŠŠÜ¸_¿~1|øðFíU½§ê=WWˆg€�úÜÃüõ¯�Ç<Ö¬YÓì{Í›7/Æ�ëÖ­KÔËËËã ƒŠ>}úD›6mŸMŸ>=&MšÙl¶ÑûìØ±#&Nœ?üp¢Þ¦M›èÛ·o <8:uê”ø¬¢¢"Æ� ,hõg ÓæÍ›cÞ¼y‰ÚÑGݨ¹™L&Ž:ê¨Dí™gž©óùgŸ}61>ꨣ"“É4j¯êûÌž=»Î—±â™`g‚> HûöíS[kÆ qÉ%—Deee®Ö§OŸ¸å–[bΜ9ñÐCÅSO=O=õT|õ«_MÌ�9sfÜu×]�Þë¶Ûn«ñ–ó3Ï<3ž~úéxòÉ'cúôé1gΜ¸ù曣wïÞ¹g>øàƒ˜8qblÚ´©Õž (\K—.�ªªªÜ¸oß¾±÷Þ{7zþ�!CãW_}µÎg«V}n}zöì}úôÉ�«ªªbéÒ¥µ>[ˆg€� úÜCuèÐ!Ž<òÈ;vlL™2%žzê©øå/™Úú·ß~{¬Y³&7îÛ·oüú×¿Ž“N:)ñ&ó^½zÅ5×\—\rIbþ-·Ü6lhpŸuëÖÕè{Ò¤IqõÕWGÏž=sµ¢¢¢øÜç>÷ßâÒäªU«âÎ;ïlµg ײeËãAƒå5àÀ�õ®·³×_½Þ¹ ©Þ[õõêê¡Î;ô¹‡9á„bÆŒ1oÞ¼¸çž{âÛßþv|þóŸOEîªŠŠŠ¸çž{µk¯½6RYÝ\Æ Ë�7mÚwÜqGƒ{ÝvÛm±yóæÜxذa1nܸ:ŸïÙ³güð‡?LÔîºë®X·n]½û♀ÂöÆo$ƽzõÊkþ>û쓯\¹2¶nÝZã¹ÊÊÊX¹re½sR½·ê½×U/„3ÀÎ}îaú÷ïƒ Š¢¢æû«›1cFlÙ²%76lXŒ9²Þ9™L&&L˜�¨=øàƒ‘Íf뜳cÇŽøý]|ñÅ‘ÉdêÝkäÈ‘1tèÐÜxóæÍñè£�Ö;§Ï¶µk×&Æù†bvïÞ=Š‹‹sã;vÄúõëk<·nݺÄýÈ’’’èÖ­[^{UùzõÞ몙`gÅ ?Bkóä“O&ÆgœqF£æ�1"úöíË—/�ˆˆ¿ÿýïñÒK/Åá‡^ëóóçÏ�ŠŠŠÜ¸_¿~1|øðFíuÆgļyó=ŸuÖYu>_ˆg ÛÎ/9�ˆh×®]^ó3™L”––Ƈ~˜«mÞ¼¹Á}ÊÊÊ|ÉyuíÛ·¯wͺê…p¦¦ª¬¬Lœ`wWYYÙÒ-,¿µš�ßZÍÇo-`wÖÒw³}’°yóæDØdDÄÑGݨ¹™L&Ž:ê¨xà�rµgžy¦ÎPÌgŸ}61>ꨣ}�ò¨£ŽJŒgÏž[¶l©q¡2¢0ϾêÁ’¥¥¥y¯QVV–¬-¬²zPfSö©>§±AŸ…p¦¦Z²dIªë4·×_½¥[(X~k4¿µš�ßZu+jéؽ,]º4ªªªrã¾}ûÆÞ{ïÝèùC† IŒ_}õÕ:Ÿ­þYõ¹õéÙ³gôéÓ'7®ªªŠ¥K—Öúl!ž (|[·nMŒKJJò^£mÛ¶‰qeee�g¶mÛö±ìQ˜g€� ú$aÙ²e‰ñ Aƒòš?pàÀz×ÛYõ$îêsR½·º’½ ñL@á+--MŒw~ñycU¼¬¾fDÍ@ËæÚ§¶z!œ vVÜÒ °{yã�7ã^½zå5Ÿ}öIŒW®\[·n­q±±²²2V®\Yï܆Tï­zïuÕ áL@ákß¾}b¼uëּר¬¬¬w͈ˆ:ìò>ÕçÔ¶OmõB8SSpÀQ\ì:7iZÙð#°  eee-Ý´¿µh^~kкù­Eóò[ üÞ¢ùø­ìÎ>üðÃX²dI‹íïf k×®MŒó ÅìÞ½{LJ~;vìˆõë×GÏž=Ï­[·.²Ùln\RRݺuËk¯êkVï½®z!œiWTVVæÎ°»«~!€ôø­мüÞh>~k»+÷²hÕƒ%?øàƒ¼æg³Ùa•Õ0kÛ§²²2²Ùld2™FïµeË–z׬«^gjª²²²())IuM€æTVVíÚµké6 ’ßZÍÇo-€æã·°;«ªªjÑý}’PýBb¾ÿ€f2™(--M\XÞ¼ysƒû”••åuq2¢æeÉêkÖU/„3튖LÈ×믿ÞÒ-,¿µš—ß[ÍÇo-Z“ê/_µjU^óß{ï½ÄýÇ¢¢¢èÒ¥K�çºté™L&÷Â󪪪X»vmtïÞ½Ñ{­^½:1®ëeé…x&ØÙnôyî¹ç¶t 5d2™¸ûî»[º��Eõ`ÉÒÒÒ¼×(++KaÖVY=(³)ûTŸÓØ ÏB8|ÜëlYûï¿büî»ïæ5¿úó½{÷®õ~cYYYôîÝ;V¬X‘«­\¹2¯PÌê{ 0 Öç ñL°³Ý*è3›ÍÆÜ¹s[º�„l6™L¦¥ÛøØlݺ51.))É{�¶mÛ&Æ•••5žÙ¶mÛDzODaž š›{�-¯z°äÒ¥Kóš¿lÙ²z×ÛÙþûïŸÅ\¶lYzè¡©ïUˆg€�íVAŸÿ¸€¹»hMA?Rý�æUUUy¯Q=ð²¶·¤W´l®}j«™vÅÅÅ»Ýÿé³G[ÙÒ PÀ eee-Ý´ ¿µh>~k€ßZ4/¿·hÝüÖ¢yù­ì®>üðÃX²dIK·‘:÷:[Ö Aƒ¢¤¤$w'qÅŠ±fÍšèÑ£G£æÏŸ??1[ˆg€�ívi­ñæî¤}ûö‰ñÖ­[ó^£²²²Þ5#":tè°ËûTŸSÛ>µÕ áL»¢¬¬,JJJR_ 9”••E»víZº €‚ä·@óò{  ùø­쮚òrè=�{�-«cÇŽ1tèÐxþùçsµY³fÅi§�ÖàÜl6³fÍJÔŽ?þø:Ÿ?î¸ãbÚ´i‰}²Ùl£¾ùË_ãáÇ׸Wù‘B<쬨¥`÷R=Xòƒ>Èk~6›­VYÛ¥ÆêûTVVF6›Ík¯-[¶Ô»f]õB8Ð:œp ‰ñï~÷»FÍ{á…bùòå¹q÷îÝã°Ã«óù!C†D—.]rãwÞy'fϞݨ½ª÷T½çê ñLð‘Ý.è3›ÍîVZ›nݺ%Æ«V­Êkþ{ï½~øan\TT”¸ ù‘.]º$Þ†^UUk×®Ík¯Õ«W'ÆÕ{¯«^g€�CKßãlí÷:#"N=õÔÄ‹ÃçÎ�Ï?ÿ|½s²ÙlÜrË-‰Ú¨Q£¢¨¨î«ÃEEEqúé§'j·ÜrKƒÿÝŸþù˜7o^nÜ¡C‡øÂ¾PïœB<|¤¸¥ØY&“‰W_}µ¥ÛhÕößÿÄøÝwßÍk~õç{÷¥5ž+++‹Þ½{ÇŠ+rµ•+WF÷îÝ›¼×€j}®ÏÍͽÎÝC·nÝâì³ÏŽiÓ¦åjÿñÿ÷Ýw_ôìÙ³Ö9·ÞzkÌ�;77îÔ©SŒ;¶Á½Æ�÷ßlÙ²%""æÌ™Ó¦M‹ñãÇ×úüêÕ«ãŠ+®HÔÎ=÷ÜèÚµk«;|¤îWXÓ*U–\ºti^ó—-[Vïz;«ÀY}nZ{♀ÝË/¾³fͪñgñâʼnç¶nÝZës³fÍjðnãùçŸ{ï½wn¼|ùò=zt<ùä“‘ÍfsõU«VÅ•W^“'ONÌ¿ð £sçÎ ž¥k×®qá…&j×_}\uÕU±zõê\mÇŽñÄOÄ™gž™xAz�=â¼óÎkpŸB=DD·tì^ %%%QUU+V¬ˆ5kÖD�=5þüù‰ñàÁƒë|vðàÁñÜsÏåÆ ,ˆÓO?½Qû¬Y³&q‰²¤¤$Xë³…x&`÷p饗&îÿÕå½÷Þ‹1cÆÔúÙé§Ÿ×]w]�s;wî“'OޱcÇÆÖ­[#â÷!/ºè¢(//�¾}ûÆÆ�ãÝwß�íÛ·'æžxâ‰1vìØFŸgܸq±`Á‚xúé§sµ_ÿú×ñÀDïÞ½£S§N±|ùòظqcb^YYYÜpà Q^^Þ¨} ñLQÔÒ °{騱c :4Q›5kV£æf³ÙÏüñu>ÜqÇÕØgç7°×ç/ùKb<|øðèСC­Ï♀Öeذaqë­·FçÎ�õ�7Æ+¯¼Ë—/¯ˆùÅ/~1n¸á†Èd2�Þ§¨¨(¦L™§žzj¢¾}ûöxç�wâ•W^©ˆÙ¹sç˜:ujqÄ­þL è“N8á„Äøw¿û]£æ½ð ±|ùòܸ{÷îqØa‡Õùü�!C¢K—.¹ñ;ï¼³gÏnÔ^Õ{ªÞsu…x& u9rd̘1#F�íÚµ«ó¹ƒ:(nºé¦¸þúë£mÛ¶yïSZZ?ûÙÏâÆoŒÁƒ×ù\ûöí㬳ΊGy$†ž÷>…y&Z·â–n€ÝÏ©§ž“'OŽ-[¶DDÄܹsãùçŸ�‘#GÖ9'›ÍÆ-·Ü’¨�5*ŠŠêÎ’-**ŠÓO?=î¸ãŽ\í–[n‰áÇ×û–õçŸ>æÍ›—wèÐ!¾ð…/´º3-ï©§žúX÷ëÞ½{\uÕUqùå—Ç‚ bÙ²e±qãÆ())‰ž={Æa‡ûî»o*{�|òÉqòÉ'Ç[o½ .ŒÕ«WGUUU”——ÇÀ�cÈ�!QZZºËûâ™h½}RC·nÝâì³ÏŽiÓ¦åjÿñÿ÷Ýw_ôìÙ³Ö9·ÞzkÌ�;77îÔ©SŒ;¶Á½Æ�÷ß.€sΜ91mÚ´?~|­Ï¯^½:®¸âŠDíÜsÏ�®]»¶º3­WYYYŒ9²Þ—ž§eß}÷M-h³>…x&ZŸ¢–n€ü½øâ‹1kÖ¬/^œxnëÖ­µ>7kÖ¬Xºti½{œþù±÷Þ{çÆË—/�Ñ£GÇ“O>Ùl6W_µjU\yå•1yòäÄü /¼0:wîÜàYºví^xa¢výõ×ÇUW]«W¯ÎÕvìØO<ñDœyæ™±bÅŠ\½G�qÞyç5¸O¡ž Ø}·täïÒK/MCÖå½÷Þ‹1cÆÔúÙé§Ÿ×]w]�s;wî“'OޱcÇÆÖ­[#"bÅŠqÑEEyyyôíÛ76nÜï¾ûnlß¾=1÷ÄOŒ±cÇ6ú<ãÆ�‹ ÄÓO?�«ýú׿Žx z÷î�:uŠåË—ÇÆ�óÊÊÊâ†nˆòòòFíSˆgvE-Ý»¯aÆŭ·Þ�;wNÔ7nܯ¼òJ,_¾¼F æ¿øÅ¸á†"“É4zŸ¢¢¢˜2eJœzꩉúöíÛã�wÞ‰W^y¥F fçÎ�cêÔ©qÄG´ú3»AŸÔkäÈ‘1cÆŒ=zt´k×®Îç:蠸馛âúë¯�¶mÛæ½Oiiiüìg?‹o¼1\çsíÛ·�³Î:+yä‘>|xÞûD晀–WÜÒ �¿§žzêcݯ{÷îqÕUWÅå—_ ,ˆeË–ÅÆ�£¤¤$zöì‡vXì»ï¾©ìuòÉ'ÇÉ'Ÿo½õV,\¸0V¯^UUUQ^^Œ!C†Diié.ïSˆgZ– O­¬¬,FŽ#GŽlö½öÝwßÔ‚6ëSˆgZFQK7…`·úÌf³-Ýá^'À®(nÉÍÏ9çœø§ú§–l€p¯ -ôÙ±cÇèØ±cK¶@¸× �†¢–n � OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OH� OàÿcïN£³¬ÎþaŸ s€$(ˆ * 8jA-ç©¢@µõqB­Z‡GÿÅb[ÐjÕªˆ¨•*u€ZìSÁ‘âÔ*ˆŠ¢¢ˆÈ$� LIHÞ]æõÎÄ��Êq¬å‡}Þ{_ç¾ ]Þ&×õÛ@-ô µ@Ð'ÔAŸP }@-ô µ@Ð'ÔAŸP }@-ô µ@Ð'ÔAŸP }@-ô µ@Ð'ÔAŸP }@-ô µ@Ð'ÔAŸP }@-ô µ@Ð'ÔAŸP }@-ô µ@Ð'ÔAŸP }@-ô µ@Ð'ÔAŸP }@-ô µ@Ð'ÔAŸP }@-ô µ@Ð'ÔAŸP }@-ô µ m{oØ1mÚ´)fÏžŸ}öY¬]»6ÒÓÓ£uëÖÑ­[·h×®]­öúâ‹/â½÷Þ‹eË–Eaaa4kÖ,öÞ{ï8ä�C¢AƒµÖg[Þ;AŸ°»ï¾ûbÔ¨Q5^úé§Çm·ÝV­5«W¯ŽQ£FÅäÉ“cýúõÎ9à€âÒK/�cŽ9¦Æ{‹ˆxùå—côèÑñÁTøyãÆ�£ÿþqÙe—EVVV�ûlË{`畺½7ì8f̘'�tRüõ¯­43"âƒ>ˆË.»,†ÕîSPP×^{m\vÙe•†|FD¬_¿>&L˜'Ÿ|r¼ýöÛÕî±íî Ò¶÷ ¬M›6ÅìÙ³ã³Ï>‹µk×Fzzz´nÝ:ºuëíÚµ«Õ^_|ñE¼÷Þ{±lÙ²(,,ŒfÍšÅÞ{ï‡rH4hРÖúlË{¨©œœœ¸è¢‹bãÆ� õfÍšEÛ¶m#???–-[›7o.ýì™gž‰õë×ÇÈ‘##%%%©>ÅÅÅqÕUWÅ´iÓêõêÕ‹ÝvÛ-222bñâÅñõ×_—~¶zõê2dH<òÈ#qðÁïp÷‚>©Ä}÷Ý£F�ªñúÓO?=n»í¶j­Y½zuŒ5*&Ož\éIép@\zé¥qÌ1ÇÔxo/¿ürŒ=ºÒÓß7nýû÷�Ë.»,²²²jÜg[Þ°s:thtîÜ9éù»îºkRóòóóãꫯNÄÜ}÷ÝcذaqôÑG—^.[¶,F�O=õTé¼_|1Æ�ç�w^R½zè¡r!ŸƒŽK/½4Zµjÿ �6mZÜzë­ñå—_FDĆ ⪫®ŠgŸ}6222v¨{€AŸì f̘W^ye¬Y³¦Êy|ðA\vÙeqÚi§Åðáã~ýúÕêSPPÆ ‹þóŸUÎ[¿~}L˜0!¦N�#GŽŒ=zT«OĶ»'`çrÀDÏž=kýº?üp¬X±¢tܶmÛxüñÇKƒ7¿Õºuë¸ù曣M›6q÷Ýw—Öï¿ÿþèß¿4oÞ¼Ê>kÖ¬‰1cÆ$Ô®¹æš¸è¢‹j©©©qì±ÇF×®]ãÌ3ÏŒ%K–DÄC9y䑸âŠ+v˜{€o¥nï @NNN\tÑEå1›5kûï¿ì¾ûîQ¯^½„Ïžy晸æšk¢¤¤$é>ÅÅÅqÕUW• ù¬W¯^´mÛ6öÛo¿r'»¯^½:† ¹¹¹;ä=Ô†Õ«WÇc�=–P1bD¹@Ìïºøâ‹Sÿúë¯ãÏþó{=ôÐC±nݺÒq�=bÈ�!•ÎoÕªUÜrË- µñãÇoñ0ömyOð­´í½¾†�;wNzþ®»îšÔ¼üüü¸úê«cãÆ�¥µÝwß=† G}t¤¤¤DÄO^=zt<õÔS¥ó^|ñÅ?~|œwÞyIõz衇bÚ´i µÁƒÇ¥—^ZúÀfqqqL›6-n½õÖøòË/#"bÆ qÕUWųÏ>[.t{ß@m˜2eJ¬_¿¾tÜ£G�èÕ«W•kRRRâ²Ë.‹sÏ=·´öôÓOÇUW]Uú¼dYÅÅÅñ÷¿ÿ=¡vùå—W:ÿ[½zõŠîÝ»GNNNDD¬[·.ž{î¹8묳¶û=Àw ú$)p@ôìÙ³Ö¯ûðÃÇŠ+JÇmÛ¶�ǼÜIé­[·Ž›o¾9Ú´iwß}wiýþûï�þýûGóæÍ«ì³fÍš3fLBíšk®‰‹.º(¡–ššÇ{ltíÚ5Î<óÌX²dIDü7”ó‘G‰+®¸b‡¹'€ÚRö0õ�&µî°Ã‹¶mÛÆâÅ‹#"båÊ•ñÎ;ïÄÁ\áüÙ³gÇêÕ«KÇíÚµKúÕ�–}~»çª‚>·Õ=Àw¥nï °óZ½zu<öØc µ#F” Äü®‹/¾8zôèQ:þúë¯ãÏþó{=ôÐC±nݺÒq�=bÈ�!•ÎoÕªUÜrË- µñãÇÇš5kªì³-ï  6¬[·.!@3"âðÃOjmJJJôîÝ;¡öÊ+¯T:ÿÕW_M÷îÝ;RRR’êU¶ÏŒ3býúõÎÝ–÷ß%è“ífÊ”) WöèÑ#zõêUåš”””¸ì²ËjO?ýt”””Tº¦¸¸8þþ÷¿'Ô.¿üò->Ú«W¯èÞ½{éxݺuñÜsÏU¹f[Ý@mùôÓO£°°°tܶmÛØe—]’^È!‡$Œ?üðÃJç–ý¬ìÚª´jÕ*vß}÷Òqaaa|úé§ÎÝ–÷ß%è“ífÚ´i ã�&µî°Ã‹¶mÛ–ŽW®\ï¼óN¥ógÏž«W¯.·k×.zöì™T¯²{*»ç²¶Õ=;·‚‚‚˜?~äääÄ»ï¾ .Œ 6ÔèZóçÏOwìØ±Zë;tèPåõ¾ë³Ï>«rí–”Ý[ÙëU¶‡º¼'ø®´í½vNëÖ­‹œœœ„ÚᇞÔÚ”””èÝ»wLœ8±´öÊ+¯ÄÁ\áüW_}5aÜ»wïHIIIªWïÞ½Æ3f̈õë×GãÆ�ËÍÝ–÷ì¼n¾ùæX´hQlÚ´)¡ž––p@ôéÓ'Î:ë¬ÈÊÊJêz ,H·nݺZûÙm·ÝÆ_~ùelÚ´)4h�P߸qc|ùå—U®Ý’²{+»÷ÊêuuOPVêöÞ;§O?ý4 KÇmÛ¶�]vÙ%éõ‡rHÂøÃ?¬tnÙÏÊ®­J«V­b÷Ýw/ƧŸ~ZáÜmyOÀÎëÓO?-òQTTï¾ûnÜwß}Ñ·o߸÷Þ{cóæÍ[¼ÞªU«ÆÕ ÅlÙ²e¤¥¥•Ž‹‹‹#//¯Ü¼5kÖDIIIé8===²³³«Õ«U«V ã²{¯¬^W÷e¥my üWAAA,Z´(Ö¬YéééÑ¢E‹Øu×]£Q£FÕ¾ÖüùóÆ;v¬Öú:Ty½ïúì³Ïª\»%;vŒ%K–$\¯k×®åæmË{¨ÊÆ�côèÑ‘““cÆŒ‰&MšT:wýúõ ãê>š’’ 4ˆ¢¢¢ÒÚºuë¶Ø§aÆ‘’’R­^�7®òš•Õëêž¶ÆÆ�®°£Û¸qãöÞÀ–ïZuÇw-€ºã»°#ÛÞÏf ú$)7ß|s,Z´¨ÜéïiiiqÀDŸ>}⬳Ί¬¬¬¤®·`Á‚„quOIßm·ÝÆ_~ùelÚ´)4h�P߸qc|ùå—U®Ý’²{+»÷ÊêuuOÀÎ'%%%:è 8òÈ#£k׮ѡC‡hÞ¼y¤¦¦Æš5kbîܹ1}úôxæ™gž÷œ9sfüïÿþoŒ=:êÕ«WáµË†bÖäÙņ &aVÀY6(³&}Ê®I6è³®îikÌ›7¯V¯P×>ûì³í½€,ßµêŽïZuÇw-€Ê ú$)Ÿ~úi…õ¢¢¢x÷ÝwãÝwß�|0Î?ÿü¸üòË+}ô[«V­JW7³eË–‘––Vš”[\\yyyѪU«„ykÖ¬‰’’’ÒqzzzdggW«WÙk–Ý{eõºº§­åôwàûÄ© uÇw-€ºåû@Ýñ] ØQy.‹ºtøá‡Ç)§œ{íµW…Ÿ·jÕ*Zµj}ûö�K/½4®¾úê˜={vé篼òJ<þøãñ‹_ü¢Âõe‚OOO¯öëׯŸ0®èßÙÛ¤OĶ»'(KÐ'µfãÆ�1zôèÈÉɉ1cÆD“&M*�[öDóF�U«WJJJ4hÐ áÁè²§¼WÔ§aÆ‘’’R­^�7®òš•Õëêž¶–Óß�ï§6Ôßµê–ï[uÇw-vF‡rHÒs[·nãÇ��ÿùŸÿ‰ÜÜÜÒú<¬ðùÆ $Œ «½Ç²!že¯Q>8³®úTT¯Ë^ð]‚>©TJJJtÐAqä‘GF×®]£C‡ѼyóHMM�5kÖÄܹscúôéñÌ3Ï$œz>sæÌøßÿýß=ztÔ«W¯Âk— ŬɃ� 6L¬(€³lPfMú”]“lÐg]Ý@U4h·ß~{œtÒI¥�¯Zµ*þýïÇ1ÇSn~ÙCÑ¿û\h²6nÜXå5#¢Ü!ò5éSvME}*ª×Õ=m�}öÙ'ÒÒ<ÎMmúr{o€¸½÷Þ;6l¸½·Û‰ïZÔ-ߵعù®EÝò] |ß¢îø®ìÈŠŠŠbÞ¼yÛ­¿'èÐᇧœrJìµ×^~ÞªU«hÕªUôíÛ7.½ôÒ¸úê«cöìÙ¥Ÿ¿òÊ+ñøã�Ç/~ñ‹ ×—}X2==½Ú{,{ª{Ù‡)#ÊŸ¤^W}"¶Ý=lIûöíã¨£ŽŠ_|±´öÆo$ô¹aÆjõ*)))÷eÙPÏŠúlܸ1JJJ"%%%é^eQO6è³®îik4lذFÏ›l/ 6ŒF�mïmü ù®Pw|ר;¾k;²ÂÂÂíÚ_Ð':ä�C’žÛºuë?~|üÏÿüOäææ–Öxà�8p`…ÿnРA¸&ÿG(âYöšåƒ3ëªOEõºìµ5œþNísjuÇ© à»uÇw-ð]‹ºåû;7ßµ¨[¾k;ªí}ò;Tä°ÃKú\°`A…ó²³³ÆË–-«VŸ¯¾ú*ŠŠŠJÇ©©©‘™™Yn^fff¤¤¤DIIIDü÷YËU«VEË–-“îµ|ùò„qÙ½WV¯«{€²¤ýQ+4h·ß~{œtÒI¥5®Zµ*þýï'uò{ÙÏ“±qãÆ*¯Qþäôšô)»&Ù“ßëêž¶–Óß�ï§6Ôßµê–ï[uÇw-`Gµ½O~‡Šì¶Ûn ãÕ«WW8o¯½öJ/]º´Z}ÊÎoÓ¦M…‡�7lØ0Ú´iK–,)­}ùå—Õ ú,Ûkï½÷®pÞ¶º'(+u{o€ŽöíÛÇQG•P{ã�7*œ[6ÀrÆ ÕêURRR.H³l¨gE}6nÜXz |²Ö¯__å5+«×Õ=$#---aüíaîe• ËüôÓO«ÕgþüùU^ï»Êp–][[½¶å=Àw ú¤VvØa ã T8/;;;a¼lÙ²jõùꫯ6MMM�ÌÌÌró233#%%¥t\XX«V­ªV¯åË—'ŒËî½²z]Ý@2¾úê«„qVVV…ó:vìééé¥ã%K–ÄŠ+’î3{öì„ñ~ûíWéܲŸåææ&ÝgÅŠ±dÉ’ÒqzzztèС¹Ûòžà»}R«vÛm·„ñêÕ«+œWö4ö¥K—V«OÙùmÚ´‰ ”›×°aÃhÓ¦MBíË/¿Üª^•�Ⱦ­î ³fÍJ·nݺÂyM›6�îÝ»'ÔþóŸÿ$Õ£¤¤¤Üܾ}ûV:ÿÈ#�,×§¤¤$©^ÿþ÷¿Æ={öŒ&MšT8w[Þ|— OjUZZZ¸¨¨¨ÂyeÃ2?ýôÓjõ™?~•×û®²œe×ÖV¯myOUY»vm¼øâ‹ µ^½zU:ÿ¨£ŽJÿíoKªÏ[o½‹/.·lÙ2ºuëVéüC9$233KÇ‹-Š3f$Õ«ìžÊmuOð]‚>©U_}õUÂ8++«Ây;vŒôôôÒñ’%KbÅŠI÷™={vÂx¿ýö«tnÙÏrss“î³bÅŠX²dIé8===:tèPáÜmyOU¹ýöÛcíÚµ¥ãôôôèÓ§O¥óO>ùähܸqéøí·ßŽ7ß|³Ê%%%qÿý÷'Ôú÷ï©©•?¢œšš§Ÿ~zBíþûï�’’’*{½ù曑““S:nÒ¤Iœxâ‰U®ÙV÷ßå‰3jÕ¬Y³Æ­[·®p^Ó¦M£{÷î µÿüç?Iõ()))7·oß¾•Î?òÈ#ËõÙÒàßú÷¿ÿ�0îÙ³g4iҤ¹Ûòž€�øqãâý÷ßOz~QQQÜvÛmñ·¿ý-¡>xðàØu×]+]—��gŸ}vBí·¿ým,_¾¼Ò5cÇŽ�·ß~»tœ‘‘\pÁ÷8dÈ�„Ι3gƃ>XéüåË—Çõ×_ŸP;çœs*=�þ[Ûòžà[‚>©5k×®�_|1¡Ö«W¯JçuÔQ ã²”Væ­·ÞŠÅ‹—Ž[¶lݺu«tþ!‡™™™¥ãE‹ÅŒ3’êUvOe÷\Ö¶º'`çðúë¯Ç€bðàÁñ—¿ü%æÍ›EEEåæ}ýõ×ñì³ÏÆÀ�ã‘GIøl�=öˆË.»l‹½.¼ðÂØe—]JÇ‹/Ž3Ï<3¦M›–pÈú²eËâ÷¿ÿ}Ü}÷Ý ë/¹ä’hÑ¢ÅûdeeÅ%—\’P»ë®»âÆoLá,..Ž—_~9K–,)­ïºë®qþùço±Ï¶¼'øVÚöÞ?·ß~{¬]»¶tœžž}úô©tþÉ'Ÿwß}w¬_¿>""Þ~ûíxóÍ7« -))‰ûï¿?¡Ö¿ÿHM­<³6555N?ýôøóŸÿ\Z»ÿþû£gÏž‘’’Réº7ß|3rrrJÇMš4‰O<±ÒùÛòž€�KnnnäææFDDýúõ£uëÖ‘‘‘©©©‘——K–,‰ââârëvÙe—xðÁM¯L‹-âî»ïŽ .¸ 6mÚK–,‰K/½4š5kmÛ¶�µk×ÆÒ¥KcóæÍ k�>úè¸à‚ ’¾Ÿ!C†DnnnLŸ>½´öÄOÄĉ£M›6‘‘‘‹/Nx65"¢aÆqÏ=÷D³fÍ’ê³-ï ""$ Rθqãâý÷ßOz~QQQÜvÛmñ·¿ý-¡>xðàØu×]+]—��gŸ}vBí·¿ýmÂIìe�;6Þ~ûíÒqFFFRP2$7n\:ž9sf<øàƒ•Î_¾|y\ýõ µsÎ9'²²²ªì³-ï Ø9Ä_||ðAÌ™3'-ZTaÈçO~ò“øÇ?þ{î¹gÒ×îÑ£GŒ;6Z´h‘P_»vmÌ�;7/^\.ó”SN‰{î¹§ÊØËJMM�{ï½7N>ùä„úæÍ›cÑ¢E1wîÜr!Ÿ-Z´ˆqãÆÅ�~ô£¤ûlË{€AŸTàõ×_�ÄàÁƒã/ùKÌ›7/ŠŠŠÊÍûúë¯ãÙgŸ��Æ#�<’ðÙ{ì—]vÙ{]xá…±Ë.»”Ž/^gžyfL›6-JJJJëË–-‹ßÿþ÷q÷Ýw'¬¿ä’KÊ=tY‘¬¬¬¸ä’KjwÝuWÜxã� !œÅÅÅñòË/ÇàÁƒcÉ’%¥õ]wÝ5Î?ÿü-öÙ–÷üð]rÉ%1xðàèÔ©SÔ«Wo‹ó7n'œpBL˜0!Æ�ÙÙÙÕîÙ«W¯˜2eJœyæ™Ñ¨Q£Jçí¿ÿþqß}÷Å]wÝõëׯvŸ ÄŸþô§9rdì·ß~•ÎkܸqœuÖY1uêÔèÙ³gµûDl»{€´í½v\¹¹¹‘››õë×�Ö­[GFFF¤¦¦F^^^,Y²¤ÂÓßwÙe—xðÁ#33s‹=Z´hwß}w\pÁ±iÓ¦ˆˆX²dI\zé¥Ñ¬Y³hÛ¶m¬]»6–.]Zî¤ô£�>:.¸à‚¤ïgÈ�!‘››Ó§O/­=ñÄ1qâÄhÓ¦MdddÄâÅ‹Ë�þÞ°aøçž{¢Y³fIõÙ–÷ü°~øáqøá‡GDĆ âÓO?�%K–ÄÊ•+cýúõQ\\Íš5‹fÍšEÇŽcŸ}öI*tKZ¶l7Þxc\wÝu‘››óçÏ�µk×Fzzz´jÕ*ºuëíÛ·ßê>Ç|üñ±páÂx÷ÝwcùòåQXXÍš5‹:Ä!‡ 4Øê>ÛòžØy ú$)ñÅ_lqÞO~ò“øÃþP­Óß{ôècÇŽ�«®º*òòòJëk×®�¹sçV¸æ”SN‰?üá‘’’’tŸÔÔÔ¸÷Þ{ã7¿ùML™2¥´¾yóæX´hQ…kZ´h#GŽŒýèGI÷‰Øv÷ì<5j]ºt‰.]ºl³ž 6Œ^½zE¯^½ê¼Wûöí·IÐæ¶¼'v>©Û{ìx.¹ä’ÛCÚöÞ;žÃ?<?üðˆˆØ°aC|úé§±dÉ’X¹re¬_¿>Š‹‹£Y³fѬY³èرcì³Ï>I‚nIË–-ãÆoŒë®».rsscþüù±víÚHOO�V­ZE·nÝjí”öã�?>Ž?þøX¸pa¼ûî»±|ùò(,,ŒfÍšE‡â�C‰ luŸmyOÀö%è“*5jÔ(ºté]ºtÙf=6l½zõŠ^½zÕy¯öíÛo“ ÍmyOÀö‘º½7?‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z èj� O¨‚> ú€Z�¶½7ÀöµlÙ²˜7o^,]º4òóó#"¢yóæ‘��]ºt‰V­ZÕzÏâââ˜;wn,X° V¯^ëׯ�&MšDûöí£k×®‘™™Yë=#">ù䓸ä“ObÕªUñÍ7ßD£F�¢mÛ¶urŸ+W®Œ/¾ø"–.]«W¯Ž 6DDDFFF´hÑ":wî{íµW¤¤¤ÔjßšÊÏÏ�O>ù$.\k×®�M›6EFFFdffƾûî{ï½÷³WØQ úØÉäççÇÓO?³fÍŠ3fĪU«ªœß®]»8p`œqÆ‘••µU½—.]cÆŒ‰^x!Ö¬YSáœÔÔÔèÙ³g\xá…qÄGlU¿ˆˆ5kÖÄC=ÿüç?cùòå•ÎëÖ­[œ{î¹qÒI'Õ¨Ï믿³gÏŽÜÜÜøè£�*½¿ïÊÈȈO<1 x`�úÖÔ† âõ×_�ÿûßñÖ[oÅçŸ^åü-Zĉ'ž¿øÅ/¢C‡Ûf“ð=#è`'Ñ oQŒñçøð㤤$éu‹-Š»ï¾;Æ�Æ ‹�Ö¨ÿƒ>#GŽŒ‚‚‚*çÇ›o¾o¾ùfœ|òÉ1|øðhÒ¤I�z>óÌ31|øðøæ›o¶8÷Ýwß�«¯¾:žzê©øÓŸþÙÙÙÕêuñÅÇæÍ›«µæë¯¿Ž‰'ƤI“bÀ€1tèÐhÖ¬Yµ®Q]yyyqÓM7Å+¯¼ëׯ¯Öº'žx"ž|òÉøŸÿùŸ¸æšk¢~ýúu¸Søþô °“h˜·(æÎ�[ãõëÖ­‹ë¯¿>æÌ™7ÝtSÒ늋‹cذa1yòäj÷œ2eJ,Z´(yä‘hÚ´iµÖÞ{ï½1zôèj÷|ë­·bðàÁ1a„hÕªUµ××DIIIüío‹9sæÄøñã#++«Îz­Zµ*¦N�Zãõ%%%1~üø˜5kVŒ?¾Ú/µeÙ²e1oÞ¼XºtiäççGDDóæÍ#;;;ºtéR'?Û)..޹sçÆ‚ bõêÕ±~ýúhÒ¤I´oß>ºví™™™µÞ€ïAŸ;±öíÛGïÞ½ãÐC�:Dvvv4hÐ V®\¹¹¹1qâÄxç�wÖ<ùä“‘��W\qER=î¿ÿþr!ŸõêÕ‹þýûÇI'�:tˆF�ÅÊ•+ã­·ÞŠG}4>ÿüóÒ¹ï½÷^\{íµñÀDJJJR=ÿþ÷¿Wòy 'Äi§�ûî»o4kÖ,V­Z999ñøã�Çûï¿_:ï‹/¾ˆ_þò—ñä“OFýúõ“êù­F�E×®]£G�Ñ©S§ØsÏ=#+++š4i›6mŠÕ«WÇ|/¼ðBLŸ>=Š‹‹K×~üñÇq饗ÆO<‘ô½Ö†-ZÄG‡zhpÀѲeËhÚ´i¬]»6>øàƒ˜2eJ¼ð {�3gNüò—¿Œ¿üå/‘ššºÍö ì¼òóócÖ¬Yñ—¿ü%rrrbÕªUUÎo×®] 80Î8㌭>XeéÒ¥1f̘xá…bÍš5ÎIMM�ž={Æ…^GqÄVõÛ’’’’8çœsbæÌ™å>{ôÑG£gÏžI_ëïÿ{üæ7¿Ùê=ýîw¿‹Ÿÿüç[}�-¹ï¾ûbÔ¨Q[}�1cÆDß¾}kaG°óÙ™^(((ˆwÞy'>ûì³ÈÏÏ�”””ÈÌÌŒN�:E—.]¢^½zµÖkåÊ•ñÅ_ÄÒ¥KcõêÕ±aƈˆÈÈȈ-ZDçÎ�c¯½öÚ¦Ïl‰1 b‚>v2õêÕ‹N8!‡zh…s222bï½÷ŽÄSO=Ç�ÂÂÂÒÏÇŽ'žxbtêÔ©Ê^¹¹¹å7³²²bܸqÑ¥K—„z³fÍ¢C‡ñ³Ÿý,n¼ñÆxúé§K?›>}z<ûì³ñÓŸþt‹÷·hÑ¢¸é¦›j�5Š{ï½7~ò“Ÿ$Ô›6míÛ·�ÓO?=î»ï¾„½~ðÁñç?ÿ9.¹ä’-öŒˆ0`@uÔQqøá‡WÚ¤I“ÈÊÊŠŽ;F¿~ýâÝwß�Ë/¿#GŽŒ‚‚‚*çÇ›o¾o¾ùfœ|òÉ1|øðhÒ¤I�znɤI“* ù¨ ;ãÁ ‹/Ž1cÆÄ”)SbýúõÎiÞ¼yôïß?.ºè¢Ýç믿³gÏŽÜÜÜøè£�*½¿ïÊÈȈO<1 x`µ{Ö–í@ ØÑúØI”¤¤FïÞ½càÀ�qÔQGE£F�’Z7hРHKK‹aÆ•ÖŠŠŠâþûï�{ʵ£F�ŠâââÒqZZZŒ;¶\ÈçwÕ¯_?n¹å–X½zuLŸ>½´>räÈ8á„"==½Êž>ø`lܸ1¡vÇw” ùü®ÔÔÔ¸òÊ+#///üñÒúC=ƒŽ-ZTÙ3"bøðá[œSV·nÝ⡇Š$©ÖuÐçÁW_}uôìÙ3é5‡rH<üðÃ1xðà„—˜F�gœqF¤¦¦ÖÅVà{oÙ²e1oÞ¼XºtiäççGÄ_üÍÎÎŽ.]ºD«V­j½gqqqÌ�;7,X«W¯Žõë×G“&M¢}ûöѵk×ÈÌ̬õžñÎ;ïÄgŸ}ùùù‘’’™™™Ñ©S§èÒ¥KÔ«W¯Öz­\¹2¾øâ‹Xºti¬^½:6lØÿ}Á¹E‹ѹsçØk¯½"%%¥ÖzÛOüEÑxÕüH>â3Ѻuëâúë¯�9sæ”; ¦*ÅÅÅ1lذ˜—P‘‹/¾86oÞ\­5_ýuLœ81&Mš ˆ¡C‡F³fͪu�­µ#ˆ;AŸ;‰µ{—ŸÕ¶Fk Ï<óLÌœ9³´öÚk¯EAAAÔ¯_¿Â5 ,ˆ7Þx#¡6xðàèÚµëû¥¤¤ÄM7Ýo¼ñFiæ_|Ï<óLüìg?«tÝ7ß|S.x¡oß¾qì±Çn±gDÄÿûÿ/ž{î¹X³fMDü÷™Gy$®¾úê¤Ö׾ûî§œrJ¾ß{ï½ÈÏÏ�æÍ›×z¿=÷Ü3ž|òÉ­Ýwß}ãüóÏ�Q£F•ÖV®\ï¾ûn|ðÁµµEø^ËÏÏ�Y³fÅ_þò—ÈÉɉU«VU9¿]»v1pàÀ8ãŒ3"++k«z/]º4ÆŒ/¼ðBé÷™²RSS£gÏžqá…ÆG±Uý¾µxñâ3fLL™2%!ü»š7oýû÷�‹.º¨F÷ùúë¯ÇìÙ³#777>úè£Jïï»222âÄOŒAƒÅ�XížµeãÆ�1wîܘ3gNé? .Lx)þÐC�Ç{l»í¾�Ú·o½{÷ŽC=4:tèÙÙÙÑ AƒX¹reäææÆÄ‰ã�wÞIXóä“OFvvv\qÅIõ¸ÿþûËý¬©^½zÑ¿ÿ8餓¢C‡ѨQ£X¹re¼õÖ[ñè£�ÆçŸ^:÷½÷Þ‹k¯½6xà�Z 1bD¬]»¶Ö®WÖn»í§œrJµ×pÀu°›-ÛgŸ}ª¦±Ç{ÔÁnà‡eg×­[üqtéÒ¥ÂùÿùÏÊÕÎ:묤ûµjÕ*Ž>úèxþùçKkS§N­2è3''' jgžyfÒ=7nýû÷�‡~¸´öÜsÏÕiÐgDÄa‡VîE˜eË–ÕIÐg½zõ¶jýi§�–ô1{ölAŸìôä-Š–sŸ�KŸý,!ÀqK-Zwß}wŒ7.† ¬Qÿ|0FŽYî»PYÅÅÅñæ›oÆ›o¾'Ÿ|r ><š4iR£ž“&MŠ#FÄÆ�«œ—ŸŸ�<òHLž<9þøÇ?V;ˆéâ‹/ŽÍ›7WkÍ×_'NŒI“&Å€bèСѬY³j]£¦^zé¥xíµ×bΜ9ñÉ'ŸDQQÑ6é ?tõêÕ‹^½zŹçž?þñ�+œ“‘‘{ï½w 0 žzê©>|xéA2cÇŽ�O<1:uêTe¯ÜÜÜ=ztB-+++Æ�WîçaÍš5‹:ÄÏ~ö³¸ñÆãé§Ÿ.ýlúôéñì³ÏÆOúÓêÞn…^~ùåxá…JÇGqD¹Ãv¶V»víâÚk¯­ÕkÖ¥8à{µ_ø¾û!¼0}úô¸óÎ;jéééqÚi§Åé§Ÿ{î¹gÆgŸ}O>ùd¼øâ‹¥¿(..Ž¡C‡Fûöí«}B£F�¢k׮ѣG�èÔ©Sì¹çž‘••Mš4‰M›6ÅêÕ«ãƒ>ˆ^x!¦OŸÅÅÅ¥k?þøã¸ôÒKã‰'ž¨ÕC&*²£ˆ;"AŸ$¥sçÎåj+W®¬t~NNNÂx×]w�:T«g¯^½‚>gΜùùù•`–í™––={ö¬vÏï}.\¸0æÍ›ûì³Oµ®S-[¶,W[¿~}�õÛíÚµ‹&MšÄºuëJkUýïv óEãUó#ùˆÏDëÖ­‹ë¯¿>æÌ™7ÝtSÒ늋‹cذaå^¬MÆ”)SbÑ¢EñÈ#�DÓ¦M«½þ¡‡Š;Zkòòòâ’K.‰»îº+N:é¤j÷¬‰’’’øÛßþsæÌ‰ñãÇGVVV�÷|ôÑGBò€­S’’_ï~p â÷¿ÿ}Â>ª2`À€8ꨣâðÃ�úõëW8§I“&‘••;vŒ~ýúŻラ_~y¬X±¢tNnnnLš4)Î8㌤úÖÄŽz ì¨R·÷ø~hذa¹Ú† *�¿|ùò„qM‚2Ë®)**ª2¸ l϶mÛV¸ïêôŒˆxå•Wªu�êZ»vm¹Zvvv�öÜeÿLwÔPRØÞÚ·ogžyfÜ}÷Ýñÿ÷ñïÿ;rrrâ¹çž‹[o½5:è rkž|òÉ9rdÒ=î¿ÿþr!ŸõêÕ‹ŸýìgñÈ#�Äk¯½o¿ývL�:5~ÿûßÇž{î™0÷½÷Þ‹k¯½6áÅådLŸ>=î¼ó΄Zzzzüìg?‹Ç<þóŸÿÄ«¯¾�<òHüñ‘’’R:¯¸¸8†|ðAµzFD4jÔ(zöì—_~yÜ{ï½ñ�ü#^ýõ˜={v¼ùæ›1eÊ”øãÿG}t¤¦&þ*ôã�?ŽK/½´Ú÷ lk÷84–rv´nݺÚk P.�åµ×^‹‚‚‚J×,X° ÜÏ ]»vÝb¿”””¸é¦›B=¿øâ‹xæ™gª·ñ Üyç�¥?ÿú¶OZšsž€ºóíÁ wÜqG\zé¥Ñ½{÷¤Ö 4¨Ü¡Vß¼°%[sðBß¾}ê#GŽL­Êã�?^Ûn»­ÜS~×É'Ÿ×^{mBíý÷ß�—^z)©žÃ‡�¾}ûVòY‘nݺÅC=Tî0‰I“&%}�šØ^/ð}%耤|ùå—åjYYY•ÎÏËËK7kÖ¬Ú=›7o^®öÑG%ݳ¢õµÝ³6Ìž=;aœ™™íÚµ«Óž5µiÓ¦X½zuBmG%€m­^½zqÄGÄC=/¾øbÜxã�qÒI'žûî-[¶ŒŒŒŒØ{ï½cÀ€ñÔSOÅÍ7ß\îeܱcÇÆ'Ÿ|²Å^¹¹¹1zôè„ZVVV<õÔS1bĈèÝ»w´jÕ*š5k:tˆ³Ï>;þùÏÆ€ÖLŸ>=ž}öÙ¤ïqÓ¦Mqà 7$ffddÄŸÿüç1bDüèG?ŠìììhݺuôîÝ;FŽwÝuWÂ}Äïÿû¤{0 ÆŒ3gÎŒG}4~õ«_Å 'œ�;wŽ]wÝ5š4iYYYѱcÇèׯ_Œ=:ž|òÉØu×]Ëý™ÕõËÎIOO�ý÷ß? #FŒˆÎ�;oó=À÷ZÊÖ=âtÚi§%Œ×­[üq¥óÿóŸÿ”«�uÖYI÷kÕªU}ôÑ µ©S§&½¾"³fÍŠ'Ÿ|²t<`À€¤vjjg9x¡°°0Æ�—P;úè£ã˜cŽÙâÚsÎ9'ößÿ„Z2�¦[cß}÷�SN9%¡öÞ{ïE~~~�ôÛQÄ€™ O’òöÛo—«í±Ç•ÎÿnðSÄ_Þ¨ óçϯӞ­©ªçÖZ¶lY<ýôÓ µÓN;­Öþ¼jÛÛo¿]îϹªÿÀ΢$%5¾Þýà¸ãŽ;âÒK/M:tiРAqÓM7%ÔŠŠŠ’z xÔ¨QQ\\\:NKK‹±cÇF—.]*]S¿~ý¸å–[¢oß¾ õ‘#GFaaaR{~üñÇcùòå µÛn»­Ü ÛßuòÉ'ǵ×^›P{ÿý÷㥗^Jªçðáãoß¾Q¿~ý¤æGDtëÖ-zè¡rAªÛ"ès�=öˆ~ýúÅoûÛxê©§bÖ¬Y1yòä¸ùæ›ãg?ûY�Bð€š«(d{åÊ••ÎÏÉÉIïºë®Ñ¡C‡jõìÕ«WÂxæÌ™5\)((ˆßýîw¥?“ÉÊÊŠÿ÷ÿþ_�®P-;ÉÁ 3fÌ(wàå9眓TÏÔÔÔr{üðÃcáÂ…I­¯©Ã;¬\mÙ²euÒkG<vt‚>آ͛7Çÿýßÿ%Ô:tè»ï¾{¥kš7ož0®I�ÁÚµkËÕª ݬ�ž­Y°`ABˆVmY´hQ\pÁ±~ýúÒZË–-ãâ‹/®õ^µeòäÉ ã”””8âˆ#¶Ón`DZv�CcÙ!gGëÖ­«½vÀ€åB2_{íµ(((¨tÍ‚ â�7ÞH¨ <8ºvíºÅ~)))qÓM7%`~ñÅñÌ3ÏlqmaaaŒ7.¡vôÑGÇ1dzŵçœsNì¿ÿþ µdM·Æ¾ûî§œrJBí½÷Þ«qÈV²n¹å–øãÿ¿øÅ/â ƒŠ Ôi? j 6,WÛ°aC¥óˆšï³Ï>ÕîYvMQQQ¹ïoÉ;vlÂÏĆ-Z´¨Ñµ¶¥ïËÁ Ó¦MK·iÓ&zöì™tÏ“O>¹ÜÏ�Ë^³¶µlÙ²\í»ÏÔ¦í@ ø>ô ÀMš4)–.]šP;餓ª\“���0þôÓO«Ý÷“O>)W+´PUÏÅ‹ǦM›¶ºç¦M›"//¯ZשȦM›bÙ²eñꫯÆï~÷»8å”Sþ\š5k<ð@dffnu¯ºðÉ'ŸÄsÏ=—PëÑ£Gì²Ë.ÛiG°IÙº_»�vÚi ãuëÖÅÇ\éüÿüç?åjg�uVÒýZµjG}tBmêÔ©[\7cÆŒX½zuBíœsÎIªgjjj¹=~øá‡±pá¤Ö×Ôa‡V®¶lÙ²:í ìX¾üòËrµ¬¬¬Jç—ý9P³fͪݳì�4}ôQµ¯3þü;vléøÐC-÷Ý`Gõ}9xáµ×^K÷èÑ#RRR’îÙ¸qã8ðÀj¯¼òJÒëk¢¢ƒSË>3Q[v´1àû m{o€Û²eËâÎ;ïL¨5oÞ<~þóŸW¹®[·nñòË/'\çóÏ?�=÷Ü3éÞo½õV¹ÚÆ�£¸¸8RSˇiuëÖ-a\XX999qøá‡oUψÿ†mUQÖ;# Jzþ�üã¸ñÆ£mÛ¶I¯Ù–6oÞ×_}lÞ¼9¡~Ùe—m§ÀKçÎ�ËÕV®\Yéüœœœ„ñ®»î:t¨VÏ^½zÅóÏ?_:ž9sfäççWJõ­iÓ¦%ŒÛ´i={öLºçÉ'ŸÇOcŸ6mZœþùÕØyõ´lÙ²\mýúõuÖØñ¼ýöÛåj{ì±G¥óKJJÆÕ w©Êüùó«5¿¤¤$®¿þú(,,Œˆˆôôô¸é¦›je/[²jÕªÈÍÍ�%K–D~~~4lØ0Z´h­ZµŠƒ>¸Fá§uiéÒ¥‘››Ë—/�µk×FãÆ�£E‹ѶmÛèÖ­[4nÜx{ovJ;ÒÁ 'Ÿ|r…ó×­[‹/N¨rÈ!Õî{È!‡Ä¬Y³JÇóæÍ«ö5ªcöìÙ ãÌÌÌh×®]�ôÚ/ð}'è€JÅ5×\_ýuBýꫯŽ-ZT¹¶G�åjO>ùd\wÝuIõþꫯ⥗^*W/))‰õë×GÓ¦MË}Ö½{÷ {&ô¹iÓ¦˜ûT»gÙ5EEEñÆoTùRík¯½–0îÑ£Gµ‚¯7nx`ÂËί¼òJ�}®]»¶\-;;»Îú;–Í›7Çÿýßÿ%Ô:tè»ï¾{¥kʆ�äççW»oEßAªôùøã�Gnnnéø¢‹.н÷Þ»Ú{©®Ù³gGïÞ½+ý<555öÛo¿8óÌ3£_¿~Q¿~ý:ßSUþùÏVú3½ˆÿ¤vëÖ-~þóŸÇñÇ_áB@Ýø>¼ðÙgŸ•«U÷`­ŠÖ¬Y³&òòò¶ølEM,[¶,ž~úé„Úi§�Vk^eí(bÀ÷‰§–¨Ô­·Þ999 µ#Ž8"¼ÅµtPtêÔ)¡6a„øè£�’ê}óÍ7GAAA…ŸUºÙªU«èÓ§OBíÅ_,HU™{î¹'V®\Y­ž[+777.ºè¢9rd|óÍ7uÒck=ÿüó1nܸ„Ú®»î¿ÿýï·ÓŽà‡çË/¿,WËÊʪt~^^^¸Y³fÕîY6À*"ªü®¶nݺX¼xqBí�C©vß²kæÍ›WíkTÇìٳƙ™™Ñ®]»:í ì8&MšK—.M¨�tÒIU®) þé§ŸV»ï'Ÿ|R®V6¬½*Ë—/�?ýéO¥ã=÷Ü3.¹ä’jï£&ŠŠŠªü¼¸¸8>øàƒøíoÇsL¼ùæ›Ûd_•ÙÒ~ #'''®ºêª8å”SâÃ?ÜF;€�Û÷åà…Š>Ûm·ÝªÝ·uëÖÕê[S‹-Š .¸ ᆖ-[ÆÅ_\ë½¾µ£ˆß'‚>¨Ðc�=ýë_j­[·Ž;î¸#RRR¶¸>%%%.¼ð„Zaaa 2¤Ê0§Í›7Lj#â…^¨òÚ•¹è¢‹ÊÕ®¾úê˜9sf•û}ðÁãÏþs�zV¤U«V1dÈ�„Î<óÌ8þøã˽¸´fÍš¸ÿþû£_¿~;\ÐÀ»ï¾×]w]””””ÖÒÒÒâî»ïŽÌÌÌí¸3øayûí·ËÕöØc�Jç÷ßÍÕÿ®R™ª^ªýì³ÏÊÕ:tèPíe׬Y³¦\pimY¶lY<ýôÓ µÓN;­Öþ¼€Û²eËâÎ;ïL¨5oÞ<~þóŸW¹®[·nå®óùçŸW«÷[o½U®¶qãÆ(..NjýM7Ý”p(Ì 7ÜõëׯÖ¶…åË—ÇùçŸ=ôÐöÞJRæÏŸƒ *6Ô¾ïËÁ +V¬H§¤¤D«V­ªÝ·M›6ÕꛬM›6ŲeËâÕW_�ßýîwqÊ)§$ü¹4kÖ,xà�:ýýýŽp |ߤmï °ã™2eJÜzë­ µŒŒŒ;vldee%}�~ýúÅóÏ?Ó§O/­­X±"ú÷“N:):tè�5Š•+WÆ[o½ãÇ�OÍÌÌŒ5kÖ$\·Y³f•öìÑ£Gœ}öÙ !¥ß|óMüÏÿüOôë×/úõëûî»odddÄêÕ«cÖ¬Y1a„˜5kV•=322’¾ïˆˆÝvÛ-®½öÚJ?Ÿ;wnŒ3&!ÐtñâÅqî¹çÆO<{ï½wµúÕ…ùóçÇE]6lH¨�1"ºwï¾�v?<›7o.4Ô¡C‡ráàßÕ¼yó„q~~~µû®]»¶\­ª ÏŠ>Ûm·ÝªÝ·uëÖ^ûG?úQµ¯U•E‹Å%—\ëׯ/­µlÙ2.¾øâZíì˜ŠŠŠâšk®‰¯¿þ:¡~õÕWG‹-ª\Û£G�rµ'Ÿ|2®»îº¤zõÕWñÒK/•«—””Äúõë£iÓ¦U®þùçcÚ´i¥ãŸþô§Ñ»wï¤zo�¦M›ÆG‡~xì»ï¾Ñ¶mÛÈÈȈ͛7Çš5kbîܹñúë¯Ç?þñ�„ŸÇwÜÙÙÙqúé§×ù>¿•••}úô‰^½zE§N�b·Ýv‹ŒŒŒØ´iS¬Y³&æÌ™Ó§O�çž{. K×mÚ´)~ó›ßÄ.»ì½zõÚfû€�ÉÖ¼ðòË/'\çóÏ?�=÷Ü3éÞU¼�ššZî³ïþ 9"¢aÆ‘žžžt¿oUôßze¯½%ï¼óN 4(éù?þñ�ãÆoŒ¶mÛV«Oum�¿ø¾ô @‚×^{-†ÅÅÅ¥µ† Ƙ1c¢sçÎÕºVJJJÜvÛmqÎ9çÄÇ\Z/,,ŒÇ{,{ì±*×{ì±Ñ¦M›øË_þRZ«_¿~4hРÊu×]w]|öÙgñæ›o–ÖŠ‹‹còäÉ1yòä*×tÐAqÌ1Ç”{騪pÑšØÿýcäÈ‘ñÔSOÅ 7Ü%%%‘——¿þõ¯câĉÛõe–%K–ÄùçŸyyy õ_ÿú×Û4°v“&MŠ¥K—&ÔN:é¤*×dgg'Œ?ýôÓj÷ýä“OÊÕ–/_^éü+V$ŒSRR¢U«VÕîÛ¦M›jõMÖ·�Nüq¼üòËñÿ÷±qãÆÒÏ›5k<ð@dffnu/`Çwë­·FNNNBíˆ#ŽˆÁƒoqíA�:uJø¾4a„8í´Ó’úùØÍ7ß~¶¥ Ïµkׯˆ#JÇÍ›7�ßüæ7[ì¹5vß}÷¸å–[â§?ýi¥?wkÔ¨Q´iÓ&Ž9昸òÊ+ã·¿ýmBiDÄï~÷»èÚµktèСN÷»ï¾ûÆ=÷ÜÇ{l¤¥•ü-===š6míÚµ‹“N:)®¼òÊøÿïÿÅìÙ³KçÅ•W^/¼ð‚ï‡P˾o/” ãÜÒó•©h]uƒ>“uðÁǰaâk×®urý²¶÷�ð}äØKJåääÄW\………¥µôôô¸÷Þ{£{÷î5ºf‹-âñÇ�¾}ûVkÝ©§žwÜqGlذ!¡Þ¼yó-®­_¿~<øàƒqÆgT«ç�üãxà�bóæÍå>«í Ïo 4(† ’P›3gNLŸ>½Nú%㫯¾ŠóÏ??–-[–P¿øâ‹ã‚ .ØN»€¦eË–• oÞ¼yüüç?¯r]·nÝÊ]çóÏ?¯Vï·Þz«\mãÆ� �ïßUö…ä† FzzzµzFDR/RoÉ;ï¼ûî»oÂ?]»v�Ÿüä'qÑEÅĉB>üãÇäÉ“·ÙKÏÀöõØc�Å_ÿúׄZëÖ­ãŽ;””-®OII‰ /¼0¡VXXC† ‰yóæUºnóæÍ1bĈxá…ª¼vUþøÇ?ÆÊ•+KÇ×^{m¹�÷ÚÖ³gÏ8p`Òa6YYY1zôèr?{+,,Œ{ï½·.¶˜à¸ãŽ‹O<±Â�ÏŠ´mÛ6{ì±èÓ§OB=???Æ�W[€�Zm¼ð]&Lˆ�>ú(©Þ[:x¡"eŸI¨iÐgÆ “î¹µrss㢋.Š‘#GÆ7ß|S'=¾k{ü½À÷� O""âý÷ß�‹/¾8á%–ÔÔÔ¸ýöÛãÈ#�ܪk7mÚ4ÆŒ>ø`tïÞ=RS+ÿ±TÇŽã¾ûî‹;î¸#5jùùù ŸwèÐ!©žééé1|øð˜8qbôéӧʪ6mÚÄÍ7ß=ôPdee•ëÙ®]»¿Ì“Œ_þò—Ѹqã„ÚÔ©Së¬_Uòòòâ¼óÎ+vÖYgÅÿþïÿn—=ÀUQQQ\sÍ5ñõ×_'Ô¯¾úêhÑ¢E•k{ôèQ®öä“O&Ýû«¯¾Š—^z©\½¤¤¤Ò—jËÖkúý¨¢uuõ"ïÁ“&MЇz(Ú¶m['=€Ë”)SâÖ[oM¨eddÄØ±c#+++éëôëׯÜÁ5+V¬ˆþýûLj#böìÙ‘ŸŸ±dÉ’xúé§ã´ÓN‹Ç{¬t~fff¹ëVu˜ÌÌ™3ãoû[éøàƒŽŸýìgIïy[»á†b¿ýöK¨½øâ‹±dÉ’í´£Ê¥¥¥ÅÝwß»ì²KBý‰'žˆM›6m§]ÀÏ÷ùà…A«V­bÈ�! ÿœyæ™qüñÇÇî»ïž0wÍš5qÿý÷G¿~ýâÃ?¬Ó}íì/PiÛ{lŸ|òI\pÁñÍ7ß$Ôoºé¦8ùä“k­OŸ>}¢OŸ>‘——999±|ùòX½zuDü÷åžnݺÅ>ûì“°fþüù ã.]ºT«g·nÝâÁŒuëÖENNN,Y²$V¯^ÅÅÅѲeË8ðÀ£K—. /�lmÏêjܸqôêÕ+¦M›VZ{ç�wê´gE¾ùæ› _Äéׯ_üþ÷¿ßæû€º[o½5rrrjGqD ·dÿý÷�‘#GÆSO=7ÜpCéayyyñë_ÿ:&Nœ©©©µÚó[Ûúï¾ïêæ7ø|/,]º4Î;ï¼X¹reBýW¿úUœwÞyÛiWÿ¿œœœ(***§§§G�=ê´ççŸK—.M¨õîÝ»N{FD¤¥%žÉ³-¶ â²Ë.‹™3g&Ô�8âˆøÓŸþTnoÀÖ™2eJ¹Ð§ŒŒŒ;vldee%}�~ýúEß¾}j+V¬ˆþýûLj#böìÙ‘ŸŸ±dÉ’xúé§ã´ÓNKxÙ633³Üu›5kVa¿F�%Œkú²óÆ�ËÕªû²ón»í×^{mÂ?7ÞxcŒ92þõ¯ÅäÉ“ãøã�OX³xñâ8÷Üsã³Ï>«Ñ¾€×ûï¿_|qlذ¡´–šš·ß~{yä‘[uí¦M›Æ˜1câÁŒîÝ»W˜Ò±cǸï¾ûâŽ;îˆF�E~~~Âç:t¨pÝ'Ÿ|?üpéx÷Ýw�Ë.»l«ö½­¤§§Ç�˜P[±bÅvÚÍ–íºë®±ûî»'Ô–/_¾�v? uyðBÙŸ�oÉ©§žwÜqGÂFT}ðBÙŸOoܸ1á9…d}óÍ7[¼vm4hP¹Ã°æÌ™S­C*jb[þ½À÷�7ôvR_}õUœ{î¹±dÉ’„úù矗_~ùvÚU¢þóŸ 㣎:ªZáW5ñì³Ï&Œ<ðÀèܹs�öŒˆra«ÙÙÙuÞ3"bóæÍqÍ5×Äo¼‘PïÞ½{Œ5*êׯ¿Mö;‹×^{-†ÅÅÅ¥µ† Ƙ1cªý�#%%%n»í¶8çœsâã�?.­Æc�=–èY‘c�=6Ú´iùË_Jkõë×� T8¿ì É5 ú¬h]m¿ì¼ÿþûÇÈ‘#ã©§žŠn¸!JJJ"""///~ýë_Çĉ« é¾?>ùä“¸à‚ ÊªÜtÓMqòÉ'×ZŸ>}úDŸ>}"///rrrbùòå±zõꈈhݺutëÖ-öÙgŸ„5óçÏOwéÒ¥ÂkÏ™3'!§mÛ¶qÿý÷'µ¯²ÖDDLœ81^ýõ„Úµ×^›Ôõj¢ìÏë¾ýsÙQeee%üLtGß/ìȶÅÁ ¯½öZŒ;6fÏž�ð³õïêØ±c\yå•qÜqÇED$}ðBÄø®’’’X¶lY´mÛ¶Zû­è¿ÏÊ^»6ýò—¿Œ &ÄúõëKkS§N�£�>ºÎzFl»¿ø¾ô °ÊÏÏ�!C†Ä矞P4hP :tûlªŒåË—ÇóÏ?ŸP;ãŒ3ê´çúõëcÒ¤IÛ´ç·fΜ™0®îKC5QRR¿ùÍoâÅ_L¨xà�1vìØhÔ¨Q�ïv&999qÅW$„8¥§§Ç½÷ÞÝ»w¯Ñ5[´h�?þx\{íµ1}úô¤×�zê©qóÍ7Ç­·ÞšPoÞ¼y¥kʆqnܸ1ŠŠŠ"-­z¿r,ÂUѵkË AƒbñâÅ1nܸÒÚœ9sbúôéuþ²3P÷.\ç�w^äåå%Ô¯»îº:û™N‹-â˜cŽÙ⼂‚‚r?{«,賬3fÄŒ3j²½ˆ(�MDÝ}~ªþ­”””:ëU¾oû€Õáà…ˆˆ½÷Þ»\méÒ¥µôY—A–�7Ž^½zÅ´iÓJkï¼óN�õ+«®ÿ^øþY¶lYÌ›7/–.]Zz\óæÍ#;;;ºté­ZµÚÎ;Üz›6mŠO?ý4æÏŸyyy±nݺhÒ¤I4kÖ,öÚk¯Øÿý#==½Î÷±bÅŠøðÃcÑ¢EñÍ7ßDjjj4iÒ$Ú´i{íµW´oß~»=YXX ,ˆO?ý4V¯^_ýu4jÔ(š7omÛ¶�.]ºDÆ ·ËÞ`[ô °“Ù¸qc\vÙe1oÞ¼„ú©§ž7ÝtÓvÚUy·Ýv[¬_¿¾tÜ¥K—èÝ»w�ö=zt,[¶¬tܦM›øéOZ§=#"^zé¥r/ýyä‘uÞ÷æ›oŽüã µ}öÙ'~øáhÚ´i�÷€�Éûï¿_|qlذ¡´–šš·ß~ûVÿ{¿iÓ¦1f̘xíµ×bìØ±1{öì(..®pnÇŽãÊ+¯ŒãŽ;."¢ôÁ‰oUõÒñ®»îš0.))‰eË–ÕÊËÎe¯]›~ùË_Æ„ ¾[N�:UÐ'|Ï-]º4Î;ï¼X¹reBýW¿úUœwÞyÛiWÿ¿œœœ(***§§§G�=¶ãŽêΪU«Æ™™™Ûi'É)»ß¬¬¬í´øþú!¼PQÐçüùó«ýßpŸ}öYÂ833³Îÿû¨]»v ã²ÿ½³-l‹1Ø1åççÇÓO?³fÍŠ3flñ÷UíÚµ‹�ÆgœQ£g÷~ñ‹_ÄÌ™3kºÝR³gÏŽ&Mš$5·¸¸8fÍš¯¿þz¼ùæ›ñÁÄæÍ›+�ß Aƒ8üðÃãœsΉ^½zmõ^¿kãÆ�1iÒ¤xúé§ãÃ?¬rn‹-¢{÷îqÔQGÅ€ju™3gN¼úê«ñÖ[oÅ;ï¼………•ÎMOO�ýèGñóŸÿ<Ž:ꨨW¯^�ï¶AŸ;‘‚‚‚¸óÎ;cîܹ õãŽ;.n»í¶ív:SY£F�Š©S§–ŽÓÒÒbĈ‘ššZg='Ož?üpBíÆoŒÆ�oqíÒ¥Kc·Ýv«QßE‹ÅðáÃjééé¥á[U¹ï¾ûbÔ¨Q µG}4zöì¹ÅµwÝuW<þøã µ=÷Ü3yä‘hѢŖ7$í“O>‰ .¸ ¾ù曄úM7Ý'Ÿ|r­õéÓ§OôéÓ'òòò"'''–/_«W¯ŽˆˆÖ­[G·nÝbŸ}öIX3þü„qu_v^ºti­}V0ºµ7n½zõŠiÓ¦•ÖÞyç�:ëÔ½U«VÅ\K–,I¨Ÿþùqùå—o§]%úç?ÿ™0>ꨣ~��’å~ÖX—!î[kùòåå¾�î²Ë.Ûi7ðýôC;x¡iӦѶmÛX¼xqi-777\­¾³fÍJ—ýy|]HKK|%hGyæ£";Ó�?t òňŽ?ü0JJJ’^·hÑ¢¸ûî»cܸq1lذ8p`îrëÝyç�ñÌ3Ï”ûÝhU6mÚÿú׿â_ÿúW~øáñ‡?ü!ZµjµÕ{™6mZÜtÓM±|ùò¤æçååÅË/¿¯½öZ�}Ž?>{채߷nIaaa¼õÖ[ñÖ[oÅwÜqG�¾WÛ“ O€�Eñæ¸÷Þ{˽xß§OŸ¸ë®»êìÄ£G}4>øà*C£¾•ŸŸwÝuW<õÔS õ .¸ :wîœtÏ¿ÿýï±Ûn»%uÚÕÆ�ã�ˆqãÆEqqqiý”SN‰Ÿüä'Iõ;î¸ãâŒ3Έ³Ï>»Â¬ÊL›6-n¼ñÆX±bEBýÜsÏ�6mÚ$}�ê7n\Œ7.¡¶ûî»Çøñã£eË–uÖvF .ŒóÎ;/òòòê×]w]œqÆuÒ³E‹qÌ1Çlq^AAA|þùç µê}Ο?¿Ú/â~öÙg ãÌÌÌÈÌ̬Ö5ª«]»v ã-� 츾ù書á†Ê}�4hP :tûlªŒåË—ÇóÏ?ŸP«ê»_ÿþý£ÿþ5ê5cÆŒ8çœsjÉS^}õÕX¿~}BmGjyî¹çÊÕväýÀŽæ‡zðBŸ>}Ê|ûí·«ÕsÆ ñþûï'ÔŽ<òÈj]£&ʾP˜��]ç=kjg9j˲eËbÞ¼y±téÒÈÏÏ�ˆˆæÍ›GvvvtéÒ¥V‚vfyyy1gΜX¶lY¬]»6 ####233cß}÷�½÷Þ{‡ Q_²dIÌ�;7¾úê«øúë¯#"¢Y³f±Ë.»Ä�èÀ6×0oQ¹w•«cݺuqýõ×Çœ9s⦛nªÅ�ծɓ'ÇW_}Uãõÿþ÷¿£_¿~ñè£�nÕA�úÓŸbìØ±5^_—¦N�Z­�ϲ>øàƒèß¿Œ;6;ì°ZÜì}ì$²?~1r?ÍM¨¥¥¥EûöícäÈ‘5ºæ'žxb•s^z饸å–[b¯½öо}ûÆA�:uŠÌÌÌHKK‹U«VÅÂ… cúôéñÜsÏ• ÁêÛ·o\yå•ÕÚ×Ì™3còäÉѦM›èÛ·orÈ!±ï¾ûFvvvÔ¯_?Ö¬Y‹/Ž×^{-¦N�Ë–-KXà�ÆðáÓîWPP&Lˆ &DçÎ�ãÇ?þqì·ß~ѱcÇhÑ¢E4mÚ4ŠŠŠâë¯¿Ž… Æœ9sbÊ”)1oÞ¼r×êÚµk\zé¥Õºßêxã�7â®»î*WïÒ¥Küõ¯­Ñ5›5k]tÑÖn ~p–.]ç�w^¹mõ«_Åyç�·�võÿËÉɉ¢¢¢Òqzzz•!GM›6�¶mÛ&ü>777\­¾³fÍJoÍà ÉJKKüµèŽôB�¼�7Æí·ßóçÏO¨Ÿzê©;Ôƒž·Ýv[Bøe—.]¢wïÞÛqGu£   ÂŸ+qÄÛa7[¶víÚxðÁj 6ô Iú!¼ð­£�>:!èsÉ’%1cÆŒ¤Q˜:ujlÚ´©Ü5ëÚÌ™3ÆmÛ¶­óž5QÓ¿Ø™äççÇÓO?³fÍŠ3flñðÊvíÚÅÀ�ãŒ3ΨÓðìM›6Å©§žZî;`Ä:OöûÇ/~ñ‹rß]¶Ö¡‡�=öXÒó7nÜÏ<óLLœ81>øàƒ*ç6oÞùä8ûì³£cÇŽ[»ÕY¾|y<õÔSñ÷¿ÿ=–.]ZåÜvíÚÅ€bРAÂÔ€í¦}ûöÑ»wï8ôÐC£C‡‘�� 4ˆ•+WFnnnLœ81Þyç�„5O>ùddggÇW\Q£ž?ùÉOjôNJzzz�úÕ¯_?zõê=zôˆƒ>8Zµj™™™±~ýúX°`ALŸ>=žzê©„gH׬YçŸ~<ýôÓ5:°åøCŒ?>¡Ö°aÃ8öØcã¨£ŽŠN�:EË–-#555Ö®]Ÿ~úiÌ™3'^yå•­ c­©zõêE÷îÝãÐC�îÝ»GëÖ­#;;;6mÚ‹-Š×_=žxâ‰X½zuéš�7Æ¥—^�?þxtîÜy›ïê’ O€�DÚÆürµ¢¢¢j=èXÖé§Ÿ¾Å Ïo-X° ,XP­ëüñqç�wF½zõj²½øòË/ã¯ýkµ,»wï<ð@4nܸF=?úè£øè£�j´ö ƒЇz¨Æ½“±bÅŠ ëe_ª©ŽÝwß]Ð'”±jÕª¸à‚ bÉ’% õóÏ??.¿üòí´«Dÿüç?ÆGuÔ_øèÓ§OÂËÎo¿ývµznذ!Þÿý„Ú‘GY­kÔDÙ°Õììì:ï Ô®”Í…qç�w– ù<î¸ãâ¶ÛnÛa‚¼G�S§N-§¥¥Åˆ#"55u;îªrË—/¯Ñƒ£%%%ñûßÿ¾ÜA6Çw\R/vϘ1#Î9眄Úå—_¿úÕ¯êd¿qå•WÆW_}•P?óÌ3£aÆվìl~è/ôìÙ3²²²^&{ì±Ç’ ú,...÷LÂ~ûííÛ·¯ÆÎ«ï¥—^*ø´-~Þ^;Ë�P òňŽ?ü0JJJ’^·hÑ¢¸ûî»cܸq1lذ8p`�ìoôèц|îªós÷œœœ6lX,\¸0©ùùùùñøã�Çĉã¼ó΋+¯¼²Æá51qâĸýöÛã›o¾Ijþ¢E‹âž{î‰ñãÇǰaâ_¿~u¼Cø~[¶lYÌ›7/–.]ùùÿ}Ϧyóæ‘��]ºt©Ñï¤w4+W®Œ/¾ø"–.]«W¯Ž 6DDDFFF´hÑ":wî{íµW�}â†n¨ðYÍæÍ›G»ví¢oß¾qÅWÄ_|“&MªVÏšjÕªU 4(XáwꌌŒhÙ²e|ðÁqÞyçůýëø×¿þUúùºuëâÆoŒ'Ÿ|r›ì¶AŸìpš4iW]uU¹—ýëRzzz\xá…qùå—GZÚ¶ý±YÆ ã²Ë.‹óÏ?›÷jß7ß|7ÜpC¹—] C‡Ý>›*cùòå傾Ï8ãŒ-®;ú裂>—,Y3fÌHêe爈©S§Æ¦M›Ê]³®Íœ93aœLø°)Þ­g=s—˜PîÓ§OÜu×]uöRÅ£�>|ptéÒe‹sóóó㮻žz*¡~ÁìЧ‹_rÉ%ѶmÛ8ï¼óâàƒNêeš+VÄõ×_¯½öZB====®ºêª:Úéõë×/Ž:ê¨8çœs’þsýüóÏãÚk¯�9sæ$Ô›5k_|q]l~Pv†ƒÒÓÓcÈ�!qûí·—Ö^z饘>}zôí۷ʵ&Lˆ>ø ¡vÙe—m±çÒ¥Kc·ÝvÛ⼊,Z´(†žPKOO�ãŽ;n‹kï»ï¾5jTBíÑGMúçüÕõ};¶µ†y‹bîܹ5^¿nݺ¸þúëcΜ9µÀþÑGÅÃ?\«×¬M½zõJjÞ+¯¼—_~yBxD²ŠŠŠâÁŒ Ä=÷ܳMÂ>ï¾ûî3fL�Öæååůýëøê«¯â‚ .¨å�À÷W~~~<ýôÓ1kÖ¬˜1cF¬ZµªÊùíÚµ‹�Ægœ±ÅÃӷƦM›âÔSO­0X}Ú´iÕzÎñõ×_�Ù³gGnnn|ôÑG±fÍš-®ÉÈȈO<1 x`u¶^ÎÆ�ã™gž‰‰'–ûYYYÍ›7�“O>9Î>ûìèØ±ãVõÝ‹/Ž1cÆÄ”)S©ù®æÍ›Gÿþý㢋.ªÓÿ-À÷QIJjôîÝ;GuT4jÔ(©uƒ Š´´´6lXi­¨¨(î¿ÿþ¸çž{êh·5צM›¸êª«¢ÿþI?«ÚªU«x衇bðàÁñÉ'Ÿ”Ö§L™—^ziÒß�¾ú꫸í¶Ûj§žzjÜ~ûíIÿ®m�=öˆk®¹&©¹5•™™C‡�³Ï>;4h�ÔšŒŒŒ¸ï¾ûâ‚ .ˆ·Þz«´ž››¯¾újüä'?©«íÂ6'5€:õmXÀ›o¾K—.­rîî»ïýúõ‹Ÿÿüç‘��]ãžgžyf4lØ0þóŸÿlñöììì8å”SâœsΩqàÓ+¯¼¯¾újüç?ÿ‰wÞy'–/_¾Å5iii±ß~ûÅ©§ž?ýéO+<Å øþÙ¸qcÜ~ûíå^x>õÔSký¥š­qÛm·%<˜Ø¥K—èÝ»÷×õìÙ3²²²bõêÕ¥µÇ{,©€‹‹‹ã¯ýkBm¿ýö‹öíÛWcçÕ÷ÒK/•ûzä‘GÖiO veüb4-ò™––íÛ·�‘#GÖèšp@œxâ‰UÎy饗â–[n‰½öÚ+úöítPtêÔ)233#---V­Z .ŒéÓ§ÇsÏ=yyy ëûöíW^ye�ö·­Ç‹/¾/¾øb´iÓ&úöíx`ì»ï¾‘••QTTyyy1wîÜxýõ×ãÙgŸ�‚‚‚r×>|xtèСN÷[TTO?ýt<ýôÓ¥/ûï¿éßK“&M¢   Ö¬YsæÌ‰ýë_ñòË/ÇæÍ›®“žž÷Þ{¯ŸÉÀ–ìD/œ}öÙ1~üø„ß÷ÿú׿Žx ºwï^áš©S§ÆwÜ‘P;ðÀãØc�Ýb¿ãŽ;.Î8ãŒ8ûì³cï½÷NzŸÓ¦M‹o¼1V¬X‘P?÷Üs£M›6I_§&v†1`Gо}ûèÝ»wzè¡Ñ¡C‡ÈÎÎŽ ÄÊ•+#777&Nœï¼óNš'Ÿ|2²³³ãŠ+®¨•=Çï~÷»…cVä”SN‰nݺÕxý?þñ�„ï?©©©qÚi§mqÝÂ… ãŠ+®(w{ì±GœuÖYѳgÏhݺuÔ¯_?V¯^ï¿ÿ~Lž<¹ÜAW/¿ürŒ9²ÎCþñ�TòÙ½{÷øÙÏ~ݺu‹–-[ÆæÍ›cùòå‘““O>ùdÌ›7/aþÿøÇèÔ©SôéÓ§N÷ ;ºy‹bĈ?LJ~%%%I¯[´hQÜ}÷Ý1nܸ6lX 8°Nö7zôè C>kââ‹/.÷{ñ-ùúë¯câĉ1iÒ¤0`@ :4š5kVíÞ9991lذ-¾»ó­üüüxüñÇcâĉqÞyçÅ•W^¹MÕ¿kÒ¤I1bĈظqc•óòóóã‘G‰É“'ÇÿøG�Sðk÷84.?«fïã0 žy晘9sfiíµ×^‹‚‚‚¨_¿~mm±V<ùä“5ú�hÓ¦Mãw¿û]œsÎ9 õiÓ¦%ô9bĈÈÏÏ/xà�qÛm·ípê�=ºFFiiiqóÍ7lj'ž˜ð]vÚ´i¾wñƒ"è`'±üàÁñìÿ7""ößÿ¤OÈÚZ‡~x~øáÿÝÃòåñÉ'ŸÄ’%K"???ŠŠŠ¢qãÆÑºuëèܹsì¹çžµÒ³[·n¥…®^½:æÍ›‹-ŠüüüØ´iS4jÔ(vÝu×èÔ©Sì³Ï>‘’’²UývÛm·ûì"¯ÏÊÊŠýöÛ/úõë·Ýv[<òÈ#‰Ÿßxã�qÄGì4÷ª@E¨¶rAÌž=»Ôû׬Y¿ûÝïâƒ>HùƒÞ?þøãxøá‡SÚ³´ â™gž‰>ø {챨W¯^±÷¾þúë1dÈ�RÄçååŃ>Ÿ}öYÜqÇ;,ìó¡‡*rݵ=+W®Œ .¸ FŽ'œpB9M»˜´²…Mžzꩉ Ï5kÖÄœ9sŠõÀ¹©,÷€víÚ5š4i .,¬M›6­X{?ÿüóx饗 ×iii1lذ�òžÔ²ÌÔ¢E‹8øàƒã½÷Þ+¬÷3‚]… Ov˜ìììÈÎÎÞ¡gÖ«W/~øÃÆøÃvfÆ £aÆѥK—v&PÁò7E£©�Ù›ýÂó‘G#GŽ,·¿Lÿë_ÿtP±nfXµjUŒ92žzê©D}àÀ�Ñ®]»bŸyÖYgÅc�=K–,)¬]uÕUqÿý÷Ç¡‡ºÅ=/¾øb‘#8à€øñ�¼ÝóŽ;î¸8ãŒ3⬳Ί֭[{ÎñãÇÇõ×_K—.MÔÏ;ï¼hܸq±û”DÍš5ãÒK/-òöÝUëÖ­ã–[n‰N�:Uô(ÅÒ¹sç1bD´jÕª¢G€]žöà…=zÄW\#GŽ,¬åææÆSO=Uä»õÍ¥§§Çˆ#¢C‡%>÷ã�?Ž�?þ¸Äû"¾ýsÎC=5jÔ(ÕþÒØSˆ;BAZzvØañÓŸþ4zôèQì¸÷íÛ7222â·¿ýma-///î½÷Þ¸ãŽ;Ê4Ó—_~™èѽ{÷èÕ«W™‚>ËbìØ±E‚£Šóà©+VÄo¼‘¨pÀ1bĈí^“œp ±téÒ¸ùæ› k¹¹¹ñÒK/ÅàÁƒK0}ñ½õÖ[±lÙ²DíÜsÏÝbÈç÷UªT)†Ÿþy¼öÚk…õÏ?ÿùdÔ¯_?.¹ä’”Ì�ŸŸ×^{m©Â1·§zõêÑ©S§èÒ¥Kì»ï¾Ñ²e˨W¯^Ô¬Y36lØ+V¬ˆY³fÅË/¿&Lˆüüü½sæÌ‰ /¼0þþ÷¿+,|þüùqÉ%—yÍ›7�3Ï<3ºví�5Š*UªÄŠ+âÃ?Œ1cÆÄĉ¯õÕWã®»îŠ+®¸"5Â6L˜0!n»í¶D­råÊqê©§FïÞ½úyòÉ'ã?ÿùOáƒ~òóócèСѢE‹R}$méwX6ÿndwжmÛDÐgqßãÓO?�XwéÒe—¹O³¤Úµk—úÜÿwÀžMÐ'”Qý9ÿ‰Z›…|fddD‹-â®»î*UÏ:l÷—�_y啸ñÆ£U«VqÌ1ÇDçÎ�cß}÷�ºuëFFFF|õÕW1þü˜0aB¼ôÒK±råÊÄþcŽ9&~õ«_•h®ªU«Æõ×_¿üå/ k«W¯ŽóÎ;/úôé§žzjâfǧžz*þýïÞìQ¥J•øýï_¬ó6nÜO<ñD<ñÄÑ®]»8âˆ#¢}ûö±Ï>ûDVVVÔªU+òòòâ믿ŽùóçÇ|ãÆ�‹O>ù¤H¯N�:Å…^X¢÷[«V­Š|p«?_°`A‘õæ7�~ß Aƒ"333eóÅsÁDÓ¦Mã�wÞ‰E‹móµMš4‰SN9%Î>ûì¨_¿þš°ì®¿þúxóÍ7ã½÷Þ‹Ù³gÇ7ß|³Ý=5kÖŒ.]ºD¿~ýâè£�.Ö/ø¤ÊwÜ“&MŠ©S§Æœ9sbݺuÛÝ“••ݺu‹³Î:˃y`7–ª/ <8êÖ­7ÜpC¬_¿¾X{233ã–[n‰cŽ9¦Lg—DµjÕ⢋.ŠDFÆÎû«A{Ú1 ¤V7ÿA 9³i©öžvÚiñÜsÏÅ»ï¾[X›8qblܸ1ªT©RꙆ k×®�ˆoï6lXL�:µÔýÊj̘1‰u�:uŠõPÑwß}76mÚ”¨ýâ¿(vðøYg�÷ÜsO|ýõ׉žåô9iÒ¤Ä:--­Dgýò—¿L}FDLž}z<ýôÓqÆgl÷Ì#FĆ µ“O>9n¸á†¨Zµj¢^«V­hÞ¼yœp ñâ‹/ÆUW]•ø|}ôÑ8ãŒ3¢Y³f%yÛ%²aÆ6lXâ^ÖÚµkÇ}÷ÝWä�5ŠÃ;,Æ�C‡-œuãÆ�qÝu×Å?ÿùÏr›öÕªU+R+Îý€»šÍßçwß»mK^^^‘ïÄN<ñĔε3ÙüÚ±8ŸìJvÞ¿Í€]DÆúUEjyyyñøã�—ºgïÞ½·ôù�Ï>û,>ûì³õ?þøãã¶Ûn+ö/±|_�=âŠ+®ˆ‘#GÖrssã©§žŠ§žzj›{ÓÓÓcĈ¥z¢ùÇüq‰÷EDtîÜ9z表Q£F©ö—Ä×_½Í ÏÍ-Z´h›¯ïׯŸ OöhKêKêïý¬qDDì¿ÿþQ½zõr?·{÷îѽ{÷ogX²$>ýôÓX¸pa¬Zµ*òòò¢F�ѨQ£h×®]´lÙ²ÜçÙ’®]»Æœ9sJ½ÿ ƒŠƒ:("" â‹/¾ˆ/¾ø"-Z«W¯ŽuëÖE¥J•¢víÚ‘™™­[·Ž¶mÛFzzz…Ì}øá‡Çá‡ùùù1þüX¸pa,^¼8V¯^ëׯ�Ê•+Gfffdffƾûî­[·.Ó¬ÀŽWÑ^8ýôÓ£[·nqÿý÷Ǹqã¶úK…™™™Ñ»wï8ÿüó£^½z%:ãõ×_�7Þx#&Mš3f̈%K–lwOFFF´oß>N>ùä8餓¢nݺ%:³¬*úŸ ì–ÒÊö]ë©§žšú\³fMÌ™3':vìXª~cÇŽ�‰'®/¸à‚hÑ¢E…}Ι3'fÍš•¨õìÙ³È/ÿoÉ–®¯Jò0¨Ê•+Ç�˜Ýú~Vªm>o«V­¢AƒÅÞß±cǨZµj"l«<ç€]AAZzvØañÓŸþ4zôèQìû úöíñÛßþ¶°–——÷Þ{oÜqÇešéË/¿LôèÞ½{ôêÕ«ÌAŸøÃJ¼çÀŒ‡z(N;í´Dèfq‚>W¬Xo¼ñF¢vÀĈ#¶{Oê 'œK—.�›o¾¹°–››/½ôR¹…ªGDüío+rÍ5bĈ­†¿FDôêÕ+–-[–˜õÃ?ŒW^y¥XáóÀÖ}ùå—Ej%ýû¶]Áæ§Vœ¿7ûøã�㫯¾JÔ;찔ε3)Íg»AŸ°©Y³f\zé¥qî¹ç–©ÏàÁƒ£nݺqà 7Äúõ답'333n¹å–8æ˜cÊtvIT«V-.ºè¢0`@ddøëQ t²³³#;;»¢Ç(WiiiѬY³hÖ¬YE�R,éééѪU«hÕªUE�»­=ùÁ M›6�o¼1®»îº˜1cFÌ�;7V¯^iiiQ·nÝØwß}£cÇŽ¥þÞyï½÷Ž~ýúE¿~ý"âÛ¦ïf°råÊÂ/ÔªU+j×®-Z´ˆýöÛ¯X¡VÛrñÅÇÅ_\ª½;Ã? ©]»vEjË–-+U¯•+WÆM7ÝT¸nݺuüâ¿(õl©0f̘"µÓN;­X{·Ö^Òlfee%ÖßÀJµÍç-é¬iii‘™™™÷,Ïy`W°ºùbÈ™MKµ÷´ÓN‹çž{.ª>qâÄØ¸qcT©R¥Ô3 6,Ö®]U«V�aÆUX¨zDÄ~ûí'žxbâºkæÌ™±jÕªm^�¼ûî»±iÓ¦Dí¿øE±<ÖYgÅ=÷Ü_ýu¢gy}æææÆŸÿüçDíØc��ýèGÛÝ{î¹çÆ¿þõ¯˜={vaíÞ{ïô eôÞ{ï©5oÞ¼Ä} â“O>‰?ü0–/_ëÖ­‹ÌÌÌÈÊÊŠÖ­[G‡Š}�’j_ýu|ôÑG‰ZqÞãÌ™3ë5jDÓ¦ÉëÚ/¿ü2¦L™ .ŒÜÜÜÈÊÊŠ Ä!‡²KÝ뚟Ÿ_äzxW¹‡ŠËo²À.ê‚ .ˆ¦M›Æ;ï¼Sä)–›kÒ¤IœrÊ)qöÙg§ì —§Ÿ~ztëÖ-î¿ÿþ7nÜQ&âÛ_@éÝ»wœþù%~Êê믿o¼ñFLš4)f̘Qä‰ê[’‘‘íÛ·�“O>9N:館[·n‰Î`çPÑ^¨ZµjtíÚ5ºvíZ®ç4lØ06l]ºt)×sR¥¢ÿ¹ßªV­Z‘ÚÖþÞ~{FŒ_}õUázøðáe ±*«¼¼¼xá…µ6mÚÄ�X¬ý[º7aõêÕ%º_bÕªU‰uƒ н·¤6¿¯aõêÕ%Ú_PPPdÏ^{íUæ¹`—––^¦í§žzj"èsÍš51gÎœèØ±c©ú�;6&NœX¸¾à‚ ¢E‹ôñÃþ°HÀúâÅ‹·ô¹¥û8Kò½VåÊ•ãÀŒ·Þz«°öýÀòT›ø ±nÓ¦M¤¥¥EDÄŒ3bäÈ‘‰ëÔÍí»ï¾Ñ¿ÿ8õÔS+,ä´¸&Mš‹/NÔŽ<òÈ šʇ O(£%õ‹%õ‹÷~Ö8""ößÿ¨^½z¹ŸÛ½{÷èÞ½û·3,YŸ~úi,\¸0V­ZyyyQ£F�hÔ¨Q´k×.Z¶lY.34mÚ4n¼ñƸîºëbÆŒ1wîÜX½zu¤¥¥Eݺucß}÷�Ž;FFFéþjrï½÷Ž~ýúE¿~ý"âÛ›9çÏŸ .Œ•+Wƺuë¢R¥JQ«V­¨]»v´hÑ"öÛo¿¨Zµj™Þ×Å__|q©ö6mÚ4æÌ™S¦ó`[¾üòË"µ’>|3âÛ_¨ÿ~¸SŸ>}â?øA™f+«‰'Æòå˵޽{{ÿP¤6uêÔ8î¸ãе?///ÞÿýDíàƒ.öù%Õ±cÇ;vláú³Ï>‹+VûŸç¬Y³býúõ‰ZyÎ {‚víÚ©-[¶¬T½V®\7ÝtSáºuëÖñ‹_ü¢Ô³¥Ò–ÂÌ×®]»Í=[ —ßV0è–dee%Ö¹¹¹%Ú_ãÇ�O¬7n\¢ûôêÕ+þð‡?$‚ºÆ� HÙŒ°'yúé§cÑ¢E‰Ú 'œPª^Û ùŒø6¬ýå—_Ž—_~9Ž9昸馛JõýYImذ!F�•¨ÕªU«X!–óæÍK¬333£   î¸ãŽxðÁcÓ¦MÛÜÿé§ŸÆoûÛxì±Çâ¾ûî‹fÍš•ü ìqÏ=÷$j•*UŠŸüä'4”AŸ°ÈÎÎŽììì ;¿jժѵk×ÝüX 6Œ† –èéï°»yï½÷ŠÔš7o^¢ëׯ�aÆ®³²²â׿þu™g+«ï�F|ûKþ§œrJ±÷·oß>Ú´isçÎ-¬=üðÃñ£ý(ÒÓÓ·»ÿÉ'ŸŒÕ«W®ÓÓÓ£OŸ>Å>¿¤~ò“ŸÄÿøÇÂpŠüüüx衇⪫®*Öþ?ÿùωuÓ¦MËýþ ØÝU«V­HmK—Å1bĈøê«¯ ×Ç�*Uª”z¶Túþ5Ïwêׯ¿Í=[ ÇZ½zõv÷}ߪU«ë-ަÊĉë.]ºDZZZ±÷רQ#8à€˜:ujaíõ×_ô ¥°xñâ¸í¶ÛµÌÌÌ8ûì³Ëýì &DïÞ½cÔ¨Q[ uO¥;î¸#.\˜¨ýüç?�ZµjmwïÊ•+ëš5kÆ­·Þ�<òH‰føä“OâŒ3ΈGy$Ú·o_¢½;ÂèÑ£cúôé‰ÚI'�´Ó“BimÿÛh`§°iÓ¦xþùçµ6mÚD“&MJÔç®»îŠÿýï…ë«®ºj‹ÁM;RNNNL˜0!Q;üðãaÆÅî‘––—_~y¢6cÆŒ¸öÚkcãÆ�ÛÜ;~üø¸å–[µóÎ;/Z´hQìóKªQ£Fqæ™g&j�<òH<ýôÓÛÜ—ŸŸ·ß~{¼üòˉúµ×^•*UJùœ°'ùòË/‹ÔJs�4iÒ¤DˆyŸ>}â?øA™fK¥iÓ¦%ÖuëÖÝn¸ÒP¤öýÌíÉËË‹÷ß?Q;øàƒ‹½¿$Ö¬Y_|ñE™ÏÚ|Ï'Ÿ|R¦¹`O”——W\qE|ýõ׉úe—]YYY%êÕ²eËèß¿Üu×]ñÒK/Å{ï½³fÍŠÉ“'Ç /¼ÇßâCP/^ƒŽ%K–”å­lÓĉãÑGMÔš5kƒ *ÖþÍ?Ÿ÷Þ{/ò¹×^{ÅСCcܸq1}úô˜:ujüë_ÿŠK/½´Èç¸bÅŠ¸ä’Kâ›o¾)Ý›)'üqÜzë­‰Z�:uâŠ+®¨ ‰ üú€]ÄÓO?‹-JÔN8á„õ˜={vüå/)\wéÒ%úôé“’ùÊbìØ±‘›››¨õîÝ»Ä}~ô£ÅÀ�µgžy&N=õÔøÛßþsçÎ�uëÖEnnn,]º4Æ�_|q\xá…‰0Ðã�?~‡„ \qÅÑ¥K—ÂuAAA\sÍ51pàÀx饗bÑ¢E±qãÆX¿~}ÌŸ??þùÏÆé§Ÿ<ð@áž´´´¸úê«ãè£�.÷y`w÷Þ{ï©5oÞ¼D=Ö¯_Æ +\geeůýë2Ï–*‹/ŽþóŸ‰Ú©§žiiiÛÜ×¾}ûhÓ¦M¢öðÃG~~~±Î}òÉ'cõêÕ…ëôôôr»�7o^‘Úæ³Çæ{rrrbåÊ•¥ öH7ÝtSL™2%Q;üðã_¿~ÅîÑ£G�øûßÿ/¿ürüæ7¿‰ã�?>Z·nuêÔ‰ŒŒŒÈÊÊŠ¶mÛF¿~ýâ¯ýküõ¯�ìììD�%K–y@Lª|þùçqå•WFAAAa­R¥J1bĈ¨^½z±zlô¹bÅŠÂÿ~øá‡Ç¿ÿýï0`@ì³Ï>Q£F�¨U«V´k×.~ùË_ÆK/½�;wNìÿßÿþüãKÿ¦RlÅŠqá…Ɔ õaÆ•èA?°«È¨è€í[¼xqÜvÛm‰Zfffœ}öÙÅî±iÓ¦¸æšk"///""*W®Çßn¨ÓŽ0f̘Ä:+++Ž=öØRõºêª«bï½÷ŽÛn»-Ö¯_sçÎ�áÇowofff\xá…ñóŸÿ|‡|.ÕªU‹|0n¼ñÆxæ™g !Þzë­xë­·¶»¿eË–qÍ5×ÄGQÞ£ÀnoÓ¦MñüóÏ'jmÚ´‰&Mš”¨Ï]wÝÿûßÿ ×W]uUÔ«W/%3–Õ‚ â‚ .ˆµk×Ö4hçŸþv÷¦¥¥Åå—_]tQamÆŒqíµ×ưaâJ•*[Ý;~üø¸å–[µóÎ;/Z´hQŠw±}sçÎ-RÛ{ï½KܧQ£F[ì}È!‡”j.ØÓ<þøã1zôèD­Q£FñÇ?þ±Dß»ôïß¿DçvíÚ5žyæ™èÛ·o|ùå—…õ)S¦Ä믿žÒ‡¥äääÄù矫V­JÔ/½ôÒ8ôÐC‹Ýçû!¡ß×¶mÛ¸ÿþû·y­U¯^½xøá‡ãä“OŽ… ÖŸ}öÙ2dHìµ×^Åž£Ç|\qÅ©y“[°téÒÄ:---²³³KܧqãÆEjK–,)õ\°'7n\ÜtÓM‰ZíÚµcÔ¨Q;$½aÆqç�wÆgœ‘Ñ|ä‘GRô¹fÍš}bðàÁ%êU£F�"a¡±Ý@õïÔªU+®¾úê2dHamãÆ�ñÜsÏÅ AƒJ4K*åååÅ¥—^Ó¦MKÔ?üð¸öÚk+h*(‚>`'wÓM7Å”)SµÃ?<úõëWì ,ˆ»ï¾»pݼyó¸ð S6cYŒ3¦H­¬�Xùùùñî»ïÆ”)SbñâÅÛ}}nnnÜwß}1yòä¸øâ‹£[·ne:¿¤Ö¬Yo¿ývLŸ>}»!Ÿ_}õUüö·¿�‰'Æ�!C¢U«V;`JØ}-^¼8n»í¶D-333Î>ûìb÷Ø´iS\sÍ5‘——߉><ÒÒÒR:ëÖ̘1#úöí[ì×qÄqýõ×GÓ¦MKtÎUW]{ï½wÜvÛm…¡¡sçÎ�áÇowofff\xá…ñóŸÿ¼\?—µk×&ÖÕªU‹Ê•+—¸Ï–à7ï 5qâÄ:thäççÖªU«<ð@´k×n‡ÍÑ©S§øñ�œŸ6mZ¬]»6jÔ¨Q¦Þ7nŒ!C†ÄÌ™3õc�=6n¸á†÷ÛRÐgÛ¶mãÐC-v�=zDvvv"˜ü½÷Þ«° Ï‚‚‚øÝï~¯½öZ¢~à�Æ]wÝUªë3ØUúvzõÞüöi¿YÁƒ°ÛiuéÆŠ`»üñ=zt¢Ö¨Q£øãÿX¢p¤aÆźuë ××_}T­Z5es–V^^^¼ð ‰ZÛ¶mã€(uÏ Ä•W^3fÌHÔ³²²âàƒŽF�E•*UbÅŠñá‡Ƽyó _3uêÔ8ï¼óâì³ÏŽßýîw‘žž^ê9Šë�wÞ‰«®º*–.]š¨7mÚ4:wîõêÕ‹üüüX¶lYL›6-–-[ß~vcÇŽ�W_}5®¿þúèÝ»w¹Ï »£¼¼¼¸âŠ+â믿NÔ/»ì²ÈÊÊ*vŸÇ{,fÍšU¸8p`´iÓ&Uc¦ÌA¿ýío£S§N¥îqÎ9çDÏž=côèÑñ¯ý+.\¸Í×W®\9 ÜbxfªmÆYÚëÞ-íô Û6eÊ”¸ä’K"77·°V¹rå¸óÎ;KZ™*Ç|"è3777¦OŸÝ»w/uÏM›6Åå—_“&MJÔ»ví·ß~{TªT©Ä=·<úÃþ°D=*Uª]ºt‰±cÇÖÞÿýÏ’*7Þxc<÷Üs‰ZÛ¶mãÏþsÔ¬Y³b†‚DÐ'[äÁ ”^€â7n\ÜtÓM‰ZíÚµcÔ¨QQ¯^½b÷yî¹çâí·ß.\Ÿxâ‰e 3H¥‰'Æòå˵>}ú”ºßgŸ}çœsNafDDƒ bèСѫW¯--|ôÑGqË-·Ä;ï¼SX{â‰'bݺuE>ÿT{å•WâÒK/�¼¼¼ÂÚW_}õÃ/ âµ×^‹›o¾9,Xëׯ�«¯¾:ÒÒÒâÔSO-×y`wtÓM7Å”)SµÃ?<úõëWì ,ˆ»ï¾»pݼyó¸ð S6c*MŸ>=gžyf 0 TÁ›ùùùñî»ïÆ”)SbñâÅÛ}}nnnÜwß}1yòä¸øâ‹£[·n¥½Ø¾pQú ÏjÕª© ú€­ûðÃãüóÏOü»8===n¹å–8úè£+d¦Î�;©-Y²¤Ôý âꫯŽW^y%QïÔ©SÜÿý¥¾îhÔ¨QÌ�;7QkÛ¶m‰ûl¾gåÊ•‘——;6vðöÛo�Ç�9昸뮻¢J•*[Ü“––Ç{ltéÒ%Î;85kVD|2qýõ×Ç!‡Íš5+—y`wôøã�ÇèÑ£µF�ÅÿøÇHKK+vŸaÆ%­®¿þúR‡<•Vvvv 4(Qûæ›obÅŠñá‡ÆÂ… ë999qï½÷Æ¿þõ¯¸çž{¢}ûöÅ>gÁ‚qå•WÆŒ3õ¬¬¬8øàƒ£Q£FQ¥J•ÂsçÍ›Wøš©S§Æyç�gŸ}vüîw¿‹ôôôÒ½Y`§óé§ŸÆÀ�ã›o¾IÔ‡^nß­Gýúõ‹ÔV¬XQê~Ç�ýë_‰ZÛ¶m㡇Šš5k–ºoëÖ­ê‰øö{¼’ÚÒžU«Vmñs(/þóŸã�HÔ²³³ãÑG�† î°9 " ú€©÷æ·O_üfÂn¥Õ¥+z*À”)Sâ’K.‰ÜÜÜÂZåÊ•ãÎ;ïŒC=´D½n¼ñÆX¹reáúòË/� ¤jÔ2ÉÉɉ &$jGqD©ƒž~úéøä“O ×iiiqÇwl3äó;éééqýõ×ÇÌ™3cΜ9…õ;ï¼3N8á„}×È‘#�`{íµWŒ9r«!ŸßW§N�¸çž{â'?ùIlذ!""Ö­[÷ßÜtÓM)ŸvGãÆ�+òïÍÚµkǨQ£¢^½zÅîóÜsÏ%B™N<ñÄèÞ½{Êæ,®½÷Þ;®¼òÊ­þ|öìÙñÀÄË/¿\Xûâ‹/â¼ó΋¿ÿýïѺuëížñÙgŸÅ9眓VoРA :4zõê•*U*²ç£�>Š[n¹%Þyç�ÂÚO<ëÖ­+·ë–êÕ«'Öß]/•Ôúõë‹ÔjÔ¨Qª^°;›?~ôïß?ñTDÄo~ó›8ãŒ3*f¨ÿ§   H­´ßóÜzë­ñ÷¿ÿ=QkÙ²e<òÈ#‘™™YªžßÙgŸ}ŠÔ¶4ûö¤òý–ÆèÑ£cäÈ‘‰Z½zõâÑG�¦M›î°9 ¢y¤ìD>üðÃ8ÿüó�éééqË-·ÄÑG]¢^o½õVŒ;¶pݹsçèÛ·oªF-³±cÇ&ÂL#"N;í´R÷ûÇ?þ‘XwïÞ=:vìXìý1hРDmþüù1uêÔRÏ´5+V¬ˆW^y%Q;÷Üs£fÍšÅîѸqã8å”SµqãÆÅÆ�, Û3qâÄ:thäççÖªU«<ð@´k×®Ø}V¬X7ß|sáºN�:qõÕW§tÖTÙÿýã®»îŠßÿþ÷‰°§•+WÆUW]•ø,¶dãÆ�qÉ%—$B>›6mÏ>ûlœ|òÉ[ ùŒˆhß¾}<òÈ#qúé§'êÿüç?cܸqexG[·ygiƒ>·´OÐ'$-Z´(ú÷Fˆˆ¸øâ‹£ÿþ4Õÿ﫯¾*R+I¨ûwî¹çžxøá‡µÆ�Ç£�>{íµW©çûΖ®AW¯^]â>›ïIKK+siq=ûì³ñ‡?ü!Q«S§N<òÈ#ѦM›2ì,2*zà[Ÿ~úi 80¾ùæ›D}øðáÑ«W¯÷›>}zbÝ AƒøÓŸþT¬½Ÿ|òI‘Úƒ>µk×.\שS'\â¹¾3f̘ĺnݺ%3ýΪU«bΜ9‰Ú‘GYâ>GqD‘ÚôéÓãÐC-Õ\[3mÚ´Ø´iS¢Všy�<òÈDÀéúõëãã�?ŽN�:•yFØ]M™2%.¹ä’DàxåÊ•ãÎ;ï,ñ¿óo¼ñÆX¹reáúòË/� ¤jÔrÑ·oßøâ‹/âÏþsaíƒ>ˆ &ıÇ»Õ}O?ýtâ1---î¸ãŽÈÎÎÞî™éééqýõ×ÇÌ™3×lwÞygœp ‰àÑTØ<Œsýúõ‘——%‹ÛÙüº|K½`O¶|ùò8ï¼óbáÂ…‰ú€bÈ�!4UÒæß�ED‰ƒ9{챸ûôxôÑG£qãÆešï;�:uŠúõë'‚I·ôýÜöl¾§Aƒ[ dO¥ÿûßqÍ5×DAAAa­F�ñç?ÿ9Ú·o_îçÃÎFÐ'ìæÏŸýû÷OEEDüæ7¿‰3Î8#%g¼úê«eÚÿä“O&ÖMš4)uÐçœ9sbÖ¬Y‰ÚI'�•+W.U¿/¿ü2$Ñ´iÓ÷ÉÊÊŠÚµkÇ×_]X[²dI©fÚ–/¾ø¢H­4óniOyÌ »‹?ü0Î?ÿüX·n]a-===n¹å–Ž¿õÖ[1vìØÂuçÎ�£oß¾©µ\ýò—¿Œ'žx"Ö®][X{ñÅ·ôùýpñˆˆîÝ»GÇŽ‹}fFFF 4(®¼òÊÂÚüùócêÔ©)Uoذab]PP‹/.ñõÖ¢E‹¶ÛöT«V­ŠAƒÅ矞¨÷íÛ7†Z1CmÁK/½”XW®\9:wî\ìýÿøÇ?âæ›oNÔ²²²â‘G‰–-[¦`Âo¥§§G�=âé§Ÿ.¬½óÎ;%ê‘——ï¾ûn¢vÈ!‡¤d¾myã�7âÊ+¯L<Ô¦jÕªqÿý÷ÇATîçÃÎHÐ'T°E‹EÿþýcÙ²e‰úÅ_ýû÷¯ ©Êט1cŠÔúôéSê~ßëúNµjÕJÕ«Zµj‰ Ï�7–z®­Y¿~}‘ZÕªUKÜgKï±<æ€ÝÁ§Ÿ~Œo¾ù&Q>|xôêÕ«Äý¦OŸžX7hÐ þô§?kï'Ÿ|R¤öàƒFíÚµ ×uêÔ)u¨úöÔ¨Q#ºuëãÇ�/¬Í˜1c«¯_µjUÌ™3'Q;òÈ#K|îGQ¤6}úô”}¶nݺHmÑ¢E) úlÓ¦M©ç€ÝÅúõë㢋.*rMsòÉ'ÇðáÃ+hª¢¦OŸ¯½öZ¢vÐAE­ZµŠµܸq1lذD­V­ZñÐCEÛ¶mS6çwzõê•úüïÿ“'OŽ®]»kÿþóŸ"ß/vØa)�qsï¾ûn\rÉ%‘››[X«\¹rÜu×]ñÃþ°\φ�™ O¨@Ë—/�óÎ;/.\˜¨0 † RAS•¯¼¼¼xá…µöíÛGûöíKÝ333³H-''§Ä}òóócåÊ•‰ZݺuK;ÖVÕ©S§H-'''6lX¢>+V¬(RËÊÊ*íX°Ûš?~ôï߿ȿçó›ßÄgœ‘’3^}õÕ2íòÉ'ë&Mš”[ÐgDD³fÍ믾új«¯ýòË/£   Q+ihfÄ·×)µk×N„ª/Y²¤Ä}¶gKAŸsçÎ�.]º”¨Ï¼yóëºuë–˵!ìJ6nÜ·Ýv[Ìž=;Q?î¸ãbĈ‘–––²³¾ h/n0ç÷-Z´(.¹ä’"õâ>Tg„ qÕUWE~~~a­zõê1jÔ¨èØ±c‰ç)ŽnݺE—.]â½÷Þ+¬ ><ž}öÙí>ÐfÕªUqË-·$jYYYqÒI'msß_|Ç{l¢Ö»wï1bÄvç�9sf\pÁ‰ÚTªT)n»í¶8ú裷»vgé=ì©V­Zýû÷�Ï?ÿùä“Dýä“OŽáÇWÐT;Ƙ1cëÊ•+ÇI'�T¦žYYYѺuë˜7o^aí¥—^Š+¯¼2ªV­ZêÙ"¢\:wîiiiQPPPX{î¹çâG?úQ±{ÄsÏ=—¨eeeÅ>û쓪1`—·|ùò8ï¼óbáÂ…‰ú€bÈ�!4ÕÎaóàÓ-§'33³H-''§ÄgæççÇÊ•+µºuë–¸Oqyä‘ñ·¿ý­pýÞ{ï•hÿºuëâÃ?LÔŽ>úèTŒ»¬úsþÓÿ› ÏÎÈȈ-ZÄ]wÝUªž:tˆž={nõç«V­Š»ï¾;î½÷Þ8øàƒ£[·nѾ}ûhÙ²eÔ©S'jÔ¨kÖ¬‰¥K—Æ´iÓbܸq1cÆŒ"}5j·ß~ûvçÉÉɉ_þò—±aÆD½}ûö1iÒ¤˜4iR‰ßcDÄ Aƒ¶xMµ¹Î�;Ç9çœ�?þxamòäÉqüñÇǹçžGuT4nÜ8òóóã‹/¾ˆ &Äã�?_ýu¢O·nÝbàÀ�¥šµ8 P亮U«Vñßÿþ7n»í¶RõìÛ·o4kÖ,ÓAÅô ;ØÆ�ã¶Ûn‹Ù³g'êÇw\Œ1"ÒÒÒ*h²ò—““&LHÔŽ>úè¨W¯^™{uÔQ‰ ÏeË–ÅÝwßW^ye±öÏœ93žzê©D­Q£F±ß~ûmsß³Ï>W_}u¢vóÍ7GŸ>}¶ºg¯½öŠý÷ß?fÍšUX{õÕWã�7Þˆ£Ž:ªXóþõ¯�9sæ$jGqD¤§§k?ìîV­Zƒ ŠÏ?ÿ¿“ŸŸS¦L‰)S¦”øŒ&MšÄ¨Q£";;{»¯]³fM¬Y³¦Hýý÷ß�÷ß¿Äg§_¿~Å úŒˆ:th,Z´(^}õÕÂÚŠ+âŽ;îˆ;î¸c»û;tèúÓŸ¢R¥J¥w»–.]Z¤6oÞ¼Äws%uÄGúd·áZØ‘ò7Å�wÞY$äóÈ#�Œ‘#G–ë/àï ÆŽ[$Üi[�˜%qî¹çF•*Uµ|0î¹çžÈÏÏßæÞwß}7Î?ÿü"³�þùå¼ú‹_ü"±.((ˆË.»,â°5�?þxÜrË-‰Zzzz <8¥3À®jýúõqÑEÅ'Ÿ|’¨Ÿ|òÉ1|øð šjçñÊ+¯Ä¢E‹µ£�>z«¯ÏÊÊŠÖ­['j/½ôR‘ Ìí3fL‘Ú¡‡Z¢ÅÕµk×"aòÅ !ËÏÏ�Ñ£G'jíÛ·�-Z¤l> ü¥¥¥Å©§žÏ?ÿ|ì»ï¾=N±U®\9î¼óÎèß¿‰èrâ‰'ÆèÑ£SòP ô2*zؓԟóŸ˜þßé‰ZFFF´hÑ"îºë®RõìСCôìÙ3ã•»ÍÃ�4hGydJz7nÜ8÷ÜsO¢~÷ÝwǸqã¢_¿~ѵk×hذaT©R%rrrâƒ>ˆqãÆÅøñ㣠  ±ï€ˆÓO?=%³mIÏž=ãÉ'ŸŒÉ“'ÖÖ¬Y]tQtïÞ=N9å”8ðÀ£~ýú±iÓ¦X¶lYL�:5þñ�ĬY³Šô;ûì³£mÛ¶å6/ì*6nÜ·Ýv[‘`õãŽ;.FŒQn!Þ;Ò¢E‹bï½÷.ÕÞ Äþð‡D­råÊqÜqÇmsßQGóæÍ+\/[¶,î¾ûî¸òÊ+‹uîÌ™3ã©§žJÔ5jûí·ß6÷=ûì³qõÕW'j7ß|óvÃâ+W®ƒ J„£¿òÊ+1a„8æ˜c¶¹÷‰'ž(r½uÑEms�z­ZµŠ‘#GÆäÉ“cúôé1o޼شiÓv÷5iÒ$Ž=öØ8ûì³w٠ŒøÍo~'�tRŒ5*^{íµ"¨ùNµjÕâ°Ã‹ .¸ <ðÀ<)°%‚>¶"///ÞÿýX°`AäääĆ ¢víÚѲeË8ðÀ£V­Z=b™mذ!þûßÿÆÜ¹scåÊ•±fÍš¨Y³fÔ©S'Zµjûï¿T®\¹¢ÇØ­d¬_U¤–——�?þx©{öîÝ{—úœ3gN‘À¤“O>922R÷kÏC† ‰ÿýïñüóÏ'êóæÍ‹›nº©Ø}š7o£F�*×߯IKK‹{î¹'Î:ë¬øä“O?{ûí·ãí·ß.v¯c�=6~ó›ß¤zDØõäoŠ;ï¼³HÈç‘G#GŽŒJ•*UÐ`©uÜqÇÅgœg�uV´nݺØûÆ�×_},]º4Q?ï¼ó¢qãÆÛÜ{î¹çÆèÑ£cãÆ�…µ|0ªU«^xa¤§§ouï»ï¾¿ú՝ЄS�þùå¼zÖYgÅc�=K–,)¬]uÕUqÿý÷Ç¡‡ºÅ=/¾øbüñ�LÔ8à€øñ�\nsÀ®bÉAýbì­—GDÄþûïÕ«W/×óªU«'žxbœxâ‰ñmVÊgŸ} .Œ¥K—Æš5kbÆ Q£F�¨S§NÔ«W/:tè 6,õ™M›6�9sæ¤ê-”Y‡⮻kׯŒ3â³Ï>‹¯¿þ:222¢^½zѸqã8è ƒ¢jÕª¥ê_Ú÷»3}F°3ô ìÔrrrâÃ?Œ>ø fΜ~øa,[¶,ñš!C†ÄÅ_œ²3çÎ�÷Ýw_¼þúëñÍ7ßlñ5•+WŽ£Ž:*Î?ÿüèÔ©S©Î9çœsâÝwß-˨1mÚ´¨Y³f±^›ŸŸS§N�7ß|3Þyç�˜5kÖ6ŸRQµjÕèÞ½{œ{î¹Ñ­[·2ÏZ=zôˆ… ¦´gïÞ½cĈ)í @ñ�3¦H­wïÞ)=#---n½õÖhß¾}Ü~ûí‰ ªâêÙ³g ><233S:Û–Ô©S'þþ÷¿Ç�7ÞÏ>ûl‰÷gddÄ…^\pÁn\eQÎbú§'jÑ¢E‹¸ë®»JÕ³C‡;]¨úÆ�ã‰'žˆ'žx"ÚµkGqD´oß>öÙgŸÈÊÊŠZµjE^^^|ýõ×1þüøàƒbܸqEÂÅ#":uê^xávÏlܸq <8î¹çžDýî»ïŽqãÆE¿~ý¢k׮ѰaèR¥Jäääž;~üø(((Hì;à€âôÓO/Û±U«V�믿>~ùË_ÖV¯^ç�w^ôéÓ'N=õÔhÙ²eäææÆ¼yóâ©§žŠÿû߉Y«T©¿ÿýïËuN xªV­íÚµ‹víÚUô(;\�5â°Ã‹Ã;¬¢GŠAÐ'°Ó7n\Ì›7/,X_|ñÅ;wÓ¦Mqë­·Æã�?¾ÍðˈˆÜÜÜxõÕWcüøñqÎ9çÄUW]U®OæL…Ûn»-ž{î¹"A©Û²aÆxíµ×âµ×^‹îÝ»ÇÍ7ßÙÙÙå8eùÚÖSÀ(_yyyñ /$j:tˆ¶mÛ¦ü¬´´´0`@ôìÙ3ž|òÉxþùçãË/¿Üæžš5kÆ1ÇgžyfrÈ!)Ÿi[jÕª7ß|sœuÖY1zôèxõÕWcõêÕÛܳ×^{ÅI'�gžyf4kÖlM ;¿Œõ«ŠÔòòòâñÇ/uÏÞ½{ïtAŸß÷ñÇÇÇ\ª½�;wއz(jÔ¨Q¬×2$þ÷¿ÿÅóÏ?Ÿ¨Ï›7/nºé¦bŸÛ¼yó5jÔùí=zÄW\#GŽ,¬åææÆSO=O=õÔ6÷¦§§Çˆ#¢C‡å=&°ô ìtF�½ÃÏ\¿~}\tÑEñÖ[o•h_AAAüõ¯� ÄÝwß½S‡}Ž3&–/_^êýo¿ývœrÊ)ñ׿þµ\nžØºuëVÑ#Ä’ƒúÅØ[/�ˆˆý÷ß?ªW¯^ÁmYŸ>}¢OŸ>)ë—‘‘o¿ývÊúÇÞ{ï—]vY\vÙe±dÉ’øàƒ⫯¾ŠÕ«WǦM›¢víÚ‘™™ûì³O´mÛ6ÒÓÓKuNª>«8 n¾ùæ¸é¦›bÞ¼y1gΜÈÉɉo¾ù&ÒÒÒ¢N�:Q¯^½Øÿý£iÓ¦e>ØsU«V-.ºè¢0`@dd?‚&---n½õÖhß¾}Ü~ûí±qãÆŸÝ³gÏ>|xdff–xoi <8êÖ­7ÜpC¬_¿¾X{233ã–[n‰cŽ9¦œ§v7‚>"âúë¯/òY­ZµøÙÏ~?þñ�£yóæQ¥J•X´hQ¼ùæ›ñ—¿ü%–-[VøÚ &ÄÍ7ß×]w]©g8ꨣJ YÚpÑ*UªD·nÝ¢K—.qÐAEvvvÔ­[7Ö®]Ÿ}öYL˜0!žzê©X»vmážœœœ0`@üóŸÿŒìììR�[\ýúõÛîSG·eôèщÙk×®?þñ�S1» ìììrÿ�˜TIKK‹6mÚD›6m*z`'õúë¯Ço¼“&MŠ3fÄ’%K¶»'###Ú·o'Ÿ|rœtÒIQ·nÝR��–– ˆž={Æ“O>Ï?ÿ||ùå—ÛÜS³fÍ8æ˜câÌ3ÏŒC9¤Tç–Õé§Ÿݺu‹ûï¿?Æ�ëÖ­Ûâë233£wïÞqþùçG½zõvð”Àî@Ð'°Ó«Q£FpÀqÀDÇŽã²Ë.KiÿqãÆÅ˜1cµ-ZÄC=Í›7OÔ333£]»vñ³Ÿý,.»ì²˜8qbáÏF�'žxb|ðÁ¥šã'?ùIJŸpº5-[¶ŒŸýìgqÊ)§lñË÷ZµjEÆ £k׮ѿÿøÕ¯~Ó§O/üù²eËâ–[n‰?ýéOå:çàÁƒK½wΜ9ñàƒ&j'œpBT«V­¬c°[rP¿{ëå±ÿþûGõêÕ+x¢-ëÓ§O™~·xï½÷Ž~ýúE¿~ý""béÒ¥1þüX¸pa¬\¹2Ö­[•*UŠZµjEíÚµ£E‹±ß~ûEÕªUSõbï½÷ŽË.»,.»ì²X²dI|ðÁñÕW_ÅêÕ«cÓ¦MQ»víÈÌÌŒ}öÙ'Ú¶mééé¥:§¬ŸÕ÷5mÚ4n¼ñƸîºëbÆŒ1wîÜX½zu¤¥¥Eݺucß}÷�Ž;FF†X ôü‰Øé´iÓ&Z·nGqDrÈ!ѺuëÄ—¶© ú,((ˆ{ï½7Q«U«V<úè£Ñ¤I“­î«U«VÜ{ï½Ñ·oߘ={va}äÈ‘1zôè”Í—J�7ŽK/½4úôé•*U*Öžìììx衇¢_¿~ñé§ŸÖÇ�^xaì³Ï>å5n™lÜÑ»wï ˜Ê_Æ £aÆѥK— 9?;;;²³³+äìÒ¨ZµjtíÚ5ºvíZÑ£»¡Ò=æ ýáˆþýûÇÉ'Ÿûì³O©ŸÌTo¿ývÌ�;7Q»è¢‹¶òù�*UªÄðáõ)S¦Ä¤I“R:cª<ùä“qúé§;äó;µjÕŠk¯½¶H}üøñ©-¥òòòâ…^HÔZµjtPMì)}{´·ß~;±®R¥Jüô§?-öþN�:EÇŽµ_|1%³¥ZI>¿¯k×®EÂO§M›VÖ‘ÊÅĉcùòå‰ZŸ>}*h`O"èØ£M�:5±îСCÔ©S§D=ºuë–X¿öÚk‘ŸŸ_æÙv6mÛ¶M¬—-[VA“lÛ˜1cëJ•*Å)§œRAÓ{’ŒŠ "-Y²$±Þ<̲86ßóÕW_ÅÌ™3£sçÎem§S­ZµÄzíÚµ4ÉÖåääÄ„ µÃ;,²³³+h"Ø}Ô{³[DD,~³‚a·ÓêÒ�=¤LzEP‘V®\™XשS§Ä=¶´çã�?.íH;­E‹%Öõëׯ I¶nìØ±‘›››¨õéÓ§‚¦ö4=@E*((H¬ÓÒÒJÜcK{æÎ�[ªY>ù䓸ðÃcùòå±nݺÈÌÌŒ¬¬¬hݺutèÐ!*UªT⾩ðõ×_ÇG}”¨5oÞ¼BfÙ–1cÆ$Ö™™™ñ£ý¨‚¦ö4‚>€=Z�:ubÙ²e…ëU«V•¸ÇêÕ«‹ÔJôyÝu×E^^ÞV^³fÍ8üðÃcàÀ�qà�–¸Y¼øâ‹±aÆDíˆ#ŽØ¡3lÏœ9sbÖ¬Y‰Z¯^½¢J•*4ÀÖÕ{³[DD,~³‚a·ÓêÒ�=À-½¢¨H 4H¬ÿûßÿ–¸Ç§Ÿ~Z¤¶dÉ’÷ÙVÈgDÄš5kâå—_Ž3Î8#.¸à‚X±bE‰Ï(� 6ĨQ£µZµjÅ‘G¹CÎ/®1cÆ©õîÝ»&öT=@EêÔ©S|ôÑG…ë?ü0¾ù曨U«V±{üßÿý_‘ÚÚµkS2ßÖL˜0!z÷î£F�ŠvíÚ•ëYwÜqG,\¸0QûùÏ^¢Ï¨¼åååÅ /¼�¨í»ï¾Ñ©S§ š€ŠRïÍn±øÍ „ÝN«K7VôÀ.@Ð'°GûÁ~O=õTázÆ 1f̘8çœsеÿ£�>Š3f©—$è³eË–qÌ1ÇÄAûî»o4hÐ jÔ¨ß|óM,]º4¦M›/¾øbLž<9±oñâÅ1xðàxúé§#;;»Øç•ÄĉãÑGMÔš5kƒ *—óJkâĉ±|ùòD­wïÞ4 °§ô ìÑŽ=öب[·näääÖî¾ûî8î¸ã¶ž™——Æ ÛâÏÖ¬Y³Ý³{ôè—]vY|ðÁ[üyVVVdeeEÛ¶m£_¿~1yòäøõ¯K–,)|Í’%KâòË/�Ñ£Go÷¼’úüóÏãÊ+¯Œ‚‚‚ÂZ¥J•bĈQ½zõ”ŸWcÆŒI¬322â”SN© i€=UzEP‘ªW¯gŸ}v¢¶jÕª0`@,^¼x«ûÖ¯_—]vY¼ÿþû[üyZZÚvÏîß¿ÿVC>·¤k×®ñÌ3ÏDãÆ�õ)S¦Ä믿^ì>Å‘““çŸ~¬Zµ*Q¿ôÒKãÐCMéYe•““&LHÔŽ8âˆhРAMì©}{¼ÁƒG‡µÿþ÷¿q 'ÄwܳfÍŠo¾ù&6lØŸþy<ñÄq 'ÄþóŸÂ××­[7±¿N�:å2kÆ ãÎ;ï,$úÈ#�¤ìŒ5kÖÄàÁƒãóÏ?OÔûôéƒNÙ9©2vìØÈÍÍMÔúôéSAÓ{²ŒŠ ¢U©R%î¼óÎ8÷ÜsãË/¿,¬¯Y³&î¿ÿþ¸ÿþû·¹ÿÜsÏ�Å‹'‚?k×®]nóvêÔ)~üã'Λ6mZ¬]»6jÔ¨Q¦Þ7nŒ!C†ÄÌ™3õc�=6n¸á†2õ./cÆŒI¬³²²âè£�®˜a€=ZzE°3hÖ¬YüãÿˆÎ�;{Ozzz 0 ®¾úêX³fMâg™™™)ž0éøã�O¬ssscúôéeê¹iÓ¦¸üòËcÒ¤I‰z×®]ãöÛo�J•*•©y˜3gNÌš5+Q;餓¢J•*4°'ô ðÿìµ×^ñä“OÆŸþô§Øÿý·ùÚ<0þò—¿ÄСC#===V­Z•øy›6mÊsÔ-’.Y²¤Ôý âꫯŽW^y%QïÔ©SÜÿýQµjÕR÷.OcÆŒ)RëÓ§OL‘QÑìLÒÒÒ¢W¯^Ñ«W¯XºtiL�:5–-[999‘‘‘�7ŽC9$š7o^¸§   æÍ›—èÓ±cÇr�³~ýúEj+V¬(u¿áÇǿþõ¯D­mÛ¶ñÐCEÍš5KÝ·<åååÅ /¼�¨í·ß~Û i(/‚>¶¢aÆѳgÏí¾î‹/¾ˆµk×&jåôYPPP¤–––Vª^·ÞzküýïOÔZ¶l�<òHdff–ªçŽ0qâÄX¾|y¢Ö§OŸ š "½¢ØÕýßÿý_b]¿~ýh×®]¹žùÕW_©Õ«W¯Ä}î¹çžxøá‡µÆ�Ç£�>{íµW©çÛÆŒ“XW®\9N>ùä š@Ð'@™=ÿüó‰õ)§œåzæôéÓ‹ÔJÌùØc�ÅÝwß]¤Ç£�>�7.Ó|å-'''&L˜�¨uÔQ¥ ;HAŸe0{öì˜2eJ¢vúé§—û¹/½ôRb]¹råèܹs±÷ÿãÿˆ›o¾9QËÊÊŠGy$Z¶l™‚ Ëר±c#777QëÝ»wMð-AŸ¥”ŸŸ¿ÿýï#??¿°vüñÇGëÖ­ËõÜéÓ§Çk¯½–¨tÐAQ«V­bí7n\ 6,Q«U«V<ôÐCѶmÛ”ÍYžÆŒ“Xׯ_?Ž>úèŠàÿô P qíµ×ÆôéÓ kµk׎ßýîwÛÝûÍ7ßÄ7ß|Sªs-Z—\rI‘zÿþý‹µ„ qÕUW%ÂI«W¯£F�ŠŽ;–j¦íyöÙgc¿ýöKüçÙgŸ-u¿9sæÄ¬Y³µ“N:)222Ê:*@™úˆˆx æÎ�[¬×.^¼8† Ï<óL¢þë_ÿ:²³³·»Á‚Ñ£G�¸çž{bÉ’%ÅžñÍ7ߌŸþô§±téÒDý�C‰=zlwÿäÉ“ãW¿úUäååÖªT©÷Ýw_zè¡Åž£¢�3¦H­OŸ>0 @RFE°¹yóæÅäÉ“£Aƒ‘‘±ýË•I“&ņ ¶ø³:uêÄàÁƒ·ÛãÿøGÜ~ûí±ÿþûÇÑG;vŒ}öÙ'233#"bùòå1oÞ¼?~|¼üò˱víÚÄþŸýìgÑ·oßb¼»o­Zµ*î¾ûî¸÷Þ{ãàƒŽnݺEûöí£eË–Q§N�¨Q£F¬Y³&–.]Ó¦M‹qãÆÅŒ3ŠôiÔ¨QÜ~ûíÛ=/'''~ùË_ùœÚ·o“&MŠI“&{öï4hPág´#äååÅ /¼�¨uèÐ!öÛo¿6ÀÖúv: ,(æ¸-Ó¦M‹iÓ¦mñgMš4)VÐçwfÏž³gÏ.öë#"Î=÷Üøío[¢=ßÉÏÏ�)S¦Ä”)SJ¼·I“&1jÔ¨ÈÎÎÞîk׬YkÖ¬)Rÿý÷ãý÷ß/ñÙßéׯß úœ8qb,_¾=æÍ››6mÚî¾&MšÄ±ÇgŸ}v´hÑ¢ÄçîêV®\&LHÔzôèYYY3Àf};�£Ž:*Ž:ê¨Øÿý£zõê;äÌž={FÏž=#"bÁ‚1oÞ¼X¸pa|óÍ7±iÓ¦¨Y³f4nÜ8ößÿhܸq™ÎªV­Zœxâ‰qâ‰'FDĆ â³Ï>‹… ÆÒ¥KcÍš5±aƨQ£FÔ©S'êÕ«:tˆ† –ú̦M›Æœ9sÊ4wiõéÓ'úôéSæ>YYYñᇦ`"€ò!è`3Íš5‹fÍší°óªV­íÚµ‹víÚí°3H½ôŠv‚> }@ ú€ô ) èR@Ð'¤€ OH�ŒŠ`sõÞì‹ß¬àAØí´ºtcE�ìÆÒ+zØú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR £¢€=Éÿþ÷¿˜9sf,^¼8rss£N�:Ѻuë8øàƒ£jÕª=ÀÃ}�”AŸ°¼úê«qß}÷ŬY³¶øó5jDŸ>}⢋.Šzõêíàéöîë <¥Wô°;Û¸qc\yå•qÑEmõfЈˆµkׯO<½zõŠ÷Þ{oN°gp_';‚ O('ùùùqé¥—Æ /¼�¨WªT)š6míÛ·�Úµk'~¶bÅŠ4hPLŸ>}GŽ °[s_';Š O('=ôPŒ?>Qëׯ_L˜0!Æ�Ï=÷\¼ûî»qÏ=÷DãÆ� _³nݺ¸ôÒKã믿ÞÑ#ì–Ü× ÀŽ"èÊANNN<ðÀ‰ÚW\Ç�ìììÂZzzzüøÇ?Ž'Ÿ|2š4iRX_¼xq<úè£;l^€Ý•û:Ø‘}B9x衇bÍš5…ë.]ºÄ Aƒ¶úúììì¸ñƵÇ{,rrrÊmF€=�û:Ø‘}BŠåççdzÏ>›¨ 2$ÒÒÒ¶¹¯[·nq衇®×¬Y/½ôR¹Ì°'p_';š OH±iӦŊ+ ×Íš5‹®]»kïOúÓÄzüøñ)� `Oâ¾Nv4AŸ�bo¼ñFb}Øa‡m÷©ïßí÷Mž<9Ö®]›²Ùö$îë`Gô )öÑG%Ö|p±÷fggG“&M ×¹¹¹ñßÿþ7e³ìIÜ× ÀŽ&èRlÞ¼y‰u›6mJ´Ÿ}öÙf?ŠÇ}�ìh=ìNÖ¯__~ùe¢¶÷Þ{—¨G£F�ëÏ>û¬Ôó©åå啺lIVU™Ñ¤^~嬊�ÝTnnnE�P"®µ(®µ(/®µ€]�k-Ê‹ë-ʃk-`WãZ‹òâZ‹òâz‹TÙÒ½Y[º‡ Øqv¦û:ÝÓÉŽàÏc”£¼øó°+q­Eyq­Eyq­ìJ\kQ^\kQ^\k»×[”×Z”×Z¤REß×)èR('''ñàÊ•+GýúõKÔ#;;;±þꫯJ=ϦM›ŠÔfÏž]ê~°%¯ôi´ýA ­Œ—*zvS+gάèJĵåÁµåŵ°«q­Eyq½Eyp­ìj\kQ^\kQ^\oQž¶t°ãìL÷uº§“ÁŸÇ(/þ!…6nܘXW®\¹Ä=ªT©’X¯_¿¾L3ì‰Ü× @EȨè`w²ùÍœ¹¹¹%î±ùM¥¥yzü÷÷î¿ÿþ‰Z¥J•"--­Ô=(ª   6mÚ”¨•åþ/ ìv¦û:ÝÓ °ãTô}�‚>!…jÖ¬™Xoذ¡Ä=6ßS£F�RÏ“žžÕ«W/õ~€]ÕÎt_§{:öé=ìN6¿ysýúõQPPP¢k×®ÝfO¶Ï}�TAŸ�BuëÖ�´´´Âunnn|õÕW%ê±dɒĺ~ýú)™ `Oâ¾N*‚ OH¡jÕªEãÆ�µ/¿ü²D=-Z”X·nݺÌsìiÜ× @Eô )ÖªU«Äzîܹ%Ú¿ùëÝ P:îë`Gô )Ö¾}ûÄzúôéÅÞ»téÒX¸paáºråÊѦM›”Ͱ'q_';š OH±£�>:±ž4iRkïÛo¿�XwíÚ5jÖ¬™ªÑö(îë`Gô )vðÁGݺu × ,ˆÉ“'kï3Ï<“X÷èÑ#¥³ìIÜ× ÀŽ&èR,===z÷î�¨Ý{ï½Û}úû;ï¼S¦L)\׬Y3zöìY.3ì Ü× ÀŽ&èÊÁ Aƒ¢F�…ëwß}7|ðÁ­¾~É’%ñ»ßý.Q;÷Üs£^½zå6#ÀžÀ}�ìH‚>¡Ô«W/.¸à‚DmäÈ‘qýõ×Ç’%K kùùùñꫯF¿~ýbáÂ……õ† Æ€vؼ»+÷u°#¥Tô°;ÊÏÏ� /¼0&L˜�¨WªT)7nµk׎/¾ø"V¯^�øyµjÕâ‘G‰C9dGŽ °Ûr_';Š O(G6lˆ«¯¾:Æ�W¬×geeÅ]wÝ]»v-çÉö,îë`Gô ;ÀË/¿÷ß|ôÑG[üy�5âÔSO�!C†Dýúõwðt{÷uPž}Â4þüxÿý÷cÉ’%‘››uêÔ‰6mÚÄÁU«V­èñöîë <ú€H¯è`w è€ÿ�½ת®óÇÿç‚Íæ("8¢œÔ<¡Zaâ¡Ñ,''³°édæ 3ʹѬ&kÆr²L§)+;¨©¥™•šÚÇÉCÙ7(O�f¨ *š'@A”3lجßü¸c ÊaïÅÍÞûñ¸®}¹Ö½Öz¯×úÇëu/ž÷û @0Ñ'´}@h¨w¯eÁ‚yðÁ3iÒ¤<÷Üs™?~-Z”^½ze‹-¶È�!C2räÈì½÷ÞéÓ§O½Ëè°ä:Ö�‰>€ÍÞƒ>˜x 3fÌHSSS �vØ!ÿüÏÿœ~ýúÕ»<€vM¯P�¥K—æ÷¿ÿýZ{­ƒ>8»ï¾{½KØìMš4)W]uU~÷»ß¥©©i�ç766æÐCͱÇ›‘#Gn‚ :9€jé·ª!× Ðzr�¦(˲¬w@ç0{öì<þøã™3gNºwïží·ß>»ì²Ëkž?nܸ\pÁyê©§Öz¼K—.3fL>ó™ÏdÀ€U• Ð.赪3iÒ¤L�:5/¿ür­×5jÔk®*zÍ5×ä»ßýnæÍ›÷šcŽ=:ÿùŸÿ™�vÚ©ª²Ú­E‹åþçòË_þ2eYfõxSQkœÿêãEQäCúP>÷¹Ï¥wïÞ›¤f€öFΠZú�ד`ÈÊIDAT-€êÈulZr�ÇDŸ@å~øá\pÁ¹ÿþûóêÖc›m¶É‰'ž˜cŽ9¦Å—·‹/¾8ßÿþ÷“d�kVWE¶ÝvÛ\yå•Ùa‡*©`s¦×¨Îï~÷»|ãßÈôéÓ×8Ö½{÷|øÃΙgž™=z$YÙ[}ñ‹_ÌM7Ý´ÖЫ{¯-¶Ø"—^ziÞô¦7UøíËܹsóñ�<?üpʲ|Í^jmV?·(Šì±Ç¹âŠ+²å–[VZ3@{"gP-ý@uä:6=¹N€�g¢O R7ß|s¾øÅ/fÅŠ¯ù%­(Šüë¿þk¾õ­o%In¸á†|éK_ª[eÕõkûlРAùÍo~óš«mtDz-€ê\rÉ%¹è¢‹ÖùšQ£Få'?ùIºvíšK.¹$ßþö·kÇ’5ƒ ¯þ|Ë-·Ì-·Ü’ú§ªâ1Ú•+V䨣ŽÊßþö·$+{§²,Ó¥K—ì³Ï>yë[ßš]wÝ5ýúõKÏž=³xñâ¼òÊ+™:uj&Nœ˜‰'fÅŠµë’d¯½öÊ/~ñ‹µ®ÐÙÈTK¿P¹N€MO® uLô TæÁÌÑG�æææ$k¾ì~õÊ _ýêWsØa‡åàƒÎÂ… [œ;tèÐ 0 Ë–-ËŒ32gΜÚ«®ÿÈG>’/ùË›ôêE¯P�qãÆåä“ONòú?¢YÕ+}îsŸË{ßûÞ¼ãïHSSSíXïÞ½3bĈ½Ö”)S²|ùò½Öê?àèÌ®¼òÊ\pÁ-ú­Ã?ä:ZÇDŸ@eŽ<òÈL™2¥Å¶-¶Ø"Ûo¿}Š¢ÈÓO?�yóæÕ¾Œí´ÓNùЇ>”óÏ??EQ¤K—.ùøÇ?žcŽ9&[o½u‹±'Ožœï|ç;7n\íúîÝ»güøñÙrË-ëñ¸›”^  eYæ_þå_òì³Ï¶èµvÞyçì´ÓN)Š"Ó¦MËã�?^ë• ”}èC¹è¢‹REzô葳Ï>;ïÿûÓÐÐÐbü9sæä{ßû^®½öÚÚõ ùÃþ�m¶Ù¦� °Y(Ë2tPfÍšU rž}öÙ9öØc7x¬«®º*_ÿú×kýÖ6Ûl“ñãÇWP5@û!gP-ý@5ä:êC® õLô TâÁÌG>ò‘Ú—¬^½zåË_þrÞóž÷¤k×®I’+VäÖ[oÍW¾ò•,X° I²ãŽ;æÉ'ŸLQùßÿýß¼ûÝï~Ýû|ñ‹_̯ýë$+WÜúò—¿œ�|ä#Õ>@�鵪s÷ÝwgìØ±µ^kë­·ÎE]”Q£Fµ8ïÁÌgœ‘^x!I2pàÀÌœ93]»vÍOúÓ5εoûÛ¹ä’K’¬ìµþã?þ#Ç|%ÏÐÜÿý9úè£k?Êyÿûߟ¯}ík=Þ«ßmýìg?Ë[Þò–6© ½‘3¨–~  :r�õ!× Ðz]ê]Ð1Ý~ûíIR[•á;ßùNÞ÷¾÷Õ IÒ¥K—~øáùîw¿›Us�?õÔS)Š"tÐ: Iò_ÿõ_ÙrË-k_ xà� ž`ó¢×¨Îþð‡$+{­®]»æ‡?üáZÃ�{ï½w~øÃ¦K—•ÿÜ6sæÌE‘ý×]g4IN?ýôüÓ?ýS­×úÛßþÖ†OÐþüýïO’Ú»¬SN9¥Uã}ò“ŸL’Z¿õÔSOµj<€öLΠZú-€êÈuÔ‡\'@ë™è¨ÄäÉ““¬ü‚õ¦7½)o{ÛÛ^óÜýöÛ/ûì³Oʲ¬}Á3fÌzݧgÏžù—ù—ÚuS¦Li]áí€^  :«÷Z£G�Έ#^óÜÝwß=p@­_J’Ã?|½îÓÐÐ�w½ë]µk§N�ÚŠªÚ¿Ù³g×¶ ”¡C‡¶j¼¡C‡fðàÁµ~kΜ9­ =“3¨–~  :r�õ!× Ðz&ú*ñôÓO×¶ÿùŸÿy�çxà�-ößøÆ7®÷½FŽ™då*¾È��^  :Ï>ûlm{ÿý÷_çù£G�n±¿Ç{¬÷½V�[–e^yå•õ¾ #êÞ½{’•?Ìéß¿›Œ¹ú8���m2&@{$gP-ý@uä:êC® õLô TbþüùµíwÜq�çï°Ã-ö·Þzëõ¾×€Öz_€ŽJ¯P� Ô¶‡ ¶Îó_}ÎV[mµÞ÷Z=  ×:»!C†Ô¶ÛêÇ2«�³úø��œ@µô[Ց먹N€Ö3Ñ'P‰E‹¥(Š$IŸ>}Öyþ«ÏéÑ£Çzß«gÏžµíeË–­÷uí•^  :‹/®õZ½{÷^çù½zõj±¿!+Š®ZÝ4I–/_¾Þ×tD£F�J×®]S–ežþùÌœ9³UãÍœ93Ï=÷\’¤k×®5jT[” Ð.ÉTK¿P¹N€ú�ëh=}•(˲¶Ý¥Ëº[Žõ9€•ôZ›Æª`hkÏ`Ýúõë—w¾ó�IV¾ÿºâŠ+Z5Þ�üã”e™¢(òÎw¾3ýúõkƒ*Ú'9€jé·6 ¹N€MG® õükPwŸÿüçÓ»wï$ÉÏ~ö³ÜrË-5Îÿûÿ/×\sMŠ¢HŸ>}òùϾ-Ëèðä:ZÇDŸ@Ý <8ßÿþ÷Ó³gϬX±"Ÿÿüçóµ¯}-óæÍ[¯ëçÍ›—óÎ;/ÿñÿ‘²,Ó«W¯\|ñÅ4hPÅ•t,r�­ÓPkúôéë}î°aÃòío;çž{n¦OŸžŸýìg¹îºërÐAå­o}kvÝu×ôë×/=zôÈ’%KòòË/çñÇÏ„ 2nܸ,]º4eYfðàÁùò—¿œ¡C‡fúôéB¡‘ëØTLô Tæ�CIQ|]Q)Ë2K–,ÉwÜ‘;î¸ãuÏ/˲vÝôéÓsòÉ'×ö'Ož¼á…t0r�›†‰>€ÊM�:5 ¯ßv<úè£-öÿò—¿Ô¾°­Ë«¯èLôZչ뮻ò /¼î9O<ñD‹ý›nºi½ÇõµÝú¾“JR �®$}½ë‹¢X#tº!÷è,ä ª¥ß¨Ž\'@Û’ë¨VQú?P�áÇ×VbXßUVoK6få‡U÷š2eÊ_ О赪£×h{«÷Xõ ×:;ᆰ¥ß¨Ž^  íÉul¯¿,@+mÈ»õ]µa]×tz-€êèµÚΑGYïˆwßUÓoTG¯Ðvä:6 }•Û˜—Ú^„¬½@56$ØÙšLëµú)À¦tþùç×»þÿä ª¥ß¨†\'@Û‘ëØ4Lô TbРAõ. ÃÒkTgŸ}ö©w Ð¦ä ª¥ß¨Ž\'íUQZNZ­K½ €ŽÀDŸÐLô m ¡Þl¨3fdÖ¬YéÖ­[ �m¶Ù¦Þ%tJr�-™è¨‹ûï¿?O>ùd^~ùål±ÅÙsÏ=3räÈ×<Á‚ùñ�œo¼1/¾øb‹cýû÷ÏÛßþöwÜqÙe—]ª. C‘ëh;EY–e½‹€ŽhöìÙyá…ÒÜÜœþýûgàÀ�éÖ­[½Ë¨»o¼1ßþö·3kÖ¬5Ží´ÓNù¯ÿú¯ì»ï¾->ä‘Gò©O}*/¼ðB^+òTEºvíšã�?>Ÿýìg+©hŸä:ÖN® í™èh÷ššš2{öìÚþ AƒêX @ûQ–eî½÷Þ<ðÀ™={v²õÖ[g·ÝvËþûïŸÆÆÆz—PwË–-ËĉóôÓOgþüùÙj«­2bĈ >ü5¯ijjÊÕW_�_ýêWyæ™gZkllÌ[Þò–yä‘9âˆ#ª.`³ôŸÿùŸ¹á†^3Ô™$]»vÍ׿þõ¼ï}ïK’<óÌ3ùÀ>�yóæ%Yü\›UcE‘#�<2_ÿú×Û¸z^�L'ÀÆ“ëX7¹N€¶'× P }íÞ=÷Ü“±cÇ&YùÅnòäÉu®`ÓúÓŸþ”Ûo¿=Ó¦MËË/¿œ¾}ûfÏ=÷Ì‘G™‘#G®õš;î¸#ßøÆ72cÆŒµïÑ£G>ö±�åÔSOMÏž=«,`³´|ùò\~ùå¹ì²Ë²páÂ5Žï¹çž9çœsÖè·žy晜rÊ)yê©§^w5Ò$Ùm·Ýòýï?ƒnûØL]|ñŹøâ‹“ü£/Z½oZý³ÆÆÆ\ýõÙu×]ó±�},ùË_Z/Š"[n¹e’dîܹµÏV?þ•¯|%þð‡7Ùótv2�r�U�먆\'@uLô ´{÷ÜsON8á„$+¿ N™2¥Îl3gÎÌç?ÿùLœ8±öÙê/½“äÈ#�̹瞛nݺÕ>ûÎw¾“ýèG¯ù¢}õφšŸþô§Ùn»íª|€ÍÊ’%KòÉO~2÷Þ{ïë®FÚ­[·\tÑEyÇ;Þ‘$yñÅóoÿöo™5kV’×^�4ùGßµõÖ[çç?ÿy† Ö†O°yzòÉ'óÞ÷¾7ÍÍÍIþñ.kÏ=÷̰aòtéÒ<ôÐCyñÅSEʲÌÁœ“O>9GuTí³í¶Û.§Ÿ~z=ôÐl±ÅI’… æ�üc¾÷½ïåïÿ{íÜ-¶Ø"wÜqG¶Új«z>:@§!Ó tfr�Õ�먆\'@µºÔ»6ÜÌ™3sÌ1Çdâĉ)˲(X=tP–en¼ñÆœy晵Ï~ó›ßä‡?üaíeûêAÐÕÇXõÂü™gžÉÇ>ö±¼üòË›ðéêëK_úRî¹çž5z¦UV}¶lÙ²|ö³ŸÍ³Ï>›$ù¯ÿú¯Ìš5«E?•$}ûöÍ€Òµk×ZßµjÌÙ³g笳Ϊ…":²«®º*Ë—/¯íï±Ç¹å–[rýõ×ç[ßúV¾ÿýïgüøñùêW¿š†††E‘ñãÇçꫯnqͯýë¼ÿý﯅A“¤wïÞ9üðÃsóÍ7g¿ýö«õb ,ÈÍ7ß¼é€NI® :r�Õ�ë¨VQ¾Þrí€Õ߀Îè¸ãŽË}÷Ý·ÖÛWYB(Š"ç�w^Þóž÷äío{æÌ™S;Ö»wïì·ß~:th’dúôé¹çž{2oÞ¼׿ç=ïÉÿüÏÿlÒg¨‡»îº+'žxb‹>«¡¡!#FŒÈ Aƒ²dÉ’«‘&É»ßýîwÜqùЇ>Të¡vÜqÇœzê©9øàƒkA…¦¦¦L˜0!—^zi&L˜Ð¢ß:ÿüó3f̘z=6@åV¬X‘}÷Ý7 ,¨­Þþ›ßü¦E¨su7ÞxcÎ>ûì}YÏž=ó›ßü¦ö.ëµÌ�;7‡vX^yå•”e™áÇ禛njëG`-d:€ÎJ® r�Õ�ë¨^C½ `ÃÜ~ûík„A÷Þ{ïqÄ6lX–.]šI“&å—¿üeæÎ�›²,ó£ý(]»vmýÈG>’Ï~ö³éÓ§O‹ñ›ššòÃþ0?úÑ�jçÞrË-9þøã³çž{Öã‘6™«®ºªÅþ�˜óÎ;/Ûn»m‹Ïoºé¦œ{î¹Y²dIî¸ãŽtëÖ­vìŸÿùŸóÝï~7=zôhqMccc<ðÀxà�ùæ7¿™ÿøÇµ~ëÚk¯:´iÓ¦eþüù)Š"EQäÔSO}Í0h’y䑹üòË3mÚ´?Z^W4I¶ÜrË|ìcË÷¾÷½$Éc�=–… ¦wïÞmö<°Š\'@uä:ª!× P½.õ.€ ó‹_ü"É?V{?ýôÓó‹_ü"G}tÞö¶·å�ï|g>ó™Ïä·¿ýmvÝu×$ÉsÏ=—þð‡µ1N8á„|å+_Y# š¬ *üû¿ÿ{Î>ûìÚËö$¹þúë«~4€ºZ¸paþô§?ÕúŸ‘#Gæ’K.Y# š$cÆŒÉ7¿ùÍ”e™åË—çæ›oN’ 80ßþö·×ƒ¾Úg?ûÙpÀµžî¡‡ÊüùóÛø‰6S§NM’Úû¦Ã;l�×¼ãï¨õKIòÎw¾s½ï÷¯ÿú¯µí²,3yòä ¨ÖŸ\'@5ä:ª#× P½†ztL7ÝtÓ&»×O<±ÉîPo .̽÷Þ[ )tÐAùÔ§>µÖs �oûÛyßûÞ—æææ<óÌ3I’¡C‡æ¬³ÎZ罎=öØÜzë­ùë_ÿšdåŠó_þò—ÛèI6?�<òHV¬X‘$)Š"g�uVºvíúšç¿ãïÈ>û쓉'Ö®9æ˜cÖ{EÑSO=5wÝuW’•!…I“&å€håSlž^yå•ÚövÛm÷º«¾¯²Ë.»´Ø>|øzßï oxCz÷î�… &Ižþùì³Ï>ë}=@G"Ó P¹N€êÈuTG® z&ú*ñ…/|¡RØŠ¢h±ê@GõÈ#�Ôúž¢(râ‰'¾îù;í´SÞö¶·åÿûÿþ¿Ú5üàÓа~¯…>úÑ�Ö¡/¿ür¦OŸžAƒµâ 6_O?ýtm»OŸ>yë[ߺÎk9ä�Z 4I<ðÀõ¾ß›ßüæl±Åµß§OŸ¾Õ´/ ,H²òýÔV[mµ^×ôíÛ·Åþú^·ÊvÛmW›`fUÏÐÉtTG® :r�Õ‘ë¨^—ztleYn’?€Îbõ�B÷îÝó–·¼e�×ì»ï¾¯»ÿzÞö¶·%Ií?S¦LYïkÚ›yóæ%YÙû 2d½®6lX‹ýõ½nÕ}\ÛR:²Õ Ü¥ËúE–ºuëÖb¿±±qƒîÙ»wïÚöªà:3™N€¶'× P¹N€êÈuTÏDŸ@¥Š¢Ø¤«Àtt«¯�5tèÐõzyþêPÂ;ì°Þ÷ëׯ_Xû!Μ9sÖ¿X€vfùòåµíõ ¼:¤Ð½{÷ ºçê÷YýþÍêáÌMõC˜eË–Õ¶W¤tV2�mO® :r�Ց먞ÿÓ•X-Ë2Ý»wÏÈ‘#+»×¼yó2uêÔÊÆØœ,Y²¤¶½úKô×Ó«W¯û[l±ÅÝs«­¶Ê /¼�ä�T€ŽhUŸT–efÏž½^×¼ú3/½ôR¸Þ÷|饗jÛ}úôYïëÚ›U=RY–™1cÆ&¹ç¼yójÛz- 3“騎\'@uä:ª#× P=}•Ø~ûíóôÓO'Iš››sùå—¯÷jYêž{îÉ 'œPÉØ››ž={Ö¶—.]º^׬úÁÎkí¯K�=6øžíÑ6ÛlSÛž>}z^|ñÅŸ­Í<ÐbÿÁÌ»Þõ®õºßìÙ³óüóÏ×ú³­¶Új+h?\Û^ºtiž}öÙ :ôu¯Ùn»írì±ÇnÔý–/_^û‘óª±:+™N€êÈuTG® :r�ÕëRiäÈ‘)Ë2ÉÊPèäÉ“ë\@ǰå–[&Y¹BÖ+¯¼²A×nht•… Ö¶W‡t4o|ã“ü£oºêª«^÷ü—^z)ÿ÷ÿ×¢ÏúÕ¯~µÞ÷[uîª÷h{ì±ÇÕ Ðž¼á oHCCC­wzðÁ×yÍ;ì�/~ñ‹µ¿ ñÄOdÙ²eµýí·ß~ƒ®èHd:ª#× P¹N€êÈuTÏDŸ@%FŽÙbÿ¡‡ªS%Ëê+T½ð ´ûª Á†Z=xÚ¯_¿� =ØvÛmó†7¼!ÉÊÞé'?ùIn»í¶µž»`Á‚|úÓŸ®ýxfç�wNY–¹ûî»sà 7¬ó^S§NÍe—]V Dôïß_Hèкuë–wܱöŽjâĉ•ÞïÞ{ï­m÷éÓ';ì°C¥÷ØœÉtTG® :r�Õ‘ë¨^C½ :¦U¡ÐU/´…BÚÆê!�²,óØc�eĈ¯{Í^{í•›nºi£î7wîÜÌš5«¶?dÈ�� ½øð‡?œóÏ??EQdùòå9óÌ3sÓM7åÐCÍvÛm—%K–䡇Êu×]——^z)ÉÊpÃW¿úÕ|ô£M’œsÎ9yá…râ‰'¦{÷îkÜãÖ[oÍW¾ò•,Y²$eY¦(ŠŒ3fS>&@]¼ùÍoÎã�?ž$7n\¥÷úío›då¿W¾zB€ÎF¦ :r�Ւ먎\'@µLô Tb÷ÝwO·nݲ|ùò”e™I“&Õ»$€a»í¶Ë[l‘ $Iî¿ÿþuB{õê•áÇoÔý&OžÜb§�vÚ¨qÚ‹£Ž:*¿øÅ/ò÷¿ÿ=EQ¤,ËŒ7n�ÀªK‹¢È‡?üá¼éMoÊÛßþöüáHsss¾÷½ïå§?ýiF��!C†¤¡¡!/¾øbî»ï¾Ì˜1£M’=zäcûØ&V€Mmÿý÷ÏÿøÇÚþc�=–]wݵÍïóÐCeÒ¤Iµ~kÿý÷oó{´'2�Ց먖\'@uä:ªe¢O ݺuËðáÃóðÃ'Ižyæ™,X° }úô©seíß{ì‘ûî»/EQäÞ{ïÍñÇ_Ù½î¼óÎÚöàÁƒ³ÕV[Uv/€ÍAccc¾õ­oåøã�ϼyój!‚UÐUV…EwÙe—œuÖYI’/~ñ‹™0aB.\˜²,3wîÜÜqÇ-®[=Hºê¿gŸ}v¶Ûn»ª  îÞõ®wå]ïzWå÷¹í¶ÛZü@úío{å÷ØœÉtTK® :r�Ց먖‰>€ÊŒ5*ÿûßkû�>úhF�Õæ÷Ùyç�sþùç·ù¸›«Q£Få¾ûîKY–¹çž{²hÑ¢ôêÕ«Íï³|ùòÜvÛmµ°B½Àæh÷ÝwÏUW]•Ïþó™:ujíóÕáeYæ€È7¿ùÍôèÑ#I2dÈ�\|ñÅùä'?™%K–Ô®[=ºúEQä3ŸùL>ô¡mªGè>÷¹ÏåsŸû\½ËجÈtTG® Zr�í›\'ÐYå«—©`³öÄOä–[n©íàÈ�!CÚü>¿úÕ¯rÎ9ç$Y^øæ7¿™Ã?¼Íï°¹Z±bE~ÿûßçÎ;ïÌSO=•¹sç¦OŸ>Ù}÷Ýóîw¿;ûï¿ÿZ¯{òÉ'óå/9'N|ͱ÷Þ{ïœuÖYÙgŸ}ª*Øä:6 ¹NÚ}°V·Ýv[^xá…Úþ¿ýÛ¿¥OŸ>u¬ }™:ujî¹çž<÷ÜsijjÊV[m•Áƒg¿ýöËСCë]ÐŽÈu´Ž\'›’‰>  t©wИèÚ@C½ hKMMM™={vmРAu¬ ó’ë:#}›­gŸ}67ß|smÿ´ÓN«c5ˬY³r×]wÕöÇŒS¿b:ïµêïþûïÏØ±c“$EQdòäÉu® }óî Zr�Õñn  þä:�ÎÈDŸÀfë¹çžËÅ_œ¢(’xqЖžxâ‰|á _¨õZ¡mÇ{-€ÍCY–õ. Ãðî Zr�Õñn `ó × t6]ê]Àºø¢P½@uôZt4Þ}TK¿P½›’‰>  ˜èÚ€‰>  4Ô» ã»é¦›6Ù½žxâ‰Mv/€öF® Z&ú*÷…/|!EQl²ûE‘²,7ÙýÚ ¹N€j™èØd6UHsS†OÚ#¹N€jt©w@çQ…°&Àf@®  õ.èøV…@˲L÷îÝ3räÈÊî5oÞ¼L�:µ²ñÚ3¹N€j™èØl 2$§�vZ½Ëè�¶Ùf›yä‘õ. Cò^ `í¶ß~û<ýôÓI’æææ\~ùåill¬ä^÷ÜsON8á„JÆ茼û¨–\'@u¼ÛX;¹N€jeY–õ.èØ>ÿùÏç7¿ùM’•«À_{íµÙ{ï½+¹×ê�Т(2eÊ”JîÐÉuT«K½ :¾‘#G¶Ø衇êT @ç&× P-}•[-Š"‰@(@½ÈuTËDŸ@åvß}÷tëÖ-IR–e&MšTçŠ:'¹N€j™è¨\·nÝ2|øðÚþ3Ï<“ Ô±"€ÎI® Z õ.è\.\˜™3gfÁ‚éׯ_¶Ûn»466¶jÌY³få®»îªí�3¦•U´_K—.ÍüùóÓ¯_¿44´þÕÏüùóóè£�Öö÷ÙgŸV� ÀJÓ¦MË�üã$IQùú׿^犪7jÔ¨üýï¯í?úè£5jT›ßgç�wÎùçŸßæãt$2�Õ“ëh?ä:€ÎH® :EY–e½‹:¾o¼1×]w]þö·¿eÅŠµÏ3zôè¼ÿýïÏ»Þõ®�ûž{îÉ 'œ�¢(’$S¦Li“šÚ‹ &äºë®ËŸÿüç¼òÊ+µÏ ”ƒ:(GydFŒ±QcßsÏ=;vl’•!…É“'·EÉÄ{-êC¦ Zr�í“w[´¥Ö/ÿð:fÏž�SO=5=ôP’äÕsŒ/]º4ãÇ�Ïøñã³çž{æ¼óÎËðáÃ7ê^eYÖ^žt‹/ξð…ÜqÇIÖ쵞þù\{íµ¹öÚks衇æK_úR¸Á÷±N @µ¼×`S�騖\'@ÇàÝm¡K½ :®Ù³gçè£�ÎC=T E±Æ_²ò¥÷Ã?œ|à¹üòËëY6@»°`Á‚üñ¹ãŽ;R–e-Dðê¿UÇ~÷»ßåˆ#ŽÈm·ÝVïÒ€ML¦ Zr�ÀêLô Tæì³ÏÎÓO?�$-ÂÝ»wÏ€Ò¥K—5 ˗/Ï7¿ùÍœuÖYY¾|y�Ÿ`óuÞyçåoû[’´ø¡Í«ÿV/Ë2óæÍË™gž™o}ë[u«Øôd:ª%× ¬®¡ÞÓþð‡üéOjN8ôÐCó‰O|"#FŒH’,_¾<ýë_sýõ×ç–[nÉŠ+ja…ßþö·™7o^¾÷½ï¥G�õ|€ÍÎĉsÓM7µèµÞøÆ7æãÿxF�•¾}ûæ…^Èý÷ߟn¸!'Nlqîe—]–—^z)ç�w^ís c’騖\'ðj]ê]Ð1]uÕUIR[môŒ3ÎÈ÷¾÷½Z 4I²Ï>ûä‚ .È 7Ü�áÇ×V‚/Ë2þóŸ3vìØ,X° .ϰ¹úéOšä½Ö‡?üáüêW¿Êa‡–­·Þ:���:thÆŒ“«¯¾:—\rIØ¢×úõ¯�3Î8#Ë—/¯ç£“騖\'ðjE¹ê_ÚÈÂ… óÖ·¾5+V¬H’rÈ!ùþ÷¿¿ÎëšššrÞyçåW¿úU-¨PEvß}÷üøÇ?Nÿþý×zÝ=÷Ü“N8!IRE¦L™Òv°™ijjÊ›ßüæ477'IF�•«®ºj�+¸Ï�;7Ÿýìgó§?ý©E¯uÀäâ‹/N�=Öz�^ èlÞñŽwl²{-]º4³gÏN¢×X_Ï>ûln¾ùæÚþi§�VÇj62�Ւ먖\'ÀæM®àµ5Ô» ã™4iR- PEN=õÔõº®±±1ÿýßÿ�]vÙ%çŸ~’•«™Nž<9ûØÇrå•WfàÀ�•Õ ÐLš4©¶Z{Qùô§?½Î0h’l¹å–¹ôÒKsÁä'?ùI-z×]wåÄOÌ%—\’>}úT]>Àfïù矯õJ›Â¦¼@GðÜsÏåâ‹/®½x}2�Ւ먖\'ÀæM®àµu©w@ÇóÜsÏÕ¶·Új«ì¹çžtý1Ç“ï|ç;éÖ­[Š¢HQyòÉ'óÑ�~4Ï>ûl[— Ю<ýôÓµí-¶Ø"£F�Zïk‹¢È¾ð…|ñ‹_¬í—e™x Çw\^~ùå6¯ ½Zõ^ªê?6ŽÕ¬™N€jÉulr�›7¹N€5™èhsóæÍK²ò¥ù¶Ûn»Qcz衹ì²ËÒ«W¯ÚXÏ?ÿ|Ž>úèL›6­ÍjhoVïµ ´Q!‚c�=6^xaºvíZ …>òÈ#9öØc3kÖ¬¶. Ý*˲ò?¨’L'@µä:6¹NÚ“†zt<ÍÍÍm2ξûüä'9餓2wîÜE‘_|1G}t®¸âŠì±Çmr€ö¤©©©¶Ýаñ¯vŽ8âˆôéÓ'gœqFmÌÇø`«ÇhOöÚk¯$+{¢$™4iR=Ë€V‘騖\'@µä:h¯Lô ´¹�¶X‘´­B›Ûm·]~þóŸg×]w­C›ššrÍ5×Ô^ÐttC† ÉV[mUëÆ�×&ã>ûÃþЦ÷Ø�{î¹™4iRmÿÓŸþt:è 6½ÇÂ… sÊ)§dâĉI" í”L'@µä:€Õ™èÚ@—z�‰>  ˜èÚ@C½ :¯… fæÌ™Y°`Aúõë—í¶Û.���­sÖ¬Y¹ë®»jûcÆŒie•Ÿ\'@Û(ʲ,ë]йÜxã�¹îºëò·¿ý-+V¬¨}ÞØØ˜Ñ£GçýïÞõ®wmÔØ÷ÜsON8á„E‘$™2eJ›Ô ÐÉu´­†zt³gÏΩ§žš‡z(IòêuŠ—.]šñãÇgüøñÙsÏ=sÞyçeøðáu¯²,k¡PZ’먆‰>€víì³Ïn±_E¾þõ¯×©€Žåâ‹/^ã³ÓN;­•túè<óÌ3µ°æk6˲ÌÃ?œ|à9óÌ3sâ‰'nâjØ2�Õ’5¨Ž^ è¬ä:ªS”¯ž: >|xí âª/ŒS¦L©sUÃê½Ö*z-€¶¡×:«“N:)úÓŸZü_’ôèÑ#}úôÉË/¿œæææ$Yãßßýîwç‚ .HCú×6¾çž{r 'ÔÆÑkTO¦ Z²ÕÑk�•\'@uÖýG:µU/å_k.6ž^ èLþð‡?¬=ôÐCó‰O|"#FŒH’,_¾<ýë_sýõ×ç–[nÉŠ+REʲÌoûÛÌ›7/ßûÞ÷Ò£G�z> Ô�¬@uôZ@g"× P­.õ. µÊ²¬½86OW]uU’ü(æŒ3ÎÈ÷¾÷½Z4I²Ï>ûä‚ .È 7Ü�áÇ×V~/Ë2þóŸ3vìØ,X° .ÏÀë“é€öA® Z õ. 5Ž<òÈz—Ðaí³Ï>õ. ÃÒk�ÍÂ… 3qâÄÚªï‡rHN9å”×½føðáùå/™óÎ;/¿úÕ¯j¡Ð¿þõ¯9öØcóãÿ8ýû÷ßå°d:ª%kP½ÐÙÈuT¯(-• Tèž{îÉ 'œ�$)Š"×_}öÜsÏõ¾þꫯÎù矟²,k+Ç¿á oÈ•W^™�®ó~S¦Liƒ§hÿä:ª×¥ÞÛsÏ=WÛÞj«­6( š$ÇsL¾ó�ï¤[·n)Š"EQäÉ'ŸÌG?úÑ<ûì³m].@‡%× P=}•š7o^’•«°o»í¶5Æ¡‡šË.»,½zõª�õüóÏçè£�δiÓÚ¬V€ŽL® z&ú*ÕÜÜÜ&ãì»ï¾ùÉO~’-·Ü2ÉÊPè‹/¾˜£�>:“'On“{tdr�Õ3Ñ'P©¾}û&IʲÌìÙ³[5Öˆ#rõÕWgë­·N²2úÊ+¯ä¸ãŽË<ÐêZ:2¹N€ê™è¨ÔàÁƒkÛ³gÏÎܹs[5Þ.»ì’k®¹&Ûm·]’•¡ÐùóççÄOÌÝwßݪ±:2¹N€ê™è¨Ô®»îšdep³,ËLœ8±Õc6,×\sM† –²,SE/^œSN9%wÞyg«Çèˆä:ªW”eYÖ»€×óÌ3Ïä�ÈìÙ³ÓÐÐ�­·Þ:»í¶[vÙe—z—Ðî-Y²$?üpfÍš•nݺeÀ€Ùyç�³Å[Ô»4€vO¯ÐÒÁœ^x!I2f̘œþùm2îK/½”N8!�=öX-pZE’Ô¶§L™Ò&÷èìd:ª%kP½@Kr�Õ2Ñ'°IL›6-wÜqG¦M›–—_~9}ûöÍž{î™#Ž8"\ë5“&MÊ7¾ñ�üõ¯]ëñ!C†äÄOÌG>ò‘*KØì-X° øÃÖèµ9ä�tïÞ}­×<ÿüó¹è¢‹rÛm·eùòå-ŽuíÚ5ûì³OÆŽ›·½ím›â6[z-€¶söÙgçÆoL’ôìÙ3úÓŸÒ§OŸ6{Þ¼yùøÇ?žI“&µ… „¬I¦ Z²ÕÑk´¹N€j™è¨Ô‚ òµ¯}-7ÝtÓZ�wíÚ5Ÿüä'ó©O}ªÅç×]w]Î=÷Ü477çõÚ•¢(²×^{åÒK/Mß¾}Û²t€ÍÞòåËó£ý(—]vYšššÖ8¾å–[æ _øBÆŒÓâóqãÆå3ŸùL-Z´Î^ë°ÃË\�ÆÆÆ¶.`³¦×h{¿ýíoó™Ï|¦¶*û¾ð…wÜqm6þ¢E‹rÊ)§d„ V~X ™N€jÉTG¯Ðöä:ªe¢O 2óçÏÏñÇŸÉ“'×^~¯ú╤ÅgGuTÎ9çœ$ÉŸÿüçœtÒIµ/g¯>õqV}¶Ç{äšk®IÏž=«}(€ÍDSSSN?ýôŒ?~�>éÕûgžyf>ñ‰O$I~øáuÔQY¶lYíx’×ì׊¢È�K.¹$]»v­ü¹6z-€j,^¼8ûï¿/^œ$0`@~ÿûß·é¿ñ555åÓŸþtþøÇ?Zù`52�Õ’5¨Ž^  r�Õ2Ñ'P™ÿ÷Ïí·ßždÍ—ß«¬þ%ìâ‹/ÎÁœC=4Ó§Ooqløðá:th’dúô陸à|éK_ªBWyñÅóÍo~3¿ùÍojçvíÚ5·ÜrKvÜqÇz<2À&3iÒ¤|øÃ®í—e™Þ½{çÀlÑk=øàƒµ^iÔ¨Q9å”Sòñ�¼öÙ{ì‘ÿø�ÿÈ[ßúÖ«�>øàƒùßÿýßLœ8±vn÷îÝsûí·gÛm·­Ç#l2z-:™N€jÉTG¯@{e¢O ŸúÔ§rç�w&Y¹ŠÕ¿ýÛ¿åœsÎIccc‹ó¦M›–�üã™9sf’d�=öÈ#�<’¢(òž÷¼'^xa‹æ¯vá…æŠ+®¨�3vìØ|îsŸ«è©6Ÿÿüçk?ŽI’<0\pAú÷ïßâ¼{î¹'ÿþïÿžùóç'IöÛo¿Ü}÷Ý)Š"ûï¿~ðƒ¤{÷îk½GY–ùÜç>—[n¹%ÉÊžî´ÓN˧>õ© Ÿ  þôZt42�Õ’5¨Ž^ €öÊDŸ@›[ºtiÞò–·¤¹¹9I²×^{å¿øÅkžÿ·¿ý-ùÈGjûeYæŸþéŸrûí·§W¯^¯{¯æææŒ3&O<ñDʲ̶Ûn›?þñ�mò›£eË–eŸ}öÉÒ¥KS–evÞyçÜxã�éÖ­ÛZÏ7n\N>ùäZ ¡,Ël¹å–¹õÖ[×5¼Ú’%Kòîw¿;3fÌHY–Ù~ûísûí··ù3l.ôZt42�Õ’5¨Ž^ €ö¬K½ :ž)S¦dùòåY5Ÿø)§œòºçïµ×^yë[ßš²,S–eŠ¢È?øÁuB“¤k×®ùØÇ>V»× /¼�Y³fµþ!6S�=öX–,YRë›N=õÔ× ($ÉA”‘#G¶èµŽ<òÈu’¤G�9öØck½Ö3Ï<“¹sç¶Ù³lnôZt42�Õ’5¨Ž^ €öÌDŸ@›{òÉ'kÛ 9à€ÖyÍ«ÏÙÿý×û~ïxÇ;’¤¶ÂÖäÉ“×ûZ€öæñǯmwéÒ%‡rÈ:¯ùçþç×Ý=‡zh‹}½Бéµèhd:ª%kP½홉>€67oÞ¼$+CšC‡}ÝÕ±VÙa‡Zìï´ÓNë}¿­·Þ: ¨­’eõw #[½×2dHzôè±Îk^Ý[í¶Ûnë}¿ÁƒgË-·¬íϘ1c½¯hoôZt42�Õ’5¨Ž^ €ö¬¡ÞÏâÅ‹kÛ[l±Åz]Ó»wïû«¿_ ÈK/½”$Y°`Á] О,\¸°¶½¾=Ó«{² íµ¶Ùf›Ì�;7I2þü º =ÑklžšššòØc�åå—_ÎüùóÓÔÔ´ÁcŒ3¦í hd:ª%kP½ÀæI®`ý˜èhs«¯ˆµlÙ²õº¦K—.¯»¿.½zõªm¯JèhkÛÍÍÍëuM×®][ì74lØ+¡ÕÀ£×:2½ÀæcñâŹùæ›óë_ÿ:“'O^ïþ쵄�•L'@µd ª£×Ø|Èul8}mnõÕ®æÍ›·A×E±Q÷\´hQm{õP*@G³z¯µ`Á‚MrÏ%K–Ô¶WIt4z-€ÍÄ ò¹Ï}./¾øb’¤,Ë�§(Š”e¹Ñÿ ÐÈtTKÖ :z-€Íƒ\'ÀÆ1Ñ'Ðæ¶Ûn»$+¿˜Íœ93Ë–-K·nÝÖëÚ�ýB¶zø´oß¾|=@{1pàÀ$+û¦éÓ§gÅŠéÒ¥K¥÷\½×Z=$ÐÑèµêoüøñùä'?™+V¬ño‡«o¿:$úêc,Ër£ƒ¤‰L'@µd ª£×¨?¹N€�g¢O Í 6¬¶ÝÜÜœ'Ÿ|2»í¶Ûë^³Ûn»åâ‹/Þ¨û-\¸0/¼ðBmÈ�!5@{°z¯³|ùòüýïÏÞð†×½fÇwÌÙgŸ½Q÷[ºti‹^kРA5@{ ×¨¯_|1g�uVš››kÏ¡C‡æ°ÃË�!CrÎ9çÔ>?ñÄ3lذÌ�;7�?þx&Nœ˜™3gÖŽï¼óÎ9þøãÓµk׺=Àæ@¦ Z²ÕÑkÔ—\'@ë˜èhsC‡MÏž=³dÉ’$Éý÷ß¿ÎPhÿþýóÎw¾s£î7eÊ”«6ì¸ãŽ5@{°Ã;¤±±1Ë–-K’<ðÀë )l»í¶9î¸ã6ê~S§NMsss‹ûtTz-€úºòÊ+3þüZ¨óƒü`Î9çœtëÖ-IrÎ9çÔÎ=ðÀ³ß~ûÕö˲Ì�wÞ™ .¸ Ï>ûl¦M›–ßüæ7ùÁ~�>}úlÚØŒÈtTKÖ :z-€ú’ëh�.õ.蘆^ jN˜0¡Ò{�?¾¶½Í6Ûd›m¶©ô~õÔµk×ì²Ë.µ^kâĉ•ÞïÏþsm»_¿~{ì±Ì�;·ö㜓O>y£ÆéÕ«W~ðƒdûí·OY–¹÷Þ{síµ×¶e©íŽL'@µd ª£×¨¹N€Ök¨w@Çt衇æ…^¨í?ÿüóÙa‡Úü>·Þzkž{î¹$+WsxÛÛÞÖæ÷ØÜ¼ýíoÏ#�“&MÊ;ÞñŽÚþ!‡Rù=êM¯P¯¼òJ’•?–2dH×8§(ŠÚö’%K^w¼C9$={öÌâÅ‹óüóÏgêÔ©Ùm·ÝÚ´f€öB¦ Z²ÕÑkÔ‡\'@ë™èh׬ÐP�SN9¥Þ%tXz-€–.\XÛÞrË-×zNÏž=³hÑ¢E‘ ¼îx���9eY¦(Š,[¶,ßúÖ·2zôèxà�Ùwß}óž÷¼'ãÆ�K’Úy'�tRºt“h-ᆰ¥ß¨Ž^ `ÃÉu´ŽÿÓuwøá‡×VkŸ0aB¦M›¶Æ9cǎ;ûî[ {–e™æææÌž=;sçέý §(Š$+C¦Ç{ì&}€öN® uê]ÀÀ�sÓM7eÙ²eI’­¶Új�sr饗æ+_ùJnºé¦Úç« eY¦,ËtéÒ%GuTÎ>ûìMR;@G"× Ð:&ú6 »í¶Û:ÏéÞ½{Î?ÿüwÜq¹õÖ[óàƒ楗^JY–Ùzë­ó¦7½)ï}ï{ó†7¼aT Ð1Éul<}íÎðáÃ3|øðz—ÐéÉu´Ô¥Þ@G`¢Oh&ú€6`¢Oh õ.àµôíÛ7ûì³O½Ëè�ºwïžAƒÕ» €I¯Ðöššš²`Á‚,]º4eYnðõú3€Ö‘騖¬@uôZmO®`ÝŠrcþ P‘9sæä–[nÉøñã3eʔ̙3g£Ç*Š"“'OnÃê:¹N€ ×Pï’¤,Ë\zé¥ùÑ�~”%K–Ô>`Ó’ëØx&úꮹ¹9g�uVn¿ýöZ´(ŠE! ° Éu´Ž‰>€º»âŠ+rÛm·%I-Z–e �]vÙ%ýúõKÏž=ë\%@Ç'× Ð:EiZd Žššš²ß~ûeÑ¢EµUÞG��3Î8#{ï½w}‹èDä:Z¯¡Þ¬îÙgŸÍäÉ“óòË/gÞ¼yijjÚà1N;í´ *hÿšššòØc�åå—_Îüùó7ª×3fLÛÐèµZç¾ûîËÂ… SEŠ¢È¡‡š‹.º(]ºt©wi�–L'@µd ª£×h¹N€Ö3Ñ'Pw/¼ðB~ö³ŸåÆoÌK/½Ôêñ„BþañâŹùæ›óë_ÿ:“'ONsss«ÆRø½@Ûyæ™g’$eY¦K—.ùÒ—¾$ P2�Õ’5¨Ž^  íÈu´ž‰>€ººùæ›óßÿýßY´hQʲ|ÍóŠ¢H’×<§(Š”eY;€d„ ùÜç>—_|1Ék÷Rë¢×X“^  m-X° ÉÊþh‡vÈÀ�ë\@ç#Ó P-Y€êèµÚ–\'@ë™è¨›o¼1_üâ×úÂ{õý²,×x¡¾®ã�ÝøñãóÉO~2+V¬X£ßzu/µºW÷ez-€5éµÚ^ß¾}kÛ}úô©c%�“L'@µd ª£×h{r�­g¢O .žyæ™|ùË_®½0/Ë2£F�ÊG‘ÁƒçãÿxíùüÇd—]vÉܹsóøã�çÞ{ï̓>˜dåKô�wÞ9g�uVz÷î]Ç'Ø|¼øâ‹9묳ÒÜÜ\멆šÃ;,C† É9çœSûüÄO̰aÃj½Öĉ3sæÌÚñ�wÞ9Ç|ºvíZ·ç؜赪±ë®»Ö¶gÏž]ÇJ:™N€jÉTG¯P ¹N€Ö3Ñ'P—^zišššjûŸþô§sê©§®õÜáÇg¿ýökñÙ”)Srî¹çæÁÌ´iÓò¿ÿû¿¹üòË3pàÀJëh®¼òÊÌŸ?¿4øà?˜sÎ9'ݺuK’œsÎ9µs<ðÀ½VY–¹óÎ;sÁäÙgŸÍ´iÓò›ßü&?øÁ¬¸½@UöÞ{ïôïß?sæÌÉŒ32}úô 4¨Þet 2�Õ’5¨Ž^  r�­×¥Þ�Osssþïÿþ/EQ¤(Šxà�¯}-»ï¾{~þóŸç}ï{_ʲ̴iÓròÉ'gÙ²eU Ð>”e™_ÿú×µ€ÂÈ‘#óÕ¯~µPX—¢(òÎw¾37ß|sößÿ”e™‰'æôÓO¯²l€vA¯P�®]»æøã�¯í_qÅõ+ ‘騖¬@uôZÕ‘ëh=}›Ü#�<’Å‹§,Ë$ɉ'ž¸QãtéÒ%çŸ~öÜsÏ”e™©S§úbtz�=öXæÎ�[ëµN>ùä�§W¯^ùÁ~�í·ß>eYæÞ{ï͵×^Û–¥´;z-€j�;6#FŒHY–¹öÚkó»ßý®Þ%tx2�Õ’5¨Ž^  Zr�­c¢O`“{òÉ'kÛ���yë[ßúºç/_¾ü5�uéÒ%gœqF’•+o]}õÕµò�Ñc�=VÛîÚµk<ðÀ×=ÅŠ¯y¬G�9óÌ3“¬ìµ.¿üò¶) �ÒkT«¡¡!—^zivß}÷477çÌ3ÏÌw¾ó�,X° Þ¥tX2�Õ’5¨Ž^  Zr�­ÓPï€ÎgîܹI’¢(2dÈ�t鲿ÜãEQÔ¶—.]úºãí¿ÿþéÓ§O,X�—^z)=ôPFŽÙ¶E´¯¼òJ’ôZ���kœ³z¯µdÉ’×ï�CIÏž=³xñâ<ÿüó™:ujvÛm·6­ ½ÐkTo«­¶Ê/~ñ‹|ík_Ëu×]—ýèGùéOš8 {ì±Gú÷ïŸîÝ»oð¸cÆŒiûb:™N€jÉTG¯P=¹N€�g¢O`“[¼xqm{‹-¶Xë9½zõÊÂ… SEæÏŸÿºãuíÚ5ƒ ª­¼õøã� …�ÖÂ… kÛ[n¹åZÏéÙ³g-Z”¢(Ö¹jVcccœ'žx"I2eÊ! ÓÒklÝ»wÏ;ÞñŽLœ81O=õT-Z”ßÿþ÷ùýï¿Ñc „¬�L'@µd ª£×Ø4ä:6މ>€M®wïÞµí¦¦¦µžÓ§OŸÚ ö3f¬sÌÕWwx饗ZY!@ûÕ³gÏÚö²eËÖzNïÞ½³hÑ¢$ÉÌ™3×9f¯^½jÛ³gÏne…í—^  z/¿ür>ûÙÏæî»ïN’EÑâxY–ë=VQ)Ër�1ø™N€jÉTG¯P=¹N€�×¥Þ�ÏÖ[o]Û~­•݇ZÛ~ä‘GÖ9æêÁQ_è€Î¬ÿþµíÕW&]Ý AƒjÛ�>úè:Çœ5kVm{ÅŠ­¨ }ÓkTkÞ¼y9æ˜cr÷Ýw·~–eYûÛz>@g$Ó P-Y€ê赪%× Ð: õ.è|vÞyç$+¿€Í˜1#Ë–-K·nÝZœ3|øðüå/IY–™0aB/^Übe­ÕMš4)³gÏ®…A·Új«j`3¶ÓN;%ùG¯µbÅŠtéÒr­—ÝvÛ-ûÛßj½ÖòåËÓаö×DÓ¦MËŒ3j½V¿~ý*­`s¦×¨Ö…^˜'žx"EQÔVmïÛ·o8à€ì²Ë.éׯßkþ›!G¦ Z²ÕÑkTK® uLô lr;î¸czõê•E‹¥¹¹9O<ñDvß}÷çpÀùÙÏ~–¢(²`Á‚\rÉ%9ãŒ3Ö«©©)_ûÚ×’¬|_EÞøÆ7nŠÇØ,í¼óÎillLSSS–-[–§žzª\XeôèÑùÕ¯~•$™3gN®½öÚsÌ1kŒU–e.¼ðÂÚvQÙm·Ýª€Í”^  :sæÌÉM7ÝT ‚E‘ÓO?='�tRë]@‡%Ó P-Y€ê赪#× Ðz]Ö} @ÛjhhȨQ£jûúÓŸÖ8çmo{[ �då ñK.¹$_ùÊW2uêÔ455eáÂ…?~|Ž:ê¨üío«­Ž5tèÐ >|Ó<Àf¨±±1{ï½wmÿ®»îZãœC9$½{÷®½\¿ð sÙe—eþüùµs¦M›–O~ò“7n\­×Úzë­3bĈʟ`s¥×¨Î}÷Ý—åË—'I- ú©O}J b2�Õ’5¨Ž^  :r�­g¢O .>øàÚöïÿû5Ž744äŒ3Ψ­êP–e~ùË_f̘1Ùk¯½2jÔ¨œ|òÉyä‘GZ¬þpÚi§m§Ø<­ÞkÝyç�kïÑ£GN>ùäZµlÙ²|ë[ßÊèÑ£sà�fß}÷Í{ÞóžŒ7.É?V"=餓ҥ‹×I@ç¦×¨ÆóÏ?ŸdeÔØØ˜N8¡Ît2�Õ’5¨Ž^  r�­ç[%Pÿú¯ÿš®]»¦,ËLš4)“&MZãœ~ðƒ9âˆ#j/Å“•_Wÿ[õy’|øÃÎ{ßûÞMö ›«Ã?¼öÙ &dÚ´ikœ3vìØì»ï¾-~„ÓÜܜٳggîܹ)Ë2IjýÖÁœc�=v“>ÀæH¯P�®]»&YÙ#í°ÃéÙ³g�+耺{ßûÞ—÷¾÷½)Ë2þóŸóõ¯½Þ%tJr�­S”eYÖ»€+Vä¼óÎËÏþóE‘7½éM9ýôÓ³ß~ûÕ»4€NE®`ã™è¨»³Ï>»¶=a„<ÿüó)Š"IÒ·oßì±Çéß¿7hÜ¢(¬"°ä:ZÇDŸÀfeñâÅ™9sf,X�¥K—fcZ•}öÙ§‚Ê:†¦¦¦VõZƒ ª *€ŽA¯Ð:ǯ@WY½¯zõ±õQ–eŠ¢È”)SZ]@g#Ó P=Y€êèµZG® uê]Àc�=–n¸!ãÇ�Ï3Ï<“+VlôXEQdòäÉmX@û6gΜÜrË-?~|¦L™’9sælôXz-€–ôZÕÛ˜(O¦ Z²ÕÑkTO®`ý™è¨›%K–äë_ÿz®¿þú”e¹Q«a°veYæÒK/Í�~ô£,Y²¤ö­§×¨Ž¾  >d:ª%kP½@uôUÏDŸ@],Y²$ÿøÇsÿý÷×¾Ô­ZµÁ—<€ÖinnÎYg�•Ûo¿½E¯U…^  •ôZÕ¹óÎ;ë]@§$Ó P-Y€ê赪#× Ð:&úêâ»ßýnþò—¿´xY^EöÜsÏìºë®éׯ_zöìYï2Ú¥+®¸"·Ýv[’Ôz­²,3`À€ì²Ë.z-€VÐkTgðàÁõ. S’騖¬@uôZÕ‘ëh�¢´°‰-\¸0ûí·_–-[V[ ëÈ#�Ìgœ‘�Ö¹:€ö­©©)ûí·_-ZTëµF��3Î8#{ï½w}‹hçôZt42�Õ’5¨Ž^ €ÍYC½ :Ÿ{ï½7MMMµ•ß�:ꨜsÎ9õ.  C¸ï¾û²páÂZ¯u衇梋.J—.]ê]@»§× £‘騖¬@uôZlÎ|;6¹çŸ>IR–eºvíš3Î8£¾t Ï<óL’•½VQùÒ—¾$ ÐFôZt42�Õ’5¨Ž^ €Í™o¨À&·xñâ$IQÙqÇÓ·oß:WÐq,X° ÉÊ^k‡vÈÀ�ë\@ǡנ£‘騖¬@uôZlÎLô lrýû÷¯mwïÞ½Ž•t<«ÿà¦OŸ>u¬ ãÑkÐÑÈtTKÖ :z-6g õ.è|†^Û~ñÅëX @dz뮻ֶgÏž]ÇJ:½@}455å±ÇËË/¿œùóç§©©iƒÇ3fLÛÐÈtTKÖ :z-€ú�ëX?&ú6¹#FdРA™>}zfÍš•iÓ¦e§�vªwYÂÞ{ï�þýûgΜ9™1cF¦OŸžAƒÕ»,€A¯°é,^¼87ß|s~ýë_gòäÉinnnÕx¡k'Ó P-Y€êèµ6¹N€ ×¥Þ�ÓÉ'Ÿ\ÛþÑ�~TÇJ:–®]»æøã�¯í_qÅõ+ ƒÑkl&LÈa‡–sÏ=7=ôP–/_ž²,7ø/Ií¿¼6™N€êÈTG¯°iÈul}uñá8tPʲÌ-·Ü’«¯¾ºÞ%tcǎ͈#R–e®½öÚüîw¿«wI†^  ZãÇ�Ï 'œ�_|q�0gQµ¿W[ýتã ëG¦ Z²ÕÑkTK®`ã¥ÿóu²téÒœ~úé?~|Š¢ÈG‘ÓN;-Æ «wiíÞË/¿œ±cÇfÊ”)ihhÈI'�”O<1}úô©wiíž^  /¾øb?üðÌŸ??EQ¤,Ë 6,‡vX† ’sÎ9§ö;vl† –¹sçæñÇÏĉ3sæÌÚñ�vÚ)Ç|ºvíš$9òÈ#ëö\í�L'@µd ª£×¨†\'@ë˜è¨«²,sÙe—å?øA–.]š¢(2|øðì±Çéß¿7xÌÓN;­‚JÚŸ¥K—æk_ûZ®»îº$IÏž=sÀÔz­îÝ»oð˜cÆŒiã*Ú'½@Û»à‚ rå•WÖB�øÀrÎ9ç¤[·nI’áÇ׎]qÅÙo¿ýj×–e™;ï¼3\pAž}öÙE‘}öÙ'?øÁüp`=ÉtTKÖ :z-€¶'× Ð:&úꪹ¹9¿øÅ/rùå—gúôéµÏW}‘ÛS¦Li‹Ò:„qãÆåßøFžzê©$­ë³½ÀêôZm§,ËŒ=:óæÍK’Œ92¿üå/[œóz�ÐU-Z”ÓN;-wß}wŠ¢ÈèÑ£så•WVÿ€L'@õd ª£×h;r�­×Pï€Îëé§ŸÎi§�–'žx"Ië_˜—eÙê1:Š—_~9Ÿýìgs÷Ýw'Y³×Ú�µ_Š¢Ðk¬F¯Ðö{ì±Ì�;7ÉÊéä“OÞ¨qzõê•üàyßûÞ—§Ÿ~:÷Þ{o®½öÚuÔQmY.@‡#Ó P-Y€êèµÚž\'@ëu©w@çô /äcûXžxâ‰/È˲Üè?Vš7o^Ž9æ˜Ü}÷ݯÙkm½À?赪ñØc�Õ¶»víš<ðuÏ_±bÅkëÑ£GÎ<óÌ$+û­Ë/¿¼mŠè d:ª%kP½@5ä:Z¯¡Þ�Óyç�—Y³f¥(ŠÚêV;í´SÞþö·g—]vI¿~ýÒ³gÏz— Ð.]xá…yâ‰'ZôZ}ûöÍ ×h%½@5^yå•$+W}2dH×8§(ŠÚö’%K^w¼C9$={öÌâÅ‹óüóÏgêÔ©Ùm·ÝÚ´f€ŽB¦ Z²ÕÑkTC® õLô lr3fÌÈïÿûÚ óîÝ»çÜsÏ͘1cê]@»7gΜÜtÓMµ^«(Šœ~úé9餓Öú€õ§×¨ÎÂ… kÛ[n¹åZÏéÙ³g-Z”¢(²`Á‚ׯ±±1ƒÎO<‘$™2eŠ@(ÀZÈtTKÖ :z-€êÈu´ž‰>€Mnâĉ)Ë2ÉÊÕÎ>ûl�P€6rß}÷eùò嵕HO?ýôœzê©õ.  CÐkT§gÏžµíeË–­õœÞ½{gÑ¢EI’™3g®sÌ^½zÕ¶gÏžÝÊ :&™N€jÉTG¯P¹N€ÖëRï€Îgõ/g={öÌ¿ýÛ¿Õ±€ŽåùçŸO’”e™ÆÆÆœp u® ãÐkT§ÿþµíÕW�_Ý AƒjÛ�>úè:Çœ5kVm{ÅŠ­¨ ã’騖¬@uôZÕ‘ëh=}›\�=’¬\ù}ûí·O·nÝê\@Çѵk×$+{­vءŊY´Ž^  :;í´S’•?¾™1cÆZœ»í¶[íœ &dùòå¯9Þ´iÓ2cÆŒE‘$éׯ_Û ÐÈtTKÖ :z-€êÈu´ž‰>€MnàÀ�õ. ÃZ½×jhh¨c%�^  :;ï¼s“$Ë–-ËSO=µÆ9£G�®mÏ™3'×^{íZÇ*Ë2^xam;ùG˜€–d:ª%kP½@uä:ZÏDŸÀ&·Ç{$Yùåkúôéµ/a´Þ.»ì’de¯5sæÌ:WÐ±èµªÓØØ˜½÷Þ»¶×]w­qÎ!‡’Þ½{§(ŠZèó²Ë.ËüùókçL›6-Ÿüä'3nܸڪï[o½uFŒQù3´G2�Õ’5¨Ž^  :r�­g¢O`“:thÞò–·$IæÍ›—‰'Ö¹"€Žc—]vÉî»ïždåêW�<òH�+è8ôZÕ:øàƒkÛwÞyçÇ{ôè‘“O>9eY¦(Š,[¶,ßúÖ·2zôèxà�Ùwß}óž÷¼'ãÆ�K’Úy'�tRºt“X™N€jÉTG¯P-¹N€Öñ: .>ñ‰OÔ¶ÿ÷ÿ7ÍÍÍu¬ c9þøãkÛ]tQÝêèˆôZÕ9üðÃk«ºO˜0!Ó¦M[㜱cÇfß}÷­…=˲LsssfÏž�¹sç¦,Ë$©­ú~ðÁçØc�ݤÏÐÞÈtTKÖ :z-€êÈu´Ž‰>€º8è ƒò‰O|"eYfÒ¤IùÌg>“%K–Ô»,€á}ï{_ÞûÞ÷¦,ËüùÏÎ׿þõz—Ða赪3pàÀÜtÓM¹þúësÝu×e«­¶Z㜆††\zé¥9òÈ#[|^E-º*,úÑ�~4ßýîw7Iíí™L'@µd ª£×¨Ž\'@ëåªéŽêàòË/Ï·¿ýí477gèСùÄ'>‘ù—Iß¾}ë]@»¶bÅŠœwÞyùùÏž¢(ò¦7½)§Ÿ~zöÛo¿z—Ðîéµ6�>úhn½õÖ<øÿcïÎÃë*ë}�ÿVÒtJié ˜‘Ø"Èl[@‘{�2ˆŠ ‚u@n=zŽr…sÄ«De�¡ˆN€XfÐRh‘–)e�”šÎ¥cºî}ºliSšì½²vv>ŸçÉãÚÉÚïþåŸ>_–ß¼ïc�Ekkk¤iƒŽ}öÙ'Þÿþ÷Ç.»ìRôˆÝŠN'@~t ò#kT½N€�Ùè(Ä)§œ’]¿øâ‹1wî܈ø×‰ #GŽŒAƒE}}}‡ÖM’$®¹æš²Î ÐÝ|ík_Ë®§N�---Ù©W���1zôèNg-'›=�¬@µÑéÈ—®@~d-*•�>€B455eÊ7´a4ÙÜÏ·$MÓH’$fΜYò|ÝÙæ²V)9kýûe-Y €ê£Ó �/]€üÈZTªº¢ØPg˜ðæä,€üÈZT#Ï¿ò#käGÖ Øè(̆'bP^²@~d-ª�gßù’·ò#kP‰’Ô±T•–––ÜÖ1bDnkt²Ðºù‘µ¨T6ú€2¨+z z�rÊ)…~~’$qÍ5×:@%Ðëè6úr3uêÔH’¤�ÏNÓ´°Ï¨4z�]£¦è Ô=PÝÒ4-zB¯ +$©m duE°¡þóŸ1cÆŒX°`A,^¼8V­ZÕá5&L˜�ÃdÝߪU«â™gž‰ Ä’%K:•µŽ;î¸òPd-ª�N'@¾t ò#kP´$MÓ´è!€žmîܹ1iÒ¤øýï­­­%¯7sæÌ2LP–/_üããw¿û]̘1#ÚÚÚJZOÖøY €j£Ó �/]€üÈZT’º¢z¶?þñ�qþùçÇ믿[ÚðÞðuš¦›ûlL™2%{챈X÷o»í¶[œsÎ9Ñ·oß#€ÊñꫯÆ9çœmmmY¦5jTü¯ÿõ¿bäÈ‘qî¹çfß?õÔSc‡vȲÖÃ?sæÌÉ~¾Ûn»Å'?ùɨ­­-ì÷¨$²@÷°råÊhii‰ˆMÿ0€�étäK× ?²@÷ × ôD6ú ñ³Ÿý,V­Z•½þ¾g�uÖfïmjjбcÇnô½™3gÆyç��=öX477Ç÷¿ÿý¸òÊ+cذa¹Î Ðüüç?�%K–dº�?þø8÷Üsc›m¶‰ˆˆsÏ=7»÷àƒÞ(k¥iwÞyg\xá…ñÏþ3š››ã¦›nŠÿøÇѯ_¿®ýE*�¬@µÑéÈ—®@~d-*UMÑ=O[[[üéOŠ$I"I’8øàƒÛ-„¶çmo{[ü⿈|à‘¦i477Çgœ«W¯Îij€î!MÓøÝï~—öÚk¯øÖ·¾•ÞL’$ñîw¿;þøÇ?Ƹqã"MÓxøá‡ãóŸÿ|žct ²ÕF§ _ºù‘µ¨d6úºÜ“O>Ë—/�4M#"âÔSOíÔ:555ñÝï~7ÆŒišÆÓO?W]uU9Gèvžyæ™X´hQ–µÎ8ãŒN­Ó§OŸøñ�;î¸c¤iS¦L‰n¸¡œ£t;²ÕF§ _ºù‘µ¨d6úºÜ¬Y³²ëúúú8ðÀ·xÿš5kÚýYMMM|éK_Šˆu'o]wÝuÙy€žè™gžÉ®kkkãàƒÞâýk×®m÷g qöÙgGĺ¬uå•W–gH€nJÖ ÚètäK× ?²•ÌFŸ@—[´hQDD$I#GŽŒššM#I’$ÙõÊ•+·¸Þ¸qã¢_¿~ÑÚÚO<ñD§è^.\ÿÊZõõõ›Ü³aÖZ±bÅ×;âˆ#¢wïÞÑÒÒO?ýtù†èfd-ª�N'@¾t ò#kPÉlô t¹åË—g×ýû÷ßì=}úôÉNq_²dÉ׫­­�áÇg¯Ÿ}öÙ2L Ð=-[¶,»0`ÀfïéÝ»w–µ–.]ºÅõêëëcĈÙë™3g–aJ€îIÖ ÚètäK× ?²•ÌFŸ@—ëÛ·ov½jÕªÍÞ³þ4÷ˆˆW^yåM×ìÕ«WvÝÚÚZÂtÝÛú“C#"V¯^½Ù{6ÌcsæÌyÓ5ûôé“]Ï›7¯„éº7Y €j£Ó �/]€üÈZT2}]nðàÁÙu{'»�5*»~òÉ'ßtÍ ‹£I’”0@÷6hРìzÓI74|øðìú©§žzÓ5_{íµìzíÚµ%LнÉZT�N€|éäGÖ ’Ùèèr»í¶[DD¤i¯¼òÊfOÉjjjÊî™:uj,_¾¼Ýõþþ÷¿Ç¼yó²2èÀ�s˜ {Øu×]#â_Yks¥‚=öØ#»gêÔ©±fÍšv×knnŽW^y%ËZÛn»mù‡è&d-ª�N'@¾t ò#kPÉlô t¹�wÞ9úôémmmñÜsÏmrÏøñã#bÝIîK—.�Ÿþô§›]kÕªUñ�ï|'"Ö=d�ˆØsÏ=ó [Øm·Ý¢¾¾>""V¯^Ï?ÿü&÷¼ó�ïÌ®çÏŸ7ÜpÃf×JÓ4.ºè¢ì:â_€žHÖ ÚètäK× ?²•ÌFŸ@—«««‹ý÷ß?{}ÿý÷orÏ!‡Ûm·]D¬{ þÓŸþ4¾ùÍoÆÓO?«V­ŠeË–Å}÷ÝùÈGâñÇÏNÇ5jTvr<@OT__ïxÇ;²×>øà&÷qÄÑ·oßH’$+"\~ùå±dÉ’ìžæææ8óÌ3ãÞ{ïͲÖàÁƒãío{î¿@¥’µ¨6:�ùÒ5È�¬@%³Ñ'PˆÃ;,»ž8ÚÚÚ""â׿þuìµ×^›Ü7qâĸù曳°Þ]6üþI'�ßüæ7ó ˜;wnvØaY¹à–[n‰]wÝu£{Ö¬Y§žzj<ôÐCÙټцYëðÃ�Ë.»¬Kæ¨d²@çÍž=»Ë>kÚ´i1qâĈX—½fΜÙeŸ ÐÝètäK× ?²@çéuäËFŸ@a/^œ•Bûôé½zõÚäž4MãÒK/�+®¸"V¬X±Ùuúöíg�uVœz꩹ΠÐ�<ýôÓ±zõꈈ>|x 4h“{V®\ßüæ7ãøCVRxããÔÔÔÄI'�_ûÚ×b›m¶é¢é*›¬Ð9MMMY&ê*ëÿ�G!`Ët:ò¥k�Y  sô:òe£O [hmm�;ï¼3{ì±hmm�4McðàÁ±Ï>ûÄQGÛn»mÑ#t[O=õTüùÏÞlÖzÿûß»ì²KÑ#t[²À¿455uéç%I¢ ��N€|éäGÖø½N€|ÙèÈ�“ß*ƒ^'@¾êŠèœI Pô:ò“¤þ•€’Õ=T}@ØèÊ ®è€êrä‘GúùI’ÄäÉ“ � /§œrJ¡ŸŸ$I\sÍ5…Î�Y €j£Ó �/]€üÈZtw6úʪ¥¥%’$‰4M ùü$I ù\€®0uêÔÂòNš¦²PÕd-ª�N'@¾t ò#kÐÝÙèÈE°‹*¢]cúôé1qâĈX÷ÿINž<¹à‰*ŸN'�½N€öÙè(«áÇ=@Uó‡0ù‘µ*ßÊ•+£¥¥%"ŠÙ¨ ;ÑéÈŸ®@~d-€Ê§× Ð>}eu×]w=@Õzê©§Š jÉZT�N€|éäGÖ »«)z¨6ú€2°Ñ'Ðíýío‹·½ímñ¶·½-F�]ô8=’N'@D]Ñ”Cš¦E�P•¦OŸ'NŒˆˆ$IbòäÉOP=d-ª‘N'@~t ò#kPN6ú ]+W®Œ–––ˆXWR |d- #t ò#kPN5EÕÀFŸ@·’$IÑ#z�›c£O [IÓ´è½N€Í©+z€­±ß~ûÅ�wÞYô=ž^'@ûlô t õõõ1bĈ¢Çèñô:ÚWSôP lô ePWô�1gΜ¸þúëcÚ´i±`Á‚0`@Œ3&>ô¡ÅèÑ£‹ ÇÐëø}…{üñÇãúë¯Ï^îsŸ‹wܱÝûo»í¶øêW¿+W®Œˆˆ4M#I’xüñÇã—¿üeœvÚiqöÙgç>7@µÑë(��>€ÂýêW¿Š›nº)’$‰Q£Fm± ú�ü#&Nœ«W¯Žˆˆ$I"I’ìçmmmñ³Ÿý,¶Ùf›˜0aBî³T½N€ÒÔ=À<�]{ì±[¼÷‚ .ˆÕ«WgEÐ4M7úZÿ½Ÿüä'ñì³Ïæ=:@UÑë(M]ÑÕéá‡î²Ïzê©§ºì³€ò›3gN¼úê«Ùëw½ë]íÞû÷¿ÿ=¦OŸž�ô>räÈ8ÿüóc¿ýö‹ Äå—_“&MŠ$I¢­­-®¼òÊøÞ÷¾—ûïP©t:€ŽÐë(��>€\|üãÏþ¬+¬?¹ '˜={v—}Ö¼yóºì³*�¬PŒY³fe×555ñ¶·½­Ý{o¾ù戈HÓ4jkkã²Ë.‹ÝvÛ-""† _ÿú×£µµ5þüç?GDÄ_þò—øÖ·¾Ûl³MŽ¿@åÒéÈ—®@~d-€bèu”ÎFŸ@®ºª¨Ù•T€¢qÄþ '²@1ZZZ"b]>Ú~ûí£¾¾¾Ý{xà�ìÞñãÇgeÐ �qÆY!ôõ×_�gžy&ÆŒ“Ãä݇N'@>t ò#kC¯ t6úr¥¬ ��®, Èt@O#kt½¥K—f×���íÞ7oÞ¼xþùç³uÔQGmö¾¦¦¦hllŒÅ‹GDijÏ>« ôxžIäG× ?²@×Óë(��>€\ >¼èªšâ@~d-€®·bÅŠìzK§¾?öØc±î�x’$‰±cǶ{ïˆ#²BèÂ… Ë2'@w¤Ó �?]€üÈZ]O¯ t6úrq×]w=@UëÊÓHzY  ë544d×Ë–-k÷¾©S§f×C‡�‘#G¶{o¯^½²ë §=�N'@þt ò#kt=½N€ÒÙè ›yê©§Š jÉZÅhllŒˆuœóòË/g'»¿Ñƒ>I’Äþûï¿Å57,–né4y(…®@~d-€bèu”®¦è€žm·ÝvË®W¬XÓ¦MÛäžgžy&š››³¢èA´Å5[[[³ëõ…S¶L¯ t6ú ÕÔÔ½{÷ÎÊž—^zé&÷üøÇ?Žˆu§ÃGDŒ?¾Ýõ^{íµ˜?~özäÈ‘å jéu”®®è€ž­W¯^qÔQGÅM7ÝI’Ä”)SâSŸúTœp ±Í6ÛÄM7ÝwÜqGVÝo¿ýbĈí®÷øã�oôz—]vÉu~€j¡× P:}…›0aBÜvÛm±zõêHÓ4¦L™S¦LÙèž4M#I’8óÌ3·¸ÖäÉ“³ëí·ß>†šËÌÕH¯ 45E°Ã;Äù矑�ðž¦i¤iºÑ÷N8á„?~|»ë¬X±"î¼óÎH’$’$‰8 çɪ‹^'@iꊀ®7}úô˜8qbD¬{�¾áIX”FÖè¼ãŽ;.† \pA477gßOÓ4úõë§Ÿ~zœqÆ[\ã·¿ým,Y²$"Öå±Ã;,Ï‘ dºù‘µ:O¯ ólô Э\¹2ZZZ"â_'fP²@iÆ�úÓŸ¢¹¹9žþùX¹re :4öÞ{隷¯Ó÷·µµÅ)§œ’½>ôÐCóJ¦k�Y  4z��c£O âìºë®±ë®»vø}–A(�^'@ÇÔ=T}@ØèÊ ®è6géÒ¥qÿý÷Ç´iÓ¢¹¹9-ZK–,‰4Mã¿ÿû¿cŸ}ö)zD€A¯`ëÙè¨(‹-ŠK/½4~ûÛßÆë¯¿¾ÑÏÒ4�$IbÅŠ›}ïÙgŸ·Ýv[DDl¿ýöq×]wå>/@µÒë踚¢XoúôéqÜqÇÅu×]Ë–-‹4M;ôþSO=5Ò4�4Mã•W^‰¿ýío9M PÝô::ÇFŸ=X’$E�Pµd-€Ž{â‰'âÔSO�9sælôý$IbàÀ�[UÝsÏ=côèÑÙëõ§À@¥Ó5È�¬Ðqz��g£O€¬£§f°õd-€ŽY¶lYœyæ™±|ùòˆX—§ÞñŽwÄ�üã˜6mZüõ¯�ˆ­ûÛ£�>:[ãÁÌoh(#]€üÈZ£× Pšº¢ ëí·ß~qç�w=@U’µ:çÊ+¯Œyóæe…Ï�}ìcñŸÿùŸQSÓñ³ŒÇŽ?øÁ""¢¥¥%^{íµ2dHYç€rÑ5È�¬Ð9z�¥±Ñ'@T__#FŒ(z €ª$ktί~õ«¬ úÎw¾3¾þõ¯wz­¦¦¦¨­­�¶¶¶ˆˆxî¹çB¨Xºù‘µ:G¯ 4ß Œž|òÉhmm�4M#"â _øBIëÕ××ǰaò×/¿ürIëôz�¥³Ñ'P¨çž{.»nllŒ}öÙ§ä5³ë¥K—–¼@O × P:}…š?~DD$I#FŒ(Ëš½zõÊ®W­ZU–5ª�^'@éꊀâ¼ôÒK1}úô˜7o^ÔÕÕÅàÁƒc�=öˆÝwß½èѺ=Y `ëµµµe×55å9»xÑ¢EÙuÿþý˲&äI× ?²ÀÖÓë(��>º¹æææ¸ãŽ;¢¹¹9,X���1f̘xßûÞÆ Ûì{þþ÷¿Ç÷¾÷½xôÑG7ûó‘#GÆ©§ž'�tRž£T÷¹Ïmôýßüæ7qÞyçE[[[léÑP’$±÷Þ{ÇÏ~ö³hll,çèOÖèZýë_ãÓŸþtD¬ËJ<ð@VÝPSSS$IW]uUŒ;v³ëM™2%>ùÉOfëÝ|óͱÛn»å3<„®@žd-€®¥× Pºš¢ ã–,YŸøÄ'âøC¤iºIÙ MÓX³fM\rÉ%qþùçgßà�âÜsÏ�5kÖDĺ‡áë ¯·þ{išÆc�=Ÿüä'cùòåùÿRBÖèzûî»oÔ××gùéæ›o.i½ë¯¿>»Þn»í”AÈ•®@~d-€®§× P:}tC_ÿú×ãÉ'ŸŒ4M7*lXXXÿ½n¸!î¼óÎhkk‹sÏ=7{Ïúûšššâ=ïyO¼ç=ï‰=÷Ü3ûÙú‡ï3gÎŒüà…ý®]MÖèz qÐAe™ëòË/� tj­»îº+&Ožœe¹#�<²ÌÓÀÆt ò#kt=½N€ÒÕ=ó׿þ5n¿ýö¬D�¦iŒ1"Ž>úèØa‡båÊ•ñ÷¿ÿ=î¸ãŽX³fM¤i?úÑ�¢­­-fÏž�•;ì°ø¯ÿú¯5jÔFë¿úê«ñ?ÿó?qÓM7e÷^ýõñ‘�|$vÞyç"~e€.#k糟ýlÜÿý‘$IÌŸ??Î<óÌøÙÏ~���[½Æ½÷Þ'NŒˆuY®®®.N?ýô¼F]€ÉZÅÑë(��>º™ë¯¿>"";1ôÃþpœ{î¹Q__¿Ñ}ÍÍÍqÚi§Åœ9sâ™gž‰Ÿþô§ÙÏÞ÷¾÷ÅE]”64tèи袋bðàÁqÕUWE’$±víÚ¸ñƳ‡éÕJÖ(Î~ûíG}tö:�?þx{ì±ñùÏ>Ž9æ˜èÛ·ïfß×ÖÖ�?þxLš4)n¿ýöhkk‹ˆˆ$IâãÿxŒ9²+ z]€üÈZÅÑë(M’¦iZôl�•+WÆ~ûí—=ÔÞ{ï½ã—¿üe»÷?þøãqÒI'e¯Ó4�!C†Äí·ß}úôÙâgµµµÅqÇÏ=÷\¤ioyË[âž{î)ËïP‰d-€â-_¾<>úÑ�ÆŒ3"I’ìujkkcç�wŽgŸ}6"Ö•=wÛm·HÓ4ZZZbÅŠñ¯?ìIÓ4:è øùÏ555EþJT1]€üÈZÅÓëè<ÿÚt#3gÎŒ5kÖÄú³[>ûÙÏnñþ½÷Þ;<ðÀHÓ4{~üñÇ¿iA!"¢¶¶6>ö±�eŸ5wîÜxíµ×Jÿ%*”¬P¼Þ½{ÇW\‘å¬õåÎ5kÖdeЈuÅÏçž{.ž{î¹X¾|y–«Ößÿ®w½+.½ôRePr¥k�Y  xz��ç_<€ndÖ¬YÙu]]]Œ?þMßóÆ{Æ�·ÕŸwä‘GFĺé3fÌØê÷t7²@e4hP\sÍ5ñå/9³ï'I²Ñ׆ߋXWíß¿|ùË_ŽŸüä'ѯ_¿Bæ çÐ5È�¬Pô::§®èØz‹/ŽˆuºG�Ûl³Í›¾g§�vÚèõ®»îºÕŸ7xðàØn»í¢µµ5’$q)PÕd-€Ê‘$I|æ3Ÿ‰SN9%þð‡?Ľ÷ÞÓ§O�E‹mroCCCì»ï¾qÈ!‡Äñǯ @—Ñ5È�¬P9ô::ÎFŸÝÈòå˳ëþýûoÕ{úöí»Ñëtè3×—""–.]Ú¡÷t'²@åihhˆ“N:)N:餈ˆ˜7o^,\¸0/^½{÷Ž�ÆàÁƒ£®N €®§k�Y  òèul=ÿt# ÙõêÕ«·ê=555[|ýfúôé“]oX’¨6²@å½N€öuì¿H(Ô†'�.^¼¸CïM’¤SŸùúë¯g×–$ª�¬t„®@~d-º3}t#Ûo¿}DD¤isæÌÙêI׿§36,C466vj €î@Ö:B× ?²ÝY]ѰõvØa‡ìº­­-fÍš{ì±Çß³Ç{Ä%—\Ò©Ï[¶lYÌ�;7{=räÈN­ÐÈZ@GèäGÖ ;³Ñ'@72jÔ¨èÝ»w¬X±"""¦M›ö¦%…AƒÅ»ßýîN}ÞÌ™37:Åtç�wîÔ:Ý�¬t„®@~d-º3}t3MMMñè£�F’$1uêÔ8ùä“sû¬ûî»/»:th :4·Ï¨²@ehkk‹{î¹'î»ï¾˜9sfÌž=;–-[–ýñNG$I3fÌÈaJÐ5È“¬Pô::ÎFŸÝÌ~ûí�>úh¤i÷߬^½:¶Ùf›\>ëÖ[o�$I""bŸ}öÉå3*‰¬P¼[n¹%.¼ð˜7o^DD¤iZðDÐ>]€üÈZÅÓëè}t3GuTÌ�;7{ÝÒÒ;í´SÙ?çÏþs¼üò˱ît¬C9¤ìŸPid-€b}ï{ß‹k®¹&+�&I’ýMG‹¡I’(“�;]€üÈZÅÒëè<}t3{ï½wì½÷Þ¹ÎÂ… ã”SNÉ^~øá¹&@Ñd-€âÜxã�qõÕWGDlT­©©‰#FĶÛn N›Ò5È�¬P½N€Ò$©í�€µµµÅ!‡ ,ˆˆuEÐ]wÝ5Î:ë¬8üðãOŸ>OÐ3èu”®®è€ží‘G‰ùóçg'¾pÀqùå—;é ‹éu”®¦è€žmÖ¬Y±îÄ÷ˆˆo}ë[Ê Ðë(��>€B-^¼8""’$‰Q£FÅN;íTì@=”^'@éꊀ®·dÉ’xê©§²×p@�ÓTY  ãúöí›]o»í¶Å Ð5È�¬Ðqz�¥³Ñ'@ô�ü#>ýéOGĺӴf̘QðDÕCÖè¸]wÝ5»^¸paqƒ@t ò#ktœ^'@éjŠ€b¤iš}P^²@Çì·ß~ѯ_¿HÓ4^~ùåhmm-z$èRºù‘µ:F¯ t6ú U__'žxbD¬ûãšn¸¡à‰z&½N€ÒÙè(ÜYg�;î¸c¤iW\qELŸ>½è‘z$½N€ÒØè(\ß¾}ãòË/�í·ß>V¬X§Ÿ~zÜxã�‘¦iÑ£ô(z�¥©+z€ˆˆvØ!n¼ñÆøÊW¾>ø`|ã߈Ë.»,Ž:ê¨=zt 4(zõêÕáu8à€¦¨^z��g£O bl·ÝvñÿñqöÙgGsss´´´Ä5×\Óéõ’$‰3f”qB€žA¯ slô T„U«VÅ·¿ýí¸ñÆ#MÓH’$""Ò4-x2€žE¯ ólô nÕªUqê©§Æ#�<¢ P ½N€ÒØè(ÜøÃxøá‡#I’H’$Ò4�šššxûÛß»ï¾{l»í¶Ñ»wï¢Ç¨zz�¥±Ñ'@ÔØØp@ÑcT%Y  ã–.]¿øÅ/²"hDÄ¿ÿû¿Ç—¾ô¥:thÁÓ@¾t ò#ktœ^'@é’tý¿ ˜9¾ñ�o<@Ï£× Pºš¢z¶þ󟑦iÔÖÖÆ¾ð…‚'è™ô:Jg£O Pk×®�ˆˆ$Ibç�wŽ<@Ï¤× Pºº¢ r¼ôÒK±`Á‚hllŒQ£FE]�ÇGå"k´oذaÙuCCC�“@åÐ5È�¬Ð>½N€Òù¯L€*´þ¤¬ˆˆššš-Þ›¦i\uÕUqõÕWǼyó²ï766Æ?øÁøÂ¾}úôÉmV€îFÖ(¿wÜ1»~õÕW œÊO× ?²@ùéu”.IÓ4-zÊç—¿üeœwÞy±® pË-·ÄÎ;ïÜîý_üâãŽ;îˆÍ=&J’$vÚi§¸þúëcРA¹Í Ð]ÈZù9úè£ãÅ_Œ$IâOúSì²Ë.E�%Ó5È�¬�½N€Òlù( º�Ûn»-Ò4�4McìØ±[,(Lš4)n¿ýöHÓ4’$‰$I²Ÿ%IišÆóÏ?&LèŠÑ*ž¬�Ÿ�~ô£Ùõe—]Và$P>ºù‘µò£× P}T‘¶¶¶xì±Ç²ÂÁ{Þóžvï]¹reüøÇ?ÎîMÓ4†ÇsLŒ;6jjj²Ò£�>7ß|sWýIÖÈ×Ç>ö±7n\¤i·ÜrK\}õÕE�%Ñ5È�¬�/½N€ÒØè Š<÷Üs±bÅŠHÓ4""ÆŽÛ'OŽùóçg¯?ô¡ÅwÜ_|qüüç?�n¸!úôé“n¸á†|‡¨p²@¾jjjâÒK/�Ã;,Ò4� /¼0Î9çœxñÅ‹ :E× ?²@¾ô:JSWô”Ï?ÿùÏìºOŸ>1jÔ¨vï½ýöÛ#""MÓ0`@|ã߈ÚÚÚìç{íµWL˜0!.¼ðˆXw"é‚ bàÀ�9MPÙd-€|]rÉ%±çž{ƳÏ>---që­·ÆŸÿüçØc�=b̘11hР¨¯¯ïðÚ&L(÷¸ð¦t ò#käK¯ 46ú¨"sçÎ�ˆˆ$Iâ-oyK»÷¥i=ôPvÒè±Ç ›Ü÷�| .ºè¢ìtÓ™3gƸqãr˜ òÉZùºä’K² ±.w¥iišÆÌ™3ã©§žêôÚ ¡A× ?²@¾ô:JSSô”Ï믿ž]÷ëׯÝûžyæ™X´hQV>x×»ÞµÙû Ûo¿}özÃÓNzY  ë%I’}uÆúLEÐ5È�¬Ðõô:¶ž�>ªH[[Ûf¯ßèÑGÍ®kkkc¿ýök÷Þí¶Û.»^²dI‰t_²@þÖŸô^®/(’®@~d-€üéut^]ÑP>}ûö�ˆuÎ,XÐî}S§N�ˆu'gí±ÇÙûÞÌ–ŠÕNÖÈ×µ×^[ôPVºù‘µò¥× P}T‘!C†d×sæÌ‰%K–Dÿþý7ºgÍš5ñÀD’$qÀlqÍÅ‹g×½{÷.ã´Ý‹¬�¯<°è ¬t ò#käK¯ 45E@ù455EĺSF×®]·ß~û&÷Lž<9/^išFÄ–´¯]»6æÎ�›½d- #t ò#kPÉlô PEvÚi§Øa‡"""MÓøÁ~/¼ðBöó9sæÄ÷¿ÿýì$Ò>}úĸqãÚ]¯¹¹9V¬X‘½5jT>ƒt²@~~øá˜0aBöõÈ#�=”L× ?²@~ô:JWWô”ׇ?üá¸øâ‹#I’hmm�|àqÐAE]]]<òÈ#±dÉ’HÓ4’$‰c�=6Ú]롇Ê®kkkc÷ÝwïŠ_ bÉZùxâ‰'bòäÉ‘$IÔÕÕÅ÷¾÷½¢G€²Ð5È�¬�½N€ÒÕ=åõÉO~2vÞy爈H’$V®\÷ßÜ}÷ݱxñâì¾~ýúÅYg�µÅµn¿ýöl�¦¦¦-zY mmm‘¦i ><úõëWðDPºù‘µò¡× P:}T™úúú¸òÊ+c‡vÈN]/I’HÓ4z÷î_|q 6¬Ýu^z饘6mZöþqãÆå>;@¥“µò1dÈ�ˆX—© žÊG× ?²@>ô:JWWô”ßðáÃ㦛nŠë®».n¿ýöxá…bÅŠ1tèÐ?~|œzꩱãŽ;nq�«®º*Ö®]›½>âˆ#ò [�µÊï-oyKv=þü'€òÓ5È�¬P~z�¥KÒ4M‹€ÊÓÜÜ«W¯Î^7558 @u‘µ6¶jÕª8øàƒcñâÅ‘$IÜ{ï½1tèТÇ€Š¡k�Y `cz�¥³Ñ'P¸sÏ=7~ýë_G’$qÖYgÅç?ÿù¢Gè‘ô:Jc£O psçÎ�c�=6–.]½zõŠŸÿüç±Ï>û=@�£× Pšš¢6lXüð‡?Œ†††X±bEœvÚiñ›ßü¦è±z½N€Ò$iš¦E@×™;wn,\¸0–,YišFSSSôï߿豪‚¬Ðy³gÏŽˆˆ3fÄ7¿ù͘7o^$IÛo¿}sÌ1±×^{ÅÈ‘#£_¿~QWWסµ‡žÇÈP2]€üÈZ�§× P}T¹U«VÅM7ÝwÜqG<ú裱téÒ�~~ÕUWÅØ±c7yß=÷Ü .ŒˆˆAƒÅ¡‡Úãt+²@ù455E’$}o}µé�ßïˆ$IbÆŒ%Íå¢k�Y  |ô:JÓ±-�èVn»í¶øö·¿­­­ñ¯èëméAúÌ™3ãG?úQDDÔ××Ç<àÔR€ ÈZùHÓ4ËRëÿ×YÆT]€üÈZùÐë蜚¢ \pAœ}öÙ1oÞ¼•Ö;ùä“£W¯^‘¦i¬Zµ*n½õÖ¼Fèvd-€|¥iºÑtwºù‘µò¥× ÐquE@ù]zé¥qíµ×FĺBBš¦1hР8è ƒbûí·�+¯¼òM×0`@rÈ!ñ—¿ü%""î¾ûî8ñÄs� ;�µòñÁ~°è ºù‘µò¡× P}T™§Ÿ~:.½ôÒìÄÑ^½zÅW¾ò•8á„¢®nÝã +¯¼r«N$}÷»ßùË_"MÓxøá‡£­­-jkks� ’ÉZùùîw¿[ôPvºù‘µò£× P}T™þð‡±víÚˆˆØf›mâŠ+®ˆý÷ß¿Skí»ï¾Ùõ믿/¼ðBìºë®e™ ;’µ€ŽÐ5È�¬@¥ª)zÊçõ×_�ûï¿?’$‰$IâÓŸþt§ £F�о}ûf¯gÍšUŽ1º%Y è]€üÈZT2}T‘Gy$V¯^išFDÄÇ>ö±’תHïÞ½³ë×_½,knX|ØvÛm˲&@w$kt­ÖÖÖ˜4iRÜqÇ1kÖ¬M~~ÕUWm¶úÛßþ6^y啈ˆ6lXüñ¹Ï ›£k�Y  kéutŒ�>ªÈúHÓ4�9s攼^kkk¼òÊ+‘$IDD 2¤ä5º+Y  ë\qÅñ£ý(V¯^išnòóõjs^ýõ¸ä’K"I’¨­­�Ã?Ü ñB× ?²@×Ñë踚¢ |vÙe—ìzéÒ¥ñä“O–´Þ]wÝëJI’Ä^{íUÒzÝ™¬�¿¶¶¶˜0aB|ÿûß�U«Vmòó-A×ûð‡?ýúõ‹4M£­­-n¹å–9"¶îô÷w¿ûÝ‘¦iLŸ>}³§È@WÐ5È�¬�½N€ÒØè ÊœqÆÑ·oßH’$Ö®]ŸÿüçãÏþóV¿Ñ¢EqÎ9çÄo~ó›ìáú�!C”BÖÈÓ�~ô£ˆXWâìÛ·o\wÝuñ®w½«Skí½÷ÞÙõªU«âùçŸ/ËŒÐQºù‘µò£× Pšº¢ ¼ _ýêWãßøF$IË—/�/ùËqíµ×ÆqÇcÆŒ‰ˆuÖ“$‰¹sçÆO</½ôRL™2%þô§?Åòå˳SHkkkã»ßýnÔ××ùkTY ‹-ŠiÓ¦e4sæ™gÆ®»îÚéõÞò–·Ä€bÑ¢E1kÖ¬Øc�=Ê2+t„®@~d-€|èu”ÎFŸUèøã��–––øÉO~I’Dš¦ñØc�Åc�=¶Ñ}išÆ×¾öµM¾—$Iö¾‰'Æøñã»pz€Ê&k”ß´iÓ¢­­-"ÖýÑÌñÇ_òšƒ Ê ¡óçÏ/y=è,]€üÈZå§× Pºš¢ _úÒ—â;ßùN444dßKÓt£Âú"Âú¯ˆÈ¾×ÐÐ_|q|ò“Ÿ,è7¨\²@y½ú꫱./�92K^³ÿþÙõ²eËJ^J¡k�Y  ¼ô:Jg£O€*ö¡}(nºé¦8á„¢W¯^Ù÷ßXJØðûµµµñïÿþïqÓM7Å1ÇÓå3t²@ù¬?¡="bÛm·-Ëš«V­Ê®ëêêʲ&”B× ?²@ùèu”οtUnÔ¨QqþùçÇ9çœS§N�Gy$š››cáÂ…±dÉ’hhhˆ�ÆÈ‘#ã ƒŠqãÆÅvÛmWôØÝ‚¬PýúõË®ËuJ{kkkv=pàÀ²¬ ¥Ò5È�¬Pz�¥³Ñ'@1`À€8ꨣ⨣Ž*z€ª#k”fРA‘¦i´´´ÄÚµk£¦¦¦Óë½òÊ+ñÚk¯e¯‡ZòŒPNºù‘µJ£× PºÎÿ« PMMMÙõŠ+búôé%­wÛm·e×µµµ±÷Þ{—´@O¡× P:}…Úyç�cäÈ‘‘$IDDüüç?ïôZK—.�«¯¾:’$‰$IbÏ=÷Œ~ýú•kT€ª¦× P:}…;î¸ã"MÓHÓ4îºë®øýïßá5ÚÚÚâ+_ùJÌ�;7Ò4�ˆˆ“O>¹Ü£T5½N€ÒØè(ܧ?ýéØn»í"I’HÓ4¾þõ¯ÇW\mmm[õþæææøÄ'>wß}wvêûN;íï{ßûrž ºèu”&I×oq @ÕJÓ4fÍš¯¼òJ,]º4V¬XÑ©uŽ;î¸òPd-€ò¹ûî»c„ ±víÚHÓ4’$‰í·ß>Ž=öØ3fL|ñ‹_Œˆˆ$IâœsΉ‘#GÆK/½S¦L‰)S¦d'ÇGD444Ä/~ñ‹=zt‘¿lB× ?²@ùèutž�>ªØ=÷Ü7Þxc<øàƒ�.&lhæÌ™e˜  :ÈZùøÕ¯~ç�wÞFåÎ$I""bêÓúï­·¾@š¦iÔÕÕÅE]ÇsL× oB× ?²@>ô::§®è(¿ùóçÇĉã¯ýkDlü ¼£Ö?Dãv€žJÖÈ׉'ž;ì°CLœ81æÍ›·QtÃÜôÆrèúl5xðàø¿ÿ÷ÿÆþûïßå³ÀæèäGÖÈ—^'@ç$i)ÿ… @ÅY¸paœ|òÉñüóÏoô�¼ÔÇ@I’8�èñd-€®³dÉ’¸á†bÒ¤Iñꫯ¾éý ˆSN9%>ñ‰OD¿~ýº`Bxsºù‘µºŽ^'@ÇÔ=åuá…ƬY³6:íªÿþ1~üøxë[ßÛn»môîÝ»è1º%Y  ëôïß?>ó™ÏÄi§�O=õT<òÈ#ÑÜÜ .Œ%K–DCCC 80FŽtPìµ×^QW§@eÑ5È�¬Ðuô::&IK=†€Š±páÂ?~|¬]»6;‰ôsŸû\|æ3Ÿ‰úúú¢ÇèÖd- #t ò#kPÉlu PE¦L™mmmÙI¤&LˆÏ}îsE�Pd- #t ò#kPÉjŠ€ò™3gNDD¤i½zõŠSO=µà‰ª‡¬t„®@~d-*™�>ªÈªU«"""I’ØqÇ£¡¡¡à‰ª‡¬t„®@~d-*™�>ªÈàÁƒ³ëÚÚÚ'¨>²Ðºù‘µ¨d6ú¨"oûÛ#""MÓ˜3gNÁÓTY è]€üÈZT²º¢ |vß}÷Øm·Ýâ¹çž‹ ÄO<‘(�¬Pš#�<²�ÏM’$&Ož\ÈgгéäGÖ(�^'@¾’4MÓ¢‡ |n¿ýöøâ¿I’ÄÁ—_~yÑ#T Y  óššš"I’èêºR’$1sæÌ.ýLXO× ?²@çéu䫦è(¯£�>:Ž?þøHÓ4xà�¸ð ‹  jÈZ¥K’¤Ë¾ hºù‘µJ§× �}T¡óÏ??N8á„HÓ4®¾úêøøÇ?=ôPÑcTY  óÒ4íÐW)ïíêæ =ºù‘µ:O¯ ?Iê_>€ªuë­·Æ\­­­ÑØØ£G�ŽAƒE}}}‡ÖJ’$.¸à‚<Æè–d-€Ž™:uj‡îòÉ'ã /Œˆuyéšk®éôgxà��~/”‹®@~d-€ŽÑëÈW]Ñ��Å‹Ç?þñ�XµjUvÊÕ¢E‹bÊ”)^+MS%€ ÈZ×ÑRf[[[Iï€J¢k�Y  ãô:òe£O€*ôØc�Å„ ²SH“$)x"€ê!k¡k�Y €Jd£O€*ÓÜܧ�vZ,]º4"ÖÖŸF @id- #t ò#kP©lô PeÎ?ÿüXºtiviš¦qÈ!‡ÄG»ï¾{ 80 ž {’µ€ŽÐ5È�¬@¥²Ñ'@yþùç㡇ÊN 0`@\rÉ%qÀ=@·'k¡k�Y €JVSô”ÏôéÓ#bÝ ¤I’Äyç�§ P&²Ðºù‘µ¨d6ú¨"­­­Ùuccc}ôÑNP]d- #t ò#kPÉlô PEúöíI’ÄÈ‘##I’‚'¨²Ðºù‘µ¨d6ú¨"Æ Ë®W¯^]à$ÕGÖ:B× ?²•ÌFŸUäío{ÔÖÖFš¦ÑÒÒkÖ¬)z$€ª!k¡k�Y €Jf£O€*2lذ7n\DD¼þúëqß}÷<@õ�µ€ŽÐ5È�¬@%³Ñ'@•ùÜç>µµµñßÿýß±lÙ²‚'¨²Ðºù‘µ¨T6ú¨2ïxÇ;â¿þë¿""â…^ˆ3Î8#æÍ›WðTÕAÖ:B× ?²•ÊFŸUèä“OŽ‹/¾8úõëÓ¦M‹÷¾÷½ñÃþ0žzê©HÓ´èñº5Y è]€üÈZT¢$õ_¥UåÈ#�Ì®—,Y‹/Žˆˆ$I""¢®®. ½zõêкI’ÄäÉ“Ë7(@7$ktÞ†Yjk¬\¹2æÍ›ëòÒðáÃ;õ¹²EÒ5È�¬Ðyz�ùª+zÊ«¥¥%’$‰4M#I’¬œ°þ¼—Õ«WgÒ;bý:=™¬Ðyf©ŽJÓ4ZZZ:õ¹²EÒ5È�¬Ðyz�ù²Ñ'@•zãƒîR|wæ!=@5“µ:¯+ š²•B× ?²@çéuäÃFŸUføðáE�Pµd-€Ò(hÐÓèäGÖ(�^'@~’Ô¿²@ΦN�ZØgxà�…}6@¥ÑëÈ—�>  ꊀòikk‹åË—g¯{õêÛl³M�TY è]€üÈZT²š¢ |~ÿûßÇ�}=òÈ#E�P5d- #t ò#kPÉlô PEZ[[#MÓHÓ4ú÷ïcÇŽ-z$€ª!k¡k�Y €Jf£O€*Ò§OŸˆˆH’$†^ð4ÕEÖ:B× ?²•¬®è(Ÿ!C†=@Õ’µŠ×ÜÜW\qED¬ûC� .¸ à‰ }ºù‘µŠ§× Ð>}T‘]wÝ5""Ò4�W^y¥àiª‹¬P¼W_}5~ÿûßG’$ ¡T4]€üÈZÅÓëh_MÑP>»ï¾{ì¾ûî±xñâxüñÇ ž zÈZ•#MÓ¢G€7¥k�Y  rèulÊFŸUæ„NÈ®ô£8 @õ‘µ€ŽÐ5È�¬@¥²Ñ'@•9ùä“cß}÷�4Mã¯ýk\xá…E�P5d- #t ò#kP©lô Pejkkã'?ùIì·ß~‘¦i\}õÕñÑ�~4zè¡¢Gèöd- #t ò#kP©’4MÓ¢‡ |.¹ä’ˆˆX³fMÜxã�1oÞ¼H’$""¶Ûn»ØsÏ=cäȑѯ_¿¨««ëÐÚ&L(û¼Ý‰¬P¬¿ýíoñ©O}*""’$‰™3g<l™®@~d-€béu´ÏFŸU¦©©)+%¬·á# 7þ¬#<`z:Y  X ¡t7ºù‘µŠ¥× оŽ7@·TJ1!b]É¡Ô5ª•¬t„®@~d-*��>ªÐ†§�P^²Ðºù‘µ¨D6ú¨2×^{mÑ#T-Y è]€üÈZTª$u4Ð ¼öÚkñÀd¯?øÁ8 @Ï¥× Ð>}@Ô=T}@Ô=@gÝÿý1mÚ´X°`A 0 ÆŒ‡~xÔ××=@�¢× °Ž�>z€4Mã‰'žˆiÓ¦Esss,Z´(–,Yk×®�¯~õ«1zôè¢Gè¶d-€ò˜;wnÜÿýÙëC9$† Öîý/¼ðB|á _ˆgŸ}v“Ÿ 2$¾ýíoÇ¡‡šË¬P ]€üÈZå¡× P}T±Õ«WÇ/~ñ‹¸öÚkcöìÙý,MÓH’$-Z´Ù÷ž{î¹ñàƒFDÄðáÃãºë®Ë}^€îDÖ(¯I“&ÅW\ýû÷�÷¾÷½íÞÛÚÚûØÇ¢µµ5Ò4�ˆˆ$I"b]{õÕW㬳Ίÿ÷ÿþ_~øáù[A× ?²@yéu”¦¦èÈÇ‹/¾'žxb|ï{ß‹–––ìÁxDltÝžû·‹–––hii‰Gy$üñ<ÇèVd-€ò»óÎ;³,õÞ÷¾7z÷îÝî½^xaÌ›7/"6.‚nX]³fM|õ«_�… æ;8l]€üÈZå§× P}T¡þóŸqòÉ'ÇÌ™3³SG#þõP|ýë-;vlì¼óÎÙë[o½5·yºY  ü/^Ï?ÿ|–¥;ì°vïmii‰[n¹%’$‰4M£W¯^qæ™gÆå—_]tQ¼ýíoÏŠ¡‹/Ž+¯¼²+~h—®@~d-€òÓë(��>ªÌªU«âôÓO�ÖÖÖì{Ç�ÿú¯ÿŠ[o½5}ôÑ­.*¼ç=ïÉ®xà�\æèNd-€|<ûì³�ܾï¾û¶{ïÍ7ßk×®Ír×ÿüÏÿÄ¿øÅ8ä�Câýï\ýõ1f̘ˆX÷G;7ÝtS—ü°9ºù‘µò¡× P:}T™_üâñ /d%„£Ž:*þô§?ÅÇ?þñØe—]¢wïÞ[½Ö¡‡ëœÏš5+,X�ËÌÝ…¬��—_~9»2dHôïß¿Ý{ï¹çžˆˆH’$šššâÝï~÷F?¯¯¯�/~ñ‹ÙëW_}5žþùò [I× ?²@>ô:Jg£O€*síµ×f…Ñ£GÇÅ_ �Zëmo{ÛF§–677—eF€îJÖÈÇú?ŽI’$Øî}Ë–-‹üãYŽú·û·ÍÞ7nܸèÕ«Wöúé§Ÿ.ã´°õt ò#käC¯ t6ú¨"ÍÍÍ1{öìHÓ4""Î>ûìØf›m:½^Ÿ>}bذaÙë—^z©äº+Y ?+V¬È®{÷îÝî}ÿûßcÍš5Y&;ôÐC7{_]]]Œ5*{=oÞ¼2M [O× ?²@~ô:Jg£O€*2cÆŒìºOŸ>1nܸ’×lllÌ®/^\òzÝ•¬�ŸÚÚÚìzåÊ•íÞ7mÚ´ìº_¿~ÑÔÔÔî½ýúõË®—-[Vâ„Ðqºù‘µò£× P:}T‘ùóçGDD’$1räȨ©)ýñφ'mmx@O#kä§ÿþ‘¦i¼òÊ+íÞ÷·¿ý-"Öe²}öÙg‹kn˜¯Ê‘Ý £t ò#käG¯ tþ¥¨"žŠU___–5—,Y’]oxZ@O#kägÇwÌ®-Z³fÍÚäžyóæÅ£�>I’DDÄ�¸Å5.\˜]ËZA× ?²@~ô:Jg£O€*2hРìzÁ‚%¯×ÖÖ¶ÑI[,yM€îJÖÈÏèÑ££¦¦&+{^wÝu›Ü3iÒ¤X»vm¤icÇŽmw½¥K—ÆÜ¹s³õ†žÃÔ°eºù‘µò£× P:}T‘!C†DDDš¦1{öì�NíŒüã±|ùòìõN;íTÒzÝ™¬�ŸÄ;ßùÎHÓ4Ò4�_þò—qÉ%—ÄüùócñâÅ1iÒ¤¸âŠ+²‚ç;ìcÆŒiw½3fdkEl|²<t]€üÈZùÑë(��>ªÈ¾ûîuuu‘$I¤i·Ýv[Iëýò—¿Ì®·ø� ÚÉZù:ýôÓ#"²¼ué¥—Æøñãã ƒŠï|ç;±fÍšHÓ4’$‰O}êS[\ëî»ïήýñ …Ð5È�¬�/½N€ÒØè Šôïß?öÙgŸìT«Ÿýìg�&Ú�=öXÜ|óÍ‘$I$I‡rH™§è^d-€|�;6>úÑ�f¥ÏˆÈ²×†ßÛ{ï½ãøã�ßâZ·ß~{–µöÙgŸÜg€ÍÑ5È�¬�/½N€ÒØè Ê¬?õ*I’xùå—ãÿïÿ«W¯îÐ3gÎŒÏþóÑÖÖ–=lÿÌg>“Ǹ݊¬�¯o|ãñÙÏ~6jkk#MÓ�~–¦iŒ?>.»ì²¨­­mw�»ï¾;fÏž�½ÿÐCÍufØ]€üÈZùÒë輺¢ ¼Ž8âˆ8à€âᇎ$Iâ®»îŠN8!¾ò•¯Äرc·øÞ¹sçÆ¤I“bÒ¤IÙ)¦I’ÄûÞ÷¾xë[ßÚãT4Y _úÒ—â#ùHÜyç�ñ /ÄŠ+bèС1~üø­:Åýþûï�¦¦¦ìõ‘G™ç¸°Eºù‘µò§× Ð9IúÆ-’èöæÏŸÇ|Ìž=;"";QtðàÁ1f̘¸çž{"b]á ƒŠ^½zÅ‹/¾/¾øâF÷§i{ì±GüêW¿Š†††¢~€Š"k¡k�Y €Jd£O€*õ /ÄYg�³fÍÊ ±Ñõú×±É÷Ò4�Ñ£GÇe—]Æ ëÚá*œ¬t„®@~d-*MMÑ���vÚ)~÷»ßʼn'žµµµñ¯BB’$Ù×z¾®­­�O<1n¸á€Í�µ€ŽÐ5È�¬@¥IÒ �™ *Í™3'&Mš÷Ýw_<ûì³ÑÞ#¡wÜ19ä�øÄ'>£F�êâ)º'Y è]€üÈZT}ô0‹/ŽçŸ>.\‹/ŽÞ½{ǶÛn£F�rò(@‰d- #t ò#kP}…›={vnk><·µª�^'@ilô ®©©)’$)ûºI’ÄŒ3ʾ.@µÒë(M]ѬçÜb€Ê × Ð96úºµ7ž¯T P ½N}t;?üpaŸ}ÀöÙ]AÖ(Î?øÁ¿gùòå1þü˜1cF,]º4"Ö•CG�ûG€MèäGÖ(Ž^'@i’Ô6ÇÝJSSÓ&'Yu…$IbÆŒ]þ¹ÿ¿½{ ±ªlãþ¬™iÆy(G»HƒD(3Ó …éB$*ÄЯ ‹¨$AÌQËŠ¡‹ µ´’°B"Ì4„(¼HJÊy ¨ Œ<å!5GÔõ]ˆû³¦¯œ™½\ûðûÁàÚ3{½ë™›áùÏÿ½–ìµÊSš¦±qãÆxë­·âûï¿�$Ibúôé1wîܼG ÂÉdÇ^  <ÉuDÔä=�“¦é5ÿ¨öZå%I’¸ï¾ûbÕªUñðÃGš¦±lÙ²X°`AÞ£P%d ²c¯P^ä:}”­$I®Ù@µ±×(Ouuuñꫯƈ#"MÓX¾|y|õÕWy�@�5ÈŽ½@y’ëªY]ÞÐ1���z[[[9r$".˜ÅXÁ^  üÕÖÖFsssL›6-""-ZãÆ�Ëy**•¬@vìµÊŸ\'P­’4MÓ¼‡ ;›6mЧžz*".…öìÙ“óD•Ã^  4]¸p!ÆŒ§OŸŽ$Iâ³Ï>‹¡C‡æ=ÈdÈ^  4ÉuÕ¨&ïÈV’$y�P±ìµJSmmm 4¨ðz×®]9Nÿ#k�{-€Ò$× T#EŸ@Å©¯¯/\>|8ÇIª›\'Pm}çÀ�…뺺º'¨nr�@µQô T”Í›7ÇÑ£G ¯ûõë—ã4ÕK®¨FŠ>€Šqüøñ˜?~$IRøÜwÜ‘ãDÕI®¨VŠ>€²wòäÉøøã�cÒ¤I±wïÞˆˆH’$n½õÖ2dHÎÓT¹N ÚÕå=Àã�?Þ©ûÎ�;GމD𦑦i$IRøwÞ¼yEž ²Éut�¢O w›7oŽ$I:uoš¦…ëËaЈˆY³fESSSQæ¨r�]£è(k—ƒ¤—O~0`@¼ôÒK1a„œ'¨.r�Š>€qå îW«¡¡!zõê���1|øðhjjЦ¦¦¨­­Í`B€ê × ÐyŠ>€Üµ´´ä=!× ÐU5y•@Ñ'A]ÞÐ1[¶léÐû[ZZþôzëÖ­‘¦i§ž=zôèNÝP.ìµ€Ž�5ÈŽ½å*I;û)¹6lX$IÒ¡{®ü/ ŽÞ{å}»wïîÔ½åÂ^ èY€ìØkP®êò€ÎéÈù-WœûðïìµJÏùóçãèÑ£qâĉ8}útôìÙ3z÷î7ÜpCÔÕ‰A�/Y€ìØk”¹N€æ'!@™êÊ©¢%ØT{-€Ò°oß¾X½zulÙ²%öìÙmmmíÞS__Ç�1cÆÄ”)Sâæ›oÎaRª�¬@vìµJƒ\'ÀÕSô Pfó bÙk”†ß~û-æÏŸ6l(üÍÿûCšsçÎÅöíÛcûöíñÞ{ïÅøñããå—_Žþýû_Ë‘¨R²Ù±×( r�—¤Ž’JÄ×_Ï=÷\œ8q¢M’¤ðõ+ãN÷ù$I¢wïÞ±hÑ¢¸÷Þ{¯ÑÔ•G® s}%aÛ¶m1mÚ´8{ölD\ w^Ž7ÕÕÕÅ-·Ü}ûö�=zDkkk?~<~þùç8þ|»÷wïÞ=V¬X#GŽÌç›(cr��§èÈ]kkkL˜0!Ž9Rv&I<ð@Lž<9î¾û¯ow_[[[lÛ¶->ù䓸üóÏ ŸOÓ4nºé¦X¿~}tïÞýZ~+eM® k}¹[²dI,]º´0`@,^¼8î¼óΫ^cçÎ�1{öì8xð`!P:sæÌxæ™g² ÂÈut�¢O wMMMqøðáHÓ4úôék×®�ÆÆÆ¯³ÿþ˜€\�;w®pÝÐÐP”5ëëë ×mmmEY ÒÉut�¢O Wýúõ‹ˆˆ4MãÀ�EYóàÁƒ…ë¾}ûeM€J'× ÐuŠ>€\ 8°p}üøñرcG—ÖÛ±cG;v¬ðº±±±KëT ¹N€®Sô äjÔ¨QÑÐÐI’DDÄ‚ º´ÞÂ… ×õõõ1jÔ¨.­P-ä:ºNÑ'�«nÝºÅØ±c#MÓHÓ4¶nÝ/¾øb\¼x±Cë¤i¯¼òJlÞ¼9’$‰$IbܸqÑÐÐ�Ñä•E® ë}¹knnŽšššH’$Ò4�O?ý4¦L™ß|óÍUÝÿí·ßÆ”)SbõêÕ…5jjj¢¹¹9ãÉ*‹\'@×$iš¦yðúë¯ÇòåË �Έˆ$IbàÀ�qÏ=÷Äm·Ý}ûö�=zDkkküþûïÑÒÒ›7oŽýû÷GÄ¥Óß“$‰ˆˆiӦżyórû~Ê•\'@ç)úJÆ /¼ëÖ­+„:¯ †þ?}Oš¦1iÒ¤xíµ×2ž rÉutŽ¢O ¤¬\¹2.\gÏžýSôï¢Nýz·nÝâùçŸ�G}ôšÌ PÉä::NÑ'Pr:~øa¬Y³&Ž=ú¯ï¿ñÆcòäÉ1uêÔ0`À5˜ :ÈutŒ¢O ¤ýôÓO±sçÎøõ×_ãäÉ“ÑÚÚ=zôˆë¯¿> #FŒˆ!C†ä=&@Å“ëøwŠ> jò*�¢O(EŸPuyT¾?þø#·g÷êÕ+·g”¹N€l%iš¦yT¶aÆE’$×ü¹I’ÄîÝ»¯ùsJ•\'@¶êò¨Î$( r�ÙQô \YŸüž¦éŸž!€ ð÷ä:²£èÈ\cccæÏ8þ|>|8óà)@9“ëÈ–¢O s6lÈlí‹/ƺuëâí·ßÎì•B® [Š>€²µ~ýúX²dIìÝ»7"¢pê{š¦1~üøÜf¨&r�—(úÊÎÆ�cñâűgÏžBø3I’ÂõرccΜ9qûí·ç9&@Å“ëø³$½ü ÄmÙ²%Þxã�øî»ï"âÒ ïWAïºë®˜;wnŒ=:Ï1*ž\'ÀßSô ”¼]»vÅ›o¾›6mŠˆÿA/_>ùd<ñÄÑ«W¯œ§¨\r�ÅQ—÷@õ9sæL|ðÁ±bÅŠ8uêT\>¯8I’HÓ4ºuëS§N�éÓ§GŸ>}ò ‚Éu—¢Oàšikk‹�>ú(–-[ÇŽk­­­�Gy$f̘ýû÷ÏyZ€Ê%× � EŸ@æ.\¸kÖ¬‰¥K—Æ¡C‡ÚAkjjbâĉ1sæÌ€Ì 6,’$‰ˆ(AGŽsæÌ‰áÇgúì^½zeº>@9‘ëÈ–¢O s „FDáu–’$‰Ý»wgþ€r!× �­º¼ªË_ƒ¡äC® ø}¹Èúäw�S€«#× P<Š>€Ì566æ=!× �µ$Uo ]V“÷P }@(ú€"Pô E èŠ@Ñ'�¢O(EŸPŠ> }@(ú€"Pô E èŠ@Ñ'�¢O(EŸPŠ> }@(ú€"Pô E èŠ@Ñ'�¢O(EŸPŠ> }@(ú€"Pô Eð_+ÅRBñ~IEND®B`‚accelerate-1.14.0/benchmarks/torch.compile/imgs/speedup_factor.png000066400000000000000000006632711521253476100252450ustar00rootroot00000000000000‰PNG  IHDRúÛiÜu€:tEXtSoftwareMatplotlib version3.10.1, https://matplotlib.org/soþå pHYs.#.#x¥?vIDATxœìÝw”Ö7à;À�3t@EPŠqŬ«bVTÌ kÀ´bZ\pƒ(‹¾*&À„¢bóvTP’€”$’Ò Ì|xô“íœÐ€ç9‡säVÕ­Û=]ÝUcñë´¼¼¼¼Š¥BY[AŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ T*ëøÿæÍ›‡~xBýý÷ß�¦M›¨Çþð‡˜?þ&µûî»/ºuë–’aK2bĈ¸å–[6©eddÄ|P íSqLn+ÆŽç�w^B}úôée0 lzè¡8pà&µŽ;Æ�!CÊh"JÚ¹çžãÆ�Û¤Ö³gÏèÕ«WMe'× ­[·N¨=óÌ3Ñ©S§bͶµqm …S¡¬€­A¥²`ìØ±qÞyç•è>^}õÕØm·ÝJt°%š?~¼öÚk…Ú&---ªU«5kÖŒš5kF£F�¢M›6Q½zõš¶ ‚>¶+W®Œ§Ÿ~:¡~þùçGíÚµË`"ʃyóæÅ€ŠÝ§B… ±óÎ;Çþûï§œrJì±Ç)˜(¨‡z(¡vòÉ'GÓ¦MË`Øv úØT¸áõ²�ËýÛ e=[ •+WÆÀ�ê'Ÿ|² O(a³¨\Ö#�BͯÍ.ëÊ¥ÜÜܘ5kVÌš5+† {ì±GÜu×]Ñ®]»² ¶ É®÷:vì(èJY…²ØúL™2%Î8ãŒxà�Êz(5•Êz€ütêÔ):w^ 6LI à6nÜ?üpDD\{íµe; ”AŸ@¹µß~ûÅ•W^YÖc[°nݺE·nÝÊzŒmB§N�búôée=)Ô³gÏèÕ«W¾Ë³²²bÅŠ1}úô;vl¼úê«‘™™™t݇~8Ú´iG}t M»mêÕ«×fF[3× ¥§iÓ¦žk(„ e=°å©Y³fdddÄþð‡¸å–[âßÿþwœqÆù®ÿ�ü#6lØPŠ@éô [µjÕâî»ïŽ‹/¾8éòï¿ÿ>Þ|óÍRž J— O e®¿þúhÙ²eÒeüq)O¥«RYl›æÏŸÓ§O�… ÆêÕ«£råÊÑ AƒØu×]£uëÖ‘––VÖ#EP¡B…èÑ£GÜ~ûí ËþûßÿF^^ÞV÷9Ÿ——Ó§O�o¿ý6–.]ÙÙÙQ£F�hÒ¤I´iÓ&222ÊzD€Rµxñâøæ›obþüù‘••+VŒúõëG‹-b÷Ýw�Š+–õˆ%FÐ'e"+++>þøã?~||óÍ7±`Á‚ÈÌÌŒõë×G•*U¢F�ѨQ£Øu×]£M›6qÀDëÖ­S²ïìììøÏþcÆŒ‰)S¦ÄܹscåÊ•‘��UªT‰ ÄN;í{î¹g|ðÁ±×^{¥d¿5nܸxï½÷bâĉñÃ?ÄÊ•+£B… Q¯^½_Ÿ‹O<1êÖ­[ ~k×®�>ø >úè£øæ›obÑ¢E±zõê¨]»vl·Ýv±çž{ÆGx`‰‡­deeÅ‹/¾/½ôRÌœ93ßõ6l'�tRœþùѰaÃ�©´eeeÅ_|_ýuÌš5+fϞ˖-‹Õ«WGvvvÔ®];êÔ© 4ˆöíÛG‡b¿ýö‹Úµkiƒ úõ¿W­Z•t�aÆE­Zµ~·WíÚµ£{÷îEš£8Êû1;cÆŒ=zt|ùå—1kÖ¬X±bE¤¥¥Eýúõc»í¶‹:ÄÁ�:uŠ *”êle¥K—.IëË–-‹+Vøùäøë_ÿZäžóæÍ‹Ã?<¡þþûïGÓ¦MK|ûˆˆ?üá1þüMj÷Ýw_tëÖ­@Û—´éÓ§Çã�?£G�ŽìììBmÛ¨Q£8餓âôÓO/R�ÐêÕ«ã©§žŠgžy&233 ¼ÝÎ;ïW\qEœx≑––VèýFD<ôÐC1pàÀMj;vŒ!C†üú÷Ï>û,î»ï¾˜6mÚïö«^½zôìÙ3.¸à‚|.6lØO?ýt<úè£z¼»ï¾{Üu×]Ѿ}ûß]7™sÏ=7Æ�·Ií·ÇñÇ·ß~{,Z´¨À=kÔ¨7ÞxcœuÖYEšiĈqË-·lRËÈȈ>ø @ۧ☌ˆX¸pa¼õÖ[ñÎ;ïĤI“bãÆ�Þ6"¢ZµjqÆgÄ…^XàÀŸ_¤2ÜjsÏ]~ïåÓ§O/òþÊû1;sæÌèÛ·o|úé§ê¹ûî»GïÞ½£sçÎEš‰-Ûì„þlMš_[¸s˜ò®¤ÎÇÛ·oëׯO¨�=ºÈ¡‡¹¹¹1räÈûì¸ì²ËŠžý[yyyñôÓOÇ<k×®-ðvÛo¿}ôíÛ78à€ˆ(ØçÍæwûdæÏŸƒ Š×^{-rrr ¼]çÎ�£W¯^Ñ¡C‡"ïû÷Î'#">üðÃøÛßþß}÷]�zyä‘qã�7+LpýúõñÑGÅ›o¾ÿýï7T/™Î�;Çå—_ûï¿‘çˆ(ØsT–æÎ�O<ñD¼ú꫱fÍšBm[·nÝ8þøãã´ÓN‹6mÚzß999ñüóÏÇàÁƒcáÂ…Þ®qãÆqñÅÇYg�ééé…ÞoDÁ®;¾ù書÷Þ{ã‹/¾øÝ~éééÑ£G�¸úê«7øÒK/ÅÀ� ôx›5kwÞygxà�¿»n2¿÷;”‰'FïÞ½cÖ¬Yž—_~y\qÅEúÒ‰T\ƒ$»^zæ™g¢S§Nî±lÙ²=ztŒ=:&L˜Pèßu¤§§Ç 'œ—^zi¡?“ý¨8ò{îRumü[åý˜ýñÇ£_¿~1zôèÈÍÍýÝž;î¸cÜpà qÔQGi&¶.¥÷–lÓÖ®]wÝuWœtÒI1räÈB_DDüôÓOñè£�ÆùçŸ_èmÇ�'œpB<øàƒ… Œˆ˜3gNôîÝ;Î9眔hü"///þùÏF�= ò±fÍšèß¿\sÍ5IŸËE‹E÷îÝ£ÿþ~¼S§N�³Î:+Þ{ï½ÂŒ_ /¾øb\vÙe… ùŒø9èñÎ;ïŒ[o½µÐá˜åÅ“O>‡vXôïß?¾úê«"=޵kׯSO=Gyd¼ñÆ%0eùSž�ÙˆˆçŸ>N<ñć|Fü|ŒõèÑ#ž~úé™  ¼©S§NÒzaß×1}úô8õÔS£wïÞ… ùŒøùÜéñÇ�c�=6þûßÿiÿ¿ÈÉɉn¸!î»ï¾B…|Füþ}ñÅÇK/½T¬JʰaÃâ¸ãŽ‹—^z©P!Ÿ?‡ÖŸsÎ9ñç?ÿ9Ö­[—òÙrrrâÏþs\~ùåùŒˆxç�wâä“O.P¸b2óçÏ�8 zõê£G�.RÈgÄÏÏO�=âúë¯/‘秬mذ!zè¡8öØcãÙgŸ-tÈgÄÏï C‡�O<±ÐÛNŸ>=ºuë÷Þ{o¡#~¾vúË_þ'Ÿ|r�¯Ç kذaqê©§øu˜““�=öXôèÑ#éknÕªUqùå—Çm·ÝVàÇ;wîܸ袋bذa…š½ >üðÃ8÷Üs òñóã|衇âòË/ßb�‹Q£FÅAwÝuWŒ;¶H¿ëÈÉɉ#FÄqÇO>ùd LYþ”÷cöý÷ß�ãŽ;.Þzë­…|FDüðÃqõÕWë „Øzú ÄÍ›7/N=õÔxöÙg ��J¯¼òJ\pÁÅüûòË/ã´ÓN‹)S¦¤h²ŸÝsÏ=ñÈ#�D^^^¡·}ç�w¢OŸ>›Ô.\Ý»w� &ºß† âÚk¯�±cÇzÛü¼ÿþûѧOŸbýì_~ùå¸ãŽ;R6SiZºti‘~¶É¬[·.®¿þúx衇RÒ¯¼*ïÇìÃ?}úô)tZÄÏÁ¾}ûö�¡C‡¦t&€ò(¿Ð¶J•*º×èÑ£ãŒ3Î(ö{úâÅ‹ãâ‹/Ž#Fiû¼¼¼¸ù曋¼½qãÆøóŸÿÿþ÷¿‹Ü#ÕòòòâŽ;ᄏÐá¥ÿëÅ_ŒîÝ»9Ð5™œœœ¸êª«âÅ_,ÒöYYYqñÅÇĉ ½íºuë"++«HûMæ�7ÞˆsÎ9'–/_ž²že-333Î?ÿü8p`‘B‹ë“O>‰3Ï<³ÐÀÿëÛo¿�³Î:+>þøãMö³ÁƒÇÝwß6l(ô¶_~ùe\sÍ5›l»råÊ¸à‚ âÃ?,Ò<÷ÜsO¼þúëEÚ6™‰'Ƶ×^[¬ Î�?þ8®ºêª"=Ge-333esoܸ1þú׿Æ-·Ü’²kÈò¨¼³¯¾újôìÙ³ÈïýO>ùdôë×/¥3°å)ü]rPsçÎ�îÝ»Ç�?þ˜ï:Õ«W�}÷Ý7š4i 4ˆÜÜÜX±bE,\¸0&OžË–-+òþßyç�¸õÖ[ó ™¬ZµjtîÜ9222¢víÚ±téÒ˜={v|ùå—I·Yºti\xá…ñüóÏGóæÍ‹<×/†Æ Û¤V­Zµèرc4mÚ4êÔ©+W®ŒéÓ§ÇøñãcãÆ� =FŒ‡vXy䑱nݺ¸üòËã‡~Ød�vØ!:tèÛm·]T®\9/^ãÆ�‹¹sç&ôËÉɉ;î¸#^ýõ¨\¹r±ßâÅ‹ã–[nÙ乬_¿~œxâ‰qÄGDÓ¦M£^½z±téÒ˜3gNŒ5*Þxã�X½zuB¯—^z)Ú·ogœqF±f*/jÖ¬­[·Ž�vÚ)jÖ¬µjÕŠœœœX¹reÌš5+¦L™’ôyˆˆ8p`´jÕ*Ž:ê¨Ržºä•÷cö•W^‰x`“ZÅŠ£}ûöѲeËhРAlذ!-ZŸ}öY,^¼8iŸûï¿?>øàØqÇ‹=@y´~ýúXµjUÒeuëÖ-T¯7ß|3n¼ñƤçA?6ì¹çž±óÎ;Gݺu#///–,Y_}õUÌš5+aý�7Æm·Ý 4ˆC9¤P³ :4ß�ϺuëÆÿøÇ8âˆ#bÇwŒúõëGfffÌŸ??>øàƒxíµ×bÑ¢E‘››½{÷ŽcŽ9¦Pû/)}ûö�^x!ßå 4ˆŽ;FãÆ�£J•*±hÑ¢˜:uj¾!m“&MŠ‹.º(ž{î¹bŸOFDÜqÇñÑGmR«V­Zì·ß~‘‘‘õêÕ‹Õ«WÇܹsã³Ï>‹5kÖ$ôX»vmÜvÛm1bĈHOO/öL+VŒæÍ›Ç®»îuëÖ�ZµjE¥J•bÕªUñÓO?ÅäÉ“ó -Ÿ¾ýöÛ„~yyyqï½÷F—.]¢~ýúÅz|¿|ÁoŸÿ5jÄñÇÇsLì¼óÎÑ AƒX¾|yÌ�;7Þ}÷Ý9rdÒküO?ý4|ðÁøÓŸþT¬™Ê‹jժŮ»îÍ›7�ÚµkG­Zµ"777V­Zßÿ}Lž<9ß@ä#FÄ®»î^xaé] Êû1;f̘¸í¶Û6¹¶LKK‹6mÚÄî»ïõë×� *ÄâÅ‹ãóÏ?Oú;•ˆŸÃ>»víš’™Ø2 ú ÄdeeÅe—]–oÈgûöí£gÏž±ÿþûo6höìÙ1jÔ¨xóÍ7ã»ï¾+ðþ-Z·ß~{Òð¿êիǵ×^§œrJÔ¬Y3é¶�?þx 2$òòò6Y–™™½{÷Žçž{.*V¬Xàyþ×üùó£ÿþ¿þ½^½zqÍ5×D·nÝ¢J•*I×ïÓ§O|òÉ' Ëú÷ï]»v�ûî»/¦M›ök½C‡qã�7Æ^{í•t†÷Þ{/úôéK–,Ù¤>gΜxæ™gââ‹/.â£ûÙË/¿6løõïÇsLÜyç� _Ûo¿}l¿ýö±ÿþûÇe—]7ß|sŒ7.¡ßý÷߇vX4jÔ¨Xs•…´´´Øk¯½âÈ#�Œ?üá±ÓN;EZZZ¾ëçääÄûï¿�>úhL™2%aùí·ß{íµW4nÜx³û�>}ú¯ÿ=oÞ¼8üðÃÖyÿý÷£iÓ¦…x4%cK8fïºë®MfêÑ£GœþùICëòòòâ­·ÞŠ¾}û&cëÖ­‹ûî»/~øá"ÏPžM˜0!áý8âç÷ÎŒŒŒ÷ùúë¯ãæ›oNòÙªU«¸ä’Kâè£�Î÷\ræÌ™ñÏþ3Þ}÷ÝMê¹¹¹që­·Æë¯¿^à »ü1þùÏ&]vôÑGGŸ>}z5jÔ(5j{ï½w\~ùåÑ¿ÿxþùç#âçϧ—^z©@û.I}ôQ<óÌ3I—5mÚ4n½õÖ8ôÐC“~†N›6-ú÷ïÿùÏ–Mž<9þñ�ÄÍ7ß\¬ùF�½É5ÀöÛo×\sMwÜqIîëÖ­‹Ç<yä‘„P¸3fİaâG�Ešeûí·�®]»Æ‘G{î¹gÒsößš>}z 6,†žp~óá‡ưaÃâœsÎ)Ò,åÁ† ¢W¯^ù†|6oÞ<®¾úê8ôÐC£zõêùöY¸pa¼ýöÛñæ›oÆÄ‰ ¼ÿÕ«WÇ�7Þ˜400===.½ôÒèÞ½{Òc<333ž}öÙ4hPÂëdýúõqã�7ÆÈ‘#“žwf¾Ûo¿ý×÷ÂêÕ«Çe—]Ý»wOÚwÙ²eñ׿þ5^{íµ„eŒÓN;-ž}öÙM®[µj7ÝtStéÒ%*T¨�°Ý_|·Þzk|ÿý÷›Ô333㡇Š>}úùñED¼ûî»›\ïuîÜ9î»ï¾Øa‡6Y¯qãÆÑ¸qãèСC\~ùåѧOŸxûí·ú <8Ž=öØhÓ¦M±æ*+»ï¾{tíÚ5ºví»îºkÒŸÉ/òòòâÓO?�Áƒǘ1c–ÿãÿˆý÷ß?vÛm·Íîóƒ>Øäï­[·NXç™gž‰N�:ðQ”œ-ᘽá†~}M§§§Çgœ—^zi¾×ÝÿùÏâ®»îJ8Æòòòâî»ïNz<°mÈÿ®(¦¾}ûÆÌ™3ê•*UŠ»îº+^|ñÅ8ä�C6òñs@Ì•W^o¾ùf<òÈ#Ѿ}ûíÿÖ[o�+V$Ô›5k#GŽŒóÏ??߈Æ�Çm·ÝO<ñDT­Z5aù×_�<òH�æÈÏüùócýúõñsÇo¼g�uV¾�AñÈ#�Ä¡‡š°lîܹ1`À€xá…~­]vÙe1lذ|C>#"ºvíO=õTÔªU+aÙðáà ÷€’ømèË)§œ<ð@Ò@ÄßÊÈȈÁƒÇþûlÕªUÑ·oßbÏUš*W®§œrJ¼ùæ›ñüóÏÇ…^;ï¼ófC>#~9úè£cøðáqÅW$,_¹re<ýôÓ%5v™ØŽÙµk×FÄÏÁg#FŒˆk®¹&ß×tZZZwÜq1tèÐØn»í–ôÑG±hÑ¢bÍP^½ñÆIë{î¹çfƒÏ~kíÚµqýõ×Gvvv² /¼0^y啸ãÿ¸ÙsÉ-ZÄÀ�ãŽ;îHØï’%K r×·oßX½zuB½[·nñÀün`h�5â®»îŠË/¿ü×Úÿ†••¶ÌÌ̸í¶Û’.;ì°ÃbäÈ‘qøá‡ç”ݦM›9ߟ{ÕªU£gÏžñÏþ3ékíÅ_,ô íÛ·�‡z(>øàƒ¸ýöÛ£cÇŽ¿òñó9þÝwßC‡Mz¾ðÈ#�lr¾¼¥ù¿ÿû¿|¾={öŒ7Þx#Ž=öØÍ†|Fü Ú£G�>|x 6,<ðÀí¿_¿~1wîÜ„zݺuã…^ˆ«¯¾:ßã²nݺqå•WÆK/½”t�ùóçûº#333–-[??Æ—_~9.¿üò|Ïgëׯýû÷�3Î8#aYVVV 80 ôkíÄOŒW^y%:è |ßW;tèC† IÞŒˆxýõ×½-ªß¾~<ðÀxüñÇ“îë·êÕ«>ø`œtÒIIûýùÏ.ÖL¥­bÅŠqÔQGÅðáÃã•W^‰«®º*Z·ný»ŸuiiiqÐAÅSO=}úôIX?''§Ø×/åÍ–pÌþò uëÖ�¡C‡ÆŸÿüçÍ~¹F—.]â¹çž‹æÍ›',›6mZ|ýõ×Åš €-— O ÜúüóÏcРAÅú3mÚ´²~Û¬¯¾ú*^~ùå„zzzz<øàƒqæ™gþnÐa2‡vX<ðÀ¿»Þ§Ÿ~Ÿ~úiB½AƒñÄOD³fÍ ´¿8 xà�¤áFÿ÷ÿË—//PŸÍÙa‡bÈ�!IƒÿW¥J•âî»ïŽjÕª%,{ä‘G"///""Î?ÿü|—þ×®»îW^yeB}Μ91qâÄõø={íµWÜ}÷Ý^¿råÊ1pàÀ¤!1£G�Žyóæ¥d®ÒгgÏèÛ·o´hÑ¢HÛW¬X1®½öÚ¸à‚ –½üò˱nݺâŽX.lIÇlýúõãÙgŸMæ’LóæÍ“†¨mܸ1FŽYìyÊ›éÓ§Ç«¯¾štÙñÇ_à>ÿ÷ÿ—4ìOúSôîÝ;*UªTà^çœsNôîÝ;¡þî»ï& ¦ÿ_?þøc¼ûî» õ=öØ#î¹çžB�×^wÝuqØa‡xý’ôÄOÄâÅ‹êûì³O 0 jÔ¨ñ»=ÒÒÒâ²Ë.‹K.¹$aYnnnôïß?%³vìØ1yä‘ÍqÄG$ Lœ9sf¡Îq›7oÇ�#�<²À!µÿkß}÷�ÁƒGzzú&õŸ~ú)Þyç�"õ,kóçÏÏ7„ðÎ;ïŒ^½zêýE‡bðàÁ¿»Þ¬Y³’†¶V«V-}ôÑØc�= ´¿6mÚÄ£�>š4Œôå—_Žo¿ý¶@}6§fÍš1dÈ�Øe—] ´þÍ7ß�5J¨?ùä“¿†ÎqÄѯ_¿=Ç�7Ž›o¾9¡¾jÕªxÿý÷ 4ÓïÉÈȈ|0á5¾9÷Þ{o´k×.¡>qâÄb—¦SO=5|ðÁ!I2gŸ}vÜzë­ õ÷Þ{o«ùb€-阭R¥J<ýôÓ›ýÒ”ßjРAüõ¯Mz.ðÊ+¯{¶L‚>€rkìØ±1`À€bý™:ujY?ŒmÖC=”´Þ³gÏ8üðÃK|ÿÆ KZ¿õÖ[cÇw,T¯Ã;,iHÐúõëcøðáEšï·î»ï¾¨S§N�×oܸq}ôÑù.oÑ¢EÜpà …šáÌ3ÏŒªU«&Ô?ÿüóBõI&---n»í¶BýÔ¬Y3®¿þú„z^^^Jž÷ÒRÔ@¨ÿuíµ×&ŸfffÆÇœ’þemK:fï½÷Þhܸq¡¶9öØc“ƒ~ùå—Åž <ùþûïãŠ+®ˆœœœ„eq '¨Offf<ýôÓ õ£Ž:*.»ì²"ÍÖ£G�8à€6©åååÅ3Ï<ó»Û¾ôÒK‘›››P/Ê9NDÄ-·ÜR¨@¼’����ôs±J•*Ñ¿ÿ¨R¥J¡ú]wÝuѪU«„ú¤I“â믿.òœ?Ÿöïß¿ÐÏÙW\‘ô\ì‹/¾(p�T�˵mÛ6Î=÷Ü„ú–úýÿ÷‘���P?ýôÓ㬳Î*ñý?û쳿~ÉÁo]qűçž{ªW»ví⪫®JºlèСEšï·n½õÖ‡ÖGDT¯^=N?ýô|—ׯ_?î¾ûîB uÔQI¿D¡0ÇÂæÜxã�áýEzzzÒ0üˆHY^¥ê=¢{÷î a¡6lˆ·Þz+%ýËÚ–tÌÞpà ѦM›Bm³×^{E—.]ê®÷¶]‚>H¹~ø!þóŸÿ$Ôwß}÷¸ä’KJ|ÿóçÏ�ÿûß õ½÷Þ;Ž?þø"õ¼æšk¢víÚ õçŸ>ièSAí·ß~ѹsçBo·¹°Ô‹/¾8*W®\¨~Õ«W�ý÷ß?¡þÍ7ßz¶ÿuà�&–ÔñÇ;ï¼sB}ĈÅœjËSµjÕ¤áh_}õUé“b[Ò1Û®]»"‡wÜq 5�ÔÀÖbÅŠñøã�ÇÉ'ŸóçÏOX^¡B…èÓ§O�Ã#_{íµX³fÍ&µôôô¸ñÆ‹5ç•W^™P9rdÒ`Òßzýõ×jûî»oì»ï¾Ešc§�vŠ#�<²HۦʨQ£bÙ²e õ .¸ P¡„¿¨X±bÜzë­I—åè]PgœqFl¿ýö…Þ®qãÆÑ¡C‡„zY}þ& o,njYÈÊÊJzL4jÔ(z÷î]âû_³fM¼úê« õ¦M›Æ\P¤žç�w^Òpù‘#GFVVV‘zþ2ÓÉ'Ÿ\èí6w¾yöÙgGýúõSÒ3×{-Z´ˆcŽ9¦HÛî½÷ÞIÃßyç�b=ï[¢´´´8õÔSê[ÃõÞ–tÌ6jÔ¨ÈaÅÉ®÷fÍšëׯ/ò<l¹}�r£F�м¼¼„z�=¢bÅŠ%¾ÿ�>ú(i�_QÃ""êÖ­›4¼dþüù1cÆŒ"÷=í´ÓŠ´]›6m’Ö«W¯ž4\¢ vÛm·„Úwß}W¤^¿UÔ ÆÍmÿÓO?Åœ9sŠÕwKÔ©S§„ÚĉË`’ÔÚ’ŽÙâÌ”,ðvÑ¢E±råÊ"÷(IŸþy 4(ß?ûÛßâŽ;îˆÓO?=ºté÷߬^½:¡OZZZÜ|óÍqÈ!‡xßo¼ñFBíðÃ/Råoí·ß~‘‘‘±ImÍš5› »[¶lYÒ󎢞sý¢¸çHÅõá‡&ÔÒÒÒâŒ3Î(rÏý÷ß?š7ožPÿè£�’^Tq>Ûµk—PKÅ9nQ4oÞ<5j´ImÙ²e1wîÜ2™§¨þýï'ñFüüsªY³f‰ïÿóÏ?�U«V%ÔO9å”BáÁ/*W®œ4dqÍš5ñÙgŸ©ç/3U¨Pø¶Ñ²e˨T©RÒeÉc "Ù5d*Ž…’x/\¿~ý‚[\[ëõÞ–tÌžvÚi‘žž^¤m“]ïmذ!fÏž]äyØr ú å>ùä“„Z�:u’†î•„d� ÕªU‹®]»«ïÿøÇ¤õ¯¾úªÈ=“yDFFFÒð‰=÷Ü3ªT©R¤ž;í´SB-33³H½~‘––øÃŠÕ#¿ŸÛ¤I“ŠÕwKÔ°aÄڷß~[“¤Ö–tÌvîܹÈÛî²Ë.Ië+V¬(rO€’4vìØ0`@¾{ì±xá…âë¯¿Žœœœ¤=êÖ­ ˆóÏ?¿Àû]¶lYLž<9¡~ÔQGù±üÖ~ûí—P?~|¾ëçwÎqðÁkŽ.]º”J~~’}þvèÐ!vØa‡bõ=á„j™™™E:ËÈÈ(VÀk‹-jeùÙ›ì|®¬‚G‹*Ùõ^ÅŠ“†î•„ü “½ö ã„Nˆ´´´ï¯ :vìX¤í*W®œôXÜqÇ£qãÆEê¹óÎ;'ÔV®\™4p¿0?üðÙÞõÞÏ,X�4D{K²%³Å¹ÞÛyç�“~®÷÷*l™’Å+@9гgÏèÕ«WY�A!åææÆ”)Sêûî»oT®\¹TfHâ·ûî»G�5ŠÕwÏ=÷ŒÊ•+Gvvö&õ¯¿þ:Î<óÌB÷kРA4iÒ¤H³T¨P!ªW¯žRÔ¶mÛ"õ‹ˆ¨U«VB-++«Èý""vØa‡¨]»v±z´hÑ"ÒÓÓÄ&MšTì`�²–��3gÎŒ~ø!V¯^YYY±fÍš|ÃvV­ZU Ú–fK9fëׯEž§N�:IëÅ=ÎÊ£ŒŒŒ8ùä“£G�IÏ16gâĉI? ÷ÙgŸ”Ì–,Ü|êÔ©ù®ŸìܶF�Ñ´iÓbÍQ¥J•Øyç�cæÌ™ÅêS?ýôS,X° ¡Þ¡C‡b÷Î/Øð믿Î7ôzsÚµkW¬y’}þ¦òüiþüùñÝwßÅŠ+"+++V¯^�oðmDòÀ·--ô{âĉ µ–-[F£F�JeÿÉBüš4iR¬@؈Ÿ¯]222bÞ¼y›Ô‹_œë³š5k–x¿ˆŸÏE‹zÍ–žžž4L·0êÔ©;ì°CÂ{ÒÖô¹aƘ={v|ÿý÷±jÕªX½zu¬^½:6nÜX¨>+W®,öµQYÚ’ŽÙâ|æTªT)ªW¯žðãz`Û$耔š?~¬Y³&¡Þ¾}ûRÙvvv|ÿý÷ õÝvۭؽÓÓÓ£eË– AP3fÌ(R¿ kždAŸõë×/V¿ÿµzõê"÷‹ˆhÕªU±¶�ˆ¨\¹r4oÞ<áyNNµ%˜9sfŒ92>øàƒ˜5kVlذ¡Xý6nÜYYYù÷”wÛÒ1›ßϨ¸Ç@y´ûî»ÇÿøÇB‡|FDLŸ>=¡V½zõ"¤ÿ¯ºuë&Ô–-[–ïú‹/N¨µhÑ"ÒÒÒŠ=KË–-Ë$èóÛo¿MZOÅço›6m"---òòò6©—Õço²p¼â|ö®Zµ*Þ~ûíxë­·bâĉ) Ý’‚ÛsrrbΜ9 õÒºÞ‹HþZJÅk÷—>ÿ˜ßñò{ªW¯U«V-ò,ɮϊs½—_PäêÕ«‹ôÙ¼yóHOO/òL¿hݺuÂõÝ–z½7þüxã�7â�wÞ‰3f$|é@Q¬\¹2¶ß~ûLW6¶¤c¶ZµjÅš§fÍš‚>ˆAŸ¤ØÂ… “ÖwÝu×RÙÿÊ•+B…"~ I…]vÙ%!4ðÃ6 ª(ÁW¿U¡B…”öLÖ/77·Èý""¶Ûn»bmÿ‹d�6E}ÞËÊÌ™3ãž{î‰1cƤ¼÷–ô¹­³?‡µlmÞ}÷Ýøä“Oâþûï�#�<²PÛΟ??¡¶fÍšhݺuªÆK°råÊ|—% a¬S§NJö›,t´4ä÷Y˜ŠÏßZµjÅvÛm—�Zž>‹rŽ»nݺxä‘Gâ‰'žˆõë×k¦ÿµ%}þôÓOIŸ¿–-[–Ú É^K©[ÒõÞèÑ£ã–[n‰5kÖ”Hÿ-é=âmIÇlyø¼`ë‘øU‘P ëÖ­KZ/­à—’ Ì/€$///%ý·6U«VMIŸjÕª%ÔJ*D%Õž|òɸ÷Þ{K,äsKç˜Ø2U¯^=vØa‡8ä�C¢OŸ>ñÎ;ïÄ‘G™°ÞÆ�ãÆoŒ3f¸w~ç“%isŸÓÙÙÙ µÊ•+§d¿©êSXeñù»¹0ÕòlæÌ™qÞyç•XÈç–¦¬¯÷ò{•äkwsûÝÖ¹Þ‹xë­·âúë¯ßbæ-mŽY¶U¾n€R‘––¶U쿬Ç–&UA]k×®M¨U¯^=%½KÒĉ£_¿~ù.o×®]ì·ß~ѶmÛhÒ¤I4iÒ$jÔ¨UªT‰ªU«&¼ÞæÍ›‡~xI�].8f¶,õë×�ÄM7ݯ¿þú&ËÖ®]×_}¼üòË ¶Ü¸qcI�Y$ÉBÄV¯^�’Þ©ê“*>7µqãÆ¸îºëbÉ’%I—7jÔ(:wîûì³O4kÖ,¶ß~û¨W¯^T®\9ªT©ééé Ûœ{î¹1nܸ’}›ãµ[6¶õë½ Ä­·Þ6lHº|×]w�Ž;Fûöí####š4i5kÖüõz¯B… Û´nݺ¤Ç.³lí}�RU«VMZ_¹re©ì¿V­ZIëYYY)é¿jÕª¤û.‘\ªž÷d}òûY—'÷ÜsOäåå%Ô<ðÀ¸é¦› â’“““ªÑÊ Ç,ÀÖ£B… ñ—¿ü%fÍšS¦LÙdÙŒ3â±Ç‹«®ºêwûT©R%¡V³f͸袋R6ëÿª]»v¾Ë’}VméAŸ›ûüMlZXÉ>ëÔ©Sì¾¥í…^ˆéÓ§'Ôëׯ·ß~{uÔQQ©RánÉßÒÏçò»ÞKö3/ ù«%yî±e¾~Kö~½×¿ÿ¤!¥{ì±GÜvÛm±ï¾ûª_vvvªF+7³l«}¤ÐÆ�Ëz„2W¯^½¤õÒ úÌ/Ì!UÁ3Éúl.j[·téÒ”ôY¶lYB­¼?ïÓ¦M‹‰'&Ô�;î¸øÛßþ*T(tÏ+V¤b´rÅ1 °u©R¥JôíÛ7N9唨°aÃ&Ë{ì±èÖ­[l¿ýö›í‘ì}:///®¼òÊ”ÎZPÉ>«.\˜’Þ©êSXù}þ®\¹2š4iRìþ[Ëçï‹/¾˜P«W¯^¼üò˱Ã;©gfff1§*[ù]ï•Öyj•*U¢J•*±~ýúMê©:wL>X±bŨQ£FJúom¶åë½ÌÌÌxç�wêûí·_ <8ihõïÙ¯÷³l« §8ÀV"---¡–››[¬ž[c(CaåÜôÝwß•Êþó ™3gNJúÏž=»Àû$búôéÅî‘���ôyÿ½�°²öÁ$ÔjÕªwÝuW‘B>#"–/_^ܱÊÇ,ÀÖ§M›6qöÙg'Ô×®]üÝí“(®^½:rrrR2_aí¼óÎ µ¹sçÆš5kŠÝ{Ú´iÅîQù}~ÿý÷Åî�••‹/.ð>Ë«… Æ7ß|“P¿é¦›Šò±åŸÏ5nÜ8*V¬˜PŸ9sf©Í�ìµT’玵jÕJúû"fÍš•’÷æd×�åýzï£�>Jø²— *Ä}÷ÝW¤�ψ-ÿý!?ŽY¶E‚>€mV�5jÅ ëY¶lY±¶ß4mÚ4ªW¯žPŸ8qb©ì¿råÊIØR¢´aƤ�¥­Zµ*vï­Õ‚ båÊ•Åê1sæÌ¤á1íÚµ+Vß’6yòä„Úþð‡¨U«V‘{N™2¥8#•KŽY€­ÓW\‘ô|ûÕW_ýÝp¯-Z$­Ïš5+£Z²sŽÜÜܤŸõ…1wîÜ2 ukÙ²eÒz²`Ëš6mZäåå%ÔwÝu×b÷.MÉλªT©G}t‘{.X° 233‹1UÙ«T©R4oÞ<¡^Z×{É_K© ÍMv 8wÌ_NNN±C^W¬X ,H¨o‰×{ûì³O4kÖ¬È=§N�Zœ‘Ê-Ç,Û"AŸÀ6«fÍš µ+V«gi†›”WiiiI9¾üòËÈÎÎ.•öÚk¯„Ú”)SbíÚµÅê;qâÄX¿~}�öÇÏòòòâƒ>(V�÷Þ{/i½}ûöÅê[Ò–.]šP+nÀÕ„ е}… ÉoKÆUš³[ŸúõëÇù矟Pß°aC 4h³Ûæ÷>=nܸTŒVh­ZµŠªU«&ÔG�]¬¾£F�*ÖöÅѸqãØa‡êŸþy±{ñÅIë[Úçï’%Kjù}©AA÷\®¼Hvþí·ßÆâÅ‹KeÿÉ^K ,ˆùóç«ï¢E‹bîܹÚÿßûï¿_"Ûo‹×{ãÇ�/Öö?ÿNæ•Çë=Ç,[;AŸÀ6«nݺ µ™3g«gY…•7tPB-33³ØaHµçž{&ÔÖ¬YSì’‘#G&­ ‘ؼ7Þx#åÛ7lØ0vÞyçbõ-i™™™ µ:uê¹ß¢E‹bìØ±Å˜(ò ¦J†Yš³[§=z$ ×ã�7böìÙùn·ÓN;%ýœç�wR9^�UªT)ößÿ„ú¨Q£ŠJ�››¯½öZqG+–dŸ¿_|ñE,Z´¨X}_ýõ„Zݺu£yóæÅê[Ú’�ËÕ®]»X=Ëúgž*É®÷6nÜ/½ôR©ì?Ùk7¢ø×#GŽLˆ˜ßþøÙ›o¾Y¬í“ýÜ*W®\îŸ÷T_ï­_¿>Þ~ûíbLô³d×|åñz/Â1 ÀÖMÐ'°ÍjÙ²eBméÒ¥1oÞ¼"õ›1cF|þùçÅk«pÌ1ÇDZZZBý©§žŠ�7–øþ9ä�¨P!ñÖ˜^x¡È=W®\o½õVB=###ZµjUä¾Û‚O?ý4&NœX¤mß|ó͘3gNB½[·nI_cåIµjÕjÉÂ` êÙgŸ�œœœbLQ£F�¤õâÌ• ŽY€­S�:uâÜsÏM¨oܸ1þõ¯mvÛã�?>¡6nܸ˜0aBÊæ+ŒSO=5¡¶lÙ²xì±ÇŠÔ綾^Šï¾û®¸cËa‡–PËÍÍ-Öçï¸qã’>®C9¤ÜŸ»ý¯TŸËÍž=;>þøãbLT~rÈ!IÏ+Ÿ{î¹X½zu‰ï¿ýö‹Zµj%Ô_~ùå"Ÿ/çää$ *­^½ztîܹH=·3gÎ,ò—zL˜0!þóŸÿ$Ô�<òȤ?ãò$Ù{ÄòåË‹ÜoäÈ‘)¹.Kvl–õõžc€m‘ O`›µÇ{$­' †+ˆ|°8ãlUš6m|pB}Ê”)1xðàßFFFzè¡ õqãÆÅÛo¿]¤ž>ø`¬X±"¡~æ™g& (äÿËËË‹¾}ûƆ  µ]VVVüíoK¨§¥¥Åi§�–ªñJLýúõj_~ùe‘z}÷Ýwñä“Ow¤HOO�ºuë&ÔgÏž]ìÞÅá˜Øz]pÁQ³fÍ„ú›o¾³fÍÊw»3Î8#*W®œP¿çž{bݺu)�± =ôÐhذaB}ðàÁ1iÒ¤Bõúá‡âÿøGªF+²cŽ9&éùÊO< .,t¿ÜÜÜèÛ·oÒeçœsN¡û•µdÏÍ÷ßK—.-t¯¼¼¼¸ãŽ;"///£•¹5jĉ'ž˜P_´hQôëׯÄ÷_½zõ8餓êßÿ} 2¤H=‡šô þøÇ?&}cS÷ß¡C^7lØùË_’.ÛR¯÷Æ�_¤^K–,‰¿ÿýïÅ)""égUY_ï9fع[ØfÕ«W/Z¶l™Pæ™g"++«P½^xá…x÷ÝwS5ÚV¡W¯^‘–––PðÁã£�>*ñýç&tÏ=÷Ä‚ Õëã�?ŽgŸ}6¡^¥J•-"€¤<˜0aBôéÓ§ÀëçääD¯^½’þ¬Ž<òÈhÖ¬Y*Ç+»ï¾{BíÓO?�™3gªÏŠ+âúë¯�õë×§d®Ö­['ÔJã˜ü=ŽY€­S�:uâÜsÏM¨çææÆ¿þõ¯|·kÔ¨QtïÞ=¡>eÊ”èÝ»w¡Äó“““ß|óÍï®W©R¥¸æškêëÖ­‹K.¹$¦OŸ^ ýÍŸ??.¼ðÂX¾|y¡gMµÊ•+'ý\\»vmôîÝ;²³³ ÕoÀ€IŸË¶mÛÆž{îYä9ËJ²s¹ÜÜÜxæ™g Ý롇ŠqãÆ¥b¬rã²Ë.‹*Uª$Ô_xá…>|x‰ïÿì³ÏNz½ùÐCÅÔ©S ÕkêÔ©ù~qG²÷!Í›7/®¾úêB½7ß~ûíIƒ’Û¶m�:uJåx%"Ù{Ä·ß~cÆŒ)TŸìììèÝ»wÊ>Êëõžc€m� O`›vÒI'%Ô/^·ß~{lܸ±@=ž}öÙ¸óÎ;S;ØV ]»vqúé§'Ôsrr⪫®*røË‡~×^{íï®wà�Æ�˜P_¼xq\xá…üì³Ïâšk®Iúz¸ì²Ë¢^½zê³­ªT©Ò¯ÿýÒK/Åu×]™™™›ÝfÁ‚qÑEÅÿûß„e5kÖŒÛn»-Õc–ˆ.]º$Ô6lØúÓŸbåÊ•ê±hÑ¢8ï¼óbÚ´i)›+YÐÖ{ï½/½ôRÊöQŽY€­×\5kÖL¨¿õÖ[› À¾êª«’†{�=:Î=÷ÜøñÇ‹<ÓŠ+bðàÁѵk×xôÑG ´Í©§žûí·_B}ùòåqê©§Æ AƒbÅŠI·]½zu :4N8ᄘ;wî¯õV­Zí¤È…^ 6L¨�;6n¸á†X·n]�ú<þøãñÈ#�$Ô+T¨7ÝtS±ç, -Z´ˆí·ß>¡>xðàøä“O Ô#777þö·¿m6ÔvKÕ¤I“èÙ³gÒe·ß~{ 4¨À×Ô¿õÅ_ÄE]ô»ëí²Ë.I¯7׬YS¨ðÝéÓ§Ç%—\kÖ¬IXvÊ)§Ä®»îZ >Ûªß^ï}úé§qñÅÇÂ… 7»Mfff\sÍ5ñÊ+¯$íwï½÷& „,o’]»DDÜ|ó;vYµjU\zé¥ñé§Ÿ¦l®d×{S§N��é˜LÇ,ÛAŸÀ6í¤“NŠ*Uª$ÔG�—^ziÌ™3'ßm'Ož_|qÜu×]‘››-[¶,©Q·H½{÷N²�““·ß~{œ~úéññÇGvvöfûÌ™3'~øá8öØcãòË/�‰'hÿ}ûö�:uê$ÔgÏž'œpB 6,i8DDÄO?ý÷Ýw_\pÁI×iß¾}\~ùåšc[vÊ)§lò3xë­·â˜cމ~ýúÅøñãcñâÅ‘��?þøcŒ3&î¸ãŽ8þøãcìØ±Iû]ýõѸqãÒ¿X:uê”ô=aÚ´iÑ­[·øè£�"///é¶+V¬ˆÇ<Ž9æ˜MB>Û¶m[ì¹þøÇ?&Ôòòòâ¶Ûn‹Ã?Ž>úè¸ûî»ã»ï¾+ÐsçÎ�áÇÇÅ_]ºt‰þýû*,4---î½÷Þ¨U«V²ììì0`@téÒ%.ºè¢¸óÎ;cÀ€qÏ=÷Äå—_p@ÜsÏ=±zõê_·ùÃþGyd�÷_êÖ­ùË_’.{ûí·ãÄOŒ�>ú(ßp¸éÓ§ÇE]÷ßÒåçŸ~têÔ)eó–¶³Ï>;¡–““W\qE 80V­Z•t»�7ƧŸ~ݺu‹Ç{ì×zÍš5cç�w.©qKÝE]ûï¿Òe ˆN8!F�k×®ÝlŸ… ÆSO=§žzjœsÎ9=ìÝ»wÒ0à%K–Ä)§œƒ Ê÷KV¬X?üpœzꩱdÉ’„åqë­·hŽmY×®]cÇwüõïcÆŒ‰ãŽ;.î¸ãŽ3fLüøã�‘��‹/ŽñãÇG¿~ýâ˜cŽ‰Ñ£G'í×£G�Øm·ÝJkübiÖ¬YÒ°Ïü1N9å”9rdlذ!é¶kÖ¬‰áÇÇQGcÆŒùµžŠë½£�>:*W®œP衇â�C‰k¯½6î¿ÿþ8p`ÂõÞ AƒŠ½ÿÍq̰-©ôû«l½6l={öŒ¿ÿýï Ë>ýôÓ8ú裣]»vѶmÛ¨[·n¬[·./^_~ùe,X° ¡×½÷Þgžyfi�_îÕ¨Q#yä‘8çœs’†(}ýõ×qÉ%—DõêÕ£C‡ѤI“¨_¿~äååÅŠ+báÂ…1iÒ¤X¶lY‘ö߸qã¸÷Þ{ãšk®ù5ŒõYYYq÷ÝwÇý÷ß�;wŽŒŒŒ¨]»v,]º4fÏž_|ñEÂ6¿¨[·nôïß?*V¬X¤¹¶% 6Œ¾}ûF¯^½~}>—-[O<ñD<ñÄ…êÕ­[·¤aKåU… âÚk¯�ž={&,›;wn\z饱Ã;Ä>ûìÛo¿}TªT)–-[sæÌ‰/¿ü2!¦aÆѧOŸ8í´ÓŠ5×®»î‡zhüûßÿNX6oÞ¼˜7o^¾Ûfdd$ jKÇ,ÀÖë‚ .ˆ¡C‡FVVÖ&õQ£FÅ•W^™o`~ûöícÀ€Ñ«W¯X¿~ý&ËÖ®]Æ ‹aÆEƒ b¯½öІ Fݺu£B… ±jÕªX¹re,\¸0¦M›+W®,öãØyç�ã_ÿúW\vÙeIà srr RتU«¸ÿþûãÉ'ŸLX–, ­$rÈ!qÞyçÅ3Ï<“°lΜ9q饗FÆ c¿ýö‹Æ�G•*Uâ§Ÿ~ŠÉ“'ÇŒ3òíÛ¶mÛ¸îºëJrô×½{÷2dHüôÓO›Ôsrr⡇ŠÁƒÇ>ûì-Z´ˆZµjÅÊ•+cÑ¢E1nܸX¾|yB¿;î¸#^zé¥Í~¡Ä–¤bÅŠ1`À€8÷Üscúôé ËgΜ×^{mT©R%öÙgŸÈÈȈúõëG… ~}®¦L™R¨ÀÝߪQ£FÜÿýqþùç'¼?äääÄ€bРAÑ©S§hÖ¬YÔ«W/233ã‡~ˆ±cÇFNNNÒ¾UªT‰ûï¿?jÖ¬Y¤¹¶%ÕªU‹¿ÿýïqî¹çƺuë""bõêÕñ /Ä /¼P¨^pÀ÷žqíµ×Ƙ1cÂ�—-[7Þxcôë×/öÝwßhÚ´iT­Z5–-[óæÍ‹qãÆ%¼f«W¯ýû÷�c�=¶X3Õ­[7N;í´6lX²ŋǨQ£6»ý•W^Y¬ýoŽc€m‰ O`›wá…Ƈ~ãÇ�OX–——'NŒ‰'n¶GíÚµãñÇ*�DÓ¦McèСqÙe—ÅÌ™3“®³fÍšøøã�KdÿGydÜ{ï½qÇw$'Füõᇸ_ýúõã±Ç‹æÍ›§rÌ­Z×®]ãÎ;ïŒ;ï¼3ß ÆßsòÉ'ǽ÷Þ›âÉJÞG=zôˆ§žz*éò $„'S«V­xì±Ç¢V­Z)™«oß¾qÚi§ÅüùóSÒ/•³[§ºuëF÷îÝã‘GÙ¤ž››Œx ßm9ä�xâ‰'âê«¯Ž¥K—&]géÒ¥ñþûï§rä|uêÔ)ž~úéèÕ«W,Z´¨ÐÛï½÷ÞñðÃGÍš5cÍš5 ËK;è3"âÖ[o�uëÖÅ‹/¾˜tùâŋ㭷Þ*p¿¶mÛÆàÁƒ£J•*©±LT¯^=þõ¯E÷îÝBé"~¾ŽùôÓO îÚ³gÏ8ñÄ㥗^*‰QËL�:uâé§ŸŽ+¯¼2é5uDÄúõëc̘1%²ÿ½÷Þ;×\sMÒ㩠ỿ¨^½z<ðÀ±ï¾û¦rÌ­Zûöíã�ˆk¯½ö×°ÏÂ:ðÀcàÀ�Q©Ò–õO\Úµk7ß|süå/Iº|É’%ñöÛoÿnŸôôôxðÁ£E‹)™ë¦›nН¾ú*¦L™’’~©ä˜`[Q¡¬(k•*UŠÇ<:uêT¤í›5kÏ?ÿ|´iÓ&Å“m=š5kÇ�SO=5ÒÒҊݯ°=N9å”xâ‰'bûí·/Ö~÷Þ{ï>|x´mÛ¶X}¶EgœqFüßÿý_4jÔ¨PÛU¯^=þüç?Ç_ÿúרX±b MW²nºé¦8÷Üs‹¼}³fÍâ¹çž‹ÝvÛ-e35hÐ FŒÇ|¹|^³[§ .¸ i0þèÑ£cÆŒ›Ý¶C‡1räÈ8úè£S:S�:ubŸ}ö)ôv{î¹gŒ92Î>ûìHOO/Ð6uëÖ�n¸!† õêÕ‹ˆˆ•+W&¬÷˲Ҕ––÷ÜsOÜ~ûíQ­Zµbõ:õÔScذaQ·nÝÔ WÆÚ·oƒ *òãIOO�Ûo¿=zõê•ÚÁÊ‘zõêÅ3Ï<—^zi��‡Í)ìõÞÁÏ=÷\ìºë®ÅÚoË–-ã¹çž‹C9¤X}¶E‡vX 2$vÙe—Bm—žžW^ye<úè£Å~ï)+ç�w^\ýõE¾®ª_¿~<ùä“qÐA¥l¦ªU«Æ³Ï>çž{n¹ \v̰-ز¾îØ*eddDÏž=ê;v,µjÔ¨�?þx :4~øá¤�;ÿ«jÕªqÖYgÅÕW_Õ«W/…)·l5jÔˆ¿üå/qÆgÄ£�>|ðAlܸ±P=222¢[·nqÚi§zÿ�:uŠ7Þx#žzê©2dHdffxÛ�wÞ9.»ì²8餓¢Bß­[T|pŒ5*žþùxùå—cÖ¬Yù®Û Aƒ8ñÄã‚ .(t8hyS±bŸýöÛ£cÇŽñ�ü#fÏž] íjÖ¬çœsN\qÅ%zS·nÝøûßÿ½{÷ŽÑ£GÇäÉ“cúôé±téÒX½zu¬]»6òòòR¾ß‚rÌl}êÖ­Ý»w�Gyd“z^^^ 80|ðÁÍn¿ÝvÛÅ€⫯¾Š'Ÿ|2ÞÿýÈÉÉ)Ò�:uŠcŽ9&?üð¨\¹r¡{üÒ§OŸ>qÕUWÅo¼Ÿ}öY̘1#–.]999Q½zõhÒ¤I´iÓ&:è èÚµkÔ¨Qc“K–,IèÛ°aÃ"Í“ çž{nzè¡1hРxýõ× õüvêÔ)zõêûí·_ NX6<ðÀxùå—£_¿~ñî»ïè)---ºté½{÷ŽV­Z•”e+===®¿þú8ùä“ãÑG�7ß|3²³³ Õc»í¶‹?þñ�qÆgzÿmÚ´‰#FÄsÏ=O<ñDüøã�Þ¶qãÆqá…ÆÙgŸ]ä÷~Å}íµ×â•W^‰^x!¦L™’ﺵjÕŠc�=6.ºè¢Øi§�JqÊ’q饗Æ^{íýúõ‹É“'h›*UªÄI'�×]w]‰ˆ/¿ü2f̘ .ŒU«VÅÆ�£ZµjQ£F�Ø~ûíc—]v‰ÝvÛ-ºté-Z´Hɾ³³³ãÓO?�ÿþ÷¿1eÊ”˜7o^¬X±"rrr¢jÕªQ¿~ýØi§�¢}ûöqðÁÇ>ûì“’ýníÎ=÷Ü7nÜ&µž={F¯^½’®?þü˜6mZ,\¸0Ö¬Y•*UŠ DëÖ­£uëÖ‘––Vc—ªÜÜÜøè£�â?ÿùOŒ?>~úé§ÈÌÌŒ´´´¨Q£FdddD«V­â€ˆ?üá a`999ñÃ?$ôÝqÇ#==½´F©sÌ�̪U«â“O>‰ñãÇÇôéÓcþüù±|ùòX¿~}TªT)jÔ¨5kÖŒ&MšÄ.»ì-Z´ˆ½öÚ+Ú¶m[n‚ ÷ßÿX¶lÙ&µ~ýúÅI'�T6ýÆŠ+â½÷Þ‹Ï?ÿüðÃ__?óæÍ‹•+WþzþV£F�hÔ¨Q´hÑ"Z·np@ì¶Ûn)¹ÈÍÍ�±cÇÆ'Ÿ|“&MйsçFfff¬_¿>ªT©uëÖ�fÍšEÛ¶mã ƒŠN�:EÅŠSð¨·n7ß|s¼òÊ+›ÔN>ùäøë_ÿštýÅ‹ÇÔ©Scþüù‘••+VŒzõêEË–-c÷Ýw�J•*•ÆØ¥nìØ±ñÑGÅ_|?þøcdffFnnnÔ¨Q#š4i-[¶ŒÎ�;Çᇞô¸Ÿ9sfBm‡v(‘/(/³l�})QØ O€mÙÌ™3ãØc�M¨¿öÚkѦM›2˜ … úØ–•�¯¢؆<÷Üs µºuëFëÖ­Ë`REÐ'@)Z°`AŒ1"¡~Øa‡EZZZL@ªú(%ÙÙÙñ§?ý)V¯^�°ì¤“N*ý�H)AŸtç�wÆ7ß|S¤m—,YçŸ~L˜0!aY»ví¢sçÎÅ€2V©¬ØR¼ñÆñÜsÏE‡â˜cމ®]»F“&M6»Í¢E‹âùçŸ�aÆŊ+–§¥¥Åí·ß^R#PŠ}Ò_|_|ñEÜsÏ=ѸqãØm·Ý¢I“&Q»víHOO�•+WÆòåËcòäÉ1gΜÍöêÙ³gìµ×^¥27%KÐ'@1,Z´(-ZT¤m¯ºêªèÙ³gŠ' ¬ú(e5jÔˆ;î¸#N:餲€ªPÖl)nºé¦èÔ©ST¬X±HÛרQ#.¿üòxÿý÷…|l…*•õ[ŠÓO?=N?ýôX¹re|õÕWñÕW_ÅÌ™3cþüù±hÑ¢X³fM¬[·.*V¬µk׎zõêEƒ bï½÷ŽŽ;Æ>ûìUªT)ë‡@ IËËËË+ë!`KW¡¬€­� OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚> }@ ú€ô ) èR@Ð'¤€ OHAŸ�‚>ØêŒ1"Z·n�ðçæ›o.ëѶ96lˆN8!á=yøðáe=l3î¾ûî„cðšk®)ë±òå^P€òý Pöœp žvÚi‘——WÖ£�AŸ@‚Õ«WÇ�?þ3gÎŒùóçDzeËbݺue=°zöÙgcÆŒ›ÔZ´hݺu+£‰Øšlܸ1233cîܹñý÷ßÇòåËcãÆ�e=Öf­[·.~ú駘5kV,X° ²²²Jü&Ë+¯¼2ªW¯¾ImôèÑ1nܸÝ/eǽ @ª¸”’”››+W®ŒyóæÅìÙ³cÙ²e±aƲk³²³³cÉ’%1{öì˜7o^¬\¹2rssKtŸÝ»w�&MšlR›8qb¼úê«%º_Š®RY”�ÜÜÜøüóÏ㫯¾Š‰'ÆäÉ“cÉ’%ùþñ5jDFFF4mÚ4vÚi§Øc�=¢]»v±ÓN;EZZZ)Oð³#FÄ-·ÜRjû;ï¼óâ¶Ûn+µýÁ–lÙ²eñÐC%Ôÿô§?EÅŠKdŸÙÙÙ1cÆŒ˜4iR,Y²$é:;vŒN�:•Èþ·YYY1eÊ”˜2eJ¬^½:é:'Ÿ|r4mÚ´ÔfZ¶lY|öÙg1eÊ”øöÛoãÛo¿�… &„d¦¥¥EíÚµc·Ýv‹½÷Þ;öÙgŸèܹsT®\¹ÔfýEfff|ðÁñõ×_Çĉã»ï¾‹ììì„õ*T¨Ñ®]»h×®]|ðÁѲe˔ͱÝvÛÅyç��<òÈ&õ{ï½7^yå•;(yî¶î…ò«,îÍOnnnœuÖYñÕW_å»NÇŽcÈ�!¥7T9¶nݺ˜:ujLž<9V¬X‘t�®]»Æn»íVj3­Zµ*Æ�“&MŠo¿ý6f̘óæÍK’Y³fÍhÕªÕ¯÷‚pÀ _z^Ö¬Y~øaL˜0!&MšÓ§O�µk×&¬—––�5ŠvíÚEûöícÿý÷�öíÛ§lŽ*UªDÏž=ãöÛoߤþ÷¿ÿ=Ž8∨Y³fÊö@jú€mÐâÅ‹cøðá1|øðX°`A�·[½zu̘1#á›Xk×®:tˆƒ>89ä�Øa‡R=2°úûßÿ+W®Ü¤¶÷Þ{G×®]SÒ?777fÍš“&MúõÏ´iÓ’)þVÏž=}þÆúõëcÚ´i›<�³gÏþÝoïØ±c‰}æååÅ—_~ï½÷^Œ3&¦OŸžê™ßv+V¬ˆÏ>û,>û쳈ˆhذaœqÆqæ™gFÆ Klæ_Lž<9žyæ™=zt¬_¿þw×ÏÍÍ�¹sçÆÜ¹sã­·ÞŠ~ýúÅ>ûìgžyfœp Q¡B…bÏtñÅÇóÏ?™™™¿Ö¦OŸÏ?ÿ|œsÎ9Åî@ér/(PJú^ÐÂxöÙg7ò¹-ËÉɉo¿ýv“{A¿ûî»|Ãß‘‘‘QâAŸS¦L‰wÞy'ÆŒ“'OŽ�7h»¬¬¬?~|Œ?>µjÕŠSN9%ºwïÍš5+Ñ™#"fÏžÏ<óLŒ92²²²~wý¼¼¼X´hQ,Z´(Þ{hˆhÓ¦Mœ~úéqÚi§¥ä ë»u냎ٳgÿZ[¼xq 4(nºé¦b÷ µ}À6$777žyæ™xà�’~{dQ­\¹2>øàƒøàƒ""âôÓO�{î¹'eýغ̛7/^yå•„zFFFtëÖ­ &¢$|÷Ýw1bĈ„úW\Qäž?þøcŒ?>&Mš“'OŽÉ“'Çš5kŠ3æ6iúôé1qâÄ_ŸÇ3fDNNNY�õ«iÓ¦Å+¯¼£F�ŠE‹¥¤çâÅ‹càÀ�ñøã�Ç 7ÜÝ»w�´´´”ôþ­uëÖÅ?ÿùÏxæ™g~7(õ÷ürsêóÏ?ùË_b—]v)V¿ZµjE÷îÝcàÀ�›Ôÿõ¯ÅÉ'Ÿ\&ßr@á¹€òÀ½ Û†’¸´¨-ZÿøÇ?J}¿åÕ÷ß&LˆÉ“'ǤI“â›o¾)Г—–¹sçÆË/¿£F�Š9s椤çªU«â©§žŠ!C†Ä¥—^W]uU¤§§§¤÷omܸ1=ôPdgg«×´iÓâî»ïŽgŸ}6úöí{î¹g±úU¬X1.½ôÒ¸å–[6©2$Î;ï¼hÒ¤I±ú�Z‚>`±páÂøÓŸþãÇ�/ñ}-]º´Ä÷À–kþüù As;vtsçVäÁL:lݺurÈ!Eîy÷ÝwÇûï¿_ÜѶyçœsN¬Zµª¬ÇÈ× Aƒâí·ß.‘ÞëÖ­‹{ï½7þýïGÿþý£Aƒ)ë=wîܸä’K6ù–ôT?~|œtÒIqß}÷ÅqÇW¬^çœsN þøãøç?ÿ;í´SÊz/_¾<®¸âŠ˜0aBÊzFüš{æ™gÆ�7Þ^xa±z�p 1`À€øñÇ­eggÇ Aƒâî»ï.P…²(y?üðCœuÖY¥rc'ÀÔ©Sã�wÞI¨_|ñÅe0 $úôÓOãœsΉE‹¥¤ß¢E‹¢{÷î)ùüÅúõëã†nˆQ£F«OýúõãÔSOM¨<8²²²ŠÕ€’å^P 4•§{Aßyç�xï½÷J}¿”oS¦L‰³Ï>;¾ûî»”ôËÊÊŠ=z¤<ä󹹹ѯ_¿b ¦§§G�=ê#FŒˆyóæ«7©U©¬JÖªU«â’K.‰… nv½wÜ1Ž8âˆØ}÷Ý£U«VQ¯^½¨Y³fT¬X1V¬X™™™±xñâ˜K–,‰K/½4† 4(ÖL·Ýv[L›6-ßåiiiÑ¥K—èÚµkìµ×^Ѹqã¨U«V¬_¿>V¬XÓ¦M‹qãÆÅ«¯¾™™™ùöéß¿´mÛ6:vìXäYO?ýôø×¿þ«V­úµ–““ƒ о}û¹/©%è¶r}ûö�9sæä»¼]»vÑ»wïØo¿ýò]§aÆѰaÃØu×]ã€øµ>eÊ”=ztŒ=:~øá‡TŽ �M›6�V­Z•õ°M™9sfüûßÿN¨Ÿzê©Q©Réüo‰ªU«Æn»íVbߨ½­¨[·n4iÒd³7-––F�ʼn'žüã7û¾Þ¸qãhܸqì½÷Þq饗Æ'Ÿ|}úô‰ùóç']Ê”)ñÏþ3n¹å–"ÏöüóÏoöµÖ±cǸï¾û¢iÓ¦ ËjÕªµjÕŠwÜ1Ž9昸ñÆã¯ýk¼ôÒKI{­[·.î¹çžxòÉ'‹ú(F��ïò6mÚD¿~ý¢M›6 ËÒÓÓ£fÍš‘‘‘‡~x\wÝuñðÃÇ£�>ºÉ—²ÿ"///úôéo¼ñFT¬X±HóÖ¨Q#Ž?þøxî¹ç6©�92®»îºhذa‘ú�ZÊz äL�:5^yå•|—_~ùå1|øðÍÞØ¹9{ì±G\ýõñî»ïưaÃâˆ#Žˆ üº¶eO?ýtÂ7¸W¬X1N=õÔÙ_zzzì¾ûîqÆgÄ=÷ܯ¾új|ùå—ñüóÏ—Èþ¶V5jÔˆýöÛ/.¼ðÂøç?ÿï¾ûnŒ;6n½õÖ2�k÷Ýw�üãñÁÄ 7ÜPèö:è xå•W¢S§Nù®3dÈ�˜={v‘æÛ¸qc<úè£ù.?á„âé§ŸNò™L­Zµâ/ùËfŸ÷ÿþ÷¿Å¾9ù´ÓNK¨-[¶,FŽY¬¾¤ž{A€ÒVÚ÷‚ægüøñIïýóŸÿU«V-ÕY¶UªT‰½öÚ+ºwïýúõ‹·Þz+¾øâ‹0`@™ÎµÓN;ÅÝwß}ôQüùÏ޽öÚ+ß�ÏdöÜsÏxñÅã¸ãŽËw�wß}7ÆŒSä~øá|—uìØ1^|ñŤ!ŸÉT­Z5®»îºxðÁó=¯ž5kV¼óÎ;EšõÉîÍÉɉgŸ}¶X}H�Òýº T=ñÄ 7Wüâ’K.‰ë®».eûêСCtèÐ!æÎ�“&MJY_`˱|ùòxíµ×êtP4iÒ¤Øý+V¬-Z´ˆvíÚýúg·Ýv‹Ê•+»÷¶¤jÕª±Ë.»DÛ¶m}wÙe—rõ�tZµj×^{m~øáÅîU§N�4hPœuÖY1cÆŒ„å7nŒ'žx"î¹çžB÷þì³ÏâÇLº¬U«Vqß}÷éy=ÿüócÚ´i1bĈ¤Ë_ýõhß¾}¡ûþâ°Ã‹í¶Û.–,Y²I}È�!¥~#6›ç^P 4•ô½ •““wÜqGÂyÐQG‡rH<þøã¥6KyT©R¥Øm·Ý~½´m۶ѪU«¨T©üDˆdddÄÕW_'œpBT¬X±X½ªT©ýúõ‹åË—Çÿûߤë<öØc±ÿþûº÷œ9sb„ I—5hÐ þõ¯E•*U Ý÷ˆ#Žˆ«®º*z衤Ë_ýõ8æ˜c Ý÷{ì±Gì¾ûî1uêÔMê/¼ðB\qÅî¯(ÊÏU:�Rëׯ�÷Þ{/é²�wÞ9®¾úêÙo³fÍ¢Y³f%Ò(߆ëÖ­K¨wëÖ-%ýxà�bßèGÄG}T®ŸÇK/½4vÛm·”ÎX³f͸ï¾ûâÔSOMú�ŸF�wÜqG¤§§ªo~7‹FD\sÍ5…î÷[×]w]¼ñÆ‘���°ì³Ï>+r߈ˆôôô8á„âÉ'ŸÜ¤>mÚ´7n\tìØ±XýH ÷‚¥­¤ï-¨G}4¾ýöÛMj5jÔˆÛn»­Tç(¯^|ñÅr}/è‰'ž×]w]JÃ&ÓÓÓã¾ûî‹£Ž:*ékt̘1±xñâhذa¡únî^ÐË.»,j×®]èYqñÅÇsÏ=—ðÅìcÇŽ�¼¼¼HKK+rÿnݺ%}.]º4Þ|óÍ8ùä“‹Ü€Ô¨PÖ%c„ ±víÚ¤ËN;í4ß̤Ü+¯¼’P«V­Z|ðÁ)é_žoHÜ’”÷ç±mÛ¶%2cÛ¶mãðÃOºlÕªU1iÒ¤B÷œ>}zÒzõêÕã�C)t¿ßjÔ¨Qì»ï¾I—Íž=;6nÜX¬þGydÒz²ã€²á^P ´•ô½ 1{öìxä‘Gê×\sM4nÜ¸Ôæ(ÏÊû½ mÚ´)‘sÕ&MšÄgœ‘tYnnn‘¾H=¿{A#"Ž9æ˜B÷û­ªU«Æ¡‡štYVVVüøã�Åêä‘G& u/(@ù è¶R›ûÍ¥yƒEiÈÍÍ�¥K—Æ÷ßsæÌ‰¥K—–õH°EÉÊÊŠùóçÇÌ™3cáÂ…‘��]Ö#[ I“&ŬY³êx`T«V­ &‚DGqD¾Ë¾ùæ›B÷[´hQÒzÛ¶m#==½Ðýþ×Þ{ï�´ž““+V¬(vïdßZÿÎ;ï$ý¦{JŸ{A�‚r/(� åå^Ð;î¸#á}l�=öˆîÝ»—Ú ”_›»têÔ©…î—ß½ ѨQ£B÷û_ùÝ ±xñâbõnܸq´oß>¡>nܸb‡ˆü?öî;<Šêmãø�B z/T¥ƒ´ŸŠ"E”ªˆôj‘¢ ô&½Jµ""U¤ˆ ½·Ð;¡„IHÏû‡/è’™�ìΦñý\—ì93Ï�v=ýôÓrqqQ|||‚¹‹/&»^z΂JÒ‹/¾¨}ûöÙŒÅÇÇkÙ²eêСƒÃõöc¡O2¨°°0Ó9ooïì$iúöí«Ÿþ9Áø°aÃÔ´iÓû�O�:¥aÆiÓ¦M‰Ö Õ¶mÛ´mÛ6�7NÍ›7W·nÝ”5kVË{¿çÚµkš;w®–.]ªëׯ›­Û·oëäÉ“úã�?4fÌ=öØcjß¾½5jäÔðÉùóç5kÖ,­ZµJ·oß6=.$$D!!!:vì˜Ö¬Y£aÆ©\¹rzï½÷ôüóÏ;¥·ØØXýðÚ>}º._¾lxLdd¤‚ƒƒuàÀýôÓOòõõU‹-Ô±cG§„<[µj• $$IóçÏWåÊ•®¿mÛ6µnÝ:Áx¥J•´`ÁËëDEEiÊ”)š?~¢¯111:qâ„Nœ8¡ ¨|ùòúä“O wzÅ¿¢¢¢´iÓ&ýþûïÚ¶m›é}|Oxx¸ÂÃÃuíÚ5-///‡ûJ®øøx­^½:Á¸‹‹‹jÖ¬™âý¤´ÀÀ@½þúë†A¿‚ ê—_~±ä~™4i’&Nœh8תU+}úé§_#£K,,™ØïF3>>>Ž´ã+Þ×Ö®];ÁBŸ’´råJú€4€,(YP#dA“‡,(YÐä JÔdA­sýúu�5*ÁxóæÍ�þúuíÚ55nÜX7nÜH0ççç§¥K—*þü_géÒ¥úøã� çêÖ­«©S§:|�ŒÎÓÓS~~~ I0—Þ² ~~~ר]»¶áófÕªU,ô ©,õ¶šN•X (888;±ÎâÅ‹õꫯ>4Øù ¨¨(ÍŸ?_�5Òž={,ïë^`îùçŸ×¬Y³ vš9qâ„úöí«×_]G�µ¼Ç°°0}ñŪW¯ž¾ûî»Dƒ�föîÝ«.]º¨]»vvírš˜ .¨yóæ}ëÐ5Μ9£Ï>ûÌp.oÞ¼6l˜Cõ%†ãé) êââ¢Ü¹s;\ÿ±Ç3üŽ=ª«W¯:\`?ú ƒÊ–-›éœ3ÃBÎ2gÎõïß_‘‘‘v׸|ù²Ú´i£?þøÃ²¾._¾¬-Zh„ Šˆˆp¸Þ¡C‡Ô¼ysýúë¯t÷�ÀÀ@5iÒDóçÏw8X"I[¶lÑk¯½¦;vXÐÝ?_s³fÍ´ÿ~»k\ºtIíÚµ³ôg›‘œÊH´dÉݹsÇÒº§OŸÖÛo¿­%K–XZ7&&F£F�R«V­hYݨ¨(YVÏf̘¡¶mÛêìÙ³׺yó¦>øà 8Щ‹ámݺU-Z´ÐñãÇ�v +üù矆ã•*UJáNROóæÍU¯^=ùU«VéÇ´»vHHˆ>øàÃ×_�;6Ñ,ñ¯Ä>„ãëë›ìzO=õ”áø¡C‡,ym0{ß^¾|y‡kKÿ|ÍO>ùd‚ñ°°0>8iYЄȂ’}T‘u.² ÿ êdA“fãÆ�ZµjU‚ñ¾}û*K–,)ÒCÍš5Õ®];ùݻw뫯¾²»vTT”z÷î­ðððsnnn=zt¢ïý𯘘…„„ÎY™½té’% eš½oPÖ¬Y®/I+VL0oú¼¤ ú ƒÊ™3§éÜO?ý”‚�8nÍš59r¤%µ"##Õ½{wíܹÓáZ'OžÔ믿®ƒZÐÙ¿îÞ½«Þ½{kåÊ•×Ú¹s§š7onI�é¿nÞ¼©÷Þ{OÛ·ow¨ÎÉ“'Õ¶m[ݼyÓáž"##Õ«W/8pÀáZÉÍ›7õþûï'º°Yr,]ºTC† ±¤.&&FŸ|ò‰V¬XaI½ÈÈHuíÚU³fͲk·âôlôèÑ3fŒ]»Õ'æûï¿WïÞ½ci]I:|ø°:w°0Ëk[Í,fËȾøâ (PÀtîäÉ“vÕíß¿¿._¾l87`À/^Ü®º�¢Ã‡›Î,X0ÙõªV­j8¦M›6%»Þ]»vÍô=kíÚµªý_•+W6'Ü ©�,¨1² Ö š~�MßÈ‚Z‡,¨s¥f4<<\Ÿ}öY‚ñêÕ««AƒN¿þõîÝ[eË–5œ›1c†þþûo»êŽ5J‡2œëÔ©Ó#—¹uĉ'Lçµ2 ïðÂíZ¿~½áYPÈøÜS»àO?ý´éܦM›´|ùr5lØ0;²Ïµk×4lذ!¤¼yóªAƒªS§Žòçϯœ9sêæÍ› ºÿõ�9sưftt´ºvíªeË–)wîÜvõuéÒ%µiÓF×®]3=Æ××W•+WV¥J•T¸paeË–Mžžžºqã†ÎŸ?¯?ÿüS[·n5Ü™>66Vü± ,˜èÏ21‡Ò{ï½g¸ãë=þþþªR¥Š*V¬¨üùó+[¶lruuÕ�7têÔ)mܸQ;wî4ܵûîÝ»êÚµ«~úé'*T(Ùý…††êý÷ß×íÛ·M�ñõõÕ‹/¾¨Ê•++Ož<Ê’%‹®_¿®‹/ê�?þÐÖ­[mz‹ˆˆP�=ôî»ï&»ŸŒê³Ï>ÓùóçmÆ<==U§N5hÐ@Ê›7¯bcc¤Ã‡kÙ²e ¾·ÿõí·ßªT©Rzã�7RâKH·<<>^ýû÷דO>©€€»û‰��U÷îݵaÆD�óññQÕªUUµjUåÉ“GþþþÊ”)“nݺ¥���8qBû÷ï×þýûuëÖ-»ûII .ÔÌ™3=¦@�ª_¿¾ž|òIåÉ“G Ò©S§´råÊDw¼ÿí·ß4dÈÀ¡½îÞ½«ž={&x ÷ððPåÊ•õÜsÏ©`Á‚Ê™3§ÜÝÝ¢ãÇ�kÆ )þs‰ŽŽ6ÝiºtéÒ)ÚKjË’%‹ÆŽ«·ß~;Aà÷ÞÏtñâÅòòòJrÍ… jíÚµ†s 6TÓ¦MêùQ³qãFÓ¹R¥J%»^ÕªUU¤HÃÒL˜0A5kÖ”‡‡G²ëJÒøñã•`ÜÏÏO¯¾úª]5�˜íDïè‡xŽ# J”,($² ©‰,hÚAÔ¹R; :aÂ]¼xÑfÌÓÓSƒ rúµäáᡱcÇêÕW_Uhh¨Í\\\œ>üðCýòË/ò÷÷OrÍõë×kþüù†s+VTçÎ�êùQ“Øk =YÐ"EЍJ•*†‹¸NŸ>]M›6•¯¯o²ëJÒœ9s êvww×Ûo¿mWM#dA mb¡O2¨Ò¥KËÏÏÏ4àѯ_?]¹rEï¼óŽÜÜÜR¸»¤›1c†M8ÂÍÍMï¾û®ºuë&OOO›cóäÉ£ÞS§N½ûî»:yò¤†®M›6%8æÖ­[êÝ»·¾ÿþ{¹ºº&«Ç¡C‡&ÞsïçÜ¥Ky{{óöÛoëòåË0`€Í.£/^|hˆëQqøðáá¢òåËkäÈ‘*\¸p‚ã³fͪ%J¨qãÆ:pà€>úè#�:uʰö°aÃTµjU»‚½™‡‡‡ªU«¦úõëëùçŸOr çîÝ»úùçŸ5aÂ…„„$˜�ˆˆÐ Aƒ´páB»{=zt¢¡&uëÖMÍš53}]ø¯èèhmÞ¼Y+V¬Ðo¿ýf¸Ý=Ç×ðáÃï?Þ¶m›Z·n�à¸J•*iÁ‚½vr}”3gNÃsjÔ¨¡víÚéÒ¥K–ô�T���†?»vÅNïÊ•+§=zh̘1 æ5lØ0 <8IµŽ=ª#FÎ.\8Éuð�ÐÐP­ZµÊpÎ×××4ä˜uîÜYüq‚¹cÇŽ©ÿþ1b„éë‹™E‹iñâņs}úôIö{ÃÄ<þøã†ãÇŽStt´Ý •G”,(YP�MydA�‘M>² IsðàAÃ{æý÷ßW‘"Eœzm3… Ò�!CÔ«W¯sW¯^Uß¾}5}úô$eƒ‚‚Ô·o_ùlÙ²iôèÑiú}\Z§Ÿ~úÉpÎÕÕU•+W¶«n×®]µmÛ¶ Ó_¿~]]»vÕŒ3’ôºú_ëÖ­Ó¤I“ çÞ}÷]åÏŸß®^�”(QB... ú¿qã†._¾¬|ùòYv-@Ò%ï_Ü@ºáêêªF�™ÎGGGkôèѪW¯žæÎ�««W¯¦`wI÷`°sÒ¤IêÓ§ÏCÿ@îââ¢víÚiáÂ…¦ÁÈ�7jýúõÉî髯¾ÒáÇ çžyæýòË/jß¾}’B]yóæÕÈ‘#õù矆3.^¼¨‰'&»ÇÏ?ÿ\—/_6œûßÿþ§_~ùEo¾ùf’‚š9s¦:uêd8¿ÿ~}ûí·Éêo×®]úùçŸ ç2eʤyóæ©OŸ>¦ÁÎ{òå˧Y³f©gÏž6ãf_û£æÁ`gƒ ´hÑ"Ã`çƒÊ”)£ŸþY+V4œרQ£,é3#ðôôTË–-µnÝ:͘1C¯¾új²víÍ”)“Þzë--[¶LåË—7´F\\œ>øàÃÅ%éË/¿TÞ¼yèòѳjÕ*�;wÎp®bÅŠÊ•+—]u+V¬¨–-[ÎmݺUo¾ù¦“T+**J'NT·nÝÜÛÒ? vwíÚÕ®>Íøøø˜.Ü}ðàAK¯H:ú {ï½÷Ò9þ¼† ¦š5kêõ×_רQ£´víZÓÊSÓ AƒT·nÝd�S¶lY�?Þt‡ÓñãÇ'«ÞÉ“'M*Tмyó”'OždÕ”¤7ß|Sýû÷7œûæ›otýúõ$×ú믿´zõjùúõëkòäÉÊš5k²{ìÙ³§Þ}÷]ùiÓ¦%ºƒóƒÆŽk8îîî®ñãÇ› ÍtêÔImÚ´IÖ9�šJ•*iذaÉÚí×ÛÛ[“'OV@@€áüš5kLƒÎiÅ… hÉ7oÞ4¼†¯¯¯Ö®]«Øõüÿ¯táÇ!C†èÔ©S†s}úôQ™2eîóQ¤3f˜Î·jÕÊ¡úcÆŒQ¹rå ç¶lÙ¢^xA=zôÐÏ?ÿ¬“'OêÖ­[Š��Uhh¨ÎŸ?¯5kÖhРAªY³¦¾ûî;Ã:uêÔÑèÑ£êÓˆ›››éïz³ç7 å�% ú ² �.² dAÉ‚Ú" j�ÔÊ‚Î�;×ð5hðàÁI^°Ö™ú÷ïoú=3fÌCPœ2eжoßn8תU+ýïÿs¸ÇGIxx¸éûIjݺµCõûöí«çŸÞpîðáÃjÔ¨‘Ú·o¯ï¿ÿ^G�Upp°bbb¦K—.iýúõ1b„jÖ¬©I“&.òùôÓOkæÌ™N¹¿K–,i8ÎBŸ�zÜS»àþøcýý÷ß:vì˜]çgd^^^6l˜]÷§ŸŸŸ†ª-ZÎÏ›7O#FŒp´E§ùä“O,«Õ¯_?µmÛ6Á¸§§§Ã¡ÎÿòóóÓ—_~©7Þx#Á܆ 𬠿²eËL |öÙg5tèP¹ºfÌ=¡Ì‚–...3fL²‚�÷x{{뫯¾R½zõž`þÛo¿UÇŽ ËþWÓ¦MÓt°S’Μ9c8ž/_¾”m$�É™3§FŽ©wß}7A¸úÖ­[êÓ§�,X w÷„ªY±b…–,YbX·fÍš†¯EHÜ Aƒj8÷¿ÿýO¥J•r¨~æÌ™5{öl 0@«V­J0£_ýU¿þúk²k{xx¨{÷îjß¾½Ó^¯óå˧#GŽ$?}ú´S®H:² ÿ ú² �.² Ö šþ�M©‘=þ¼&Nœ˜`¼AƒªZµªÓ®›™2eÒ¸qãôúë¯+""Âf.::Z½{÷Ö’%K ï•�;wjÊ”)†uŸxâ }ôÑGNé9#3fŒ.^¼h8WªT)‡Nuww׸qã4räH-X° Á|||¼þüóOýùçŸÉ®íêêªV­Zéƒ>pÚ"¶fÏW³ç7Àù2æ¿Ø€ûÚµk§¦M›ÚuîåË—õÛo¿i̘1jݺµ*T¨ ·ß~[&LÐÉ“'-îÔœ›››úõëçP�=z˜m–.]š¤AAAZ³f�á\Ÿ>}”={v{Û»¯wïÞ†áˤö¸wï^íÛ·ÏpîÓO?u8àîî®îÝ»ÎýüóÏIªñÓO?Žûûû«sçÎv÷æææfi�/#iÛ¶­ ,h÷ùÏ<óŒêׯo8·fÍÀóôÓO�£££µcÇŽdÕ2 I’���†žaƒ�û÷ïW`` á\Ó¦MU¶lY»kçÎ�[�:u2œ ÕêÕ«í®ý_>>>úøã�-©åL—.]2·2ôœ^U¯^]ï½÷žáÜîÝ» ªçÎ�ÓÀ� ÏÉ•+—ÃÔx-Z´Hëׯ7œóôôTß¾}-¹Ž¯¯¯Æ�§ñãÇë±Çs¸^–,YôÖ[oé÷ßW‡œúzmö|5{~RYÐ�% ú(# šþ�uYД“YÐÁƒëîÝ»6cY³fuøý‚ÕJ–,iÚÓÙ³g5xðàã!!!úàƒ›`ÎÇÇGãÆ�sÚb�ÕúõëµhÑ"Óùþýû[’¯õôôÔ§Ÿ~ª¹sçª\¹r×óööVÆ µbÅ }òÉ'Ný¹“€´'cþ«°1tèPµnÝÚá:QQQ÷w­_¿¾Þ|óMýøã�ŠŽŽ¶ Ks5jÔpx±¤9r¨Aƒ†sk×®5Ü™ýAK—.5 Z”(QB¯¼òŠCýÝ êÕ«'?þ|’µK–,1¯U«–žyæ‡û“¤š5kªX±b ÆwîÜ©ÐÐÐDÏ�‹‹Óo¿ýf8÷Ö[o)K–,õV¥J•/_Þ¡ͽ�_e´{¹$ݽ{W›6mr¸>2ÛQxïÞ½I®qìØ1:tÈp®yóæ*\¸°=­¥ fKuéÒÅáúmÛ¶•ŸŸŸáܪU«®/IõêÕS¶lÙ,©å,ñññº|ù²á }þ£G�¦¿›f̘¡¿ÿþûþã{»»‡……%8ÖÕÕU£F�’¿¿¿Óz͈öï߯áÇ›ÎwëÖÍò×—_~YË—/ל9sì~�XªT)M™2E4ÝaÝJfÏW³�ï)�,(YP² �.² éYPÇ�M©‘]¶l™6oÞœ`¼W¯^Ê™3§S®éˆæÍ›«^½z†sË—/O°PvÿþýM¿§ PñâÅ-ï1#»pá‚úöí«øøxÃùæÍ›«B… –^³jÕªúþûïõí·ßêÍ7ß”››[²k.\XãÆ�ÓðáÃ`iFÈ‚@ÚÃBŸ<ÜÜÜÔ¿Íœ9SEб¬îÞ½{õé§ŸªAƒúã�?,«û ³Ý£“Ë,ÜyçÎ>|ø¡ç¯[·Îp¼~ýú–ìüy�Q¸S’¶mÛ–èyñññ¦?«Â§÷õ£]»v%zÞÑ£Gl8çìŸó£ªR¥JÊ•+—Ãuž~úi*TÈpî¿‹ÔÁ:f�ìãÇ�'¹Æúõë Ç]\\Ô¼ys»úJ/ŒÂ’ôì³Ïª@�×÷ôôÔK/½d8·k×.EFF:|�Æ�;\ÃÙnܸaú!�´´L îîî3fŒ²fÍš`...N~øáýß�cÇŽÕ� ëtèÐAU«Vuj¯MPP�ºt風¨(ÃùgžyFï¾û®å×���ÕÊ•+5{ölÓµ<ÌáÇժU+Õ­[W‹-²ä5%1fÏW³ 1 å‘ýYPë�M?È‚¦_dAC4e¤t4$$DÆ K0^¶lÙ4}OñŦ÷Ý矮ӧOK’.\¨µk×× A5mÚÔi=fDaaaêÔ©“BBB ç‹)¢�>úÈ)×^¿~½fÍš¥_~ùÅp¡ø‡9wîœ:uê¤5jhêÔ©]LÝQfïnܸaš¥8 }ð©Y³¦V®\©/¾øB%K–´¬î™3gÔ©S'}øá‡–ÿñ×ÕÕUÏ?ÿ¼%µ*T¨ ìÙ³ÎíÞ½;Ñsoß¾mºðÖ /¼àpoÿõì³ÏŽ9r$ÑóŽ;¦k×®%wss3Ý Ú^ööhþ,Q¢„e;”š…­UVÞŸfÏŇ=`Ÿ9rŽ'gGÝ­[·ŽW¬XÑÒ°ZsçÎÓ¬UArÉ<8©ƒ:TÛÍÍMåË—w¨FJH,pæíí�‚�¤m ÐСC ç®^½ª¾}ûjãÆ�úúë¯ �)_¾¼ºuëæÌ3œ»wïªsçκzõªá|öìÙ5nÜ8»vXOÌÚµkõÒK/éƒ>Ð_ýe~NªK—.éóÏ?WýúõµgÏ‹ºL(S¦L†ãaaaN»&À>dAÉ‚Z…,húA4ý" j?² )'¥³ #FŒH°`´›››>ÿüs¹º¦Ýå/²dÉ¢±cÇÊÝÝ=Á\xx¸zõê¥ýû÷kĈ†ç.\XŸ}ö™³ÛÌPbccÕ§OÎ{yyi„ Êœ9³¥×ݹs§^}õUuìØQëÖ­SDD„CõnÞ¼©ñãÇë…^0]¼Ù ‰=_Ƀ@êHø¯ CóððP³fÍÔ¬Y3íß¿_«W¯ÖúõëïïêˆeË–éüùóš6mš²eËæx³ú'ÌàëëkI-=ñĆa§‡íŠ|èÐ!ÅÅÅ%÷ôôTñâÅ-éïž>Þp®L™2–]§L™2ruu5üýh„OŠ€€€t±PfbÁµôÐJªW¯žš7o®ï¾û.ÁÜÆ�µeËÃû6kÖ¬3fŒa0ÆbbbÔ³gOÓ÷F;v¬òæÍkÙ5£££5tèPßï=ÅŠSõêÕU¾|yåÈ‘C~~~ WHHˆµ}ûvmß¾Ýp×÷ .¨eË–8p Þ|óMËú¾Çìùêh8àdAÉ‚Z�,húA”,¨² Ö š²Yпÿþ[K–,I0Þ²eKÓ×§´¤\¹rêÑ£‡ÆŒ“`îÈ‘#zë­· 7¿—[´úwyF÷ÙgŸ%º0ægŸ}fù}3iÒ$M™2Å0Ë)IùóçWõêÕõì³Ï*wîÜÊ–-›¢¢¢¢S§NiûöíÚºu«"##œ¬Ž;ªsçÎêÑ£‡¥}K‰?_Ƀ@êàS¡<ÂÊ–-«²eËêã�?ÖåË—µk×.íÛ·OÔÑ£Gžìš{öìQŸ>}4sæLKvS}üñÇ®ñ`=£pç™3g=Ï,”X¤HËmf�®   DÏ3ëÑêð©$eÏžÝpüa=š…ˆŸxâ ‡{z°áÎÍ%K–´¬žÙó1**J—.]R¡B…,»VFqèÐ!>|XÇŽS`` ®_¿®°°°ûÿ…&©»ééÖ­[†seË–MöuÓ³×twwwK¯øøø¨H‘"†¯mŽ~h" À¡óSÊÝ»wMçÒC85¥}òÉ'Ú½{·áïl£`§$ 2D pvkF||¼ú÷ï¯ 6λ¸¸è‹/¾PµjÕ,»fLLŒúôé£5kÖΗ,YR½{÷V�:uLk<ÿüóêܹ³Î�;§)S¦èçŸ6¼Î Aƒäéé©&MšXÖ¿ôÏ®öFâââi:H}dAÿE4yÈ‚¦dASYÐÔA4å¤T422Rƒ J0ž'OuïÞݲë8Û{ï½§mÛ¶ióæÍ æÌ² ½{÷¶t�ÚGÁ„ ôý÷ß›Î÷ìÙÓò,å—_~©yóæÎåÏŸ_={öTƒ Lß7Ö©SGï¾û®®]»¦Y³fiþüù†¿#¦L™"wwwuéÒÅÒþËzÚóÿDZÐ'�$åË—O 4Pƒ $ý³¨Ï©S§tàÀmß¾]Û·o×… ’TkóæÍš4i’%a‹"EŠ8\#)õ®]»–èy—.]2?~ü¸åT3!!!‰Î›õ¸aÆ4ÓãÕ«W Ç‹+fiÅŠKtçÖGEΜ9-Ýõ·hÑ¢¦sW¯^%ÜùÿΞ=«%K–hÅŠI~ÝL£Ý}�\¹rÅtÎÊÐoZdöZS @Ë«+Q¢„a�Ó¬‡¤Êš5«C秳ݪ%Yò!�ŒÆËËKãÇ�×k¯½–h0öž7ß|S/½ôR t–q 6LK—.5�ÿä“OÔ¸qcK¯9räHÓE>4h /¾ø"ÉaçÂ… køðáªV­šú÷ﯨ¨(›ùøøx 8PeÊ”Ñc�=æpï÷¸»›ÿÉ0&&†…> � JÔ dAÓ² ©ƒ,hê# šrR* :yòdÃ\û÷ïoé뜳¹¸¸hĈjܸ±®_¿þÐãkÖ¬©víÚ¥@gÇܹs5eÊÓù¶mÛªS§N–^sÞ¼y¦‹|V­ZUãÆ�3]$ýA¹råR¿~ýT³fMõêÕËpÁæ‰'ê™gžQÕªUêû¿Ë‚&ö<8Ÿ²†\]]õØc�©I“&6l˜Ö­[§Å‹«U«VÊ”)ÓCÏŸ={v’B cu`ìÞÍ›7=ÏÑ�Ž"""�O=š}Ÿ³dÉbiV×K¯2gÎli=oooyxxÎ=ì9ô( Ó¨Q£ôÊ+¯hÚ´iN vJJòÎgË–Í¢nÒ¦àà`Ãqg¼6˜Õ4ë!©¬~þ:Kb‹&5ˆü¨ Pÿþýz\É’%õÉ'Ÿ¤@GǤI“LC–’Ô­[7µnÝÚÒkîØ±CóçÏ7œ«U«–F�•äE>ÿ«Q£F2dˆá\TT”úõë—욉Iì=\RÞûÒ&² ¶ÒCÎ2=ôH4e‘MYdAÓ² )'%² ÇŽÓœ9sŒ×ªUKõêÕ³ä))gΜ9r¤\\\=.W®\1bÄC�ÿ–,Y¢áÇ›Î7mÚT}ûöµôš§OŸÖرc çJ•*¥©S§&y‘Ïÿª^½º¾úê+Ã8ãããõÉ'ŸXš·& i }€$+S¦Œ>ýôS­]»VMš4Iô؈ˆà FrYn1 w>,”fiöˆŽŽNt>=ôx÷î]Ãñ”ú9?jœ3«ù¨/訆 jÖ¬Y}¤³×5WW× ÿ1»�ñu›Õtô9áãããÐù)%±Ð×£þº�˜×_]•+W6�÷ööÖØ±cíZ òQ5wî\Mœ8Ñt¾M›6êÚµ«å×3fŒâããŒûùùiôèÑruµÿOq¯¾úª7nl8·ÿ~mݺÕîÚ2û�áåååÐ×H{È‚¦.² I—ÑsnIE4å�M[È‚¦ggAãââ4pàÀÏ+ooo 0Àáú©¥zõꉾ—ruuÕ¨Q£äï]¥ok֬ѧŸ~j˜Ë”¤zõêièС–/œ:iÒ$Ã×[wwwM˜0Á¡E2«T©¢:Î]ºtIË—/·»öƒXèÒ>™’-gΜ>|¸˜èq+V¬pøZ^^^×ø/³?NÇÄÄ$z^TT”¥}8CzèÑìûluh€Â?œ±@œYÍ´hL 'OžT«V­tñâÅÔnņÙÏÄÛÛ;Ãï möµ;ãµÁ¬æ£òœHì{ú°N<Ê<¨Ý»w'zLFžZéÇLt÷öfÍš©_¿~–_÷àÁƒÚ³g�á\ëÖ­•5kV‡¯Ñ¥K¹¹¹Î}ûí·׿Ç,ŒÍ{*ȸȂ¦Mé¡G² )‹,hÊ šö�M9Î΂~ûí·Ú»wo‚ñÎ�;«P¡B×O-—.]ÒºuëR»� cãÆ�êÓ§�bcc çŸ{î9�=Ú4Si¯k×®iÍš5†s�5RáÂ…¾F»ví”%Kùo¾ùÆáú÷$¶0¯3ÞOÎ=µé×Ûo¿­³gÏjÞ¼y†óAAA:}ú´Š+f÷5Ìvý¶—ÙN牞çêšö÷KI=º»»ž¬þ9[]/½rÆ÷!<<ÜpÜÓÓÓòk¥QQQêÑ£‡BBB=®P¡B*[¶¬Š/®|ùò)GŽòõõU¦L™äææfúümذ¡Ý½™ýL"""Ÿ¡žf¯éÎxN˜Õ|Øï•Œ"{öì¦s·oßNÁNÒ�°°0õîÝ;ÑpDD„zõê¥Å‹[þA—ŒfåÊ•8p éîíõë××�!Cœòš÷ǘÎ5nÜØ’k)RDO?ý´á°۶m³ìõüÖ­[†ãþþþפmdAÓ–ôÐ#YДEÔùÈ‚¦MdAS޳³ ýõW‚±\¹ré¹çžS`` ÝuÍ^ËÂÃÃMëfʔɒÅEcccÕ§OÓì�$ÅÅÅéÃ?Ô²eËÈâ=ÄöíÛÕ½{wÓlmÅŠ5iÒ$§üžÚ´i“éu5jdÉ5²fͪڵkkùòå æ>¬[·nÉÏÏÏáë˜Ý�ÞÞÞòõõu¸> ùXè8¤[·nZºt©é„wíÚåP¸Ó,Œi¯ÐÐPÃñ‡íìk¶{åã�?®Ñ£G;Ü—Ìz¬Y³¦>üðÃéáaa&oooÃDJýœ5V_«ù¨îðºpáB?~ÜpÎÓÓS­ZµÒ믿n×ë`\\œC½™ýLâââjº+pF`¶0¢3^Ìj>*‹3fÊ”Iþþþ N0” ¥}ƒÖÙ³gz\`` † ¦Áƒ;¿©tjíÚµúè£�L_/ëÔ©£‘#G:í0»ví2/P €%Aà{ªT©b¸ÐgHHˆN�:¥€€‡¯aö|ÍŸ?¿ÃµiYP² ÿE4m! ê|dAÓ&² )'5² ×®]S“&MœRûàÁƒ¦ ìVªTI ,pø'N4Ìõ=èÚµkêÛ·¯¦OŸž¡æuľ}ûôþûï+""Âp¾L™2š6mšÓ~G™eA===õÌ3ÏXv�*Uª.ô¯½{÷ªV­Z_Ãìùš/_>‡kìÃBŸÀ!Y²dQ�:u´téRÃùk×®9Tߊ`ÿëÎ�;†ãÛ!5[¶l†ãQQQ*Y²¤£mY¬Ǹ¸¸4Ó£¿¿¿áÏÀìçb/«ë9KTT”Së[ýü Ull¬á\Ž9,½Vz§yóæÎåÊ•KS§NU™2e쮟ØÏI‘ØÏäÖ­[:ÜiöšîŒ×{¯d$ùóçg¡Ï$úù矵lÙ²$ÿí·ßªzõêzá…œØUúô×_©W¯^Љ‰1œ¯R¥Š&L˜ðО8âܹs†ã… ¶ô:EŠ1� rêBŸ p¸6 í# J49È‚Ú" š¾‘M»È‚¦,² I÷÷ßkúôéI>~ãÆ�š7ožÚ¶m뼦ҩ£G�ê½÷ÞSxx¸á|É’%5kÖ,ùúú:­³,hÞ¼y-]ì7±,èÕ«W-¹†Y² �z\S»�þ=û쳦s!!!Õ>uê”Cç'µ^îܹ=/þü†ãކ¯¬”z4û>Ÿ>}ÚÒëXUÏÕÕøŸÏÝ]ûgÿlnÞ¼i¸²WbÏLJ=‡2¢Ý»wëÊ•+ Æ]\\4ḟ‚�’ã÷Gb;ï:T;­3»/^¼¨ÈÈHK¯uâĉdõ�,XÐpœp§­Ó§OëóÏ?7œ+P €²gÏn8÷é§ŸêòåËÎl-ÝÙ¹s§ºtébú!‰òåËkêÔ©–,�˜½Ï5ûÀ�½«çè{í{wÈ‚¦ é¡G² ¶È‚¦odAÓ.² )‹,hÒëÃ?4ü’5kVÓ�ÂG�­C‡9»½tåÔ©Szç�wL_'‹-ª¯¿þÚòLæƒÒBôæÍ›–\ƒMß ía¡Oà°œ9sšÎ…††:Tûرc�ÿ £G�Ž+V,ÑóŠ/n8~óæÍ4ž4ëñüùóŠ��OánŒ™}ŸSêçœ\>>>†ãaaa–Ô·jq®ÄXù½5«åã㣼yóZv�ôb×®]†ã•+WVåÊ•®þüy‡ÎÏ�;·i hß¾}ÕNëŠ-j8ci°õîÝ»:sæŒáÜÃ~¯d$�?þ¸á¸Ù÷æQ¥Þ½{î8îîî®qãÆiذa†ç†„„èƒ>Pll¬³ÛL8 ÷ß_wïÞ5œ/Uª”fΜiú;ÜJV‡Å͸¸¸˜ÎYu_˜}0æ‰'ž°¤> í# J4©È‚Ú" š¾‘M»È‚¦,² IÓ¯_?Ó�µ‡ªñãÇËÃÃ#Á\tt´z÷îmÙïžôîüùójÛ¶­nܸa8Ÿ?~Í�;7Ñ÷§VI YP«7Ë‚š=¿ÎÇBŸÀannn¦sÞÞÞÕ¾|ù²®_¿îP�{¢££MÃi%K–LôܲeËŽÇÇÇkçÎ�÷f³CBB,OÚËìû|àÀË®qýúu]¾|Ù’ZY²d1w4´|OJìÊkå÷Ö¬Öc�=–hð$£2 ÂÔ­[×’úV¼¶”*UÊp|÷îÝ×NËJ–,izOî߿߲ëÿüs'v˜>©]»v 2œÏ•+—æÎ�«|ùò¥H?fïsÓ[4>>ÞôùZ¦L‡ëìÃBŸÀaf;’JRöìÙ®¿f͇kHÒŸþiºj… =·`Á‚*T¨�áÜÖ­[îÍ åÊ•3Ýu<­ôøì³ÏŽ?~\'Ož´ä¿þú«%u$É×××püܹs–ÔO‰€�UÏŸØØX­]»ÖpîaÏŸŒÊlá XRÛ¶mרZµªáøŽ;töìY‡ëÛËìCÑÑÑ–ÔÏ’%‹i¸ÒÊ׈•+WŽ{yy=R‹ã™}­—.]Ò�;wR¸›´gýúõš?¾á\µjÕôÞ{ïÝüᇚ†²§N�ª;v8¥ÇôàìÙ³zç�wLƒ“… Ö×_-ÿë)GކãV½OHJ½Ü¹s;\ß,Ø™/_>Ó¯�ñ�M9K² ÿ j‹,¨ó�µYЌřYÐ)S¦èرc–ÿW©R%ÃëUªTÉôœ Øõ5:tH£G�6œ+Q¢„>ùä“û�Û´i£Úµk»téR-[¶Ì®2‚àà`µk×NçÏŸ7œÏž=»¾þúk)R$Åz2Ë�)**ʲë8; záÂ…‡‡'÷ððÐO<áp}€}Xè8ìèÑ£¦s… v¸¾Yxƪ:¹råR‰%zþ /¼`8þóÏ?ëöíÛõf///=÷Üs†s‹-Rlll w”ÐO}ºÃ5¦M›f8ž-[¶G6Üéççg8~õêU‡kÏš5Ëá’ôØc�™¾÷Ýw–.D—Ù²e3 ²ì/¿ü²áx||¼¦N�êpý… š.¸X¿~}‡ë§7faZ+néͽ…9oÞ¼™`ÎÅÅEÇ7 q+VL 0¬yåÊ›]ß7nÜPÛ¶muñâEÃùœ9sjîܹ¦cgzê©§Lç–-[fÉ5NŸ>­ýû÷Î)RÄôõ49víÚe8^£F ‡kÒ² dA“ƒ,è¿È‚¦dAíG4ã! jì³Ï>3]Ô¹_¿~*Y²d‚q�5J®® —ó S¯^½LΈîÞ½«÷Þ{O‡6œ÷ññÑŒ3Lg;SJdAoݺ¥ 6Îy{{ÞCÉEÒ&ú ƒÚ°aƒÖ®]ëôëÌŸ?_×®]3œ+X° Š-jÉu¾üòKÅÇÇÛ}þÈ‘#MƒM›6MR�€€Ó]Ò§M›–&,5kÖÔc�=f8÷å—_Z²›·£Ì¨ÁÁÁš2eŠÝucccõå—_Ú}¾³ ÈíÛ·MƒI±{÷nËBIñóÏ?›†b’bíÚµÚ¾}»á\£F�äááawíôÌßßßp<±Ýv“â÷ß×Ê•+ªñ_­Zµ2Wß¾}gÙµ’*Ož<†¡úàà`[r�²eËš†ž~üñG9rÄîÚ7nÜÐäÉ“ ç|}}õÒK/Ù];½2ûýhöÚñ(˜:uªé×ߦMÕªUËôܦM›ªAƒ†sëÖ­ÓÂ… -é1­»}û¶ÞyçÓ€l¶lÙôõ×_[ö~3¹ªU«f:7þ|‡?´"I“&MRll¬áœUáË;vŽ›=¯)‡,¨-² dAíAôdA�‘µYÐŒ‡,hBK—.Õ/¿üb8÷â‹/ªE‹¦çV­ZU:t0œ;xð ÆŽkI�i]TT”ºtébºˆ·———¦L™¢gžy&…;ûGbYÐeË–Y²˜òìÙ³j8W¥J¹»»;| ³ç)YPH],ô @uáÂuéÒEÍ›7ׯ��r�={öh„ ¦ó�7¶ìZ‡ÒèÑ£í:wÑ¢EZ·n�á\åÊ•“µëç|`¸«jtt´ºwï®Ó§OÛÕcb‚ƒƒõ÷ß'éXõéÓÇpîÖ­[êÔ©“i×/^Ô¾}û’tìÓO?m˜?¾Ý÷ëˆ#tìØ1»Î5ãççgzL˜0A111É®yóæM}øá‡¦‹v9C\\œ>øàݺu+Ùçž?^ƒ 2œsssSëÖ­m/Ý2»7Ö¬Ycw çĉúôÓOi+� ˜†¾wîÜ©¤èý(ýÈ*P €áœ#Áé½÷Þ{†ãqqqêÝ»·nÞ¼™ìšQQQêÙ³§é~o½õ–|}}“]7½«V­šaÈl÷îÝ)~¥;wî4 —.]Úôwõ}öÙg*\¸°á܈#tôèQ‡zLëÂÃÃÕ¡CÓ¯Ó××W³g϶ds{U¬XQ¹sç6œ ч~èP€þ§Ÿ~ÒŠ+Lç_yå»kßsüøqÃPýc�=¦|ùò9\ಠÿ" ú² ÉG”,hbÈ‚Ú�,hÆCÔÖ™3gôÙgŸÎåÏŸ_C‡}h�nݺ©|ùò†s_ýµ6mÚäP�i]ll¬z÷î­¿þúËpÞÃÃC'NTÕªUS¸³*THeË–5œ‹ŽŽVÏž=awý-[¶hÖ¬Y¦óVdACCC >Î’%‹Ê•+çp}€ýXè€ nÏž=êСƒ5j¤ï¾ûNaaa–Ôýõ×_õÎ;ïèîÝ»†ó>>>jÙ²¥%׺gÖ¬Yš3gN²ÎYµjU¢Ф,´õ_O<ñ„Ú¶mk8wíÚ55kÖLkÖ¬IVM3çÎ�ÓàÁƒU§N-_¾<ÉçÕ­[WõêÕ3œ;yò¤š4i¢;vXÒã‘#GÔ§O½øâ‹¦á #½{÷6�‰‰QÏž=µsçÎdõ1uêTÍ›7/Yç$U“&M ÇOœ8¡aÆ%«ÖÅ‹õÖ[oéÂ… V´–,'OžT§N�LiF‚‚‚Ô¾}{]¿~Ýpþ�7ÞP¡B…¬j1Ý©Q£†áxTT”zõêeºë®™={öèí·ßVHHˆÝýËÕÕUƒ6Ü5]’/^lW¿ÿ¤/¾øBß}÷]’Ï1 ­Mœ8Q—.]²»—ÿjР�J—.m8wêÔ)½ÿþûÉú~GDD¨wïÞ¦;çÈ‘CíÛ··§ÕtÏ××W•+WN0¦¤BG©çÖ­[¦!~�;Vžžž­ãëë«1cÆÈÃÃ#Á\TT”z÷îmú>,½{Øîí>>>š1c†žzê©îÌ–›››Zµje:¿~ýzõíÛW‘‘‘É®½téRÓWHR¹råôì³Ï&»îƒÌ>@ô¿ÿýÏáÚë�% ú_dA“�,(YP3dAÿEôdAÉ‚Jÿæ4ÃÃÃ̹¹¹iÔ¨Qòóó{hwww�3FY³fM0¯¾}û:eñî´ >>^ýû÷×ï¿ÿn8ïææ¦Ñ£G«V­Z)ÜYBíÚµ3�;xð ºtéb×BÛþù§zôèaºPn¾|ùôòË/'»îƒ¶oßnx�Zµj.Þ H9ü_�ˆcÇŽiРA1b„êÔ©£_|QÕªU3 ˜‰��ÕöíÛ5cÆ mÙ²%Ñc{ôè!GÛVÞ¼yuåÊ•û�GŒ¡�;wjðàÁÊ�;·éywîÜш#ôã�?šÓ¬Y3=ýôÓÉî©W¯^Ú¹s§öïߟ`.44TÝ»wW�5Ô¾}ûdï,zþüy­Y³F¿ýö›öï߯øøød÷'IŸþ¹:d"¼víšZ·n­_|QíÛ·W™2e’U;00P¿ýö›Ö¬Y£ÀÀ@»ú«X±¢5j¤eË–%˜ WëÖ­Õ¾}{uîÜYÞÞÞ¦u._¾¬�&ØÉ6_¾|º|ù²]½=¨aÆ5j”¢¢¢Ì-\¸PaaaêÛ·¯²eËfZ#**Jß~û­¦L™b$Ë�;·®^½jIŸFråÊ¥àààû¡�]»v©aÆ:t¨i0Qú'T³bÅ 2Ä4�’3gNuïÞÝ)}§ùòåSÅŠ ÃÒPóæÍ5lذ‡>ÇnÞ¼©I“&é»ï¾SLLŒM}«îãŠ+ê�wÞÑìÙ³ ç׬Y£�;wª[·nzíµ×’´aLLŒ¶lÙ¢+Vè×_Udd¤úõë—äžêÖ­k\¿té’4h —_~Y*TP¡B…äããc2*V¬˜áBˆÒ?ÁÖÏ>ûL-Z´Pttt‚ù}ûö©Aƒùä�>}Úô˜O>ù$I¡½ŒªaƆAÿßÿÝÒÝ ÏŸ?ïð—7nÜHòï°‚ ÊÇÇ'ɵû÷ïoP4h�Š-šäZeË–U¯^½4räÈs'OžÔСCõÅ_$¹Þ%õëOì .\PöìÙ“T§dÉ’I:NúçC ‰½×ìÑ£‡²dÉb÷û3*V¬X²Îiݺµ¾ûî;]¼xÑpþ—_~ÑÑ£GÕ§OŸ$…QÏœ9£É“'¾GºÇÅÅE}ûöMVŸfÌ´ 6´¤>ÀZdA" J4)È‚’5C”,èƒÈ‚¦L4­=z´:d8×¹sgU¨P!ɵ ( !C†¨G� ænܸ¡�?þX³gÏ6]È71§OŸ6|^<(±ßSAAAI~/�ØsõAÇ×Ï?ÿl:ß®];/^Üò,¨”¼Ìª$½üòËš7ožöîÝk8¿yóf5iÒD}úôÑK/½$77·DëiÖ¬YZ¸p¡âââL�ûðÓüýL YPH»\âíý HÓ.\¨!C†$zŒ›››žxâ •.]Z�=ö˜ ( eÊ”Iqqq Õ�;wtêÔ);vLÛ¶mKÒn¡uëÖÕ”)S’4èÛ·¯áñ  Ù³g'X0ËÝÝ]Ï=÷œêÔ©£|ùò)GŽ Ñ•+W´yófýñÇŠˆˆ0½^‘"E´dÉùúú&¹Çÿºqã†Z´h¡³gÏ&z\¾|ùT¡B=óÌ3Ê“'�üüüäëë{ÿ{{ûöm�={V‡ÖáÇdX§Y³fÉ^ÈëôéÓjÑ¢…nÞ¼™èqE‹U… T®\9åÌ™S~~~Ê”)“BCCuûömݾ}['OžÔ‘#GtøðaÖéÑ£‡:wîœäþîܹ£Æ�›.Œ%ý³+ð‹/¾¨Ê•++Ož<Ê’%‹nܸ¡ .è�?þÐÖ­[ì}Ô¡C‡d׬[·n¢¯õVKÊsõž”îí¿ìy}=uꔚ5k¦°°°D�ËŸ?¿jÔ¨¡gŸ}öþû¨¨(…„„èĉÚ¾}»¶nÝj¸¸ø5hÐ@cÆŒIvŸŠ��UµjÕ¼–ûûûëÏ?ÿ4]`�2ø¿2a±±±:tè�éN£ö¨Q£†ÆŽk×n¢F|||4nÜ8µnÝZ‘‘‘÷Çcbb´~ýz­_¿>Ù5ýüü4mÚ4»ƒ�’”#G-X°@íÛ·OtÑË—/kùòå†;;[±bÅ´hÑ"½óÎ;ºråŠéqgΜљ3g´xñâìNÊ’%‹¦OŸ®-ZèÎ�;†Ç„††jÉ’%Z²dI’jzyyiüøñ:qâ„•­ªC‡úõ×_uüøqÃù[·niñâÅIþz{{kâĉIÚ=×Q½zõÒž={ì.{òäI}õÕWvÕüàƒÒL°3µU¨PAo¼ñ†~øáÓcvìØa¸Ó{búô飪U«:Úž 777Mœ8Q]ºtÑŸþiz\xx¸~ÿýwÓ�}­âéé©~ýúœ­ÖªU+]¹rE³fÍ2=æüùóš6mš]õ_xá 8ÐÞö2 ___=ÿüóZ±b…ÍøÙ³guôèQ=ñÄ©ÔYÊ8vì˜FŒa8W¤H 4È®º...9r¤7nlø!›�ªlÙ²INÂz*TÐ_|¡~ýú%ºHç©S§têÔ)‡Ä 4P�=ì>ÿ¿Ö­[—àC2Ò?‹ÒÒ² dA%² IAÔYБµYÐŒçQÏ‚©oß¾†‹|fË–M£G�¶k‘OIúä“O´k×.Ãßo_}õ•ªT©¢²eËÚUŽ+^¼¸&Nœ¨N�:Ù¼_}Ð¥K—ôÃ?$ú;ãa*UªôÐ…‹“jûöí ù”¤W^y…E> °ï_àâ⢶mÛjúôéÊ”)“¥µË•+§1cÆÈÃÃÃáZþþþš7ožŠ/îp­üðCõéÓÇîp�™7ÞxCãÆ�#õÿÞ|óMÃñU«V¥p')ëîÝ»êÕ«—a°ÏÃÃCcÆŒqøC%#FŒ0üðÌ�;wÔ§OÅÄÄØ]Ž{õÕW5eÊùûû;¥¾›››:uꤑ#GÊÍÍÍ’šFÏK///5nÜØ’ú€ô‡,hÚDÔdAÿE4!² ö# šñ<ªYи¸8}øá‡ºyó¦áü—_~©}º¶mÛf8ײeKýïÿsø%K–T¿~ý çΟ?¯�:| 8¦|ùòúå—_ôÚk¯ÉÅÅŲº¹råÒäÉ“5dÈËù ×Ê•+ŒW­ZÕ²ÅÁŽa[2(OOOÕ©SGuêÔQll¬vîÜ©¿ÿþ[;wîÔ�t÷î]‡êûûû«nݺjÖ¬™Ê—/oQ׉«R¥ŠV®\©)S¦è‡~Pxxx’ÎËŸ?¿:vì¨×_ÝòÝ{ïyþùçU»vm­Y³Fß}÷�vîÜ©¸¸8»jåÏŸ_ÕªUSíÚµU«V-yzz:ÜŸ‹‹‹^ýu5lØP¿üò‹¾ÿþ{:tÈîzÅŠSµjÕT·n]U«VÍáïk¡B…ôã�?ê»ï¾ÓŒ3tåÊ•$�çãã£æÍ›«sçÎÊ’%‹C=$EþüùõË/¿háÂ…š:uªnß¾�¤ó²e˦V­Zé½÷Þ3Ü�7%øùùiæÌ™Z¶l™¦N�ªS§N%é>>jÚ´©:uêä”¶™Zµj©ZµjZ¾|¹.\h×k‚›››Ê–-«F�©qãÆÊœ9³]½T©REßÿ½Nž<©?ÿüSÐéÓ§uõêUݹsGQQQv¿¦]kåÊ•Z¼x±æÏŸ¯Ó§O'ëüܹs«yóæjݺuмî¤GmÚ´ÑÇl3víÚ5mذÁ©!üÔ²jÕ*ýøã�†sÏ=÷œCÐxPÏž=µ}ûvÃט™3gªjÕªªV­še×CòåÌ™SS§NÕÑ£GõÍ7ßhùòåI~Ïú ªU«ªeË–ª[·®åïa/^løºÚºukK¯p YБ% j² dAÍ�% Š¥‡,h“&MT©R¥ãö¼fìÞ½[“&M2œ{üñÇ|/Ñ¢E mÙ²E¿ýö[‚¹•+WªZµjjÖ¬™e×CòùúúêË/¿TÇŽõí·ßjÉ’% ±«V™2eÔ²eKÕ¯_ß’÷ƒÿµjÕ*………%oÓ¦�¥×ØÏ%>>>>µ›)+::ZGŽÑñãÇuæÌ�9sF.\Э[·¦°°0ÅÆÆÊÃÃC>>>ò÷÷WîܹU¸pa•,YRåÊ•S©R¥, JöíÛW?ÿüs‚ñaÆ©iÓ¦ Æïܹ£ 6hË–-:vì˜.^¼xÿÔ¾¾¾*\¸°žzê)ÕªUK5jÔ�›››e½&Åõë×µeËíß¿_Ç�×¥K—tóæMEDD(>>^™3gVæÌ™•%K.\X*^¼¸Ê–-«bÅŠ¥H�/^Ô–-[tàÀ�:uJ—.]RHHˆ"##åââr¿G???)RD Pùòå•/_>§õ£?ÿüS7nÔÁƒuþüy›Ÿmþüùõøã�«zõêªU«Vª…«îÞ½«­[·jãÆ�:tè�‚ƒƒ¬˜˜ùúúª@�zòÉ'õÜsÏ©fÍš–íºjdÛ¶m† sUªTI ,H0¯]»viÆ :xð NŸ>­Û·o+22RÞÞÞÊ“'�J”(¡jÕªéÅ_”¿¿¿ÓzϨöíÛ§Í›7kçÎ�÷__CCCåååuÿ5ªD‰ªZµªªW¯.___Ã:‘‘‘†ãÎ Ÿ={V›7oÖ¾}ûtúôi]¾|Y¡¡¡÷ï‹Ì™3+kÖ¬*Z´¨TªT)U«VM~~~–÷’’<¨-[¶hß¾}:{ö¬‚‚‚t÷î]ÅÇÇËÛÛ[9sæ¼ÿ;¥J•*ªX±¢Ó>(�QDEE©nݺºvíšÍxíÚµ5}úôTê HwïÞÕ�´oß>íß¿_/^ÔíÛ·uçÎ…††ÊÓÓSY³fUÖ¬Y•#G•.]ZåÊ•S¹råœö¡Š¸¸8Õ©S'Á‡iªV­ª¹sç:åšë‘u>² ö# š|dAÓ² éYPë‘þ¥Ã‡ßÏ‚ž={V·oßÖíÛ·*wwweÉ’E~~~Êž=»žxâ‰ûYPg.VݼysíÙ³Çf¬hÑ¢Z½z5¯q�F°Ð'H’îð¯ä†;ÀÙæÎ�«aÆٌ¹ººjõêÕ*Z´hê4@’´zõjõìÙ3Áø‚ T©R¥”o�a�ìG@ZCH»öï߯×_=ÁøðáÃÕ¤I“Tè`„m€¥Z´h¡€å^ýu*TÈf,**JóæÍK¥Žíà^»vm•+W.囤idA�´gΜ9Š‹‹³+Y²¤^~ùåTê`†…>€å<<<ôñÇ'_´h‘®_¿ž �¶;vhóæÍ6cfÏSÈ‚i˹sç´dÉ’ãŸ|ò‰\]Y>ÒþO 8Å /¼ êÕ«ÛŒ…‡‡kòäÉ©Ôðè3fL‚±V­Z©xñâ©Ð = ¤ãÇ�Wtt´ÍX½zõTµjÕTê�úNÓ¿yxxØŒýøã�:wî\*u °Ð'`ú,ÀBŸ€Xè°€{j78C\\œ"##mÆÜÜÜäââ’JÒ‹øøxÅÆÆÚŒyyyÉÕ•ýÕ�”@`¯´�e¡OdH‘‘‘:|øpj·È J•*¥L™2¥vÀ#�(ÀJ)�ekyÀ,ô X€…> ¸§v€3¸¹¹%+Uª”Üݹå¤? ¼ÿ¸dÉ’òööNÅŽm¼?H[x�öð @F£Ã‡ÛŒåÒ89P ÿ��öð máý@ÚÂû3AZÈ�’vC†äââ’`ÌÝÝ]©Ð 8&&&Ææ1¯g©‹÷gi ïÏÒÞ£ȨŒriœƒ(€Œ„ÿGH{x��¶ðþ máý€Œ*¥s ®)z5 ƒb¡OÀ,ô X€…> °Ð'`ú,ÀBŸ€Xè° }`¡OÀ,ô X€…> °Ð'`ú,ÀBŸ€Xè° }`¡OÀ,ô X€…> ¸§vdQQQ:{ö¬.]º¤+W®(44T‘‘‘òññ‘¯¯¯ ,¨§žzJ¾¾¾©Ýª�“'OêСCºv횢¢¢”9sf.\XåÊ•S¶lÙR»=�†„††êàÁƒºpá‚îܹ£ˆˆùúúÊÏÏO%K–T‰%äææ–Úm"�ã>é }`§+W®hÓ¦MÚ½{·<¨Ó§O+&&&Ñs\\\ôÔSOéµ×^SãÆ�åãã“BÝÚŠŽŽÖ·ß~« èܹs†Ç¸¹¹©zõêzÿý÷U¡B…íæÍ›:xð 8 ýû÷ëàÁƒºvíšÍ1]»vU·nÝR©ÃÅÆÆjÕªUúþûïµk×.ÅÅÅ™›)S&½øâ‹zë­·T®\¹”k†¸ÏR }`§%K–h„ É:'>>^Ð�4cÆ ýôÓjÛ¶­J—.-???]¾|Yk×®ÕÂ… rÿ¸uëÖiìØ±úè£�œÚ'H}·nÝR‡,¾˜+W.µhÑB5jÔPÁ‚ååå¥[·néÈ‘#Zµj•V¯^­¸¸¸ûÇïÝ»WÔØ±cSúK@:À}2"úÀNÅŠÓG}¤^xA… 6=Î××WyòäQÕªUÕ¡C�9R‹-²9fðàÁZ³f�<<<œÖï¤I“tîÜ9›±¶mÛªoß¾rqq¹?–-[6=ùä“zýõ×Õ¾}{?~üþÜœ9sÔ¨Q#=ñÄNë€G…���žzê)=õÔS*S¦Œzõê•Ú-Ý7qâDÛŒU¯^]ãÇ�WÖ¬YmÆ}}}U @=ÿüójÞ¼¹:uê¤ÐÐÐûó+W®Ô[o½¥ *¤Hï°Å}�²Xè;½üòËÉ>ÇÛÛ[THHˆV®\yüâŋڲe‹jÕªee‹÷é›o¾±{þùçÕ¯_?ÓsòæÍ«™3gê•W^QXX˜$)>>^&LÐÔ©S�Ò'YÙ²eU¦L™ûÿ/^\®®®÷çÓÊŒ±±±Z¾|¹ÍX¾|ù4qâDeΜ9Ñs+Uª¤áÇ«k×®6ãË—/gÆÂ}Æ}R—ëÃV3úÀÄæÍ›�v½Y³f)22òþcooo 4è¡çåË—OÝ»w·ûã�?tôèÑd÷°fÍ]¾|9Ù癹{÷®¾ÿþ{Ëêàl?þø£¨&Mšè±Ç³Y|1-9|ø°BBBlÆZ¶lùÐÅïyá…`3¶}ûöd÷AÖÀ>ÜgÉÃ}¬–6Ódp… R¡B…lÆ®\¹â”kÅÇÇë×_µ{饗”;wî$�߬Y3ùøøØŒ­^½:Y=¬^½Z½zõR›6m”¬s�DDDèý÷ß×À�5nÜ8‡ë€ým¿bŊɪQ¡B›ÇW¯^MÖùd 2>î3�Q±Ð'©$gΜ6�ÃÃÃ�r�$ø믾šäó}}}õüóÏÛŒýñÇI>ݺuúðë³gϪuëÖ}0"""B;vÔ¶mÛ$IÓ¦MÓ¤I“ì®lݽ{7Á˜ŸŸ_²jdÏžÝæqttt’Ï%kðhà> }�Jnß¾móØßßß)×Ù´i“Íc=óÌ3ɪQ©R%›Ç���ºtéR’ν~ýºbbbî?>sæŒÚ´i£k×®%«IŠŒŒT—.]´uëV›ñË—/'»0f”ax0çð0!!!6�Ü51d  Üg £b¡ORApp°NŸ>m3öôÓO;åZ���6�K—.-//¯dÕ0ZôÁºfÞ|óM 0ÀfìôéÓjÓ¦�®_¿žä¢¢¢Ô¥KmÞ¼Ùf¼iÓ¦:th’ë€Ä•.]Z...6c»víJV�Ý»wÛû¬† fwd 26î3�¹§vd$ï¾û®6oÞœ¤c³e˦îÝ»ëí·ßvZ?ááá Æ|}}íªõàyFµ“âý÷ßWLLŒ¾úê«ûcÇŽS»ví4wî\eË–M’£^½ziݺu6ç¿øâ‹3f ˆÀÉÞ~ûmeÏž]Ÿ}ö™BBB$I—.]ÒÈ‘#zn¦L™Ô¦MuéÒEžžžõAÖ cã>�kj7À£&S¦LêÝ»·þøã§.ò)/ÆéíímW­ϳw¡OIêÒ¥‹:wîl3väȵk×N·nÝRLLŒz÷î­ßÿÝæ˜ºuëjìØ±rwgïRBýúõµvíZ}ðÁ xèñ...zë­·ôǨW¯^/¾xYƒŒ�û d$$HawïÞÕ¸qã´eËuîÜY•+WvÚµŒãôòò²«Öƒç9²Ð§$õèÑC±±±š>}úý±Ã‡«]»v*X° Ö¬Ycs|íÚµ5aÂyxx8t]�<ûöíÓŽ;tþüù‡¯o¾ùF»víR§N�ôòË/[ÖYƒŒ�û d,ô €…êׯ¯'Ÿ|òþ㘘ݾ}[§OŸÖáÇ!éŸüý÷ßÚ¶m›Ú´i£¾}ûÊÅÅ%µÚN5½{÷Vtt´æÌ™sìСC:tè�ÍqÏ=÷œ&Nœ(OOÏ”n€GVpp°úõë§ 6ØŒgΜYÏ<óŒ ( L™2éÖ­[:r䈎;¦¸¸8IÒ±cÇÔ³gO­^½Z#GŽ”···%=‘5Èx¸Ï@FÃBŸXèµ×^3� ײeË4aÂKúgÁϹsç*::Z´¼Ÿc‘‘‘vÕzð<£Úöøøã�«yóæÎW«VM“'O椠7n¨U«V:yòäý1õéÓG¯¿þº¼¼¼œsîÜ9�7N«V­º?¶fÍ………iÆŒrss³¤7²÷Ȉ\S»>>>jÞ¼¹V®\©'Ÿ|ÒfnÑ¢Eúã�?œrÍEDDØUëÁó¬ZèSúçƒÅŠK0îíí­‘#G~h8ÏG}d³ø¢ŸŸŸ~øáµlÙÒôïø… Ö¸qãÔ½{w›ñÍ›7köìÙ–öGÖ cà> }¦cQQQ:zô¨Ö­[§o¾ùF3gÎÔÔ©Sµ`Á-_¾\���Š��Mí6uüøq-]ºT3fÌдiÓôÝwßi×®]Љ‰IíÖ UøûûkÖ¬YÊš5«Íø¤I“,¿–Ñbœ¡¡¡vÕzð<«úŒ��×§Ÿ~ªÓ§O'˜‹ˆˆP·nÝìî$߯�µyóf›±!C†¨D‰I:¿K—.ªY³¦ÍØŒ3fId 2î3�Q¹§vHž_ýU[¶lÑž={têÔ©‡.–™%K½òÊ+jݺµR¨Ë-?ýô“fΜ©3gΓ-[6µhÑB:t°lqH/ræÌ©6mÚhâĉ÷Ç:¤Ó§O«X±b–]'{öìòððPttôý±+W®ØUëÁórçÎíPoÒ?ÿÿ8`À-Y²Äô˜={öè½÷ÞÓ¬Y³”9sf‡¯ ÷ý÷ßÛ<.^¼¸êÕ«—¬�:uÒ¦M›î?¾sçŽÖ®]«Æ�;ÔYƒŒƒû dT®©Ý’çË/¿Ô÷߯ÀÀÀ‡.ò)ýRùî»ïÔ¸qcMœ8QñññNïñöíÛz÷ÝwÕ¿ÓE>%)$$DS§NU£F�tüøq§÷iÍÿþ÷¿cûöí³ônnn*R¤ˆÍØ¥K—’]'66VW¯^µstC‰øøx 4H?þø£ÍxÕªUÕ¢E ›±Ý»w«C‡ wèš qñññÚ¹s§ÍØsÏ=—ì:åÊ•SÖ¬YmÆöìÙãpod 2î3�‘±Ðgàå奢E‹ªL™2*]º´ ( ›c¢££5iÒ$õïßß©½DDDèÝwßÕ_ýe3îáá¡¢E‹ªdÉ’òññ±™;þ¼Z·n­³gÏ:µ7Hk *”`ìúõë–_çÁ9O�:•ìgÏžM°áDñâÅêëóÏ?×÷ßo3V¥JM›6Mƒ RóæÍmævîÜ©÷ß_wïÞuèºÀÜ�;wtëÖ-›±‚ &»Ž«««òçÏo3äPod 2î3�‘±Ðg:”;wn½ñÆ9r¤~ÿýwíÝ»WkÖ¬ÑâÅ‹µdÉýñÇÚ¶m›† ¢¼yóÚœûÓO?é§Ÿ~rZoÆ Óþýûï?vuuUçÎ�õ×_iÍš5Z¾|¹¶mÛ¦aÆÉÏÏïþqÁÁÁêÙ³§bcc�Ö¤5îîî ÆܸÁ %K–´y|èÐ!EFF&«Æ®]»Z79†ªo¾ùÆf¬R¥Jš6mš¼½½åââ¢Áƒë�7Þ°9fûöízÿý÷a÷µ€9£Å ½½½íª•)S&›ÇQQQvÕ‘Èd4Üg #c¡Ïtfƌڴi“† ¢Æ�«páÂruMøcôóóÓo¼¡eË–©téÒ6sãÆ�S\\œå½�ÿüs½öÚk6ÇnÛ¶M�:uJöb¥àáþ›ý¾çæÍ›vÕ ¶yœ-[6»ê�5Èx¸Ï@FÆBŸéÌO€ {²µjÕ²y¡/¿ü2É×<þ¼¦OŸn3æíí­Ê•+'¹Yƒô…ûŒû ü‹…>‘‘‘6�³dÉbiý�7Ú<®Q£F’Ï­V­šÍãõë×[Ò8Ó?ü F�iåÊ•ŠˆˆHòy7oÞTß¾}|È K–,êÞ½»ÕmÞ—'O½õÖ[6ck֬ш#L,½råŠÞ{ï=…††ÞsqqQ�=’uíéÓ§kÚ´i6ceÊ”ÑìÙ³“ô�ˆ{\]]5bĽòÊ+6ã6lPÏž=“Õ0×´iSùûûÛŒ­\¹R xèÂ…ÇŽÓ;ï¼£��›ñ–-[&9'@ÖàÑÀ}2*÷Ônί،=õÔS–^ãÈ‘#6�Ë—/ŸäsŸzê)yzzÞâ\½zUÁÁÁ ;�ÖªwïÞòññQíÚµõôÓOëÉ'ŸT¾|ùäëë+ooo………éÆ�:zô¨þúë/­]»Vááá6u\]]õùçŸ+gΜNí·k×®Z»v­ÎŸ?lΜ9Ú½{·Ú¶m«§žzJY³fÕåË—µvíZ-\¸P7oÞ´©Ñ®];=ñÄɺnÅŠåããsÿë.]º´æÌ™c×&nnn9r¤bccõ믿JúgñÑÚµk'»)íàÁƒ÷ÿÞ�[¶lQdd¤á\Ö¬YÕ¡C«Z³‘9sf}øá‡êׯŸÍø?ü ?ÿüS-Z´PÕªUU @y{{ëÖ­[:|ø°~ÿýw­\¹RÑÑÑ6ç(P Y½’5p ÷YÒpŸga¡ÏGÀâÅ‹uõêÕû�‹/®²eËZV?::ZçÎ�³ Hòùžžž*\¸°Nœ8qìäÉ“,ô ÝתU«´jÕªdŸëáá¡¡C‡ª~ýúNèÌ–¯¯¯¦N�ª–-[*$$äþøÞ½{Õ³gχž_·n]õéÓ'Ù×}æ™g4eʽÿþû Ð×_­¬Y³&»Î=îîî3fŒâââôÛo¿éÓO?Õo¼aw=RJ`` fΜ™äãwïÞ­Ý»wÎ%wQÃäjÚ´©Îž=«iÓ¦ÙŒ_¾|YcÇŽMr�ìÙ³kæÌ™òóóKò9d Ã}–4ÜgÀYXè3ƒûùçŸõÙgŸÝìêêª�ÊÅÅŲkœ?^111÷{{{'{‘μyóÚ,ôyúôiU¬XѲÀjVüUùòå5dÈ•(QÂ‚Ž’¦D‰úöÛoÕ½{w?~<Éç½õÖ[úä“Oäînß?%T­ZU3gÎTÉ’%“õ� 3îîî;v¬6mÚ¤ÿýï× õêÕKÅ‹×�!CtçÎ�dŸ_¹re�9RyóæMö¹d Üg £a¡ÏtîôéÓº|ùòýÇÑÑѺ}û¶Ž?®uëÖÙ,žéáá¡!C†¨jÕª–öló8Ož<É®ñà97nÜp¨'p¶÷ß_Ï>û¬6mÚ¤�;wêÈ‘#ŠŽŽ~èy9räP­ZµôÚk¯©B… )ÐiBÅ‹×Ï?ÿ¬o¾ùF ,Ðùóç �suuUõêÕÕ±cGKz­\¹²Ã5þËÃÃDàd�7ÖsÏ=§Å‹kÉ’%:}út¢Ç{yy©Zµjzë­·ôÜsÏ9´™*YƒG÷ÈHXè3�ûæ›o4þüD�qqqÑsÏ=§>}úè‰'ž°¼‡°°0›Ç™2eJv ›Çáááõd$""B111–×g‹ˆˆHô1H=åÊ•S¹rå$ý³ñ™3gtñâE]½zUaaaЉ‰‘···²dÉ"=þøã6ܽ{7Ù×Ü»wo‚1{êHÒo¼¡7ÞxC'NœÐ±cÇtõêUÅÄÄÈÇÇG… RÙ²e•-[6‡®‘ñþ máý@ÚÃ{4Y3€³4mÚTM›6MÑk;vÌáþþþêСƒ:tè àà`8p@W¯^ÕíÛ·%___eÍšUÅŠÓ“O>) :‡½¸ÏR }>^zé%µjÕÊ)‹|J åôòòJv�ÏqÆBŸ���–×RÛ�7táÂ]¿~ýþ¢»™3g–ŸŸŸ”={öTîÐÖÝ»w¨›7oêöíÛ’¤,Y²¨@� �››[*w˜>œ:u*µ[‰È�;·rçÎm8wãÆ Ý¸q#…;JšbÅŠ©X±b6c—.]Ò¥K—R©£ôƒ÷gi ïÏÒÞ£‹¿¿¿jÕª•Úm ƒã>é }>V¯^­Õ«W«B… úòË/U¤HKëGFFÚ<¶gW\OOO›ÇõdT·nÝÒ®]»tðàA>|øþb™frçέڵk«nݺʚ5k u™Ð¾}û´|ùr;vL±±±†Çøøø¨F�jÔ¨‘üýýS¸Cp }¦sýû÷Wÿþýï?ŽˆˆPHHˆŽ=ªßÿ]+V¬¸¿hæÎ�;Õ¬Y3Í™3GeÊ”±¬///›ÇÑÑÑÉ®•hMàQwêÔ)}óÍ7:räˆâãã“|ÞÕ«WõÃ?hùòåjÕª•j×®í¼& ܾ}[“'OÖ�zlxx¸~ûí7mÚ´ImÚ´ané }f0ÞÞÞÊ›7¯òæÍ«Úµk«C‡êÑ£‡Ž9"éŸE÷ºté¢+V(kÖ¬–\ÓÇÇÇæqddd²kl÷ùwïÞÕŒ3tóæM›Å��éܹsúè£�táÂ…d�¡éÓ§ËËËKï¼óŽ“ºK_"""têÔ©û�‹/.ooïTìàÑÆû3€´…÷giïÑd111 Lí6�±êaW¤HÍ™3GM›6ÕåË—%IAAAš={¶zõêeÉ52gÎlóøîݻɮnóØ }z{{ËÃÃÃòº@J0ºw‹)¢jÕª©R¥J PŽ9äåå¥k×®iÏž=úᇴwï^›s~üñGåÎ�[Ý»wwj¿áááêÓ§O‚E>óäÉ£6mÚ¨zõêÊ—/Ÿ¢¢¢töìYýþûïúöÛomýýꫯ —^zÉ©½¦GÞÞÞÊ”)Sj·€ÿÇû3€´…÷gàÿØ»Ó0­ëzàŸY††\" ¢iL܈4w/Ç­�-5éäV© V¢#Ä%Ìs´Ž¢�žÌD-ÍJÓ´DÔ@T D’MYf€ÙþúwŸn�~3÷,¯×uñàû¹¿Ë›T¼Œïhz|Gš£ŠŠŠLG ™RôÙ ”””Ä¥—^×^{mj6}úôÄŠ>KJJÒÖ«V­ªó?Ó©S§=Ê-UnnnœvÚiqþùçÇ Aƒv¸§]»vÑ£G�8÷Üsãᇎ›nº)í?<¸çž{âÔSO�ƒ>¸ÁrN˜0!þö·¿¥Í>ûÙÏÆ­·ÞZ«¸K—.1pàÀøÒ—¾_ÿú×ÓÊAo¸á†8öØc£¨¨¨Á²$%;Óh'�tRdee¥Ö«W¯ŽåË—'rw·nÝ"7÷ÿ:c·nÝëÖ­«Ó+W®L[÷èÑ#‘lÐRdggÇgœ¿ýíoã–[nÙiÉçÇ}á _ˆqãÆ¥Í*++ã®»îjˆ˜ñ�ž§OŸž6;ôÐCãÎ;ï¬Uòù¯<ðÀ¸ÿþû£°°05[¿~}Ü{ï½ – IŠ>[‰öíÛG‡Òfk×®Mäî¼¼¼èÖ­[ÚlÑ¢E»}~ûöí±téÒ´™¢OHwÞyçÅ­·ÞÝ»w¯óÙsÏ=·V1è‹/¾Û·oO*^šÿýßÿ�ŠŠŠ´Ù¸qã"//ïÏvëÖ-¾ùÍo¦Íî¿ÿþØ´iS�s¼üòË1þü:ŸÛ™ªªªxðÁ£ªª*±;€–EÑg+–›››Ø]‡rHÚú�7ÞØí³óæÍK+ìÒ¥KtêÔ)±lÐäääìÑù³Ï>;m½eË–X°`Áݹ3/½ôRÚú°Ã‹C=t·ÏŸþù‘ŸŸŸZ—••ÅóÏ?_§ ³gÏŽÑ£GÇÈ‘#cáÂ…u:»#ÕÕÕqõÕWÇ�7ÞcÇŽ�êêê=¾hy’kz¤IÛ¼yslܸ1mÖ¹sçÄî2dHüö·¿M­_z饸Æ7¾±[gg̘‘¶:thb¹€èÛ·o­Ùš5k§¬¬,Þyç�´ÙàÁƒëtGqqqôë×/þú׿¦fÏ>ûlœuÖY»u~Μ9qñÅGyyy”——Lj#bêÔ©Ñ«W¯:åø§êêê3fL<ùä“ñÄODnnnüçþgdeeÕëN áe÷7™Ž@+0ëKÿ–é$ÀÏÐÞÝÿ܈ˆøàÏB‹vÐÛ3ˆˆìL q¼ð QSS“Z—””D—.]»ÿ„NˆÜÜÿë��9sf,]ºôÏÕÔÔÄôéÓÓfŸûÜçËüCAAA­Yyyyâï¬]»6ªªªÒf|p�ïéÝ»wÚúÏþsTVVîÖÙõë×Çöíÿ÷j~øa ><Þ}÷Ý:種®Žk¯½6žx≴ùš5k¢¢¢¢Î÷-›¢ÏV`ëÖ­1yòä´Ù�!C";;¹¿üÅÅÅi�555qç�w~â¹_ýêW±|ùòÔºk×®qôÑG'– ø‡+VÔš•””$þΆ jÍÚ·o_ç{>~¦¬¬,ÞÿýÝ:;dÈ�¸ãŽ;"///5[»vm ></^¼Ûjjjâúë¯�Ç{,m~ì±ÇÆ]wÝùùù»}Ð:(úlF&Nœsçέә 6ÄèÑ£cÉ’%©YNNNŒ1b—ç†}úôIýš>}ú'¾uÙe—¥•‡>ñÄñä“Oîtÿ¢E‹bâĉi³Ñ£G+σ0kÖ¬Z³8 ñwjjjjͲ²²ê|ÏŽÎÔ¥¤óÄOŒI“&Ennnj¶fÍš>|xÚŸ‡;SSSßÿþ÷ãÑGM›æ3ŸQò 씢Ïf䥗^ŠóÏ??Î?ÿü˜2eJ¼óÎ;QQQQk_MMM¼ûî»q×]wÅ)§œ3fÌHû|øðáѧOŸÄóõêÕ+Î?ÿü´ÙUW]?þñ�cãÆ�©YEEELŸ>=¾üå/ÇG}”š÷éÓ'JKKÏ­]UUUüú׿N›õìÙ3ºvíšø[íÛ·¯5û×Îw׎Î,Z´¨NwœrÊ)1qâÄÈÉÉIÍV¯^Æ ‹÷ß§çjjjâ?øAüò—¿L›4(î¾ûî(((¨S õÈÍtênîܹ1wî܈ˆÈËË‹}öÙ'Ú·oyyy±eË–X¹relÙ²e‡gKKK㪫®j°lcÇŽ�·Þz+æÍ›ÕÕÕñ_ÿõ_ñ³Ÿý,ößÿÈÏÏ�¥K—FYYYÚ¹Ž;Æ�üãÈÍõ·$$í‘G‰•+W¦ÍN;í´y«sçεfûÛßê|ÏÂ… kÍV­ZUç{N?ýô¨ªªŠk®¹&ª««S÷ 6,¦M›ݺu«uæÆoŒ‡~8m6pàÀ¸çž{¢M›6uδÙ™Àž©¨¨ˆeË–ÅÛo¿sæÌ‰E‹í°ä³¨¨(~ðƒÄøÃÈÎn¸¿ìmÚ´‰{ï½7>ó™ÏÔÊùÞ{ïÅ‚ j•|víÚ5xà�8è ƒ,´V|ðALš4)mÖ¡C‡øêW¿Ú ïµk×®Ö?˯¼òJ�îØ´iS¼ýöÛµæÿ³cw�uÖYqóÍ7GVVVj¶råÊ6lX,[¶,mïøñã㡇J›qÄñÓŸþ4 ëõ>Ðz(úlFn»í¶øîw¿ƒŽ¢¢¢OÜŸ••}úô‰«¯¾:žyæ™øò—¿œVt×PŠ‹‹cÊ”)qÓM7E÷îÝw¹ï’K.‰ßüæ7ѧOŸÏ­Meee|ç;߉M›6¥Í¯¼òÊ(..n°w ”¶~ã�7bÁ‚»}þÑG�mÛ¶Õš×·è3"¢´´4nºé¦´?W¬XÆ ‹åË—GDÄÍ7ßÓ¦MK;wøá‡ÇÿüÏÿDÛ¶mëý6Ðzäf:»¯gϞѳgϸ袋¢ºº:–,Yï¿ÿ~¬X±"6oÞ•••ѶmÛh×®]tíÚ5ú÷ï¿[… ;òÜsÏíQÖììì¸à‚ â‚ .ˆ ÄÛo¿kÖ¬‰ªªª(..Žƒ>8?üðÈËËÛ£w€�»ùæ›cöìÙi³c�=6¾øÅ/6è»ç�w^<üðÃi³n¸!~þóŸGNNÎ.Ï~ðÁq×]wíð³=)úŒˆ8ÿü󣪪*n¸á†¨©©‰ˆˆå˗ǰaÃâ˜cŽ©•ùÐC�{ï½·ÞŽ­�¢Ïf*;;;zôè=zôÈt”OÔ§OŸèÓ§O¦c@«2mÚ´xðÁÓfûî»oÜrË-‘••Õ ovØaqÔQGÅ«¯¾šš½þúëñ�ï|'~ô£Å^{íµÃs+V¬ˆQ£FÅG}Ô`Ù¾øÅ/FeeeÜtÓM©Ù²eËj•|öë×/î»ï¾h×®]ƒeZžìL YO=õTÜ|óÍi³víÚÅ=÷Ü%%%�’aüøñQTT”6{úé§ã´ÓN‹|0þþ÷¿Ç¶mÛbóæÍ1oÞ¼¸ýöÛãôÓO�÷Þ{/""Ú´imÚ´I;ß¾}ûD²}õ«_�±cÇîôó¾}ûÆ”)S¢C‡‰¼´¹™@r^|ñŸæšk¢ºº:5+((ˆ»ï¾;úöíÛh98à€˜4iR\~ùå±mÛ¶Ô|Ù²eqã�7îòlVVVÜrË-qýõ×GyyyjÞ®]»Äò�1"^xá…˜1cF­·'L˜ÅÅʼn½´Ù™@2fÏž—]vYTTT¤fyyyñãÿ8Øèy>ûÙÏÆ<]ºtÙí3EEE1qâÄ8餓bË–-iŸuèÐ!±l“'O®UòQSSW\qE¬Zµ*±·€ÖCÑ'@ 0oÞ¼øÆ7¾ååå©YvvvüèG?Š!C†d,×GøÃâÊ+¯ŒýöÛo§ûrrrâä“OŽ_ÿú×qÖYgEYYYZaiDDÏž=Ét×]wÅ]wݵÓÏ—,YÇ�5kÖ$òÐzäf:{æoû[|ýë_�Í›7§ÍÇ�§Ÿ~z†RýŸÂ¸ä’Kâ’K.‰E‹żyóbݺu±qãÆ(,,Œ<0 ;vL�Y´hQ­{ °ÇYî¹çž˜qâ‰'¦•¾÷Þ{1|øð˜:ujtîÜy�ßZEŸÍØßÿþ÷9rdlذ!m>f̘¸à‚ 2jzõê½zõúÄ} .L[E�=öèíŸýìgqÛm·¥Íz÷î÷ß”””DAAAÜzë­©ÏÞ}÷ÝTÙg§N�öèm uÈÎtêgåÊ•1räÈX³fMÚüÒK/�‘#Gf(U2^yå•´õÑGYYYõ¾oÊ”)1iÒ¤´ÙÁ<ð@”””DDÄÅ_W\qEÚžE‹ň#bݺuõ~h=}4Ck×®�#FÄòåËÓæ£F�Šo}ë[J•Œòòòøãÿ˜6;ï¼óê}ß<&LH›õìÙ3î¿ÿþTÉç?�=:.½ôÒ´ÙÂ… cĈ±~ýúzgZEŸÍ̆ bäÈ‘±dÉ’´ù¾ð…¸æšk2*A¿üå/£¬¬,µÞwß}ã¸ãŽ«×]?ÿùÏãæ›oN›tÐAñÀDçÎ�wxæ[ßúVüÇüGÚlÁ‚1räÈØ°aC½r­ƒ¢O€fdË–-qÑEÅÂ… Óæg�uVŒ7.C©’³fÍš¸óÎ;Óf]tQäääÔù®‡z(nºé¦´Ù�S§N�.]ºìòìe—]—\rIÚì�wÞ‰Q£FÅÆ�ëœh}4Û¶m‹K.¹$æÎ�›6ÿüç?&Lˆ¬¬¬Äß:thôéÓ'õkèС‰¿ñO}ôQ|ã߈M›6¥f‡~x|ùË_®ó]¿üå/ãÆoL›uïÞ=¦N�{ï½÷nÝqå•WÆÅ_œ6{ë­·bÔ¨QiþIÑ'@3PYY—_~yÌœ93m~üñÇÇ­·Þ999J¶c~øaüô§?�uëÖíÖþ¿þõ¯ñ•¯|%Þzë­Ô,???nºé¦Èήۿª~ýë_Ç÷¿ÿý¨©©IͺuëS§N�}öÙ§Nw}ç;߉Q£F¥ÍæÍ›£F�ŠíÛ·×é. åËÍt>Ù�wÞÏ?ÿ|Ú,777ºwï“'O®×�ýû÷�SO=5‰xµ”——Ç­·Þ“'OŽÿ÷�ãŽ;.úõëÝ»w�víÚÅÖ­[cíÚµñæ›oÆ3Ï</¾øbZ1gVVVL˜0!úôéSç· �:uеk×FDD×®]cêÔ©±ï¾ûÖë÷rÍ5×DuuuÜÿý©ÙàÁƒ#??¿^÷-—¢O€f`ÕªUµf•••1mÚ´zßYZZÚ`EŸÿTQQ3f̈3fìö™¼¼¼˜0aBœ~úéõz󠃊)S¦Ä×¾öµhÛ¶mL›6-þíßþ­^wýÓØ±c£ªª*¦M›£F�Š+¯¼r�îZ&EŸ4}ûö�þð‡Ñ¯_¿=º§wïÞqß}÷Eûöí£k×®‰d»þúëãßÿýßãä“ONä> åQô @âºtécÇŽ�_|1Þxã�(++ÛéÞœœœøô§?_øÂâ´ÓN‹ìììD2ôïß?‘{þ•’O`W}4&Lˆ &4ú»Ï=÷\½Îíµ×^1bĈ1bDTUUÅ¢E‹bÉ’%±jÕª(++‹¬¬¬h×®]tïÞ= íÛ·O89@ãSô @ƒÊÉɉ>}úDŸ>}2 Aeg:´Š> Š> Š> Š> Š>å®´�IDAT Š> Š> ¹™Ðd÷7™Ž@+0ëKÿ–éÀ.dg:´Š> Š> Š> Š> Š> Š> Š> Š> Š> Š> Š> Š> Š> Š> Š> Š> ¹™MɪU«bîܹ1gΜ˜;wnÌ›7/¶lÙ’ú¼k×®ñÜsÏ5J–¡C‡Æòå˹«´´4&L˜°ÓϧOŸcÇŽ­÷ýƒ ŠiÓ¦Õû<´Š>hõ^{íµ˜2eJÌ™3'V¯^�é8 "///Ó ÅSô @«÷æ›oÆ3Ï<“é jÈ�!™Ž-ž¢OØ…ÂÂÂ(++ËÈÛ·ÜrKlÛ¶­Îç~÷»ßÅÃ?œZwêÔ)N8á„:Ýñõ¯=Ž=öØÝÞß¾}û:Ý-‘¢OøÿÚ¶mýû÷�Äa‡ ˆe˖ŰaÃ2’çÓŸþt½ÎMž<9m}æ™gFnnÝ~t¸W¯^1xðàz½­•¢OZ½¡C‡Æ±Ç=zôˆììì´Ï–-[–¡TõóÞ{ïÅo¼‘6+--ÍPh]}ÐêpÀ™Ž�˜Ç{,mݯ_¿èÛ·o†Ò@ë’ýÉ[€æ ºº:žx≴Yiii†Ò@ë£èZˆ—_~9>øàƒÔ:///Î8㌠&€ÖEÑ'´�=öXÚzÈ�!QRR’¡4Ðúäf:°ç6oÞÏ>ûlÚ¬´´t�ªŠ¥K—ƺuë"+++Š‹‹£K—.QTT´G÷@K¥èZ€§Ÿ~:ÊËËSëÎ�;Ç 'œPïûî¹çž?~|lÙ²%mž��½{÷ŽÁƒÇW¿úÕèÚµk½ßØ][·n�ÊÊÊš³ýìÜÖ­[w¹ qù~дø~´MágÍ}@ ðØc�¥­Ï<óÌÈÍ­ÿ� /Y²d‡óêêê˜?~ÌŸ??¦N�ç�w^Œ;6 êýÖ'Y¸paƒÝ -ÅÛo¿�éÐ,-^¼8Óø¾Ÿ4-¾ŸÔOv¦{æý÷ß�×^{-mVZZÚàïVVVÆ/~ñ‹8ÿüócõêÕ þ4uõÿ¿èš„éÓ§§­û÷ï}úô©×]‡rH 2$Ž8âˆèÕ«WtìØ1òòòbãÆ�±páÂøóŸÿ�<òHlÚ´)ufáÂ…qÉ%—ÄÏþó(,,Ü£ß 4gŠ> «©©‰_ÿú×i³ÒÒÒ:ßÓ¯_¿˜>}zôï߇ŸwîÜ9:wK.¹$®½öÚxöÙgSŸ¿õÖ[1yòä3fL�ßþ$½{÷ŽÜ\?úLCY‘é‰èׯ_¦#@³°uëÖX¼xqjÝ£G�(((È`"€ÖÍ÷3€¦Å÷3 %¨¬¬Œ… f4ƒŸv€fì•W^‰åË—§ÖyyyqÆgÔùž¾}ûîöÞ:Ä�wÞ—_~yüáHÍzè¡9rdì³Ï>u~W "///Ñ; ¥iÓ¦M¦#@³TPPàߣMˆïgM‹ïg@sTQQ‘é‘�é@ý=þøãiëÏ~ö³Ñ±cÇ7;;;Æ�íÛ·OͶmÛO?ýtƒ¿ M•¢Oh¦¶lÙøÃÒf¥¥¥�ö~‡âÜsÏM›½ôÒK�ö>45Š> ™úÝï~eee©uçÎ�ãøã�oÔ G}tÚú½÷ÞkÔ÷ )Qô ÍÔã�?ž¶>óÌ3#77·Q3ì»ï¾iëuëÖ5êûД(ú€fhéÒ¥1kÖ¬´Ù9çœÓè9>^,ZYYÙè ©Pô ÍÐã�?555©uÿþý£wïÞ�žcíÚµië’’’FÏM…¢OhfjjjâñÇO›�sÎ9ÉòÚk¯¥­÷Ýwߌ䀦@Ñ'43³fÍŠeË–¥ÖyyyqÆg4zŽÊÊÊZ…£G}t£ç€¦BÑ'43�=öXÚzèСQ\\Üè9~úÓŸÆßÿþ÷´Ùç>÷¹FÏM…¢Oh$}úôIûõꫯÖùŽòòòøýïŸ6+--Ý£\=ôP¼üòËu:3eÊ”˜þü´õ¶mÛbÆŒ;¼cï½÷Ž^½z5H¾úýï[¶lI­»téÇwÜÝ9wîÜ7n\ôíÛ7N=õÔ8î¸ãâàƒŽüüü´}åååñòË/Ç}÷ݳfÍJû¬¸¸8ÆŽ»G9 ¹Sô qÕUWÅòåË?qßÚµkcäÈ‘;ü¬´´4&L˜�t´4�=öXÚúÌ3ÏŒÜÜd~,xþüù1þü¸ýöÛ#777öÝwßh×®]äååÅG}Ë—/�ŠŠŠZçÚ¶mwß}wpÀ‰ä€æJÑ'4+V¬ˆW_}5mVZZÚ oUVVƲeË>qßᇓ&MRò ¡èš�ÇgŸ}v|ï{ß‹¢¢¢N Ð:)úlFæÌ™³Ã’ÏœœœèÒ¥KtêÔ)*++cÅŠ±iÓ¦´=�?þx,^¼8î¿ÿþhÛ¶mcEh5}6SíÛ·�3Î8#† Ÿþô§£¨¨(õYUUUÌž=;&Ož³gÏNÍçÎ�cÇŽ�É“'7JÆÎ�;Ç-·ÜR§3}ûöm 4 KÑg3Óµk×=ztœyæ™QPP°Ã=999qÔQGÅÔ©Scܸqñðç>ûýﯼòJ|æ3Ÿið¬{íµW <¸Áßh }6#—]vY <8òóówkNNNüà?ˆ·Þz+æÍ›—š?òÈ#�Rô Кdg:»oÈ�!»]òùO999qá…¦Íþò—¿$ €PôÙ* 80m½aÆ(//ÏP€–IÑg+СC‡Z³M›6e @Ë¥è³XµjU­YqqqãhÁr3€†7{öì´u×®]#??¿ÑÞ_·n]¬Zµ*6oÞEEEQ\\ûî»odee5Z€†¦è³xôÑGÓÖÇ|£¼ûá‡Æi§�ï¾ûn­ÏŠ‹‹ãÓŸþtœqÆqòÉ'GNNN£dh(Ù™@Ãzá…bÖ¬Yi³sÎ9§QÞÞºuëK>#"6lØüããÊ+¯ŒSN9%fΜÙ(™Jn¦Ðp6lØßÿþ÷Óf'žxbvØaJ´cï¿ÿ~Œ1"®¹æš>|xƒ½³uëÖ¨¬¬l°ûËÖ­[3€áû@f}üû˜ïg™ç;ÐøY3êKÑg U]]W]uU|ðÁ©Y»víâúë¯oð·‹ŠŠâ¸ãŽ‹c�=6úöíûï¿ÅÖ­[cÕªUñÆoÄôéÓãµ×^K�©ªªŠþð‡Ñ¹sç8ýôÓ$×Â… ä^€Æ¶xñâLGà_ø~дø~ÐôøŽ@k¢è³…š8qb¼øâ‹i³o¼1öÛo¿}÷ª«®Šã�?>Ú¶m[ë³¢¢¢(**Šž={Æyç�Ï<óL\{íµñÑGEDDMMM\wÝu1hРèÒ¥KƒæHZv¦�¼©S§Æ”)SÒf^xaœvÚi þö©§žºÃ’Ï9餓âg?ûY¤fåååq÷Ýw7T<€“›é$ë7¿ùMÜ|óÍi³sÎ9'¾ûÝïf(Ñ®}êSŸŠ /¼0~ò“Ÿ¤fO>ùd\wÝu‘��lmïÞ½#7×ßò4”™@+Ò£G�´’d`G|?£ñø~�Y[·n�Å‹§Ö¾Ÿdžïh@KPYY .Ìt š!­‡-ÈóÏ?cÆŒ‰šššÔìóŸÿ|Œ?>²²²2˜l׆ ÿýßÿUUU±aƘ7o^vØa‰¾SPPyyy‰Þ � ѦM›LÇàÿóý  iñý  éñ hŽ***2€f*;ÓHÆ+¯¼—_~yTVV¦fÇsLÜzë­‘“““ÁdŸ¬C‡ѯ_¿´ÙâÅ‹3” ~}¶sæÌ‰Ñ£GǶmÛR³#Ž8"~ò“ŸD~~~“í¾ýöÛ/m½~ýú %¨EŸÍÜüùó㢋.в²²Ô¬_¿~ñ³Ÿý, 3˜¬nrssÓÖJP?Š>›±Å‹ǨQ£bãÆ�©YÏž=ãÞ{ï�víÚe0YÝ­]»6m]RR’¡$õ£è³™Z¾|yŒ92>üðÃÔlÿý÷�)S¦4»’ÌíÛ·Ç›o¾™6Ûo¿ý2” ~}6C«W¯Ž#FÄ|�ší³Ï>qÿý÷Ç>ûì“ÁdõóÔSOEyyyj�ŸŸGydÔ�¢ÏffÆ 1jÔ¨xÿý÷S³’’’˜2eJtëÖ-ƒÉêgÍš5qûí·§ÍŽ9æ˜hÓ¦M†Ô�¢ÏfdóæÍqá…Æßþö·Ô¬}ûöqß}÷EÏž=}kÙ²eѧOŸ´_Ë–-ÛéþÕ«WÇäÉ“cãÆ�uzã /ŒU«V¥fYYYq饗îQv€LÈÍtvßèÑ£ãÍ7ßL›�1"Ö¯_3f̨Ó]ýû÷�:$–mûöíq×]wÅ”)SbèСqòÉ'Çá‡ûì³O­½ÿûßcúôéñàƒƦM›Ò>6lXôïß?±\�EÑg32sæÌZ³É“'×뮩S§ÆQGµ§‘j)++‹'Ÿ|2ž|òɈˆ(..ŽN�:EQQQlݺ5Ö¬YëÖ­ÛáÙSN9%ÆŒ“x&€Æ è“µaÆذaÃ.÷äççÇ·¿ýí1bDdee5N0€„)ú$�;wŽë®».^}õÕøë_ÿk×®ýÄ3]»v�³Î:+¾ô¥/Å>ûìÓ)Ž¢ÏfdÁ‚�öÖþûï_§÷ bذa1lذˆˆX½zu¼÷Þ{±råÊX¿~}”——G^^^tèÐ!JJJbÀ€Ê=š¸õë×Ç믿K—.�²²²(,,ŒnݺőG;vÌt<hr}Ò öÞ{ïØ{ï½3 NV­ZsçÎ�9sæÄܹscÞ¼y±eË–Ôç]»v�çž{®Ñò|ík_‹™3gÖûüøÃ8çœsê|nþüùñãÿ8þô§?Euuu­Ïsrrâ„NˆË/¿<úöí[ï|ÐÒ(ú U{íµ×bÊ”)1gΜX½zu¦ãdÜ<'NŒÊÊÊ�ªŠçž{.^|ñÅ3fL|ík_kÄ„Ðt)ú U{óÍ7ã™gžÉtŒ&aÊ”)1a„Zó.]ºÄÞ{ï«W¯Ž5k֤敕•1~üø¨©©‰aÆ5fTh’}ÀNFYYY¦c¤L™2¥Nû{õêµÛ{_ýõ¸å–[Òfƒ Š1cÆDÿþýS³7ß|3&Nœ3gÎLÍ~ô£ŧ>õ©8ì°Ãê”ZEŸmÛ¶�þýûÇ€â°Ã‹IJeËbذa™Ž–2xðà»{âĉQUU•Zö³Ÿ�É“'G~~~Ú¾Ľ÷Þ—^ziüéOŠˆˆÊÊʘ8qbüüç?o°|Ð(ú U:th{ì±Ñ£G�ÈÎÎNûlÙ²eJÕ¸^xá…xã�7Rëâââ¸ùæ›k•|þS~~~Ü|óÍqÚi§Å† ""bÖ¬YñÒK/Å1ÇÓ‘ IÊþä-ÐrpÀÑ«W¯Z%Ÿ­É¯~õ«´õW¾ò•())Ùå™N�:Å—¿üå´Ù#�<’x6hNZïO#±}ûöøË_þ’6;÷ÜswëìÇ÷½øâ‹±}ûöIJ@s£èZ±W_}5ÊÊÊRëƒ:(ºvíº[g÷ßÿ8ðÀSë-[¶Ä¬Y³’Ž͆¢OhÅÞyç�´õGQ§óGyä.ï€Ö$7ӀݷiÓ¦X¾|ylÚ´) £¸¸8öÝwßÈÉÉ©×}‹/N[÷êÕ«Nç{öì™¶~÷Ýwë•ZEŸÐLœ}öÙ±`Á‚¨®®N›Æ‘G'Ÿ|rœ}öÙ‘ŸŸ¿Ûw¾÷Þ{iëýöÛ¯N™>¾ÿã÷@k’�éÀîyç�wj•|FD”••Å_þò—øÞ÷¾C‡�§Ÿ~z·ïüðÃÓÖûì³O�2}|ÿºuëêtZ’ÜL’³fÍš¸âŠ+bîܹqÍ5×|âþ²²²´uaaa�ÞkÓ¦Í.ïKÂÖ­[£²²2ñ{ %)//Ïth¶nݺË5�Ë÷3€¦Å÷3 %h ?k¦èš°½öÚ+Ç|rÈ!ѽ{÷h×®]lß¾=Ö­[o¼ñF<õÔSñ /DMMMêÜ}÷Ý;vŒ‹/¾x—÷¼˜3??¿Nù ÒÖ[¶l©ÓùݱpáÂÄæí·ßÎth–/^œéü ßÏšßÏêGÑ'4Q#FŒˆ#�<2:vìXë³¼¼¼hÛ¶mtëÖ-Î:묘={v|ûÛߎU«V¥öÜvÛmqüñÇGß¾}wúƶmÛÒÖu-úüøþ�ß­Iv¦;ö¹Ï}n‡%Ÿ;2pàÀ˜6mZÚþššš¸ãŽ;vyn¯½öJ[oß¾½N?¾ÿã÷@k’›é@2ºwïW_}uŒ;65{á…bÆ Q\\¼Ã3………Q^^žZ×µèsëÖ­µîKZïÞ½#7×�>ÓPVd:@"úõë—éÐ,lݺ5/^œZ÷èÑ# 2˜ uóý  iñý h *++cáÂ…Íà§Ý 9ûì³ã–[n‰uëÖEDDuuu̘1#N;í´î/,,Œ?ü0µ.++«Ó{ÿZúÏû’VPPyyy‰ß -I›6m2𥂂ÿhB|?hZ|?š£ŠŠŠLGˆìL’“��ƒ J›½÷Þ{;Ýß©S§´õªU«êôÞÇ÷ü>hM}@ ³ß~û¥­×¯_¿Ó½tPÚzÅŠuzëãû?~´&Š> …ÉÍÍM[WTTìto�=ÒÖï¾ûn�ÞZ¼xñ.ï€ÖDÑ'´0k×®M[—””ìtoß¾}ÓÖ¯¿þz�ÞúøþC9¤Nç %Qô -Ìk¯½–¶Þo¿ývº÷¨£ŽŠÂÂÂÔzÉ’%±|ùòÝzgÙ²e±dÉ’ÔºmÛ¶1hРº…€DÑ'´ 3gÎŒ÷ß?mvôÑGïtÿ^{íÇsLÚìÑGÝ­·>¾ï¸ãŽ‹üüüÝL -�¢Oh!ÊÊÊbüøñi³Þ½{G·nÝvyî¼óÎK[?øàƒ±nݺ]žùðÃ㡇Úå=ÐÚ(ú€FЧOŸ´_¯¾úê.÷�?>V­ZµÛ÷¯[·.F� ,H›_vÙeŸxvÈ�!ñ©O}*µÞ°aC\{íµQQQ±ÃýÛ·o�ë®».6lØ�š 80Ž;î¸ÝÎ -Qn¦@¦½öÚk±mÛ¶Zóùóç§­·mÛ3fÌØá{ï½wôêÕ+±LÓ¦M‹‡~8Ž?þø8ùä“ãÈ#�Œý÷߿־•+WÆSO=÷߬Y³&í³O<1N:é¤Ýz磌®Š¯}íkQ]]Ï?ÿ|Œ5*ÆŒýû÷Oí›7o^üèG?Š™3g¦f999qÕUWÕç· -Š¢OZ½«®º*–/_þ‰ûÖ®]#GŽÜág¥¥¥1a„Dsmß¾=ž}öÙxöÙg#"¢¨¨(ºtéíÚµ‹ÊÊÊX»vm¬^½z‡g·Þzën¿5pàÀøö·¿“&MJÍfΜçœsNì½÷ÞÑ¥K—X½zu­2шüï÷©O}ªn¿9h�}@3±y󿨼yó.÷dggǨQ£âŠ+®ˆ¼¼¼:ÝÑEENNNLš4)ªªªRóÕ«Wï°P4'''®¾úê1bD�Þ€–JÑ'4A7ÝtS¼òÊ+ñúë¯ÇÊ•+?q—.]âÔSO�¯~õ«Ñ½{÷z¿;jÔ¨8úè£ãŽ;îˆ_|1ª««kíÉÎÎŽN8!®¸âŠèÛ·o½ß€–FÑ'­ÞsÏ=×ào,X° Nû/¸à‚¸à‚ ""býúõñî»ïÆŠ+bݺuQ^^999Ѿ}ûèØ±côë×/ºuë–XÖC9$î¹çžX·n]¼þúë±téÒ(++‹ÂÂÂèÖ­[yä‘QRR’Ø{ÐR(ú€&®cÇŽ1pàÀF·¤¤$N<ñÄFZ¢õë×ǼyóâÍ7ߌ¹sçÆ¼yóbÍš5i{¾õ­oÅ¥—^š¡„»ïW¿úU\wÝuµæ¥¥¥1a„ $€¦CÑ'4€)S¦¤Š=—.]šé8‰X»vmLœ81Ó1 ÉRô `„ ™Ž�¸ñãÇÇÆ�3š¬ìLš¾çŸ>ž~úéLÇ€&-7Ó 5(,,ŒC=4=ôÐ0`@\yå•™Ž´Û¶lÙãÆ�K­>øàظqc¬^½:ƒ© éQô à°Ã‹¤~õèÑ#²³³SŸ7§¢ÏÛn»-V®\YYYqà 7ÄÕW_�áTÐô(ú€ðÈ#�d:B"þú׿ÆC=”ZŸwÞy1pàÀÄßyùå—£cÇŽÑ·oßDªŠ_üâñÅ/~1rrr¹>Iö'oZ£ŠŠŠøÞ÷¾ÕÕÕQRRßýîwgöìÙ1zôè9rd,\¸p�ï«®®Ž«¯¾:n¼ñÆ;vl*?44EŸÀýô§?M+Þ¼æšk¢¸¸8Ñ7æÌ™_|q”——ǺuëbĈ±hÑ¢zßW]]cÆŒ‰'Ÿ|2""žx≸þú룦¦&©È°S¹™�Iëׯ�yóæÅ›o¾sçÎ�yóæÅš5kÒö|ë[ߊK/½4C w߯~õ«¸îºëjÍKKKc„ HDs¶xñâ¸ûî»S룎:*Î>ûìÄßY¿~}lß¾=µþðÃcøðá1uêÔèÙ³g�®Žk¯½6žx≴ùš5k¢¢¢"òóóÉ ;£èhu¦L™’*ö\ºti¦ã$bíÚµ1qâÄLÇ …¨©©‰ïÿû©Îüüü7n\ƒ¼5dÈ�¸ãŽ;âŠ+®ˆŠŠŠˆøÇßÏÿ,ûìÑ£Çng¾þúëã±ÇK›{ì±q×]w)ù Qdg:@c›0aB<õÔS-¦ä3"büøñ±qãÆLÇ …xøá‡cÖ¬Y©õÅ_tPƒ½wâ‰'ƤI“"7775[³fM ><–,Yò‰çÿYLúè£�¦Í?ó™Ï(ù Q)úhæžþùxúé§3ƒbõêÕ1iÒ¤ÔúÀŒo|ã þî)§œ'NŒœœœ´,Æ ‹÷ß§çjjjâ?øAüò—¿L›4(î¾ûî(((h°ÌðqŠ>€V¯°°0 £F�ŠÛo¿=ÓqêdË–-1nܸÔúàƒÿ{w¦uYö�ÿœ�aß÷d Aíý¦¦Q в™,±™"†ˆ@„ˆš=,Êš$ú¨©-š¦�f¸€â#›"‹€!Û¬¿?úu× ˆ3037¯×qp]ïûs]×{lñÃ9-¢^½z)lDi7~üøØ½{wb=vìØ(W®\‰Ü}Ùe—ŤI“"=ý? zË–-Ñ«W¯Ø°aÃa÷Œ7.-Z””�uÖY1cÆŒ¨X±b±ö€ƒ•Mu€’vúé§G»ví¿N=õÔ¤Á‚#FŒHa»Â¹ûî»cóæÍ‘––cÇŽ�›nº)Å­(­ž{î¹øóŸÿœXwéÒ%Î;ï¼íÐ¥K—ÈÍÍ�Q£FE~~~DDlÞ¼9zõê ,ˆF�%ž�0aB,\¸0iûöícæÌ™Q©R¥í }'¡Gy$ÕŠÄ[o½•4ä°{÷îqÖYgù=¯¼òJÔ¬Y3Z·n]$çåææÆC=W_}u”)S¦HÎäØ}úé§qûí·'ÖÕ«W�›o¾9%]ºví999që­·&†}~øá‡‰aŸ 6Œ‰'Æ‚ ’ö�qÆqÿý÷GåÊ•SQ ú(�²³³ãÖ[o�¼¼¼ˆˆ¨U«Vüô§?-ò{–.]ƒ ŠŠ+Ƽyó¢eË–Çt^^^^ÜtÓMñûßÿ>Þ~ûí˜4iR¤§§Q[ŽÅ�wÞ[·nM¬úÓŸFíÚµSÖçÊ+¯ŒÜÜÜ;vlbØç¦M›¢W¯^qþùçÇ¢E‹’žoÛ¶m<ðÀQ¥J•TÔ€ˆˆðO=J¡™3gFfffb=räȨQ£F‘ÞñöÛoGÿþýcß¾}±cÇŽèÓ§O¬^½ú¨ÏËËË‹›o¾9~ÿûßGDÄO<£G�N q$u–.]š48óÌ3ÏŒ+¯¼2…�þåꫯŽÑ£G'e7n=±>çœsâ{ßû^‘ß³sçÎÈÊÊJ¬?þøãèÝ»w¬Y³¦ÐgåååÅ-·ÜO<ñDR¾mÛ¶ÈÎÎ>殽¬¬¬¸õÖ[W322bܸq‘–––âfÿÒ³gÏ5jÔg~Þºuë˜3gNT¯^½[Àáô PŠäççǘ1c8Ë•+·ß~{±ÜÕ©S§øå/‰lûöíÑ»wïX»vm�ÏÉÏÏ�Ñ£GÇã�?ž”_pÁ1mÚ´(W®\‘u¦ð¦OŸžôïgß¾}£E‹)lt¨>}úDÇŽÉÓÒÒbÒ¤IQ£F�’/‡aÐ'@)²hÑ¢X²dIbÝ¿ÿhÚ´i±ÝwÑEÅ”)S¢lÙ²‰lÛ¶mÑ»wïX¿~ýçîÿ÷`ÒG}4)?÷Üs ù<¬^½:fΜ™X7jÔ(œÂF‡7uêÔX¼xñ!y~~~ ><¶lÙ’‚Vp(ƒ>J‰­[·Æ”)Së&MšÄ€ŠýÞK.¹$&OžeÊ”IêÒ«W¯øàƒ>s_~~~ÜvÛmñðÃ'å:tˆéÓ§G… Š­33zôèÈÎÎN¬ÇŒsÜýû2mÚ´˜6mÚg~¾~ýúèÝ»wlÛ¶­[Àá•ýüG8Œ?>vïÞ�X�;6Ê•+W"w_vÙe‘››#GŽŒ¼¼¼ˆˆØ²eKôêÕ+,X�7>dϸqãbÑ¢EIÙYg�3f̈Š+–HoŽlÙ²e‰]³fÍX²dI,Y²¤@{?ù䓤õŠ+’ÑFükHlÛ¶m�ºßŒ3bêÔ©IY«V­â¢‹.Jþ¹nݺèÝ»wÌŸ??êÔ©sÔ÷À±2è xî¹çâÏþsbÝ¥K—8ï¼óJ´C—.]"777F�ùùù±yóæÄ°ÏF�%ž�0aB,\¸0iûöícæÌ™Q©R¥íMÁìܹ3fÍšuÔû333#333);õÔS�zÐç¬Y³âî»ïNÊZ¶lsçÎ�ZµjE… â®»îJ|¶f͚İÏÚµkÕ�p¬ÒS]€#ûôÓOãöÛoO¬«W¯7ß|sJºtíÚ5Æ�iii‰ìÃ?Œ^½zŦM›""bâĉ±`Á‚¤}gœqFÜÿýQ¹råíKé4gΜ˜2eJRÖ¢E‹˜7o^ÔªU+""ú÷ïÇOzfõêÕѧOŸØ±cGIU€$}çî¼óÎØºukbýÓŸþ4j×®�²>W^yeŒ;6iØç¦M›¢W¯^1f̘˜7o^ÒómÛ¶�x ªT©RÒU)…æÍ›“&MJÊš5ksçÎM ùü·AƒÅСC“²ÌÌÌèÓ§Oìܹ³Ø»ÀÁʦºŸméÒ¥±hÑ¢ÄúÌ3ÏŒ+¯¼2…�þåê«¯Žœœœ?~|"Û¸qcR׈ˆ6mÚÄìÙ³£jÕª%]‘XµjÕQïíܹslÚ´)±îÚµë!: ë7¿ùMLœ81)kÚ´iÌ›7/êÔ©sØ=C† ‰¼¼¼˜6mZ"[µjUôíÛ7æÎ�5jÔ8¦NPé©.ÀáeeeÅ­·Þùùù‘‘‘ãÆ�‹´´´7û—ž={ƨQ£>óóÖ­[Çœ9s¢zõê%ØŠÒjáÂ…Iƒc#"š4ióçÏ�ºuëqï°aÃbàÀ�IÙ?þñ�èׯ_|òÉ'EÞ>‹AŸÇ©éÓ§ÇÚµkë¾}ûF‹-RØèP}úô‰Ž;’§¥¥Å¤I“¢F�%_ê$ÖªU«¤_×\sMª+ÈÃ?ãÆ�KÊN9唘?~Ô«W¯@gŒ1"ú÷­X±"úõë»wï.²®p$}‡V¯^3gÎL¬5jƒNa£Ã›:uj,^¼ø�ù$i½bÅŠ˜2eJRvÉ%—DÛ¶m�ºßŒ3bêÔ©IY«V­â¢‹.Jþ¹nݺèÝ»wÌŸ??êÔ©sÔ÷•F™™™1kÖ¬?ÿæ›oÆ›o¾yØÏ6lxÂúlÚ´iÌ™3'®¹æš¨\¹r,X° ¾øÅ/Ó™£F�ŠÜÜÜX°`Aôë×/FŒQDmàÈ ú8Îíܹ³P#–™™™™™IÙ©§žzÔƒ>gÍšwß}wRÖ²e˘;wnÔªU+*T¨wÝuWâ³5kÖ$†}Ö®]û¨îäÄÖ²e˘={vT«V-6lX$gŽ=:Î>ûì¸øâ‹‹ä<(ˆôT ô˜3gNL™2%)kÑ¢EÌ›7/jÕªýû÷�áÇ'=³zõêèÓ§OìØ±£¤ªRÊœvÚiѸqã"=Ó�OJZÙT t˜7o^Lš4))kÖ¬YÌ�;71äóß ¹¹¹qß}÷%²ÌÌÌèÓ§OÌ›7/jÖ¬Y"�S©[·nÑ­[·½sÕªU%v×óÏ?_bw@iaÐ'ÀqèX6vîÜ96mÚ”XwíÚõ��…õ›ßü&&Nœ˜”5mÚ4æÍ›uêÔ9ìž!C†D^^^L›6-‘­Zµ*úöísçÎ�5jS'€ãMzª p|[¸paŒ?>)kÒ¤IÌŸ??êÖ­{ĽÆ ‹�&eÿøÇ?¢_¿~ñÉ'ŸyW€T2è ´jÕ*é×5×\“êJòðÃǸqã’²SN9%æÏŸõêÕ+Ð#FŒˆþýû'e+V¬ˆ~ýúÅîÝ»‹¬+@ªô Àa=ùä“1f̘ÈÏÏOd�7ŽùóçGýúõ uÖ 7ÜýúõKÊ–/_ýúõ‹¬¬¬"é �jeS] ¤-_¾<ž~úé?¿xñâ8pàÀa?«V­Zôïß¿¨ªWÚµkµk׎íÛ·GDDÆ cþüùÑ Aƒ£:oäÈ‘‘——sçÎMd;vŒråÊE]€”3è8édffƬY³ üü›o¾o¾ùæa?kذá ;è³iÓ¦1gΜ¸æšk¢råʱ`Á‚øâ¿xLgŽ5*rsscÁ‚ѯ_¿1bDµH=ƒ>øL-[¶ŒÙ³gGµjÕ¢aÆEræèÑ£ãì³ÏŽ‹/¾¸HÎ8^ô À�vÚiE~¦!ŸÀ‰È Oà¤Ó­[·èÖ­[‰Þ¹jÕª»ëùçŸ/±»øƒ>8©ÔúëyñÑ_S\„ZÓáY©®@ ¤§ºœ ú€"`Ð'ƒ> ô EÀ O(}@0èŠ@ÙTø·ôŸ>•ê œÖ4JuàD•žêp"0芀AŸP ú€"`Ð'ƒ> ô EÀ O(}@0芀AŸP ú€"`Ð'ƒ> ô EÀ O(}@0芀AŸP ú€"`Ð'ƒ> ”Mu€âòÑGEffflÞ¼9>ù䓈ˆ¨^½zÔ®];Úµkõë×OqCN$}'ŒíÛ·ÇóÏ?¯¼òJ¼öÚkññÇñùÆ�G÷îÝ㪫®ŠZµj•PËCmݺ5Þ}÷ÝįåË—Ç®]»’žùÅ/~ݺuKMA Ä O Ô{÷ÝwãÎ;ïŒ%K–D^^^�÷mذ!î¹çž˜9sfÜrË-ѽ{÷blù{÷î� ${~ôÑG%r/ÅË O Ô[¾|y¼öÚkG½Ïž=ñ³Ÿý,Þ}÷ݸýöÛ‹°ÙáíØ±#î¾ûîb¿€’eÐ'pB:å”S¢cÇŽÑ¡C‡hÖ¬YÔ®];Ê—/Û¶m‹eË–ÅÃ?o½õVÒž‡z(j×®Æ KMiJ5ƒ>€FÙ²eãÛßþv\yå•Ñ¡C‡Ã>SµjÕ8õÔSãŠ+®ˆE‹Åøñã#;;;ñùŒ3âÒK/�-Z”T툈¨^½z´mÛ6Úµkõë×�Ûo¿½DïàØô ”zéééqùå—ǰaÃâ”SN)ð¾=zDÙ²eã–[nId9991mÚ´øå/Y Mÿ¥lÙ²ñÕ¯~5Úµk—øõß½7nÜXlwP| úJ½îÝ»G�=ŽjïW\¿ûÝïâõ×_Od/½ôRdeeE¹r努b’ ÄÂ… ‹åì‚zå•W¢f͚Ѻuë"9/777z衸úê«£L™2Er&@i“žêÇêXK~ï{ßKZïÙ³'V­ZuLgÏ–.]ƒ о}ûFffæ1Ÿ———7ÝtSŒ7.F�yyyEРô1è8éµnÝú�lÛ¶m)hRüÞ~ûíèß¿ìÛ·/vìØ}úô‰Õ«WõyyyyqóÍ7Çïÿûˆˆxâ‰'bôèÑ‘ŸŸ_T•J ƒ>€“^… ÉöíÛ—‚&ÅoçÎ�‘•••XüñÇÑ»wïX³fM¡ÏÊËË‹[n¹%žx≤|Û¶m‘��}Ì]Jƒ>€“Þ‡~xHV«V­4)~�:uŠ_þò—‘‘‘‘ȶoß½{÷޵k×øœüüü=zt<þøãIù\Ó¦M‹råÊYg€Ò OषdÉ’C²/}éK)hR2.ºè¢˜2eJ”-[6‘mÛ¶-z÷îëׯÿÜýùùù1f̘xôÑG“òsÏ=×�Oà¤fÐ'pRËÍÍ�'Ÿ|2)kÖ¬Y4lØ0E�JÆ%—\“'OŽ2eÊ$²­[·F¯^½âƒ>øÌ}ùùùqÛm·ÅÃ?œ”wèÐ!¦OŸ*T(¶ÎÇ;ƒ>€“Ú#�<›7oNʾýío§¨Mɺì²ËbÒ¤I‘žþŸd´eË–èÕ«Wlذá°{Æ�‹-JÊÎ:묘1cFT¬X±Xûï úNZ}ôQL™2%)«^½zôìÙ3E�J^—.]bâĉ‘–––È6oÞ½zõŠ�7&=;a„X¸paRÖ¾}û˜9sfTªT©DúÏ úNJ999qà 7ÄîÝ»“ò#FD�5RS*EºvíãÇ�Oöùá‡F¯^½bÓ¦M1qâÄX°`AÒ¾3Î8#î¿ÿþ¨\¹r‰ö8^•Mu€T˜8qb,]º4)»à‚ âꫯNQ£ÔºòÊ+#777ÆŽùùù±iÓ¦èÕ«Wœþù±hÑ¢¤çÛ¶m<ð@T©R%uŽKé©.PÒ,X>ø`RÖ Aƒ¸óÎ;#---E­RïꫯŽÑ£G'e7n|xlÙ²%­Ž}'¼åË—Ç€bß¾}‰,===î¸ãŽèÔ©Sꊇ¦M›Ó¦MûÌÏׯ_½{÷ŽmÛ¶•`+€ÒÁ Oà„öÞ{ïŵ×^Ÿ~úiR~ûí·Çe—]–¢Vǧ3fÄÔ©S“²V­ZÅàÁƒ“²uëÖEïÞ½cûöí%Yà¸gÐ'pÂzÿý÷£oß¾±k×®¤üæ›oŽ«®º*5¥ŽS³fÍŠ»ï¾;)kÙ²eÌ�;7† 7ÜpCÒgkÖ¬‰Þ½{ÇÇ\’5Žk}'¤Í›7Gß¾}cÛ¶mIùСC£oß¾)ju|š3gNL™2%)kÑ¢EÌ›7/jÕªýû÷�áÇ'=³zõêèÓ§OìØ±£¤ª× úN8Û·o�>}úĦM›’ò~ýúÅ�!CRÔêø4oÞ¼˜4iRRÖ¬Y³˜;wnbÈç¿ 4(†š”effFŸ>}bçÎ�ÅÞàxgÐ'pBÙµkWôíÛ7Ö¯_Ÿ”÷èÑ#FŽ™šRÇ©ßüæ71qâĤ¬iÓ¦1oÞ¼¨S§Îa÷ 2$œ”­Zµ*úöí»ví*®ª¥‚AŸÀ cÏž=qÝu×EfffRÞ¥K—¸ýöÛSÔêø´páÂ?~|RÖ¤I“˜?~Ô­[÷ˆ{‡ LÊþñ�D¿~ýâ“O>)ò®¥…AŸÀ áÀ�1pàÀxç�w’òo}ë[1iÒ¤HKK+ò;;wî­ZµJüêܹs‘ßQ~øá7n\RvÊ)§Äüùó£^½z:cĈÑ¿ÿ¤lÅŠѯ_¿Ø½{w‘u(M úJ½œœœ¸þúëãõ×_OÊ¿þõ¯Ç]wÝeÊ”IQ³ãÏ“O>cÆŒ‰üüüDÖ¸qã˜?~Ô¯_¿PgÝpà ѯ_¿¤lùòåѯ_¿ÈÊÊ*’¾¥IÙT8V÷Ýw_¼ð IYÙ²eã”SN‰©S§Õ™§�vZ\zé¥EQï°/^‹/>ìg»wï>${úé§cíÚµ‡}¾qãÆÑ£G�ÝÛ®]»¨]»vlß¾=""6lóçÏ� °y²‘#GF^^^Ì�;7‘uìØ1Ê•+wTç”f}¥Þ–-[ÉrrrbÁ‚G}f×®]‹uÐço¼³fÍ*ðó/¾øb¼øâ‹‡ý¬C‡ôÙ´iÓ˜3gN\sÍ5Q¹råX°`A|ñ‹_,p�Ã5jTäææÆ‚ ¢_¿~1bĈc: ´2èà$Ó²e˘={vT«V-6lX$gŽ=:Î>ûì¸øâ‹‹ä<€ÒÈ O€“Ði§�Vägò œì úJ½I“&ŤI“JüÞçŸþ¨÷:4†Z„mHµôT€�AŸP ú€"P6Õ 4ûè£�"3336oÞŸ|òIDDT¯^=j×®íÚµ‹úõ맸á¡6lØË—/�Í›7Çþýû£R¥JѨQ£8ýôÓ£^½z©®¥–AŸPÛ·o�çŸ>^yå•xíµ×âã�?>âó�7ŽîÝ»ÇUW]µjÕ*¡–‡ÊÏÏ�'žx"æÌ™+W®<ì3iiiqæ™gÆ�~ô£èܹs 7€ÒÏ O(€wß}7î¼óÎX²dIäååx߆ âž{3gÆ-·ÜÝ»w/Æ–‡·}ûö>|x,Y²äˆÏåççÇo¼o¼ñF\|ñÅñ‹_ü"*W®\B- ôKOu( –/_¯½öZ¡†|þ·={öÄÏ~ö³¸í¶ÛŠ¸Ù‘mݺ5¾ÿýïî�σ=óÌ3Ñ·oߨ³gO15€OÙT€Òê”SN‰Ž;F‡¢Y³fQ»ví(_¾|lÛ¶-–-[?üp¼õÖ[I{z表]»v 6¬ØûåääİaÃâƒ>HÊ›7o}ûö�öíÛGݺucóæÍñÊ+¯ÄܹscóæÍ‰çÞ~ûí¸å–[âÞ{ï-ö®p"0è(Vé?}*Õ8 ,ùþK쮲eËÆ·¿ýí¸òÊ+£C‡‡}¦jÕªqê©§ÆW\‹-ŠñãÇGvvvâó3fÄ¥—^-Z´(Ö®¿ýíocÙ²eIÙ¥—^“'OŽråÊ%²jÕªE«V­¢[·nñãÿ8–,Y’øìé§ŸŽ^x!¾ùÍokW8¤§º”éééqùå—ÇÿøÇ¸óÎ;?sÈçÁzôè·ß~{R–““Ó¦M+Žš ûöí‹3f$emÛ¶�»îº+iÈç«V­ZLŸ>=¾ð…/$å÷Þ{oäçç[W8Qô н{÷¸ë®»â”SN)ôÞ+®¸â�Á /½ôRdeeU½C,Z´(¶mÛ–”M˜0!Ê”)sÄ}UªT‰Ñ£G'eÿøÇ?â/ùK¡;¼òÊ+±råÊBïû,¹¹¹ñàƒFnnn‘� EÉ O(€Ï�ùy¾÷½ï%­÷ìÙ«V­:¦3�äé§ŸNZŸ}öÙñå/¹@{;wî 6<âyŸgéÒ¥1hРèÛ·odffjïáäååÅM7ÝãÆ�‹Q£FE^^Þ1Ÿ EÍ O(­[·>$Û¶m[±Üµ}ûöxûí·“²ƒ�IzzztéÒ%){饗"''§@ûß~ûíèß¿ìÛ·/vìØ}úô‰Õ«WøþƒåååÅÍ7ß¿ÿýï#"â‰'žˆÑ£GG~~þQŸ ÅÁ O(*T8$Û·o_±ÜõòË/G^^^RvÎ9çꌃŸÿä“ObÙ²eÚ»sçÎÈÊÊJ¬?þøãèÝ»w¬Y³¦P"þ5äó–[n‰'žx")ß¶m[dggú<(N}@ øðÃÉjÕªU,w­Zµ*i]·nÝhܸq¡Î8ýôÓ£L™2IYfff�övêÔ)~ùË_FFFF"Û¾}{ôîÝ;Ö®][àùùù1zôèxüñÇ“ò .¸ ¦M›åÊ•+ðYP ú€°dÉ’C²/}éKÅr×ÁÃ4O=õÔBŸQ¹råhРÁÏ=’‹.º(¦L™eË–MdÛ¶m‹Þ½{Çúõë?w~~~Œ3&}ôѤüÜsÏ5ä€ã–AŸPÌrssãÉ'ŸLÊš5k 6,–ûÖ¬Y“´þâ¿xTç|á _HZfÐgDÄ%—\“'OŽ2eÊ$²­[·F¯^½âƒ>øÌ}ùùùqÛm·ÅÃ?œ”wèÐ!¦OŸ*T(T()}@1{ä‘GbóæÍIÙ·¿ýíb»oëÖ­Ië Õ9úܲeK¡Ï¸ì²ËbÒ¤I‘žþŸ4¹eË–èÕ«Wlذá°{Æ�‹-JÊÎ:묘1cFT¬X±Ð ¤ô Åè£�>Š)S¦$eÕ«W�ž={Ë}¹¹¹qàÀ�¤¬J•*GuÖÁûöîÝ{TçtéÒ%&Nœiii‰lóæÍÑ«W¯Ø¸qcÒ³&Lˆ… &eíÛ·�™3gF¥J•Žê~()}@1ÉÉɉn¸!vïÞ�”�1"jÔ¨Q,wng… Žê¬ƒ÷í Ïˆˆ®]»Æøñ㓆}~øá‡Ñ«W¯Ø´iSDDLœ81,X�´ïŒ3Έûï¿?*W®|Ôw@I)›êp¢š8qb,]º4)»à‚ âꫯ.¶;7Œ³|ùòGuÖÁûŽeÐgDÄ•W^¹¹¹1vìØÈÏÏ�ˆˆM›6E¯^½âüóÏ�E‹%=ß¶mÛxà�¢J•*Çt/””ôT€Ñ‚ âÁLÊ4hwÞyg¤¥¥¥¨Uê]}õÕ1zôè¤lãÆ�‡ ùlÓ¦MÌž=;ªV­Z’õà˜ô EìøCLœ81)«Zµj̘1#jÕªU¬wWªTé�ìÀ�GuÖÁûwöÑèÙ³gŒ5ê3?oݺuÌ™3'ªW¯^$÷@I1èŠÐK/½#GŽŒ¼¼¼DV¡B…˜>}z´nݺØï?Ü0Îýû÷ÕYï+ªAŸ}úô‰Ž;’§¥¥Å¤I“¢F�Ev”ƒ> ˆ,]º4† ÙÙÙ‰,###î½÷Þ8묳J¤C™2e¢|ùòIÙ§Ÿ~zTg¼¯(}N�:5/^|HžŸŸÇ�-[¶Ù]PR ú€"°|ùò0`@ìÛ·/‘¥§§ÇwÜ�:u*Ñ.õêÕKZôÑGGuÎÁû>÷hM›6-¦M›ö™Ÿ¯_¿>z÷îÛ¶m+’û ¤ô Çè½÷Þ‹k¯½6>ýôÓ¤üöÛo�Ë.»¬Äûœzê©Ië?üð¨Î9x_³fÍŽºÓ¿Í˜1#¦N�š”µjÕ*œ”­[·.z÷îÛ·o?æ; ¤ô Çàý÷ß�¾}ûÆ®]»’ò›o¾9®ºêª”t:x çÚµk }ÆÞ½{ã£�>JÊ ZX³fÍŠ»ï¾;)kÙ²eÌ�;7† 7ÜpCÒgkÖ¬‰Þ½{ÇÇ|L÷@I1èŽÒæÍ›£oß¾±mÛ¶¤|èСѷoßµŠhÕªUÒzÛ¶m±aÆB�ñöÛoGnnnRÖ²eË£î4gΜ˜2eJRÖ¢E‹˜7o^ÔªU+""ú÷ïÇOzfõêÕѧOŸØ±cÇQß %Å O8 Û·o�>}úĦM›’ò~ýúÅ�!CRÔê_.¸à‚HOOþG�¯¿þz¡Î8øùêÕ«Gûöí�ªÏ¼yóbÒ¤IIY³fÍbîܹ‰!Ÿÿ6hР:thR–™™}úô‰�;wÕýPR ú€BÚµkWôíÛ7Ö¯_Ÿ”÷èÑ#FŽ™šRÿ¥N�:qÆg$e¿ûÝï ¼????žx≤ìë_ÿz”-[¶Ð]~ó›ßÄĉ“²¦M›Æ¼yó¢N�:‡Ý3dÈ�)kÒ¤IÌŸ??êÖ­{ĽÆ ‹�&eÿøÇ?¢_¿~ñÉ'Ÿº ”ƒ> €8ŒwÞy')ÿÖ·¾“&MŠ´´´"¿³sçÎѪU«Ä¯Î�;h_�=¢N�:IÙ­·Þ¹¹¹GÜ÷é§ŸÆ„ ’²Ö­[Ç…^X¨Þ?üpŒ7.);å”SbþüùQ¯^½�1bĈèß¿R¶bÅŠèׯ_ìÞ½»P} $ô �““×_}¼þúëIù׿þõ¸ë®»¢L™2)jvx+VŒ�&eï¼óNÜtÓM‘••uØ=»wïŽAƒŇ~˜”>¼PCLŸ|òÉ3fLäçç'²Æ�Çüùó£~ýú…ø*"n¸á†èׯ_R¶|ùòèׯßg~�*eS]Jƒûî»/^xá…¤¬lÙ²qÊ)§ÄÔ©S�êÌÓN;-.½ôÒ¢¨wXßÿþ÷ã÷¿ÿ}¼õÖ[‰ì÷¿ÿ}¬Zµ*úõëíÛ·�ÚµkÇ–-[bñâÅ1wîÜC†|^|ñÅñÍo~³P÷¶k×.j×®Û·o�ˆˆ† Æüùó£AƒGõuŒ92òòòbîܹ‰¬cÇŽQ®\¹£:Š‹AŸP[¶l9$ËÉɉ õ™]»v-ÖAŸeË–�©S§FÏž=ãƒ>Häï½÷^Œ5ês÷Ÿ~úé1qâÄBßÛ´iÓ˜3gN\sÍ5Q¹råX°`A|ñ‹_,ô9ÿmÔ¨Q‘›› ,ˆ~ýúň#Žé<(}À ¬~ýú±pá¸þúëã�7Þ(ð¾o}ë[ñ‹_ü"ªT©rT÷¶lÙ2fÏžÕªU‹† Õ=ztœ}öÙqñÅÉyPÔ ú€\ݺuãÁŒßýîw1gΜXµjÕg>{æ™gÆu×]�;w>æ{O;í´c>ã`†|p<3è `Ò¤I1iÒ¤¿÷ùçŸ/’sÒÒÒ¢k׮ѵkר°aC¼ûî»±yóæ8pà@T¬X16lgœqFÔ¯_¿H‘AŸp’iܸq4nÜ8Õ5à„“žêp"(›ê@ÁdggǺuëbõêÕ±}ûöسgOTªT)jÔ¨­ZµŠ–-[FzzzªkÀIË Oø/[¶l‰wÞy'Þ~ûíxç�wbùòå±gÏžÄç 6ŒçŸ¾Äúlذ!žyæ™X¼xq¼ñƱÿþÏ|¶jժѥK—èÕ«W4iÒ¤P÷<öØc1jÔ¨£îÙ¡C‡X°`ÁQï€�AŸœôÞxã�˜3gN¼ýöÛ±uëÖT׉ˆˆ¬¬¬èÙ³g¼ýöÛÞ³{÷îxðÁãᇎ#FD¿~ý"--­[ÿÍ ONzï¾ûn<û쳩®‘$;;û3‡|–/_>êÖ­5kÖŒ}ûöÅûï¿ÙÙÙI{'Ož7nŒÛn»­¤*ÀIÏ O8‚J•*ÅÞ½{S]#5j]»v�Ž;F»ví"###ñÙþýûã™gž‰{ï½76mÚ”È.\Íš5‹ž={ú¾k¯½6.¸à‚?_­ZµBß'ƒ>àÿW¹rå8í´Ó¢]»vqúé§G»víbãÆ�Ñ«W¯”u:óÌ3cðàÁqþùçGZZÚaŸ©P¡B|÷»ß�N�:ŵ×^ï¾ûnâ³{ï½7.¿üò¨Q£F¡îmÞ¼ytìØñXªÀIÇ ONz�;wŽ .¸ N=õÔHOOOúlãÆ�)锑‘3f̈N�:xOõêÕcÚ´iqÉ%—ÄÞ½{#"âŸÿügüùÏŽ«®ºª˜šÿfÐ'¥^­¿žý5ÅE8¡5ž•ê £/}éK©®pˆråÊjÈç¿Õ¯_?¾÷½ïÅÂ… ÙË/¿lÐ'”€ôÏ(MÎ:묤õ‡~˜¢&pr1èN0ÕªUKZïÞ½;EMàäbÐ'œ`¶lÙ’´®Y³fŠšÀÉ¥lª Eë�7ÞHZ7iÒä¨ÎÉÍÍ� 6ÄŽ;"---jÔ¨uëÖ�*UªAK8ñôYŠåççÇÆ�#333>úè£Ø½{w”+W.ªU«Mš4‰víÚEùòåS]3rrrâí·ßŽ÷Þ{/víÚéééQ¯^½8í´Ó¢E‹©®pBùôÓOãé§ŸNʾþõ¯úœ3fÄ„ bÏž=Iyzzz´lÙ2:vì={öŒ† S_8‘ôYÊ|òÉ'ñÜsÏÅ_ÿú×xõÕWcçÎ�ŸùlFFF|ã߈޽{G‡J°å¿ìÙ³'fΜ=ôPìÚµë°Ï4mÚ4®»îºèÖ­[¤¥¥•lA€ЯýëØ»wob]³fÍøæ7¿YèsÖ¯_ØK‘Ûo¿=yä‘ÈÎÎ.ÐóÙÙÙñÜsÏÅsÏ=ßûÞ÷âÖ[o�*UªsËYµjUüøÇ?Ž�7ñ¹uëÖÅ-·Üüãã—¿üeT­ZµDúœˆÞ|ó͘;wnR6hР¨X±b±Ü—““=ôP¼ùæ›ñÀD½zõŠåžýû÷GNNN±œ 'Š}ûö¥ºñ=|¾ýû÷q @Éòýp"8Þ53è³yûí·;ä³L™2Q·nݨ]»väääć~»wïNzæw¿û]¬]»6æÎ�•+W.Öžk×®�Þ½{ÇÎ�;“òJ•*EãÆ�ãÀ�±iÓ¦¤¯åå—_Žë®».æÍ›åË—/Ö~@ÉÚ¹sg¼õÖ[±m۶عsg”)S&j×®-[¶Œ6mÚDZZZª+œ>þøãøÉO~¹¹¹‰¬]»vѳgÏB�óå/9:uêíÛ·�æÍ›GÍš5####>ùä“ÈÌÌŒ¿þõ¯ñÈ#�$½¯š™™Œßüæ7Q©R¥"ûšþû|àÈþþ÷¿§ºñ=ÞÚµkS]€ÿâû3€£cÐg)U­Zµ¸üòË£S§NñÕ¯~5ªT©’ø,777–.]S§N�¥K—&òwÞy'F�S§N-¶^999qýõ×' ù¬Q£FŒ5*.»ì²ÈÈȈˆˆ]»vÅœ9sbæÌ™‘——Ë–-‹;ï¼3F�]lý 4Û¹sg,_¾<Þ}÷Ýxç�wbùòå±mÛ¶¤g† C‡MQÃÿÈÏÏ�?ýéO1gΜX¾|yâïÿV§N�¸âŠ+âÚk¯�êÕ«—pK€GVVV <86oÞœÈ*W®wÝuW”)S¦@g´iÓ&{ì±8í´Óûy�:u¢N�:ѱcÇ8p`ÜrË-ñÜsÏ%>_±bEL�:5n¾ùæcûb 3è³”iذa 4(¾ó�ïD… ûL™2eâœsΉùóçÇí·ß‹-J|öÌ3ÏÄ«¯¾çž{n±ô{ôÑG“~bzõêÕãÁŒæÍ›'=W£F�1bD4oÞ<~úÓŸ&òßþö·Ñ³gÏhÒ¤I±ô€ÒfΜ9‰Áž6lHu�Ù°aC\ýõ±bÅŠÏ}vûöí1cÆŒxøá‡ãŽ;îˆo|ã%ÐàÄ’——?ýéOcÙ²e‰¬L™21eÊ”8å”S |NëÖ­ ülõêÕã¾ûî‹ë¯¿>þüç?'ò… Fß¾}£~ýú> N$}–"Æ ‹Ž;F¹rå ô|™2eâ¶Ûn‹+VÄòåËù#�³²²âþç’²›nºé�!Ÿÿí;ßùN¼ôÒKñä“OFDDNNNÜwß}q×]wy?(�&Mš”ê …òÎ;ïDÿþýcçÎ�…Ú·sçÎ8p`Lž<9¾ó�ïS;€Óرcã™gžI¬ÓÒÒbüøñѹsçb½7===&L˜¯¾újüóŸÿŒˆˆÄŸþô§èÓ§O‘ÞÕ²eË([Ö«Ï—S] H´iÓ&ÕŠ�ïÑ€ƒïÑàóíß¿?Ö®]›XŸzê©Q¡B…68¹ùþ 8äääDfffJ;xÛ­éÔ©S¡÷”)S&~ô£ÅðáÃÙË/¿\t¥þËË/¿›7oN¬6lW\qÅçî:th<õÔS‘ŸŸÏ<óLŒ;6ªV­Z,=€â±uëÖøñ�|È�ϦM›Æ5×\çž{nÔ­[7öíÛkÖ¬‰?üáñøã�GnnnDDäååŨQ£¢Q£FѾ}ûT| ¥Î]wÝ‹-JÊn¾ùæ½ÃYªW¯W\qEÌ™3'‘ýío+òAŸ*TˆŒŒŒ"=N4+VLuâ{4(¼ *øÿP€ãˆïÏ€Ò(;;;Õ"=Õ(~g�uVÒz×®]±oß¾"¿ç/ùKÒº[·n‘––ö¹û¾ô¥/ÅÙgŸ�XgggÇ‹/¾XäýàDP©R¥èСCôë×/î¹çžT×I2jԨضm[RÖ£G�xê©§â‡?üa4kÖ,ªU«õë×�Ž;ÆÏþóøío5jÔH<Ÿ��?ûÙÏÃ?øl3gÎŒ™3g&eƒ.ò!›Ÿç¼óÎKZ¯[·®Dï€ãIÙT øU¯^ý�l÷îÝE>!ûàáœ\pA�÷žþùñúë¯'Ö/¼ðB\~ùåEÖ J«ÓO?=Úµk—øuê©§Fzú~vˈ#RØî?Þzë­xùå—“² /¼0Æ�wÄ}gœqF̘1#~ðƒ$†{®Y³&üñèÞ½{±õ(í|ðÁ¸ë®»’²^½zŰaÃJ¼Kƒ ’Ö;vì(ñp¼HÿüG(í¶lÙrHV£F�"½cûöí±m۶ĺ\¹rѦM›ï?óÌ3“Ö+W®,²nPš=òÈ#1f̘èÚµk4oÞ£gÏžIë?ü0–-[V¨úÓŸbĈÑ»wïÃþà“ÂÚ¿ 0 ÆŒ÷ÜsÏ1ŸPžy晸å–["???‘]zé¥1a„HKKKI§íÛ·'­kÕª•’p<0èó$ðè£�&­¿þõ¯ùëÖ­KZ7hРPûkÕªåË—O¬³³³cãÆ�EÒ (^k×®�;v$e;v,ÔÍ›7�ºuë&eÏ=÷\�÷ÿå/‰o¼1rssãý÷ß�^½zÓ°Ïýû÷ÇÀ�ãµ×^‹ˆˆéӧǯ~õ«£> (¼øâ‹qà 7Dnnn"ëÔ©SÜyç�‘žžº×‚ßxã�¤uaß#€‰AŸ'¸_|1–,Y’”uëÖ­Èïùøã�“ÖGó‚f½zõŽx&p|Úºuë!Y‹- }NË–-“Ö/¼ðB�÷nß¾=rrrëõë×GïÞ½cÛ¶m…îqàÀ�…Í"fΜï¿ÿ~Rvá…¦¨ ¤žAŸ'¨¼¼¼¸ñÆã£�>JdU«V�Ñ£GË}å<š—FÚQÔƒ>333‹ô<€TY»vmª+ð_Ž·ï϶mÛÿûßKôÎ�7’­Y³¦ÐC�þùÏ&­óòòâùçŸ�&Mšhÿé§Ÿ×\sM,X° ‘­]»6zõê£G�ŽêÕ«qNNNÜ}÷ÝñÖ[o%å\pA\uÕUñ�ü£@=8q•ô÷Úp¢8Þ~ R­U«VIëùóçÇ9çœó™Ï¿÷Þ{ñ£ý(öìٓȾüå/ǬY³ùAjÇbáÂ…Ñ´iÓ8ï¼ó ¼gΜ91uêÔ¤¬sçÎѶmÛ"ë¥�AŸ'¨É“'ÇK/½””�7.¾ð…/Ë}HZgddúŒråÊ%­ÿû§ÎǯÃýÒÿþƒ¦u¸=›6m*ð ÏˆˆK/½4rsscáÂ…IgLœ81~ö³ŸEµjÕ»/'''î¹çžC†|vìØ1éééî”^o¼ñÆ!ïDFD¬\¹2i}àÀ�X¼xñaϨW¯^4oÞ¼Húlݺ5úõë»víJd•*UŠýèG±|ùòBŸ×±cÇÏüì�wÞ‰Ûo¿=Z·n—^zi|ík_‹-Zò~ç¾}ûâ•W^‰Ù³gÇ’%K’>«Q£FŒ5ªÐ½àDbÐç hþüù1gΜ¤ìG?úQ|ûÛß.¶;Ë—/Ÿ´ÎÎÎ.ôYYYG<8>U¯^ý�lãÆ�Ñ¢E‹B�³qãÆC²;vºÏå—_¹¹¹±hÑ¢D¶aÆİϪU«&=Ÿ““÷Þ{o,[¶,)?çœsâÇ?þ±!Ÿp¹ñÆcÓ¦MŸûÜöíÛ£oß¾‡ý¬k×®1iÒ¤"é³nݺغukR¶wï޸ᆎê¼U«V}î3+W®Œ•+WÆ=÷ÜeË–� DÕªU####þùÏƦM›ûžhåÊ•cúôéñ¥/}騺À‰Â ÏÌSO='NLʺuë?ýéO‹õÞJ•*%­÷Óì?Ïþýû�xæ±jÙ²e”-ë?ò—S]€“È©§ž*THu 8ÎùþŒ’s¼}V·nÝhÓ¦M‰ÞÙ²eË7n\ìÛ·/‘mܸ±P=Ö¯_;wî<$¯ZµêQ}=mÚ´‰ÚµkǯýëDöÁÄÝwß3gÎL 'ÍÉɉ›nº)Þxã�¤ý^xaÜqÇ~/ Èøþ 81”ô÷ÚPZíß¿?Ö®]›Xo¿‡P999‘™™™ê�r999‡ýam;ãŒ3bÊ”)†|@ôyByá…âæ›oŽüüüDö­o}+&L˜iiiÅz÷ÁC9ÿ{°GA¼§¨}V¨P!222ŠôL€T¨P¡BT¬X1Õ5øÿoߟedd¤¤ÏW¿úÕxùå—ëçŸ>öíÛµjÕ*ÐþÇ{ì°yvvöQ=×_}DDÒ°ÏU«VÅ AƒbîܹQ¹rå9rd<ÿüóIû:wî÷Þ{¯ßGàÇÓ÷þPšo¿‡PÙÙÙ©®%îûßÿ~T«V-–.]™™™Ÿû߃òåËG‡â‡?üatêÔ©ØßU€Ò ÏÄ«¯¾×_}äää$²óÏ??îºë®(S¦L±ß_»ví¤õG}Tè3¶nÝzÄ3€ã×W\‘4èóÀ�1~üø¸çž{>wïßÿþ÷øío{ØÏöîÝ{L½®¿þúÈÍÍ�3f$Ý×·oßhÔ¨Q<óÌ3IÏwêÔÉ�O8‰üŠêU« üì9çœS¨ç�ÅgœgœqFDDdeeÅÚµkcãÆ�±e˖سgOäääD•*U¢ZµjÑ´iÓøò—¿åÊ•+‘nPšôyxûí·cРAqàÀ�DÖ¾}ûøÕ¯~Ub/P6mÚ4i½yóæBíÿøã�“úgddDãÆ�‹¤Pü.¾øâ8å”Sâý÷ßOdüã£^½zqÓM7}æ"Y¹reôïß?²³³‹­ÛO~ò“ÈÎÎŽÙ³g'²+VÄŠ+’žûÚ×¾÷ÝwŸ?� œôÊ•+­[·ŽÖ­[§º ”:é©.À±Y¹re\wÝu±wïÞDÖ¦M›˜5kVTªT©Äzœzê©Ië>ø ²²² ¼Íš5Ië/}éKQ¶¬9´PZ”)S&î¸ãŽCþ~~îܹѭ[·xì±ÇbÓ¦M‘••Ÿ|òI¼ùæ›1a„èÞ½{lÛ¶-""jÖ¬yȹժU+’~#GŽŒÞ½{æç;vŒiÓ¦ò “K±µk×F¿~ýâ“O>IdÍš5‹x ªV­Z¢]êÖ­uëÖM æÈÊÊŠ+VDûöí ´ÿÍ7ßLZùË_.òŽœ#"öïßC‡�ûï¿?ªT©R$÷'§ôT ð¶nÝ}úô‰�>ú(‘Õ¯_?æÎ�õë×OY¯Î�;'­{ì±ÈÏÏÿÜ}|ðA,Y²$±ÎÈȈo|ãEÞ€‚™3gNüä'?‰‹.º(Î=÷ÜøÑ�~÷Þ{o¼ð ‡ ù<^lذ!®¸âŠ1bD¼óÎ;Ÿ9ä3"bûöí1cÆŒ¸øâ‹ãÅ_,Á–'� /¼0ž}öÙ¸öÚk�øIÊ•+Ý»w�'Ÿ|2Î?ÿüøç?ÿyÈ3‡þYXùùùqë­·Æc�=ö™Ï,[¶,®»îºØ³gÏ1ßœ¼Ê¦º…³k×®èׯ_|ðÁ‰¬V­Z1gΜhܸq ›E|ík_‹ $�nÚ´)}ôÑèÞ½û÷Ýwß}IA¿õ­oEÕªU‹µ+ŸmÒ¤I©®P(ï¼óNôïß?vîÜY¨};wîŒ�ÆäÉ“ã;ßùN1µ8yÕ¬Y3nºé¦¸ñÆcÅŠ±jժرcG|úé§QµjÕhÖ¬Yœ}öÙQ¥J•ÄžÕ«W'�Q¦L™hÓ¦Í1õÈÏÏ�Ûn»-y䑤ü¼ó΋&MšÄoûÛDöæ›oFÿþýcÖ¬YQ©R¥cº89ôYŠ|úé§ñ£ý(Þ{ï½DV­Zµ˜={v4kÖ¬HïÚ¸qc\xá…IÙ_þò—hÔ¨Ñgî)W®\ 80ÆŽ›È&Ož_ùÊW¢yóæ‡ÝóÔSOÅ“O>™X—)S&†zlå8ilݺ5~üã2ä³iÓ¦qÍ5×ĹçžuëÖ�}ûöÅš5kâøC<þøã‘››yyy1jÔ¨hÔ¨Q´oß>_À /---Ú¶mmÛ¶ýÜg333“ÖÍš5;æ�›ãÆ�‹E‹%eçž{nLŸ>=Ê—/ùùùñÐC%>[ºti 0 fΜ+V<¦»€“�AŸ¥È AƒâÝwßMÊúôé;wîŒÅ‹ê¬ÓN;-ªW¯^”õ""¢{÷îñàƒ&†‘~òÉ'ñÃþ0F�—_~y”-û¯ÿÈíÚµ+æÎ�3fÌHÚߣG�hÚ´i‘÷àèUªT)1˜©]»v1bĈTWJ5jTlÛ¶-)ëÑ£GÜzë­‘‘‘‘ȪU«õë×�Ž;ÆUW]ýû÷�]»vEDDvvvüìg?‹§žz*Ê”)S’õ8È«¯¾š´îرã1�7a„X¸paRÖ¡C‡˜>}zT¨P!""ÆŽyyyñðÃ'žyýõ×Ã>ÿý@AôYмþúë‡dS§N=ª³æÏŸçœsαV:DFFFÜ{ï½ñƒü 1@m×®]1räȸýöÛãK_úRìß¿?6mÚÙÙÙI{O?ýô9rd‘w pN?ýôh×®]âש§žééé‰Ï�—AŸo½õV¼üòËIÙ…^ãÆ�;â¾3Î8#f̘?øÁ"777""Ö¬Y�?þxtïÞ½Øúpd7nŒeË–%eÇòýÙĉcÁ‚IÙYg�3f̈Š+&²´´´7n\äææÆ£�>šÈ_{íµ4hPLŸ>=Ê—/Ô=€“Kúç?…Ó¬Y³˜7o^4lØ0)ß»wo¬\¹2Ö¯_È�ÏŽ;Æ<*T(ɪÆ#�<cÆŒ‰®]»FóæÍ“†|OÚ”‘‘cÇŽ-ÐÞ¯|å+qÕUW%eÓ¦M‹¼¼¼B÷xæ™gbóæÍ…Þ÷YöíÛ‹-*²óJ‹ùóçG~~~bݾ}ûhÑ¢ÅQ�uÇwļyó’²3Ï<3fΜ•*U:äù´´´˜0aBtëÖ-)_¼xqüøÇ?ŽUàäs|Nî¢Ôkݺu<ùä“1`À€¨^½úg>פI“˜0aBÌž=;ªU«V‚ (ÍòóócñâÅIÙE]õêÕ+ð={öLZøá‡±lÙ²BõøÓŸþ#FŒˆÞ½{Ç–-[ µ÷pöïß ˆ1cÆÄ=÷ÜsÌ甫V­Š|0)0`ÀQ�5eÊ”˜={vRÖ¾}û˜5kVT®\ù3÷¥§§ÇÏþóøîw¿›”¿üòË1dÈ�ÈÊÊ:ª>ÀÉ¥lª Pp«V­*±»5jtÌ÷U©R%~ò“ŸÄСCãí·ßŽ÷Þ{/víÚeÊ”‰ºuëF›6m¢U«VEÔ€“ÉÚµkcÇŽIYÇŽ uFóæÍ£nݺ±mÛ¶DöÜsÏÅW¿úÕíÿË_þ7ÞxcäææÆû�zõŠùóçGýúõ Õãßöïߌ×^{-""¦OŸ1dÈ�£:àXü÷ë:tˆ Ë]~øa 4(rrrÙ%—\ßüæ7 }Ö=÷ܳfÍJÊÎ8㌸ÿþû£J•*Ÿ»?===&MšyyyñÔSO%ò—^z)†÷Ýw_”+W®Ð½€“Gzª pâËÈȈ³Î:+¾ÿýïÇ Aƒ¢ÿþѵkWC>8j[·n=$kÑ¢E¡ÏiÙ²eÒú…^(ðÞíÛ·' £Z¿~}ôîÝ;iphA8p ¯¼òJR¾yóæBŸ�Jï½÷^<øàƒ±gÏž=ÿâ‹/ÆøÃØ´iS"«Q£FŒ=ºÐwϘ1#¦OŸž”µk×.xà� ùü·ôôô¸ãŽ;â²Ë.KÊÿïÿþ/†^è^ÀÉ¥lª ÖÎ�;ɪU«VèsÞóþûïÇþýû£B… Ÿ»·G�‘““ãÆ�KdëÖ­‹Þ½{Çüùó£N�:ê�••ƒŽ—_~9)ïÖ­[L˜0¡@g'¶åË—ÇÓO?]àç/^8ìgÕªU‹þýûUµCìØ±#Æ�wÞygœwÞyqÁDëÖ­£Q£FQ¥J•سgOlß¾=–.]þóŸcÉ’%IûË•+¿úÕ¯¢nݺ…¾ûì³ÏŽJ•*ÅÞ½{#"â´ÓN‹Ù³gGÕªU }V™2ebòäÉ‘›››økŸ––�:u*ôYÀÉÅ Oà„�––vÌ{òòòbݺuñå/¹@ûøÃFvvvüâ¿HdkÖ¬I û¬]»ö÷geeÅ�!Câ¯ýkRÞ¥K—øùÏ~T_pâÉÌÌŒY³føù7ß|3Þ|óÍÃ~Ö°aÃbôùoûöí‹çŸ>žþùï©ZµjüêW¿Š³Ï>û¨î<óÌ3ã׿þu 0 š5ksæÌ9ªaðÿV¶lٸ뮻"///þüç?Çèѣ㪫®:êó€“à 5èsçÎ�±cÇŽØ·o_ìÛ·/rrr¢bÅŠQ±bŨR¥JÔ¯_?Ê–=¡¾d8)n`Ó?ÿùÏBŸs¸=«W¯.ð Ïˆˆ>}úDnnnLž<9éŒ>}úļyó¢V­Z‡Ý—••Æ ‹_|1)¿üòËcÒ¤I‘žž^à¥]‡bâĉѸqãc:ç¼ó΋Y³fEË–-£zõêÇÜ«lÙ²q÷ÝwÇK/½^xá1Ÿ¥•÷3 ®T¾UùÏþ3Þyç�X¾|y,_¾<Ö¯_›6mŠýû÷q_ZZZÔ­[75j­[·Ž¶mÛFÛ¶m£E‹%Ô( uêÔ9${ï½÷â+_ùJ¡ÎÉÌÌ<$Û²eK¡û\{íµ‘““wß}wÒÙÿöY³fͤ糳³cøðáñ /$å—\rILž<9Ê”)SèǃV­ZÅO~ò“xñÅãÝwß�¬¬¬Ï|6###:vì?üáãßøF‘u8çœsŠì¬ˆõ4䀓…÷3€TÚ¹sg,_¾<Þ}÷ÝÄ»LÛ¶mKzfÈ�!1tèÐ5L¶iÓ¦D×wß}7V¬X{öìIzfþüùEþg �ã_©ô¹|ùòxñÅ㥗^ŠåË—G^^^â³üüü�‘ŸŸ[¶l‰­[·Æ›o¾™ÈkÕª\pA|ýë_�¯}íkQ­Zµ"ï�æÍ›G¥J•bïÞ½‰ìÕW_�+¯¼²Àg¬]»6¶nÝzHþßgÆ€"'''¦N�šÈV­Z}ûö�¹sçF�5"""'''FŒùË_’öë[ߊ»îºË�Oàݺu‹nݺ•è�«V­:ª}5jԈĀ"+++Þ{ï½xÿý÷cëÖ­±wïÞ([¶lÔ¨Q#š4imÛ¶�J•*qs °¼Ÿ ¤Òœ9sÃ27lØ�ê:G´}ûöx衇ƒ=wìØ‘êJÀqê¸ô¹aÆxâ‰'â©§žŠ>ø ‘îÅÑ´´´Ÿ{ðþ�?þ8ž|òÉxòÉ'####:uê]ºt‰o|ã‘‘‘qô_P,Ê–-gžyf¼üòˉìÙgŸ�;vD­Zµ tÆoûÛÃæG;è3"bðàÁ‘““¿þõ¯Ù?þñ�İÏÊ•+ÇO~ò“xöÙg“öuîÜ9î¾ûî([ö¸þÖ  PÊ•+§�vZœvÚi©®Äû™ÀñbÒ¤I©®P`kÖ¬‰ûî»/Õ5€Rผ&õÒK/żyóbñâÅq苟…yiôp·ÿßwdeeųÏ>Ï>ûlÔ¬Y3®¾úêøÁ~uêÔ9¦;€¢uÅW$ úî¹çžÏÝû÷¿ÿ½X}FD\ýõ‘››3fÌHº¯o߾ѨQ£xæ™g’žïÔ©SÜ{ï½þð P켟 PüŽ›AŸyyyñØc�ÅìÙ³cݺuñŸ—;�ôâèá~z|A|æ¯ÿ}æŽ;âþçbÖ¬Yqùå—Ç€¢I“&GuP´.¾øâ8å”Sâý÷ßOdüã£^½zqÓM7E™2e»oåʕѿÿÈÎÎ.¶n?ùÉO";;;fÏž�ÈV¬X+V¬Hzîk_ûZÜwß}Q®\¹bëœÜ¼Ÿ ”&•*UжmÛFÛ¶m£]»v1bĈTW:¢:uêD»ví¢mÛ¶‘žž÷Þ{oª+Ç�ãbÐçïÿû¸ï¾ûâƒ>Hz1ôà—=~i´f͚ѢE‹hذaÔ«W/4hÕªU‹òåËG… ¢L™2qàÀ�Ø¿ìß¿?¶nÝ[¶l‰-[¶ÄÚµkãý÷ß�ÜÜÜCî;ø¥ÒìììøÝï~O=õT|÷»ß�ÁƒÇ¿øÅâøKP™2eâŽ;={FNNN"Ÿ;wn¼úê«Ñ»wï8çœs¢nݺ±oß¾X³fMüñ�Œ‡z(1ä³fÍš±sçΤs«U«V$ýF޹¹¹1oÞ¼Ã~Þ±cǘ6mš!Ÿ@±ñ~&p¼;ýôÓ£]»v‰_§žzj¤§§'>?ž}V¨P!Î;D¾_øÂŸ¿öÚk)lOR:èóµ×^‹ŸÿüçñÞ{ï}æO‡ÿw^¶lÙh×®]tèÐ!Î:ë¬hÕªUÔ«Wï˜îÏÊÊŠÕ«WÇòåËãµ×^‹×_=¶mÛ–ø<---Ñ'???rrrâ±Ç‹'Ÿ|2zöìC† ‰Ê•+Sàèµoß>ÆŒcÇŽ�¼¼¼D¾råÊ5jÔ÷–/_>¦L™×^{mR^Tƒ>#þ5ìó¥—^ŠuëÖ%å*TˆÉ“'Gùòå‹ì.€ó~&PZ<òÈ#©®P`gœqFÌ�;7¥žyæ™8ýôÓ“Œ‹}ûöÅ“O>=zô(’ó€IÉ Ï-[¶Ä¤I“âé§ŸŽˆ½¤yðOi�ˆ¨ZµjtêÔ).¾øâ8ÿüó£bÅŠEÚ£\¹rѦM›hÓ¦M\uÕU±fÍšøóŸÿÏ>ûlüýï�ˆC_(ÍÎÎŽ¹sçÆSO=7Þxc|÷»ß-Ò^@ÁõèÑ#êÔ©#GŽŒÝ»whOݺuãŽ;îˆæÍ›òYQ úÌÏÏ�Ñ£G2ä3"bÿþý1tèиÿþû£J•*Er€÷3N\úÓŸâ†nˆF�Å‚ ¢~ýúÇtÞþýûcÀ€ñÚk¯Å‡~#FŒ(¢¦@J}^rÉ%±ÿþÄ ¤ÿý’fzzz|ýë_�+¯¼2¾ñ�oDFFF‰vkÖ¬Y 4( 7nŒÿýßÿ�Ç<¶lÙ‘ÔuûöíqóÍ7ÇÇýúõ+ÑžÀ\xá…ñì³ÏƬY³âñÇ�;vö¹råÊE—.]â†nˆZµjÅ{ï½wÈ3‡þYXùùùqë­·Æc�=ö™Ï,[¶,®»îº¸ÿþû£råÊÇ|'€÷3NLùË_âÆoŒÜÜÜxÿý÷£W¯^1þü£ö¹ÿþ8p`¼öÚk1}úôÈÈȈ!C†em8i¥dÐç¾}ûy�´zõêñƒü zôè 4HE­C4jÔ(†Æ ‹ÿû¿ÿ‹yóæ%þÇ(---ñ“í÷îݛʚ@DÔ¬Y3nºé¦¸ñÆcÅŠ±jժرcG|úé§QµjÕhÖ¬Yœ}öÙQ¥J•ÄžÕ«W'�Q¦L™hÓ¦Í1õÈÏÏ�Ûn»-y䑤ü¼ó΋&MšÄoûÛDöæ›oFÿþýcÖ¬YQ©R¥cºÀû™'¦íÛ·GNNNb½~ýúèÝ»w,X° êÖ­[¨³8ƒŽW^y%)ß¼ys‘tR4èóßòóó£AƒѧOŸ¸êª«ŽÛWéééѹsçèܹs¼óÎ;qÿý÷ÇsÏ=—x‘8~¤¥¥EÛ¶m£mÛ¶ŸûlfffÒºY³fÇüýȸqãbÑ¢EIÙ¹çžÓ§O�òåËG~~~<ôÐC‰Ï–.] ˆ™3gFÅŠ�én€ïgœhzôè9991nܸD¶nݺèÝ»wÌŸ??êÔ©S s²²²bðàÁñòË/'åݺu‹ &ig8™¥lÐg�5bРAñýï?222RU£ÐN?ýô˜:ujdffÆ]wÝ/¾øbª+GéÕW_MZwìØñ˜Î›0aB,\¸0)ëСCLŸ>=*T¨cÇŽ�¼¼¼xøá‡ϼþúë‰aŸÿ~8þÕúëyñÑ_S\„ZÓáY©®@)ãýL€ÓøÃÈÎÎŽ_üâ‰lÍš5‰aŸµk×>âþ¬¬¬2dHüõ¯ÉH¾K—.ñóŸÿ<ÒÒÒŠ¥7œŒR2èsРAqíµ×F•*URq}‘hÙ²e̘1#–.];wîLu �6nÜË–-Kʺwï~ÔçMœ81,X�”�uÖY1cÆŒ¨X±b"KKK‹qãÆEnnn<ú裉üµ×^‹AƒÅôéÓ£|ùòGÝ8yy?àÄÖ§OŸÈÍÍ�É“''²Õ«WGŸ>}bÞ¼yQ«V­ÃîËÊÊŠaÆòC˜/¿üò˜4iR¤§§ko8Ù¤ä¿Q×_}©~‰ô¿�uÖYñÿþßÿKu  �æÏŸùùù‰uûöí£E‹GuÖwÜóæÍKÊÎ<ó̘9sfTªTé�çÓÒÒb„ Ñ­[·¤|ñâÅñãÿ8üìÝ{˜UeÙ8þ{o†T4S<¦‰Šh’ X&jß^ÍJ¥RK<Ĥ‚i¨¡!ŽxN%N‚@™gÍ4O¯�—„ S%5O¡ˆ`0ÃÌìßüغ9Í�½gÏ ŸÏuÍ%ë^Ïzž{ÃrÍ33÷Ü{õêzålÝÔg4gŸ}v 2$#¶páÂèׯßFß`yÍš51hРxöÙg3âÇ{lŒ5*Z´h‘Ó|ak¤u.°ÕY°`Aüñ�̈•””Ôk®ë®».&Nœ˜;øàƒcüøñѶmÛM^—L&㪫®ŠN8!#>cÆŒ0`@TTTÔ+š·’’’¸à‚ 2b ,ˆ3Ï<3–-[–ŽUVVÆàÁƒãé§ŸÎû�ï|'®¿þzM>!G4úò®sçÎ}úôÉÙZ|ðAœ{î¹QYY™Ž{ì±qÔQGÕy®o¼1Æ�Ÿ;è ƒb„ Q\\\ãõÉd2JKKãûßÿ~F|úôé1pà@Í>بóÏ??Î;,Øk¯½gžyf,_¾<*++cÈ�!ñÔSOeŒ9úè£ã†nˆ‚‚‚†L¶*}MÖo¼üãcåÊ•µ?mÚ´8í´Óâý÷ßOǶÙf›6lX�×;vlŒ3&#Öµk׸ýöÛkÕäs�d2×\sMüññçž{. Tç¼Ø:\xá…QRR’›?~œyæ™1dÈ�xâ‰'2ÎõêÕ+n¾ùæhÙ²eC¦ [mt€ sçÎ�ǼÖãgΜ«W¯Þè¹öíÛGÿþý³•Ú–.]Ç�k¯½6zöìßüæ7cß}÷�]vÙ%Š‹‹cåÊ•±dÉ’xñÅãÉ'ŸŒ¿ÿýï×·jÕ*n½õÖØa‡ê¼v÷îÝ£¨¨(ÊÊÊ""¢K—.1qâÄh×®]�çjÑ¢EŒ5*ªªªÒ÷‰D"zõêUç¹Øz 2$Ö¬Y'NLÇæÍ›óæÍËwÄGÄ-·Ü­Zµjèa«£Ñ'�aáÂ…1~üøZ�Ÿ3gNÌ™3g£ç:uê”ÓFŸë”——Ç3Ï<Ï<óL­¯i×®]Üzë­Ñ½{÷z­Ù­[·=zt”””Ä^{í“&MŠöíÛ×k®ˆˆ‚‚‚¸þú룺º:ž|òÉ6lXœ|òÉõž€­ÃСC£ªª*&Ož¼Ñó‡~xÜvÛmš|BÑèØêôèÑ#FŽ»îºëÍÓ³gÏ?~|ì³Ï>Ñ¡C‡-Ϋ   n¸á†˜>}zsÌ1[<[‡¡C‡ÆôéÓã­·ÞʈƨQ£¢uëÖyÊ ¶>É|'P_�;wŽ!C†Ä׿þõß) eË–qä‘GƸqãbêÔ©[Üäs�C=4¶Ýv̱۬6OM>¨­T*Æ Û ÉgDĪU«bàÀ�±bÅŠýôÓ˜;wn¼úê«ñÊ+¯Äܹsãã�?Î3`À€8p`ž2Ìôþûï§s}õÕWcÞ¼y±råÊŒ1S¦L‰C=4OBö¤R©¸üòËã�Øä˜—^z)~ö³ŸÅ„ ¢mÛ¶ ˜l�4úš…V­ZE—.]¢K—.ùNš¼I“&¥›e¾ûî»ùNg³–,YwÝuWº±çÒ¥Kó�4ˆT*W^yeÜ{ï½ñž={Æ{ìúÓŸÒ±9sæDÿþýcüøñQTTÔЩÂVE£O Ciii¾S¨µE‹Å-·Ü’ï4 Á ><î¾ûîŒØa‡cÆŒ‰Ö­[G*•Š»îº+}îÅ_Œ’’’7n\´iÓ¦¡Ó…­F2ß µ7bĈ¸óÎ;3b=zôˆ1cÆDaaa$‰øõ¯'Ÿ|rƘٳgGIII¬Zµª!Ó…­J“hôYUUÓ¦Mk�µf̘ ²@¾¨Ï .ŠŠŠ¢G�qÖYgÅ�7Þ˜ïtj´ýöÛÇQGŒ /¼0ßé@V�92¦N�š;ä�CbìØ±Ñ¦M›t,‘HÄðáÃã‡?üaÆØY³fŹçž«W¯n�|akS�ïj²fÍš8p`L›6-.»ì²èÓ§OÎÖz衇âW¿úUtïÞ=݉ ¹QŸ @M<ðÀèÚµkúã+_ùJ$“ÉôùÁƒç1»L………ѳgÏŒ|wÚi§ôùY³få1;È®k®¹&&OžœëÖ­[Œ7.ŠŠŠ6ŸH$bĈ‘J¥â�HÇgΜç�w^Œ=:Z·n�ó¼akÒ¨}VTTÄùçŸ3f̈T*#GŽŒêêêèÛ·oÖ×zà�âòË/�ªªª˜5kVœsÎ9›|X4Uê3¨�{ï½7ß)ÔÚAwÜqG^sxâ‰'âÀÌh0º%ÊËËãᇎSN9%+óÑ<\wÝu1qâÄŒØÁãÇ��¶mÛnòºd2W]uUTUUÅŸÿüçt|ÆŒ1`À€¸í¶Û¢U«V9˶6Éš‡äGuuuôïß?f̘k;§R©(--Ýàá²¥î»ï¾6lXTUU¥×ùÇ?þg�uVTTTdu-€|QŸ Ù÷Øc�ÅàÁƒ£oß¾±xñâ-žoÕªUQRRW\qEÜxã�YÈ�/êܹsÆGŸ>}ò�R­Üxã�1~üøŒØA&Lˆâââ¯O&“QZZßÿþ÷3âÓ§O��ªë‚,j´�>“Édyä‘‘J¥"""•J¥‹<¯½öÚ 2õuï½÷ÆW\ÕÕÕ‘H$"âó¢ÕÃ?\ga ÙPŸ ÙõôÓOÇÅ_UUUñÎ;ïÄgœ±EÍ>W­Z?ÿùÏcÖ¬Y1f̘¸õÖ[³•.MÔØ±cc̘1±®]»Æí·ß^«&Ÿë$“ɸæškâøã�ψ?÷Üs1hРl¤ DDA¾Øœ3Ï<3‰D”––¦‹;×ý÷†nˆêêê())©÷üwß}wüæ7¿É("]W¸:`À€0`@V^@c¡>²gÉ’%QYY™>~ûí·£oß¾1uêÔØa‡ê4×êÕ«ãüóÏ�¿ýíoñ?ü0+¹6FsçÎ�ǼÖãgΜ«W¯Þè¹öíÛGÿþý³•ÚF=öØc1oÞ¼�žÛØ¿Ó=÷ÜÏ?ÿüFÇwéÒ%Ž;î¸Z­Û½{÷(**в²²ôµ'NŒvíÚÕ2óϵhÑ"F�UUUé¿ûD"½zõªó\ÀÆ5êFŸýúõ‹D"W_}õŤ7ÝtSTVVÆùçŸ_çyÿô§?Åoû[E¤4Û=ß3""þ³ñ=;dÅžƒ*ò�ÐÔg@vœrÊ)QYYÇOÇÞzë­èÛ·oL™2%¶ß~ûZÍSQQçŸ~̘1##Þ»wï1bDVsnL.\ãÇ�¯õø9sæÄœ9s6z®S§N9oô9mÚ´xðÁk=þ‘GÙ乓N:©Ö�>»uë£G�Ž’’’Øk¯½bÒ¤IѾ}ûZç±¾‚‚‚¸þú룺º:ž|òÉ6lXœ|òÉõžÈÔè}FDôíÛ7’Éd\uÕUé¢ÏuŤ·ÞzkTWWÇÀ�k=ßÿøÇ1bDº(5âó"Ò .¸ Î;ï¼ì¿€FD}&dÇi§�kÖ¬‰«¯¾:[´hQºÙgÇŽ7{}EEE 0 žþùŒø~ðƒŒú¶n={öŒñãÇÇ>ûì:tØâù â†nˆéÓ§Ç1Ç“… �u’ùN ¶úôé—_~yºà3âóbÒÑ£GÇM7ÝT«yþð‡?l²ˆtðàÁŠH€­†úLÈŽ~ýúÅ/ùˌ؛o¾ýúõ‹¥K—nòºŠŠŠ¸à‚ bÚ´iñï}ï{QZZÉd“iG8ôÐCcÛm·ÍÚ|-[¶Ôär  ß ÔÅi§�‰D"~ûÛߦcëŠIÇŽUUUñ‹_üb“×O™2%®¾úê�‘2$ú÷ïŸÛÐȨÏ`kôé§ŸÆÜ¹sãÕW_�W^y%æÎ�üqƘÄÀ�ó”a¦÷ß?�뫯¾óæÍ‹•+WfŒ™2eJzè¡yʈˆ8ûì³£²²2n¸á†tlá…ѯ_¿˜õîÝ;z÷îÝ k.X° Þ×–––Fiii³š£&Õè3"â§?ýi$“ÉøÍo~“Ž­+&�0aBTUUmÐÍ:"bòäÉQZZºÑ"Ò‹.º(Î9眆y�ŒúL¶“&MJ7Ë|÷Ýwó�Îf-Y²$îºë®tcÏ¥K—æ;% –JJJ¢²²2~÷»ß¥c ,ˆ3Ï<3î¸ãŽØf›m""¢²²2O?ýtÆõßùÎwâúë¯ß*š|4WM®ÑgDÄ©§žÉd2®¼òÊtl]1é¤I“¢ºº:.¹ä’ô¹;î¸#®¹æš�‘þò—¿Œ³Î:«a_@#£>€æ®´´4ß)ÔÚ¢E‹â–[nÉw@=�þùQYY£G�NÇ^{íµt³Ï¶mÛÆ�!Câ©§žÊ¸îè£�Žn¸! šd‹8þMö)~òÉ'G"‘ˆ+®¸"[WL:yò䨪ªŠ_ýêWqûí·Çu×]·Ñ"ÒK.¹$úõë—�ôõ™�^xaTUUÅØ±cÓ±ùóçÇ™gž»ì²K<ñÄã{õê7ß|s´lÙ²¡S Ëšl£ÏˆˆÿøÇ‘L&ãòË/O‡®+&ýÃþ¯¾új¼üòË-"½ôÒK£oß¾yË 1RŸ ÀÖ¢¨¨(8à€8à€¢k×®1xðà|§´YÛo¿}tíÚ58à€H&“qóÍ7ç;% C† ‰5kÖÄĉÓ±yóæÅ¼yó2ÆqÄqË-·D«V­:Er I7úŒˆøáÉd2~õ«_mPLº©"Ò_ýêWѧOŸ¼å И©Ï 9:ðÀ£k×®é�¯|å+‘L&ÓçS£ÏÂÂÂèÙ³gF¾;í´Súü¬Y³ò˜PC‡�ªªª˜#Ö~Ž8p`L˜0!Š‹‹ó�¹�ÌwÙôÎ;ï¤ß>•J¥ÿ¼Î¿ÿýï|¤Ðd©ÏBiii<úè£�¾ÉgDÄ¢E‹â–[n‰iÓ¦iòI³ôôÓOÇÅ_UUUñÎ;ïÄgœ‹/®÷|«V­ŠŸÿüç1kÖ¬ˆˆ3fLÜzë­ÙJµT*—_~y<ðÀ›óÒK/ÅÏ~ö³X¹ref@.5›FŸ7ß|sŒ=:‰Dº€tÝ;Ư‹Mž<9FŽ™Ï4š õ™°õY²dITVV¦�ß~ûíèÛ·o|üñÇužkõêÕqþùçÇßþö·Œø‡~¸Åy@c—J¥âÊ+¯Œ{ï½7#Þ³gÏøÉO~’›3gNôïß?ÊÊÊ2Er¤ ß dÃM7ÝcÆŒ‰ˆµE£ë HS©ÔŤS§N�êêê6lXÞòhìÔgùTTTp@pÀѵk׺víp@$“ɸùæ›ó�ÔÛ)§œ•••1|øðtì­·ÞŠ¾}ûÆ”)Sbûí·¯Õ<qþùçÇŒ32â½{÷Ž#Fd5ghŒ†wß}wFì°Ã‹1cÆDëÖ­#•JÅ]wÝ•>÷â‹/FIIIŒ7.Ú´iÓÐéfØîùžñŸçóšÍÜžƒ*ò�äL“oôyã�7ÆØ±c#"6( ýÑ�~=ôPTUU¥Ï§R©øãÿÕÕÕqÅWä-o€ÆJ}&ÐÐ<ðÀèÚµkúã+_ùJ$“ÉôùÆÔè³°°0zö왑ïN;í”>?kÖ¬þøã:ϵzõê8ÿüóãoû[FüÃ?Üâ}úô8p fŸML“jô9bĈ˜2eJDd‘¶hÑ"®¹æš8ñÄ7{ý·¾õ­¸í¶Û6ZLúàƒÆ¥—^š³Ü#õ™MÇ)§œ—_~yFì­·ÞŠ¾}ûÆ’%Kj=OEEEœþù1cÆŒŒxïÞ½cĈYÉ•æç /Œ’’’ŒØüùóãÌ3ÏŒ!C†ÄO<‘q®W¯^qóÍ7GË–-2MhpcÇŽ�1cÆdĺví·ß~{­š|®“L&ãšk®‰ã�?>#þÜsÏÅ Aƒ²‘* ¤É¼ÕÁoûÛøãÿ‘^{íµñÝï~·Vó|ó›ßŒÑ£GÇù矫W¯NÏ—J¥â¡‡Šêêê(--M¯Ð\©ÏhzN;í´X³fM\}õÕ騢E‹¢oß¾1eÊ”èØ±ãf¯¯¨¨ˆÄóÏ?ŸÿÁ~W]u•Ÿé°YC† ‰5kÖÄĉÓ±yóæÅ¼yó2ÆqÄqË-·d¼a MÏܹsãñǯõø™3g¦kGÖ×¾}ûèß¿¶RÛ¨Ç{lƒÏIë|øá‡Äî¹çž öDëtéÒ%Ž;î¸Z­Û½{÷(**в²²ôµ'NŒvíÚÕ2óϵhÑ"F�UUUé¿ûD"½zõªó\äO“hôù›ßü&þô§?EDfiAAA\wÝuqì±ÇÖi¾o|ãñûßÿ>Î;ï¼XµjUzÞT*?üpTWWǨQ£|ãh¶Ôg4]ýúõ‹ªªª5jT:öæ›oF¿~ýbòäɱÝvÛmôºŠŠŠ¸à‚ bÚ´iñï}ï{QZZÉd2§yÓ< :4ªªªbòäÉ=øá‡Çm·Ý¦É'@3°páÂ?~|­ÇÏ™3'æÌ™³Ñs�:uÊy£ÏiӦŃ>Xëñ�<òÈ&Ï�tÒIµnôÙ­[·=zt”””Ä^{í“&MŠöíÛ×:�õÄõ×_ÕÕÕñä“OưaÃâä“O®÷|4¼FÿÕõW\±É"Òo¼±ÎE¤ëôìÙ3ÆŒ………éØºbÒGy$.ºè¢¨®®ÞòÐȨÏhúÎ>ûì2dHFlá…ѯ_¿øôÓO7¿fÍš4hP<ûì³ñc�=6F�-Z´Èi¾4/C‡�=÷ÜsƒxaaaŒ5*Z·n�‡¬ zöìãÇ��‰'F‡¶x¾‚‚‚¸á†bôèÑqúé§g!CR£nô9lذ¸÷Þ{#"³ˆ´eË–ñ»ßý.þßÿû[4ÿ¡‡ãÆ�Ûh1é_ÿúWŤ@³£> ù())‰ .¸ #¶`Á‚8óÌ3cÙ²eéXeee <8ž~ú錱ßùÎwâúë¯×ä“:I¥R1lذxë­·68·jÕª8p`¬X±"™@~z衱í¶Ûfm¾–-[Æ1Ç“µùh8ùN`s’Éd¤R©Œ"ÒV­ZÅ-·ÜGydVÖèÞ½{Œ?>ú÷ïåååñy1éºuš õ™ÍËù矕••1zôètìµ×^‹3Ï<3î¸ãŽhÛ¶m 2$žzꩌëŽ>úè¸á†¢  Q·¡‘I¥Rqùå—Ç<°É1/½ôRüìg?‹ &DÛ¶m0;²­wïÞÑ»wï]sÁ‚õ¾¶´´4JKK³˜ ÔO2ß lÎðáãOŸ>‘J¥""¢uëÖqÛm·e­ˆt�C9$Æ�EEE±ö ÊÞ½{Çu×]Éd£þ+¨õ™ÍÏ…^%%%±ùóçÇ™gžC† ‰'žx"ã\¯^½âæ›oŽ–-[6dš4q©T*®¼òʸ÷Þ{3â={öŒŸüä'±9sæDÿþý£¬¬¬!Sh}•ä¯~õ«8çœs¢uëÖ1f̘8âˆ#r²Î׿þõô»@üô§?�‘#GzÇx YRŸ Ðü 2$Î:묌ؼyó6hòyÄGÄ-·Ü­ZµjÈôh†wß}wFì°Ã‹1cÆÄ•W^§žzjƹ_|1JJJ¢¼¼¼!ÓÈ»‚|'P]tQœrÊ)±ë®»æt�ƒ>8zè¡Øe—]rº@¾©Ïh~†UUU1yòä�ž?üðÃã¶ÛnÓä“:1bDÜyç�±=zĘ1c¢°°0""~ýë_GuuuÜsÏ=é1³gÏŽ’’’7n\z@s—Ìwµ•ë"Òu‘[ õ™ÍÏСCcÏ=÷Ü ^XX£F�ŠÖ­[ç!+š²‘#GÆÔ©S3b‡rHŒ;6Ú´i“Ž%‰>|xüð‡?Ì;kÖ¬8÷ÜscõêÕ ’/@¾5™FŸÀ¦¥R©6lX¼õÖ[œ[µjU 80V¬X‘‡Ìhª®¹æš˜øà?~|´mÛv“×%“ɸꪫâ„NȈϘ1# 9É ±Ðèš°T*W^yeÜ{ï½ñž={ÆO~ò“ŒØœ9s¢ÿþQVVÖ�)nµ:wîœñѧOŸ|§T+7ÞxcŒ?>#vÐAÅ„ ¢¸¸¸Æë“Éd”––Æ÷¿ÿýŒøôéÓcàÀ�š}ÍšFŸÐ„ ><î¾ûîŒØa‡cÆŒ‰+¯¼2N=õÔŒs/¾øb”””DyyyC¦I1vìØ3fLF¬k×®qûí·×ªÉç:Éd2®¹æš8þøã3âÏ=÷\ 4(©4JùN¨Ÿ#FÄ�wÞ™ëÑ£GŒ3& #"â׿þuTWWÇ=÷Ü“3{öì())‰qãÆ¥Ç5wsçÎ�ǼÖãgΜ«W¯Þè¹öíÛGÿþý³•ÚF=öØc1oÞ¼�žûðÃ7ˆÝsÏ=ñüóÏot|—.]â¸ãŽ«ÕºÝ»w�¢¢¢(++K_;qâÄh×®]-3ÿ\‹-bÔ¨QQUU•þ»O$Ñ«W¯:ÏÐThô MÐÈ‘#cêÔ©±C9$ÆŽmÚ´IljD ><ªªªâþûïOÇgÍšçž{nŒ3&Z·nÝ`yçËÂ… cüøñµ?gΜ˜3gÎFÏuêÔ)ç�>§M›>ø`­Ç?òÈ#›Æ ‹“O>¹Þólí’ý%ß)°X´K¾3hÚ4ú€&æšk®‰É“'gĺuëãÆ�‹¢¢¢ Æ'‰1bD¤R©xà�Òñ™3gÆyç�£G�Þ*š}R;={öŒñãÇÇ>ûì:tØâù â†nˆéÓ§Ç1Ç“… ¯d¾jïºë®‹‰'fÄ>øà?~|´mÛv“×%“ɸꪫâ„NȈϘ1# 9É—¦éÐC�m·Ý6kóµlÙR“O`«P�ï ¡uîÜ9ã¸G�1uêÔ#vÐAÅ„ ¢¸¸¸Æë“Éd”––Fuuuüå/IǧOŸŒ[n¹%Zµj•õ¼ƒÞ½{GïÞ½tÍ ÔûÚÒÒÒ(--Íb64„d¾j6vìØ3fLF¬k×®qûí·×ªÉç:Éd2®¹æš8þøã3âÏ=÷\ 4(©ÀV« ß °u›;wn<þøãµ?sæÌX½zõFϵoß>ú÷Ô6ê±Ç‹yóæmô܇~¸Aìž{î‰çŸ~£ã»téÇw\­ÖíÞ½{EYYYúÚ‰'F»víj™ùçZ´h£F�Šªªªôß}"‘ˆ^½zÕy.àsyiô9xðà2dHìºë®ùX>kR©TÜwß}ñãÿ8ÏÙ[3õ™@S¶páÂ?~|­ÇÏ™3'æÌ™³Ñs�:uÊy£ÏiӦŃ>Xëñ�<òÈ&Ï�tÒIµnôÙ­[·=zt”””Ä^{í“&MŠöíÛ×:�õÄõ×_ÕÕÕñä“OưaÃâä“O®÷|@D2‹>öØcñÝï~7®ºêªXºti>RØbO?ýt|ÿûß�+®¸"/^œït€­œúL€­CÏž=cüøñ1qâÄèСÃÏWPP7ÜpCŒ=:N?ýô,d[·‚|-\YYøÃâ¾ûî‹ýèGqÖYgÅN;픯tj%•JÅ£�>&Lˆ D*•ŠD"‘ï´"B}&ÀÖâÐCÍê|-[¶ŒcŽ9&«sÀÖ*o�>#Öf–——Çþð‡øÓŸþÇ|œzê©qðÁç3­ ,[¶,zè¡øãÿï½÷^¤R©|§°Qê3€¦¨wïÞÑ»wï]sÁ‚õ¾¶´´4JKK³˜ Ð\ä¥ÑçN;í~øaúÝÖS©TTVVÆÃ??üpì½÷ÞqòÉ'Çw¿ûÝèØ±c>RŒêêê˜5kVÜwß}ñ¿ÿû¿QQQ‘. ýbÞë^@>©ÏÈ¿¼4ú|ì±Çâ÷¿ÿ}Lš4)***6(Ì|ã�7bäÈ‘QZZ|p|ç;߉#�<2vß}÷œæµråʘ={v<õÔSñÌ3ÏÄòåË3òZ—çºØþûï—_~y£{‡{`ë£> ÿòÒè³°°0½{÷Ž«¯¾:ž{È|'öT*UUUñ�ü#þñ�ÄÕW__úÒ—¢{÷îÑ­[·Øwß}cŸ}ö‰âââzåP]]o¿ýv,\¸0^}õÕ˜={v¼öÚkQUU•Îa�õ H;vìŒSN9%ã@¾¨ÏÈ¿¼4ú\g÷Ýw�1cÆÄK/½7ÞxcÌž=;"6,Ü\gñâÅñè£�Æ£�>šŽí¸ãޱóÎ;ÇŽ;î;î¸c´k×. £°°0’Éd¬^½:V¯^eee±dÉ’øÏþ‹/Žwß}7***6ºÎú9¬;ß¡C‡8ûì³£OŸ>ѦM›¬þ]dƒúLššížïÿy>ωЬí9¨¢æAY�×FŸë|ðÁ1eÊ”øÛßþ&Lˆÿû¿ÿ‹ˆµÅœ+èü¢u…¡u±þëlj­í·ß>N?ýô8ýôÓëýõ I}&@Ãk�>×éÙ³gôìÙ3Þ|ó͘4iRüõ¯�òòòˆø¼ÈsýbψM†nÎÆæY¾ý÷ß?Î8ãŒ8þøã£eË–u^ ßÔg4œFÕès�½÷Þ;®ºêª¸ì²ËâñÇ�‡~8þþ÷¿GuuuDlXº¹¢ÐÚøb!ê—¾ô¥øÞ÷¾'œpBtîÜy‹æh,Ôgä^£lô¹NÛ¶mã‡?üaüð‡?ŒO>ù$žþù˜>}zÌœ93–-[¶ÁøÚ”®ÿîò-Z´ˆ.]ºÄ·¾õ­øÖ·¾]»vÝâÂT€ÆJ}&@î4êFŸ_Ô±cÇ8ñÄãÄOŒˆˆwÞy'æÍ›sçÎ�·ß~;>øàƒøàƒâ³Ï>Ûèõñå/9vÞyçØe—]¢sçÎqÀÄþûïmÚ´iÀWÐ8¨ÏÈ®&Óès}»ï¾{ì¾ûîñÝï~7#^UUåååQ^^UUUQXXmÚ´‰Ö­[ç)S€¦A}&°¾äEÉw lí’ï {šl£ÏMiÑ¢EGqqq¾ShÔgÔN2ß @s Ñ'd�FŸ�}@hô Y Ñ'd�FŸ�}@hô Y Ñ'd�FŸ�}@hô Y Ñ'd�FŸ�}@hô Y Ñ'd�FŸ�}@hô Y Ñ'd�FŸ�}@ä;�\[±bE”••EQQQç;€&O}&ÀÆ5›FŸï¼óNÌž=;^}õÕ˜;wn¼ÿþû±bÅŠ¨®®N�I&“Q\\;í´StíÚ5<ðÀ8ä�CbÏ=÷Ìcæ�“úL€ºiÒ�>+**â¯ýkÜ{ï½1gΜt<•Jmt|UUU,_¾<–/_ ,ˆûî»/""¾öµ¯Å)§œÇw\´nݺArhŒÔgÔ_“môùüóÏǯýëøàƒ"bÃâÑD"±ÉkS©TÆøþóŸñÏþ3~÷»ßÅ•W^Gydn’hÄÔgl™d¾¨«òòò¸è¢‹¢ÿþñþûï§‹B‰DÆÇæ¬?vÝ|ðAüüç?�_üâQVVÖ@¯ ¿ÔgdG“jôùé§ŸÆi§��>úèÅ£_´®0ts_´~Qé_ÿú×øéOŸ~úiC¾<€§> { ò�@mUTTÄ9çœóçÏ�ˆØhñhDD‡bŸ}ö‰Î�;ÇvÛmÅÅÅѦM›(//�+VÄÒ¥KcÁ‚±páÂX¾|ùs­+&}ýõ×ãœsΉ?ýéOѪU«z• G}&@v5™FŸ¥¥¥1oÞ¼��¶jÕ*N<ñÄøÞ÷¾Ý»wß`̦̞=;þò—¿ÄÃ?«W¯N‘®ûïüùóãꫯŽ+¯¼2/ ¯ÔgdW2ß ÔÆë¯¿wÝu×F‹H¿ýíoÇc�=Ç�=zÔºˆ4"¢G�ñÛßþ6þú׿Ʒ¿ýítiÄçï÷ÝwÇ믿žÕ×�oê3²¯I4úœ8qbTWW§�S©TDDœþùqë­·F§N�¶hþN�:Å­·Þç�w^zî/®5qâÄ-š ±QŸ �}�¾ÑgEEE<õÔSéwr_÷®î§�vZ 80«k]pÁqÚi§¥‹I×½küSO=kÖ¬ÉêZù¢> 7}£Ï¹sçFyyyFl§�vŠ‹/¾8'ë]|ñűóÎ;gÄV­Z¯¼òJNÖhhê3r£Ñ7úü׿þ•þóºw‹?餓¢uëÖ9Y¯°°0N<ñÄô»Æ¯óÖ[oåd=€†¦> 7}£ÏåË—o;ꨣrºæÑG]«<š"õ™¹Ñè}nÌÎ;ïܤçhlÔgl¹Fßè³]»vµŠeSqqqƒ¯ ÐPÔgäF£oô¹Ûn»mûè£�rºæ’%K6ˆíºë®9] ¡¨ÏÈ�Fßès¿ýö‹-ZdÄÞ|óÍœ®ùÆod'“ÉèÒ¥KN×h(ê3r£Ñ7úìСCtëÖ-R©T:ö׿þ5§k>úè£é?'‰èÖ­[´oß>§k4õ™¹Ñè}FDüä'?‰ˆµE�©T*üñX´hQNÖzóÍ7ãñÇO¯ñÓŸþ4'kä‹úL€ìk�>�;î¸8è ƒ"bm1éêÕ«ãâ‹/Ž•+Wfu�•+WÆ/ù˨¨¨H¯uÐAÅqÇ—ÕuòM}&@ö5‰FŸ‰D"®¹æšèСCúøµ×^‹>}úÄ’%K²²ÆÇ}úô‰ùóç§ß-~›m¶‰Q£Fee~€ÆD}&@ö5‰FŸ{ì±GŒ7.:tè©T*""æÏŸÇw\Lš4)Ö¬YS¯y׬Y“&MŠã�?>^{íµté¶ÛncÇŽ�ÝvÛ-›/ ÑPŸ �]ùN .<ðÀ¸ï¾ûâ—¿üeÌ™3'‰Dü÷¿ÿ�Q£FŘ1câÿý¿ÿG}tì·ß~±ÓN;mrž?ü0^{íµxæ™gâ©§žŠÏ>û,]œšH$âë_ÿzŒ5*:uêÔP/ /ÔgdO“iôyÆg¤ÿÜ¢E‹(((ˆªªªô;¼/_¾<î¿ÿþ¸ÿþû#"¢¸¸8¶Ûn»(..Ž6mÚDyyy¬X±"–.]+V¬HÏõÅÒT*-Z´ˆd2—^zi½sM$1yòäz_ÐÔgdW“iô9{öìH$±T*‰D"_Wñßÿþ7þûßÿFÄçE¢³þœUUUñâ‹/Ö;Ïu94vê3²«É4ú\gý‚Ð/¾ãûÆ 8S©TƘšæÜTÁim( š"õ™ÙÑä}ÖµX³6ã€[3õ™ÙѤ}nÉ»¹°!õ™MO*•ŠyóæÅk¯½K—.�ˆˆŽ;ƾûî]ºtÉj“ÕO?ý4æÌ™ï¾ûn”••EQQQìºë®Ñ­[·ØvÛm³¶4M¦Ñç€ò�@³¢>sC‹/ŽW^y%^~ùåxå•Wbîܹ±råÊôùN�:Å3Ï<“—ÜÖ¬YS¦L‰É“'ÇâÅ‹7:æË_þrôíÛ7úôé-[¶¬÷Z¯¿þzÜ|óÍñÜsÏEuuõç[´hGyd\xá…±ï¾ûÖ{hn4úØJ©Ï\ëÿøGLš4)^~ùåøè£�ò�ÎF}øá‡qÞyçÅüùó7;î?ÿùO\sÍ5ñÈ#�ÄïÿûØqÇë¼ÖäÉ“cÔ¨QQYY¹É1UUUñÌ3ÏÄôéÓã’K.‰>}úÔyhŽ’ùNòéÕW_�§žzªÑ6ùüä“OâŒ3ÎØ Égaaa|õ«_�½öÚ+Z·n�qnÞ¼yqÆgÄÒ¥Kë´Ö¤I“bäÈ‘4ùÜa‡¢K—.±Ã;dÄ+++cĈ1eÊ”:­Í•FŸ° EEEùN!.¹ä’ø÷¿ÿ�>nݺu\vÙeñ /Ä#�<ýë_ã…^ˆK/½4£áçÛo¿—]vY­×™3gN\{íµ±=zÄ<3fÌHÿ÷¾ûî‹=zdŒ»æškâ•W^©ç+€æC£Oˆˆ¶mÛF�=âì³ÏŽ›o¾9žyæ™3fL^sš1cFLŸ>=}ܲe˸ýöÛ£o߾ѦM›t¼¨¨(úõë&Lˆ–-[¦ãÏ>ûl¼ð µZkÔ¨QQUU•>>ꨣâöÛo�.]ºdŒëÚµkÜ~ûíÑ«W¯t¬²²2F�U×—ÍNA¾ ùûôÓOcîܹñꫯÆ+¯¼sçÎ��?þ8cÌ€bàÀ�yÉoÖ¬YqÆglñí´Ób»í¶Ûì:;vŒŸþô§1zôètìÞ{ïÕ耭Z²æ!Pw¥¥¥ñè£�j¾HN¹ÏhΞ~úéŒãc�=6Š‹‹k¼®¸¸8Ž=öØŒØÿþïÿnr|EEE̘1##öÃþ°V9®?núôéQQQQ«k 9*ÈwÐØÇO~ò“:_×½{÷dCså> &Ó¦MË8þæ7¿Yëk?üðxà�ÒÇÏ>ûl”””ltì¬Y³¢¬¬,}¼çž{F§N�jµÎ.»ì{ì±G¼ýöÛ±råÊøûßÿßøÆ7j�+4'}Ð ŠŠŠâ€ˆ8 ºvíƒÎwJ›Ô¡C‡¸è¢‹ò�õà> ¹H¥R±`Á‚ŒØÁ\ëë»uë–q¼`Á‚H¥R‘H$6ûÚk¯Õ{�uk­kô¹n>�>ØZiô @Nxà�ѵk×ôÇW¾ò•H&“éó�¹#M‡û €æêý÷ß�òòòôqQQQì¼óε¾¾S§NѦM›ôeeeñá‡ntŽýë_Ç{ï½w�rÝk¯½2Ž-ZT§ë 9i2�>÷Ûo¿¼­�H$bþüùy[ )º÷Þ{ó�B“ò·¿ý-¶ÝvÛØwß}³2_UUUÜu×]qê©§F‹-²2gcä>«÷°>õ™�×[o½•qüå/¹Îs|ùË_Θ筷ÞÚh£Ïõ×Úi§�ê´Îúãן/>û쳬®iß¾}FƒðÍ­]]]�Õµ×)..Ž‚‚šKºW¬X•••9É¡¨¨(ZµjU㸲²²¨¨¨ÈI………QXXXã¸U«VŪU«²¾~‡ÄꨈQžªùߢeTEQ"7ÿ•‘Œ•©–5ŽkÕQœX““ª#ÿMÕ|?$"í¹¹""–§Z×j\‡ÄêœåðYªU¤"Qã¸v‰ŠHFªÆq+ª;Ô9‡6‰Ñ"QUã¸òê¶Q•£_i�(‹–µ¸ßVU·‰Ê¨ùÞ©�V‰UѪÿÖ©ÖQ‘ªùYRQ…ÉòÇ­IµŒÕ©¢œäÐ"*£Mre�ã*++cÅŠ9É!™LFûöíkW]]Ÿ}öYNrˆˆØf›mj5nÙ²e9ËÁ>b-ûˆµZµjEE5ÿ¿_QQeee9É¡   Š‹‹k×”žõý<ß÷õ±"Õ2ª¢æçTÛÄš(ˆÜ<§ÊR±&jþ:®M¢2ZEÍ{žúX•j«k±O²�X«*Õ"ÊS5?Kê#ÕÑ6ùßÇU§Q–ªùYR_ÅÉåµWŸýû¦¬¿'±�XË>b-ûˆµ|­ñ¹¦ôŒ°�X«uTFa-¾S[ã÷,7ö9xkÞG¬¯(ñY$5 ±²º]¤jñõ@}4‡ïYfã9n±–}Äçì#ÖòµÆZ õŒØÜ÷·¶Æ}ÄÆøÙççêû=ËlîmšÃ>"üìs-?ûüœ}ÄZ¹ØGTUåæëõºh2�>S©ÜüÀ òíÅ_ŒsÏ=7Ú´i“'OŽ}öÙg‹æ«®®Ž_þò—ñÈ#�ÄË/¿¥¥¥µ*À¢ysŸ£>³ñúä“O2ŽëÓèsÇwÌhº¹þœ›Šï¸ãŽu^ç‹–.]Z§ëkcܸqYÿE« /¼°VÅò'NŒåËk÷ ¼uÕ·oߨc�=jwß}÷Å;3“N8á„øÚ×¾Vã¸'Ÿ|2^~ùåœäpä‘GF¯^½j÷ /Ä´iÓ²¾þ âˆ®Ù.þ¼j�Çî_°,Nl“›‹·+‹cryÍ{´]Z¬Œ~Eoä$‡eÕ­âæ•Ô8®}¢"ÏËI¿ùo·Z�Ëe7­èR«_º;«hal“¬ùùôÀÔ9‡ï´�_.øw�㦗�‹«v¯óüµqx›¿ÄÞ­^©qÜ?V‹Ö”“l==¾Vø|�ãæ¯î¯¬þVNrØ«åËñ�¢Gj÷Κýbfù÷s’ÃŽ-Þ‰ÿ)þC�ãÞ{x¢>î(ûj¼SÕ®Æq?*|+ö(ÈÍ/I?T¾{¼\Ù±Æqßiý^|­eö¿ŽŒˆxnõ—cZņox±>ûˆµ>®êO®ì““Ú&–ÅÛßV㸲Tûzí�këŒWÕj\VsXï™g±–}ÄZökùZãsMéa±Öa­>Š^­ÿ““¶ÆïYnìsðV½�XOïv·Fq¢æÿ÷_qF¬Lm““šÅ÷,³ð·�XË>âsökùZc­†zFlîûg[ã>bcüìósõýže6÷6Íb‘~ö¹–Ÿ}~Î>b­\ì#ZµjßùÎw¶0³-Ód}F¬}çö†¦€€\zùå—£ÿþQ^^åååѯ_¿˜2eJì½÷Þõš¯ºº:.¹ä’x䑵ExþóŸ£   ®ºêª¼ÔßÐ8¸Ï€ÍQŸÙ8•••e·iÓ¦Îs¬Íúsn*^TT”“u›U«VEyyy�ãry¿®^½ºV9TWWç,‡ŠŠŠZåPUU•³Ö¬YS«Ö¬Y“³šƒòòòX½zuÎæO¥Rµz^¯Zµ*g9DD­rÈ5ûˆµì#ÖªªªªUÙn\ÿEÕÕÕµÊakxF4vökÙG¬e±VcÙGøZc­Ú>#¶fökÙG|®1|îlJû_k|>€Íµ�hö¹Ó¤}æÊú7ŽBsʧŸ~šQTÿÉ'ŸDß¾}cÊ”)±×^{Õi®êêê¸ì²ËâÏþsFüã�?Ž5kÖD«V­²’3M�û Èõ™[fýf™­[·®ó………›�sSñº>Ë×_gåÊ•uº>_Þxã�Z55Íå/X½ýöÛ±bÅŠÇåòïôƒ>ˆ-ZÔ8nÙ²e9Ëáã�?Žùóç×j›6þüX²dIÎæ_³fM­ž×¹nú]›rÍ>b-ûˆµ–-[V«>øàƒœå°råÊZå°5<#;ûˆµì#Ö²�X«±ì#|­±VmŸ[3ûˆµì#>g±–¯5Öj Ï€¦dsÏLûˆ†a‘;É|'P©T*ëk G¿X<ºþyÈ•^½zÅM7Ý-[¶LÇ–,Y}ûö�ýë_µž'•JŰaÃâÁ̈ó›ßŒÛn»MóÅ­œû Øõ™�ÓêÕ«3Ž¿ø ¯­õŸË«V­ªÕZu}ž¯?~ýù`kR�ïjkÊ”)Y™§ªª*–-[K—.�W_}5fÏž�~÷�uŤ{ï½w\tÑEѦM›¬¬ @ÓóÙgŸÅK/½ÿþ÷¿cÙ²eѲeËèСCì°ÃqðÁGÇŽ³¶Ö·¿ýí¸îºëâ¿øETVVFDÄÇ}ûö�©S§Æ{ì±ÙëS©T\qÅqÿý÷gÄ;ì0Í9÷�oê3¯Ö­[g¯Y³¦ÎsTTTlvÎ/ÆËËË7y]¶Ö€­A“iôÙ£G�œÍýÜsÏÅ­·ÞsçÎ�D"o¾ùf\wÝu1a„ØqÇs¶.�Ó‡~‡zhTWWorÌ^{í?úÑ�â”SN‰¶mÛnñšÇ{lTUUÅÅ_UUUñÑGÅgœøÃb·ÝvÛèu©T*®¼òʸçž{2â=zôˆ1cÆDaaáçFn¸Ï€Æ@}fãUTT”q¼zõê:ϱjÕªÍÎùÅø–4ú¬í:�ÍW¿úÕèСC�ã¦OŸžñ÷“M{ì±Ç&?ÿ~ÑË/¿K—.ÍI;ï¼sì¿ÿþ5Ž{ûí·ã½÷ÞËI;ì°C­rXºti¼ñÆ9É 9Øÿýãßÿþw¼ð 9™¿eË–µz^/_¾<žy晜äµÊ!"â‘GÉYökÙG¬µÍ6ÛÔ*‡ªªªxùå—s’CÛ¶mk•ÃÖðŒhìì#Ö²�XË>b­Æ²�ðµÆZ›~F|�“õš"ûˆµì#>g±–¯5Öj Ï€¦dsÏLûˆÏÙG¬•Ë}D.$R©T*ßI4UUUqóÍ7Ǹqã"‘HD*•ŠN�:ÅÝwßÛo¿}¾Ó£ŽÖ¬Y¯¼òJFìÀŒ–-[æ)#š»äEÉw líòÃ|§ÀV`ÏAuû% €ÆÊþŒ†`FC°?š û3‚ý Áþ û:wîœq<`À€8p`^r™5kVœqÆõº¶C‡qÅWÄ÷¾÷½¬äòðÃÇСC3š?î´ÓN1uêÔØu×]7ÿ›ßü&î¼óÎŒØ!‡ãÇ�ÏK“­òòò˜?~úxÿý÷�6mÚ4xë¸Ï6®©ßg�kjв§9Ôg®ÿüîÔ©Sƒ4¥y衇bèСéãÃ?<&MšT§9úöí›Qì>jÔ¨8á„6÷ío;Þ}÷Ýôñ�wÞ_ÿú×k½Î‹/¾§�vZúx·Ýv‹§žzªN¹~ÑÆþÜc�=¢E‹õžscÚ·oÉd²ÆqŸ}öÙfso‰âââ(((¨qÜŠ+¢²²2'9E«V­jWVVVç&°µUXXX«Æá«V­Ú ±l6ìyÕÿFE´ˆòTÍÿ-£*йù·¨Œd¬LÕü¹¦ETGqbMNr¨ŽDü7Uóý�ˆT´OäîûeËS­k5®C¢îM�kë³T«HE¢Æq푌š-cúNçÖ9‡6‰Ñ"QUã¸òê¶Q5ß¿õÑ:Q-kq¿­ªn•Qó½S­«¢U-þ­+R­£"•›7!(ˆŠ(LÖü KkR-cu*7_#µˆÊh“\¹Ù1{ªˆÊÊÊX±bENrH&“Ѿ}ûÇUWWÇgŸ}–“"Ö61¨�eË–å,ûˆµì#ÖjÕªU­¾?RQQeee9É¡   Š‹‹k×”ž{^õ¿õÊ£9î#êcEªeTEÍÏ©¶‰5Q¹yN•¥ bMÔüu\›De´Šš÷<õ±*Õ"VofŸ´®ÖÀ>b­ªT‹(OÕü,©�DTGÛäkW�JDYªægI}'—×jÜŠêš©½¶v=+³i‹}ÄZökÙG¬åk�Ï5ægÄúµ [û>b�ÖQ…µøþM}l�߳ܨ÷жæ}ÄúŠŸE2Qó×+«ÛEª_ÔGsøžåúû³ú°�XË>âsökùZc­†zFlîûg[ã>bcüìósõýže}~ƹ)Ía‘ ~ö¹Ö¿g¹¹ßÕ±�øœ}ÄZuÙGTUUÅÛo¿�kè:ÐÜ<Íš -ZÄ�!C"‘HÄØ±c#‘HÄûï¿çž{nÜu×]Y/  yX¾|yü⿈þóŸ1lذ-žï?øATUUÅ¥—^ëÞÃ÷Ã?Œ3Î8#¦N�»ì²Kzìˆ#6h¾xðÁǸqã4_lfÜg@S¥>³þ:vì˜qüŸÿü§Îs,^¼x³s~1þÅFŸë_—­u¶DûöíóÖl·6Eý¹V›_’̵¢¢¢¼î¯í/ÅÕUm±*"bM´ˆå©ü>»ª"Y§œs!‰¼çQ·»\©Í/FÔ¾@}Ô¦iS®­ýE°š,—Z%V×ê—âr©ebM´Läîߺ6 jýË`¹’L&óžCDí).—ì#ÖjÎûˆºhÕªU­š äRSzFäúó|SÚGäRmš-äZyª Êóü«®ökµHTEqžsH&RyÏ!"»û÷ú>wí#Ö²�XË>b-_k|®1<#ì#ÖZ±ºM´r©9}ÏrK>7Ç}D}Õ¦1j®5æïY6äsÜ>b-ûˆÏ5†Ã>Â×kmé3"Ÿ{›Ó>bKøÙççÖÿže>ö6�yÑ�|Ïr-ûˆÏ5†šÚ>bÍšÜ4’® �>×3xðàxá…âå—_Žˆˆ¹sçÆí·ßýû÷ÏsfäZaaavØaqÄGľûî»ï¾{´k×.‰D,[¶,.\3gÎŒûï¿?–/Ï,^›:ujl³Í61`À€-Î㤓NŠÊÊʸüòËÓM?øàƒtÆN�:ÅÈ‘#cêÔ©×tÐA1a„hÛ¶íç@î¸Ï€­‘ú̺ÛsÏ=3ŽëÓèsýk¾ò•¯lr­þóŸéã>ø Në¬?~ýÜ`k’Ìw�ÑàÁƒ#""‘HD*•ŠÛo¿=ÊÊÊòœ¹²í¶ÛÆ¥—^3f̈±cÇÆé§Ÿ‡rHì°ÃQXX­[·ŽwÜ1Ž8âˆ:th<ûì³qÊ)§l0Ï-·ÜûÛß²’Ó�üãøõ¯‰D"{ÿý÷ãŒ3Έ+®¸"&Ožœ1þ€ˆÛo¿½NïTLÃrŸ[;õ™uÓ©S§(,,L—••Åûï¿_ëëßÿý(//OÅN;í´Ñ±ë7]´hQ�rý׿þµÙù`k¢ÑçFvØa±ýöÛ§�?ûì³xòÉ'󘹴Ï>ûD¿~ý¢]»vµß¶mÛ>|x 4hƒs×_}Öò:õÔScذa±÷Þ{/î¾ûîŒØþûï'N¬uþä‡û ØÚ©Ï¬›D"�;wΈ½ôÒKµ¾~Μ9Ç�;wÎhìüEûî»ïf¯­ëZûí·_�®€æD£ÏMèÞ½{¤R©tAãóÏ?ŸçŒhlÎ=÷Ü8ꨣ2b¯¾újüýïÏÚ§Ÿ~z\z饛<¿ï¾ûƤI“¢C‡Y[“ÆÅ}4'ê3ë¦W¯^Çÿ÷ÿWëkgΜ™q¼þç’/:ôÐC£¨¨(}üöÛoÇûï¿_«uÞ{ï½xûí·ÓÇmÛ¶�=zÔ:Ohn4úÜ„/}éKé?§R©xýõ×ó˜ �ÕàÁƒ7ˆe»iY¿~ýâðÃß žH$¢´´4¶Ùf›¬®Gãã>š õ™usôÑGg?þøã±råʯ[±bE<þøã±cŽ9f“ã[·nßøÆ72b÷ß­r\ÜG­ZµªÕµÐiô¹ ÅÅÅÇ‹/ÎS&4f�;wŽ=öØ##6{ö쬮ñ»ßý.fΜ¹A<•JÅ AƒÔ¶lÜg@s¡>³nöÝwßèÚµkú¸¬¬,&L˜Pãu&Lˆ²²²ôñ×¾öµØ{ï½7{Í�~ô£Œã?þñ�±téÒÍ^óÉ'ŸÄ�wÞ¹Ùy`k£Ñç&,_¾<ãxÕªUyÊ€ÆîàƒÎ8þè£�²6÷m·Ý·ÝvÛ&Ï¿ýöÛÑ·oßøøã�³¶&�“û h¶öúÌÎ�;g|Ìš5«Æk.¸à‚ŒãñãÇÇßÿþ÷MŽŸ={öÍ@ Tã:½zõН}íkéãeË–Åe—]kÖ¬ÙèøŠŠŠøÕ¯~Ë–-KÇ9ä�8âˆ#j\ š3�>7aáÂ…ÇíÚµËS&4vÛm·]ÆñÒ¥K³2ïØ±cãw¿û]F¬sçÎqþùçgÄÞzë­èÛ·o,Y²$+ëÒ8¹Ï€æ 1×gþãÿˆ™3gnð1oÞ¼Œq«W¯Þ踙3gÆ›o¾™õ¼¾õ­oÅ7¿ùÍôñš5kâì³ÏŽÉ“'Gyyy:^VVwÜqGœsÎ9Í9�<òÈèÙ³g­Öºøâ‹#™ü¼¼øÙgŸ�³Î:kƒ¿ƒ¹sçÆÙgŸÏ>ûl:Ö¢E‹¸øâ‹ëüú ¹)Èw�ÑÇsæÌ‰D"‘Ž­_$ë¤R©Œã/Ö�Ô×øñãã†nȈí³Ï>qÇwÄvÛm………qýõ×§Ï-Z´(úöíS¦L‰Ž;nñú4>î3 ©kìõ™_|q¼ÿþû5Ž[²dIœyæ™=wÒI'Eiii¶S‹k®¹&N9å”xï½÷"bm³Ñ‘#GÆ 7Ü»îºk¤R©x÷ÝwcõêÕ×í¶ÛnuÊç�C‰!C†Äu×]—ŽÍž=;z÷î_úÒ—b‡vˆ�>ú(>þøã ®½øâ‹ãk_ûZý^ 4#Éš‡l}F�•••±¶8>‘HÄ^{í•ç¬h¬>ù䓌ãm·Ýv‹æ›4iRFƒ­ˆˆ¯~õ«1yòätC´þýûÇ Aƒ2Ƽùæ›Ñ¯_¿Xºté­Oãä>š:õ™õ·ýöÛÇ”)Sbß}÷͈¯Zµ*Þxã�xóÍ77hò¹ß~ûÅ”)SêÜLõg?ûY :4Z´h‘ÿè£�bÞ¼y4ùlÑ¢E\z饛l~ [�>¿ •JŨQ£â/ùKÆ»ÅGDqÄyÊ €ÆîŸÿügÆñ—¾ô¥zÏ5yòä(--͈íµ×^qÇwlШëÜsÏ��fÄ.\ýúõ‹O?ý´Þ9Ð8¹Ï€¦J}fvtêÔ)î½÷޸袋6û9àK_úR\|ñÅqÏ=÷ÄN;íT¯µÎ:문ÿþû£W¯^‘Ln¼Ü8™LÆQG<ð@ôëׯ^ë@sT�ïƒÕ«WÇ3Ï<cÇŽ� lp¾°°0Ž>úèo½õ͕֬J¥¢¬¬,–-[ÿú׿báÂ…±jÕªH¥Réw‹O¥R‘H$¢o߾ѱcǬ­@óqýõ×o;âˆ#ê<Ï�wÞ¿ýío3b{ì±GL™2%vØa‡Í^{ÁDUUUŒ3&{íµ×⬳ΊI“&E‡êœ�‹û Èõ™MS2™Œ<0<ðÀœ¯µÝvÛÅ·¿ý휯ÍE“jô¹®À3ÛÖ�FÄkì³Ï>QRR’“uÈ®Î�;g÷èÑ#¦N�ºÙk/^;î¸c½Ö»ùæ›cÆŒ±.]ºD÷îÝë4Ï=÷ÜÇψí¾ûî1eÊ”øÒ—¾T«9ÕÕÕ1nܸtlÞ¼yqÖYgÅwÜíÚµ«SNlšûÌ}͉úL€ìJæ;�ºJ¥RYÿH$é�/®³ûî»Çĉ£M›6y|ÅäÒðáãoß¾1cÆŒ¨ªªªÕ5Ÿ}öY\rÉ%1zôè Î]tÑEuj˜öðÃÇW\‘Ñ m×]w�)S¦Ô¹1ä/~ñ‹8묳2bsçÎ�³Î:+***ê4Ùå>;õ™ÙQ�ïê*Wï¿ÎºÂÒSN9%.¾øâ(..ÎézÍÕܹsãñǯõø™3gÆêÕ«7z®}ûöÑ¿ÿl¥–!•JÅ /¼/¼ðBtìØ1Ž:ê¨8ðÀcß}÷�í·ß>Úµk‰D"–-[ .Œ™3gƃ>+W®Ü`®�Æá‡^§õ»ví;vŒ%K–DDD§N�bÊ”)ñå/¹^¯gèСQ]]wÜqG:vøá‡G«V­ê5_cç>«÷Põ™ÙÑä}¦R©œÍݾ}û8þøããä“OŽýöÛ/gël .\ãÇ�¯õø9sæÄœ9s6z®S§N9kÀøEŸ|òIÜwß}qß}÷ÕùÚ³Î:+ PçëöÜsϘ4iRôéÓ'Ú¶mS§N��wÞ¹Îó|Ñ¥—^UUU1uêÔ8묳bðàÁ[4_cæ>«÷Põ™ÙÑd}vïÞ=ks%“ÉhÛ¶mG‡â«_ýjtéÒ%öÙgŸhÙ²eÖÖ ùÛqÇã·¿ýmyä‘õžcŸ}ö‰‰'Fûöí£S§NYÉkذaѽ{÷øŸÿùŸ¬ÌG~¹Ï€\QŸ �]M¦ÑçÔ©Só�ÍÐ…^tPÌž=;æÎ�Ë–-«ñšÂÂÂ8è ƒâÇ?þq{ì±Yi^Ö¥K—-žc}š/6î3 ±RŸ �]M¦Ñ'MKïÞ½£wïÞ ºæ‚ ê|MçÎ�£sçÎQRR‹/ŽwÞy'>üðÃX¶lY”——G"‘ˆâââèСCì¶Ûn±ß~ûe¥é"[Î}@c¢Ñ'|ÁŽ;î;î¸c¾Ó ™sŸ4OÉ|'Í�FŸ�}@hô Y Ñ'd�FŸ�}@äcÑýöÛ/ËÖ["‘ˆùóçç; €¬H^ô—|§ÀV`Ñ.?Œˆˆÿ<ŸçDhÖöT‘ï QQŸ �yiô™J¥ò±,@³¥> ÿòÒè3bí»°7Š^€¦B}&@~å­Ñg6l¬È³®ªÙ˜ ¹PŸ Pykô™íwbÿbñgmçN$éë¾x�w‰š"õ™ù•—FŸS¦LÙ¢ëÿûßÿÆM7Ýo¼ñÆ… :tˆ®]»Æ¾ûî»ï¾{G»víÒ×­X±"Þyç�xýõ×ãÕW_�åË—GDf!êÞ{âââ-Ê ¡¨ÏÈ¿¼4úìÑ£G½¯}ýõ×ã’K.‰?ü0‰Dº€´W¯^qÊ)§ÄGµ{Y•••ñüóÏÇÝwßÏ=÷\º˜ôÍ7ߌ#FÄïÿûèܹs½sh(ê3ò/™ïêbÞ¼yqúé§Ç‡~©T*R©Tì¶Ûn1iÒ¤3fLuÔQµ."�ˆ(((ˆ£Ž:*ÆŒ“&MŠ]wÝ5]˜úÁÄi§�¯½öZ®^@Þ©ÏÈžÚW]æÙòåË£¤¤$V¬X‰D"8à€;vll·Ýv[<Ïž=ã®»îŠþýûÇܹs#‘HÄŠ+¢¤¤$þò—¿D‡¶x�l[¼xq¼òÊ+ñòË/Ç+¯¼sçÎ�•+W¦ÏwêÔ)žyæ™˧OŸ>1{öìz_õÕWGïÞ½³˜°9ê3²+™ïjëÚk¯�%K–D"‘ˆˆˆŽ;Ƹqã²RDºÎvÛmãÆ�‹í·ß>ûøã�ãúë¯ÏÚ[êÿøG 0 Ž8âˆøÖ·¾ ˆñãÇǬY³2š|ÔD}&@v5‰FŸ‹/އz(‰D¤R©H$q饗ƶÛn›õµ¶Ûn»¸ä’KÒë¤R©xðÁcñâÅY_«>^}õÕxê©§â£�>Êw*@¦> û ò�@m<ñÄQYY™~·øöíÛÇÿüÏÿäl½ÿùŸÿ‰ßþö·ñÙgŸEDDeee<þøãÑ·oßœ­™ EEEQVV–ï4Ò&MšT§ñ{ï½wŽ2Ö§> ûšD£Ï¿ýíoé?'‰8ôÐC£  w©·lÙ2;ì°xâ‰'ÒÅ«³fÍjT…¤mÛ¶�.]ºD×®]ãÀŒ®]»Æ{ï½gœqF¾SK;üðÃó�° ê3²¯I4ú\´hQ$‰H¥R‘H$b§�vÊùš_\#•JÅ›o¾™ó5kãè£�Žo~ó›ñ•¯|%’Édƹ÷Þ{/OYM�úL€ìk�>?ù䓌ã6mÚä|ÍÂÂÂÍæ�/»í¶[¾Sšõ™Ù—Ìwµ±jÕªŒãÅ‹ç|Í�>úh³94eê3²¯I4ú\÷ñ‰D"R©T¼öÚk9_sý5â]êŠúL€ìk�>wÞyçH¥Réã Ä¢E‹r¶Þ¢E‹âµ×^K®FDì´ÓN9[ ¡©ÏȾ&Ñè³K—.Ä®½öÚœ­7jÔ¨ŒãD"p@ÎÖkÎþûßÿÆë¯¿ÿûßcÞ¼yñþûïGUUU¾Ó€­žúL€ìk�>�>úèôŸ×½‹û´iÓbâĉY_ëöÛo�iÓ¦E"‘ȈuÔQY_«¹;ñÄ£G�q 'Äé§Ÿ½{÷Ž£�>:9ä�8ûì³ãž{î‰ŠŠŠ|§ [%õ™ÙW�ïjãè£�Ž/ù˱xñâˆø¼˜ôÚk¯�åË—Ç…^Éä–õ,­®®Ž›nº)Æ�¿AéŽ;îÇsÌÍ¿5zíµ×6/++‹3fÄŒ3âw¿û]üêW¿ŠãŽ;.çù¬Zµ**++s¾4eåååùN€/°?h\ìÏ{4rek©5SŸ �}M¢Ñg‹-bРAqÉ%—¤‹H×ýwܸqñÌ3ÏÄE]Gyd½æî¹çâºë®‹E‹¥çŽˆôŸ -Z´ÈæKâÿ÷ñÇÇ Aƒâ•W^‰¡C‡æt­… æt~hæÏŸŸïøû3€ÆÅþ  ñ±Gƒ-£> ûšD£ÏˆˆO<1ž~úéxê©§6(&}ã�7âç?ÿyì°Ãqì±ÇF·nÝbß}÷�Ýwß}ƒwO¥RñÎ;ïÄ믿sæÌ‰'žx">úè£H¥Rã‰DsÌ1qâ‰'6äKmÒZ·n‡~x|ë[ߊýöÛ/vß}÷h×®]TTTÄÒ¥K㥗^ŠG}4¦M›–þ;�ˆ˜8qbl»í¶Ñ¿ÿŠ©S§ÆÔ©SÓ×´iÓ&Š‹‹#"bÅŠQ^^ž1ç›M~±ˆ4•JÅ×¾öµ¸öÚksù’š•~ýúE·nÝbÛm·Ýà\Ë–-£mÛ¶±ë®»Æ~ðƒxñÅcÈ�!±xñâô˜n¸!¾õ­ožûîÛ�iÀVM}&@ö4©FŸmÚ´‰‰'Æ�!Câ¹çžË(&]ç‹…¡eeeQVV¶É9×Gùusyä‘qà 7D›6m²”}ówÌ1ÇÔzì!‡S§N�SN9%>ýôÓˆXû÷~ÓM7Ř1cr’ß>ûìMê–§Iù ß dÅþûïŸï²Äþ hìÏ€æÃþ hìÏ€æÅ hìÑÈ•ÊÊÊX¸pa¾Óh0ê3²§Éu=,**Š1cÆÄ½÷Þ×]w],_¾<£tc…¡µ•J¥¢C‡qÑEÅ�üãl¤Ëfì¾ûîñË_þ2.½ôÒtlÚ´i±lÙ²Øf›m²¾^aaa´lÙ2ëó@sâ—hû3€ÆÅþ  ñ±G#WÖ¬Y“ïœúL€ìHæ;�úúñ��=öXœ~úéѾ}ûH¥R¼[|m¬»®]»vqúé§Ç_ÿ?öî<¼êòLÿ}²B€€ ,"u£‚ ˆZ±0Z·ºUm�µ�vêPÇj—·õµÛ÷íòNÇê;WÝ:ãBkµ:£ÕN]Z¬KQÇ₤@esP*kÌBÖóû#¿D fûžœ$|>וË;†ÞÒnllŒ^x!‡ÀîK~&@÷ä:€î>|xüïÿý¿ã[ßúV<ñÄñ‡?ü!–.]ï¾ûn‡®=ztL™2%N:é¤8í´Ó¢¸¸8˳³¼¼¼˜6mZ<þøã-}«W¯ÎaD°{“Ÿ Ðu}ºÐg³¢¢¢8묳⬳ΊˆˆM›6ÅÊ•+cëÖ­Q^^ååå1dÈ�(--�aÆÅA{íµW.Ãæÿ7f̘Œö–-[r ÐL~&@çõ‹BŸ;1bD̘1#×aÐA™?†uuu9ŠØù™íËËu°qãÆŒöðáÃs @×)ôIÎ-\¸0£=f̘EÐu }’SúÓŸâí·ßÎè›>}zŽ¢è:…>É™ªªªøÑ�~”ÑwÐAŸqãr@×õëBŸµµµ±qãÆX¿~}¬_¿>***rRŸ1a„Œ�—^zé#ÇÿèG?Š 6txþÍ›7ÇÅ_+W®ÌèÿÆ7¾Ñ¥x€ž!?`× r@R/^ ,ˆE‹ŲeËbóæÍQSS“1æ›ßüfÌš5+G&gáÂ…­[DÄŠ+2Ú555ñ /´9ÇÈ‘#cüøñ‰ÅtÏ=÷Äý÷ߟúÔ§âÔSO�#Ž8"öÙgŸVãÞ}÷ÝxôÑGã®»îŠ÷ß?ãkŸþô§ãä“ON,& {v§üL€$ôéBŸ555ñðÃÇ=÷Üo¼ñFK:�n56•Jµ;ßÒ¥Kãâ‹/Îè;öØcãÇ?þq÷ƒMÐUW]ëÖ­kwÜÆ�ãþáÚüZYYY\{íµ‰ÆU[[sçÎ�¹sçFDÄàÁƒc¯½öŠ!C†D}}}lܸ1þú׿¶yí'>ñ‰øÉO~’h<@çí®ù™Iè³…>_~ùåøö·¿ï¾ûn«ÄÑ�“FÛJ,mË¡‡#GŽŒeË–µô=úè£ñÏÿüÏ1tèÐî½›©¨¨ˆŠŠŠ�“——\pA\~ùåQXXØC‘m‘Ÿ Ð=y¹ +n¸á†8ÿüócýúõ-I¢©Tªå£YGHwtá…¶ÌQWWsæÌI êþí_þå_âŒ3Έ1cÆthü^{í3gÎŒÇ<®ºê*E> Çägt_A®è¬ï}ï{ñë_ÿ:Òét—O†ÿ('Ÿ|r 2$***ZúæÎ�_ùÊWº=wRž~ú鬯±råÊN�ÿâ¿_üâ#"bË–-ñÆoÄúõëcóæÍQ]]ùùùQZZ{ì±GLš4)Æ�—�°€.�Ÿ �Œ>Uèó®»îŠx Í“ᇠŸþô§ã¨£ŽŠ}÷Ý7† gœqF§×(,,ŒO<1yä‘H¥R‘N§ã•W^‰ÚÚÚ(**Jòáô[{ì±G|âŸÈu@ÈÏHNŸ)ô¹fÍš¸þúë[%�Ä¥—^3gÎŒAƒ%²ÖÉ'Ÿ�<òHK»¶¶6.\Ó§OOd~€Þ@~&@²òr@GÝtÓMQ[[ÛÒN§Ó±Ç{Ľ÷Þ_|qbI¤GqD«¾¥K—&6?@o ? Y}¢Ðçûï¿O<ñDËiñét:ŠŠŠâÖ[o�)S¦$¾ÞðáÃcÔ¨Q}«W¯N|€\‘Ÿ �¼>QèóÉ'ŸŒÆÆÆˆhJ"M¥RqÞyçÅÔ©S³¶æÄ‰[ÖŠ�H ô/ò3’×' }.X° £�ŸŸ_ÿú׳ºæˆ#Z>O§Óñþûïgu=€ž$? y}¢Ðç믿Þrr{*•ŠÃ;,† –Õ5KKK3ÚY] 'ÉÏH^Ÿ(ô¹aƈh:¹="büøñY_sðàÁíÊÊʬ¯ ÐSäg$¯Oú¬ªªÊh�1"ëkVWWg} €\‘Ÿ �¼>Qè3//3ÌÚÚÚ¬¯¹mÛ¶ŒvIIIÖ×è)ò3’×' }4(£½uëÖ¬¯¹nݺŒöž{î™õ5zŠüL€äõ‰BŸcÆŒ‰t:©T*Òét,[¶,«ë544ÄŸÿüç–õR©TŒ7.«kô$ù™Éë…><ðÀŒöÊ•+£¼¼�:ê¨øÌg>ÓrB|s2¼ùáƒIDATé³Ï>gžyfüþ÷¿ïÒ¼•••1{öìøÂ¾«W¯ŽT*žÁÄèÑ£{½…üL€dä:€Îøþ÷¿‹/Žõë×GćɤëÖ­‹+®¸"®¹æš8å”SâðÃ�8 ÕõÛ¶m‹åË—ÇÖ­[ãÍ7ߌ—^z)æÏŸ|ðAK‚j³T*‡rH\zé¥=òØrA~&@rúT¡Ï¡C‡Æm·Ý_ýêWcË–-'¼oܸ1î»ï¾¸ï¾ûZ®iNM§Óq×]wÅ]wÝ•1çŽ'ÐïØ7vìØ¸å–["???› §äg$'/×tÖÇ?þñ¸ûî»cìØ±§¼§R©–ä›?v¶ãך?š¯ÛqÌ~ûíwß}wìµ×^=ò˜rI~&@2ú\¡ÏˆˆñãÇÇo~ó›8ýôÓ[%Œ6'†î˜ÚÖ×ÚJ M§ÓqÚi§Å<cÇŽÍúãè-ägt_Ÿ,ô1tèиá†âÎ;ïŒÃ;¬Í“âw•4º£æk:è ¸ýöÛãÆoŒÒÒÒžz½†üL€î)ÈuÝ5}úô˜>}z¬X±"æÌ™óæÍ‹U«Vµ:I¾-£F�ŠãŽ;.Î<ó̘6mZD ÐûÉÏèš>_è³Ùĉcâĉqå•WFUUU¬Zµ*Ö¯_ï¿ÿ~lß¾=¢¸¸8JKKcï½÷ŽñãÇǨQ£r6@¯%? súM¡Ï•””ÄÔ©ScêÔ©¹ _�Ÿ о¼\ý�BŸ�…>  }@ r@6ÕÖÖFyyyÔÖÖFDDiii <8ÇQô]ò3v­ßú\¼xq,X° -ZË–-‹Í›7GMMMƘo~ó›1kÖ¬EзÈÏèœ>]賦¦&~øá¸çž{â�7ÞhéO§Ó­Æ¦R©vç[ºti\|ñÅ}Ç{lüøÇ?î~°}€üL€®ËËu]õòË/Çé§Ÿ?øÁâõ×_�t:Ýò‘J¥2>:êÐC�‘#GÆÆ�[>}ôÑØ¶m[ @ï ? {úd¡Ïn¸!Î?ÿüX¿~}Ëéðm%޶ur|{.¼ð–ù""êêêbΜ9 D Ð{ÉÏè¾>Wèó{ßû^Ìž=;Z%�îxj|W’H#"N>ùä2dHFßܹs»7@o%? ¹ 3îºë®xà�Ú<~È�!ñéO:Ž:ê¨Øwß}cذaqÆgtz�ÂÂÂ8ñÄã‘G‰T*ét:^y啨­­�¢¢¢$@ÎÉÏHNŸ)ô¹fÍš¸þúë[%�Ä¥—^3gÎŒAƒ%²ÖÉ'Ÿ�<òHK»¶¶6.\Ó§OOd~€Þ@~&@²òr@GÝtÓMQ[[ÛÒN§Ó±Ç{Ľ÷Þ_|qbI¤GqD«¾¥K—&6?@o ? Y}¢Ðçûï¿O<ñDËiñét:ŠŠŠâÖ[o�)S¦$¾ÞðáÃcÔ¨Q}«W¯N|€\‘Ÿ �¼>QèóÉ'ŸŒÆÆÆˆhJ"M¥RqÞyçÅÔ©S³¶æÄ‰[ÖŠ�H ô/ò3’×' }.X° £�ŸŸ_ÿú׳ºæˆ#Z>O§Óñþûïgu=€ž$? y}¢Ðç믿Þrr{*•ŠÃ;,† –Õ5KKK3ÚY] 'ÉÏH^Ÿ(ô¹aƈh:¹="büøñY_sðàÁíÊÊʬ¯ ÐSäg$¯Oú¬ªªÊh�1"ëkVWWg} €\‘Ÿ �¼>Qè3//3ÌÚÚÚ¬¯¹mÛ¶ŒvIIIÖ×è)ò3’×' }4(£½uëÖ¬¯¹nݺŒöž{î™õ5zŠüL€äõ‰BŸcÆŒ‰t:©T*Òét,[¶,«ë544ÄŸÿüç–õR©TŒ7.«kô$ù™Éë…><ðÀŒöÊ•+£¼¼�:ê¨øÌg>ÓrB|s2é³Ï>gžyfüþ÷¿ïÒ¼•••1{öìøÂ¾«W¯ŽT*žÁÄèÑ£{½…üL€dä:€Îøþ÷¿‹/Žõë×GćɤëÖ­‹+®¸"®¹æš8å”SâðÃ�8 ÕõÛ¶m‹åË—ÇÖ­[ãÍ7ߌ—^z)æÏŸ|ðAK‚j³T*‡rH\zé¥=òØrA~&@rúT¡Ï¡C‡Æm·Ý_ýêWcË–-'¼oܸ1î»ï¾¸ï¾ûZ®iNM§Óq×]wÅ]wÝ•1çŽ'ÐïØ7vìØ¸å–["???› §äg$'/×tÖÇ?þñ¸ûî»cìØ±§¼§R©–ä›?v¶ãך?š¯ÛqÌ~ûíwß}wìµ×^=ò˜rI~&@2ú\¡ÏˆˆñãÇÇo~ó›8ýôÓ[%Œ6'†î˜ÚÖ×ÚJ M§ÓqÚi§Å<cÇŽÍúãè-ägt_Ÿ,ô1tèиá†âÎ;ïŒÃ;¬Í“âw•4º£æk:è ¸ýöÛãÆoŒÒÒÒžz½†üL€î)ÈuÝ5}úô˜>}z¬X±"æÌ™óæÍ‹U«Vµ:I¾-£F�ŠãŽ;.Î<ó̘6mZD ÐûÉÏèš>_è³Ùĉcâĉqå•WFUUU¬Zµ*Ö¯_ï¿ÿ~lß¾=¢¸¸8JKKcï½÷ŽñãÇǨQ£r6@¯%? súM¡Ï•””ÄÔ©ScêÔ©¹ _�Ÿ о¼\ý�BŸ�…>  }@ú€ä:€¤TVVÆ’%KbéÒ¥±téÒX·n]”——Ç|•••1hР2dH”––Ƙ1câÐC�)S¦Ä”)SbðàÁ¹ ×‘Ÿ Ð9}¾Ðç‚ â�ˆ'Ÿ|2jjjZúÓétƸm۶ŶmÛ""bùòåñôÓOGDDQQQœrÊ)ñ…/|!¦M›Ös�ôRò3º¦Ïú\µjUüŸÿóbÉ’%Ñ:q4""•JµêK§ÓckjjbΜ91gΜ8ôÐCã_þå_b„ Ù  —’Ÿ Ð=y¹ ³ã†nˆsÎ9'–,YÒ’šJ¥Z}´¥­qÍs,Y²$>ÿùÏÇõ×_���=üÈrC~&@2úT¡ÏšššøÇüǘ={vÔ××g$�î¬99´­��í8G}}}üìg?‹‹.º(jjj²þ˜rI~&@r r@G566Æÿú_ÿ+æÍ›Ñ*ytÇѽ÷Þ;:è 1bD <8ÕÕÕQQQ›6mŠU«VÅúõë[Æ7ÏÕüßt:/¼ðB\vÙe1{öì]ž>ЗÉÏHVŸ)ôyË-·ÄÿøÇ]&�þÍßüMœyæ™qÒI'Eiii»ó•——ÇSO=sæÌ‰çŸ>cÞT*ét:ž{î¹ø�ÿø�¸ì²Ë’}0½€üL€dåå:€Žxç�wâöÛoo3‰ôÐC�_ýêWqÇwDYYY‡’H#"JKK£¬¬,î¸ãޏï¾ûbòäɧÎ7'“Þ~ûíñÎ;ï$úxrM~&@òúD¡Ï_üâQWW×ÒnNø<ûì³ã¾ûî‹©S§vkþÃ?<î¿ÿþ8ûì³3’I#"êëëã¿øE·æèmäg$¯×úlllŒG}´å´øt:©T*N=õÔ¸öÚk£   ‘uòóóãÚk¯�SO=µ%™´ùÔøG}4Y ×ägdG¯/ô¹lÙ²(//Ïè>|xüð‡?ÌÊzÿ÷ÿþß>|xFß|¯¾újVÖèiò3²£×ú|ýõ×[>o>-þ³Ÿýl :4+ë :4>÷¹Ïµœßì�7ÞÈÊz=M~&@vôúBŸ[¶liÕwòÉ'guÍSN9¥CqôEò3²£×úlhhhÕ7nܸ¬®ÙÖümÅÐÉÏÈŽ^_èsðàÁ­ú† –Õ5‡Ú¡8ú"ù™ÙÑë }Ž;¶UßæÍ›³ºf[ó·@_$? ;z}¡Ïƒ>8R©TFßêÕ«³ºf[óOš4)«kôù™ÙÑë }î¹çž­’8üñ¬®ùØc�µ|žJ¥bÒ¤I1bĈ¬® ÐSägdG¯/ôñ·û·‘N§#•JE:�Ž9sæÄ{ï½—•µÞ{x3gNËZ_úÒ—²²@®ÈÏH^Ÿ(ôyöÙgÇþûïM'¸WVVÆw¾ó�hhhHt�†††¸úê«£²²²e­8 Î>ûìD×È5ù™Éë…>‹ŠŠâºë®‹ââ∈H§Óñâ‹/ÆÅ_ÕÕÕ‰¬Q]]³fÍŠ_|±å´øÄu×]………‰¬Ð[ÈÏH^Ÿ(ô1eÊ”¸á†¢¸¸¸%ÑsÞ¼yqÖYgÅ“O>Ù­¹Ÿ|òÉøìg?Ï=÷\Fé 7܇rHB� w‘Ÿ �¬‚\Ð'œpBÜsÏ=qÅWÄÛo¿ét:Ö®]ßüæ7ãÀŒ3Î8#N<ñÄ?~|äççïrž†††xýõ×ãé§ŸŽG}4Þxã�H§Ó-_ßwß}ã'?ù‰$R ß“Ÿ �œ>Sèóꫯnù|òäɱ~ýúhhhˆˆˆt:¯¿þzÜ|óÍqóÍ7Gaaaì¿ÿþ±çž{Æ AƒbàÀ�Q]]•••±iÓ¦xóÍ7£®®®åÚˆh9)¾   &Mšÿõ_ÿÕåXS©T\sÍ5Ýx´Ù'? Y}¦ÐçC=©T*£/�NG*•jImN ­­­�•+WƪU«ZͳãÉðÍvœ·¡¡!üñ.ÇÙ“DR ·“Ÿ �¬>Sè³ÙΉ ;žø¾s[I£»»«ùú;ù™Éès…>wNíî¸ÎŽm�DT ¯‘Ÿ �Œ>UèS’&@²äg$§Ïú,++ËuýŠüL€dõ™BŸ?þñ�s@¿"? Y}¦Ð'ô´·ß~;–,Yï½÷^ÔÕÕEiiipÀqÄGDqqq®Ãz…>`'sçÎ�[n¹%^}õÕ6¿^RRçœsN\zé¥1|øð¬Åqâ‰'ƺu뙫¬¬,®½öÚ]~ýÁŒ«¯¾ºËóO›6-î¹çž._ýA^®€Þ¢¶¶6®¼òʸôÒKwYä3"¢ªª*þó?ÿ3Î8ãŒxùå—{0®+,,ÌuÐï)ô ÑØØ—_~yüîw¿ËèÏÏÏ�}öÙ'>øà2dHÆ×6oÞ]tQ,Z´¨'Cí’ã�?>×!@¿W�ë 7øùÏO=õTFß—¾ô¥¸ä’KbÔ¨QÑT ô©§žŠk®¹&Ö¯_ÕÕÕqùå—Çœ9sZí®û·‹šššN_÷øã�Çý÷ßßÒ1bDwÜq�šãk_ûZsÌ1_ZZÚ©ù ?Rè€ÝÞ–-[â¶ÛnËè»âŠ+âë_ÿzF_^^^œ|òÉ1eÊ”øò—¿ëÖ­‹ˆˆ÷Þ{/î¼óÎøÆ7¾‘h\Gyd—®»ùæ›3Úg�uVt.uxüøñ1cÆŒ.­»«¼\¹öóŸÿ<*++[ÚGuT\tÑE»?jÔ¨ø×ý׌¾»îº+¶lÙ’µ;jõêÕ±hÑ¢Œ¾²²²E»—ÎËÝGmÙ²%^|ñŘ?~¬]»6¶lÙUUU1pàÀ=ztŒ?>>ùÉOÆŒ3"/OíS€öô§üÌÆÆÆxðÁ3ú.»ì²H¥RyÝôéÓãŸøD,X° ""*++ã±Ç‹¿û»¿ËZ¬ñÐCe´'Mš'NÌQ4°{é×…>7lØ·Ýv[<øàƒQ[[ÛÒŸN§[>_¹re<ûì³qÇwĈ#â‚ .ˆ™3gFAA¿þ_Ð%ý1?ó•W^‰Í›7·´Ç�G}t‡®=÷Üs[ }FD<õÔS9-ôÙØØ�<òHF_YYYŽ¢€ÝOγ%ßyç�XµjU«þc�=6ŠŠŠº<ï¼yóâÊ+¯ŒòòòŒÄÑf©T*ÒétÆ×6nÜÿöoÿ¿ýíoã§?ýiŒ7®ËëäŠüÌÎyöÙg3Ú3f̈T*Õ¡kg̘‘Ñ~饗¢ªª*JJJ‹¯3^|ñÅxï½÷ZÚ………qæ™gæ$Øå¼Ðç¿ÿû¿ÇoûÛŒ¾ &ÄI'�Ôå9çÌ™ßþö·£¡¡!"b—‰–mõ§ÓéX±bE|ùË_Žÿú¯ÿŠ}÷Ý·Ëqä‚üÌÎY¾|yFûˆ#Žèðµ£F�бcÇÆºuë""¢®®.^ýõ˜2eJ¢1vÔC=”Ñ>þøãcøðá9‰vGy¹àùçŸo9¹½ùôö™3gvy¾%K–Äw¿ûÝhhhˆT*Õ’,ÚÖ©ñmi¿qãÆ˜5kVÔÖÖv9€\�ŸÙ9o¾ùfFûÀìÔõãÇ�ÿÈùzJEEEÌ�;7£¯¬¬¬[s644Äš5kâ•W^‰E‹ÅêÕ«£¢¢¢[s@V�ËÅ—/_7nÌHö>|xœyæ™]𝡡!¾ýíoGMMM«ÒöJwüz*•Št:kÖ¬‰Ù³gÇe—]Ö¥xzšüÌÎÙ¾}{¬_¿>£o̘1�šcôèÑíÕ«Ww;®®xì±Ç¢ººº¥½çž{ÆqÇ×åùn¿ýöøÑ�~•••ýyyyqÐAÅŒ3â¼ó΋±cÇvy èorZèsÁ‚-Ÿ7'pž~úéQTTÔ¥ùî»ï¾X½zu«¤ÐæÏGŽçž{nuÔQ1räȨ¯¯�÷Þ{/æÍ›¿ûÝïbÛ¶m-㛓Iö³ŸEYY™D O�ŸÙ9[¶lÉ(TZXX#FŒèÔ£F�ÊhoÚ´)‘Ø:롇ÊhŸuÖYQPÐõtá5kÖ´ÙߨØ+V¬ˆ+VÄÝwßçž{n\}õÕ1`À€.¯ýEN }þå/iÕwÊ)§ti®ÆÆÆ¸ýöÛÛ<ù=•JÅ9çœßÿþ÷£¸¸8㺠&ÄqÇ—\rI|÷»ß�gžy¦eŽˆˆÚÚÚx衇zÍ©ñE~fçTUUe´ �kG”””|äœ=áí·ßŽ… fô•••e}ÝúúúøÕ¯~¯¼òJÜqÇ1räȬ¬³}ûö¨¯¯ÏÊÜÐ_TWWç:vb�л؟ô.ögdKoÈ5Ëi¡Ï¥K—f$BŽ1"Ž:ê¨.Í5oÞ¼xÿý÷3’G›ÿû™Ï|&®¹æš�¼~øðáñïÿþï1kÖ¬˜7o^¤R©–9~ûÛßöŠDR€öÈÏìœÊÊÊŒöÎEK;bçkrQèóÁÌhOž<9&L˜Ð¥¹>øà8þøããðÃ�ñãÇÇ{ì………±mÛ¶XµjUÌ›7/~ýë_Ç|ÐrͪU«bÖ¬YñŸÿùŸ­ Ÿ&aÕªU‰Ï ýͲeËr;±Gè]ìÏzû3ú³¼\-\__kÖ¬‰ˆOw?òÈ#;}z³Gy¤åóç:thüð‡?ìÐùùùñãÿ8 ”ÑÿÎ;ïÄòåË»@O‘ŸÙyµµµíÂÂÂNÏQTT”ÑÞ¾}{·bê¬æÂ©;*++ëô<“&MŠ|0~øá¸üòËã¸ãŽ‹±cÇFIIIÆž{î3f̈oûÛñÔSOŧ?ýéŒë_}õÕ¸ùæ›»õX ¯ËY¡Ïwß}73ú¦L™ÒåùžþùŒÒæäÔ .¸ ÜáyöÜsÏ8ï¼ó"�Ngôÿå/érl=A~fçí\¤³®®®Ósì\,´¸¸¸[1uÖüùócݺu-íÂÂÂ8óÌ3;=ÏĉcòäÉ;tèÐøéO§œrJFÿ½÷Þ6lèôÚÐ_äjáµk×¶ê;ä�Cº4×Ê•+cÛ¶m­N›ÏËË‹³Ï>»Óó}ö³Ÿ�Ûo¿=£oÅŠ]Š  §ÈÏì¼Aƒe´kjj:=ÇÎ×”””t+¦Îzøá‡3Ú'œpBì±ÇY_7///~ô£Åüùó£¼¼<"šþ_<öØcqþùç'ºÖA9K}¦ß[Ÿë1iÒ¤\‡� {4 °Gúû3 °?úû3 °?#[êëëcÕªU9�!gÙnýë_[õ�=ºKs-X° £Ý|ZüÔ©ScäÈ‘�žïÀŒQ£FeĘëo@{ägvÞÎE9·oßÞòX;ªªªê#ç̦ÊÊÊxòÉ'3úÊÊÊzlý¡C‡Æç?ÿù¸óÎ;[úžþùÄ }0 �ú›�æ:vb�л؟ô.ögdK]]]®Cˆ¼\-¼sBcDİaú4×¢E‹Úì?ú裻4_DÄ„ Z’4ÓétlÚ´©Ësôù™�·Ç{dõ¬««ët\6lÈh�1"‘Ø:âñÇÏø¾ï¹çžñ©O}ªÇÖ�ˆ˜>}zF{õêÕ=º>ô&9+ôY]]ݪoÈ�!]škéÒ¥mžšþ‰O|¢KóEDì³Ï>튊Š.ÏÐägvÞ€bï½÷Îè[¿~}§æx÷Ýw3Úp@·ãꨇ~8£}ÖYgEAAA�­1zôèŒöæÍ›{t}èMrVè3�N·êÛ¾}{§ç)//�·Þz«Í9'MšÔµà"bРAíÊÊÊ.ÏÐägvÍþûïŸÑ~ã�7:uýÎã{ªÐç;ï¼/¿ürFß9çœÓ#kïhç¢õõõ=ô9+ôÙÖéð]9•}É’%-Ÿïxjü˜1cbذa]Š-¢étöÕÔÔty.€ž ?³k>øàŒö¢E‹:|í_ÿú×X·n]K»°°0<ðÀÄbû(?üpF!ÖÉ“'ÇAÔ#kïhãÆ�íáÇ÷x Ð[ôªBŸÍ'¿wÆŸÿüçŒv:�ŽT*“'OîjhQ[[›ÑÞ9± ·‘ŸÙ5Ç|Fû…^È( ùQžþùŒöÑGƒ J*´]J§ÓñðÃgô�sÎ9Y_·- .Ìh�=:'q@o�³BŸ#FŒhÕ·bÅŠNϳsb`³©S§vz®mݺ5£Ý —Ý!?³kŽ8âˆØc�=ZÚï¼óN¼ôÒKºö¿ÿû¿3Ú'žxb¢±íÊË/¿k×®miÆ™gžÙ#k慨¾¾UÁÑéÓ§÷xÐ[ä¬ÐçÁ©T*£ïé§ŸîÔñòË/·š'"⨣ŽêV|ï¾ûnF»­îzù™]“——eee}ÿñÿétú#¯{ñÅcÁ‚-íAƒÅé§Ÿž•wöÐCe´O<ñÄ6lX�¬½£Ù³gÇ[o½•ÑwÒI'õxÐ[ä¬Ðç�!Cbß}÷�ˆˆT*étºÕÉâíyì±Ç¢¾¾¾UIIIrÈ!ÝŠïµ×^k‰+•JÅ>ûìÓ­ù²M~f×]tÑEQRRÒÒþÓŸþ?ûÙÏv9~Æ ñÝï~7£oæÌ™1|øð�\g„ /½ôR§c­®®Ž'žx"£oçB¥�uï½÷Æ‹/¾Ø©kî¼óθùæ›3úN<ñÄnÿœ@_–³BŸÓ¦MË8鼡¡!þßÿûº¶±±1î¾ûîŒÓ⛓>�?þøÈËëúCÛ¼ys«㛓^z3ù™]3|øð˜5kVFßO~ò“øÁ~6lhékllŒ¹sçÆ—¾ô¥X·n]KÿÈ‘#ã‚ .è‘XŸx≨¬¬liïµ×^qì±ÇvkÎ%K–Äù矟ûÜçâ¶Ûn‹W_}5jkk[�«®®Ž§Ÿ~:Î;XöÚk3~Ö† W_}u·â€¾® —‹Ÿ{î¹ñÀDć§ÆÿáˆÛo¿=þñÿñ#¯�={v«SÝ›}ö³ŸíV\óçÏoÕ·ß~ûukN€ž ?³ë.ºè¢X´hQ<óÌ3-}÷Ýw_<ðÀ±÷Þ{Ç�!CbíÚµQ^^žqÝ€âÆoŒÒÒÒ‰ó¡‡ÊhŸuÖYQP�LZðŠ+bÅŠqà 7DAAAŒ=:† ………Q^^ëÖ­‹ºººV× 4(n»í¶øØÇ>–HÐWuýXõL™2%&L˜ÐÒnN ½ñÆãÊ+¯Ì8å¼YEEE\wÝuqÓM7µ™D:jÔ¨nŸHþÔSOµê›ûDQQQlذ!–,Yuuu­H›Û_|qäåu½~iEEEÌ�;7cîôºDR€]‘ŸÙuÅÅÅqýõ×Ç©§ž·Þzk,_¾¼Íq%%%qöÙgÇe—]#FŒè±ø~øáH§Ó-íÉ“'ÇAÔíy¿üå/Giii,X° V­ZÕfAÏÇ´iÓâ+_ùJüñß[Ø�å¼Ðç1ÇŸÿüçã7¿ùM«dÒˆˆåË—ÇŠ+ZÆ7÷ï|Z|*•Š8 Î=÷ÜnÅóûßÿ>jjj2æŸ2eJäççwk^€ž"?³ûN=õÔ8õÔSã­·ÞŠÅ‹dž ¢®®.JKKãÀŒ#Ž8"Š‹‹;=ïÊ•+»×%—\—\rI·æhËa‡‡vXDDÔÖÖÆ›o¾k×®� 6DeeeÔ××ÇàÁƒ£´´4ößÿ8øàƒ£¨¨(ñ8 ¯Ëy¡Ïˆˆï~÷»±zõêxå•W2C#šGw#"wÞyg|ï{ß‹ÒÒÒV'Åï¬ùëGqDÜÿýqì±Çv;†Ÿþô§­’UÇ�&LèöÜ=M~&@Ï*Èu;J¥Rñw÷wqÖYgÅܹscîܹñç?ÿ9¶lÙ���‘——ãÆ�‹£�>:N?ýô˜>}z"k?ÿüóñÚk¯Å€2úO;í´DæÈù™=§Wúl6dÈ�(++‹²²²ˆˆhllŒ-[¶D~~~ :4ãT÷¤üÍßüM,Z´(ñyzù™Ù×+ }î,///FŒ‘ë0ú ù™ÉËËuÐ(ô Pè Ð'$@¡OH€BŸ�…>  }@ú€(ô Pè Ð'$@¡OH€BŸ�…>  }@ú€(ô Pè Ð'$@¡OH€BŸ�…>  }@ú€(ô Pè Ð'$@¡OH€BŸ�…>  }@ú€(ô Pè Ð'$@¡OH€BŸ�…>  }@ú€(ô Pè Ð'$@¡OH€BŸ�…>  }@ú€(ô Pè Ð'$@¡OH€BŸ�…>  }@ú€(ô Pè Ð'$@¡OH@A® K§ÓñꫯÆòåËcóæÍ1bĈ˜8qbLž<9R©TŽ#H†BŸ}؆ bÉ’%±xñâX²dIüå/‰ÊÊÊ–¯�;6ž~úéœÄVWWwß}wüò—¿Œ 6´9fôèÑñÕ¯~5þþïÿ> {8B€d)ôÙÇ,\¸0î¼óÎX¼xqüõ¯Íu8mz÷Ýwã’K.‰eË–}ä¸÷Þ{/®»îº˜3gNÜzë­1jÔ¨Š yy¹€ÎYºtiüáèµE>7mÚ3gÎlUäsÀ€ññ�<<ðÀ(..ÎøÚ«¯¾3gΌ͛7÷d¨‰Rè³)))ÉuñÏÿüÏñöÛo·´‹‹‹ã;ßùNÌŸ??æÌ™¿ÿýïcþüùqõÕWgü\³fM|ç;ßÉEȉ(ÈutÍ AƒbòäÉq衇Ɣ)SâÐC�µk×ÆÌ™3sÓsÏ=üã[Ú………qÇwÄQG•1®¤¤$Î?ÿü˜4iR\pÁQWWÏ<óLÌŸ??>ùÉOöhÜIPè³�9ñÄã˜cމ8 òòò2¾¶víÚEÕ䦛nÊh_tÑE­Š|îhÚ´iqá…Æ­·ÞÚÒwã�7Ư~õ«¬Å�-yí¡7ùØÇ>ãÇ�oUä3×V®\K–,ii—””Ä×¾öµv¯»ð £¤¤¤¥½hÑ¢xã�7²#@6õ®j‘ôYO=õTFû´ÓN‹Áƒ·{ÝàÁƒã´ÓNËè›;wn¢±ô…>IijÏ>›Ñ>æ˜c:|íŒ32ÚÏ<óL"1ô$…>é¶t:+W®Ìè;üðÃ;|ýG‘Ñ^¹re¤ÓéDbè)¹€¾oݺuQ]]ÝÒ.))‰½÷Þ»Ã×�;6Ø2GUUU¼ûî»�š£#ÊËË#???Ñ9KKK#/¯ýz¹åååÑØØ˜èÚÍíÿS®¨¨ˆúúú¬ÄPRREEE펫ªªŠÚÚÚ¬Ä0`À€0`@»ã¶oßÛ·oO|ý¡©š¨�ü¨N·ÿ½(Œ†(Ieç{QyQ™.lw\~4ÆàT]VbhŒT|�nÿç!é(Meçç!"b[º¸Cㆦj²Cyº(Ò‘jwÜ�TmäEûŽ+‡v:†�©ŠÈO5´;®ºqP4di[PœªŠÂü¼moõÑþÏNW¥¶GQ¾×µéâ¨M·/銂¨�yÕ펫KFMº$+1äG} Ì«lw\}}}TTTd%†¼¼¼(--mw\ccc”——g%†ˆˆaÆuhÜÖ­[³ƒ}Dûˆ&EEEQRÒþ¿ýÚÚÚ¨ªªÊJ 1xðàvÇõ•{Dw~Ç÷Ç}DWT¤ £¡çƒ JÕEAdç>U•.ˆºhÿyÜÀT}Eû{ž®ØžÎ�šì“ì#š4¤ó£:Ýþ½¤+Rуò>hw\c:Uéöï%]58o[‡ÆueÿÞ–¶ö#öMì#šØG4ñ\ãC}éaѤ8êc@^¿éŠÝí5Ë]ýþÝ]÷m)I•G^ªýç•�C"�¥óûúk–IÝÃí#šØG|È>¢‰çMzêñQ¯oínûˆ]ñ·Ïuõ5Ë$÷6}}‘ûlâoŸ²�h’�}DCCvž¯Ðÿ)ôI·­^½:£=zôèNÏ1zôèŒyV¯^�x¡ÏÙ³g'þF«o~ó›J–ÿÅ/~Û¶uì ¼�õÕ¯~5öÛo¿vÇý÷ÿw¼õÖ[Y‰ásŸû\L�:µÝqO>ùd,^¼8+1wÜqqüñÇ·;nþüùñì³Ï&¾þåƒ#þ\7<Ù¾_»c'l�³fç{±¦~pü²ú vÇí“_ç—¼–•¶6ÅM•‡´;®4U—~5+1DDüðƒ#:4.›1ÜX1¹Coº» dU Ëkÿþôà—u:†SÝ£ ÞnwÜ«ÊbCþ�ž¿#f ü]Œ/ZÒÛOŠ7êËJ SŠÿSÌkwܲši±¤æSY‰áÀÂÅñ7%sÚ÷VÝÁñBõYY‰aTþ[qêàÿlwÜÚµkã—¿üeVb:th\~ùåíŽ+//�›nº)+1DD|ÿûßïиlÆ`ÑÄ>¢Éa‡gŸ}v»ã–-[�<òHVbØwß}ãüóÏow\_¹G\Þ�:ƒýqÑwU}<ÞjÒî¸s¬Žý ²ó&釫÷�Åõ#ÚwJñÚ˜Z¸9+1üOÍèx¶¶ýç§öMÞoOVþ}Vb”ÚŸ/ý�vÇU¥K»´wCÿµCã‹¡�û�}Dûˆ&öM<×øP_ºGØG4ùdÑ_ãøâ÷²Ãîöšå®~ÿî¶ûˆ6œ3äßcpªýû�WÌŒÊô°¬ÄÐç_³LènÑÄ>âCöM<×hÒS÷ˆ�z mwÛG슿}~¨«¯Y&¹·éóûˆ„øÛgûü�}D“lì#ŠŠŠâ”SNéfdìŽú¤Û6mÚ”ÑîJ¡ÏQ£FeúÜyÎÞjûöíQ]]Ýî¸t:�µjjj:CcccÖb¨­­íP Y‹¡®®®C1ÔÕÕe-€þ ºº:jjj²6:�îÐýzûöíY‹!":C¶ÙG4±�hÒÐÐС’.\¿£ÆÆÆŰ;Ü#z;ûˆ&öMì#šô–}„çM:z�Ø�ÙG4±�øPoøÝÙ—öžk|8€�þ=jÑ3ì# “BŸt[UUUF{àÀ��žcçkvž³·zíµ×¢¤¤¤ÝqÙ|ƒÕš5k¢¢¢¢Ýq•••Y‹aýúõ‘ŸŸß[·f-†÷ß?–-[Ö¡qìÚ²eËbãÆ�Y›¿®®®C÷ëlï:C¶ÙG4±�h²uëÖŰ~ýú¬ÅPYYÙ¡v‡{@ogÑÄ>¢‰}D“Þ²�ð\£IGï»3ûˆ&ö²�hâ¹F“Þp�èK>êžiÑ3ì# S^® ïÛ9½¸¸¸Ós 0à#çèíú¤Ûjjj2Ú………�ž£¨¨(£½}ûönÅÐÓ r}_qqqF»®®®ÓsÔÖÖ~䜽ÕÇ?þñ:th»ãþøÇ?FuuuVbØo¿ýâcûX»ã/^›7oÎJ {ï½wLš4©ÝqkÖ¬‰µk×f%†½öÚ«C1lÞ¼9^{íµ¬ÄÐLš4)Þ~ûí˜?~Væ/,,ìÐýzÛ¶mñôÓOg%†ˆèP sæÌÉZ öMì#š 6¬C1444ÄâÅ‹³àAƒ:Ãîp�èíì#šØG4±�hÒ[öžk4iû±>+kôUöMì#>dÑÄs�&½áЗ|Ô=Ó>âCöM²¹�€f©t:�Îu$㥗^Š™3g¶´ÇŽÛ#Åoî½÷ÞøáØÒ>餓â–[néÔ³fÍŠgžy¦¥ýƒü ¾üå/w9¦ºººX²dIFß~ûíùùù]ž³-¥¥¥‘——×î¸òòòhllLtífƒŽ‚‚ököVTTD}}}Vb())‰¢¢¢vÇUUUµ*ꚔĀڷ}ûöؾ}{âëïÿ¯s£6ò£:Ýþ÷¢0¢$•�ïE}äEeº°ÝqùуS�/ÊÛ�‘ŠÒíÿ<¤"¥©ìü¢IQQQ””´ÿo¿¶¶6ªªª²CAAA <¸Ýq}å±ÿ¿ÎírýqÑéÂhˆöïSƒRuQÙ¹OU¥ ¢.Ú70UEÑþž§+¶§ó£fû¤7öù|ËçöMÒùQ�nÿ^Ò©hŒAy´;®1�Šªtû÷’®œ·­Cã*ÛS{GŒ» uÁûˆ&öMì#šx®ñ¡Þz�È»òw­ÆíÎûˆG} èÀë7]±»½f¹«×Ïv×}D[JRå‘—jÿ9Deã�Hwàù@Wôõ×,ÛÚŸu…}DûˆÙG4ñ\£IOÝ#>ê5´Ým±+þöù¡®¾fÙ•¿qîJ_ßG$Åß>›ìøšåþ—ïúߟ}ćì#štfÑÐÐkÖ¬Éè›2eJ¶ÿû è¾¶ò@ý$›Úz’¶cždËG=GèkìÑè öhô{4 ¿°?£'ØŸÑìÏ€þÂþŒž`FO°?#[zCZv²ÚÙ­ìüÀêêöùw¶ó5ySag•––æ,Á³#IýÙÖ‘7If[IIIV¾·�ÑÑ7ÅuVGßXQù±-�lÑÙÎjˆ¼NÅœ éHå<†ˆÎ}ï²¥#oŒèx!€®èHѦlkz#Xç‡$©(UÓ¡7ÅeSaª. SÙû^wDAAA‡ß –-yyy9�!¢ãoŠË&ûˆ&ýyÑEEE*2�M}åÑ¿ãûÒ>"›:Rl!ÛªÓQ�ã—8ì#šä§bpŽcÈK¥sCDrû÷îÜsí#šØG4±�hâ¹Æ‡zÃ=Â>¢IMDMŠheSyͲ»¿ûÛ>¢;:R5Ûzëk–=}·�hbñ¡ÞCoØGx®Ñ¤»÷ˆ$^ßê/ûˆîò·Ïíüše.ö6½uÑÓ¼fÙÄ>âC½!†¾¶�¨«ËN!iú¿¼\@ß7bĈŒö{ï½×é96lØð‘sôv }Òmûï¿F»+…>w¾æ€èVL=M¡OºmìØ±1`À€–vUUU¬[·®Ãׯ[·.ª««[Ú%%%1f̘DcÈ6…>é¶T*&LÈè[´hQ‡¯å•W2Ú&LˆT*•Hl=E¡OqüñÇg´Ÿþù_û /d´O8á„$BèQ }’ˆO<1£ýøã�Geee»×UTTÄã�?žÑwÒI'%@OPè“DLœ81=ôЖvUUUüüç?o÷ºŸÿüçQUUÕÒž:ujŒ?>+1d“BŸ´i„ /½ôR»×|ãßÈhÿìg?‹—_~y—ãÿô§?µ*zùå—w)^€\+ÈutÞÂ… £¦¦¦UÿŠ+2Ú555ñ /´9ÇÈ‘#cüøñ‰Æõ©O}*Ž9æ˜xî¹ç""¢®®.¾öµ¯ÅW\_üâcàÀ�QUU<ð@\ýõQWW×rýqÇÓ§OO4&€ž¢ÐgtÕUWźuëÚ·qãÆø‡ø‡6¿VVV×^{mÒ¡Åu×]û·k×®�ˆ¦b£×\sM\ýõ1nܸH§ÓñÎ;ï´*Tú±�},+ñô”¼\@ÿ²çž{ÆÝwß'NÌèß¾}{¼öÚkñú믷*òyðÁÇÝwßÇïÉP¥Ð'‰;vlüú׿Ž+¯¼2F޹Ëq#GŽŒ«®º*xà�3fLF�¼‚\@ç=ýôÓY_cåʕݺ¾¨¨(.ºè¢øÚ×¾ùË_båÊ•±iÓ¦ˆˆ1bDLœ81&OžyyjÍýƒBŸdU^^^L™2%¦L™’ëP²*/×@ Ð'$@¡OH€BŸ�…>  }@ú€(ô Pè Ð'$@¡OH€BŸ�…>  }@ú€(ô Pè Ð'$@¡OH€BŸ�…>  }@ú€(ô Pè Ð'üìÝmp•å�?ð_„ĉ$#*K‰]­�(CÚºhµ ÛÆÕÖ:m—eµ¶Egg»+ÚYWÙñ¡•Š»ZݵÖé´µÖ¨e×'@ɨE„UQ�`PWMˆ9!ù¿èîù÷Žsà'$ŸÏ /~×¹®ëþž3¾¸_d¾¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤@Ñ'¤`d±À`õÖ[oÅ‹/¾o¿ývär¹¨¬¬Œ£�>:êêꢬ¬¬Øñö‹ÖÖÖX»vmlÞ¼9ÚÛÛ#›ÍÆ„ ¢®®.ªªªŠEŸÐËòåËãŽ;îˆuëÖíöól6gŸ}vÌ›7/ª««4Ë׿þõX½zõ^Ÿÿþ÷¿gŸ}vÁç^y啸í¶Ûâ·¿ýmtwwìó#FÄŸþéŸÆ_ÿõ_ÇÔ©S÷: %™b€Á¢³³3¾õ­ożyóöXòÑÞÞ÷ß|å+_‰5kÖìÇ„ûÇ¿üË¿Ä9眿ùÍov[ò±k×®øÍo~çœsNÜwß}û9! NŠ> "º»»cÁ‚ñ‹_ü"±>bĈ8òÈ#£¶¶6F��ø¬¥¥%¢±±qFPË–-‹n¸!ºººëãÆ�‹Ï|æ31nܸÄzWWW,Z´(þõ_ÿuÆ€Aid±À`°téÒX±bEbíüóÏ�Ë/¿ÏŒ;6¾úÕ¯&Ö~ò“Ÿ¤ž Š>ÖÖ®]---ùy„ 1}úô~�=÷ÜsóŠ+RͶ¿tvvÆ“O>™X;çœsúu¶÷¾ÿüÏÿŒÎÎÎÔ²À�DÑ'ÃÚÊ•+s}}}”””ôël}}}b^µjU´··§–mé�û¨£ŽŠ#Ž8¢_g�<òÈøô§?�ŸÛÚÚbÍš5iG€‚¢O†µõë×'溺º~Ÿ­©©Ibær¹xõÕWS˶¿ôþ >÷¹Ït¾÷oÖû>.}0¬½þúë‰yÒ¤I�Ÿø ^yå•X³fM¬[·.¶nÝ»víÚëûzgîý�>Iïßìµ×^Ûë,p YìP,ÑÔÔ”X?~|AwvØa‰yÓ¦Mûœ«/sæÌ‰ 6Dwwwb=›ÍF]]]Ìš5+æÌ™£F�ê÷�½3úôÞ?п V™b€bimm�žžžü\ZZcÇŽ-莚ššÄ¼cÇŽT²íÉúõë?VòÑÞÞO>ùdüíßþmœvÚiñØc�õûÎÞ™{§OÒ{KKKAç`¨YìP,íí퉹¼¼eêíâ‹/Žººº¨ªªúØg¥¥¥QQQ&Lˆ3Ï<3ž{òÊ+£¹¹9¿ç–[n‰SN9%¦N�ºÇg|ôÑG‰¹Ð¢ÏÞû{ßÃE¦Ø XzTær¹‚ïè]ZVV¶O™zûÒ—¾´Û’ÏÝ™6mZÜwß}‰ý===që­·öy®wæÞßé“ ôoŠ‘ÅÅRQQ‘˜?ú裂ïè}&›ÍîS¦}5qâÄøö·¿ .̯­\¹2Þ{ï½3fÌnÏd³Ùعsg~.´è³££ãc÷¥iÊ”)1r¤?}f 4;@*Ž=öØbGH‘w4`hðŽ ÞÏ€¡Áû0tx?†ïg ”®®®Ø¸qcQ3øk7†­Þ…”ÑÓÓ%%%ý¾£½½½Ï;‹aΜ9qÓM7EKKKDDtwwÇÓO?ög¶ÛýÙl6vìØ‘Ÿ{§Oò‡%¡ÿw_šÊËË£´´4Õ;`¨9è ƒŠ€^¼£ .ÞÏïg ”\.Wì‘)v(–ªªªD©g.—K^öGsssb;vl*ÙöE&“‰“O>9±¶iÓ¦=îï�¹÷wú$ƒñ7€bPô À°U^^‡~xb­©©© ;¶mÛ–˜�>úè}Ε†ñãÇ'æÖÖÖ=î=ꨣs¡¿Aïý½ï€áBÑ'ÃZïRÊ×^{­ ó½÷–¢Ï‘#G&æ\.·Ç½½3ú¼þúë}ÞÃ…¢O†µÚÚÚÄÜØØØï³Û·o�­[·æçÒÒÒ˜4iRjÙöŻロ˜«««÷¸wêÔ©‰yíÚµ=«÷þÞ¿) Š>ÖfΜ™˜Ÿ~úéèééé×Ù§žz*1OŸ>=***ÒŠ¶OžþùÄ<~üø=î�>}zd³ÙüüÆo$ Lû²eË–xã�7òsEEEœ|òÉ……€!BÑ'ÃZ]]]TUUåçÍ›7ǪU«úuöá‡Ņ�vZªÙöÖêÕ«ã­·ÞJ¬Í˜1c�ûËÊÊâóŸÿ|bí§?ýi¿žÕ{ß¿øÅ5jT?“ÀТè€a-“ÉÄYg�•X»ýöÛ£§§§ÏsÏ<óL<÷Üsù¹¢¢"fÏž=  ÑÞÞ‹-J¬M™2%&L˜Ðç¹sÏ=71ÿøÇ?Ž–––>ÏìØ±#xà�>ï€áDÑ'Ã^CCCd³Ùü¼zõê¸ûî»÷¸¿¹¹9®½öÚÄÚE]ÕÕÕ}>ç˜cŽIü[µjUŸû-ZÍÍÍýø¿×ÒÒ—]vYlذ!±>þüO<;sæÌ8á„òó{ï½×\sMär¹ÝîïììŒk¯½6Þ{ï½üÚ´iÓâ‹_üb¿óÀP£è€a¯ºº:.½ôÒÄÚâÅ‹ã{ßû^¢h³»»;–/_çŸ~lݺ5¿~衇ÆÜ¹sSÏuß}÷Åé§ŸóæÍ‹Ÿÿüç±eË–ÝîÛ¶m[,]º4Î<óÌxöÙgŸ�~úéqÆgôëyW_}ud2ÿÿOŒŸx≘;wn¬[·.±ïw¿û]|ã߈'žx"¿6bĈ¸úê«ûûÕ`HYì0444Dccc¢¼òÁŒ‡z(?üð=ztlÙ²%ÞÿýĹòòò¸õÖ[£²²r@ruvvÆòåËcùòåqðÁǸqãbôèÑÑÕÕï¾ûnlß¾}·g§M›‹/î÷³¦M›W^yeÜ|óÍùµÕ«WÇÙgŸ‡zhŒ7.¶oßï¼óÎÇÎ^}õÕq 'öå`ˆQô ‘Édâ¶Ûn‹… Æ£�>š_ßµkWlÞ¼y·gÆŒK–,‰OüðÃ>÷d2™˜;wn,X° JKK º¿¡¡!FŒ7ß|sìÚµ+¿¾}ûöÝŠŽ1"¾ýíoÇÅ_\Ðs`(Ê; eeeqË-·Ä’%K¢¶¶v�û²Ùl|õ«_�_ýêW1}úôËsÝu×ÅW¾ò•?~|¿ö�7..ºè¢øõ¯W_}uÁ%ŸÿgîܹñÓŸþ4fΜ™Ìîÿä8“ÉÄ©§ž�<òˆ’Oø_#‹›Y³fŬY³âÍ7ߌ^x!š››#—ËEeeeLš4)êêꢬ¬¬à{7lØPÐþóÎ;/Î;(ˆhmm�×^{-ššš¢¥¥%vîÜ#FŒˆÊÊʨªªŠc�=6&L˜Pp¦=©­­�üàÑÒÒk×®�Í›7G{{{d³Ù˜0aBÔÕÕEuuujÏ€¡@Ñ'ìÁĉcâĉŎUUU1mÚ´ýþÜêêê8ýôÓ÷ûsà@”)v }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ }@ F;éyë­·âÅ_Œ·ß~;r¹\TVVÆÑGuuuQVVVìxCš¢Ï!`ùòåqÇwĺuëvûy6›�³Ï>;æÍ›ÕÕÕšåë_ÿz¬^½z¯Ïÿûß�³Ï>;ÅDûG¦ØØ{���ñ­o}+æÍ›·Ç’ψˆööö¸ÿþûã+_ùJ¬Y³f?&>} º»»cÁ‚ñ‹_ü"±>bĈ8òÈ#£¶¶6F��ø¬¥¥%¢±±qFF;{géÒ¥±bÅŠÄÚù矗_~yÔÔÔDÄïË@W¬X7ÜpC455EDÄÎ�;cÁ‚ñË_þòcE aÙ²eíŸ@­­­q×]w%Ö®ºêª¸ä’Kk™L&Î8ãŒ8þøãã‚ .ˆ­[·FDÄÛo¿Ë–-‹ùóçxÖúúúÀ`�)v ·téÒhkkËÏ'�tR444ìqMMM\ýõ‰µ{ï½7Z[[,#Àp£èóÓÝÝ�<òHbíŠ+®ˆ’’’>Ï͘1#¦M›–ŸÛÚÚâ±Ç�ŒÃ‘¢ÏÌÚµk£¥¥%?O˜0!¦OŸÞ¯³çž{nb^±bEªÙ†3EŸ˜•+W&æúúú())é×ÙúúúļjÕªhooO-Àp¦èó³~ýúÄ\WW×ï³555qÄGäç\.¯¾újjÙ†3EŸ˜×_=1Oš4© ó“'Oîó¾�ðÁÄ+¯¼kÖ¬‰uëÖÅÖ­[c×®]þ\€ýid±ÐÑÔÔ”X?~|AwvØa‰yÓ¦Mûœ«/sæÌ‰ 6Dwwwb=›ÍF]]]Ìš5+æÌ™£F�ÐMÑ礵µ5zzzòsiiiŒ;¶ ;jjjóŽ;Rɶ'ëׯßíz{{{<ùä“ñä“OÆ’%KâÚk¯�Ù³gh–ŽŽŽèêêÐgÀ�nçÎ�ÅŽÀð~0¸x?|¼£1Pü­{KÑ礽½=1———GIIIAwd³Ù>ï,†wÞy',X/¾øb|ç;ß°çlܸqÀâå—_.vþ€÷3€ÁÅûÀàã l}@ÚÚÚsYYYÁwô>3EŸeeeQ__§œrJÔÖ֯ĉcôèÑÑÙÙ---ÑØØ�>úh¬\¹2zzzòçî¹çž¨ªªŠK.¹$õLMÑ礳³31—––|ǨQ£sGGÇ>eêíâ‹/Žººº¨ªªúØg¥¥¥QQQ&Lˆ3Ï<3ž{òÊ+£¹¹9¿ç–[n‰SN9%¦N�šj.€�¦èóÒ»¤3—Ë|Gï²Ð²²²}ÊÔÛ—¾ô¥~ï�6mZÜwß}ñ—ù—ÑÚÚ===që­·Æ]wÝ•j®ˆˆ)S¦ÄÈ‘þ“g 4;@*Ž=öØbGH‰÷3`hð~ ÞÏ€¡Áû0´xG†ïh ”®®®Ø¸qc±cpÒzx©¨¨HÌ}ôQÁwô>“Íf÷)Ó¾š8qb|ûÛߎ… æ×V®\ï½÷^Œ3&Õg•——GiiiªwÀPsÐA;ÀûÀàâý `ðñŽÆ@Ù›ÿ7DDdŠ€þë]ÊÙÑÑ===ÝÑÞÞÞç�Å0gΜ¨®®ÎÏÝÝÝñôÓO1@á}@ªªª¢¤¤$?çr¹Ø±cGAw477'æ±cǦ’m_d2™8ùä“k›6m*R€½£èóR^^‡~xb­©©© ;¶mÛ–˜�>úè}Ε†ñãÇ'æÖÖÖ"%Ø;Š>0GuTb~íµ× :ß{ÿ`)ú9rdbÎårEJ°w}`jkksccc¿Ïnß¾=¶nÝšŸKKKcÒ¤I©eÛï¾ûnb®®®.R€½£èó3sæÌÄüôÓOGOOO¿Î>õÔS‰yúôéQQQ‘V´}òüóÏ'æñãÇ) ÀÞQôy€©««‹ªªªü¼yóæXµjU¿Î>üðÉù´ÓNK5ÛÞZ½zu¼õÖ[‰µ3f) ÀÞQôy€Éd2qÖYg%Ön¿ýöèéééóÜ3Ï<Ï=÷\~®¨¨ˆÙ³gHÆB´··Ç¢E‹kS¦L‰ &)ÀÞQôyjhhˆl6›ŸW¯^wß}÷÷777ǵ×^›X»è¢‹¢ºººÏçsÌ1‰«V­êsÿ¢E‹¢¹¹¹ßà÷ZZZâ²Ë.‹ 6$ÖçÏŸßï; EŸ êêê¸ôÒKk‹/Žï}ï{‰¢ÍîîîX¾|yœþù±uëÖüú¡‡sçÎM=×}÷ݧŸ~zÌ›7/~þóŸÇ–-[v»oÛ¶m±téÒ8óÌ3ãÙgŸM|vúé§Çgœ‘z6€�6²ØØ; ÑØØO<ñD~íÁŒ‡z(?üð=ztlÙ²%ÞÿýĹòòò¸õÖ[£²²r@ruvvÆòåËcùòåqðÁǸqãbôèÑÑÕÕï¾ûnlß¾}·g§M›‹/�\MÑç*“ÉÄm·Ý .ŒG}4¿¾k׮ؼyónÏŒ3&–,Y'žxâþŠ~øa|øá‡}îÉd21wîÜX°`A”––î§déRôy+++‹[n¹%fÍšwÞyg¬_¿~·û²ÙlÌ™3'®¸âŠ;vì€å¹îºëâÙgŸ�µkׯ¶mÛ>qÿ¸qãböìÙqá…ÆÄ‰,Àþ ès˜5kVÌš5+Þ|óÍxá…¢¹¹9r¹\TVVƤI“¢®®.ÊÊÊ ¾wÆ í?ï¼óâ¼ó΋ˆˆÖÖÖxíµ×¢©©)ZZZbçÎ�1bĈ¨¬¬Œªªª8öØcc„ g¬}!'NŒ‰';FDDTUUÅ´iÓŠ`¿É; Š> Š> Š> Š> Š> Š> Š> Š> #‹«·Þz+^|ñÅxûí·#—ËEeee}ôÑQWWeeeû=O.—‹M›6Å«¯¾ï¾ûn´µµE6›�1cÆÄ1ÇS¦L‰L&³ßs¿§èzY¾|yÜqDZnݺÝ~žÍfãì³ÏŽyóæEuuõ€fÙ¼ys<þøãñôÓOÇóÏ?{Ü;zôè8óÌ3㢋.ŠOúÓ=ç‘G‰… îuΓO>9î»ï¾½>C�¢Oø_���qÍ5×Ä/~ñ‹>÷µ··Çý÷ß¿úÕ¯bÉ’%qÒI' H– /¼0^xá…~ŸùàƒâÇ?þq<ôÐCñ7ó71wîÜ())I=°{™b€Á »»;,Xð±’Ï#FÄ‘Gµµµ1zôèÄg---ÑÐÐ���©çÉår{,ù,++‹#�<2Ž;ÿÐ!‡·ß~{d³ÙüÚûï¿ÿñÿ‘Z.`Ï}0¬uwwÇ#�<’X»âŠ+>±XsÆŒ1mÚ´üÜÖÖ�=öXj¹F�3gÎ,ø\MMMÌ™3'±öä“O¦ è“¢O†µµk×FKKK~ž0aBLŸ>½_gÏ=÷ÜļbÅŠT³í­?, �ˆhjj*R^}0¬­\¹21×××GIII¿ÎÖ××'æU«VE{{{jÙöVeeebþàƒŠ”†EŸ këׯOÌuuuý>[SSGqD~Îårñꫯ¦–mo577'檪ª"%€áed±@1½þúë‰yÒ¤I�ŸçÚ~øaüú׿N¬�rÊ)ßóƒü -Zmmm‰õL&S¦L‰úúú¸ð ãˆ#ŽØ§¼0”dŠŠ¥µµ5zzzòsiiiŒ;¶ ;jjjóŽ;Rɶ·î¸ãŽhooÏÏUUUqê©§|Ïo¼ñ±’ψˆîîîxå•Wâž{î‰/ùËñw÷wÑÑѱO™`¨YìP,XˆQ^^%%%Ý‘Ífû¼sZ»vmÜ{iµË.»,:è y^WWWüÛ¿ý[¬]»6~ô£Å¡‡: Ïéè舮®®¹†Š�;w;½xG\¼Ÿ .ÞÏ(ƒáoÍ}0lµµµ%æ²²²‚ïè}¦XEŸ;vìˆ+¯¼2víÚ•_;î¸ãâ /,èžÚÚÚ˜9sf|îsŸ‹É“'GUUU”––ÆÿüÏÿÄÆ�ã¿þë¿â'?ùI|ðÁù37nŒK/½4î¿ÿþ�Ÿ¦aãÆ�©ß CÍË/¿\ìôâ `pñ~0¸x?c(Sô À°ÕÙÙ™˜KKK ¾cÔ¨Q‰¹££cŸ2í�ÎÎΘ7o^lÛ¶-¿VQQ‹/Ž#FôëŽc�=6y䑸Ìg>³ÛÏ?õ©Oŧ>õ©¨¯¯�K/½4®¹æšX¾|yþóuëÖÅ’%Kâ»ßýî¾}8€eŠŠ¥wIg.—+øŽÞe¡eeeû”©PÝÝÝñ­o}+ók#FŒˆ›o¾9&NœØï{¦N�ºÇ’ÏÞ9ä�øçþçøò—¿œXà�¢¹¹¹ßÏ€¡fd±@±TTT$æ�>ú¨à;zŸÉf³û”©PßûÞ÷âñÇÏÏ%%%qÝu×Åi§�6 ÏÍd2±hÑ¢xöÙgãý÷ß�ˆßÿ�=öX\|ñÅ©>kÊ”)1r¤?}f 4;@*Ž=öØbGH‘w4`hðŽ ÞÏ€¡Áû0tx?†ïg ”®®®Ø¸qcQ3øk7†­Þ¥œÑÓÓ%%%ý¾£½½½Ï;ÒâÅ‹ãßÿýßkßýîwãœsÎÙ/Ï?ä�CâœsΉeË–åמzê©Ô‹>ËËË£´´4Õ;`¨9è ƒŠ€^¼£ .ÞÏïg ”\.Wì‘)v(–ªªªD©g.—‹;vtGsssb;vl*Ù>ÉøÃøá˜X›7o^ê%›ŸdÆŒ‰yÓ¦Mûõù0˜(ú`Ø*//�Ã?<±ÖÔÔTÐÛ¶mKÌG}ô>çú$?þñ�cñâʼnµ‹.º(æÏŸ?àÏîí°ÃKÌ---û= Š>ÖŽ:ê¨ÄüÚk¯t¾÷þ�.úüÙÏ~×]w]bíœsΉk®¹f@Ÿ»'#GŽLÌ]]]EɃ�¢O†µÚÚÚÄÜØØØï³Û·o�­[·æçÒÒÒ˜4iRjÙz{üñÇãšk®‰žžžüÚìÙ³cÑ¢EQRR2`Ïí˻ロ˜«««‹’EŸ k3gÎLÌO?ýt¢H³/O=õTbž>}zTTT¤-aåÊ•qÕUWÅ®]»òk3gÎŒ›nº)2™âýYðóÏ?Ÿ˜;ì°"%€âSô À°VWWUUUùyóæÍ±jÕª~�}øá‡ói§�–j¶ÿ³zõê˜?~är¹üÚôéÓcÉ’%QZZ: Ïì�®®®øÙÏ~–X›1cFqÂÀ  è€a-“ÉÄYg�•X»ýöÛ£§§§ÏsÏ<óL<÷Üsù¹¢¢"fÏž�z¾—^z).½ôÒèèèȯ�p qç�wFYYYêÏ+ÄøÃxóÍ7k_úÒ—Š”ŠOÑ'Ã^CCCd³Ùü¼zõê¸ûî»÷¸¿¹¹9®½öÚÄÚE]ÕÕÕ}>ç˜cŽIü[µjUŸûÿû¿ÿ;¾ùÍoF[[[~­¶¶6î¾û¨èól!xà�xæ™g :³lÙ²X²dIbí´ÓN‹?ù“?I-hF;[uuu\zé¥qË-·ä×/^MMMqÙe—EMMMDDtwwÇo~ó›¸þú룩©)¿÷ÐC�¹s禚iûöí1wîÜxï½÷òkÙl6¾ùÍoÆï~÷»‚﫯¯ßãg/¾øbüýßÿ}L�:5fÏž_üâã�ÿø�cÔ¨Q‰};wîŒgžy&î¹çžX³fMâ³1cÆÄÂ… ÎC‰¢Oˆˆ†††hllŒ'žx"¿öàƒÆC=‡~xŒ=:¶lÙï¿ÿ~â\yyyÜzë­QYY™jžM›6ÅöíÛkíííqÕUWíÕ}6løÄ=¯¼òJ¼òÊ+ñOÿôO1räÈ8ì°ÃbôèÑQZZï¿ÿ~lݺ5r¹ÜÇÎUTTÄ]wÝôG´WÙ`¨Pô ‘Édâ¶Ûn‹… Æ£�>š_ßµkWlÞ¼y·gÆŒK–,‰O }@^YYYÜrË-1kÖ¬¸óÎ;cýúõ»Ý—ÍfcΜ9qÅWÄØ±c÷sÊô]pÁQYYÏ=÷\lܸ1r¹\ŸûËÊÊâä“Oޝ}ík1sæÌ())ÙOI`pSô ½Ìš5+fÍšo¾ùf¼ð ÑÜܹ\.*++cÒ¤IQWWeeeß»aÆ~ï�>}zAû÷Åg?ûÙøìg?���ñúë¯Ç–-[¢¹¹9ÚÚÚ¢««+>øà¨¬¬Œ£Ž:*jkkcÔ¨Qû%H}ÀLœ81&NœXìûÕ¨Q£bêÔ©1uêÔbG€N¦Ø`(Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )Pô )PôùÿØûóh¹Ê2ÜþTæ2 !2ˆ ˆ 32Iƒ¢ÝAm™hQm•o#46­"ØŠ€@fl~4    �ÄaH ™È<§Þ?ò¦Le lô `£O¨}@Øè*ÀFŸP6ú€ °Ñ'T€�> lô `£O¨}@Øè*ÀFŸP6ú€ °Ñ'T€�> lô `£O¨}@Øè*ÀFŸP6ú€ °Ñ'T€�> lô `£O¨}@Øè*ÀFŸP6ú€ °Ñ'T€�> lô `£O¨}@Øè*ÀFŸP6ú€ °Ñ'T€�> lô `£O¨}@Øè*ÀFŸP6ú€ °Ñ'T€�> lô `£O¨}@Øè*ÀFŸP6ú€ °Ñ'T€�> lô `£O¨}@Øè*ÀFŸP6ú€ °Ñ'T€�> lô `£O¨}@Øè*ÀFŸP6ú€ °Ñ'T€�> lô `£O¨}@Øè* Eµ  rÆ�Ÿ‘#GfòäÉY²dI¶Új«ì´ÓNÙgŸ}ÒºuëªÕU,3jÔ¨Œ3&3fÌH’tíÚ5}úôIß¾}S(ªVÀúÈg&3gÎ̈#2a„̟??íÚµKïÞ½³Ï>û¤sçÎ[š}6�?þxþçþ'£F�Zë÷íÚµËç?ÿùœ{î¹éÒ¥KƒÕµdÉ’ :4·ß~{¦L™²Ös¶Ûn»œvÚi9å”SÒ²eË« `}ä3“¿ÿýï¹îºëòç?ÿ9Ë—/_ãûæÍ›çÐCÍ׿þõôéÓg“×€¦¤Yµ `Ó-^¼8]tQÎ=÷Üu†H“dþüùùõ¯�c�=6Ço�Ú&Mš”/}éKùá¸Îi’Lž<9×\sMŽ?þøõžÐä3W¸ýöÛó…/|!O>ùäZ7ùL’eË–åÉ'ŸÌ¾ð…ÜqÇ›´456úl¤–/_ž .¸ ÿû¿ÿ[v¼yóæéÕ«WöØc�tìØ±ì»3f䬳ÎÊK/½T¯µMŸ>=§žzjF�]v¼M›6Ùu×]³óÎ;§uëÖeß�5*§žzjf̘Q¯µ¬‹|æ ·Þzk®ºêª,]º´ìøG>ò‘ôíÛ7ùÈGÊŽ/]º4W^ye†ºQë@Sd£ÏFêæ›oÎO31bDþë¿þ«ìؾûî›ûî»/Ï<óLéÿÞsÏ=Ùwß}Ëλæšk2räÈM¼ChlôÙÍœ93¿øÅ/ÊŽ]xá…¹âŠ+Ò­[·Ò±f͚娣ŽÊï~÷»ôìÙ³t|òäɹõÖ[륶gžy&O?ýtiܲeËÜrË-9í´ÓÒ¶mÛÒñvíÚåôÓOÏÍ7ßœ–-[–ŽÿéOÊóÏ?_/µ¬‹|æ ?üá³lÙ²ÒøðÃÏ-·Ü’¾}û–�ׯ_¿ÜrË-9ì°ÃJÇ–.]šþð‡{{ФØè³ºùæ›3oÞ¼ÒxàÀ�9묳Öy~·nÝòƒü ìØm·Ý–™3gV¼¶ë®»®l|ÖYgeàÀ�ë<ß}÷Í™gžYvì'?ùIÅëXùÌä©§žÊK/½TwêÔ)W]uUZµjµÖó[µj•«®º*�:u*>|xž}öÙ ®M•�>™åË—ç¾ûî+;vÞyç¥P(¬÷º8  (�çÍ›—?þñ�­mìØ±9rdiÜ®]» 2dƒ×�yæ™i×®]iüÒK/eܸq­ `]ä3W¸çž{ÊÆ'�tRºté²Þkºvíš/ùËeÇî¾ûî ÖM•�>™#FdÆŒ¥qïÞ½³ß~ûÕéÚ/~ñ‹eã'žx¢¢µ­>ß1Ç“:lðº:ä˜cŽ);öøã�W´6€u‘ÏL/^œgžy¦ìؾð…:Õ¸úyO?ýt/^\§k ©±Ñg#óÔSO•�<ðÀ ¾-~ÕsWõ /dþüùõVÛÁ\çkW¯íOúSEjØùÌ5ëÞqÇÓ³gÏ:­Ó«W¯ì°Ã¥ñ¼yó2|øð:× M‰�>™1cÆ”�÷ÙgŸ:_Û­[·²Àå’%Kòæ›oV¤®b±˜±cÇ–ûøÇ?^çëW¿�±cǦX,V¤6€õ‘Ï\óï`cÖYÛZ«Ï[ }62o½õVÙxç�wÞ¨ëwÙe—õη©Þÿý,X° 4n×®]zôèQçë{öì™¶mÛ–ÆóçÏϤI“*RÀúÈg®Yóê÷´!«ÿ��7n£®€¦¢Eµ  î.\˜‰'–ëÞ½ûFͱÝvÛ•�ß~ûíÍ®kmó¬¾N]l·Ýveó¼ýöÛF]ÕÚÞ6¿téÒMš ê¢Skû&Sÿ–·ìTíØ,Y²¤Ú%T„þŒ† ?£!èÏ€¦BFCПÑôg@S¢G£!èÑhz4êËÚòfkË¥Ñ4Èg®}­�ý;XýüÍù;�¥¡ù‰†àg$‚Ÿ‘€¦D�FCУÑôh@S¡?£!èÏhú3 ©ÐŸÑôg4ýõ¥r 6úlDfΜYöÿ -[¶L×®]7jŽnݺ•�§OŸ^‘ÚVŸgS‚¤Ýºu+ unNmË–-[ãØèÑ£7y>Ø�ÿûüÆÿÿW?õù`KÑ¢ÚPw« —,Y²Ñs¬FÝ”7»¯ÍêóT»¶Ö­[gÏ=÷,;Ö¼yó …Mž€-C±X̲eËÊŽU*oGí‘ÏüÇñ ¬óºJ­Sr lªZÈ�Úè³iß¾}ÙxSÞt¾ú5íÚµÛ¬šÖ5ϦԶúâ7§¶fÍš¥mÛ¶›|=°e�ÏüÇñÍÙèSVhVí¨»Õ� .L±Xܨ9æÏŸ¿Þ97Õêó¬ô¬«Õ¯©Tmë"Ÿ¹öã«ßS¥Ö€¦ÎFŸ�HçÎ�S(Jã%K–dúôé5Ç”)SÊÆ]»v­Hm«Ï3yòä�ž£¾jXù̵_ýºJ­M��>‘6mÚ¤G�eÇ&Nœ¸QsLš4©l¼ÓN;mv]I²ãŽ;–�7%Hºú5•ª `]ä3×¾ÖÆþ¬~þêóÀ–ÂFŸ�Ìê¡ÇqãÆmÔõ«Ÿ_© iÏž=Ó¦M›Òxþüùyÿý÷ë|ýû￟ ”ÆíÚµK÷îÝ+RÀúÈg®YóÆþ¼õÖ[ë�¶6úldöØc�²ñK/½Tçk?øàƒ²pgË–-³óÎ;W¤®B¡�Ýwß}“k1bDÙx÷ÝwO¡P¨Hmë#Ÿ™ôéÓg½×nìZ«ÿ�À–ÂFŸ�Ìa‡V6~î¹çR,ëtí³Ï>[6Þo¿ýÒ¾}ûJ•¶Fm«¯·>Ï=÷\ÙøðïDI$Ÿ¹¢îvíÚ•Æï¼óNÙ¦ëóÞ{ïå�wÞ)�Û·oŸ}÷Ý·Îu@Sb£ÏFfŸ}öIçÎ�Kã &ä…^¨Óµ÷ÜsOÙøˆ#ލhm«Ï÷È#�dÞ¼y¼nîܹyä‘GÊŽyä‘­ `]ä3“Ö­[ç ƒ*;vï½÷Ö©ÆÕÏ;ä�CÒªU«:] M��>™fÍšå¸ãŽ+;ö³Ÿýlƒo�6lXþú׿–Æí۷ϧ?ýéŠÖÖ§OŸôëׯ4ž?~n¾ùæ ^wóÍ7gþüù¥ñÞ{ï�]vÙ¥¢µ¬‹|æ _üâËÆwÞygf̘±Þk¦OŸžßüæ7ë�¶$6úl„Î:무k×®4~ñÅsÓM7­óü)S¦äÛßþvÙ±SO=5]ºtYï:»ï¾{ÙŸº¼™þüóÏ/ßtÓM>|ø:ÏñÅ×›^pÁ\ ’ä3“Ã;,{ï½wiüá‡æòË/Ï’%KÖzþâÅ‹óío;~øa騀rÈ!‡lp-hªlôÙuéÒ%gŸ}vÙ±ÿþïÿÎ÷¿ÿýL™2¥tlùòåyüñÇs 'äý÷ß/ßvÛm3xðàz©í“Ÿüd>øàÒxÉ’%2dHn¿ýö,X° t|þüù¹í¶Ûræ™g–…?=ôÐpÀõRÀºÈg®pñŧY³DŒÿô§?eðàÁ5jTÙy¯½öZ† ’?ýéO¥cÍ›7ÏÅ_¼Ñ÷MI¡X,«]oùòå9çœsÊ‘Ɋ€d�=Ò±cǼ÷Þ{™={vÙ÷mڴɯ~õ«|âŸØà»ï¾{ÙxèСÙo¿ý6xÝ´iÓrüñÇç½÷Þ[cíÞ½{§X,f„ Y´hQÙ÷Ûo¿}~ÿûßoðMöõA>s…›nº)×^{íÇ·ÝvÛ|ä#É|�©S§®ñý¥—^š3Î8£Îë@SÔlçP‹š5k–ë®».Ç{lÙñeË–e„ =zô!ÒN�:å—¿üe�B¤›c›m¶ÉСCÓ§OŸ²ã .Ìo¼‘7ß|s�é{ì‘¡C‡Úä¨ùÌÎ:ë¬|ë[ßJóæÍËŽðÁ5jÔ›|6oÞ<—]v™M> 6úlÔZ·n�ýèGùéOš=öØc�çµk×._þò—óðÃ×é�ï•гgÏÜ}÷ݹ袋²í¶Û®ó¼m·Ý6_|qîºë®tïÞ½AjXùÌœ{ï½7‡vXš5[{ä¸Y³f9üðÃsß}÷åôÓOߤu ©)‹Åbµ‹ 2Þ}÷ݼòÊ+™2eJ–,Y’­¶Ú*;ï¼söÙgŸ´nݺju-_¾<¯½öZÆŽ›éÓ§'Iºvíš>}ú¤oß¾ë T›|f2cÆŒŒ1"&LÈüùóÓ®]»ôîÝ;ûì³OºtéR±u )°Ñ'T@å^Õ [0}@Øè*ÀFŸP-ª]ÐtÌ�;7/¿ürFŽ™÷Þ{/sæÌÉüùóÓ®]»tìØ1½zõJÿþý³÷Þ{§C‡Õ.€UÈ‚l>}@#ôòË/gĈ™4iR/^œ®]»f‡vÈ'?ùÉtêÔ©Úål‘ôhµcÑ¢EyüñÇ×ÚŸvØaÙc�=ª]"@“4räÈ :4ÿ÷ÿ—Å‹oðüV­Z娣ŽÊ©§žšþýû7@…µCΠ¶èÏj‹,(@uÈ‚TN¡X,«]l©¦M›–7Þx#3fÌHëÖ­óÑ�~4»îºë:Ïê©§rÍ5×äí·ß^ë÷Íš5Ë AƒòÍo~3]»v­¯²š4=@m9rdÆŽ›™3g–ú³¬ómŸwÞyg~úÓŸföìÙëœsÿý÷Ïw¾ó�ì¼óÎõU6Àeþüùù¯ÿú¯üþ÷¿O±X̪q¤B¡°Æù«_(ò¥/})_|qÚ·oß 5TŠœ@mÑŸÔYP€Ú' Py6ú€*xíµ×rÍ5×äoû[VÿOñ¶Ûn›!C†ä”SN)ûAç†nÈÏ~ö³$YãšU …l·Ýv¹õÖ[³Ã;ÔKýM‘  ¶üßÿý_þó?ÿ3'N\ã»Ö­[çøã�Ï7¾ñ�´iÓ&ÉŠ~ìòË/Ï<°Ö0ÁêýZÇŽóË_þ2ÿøÇëñ.š¾Y³fåÌ3ÏÌk¯½–b±¸ÎþkmV=·P(dÏ=÷̯~õ«l½õÖõZ3@%ÈÔý@í‘hdAê‡�> �=øàƒ¹üò˳|ùòuþ@S(òéO:?úÑ�’$÷Þ{o¾ýío—¾[iåõk;Ö£G�üáXçÛ¬ø=@m¹ñÆó“Ÿüdƒ¿D3`À€ÜvÛmiÞ¼yn¼ñÆüøÇ?.}—¬(XýøÖ[o�‡z(ùÈGêã6š¼åË—çÄOÌ+¯¼’dE¿U,Ó¬Y³ 80ûî»ovÛm·têÔ)mÛ¶Í‚ òá‡fìØ±>|x†žåË——®K’½öÚ+¿ûÝïÖúöw€Z!gP[ôgµG q�¨?6ú€ôòË/礓NʲeË’¬ù0yõ·üÇüGŽ9æ˜vØa™7o^Ù¹½{÷N×®]³dÉ’Lš4)3fÌ(ͱòúN8!ßûÞ÷ô=@myê©§ò•¯|%Éú‘feuñÅçŸÿùŸsä‘GfñâÅ¥ïÚ·oŸ~ýú•õgcÆŒÉÒ¥KËú³U‰€�së­·æšk®)ëÑŽ=öØ\xá…éѣǯŸ8qb®½öÚ<üðÃe=Ú%—\’3Î8£¾ËØ$rµEP{dAYP€úc£Oh@Çw\ÆŒSöÃMÇŽóÑ�~4…B!ï¾ûnfÏž]úÁeç�wΗ¾ô¥\}õÕ) iÖ¬YÎ<óÌœrÊ)Ùf›mÊæ=zt®»îº<õÔS¥ë[·n�§Ÿ~:[o½u5n QУÔŽb±˜ú§Ê„ Êú³]vÙ%;ï¼s …BÆ�—7Þx£Ô_õèÑ#_úÒ—ò“Ÿü$…B!mÚ´Ée—]–ÏþóiÑ¢EÙü3fÌÈõ×_Ÿßþö·¥ë[´h‘'Ÿ|2Ûn»m5n Ñ*‹9ôÐC3uêÔR(ó²Ë.Ë©§žºÑs :4W]uU©GÛvÛmóôÓO×CÕ›OΠ¶èÏj‹,(@ã! P¿lô äå—_Î 'œPú�¤]»vùÞ÷¾—Ï~ö³iÞ¼y’dùòåùãÿ˜ïÿû™;wn’dÇwÌ[o½•B¡�ÿþïÿÎg>ó™õ®sùå—ç¾ûîK²â�VßûÞ÷r 'ÔïÍ4Rz4€ÚòÜsÏeðàÁ¥þl›m¶ÉO~ò“ 0 ì¼—_~9\pA¦L™’$éÖ­[&OžœæÍ›çöÛo_ãüÕýøÇ?Î�7Þ˜dEö­o}+§Ÿ~z½Ü@Sõ·¿ý-'�tRé—r>ÿùÏç?øÁ&Ï·ú3´_ÿú×ùÄ'>Q‘Z*EΠ¶èÏj�,(@ã! P¿šU»ØR<úè£IRzƒÁu×]—ù—)’¤Y³f9öØcóÓŸþ4+÷â~ûí·S(r衇n08�$ÿþïÿž­·ÞºôCÔˆ#êánš=@myòÉ'“¬èÏš7ožŸÿüçk jî½÷ÞùùÏžfÍVüS×äÉ“S(òéOzƒÁÎ$ùÚ×¾–�|ä#¥þì•W^©à]lÞyç�$)=3;ûì³7k¾¯~õ«IRêÑÞ~ûíÍš >ÈÔý@í‘h �Œ=:ÉŠF>þñ�ç�CYç¹p@˜b±XúahРAuZ§mÛ¶ù§ú§Òucƌټš0=@mYµ?ÛÿýÓ¯_¿už»Ç{ä ƒ*õXIrì±ÇÖi�-Zäè£�.];vìØÍ¨`Ë4mÚ´Òç=z¤wïÞ›5_ïÞ½Ó³gÏR�6cƌ͚ >ÈÔý@í‘h �¼ûϟüä'7xþÁ\6þØÇ>Vçµú÷ïŸdÅüаnz4€Ú2a„Òç}%GqD …ÂF_W(R,³páÂ<öØcyì±ÇÖ{~±X,]7qâÄ|å+_)�G�½ñ… Plô U0vìØ´h±þÿ ÿýï/ÿõ¯-ýp³!«_ À†éÑj˳Ï>›)S¦¬÷œ7ß|³lüÀÔyþÕ¯`Mu}ö•¤]5º¾ë …ÂÒ�Y Úä j‹þ  öÈ‚TŸ,(@õŠþWDŸ>}Jo-¨ëVýÏô¦¼%aåZcÆŒÙèk¶z4€Ú¢?¨ «öeÕ ?j•çØµEP{ôhµA úÖÿz2 â6懠º¾á`C×°~z4€Ú¢?¨®ãŽ;®Ú%Ô4ϱj‹þ  öèѪK úlô U°)�=h¨_z4€Ú±1!ÍÍy³hµÞJ P뮾úêj—Póä j‹þ  ¶È‚T—,(@õÙèH�=ª]«Ñ£Ô–�V»X'9€Ú¢?¨=² °B¡èõ°ÙšU»h lô `£O¨€Õ.hú&Mš”©S§¦eË–éÚµk¶ÝvÛj—@É‚Ô��>€:ùÛßþ–·Þz+3gÎLÇŽÓ·oßôïß�çÏ�;77ß|sî¿ÿþ|ðÁeßuéÒ%‡~xN;í´ìºë®õ]:ÀO aŠÅb±ÚE@¥M›6-S¦LɲeËÒ¥K—tëÖ--[¶¬vY�Òý÷ߟÿøÇ™:uêßí¼óÎù÷ÿ÷ì·ß~eÇG�•sÏ=7S¦Lɺ"J…B!Í›7Ïé§Ÿž‹.º¨^j'YP€Ê‘hX6ú€&hñâÅ™6mZiÜ£G�*VÐô‹Å<ÿüó1bD¦M›–-Zd›m¶Éî»ïž<0­Zµªv‰�Ò’%K2|øð¼ûî»™3gN:wîœ~ýú¥OŸ>ë¼fñâŹãŽ;r×]weüøñeßµjÕ*ŸøÄ'rÜqÇåsŸû\}—Ðd|ç;ßɽ÷޻΀f’4oÞȾð…L�:5ɺßšü£WÛf›mò›ßü&Ûo¿}ï éxë­·òÏÿüÏY¶lY’<3ëÛ·o¶ß~û,Z´(¯¾új>øàƒ …‹ÅvØaùÊW¾’O<±t¬{÷îùÚ×¾–£Ž:*;vL’Ì›7/þóŸsýõ×ç�wÞ)�Û±cÇ<öØcéܹs5o êdAêN ¶È‚ÔYP€êiVíªiòäÉ9å”S2|øð‹ÅÒ?ô¯(‹¹ÿþûó�o|£tìøC~þóŸ—h¯ì\uŽ•¥Ç�Ÿ“O>93gÎlÀ»h|¾ýíogذakôY+­<¶dÉ’\tÑE™0aB’äßÿýß3uêÔ²,I¶Új«tíÚ5Í›7/õj+çœ6mZ.¼ðÂRX€rC‡ÍÒ¥KKã=÷Ü3=ôPî¹çžüèG?ÊÏ~ö³<ýôÓù�ÿø�´hÑ"…B!O?ýtî¸ã޲kî»ï¾|þóŸ/;“¤}ûö9öØcóàƒæ€(õosçÎ̓>Øp7 @£& P{dAj‡,(@õŠë{ýÐ(y‹;@Ý�vÚiyá…Öúö•V† …B®¼òÊ|ö³ŸÍᇞ3f”¾kß¾}8à€ôîÝ;I2qâÄ 6,³gÏ.»þ³Ÿýlþë¿þ«Aï ±xöÙg3dÈ�²Þ¬E‹éׯ_zôè‘… –½%4I>ó™Ïä´ÓNË—¾ô¥RßµãŽ;æœsÎÉa‡V ,^¼8/¾øb~ùË_æÅ_,ëÑ®¾úê 4¨Z· P“–/_žýöÛ/sçÎ-½‰ýøCY@sU÷ß.»ì²²^®mÛ¶ùÃþPzf¶.³fÍÊ1Ç“?ü0Åb1}úôÉ9×_}’äõ×_ϼyóÒ¾}ûŠÝM�(@푨² ÕÕ¬ÚTËï~÷»$ÿx{û×¾öµüîw¿ËI'�”C9$ŸúÔ§òÍo~3?üpvÛm·$É{ï½—Ÿÿüç¥9Î8ãŒ|ÿûß_#Ü™¬|ýë_Ïe—]Vz �$÷ÜsO}ß@£3oÞ¼üå/)õLýû÷Ï�7Þ¸F°3I ”k¯½6Åb1K—.̓>˜$éÖ­[~üã¯ì\ÝE]”ƒ:¨Ô¾úê«™3gN…ï q;vl’”žksÌ1¼æÈ#�,õXIò©O}ªÎë}úÓŸ.}.‹=zôFT À–H ¶È‚ÔYP€êjQí`KñÀ4ØZo¾ùfƒ­ÐXÍ›7/Ï?ÿ|)±ÁköÛo¿õŽ×ç�CI’Ò/üŒ3¦Î×l fÏž�dE¿Ô«W¯:]³ýöÛ—�ëzÝÊuzöìY ”[õ››5«[ĨeË–eãV­ZmÔšíÛ·/}^ù6w€Z$ P}r µG ¶È‚T—�> � …}›;k·ê[¨z÷î]§Ô«‡vØa‡:¯×©S§tëÖ­ô‹83f̨{±[€¥K—–>×5°zx uëÖµæªë¬º>åAˆúE˜%K–”>¯.¨5² Õ' P{dAj‹,(@uù_Ah +�Åb1­[·Nÿþýëm­Ù³ggìØ±õ6?@S°páÂÒçUT¯O»víÊÆ;vܨ5;wîœ)S¦$ùGÀ€VöVÅb1Ó¦M«Ó5«ÿÒÌôéÓÓ­[·:¯9}úôÒç:Ôù:€-ÁʾªX,fÒ¤I ²æìÙ³KŸõg@-’¨r µG ¶È‚T—�> �|ô£ͻロ$Y¶lYn¹å–:¿�jc 6,gœqF½Ì ÐT´mÛ¶ôyÑ¢Euºfå/ì¬k¼!mÚ´Ùè5¶Ûn»méóĉóÁ”[›#F”�_~ùå}ôÑuZoÚ´iyÿý÷K=]çÎ�7²b€¦­gÏž¥Ï‹-Ê„ Ò»wïõ^Ó½{÷œzê©›´ÞÒ¥KK¿½r.€Z# P;ä@j�,(@m‘¨®fÕ.¶ýû÷O±XL²"Ü9zôè*W°eÛzë­“¬x Õ‡~¸Q×nl°s¥yóæ•>¯ö ùØÇ>–ä½ÖСC×{þôéÓóÿýÿ_Yov×]wÕy½•ç®|f·çž{nT½MÝN;í”-Z”ú­—_~yƒ×ì°Ã¹üòËK6Æ›o¾™%K–”ÆýèG7êz€† P;ä@j�,(@m‘¨.}@éß¿ÙøÕW_­R%$åo�š2eÊF½Y}e`c­$íÔ©Ó&ÍÐTm·ÝvÙi§�’¬è·n»í¶<òÈ#k=wîܹ9ÿüóK¿@³Ë.»¤X,æ¹çžË½÷Þ»ÁµÆŽ››nº©TèÒ¥‹ðÀjZ¶l™wܱô,løðáõºÞóÏ?_úÜ¡C‡ì°ÃõºÀ¦�¨r µG ¶È‚TW‹j[Š•áΕŒ…;ªkÕ¼/‹yýõ×Ó¯_¿õ^³×^{å�ؤõfÍš•©S§–ƽzõÚ¤yš²ã�?>W_}u …B–.]šo|ãyà�rÔQG¥{÷îY¸pa^}õÕÜ}÷Ý™>}z’¡ƒÿø�ÿÈ—¿üå$Éw¿ûÝL™2%C† IëÖ­×Xã�üc¾ÿýïgáÂ…)‹) 4hPCÞ&@£±Ï>ûä�7ÞH’<õÔSõºÖÃ?œdÅ¿§®¾q@­�¨r µI ¶È‚T��> �ì±ÇiÙ²e–.]šb±˜‘#GV»$€-Z÷îÝÓ±cÇÌ�;7Iò·¿ýmƒÏvíÚ¥OŸ>›´ÞèÑ£ËÆ;ï¼ó&ÍД�xâ‰ùÝï~—wÞy'…B!Åb1O=õÔA‚•o- 9þøãóñ�<‡~xž|òÉ,[¶,×_}n¿ýöì¿ÿþéÕ«WZ´h‘>ø /¼ðB&MšT u&I›6mròÉ'7ø½4x`þüç?—Ư¿þzvÛm·Š¯óꫯfäÈ‘¥íÀ¬ø• P;ä@j“,(@m‘¨}@iÙ²eúôé“×^{-I2~üøÌ�;7:t¨re[®=÷Ü3/¼ðB …Bžþùœ~úéõ¶ÖOúè}ôÑõ¾Î#�z@€¦b�=öÈСCsÉ%—dìØ±¥ã«=‹Åb:è \{íµiÓ¦M’¤W¯^¹á†òÕ¯~5 .,]·j sÕ9 …B¾ùÍoæK_úRCÝëpñÅçâ‹/®vu" P;ä@j“,(À–G`M…â꯽ØB¼ùæ›y衇Jã/~ñ‹éÕ«WÅ׹뮻òÝï~7ÉŠPÁµ×^›c�=¶âë4%Ë—/Ïã�?ž'žx"o¿ývfÍš•:d�=öÈg>ó™xà�k½î­·ÞÊ÷¾÷½ >|�sï½÷Þ¹ð 3pàÀú*¨gr µM€-™�>êÙ#�<’)S¦”Æ_øÂÒ¡C‡*VÐô�;6Æ Ë{ï½—Å‹§sçÎéÙ³g8à€ôîÝ»Úå�„(@uÈ‚ИÙè* Yµ €¦ÀFŸP-ª]°e[¼xq¦M›V÷èÑ£ŠÕ°1dAÊÙè‘ &äÁ,�Ï;ï¼*V@’L�:5Ï>ûli yï½÷rà 7¤P($ñ` ¼ù曹ôÒKK=š€'@uy†Ðx‹Åj—Pï<Ǩ-r µÇ34€ÆKàšU»`ãù¡ öèÑj‹þ €Zæ96@mÑŸÔ=�™�> lô `£O¨€Õ.¨=<ð@ƒ­õæ›o6ØZ[YP€ê±Ñ'°†K/½4…B¡ÁÖ+ )‹ ¶@S& P=6úÖ©¡— $ØRÈ‚4¼fÕ.¨]…BAð ‘’hx-ª]P{V:‹ÅbZ·n�þýû×ÛZ³gÏÎØ±cëm~€-�,(@õØè‘^½zå¼óΫv¬bÛm·ÍqÇWí2øÿó  r>úÑ�æÝwßM’,[¶,·ÜrKZµjU/k 6,gœqF½Ì PK<Ǩ-r µÇ34€Ê‘¨žB±X,V» ¶\rÉ%ùÃþ�dÅÝûÛßfï½÷®—µV w …Œ3¦^ÖØRÈ‚TO³jÔžþýû—�_}õÕ*UÀÆ’¨}kXî, I„;YP€ê±Ñ'°†=öØ#-[¶L’‹ÅŒ9²ÊPW² Õc£O` -[¶LŸ>}JãñãÇgîܹU¬€º’¨žÕ.¶tóæÍËäÉ“3wîÜtêÔ)Ý»wO«V­6kΩS§æÙgŸ-� ´™Uly-Z”9sæ¤S§NiÑbó¡Ì™3'ÿûßKã�nöœlºqãÆåæ›oN’ …\uÕUU® 6 0 ï¼óNiü÷¿ÿ= ¨ø:»ì²K®¾úêŠÏ ÐdAj�(@Ó' P7² ÕQ(‹Åj[¢ûï¿?wß}w^yå•,_¾¼t¼U«VÙÿýóùÏ>G}ô&Í=lذœqÆ) I’1cÆT¤f€¦îÅ_ÌÝwß�gžy&~øaéx�=r衇æ¸ãŽK¿~ý6iîaÆeðàÁIV„F�]‰’ØDž¡°¹dAj‹(À–Å34jÙæ¿† Ø(Ó¦MË9眓W_}5I²úžÛ‹-ÊÓO?�§Ÿ~:}ûöÍ•W^™>}úlÒZÅb±ôp€u[°`A.½ôÒ<öØcIÖìÑÞÿýüö·¿ÍoûÛuÔQùö·¿�nݺmô:Þ·P{—Gy¤Ú¥ L ¶È�µÈFŸÐ€.»ì²¼ûî»IRhݺuºvíšfÍš­*Xºti®½öÚ\xá…Yºti•ï é¹òÊ+óÊ+¯$IÙ/Ú¬þgå÷Åb1³gÏÎ7¾ñ�üèG?ªZÝ@Ó¨-r @-jQí`Kñä“Oæ/ùKYhਣŽÊ¿ýÛ¿¥_¿~I’¥K—楗^Ê=÷Ü“‡z(Ë—//…~øáÌž=;×_}Ú´iSÍ[h2†žx ¬GûØÇ>–3Ï<3 ÈV[m•)S¦äoû[î½÷Þ >¼ìÜ›nº)Ó§OÏ•W^Y:4M² µE¨Uͪ]l)†š$¥·€^pÁ¹þúëKÁÎ$iÑ¢E˜k®¹&÷Þ{oúôéSz£{±XÌ3Ï<“ÁƒgîܹU¹€¦æöÛoOò�íøã�Ï]wÝ•cŽ9&Ûl³MZµj•Þ½{gРA¹ãŽ;rã�7¦[·ne=Ú}÷Ý— .¸ K—.­æ­õL ¶È�µªP\ù/@½™7o^öÝwß,_¾XŸwÞyU¬`ÓÉ‚Ô9P€Ú$ ÐôÈ‚lšÕ.¶#GŽ, …BÎ9çœ:]תU«ü¿ÿ÷ÿ²ë®»æê«¯N²â-££G�ÎÉ'Ÿœ[o½5ݺu«·ºš²‘#G–Þ¾^(rþùço0Ü™$[o½u~ùË_æšk®Ém·ÝV y>ûì³2dHn¼ñÆtèС¾Ëh’ÞÿýRÕr-€-Õ{ï½—n¸¡ôìM¸h¬dAj‹(@m’hzdA6M³j[‚÷Þ{¯ô¹sçÎéÛ·ïF]Ê)§äºë®KË–-S(R(òÖ[oåË_þr&L˜Pér¶ï¾ûnésÇŽ3`À€:_[(r饗æòË//�‹ÅbFŒ‘ÓN;-3gάx½[’•ÏÀêû Ç/Õ��,(@m‘¨m² M�,(ÀƱÑ'4€Ù³g'YñPz»í¶Û¤9Ž:ê¨ÜtÓMi×®]i®÷ß?'�tRÆ�W±Z¶«öh=zôؤÜ?õÔSóÃþ0Í›7/…}úäŽ;îȶÛn›dE0aÖ¬YùéOªGØ€~ýú•�½Å€Z! P[ä@j“,(¬`£Oh p@ŠÅbŠÅbyä‘Ì�;·"óvíÚ5¿þõ¯Ó¿ÿRÀ³X,Vdn€¦nÿý÷/õh=ôP/^\‘ywÚi§üæ7¿I¯^½’D�PGݺu+ý¢L±X̨Q£ª\üƒ,(@m‘¨=² °‚�> �rÈ!IVüãþÂ… sï½÷Vlî­¶Ú*·Ýv[öÝwßRÀ€ [µG›={vz衊ÍݳgÏÜyç�Ùyç�õha¯½ö*ýr̼yó2nܸzY§uëÖéÑ£Gzôè‘îÝ»×Ë4-² µE 6É‚@R(z�4ˆ äÀÌ‚ ’¬xûúã�?ž¶mÛVl�Å‹çüóÏÏŸÿüçÒÛB …BÆŒS±5š’Ù³gç ƒÊÒ¥KS,Ó«W¯<òÈ#iÑ¢EÅÖ˜5kV† ’×^{M�P#FŒÈ«¯¾ZqÄéÝ»w+`sL˜0!>ø`i|ÞyçU±€Í# P[ä@j“,(@Ó" °ilô èÆǫQ£JãO<1p@E×X¶lY¾ó�ïä…^({òÉ'+º@SrÅWdäÈ‘¥ñù矟C=´¢kÌ›7/gŸ}v†ž$žÐHÉ‚Ô9P Ùè* Yµ €¦ÀFŸP6ú€ hQí€ÆcÞ¼y™}úlÒZÅb±ð`óÉ‚4<}@sÙe—•� …B®ºêª*U@’Üpà k;ï¼óªP ‰þ `cL›6-'�tRÆ�_ ^®+|Y,óÚk¯å‹_üb¾ñ�odÈ�! \-@Ó P[ä j�  îdAª£P\}[e QëÓ§O釩•?\�3¦ÊUlÙVíÑVÒ£T�þ  îÎ:ë¬üå/)û7È$iÓ¦M:tè�™3gfÙ²eI²Æ¿S~æ3ŸÉ5×\“-6ü.âaÆåŒ3Î(Í£?¶d² µEΠöèÑêN :6ü¿œTÄÊßëzË K°~O>ùäÁΣŽ:*ÿöoÿ–~ýú%I–.]š—^z)÷ÜsOzè¡,_¾<…B!Åb1?üpfÏž�믿>mÚ´©æ­Àf“3¨=z4€õ“¨žfÕ.¨¼b±Xz0 °)†šä¿sÁäúë¯/;“¤E‹8p`®¹æšÜ{ï½éÓ§Oé-îÅb1Ï<óLœ¹sçVå+YP`sÉ‚TO‹jTÖqÇWíXÍÀ�«]«ÐŸlؼyó2|øðÒÜ�8∜}öÙ뽦OŸ>ùýïŸ+¯¼2wÝuW)àùÒK/åÔSOÍÍ7ßœ.]º4Dù�š,(@m‘3¨=z4€ “¨®BÑ+^€U 6,gœqF’¤P(äž{îIß¾}ë|ýwÜ‘«¯¾:Åb±ôø�vÚ)·Þzkºuë¶ÁõÆŒS�»Ø2É‚TW³jÔ–÷Þ{¯ô¹sçÎìL’SN9%×]w]Z¶l™B¡�B¡�·Þz+_þò—3a„J— À*dAªËFŸ@™Ù³g'YñFõí¶Ûn“æ8ꨣrÓM7¥]»v¥¹ÞÿýœtÒI7n\Åj œ,(@uÙè(³lÙ²ŠÌ³ß~ûå¶ÛnËÖ[o�dEÀóƒ>ÈI'�”Ñ£GWd ÊÉ‚T—�>€2[mµU’¤X,fÚ´i›5W¿~ýrÇwd›m¶I²"àùá‡æ´ÓNˈ#6»VÊÉ‚T—�>€2={ö,}ž6mZfÍšµYóíºë®¹óÎ;Ó½{÷$+žsæÌÉ�!CòÜsÏmÖÜ”“¨.}evÛm·$+B˜Åb1Çßì9·ß~ûÜyç�Ù~ûíS,S(²`Á‚œ}öÙyâ‰'6{~V�¨®B±X,V»`ãŒ?>#FŒÈ´iÓÒ¢E‹l³Í6Ù}÷ݳ뮻V»4€-ÖÂ… óÚk¯eêÔ©iÙ²eºvíš]vÙ%;v¬vi[$ýÀæ;ì°Ã2eÊ”$É AƒrõÕWWdÞéÓ§çŒ3ÎÈ믿^ � …$)}3fLEÖ¨U² µEΠöèÑ6Ÿ,(@õØèªdܸqyì±Ç2nܸ̜93[mµUúöí›Ï}îséÖ­ÛZ¯9rdþó?ÿ3/½ôÒZ¿ïÕ«W† ’N8¡>Kh²æÎ�›'Ÿ|r�íˆ#ŽHëÖ­×zÍû￟Ÿüä'yä‘G²téÒ²ïš7ož�fðàÁ9ä�Câšý@u]vÙe¹ÿþû“$mÛ¶Í_þò—tèС"sÏž=;gžyfFŽYðîYP€Ú"gP{ôhÕ% P=6ú€6wîÜüà?È<°Öï›7ož¯~õ«9÷ÜsËŽß}÷ݹâŠ+²lÙ²¬ï?ß…B!{íµW~ùË_f«­¶ªdéMÖÒ¥Kó‹_ü"7ÝtS/^¼Æ÷[o½u.½ôÒ 4¨ìøSO=•o~ó›™?þ{´cŽ9&×\sMZµjUéòšý@mxøá‡óÍo~³ô†õK/½4§�vZÅæŸ?~Î>ûì¼øâ‹Þâ4*² µEΠöèÑjƒ,(@õØèМ9srúé§gôèÑ¥‡Ë+HIRvìÄOÌw¿ûÝ$É3Ï<“³Î:«ôƒÌêç¯:ÏÊc{î¹gî¼óδmÛ¶~o  ‘[¼xq¾öµ¯åé§Ÿ^£¿Z}ü�o|#ÿöoÿ–$yíµ×râ‰'fÉ’%¥ï“¬³Ï+ 9è ƒrã�7¦yóæõ~_�•þ  v,X° x`,X�$éÚµküñŠþäâÅ‹sþùççÏþ³·¸�‚,(@m‘3¨=z4€Ú! P=6ú€ôõ¯=�>úh’5.¯´ê,7ÜpC;ì°uÔQ™8qbÙw}úôIïÞ½“$'NÌèÑ£³|ùò²sN9å”\~ùå {“�ÌW\‘ßþö·I6Ü£5kÖ,C‡Í€òÏÿüÏyýõ×ËB�:uJÏž=“$“&MÊŒ3Ê®/ ùú׿ž³Ï>»¡n ÑÑŸÔ–o¼1£F�*�O<ñÄpÀ]cÙ²eùÎw¾“^x¡tìÉ'Ÿ¬è•" P[ä j�  ¶È‚T‡�> �<÷Üsøà²íå—_.õX ÈÙgŸ�3Ï<³tlÏ=÷Ì·¾õ­ì»ï¾eo}ùå—óßÿýß>|xéÜÖ­[çÑGÍvÛmW�[¨iú3j™,(@m‘3¨=z4XÁFŸÐ@Î=÷Ü<ñÄIV¼%ê _øB¾ûÝï¦U«Veç�7.gžyf&Ožœ$ÙsÏ=3jÔ¨ …|ö³ŸÍøÃ²Ò«ûá˜_ýêW¥sœ‹/¾¸žî  q»ä’KJ¿“$|p®¹æštéÒ¥ì¼aÆåë_ÿzæÌ™“$9à€òÜsÏ¥P(äÀÌÿüÏÿ¤uëÖk]£X,æâ‹/ÎC=”dE/xÞyçåÜsÏ­Ç;hœôgÔ2YP€Ú"gP{ôh°‚�> ,Z´(ŸøÄ'²lÙ²$É^{í•ßýîwë<ÿ•W^É 'œP‹Å|ä#É£�>švíÚ­w­eË–eРAyóÍ7S,³ÝvÛåÏþsEî )Y²dI˜E‹¥X,f—]vÉý÷ߟ–-[®õü§žz*_ùÊWJAƒb±˜­·Þ:üã׬náÂ…ùÌg>“I“&¥X,æ£ýh}ôÑŠß@c¦? –É‚Ô9€Ú£G€hVí`K0f̘,]º4+÷×>ûì³×{þ^{í•}÷Ý7Åb1Åb1…B!ÿú¯ÿºÁ`g’4oÞ<'Ÿ|ri­)S¦dêÔ©›MÌ믿ž… –ú­sÎ9g�Á�$9ôÐCÓ¿ÿ²í¸ãŽÛ`p IÚ´i“SO=µÔ£�?>³fͪؽ4ú3j™,(@m‘3¨=z4ø}@xë­·JŸ[´h‘ƒ:hƒ×¬~Î�XçõŽ<òÈ$)½ÁjôèÑu¾`KñÆo”>7kÖ,Gqįùä'?¹ÞñúuÔQec=@9ýµL ¶ÈÔ=üƒ�> Ìž=;ÉŠ°eïÞ½×ûö©•vØa‡²ñÎ;ï\çõ¶Ùf›tíÚµô*oqXÓª=Z¯^½Ò¦M› ^³zO¶ûî»×y½ž={fë­·.�'MšTçk¶ú3j™,(@m‘3¨=z4ø‡Õ.¶ ,(}îØ±c�®iß¾}ÙxÕÍuѵk×LŸ>=I2wîÜ�º`K0oÞ¼ÒçºöZ«÷rÛ£m»í¶™5kV’dΜ9u-@S§?h:/^œ×_=3gÎÌœ9s²xñâ�žcРA•/ `3È‚Ô9€Ú£Gh:dA6Ÿ�> ¬úÆ©%K–ÔéšfÍš­w¼!íÚµ+}^5\ À ­Zµ*}^¶lY�®iÞ¼yÙ¸E‹�{´²ê/ðèÑÊéÏ· äÁÌ}÷Ý—Ñ£G×¹§[áN ÖÈ‚Ô9€Ú£GhÜdA*ËFŸÐV}›ÔìÙ³7êÚB¡°IkΟ?¿ôyÕp)+¬Ú£Í�;·AÖ\¸paéóªáôg�Ù‹/¾˜‹/¾8|ðA’¤X,nÒ<…B!Åbq“ÿ� >É‚Ô9€Ú£Gh¼dA*ÏFŸÐºwïždÅ1“'OÎ’%KÒ²eË:]»©?¼¬"Ýj«­6úz€ÿ{wfgYß üûL†ÉJ€‰da1¡ ›€ˆQÔ·¢âÛZÑ*EShð)ík—w¡¯ë%¨ Pë‚VTÀÑÄ–µ˜–B $�…ìëäyÿHó˜�…,sæ<3óù\W.î3ç™ûüÎ?á;'ß¹€žnذaI6ä­§Ÿ~:ëׯOKKKC_sÓŒ¶iyù  »ºãŽ;rþùçgýúõ[üÛæ¦ë>_øo eYîr) +è‚Ô‹ž@ýÈhÝ“.(@c8èºÀP­;::òøã�gìØ±Ûýž±cÇæ‹_üâ.½ÞòåË3oÞ¼êñÈ‘#wi€žlÓŒ´nݺüö·¿ÍË^ö²í~ÏÁœ}èC»ôz«W¯Þ,£ >|—öè©ä3€îçÙgŸÍ%—\’ŽŽŽª¬9jÔ¨¼ñ�oÌÈ‘#3yòäêëçž{n8à€,^¼8�=öX¦OŸž¹sçVÏ�3&gŸ}vúôéÓ´÷°=º õ¢gP?2@÷£ Ð8ú€.0jÔ¨ôïß?«V­J’Üwß}/Zî2dH^÷º×íÒëÍœ9s³;|ðÁ»´@OvÐA¥­­-k×®M’Üÿý/ZxéK_š¿ü˿ܥ×{ôÑGÓÑѱÙëðò@÷sýõ×géÒ¥UAóío{&Ožœ=öØ#I2yòäêÚ &düøñÕã²,3uêÔ\~ùåyê©§ÒÞÞž[n¹%W]uU Ôµo`è‚Ô‹ž@ýÈhÝ�.(@ã´4{è-Æ�W.§M›ÖÐ׺ãŽ;ªõ~ûí—ýöÛ¯¡¯ÐõéÓ'‡rH•ѦOŸÞÐ׻뮻ªõÞ{ï�#F4ôõºù  {)Ë2ßÿþ÷«bç‘G™�~ô£U±óÅE‘×½îu¹ùæ›sÒI'¥,ËLŸ>=^xa#ÇØ-º õ¡gP?2@÷¢ ÐXú€.rì±Ç&ÙðCÎ�wÞYÝ�ª~ò“Ÿ¤(ŠE‘cŽ9¦a¯Ðݽâ¯H²!£Ý~ûíY¿~}Ã^ëÖ[o­2ÚÑGݰ×èÎä3€îcÖ¬YY¼xqõË9'NÜ¥} �«®º*x`ʲ̽÷Þ›n¸¡3Gè4º õ¢gP?2@÷¡ ÐX­Íz‹ÓN;-óæÍ«Ï™3'tP§¿Î­·Þšßÿþ÷I6ÜùàU¯zU§¿@Oñš×¼&?üpõø‰'žÈèÑ£;ýuî¹çž<öØcI6d´ &túkôò@÷1kÖ¬jݧOŸÍTÛûÅ�~ýúåâ‹/ÎE]”²,síµ×æ�ï|g§Í ÐYtAêEÏ ~d4€îC ±ô ]䨣ŽÊQGÕð×yþùçsÖYgU�_óš×4ü5º«“N:)'�tRÃ_硇Êk_ûÚêñ©§žÚð×èŽä3€îãùçŸO²á—eFŽ™¶¶¶-®)Š¢Z¯Zµj»û�zê©éß¿V®\™9sæäÑGÍØ±c;uf€Ý¥ P/zõ#£tº �å OèaÜÍ ~þê¯þªÙ#° ù `÷-_¾¼Zïµ×^[½¦ÿþY±bEŠ¢È²e˶»_[[[FŒ‘Ù³g'IfΜ©Ü ôZº õ¢gP?2ÀîÓh¬–ft/ýû÷¯Ök×®Ýê5¬ÖsçÎ}Ñ= P­çÏŸ¿Ó°=º �å O`§ 2¤ZozG÷M >¼Z?òÈ#/ºçsÏ=W­×¯_¿Ó°=º �å O`§Œ=:IR–ežyæ™­–1ÇŽ[]3mÚ´¬[·n›ûµ··ç™gžIQI’½÷Þ»ó‡ ‰.(@£9躑¥K—fúôéÕšoÍš5yúé§«?4—|Ð5ÆŒ“¶¶¶$ÉÚµkóÄOlq͉'žX­.\˜n¸a«{•e™+®¸¢Z'(†ô4º õ¢gP?2@×Ðh¬Öfì¸ÿþïÿÎ9眓$)Š"3fÌhòDÜwß}2@�Èg]£­­-G}t¦M›–$¹û;»otê©§fàÀ�Y±bEUà\µjUÎ<óÌì¹çžI6ܽý_þå_rûí·§(Š”e™¡C‡æˆ#Žèò÷ÐtAêEÏ ~d4€®¡ ÐX-ÍØ9eYV¨  ^ä3€®qÊ)§Të©S§nñ|¿~ý2qâÄ”e™¢(²víÚ|æ3ŸÉ‰'ž˜ &ä„NÈé§ŸžÛo¿=IªëÎ;ï¼´´¨5=—ϱêE>¨  kè‚4Ž¿€�ö¦7½©ºóú´iÓÒÞÞ¾Å5çœsNN8ᄪ¸Y–e:::2þü,^¼¸ú…œ¢(’l(ŒžuÖY]ú>z#]P€Æimö@÷3lذÜtÓMY»vm’dŸ}öÙâšÖÖÖ\}õÕ¹ì²ËrÓM7U_ßXæ,Ë2eY¦¥¥%ï|ç;ó¡}¨KfèítAÇAŸÀ.;vì‹^Ó·oß|ò“ŸÌ_þå_æÖ[oÍ<� ¤,Ë :4ÇsLÞò–·äe/{YL ÀFº �á O áÆ�—qãÆ5{ v�.(ÀŽkiöÐ8è:�ƒ> 8è:Ak³vÜàÁƒsüñÇ7{ 6Ñ·oß >¼Ùcð?ä3€zX³fM–-[–Õ«W§,Ë�þ~™è©tAêEÏ ~d4€zÐØ=E¹+{ü�… æG?úQî¸ãŽÌœ93 .Ü彊¢ÈŒ3:q:¶G sµ6{ {*Ë2W_}u¾üå/gÕªUÕר?]P€ÆpÐ'°Ó:::rÉ%—ä¶Ûn« �EQ¤( O€šÓh};íºë®ËOúÓ$© �eYfß}÷Í!‡’½÷Þ;ýû÷oò”l�.(@ã¥#“€�°fÍšŒ?>+V¬¨îØ~â‰'梋.ÊÑGÝÜáØ.]P€ÆjmöÀö=õÔS™1cF-Z”%K–dÍš5;½Ç¤I“0@ïµf͚̚5+‹-ÊÒ¥Kw)£�qÆ�?@/%Ÿt½_þò—Y¾|yŠ¢HQ9í´Óò¹Ï}.---Í  vtAêEÏ ~d4€®§ ÐXú€š7o^¾ñ�oä?øA,X°Ûû)w쾕+Wææ›oÎ÷¿ÿý̘1#»µŸòÀî‘ÏšëÉ'ŸL’”e™–––üÃ?üƒb'À&tAêEÏ ~d4€æÒh,}@ÍÜ|óÍùÈG>’+V¤,Ëm^WE’lóš¢(R–eu»nÚ´i¹ôÒKóì³Ï&Ùv{12@ç�ÏšoÙ²eI6dªƒ:(Æ kòDõ¡ P/zõ#£4Ÿ.(@c9èjä?øAþþïÿ~«(oú¸,Ë->°~±çØ5wÜqGÎ?ÿü¬_¿~‹œö ¶©æ9  sÈgõ0xðàj=hР&NP/º õ¢gP?2@=è‚4–ƒ> &ž|òÉüó?ÿsõ�tY–9î¸ãòæ7¿9#FŒÈûÞ÷¾êè¿û»¿Ë!‡’Å‹ç±Ç˽÷Þ›x Ɇ©ÇŒ“K.¹$lâ;èþž}öÙ\rÉ%éè訲بQ£òÆ7¾1#GŽÌäÉ“«¯Ÿ{î¹9à€ªŒ6}úôÌ�;·z~̘19ûì³Ó§OŸ¦½€îN>¨�?ú£?ªÖóçÏoâ$õ¡ P/zõ#£Ô‡.(@c9èjâꫯΚ5kªÇøÀrÁlõÚqãÆeüøñ›}mæÌ™ùð‡?œx íííùô§?�k¯½6Æ kèÜ=Ùõ×_Ÿ¥K—V€·¿ýí™}röÙgW�¯»îºæ Pº õ¢gP?2@½è‚4–ƒ> ~øá¬\¹2eY&IÎ=÷Ü]Ú§¥¥%Ÿüä'søá‡§,Ë<úè£~ˆØE³fÍÊâÅ‹«Œ6qâÄ]ÚgÀ€¹êª«rà�¦,ËÜ{ï½¹á†:sT€^A>¨ŸsÎ9'GqDÊ²Ì 7Ü�ŸÿüçÍ  itAêEÏ ~d4€úÑh}@ <þøãÕº­­-¯|å+·{ýºuë¶ù\KKK.ºè¢$îlõõ¯½úÀ€7kÖ¬jݧOŸL˜0a»×¯_¿~›Ïõë×/_|q’ íÚk¯íœ!zù  ~Z[[sõÕWçÐCMGGG.¾øâ|þóŸÏ²eËš=@—Ó¨=€ú‘ÑêG qZ›=�,^¼8IREFŽ™––-Ïâ.Š¢Z¯^½z»û�tÒI4hP–-[– ä7¿ùMŽ<òÈΠ‡{þùç“ü!£µµµmqͦmÕªUÛÝïÔSOMÿþý³råÊÌ™3'�>úhÆŽÛ©3ôdò@=í³Ï>ùö·¿��üãùîw¿›/ùËùÚ×¾–“O>9‡vX† ’¾}ûîô¾gœqFç Ð@º õ¢gP?2@=é‚4†ƒ> V®\Y­÷ÜsÏ­^3`À€,_¾>|xug«Ç{L¹`'-_¾¼Zïµ×^[½¦ÿþY±bEŠ¢xÑ;SµµµeĈ™={v’dæÌ™Ê;A>¨¯¾}û浯}m¦OŸž'žx"+V¬È”)S2eÊ”]ÞS¹èntAêEÏ ~d4€úÒè|ú€8p`µ^³fÍV¯4hPõö3Ï<ó¢{nz'„ ìæ„½Oÿþý«õÚµk·zÍÀ�³bÅŠ$Éܹs_tÏTëùóçïæ„½‹|PO‹-ÊßüÍßäž{îI’E±ÙóeYîð^EQ¤,Ë-öètAêEÏ ~d4€zÒhŒ–f$C‡­ÖÛºCû¨Q£ªõÃ?ü¢{nZõÃÀÎ2dHµÞôŽ¡›>|xµ~ä‘G^tÏçž{®Z¯_¿~7¦è}ä3€úY²dIÞóž÷äž{îÙ¬ÄY–eõggììõu¢ P/zõ#£Ô�.(@ã´6{ 3fL’ ?¬<óÌ3Y»vmöØc�Í®7n\~õ«_¥,ËL›6-+W®ÜìÎU›z衇2þüªÔ¹Ï>û4ö ô@£G�Nò‡Œ¶~ýú´´l~Ï”±cÇæÁ¬2ÚºuëÒÚºõ�[ÚÛÛóÌ3ÏTmï½÷nèü=�|P?W\qEfÏž�¢(ª;°<8'Ÿ|r9ä�ì½÷ÞÛü7M€žF ^ô êGF¨]P€ÆqÐ'ÔÀÁœdÅŠéèèÈìÙ³s衇nvÍÉ'Ÿœo|ã)Š"Ë–-ËW¾ò•\tÑE[ìµfÍš|üãO²áƒî¢(òò—¿¼+Þ@�2f̘´µµeÍš5Y»vmžx≪P°Ñ‰'ž˜ÿ÷O’,\¸07ÜpCÞóž÷l±WY–¹âŠ+ªuQ;vlãß@"ŸÔËÂ… sÓM7U¥Î¢(rá…æ¼óÎK[[[³Çèrº õ¢gP?2@½è‚4VË‹_4ZkkkŽ;î¸êñ�wÞ¹Å5¯zÕ«²ï¾û&Ùð�óW¾ò•\vÙeyôÑG³fÍš,_¾5jÔ¨Œ7®kÞ@ÒÖÖ–£�>ºz|÷ÝwoqÍ©§žš�V`_qŹæšk²téÒêšöööœþù¹ýöÛ«Œ6tèÐqÄ =‰|P/¿üå/³nݺ$©Š�ý×­Ø ôZº õ¢gP?2@½è‚4–ƒ> &N9å”j=eÊ”-žommÍE]TÝ¡,Ë|ç;ßÉgœ‘£Ž:*Çw\&Nœ˜‡~x³;%Lš4© ß@ϲiF›:uêÏ÷ë×/'N¬²×Úµkó™Ï|&'žxb&L˜�N8!§Ÿ~zn¿ýö$¸Cèyç�—–Ëì,ù  >æÌ™“dC¦jkkË{ßûÞ&OÐ|º õ¢gP?2@}è‚4–ŸR &þ×ÿú_éÓ§OʲÌC=”‡zh‹kÞþö·çÍo~sõ¡s²á‡¥Mÿlüz’¼ãïÈ[Þò–.{=Í›Þô¦êg¦M›–ööö-®9çœsr 'löK8™?~/^œ²,“¤Êi§œrJÎ:ë¬.}=…|P}úôI²!WtÐAéß¿“'h>]P€zÑ3¨  >tA«(7þ 4Ý’%KÒÑÑ‘$0`@úöí»Å5eYæÊ+¯ÌW¿úÕ¬Zµj«û 80\pAÎ=÷܆ΠÐ<úè£Y»vm’døðá2dÈ׬^½:—]vYnºé¦-Ê·´´äÌ3Ï̇>ô¡ì±Ç]4=@Ï#ŸÔÃO~ò“|ðƒLQ9ì°Ãò½ï}¯Ù#Ô‚.(@½èÔ�ŒPº �å Oè¦,X�©S§æ�È‚ R–e†šcŽ9&§�vZöÞ{ïf�Ðë<òÈ#¹õÖ[·šÑÞò–·äe/{Y³GèUä3€Æyì±Çòæ7¿9I²ï¾ûæî»ïnòDÝ�.(@½èÔ�ŒÐ8º �å O`§½ímoËÌ™3SEn¼ñÆ~øáÍ €¤ Ð8-Íè~Î>ûìjý¹Ï}®is°ótAÇAŸÀN{ë[ßš·¼å-)Ë2wÝuW>ñ‰O4{$v�.(@ãeY–Íè~Ö¯_Ÿ�}ìcùÖ·¾•¢(rÌ1Çä /Ìøñã›=/B 1ô ì´}èCÕzÚ´i™3gNŠ¢H’ <8‡vX† ’¶¶¶�Ú·( w„h0]P€ÆqÐ'ÔÜÊ•+3wîÜ,[¶,«W¯Î®ü¯ûøã�oÀd½Ûš5kv+£ >¼Sô^ò@×7n\UæÜhÓ,öÂçvDY–)Š"3gÎÜíùêB ~ô êGFèzº �ÓÚì€-Íš5+ßûÞ÷rÇwäÉ'ŸÌúõëwy¯¢(2cÆŒNœ wZ¸pa~ô£åŽ;îÈÌ™3³páÂ]ÞKFØ}ò@=íJ¡ 'Ò¨=€ú‘ÑêI s8èjdÕªUùÄ'>‘o¼1eYîÒݦè\eYæê«¯Î—¿üå¬ZµªúÍ!ŸÔ‹,°9]P€zÑ3¨  ^d1€ÆpÐ'ÔĪU«ò¾÷½/÷Ýw_õÐÆ;ø� 9:::rÉ%—ä¶ÛnÛ,£E!£4�|P/S§Nmöµ¢ P/zõ#£Ô‹.(@ã8èjâ _øB~õ«_möatQ9üðÃóGôGÙ{ï½Ó¿ÿf� Ы\wÝuùéOš$UF+Ë2ûî»o9ä  ‹Égõ2bĈf�P+º õ¢gP?2@½è‚4NQº¥4ÝòåË3~üø¬]»¶ºÛÔÛÞö¶\tÑE6lX“§è�Ö¬Y“ñãÇgÅŠUF;ñÄsÑEåè£�nîp½�|@�é‚Ô‹ž@ýÈhô&­ÍHî½÷Þ¬Y³¦ºƒû;ßùÎLž<¹Ùcôj¿üå/³|ùò*£�vÚiùÜç>—–––f�Ð+ÉgÔ™.(@½èÔ�Œ@oâ§]¨�9sæ$IʲLŸ>}rÑE5w òä“O&Ù�ÑŠ¢È?üÃ?(4‘|@�é‚Ô‹ž@ýÈhô&~â€X¹re’¤(Š|ðÁ ÞtAêEÏ ~d4z“Öf$ãÆ�«ÖÏ>ûl'`£?ú£?ªÖóçÏoâ$$ò@w²f͚̚5+‹-ÊÒ¥K³fÍš�ÞãŒ3ÎèüÁH ^ô êGFè>tAvŸƒ> Ž8∠>¼ÙcôZò@½­\¹27ß|s¾ÿýïgÆŒéèèØ­ý”;€îF ^ô êGF¨7]P€ÎÕÒì€ &NœX­¿üå/7q’¤OŸ>9û쳫Ç×]w]ó†@>¨±iÓ¦å�o|c>üáç7¿ùMÖ­[—²,wúO’ê¿Ý‘.(@}èÔ�ŒP_º �ÏAŸPïxÇ;òêW¿:eYæG?úQ¾þõ¯7{$€^ïœsÎÉG‘²,sà 7äç?ÿy³GèÕä3€ú¹ãŽ;òÞ÷¾7Ï>ûìÅÌ¢(ª?/´ésŸWìº;]P€zÑ3¨  ~tA£(ý­µ±zõê\xá…¹ãŽ;REÞüæ7gÒ¤I9à€š=@¯µhÑ¢œsÎ9™9sfZ[[sÞyçåÜsÏÍ Aƒš=@¯$ŸÔdzÏ>›7½éMYºtiŠ¢HY–9à€òÆ7¾1#GŽÌäÉ“«âæ9眓8 ‹/Îc�=–éÓ§gîܹÕó£G�ÎÙgŸ�>}ú$IÞö¶·5í}ì]P€zÑ3¨  >tAÇAŸP3eYæšk®ÉUW]•Õ«W§(ŠŒ7.‡vX† ’¶¶¶�ÞsÒ¤I ˜ ÷X½zu>þñ�ç»ßýn’¤ÿþ9ùä“«ŒÖ·oß�ÞóŒ3Îèä)zù  .¿üò\ýõUAóÏþìÏ2yòäì±ÇI’qãÆUÏ]wÝu?~|õ½eYfêÔ©¹üòËóÔSO¥(Šüñ¹êª«üâÐíé‚Ô‹ž@ýÈhõ  Ð8ú€šéèèÈ·¿ýí\{íµyúé§«¯oü¡gWÌœ9³3FèÕn¿ýö|êSŸÊO<‘d÷òY"£ì.ù  ¹Ê²Ì‰'ž˜%K–$IŽ<òÈ|ç;ßÙìší•;7Z±bE&Mš”{î¹'EQäÄOÌõ×_ßø7Ð@º õ£gP?2@sé‚4Vk³þàw¿û]&Mš”Ù³g'Ùý¤Ë²Üí=z»E‹åoþæorÏ=÷$Ù2£íÌ=TŠ¢�Ñv“|P³fÍÊâÅ‹“lÈU'NÜ¥} �«®º*o}ë[ó»ßý.÷Þ{on¸á†¼ó�ïìÌqºŒ.(@½èÔ�ŒPº �ÕÒì€ æÍ›—w¿ûÝ™={öf@—e¹ËØ=K–,É{ÞóžÜsÏ=ÛÌh;CFØ=ò@}Ìš5«Z÷éÓ'&LØîõëם߿sýúõËÅ_œdCF»öÚk;gH€.¦ P/zõ#£Ô‡.(@cµ6{`ƒ�}ìcyî¹çREu÷¨Ñ£Gç5¯yM9ä�ì½÷Þéß¿³ÇèU®¸âŠÌž={³Œ6xðàœ|òÉ2@ÈgõñüóÏ'Ùp÷‘#G¦­­m‹kŠ¢¨Ö«V­Úî~§žzjú÷+WfΜ9yôÑG3vìØN� ÑtAêEÏ ~d4€úÐh,}@ <óÌ3™2eJõ�tß¾}óá8gœqF³Gèµ.\˜›nº©ÊhEQä /Ìyç�·Õªh,ù  ^–/_^­÷Úk¯­^Ó¿ÿ¬X±"EQdÙ²eÛݯ­­-#FŒÈìÙ³“$3gÎTîº]P€zÑ3¨  ^tAËAŸPÓ§OOY–I6ÜÉàCú�b'@“ýò—¿Ìºuëª;„^xá…¹à‚ š=@¯%ŸÔKÿþý«õÚµk·zÍÀ�³bÅŠ$Éܹs_tÏTëùóçïæ„]K ^ô êGF¨]P€ÆjiöÀæ?Èôïß?ú§ÚÄiH’9sæ$IʲL[[[ÞûÞ÷6y"€ÞM>¨—!C†TëMï辩áÇWëGyäE÷|î¹çªõúõëwc:€®§ P/zõ#£Ô‹.(@c9èj _¿~I6ÜÁýÀÌ{ìÑä‰èÓ§O’ í ƒÚì®Tt=ù  ^F��dÃ/ß<óÌ3[-cŽ;¶ºfÚ´iY·nÝ6÷kooÏ3Ï<“¢(’${ï½wç Ð@º õ¢gP?2@½è‚4–ƒ> † Öìx�M3Zkkk' ‘Ïêf̘1ikkK’¬]»6O<ñÄלxâ‰ÕzáÂ…¹á†¶ºWY–¹âŠ+ªuò‡b(@w¡ P/zõ#£Ô‹.(@c9èjà°ÃK²á•§Ÿ~ºú�€æ9ä�C’lÈhsçÎmò4ÈgõÒÖÖ–£�>ºz|÷ÝwoqÍ©§žš�¦(ŠªÀyÍ5×déÒ¥Õ5ííí9ÿüósûí·Wwp:thŽ8∆¿€Î¤ P/zõ#£Ô‹.(@c9èj`Ô¨Q9öØc“$K–,ÉôéÓ›<‡rH=ôÐ$î0õðÃ7y"€ÞM>¨ŸSN9¥ZO�:u‹çûõë—‰'¦,ËE‘µk׿3ŸùLN<ñÄL˜0!'œpBN?ýôÜ~ûíIR]wÞy祥E­ è^tAêEÏ ~d4€úÑh @M¼ÿýï¯ÖŸþô§ÓÑÑÑÄiH’³Ï>»ZîsŸkÚl ŸÔË›Þô¦êíÓ¦MK{{ûלsÎ99ᄪâfY–éèèÈüùó³xñâ”e™$ÕÜO9唜uÖY]ú>:‹.(@½èÔ�ŒP/º �ã O¨‰W¿úÕyÿûߟ²,óÐCåƒü`V­ZÕì±zµ·¾õ­yË[Þ’²,s×]wåŸøD³GèÕä3€z6lXnºé¦Üxã�ùîw¿›}öÙg‹kZ[[sõÕWçmo{Ûf_/Š¢*tn,~¾ë]ïʾð….™ tAêEÏ ~d4€zÑhœ¢Üx2P ×^{m>ûÙϦ££#£F�Êûßÿþ¼þõ¯ÏàÁƒ›=@¯´~ýú|ìcË·¾õ­E‘cŽ9&^xaÆ�ßìÑz%ù  ûzä‘Grë­·æ�È‚ R–e†šcŽ9&oyË[ò²—½¬Ù#t ]P€úÐ3¨  ûÒØqú€š8묳ªõï~÷»Ì›7/Éî^0räÈ 2$mmm;µoQùÚ×¾Ö©³ôúЇªõ´iÓ2gΜêÎRƒÎa‡¶ËÍGvž|@�é‚Ô‹ž@ýÈhôú€š7n\õAô¦6ý_õÖžßž²,SEfΜ¹ÛóôF[Ëh»“Ï6~¿Œ°kä3êL ^ô êGF ·hmöÀöíÊÒ4Ž|P/òuç³l€ú�ÍêGF 'rÐ'ÔȦwœ d4€z‘Ϩ3ŸcÔ‹|P?2½AQú `«æÌ™Ó°½GŒѰ½z*ù ØQzõ#£Ð[8èdFÌùfIDAT:Ak³ê㬳ÎjêëE‘¯}íkM� »Òh>}•iÓ¦¥(Ц¼vY–M{m€ž@ ùZš=ô­Í¨—²,›=»H ¹ŠÒßİÛZ›=°}O=õTf̘‘E‹eÉ’%Y³fÍNï1iÒ¤LÐ{­Y³&³fÍÊ¢E‹²téÒ]ÊhgœqFçÐKÉgÔ™.(@½èÔ�Œ@OS”eY6{`sóæÍË7¾ñ�üà?È‚ v{¿™3gvÂT½ÛÊ•+sóÍ7çûßÿ~f̘‘ŽŽŽÝÚOFØ=òu¦ P/zõ#£Гµ6{`s7ß|s>ò‘�dÅŠÙÞyÜEQ$É6¯)Š"eYV×°ë¦M›–K/½4Ï>ûl’mg°#£tù €:Ó¨=€ú‘Ñèéô 5òƒü ÿ÷¿Õ”7}\–åX¿Øóìš;î¸#çŸ~Ö¯_¿EN{aÛÔ óœŒÐ9ä3€žéþûïÏ¥—^šdCv›2eJ“'Ø5º õ¢gP?2@Ϥ °9}@M<ùä“ùçþçêé²,sÜqÇåÍo~sFŒ‘÷½ï}ÕÐ÷w—C9$‹/Îc�=–{ï½7<ð@’ ?èŒ3&—\rIØÄwÐý=ûì³¹ä’KÒÑÑQe±Q£Få�o|cFޙɓ'W_?÷ÜssÀTmúôé™;wnõü˜1cröÙg§OŸ>M{?Ý�|Ðs­^½:sæÌI²å/ætº õ¢gP?2@Ï¥ °9}@M\}õÕY³fMõøø@.¸à‚­^;nܸŒ?~³¯Íœ93þð‡óÀ¤½½=Ÿþô§síµ×fذa � '»þúë³téÒêÃä·¿ýí™---ùä'?™Ã? ÎtAêEÏ ~d4z}@ <þøãÕº­­-¯|å+·{ýºuë¶ù\KKK.ºè¢$îlõõ¯½úÀ€7kÖ¬jݧOŸL˜0a»×¯_¿~›Ïõë×/_|q’ íÚk¯íœ!zù €:Ó¨=€ú‘ÑèMô 5°xñâ$IQ9rdZZ¶ü_tQÕzõêÕÛÝ邏NÊ Aƒ’$ ,Èo~ó›Nœ wxþùç“ü!£µµµmqͦmÕªUÛÝïÔSOMÿþý“$sæÌÉ£�>ÚyÃôòu¦ P/zõ#£Л8èj`åÊ•ÕzÏ=÷Üê5 ¨îƾtéÒíî×§OŸ >¼züØc�u”½ËòåË«õ^{íµÕkú÷ï_e´eË–mw¿¶¶¶Œ1¢z ´6{èé^ûÚ×6õõ‹¢È”)Sš:@ÝœuÖYM}ý¢(òµ¯}­©3Ô‰|@�é‚Ô‹ž@ýÈh°9}@ƒÍ™3'EQ¤,˦¼~QMy]€:›6mZÓrRY–2À ÈgÔ™.(@½èÔ�Œ›sÐ't‘f|@ܬB)@’Üÿý¹ôÒK“lø7Ó)S¦4y"€]§ ô6º »ÆAŸÐ`Çoöl…_„¨ù  gZ½zuæÌ™“¤9ât]P€úÑ3¨  gÒØ5ú€ûÅ/~Ñìx�Gy¤Ù#° ù €:Ó¨=€ú‘Ñ`s-Íz}@'pÐ'ô@ÿõ_ÿ•C=4‡zh;ì°f�ÀNÐè¾Z›=ÐeY6{6qÿý÷çÒK/M’E‘)S¦4y"€ÞM> îtAêCÏ ~d4êÌAŸ]`õêÕ™3gN’ åšK>v”ž@ýÈhÔYK³€žÀAŸ@CEÑìØEº ;ÇAŸ@C•eÙìØEº ;§µÙ=ӱǛ©S§6{ v�.(À®qÐ'Ðmmm1bD³Ç`è‚ìš–f=�ƒ> ´6{ w˜;wn¾ùÍoæ¾ûîË¢E‹²×^{åðÃÏŸþéŸæ°Ãköxl‡.(ÀŽqÐ'°Ó|ðÁ|ó›ß¬ÿõ_ÿu<ðÀm^ÿÓŸþ4ÿ÷ÿþ߬^½:IR–eŠ¢Èƒ>˜oûÛyßûÞ—‹/¾¸ás  ÐHúvÚw¾ó�ÜrË-)Š"£F�Ún±ó¿ÿû¿s饗fíÚµI’¢(REõ|GGG®¾úêì±Ç™4iRÃgèítA§¥ÙÝÏ]wÝU­O?ýôí^û‰O|"k×®­J�eYnögã×¾üå/ç±Çkô轞.(@ã´6{è-¦OŸÞe¯õÈ#�tÙk½Ïܹsóì³ÏV�_ýêWoóÚ‡z(÷ßu×ö‘#Gæ#ùHŽ=öØ,Z´(×\sM¾ñ�o¤(ŠtttäÚk¯Í§>õ©†¿€�¥ ôº �å Oè"ïyÏ{ªVºÂÆ»°mO?ýt—½Öüùó»ìµº+ù  ûxüñÇ«uKKK=ôÐm^ûÃþ0IR–eúôé“/}éK3fL’dذaùÇüÇ,X° ·Þzk’äç?ÿy>úÑ�f�=öhà;Øyº õ¢gP?2@÷¡ ÐXú€.ÖU…Ë®,’tW§žzª_À¨ù  û˜3gN’ ™jÿý÷O[[Û6¯½ë®»ªkO>ùäªØ¹©‰'VåÎ+VdÖ¬Y9üðÃ09ÀîÓ¨=€ú‘Ѻ]P€ÆrÐ't1¥K€zéÊÌ—^œ|Ð=,[¶¬Zô êGFètAËAŸÐE†ÞìØ ÿ P/ò@÷°jÕªj½½;¸?ðÀI6üOQ?~ü6¯1bDUî|þùç;eN€Î¤ P?zõ#£tº �å Oè"¿øÅ/š=[Ñ•w àÅÉgÝC¿~ýªõòåË·yÝ´iÓªõ~ûí—‘#GnóÚ¾}ûVëMË£u¡ P?zõ#£tº �å O ×zä‘Gš=›�Ϻ�Áƒ'ÙðË9¿ÿýï«»´¿ÐÝwß�$)Š"ÇwÜv÷Ü´$º½;Ã@¢gPG2@÷¡ ÐX-Íè^ÆŒS­W­Z•ûî»o‹kfÍš•öööªôy 'lwÏ Të�åQ:Ÿ.(@c9èØ)ãÆ�Kÿþý«âæ•W^¹Å5W]uU’ wzO’“O>y›û=÷ÜsY¸paõxäÈ‘�9.›Ðh¬Öft/}ûöÍi§�–[n¹%EQäÞ{ïÍ{ßûÞüùŸÿyöØc�ÜrË-ùÙÏ~V•?�=öØŒ1b›û=øàƒ›=~ÙË^ÖÐùz3]P€ÆrÐ'°Ó&Mš”Ÿþô§Y»vmʲ̽÷Þ›{ï½w³kʲLQ9ÿüó·»×”)SªõþûïŸýöÛ¯!3°�.(@ã´4{ û9à€ò‘�|$Iª»µ—e™²,7ûÚŸÿùŸçä“OÞæ>«V­ÊÔ©SSEŠ¢ÈñÇßàÉÐhœÖfÐ�Ýÿý¹ôÒK“lø°zÓ»MÐõä3€®uÆgä%/yI>ñ‰O¤½½½úzY–4hPÎ;ï¼Lœ8q»{|ï{ßËÒ¥K“lÈp§œrJ#G€Šž@ýÈh]K 1ô °V¯^�9sæ$ùÃ]©hù  ë�|òÉùñ�œööö<ñÄY½zuöÛo¿uÔQikk{ÑïïèèÈYg�U=þã?þãFŽ =€ú‘Ѻž.(@çsÐ'°ÛF��Ñ£Gïô÷mZì 9tA:OK³€žÀAŸÐ ô � µÙ=òeËrç�wæ¾ûîK{{{/^œ¥K—¦,ËüË¿üKŽ9æ˜f�À6è‚t}»eñâŹòÊ+ó½ï}/+V¬Øì¹²,SEV­ZµÕï½øâ‹óÓŸþ4I²ÿþûç¿øEÃçàtA:WK³º¯ûï¿?gœqF¾þõ¯gùòå)Ër§¾ÿÜsÏMY–)Ë2Ï<óLþë¿þ«A“ðBº �ÏAŸ� (Šf�À&ä3€®ñ›ßü&çž{næÎ�»Ù׋¢È>ûì³CEÏ—¿üå9ì°ÃªÇïè]EÏ ~d4€®¡ Ðúè;{g*K>h¼åË—çüóÏÏÊ•+“lÈ`G}t®ºêªÜwß}¹çž{’ìØ/Þ¼á o¨ö¸ûî»74l…ž@ýÈh�§ Ð8­Í ;;öØc3uêÔf�Àÿ�Ϻε×^›ùóçWåÍw¿ûÝùû¿ÿû´´ìü½‡Ç�ŸÏ~ö³I’9sæä¹çžËK^ò’N�^HÏ ~d4€®£ Ð8úØ mmm1bD³ÇàÈg]ç;ßùNUì<ñÄó�ÿø�»¼×¸qãÒ§OŸttt$IfÏž­Ü @ÃéÔ�ŒÐutAgç�Lzµ‡~8 ,HY–I’|໵_[[[† V=þýï¿[û°mº �å O`§Ìž=»Z<8ÇsÌnï9xðàj½lÙ²ÝÞ€­Óh,};eáÂ…I’¢(2bĈNÙ³oß¾ÕzÍš5�²'[Òh¬ÖfÐ<ù䓹ÿþû3þü´¶¶fèС;vl9ä�f�Ð+Ég�ÕÑÑQ­[Z:ç^Ë/®Ö{î¹g§ì ;BÏ ~d4€ÆÒh,}ü�öööüìg?K{{{-Z”ÁƒçðÃÏ›ßüæ 6l«ßóÐCåSŸúT~ýë_oõù‘#GæÜsÏÍ™gžÙÈÑz$ù  ¾öÝwß$IY–Y°`Ánï·fÍš<ýôÓÕã}öÙg·÷ wÑ3¨  ¾tA«(˲löÍ´lÙ²|üãÏM7Ý´Õçûôé“óÏ??ý×½Ù׿ûÝïæÃþp:::²½�XŠ¢ÈQG•«¯¾:ƒîÌÑz$ù  þî¹çžœsÎ9I6䫻*|njܸq)Š"IrÝu×eüøñ[ÝïÞ{ïÍÙgŸ]í÷Ãþ0cÆŒiÌðô(zõ#£ÔŸ.(@cµ4{€fZºtiþò/ÿ27ÝtSʲܢP–eÖ­[—/~ñ‹ùÈG>R}ý®»îÊäÉ“³nݺ$>pÞø!õF¿V–exà�œ}öÙY¹reãß@7&Ÿt¯xÅ+ÒÖÖVe®þð‡»µß7¿ùÍj½ï¾û*v°Cô êGFètAËAŸ@¯ö�ÿø�yøá‡S–åfÿØ¿i‘`ã×n¸á†L�:5™˜ÓO?=^xaþäOþ$Üê÷uttäÁÌ7¾ñ�ÜvÛméèèH’E‘÷¼ç=9rdW¾ º)=€ú‘Ѻ]P€Æ)ʲ,›=@W[½zuŽ=öØêƒã£Ž:*ßþö··yýƒ>˜3Ï<³z\–e^ò’—ä¶ÛnË€¶ûZ9ãŒ32{öì”e™—¾ô¥ùÏÿüÏNy=…|Ð=­\¹2ñ‘3f¤(Šêuúô铃>8�=öX’ ÅÍ1cƤ,ËÌ™3'«V­Jò‡_ì)Ë2'œpB®¿þú´´´4ó-Ð èÔ�ŒÐ=é‚4†¿ €^iæÌ™Y·n]6Þå¯þ꯶{ýQG•W¾ò•)˲úÀùíoû‹’¤OŸ>y÷»ß]½Ö¼yóòÜsÏíþ›èAä3€î©ÿþùêW¿Ze³�EÍuëÖUÅÎdC‰söìÙ™={vV®\Ye±�׿úկΕW^©Ø ÀÑ3¨  {Òh ½Òã�?^­[[[sòÉ'¿è÷¼ðš“N:i‡_ﵯ}m’ V'ÉŒ3vø{zù  û2dH¾öµ¯åƒü`\}½(ŠÍþlúµdCásÏ=÷Ì?øÁ|ùË_ΠAƒš2?Ý�ž@ýÈhÝ—.(@çkmöͰdÉ’$>L5jTöØc�ýžƒ:h³Ç£G�Þá×:thöÝwß,X° EQ¸K(À ÈgÝ[Qyÿûߟ³Î:+7ÝtSn¿ýöÜÿýY¼xñ×öë×/¯xÅ+òªW½*oûÛ•:Øizõ#£toº �ËAŸ@¯´råÊj½çž{îÐ÷ 8p³Ç{íµ×N½æÆò@’,[¶l§¾ §“Ïz†~ýúåÌ3ÏÌ™gž™$™?~žþù,Y²$ýû÷Ï>ûì“¡C‡¦µUm €]§gP?2@Ï  Ð9ü- ôJýúõ«Ök׮ݡïiiiÙîã3`À€j½iyù  §:th†Úì1èaô êGFè™tAvÍÎý„ ÐClzgÐ%K–ìÔ÷E±K¯¹bÅŠj½iyù Øqzõ#£À8èè•ößÿ$IY–™;wîß)tã÷ìŠMK ƒÞ¥=z*ù ØQzõ#£À´6{€f8à€ªuGGGüñŒ;v»ß3vìØ|ñ‹_Ü¥×[¾|yæÍ›W=9rä.íÐSÉgÀŽÒ3¨ þÀAŸ@¯4jÔ¨ôïß?«V­J’Üwß}/Z2dH^÷º×íÒëÍœ9s³»‹|ðÁ»´@O%Ÿ;JÏ ~d4ø}½Ö¸qãòë_ÿ:EQdÚ´iy×»Þհ׺ãŽ;ªõ~ûí—ýöÛ¯a¯Ð]ÉgÝWGGGþó?ÿ3wÜqGfΜ™§Ÿ~:Ë—/¯~yggE‘3f4`Jz=€ú‘Ѻ/]P€Îå O ×:öØcóë_ÿ:eYæÎ;ïÌÚµk³Ç{4äµ~ò“Ÿ¤(Š$É1ÇÓ�×èîä3€îéG?úQ.¿üòÌŸ??IR–e“' 7Ð3¨  {Òè|úz­ÓN;-óæÍ«Ï™3'tP§¿Î­·Þšßÿþ÷I6Ü�êU¯zU§¿@O Ÿt?ŸúÔ§òµ¯}­*tEQýÍΖ<‹¢P `‡éÔ�ŒÐýè‚4†ƒ>€^먣ŽÊQGÕð×yþùçsÖYgU�_óš×4ü5º#ù  {¹ñÆó¯ÿú¯I²Y¡³¥¥%#FŒÈÞ{ï�~ýú5qBz2=€ú‘Ѻ]P€Æ)JG;¡££#¯zÕ«²hÑ¢$J�£G�Î\�×¼æ50`@“'`[tA«µÙÝ˯~õ«,\¸°º{ûñÇŸk®¹Æ]Ûº]P€Æjiö@÷òøã�'Ùp÷ö$ùèG?ªØ ÐMè‚4–ƒ>€�²dÉ’$IQ5jT:è æÀÓh¬ÖfÐ�-]º4�<òHõøøã�oâ4Èg]càÀ�Õzï½÷nÞ °ô êGF躠�å O€Ýðßÿýß9çœs’l¸cÕŒ3š<@ï&Ÿt�Ñ£GWë矾yƒÀnÐ3¨  kè‚4VK³èîʲ¬þÐ|ò@ã{ì±4hPʲÌïÿû,X° Ù#À.Ñ3¨  ñtAËAŸÀNikkË;ÞñŽ$~¹æ†nhòDì(]P€ÆrÐ'°Ó.¸à‚xà�)Ë2_ýêWsÿý÷7{$v�.(@ã8èØiÌ5×\“ý÷ß?«V­Êyç�—o¼1eY6{4^„.(@ã´6{ {:à€rã�7æoÿöos÷ÝwçŸþéŸò¥/})§�vZ;ì° 2$}ûöÝé}�?þøL À¦tAÃAŸÀ.Ûwß}ów÷w¹øâ‹ÓÞÞž9sæäk_ûÚ.ïWEf̘щ°-º �ÏAŸÀ.Y³fM>ö±�åÆoLY–)Š"IR–e“'àÅè‚4†ƒ>€�¶fÍšœ{î¹ùÕ¯~¥Ø ÐÍè‚4Žƒ>€�öùÏ>Ó§OOQ)Š"eY¦¥¥%GqD9ä�ì½÷Þéß¿³Ç`+tAÇAŸ»aðàÁ9þøã›=ÿC>èË–-Ë·¾õ­ªÔ™$ÿûÿï\tÑEÙo¿ýš<ì=€ú‘Ѻ†.(@cåÆ¿]vÀ”)S2iÒ¤E‘$y×»Þ•ú§jòTì]P€Æjiö@÷òÔSO%IʲLŸ>}ò�| É°£tAËAŸÀNY¿~}’¤(Š|ðÁÙk¯½š<;J ±Z›=@Oôä“OfÑ¢Eøàm^ÿþÏÿÉÏ~ö³líã–¢(rÐAå›ßüf† Ò°™z2ù  ^Þð†7äw¿û]Š¢È�üã¼ìe/köHPÑ3¨  ^tAgû·¶èÅ~úÓŸ¦,Ë”e™ñãÇo·8ð�o|#·Ýv[ʲLQ)Š¢z®(Š”e™'žx"“&MêŠÑz$ù  ^þâ/þ¢ZéK_jâ$°%=€ú‘ÑêE qô °yà�ª"Àë_ÿúm^»zõê\uÕUÕµeYføðáù“?ù“Œ?>---U™à׿þu~øÃvÕÛè1ä3€úy÷»ß�“N:)eYæG?úQþõ_ÿµÙ#@=€:’ÑêG qô °³gÏΪU«R–e’düøñÛ¼vÊ”)Y¸paõøOÿôOó³Ÿý,ŸùÌgrýõ×ç†nÈ€ªÁ 7ÜÐØáz ù  ~ZZZrå•Wæ”SNIY–¹üòËsÉ%—äw¿û]³G —Ó3¨  ~tA§µÙÔÑSO=U­ �Q£FmóÚÛn»-IR–eöÚk¯üÓ?ýSúôéS=ä‘GfÒ¤I¹üòË“l¸Sè¢E‹²Ï>û4hz€žG>¨Ÿ/~ñ‹I’—¿üåyì±Ç2gΜüä'?É­·Þš±cÇæðÃÏ�!CÒÖÖ¶Ó{Oš4©³Ç Ñ3¨  ~tAÇAŸ[1oÞ¼$IQyéK_ºÍëʲÌ/ùËê §Ÿ~zúõë·Åuo}ë[sÅWTw�9sfN:é¤LÐ3ÉgõóÅ/~±Ê]Ɇ¬V–eʲÌÌ™3óÈ#�ìòÞÊ�ì=€ú‘ÑêG qZš=@­X±¢Z4h›×Íš5+‹/®J¯~õ«·zÝ�!C²ÿþûW�7½ )/N>芢¨þìŠ�9v‡ž@ýÈh݃.(@çpÐ'ÀVtttluýB¿þõ¯«uŸ>}rì±ÇnóÚ}÷Ý·Z/]ºt7'è]ä3€zÚx×öÎú�AÏ ~d4€zÒhŒÖfPGL²áÃéE‹móºiÓ¦%Ùpwª±cÇVß÷b¶WH`Kò@ýüÛ¿ý[³G€­Ò3¨  ~tAÇAŸ[ñ’—¼¤ZÏ�;7K—.Íž{î¹Ù5ëÖ­Ë]wÝ•¢(’$Çüv÷\²dIµîß¿'N ÐóÉgõóÊW¾²Ù#ÀVéÔ�ŒP?º �ÓÒìêhܸqI6Üýsýúõ¹í¶Û¶¸fÊ”)Y²dIʲL²ý³×¯_ŸyóæU�‡ÚÉôlò°£ô êGF 7qÐ'ÀVtÐA9à€’$eY泟ýl~ûÛßVÏÏ�;7Ÿþô§«;„0 '�tÒ6÷kooϪU«ªÇ£F�jÌà=”|P/Ó§OϤI“ª?¿úÕ¯š=Tô êGF¨]P€ÆjmöuõgögùÌg>“¢(²`Á‚¼õ­oÍ 'œ�ÖÖÖüêW¿ÊÒ¥KS–eŠ¢Èé§Ÿž~ýúms¯_þò—ÕºOŸ>9ä�Cºâ-ô(ò@}üæ7¿É”)SREZ[[ó©O}ªÙ#Àfô êGF¨]P€ÆjiöuuöÙgçàƒN’E‘Õ«WçÎ;ïÌüÇdÉ’%Õuƒ Ê\°Ý½n»í¶jŸqãÆm·hÀÖÉgõÑÑÑ‘$)Ë2ÇÏ Aƒš<lNÏ ~d4€úÐh,}lC[[[®½öÚpÀÕÝ@7*Š"eY¦ÿþùÌg>“aÆmsŸ'Ÿ|2÷Ýw_õý'�tRÃgè‰ä3€úxÉK^’dC¨‡—¾ô¥ÕzáÂ…Mœ¶MÏ ~d4€zÐh¬¢,˲ÙCôdíííY»vmõxܸqMœù `÷­Y³&&LÈ’%KREn¿ýöì·ß~Í :�ž@ýÈh»O ±ô ì´É“'çßÿýßSE.¸à‚\xá…Í €¤ Ð8úvÚ¼yórúé§gÙ²eéÛ·o®¿þúsÌ1Í €  Ð8-Íè~† –Ïþóéׯ_V­Z•÷½ï}ùîw¿Ûì±Øº �S”eY6{€îhÞ¼yyþùç³téÒ”e™qãÆeÏ=÷löX½–|еž~úé$ÉŒ3rÙe—eþüù)Š"ûï¿þäOþ$GydFŽ™Aƒ¥µµu§ö>|x#F€Šž@ýÈh]K qô °ƒÖ¬Y“[n¹%?ûÙÏòë_ÿ:Ë–-Ûìùë®».ãÇ�ßâûþó?ÿ3Ï?ÿ|’dÈ�!ùã?þ㮠ǓϚkܸq)Šb³¯m¬"½ðë;£(ŠÌ˜1c·f€Ò3¨  ¹tAgçŽGè¥~úÓŸæcûX,X�äRo´½«gΜ™/|á I’¶¶¶Üu×]î& °›ä3€ú(˲Ê_ÿëÞÃÔ‰ž@ýÈhõ¡ ÐùZš=@Ý}âŸÈÅ_œùóçïTi`£w½ë]éÛ·oʲ̚5kò“Ÿü¤Q£ô ò@ý”e¹Ù¨ =€ú‘ÑêG sµ6{€:»òÊ+óoÿöoI6ʲÌ�!Cr 'dÿý÷ϵ×^û¢{ìµ×^yÕ«^•ŸÿüçI’ÿø�ÿÈ;ÞñŽ†Î ÐSÉgõñ¶·½­Ù#ÀvéÔ�ŒPº �ã O€mxôÑGså•WVwíÛ·oþöoÿ6þçžÖÖ «\{íµ;t§Ð×½îuùùÏž²,3}úôttt¤OŸ> � §‘Ïê哟üd³G€mÒ3¨  ^tAÇAŸÛðùÏ>ëׯO’ì±ÇùêW¿šãŽ;n—özÅ+^Q­W¬X‘ßþö·=zt§Ì Ð[ÈgÀŽÒ3¨ €Þ¢¥ÙÔÑŠ+rç�w¦(ŠE‘sÎ9g—‹I2jÔ¨ 8°züøã�wƘ½†|ì(=€ú‘ÑèMô °¿úÕ¯²víÚ”e™$y÷»ß½Û{:´Z?÷Üs»½@o"Ÿ;JÏ ~d4z}lżyó’$EQdĈyÉK^²Û{<¸Z/[¶l·÷èMä3`GéÔ�Œ@oÒÚìêhÑ¢EÕzß}÷í”=;::ªuK‹û¯ì ù  {yþùçÓÞޞŋgéÒ¥)Ë2&LÈСC›=½€žüÿöî<È®ºÌÿsº›t'tVš ›@O" K` @DGP 5AEDp��€€Ã _¨ÂQF‰¨ !‚ÈV ¢L±Êb „-ÉfÍJ:ûF'�óû#¿\;¤;ôroŸ“¾¯WUŠs»ïýܧÿézsëÝÏ�ü‘Ѷ/º �cÑ'@ zöìY¸^³fMQÎl^Hèׯ_QÎ(ò@þ544Ä„ âÿ÷cÖ¬Y[}ÿ®»îj±ÜùðÃÇüùó#"bРA1räÈ’Ï @÷¦g�?2@þé‚�EŸ-Ø|gÐ4McÁ‚�>¯¡¡!æÏŸI’DDÄÀ�;}&@9‘Ïòmüøñ1nܸX¿~}¤iºÕ÷7ç®–¬Y³&n½õÖH’$*++ã¸ãŽs·w:EÏ d4€|Ó(®Š¬È£½÷Þ»p½jÕªx÷Ýw;uÞ³Ï>›ÊI’Ä�Ø©óÊ�|�OMMM1zôè¸é¦›¢±±q«ïo«Ô¹Ù™gžµµµ‘¦i455ÅOZqòÉ'G𦑦i<öØcñÒK/uèœÿø�ÿˆ9sæ>È9rd1Ç(ò@¾Lž<9~ó›ßþh¦ÿþñßÿýßñÈ#�Äå—_£F�Šˆ¶ÝÉý„Nˆˆˆ4Mãõ×_oñŽðÐzù#£ä‹.(@éXô Њo}ë[±ãŽ;F’$±qãÆ¸ä’Kâ÷¿ÿ}›_¿|ùò¸üòËãÁ,|€=pà@倒Ïòeܸq±©�¹ãŽ;ƽ÷Þ#FŒèÐYtPằ±1fÏž]”(_zù#£ä‹.(@éTe=@^ 0 ®ºêª¸æšk"I’X»vm|ç;߉{î¹'N;í´:thDlúð:I’X¸pa¼ýöÛñÁÄĉãw¿û]¬]»¶pwÐÊÊÊøÏÿüÏèÑ£G–?ÀvK>È�åË—Ç”)S 4sÑEÅ>ûìÓáóþîïþ.úöíË—/�ˆˆY³fÅþûï_”Y(Ozù#£ä‡.(@iYô ° #GŽŒ¹sçÆm·ÝI’Dš¦1uêÔ˜:uêÏKÓ4þíßþm«¯%IRxÝ•W^ÇïÂéºù ¦L™MMM±é�fFŽÙé3 P(w.Y²¤Ó瀞@þÈhù  PZY�w—^ziüà?ˆšššÂ×Ò4Ý¢°¹ °ù_D¾VSS7ß|s|ýë_Ïè'è^ä3€ì-Z´("6e¬ÁƒGŸ>}:}fïÞ½ ׫W¯îôy¡g�G2@ötAJË¢O€68ãŒ3âñÇ�³Î:+ª«« _ÿxY ù×+++ãŸþéŸâñÇ�“O>¹ËgèÎä3€lm¾ÛzDD¿~ýŠrfcccẪªª(g@„ž@ÉhÙÒ(-¿Úh÷Ýw�ï}ï{qùå—ǤI“bòäÉ1sæÌX¶lY¬\¹2jjj¢ÿþ1xðà8âˆ#â¨£ŽŠ�vÚ)뱺-ù ;µµµ…ëbÝq½¡¡¡pÝ¿ÿ¢œ ›éä�Œ�]P€Ò²è �úöí'žxbœxâ‰Y�@ÈgY0`@DD¤isçÎ��7FEEE‡Ï›?~|øá‡…Ç»ì²K§g€–èä�ŒÐõtAJ«ã¿Q€²T___¸^·n]¼þúë�:ïøCẲ²2:è N�@ëtAJË¢O ]öÚk¯󙨭­-Ö¨|Œ.(@iYô ´Ûi§�išFš¦ñì³ÏÆ£�>Úî3šššâ»ßýn,\¸0Ò4�ˆˆQ£F{T>F t,úÚíßøFì´ÓN‘$I¤iÿïÿý¿?~|455µéõ3gÎŒsÏ=7ž{î¹ÂÜ÷ÜsÏøò—¿\âÉÐ(�$ݼþ€O”¦iÌš5+æÏŸ«V­ŠuëÖuèœÓN;­¸ƒ”)ù [Ï=÷\Œ=:6nÜišF’$±ë®»Æ—¾ô¥:thŒ;6""’$‰Ë/¿<|ðALœ81&NœX¸ |DDMMMÜwß}1dÈ�,$º1=€ü‘Ѳ¥ P}´ÁóÏ?=ôP¼üòË. 47}úô"LP¾ä3€üxà�âºë®Û¢¨™$IDD4¯&mþÚf›Ë išFUUUüèG?Š“O>¹ë lèä�Œ�º ÅW•õy¶dÉ’¸òÊ+ã•W^‰ˆ-?Œn¯ÍTüClÚN>ÈŸ³Ï>;>õ©OÅ•W^‹/Þ¢ØÙñù}ûö�¯}íkqî¹çFmmmL@9Ñ3È ßtAЧ*ëòê†nˆY³fmqG©Þ½{ÇðáÃc¿ýö‹~ýúEÏž=³ lÈgùÖ»wï¸ð ã›ßüf̘1#&Ož3gÎŒeË–ÅÊ•+£¦¦&ú÷#Ž8"<ðÀ¨ªR_ 4ô òGFÈ7]P€âIÒÎÞÖ Z¶lY ><6nÜX¸CèÅ_^xaôèÑ#ëñÊŽ|´•ž@þÈh”k�Z0qâÄhjj*Ü!tôèÑqñÅg=@Ù’Ï€¶Ò3È €rR‘õy´`Á‚ˆˆHÓ4ª««ãüóÏÏx"€ò&Ÿm¥g�?2åÄ¢O€466FDD’$±Ç{DMMMÆ”7ù h+=€ü‘Ñ('}´`ç�w.\WVVf8 òÐvzù#£PN,úhÁi𯂠2žù h+=€ü‘Ñ('UY�Gûî»o|úÓŸŽ?ÿùϱtéÒxûí· …ºž|ÐõŽ?þøLÞ7I’xúé§3yoº=€ü‘Ѻž.(@v’4MÓ¬‡È£§žz*ÆŽI’ÄÑGwÜqGÖ#”5ù  kÕ××G’$ÑÕõ¢$Ibúôé]úžt?zù#£t-]P€ìTd=@^}á _ˆ‘#GFš¦ñÒK/Å 7Ü�õHeM>ÈF’$]öŠEÏ d4€lè‚t=‹>¶á{ßû^œuÖY‘¦iÜ}÷ÝñÕ¯~5^}õÕ¬Ç([ò@×JÓ´]ÿ:óÚ®¾[<ÝŸž@þÈh]K Iê·"À'zòÉ'ãúë¯�†††ˆˆèÓ§O 2$ =zôh×YI’Äõ×__Š1ʆ|Pz“&Mj×óß}÷ݸá†"bSÆúå/Ùá÷>üðÃ;üZø8=€ü‘ÑJO ;UY�w+V¬ˆwÞy' w’Z¾|yLœ8±Ýg¥iª<ÐIò@×hoÁ²©©©S¯€RÐ3È  kè‚dÇ¢O€m˜:ujŒ=ºpwÐ$I2ž ¼Ég@[éä�Œ@9°è 3gÎŒo~ó›±jÕªˆØTØ|—Pºž|´•ž@þÈh” ‹>Zñ½ï}/V­ZU¸3hš¦qÌ1ÇÄç?ÿùØwß}£ÿþQSS“ñ”åC>ÚJÏ d4Ê…EŸ-˜={v¼úê«…;ƒöíÛ7n½õÖ6lXÖ£”%ù h+=€ü‘Ñ('Y�G¯¿þzDlº3h’$qÝu×)dH>ÚJÏ d4ʉEŸ-hhh(\÷éÓ'¾ð…/d8 òÐVzù#£PN,úhÁŽ;îI’ÄàÁƒ#I’Œ'(oòÐVzù#£PN,úhÁ Aƒ ×ëׯÏp"ä3 íô òGF œXô Ђ8 *++#MÓ˜;wnlذ!ë‘Êš|´•ž@þÈh”‹>Z0hР8ꨣ""bÍš5ñÇ?þ1ã‰Ê›|´•ž@þÈh”‹>ZqñÅGeeeDDüøÇ?ŽÕ«Wg<@y“Ï€¶Ò3È €raÑ'@+>ûÙÏÆÕW_sæÌ‰o}ë[±xñ⌧(_òÐVzù#£P.,ú؆Q£FÅÍ7ßµµµ1eÊ”8å”Sâ–[n‰3fDš¦Y�Pvä3 ­ô òGF $©ÿËhÑñÇ_¸^¹re¬X±"""’$‰ˆˆªªªèÛ·oTWW·ëÜ$Iâé§Ÿ.Þ eB>èZÍóW[|ôÑG±xñâˆØ”±êêê:ô¾òÅ g�?2@×ÒÈNUÖäÕܹs#I’HÓ4’$)”6ß7eýúõ…«Ûcó9´�|еšç¯öJÓ4æÎ�Û¡÷•Ï(=€ü‘Ѻ–.(@v,úøÿ0¹3.wäƒp¶$Ÿt­®,[Êg›ž@þÈh]K ëYô Њººº¬G ù  ë)[°½Ò3È  ëé‚d#Iý>fÒ¤I™½÷ᇞÙ{tº Ù±èŠ *ëò¨©©)Ö®][x\]];ì°C†”7ù h+=€ü‘Ñ('Y�G�>úh 6¬ðoòäÉY�PÖä3 ­ô òGF œXô Ђ†††HÓ4Ò4�Þ½{Ç‘G™õHeM>ÚJÏ d4ʉEŸ-èÕ«WDD$IuuuO€|´•ž@þÈh”“ª¬È£�f=ÍÈgÛ§™3gÆøñã#bÓê\ýõO@9Ð3È `û¤ Ð1}´`Ÿ}ö‰ˆˆ4McþüùO€|°}Z´hQ<ú裑$ID„r']BÏ d4€í“.(@ÇTd=@í»ï¾±ï¾ûFDÄŠ+âÍ7ßÌx"€ò&ŸlßÒ4Ízʈž@þÈhÛ7]P€ö±è g�uVázܸqN@„|´�ž@þÈh” ‹>Z1jÔ¨8ä�C"MÓxå•Wâ†nÈz$€²&Ÿm¥g�?2å¢O€VTVVÆm·Ý‡zh¤iwß}wœsÎ9ñꫯf=@Y’Ï€¶Ò3È €r‘¤išf=@Ýzë­±aÆx衇bñâÅ‘$IDDì´ÓNñ™Ï|&µµµQUUÕ®³G�]ôyº;ù `ûó§?ý)Î;(ˆH’$¦OŸžñD” =€ü‘Ѷ?º cÑ'@+êëë e�Íš”òñ﵇±ÚO>Øþ(w�=€ü‘Ѷ?º Ó¾ÛW”¹Î"6•:{#Ÿm¥g�?2Ý‘EŸÛÐü® dO>ÚJÏ d4Ê�EŸ­¸çž{²€fä3 ­ô òGF \$©[]%ðá‡ÆK/½Tx|úé§g8 í¡ Ð1}@Td=t}@Te=P>^|ñŘ2eJ,]º4úöíC‡�ãŽ;.zôè‘õh|]P€OfÑ'@;¤io¿ývL™2%fΜË—/�•+WÆÆ�㪫®Š!C†d="@Y‘ϲ³páÂxñÅ ��9æ˜4hP«ÏŸ3gNŒ3&Þ{ï½­¾7pàÀøþ÷¿Ç{lIf€=€<’Ѳ£ P:}´Áúõëã¾ûî‹{î¹'æÍ›·Å÷Ò4�$Ibùòå-¾öÚk¯�—_~9""êêêâÞ{ï-ù¼Ý�|�½ &Äøñã#"¢wïÞqÊ)§´ú܆††øÊW¾ ‘¦iDD$I›òÛ¢E‹âÛßþvüô§?�ãŽ;®ôÃPVô òGFÈž.(@éTd=@Þ½ÿþûqöÙgÇøÃ˜;wnáÃçˆØâº5_üâcîܹ1wîܘ¬X±"fÏž]È_ŸûÜçZ}îܹsã‰'žˆ$I"MÓ¨®®Ž‹.º(î¸ãŽøÑ�~p@¡ä¹bÅŠ¸óÎ;»âG  èä�Œ�º ¥eÑ'@+ã‚ .ˆ†††Â×êêêâꫯŽ'Ÿ|2Þxã�6N:é¤ÂõK/½T’yº;ù ?Þ{ï½-îÂ~È!‡´úÜßþö·±qãÆBV»ñÆcìØ±qÌ1ÇÄ©§ž¿úÕ¯bèС±é�vüñ.ùèÞô òGFÈ]P€Ò²è ÷Ýw_Ì™3§P8ñÄãw¿û]|õ«_�½÷Þ;zöìÙæ³Ž=ö؈Øôáô¬Y³béÒ¥%™ ;“Ïòã¯ýkázàÀ�Ñ»wïVŸûüóÏGDD’$Q__'œpÂßïÑ£GŒ;¶ðxÑ¢E1{öìâ @ÙÑ3È ?tAJË¢O€VÜsÏ=…âÀ�!Câæ›oŽššš�õ÷ÿ÷[ÜMtæÌ™E™ œÈgù±ù�c’$‰þýû·ú¼Õ«WÇ;ï¼SÈ^_üâ[|ÞQGÕÕÕ…Çÿ÷ÿWÄi(Gzù#£ä‡.(@iYô Ђ™3gƼyó"MÓˆˆ¸ì²Ëb‡vèðy½zõŠAƒðÁ�ž œÈgù²nݺÂuÏž=[}Þ[o½6l(ä¸c�=¶ÅçUUUÅî»ï^x¼xñâ"M @9Ò3È _tAJË¢O€L›6­pÝ«W¯8ꨣ:}fŸ>} ×+V¬èôyåD>È—ÊÊÊÂõG}Ôêó¦L™R¸®­­�úúúVŸ[[[[¸^½zu'' œéä�Œ�/º ¥eÑ'@ –,YI’ÄàÁƒ£¢¢ó£4¿›Uó»\ðÉä3€|éÝ»wDD¤ióçÏoõyúÓŸ"bSŽ;øàƒ·yfóLVŒ¼@ùÒ3È _tAJËoA€4¿óT�=ŠræÊ•+ ×ÍïHÀ'“Ïòe�=ö(\/_¾ 3ô òGFÈ]P€Ò²è  (\/]º´Óç555mq7«þýûwúL€r"ŸäË�!C¢¢¢¢Pܼ÷Þ{·z΄ bãÆ�‘¦iDDyä‘­ž·jÕªX¸paἺººL @¹Ð3È _tAJË¢O€ 80""Ò4�yóæmq‡ÏŽxç�wbíÚµ…Ç{î¹g§Î(7ò@¾ôíÛ7þáþ!Ò4�4Mã׿þuÜzë­±dÉ’X±bEL˜0!Æ�_(k~êSŸŠ¡C‡¶zÞ´iÓ gEly—xh/=€ü‘ÑòE ´,úhÁ!‡UUU‘$I¤iøÃ:uÞ¯ýëÂuŸ>}¶ùA6[“Ïòç‚ .ˆˆ(d´Ÿýìg1|øð8âˆ#â?øAlذ!Ò4�$Iâ¼óÎÛæYÏ=÷\áºOŸ>þø€NÑ3È tAJÇ¢O€ôîÝ;>øàÂ�£n¿ýö-îòÙS§N�ßþö·‘$I$IÇsL‘§èþä3€ü9òÈ#ãœsÎ)8#¢�ךí ƒŠ‘#Gn󬧞zª�Ï>øà’Ï@÷¦g�?2@þè‚”ŽEŸ­Ø|g©$Iâ¯ýk\qű~ýúv�1}úô¸ä’K¢©©©ð�ö…^XŠqº=ù ®¹æšø—ù—¨¬¬Œ4M·ø^š¦1|øðøÅ/~•••­žñÜsÏżyó ¯?öØcK:3åAÏ d4€üÑ(�ª¬È«Ïþó1lذxíµ×"I’xöÙg㬳Ίï~÷»qä‘Gnóµ .Œ &Ä„  wM’$¾üå/Ç~ûí×ãt;ò@>]zé¥ñÏÿüÏñÌ3ÏÄœ9sbݺu±Ë.»ÄðáÃÛtGö_|1êëë ��?þøRŽ @™Ð3È ŸtAŠ/I?¾>€‚%K–ÄÈ‘#cÞ¼y…;}î¼óÎ1tèÐxþùç#bS1àˆ#Žˆêêêxÿý÷ãý÷ßßâùišÆþûï<ð@ÔÔÔdõãl÷ä3 ­ô òGF Xô ð æÌ™ßþö·cÖ¬Y…"@Dlq½ùqDlõµ4McÈ�!ñ‹_ü" ÔµÃtCòÐVzù#£ÐÝUd=@Þí¹çžñÈ#�ÄÙgŸ•••ñ·¢@’$…›5\YYgŸ}vÜÿýŠE"Ÿm¥g�?2Ý]’6¿mÛ´`Á‚˜0aBüñ�Œ÷Þ{/Zûhe�=öˆcŽ9&Î=÷ÜØ}÷Ý»xJ€ò!Ÿm¥g�?2Ý‘EŸ´bÅŠ˜={v,[¶,V¬X={öŒ~ýúÅî»ï�Ï€¶Ò3È €î¢O ÝæÍ›W²³ëêêJv6º ¥dÑ'Ðnõõõ‘$IÑÏM’$¦M›Vôsø]P€Ò©Êz`ûå>ÃÛ/]P€â³èèR¿û»‚(ÀöC`Û,úÊÖk¯½–Ù{6,³÷È+ù `ûrúé§·û5k×®�%K–Ä´iÓbÕªU±©è¹ûî»Ça‡VìèÆô òGFؾè‚”N’Z� ”©úúú­îÕ’$‰iÓ¦uùûä�|P>Ò4�^x!~úÓŸÆ»ï¾I’Ä…^—]vYÖ£°�Ð3È  |è‚l[EÖd-MÓ.ÿ@ëä3€î/I’øÜç><ð@œ~ú鑦iÜ~ûíqã�7f=Û=€ü‘Ѻ?]P€m³è({I’tÙ?>™|P>ªªªâûßÿ~tÐA‘¦iÜyç�ñÒK/e=Û=€ü‘Ñʇ.(@˪² +uuuíz~ccc,^¼8"6vÝu×RŒP¶ä3€òTYYcÆŒ‰óÏ??""n¾ùæ8úè£3ž €¼Ó3È  <é‚l-IÓ4Íz€íÁ+¯¼ßøÆ7"bSy`úôéOPÞä3€î£©©)?üðX½zu$IO<ñDì³Ï>Y�@7¢g�?2@÷¡ °¥Š¬Ø^$I’õ4#Ÿt•••±Ûn»¿ýöÛN@w¤g�?2@÷¡ °%‹>€ÌõèÑ£p½hÑ¢ ' ½tAþÆ¢O sóçÏ/\WUUe8 í¥ ð7}™š4iR4440 Ãih]P€-Yô dféÒ¥qÝu×E’$…¯xà�N@[é‚lÍ¢O Ë­X±"~ó›ßÄi§�³fÍŠˆˆ$IâÓŸþtì½÷ÞOÀ¶è‚´®*ë€íÏ×¾öµ½î£�>ŠÅ‹Çüùó#MÓHÓ4’$)ü÷Š+®(ò¤|œ.(@éXô ´Û¤I“"I’½6MÓÂõæbgDÄ%—\#FŒ(Ê|´N t,úºÔæRèæ»¸4(®¾úê8餓2ž €O¢ °m}ÒünìmU]]µµµQWWC† ‰#FĈ#¢²²²Ð]P€Ò°èh·3fd=¤ P:YÝ�EŸPUY�•×^{­]ÏŸ1cÆ�'Ožišv轇 Ö¡×tgòÐVzù#£À&IÚÑÿÃØÎÕ××G’$ízMó�RÚûÚæ¯›6mZ‡^ Ð�Ég@[éä�Œ›Te=@ÖÚs”æ…÷O( ù  {ذaC444ÄòåËcõêÕ±ãŽ;Fß¾}c§�vŠª*µ%ŠCÏ d4€îA ãü–Ê^gîöÙ^ ŸL>Ø~}ðÁñàƒÆk¯½Ó§O�ÆÆÆ­žÓ£G�2dH~øáqæ™gÆî»ïžÁ¤tzù#£l¿tAŠÃ¢O lÕÕÕe=ÍÈgÛ¯?ü0®»îºxöÙg @ÓÚÒ|ôÑG1uêÔ˜:ujÜqÇq 'Ä5×\ìÊ‘ØÎéä�Œ°ýÒ(®$uk  ƒ^~ùå¸üòËcùòå…Bg’$…ï7¯'µôõ$I¢oß¾qóÍ7ÇQGÕES¡ P }2eÊ”8ÿüócݺu±©¨¹¹ŽTUU{íµWôïß?zõêkÖ¬‰¥K—ÆìÙ³cÆ [=¿gÏžq×]wÅÁœÍPftAJâO ÝÖ¬Y'�tR,^¼¸PÒL’$N>ùä8ãŒ3â°Ã‹=zlõºÆÆÆ˜2eJ<ôÐCñä“O¾ž¦iì²Ë.ñÔSOEÏž=»òG(;º ¥cÑ'ÐnãÆ�‹Ÿÿüç…bç Aƒâ–[n‰Ï~ö³m>ã­·ÞŠ±cÇÆ‚ åЋ/¾8F�]ºÁÐ(!‹>€v1bD,Z´(Ò4�~ýúÅ#�<uuuí>gÞ¼yqÆgIJeË %Ñ^x¡°™.(@éTd=°}™1cF,\¸0""’$‰+®¸¢CÅΈˆºººøÎw¾›ïW¼hÑ¢˜1cFÑf`Kº ¥eÑ'Ð.þóŸ#""MÓ¨®®ŽSN9¥Sç}éK_Šššš­Î øtAJË¢O ]"bÓÜ={öìÔy={öŒÁƒou>ŧ PZ}íòÑG®«««‹rf�= ×���E9€­é‚”–EŸ@» 0 ""Ò4�ùóçåÌ ®û÷ï_”3Øš.(@iYô ´Ë®»îZ¸^ºti¼ùæ›�:ïÍ7ߌ%K–×ÕÕuê<Z§ PZ}ír衇Fuuu$I7Þxc§Î»é¦› ×=zôˆC=´SçÐ:]P€Ò²èh—ššš>|x¤iišÆäÉ“ãßÿýßcãÆ�í:'MÓ¸öÚkcÒ¤I‘$I$IG}tTWW—hrtAJË¢O ÝÆŒ‘$I¤i�>úhœyæ™1qâÄ6½þÕW_�3Ï<3|ðÁÂ1f̘O€.(@é$iš¦Yl~üãÇ�wÞY(gFD$I»îºkqıÿþûGÿþý£W¯^±fÍšX¶lY̘1#&MšóæÍ‹ˆMwrO’$""Î?ÿü¸âŠ+2ûyʉ.(@iXô tØ¿þë¿Æc�=V(h6/y¶æãÏIÓ4N;í´øáXâihN ø,ú:åÞ{ï�›nº)Ö­[·E©³¥jÒÇ¿_SSW^yeœsÎ9]2+[Ò(.‹>€N[¸paüêW¿Š‡~8>ñù;ï¼sœqÆ1jÔ¨4hPL@ktAŠÇ¢O ¨fΜo½õVÌ�;7V¬XkÖ¬‰^½zEŸ>}b·Ýv‹ƒ:(öÞ{ï¬Ç º �cÑ'AEÖ@w`Ñ'�EŸPUYäϪU«2{ïÚÚÚÌÞ ;ÐÈN’¦išõ@¾Ô××G’$]þ¾I’Ä´iÓºü}º]P€ìTe=�Oî! °ýÒȆEŸ@‹J}÷4M·xeR€âÑȆEŸÀVêêêJþ6lˆE‹•¼D PntA²cÑ'°•gŸ}¶dgoܸ1{챸õÖ[KöåL ;}]æ©§žŠqãÆÅ¬Y³"" wpOÓ4""N8á„Ìf`ÛtA>™EŸ@ɽð qË-·ÄôéÓ EÎ$I ×Ç�K/½48à€,Ç º m—¤›;Ùk¯½ÿõ_ÿo¼ñFDlº[{óRç!‡—]vY 6,Ë1h�.(@ûYô ÝÛo¿?ùÉOâ•W^‰ˆ¿•:7_2$ÆŽ#FŒÈrLZ  Ðq}EóÞ{ïÅ-·ÜÏ<óLDl]êÜ{ï½c̘1ñ�ÿø�YŽ @ tA:Ï¢O Ó>øàƒ7n\üþ÷¿��7nUêÜm·Ýâ’K.‰SO=5***2ž€ætAŠÇ¢O Ã.\?ûÙÏâ‘G‰¦¦¦­J�Œ‹.º(FŽ;ì°CÆÓМ.(@ñYô ´Û’%Kâ¶Ûn‹x ·*uöë×/.¸à‚øÊW¾ÕÕÕO @sº ¥cÑ'Ðf+W®ŒñãÇǽ÷Þk׮ݪԹãŽ;Æyç�_ÿú×£¶¶6ãihN ôª²È¿µkׯ/ù˸뮻båÊ•±ùþÂI’Dš¦QSS£F�Š /¼0úõë—í°lA ëXô ´ª±±1î¿ÿþ¸ýöÛcÉ’%[•:+++㬳Ί‹.º(˜ñ´4§ Ðõ,ú¶ÒÔÔ?üpüüç?�… nUꬨ¨ˆSO=5.¾øâ^ÂãRJ’$¦M›Vò÷èÎtA²S•õ@¾}¼ä ÀöC kYô ´I©ïâ®< P:º ]âO`+uuuY�@é‚d'I­>€N«Èzè,ú€"°èŠÀ¢O(‹> ,ú€"°èŠÀ¢O(‹> ,ú€"°èŠÀ¢O(‹> ,ú€"°èŠÀ¢O(‹> ,ú€"°èŠÀ¢O(‹> ,ú€"°èŠÀ¢O(‹> ,ú€"°èŠÀ¢O(‚ÿ!QÒ­VS IEND®B`‚accelerate-1.14.0/benchmarks/torch.compile/regional_compilation.py000066400000000000000000000056551521253476100253410ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import torch from torch.utils.benchmark import Compare, Timer from transformers import AutoConfig, AutoModelForCausalLM from accelerate.test_utils.testing import get_backend from accelerate.utils import compile_regions torch.set_float32_matmul_precision("high") COMPILE_ITERS = 2 INFERENCE_ITERS = 100 BASELINE = "Baseline" COMPILE_TIME = "Compile time" INFRENCE_TIME = "Inference time" FULL_COMPILATION = "Full compilation" REGIONAL_COMPILATION = "Regional compilation" INFRENCE_STMT = "model(input_ids, use_cache=False)" COMPILE_STMT = f"torch._dynamo.reset(); torch._inductor.utils.clear_inductor_caches(); {INFRENCE_STMT}" torch_device_type, _, _ = get_backend() results = [] for model_id in [ # non-gated llama models "NousResearch/Llama-3.2-1B", "NousResearch/Hermes-3-Llama-3.2-3B", "NousResearch/Hermes-3-Llama-3.1-8B", "NousResearch/Nous-Hermes-Llama2-13b", ]: with torch.device(torch_device_type): config = AutoConfig.from_pretrained(model_id) model = AutoModelForCausalLM.from_config(config).to(dtype=torch.float16).eval() full_compilation_model = torch.compile(model) regional_compilation_model = compile_regions(model) for model, sub_label, description, stmt, iters in [ (model, BASELINE, INFRENCE_TIME, INFRENCE_STMT, INFERENCE_ITERS), (full_compilation_model, FULL_COMPILATION, COMPILE_TIME, COMPILE_STMT, COMPILE_ITERS), (full_compilation_model, FULL_COMPILATION, INFRENCE_TIME, INFRENCE_STMT, INFERENCE_ITERS), (regional_compilation_model, REGIONAL_COMPILATION, COMPILE_TIME, COMPILE_STMT, COMPILE_ITERS), (regional_compilation_model, REGIONAL_COMPILATION, INFRENCE_TIME, INFRENCE_STMT, INFERENCE_ITERS), ]: for batch_size, sequence_length in [(1, 128), (4, 128)]: input_ids = torch.randint( 0, 1000, size=(batch_size, sequence_length), dtype=torch.int64, device=torch_device_type ) results.append( Timer( label=model_id, sub_label=sub_label, description=f"{description} ({batch_size}x{sequence_length})", globals={"model": model, "input_ids": input_ids}, stmt=stmt, ).timeit(number=iters) ) compare = Compare(results) compare.colorize() compare.print() accelerate-1.14.0/docker/000077500000000000000000000000001521253476100151425ustar00rootroot00000000000000accelerate-1.14.0/docker/README.md000066400000000000000000000063501521253476100164250ustar00rootroot00000000000000 # Official Hugging Face Accelerate Docker Images Accelerate publishes a variety of docker versions as part of our CI that users can also use. These are stable images that Accelerate can run off of which comes with a variety of different setup configurations, all of which are officially hosted on [Docker Hub](https://hub.docker.com/r/huggingface/accelerate). A breakdown of each are given below ## Naming Conventions Accelerate docker images follow a tagging convention of: ```bash huggingface/accelerate:{accelerator}-{nightly,release} ``` `accelerator` in this instance is one of many applical pre-configured backend supports: * `gpu`: Comes compiled off of the `nvidia/cuda` image and includes core parts like `bitsandbytes`. Runs off python 3.9. * `cpu`: Comes compiled off of `python:3.9-slim` and is designed for non-CUDA based workloads. * More to come soon * `gpu-deepspeed`: Comes compiled off of the `nvidia/cuda` image and includes core parts like `bitsandbytes` as well as the latest `deepspeed` version. Runs off python 3.10. * `gpu-fp8-transformerengine`: Comes compiled off of `nvcr.io/nvidia/pytorch` and is specifically for running the `benchmarks/fp8` scripts on devices which support FP8 operations using the `TransformerEngine` library (RTX 4090, H100, etc) ## Nightlies vs Releases Each release a new build is pushed with a version number included in the name. For a GPU-supported image of version 0.28.0 for instance, it would look like the following: ```bash huggingface/accelerate:gpu-release-0.28.0 ``` Nightlies contain two different image tags. There is a general `nightly` tag which is built each night, and a `nightly-YYYY-MM-DD` which corresponds to a build from a particular date. For instance, here is an example nightly CPU image from 3/14/2024 ```bash huggingface/accelerate:cpu-nightly-2024-03-14 ``` ## Running the images Each image comes compiled with `conda` and an `accelerate` environment contains all of the installed dependencies. To pull down the latest nightly run: ```bash docker pull huggingface/accelerate:gpu-nightly ``` To then run it in interactive mode with GPU-memory available, run: ```bash docker container run --gpus all -it huggingface/accelerate:gpu-nightly ``` ## DEPRECATED IMAGES CPU and GPU docker images were hosted at `huggingface/accelerate-gpu` and `huggingface/accelerate-cpu`. These builds are now outdated and will not receive updates. The builds at the corresponding `huggingface/accelerate:{gpu,cpu}` contain the same `Dockerfile`, so it's as simple as changing the docker image to the desired ones from above. We will not be deleting these images for posterity, but they will not be receiving updates going forward.accelerate-1.14.0/docker/accelerate-cpu/000077500000000000000000000000001521253476100200175ustar00rootroot00000000000000accelerate-1.14.0/docker/accelerate-cpu/Dockerfile000066400000000000000000000017531521253476100220170ustar00rootroot00000000000000# Builds CPU-only Docker image of PyTorch # Uses multi-staged approach to reduce size # Stage 1 FROM python:3.10-slim as compile-image ARG DEBIAN_FRONTEND=noninteractive RUN apt update RUN apt-get install -y --no-install-recommends \ build-essential \ git \ gcc # Setup virtual environment for Docker ENV VIRTUAL_ENV=/opt/venv RUN python3 -m venv ${VIRTUAL_ENV} # Make sure we use the virtualenv ENV PATH="${VIRTUAL_ENV}/bin:$PATH" WORKDIR /workspace # Install specific CPU torch wheel to save on space RUN python3 -m pip install --upgrade --no-cache-dir pip RUN python3 -m pip install --no-cache-dir \ jupyter \ "accelerate[testing,test_trackers] @ git+https://github.com/huggingface/accelerate" \ --extra-index-url https://download.pytorch.org/whl/cpu # Stage 2 FROM python:3.10-slim AS build-image COPY --from=compile-image /opt/venv /opt/venv RUN useradd -ms /bin/bash user USER user # Make sure we use the virtualenv ENV PATH="/opt/venv/bin:$PATH" CMD ["/bin/bash"]accelerate-1.14.0/docker/accelerate-gpu-deepspeed/000077500000000000000000000000001521253476100217575ustar00rootroot00000000000000accelerate-1.14.0/docker/accelerate-gpu-deepspeed/Dockerfile000066400000000000000000000027761521253476100237650ustar00rootroot00000000000000# Builds GPU docker image of PyTorch specifically # Uses multi-staged approach to reduce size # Stage 1 # Use base conda image to reduce time FROM continuumio/miniconda3:latest AS compile-image # Specify py version ENV PYTHON_VERSION=3.10 # Install apt libs RUN apt-get update && \ apt-get install -y curl git wget && \ apt-get clean && \ rm -rf /var/lib/apt/lists* # Create our conda env RUN conda create --name accelerate python=${PYTHON_VERSION} ipython jupyter pip # We don't install pytorch here yet since CUDA isn't available # instead we use the direct torch wheel ENV PATH /opt/conda/envs/accelerate/bin:$PATH # Activate our bash shell RUN chsh -s /bin/bash SHELL ["/bin/bash", "-c"] # Activate the conda env, install mpy4pi, and install torch + accelerate RUN source activate accelerate && conda install -c conda-forge mpi4py RUN source activate accelerate && \ python3 -m pip install --no-cache-dir \ "accelerate[testing,test_trackers,deepspeed] @ git+https://github.com/huggingface/accelerate" \ --extra-index-url https://download.pytorch.org/whl/cu126 RUN python3 -m pip install --no-cache-dir bitsandbytes # Stage 2 FROM nvidia/cuda:12.6.3-cudnn-devel-ubuntu22.04 AS build-image COPY --from=compile-image /opt/conda /opt/conda ENV PATH /opt/conda/bin:$PATH # Install apt libs RUN apt-get update && \ apt-get install -y curl git wget && \ apt-get clean && \ rm -rf /var/lib/apt/lists* RUN echo "source activate accelerate" >> ~/.profile # Activate the virtualenv CMD ["/bin/bash"]accelerate-1.14.0/docker/accelerate-gpu/000077500000000000000000000000001521253476100200235ustar00rootroot00000000000000accelerate-1.14.0/docker/accelerate-gpu/Dockerfile000066400000000000000000000027651521253476100220270ustar00rootroot00000000000000# Builds GPU docker image of PyTorch specifically # Uses multi-staged approach to reduce size # Stage 1 # Use base conda image to reduce time FROM continuumio/miniconda3:latest AS compile-image # Specify py version ENV PYTHON_VERSION=3.10 # Install apt libs RUN apt-get update && \ apt-get install -y curl git wget && \ apt-get clean && \ rm -rf /var/lib/apt/lists* # Create our conda env RUN conda create --name accelerate python=${PYTHON_VERSION} ipython jupyter pip # We don't install pytorch here yet since CUDA isn't available # instead we use the direct torch wheel ENV PATH /opt/conda/envs/accelerate/bin:$PATH # Activate our bash shell RUN chsh -s /bin/bash SHELL ["/bin/bash", "-c"] # Activate the conda env, install mpy4pi, and install torch + accelerate RUN source activate accelerate && conda install -c conda-forge mpi4py RUN source activate accelerate && \ python3 -m pip install --no-cache-dir \ "accelerate[testing,test_trackers] @ git+https://github.com/huggingface/accelerate" \ --extra-index-url https://download.pytorch.org/whl/cu126 RUN python3 -m pip install --no-cache-dir bitsandbytes # Stage 2 FROM nvidia/cuda:12.6.3-cudnn-devel-ubuntu22.04 AS build-image COPY --from=compile-image /opt/conda /opt/conda ENV PATH /opt/conda/bin:$PATH # Install apt libs RUN apt-get update && \ apt-get install -y curl git wget && \ apt-get clean && \ rm -rf /var/lib/apt/lists* RUN echo "source activate accelerate" >> ~/.profile # Activate the virtualenv CMD ["/bin/bash"]accelerate-1.14.0/docs/000077500000000000000000000000001521253476100146235ustar00rootroot00000000000000accelerate-1.14.0/docs/Makefile000066400000000000000000000011111521253476100162550ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SOURCEDIR = source BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)accelerate-1.14.0/docs/README.md000066400000000000000000000243111521253476100161030ustar00rootroot00000000000000 # Generating the documentation To generate the documentation, you first have to build it. Several packages are necessary to build the doc, you can install them with the following command, at the root of the code repository: ```bash pip install -e ".[docs]" ``` Then you need to install our special tool that builds the documentation: ```bash pip install git+https://github.com/huggingface/doc-builder ``` --- **NOTE** You only need to generate the documentation to inspect it locally (if you're planning changes and want to check how they look before committing for instance). You don't have to commit the built documentation. --- ## Building the documentation Once you have setup the `doc-builder` and additional packages, you can generate the documentation by typing the following command: ```bash doc-builder build accelerate docs/source/ --build_dir ~/tmp/test-build ``` You can adapt the `--build_dir` to set any temporary folder that you prefer. This command will create it and generate the MDX files that will be rendered as the documentation on the main website. You can inspect them in your favorite Markdown editor. ## Previewing the documentation To preview the docs, first install the `watchdog` module with: ```bash pip install watchdog ``` Then run the following command: ```bash doc-builder preview {package_name} {path_to_docs} ``` For example: ```bash doc-builder preview accelerate docs/source/ ``` The docs will be viewable at [http://localhost:3000](http://localhost:3000). You can also preview the docs once you have opened a PR. You will see a bot add a comment to a link where the documentation with your changes lives. --- **NOTE** The `preview` command only works with existing doc files. When you add a completely new file, you need to update `_toctree.yml` & restart `preview` command (`ctrl-c` to stop it & call `doc-builder preview ...` again). --- ## Adding a new element to the navigation bar Accepted files are Markdown (.md). Create a file with its extension and put it in the source directory. You can then link it to the toc-tree by putting the filename without the extension in the [`_toctree.yml`](https://github.com/huggingface/accelerate/blob/main/docs/source/_toctree.yml) file. ## Renaming section headers and moving sections It helps to keep the old links working when renaming the section header and/or moving sections from one document to another. This is because the old links are likely to be used in Issues, Forums, and Social media and it'd make for a much more superior user experience if users reading those months later could still easily navigate to the originally intended information. Therefore, we simply keep a little map of moved sections at the end of the document where the original section was. The key is to preserve the original anchor. So if you renamed a section from: "Section A" to "Section B", then you can add at the end of the file: ``` Sections that were moved: [ Section A ] ``` and of course, if you moved it to another file, then: ``` Sections that were moved: [ Section A ] ``` Use the relative style to link to the new file so that the versioned docs continue to work. ## Writing Documentation - Specification The `huggingface/accelerate` documentation follows the [Google documentation](https://sphinxcontrib-napoleon.readthedocs.io/en/latest/example_google.html) style for docstrings, although we can write them directly in Markdown. ### Adding a new tutorial Adding a new tutorial or section is done in two steps: - Add a new file under `./source`. This file can either be ReStructuredText (.rst) or Markdown (.md). - Link that file in `./source/_toctree.yml` on the correct toc-tree. Make sure to put your new file under the proper section. It's unlikely to go in the first section (*Get Started*), so depending on the intended targets (beginners, more advanced users, or researchers) it should go in sections two, three, or four. ### Writing source documentation Values that should be put in `code` should either be surrounded by backticks: \`like so\`. Note that argument names and objects like True, None, or any strings should usually be put in `code`. When mentioning a class, function, or method, it is recommended to use our syntax for internal links so that our tool adds a link to its documentation with this syntax: \[\`XXXClass\`\] or \[\`function\`\]. This requires the class or function to be in the main package. If you want to create a link to some internal class or function, you need to provide its path. For instance: \[\`utils.gather\`\]. This will be converted into a link with `utils.gather` in the description. To get rid of the path and only keep the name of the object you are linking to in the description, add a ~: \[\`~utils.gather\`\] will generate a link with `gather` in the description. The same works for methods so you can either use \[\`XXXClass.method\`\] or \[~\`XXXClass.method\`\]. #### Defining arguments in a method Arguments should be defined with the `Args:` (or `Arguments:` or `Parameters:`) prefix, followed by a line return and an indentation. The argument should be followed by its type, with its shape if it is a tensor, a colon, and its description: ``` Args: n_layers (`int`): The number of layers of the model. ``` If the description is too long to fit in one line (more than 119 characters in total), another indentation is necessary before writing the description after the argument. Finally, to maintain uniformity if any *one* description is too long to fit on one line, the rest of the parameters should follow suit and have an indention before their description. Here's an example showcasing everything so far: ``` Args: gradient_accumulation_steps (`int`, *optional*, default to 1): The number of steps that should pass before gradients are accumulated. A number > 1 should be combined with `Accelerator.accumulate`. cpu (`bool`, *optional*): Whether or not to force the script to execute on CPU. Will ignore GPU available if set to `True` and force the execution on one process only. ``` For optional arguments or arguments with defaults we follow the following syntax: imagine we have a function with the following signature: ``` def my_function(x: str = None, a: float = 1): ``` then its documentation should look like this: ``` Args: x (`str`, *optional*): This argument controls ... and has a description longer than 119 chars. a (`float`, *optional*, defaults to 1): This argument is used to ... and has a description longer than 119 chars. ``` Note that we always omit the "defaults to \`None\`" when None is the default for any argument. Also note that even if the first line describing your argument type and its default gets long, you can't break it on several lines. You can however write as many lines as you want in the indented description (see the example above with `input_ids`). #### Writing a multi-line code block Multi-line code blocks can be useful for displaying examples. They are done between two lines of three backticks as usual in Markdown: ```` ```python # first line of code # second line # etc ``` ```` #### Writing a return block The return block should be introduced with the `Returns:` prefix, followed by a line return and an indentation. The first line should be the type of the return, followed by a line return. No need to indent further for the elements building the return. Here's an example of a single value return: ``` Returns: `List[int]`: A list of integers in the range [0, 1] --- 1 for a special token, 0 for a sequence token. ``` Here's an example of a tuple return, comprising several objects: ``` Returns: `tuple(torch.FloatTensor)` comprising various elements depending on the configuration ([`BertConfig`]) and inputs: - ** loss** (*optional*, returned when `masked_lm_labels` is provided) `torch.FloatTensor` of shape `(1,)` -- Total loss is the sum of the masked language modeling loss and the next sequence prediction (classification) loss. - **prediction_scores** (`torch.FloatTensor` of shape `(batch_size, sequence_length, config.vocab_size)`) -- Prediction scores of the language modeling head (scores for each vocabulary token before SoftMax). ``` ## Styling the docstring We have an automatic script running with the `make style` comment that will make sure that: - the docstrings fully take advantage of the line width - all code examples are formatted using black, like the code of the Transformers library This script may have some weird failures if you made a syntax mistake or if you uncover a bug. Therefore, it's recommended to commit your changes before running `make style`, so you can revert the changes done by that script easily. ## Writing documentation examples The syntax for Example docstrings can look as follows: ``` Example: ```python >>> import time >>> from accelerate import Accelerator >>> accelerator = Accelerator() >>> if accelerator.is_main_process: ... time.sleep(2) >>> else: ... print("I'm waiting for the main process to finish its sleep...") >>> accelerator.wait_for_everyone() >>> # Should print on every process at the same time >>> print("Everyone is here") ``` ``` The docstring should give a minimal, clear example of how the respective function is to be used in inference and also include the expected (ideally sensible) output. Often, readers will try out the example before even going through the function or class definitions. Therefore, it is of utmost importance that the example works as expected.accelerate-1.14.0/docs/source/000077500000000000000000000000001521253476100161235ustar00rootroot00000000000000accelerate-1.14.0/docs/source/_toctree.yml000066400000000000000000000105501521253476100204530ustar00rootroot00000000000000- sections: - local: index title: 🤗 Accelerate - local: basic_tutorials/install title: Installation - local: quicktour title: Quicktour title: Getting started - sections: - local: basic_tutorials/overview title: Overview - local: basic_tutorials/migration title: Add Accelerate to your code - local: basic_tutorials/execution title: Execution process - local: basic_tutorials/tpu title: TPU training - local: basic_tutorials/launch title: Launching Accelerate scripts - local: basic_tutorials/notebook title: Launching distributed training from Jupyter Notebooks title: Tutorials - sections: - isExpanded: true sections: - local: usage_guides/explore title: Start Here! - local: usage_guides/model_size_estimator title: Model memory estimator - local: usage_guides/quantization title: Model quantization - local: usage_guides/tracking title: Experiment trackers - local: usage_guides/profiler title: Profiler - local: usage_guides/checkpoint title: Checkpointing - local: basic_tutorials/troubleshooting title: Troubleshoot - local: usage_guides/training_zoo title: Example Zoo title: Accelerate - isExpanded: true sections: - local: usage_guides/gradient_accumulation title: Gradient accumulation - local: usage_guides/local_sgd title: Local SGD - local: usage_guides/low_precision_training title: Low precision (FP8) training - local: usage_guides/deepspeed title: DeepSpeed - local: usage_guides/deepspeed_multiple_model title: Using multiple models with DeepSpeed - local: usage_guides/ddp_comm_hook title: DDP Communication Hooks - local: usage_guides/fsdp title: Fully Sharded Data Parallel - local: usage_guides/megatron_lm title: Megatron-LM - local: usage_guides/sagemaker title: Amazon SageMaker - local: usage_guides/mps title: Apple M1 GPUs - local: usage_guides/intel_cpu title: Intel CPU - local: usage_guides/gaudi title: Intel Gaudi - local: usage_guides/compilation title: Compilation title: Training - isExpanded: true sections: - local: usage_guides/big_modeling title: Big Model Inference - local: usage_guides/distributed_inference title: Distributed inference title: Inference title: How to guides - sections: - local: concept_guides/internal_mechanism title: Accelerate's internal mechanism - local: concept_guides/big_model_inference title: Loading big models into memory - local: concept_guides/performance title: Comparing performance across distributed setups - local: concept_guides/deferring_execution title: Executing and deferring jobs - local: concept_guides/gradient_synchronization title: Gradient synchronization - local: concept_guides/fsdp_and_deepspeed title: FSDP vs DeepSpeed - local: concept_guides/fsdp1_vs_fsdp2 title: FSDP1 vs FSDP2 - local: concept_guides/context_parallelism title: Context parallelism - local: concept_guides/sequence_parallelism title: Sequence parallelism - local: concept_guides/low_precision_training title: Low precision training methods - local: concept_guides/training_tpu title: Training on TPUs title: Concepts and fundamentals - sections: - local: package_reference/accelerator title: Accelerator - local: package_reference/state title: Stateful classes - local: package_reference/cli title: The Command Line - local: package_reference/torch_wrappers title: DataLoaders, Optimizers, Schedulers - local: package_reference/tracking title: Experiment trackers - local: package_reference/launchers title: Launchers - local: package_reference/deepspeed title: DeepSpeed utilities - local: package_reference/logging title: Logging - local: package_reference/big_modeling title: Working with large models - local: package_reference/inference title: Pipeline parallelism - local: package_reference/kwargs title: Kwargs handlers - local: package_reference/fp8 title: FP8 - local: package_reference/utilities title: Utility functions and classes - local: package_reference/megatron_lm title: Megatron-LM utilities - local: package_reference/fsdp title: Fully Sharded Data Parallel utilities title: "Reference" accelerate-1.14.0/docs/source/basic_tutorials/000077500000000000000000000000001521253476100213125ustar00rootroot00000000000000accelerate-1.14.0/docs/source/basic_tutorials/execution.md000066400000000000000000000110061521253476100236350ustar00rootroot00000000000000 # Execution process When working with distributed training systems, it is important to manage how and when processes are executed across GPUs. Some processes are completed faster than others, and some processes shouldn't begin if others haven't finished yet. Accelerate provides tools for orchestrating when processes are executed to ensure everything remains synchronized across all devices. This tutorial will teach you how to execute a process on only one machine and how to delay execution until all processes have reached a certain point. ## Execute on one process Certain code only needs to be run once on a given machine, such as printing a log statement or only displaying one progress bar on the local main process. You should use `accelerator.is_local_main_process` to indicate code that should only be executed once. ```py from tqdm.auto import tqdm progress_bar = tqdm(range(args.max_train_steps), disable=not accelerator.is_local_main_process) ``` You could also wrap a statement with `accelerator.is_local_main_process`. > [!TIP] > For standalone `print` statements that aren't wrapped in `accelerator.is_local_main_process`, replace `print` with Accelerate's [`~Accelerator.print`] method to only print once per process. ```py if accelerator.is_local_main_process: print("Accelerate is the best") ``` For a function that should only be executed once, use [`~Accelerator.on_local_main_process`]. ```py @accelerator.on_local_main_process def do_my_thing(): "Something done once per server" do_thing_once_per_server() ``` You could also direct Accelerate to execute code once across *all processes* regardless of the number of machines. This is useful if you're uploading a final model to the Hub. You should use `accelerator.is_main_process` to indicate code that should only be executed once across all processes. ```py if accelerator.is_main_process: repo.push_to_hub() ``` For a function that should only be executed once across all processes, use [`~Accelerator.on_main_process`]. ```py @accelerator.on_main_process def do_my_thing(): "Something done once per server" do_thing_once() ``` ## Execute on a specific process Accelerate can also help you execute functions that should only be executed on a specific process or a local process index. Use the [`~Accelerator.on_process`] method and specify the process index to execute a function on. ```py @accelerator.on_process(process_index=0) def do_my_thing(): "Something done on process index 0" do_thing_on_index_zero() ``` Use the [`~Accelerator.on_local_process`] method and specify the local process index to execute a function on. ```py @accelerator.on_local_process(local_process_idx=0) def do_my_thing(): "Something done on process index 0 on each server" do_thing_on_index_zero_on_each_server() ``` ## Defer execution When you run your script on several GPUs at the same time, some code may be executed faster than others. You might need to wait for all processes to reach a certain point before executing the next set of instructions. For instance, you shouldn’t save a model before making sure every process is done with training. To do this, add [`~Accelerator.wait_for_everyone`] in your code. This blocks all processes that have finished first from continuing until all remaining processes have reached the same point (this has no effect if you're running on a single GPU or CPU). ```py accelerator.wait_for_everyone() ``` accelerate-1.14.0/docs/source/basic_tutorials/install.md000066400000000000000000000067431521253476100233140ustar00rootroot00000000000000 # Installation Before you start, you will need to setup your environment, install the appropriate packages, and configure Accelerate. Accelerate is tested on **Python 3.8+**. Accelerate is available on pypi and conda, as well as on GitHub. Details to install from each are below: ## pip To install Accelerate from pypi, perform: ```bash pip install accelerate ``` ## conda Accelerate can also be installed with conda with: ```bash conda install -c conda-forge accelerate ``` ## Source New features are added every day that haven't been released yet. To try them out yourself, install from the GitHub repository: ```bash pip install git+https://github.com/huggingface/accelerate ``` If you're working on contributing to the library or wish to play with the source code and see live results as you run the code, an editable version can be installed from a locally-cloned version of the repository: ```bash git clone https://github.com/huggingface/accelerate cd accelerate pip install -e . ``` ## Configuration After installing, you need to configure Accelerate for how the current system is set up for training. To do so run the following and answer the questions prompted to you: ```bash accelerate config ``` To write a barebones configuration that doesn't include options such as DeepSpeed configuration or running on TPUs, you can quickly run: ```bash python -c "from accelerate.utils import write_basic_config; write_basic_config(mixed_precision='fp16')" ``` Accelerate will automatically utilize the maximum number of GPUs available and set the mixed precision mode. To check that your configuration looks fine, run: ```bash accelerate env ``` An example output is shown below, which describes two GPUs on a single machine with no mixed precision being used: ```bash - `Accelerate` version: 1.2.0.dev0 - Platform: Linux-6.8.0-47-generic-x86_64-with-glibc2.35 - `accelerate` bash location: /home/zach/miniconda3/envs/accelerate/bin/accelerate - Python version: 3.10.13 - Numpy version: 1.26.4 - PyTorch version (GPU?): 2.5.1+cu124 (True) - PyTorch XPU available: False - PyTorch NPU available: False - PyTorch MLU available: False - PyTorch MUSA available: False - System RAM: 187.91 GB - GPU type: NVIDIA GeForce RTX 4090 - `Accelerate` default config: - compute_environment: LOCAL_MACHINE - distributed_type: MULTI_GPU - mixed_precision: no - use_cpu: False - debug: False - num_processes: 2 - machine_rank: 0 - num_machines: 1 - gpu_ids: all - rdzv_backend: static - same_network: True - main_training_function: main - enable_cpu_affinity: False - downcast_bf16: no - tpu_use_cluster: False - tpu_use_sudo: False - tpu_env: [] ``` accelerate-1.14.0/docs/source/basic_tutorials/launch.md000066400000000000000000000222161521253476100231110ustar00rootroot00000000000000 # Launching Accelerate scripts In the previous tutorial, you were introduced to how to modify your current training script to use Accelerate. The final version of that code is shown below: ```python from accelerate import Accelerator accelerator = Accelerator() model, optimizer, training_dataloader, scheduler = accelerator.prepare( model, optimizer, training_dataloader, scheduler ) for batch in training_dataloader: optimizer.zero_grad() inputs, targets = batch outputs = model(inputs) loss = loss_function(outputs, targets) accelerator.backward(loss) optimizer.step() scheduler.step() ``` But how do you run this code and have it utilize the special hardware available to it? First, you should rewrite the above code into a function, and make it callable as a script. For example: ```diff from accelerate import Accelerator + def main(): accelerator = Accelerator() model, optimizer, training_dataloader, scheduler = accelerator.prepare( model, optimizer, training_dataloader, scheduler ) for batch in training_dataloader: optimizer.zero_grad() inputs, targets = batch outputs = model(inputs) loss = loss_function(outputs, targets) accelerator.backward(loss) optimizer.step() scheduler.step() + if __name__ == "__main__": + main() ``` Next, you need to launch it with `accelerate launch`. It's recommended you run `accelerate config` before using `accelerate launch` to configure your environment to your liking. Otherwise Accelerate will use very basic defaults depending on your system setup. ## Using accelerate launch Accelerate has a special CLI command to help you launch your code in your system through `accelerate launch`. This command wraps around all of the different commands needed to launch your script on various platforms, without you having to remember what each of them is. If you are familiar with launching scripts in PyTorch yourself such as with `torchrun`, you can still do this. It is not required to use `accelerate launch`. You can launch your script quickly by using: ```bash accelerate launch {script_name.py} --arg1 --arg2 ... ``` Just put `accelerate launch` at the start of your command, and pass in additional arguments and parameters to your script afterward like normal! Since this runs the various torch spawn methods, all of the expected environment variables can be modified here as well. For example, here is how to use `accelerate launch` with a single GPU: ```bash # for cuda device: CUDA_VISIBLE_DEVICES="0" accelerate launch {script_name.py} --arg1 --arg2 ... # for xpu device: ZE_AFFINITY_MASK="0" accelerate launch {script_name.py} --arg1 --arg2 ... ``` You can also use `accelerate launch` without performing `accelerate config` first, but you may need to manually pass in the right configuration parameters. In this case, Accelerate will make some hyperparameter decisions for you, e.g., if GPUs are available, it will use all of them by default without the mixed precision. Here is how you would use all GPUs and train with mixed precision disabled: ```bash accelerate launch --multi_gpu {script_name.py} {--arg1} {--arg2} ... ``` Or by specifying a number of GPUs to use: ```bash accelerate launch --num_processes=2 {script_name.py} {--arg1} {--arg2} ... ``` To get more specific you should pass in the needed parameters yourself. For instance, here is how you would also launch that same script on two GPUs using mixed precision while avoiding all of the warnings: ```bash accelerate launch --multi_gpu --mixed_precision=fp16 --num_processes=2 {script_name.py} {--arg1} {--arg2} ... ``` For a complete list of parameters you can pass in, run: ```bash accelerate launch -h ``` Even if you are not using Accelerate in your code, you can still use the launcher for starting your scripts! For a visualization of this difference, that earlier `accelerate launch` on multi-gpu would look something like so with `torchrun`: ```bash MIXED_PRECISION="fp16" torchrun --nproc_per_node=2 --nnodes=1 {script_name.py} {--arg1} {--arg2} ... ``` You can also launch your script utilizing the launch CLI as a python module itself, enabling the ability to pass in other python-specific launching behaviors. To do so, use `accelerate.commands.launch` instead of `accelerate launch`: ```bash python -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2} ``` If you want to execute the script with any other python flags, you can pass them in as well similar to `-m`, such as the below example enabling unbuffered stdout and stderr: ```bash python -u -m accelerate.commands.launch --num_processes=2 {script_name.py} {--arg1} {--arg2} ``` You can run your code on CPU as well! This is helpful for debugging and testing purposes on toy models and datasets. ```bash accelerate launch --cpu {script_name.py} {--arg1} {--arg2} ``` ## Why you should always use `accelerate config` Why is it useful to the point you should **always** run `accelerate config`? Remember that earlier call to `accelerate launch` as well as `torchrun`? Post configuration, to run that script with the needed parts you just need to use `accelerate launch` outright, without passing anything else in: ```bash accelerate launch {script_name.py} {--arg1} {--arg2} ... ``` ## Custom Configurations As briefly mentioned earlier, `accelerate launch` should be mostly used through combining set configurations made with the `accelerate config` command. These configs are saved to a `default_config.yaml` file in your cache folder for Accelerate. This cache folder is located at (with decreasing order of priority): - The content of your environment variable `HF_HOME` suffixed with `accelerate`. - If it does not exist, the content of your environment variable `XDG_CACHE_HOME` suffixed with `huggingface/accelerate`. - If this does not exist either, the folder `~/.cache/huggingface/accelerate`. To have multiple configurations, the flag `--config_file` can be passed to the `accelerate launch` command paired with the location of the custom yaml. An example yaml may look something like the following for two GPUs on a single machine using `fp16` for mixed precision: ```yaml compute_environment: LOCAL_MACHINE deepspeed_config: {} distributed_type: MULTI_GPU fsdp_config: {} machine_rank: 0 main_process_ip: null main_process_port: null main_training_function: main mixed_precision: fp16 num_machines: 1 num_processes: 2 use_cpu: false ``` Launching a script from the location of that custom yaml file looks like the following: ```bash accelerate launch --config_file {path/to/config/my_config_file.yaml} {script_name.py} {--arg1} {--arg2} ... ``` ## Multi-node training Multi-node training with Accelerate is similar to [multi-node training with torchrun](https://pytorch.org/tutorials/intermediate/ddp_series_multinode.html). The simplest way to launch a multi-node training run is to do the following: - Copy your codebase and data to all nodes. (or place them on a shared filesystem) - Setup your python packages on all nodes. - Run `accelerate config` on the main single node first. After specifying the number of nodes, you will be asked to specify the rank of each node (this will be 0 for the main/master node), along with the IP address and port for the main process. This is required for the worker nodes to communicate with the main process. Afterwards, you can copy or send this config file across all of your nodes, changing the `machine_rank` to 1, 2,3, etc. to avoid having to run the command (or just follow their directions directly for launching with `torchrun` as well) Once you have done this, you can start your multi-node training run by running `accelerate launch` (or `torchrun`) on all nodes. It is required that the command be run on all nodes for everything to start, not just running it from the main node. You can use something like SLURM or a different process executor to wrap around this requirement and call everything from a single command. It is recommended to use the intranet IP of your main node over the public IP for better latency. This is the `192.168.x.x` or the `172.x.x.x` address you see when you run `hostname -I` on the main node. To get a better idea about multi-node training, check out our example for [multi-node training with FSDP](https://huggingface.co/blog/ram-efficient-pytorch-fsdp). accelerate-1.14.0/docs/source/basic_tutorials/migration.md000066400000000000000000000254311521253476100236320ustar00rootroot00000000000000 # Add Accelerate to your code Each distributed training framework has its own way of doing things which can require writing a lot of custom code to adapt it to your PyTorch training code and training environment. Accelerate offers a friendly way to interface with these distributed training frameworks without having to learn the specific details of each one. Accelerate takes care of those details for you, so you can focus on the training code and scale it to any distributed training environment. In this tutorial, you'll learn how to adapt your existing PyTorch code with Accelerate and get you on your way toward training on distributed systems with ease! You'll start with a basic PyTorch training loop (it assumes all the training objects like `model` and `optimizer` have been set up already) and progressively integrate Accelerate into it. ```python device = "cuda" model.to(device) for batch in training_dataloader: optimizer.zero_grad() inputs, targets = batch inputs = inputs.to(device) targets = targets.to(device) outputs = model(inputs) loss = loss_function(outputs, targets) loss.backward() optimizer.step() scheduler.step() ``` ## Accelerator The [`Accelerator`] is the main class for adapting your code to work with Accelerate. It knows about the distributed setup you're using such as the number of different processes and your hardware type. This class also provides access to many of the necessary methods for enabling your PyTorch code to work in any distributed training environment and for managing and executing processes across devices. That's why you should always start by importing and creating an [`Accelerator`] instance in your script. ```python from accelerate import Accelerator accelerator = Accelerator() ``` The [`Accelerator`] also knows which device to move your PyTorch objects to, so it is recommended to let Accelerate handle this for you. ```diff - device = "cuda" + device = accelerator.device model.to(device) ``` ## Prepare PyTorch objects Next, you need to prepare your PyTorch objects (model, optimizer, scheduler, etc.) for distributed training. The [`~Accelerator.prepare`] method takes care of placing your model in the appropriate container (like single GPU or multi-GPU) for your training setup, adapting the optimizer and scheduler to use Accelerate's [`~optimizer.AcceleratedOptimizer`] and [`~scheduler.AcceleratedScheduler`], and creating a new dataloader that can be sharded across processes. > [!TIP] > Accelerate only prepares objects that inherit from their respective PyTorch classes such as `torch.optim.Optimizer`. The PyTorch objects are returned in the same order they're sent. ```py model, optimizer, training_dataloader, scheduler = accelerator.prepare( model, optimizer, training_dataloader, scheduler ) ``` ## Training loop Finally, remove the `to(device)` calls to the inputs and targets in the training loop because Accelerate's DataLoader classes automatically places them on the right device. You should also replace the usual `backward()` pass with Accelerate's [`~Accelerator.backward`] method which scales the gradients for you and uses the appropriate `backward()` method depending on your distributed setup (for example, DeepSpeed or Megatron). ```diff - inputs = inputs.to(device) - targets = targets.to(device) outputs = model(inputs) loss = loss_function(outputs, targets) - loss.backward() + accelerator.backward(loss) ``` Put everything together and your new Accelerate training loop should now look like this! ```python from accelerate import Accelerator accelerator = Accelerator() device = accelerator.device model, optimizer, training_dataloader, scheduler = accelerator.prepare( model, optimizer, training_dataloader, scheduler ) for batch in training_dataloader: optimizer.zero_grad() inputs, targets = batch outputs = model(inputs) loss = loss_function(outputs, targets) accelerator.backward(loss) optimizer.step() scheduler.step() ``` ## Training features Accelerate offers additional features - like gradient accumulation, gradient clipping, mixed precision training and more - you can add to your script to improve your training run. Let's explore these three features. ### Gradient accumulation Gradient accumulation enables you to train on larger batch sizes by accumulating the gradients over multiple batches before updating the weights. This can be useful for getting around memory limitations. To enable this feature in Accelerate, specify the `gradient_accumulation_steps` parameter in the [`Accelerator`] class and add the [`~Accelerator.accumulate`] context manager to your script. ```diff + accelerator = Accelerator(gradient_accumulation_steps=2) model, optimizer, training_dataloader = accelerator.prepare(model, optimizer, training_dataloader) for input, label in training_dataloader: + with accelerator.accumulate(model): predictions = model(input) loss = loss_function(predictions, label) accelerator.backward(loss) optimizer.step() scheduler.step() optimizer.zero_grad() ``` ### Gradient clipping Gradient clipping is a technique to prevent "exploding gradients", and Accelerate offers: * [`~Accelerator.clip_grad_value_`] to clip gradients to a minimum and maximum value * [`~Accelerator.clip_grad_norm_`] for normalizing gradients to a certain value ### Mixed precision Mixed precision accelerates training by using a lower precision data type like fp16 (half-precision) to calculate the gradients. For the best performance with Accelerate, the loss should be computed inside your model (like in Transformers models) because computations outside of the model are computed in full precision. Set the mixed precision type to use in the [`Accelerator`], and then use the [`~Accelerator.autocast`] context manager to automatically cast the values to the specified data type. > [!WARNING] > Accelerate enables automatic mixed precision, so [`~Accelerator.autocast`] is only needed if there are other mixed precision operations besides those performed on loss by [`~Accelerator.backward`] which already handles the scaling. ```diff + accelerator = Accelerator(mixed_precision="fp16") + with accelerator.autocast(): loss = complex_loss_function(outputs, target) ``` ## Save and load Accelerate can also save and load a *model* once training is complete or you can also save the model and optimizer *state* which could be useful for resuming training. ### Model Once all processes are complete, unwrap the model with the [`~Accelerator.unwrap_model`] method before saving it because the [`~Accelerator.prepare`] method wrapped your model into the proper interface for distributed training. If you don't unwrap the model, saving the model state dictionary also saves any potential extra layers from the larger model and you won't be able to load the weights back into your base model. You should use the [`~Accelerator.save_model`] method to unwrap and save the model state dictionary. This method can also save a model into sharded checkpoints or into the [safetensors](https://hf.co/docs/safetensors/index) format. ```py accelerator.wait_for_everyone() accelerator.save_model(model, save_directory) ``` For models from the [Transformers](https://hf.co/docs/transformers/index) library, save the model with the [`~transformers.PreTrainedModel.save_pretrained`] method so that it can be reloaded with the [`~transformers.PreTrainedModel.from_pretrained`] method. ```py from transformers import AutoModel unwrapped_model = accelerator.unwrap_model(model) unwrapped_model.save_pretrained( "path/to/my_model_directory", is_main_process=accelerator.is_main_process, save_function=accelerator.save, ) model = AutoModel.from_pretrained("path/to/my_model_directory") ``` To load your weights, use the [`~Accelerator.unwrap_model`] method to unwrap the model first before loading the weights. All model parameters are references to tensors, so this loads your weights inside `model`. ```py unwrapped_model = accelerator.unwrap_model(model) path_to_checkpoint = os.path.join(save_directory,"pytorch_model.bin") unwrapped_model.load_state_dict(torch.load(path_to_checkpoint)) ``` Set `safe_serialization=True` to save the model in the safetensor format. ```py accelerator.wait_for_everyone() accelerator.save_model(model, save_directory, max_shard_size="1GB", safe_serialization=True) ``` To load a sharded checkpoint or a safetensor formatted checkpoint, use the [`~accelerate.load_checkpoint_in_model`] method. This method allows you to load a checkpoint onto a specific device. ```py load_checkpoint_in_model(unwrapped_model, save_directory, device_map={"":device}) ``` ### State During training, you may want to save the current state of the model, optimizer, random generators, and potentially learning rate schedulers so they can be restored in the *same script*. You should add the [`~Accelerator.save_state`] and [`~Accelerator.load_state`] methods to your script to save and load states. To further customize where and how states are saved through [`~Accelerator.save_state`], use the [`~utils.ProjectConfiguration`] class. For example, if `automatic_checkpoint_naming` is enabled, each saved checkpoint is stored at `Accelerator.project_dir/checkpoints/checkpoint_{checkpoint_number}`. Any other stateful items to be stored should be registered with the [`~Accelerator.register_for_checkpointing`] method so they can be saved and loaded. Every object passed to this method to be stored must have a `load_state_dict` and `state_dict` function. > [!TIP] > If you have [`torchdata>=0.8.0`](https://github.com/pytorch/data/tree/main) installed, you can additionally pass `use_stateful_dataloader=True` into your [`~utils.DataLoaderConfiguration`]. This extends Accelerate's DataLoader classes with a `load_state_dict` and `state_dict` function, and makes it so `Accelerator.save_state` and `Accelerator.load_state` also track how far into the training dataset it has read when persisting the model. accelerate-1.14.0/docs/source/basic_tutorials/notebook.md000066400000000000000000000410731521253476100234610ustar00rootroot00000000000000 # Launching distributed training from Jupyter Notebooks This tutorial teaches you how to fine-tune a computer vision model with 🤗 Accelerate from a Jupyter Notebook on a distributed system. You will also learn how to set up a few requirements needed for ensuring your environment is configured properly, your data has been prepared properly, and finally how to launch training. This tutorial is also available as a Jupyter Notebook [here](https://github.com/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_cv_example.ipynb) ## Configuring the Environment Before any training can be performed, an Accelerate config file must exist in the system. Usually this can be done by running the following in a terminal and answering the prompts: ```bash accelerate config ``` However, if general defaults are fine and you are *not* running on a TPU, Accelerate has a utility to quickly write your device configuration into a config file via [`utils.write_basic_config`]. The following code will restart Jupyter after writing the configuration, as CUDA runtime or XPU runtime was called to perform this. CUDA and XPU can't be initialized more than once on a multi-device system. It's fine to debug in the notebook and have calls to CUDA/XPU, but in order to finally train a full cleanup and restart will need to be performed. ```python import os from accelerate.utils import write_basic_config write_basic_config() # Write a config file os._exit(00) # Restart the notebook ``` ## Preparing the Dataset and Model Next you should prepare your dataset. As mentioned earlier, great care should be taken when preparing the `DataLoaders` and model to make sure that **nothing** is put on *any* GPU. If you do, it is recommended to put that specific code into a function and call that from within the notebook launcher interface, which will be shown later. Make sure the dataset is downloaded based on the directions [here](https://github.com/huggingface/accelerate/tree/main/examples#simple-vision-example) ```python import os, re, torch, PIL import numpy as np from torch.optim.lr_scheduler import OneCycleLR from torch.utils.data import DataLoader, Dataset from torchvision.transforms import Compose, RandomResizedCrop, Resize, ToTensor from accelerate import Accelerator from accelerate.utils import set_seed from timm import create_model ``` First you need to create a function to extract the class name based on a filename: ```python import os data_dir = "../../images" fnames = os.listdir(data_dir) fname = fnames[0] print(fname) ``` ```python out beagle_32.jpg ``` In the case here, the label is `beagle`. Using regex you can extract the label from the filename: ```python import re def extract_label(fname): stem = fname.split(os.path.sep)[-1] return re.search(r"^(.*)_\d+\.jpg$", stem).groups()[0] ``` ```python extract_label(fname) ``` And you can see it properly returned the right name for our file: ```python out "beagle" ``` Next a `Dataset` class should be made to handle grabbing the image and the label: ```python class PetsDataset(Dataset): def __init__(self, file_names, image_transform=None, label_to_id=None): self.file_names = file_names self.image_transform = image_transform self.label_to_id = label_to_id def __len__(self): return len(self.file_names) def __getitem__(self, idx): fname = self.file_names[idx] raw_image = PIL.Image.open(fname) image = raw_image.convert("RGB") if self.image_transform is not None: image = self.image_transform(image) label = extract_label(fname) if self.label_to_id is not None: label = self.label_to_id[label] return {"image": image, "label": label} ``` Now to build the dataset. Outside the training function you can find and declare all the filenames and labels and use them as references inside the launched function: ```python fnames = [os.path.join("../../images", fname) for fname in fnames if fname.endswith(".jpg")] ``` Next gather all the labels: ```python all_labels = [extract_label(fname) for fname in fnames] id_to_label = list(set(all_labels)) id_to_label.sort() label_to_id = {lbl: i for i, lbl in enumerate(id_to_label)} ``` Next, you should make a `get_dataloaders` function that will return your built dataloaders for you. As mentioned earlier, if data is automatically sent to the GPU or a TPU device when building your `DataLoaders`, they must be built using this method. ```python def get_dataloaders(batch_size: int = 64): "Builds a set of dataloaders with a batch_size" random_perm = np.random.permutation(len(fnames)) cut = int(0.8 * len(fnames)) train_split = random_perm[:cut] eval_split = random_perm[cut:] # For training a simple RandomResizedCrop will be used train_tfm = Compose([RandomResizedCrop((224, 224), scale=(0.5, 1.0)), ToTensor()]) train_dataset = PetsDataset([fnames[i] for i in train_split], image_transform=train_tfm, label_to_id=label_to_id) # For evaluation a deterministic Resize will be used eval_tfm = Compose([Resize((224, 224)), ToTensor()]) eval_dataset = PetsDataset([fnames[i] for i in eval_split], image_transform=eval_tfm, label_to_id=label_to_id) # Instantiate dataloaders train_dataloader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size, num_workers=4) eval_dataloader = DataLoader(eval_dataset, shuffle=False, batch_size=batch_size * 2, num_workers=4) return train_dataloader, eval_dataloader ``` Finally, you should import the scheduler to be used later: ```python from torch.optim.lr_scheduler import CosineAnnealingLR ``` ## Writing the Training Function Now you can build the training loop. [`notebook_launcher`] works by passing in a function to call that will be ran across the distributed system. Here is a basic training loop for the animal classification problem: The code has been split up to allow for explanations on each section. A full version that can be copy and pasted will be available at the end ```python def training_loop(mixed_precision="fp16", seed: int = 42, batch_size: int = 64): set_seed(seed) accelerator = Accelerator(mixed_precision=mixed_precision) ``` First you should set the seed and create an [`Accelerator`] object as early in the training loop as possible. If training on the TPU, your training loop should take in the model as a parameter and it should be instantiated outside of the training loop function. See the [TPU best practices](../concept_guides/training_tpu) to learn why Next you should build your dataloaders and create your model: ```python train_dataloader, eval_dataloader = get_dataloaders(batch_size) model = create_model("resnet50d", pretrained=True, num_classes=len(label_to_id)) ``` You build the model here so that the seed also controls the new weight initialization As you are performing transfer learning in this example, the encoder of the model starts out frozen so the head of the model can be trained only initially: ```python for param in model.parameters(): param.requires_grad = False for param in model.get_classifier().parameters(): param.requires_grad = True ``` Normalizing the batches of images will make training a little faster: ```python mean = torch.tensor(model.default_cfg["mean"])[None, :, None, None] std = torch.tensor(model.default_cfg["std"])[None, :, None, None] ``` To make these constants available on the active device, you should set it to the Accelerator's device: ```python mean = mean.to(accelerator.device) std = std.to(accelerator.device) ``` Next instantiate the rest of the PyTorch classes used for training: ```python optimizer = torch.optim.Adam(params=model.parameters(), lr=3e-2 / 25) lr_scheduler = OneCycleLR(optimizer=optimizer, max_lr=3e-2, epochs=5, steps_per_epoch=len(train_dataloader)) ``` Before passing everything to [`~Accelerator.prepare`]. There is no specific order to remember, you just need to unpack the objects in the same order you gave them to the prepare method. ```python model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) ``` Now train the model: ```python for epoch in range(5): model.train() for batch in train_dataloader: inputs = (batch["image"] - mean) / std outputs = model(inputs) loss = torch.nn.functional.cross_entropy(outputs, batch["label"]) accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() ``` The evaluation loop will look slightly different compared to the training loop. The number of elements passed as well as the overall total accuracy of each batch will be added to two constants: ```python model.eval() accurate = 0 num_elems = 0 ``` Next you have the rest of your standard PyTorch loop: ```python for batch in eval_dataloader: inputs = (batch["image"] - mean) / std with torch.no_grad(): outputs = model(inputs) predictions = outputs.argmax(dim=-1) ``` Before finally the last major difference. When performing distributed evaluation, the predictions and labels need to be passed through [`~Accelerator.gather`] so that all of the data is available on the current device and a properly calculated metric can be achieved: ```python accurate_preds = accelerator.gather(predictions) == accelerator.gather(batch["label"]) num_elems += accurate_preds.shape[0] accurate += accurate_preds.long().sum() ``` Now you just need to calculate the actual metric for this problem, and you can print it on the main process using [`~Accelerator.print`]: ```python eval_metric = accurate.item() / num_elems accelerator.print(f"epoch {epoch}: {100 * eval_metric:.2f}") ``` A full version of this training loop is available below: ```python def training_loop(mixed_precision="fp16", seed: int = 42, batch_size: int = 64): set_seed(seed) # Initialize accelerator accelerator = Accelerator(mixed_precision=mixed_precision) # Build dataloaders train_dataloader, eval_dataloader = get_dataloaders(batch_size) # Instantiate the model (you build the model here so that the seed also controls new weight initializations) model = create_model("resnet50d", pretrained=True, num_classes=len(label_to_id)) # Freeze the base model for param in model.parameters(): param.requires_grad = False for param in model.get_classifier().parameters(): param.requires_grad = True # You can normalize the batches of images to be a bit faster mean = torch.tensor(model.default_cfg["mean"])[None, :, None, None] std = torch.tensor(model.default_cfg["std"])[None, :, None, None] # To make these constants available on the active device, set it to the accelerator device mean = mean.to(accelerator.device) std = std.to(accelerator.device) # Instantiate the optimizer optimizer = torch.optim.Adam(params=model.parameters(), lr=3e-2 / 25) # Instantiate the learning rate scheduler lr_scheduler = OneCycleLR(optimizer=optimizer, max_lr=3e-2, epochs=5, steps_per_epoch=len(train_dataloader)) # Prepare everything # There is no specific order to remember, you just need to unpack the objects in the same order you gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now you train the model for epoch in range(5): model.train() for batch in train_dataloader: inputs = (batch["image"] - mean) / std outputs = model(inputs) loss = torch.nn.functional.cross_entropy(outputs, batch["label"]) accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() model.eval() accurate = 0 num_elems = 0 for batch in eval_dataloader: inputs = (batch["image"] - mean) / std with torch.no_grad(): outputs = model(inputs) predictions = outputs.argmax(dim=-1) accurate_preds = accelerator.gather(predictions) == accelerator.gather(batch["label"]) num_elems += accurate_preds.shape[0] accurate += accurate_preds.long().sum() eval_metric = accurate.item() / num_elems # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}: {100 * eval_metric:.2f}") ``` ## Using the notebook_launcher All that's left is to use the [`notebook_launcher`]. You pass in the function, the arguments (as a tuple), and the number of processes to train on. (See the [documentation](../package_reference/launchers) for more information) ```python from accelerate import notebook_launcher ``` ```python args = ("fp16", 42, 64) notebook_launcher(training_loop, args, num_processes=2) ``` In the case of running on multiple nodes, you need to set up a Jupyter session at each node and run the launching cell at the same time. For an environment containing 2 nodes (computers) with 8 GPUs each and the main computer with an IP address of "172.31.43.8", it would look like so: ```python notebook_launcher(training_loop, args, master_addr="172.31.43.8", node_rank=0, num_nodes=2, num_processes=8) ``` And in the second Jupyter session on the other machine: Notice how the `node_rank` has changed ```python notebook_launcher(training_loop, args, master_addr="172.31.43.8", node_rank=1, num_nodes=2, num_processes=8) ``` In the case of running on the TPU, it would look like so: ```python model = create_model("resnet50d", pretrained=True, num_classes=len(label_to_id)) args = (model, "fp16", 42, 64) notebook_launcher(training_loop, args, num_processes=8) ``` To launch the training process with elasticity, enabling fault tolerance, you can use the `elastic_launch` feature provided by PyTorch. This requires setting additional parameters such as `rdzv_backend` and `max_restarts`. Here is an example of how to use `notebook_launcher` with elastic capabilities: ```python notebook_launcher( training_loop, args, num_processes=2, max_restarts=3 ) ``` As it's running it will print the progress as well as state how many devices you ran on. This tutorial was ran with two GPUs: ```python out Launching training on 2 GPUs. epoch 0: 88.12 epoch 1: 91.73 epoch 2: 92.58 epoch 3: 93.90 epoch 4: 94.71 ``` And that's it! Please note that [`notebook_launcher`] ignores the Accelerate config file, to launch based on the config use: ```bash accelerate launch ``` ## Debugging A common issue when running the `notebook_launcher` is receiving a CUDA/XPU has already been initialized issue. This usually stems from an import or prior code in the notebook that makes a call to the PyTorch `torch.cuda` or `torch.xpu` sublibrary. To help narrow down what went wrong, you can launch the `notebook_launcher` with `ACCELERATE_DEBUG_MODE=yes` in your environment and an additional check will be made when spawning that a regular process can be created and utilize CUDA/XPU without issue. (Your CUDA/XPU code can still be ran afterwards). ## Conclusion This notebook showed how to perform distributed training from inside of a Jupyter Notebook. Some key notes to remember: - Make sure to save any code that use CUDA/XPU (or CUDA/XPU imports) for the function passed to [`notebook_launcher`] - Set the `num_processes` to be the number of devices used for training (such as number of GPUs, XPUs, CPUs, TPUs, etc) - If using the TPU, declare your model outside the training loop function accelerate-1.14.0/docs/source/basic_tutorials/overview.md000066400000000000000000000023551521253476100235070ustar00rootroot00000000000000 # Overview Welcome to the Accelerate tutorials! These introductory guides will help catch you up to speed on working with Accelerate. You'll learn how to modify your code to have it work with the API seamlessly, how to launch your script properly, and more! These tutorials assume some basic knowledge of Python and familiarity with the PyTorch framework. If you have any questions about Accelerate, feel free to join and ask the community on our [forum](https://discuss.huggingface.co/c/accelerate/18).accelerate-1.14.0/docs/source/basic_tutorials/tpu.md000066400000000000000000000047251521253476100224540ustar00rootroot00000000000000 # TPU training A [TPU (Tensor Processing Unit)](https://cloud.google.com/tpu/docs/intro-to-tpu) is a type of hardware specifically designed for training models efficiently. Accelerate supports TPU training, but there are a few things you should be aware of, namely graph compilation. This tutorial briefly discusses compilation, and for more details, take a look at the [Training on TPUs with Accelerate](../concept_guides/training_tpu) guide. ## Compilation A TPU creates a graph of all the operations in the training step such as the forward pass, backward pass and optimizer step. This is why the first training step always takes a while because building and compiling this graph takes time. But once compilation is complete, it is cached and all subsequent steps are much faster. The key is to avoid compiling your code again or else training is super slow. This means all your operations must be exactly the same: * all tensors in your batches must have the same length (for example, no dynamic padding for NLP tasks) * your code must be static (for example, no layers with for loops that have different lengths depending on the input such as a LSTM) ## Weight tying A common language model design is to tie the weights of the embedding and softmax layers. However, moving the model to a TPU (either yourself or passing it to the [`~Accelerator.prepare`] method) breaks the weight tying and you'll need to retie the weights. To add special behavior (like weight tying) in your script for TPUs, set [`~Accelerator.distributed_type`] to `DistributedType.TPU` first. Then you can use the [`~transformers.PreTrainedModel.tie_weights`] method to tie the weights. ```py if accelerator.distributed_type == DistributedType.TPU: model.tie_weights() ``` accelerate-1.14.0/docs/source/basic_tutorials/troubleshooting.md000066400000000000000000000252541521253476100250730ustar00rootroot00000000000000 # Troubleshoot This guide provides solutions to some issues you might encounter when using Accelerate. Not all errors are covered because Accelerate is an active library that is continuously evolving and there are many different use cases and distributed training setups. If the solutions described here don't help with your specific error, please take a look at the [Ask for help](#ask-for-help) section to learn where and how to get help. ## Logging Logging can help you identify where an error is coming from. In a distributed setup with multiple processes, logging can be a challenge, but Accelerate provides the [`~accelerate.logging`] utility to ensure logs are synchronized. To troubleshoot an issue, use [`~accelerate.logging`] instead of the standard Python [`logging`](https://docs.python.org/3/library/logging.html#module-logging) module. Set the verbosity level (`INFO`, `DEBUG`, `WARNING`, `ERROR`, `CRITICAL`) with the `log_level` parameter, and then you can either: 1. Export the `log_level` as the `ACCELERATE_LOG_LEVEL` environment variable. 2. Pass the `log_level` directly to `get_logger`. For example, to set `log_level="INFO"`: ```py from accelerate.logging import get_logger logger = get_logger(__name__, log_level="DEBUG") ``` By default, the log is called on main processes only. To call it on all processes, pass `main_process_only=False`. If a log should be called on all processes and in order, also pass `in_order=True`. ```py from accelerate.logging import get_logger logger = get_logger(__name__, log_level="DEBUG") # log all processes logger.debug("thing_to_log", main_process_only=False) # log all processes in order logger.debug("thing_to_log", main_process_only=False, in_order=True) ``` ## Hanging code and timeout errors There can be many reasons why your code is hanging. Let's take a look at how to solve some of the most common issues that can cause your code to hang. ### Mismatched tensor shapes Mismatched tensor shapes is a common issue that can cause your code to hang for a significant amount of time on a distributed setup. When running scripts in a distributed setup, functions such as [`Accelerator.gather`] and [`Accelerator.reduce`] are necessary to grab tensors across devices to collectively perform operations on them. These (and other) functions rely on `torch.distributed` to perform a `gather` operation, which requires tensors to have the **exact same shape** across all processes. When the tensor shapes don't match, your code hangs and you'll eventually hit a timeout exception. You can use Accelerate's operational debug mode to immediately catch this issue. We recommend enabling this mode during the `accelerate config` setup, but you can also enable it from the CLI, as an environment variable, or by manually editing the `config.yaml` file. ```bash accelerate launch --debug {my_script.py} --arg1 --arg2 ``` If enabling debug mode as an environment variable, you don't need to call `accelerate launch`. ```bash ACCELERATE_DEBUG_MODE="1" torchrun {my_script.py} --arg1 --arg2 ``` Add `debug: true` to your `config.yaml` file. ```yaml compute_environment: LOCAL_MACHINE debug: true ``` Once you enable debug mode, you should get a traceback that points to the tensor shape mismatch issue. ```py Traceback (most recent call last): File "/home/zach_mueller_huggingface_co/test.py", line 18, in main() File "/home/zach_mueller_huggingface_co/test.py", line 15, in main broadcast_tensor = broadcast(tensor) File "/home/zach_mueller_huggingface_co/accelerate/src/accelerate/utils/operations.py", line 303, in wrapper accelerate.utils.operations.DistributedOperationException: Cannot apply desired operation due to shape mismatches. All shapes across devices must be valid. Operation: `accelerate.utils.operations.broadcast` Input shapes: - Process 0: [1, 5] - Process 1: [1, 2, 5] ``` ### Early stopping For early stopping in distributed training, if each process has a specific stopping condition (e.g. validation loss), it may not be synchronized across all processes. As a result, a break can happen on process 0 but not on process 1 which will cause your code to hang indefinitely until a timeout occurs. If you have early stopping conditionals, use the `set_trigger` and `check_trigger` methods to make sure all the processes are ended correctly. ```py # Assume `should_do_breakpoint` is a custom-defined function that returns a conditional, # and that conditional might be true only on process 1 if should_do_breakpoint(loss): accelerator.set_trigger() # Later in the training script when we need to check for the breakpoint if accelerator.check_trigger(): break ``` ### Low kernel versions on Linux On Linux with kernel version < 5.5, hanging processes have been reported. To avoid this problem, upgrade your system to a later kernel version. ### MPI If your distributed CPU training job using MPI is hanging, ensure that you have [passwordless SSH](https://www.open-mpi.org/faq/?category=rsh#ssh-keys) setup (using keys) between the nodes. This means that for all nodes in your hostfile, you should be able to SSH from one node to another without being prompted for a password. Next, try to run the `mpirun` command as a sanity check. For example, the command below should print out the hostnames for each of the nodes. ```bash mpirun -f hostfile -n {number of nodes} -ppn 1 hostname ``` ## Out-of-Memory One of the most frustrating errors when it comes to running training scripts is hitting "Out-of-Memory" on devices like CUDA, XPU or CPU. The entire script needs to be restarted and any progress is lost. To address this problem, Accelerate provides the [`find_executable_batch_size`] utility that is heavily based on [toma](https://github.com/BlackHC/toma). This utility retries code that fails due to OOM (out-of-memory) conditions and automatically lowers batch sizes. For each OOM condition, the algorithm decreases the batch size by half and retries the code until it succeeds. To use [`find_executable_batch_size`], restructure your training function to include an inner function with `find_executable_batch_size` and build your dataloaders inside it. At a minimum, this only takes 4 new lines of code. The inner function **must** take batch size as the first parameter, but we do not pass one to it when called. The wrapper will handle this for you. Any object (models, optimizers) that consumes device memory and is passed to the [`Accelerator`] also **must** be declared inside the inner function. ```diff def training_function(args): accelerator = Accelerator() + @find_executable_batch_size(starting_batch_size=args.batch_size) + def inner_training_loop(batch_size): + nonlocal accelerator # Ensure they can be used in our context + accelerator.free_memory() # Free all lingering references model = get_model() model.to(accelerator.device) optimizer = get_optimizer() train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) lr_scheduler = get_scheduler( optimizer, num_training_steps=len(train_dataloader)*num_epochs ) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) train(model, optimizer, train_dataloader, lr_scheduler) validate(model, eval_dataloader) + inner_training_loop() ``` ## Non-reproducible results between device setups If you changed the device setup and observe different model performance, it is likely you didn't update your script when moving from one setup to another. Even if you're using the same script with the same batch size, the results will still be different on a TPU, multi-GPU, and single GPU. For example, if you were training on a single GPU with a batch size of 16 and you move to a dual GPU setup, you need to change the batch size to 8 to have the same effective batch size. This is because when training with Accelerate, the batch size passed to the dataloader is the **batch size per GPU**. To make sure you can reproduce the results between the setups, make sure to use the same seed, adjust the batch size accordingly, and consider scaling the learning rate. For more details and a quick reference for batch sizes, check out the [Comparing performance between different device setups](../concept_guides/performance) guide. ## Performance issues on different GPUs If your multi-GPU setup consists of different GPUs, you may encounter some performance issues: - There may be an imbalance in GPU memory between the GPUs. In this case, the GPU with the smaller memory will limit the batch size or the size of the model that can be loaded onto the GPUs. - If you are using GPUs with different performance profiles, the performance will be driven by the slowest GPU you are using because the other GPUs will have to wait for it to complete its workload. Vastly different GPUs within the same setup can lead to performance bottlenecks. ## Ask for help If none of the solutions and advice here helped resolve your issue, you can always reach out to the community and Accelerate team for help. - Ask for help on the Hugging Face forums by posting your question in the [Accelerate category](https://discuss.huggingface.co/c/accelerate/18). Make sure to write a descriptive post with relevant context about your setup and reproducible code to maximize the likelihood that your problem is solved! - Post a question on [Discord](http://hf.co/join/discord), and let the team and the community help you. - Create an Issue on the Accelerate [GitHub repository](https://github.com/huggingface/accelerate/issues) if you think you've found a bug related to the library. Include context regarding the bug and details about your distributed setup to help us better figure out what's wrong and how we can fix it. accelerate-1.14.0/docs/source/concept_guides/000077500000000000000000000000001521253476100211165ustar00rootroot00000000000000accelerate-1.14.0/docs/source/concept_guides/big_model_inference.md000066400000000000000000000412771521253476100254120ustar00rootroot00000000000000 # Loading big models into memory When loading a pre-trained model in PyTorch, the usual workflow looks like this: ```py import torch my_model = ModelClass(...) state_dict = torch.load(checkpoint_file) my_model.load_state_dict(state_dict) ``` In plain English, those steps are: 1. Create the model with randomly initialized weights 2. Load the model weights (in a dictionary usually called a state dict) from the disk 3. Load those weights inside the model While this works very well for regularly sized models, this workflow has some clear limitations when we deal with a huge model: in step 1, we load a full version of the model in RAM, and spend some time randomly initializing the weights (which will be discarded in step 3). In step 2, we load another full version of the model in RAM, with the pre-trained weights. If you're loading a model with 6 billion parameters, this means you will need 24GB of RAM for each copy of the model, so 48GB in total (half of it to load the model in FP16). This API is quite new and still in its experimental stage. While we strive to provide a stable API, it's possible some small parts of the public API will change in the future. ## How the Process Works: A Quick Overview ## How the Process Works: Working with Code ### Instantiating an empty model The first tool Accelerate introduces to help with big models is a context manager [`init_empty_weights`] that helps you initialize a model without using any RAM so that step 1 can be done on models of any size. Here is how it works: ```py from accelerate import init_empty_weights with init_empty_weights(): my_model = ModelClass(...) ``` For instance: ```py with init_empty_weights(): model = nn.Sequential(*[nn.Linear(10000, 10000) for _ in range(1000)]) ``` initializes an empty model with a bit more than 100B parameters. Behind the scenes, this relies on the meta device introduced in PyTorch 1.9. During the initialization under the context manager, each time a parameter is created, it is instantly moved to that device. You can't move a model initialized like this on CPU or another device directly, since it doesn't have any data. It's also very likely that a forward pass with that empty model will fail, as not all operations are supported on the meta device. ### Sharded checkpoints It's possible your model is so big that even a single copy won't fit in RAM. That doesn't mean it can't be loaded: if you have one or several GPUs, this is more memory available to store your model. In this case, it's better if your checkpoint is split into several smaller files that we call checkpoint shards. Accelerate will handle sharded checkpoints as long as you follow the following format: your checkpoint should be in a folder, with several files containing the partial state dicts, and there should be an index in the JSON format that contains a dictionary mapping parameter names to the file containing their weights. You can easily shard your model with [`~Accelerator.save_model`]. For instance, we could have a folder containing: ```bash first_state_dict.bin index.json second_state_dict.bin ``` with index.json being the following file: ``` { "linear1.weight": "first_state_dict.bin", "linear1.bias": "first_state_dict.bin", "linear2.weight": "second_state_dict.bin", "linear2.bias": "second_state_dict.bin" } ``` and `first_state_dict.bin` containing the weights for `"linear1.weight"` and `"linear1.bias"`, `second_state_dict.bin` the ones for `"linear2.weight"` and `"linear2.bias"` ### Loading weights The second tool Accelerate introduces is a function [`load_checkpoint_and_dispatch`], that will allow you to load a checkpoint inside your empty model. This supports full checkpoints (a single file containing the whole state dict) as well as sharded checkpoints. It will also automatically dispatch those weights across the devices you have available (GPUs, CPU RAM), so if you are loading a sharded checkpoint, the maximum RAM usage will be the size of the biggest shard. If you want to use big model inference with Transformers models, check out this [documentation](https://huggingface.co/docs/transformers/main/en/main_classes/model#large-model-loading). Here is how we can use this to load the [GPT2-1.5B](https://huggingface.co/marcsun13/gpt2-xl-linear-sharded) model. Let's download the sharded version of this model. ```bash pip install huggingface_hub ``` ```py from huggingface_hub import snapshot_download checkpoint = "marcsun13/gpt2-xl-linear-sharded" weights_location = snapshot_download(repo_id=checkpoint) ``` In order to initialize the model, we will use the library minGPT. ```bash git clone https://github.com/karpathy/minGPT.git pip install minGPT/ ``` ```py from accelerate import init_empty_weights from mingpt.model import GPT model_config = GPT.get_default_config() model_config.model_type = 'gpt2-xl' model_config.vocab_size = 50257 model_config.block_size = 1024 with init_empty_weights(): model = GPT(model_config) ``` Then, load the checkpoint we just downloaded with: ```py from accelerate import load_checkpoint_and_dispatch model = load_checkpoint_and_dispatch( model, checkpoint=weights_location, device_map="auto", no_split_module_classes=['Block'] ) ``` By passing `device_map="auto"`, we tell Accelerate to determine automatically where to put each layer of the model depending on the available resources: - first, we use the maximum space available on the GPU(s) - if we still need space, we store the remaining weights on the CPU - if there is not enough RAM, we store the remaining weights on the hard drive as memory-mapped tensors #### `no_split_module_classes` This parameter will indicate that some of the modules with the name `"Block"` should not be split across different devices. You should set here all blocks that include a residual connection of some kind. #### The `device_map` You can see the `device_map` that Accelerate picked by accessing the `hf_device_map` attribute of your model: ```py model.hf_device_map ``` ```python out {'transformer.wte': 0, 'transformer.wpe': 0, 'transformer.drop': 0, 'transformer.h.0': 0, ... 'transformer.h.21': 0, 'transformer.h.22': 1, 'transformer.h.23': 1, 'transformer.h.24': 1, ... 'transformer.h.47': 1, 'transformer.ln_f': 1, 'lm_head': 1} ``` It's fully possible to create your own device map for the layers to use as well, specifying the GPU device to use (a number), `"cpu"`, or `"disk"` and pass this in: ```python device_map = { "transformer.wte": "cpu", "transformer.wpe": 0, "transformer.drop": "cpu", "transformer.h.0": "disk" } model = load_checkpoint_and_dispatch( model, checkpoint=weights_location, device_map=device_map ) ``` ### Run the model Now that we have done this, our model lies across several devices, and maybe the hard drive. But it can still be used as a regular PyTorch model: ```py from mingpt.bpe import BPETokenizer tokenizer = BPETokenizer() inputs = tokenizer("Hello, my name is").to(0) outputs = model.generate(x1, max_new_tokens=10, do_sample=False)[0] tokenizer.decode(outputs.cpu().squeeze()) ``` Behind the scenes, Accelerate added hooks to the model, so that: - at each layer, the inputs are put on the right device (so even if your model is spread across several GPUs, it works) - for the weights offloaded on the CPU, they are put on a GPU just before the forward pass and cleaned up just after - for the weights offloaded on the hard drive, they are loaded in RAM then put on a GPU just before the forward pass and cleaned up just after This way, your model can run for inference even if it doesn't fit on one of the GPUs or the CPU RAM! This only supports the inference of your model, not training. Most of the computation happens behind `torch.no_grad()` context managers to avoid spending some GPU memory with intermediate activations. ### Designing a device map You can let Accelerate handle the device map computation by setting `device_map` to one of the supported options (`"auto"`, `"balanced"`, `"balanced_low_0"`, `"sequential"`) or create one yourself if you want more control over where each layer should go. You can derive all sizes of the model (and thus compute a `device_map`) on a model that is on the meta device. All the options will produce the same result when you don't have enough GPU memory to accommodate the whole model (which is to fit everything that can on the GPU, then offload weights on the CPU or even on the disk if there is not enough RAM). When you have more GPU memory available than the model size, here is the difference between each option: - `"auto"` and `"balanced"` evenly split the model on all available GPUs, making it possible for you to use a batch size greater than 1. - `"balanced_low_0"` evenly splits the model on all GPUs except the first one, and only puts on GPU 0 what does not fit on the others. This option is great when you need to use GPU 0 for some processing of the outputs, like when using the `generate` function for Transformers models - `"sequential"` will fit what it can on GPU 0, then move on GPU 1 and so forth (so won't use the last GPUs if it doesn't need to). The options `"auto"` and `"balanced"` produce the same results for now, but the behavior of `"auto"` might change in the future if we find a strategy that makes more sense, while `"balanced"` will stay stable. First note that you can limit the memory used on each GPU by using the `max_memory` argument (available in [`infer_auto_device_map`] and in all functions using it). When setting `max_memory`, you should pass along a dictionary containing the GPU identifiers (for instance `0`, `1` etc.) and the `"cpu"` key for the maximum RAM you want to use for CPU offload. The values can either be an integer (in bytes) or a string representing a number with its unit, such as `"10GiB"` or `"10GB"`. Here is an example where we don't want to use more than 10GiB on each of the two GPUs and no more than 30GiB of CPU RAM for the model weights: ```python from accelerate import infer_auto_device_map device_map = infer_auto_device_map(my_model, max_memory={0: "10GiB", 1: "10GiB", "cpu": "30GiB"}) ``` When a first allocation happens in PyTorch, it loads CUDA kernels which take about 1-2GB of memory depending on the GPU. Therefore you always have less usable memory than the actual size of the GPU. To see how much memory is actually used do `torch.ones(1).cuda()` and look at the memory usage. Therefore when you create memory maps with `max_memory` make sure to adjust the available memory accordingly to avoid out-of-memory errors. Additionally, if you do some additional operations with your outputs without placing them back on the CPU (for instance inside the `generate` method of Transformers) and if you placed your inputs on a GPU, that GPU will consume more memory than the others (Accelerate always place the output back to the device of the input). Therefore if you would like to optimize the maximum batch size and you have many GPUs, give the first GPU less memory. For example, with BLOOM-176B on 8x80 A100 setup, the close-to-ideal map is: ```python max_memory = {0: "30GIB", 1: "46GIB", 2: "46GIB", 3: "46GIB", 4: "46GIB", 5: "46GIB", 6: "46GIB", 7: "46GIB"} ``` as you can see we gave the remaining 7 GPUs ~50% more memory than GPU 0. If you opt to fully design the `device_map` yourself, it should be a dictionary with keys being module names of your model and values being a valid device identifier (for instance an integer for the GPUs) or `"cpu"` for CPU offload, `"disk"` for disk offload. The keys need to cover the whole model, you can then define your device map as you wish: for instance, if your model has two blocks (let's say `block1` and `block2`) which each contain three linear layers (let's say `linear1`, `linear2` and `linear3`), a valid device map can be: ```python device_map = {"block1": 0, "block2": 1} ``` another one that is valid could be: ```python device_map = {"block1": 0, "block2.linear1": 0, "block2.linear2": 1, "block2.linear3": 1} ``` On the other hand, this one is not valid as it does not cover every parameter of the model: ```python device_map = {"block1": 0, "block2.linear1": 1, "block2.linear2": 1} ``` To be the most efficient, make sure your device map puts the parameters on the GPUs in a sequential manner (e.g. don't put one of the first weights on GPU 0, then weights on GPU 1 and the last weight back to GPU 0) to avoid making many transfers of data between the GPUs. ## CPU offload only If you want to offload your model on CPU, you can use [`cpu_offload`]. As a result, all parameters of the model will be offloaded and only one copy of the state dict of the model will be kept. During the forward pass, parameters will be extracted from that state dict and put on the execution device and passed as they are needed, then offloaded again. ```python cpu_offload(model, execution_device) ``` You can also use [`cpu_offload_with_hook`]. This function will offloads a model on the CPU and puts it back to an execution device when executed. The difference with [`cpu_offload`] is that the model stays on the execution device after the forward and is only offloaded again when the `offload` method of the returned `hook` is called. Furthermore, [`cpu_offload_with_hook`] is more performant but less memory saving. It is useful for pipelines running a model in a loop: ```python model_1, hook_1 = cpu_offload_with_hook(model_1, execution_device) model_2, hook_2 = cpu_offload_with_hook(model_2, execution_device, prev_module_hook=hook_1) model_3, hook_3 = cpu_offload_with_hook(model_3, execution_device, prev_module_hook=hook_2) hid_1 = model_1(input) for i in range(50): # model1 is offloaded on the CPU at the first iteration, model 2 stays on the GPU for this whole loop. hid_2 = model_2(hid_1) # model2 is offloaded to the CPU just before this forward. hid_3 = model_3(hid_3) # For model3, you need to manually call the hook offload method. hook_3.offload() ``` ## Disk offload only To perform disk offload, you can use [`disk_offload`]. As a result, all parameters of the model will be offloaded as memory-mapped array in a given folder. During the forward pass, parameters will be accessed from that folder and put on the execution device passed as they are needed, then offloaded again. ```python disk_offload(model, offload_dir, execution_device) ``` ## Limits and further development We are aware of the current limitations in the API: - [`infer_auto_device_map`] (or `device_map="auto"` in [`load_checkpoint_and_dispatch`]) tries to maximize GPU and CPU RAM it sees available when you execute it. While PyTorch is very good at managing GPU RAM efficiently (and giving it back when not needed), it's not entirely true with Python and CPU RAM. Therefore, an automatically computed device map might be too intense on the CPU. Move a few modules to the disk device if you get crashes due to a lack of RAM. - [`infer_auto_device_map`] (or `device_map="auto"` in [`load_checkpoint_and_dispatch`]) attributes devices sequentially (to avoid moving things back and forth) so if your first layer is bigger than the size of the GPU you have, it will end up with everything on the CPU/Disk. - [`load_checkpoint_and_dispatch`] and [`load_checkpoint_in_model`] do not perform any check on the correctness of your state dict compared to your model at the moment (this will be fixed in a future version), so you may get some weird errors if trying to load a checkpoint with mismatched or missing keys. - The model parallelism used when your model is split on several GPUs is naive and not optimized, meaning that only one GPU works at a given time and the other sits idle. - When weights are offloaded on the CPU/hard drive, there is no pre-fetching (yet, we will work on this for future versions) which means the weights are put on the GPU when they are needed and not before. - Hard-drive offloading might be very slow if the hardware you run on does not have fast communication between disk and CPU (like NVMes). accelerate-1.14.0/docs/source/concept_guides/context_parallelism.md000066400000000000000000000366611521253476100255250ustar00rootroot00000000000000 # Context Parallel in 🤗`accelerate` This guide will cover basics of using context parallelism in 🤗`accelerate`, for the more curious readers, we will also cover some technicalities in the later sections. See also the very related [Guide to Sequence Parallelism](./sequence_parallelism.md). ## Why context parallelism? With the advent of large language models, and recently reasoning models, the sequence length has been growing rapidly. This, combined with quadratic memory complexity of attention, has led to a need for more efficient ways to train models with long sequences. With sequence length of 128k, the memory requirement of the attention matrix is `128k * 128k * 2 bytes * num_heads = ~32 GB * num_heads` for `bf16` precision, given vanilla attention implementation. Granted, with usage of `flash attention` or `SDPA` which do not materialize these attention weights, this decreases drastically, but the growth in memory requirements is still considerable. Context parallelism allows us to shard the inputs to the attention computation along the sequence dimension and compute the attention in parallel on multiple GPUs. With this, we can train models with long sequences, scaling potentially to 1M+ sequence length. ## How to use context parallelism? ```diff from accelerate.utils import ParallelismConfig, TorchContextParallelConfig + cp_config = TorchContextParallelConfig( + cp_comm_strategy="alltoall", # no need to use cp_config at all, if you want to use the default "allgather" + ) + parallelism_config = ParallelismConfig( + cp_size=8, + cp_handler=cp_config, # or just cp_size=8, if you want to use the default "allgather" + ) accelerator = Accelerator( ..., parallelism_config=parallelism_config, ) ``` As with any other feature in 🤗`accelerate`, you can enable context parallelism also by passing the corresponding flags to `accelerate launch`. In this case, it's no different: ```bash accelerate launch --parallelism-config-cp-size 8 --parallelism-config-cp-comm-strategy [allgather|alltoall] ... ``` > [!Tip] > You can also set the `cp_size` and `cp_comm_strategy` in the `accelerate config` command, which will save them in your `accelerate` configuration file, so you don't have to pass them every time you launch your script. > [!Tip] > Context parallelism is compatible with other parallelism strategies, such as data parallelism, tensor parallelism and FSDP2. > You can simply combine them by setting your parallelism sizes to the desired values, e.g. `--parallelism-config-dp-size 8 --parallelism-config-tp-size 2 --parallelism-config-cp-size 8`. Or you can use the `ParallelismConfig` class to set them programmatically. > [!Warning] > Context parallelism is tightly coupled with `FSDP2`, which you can learn more about in the [FSDP2 introduction](fsdp1_vs_fsdp2.md). Meaning, context parallelism only works if you use `FullyShardedDataParallelPlugin` or `--use-fsdp` with version set to 2 to your > program. If no `FSDP2` is used, error will be raised. > [!Warning] > Context parallelism works only with [SDPA](https://docs.pytorch.org/docs/stable/generated/torch.nn.functional.scaled_dot_product_attention.html) and only with no mask or causal mask. We can't properly detect this for you, so it's your responsibility to ensure that you are using `SDPA` with no mask or causal mask. If you use any other attention implementation, it will raise an error. After enabling context parallelism with the methods mentioned above, you can then apply it to your training loop. We provide a thin wrapper around [`torch.distributed.tensor.experimental.context_parallel`](https://docs.pytorch.org/docs/stable/distributed.tensor.html#torch.distributed.tensor.experimental.context_parallel) that you can use in your training loop, that abstracts some of the complexity of using it (more on this later). To minimize the changes you have to do in your training loop, we provide a context manager that is a `noop` if context parallelism is not enabled, and applies the context parallelism if it is enabled. This way, you can use it in your training loop without changing any code based on your parallelism configuration. You can use it as follows: ```python for batch in dataloader: with accelerator.maybe_context_parallel( buffers=[batch["input_ids"], batch["attention_mask"]], buffer_seq_dims=[1, 1], no_restore_buffers={batch["input_ids"], batch["labels"]}, ): outputs = model(**batch) ... ``` > [!Warning] > This context manager has to be recreated with each training step, as shown in the example above. It's crucial to do so. This can scale your context size to 1M+ sequence length potentially. Below, we showcase speed and memory usage of context parallelism for up-to 256k context size. We can see that when we double the context size and number of GPUs, we can achieve consistent memory usage, potentially enabling endless context length scaling.

context parallelism memory usage
Figure 1: Memory usage and speed of context parallelism for up-to 256k context size.

> [!Tip] > These examples were created with a script you can find [in the examples folder](https://github.com/huggingface/accelerate/blob/main/examples/fsdp2/nd_parallel.py). To run the example on 8 H100 GPUs (128k sequence length), you can use the following command: > ```bash > accelerate launch --use-fsdp --fsdp-activation-checkpointing=TRUE examples/fsdp2/nd_parallel.py --cp-size=8 --sequence-length=128000 > ``` ## Accelerate's interface The context manager takes a few arguments, that are used to configure the context parallelism. - `buffers`: This is a list of tensors that are to be sharded across the sequence dimension. These tensors are usually input ids, labels and attention mask. - `buffer_seq_dims`: This is a list of integers, that specify the sequence dimension of the buffers, in the order of the `buffers` list. If you pass `buffers=[input_ids, shift_labels]` with both having shape `[batch_size, sequence_length]`, you would pass `buffer_seq_dims=[1, 1]`. as the sequence dimension is the second dimension of the tensors. This is required for correct computation of the model outputs. - `no_restore_buffers`: The implementation of context parallelism modifies the buffers in-place, converting them to `torch.distributed.tensor.Dtensor`s. After the context manager exits, a communication kernel would need to be launched to restore the buffers to their original state (usually all-gather). This takes some time, so it is recommended to pass the same tensors as in the `buffers` argument, to avoid unnecessary communication, unless you are sure that you need to use the buffers after the context manager exits. > [!Warning] > Context parallelism is not compatible with `labels` that are a copy of `input_ids`, which models from 🤗 transformers can shift to enable causal language modeling themselves. > Imagine this case: > labels = [l1, l2, l3, l4, ... li] > if we apply context parallelism, each rank would end up with a part of labels, such as this: > labels_rank_0 = [l1, l2], labels_rank_1 = [l3, l4], ... > after transformers modelling code shifts the labels, it would end up with: > labels_rank_0 = [l2, PAD], labels_rank_1 = [l3, PAD], ... > where `PAD` is a padding token. This would result in incorrect loss computation, as the labels are not aligned with the inputs anymore. > Because of this, you need to manually shift the labels before passing them in the model ## Configurable options Accelerate provides only a single option to configure context parallelism (except for `cp_size`) - `cp_comm_strategy`: The rotation method to use for the shards. We strongly recommend keeping this as `"allgather"`, as it's very likely it will outperform `"alltoall"` in most cases. Context parallel size is rather self-explanatory, it's the number of ranks across which the inputs are to be-sharded. Context parallel shard rotation defines how the shards of the inputs are rotated across ranks. We'll cover the 2 options in more detail in the next section. You can see an end-to-end example in the [ND parallel example](https://github.com/huggingface/accelerate/blob/main/examples/fsdp2/nd_parallel.py) file, where you can train an 8B model with up-to 128k context length on a single 8xH100 node. Using multi-node training, you can scale this to 1M+ sequence length on multiple GPUs. You can also seamlessly combine it with other parallelism strategies to fit your needs. ## Technical details > [!Tip] > This section is fairly technical, so if you don't need to learn the internals of context parallelism, you can skip it and start building 🚀 We're going to be using word `shard` extensively in the following sections, so let's define it first. If we call tensor `sharded` across `Dth` dimension, across `N` ranks, we mean that this tensor is split into `N` parts, where each part of the tensor has shape `[..., D//N, ...]`. ## So how does it work? Context parallelism works on sharding the `Q, K and V` matrices across the sequence dimension. Each rank has its assigned shard of `Q`, let's call it `Q_i`. This matrix stays only on this rank, during the whole computation. Similarly, each rank has its own shard of `K` and `V`, let's call them `K_i` and `V_i`. Then, each rank calculates attention with its own shard of `Q_i`, `K_i` and `V_i`, let's call it `attn_i`. During this computation, a communication kernel is launched to gather the `Ks` and `Vs` from all other ranks. What communication primitive is used, depends on the `context_parallel_shard_rotation` option. This way, each rank gets to calculate local attention, first with `Q_i`, `K_i` and `V_i`, then with `K_j` and `V_j` from all other ranks. As each rank holds `Q, K and V` matrices that are sharded across the sequence dimension, the resulting matrices are smaller and can fit on a single GPU. We can formalize this in the following pseudocode: ```python comm_kernel = {"allgather": allgather, "alltoall": alltoall}[context_parallel_shard_rotation] Qi, Ki, Vi = shard(Q, K, V, seq_dim) attn[i] = attn(Qi, Ki, Vi) for j in range(context_parallel_size): Kj, Vj = comm_kernel() attn[j] = attn(Qi, Kj, Vj) # [batch, num_heads, seq_len // context_parallel_size, head_dim] final_attn = combine(attn) ``` ## all-to-all vs all-gather ### all-gather So what's the difference between all-to-all and all-gather? With all-gather, the communication is very simple. After (well, before, as it usually takes longer) we compute the local attention `attn_i` we launch an all-gather to gather all other `Ks` and `Vs` from all other ranks. As this communication is done, each rank has all the `Ks` and `Vs` from all other ranks, and can compute the attention with them sequentially. In ideal scenario, all-gather finishes in the exact moment as the calculation of `attn_i` is done. However, this never happens in practice, so the ideal real overlap is achieved when the full `attn_i` is overlapped with a part of the communication, then to start the computation with `K_j` and `V_j`, we wait for the all-gather to finish. ### all-to-all All-to-all, or sometimes called `ring-rotation` utilizes a ring-like communication pattern. After concluding `attn_i` computation, an all-to-all is launched to send `K_i` and `V_i` to the neighbouring ranks. We then repeat this `context_parallel_size-1` times, so that each rank sees all the shards of `K` and `V` from all other ranks once. In ideal scenario, we prefetch shards `K_i+1` and `V_i+1` from the neighbouring rank and this communication is exactly overlapped with computation of our current `attn_i`. Again, realistically, this perfect overlap doesn't ever happen. Given the nature of this approach, if we don't achieve perfect overlap, the penalty is way larger than with all-gather. ## How to choose the right rotation method? In theory, all-to-all should be the better choice. Though in practice, it rarely is. Therefore, we default to all-gather, as it's more likely to achieve better performance. Extensive [benchmarks](https://discuss.pytorch.org/t/distributed-w-torchtitan-breaking-barriers-training-long-context-llms-with-1m-sequence-length-in-pytorch-using-context-parallel/215082) from the `torchtitan` team also show that all-to-all rarely outperforms all-gather. Though, we still provide both options, as you might find one to be better for your use case. You can directly see this issue in the profiler output in the image below:

all-to-all profiler output
Figure 1: In red you can see the idle time, while we wait for the all-to-all kernel to finish. Highlighted in the first blue bar, you can see that it takes ~250us to finish, which is repeated N-1 times for each attention call, where N is the context parallel size.

## Why only FSDP2? We only support context parallelism with `FSDP2`, as we create a joint mesh of `context_parallel_size` and `dp_shard_size` to utilize its full potential. How it works is: we shard the model across the joint mesh of size `cp_size*dp_shard_size`, which maximizes the memory savings. This is a "free lunch" of sorts, as `FSDP` communication is fully overlapped with the computation of attention, as shown in the images below.

why FSDP2+CP
Figure 2: In blue rectangles (Stream 23), you can see that the pre-fetch of `FSDP` shard is fully overlapped with the computation of attention (Stream 7), while in red rectangles (Stream 24), you can see that the all-gather kernel results in a bubble of idle time, in which our compute stream (7) is idle.

In the figure above, you can also note the difference between all-to-all and all-gather. While in all-to-all (Figure 1), we launch a communication kernel N-1 times for each attention call, in all-gather (Figure 2), we launch a communication kernel only once. This results in a bigger bubble, but it only happens once per attention call, while in all-to-all, it happens N-1 times. ## Data dispatching in joint mesh We make sure to dispatch the same batch of data to the whole `cp` subgroup, so that the results are correct. (Meaning each rank in `cp` subgroup gets the same batch of data.) However, we also dispatch different batches to each rank of `dp_shard` group. Imagine it like this: ``` # 8 GPUS, --dp_shard_size 4, --cp_size 2 # mesh = [[0, 1], [2, 3], [4, 5], [6, 7]] # model is sharded across the whole mesh (each GPU holds 1/8 of the model) # GPUs 0,1 = batch 0 # GPUs 2,3 = batch 1 ... and so on. ``` accelerate-1.14.0/docs/source/concept_guides/deferring_execution.md000066400000000000000000000112311521253476100254660ustar00rootroot00000000000000 # Executing and deferring jobs When you run your usual script, instructions are executed in order. Using Accelerate to deploy your script on several GPUs at the same time introduces a complication: while each process executes all instructions in order, some may be faster than others. You might need to wait for all processes to have reached a certain point before executing a given instruction. For instance, you shouldn't save a model before being sure every process is done with training, and you wouldn't want to continue training before all the model weights have been loaded in. To do this, just write the following line in your code: ``` accelerator.wait_for_everyone() ``` This instruction will block all the processes that arrive first until all the other processes have reached that point (if you run your script on just one GPU or CPU, this won't do anything). A few example cases of when to use this utility are listed below: Some of these are utilized with the [`~Accelerator.main_process_first`] context manager, which utilizes [`~Accelerator.wait_for_everyone`] to run a particular set of code on the main process beforehand before triggering and launching the other processes ## Downloading a Dataset When downloading a dataset, you should download it first on the main process and then load the cached dataset afterward `load_dataset` will perform a lock under the hood to stop multiple downloads from happening at once, but if you are downloading something not using this library you should use this method. ```python with accelerator.main_process_first(): datasets = load_dataset("glue", "mrpc") ``` Under the hood this is the same as calling: ```python # First do something on the main process if accelerator.is_main_process: datasets = load_dataset("glue", "mrpc") else: accelerator.wait_for_everyone() # And then send it to the rest of them if not accelerator.is_main_process: datasets = load_dataset("glue", "mrpc") else: accelerator.wait_for_everyone() ``` ## Saving the `state_dict` When saving the `state_dict` of the model, since you would normally save one file on just the main process you should specify that: ```python if accelerator.is_main_process: model = accelerator.unwrap_model(model) torch.save(model.state_dict(), "weights.pth") ``` ## Loading in the `state_dict` When loading in the `state_dict` to a model, optimizer, or scheduler, you should wait for all workers to have the weights loaded in before moving on to training ```python with accelerator.main_process_first(): state = torch.load("weights.pth") model.load_state_dict(state) ``` ## Applying a multi-worker CPU operation Applying a `map()` operation on multiple workers, such as tokenizing should be done on the main process first, and then propagated to each one. ```python datasets = load_dataset("glue", "mrpc") with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) ``` ## Applying checks such as Early Stopping To have a check that works with a flag set by a particular process, the `set_trigger` and `check_trigger` API should be used. Useful examples for doing so can include situations such as using early stopping and monitoring the loss (as each loss slightly differs on each process). Call [`Accelerator.set_trigger`] when your condition has been met, and [`Accelerator.check_trigger`] when checking if that condition has been met in any process: ```python for (x,y) in data_loader: logits = model(x) loss = loss_func(logits, y) # Assume `should_do_early_stopping` is a custom defined function that returns a conditional if should_do_early_stopping(loss): accelerator.set_trigger() # Later in the training script when we need to check for the breakpoint if accelerator.check_trigger(): break ``` accelerate-1.14.0/docs/source/concept_guides/fsdp1_vs_fsdp2.md000066400000000000000000000170331521253476100242670ustar00rootroot00000000000000 # FSDP1 vs FSDP2 This guide explains the key differences between `FSDP1` and `FSDP2` and helps you migrate your existing code to use `FSDP2` with minimal changes. ## How is FSDP2 better than FSDP1? First, we want to understand how `FSDP1` and `FSDP2` work internally to understand the differences between them. This also helps us understand the limitations of `FSDP1` and how `FSDP2` solves them. We'll be discussing a scenario where we have a single `Layer` that contains 3 `Linear` layers and is wrapped using `FSDP` to be sharded across 2 GPUs.
Layer
### FSDP1 First, we have to understand the original `FSDP1` and the limitations it brings. It represents each `FSDP` module as a single `FlatParameter` which is a single 1D tensor that contains all of the module parameters, which then get sharded across ranks. I.e. if you wrap the `Layer` with `FSDP1`, you'd achieve something as such:
FSDP1
You might notice a problem. The whole `Layer` gets flattened into a single `FlatParameter`, which then gets sharded across ranks. But if it's a single `FlatParameter` object, how do we store metadata? That is one of the limitations. Properly storing per-parameter metadata such as `dtype`, `requires_grad`, etc. is not possible without some ugly hacks. ### FSDP2 This is why `FSDP2` was introduced. It doesn't use `FlatParameter`, instead it uses `DTensor` which is short for "Distributed Tensor". Each `DTensor` basically represents a vanilla `torch.Tensor` that has been sharded across ranks. It contains metadata about the original `torch.Tensor` and how it's sharded, what is the [placement type](https://pytorch.org/docs/stable/distributed.tensor.html#module-torch.distributed.tensor.placement_types) and so on. This is why it's called `per-parameter sharding`. The following figure shows the difference:
FSDP2
Each Parameter of the original `Layer` is sharded across the 0th dimension, and split between 2 GPUs. Now, each `Linear` layer is a separate `DTensor` and storing metadata per-parameter is possible and straightforward. > [!TIP] > In the image above, the tensors were sharded across the 1st dimension for the sake of fitting the image on the screen, in reality, they are sharded across the 0th dimension as stated above ## What does FSDP2 offer? `FSDP2` is a new and improved version of PyTorch's fully-sharded data parallel training API. Its main advantage is using `DTensor` to represent sharded parameters. Compared to `FSDP1`, it offers: - Simpler internal implementation, where each `Parameter` is a separate `DTensor` - Enables simple partial parameter freezing because of the above, which makes methods as [`LORA`](https://huggingface.co/papers/2106.09685) work out of the box - With `DTensor`, `FSDP2` supports mixing `fp8` and other parameter types in the same model out of the box - Faster and simpler checkpointing without extra communication across ranks using `SHARDED_STATE_DICT` and [`torch.distributed.checkpoint`](https://pytorch.org/docs/stable/distributed.checkpoint.html), this way, each rank only saves its own shard and corresponding metadata - For loading, it uses a `state_dict` of the sharded model to directly load the sharded parameters - Support for asynchronous checkpointing, where parameters are first copied to CPU memory, after this, main thread continues training while another thread stores the parameters on disk - Memory efficiency and deterministic memory usage, `FSDP2` doesn't use `recordStream` anymore and uses stream-to-stream synchronization (for more technical details see [this forum post](https://dev-discuss.pytorch.org/t/fsdp-cudacachingallocator-an-outsider-newb-perspective/1486) and [this issue](https://github.com/pytorch/pytorch/issues/114299)) - In the future, optimizations of the communication patterns via `torch.compile` are planned, further improving the performance and memory efficiency ## API Differences We have already discussed the internal differences, now let's discuss the differences, you, as a user, will need to know. Here are the main changes in configuration options when using `FSDP2` through the `accelerate` CLI: Previous (`FSDP1`) | New (`FSDP2`) | What Changed -- | -- | -- `--fsdp_sharding_strategy` | `--fsdp_reshard_after_forward` | replaces `--fsdp_sharding_strategy`, changed to `true` (previously `FULL_SHARD`) or `false` (previously `SHARD_GRAD_OP`) `--fsdp_backward_prefetch` | \*\***REMOVED**\*\* | `FSDP2` uses previous `BACKWARD_PRE` option by default, as only this allows communication and computation overlap `--fsdp_forward_prefetch` | \*\***NOT YET IMPLEMENTED**\*\* | How to implement this is under active discussion, for now it is not supported in `FSDP2` `--fsdp_sync_module_states` | \*\***REMOVED**\*\* | with `FSDP2`, this parameter becomes redundant `--fsdp_cpu_ram_efficient_loading` | `--fsdp_cpu_ram_efficient_loading` | if `true`, `FSDP2` will similarly load the model only on rank 0, and then parameters get synced to other ranks, this is the same behavior as `FSDP1`, however, setting `--fsdp_sync_module_states` isn't required anymore `--fsdp_state_dict_type` | `--fsdp_state_dict_type` | `LOCAL_STATE_DICT` becomes obsolete and with `FSDP2` `SHARDED_STATE_DICT` is the default option, which results in no extra communication and each rank saving its own shard, other possible option is `FULL_STATE_DICT` which results in extra communication and spike in memory usage but saves the full model from rank 0. `--fsdp_use_orig_params` | \*\***REMOVED**\*\* | `FSDP2` uses a `DTensor` class on the background, which means it *always* uses the original parameters by default \*\***NEW**\*\* | `--fsdp_version` | `1` is the default option, to not break existing code, set to `2` to use `FSDP2` For all other options that remain unchanged, see the [`FSDP` documentation](../usage_guides/fsdp.md). ## How to Switch to FSDP2 ### If using Python code: Simply set `fsdp_version=2` when creating your plugin and replace options according to the table above. ```python from accelerate import FullyShardedDataParallelPlugin, Accelerator fsdp_plugin = FullyShardedDataParallelPlugin( fsdp_version=2 # other options... ) accelerator = Accelerator(fsdp_plugin=fsdp_plugin) ``` ### If using YAML config: Use our conversion tool: ```bash accelerate to-fsdp2 --config_file config.yaml --output_file new_config.yaml ``` This will automatically convert all FSDP1 settings to their FSDP2 equivalents. Use `--overwrite` to update the existing file instead of creating a new one. accelerate-1.14.0/docs/source/concept_guides/fsdp_and_deepspeed.md000066400000000000000000000263501521253476100252420ustar00rootroot00000000000000 # FSDP vs DeepSpeed Accelerate offers flexibility of training frameworks, by integrating two extremely powerful tools for distributed training, namely [Pytorch FSDP](../usage_guides/fsdp) and [Microsoft DeepSpeed](../usage_guides/deepspeed). The aim of this tutorial is to draw parallels, as well as to outline potential differences, to empower the user to switch seamlessly between these two frameworks. To switch between the frameworks, we recommend launching code `accelerate launch` passing in the correct config file with `--config_file`, or passing in the respective arguments directly for [FSDP and DeepSpeed](../package_reference/cli#accelerate-launch) . Example Accelerate configurations can be found here for [DeepSpeed](../usage_guides/deepspeed#accelerate-deepspeed-plugin) and [FSDP](../usage_guides/fsdp#how-it-works-out-of-the-box), or in the [example zoo under "Launch Configurations"](../usage_guides/explore) This tutorial is for single-node, multi-GPU, scenarios only. ## Configuring Functionalities Model tensors are split into different GPUs in an attempt to scale up model sizes; this is termed *sharding* in FSDP, and *partitioning* in DeepSpeed. FSDP sharding and DeepSpeed ZeRO (partitioning) stages are configured by `--fsdp_sharding_strategy`, and `--zero_stage`, respectively. In particular, FSDP `FULL_SHARD` maps to DeepSpeed ZeRO stage `3`; see this [comprehensive mapping between FSDP sharding and DeepSpeed ZeRO settings](../usage_guides/fsdp#mapping-between-fsdp-sharding-strategies-and-deepspeed-zero-stages). The below table summarizes and groups similar settings: Group | Framework | Configuration | Example | Restrictions (if any) --|--|--|--|-- sharding / partitioning | FSDP
DeepSpeed | `--fsdp_sharding_strategy`
`--zero_stage` | `1` (`FULL_SHARD`)
`3` | offload | FSDP
DeepSpeed | `--fsdp_offload_params`
`--offload_param_device`
`--offload_optimizer_device` | `true`
`cpu`
`cpu` | all or nothing

model loading | FSDP
DeepSpeed | `--fsdp_cpu_ram_efficient_loading`
`--zero3_init_flag` | `true`
`true` |
only ZeRO 3 efficient checkpointing | FSDP
DeepSpeed | `--fsdp_state_dict_type`
`--zero3_save_16bit_model` | `SHARDED_STATE_DICT`
`true` |
only ZeRO 3 weights prefetching | FSDP

DeepSpeed | `--fsdp_forward_prefetch`
`--fsdp_backward_prefetch`
None | `true`
`BACKWARD_PRE` |

model | FSDP

DeepSpeed | `--fsdp_auto_wrap_policy`
`--fsdp_transformer_layer_cls_to_wrap`
None | `TRANSFORMER_BASED_WRAP`
|
Usually not needed
Transparent to user. parameters summoning | FSDP
DeepSpeed | `--fsdp_use_orig_params`
None | `true` | required for `torch.compile`
Transparent to user parameters syncing | FSDP
DeepSpeed | `--fsdp_sync_module_states`
None | `true` | training | FSDP
DeepSpeed | None
`--gradient_accumulation_steps`
`--gradient_clipping` |
`auto`
`auto` | Transparent to user For detailed descriptions of the above, refer to [`Accelerate` launch documentation](../package_reference/cli#accelerate-launch). To access other DeepSpeed configurations, such as mixed precision settings, you need to pass in a `--deepspeed_config_file`, see the [documentation](../usage_guides/deepspeed#deepspeed-config-file). DeepSpeed can be also configured via [`DeepSpeedPlugin`], e.g., `DeepSpeedPlugin.zero_stage` is equivalent of `--zero_stage`, and `DeepSpeedPlugin.hf_ds_config` can be used to pass `--deepeed_config_file.` FSDP can be also configured via [`FullyShardedDataParallelPlugin`], e.g., `FullyShardedDataParallelPlugin.sharding_strategy` is equivalent of `--fsdp_sharding_strategy`. ### Checkpointing Do note that while FSDP can be configured via `--fsdp_state_dict_type` to save either full / sharded checkpoints. For DeepSpeed Zero3, one could pass a `--zero3_save_16bit_model true`, which conveniently consolidates the model to a single rank and saves; this is the FSDP equivalent of `fsdp_state_dict_type: FULL_STATE_DICT`. For large models, consolidating the model to a single rank can be very slow. For quicker checkpointing, for FSDP use `fsdp_state_dict_type: SHARDED_STATE_DICT`, and for DeepSpeed Zero3 [use the `zero_to_fp32.py` script to post-convert sharded checkpoints](https://www.deepspeed.ai/tutorials/zero/#extracting-weights). ### Offloading FSDP only allows *all-or-nothing* offload (i.e., either offload parameters, gradients, and optimizer, or keep them all in GPU), but DeepSpeed can offload parameters and optimizer differently. Furthermore, DeepSpeed also supports [offloading to NVME](https://www.deepspeed.ai/docs/config-json/#parameter-offloading). ### Prefetching FSDP allows two prefetching configurations `--fsdp_forward_prefetch` and `--fsdp_backward_prefetch` to improve overlap of comms / computation at a cost of extra memory, see [FSDP documentation](https://pytorch.org/docs/stable/fsdp.html). For DeepSpeed, the prefetching will be turned on when needed, and it turns on depending on certain hyper-params like `stage3_param_persistence_threshold`, `stage3_max_reuse_distance`, etc, [that can be configured for Zero3](https://www.deepspeed.ai/docs/config-json/#parameter-offloading); `accelerate` may set these hyper-params automatically if you don't set those explicitly in the deepspeed config file. For FSDP set `fsdp_backward_prefetch: BACKWARD_PRE` for improved throughputs if memory allows. ### Model Loading While FSDP require an explicit `--fsdp_cpu_ram_efficient_loading true` to activate efficient model loading, `transformers` will activate the similar feature whenever DeepSpeed Zero3 is used. For FSDP, whenever setting `--fsdp_cpu_ram_efficient_loading true`, `accelerate` will automatically set `sync_module_states` to true. For RAM efficient loading the weights will be loaded only in a single rank, and thus requires `sync_module_states` to broadcast weights to other ranks. ### Model FSDP requires an explicit `--fsdp_auto_wrap_policy` for the algorithm to decide how to schedule the all-gather and reduce-scatter operations. But for DeepSpeed this is transparent to the user. For FSDP, simply set `fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP`. With the latest [`transformers`] versions, we try our best to figure out the suitable `fsdp_transformer_layer_cls_to_wrap` for HF transformers models. However, if you get an error regarding it, please specify this. ### Parameters Summoning FSDP requires an explicit `--fsdp_use_orig_params` flag if using `torch.compile`, see [the pytorch documentation](https://pytorch.org/docs/stable/fsdp.html#module-torch.distributed.fsdp). For DeepSpeed this is transparent to the user. For FSDP, when using `torch.compile` please set `fsdp_use_orig_params: True`. ## Training Deepspeed requires explicit `--gradient_accumulation_steps` and `--gradient_clipping` flags. For FSDP this is transparent to the user. When using DeepSpeed, set `gradient_accumulation_steps: "auto"` and `gradient_clipping: "auto"` to automatically pick up values set in the [`Accelerator`] or [`TrainingArguments`] (if using `transformers`). ## On Differences in Data Precision Handling To discuss how data precision is handled in both FSDP and Deepspeed, it is instructive to first give an overview of how model parameters are handled in these frameworks. Before the model / optimizer parameters are distributed across GPUs, parameter preparation is involved to first "flatten" them to one-dimensional [`torch.Tensor`](https://pytorch.org/docs/stable/tensors.html#torch-tensor). The implementation of FSDP / DeepSpeed varies in the respect of the `dtype` in which these "flattened" parameters are stored, and there are ramifications with regards to how [`torch.Optimizer`](https://pytorch.org/docs/stable/optim.html#module-torch.optim) allocate their `dtype`s. The table below outlines the processes for both frameworks; the "Local" column indicates the process occurring at a per-gpu level, therefore any memory overheads by upcasting should be understood to be amortized by the number of gpus used. As a rule of thumb, for stable training with automatic mixed precision, all the trainable parameters have to be in `torch.float32`. Process | Local | Framework | Details --|--|--|-- Loading, i.e., [`AutoModel.from_pretrained(..., torch_dtype=torch_dtype)`] | Preparation, i.e., creation of "flat params" | ✅ | FSDP
DeepSpeed | created in `torch_dtype`.
disregards `torch_dtype`, created in `float32`. Optimizer initialization | ✅ | FSDP
DeepSpeed | creates parameters in `torch_dtype`
creates parameters in `float32` Training Step, i.e, forward, backward, reduction | | FSDP
DeepSpeed | follows [`MixedPrecision`](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.MixedPrecision)
follows `deepspeed_config_file` mixed precision settings. Optimizer (Pre-Step) | ✅ | FSDP
DeepSpeed | upcasting (if any) to `torch_dtype`
upcasted to `float32` Optimizer (Actual Step) | ✅ | FSDP
DeepSpeed | occurs in `torch_dtype`
occurs in `float32`. Therefore when using DeepSpeed a small number of GPUs, be aware of potentially significant memory overheads due to the upcasting during preparation. With FSDP, in the absence of mixed precision, it is possible to operate the [`torch.Optimizer`](https://pytorch.org/docs/stable/optim.html#module-torch.optim) in low precision `torch_dtype`, which may be helpful when using small number of GPUs. With mixed precision, FSDP and DeepSpeed will upcast in the model preparation step (c.f. table above). But do note that FSDP will then save checkpoints in the upcasted precision; Deepspeed may still save low precision checkpoints if `--zero3_save_16bit_model` is specified. To clarify the above table consider the concrete examples below; the optimizer pre- and actual step combined for brevity. With FSDP it is possible to operate in the two modes shown below, but DeepSpeed can only operate in one. Framework | Model Loading (`torch_dtype`) | Mixed Precision | Preparation (Local) | Training | Optimizer (Local) --|--|--|--|--|-- FSDP | bf16 | default (none) | bf16 | bf16 | bf16 FSDP | bf16 | bf16 | fp32 | bf16 | fp32 DeepSpeed | bf16 | bf16 | fp32 | bf16 | fp32 accelerate-1.14.0/docs/source/concept_guides/gradient_synchronization.md000066400000000000000000000220061521253476100265560ustar00rootroot00000000000000 # Gradient synchronization PyTorch's distributed module operates by communicating back and forth between all of the GPUs in your system. This communication takes time, and ensuring all processes know the states of each other happens at particular triggerpoints when using the `ddp` module. These triggerpoints are added to the PyTorch model, specifically their `forward()` and `backward()` methods. This happens when the model is wrapped with `DistributedDataParallel`: ```python import torch.nn as nn from torch.nn.parallel import DistributedDataParallel model = nn.Linear(10, 10) ddp_model = DistributedDataParallel(model) ``` In Accelerate this conversion happens automatically when calling [`~Accelerator.prepare`] and passing in your model. ```diff + from accelerate import Accelerator + accelerator = Accelerator() import torch.nn as nn - from torch.nn.parallel import DistributedDataParallel model = nn.Linear(10,10) + model = accelerator.prepare(model) ``` ## The slowdown in gradient accumulation You now understand that PyTorch adds hooks to the `forward` and `backward` method of your PyTorch model when training in a distributed setup. But how does this risk slowing down your code? In DDP (distributed data parallel), the specific order in which processes are performed and ran are expected at specific points and these must also occur at roughly the same time before moving on. The most direct example is when you update model parameters through `optimizer.step()`. Without gradient accumulation, all instances of the model need to have updated their gradients computed, collated, and updated before moving on to the next batch of data. When performing gradient accumulation, you accumulate `n` loss gradients and skip `optimizer.step()` until `n` batches have been reached. As all training processes only need to synchronize by the time `optimizer.step()` is called, without any modification to your training step, this needless inter-process communication can cause a significant slowdown. How can you avoid this overhead? ## Solving the slowdown problem Since you are skipping model parameter updates when training on these batches, their gradients do not need to be synchronized until the point where `optimizer.step()` is actually called. PyTorch cannot automagically tell when you need to do this, but they do provide a tool to help through the [`no_sync`](https://pytorch.org/docs/stable/generated/torch.nn.parallel.DistributedDataParallel.html#torch.nn.parallel.DistributedDataParallel.no_sync) context manager that is added to your model after converting it to DDP. Under this context manager, PyTorch will skip synchronizing the gradients when `.backward()` is called, and the first call to `.backward()` outside this context manager will trigger the synchronization. See an example below: ```python ddp_model, dataloader, optimizer = accelerator.prepare(model, dataloader, optimizer) for index, batch in enumerate(dataloader): inputs, targets = batch # Trigger gradient synchronization on the last batch if index != (len(dataloader) - 1): with ddp_model.no_sync(): # Gradients only accumulate outputs = ddp_model(inputs) loss = loss_func(outputs) accelerator.backward(loss) else: # Gradients finally sync outputs = ddp_model(inputs) loss = loss_func(outputs) accelerator.backward(loss) optimizer.step() ``` In Accelerate to make this an API that can be called no matter the training device (though it may not do anything if you are not in a distributed system!), `ddp_model.no_sync` gets replaced with [`~Accelerator.no_sync`] and operates the same way: ```diff ddp_model, dataloader, optimizer = accelerator.prepare(model, dataloader, optimizer) for index, batch in enumerate(dataloader): inputs, targets = batch # Trigger gradient synchronization on the last batch if index != (len(dataloader)-1): - with ddp_model.no_sync(): + with accelerator.no_sync(model): # Gradients only accumulate outputs = ddp_model(inputs) loss = loss_func(outputs, targets) accelerator.backward(loss) else: # Gradients finally sync outputs = ddp_model(inputs) loss = loss_func(outputs) accelerator.backward(loss) optimizer.step() optimizer.zero_grad() ``` As you may expect, the [`~Accelerator.accumulate`] function wraps around this conditional check by keeping track of the current batch number, leaving you with the final gradient accumulation API: ```python ddp_model, dataloader, optimizer = accelerator.prepare(model, dataloader, optimizer) for batch in dataloader: with accelerator.accumulate(model): optimizer.zero_grad() inputs, targets = batch outputs = model(inputs) loss = loss_function(outputs, targets) accelerator.backward(loss) optimizer.step() optimizer.zero_grad() ``` As a result, you should either use *`accelerator.accumulate` or `accelerator.no_sync`* when it comes to API choice. ## Just how much of a slowdown is there, and easy mistakes you can make To set up a realistic example, consider the following setup: * Two single-GPU T4 nodes and one node with two GPUs * Each GPU is a T4, and are hosted on GCP * The script used is a modification of the [NLP Example](https://github.com/muellerzr/timing_experiments/blob/main/baseline.py) script * Batch size per GPU is 16, and gradients are accumulated every 4 steps All scripts are available in [this repository](https://github.com/muellerzr/timing_experiments). If not careful about gradient synchronization and GPU communication, a *large* amount of time can be wasted from when these GPUs communicate to each other during unnecessary periods. By how much? Reference: - Baseline: uses no synchronization practices discussed here - `no_sync` improperly: `no_sync` only around the `backward` call, not the `forward` - `no_sync`: using the `no_sync` pattern properly - `accumulate`: using [`~Accelerator.accumulate`] properly Below are the average seconds per batch iterating over 29 batches of data for each setup on both a single node and on the dual-node setup: | | Baseline | `no_sync` improperly | `no_sync` | `accumulate`| | :---------: | :-------: | :------------------: | :-------: | :---------: | | Multi-Node | 2±0.01s | 2.13±0.08s | **0.91±0.11s** | **0.91±0.11s** | | Single Node | 0.50±0.01s | 0.50±0.01s | **0.41±0.015s** | **0.41±0.015s** | As you can see, if you are not careful about how you set up your gradient synchronization, you can get upwards of more than a 2x slowdown during training! If you are worried about making sure everything is done properly, we highly recommend utilizing the [`~Accelerator.accumulate`] function and passing in `gradient_accumulation_steps` or `gradient_accumulation_plugin` to the [`Accelerator`] object so Accelerate can handle this for you. ### `no_sync` requires additional GPU memory when using FSDP Be aware that not syncing gradients can have adverse effects while performing FSDP training. As it has been warned in `torch`, the [`no_sync` context manager for FSDP](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.FullyShardedDataParallel.no_sync) will require additional memory. Therefore in memory intensive situations while using FSDP, we recommend to set `sync_each_batch` to `True` in the [`~utils.GradientAccumulationPlugin`] to disable `no_sync`. See the example below where we fine-tune Mixtral (47B parameters) on 8 A100-80GB GPUs. We see that even for a modest `gradient_accumulation_steps=2` we quickly go out-of-memory (OOM) if `no_sync` is enabled. Again, this is due to additional memory overheads due to FSDP's `no_sync`. However, if `no_sync` is disabled via `sync_each_batch=True`, then the memory consumption for `gradient_accumulation_steps=16` reverts to that of `gradient_accumulation_steps=1`. | Model | `no_sync` (accum=1) | `no_sync` (accum=2) | `no_sync` disabled (accum=16) | :-------------: | :-----------------: | :-----------------: | :-----------------: mixtral 8x7B | 69G | OOM | 69G > [!WARNING] > Disabling `no_sync` means there _will be slowdown_ due the extra data syncs, as explained by the earlier sections of this guide.accelerate-1.14.0/docs/source/concept_guides/internal_mechanism.md000066400000000000000000000105351521253476100253040ustar00rootroot00000000000000 # Accelerate's internal mechanisms Internally, Accelerate works by first analyzing the environment in which the script is launched to determine which kind of distributed setup is used, how many different processes there are and which one the current script is in. All that information is stored in the [`~AcceleratorState`]. This class is initialized the first time you instantiate an [`~Accelerator`] as well as performing any specific initialization your distributed setup needs. Its state is then uniquely shared through all instances of [`~state.AcceleratorState`]. (The same can also be done with the [`PartialState`], a more barebones version it inherits) Then, when calling [`~Accelerator.prepare`], the library: - wraps your model(s) in the container adapted for the distributed setup, - wraps your optimizer(s) in an [`~optimizer.AcceleratedOptimizer`], - wraps your scheduler(s) in an [`~scheduler.AcceleratedScheduler`] - creates a new version of your dataloader(s) in a [`~data_loader.DataLoaderShard`] or [`~data_loader.DataLoaderDispatcher`] While the model(s), optimizer(s), and scheduler(s) are just put in simple wrappers, the dataloader(s) are re-created. This is mostly because PyTorch does not let the user change the `batch_sampler` of a dataloader once it's been created and the library handles the sharding of your data between processes by changing that `batch_sampler` to yield every other `num_processes` batches (if enabled). The [`~data_loader.DataLoaderShard`] subclasses `DataLoader` to add the following functionality: - it synchronizes the appropriate random number generator of all processes at each new iteration, to ensure any randomization (like shuffling) is done the exact same way across processes. - it puts the batches on the proper device before yielding them (unless you have opted out of `device_placement=True`). The [`~data_loader.DataLoaderDispatcher`] subclasses differs from the [`~data_loader.DataLoaderShard`] in that when iterating through the `DataLoader`, the data is all starting from process 0 and *then* split and sent off to each process rather than it happening at the dataset level. The random number generator synchronization will by default synchronize: - the `generator` attribute of a given sampler (like the PyTorch `RandomSampler`) for PyTorch >= 1.6 - the main random number generator in PyTorch <=1.5.1 You can choose which random number generator(s) to synchronize with the `rng_types` argument of the main [`Accelerator`]. In PyTorch >= 1.6, it is recommended to rely on a local `generator` to avoid setting the same seed in the main random number generator in all processes. Synchronization of the main torch (or CUDA or XLA) random number generator will affect any other potential random artifacts you could have in your dataset (like random data augmentation) in the sense that all processes will get the same random numbers from the torch random modules (so will apply the same random data augmentation if it's controlled by torch). The randomization part of your custom sampler, batch sampler or iterable dataset should be done using a local `torch.Generator` object (in PyTorch >= 1.6), see the traditional `RandomSampler`, as an example. If you have [`torchdata>=0.8.0`](https://github.com/pytorch/data/tree/main) installed, and you have passed `use_stateful_dataloader=True` into your [`~utils.DataLoaderConfiguration`], these classes will directly inherit from `StatefulDataLoader` instead, and maintain a `state_dict`. For more details about the internals, see the [Internals page](../package_reference/torch_wrappers). accelerate-1.14.0/docs/source/concept_guides/low_precision_training.md000066400000000000000000000144151521253476100262140ustar00rootroot00000000000000 # Low precision training methods The release of new kinds of hardware led to the emergence of new training paradigms that better utilize them. Currently, this is in the form of training in 8-bit precision using packages such as [TransformersEngine](https://github.com/NVIDIA/TransformerEngine) (TE), [torchao](https://github.com/pytorch/ao) (native PyTorch FP8), or the legacy [MS-AMP](https://github.com/Azure/MS-AMP/tree/main) (no longer maintained, see warning below). For an introduction to the topics discussed today, we recommend reviewing the [low-precision usage guide](../usage_guides/low_precision_training) as this documentation will reference it regularly. ## A Quick Chart Below is a quick chart from the MS-AMP documentation showing the different bit-precisions for each solution during training: Optimization Level | Computation(GEMM) | Comm | Weight | Master Weight | Weight Gradient | Optimizer States -- | -- | -- | -- | -- | -- | -- FP16 AMP | FP16 | FP32 | FP32 | N/A | FP32 | FP32+FP32 Nvidia TE | FP8 | FP32 | FP32 | N/A | FP32 | FP32+FP32 MS-AMP O1 | FP8 | FP8 | FP16 | N/A | FP8 | FP32+FP32 MS-AMP O2 | FP8 | FP8 | FP16 | N/A | FP8 | FP8+FP16 MS-AMP O3 | FP8 | FP8 | FP8 | FP16 | FP8 | FP8+FP16 ## `TransformersEngine` `TransformersEngine` is the first solution to trying to train in 8-bit floating point. It works by using drop-in replacement layers for certain ones in a model that utilizes their FP8-engine to reduce the number of bits (such as 32 to 8) without degrading the final accuracy of the model. Specifically, Accelerate will find and replace the following layers with `TransformersEngine` versions: * `nn.LayerNorm` for `te.LayerNorm` * `nn.Linear` for `te.Linear` As a result we wind up with a model that has most of its layers in BF16, while some layers are in FP8 reducing some of the memory. Anecdotally, we have noticed that performance gains don't really start showing when using `TransformerEngine` until a large majority of the layers in the model are made up of those two layers to replace. As a result, only larger models have shown performance improvements when the number of parameters is around and upwards of a few billion. The `TransformerEngine` can receive many different arguments that customize how it performs FP8 calculations and what they do. A full list of the arguments is available below: * `margin`: The margin to use for the gradient scaling. * `interval`: The interval to use for how often the scaling factor is recomputed. * `fp8_format``: The format to use for the FP8 recipe. Must be one of `HYBRID` or `E4M3`. (Generally `HYBRID` for training, `E4M3` for evaluation) * `amax_history_len`: The length of the history to use for the scaling factor computation * `amax_compute_algo`: The algorithm to use for the scaling factor computation. Must be one of `max` or `most_recent`. * `override_linear_precision`: Whether or not to execute `fprop`, `dgrad`, and `wgrad` GEMMS in higher precision. You can customize each of these as part of [`utils.FP8RecipeKwargs`] to help optimize performance of your models. If we notice in the chart mentioned earlier, TE simply casts the computation layers into FP8, while everything else is in FP32. As a result this winds up utilizing the most memory but does so with the benefit of guaranteeing the least amount of loss in end accuracy during training. ## `MS-AMP` **âš ï¸� Deprecated / Unmaintained:** MS-AMP is no longer actively maintained by Microsoft. The repository has not seen updates since 2023 and has known compatibility issues with CUDA 12.x+, modern NCCL versions, and recent PyTorch releases (2.2+). **We strongly recommend using `TransformersEngine` or `torchao` instead.** See the [usage guide](../usage_guides/low_precision_training) for migration instructions. MS-AMP takes a different approach to `TransformersEngine` by providing three different optimization levels to convert more operations in FP8 or FP16. * The base optimization level (`O1`), passes communications of the weights (such as in DDP) in FP8, stores the weights of the model in FP16, and leaves the optimizer states in FP32. The main benefit of this optimization level is that we can reduce the communication bandwidth by essentially half. Additionally, more GPU memory is saved due to 1/2 of everything being cast in FP8, and the weights being cast to FP16. Notably, both the optimizer states remain in FP32. * The second optimization level (`O2`) improves upon this by also reducing the precision of the optimizer states. One is in FP8 while the other is in FP16. Generally it's been shown that this will only provide a net-gain of no degraded end accuracy, increased training speed, and reduced memory as now every state is either in FP16 or FP8. * Finally, MS-AMP has a third optimization level (`O3`) which helps during DDP scenarios such as DeepSpeed. The weights of the model in memory are fully cast to FP8, and the master weights are now stored in FP16. This fully reduces memory by the highest factor as now not only is almost everything in FP8, only two states are left in FP16. Currently, only DeepSpeed versions up through 0.9.2 are supported, so this capability is not included in the Accelerate integration ## Combining the two Since MS-AMP is no longer maintained, this combination is not recommended for new projects. More experiments need to be performed but it's been noted that combining both MS-AMP and TransformersEngine can lead to the highest throughput by relying on NVIDIA's optimized FP8 operators and utilizing how MS-AMP reduces the memory overhead. accelerate-1.14.0/docs/source/concept_guides/performance.md000066400000000000000000000110051521253476100237360ustar00rootroot00000000000000 # Comparing performance across distributed setups Evaluating and comparing the performance from different setups can be quite tricky if you don't know what to look for. For example, you cannot run the same script with the same batch size across TPU, multi-GPU, and single-GPU with Accelerate and expect your results to line up. But why? There are three reasons for this that this tutorial will cover: 1. **Setting the right seeds** 2. **Observed Batch Sizes** 3. **Learning Rates** ## Setting the Seed While this issue has not come up as much, make sure to use [`utils.set_seed`] to fully set the seed in all distributed cases so training will be reproducible: ```python from accelerate.utils import set_seed set_seed(42) ``` Why is this important? Under the hood this will set **5** different seed settings: ```python random.seed(seed) np.random.seed(seed) torch.manual_seed(seed) torch.cuda.manual_seed_all(seed) # or torch.xpu.manual_seed_all, etc # ^^ safe to call this function even if cuda is not available if is_torch_xla_available(): xm.set_rng_state(seed) ``` The random state, numpy's state, torch, torch's device state, and if TPUs are available torch_xla's cuda state. ## Observed Batch Sizes When training with Accelerate, the batch size passed to the dataloader is the **batch size per GPU**. What this entails is a batch size of 64 on two GPUs is truly a batch size of 128. As a result, when testing on a single GPU this needs to be accounted for, as well as similarly for TPUs. The below table can be used as a quick reference to try out different batch sizes: In this example, there are two GPUs for "Multi-GPU" and a TPU pod with 8 workers | Single GPU Batch Size | Multi-GPU Equivalent Batch Size | TPU Equivalent Batch Size | |-----------------------|---------------------------------|---------------------------| | 256 | 128 | 32 | | 128 | 64 | 16 | | 64 | 32 | 8 | | 32 | 16 | 4 | ## Learning Rates As noted in multiple sources[[1](https://aws.amazon.com/blogs/machine-learning/scalable-multi-node-deep-learning-training-using-gpus-in-the-aws-cloud/)][[2](https://docs.nvidia.com/clara/clara-train-sdk/pt/model.html#classification-models-multi-gpu-training)], the learning rate should be scaled *linearly* based on the number of devices present. The below snippet shows doing so with Accelerate: Since users can have their own learning rate schedulers defined, we leave this up to the user to decide if they wish to scale their learning rate or not. ```python learning_rate = 1e-3 accelerator = Accelerator() learning_rate *= accelerator.num_processes optimizer = AdamW(params=model.parameters(), lr=learning_rate) ``` You will also find that `accelerate` will step the learning rate based on the number of processes being trained on. This is because of the observed batch size noted earlier. So in the case of 2 GPUs, the learning rate will be stepped twice as often as a single GPU to account for the batch size being twice as large (if no changes to the batch size on the single GPU instance are made). ## Gradient Accumulation and Mixed Precision When using gradient accumulation and mixed precision, due to how gradient averaging works (accumulation) and the precision loss (mixed precision), some degradation in performance is expected. This will be explicitly seen when comparing the batch-wise loss between different compute setups. However, the overall loss, metric, and general performance at the end of training should be _roughly_ the same. accelerate-1.14.0/docs/source/concept_guides/sequence_parallelism.md000066400000000000000000000336301521253476100256420ustar00rootroot00000000000000 # Sequence parallel in 🤗`accelerate` This guide will cover basics of using sequence parallelism in 🤗`accelerate`. See also the very related [Context Parallelism](./context_parallelism.md). ## Why sequence parallelism? With the advent of large language models, and recently reasoning models, the sequence length has been growing rapidly. This, combined with quadratic memory complexity of attention, has led to a need for more efficient ways to train models with long sequences. With sequence length of 128k, the memory requirement of the attention matrix is `128k * 128k * 2 bytes * num_heads = ~32 GB * num_heads` for `bf16` precision, given vanilla attention implementation. Granted, with usage of `flash attention` or `SDPA` which do not materialize these attention weights, this decreases drastically, but the growth in memory requirements is still considerable. Ulysses Sequence parallelism allows us to shard the inputs to the attention computation along the sequence dimension and compute the attention normally, but using only a slice of attention heads on each GPU. With this, we can train models with long sequences, with a few more tools, scaling to 15M+ sequence length. To see how to augment Ulysses SP with TiledMLP, Liger-Kernel, Activation checkpoint offload to cpu and a few other tricks please refer to the paper: [Arctic Long Sequence Training: Scalable And Efficient Training For Multi-Million Token Sequences](https://arxiv.org/abs/2506.13996). ## How is Ulysses SP different from FSDP CP In the document [Context Parallelism](./context_parallelism.md) you can learn about deploying another technology called Context Parallelism, which too slices on the sequence dimension but uses Ring Attention instead of slicing on the head dimension. The following articles go into a very detailed explanation of the differences between the two technologies: - https://insujang.github.io/2024-01-11/tensor-parallelism-and-sequence-parallelism-detailed-analysis/ - https://huggingface.co/blog/exploding-gradients/ulysses-ring-attention A quick summary adapting from one of the articles: - Ulysses SP has a relatively low communication overhead, but is limited by the number of Attention Heads and thus it has certain requirements for network topology (number of attention heads has has to be divisible by the number of participating gpus for a single replica). All-to-all communication is sensitive to latency and it requires Deepspeed. - FSDP CP Ring-Attention's P2P ring communication has no aforementioned divisibilty requirements, but has a higher communication volume. Finally it should be possible to combine SP + CP as explained in the paper [USP: A Unified Sequence Parallelism Approach for Long Context Generative AI](https://arxiv.org/abs/2405.07719) to support an even longer sequence length, albeit this is not yet integrated into 🤗`accelerate`. ## Supported sequence parallelism backends Currently the only sequence parallelism backend is `deepspeed`, which comes from the modernized Ulysses SP which is part of the [Arctic Long Sequence Training technology](https://arxiv.org/abs/2506.13996). There is also a [tutorial](https://www.deepspeed.ai/tutorials/ulysses-alst-sequence-parallelism/) should you want to integrate it into your own code directly. ## How to use sequence parallelism? ```diff from accelerate.utils import ParallelismConfig, DeepSpeedSequenceParallelConfig +# Example: 4 GPUs with sp_size=4, dp_shard_size=1 +# Ensure: dp_replicate_size × dp_shard_size × sp_size = 1 × 1 × 4 = 4 GPUs parallelism_config = ParallelismConfig( + sp_backend="deepspeed", + sp_size=4, + dp_shard_size=1, # Explicit: no data parallelism + sp_handler=DeepSpeedSequenceParallelConfig( + sp_seq_length_is_variable: true, + sp_attn_implementation="sdpa", + ), + ) accelerator = Accelerator( ..., parallelism_config=parallelism_config, ) ``` As with any other feature in 🤗`accelerate`, you can enable sequence parallelism also by passing the corresponding flags to `accelerate launch`. In this case, it's no different: ```bash accelerate launch --parallelism-config-sp-size 8 ... ``` > [!Tip] > You can also set the `sp_size` and other configuration in the `accelerate config` command, which will save them in your `accelerate` configuration file, so you don't have to pass them every time you launch your script. > [!Tip] > sequence parallelism combines with data parallelism. It doesn't require additional GPUs. > So if you have 8 gpus you can do: `--parallelism-config-dp-shard-size 8 --parallelism-config-sp-size 8`. Or you can use the `ParallelismConfig` class to set them programmatically. > > **Important**: You must ensure `dp_replicate_size × dp_shard_size × sp_size = num_processes`. For example, with 8 GPUs and `sp_size=8`, you need `dp_shard_size=1` (since 1 × 1 × 8 = 8). With 4 GPUs and `sp_size=2`, you could use `dp_shard_size=2` (since 1 × 2 × 2 = 4) for 2D parallelism. ## ALST/Ulysses SP backend configuration ALST/UlyssesSP implements sequence parallelism using attention head parallelism, as explained in [this paper](https://arxiv.org/abs/2506.13996). For simplicity, we reuse the concept and setup of sequence parallelism, which, from the user's perspective, is the same: multiple GPUs are used to process a single batch. To give a sense of what ALST made possible - it allowed us to train in bf16 with 500K tokens on a single H100 GPU, 3.7M on a single node, and 15M on Llama-8B using just four nodes. This feature of HF Accelerate enables only 1 of the 3 ALST components, so the achievable sequence length will be smaller. You'd want TiledMLP, Activation checkpoint offload to CPU, and a few other things enabled to get the full power of ALST. For details, please refer to [this tutorial](https://www.deepspeed.ai/tutorials/ulysses-alst-sequence-parallelism/). To configure the `deepspeed` backend: ```python # Example: 4 GPUs with sp_size=4, dp_shard_size=1 # Ensure: dp_replicate_size × dp_shard_size × sp_size = 1 × 1 × 4 = 4 GPUs parallelism_config = ParallelismConfig( sp_backend="deepspeed", sp_size=4, dp_shard_size=1, # Explicit: no data parallelism sp_handler=DeepSpeedSequenceParallelConfig( sp_seq_length=256, sp_seq_length_is_variable=True, sp_attn_implementation="sdpa", ), ) accelerator = Accelerator( ..., parallelism_config=parallelism_config, ) ``` - `sp_backend`: set to `deepspeed` here - `sp_size` is the degree of the sequence parallelism - in the above example it's 4, therefore 4 gpus will be used to process a single batch (while doing DP=4 over the same gpus) - `sp_seq_length` and `sp_seq_length_is_variable` are used to deal with sequence lengths. If `sp_seq_length_is_variable=True` the backend will work with a sequence length that may change between batches, in which case `sp_seq_length` value can be set to anything divisible by the sequence parallel degree or not set at all. In this case on every `forward` the sequence variables will be derived from input. If `False` then `seq_length` needs to match the batch's sequence length dimension, which then will have to be padded to be always the same. The default is `True`. - `sp_attn_implementation` is one of `sdpa`, `flash_attention_2` or `flash_attention_3`. This sequence parallel implementation uses `position_ids` instead of `attention_mask` therefore, `eager` can't work here until it supports working with `position_ids`. Also, please note that `sdpa` doesn't handle multiple samples combined into one correctly; it will attend to the whole sample as one. If the samples aren't combined, `sdpa` will work correctly. Therefore, Flash Attention should be the ideal choice as it always works. Instead of setting these values in `DeepSpeedSequenceParallelConfig` object, you can also use the environment variables to accomplish the same - here they are correspondingly to the end of the list above. - `PARALLELISM_CONFIG_SP_BACKEND` - `PARALLELISM_CONFIG_SP_SEQ_LENGTH` - `PARALLELISM_CONFIG_SP_SEQ_LENGTH_IS_VARIABLE` - `PARALLELISM_CONFIG_SP_ATTN_IMPLEMENTATION` If not passed in the code, `sp_size` can be set via `--parallelism_config_sp_size` CLI argument. Same for other arguments. You can also do the accelerate config file style config, e.g., for 2 GPUs: ```yaml distributed_type: DEEPSPEED deepspeed_config: deepspeed_config_file: path/to/ds_config.json machine_rank: 0 num_machines: 1 num_processes: 2 parallelism_config: parallelism_config_dp_replicate_size: 1 parallelism_config_dp_shard_size: 1 # Must satisfy: 1 × 1 × 2 = 2 num_processes parallelism_config_sp_size: 2 parallelism_config_sp_backend: deepspeed parallelism_config_sp_seq_length_is_variable: true parallelism_config_sp_attn_implementation: sdpa ``` As mentioned earlier Ulysses sequence parallelism is normally overlaid with data parallelism - same ranks are used for feeding unique data streams and also perform Ulysses Sequence Parallelism. But you could also create replicas like so: ```python # Example: 4 GPUs with 2D parallelism (SP=2, DP=2) # Ensure: dp_replicate_size × dp_shard_size × sp_size = 2 × 1 × 2 = 4 GPUs parallelism_config = ParallelismConfig( dp_replicate_size=2, dp_shard_size=1, # Explicit: no sharding within replicas sp_size=2, sp_backend="deepspeed", sp_handler=DeepSpeedSequenceParallelConfig(...), ) ``` Here we use 4 gpus, with 2 sequence parallelism replicas. Deepspeed-ZeRO is what drives the data parallelism here. Please note that a lot of magic is hidden inside [UlyssesSPDataLoaderAdapter](https://github.com/deepspeedai/DeepSpeed/blob/64c0052fa08438b4ecf4cae30af15091a92d2108/deepspeed/runtime/sequence_parallel/ulysses_sp.py#L442). It's used behind the scenes, wrapping your original DataLoader object, but you should be aware of it should you run into any problems. It also automatically injects the correct `shift_labels` into the batch dictionary, before the batch gets sharded across the participating ranks. Now the only remaining piece to start using ALST/UlyssesSP is to aggregate the loss across ranks using a differentiable `all_gather` to get the grads right. The following code does it, while also excluding any masked out with `-100` tokens, to get the correct average: ```python sp_size = parallelism_config.sp_size if parallelism_config is not None else 1 if sp_size > 1: sp_group = accelerator.torch_device_mesh["sp"].get_group() sp_world_size = parallelism_config.sp_size # Normal training loop for iter, batch in enumerate(dl): optimizer.zero_grad() batch = move_to_device(batch, model.device) # The model automatically receives shift_labels via **kwargs and uses it for loss computation. # Both standard transformers models and Liger-patched models handle this correctly. outputs = model(**batch) loss = outputs.loss shift_labels = batch["shift_labels"] if sp_size > 1: # differentiable weighted per-shard-loss aggregation across ranks losses_per_rank = torch.distributed.nn.functional.all_gather(loss, group=sp_group) # special dealing with SFT that has prompt tokens that aren't used in loss computation good_tokens = (shift_labels != -100).view(-1).sum() good_tokens_per_rank = torch.distributed.nn.functional.all_gather( good_tokens, group=sp_group ) # Skip ranks with zero valid tokens to avoid NaN contamination (NaN * 0 = NaN) total_loss = sum( losses_per_rank[rank] * good_tokens_per_rank[rank] for rank in range(sp_world_size) if good_tokens_per_rank[rank] > 0 ) total_good_tokens = sum(good_tokens_per_rank) loss = total_loss / max(total_good_tokens, 1) if rank == 0: accelerator.print(f"{iter}: {loss=}") accelerator.log(dict(train_loss=loss, step=iter)) accelerator.backward(loss) optimizer.step() ``` Note that models automatically handle `shift_labels` when it's present in the batch. The model's forward pass receives `shift_labels` via `**kwargs` and passes it to the loss function, which correctly computes the loss for sequence parallelism. If you use [Liger Kernel](https://github.com/linkedin/Liger-Kernel), it also handles `shift_labels` seamlessly and computes loss in a very memory-efficient way. Liger is highly recommended for long sequence lengths, as it liberates GPU memory by using fused operations (e.g., fused logit-loss computation that never materializes the full logits tensor in memory). If you want to see what HF Accelerate did behind the scenes please read [this full integration tutorial](https://www.deepspeed.ai/tutorials/ulysses-alst-sequence-parallelism/). For an example of an Accelerate training loop with enabled ALST/UlyssesSP see [examples/alst_ulysses_sequence_parallelism](https://github.com/huggingface/accelerate/blob/main/examples/alst_ulysses_sequence_parallelism). [!Warning] > This API is quite new and still in its experimental stage. While we strive to provide a stable API, some small parts of the public API may change in the future. Since this is a Deepspeed backend the usual Deepspeed configuration applies, so you can combine sequence parallelism with optimizer states and/or weights offloading as well to liberate more gpu memory and enable an even longer sequence length. This technology has been tested to work with DeepSpeed ZeRO stage 2 and 3. accelerate-1.14.0/docs/source/concept_guides/training_tpu.md000066400000000000000000000166761521253476100241630ustar00rootroot00000000000000 # Training on TPUs Training on TPUs can be slightly different from training on multi-gpu, even with Accelerate. This guide aims to show you where you should be careful and why, as well as the best practices in general. ## Training in a Notebook The main carepoint when training on TPUs comes from the [`notebook_launcher`]. As mentioned in the [notebook tutorial](../usage_guides/notebook), you need to restructure your training code into a function that can get passed to the [`notebook_launcher`] function and be careful about not declaring any tensors on the GPU. While on a TPU that last part is not as important, a critical part to understand is that when you launch code from a notebook you do so through a process called **forking**. When launching from the command-line, you perform **spawning**, where a python process is not currently running and you *spawn* a new process in. Since your Jupyter notebook is already utilizing a python process, you need to *fork* a new process from it to launch your code. Where this becomes important is in regard to declaring your model. On forked TPU processes, it is recommended that you instantiate your model *once* and pass this into your training function. This is different than training on GPUs where you create `n` models that have their gradients synced and back-propagated at certain moments. Instead, one model instance is shared between all the nodes and it is passed back and forth. This is important especially when training on low-resource TPUs such as those provided in Kaggle kernels or on Google Colaboratory. Below is an example of a training function passed to the [`notebook_launcher`] if training on CPUs or GPUs: This code snippet is based off the one from the `simple_nlp_example` notebook found [here](https://github.com/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_nlp_example.ipynb) with slight modifications for the sake of simplicity ```python def training_function(): # Initialize accelerator accelerator = Accelerator() model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=2) train_dataloader, eval_dataloader = create_dataloaders( train_batch_size=hyperparameters["train_batch_size"], eval_batch_size=hyperparameters["eval_batch_size"] ) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=hyperparameters["learning_rate"]) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader ) num_epochs = hyperparameters["num_epochs"] # Now we train the model for epoch in range(num_epochs): model.train() for step, batch in enumerate(train_dataloader): outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() optimizer.zero_grad() ``` ```python from accelerate import notebook_launcher notebook_launcher(training_function) ``` The `notebook_launcher` will default to 8 processes if Accelerate has been configured for a TPU If you use this example and declare the model *inside* the training loop, then on a low-resource system you will potentially see an error like: ``` ProcessExitedException: process 0 terminated with signal SIGSEGV ``` This error is *extremely* cryptic but the basic explanation is you ran out of system RAM. You can avoid this entirely by reconfiguring the training function to accept a single `model` argument, and declare it in an outside cell: ```python # In another Jupyter cell model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=2) ``` ```diff + def training_function(model): # Initialize accelerator accelerator = Accelerator() - model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", num_labels=2) train_dataloader, eval_dataloader = create_dataloaders( train_batch_size=hyperparameters["train_batch_size"], eval_batch_size=hyperparameters["eval_batch_size"] ) ... ``` And finally calling the training function with: ```diff from accelerate import notebook_launcher - notebook_launcher(training_function) + notebook_launcher(training_function, (model,)) ``` The above workaround is only needed when launching a TPU instance from a Jupyter Notebook on a low-resource server such as Google Colaboratory or Kaggle. If using a script or launching on a much beefier server declaring the model beforehand is not needed. ## Mixed Precision and Global Variables As mentioned in the [mixed precision tutorial](../usage_guides/mixed_precision), Accelerate supports fp16 and bf16, both of which can be used on TPUs. That being said, ideally `bf16` should be utilized as it is extremely efficient to use. There are two "layers" when using `bf16` and Accelerate on TPUs, at the base level and at the operation level. At the base level, this is enabled when passing `mixed_precision="bf16"` to `Accelerator`, such as: ```python accelerator = Accelerator(mixed_precision="bf16") ``` By default, this will cast `torch.float` and `torch.double` to `bfloat16` on TPUs. The specific configuration being set is an environmental variable of `XLA_USE_BF16` is set to `1`. There is a further configuration you can perform which is setting the `XLA_DOWNCAST_BF16` environmental variable. If set to `1`, then `torch.float` is `bfloat16` and `torch.double` is `float32`. This is performed in the `Accelerator` object when passing `downcast_bf16=True`: ```python accelerator = Accelerator(mixed_precision="bf16", downcast_bf16=True) ``` Using downcasting instead of bf16 everywhere is good for when you are trying to calculate metrics, log values, and more where raw bf16 tensors would be unusable. ## Training Times on TPUs As you launch your script, you may notice that training seems exceptionally slow at first. This is because TPUs first run through a few batches of data to see how much memory to allocate before finally utilizing this configured memory allocation extremely efficiently. If you notice that your evaluation code to calculate the metrics of your model takes longer due to a larger batch size being used, it is recommended to keep the batch size the same as the training data if it is too slow. Otherwise the memory will reallocate to this new batch size after the first few iterations. Just because the memory is allocated does not mean it will be used or that the batch size will increase when going back to your training dataloader. accelerate-1.14.0/docs/source/imgs/000077500000000000000000000000001521253476100170625ustar00rootroot00000000000000accelerate-1.14.0/docs/source/imgs/accelerate_logo.png000066400000000000000000000305551521253476100227100ustar00rootroot00000000000000‰PNG  IHDR ZÔÎÌ„iCCPICC profile(‘}‘=HÃ@Å_S¥"‹Š8d¨ND¥8J‹`¡´Zu0¹ô š4$).Ž‚kÁÁ�Ūƒ‹³®®‚ øâææ¤è"%þ/)´ˆñà¸ïî=îÞB£ÂT³kP5ËHÅcb6·*^!`Cˆ""1SO¤3ð_÷ðñõ.³¼Ïý9ú”¼ÉŸH<ÇtÃ"Þ ŽnZ:ç}â+I ñ9ñ„A$~äºìòç¢ÃÏ ™Ôú·�‹ë¶&ï—;Àð“.’#ùi …ð~Fß”n�Þ5··Ö>N€ uµ|ãEÊ^÷xwOgoÿžiõ÷ù]rÝešW%bKGD°±³pÅz pHYs × ×B(›xtIMEå9 N IDATxÚí�yxUö°ßÞ²u:;II „°„MPÄQ‘aqù© Œ ¢ã.Œã"(¨0q—QDÑqðC†ET@�AV•E¶$d%dƒì{oߤ»³Uu:IwrßçáyH÷­[瞺]÷Ô©{ÎQY­V+�@ Í *�@ �@ Â`�@ÐöhÝV²š³Pü ”Ÿ‚Šd(O†ÚB0U‚¹êJ@ã Z=h   ¿ž`èþ 0‚.µN\e�@ Z‰Êm6=š* ï[(ü wJ†B«Í!ác b"W\ �3¬8¿²>…ìu`*oÛó$BìLèy7øDŠ«/�[ –:Èü'œJ‚ÊÓ0j-ÄÜýŸÃ1 �@ p+ƒÁb„´•�ü7¨>Ó|[µÁ7¼µ 5‚ªTF°Ö• ò«à èÁä FÔUBÉi¨ÍkaôjˆºIÞ�@ l0þ‡ƒ²ãM·ñí¡‰àcuPÓÊ“F‚1ÊKàü/`55mœôy,”ö=�@ hgƒ¡®Ï…¬Ï€FN¥ö†ˆ«À T–6i ÔFÃù4(OmÂ`‰†ËÞ‚¨)bf�@ÐnCñAøq:T¦7üN«— }PÔžCK_8—%Çow?\¶B2f�@ ´•Á`•ö)[(í[°;£º_þy@YÇŽÞÒrN5¾Ÿ"x8Œ\úÞb–�@ .7¬føå!Èø¨áwý!2 Hw# xCU<äü EoØâ£¾‘Œ�@ „Áàª'öZøénÈùÜñ4ÐãЧ&7UE,䜅ÊLû�µz¸j=DL³E ]×Õ’0WÃîI �ïPè3ô'ÝØXÈ‚^>ÊþcS%ì½r¿éÒeΜ9¨T*ÙÿÞxã ñë¸ ™™™²çî›o¾)&´™Á`5Ã�YRJg[|£¡W/P'{ˆ:ª (bÇÛl©“6ožÛÝ%'Izz:«W¯VtÌ¢E‹(--¿0�@ Ã%kAÚ³�ó…ýdž> Ö<S‰|ŽAÜxiƒæEÌÕ°w*”ér“ä‡~P|Lyy9?þø£ø… ‚.AUU_|ñÙÙÙÂ`h’ä¿5ÜàТԴo¸¤‹Ñƒ¸q€ªþ3c©ôz¢®¨Ëüjjjxûí·�:ö“O>Á]j› A[`4Ù±c7Ýt·Ýv&“©Ó޵uCÑ8ö‚ýg~1éÖJÏ׎öô¼ÑÁŒÌ„³i4 U'äðáÃüòË/N»víZ’““‚ΆÕjåàÁƒÌœ9“±cDzk×®N?fç †º"øñNûPDïPˆîw yƒcí?ËÛ )]ccÔÆ�üöíÛÅ�E t*N�:Åܹs1bëׯï2ãvÞ`8<ª²l>PAì0 ¿óiIŸÁƒì?ûm>”ŸìÔ“£  €W_}µU},[¶Œòòr�ÀÓÉÉÉáå—_¦ÿþ¼õÖ[]nüÎ çv_¨ aCô8P�è¤j2C¸¼Bê?²ÔÁ¡Ç;õ䨳gO«û8sæ w�@à±±jÕ*¢££yþù绬” –:øõaìÞáô¿S�[SÖsã�ñ±`dÿ«sšHf³âPʦX³f�Øü(<–>ø€?ýéO]^Ê †´÷íKT«ÔÙMz ïìhN@èöŸ}FÊpÙÉ8yò$›6mrI_ÿøÇ?HKKw�@ è2ƒÅ)ü¢®ºÐbj�OýßÕg ã“N7ÌmÛ¶¹´¿ÿþ÷¿â×&ŒVQëÌOì7:jõ w>1Sêo6ï =× #T2adÞ:×¹¯Oç\8ÇYoü|,ŒPÅ„+Ëðñ²8Ùc>D�†ìïê?JN‚¸{A¥í“¢¬¬ŒeË–¹´ÏåË—3cÆ ôz½øÕ A§6¬8•dÿYäïç6:~¼)”�6‡b±Ô'FÚñ‹�µß…�ôh1ÝêZ=¸�7‡òÑ7¡X¬õçøþŸm &é±VœÃ7Gò2˜k¤¿+Ó!{ÄÎì“âÀ�¸´Ï´´4<Èu×]'~u�@à�È%Qø=Tž¶9ÒôÎ…PnÞȇ߄Ù É.ðâ/ïô ¦®u9¥¾Ùȇ_‡Ù —ÎQèÅSo·æ¥éP¤ª±rÞÊÚµk=ª_�@ ¸“Á�õ©ýßW�UyŠd‹UŇ߄5ÛæL�[ö8=(‹EÅêoB›m“]غs /Æ.mtá.¨Êðø ‘žžÎGÉ3~ÂÃÃùç?ÿ)»ïU«V‘‘‘!~u�@à�È{%aª„œ öŸù;w¬<ùE-ŸöàI=·\[âÜ9òuëÚô�Áƒ¡øb1*+dý?è¿À£'„’BSÏ>û,“&MRÔÿ÷ßÏ=÷ÜÓáã4™Ldff’––Fjj*¤¤¤�››Ë™3g0`QQQ„……ѳgOˆ��%66!³ ª««IKKãäÉ“¤¦¦rìØ1222HOO'::šîݻӯ_?âãã‰��§OŸ>ôèѵZMg£³èÂjµrêÔ)öìÙÃÞ½{9xð ƒ�þýûså•W2dÈ†Н¯¯Óç(..&++‹œœÒÓÓIKK£¨¨ˆÂÂBRRR0™LÄÆÆLXX½zõ"**Ѝ¨(ââ∎ŽnÕùÅ|j­Á�·LõûöÀÙȈªZ�Ìv*§Õç ¸»�Áœù�G J M�;–��/^ÌâÅ‹eóÚk¯q×]wuØ:++‹íÛ·óÁ°ÿþ&Û�9s¦ÑÏ Ï?ÿ<ãÆ�cðàÁèt:!³ÙÙÙlÞ¼™×_½ÉZ"MÉ:uêTî¾ûn®¿þz‚ƒƒ=þÆîŽºxóÍ7™;wn‹ívîÜi·ç¨¨¨ˆ¤¤¤F7DïÙ³çRÞ–ÄÄD,XÀ”)SdªUUUìß¿Ÿ­[·ò׿þµÅö-…i¿òÊ+ÜtÓM 2�F£H?/¾ø¢ìûYcôîÝ»Éï–.]Ê‚ É37 ¿·ÿ;4TÎEDw«C­j9 "&Üè´Råž#6ÂØº_ž6T6“±ô7¨-ðØ››’BScÆŒ!11€›o¾Yö9Ž?ît1«ÖpöìY^zé%zöìÉ}÷Ý×ìÂÛååå<óÌ3\~ùåÜ{ï½=zTÈlódøÆo˃>èTá±�7rÛm·Ñ¿Ö¬YCUU•Gþ–:›.Ξ=ËÿýßÿÉŠž:~ü83fÌ`òäÉ�ƽf?üð“'OfìØ±²Œ9ÌŸ?ŸáÇóè£�’’’âñ†§»Ì'yC�ƒÁàã|ùν™ÑCí+Y̼x_.ÏÏÎåwƒ* Ô›™tui«Îqã•åD‡×ñ‡‹øÛcgø½Cjµ•›¯*måe¬€Àþ¶;(üÁc'¥’BS÷ß?Z­ä 2dÇ—}l{k±X,lܸ‘þýû³hÑ"—öýé§Ÿ2dÈ^{í5jkk»´Ìd„ üùÏvIÜ}÷ÝÜqÇœ8áY)ç;›.ŠŠŠ˜3g;vìPtܸqãšõfUUU±dÉÆŒ£¸o¹¬\¹’¾}ûòå—_zl¶YwšO- 5g¡ÂÆšQ{�:«UϽ£€nA¦K ÷K÷�eÜeLYÆk�œaók©ô‹©iÕ9^˜�Ë¿^Lç‘[ ¹*±’ggæ12±ÞP™9¾ˆ~±5­×¾!ªyoŒ‡�ŸŸ¯¨ÐÔ¨QõQ"ÞÞÞ<öØc²�}ë­·ÈÎÎnó1UWW³téR¦M›Ö¦°žzê)ž}öYÊÊʺœÌV«•/¾ø‚#F´IÍ�M›61räH�¨zÚua4Yºt)[¶lQ|ìõ×_ßäweeeÌ›7�—^z©]ÆqË-·x\ŠzwœO- ÅîãÀþ@ëÚð`#«žÎbÜe<73ŸáýÚÞÕ¦RÁKsÎ2fXOMÏçOSϹ¦cGoKñ/x"{÷î•ÝvöìÙôìÙÓî³k¯½VÑùvîÜ٦㩪ªâùçŸwùzS¬X±‚¿üå/ÔÔÔt)™×­[Çm·ÝÖ¦r–——sã�7:µhµ'�Q6là�7ÞpêØAƒ5ú¹Ùlæµ×^cÕªUíz}fÍš¥è>'æ“3ƒc gß0—läÅûr¹ùw¥ívü}-¼ü@ÓœŽŒhÌqسP‘Œ]a.Àl6óÁÈn?}úôŸÅÅÅ1s¦üÄU+V¬hÕBÕ&“‰åË—óú믷«?øàÞÿ}§žb޶¦3êâÀ�Üyç�N»páB[߸q#K–,é�ë4oÞ<*++Ýþžì®óI†Áహ«s¤?v%  ¬ÿÓX5y5‚“'O*zb1bD#•¢ þË/¿pèС6ÏúõëÛÍÕéÈܹsÙ½{w§—ùäÉ“Lœ8±Ýe�5k¹¹¹n÷û錺xê©§œ>vìØ±�~~îÜ9zè¡»Vè�M×�e>µl0T8 :#ôÑÍYnÎÖ­[e·]¼xq“!9#GŽTtÞ/¾øÂåcIMMeÆŒŠŽ™0a_|ñéé锕•a2™¨©©!??Ÿ½{÷2oÞY[bë «õ?šúGFZ­GbÅ?Ûÿ»Ö^GÙÿ¶z ¥¥¥Öððp+Ò{”ÿýôÓOÍö÷ÒK/Éî °æää¸l,f³Ùúàƒ*:ÿªU«¬•••Íök±X¬;wî´ Ùý~õÕW�VæÏ?ÿ\‘¼ÿþ÷¿­uuuÍöyìØ1ëèÑ£]6ÉÈÈ�Ý÷Š+d÷뉺X±b…"™•þ{úé§=oQQ‘ì>&MšdÍÎΖ5žªª*ë’%Kd÷}à 7(¾·,[¶LvÿiiiNßÃÜ}>µìa09îÔ®Cà€VÛ‚ÎÜ—Ÿ~úI¶ÅŸ˜˜ÈàÁƒ›m£Ô•ö¿ÿýÏecùõ×_Y¹r¥ìöŸ}ö÷ß?~~~ͶS©T\wÝu|ûí·²ûNJJj1Ýe.//gáÂ…Š¼W·ß~{‹É¢Y¿~=£G�–Õï‡~ØáOÖBM{¿CÁÀßÿþw¢££eµ÷õõeîܹMz5Ù±cnw/ö„ùä„ÁP- „wgÏ5>ûì3ÙmçÎ�‹��O³mÜ臦xç�w¨««k÷±,[¶Lñ†®«¯¾š¥K—Êj»k×.Y1Ξ&ó®]»8~ü¸¬þÞxã Æ�/[ÖÈÈHÙ™FW­ZåTòWÒu±|ùrŽ?NEEf³™ÊÊJ’““Y³fÍ¥»©…û«¯¾’uŽwß}·AVKøûûóè£�ÊnïŠè®8Ÿd ;JUµ.WTy•†ý7„C)~¸ÚP¶XTJñcÝöÊ«4ms¥ós›ÜÏzm %…¦@^褷·7?ü°ì>÷ìÙÑ#GZ=–ÜÜ\þö·¿É~‚¹÷Þ{Q©”§¿õÖ[e·ýî»ï:•ÌV«•5kÖÈê'<<œÙ³g+–uèС²ßá:³¹ÔUtE]ìÚµ‹§Ÿ~š ×ëQ«Õøùù‘��ÀÌ™3Ù½{7ß|ó aaaMz°ÎŸ?OFFGŽa×®]|õÕW|ôÑG¼úê«<ôÐCŒ=Úé }ûö•ÝÖÝ"%µò Ö�ÙäpˆÙ¥ÊÚ¼?€·þÓ €^Ýë˜qcã¯,EÛŠõÝd†ïðéÖP2r½Ð¨­üß Åmpµuæåƒ’BSS§N%!!Áe†…-6làŠ+®hÕX>,»í¢E‹èÖ­›Sç‰��g̘1ÄÇÇKxx8¡¡¡ˆÁ`À`0 ×ë[Ì£ïi2gee±nÝ:Yç|á… rJÞÛo¿]–Wäã�?fÖ¬Y—2޶']Mëׯçšk®iѨm®�——!!!„„„´‰ŒƒAvÛ¶ éîìó©åÙ¥õ³Ík«àZ/ƒÉTÿÔ”‘ëÅËÿŒä£M¡LWÄÄ«Êðó‘_·¢ªFÍ–øì»rÏÛ¿Û1šUmsµ­É›´Ü¥…¦fÏž-»ÒY\\üãe[̯¼ò �?þ8N�GÉ^¥�ãMïûï]“ÍÓÓd–ë.å3¶È5L÷ìÙCNNŽb÷µ+èJº5j”âH„Ž@‰±$g‘˜O çSË+@ƒÅÏÛåÊ òoè±È=¯ãõE0m~me0T;dvÔǹµ± ´ÐÔ´iÓŸ#88˜%K–ÈÚ±cG�eذaŠÏUXXØ&ž’¶ÄÓd.--Uäòön�'²©�s�ÝÔ„.ÚN‰‰‰ÄÄÄtؼ«¬¬$''‡¬¬,Ž?ζmÛØ´iS«û•ûzUÌ'¥C?û¿M*— µ•«Wð߃m÷d>zhu[Ä*ë Ú¦ò¢J úxÜ%XÂÃÕ®¶eâĉŠâŠ¿þúk§ †âbùYåÆv·5ž&³Ò04�FÓ.ríØ±«ÕêTôˆÐEËLš4©Ý俸x¦¦¦rôèQvíÚ¥(ŠK í9_:Ó|Rn0ÔV‚P^ ¥Pc¬ Ó‚Á‚üA­übLUÚ¦ÔkZQäÊb�ÒJ(«£ P��õ`ˆk†�G¦'hÜó}(/4õÌ3Ï´¸Û¿).æd�[šuÑ¢E<üðò-`gßÀÀ@�3ÜAfwŒ[8räÕÕÕ-&²ºp¹îëÖêóçŸfÓ¦M²ÃŒ;“‡Á“æSËZ3$:˜€i�_ ¹EPU'-¦+Ôá\¤çIÆ„#V+TÕJßUÕâ˜páò~U èÕ|¨K¼VÍo{ëÊ_c¼5ÍnÅLìUÍe})¡m±‘©º¡LpÁ0JχÂ2iŒ«4æªZI¹ÙúàÖÞ¥…¦ž|òIT*•Sÿ¼½½×qw&ž¼ºZ~21//÷yõ4™Ý- ÍY] ](#<<¼M�æÕ«W3pà@n¸á†v3ÜÍÃàIó©eCð0i×ÿÅì…5¹ÐÜøÌi!5@ð…ÍÅPT.}wɯ¢†Pƒä‘T*xjz>s–Åb±Ú_̵ŠGü½¸\'Ù7µ–Zö-¨€¿ø{1ÂKC™Ÿ•5Õ&¶Ô˜ìÒ"¨ÕVæÝYHƒùQ\ç+¤Å¿ ™(.— …æ(ϱÿ»ÛhÜ%…¦:‚U«Vñûßÿ^ÑæG%™"ÛÓ½Ú™dv·0´Ž4º’.š*QÝZvíÚŃ>¨(œ°³zµ¬5•B¯V~¦Â2(«‚‚(,µ7.¥�_ré£~±5Ìo猪S³"Ðû’±ðˆ¿*“}µŒð’n¦j�èuÌó×a{{�9¾ˆÄ^?¢¼bI>K2”H²:á*êvƒÛ^ü²²2EÕË:‚-[¶´éMÄÝ©À�K¾~/è!½ï¿èMpœ»Z-ë¥Ùv±=_?ШQ©àé?HaŠ£ëÖÀX¸ˆ¾ qŠ�–ª�% ÷�J›p o‡Ú¾:é©ýâ}�QòØo²Ñy[¸â¶ ‹YMÞi?ÊÏ{aªU£õ¶`­#2¾ŠM ®¸²*é¶Þ™|<z)·Dc¡,&™WøCèy·sG]DMM�Ç=ålذ�S§N‘˜˜Øb[%¡_[·n¥²²½^ß¡ãó4™CBB0 ²ž÷íÛ‡Édê�*’B®ÅUOâJ«ï»ï>Þ|óMÅó]É^w2i]àl ì щ`VÙ=Páà9((_oiã¢ã“yš�‹¿ÁõQA·»( Η70ì&¯ÆBTß çFzÞáb„ÐlQ µZCw†Ñ^æ‹„öƒný@c�3Ç¥|—tººC †Ã‡+z¿ç.|ûí·² †ððpÙ:Ïœ9C¿~ýœ–kÿþý¼òÊ+$$$н{wºuëFHHAAAØ•‹öõõmôæäi2ët:f̘ÁÊ•-{Ë ÈÍÍíДÂmIWÒ…« %©�Ÿ{î9§Œãªªª6W[ž4Ÿ ¥‡ìÿŽM€Ú .Ñ(¨ ƒs¥ÒÂy‘Ì|ˆ‹��ûX}áµCΣª®á|€Ÿýâk4IOï�.~’rÜd ½" %cºdð7ÌXi2C¦Ã ÞK Ññ ­ËÏ`bÙ %ëRþòË/=òfµxñbî½÷Þß÷ët:î¹çÙ!£Ç�oÕâûÛo¿ñõ×_Ëj{âÄ ú÷ïß)d5j”¬›@JJJ§5„.”a6›Y¿~½¬¶7Þx£Ó•YÏ�;çö†“§Ï§Fü‹¤c˜ŽÞüºII�ŠËë¿Ï,€¸p°}ç¬÷‘¼ÕµRâ¦`=va *DÙ çʤã´. 51™FFD4¶Y¥�K�dÖû8Îz)”ÒVö„øƒª¢Yv$ùùùŠÞ>ýôÓm–«Áb±0}útÙ7�òòröïßÏM7ÝÔbÛë®»N¶ÜëÖ­cêÔ©NÝL&“lù›½ùyšÌƒ–}εk×rýõ×;õdvðàA^xáèÑ£G£Þüýýñóóë� lBò©©©‘íIKHHpúù¤ì~_yåÅit-‹¢Â]×\sM§’ÙÇLJ?ÿùϲûZ¸p¡¢÷ÊÙÙÙ,X°@ö|9rd‡ü¶„.ä£$[äÎ�;G˜L&ÞyçEÇ(͈©¤¤´3Ù6=e>54Šqë'ÉA3¼á! D‡ÂÅ ƒF“ôzÂöUFˆ¡>�AQ…”*Úîjè Ð!á\T´¢(GEMÃÄJ¾ £5 J$™¤Gàúú�…L›ŒŽÁˆ ³íRè¤f8œØ'éJŽNÛg MµõNü��–.]ªè¹OÇÓ§OWdˆ¼ú꫊vVoݺ•·ÞzKVÛÉ“'Ë*Õíi2O˜0Aö¹7lØ@RR’ìâ:F£‘¤¤$ÙýÏŸ?ƒÁÐa ¡Ð…<´Z-cÆŒ‘Ý~ÕªU²ŸÒ�F#ï½÷ž¢×®µµµmfôTTTtÚùd¿úŸÛ¿-l¯T '¾†â`Ð5â 1=¥E×h’žÊmÓ%ÚFWH¯1l‰‘)]Ä äA�¹ÑkŒÒ±vÙµÒ9ì´h–6DÚʨ² «P‹Z ‘¡RTG¯BJº17q#ÿm!œßÛî?ÔmÛ¶)jà íSãæ›oVÔ~É’%²Bކ ƃ>¨¨ßE‹QXXØâSú–-[ÉýÄOÈ }ò4™{õê¥Èà[¼x1 ,h1ùTUUIII¼ýöÛ²ú5 ÜrË-º ]Ègâĉ²Û._¾œ÷Þ{¯EÃ8==�¹sçòøã�+–GéÓ¹cìûï¿ï´óÉÞ`H}Ë~‘Wk!¸èl¬«Â#pbX޹LЫ—”¼©Ö(yºˆÞ[ò4€d4– )¦›Ã]Ï*EY¼ª3IÇ8fbìÙ­á«�¦ÞH ½°'ã"yÅRÞ­zD@€Ã&HµAÒÁñÿA¡Íž�^Ò™ÚöÆk…”7ÛõZVVÆâÅ‹e·=z´¬FW0hÐ F�–_Õ³  @Ö†&µZ­ÈŰlÙ2®¹æþñ��œœLii)&“‰ºº: Ù»w/�<òˆ¢…wÒ¤IŒ5JV[O”ùž{îQ”Gâõ×_gèС¬^½š'NPZZŠÙlÆh4’——ÇöíÛ¹ãŽ;d»KAÊÙá ¡Ð…<~÷»ß)jÿøã�3gÎöîÝKQQ&“ £ÑÈùóç9xð K–,¡wïÞ¼ûî»NÉSZZª¨}ØEºÌ§óµk×RRR‚Åb¡´´”ß~û�O?ý”×^{Í£ç“Êj[]âënPg³Èu'¤Š•^¡¤²m6ÑùE@¨7ø:x ,^�ŸåÕЧ{ôÊÍúŠLR˜¦->:ˆ•©Ä¬‚†^‰ž óD`¿žÛf³´QÓàa! sL gÒ ÊFΘk (êŽ�Õ^à·í6žˆP˜œßn?ÐíÛ·sã�7Ên¿fÍfΜÙnò­[·N‘;~Ö¬Y|üñDz6C­]»Ö¥n”rìØ1ÅÆ—§Éüå—_vØSí¤I“ø×¿þ¥èõYff&½zõ’ÕvÅŠ<ñÄ�Vo¾ù&sçΕÕ6##ƒž={¶ZÎÒÒR†NZZš[0ï¾û.=ô�ìöéééôîÝ»Õç�]º %€O>ù„Ó§OËj{Çwð /tÈnÍš5Nyjõ:¤¨ÐÔ³Ï>«h°+ñóóã©§žRtŒÒ½�†[o½•ãÇ�3þ|—Êÿì³ÏrèÐ!¦L™âÒêqž&³N§cúô餦¦òÌ3ϸLVƒÁÀgŸ}ÆçŸÞª”Áí‰ÐEË$&&òÍ7ßÈ^Ø›bÈ�!lݺ•¤¤$BBêCæåFÍŸ?_qý‰Ù³góþûï·Jî–B¢Ýy>Ù ù[í¿�ÂÀk ßdP{Áé­pì)ƒ×0PÙ,ÌÆ<°œwÝÌrô’[›IçivøÎ•.vS.˜l"T:Ð ƒ¢ øm§¤�ô�GÁ€A’îìt»­]~Œ7nTÔþ÷¿ÿ}‡Þ<ÆŽ«¨ýªU«œª ÍË/¿ÌéÓ§yï½÷2ĹtÝÇç“O>!33“W_}•îÝ»·™nÙ‡U~7ÊlÞËu6iyÕ~`í »¡öÂÆ� ÞkßΕ$çØÌ‘#G8tè'NœÀd2KLL ÄÆÆÒ§OzõêETT”Kö‹uÔ|²7öL�¼Íõßöº¼R‘j6Û  S¤ÿLÕàqÁõ!…®âb>„‹øz5 ¹¼HV!ÔØì+ˆ�l˜Â¹Õ-¤Ÿ‡º ÐúBÜ  Í³Ã&•ªã!Ë&ãW÷IpõF�@ ðDìÍ´èÛí †Œï!ú¨´wo.Õ¯�ÐT½¥�F󯮗®Ü¡ÐŽw3Ã|¼ì †²jöw±Ii‚>×_ø˜�c!6m”ùÁ‡ô Q·ˆÙ&�ÅÞÃ`µÀ×Áù} u ô¾¬'íÝîm‰E©™ØEĆKY£º²m7“¨ w,hMí#¯ÚOÊ[qú¨s(z8nøÔ:1ã�@Ð €ÊtØuT6’UÏ'z^ Ú\0æ¶�TV §ªl<o½4:Pkê3HZL`6�±Š�Å&ZÂÏz„5Ü<éJ´Q`Ž€Ì½PÓH¸Œ¸f èãÄlA'2j `ß­p~S‡Aäå æS®÷:”BI…kú ö‡n�.ö&èAÓÎçAÞÏ4ȹp‘Ыàw_€w¸˜i�@ è„H¯'Ò?€c ¡®™DZ?ˆº z°dƒ¹a•f䟇Šj׎2À"Â@et¾M(¨c ¼Îþ¦fŒ$¯P¸âæ€J-f™@ :±Áp‘ºó�úwH[)yZ\œc!$üüA] –B05“Cš(¨¶@Ön0:¦þUÓ J£Ù©¥c#6¼ôREI_5˜sš7l´Ý@_¨ª€¢ÓP–Õò¹½Ã!þAˆ¼BÄìA2.=ý×@Ö§�ö>”(ŒˆÐú�>¼  ó‹ŒP[gšY€»Iïÿ}¡<j ÁX*U~4_¨Y¡ ­¿ôOß PvvO„Úf ÿhð6€ÎÔ*iD]9Tæ7ï=hŒ aÐûAˆ�1«�@Ð… [ÊO@Ö:È^+m’l ‚/‡+?'Ó V$Ã�3”7rÑ÷†˜é{ˆ™$a04�ŠBî×P°]Zœ-ÆÖIäýŸ�¸Z†h1J¯RN%AÍÙÖõ¥ÖIž„ðq5E2hP‰$a0(Æ\%Å?I)¦K�BeËš‘@†~6ºO†ˆqRFEWb5Aþw’asn7”Ÿ«¹éöºÉƒ8Að¹4~bÆ�@ m†± ªÏHûŒÒ(ë‚À+|cÚ?¡‘ÅÕÙPWb/�Æ|£%ƒA A; �@ <‘$@ �0�@ ƒA A;ðÿSfþ›gùÔóIEND®B`‚accelerate-1.14.0/docs/source/imgs/course_banner.png000066400000000000000000002346611521253476100224310ustar00rootroot00000000000000‰PNG  IHDR°× Ÿ¨> pHYs  šœsRGB®ÎégAMA±� üa9FIDATxìý  'GqŽê]»oïK÷±«�ÀŠÃˆ[â6A p|#�ã#!;qœØ–"œØN��äg�ìÄñßæ�c;Ž!aƒ$!t¢cWÒêÜûÞ}Gÿ§g¦»«ª{æ;ßwìî{¯KzûýNOwUuu}ª{êÛ3Cè“Ì?¼Ãïa#@—E«ŠÒâ�RµÊù÷F)ŽiŠíEÛ^äÚõ£o‡óejiï(QÇëßC§¾úÙ¤G—ö)uå¡ÚöÔ¹_�f¢,Ñ¿ò°Ç8ùæu=Ò<{´#V-¥Ci+ Ùöh×iJvîSN'>ÿq{Gÿýñk«—ñ/tÊøï@ÿÝëeü§UÉøo/Ïø�Û;Êøï�_[½Œ¡SÆbv9®ø[ KÏ–�_}Ï4´³øÛTÿÝVü}žˆ6õà³—š;~âJ âŠÂ).±·:X)Ð7”¥ÚN…DèU·M�9DÇZ?úƒ)Ó4ý¤+͈mûÔµ—ýœNGÄÎ=(©CÆÿ¥ŒÿÙ£ŒÿvÊø?ú”ñ?{”ñßNÿGŸ2þg�2þÛi!âñéÀº·ɬór2köéÎâï†"‘õé.•{z޹ãÇ/Åàà§Šo¦� ï@Óá3ƒ(žñ‰ _ÝXý^º4žW2‰e ;µwçù‹A‡~ôm¿ž‘}D£ú³¥ŸB¿.¼ë:³²@˜É¾Ï†ü¶¦3�[dü·ÕÏø2þ1{”ñ߬ÏLQÆ�ÈøŸêùÙ–ßÖ4ã¿#Cdü·6@ÆÿTÏ϶ü¶¦ÿžl"kÝ›s"köiSñw}¯D5�0w\¹ ƒæºâÛãê¦�….7ÊiY=4½?š„ %/ &§¬ª‚y2€)‘¬Nò\Š(æ©i⺞¶s}ÐýJÊKñSŠˆ‰*Q×›%¡¼`Õdc®”í}�ÚRƒ�O­«b™–QGý7Hûzè¡ûÕ±®¼,šdµNhb؃¨½˜ûHjlRõ’XÏø�)ã_ꆌÿŒÿŒÿŒdü#ã?ã?ã_ÈCÆ¿ÖÿsÿöÃãß ¬~52Í:} U"kgêdÒã‹äÕ ™Ïcv‘¯U�_9äÚÇÔ¸›Âi(.ñ%}52tÀq ªmģˀfÜš–OMZFdÃD°ëò½‘8¨¹ (Á)=ÑÌÓUjí¯C­ ÚÛ7ۦ ›’ŸœX˜�‘â›�/øu°™Ö±ÕÐÛox} y~Kú0Òºõ++ã?5ñÌøOóÎøÏø×|5eügük›Œ­SŠOÆÆ?Ó?ã_õ‹Ù)¾ ù‚_ÆÆ?㹪H`�ô£ÀàdšUÚTü½.õ|¬È¥ÊäÕ ùrñuƒ¯Á�¨ôÐIˆ@  Ð;è÷j§Ë’A®>a¼9ÿ&Þm hã4ôKé4¬¢ƒ«SE´R[ß„^=x÷ l�}aýšÇ©é<±/þ‰. 5é£xù2´Û©­¼I�¶ú)¹¢M­c›�hÞ)[§ø7�} s©ãH.2þu ãŸëžñSÆ¿<Ö:õjפ”.ÿ¬ b>ÿ²nÆÆêü3þ%ïŒÿŒÿŒÿðÝ’Ý�uæ¯ä[ gŸ6!‘ÄàÕmƒør1HJÀ” qŸŒˆ˜3×Ç‘“è6P¼HŸT¾DqbòÝ—Ïu2ª¾wV’úðó\5Ãåð“‰v¾�az“ >�  È ÔkÒÓfócÃÚ˜Dùj0S‚oÏå˜DÝ”݈¤ÿ8å¹.Æj5±»ñÓöŠÄzxQ—$R}rõÚ‚]Ó ß/^Ñ0~$ýÃ}á}$æ8—ºFËfãÆëza‰¾kžh°÷ñŒdük¾Ð�Œÿ TÆ¿>™ñŸòÙ¨ïʼMƬÆ?2þ¹ï“Ô‡ŸXær(©oÆ?€ŒhW'|¿xÅŒÌü�mý­ê3ÓlÒ†âïsƘU¼Px™ùΕ-J>(·|éÀúØ••ܨ½Ž.sÁ[8L µéÕ«~Ïóµ"ZZô2F�Sй­ñTêu%ÆÏë¥dtµ_?cѵMÊn]ǣ˹¦ºâ×êÀ³¬ØÌGûW›N�d>ãÖ ‘œ„¯'ý¡ /dügügü7ñÉøo.ËøGÆ�úº­¥ŒÙ>ã¿wýžç3þ3þ‘ñ¯ëgüwÃÿ¢uÀÿ.ïÄš}ú]ãüȘ;®¼CøTkS1¸HÇÓTùLÄ^áèM•\…Tû.¯y·ðklÓ�N¬ílÙ­MÏŸ•÷+³sžAš!»”÷jOG÷é{ëˆÑ‹ýòhÒ#ã¿¡M?:!ã*”ñ¯Î#㿤ŒÿvÊøl2þû«›ñß¡M?:!ã*”ñ¯Î#㿤£Œÿ¥çUI¬L³MöVÂ[í—p á0®koCÒ¨¹ZIÆP‡ßǹV^¦™OÒy‰ý�ñnšUß9 ûÒ©…u[YkEêQ¦tÙçºn¿�†zUˆJL�˜ ÛQ\NºœZÌÜÜ¡xòªŽM�vŒú£”v0F/Göp²D…¦†íU¿Œÿè{Ư QIÆ?§Œÿ¾Îeü·”eü7óIœÉøO~m¬›ñÏøïU!*Éøç”ñß×¹cÿûîž½™f�>å¾”È0ß¹òÊb6ÈÕÄ$ÊÓ í´©¶<ëO“♩æË‹ê’®oàt0J)#Ô�åFñMýAÉMٙ˗õ¤T“l‹ž“WêœSƒôø6ô)y>–%ô/ì@”Ò]ÿ¹Œ¹"<ÏúAMú˜>úQ}§H/$êµÕÑãFRý¨]›_è¾6�³iÑh÷•^ò�ŒÿPC–gü§õ ç3þ3þ‘ñ�v;gü#ãÈøÏøGÆÆ¿§&Y¼N“.@»¯ô’dü‡²\áß&°>†L³JŒ1WÚ/Uj—èjéLŽ´ÃIg3|ð(5ðH”¥‚©ÚªŒ;¥@©«»/•çE‘“5’§äj»!n'äÖŠxV)ù¤¾¥d£Ãqªœ÷�—µ�·�ŸˆÍ©ñ4l<›ìÙÂ?ôÐã»æcšÙwêsƒÿQ“ý\‰n—àO© oTYÊçRö11MÉE�nļ3þ3þü2þã:¾D·KðÏøG«Ý¼Î û'ùfü7êéÜ˧:ðËø�ëøÝ.Á?ã­vó:'ìŸä›ñߨC¤s/ŸêÀ/ã?®ãKt»ÿŒ´ÚÍ뜰’ï1€ÿ§þ ™f�®°ÿ ˜;®ÜP|^T•ÅAI‰¯Ä·Ï™–ºèÀ¯­ wFÓ6]PÜ.ÅS¯”_¦%â†ÌÚöâ¡ø9»õÜŠšêõ¬"N«DªA¯¾w9�:ð�؉1éãšêRý(ņM8Ä\ŠOÛqÅ,]!1††W6ª±rRu8_»qgÿ�ŠbGoþµ£ÿŒÿ "ã¿þÈø—U3þÛ)ã?ã?]-Y7ã_V‹(ã?j—ñdü#ãßdüÏ:þ÷=PÝN˜i6éRc̆�ɼÃ%‚Nì—Êi©aä©cYê|e�w^×g‚ùwļx§ÌÑÖÙeÃ?ë -d´s™œšn WúÝ& Nh¶�«Æì4ŲE°oO£ÚþëAÓ8&d™o§7ïC’X{>œ�—a½e¤üC¬³–—ò'ÿ– $Ç�4?¨¾ð> = Ú‘ªOB÷ĸ‹2êŽÅŒÿPÆÛeü#ã?ã_ÔÉø¯K2þ3þ‘ñßÿÊøWõ$¯Œ4eügü[øî¯�iÖéCD—&º(…mé»öÓ×açSA²í•”â �WÅÛÕ�ÔÑ�3qUA‰·Óõà;¶Q�bÞ†É0`¶!VÇ5%ÙýF­³>ïWª­Ó�ë¬Æ© ƒçzÂȲˆ“[w>t�ÒQ4a"(Ñ„ke`úéóÌàö®?”þ©É&Ö¦Qoÿ“hì¸\m~läÂÀð>4ôßõSø€¶E‹î—ãQó�$dügügügügügü2þ3þ‘ñŸñ/êÿÿÿmø·»°&öƒK�iÖh#™ïþä…å/‚'‚‘¦ûQÌ12ˆñó‰8*'Î7É÷ÌM8W~p0µðnЦæ!‚Ú©‰ä§¾·È1<ˆ$Á�´ÝzéÔV·«½štáõ›úÖ:¶=Ä4ÅöŸ)¿*WL4ŽU„•cÚSf×që×~mõ2þ3þ›xfügügü7ë düóvÿ}÷IÈÌøOËÌøoçÍËzéÔV7ã?ã?ãúø?ñG€µoD¦Y£MÅl(¿² èµ�$¨aPýÀ¯ãÊ´·Ç"B#b2©Á¹�lKµÞ”¨“Ô�9¡ÜˆÞÄäÓ£®î1}x5êS­«éªŒAÂ<âªcrò[úíN÷êŸÜ$‡2UQ:.¿G?ÅäE-6§šµî;âã¦rbz:_$­‹ ˜©_«Oaû„^¶Iß“Úëq"í£é1Ïøoh—¢ŒY/ã?|fü#ãŸëŒŒW˜ñŸ�—ñ/dügükÊøWÍ3þ�Yüï¹™f•VYO]…¤SSÚ©‚·ÄõŧþÎy š¢½)³¹%‹Ë'_%ím¬�ÑeAVàEqàÑýÖL6QÃ9Ò:šì~]à6feB'°1Ò�"!Ç„óƨve!XÛÄyâýMéD� º Åu�IðJÉ`6!,B5jàÃÚ&ÇÅu¿>ö, PU$•êêñøXHžµ¿%mV÷§ÑJçÈŽ©1£èOú‘¡�“…f^ÿŒ¯óņsÿ }XÝŒ_–ñ_Ù(ãŸÛÿî3ãi;¦ÆŒ¢¿Œ-3ãßSÆ8ö,2þ“¼2þ_ç‹êÜ�Ç�iViÕ€3¾I:µj§KƒˆŸO1"¤äRTYLj´iŠŸj× ->$*]·�OWb  6û4}G�ò ¨®Émµ> §øq;¢ƒ.²�AÂvpø'Ŧ×8é€ÄJÚÏ —%úüˆåºàÏÆ(å·)›FÝîe3. ǽÚCŒuìeüóSÿ1?nGtÐ%ã_°O脌düK}2þ›øfüÇDÍÇÿ²]ÆÆ¿“•ññÍøç§fÿ“€±mÈ4{Tî4Dh»OØD_�k"À¥‚][Pï#àSäÐS'“à¾ûÚÁF}QC4íuM �TSÃë5ö�Tƒ~Æ)€ØO¬nÚ¨A*¥”m¥Ö*Ô$§ÖRÇÑh»lDÔz\ýà•°I¤™l3Süu !ƒùSÆÄ=|Íø�«fü'eeügü÷EÿÿÿÍ<[ªfü'ydügüu2þ»Ð¬âÿ`Þ…5›Tz¶ž©tç¨!¹í“êrˆ?ÑNñ«ëë³íŽIêÙm¿0@ö‘´Ž\j¤/%ù�®ÓzÌË©EVº-µLB؆ñ§”� ƒ‹©§™Nýú!u#^Ͱë%ù§&�”~ºEOÎ+y¢V�“55óÑÙöj†b¾mš"t ÐÞIm?vß-ÂgÃy‚à¡<<ãÿÿê\ŠOÆh‘ñ�ŒÿØç2þ›$füËvŠ_]?ã=Ûfüóvÿá3ãÿ˜ÃÿÄdš=òîâW}Ÿo匀tPÈàEì»K3ûv¨ ¸S‹ó<`ÿ½Ñ¡>¨Þ0À•pzëc§�º”íM�éßX d%œ˜Áéc”Þä^ù©ôävÅQÃË&i/û�þÊl¤Þò jD?HÈÑö‰åR}¾4›T<ðOúðæÃúHÎ,uPÒo§P¶€¶±ÒϪf„ÁT;bm¸ÊFŒM²/|ì#?`|Tß|L*„q=™d哱M%ÅA1U?áÓÂ&9I%UÍø×Íøü•U¥ÿÝ&ãß3ÏøÏøGÆ?×'ã_ê�ñŸñ/Ähý2þ�ä˜Hÿ8öðŸiV©Ú[(pA*ž˜o|üLðùÊoXpi ¶ŽQ¶€Èü:Þ€dÈL+ù1×�4üIÈ$À Åš X(ð@ %ƒê &б`ËBÿ•…")âö”Eþ‹˜Øw.‹˜�Á†�”͉Õw…JŒ˜¼¡ú¨í >I·|â«? 0±Û��’£úbLª�.KØ]ð%åGu#é ±Œ†ñ$„{Ò…_Sº²«Êùx¦–öÈøW¦Èøm2þ�ŒU/ã?ã?ãŸñ%dü#ãŸ3ÌøÏøÏøÏøÏ4«¤n¦Xå–P准;FÞ½ÅýöÔ0ž®nBvÂß|—Rç ôãú çÖ:ÿJ÷ÙŒdü#ãŸÉËøWN�ñŸñŸñŸñïydüׂ2þÛLËÎø—Ÿsÿ™f•†‚òHËAç‚C¸Ì,«ueÞ“ჟªÄÔrLs½B¦¡ZGü¶A/ÅɈ™ûí¸A£H‚aÑ—"0Q­ƒD¼ *UeJédŒëh(Wõˆ÷‹÷�¤¦²¹‘­yˆ^£@¶•ºSÞþîÓð~1Ôr½)±e7DpùÉeek¨6^v΋äÆHŒ‡�²›S&;)#åC|ã¿»nÿ’§ý’ñŸñ?EÊøÏøO3GÆ?ÚÛfü#ãÿ]Ûgü7œÏøï®[¿ø?ëZ`Ñ©È4;4P  òÿ2Q a&<=v^Šeµ‰¡9™–úµ`Å—:éæªQƒR=å:ÙŽ/êþ¹ ÁDEílêI¦QG“l„Lë:$ªúØÀ¶ÌR²]³hÓ Ú÷»±=‰i§Sêm¿„ÍEûD©©NÉãFšü†½‰Dµ­æÔ.ßÌßø`œñŸñŸl„L3þ3þ§Eÿh§ŒYžñïuÉøGÆ?2þ3þ[(ã?ÍëHàpIN^Í2 ”>Lþ¨H[þ[û¹ÄIq=’Ÿ" ô�¼FóKVE=¼¾¡a“î¦áß”TÍ£ü”�ëGÚ˜:êl¥Ç,`JÈ¥Û EwÇ'<æOZ#zNIúŒS”dË ·õ)ò79Ž|œSEbBƒØŸ¸mx�^6èâ³^t+©©a²ËE 2þ…¬¨<ã¿I÷ŒÿŒÿ~0”ñÏyfügügü÷îCÆÆh—ñïÕA·±’šfü#ևˊʧ�ÿÅ9y5Û4äMnšª„û·)T#ÊåY#Z3�ÖŽ+ƒ0|+Ò˜ßË×i²Öõ!�%×>Õ/ @#êK'NÁ1~•ìЭª¯ÄÎÅZh[jý¤DÝ:è]—Ízµ¥†Ïf=Áj´�?׉W#à-¹Iû¡5°…pšcç+Fù+ßΌȃ‚îÜþ‚¿Ð)¸y¿M’#¯÷ˆã¦Ö—Øgù¤ÇŽü%0žñŸñŸñtÏøO×Èø—-C‹P’ñdüW-Sy½¸Gÿˆädük‰ºuл>Îø—¼¸žÿeüÏ"þW¾ ™f—ê=žÍA.àVÖ C×ìx`i®gB% ÁUÀåE­Aa' ðŽH ÁB´Ó¼c�é¶þ$ ì»Q ZíD¼±²pÛ›ü؈*©›iŽLž o¦õ¤æ€èûLM}‘ºDüIOŒQB·Ð>„wi÷=ªqØÑämÅú�nÇe¦äLy&j“î'?¯Ëãó-2ãy¯•gÆ¿/L·õ'3þ3þµœŒÍ7ã?ã?âŸñÏÚdügüK~ÿÿü¼.�ÏgüSø_r2Í.±›”)|ñq‰GÎmñtuSDqI±â¼Œ¸aY×cß5þ�=ýà5jfPH ¨¡b< !ꯉ¾Èïœê»³³IÔQe”àãdž?± ”©qb¼Å¼ÁêÓîÅÌ’:ª+”�›Šì^œ ÓéÉŒ˜Îµ ½)C:h¥Æ1,�?¤ã¦8ÐcþKb^ZïT%õmšüÓy§§A‹Ofügü×jdüó*P¬äAÆ\Gj—ñÏ¿güÇl3þ£ö)ÊøçÇÿ�_ÆÆ¢^Æ|8›ø_Z$¯òg�|P`íî³.‰;)‘ô<› W‡Öž´Ó;ç3PçHò0Z¾äËë:ý çCJ/ï´„èµ°¥>.ƒKÌŠ…:!¸ºI�B]?=oø>ùû€Ëräð@Ãeòú¬¾}ÍC”ƒMDÜÆÌ¦AwÔÄÄÉù �Øï<êI‘•ˆ„ Áì�09rÜ}ÿ¨íiø8oEö�è%ƒ±/7²ïž§ò3áƒJ‚÷WH›ça|“ÔØk|(ü%ùq^u™ ¶I¼±‰"ã?ã?ã?ã?ã_�[Æ?2þ3þ3þ¾›ñŸñ/8'|@Æ?óå6}æ#þ×¼™fŸÈÜû3Æ7‘¹,AÆî­u](¯S}Ùkv¾b¬¤ªr·‘¨§Ê}Ýúœ×É5ÐŒŒ>t}©X3Ü ™Î©Ó¯ÒlP˜õK뙤(˜J¢¶Mv3‰¶HÞ¶î þ>ñ&~&Ö•ÛG&•O5Ù�÷HúŠ¿Ïšd}y_;zÛºé\?õScã'ëØ·üTE!°V“K݆�¡÷En #EÚÿõ|ûkß�>�ÏøÏøOµ‡Ö!ã?ã?ãª_ÿÿÿ¬B°,Ïøí¸ÿÈøÏøW:Ïü�ž œñkÈ4ûD“÷üŒá™”"1~ÂÉâêãF�C8¬�­Œe/>�e){ªf”}X[†¶)ƒ{Sýnº„ÈÕ«¬A�ºz/=;Qlj¡ÙgúçWñb�×ýÃzYæÐ4d6ød£^@2è:"¡l‚_´x`}hð�´o¢»-‘ñßSµŒÿ†è)3â›ñ�Œÿ”2ÈøÏøÏøÏø‡î—ç˜ñ�ŒÿŒÿHnÆ¿hÓ�fÿgη ¨¶í…A []î $ëTì<÷ÀØyí÷àŒä[Tß+=„ûSUÎu”íIÉ#tÎ?&ÇGl—T<«:Äú@pÙ[0U;RyO„Ó‡úœ‹Ö-¥½U11Q�¢X~°ÕAQ×åö“:¤|ÀêITô��!Æ“×mˆÒr¢ñ®‚ºó�ÈöäêPP ÑßP·Á÷C•4T aC«G°­QÕ)ÉÎø>$ä0¥O2Û3Ÿ3êœûÌøÏøçu2þ3þu[­\Æ?ïoÆ|.ãßùMÆÆ?�ñŸñŸñ¿ð�ãÞ–“WG�ÈÜû³å($·Ê)ŠëðÁ—çýöÃD™k×|ìê1pc¹©³ßZØÒ§Žõz×�ujë{sÛöóá^öp6Òlj™Aêâ½Æ%œïU¯¶QÏ~˜ú§‚h{lTnj©mvN�o·¾§y´oé-ÿM¶súhõ7­ow]ÝäB�Ûeügü÷¨…ŒÿŒ ã¿,Éøo8Ÿño)ã?ã?n›ñ_ÕÌøÏøæþmâÊî¾ÊtĨL`õ'1ÕY/áÐ]ÓBK°m å@ÿúvåßVLvÔ¶N›¶:ÓÐc*cÔoÛd½ª[üP¶é0{MÛº¬Ë8ËàêOÙž¤:Û«¼�W�zþ{Þm|´\oÅs*K¦.:düóÂŒÿ~ygü÷æÝÆ'ãz”ñß¡^ÆÆƒÿ¼0ã¿_Þÿ½y·ñÉøŸÍ(þíO¿&ï¾:Â4Ä/¥¼)˜Ë”Åõ¶9wÜ5h”ÛðêïñnØŠ�ž (ø´#ºÀf’|4ÿÀƒâ6yaÉ=-ŸD+’‘ДXÓP�|âþWõܘjÝ›‚‰RliÀÈ`™ÔÖ4–¸þR"p“úÔA™û)—�²¿k¿}מÜ:†úî>ÜûèAœ~â^vÁ’òsÝÊ!,YT[È„_D03xìéq–6Ðøòß“Ã�æãñƒfJù¥?U/ã_ñÈø÷µæ þ5šü§^èeü#ã?ãß×ÊøÏøÏøGÆÆ`Nÿÿ²m‘´¢œ¼:*DæÞŸó£¶mr‡æµ‘ÀUz¿m°æÞt�TL Žêêø )ùÆ”:×T¿*OoIU�ÊM$u3ÑŸoeÙ&×µ%$•nžaZ†Þ^êO°>IàS³Ø9ÞÆÙ µµS÷Ë þ¢¯ûËu2:€§ú¤ô£¤Oð êOòÆÆ�»ÇñÀã‡ðÝGâÁÇáñ§cßÁI_op€püê!œuê"œ¿a.8c1N9nK`h0èÏýÅî¤þ@Ó–X%VRfˆê =bl ¹IüÆvNn•ÎøÏøŸãø��Æ™Ië�\ÄeügügügüCꂌù=ã?ã?ã_ÈÊø_8øZ¬ÏÉ«£Edîû9#µŽQä¿+WN8" Â º:Coxsåà1CvȃŽ,§D°Äû”8çt¢dÀ"9ñÈøÙM¾’¥�ЭVB€ Ï \¡#.N×IõÅéÙˆ„m9þšwJ­GÊVº ;û÷ÀæC¸û¡ý¸oÓAÜõÐAì;0‰~hý‰ÃE2k1žÖ(^tÎ(Ö®¨6(F:4ÙL—!·Fá~¨Ûs 5v-Øåm4/Q/ã?ãŽã?õ�·�tLÈ[ÛÛì‘ñQÆ?2þ3þ3þ3þ›)ã?ãÿóÿKžœö3ÀÀd::X<@…ÓõÀ¹VžÀƒ„¾IŸr_Œáì=¹bjh«cq”*žœ§'„$x|{uÞÙÇ™ Ò Ò�X 7a1ûrý˜Nq}È@ŒPu”JL À¼G]‚¸² S1Á;°Ö<’Á‡”Þ¬ÍĤÁž}“ØòÜn¿g?¾ýÀ~<½m ûLN6E²n42DX±tgœ<‚—¿`)Î=}N\3ŒeK@ _!1 J(pó{¡kÑÄ£ø%ùòª-u„‹‹±—Šeü+]2þ%ŸcÿѤƈ�bê} ߢ"�ÅÜ2þ‘ñdügügü;ÁÈø� •ÜŒdügü‹þsõŽiüÓÐñ?¬~=2]¢É{ÎÈÀ娹ðK@5zÕq]Ÿ£N#¹dÁÛ$ucð¬ÚŠrí•É(¡ŸaŽí·4ú%�õÛë¨ÊÑ0m‰€¨m4zý²å±À#%‚Ó% :<˜D‘‰1NŽYÍž¯¬+l”…¶¡´ dyâSvDŠß{`|ç¡øæ½ûÊ[ŸÝ1ޱqƒÙ¤åK±nÕ ÎˆóŠ$ÖÆ³‹¿ç-ÁúF04R7 µõßÛ,6÷°y[y¯sS£Œÿ¨}Æ¿×}6ñ_±�~—âáøH½ËR¡—i‘×Ä?ªŸZ¬%xeü·pÌøeµ¢ÿQ�ŒÿŒÿŒÿ¼3þC¿2þ3þe�ÀÿÀ(°æuÕ_N\SäXÍNï$M•C8Ç–ÎÂÛƉslr¿4¯´ü¶àÝ‹W<Á°À4ähc½eЩN´C«]†Ö¥’ã¦åD6b磺¼Ð/tš¿…À×ܯÉ"7õä¶1lzÒ&­à�Ç•·Ú¤Õto œi$,YLEBk�3Š ÏXŒõ'.*ßn88×wvœê˜òÞ§|ËÍåaáÂêS;.2þãºÿáøHáßËëƒÓ¦Æiª¤ý¢ý<�úŸŒÿŒÍ+­[Æ?|ÃqÆ??veÿ½Ûgügü§edü'ušoø§QÐP‘¤Zt °ä`ñ©Õ³®2“X(ÝÕƒËüi臧…Ìv:èi1Qº¦?Óhj™µNÆëÑ ¨%'ÿ=ô¹÷ä•‚^øÎ’îÉÊõoªÑÔ‘œP"À£}²EO¹í|Â¹ÄØÕ�nÓ«² û…¤´yõ¹ÿà$ö *ûðõ¸ko™¼ÚºsÝ�VýÒÈÐ@y«áiEkãóFñâs–à¸UCX::h‘VÖá“aÚ·Ò˜Hù ¦øœIÔàç2þ3þ�4þ›7)„*oÆH7Òrt¿PëŒärËôá#GÿÿÿÿÿqIÆÆÆÿ1„ÿÁÅÅ/õë@Ë_XÞ>×ÅÖS�Ù¢NxÍ»«æ  ¬÷×XuÅé`’vIÞ.€”;VÏEuQ*ë¹r ú¸UÛd‡Γ“GŸ`Ñ·!ftµ×¥9ñ ‘ä¤ô6�ýÕã+maÒ}�l…†1i²-ÇÐî´ÚôÔ¡ò¶À;Ü_Þ¸{ßÜJXõ¢EÃ8çôEå[ _xöbœ·~´Ü±Å' b ôdá¯.”hò ¾>œñ/9füÏ.þc}åÒ�ÛÒ-�S:êï©c­�W7œhÒÍ-¸xAiÍ�š¯Üç3þ3þ!jBgügügügü§ådügüaü¯N¿ºø\ƒL™Žò ,ÿÓAùÂÁåñTÁƒ‹<×Ê3 ¬êß ði^�üš¨-þ·�Ô¥!€úÓ¬�?W›\í–öQYÂ^Éz˜Z�$1�{ñÕߟÞ:†?ˆ6,VñìöqìÙ?�ñ ƒùLZ‹F«– â¬SaãÙ£Åçbl8iËì‚_°{øM8 óTÚŧÄqÆÆš"þÑR&χ±îÝnIåi¿äçÒú6,V}n_@ÇrááÕ¶¸ÎøÏøGÆÆÆ?«—ñ¯Ú5õ£©¦V'IÿQ݇ÿ“~XùrdÊt´‰Ìý¿`¼ãúÒÚ]�À)9±]4  ,45.v"ö|˜N@:hrqBA(Ùõ�Ø*màƒIÛÄé§УŽÒ+jÇö'‡‡IJ„ŒT™â ¤ú#;Ô4a%' Ö¹‡ vïǃ›•·Ú‡±?³} ‡ÇÒ}\(48@XY$³N9nçž¾?i‘ÌZ„ÑÅ„áÁØÒm“yjR²¤ýµ‘GÊç2þ3þgÿ=ì–’›ðÅêWÐØ^­ 2t•‰VÊöHù·T´ñ§çÑá\ÆÆÆú8-Èø�m^1Ëø÷ºdü§uBÆÊæ5þþ}Þ‰•é¨MÞ÷~ヺ%ãÿ©k„ò*£áªZ®!âŠÞ\€xr�ª,%øº¾ R= ¥ x±nU?|¹Ò¯>�ý0L€N¡L¼Ñì^bâÛP•^^ãmI¢_&š$œÞâíÐ〠+ïO]ÌuãbÈÖ›öÀ9ž|Qc›<úÔ!Ü÷èA|ûþý¸çÑعg™šÉZuÃÉ#8Ã(.Ù8VÁ°¤&|®[4¦Ñ"ÄõYž³»ªìm�÷ɪ۾½Ûw�#ÓÔÉšö¤µÃxÕÆeØø¼%8û´Ååí‡r®WþÅ|¿m’Öo;—ñ�Œ%;…ß7¶º<Õw­÷µ –ëÇ„/(¿z¦|¢ö=ᄌb@/€šú¥}�÷MÛRgíN·6~ÿÈøÏøÏøÏøÏø×'3þ3þ�$þO¿*¿¡/ÓQ%š¼ÿ q@C GºÌ�ÒµãÁß3oà!’,KN6)Å_Ÿk*ãm�f=“rDС¸?}ô!Dâö>6žs,ZÚ´Û‰ñÙ‡¯�MìÚ;އ?„¯}g/î/’WùÖÀÙ¡åK±nÕÎ~£‹(9†½aQ}{*ã?ãߟkÇ“¿µ�]“üêI}ÏôBRÚ(êG’§,lÔ½ú” Et¦¤¿3;ýü*WxC›�Æ<\!2þ3þ£ãŒÿ†ö¬<î[ÆuœñŸñŸñ¯yõ¢y…ÿÞ¬~2e:ZT=«uè‚ßb î¸:BÀ×GÝÚoÛä „Ž%<ø„¶0 ´�õé(õküŽ—©#QÔ›ZQÙŸÐFl—MÈ1¾}8n’Rm¯ªFЋۿIn{nŠ2È >µ|6Æ©¾DºdU_ÿî^ÜûÈ�òyVûLö´x¦™¥¥£8ódûFÃÅxÕEKñ¼SchhwÁ‡ô8ËÉ—�qÆ?2þ[t•‹í?ðB›Æž¯›äƲY[4Û3î_;ßøb…X½°( *Ë• í³ÉÅc(ñ<4ß°Ã ýÆ…{ìÿÿÿ]øfügügügügüËò~ñ�•'þ82e:ZTíÀR!…OFHtÈ-‘îØ¨ÀN,èF[NꦈË3ÑÍmäDC�¼zQªnz f­PÔ:5Á÷–—š¥ê]¡)UéÅŒÀÏ=¹õ0¾÷ø!|ë¾}xð±ƒØòÜaŒ�™hÌ2[42<€u+Ë$Ö Ÿ·=o Ž_3ˆe£ƒ~2·ÔæŸÿºm\g¾ã?œ¯Ïh®ÓµïéERÿvjÓ!,êÓ:õ*o³}OÌX¹““Ñ…F¹ ïjÃxÁÚ¥¯¦^9gügügü7—gügüÇ}ˆëdü7óÌø_`ø_s)pÜåÈ”éh‘H`ÕEˆ§˜@Ó ÐÀôw¾ç••;ÍÄÞOt ¬L¬MÔ O�GîKYOOŠ)K“û—µqÛveeS¥‹–bT‰–ÿäsqÙ¿�ÑÑQ,Z´ƒƒƒÈ4·hbb‡Æ¡C‡ðÞ·Ÿ„Ÿy÷é='hIÿè£Î|Â?ç«©ËOóoªÏmùDâØÞÿ¶Ÿ<—îw#Õr›ùI™Põ ÊÚêj -¾–Óæ6©…yÆÆ?�ñŸñŸñŸñŸñ��šùI™@ƹûÊîÂÊ”é(Ñ�ý§rJç¸Íãá“o3”Ášɇ|)/ ¼ýJÖÖó7<ƒiÂ5DÔ6þÝ'­côÝe­MSH¨jºà�ÉŽ·[VlrC¯äX×õ�Ôò¦ÐÓ�Âvam;? "LPöÒÛeÇÆÆÊ?K6�µxñbŒŒŒ`hh('´ŽA² «ñññrÌlâÊþ9ò¿ Y_6Êoëò0igü/tü¤–9ñ˜9öÜø–}Iìv÷«.ó9>ʺou#ñë*×JË‘>jD/ôÛu¼îÞí�à¡ï�íŽà'ɶARxѶ!f}ñK5A]´$5ðŸÜï¸ÎÿòlÆ?Dÿ3þ‘ñŸñŸñ�ŒÿŒÿ>ð¿äldÊt4i¨rnÔ`©ÝŸ\À­(54” ¬jñPçÛ @²`dÔVH?A‘êB.ð@I ¿Ú$ ço‚öíâ‰ØoóT¿|ÈÐOÉÜ&ñ¤LA,VTƶ–“ëlÍC’«R#Mé€m”:Þ~ >69²oß>8p L^Ù?—̲Ètdirr²—h´¶Ìþ¥¨ô–l~Œ½ÿeügüË…²IêY÷Éêjjû•J£:6R®ÖÏ0~|ì¡êÁ¸:µ~Æ�”¿ ò!ÏÅ/°+=¼¿®¬Ö‰/½](ô.ˆÙÍ}'g@ø„·«ÇüÅÈ®=ع{ÂóX¹|«–B�oø¦ñÊ«>;^OÁ�ñŸñŸñïÛâèá_à†8f3þ«ƒŒÿŒÿŒÿcÿkß ¯E¦LG“†¸£:2 Ĩõ¡è!p‡×,̈àDL1þŠG+�ȰàÃÀË'5ŽzrDý�zò¨Þèæ�®*IÕ%oÌ™  ˆ¤x¸®|b³lBñóˆáý�¼¢)ÓÈ€ÍÇ2%/E.Ab“%,W6�5<<\Þjh“Z™f�¬_ZÛÛÛí§ÝqÕ”°ÒTú³ÑKÉ€™ŒdüGø7J÷ðélá?•\.œëÄÇ•ÛÌ6Zs3¯·ï?·©+¯}Á땈i¤ úÑgg;W•Á¡rÖ†[=ŒQ¥ôÎÝã¸í»qãçžÃ�÷íæ-‡"�lë¢ó—à’—­Ä;Þ´Ï]Âôc¶ä6Ôòu=äú53øÿü¶cçžq†ÿÐïj1^•]ò}+°þ”EHQÆ?³2þ¹}½]h~áŸ�UèS¢¿jÌ�5üçùŸñ¢ŒÿŒ,\ü­­{+2e:Ú4Ä3âT G6Yq°JàVŸ!À¥PÈ:ó·vÈ_càÑJµ€˜ÜˆE½]•t{Ñ£I’ø¹Z/�hÖwÑo@ΪU߸žôFõ!Ø2ðò¿öÔ”ñŸñoX»Ò��}‘¡�‚Ý`Àñ²¡�EaaèúÏýK ¢ë¥Û&e:þ©KJ¾ßò_ûŒ«cT,}ú³ÏásS™øi#{þÖ"ÉUýí—ÿäùÁ·m:­ýÚ�Uynfðÿñ›ž.uëEŸúÏgã=ï<.ãÿ ÿ¾Ì„± å[UüØ ß>Fð¯ÇyþGÆ¿ì/ Ë2þ¹Šóÿ‹N�ü¯‘)Ó±@å3°B�ª"‘�«r÷ `†�XÑ�E—Á˜ƒ€oW5 �N–‹Š.øº_}ù–Í*¨k"ùéÚYG RÍø "~q2ÞÒnQßU0e¸¬Â^u¿y¿xÐ2~£X R­úP�†z,ÃqÿdåØÛ íî,+Ï&°l"Ë&µìw»c‹ˆ�)MÖ~î¶@÷vW>ÕÄ•#ï›Â§(ª“ñ¯š/Pü_\Õƒ+ÆÌóÒ}i"·è•þä.ÒmkM„žì ‰%XX¤D¿ãEfðqi_òþÅÏ¿ …Òži;[zï¿ÿn,XýÒ¥/[ “ð/}‘D&£†õEúÖtñß�2þ½”Œ,TüûöDPW…i�Xÿp â?Ïÿ@ÆÆÿ‚ÅÿÀ(hÕ%Àšâ¯øž)Ó±@á!î¥ÃB@$ëÊ>�ÔhÐNNŒQ4P|Pã©k4ÇßÉÓò�’ãä» ×Oм\ñòú¹ÀÁÚ‡Ìôaº,^yNÕ¿<ør»¸@ç‘&Ñ7’ux0D4¡Çv1Ê@�aÙ’!üÄÛNÅÿûÚ³xnÇa˜”2-ä.îvC÷ì,~«a~nV þàu»ãÊ&±f‚V.Æ‹Ï_‰—¿pM(¬1«ñRžÂÜÆ¿}®Ðåï@U’`RkEû¹¡¾åÉÞútÑK‹ãÅØxÞ’‡ÿ°Æb|XŸô8úþÑX†>r¡$5 ãÝPN©Å«ìƒÖ L¦AŸS:²þ>ˆI×sº^ó›�N)yeé’—­(ñEÑ‚™øõ #®£Ä-¿à˜ üw£<ÿgü/lüûsõíhÞn·R¸s¶;6ñ¬Îÿsÿ43²Î�«á X1Μ�¸la1q'·˜nN&÷myí£ü3Âÿä8Ìø`òPÆÿ\ÇÿðТS€Ñ³�Á"qµ÷nÒƒ>U˜>3M®o…­am�„�iˆÉ@Ç�«ó*‚ù2¹ô" -õ)ƒa6üÄ@‰€,& )_è¨å@×5‰‰TNð< Ÿíj¹®. `Pý£À·œ¬Ø|¤¿BÌÁxY�Â[;úäÕ š˜&¶$mäÇ»øgE‘øø¥+ž‡k~âllzònûççpûÝ;ð½Íû°m×aôK6XÚÄŒý³É,K6‰å’Yö9ZDÇZ4™²¶po t»¬f,aµ|gŸ¾眾 o¸x.:g††ÃDj)˜¹ÙÞsÿ;ŠV—Û›ú!û\¢K/^YÞuÙ×`!à?èÎä{9®Ó¡ôÓŸ{›Ÿ8„$Qeë®8‰¯áÄ8²ª¾ÜÙŒ„²uÜ&’‹2È1àÇâ»h æküâCû}¤_ª=b||úsÏ↟ÂTÉ&P5îø‰c.›Õ½ù‹Ûq×}û¤c2Zµ¢E½ðß�(Ïÿ ÿ~§ BK¬² C7¦ ÿÇŽ‰ÕÃ�§éâßÛ=‰™´¯i¹yý?Ëø^³dCùIB›„Þ Ÿmߛεño:ßVÞª×ØN˜O‡¶füÏUü�m¡UÊþº¤úÔ4ÿ‹XêÚ/>4R$²Ö~•ÔÊÔHòÂܤ†*”�k#ÞðÛb]3D–z™3 !ªy'’îc”#¦t‡hA¢?~›¯˜Œe[õ›MÔ¤]êºÄ›ÙU²äÂ-dÄÿ-Í&u4õÄÚÆc¦G BcWj7I�uêÒòïGÞzÇ=ïÅ—¿ùî}džÙzÛw�a*ävY�ín,·;k¾=;ËíDã +{ìv©M•¬y–,ÄÉÇ�â¢sWàâ¬ÁÆsV`é’!,Y4è"÷c>ÒÁ¼Á‡ç>þgžìs‰>ÿÅmåŸÝ‘uÝN«ží³ðG×pûÛ›>û\kâÐîl»úŠ“‹…Wè�çidluÚqÉz܃-ä€Åq¹ JâåE´0!9®ÑœP¯$�†\†-½þ�cªdw_­*’ÑZG ¯ðk ç1ƒ�ßôn½½}\ªV?øïJiÌæù?ð›/ø‡Øä#d,$ü›z¼=¶¼=d¿��Lÿœ_èmÝl^Îÿs ÿKÖƒŠä•Äß<$›œ³‰ºý›Ê?Kÿÿ ÿè1ÿÜRü= ³ûÅÅÞÙ ~4'²hÈYW89th%æ•“ñKð°ò#ǵ¬GrAÄÄÔ#-Ã�ÖÇDm(r/®WJGYæ•(ƒâ­Ã#EAÄødÃΜïR œ­¹¾î˜Drx_õ÷ —K‘~¶Öh‘Y\ü½úÅ‹ðê­Å®½c¸Ó|ûÞ�EBk+z|_‘˜‘�£ ¹IöϽÙÐ%³ìŸMfÍE²I*Ûw[ ý› ²Áîg¯À«^¼/<{%Î^¿ëV�”åjz5ð0‰cšøŸeÚ´å Þû+ß+ß wí/œŠ…„7j<–RýS�}«^/’ã(:&ò„=Œj‘Šå¨c?×YÖ‘í pb”\6î§Hz!èüžjÙ<™PîHÛÒ°#­ÙÝWP6àýØBÇô²Ñ}îÜÕ-æôƒtÆåù�à¿mG€+ÇÂ?×B-¡»„>P6˜ þ› jÇóbþŸKø¯“W ‰ÊþRq©¹ïaV˜ñŸñŸç·w nþ?ð0Ì£¿Z} pÜ;�IÒ: �«ƒAy¾®œAÂRNP:~õŵõrë…Ïkg‹¸×ü”Ë�‡‚ fuÖW÷™ËàÎîùxYäûB†D]m íðÚÖMee¹  FÖƒ¨O¢a#/ÖO>¶Fœ“uE}Çt€Êv×ÏË‹¿Ÿû¡3±c×aüs‘̺ýîíøü¡‰‘"ù4„~É&~ì.%÷s›À²·º7ÚÛ �Ero ´ +û9S «á!Âg.Ç‹/X�‹Î]‰‹Î[Y>ÛÊgf÷÷Wíä‹T¤_‡yn>àÿHÐõŸx ›ž8ˆOþ—ç-Lü×±Óê¶k÷xÏ·ëqN;ÍŸ+Ìua?α\ûFÝFodÔ qš3¬k{qÛ”y¶OÔÕŒï nþÂvôCëëg¯¹¤×%ß·’ÙƒB?™Î®+•bIüßy¯Ä"�úÄäTͬAGÿyþ?²ø'ÆÝ%´„^ŠÇBÀ?§Fß-ÚS}‰·#÷¥À¿®/{Ÿë‚ÿc}þŸ øÇ¢‹Ö,H-~ø;¼ fl§/ÊøÏø_Hø×¶n*+Ëë?ÿï¸ doã<õýy7#ÿwGrå±ûœ,n'ι áƒÏO†úe{·•Иˆ¿p@¥KÍÄw‚ýár ÜàÜúd)×HXòj¥|Æß5­S=´Ü=ÇB;ªÖ…÷ݰ² †Ð-&›lˆ˜Íï—)$A��ïµ£`;7f¶OkV�àͯ<öïÅGÿè ì;0‰Õ«WcéÒ¥þ-„S¹-ÐîÌâo6´ ,w«¡ý~´ïn ´É*«›Õsº·Z,’ƒ'¬[Œ '�âÒ—‡Ÿ¿ ëV�”I«r—?1cÕä}ƒü£öG¯ñ9wñ¤èÆÏ=‹‹.X†«ÞS=Ch¡âÿ®ö£7‘àaT_ÁtŠý ÖY¯hýÂ#Ó£…Š?¬ÇÈc ¿•6–Öæ>Ú;qT‘½%õ“ÿùl\rñJ_vÛ7vá¢ó— 5y¢ +þ»é`úÆwbyþŸ÷óes‚Ÿw€ÈvŽÇ|Ç¿CÁËÕ3Ò0†}'¥æTð¿Pçÿ¹€»ûjAÓÒ³€�ßÊø2þY}n—<ÿ·Ìÿöyd[~8åçs«&ù ,Ÿe5¸CqÁ FÈ“ð uœ#DÁ*8lÐ¢Ž«è†TºŸÃ†Ò�é ê@µ-¹º>¹ön1�_W¢‡Tp$a+×ç*°$tág|‚�‰�EH\�÷ÍU%;E%èc[þ,À ½dŸì÷Í[vã7ÿû7°c—½�ðÌ3Ï” &›ÀŲeËÊÏ©$ž\rÈ=;˶·|l"ËýÙ²Æ~Nƒ\¿ùÃ×mâÊÛDÖty[>–§MÔ½æÅëðW¿ëO^Zî¾rux¿ä8I_IõßOju}�WSƒsîãG”®ùð#¸ì k°¾HD,Tüßyo·d�ëCMX¸1ð¾€øœï›sî7¡F•›ÀUø=„Ýy[¯?‚çqá/Ü‹uùî±Î·^÷�Ó‹äÕ*¡Ã%/[�•›—´-ü9ÄøßüÄAô¦r’ì ÿè7¼æùß÷y¾Ïÿ[µ|þÎöFûÏ/ü³Ž ^ú{ÐOé‰u§G¿ø×2Æü?ð?´¼ø•r14 -+Ÿ‹…1û|ÆŒÿŒÿ<ÿ÷=ÿ®“X§ÿR~[aAC|ù"É‘p.ðÅ yçÔÁ‚;“/ƒ_¥Êax56„3Pˆ =ßšÀc 6RO“mÀkàI �U½àÝ�ã[ê àtáÀÓú8»ù>%=Àƒ3…÷Ü oCȱ¨;aŒÄO SR.³œèÓøèWñÍ»Ÿ.w½öe§âË_¼Lðìß¿¿üÛ¶m[™dZ²dI™Ì²»³lBk*»¨,_—ÌrºÙ�Yn‡ÖL¼Ù�˰ +û7SdyîÝ»·´‹ý´¼­,¾x%Î:}YööŸÔ¤ïÙ*¸Aøœ+çõýuƒøóÿ8âdŸ‰uËŸ¼ ÿ›:%J úætq¾-Ç6tƒëìÏÊVͺ;…Û±WSsÛTâ&áOaCR’zn~²û[Zßþ¦5¾?�Éu°¨þ»î öë†ÿ~(Ïÿ gþç:±sºÅ<Ç?ùñcïl¤Ö¹ŸÌ0þ�Ï p¹órþŸø»m2Q‘Ä26�•ñŸñ¿�ð/|yšó‘ÄÂÓÿtò{±ÐiÈÅ�dñÜÕÀƒGY_Ötƒ¬¿ƒίr*�2¸”®[ÕѤªÀýѵ¤“p~b}ÇŽylI-pç5òcÆyr¾\/cb¾` p,B]ªlÀÆÂ°:®Ÿmr�â:(±Sè£"dÄâ´ú¬Fg|ÂàÓŸ¹ñ·`hp?ÿc±rÙ¢2�¥É&…lÂfß¾}~ÕŠ+Êd–M<Ùg]MåbÉêìn3´I!{ˢݕån_ì²;‹ï†²ÏàrI%wn:ävníÙ³§ì¿{a´ƒËÔ«íü[N*Üÿ´O1V‘Ÿøïõ¤áxÍ'üw¡�þ‡3±rExAÀ®Ý峜ì[Ûnky£ž&[×¶[µ|¨/üÛ]:wÞ·;ж›Ÿ¨vìXëO]„3N]Œ�ç-=*øßµwwÞ»wÝ·Ï÷ËÞ*¹ñü¥¦#üßõ@÷D ׉Ëñ–¶óá‹nÁU•ÕÖÙÍõÏVݹw�ÕvßÄl¾¡°ùÆó–•Ÿ�¯Aʯ4– ë‹-Ûµg]iµõ£ÆÄ�ù4ñßåÁú¼OÝñß�V.Œðo}ë.kû-½ýíó¿¬]TØ6æÿÇž ãížÕfÇyýÉ‹ý­›yþ—}ìwþ7BñÀÜ-ÎËæÇþ¹µ†AëÛtðoåjÛ|á�Ï�º1ågÿÞ �Q©�ù:ÿËëÿò!æ™*;dügüçëLkþßw7`Ÿ‰µìXÈ4T¹eí.ÞB<|cu:8Ÿ1ȹyuFðô1þ�X0 ƒÈÜÒþOÁkKGR€åÁŠ»´s8yN/ [BùvAÃÁ ÙWb‚*¾>XÖ%…P£úå[» É,áûʳÌ�[6+}¤&|œ¤ÍðkLñ_«‘çpŸªK]}#ëd’”ñ®SÆ¿·…ïß|Â?9‚%¦;ÿÓÖ¿Ê ¬ê£v"~$€bณÿÊpGgÃçÛ²E© À/8Và¤j{�Ü>o«Ò‹;»ŽñÎ á˜Ü>®…ñŸ "*y\Rí‰Ù@€PL~ÌÎq¯7×AÚVJfÅÚ µ^Mê#¸ÍlŸþô¯îÃC›w¿º/Âþ¥×àøµK¤žÈò±Éû·sçÎrììí…övÃåË—ûggõK–¯MJñ·ºgf¹ÝVÓÝ]åÈò³‰*»»Ì%­¦” «'9ÞÊY9÷�7V[=6ÙR$x®ã?îQ5áßî€úäo=¯ÿñƒ¸«Ã­XwÞ¿ïÁ IüßöÍ*yrëíÝwuY²úöÜþÙ‹l{q¿Á=k ^YþQ÷Ôú´ÉÛpÊ!p»Z/ÿ¹{[“;]°´à¹³|c¿d“;MúT}"9žÚÿXü4õÂÃù·÷7ûýó_܆k>üpçgRÙD�íŸý«l¾¾Nr"è£9;÷N”ÏB› ¥mR­ûÁ¿½mq¦Ç¥ZwQ„ÿ®tÆ©£ån4«—M&õ"kû÷þʃøØ�[ðå?}a1— õ�ë¿7”IØ-�ÞŒiIb¬ïŠcžÿ»ÌÿžUt±'mHìø9‰]i}§‹ÿ ‡Ï…!Úðu`˜Ó >©ÿѯçµôœæüÖý@å´ä0žwŸøGžÿymÓëÿÉnsѼ§IûCeügü/,üÏÂü�±íÀîo+¾ •† áø¤ì“;)Ôy9Ìtò¸©žtÔØq¹¶Ò�ÅyæPœ�Ið2‘dVF”¨ÇGª% úÊ@ÔÔwNœg²në"iÚþ¡¿•sýù¹ò|-åÛܤcì-D[ñW_z¸<÷ƒß.xÞš�û# v—Ú±cG¹Ë&²ÜƒàÝCÛ§B3õ<+¾Ëk×®]åçLìàò�7qN—i|„:ü×@_€6ái®ã¿+5é뾯Z1\î̸æ7{''ÜíPÿv×ÏõŸØÜwâ*EöÛî^¹¥¸°___`·á¿§¾E²`Wq�o“7IžËþÞžm.yÙªòå³EÚ‡\™øNÔ£‰}ÚÛ2ß÷ï,û6U*m^Œágï‚r7R¤çš™%‡Õ~ð?zpY”ZXõ É¢ö‹ÞþíÎÉCGöÖÕwÉTëë\Z/ü[Ÿ~gáÇwõqë$'‡±ÏþÁåí»yþï6ÿÞž(!—„é ¢6OÊ&�fjU¹„••ùä“O–:<üðÃxì±ÇÊ–ÝÍ5ÝäUEä¼¾1ÐWµâÀÎ9t×TÙœÆGê‚ÿ�,C²;YÀô°;r^÷ãß™‘ä•#{�þú‚çæ'uÀo;ؤ›åi=]¨¼�qV¨i‚&ïuMþ‘Z0Ø[Æ^\$N¦“¼ò¼ž8ˆ_ömÜôÙgÑœ˜ÙXçÆ¯_üÏ¥ðß•^òö;úN^9²‰Ã›Š„RWü?Zø±ÅÛT“WŽÆšøäùbþ7à‹wŽOJØ(ôUÿÚž¢©â_–ÇÜSs…¶³?c‚ï5â_]Üñx‡~¤ûíùMÿyþŸ#ë3Q¿}oÓ¡güN´ŒÿŒÿ…ÌÒüàáS°Pi€;«¿_üžâ0Ð2¬ðc¾�Nž£D›°M�ü' ‡­ë祄„å§�’K,Á’vÕà$ N/Þ–<ÇÈ6äûä‹-‰‰_´‰¤ƒ;¾¡~­CÙ-§�Ô�D¦YÚÑéæø¥&‚ô˜r{Èm˜÷>´7é¡Ò,¼âÅ8aÝRÖ×Ù!÷l)»3ëÙgŸõI¤-[¶”·º·Τ<ûpxûŒ®'žx=ôP)Ó[ø­‰3&³F^5þ$Çܧ›ÿü6ZP„�Gb¼ç4þû¢nøïÌ�ÙÆ>»j6¨¼Íêß=Ð ÿ]xÙ‹õ®·ZUÙžª­Û)ÄCbþæ–aQÂåéÉŸ°cÏD‘ȸkʉ“&zï¯<€[¿±SÈ›�D}E4EüÏ<5ã¿7uõ«&ºþwí-‘½ño–ebw†ÆÜ&£/ÿ½þaüyþGãüï¿Qˆß¡¯ÆŒx¾ ¸�fÿ&a÷Ôüçæ6¡ƒ°1ûqkd„úâmEÑÀ øŒôn�0wæù>¯ÿ±ï{… ™_7Î *úmlFÆÆ¾þúÏÄü�}÷`¡Ò7luoùÍÑßäBÎK"ðÙ(àÖ·ár8?"™õ2 —M¾\>Eç ;¿áGµ³æ$uß¹s9¸8Fî;ëœ1Áù´LÝWÿ`6ÇÝ0à¹v‘­X¦™´ ò:0 eiÀ�IÔ_¡«7±�ÇïþÉ�å¹ Ÿ·?øçŠ6„t€˜ ²Gw»³l‚éÑGÅ3ÏaieWÏíÊóÓüïψ!@þBŽó—ßÃk¦ð¯í  >Úpy•r¼µ ä\QÕ¬¶‹z~£è¶Kç7î3�ë3ë«êOžÿk}Íÿs`ý?q ¸Ø| ’ö=LÎøÏø_¸øŸ­ùÿ`ïg�ÎWˆb‚%f(â !¾0bukrÇ3�ÀäÎ1§$n  çzÉêR_ ß]]Á‰þ(Y„Á‰˜¿ýÃâLöEÛKt¤ü:P׈‚0·¥ë‡.KQ¥û€8öT:Ê> 0C=nï‡Û‰¿ûJõ| W¼èd\pöÏÇõûH“{`»M\Ù–½µoÓ¦MåÎ){‹_êVC×Æí²²õ]{lË�Ô-Š%->XõZ˜"‘%$(1æl2à>È¿³jâ\åÏ$ÆÝÉ›SøGwê‚ÿ›¿¸]È>°Zãÿ“ÿå\ÌÝpã“­øïBwÝ»·s]ûL £cF©Ù›úè…¨üàÓõøg‹ìλû�˯bììØÄã¥#þg…ø?’domÃÿÇoÜ‚ÍOÌNÂò†‚÷®½ãµÜ<ÿëùßpÞu{ðÏÀAÈÔc„Oÿ\ɇŸ°& ó¦·…«®æJ/SÉøW�@�s”ά‰œCÑþóü?ÇÖÿ‡‹¹jÏÝ ç¡îö¡í»‹þ~¶<ÌøÏø_Ðø÷_gpþŸìþìùFCœÖZÖ^U¹‰œÍ;g}Âmi¯éTžY ŸPg@ù+>ñç_{@É�Ø[\=2,º°ãú\%K!ŽBg¹óV[6C¿ad  ÛIk9ugÂkª™—ñ>3â}ö6…B0Œh+‚´ [<?Nž—D¼¼Nl \=?8^ú^éaðÕoOîÁèâ!¼ãMÏ�Š€G—쳳ܛ í-ûàwûVCû xûio7´o ´6QuÄ’Tm4¼ ´æ-……'�ÿP‰‹ ‡�P@`”õ%ჼzy¨& ¹‹ÿ>ÈñMàß>W§kBÄ>äÛpžÙgF]ýžSpÃMé_ElR¨ÜÙ„êv>ûÜ�®·]ÝvûÎââz+—V"g{Ùg�E³ð ‹Sð þJáplœˆcS>0¿²ö_µb¨¼mó–n¿}6“ý³»ëˆfÏæzÎè‚ÿYÑãÿ’ÝmhØ �ãßâócŸ~¢;^ïxãºêaü/›¼µo;lw›°¼áS[píÖçù?1ÿ{0�¤Pk'Èyˆ¸?›iãßÍWa¥/ã:ÂPyÛñùFÎOb´ØøDc°c¶0låcÊÌìÁt� þóü� à\Yÿ�ívÝ Œ?þ.>\ŠyGã»Êg~™OÊG‘ñŸñ¿pñ?Óóÿø,TòÛ'…#;C��"ÿ*Œì�­:ªÇ™e&ëck´Jeàòx¨>½ãEJ‡ ÆÏ� XH“ÏF§N²‡¤‰N›úï€uŸ„�}�W>ô Œ¹ëƒ–0JÂÖÌ>ˆ{~€É‚ŸQ}çrtp1ðc9>að7·V»¯.ÞxRq1x|°AÝ~`Ñš$x�&ÙÛÿìN¬Ý»wcpp°|àz9C:Z½00Zû…^ÕÛ%0®<¤¦Ú§ø/*ÚD]Þž‚§ð9{nã?‰âVJáß&ˆ®ü•:ó¸äâUIü_wõÜø¹g|bªº�>ïy× eòD ¾þã›ð¡‰{q}gqnåZŠñ?5Zµ|—½q­`»M¬Ù‡½o¬m—\¼·üéF_ßÞâuýÇ{ëkûúÙß¿ÐëÈãçúS‡ÅÂX{¿q.Åü¨:bï�Ÿ}›Ÿè–„²}ù\¡‹ë£UéúOt³»%›(ûra‡ û¶Jo“¢ìÎû÷•·2v!nKO¬_~òPãªño¡b\ ÿí’Ðóã¢å¡ò…&ü÷CŠñ½úŠSü ìXuM oªL)üÛ>v¹uðÚlÀ¼j½÷%ÛÖâæíoZ‡—¼ý[­Iã[‹d嵉yx¡Ïÿ:>‹¸.|&´Ó±Êì7Mü»6¦EGvøºLIbvHÄRnâY||XŸˆéá×ÌÆºž°׃õÑWD�<ÿÏáõ±¶Ã¡g«?[<°HŠf m'Òñ*ªÙ¨ú)¾ÂˆmÄÛ‘*¬t² «ñØ¿3þ‘ñ/Ëòõ`îú åò±LÎÿhèÇ ¡äs²bãÿAå+I'—ŽA¼ÉØådç­3äÜëríŒ_€9Faå`ˆÈµ5*»ú¤êT[þŒ šˆ"@‘pp/D÷ƒ†HM.Šg* 'mS>º=�u°{ry¼z“Ê^¹'·„é? ,;g¾ð|ŒŽÞR>èüX#ë³ñðõ™ ç?ÿùÕ—ÂŽåN,-~¥» fr"nĘ“-Cá â“zDs ÿ}�½=p¥M"1Ú\>wgn½}gg>öÝ&ERø· ‚«¯<¥äwÝU|ÂI(ϾÚ:öâ¾ËŽ »îÛ+ø¥ðßY=íÅþêBç¦b“>öÏ©½©ãÎ%kŸäKœ�4¼ŒTY¢Ÿ7¡Û­ž–lòj}Ñ¿(þÿ�…Ý7wÜqg'v×Ö†S•:¬.X®o•’„®tÉËVAL\5É…JuÚ¨jsÖ¾—²df¿ãÒF)üw¥«¯<×}`}‰37žUŸ«¤c/²‰ÚÇž<ŒÓ [küwIÐYl^÷�ÓËïzþ/wH>߯§Úé8Ž•Ë‡òüß@&ºà ÁϤx«E»–ÉÛwÁ¿R«K€^óÇ¿^3úÄžZSÅö£z®$&“ýöŠŽÝ·Žø=WçÐÜo‡ºÒ¼˜ÿc9×ÖÿÆÝR¨üÍ$š™„Д©ó”jŸ(çþÃÛz–ÿV‘füûÆ^ñŒÿ +ã˜îü¿PiH;:1'rÛæB™\Á"žetqË·àN‡àŽGx“¼\¡—M^ÜvA�}åÁF�ë …sqprk’ç‘°]Ȫzc©˜ mçÚYÄÕú@éÔ*®‹–œò� wuüÝŸ+.,v—u¾ÿ5g ‚ø5wÉô"{�®‰ëvÝUgàZÈåD ÿv'ÈÎ]cånš. ¬MOJŽ?ÕVê‡>ò«g—óœï‡Æ¿ï¤‘Ž›&Ù¨^µñ?‡ãí­f]èŠËO,“WUCœ®¾â´Î;ƒnþÂs…½Nƒ^*ûEWWò¸HcÒéÉqÓÿ�ÉHUºà¿+ÙäÕG~õ,¾Bõý¸â]'vJ`9yܱßÝr ÓŽ»ëŠ„¬\ÌK¿³; Ñ#æv:æù?ÆX”ShMò‚"¥ÇLã¿âaDY°A°’�«ðÏç7±HrC}þiüs—/Ž&M-+Ä[‹œV3‹wN–@Úf>ÎÿÈëÿŒÿŒÿŒÿŠÿE'Gî³PhHÃ>�ç¹³Î�Á°œ¸»�9({5�½Sqð C!åʲÒ!jFÆs'æl2hÄBÂÖj¨>™¨�¼`1ê_ 0R¼ dðá2ëo¨ûd¼|iëôÅ’I@ÇobêGü˜æåÜa„ž\ÖßuöîÃúSVà%/81ôÒ&¯NúñâËÖ­þüÏÿ?ü¯.Ç·ïü.2µÓék€ÿñ“À Cö¹.'„#Åáã1ìÿ.üVQr_cŸ�“ ±Tk.=LÈÀÆ<—Ì*ÙW¼ë$¦O7üï(’U_¹}g¹3Ë&«î¼ooùæ³~h×®ôÂäÝB6©c“ ®uü#yZHø˜Uô»Ý/W@䮽µa×g‡]öÆuŒ—ˆò7{;c·Ýoûĸräôï‚|)ºAOŠü¨ ÿèkt¸Ì.øïFÕóÝ(‰ÿõ'/îΈbüßuï¾NM_ÀÕ'¦¦øòsç®Þ~Sݦ˜çÿþSxöm(èh¤XÌ$þ ;rÿš¤žCÿ‚Î ˆù/)¹)ü›Ð¦üã†ûÊlàÁÎÿž{^ÿgük=3þCYÆ?'®û\Å? ¬…JCÜÐ:àh'0ÌØÜ-yè4‘Pe}Þ†ÔwÎ;pË2£Ã’”iD¹tj£úLê˜ók)ƒbÜ6v\©o¯†©™p[„–�#ekq_2ïƒ1�á$j…ºxYT}¿íöêṯý¾ÓêI±Èœ,Ç]›¼rtöñÀ�?³ü8pÛƒöÙYȤh¨T/ÙüÆ;�7œµøÚû�Wü.°î¥¡ �Ö~?ÌÄ^СGK×Û¼QNh)ÜÅä}9šç>þ�ÙgÝò?/ꌛd¹é3O—·.ös‹bÙ$Xþû!»K%P7ü—þçª÷MFÆ9!™˜o¨¸ì¶Ó‹Õmf]É=÷ªjM5f”·áuÙtë7vFþ;JÙXœO`Úav:ø— «/ýàjDSn¯ñooŸíB7t|È{ÙÄržÿÓø'î?FêÈ8®Þ3…ÿ„öò|}qC¤1ãßß&¤ï5)Ë ªfü7{y°¼YüÏçùß$dJ_3¢?yý�ˆ{ÆÆ?ÿÌøŸ#øY¸ ¬R÷¯òOGl1™ÄwRÇ‘êìºûãNˆ(’¡õóÎOÍzUç(y.Ò�bÀ¹N5 J�f7Že;ýý}Øê¼ŽzUÈ'/°ï¼&5è”–ë¾ì;0†ûÞf—\|ZÅgh èĆׅFžýÓûñü‘oàÿ\üÅÏ ¯s�‰Ñ¹'¿ÿÀ__ ¼é‚„6ëþÜíÀW®(®Ìï—•GŽ9ÌÐñ Ä½æz÷Q< ÅxöáØúú|ÀÐf˜\òª|¹T(ÒÑ&®>ô‰M8ëÒ¯ãš?4#É«’o½{$‰ÿŽtÙ›Ö…[ê<�vü»mÍòD?D­qW÷e&/ﺿ[2Ã’{½këŸZ_¥ž‰ÖD6iÆ�ÂñúVW,˜œyMƒª¬ ÿýP?øï‹¯jçýª_GUøïúŒ¯!ÊóþÝÅ ÔbýÄŠ…„™Ä¿>ŽÖ¦ºDIÍ�ÿPe\g}Ôˆ¨¾³Vn <®fÿÑ ÌÿùÈëÿ²0ã?´ËøçuµN®<ã_é>×ð?¼º¼…p¡Ò�¿ßÒn­|æ”bYIQ×€§º« ¿pJ–‰²ÚÑ|BöœO߯A­’ñ[:EcH�úñ>;7òrª2þ ¢Úqâ CŠ—PÀ÷CËðvæR{]Ñ�CbhåûCu‰aý¬�ïùÞ6LL¬[=ŠÓOZQü0Q\ô­º4zfà=q¨HÂ\ <ùÅòptxÇ‹€·½øÛ»�?¼}9þá¾}صg �Ö®ÀÆsFð£ß¿?rá–ì}*®´ó^à¶ÞZØo„=dyä„"‰õ.˜§>Y Æá²Hú›’ ,GyþOâßDXŒõ6ÉòÂèpÝ–_¤×{iü³#¡›ÑmÝq ÿ‰Yb»_ê²À‘=¿©ãÁÎÿ•“äõ¢eügügü³.Íqü¯y2±•;i¼ VÅ=TƒCØö´1j kÛs‘üœœP!à•¼|Š›ÀT ü<°KÞ ‡­™—פ2«u=Ã,ˆÅµÄö>Ñ7#N0gWö¾êúä?y€1ÓAŒ}‡6õWoÓ:Ò„þp=UÝGë·._:‚�[ ZzaqpQèÜØnà¾ÿQ$¯¾’†�·¿n^{ù(ز_þæüÝ?ÀwÇî}cã©6·id˜0º8ãä!¼áâÅx×—ày뇊`aŒÃì¶l}.n¸íÛÀ?ÿàeÿµ0Ü’P>zhåk`vÞRzWØîœð}h«‰½ªB Lr'™ãøŸ%²»®®zï©åûËDGüßø™§ðÞw?f—Òøï‹¨?üsû÷cîxqŒ°@âk ŠûbI~è—HøŸaüû÷bº‘Š»ýêÃ:µ.³UU5ÎpMøïªãÝÿ�©žc“øïƒŸ×…ùß%‡ h¥æü/ðïÙa‡(î›YÄ¿aó[yÀôuãÄ5î€ÿèâMÑ1gºQdw¯„qσQã`Öð¯ä,¨ù_Û€?f@ƒòú?ã?ŸDåŒÿŒÿc ÿC«‹ëÂ3±�iÈÅ1Ž=òÎ)$êzΘ„úí¬Ì(¼ Ê ?ñÚ!xDCxí%”+"G'B$¤./‹H ál�e$ µF×3 ~,X‰‹2>¹?K󒈧,fÆ¢èɘ¥õæm å?ý\õÝ%£ÃX¾ú4`ÝeÀ» é�?¨œxàÕê À‹±jp.^;‚‹_8‚_~ïJ<ºe w=8†/}ý ¾Xü=¸yv¬A²ö:aí.{Ý(^ó¢Exñ‹Ê¤ÕÐ ÂÆHÑÏõË [  +ý´ÂÚþ!ʧù½ârgé9Þó7µ–áq¾Ñî³ þ»“ |øï‡4þ£[wg‘6œ6ªÖ è‰Góqþ—øç›ù¬à82ø'¾¶C°—»h Óø8óú„uau^]ˆküó¹Œu”¾`ôEâ ãŸu”Å‚™ÿI~5¼R^ÿ{3Dvã¢3þk&ÿÿˆKø_þÒò1> ™ä½Ê`Ú±«ÃàTÆ7’N&øq�¥ê‹ÏZ’‰…;65€[‹,Sl­ƒûNJ¾ ÕúKãí¹^•ÜÐÞ©åúìÛ‰óq[ÞoÃÁæ�ºâPèììåƒmËå‘“óuY} ºöJ¦¡‡ 2ûU×C‹–cщÿ\ê?õeàÛ¿L$nñXybq層¨/ŸYcŸûtÖiÃåßåoXRÚé™mãø‡oÆÝÆ�Žá©ç&‹² <»}¢¸¸78VhÕò�ò–@›¬:ùø!œv ^U$¬^rÁN?q°èõf2P'±,·m‘ç&‹sßû#àÄWgþk³XûýÀá§€ñú™JZ”ðÀtPÅÓÅ?doô·ŒÕâíñªÃØpê¢â"y—^¼ºH`-òºwÅÿë~ìt¥K.^…w¼ñ¸ò yöbùú�?Zþu¦þcghl>:â:dœ’ñ‡Çðh©Oj©uÑÏðj#ûF¹rƒËHÏ ³�ÿŠ¿uGÊô:%p£ñŸ2×Õî#ük¨æ57ëLÍ"þàüŸ×ÿÈøÏø�xeüÏcü�‰«5oÄB§!n¾õM˪¤>B2¢¹rqŠZpÈ àJ«€Yµ YÉš§ R.H׎b„Æ`@÷ê"×HrŽâ‚¢î€õ9Öª”|_ÈëúÂ�Ëå;�µ#®'‰P,mn ‚"d0¤�:{Ž$ÄúÀcJ—avç�’pøpµ³jpx%†–®LÚ7èýl‘PÙ�ˆ– ;}0¼½Èêqâº!üà›‡ðî7-Áá1ƒí»&±{ßdù̬»'ñÄ3ãØòìzOm�Àö�“ØwÀ`l”o:´·"Ž�ߨ˫²âxÒ¾µåލÁ"‡1t#TpõdSó!Y�ˆ;Ý^ƃšáe†ëÖ«½¢h"´Ô>‘½ Ãcã8x¨z�8ï¾ýëÀ®‘¤3Ö‹w ÙÒdMa“G'7Xþ¥Èå¾ýU‚ëàaSè…2éu¨þ~èð$lÎíС*™eËì§MR ÛgT2†©|V•ûneމ«‘EÕñò¥U¢jViq¡äéË€{v�“çö<Üñ�×|²PxeUFƒ •¯(:ÿ˜ƒ›Ù4\ž –À‘>e)vû›1¢þÜÆ?¡?šyüßÖñ-ƒùµçáŠw�øR¿ºs�$þûo¯¨ÿ®¤?$×m(sHÅ)×—ô˜Êò�ç/GWºíë;Êo%wá;T>¼ë"/-x¥“‹ãÔټÄkŠVI�U}õòt!»ãLÇ‹^øï‹:â¿•“îp²ñ‚e�ÚÚw6%c#Ÿÿ›)Ïÿ¡Ñi¤Ö[ú{"~ÏþÛu“üÀ.ø4þÙ5ªäæ‡*eCYÏ]{ãz¥ê¥ú? øÇ‚�ÿ[ø!…Rgòx»ˆSõ}NàhE±d\Süa¨ˆŸvýˆ˜RãÄûO‰rÝ.¶„êÏ&2HËVLê¯õiê5”§ôðüÌÌä8h¢ø±~|wõ‡ñŒÿŒÿ#‡ÿ�QЉ?Q`yz?ÐÍ*ï¥)Гy'I:t �å×Φ²¿ ðO9¨“ ¤óìÎŒt¨Z¯^ÄÈLI·¦zÔS®n%3Ô5'Ša©b…� }Y¼kÝSOª.öîÝ‹;và´ÓNÿàÁOÅ•‹_ÊO¿X²³E¶»ËŠ“ý›ó4:Y$ûN)®,&Õ3ÄûðÐë€ ~!”ÙÉfÍ[€§o,&ÔCeQ4ŽFz(Ç@´¥váº4Uüßyß^t!—¼š.%ñ?š�XáÈ&Jvì÷ÏøŠ©ÁG“g¥ö¶O›”ê’8¼áÆÇqÕûN+õÐsÂÍÿºOŠhý¦å‹D�ÇÔC¼?+W ¢+Ù¤]•Ôë†ÿ¾h–ðoíoǰ׳âì‹®¾òTŸäÌóW¹ýÕíâ+íü§ŽÿÔqØ¡Á.DÒ’"ü—&E“žñ™Fü›fýxݤ­fÿòÄœÿóúÕÂ�Z|bQ>$¤“’Òö‰†cô8ßtÜÄ¿�_Ó÷¶vý´é›Ÿ�b‡‹¤ N¬ ?sà ¿·”ñŸñ×›üÛgNŸüS¶OF¦Šœ“‰ `„|ö28 /ã;�H†þüšæ… �T(1ÎKDLç¸ÆëD¾½Ô]÷)@Žâ…Åm9˜BÙWž•%j óqÿRà/ûí©†Õ§úV$‚A³�Ñ:µ¤æÚŸ~æóËÏmÛ¶á±Ç<ÜóÑ"ár(n´®îk{ß6˜‰ÑêbþÑÍþwíC ·^6 sçG?”ÂÿÔÿ¼îE¬@WúPù\¯Ø?-É¥—Çý©:O‘Ž„w¼é8t¡�»Çk= ÚßU$¯ÿÄ£�xØÛ×lE.ZäBsj¤±PÏŽŸû`~jx¬ïã¶Ê>ý˜oÛÿݨ ÿè‹Røïš¾üçî.wbõšÿwí™(|c“O„æù_ÕHàßÙÃ빊–9;øwº‘¯ÏoƒÑz¥úN0J”†®E:5á¿©¯õgƒ­fÿÚ?Îü/uZÐëÿE'�V^=.y•iiä¸ÂÞ/-=«zFmÆ¿ç“ñ?ƒø=8íªœ¼RTG8òÛKðßÁûâÇ,÷Oâ(â×#bÐ_ªÅÈó~Á@Œ¥q¿©±Åù®Žt#8ÆTÕ©€Êë±­™ªßºmU!”ùí£Tëì_…J²ïŒÐ`@ý–L£ÇD÷[ó ÄXRPÝ4µ TÉÁ…/}'††~»Ü�uß}÷ám§ÞìøNTK‹äÕÉÅ.u»-'SM…�íí’»V{•íö< <øÇÀËoe4ZuiñëÏf`bo˜€ŒÂQp7毒æ:þÑ'Í<þ«äAoŸ·Öö6B÷<Ÿ›¿°×üôCAï&üwbÒÿJÆú“»?@ý†O=Ž»îÝ[&샱7m9P&Ž®½êÌzg–:%m–+à~ùžËOÆõ7<Úéí�VkëËÞ´®”k·Þ¾]麫Έü®Òƒ¦èŽê |ß$æí§r¨ô8ã´ÑN;”,Y[œué׊~�Yúî¦-ûËq¹úŠÓ°þÔQ¤ðß_ÿšðß‘ƒ[*ü_V$-»${íî¿3/ùjéw¶�śۑµù‰C¸óþ=¥Üø™'Ë熢ÏßúÊ<ÿ+Jáß͆ýÊÏqPñ' ²[JÆÔñï±Áêf'-¯«iejA¼2^œ#è’ŸsùÄÈ})Ž!3‡ÿŠÏBœÿµ�Á1¦™Ÿÿ�:þ‹äI™DêþãR¦$›È*lowcalkÆÆÿÌàpfÕ�U¯B¦˜BŠ^U<`Ì�#Ä é/êDâÐ@Ä]~Þ;µ�ß)u (ª¿À(EÖ‡ÔŠEɺbQ†`#ÜÐÞp�� l=Æä·‘rɱŽlàû’¶¯1cÒ¨õ¼NG:9=ht=Vž°¯~õ«që­·â¯>÷ø·Ç§zи¦ÓN(¼*'¯¦DÃ…ÑO[Ügï­Ÿ 妸~ïïgýh‘äº8”/:¥øõçe0;nIâÒ»[<—ÄN0§ñŸšZhðßõ i›ž8€Ëö;˜5â†(Â?�9¦º}Ï>½ëCëm¢H'‹.{ãñõ-llᑈ‹bÒgäô¸ú½§u~{£µ½MdõK6ùñžwŸù„Óƒ/T:[ô‰Å¨IàÆè1Q>€€Ë�,/_(Ð…l’罿|¯(»¨Hò¼§HæDøï·)ü÷ÁÂÅ-�» î²7‡›¿ØíÖO{;¡ýëEÖ7>^$Æ®ºò´J~žÿñïyùNÉþ;ѵŒ¶É4ðÍBÙV”«Sñ¼EQ}¡KT5á?$?1‡FÝžaüëî`Ìÿ |ýo“WËϯwe:jT'Í�bnÉøOfüwÃÿâ"½¤ÀôŠ—‚ºÿ`¼ÐhH8–·&àž”9h=Y‹Q!å$ŽWЇ5�Ɔ½éÁøºüu­PA\…-äTë&ç÷ `B™°õÏHy¤tvMÈ üBWg°]ŸšláÎ{�ªc8¼¥]œb5ð"ôÀC UÍ+T¯³ñµñÎi`¤È_Z‰w¾ó�øÇüGüÓíÿŒ~£ÁK7¨6Ç€[¾ -SZ:œx2ðÌåäEëŽß(®àn,Wkë²Âæ+^ìüjQ·N&Rð ãêTƒ.1H Øsÿ]ÉML}<üÛ�=ᶬ#A ü÷ÓÖtÄ¿ï;³IñýÊËOêœ8JÑ]÷íÁ%/_ ´üÂI…8òXÝk¯>ŸÿÂÖ’ßlÑ'ûB?¿²q7ý ïj/í:µªò¾fø8óy€c­ {[åm}ì,ÓdŸåöž$þû\ ÿ}½Ó�øÿȯŸSö±ËN³~Èî„|Ï»NÂê"�çÿvü‹« ,Ü#¿ ¸áuù<5ü»5êq¸³)\#ýK›Á�E/ü³±õv¦˜ßlâÁÎÿ uý_¬ÏsòêØ¢êöÍbÄlÉøÏøïŽÿ‘ACkªÛêÇA콇�©«lâ2}®­N/m4\¬ÙGNªžÇu Ð�Ÿp‰9•#çø¢€•ùºÊå!ŽtuÎÃ;œ6,1}\Y¨Ë‹ŒÓ™H±1žÏP\g̓«@!’ð a´Sð’æÅAà†Ÿ´˜�”3ÃëФœ–ëæ46Ê"BÏšg5l5ß%ç€Fªç޼á oÀ)§œ‚Í›7ãOÿ©øµ¾ø±zÈ=7x´pìí$ÚíaÖ™ÈëㆀE€8t@ž{êKEbë�Ó/ eƒË‹1:´ïnȘ.ÇT,ªù$èÎÍüw!£ôš!üo¼`EçÛ·¦MMøï“:á$úîd_õÞõån¦©ö×îȺ꽧×üMXHp»3?C_+SiGøì¼/ù—·ÏŠím‚¬J´Á)¨ìS}�}¶…üBLÍG&F°Q SŠÄ [t½ç]ö¶ÊG¦l‹;ïÝéìlÕØ‰H-ØHw&nS‰{»ßG~í¼ïßÝ‹™${+¡Ý…eooÍó;þ&¹^ºÿ¾_P¾-aúøço½‰%V¹7 µ6ÏáŸÜÖ�ö�H6ˆqàãïûmfÿ²uÐyAÌÿ kýoß(˜“WÇ&-.’XÅú}lGÆ?�ñßÿ‡Ÿ†)þ°ïÏS´O|o›ÿµƒ�”ÏQ‹¯ðùÌ’öY\+^ ,1Ž& €Mގƹ‰XŒ÷xÕ¸<®=)±0âü£ï ë:A9’gXRƒHñÂÂÕå2ypÑb]ì‰P(j1^ ,ÂȤDRš•‘u‰Û�HµM;¯—ÁûÆmebY.˜‘½÷Ö¾‚·  Î; ÿò•§—ß?UäQ¾À¯NY,šú/ÿM41 lzjߺÚ2Œý‡G‹öì'Ü¿yw<¸�>5‹È\\tú´ããò‰ƒÀ½¿WLŠr· ­|ÌÀ’fûé[}1^ÿ£ßÂæ-ÝžÍÕFeòªN�´{Ø}���­kÛæ‡fLWW¿ïôò!å7uxö“&;.wI¬‹Î_�)§œzà¿_jÂÿuWŸU&ì>4�gšltóã°ê‚åêÌœÿ}qÿhÐ%I¼¯mk4Á»;þ¥wË …c2aßÁËçª0íÊVóF/´4οJ¯éâ?ØhÍÿ mýoŸ·´èDd:†É¾Ò&÷?Zfü£UÿŒÖ®�§AJÎQœÿÇw”‰,ß ¬~=Ž4 Tã°Ò,v^Rß í�êu•"³K¬uh/ä 1$dH·Ñò#>‚¨±�l{ùU y-HôMÛˆb™L7⑈# ÀäÅýöUgŒÐ!/m4Öw4Pü‚p�´ç®݂÷½º*þû{€ßÿráÃëŽ/ `¦èémCøèŸ­Æ‡o\‹»¾·ÛvbO‘8Ú¹wO<7ŒOÿíJüò~gq*a?£ôw�âßþîqø‹[—ã‰g‡J¬.;ö âŽGñ+ÿýxü×B×=û3JƒEBì¸UqùØnà{á8ö�„+¾¯ø”7 þHÊæþ»Q<ÇÌ,þ?ûß7ú·�u%û–´oýõË‹Ïã{ï"JÌ`ÿÉ„–ÍøvæcHìÓþ÷¹¢¿W\~¦BÕíj�·Ô'1Ì_LýÇÇÞÞZvËÿziù湩’M$ÚÝ\×uÚÝ£ýf*D®#Xý•˜%ı\߯ø©ß¾W_9µröí|ÍøïBÍøïƒC'üÛ]€ßþ›——šYÜÙ]‡öv``jøßëÏ9;ÿwðo—àE©* {aêøwõÃ3‚ˆ;=ºõ½[òVã¿ÉÖMrê:³€`¡ÍÿÜvHè·“mçÖúŸ–ÌüîÓL3O4r\ýfÈŒW+ãŸU›'ó¿ÙñÅâ×Ï[p¤iÀþã§w50np¹Êné :Eà|$Ic¹:%“®ãŒæ(DlˆdÅIŒ„#Ez×ú/É÷Óµá™cÃË�´'ò2ÃÚªv*xTÇ)^P9PÖVGŸ§Ÿø{B/{Ûà²ç‡Óû‹_ó¿÷i üÊß_œ:\üè}Ýç‹‹¥¯îÇÄäÌü¾w?á#ÿ{5>û•åOj¬÷È“#øÕÿoî|h³EöVÁkÿp6?3 Ó�Þ>4Føë¯.Ã'>³‡fŒ,«5Å?#Ëâs›þØý°,[|zµc©€Å?½™wþá¿™fÿvGÈ·‹‹`{1¼þ”öÚ7ªÝò?_R$½.*ÛÙ7n¼ Kò«þ»Pü3I2ò„XfÿV:òwž_>è¼W9•‰:Jù©Œ™2vƺ—Ïdu 3I·|k >ô©µåí‚]éõ/Þ�ßüÙ­e2kÆè@!ÿÁg�ÃûeùÚ‹€ñÅ/ql‡Ö¡-0[þ�ÎÕË—2þ‘ñÏ} ®£ùº6iCh�Ò‘XSrÿ#²aíËÄ|/ãÈøW6ÈøgeÌ6õxgü3�3þqÌâß><'¯æÑàÒŒ§CÆ¿’ÙþçÂü¿÷)ª®Ð]GµÞ¥ï 0C 8”û­áéý“0CÁ�Hñ  _âœé¡Á­Â)>$Èðr#ëcû[•ð�·�qÎÎôŽæ­œ+üAA;|ÔGÍ›TYâxøÄúÁƒ5=öŠ_Ô [oÍZœ»~ ú_Öâ•G0P¸Ê‡ÿh7®ÿï»ðô¶ Ddûo_á7iÔUdß<8zzÛ '� zrëp¿MÊ7%ö¼õÑÚ`Ò 3Ùq\YèB*™fÆ€'þ_\ñ©u "XNu€Íø‡°;^�ø§X…^Å8Õd¸ðQªLð"1õUMÔN>ÓÃðÅ“G¾ )ÞhžJ_ïÏ åŸì¢Ýp¿‡t˜È·o�OÈ14¶&æ[ëcXG2þy›ŒÉ›2þ3þ!(ãÂìø˜ÃN^ÍM²ã–ñŸñ¿æsŸƒ5 ”6ì{ý5zM¤3 At€”Á¢,°‘ ‹W;'mPÃÚç>$uÐ25ð’§xCkcD÷SNéT2âTÀY¶)g¤œÚô®æõ ÇW–Ÿ,xÐèÙåkzKš8lù;D4º¶H–T¯«?wÃ0þüwŽÃo_б1ƒÿvã\ùkÛ°}'{.ÕþCE¦iGÁk[‘xÙZ}?(oû£¦ñïAK÷4hß´h¸ÿgj ú¤6mY':Tôõé�ÀãEß·On«lÒ…–ŽöN<Ìýñ¿Æä¶dZ´¡PbHù I|•>1>™dügüGÇŒ—_Í_ð%ÙVø %úÐËÙ�/4xß(W§b$ƒëB”>—XoÛÖu<ÿ¦þq2HûyÊwA±½]qmƒð+¦Ò=ã_Ê2þSm¹MõqÆ’œñŸñ_«t„ðO3ÿcm¦#@õ˦2þ3þ§ƒÿ†j^¿caþŸ(®í'âHЀŸ}½C0�œÑ!’¥Ný9£dÚšÊÃ!ž[�Ô¨^β›ž= à™Zz%§nï�KñŽ‚މó4@^¦áç‰HX?œn´ ÒÄõ4±Mj~DÜŽ¬ÿУ¸=o7zVh¿ëA`�zã�¥eK‹VÈÖœzâ ~ÿW×à�¯Ådáÿï«ñóÞ^ÞZˆÝŠ„Ív`ïÁ*‘cÿöeOe{kVLbÑHÿ‰£ Ϙá§tÁ†ÃÅôŒ4‚–�NbÝÊÄデ«ÄÝžýUßmânß¡ªÿ»ö÷f<\豘âò½›€�÷É2û6Â:ù0ËðÊ3öWÿÿº‰qŠž cX=§2çI”�£Îû±‚+¢×Ø»:Ê7‚nœÓEOÌÐýç�QçHê$ÿŒäK‰zÑ…1Iû š¸¯¼�‘åÎ &Å7ÂlÆÆÆ¿dÆm—ñŸñ?Gð?Ðñe#™Ž=ÊøýÉøgÒz¶à_Ôçv<Ææÿ#–ÀÆWÎM‰ç˜àQâêÞxªË ÷@] :°š¤eÔà‰Ê¸#‘âÍytûó‹#cT{@ çå‰O‚²�Øn躯ÛIÞÜá•§)¹�“×\ ­§¶ÝY$™žFDkO.þÙ'Šìÿèúµxÿ/+¿æ‹pÍÞŠgÝ�ø^Þ‚Æ‹dÏsŹñ*ieÈþŽWïÕÃ_Òè¢I¼í•{ñÓo߉K/Ú�Õ+ªDщkƱñì™O`Ù· ž¸zÜËxËËöá'ß¶o}ùÞRϽjã¬\¦ÎÙ[&·î©>5Ù[ ·í©’Zmdó„kׯåûž¶ß%ˆ�/Æp%zâRßÛžñ�Œý��ö§¸ob‚Gƒœ„\¿àò Òãáêiì{ýæý>¼}ë9 m·T;¾å¼ZR¥êHî¡_þ ‘=ãTë•Ð=ãŸoΣÛ_ƿӋŸ#dü§ÚeüGr2þãòiã?Óœ#ÊøǺt`5IËXÈøOË<¦æÿ�Å8Ô3�oLÉÖ`Jê·µïÈQbº¹5õñ†™”Ü“GÚ(j[˳÷ » s²^�T¸†Õgùm`ÀÛCè>r¼ìëÖoTo!Ôº-)ÅI™UËðŸ~aFG¿sãüÏ¿;ˆáƒ¸á_`qê±R‡Û‡GžXm±ý¯Ú‡¯ß;ŠÍO qÿêõ{ð¯ß¾ Kì=0€ÇŸ½›F°áÄ1¬]Ùÿ®­^dßjør¶<7„>ïp™Ä­e¯Z6‰?ÿÒò"ÿìtþ†C¸üµ{0 wmÙÝWm ªÉÉêVÂE=ž¹µtBMeãb|¾ œûS¡ÈN:ö9X‡Ÿ‚Ðc8)êu¡Œÿ†ÕÂDí{Sô6y2Õ !9¡KÃ.À<�Qè@=üÀt¬'êº5Rm}U$v«x¾ÿA|Æ¿ûÌøŸeüwhŸñß/uÆÿÄá¾-—é „ïeü÷CÿÉz <Žêü?8zÄXê‰=éw;Ÿê`ײ&"_Ÿ¨YŽilËêLÙyƒm; ç1¹ŽoOhFm¤Þ”àÉ“ €ÌÎ#'HöÏ~ -9¥¨¸M´|i‘ÄúÀ*ü‹×Ž–›¬nºmù«Ioh0N\xÆa\óC;°vE¸oãYñóïÜY&¯,Ù[õÎßpïºto¹Sj6hhÐà¥çÂe¯Ý‡3N+“WNö�¿e7.`·-.�À/ýðœ°&qûàx�䚈‰ 8»ëk麸üéˆËFN¢,9§.åÿ ÿÜgLCûX¾¬ç^«+ë¤xP/„_#™Îé6ü\µœiójYHµ�_ûù^vj¡^‹#ŠÇÆ•Yÿ ’‘oËIrìPžñŸñOÈøÏøïv¾«ïgüw“ëø*½Íì¬w3Í.™‰Í'3þ[ôÉøïV÷šÿ‡OÀ‘¢�àè¼M ÃŽ¡ÊzçÁ&ÀÖd¬ú5ɉS:³?B\ õ¨øþQ“CPÜ7Jñi±kªïQÐÒýÓ¼ùw9.šGª�5ðÌÐñ¡È¾ypû݈hM‘À2‡ÑFCC„?¼n ÞöÚÅå«frëd:£?$Lùš�ð;¿ð^ñüxÝ‹÷ãW¯ÜVðÃ1C'®�ÀuïÛŽ—�ßñ>ÜpõV\ô¼Céùb�Ú™Q‡:Ž–%êí~8¼[–�WŽe ’ÆFÆ?2þ�øH×KØ�xûPnÔsÄ'5�ƒñ|ª8aÐì�M¼Œz&ŽS‰j¾É1‰I=5^Í¿j%ô%.âåØ5žWüLôóÃ…„�{û�Œ±±Žÿmçtÿ3þÓ}­u#Þ>ãŸ·ÏøoâÁäfü£/üOŽÙl2Í-¢‰½@Æ?2þ—ͳùŸ–¿GІ¼ìX�â;‰q�¡ Vf;”ôgeŒ”�#±,ãŠSÕcaÔ0ª�^ëè: =B?)ò6&%ÍüŒâK¬®ÑŠò6 @p¦ú¥Ç±ÿ{/8�pñ9Lþpá‚#qvÊ>×ê?ýÔV ¹­åKfþÁéÒ™'�áÃ?³ ‹G&Ûß‚¸xQ• kØ~f_[¸x�hQÂö6ÎÝßÖ½„ñ\^=Çlü¹zÌ%.£õ}ÆÆ¿°Ijœ<šJFõEë`DEÄú;›’œP¯ê\P—b_gßMÔw¾�bEhññÔ8™„nN�öÊSÉ5)y¼/Â>��Û4 ~a$-;ã?ÔÉøÏø²)ã?ãná|g±nN<5Ó1Kf½¬)ã?ã_Q¿ø‡Ö‘Õç6LõK�cy<ƒóÿðªâzö )àòå+À9 ÂÜOʨ9ö>ËŠ¸^J®Æ3o/$?ËÅL€”Þ®0qBÿªn,(¸&F×GÂá8½� oG¾mjK©hªËrJðõ})þ†‹ÄǪÐf×÷bþCK‹¿oΫiÃi#øï[ŽUE³'w¿ög“áÅ{6y³nE´ËѪå“ÇdòÊÑšíÉ+KCE×.O�•-[µÌ>¡�hÔÚ~4.ßý�<¶÷.þ°†®KÆ?º-(ü'Ç™"|°±C‹ÜFªÚÝ–lÊínd=‚ò‘ºqýùB�ÛÐ4«—,Ó2å7 ˜ &¦¬XûxäK\wׄ/^ÙÃ43þcÊø—|3þ3þëïÿ˜øÇáíÈ4‡Èî¾²w¬°qŒ(ã?ãAŸ9;ÿ¯x…Ì!Ì2 x%k½„Óûi0?ˆ¦®" ʾW'=LŽìœ0hÒgƒóxnÆx� gët 0Q#ÃCG!È8Ùâ^Ú |Ÿ!ù™À×8{pÇñ• e ¯òÐéñI´c ú2}Blke8Þû")#£ËѽúËñ{¿ºË—n¹Ûà<�=ƒE’å”âW¤eGæaoG•–I§Ó޳Ъv›�v^Rôûä5Àê¥Ýù pJ­½›äq‘À"›À–wìªNÂw3þ±°ñRcYËpýáãXë`˜Þ¬@òòü(ã†�¤ïq�ÐUû×�É ú1Ùa5±úà훾#ØYŽ#$Oo{’>‘/Þ—Z†‡žaúûþ2�•Ó/[Ù:ãÈø—ºgü#ãÈøŸcøßLv» "ÓÑ'sh2þ03þ§‡ÿcuþ_z>È&°Ž �9EÜ!F¬cÂi¹Cå¨M(g‰dQÃ÷X®ÿÎð€ËÚÄNmøw±°1•‰�៚——c�î³Ô/zÀi†7Ôf°ç] AŒÇX/É1©³2hw Õ»¡ì­iûŸ‰yÛ”g×g69î„Ëß¼ _¹ã0þÇ_ìÃ_~ xÛŒà_�9ŒC‹ŠÄÕ Efz¢~~�Ý}68Ð�Áñ¢]âùžAy«§{î•ÃÁz§–ðŠñÊvÆÿÂÆ?˜~&23›$S|c�eg-ìÄ|R´gen¼jâǸqƒ>ˆeúÉ^õ¹(ß¹g7ýå¸ëÞÝØ´åV­Æ%¯Áeo>N•ÏŽ'_"á\&âEéqŠÆTó!ßÎ$e¸þdügü+�3þ[ñ—‡¶•ÛdügüYü›CO�F×#Ó1N6Ñ8¶=C2þµ�†ïÈøg¬ŽÉùÑI uïÄ‘¦êŠW�S’Ü`ëâÖF èÉTÉ/,4-“ôHœçàHQ›ÎTmí‹2´ÚLÂ#Á›ÔÙeƒ¤<£¿7Ô j‘„ÒYл•mâP‘Àz  ŒÉ‘"(÷ygßâÂo}p5¾zÇ!|÷¡q\÷»ñú—�bݪA,*y˜ÆÓèmÓ”¹ö?]Œ×ø“îÍàŠê õó²L}&)ãÞã¿®ïϵñæ�b"TÖ«Ç\¾î¹Eáý /_�Ø£:$Æ!:'ÖA×kþÓ}øø'7AÓçÿþ\ó÷áº>×^}vàUóç뤨?⢸ª%Ö¨­ j^��bßÍøO”5œÏøÏø‡Ä»J~´ Ïøod‘ñ?Cø·Iû¬¡eÈtì’ÙÿHÆ?c‘ñ?CøÇ14ÿ/¿´êuÕ£kŽ0•[@¼Í«Ù¸¹6…/yO²bàÛ8›7•sT%¼T/ZõÑ<ÛÎSB>Ò:(™r!GqàÑl䪩ú ÞV²”‰,¶Ä�IðIÙªÑáã¡}ÛIê^û¡á‚Ç^L…V.Ào_³‹ ÷?:Žßý³©ñY°dÇz8qË¡]̘1UÕ&³R¾SÆŠÇÂÃD\‡du)KN¯.GèÑ6 nXM¢°áب£øy8-c˜8ç.^?tÃCÉä§ë?ö½²žgA\&y;ù nAêW¬zŠÄUéîX°‹zç?”ôå4eü§x4}6ë–ñ?¿ðÊ©ñ0R+ãÿGÿæàcÈo$<†éPñÃòädü#ãð˨ʎØüoÖ~• 5o=*É+Kå– "®$ï°ûÿÂaJ´ ÇrËœQuƒŒ§†Ëj–-Γ>ó–}J9qªÏœœ~@»CÛ¾Ú7B„íIUVVÖs6 }æzÄÔ¾MÞDr¤½•¾„ĹD‰�ïBDÃÅ/>¦á�zèe/X„·]2ŠÏ|ñþô¯÷áGÞºçnX@·N—o,<¼»˜(Õ˜ ØDW“ßKLeügüÇ|ïØ†ºm›ítêQ¯®EMíS>$��`bò¡t‰ylzb™œêB¶ÞUï=«V°�~ vÀ˜‹Í6?T¶Vø1ü"]-ˆüãZû�ñ/)ã?æx/Düw÷�4eügü—gfÿ“‡am->™Ž1ÛUŒM‘ÀÊøŸþíÝ@£UbÄ>—y ñòªY§`‹J³󖪧£VÉÕáMˆOñì^G΄„¥r½àtöKó¯ _71“è@š§�ªŽih¹l3�Ø59õä•£ ÎÆÏÿð2\ÿ»ñ§»ïÿÑå¸ð¬¼ « '¶jÞ‘N6F¾ãO°ïóÿ7ÿýÓØ¹{<œJÁ¿þn¾vËôÆÿ]÷îÁ�÷ín„ç}é+Öbý)‹1ñÆ"6š[´ëºó“G(B›¸^CœnðꔂþHÇeÿëuBoß6±ºÜôÄôCöáîN«Š·i©í‰•lŽ›j1ªôâc¥Ô¯¸QšwY/¶Û|À¿Ý!wÛ×·Ë®€5kÁ$¦­}AN-ÚïO'ül>Ìÿÿ)"¥Ÿ+Ñï¦z)žÿyý?Cøßs`¢¸°?¥(ŽwèúϾƒ.´áô•9�5]:¼µH^=Ñ£RÆUÐþm2ëà¦âosQz[µ+Ë&³V]ZíÊ´ iˆ;³øæýÌâ* ›ú»'Ž V_‚�DŸíÕç©þÇû3IÔpNâ„-È\Ò˜�‰ãFP"8ˆ¯¼Léë«0¼|&ä3ÖAÀ�Ÿj…µ¦Ö/ŒU¬'WŠ/[é9�¸]mX–~è-KðGŸÙ‡-ÏNàs_Ú�ó6¬À`ËÛ zbŸþÛ•XºÄàÀã¸U²û³Dã“„û7 ã÷�âÞG‡qö©cø±7ïÆò%Gœ†;°Æö"¾­SOŠÓ†ùáüÀÿ5º›;&yùëÊ7É jÁÿÍ_xºóídŸú¯ñžw�"ØÎü w&¹Öp²ªUލg?ÝϪܫZëRúdyLJ¶¿¦a±âã£tóöcsû$gG=f‘}Y±&uQ>ñ¿¹H¾ïßÞ…#A—¼| nù³—ó}þÏø— ÅXÉ#"éÿ³‹ÿ¼þWøÛ 3y´èäêâžÑúÓVbóã‰Ç�dš9²�\9ô4L‘ÀÊøÇìã¢ðç}wÁì½ ´lc±»4'² 5¿Má%“/„tÆhÁ!›P‹ŒèÃ²Ç ¥åë¹$Ò)E�å”®Ì ƒ€�Mq`1 ú˜P¦_±Éƒq{êØcäw1?ú1ÑÐY\XãÁÄ®¨ò¡‘˜.�»aozÅb|úæ}øÜ-ÅÅÈ;–âäã›Ýñoþiþï׫7®|þ¶e8û”ÃxÓ÷íû_¿ËF f‹žÜ:„ÿï |íîÑò»¥ï>2�×¼ð .<óŽ<%|Ó¤œ¼¾…„j‰æMŽÏybNáJÔþûá;7ñ- ä‰ Ô(þî@ÈsŸ8°sâ¹ |a”ò ÞO÷Õ°ç¤ü á›ZÝt?ªã�çóݨ½iãù+„ßvÖ�rþ�<ÄâŽÛÑ1ü�š­Øã'æ3þ�$© QÆÇ ÈøŸø/õæ}putÿÊúÚI3þóúq‡RúÌ$þí3±öoFÖ€†×ë÷Ä ZhÕŠ£ó æ9Mözhl+̡犃 *kÊøWâdD§:â߉,›Ì¢¥N|INd- ª®ÈµStðï¨]ª\-¬¢6-íEµ69zbp¸q@O�ª?'T y |Z¿‹c¦¼©ƒo¢&-Ý<ÒÇ$Êø"KQ”Æw0á ·Ú�>‰�Y}Ò@Áþg~pþçßìÃÝŽá÷Æ;ZX[wúïã„û[Tþý¯/¬ÄûÞ¶¯ñ¿ffÞÈ2^°ùÎËðÅo.ÅçŠdÙáqi»Cc„Ýû»‚d†É$äÚ�r)�¤üµä�€•Ô‚j.⿳Ҳz_øŸÿøøÆ¤kñ`�¨Ó´XçejÁ•´u‹ÿømïhnWÞÚä˜À~±vLzVÐ?xnøÔ¦N»ú6œ:ŠËÞrb¬/ó¥Vº>é±å<êùŒÜI¾*M�CÎæþ§Î~‰ÄǼ�ÿ#]ŽƒD�y€ÿè¼\µb,eüÏ2þ!±Àû,ìõÿØv˜â�샯m"«ã› W®\„LȾñ{|/Ìø®ò³´oÆ\~„ñoöÝY\œm­¼Xv2Í’NÔ½£(Ÿ@™QÏèK]�xÎÏW gùý³”¨ëAèÐ/WFDLé6¡¿$"Œ—a]�Äf?@EU§a•SýÚ«&"Ÿ×_ERÑÍ}2=*½ô4h 6ÑÙÖPâÍ‹é¥c_tÎúa\ü‚EøÇ;áÏþf?Þñº%�u—5Ü®·m÷ ~ç­ÅþŸI¼ëÒ=E"k?N;~ K§°+kÇž|ç¡Eø‹[–ãÛ..W�¿P×4‘Nää×-ˆóiøN1ˆLª¾²s¤{DAg#Ú3Þu•�Æ~‹Ž°Rmßúû„JzŒžˆˆ&Lõ7C´nõ ‹7>nÊ$Vm8i kWMoד½‡lœ¦•¼²tþúC ‹Y&³¸Ê¾i²ãD,±g*Yn—ØIár^á¿3õ‡ÿ~½}Îâ?"ù¬ YG—™„üz¼¢_>SvaDzϑ?¥g�ÒgÕOÂÏboÐþ$mä|†ty$ØF¸C¬+iœÅK5Ãä£Iÿy‹ÿ£AŸOóDÿÿ©? ¯ÿçþ»‘}‘ñŸ²­Ò7ãÇ4þÇwÀ<÷çÀäÑxk|¦Ù¤!¹ÀanfÜ?:ÀÔq@×/�Ë6I�¼¡ ²ä–ņ,LŠgu®¼cššd36 ˆ1¿Ÿ—s%:¡‚EŠ?ë%åÔÁØðI&=´Ê0¬ž/ß`R¾¹ÄÒ²õˆhìppOõ÷ %£„W^´ÏnŸÀIëšoå[ºØà•Ï?ˆ{=ºoJY³b/9÷(Âñ‘j÷›¦e€Afs°| g;±ñŸøïƒ(úÂØÄø'ôɾwÇ8þ6§‚ÿŽÝcøÎ½»p×½»Ë[è6?±¯\Ö±¿2ÛøÆ Và’—¯•}ñ¶Lõ³žÜâ(µJLø¯á:’^pë1g_E?%f"=êÏ�eŸ·–“ßTô{WÑggûK^¾®ì³o+ú‹¢VüïÜ5^Œ÷ÎzÌÇJ{Ûªö–Ê•…Ü‹Š1¯ì¬ùQRÔlà¿+Ùç•…ÝsýÓEQÛÞó¿µ×�÷ì.ÇËÚï±âÓRÀÌŠâoU©Û‘ÀÿÎÝ¥UþS�§ÔG�'<þåÓfˆÉ6R_'kO!럶âÎ"fX¼ZyÖgì­·N[Š×r|¬èÿ!ò'bwS¼ëÿÖç­îÖF•�Èë_�ÛÊâxhFð¿yË~ÜúOÛÊqqc²áÔ¥•Ï1õ’‹×²æÎΕýËÇyn›™Ãÿ±>ÿ[LÙçVñép1#åøÈ¸ä'¸äúßúé]÷ìò¶¯^Öa L,-Çׯ:;Þ¢ÛÅ{ã¿ËüûÃã…u?fÿ]Ÿ�Å¢)â6çÿ#�ÿ˜/ŽêüšgüOùúÿðÓÀ®Û@«ßŒLó‡šïÇJ9�s^°’L¢-;®ë†‡u&ê_K }Ž u0 >¨ë×�8 hHð0 ùÅÝ‘�uµ.Jj là�½7ŸÀƒ‚>Œ�î«WѰyÅóœ¨va¹Öò3cö-„cö—šC“ÃE›ÝEÙ®á%†ËŠóËŠ„ÊÒâÓn¯jŠ]¨žƒõ?vO÷�añ£íÏÕºøÂøÿݲ »÷õ÷̪™¤—œ{§?ýçE4^Ø`OaǽÅùþšÿPa¸å‹�Åߢªc…ÍDz—Ÿ!�‹_hb_í"õsÿqÔ6ÁÍ5ü÷Clâ~ˆZñÿ‹×ß[.¼5œ¹jîø#×=—½é„Fü¿á‡¾V,¾¤¦û¨»_þ߯ÀúÓÂB<�Ù�ÿâqÜô—OàÖâ· é…~J/^öð?¾!|B]ª’)7|ò|¥ÐãÖ"yÕ‹ì‚�/Ú›ôp"/yù|ò¿¾HØÁ~=ûÕ_B/²õÎ(úý¥?…Æó×\ÿ]üU1æmdŸ³U^°°¶›?€_üÐÝEâa{yÁÖDÖî×~ð\ñƒ§IÅúÄ¿M”Ýø—�•þy[;;Ù)JÙ|}ùÆÆWVÓÆwÜÛDQõ¦ÈEøÇ”æë£7ÿýS…�nÃçËþw›#ì˜_ùîÓðžwŸÆbFæ;žÿãGJüvO;–VŸë®9·ºíÈ»�¶5Ek/+ë¦"^XtÁè¥EâõŠwŸZõ»þ]¼Nþޝƒg¢Œ�¯?¯ÖˆÖ>úØEBaw§±{Ç›OÂU?y^[$˜ïþõíOwÝ· 7ÿ¿gʘÖK–�c—½ùÄÛ!™ERœ[ß&'*æœï–˜Å ²ç>*æœxþ}=çôBŸåõ�ïjþÿÅÝSâD˜JñøÈµ–}çøß¹k¢´ÛÇ[l÷¥"Æ\úŠÚV‰õ¿cm“böe£)üw]ÿßU$µo,æÔÿòñž²OíÿŽVvL`‰X.¦�Þø×íñyÕ$êø�ôä²};ò¼ü­qšwüKù¡rHP!¦†ä\üw�ÿccüÏéëû`wû,¬å/C¦ùAC`²ßm©€H á-ÒgRàôÎëd)O€³<6B´ b¡.‹ˆ‚C9ÉhÔ�Ü!æôÔ¤WÝŸŠµîpmTà¶}å÷'£¡t}ŽÇ’ƒà'W‡„ÂÒNG"ÔBŸ¢±-Û(þì¤e§ ¨Qùl,K‹²ñ¢lë^àÙâï�z3ÞeEâå¸bR\9ŠòáS ´êñ¢ýž"�ólû-‚ç¯?Œ—žw·|k º’U£é�‰õ”�®O³0xûköbùƒ£ñ¢Ï;‹ÄÕs…÷¶ç’ç·ï¯’WÇ--:2^í€Ó´ò\y<±¿ʽÞGäãÜWPåsÿý�xÍ¿ ÿ}�mÒ„ÿůśê_[{Ñ®]c­ø·;�6wä~ÕC3þkºíömxï/ÝÙ�wM›ú¬_É®?Ýø2}l¯ÿè­+)²uû©¿þ‰%L.j?0�û#ý>ð¨üÜ”;Pzñ²¿Æ»_ÜwîLJŠ~Û µ.dy¿ïßÜY\ï./ú|_–ÛñoeÙ·-öc7'»/š1ü÷I³4ÿÛ7u¼ M‘½˜¶×¶¿åÏ_éGÓ™ÿ­6quCŸ¸±c¹é/÷—}±Í×~ð\ÿ,Âäôù¿¦HH|·¯xqk™ŒÞú}ÊhÿÉønÂZK±Yˆ]4·%_»Ÿ6¶\?¿ÿ|‘¨³6Áb“>bÜJ¡ðøwrmBú' œvýAÀ’ÕËŽ‡ý³;¿>÷‡ß‡Ó [‘‡_;2‡e>ÜÏœ³³œsÐ8ÿoêwÎi˜ÿw²]€Md¡o/ìëØØ¤ßûþÍ=Çê¢ Õ³ ëq±»­lâ¬û[²o1nÖOl"ñÚ«ÏA¿ëÓm"ÑŽcWâx´X´˜ì‚ÿJ¦ñ뻣¯ ­oÓ%?Ö]hÄ¿?¡çß’QÔ–U; ø/w20y�H׫•$®s©!ë_üGó÷¡”nÑÐRÝÌô…ÿ±þïxýovÞZº±X Ý;y2Í ”ÿ–@Ì1Ü=½Îyreùpªëצ®Þ@,Qƒ8È‚â UótzߎD�Ð.­§Ó%8:y�Ä×CëÅäÄvpåîªÀkD W:³)=ë:òí$ê·Ã5©c5�°@õ=²×8ÌØ³¬¨˜ÐÖ¾íØ<¾xbWœ¼ò:¢ÚQôÈöêï`C½�Eçp­£Mà<½»ÚÍ5§•Fü빳ȅt¡S‹¾ÿXÁæª")´J5±Žÿª¢ìg‹s/4Ýø]rÑ�ò6ÆF²:[ÝŸ*ú°¥°Í“u_&RdŠþ>RüZýhñ·÷Pœ¼rdmlm½¥¨g”í³¯V�'ËÆ‹ºæ�ß¼ËúÜoÙ÷9�ÿ~¨Oü£»ŒªÇÍø§>xq}ñß›ø/ޝ)øöWöÍSIFMKÿ|´¸Ø³;Ìì/åSI yJûpWÿtUöñÅo½­sòŠÓ EÒâú�>¨.Úñom{ùO³¼°;bvž)ü÷C3<ÿÛq²þù’øJ߉¢Ù‹Õ3_õÅb �Öüÿñ?~g|®Ÿ&nlâØò±Þa¼ ìcÏÙÄé»~úSŽ¾ßŸ|Tø§QN‚¼_(2‰¹AÛ².+ãËÿSï¦c'»³ÉâÕ&WÚðoe/ù�ÛúNžp²oAµ¶ú�60~Þ®¿+ü÷3çø�ówj›ÿ z¯¹vãâô°»¼ð³Þ»–FëÝ·¯„›þâ1¼þ‡¿6-û[_-qñê/•Ik×'Ç~K­ÿíZ‹¥~’Wšìé9±Jžußôz‘ë¦úëÖÚ]ñ¿0Öÿi=£ëÿâºÈìø{dš4Ôû5—œH�'U· á j:š�›Ê&Qσ´]g¡ ¿îk»LGV?e¯@u£êPuÞ¤~�¨ë§ÞÌ ä¦ÀÉÆAó ˜¥t?’|‹CžÀ²t«�gÿQ–Ù7áB<±4‘Mâ µ¨“ ⟪�ï$)™—¡æ:‘~Q¿{\¼¶Å'PÿIL®ë¯L1 �|ÃsX­-I¤•fÐ9yåh_ÁwÓ¶j7‘Ý‘´eg‘¬ÚQ$ÇÆÂ³³ÔŠÚÐÁ¢üÑíUB‹í`²}ú‰·ìƆ“Ӌϳ‹¦¿ZTÿùâóä¢?ö7%»ÛêÝÅ÷Ô:ÛK»÷}XW”ÙsˋϷ.ä¾²¨3 x¼õåûqÞúñ@{  ÝqeuµÏ®²ºrÛØ76Ú$Õæ¢¯Oîªúfw^mÚ^í8ë׎šŽ�ŸíbìM“‰W'Sðçóÿ}rìÿ}²ï ÿؤðßõ¿½eíˆ&¯j]¤^Õ/nöÂøˆ&¯˜>³Â¬_{1ôúúêŒ\TÛ æ´Jÿ¿xý=Gº¦—ê�Òè<ÿ¿·HÈÌdòÊ>纞ë‰söyWv7ËLûŽí÷wîÛ#EFãDr3+O}ÕínúÌcÓNkºîšóʇoky–f:yåÈÆj›„c¢š©¬4ä Ð 3É-ó—8°©|iÅ�r—_W ,ªyìÇ5³”lvÏlZÿßTŒÑL%¯U·‹ßävXÿ¯\9Ô‰÷ú¦[ H� eÅ”h¡'¯K>q„ÖÓÿÖIô£³kYÔ^‡•�ç©ì�íT}ö\�vÕ{¯ÿû½þ7»¾‚LsŸ  §¸RÁ2*kq ˆ\±ÿ”Á�óIy-?/¯æŒ¨gŸ$òª êyQºQ;�ÄÏ-:H©ÉÁMVbKeÄ �ú‘ –Ñ«Jiq‘•þ>ÐÚ·K¶«Ï/ÊOGO,2CŸr1 6‰µ¹HÜüè›wó�`Ùz6ÁfS½fÛ—2ѵ­Jvímy“áªÂ†k‹ñÐ@;O»óêÄ×FÅ´êкwcr2„_0�ø c~à¿?êÿÝÉx~]ðß…ºâ¿—üÛ‹„ë?6óY½‰Ô¯u¦¼0;*;‚…1ì�¨aÕ=í„hŸdß6gPùSäÓñXùÀö#M3‹ÿ©IŽyô¿¬wÙ›OŠßØ7ƒd“+ïuɉøÿÐÇî//–g’ìîžÓO‰“2v¬ì³|f#ÁúM-FV¹îK}Vô�ûv—Ïö›Iºê}gù‡{küÛX6É+G7úIm vnÊ1,ñ­ÉžýõÅÉúƒµ_?¾V=ÿ*Ì¿ú胳â«×~ð¼:ᓎ!›ß7ãÉ+Gö¶Uû‚IÍëÿ©½…0•8!¶ó)=‚FÔ ãÀã˜zÊùŸ÷a¦ñO‰„QzÇ’Ö!®_k¢qþ—ÄÇǨ㚻 õ*¾qûð=|¶ãŸæýú¿¯ëÿƒ�•/»Ê4·iHº2w†è}\ŒRNÊ”‘e†ñ6ˆ§±vàS˱ ~”<×Ì‹÷Q÷×—ûí‹ÔÊ«YV×vTÛ&µ“¼ÆÞf�å§ø¨r»[gÍ[@£gEêávËÏ®ÞF¸§å×]û¦Á³�F‡« ¹¯ Ïì©N®i×AÔ{…«cûƒ«{¬Ó¾o[Íò²o6\Ô/¿ð >ðî�øo¶{T;­~µø»ÍdÏ}¬à7jИ—°ËŸ_-’X¶·�u.:ç ~åǶcYêÁí;T·Aös�jo5lnß8xÊÊêí�–ì­ûŸiæ¿lC1n%Nã±øLÐqÇÃìø;àÀC(Я¦�Êçç þ»Ó™¯úfŸ¦¦[;¯~ð߯G÷s‘eÃö5«‹M’L÷âÀù™óÂ~u¹ì-'• ]ßš×L”øÖ_ûôB ýæ@g„ì[íÛ³Äv{¦Û'úxÆ–sûºú»:¾¹«‰fÿýÒÌÍÿ×^sÞðC_Ål‘MBZ[W;Jšñ?I{q^aœS%ï¦Ï<>«‰Ï»Ê‡â?n¡„¼L‘ãD l± £P«Ü¹òΟúf’ì.5ûw¯'ÿ{^Òl“½EÍÆÀKë˜\Ê·ÿûÎSëŸ 5Sœc³òßæù¿7ÝÔ§¯…�p• ûVÌ™¦+Š„eù@õ²;gó™‚vgß?ØöÃr°±}¶•�á½Þd‹Æ¸ÜT†¸�;"ŽCCSëLãS.±oÌþãóÍßc È-˜e_ææŠ6þª¸~;ž›_&MèWÓβÊFîÁézÎtÊ´á>¯ÿ§pý¿çvÐÊ×"ÓÜ¥¡dÈ(@�ùMH˜yB£“PÔ“À2^žod$¿ÓRO¼}y<€ž?u«6©+'žÅÖ¶§¨·Ü}ø«EåË2†Ò¶u4Í«sƒÅĵæ_VÉ+¢83¶ Ø[üʳóî"Òãœå‹ªg[¹_«W ±¥EÙcÛ‹Oâ—ÛË&°ÜFªƒTm�Ò3·õíî¥%#Õùjú—¯Ú‹¥‹'ñßþd Þº{/6M= T>©¢Ç¥½d¸¦pÔÿû‚ø·?½Ë—& nwTmÞ™{ûÜ«ÁÁê¡î㉸§ÚØÝk§¯–»®–-ªw{·.Zš,Êÿk`ÛñU"kôÄÂ>lgÀà2Ðê3ð•b,¿í8ÔäqsÿÇÍd²Bô®þ§Âß¾!¯ëEBõ¬—áôb±kÕ° bû+óMÿÿöÞZ³£:üê¿·ßïnµÞR·€�„ž#À À 2cüLfż„g’Y 1kMf%Fž™µ²V�,’Lfƈ—³f0Ž`’‘#l#Œ H‰‡õèVKj©Õïw÷í¾5µO�ªÚ»ªÎùÏùï»ï½][ºýÿÿ9U»víÚß®ª}ªêÌ`BlPU“�®±�|ð²êü÷tÙmÁ;-[5¶Í�¢#ѹ1ô檜<¤«G:®r£ÕF´‡ôL¬H¿´kÔUrÜÌÿ‰dN¶ÇúC]uÞŸ�ì}µß’ûB P�ç¡ =Œîà…°%ªÿwÝóSŒ“¨¼xrΛ¤oP†øÑä¸Oðós_ÞæX±Þ‡?ø<ŽM()Ð3nßðÍ/¾>_6ì–ìSå‹nûØñäwÞfucç¸�tÏî¢ÆCSÿß—Zûÿ1ù¨ëØX„Í®A$²Sz£äæ‹V`«y B‡½çŠT[k?Z¿4§aüÿù/?Ó«íí‚ ÕÖ\’·‹o%N+±HfGmãÿ5CX>ð—ñµ9×ܧõÚ0Ëûÿ� ÿCÓ#�~UIŸ„YéÉwtòâ$`Ry0ÅeÃ;œ’b)ƒ3 <•ãRó¯9 ºáž@©E&ýK&ðq¹,óé/Oü‘ }ÓjZÞºç¨Ú[IN«².^o8Ú®Tj¢£L¤Å&Ï%&ˆ³Í†ŽGoÛ£í‡ûMâ�+™ü´½ï0ΞÐXöïL¾]Ý–J£ãF Ë^wÿü7÷b銧øÒ!ä˼Y‘¶Rn6õ^¹8|ÌžuÕôFG´òê’ ù^k¢eá�'�ïÝn¿L kã/7ü/À¹¦MÕD�YÕÆzêEàX=‰k°×ùŒÿ¹Bþlƒ&ü÷¸û7»4à¿?Eøz"þįh kÇ… k×,®V |Íž†MÞg&¤vàod¯2Q ”꼊Š&w³•”—&Ÿýä &ˆõCóæ_^�›o:«uo�VböVíè^íMl\ƒ&,}&EmíJ«³º–OzvABª éþ›_|.{ý7†¶9µ7­o#â>føïFÕ¹1ûú­²râ\ÿOÔ·¾' `Q`ë]·œk>7ÖÛr€=FW´íçSŸy]ékÿy;î¸ýŠFü¡çD™ˆÚòü´ÚjE+3¨.´ý�VUQÛÆcrãŒ>åQ€ù÷Œ~Ö­^$0q×=?i>£­&»úl_eû~ŒC¤ã©‘P…Kqe·sÝ{_w½;"Û¥¶ÜtÁ²ªˆGÛ�?0íG:¸ûãWËÕ>l@ø´)¯Ï*5×&7ß´±jY²×>0JOAò±¹¾§—�c“äÆþ¿¯¦þ6úl·ZÑ�ÿ}|§|d÷?øÓ›…î>øvàmùÍ/½_`ÏmÿwÝŽOåR_ôÆ›Îãÿ®cȦiõ]—ñ?ÙØV ¡†q‹Ã Ò9ÌiÑ÷Émj!oÒ'fúþ0?.Û—5þÁú1ƒÓYÄ/’++'c—ÿ¹þ¿²ÊLý¸ØJµcÌ=kcºöõ÷šÆžCêtFÎÿOš1Òq3/Z| ÍOªFWp!Ò©¸U¸Ï½,3€46Puˆp Xç‹ÀÂÛ¨Á�s^uç# /‰öõAp,Øx=ƒcày#¹j0ygä�Äœ(ÓƒàÉ]{¯Åì*°È!X½E,¶âΛ—ït¿âJ`ùÕ²ÀŸþ[ù˜ \udLké\Qð…¶Ä?i·ÃÅDq>ÆØ5 ¬[fW0=¹Óž‘ʼna´R):ŒêU×Á‰ËŽáÅ/¯ÅêÇ–añîIL ?3�°C—› Ó/ÀÆëŽ`bQCý§L}öf.h·¦>@�S篱g~åVbÑvA Ú©üíÆ|1Ñj¬ÿxð×�ÿWàeï5讃}´ÊnÝ/;¿}bx2Ucl!à®Pr¦C„ÿ¾ãö6ü÷Ìû¯{ä?Öm�O¹Ítæw%ÚnO A4M Úˆå›.\.¹·›z‚Þ5˜V Ú•Šô o2šTøoyîˆ=¿„;Q1žêÙHŽœ�û6W#MÔh²AÛ¸>|Û¥àO]?`‚0]W»Qp‰žèûW¨»±¦ùïémÝ&ÆU››À`ŒâI“Åa«�¶n;,·7þg™bÜY9BÿO«°h…­´AˆËð‘Û.³:�Æ›�ϳ¶²Ý·v²=òØ>ìÙwÜ�ˆ"ü÷=·ŽV5Ýsç«°vÕ"�½›_·± Öþ6»ƒœÙ�Â}v]íEz¸Û”ãuà}´6AÍWV�êa¶ó-“ÆoŸdc¸@)þ¹sièû'z®£Àƒ_|}e»|¬÷&`z§i¿oÙýGÑ?Zù~¿ç6èü雱ɽ ÖÙ»n97¼ãÏ:±(8ú¾[7I]ŒÔQ1²ý&ÙþÔgô‚ü=•A¾î‘Ç÷&ãÿ®«¯*¼2Ÿíä&,ÐêSÂÀm0s9Ó ’ñÿç¿Ô=Èû  †…7_g˽a¨Ÿ ¼R ÏŽGÓøŸlº­½ä"¹õ2‡xýFׄÞB»ª þ>UÒÿ[øÆ¥™ã_ô9Œ¯ý¿—0lª¦Ò~(ƒÿ¸ÿWÉu@S4²ãÆP¿¨ú¼~\®X\TÖÿ/ÄñÿÈóÿc[¡JkÞÒÀFI¹Q⸮Áß �¼É2••9¹àó(󨿨ÀSsb[Ž;D•~÷ªàD•ŠêîÒkV®"¢:W'Vùô:æ¡r@B^Μü^G*È� \ö˜‡j8„ºî(*,�Zùjó¹´¾g¢I�ÿkà¯n7A“#è5Ó¦ÕQS '±Ó¶¿ × =½–…/ð:V;1 ülȼåàq[V†&WOãìîÆôí;°ïïïÆKDZåÓ8>©Ñ:a<ìÔ²i={ Ûn8‚éöVtÖÿÂáæà½mð`F ¾­]*¯­o9Œ}‘ ³]h‚WKVŽÑ ¯C=ÏQ8¾øëÿ øùgE*:Ð}Å5·öÆÂÀÿ\!>îÊá¿ï¸½ ÿý…ƒhÃj� ã ¿ZIò{_g®m¾pø[ÙªA}d3‰ÿêH×¾ruô‰Á:½!î™J–:â6‹dëC:úës:’] ðf|äC—Ù�™x¢ >ô¡}¼m™Þ÷uls¿ú(ƒÿ.z~ä'aÂ4«øŸUjïÿ?yÇ«ª`ã“ùöj¢»Æ›�Å5ñNΗj¦gèm„üS¨Ïê+ ´Ñ Å0Ù›ŒØö´�a$÷‰hòÛ¥<ò¿kl×eÇxÝÞU9C衇wú¼Âm¹Ihþ}Y¾LTÛÁºRµÂ� &p+ø×L)_¯[å÷)�VymâXªm�ôHíÕ•( hÛGÉú÷¤®ýo¾1þG h~ßøFZ•X¯j¢­^¸Rè|x9Š)8Û4þßTÛDµrÈø¿ë™[ÔîU¿Ù0þ¿¹~ÓFÕvC#{—ñ¿�Ñ@b ¡#�tœ•éÿío�Ø[þíå´ÿwþ]{L�ÿ��½Æ®íýÿr~ê"nÆãdǃ÷<à븾÷ÿþ‹°Oø´žAÿ\VqýÌžÿãØ©‘M¡ñ‘�Y»IRmÎÀD?9 q]g®1€»"Ü=Å�JÎIú„òºRÑýúCë…WeéušOƒ×�ÕËâ.+ —É�ÓÏ5¿bM“4•©¿Šî�;swO‚:â’%"³‹j™éŒ±ç€ý‹n[c¢àÕŽÍ#“Õ&¨sÞjÄ�4hµ'“ž‚]ë2�÷ SÎ΃h"b¿âÂ)¬¿å6þþvþ§/`÷?Ø�㿾Gy?ö¾æv_ßp'~uöݺ»ÿáNL~b;.úð,»ô8&—j´Õq÷¡|]ÏY•Ö‘~¯mˆœ»ÊžÖTγÞn˜£FG�Ýk·rQL «‚\\Æ…€ÿ9@�ñß‘Úñ?¢p°CŒ¤�[(ž 8sèJ[ÜäÊÈ´l·²ðÁ“7#çƒ;ä+�tê{gBÊê5 Ü•»Ü™èÉ»ŸÐ:<Öì¨ 6u:Ú"VZ©Þuܳ? €EzF{÷…ü³†ÿY¦aý?­\ Àm§mêÿ«‰¦ æÑ*ÅO˜‰rŸÃ�ŸN‚ö{ßé«àgÿÕ·xŒÄÚÊõ]ƒ2œr6êÛY9¦äLF~µˆâ¾FÕã¬fü»ηпO �¶½ Œ9ŸâÝ8+;Óïõ-ï#·]ŽÄ–럤é„!ºÿ�퓳Ѩj²¶þ¿/3÷5ÆO �Åt¥PÓø¿�¯$\^þúo„ó«jÛí;þïz&m±6þçAº&²8 XnÿwyÈÔ†ÿìO´©bÁ'&Cÿ¶¨´ÿWßR†™àß R3QÌ]úÿžøÏõÿbܬ� K“ÇÜÿ;ÒÅ>ºK�tVm�­V~j¶CF7Œ‰|iìºî}Èþ;o9Âæ…ÎjTû �JÊ¥íÉ]‰|¢ÅH:&u<»lÏvDÁŒpÎÌè�b—þ¿7ö]g®u£?ùÃ_¬¶«>ÃÇÿ´å³ñ³ò(xôþ[7á�¯Ýà·ÕÃ?/»§?ú‰¿õÃsˆ½_µºªƒÌNž¶ñÿ°~Þ®KÛÅ]’cÄÐH}x�!¿Í¬¥ÿ‡â~�ñŸþS[‹|^[ÿ?þsý¿«£Ë£|úL¹I]dÿŸœ×¬ØÚ«Z?–«”�÷ÿ|ì¾°Æÿ#ÌÿOÐ"3ŸS Íiš F.Ö.|/¯K•;µI^Ë;ÏŸ]S‰cQ™|áu¬Î ¹ó�Ëçåð‰`L®nþ³Î,'¡jÈD¹™þš»Å&¼¬ÞQ -O^“Ð�ôíEœ´[ÊQðã¹o˜Ïh³Ey^qµ±’ýè+M0ÉtäÏ>aX�'xtÖóûì›ó–g‚Kt®ÕE뀟½hv¯ò˜¿CQ:¯"½P j[´D‹Ê}ÑÓ.Y�! "h0¡«XÜŒˆÄ~é@zÀ<ml:p=>ì}� ¶Öê$G {n_ú6F¢�ɻؿ.0On—Y&M¥m0�?3È=ÎÏÔ–Ï~¸êÃ&°æžä+XbžüÝâ“-üÏrÃIÝí´;�ÀS¥:½–½µ©�h0½ï@=¡„|CM—Õòi¸|Õ²‹–î²²ÄìÓúÓaÍ]&ö‰,È #U?ýÆ“t�±èN|įÚîöFã%ƒ×]¹¶S~ Âì½cʾ��É@“¦.“«tÒ4NüϦrÔ­ÿ§`˽÷=Qt>“€UWê¢Gt˜|:шu*)¾¾¥Ç�âãª?½!ÕÚи &!%ìäé²Ð´µü¼1þ鸳ß\Gÿ�>¶]IŸ%Umãý<º°”š.ÂôoXÿß…šûÿ>D+ö®½jmïñ?êé`ûÏ�ð–\ ĺ -€éì¶ö]ª—Ýw £}ûOšÆÿkV·?ð�ëã_bPöÿiï©äu{˜|ÿß„ƒ™à?g3iú–þ¿'þÃ=YçìøšÉÐTË;:G+ÃTSS>MA¿2ÿ‡Ýu4YXó‘qg"��uh*¬Er¿sXáyÑð]¡'ƒžóÈ»‚8�òCdÜ î»n�¥rÊ ºãÝVÇD'þé„ô£LÎÕ�ßÐAé쌩ýg‚™õ:7i· €˜N’’¯7ѦWl´[å&3uŸ2A“§wçð|§I=m• )±­[Éø·¾C,›/Ô-Øi)nº3TÌ‚ê ³je­W¯aFŸºï |íÏ›ö;¿ZsG=ÙíX²ð±á ô$×7õÿHý€ êÎfp'‡ÿ-ÏvߦFTJÄ8Gâß��ضTOÜpÚï0›=ÊùAæaUzmï�îA…u~•JŒY^®_sßû¬ \½zÁg€ñ¿7wrIŠýj?œ¨È]ø‹º?âÚûÿ>Ü”àÑgüO�úÿé×â-ïþóÛð'LŸCýÌ7¿ôFÃw2‘ñty=5Œÿ‡=°¨Î]lÁŠ „ëþïû€x=˜ûÞÔÿƒÍ{*‡¾øç8H¿wíÿûà?Óÿëx<œÓ"�Òþ¿Ö¯o'®Ëü×Yù½…3þŸÉü¿�/*4—hÒ5º4þ@Õ5=Œ ß›[çâ›»!)ÒIå£ÊþÒXšå­>‚[`3–régX–˜ˆ¤x9Á}Ùå•* ¦./uVð²Q-ër”¯Rì.èùßñëhešú¾nÊoh‚Þœ‚¦MPäˆ8ÍCÁ¥‹Ö› ’é´Ÿ5��,PB˜-»Mëìô |p¢\¬Ù3Ô°lÀgù"ûæ?NGLþ—ÙƒÐg›¨�iåÕá̈Vˆ­[Ñœoç¡°e’ÚˆV_åÞJH+¯žÙ“–±Ä¬Î]mƒ^�OYLšý™ÁÓÄ2¤í=émE³�ƼÇ¢§²þ\ dBGø§`IŸ-;rŠ-ñßSTXݶῇPÌ7p]~ä¶—UÛÅ}¼Û™[¾ÜoKmSt««b} Ý‘>ó/oÄ�ï›�ÏÉ¡m[}è½&p#óMúì§gßæõ“I?¦Óà“”𨳃Á™�í+>þÑ+«CŸ»LºèŒ³¾z~ß­›ìä{¶ð߃¨½û¬dqT4úÿ/üñ3UðêTÐLñ¯…¦øG„H9þ�Õ�BÎe)1‘r¹ûüµîˆ¬«åëÍ'Ÿ¹;®ÿëSžœ@KŸðß“2ãÇ^¤GéÿDiéÿ{ñ„/ì;þ¿öʵøæ ¿þ;ß�q�‰úÈ·¼çÛ6ˆµÊ �¨¦Ñ:ó .`�ãÿMf¼CÛ .g°j7jÅ¿R±q°25d ¬¬Ü–>ÇBöÿc¾½g‚ö"_n·þ¿3þ3ýRo×2ÙšñŸëÿ•à�ˆÝн0Çÿ3šÿš¯4:i¼Ü˜Ó« zƒùݱN‚—æ›cÒfß‚�³]AeNŠ ­£¼þ;ÏÏÊv2ê:3D(–WkÈ{tY‡ãsÄN=õW¬àè¾¼ÝÀB‚Y ݃åÛTI�T÷u´¥mùy&P²Á…^�×_4¿7^nîA¶�(C�:P�¶f+ƒh•ÕÓ;Íãß³dÀ†d£7 Ò6À™ÁÄÑhÅÐâú`x ˆqrgn­5Á·¥ý''½ˆêõÒA 7ð:¿! EDÛ_b‡|Ñ–È5KÓtð{ò¥4xE+Ì6­·¼6:hÚ`ûOÒëë¯E«½Nî—xâ¶‚ùŒÿîÔÿý¸Ë’rƒºÞ\ñß_×&•j¾ôŠí¯üákñÖ÷üùØŸ"SðàO>}Ó÷|¥i4Ò­‚`üà,hõÕ·_»QA4j[s›²n¾¶5‚ýÔ2ø>~p6‚`–Æ«6ãÊ„˜6Woæ{å¬â¿Q•&œÂ—9¾¼ÏM.ñC](p:“àé¾�Îcü¯íŒóçä4àß]—Š•;2�ƒü¤Z×Òdü`ègÒ•‹ôcͪIt¥=qý„m4¡8à=]<éSGí>-¿}ûúé\kɦ¯óéÖÿ÷“%‹ÿh&ãÚ6þ ñ¿÷ã#�‰Å‰fÝûé'ª€ÿÏt«â(Dez}ªæñ?á÷ã·¿RÚGü‡q»;Tϔ߲uéÿ¹µñrFÅ¿ÿ‡a]ûÿðŸëÿ¡£‡¤:È�!ø�û�íDÕŒÿ¨ÿwé¡°@Æÿíøo�ÿš·4ð�µ£hlÞ¾µ­(~�_í pbìdM%öaJ–•¡jãÕ5RR_£‚¬ñžu•—&éöýÚì1Àëô±xŠ+ H{Œð): é[�èGAúcÓØ'¡>n/´ve©ˆÝ>Õ›¦Ù6„­¦ú$-4m¾?Ýì¢îZÍ´Uð•g×[éØõ½Gí¡íÇ2Ëø/\gf™SÕ_Ȥ¥s³Ö.K¯Ÿœ¶Û §¦1kDÁ%*ãXÃÁík–åóí>d󹪶^®K·Rpìç;dðŠj?Ïí®8{HðÊÜ;°øÉßš6�ä£7nz— Fg®úðv¶Pðß—zà¿÷Nøï!bþ{Ç?Í]¿äâ•Õ$܃ð»ï¼¶ é¨þÞ›:«ðG«wî»ûÆÞõ6¢  M`*ëæºk¼ö¶(ák•ÇúÚ¦bƒP×î*¬ÂëÃM;|4ÇúZ™ðà—~i¬mNmFÁPÒ÷¬â¿/�±ÿË»¿�>D‡ƒS@�ðµëÇ¿Š�Üvy÷ÌüSÀ¹6}|ïPü+6–QµqíAŸkVÏòC¢ˆª3óT(^Þº#_â'Äì�Ò¯Y3ümÅŽ¶n ›Y_Ó†ÿ¸ÿ¤¢>3cXÿï¾DMƒ3mþ¯KQh~Ò¤¨MÙ~Z-ßÌ(xDÍ®£Ì6w\�üyÄ”w™%•á±#&§—Ç{hn�ˆ«ÌBVîL@ì§ b$ÀÝdY�¢&{­�®˜s¿Ý+bÃù¤À{a^=ÖFJJƒÄkø&˜¢iðÄ‚/gÝh‚,ëM &:oê¸ÔmÛb‚E—M He'¢  m�£ÍóûÖB ÌlÝ\ºA®TZd‚WÇhp�çq,ß䦳°hUW|>€¶ïk«ß¨D AÛ#�f‚WÔP¬Ií’ˆÞ’H«Ãœ( mu\ì(ðF爉à•I»y�]¥¦Zê3mœîKôöÈŸäï/2O¯Ï¦•/2СÕë°œ�×÷æ5þ{ wÁ_«’‡nFøï/l+þûñ‰ü¸Œ¨V?½ë–ó{oËñúÌ'o¬¶ [ª VltVËà–ù×÷Þëf|í�íÕ™#3% |öž_°ƒ}gK®ŸPnÉ?÷Áª¿zÁ¶¸¸•¡™t�^ÛÓÖU4hsƒ`‹C+óuW­k›Óä0œÛ3‹øI³˜qÿOç^u *¸`Þͯ;[Ô¡g+²ºü¯é±"ê‘Çöá½·*Ä„ÿˆü¼Ó é€Þ†×¥Þ„÷÷šà€ä$Ë ¿t:÷«?«3 }GŶ§hÍæ‰b¤#í¤n¯Kz”¨mÝD8F�N2ò~ÔnÕê^­äQB^&Z5þû _5™Ÿ5ÐËýàho”ürøïCzÌãÂ#½¼ä÷n¿¿ÏOð­‡_ê½ò˜°÷…/mÁ‡«`´eÞåE%Žî¹ãš((¶ai´wóü:ÕÅù±Þ�cûó!SWzSæÞú Ÿ„×k ¶‡á_<ˆó½¤orý�8¨‘ú>Oš þËÓ»ÿï‡ÿêWCÿ¯"–@4Ì༮¢ ¢üŠE¢ðŸëÿ¹\gìü²ßË; Íš&KÒ)ºˆpv5ii7ÒÈcö*{MØpÀÉñOå×+ÐååÒš¥Un…[ê)db®.ã8ÂY žBžZ¯CQ7-xX½ÊIuꨆLÀV\'r?ô 𣑯M™ ÑÖŸ{΢G>ÀR:+'h¢à ±–-±ž®·*î3Aª'^.?;¼6€>eÊÚj.îŒÞVHDÛé(´-zc©|ÇAûýâuQã+hòÒ†ÿ}#néItY+“Îúši ƒÅ4¨ÿȇ^æW‰¿& GäS*¬¤£'Û´Ê¥Ï+ésD�«÷¿{³™¼obã¢ì�’Ù¯ÂL(±ëÙi¤ƒX¨~Ì4‹½(?Pg2šï¸ý¯«óœfB®Íi{&«ÀìâGÿß' úƒ~94XúؘŽ'b5þiâù…/oíă^vðqÓ6�Mø—$'2]'̾ëÓ7�´zRøºÈÇs±biÃ|��—j{¿¶GP�&õĺY¼ Uê�ËSµM4·º¾Gyäß] ™15ÉÓ•ª@©�Ï›LgÚ[¿Õ® Ÿ}úœVü£;©YÿÓÕûÌCÊG��»î~¼—¾)ðõá½Ìÿ¾Ø`½ëV[JóOn{Y¶Nœ’‚–�€åÆÿ�\Þ~×�ªzÆD¾ä³w¿: ¾¦v_]eú‹zp¸8F\vßþßm6_?üû4ÑÜË3‹eL¥¯ówÃÿ°þßWq1yüçtÆõMÈÈÇÒ6ôÿ eü?òü_-1_[æ[…æ4M梴Ð܇¤U�çÙ‚ýîþUáü(Uó ߥ15øny�åѬìàçÂ3¸!ƒ í[* äÈ•¬R,êšÓ‡}Ú*—Ác^�åhé£YšœC¬ë‡¼Þ|ÛÕÜÊ®*ÏÄj¨å¡ÓÅ” þ|ÿŸ™ÀË1”ö›Î�&•çnÎ6�”EG‘­6áŠsLÐʤ?pÄ*ˆÞ:¸¥>Ë­”z)³õoŸIûÜ>{0z¼¢êlÔ:2eFçDüiÕÓâ {@|KçÞ™¶í«Ï½ÊÜ[¿ÂžËÓñ“!˜Æ‰o“lõÕ‰LðŠÎÆ¢\Ûy^'MpðS÷çÃp2‚ï~xøŸ˜ÊÕõš\µâUÐû¿�º›ŒsÍSüw'‰ÇøïCÉIâ]�--4˜nÂ?›F9“Æé+ úì'®>aðMô¾[7W“›-ÏòO«]0Žž<Ó—Þ4ø&1ù“ö”ÈÁ³†´‡æïm‘e¶l;TMÝ„Šd¡U×]¹Öü­®&®\–Øæ\Û$Äl²3åÚ#R°•|`¶W *Åÿþ‰?øIkðªÒ3M²÷M™6·>·Ò³ù£•[´*çš«ÖT~ ÙçÌ6þûµPUêXúÿ=ÞíeôÖÆMÕN™þ¿G#6áŸtÿt#ò„)ZõÑ„ÿ&œºvûµŽ«ô¨¬{?ýw>˜9 þ]ÿ’Ë×DÜÎ8ÅþhÝö±ïãû_keç ÁæTÃÄ*«‘ßés^XµŠ‡Ax=ž6>î‘A| Øs\Éq`7úÑãûEà‹×û=û‰ùÿèI3ÿSŸµéÂe!$þÉNüÒ›ðÕo<�Ûï|´ÓŠ,÷Ò7þ§¾�Ú?$Љ°ôaö�g6Çÿ�<¶o5„šÚŽä¥F~ñ�ÕÖoDåçÊ‘¸}iç§ÿðõèßÿ�‚ÿ®$ÇËòºÇKH$Æ­Ýç‚7Ã\F4ÊïåjÀ?/î�ÿGœÿ/>…æ/‰.C”š˜p3°AÀ/¹tF…°ÔWgŒ2˜3_Âo±áùT”õÀU^ÿ†È®³\Í\=¢o�Cت§eàîÍ2Œ'ãàŸ(xr½†ŽdÔLV-K”Ke‚~¸þe®ÞÕ}Ö¡©E øê«= l½�‡t.Öóf »ÏSÎ1OüÖ®ÇÒt¯¡ÕDÏí±çAÑ¡ët&Ö õv¿£Úþåh0`½Xtýü56ˆuèxšoû(Ú0dûÝ0¢UT; ÛƒÐê¨ó‚d5vQÐmO Ðíc:Û`&:¯•A.Îô¤ zì5A¯¶šºç–­µÐ &PõÂCFç·~K/þ�á+yÍwü�FÃñ߇¿L™bsíªî+ìrÿ}~�Ã?M$Ú‚M9  ×™Ã?A¤Á:M:›¨Úx÷��WägÓm’ax‘˜P“luóRÐîS-²P �Î1‘ùuä]cYäÀÆùEîcg´ÕSÇ`Ú•×/0C|ÞõŽ ªÃó»àŸO'?wóMgÁö/î�g>šÑ-Œšñ¿võâ*8Ñ%¨@D�ñj2_½enQvÂûÐÃ;ñÑ»µo¢ó+Í‚QÛ´ùSN÷Þ÷$Þitåίâ#·�õh_òÑך ²Ø Us o˜N÷?ð\µZïâ –‰þÿvSß®uÊ“Äÿ(¹%þÝõðoÓøß¶éC�¯|ú&£§5‚Ç?jŸ1¾‘Ú·‹Tn˜êxP຋­Žn¿óG¾_Í{Yyç[ï¨p¸Î­lF·ñÿo|èᡸ%½õ=߯“ßù{¾XŽ1‡rzVãïÿÇ�ÿ™ôÿÍ/…xŒäQ_QrÞ©¢zò9¥ŸŸ±–Ëõÿ–o,�û]—á?×ÿçtyFÎÿKk^ÓÀÁƦ51çPR#g«¼»A˜ÓSž/Ägx=hÈÒð|áO'2 JQ¾ä­’´¡üÔépye8J 7Vgž_ ™ëtJE<\�“�§ãëÊÓKp2è¤>Í’‹P��刂WS™UCgm.½¸ì`Ó5èѸCû�§Ÿ2&s<³‰h±)ïâõvUT%˜¶+”˜@Öqó=×§j#Û¹k›ßì·¤Þf·8ì9qÒn1Ü #½9�¶f—?˜úl^ß¼JŠÎ¸¢àܺúmƒ”¢ƒÛyïC+Ñ( çœýÆUVGÙà•¡c&ÿVL{êIà0ÕØªµ%&8vÑ«LQ[m6z¾4ÍtðâwäµIóTZ¹ƒ þ»R_ü÷‰…ÃÿÅuŸLÝðŽÿ‚ßüÐwª`ÇþÇï㬫¾Ö;xeKv²ÔÃ7æ"†�bWZq; \ïPw^*j]ë¦vVŠùP…{ÿ°}’äV}ièÈÿ…2¥ŸærÈá~Ü'¸i 26ÑB 9ÀêÚŸD®úi¬îɉ÷]òº2AÐvÚ|ÑJÌmü÷%ÙÖ£öÿîàíatÿן3˜:Ž ÒDz”­±qÿï3}ˆ|È?ö7ÕÛâ¶>w¸Z�uÙMZÝÿü—¶TehÞž6ôáÛ^Ö©š,ßpË©í[ŒšðOÁ *¸Ú ’ö�îø§3ÞúµÏ«ßñ þè�Ÿ©kćVž~õÛ«•,® Ivdlù�oï^ñ%žôågü[úîKøes­ÏvU˜_QÓ¦^ËOáÒ›þ~ëw®êwÛíƒ W}uÄàU3þûÐLÇÿäë¨#]ßhúSZe·¥ÆfNž=W™¹7òüï5ÁË®Ûg?ÿå-¸ìu_¯·-Æõ öoWH=TÙ‰}¸|¯§#>þÿü—¶v>ß‹‚X\¯òGø?Uý¿å3^ü�Úÿ+¥ó*Ñ?©Œ‘Π|½x=›êÛÔÿB=üiÿŸ•ñ œÿcñE(4iÒc,êëK¨v ÆW^VþvŽ4r°Q­¿›ŠVžqù±óS 25Ý�#çY¾:*Á­¡Ôü¶f<8Ðb­‘—:-åò“pꔟ'Óïz ­9ÛFÌäI ÑYWõ¶Á=&¨´Ã n÷í´�úÛC¿wÌ„çÜeip‡â2Ô¡7ÒÊ££SvëÑd¶Òõ¥Cö$/3e\nžÖþÝKé)ˆµepõùýu§7 Ò¡í'2rQ½èpõeC'«Œì«Z&¼#þÄ�ô²viúfB¢ãF_;é�÷¨}F¡«MÝÏ5A¼ÕF^í¶´˜Æ=Ë”½Ç´Áñè`ü}?•¿É­·ç`-@üw¡^ø×˜_–Ÿ¶þô%TÞ?ÓÃÌ™3äNúö…?ÞÚš•&ktŽm)k³;æQ‡œŠO~8÷§e{Óä­�¾ö�çñ»z6ÑVá?•ÿî–ÕC7Ø.¹àhφözÉYàÊÙ‡ :Vt]ÅÓ”áÄ!¨ØEê²î«<‡G¿¼zSáBÂÿLûÚ¢ÚeBè´½’VÇÐv0wxrrŠ\ÿOA‹·>üú¨è¯�(pñ¦›ØyJ5ŽÿŸºïï:×�bôG�¶K.\á1KA³]Ä�¼{ ï;ª@ŒrFÏÝ–ÛÔ¿ã~ª ÿï½us%GÝÓdžÎ‡k# ê¼ï·6UÛhy»P›÷]õ5¬¬6"û¢sþ€Ô®©þ}Îs4–>'CÃðß–§éwš>`†ìõóÑYq´õ�‚�×]mWRP÷G�ïÜwDùãñ?­Ž¢óïêø�©ZvëCUÒØ€¶»•Ž´m›.q»¥Õ�ùÐËë Ùðñÿ éÛcúšis øzŸÇð?¬GÿïŒÿ3éÿãyT|=÷ L A®K€cA%u¬ú®Q�I—Ã?Ïåú/±Â™=ÿ_:³·‘:½4)�U9P!º‹‘%q×kÀªŒûÎP’(ˆ�[7¤Vxš¥á0»Úz¹¼Çñòë¨L9êX ¡—¨^÷P§¦NA!� Ù2@}��ó×¹ ›H´ZJgž(/YdWqÓM`Ët +Í`è° ~l§CÄ÷Ù-…ô·Ó|?xÈ®¶¢H|EÉC‡˜Sð‡Þ"H«¨^0×NdôçFìÈb´riÛ{ö'úýâ~äY�5½=ñpf�[Únê½r ¯[¥Ãé‰Ï’‰üJ.:Ü}§ rí2õ:ÌVÆQ§¼Ö­Î2ƒåÕ&ï s>—6�«•&x¶;:׿hæpþÁ2k ÿ}¨/þGá_ñ´Œ}94PísFÊØˆµ+oßÜ€!G4¬Ûï|ÄLB­üMíO¿iËÊÚ5‹°é‚åfr°®ÚŽÆ¶\§¼ èr—­°ç0­õe6Õ…ôM‡ëÒ™M›/Xf&›kCù.“æ}Ç`¤À“Ó©—AëDG�ØÄõàXTý¤ò6ÎÚ¼Þ…ækn"·Š¦³ž/´z¾¤ÚÊ´ט@Ϭâ¿�*2iGíÿ7õ\AIPt däH!Œ5âþ¿o ¤+¿EgôÐÖtkPÝéÜž¾+@‰ßC.#­.ùÈm/«VY:;uätà[GóIIDζêIñ»ûÎë*6n²[ ß”àÿî;®­Vûœ ¢@¦b˜âÈ¢ë×õ<—klÔ†ÿ¨ïøŸúж@�/öÈ ^’_©ª•ŠÜì0¥¿aD<)ÀFöÕeüÿô¶~GN<ú¸Õ‡·'†>J[°ž÷°¾Êm)Sl[ku«¥ÿ÷u#þÝv:7/µÿ�û¾ÀFµ÷ÿZ4‰çÅçŠÜÇ·öÿ:Ý_Oyüçú—n!�ÿcüóë1Ué–_mþ)¸Ïgš„†„föŽ̰á&c¨#¸4<²m# ùðj+ 帥…È‘zJ÷ͺüÕ7'ŠÂ+>ƒlþ5©Z'åÃ�ëÁêïKõ‘iÝp½Ö RÅÜÙÀ÷5á>‚=-tì÷köì·«KïõVÝÇž¡z«]L´‰‚KÉ®6\™0ÁŠ�­4Oh÷œ<·ÍHêó¢èlª­{ì*#Z]´$*‹XnÓQ3�:’Yé´Úž�µíDJ  |¶f¶üÑ¡îtiÇ3‡Hö] ‡¶ÓÊ+Z)¥0s"�ÄzqD�7 È펞ð/7A«óÎ6PPñ`3oÚx(óÔté†LÚÉȦç7þ{Øðò›ðßw¼= ÿ}ÎHq½<¸Ñõ͈4xÞÛaÀOV)ˆô¦×nÄ·_e·³8sq.ï“Ñë-Nßê2q8•…V+¼ÿÝ—T6+<øà·3…Ñfè‰üÓÖžÁ0×'ˆ~…÷½XÕ_TÀbmßtàpוD�ôœks3Á£Éõæø0ó1à#`žh¦ý?�‘C«:N)µôÿ÷}òÕxµ ”Œ;8q×Ý�U+—ÜJçsirN«WºnKêCar~]ú8_÷3:cÑO>"ÌÓ–­Ùö}þ�·VgóqüSàž‚fôŸM¢¾Ä–m‰ûõàhUåé€òSJmý?6Œº�ÿiÛÝlíÈ¿½Óø‚ÜøM}ÖÜí�ÎÑêO÷V�Þ—W}é°ñÿh¤’ϰõKâ0̱\K×v§!ƹqb®ÿ÷·ÇŒ7^UZöÏ`eÅý?Ÿ?jn…lÜ«EoÔÔÿ³y_­ °~Î�•]¿¯|À©N9OTàù!Úº ÿqÿ/Çgæü˺m‰/4wi`} s4 ˆ÷’jö˜ñj礄±x^Ö2a ¬Nï3ÈÚØª% N.þ\ÞðFU×5Ÿà,åqüR}Íæ<•p*.o�ËVUùºªh’ãï9¾^7Šùîü�¾˜ƒâ\ ö¨m|{±vó÷CêåÊÖQ‡~Îë‘оMˆV5-C#)ódg½ ¦\s™ Vm2�­zL•Úe·�¿`Zošt2×�f®“xS yrt–™­ÉÈIÛôvD'"_:”÷—ôAÚÙ7ŠÑ—ö~ö¢ ^Mš§š§àW\`t}¤=x5M[4�¾�eÒ¬{UzÍÙÁ‚Áwê‹ÿ>Ü»àÿ×n¹ã¢®çmxü;Ý»öSªZ�4›DO–iòxéMÿÑ ê±“ glZúÄQ¶»ô•…V�Üðöoà.Ú*âZõ`§n·ž±"és™3w6Þ™�ëÙg8¹Ðƒ”t¿¼ïè{~R_ªÚÜ:.»é?Ù-9³€ÿ>4®þÿæ›Îîu¦ÐLI×¾³©ÿ§‰ô}wÿÆMöÍ…�Õí&)øüæ—oîìwúMÎùÖBßÖ&8B·ãH»•,}ÿʧ_?+mGþ„ÞÔãŸV“Í&ΨíéÀõp.ÿA üäw^ŽqQç¶oëÿÑ�Ôã ÀÎF�Õ½e³müOúîzfÜ(ô�Û¿×iüßç­ÇDÕÃ,\ˆñÚ“ €·33A׿+6BG8�»Êqâ_kÛ§ðya[ÿç÷ýô᮵öÿ—üc�xÍý¿ë}�§n§Ò&ü{>á+Rùü¼�YÐóÿ‰5P%€5ïià–Û�®�H©0°³aà1�qæø¸?~Ãa4ŒÊ} A,ÚÒGº;¿ïʤÀɃ³Äúè]vÕ’kO¼Ûaò¨ÌX/¾F|Ö­YT߯Ä¢`­[•㟂f³”§6 ºÐêF{æüg®gŸC«¾ºPkÿ�îä'è=ÆÿÃÎy› ÑWï½õ’¡ãÿ»ïºÎŸM6nª¶åš¿aãÿ¾ËÞ÷îKàÁ®B�´˜à¥ý—�ÀùÎäŸÛ°ëZ3>>€2^üûgš�Ñøœ®¡ÿ÷v§¤,ñ\Í•�ôÿ¬î®^¢Ù\~Åø!ßÿ»úúÀÐ ÿqÿ/±¹0Æÿ}æÿX�Y¸QhÞÑ@€Áƒ»^Y^À‘Ž«`Eìwp Î‘¨Ú›Éè5‹„#´G…4<Ç/’—íxrÇ''·nù=?Ù;4'çåÊ õ ²3sY¦ û¸9?æ;°½£c:ñõdgÀ{ îT4ÿnÊ>ö­ºÄ€Þä†;·™ ” ¬ì¢ísmƒ>xYn(—m.½"¼±�CM« .4Ašß1Á¡ÿÖ_Þ¿ øûæóÍËÌHk©}{aZ­¡HÐÀÝg�žFûßu®»rà%RI:é¬üÂFð³žürD&¿»ã¯ ÊI' ñ¹:R”ß&䜪âŽ2ð¨Êú 2k.?ût�†)û/Ö „¼ž¡J3µÝ0Ø[êèÚtK�çÐ੟?|xÁt„ÇVªá 'Úâ¶îpÍf̺ÜN6+¶!^dxý3ˆü§ë�Û×ÿ³ù¼w£½vöA£sWeä1‡;¼ö|f/ã²Åù­‰c'£ÿÕ¦Þg_jtvpý%æ· NkHoôvÂèŠâ��-Ãw°üJÅÎ?��á«“2ÂÜadqèe¨�¬UÃýÀD²$yœ3ƒ,ŸC+G~€;7÷Y¿N68jV®Šîù’T^th»b¢ýOÛþ#²µZfž´-7Á¥I“gÊ<ž5iÿ¹ š˜Ø!È:IÛ 3Á,eYLPl³)ç¬S‚uX«2Û»¬À:š r-�°obœm¢¢‡Á›/¦‘?çÊÈ1mô¸¥y´hî?öSàyPœ:bÏ[±Þôª*Úñ`§|û’š IÉ¢ðÄpà¿õÅ/Þ �ñï‚X]'œ´uãûf²ôáÛÂy&tÆÅ(A§à§¬.ìk»Ÿ²7UQ9_}à9«çh@F[r}lNÑVŒ=To&}mŠˆÛ&TÚoô!çÓÅSÊ‘¤âøÃùªÎ§òÍd{÷Ç�Û;6ü�Jãêÿû%ܪ7&z×;.D'êÑÿÓ›?sÏkª s8„½Ù ÒU&ˆô+¸Çȹnõb„çc>A  úÕŠ—«zOÒI/÷˜À®ˆOî…¼~AŽÜ؆M(Ox™íÔíNA'ò¿v5l÷ éÉ4ùÝ*Ø&ü;YÞkPÀï>S^Ÿí|¤SÜc~WK®?ñG{‡VΑÜ}ú*÷]õV4âæÞ¤;Œºöÿ]hÔñÿf†jç¾+ïœîŸ0:øpXeü¤{zD"]S;4Î(/£´CÆ/ÓÿÇ4[øçcT/o¦ÿ�m/–%Û7e🶷a8ßÿ;ÞÀhøçýÿBÿ7á?¡åW•ÕW ˆÔô³ÿRÄ¡c9Î+r3b‚¦þvžÂñ°p›BÆÀc~A’Ü: r–ÆJë$¿‚¬G\¶n¬³Î|ÏñEÞ ±_­àŠäˆõ ž9°†±lÕ¿Ë^ µþ¿ Éöùp�é¬Ï2�Zmux¿ ™Ž{« KVšÀÉ:T9×Oôœvzj°+:Ëj• ²]1ä‰áO_D+ž6˜í¥púÉ t_xɯŽÙÃõÑ9Yç›6ZIÛ7—ÙFÞ¾Û¤�ÏÁ2mþ†O/ÿ`¸¤�C¿øYè“<ë”ÿÈÕyöñOA›¯™€�9ã‚ 4°\kT×^¹¶:›‚&w3ÆÆ‹<½í ~óCß1A£S‹ašðÒ,>bdxë­vÊ_ùN+2hr#mT¶¨¸§¢'‰Õ?ìÉ4�±Ø”x>•ÍlUer³ éLJù��|[�½½Åèy6:ÎÑgÍdò·i¢d%[0ø¿ß`÷Û&úÃMZ »ïzÇf"¼§«ÿ'ŸB�ÃGß[ùGä_h…MÒépúkŒýçe“õÖuÁá ¿”�tðˆ @?jÊÛj| Ç2é„‚E„5*Óú4fŸ;Oû yO–ŸïÏTÎKW“ç`Wäÿ~˜‘›ûaZ9G²Óƒƒ™â¿ Ô›²Èn¶dʻΔG+l©Ìq㟮ךÀ-m“¼ùugW[hg£ÿ§2ÉÞ*ž=ÔˆK tº—¬Ìtü¿ÅÔûk<[ù*Wað·ÍØÂÙó8🶄Ä:‘tnà?-káöÿ*ª¿&K¼æ=þ'V›9í{ª-„…©“&€Uµ¹æ&¢Ø¿–¼qˆ¨nXŠ\\ê�ܵ`Æu)uô�»F‘ÏY4—Å™o¡VµÀÎp9àt?-"ÿRÆö:$2Ô…q]À×"Oœ6­Oz/—&•Èuo¶é€ D=ó4p˜ /3º?X?aôkê©s[¬^™œÙZ¨vkgÁÿ™…›ÀK‹»îþqk ƒžWÛž}?Ç×Ñ 4“”®S@ã²×þt#+‹«Ï[†¬¼¢Uh¿vË…I=y;¸[DŸ0u»«>ßji„�_¶ïnzÍñ“—C±taÒ))¯Ï(qä?E]ìA3ÛÕL.Å1dÛÊáÒq»ý޶¶9éù#z+—€U¬új­šëB|ÅMÁ¿¬ÿéÀ¿»¯¸î3þ^lea�øöË[KûÏ_±Àˆ'¬N®¯|;ƒµCódŠã„e¬õÅë½Ðñoó3~š—Túÿ‚ÿ‚ÿ‚.ÊÀÿÚw”àÕ¤úý› ¾Ñ¹Ã¯hÁmï)ŽÉ¬Á²¼¹€’�gàÝJ�G�û+wWE s_¸¹û24|LB:�v�ôˆ*)„ŽôYo︹CR¡>~o¸ã¡³E@ ï%�™‚÷Í!-ó‡Jñº©TÐu×"¡C»�÷›´™sˆÑÀL~.0¦óŠÍvåÕ¢¥öÞÔ1»j¨ál‘Y%’ëPfò»¬Ã ¹4GÞLx*hës6xE�·ØÏ1“ö+.5ºž6¿Mà0÷fB:�l{f;ÐÀ´ÍÊ‹Óëú¸¸Ë×Âׂÿ}¾ãŸ ²÷À¾ðå-h#:øW3Ù|½?8÷ƒs½ëù(D×\i ªÝì¬gõs S‘ Ñ߯u=cö­jò¼ ¤¶…´�xŒÛÚ\ ÛÖA.wM1ÑÑö Sˆ0Ý„SùEN:ìeZ�öÕ¢7ÑFT�cÔÿ´Õ¦+Ñöœ‚ÿ¹�ÿÊæjáù|{»ûèŽÿÿPj˜àhdêÉÒøI5Tjëñ/ìJý¸×ÁóëÎN:þ#fH:ºÔÿ\ÖÒÿÃ×»à¿à¿à_H.Ê;eø_õz¨Ý^dPh~Ñ@€ ŒšýPüwíTø}g,Š!“u*8íú·sžÌ*uXJq'^ßgeÃvNâÓ#Á)'uV@‚5%뜼òN'”©�«?-ʉ˕iØ“–ŽW“ëÝw*ˆ@íë |§Ì>,ß©]´ñ5À’³�ÐŽ€mt°qf…VÅÔÜ[r¸È|¿ú•æs3pöåÀêÕH»óS@{�Ó™r»°V4þ~àN ­;×­^fuzõfF¹¨}UÛô*ày#ë¶'Ò{+Îκ1JoÒNöSðfà_9½zäÇÃϼºÿëÏùUQ|�㛵<®­¾ÊÒ£›_w®ç÷íÛÐ(ÈåÚÁ·‹˜¦²w!Ú:HgÎØ�’bÇж*(7¨†¤Êó°ºÑbÀë':Ø€o+¤ƒW ðäeÇj>2•6¯…|ô±á[¼iK`üÓ%»Põšö×�ƒ‚ÿ¹�ÿømp‚7Ø¿Ï>›ðïôay{#føH?5ûîÚ!LˆT"CWü‹I9k�K.ÃîBÆ?"qÛpIßnøGéÿ þ þQð?ñ¿æf3…½ …& bƒâY×–¥=8´w¼îwê”C¾Ø�sçîÈ9›"=w(¼ˆ�WEN_Ä °Ct lÙbô—<@ÍSÛ…¢Üˆ%É,�” >—Ù¿òÔ/mf:wº:ÒAä•«d}*Ö'LKŸÕYf&¯ø�±„%4m‚%;¶?ߤVÑ}N“†çy¦¬‹MëLPK�â•K'¦�—2oï[< ,ïÀZiê6‘Ùjø¢ MãÔÓù¦}.2Ÿkt:a‚ ºAŸÚÔïØ:àgf¢þÂ3ù4½Ó8ñ+䵩—ª –Êt(ÿ ÿ°mËÖDôæ¸Wßò@}ΰýØs•>q÷cø�Ûþ]ˆ¶©U+µØÀl}þKOã¶Û¿Waœ¾\=ƒÎU%+mi£-„]èýF–00íh¯[·U—6Å¢QÚІ·!~Í ÃD@ê5!—†ò¨0˜ôƒn0{òöl«Kpñ!(üÍÛþßúÎŽVüÓý~ô{øè?Dzï­—üÏ1üóòì=„zGeµá?¶Ùàïµï/$mép Ꜵ7â @ÿ\Ôü6¥î•âX_øøGd›¥ÿ/øçrüü/ü+3§Ûðn¨•7¢ÐÂ%uò¹Oú3ÔȼñÙÛðÇý¥ø Ñ[–Ïýö÷ëË@’î:ÿ¶¤·¸¼Ñý†²™¨Ð¬î¹r)“�ÕñgºIÊbr ­ �êVµÔ[5șԃ׵’q)ÔY·‹Økœ�¼<ø&`õdi‘q+VšÕfÇÚo.:M9O‘ÛM éù½¡!­_mbWÓÈËK 6°+·žÙ ìÜ/oSPëÂúÀô9C+óñÀ³¦Ýö¹§O䓞ýzàÍÿ¯i;¾•Ê úÀ_@ïÿko¯ÿgþÙ= Ýðö¯£+QÀ‰¶Ú­Y½kרÀð¾}Søác{†nÿãD+qüò[ªO'×§þðg¸ýÎn��X–uµ,?|,}ëYYžük±MV×"=¸¨~«fgœI6ËÄí”Û—ŽQQšÀÔæp|¾úõg;‰â6'6ôö2zƒÖLõ üŸNüçdÑ ²òtüG®\«WUOt"ûF^®¸Ý8Ï\½r6?¬Žñ÷¦t³ŽÿÉ•P«Ð‰ÚnKÓ%ßLÒÏ4ßl‘Ð5�ÿNØq’>fž-øo�¥àÿâ§¾ÿ2:ÖœïOçéø±™ï¬½¥¼mð  ÉÊÁ(w�š=äÛ&�Rá:¬cª®8‹bFRÔ?é··àÀGթ›P_·$Á+¢é¥ÀsfТèl¨\�‡‚AËLºÅÀÑÌ ³“fàó¼á½ÎðY4‰ÓNÊ vœv›¶xñoÛӮؼö¢à•¡“¦ÍŽ<áñ\ð/ï/xü³zÑëà)@Ñ5AéhßLé“wÝP4x®»z]/ã�…døæ¿5½AæÊj:c'Õ6Pë3< Ou^¥V¬ÝT°oùö]—eqéù0¾uÉõ9Â,¿7ní±QŸ5쯿éugŸò6§ò¾òé7xÉ þçþ]«'Ø‚/%-Û·H¤;QwO }k°²3upvX¨ÄÀʆʷ=§¸¿’çL‹�"ü›A˜™J¡S@öC™€–ž6\ÌŸ:iÏ -ø/øçjÿïËQ¶mÔø_-1S¤› VÞ€BgMÜñ±[î¤/Š™�wgJ…ëÞXTH#®)fŒá³Îê;~]5¸åø‰Á©ã_//…G¦¸Ç‡oJò­?@X.¥’ús£Áœ†–:ÒÞ««´.\oѽÜoÅþKêÏøy�­Šd�xŸØµôb¿YòÓAß®7Á‘G슬,™Ü‡÷{L kÏþ\�j» ­ÐBÃ* Ù$Z9õÔ.{^UŽŽšAÊA#ï�#ö<«ä塀ÀíL}Žn.㸩ãê%ÝÞh8v2åN™Û~4|r+°ÓÔwÿÎö,®nú7v–xœf¬öà÷L óiaõüÓ}/øÇÂÅ?«ãÒ¥“xà[Ûqªèn¼zÿ»/õõpº¥`ÒCrQyrß/áå—Û9ý8ŠmBÿÊcÌm ˆíMG6ÆÛƒ[·K£ûÉ·ÔÌNYÙJ1« ¸[²dG��¬t}*ˆ‚W÷ýÁk«À—#®§‚ÿS‡ñ @²­‰—ÍÊð[T¢º5ý§ĺͷO®>\WMz¬l!jx¹y:�êþTá°´°NQûÌdw­€3*õ”·ë‚ÿ‚®ß…Ôÿ‡>RòŒyÏ»ñÿò« ÖýŠ™×nF¡3‡ÔÉçîvöÅ€mIûdÌÁʼnÁ"çMéë<•Á#Ÿ¯íhˆòG×»©3÷å÷PJH¹ºˆ²DÚp¥�_o ¶0HÖ†ë'÷Ë—êXêÆÕ=—.‘›/Ù µöí2ˆEÂ1“Ù¿ú°ík&&ÕÔá´ÄV–Mš`ÉEÀrš4ÁÕ}kÉÈtÔÌž¥@ZgJ¤¯uËìvÂ%³½‹ŒÆ<*$5ƒ«íÏÇŒ^�u¨çÄRà²ß®û=�¼(½ü9èÝÿÁŒ×¯® þ:þe‚üîwñ…/?�Ù$ ÝwÏ/âM7�#å†ÕÕ‘ÎÛºám_Ÿõ ÚþYT¹øB»…1gk±E ·§ð›óÈñ²÷™Ídø¥ö�û.‰ª¡ŒXÒó[~ëÁNºÏ„¨Í¿rßpÝUë þç0þc “ÉG†GÎ~›pÔ¤»¡åeôׄÑLu²i­®,ãar¡�&se¶á_M®«þ ÍÒ'Ìÿ{ì uüüKš üÇú‹eÑ-eåô¦Êh—#ϛߋm0®tjs§hüO+®V^_¯0Ñð²±B šÔ´ `µ9ŸÍ wN¡ŠÚ³kU¾Ç*€ÀJ;`YÞ¶{‘,ˆÒçê$gÙÎÞ §ÀòíÑ˘Ñ[“þûÔ¥©=8 V¿XqƒIúñ¿éü6¹>D+p>ü¡Wà#¿sEõ½i èhë¶Cø�Û¾=+Á ¨|üc¯ª�m×i%X°G°K<‰“ŸSÖkCÏÙ“Šm Áî† jcÚp鈂X·ßñƒê`üq“ksÒuÁÿüÀ¿ÎlÁf—qùq9mmÖÄKô3¹âú!Ã_eìI± T#§ÿUk- ÍÒ'ö™ Öž‚ü/äþ¿5†´K‡rDýÇÙÿSÐjéefv%Ô¢³Ó—�:£¨ `ÙoDÖàòŽ£•YìT¼Q[³¶{l”œÁë!|²eQN…Æt|)¬ÿ]×K,M:5´î¼>¹9þN-sNWŽ‚“K\ÅrWǧ.[·ðiÒ‹¢%ì+®7�™ë+Ç�б]ÀS_6ÿ7°ãaˆ·£ÅËL@Ë”µÎ²–šÙ¤ d-7Qrz[}Ô:Þ�eÒË�ý‡lðjçó¨æf�³A‹L�ný¹½z•ÑüÞç­‹ô浕v[â!“÷¤ \9aVt&×q£Ý‘ß"Ãgã/—þàÂwËŒCW™mŽÇ_€Þ÷ ôÔÙþ1aS ¿ƒôÖÀ%ö€ø#û¬L}ˆd�4Á¼u×Wþcà¸ZÒ0¦ÆžrÁ«— �AƶàßK~FáÑ Èüزí úÎ<úø<òã=­oœ£@½¡ŽÞT·ùâ¸æÊuUàjÝšÅuy¬>q¹‰ÜVv>¸¥òzøÅJž-ϬVhu‘…Î\¢À¿võbÇ:[~^wyrmÄ'#õ�Æô9 ú�ƒ:{/ðOò¨¼ms[Lí¦i ®m}Ö¶9ézË�· r=o2mN�+ÚJ×ëPð?ñï¹è¦z¥öë*nóQñÏïçù7ÙEŠ«9‡ÿÀš»T±^0­z¢àÿ<ÏBìÿËø?H^ú––†‹/4ñ�×ÎÉmšêäó÷T/\È ô7:'"a²Þ(S•góê†�˜79U_ ñ‚ƒ@-“â2JCÿŸ�?ÿïòoe<]´Ü´ÍEï.ùMàü·µ§ÕÇ¡?fyß31²#µJ¤±HŒüŸÑø÷÷]ÇžòØ·ÿ8öí›òÅmªÎ�’�uÜ~±­äì‰ëEÊ’OC×â•Y›êó¬œNW8‚ŒþR]g Z®S»BÃ=�ã-%ÀðQ×Mhn§ž¯°g>à …Äå�Š òœ¤ç‚ÿ3ÿ\üÎéÀ?¯wœn¾à¿°æ6iZ�E«×ÍgÁÁ?0^ü R˜“ý®½Jÿfâ@A¬•¯Å\¢:€Ô—5${ ÉϨ!Mµä‘µ t\QJ”2¾n %<‡ —ãÞ "ïźRÈÉ;g>¨ij‹d`…Œ]GyÓ¡BƒÞ’o3q90¤ž'—VÔÍá8ÓFYÙ þ þ3r$ü þO=þ'Ö”ÖTý°ù}8ŸvÑj{Ðúâ56˜5˜Âûô¡ï›Ö�MÝNFÒó:Æ-_2‹*à¥ÖÜlʽ´½~T—£/ÚzPðª±t`<½�q¹ b-^‰êm‚½ˆlïX¸ªV[{ú¤Ñ!{‹aCÒiåqRðÏëPð߈4Û�bÿÆÔ&³ùÆ6ÆuV_irínË ÿÊrºâ¸î»|—R1¬ÕíÑdñ}.÷0*ø/ø/øÿÊræ þé÷‰5(4?HOí2c®ƒÿÙòÿ1ü—þ(ýÿBÃ?¯(ˆu:IMo¿WkÍÁšÔ5 OŒX€ 2¦à»ÏÓJÉKn6›Î]aéêr7X&¯³C0#õ.­MQW^¾”.W7‘Âó ²]1‡ÒÀG––×™ŠêÜ}¡§X>©×àNêtƒ%&˜u– Æl†¢`ÖÄ*œ62OÇpl+ôþ¿0Œ¢ö~l/u+Eöî’2L°lñP kâ4>%¥@ÜÔó&võ´ù{ÖDœ÷˜˜ÕI&­JÛ9»ànQÛüü÷Ä?št åãzõ[ ´Ô·3‰Ù´}�è éú ñïÚ%ió4à�»¦2zwò„¶vÉïû’.›ñVð_ðŸRÁÿÜÇÙB8Ïhú(¦§vD þ þKÿ/ËHËqõ+ýÿÂÂÿàÜÿ§ó,,uòù{+Y«q ‡p0ie£{¨îw†oƒqçî·]“N2mܶrTCç¨ €ž�“FçòÊú7Õ­)›«»&�¥–_m‚t¯(`‡ž+ÎzÓ °Úc·N™ºý;Ã:ÒØqŸDæwSºø»K]🧂=´ÍreæÚ�_òDŸqº.å ÃÓÕCäEü7 d[ëÎr7¥Ïa¤Ín þ›¯üüçÒÍyüS«¬ÀšWdÏÂ:Vð�‚ÿÒÿ£ôÿœ�“æ Â?V¿ÍÌ�_‰ÓElOV�]J×W& /s%9^®Ñš–!Ö(ö�—åRÕB�ÄVÙTHÏîi^Žª£­L.,ÄÀ \Yf¬÷›—œ7œ /¡ª1þ ±Á3ÙYÌMŽ”ñЀ@µ+Kº' Õó÷�ÒOCS Éüa°ÌÄ|V™ËL0ë¼êM; ßæzõ§#¸øžD+­(hEÛèŽ? ÛfW{P½�/#¿ujšÕÃÙ‰–òÓNuZ«s V™ºþ‘ $=e‚tM�n³ dm°‡ÚWõ™Äh4�jK m¡¬ê´ÇTã¥êm78¹¿ ZÑAñ$Ÿ³ÇÐö*±å\ÝÁí¡®>��§à¢¼‚ÿîø�õç`O&…,aÝ‹ú6Ó¼²Í¬8Ú×hh“±â_ÐYï%m*oqZ®‚0(H±Uð_ð_ð¿ðð¯ríVhn�ùèE9ÿÿ¢Î¥ÿ/ýÿˆÿéý8�4é$·†a+”(¹nhibÊÞƒš5"˜Âá?ëU¦ðÞ!  §ãî1_D ¤¹<®±¢òlAõu0Gª`ÝÈZ?Zê…7jp"¬p_oYfRG¯D)7XÙHŽ'R]жÑÌÉ'(RýY…³õIxw�‚1SG-¿ãÏ`šîÓvCzàÀ²&VÚ7VËçÍÓG tѵ*¸Uk  à«ÎµÂôAÜÙYvª×Ók�1”åõêl#´™»ÁÔœ8ÇÃÕEåz(’áè�*�…�‘srƒ©“©Ë¢³Íçêê@ÖJþêÀø%�±—Õü�Ügdßg¾¨W‡ê`Õ!ߢN¿Ö/3ÇììQÛ–Ö¬ÝÀ‘k;цNï˜düü� ÿN^Hœñ˜×ѵ©ëU¹ýTm¡2úŠIIUŽÿ¾¸ìü7êºØË:[wÍì‹ v”¡™xÿÿÿXXøÏT¥ÐÜ&e\j3Ž+ø/ø/ý?Jÿ�3ÿÕüü4’:¹ýSZ&Reø+Ò€¥«ý×¹,(*#¾óKÒ¸FŽËÌ•‘3â\Ož¿âÇŒTT—Dûû���RQžÇ‘)—ßó:×Qš^aI(ûíÚ‹{3pÇ£¤Ãk{b™) Ú*€J‡ô¢=›eVµME¡”´‡Ä‘¹o�z'H]V¿™óÍI¤®^?ŸÚµ·R>"__Hl@Úf° Ù¾\nÍ:UåqYð_🧂¡&&oÁ¨Ÿ¬mÁHPðËPðã¿Ð¼¤Á¢ê£àÿ¥ÿg¿Jÿœ!øŸÜˆÓI“9c Uå cÑZÔ[yÃséêo"üî®ÃuÍ££’ëÌá;t4±âu£Qs‘ƒÏÕLŽÌ“8Ð+Qf¨�f2Ú«’�«›F¬Û4]Z¶L+y '%¾iöÉõÎ%—äu ÐÖ‚—t<.­VÎ)»TLWìSG2ŠÚÕ¶’¶>ç@­";ÕÙú‡ë¡­ ¤â9�‘Èu"à&î¯â2„Î@Gõi² ^^U/-çq‰¼~À‰ib ¢N¢àŸó-ø/ø×ÑÝ‚ÿú³àÿ(ø¯m+¤ï‡ÿBó”Ü‹{ þQðÏË)ý?—¢ôÿ ÿ“k _€ÓIƒXti6y²†ÙdHU%k€pòÒµ¹¥™*jwE\OŠUÙë¼|Þ©Q¥u�åò€÷¿UÊ'È5°õPVH•±Ç&½´ï0³ÖѧØ7ÞÀÀµ„crøÀ'µ ©+þ×$§miÌOê(–>æ« ­ŠóÓ~ R_ŽƒNxÊrœsŽQ*Ÿb¼s®X–ËÔ„KÝð�—í뮑u‹ÿüšŠ¸üs^ÿ²œ‚ÿúJÁ¿¼Ž‚ù×$ç™…ÿBó™ þ þe9}ñ_úÿÒÿ§)çþÕÒKpºi` 'J·$V‰ã a‘hF¹ÄI~Nñ[Üw�»Ö(¨ÊÈ,�Õ]·œS\/khí2Kù‘MëßRP§±o,úŒe‹2ü¸\¼ýxšäþ–^VT@’ßÕ!äÊ”ß g¸ß\ñ;úÔh×…pô¬¼(e¦³jëLC¾Ü=�¼MÄË£ó\êûºÖI&Ov�€¼žš(ÆeÈ9ï‚ÿ‚Y@Á?Ë—»Wð‘§à¿à¿à¿þ -,*øÏËYð_úÿ:q’_È[úQ‡9�:ûjùu8ÝT�çï O4:7Lßü‘a¨:«¬â¼à?]¾ X•Q6çÊÑB¦ @ ¼axÃd2ËOâ§ëû:¹ï M–!ËäòºßZÅ×ÁŒU˜7>—GIþÁD ŒÚÁ%Kï��uÓ‰sy¹þ• ì¾“9G3yj^Q»Å2ðúrŠßÐ�ßW $m¨B{{çx{hyÏëÀó®ù¸öDÈ/GUŠ•áäÎÆæuŽŽ�¨™þ\UtÔˆ>¥]È%´¡|Q «¯’,¹îEZ3`òÔ×|½ø’U®“Äe<—tæNß5ϨóOšœ®™Í(¦C¾üSq»å„ßÕâc>zÈv ÿö^ÁÁÁÁ?Xž‚ÿ‚.‚ª1&üš¤Oüü—þŸQéÿ±°ñ¿ô•lxË®À\"uò…t£µ^×ÿ*®<ªSˆ Ñý’@ÞE0’ÉŒ©\õ§½§Y*ÕÈ'-#Ç5¸dŒêì/'i õ™‘£Qž6ÊÈUåo�7¹×¢ûÔ&ò÷“²žu]›®£Å¦ò‚…ìyâ¶É;Ý–¶�¢:()Mà®ÁœCjhÏš«(sÅu×my þSy þ þ“¢ þ þ3iQð�F™ þ“²«æÄ9"…úÑôÔv+)ø/øGüwåïʨ¹Š2‡Qéÿç@ÿ¯–ƒ•Õ &ÇruM7J~�W:÷}rµéŸÎ‚Zþ [‡9HjÚ°F2·�ÔV,´înÀ¹rS;žÃe÷{�a£µMésƘKÀ[:Èçwk`4ñìAMºË9ØamQÝgNAOëÖ¶hªÇP9;ÞëªÏ>ä\·Ò¸±îr&?Ô‡·Šê0<}Z—¦4�TðŸ–Wð�Þrv¼Wðß–¶à¿à¿à¾á¿°æ!MÇôÉ�âRÁÁÿ¸©ôÿXpý¿¢ Ð"¢UL‹ÎŠïŸ1 ò -gË' _µ+PñRA™_#½“¸¯ Lòäyðe¬â~í øžç|ri�Í›¦óÆÍ¢í¹.‰ëSG²4ñl#•Éã&”Héï+ïaZËеl¤KÍ¢ÐMåK§¯Ä÷x™nÞYó¤ÄÓ“4ŸJ®5p‰d‘%:ÇæûtáwsÛ´Me*ÕÁGåñk1¿ cë0$“'èºà¿à?GÿõoŸ.ü.øGÁ¦ü‚ÿôzÁÿ(ø/4WIëÃ(øOË/ø<›Ê,ýÿ™ÝÿC7ÿ?‡é}bzçAïÿ&À_Q¨7U[Óèyì¨8Hì/ùSzßýŠÓøTõÝÈ“çÃ�4±)¥òäÒëLj%áo¶1N—ÊÏÓ¹²r|sõéV´,)Ìé“·_(IòHõ!ë¨"9›‰ê,:”6;kÒ! ¶ôì ‘,Ab®ÿïTÃp`Ëâ«¶e:x9ûIõ/ëÒÃ%DY¡Ý þ þãüÿM¼ þ þ«_ÿþwÁLíøW+«UX…æé;LÛ�DÁÁéÿKÿ?üVþ°âÕ(ÔŸLë× hK>ÌpcîH1£›BU‚–׺É—'¯[Þ1HÇAô�A ¯Wvé­ª³Eþ¯U ºš®I†„ràn¯»¬ùïíù¸,J1×9´³h“5W²úáÎÇqBÆñ4wDýdK��j”©™O—Míß"SÁ_*øo£‚ÿá²ü×· þEž‚ÿ…�Ú>¨èl”Bó‚ôôè“{ùü7SÁÿpÙJÿ_ß:ÃûµhÔš¿W¶ö¤êÆ%Ê•kå ÐÕq% çÊ�äëÊ®ÌAÞY<«\AQyªîj™5�í$ÀêçÊÍ.SuüâòHt¢Óû\ÿ¦ˆ¨ŸF'¬rÅ÷pVµz””!á)ôÌ.DújNoEâÕ¨»¥f]ÅÍ©åëGm{åó*Åô§T#OgÍËz\´\ó pcÂý6{ŒÊåü¶4ãÇu¬Þ¸³ y¹þ£FèÓyü×Y þÏ‚ÿ‚ÿ‚ÿp­à_\/øþ Í/š>Pð_ð_ËVúÿF–¥ÿOd†=µ zï×ʖžD¬½BùŠ3-Òš^7¾ÖéTê1¥g«� Ý‚;żbý»u�®f:€?ð’Dó:óò`�_Eu�ë¤YžÄ¹×<²N‡Äë[G¼Ü_h%Ú+æ+òzy™sŽùø2˜nsåVzRÒÉ4¼­¢vG䨢úy= ýÖº`í¥¢zk——ë¯rä/í:ÆZçZ Ûð÷½EvÎô)l3n®W¯»–¶v2flÛžIàô!ÛK–«¦ɤ‚ª–¿à¿à¿à¿à_¤UÿžUÁÁ?fÿ…æ i}Ä´Ù´ÿ]ð_ð?cüçÚÚÉXúÿ¸��ÞÉ¿Ðú¼Ò{LKC¡N´—¶n1ŠÝÔ˜¤Eñ—¹ô ΀¢ÄÊ^SÜ`jžP,_t]òŒlZCdôʼn²×êš–Z8adëìdù£ú»z‰zèpŽ�¯b—E}…YùNa‘ Ù뾘\ A¼:W~F®¤Í�׉¨+�ÕU,cÊ�%ÌÞË´k[ú¨í㺠ÕC“ .¿rËW•,KG•á¶•‘1m+´è(⓳ Ý¥.ÿ‰ÿ‰\I›!¯“‚üü{v9¾ÿ8#ðOÛËÂù@'1}r7Ì?ÿ¢ à¿E—¿ôÿ¥ÿïƒÿEçC­{' ¥G&Bý­ì-¯]%3#Ìî)eV¥ãk*°Cl¼™¢Äu�Š¥‘Š™ŠÏË®P.z«|•#Ø’] á”ä-2Do"ð€R^!7Àˆ`ó 9Ùµ“ÓÉ=ÀN–ÅjÉÂónrZLÆø²p@:’ ™6suãò¸<¾,'µJû˜aŽ5SV,“°‰LÛò[Ys¬#Þ*WnÌÐÕO¥o²:àé m+ææ_y>Ý ‡ïD˜­F:¨ì§‰ þÛ‚ü£àŸüüüÏ ÿ…æé“û t½úªà¿à?Wn̰ôÿ¥ÿFÃÿñç�ËBCiëÀxæG²·Tæw$¹„x†ùïù%�gßçVœˆ¤Rv¸´—¿ ާöÞÌÚÛä–ü4O«óâkV×p w|ô|ïºÝ-ÆOË«nÆõNîéL^×îÍN×ë­^²¥qåèú?.gC?òÅj©¯)Ù3dì5ù’˜DAeòÕ˧� J5"xqª1�°Ž;… JøóĺE›m÷ þ%Ï‚üüÇ…£à¿Inɯà¿à?HÛb/…æM2ö{¼àŸç-ø/ý¿-¼!¡ª¿©†ùï¥ÿu�>ô7([ ‡Ò·­î§o!J.Z‰JÉÆóŽK§yxÏhjt%œ©Ê¤WÍדe|YÀ#®*^,¿,'•‰•Ë8äy¤²ðCÝ=•ã¯ê+¹ŽÌç…¼®TÃ=)‹x%ªŽï[)¥óŽõQC͇®sžFs>@Z/ n—¯s2©È!ë »ŠÛB#¯.‚[ÛŠö÷ÃÓ%Ë�õªO Á^”‚D̰öVé-V~hDe)™!yjë£à?˯à¿.O!Sdù.2Þ—®]‚Ü´–*³7æ-øoàQð_ð?„ þ þgBÿg*þO]Ý u%^™>`ƒWÿü·SéÿKÿ?jÄ?­Â:¾…²t/ýS¡eòìô9Ó¢[Dù«ÿ„‚› _:%0'åWüÚÒ�&D2µ¸‰ÂñQÙ9ŠAÓ"È:3U,ª ðhqàØð몡Ç'¼Ö5‘¡¾�,?y¨ÌwQ–ÊðâTßÓÃ:S•ô°zòtñA•A.%äׂO¤ƒl=âï™{*—WeÚ@Þ�ëÐ\F[Zž†9íº~'¾|— þLíJgÊI; �±Þ†É[_ þ þ‘»à?½ÞVfŽGÁÁÁÁ¡¹ESÐ'÷˜àÕüç©à™ë£â¿ôÿ¥ÿ‚ÿ©çQ(¡-F¿Ÿ£/“îÊÉÁôzðgÖX±5´jÈÚx¸¨Úð]Oš¥�øADˆÈ‘Y¦!­OÃÊ&ãЕòs|„xÌp}y<w*’�9lÅÁÇeãºT*tqE5b[—r7ùlQ_%xç|¯ƒªA]ɯTCºôÐ9^´¿�³¼óK“ª¤½ÓoºÜ’%âv”isÿ;¾¯ãrU¢[åœoÜÞ1ß8�P—’Î ªA6•oßœý£ƒMéx�pZð�‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ‚ÿ´½c¾qš&ü:½¤OÔg]í¬V]üüŸRü«Œp^6•o_Uúÿ3©ÿ×'K+¢{Ýê+"±ávrÑ¢;ÍÍGª¢Ác�EàSÌAòÌ<›ŠxU†¡¥qy'ÂøÆ†’+£ \€tN‰£ãe!u�×”³æÈE¾ºŽ¡njˆðÌEåuœ‘M€(r±Î“ë ‰ãr2³Èqõ¶dÆ4ngÍx$m¯2@†,×} Ó3"ÛÊ9(Æ0u�¿í Ó‰{®­ÝuNY‡”i_Þ^¼¼ DÕ‰†a¿3ò2'2tÔ—#'SVW>þwsú´u®¸ÞÕeÆ]ók©L²Ü¸Œ¶öÍÕCÒë¨ÝuÔäªÁ¯hYWWƒd ÓÜn��-E7ÊÌÓDycÁºz;à2”ÇëŠT_ÿÿÿÿ,oÁ? þþ•ZjþYŠÓGF† ÐJ à„ý¨¼�àC¨Ö³¯³î–Þ•%ð¯;–ƒÔÄOÉ‚ÍQ8]É«“ Ä{Úü;�^÷<ùå‚ÿ´u®ÒÿgêØD¥ÿïlÛœ_éÿ=)µê¬÷¡P¼z³ ìm᳚A¬¬�òÎsGjÉsHI~x�4Ê:bù£Pg†‚¸¥ ^ØPvSº¼ˆl“Æ4èAýU0>êQÿFçÝ�¾lÖÛH6›Ë?.<6ñ�©à?Kÿÿ.mÁ*øGÁ?:«@ V˜¢—c®�Ö'«•Aˆ-ÿ©àÿè«‚ñQéÿ»ñ�©à?K• «0Xÿßà 'ÚøëqðŠh�K­ÎûG[Ô¢E×OÓ« ßó¬fˆ�p*¹®ô&�çŸ$a÷ÛŒ7{߀VÑxUC¾¸éäM÷-¥¤Ÿ¢SâKUãú‹ƒæ‹P-妤“<ÌTjCõï“tm‡˜wýµ\K¢ô@SŸŸ\b»šå°zÔÙZlº/åt^ðϨà¿à¿åZÁ7þîgÁ�­à?N{jð?·ˆVc©ÁZÄòü¡‚÷-¥¤Ÿ¥ÿ�¾wÑ_˵Òÿwãï~ü×ÙZð?X…3œè\ö7ç‚WDC5~bÇÿõþwhLo–YtÄFg>ã"â<€´œ¦ïhà×–.•�ìD:”&™C92O'ž­cæž ÎÀ•a?5šë˜Ó­F»þsîÇOVÂoÎ ùºUIrism×£‹<Ãì*÷�——“›Ý¯³…6n’ÊÊÙn® º´Ù°öÏÉÜÖæ*ÃË~÷oôÐ}Ê þ›¨à¿à¿à¿à¿IVw«à¸<³‹5X޹´ËQu.Óôa~ÿÿÿãÅéÿ þ1Çñ¯–l‚Zý6œ�´Åü}ÀØç·Úµµ„ d™Ä¿k²\+r ÃÏQÛ½‰Ú|o/~QZÁ;´`D×…¿n(Ë:_ ªar ãý È[uBµ×¡Q·ÃdnM‹ '¿ßG[ç�ûÝÅ¡t ¬\9´p<þžWªbWuˆ¬·õcèyolÔ³]l¢à¿à¿--PðŸ)³à¿…'ÆÀ¯à¿à¿EL¼¢ ÖÜ#ó¸xÖß>Uð_ðßž¶»LÃÒsÿž²råd(ý¿ ‚QÖlà_­z#ÔÒ—ã ¢‡Ìßçø›Û¨7òõöÏnžš<þ®Á´ºÙ´×fÓj›Œ²×&þ‡5ôÐýÓ‰?мlÎÁxÒaoö(Ô¤®Î¥Í)¶ù†ØŸw‘-æ7L¾\þ~B¿)ÞQ8¬m›ÊŠ1ÎïÇŸ9^q9 |„ã‰ø%ò7Õ=W//¾?¤ ì“�çQËåoi�ÊÒf_9d²�¬öúÉ–ÓÕÞ þe: à¿à?/nÁ¿ÌËóüüŸüÏÕXDzz7àãŠ%R�JÔnºH*ãs(kHÐQ¾3ÆéÜ?Æ©üeÜ'6š íŠ@æp$é�õQ;-—›ŽÆ!Ï@ÙQÄŠP«×7;{åC([¡>b”ÇâÓS¿‹“þ·˜©Š˜Nº‚'zB 0GœÅYòÇÿ–ì,Ùd TÉIh4º*£gv?sA¸‚E©‘Q“,ä�û�³@7ÉÜfò$ó8�ኽY‘“œ& f)âHY±“ÌÏ Š™dÉ‚hE®4 “1ÉÉT^YfœÂ.à³ñó± “œ+Œ�œäœÌ˜ð)¦Â.‘E+êç‹B¦ò+zÏÎù®_!K±W*ˆ UôΙªŸ/bLÅÌITÔÆãMùÄ)üÅÒE.q[áÏÏ QØsrc{¥è9µ—­8à N{’8 \€'p@Ê_,k‚¹@¼D"LHi ôvñi,×~:ÍÙÑÙ€±»:ñ+¼»?~!-”�ß €ëÔø`Ê–ù€S5hÊ×S6sô½€Ö4®L’;aÃŒ=°€T€Ð†ÀX;´Bwà üAQ $�y€  HÀ"° ¬… lÛ@9¨»ÁpMà8.ƒëà&¸ º�ô�—`|#á! D…t!#Ȳ…œ!:ä AP4”¥@é�’AË 5P1T•CÕP-ô t:]…:¡P4½…>ÃL†5`Øv€é0‡cá¹p:¼΃ à p\‚áóðuø.,‡_ÂC@”-ıCè‰B’‘4D‚¬@Š�R¤©GZ�6ä6"G^!Ÿ08 CÃØa¼1¡˜8 ³³³SŽ9€iÄ\ÄÜÆô`1ß°¬>Öë…ea±éØEØBl)vööö.¶û‡Ãiá,q¸P\.···×€;‡ëÄõâ†ðx¼.Þïƒ�ÂsðR|!~þþ,þ¾ÿ‘ D0"8‚ É!ŸPJ8H8C¸ExN!ª͉^Ä("�¸„¸‘¸‡ØB¼Aì#Ž�ÔH–$R,)ƒ´šTFª']"="½SRR2QòTš¥$TZ¥T¦tDéŠR�Ò'²:Ù†Ì$Ï!ËÈÈûÉçÈÈï(ŠÅŸ’L‘R6Pj)(O(•©ÊöÊ,ežòJå åFå[ʯUˆ*æ* •y*y*¥*ÇTn¨¼R%ªZ¨2U9ª+T+TOªv©©Q՜ԢԲÕÖ«T»ªÖ¯ŽW·PR穨ïV¿ ÞKE¨¦T&•K]CÝC½DíÓÀiXj°424Š5kth jªkºjÆk.Ö¬Ð<­)×B´,´XZYZµŽjÝÓú¬m ÍÐæk¯Ó®×¾¥=¬3MÇ_‡¯S¤Ó sWç³.M7H7Sw³n“îc=Œž�Þ,½Ez»ô.齚¦1Í{wZÑ´£ÓêÃú6úÑúKõwë·ë„ˆ v\0xe¨eèo˜a¸ÕðŒá€ÕÈ×Hh´Õè¬Ñ š&�AË¢•Ñ.Ò�õ�C�eÆÕÆÆ#&–&q&ù& &�MI¦tÓ4Ó­¦­¦ƒfFf3Í–™Õ™=4'šÓÍæÛÍÛ̇-,-,ÖZ4Yô[êX²,ó,ë,YQ¬ü¬ZÕXݱÆYÓ­3­wZß´�mÜl667la[w[¡íNÛÎéØéžÓEÓk¦wÙ‘ív¹vuv=öZööùöMö¯Ì’6;´9|stsÌrÜãØí¤îæ”ïÔâôÖÙÆ™ë\á|Ç…âì²Ò¥Ùå�«­+ßu—ë}7ªÛL·µn­n_Ý=Ü%îõîf)•]t :›¾ž~Åëà¹Òó”ç'/w/©×Q¯¿¼í¼3½z÷ϰœÁŸ±gF¯�‰ǧÚGîKóMñýÙWîgìÇñ«ñ{êoêÏóßçÿœaÍÈ`b¼p �œfz1—3Ï"�!�E�AêAqAåAO‚M‚Óƒë‚CÜB–†œ ņ†‡níb°¸¬ZÖ`˜GØò°‹áäð˜ðòð§6’ˆ–™ð̰™[f>Š4�E6E�(VÔ–¨ÇlKöBö¯³p³Ø³*f=‹vŠ^ÝC�™s0æCl@ìÆØî8«8Y\k¼JüœøÚøá„À„’y¢CâòÄëIzI¤æd|r|ò¾ä¡ÙA³·Íî›ã6§pν¹–sϽ:Oo^Ö¼ÓóUæsæKÁ¦$¤Lù‰âÔp†RY©•©ƒ\&w;÷%ÏŸ·•7À÷á—ðŸ§ù¤•¤õ§û¤oIø J¯„La¹ðMFhFUÆpfTæþÌѬ„¬†lBvJöI‘º(Stq�á‚Å :ŶâB±|¡×Âm %á’}9PÎÜœf©:µË¬d?Èzr}s+r?.Š_tl±ÚbÑâö%6KÖ-yžœ·w)f)wië2ãe«—õ,g,¯^­H]ѺÒteÁʾU!«¬&­Î\ý[¾c~Iþû5 kZ VôþòC]¡r¡¤°k­÷Úª1? ìXç²nǺoE¼¢kÅŽÅ¥Å_Ös×_ûÉé§²ŸF7¤mèØè¾q×&Ü&Ѧ{›ý6(Q+É+éÝ2sKãVÚÖ¢­ï·ÍßvµÔµ´j;i»l»¼,¢¬y‡ÙŽM;¾” ÊïVT4TêW®«ÞÉÛyk—ÿ®ú*ƒªâªÏ? ¾_RÝXcQSº·;w÷³=ñ{ÚöÒ÷ÖîÓÛW¼ïë~Ñ~ù�èk=jkêÜX×ÉêÍ9tópàáæz»úê­†â#àˆìÈ‹_R~¹w4ühë1ú±úãæÇ+OPO5B�K›Mòæ¤æÎ“a'[[¼[NüjÿëþSƧ*NkžÞx†t¦àÌèÙ¼³CçÄç^�O?ßÛ:¿µûBâ…;g]ì¸~éÊåàËÚmg¯ø\9uÕëêÉkôkM×ݯ7¶»µŸøÍí·î�7*z¬ú¸ô‰þ“šß­o�»ËO÷ö´?�yÚÝËí}ùGÎ_ú žQž•>7z^ÛïÜj xàæ‹Ù/ú^Š_޼*üSíÏÊ×V¯�ÿåÿWû`â`ßɛѷëßé¾ÛÿÞõ}ë{èɇì#ÃEu?øDÿÔö9áóó‘E_ð_ʾZmùþíÑhö記#áŒ�ªpZo÷@I€zÒì‰Yz\ ‰ùœÀâ‰y{\ÜØë@<ªc£ÐÎUè ‚ª2úγùØÅE¡“sïøŒ>&vh.ŽlWÏÛÝï?‚ÈÄüþ]Ýÿ\�"êßÖî½Úl�†÷VeXIfMM*‡i’†D €  ASCIIScreenshotÀ †(×iTXtXML:com.adobe.xmp 267 1920 Screenshot zòdï@IDATxì�€EÖÇß.KN"IŒ ˜3‚á̘sBÌ9ŸáÔ3|gÖ3‹9`:Åtæt*¢¨˜1b#ˆ ”œÙýê_ÓÿÞšÚéÙ™é™Ù�ÝW:ûºª+þêuuS¯«ºìˆNªúnÜ8Q§”€PJ@ (% ”€PJ@ (% ”€PJ@ (% ”€P¥K`�µÖ”r‘ªÒm�Ö\ (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (% Œé׀ˇPJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ ”8,ý­hߢ™tlբě¢ÕWJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ 4n˵l._®p²|4w^ã&¡­WJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ ”8�¹ÝÚJÅ¢ee²ïzMd³òOeÖJ¼IÑÕ_i¥•dûí··Þyç™4iRtäzt¦ÔëݱcÇzDS«¢”€PJ@ (% ”€PJ@ (% �{î¹§a5¨­9å”Sl®�•U1Û_̲  *õ"KeX/ºA+ÑHóz+FYó+›É[³Ö‘E‹×’ ©ª’¾eŸÊ¯-½{Ö`»täÈ‘2|øpÛ¾ 6Ø@Ž:ꨒhk©×ûÀ, ÎZI% ”€PJ@ (% ”€PJ@ (%Pª.¾øâR­zÁë}ÕUW™)p| 1á«b¶¿˜e±?šT† ­Gv{ ¯…S‹‘±îż¶/¼òyWÖ’r‘2™=u‚1þönКˆöMž<ÙþJ©­¥^ï­TÚ8% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (%PO´*_ljR…À•õ¤JZ�†H ²2Z¿Ê¬ F·ZÏã�vÊGù¨~èõE@Çt|ˆº:ðê£ê‡ê‡êG½>t|Ðñ!êêÐû‡Ž:>èøP¿Ç‡èÚéH7GÉ8 Y³ýÅ,«¡ö™2l¨=«íª�Šy½³,)+3+€ÍuJ .¤ûÇê“ËùeË–ÉÛo¿-·Ür‹|ÿòdÉÛ´ï¾ûNðíg×ešÿÒ¥KeÖ¬YnR{Ìô8�ŸïxÞ§_Ï“Dj©|Rsa¨ò!‰ÔRù¤æÂPåC©¥òIÍ…¡Ê‡$RK哚 C•I¤–Ê'5†*’H-•Oj. U>$‘Z*ŸÔ\ª|H"µT>©¹0´®ù°¾üñÇeĈ~°ú•@�ÀV¬œÏ-DEæÌ™#q 0˜Ž“¾mÒ<•€h¸0ÞLš4IF�-óçÏÏ®¡æ¤"ñkútØN:餤o%TTTÈòË//øÆëf›m–>ƒŸEã(÷ß¿ ^qÚûÀÈûï¿oá®·Þz²ÿþûËN;í7낦ì±Çä§Ÿ~’Ë.»¬ ådÃÛÝ?½ • 2ï½÷äšk®‘þóŸ2mÚ49øàƒå‹/¾�o¾ùÆÊí¶Û.«jÜ{ï½ríµ×JëÖ­eÅW”»îºKÖ\sͤ<ž{î9ùüóÏå†nH W�PJ@ (% ”€PJ@ (% ”€¨K>ø �çlÕªUX ,œ˜0a‚|ûí·²å–[†á¥p€9¾^½z‰ÛžLê�Éå©§ž*_ýµÍ®C‡rì±ÇÊ ååæ+Š%î2i?šH}ùïÿ+Ý»w[}óÍ7˳Ï>+¯½öš´oß> Ou�®,3vÙe¹ûæXÿ÷¿ÿYÇá‡.è‡W_}5UÖ9‡!Ìó¶iÓFf̘!{챇œvÚiÒ¼yó´yþòË/V׺víjãaÞ¶�ÝvÛ-mº¸'Ó1Œ›·¦WJ ™@¦×Û /¼ n¸¡`"ìA‡rHÖ÷‡LËb /ºè"Y¸p¡,^¼XÆ�/ƒ ’UW]•§ÓKsï*—ªeé#™³˜Ñ8F7Ø`ûëÒ¥‹]i¹ë®»ZCi­™0ÂôéÓåÅ_ÌÛÛ7§Ÿ~º\}õÕÒ±cGÙo¿ýdêÔ©rÐA n|õÙ�3F†^ð*fÛ ],ùá‡Ú3èåæ›oêf.åã"¾ï¾ûäå—_¶Æc<\pÁ–¯›¡/pn¸ú•‡êƒyÍH¯ ÌÛ»ª:êx¨×�Ž:è8 ã€Ž:è8 ã€Ž…À6ÊáÚƒ!óÍ7ß ˜ß-U‡9¸)S¦äT}ŽCQ‰q†NÌ/ÞvÛmrÏ=÷æ[Š«­ýh'ã`‘ Œo½õ½µJæ‘*"Œé{î¹g�9ì×_]vÜqGYyå•‹mòé°Èë?ÿù�]<öÔSO ŒÁ0ì"¬6›ÈG}Fû׿þ%;ï¼sè/äA:Ž…,WóV… ãܹs ‘u��Î�;הёcÇŽ• Ô(ýƒÙšwÑ¢E5Îáf‚sn:„Íž=ÛŸ±ºÕ„¥Ï0FæÓ¡lÜ.½ôR¹ýöÛ嬳Βgžy&|3É- –÷ï¿ÿÞÖÆq8¤wë�0´Õ ƒµéð¶Q±]*ƬÚ€·°Â×­/ÏçÂý…>¯M⦠ý:ôÐCíÛe{ï½·Õ!¤C_\|ñŲÃ;Xc,¶¹þúë+³ñ–âK/½dߺÀ[hX~ç�wÊqÇ'“'O–£�>:|1yá÷ûï¿Ûóx‹í¼óγ}‘ª~x0Æ w”Ó¬Y39ùä“åË/¿´ýæÆ6l˜ÜtÓM¶<@à!`ýõח뮻ΖÅe(oÀ€Ö˜Œôx€8á„l=zô�£Ž:Ê.ãÏ„—[¾Æ¯]¿”WfסrRN:žèx¢ã€Ž:è8 ã€Ž:è8 ã€Ž:”Þ8À¹»\%æ)�?þxùÛßþf'·ÿøã›Õ)§œ"ãÆ�³Ç˜'»üòËÃ"ߟ—ÅÜ" §ØEñŒ3Î�O?ýÔÎÃa‡>në‹yÑÃ;L0A�ôçž{nX.æ%á`„½òÊ+íÎ~È ßp7Þx£Lœ8Ñæ�c8¬†‚AñüÏ¿ÙÁêµu\VVfWc¥æ¸aœÄü$V¦¢np˜ìß¿¿­ûàÁƒÃ¹Tð:ñÄm8ÎÿöÛov^Ûç‚<œÀi¢ÂRq�Šk3Iñ'›öo±Å2tèÐ0¬_g�uBm¼�DÅC_ 2$œ³…€ŒØÑñì³Ï¶ISéw|ä\< #4à �õÝÓO?mWìbwG8¬Ç‚ì¦ .èKr §è yaßÀjgÔú�…ÃÜ3^€‹ºn¢ô:É%—X]¥nØŒRüɦ¿R$× %P¯Àކ1´Xö0Œÿþ÷¿íªÙL@dz½a÷ ÜsfΜiwÑèׯŸ`1©ûÂLmåÕ6>¦K� pÊÜÁÃá�l�Û¶m[› *ÅWÈ*«¬b sT±�n«­¶šÝ&a…V°7rœÃ€�íp#Á H‡ÁÆH¤�!®OŸ>6Í_ýeß‚‘m�5Öó± bþ�¡[AÀ¸í*äwÜa·À`öhg·nÝì*SÔ†H±bt£�6²mbÜcŽ9Æ’áÇJåž={ÚtPqÚ¥cŒ²aD…r“M6‘­·ÞÚnÁAÅ-$o¶00Ãh #+4°¼ý€$ òØ^yôêüðÃ[ƒïÈ‘#Fclò÷¿ÿ݆áÁ…¾ÃÅ�eòxxY}õÕm\?üH»ÒJ+…§Z´haW…ûo¢nþù§5B_xá…]Aø`€Vù¤5Ôb¡^vàjaÌã|ºë&Jß~ûmiÚ´©5,c;jè¸:%ÐÐ Àv‚Åq¸>ñ²®3÷÷Ê+¯ÄB{››Ž1¦à$¼Ø1oÞ¼Xùû‰a#B¾°Caœ€ÝuÀKI©UúésõÃV7bÄûÂSÆy”5Á7€3w0àò 0 v´pƒ£¡ +10?òÈ#v€ÄÍoìÀp‹-£±ºp°Š;|WÛêâA€p“ÇÍoßàŠ�éàð½a<„àßwEÇÁX†­ØÆ$_ƒ=ŒÖX�‰›+êŽ�Axë 7´ \© £)Þ6ÂVÑxÊí·ßÞõÀ çðp€º‚ à¡ëˆ#ް†o¬4.¤C]£o³Í6öM´obà ¼ñ„·›¶ÝvÛX¼q#¶o%`§#ór^pßR ¿ª²ÊI±ÍÎã­7láÌ·Ñë®»®M½Ã[R0X#=âAiÓM7µ+ualÅ…ˆsp�Èú‚7·°‚ý«¯¾²7Z<�-]²TšT4±qY?gñ’ƒÍ'¨?òÆ ÞÍÛflÎ#.^a˜Æþïh ʃ½òò+V‡ñ¢ñ° 4^“?¸®˜7Îã8~HŸŽ¯žW>ªÎõ„‹Ë8½¾t|Ññ7fs1¤¹?ëyå£úáÜ/pó0NïzÿÐû‡Þ?ôþhC}~¨¾Ø»ƒÞôþX·÷Ç@ #æ^91�¹K×p‹¹]̳bE$æE1§cŒ\}ûöµF_ÌÃaòsˆ˜OC|¬”ôæj±ÀÆ9:̇bþdÌ‹ÁX‡oÀBg0LJϭÁˆ¹_,ôÀ\"æaìƒÃ÷xaDà N,HÂJ¨–-[Zc!òÆø�n71®aÜ�ük×�ÃãlÆG¦ÁËAØÝ/ïà ,ôÄË3Øá �«m|L•» à¥#¼E{iªx5ª*a6Oí:>ñ–ÞþÁ ‡›6Þêâ*I¼ñÔ½{w{ÃÆÀ‹Õ¹XM‹Aœ�‹Á�Š›2ÞB|¬¦E^û­ `a«l³€-|áð–ptÞ€uÍ5×´ç`X†Ñ5_%ß}÷�58ãoka¯m¬äDý×Zk-û |ˆx ÁVÕ¸Y “ñ¶ÚãÎÁ�Ї8¬nÅM ìÁ­Ð`Ô#Š1–ªãÄ�Û’à¡ &�‘qy‡7,L2ú^ë7&ÚÀ—86p0Â2>%Þ@ƒá”~Ô–ôCò‡<ì±ÉÆ[8¼‚.ônñ’ÅÒ¢I ëG<8 0†Ó�*‚ HÃ0Çö?#ÑÇx�F^,ÿÇÖ0pÝ{tÓ`ÐÁï�82ç˜~àè·ן†Ÿ�«ç‚þS~ ¡>©~¨~¡>HèWýPýPýÐëCïŸÁȘ:>òÆàñ()åcU�tü® ïzQ> 5QýPýpèýƒƒ7^ŒâòqP×8Ük¯½Â-†ý“XýˆÅ 4Fa¾ ÆU¬ÂÄd6VÛbÆN=± 0¿é;ä…ùQœ‡ƒŸuƒ‘”[ebq}Àh‡Ém8Äg¸ ¨å á³lX……Å:˜ˆ‡‘:• ù¦:é„¡Žh'æÿ8W眶‡06º+M1ׇ¹I´;Fr^“颸`¾ ©ÀsäØý0UX6éÙ�,›2Óö3>æ6aÔÆN—0¢À0š�«­<ÌGc>/`WD‚]G=H¥èØ `¤Çœ;l 0ÊÃPέ´Ý¼ÀóÝ0ÊÒaN.•1;„‚y:‡óQ×MT:,p‚îÀˆÛtö…T®6~©Òh˜¨�0&a— Œ�Gük=n�¹šßÍ/í`!&^^ÊÄe{½áŬâǽ ^1†ã‡q-—myßpïÑ£G&ÙWÇ1Ïá +[uPÚ#la�·ÄPA|“†® &„`†a Fcé`F||¿ÆQ÷M¬�7ÞØFÖºøV4`ÅàOÇ7¼ðÆXÜxèð0’/‡θaoµÕVÖø 4Œ�x€ÀêX¼õ„›ú 7Ü`·3A¹¸Ñà†ÃŽÃÍ1ÇcWÜb53” 7~Wá��ëð@Qh—Ž1fðF ñp¸±C‰qAÆåM&µµ�ñ(ñÞÌâç9¼a}‚Až¸‘ó<ãº~–�8úoâç:ÆgÞLÁja~;Û…ÀÁ0ìÇE8Â`˜ÆÃÖ�?ñâ ¾È/à‚åöÔÌ ’?Qÿ(% ”€PJ@ (% ”€PJ@ (�À+æ¨`pÃjGl�ù@LÖcnr°Ùµ (0—{Ï=÷Ø‘œ/s«£0O`BÜwX(„ïàb^�«1aÈóq\%Œ4˜ÄÛˆbW¾¸`,�qWH§ª8<ûì³á),šÂÖ`‰9K,(Yn¹åÂóé¸`FK¬6Æwpa¤ôòMìpþÑ J{# >wˆ]%ý9Ô´ ÍÉLÊâÂ1ìX¹ûî»×0¶c7J?` À6å°Cà,zþùçí\¶Ë�õ?,r�AðcœsÏŒ £3¼ÁŸª=鮤Iå0�:`ËX¬4ÇŽ–XØ–Ê¥*3U< S¥B6³b9¼°Ä2)3›ë /�à“žx± /p|üñÇv'ÝÚî¬G6e1 ^TIõ² ÏGJcg­�ªÄY‘‘Rœ€�ÆB4[ÃX‡U®Üò.:cÀ„‘oŽa_}nß��7hÜ ùñt¤Ã[bH‡o*Ðñ�+K±ªeb[f8¬À͗êP ÂÈŸu¼õ†ÁV}RQWÜä±27¼Å€Î|» õBñ6Þ�ã7xãÀ· hÇ·šÈWR哎1ê€þÄw—±E ¶£Àw4À".o(´]銗Ë7Lë*éžÇÃ&Œ§Ð|ïKèà ‚/Išü°ÂFx˜Â[…Ø[,§uNz¼l#<ÞÐÀƒ- »×_w}�úáÁÛ`cpÚ¿ýeðÃ-ô7ð`ìn+‚°Z†^ô; ÍÐ[¼ÉvægÊáGn·ø@û ÷hoªö¹ípùÔÆOϧ×/å£|Âë)Åø£ú¡ú¡úܯõú°B}ÈàùEÇ?B}ÑëG¯C Ô?jüû ¢|2ÿ÷±Þ_}±£‹ã×ëK¯¯Zæ—ãõ\&9 À° °µ. ©XD#-æ·°J7|Ïs…Xè’jE(ÒcÎsf=zô°óg˜cÄ\Œ|0ÖÁàG‡9>,²�ÑstXh„EGéæWñ©=’a¬ÅJ/L¼ãoØ8­ æÓÆÉà$VœÁ€¶`2V Ÿ{î¹Ö˜ˆya|þ‹?°‹!ØFq�Áé1¿‰yN0Ã÷+ý0ôQ*®©Ò§­~íÇü'¶iÆ8 ¥ÍÛ9Þï�°T‡˜£Å 0x§rQú=Ä\7vz„na~zõ™H,èÂŽ£ØÝÛ¶b.cÌÝÓÁ‹hØúç°Ý*ú6ØPºÚ®Æs%vIÅá¸~0�­¦Õ)%POd0>>ñÄvëz|Jc5l£øŒm—™´$ÓñÑÍ ÷:÷Å'÷\mÇb>œ‹Ã@5hÐ {à ã( fø(úý÷ßoßfÁàˆÁ[Ã"¶o†[àm vX)ùè£�Ú7а�.ŒiQol 0Àñ†Fð’/‡‡Ü8p“ÆwbãÑÆj¬2ÅÛ=0fÃÁˆ‹Í}÷Ýg�ÛX) ‡‘Gi·�ÆMž[‚ð&�›&Æpl7�!Ü|òáð`�íœ]·Ê*«¤eŒ:Þ�B¿â� }�­®áâð†BÃYÅ6OàI~ó"Aè7›(ƒ'"±òJØöçÑ`�cüP/<à`ou(?¶·^q¥í9¬ÆF;pAàa/ ͺë™ï†tél�ñ¦úˆ¸8ñ†ÝÂE ÃoûÂ@ #8~(:cÇ�µý„oT#?DZêo’àÁÜo¦Á8 =Áà â¢<¼ˆ¼ xØExXÄwD?¼M‡·*éGgÄÏÄ+KÇWÏ+Õ�äëI¯¯dªÉpèè ¶XFzÌu¢Žµ9ÎgÖº…ùT~æñ¡güÞp”~ lt¨ßÿýßÿÙùW†¹:8جbÇœ7¡_°øÈýn(vuÄ\/¶fæ6µÐ Ìcþ×Ó¹}í^7Qú‹¹`^^x¡�vëégÚ_n=VJ 7™^oxɶ2ìt�€`ÛÉÖe:>ºùba-^¬‚í);gWWf—Ɖ�ÁƒÞx Yrñ ÞÃoÍàͼå‡�ƒ3 ¦8c0¶{À‹t0„ÂÁ8‡›"Òñ;­`é`˜dn�7«°EFÔÃÓe"a¼}ï½÷ì·~Ý·†`øCýQނÃß*ƒaFJé`ý‡�oÐá†�‡´V¬ÞgŸ}Âv3^®u?~¼5*»yàf„2£#.ú…íÅ÷ pCÇêW<˜ÅåM¥®Mb»ŽcÌÖÙ¾{87=Œ¼'�tRRTœÇÛt¸ù£C>·`††büèÐç/¾ø"½V·P.ÊÁJd×!=·ç€þcµ:ôœîC2Ò!>^À‹®ãw'pŽÛÝЯ²Úø >ÊCy¨èu ã€Ž:è8 ã€Ž:è8 ã€Ž:è8 ã@êq×F*‡mnS9ÌÉâG‡‰åT“ËXi‰�kÀe˜+1¯ˆŸï`À…‘ÌwÜÂÙ wçìNÃ0Ža¼£�~3qÔ›tq¹Û¤‡‹dÜp�1œÊ¥b™Š ŒŒ442ŸTa8—izæãËLÚ�4®¾`.?8Ì;§ê?{2ÅŸLʃ Æ×AO`̧K¥8çë!æØÓ9ÌûùúqaàÇ‹¾Ã|5v̤sçž–ª¯£ômÃ\u&.~™ä£q”€¨�@¦×ï»â¸LËcx&WgV—Õšoýà­­To]áG‡í.ðwìÁ�-\‡m#ð�`¬ðÄžÕ4Øâ ¯K.¹Ä¾©3cÆŒ¤tØZÙ/oáû·ß~»}; q>êýÌ3ÏØ7ÉðM`t(ß|B90,bU(¶æÀÍž[¢¸uÀÍÒ¯7ÎãAo!_¼}„•£ùr0Ôâå¢#>V¥be2 ¾Ü¯[»ÐåÊ;SeÆMö¦›n �|,·X«Íýç™ÔFs|×úœIübµGËQJ@ (% ”€PJ@ (% ”€PJ A ±ÏÛ³ýÅ,+ú�9ál¾š�2kË£ÔÖÖ=¯ê3�b^oÅ,˼2h¾l¶MÉ·ƒQÓ7þ² }¹MÃ(aL�JÇ8®äÖnX>�Ñw{?o¬ÍÕE1È5¿LÓ¥cŒÕÏøE¹\x» �¾‡ßnUl”�~”£>¶J‰:�8ŒŸ*}]�çöÞ¶ÞiÚWWõË”¿Ö¯~ê—ö_â­fÕOÕÏú8þëõ©×'Æ&8ÕÏèç;å£ú¡×‡^ößIæ_€æ£7áxiO?Cõéß·ú|£Ï7z}&”âý‹}§2š€;ÆEÇj¸gŠÙ~ÞÿK…&CÕ«úš[žŸÔ)%Px y|ÌßòÓÂ÷ƒ–P‚Ü‹‡Ç¼yÑÏfѯç7wòP> ä¡ú¡ú� >èõ¡×‡«:>èøàꃎ:>¸ú ãƒŽ®>èø ãƒ«:>èøàꃎ:>¸úPªãõXe2!ùlÃ÷³ý(‹×OÃ'[˜VVåþÙÎÂÔHsU —@ƒÍ8b>¬›xØo¸Ý§-SJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ 4eåØZì¶Ë#GŽ”Þ½{7ØV£}Ü^º”ÚZêõ®¬¬¬ÞÚŠ[$«Llu­”¶DW=P=P=Ðë@ÇtÐq@ÇtÐq@ÇtÐq Æ8Ð`'tóØ0»*Õ\g�Õ³ýœn¬¬óÑîböW>ê«y(�R&PÌë­¸ã£ùØÌ¦—�ªºm§™òé§ŸÊ”)SJ¹ŸÒÖÆßÍ6ÛÌÆ)¥¶–z½ã|'9m‡êI% ”€PJ@ (% ”€PJ@ (% äÉ'ŸT µ8ä�ClŒÆÊª˜í/fYµt{ÉžV†%ÛuZñ$PÌë­˜e½Öä „xð��÷í§ÔG­²PJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ �cž+3ß֊ףJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (�Ò#Pe¾l>\Y¹¬ôê®5VJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (�jfãç²y VUVêÐÕTôH 4,÷ß;HÎ>ûì†Õ(m�¨…Àå—_nc@þõ×_²õÖ[Ëí·ß.£F�²ß¼üñÇkÉAO+%�)÷z{ûí·eðàÁrÀÈ~ûí';ì°ƒ}ôÑÒ¹sg¹ð íõ×¼yóL³ÖxJ@ xÜë ÷´Ñ£GKÏž=åàƒ–¯¾úJFŽ)W^y¥\sÍ52hÐ Ùj«­äÄOôrQ¯P™p¯·±cÇÊ/¿ü"]»v•Ýwß]Æ�/ .ÔgÌL@j%�÷zcô—^zÉ>OâßsUUUz½ŒJ%“À;ï¼#W\q… >\æÌ™#‡~¸\wÝu6W³/l`²ꔀH&€..¸à0`€½Fô3™�ú”@> œqÆrã�7Ú—‘om×›>W擾æÕ˜Àø€oÝsÏ=òÉ'ŸÈСCí˹ú<Ù˜´@ÛZ,S¦L±/ìÂŒ—㱋v,Ôy“bõ@ý)‡ÿÞöe!jXnv�.D¾š§PJ@ (�zA cÇŽÖ�ÄÊL˜0AZµjEo’dx‹-¬ñw·Ýv³oÃn·ÝvòÆo$ÅU�Pé `5ý¸qãÂHX]ˆë1•s·…ÆÛç�:u²«ïñr·#K•NÔ@c'€—*Ž?þx»“X`¶©…ûí·ß¬ßz¼?îKM¸þ°ÓŹçž+ï¾û®Ý– +©Ô)%�L;Z`ânÒ¤Iö“úŒ™ÌG}J _°CÓ¬Y³ìN2¸Þ`�Zn¹å2þ7�>Wæ«'4ŸÆ@`ÕUW•�ÊM7Ý$}ûö•>ø@Ÿ'CÇkë„vX:ä�Cì‚“G}Tzè!» ¡Î›ÔIwÔi¡\ùëËBTª¼ªª²ùjžJ@ (% êlƒùúë¯ ¾Ýöâ‹/ʦ›nšñÊ&lÅrÚi§Ùïã`›?uJ@ dNãXi�—'ð�Ò¯¿þZÖYg�Œ2Àµø~0¶¥}å•W2J£‘”@c#€-Ÿ÷Ùg{�ÂvÏ‹/¬¤ä‘GìÊ ¬ìÝyç�3Æ‚ÕS×_½ýd·ß~›q:�¨LÌáE&¼Hˆ•ˆø^›>c6†ž×6Ö#rÿý÷ÛÐn½õV{ÓçÉÆÑ÷Úʺ!€OŠÜu×]²òÊ+Ëyç�g+¡ó&uÓuYªÿ `ú Q§² W-5oÔ©SJ a¸ÿÞAröÙg7ÌÆi«”@�Ë/¿Üž¡Œˆ¦ÁJ@ ä�¯3Ê<¹iJ@ ¤# ×[::�÷>q±dÉ»Ó %vÏ;çœsdúôéy³ë�¿K9ÞöV§”€PJ@ (% ”€PJ@ (% ”€PJ@ (% ”€P…!àû—þü—VfvÿjRžÿ|5G% Jž@©½y«õ-¬Ê•ßÂÒÈî¥ÆWë›ps,5¾nÝKá¸Ôøj} «U¥Æ·°4òŸ{©ñÕúæ_ÜK�¯[÷R8.5¾ZßÂjU©ñ-,�üç^j|µ¾ù×7ÇRãëÖ½ŽK�¯Ö·°ZUj| K#ÿ¹—ßR­/¿ùËoç¿'ƒ«*¥lþÂEUË–é*à‚AÖŒ•@Èu h @…{û$ÿP´¾ùgêæXj|ù@é¶¥>—_­oaµ¨Ôøò:£,,�ø¹—_­oü>O—C©ñåuF™®mõá\©ñÕúVkJ�/¯3ÊÂÒ‰Ÿ{©ñÕúÆïót9”_^g”éÚVΕ_­oaµ¦Ôø–Ú–´¥ÆWë«×›K@¯7—Fþ�Kõzûí·ßdéÒ¥I¿aÆå è;&‹.ÿÍ¿ÞiŽJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (�� ×p¾ #äí JÊæÎ_PJ‹üòÖtÍH 4X–'t0§?•DKmxy“3òuÃݰ‚'W!äDU`cÉ€3ÚbY:Ÿ’À™ñÂ4Eà_pÖ© (ÿ�eÐQ~ÁŸý�“DG‡üáðâC*ióùÇ”Wn\d�aEŒ…Ú­ë€7b;'‹ÁƒË‚ Yáa" dtÞä…|±î¢E‹l{m:É ^ºtièg8äÇ,_ýuÍs|cñàl:9cÆ Y²dIÎóé$êŠUÙÌÏ&6æÎ™këÿ¤I“äÖ[n婌%Ú7gΜêøg„eáôÇ‘HkÓû¼=?ãe#Qo?àågxF2èS[g$œ¯ï:FËJ†ex¼ƒ*„:ÀxÉ€+*‚øü!Oç,ÎL–„ÓK�G®óù»ç2>NÎ2äúYvN²Ôø{¼É™mϘm& Áßã�æ°î�±~&³¤ôžMvËÊÉ_ƒ$û!áËñ¯Ç;(*Ì,vÝq�Fðfx¿lûÃdâ¦GÅ­?§?–DE�# ë�?§?'éñËÂé�%Kœ?¹ú¼}?ãe%‹À}gû/è‡(?ó‘h«�ïé;Ø œçãH›‰ù“ÞÌ,�¬#/¥(?Ã3’%®ïä̶ÃéÏIAßÑ—¬;$ §?' -tó4¬?ø³’¨˜qa:ÏoOæëO!ø{¼Qý°-+Ë)[À5Lëù“¸eË�ñ=ÞDÄ6ÄBÏ̘‰çg±doöCÈ.[öˆÁ›á…à_�ʃÅÙH/ rºoßÏxÉ€«­³3¦ O¤Ïç/,tLÞôÇ’A㙟ÍÔüÉ ÿD™eXç ÈÐϲs’…äpF½Üº��ëÏŠÐø0½çaåã ü=Þ¨~Ø–¸úpE~öçù³âu}Dðfba÷xE…Y²ŒX2‚7ʲÌÈ.Á;–¾ûýÅ߇RËâÀãOÎÌšþX²Äù“&úÔu¾ß=—ñqr–á¸À¢bq7•@zþ�'�m¾žß=—é1ÚiãšÌmž~ƃ¤!Ø—8—_g ÀÈÐ/¨†ß³P³½‘‘Æ‚ÿÙgŸ…ÆH”yíµ×Êܹsmö5êXÇS…#̆§±à_yå•Ò¹sgiÞ¼¹�Ë4®üé§Ÿ¤OŸ>)Ï¿õÖ[òÉ'ŸÔ8÷È£�ÈÆo,Ûm·�¬µÖZ2tèPç‰'Ÿ��6ÚHvÜqGÁ²î!C†Øðm·ÝÖÆ[{íµ­\yå•möÃüùómš·ß~ÛÆGø�?þ(»ï¾»ìÐoÙrË-åÆo”•VZI¾õ­<õÔS–WÔËÅœœ8q¢}ôѲþúëK¿~ýõ5j”|øá‡‚: >�'œp‚üðöìk®¹Fn¿ýv›5óÇÇ{<¬›Ëjâú‹qŒÊÙr‚73¢ü ÏHf¨ïžj#kS™„à_ÔÍ:Š4zŒxŒŸVš¼Üó8¶þ œþ‚È€3óf�1Ø:dÚ†tñ2ä�²k¸€3ÃY'ö ýYI�7òrÓã¸h¿€3ËC;íqNV2€ƒ|l:Ïo£þx¼ƒ¤aì0Oæ�‹ôx›'øádQp óöü–W.m2 C6o"Å5U«ó¢0O&¥?– 8³­ÈËæ„Ó_Áll\޹öC‹ù‘y}áO®¨&�m]=¿{.oÇEàÅ;þ–ƒUÌD.Q~†g$ëR߃k õtë éüAŽúÅŸáIÒ°që\BIuD<žÏJÖ%ÿ"è;õšLÈ“áô§”…àïñF_²n�Eý‚ œa›<JÎ ôxIy6‰Ã2²¹#x£¬‚³7…$•áùsn“Ë"€²A¦ÆÑŸðEüõø‡i‚púcÉzÄŸ\0Äj“Ãy1_{üa¸Vã¸üÑNÛÖ ¢ü Ï«ŒÐw°±u2@âJ2õyû~Æs%˺0¬‹ïg¼\$ÒØt†R¢­6�7ØØ:ç/‰4p™ð&×DŠê¾gx^êp¶urî¯(£�¬SåÖt²¹g�gTüχ, ‘©¤aàº0� œþ¬¤Ç›œQò)ê/àÌ2Ã:áôg%®!Ï�¼"�Ç;HFóŒêëLÂ=þaÛƒpú "®aÞž ŹX2‚7óµ™Gýñø‡i‚púcÉ€3Ûˆ¼l~A8ý‘¼1Û:˜JÅ–Qüƒð(ô6¼üÉÕá±m³çwÏåí8àÌüBÂé�#-Gó}ê:ßïžã±åO�4ÊÏð\$ÒØtÅà”–‰¦™°{ï»WN;í4ÛløçΛ+Ûo¿½Œ;¶†þÓpNƒ±MTˆ?eM¤ùÂÈþ(ЂB q¨H&�˜ˆñ7�ÿœsΑûï¿ßýÆÒŸ©dé„çúGŽi �Ç­ð<ïÊÕW_Ý®ôe™öœé,“È2ÜJ L¤oß¾6M‹-ä‘G‘K.¹ÄkaP}ç�wd¹å–“ÿýïrá…Úð÷Þ{/ä,/¶ŒäŸ‡ØYIOߣøçT÷êG�DrÏO>±¥ÇŸue?Пµôxs\a>Yqþ½„¶&¥óø3oöý9ÉÞ.}¾Á¿� XÛÍA¿�s)ñwëÌcÈøúŸW˜'õ6Ÿã=óöy³_x>ÉqÅ×wßÏx¹JÖ-6ofÈ(Þ‡x>+i¯ó7hz½ñž\ó©ïÔsÞXt>ô�zæüû“á¹ê7õ:LdH?Ë‹-#ù'Æ!öGVÒÓwröùçTwdæ:ÏO>±eoö‹[…¬Ž=ÞW˜GVœýçú=þÌ›×ý9ÉÞ.}¾Ñç›ôj1_™Ïñžðõ�ãÏç"9®øúîû/WɺÅo˜Q 9¾ø¼9ñüQG%x  6LvÙeyà�d§�v mŸŒ‡l9G†°‚:c[,PãÈŠdR‰_|Q=ôPÙf›m¬+IaP|þùçåÜsÏ ³€öÿø‡üë_ÿ’ŸþY>ø`ù¿ÿû¿ðü÷'À`%îK/½dÿ¡ æµ×\kWÌ"eÁ8ùË/¿Èn»ífW­bõ-ŽÇŒcób[ ?ñ±]¡[QQaó»ô’Kå˜cޱ+t‘îºë®³á“'O–Ã?ÜcÛfl½V°R÷™gž±áÈyÚÿŒ„¡Æ_¸N�:Y‰óX ã/VíNŸ>Ýò€Ÿu{òÉ'­RtìØÁòɧŸÈ| {ï½·õ£Œï¿ÿÞ¶«wáÐ_0ö­¸âŠÒ£GùöÛo­lO=õT{ìþùòË/å÷ß—³Î:Ëq«¡Û´i“ø—cùî½×Þ‚|XG_2_?<­ß(˜{ÇÖ„ÓŸJ¢<â&]µ?9O†g$�g~6Só¼‹î¼"Ã:áôÇ’&/7=Ž­?§ßÊ€3ÃÀà §?–Œä�\‹ìŠÀ?déñž e$ÿä>%¤ÉHz¼©çLo3©£?a‚~ˆò3<#p%¤±é2à�j0~FeñYVJéñG8öCÂW¤¿g–Æ6UÌ\§Òé^ þ¨—å:éÊâ1~Z‰“Æ1¿„¯ñ÷x£/ÙVË2Ðÿ”Çž#'覛Ãs‘Hçë»§Š‰HùþëâùóÒÆÞì²M%-ô�ÇÕ̹n(ØIo=ðáôEFðfUrn£;6dÃœë ¬?§?– Ƕ!/8E"°Ð½BÃ:áôÇ‘HkÓýå·á‘üó§ïÔs[§Bó­%ÿ°o*Ïg%Î(éøCž<¥ÇÕϹ×PÎ<³’Ac�¯ëØnXÁ�“«`ÛjË ÂYÇXÒäå¦Ç±õáô[éñG]ÜpúcI$6ÎÖ!q˜ðýâþ°ü=ÞhÛjY:×@ ¿i±Öô ýq$ÒÂùúî¡HDÊ÷_¿Ï�¶ÂÅ’& 7½å‡|ƒpúSI– 6IyÄ© vÒ[üA8ýE‘‰ª„E±�¬ ý±dÀ… þP�C n¦ ™G,4å¸.Ùçž)à±WhX§ œþ8imz“'�Sùí¹Hþ‰´ aÓf#=Þl2ó) ÝZ³ëàñªœ}[¡Sgn™Fð·ç<Þ¨FRšÀϼr’ä§ã $® 2·\Ð_A8ý±$‡2\‡2Šî¼"Ã:áôg%MÚ¤øžç"€{<¬?�üÉØçí¡`´üJ¿Ï�¶ÂÅ’& 7½å‡|ƒpúSI–íë;jåæ áÅ_,ØUŸ’ÅνîŠ`æe䯹¼:ÓÆ f�ÀÆCùÝwß Œ¡©V‹vîÔêÆG<¬J…�õ•W^±«PaÔÅêÞ#�<Ò®`½è¢‹¤C‡Öx»Å[È~ûíg��·Ür‹Ý–˜e­µöZrÚé§É›o¾)ƒ ’}÷Ý×Âz÷½wí6Ê0ŸrÊ)Öø ƒ% ›W]u•]¹zõÕWÛü×]wÝ$ˆ#¿i�Ã(mœ:mª5þÞsÏ=Ö`|ì±ÇÊÖ[om·@Æê[Ä�Áßý…±¹{÷îröÙgÛpœóŒ¶o¼ñ†­ß-7ß–�xP‚#FØ•Â0Ã�<``þÏþcÁ�­ŸQÆÝwß-=ô�-á臎ËwðöÐ08_o Ö+š- qño¾ùF¶Új+ûf 𾃡+�Ñ?5œÓ°}{øÛÖ(�¼á|Éô~x­þà•Æ óá« ÈVâJsÚ`£Òa.äKš|}G“ƒvE@IDATþ1a¡ÙTWÕ¦ ùáôÇ–$æÃ*Æ~#ÆãOÎßp\!“œøò9’Òã ͱ�Qú|€ m€I›™„áx„Ó[êóMên)î�゚ñ2–úÎq(úϺøúÎqˆçs‘Ôë@=ó§ÿ…Òw¯‘äëóæ8ÄóYIo¼g‘>†g%‹¤ïÔë°ƒJ2<«:»‘í�¯:€\}þ ÏIFò×çrfäÄ—Ï5”oŽ+ÐäËyú a–ÔÏØ2Șù°€|êûßþö7Ùl³Í¬MôÒK/µöPŸ?Ê%3_²Ny“¦*`ôó jÕª•`{f¬Zu¶Æ·n1YÇtŒ³Ê*«Hûví¥}ûö¶‘ØFùìºë®v‹a,�Æ7r¯¸âŠpÕ,V¡Â:μ`ÀDúM7ÝÔnEŒp|+…{öìiãsô1‚­”÷Úk/»qá6í½©ŒøxD˜ë5nÜ89ñÄ“Â{õêe¿ Ãè>ûì#_}õU¸u2ÊDþØrW8|á¬'ó†\¸p¡ÝfǯyU¶ÞfkZ7kÖ,»Âq¦…ÄRðå—_Þ†áÇÖÏX»é'ü:AN\çD»�óàÁƒåx³ºúµ×^³ñÀdôèѶ¬fÍšI³¦Í‚’yÁ¸ŒoÃÁÏ “o$à›ÀS§NµÜñ¦‚[t7'h™$çcÃêò�?Ƙ6º.©-æDÖþ}·×Šr)ÏŸŠ7¹g,½–mËË3‹#“q‡|l¡?kîA?2{¦gUSñ'o[¶éúcÉzÏŸ„dBNA0ý¹Ê$Þôi³ÇGÿÉ9ŸüY¤¯ï¾ŸñŠ-ÉÕ×w£|¶*<Ÿ± 2b|¶Çê;=�DŒ#>oßÏxÉz¯ïÉBNyÒwró%kÈ"è;õš÷¶–áô×™ 8³ü�Sžô�Ù‡ù² ÈBð÷ô�œ}þn5ŠzL ,4à\íMD ¯¬¥…jÐúù"Üãíû‘†œr–¶‹ý@�I�È)§?g4ŒéÙN}¾ Á‰•!§<ñgæ÷«ýæÈÓ” =g8ýq$ËóõÝ÷3^±eo}¾)PO|¼IökÐ Z}§^ó~AŠ §¿ÎdòÊZÚÁ¢úþÊì™OR; Áß»¿’³Ï?©ÅôËôŸC?ye-=þa1÷xû~”EN9K�?Ëg?Ð_gÒãO¾¶ð¹�áYË aLÇvêóM†H¬ 9ýB®’™ëó I$Krõõ]Ÿo’9åÍWðñ&Q@دAÅm(þx¾’ã:ïäÆpúëLFð'¯¬epá„邆џÔÎBð÷î¯äìóOªG1=ïUW]Õ–¼’YÀI>¾DýáP+]…µ!ùûS�ïÁb;e„›Äj«­&O?ý´5ŒÎ�;מËïºë®Ô«HÝú ŽØ�€ñöÎ;ï´[$c¥*·FNJ4–aaãM8¾k»ÆkØSoݦµ|4â#F A‘Ó2Â:ë¬c·›Þ|óÍdÓ0 Ðø~.ý�0~³žn82€�F‰½¼wÜqG»µuïÞ½í e0×ÓO?]öÜsOË’ñÑÁø/VÃáÅ÷ÝwŸ–Kj¼÷ô=ŠÖu÷x“3ó!ÿX²}¾!_Ÿ·�Ô î툋{0¾Dé;ÃúärP(}o@Ï7ÄêóöýŒ—•,Ö uv�ïwÏerLýæuågx.’õðy£%Õw_ÆÊN†÷¿K”ŸáKo¼g­âòf>”äéógxNÒïY–ÏŸáYÉdõ ÿ½JµÌ˜¯?¾øþBñ÷î·ä[ þYqŽŠ\(þoê9û3ª:µ†{¼É™éÈ?–ôô�ã êŽ|c9�7õœy’Oléñó÷ ä‰L¥ÇŸœ™œþXÒãϼu¼1$¢øᱸ{úíë{)ñwu†Ç�‡Ü°lŽÉ—ýågx.’õñysâù\$ÇQ~†g,ƒ Ÿu‹Ë›ùP’§ÏŸá9Ioˆ·¦,ÂxC=‡î ÿòê¼ûm¨ŸA8ýYKOß©çÌ'omˆàŸ‰žO˜0Až}öY»([A¿ð ö“¬.oÔ“sÄdOÞÚfT&å•••¡×-߯Å6Èp}ûöµ[si˜ ÍÁ'Ÿ|b Ɉү_?û-Û�Úí…ÝdU•é °*ø‡~°ÉàÿðÃ¥G�n655„gâo²ñ&v›d$pÃ1hÁÿþûïÛÕ¿î9MÝ2k¤õó2~òÁvØÈë‚ .°a�núqß�³ÛBc{k8¬¼…ù^c¾ùæ›íŠÞW_}Õn)�vâ¿Xe 7cÆ éÖ­›´mÛÖú¿øâ Ùpà í1¶î~ì±Çì±û«ŠaXÆJèÎ0hÙ²¥tíÚÕ›Él°U7¾A ÇpøWXa…ÐÏðtçìù€w’ꜷÒó»eÛ<œºdìGcÜtÖWݦÀ['‚mªrõýŒ—‘ 8£AˆÏòäq(M`xŒ¸L„3�XÒæZ“w¢4ä\D—P…°@´Ý:ŠÀÏðœ¤ÉËM‡cëÂé·Òã�º¸áôÇ’HlœÏÛ÷'bøoÀ™¥X.ðÄáïñF^Ìײ ø§:¶Eã<þsúÞ÷3^.ià�§ë’}î™<û…x~·Í(5'¿ÉÓM‡cëÂéO%Y¦ÏÕ´yä"ÎL�2à|þ‰Ðÿ�àMU`cÉløƒ‚s=X.)ôŸáI�79³M&œ>û"ð'O`à±m;üoߟ_g\J¿ÿ’úÀ?¬CÐQ~†g$Îd�46�Ç߆×àïõ‘É$£2ÓÅóø'è'úžÇE“g–ǶUŒßVèb þ¨—Û/ôÇ‘H Çq'á«égxAe!ø{¼£ø[®ÁµÀc´5oŽC<G"-\Mþ‰ð‚þõxƒ�ëÐv¸XÒã² ÂéO%Yv>y“3Ûdˆ6ú�ç‰BÊÞ¬ ëKfÜkM·þ œþX2hÛ„¼êÌ�?y¢Ù<¶m‡?à†{~p±qãH즷¾ê|o�¶-¨bØVßÏxÉ€3„øü!O‡Ò†ÇÎXÇ0æK�Až®CßÝyE†u Âé�%M^nz[N¿•Qüƒpð±icH2f>¡¿¡ð÷x£Yl«eì\¾,l˜ÇºéæÁx¹H¤�óõÝT³ðÎ/Äóç¥�¼Ù>s×ÖŸGÞä̶2Ãé/ŠŒà 6p¬c,™ ÿ€³eîŽ÷EàŸhq‘ÿ�È2è‡(¿ �à_›. ->U‹‘ñY\ì|ŒE—6] LˆG£µ/íÉ<ÿIù `ŒÊÀpCdÏÕ{ ¶…f8ë@Ë5ýø.–8cÕðÃ?lW¹â\Ó¦Måð×{ï½×ƒ¿{÷î2øáÁ6 ÛD§r(çŽ:ê(»+_‡ b·PÆÖÆt„åû¾ù›Ëü�Ýz«Záð�]l¯Œ­Ÿñ�Ü=öØÃ®ªÅ9¤9ä�Cì ]”ƒ+Ê<æ˜cÂÎA<¸“O>Ùn›\^^n¿ c9VßtÓMòä“Oʹçžk¿õ ž(|`¤…`µ-±µön»íò=묳¬á8�sûï¿¿ 0À®Ì>ì°ÃlÜiÓ¦ÉO?ý~Clà÷Œ»ÿú׿ì÷”ÿñ�H—.]dÔ¨QvÛgò`š�£y#+¦ia †á+ŽÎx™Ê0ÿàM�(?Ã3•àcë€kÇÔ9ÊÏðŒ¤É7䋸t¾¾›â‚K—1²—äG,Q~†g,ƒ Ÿ5Cb¹€3ó O ÂáÏðœd†üY‡¬¤×ü�ONlYJü=ÞÔs0põ?+ÎQ‘ ÅßãM=g?FU§ÖpOß©çL—“~\É×ç D‰bãËÊIz¼LaVä[züYû�þ¬¥ÇŸ¼ÙôÇ’žþ³Žìús’rf?Ð[–0rõyû~ÆËJ‰?ëäë»ïg¼L%õÚ×wßÏx¹HÖ%/¼™Y ©×¾¾û~ÆËX–°¾“3ÚŠþ¢c8ý9É"é;õšýź2œþ¬e!Æ{£+îó<9ûü³®kª…âïé;9ûüSU)m˜Ç›ã Óä2ž�k(kðžo<ýg™YI�w€)Ì‚|bK�? `?Пµôø“7û�þXÒãÏ:ò: ?'éñ'göý±e ó'WŸ·ïg¼¬d‘ø³N¾¾û~ÆËTR¯}}÷ýŒ—‹d]ò›™’zíë»ïg¼Œe¡ôÝ«?yæ“79£­ÈŸŽáôç$‹¤ïÔköëÊpú³–…ï�®èóMDOx¼©çŒMý�%=þÌÛ׆g%=}ç¸Â<¨Ÿ±e¡Æ�?9³è�%£øád•“ôø“3û�þز„ù“«?¾û~ÆËJ‰?ëä�゚ñ2•Ô롯 •%K–ØÝ€±ëò%_b>åz¼µíuîÜÙÞ'©CHçËLËÌ<^•49ÿüó/çЩbµ'W¶¦:ϰo¾ùÆhÙ˜óÎ;Ï y¡Ã0 C$Œ ¶¡¦�0–bY4¾…‹-ž[·nm·7†Á®cÇŽvu+ –ýû÷·+c±Z–tRatíСCh-/+—®+t•=zØôT@p±šÆK” £6¾W ã.Úwíµ×Z£(ê…º`Ëeœ‡íBY{ï½·¬¾úê¶ 6óà·Wƪߣ�>ZÎ<óL»¬û·ß~“>}úØ-³Ù‘ØjF_¬Ô…1uOå¦L™b·uFÝàhFýQ'¢Ñv¬,†1m‚ÃwŠ·7[u»Ž ¸Yßͤïf}­±û¯¿þ’-·ØÒ~�`ô ¾uŒö3>$úm‚aùóÏ?—îÝ»[VíÚ¶Kzà`yäM£”¥~Ã+õN+ÿàA"¼><©#‹U�7Ç{æéŽ'!?oœ©5Üã�g‚D±‰ø°¬F)=þäÍ~ ?–ôø“³Ž÷¡"IxÿÌ'fîóöýŒ×˜$õÚçíû/#©ú­B:ÞD³)Æ™Bð÷ô�ã ïËÅhV½-ÃãÍq…õÍh<©íyÇãϼÙô7Jéñ'oöý±¤ò�V­"ðgá¾¾û~ÆkL’zíë»ïg¼\$y*oC¢úNÎþý•áì�F) ÁßßÉÙ篼£õ?—q…|£x3¼Qrg£ ¡ïþó¦§ÿ,ZùGë;ï±ô>è‡(ÞÊ?aäÄ8áóöýqú!Š?Ë!G�m•Òæ;)¾ ;ì›t°ÅÍ™=G°33Ú ‰l¯¿þº{-£Æ–�}:WÊÌ*Òª%‹'x×¢°éJ|ôÑG­a{[»Þo¼Ñ®Ø6l˜5¦ºç‹u í¥—^j ˜Xa»×^{Ù_­åà ± šn€€�ß ¾âŠ+uV°�É(Þæê°ýÂóYI½!FkI�>�$îÑ•kg"ùçOß9®ð½P�n¢Ç›ã d5®÷Or ¥Ž7ÄYSzüÉ;Ÿ÷×ð…�Ï75+Þ@BêôùFÇû(}ç8ÄóYIo¢/΢Œ7É+2XŽCô7JÉßœˆºÖîé»>ß8šåñæ¸ÂY�+QýàñgÞìú¥ôø“·>ßIôù¦H S¥ï‡x>+©ãMjØ-Êx£Ï7‘ÉßœˆºÖîé;Ÿ#9¿Y—ÆpÂãÍq…MÏj\‰ê�?óÖçCÂãOÞ §?–d1Aÿ(˜Ä¸ÂrÎ'æíë;Ç!žoŒ2Š7û…ç3•X| ÛÞÒ¥K“~°�bûèéÓ§×ÀŒ—ÝÝ�ýX4ËOƺçv½c’”™ïÏVair\÷ÇØ­Ÿ{öì™”Õ¢E‹d̘1Ò«W¯”•HŠ O!oÇwl±Ò—«•kÔ¡1x¼£øgªÀ)ãyü‰×PÞ¨¤ÇŸüØôÇ’Ê?Z¥ŠÀŸ…ûúîû¯1I굯゚ñ2’ªïÑ*T}§^ûÿ@extåÁ™Bð÷ô�œ}þ�€nÍ&z¼9®0bFãIÔÄÃ=þÌ›ý@£”òf?ÐK*ÿhÕ*îë»ïg¼Æ$©×¾¾û~ÆËHª¾G«Pô�zíß_]¹Fp¦ü=}'gŸ# [³‰oŽ+Œ˜ÑxÂç˜(éñgÞìú¥ôø“7û�þXRùG«Vø³p_ß}?ã5&I½öõÝ÷3^FRõ=Z…Š ïÔkÿþÊðèÊ5‚3…àïé;9ûüÝšMôxs\aČƓ¨ç†{ü™7û�þbÈ 7ÜP&Mšd·‹ÆḬ̂ÍBâóºQà믿Þ.²�ªv 8p`�Ó»Þù{ ksV #�%ì·5JjLžÂ’k®oØôo¾y¡„Q,�79SåÈ?–ôø3ïº Xv½‘rf¿ÐKšÆÚb‚›mWþcÈ.täœOþÌÛçÍqˆç£ŒâÍ~áù¬¤Ž7ѪT”ñFßp�ì€Hþ‰q(+=�x縢Ï7¦<ÞWØ?9ñ&wJoˆ³¦ôø“7û…þX’Ýô+áßoÞ¨¤>ßÔiwS¯}}ç8ÄóYIo¢û´(ã�>ßDv@ÿ¬ô›÷UJOßõùÆ¡ïñæ¸Â±¸GðgÞz5$<þäÍpúcI£Ï7T½j©Ï7Õ,êàˆzíë;Ç!žÏJzã=›¥ã�!Q”ñFŸo¨s5dÿ¬ô›÷UJOßõùÆ¡îñæ¸Â>÷\V3/ÊN�:…+…ß|óM:th„xŠT¸“l¨ \­Ò^ÅÕñX°Mí5˜ ä…O,é)˯7l#«ò´�Ÿ _¿<ÞÌžý„ƒBð÷x“³«;Iu(¶‡@XnÀ¯Ú›ˆ@^YK�˜/Â=Þ¾?–žG °,Ÿý@�I�?ùØBýgxÖ2hÓ±�U)ø#ô’ý@,éé?˯?ü“; äÓŸ«d{-ozŒ´Ùãîø�#ç|ògÞ>oßÏxÅ–äšb¸püñÇñLýAFa>dËœFñŽÅ¿Þë»À†œò¤ïÔó0ß�? 3¿ë;õÚ¿¿2<¨N݉€3+rÊT¿ýxž¾3û0_Yþž¾“³Ïß­FQ� „…üª½‰䕵ôø‡ù"ÜãíûQ9å,=þ,Ÿý@�I�?ùØÂñ‡áYË aLÇvêóM†H¬ 9ýB®’™sܯö›#OÿQôœáôÇ‘,Ï×wßÏxÅ–äêë»Q|[žÏX1>ÛãóG8â¤â‹£o’û­š?€›Ÿ>߉•ÔÓœ¥§ï ú ÝN*žBð÷ô�ã ï×5êPìa¹Á¸RíMDÈÿ0_Àöxû~Ž?±¤ÇŸå³è¯3éñ'gËÂTŠþœeÐ0¦g;õù&C$V†œ‚~¡?WÉÌýû«ÍÞÓ”‘ê~Ëð\$Ë÷õÝ÷3^±%¹úú®Ï7ꉂ�7‰Â~ šQ,}§^û÷W†ˆjæÙFð'¯¬epá„éÈÛ»�Û`”�ïçKïþJÎ>ÿÌå9¦Ç›ã K ¹¼P8;CºÀì™<ý©Z&nVç†e}ìt.Ò²lý±¥‰õŒ «è|]a»2–…âïñ&göcÆõó#z¼-§ ¸8PF,iꎇŸ0S[l�¯_¥¬üN]m:ÏO>±¥ÇŸud?Пµ¬Áßäy‚‹ã ù³Ž §?'Á;ÀŽ?¥ÂŸzÎë€þXÒ€Mtsâ: çRâïÖ™Ç�qõŸ\}Þ¾Ÿñr‘¬¯Ïª‹~‰ã¨×¾¾û~ÆËX0>ë—7ó¡$OŸ·}HÊuÜ7uwÇ{–åógxVRÇ›êûhTÿDðÏŠsTäBñ÷ô�zîëTµ"ÃkÜ_ML§ ÔÿXÒãÍquG¾±œSW›�ç'ŸØÒãÏ:³èÏZÖàoð|¸XÜ©ÿæ­ã�!áñ'o†ÓGFñ.%þnx WÿÉÕçíû/Éúú¼9ñ|.’ãJ0<„Ïó¾Ÿñ2–AŒÏºÅåÍ|(É3Ÿ¼ÉuGþt §?'Y=4Úä!Ÿ œþزPü‹0Þ�³Ï?'Þ~¢Bñ÷xSÏÙ�~52ö{¼©çLOý�%MÝÝçyŽ+yáïñ0±úáxCN9K�? `?Пµôø“3ó¡?–ôø3o^ôç$=þäË~ ?¶,6ÿ _bq÷ÇwßôKNÜ™¨Hü«‹K.0®þ“/Ç�(?Ãs‘nÝ]#:Z‚nŽã¨×¾¾û~ÆËXJ߽ƒ§ÏŸá9É@¯ÑV¤§ÓñÆ�ˆïó8Þ�³ÏŸýK&_þáý5ßúÎq…×K¬:»‰#øç¤ç�~»¼QÇê>ýn5Ò÷éÓ'ÝéêseM¤âõ×_óàê@=RJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (�¼ÀÐ4Zû2Ó°å3]—.]y¦vURq@ÿö#é#h¨P¥Nàþ{ >®N 4 #›IÕèæaSËz/YoqèçA‡a?‰ü1—^•J@ (% ”€H&б•üµû6ì陯ÊüÊÒ·Õ²^‹µäÁYoÈ¢ª%ÉñÕ—�½Úl&Ì%“þ*ÍÊ›Én�‘Ï ·içí°©,îØ^:<þ�y-¯Þçີ•éýV•GÿzQ,·§<3ç™_Uý,ØÔ¼¿oË dÄ_oÊ¦í·‘õ‡˜gÅùÁùN­åç�;Ék³ß•ÝÛõ“'ç¼—T�¾Í{Ȩcd‡–Ê׳GÈ®�È O›gÊ¥Ëñºw�}—ÈØ…?ÊÚ-בáó¿MJŸ­çˆ¶ÛÊðéÏË ÍW–¦l(Í>Ÿf1kÀúòäü×dÛ֛˰ßÈÜÊ…á¹&eå²JYsY©i7™8ç Y®¢£lÝ~WYî §>Í+ä�þkÊýOtØKÏz3L�ƒÕ›® íÏ�Kþ�ʔ֯ÿž_²éŠòÅêsdÒâߥS³nòá‚ïÂs88¨í6ÒcìB©øò÷0|桞¯ÈŽm¶’¡ó¿”9N}ÃHT˜þë^ÞZV-’*Ëå÷EeÝ6½e�¥kH›—Ç…9,ÚjUùd…)òײ9RYÞ\¾[ü[xû·Ù\>�ñªtlÚUö³®Èø¿çËËä¯Ã6”Á>+ý<ûí¤t½›¯&ß-kt`c£Êî�–.ï˜vNžÆ›yÈ&Ý †«I?ë­0[½˜4ûS»fÿ9»Hó�&&�¯Í³hëUåó¦ËoK~—U›w¯¡c»´ÞD6ß\š}’ÜÞ´ù6)—¿Ý@þóy9 ýÎòÔÜ�dIÕÒ¤$›Ý³pœü­Ù2fÞ—²w—#¥Ã³cDã`�òᦋl½º6[Y>òt")³ÏVM×’)óGš²Ë~M”6¯}Æ\°Cy­Ý(»›Jצ+É» Ìq–n�ŠåeÆÒ¿di&³–Δ�;õ—O�Yœhë‚�V—Z}&½L[Ç.ýôeFXB›ò²E“NòÝܯd÷öI—g«¯‡0RK7^A¾_KäÝyŸÊÞív–Gf'ëGYH‹²fr¬é§Ï›ëŽc—I8û€uåÑECd/3v=;wDÒ=jÕ¦�eÚ¢_ÍxÑGFÍ|W6j·¹¬7¾£4ý"SšUÈïý{ÊÓ³†Èþíw“Çf'ÆdÖg¯6}äËCe•=¤ß§+5ÌGwi#íÒSžšù²lÔr]™´l¶|¿¸zÌ‹¾æšet{—Ö›Éç3‡Ë–v–¶—6o|bQ-Þ°¯4û ›Ü¶ÿ#RYUI|²›ËWhÚ%ô×vPn.«ö,–…»6‘‘2X6ßAZÏm&³7ÛH~�:LÖÿµ«|½i™=o¼téØW¦ÎøLZ·ì& M7å.“­AŽè°Ÿ,úìAYaÖá¦=ÕË 'h!ÏÏl-][,3‘9Ë‚uu•FšL§/l"Ë7[&.NH„-YZ&³—–ËòM—Éüeå²ÐÄm^^%‹‰|–˜|ðäÁžkbŽqw¯0ç–šôÛsŽty±…¼³ùëòuË?L*ä s�}cÚ3Ò¢¼¥ìÖî`ikyfŸ¥UÛööYÏ<›/×OÖ~bmy£!2~¥‰Ò»ÝVòù¬÷ÌuÕSú½¿“üÐâkùhƒ�M¼å“™oÉÚm6’õô–6O·”‡¼[Öi³‰Œ_ð½,X6Oöîz”¹�T31Õ´®ÃÝmdÖqs¥²Cê¯l;fªTŒ¬~NX¶n™Ý»[ý­pŒš-]ºT,X mÛ¶�‘‹&mh•¿Á¿yèÏ¥�n¸¡à—Ò™ûQy•sSJI•€PJ@ 44-’¾€ÐÐZ§íQJ@ (% âh†©¾„ke&ÿ]×ÜLö©Ë�@óòV6q…1däÝyÏx-Ê‚Iè  &v ×)µ•s>èórÌgêŒñŒnYëD^Í�a;Ÿ®¹™PNåšzئ,Y?›˜iõæÆ Waâ43ÐÎÑïçL@k“¦¹ÕûšÌŒß*¢^<ïËŠà dm²Lçæƒ¶µ4õjfú5Š‹¿µ)«M on8�››v.su ¼º?§VÙ²æx�N‡šš¾iê�)µ–áEhéõ¹w:;o Ãå°€×Ôšejföp¡F4¯#©ûqëÕ¢¬¥41FþTú–­Î¹ù mk£ Л–Ô‰¦©û»¥76ùט›o.ÇMýq(‹LZrLK¡wxù®™w�jíµ§Fqüx-›kž7ÆúqJÖèsÓ`œjkô$'Wa>?W}•ä”…›¨ÜÜO–9×Zâ\™TT˜¾p\“&-qËÌuZÙ†&Ló.UêË)LY™c3‘AsG¯š5M¼´ÕÂŒ©‹›W¿t%­FY[`sS/s}—5k#-›TJ ó£+kbîŸÁ„°&Áq™ÑéeÉMµIšãmëŠDúffP¯¹QÿæÁÕ,¸´¡Úöœé¸¦&ÒÂ5/O¤‡!¸iY"¬<�8�càk„Qâ\«ÊÖÆ¨Riâ…™°Ä}Óž–VK0Þ47FáÖ‰ü5}ÓzAë$iÕÄœo•(¿:bê£pìJ}•Ž:£áJ@ Ô3¼WppmÕ»öÚk¥S§N5~wÜq‡<þøãò÷¿ÿ=uf5CCÝ çŸw® öFêÊ1tÙ²erÊÉ'ÉÇ#F¤-µ²²R~ÿýwûÖFTDœÇ/®CxC$•C=&Mš$sçÎIuºFØçŸ}&}7í-¿N˜Pã\} ÀÛóçÍKÚû?_uSôó„ñãó•eÎù|ÿý8[—éÓ§Ë[o½)Ûo»u^ô&ç iB% ”€PJ >óo÷1¿ý(C¿ý(ò9íüî6¯–WOxÄ/TsPJ !X2‘¼qÃÓyiâ7<%KƒÕnyÉP3QJ@ (% ”€PJ@ (�¬𛿙®üýç?ÿ)?ýôS�ßI'�$ýû÷—›nº)²üòbÙa¬\¼Øy ÈTéÑG‘qc«·é‰¬e�Oôã�=*ã'ŒOYÒœ9³åŒÓO“öm[Ëš½V—.�–—�wê''N´ñѶK.¾HºuíbÏ#Î�ûïß{ï]{çýßQGš­,<÷Î;Ãm>ï¿ÿ^Òðû×ÿ�oë±öš½l^Ûlµ¥Ìœ93)žëÁ¹(Gy¤¬ºÚjî©ÈcžgÍšU'[ƒOüõWéÚ¥“øm�¬lĉTm@?¡ŸgüùgDªâO›:ÍÖeÞܹ²ãŽ;Ù¾9ü°CÌ|°N¯´$% ”€(E× 5Ûª-2[vféªøZi¬´/Ùe™e�èÏ9\îñŠŒœô£ô¹õ4™8mr�8ÿý±€kPÑ%аL7Q¾yÙ\ëYºef+áÊe‰ðxé’¥òÓGf›Ò ܨ!ŸÊäÑã#cþðÁ¨0ÿÈHzB (% ”@ |?ùynäÛÙ—€íö9gægŸ“¦PJ@ (%P§¸ò×—Q•š:uªüøã�5~£F�üÆŒ#‹"æÉÌ^5ÅY Ãç]w’£Ž>&ªõ:üÛo¾–'ž|Zz­ÑK>ûôS9ÿ¼óääO�!C_7†ÒJkÌ»öºë¤Oß¾v%ñ5W_%Gu„¼óÞ²ÞzëËcÿýoRûæÌž#Gq˜¬¹æZIá0žrÒ‰IaôœyÆé¶œ;ïº[¶Ûn{ùó¯¿ä]c,^n¹å¥†¼ù¦�6ìäSN­q.*à›o¾‘í¶ÙJF~õµ¬±ÆšQÑ ¾¼ù6Ä {î�]n]¶!0—]v…l¼ÑòüsÏIÿƒÊ% M£”€PJ Á¸úµ‡åÅQÉ‚%‹åå㯔�'|' yH^øöC¹u¿Se-ó�¨‹†<(_OúYl¼�œ³Ó!r­1?í7ùuæ4™½p¾¼r¿¥cËv²þÀ“dìÅ�Èû?~)O}õ®Ü9àlùsÖŸòïa�ɈñßÉ:]W‘‡Ž¼P^3yßüîó2Ǥ½e¿SdË^Ƀ.�^�ºÙx«.×Ež3yžúÔ@9q‹=¥w÷uäó_FËË£GÈ{� ôÞÁöô¹3峉ãd•Î+ÚI®›ßyNfÌŸ#ã¦&^ lp�¥ R�”ÀŒñS䥋’?¾ÿMúºƒìxö�òØÉ·Ê’y eÌŸË!wœ._¿ø¡|úÄpiµ|[Ùùœ¥]×åå¡£®—Î=Í7Z¿úYz÷ßF¶;uoy÷îÿIÇU»ÈFûm¯¹ÃÆ2í§Éòø©·Éïßý*[·›lqÔÎ2æõÏåÇÊôŸ—}¯:V–_­‹<ÁýÒªc;ÙòˆeËcw“÷ï}ÅÔá i¹\k9ð†“¤ri¥¼vÍå·¯’öÝ–—Ãï9Ëì¸X=°pöü”õš2öW~çK2廉²õ »™vö“?-#Lùþ6Mö»ú8rÕã¶S˜,ëïÞW&�™`ë{ÐÀ“eµ>Åý7e#UEm¶PJ ÞøuÚ$9þ©›åÛß‘Sÿ¶—\¶Çq²ÇýËÜŠ乯ߗÿ{™<õÙ0ôÑ+Ò¹u{¹vÏãdåö�eû»ÏµÏæ#&Œ•ã7ßUÎÛùp¹æÍÇ¥gÇnrpß�“Žë]£µBJ@ (% j!À•¿¾ŒJöúë¯Û­ž£Î#ü³Øvå•W®¥¢>} vÿZ£¶)Ò¥IwYpŠl“‚Ú¶mg ¹ \{íuìrë›ÞhW5·oß^F7NZ¶L|úÈÃÖ{ÄGºÁrÕUWšÕ·³“Âàùå短ñ÷êk¯“£�9ÖžïÞ£‡ôîÝ»F\ÌŸo&.o¾I®ºúiÑ"ù»@Œƒ§å¹|ç†xÒgž.ÿTçÚ´ikV+ååZíõó¯>“ýQ®y¥K—ªMnÍ¢Î÷ìÕKöÞg¹óŽÛÔìÓc% ”€hÔ.ÚýhÁï¾÷_4FÛwäÿv=Rîüà%yóäë¥eë6rÂã×Ëîëô•{>W¶¿ã,9ºÏÎvBi÷u6“}v’�Ãþ+¯�ý\ŽÚrküÌmÖìm8þ¿W�MW^Cné¦]UŒU¾ú�Œ8ó6™¿d‘lvëòãe� Œ¹ÿ9øé¶|WÙíîódü´‰²“Éçٯ߳à§�Ay¯u·@– gž¯^ý‰\¶ËQ2yÆ9ûÅ{dÜJËæ-¤×ÕG3–J% �ŽÝW�ãÿ—`Åî [ž)Û�¶¯5ˆþdVÛîzÁÁòç„?ä�A/Ëé¯^-¿|2V>~ô-ÙùŸýíVÌûþÛü»Î|ó–þi ÀýÎÜ?$Âã³æI‡UºXCòbcT¾u§óeí~˺»ö±?g_¹ò19á¿Êߌqxå�{ÊÚÆhüå V"Ÿøô%ö³zeæß|åå²í‰{Hcd†zÆ/S¤ÓêÝÂ2ñïlí×kèuOÊfÒu•»Fzmµ¾‰·Dš¶j.§“«÷9Ùî–óoó¼>êü佟¾–Û?xQ®ßãY´t‰<0àŸæû«åÿÏÞyÀIQ4}ø¿ñr‚Žœs’œA@2" IQ1!˜Åð꫈9T³&PPÉHÎ9ç —ÓÞmúªzwöf÷öî8^ô¬ºßìôtîgzz榦ºQiÒp¥~¢gÞ»B½ûßETZ+„€WmY^MªÔ¶Ûo¿¼[èÿ;£VH±_`^ã´M«–*ö³ÏüG¹þé'_êíÛ¶â–á7©éŒË%”[¹ÚívþËìÙèÒ¹>›ö)xªã{î¾Kù³í£§ aƒzˆŽ WëÛÎ�ó«/ÏùóÿÀ ×÷熇zIºi:„aC‡¨pN?tð _Ú uœ¦õdYYi6“5‰¦üÕÒ_sMå<@¦ÙÁäƒ÷ßG�ž½ÀJ\MÖ¬^M ÀwñÁ”5/ßž§…f6ì&Ÿ_Q¶féѳ§/êìY³Ôz³<•tµ*•ÔtÒÌxÃúõ*¯GË–Ë,ik>wPÇÁ~þóôSài¬ù¼q~ÌsÂøûÁç˜§Éæi³yýá?æýîKþöÛo©:p[†¿óÎÛ¾é¦Ïœ9£Êܲe‹Š¯åÏç�§½æüùÜV§¢ÚðÛÜ9ªnœW“káƒ÷ßóÕ­ >ÇÓ€s¸¾œ®wÏصk§/]amâHK—.ñkó “ž÷¥Õ×÷»6lPh~²B@!ðo&püü)¼2ÿ²^…Œœì|(V�åíô�K0ê›q<å{Ž?“uÿIJœe±†Y•Õb�Ñj)„Ùj†ÉlBXLª·«�Ä£gaKÏ&eò¬úòOädäOí8‚F}ZC¥µ˜a$E3KD)ÏXU*FÕ+°àÀzq9™Ié(]³¸®u»5Å¡µ»U²•Ë $Òó4§ã-‚¬œ­‘¡0Q™‘äæ¶‹! „À¿”='ótÏOÐG—Ù¹9J±«'±åÔAõ\=ê»—ñ.}ð9ÏFn �‰žÍA÷G«©ð{¤>?q ! „€¸®¬V÷åË—ãÑGE«V­HG8 Ë–ù/[PZcQÚå‚^¨DD}ìq½g¯ÞÊݨQ#_ò¿Vþ…6mÚዯ¾Â}ãÆ)eïŠËUxJJ²šnyúôïpëˆÛ0jÔhåÿÉÔ�•2îæ›‡cúŒ™¨Z­šR îÛ·W…ÇDÇà¦áÃUžÏ=?I)‹5‹ÛììlôìÑ ¬˜eEë/sæ¢Yóæ¾úæ°Ùl8JkÔNûô2¹þ<ø`�Ö³Ú¶ÁÖÝ]½jÍͽ wÜq‡¯8®×]w݉›nºÝ»w÷ùkŽãÇ�+…s6Yõ~üчxbâcøöÛoò­«¬Åç=OƒÌÂËš¤¦¦(%£ÉdVS-ϘI/*ÈÚ¥oŸÞÊZ¹ví:éµ0¾cÌ�ê|• æ‚äÔÉ“X0Ê—/¯òsçX|úÉT¼òòKèEçû«¯¿EDD8ž}æ_•*V„—=ðÆñäÄDZ‘Ÿ,¼v/³IOóXAkùÇÅÅáíwÞÅ»ï½OÓ^/Qü}8Šjóç6Îüþ4lØ�=úÒÒRU.õ¹»ïKÓ3ÿ@ÖÔ/àãO>Źsç0à†~>þ…µiçÎèÛ»ÊÒ�?ÏÂç_|�øRñµZµl¥üvìØž/L<„€B@üëØhûÎx´®\77é´ù5âËáþŽýñÚõc±fü;èSÇóÑa¾ÈôÕ£¦ÈuÒº(É©É*J¥¸Ò8—™â‹†³dí«IJVâãµC¿½5,MËWÇûË裷ZôáŸwF•™ëÿĦð_šâŽ%.gÓÔÐlÌÂÓDGy•Ș…DB@�)�·—ü€Åû·Ð²)½Q‘ž»¥|LIÔO¨¬žå?4«Æ½Åwœ–žŠÜì,u¬wû"ˆC! „ÀB@3Ê ÜTýÅ‹c̘1¨JƤ¬?ëÚµ+xà¬Y³¦ $ZîÇÌÖ´�²xñ"<úðÃ�Þ~Ç< 1+l‹¶Œ0p @3·nÝÚãÖ%;önÜ{ß}ʧ[·îÊv-U¼sç¼dÿ˜ÿ§.ðÒ‹“ñàCcâžž[µnƒª•+bÖÏ?ã‘GC+*‡7–îÝ{`YŸ.[ºã'<€_~™­,,7o™žv—¥C‡Žxqò Ê]ØÏ-ÃoöY²¶hÙ÷Þë©w`šÔÔTš®ùk5¥o©R¥ƒ1õã�Àþ×Q{5a…ééS§1ù¥—5/¿ý‰'�‘‘ŽõëÒ:Ä5�wßy3¾ûŽÖ&ž�pR´Ê)²Ræ¸Á„§…Ö¤nÝzhÔ°>ØŠz8MIݹKWRØþ½{÷¾ µx;tìˆÇŸ¨²kÛ®�jßxꀚµ²-dž1·�OIî×x-ã/¿ø+W­3 &œÿ“O=í ZN_7h øvëöÑãjèUd%<}óµð õ[ãéß?Wé÷ѺÁC›uÅÂÏþ‹…;×âtzâ#c<–»úÌtî›)þõŸ<�Õ¤|fY±wÆÌx?ÑzfëïDù˜x4¯XKlÅ‚«UœS©‰j/?B@\ÒΦ"&!<=sNºçÅtM�|†¦_>»ï8Ê5¬Jká!%ñÄ•/‰ôs©¨Ö:ï]=…µß.B‰ ñj `ÍÍk³î¹ý'h�áH=‘ˆØrñH9•Dkî–AÊñó¾,B"Bqrë!”©U5:4À��LUÓ6ç’…p¥fµ|ñŠã`«ß„Ú”õ2Ow½ã� è<~ ¬ôX2'/‰+„€ÿ.§ÒQ1¶Òr²�fËT�ç.·œ<„ý§£ ='o:±‹iúç*´ÔÊ©´$\Wƒ>¬ "¬üUK$¨5€5w¿zm�a·¡Td&ž@µ2•pàôT/]Ñ÷qf�¬ÄK! „Àÿ+íãÚÀ}A•Z¸p!Æ‘.öî»ïÆ÷ß�ádüÊËÒ.X°@Y” 0O墵ôÂÊ×Q£G+ËH½¿æfÅÞ]TØ¥Öx³e¤Öð`ùóTÎl}yèÐA¥ÖÇaë\M8ÎæÍ›p‚,gÓhMÝPZs�eÿ¾}Jùª)µø²ñ¥—”²zÕÊ•`+äk;uÄÒå+”RSKÏø‘#n¥)¡CñÚëojÞ¾ýéÓ§1sæ üç™g}ÓGoÞ¼¼^ð'Ó>C||<232|ñ5‡“òeùæÛéèwà Ê=ç×_•rþüùè?`€òÓÿØÈªXk·Þ?ÐÍÔ¬�4õ± åUSëÞ*eé}paæÛ¸u»7ƒ™”ª�ohëkw‹¡×*wçû<ÿçñ�ææµu÷kƒS§õ}«áÖORq¼8~XŽêmê¡Y³\3 =Åû '¶DƒÞ-1è•1X7s)Øb¸ZÛú¸¦;šJÚ¨âÖèØa±ÈÉÊû߃­}ƒÕkÈ[÷býôÅTÿý´Þñãj*è<ã,g¦oOXL$êuk¦Êˆ*«ê§äG! þuë< /.ú«èÃÈÇ» …•–CiZ©6:Vkˆ¶.Çã=ª`;}¬ôñê¹Xyh;6ê€PzæAÏÞšŒmÛ[9çgh¯hnþÀr۩ø­y7Lœ; 3F?‹g„é·²B@!ðÿA@›•Y³.ªN§lô¨ Ï&¼ž–tmÓ¦�æ|O:/³^Q§�uY·ÚIéøÔõÞ4x0¦|ô±Oyéø¤‘u-KjJªßZ©#izèæÞ©œÙ2–§HfëWžn:99 ¥K—VéXqÇ Ä‹‘š5k)‹XV�תU£FŽÀ*²\íÚ5ïÁäñÇÅŸ.ÀÊÕkP®\¹|Å|ý•çå#[Ú²ðzÇw�½SÕõšk®ÁÞ½{�žîQ#…6W«V]ÕŸ­†5å/§åµ}ùå([ÃS—¥ògÓ:Ê"11Ñà)®ÿnaùØ1w(%8[üÖ"¦—»¤z§£æ� ÒÒÓ}Õå>W±BEev_X›X鯭 íKÄ¡)•Ê /! „€ÿ>76íÞôÒ¨R-¼I›&j5ošto�÷Ü´Jp+;-.èãÃÞ�Ú«Mó+[“úÝ©ªý}�ûއè^HñºÁÏ_?Æ6´E7 õå9ª–©ˆw‡<�ç!.! ®¼–n阮çkO§{úùüx]ÜŽw]ï;fGëÝ|Ç�îöó�ƒ×ðí2~€ÞK¹+4®ÞôÂuéõÄM>¯² ª mš´ÝSsâR@§žJÄÒ÷fùü®7 h½xmß¶£zøâ±£tÍòjc·%ÔêKÇJ妃< 防%Á›ˆB@ü; ÄÅÄá•÷äkü£Ýóî›ÑQ1x˜>¨ÔËØŽy÷½GºåÅÕÇaw7šÍ‡7Vþ²Ì;YíåG! „ÀåJ@[ó· Ýl`½[’�¾7x Ck×®�v4+íÿûßÀ¨ùŽÍù|tãÇO[ž>󟧕/OsûñÔOÿß”¿\ Vj²ô½þzðz³�ÂÓ$³ò÷‰'ŸòM})Xy-Y^«–­€Yi¦/Ï.VjÖª¥’ž¤©™5yaÒój½a^çµaüu޵pVö~ðþ{¸¡ŸrøÌ™3jÍ[ŽÓ¼i-ªÚß{�ÇÊúȱ¨\¥Š²|f+çJ•*©pÎ�ÛËÓ*“4½1‡ëӋǧ<ÅtåÊ•ƒ_R¿•´æ3[@ÏùíwðTÉ,óçÿ¡ö—ë+yYîŸ0 4ÌWÍeË–ڦʕ*_�u5[ ³T­V5_â!„€B@! „€¸”X9Ëk‹! „€B@! „À?C@³ü ÜT:+~»wﮂß{ï=¥ãä) ‹7ŒÁÖÖ'äµvŸþÏ3j=ÛO>ý¬Èilõiõn¶T=éUÂêý‹ëæir{õîƒ×_{kV¯›?³°õ䡃‘””¬ŽK–ô|iÌZô´´TåÇ?íÛwPî�>üÐçwôÈŸ;˜ƒóÝ@vMXYúê+/©Cm­á7ßx]MIýÝô™jÝa-®~ÿûo¿)%îíwäYаBúô™s~ÛÞýU²3¿WþqqqdùÛ_ù}õåjÏ ìiŸ~ªÜ�»ø[Æ(Oúéѳ—rÎûý7ÍË·OIIñ¹ß~ëMån×¾½Ú‡†z¦"æ5„/µhyjç‡­Ž³³/½åñ¥lC“&MÔ´áÏ<ý4x=`MØ:›×{.ªM|~þ u¨õ}èðáüÓmó”ÞUh!ïúõ=ÓHjåÈ^! „€B@! „€B@! „€BàÊ& Yþî j•ÑhDDD„ ®W¯žZÿ· ¸~þ4ë�™µÌZA~�ºƒG{¬(æ‚.VØz˜-düá5�1+•/V^~ù Ø×uí¬s<¥3[õ~öù—jŠê.]ºâ¡À¬ŸƩӧpúÔi°™4Kkš{ì]wãñÇÁçŸM+ ÷ï?PhUØj•­ˆy æˆÈHö®•ûî{ï«© —/_†ÿ<ý”ÊcÌ·ûåÅ–Èãî¿_ù}8å¥àÓ,_Ù“ùsžÁ$Œ,{µ°„„¼ÿÁ°Uðôéß©u‚yJâ»î¾<%u0áõ„ïs§RLßtóÍÐÖ»å¸Ë—U,XqÎìø|Ô«W_eS§N]õAŸ^=Áîçž^)݃•Q\?®+sìÖµ+Z·n�-[67‹ Ь <%øÅŸƒ�¦~‚·Ü‚¦×4VçО›«¬¦·nÛ¡øÖ¦;ÇŽÅܹshÍèài¯“““UŸÔ×…?BàþÁ}Šû„ˆ±*j¾@IDATB@! „€B@! „€B@! „ÀÕC p `íø’·ÐMK y”Mä*Bþå/gÍŠ-6Uæõm[¶j¥Jûvútðô¸za%gÙ²ž5P»ÐÚº?üø“>X¹«V«†•«Ö`íÚ5JyY¢DI4nÜÕª{Ö@úá§ŸÉârÏ£ví:`å)+K5yíõ70lØMJùÈiÛÒ|ÙlÍYµj5-Šßž×ëmÓ¦-víÚ‰ãÇ�SýÊ©6p¾,¼p°zrX�¥#+ÐG�¾�ʨZ¤"Ýl±àþûÇû-ìÌy�¸m$Ú´m‹Õ«V�§mnÒ¤)šy×=æð`2iÒ jMâ'¿€É/¾ì‹²båjlÚ¸¡aa”OÅI äs½~ã&Ìû}ž²øf>IIIZ°oKŠ÷û¨ž¬ ÕËO³f£nÝz>¯-[)>!¡¡J¡½nÃ&U'¶Þ~åµ×TŸˆ‰ŽVñYiÍ,ëÒ— ,Áò}ûí¤ÏT%è-™Uúáz¶¡}‡0™Ì*ïjÔ4á¸\žfu[PŸëÖ­;¶í؉uÔçØœÝnÞ¢%¸¾,…µ‰ïóþX€%Kƒ×uæ´­Z·! öU(å]›ú� ã•Åöm#GiU“½B@! „€B@! „€B@! „ÀUB p `íø’7�ô|fÏʿšÉdòMI¬5$˜åjÇŽ�´`¥(ceY0 #Å%[Òê­iµxR òÁz©BŠW½4oÑ‚x-|^eÊ”ñ¹ƒ9X¹¬)˜Ã9­6Ýr`˜vÌ ÉÁC†h‡…îyšë^ôL1±fÍZàíB…­W§Mûý®ï‹ÛoÏ›zšæ¼$u欪ïÑcG•õsq*ÏÖ¼-N’$îåZ¯â6ž•Ê—#ßâ¶Câ ! „€B@! „€B@! „€B@' -ɸXE3רQÃ<�fVþüóÏñÈ#´Ì-í£¢¢0$¨ñ©Æ¿m~i_uÄq9`«ë©ŸN»œª$uB@üóÒÿþ™/þùFI‰B@! „À%#�ëôe•å²)wX¶Ç/Çíð…‰£x,¹ndçºT"»ÝìŸ8Çè|1G6Ϲ‰³yò²¹í~¹8á„Û­{ÌÒ…{ϹËí‚EïïÍ!Ä»ò‘A¿’ÓÓŽbÊÌË+4;Ï߯Å80x?Ôg^Æ\“_JƒËs®§­nOÿÔ"8á‚Ùæ©¤ƒúª-7W]ÿ6gëäÉ%Ó•›�Û@/�:^äcÌñœ·,W6²ò·Óœã„!7àÜR:+ù³dPº‹n›ÃaC.�×,] —¤ÁË+“Êrdeå+ÎbóÔ;‡ÚhJÖµ�–îÒÄ’•£9}û0oÕM6�E¶á жù3Ó2Ív#—êf§1ÅdËÏH‹WÐ^kW6�óð¬¼1J‹oÉ¡óÐW´°÷Þ>å­³�Š…º6³7fš©GxÅ{>ùHëû\¯`}BKRØ>”º1wE§Û c@ÓLYfä:²Á}.DϾ° Â8m¦+ ¶²i¯Dõq�“˰f{®ál·ÿ5ÁטÃĪ& Œ¢ 9O±DÓd÷ï7E¥Õ³µ1- ß)»Po¿Î ¸GeR{¢uã«Ýnõï'^üÚ’åßv.×l÷œõtññޱZ}®š½·?›ìžÎçÊÈ?N…x‡³ÖoÜFðX¬‰‹Óx™MçÙ•×_¬Yyq´¸ºw¹ri¬÷ð7yÇ|*!陡{¨I»åfÃHuw«ë4ðt55~ç†kW­nļ·»‘Æ :Œ¶Ó˜ªkG`ÝLÈF�»‘L·'óêWvºŸZ¨¿ezÇÝ;,¹VoÄ#Ñ-h¢~êÎÍ@¶Ómpy*ãvÚi\#~¹°¹¬4¸iŒôôEW*Çáû˜gsS]�´e:Œ§üMt^ø¾L—6åí-Ú{;V÷kòÓîßn;iA¼÷4§�ó£*�ŸƒÚÁgÞå}>0R^šÛàôœ?£wïæô¶,8\©pŒjlTÑOŽ÷y‘�³,YtœƒToŸ²s[3ŒHŠpÂê¤g!§‡S2ŸWê#9´la4Õ%×å¹7Øœ¡0Ðóˆ&9Î�¼±Kó”½W,M'«YÕ�Ý»w£J•**/5ûÆo`òäÉ4h�R/\¸0xÌÛüÒÁ‹_! „€ÿïåjÀ|PûÇäÿ½:R! „€Bàr#ί=¯;‡ÄöAìÚÈŽ¶"'x诪@R~¥Òåք˱>)]­ˆˆi‡ä­ÝѺ148‘ììG/m 0’=UÎnK/W/²ö±úÊ= ÃS›Âtò &¯H/\uŠ<³ §Ç#ôð}ˆoÁ³d•R¼oÃ震“qï– H¯bÃ+*øUâ|ǒ踿 ÎÖŽÅÞ“÷Á\šê›ÙZë&J1RÉ’Œ6s�"µYžXîŸÞ/³ 88;ÄŠè÷¡^íL¸Mô?¥’.U†ä¶Bè¢ý¨ë® œÏÌ £6fv¯„ˆE[°¤Öˆ‰ ÈFb�Ó.¯®á¤Ô1¤ažZ°•JÆ«êZ)»´‚ûD(\åS©lJ«‰# -¡h=ç2êG åzÿ´çûšH ë__Õ7§9BïEMµ#ñ"¯j[êÀÚˆ™»;:t†ët”opn;)$tu4¸2Q-Ä„ ?­ANÓèµR«¼g¶·¥ÏÞ�sá(Ik£íªí °ð‹þtL8Tö°D<±…êª)X($©Y :�¯Ž³"qþ^˜J“¢%§•ííCÇmH§þw LÇà‰}Ôÿt3îe´ˆ€%jRSŒpDd쫳§…ÿºI›RÅjF»ßN ½QX¾ó–Ö1”ØÓ •âN ÍÕÛæá™Í`Yw�£:çxµ'ބ纖B§ I8Ø´¢Oß ”&­K-©–ƼHHYÅš„vs�#£A$Z­+Fùž�Ü,ƈ~ÈÌ �+žò×±qY2Ð)¼%bæ¬@Z£p4_UÌü $o„¸«~sø)çâéšÉlI›§ .s&z™Z!báv´Œ ü�‘2J“+vu®†Ø“Ía*I×}]tYW ö,”0Ûp÷ƲH«Ÿ�'³\`˜É7ÒÞÕ4 ß¥áæì°®9€‡NQ¾^e¶ª#]ϹåËÁxø<Ž…Þ‹¨jÉp­0ic 5ÕbHÁ„Ý5a+�–¯_¥^н§îEÍtOd%vJñ?^Põ¸œ"�T»l F;ê;à¨\ ½6y„Zµ“ÛÑ=à`e$7U÷�¨¦Ipñõs²ŸŠb»&ÏÞpmÁèõ46x%u �®í¨è½›‡k „þ ´l^�Æjêsñ•`Î1 Á¹H:Yq¨’nE�³t>f F]ó™qp— uBF4Üñ{a³®ÇËé�P³�£~/í)”Îsj…lüÖøWl0tÁýt­UÞ¶Š™½mµ¡bè”ÄÎ|¬¿åA„çEbµt¼Ü£1ÚE–@nâh8C鞟�3Ñܳm-Þj0 ‡I1kà/8¼ÊR¤:$"dëZ LfÄÝA;7®OÈT×ã¹¾#1íh"¢Üh]ʆÏO‡¡ ݇ÇítPŸMÄÇ1÷ã.c&,ûò®ÇJs€®¥Ü)ãB)�ÍÞ�BrÓŒ°ÆPºT#�³nØÓéƒÚ»HaËg²!}€c1ÀEÊW—ƒn‹¤Ñö4D€tÐ0Ò½ÖEuçQ�Õæìo`?ÎC ã˫ݴ:íÄÞìAH4GÛ„³iãBqÜ%hüª÷\©½‘h,ƒªvìHë{D*�ClN<¶dÜ�:1)8Mi*–$|µ¥°¤(¿ûPß�¤üËšÓá ¥JÕš†”Ô»èÒ³ÁfkŠÓÙ&ÊØ ’|WºWÁ­)ýƒD/! . šNV³.ªR¼déœ9sйsgüôÓO*z§N�Ô>%%ïž“/ú�Äx¡Zæ|‰ÅC! „€B@! „ÀÕH Ô¿Q®ðPzAî5©±æ){ücÉQQ¬ôz>±x^TºB½ç…^„fEË”^,{^õÒ ÷pzaá=gZ¸™^ <–Y!F Ï{§Læsthðœx+ò+8"ŒÞ0£'½É@qÂòêêŠr!œó$‹ «ÖW´r/bb Z�…‹+ Ï¹Müzš$”êFštO˜ÅŠP«'½›ßbëêŠpzD®°µ÷$Èûu…{¸YÌ.8ÃüYp]T;i>9+3�Pª·; N^£*ª1  H^ø!�?½„Pß 3EÂIÊ^½¸,&D#ô^~îpƒþÄë‚H!Àâ¤ëÝHç&ÿò"ùü’„xû�‘ÚïŽÌë¦Xóžû-¹¦�Ÿ)r‹+njW¸‘´÷t޵¼ôyX¨>�}EÔím3‡¹Ã¨Î,Ù?‚Ûm2ÁB}ßD %Ôß5ñô}ªõ³`õÒâ¶'u¤ f6ùúµ[“� }N »Ð=÷%üq„W\ZߢëÆMJV?¡ë�Ç 3µÝh¦0¾ž.BøÜðuÍb 6^Hž¡Þ~êmƒ7�VW(]cZ-Ì{=ÃÂÕ˜Bc™KžilàñŒÇ`“fª« ÷+m,�±W¥„éÚl Ejt¸îÀ]ÀLçÒ’×Wœž~jòŽÛ'ß³ƒæQÄž ‹éRß ¡q·ŢÎ�ÁL}ǯïq%¼åóòŽVºNC=ÇnúX†Å¬ïª”§‹º‡ÑÛ÷l%HQë½¶Âèšp¢UšÀw8iKY¼y½cx(]Ý0jò^Oº±Á“�~½×W$M×I÷%tÑ$LKKfs˜j/‡)–<ëÅ{ýš©ß†²35™7ßÞ[/#íYÑkð¦1-;öWÂáÞ"XÙ«Ä[5篋ÇaÚ-Öb¥ñŽf ¡8&ºç“}5©üÁ–ÛhB˜;‡îOyc ÷—Õóü`¤©"¬Þ±€ót‡æÝ¯,ôq Çwzû¥™fF0Ó±>?)È�[«o�0ñBàò! éd÷ÕpäÈ‘8|ø0Ê—/�‰'âå—_¦ñÒ3Ø%%%¡gÏžÁ“ÒŒ ¢ŽF|…€B@! „@¡v�ڌ雿.4Ž˜••„ãI´CÙ ! þOþòYÓjs ^|Oýò1p‘S”^|©’R! „€B@!puÐ,÷µš¿l¼uëVìß¿×]w�/ê¨Q£0`Àß±Ÿƒ>2:Þ/yüBä@! „€B@üƒhͧI‹ž+~�.žfÌ;U¡Þ]üœŠ�âlæyl;›ª4-£Ù;~+‰YNgžÁÆS[´ Ù !ð/&0kÓRì<¾¿øri¬ÓŒ”ôn]Nó÷l¤kó,NtA~΢êðÇž pñ˜*"„€B ˜^\òMÍ®­[ŒÄ´­’ø™¾5”¨B@! þg�kkÇe¼jÕ*L™2³gÏÆÔ©S•›�7lØ€;v`þüù%¥)ìi‘q! „€B@!ðOðÍ@Ô}»>ú|Ù—¬Ìl¸ÞCxzÉ$´þ¨-lÙ)Øtl nüvº~Ö öü¦ªÆqÇϹ-¦´Ra élV^†q¿= Âõîm'6`èô¡èøÉµxwå[4¦oÿõš¼ß ƒ¿‚“ɇ�cKUå�þq”ªËkË^Vñ8í¥Õ{+ßVåï=³ 7͸IÅû|ý'~¨Ò3Ï©²4O.“ã�˜u'®§:¼ó×›´ÜavŸß«¢ÌÛý+ºÞC•½úðrå÷Ò’Éàzp{¹ü³©Ç´ìd/„ÀL`ÎÖ¸öíñHxr ؽ‡Ö¥½íÛWÐïÓgðö¢™}�=é÷ÏÑúµ»qÿ÷oÁ–•‰e¤Ä½á£'pãÔ§QgÒ,ÜIkç‘tûøq;2Ÿ[yxN'†û’J7næ›Ê¸È:�Âø•ùߨ:ôžò’R“ÀùÜ?û´xu¬ª‡Oñ¬/LÜB@!ð¯'0yñ$õìÚðÝÆ8|~�šç‰EÿEKz^yh)ÓNâ®YcÕsï›+^S¼‚=÷:s3Q÷ƒf*\ÿLŸœ~Ì�à{fçÁž¥ƒýŸ 2“! „€—�À5€µã‚ª™™™‰sçÎåÛ222��� ÞÌî ø:8xbñB@! „€Gàçá?©„¬¤]sb=Þîñ V[‹ÕcW’…›7̆uw,Elh šOíˆmµ{ã,)Z?í÷>b+£×½q$qÚWë¬6ÎLïîóÝ ü1ügÔ-{ \¹YØp|-¶œÞ†Mw¯Å¼½¿á¿K_Teæ8rðÉõïÓ2}&Tz«îøZWh�?.F7*ó‹-ßâ¯Q 0`æÍx§ç+¨^¢:Ú}vºWïêk¸Óíª›&'ÓO¡V™†x¸ÍýhS¡%®«Õ Ë,BjNšRvO\ø,Vß¾YdÑâ“NØÿÀ¤çf WÍîÜè&¼¾üüqàOÜÚt”–¥ì…€¸B ômÔ¼±â÷žßÅÂqoâ¡ÎƒÐ¦r]t«ß߬™‡ÓéÉXýð<ÿÛg˜·g="h�¸Jq¥ðî ñXdÞ[1]ëµÄ‚û^÷Qл}žä0Ó:�Sn¼%"¢1ôËI˜¹e)†¶èVh¦¯[€­T¿Õãߥõ)ZK�ó™ØuÊ—,‹ž<‚Ã玡JéŠú¢Ä-„€BOt~JmS×LÁŒ?á±Nñîº�°ð–_‹1?ß�^5ºãÃ~àZúÐñ¶ÆÃ |îÝ5~‡"ª¦|áÐŒžçßìó–çMúp4سt°ÿ*Ç×’3$„€Bà²#¸ö¯v\PE›5k†¶mÛ"<<,xÛ.$?‰#„ÀåM`ÈW“`¦OƵï´¢ãJ£Y÷¾výXü<òLêY°åÿé$úÆ;ƒ—Þ4còäï¼ë”®„¢ê�]g2hŒB@!PŽ\´™Ö­Ë·ÄÍ MYƒ>vßênõL¿öŽ%èS“¾À &ôÜ®}©=Ós´J1q6+o¦y–Oü„€BàJ" ­ù[”対MÝ»wLj#ðÖ[oÁIËõØívZMÈ¡�ÔmôÌñ4L<…€B@! „À%'p&ó,J‡—¢iNÃq4õ¸Êß@Ö·ì¿çôVRZ8Ñ¥jG|ºéKe)0{÷e¹¬"«hjç§?¯‚|nRض*ß/-}I­%¼hß4õ\7LÙð)6�–¾€Áuƒ+cTF¤¬@V¾/ÑšÁ}kö$Kº4¦)�§®ýPYü¸s:Wíä«NlhœZß—×-þ–ê¬I”5ki-â3)G5/4£)¡ÿ<´\'Ž[*<^M�ç‹ ! ®*G“Ï¢F|yL:íkWTHÖÝVâö©Û Ó7.ÁŽ3G°åÔAì8{Ä/Ð1rú«8FVÂ,zw`¼Í§`Õþ-x{ÙÏèY»ŠªC/²8~gÙ,µö0¯œ’\|†Ú’�IëLÑv.…>¨q8qðLÞøX9B@�«›@-a’ë´£Bt9H:äkl z6^~t%22ÏÓ3u_|°~*ŽÐó0Ï s>+ÑOïpÑÔÎݾꧼ|Ïôtt-Éò=ëósöLZš¥8ÏÒi!¸œ°e§àj¾R s½;UnGn+¾0ŸmùZ)tÙÊ�eä5· -7«O¬#ë… ž¸¤\ÞLë/:¼ ¼þð¬¡ß©¸×Vn¯âðAýRuÑ8¡‘ò—! ®lŸÝô°Z‡×A_i�iÝK5fdóHÏÉÂjZß·fÙ*øaäÓøm×ú0dÊDÆ¡­»Û®J}·dx ú7l«ÜóîyK•ós;l6h\n²4¾Ÿ¯›�Ťž;f"#£PTêU¨�¯†?†¶.ÃRT‡Ñ˜v[óëhÆ|“*«WÝ–4ÞÆâSZ¯xÉ}Xqx;¾Zÿ'ÉjxâÜi*Žü! „À¿�@xx |Ðû µæoㄆèT‰ž‹I&wy¿íŸ�£iÇ0ºùÜCÛ´Í_áPÊaÄÒóy°ç^~æÖÖÖ?ÓßÙò.ÜÒp˜J¯2/àY:Øÿ ü1¶œt¬8¶ _mýIdIü¸w‰•—ü! „€ø  YþJBBf̘�Ž;âÉ'Ÿ,*:Ùþá¿ÈOÑI$†B@! „€øß˜,x¸ãcùòØpxÓdhãáàM“ûڎל¬SÜú@½²MðfŸ&y~ôéÎV÷øŽõuâõ~µ59çwO›q¾¸ì¨_Kmì¾®V/µ±»zó±´NñK¤DÖ„ã³”ˆ*‹IÝ^мվY7hÒ„”ã"B@\®©\ïѦ—¸˜8¼Ôßó¡ûWO¨ìw¬ùñ>*2Ã[õdgPyþϯáôN =²M Ö¦·Úô‘/¤ *ÖÄ;'ø’Ý×9o*Ï!¤ fy¢ç_x·ú­•{Æèg}~âB@��Àçw&а|3¼I›&í«uošë¹—^^÷®ÛOmZú`ÏÒÁþO˜}Ë,•Dÿœ>cØ -Ù ! „€ø! Yþî ªLÿþýQ²¤gé0}¤{ÿý÷£sçÎ0�%ñú`Ö´ÌEÄ”`! „€B@! „€Bà2"ðß¾w\Fµ‘ª! „€B@! „@a×ÖŽ JÓ°aC¤¥¥aöìÙX½z5Ê—/�Aƒ�-‚ Z^­(q¡é%P! „€B@! „€B@! „€B@!  '¸°v\Pª½{÷¢Zµj˜9s&¾ûî;lÚ´ ¼&ð¡C‡ Jâñ7˜`tºœ…G’P! „€B@! „€B@! „€B@! „€¸hÚ¬Ì�û‚2üþûïÕ´Ïß|ó�R¿ûî»7n~ùå—‚’xýÝYþÿ(³l>îÿ0_€8Š$à´ç-Ae±åxâÛ=<�9Þc›±È| Œ�–—ÖÄç,ÓîÕ‘7š)'—ÂuçR;Å9i¼9¸œ”·7Œ'RSùgç•gHÎk›“ã^±äx+UØ7û¹Nÿ’œÞÈvŒ™^¦CWWdyêgÌÖ…ër1få10ºý w;ò"º\ùÛérS—Žk^t�+°¾�á…kç�N€! ^~ɼ}Šýìv³_p�ÚyÖµ\wunÙáÌë/|èpP^6µÑÄüÒƒ·U�®Àô&˜œØrƒ§á2 ·®]ª.‘U¿s3oo›9+Õrúù«ëÖéñw:‰õ-¤æõ÷KÑ÷�NŒ.gP6¾>çrÃä|`(ôРŸ13¯ÿúÊ ¶93²ð^­í…õ½€¤~‡”^‰Ö÷ü/ðÀæí°Þk80•ÑFãšÇ¨]Ï|~-6ϘbÐ_£Þ±A¥ Ì�޹&Jç+ èïA’]Y^þ× ÷Ç@Q×WnÞ€¡î!ºH¦Ü8©o8‰­;„΃W ޼ñTó+rÏ÷A'ŒöìvøÎ ÷=»6®�Û{]‚Æcn¶o|28œ¡©Aíúá›ò4Òé7SúêéYž*P¼P§§®¤)?£w\7{ïcælO›�¹þí°iý™SÑXiÓî{éÞëÊD}ÆLå¸(�¥4vf¸Í°eø³µRöÙZZÊÊHÉ|í¥c—ƒ<,tQšò˜º‰qHzL”·™Úm&ö,\”ÚSž7ùÙýÇ31à!€Î�âhvSž4ºilá±Áè´ÃêÎRçîJAHnMŸê‰gug«óÁa{.rÝF8¼×’ÃàB–·˲Œ¡~íÊ¥2�TÏ“tã,”ØøÈ–‰,³EóÊ·§»9r(}¦vêóÅ! ®4šåoྠvDEE¡qãÆ*˜­»vízAÊ_N@O¯yƒNAˆ¿B@�«‰@v ;ì)ô�DZü/„®¦vJ[„€B@�‹#`h‘÷¢‘sHiYß§:V·R¶…^\ÆÿòTåÂÒBï8‡a²ã�_š�k¶#79™ �Ò!®µÇ×PÃó²7»rœá¡Ht„!ëLÞóžÑìF9C&†Ú—Ãv&É�#àÎö”eˆ÷¼)OîÑ&Rœî‰ªîw¶ÊÐ èÜ^mà&åÊ�Íó‘™YÉupð¼´5T÷¼$OÐ ®D'Fµ÷K_܃J¦4t)u–-IÈhÔ™1žw7~‹C�±¹ñ±È._ ‰k©�9þm¬–ˆä>íPÿ| "ÖìBr¹6Hb6G=ñ ¥½umÓP)1÷ÆÕQJQ­ŽávÄEç Îâ¹H«~-’Ë’�‚¦4Žòrp-ìÇÝØUEK¦öåM©@y'ÒµúZ(>U=·L dWJ@âjªon^}ýq`¢¼Ê—ä��OÊ„zË ¹^g¸-j#ÕÑ«Ð3ÆzÞ’'êû)ä;¨Ž�N tÍa¤7h»V×0OÛRšÕU×ûñ#ñpè>øˆÉ@N·–ÄÂŽ!;æ!3»!RZØáNôöné>¸�ÜÿNž‹$åiÞ;·xkÊFÛÐhã¤wí„äR€»Ê`SŒ—ý �à<íÄ�€>Æ}4¬„Ó×WŠÀ©‚ áV¶ò¥‘Y£"Îä„#—ÿOÒI¹Ðt8ú¶'…‹ý�ÌAZ�ÖHnFêŒÍžuç|} õ‰c.싪¬K}aÎØ�d”!6Í–.GJUÿ>g¡bܤ4I¾±3§‘¯ÝE•` SPé*}):wõV.¢k—ʨíô]¿+•Aç,¹w[¤íµ"5½Ž/[k¬1!6Üpìw¤ÕjŽäª”î|ñû°¹¤·_Ò8ÂJôƒ%ÛÁYŒóÏ2‡ºP™HilÏ'©Ïé°•�GfÕr8»"9‰yç0<ÜŽÒåR‘Y½ºì; ÓöTdÔi„ ­ßÇ{ǃ¶�hì³awtèuÜeC3йäaX¶§ ¹Ñ5p§¬¨òA»Â†Zž{‡#6 É][ ç0p6`l+M×oŽ÷Ü É]Žìó È©XÉ÷g nõv„eÄâ‰Ê0Û¼ëUC��HÄ-^Oz˪D£d±ˆ8šÎ�95éMoô¥3‘r?³êR�f�Ý®Ú�à¢y=Ýf+ Ž\°RßeµÀšœŠˆ�{ñÝ(²"q´Œ•θ‘:"±¿oÆ ýUiÌL‚óÄ9uŸ¸õØ„®<ˆä^÷õkRƒÝ¡VÌ.Ýo·MGlXn /�ÇV/vgâ—¶ i6#Ô…›kgãd�.¸Í”®êêÈXsâ_½]–ŽHî×A_·Œ²-ãíot1ÒK·TÌÀÙeራìÄÀ”\é#–äv�U»/vÃU�ñê+|ù9cãÑð$]°†Xàd"]¸4.jö¼7Z’wŸìÝó Àqô:lvyÀö\—*¦§j¤=&ü¡‹^ŒÔïY™¿1©­ê 7¡2rr2‘ä {bѦB2–e‘1Hî2¶tê/î3¨�y®£t®¢�Þ¤rh JÊ>†K „–>'�¿Ìz­à¢�oΧA˜©$bËœÄR.7!%ròuC‘’t®�Ptжàƒ./N_3q !pÐ,÷GSècNÝ@÷w” y ! „€¸Ì8"é OïˎˬjR! „€Bà2%À ‘ÿ�€Ëb„Õâ‚‹^&›Myï"œtl åì¥í\IY¢) †àåèŸ �Å–>-×�ÅJ/†­´±Døçïñ$+$Örÿ�â6Ò kw˜¤ÇÎâä6’•™· S˜¸�ÌÓ'V�"Hß>ƒ.˜ã²b\/æp75‘ü¨ .Ê�Ì |Áîм¸Nf n*ÏIé}âÍÛB/ìIω/Þ8¸m¬d±r½¼âæ2ôu É syÛ¯Åå½3Ä« ³ø×UÇ’ûP`]µ¼ át~YA(^fZÿ3Xó¸qTNbõÔ�ÿ!µÀ =vëÚ夺ŠËBì½JìÀ°�½Ü´>c R'­ï[¢¨Í¬0)Dœ¡ùëUHt_�Ì%\àùtÐuæö–ëÒÎ�/eÑ]/šèû�þúå2´ó¦ÅÕöÌ$4„Î¥ÖvÝõ£Å¹�½Sw»¨ÿö� Éè»þ|ñY·E}ÏI ;“·�iáfê×Úùe?7�oN}>žd*º3"z^ìé2{ι;\Qžú~ø¼°¸ƒô3¾¾X´8J§èí[|O3h×'eaÖõ9çE<:¸¬¡¾>¯ ¥íüºBÂ飕X:QÊ_g%0+YrãbÔØÍn2¼å»LtMp{û‰vqs:ížN�[ÛhÌsæ ”²aÔØpºw»y§{÷ˆºGY©�n³‰”–yc×]/Ψ¼�Œ}ÓhòÜç T7΃ûªÅËŽÛk$ÿÀqØÍ_k˜¼yzÓûÊã“¢mš§v¬í5ަרMùÄÇÅWh8ÝçÃI ˜�&!:w�Ì(ÂLí"fÅBm²Ðq$ù³X½C*û³%`qà|KÓGÚ¸Êþ…½*/ùBàÊ!¸°v|É[@¿53ãKž¹d(„€B@! þ¶ß„뾺 –&g&âÐùýW" ! .�´ŒdL™õÜÿ”Õ›3'"‡§—B@! „€B@�‹&@ŸÏ¨´> `ïqA&&&bñâÅ~Á¹¹¹X»v-²³ ÿ�¾)ÉûRÅ/9B@! „€ÿ�Ù›+Q‹+vZ§ÉáòLÏ•c·ÑÌ^ž‡èâæó¿Æ?Ÿq»Ní,0}ûΦŸ¡¶n)0®!põØwl;æ­žQì†9hŒszÇ8½»¸Ùiý¼µ»ü_7�5;R]<ÖyÅM+ñ…€B@hvžÜ†Ÿ7ÿžÈ÷ »w½ZýÿZ¾²B@!p¥ÐŒr÷ÕŸ•¿‹-ò9rµjÕÂwÜ�&Mš`çÎÞGÑ F-/"„€B@! þ s·ÎBßw:£ÎSåÁî�'·bü·wbä´¡xñêÅÎ+¿?‡n¯·Á£ß�CZv –îYˆ›>¾·|r#Z¾PªúÖ‚—}/�†}܇äkÂæ£ë1jÚô~»>Xü¦R¿·èutx¹)F|:˜ÒTepy÷|=RåÏù²b¹Ë«-‘�›¥òœ²ä-ü±c®ªïíŸ Sñ¾X9Õ¯¼óégUYš'—ؾ”¬dì?»WEù}Û/ð~wÕÖ•û—)¿ÁSú¨vsÙÜÞÿ/¥¶ÖÙ !P<GNïØWº£óøòxï§gÔ5<áÝ�xù»ñè7©Ìæ¬ü£^ìŒßŒÇw =37?×ON‰~ëáÓ9/«xŸÐþw¯âXïž¿öÜþòuj[³c‘*g˾U*ÍŒ…bñÆ_À ã�yŸl„“;úq÷ë}0ù«qölKLxÇ3Æp<.›ódÿSç�úâkVD?ýÉíª~/|yŸXk`d/„€8xnŸzÖåçþóÜo¥çÛ‰?=ˆ;>÷Ü¿_ÿ�ú߀ŸËwŸÞô¹œ økÿRLüñU–þ€ —! „€—)í=Oྠê®_¿-Z´ðOž�úƒ7VŒNüñAÌ÷'îºö~4­ÜÝë÷Æwk¾[É.xh^þý¿X¼çO„YÂQ!®"^¼ñ-l:²ÓV|„ëêõÄ#=ŸòUñç{çûÜzÇ­Ÿ·c~Fà M�•›©Ò³åÁâGÖbÁŽßðÆüñü ¯ÀFr¯ yŸ–‚2¡ù¤:˜Ðí1ªS ,Û·=ê÷Á÷ë¾Å¬ûàöÏoÆó^AÕ’ÕqÃ{סSí®¾â\nÎeœóŸI=…zåùµ�•Ùi¶4ØìÙ˜üÛ³˜{ÿ"d“»÷[�°á?{‘Hé_ú>*•¨‚?è…çö¢FéÚ¾<Å!„ÀåM rBML}t¾RÀv{° î¼~"þsÛ¬Üñ'ò"ŽžÙ�is_ÆÌç6`Ãîe˜±øCÜ7à9°•îS#h ¢õùú>V·÷} wÝ�7ÆinNÿöOàÛ§W!&ª$l9YX¼ùJŸ«Àdçd(åìk¿Ç¾ãÛ1ã¿ëq*ñ(ž™6F…'§ŸSå”/Uc_ë…#§÷"Ó–�¶ º£O››©n¯`õÎ?1 ãh?Ð&£�ßòb#KâñoÅ‚õ?¡oÛá~qä@! „€ž@µR5ÁÏèl±Ûð™*x°ÛD¼1tŠz¾¶ß‹jY”7éÃË¥�n 9mù‡x²ÏsAŸË;ÖêÞXôÿèË·B@�+�€6+³f\T�m6’’’T´S§NáÇĶmÛÔqݺuý¬ƒýò¢wTfMËì B@! „€Bào �–�Š™ô¥ÿŽ[‘NŠÐ@Ùzb3vžÚ®¬q'B Yw®Ý %#âéËE3â"J"Ók•˜6ð˜-r£B£•ò—혿ãwô»æF•W—:Ýñè÷7ÖpÎñ¬&+ï(Þ ü°á[T/U•KVQ~¬ ­“P_¹{5ì‡Uû—#!¦œ:.ÎϪ+p-)�£ÃbÕV%¾ºomàR‘¥UVe¢Ë€§¶BàÊ!À–² Öþˆ]G6ÁFkææÚsü*ÏJY¾®Y!›mËÄþ“;”8”Æ °�×böŒA~ ½œþÚ&ý”ò—½BCƒEÃÞcÛ(Þõà¼"B"ý┌öŒ1ñ1<ÆxêOã K‰¨Rô�Jðq'"4Jå×®aw;›Æ¿Bä@! þõxF�_7ÿˆ-´Ô ßsèc'½ì<é¹'Žÿn 2r2•0+€ƒ=—ëÓ‰[! „À•L p à¢ÚÒ©S'Lœ8¼0O=bÄ”-[V%Û¼y3ªW¯^`æC$@! „€B@\bc¿¡,jG·‹ñß�Í—{ùØ `èðV·©°PKÖòLm™•±VsˆRòK:‚²±å•bW‹ÇÊ_V2³e®Ñ`TÞì—Dkö²°.—W�´­ÑL‹Šq•1 éP„PY©¤�æ(ùKMVN7(߸ ä…úG’¢‡ë¯ Ou]"¼¤v({! ®PßÌWYùï6Ë·þ–¯¥cË¡ZÙº?h² 3yǦ|É#)íœw"ÂiÜòºYQ{>õt°è~~±%�ž•êçw©x ¬’PëRe'ù! „ÀUJࣥïàйÛi}„™ÿž˜Sµêâ™ë=÷DC!÷DžÉ'ÖŽÒÑ êZûà*E'ÍB@�«˜€fù¸/¨Éýû÷GéÒ¥1kÖ,Üxã�4h�/j·nÝí;öw¸e ` r$„€B@!ðw8ž| UÉÚõ()l5aë´ÍÇ6€•¸]ëöÀÏ›¾' €]ØNS5ï=³K‹–oÿù_S1oû¯ÊÂô»(ýa¿8!–P4©ÔBMó¼þðjµvpç:×áËUŸbÝ¡•xõ�ÔtÔ~‰tlqܳáõxÑjÊiίn¹†øtM]·{�Zø}�N¾±áqj}_.‹§²ÖDß>ͯ My½|ßU'Ž["21”^D�+›À¹”SH(QY4­rF¶g–ƒ0ãØr—×û­_µöÛ‚ {–ÑZ»G°ið\˜Â�K¦ÒôΞ1Ns7¨Þ›ö® µ�§cÝ®%ØM–Æ q°|Û<òÿ kw/U[ÖíŒYË?¯ ¼`ÃÏ—ê>²*æi«§/úmëwSk§e$ƒ·3IÇÕ´×Oª´š~¹y•Ö*n šºWƒ¾ÊýP�'0¸¹g Êïù�Ë5�Ië_j›ÓåÄG·~�˜°¥TæN¼ð+ƒß¡©�g C­Î¸§ó`Åî æ7©<ùçÖ6·ëÜ£ñßþ/û¦‡ž:â+p¾ëHÉ;›Ö4ã´KTB›jí”5ò;7MÅŒu_+…îíîVùèÛWž5—•Ë>¸X¦¦Ã›6ò;wp‹›a6y&éá)ªã#Kùê"! .#{>ˆäŒDl=°·õ|HM™\¿Z34­Ù‹6Ά‘Öø�þì:µ.ïïkg :<!ÖPôi}³¯q;zÆ 1ýžð­³«¹y-Þ¯Ÿ^©ÊëI‰NÓ2è0JÍJ°iß_¸žÖååuˆëWkŽqŸÃ¯+¿F©Ø²èÙr¨Ê¿o›á0yÇ^÷7.*MkµGRZ³T+Wµ*4Të³›7^_xh—»T^ë¨Ì·Æý¨¦ žý×—Ø}t3¶X¥Òl¥üþOϪ|äG! „À}]DRf")o×à¾.ѳ²×TjŽÖô,À„Ážé3õžíõoz¹¥ÇxßaŸ6ž1†óÓ¤Q�VÊ9kùç8|z¯r_S£-t­6-ïïºá)ßa‡Æ½•ûõûføüÄ!„€ÿnü ø rrr�‘‘�ÈÈH­G�EÏów»i `±þÍ".! „€B@! „€B@! „€B@! „À%& éd5 ࢲ߰aêÔ©ƒ*Uª`Μ9*úÒ¥K±qãÆÂ“L05¿tá9H¨B@! „€B@! „€B@! „€B@F@ÓÉeù«å1{öl¼øâ‹X½z5>üðCå�ššŠ%K–hQ‚ïÝ.²6Èú¿Á鈯B@! „€B@! „€B@! „€Bà' éd÷å…råÊ¡F�HOOWÑÎ�;‡ììì‚’xýi `­�"bJ°B@! „€B@! „€B@! „€B@\Íò7p_PVe˖ŸqãÔ4Ð;vì@Ïž=±~ýzÌ�;· $^̇ƒÄ ¸R,„€W·�¿’²^e­’æ! „€—„€ËFÙ˜ ÌÊâ즃%€¸i+èMƒ1;ˆõq2ѱ+Ì{ì¶“^˜/Ò…8ÜY+ï¼¹lF¿Tn»·FÙ¹7?zÊreeP}óž -†,dÂ}é³\†¼Zåò{’ Î'D9¡òÊ+Ûãyá¿\³êSÌ-„ú—ÁéR‰�6b¥‡?Ugv^�°Ãm7Ãᦗ=ΉÄî©«;+ïÙ×�¥Á‘ »1f*’swdù—�¬¼2ÜN榲Öÿ8Ì68Ý¡È&N‘yÑ)3ÿ¼\ºúêÓävP^LÂH¿vj—Ÿx›¨ütu„‹hñ‹Ê.s6 C–Óˆ¨|¡äP7cN�“(ÅD_”Jêå 7�,MÚj¤ülÔ%¬…Ö_Ëï¹…ÖóB w¹ù\êáBåBýÞá‡_-<§¼P=7ò5Øs©šU›µH¦œ <Ý'ݨK¬M†«0õC¯Ÿâ¦DæáZÖÓ�Un+)Å혰ów$¼V¥ÐZrûþEp%T‡ÖÚÃèúõ”á̦:îZ„Ùæ&Øæ9?JÚÐ "S) ôÞݶõOž!‘°6¦e KÊydnÛŒÏ*¿JÄ¥§— {¨>ë0!g×ç*<ðÜ„Ñ8‘¾<ÓZz”H³ß§\)_<ý¾ó¸2Ϊ´òRïV Òó¿Ž3Ljè=˱̓?ãÚªä­ârиD.r7}AìƒÿXŽ1¢4,õûù¼MYÔwVÍÇ•FѹF[‰¨J%‘]³¬/Ž‘!ŽÄÓ°õöýJ]aH¨ªÂ¹O”ü•úÜÉ"ú>uõW;i]:`àáµ(•ŠŒª¥áQ<Ú÷-ðõ¹�#ïµÁu”üƒ+<ÿ³µ�ø¬ŠGÁôØ–ÙÔo:‘ÞÉè§°r¥�}ïUo}ÜgâWÿ€†"îôÆwиÁÂmÏ=ºÎÄê¸8?Ö:7ÂͪT�„œ6!üŸJQóηßÓÌ…YñfDçfãîý ‘|CG¸SÒ�»w¦Šk0Y`mv›/�Ñ–…˜¿âÕJwÀEJ´ú²cxÕ ®�³üa†v�£ËÂR§�/}È©C8{ð$fxǾ–19h•¦Qî”*×3fú\K¹0V¨ík‰+×€˜í ñ‡±>¶Gxî)íiܨG×—&|q†ä}4¤±�ؾ 9QÑpT®¯¢I!ï²zú¢–öŸØ«ëÔlAø™ó[±¶u‘]¹¬êÃ†Ô ¤„˜ÀSŠéƒ&)5á��Ü&º6ÉÿsÛúX&¢ÛkÁ¾}Ü�‹‘Ú¯\–¼´¾@rYQË b“‰Æ<§°ãgºz;2º·‚=:BEW÷˹‹‘Û¨:}¤cBèº]HÐI¥‹[±Èu"­m ³øòá„Ö¤48¢èúdÅ, $ê^©rôü°’ùÿØ;)Ь�¿�ÍË.°äœ3*Q$™AA1bÄœÎÄy§g:=1{æîL§(ò™"9(ArT2HX6ǯ^M¿ÞžÚé݉Ë.û/�}ýª+¼úUuÍ0oªª8ΣËqD{/ÕûZ ;°•?D÷ ëj¾‹QÎïËùËï�ñŠvÂr:îcž¿¥Íœ¿îÔ™D�Óië žÔbê�DÍÐþGSü¡lJýfå÷éB »÷©9k·nWVŒ‡šªÒÕ¯K¹mšèöf�Ô›þ¬W›Z}1[½±ÄRŽÊ“<ëWÊ:¹åׯC)›wPâ¢U´oH_ª7g¹nïþÞyŸí«Ž!månŠ[²Ã6½¨[#Êè]ú>cß8.xñ%oÓËÏ0�ôt5glݪ~o£>O9^Ó§O§ñãÇÓÞ½{5sæLÚµk�þù®é‡¿´“âJÔdŒ       à%P¢ü ^—MY"qIê[B„Š $”r’õAâüåÌü…ª3ØzrèßQ”$–Öi—­ ©EjE[l²ZmWÚ«ú‹ûb^õ`PUgÐŽÕƒ¥1%ª½Rº'A}é]K­´¢ò�T¥¹�+öŠ©`¡­¾™Ž‰SÎ]Ël¤V_HÇQ’ZõZ›@E¶*¿åü5Ó³S¶¼�$¦ñ*¬˜x¯SŽóÄÄ—rð¨ë’øDª]PÊ1†9Å©—G9جìŽF`»œ!&¡ÔFr<£±Éj§²1µÐëÐæ<1ª[dõY‰#mL‚×!á,×y�jýxAâxÌ:­ì./¤ð¸°œ¿:]�lJTýÒj~–JU}Ê�mfÏK�Õ8 Àåõ�G�»‚ÄDÕ•ªLGÐÎ7Ÿ±Ïã£| Þ’Ôó¢\3«t(>‰)ÛÙé$Á9F}ÊORóCН=’Ç)Õ‚ÍÒ ÐTŒ¹ZQ9ëà1ÃÏT­¢lʉSÏŠ#?·=&!ð0HùZ†è,Vö˜Á9nÉãR°rjyxþsôŸ=Ï:žQâ6–bTZ;_tçrj¯œ[æ{‡G�Ož7êäyÏYd+xÞp§ó—ã…QIb²Ú�!Ö^Ý}8œ¿l�U~ÆÌÀñ…uÕ¶Î�t:9­<‡Ÿ’§VŸÆ”:¹}ʲާ|â ó $ðû¥þ%ˆŸÄ%ÊÁ£V %•�›ó•ÃT´Ìñ~ŠU�©Öö«ÉGÚªuõœ—°£Þá¬/°~H$eH‹.’í¬Å<ÔÿÅÆgNÃùdø¤hn*¡c4§Iã•Ô\w’ o•&Qe£dußù>™@ª9–×”n Y¾|¹v¯[·ÎN’™éý‘Ê¿ÿýoš?¾o^¨Ï<{ €€€€€@õ'p03‡þý¾w5GUnÍŠ ÛiÒŒ%™¸?#›6oÿ3 ´H #P˜G÷|{·.nÙ¶Eê[Í"úhéÿhÍÎe«�€€€€€@M"`žý+ºƒ©S§ÒÈ‘#iîܹöëÑG¥[n¹…¦M›æ–MÅóîàÿ-n�€€€C`õæ�ôéÌ¥ÁdÑi Õv[…Ö™xyj˱Š>»U�¯¶ûù×õn·«LüÞ™´vËNW{>›µŒØIÌa�J+×®p@ J˜öÛdZµCm]l(R[*G«ÊéÃÞ‚±«¨¸�¾Ýð�6åûM3©XÙ³l×o´;+°mÉ‚m:Òƒ€ùBý·B‘ÚÁ²ÀÚž×ùï†#ŸZ  p¤�3]œ{ôÑGÓ Aƒ¨iÓ¦ö«OŸ>tÜqÇQ“&MÜñ¨� Ôž<ð»Â7›¶ýIa2ñ9—ž~ýí²atùƒïP¶:é«ÙËéµ»/¡ÉßÿBï9�ÒÕ9Ow]>œš¨sŒ.¸û êв!ý²úº`Xºù‚!ôüG?Pë¦õéœ!½è’ûÿCOÞrµiVŸØúögsµ ·]t Í]º�†Û…úvkMo>W•W›†*ý…� i?.¥ån¦â8Œ½çMjÓ´-Y½…š5¬Kÿ¹ÿ2zöÃïhã¶½´}ÏAÊTç7þçþË©y£º:½üY¶v+=¯ÊÛ³ÿ�t]5z0½1u}òÝmã׌¤ºêÌ)³7œ{�që ôé¿o¤dµ­×ëSfQÛæ ¨w—VôÜÄïéû«éô�Ýé¶‹†JUÄŽà»^œJoÞ«ÎõSaô__¦Çþr6�zÕSÛ³]1r€Êß’6¨3³8|=÷7zkÚle{ýóš3¨ÿÑíè™fTØ&�@¢Bà‹UÓèÉ9ÏÑjuÆê[£^¢ŽõÚÑeŸ^K SÐ-ý®§[úÿ…þé1úlíWt\ó¾ôÄЇhÁ¶ÅôÔÜç)Nm“»rÏ*ziÄÓ4¤ãpztÖãÔ>½-�ßã"öþ(úϨ—©E�V®ù‹Õ±Ù…94´íI4cÓ�”‘›A3/ÿŠ–ì\J�Ï~†òŠò(« ›žú0ÕOI÷±kùîß”}7ÐÑÍûÐ eÛ²]+hüñóËhöó鯾ר÷öÚA—N½†>;‰~U+‚'Ìz’䤻ÞN§va§Ã€€@Í%É+ÌY¶‘>Ÿµœ¿ùlŸ7Ô\ºh9€€@u% ›Ð¦ºð¡ÿþ´mÛ6�§Xý jÑ¢EÔ¸qcêÝ»wŠù8€²çT� ·A@@@@@97ëӤǮ¥_Þ¿‡Þûj>å)ÇíºðÔ¾ÚùËÛ¿ ŸœfÜ™è¿Ê‘Ëty•îã7�¡ï^¹]Ç1ÊñÕÎ_¾æôìüåüþó•vŽN~â:êÛµ5TNÛ‚BµBN…,åhÎU«…ÿï§e´jÓNšþòmôÑÃWë{ügßÁ,ºñ¼é›o¥œ¼|å$ýS9§óéä>�‰Ë;óøchæ/¥g¨HÆqÿz‡n{ MSŽÜKGô§_×üA+7íÐåœjzvâw~ۧήëÙ¹•½yò÷K¨ÿQméïP§–�hÖ›w¯^øjÎ ©J¯tþS9�%ìÜwˆº¶mJמ}<=|ÃhºþœtÙá››_@O¾û-½uïeôÎãèVå$æH›¤|H�È8£ëhúñªïé§q_ÑÓó^¤N��¦;ÜB¯žñ,Ý2èvú`Ù‡´3sÍ»nŽv ½a†v̶®Û’&_ø½ö›ôžJÃá'Ý£�¿|ýí¸o¨E½ö®ùÛÔmEŸ]<•Îìx±#ø»qßÒ°ö§Ð�[~¦ÜÂ\âûß*gð+#ž¡ &_^Æ®Ó; £÷—ÄUÑË?¦S”Ù-lÏÜ¡ëàûìT>ï“Ëè‘!ÿTç»&Ñè�.¤—•û˱ŸÐøoÿáVâA@j�Hþ[áøž´ó—:ÿÝPÃ�¢¹  GYùkJ·¦}óÍ7´iÓ&}û‰'ž ›o¾™†NóæÍsËbÅ{”@@@@B À[6óvÏ�½ý5åæhÇ®³˜U›wè¹·?3I¯â�e9[yulJR%&ÄQ|¼Ú�Æ%pþÓtS«‡St Îç/¬RÎÙÓt§ø¸Xª•œà“¤�ZEË¡azå)*‡éÞ¸úuKãô õ‡WäÖNI¢£Ú7ÓQl猫h¤r³ƒ—�Ç?.^«ïùkǨã�ÖÞ [÷RË&õ(­V}1{�1øhâ÷#M³BÜ¢zÞòMtB¯ŽT;5‰ÕK£¶MëÙg—×&i$€@tä«U·oÌ…ž�÷²^�kÖ²Xm½T­®½ròôíFå(Þ2['áÂ䉥)õ)3?ÛÌfënù9çoT«!5H®§6÷Š¡Æêš�¿êë8Ó¬ÌË *ðÆKÁguI®˜D…y™´pûê¡V'þ6ý^Önõhq,edí¡?2¶Ñ?¾û'ÝðÅm´B­fÎÈôîXHYH  päˆö¿Ž\rh€€À‘L@VþšÒ­Í«W¯¦ôôt*(( W_}•>þøcâ3€§OŸî–ůþ}'^æòSâ.€€€€øxóÓŸi“Z¥{ÍYƒ•“tµïM¥5©W[­|mH÷^éÝÔãq?zäOµZ7A9ƒÓRiëîzkç†ÊA»ûOå´¨ ÔMK¦ƒY9¤ ìvšrþf¨UÆÅj—�ú°Ì�mÚwÐëœáU¸ÍÔq-ì8µ%óøç&S‹FétÖ‰=u:¶o_F¶vdgdåj.®”s#59‘ö,]-|03×vŽ—“ ·@¢L€WÞÕù º¹ßuj‹åëÊÔÖªN å˜mDW÷¾\ßK‰K¦Ÿÿðnmo&ÎTçë&Æ%R|bí:ð;5®Ýœ‚Éo–§õ"ï�_(Ö÷G4ž„¡Vßþí]t~÷1Ú�ì7¿y^·³iâŠOèïo£ÚIuuÛWÛZÇ*gôSÃQ?¢QŽi�O ’ÿVÈÎÍ×»ÿð�:�ÿn¨ñ�@@ Ú0ÏÝ­!=zô ÿþ÷¿4sæLêÕ«µnÝš.\¨Tøþû®Lþ’"¬.    ؽ/C9Ck«/crµÓ”3±“r¥Z¹»vË.:¦S úmãš³|#ý±k?-\¹ÅµÜ÷Ô9ÁßÎ[©ïßñì$ÚªÒ÷ìÜ’æÿ¶™¦þø+ÍQgÿ®Ø°];_¿_¸†ü¶‰æ,Û ÓV[ÂMüf!-Råþór×:¹Á«’{vjIÏ©³‚—¬þ�¸®Õªßÿ}5O—ÿ´:ow„ZÍëx•ððþÝè•Ofª³Š;ëd§öëJ/OúQç}êO4\­j–P'5™ÖoÝ£ëúhúb‰¦ZÊé¼tíÚ.‘Ìc¶âÀ6qÚzuRˆó#€^¿üƒ:¨­š7(�ãÒRõ9¿ìÄ=C�íË+mÛ½Š–î\N¿©U²ná¥EoÐÔÕŸéÛã¦]O[l*¿³\^9¼\�5üèÏOÒI­�׫…�vqÚË{\L/.|�.`p€áøV醾WÑM_Ž'ŠK !mO ·~y—¶ª•ÀÓV®ë °($8‚ Dòß ¿¨ÏåO½?CÓ’7ÌÌ¡{Raa­ûÝ»ûÄ6õCRŽG�ªJÀ<Xt7{G�Mƒ ¢ÌÌLzì±Çt²Ž;ÒØ±cݲxãcbÉST\T~"Ü?n8÷DÚw(›¯ú�nT×ññ±tLÇt\÷¶ô¥:ç6Öã¡é/ÝFÛ”3wêÌ_©ŽÚ™¬c†ô²K»ä´cõ5Ÿ¹{Ž?ñ‘kôÀìLýê¹›iµ:ßw®r"³sù¢áýô*µ+6Ó¹§ô¡öÍPå°½óòÓhÒwKôÊáÑ'yWÞž3¤·Þ¶™+à­›ëשEýÔ™¼Í¦ë:;·nDÝÔy»¼ª7K� ̯õÒKwŽU¶&ëí­k%Åëí ýËÙÚ=¸GºnÌñ®íà‚/9­ýóš‘z›kÖÇ�HC�ëªË»ûŠÓ©w—VÔ²q=:VqâUÏÏŒ?Ÿ>ž¡ºj«ë+ÕYÉÎ;¥·^åðËšßµ½œVx0 >Gùõ»/ÕiýµIßÀ�J!ðöhµ ×Ê)TX\H×ö§ë×óÊÈ?Dó¶-¤�ºÓäóß§/ÖCßmžI�SQ»ô64¨e�–·r>»ËH}}ç‰ÿ°Ïþêò/õÀå?Z•ß³I�¿ŸÚƹKƒŽú:»0‡^]üµ®Ó’¦œÿ?ç´‹#ŽiÜ�ºÔï¨Ïf½(?Ë~ñ‰Q—÷¸ˆ£iÜ1é•É'µ¬W$_ÛïêT¿íUN߯ü—Ú¦·¦×ÿGÍSîÛúë‚ð@@ Æˆä¿9Ζ7ð�K§üð‹^üø»ßh®M_D+Öo«1ŒÑP�êG@ve6¥[KRRRèÆo¤gžy†:wö.4àUÁ¼¸üPBqµMSQœÀåƒÂ]“oÁöàµgšÑtË…Cì8vºþå‚“m�/®5ÈÖo¾ 4­é¸h\¿6ýãŠÓ1D÷\yº�Î ¯¶•·róZ娕 NçSUyØËaâ·‹hƒZ…ËáØnmhXÿ®tåèR9þèÍõ‹¯9Ä&x\ÛÑ©ucâ—ÞJúô�ÝõKâÚ·h@üâ0´_ýòÞ몳½_9‘%HZæa¶ÿTå\– m@ úø,ÜÔËê¦6¦Ç†?nGµkØÕGçÇ¡–r_Ôë2}íö§¼üG7ïcgë߯;ïm?ôßr=0ô_ö=¾pÚõ�Zµûü‚Wé…ÓŸ²Ó<ôÓãT¨¶ ãp…Zü—�·êëkŽ»AËS;{·ôgå¶ÁÕqüç•–_   ¢ýoçgè7ï½TW;þâ¡R=$€€TIæÙ¿¢GÜØ’bŠ+Q@@@@@ ¦¸pXßšÚt´@à%0T�í;´}ù_‚_¤V)_ÄN[õ£p ¦ÃXâ!A@@@@@Â' gþÊ àðKt)!ÆCqÞÊJ\R @@@@@@@ ZÐNÝRÇ®_ÛÕã÷"A@@@@@¢@@Îü�ÚÊ_‡ÍüƒÏA—              a²ò×”®F‡ŸüF+Ê�À ðÊPyž+´”ì„”Wh% W°då¯)ƒ-'�ô88JH            Q NßC‡ÑÎ�;);;›Š‹‹£P“·H�ÇC)))Ô¤IJKKƒ#8j¤} 6ÏÝ7U4õC‚8ï2cœœ(@@@@@@@@@@@@‚"ÀàŒŒ Ú´iÕ«W�4h@ì¤�V`çrff&mܸ‘Ú¶mKµk×ÖNàhÕ‡r½Ì3€E�OÔ¼ËѰe‚€€€@9<%Ñû`\Nµ¸  p„H(H¨%YPº�(¿”‘ú.‹‚]»P½Ø’ÒzüæP•gÆ&S‘Kº¸¢xÕ›1äÉ÷ýa|NI€¨JãŠã(¶À·…1YÁ}&ÉUÛïÙÁדŸ¯eIa®²µÀNÊ1……”ëI¤’ÇeIA©ÄvÈTö;C®oS¨¤ [ßöÇ:¦ �2bk9³ëë8‹gIaſ䕹hD¡³M<�\BI¾×Ƹ"ß¶pr�²136Å%'·+¶8–Jò³(6;×N—SìÛ‡Y…¾º$´ó}“e|.Í)òÍŸ]èès)Ì�%^»yœš!&/W÷»ŸmØmÞwêžÜ|ŧЎ*t<'<žâóÊï;cŸJÚå–¹PóC±*ŸŸË´‚²ôU™üõ'eWÌÍS¶È2&8#œ 8žŸ©,5fØÆb¾W’Ÿ©ŸÀ燢â²Ï—“m”ËqþB~®cÜ8V�ŪñÅã–Š |æ¶Y5§ð#“é2Îä¥ÂŠuÌ)9%eŸ!Ó.c(›·«…žO©ÚÎx?Ïßàyã`\ZÐm‰ÉSóë²KòÔP í)ö?·Çä©÷=ÇØ¬ªXµ�lœj†ÇÏû]Ù÷@•0Ï÷}\·�ÛšUÁä•£˜T”¦ª‚‚]`ço¡zÿÙ±c‡vþ²36šÎ_6ˆËçzØÙÌõrý²-q…#AÈ̳E¹@׌ê_9YÙ¹%Åå|ˆvÍ‹ Õ‚À¯½BãÆ�«¶ÂH›À’*ù-Ñ.&¦·ú¢»÷Ë2;Òºà/²bâÝ¿2ÓC¯úÒø„ Ó›PÜzÿ}^õ[ A@7�âöÍÉs(›ö ìJ1qI®æì;KŸìöÿ¥¾k¦v£Er!�háuÊÕtå̘µ*‡²5¯0ûLÏè°–R—þL´¯>Q½TÚ?¤ŸO¾7×Õ¦‹Û¢äز_0—(ÇGچݿ|ƒòøí?gˆ�wÝî<ú5»�jémC>;ªâ|=£ìܬ·xÑ»‰âciÿèíü?ìL¦u‡Ê:íìÆÅ€Ô<êШ@ûeSb• §¨˜JbK?ürí/f«oêb(gÀє۴�]ÂûSix³jŸ§òÄ;ñâb|ÛËŸ}kÿ¶�â¶)Ï“j똓uY\ÈîÌbš¾§6�m“¥Š÷Í'•Ô�5•b(Ʃɴÿäc%š¾Þ–BmS ©UB•$$j×S²²?áσTë‡ÅÊ»KY'ö¢üzµ½yTñ¯¯·®íRÜ/†¦çPótå T‚ÂÕ2úÀ™3ýÿfy�MëÑþA=í[ß([)Û%dRa|1ÕdG9ñ{·Sê’…Di”uRoÊoPWçÍ8”OŸî®Oç*.¸_Ê„’"Jܵ•R–-SùkQÎñ=(·±â¤ÂŸqôÕÞ$ÛV9–ýpý}ßZµ¶]™"�=UÞ.³fè¾*iÑ�ô;ʾÍcŒmê�šA%‰I”_C©ª]+¶î m[;ÙéÌ‹xåßS<�b~ߥÆ} eœ>€ŠR¼ó]žrJüï�úte‡ ;[¬r%ùþ8F�ý…kˆ¶í-3ö¿ÚV‹þÈ.ßAZK=�ü\J(<�A…ªŽ¤¤ÒyW÷';§›7 ýý�–¤Äý¹%»|'eëZ…tJ“ÊSLô˜áï=�?²P¥ñ�)ê-TÏï¶=”uBÊoäí7®èÝ itfË,J�WÏ‹‘�ï§Îúœ&Ç�åË CŸV©ãœ‰Z6¤ýÇ•¶ãàþ8úhoÅÿ=¶~.u©]Hõ¥|A\œîc¶=yûJ^«æ®I”3X�»&^û ³·7×£«;–ö¡?#KŸQeíGi^[6ï/¡…©4ZÍ}ì /Rèx\qàzXAT�ÛÐ_‘Õ*nÀQYÔú›ïT£T“hÿƒ}ìçqÖZÍm3)FÍm2–|RùWÔ—“å99mq’ú¡\Éq!2ò¨/‡ãƒ[qdפ¾°2ƒò—º†˜8ççß„Åq ”à)¦Då¨â—éüåBcâõ—³ºåèt†´x?ÎBgã:6¹D9©‹m'£Óùë“ÔÏw8 /vþr0�¿ÇŸ}‹”s-ÁבÇ÷Jbã)Q•áæüå4äQe'¨6ŒÅ‘šœ¯mç6ø³æR·¶OJ¿JRŠÕÊ—^žóWgV_¶s(v8Y—|‰ÊÉÃ×b3ß+ e­*RNÕxÅ…�¬~�¿œ9Æêw?N�â„5†ÔZQ?ÎßÒz¼R‹Sœã•ˆÇÛ¯\�8é**1N�çbËák:7yÜ›Átþò}ûÅâˆ0Æ~™1`¨ôãù`ço™ÀžjŠ“K�¬Kòµ[¨­Ê�SLì´~œI<Ï+v:¨8sõÆûÎ ’†ìl(2ú¯H�í@Bœ2�Çlb’Çîcû=Êzæ�åðóT0žQIjXó˜â¾tŽ+]¯'„öeP%&–îõ3/¦XNïD56™…=–0¯ª8ÙTvþrð÷ëåü)Iò�s̤Á89/;�R+ÖvtŠ�ÕÁùËf—g';9H›øÚL/÷œÎ_NÇÎ_ÌDKk~FY~Îê+“)ˆˆ=‡2h¹Ÿzƒ(IA ZX>ãÚ¾Æ÷Ëî@R¨Îý”/ rƒ[)Hù¡ÚHÙH  Ps lVÞCýom¹pî4ºûæ~ÄŽ` ¿w?=zߢ–‘+~ýNm�™¯�Ê÷ï*s  PÝ <þøãº Ñ’Õ�Ouµ_Vþš2òí)¡8Þß@@@@@ ‚Š‹è‰o¦Ñ”_P½Z©ôþ¸›hÌëOÓ�ãÐç!^öÖsôÌ9—ê ÿùÅ'ôõÊ¥”™›K·œ|šŽ;ë¥ÇhµZñÛ®A#úüÆ¿û5lËîtõû¯Óòm¿Ó 'œJÿ}!=8m"�qt/êÛ®3½>ójQ·ÕRÛuþ{Æj+D�r0o£/¼‚†vïE˶l ‡¿šJ;2й½�£.�›ÑŒÕ+hÙ¶'i…rȾ¤Ò�¢ÒqàÈg¿ö4=vÖX:ªe;Rß¶Ñ„¯¦ÐçË—P¿6íéñ³/¢ª<®g£rVOºú6úëä÷©CÃÆ4wã:jY¯>M¹Aµ£¨¨L>¿�C$a~ûáSš5ñYÚ»e-�}çËT¯E;úäák¨VzCpÎõ4ð¼¿ÐïGµÅçîÍ«iäíOS—�§ÑÇŸIcîz…Rë7¡.ïGwLZ©žÑ|×ü%êßü…y9Ô®ÏI´qñ�”›•AW¾ð5íX³”f}ð4ä©ó³iø��PJít»vnø�œ{µèÖ—Vÿü%íÚ¸‚N¼Ìÿœt„uš  PvÔ~úñ£´~ÍjÖ¢ ]rÕãôÖË7Óí÷|¤s=pljôÀS3iÚ…4eâ#´U­üeço¿AgÓÎíëéÍnÔŽÛSN»šÎ¿ìA�§UÛ£iÁœ©4į̀@½7mÿC�3m……s>¥/§>GÛ·­¥«ÿò;ð,¹eË¢¢BúêÓçiÖ÷ïSã&íé’kž FMÚÒ¼YŸÐôÏ_Õéξðn:ª×;.@@ *à•¿7n¤hɪÜö#Ù6ù1¯)#ßæuÄ‹Ÿs0"_J�šC`₟iÙÖ-4ïïÑ—7ÝEõÒjÓÎŒƒêð'ï™r{3Q±º¾÷³�©kÓæ´þá—èßç^búTåYýÐó”¦Î\°y½ï¼hݨ)MÿOÚùÄëôÊOÓ©¤ €ädS¾rÎrÈT+s ò)OÅ·®×€¦\½ÅMôþüYúþÈ—Ÿ ûÏ8‡~úûºñøa:î˜æ­è“ëÆëtïYéøÆ9o‹®íGºJ9^ç|ü5íx ¾ð5þY:þâñôë·Ò¡}»é¦ÿΣZuëÓúù3ô/ê4nE—<ú1�wß›´ô›5¥k^šNõ[v Ä”TíüåH·üu›´¦Ëþ=�:<]M?ÅtõË3¨C¿¡´ù—Ÿ©0?—ê6mMW?ÿ �ù×géã./cW§þÃTÙÞ/ó—Íø˜Úõ=IÛ€?  5›ÀGjunÓæ�i³sé*å�åϵvÛPöïÛ¡¯Ÿ~ø|:÷âûèÙ·Ö(çïפYº÷Ñoéåw7Ów_¿Ijg Ž?ŸæÌœ¨¯Wüòõê7B_óvøþóÉ螇¿¦¯§½hÇ;/ØÙüû¦åôÈó è„¡—ÒÔ‰�*góúð¿wkÇô}�Ï Ž]û;³à@ª4�h­ü•r«tã�`ãÌ3€E�F“áŽU”     P£ ,ú}�=vQ\¼zÅ‘ZÂç—Ç¢-éÜžÇé{iIÉvšùëWÑ¿þo"ý¶s+eªÕ·~ƒZeÌgöþãÓ(›½E~“qdÃÔ4mCý”4ÊÌË£ƒ‡RíädêÞ²­Î§V sh¤œ¹l«¤Ó‘êOßVíè«¥g°-Ví[¦V_ñßhúªåô“²—CÇFM(ÑÑŽÆiut|Ó:u)WmÑç–O'Â8‚ äf¤9“^¦¹êÅ+pͰmͯ´kýrå„G~O›–zÏãNUÎ`�šCRj×§üÜ,3›­»å¯U§ÅÆÆê•ÆÉuêÿ½~3õÑ9‘vïÚLsšd;Œùfvf}ûÙ+ôÍg/QNvÙ÷QNóËÂ/é¸ÁcÔû^õè=Œ–-™Nl^N}û�¢Tõ>ÊÁÍV}@@ ŠˆÖÙ¿Rnkn�1Ç<XôˆˆñP\‘Ú†�(&âe£@¨©Øá¹[9Y+ ¼zv¿:[·15°“þªVüŽÿä=zeìUª ÿ_pqâç¾û‚ÖíÞIãO9ƒ>[¾ØÎÈEmõE]FŽ:;”W$°#нj¥ðiÏ?BΛIcûŸH­Ò;w¯x²®.Y9�^¿ºÂªýå[°Éÿ ç C¨F&Þ)±3µÿ9×Ñ䇯-cyÝÆ-(­^Cêsæ8}/>1™¶,�[&Gìß¹…ê4h®]íÛ¾Q¯&¿¿B‹¬/ß=ñ >·Rj¯þò…»èè“Çè/ð}@¨‘ê5hI{©v݆®íOPŸ7ùŒÞbõ£E�ãÇ�_úíܱžN?ëí´u0ð„ è§oß¡=Ê Ü¸©÷‡Š|ÿÅ'/¥>Ç�¤Sϸž^¶ìû(§IN©­¶™þ“/)??‡ê«÷Ê:uÓ�}¥ç ë›ø Õ„oÿÌ!Z²š`8âÌ”]™Mù†–¨÷_u€€€€€@äœÖ­=÷Ã×4sõ2úü×ùt@m—ÌçùNQ×ß(gíZu~/‡Óº÷ '§¦Ïãýbù/:Ž·VfÇpŠZñû~ï—X|ƒ·�^²i­~­ß¾•¶<@-ÓëÓ!µrB;sUš–éõèó¿Ð‚ «éû5¿éòüý‰‰�Wg÷v G¿œ¬Ë›ñ›·niuœúÒîã«n¥ûÔ–Õ\÷ˆ£zÒ‡‹æÐ µBù×m[ÔÙÂ[]³:o„šÏY®A :8¸ëuîo{Ú¿}‹m~¢Z‘¿uÕ"íÐíÔ8-›1I�±»Šv¬[N»7yWÕÛ‰“¾ŽöïØ¬WMýwü(}'˜üŽ¢hûš_hëÊE4óÝ'¨m¯ãõja§]œ¶çiÓü)¯ÑQCÎqfÅ5€€@ &лß4ùѺUóéçï? Ziuõù¼¬Ïœþ®&¯>˶ïØWoÙ¼vå\Ú¸n‘Žß¿ÕkЂr²Q¶ÚaÂz+'ïä'Pߣ�ÑôçÞ?¨QÓvÚ1ìsáÓûTúþ›7‰ëšòáÃjÛ賩}çciõÊÙ4çGµ³ÎÒió†ÒmYq   •FÀ<ûWôˆ ~ðï‰æþÒ7‚€€€€@5 À[+óy»“—̧Í„zî¼Ë釵+i·: øo§žIµ’’è–!#踶ÕÙ¸³iX·ch`»NtZ·ž4HÉ÷üDcû¤6j»Ö†µÒhPûÎ4I•ǯYVÑ]§Ž¢½ê‹³9×Ò�ÃGQ‚ÚîîÚA§ÿ¼ó§u«hÜ€©sã¦Ô®~c¨òrh ¶‚>»g_}ýÑU·PÝ”ú`áâ³{ÝÒÝvÊé:}m唞ríxš½q uj¦Î ¾úvúRm ýƒr47J­£ó³�.ëÅZ«=NïÞS¥©í7_kµêñ„]$$‘ÆÜó­øa «m/ûœy…nc¯—¨­•3i늅ԤÃQ4ö¡ÿÑÚ¹ßÐÆÅ?ªmšQ½fm¨åÑtÚµt·ãÏÔ×W«s„ù `^�{Ǥ•:®¢ü�Ûu§¦zè´ÍÕvÏ ZuÔ×…ê$ §½Eu›´¢±>ÐqN»8¢Iûî*}'}>°N€?  5žÀ°3¯§A'ªÕºß•:{¯¿í šõý{”¦¶[6òFÍè¦;Þ¦Œƒ{hå²™tòð«´ãw䘿RfÆŸ´~Í|9f¼Úö9žZ·;†Z´êJuë5¦K®zB�ÌÛKÇÐigޤ˹ö–×hÁì)ÄÛGŸ4Ìû>zü�Kô–Ñ�º †�ÛP›ö=銛^Ðçwïq2�1æ6½ô„gæÐï›WЪå?QRrZ�ï;8¼Ä'++€£fML,ÅEmé¨Y�‚A@@@@ ê8ªe;zþ¢v¶¡›¥Ð ]cërqí‰ÃåÒ–;}Œ}-�žs©\ÚòÉóÆÙ×|‘ª¶o�0æŸ8V:4k¡ãÒ”øâ'ëëXåô½áäúZþøKw׈så6Óº½~q§}üÜËì{'7)—t~¿ãíkùÚ6ifßljZvëGür†´úMèŒ[Ÿ°£µëæ£ó ŽãP«nê3òr}íö§¼ü-ºyøÁyÛõ>A±úç/©Õ1iø ùé´kñçïмɯÐÈ[ŸòI@@ fàcú­_B¢W¿Ä/g¨•–NŽ›àŒÒ×—^ëû¾Ò©›÷O|óŒsn·ÓŸ=ön}Í+yùå ÃGy�ÃÎ:Û¶ïEmoèåLFéõ›úµÁ'¨$â“�ÚÊ_iGI1Åy½Ìêì/�A€ÏöíØoh¹mí}ú¥ÔKm퉋+7n‚€€€€D†À¦M›"SP¥´mÛ6€THI²ò×”‘¬Ã[V‰8€#_4J¨šqêÆÄzÔœ¼±<€€€€€@e8öXߢYçÞ½{£Y<ÊöC@VþšÒOÒ0£b(®°°PfAÈ             *8eC%W=ò™g‹ ëãbc㨨¨(e£L� ¬\¹’/^Läñ„¿+Oqq1%$$PïÞ½©[·nAX‚¤‘$`ž,z$ëÐeŨÀ%ªÓ@@@@@@@@@@@@@/vþ.\¸�š6mJ|Norr2É™±¡XÆÎ߬¬,Ú¼y³.—Ë€8’áç‘~4eø%—-!NWRRRöb@@@@@@@@@@@@@*�ÀÒ¥K©eË–Ô¥K½j7666,0Ÿ7ËNäÚµkÓòåˉˇ¸ÒºÓ§"óì_Ñ}ED)¡8ÿ’(@@@à0ˆ)*!O^Îa¶Õƒ€T{y7!–²©ˆRN_“憾M]QArP¨b$u~à}'YJeh?Œ�ÍÉóQä»»ZfA¾ŠO,->RWF=\l~±M ÜZ<ù¹*±ÿ#Àò**£¸Ð›×`ìígß¶ûáçÈ1NKYêÙ©å“4lŲ͓ËìKC–‹õ©uRÿ÷ *â"Õ¸ì®hßH1®²X}ÎÍVýç‡ ‡ÍÈ#¬âÜ\ïˆIIøràëZ4§ ÀóýN‰?˜IuR+¬(»ÈC‹V œÌ榭© N=îyóKúE”_”M ±;×=ÊÑZ_¾¥°D�#ßôûV«œjÅɉêGdùT”Tú9ò@V%Å–P ïo±êGª *N(õeäfÐÜ_Ìi`Ÿ,ªçîlˆ),¢’¸Xm¼G9Øœuq$;9ËËïÛj¥1«2UÞÔrê–¼ì@.N(û~ÏNàd#?;Æ‹WÎkÖgývˆ²5ãËrC¢êÖ�=3)Áã¿ïüeŽUÎߢ¤²ã¡<>žvdƪqG<ŠR¼mÌQÏyr¬{ŸHýÌ%¦$–ŠãÉÙ7åÕÉy³ò ©VbYç�”Ë’ýŒ £Ó.ç}v§ÅûÚ˜­Ær à pßð¸â¶s(ïYñW\¬ª«D�/ç�¿ïÛC«Ö¶ó—ÜŽëÑ1—šÔ/ýÁ†Ûû›9v¸€=™hÉŠ–vYþ.ŽWã&%)ðqãQ@a å•×ÿ%ê��q™S$¿È‚œbŠO.ûï.ÿ¡=´|uIêWRsCªÑǜГ—­áø2ã®XÙæ À6'ÛX5§YóWyí ‹ó(ÎS:_J|u’yêG‰ ŮϷÅßÜV�Úèfkaa!åääPZZš[;Þ“›MÅI¿ÛpH[¹›â–ì°SukD½›Úú‘tÌóÆ>:Þ¢yݺuÔ®];š8q" :Tås{Ùqnà:òóóu=?üð]xá…v‘7n¤Ž;R­Zµ"R—]0.|¤§§ÓÖ­[‰Ç†ó5}út?~|DóÃ_ÜFÂöÏ>@@@ ú€ó·úö,�ª@ ç/Û™ÂN¡ØCUÁä#Ö†@œ¿ÜøŠœ¿œÆÍùË÷ØÙÇ,§ó—ãÙùh`ÇŸÓh>IÇŽ¤Šœ·âüå<þêª(¿ÔeK‡s>篷޲Î_Ž7�¿'Î_óšõ˜Ÿ�DåTÆù«ëòãüåøòøÇ'ÚÎ?qþrž@œ¿œŽ�â<¼×¥?(¯NN[‘ó—Ó°ó—ƒÓ.oŒ÷¯éüåØ@�¿œ–ûÉéø,ïYáôf(RŽfãÑLªîG¡–H>'I_^ÿêüå²ü99¾¼òù¾·qTœ˜âwÜâüå²�lÅùËñ�ØUÝ�¿ÜNvþrp{¶øž¿¹�ãkR€ó·&õ6ÚZÕx<íˆeǯ¿×ÓO?í7Þ_Z3ŽÊ\>Âá! +Myk<ÊŒ       P% üøí;ôÇ–ßüÚvàÏ�´iÃ/>÷îßM›7üê'JA^.}ðŸhuÎ�iãºÅr @@@@@  `¡8 M³¾ýö[ºîºë(33Ó¼U®^^™åfÄ͈�3M± ¤ 5~�êA€·m¾ä’KhÆ ÕÃ`X© ˜g‹î†‡�ü»wïv}:ä²3UIV»AE<€€€€€€D’;jß~åVº÷¶ôòSWP†Z­ûÌÃØUùiºó¦ÞôôCçÑî�›t²y³>¡‡îª_+~ùÞ_VÄ�€€€€F|nðõ×_O¼"¡z(!ïQ3ö `Kw³þµ×^£N8¡Ì«_¿~Ô­[7zðÁýg�‰%OQq‘ÿ›ˆˆ��ÔêܦÍ;Ó„gçÒUy‰ŠKJ(ãÀn»üýûvèë§>ŸÎ½ø>zö­5ÔoÐפYº÷Ñoéåw7Ów_¿I¼�3‡ÇŸOsfNÔ×¼º·W¿úšÿ;ð,úç“?Ð=M_O{ÑŽw^°³ù÷MËé‘çÐ C/¥©¥�Û7Їÿ½›n¿ç#ºïñÔ±kg\ƒ€€€€T!O>ù$½üòËUÈ"˜âF@ve6¥[ú¿þõ¯´zõjýZ¹r%½ÿþûtþùçSRRuïÞ�† â’µ„ÏzŽu¹‰h�HX¿z 8á<]\bRŠßb³í×ñm;ôÖg~%%§j�WêΙù}ôÎ}Êù›Cù:>½~3Š‹O¤Ý»6ÓÜŸ&Ùc¾™�™Aß~ö }óÙK”“�¡Ó›~Yø%7x ÅÆÆQ�ÞÃhÙ’éôÇæåÔ·ÿ(J­]_'w³Õ, :€€€€€Àá!0uêTbga°çkkn­öÊ_õc`¢—GdÙ²e4aÂêÙ³'ÝtÓMT·n]úüóÏiæÌ™4bDé€}Ê()&O‰úƒ       ]õ´¤Œ ÿçùJÍ Ê1\X˜OÅÆn]_ú­Zþ�4ü ªß°…$×rà ÐOß¾C{”¸qÓ¶ö½Ÿ¼T;vO=ãz;μHN©­ÎþSGçççPýÍ©NÝÆt`_é¹Âfè     U�; yKhœ \õúF,’3e°Ä»É'žxB¯òݵk}øá‡4þ|?~ÆC©¬ü”¸        �ÞýΠÉÿ{ˆÖ­šO?ÿÕJ«KÛ·­ÕúÌéÞ³~ãÕjÞöûê-›×®œK×-ÒUîß¿ƒê5hA9Y‡(;û��½�I“?œ@}Œö‰ÿsïÔ¨i;íö¹áPŽé}*}ÿÍ›ÄuMùðaµmôÙÔ¾ó±´zålšóãDúmé�´y¨ªØQÈ+�q.pÕì!ó àŠ¬äížÿþ÷¿Óœ9sèÞ{ï¥÷Þ{�þüÓûÞŠòz(¦¢$¸       .�ag^OƒNT«u¿+uö^Û4ëû÷(Mm·˜W8pÀ-+Åñ?@@@@@@@¢K FmÃÕwàhý’šzõAür†ZiétḠÎ(}}éµOùÄuê6ÀÖÏ8çvûúì±wëk^ÉË/gqö­ZuÖÙ¶}/j{C/g2J¯ßÔ¯ >‰ €€€€€6iiitç�wê•¡kÖ¬¡W_}•.½ôÒÃf*®˜€œùkJ·œÓ§O§Ù³gûÜ>ï¼óèûï¿§›o¾™Æ�GO=åûïDI‡3€$€€€€€€€€€€€€T}Ï<ó uéÒ…n¸ázå•WèÝwߥ�Rûöí«¾ñ5ÔB Bð@IDAT9–×^\Á"ÝäädbG¿ÆŒ££Ž9æó–W/)¡8o%%þ @@@@@@@@@@@@@ Ê˜0auìØ‘rrrè²Ë.£iÓ¦ÑöíÛµ#ØmEh•1¾bž,º’Áƒ¿8ìÞ½›êÕ«Gqqjsç‚G¼Í¤E�ÃD€�¿'�tåççk 233é_ÿú—¾^ºt)M™2å0Y†j+"`¯ü�ñÏ+º[¾ÂÂBzâ‰'¨OŸ>Ô­[7jÒ¤ =ùä“TTTä–ÅŠ�!Oqqq‰p@@@@@@@@@@@@@àp`ç/¯üu^ _JÙòˆ^#¥+>,îÆçws¼ƒ¿ûû«ÌCåo=2Îe½&JáIÞ2®1ÞKGoÏœ��]q®x»é””½Ýôa¨¾jTé2ßËs’t¼¿òÙÎ<þ9ðø$¬]»VŸùk¦0`õïßߌ.ÕcbÉg™Ôaqþ2PG`€:ˆ°t‰Iª²œùøZëV¼èZª™Ì©³-Îxу’zvtØ`è\«É^¥²þ•r[uþ“(׺Öù?«?´4t¶E§ GrÅÎüZ+-×R‹�¶Y&Úm5uI�´8sƒ8½¼¸L¹¶¥Š´¯9­ä±â¥Œ°¤.µ,oom\r%ïP°+ä¶ë ÂÒ%>$©Êræãk­[ñ¢kiðg[œñ¢‡%9³ &oS÷¦Šò_‹³Ô¢¹°ƒ7—%åj–׺j¾Ïÿ9úÞÔ%](’ópà2�ÁWsÞ‰àµY‰¡;Û̵†¤«2�ùøZëV¼èþ¤Ôiòf3u¡H‹³äç:8˜ü½±QþëÂ[†‚Ø– †?Sp<š‹Ÿñ/ñIƒ·p–6E™pùÅWáÉäZ·�uƒ·©Ä×1/ùM_†¿IUàoÛ`õƒ›.ñI‹³°à<:ŸÁ_Ç—áoô‘*$ :ËKgð÷Ò÷ö½\Wš´8K}Ò6ËÄðÛÊc1 þl—³_DGr^2ïxµ²ºÄGUFƒ¿ÁÛ�¿æj= rÍmõÇ[æ!¹Žä¼Êò÷ÆGõ¯Á›Ù8·�CXÒào³µâE÷'¥îHòÎÒ&Ý@n£Ùx¹MéÂ[LÃ’Áðg Žg€›®u+^ô°¤Õ8i—uØB%ðžÜl¹ÖmgÝâjÇ:sÑiÑ\±3¿ÖJ˵ÔÃ"¤m–‰v[M]Ò$-ÎÜ N//.S®m©"íkÇ\'qRFXÒj —é Ü÷•Œ*m›¬xÑÃ’ª,g~¾Öº/º–nü­xæ£ó†!…±”cëG ƒ77KÚª;žSg:ÎàÍcÓY†¤ EræxWfF?˜•zDÚèÂ[úÁdîÔ€Ö#È[8K۲ċ^)Ò…7³á 6†%ƒàï­µý­þzüò{›ÕnºŽ·Æ¹�&cÀL\&ç¢ëÈrþð^^íë|½öÚk”™™YN.®H�ùÌ^fù¥…«tx¨�FÉ/5ʯ¥‚»'÷Ûo¿M矾þ•�å·½àâ UædçÐO(iŒw™W¤ ŸaËhÍ7á,ý zXÒ�¿/¬B’á,ý zزþ\¾Ô±iÓ¦�šJ¦¶mÛÚÙ¤~–Îþ’æünê’.(YIüÅ&s~7uI¨Næx7u;�*ØÉ™ëÝ­ÎSN9…øå ¹¹¹ôûï¿;£ü\«- ¥3ù.áWjkKïëDœÞŠݯ,gX¸h!uéÒ…ÒÒÒtÝ�>ú(�1B;?H Rê5œSÿ׿þE-[¶$Ó©*yYnذ�Î9çúõ×_�Ñúú»ï¾£† R�=ÊÜ{ååWèᇦÔÔTjÖ¬½úê«Ô©S'êÕ«Ýxã�ôõ×_ÛmâÌþ8çççÓ /¼@o¼ñÕ«W�öíÛG#Gޤ§žzJ{öù°o.Ÿ½úìPþûßÿN'Ÿ|2=òÈ#šßÍ7ßlÛõÐCQ»víèâ‹/¶Tp¯¼âk+ë�;w¶ÓÂ[¸:ÇW.ñ¶!•t!«`ÑÅFn[XÁï2¯H™2þÃ’)[úEô�¤Ñ|›�/zز’ø çÈÎ7ø|Ãý/cÀé” iÌ…˜É|Vyˆ–Îþ¡*m’iÀM—øP¥Xg¶AâC•nã]æ!¹Ùe—éÅ¥Ó§O§aÆћo¾IC‡Õ>Cn“¤c;ÄF»­ÇÅÈmÛ¶Ñž={ÊÜåÝŠ9ž�¶mÛ¶Ì}ŽðÄÆÆÚ�ÈF8ƒóË:g¼¿ëO?ý”ÆŽKìðlÞ¼9]}õÕ”‘‘AS¦LÑQÉÃNØ[o½•þñ�ÐÆ�é‚ .ÐÛ2Ëý7ßð‚éÛ·/M›6Mƒa'õ£�<ªWªr<×ÅŽO^ Úi§éºØ¡É×|P5i Ëysçщ'žHqqq:þþûî§qãÆi-ç{ì±ÇtüöíÛíU³¼¯ö<@�•sšÓLš4ɧLfÃeϘ1ƒÎ;ï<:æ˜c(!!�nºé&ípæ¼|Ÿ;ù§Ÿ~Ò6ñƒËväääøØÈí{öÙgu^^ý+¡U«VriKÞžš9Àaݺuv| N[y%´ÓV;¿ïði3§qr XWe:óñµÖ­xÑýI©Cx—ê¾eJ|@ÒñÚÎ`®£ÒƒQ¥m“/zXÒâÌmãräÅÍ•k[ZãZt;�/zXÒâÌu8ƒ¯æ¼Åk£RÛ&+^ôp$çÕùU™ríO×÷\ùGn¼Ë8×6Dm EÛ6¼­!âå¦ ’tI‹3×ÏéåÅeʵ- Þl†}ÏŸ¬KY!I«1RŽ.Lý‘~½R¤·)vU¶MV¼èaIU–3?_kÝŠ]Kƒ?æŒ=,É™UÐ6x/½ºÕ/ލè_Fƒ¿Á››%mÕ,Ï@]µØÇ´nõ‹èáHÎËÁï o¢Hÿ5+1tn+‡°¤*™_óãr­xÑýI©›Ùø”ŽM\±#¿VX·âE¯é5Å®JÚ(¦ˆ–´8s%\޼¸¹¶%Sp¦‘Éy8˜ãÝŠÞD‘þkVbèi£ oéaëOj.Ü?o63dÛ¸bG~­°nÅ‹^)Ò…·˜ryžWAçW—ÎrøÚ/º–LÁñ „¯³né þB„Ÿ©JF•nü%>$©êpæãk­[ñ¢k©8uæáŒ=,É™Uàr�áˆáoðæa%mu²•8'ƒÊ¼6yûöF”,1+1ta–tá-ý`ö�SçVkÝzJuß>äcgï½÷^½cïÒ¥Ké£�>Òþ7Iï#¹bì6YºŽôó‡wæÅ´æ‹�ͼ uâĉ~r©(åxŽãÕ¢N4WºjÕ*bg¨¿À[ 7lÐ�›kçãt‡ÒÖÏ?ÿœø [>k—·3敪¼=ñ=÷ÜCéééÚyÛ¿:묳è矦gžy†Ž:ê(»ªÎ]:ÓM¹I;VyyôèÑ£5¬™?ÍÔ«lÙYzýõ×ë­–ù¼]^æb^6G‹wкªÀïl'ÛnNŠAÛï´�ËÛ­xÑÖ$)GìŒ4á­Àè~=,©ŠÒÅYýç´½ºðwÚ,×,Ãçï¼G’¿ØkŽw¢Ü/á{<ãÝ®öó é–ÑïFce\›¼ÕÄγžßÙfI�T¶c¾1@‹ª'Q¼’ô˜°ââ[Q¸ò¼Ë¸–Èx–xу–Vv>C—ú–®ü#7Þe^á¶p†¬yÅ.ÃÐm^ª.!ë.¼ÃŸßÙ(mš÷>ßheú©’øËübÎ÷’T-Ò�•1ÞÍ÷[Ç(üÒ9vT.á&cJôp¥dŽwS—tK—ñIþb‹É›Ñ…9û¸ò›´Æ»À°¤Œg“7>ßø¾_¶ðÇ»*Éñ̺ñ—ø�¤ªÀÿçËðÇ»Óvf"óŠÄ‹´´ °óºð[ꉸ´”�øšŸ/•­NÞ2¯p[¸ü°‚c¬èr Ýæ…Ï7z,:y›ó}HýàÂ;ìñnö—Ëx¯ó >߸Ž-|¾ñN[•5Þ�Ž�ùŸo¼™ý~Q­çß÷[érna˜ï¶>ŸÍ¸\áö|oð–y]Êg)×ҞʖR?Kyn´T¶ãó�Ko8>O8�ØÇÇ>Ñûï¿_ûC}8šs ¡»Ô@W]u•~¹Ý?óÌ3Ýnù?˜”ìM6—šŸ~úéz+w66ÞøŒÝ:µëP�:ut#ß{ï=]ÎðáÃé‹/¾ÐK Ù[ýàƒ;9ð¹¶|-eñ bÎß§Oâs{9žÏßå•Â|.ëã.§� ¼–�Àœ–CŸÞ}hî¼¹vY:RýY³f ]sÍ5>ñ:tÐÛ)ó9½£F�ÒŽY^¹Ì�ë`'+ƒ•ý¹Ù9Ìñür>»W¯¢vÄ3?Žç´ìôå°]9ª™;\%HYì0gܼ4o÷Ì�·”æÕºN=õTÊÎÎÖgóyÉ�GÇûüñ5OÛ \/¶rz®›ãÙV^í,º_Yæ÷}à}ê?ŠÑfÕ+„sÈÒe¼ë瀫rþ#ÀÐýò4'Њtƒ¿4."ÿ€‘‘¾¸õXÒÅYñ!s·úQŠ—rÄTü…·î2Õ/¢‡%«<!ä%csŠÞ¢(©‹ç?Žñ/œ#É_ª4Ç»©KºÊ–n¼e’ûËòæ£qn¼Ãâ_åÇ»/ája³ç‰ZºòWõVÂx—q-´¥µ/úa“Ö¼"õ ßH�w)Þ.W*b þÆxÎ&§•z-@¤R|¾•# þö¸´âEYZ­�üÒ(|¾±Á-mNâ/…kÞ¢(©‹ç?ø|ã¥bðŽÔ|/ÈMþÏ}-ÿ~å~pÓ%> iÌ÷R¿Ìû¢6iq–ú¹M:ˆ�…*ñùFÐú—.ü¥‚–o)^Êñ1‚oFz¾1Æ»Œs|¾Q° Þ¦Î}$œB–éoéÑ›”i`�K+^ô�¥Y®è Ûà/¼%^ô°d•çïÛÂY3P¬DUZ¸UqF=|£øKýæx7uIWÙR¸ žRÝËKô€¥U�¤—ö˜ü9žÓàó�5.E„ú¹Fò¹ògàêé÷Wóûû(Ì7o–�Ÿƒ ¢ºuë–ɪ'AG¬è,ÙAÚ±cG}—õZ©µhÎÜ9vjI+¶­[)ºvíª·›v®~å4’ŽÐ|(³è,Ùù-v:ã¹HÖ¹óX6iÒ„öï߯k’xÞþ™Wÿ²¾{÷n}¯iÓ¦¥ùŒË÷˜s®Ú:)9™ØcÏœØ1ÍN[q³C��Ä 6ÔeòÞvš¸vPüy•4;¥9° Þ Ò¶2Kï´Õ/÷miÁuÓu¡¡ü1&· Zx‡$ ÞLDWkõc(fÛy,¼nºÍËê‡�uƒ¿ÔÇÏlX¡ Á¶Zñ!ñ¶¸r[u~ƒ¿Ø+ó�è!I£ùÂW°ˆ¶¬$þÂ;²ü¥;½?ÜÎÕ‰¿Óf¹fîøwãIþb¯É›‡.?fá׿x7uI°ŒÖx7ëÎß;Éý ¤²�ÿ±Åmå|Lþ”Ä|cs¾ÂÕMŠoE‰£Åßï2¯ÈóR‘Y®÷­÷Qû¾¡5®åýÔ”Æx—yEúî;” ƒ·…É.Iø„- þR�ôƒèAKƒ·š¼Ÿo¬‚¢Á_l”çBô�¤Á_8K?ˆ¶¬$þ»rÞ_}?ïTeþb›9ÞM]Ò*ÝxW|¾qã/ñ!Iõ¬âó�Ë`Ì÷Â7’ã]æužs¹üˆ†hÍ÷Æü.óмo„܃·p–ò„XÒïø|#t•4ø gI!zXÒà/eËs zH2Zã]=›d|»�w‰ÉvÎäÆßŠ‹»1¿˜óMuâ/|MÞ¦.é•ÂWúÁM—øP¤Øbò–yHî‡"e|ZÓ³=^M]Ò,­$½Ø.o)G¤ð4ùK|Hó�àµ%÷£Ù—öÍ.Øï#þ¬’G/I´æ{c¼Ë8‡™_.ó} ã|Ë–-ôÉ'ŸèE±�<òˆÞ½—ýt2¯ˆ­ÁÚÎGéòW>Z—�£]¼x±^l;yòäò�Àª->KH�¿P‘so±Ç«·sG¤_0Fäüùó‰É† Bk×®¥§žzJæLZRÌD݃åUÁrÞ-ë³gϦ¶mÛúdâxg�e¯ž½hÙ²eú¶3ž'-ÖÙ{nzä›5kæS'göÉkéì\æ­¬åþúõëõ5;†9=o1ÍŽg>˜âÌ ¿ ßNÏìo×®MUÛMshÓ¦ õîÝ[_;ÿðjb§ó—ïñöÓÌÖXçúÍà´•ï9m•´ÒF=¡«HÑÑœWç·xûèª"ѵ4t¶Kç GZ�±ËáBUÝ«ž¿¶ ÖðuÓ%> iq–6r�Ïà¯ã Þl†3^ÊKü¹,ÎùÆS -ÎR“æÂŠ/zXÒ⬋µØëò¬x¾¶_;�/zX’3«`ò6uoª(ÿ�ƒ7÷¥³ÿlÖNîòL0¾6x›:Sq–ŒÎi9˜¼ ÞD‘þkVbè¡¶É'Ÿ oéÍ×{g&o6ÓyŸ±¬sÅŽôZaÝŠ½R¤ o1%à6)~ü¦W·œñ|­u+^t-™‚£/¤L“¿Ä$­Æè:ÙFCç2[¨þ“›-ךëüŸƒ·©3�6ið–&K¹‡�½£M–‰v[M]l HZœ¹]œ^^\¦\ÛREÚלÖÌã°‘ÓqZZ�‘|º.ÇŠ½R¤· vU¶MV¼èaIU–3?_kÝŠ]K¦àì#æ¢ûÁÊcél0LJ"u&Îoð6uIUiq–:¤MbšèAIƒ7—åÌÏ×n/¶Cßc:¾ÌÆ©KºP$çáÀe:ƒ¯æ¼Ák³C�HU™ÎrøZëV¼èþ$·TÇG�·pÖ68PJ¼#*ú—.¼e(ˆ�aÉ`ø[œ5ó(�wá,mŠ>ärj¨þ6Kc¼s3 ¹¯¥¡³åÂ)dÉ9ËÑZi¹–zX„´É2Ñn«©Kº€¤Å™ÄéåÅeʵ-U¤}íï2GYeHY!I«1\�3pßWz0ª´m²âEKª²œùùZëV¼èZºñ·â™�ΆÆRÎÿ³wpvTÕ?[³-½“H�$„šI ô&%)*¡£ñVPTDPˆô&‚€ tPA¤K!��BIHÙÍöò¿ç¾û›�wÞ›Ý)ï½ÍfÏÍgß™sûýÞ3g&ï¾;ãé Á›‡…±ZÆŽ¶cfaão¶MÈGrÒÞM7ód#BÏÉxc²qG°Ç9ä Î #zAdofÃ}L$#ðOµíóÓO?%~,orìu¡ü­ýòµÍÍC�nã��{y P>æÐ•ä4~U-?Y™ÍOü½ýöÛSåœ1yå…n3uñÁ ½g�u}õ«_µ�˜fɯÝ}ôÑG»(ÅIíTÊ�òÊs6ÉïûåG7Oš8É>*ùP+V®¡sƒ¼Å™w³ÞtÓMtýõ×Û¤²²2:î¸ãhÞ¼yv1ùy¡óÆ›n´qü˜èl�Ûä´¯|å+v'0/¢>øàƒÖ ùqÈX=—:Çï´óNtÝõ×ÙGOóŽY7Üp­Y³Æ>úyÑ¢EtÀØZNã2G}´}70·Á;t¹Í¹sçfü ãð9‡Óå—_nWÞyõ�ß{|öÙgSYi™©ˆèÉ'Ÿ´ïæzù}ËühL4·ÃÇü(çK.¹„N<ñD»èÌïDæ÷òÊ€_ žu^\æ•ÿïÿûv1˜ÇùþÝÎÈ?gί¯Gq]{íµÖ yqÁãhúÎzR™ª�‘¸Š]„Ô‘/¬„ÝÚsÆT¤#>”4}ä‹ æ}á¾ú/B<áŸ�5´W` ÒZº ‘JÊÛØ7…à‰xè‰dHþS$éë;—óø¸xè‰eoâ/xÃΙÏcNC¾ø Þ°sÌcì1ððý}z";w|%on.ÕLº¿‰5ß¹¡ƒOb)ø£¯˜è‘eoõ7©‰ôæ­ó‡Mà<ÒIØ;Î�Ÿ99ÄÕÑ'iïRG¾°þEÚ»Ô‘/ŽD_$Ä'‘à)yKùBË^lïàÌcåùB@<ôX²@ö»Æ|¡¯ˆ‡YæÃß[ñßσ³ä¹¯Ù ä‹¿°wp–ü³u©Ë8Á~eâøpõdw#ìmF’‚·ÃäU>‰¥à�0Ð#KÁ¼1ÐIÁ}Äy=–üÁó=±ìÅüÁUò–:òE’â�>I{—:ò…•°kiïRG¾8}É oTæ$ìZÚ»Ô‘/´Ì—½‹þƒg.yƒ3�•ëG@<ôX²@ö»Æ|¡¯ˆ‡YæÃß[Ñû›€™¼açÈ ûO$Ô-íñ‘¤°wøÔûL,óåopÆ<@O$ƒø»x°Š%pÆ<@O,»áÏõ£�¨ãxë­·l~­èn»íµ¸—í³ôÏ2Hÿ.uä‹$ Ä}’þ]êÈV‚ÓÃ=lŸÔ{à�Ú§ó^pþtÒÉ'Ñ~ûíg7u"×ëçì׃Úä'ãUµÈï›Åkd—)‹©ä»ßýîEmmm™i.†w’†ÙùË;ly›9ïPåÁ˜zS‹�μûî»ö}¸¼Ðjhâyg1o‹2dˆ}ÄsuuµÝùÊ Æø1ÊS§N¥#F/XΟ?Ÿ*Í#’y%�šyátðàÁÄ ¦Š‹Ši䨑4a«Ãy—wóÂ(·É‹Ú ˆwy|ü>]nƒûÅ}™2eŠMçwó¸¸-~,3ïÒÅ;}mæƒûÊ ¿¼èÍcác~ä5~÷0/_vÙeöQÍü¨i^„Åã™m&÷ÁýáG>ó#£,X`wŸ~úéÄï*æq2›é;NÏ(Ë‹·¼0Í ã¼õ›w]ób2Þ'ì–á]V^f9ò/A/^lûzÔQGÙq#_(é+ÆÞÐû¤töޱƒg¯¹à¡ã½U惿°wع´ÿÞŠ,Q¿oØ9ê„ý'’üs¸@ŠŽöV)øƒ3æz")øÎè}R€?¸JÞRG¾¾$a×ÒÞ¥Ž|¡¤Ú{° ÀÞa×òúŠøàÎõ�”|ðöÎ’ ›9DÁ~Cùñ… ¸zRðGݘè}R þà�y€žH*ÿ`Ó*4.í]êÈ×—$ìZÚ»Ô‘/ŽOåmHÀÞÁþ_ùƒ@žø ÿÄß׋¾s(ì=ÈþãøØwoÄ÷ØYF*øƒ3æz")ì½Pþ†DøñŽÂŸçŸ_õɼæ6,]ºÔ®'q~^÷áÇ@cm(lœ�y­‹ÿø¼ÎU€]c‚tÄÇ‘èkÞ(“+9ÿÍùvS)æŽ×Iù©Ã¼¶Çk�¼¾Èky¼YÔÿÇk—�<ò�sÎ9ÈêI^WüðÃiÛm·õâxÝr‡v ±cÇzqòàÖÍkoÍöðŽóžY{¸ÿ¨"c`ü~Zþ¥?ÛÚxQôÒK/µ;vy:^‚ìÏSˆãÚÚZúÁ~`{¿ùÍoÒAdÿºm›Áæ3x 4XÄûåïÿ{»%›�ýñÞ…±ÞQøw;Ž^šÜ$oÔÎ Ò#I½ [C.ˆ°kœè _V¸ù>ùçÎÞƒø÷Iî‚7ü XDò+Οî=©þ83¥àÞÒß#>–4­Úfº¹Þfv®Ä$¸¿ñì;Èî»á­þÞØ¥áÏ¥½Ã!=’T|âÄߤïÈ@gÔÞ ‰@þ&¡?èo„½ëý ,.“7ü rDò+Aó#ø£nÌô>)íÝÐ`·ïü"iª²Íts½í›üS~cgø!èI$ê–ö®þ¾Ó¾%oø¡XÜÕßÀä2eAü�Þßd‚w1�üS~(ö¿‚û¡À¾ô…Á~C�Å[Þ稿ÎL)øƒ·ô÷ˆ�%M«¶™>|Ë�¼a‘7òFİᡇ²e�Ÿ=¼×^{Ù…\Ä…‘¼YS]C•U•vÑ’ËÀ…)¿¡æ�=K{‡BzXÉ›O—.YJ-­-ÄsyÁ¿­µ�}ìQû´Þ+Vd |ýõ×íæÖC9„8ý¶Ûn#~…-ëxâqF!±ï•KS ÀÍf8iøøã�­¡Mš4)­ª¦¦&û\ÞÉÚ¿ÿ´´¬J>ŠpàüŽ\Þé‹ÝÊYûÑW"o2†Öp»Ì'ø£nù&Ä÷))øƒ#æz"©üƒMªüѸ´w©#__’°kiïRG¾PRí=Ø„ `ï°kùTÄw®¤äƒ¿°wp–üûÝÌ! Þð+ÈÊŸÈ/¤.ø£nÌô>)ðÆ<@O$•°i€?—ö.uäëKv-í]êÈJª½›Pìv-¯¯ˆî\HÉaïà,ù÷º™C¼áW�1”?‘÷3RüQ7æzŸ”‚?xc '’Ê?Ø´ À�K{—:òõ% »–ö.uä %ÕÞƒM¨ö»–×WÄw®¤äƒ¿°wpöóÇ0ïâ�²Ìk\¼ák_ûš]$äó0Jà`~ mUU•·¥|켂7ü ê åOäýŒÔÔ�y€^ÉO<^²d µ¶¶¦ýñæY~p¶à+®¸ÂÚ?^šç—�ùIÂ'Ÿ|²}rqP¿÷ýÝGTʆC -³ã­Ë£ÌŸ4+~|´krPg¼xþY�/pŸl€p:âCKÓgœóÍ7·ÇÐ=%Â`a q`Ë Þ<ÛŒ3äDÝv\½:„šowóâãïµeø$KopF�àŸH þ¨;'B ¼�zbé*D=þ1à8–üÁŽz"i:–ÍÞ{°•ö.uä -{ù>ÏÝy¤#>´Ì—½‹‰�]K{‡Bz$©þFPö©ñ7yü…{¾ü½°wøœ/>‚Éù›w?Âm&±wF”ÍßÇê¸àí0yU�Ob)ø£ÌôÈRð†_A=‘8Í‹úàÌ”‚?xK�øXÒ´šÍÞÙvøÝn‰‚°Ø9ÎèI%ú(í]êÈZêý�E•1?ùò7bb`ÏÒÞá‡�Iª¿”}jAü�Þßøˆ§ð�dßò:+ì]ïo|ÈoøäHÄó ø£îÞt}Åu×ÿpK þà-ý=âcIÓ1ÛŒ›ô³7ñ÷÷Ç,1/þ¸HÇzcqÁ®=iÈr€nÖ]<ô¤ö,í~鑤é£ÿ�Ìèco²wpÎ9ÿ‚ø› þ)?„ùˆ%óõÿ)aï’?σœ‹0ý7OøMË&õ´Än´Ï2í|ö®÷7>�ÂÞáW�#�£áÊÁÏÙ¯ÛÄ,¼Ø;aÂû Þ;3øu»Ï<óŒýãWׇ*ågPój3îL(i½eg~[ˆËÛÂæÃw’`€ÒÁ">–‡öù¤Iü… *K"S½ÀÕN¾‰…Z Þ¨彆ø€sÍ_ðg8‚´ö{B´íì¸SMe¯ÈRð÷êåxÁ[êÜ8Å–‚?ÚÇ<@ï1)øƒ¯ÃÝÞ¥róê…ž…?xc '’ë=ÿô ð8¹hèq%ìJúV[=äÚ߈ ´/í]êÈWh ®ÒÞsåï1ÉŸã¹m{Ãàæ!HG|(¹ÞÛ;ˆ¤$�Éé?¢ên"½z]s¶zÇÙEòÅYعw}èµüSn¡¥àí¦Ñ»n€µ7ǹö7‚7ü æ#­ýžPmÃÞ�šsÐy ø{Íp<·íã-õDvûüÑ>æz�IÁ¼6ÏNYº�¡Æiý½àÏy²ù{ÄÇ’ë=ÿô ð8¹hèqeo(FÚê ÀMJ{—:òZ‚«´wcø¶+H-]EÈ�ñèý�#áìÚãïâÁ-¶ äoZ,€½Ã®åõñw�Éþ¹â�êQ_Ú8óÁ_øwp–üÓúQH@Ð&ìÝéà[Ú»iXð–:· N±¥à�ab ÷˜üÁÙaÓû›|OL€½çŠ?º/¯¯vÚ…ýÃÞq@O"Ѿ´w©#_¡e�½ëýMžf"ïþ&Õ€7¯n…²wØ5® ˆxèQ$�EŽ'[y^à}á…ˆwƒvxàÚzë­iüøñÝeµéh?C:GåŻڠ§Už#®¯à,ù§õ£�аwøtœº“È/åÌ™3é‚ . aÆÑqÇG´;€ýï–e¬Þa6ÿšÕãÞ2Ìà¬ÒW?zÐ@ù{6i+ü4Þ¸ñÀ¸ù¤À‰[f8wßï¾€D[}Rfð7† æ!üÁYý�!!øƒ7â¡'’^3é?�Qþ¿ó/’·Ô‘/Ž ²÷>éïÃIð”¼íM’óÏ‘ý¾ð÷hRíÝ�(ˆ¿Éþ \ÌCŸ’‚wœ±¤°wøœ7}Š·lÁ÷7.Äâ-ý’à�ºÕß‚?x#zÄ[ùëý l£§$ì:—ö»–þñ=5Öõ¢Ýøp–ü׋ñº‚7ìÝ€ý'’âúª÷7 k¤àÎÈ=‘üQ7Îè}Rñwñ‰¸»ûLp•þFùëý l£§$ì~z"©þ&c:ñè wóÞüùóé�wÞÉ(Û]Ä AƒhÚ´iö•¨Ay{ìÐAê©øŸ+{Ïö`Þ ÛÕ# Å+¯¼bwþî»ï¾öU»Ÿ}öUTTØGv¡Ú÷wË©”+æ÷÷jPJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ px¸¹¹™¦OŸžµÑ'žxÂ>8kb7‘«W¯&.¿ë®»Ò˜1cssžòòò¾8°7f/ãI ¼¨6ðkvý¯Ú2dH¨¢¥‡~µµµ‡Ê¬™”€è}®™wÍ�;·÷u\{¬âx¹œ:æ÷óJm×D´u³§ë�P¹'ÐØØh+å_jPJ ¿ô|Ë/_®}ÝeôÄÚ ZZѹk|d¿V:dãz|Ûiõ'SGiqþ;²¶Ð´j!­ýðvd¥6¦¥­‹©¬´š6ÿe*­ë þ·¤žLF“ŠiÕ>¥‘ <×ÐD�5.µå.L»?¸”V=9­žÇ—WÒˆŠ6šTñ-ýä_´Ù¸cmú*ó�ÈïÖ.6_Æ´Ó”Ú":áÅFZ~à›Æ×·ºÖbºëýjš[Ò@4¿œVÎ|�ÖÕ/¡�Gïgó¼×ÜB\·Ä~™süâ"Úf­ÃÌqimGQ®-£×W•Óœ�kéÍ÷®¡­'�æ¿tÕÇÔHë¬þë‡êh휭¨­¢“×K+Ë©¶¥„vûG)RG >¹‘Æ�9ˆ*ʇÚ2Í«‹iè?_¢Ò¶U®ÎQT·ÇjRéµÑñÇþ¶ìâµQuÕçhèÀ­mÚË�Mô@CŠñ‰ÑäºZ5cc¯-7ýxÞÜ‹šê'\½úAÚ¢|#Ú½jš=‡Ö5™ÚËbžCO™{�¡æû«¥%D›¶ÐýþJý«'Ð�[z}¸»v-½ÙºÂêþ·ƒªF  º-‡{é´Â”}ÒÔsø:šÿîh‹ñ_¡’’Ô=Ì%«–R 5ÑÀ¶"ºð±:ZuÌ”Îr¦YËeŸz¢WÐÊ=Ÿ36°Ô³θæÏýi@ê¶È–2ðeªßq5�êoõŽ[ ×ckéËî¢ÑCv6lÇÚø0w¬]K ÛRãúáëD•Ck¨vë�E›ŒÏº§†è˜ÚθîŽL™Ž;k¨h—F*šÐDƒîxƒV;5½Ô*3W¯JýŸêÓbúpó¿[FÃokó±íß¾n™9sÚè ÑìÿµÐªƒ6K¯£;­…ûQMM‡¯ å+¦!ƒ§ÒÀꉶÔ=µµ4¿5õnß½ÖAÅ£Һ͇uWczúëåDæœ$f4®…Þíw�²#ÕÛæPñÑJªü÷kéeX3vÛ°ãjœ?’h|3}2ø9jn]KcGì‘™·›˜»ÖšsѰ^VOŸ´›ÿ£ú sNÎy­‘Vº…/6àðæ<ÝØ¼Æoç/M¶Á×§þ¿»êÄr|ëk´êKÛ¤¾ËØÅn ÔñXµµœþ·øÚrâI^ž‹W®¦R3ƒ�Å«½8>¸ä…Vj�0†š^IíG|Fo-ºÉø¢SÒòlÊë�Ít_Ý:Ú¨¼‰–¶™óÛ…­ëŠè¤̼nü‹9¦ª©èó ÔþRÕï³Ð\Cž0×�ãlîâæ"x] ­újúùWþi=UÿûZuX§�BýQåÿ»š&or:Õ7.§?ú»¹v~‰¼3�}Õ6,¡ÆÆOíyùþòi»âÝ©ßGÓªS‹Hek×QÍ“¯Ð33Zh£Õ4þ�vúlå¾ôÁ�OQCÛjº§m�;t |£œV­y‹–NZHý«6¦åŸþÛ¶SVZC?_ó,�3pgrÿÓT7cÕ<=ŒZ>×FuS[è¡ÚÒä~›ÑÔWRó˜a´nüFiûõã:bÝÛ4úÓ¥tïØù´Ó¨#iè[¯SÛ€ÁT¶b=7ª– ÜŒ&?gœ›Y ©Û~6U¿ù<½·ý4Z¸úYÚyÔQiõ½ùÙ?©ÂôiIí›ÔÞÑj¬×ø³›”CQ‘92­í-TRTJm&½¬¸<oò”÷3ŸÅT×òU• 4Çü¯„JM™“o¥¹�¨)dr”PYI%5·7Rmó 7ÔÄQÚŸ&Ý˶Å‹?z”ª*FÒ°AÛІ½ÿš´ðƒÛhÌˆÙæÓ�Þ_z?m1áx[îÃ�7~tˆ™¯íÌuhm9áD³ØVF+×¼áÝ[Èë“Õ'Ì¥ÏÖ¾içús£ööúÐú¿ù •¾¼ÜëzÛV#hív£=}C:à�� vÇfwãjkk£uëÖîð�3gŽ}çë‚ º«*#�}gÍše채ššÒ¯CþÌÇ{,UWWÛ|þx=Î-~Ò)sÛJª6swžj,•k�J@ (% ”€PJ@ (% z�ªb³Òc¾øC¨À¡þ×HËâR³ dÖ0JYŠÐQ-"r¨Ö”òܦB±ù¢×ø a^®6_›o‹ýIéÇ©µBÓ÷ô޲yðoøû™òmUeéebhU�kºi¥ÓzVœ¦yùú—™÷}•¤vð—Ê2´s\›‹-É4l”Í6?¨«"hœå�Œ9/µ^Sìæ¹8³-ÔFUñ×ü�¡´$Ó~j|L+K(3‡)_–ª… ü¡Äœ÷¼¬VÖÝ÷då©ò¥f"-$^ZUR©æq¹9k2Æa– ŠJSûT˜™Yü�¡¬È|™ÜÑFFR¿ôù—y£êŠá€‰š+KÉ�~Q«!ª6ýJhÜh¶ñ‡éL�k›ýƒ åוÏñ¨Ì·Ÿ1¼.vaþüÕø�™p¹ù"Ú÷Û²ÿr˜¿�iÖ~}cªb{öÏ‹3Å"gãÅf!1T(ë´áPùCd*qmuúw^¤å€¸ö~¢æÇk%|þ¶PGyg9Ž+ò™UG¿*5 Ÿ2`�Õ$¦’ªýÞ8Õ^‘~]•ut˜>3W:úu¶Ñ�\_yAÄÙr{iª®²,œSãHo¿Ã”å>²_/1\ZÍ8‹Íq›ÉVl‚Sí¦œt©�úXZ\aïXçtpäÅceæºÉ-T”¤_ûÁ�óÈk’ÿ>Ã-N÷#é>÷òúÄ×R›ˆSÙ7ð£¡g̘A[mµ=þøãtüñÇ{¿âŠ+¼ã3Ï<Ó;¾é¦›ˆß;vìXª5?ªêjñ×+¤y'€�¿Ræ£áÒó"à®ÿB�;RU•õ¶¹«¢M«¯¯§Iƶ¹üãOÓ4A (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ ¬ox�nÍš5TYYI_úÒ—è£�>ÊÚE<ç[kž"Âï‹Õ°þÀ�:¼À¾yä´—ÆfJS�¤ÿjÆßÈ s�§þ55tÍu×û£×»ã~æWD·þñ�ýúæ7ÎêòåÖ4B (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ ¬Gø=ÁŸ~šz=BwÝ ›¯»z4=·ä;€¡ç¶•Tm¥Xmf•E€Ug4Æ/ŸŽ²Õ㯃ë,ö=–ÇŸ†cYGweøùå{îÙù ~®ç�wÒû‹Ñyç_€jU*% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (�^Mà�Hë?ëx`Zœ*ë¬ÁJ™û^š‡×óÂêŸþt;°ß¾4 ¦Š¶Ølºù¦m[Gy=ôàtÿý÷Ó.;íHœž�ÿÁçï¬e}Êä­è¶[o±ñï½û.qø[Ïè‘#èôSO¡Õ«WÛ4nçÔ“O¢m§M¥�ý«iúöÛÑÃ=hÓøƒëüÊ—�£³Î<ƒ&ŽßØÖÁmüåž{hï½öðÊ<òðC^™î®¿îZª©éO|HwY5] (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ ô {ï½wZ?¥ž–¨ÊzA€7¿r�2ç�ã÷£óí)'�HÛï°ýí�é'?½˜ú÷`Û:ù”ShÚ´i´ùæ›Ñ9ß;—:è 6~ù²etݵ×ÐÇæ9ãß3ñ»ì²+Õ¯[G{í9Û<‡|5ÝxÓ-ôç�O÷Ýw�ó�³m^ÍÞq§�èâ‹/¡n¼™† BGq8566ÞúXÜ@IDATzu>öèc4f̺êêytÊ©§Ù6~ñóKhÿý [ný#UWWÑE^hów÷±Î¼ûÆn¤“N>y½qwcÑt% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (%5æõ­¼†Ça„ fCd ’T®§ðTfìÎ[7;Ú©ô�7^·õŸõ�of¼+wŸ}ö¥k¯¹†@‡Í™“ÖNûõ×yq·Ü|“}öøK¯¼Fƒ¶ñË–-¡+¯¸‚®üýUT^^N'Ÿrª—䨑v×ñ¯¿N;LŸnãgΚEß;÷ûöx×Ïž®ùÃ<úÆ·¾EG}Œ�klj´‹ÕõõõÝ.êÞuן©®®–ŽŸ;×–Õ% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (%°!àwOž<™–,YB;ï¼3±®aý&€wþbp>{[:yÊT[ÿÌÏïbwÝ~Ñ,¶Ž;6r›o½õ¦}Üò¼«¯òÊ.|{¡=þÈìÞxã�í–æ—_~Ù¾—÷¿ÿ}ͦµ¶¶zùýØ…ì‡0hà@›¥£›÷s^xÞm·ÝiÓM7óW«ÇJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ ×hjj¢Ù³gSÐZ[¯à6ìü•2÷Ãì â�Ð˯¾F»ÏÞƒ~y饴忛Òo{yä¶V¯^cË,]º”ð·‘yœóÜN´»/^L³w›I»Ïšaß1üöÛoGn#l�çž}–,x+mÇqزšO (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (%�KØô*e.ÛHÕUD¥¼ÊÌ»d¯ž÷úõe¿¡oótñOJ_ÿúTRRºÍqãÆÙ¼—ýær*--Í(wÉÅ?£—^z‰/YfýÞ»ïÒ÷ÿ-#_."®½æv7ò˜‹ê´% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (% ”@lòÀÐcWØEÁâ•+W¿S—CUU�1�æ]Á••´øÃÅPåÞæ�ÀüÎÝŸüøG´bÅ ›¯Ý<ªù?/¾h�—-[fe«««­^[WXW’„åË—Ó�wÞA_?ã »ó8I]ZV (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (%�”€|0ô¤õf”/*¦â'Ÿx‚FJӷߎ&Žß˜~ñóKèìï|×Ûý»ßþÐ3O?MS&oE°FˆØn»íè‹~H¿úå¥4aÜçl}cF�¢N8Þf9âÈ#íñTSÏ!_8ˆ¾xäá(šSyËÍ7Ùú¾üå¯ä´^­L (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (%‡€|÷/ô8uu]¦ƒJç~8M�º =÷üsT^VN»í¾; >Ü+wÌ1ÇÒfæÑïüïÚ|ó-lüg}ƒšÍ‹¥eøÎwÏ¡9s·�z®¯_GãÆ�§�wÞÅf›5k7û®áçŸ{Žª«khÆÌ™ôê«¯Ðæ[tÖÙÒÜœVå=÷ÞG[n¹•7}Ç�è®»ï¡~^œ<˜¾ãŽtÇ�¶mË4Õ•€PJ@ (% ”€PJ@ (% ”€PJ@ (% ”€P…& ßý =çýè0 Àü|鉓&Ù¿ ¶ßaâ?„m¶Ù‡²«ºø]Ãü‡°÷Þûà�²ÕéOçŒC‡¥}÷ Þ…ÌyfÏÞƒ…% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (% ”ÀzAïüÍßÎ_7Ì¢*ÎÛó¥× ”Ú % ”€PJ@ (% ”€PJ@ (% ”€PJ@ (% ”@ÏÀšlÞvþbxífpQ‘Q;¥R (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (�X´hQÁZœ0aBÁÚÒ†R°óWÊÜóáG@ÛàÜW­5*% ”€PJ@ (% ”€èmêÛ‹ÓºÜØ–¦ª’í­õ¶–V'ýU­ók ŽÛÛ3 ×µSUiö í Tþuæ—òÔ’Y¶­ƒ<ßZ[Ó;ŠŸÕ7™ò%õ-�™Ww¥…Ìž¥%[¥¶¥Ó†ÛÛ3ûRÒá‹k øªãùéW>ÔÓyØrœ¼Ã¡®=5ß�¥ãuÔ›qU�©¹hmˬ·Î7ï f®ûgi«%}.‘£�R¶Ñ›$Úƒ¹P³k¿µE³Ë–ì¶ÖÞÖœ=±ë|ãêWßj8dffÓÍ>²Ì¼Yc†ÜÑšª•ù·´ÖRIy¿´â-©q6:™–VqçWk{SZ‰µí� Ë̸¥%‡WÖÛiâq˜YnKo#°’Vw¶5væàñÇ uΞØ?ÈÐÌqY|ŽÌgõ>·EMç*Àü¡X»ènfG#Œ§¬©� qFæB×í Wo•Ò~ëÙžýóâq¡tÖÈà�G¶¹ó¤ÝçË[œ?²qf.‹›„�{nlcû­H5ÙžšðT\g/ŠÌyÒÚÖÐ!�Zˆu¦ü�TbS{ʧ7f÷mMîü.òõ©¨É´Ñ¯‚Šš›¨‰šS.Íǰ¸5{]Ü"÷¹¢´†Ïfã­3í²Íq�­·w´š\íÆÄ‹¨Ãô¥¨8u�l3×G¦PTTL­æÞ¯¤¸Ü¨Õ”/6çIYI¥1�T?ZL^.ÕØ–~ígîe¥Õ©râšÔîÊr¢ÿZœò£ž-Ùù!ï-:S:�0×�1z´!˜>}zÁ†µbÅŠ‚µ¥ ¥`篔¹çc|^íºúÌ«|î[Ò•€è!×Ì»Š¾õ­oõPëÚ¬(,�†§Û©á¥ÎÿW~¾˜*·OÝܶ'Úšè;V­Ze;xðà¾3h©è!z¾å<¯G–Vuщ_œúÒ´‹\š”…@kó:*-O}IÚÞÞJÅÅ¥�¹x£_2®«ZZipYªÎ5��4°Â}ÉÝÙŠ=Zk¾Ë­*n¤ÒÒÎôú¶vª*q÷ŒëÌ—æÕýȾ5›ï»ËK̳ӌ}ûhn®£òò¯æz³8Wå¾P¦:S¾&}�ÌËò Î¬ÏÖ”qfþb;�Ë*ó¥x©ùºii*•ÊLç\Xcšèšï0ÇE渥e••¹/¨¥�7˜L¼P�úâõ ls‹kYj¬«[[i�i׆Z³*Ö¿“!Çu˜¨¢ô¨T^ÿ'/8—¤�ÉŸÜÝq»Ys-6Ýé0kEf´ÙŒ­Ü��Ë®kk¥&sž)+£µ†Õ€FÓžo>:Ìw÷E)¶)^()¶°­nm��`6Ö´gªáýífý¤Ø,*75ךÅñôÕåöµ&³±˜¶Í[n–ÐúuÚ:êim36XÒ,׸­f1‚û6Àðç1V×›yïßigf}ƒŠ:›é,ØÅÊ´&Å•f€Y|lãæêšš×š±°5§Ù~ƒ1ÜÊN–]4�žd†²jmçý$ÿð Ô9âvcåkÍ‚ÛÝgf>‡s•¶š^Y¦æï;ÆÓÒÚ`mÜ*z“q ýÒíßÖRgN–2oæ�Ë5•¬¡Š~3ˆ“ækPn­9q„·;_>F5]I0h5‹ß¥%�vƒ2¼]nÁü¡ÞØYåÚ*\fì¿ÍاŸñçëíǵmmÔ¿¤„Vÿ6þ�µÎØ…ó‹ð‡ð;­­é×»Hž O®’¯ÿüã4ö�fþØyþ°Á8ÈJ߯D͉S‘š÷†ºO©¨£?­ª[E‡USUYê\æoQŠ�kî—º¾á:Ç?˜(q6Ë­ö½• Æf+�ͲÏK§ãÓ*Ù§Õ›´ªL{n¬k ŠšTŸZLÞ2›×8ôªê0‹ÁMÅmTá®5´ÎT\=€¼|.-)·í7›…n.m¼Ÿ‰ï Ú¦•4¬úsfêךËT1­kYm\Ú@è?Õ·ðây‘9î¼ö£Kþ9ñæÀ%66­1—“R Î/y]AÿQ†ï�ØwÉkÒ{•|i1Ñ3ïuvyû�‰v�Ø©o@G æ|\½z5�=ºÛQµTWWG/¾ø"MœXxï½÷ñÂsMM�9ï³9µn‡ BXºd©9Ÿ[Ì�ÒÚÌ}º‘æ^çÑÇ¥oûÛ”Ëù}¯\n|^I©m(dß4›PJ@ (% ”€PJ@ (� ’@—‹¿<â, $$ˆ< ‹¿#VÈÐNÂÅ_®‹¿|´øËiì:Oú—ÓÞâ/g0‹¿2ðâ/^üåà_üeÝ[üeÅ·ØÈjœ�Züå’�_l£žÁ¥� U6Õ·øËy°øËǼøË‹¿|œaã•™ãå|(‹Å_ŽóY‹¿Õíâ/gJ°øËÅyñ—/þrð/þ²^m¾ãªvó5€Y‰ïêý‹¿œß¿øËzš-p„ XcàÅ_Ù¾€/v !©¦¯6oúª,ꉲøËõ•šÅˆ¥©:£ùš±2êâ/B™b»˜˜ik6�³yŒ›ã°øËÇi¶gñ—+ß1cñ—“ŠÍ9»Âó™>lÎÒmð÷ç°·øË¥³-þr|�¼9är”lñ—«Ìj_¹ŽÔ|ñQøÙ¹¹øËqUlgî÷�êâ/�“9¤-þr„ïG1ð‡ð;þqViÃ6Ž?rp=ðêrþó�£ü>Ð;ö/þr&·øË‡•5ɤ8`ñ—�­w1>«Ü9M\ç°øËyìâ/ðâ/ŸÏ³‹¿—eñ—£±øËÇvñ—Ìâ/‡¢~•Ø—lu^üåàåKŦ}¨–¦³Rì~ÄPì~¬ÿÎ;|¹.q¹4?ìò-’›òýܲÚýÀÅ[�6i¼üsâÍ�Ëô£œ_òº‚þ£]þáœÌƒ4•J@ ô.xz�·Øþ%c07žæ‰�;¥òЄV©”€PJ@ (% ”€PJ@ (% ”€PJ@ (% ”€èÓðô)ó¥�ä£r­S (% ”€PJ@ (% ”€PJ@ (% ”€PJ@ (%Ð× x;ݻϡçžK•VVt>>(÷ h�J@ ô4}ÿoOÏ€¶_Hö�¿æ½¿”€(}÷oáXkKJ@Ï7µ%P8z¾޵¶¤ô|SP…#PiÍ”@�àwþò_z¾õ�IŽ1DÅ[6ƒ¿‰0Ü0‰¸ðGÔß‚?x#z"é5“îß•¿ÁàßsÉ?ÈÞá‡�Þe0ÿ”Bz$)ü=¸ª½ùð7‚78ëõ5“wÿHö�ë*d7Í.öß'¥°wãðS÷7F"îüÁçô>)ðÆy=‰WÉ[êÈ×—$¸JÞRG¾8<%o½¿ ¾¿ŒÃ×Sp†Äñ}JÀßñïSœ1XÁ~ÅKvÿ¿Ê¥½Ã¯HûG›}J þà ÐIq‰ºq@ï“2ˆ¿‹OÄ]Ü¿K{WþÁ×Wø¡œòwçì~z_”à›KÞ°kµ÷N‹j7¯j­¯¯ïŒˆx´zõj[bРAKvfóÍ7©ªªŠŠ‹ûðæš�ó –ô]_§L™bN%n$åÛ:éçã¨�J¹ÃhzAdÐu(�H,�‘‹‡ZŠ g”gÑ,¢ó+ À€cÏÐåÀ…N±eÿTPúÓ’ûÀ:iïRG¾PÒçPüc”ü½ñ ÞöKRNtñ¨#¶üÑ.Îè‘<&¾ss<ñÆÁ� ùƒsîø§+yKLò*óÁ_ð†�ËÈ qñδ+yËÓùr*oØ9Ú€ý'’‚?êÆ<@’ÁüS„�Zº‰C~´+ù#>¯Rðç>eó÷ˆ�%£ò†çqrñÐCKÁœQ>¯|»«¼üÑiïž.xï 8Å–üS5£>´Ó’û�ÍÞm—ù¶Ç¥G’ íÝ»¿q@À)¶üÁçô‚ÈØ;ìZ^_Ÿ1NaÿàŒóz\‰ö$o©#_^e>ø {gÉ?h\à*yKù¢J´+y‹iG¶ÜJÁÛŽ)Ëý=� ¼"KÁÀ<@’à™+ÞàìÕëF|P?ò/øƒ3æz"•¿0<�“‹‡[º‰Dù¼p [iø£+ÒÞ=]ð†�£8Å–‚7šC}h§'$÷�ý‰´w©#_(™+{w@À)¶üÁYý ƒHJ‚³Ãfïq9ñQ%jG9OGˆ(„̇¿ö¿‚ëtwÃò¸8Ǥ#>ªDûÒÞá‡�ž)xï - 8Å–‚?êÆ<@’à s„[ºŠPíJþˆÏ«ü¹OÙü=âcÉü¹^þ‹Þÿ}zõÕW©¥¥…¦M›F›nºiœjz¦Løc`ÒÞ¥Ž|°s蘗ØRØ»µ/S¹”h/w²˜J¹²nG�Ý)ßÖÐ[—‹—bëf þúkkkíã.JK-›ëc}4Ð()t‰O*�º?-Ì1ŸtÖ&Ü<éˆ%CÚ;�$žKîìX‚tć–ÂÞÑbRÞvÀ¾)OÄCO$Còǘ"I_ß¹xJþˆ�-{Á>;ÏcNC¾ø Þ°sÌ_ì1ÿ;G}‰ì<àð+˜´K Þ°sÔ>‰¥àïÕ/DBX)øƒ7æz"iúÈÿ¹�öžþà ,ÐË^̦ yKù"Iaÿàœkþè÷Ù¤îO s »–ö.uä‹#Ñ�œðFeNñ&¤G–½ØÞÁ™ÇÌó…€xè±dºùéý ÿÿÀüóûw©ÇâT(_ü…½ó8༠êN·ñâú ¿‚rqü ìÚ“üÝz‰°´I Þ‹Wø$–¼1^ƒQðÆ<@O$tçôXRðgÌôIJóWÉ[êÈIˆ?ú$í]êÈV®¥½KùâHô%'¼Q™“°kiïRG¾Ð2_ö.úž¹ä Î2ù#Å'gÄ ®Êø}rófëëIþŽ+æ“Çi�]<ôDÒÁòØqe&Hþ©Xñ™þ‚7w}‡‚IÇíY.|þ¹xè‘$ÈoLB·‰A‚·+êåöêôÛ¯¿­0ñ‚·éhª¯.,ò"W¯n¡ó@�QðÒ³w9&Á,¸Û8Λ à�ÈÞ¥Í þ<§Öþ`+yKùr*™‚;ßXZ.¬»xèI¤­Ô|HÞRG>¿DŸLa‚tć’=iï>Öþ¾JÞRçÁûóGÑ-8.ˆˆÈ&g$¡M…žHö$¦à›§Õ]<ôDÒÁ#®‹C�ñ¼¹{蛟EAŽg´e¹$õ7‚78cŒ~Ї°wW•—u$’¼1`‘)x3;àŸH:h#Gº3Û�àï•qñÐÉõˆ?8c '’‚?0ã<€žU€?Ï��?7A:âs*ì=—üÁUò–:òù¥åÂÂÞ¥Ž|q$xr�8.”´CËâß ÁßÏÙ;.€½ƒ³7öû/Äx}0�âö '’Î8QŸ­Ô|„±wWE¼>!uF’ή½1 �ë*ØSðµ‡>1›Hcbž˜/'H÷`f;öÎÈêÕ‰¶âÈÞÜן×?ÇÕkCè<ÎÄctÐP�d=«ü½:\<ôDr=âÏ x,‰ì]Ú`Ÿ•;" Àߎ—ûìæ!HG|WÝîNò#ŸŸx≴Å_”ùôÓOé� –Q÷‹ƒ”¨ƒçÔ¤îOÃ1êBÑ ñq$—±åÄçSò8¹þy˜G_ÿú×í°Y¯[WG»ï¾;-X° ƒ'�½wüÚÐr%;ÚÜ`î¤ùó/sQVðyP¼½œ kíÚµtÙe—Ñ�~ô#ºå–[¸*/`Pô¤ ^�~饗҉'žH|0544К5kºþe…—É€êìdÙ¾Z`©Ée�ÇW¢rÉ[êÈE‚«ä-uä -]È�>Iþˆ�+Á5e �¼ p;/H�$MßÙ9qß¹B.xƒ«W'lÇ™x%–ùâïìýWÉñ±d ÿ”BÛ±dç©j‹ƒ3æzd)xÃÎQO¬¾f+È?wö;ç¾ûí?[wº�¼ÁåÀ'±ÌàŸjó€ö"KÁ~õIJoy=0}W¢B þà�[“üþFôºSö;Çy=©DƒÒÞ¥Ž|¡e�Þß$÷÷à*yKùBKWòƒgbÞ¨ÈÉ {‡Bz$iú®þF€†ZÄ?¹½Ã®1Ï>“Þ_ {‡�{õ£Á¤2�¿I�×Ͱº°wî{6û�Õuá߃øƒSl)ø£¯˜è‘¥à ¿‚z"ù• ùà�y@[±¤à¾˜è‰e�øƒ·Þߤ&óÛ�ö.uä -õþÆ¢ç ž‰y£"'ƒì~鑤úAÙ§ ®¹õ7Ù¯¯|Fsó‰B¾ü½ðï°sœ‰úì/Èß$]?»‹öÎÜwžßDAðv˜¼*Á'±üÑæzd)xï Ø")ø£nî;ßg& ‚?8c '–âιõ7úý Ï?l Œ½ >œŽ>úh»¾uûí·§9æ˜chÈ�!Ä‹ÄÍÍÍii])ò\…êªLwiÞ˜Üy¤#>®D?äWÙ;üÒ¿ò•¯Ðá‡N�=öí³Ï>tíµ×Ò^{íE[l±…·…±Á§pYÐãö1°\Q óË¥áÂÐ ÄmxÀ€v�õÿø‡½@ñ@/ºè"Úf›mhÉ’%´råJ:í´ÓìNá9sæÐË/¿l›lmm¥‹v±ÍÇ»‰ö³ŸÙòœÎuðîâK.¹Ä5÷õâ‹Sy9þÁ´upnqvLf€o1b„Õ+++iäÈ‘öø‚ . ¹sçze¹.So‰�8â[ß;ì@O=õ”�¿ç/÷Øü‡v˜ÇqÇg_ÒÍ Ê§Ÿ~º�Ø]vÙÅþmÉ Þqù£¾P“�ÌBês¤x.‡?6<Iî–MãÓ'×áâ‘I:‹G}\–CAx§šêü àíº˜6fÛGƒÐzþLÁ?G¦‘lüC·íʧåäϹ  ÀÞ®ËÑÇÊ6å8sã–i›&xs7ÒÊ8uÅ’‚?×ÁAý H�`n¹ð|¹xè‰$6�Ûðn£àA4éõÉÅC�$MÙ´üBç4ü…/?þ™×Ùx½K†·ß~›>ùä“H‹¿\‡ä-PÈfr£ËF„žÆ�ûèl$’ àÍæîA’iÓ„½s7ý}¨¨¨ óÏ?ß®i¾öÚktÇw¤íF=,±,%§å6tPiqqqÚ 4wú­·Þ¢eË–em‹W‡n��;ˆAú3óBîßÿþw»pÊy>üðC:t(ýío³‹¥gžy&UUUƒà¶ø ||×]wÑ£�=JúÓŸhâĉ´hÑ"jjj¢N8�.¼ðBÚsÏ=éì³Ï¦û￟¦OŸnëû÷¿ÿM<†uëÖÑÂ… mš?΃è~Ãuüñv‘–Wä7ÞxcÛuÞÏc»úê«éÍ7ß´mΘ1ƒx—=pà@ºþúëé·¿ý-Íš5˶Ç}ûùÏN£F�²«ûÏ=÷œåÖ¯_?zýõ×í/,xœ¶l˜Ž¸…–î—F^~Óc60è~ö‘�Å/�ðË#ÔÃmpH, ô $c�–3úÏö N±¥à�ºõ`†„5DI9=k+.>7ü³Û{oâBòHRG¾Ð2ÀÞ1/¹à�¾HÞëõ/ÀòåoÃIð•¼á‡�Iª¿”}jAü�þÂÝG<ý0�¿IÐûï> Ð’ûwS“ÿ-ÀßGò/ržÔß`º2e ½§æ%w̃©Ê6ãttB^oIúmÇÄ}I{—:ò…–ö.¯·Iæ}‘¼õþ&ø~^ïoR'ο á8–,ˆ¿Ñû›À¹ àŸÄ¿À¯°­ØzLãÙü}`ŸºJþ~E`Ÿ‰¥«õxõË‘V Þð+(žˆ»Ç;ÈÞSñh+–ü=>.zbY þà�Ëë+£Èfï8/bqG¡ñïl.½A½¿�¡§ÁÎá G–ù²wL¤“Aö?„ôHÒô�ËxÌ\¡7Ù;ìóæŽcIáïÁ5·þ&ˆÊÅê7 ¥Ÿþ¹ûÿ”°wÉŸçAκԕä]¾2466ʨP:Úg‰y³RØ;#ÊæïC5"3 Þ“—Ëß'ŽŒ­ þhó=²ôÙû®»îJ;î¸#}ùË_¦üà4xðàtކ+ø )ƒÚæùäµÈ P^^N¼Ù5#t´S)7"âEËoûÛ´bÅŠ´2ûï¿?í¶ÛnÖ¹qÊ!¿`zæÌ™ö×¼[–W¼‘ç¨#�¢‘£Fï8þË_þB�>ú( 6Œx‘•Ÿ…ý /Øg–óNÚ-·ÜÒ–ãíѼ�Êýà¼|…–ötêä�ª¥SÇØR•›OßIÃmØ“Â"ôH2ãÏî`ÓúQH@ЦãÜ©ÆäŽùü½z9ÞqEœÔ#q–Žºà�¶Ø9ñ�F�ѳ àWºzõBç±s¹¶wp‡\ïù;Ðà’cþ®Ú [³­€?Ú—ö.uä+´ôìÒMC§žŠ€Zºsù1žlç:çÉæßq^ =’\ïíDRÒã$ø#>² äoÚ+€½Ã®y^Ñw)âS£îÁOÇ=ðúÛ¿‹óÄUìÕ‹†X惿°wp–üýÝ(è±à�ûHôœbË@{7 ÞRç6Á)¶ü1.Ìô“‚?8;lÞ9ŠøÈÒ å0NëïÎÜ1ÐÉõžúxœ\4ô¸2�7#mõà�&¥½Kù -ÁUÚ;üÒCKWòcø ÿÎ’Z? ©ÚtÜ:ÕTðŠ,¯^޼¥Îm�Sl)ø£}Ìô“‚?ø:lžÿA|dé†r§Þßx`€ÄJ�“›èq%*—×W[½°nƒíçô$íK{—:òZ‚«´w½¿ÉÓLäÝߤðæÕ £Pö»Æõ=Šä±Èñ„)Ï;}eXµj•Œ ¥£ý éN/ÞÕ=­ò|øq}gÉ?­…T|öŽ §ü„cð‘’ûÏÁúáýüç?ÿIï¾ûn`N^·äÍ®¡¨8õ`$ܸqãèÎ;ï´‹ uuu6™iy',/h^ åÝ»¼Ý™w̦·HÃ[Ó9ðâ)$/8ón_^@ žwörÀ#žùxòäÉô¹Ï}ξ_øšk®±�—¾âŠ+ì³µù�Ã2ŽËøïê忻ロ~õ«_Ñ¡‡j“¹M ßô•ÇÀmóîåSO=ÕêüÜtè›_ò.düna~ ôOúS»ÊÛm·Ñ„ñÌ)⻑k šFä³DG“Ž3 ¡�Φ²ö�ó"_ txéBG{‘¥p€o |rp›‰¤ék:wãê�Üg__m´Ð=^¦-±õÞp¶ò8üM÷ÕÅ'âŽyüÑMøè±do‡+>o9_âÞ¹å�éL�àÜ›øûûŒc–Ií?ˆw.ù£¿’7›.ŸfIü‰´w©#_h™/{ƒ æŸòCH�$MßýþMJþˆ�$Õßd^�opf[ãyËiÈaïð+8_b�Á]G½òB�d׸žJ™Á_ïo‚xƒLÝ߸ ùà�¶q@�%óeïÐý ¸JÞRG¾H²@üÑ'ø� ña%ì[ÞÏHùâHôEòftI½¿çÝ<éˆ-…¿÷�ǹ�à™KÞàÌcåú=–,�½ÃÎ1_è+â¡G–××Bð�Ü×lòÅ_Ø;8KþÙºÔeœà Î(ûO$õþ83¥àÎÈ=‘üQ·úC"ˆ¿‹OÄ]úw©»yÁ|Ä’ùò7âþ}ƒß ÒV‚/æ!HG|‰¾H{gt<ÍI‚çÝ<éˆ-…¿G%ÄÇ•à)ù#>–T“1<ï˜ûŒÄ."°~æÏÂ�†î±�/#ìv‡Y—lü};çÍ©ü”cÞ\˯ªå�°%%%¦ç�ßWrÛüÝ¥•¾{{ðÁsýáÊ+¯¤3Î8ÃF½ñÆÄ�ü Å~@h˜3ó;tÿüç?Ûrü¸e^Tåݱ]^Èåwêf,þú q;í´“]ðµÑf¬ü®àñãÇÛÝÃÏ>ûl*·ó¬üXf �ßËËïýåGH3ð=ö؃þøÇ?ÒøCºõÖ[m¾Ù³g¿ôú"óÎaŽã|ÌÓJ“ƒ%þ6ÝdSZ»v­Ý•Ì…m<ã7yø]¿¼Jï½÷Úgž¬sÏ=×¶ÁéÈï—|Ì:×¼K˜�Í» y䑌 gÔÃå8¸!§”B}ŠF½>¹xèI$—µåM�8ötÇÛ‹ºåÀÛÖÁܺKwd½|Ž-ôB¡ÎÖŽ×ÁÆ€ôHÒqæö¸þ¸N{RðænØ4�:I7®×pøãò~œÞ;VÛ¦‹GIS—¿<[ÝÅC·Rðç¾øã¡'’\ØÉ[ê©\yþÌÁ›ÍÍòæ1ûì?Û1�6ofã¯ùâH.ÃAò(R™rý)zNÆÀó��;â,ž#Á›»»oܰ¯¼UXwñÐ "x£+±Çè|©-…?Sð�ÌÀê.z$éã�Eè\W�…ðO6Ž- ÖùŸ�·Ô™‹Í›D Þ2êí1ö¾1¹.zc•:úJ:Î<.Î�?®Çž4‘Þ1ç•e|}ä|"K7”³•p=.zAdj^S^Ÿ\<ôDÒÔå/ÏÇVwñЭd þ9b.v\§s‡9>Ž´…¸¼à-uäË«tœÑÆ„®A�$o®Ë_ž�ƒþ¸6�éøø2¿Ž|q$—áÀuúCºæOÉá±lDè9£©Ó_[ÝÅCÏ&y¤6>‡¼ÁÙöÁ‡ñ¾¨üð†) �‰dþ޳ež'{gŒ)ÿ�»h¡ü=–ÂÞyŽ™Ò­:÷œbKnÈ_�Õ:ëuj�ŒÉuѫԑ/”tœy@œ\'Ž=i"½c¿½ÃG¹:PW,éÃíøÏ}ÁƒhÒë“‹‡žHšºüåùØê.º•Aü]<ó±eH0F=ž¾¡ð¼yX«eìøg;f6^ðfÛô×�|q$—á íÝt3ÿA6"ôœŒ1€7æ!wÄ1{œCÞàŒ±2â¡Dðf6ÐÇD2ÿT«á?kkk327776bf$®oàoí—¯mn‚tïìÜËcxñ1‡®$§ýä'?±ë˜üèšš»NiË9cBy¬ÉJiÉñ‡ÝÎË qãRòâë<@“&N²»t‘Ž>`åzXyä‘GÚ]µü.^~ô3?b�Z>ì°Ã¬qnµÕV´|ùrûÎ_Þ¾Ìïîå4~W//0ï¼óÎÄïúå÷ïò»…yG/?zqüž`Žó šUvÞ™ËõðcªùùÛ¼[™ß?ŒÝ»7ÜpƒÍÃ�~æÉühé‡~Ø.„óä_|ÑÖÇuzüË߯xW1ïšæ�ÒÿùÏìó¾Á-®WÉ[êÈIúúÎå¸�6@8ñqeªÒÌ{<†$vkÏ!SU�ŽøPÒô‰/6˜/ôOòæž ÿ„¬¡%xC�ŽøÐÒUˆüèPRÞàŒúÀñÐÉ�üчHR˜›ÇÇÅCO,{ÁvÎ xsòÅ_ð†�cc��‡ïï³ÐÙ¹ã+yss©fR~(vß¹ ¿ïYtðI,ôó=² à­þ&5±Þ¼õbþ° œA:â#Iaÿà…ózR‰>I{—:ò…•ð/ÒÞ¥Ž|q$ú"ù#>‰WÉ[êÈZöb{g+Ïâ¡Ç’²wØ5æ }E<ôÈ2þÞØŠÿ~œ%ÿÈ}ÍV _ü…½ƒ³äŸ­K]Æ Þð+(ÇŸ€«'3ø»ûaÿh3’¼&¯ ðI,4€y€Y þà�y€žH þè#Î豤àΘè‰e/æ®’·Ô‘/’,ôIÚ»Ô‘/¬„]K{—:òÅ‘èKNx£2'a×ÒÞ¥Ž|¡e¾ì]ô餓ìnç4V<ÃrŽ8HG|(™O‡[`>9o®·_ðr¤À惿°w\Øp!,ðׯæoÜØ¡“¡ü‰¸¡WOfðÏá):Ú[¥àÞ˜艤àT8 ÷IYþà*yKùú’„]K{—:ò…’jïÁ&T{‡]Ãÿ£3ˆ‡Þ'e>ø {gÉ_yüCù• ûÁœ1Ðû¤ à�yHÄó¡üƒM«üѸ´w©#__’°oiïRG¾8<•·!Q{gy}E<æ£OÊ|ðþœ%ålÿqü øñF|ŸäŽAçÃÞq_)ìM+ÿ`{Çu ‘Ý;þA¼£ðç~ð®]þãÍ‹]…iÓ¦Ñüùó©«u=.Ïkj_üâ‰wwø½Áeeeö�Ïë\𕼥Ž|q$ú…7ÊäJÎs>}ôÑÞÜñ¦W~Â0o>åuF~‚ríÚZûTbk{{;u´wлï½kŸ&|Î9ç k Ün»í¼´ÆÆFkX§ôÌÁ­/ÔR‘YDíh1`ýP7ë/¼¡Ÿ~úétÐAÙ¿´±ñj¼Ïàa€…0О4Ø4=¨ñ6¿$°ó‚ôHR/ˆÁ3Ú£7$©ÿw®¤òÏ�½Ã¯à½P ¢à ¿‚‘üŠ»~‚«'Õßg¦üÁ;—×W¾]µÍôáû›Lð.¦GïoÔßÙ;üÒ#Iõ7�æ¿‚ àŠxè‰d µwpÎä¯÷7`’S)®¯ð+h#‘�ã~'ÐÞS;“ÐVŸ”‚?xã<€žH°z`]z¦0ѰkiïðCH�$ÕßO^AüMúŽStÿÏ‚Þ'e “€ëeT)ìœñýBŸäŒA Þð+^²ñÿà[ þ¨ߣAï“Rð‡—þñ±¤k›éÃßßðB oNä§ËNœ8±KSc;ç¿;Ë|¼øËóÁÝÞ4YS]C•U•Þsᇺ+»!§Ãž¥½Ã!=¬äͱ¼Ñµµµ5í�wuókpW¬X‘'Û‡ x²±Œ‡¾ï•ËÈ>Ó/ �+Qð`ÏôÎVNF|()87.ÜÚ·¾õ-2dHö“Aœ '‡z\‰ÑJÞRG¾œJÁœÑF(¾ÝÝÐþ¨ó=H‚+̱SOMôÐÒU„üh· ¼Ñ¤àÏ}b»Ä<@O$£òwvíuöïâÁ-¶ ä� ( À£‘ö.uäƒ�Cg{Q1‘ÐCKÁvŽòh§'$÷!›½'²ÿ„öÎàN±¥àïÕ+' ù”°wصÿúÊCB|ÆðòîoR-bþÐ>Îè‘ùà/ìœ%ÿÀñÁ¿» '7/ÐãJ´+y‹iG¶ÜJÁ~�ð˜À)¶üQ7æz�W¸ƒN=Ezh©þÆ¢ä/ \%ÄG–�üƒ, �ñÂþy,lç¶‹,r`ÿè½ä-uägèà‹ë.ôÐRð†ŸAy´Ó’û��w"þQý�°wppŠ-¯^9ÑHȧ,€½Ã®q½ÀpÝ“‚?8ôØÒ5„òhçô‚È|ðöÎ’àøÌ9è' =®DÝ’wz«È•c)xï 8Å–‚?êÆ<@’à*í~é¡¥«ùÑ®ä�ø¼JÁŸûÄœ1Ðɨü…áyœ\<ôØ2�^Ig¯¼üѰ´w©#ì:8çÊÞ1½^½h¨$÷!›½'²ÿ„öÎÀN±e ½c&ÐRdìv�ëF…xèžÀçôØÒ5„òhwƒñ÷ÂÞÁÙÏŸÇ.ÇRr>~Ú-?áöñÇ—ÉVç4~jm”wKÞbÚ³¶“8RØ;ü ê层Sl)ø£nÌô é͋ҩ§" ‡•<RµÏ¯»å§&˰馛Ҿûî+£}z•r§"ƒ –ºïñµý05v¯ ˜&m€Yº ¼rBçG;ç$ƒ_{Q2 =’¼…mÆÕ—¨ß‚78£N�W€Q†N¼½úeƒH+opFñHœƒæGðGÝaòg•‚?x ôIJ@üÁŽz"iÀe³÷ÞÄsÏ}ö©ûÓBÿm¸—œsÉ•KÞÜ*ÏK’»– ñ¡e¾ì] 6ˆ7üÒ#IÓw¾Ùâ±r9Éñ‘d§©Øbà)ù#>¶Ìë:G ®¹´wpÎäŸÜÞÁ#_ÄC�,oøÔƒöË@þ&!èúÙ]¼é»ßÞáW¸ï~û�ÕwaïàŒºÀ'±ü½úeƒH+oø‡ý'’‚?êÆy=–üÁX '–âιõ7zh[zcÑdœù²w1Aö?„ôHRý� ìS…¿×Üú›ôë-ZÇuz,™//ì½Ð÷7˜‡XRØ;8ó9Íõ% ‚·ÃäU™á7L›"Ç þhó=²ö¿‚zbñ–÷›‚?êÖûCBðoÄCO$ÑŒ°÷ÞÄßo38f™Üþ͸s’ëç\òçz9HÞðC©ÔxŸð#Î=x~EêÈZº �½KÌ9Ä~鑤é»ÿÿ³hRòG|$)ü½ÇÇÅCO,óÅ¿ þ&ˆïýþ†çsÆ^xa—_ŸºÅ[Ђ ÒŠp§544¤Åw§ }–i烰wøäë®Þ.Ó…½;³ôŠøûÄ‘±õÙ;ü �ÆÑ]8Žƒ”(#%¿GXî¾ýöÛ‰€» ¦½RÞ&,êV·W§Î¢Ûí=ÁS'>úÓc25^óài'ßÄB-oT�ò^C|�þ'xv›Ö�B*‚6ŪÀ)¶ü½f8^ð–:· G[ þh?'7¨,‰üÁÙa‹nïÒº¾yõBϼ1ÐÉõžúxœ\4ô¸¦‘õ`ÂþÁ9—üѾ´w©#_¡%¸J{Ï•¿Çx$Žâ�ˆÿzoï ’’AüYº‰D9´fO§Ø;ì× ´�xè=&�_Aû'é·Ãê‚7ª÷êEC,óÁ_Ø;8Kþþnô@ШãÚ©¦2€Wd)ø{õr¼à-un œbKÁíc ÷˜üÁ×aÓû›|OL€½çŠ?º/¯¯vÚ…ýÃÞq@O"Ѿ´w©#_¡e�½ëýMžf"ïþ&Õ€7¯n…²wØ5® ˆxè=&øƒWdé•W¼…_³ÑܶïKO.Üùq}gÉ}á ¿‚þxܯȺàïÕËñ‚·ÔÁ?‘üÑ>æz�É{wØôþ&ß#üì;WüÑ}½¿‰tÄ~é¡¥›8äGk’?Çsžlþ~é‘dŸ÷7)‡–ÉŸ�›¿\__»Yåyæ�ÄßóXäxRµòïŒ3ìcƒñèàaÆٸ5kÖ HAûRØ;.'È—V]>ø {çÞzÃýç`ýB¼ì ïö–�þöÛowý¸ðŽöÔ`8豤ïäâòÞ \<ôÄ2àÅê;êAeD8yb÷?_üopÆ<Æî¯àÄŸ� ·Kf87Í®¾Ø}ç‚‚·ÔÁ'±üÑgÌôÈ2ƒ¿‰HúN9O‚?ú¨þÆ�üa߈‡žHzͤÿ@¦7ñ÷Û ŽY&µp•¼¥Ž|q$ú+yçÂßïÀïéˆ-óåoÃIð”¼í¾¤ ««¿”}jAüM &®·°giÿˆ-…½Ã¯ ¼�`´CÁvŽJ`ÿ‰¤°wøî;×›(ÞàŒ:Á'±ü½úeƒH+3ø›Ã!wø#ÁuK�øH²³«¶8 ôIJ@üÁçô$<%o©#_$Y þèüN�Žø°\%o©#_‰¾HÞŒ.¡÷ üþ ±ýçËÞÃIðÌ%opæsžëG@<ôX²@ö;‡ßB_=²þ¾�ü#÷5[�|ñöÎ’¶.u'xÃÎQüIÓw^<�½Ã¯@G[±¤à ¿‚ºÀ'±ü½úeƒH+pFq艤à�ºÕßAü]|"îÒ¿KÝÍ æ#–ö;‡YBO*Ñ7ø� ña%øb‚tÄǑ苴wø!¤Ç‘à*yKùBKWò£o’?âãJð”üKš¾ûý=ú&ù#>’,�½ƒs®øs=²®0ãæ…Þƒ>˜n½õV›��ã,þ†i+Tž|ñöÄ?T»ÊàïcÙ¹óç°kÌ/~(Âu† ‹/¦¦¦&o×ï®»îJmmmÝ/}ôÑGéã�?î6£fPJ@ (% ”€PJ@ (% ”€PJ@ (% ”€PJ wø¿ÍÍÍ4}úôÈ•ÖÕÕÑa‡fËñqÜðÄOPyy9ñSƒ5ä‡À”)S¼…~,CµøòË/Ó³Ï>kßéÌïÞ{iãÊÊÊhÚ´iAÅL¼yWô!‡Í±›mºÈ¥IJ@ ôb×Ì»ŠæÎ�Û‹G ]W¼\NóûÑߦ­ ÿŽ®�PP³*% ”€PJ@ (% ”€PJ@ (�ÞG ²¸ˆÎ2¨Wt¼ÿ›ŸPéË˽¾¶m5‚Ön7ÚÓ7¤ƒÖÖVûÞþýûw;,Þ͹nÝ:zç�wºÍ+3ðNÒ(»IeyèÇ{,UWWÛ…FÄ©Ì=Ì•”A--Z´ˆöØcš0aÝ|óÍ6/þ.Y²¤›à"*înu9¨Ñõ!þ©§þEgžñõõ¡+^>0+ð¿úå¥tÄásèòß\F|’××w.Bœ÷ýs鑇òòë�PJ@ äžÀÀ†’ÜWª5*% ”€PJ@ (% ”€PJ@ (�õŒ@•yÔ¬% zùøjèA½1b„ýq@EE…ÍÂ�‚æEaèAå8Þ.é¸c¨u¥÷7zäºô?§ººÚ®ÊÚ´Å|à•ó×�ãéÛo×mq3,zï=ºñ†ë#ÿü«3úûõ¯}•xICKK ÍÞ}–yÞú-vE~ìØÏÑ]wý™FJ���¶ú»ï¾‹^}õÕ¤Miy% ”€PJ@ (% ”€èc>zý¿´üÕWè“ùoP{À;Ÿšjkm·¿Ï½‹TsC==ýë_uY6LŸ²UÐhÞWöÄÏ~J÷ó,Zmþ?Þ°j}òæ|zóÞ{²eï6î¥ë®¥_xÞËÇu­6ïÊBxæ·—Ó§ Þ‚ªR (% ”€PJ@ ¬—°34ß�+T;ùGo«_¾zÐ8xmñ¹çž£+¯¼Ò>&üšk®¡+VÐÔ©SƒŠ¤â‹Š©”·–·¶¶ÑöÛoO?ÿÅ/‰1ß~{�ÞyôÐCÒ?þùd—•Œ9’ÿû?½<Ç}Íž½�zÚé6®¢²ÒK[øYê¸Ï|¼lÙ2ú奿 ­·Ú‚–,ûˆ»›¼ˆüé§ŸÒ¥¿ü5~Ķž÷Þ}—®ºz•––Æ®W *% ”€PJ@ (% ”€¸û+_¢íN<™êÍø?úïktÈUó¨fÔ¨40�«WÑûO=Eu-§e¯¼B›í 7ކL˜˜–/ŒÒÞÜB‹Ÿ{–>ßEæ0}ÊV|áƒ÷Så A4ó»çÐûO>IÆŽ¡†Ï>£•ïü/[ö.ã>4}üØ,ønÒÉÄ à÷�v ßr+s¼Ö.”ïoþ�¾Í1ÇÒ½§žLGÝv;•UUuYŸ&*% ”€PJ@ (�O&?�ßIDATž"Àïîׯ_Þ›ç…ÅÊõlý.ïƒ^ÀS™¥ êÚìÙ³iæÌ™iÉavÿÚwã…΃¡�vÞÙV2ÃTÆ ™?ýÉ�iåÊ•4tèдÊý 7„r?ÐünÌØ±iqþü|Ì ¯hW¦u¥wWޱh]ÕÃiþ>1œÜ?zúßOÑÔ]Q›ž­­zóëh›m¾™•ü1qÒ$ûçEd«/ «F+% ”€PJ@ (% ”@$Pbþÿ½Ë™gÙ‘ÿÓüýý§Ÿ¢×n½•¾ø§;©Ô|IôÌå¿¡Ïí²‹Íóñ¯S›ù�7òóŽáWn¼Áì°ý ÚxÍ:÷\ª8ˆî9ùD*1?XÞê°Ãhüî³é…«®¢�_{•›ÿËî~Þ´æÃÅôð9ß1»‰_¥É‡IÓO;-�¼ìÓâçž¡µK—ÑÊ…oÓ'o½E'<ú8½ûøãôÊÍ7R‹y¯ÙŒï™v  §ÌSÇ*† ¥cÆÐ:ó½CYUú�Çy÷ò‹˜gt·7‹ÞÍ÷œtU˜ïx¬ûüì¯oýõ>šòÅ£­¾ào¥ñ³v£OÿªÕÿúµÓéS³8}ógÑçŸgûÁísàÝÂÇ›_\s¸­£Ž<¼”{¡M{ôÑGèØcRÿád¹ËN;ÚÝÔ?óó»ØwÛŒâƒwóû‚¹>®÷ôSO¡Õ«WÛ\ALDª*% ”€PJ@ (% ”@ Ðf~¥Ï�K^üÌÓôþ¿ž¤ñ3gѨ©ÛÐâÿ›:Ì­ß~à~½Í´¬$>zí5úÔ<íë¸{ÿj{çÐóWýÞþ»Þ,¾î÷«Ëhò‘_¤g.û5 ™8‘޹û/´×lë©4?ßó¢Ñ—ÿö½zÛÍuË>m¼ëç©¥¾Þ,¶nKÇ?ôµ˜>?sùeô…+O_0OÇzôûçÒð-¶´;™g�û}Úò�C©ÙìÚm5;ø{€ûÏ:Ã.@ü»«è©Kn“x‡ð´ã¾œ¶øË >ÿ<�4 ¼˜ÏÀ�7¶Çü1Øì|æĭ²5(% ”€PJ@ (% z‚ÖdÃnf]°`=iž˜äÿ{ä‘Gˆã» E%Tô|é×ÿûº-;bä(Úq§�èW¿¼”êͯun¿í6h~µ;zôhDu)o¾éFúêé§Ñä)“éž{O9•Î3ÿñãw shjn¢ÿ½ó]lÞ´»ùeïŧâo¹ù&:ý´SiÒ&›ÐŸî¸“®ž÷ª©©Ikë­·Þ¤óο€n¼éª«­³;—Ó2t£¼e~•Ìa¤+‡åf¡÷ºk¯¡�?úˆ¾g~�¼Ë.»RCCíaÞïû¼Y$¾ð¢‹èÞ¿þ�V­úŒf͘aä*ÚÂüö$ó¸)Ç?—¾ÿçÙÇ>¯]³Ö¾ó«ù6ƒû`ž{í9Û¬Þ¯¶}ÿ¿óΧûî»�ÎùÎÙ6Gz¬”€PJ@ (% ”€P}‡À3¿¹ŒÞýÇ?h¿_\J5#FÒ‡Boýõ^ûHè±Ó§ÛݱÙh,z⟴پûSqI �3OýúÀ<‹C•ÙQ;Àý¿žG7;à@_êWnþÿÍ�Læ]·Åeå6M~È>qú°M7µm-ûϋċÂýÌ÷5ÃGÐ`³8Ë‹´]^”®5ÿç…ãþäG´òïÐ:óØk÷Ø"£hKý:*1ýãPlv3·šh„³ó™ÇÌ�wó#¢5(% ”€PJ@ (% z‚Öd³­fë?þù¤“NJûÛĬ—vûÚÙŽv*Å*óŠŸÒsÏ>K � ô/³šÌ;q'Ožbþ&Ó ó^ÜK.þýÕûìK¸ö:Oç]ÀK—.¥'þõoû¾dNØÆüzx¸ÏÑ­·ÜBgžuí¹×^v×ð~ûïoÙy…î¾û.û¨í—^y�ls-[¶„xGó•¾1I&Õi´PJ@ (% ”€PJ@ lÀøqË\ö›´ndvÚ>zî÷è�?ßI›wñJ#^Èm0?bæÐjvåÖŒÊü1w³ÜðÙJªêêQbi­eë“?KYUµ×.Ç7­]kbýyä1/W™WQíú­³Íâm1ÍøÎw©ÒýŸYæe}Ô”©ôÙ{ïÒðÍ6§mD̓¶>âH›uíÒ%Tãþ¯ÿ©ùñ÷ˆ­ROËV�Æ)% ”€PJ@ (�ž&°hÑ¢‚ua„ kKJÀš¬”Qø 4k¶üÄâ®CGçð«æ—¾üødǧ}öÝÏìtý!•••Ñó¨=öØ“n¸þ:»ÌÛ‹9j&|fzù�Âp@Zö™³fÙ�ÅËÌÂj¶À�BærrÁ7[^Ä 0Ðv·zޱÖÔô§Í‚óO>E�‡j2ä|óHÎ;ͼ3aذav1xÁ‚Ôb㕼s™ëœwuçö·S�”þÈüÚYƒPJ@ (% ”€PJ@ (�®Ó–B/]w íáÛœ-ÿ8óôª¿_t! ž8‰Þyä!ÚÔüèY†‰³÷ g¯¼‚¶Ÿ{‚Ý¥;Á¼8iµÍ6ôÀ7ϤEæ‘Õõæ‡çæ‘Òæ ‹®B©ù1÷Ø�v¦7ï¹Û¼Ïw}bþ?>õèc‹Œ2?Îþȼ3˜€'í½7½0ï*;}Gj2OÛZõþû4Ì<±‹Ã2óðMöÙ'°MPJ@ (% ”€P=M`ºyªO¡Â ÷”�Bµ§í¤^{˰† Äæé§Ÿ¦… Së†(Wožx´“yrsסˆJ[[[mž½öÚ›þrß_óŸpâIôå/KïþïtDz‹²]¾`ØWÓ÷N[^HöìЭo¨Ïº]™ws7~¼•¹ü¨]שºÏ>[e_]â…ÂýÌ/°y×qœ°zuêÅͼ³a£1chî '³ijjD´J% ”€PJ@ (% ”€èãøý·Ù¿SwËçóøc„Ê¡ÃhÜŒ™PÍÎ×­iÏ /¢7î6‹ªæÝÁ¼°ÚÖÒB[z˜—g›c�£þ£FÑ›ù m´Ývö±Ê¼¸Œ0å¨/âГÙú4f‡éÔßìÄåÀ�_>æ®{èÕ›o¦cÇÐAîIb£ÍÂpÍÈ‘6Ïèm·¥þ£72�o.¡�¶ßÁÆí÷óKiáCÒwÞiÞs<ÕÆmqð¡Tä£�4Ó¾ô%º{îñ´ÅAÛÇbüûyvGtiE?:Ô<Ù‹ûðá ÏÛ]ÅC'm‚b*•€PJ@ (% ”ÀzG@e×»)Éi‡ä;€¡5Â�{jžŽä/¼ðMë­þt—–”tþ‘Ù$?Ö˜w«^~ùoè�ûÿFwÜùçlÙ²Æ�vÿñûÀüòÖž|â «Ž7Þ<^y‰?ɣܢ÷ÞËH+tÄx³}ß½÷ÚÇF›_Xs¨­]KϘÕ÷ï�ûýXÝçv_ö›Ë³.€sý”€PJ@ (% ”€PJ@ 0��Ï83Ä“ÿ”–˜/¹j^Z¿×w€oñ–Gl=™ö0¼0ºí—¿•x7ñ$óãpþC˜ö¥ÎEçO;ÑžÌÖ§‰³Ówó»Šù1Îþ0~Önž:Áwt]ilÔF×më>É[Ù­é®Û‡þÛíSW]7!Ý&]_Ú¾ÉvÓ§ÚM|`UÍÔ¿#J""‰ƒJüÓ{.œ‘¹Ü{‡?w`¿'ïÜóïžûI&f÷ç9¿†óh~}Ì&¯Æªœº*x‡ÍîêØdµ“x{ý�dÁ‚¶S¨qjgò±O�Ê×--fðUu¼zõŠmÿdVªu¨�¾êlU"‘ˆüåóÏÍïê¦RÞ0LÔœ*²þW*/q{[ÛT¦c  € € €ÀK&PóÁ‡òÓ¯þeäôÍ{ÉÞ<þu¿]õŠü�¯}q·þíŸ%óæ­}o¿¨´|kjú³À´TK±qNukk›´|Ý"ê(è?|\,›7o‘@ `vÍÏ_)_þó+)-+‹ZZZ7.77O^ݼÙìóÃ×·šcÆx¥ºÚ¬ËÈÈ[û¾}{½Åîí¾üâÝ÷ä©Môü7¿ý�ìÙ»W.¶¶J†‘£·¢¢BÔútQóªw(((ÐU²¥¦Æ¬Ó¹ƒÿjäZnÅ¥Ëû’Ý»"20ð?3ßquõ«f³“‰Ë@@@@@@R_@çü�èæÜ#ƨ>ª¨£Ÿ³²²D§©u}Û¨`#¬v¢º•ÿœü·œ?^þñ÷¿ÉÞ½o¹îx­©­uœjÁÂ…æQÐvÔ1ÐoÖm·k§q+W®õ[Vù†ÕÇ©¬*,4ƒ¬Níª~Æ ŽÍ«W—‹úØu4¶õT°wlÀ÷µ1¹�ôß).õ±7k_î@@@@@@@ 5tÎ_½8Ñ*UÚØS§NÉ�;wdhhÈì^bl¸Ý¶m[‚@ð°ø$j„�‰¾ßÓ#¿zÿ�=öY‚Þ4#€ € € € € € €Àtš››§3<6Ö«ybòeJzç¯õê4Ù… äîÝ»R__/󌓉wìØ!÷ïß7Óì:�©÷©À‰‹ÚÕjÝÙšx=@@@@@@@ôÎ_ëÕIF{×­['«V­2»äåå™÷÷îÝs?ÝÙØØëÓQf§É©G@à›&ð00rÆ7mݬ@@@@�É Là”×ÉÌG_Hž€5°¾wz¢Úõ«ƒÅªÏ­[·$ JYY™Ó�‘úèÐÄv»ÏB+¤º@vvvª/‘õ!à‰@$sX"2,;.å‘ÀŸ*|žÌÍ$ `/‡Íþ®±÷¡/ø½y©É\¸ ð{s÷¡/ø½y©É\¸ D"éëë“åË—»w¤�d d>Ž›ÙÈ”¹úÿÔïíùóçz?•Û5###ÎÆí¦­­M*++»$j·¸dÉY´h‘øý~»fê<°æÖ÷NÓ¯Y³F:;;Ífµ¡÷ܹsRPP�8œæ—ô¡avI9ÁR� € € € € € €@*\ºtIººº\Àª]· ±Ù�?f\@ŸÊl½:-¤¤¤DÔG•††§n6õQñù|Dómd¨B@@@@@@ %T`7 Mh-“é;¡ é䉀>ÎÙzõdò±“D‡%=jüAA@`. ?ŽÎ…×à@@@@˜û�çþ;zô†* «ŽvÖ¥¹¹Yu¼ªÝÂêhéÂÂBÇ>4̬€Îù«w'íéi>IíO!iÿý÷’ö &F�Ù8xðàì.€§#0ƒ ëü²°nÈ£@`B¹l`Boæjn,ot˜oø½yëÉl¸ ð{sÓ¡ o�€¨�Y¨(QŸ— xý{»|ùò”ÔÔ8ÀS¢KÊ �óWïNÊCF'MOæäÌ� € € € € € €S¨­­•3gÎLz5Ž’:zç¯õê´Âîînyðà�S³,[¶L ìÿQ…NsH € € € € € €Ìž@~~¾lݺUNŸ>m.¢±±Ñq1MMMf›ê¿bÅ ‰D"Ž}i˜Y½ó×zuZ…:Æ»§§G233ÇuL&_â85*@@@@@@HÄUÁܪª*¹xñ¢ôööº®Jõ#øëJ4+�ÖÀúÞm1›6m’ÊÊÊq]‚Á Ü¼ys\½Y� G@ÛÓP‹ € € € € € €@J¨ ðÚµkåÑ£G®ë)//7ûõ÷÷»ö£qæ¬9€õ½ÓJæÍ›'j§¯]ÕîT|íDC= € € € € € €©! ‚º555®‹Qí]‰f­Q'åÕ9€-$''Gºººl»Ý¾}Û<Ú¶ÑHÿkì¶o£@@@@@@RFàáÇ®kIÔî:˜Æ¤ 褼:p¢‡­_¿Þ<òûĉæ®î¬¬,3¸åÊ ‡Ã²k×.‡)T8ÍØLA@@@@@@HŠ€Þùk½:=,==]8 íííÒÒÒ"Ïž=¿ß/K—.•}ûöIff¦ýÐè°6S@@@@@@@ u¥··wÚ òjži/ä%Ÿ@ïüµ^ÝXTß�7Juuµ[·qmÆÐúÄéqmT € € € € € € €À,xüUËöjžY ˜S�L�ÉÆv'ˆÑª<¿'Ož4öòFÍÜÏ*|íÚ5sçoQQ‘‹MT|bl¦ € € € € € € €$G *#§2Çv�Þ;=- JEE…ìÙ³G:::Ìn‘HDB¡�Ó�‘ú´4#lüAA@@@@@@HŽ@lçïhlVß;=mþüù²xñbÉÍÍ•¡¡!³[¿™ ØiŒYoÄ™9ÚUˆF@@@@@@@`z±�¿Æ‘Ϊè{§Y³²²äìÙ³ÒÚÚ*OŸ>•ãÇ�Ëàà ÔÕÕ9 ©÷ùäÿsÖE-4J‘IEND®B`‚accelerate-1.14.0/docs/source/index.md000066400000000000000000000101201521253476100175460ustar00rootroot00000000000000 # Accelerate Accelerate is a library that enables the same PyTorch code to be run across any distributed configuration by adding just four lines of code! In short, training and inference at scale made simple, efficient and adaptable. ```diff + from accelerate import Accelerator + accelerator = Accelerator() + model, optimizer, training_dataloader, scheduler = accelerator.prepare( + model, optimizer, training_dataloader, scheduler + ) for batch in training_dataloader: optimizer.zero_grad() inputs, targets = batch inputs = inputs.to(device) targets = targets.to(device) outputs = model(inputs) loss = loss_function(outputs, targets) + accelerator.backward(loss) optimizer.step() scheduler.step() ``` Built on `torch_xla` and `torch.distributed`, Accelerate takes care of the heavy lifting, so you don't have to write any custom code to adapt to these platforms. Convert existing codebases to utilize [DeepSpeed](usage_guides/deepspeed), perform [fully sharded data parallelism](usage_guides/fsdp), and have automatic support for mixed-precision training! To get a better idea of this process, make sure to check out the [Tutorials](basic_tutorials/overview)! This code can then be launched on any system through Accelerate's CLI interface: ```bash accelerate launch {my_script.py} ``` accelerate-1.14.0/docs/source/package_reference/000077500000000000000000000000001521253476100215345ustar00rootroot00000000000000accelerate-1.14.0/docs/source/package_reference/accelerator.md000066400000000000000000000021451521253476100243440ustar00rootroot00000000000000 # Accelerator The [`Accelerator`] is the main class for enabling distributed training on any type of training setup. Read the [Add Accelerator to your code](../basic_tutorials/migration) tutorial to learn more about how to add the [`Accelerator`] to your script. ## Accelerator[[api]] [[autodoc]] Accelerator ## Utilities [[autodoc]] accelerate.utils.gather_object accelerate-1.14.0/docs/source/package_reference/big_modeling.md000066400000000000000000000044341521253476100245020ustar00rootroot00000000000000 # Working with large models ## Dispatch and offload ### init_empty_weights [[autodoc]] big_modeling.init_empty_weights ### cpu_offload [[autodoc]] big_modeling.cpu_offload ### cpu_offload_with_hook [[autodoc]] big_modeling.cpu_offload_with_hook ### disk_offload [[autodoc]] big_modeling.disk_offload ### dispatch_model [[autodoc]] big_modeling.dispatch_model ### load_checkpoint_and_dispatch [[autodoc]] big_modeling.load_checkpoint_and_dispatch ### load_checkpoint_in_model [[autodoc]] big_modeling.load_checkpoint_in_model ### infer_auto_device_map [[autodoc]] utils.infer_auto_device_map ## Hooks ### ModelHook [[autodoc]] hooks.ModelHook ### AlignDevicesHook [[autodoc]] hooks.AlignDevicesHook ### SequentialHook [[autodoc]] hooks.SequentialHook ### LayerwiseCastingHook [[autodoc]] hooks.LayerwiseCastingHook ## Adding Hooks ### add_hook_to_module [[autodoc]] hooks.add_hook_to_module ### attach_execution_device_hook [[autodoc]] hooks.attach_execution_device_hook ### attach_align_device_hook [[autodoc]] hooks.attach_align_device_hook ### attach_align_device_hook_on_blocks [[autodoc]] hooks.attach_align_device_hook_on_blocks ### attach_layerwise_casting_hooks [[autodoc]] big_modeling.attach_layerwise_casting_hooks ## Removing Hooks ### remove_hook_from_module [[autodoc]] hooks.remove_hook_from_module ### remove_hook_from_submodules [[autodoc]] hooks.remove_hook_from_submodules ## Utilities ### has_offloaded_params [[autodoc]] utils.has_offloaded_params ### align_module_device [[autodoc]] utils.align_module_device accelerate-1.14.0/docs/source/package_reference/cli.md000066400000000000000000000445541521253476100226410ustar00rootroot00000000000000 # The Command Line Below is a list of all the available commands 🤗 Accelerate with their parameters ## accelerate config **Command**: `accelerate config` or `accelerate-config` Launches a series of prompts to create and save a `default_config.yml` configuration file for your training system. Should always be ran first on your machine. **Usage**: ```bash accelerate config [arguments] ``` **Optional Arguments**: * `--config_file CONFIG_FILE` (`str`) -- The path to use to store the config file. Will default to a file named default_config.yaml in the cache location, which is the content of the environment `HF_HOME` suffixed with 'accelerate', or if you don't have such an environment variable, your cache directory (`~/.cache` or the content of `XDG_CACHE_HOME`) suffixed with `huggingface`. * `-h`, `--help` (`bool`) -- Show a help message and exit ## accelerate config default **Command**: `accelerate config default` or `accelerate-config default` Create a default config file for Accelerate with only a few flags set. **Usage**: ```bash accelerate config default [arguments] ``` **Optional Arguments**: * `--config_file CONFIG_FILE` (`str`) -- The path to use to store the config file. Will default to a file named default_config.yaml in the cache location, which is the content of the environment `HF_HOME` suffixed with 'accelerate', or if you don't have such an environment variable, your cache directory (`~/.cache` or the content of `XDG_CACHE_HOME`) suffixed with `huggingface`. * `-h`, `--help` (`bool`) -- Show a help message and exit * `--mixed_precision {no,fp16,bf16}` (`str`) -- Whether or not to use mixed precision training. Choose between FP16 and BF16 (bfloat16) training. BF16 training is only supported on Nvidia Ampere GPUs and PyTorch 1.10 or later. ## accelerate config update **Command**: `accelerate config update` or `accelerate-config update` Update an existing config file with the latest defaults while maintaining the old configuration. **Usage**: ```bash accelerate config update [arguments] ``` **Optional Arguments**: * `--config_file CONFIG_FILE` (`str`) -- The path to the config file to update. Will default to a file named default_config.yaml in the cache location, which is the content of the environment `HF_HOME` suffixed with 'accelerate', or if you don't have such an environment variable, your cache directory (`~/.cache` or the content of `XDG_CACHE_HOME`) suffixed with `huggingface`. * `-h`, `--help` (`bool`) -- Show a help message and exit ## accelerate env **Command**: `accelerate env` or `accelerate-env` or `python -m accelerate.commands.env` Lists the contents of the passed 🤗 Accelerate configuration file. Should always be used when opening an issue on the [GitHub repository](https://github.com/huggingface/accelerate). **Usage**: ```bash accelerate env [arguments] ``` **Optional Arguments**: * `--config_file CONFIG_FILE` (`str`) -- The path to use to store the config file. Will default to a file named default_config.yaml in the cache location, which is the content of the environment `HF_HOME` suffixed with 'accelerate', or if you don't have such an environment variable, your cache directory (`~/.cache` or the content of `XDG_CACHE_HOME`) suffixed with `huggingface`. * `-h`, `--help` (`bool`) -- Show a help message and exit ## accelerate launch **Command**: `accelerate launch` or `accelerate-launch` or `python -m accelerate.commands.launch` Launches a specified script on a distributed system with the right parameters. **Usage**: ```bash accelerate launch [arguments] {training_script} --{training_script-argument-1} --{training_script-argument-2} ... ``` **Positional Arguments**: - `{training_script}` -- The full path to the script to be launched in parallel - `--{training_script-argument-1}` -- Arguments of the training script **Optional Arguments**: * `-h`, `--help` (`bool`) -- Show a help message and exit * `--config_file CONFIG_FILE` (`str`)-- The config file to use for the default values in the launching script. * `-m`, `--module` (`bool`) -- Change each process to interpret the launch script as a Python module, executing with the same behavior as 'python -m'. * `--no_python` (`bool`) -- Skip prepending the training script with 'python' - just execute it directly. Useful when the script is not a Python script. * `--debug` (`bool`) -- Whether to print out the torch.distributed stack trace when something fails. * `-q`, `--quiet` (`bool`) -- Silence subprocess errors from the launch stack trace to only show the relevant tracebacks. (Only applicable to DeepSpeed and single-process configurations). The rest of these arguments are configured through `accelerate config` and are read in from the specified `--config_file` (or default configuration) for their values. They can also be passed in manually. **Hardware Selection Arguments**: * `--cpu` (`bool`) -- Whether or not to force the training on the CPU. * `--multi_gpu` (`bool`) -- Whether or not this should launch a distributed GPU training. * `--tpu` (`bool`) -- Whether or not this should launch a TPU training. **Resource Selection Arguments**: The following arguments are useful for fine-tuning how available hardware should be used * `--mixed_precision {no,fp16,bf16,fp8}` (`str`) -- Whether or not to use mixed precision training. Choose between FP16 and BF16 (bfloat16) training. BF16 training is only supported on Nvidia Ampere GPUs and PyTorch 1.10 or later. * `--num_processes NUM_PROCESSES` (`int`) -- The total number of processes to be launched in parallel. * `--num_machines NUM_MACHINES` (`int`) -- The total number of machines used in this training. * `--num_cpu_threads_per_process NUM_CPU_THREADS_PER_PROCESS` (`int`) -- The number of CPU threads per process. Can be tuned for optimal performance. * `--enable_cpu_affinity` (`bool`) -- Whether or not CPU affinity and balancing should be enabled. Currently only supported on NVIDIA hardware. **Training Paradigm Arguments**: The following arguments are useful for selecting which training paradigm to use. * `--use_deepspeed` (`bool`) -- Whether or not to use DeepSpeed for training. * `--use_fsdp` (`bool`) -- Whether or not to use FullyShardedDataParallel for training. * `--use_megatron_lm` (`bool`) -- Whether or not to use Megatron-LM for training. **Distributed GPU Arguments**: The following arguments are only useful when `multi_gpu` is passed or multi-gpu training is configured through `accelerate config`: * `--gpu_ids` (`str`) -- What GPUs (by id) should be used for training on this machine as a comma-separated list * `--same_network` (`bool`) -- Whether all machines used for multinode training exist on the same local network. * `--machine_rank` (`int`) -- The rank of the machine on which this script is launched. * `--main_process_ip` (`str`) -- The IP address of the machine of rank 0. * `--main_process_port` (`int`) -- The port to use to communicate with the machine of rank 0. * `-t`, `--tee` (`str`) -- Tee std streams into a log file and also to console. * `--log_dir` (`str`) -- Base directory to use for log files when using torchrun/torch.distributed.run as launcher. Use with --tee to redirect std streams info log files. * `--role` (`str`) -- User-defined role for the workers. * `--rdzv_backend` (`str`) -- The rendezvous method to use, such as 'static' (the default) or 'c10d' * `--rdzv_conf` (`str`) -- Additional rendezvous configuration (=,=,...). * `--max_restarts` (`int`) -- Maximum number of worker group restarts before failing. * `--monitor_interval` (`int`) -- Interval, in seconds, to monitor the state of workers. **TPU Arguments**: The following arguments are only useful when `tpu` is passed or TPU training is configured through `accelerate config`: * `--tpu_cluster` (`bool`) -- Whether to use a GCP TPU pod for training. * `--tpu_use_sudo` (`bool`) -- Whether to use `sudo` when running the TPU training script in each pod. * `--vm` (`str`) -- List of single Compute VM instance names. If not provided we assume usage of instance groups. For TPU pods. * `--env` (`str`) -- List of environment variables to set on the Compute VM instances. For TPU pods. * `--main_training_function` (`str`) -- The name of the main function to be executed in your script (only for TPU training). * `--downcast_bf16` (`bool`) -- Whether when using bf16 precision on TPUs if both float and double tensors are cast to bfloat16 or if double tensors remain as float32. **DeepSpeed Arguments**: The following arguments are only useful when `use_deepspeed` is passed or `deepspeed` is configured through `accelerate config`: * `--deepspeed_config_file` (`str`) -- DeepSpeed config file. * `--zero_stage` (`int`) -- DeepSpeed's ZeRO optimization stage. * `--offload_optimizer_device` (`str`) -- Decides where (none|cpu|nvme) to offload optimizer states. * `--offload_param_device` (`str`) -- Decides where (none|cpu|nvme) to offload parameters. * `--offload_optimizer_nvme_path` (`str`) -- Decides Nvme Path to offload optimizer states. * `--gradient_accumulation_steps` (`int`) -- No of gradient_accumulation_steps used in your training script. * `--gradient_clipping` (`float`) -- Gradient clipping value used in your training script. * `--zero3_init_flag` (`str`) -- Decides Whether (true|false) to enable `deepspeed.zero.Init` for constructing massive models. Only applicable with DeepSpeed ZeRO Stage-3. * `--zero3_save_16bit_model` (`str`) -- Decides Whether (true|false) to save 16-bit model weights when using ZeRO Stage-3. Only applicable with DeepSpeed ZeRO Stage-3. * `--deepspeed_hostfile` (`str`) -- DeepSpeed hostfile for configuring multi-node compute resources. * `--deepspeed_exclusion_filter` (`str`) -- DeepSpeed exclusion filter string when using multi-node setup. * `--deepspeed_inclusion_filter` (`str`) -- DeepSpeed inclusion filter string when using multi-node setup. * `--deepspeed_multinode_launcher` (`str`) -- DeepSpeed multi-node launcher to use. * `--deepspeed_moe_layer_cls_names` (`str`) -- comma-separated list of transformer MoE layer class names (case-sensitive) to wrap, e.g, `MixtralSparseMoeBlock` `Qwen2MoeSparseMoeBlock`, `JetMoEAttention,JetMoEBlock` **Fully Sharded Data Parallelism Arguments**: The following arguments are only useful when `use_fsdp` is passed or Fully Sharded Data Parallelism is configured through `accelerate config`: * `--fsdp_offload_params` (`str`) -- Decides Whether (true|false) to offload parameters and gradients to CPU. * `--fsdp_min_num_params` (`int`) -- FSDP's minimum number of parameters for Default Auto Wrapping. * `--fsdp_sharding_strategy` (`int`) -- FSDP's Sharding Strategy. * `--fsdp_auto_wrap_policy` (`str`) -- FSDP's auto wrap policy. * `--fsdp_transformer_layer_cls_to_wrap` (`str`) -- Transformer layer class name (case-sensitive) to wrap, e.g, `BertLayer`, `GPTJBlock`, `T5Block` ... * `--fsdp_backward_prefetch_policy` (`str`) -- FSDP's backward prefetch policy. * `--fsdp_state_dict_type` (`str`) -- FSDP's state dict type. * `--fsdp_forward_prefetch` (`str`) -- FSDP forward prefetch. * `--fsdp_use_orig_params` (`str`) -- If True, allows non-uniform `requires_grad` mixed in a FSDP unit. * `--fsdp_cpu_ram_efficient_loading` (`str`) -- If true, only the first process loads the pretrained model checkpoint while all other processes have empty weights. When using this, `--fsdp_sync_module_states` needs to True. * `--fsdp_sync_module_states` (`str`) -- If true, each individually wrapped FSDP unit will broadcast module parameters from rank 0. * `--fsdp_activation_checkpointing` (`bool`) -- Decides Whether intermediate activations are freed during the forward pass, and a checkpoint is left as a placeholder **Megatron-LM Arguments**: The following arguments are only useful when `use_megatron_lm` is passed or Megatron-LM is configured through `accelerate config`: * `--megatron_lm_tp_degree` (``) -- Megatron-LM's Tensor Parallelism (TP) degree. * `--megatron_lm_pp_degree` (``) -- Megatron-LM's Pipeline Parallelism (PP) degree. * `--megatron_lm_num_micro_batches` (``) -- Megatron-LM's number of micro batches when PP degree > 1. * `--megatron_lm_sequence_parallelism` (``) -- Decides Whether (true|false) to enable Sequence Parallelism when TP degree > 1. * `--megatron_lm_recompute_activations` (``) -- Decides Whether (true|false) to enable Selective Activation Recomputation. * `--megatron_lm_use_distributed_optimizer` (``) -- Decides Whether (true|false) to use distributed optimizer which shards optimizer state and gradients across Data Parallel (DP) ranks. * `--megatron_lm_gradient_clipping` (``) -- Megatron-LM's gradient clipping value based on global L2 Norm (0 to disable). **FP8 Arguments**: * `--fp8_backend` (`str`) -- Choose a backend to train with FP8 (`te` or `msamp`) * `--fp8_use_autocast_during_eval` (`bool`) -- Whether to use FP8 autocast during eval mode (useful only when `--fp8_backend=te` is passed). Generally better metrics are found when this is not passed. * `--fp8_margin` (`int`) -- The margin to use for the gradient scaling (useful only when `--fp8_backend=te` is passed). * `--fp8_interval` (`int`) -- The interval to use for how often the scaling factor is recomputed (useful only when `--fp8_backend=te` is passed). * `--fp8_format` (`str`) -- The format to use for the FP8 recipe (useful only when `--fp8_backend=te` is passed). * `--fp8_amax_history_len` (`int`) -- The length of the history to use for the scaling factor computation (useful only when `--fp8_backend=te` is passed). * `--fp8_amax_compute_algo` (`str`) -- The algorithm to use for the scaling factor computation. (useful only when `--fp8_backend=te` is passed). * `--fp8_override_linear_precision` (`Tuple[bool, bool, bool]`) -- Whether or not to execute `fprop`, `dgrad`, and `wgrad` GEMMS in higher precision. * `--fp8_opt_level` (`str`) -- What level of 8-bit collective communication should be used with MS-AMP (useful only when `--fp8_backend=msamp` is passed) **AWS SageMaker Arguments**: The following arguments are only useful when training in SageMaker * `--aws_access_key_id AWS_ACCESS_KEY_ID` (`str`) -- The AWS_ACCESS_KEY_ID used to launch the Amazon SageMaker training job * `--aws_secret_access_key AWS_SECRET_ACCESS_KEY` (`str`) -- The AWS_SECRET_ACCESS_KEY used to launch the Amazon SageMaker training job ## accelerate estimate-memory **Command**: `accelerate estimate-memory` or `accelerate-estimate-memory` or `python -m accelerate.commands.estimate` Estimates the total vRAM a particular model hosted on the Hub needs to be loaded in with an estimate for training. Requires that `huggingface_hub` be installed. When performing inference, typically add ≤20% to the result as overall allocation [as referenced here](https://blog.eleuther.ai/transformer-math/). We will have more extensive estimations in the future that will automatically be included in the calculation. **Usage**: ```bash accelerate estimate-memory {MODEL_NAME} --library_name {LIBRARY_NAME} --dtypes {dtype_1} {dtype_2} ... ``` **Required Arguments**: * `MODEL_NAME` (`str`)-- The model name on the Hugging Face Hub **Optional Arguments**: * `--library_name {timm,transformers}` (`str`) -- The library the model has an integration with, such as `transformers`, needed only if this information is not stored on the Hub * `--dtypes {float32,float16,int8,int4}` (`[{float32,float16,int8,int4} ...]`) -- The dtypes to use for the model, must be one (or many) of `float32`, `float16`, `int8`, and `int4` * `--trust_remote_code` (`bool`) -- Whether or not to allow for custom models defined on the Hub in their own modeling files. This option should only be passed for repositories you trust and in which you have read the code, as it will execute code present on the Hub on your local machine. ## accelerate tpu-config `accelerate tpu-config` **Usage**: ```bash accelerate tpu-config [arguments] ``` **Optional Arguments**: * `-h`, `--help` (`bool`) -- Show a help message and exit **Config Arguments**: Arguments that can be configured through `accelerate config`. * `--config_file` (`str`) -- Path to the config file to use for accelerate. * `--tpu_name` (`str`) -- The name of the TPU to use. If not specified, will use the TPU specified in the config file. * `--tpu_zone` (`str`) -- The zone of the TPU to use. If not specified, will use the zone specified in the config file. **TPU Arguments**: Arguments for options ran inside the TPU. * `--command_file` (`str`) -- The path to the file containing the commands to run on the pod on startup. * `--command` (`str`) -- A command to run on the pod. Can be passed multiple times. * `--install_accelerate` (`bool`) -- Whether to install accelerate on the pod. Defaults to False. * `--accelerate_version` (`str`) -- The version of accelerate to install on the pod. If not specified, will use the latest pypi version. Specify 'dev' to install from GitHub. * `--debug` (`bool`) -- If set, will print the command that would be run instead of running it. ## accelerate test `accelerate test` or `accelerate-test` Runs `accelerate/test_utils/test_script.py` to verify that 🤗 Accelerate has been properly configured on your system and runs. **Usage**: ```bash accelerate test [arguments] ``` **Optional Arguments**: * `--config_file CONFIG_FILE` (`str`) -- The path to use to store the config file. Will default to a file named default_config.yaml in the cache location, which is the content of the environment `HF_HOME` suffixed with 'accelerate', or if you don't have such an environment variable, your cache directory (`~/.cache` or the content of `XDG_CACHE_HOME`) suffixed with `huggingface`. * `-h`, `--help` (`bool`) -- Show a help message and exit accelerate-1.14.0/docs/source/package_reference/deepspeed.md000066400000000000000000000023761521253476100240240ustar00rootroot00000000000000 # DeepSpeed utilities ## DeepSpeedPlugin ## get_active_deepspeed_plugin [[autodoc]] utils.get_active_deepspeed_plugin [[autodoc]] utils.DeepSpeedPlugin [[autodoc]] utils.deepspeed.DummyScheduler ## DeepSpeedEnginerWrapper [[autodoc]] utils.deepspeed.DeepSpeedEngineWrapper ## DeepSpeedOptimizerWrapper [[autodoc]] utils.deepspeed.DeepSpeedOptimizerWrapper ## DeepSpeedSchedulerWrapper [[autodoc]] utils.deepspeed.DeepSpeedSchedulerWrapper ## DummyOptim [[autodoc]] utils.deepspeed.DummyOptim ## DummyScheduleraccelerate-1.14.0/docs/source/package_reference/fp8.md000066400000000000000000000022111521253476100225470ustar00rootroot00000000000000 # FP8 Below are functions and classes relative to the underlying FP8 implementation ## FP8RecipeKwargs [[autodoc]] utils.FP8RecipeKwargs ## convert_model [[autodoc]] utils.convert_model ## has_transformer_engine_layers [[autodoc]] utils.has_transformer_engine_layers ## contextual_fp8_autocast [[autodoc]] utils.contextual_fp8_autocast ## apply_fp8_autowrap [[autodoc]] utils.apply_fp8_autowrap accelerate-1.14.0/docs/source/package_reference/fsdp.md000066400000000000000000000025571521253476100230230ustar00rootroot00000000000000 # Fully Sharded Data Parallel utilities ## enable_fsdp_ram_efficient_loading [[autodoc]] utils.enable_fsdp_ram_efficient_loading ## disable_fsdp_ram_efficient_loading [[autodoc]] utils.disable_fsdp_ram_efficient_loading ## merge_fsdp_weights [[autodoc]] utils.merge_fsdp_weights ## FullyShardedDataParallelPlugin [[autodoc]] utils.FullyShardedDataParallelPlugin ## fsdp2_load_full_state_dict [[autodoc]] utils.fsdp2_load_full_state_dict ## fsdp2_switch_optimizer_parameters [[autodoc]] utils.fsdp2_switch_optimizer_parameters ## fsdp2_prepare_model [[autodoc]] utils.fsdp2_prepare_model ## fsdp2_prepare_auto_wrap_policy accelerate-1.14.0/docs/source/package_reference/inference.md000066400000000000000000000017661521253476100240260ustar00rootroot00000000000000 # Pipeline parallelism Accelerate supports pipeline parallelism for large-scale training with the PyTorch [torch.distributed.pipelining](https://pytorch.org/docs/stable/distributed.pipelining.html) API. ## prepare_pippy [[autodoc]] inference.prepare_pippy accelerate-1.14.0/docs/source/package_reference/kwargs.md000066400000000000000000000024671521253476100233650ustar00rootroot00000000000000 # Kwargs handlers The following objects can be passed to the main [`Accelerator`] to customize how some PyTorch objects related to distributed training or mixed precision are created. ## AutocastKwargs [[autodoc]] AutocastKwargs ## DistributedDataParallelKwargs [[autodoc]] DistributedDataParallelKwargs ## FP8RecipeKwargs [[autodoc]] utils.FP8RecipeKwargs ## ProfileKwargs [[autodoc]] utils.ProfileKwargs ## GradScalerKwargs [[autodoc]] GradScalerKwargs ## InitProcessGroupKwargs [[autodoc]] InitProcessGroupKwargs ## KwargsHandler [[autodoc]] utils.KwargsHandler accelerate-1.14.0/docs/source/package_reference/launchers.md000066400000000000000000000016641521253476100240510ustar00rootroot00000000000000 # Launchers Functions for launching training on distributed processes. ## notebook_launcher [[autodoc]] accelerate.notebook_launcher ## debug_launcher [[autodoc]] accelerate.debug_launcheraccelerate-1.14.0/docs/source/package_reference/logging.md000066400000000000000000000016561521253476100235140ustar00rootroot00000000000000 # Logging Refer to the [Troubleshooting guide](../usage_guides/troubleshooting#logging) or to the example below to learn how to use Accelerate's logger. [[autodoc]] logging.get_loggeraccelerate-1.14.0/docs/source/package_reference/megatron_lm.md000066400000000000000000000024111521253476100243600ustar00rootroot00000000000000 # Megatron-LM utilities ## MegatronLMPlugin [[autodoc]] utils.MegatronLMPlugin ## MegatronLMDummyScheduler [[autodoc]] utils.MegatronLMDummyScheduler ## MegatronLMDummyDataLoader [[autodoc]] utils.MegatronLMDummyDataLoader ## AbstractTrainStep [[autodoc]] utils.AbstractTrainStep ## GPTTrainStep [[autodoc]] utils.GPTTrainStep ## BertTrainStep [[autodoc]] utils.BertTrainStep ## T5TrainStep [[autodoc]] utils.T5TrainStep ## avg_losses_across_data_parallel_group [[autodoc]] utils.avg_losses_across_data_parallel_group accelerate-1.14.0/docs/source/package_reference/state.md000066400000000000000000000023031521253476100231740ustar00rootroot00000000000000 # Stateful Classes Below are variations of a [singleton class](https://en.wikipedia.org/wiki/Singleton_pattern) in the sense that all instances share the same state, which is initialized on the first instantiation. These classes are immutable and store information about certain configurations or states. ## PartialState [[autodoc]] state.PartialState ## AcceleratorState [[autodoc]] state.AcceleratorState ## GradientState [[autodoc]] state.GradientStateaccelerate-1.14.0/docs/source/package_reference/torch_wrappers.md000066400000000000000000000026341521253476100251250ustar00rootroot00000000000000 # DataLoaders, Optimizers, and Schedulers The internal classes Accelerate uses to prepare objects for distributed training when calling [`~Accelerator.prepare`]. ## DataLoader utilities [[autodoc]] data_loader.prepare_data_loader [[autodoc]] data_loader.skip_first_batches ## BatchSamplerShard [[autodoc]] data_loader.BatchSamplerShard ## IterableDatasetShard [[autodoc]] data_loader.IterableDatasetShard ## DataLoaderShard [[autodoc]] data_loader.DataLoaderShard ## DataLoaderDispatcher [[autodoc]] data_loader.DataLoaderDispatcher ## AcceleratedOptimizer [[autodoc]] optimizer.AcceleratedOptimizer ## AcceleratedScheduler [[autodoc]] scheduler.AcceleratedScheduleraccelerate-1.14.0/docs/source/package_reference/tracking.md000066400000000000000000000025541521253476100236660ustar00rootroot00000000000000 # Experiment Trackers ## GeneralTracker [[autodoc]] tracking.GeneralTracker ## TensorBoardTracker [[autodoc]] tracking.TensorBoardTracker - __init__ ## WandBTracker [[autodoc]] tracking.WandBTracker - __init__ ## Trackio [[autodoc]] tracking.TrackioTracker - __init__ ## CometMLTracker [[autodoc]] tracking.CometMLTracker - __init__ ## AimTracker [[autodoc]] tracking.AimTracker - __init__ ## MLflowTracker [[autodoc]] tracking.MLflowTracker - __init__ ## ClearMLTracker [[autodoc]] tracking.ClearMLTracker - __init__ ## SwanLabTracker [[autodoc]] tracking.SwanLabTracker - __init__ accelerate-1.14.0/docs/source/package_reference/utilities.md000066400000000000000000000142041521253476100240720ustar00rootroot00000000000000 # Utility functions and classes Below are a variety of utility functions that 🤗 Accelerate provides, broken down by use-case. ## Constants Constants used throughout 🤗 Accelerate for reference The following are constants used when utilizing [`Accelerator.save_state`] `utils.MODEL_NAME`: `"pytorch_model"` `utils.OPTIMIZER_NAME`: `"optimizer"` `utils.RNG_STATE_NAME`: `"random_states"` `utils.SCALER_NAME`: `"scaler.pt` `utils.SCHEDULER_NAME`: `"scheduler` The following are constants used when utilizing [`Accelerator.save_model`] `utils.WEIGHTS_NAME`: `"pytorch_model.bin"` `utils.SAFE_WEIGHTS_NAME`: `"model.safetensors"` `utils.WEIGHTS_INDEX_NAME`: `"pytorch_model.bin.index.json"` `utils.SAFE_WEIGHTS_INDEX_NAME`: `"model.safetensors.index.json"` ## Data Classes These are basic dataclasses used throughout 🤗 Accelerate and they can be passed in as parameters. ### Standalone These are standalone dataclasses used for checks, such as the type of distributed system being used [[autodoc]] utils.ComputeEnvironment [[autodoc]] utils.DistributedType [[autodoc]] utils.DynamoBackend [[autodoc]] utils.LoggerType [[autodoc]] utils.PrecisionType [[autodoc]] utils.RNGType [[autodoc]] utils.SageMakerDistributedType ### Kwargs These are configurable arguments for specific interactions throughout the PyTorch ecosystem that Accelerate handles under the hood. [[autodoc]] utils.AutocastKwargs [[autodoc]] utils.DistributedDataParallelKwargs [[autodoc]] utils.FP8RecipeKwargs [[autodoc]] utils.GradScalerKwargs [[autodoc]] utils.InitProcessGroupKwargs [[autodoc]] utils.KwargsHandler ## Plugins These are plugins that can be passed to the [`Accelerator`] object. While they are defined elsewhere in the documentation, for convenience all of them are available to see here: [[autodoc]] utils.DeepSpeedPlugin [[autodoc]] utils.FullyShardedDataParallelPlugin [[autodoc]] utils.GradientAccumulationPlugin [[autodoc]] utils.MegatronLMPlugin [[autodoc]] utils.TorchDynamoPlugin ## Configurations These are classes which can be configured and passed through to the appropriate integration [[autodoc]] utils.BnbQuantizationConfig [[autodoc]] utils.DataLoaderConfiguration [[autodoc]] utils.ProjectConfiguration ## Environmental Variables These are environmental variables that can be enabled for different use cases * `ACCELERATE_DEBUG_MODE` (`str`): Whether to run accelerate in debug mode. More info available [here](../usage_guides/debug.md). ## Data Manipulation and Operations These include data operations that mimic the same `torch` ops but can be used on distributed processes. [[autodoc]] utils.broadcast [[autodoc]] utils.broadcast_object_list [[autodoc]] utils.concatenate [[autodoc]] utils.convert_outputs_to_fp32 [[autodoc]] utils.convert_to_fp32 [[autodoc]] utils.gather [[autodoc]] utils.gather_object [[autodoc]] utils.get_grad_scaler [[autodoc]] utils.get_mixed_precision_context_manager [[autodoc]] utils.listify [[autodoc]] utils.pad_across_processes [[autodoc]] utils.recursively_apply [[autodoc]] utils.reduce [[autodoc]] utils.send_to_device [[autodoc]] utils.slice_tensors ## Environment Checks These functionalities check the state of the current working environment including information about the operating system itself, what it can support, and if particular dependencies are installed. [[autodoc]] utils.is_bf16_available [[autodoc]] utils.is_mps_available [[autodoc]] utils.is_npu_available [[autodoc]] utils.is_torch_version [[autodoc]] utils.is_torch_xla_available [[autodoc]] utils.is_xpu_available ## Environment Manipulation [[autodoc]] utils.patch_environment [[autodoc]] utils.clear_environment [[autodoc]] utils.write_basic_config When setting up 🤗 Accelerate for the first time, rather than running `accelerate config` [~utils.write_basic_config] can be used as an alternative for quick configuration. [[autodoc]] utils.set_numa_affinity [[autodoc]] utils.environment.override_numa_affinity [[autodoc]] utils.purge_accelerate_environment ## Memory [[autodoc]] utils.find_executable_batch_size ## Modeling These utilities relate to interacting with PyTorch models [[autodoc]] utils.calculate_maximum_sizes [[autodoc]] utils.compute_module_sizes [[autodoc]] utils.extract_model_from_parallel [[autodoc]] utils.get_balanced_memory [[autodoc]] utils.get_max_layer_size [[autodoc]] utils.infer_auto_device_map [[autodoc]] utils.load_checkpoint_in_model [[autodoc]] utils.load_offloaded_weights [[autodoc]] utils.load_state_dict [[autodoc]] utils.offload_state_dict [[autodoc]] utils.retie_parameters [[autodoc]] utils.set_module_tensor_to_device [[autodoc]] utils.get_module_children_bottom_up ## Parallel These include general utilities that should be used when working in parallel. [[autodoc]] utils.extract_model_from_parallel [[autodoc]] utils.save [[autodoc]] utils.load [[autodoc]] utils.wait_for_everyone ## Random These utilities relate to setting and synchronizing of all the random states. [[autodoc]] utils.set_seed [[autodoc]] utils.synchronize_rng_state [[autodoc]] utils.synchronize_rng_states ## PyTorch XLA These include utilities that are useful while using PyTorch with XLA. [[autodoc]] utils.install_xla ## Loading model weights These include utilities that are useful to load checkpoints. [[autodoc]] utils.load_checkpoint_in_model ## Quantization These include utilities that are useful to quantize model. [[autodoc]] utils.load_and_quantize_model accelerate-1.14.0/docs/source/quicktour.md000066400000000000000000000265461521253476100205100ustar00rootroot00000000000000 # Quicktour There are many ways to launch and run your code depending on your training environment ([torchrun](https://pytorch.org/docs/stable/elastic/run.html), [DeepSpeed](https://www.deepspeed.ai/), etc.) and available hardware. Accelerate offers a unified interface for launching and training on different distributed setups, allowing you to focus on your PyTorch training code instead of the intricacies of adapting your code to these different setups. This allows you to easily scale your PyTorch code for training and inference on distributed setups with hardware like GPUs and TPUs. Accelerate also provides Big Model Inference to make loading and running inference with really large models that usually don't fit in memory more accessible. This quicktour introduces the three main features of Accelerate: * a unified command line launching interface for distributed training scripts * a training library for adapting PyTorch training code to run on different distributed setups * Big Model Inference ## Unified launch interface Accelerate automatically selects the appropriate configuration values for any given distributed training framework (DeepSpeed, FSDP, etc.) through a unified configuration file generated from the [`accelerate config`](package_reference/cli#accelerate-config) command. You could also pass the configuration values explicitly to the command line which is helpful in certain situations like if you're using SLURM. But in most cases, you should always run [`accelerate config`](package_reference/cli#accelerate-config) first to help Accelerate learn about your training setup. ```bash accelerate config ``` The [`accelerate config`](package_reference/cli#accelerate-config) command creates and saves a default_config.yaml file in Accelerate's cache folder. This file stores the configuration for your training environment, which helps Accelerate correctly launch your training script based on your machine. After you've configured your environment, you can test your setup with [`accelerate test`](package_reference/cli#accelerate-test), which launches a short script to test the distributed environment. ```bash accelerate test ``` > [!TIP] > Add `--config_file` to the `accelerate test` or `accelerate launch` command to specify the location of the configuration file if it is saved in a non-default location like the cache. Once your environment is set up, launch your training script with [`accelerate launch`](package_reference/cli#accelerate-launch)! ```bash accelerate launch path_to_script.py --args_for_the_script ``` To learn more, check out the [Launch distributed code](basic_tutorials/launch) tutorial for more information about launching your scripts. We also have a [configuration zoo](https://github.com/huggingface/accelerate/blob/main/examples/config_yaml_templates) which showcases a number of premade **minimal** example configurations for a variety of setups you can run. ## Adapt training code The next main feature of Accelerate is the [`Accelerator`] class which adapts your PyTorch code to run on different distributed setups. You only need to add a few lines of code to your training script to enable it to run on multiple GPUs or TPUs. ```diff + from accelerate import Accelerator + accelerator = Accelerator() + device = accelerator.device + model, optimizer, training_dataloader, scheduler = accelerator.prepare( + model, optimizer, training_dataloader, scheduler + ) for batch in training_dataloader: optimizer.zero_grad() inputs, targets = batch - inputs = inputs.to(device) - targets = targets.to(device) outputs = model(inputs) loss = loss_function(outputs, targets) + accelerator.backward(loss) optimizer.step() scheduler.step() ``` 1. Import and instantiate the [`Accelerator`] class at the beginning of your training script. The [`Accelerator`] class initializes everything necessary for distributed training, and it automatically detects your training environment (a single machine with a GPU, a machine with several GPUs, several machines with multiple GPUs or a TPU, etc.) based on how the code was launched. ```python from accelerate import Accelerator accelerator = Accelerator() ``` 2. Remove calls like `.cuda()` on your model and input data. The [`Accelerator`] class automatically places these objects on the appropriate device for you. > [!WARNING] > This step is *optional* but it is considered best practice to allow Accelerate to handle device placement. You could also deactivate automatic device placement by passing `device_placement=False` when initializing the [`Accelerator`]. If you want to explicitly place objects on a device with `.to(device)`, make sure you use `accelerator.device` instead. For example, if you create an optimizer before placing a model on `accelerator.device`, training fails on a TPU. > [!WARNING] > Accelerate does not use non-blocking transfers by default for its automatic device placement, which can result in potentially unwanted CUDA synchronizations. You can enable non-blocking transfers by passing a [`~utils.dataclasses.DataLoaderConfiguration`] with `non_blocking=True` set as the `dataloader_config` when initializing the [`Accelerator`]. As usual, non-blocking transfers will only work if the dataloader also has `pin_memory=True` set. Be wary that using non-blocking transfers from GPU to CPU may cause incorrect results if it results in CPU operations being performed on non-ready tensors. ```py device = accelerator.device ``` 3. Pass all relevant PyTorch objects for training (optimizer, model, dataloader(s), learning rate scheduler) to the [`~Accelerator.prepare`] method as soon as they're created. This method wraps the model in a container optimized for your distributed setup, uses Accelerates version of the optimizer and scheduler, and creates a sharded version of your dataloader for distribution across GPUs or TPUs. ```python model, optimizer, train_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, lr_scheduler ) ``` 4. Replace `loss.backward()` with [`~Accelerator.backward`] to use the correct `backward()` method for your training setup. ```py accelerator.backward(loss) ``` Read [Accelerate’s internal mechanisms](concept_guides/internal_mechanism) guide to learn more details about how Accelerate adapts your code. ### Distributed evaluation To perform distributed evaluation, pass your validation dataloader to the [`~Accelerator.prepare`] method: ```python validation_dataloader = accelerator.prepare(validation_dataloader) ``` Each device in your distributed setup only receives a part of the evaluation data, which means you should group your predictions together with the [`~Accelerator.gather_for_metrics`] method. This method requires all tensors to be the same size on each process, so if your tensors have different sizes on each process (for instance when dynamically padding to the maximum length in a batch), you should use the [`~Accelerator.pad_across_processes`] method to pad you tensor to the largest size across processes. Note that the tensors needs to be 1D and that we concatenate the tensors along the first dimension. ```python for inputs, targets in validation_dataloader: predictions = model(inputs) # Gather all predictions and targets all_predictions, all_targets = accelerator.gather_for_metrics((predictions, targets)) # Example of use with a *Datasets.Metric* metric.add_batch(all_predictions, all_targets) ``` For more complex cases (e.g. 2D tensors, don't want to concatenate tensors, dict of 3D tensors), you can pass `use_gather_object=True` in `gather_for_metrics`. This will return the list of objects after gathering. Note that using it with GPU tensors is not well supported and inefficient. > [!TIP] > Data at the end of a dataset may be duplicated so the batch can be equally divided among all workers. The [`~Accelerator.gather_for_metrics`] method automatically removes the duplicated data to calculate a more accurate metric. ## Big Model Inference Accelerate's Big Model Inference has two main features, [`~accelerate.init_empty_weights`] and [`~accelerate.load_checkpoint_and_dispatch`], to load large models for inference that typically don't fit into memory. > [!TIP] > Take a look at the [Handling big models for inference](concept_guides/big_model_inference) guide for a better understanding of how Big Model Inference works under the hood. ### Empty weights initialization The [`~accelerate.init_empty_weights`] context manager initializes models of any size by creating a *model skeleton* and moving and placing parameters each time they're created to PyTorch's [**meta**](https://pytorch.org/docs/main/meta.html) device. This way, not all weights are immediately loaded and only a small part of the model is loaded into memory at a time. For example, loading an empty [Mixtral-8x7B](https://huggingface.co/mistralai/Mixtral-8x7B-Instruct-v0.1) model takes significantly less memory than fully loading the models and weights on the CPU. ```py from accelerate import init_empty_weights from transformers import AutoConfig, AutoModelForCausalLM config = AutoConfig.from_pretrained("mistralai/Mixtral-8x7B-Instruct-v0.1") with init_empty_weights(): model = AutoModelForCausalLM.from_config(config) ``` ### Load and dispatch weights The [`~accelerate.load_checkpoint_and_dispatch`] function loads full or sharded checkpoints into the empty model, and automatically distribute weights across all available devices. The `device_map` parameter determines where to place each model layer, and specifying `"auto"` places them on the GPU first, then the CPU, and finally the hard drive as memory-mapped tensors if there's still not enough memory. Use the `no_split_module_classes` parameter to indicate which modules shouldn't be split across devices (typically those with a residual connection). ```py from accelerate import load_checkpoint_and_dispatch model_checkpoint = "your-local-model-folder" model = load_checkpoint_and_dispatch( model, checkpoint=model_checkpoint, device_map="auto", no_split_module_classes=['Block'] ) ``` ## Next steps Now that you've been introduced to the main Accelerate features, your next steps could include: * Check out the [tutorials](basic_tutorials/overview) for a gentle walkthrough of Accelerate. This is especially useful if you're new to distributed training and the library. * Dive into the [guides](usage_guides/explore) to see how to use Accelerate for specific use-cases. * Deepen your conceptual understanding of how Accelerate works internally by reading the [concept guides](concept_guides/internal_mechanism). * Look up classes and commands in the [API reference](package_reference/accelerator) to see what parameters and options are available. accelerate-1.14.0/docs/source/usage_guides/000077500000000000000000000000001521253476100205675ustar00rootroot00000000000000accelerate-1.14.0/docs/source/usage_guides/big_modeling.md000066400000000000000000000133731521253476100235370ustar00rootroot00000000000000 # Big Model Inference One of the biggest advancements Accelerate provides is [Big Model Inference](../concept_guides/big_model_inference), which allows you to perform inference with models that don't fully fit on your graphics card. This tutorial will show you how to use Big Model Inference in Accelerate and the Hugging Face ecosystem. ## Accelerate A typical workflow for loading a PyTorch model is shown below. `ModelClass` is a model that exceeds the GPU memory of your device (mps or cuda or xpu). ```py import torch my_model = ModelClass(...) state_dict = torch.load(checkpoint_file) my_model.load_state_dict(state_dict) ``` With Big Model Inference, the first step is to init an empty skeleton of the model with the `init_empty_weights` context manager. This doesn't require any memory because `my_model` is "parameterless". ```py from accelerate import init_empty_weights with init_empty_weights(): my_model = ModelClass(...) ``` Next, the weights are loaded into the model for inference. The [`load_checkpoint_and_dispatch`] method loads a checkpoint inside your empty model and dispatches the weights for each layer across all available devices, starting with the fastest devices (GPU, MPS, XPU, NPU, MLU, SDAA, MUSA) first before moving to the slower ones (CPU and hard drive). Setting `device_map="auto"` automatically fills all available space on the GPU(s) first, then the CPU, and finally, the hard drive (the absolute slowest option) if there is still not enough memory. > [!TIP] > Refer to the [Designing a device map](../concept_guides/big_model_inference#designing-a-device-map) guide for more details on how to design your own device map. ```py from accelerate import load_checkpoint_and_dispatch model = load_checkpoint_and_dispatch( model, checkpoint=checkpoint_file, device_map="auto" ) ``` If there are certain “chunksâ€� of layers that shouldn’t be split, pass them to `no_split_module_classes` (see [here](../concept_guides/big_model_inference#loading-weights) for more details). A models weights can also be sharded into multiple checkpoints to save memory, such as when the `state_dict` doesn't fit in memory (see [here](../concept_guides/big_model_inference#sharded-checkpoints) for more details). Now that the model is fully dispatched, you can perform inference. ```py input = torch.randn(2,3) device_type = next(iter(model.parameters())).device.type input = input.to(device_type) output = model(input) ``` Each time an input is passed through a layer, it is sent from the CPU to the GPU (or disk to CPU to GPU), the output is calculated, and the layer is removed from the GPU going back down the line. While this adds some overhead to inference, it enables you to run any size model on your system, as long as the largest layer fits on your GPU. Multiple GPUs, or "model parallelism", can be utilized but only one GPU will be active at any given moment. This forces the GPU to wait for the previous GPU to send it the output. You should launch your script normally with Python instead of other tools like torchrun and accelerate launch. > [!TIP] > You may also be interested in *pipeline parallelism* which utilizes all available GPUs at once, instead of only having one GPU active at a time. This approach is less flexible though. For more details, refer to the [Memory-efficient pipeline parallelism](./distributed_inference#memory-efficient-pipeline-parallelism-experimental) guide. Take a look at a full example of Big Model Inference below. ```py import torch from accelerate import init_empty_weights, load_checkpoint_and_dispatch with init_empty_weights(): model = MyModel(...) model = load_checkpoint_and_dispatch( model, checkpoint=checkpoint_file, device_map="auto" ) input = torch.randn(2,3) device_type = next(iter(model.parameters())).device.type input = input.to(device_type) output = model(input) ``` ## Hugging Face ecosystem Other libraries in the Hugging Face ecosystem, like Transformers or Diffusers, supports Big Model Inference in their [`~transformers.PreTrainedModel.from_pretrained`] constructors. You just need to add `device_map="auto"` in [`~transformers.PreTrainedModel.from_pretrained`] to enable Big Model Inference. For example, load Big Sciences T0pp 11 billion parameter model with Big Model Inference. ```py from transformers import AutoModelForSeq2SeqLM model = AutoModelForSeq2SeqLM.from_pretrained("bigscience/T0pp", device_map="auto") ``` After loading the model, the empty init and smart dispatch steps from before are executed and the model is fully ready to make use of all the resources in your machine. Through these constructors, you can also save more memory by specifying the `torch_dtype` parameter to load a model in a lower precision. ```py from transformers import AutoModelForSeq2SeqLM model = AutoModelForSeq2SeqLM.from_pretrained("bigscience/T0pp", device_map="auto", torch_dtype=torch.float16) ``` ## Next steps For a more detailed explanation of Big Model Inference, make sure to check out the [conceptual guide](../concept_guides/big_model_inference)! accelerate-1.14.0/docs/source/usage_guides/checkpoint.md000066400000000000000000000075121521253476100232450ustar00rootroot00000000000000 # Checkpointing When training a PyTorch model with Accelerate, you may often want to save and continue a state of training. Doing so requires saving and loading the model, optimizer, RNG generators, and the GradScaler. Inside Accelerate are two convenience functions to achieve this quickly: - Use [`~Accelerator.save_state`] for saving everything mentioned above to a folder location - Use [`~Accelerator.load_state`] for loading everything stored from an earlier `save_state` To further customize where and how states are saved through [`~Accelerator.save_state`] the [`~utils.ProjectConfiguration`] class can be used. For example if `automatic_checkpoint_naming` is enabled each saved checkpoint will be located then at `Accelerator.project_dir/checkpoints/checkpoint_{checkpoint_number}`. It should be noted that the expectation is that those states come from the same training script, they should not be from two separate scripts. - By using [`~Accelerator.register_for_checkpointing`], you can register custom objects to be automatically stored or loaded from the two prior functions, so long as the object has a `state_dict` **and** a `load_state_dict` functionality. This could include objects such as a learning rate scheduler. Below is a brief example using checkpointing to save and reload a state during training: ```python from accelerate import Accelerator import torch accelerator = Accelerator(project_dir="my/save/path") my_scheduler = torch.optim.lr_scheduler.StepLR(my_optimizer, step_size=1, gamma=0.99) my_model, my_optimizer, my_training_dataloader = accelerator.prepare(my_model, my_optimizer, my_training_dataloader) # Register the LR scheduler accelerator.register_for_checkpointing(my_scheduler) # Save the starting state accelerator.save_state() device = accelerator.device my_model.to(device) # Perform training for epoch in range(num_epochs): for batch in my_training_dataloader: my_optimizer.zero_grad() inputs, targets = batch inputs = inputs.to(device) targets = targets.to(device) outputs = my_model(inputs) loss = my_loss_function(outputs, targets) accelerator.backward(loss) my_optimizer.step() my_scheduler.step() # Restore the previous state accelerator.load_state("my/save/path/checkpointing/checkpoint_0") ``` ## Restoring the state of the DataLoader After resuming from a checkpoint, it may also be desirable to resume from a particular point in the active `DataLoader` if the state was saved during the middle of an epoch. You can use [`~Accelerator.skip_first_batches`] to do so. ```python from accelerate import Accelerator accelerator = Accelerator(project_dir="my/save/path") train_dataloader = accelerator.prepare(train_dataloader) accelerator.load_state("my_state") # Assume the checkpoint was saved 100 steps into the epoch skipped_dataloader = accelerator.skip_first_batches(train_dataloader, 100) # After the first iteration, go back to `train_dataloader` # First epoch for batch in skipped_dataloader: # Do something pass # Second epoch for batch in train_dataloader: # Do something pass ``` accelerate-1.14.0/docs/source/usage_guides/compilation.md000066400000000000000000000111301521253476100234230ustar00rootroot00000000000000# Compilation ## Overview Pytorch 2.0 introduced `torch.compile`, a powerful feature that makes PyTorch code run faster by JIT-compiling PyTorch code into optimized kernels. Key features of `torch.compile` include: - **Performance Improvement**: Significantly speeds up model execution by optimizing the computation graph. - **Ease of Use**: Requires minimal code changes to implement, making it highly accessible. - **Compatibility**: Works seamlessly with existing PyTorch code and models. When used with Accelerate, `torch.compile` integrates smoothly into distributed training workflows, allowing you to benefit from both distributed execution and compilation optimizations simultaneously. The first execution of compiled code typically takes longer as it includes the compilation time, but subsequent runs are significantly faster. For optimal performance in different scenarios, `torch.compile` offers various modes like `"default"`, `"reduce-overhead"` (which uses CUDA graphs to further reduce overhead), and `"max-autotune"` (which performs extensive autotuning to find the best kernels for your model). ## Using `torch.compile` with Accelerate Accelerate provides `TorchDynamoPlugin` for easy and seamless integration of `torch.compile` into your training scripts. ```python from accelerate import Accelerator from accelerate.utils import TorchDynamoPlugin # Configure the compilation backend dynamo_plugin = TorchDynamoPlugin( backend="inductor", # Options: "inductor", "aot_eager", "aot_nvfuser", etc. mode="default", # Options: "default", "reduce-overhead", "max-autotune" fullgraph=True, dynamic=False ) # Initialize accelerator with the plugin accelerator = Accelerator(dynamo_plugin=dynamo_plugin) # This will apply torch.compile to your model model = accelerator.prepare(model) ``` It is compatible with all other features and plugins of Accelerate, including mixed precision, distributed training (DDP, FSDP, Deepspeed), etc. ## Regional Compilation Instead of trying to compile the whole model, which usually has a big problem space for optimization. Regional compilation targets repeated blocks of the same class and compiles them sequentially to hit the compiler's cache. For example, in `GPT2LMHeadModel`, the repeated block/class is `GPT2Block`, and can be accessed as `model.transformer.h[0]`. The rest of the model (e.g model.lm_head) is compiled separately. This allows us to speed up the compilation overhead / cold start of models like LLMs and Transformers in general. See for more details. ### How to Use Regional Compilation It can be enabled by setting `use_regional_compilation=True` in the `TorchDynamoPlugin` configuration: ```python # Configure the compilation backend dynamo_plugin = TorchDynamoPlugin( use_regional_compilation=True, ... # other parameters ) # Initialize accelerator with the plugin accelerator = Accelerator(dynamo_plugin=dynamo_plugin) # This will apply compile_regions to your model model = accelerator.prepare(model) ``` You could also use the `accelerate.utils.compile_regions` utility directly the same way you would use `torch.compile`. ### Benefits of Regional Compilation We have conducted extensive benchmarks comparing full compilation and regional compilation using the `torch.compile` feature in PyTorch. The full results are available in the [accelerate repository](https://github.com/huggingface/accelerate/tree/main/benchmarks/torch.compile/regional_compilation). The key findings from our benchmarks are: 1. **Comparable Performance**: Regional compilation delivers performance speedups similar to full compilation, especially for larger models. 2. **Faster Compilation**: Regional compilation significantly reduces the time taken to compile models, making it a more efficient choice for deployment. 3. **Batch Size Impact**: The performance difference between compilation strategies diminishes with larger batch sizes, indicating that the overhead of compilation is less impactful in those scenarios. 4. **Model Size Consideration**: The benefits of regional compilation are more pronounced in larger models, where the compilation time savings can be substantial. 5. **Practical Application**: For real-world applications, regional compilation is a practical choice for optimizing training cold start times, especially when working with large models. ## Conclusion Both full and regional compilation can significantly speed up your models. Regional compilation offers a practical balance between compilation time and runtime performance, especially for training large models with substantial batch sizes. accelerate-1.14.0/docs/source/usage_guides/ddp_comm_hook.md000066400000000000000000000246061521253476100237230ustar00rootroot00000000000000 # DDP Communication Hooks Distributed Data Parallel (DDP) communication hooks provide a generic interface to control how gradients are communicated across workers by overriding the vanilla allreduce in `DistributedDataParallel`. A few built-in communication hooks are provided, and users can easily apply any of these hooks to optimize communication. - **FP16 Compression Hook**: Compresses gradients by casting them to half-precision floating-point format (`torch.float16`), reducing communication overhead. - **BF16 Compression Hook**: Similar to FP16, but uses the Brain Floating Point format (`torch.bfloat16`), which can be more efficient on certain hardware. - **PowerSGD Hook**: An advanced gradient compression algorithm that provides high compression rates and can accelerate bandwidth-bound distributed training. In this tutorial, you will see how to quickly set up DDP communication hooks and perform training with the utilities provided in Accelerate, which can be as simple as adding just one new line of code! This demonstrates how to use DDP communication hooks to optimize gradient communication in distributed training with the Accelerate library. ## FP16 Compression Hook ```python import torch from torch.nn.parallel import DistributedDataParallel as DDP from torch.distributed.algorithms.ddp_comm_hooks import default_hooks from accelerate.test_utils.testing import get_backend device_type, _, _ = get_backend() device_id = getattr(torch, device_type, torch.cuda).current_device() class MyModel(torch.nn.Module): def __init__(self): super().__init__() self.layer = torch.nn.Linear(10, 10) def forward(self, x): return self.layer(x) model = MyModel() model = DDP(model, device_ids=[device_id]) model.register_comm_hook(state=None, hook=default_hooks.fp16_compress_hook) # Training loop for data, targets in data_loader: outputs = model(data) loss = criterion(outputs, targets) loss.backward() optimizer.step() optimizer.zero_grad() ``` ```python from accelerate import Accelerator, DDPCommunicationHookType, DistributedDataParallelKwargs import torch class MyModel(torch.nn.Module): def __init__(self): super().__init__() self.layer = torch.nn.Linear(10, 10) def forward(self, x): return self.layer(x) # DDP Communication Hook setup ddp_kwargs = DistributedDataParallelKwargs(comm_hook=DDPCommunicationHookType.FP16) accelerator = Accelerator(kwargs_handlers=[ddp_kwargs]) model = MyModel() optimizer = torch.optim.Adam(model.parameters()) data_loader = DataLoader(dataset, batch_size=16) model, optimizer, data_loader = accelerator.prepare(model, optimizer, data_loader) # Training loop for data, targets in data_loader: outputs = model(data) loss = criterion(outputs, targets) accelerator.backward(loss) optimizer.step() optimizer.zero_grad() ``` ### BF16 Compression Hook BF16 Compression Hook API is experimental, and it requires NCCL version later than 2.9.6. ```python import torch from torch.nn.parallel import DistributedDataParallel as DDP from torch.distributed.algorithms.ddp_comm_hooks import default_hooks from accelerate.test_utils.testing import get_backend device_type, _, _ = get_backend() device_id = getattr(torch, device_type, torch.cuda).current_device() class MyModel(torch.nn.Module): def __init__(self): super().__init__() self.layer = torch.nn.Linear(10, 10) def forward(self, x): return self.layer(x) model = MyModel() model = DDP(model, device_ids=[device_id]) model.register_comm_hook(state=None, hook=default_hooks.bf16_compress_hook) # Training loop for data, targets in data_loader: outputs = model(data) loss = criterion(outputs, targets) loss.backward() optimizer.step() optimizer.zero_grad() ``` ```python from accelerate import Accelerator, DDPCommunicationHookType, DistributedDataParallelKwargs import torch class MyModel(torch.nn.Module): def __init__(self): super().__init__() self.layer = torch.nn.Linear(10, 10) def forward(self, x): return self.layer(x) # DDP Communication Hook setup ddp_kwargs = DistributedDataParallelKwargs(comm_hook=DDPCommunicationHookType.BF16) accelerator = Accelerator(kwargs_handlers=[ddp_kwargs]) model = MyModel() optimizer = torch.optim.Adam(model.parameters()) data_loader = DataLoader(dataset, batch_size=16) model, optimizer, data_loader = accelerator.prepare(model, optimizer, data_loader) # Training loop for data, targets in data_loader: outputs = model(data) loss = criterion(outputs, targets) accelerator.backward(loss) optimizer.step() optimizer.zero_grad() ``` ### PowerSGD Hook PowerSGD typically requires extra memory of the same size as the model’s gradients to enable error feedback, which can compensate for biased compressed communication and improve accuracy. ```python import torch from torch.nn.parallel import DistributedDataParallel as DDP from torch.distributed.algorithms.ddp_comm_hooks import powerSGD_hook from accelerate.test_utils.testing import get_backend device_type, _, _ = get_backend() device_id = getattr(torch, device_type, torch.cuda).current_device() class MyModel(torch.nn.Module): def __init__(self): super().__init__() self.layer = torch.nn.Linear(10, 10) def forward(self, x): return self.layer(x) model = MyModel() model = DDP(model, device_ids=[device_id]) state = powerSGD_hook.PowerSGDState(process_group=None) model.register_comm_hook(state=state, hook=powerSGD_hook.powerSGD_hook) # Training loop for data, targets in data_loader: outputs = model(data) loss = criterion(outputs, targets) loss.backward() optimizer.step() optimizer.zero_grad() ``` ```python from accelerate import Accelerator, DDPCommunicationHookType, DistributedDataParallelKwargs import torch class MyModel(torch.nn.Module): def __init__(self): super().__init__() self.layer = torch.nn.Linear(10, 10) def forward(self, x): return self.layer(x) # DDP Communication Hook setup ddp_kwargs = DistributedDataParallelKwargs(comm_hook=DDPCommunicationHookType.POWER_SGD) accelerator = Accelerator(kwargs_handlers=[ddp_kwargs]) model = MyModel() optimizer = torch.optim.Adam(model.parameters()) data_loader = DataLoader(dataset, batch_size=16) model, optimizer, data_loader = accelerator.prepare(model, optimizer, data_loader) # Training loop for data, targets in data_loader: outputs = model(data) loss = criterion(outputs, targets) accelerator.backward(loss) optimizer.step() optimizer.zero_grad() ``` ## DDP Communication Hooks utilities There are two additional utilities for supporting optional functionalities with the communication hooks. ### comm_wrapper `comm_wrapper` is an option to wrap a communication hook with additional functionality. For example, it can be used to combine FP16 compression with other communication strategies. Currently supported wrappers are `no`, `fp16`, and `bf16`. ```python from accelerate import Accelerator, DDPCommunicationHookType, DistributedDataParallelKwargs import torch class MyModel(torch.nn.Module): def __init__(self): super().__init__() self.layer = torch.nn.Linear(10, 10) def forward(self, x): return self.layer(x) # DDP Communication Hook setup ddp_kwargs = DistributedDataParallelKwargs( comm_hook=DDPCommunicationHookType.POWER_SGD, comm_wrapper=DDPCommunicationHookType.FP16 ) accelerator = Accelerator(kwargs_handlers=[ddp_kwargs]) model = MyModel() optimizer = torch.optim.Adam(model.parameters()) data_loader = DataLoader(dataset, batch_size=16) model, optimizer, data_loader = accelerator.prepare(model, optimizer, data_loader) # Training loop for data, targets in data_loader: outputs = model(data) loss = criterion(outputs, targets) accelerator.backward(loss) optimizer.step() optimizer.zero_grad() ``` ### comm_state_option `comm_state_option` allows you to pass additional state information required by certain communication hooks. This is particularly useful for stateful hooks like `PowerSGD`, which require maintaining hyperparameters and internal states across training steps. Below is an example showcasing the use of `comm_state_option` with the `PowerSGD` hook. ```python from accelerate import Accelerator, DDPCommunicationHookType, DistributedDataParallelKwargs import torch class MyModel(torch.nn.Module): def __init__(self): super().__init__() self.layer = torch.nn.Linear(10, 10) def forward(self, x): return self.layer(x) # DDP Communication Hook setup ddp_kwargs = DistributedDataParallelKwargs( comm_hook=DDPCommunicationHookType.POWER_SGD, comm_state_option={"matrix_approximation_rank": 2} ) accelerator = Accelerator(kwargs_handlers=[ddp_kwargs]) model = MyModel() optimizer = torch.optim.Adam(model.parameters()) data_loader = DataLoader(dataset, batch_size=16) model, optimizer, data_loader = accelerator.prepare(model, optimizer, data_loader) # Training loop for data, targets in data_loader: outputs = model(data) loss = criterion(outputs, targets) accelerator.backward(loss) optimizer.step() optimizer.zero_grad() ``` For more advanced usage and additional hooks, refer to the [PyTorch DDP Communication Hooks documentation](https://pytorch.org/docs/stable/ddp_comm_hooks.html). accelerate-1.14.0/docs/source/usage_guides/deepspeed.md000066400000000000000000000750021521253476100230530ustar00rootroot00000000000000 # DeepSpeed [DeepSpeed](https://github.com/deepspeedai/DeepSpeed) implements everything described in the [ZeRO paper](https://huggingface.co/papers/1910.02054). Some of the salient optimizations are: 1. Optimizer state partitioning (ZeRO stage 1) 2. Gradient partitioning (ZeRO stage 2) 3. Parameter partitioning (ZeRO stage 3) 4. Custom mixed precision training handling 5. A range of fast CUDA-extension-based optimizers 6. ZeRO-Offload to CPU and Disk/NVMe 7. Hierarchical partitioning of model parameters (ZeRO++) ZeRO-Offload has its own dedicated paper: [ZeRO-Offload: Democratizing Billion-Scale Model Training](https://huggingface.co/papers/2101.06840). And NVMe-support is described in the paper [ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning](https://huggingface.co/papers/2104.07857). DeepSpeed ZeRO-2 is primarily used only for training, as its features are of no use to inference. DeepSpeed ZeRO-3 can be used for inference as well since it allows huge models to be loaded on multiple GPUs, which won't be possible on a single GPU. Accelerate integrates [DeepSpeed](https://github.com/deepspeedai/DeepSpeed) via 2 options: 1. Integration of the DeepSpeed features via `deepspeed config file` specification in `accelerate config` . You just supply your custom config file or use our template. Most of this document is focused on this feature. This supports all the core features of DeepSpeed and gives user a lot of flexibility. User may have to change a few lines of code depending on the config. 2. Integration via `deepspeed_plugin`.This supports subset of the DeepSpeed features and uses default options for the rest of the configurations. User need not change any code and is good for those who are fine with most of the default settings of DeepSpeed. ## What is integrated? Training: 1. Accelerate integrates all features of DeepSpeed ZeRO. This includes all the ZeRO stages 1, 2 and 3 as well as ZeRO-Offload, ZeRO-Infinity (which can offload to disk/NVMe) and ZeRO++. Below is a short description of Data Parallelism using ZeRO - Zero Redundancy Optimizer along with diagram from this [blog post](https://www.microsoft.com/en-us/research/blog/zero-deepspeed-new-system-optimizations-enable-training-models-with-over-100-billion-parameters/) ![ZeRO Data Parallelism](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/parallelism-zero.png) (Source: [link](https://www.microsoft.com/en-us/research/blog/zero-deepspeed-new-system-optimizations-enable-training-models-with-over-100-billion-parameters/)) a. **Stage 1** : Shards optimizer states across data parallel workers/GPUs b. **Stage 2** : Shards optimizer states + gradients across data parallel workers/GPUs c. **Stage 3**: Shards optimizer states + gradients + model parameters across data parallel workers/GPUs d. **Optimizer Offload**: Offloads the gradients + optimizer states to CPU/Disk building on top of ZERO Stage 2 e. **Param Offload**: Offloads the model parameters to CPU/Disk building on top of ZERO Stage 3 f. **Hierarchical Partitioning**: Enables efficient multi-node training with data-parallel training across nodes and ZeRO-3 sharding within a node, built on top of ZeRO Stage 3. Note: With respect to Disk Offload, the disk should be an NVME for decent speed but it technically works on any Disk Inference: 1. DeepSpeed ZeRO Inference supports ZeRO stage 3 with ZeRO-Infinity. It uses the same ZeRO protocol as training, but it doesn't use an optimizer and a lr scheduler and only stage 3 is relevant. For more details see: [deepspeed-zero-inference](#deepspeed-zero-inference). ## How it works? **Pre-Requisites**: Install DeepSpeed version >=0.6.5. Please refer to the [DeepSpeed Installation details](https://github.com/deepspeedai/DeepSpeed#installation) for more information. We will first look at easy to use integration via `accelerate config`. Followed by more flexible and feature rich `deepspeed config file` integration. ### Accelerate DeepSpeed Plugin On your machine(s) just run: ```bash accelerate config ``` and answer the questions asked. It will ask whether you want to use a config file for DeepSpeed to which you should answer no. Then answer the following questions to generate a basic DeepSpeed config. This will generate a config file that will be used automatically to properly set the default options when doing ```bash accelerate launch my_script.py --args_to_my_script ``` For instance, here is how you would run the NLP example `examples/nlp_example.py` (from the root of the repo) with DeepSpeed Plugin: **ZeRO Stage-2 DeepSpeed Plugin Example** ```bash compute_environment: LOCAL_MACHINE deepspeed_config: gradient_accumulation_steps: 1 gradient_clipping: 1.0 offload_optimizer_device: none offload_param_device: none zero3_init_flag: true zero_stage: 2 distributed_type: DEEPSPEED fsdp_config: {} machine_rank: 0 main_process_ip: null main_process_port: null main_training_function: main mixed_precision: fp16 num_machines: 1 num_processes: 2 use_cpu: false ``` ```bash accelerate launch examples/nlp_example.py --mixed_precision fp16 ``` **ZeRO Stage-3 with CPU Offload DeepSpeed Plugin Example** ```bash compute_environment: LOCAL_MACHINE deepspeed_config: gradient_accumulation_steps: 1 gradient_clipping: 1.0 offload_optimizer_device: cpu offload_param_device: cpu zero3_init_flag: true zero3_save_16bit_model: true zero_stage: 3 distributed_type: DEEPSPEED fsdp_config: {} machine_rank: 0 main_process_ip: null main_process_port: null main_training_function: main mixed_precision: fp16 num_machines: 1 num_processes: 2 use_cpu: false ``` ```bash accelerate launch examples/nlp_example.py --mixed_precision fp16 ``` Currently, `Accelerate` supports following config through the CLI: ```bash `zero_stage`: [0] Disabled, [1] optimizer state partitioning, [2] optimizer+gradient state partitioning and [3] optimizer+gradient+parameter partitioning `gradient_accumulation_steps`: Number of training steps to accumulate gradients before averaging and applying them. `gradient_clipping`: Enable gradient clipping with value. `offload_optimizer_device`: [none] Disable optimizer offloading, [cpu] offload optimizer to CPU, [nvme] offload optimizer to NVMe SSD. Only applicable with ZeRO >= Stage-2. `offload_optimizer_nvme_path`: Decides Nvme Path to offload optimizer states. If unspecified, will default to 'none'. `offload_param_device`: [none] Disable parameter offloading, [cpu] offload parameters to CPU, [nvme] offload parameters to NVMe SSD. Only applicable with ZeRO Stage-3. `offload_param_nvme_path`: Decides Nvme Path to offload parameters. If unspecified, will default to 'none'. `zero3_init_flag`: Decides whether to enable `deepspeed.zero.Init` for constructing massive models. Only applicable with ZeRO Stage-3. `zero3_save_16bit_model`: Decides whether to save 16-bit model weights when using ZeRO Stage-3. `mixed_precision`: `no` for FP32 training, `fp16` for FP16 mixed-precision training and `bf16` for BF16 mixed-precision training. `deepspeed_moe_layer_cls_names`: Comma-separated list of transformer Mixture-of-Experts (MoE) layer class names (case-sensitive) to wrap ,e.g, `MixtralSparseMoeBlock`, `Qwen2MoeSparseMoeBlock`, `JetMoEAttention,JetMoEBlock` ... `deepspeed_hostfile`: DeepSpeed hostfile for configuring multi-node compute resources. `deepspeed_exclusion_filter`: DeepSpeed exclusion filter string when using mutli-node setup. `deepspeed_inclusion_filter`: DeepSpeed inclusion filter string when using mutli-node setup. `deepspeed_multinode_launcher`: DeepSpeed multi-node launcher to use, e.g. `pdsh`, `standard`, `openmpi`, `mvapich`, `mpich`, `slurm`, `nossh` (requires DeepSpeed >= 0.14.5). If unspecified, will default to `pdsh`. `deepspeed_config_file`: path to the DeepSpeed config file in `json` format. See the next section for more details on this. ``` To be able to tweak more options, you will need to use a DeepSpeed config file. ### DeepSpeed Config File On your machine(s) just run: ```bash accelerate config ``` and answer the questions asked. It will ask whether you want to use a config file for deepspeed to which you answer yes and provide the path to the deepspeed config file. This will generate a config file that will be used automatically to properly set the default options when doing ```bash accelerate launch my_script.py --args_to_my_script ``` For instance, here is how you would run the NLP example `examples/by_feature/deepspeed_with_config_support.py` (from the root of the repo) with DeepSpeed Config File: **ZeRO Stage-2 DeepSpeed Config File Example** ```bash compute_environment: LOCAL_MACHINE deepspeed_config: deepspeed_config_file: /home/ubuntu/accelerate/examples/deepspeed_config_templates/zero_stage2_config.json zero3_init_flag: true distributed_type: DEEPSPEED fsdp_config: {} machine_rank: 0 main_process_ip: null main_process_port: null main_training_function: main mixed_precision: fp16 num_machines: 1 num_processes: 2 use_cpu: false ``` with the contents of `zero_stage2_config.json` being: ```json { "fp16": { "enabled": true, "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": "auto", "weight_decay": "auto", "torch_adam": true, "adam_w_mode": true } }, "scheduler": { "type": "WarmupDecayLR", "params": { "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto", "total_num_steps": "auto" } }, "zero_optimization": { "stage": 2, "allgather_partitions": true, "allgather_bucket_size": 2e8, "overlap_comm": true, "reduce_scatter": true, "reduce_bucket_size": "auto", "contiguous_gradients": true }, "gradient_accumulation_steps": 1, "gradient_clipping": "auto", "steps_per_print": 2000, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "wall_clock_breakdown": false } ``` ```bash accelerate launch examples/by_feature/deepspeed_with_config_support.py \ --config_name "gpt2-large" \ --tokenizer_name "gpt2-large" \ --dataset_name "wikitext" \ --dataset_config_name "wikitext-2-raw-v1" \ --block_size 128 \ --output_dir "./clm/clm_deepspeed_stage2_accelerate" \ --learning_rate 5e-4 \ --per_device_train_batch_size 24 \ --per_device_eval_batch_size 24 \ --num_train_epochs 3 \ --with_tracking \ --report_to "wandb"\ ``` **ZeRO Stage-3 with CPU offload DeepSpeed Config File Example** ```bash compute_environment: LOCAL_MACHINE deepspeed_config: deepspeed_config_file: /home/ubuntu/accelerate/examples/deepspeed_config_templates/zero_stage3_offload_config.json zero3_init_flag: true distributed_type: DEEPSPEED fsdp_config: {} machine_rank: 0 main_process_ip: null main_process_port: null main_training_function: main mixed_precision: fp16 num_machines: 1 num_processes: 2 use_cpu: false ``` with the contents of `zero_stage3_offload_config.json` being: ```json { "fp16": { "enabled": true, "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": "auto", "weight_decay": "auto" } }, "scheduler": { "type": "WarmupDecayLR", "params": { "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto", "total_num_steps": "auto" } }, "zero_optimization": { "stage": 3, "offload_optimizer": { "device": "cpu", "pin_memory": true }, "offload_param": { "device": "cpu", "pin_memory": true }, "overlap_comm": true, "contiguous_gradients": true, "reduce_bucket_size": "auto", "stage3_prefetch_bucket_size": "auto", "stage3_param_persistence_threshold": "auto", "sub_group_size": 1e9, "stage3_max_live_parameters": 1e9, "stage3_max_reuse_distance": 1e9, "stage3_gather_16bit_weights_on_model_save": "auto" }, "gradient_accumulation_steps": 1, "gradient_clipping": "auto", "steps_per_print": 2000, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "wall_clock_breakdown": false } ``` ```bash accelerate launch examples/by_feature/deepspeed_with_config_support.py \ --config_name "gpt2-large" \ --tokenizer_name "gpt2-large" \ --dataset_name "wikitext" \ --dataset_config_name "wikitext-2-raw-v1" \ --block_size 128 \ --output_dir "./clm/clm_deepspeed_stage3_offload_accelerate" \ --learning_rate 5e-4 \ --per_device_train_batch_size 32 \ --per_device_eval_batch_size 32 \ --num_train_epochs 3 \ --with_tracking \ --report_to "wandb"\ ``` **ZeRO++ Config Example** You can use the features of ZeRO++ by using the appropriate config parameters. Note that ZeRO++ is an extension for ZeRO Stage 3. Here is how the config file can be modified, from [DeepSpeed's ZeRO++ tutorial](https://www.deepspeed.ai/tutorials/zeropp/): ```json { "zero_optimization": { "stage": 3, "reduce_bucket_size": "auto", "zero_quantized_weights": true, "zero_hpz_partition_size": 8, "zero_quantized_gradients": true, "contiguous_gradients": true, "overlap_comm": true } } ``` For hierarchical partitioning, the partition size `zero_hpz_partition_size` should ideally be set to the number of GPUs per node. (For example, the above config file assumes 8 GPUs per node) **Important code changes when using DeepSpeed Config File** 1. DeepSpeed Optimizers and Schedulers. For more information on these, see the [DeepSpeed Optimizers](https://deepspeed.readthedocs.io/en/latest/optimizers.html) and [DeepSpeed Schedulers](https://deepspeed.readthedocs.io/en/latest/schedulers.html) documentation. We will look at the changes needed in the code when using these. a. DS Optim + DS Scheduler: The case when both `optimizer` and `scheduler` keys are present in the DeepSpeed config file. In this situation, those will be used and the user has to use `accelerate.utils.DummyOptim` and `accelerate.utils.DummyScheduler` to replace the PyTorch/Custom optimizers and schedulers in their code. Below is the snippet from `examples/by_feature/deepspeed_with_config_support.py` showing this: ```python # Creates Dummy Optimizer if `optimizer` was specified in the config file else creates Adam Optimizer optimizer_cls = ( torch.optim.AdamW if accelerator.state.deepspeed_plugin is None or "optimizer" not in accelerator.state.deepspeed_plugin.deepspeed_config else DummyOptim ) optimizer = optimizer_cls(optimizer_grouped_parameters, lr=args.learning_rate) # Creates Dummy Scheduler if `scheduler` was specified in the config file else creates `args.lr_scheduler_type` Scheduler if ( accelerator.state.deepspeed_plugin is None or "scheduler" not in accelerator.state.deepspeed_plugin.deepspeed_config ): lr_scheduler = get_scheduler( name=args.lr_scheduler_type, optimizer=optimizer, num_warmup_steps=args.num_warmup_steps, num_training_steps=args.max_train_steps, ) else: lr_scheduler = DummyScheduler( optimizer, total_num_steps=args.max_train_steps, warmup_num_steps=args.num_warmup_steps ) ``` b. Custom Optim + Custom Scheduler: The case when both `optimizer` and `scheduler` keys are absent in the DeepSpeed config file. In this situation, no code changes are needed from the user and this is the case when using integration via DeepSpeed Plugin. In the above example we can see that the code remains unchanged if the `optimizer` and `scheduler` keys are absent in the DeepSpeed config file. c. Custom Optim + DS Scheduler: The case when only `scheduler` key is present in the DeepSpeed config file. In this situation, the user has to use `accelerate.utils.DummyScheduler` to replace the PyTorch/Custom scheduler in their code. d. DS Optim + Custom Scheduler: The case when only `optimizer` key is present in the DeepSpeed config file. This will result in an error because you can only use DS Scheduler when using DS Optim. 2. Notice the `auto` values in the above example DeepSpeed config files. These are automatically handled by `prepare` method based on model, dataloaders, dummy optimizer and dummy schedulers provided to `prepare` method. Only the `auto` fields specified in above examples are handled by `prepare` method and the rest have to be explicitly specified by the user. The `auto` values are calculated as: - `reduce_bucket_size`: `hidden_size * hidden_size` - `stage3_prefetch_bucket_size`: `int(0.9 * hidden_size * hidden_size)` - `stage3_param_persistence_threshold`: `10 * hidden_size` For the `auto` feature to work for these 3 config entries - Accelerate will use `model.config.hidden_size` or `max(model.config.hidden_sizes)` as `hidden_size`. If neither of these is available, the launching will fail and you will have to set these 3 config entries manually. Remember the first 2 config entries are the communication buffers - the larger they are the more efficient the comms will be, and the larger they are the more GPU memory they will consume, so it's a tunable performance trade-off. **Things to note when using DeepSpeed Config File** Below is a sample script using `deepspeed_config_file` in different scenarios. Code `test.py`: ```python from accelerate import Accelerator from accelerate.state import AcceleratorState def main(): accelerator = Accelerator() accelerator.print(f"{AcceleratorState()}") if __name__ == "__main__": main() ``` **Scenario 1**: Manually tampered accelerate config file having `deepspeed_config_file` along with other entries. 1. Content of the `accelerate` config: ```yaml command_file: null commands: null compute_environment: LOCAL_MACHINE deepspeed_config: gradient_accumulation_steps: 1 gradient_clipping: 1.0 offload_optimizer_device: 'cpu' offload_param_device: 'cpu' zero3_init_flag: true zero3_save_16bit_model: true zero_stage: 3 deepspeed_config_file: 'ds_config.json' distributed_type: DEEPSPEED downcast_bf16: 'no' dynamo_backend: 'NO' fsdp_config: {} gpu_ids: null machine_rank: 0 main_process_ip: null main_process_port: null main_training_function: main megatron_lm_config: {} num_machines: 1 num_processes: 2 rdzv_backend: static same_network: true tpu_name: null tpu_zone: null use_cpu: false ``` 2. `ds_config.json`: ```json { "bf16": { "enabled": true }, "zero_optimization": { "stage": 3, "stage3_gather_16bit_weights_on_model_save": false, "offload_optimizer": { "device": "none" }, "offload_param": { "device": "none" } }, "gradient_clipping": 1.0, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "gradient_accumulation_steps": 10, "steps_per_print": 2000000 } ``` 3. Output of `accelerate launch test.py`: ```bash ValueError: When using `deepspeed_config_file`, the following accelerate config variables will be ignored: ['gradient_accumulation_steps', 'gradient_clipping', 'zero_stage', 'offload_optimizer_device', 'offload_param_device', 'zero3_save_16bit_model', 'mixed_precision']. Please specify them appropriately in the DeepSpeed config file. If you are using an accelerate config file, remove other config variables mentioned in the above specified list. The easiest method is to create a new config following the questionnaire via `accelerate config`. It will only ask for the necessary config variables when using `deepspeed_config_file`. ``` **Scenario 2**: Use the solution of the error to create new accelerate config and check that no ambiguity error is now thrown. 1. Run `accelerate config`: ```bash $ accelerate config ------------------------------------------------------------------------------------------------------------------------------- In which compute environment are you running? This machine ------------------------------------------------------------------------------------------------------------------------------- Which type of machine are you using? multi-GPU How many different machines will you use (use more than 1 for multi-node training)? [1]: Do you wish to optimize your script with torch dynamo?[yes/NO]: Do you want to use DeepSpeed? [yes/NO]: yes Do you want to specify a json file to a DeepSpeed config? [yes/NO]: yes Please enter the path to the json DeepSpeed config file: ds_config.json Do you want to enable `deepspeed.zero.Init` when using ZeRO Stage-3 for constructing massive models? [yes/NO]: yes How many GPU(s) should be used for distributed training? [1]:4 accelerate configuration saved at ds_config_sample.yaml ``` 2. Content of the `accelerate` config: ```yaml compute_environment: LOCAL_MACHINE deepspeed_config: deepspeed_config_file: ds_config.json zero3_init_flag: true distributed_type: DEEPSPEED downcast_bf16: 'no' dynamo_backend: 'NO' fsdp_config: {} machine_rank: 0 main_training_function: main megatron_lm_config: {} num_machines: 1 num_processes: 4 rdzv_backend: static same_network: true use_cpu: false ``` 3. Output of `accelerate launch test.py`: ```bash Distributed environment: DEEPSPEED Backend: nccl Num processes: 4 Process index: 0 Local process index: 0 Device: cuda:0 Mixed precision type: bf16 ds_config: {'bf16': {'enabled': True}, 'zero_optimization': {'stage': 3, 'stage3_gather_16bit_weights_on_model_save': False, 'offload_optimizer': {'device': 'none'}, 'offload_param': {'device': 'none'}}, 'gradient_clipping': 1.0, 'train_batch_size': 'auto', 'train_micro_batch_size_per_gpu': 'auto', 'gradient_accumulation_steps': 10, 'steps_per_print': inf, 'fp16': {'enabled': False}} ``` **Scenario 3**: Setting the `accelerate launch` command arguments related to DeepSpeed as `"auto"` in the DeepSpeed` configuration file and check that things work as expected. 1. New `ds_config.json` with `"auto"` for the `accelerate launch` DeepSpeed command arguments: ```json { "bf16": { "enabled": "auto" }, "zero_optimization": { "stage": "auto", "stage3_gather_16bit_weights_on_model_save": "auto", "offload_optimizer": { "device": "auto" }, "offload_param": { "device": "auto" } }, "gradient_clipping": "auto", "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "gradient_accumulation_steps": "auto", "steps_per_print": 2000000 } ``` 2. Output of `accelerate launch --mixed_precision="fp16" --zero_stage=3 --gradient_accumulation_steps=5 --gradient_clipping=1.0 --offload_param_device="cpu" --offload_optimizer_device="nvme" --zero3_save_16bit_model="true" test.py`: ```bash Distributed environment: DEEPSPEED Backend: nccl Num processes: 4 Process index: 0 Local process index: 0 Device: cuda:0 Mixed precision type: fp16 ds_config: {'bf16': {'enabled': False}, 'zero_optimization': {'stage': 3, 'stage3_gather_16bit_weights_on_model_save': True, 'offload_optimizer': {'device': 'nvme'}, 'offload_param': {'device': 'cpu'}}, 'gradient_clipping': 1.0, 'train_batch_size': 'auto', 'train_micro_batch_size_per_gpu': 'auto', 'gradient_accumulation_steps': 5, 'steps_per_print': inf, 'fp16': {'enabled': True, 'auto_cast': True}} ``` **Note**: 1. Remaining `"auto"` values are handled in `accelerator.prepare()` call as explained in point 2 of `Important code changes when using DeepSpeed Config File`. 2. Only when `gradient_accumulation_steps` is `auto`, the value passed while creating `Accelerator` object via `Accelerator(gradient_accumulation_steps=k)` will be used. When using DeepSpeed Plugin, the value from it will be used and it will overwrite the value passed while creating Accelerator object. ## Saving and loading 1. Saving and loading of models is unchanged for ZeRO Stage-1 and Stage-2. 2. under ZeRO Stage-3, `state_dict` contains just the placeholders since the model weights are partitioned across multiple GPUs. ZeRO Stage-3 has 2 options: a. Saving the entire 16bit model weights to directly load later on using `model.load_state_dict(torch.load(pytorch_model.bin))`. For this, either set `zero_optimization.stage3_gather_16bit_weights_on_model_save` to True in DeepSpeed Config file or set `zero3_save_16bit_model` to True in DeepSpeed Plugin. **Note that this option requires consolidation of the weights on one GPU it can be slow and memory demanding, so only use this feature when needed.** Below is the snippet from `examples/by_feature/deepspeed_with_config_support.py` showing this: ```python unwrapped_model = accelerator.unwrap_model(model) # New Code # # Saves the whole/unpartitioned fp16 model when in ZeRO Stage-3 to the output directory if # `stage3_gather_16bit_weights_on_model_save` is True in DeepSpeed Config file or # `zero3_save_16bit_model` is True in DeepSpeed Plugin. # For Zero Stages 1 and 2, models are saved as usual in the output directory. # The model name saved is `pytorch_model.bin` unwrapped_model.save_pretrained( args.output_dir, is_main_process=accelerator.is_main_process, save_function=accelerator.save, state_dict=accelerator.get_state_dict(model), ) ``` b. To get 32bit weights, first save the model using `model.save_checkpoint()`. Below is the snippet from `examples/by_feature/deepspeed_with_config_support.py` showing this: ```python success = model.save_checkpoint(PATH, ckpt_id, checkpoint_state_dict) status_msg = f"checkpointing: PATH={PATH}, ckpt_id={ckpt_id}" if success: logging.info(f"Success {status_msg}") else: logging.warning(f"Failure {status_msg}") ``` This will create ZeRO model and optimizer partitions along with `zero_to_fp32.py` script in checkpoint directory. You can use this script to do offline consolidation. It requires no configuration files or GPUs. Here is an example of its usage: ```bash $ cd /path/to/checkpoint_dir $ ./zero_to_fp32.py . pytorch_model.bin Processing zero checkpoint at global_step1 Detected checkpoint of type zero stage 3, world_size: 2 Saving fp32 state dict to pytorch_model.bin (total_numel=60506624) ``` To get 32bit model for saving/inference, you can perform: ```python from deepspeed.utils.zero_to_fp32 import load_state_dict_from_zero_checkpoint unwrapped_model = accelerator.unwrap_model(model) fp32_model = load_state_dict_from_zero_checkpoint(unwrapped_model, checkpoint_dir) ``` If you are only interested in the `state_dict`, you can do the following: ```python from deepspeed.utils.zero_to_fp32 import get_fp32_state_dict_from_zero_checkpoint state_dict = get_fp32_state_dict_from_zero_checkpoint(checkpoint_dir) ``` Note that all these functions require ~2x memory (general RAM) of the size of the final checkpoint. ## ZeRO Inference DeepSpeed ZeRO Inference supports ZeRO stage 3 with ZeRO-Infinity. It uses the same ZeRO protocol as training, but it doesn't use an optimizer and a lr scheduler and only stage 3 is relevant. With accelerate integration, you just need to prepare the model and dataloader as shown below: ```python model, eval_dataloader = accelerator.prepare(model, eval_dataloader) ``` ## Few caveats to be aware of 1. Current integration doesn’t support Pipeline Parallelism of DeepSpeed. 2. Current integration doesn’t support `mpu`, limiting the tensor parallelism which is supported in Megatron-LM. 3. Current integration doesn’t support multiple models. ## Multi-node DeepSpeed DeepSpeed supports multi-node inference and training over a variety of different launchers. You can specify a different launcher by setting the `deepspeed_multinode_launcher` config in the CLI or in the DeepSpeed config file. Currently, accelerate supports passing configuration for the following DeepSpeed multi-node launchers: `pdsh` (default), `standard`, `openmpi`, `mvapich`, `mpich`, `slurm`, `nossh` (requires DeepSpeed >= 0.14.5). Please read the [DeepSpeed documentation](https://www.deepspeed.ai/getting-started/#resource-configuration-multi-node) for more information on the different launchers. By default, DeepSpeed will attempt to use passwordless SSH from the main machine node to the other nodes to perform the launcher command. In this configuration, the accelerate launch command only needs to be run on the main node. If using the `nossh` launcher, you will need to run the accelerate launch command on every node using copied configuration. ## DeepSpeed Resources The documentation for the internals related to deepspeed can be found [here](../package_reference/deepspeed). - [Project's github](https://github.com/deepspeedai/DeepSpeed) - [Usage docs](https://www.deepspeed.ai/getting-started/) - [API docs](https://deepspeed.readthedocs.io/en/latest/index.html) - [Blog posts](https://www.microsoft.com/en-us/research/search/?q=deepspeed) Papers: - [ZeRO: Memory Optimizations Toward Training Trillion Parameter Models](https://huggingface.co/papers/1910.02054) - [ZeRO-Offload: Democratizing Billion-Scale Model Training](https://huggingface.co/papers/2101.06840) - [ZeRO-Infinity: Breaking the GPU Memory Wall for Extreme Scale Deep Learning](https://huggingface.co/papers/2104.07857) - [ZeRO++: Extremely Efficient Collective Communication for Giant Model Training](https://huggingface.co/papers/2306.10209) Finally, please, remember that `Accelerate` only integrates DeepSpeed, therefore if you have any problems or questions with regards to DeepSpeed usage, please, file an issue with [DeepSpeed GitHub](https://github.com/deepspeedai/DeepSpeed/issues). For those interested in the similarities and differences between FSDP and DeepSpeed, please check out the [concept guide here](../concept_guides/fsdp_and_deepspeed)! accelerate-1.14.0/docs/source/usage_guides/deepspeed_multiple_model.md000066400000000000000000000215171521253476100261500ustar00rootroot00000000000000 # Using multiple models with DeepSpeed This guide assumes that you have read and understood the [DeepSpeed usage guide](./deepspeed.md). Running multiple models with Accelerate and DeepSpeed is useful for: * Knowledge distillation * Post-training techniques like RLHF (see the [TRL](https://github.com/huggingface/trl) library for more examples) * Training multiple models at once Currently, Accelerate has a **very experimental API** to help you use multiple models. This tutorial will focus on two common use cases: 1. Knowledge distillation, where a smaller student model is trained to mimic a larger, better-performing teacher. If the student model fits on a single GPU, we can use ZeRO-2 for training and ZeRO-3 to shard the teacher for inference. This is significantly faster than using ZeRO-3 for both models. 2. Training multiple *disjoint* models at once. ## Knowledge distillation Knowledge distillation is a good example of using multiple models, but only training one of them. Normally, you would use a single [`utils.DeepSpeedPlugin`] for both models. However, in this case, there are two separate configurations. Accelerate allows you to create and use multiple plugins **if and only if** they are in a `dict` so that you can reference and enable the proper plugin when needed. ```python from accelerate.utils import DeepSpeedPlugin zero2_plugin = DeepSpeedPlugin(hf_ds_config="zero2_config.json") zero3_plugin = DeepSpeedPlugin(hf_ds_config="zero3_config.json") deepspeed_plugins = {"student": zero2_plugin, "teacher": zero3_plugin} ``` The `zero2_config.json` should be configured for full training (so specify `scheduler` and `optimizer` if you are not utilizing your own), while `zero3_config.json` should only be configured for the inference model, as shown in the example below. ```json { "bf16": { "enabled": "auto" }, "zero_optimization": { "stage": 3, "overlap_comm": true, "reduce_bucket_size": "auto", "stage3_prefetch_bucket_size": "auto", "stage3_param_persistence_threshold": "auto", "stage3_max_live_parameters": "auto", "stage3_max_reuse_distance": "auto", }, "train_micro_batch_size_per_gpu": 1 } ``` An example `zero2_config.json` configuration is shown below. ```json { "bf16": { "enabled": "auto" }, "optimizer": { "type": "AdamW", "params": { "lr": "auto", "weight_decay": "auto", "torch_adam": true, "adam_w_mode": true } }, "scheduler": { "type": "WarmupLR", "params": { "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto" } }, "zero_optimization": { "stage": 2, "offload_optimizer": { "device": "cpu", "pin_memory": true }, }, "gradient_accumulation_steps": 1, "gradient_clipping": "auto", "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", } ``` DeepSpeed will raise an error if `train_micro_batch_size_per_gpu` isn't specified, even if this particular model isn't being trained. From here, create a single [`Accelerator`] and pass in both configurations. ```python from accelerate import Accelerator accelerator = Accelerator(deepspeed_plugins=deepspeed_plugins) ``` Now let's see how to use them. ### Student model By default, Accelerate sets the first item in the `dict` as the default or enabled plugin (`"student"` plugin). Verify this by using the [`utils.deepspeed.get_active_deepspeed_plugin`] function to see which plugin is enabled. ```python active_plugin = get_active_deepspeed_plugin(accelerator.state) assert active_plugin is deepspeed_plugins["student"] ``` [`AcceleratorState`] also keeps the active DeepSpeed plugin saved in `state.deepspeed_plugin`. ```python assert active_plugin is accelerator.deepspeed_plugin ``` Since `student` is the currently active plugin, let's go ahead and prepare the model, optimizer, and scheduler. ```python student_model, optimizer, scheduler = ... student_model, optimizer, scheduler, train_dataloader = accelerator.prepare(student_model, optimizer, scheduler, train_dataloader) ``` Now it's time to deal with the teacher model. ### Teacher model First, you need to specify in [`Accelerator`] that the `zero3_config.json` configuration should be used. ```python accelerator.state.select_deepspeed_plugin("teacher") ``` This disables the `"student"` plugin and enables the `"teacher"` plugin instead. The DeepSpeed stateful config inside of Transformers is updated, and it changes which plugin configuration gets called when using `deepspeed.initialize()`. This allows you to use the automatic `deepspeed.zero.Init` context manager integration Transformers provides. ```python teacher_model = AutoModel.from_pretrained(...) teacher_model = accelerator.prepare(teacher_model) ``` Otherwise, you should manually initialize the model with `deepspeed.zero.Init`. ```python with deepspeed.zero.Init(accelerator.deepspeed_plugin.config): model = MyModel(...) ``` ### Training From here, your training loop can be whatever you like, as long as `teacher_model` is never being trained on. ```python teacher_model.eval() student_model.train() for batch in train_dataloader: with torch.no_grad(): output_teacher = teacher_model(**batch) output_student = student_model(**batch) # Combine the losses or modify it in some way loss = output_teacher.loss + output_student.loss accelerator.backward(loss) optimizer.step() scheduler.step() optimizer.zero_grad() ``` ## Train multiple disjoint models Training multiple models is a more complicated scenario. In its current state, we assume each model is **completely disjointed** from the other during training. This scenario still requires two [`utils.DeepSpeedPlugin`]'s to be made. However, you also need a second [`Accelerator`], since different `deepspeed` engines are being called at different times. A single [`Accelerator`] can only carry one instance at a time. Since the [`state.AcceleratorState`] is a stateful object though, it is already aware of both [`utils.DeepSpeedPlugin`]'s available. You can just instantiate a second [`Accelerator`] with no extra arguments. ```python first_accelerator = Accelerator(deepspeed_plugins=deepspeed_plugins) second_accelerator = Accelerator() ``` You can call either `first_accelerator.state.select_deepspeed_plugin()` to enable or disable a particular plugin, and then call [`prepare`]. ```python # can be `accelerator_0`, `accelerator_1`, or by calling `AcceleratorState().select_deepspeed_plugin(...)` first_accelerator.state.select_deepspeed_plugin("first_model") first_model = AutoModel.from_pretrained(...) # For this example, `get_training_items` is a nonexistent function that gets the setup we need for training first_optimizer, first_scheduler, train_dl, eval_dl = get_training_items(model1) first_model, first_optimizer, first_scheduler, train_dl, eval_dl = accelerator.prepare( first_model, first_optimizer, first_scheduler, train_dl, eval_dl ) second_accelerator.state.select_deepspeed_plugin("second_model") second_model = AutoModel.from_pretrained(...) # For this example, `get_training_items` is a nonexistent function that gets the setup we need for training second_optimizer, second_scheduler, _, _ = get_training_items(model2) second_model, second_optimizer, second_scheduler = accelerator.prepare( second_model, second_optimizer, second_scheduler ) ``` And now you can train: ```python for batch in dl: outputs1 = first_model(**batch) first_accelerator.backward(outputs1.loss) first_optimizer.step() first_scheduler.step() first_optimizer.zero_grad() outputs2 = model2(**batch) second_accelerator.backward(outputs2.loss) second_optimizer.step() second_scheduler.step() second_optimizer.zero_grad() ``` ## Resources To see more examples, please check out the [related tests](https://github.com/huggingface/accelerate/blob/main/src/accelerate/test_utils/scripts/external_deps/test_ds_multiple_model.py) currently in [Accelerate]. accelerate-1.14.0/docs/source/usage_guides/distributed_inference.md000066400000000000000000000237721521253476100254640ustar00rootroot00000000000000 # Distributed inference Distributed inference can fall into three brackets: 1. Loading an entire model onto each GPU and sending chunks of a batch through each GPU's model copy at a time 2. Loading parts of a model onto each GPU and processing a single input at one time 3. Loading parts of a model onto each GPU and using what is called scheduled Pipeline Parallelism to combine the two prior techniques. We're going to go through the first and the last bracket, showcasing how to do each as they are more realistic scenarios. ## Sending chunks of a batch automatically to each loaded model This is the most memory-intensive solution, as it requires each GPU to keep a full copy of the model in memory at a given time. Normally when doing this, users send the model to a specific device to load it from the CPU, and then move each prompt to a different device. A basic pipeline using the `diffusers` library might look something like so: ```python import torch import torch.distributed as dist from diffusers import DiffusionPipeline pipe = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16) ``` Followed then by performing inference based on the specific prompt: ```python def run_inference(rank, world_size): dist.init_process_group("nccl", rank=rank, world_size=world_size) pipe.to(rank) if torch.distributed.get_rank() == 0: prompt = "a dog" elif torch.distributed.get_rank() == 1: prompt = "a cat" result = pipe(prompt).images[0] result.save(f"result_{rank}.png") ``` One will notice how we have to check the rank to know what prompt to send, which can be a bit tedious. A user might then also think that with Accelerate, using the `Accelerator` to prepare a dataloader for such a task might also be a simple way to manage this. (To learn more, check out the relevant section in the [Quick Tour](../quicktour#distributed-evaluation)) Can it manage it? Yes. Does it add unneeded extra code however: also yes. With Accelerate, we can simplify this process by using the [`Accelerator.split_between_processes`] context manager (which also exists in `PartialState` and `AcceleratorState`). This function will automatically split whatever data you pass to it (be it a prompt, a set of tensors, a dictionary of the prior data, etc.) across all the processes (with a potential to be padded) for you to use right away. Let's rewrite the above example using this context manager: ```python import torch from accelerate import PartialState # Can also be Accelerator or AcceleratorState from diffusers import DiffusionPipeline pipe = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16) distributed_state = PartialState() pipe.to(distributed_state.device) # Assume two processes with distributed_state.split_between_processes(["a dog", "a cat"]) as prompt: result = pipe(prompt).images[0] result.save(f"result_{distributed_state.process_index}.png") ``` And then to launch the code, we can use the Accelerate: If you have generated a config file to be used using `accelerate config`: ```bash accelerate launch distributed_inference.py ``` If you have a specific config file you want to use: ```bash accelerate launch --config_file my_config.json distributed_inference.py ``` Or if don't want to make any config files and launch on two GPUs: > Note: You will get some warnings about values being guessed based on your system. To remove these you can do `accelerate config default` or go through `accelerate config` to create a config file. ```bash accelerate launch --num_processes 2 distributed_inference.py ``` We've now reduced the boilerplate code needed to split this data to a few lines of code quite easily. But what if we have an odd distribution of prompts to GPUs? For example, what if we have 3 prompts, but only 2 GPUs? Under the context manager, the first GPU would receive the first two prompts and the second GPU the third, ensuring that all prompts are split and no overhead is needed. *However*, what if we then wanted to do something with the results of *all the GPUs*? (Say gather them all and perform some kind of post processing) You can pass in `apply_padding=True` to ensure that the lists of prompts are padded to the same length, with extra data being taken from the last sample. This way all GPUs will have the same number of prompts, and you can then gather the results. This is only needed when trying to perform an action such as gathering the results, where the data on each device needs to be the same length. Basic inference does not require this. For instance: ```python import torch from accelerate import PartialState # Can also be Accelerator or AcceleratorState from diffusers import DiffusionPipeline pipe = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5", torch_dtype=torch.float16) distributed_state = PartialState() pipe.to(distributed_state.device) # Assume two processes with distributed_state.split_between_processes(["a dog", "a cat", "a chicken"], apply_padding=True) as prompt: result = pipe(prompt).images ``` On the first GPU, the prompts will be `["a dog", "a cat"]`, and on the second GPU it will be `["a chicken", "a chicken"]`. Make sure to drop the final sample, as it will be a duplicate of the previous one. You can find more complex examples [here](https://github.com/huggingface/accelerate/tree/main/examples/inference/distributed) such as how to use it with LLMs. ## Memory-efficient pipeline parallelism (experimental) This next part will discuss using *pipeline parallelism*. This is an **experimental** API that utilizes [torch.distributed.pipelining](https://pytorch.org/docs/stable/distributed.pipelining.html#) as a native solution. The general idea with pipeline parallelism is: say you have 4 GPUs and a model big enough it can be *split* on four GPUs using `device_map="auto"`. With this method you can send in 4 inputs at a time (for example here, any amount works) and each model chunk will work on an input, then receive the next input once the prior chunk finished, making it *much* more efficient **and faster** than the method described earlier. Here's a visual taken from the PyTorch repository: ![Pipeline parallelism example](https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/accelerate/pipeline_parallel.png) To illustrate how you can use this with Accelerate, we have created an [example zoo](https://github.com/huggingface/accelerate/tree/main/examples/inference) showcasing a number of different models and situations. In this tutorial, we'll show this method for GPT2 across two GPUs. Before you proceed, please make sure you have the latest PyTorch version installed by running the following: ```bash pip install torch ``` Start by creating the model on the CPU: ```{python} from transformers import GPT2ForSequenceClassification, GPT2Config config = GPT2Config() model = GPT2ForSequenceClassification(config) model.eval() ``` Next you'll need to create some example inputs to use. These help `torch.distributed.pipelining` trace the model. However you make this example will determine the relative batch size that will be used/passed through the model at a given time, so make sure to remember how many items there are! ```{python} input = torch.randint( low=0, high=config.vocab_size, size=(2, 1024), # bs x seq_len device="cpu", dtype=torch.int64, requires_grad=False, ) ``` Next we need to actually perform the tracing and get the model ready. To do so, use the [`inference.prepare_pippy`] function and it will fully wrap the model for pipeline parallelism automatically: ```{python} from accelerate.inference import prepare_pippy example_inputs = {"input_ids": input} model = prepare_pippy(model, example_args=(input,)) ``` There are a variety of parameters you can pass through to `prepare_pippy`: * `split_points` lets you determine what layers to split the model at. By default we use wherever `device_map="auto" declares, such as `fc` or `conv1`. * `num_chunks` determines how the batch will be split and sent to the model itself (so `num_chunks=1` with four split points/four GPUs will have a naive MP where a single input gets passed between the four layer split points) From here, all that's left is to actually perform the distributed inference! When passing inputs, we highly recommend to pass them in as a tuple of arguments. Using `kwargs` is supported, however, this approach is experimental. ```{python} args = some_more_arguments with torch.no_grad(): output = model(*args) ``` When finished all the data will be on the last process only: ```{python} from accelerate import PartialState if PartialState().is_last_process: print(output) ``` If you pass in `gather_output=True` to [`inference.prepare_pippy`], the output will be sent across to all the GPUs afterwards without needing the `is_last_process` check. This is `False` by default as it incurs a communication call. And that's it! To explore more, please check out the inference examples in the [Accelerate repo](https://github.com/huggingface/accelerate/tree/main/examples/inference/pippy) and our [documentation](../package_reference/inference) as we work to improving this integration. accelerate-1.14.0/docs/source/usage_guides/explore.md000066400000000000000000000034621521253476100225740ustar00rootroot00000000000000 # Start Here! Please use the interactive tool below to help you get started with learning about a particular feature of Accelerate and how to utilize it! It will provide you with a code diff, an explanation towards what is going on, as well as provide you with some useful links to explore more within the documentation! Most code examples start from the following python code before integrating Accelerate in some way: ```python for batch in dataloader: optimizer.zero_grad() inputs, targets = batch inputs = inputs.to(device) targets = targets.to(device) outputs = model(inputs) loss = loss_function(outputs, targets) loss.backward() optimizer.step() scheduler.step() ```
accelerate-1.14.0/docs/source/usage_guides/fsdp.md000066400000000000000000000260171521253476100220530ustar00rootroot00000000000000 # Fully Sharded Data Parallel To accelerate training huge models on larger batch sizes, we can use a fully sharded data parallel model. This type of data parallel paradigm enables fitting more data and larger models by sharding the optimizer states, gradients and parameters. To read more about it and the benefits, check out the [Fully Sharded Data Parallel blog](https://pytorch.org/blog/introducing-pytorch-fully-sharded-data-parallel-api/). We have integrated the latest PyTorch's Fully Sharded Data Parallel (FSDP) training feature. All you need to do is enable it through the config. ## How it works out of the box On your machine(s) just run: ```bash accelerate config ``` and answer the questions asked. This will generate a config file that will be used automatically to properly set the default options when doing ```bash accelerate launch my_script.py --args_to_my_script ``` For instance, here is how you would run `examples/nlp_example.py` (from the root of the repo) with FSDP enabled: ```bash compute_environment: LOCAL_MACHINE debug: false distributed_type: FSDP downcast_bf16: 'no' fsdp_config: fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP fsdp_backward_prefetch_policy: BACKWARD_PRE fsdp_forward_prefetch: false fsdp_cpu_ram_efficient_loading: true fsdp_offload_params: false fsdp_sharding_strategy: FULL_SHARD fsdp_state_dict_type: SHARDED_STATE_DICT fsdp_sync_module_states: true fsdp_transformer_layer_cls_to_wrap: BertLayer fsdp_use_orig_params: true machine_rank: 0 main_training_function: main mixed_precision: bf16 num_machines: 1 num_processes: 2 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: false ``` ```bash accelerate launch examples/nlp_example.py ``` Currently, `Accelerate` supports the following config through the CLI: `fsdp_sharding_strategy`: [1] FULL_SHARD (shards optimizer states, gradients and parameters), [2] SHARD_GRAD_OP (shards optimizer states and gradients), [3] NO_SHARD (DDP), [4] HYBRID_SHARD (shards optimizer states, gradients and parameters within each node while each node has full copy), [5] HYBRID_SHARD_ZERO2 (shards optimizer states and gradients within each node while each node has full copy). For more information, please refer the official [PyTorch docs](https://pytorch.org/docs/stable/fsdp.html#torch.distributed.fsdp.ShardingStrategy). `fsdp_offload_params` : Decides Whether to offload parameters and gradients to CPU `fsdp_auto_wrap_policy`: [1] TRANSFORMER_BASED_WRAP, [2] SIZE_BASED_WRAP, [3] NO_WRAP `fsdp_transformer_layer_cls_to_wrap`: Only applicable for Transformers. When using `fsdp_auto_wrap_policy=TRANSFORMER_BASED_WRAP`, a user may provide a comma-separated string of transformer layer class names (case-sensitive) to wrap, e.g., `BertLayer`, `GPTJBlock`, `T5Block`, `BertLayer,BertEmbeddings,BertSelfOutput`. This is important because submodules that share weights (e.g., embedding layers) should not end up in different FSDP wrapped units. Using this policy, wrapping happens for each block containing Multi-Head Attention followed by a couple of MLP layers. Remaining layers including the shared embeddings are conveniently wrapped in same outermost FSDP unit. Therefore, use this for transformer-based models. You can use the `model._no_split_modules` for Transformer models by answering `yes` to `Do you want to use the model's `_no_split_modules` to wrap. It will try to use `model._no_split_modules` when possible. `fsdp_min_num_params`: minimum number of parameters when using `fsdp_auto_wrap_policy=SIZE_BASED_WRAP`. `fsdp_backward_prefetch_policy`: [1] BACKWARD_PRE, [2] BACKWARD_POST, [3] NO_PREFETCH `fsdp_forward_prefetch`: if True, then FSDP explicitly prefetches the next upcoming all-gather while executing in the forward pass. Should only be used for static-graph models since the prefetching follows the first iteration’s execution order. i.e., if the sub-modules' order changes dynamically during the model's execution do not enable this feature. `fsdp_state_dict_type`: [1] FULL_STATE_DICT, [2] LOCAL_STATE_DICT, [3] SHARDED_STATE_DICT `fsdp_use_orig_params`: If True, allows non-uniform `requires_grad` during init, which means support for interspersed frozen and trainable parameters. This setting is useful in cases such as parameter-efficient fine-tuning as discussed in [this post](https://dev-discuss.pytorch.org/t/rethinking-pytorch-fully-sharded-data-parallel-fsdp-from-first-principles/1019). This option also allows one to have multiple optimizer param groups. This should be `True` when creating an optimizer before preparing/wrapping the model with FSDP. `fsdp_cpu_ram_efficient_loading`: Only applicable for Transformers models. If True, only the first process loads the pretrained model checkpoint while all other processes have empty weights. This should be set to False if you experience errors when loading the pretrained Transformers model via `from_pretrained` method. When this setting is True `fsdp_sync_module_states` also must to be True, otherwise all the processes except the main process would have random weights leading to unexpected behaviour during training. For this to work, make sure the distributed process group is initialized before calling Transformers `from_pretrained` method. When using Trainer API, the distributed process group is initialized when you create an instance of `TrainingArguments` class. `fsdp_sync_module_states`: If True, each individually wrapped FSDP unit will broadcast module parameters from rank 0. For additional and more nuanced control, you can specify other FSDP parameters via `FullyShardedDataParallelPlugin`. When creating `FullyShardedDataParallelPlugin` object, pass it the parameters that weren't part of the accelerate config or if you want to override them. The FSDP parameters will be picked based on the accelerate config file or launch command arguments and other parameters that you will pass directly through the `FullyShardedDataParallelPlugin` object will set/override that. Below is an example: ```py from accelerate import FullyShardedDataParallelPlugin from torch.distributed.fsdp.fully_sharded_data_parallel import FullOptimStateDictConfig, FullStateDictConfig fsdp_plugin = FullyShardedDataParallelPlugin( state_dict_config=FullStateDictConfig(offload_to_cpu=False, rank0_only=False), optim_state_dict_config=FullOptimStateDictConfig(offload_to_cpu=False, rank0_only=False), ) accelerator = Accelerator(fsdp_plugin=fsdp_plugin) ``` ## Saving and loading The new recommended way of checkpointing when using FSDP models is to use `SHARDED_STATE_DICT` as `StateDictType` when setting up the accelerate config. Below is the code snippet to save using `save_state` utility of accelerate. ```py accelerator.save_state("ckpt") ``` Inspect the checkpoint folder to see model and optimizer as shards per process: ``` ls ckpt # optimizer_0 pytorch_model_0 random_states_0.pkl random_states_1.pkl scheduler.bin cd ckpt ls optimizer_0 # __0_0.distcp __1_0.distcp ls pytorch_model_0 # __0_0.distcp __1_0.distcp ``` To load them back for resuming the training, use the `load_state` utility of accelerate ```py accelerator.load_state("ckpt") ``` When using transformers `save_pretrained`, pass `state_dict=accelerator.get_state_dict(model)` to save the model state dict. Below is an example: ```diff unwrapped_model.save_pretrained( args.output_dir, is_main_process=accelerator.is_main_process, save_function=accelerator.save, + state_dict=accelerator.get_state_dict(model), ) ``` ### State Dict `accelerator.get_state_dict` will call the underlying `model.state_dict` implementation using `FullStateDictConfig(offload_to_cpu=True, rank0_only=True)` context manager to get the state dict only for rank 0 and it will be offloaded to CPU. You can then pass `state` into the `save_pretrained` method. There are several modes for `StateDictType` and `FullStateDictConfig` that you can use to control the behavior of `state_dict`. For more information, see the [PyTorch documentation](https://pytorch.org/docs/stable/fsdp.html). If you choose to use `StateDictType.SHARDED_STATE_DICT`, the weights of the model during `Accelerator.save_state` will be split into `n` files for each sub-split on the model. To merge them back into a single dictionary to load back into the model later after training you can use the `merge_weights` utility: ```py from accelerate.utils import merge_fsdp_weights # Our weights are saved usually in a `pytorch_model_fsdp_{model_number}` folder merge_fsdp_weights("pytorch_model_fsdp_0", "output_path", safe_serialization=True) ``` The final output will then either be saved to `model.safetensors` or `pytorch_model.bin` (if `safe_serialization=False` is passed). This can also be called using the CLI: ```bash accelerate merge-weights pytorch_model_fsdp_0/ output_path ``` ## Mapping between FSDP sharding strategies and DeepSpeed ZeRO Stages * `FULL_SHARD` maps to the DeepSpeed `ZeRO Stage-3`. Shards optimizer states, gradients and parameters. * `SHARD_GRAD_OP` maps to the DeepSpeed `ZeRO Stage-2`. Shards optimizer states and gradients. * `NO_SHARD` maps to `ZeRO Stage-0`. No sharding wherein each GPU has full copy of model, optimizer states and gradients. * `HYBRID_SHARD` maps to `ZeRO++ Stage-3` wherein `zero_hpz_partition_size=`. Here, this will shard optimizer states, gradients and parameters within each node while each node has full copy. ## A few caveats to be aware of - In case of multiple models, pass the optimizers to the prepare call in the same order as corresponding models else `accelerator.save_state()` and `accelerator.load_state()` will result in wrong/unexpected behaviour. - This feature is incompatible with `--predict_with_generate` in the `run_translation.py` script of `Transformers` library. For more control, users can leverage the `FullyShardedDataParallelPlugin`. After creating an instance of this class, users can pass it to the Accelerator class instantiation. For more information on these options, please refer to the PyTorch [FullyShardedDataParallel](https://github.com/pytorch/pytorch/blob/0df2e863fbd5993a7b9e652910792bd21a516ff3/torch/distributed/fsdp/fully_sharded_data_parallel.py#L236) code. For those interested in the similarities and differences between FSDP and DeepSpeed, please check out the [concept guide here](../concept_guides/fsdp_and_deepspeed)! accelerate-1.14.0/docs/source/usage_guides/gaudi.md000066400000000000000000000050371521253476100222070ustar00rootroot00000000000000 # Intel Gaudi Users can take advantage of Intel Gaudi AI accelerators for significantly faster and cost-effective model training and inference. The Intel Gaudi AI accelerator family currently includes three product generations: [Intel Gaudi 1](https://habana.ai/products/gaudi/), [Intel Gaudi 2](https://habana.ai/products/gaudi2/), and [Intel Gaudi 3](https://habana.ai/products/gaudi3/). Each server is equipped with 8 devices, known as Habana Processing Units (HPUs), providing 128GB of memory on Gaudi 3, 96GB on Gaudi 2, and 32GB on the first-gen Gaudi. For more details on the underlying hardware architecture, check out the [Gaudi Architecture Overview](https://docs.habana.ai/en/latest/Gaudi_Overview/Gaudi_Architecture.html). ## How it works out of the box It is enabled by default if an Intel Gaudi device is detected. To disable it, pass `--cpu` flag to `accelerate launch` command or answer the corresponding question when answering the `accelerate config` questionnaire. You can directly run the following script to test it out on Intel Gaudi: ```bash accelerate launch /examples/cv_example.py --data_dir images ``` ## Limitations The following features are not part of the Accelerate library and requires [Optimum for Intel Gaudi](https://huggingface.co/docs/optimum/main/en/habana/index): - `fast_ddp` which implements DDP by applying an all-reduce on gradients instead of the Torch DDP wrapper. - `minimize_memory` which is used for fp8 training and enables keeping fp8 weights in memory between the forward and backward passes, leading to a smaller memory footprint at the cost of additional fp8 casts. - `context_parallel_size` which is used for Context/Sequence Parallelism (CP/SP) and partitions the network inputs and activations along sequence dimension to reduce memory footprint and increase throughput. accelerate-1.14.0/docs/source/usage_guides/gradient_accumulation.md000066400000000000000000000512251521253476100254570ustar00rootroot00000000000000 # Performing gradient accumulation with Accelerate Gradient accumulation is a technique where you can train on bigger batch sizes than your machine would normally be able to fit into memory. This is done by accumulating gradients over several batches, and only stepping the optimizer after a certain number of batches have been performed. While technically standard gradient accumulation code would work fine in a distributed setup, it is not the most efficient method for doing so and you may experience considerable slowdowns! In this tutorial you will see how to quickly setup gradient accumulation and perform it with the utilities provided in Accelerate, which can total to adding just one new line of code! This example will use a very simplistic PyTorch training loop that performs gradient accumulation every two batches: ```python device = "cuda" model.to(device) gradient_accumulation_steps = 2 for index, batch in enumerate(training_dataloader): inputs, targets = batch inputs = inputs.to(device) targets = targets.to(device) outputs = model(inputs) loss = loss_function(outputs, targets) loss = loss / gradient_accumulation_steps loss.backward() if (index + 1) % gradient_accumulation_steps == 0: optimizer.step() scheduler.step() optimizer.zero_grad() ``` ## Converting it to Accelerate First the code shown earlier will be converted to utilize Accelerate without the special gradient accumulation helper: ```diff + from accelerate import Accelerator + accelerator = Accelerator() + model, optimizer, training_dataloader, scheduler = accelerator.prepare( + model, optimizer, training_dataloader, scheduler + ) for index, batch in enumerate(training_dataloader): inputs, targets = batch - inputs = inputs.to(device) - targets = targets.to(device) outputs = model(inputs) loss = loss_function(outputs, targets) loss = loss / gradient_accumulation_steps + accelerator.backward(loss) if (index+1) % gradient_accumulation_steps == 0: optimizer.step() scheduler.step() optimizer.zero_grad() ``` In its current state, this code is not going to perform gradient accumulation efficiently due to a process called gradient synchronization. Read more about that in the [Concepts tutorial](../concept_guides/gradient_synchronization)! ## Letting Accelerate handle gradient accumulation All that is left now is to let Accelerate handle the gradient accumulation for us. To do so you should pass in a `gradient_accumulation_steps` parameter to [`Accelerator`], dictating the number of steps to perform before each call to `step()` and how to automatically adjust the loss during the call to [`~Accelerator.backward`]: ```diff from accelerate import Accelerator - accelerator = Accelerator() + accelerator = Accelerator(gradient_accumulation_steps=2) ``` Alternatively, you can pass in a `gradient_accumulation_plugin` parameter to the [`Accelerator`] object's `__init__`, which will allow you to further customize the gradient accumulation behavior. Read more about that in the [GradientAccumulationPlugin](../package_reference/accelerator#accelerate.utils.GradientAccumulationPlugin) docs. From here you can use the [`~Accelerator.accumulate`] context manager from inside your training loop to automatically perform the gradient accumulation for you! You just wrap it around the entire training part of our code: ```diff - for index, batch in enumerate(training_dataloader): + for batch in training_dataloader: + with accelerator.accumulate(model): inputs, targets = batch outputs = model(inputs) ``` You can remove all the special checks for the step number and the loss adjustment: ```diff - loss = loss / gradient_accumulation_steps accelerator.backward(loss) - if (index+1) % gradient_accumulation_steps == 0: optimizer.step() scheduler.step() optimizer.zero_grad() ``` As you can see the [`Accelerator`] is able to keep track of the batch number you are on and it will automatically know whether to step through the prepared optimizer and how to adjust the loss. Typically with gradient accumulation, you would need to adjust the number of steps to reflect the change in total batches you are training on. Accelerate automagically does this for you by default. Behind the scenes we instantiate a [`GradientAccumulationPlugin`] configured to do this. The [`state.GradientState`] is sync'd with the active dataloader being iterated upon. As such it assumes naively that when we have reached the end of the dataloader everything will sync and a step will be performed. To disable this, set `sync_with_dataloader` to be `False` in the [`GradientAccumulationPlugin`]: ```{python} from accelerate import Accelerator from accelerate.utils import GradientAccumulationPlugin plugin = GradientAccumulationPlugin(sync_with_dataloader=False) accelerator = Accelerator(..., gradient_accumulation_plugin=plugin) ``` ## The finished code Below is the finished implementation for performing gradient accumulation with Accelerate ```python from accelerate import Accelerator accelerator = Accelerator(gradient_accumulation_steps=2) model, optimizer, training_dataloader, scheduler = accelerator.prepare( model, optimizer, training_dataloader, scheduler ) for batch in training_dataloader: with accelerator.accumulate(model): inputs, targets = batch outputs = model(inputs) loss = loss_function(outputs, targets) accelerator.backward(loss) optimizer.step() scheduler.step() optimizer.zero_grad() ``` It's important that **only one forward/backward** should be done inside the context manager `with accelerator.accumulate(model)`. To learn more about what magic this wraps around, read the [Gradient Synchronization concept guide](../concept_guides/gradient_synchronization) ## Self-contained example Here is a self-contained example that you can run to see gradient accumulation in action with Accelerate: ```python import torch import copy from accelerate import Accelerator from accelerate.utils import set_seed from torch.utils.data import TensorDataset, DataLoader # seed set_seed(0) # define toy inputs and labels x = torch.tensor([1., 2., 3., 4., 5., 6., 7., 8.]) y = torch.tensor([2., 4., 6., 8., 10., 12., 14., 16.]) gradient_accumulation_steps = 4 per_device_batch_size = len(x) // gradient_accumulation_steps # define dataset and dataloader dataset = TensorDataset(x, y) dataloader = DataLoader(dataset, batch_size=per_device_batch_size) # define model, optimizer and loss function class SimpleLinearModel(torch.nn.Module): def __init__(self): super(SimpleLinearModel, self).__init__() self.weight = torch.nn.Parameter(torch.zeros((1, 1))) def forward(self, inputs): return inputs @ self.weight model = SimpleLinearModel() model_clone = copy.deepcopy(model) criterion = torch.nn.MSELoss() model_optimizer = torch.optim.SGD(model.parameters(), lr=0.02) accelerator = Accelerator(gradient_accumulation_steps=gradient_accumulation_steps) model, model_optimizer, dataloader = accelerator.prepare(model, model_optimizer, dataloader) model_clone_optimizer = torch.optim.SGD(model_clone.parameters(), lr=0.02) print(f"initial model weight is {model.weight.mean().item():.5f}") print(f"initial model weight is {model_clone.weight.mean().item():.5f}") for i, (inputs, labels) in enumerate(dataloader): with accelerator.accumulate(model): inputs = inputs.view(-1, 1) print(i, inputs.flatten()) labels = labels.view(-1, 1) outputs = model(inputs) loss = criterion(outputs, labels) accelerator.backward(loss) model_optimizer.step() model_optimizer.zero_grad() loss = criterion(x.view(-1, 1) @ model_clone.weight, y.view(-1, 1)) model_clone_optimizer.zero_grad() loss.backward() model_clone_optimizer.step() print(f"w/ accumulation, the final model weight is {model.weight.mean().item():.5f}") print(f"w/o accumulation, the final model weight is {model_clone.weight.mean().item():.5f}") ``` ``` initial model weight is 0.00000 initial model weight is 0.00000 0 tensor([1., 2.]) 1 tensor([3., 4.]) 2 tensor([5., 6.]) 3 tensor([7., 8.]) w/ accumulation, the final model weight is 2.04000 w/o accumulation, the final model weight is 2.04000 ``` ## Gradient accumulation on training samples of variable size As was pointed out in this [blog-post](https://huggingface.co/blog/gradient_accumulation), which points out a common error that occurs when performing gradient accumulation on training samples of variable size: > [...] for gradient accumulation across token-level tasks like causal LM training, the correct loss should be computed by the **total loss across all batches in a gradient accumulation step** divided by the **total number of all non padding tokens in those batches**. This is not the same as the average of the per-batch loss values. In other words, some adjustments must be made on losses that operate on a token-level basis. ### Skeleton code ```python from accelerate import Accelerator import math import contextlib gradient_accumulation_steps = 2 accelerator = Accelerator(gradient_accumulation_steps=gradient_accumulation_steps) model, optimizer, training_dataloader, scheduler = accelerator.prepare( model, optimizer, training_dataloader, scheduler ) training_iterator = iter(training_dataloader) num_samples_in_epoch = len(training_dataloader) remainder = num_samples_in_epoch % gradient_accumulation_steps remainder = remainder if remainder != 0 else gradient_accumulation_steps total_updates = math.ceil(num_samples_in_epoch / gradient_accumulation_steps) total_batched_samples = 0 for update_step in range(total_updates): # In order to correctly the total number of non-padded tokens on which we'll compute the cross-entropy loss # we need to pre-load the full local batch - i.e the next per_device_batch_size * accumulation_steps samples batch_samples = [] num_batches_in_step = gradient_accumulation_steps if update_step != (total_updates - 1) else remainder for _ in range(num_batches_in_step): batch_samples += [next(training_iterator)] # get local num items in batch num_items_in_batch = sum([(batch["labels"].ne(-100)).sum() for batch in batch_samples]) # to compute it correctly in a multi-device DDP training, we need to gather the total number of items in the full batch. num_items_in_batch = accelerator.gather(num_items_in_batch).sum().item() for i, batch in enumerate(batch_samples): # if we perform gradient accumulation in a multi-devices set-up, we want to avoid unnecessary communications when accumulating # cf: https://muellerzr.github.io/blog/gradient_accumulation.html if (i < len(batch_samples) - 1 and accelerator.num_processes > 1): ctx = model.no_sync else: ctx = contextlib.nullcontext total_batched_samples += 1 with ctx(): inputs, targets = batch outputs = model(inputs) loss = loss_function(outputs, targets) # the loss function should sum over samples rather than averaging # We multiply by num_processes because the DDP calculates the average gradient across all devices whereas dividing by num_items_in_batch already takes into account all devices # Same reason for gradient_accumulation_steps, but this times it's Accelerate that calculate the average gradient across the accumulated steps loss = (loss * gradient_accumulation_steps * accelerator.num_processes) / num_items_in_batch accelerator.backward(loss) # Sync gradients and perform optimization steps once every gradient_accumulation_steps optimizer.step() scheduler.step() optimizer.zero_grad() ``` ### Self-contained causal LM example ```py import torch import copy from accelerate import Accelerator from accelerate.utils import set_seed from accelerate.logging import get_logger from torch.utils.data import Dataset, DataLoader import math import contexlib # seed set_seed(0) logger = get_logger(__name__) class MyDataset(Dataset): def __init__(self, num_samples): super().__init__() self.len = num_samples def __getitem__(self, index): input_ids = torch.arange(1, index+2, dtype=torch.float32) labels = torch.remainder(input_ids, 2) return {"input_ids": input_ids, "labels": labels} def __len__(self): return self.len def collate_fn(features): input_ids = torch.nn.utils.rnn.pad_sequence([f["input_ids"] for f in features], batch_first=True, padding_value=-100) labels = torch.nn.utils.rnn.pad_sequence([f["labels"] for f in features], batch_first=True, padding_value=-100) return {"input_ids": input_ids[..., None], "labels": labels[..., None]} # define toy inputs and labels gradient_accumulation_steps = 2 per_device_batch_size = 4 # define accelerator accelerator = Accelerator(gradient_accumulation_steps=gradient_accumulation_steps) # define dataset and dataloader # for this toy example, we'll compute gradient descent over one single global batch dataset = MyDataset(per_device_batch_size*gradient_accumulation_steps*accelerator.num_processes) dataloader = DataLoader(dataset, batch_size=per_device_batch_size, collate_fn=collate_fn) # define model, model_optimizer and loss function model = torch.nn.Linear(1, 2, bias=False) model_clone = copy.deepcopy(model) criterion = torch.nn.CrossEntropyLoss(reduction="sum") # must sum over samples rather than averaging model_optimizer = torch.optim.SGD(model.parameters(), lr=0.08) logger.warning(f"initial model weight is {model.weight.detach().cpu().squeeze()}") logger.warning(f"initial model clone weight is {model_clone.weight.detach().cpu().squeeze()}") # prepare artifacts - accelerator handles device placement and dataloader splitting model, model_optimizer = accelerator.prepare(model, model_optimizer) dataloader = accelerator.prepare_data_loader(dataloader, device_placement=True) training_iterator = iter(dataloader) num_samples_in_epoch = len(dataloader) remainder = num_samples_in_epoch % gradient_accumulation_steps remainder = remainder if remainder != 0 else gradient_accumulation_steps total_gradient_updates = math.ceil(num_samples_in_epoch / gradient_accumulation_steps) total_batched_samples = 0 for update_step in range(total_gradient_updates): # In order to correctly the total number of non-padded tokens on which we'll compute the cross-entropy loss # we need to pre-load the full local batch - i.e the next per_device_batch_size * accumulation_steps samples batch_samples = [] num_batches_in_step = gradient_accumulation_steps if update_step != (total_gradient_updates - 1) else remainder for _ in range(num_batches_in_step): batch_samples += [next(training_iterator)] # get local num items in batch local_num_items_in_batch = sum([(batch["labels"].ne(-100)).sum() for batch in batch_samples]) logger.warning(f"Step {update_step} - Device {accelerator.process_index} - num items in the local batch {local_num_items_in_batch}", main_process_only=False) # to compute it correctly in a multi-device DDP training, we need to gather the total number of items in the full batch. num_items_in_batch = accelerator.gather(local_num_items_in_batch).sum().item() logger.warning(f"Total num items {num_items_in_batch}") for i, batch in enumerate(batch_samples): inputs, labels = batch["input_ids"], batch["labels"] total_batched_samples += 1 # if we perform gradient accumulation in a multi-devices set-up, we want to avoid unnecessary communications when accumulating # cf: https://muellerzr.github.io/blog/gradient_accumulation.html if (i < len(batch_samples) - 1 and accelerator.num_processes > 1): ctx = model.no_sync else: ctx = contextlib.nullcontext with ctx(): outputs = model(inputs) loss = criterion(outputs.view(-1, 2), labels.view(-1).to(torch.int64)) # We multiply by num_processes because the DDP calculates the average gradient across all devices whereas dividing by num_items_in_batch already takes into account all devices # Same reason for gradient_accumulation_steps, but this times it's Accelerate that calculate the average gradient across the accumulated steps loss = (loss * gradient_accumulation_steps * accelerator.num_processes) / num_items_in_batch accelerator.backward(loss) model_optimizer.step() model_optimizer.zero_grad() logger.warning(f"Device {accelerator.process_index} - w/ accumulation, the final model weight is {accelerator.unwrap_model(model).weight.detach().cpu().squeeze()}", main_process_only=False) # We know do the same operation but on a single device and without gradient accumulation if accelerator.is_main_process: # prepare one single entire batch dataloader = DataLoader(dataset, batch_size=len(dataset), collate_fn=collate_fn) full_batch_without_accum = next(iter(dataloader)) total_inputs, total_labels = full_batch_without_accum["input_ids"], full_batch_without_accum["labels"] model_clone_optimizer = torch.optim.SGD(model_clone.parameters(), lr=0.08) # train the cloned model loss = torch.nn.CrossEntropyLoss(reduction="mean")(model_clone(total_inputs).view(-1, 2), total_labels.view(-1).to(torch.int64)) model_clone_optimizer.zero_grad() loss.backward() model_clone_optimizer.step() # We should have the same final weights. logger.warning(f"w/o accumulation, the final model weight is {model_clone.weight.detach().cpu().squeeze()}") ``` Results on a single device - gradient accumulation steps set to 1 and batch_size set to 8: ``` initial model weight is tensor([-0.0075, 0.5364]) initial model clone weight is tensor([-0.0075, 0.5364]) Step 0 - Device 0 - num items in the local batch 36 Total num items 36 Device 0 - w/ accumulation, the final model weight is tensor([0.0953, 0.4337]) w/o accumulation, the final model weight is tensor([0.0953, 0.4337]) ``` Results on a two devices set-up - gradient accumulation steps set to 2 and batch_size set to 4. ``` initial model weight is tensor([-0.0075, 0.5364]) initial model clone weight is tensor([-0.0075, 0.5364]) Step 0 - Device 0 - num items in the local batch 52 Step 0 - Device 1 - num items in the local batch 84 Total num items 136 Device 1 - w/ accumulation, the final model weight is tensor([0.2117, 0.3172]) Device 0 - w/ accumulation, the final model weight is tensor([0.2117, 0.3172]) w/o accumulation, the final model weight is tensor([0.2117, 0.3172]) ``` ### To go further: Please find a complete example script on a real world training run in the examples folder at the path [`accelerate/examples/by_feature/gradient_accumulation_for_autoregressive_models.py`](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/gradient_accumulation_for_autoregressive_models.py). Running it on several training configurations with constant global batch size equal to 32 gives the following graph:
Note that the training losses are exactly the same up to training step 20. The small deviation after this training step occurs at the very end of the first epoch, because, by [default](https://huggingface.co/docs/accelerate/en/package_reference/torch_wrappers#accelerate.data_loader.prepare_data_loader.even_batches), the dataloader duplicates the samples at the beginning of the dataset when the total batch size doesn't exactly divide the dataset. accelerate-1.14.0/docs/source/usage_guides/intel_cpu.md000066400000000000000000000147241521253476100231030ustar00rootroot00000000000000 # Training on Intel CPU ## How It Works For Training optimization in CPU Accelerate has full support for Intel CPU, all you need to do is enabling it through the config. **Scenario 1**: Acceleration of No distributed CPU training Run accelerate config on your machine: ```bash $ accelerate config ----------------------------------------------------------------------------------------------------------------------------------------------------------- In which compute environment are you running? This machine ----------------------------------------------------------------------------------------------------------------------------------------------------------- Which type of machine are you using? No distributed training Do you want to run your training on CPU only (even if a GPU / Apple Silicon device is available)? [yes/NO]:yes Do you wish to optimize your script with torch dynamo?[yes/NO]:NO Do you want to use DeepSpeed? [yes/NO]: NO ----------------------------------------------------------------------------------------------------------------------------------------------------------- Do you wish to use FP16 or BF16 (mixed precision)? bf16 ``` This will generate a config file that will be used automatically to properly set the default options when doing ```bash accelerate launch my_script.py --args_to_my_script ``` For instance, here is how you would run the NLP example `examples/nlp_example.py` (from the root of the repo) with `default_config.yaml` which is generated by `accelerate config` ```bash compute_environment: LOCAL_MACHINE distributed_type: 'NO' downcast_bf16: 'no' machine_rank: 0 main_training_function: main mixed_precision: bf16 num_machines: 1 num_processes: 1 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: true ``` ```bash accelerate launch examples/nlp_example.py ``` > [!CAUTION] > `accelerator.prepare` can currently only handle simultaneously preparing multiple models (and no optimizer) OR a single model-optimizer pair for training. Other attempts (e.g., two model-optimizer pairs) will raise a verbose error. To work around this limitation, consider separately using `accelerator.prepare` for each model-optimizer pair. **Scenario 2**: Acceleration of distributed CPU training we use Intel oneCCL for communication, combined with Intel® MPI library to deliver flexible, efficient, scalable cluster messaging on Intel® architecture. you could refer the [here](https://huggingface.co/docs/transformers/perf_train_cpu_many) for the installation guide Run accelerate config on your machine(node0): ```bash $ accelerate config ----------------------------------------------------------------------------------------------------------------------------------------------------------- In which compute environment are you running? This machine ----------------------------------------------------------------------------------------------------------------------------------------------------------- Which type of machine are you using? multi-CPU How many different machines will you use (use more than 1 for multi-node training)? [1]: 4 ----------------------------------------------------------------------------------------------------------------------------------------------------------- What is the rank of this machine? 0 What is the IP address of the machine that will host the main process? 36.112.23.24 What is the port you will use to communicate with the main process? 29500 Are all the machines on the same local network? Answer `no` if nodes are on the cloud and/or on different network hosts [YES/no]: yes Do you want accelerate to launch mpirun? [yes/NO]: yes Please enter the path to the hostfile to use with mpirun [~/hostfile]: ~/hostfile Enter the number of oneCCL worker threads [1]: 1 Do you wish to optimize your script with torch dynamo?[yes/NO]:NO How many processes should be used for distributed training? [1]:16 ----------------------------------------------------------------------------------------------------------------------------------------------------------- Do you wish to use FP16 or BF16 (mixed precision)? bf16 ``` For instance, here is how you would run the NLP example `examples/nlp_example.py` (from the root of the repo) for distributed CPU training. `default_config.yaml` which is generated by `accelerate config` ```bash compute_environment: LOCAL_MACHINE distributed_type: MULTI_CPU downcast_bf16: 'no' machine_rank: 0 main_process_ip: 36.112.23.24 main_process_port: 29500 main_training_function: main mixed_precision: bf16 mpirun_config: mpirun_hostfile: /home/user/hostfile num_machines: 4 num_processes: 16 rdzv_backend: static same_network: true tpu_env: [] tpu_use_cluster: false tpu_use_sudo: false use_cpu: true ``` Set following env and using intel MPI to launch the training In `node0`, you need to create a configuration file which contains the IP addresses of each node (for example hostfile) and pass that configuration file path as an argument. If you selected to let Accelerate launch `mpirun`, ensure that the location of your hostfile matches the path in the config. ```bash $ cat hostfile xxx.xxx.xxx.xxx #node0 ip xxx.xxx.xxx.xxx #node1 ip xxx.xxx.xxx.xxx #node2 ip xxx.xxx.xxx.xxx #node3 ip ``` ```bash accelerate launch examples/nlp_example.py ``` You can also directly launch distributed training with `mpirun` command, you need to run the following command in node0 and **16DDP** will be enabled in node0,node1,node2,node3 with BF16 mixed precision. When using this method, the python script, python environment, and accelerate config file need to be available on all of the machines used for multi-CPU training. ```bash export MASTER_ADDR=xxx.xxx.xxx.xxx #node0 ip mpirun -f hostfile -n 16 -ppn 4 accelerate launch examples/nlp_example.py ``` accelerate-1.14.0/docs/source/usage_guides/local_sgd.md000066400000000000000000000116051521253476100230430ustar00rootroot00000000000000 # Using Local SGD with Accelerate Local SGD is a technique for distributed training where gradients are not synchronized every step. Thus, each process updates its own version of the model weights and after a given number of steps these weights are synchronized by averaging across all processes. This improves communication efficiency and can lead to substantial training speed up especially when a computer lacks a faster interconnect such as NVLink. Unlike gradient accumulation (where improving communication efficiency requires increasing the effective batch size), Local SGD does not require changing a batch size or a learning rate / schedule. However, if necessary, Local SGD can be combined with gradient accumulation as well. In this tutorial you will see how to quickly setup Local SGD Accelerate. Compared to a standard Accelerate setup, this requires only two extra lines of code. This example will use a very simplistic PyTorch training loop that performs gradient accumulation every two batches: ```python device = "cuda" model.to(device) gradient_accumulation_steps = 2 for index, batch in enumerate(training_dataloader): inputs, targets = batch inputs = inputs.to(device) targets = targets.to(device) outputs = model(inputs) loss = loss_function(outputs, targets) loss = loss / gradient_accumulation_steps loss.backward() if (index + 1) % gradient_accumulation_steps == 0: optimizer.step() scheduler.step() optimizer.zero_grad() ``` ## Converting it to Accelerate First the code shown earlier will be converted to use Accelerate with neither a LocalSGD or a gradient accumulation helper: ```diff + from accelerate import Accelerator + accelerator = Accelerator() + model, optimizer, training_dataloader, scheduler = accelerator.prepare( + model, optimizer, training_dataloader, scheduler + ) for index, batch in enumerate(training_dataloader): inputs, targets = batch - inputs = inputs.to(device) - targets = targets.to(device) outputs = model(inputs) loss = loss_function(outputs, targets) loss = loss / gradient_accumulation_steps + accelerator.backward(loss) if (index+1) % gradient_accumulation_steps == 0: optimizer.step() scheduler.step() ``` ## Letting Accelerate handle model synchronization All that is left now is to let Accelerate handle model parameter synchronization **and** the gradient accumulation for us. For simplicity let us assume we need to synchronize every 8 steps. This is achieved by adding one `with LocalSGD` statement and one call `local_sgd.step()` after every optimizer step: ```diff +local_sgd_steps=8 +with LocalSGD(accelerator=accelerator, model=model, local_sgd_steps=8, enabled=True) as local_sgd: for batch in training_dataloader: with accelerator.accumulate(model): inputs, targets = batch outputs = model(inputs) loss = loss_function(outputs, targets) accelerator.backward(loss) optimizer.step() scheduler.step() optimizer.zero_grad() + local_sgd.step() ``` Under the hood, the Local SGD code **disables** automatic gradient synchronization (but accumulation still works as expected!). Instead it averages model parameters every `local_sgd_steps` steps (as well as at the end of the training loop). ## Limitations The current implementation works only with basic multi-GPU (or multi-CPU) training without, e.g., [DeepSpeed.](https://github.com/deepspeedai/DeepSpeed). ## References Although we are not aware of the true origins of this simple approach, the idea of local SGD is quite old and goes back to at least: Zhang, J., De Sa, C., Mitliagkas, I., & Ré, C. (2016). [Parallel SGD: When does averaging help?. arXiv preprint arXiv:1606.07365.](https://huggingface.co/papers/1606.07365) We credit the term Local SGD to the following paper (but there might be earlier references we are not aware of). Stich, Sebastian Urban. ["Local SGD Converges Fast and Communicates Little." ICLR 2019-International Conference on Learning Representations. No. CONF. 2019.](https://huggingface.co/papers/1805.09767) accelerate-1.14.0/docs/source/usage_guides/low_precision_training.md000066400000000000000000000234111521253476100256610ustar00rootroot00000000000000 # Low Precision Training Methods Accelerate provides integrations to train on lower precision methods using specified supported hardware through the `TransformersEngine`, `MS-AMP`, and `torchao` packages. This documentation will help guide you through what hardware is supported, how to configure your [`Accelerator`] to leverage the low precision methods, and what you can expect when training. ## What training on FP8 means To explore more of the nitty-gritty in training in FP8 with PyTorch and Accelerate, check out the [concept_guide](../concept_guides/low_precision_training) on why this can be difficult. But essentially rather than training in BF16, some (or all) aspects of training a model can be performed using 8 bits instead of 16. The challenge is doing so without degrading final performance. This is only enabled on specific NVIDIA hardware, namely: * Anything after the 3000 series consumer graphics cards (such as the 4090) * Hopper-based GPU architectures (such as the `H100` and `H200`) What this will result in is some reduction in the memory used (as we've cut the needed memory in half for some parts of training) and an increase in throughput *should* be seen as well for larger models that can replace certain layers with FP8-enabled ones. ## Configuring the Accelerator Currently two actively maintained backends for FP8 are supported (`TransformersEngine` and `torchao`), each with different capabilities and configurations. A legacy `MS-AMP` backend also exists but is no longer recommended (see [below](#configuring-ms-amp) for details). To use either, the same core API is used. Just pass `mixed_precision="fp8"` to either the [`Accelerator`], during `accelerate config` when prompted about mixed precision, or as part of your `config.yaml` file in the `mixed_precision` key: ```{python} from accelerate import Accelerator accelerator = Accelerator(mixed_precision="fp8") ``` To specify a backend (and customize other parts of the FP8 mixed precision setup), you can utilize one of the `RecipeKwargs` dataclasses such as [`utils.AORecipeKwargs`], [`utils.TERecipeKwargs`], or [`utils.MSAMPRecipeKwargs`]; you can also clarify it in your config `yaml`/during `accelerate launch`. We recommend using `TransformersEngine` or `torchao` for new projects: ```{python} from accelerate import Accelerator from accelerate.utils import TERecipeKwargs, AORecipeKwargs # Use TransformersEngine kwargs = [TERecipeKwargs()] # Or to use torchao # kwargs = [AORecipeKwargs()] accelerator = Accelerator(mixed_precision="fp8", kwarg_handlers=kwargs) ``` ```{yaml} mixed_precision: fp8 fp8_config: amax_compute_algo: max amax_history_len: 1024 backend: TE fp8_format: HYBRID interval: 1 margin: 0 override_linear_precision: (false, false, false) use_autocast_during_eval: false ``` ## Configuring MS-AMP **⚠� Deprecated / Unmaintained:** MS-AMP is no longer actively maintained by Microsoft. The [MS-AMP repository](https://github.com/Azure/MS-AMP) has not received updates since 2023 and has known compatibility issues: - Requires CUDA 11.x (does not support CUDA 12.x+) - Requires older NCCL versions incompatible with recent PyTorch releases - Does not support recent PyTorch versions (2.2+) **We strongly recommend using [`TransformersEngine`](#configuring-transformersengine) or [`torchao`](#configuring-torchao) instead for all new and existing FP8 training workflows.** Both are actively maintained and support modern CUDA/PyTorch versions. Native PyTorch FP8 support via `torchao` is particularly promising as a vendor-neutral solution. The MS-AMP backend is retained in Accelerate for legacy compatibility but may be removed in a future release. `MS-AMP` has a single configuration argument: the optimization level. Currently two levels of optimization are supported in the Accelerate integration, `"O1"` and `"O2"` (using the letter 'o', not zero). * `"O1"` will cast the weight gradients and `all_reduce` communications to happen in 8-bit, while the rest are done in 16 bit. This reduces the general GPU memory usage and speeds up communication bandwidths. * `"O2"` will also cast first-order optimizer states into 8 bit, while the second order states are in FP16. (Currently just the `Adam` optimizer is supported). This tries its best to minimize final accuracy degradation and will save the highest potential memory. To specify an optimization level, pass it to the `FP8KwargsHandler` by setting the `optimization_level` argument: ```{python} from accelerate import Accelerator from accelerate.utils import FP8RecipeKwargs kwargs = [FP8RecipeKwargs(backend="msamp", optimization_level="O2")] accelerator = Accelerator(mixed_precision="fp8", kwarg_handlers=kwargs) ``` Or during `accelerate launch` via `--fp8_backend=msamp --fp8_opt_level=O2` Similarly this can be set in your `config.yaml`: ```{yaml} mixed_precision: fp8 fp8_config: backend: MSAMP opt_level: O2 ``` ## Configuring TransformersEngine TransformersEngine has many options for customizing how and what FP8 calculations are performed. A full list of supported arguments and what they mean are available in [NVIDIA's documentation](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/api/common.html), however they are restated as part of [`FP8KwargsHandler`]'s docstring for your convenience. Accelerate tries to set sensible defaults, but exploring and tweaking the various parameters yourself can lead to better performance potentially. To use it, specify `backend="te"` and modify any of the arguments you want as part of your kwarg handler: ```{python} from accelerate import Accelerator from accelerate.utils import FP8RecipeKwargs kwargs = [FP8RecipeKwargs(backend="te", ...)] accelerator = Accelerator(mixed_precision="fp8", kwarg_handlers=kwargs) ``` Or during `accelerate launch` via `--fp8_backend=te ...`. Use `accelerate launch --fp8_backend=te -h` to see relevant arguments. Similarly this can be set in your `config.yaml`: ```{yaml} mixed_precision: fp8 fp8_config: amax_compute_algo: max amax_history_len: 1024 backend: TE fp8_format: HYBRID interval: 1 margin: 0 override_linear_precision: (false, false, false) use_autocast_during_eval: false ``` ## Configuring `torchao` `torchao` is a [PyTorch-driven](https://github.com/pytorch/ao/tree/main/torchao/float8) hackable FP8 backend, aiming to be more approchable than the prior two engines. One of the core differences with `ao` compared to the prior two is that for numerical stability, it's found to be generally better off keeping the first *and* last layers in the model at the regular precision (be it FP32 or BF16), and then the other layers quantized down to FP8. As a result, a config for `ao` looks a bit differently: > Note: this API is experimental and is subject to change ```{python} from accelerate import Accelerator from accelerate.utils import AORecipeKwargs, TorchDynamoPlugin, FullyShardedDataParallelPlugin from torchao.float8 import Float8LinearConfig fsdp2_plugin = FullyShardedDataParallelPlugin( fsdp_version=2, cpu_ram_efficient_loading=False, # CPU RAM efficient loading CANNOT work with fp8 torchao fsdp_auto_wrap_policy="TRANSFORMER_BASED_WRAP", ) dynamo_plugin = TorchDynamoPlugin( backend="inductor", use_regional_compilation=True, ) fp8_config = Float8LinearConfig( enable_fsdp_float8_all_gather=True, # Use FP8 all_gather in FSDP2 pad_inner_dim=True, ) kwargs = [AORecipeKwargs( config=fp8_config )] accelerator = Accelerator( mixed_precision="fp8", fsdp_plugin=fsdp2_plugin, dynamo_plugin=dynamo_plugin, kwarg_handlers=kwargs, ) ``` Or during `accelerate launch` via `--fp8_backend=ao ...`. Use `accelerate launch --fp8_backend=ao -h` to see relevant arguments. Similarly, this can be set in `config.yaml`: ```{yaml} mixed_precision: fp8 fsdp_config: fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP fsdp_cpu_ram_efficient_loading: false fsdp_version: 2 fp8_config: backend: AO pad_inner_dim: true enable_fsdp_float8_all_gather: true dynamo_config: dynamo_backend: INDUCTOR dynamo_use_regional_compilation: true ``` To learn more about the specific parameters to be used, please see the official `torchao` repo. ## Example Zoo We have examples showcasing training with FP8 both with accelerate and its underlying implementation available in the accelerate repo. Currently we support scripts showcasing: * Single GPU * Distributed Data Parallelism (Multi-GPU) * Fully Sharded Data Parallelism * DeepSpeed ZeRO 1 through 3 Find out more [here](https://github.com/huggingface/accelerate/tree/main/benchmarks/fp8) ## Further Reading To learn more about training in FP8 please check out the following resources: * [Our concept guide](../concept_guides/low_precision_training) detailing into more about TransformersEngine, torchao, and MS-AMP * [The `transformers-engine` documentation](https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/api/common.html) * [The `torchao` documentation](https://github.com/pytorch/ao/tree/main/torchao/float8) * [The `MS-AMP` documentation](https://azure.github.io/MS-AMP/docs/) (⚠� no longer maintained) accelerate-1.14.0/docs/source/usage_guides/megatron_lm.md000066400000000000000000000751441521253476100234300ustar00rootroot00000000000000 # Megatron-LM [Megatron-LM](https://github.com/NVIDIA/Megatron-LM) enables training large transformer language models at scale. It provides efficient tensor, pipeline and sequence based model parallelism for pre-training transformer based Language Models such as [GPT](https://huggingface.co/papers/2005.14165) (Decoder Only), [BERT](https://huggingface.co/papers/1810.04805) (Encoder Only) and [T5](https://huggingface.co/papers/1910.10683) (Encoder-Decoder). For detailed information and how things work behind the scene please refer to the github [repo](https://github.com/NVIDIA/Megatron-LM). ## What is integrated? Accelerate integrates following feature of Megatron-LM to enable large scale pre-training/finetuning of BERT (Encoder), GPT (Decoder) or T5 models (Encoder and Decoder): a. **Tensor Parallelism (TP)**: Reduces memory footprint without much additional communication on intra-node ranks. Each tensor is split into multiple chunks with each shard residing on separate GPU. At each step, the same mini-batch of data is processed independently and in parallel by each shard followed by syncing across all GPUs (`all-reduce` operation). In a simple transformer layer, this leads to 2 `all-reduces` in the forward path and 2 in the backward path. For more details, please refer to the research paper [Megatron-LM: Training Multi-Billion Parameter Language Models Using Model Parallelism](https://huggingface.co/papers/1909.08053) and this section of blogpost [The Technology Behind BLOOM Training](https://huggingface.co/blog/bloom-megatron-deepspeed#tensor-parallelism). b. **Pipeline Parallelism (PP)**: Reduces memory footprint and enables large scale training via inter-node parallelization. Reduces the bubble of naive PP via PipeDream-Flush schedule/1F1B schedule and Interleaved 1F1B schedule. Layers are distributed uniformly across PP stages. For example, if a model has `24` layers and we have `4` GPUs for pipeline parallelism, each GPU will have `6` layers (24/4). For more details on schedules to reduce the idle time of PP, please refer to the research paper [Efficient Large-Scale Language Model Training on GPU Clusters Using Megatron-LM](https://huggingface.co/papers/2104.04473) and this section of blogpost [The Technology Behind BLOOM Training](https://huggingface.co/blog/bloom-megatron-deepspeed#pipeline-parallelism). c. **Sequence Parallelism (SP)**: Reduces memory footprint without any additional communication. Only applicable when using TP. It reduces activation memory required as it prevents the same copies to be on the tensor parallel ranks post `all-reduce` by replacing them with `reduce-scatter` and `no-op` operation would be replaced by `all-gather`. As `all-reduce = reduce-scatter + all-gather`, this saves a ton of activation memory at no added communication cost. To put it simply, it shards the outputs of each transformer layer along sequence dimension, e.g., if the sequence length is `1024` and the TP size is `4`, each GPU will have `256` tokens (1024/4) for each sample. This increases the batch size that can be supported for training. For more details, please refer to the research paper [Reducing Activation Recomputation in Large Transformer Models](https://huggingface.co/papers/2205.05198). d. **Data Parallelism (DP)** via Distributed Optimizer: Reduces the memory footprint by sharding optimizer states and gradients across DP ranks (versus the traditional method of replicating the optimizer state across data parallel ranks). For example, when using Adam optimizer with mixed-precision training, each parameter accounts for 12 bytes of memory. This gets distributed equally across the GPUs, i.e., each parameter would account for 3 bytes (12/4) if we have 4 GPUs. For more details, please refer to the research paper [ZeRO: Memory Optimizations Toward Training Trillion Parameter Models](https://huggingface.co/papers/1910.02054) and following section of blog [The Technology Behind BLOOM Training](https://huggingface.co/blog/bloom-megatron-deepspeed#zero-data-parallelism). e. **Expert Parallelism (EP)** Expert parallelism in Megatron-LM is used for Mixture-of-Experts (MoE) layers, where many “experts� (small feed-forward networks) exist but only a few are activated for each token. Instead of putting all experts on every GPU, Megatron distributes different experts across different GPUs—this is expert parallelism. During training, tokens are routed to the GPUs that host their selected experts, computed there, and then sent back, reducing memory cost. It often combines with tensor/pipeline parallelism for large-scale models. f. **Full Activation Recomputation**: Reduces the memory footprint of activations significantly via smart activation checkpointing. It doesn't store activations occupying large memory while being fast to recompute thereby achieving great tradeoff between memory and recomputation. For example, for GPT-3, this leads to 70% reduction in required memory for activations at the expense of only 2.7% FLOPs overhead for recomputation of activations. For more details, please refer to the research paper [Reducing Activation Recomputation in Large Transformer Models](https://huggingface.co/papers/2205.05198). g. **Fused Kernels**: Fused Softmax, Mixed Precision Fused Layer Norm and Fused gradient accumulation to weight gradient computation of linear layer. PyTorch JIT compiled Fused GeLU and Fused Bias+Dropout+Residual addition. h. **Support for Indexed datasets**: Efficient binary format of datasets for large scale training. Support for the `mmap`, `cached` index file and the `lazy` loader format. i. **Checkpoint reshaping and interoperability**: Utility for reshaping Megatron-LM checkpoints of variable tensor and pipeline parallel sizes to the beloved Transformers sharded checkpoints as it has great support with plethora of tools such as Accelerate Big Model Inference, Megatron-DeepSpeed Inference etc. Support is also available for converting Transformers sharded checkpoints to Megatron-LM checkpoint of variable tensor and pipeline parallel sizes for large scale training. ## Pre-Requisites You will need to install the latest pytorch, cuda, nccl, and NVIDIA [APEX](https://github.com/NVIDIA/apex#quick-start) releases and the nltk library. See [documentation](https://github.com/NVIDIA/Megatron-LM#setup) for more details. Another way to setup the environment is to pull an NVIDIA PyTorch Container that comes with all the required installations from NGC. Below is a step-by-step method to set up the conda environment: 1. Create a virtual environment ``` conda create --name ml ``` 2. Assuming that the machine has CUDA 11.3 installed, installing the corresponding PyTorch GPU Version ``` conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch ``` 3. Install Nvidia APEX ``` git clone https://github.com/NVIDIA/apex cd apex pip install -v --disable-pip-version-check --no-cache-dir --global-option="--cpp_ext" --global-option="--cuda_ext" ./ cd .. ``` 4. Installing Megatron-LM ``` git clone https://github.com/NVIDIA/Megatron-LM.git cd Megatron-LM git checkout 9a1c0d05c992c8a241da384ab27dce2021bb56dd you need to manually move gpt_builders.py to megatron/training and update include = [ "megatron.core", "megatron.core.*", "megatron.training", "megatron.training.*", "megatron.legacy", "megatron.legacy.*", ] in pyproject.toml file to unblock yourself from using Megatron pip install --no-use-pep517 -e . ``` ## Prepare Megaton-LM checkpoint If you want to fine-tune a model, make sure you have a torch dist format checkpoint ready. If you only have access to the huggingface model, please consider converting it to a torch dist format checkpoint acceptable to Megatron. One example can be using slime's script, take GLM models as an example: ``` source /your/path/to/slime/scripts/models/glm4.5-355B-A32B.sh srun torchrun --nproc-per-node 8 \ /your/path/to/slime/tools/convert_hf_to_torch_dist.py \ ${MODEL_ARGS[@]} \ --hf-checkpoint /your/path/to/huggingface/models/GLM4.5-355B-A32B \ --save /your/path/to/megatron/models/GLM4.5-355B-A32B_torch_dist ``` After the conversion, make sure: 1. under `/your/path/to/megatron/models/GLM4.5-355B-A32B_torch_dist`: change the `latest_checkpointed_iteration.txt`'s content from `release` to `0` and rename the directory `release` to `iter_0000000`; 2: in the config, make sure `megatron_lm_no_load_optim` to be true so that no optimizer states are needed. ## Accelerate Megatron-LM Plugin Important features are directly supported via the `accelerate config` command. An example of the corresponding questions for using Megatron-LM features is shown below: ```bash :~$ accelerate config --config_file "megatron_gpt_config.yaml" In which compute environment are you running? ([0] This machine, [1] AWS (Amazon SageMaker)): 0 Which type of machine are you using? ([0] No distributed training, [1] multi-CPU, [2] multi-GPU, [3] TPU): 2 How many different machines will you use (use more than 1 for multi-node training)? [1]: Do you want to use DeepSpeed? [yes/NO]: Do you want to use FullyShardedDataParallel? [yes/NO]: Do you want to use Megatron-LM ? [yes/NO]: yes What is the Tensor Parallelism degree/size? [1]:2 Do you want to enable Sequence Parallelism? [YES/no]: What is the Pipeline Parallelism degree/size? [1]:2 What is the number of micro-batches? [1]:2 Do you want to enable selective activation recomputation? [YES/no]: Do you want to use distributed optimizer which shards optimizer state and gradients across data parallel ranks? [YES/no]: What is the gradient clipping value based on global L2 Norm (0 to disable)? [1.0]: How many GPU(s) should be used for distributed training? [1]:4 Do you wish to use FP16 or BF16 (mixed precision)? [NO/fp16/bf16]: bf16 ``` The resulting config is shown below: ``` ~$ cat megatron_gpt_config.yaml compute_environment: LOCAL_MACHINE deepspeed_config: {} distributed_type: MEGATRON_LM downcast_bf16: 'no' fsdp_config: {} machine_rank: 0 main_process_ip: null main_process_port: null main_training_function: main megatron_lm_config: megatron_lm_gradient_clipping: 1.0 megatron_lm_num_micro_batches: 2 megatron_lm_pp_degree: 2 megatron_lm_recompute_activations: true megatron_lm_sequence_parallelism: true megatron_lm_tp_degree: 2 megatron_lm_use_distributed_optimizer: true mixed_precision: bf16 num_machines: 1 num_processes: 4 rdzv_backend: static same_network: true use_cpu: false ``` We will take the example of GPT pre-training. The minimal changes required to the official `run_clm_no_trainer.py` to use Megatron-LM are as follows: 1. As Megatron-LM uses its own implementation of Optimizer, the corresponding scheduler compatible with it needs to be used. As such, support for only the Megatron-LM's scheduler is present. User will need to create `accelerate.utils.MegatronLMDummyScheduler`. Example is given below: ```python from accelerate.utils import MegatronLMDummyScheduler if accelerator.distributed_type == DistributedType.MEGATRON_LM: lr_scheduler = MegatronLMDummyScheduler( optimizer=optimizer, total_num_steps=args.max_train_steps, warmup_num_steps=args.num_warmup_steps, ) else: lr_scheduler = get_scheduler( name=args.lr_scheduler_type, optimizer=optimizer, num_warmup_steps=args.num_warmup_steps * args.gradient_accumulation_steps, num_training_steps=args.max_train_steps * args.gradient_accumulation_steps, ) ``` 2. Getting the details of the total batch size now needs to be cognization of tensor and pipeline parallel sizes. Example of getting the effective total batch size is shown below: ```python if accelerator.distributed_type == DistributedType.MEGATRON_LM: total_batch_size = accelerator.state.megatron_lm_plugin.global_batch_size else: total_batch_size = args.per_device_train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps ``` 3. When using Megatron-LM, the losses are already averaged across the data parallel group ```python if accelerator.distributed_type == DistributedType.MEGATRON_LM: losses.append(loss) else: losses.append(accelerator.gather_for_metrics(loss.repeat(args.per_device_eval_batch_size))) if accelerator.distributed_type == DistributedType.MEGATRON_LM: losses = torch.tensor(losses) else: losses = torch.cat(losses) ``` 4. For Megatron-LM, we need to save the model using `accelerator.save_state` ```python if accelerator.distributed_type == DistributedType.MEGATRON_LM: accelerator.save_state(args.output_dir) else: unwrapped_model = accelerator.unwrap_model(model) unwrapped_model.save_pretrained( args.output_dir, is_main_process=accelerator.is_main_process, save_function=accelerator.save ) ``` That's it! We are good to go 🚀. Please find the example script in the examples folder at the path `accelerate/examples/by_feature/megatron_lm_gpt_pretraining.py`. Let's run it for `gpt-large` model architecture using 4 A100-80GB GPUs. ```bash accelerate launch --config_file megatron_gpt_config.yaml \ examples/by_feature/megatron_lm_gpt_pretraining.py \ --config_name "gpt2-large" \ --tokenizer_name "gpt2-large" \ --dataset_name wikitext \ --dataset_config_name wikitext-2-raw-v1 \ --block_size 1024 \ --learning_rate 5e-5 \ --per_device_train_batch_size 24 \ --per_device_eval_batch_size 24 \ --num_train_epochs 5 \ --with_tracking \ --report_to "wandb" \ --output_dir "awesome_model" ``` Below are some important excerpts from the output logs: ```bash Loading extension module fused_dense_cuda... >>> done with compiling and loading fused kernels. Compilation time: 3.569 seconds > padded vocab (size: 50257) with 175 dummy tokens (new size: 50432) Building gpt model in the pre-training mode. The Megatron LM model weights are initialized at random in `accelerator.prepare`. Please use `accelerator.load_checkpoint` to load a pre-trained checkpoint matching the distributed setup. Preparing dataloader Preparing dataloader Preparing model > number of parameters on (tensor, pipeline) model parallel rank (1, 0): 210753280 > number of parameters on (tensor, pipeline) model parallel rank (1, 1): 209445120 > number of parameters on (tensor, pipeline) model parallel rank (0, 0): 210753280 > number of parameters on (tensor, pipeline) model parallel rank (0, 1): 209445120 Preparing optimizer Preparing scheduler > learning rate decay style: linear 10/10/2022 22:57:22 - INFO - __main__ - ***** Running training ***** 10/10/2022 22:57:22 - INFO - __main__ - Num examples = 2318 10/10/2022 22:57:22 - INFO - __main__ - Num Epochs = 5 10/10/2022 22:57:22 - INFO - __main__ - Instantaneous batch size per device = 24 10/10/2022 22:57:22 - INFO - __main__ - Total train batch size (w. parallel, distributed & accumulation) = 48 10/10/2022 22:57:22 - INFO - __main__ - Gradient Accumulation steps = 1 10/10/2022 22:57:22 - INFO - __main__ - Total optimization steps = 245 20%|████████████� | 49/245 [01:04<04:09, 1.27s/it] 10/10/2022 22:58:29 - INFO - __main__ - epoch 0: perplexity: 1222.1594275215962 eval_loss: 7.10837459564209 40%|████████████████████████▊ | 98/245 [02:10<03:07, 1.28s/it] 10/10/2022 22:59:35 - INFO - __main__ - epoch 1: perplexity: 894.5236583794557 eval_loss: 6.796291351318359 60%|████████████████████████████████████▌ | 147/245 [03:16<02:05, 1.28s/it] 10/10/2022 23:00:40 - INFO - __main__ - epoch 2: perplexity: 702.8458788508042 eval_loss: 6.555137634277344 80%|████████████████████████████████████████████████▊ | 196/245 [04:22<01:02, 1.28s/it] 10/10/2022 23:01:46 - INFO - __main__ - epoch 3: perplexity: 600.3220028695281 eval_loss: 6.39746618270874 100%|█████████████████████████████████████████████████████████████| 245/245 [05:27<00:00, 1.28s/it] ``` There are a large number of other options/features that one can set using `accelerate.utils.MegatronLMPlugin`. ## Advanced features to leverage writing custom train step and Megatron-LM Indexed Datasets For leveraging more features, please go through below details. 1. Below is an example of changes required to customize the Train Step while using Megatron-LM. You will implement the `accelerate.utils.AbstractTrainStep` or inherit from their corresponding children `accelerate.utils.GPTTrainStep`, `accelerate.utils.BertTrainStep` or `accelerate.utils.T5TrainStep`. ```python from accelerate.utils import MegatronLMDummyScheduler, GPTTrainStep, avg_losses_across_data_parallel_group # Custom loss function for the Megatron model class GPTTrainStepWithCustomLoss(GPTTrainStep): def __init__(self, megatron_args, **kwargs): super().__init__(megatron_args) self.kwargs = kwargs def get_loss_func(self): def loss_func(inputs, loss_mask, output_tensor): batch_size, seq_length = output_tensor.shape losses = output_tensor.float() loss_mask = loss_mask.view(-1).float() loss = losses.view(-1) * loss_mask # Resize and average loss per sample loss_per_sample = loss.view(batch_size, seq_length).sum(axis=1) loss_mask_per_sample = loss_mask.view(batch_size, seq_length).sum(axis=1) loss_per_sample = loss_per_sample / loss_mask_per_sample # Calculate and scale weighting weights = torch.stack([(inputs == kt).float() for kt in self.kwargs["keytoken_ids"]]).sum(axis=[0, 2]) weights = 1.0 + self.kwargs["alpha"] * weights # Calculate weighted average weighted_loss = (loss_per_sample * weights).mean() # Reduce loss across data parallel groups averaged_loss = avg_losses_across_data_parallel_group([weighted_loss]) return weighted_loss, {"lm loss": averaged_loss[0]} return loss_func def get_forward_step_func(self): def forward_step(data_iterator, model): """Forward step.""" # Get the batch. tokens, labels, loss_mask, attention_mask, position_ids = self.get_batch(data_iterator) output_tensor = model(tokens, position_ids, attention_mask, labels=labels) return output_tensor, partial(self.loss_func, tokens, loss_mask) return forward_step def main(): # Custom loss function for the Megatron model keytoken_ids = [] keywords = ["plt", "pd", "sk", "fit", "predict", " plt", " pd", " sk", " fit", " predict"] for keyword in keywords: ids = tokenizer([keyword]).input_ids[0] if len(ids) == 1: keytoken_ids.append(ids[0]) accelerator.print(f"Keytoken ids: {keytoken_ids}") accelerator.state.megatron_lm_plugin.custom_train_step_class = GPTTrainStepWithCustomLoss accelerator.state.megatron_lm_plugin.custom_train_step_kwargs = { "keytoken_ids": keytoken_ids, "alpha": 0.25, } ``` 2. For using the Megatron-LM datasets, a few more changes are required. Dataloaders for these datasets are available only on rank 0 of each tensor parallel group. As such, there are rank where dataloader won't be available and this requires tweaks to the training loop. Being able to do all this shows how flexible and extensible Accelerate is. The changes required are as follows. a. For Megatron-LM indexed datasets, we need to use `MegatronLMDummyDataLoader` and pass the required dataset args to it such as `data_path`, `seq_length` etc. See [here](https://github.com/NVIDIA/Megatron-LM/blob/main/megatron/arguments.py#L804) for the list of available args. ```python from accelerate.utils import MegatronLMDummyDataLoader megatron_dataloader_config = { "data_path": args.data_path, "splits_string": args.splits_string, "seq_length": args.block_size, "micro_batch_size": args.per_device_train_batch_size, } megatron_dataloader = MegatronLMDummyDataLoader(**megatron_dataloader_config) accelerator.state.megatron_lm_plugin.megatron_dataset_flag = True ``` b. `megatron_dataloader` is repeated 3 times to get training, validation and test dataloaders as per the `args.splits_string` proportions ```python model, optimizer, lr_scheduler, train_dataloader, eval_dataloader, _ = accelerator.prepare( model, optimizer, lr_scheduler, megatron_dataloader, megatron_dataloader, megatron_dataloader ) ``` c. Changes to training and evaluation loops as dataloader is only available on tensor parallel ranks 0 So, we need to iterate only if the dataloader isn't `None` else provide empty dict As such, we loop using `while` loop and break when `completed_steps` is equal to `args.max_train_steps` This is similar to the Megatron-LM setup wherein user has to provide `max_train_steps` when using Megaton-LM indexed datasets. This displays how flexible and extensible Accelerate is. ```python while completed_steps < args.max_train_steps: model.train() batch = next(train_dataloader) if train_dataloader is not None else {} outputs = model(**batch) loss = outputs.loss ... if completed_steps % eval_interval == 0: eval_completed_steps = 0 losses = [] while eval_completed_steps < eval_iters: model.eval() with torch.no_grad(): batch = next(eval_dataloader) if eval_dataloader is not None else {} outputs = model(**batch) ``` ## Utility for Checkpoint reshaping and interoperability 1. The scripts for these are present in Transformers library under respective models. Currently, it is available for GPT model [checkpoint_reshaping_and_interoperability.py](https://github.com/huggingface/transformers/blob/main/src/transformers/models/megatron_gpt2/checkpoint_reshaping_and_interoperability.py) 2. Below is an example of conversion of checkpoint from Megatron-LM to universal Transformers sharded checkpoint. ```bash python checkpoint_reshaping_and_interoperability.py \ --convert_checkpoint_from_megatron_to_transformers \ --load_path "gpt/iter_0005000" \ --save_path "gpt/trfs_checkpoint" \ --max_shard_size "200MB" \ --tokenizer_name "gpt2" \ --print-checkpoint-structure ``` 3. Conversion of checkpoint from transformers to megatron with `tp_size=2`, `pp_size=2` and `dp_size=2`. ```bash python checkpoint_utils/megatgron_gpt2/checkpoint_reshaping_and_interoperability.py \ --load_path "gpt/trfs_checkpoint" \ --save_path "gpt/megatron_lm_checkpoint" \ --target_tensor_model_parallel_size 2 \ --target_pipeline_model_parallel_size 2 \ --target_data_parallel_size 2 \ --target_params_dtype "bf16" \ --make_vocab_size_divisible_by 128 \ --use_distributed_optimizer \ --print-checkpoint-structure ``` ## Megatron-LM GPT models support returning logits and `megatron_generate` function for text generation 1. Returning logits require setting `require_logits=True` in MegatronLMPlugin as shown below. These would be available in the last stage of pipeline. ```python megatron_lm_plugin = MegatronLMPlugin(return_logits=True) ``` 2. `megatron_generate` method for Megatron-LM GPT model: This will use Tensor and Pipeline Parallelism to complete generations for a batch of inputs when using greedy with/without top_k/top_p sampling and for individual prompt inputs when using beam search decoding. Only a subset of features of transformers generate is supported. This will help in using large models via tensor and pipeline parallelism for generation (already does key-value caching and uses fused kernels by default). This requires data parallel size to be 1, sequence parallelism and activation checkpointing to be disabled. It also requires specifying path to tokenizer's vocab file and merges file. Below example shows how to configure and use `megatron_generate` method for Megatron-LM GPT model. ```python # specifying tokenizer's vocab and merges file vocab_file = os.path.join(args.resume_from_checkpoint, "vocab.json") merge_file = os.path.join(args.resume_from_checkpoint, "merges.txt") other_megatron_args = {"vocab_file": vocab_file, "merge_file": merge_file} megatron_lm_plugin = MegatronLMPlugin(other_megatron_args=other_megatron_args) # inference using `megatron_generate` functionality tokenizer.pad_token = tokenizer.eos_token max_new_tokens = 64 batch_texts = [ "Are you human?", "The purpose of life is", "The arsenal was constructed at the request of", "How are you doing these days?", ] batch_encodings = tokenizer(batch_texts, return_tensors="pt", padding=True) # top-p sampling generated_tokens = model.megatron_generate( batch_encodings["input_ids"], batch_encodings["attention_mask"], max_new_tokens=max_new_tokens, top_p=0.8, top_p_decay=0.5, temperature=0.9, ) decoded_preds = tokenizer.batch_decode(generated_tokens.cpu().numpy()) accelerator.print(decoded_preds) # top-k sampling generated_tokens = model.megatron_generate( batch_encodings["input_ids"], batch_encodings["attention_mask"], max_new_tokens=max_new_tokens, top_k=50, temperature=0.9, ) decoded_preds = tokenizer.batch_decode(generated_tokens.cpu().numpy()) accelerator.print(decoded_preds) # adding `bos` token at the start generated_tokens = model.megatron_generate( batch_encodings["input_ids"], batch_encodings["attention_mask"], max_new_tokens=max_new_tokens, add_BOS=True ) decoded_preds = tokenizer.batch_decode(generated_tokens.cpu().numpy()) accelerator.print(decoded_preds) # beam search => only takes single prompt batch_texts = ["The purpose of life is"] batch_encodings = tokenizer(batch_texts, return_tensors="pt", padding=True) generated_tokens = model.megatron_generate( batch_encodings["input_ids"], batch_encodings["attention_mask"], max_new_tokens=max_new_tokens, num_beams=20, length_penalty=1.5, ) decoded_preds = tokenizer.batch_decode(generated_tokens.cpu().numpy()) accelerator.print(decoded_preds) ``` 3. An end-to-end example of using `megatron_generate` method for Megatron-LM GPT model is available at [megatron_gpt2_generation.py](https://github.com/pacman100/accelerate-megatron-test/blob/main/src/inference/megatron_gpt2_generation.py) with config file [megatron_lm_gpt_generate_config.yaml](https://github.com/pacman100/accelerate-megatron-test/blob/main/src/Configs/megatron_lm_gpt_generate_config.yaml). The bash script with accelerate launch command is available at [megatron_lm_gpt_generate.sh](https://github.com/pacman100/accelerate-megatron-test/blob/main/megatron_lm_gpt_generate.sh). The output logs of the script are available at [megatron_lm_gpt_generate.log](https://github.com/pacman100/accelerate-megatron-test/blob/main/output_logs/megatron_lm_gpt_generate.log). ## Support for ROPE and ALiBi Positional embeddings and Multi-Query Attention 1. For ROPE/ALiBi attention, pass `position_embedding_type` with `("absolute" | "rotary" | "alibi")` to `MegatronLMPlugin` as shown below. ```python other_megatron_args = {"position_embedding_type": "alibi"} megatron_lm_plugin = MegatronLMPlugin(other_megatron_args=other_megatron_args) ``` 2. For Multi-Query Attention, pass `attention_head_type` with `("multihead" | "multiquery")` to `MegatronLMPlugin` as shown below. ```python other_megatron_args = {"attention_head_type": "multiquery"} megatron_lm_plugin = MegatronLMPlugin(other_megatron_args=other_megatron_args) ``` ## Caveats 1. Supports Transformers GPT2, Megatron-BERT and T5 models. This covers Decoder only, Encode only and Encoder-Decoder model classes. 2. Only loss is returned from model forward pass as there is quite complex interplay of pipeline, tensor and data parallelism behind the scenes. The `model(**batch_data)` call return loss(es) averaged across the data parallel ranks. This is fine for most cases wherein pre-training jobs are run using Megatron-LM features and you can easily compute the `perplexity` using the loss. For GPT model, returning logits in addition to loss(es) is supported. These logits aren't gathered across data parallel ranks. Use `accelerator.utils.gather_across_data_parallel_groups` to gather logits across data parallel ranks. These logits along with labels can be used for computing various performance metrics. 3. The main process is the last rank as the losses/logits are available in the last stage of pipeline. `accelerator.is_main_process` and `accelerator.is_local_main_process` return `True` for last rank when using Megatron-LM integration. 4. In `accelerator.prepare` call, a Megatron-LM model corresponding to a given Transformers model is created with random weights. Please use `accelerator.load_state` to load the Megatron-LM checkpoint with matching TP, PP and DP partitions. 5. Currently, checkpoint reshaping and interoperability support is only available for GPT. Soon it will be extended to BERT and T5. 6. `gradient_accumulation_steps` needs to be 1. When using Megatron-LM, micro batches in pipeline parallelism setting is synonymous with gradient accumulation. 7. When using Megatron-LM, use `accelerator.save_state` and `accelerator.load_state` for saving and loading checkpoints. 8. Below are the mapping from Megatron-LM model architectures to the equivalent transformers model architectures. Only these transformers model architectures are supported. a. Megatron-LM [BertModel](https://github.com/NVIDIA/Megatron-LM/blob/main/megatron/model/bert_model.py) : transformers models with `megatron-bert` in config's model type, e.g., [MegatronBERT](https://huggingface.co/docs/transformers/model_doc/megatron-bert) b. Megatron-LM [GPTModel](https://github.com/NVIDIA/Megatron-LM/blob/main/megatron/model/gpt_model.py) : transformers models with `gpt2` in config's model type, e.g., [OpenAI GPT2](https://huggingface.co/docs/transformers/model_doc/gpt2) c. Megatron-LM [T5Model](https://github.com/NVIDIA/Megatron-LM/blob/main/megatron/model/t5_model.py) : transformers models with `t5` in config's model type, e.g., [T5](https://huggingface.co/docs/transformers/model_doc/t5) and [MT5](https://huggingface.co/docs/transformers/model_doc/mt5) accelerate-1.14.0/docs/source/usage_guides/model_size_estimator.md000066400000000000000000000140661521253476100253410ustar00rootroot00000000000000 # Model memory estimator One very difficult aspect when exploring potential models to use on your machine is knowing just how big of a model will *fit* into memory with your current device (such as loading the model onto CUDA or XPU). To help alleviate this, Accelerate has a CLI interface through `accelerate estimate-memory`. This tutorial will help walk you through using it, what to expect, and at the end link to the interactive demo hosted on the Hub which will even let you post those results directly on the model repo! Currently we support searching for models that can be used in `timm` and `transformers`. This API will load the model into memory on the `meta` device, so we are not actually downloading and loading the full weights of the model into memory, nor do we need to. As a result it's perfectly fine to measure 8 billion parameter models (or more), without having to worry about if your CPU can handle it! ## Gradio Demos Below are a few gradio demos related to what was described above. The first is the official Hugging Face memory estimation space, utilizing Accelerate directly:
A community member has taken the idea and expanded it further, allowing you to filter models directly and see if you can run a particular LLM given GPU constraints and LoRA configurations. To play with it, see [here](https://huggingface.co/spaces/Vokturz/can-it-run-llm) for more details. ## The Command When using `accelerate estimate-memory`, you need to pass in the name of the model you want to use, potentially the framework that model utilizing (if it can't be found automatically), and the data types you want the model to be loaded in with. For example, here is how we can calculate the memory footprint for `bert-base-cased`: ```bash accelerate estimate-memory bert-base-cased ``` This will download the `config.json` for `bert-based-cased`, load the model on the `meta` device, and report back how much space it will use: Memory Usage for loading `bert-base-cased`: | dtype | Largest Layer | Total Size | Training using Adam | |---------|---------------|------------|---------------------| | float32 | 84.95 MB | 418.18 MB | 1.61 GB | | float16 | 42.47 MB | 206.59 MB | 826.36 MB | | int8 | 21.24 MB | 103.29 MB | 413.18 MB | | int4 | 10.62 MB | 51.65 MB | 206.59 MB | By default it will return all the supported dtypes (`int4` through `float32`), but if you are interested in specific ones these can be filtered. ### Specific libraries If the source library cannot be determined automatically (like it could in the case of `bert-base-cased`), a library name can be passed in. ```bash accelerate estimate-memory HuggingFaceM4/idefics-80b-instruct --library_name transformers ``` Memory Usage for loading `HuggingFaceM4/idefics-80b-instruct`: | dtype | Largest Layer | Total Size | Training using Adam | |---------|---------------|------------|---------------------| | float32 | 3.02 GB | 297.12 GB | 1.16 TB | | float16 | 1.51 GB | 148.56 GB | 594.24 GB | | int8 | 772.52 MB | 74.28 GB | 297.12 GB | | int4 | 386.26 MB | 37.14 GB | 148.56 GB | ```bash accelerate estimate-memory timm/resnet50.a1_in1k --library_name timm ``` Memory Usage for loading `timm/resnet50.a1_in1k`: | dtype | Largest Layer | Total Size | Training using Adam | |---------|---------------|------------|---------------------| | float32 | 9.0 MB | 97.7 MB | 390.78 MB | | float16 | 4.5 MB | 48.85 MB | 195.39 MB | | int8 | 2.25 MB | 24.42 MB | 97.7 MB | | int4 | 1.12 MB | 12.21 MB | 48.85 MB | ### Specific dtypes As mentioned earlier, while we return `int4` through `float32` by default, any dtype can be used from `float32`, `float16`, `int8`, and `int4`. To do so, pass them in after specifying `--dtypes`: ```bash accelerate estimate-memory bert-base-cased --dtypes float32 float16 ``` Memory Usage for loading `bert-base-cased`: | dtype | Largest Layer | Total Size | Training using Adam | |---------|---------------|------------|---------------------| | float32 | 84.95 MB | 413.18 MB | 1.61 GB | | float16 | 42.47 MB | 206.59 MB | 826.36 MB | ## Caveats with this calculator This calculator will tell you how much memory is needed to purely load the model in, *not* to perform inference. This calculation is accurate within a few % of the actual value, so it is a very good view of just how much memory it will take. For instance loading `bert-base-cased` actually takes `413.68 MB` when loaded on CUDA in full precision, and the calculator estimates `413.18 MB`. When performing inference you can expect to add up to an additional 20% as found by [EleutherAI](https://blog.eleuther.ai/transformer-math/). We'll be conducting research into finding a more accurate estimate to these values, and will update this calculator once done. accelerate-1.14.0/docs/source/usage_guides/mps.md000066400000000000000000000057531521253476100217220ustar00rootroot00000000000000 # Accelerated PyTorch Training on Mac With PyTorch v1.12 release, developers and researchers can take advantage of Apple silicon GPUs for significantly faster model training. This unlocks the ability to perform machine learning workflows like prototyping and fine-tuning locally, right on Mac. Apple's Metal Performance Shaders (MPS) as a backend for PyTorch enables this and can be used via the new `"mps"` device. This will map computational graphs and primitives on the MPS Graph framework and tuned kernels provided by MPS. For more information please refer official documents [Introducing Accelerated PyTorch Training on Mac](https://pytorch.org/blog/introducing-accelerated-pytorch-training-on-mac/) and [MPS BACKEND](https://pytorch.org/docs/stable/notes/mps.html). ### Benefits of Training and Inference using Apple Silicon Chips 1. Enables users to train larger networks or batch sizes locally 2. Reduces data retrieval latency and provides the GPU with direct access to the full memory store due to unified memory architecture. Therefore, improving end-to-end performance. 3. Reduces costs associated with cloud-based development or the need for additional local GPUs. **Pre-requisites**: To install torch with mps support, please follow this nice medium article [GPU-Acceleration Comes to PyTorch on M1 Macs](https://medium.com/towards-data-science/gpu-acceleration-comes-to-pytorch-on-m1-macs-195c399efcc1). ## How it works out of the box It is enabled by default on MacOs machines with MPS enabled Apple Silicon GPUs. To disable it, pass `--cpu` flag to `accelerate launch` command or answer the corresponding question when answering the `accelerate config` questionnaire. You can directly run the following script to test it out on MPS enabled Apple Silicon machines: ```bash accelerate launch /examples/cv_example.py --data_dir images ``` ## A few caveats to be aware of 1. Distributed setups `gloo` and `nccl` are not working with `mps` device. This means that currently only single GPU of `mps` device type can be used. Finally, please, remember that, `Accelerate` only integrates MPS backend, therefore if you have any problems or questions with regards to MPS backend usage, please, file an issue with [PyTorch GitHub](https://github.com/pytorch/pytorch/issues).accelerate-1.14.0/docs/source/usage_guides/profiler.md000066400000000000000000000330371521253476100227410ustar00rootroot00000000000000 # Profiler Profiler is a tool that allows the collection of performance metrics during training and inference. Profiler’s context manager API can be used to better understand what model operators are the most expensive, examine their input shapes and stack traces, study device kernel activity, and visualize the execution trace. It provides insights into the performance of your model, allowing you to optimize and improve it. This guide explains how to use PyTorch Profiler to measure the time and memory consumption of the model’s operators and how to integrate this with Accelerate. We will cover various use cases and provide examples for each. ## Using profiler to analyze execution time Profiler allows one to check which operators were called during the execution of a code range wrapped with a profiler context manager. Let’s see how we can use profiler to analyze the execution time: ```python import torch import torchvision.models as models from torch.profiler import profile, record_function, ProfilerActivity model = models.resnet18() inputs = torch.randn(5, 3, 224, 224) with profile(activities=[ProfilerActivity.CPU], record_shapes=True) as prof: model(inputs) print(prof.key_averages().table(sort_by="cpu_time_total", row_limit=10)) ``` ```python from accelerate import Accelerator, ProfileKwargs import torch import torchvision.models as models model = models.resnet18() inputs = torch.randn(5, 3, 224, 224) profile_kwargs = ProfileKwargs( activities=["cpu"], record_shapes=True ) accelerator = Accelerator(cpu=True, kwargs_handlers=[profile_kwargs]) model = accelerator.prepare(model) with accelerator.profile() as prof: with torch.no_grad(): model(inputs) print(prof.key_averages().table(sort_by="cpu_time_total", row_limit=10)) ``` The resulting table output (omitting some columns): ``` --------------------------------- ------------ ------------ ------------ ------------ Name Self CPU CPU total CPU time avg # of Calls --------------------------------- ------------ ------------ ------------ ------------ aten::conv2d 171.000us 52.260ms 2.613ms 20 aten::convolution 227.000us 52.089ms 2.604ms 20 aten::_convolution 270.000us 51.862ms 2.593ms 20 aten::mkldnn_convolution 51.273ms 51.592ms 2.580ms 20 aten::batch_norm 118.000us 7.059ms 352.950us 20 aten::_batch_norm_impl_index 315.000us 6.941ms 347.050us 20 aten::native_batch_norm 6.305ms 6.599ms 329.950us 20 aten::max_pool2d 40.000us 4.008ms 4.008ms 1 aten::max_pool2d_with_indices 3.968ms 3.968ms 3.968ms 1 aten::add_ 780.000us 780.000us 27.857us 28 --------------------------------- ------------ ------------ ------------ ------------ Self CPU time total: 67.016ms ``` To get a finer granularity of results and include operator input shapes, pass `group_by_input_shape=True` (note: this requires running the profiler with `record_shapes=True`): ```python print(prof.key_averages(group_by_input_shape=True).table(sort_by="cpu_time_total", row_limit=10)) ``` ## Using profiler to analyze memory consumption Profiler can also show the amount of memory (used by the model’s tensors) that was allocated (or released) during the execution of the model’s operators. To enable memory profiling functionality pass `profile_memory=True`. ```python model = models.resnet18() inputs = torch.randn(5, 3, 224, 224) with profile(activities=[ProfilerActivity.CPU], profile_memory=True, record_shapes=True) as prof: model(inputs) print(prof.key_averages().table(sort_by="self_cpu_memory_usage", row_limit=10)) ``` ```python model = models.resnet18() inputs = torch.randn(5, 3, 224, 224) profile_kwargs = ProfileKwargs( activities=["cpu"], profile_memory=True, record_shapes=True ) accelerator = Accelerator(cpu=True, kwargs_handlers=[profile_kwargs]) model = accelerator.prepare(model) with accelerator.profile() as prof: model(inputs) print(prof.key_averages().table(sort_by="self_cpu_memory_usage", row_limit=10)) ``` The resulting table output (omitting some columns): ``` --------------------------------- ------------ ------------ ------------ Name CPU Mem Self CPU Mem # of Calls --------------------------------- ------------ ------------ ------------ aten::empty 94.85 Mb 94.85 Mb 205 aten::max_pool2d_with_indices 11.48 Mb 11.48 Mb 1 aten::addmm 19.53 Kb 19.53 Kb 1 aten::mean 10.00 Kb 10.00 Kb 1 aten::empty_strided 492 b 492 b 5 aten::cat 240 b 240 b 6 aten::abs 480 b 240 b 4 aten::masked_select 120 b 112 b 1 aten::ne 61 b 53 b 3 aten::eq 30 b 30 b 1 --------------------------------- ------------ ------------ ------------ Self CPU time total: 69.332ms ``` If you need one or two aggregate numbers for experiment tracking instead of a full operator table, combine the profiler with the runtime memory stats exposed by PyTorch. This is often enough for logging peak memory usage per run: ```python import torch from accelerate import Accelerator, ProfileKwargs def summarize_memory_stats(): return { "peak_allocated_mb": torch.cuda.max_memory_allocated() / 1024**2, "peak_reserved_mb": torch.cuda.max_memory_reserved() / 1024**2, } profile_kwargs = ProfileKwargs( activities=["cpu", "cuda"], profile_memory=True, record_shapes=True, ) accelerator = Accelerator(kwargs_handlers=[profile_kwargs]) torch.cuda.reset_peak_memory_stats() with accelerator.profile() as prof: model(inputs) print(prof.key_averages().table(sort_by="self_cuda_memory_usage", row_limit=10)) print(summarize_memory_stats()) ``` This pattern keeps the profiler output available for debugging while also producing compact values that can be logged to an experiment tracker. ## Exporting chrome trace You can examine the sequence of profiled operators and CUDA kernels in Chrome trace viewer (`chrome://tracing`): ![profile_export](https://github.com/huggingface/accelerate/assets/100389977/5acb193f-6d11-4f7b-9873-c600c19e8172) ```python model = models.resnet18().cuda() inputs = torch.randn(5, 3, 224, 224).cuda() with profile(activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA]) as prof: model(inputs) prof.export_chrome_trace("trace.json") ``` ```python model = models.resnet18() inputs = torch.randn(5, 3, 224, 224).cuda() profile_kwargs = ProfileKwargs( activities=["cpu", "cuda"], output_trace_dir="trace" ) accelerator = Accelerator(kwargs_handlers=[profile_kwargs]) model = accelerator.prepare(model) with accelerator.profile() as prof: model(inputs) # The trace will be saved to the specified directory ``` For other hardware accelerators, e.g. XPU, you can change `cuda` to `xpu` in the above example code. ## Using Profiler to Analyze Long-Running Jobs Profiler offers an additional API to handle long-running jobs (such as training loops). Tracing all of the execution can be slow and result in very large trace files. To avoid this, use optional arguments: - `schedule_option`: Scheduling options allow you to control when profiling is active. This is useful for long-running jobs to avoid collecting too much data. Available keys are `wait`, `warmup`, `active`, `repeat` and `skip_first`. The profiler will skip the first `skip_first` steps, then wait for `wait` steps, then do the warmup for the next `warmup` steps, then do the active recording for the next `active` steps and then repeat the cycle starting with `wait` steps. The optional number of cycles is specified with the `repeat` parameter, the zero value means that the cycles will continue until the profiling is finished. - `on_trace_ready`: specifies a function that takes a reference to the profiler as an input and is called by the profiler each time the new trace is ready. To illustrate how the API works, consider the following example: ```python from torch.profiler import schedule my_schedule = schedule( skip_first=1, wait=5, warmup=1, active=3, repeat=2 ) def trace_handler(p): output = p.key_averages().table(sort_by="self_cuda_time_total", row_limit=10) print(output) p.export_chrome_trace("/tmp/trace_" + str(p.step_num) + ".json") with profile( activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA], schedule=my_schedule, on_trace_ready=trace_handler ) as p: for idx in range(8): model(inputs) p.step() ``` ```python def trace_handler(p): output = p.key_averages().table(sort_by="self_cuda_time_total", row_limit=10) print(output) p.export_chrome_trace("/tmp/trace_" + str(p.step_num) + ".json") profile_kwargs = ProfileKwargs( activities=["cpu", "cuda"], schedule_option={"wait": 5, "warmup": 1, "active": 3, "repeat": 2, "skip_first": 1}, on_trace_ready=trace_handler ) accelerator = Accelerator(kwargs_handlers=[profile_kwargs]) model = accelerator.prepare(model) with accelerator.profile() as prof: for idx in range(8): model(inputs) prof.step() ``` ## FLOPS Use formula to estimate the FLOPs (floating point operations) of specific operators (matrix multiplication and 2D convolution). To measure floating-point operations (FLOPS): ```python with profile( activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA], with_flops=True ) as prof: model(inputs) print(prof.key_averages().table(sort_by="flops", row_limit=10)) ``` ```python profile_kwargs = ProfileKwargs( with_flops=True ) accelerator = Accelerator(kwargs_handlers=[profile_kwargs]) with accelerator.profile() as prof: model(inputs) print(prof.key_averages().table(sort_by="flops", row_limit=10)) ``` The resulting table output (omitting some columns): ``` ------------------------------------------------------- ------------ ------------ ------------ Name Self CPU Self CUDA Total FLOPs ------------------------------------------------------- ------------ ------------ ------------ aten::conv2d 197.000us 0.000us 18135613440.000 aten::addmm 103.000us 17.000us 5120000.000 aten::mul 29.000us 2.000us 30.000 aten::convolution 409.000us 0.000us -- aten::_convolution 253.000us 0.000us -- aten::cudnn_convolution 5.465ms 2.970ms -- cudaEventRecord 138.000us 0.000us -- cudaStreamIsCapturing 43.000us 0.000us -- cudaStreamGetPriority 40.000us 0.000us -- cudaDeviceGetStreamPriorityRange 10.000us 0.000us -- ------------------------------------------------------- ------------ ------------ ------------ Self CPU time total: 21.938ms Self CUDA time total: 4.165ms ``` ## Conclusion and Further Information PyTorch Profiler is a powerful tool for analyzing the performance of your models. By integrating it with Accelerate, you can easily profile your models and gain insights into their performance, helping you to optimize and improve them. For more detailed information, refer to the [PyTorch Profiler documentation](https://pytorch.org/docs/stable/profiler.html). accelerate-1.14.0/docs/source/usage_guides/quantization.md000066400000000000000000000147041521253476100236450ustar00rootroot00000000000000 # Model quantization ## `bitsandbytes` Integration Accelerate brings `bitsandbytes` quantization to your model. You can now load any pytorch model in 8-bit or 4-bit with a few lines of code. If you want to use Transformers models with `bitsandbytes`, you should follow this [documentation](https://huggingface.co/docs/transformers/main_classes/quantization). To learn more about how the `bitsandbytes` quantization works, check out the blog posts on [8-bit quantization](https://huggingface.co/blog/hf-bitsandbytes-integration) and [4-bit quantization](https://huggingface.co/blog/4bit-transformers-bitsandbytes). ### Pre-Requisites You will need to install the following requirements: - Install `bitsandbytes` library ```bash pip install bitsandbytes ``` For non-cuda devices, you can refer to the bitsandbytes installation guide [here](https://huggingface.co/docs/bitsandbytes/main/en/installation#multi-backend). - Install latest `accelerate` from source ```bash pip install git+https://github.com/huggingface/accelerate.git ``` - Install `minGPT` and `huggingface_hub` to run examples ```bash git clone https://github.com/karpathy/minGPT.git pip install minGPT/ pip install huggingface_hub ``` ### How it works First, we need to initialize our model. To save memory, we can initialize an empty model using the context manager [`init_empty_weights`]. Let's take the GPT2 model from minGPT library. ```py from accelerate import init_empty_weights from mingpt.model import GPT model_config = GPT.get_default_config() model_config.model_type = 'gpt2-xl' model_config.vocab_size = 50257 model_config.block_size = 1024 with init_empty_weights(): empty_model = GPT(model_config) ``` Then, we need to get the path to the weights of your model. The path can be the state_dict file (e.g. "pytorch_model.bin") or a folder containing the sharded checkpoints. ```py from huggingface_hub import snapshot_download weights_location = snapshot_download(repo_id="marcsun13/gpt2-xl-linear-sharded") ``` Finally, you need to set your quantization configuration with [`~utils.BnbQuantizationConfig`]. Here's an example for 8-bit quantization: ```py from accelerate.utils import BnbQuantizationConfig bnb_quantization_config = BnbQuantizationConfig(load_in_8bit=True, llm_int8_threshold = 6) ``` Here's an example for 4-bit quantization: ```py from accelerate.utils import BnbQuantizationConfig bnb_quantization_config = BnbQuantizationConfig(load_in_4bit=True, bnb_4bit_compute_dtype=torch.bfloat16, bnb_4bit_use_double_quant=True, bnb_4bit_quant_type="nf4") ``` To quantize your empty model with the selected configuration, you need to use [`~utils.load_and_quantize_model`]. ```py from accelerate.utils import load_and_quantize_model quantized_model = load_and_quantize_model(empty_model, weights_location=weights_location, bnb_quantization_config=bnb_quantization_config) ``` ### Saving and loading 8-bit model You can save your 8-bit model with accelerate using [`~Accelerator.save_model`]. ```py from accelerate import Accelerator accelerate = Accelerator() new_weights_location = "path/to/save_directory" accelerate.save_model(quantized_model, new_weights_location) quantized_model_from_saved = load_and_quantize_model(empty_model, weights_location=new_weights_location, bnb_quantization_config=bnb_quantization_config, device_map = "auto") ``` Note that 4-bit model serialization is currently not supported. ### Offload modules to cpu and disk You can offload some modules to cpu/disk if you don't have enough space on the GPU to store the entire model on your GPUs. This uses big model inference under the hood. Check this [documentation](https://huggingface.co/docs/accelerate/usage_guides/big_modeling) for more details. For 8-bit quantization, the selected modules will be converted to 8-bit precision. For 4-bit quantization, the selected modules will be kept in `torch_dtype` that the user passed in `BnbQuantizationConfig`. We will add support to convert these offloaded modules in 4-bit when 4-bit serialization will be possible. You just need to pass a custom `device_map` in order to offload modules on cpu/disk. The offload modules will be dispatched on the GPU when needed. Here's an example : ```py device_map = { "transformer.wte": 0, "transformer.wpe": 0, "transformer.drop": 0, "transformer.h": "cpu", "transformer.ln_f": "disk", "lm_head": "disk", } ``` ### Fine-tune a quantized model It is not possible to perform pure 8bit or 4bit training on these models. However, you can train these models by leveraging parameter efficient fine tuning methods (PEFT) and train for example adapters on top of them. Please have a look at [peft](https://github.com/huggingface/peft) library for more details. Currently, you can't add adapters on top of any quantized model. However, with the official support of adapters with Transformers models, you can fine-tune quantized models. If you want to fine-tune a Transformers model , follow this [documentation](https://huggingface.co/docs/transformers/main_classes/quantization) instead. Check out this [demo](https://colab.research.google.com/drive/1VoYNfYDKcKRQRor98Zbf2-9VQTtGJ24k?usp=sharing) on how to fine-tune a 4-bit Transformers model. Note that you don’t need to pass `device_map` when loading the model for training. It will automatically load your model on your GPU. Please note that `device_map=auto` should be used for inference only. ### Example demo - running GPT2 1.5b on a Google Colab Check out the Google Colab [demo](https://colab.research.google.com/drive/1T1pOgewAWVpR9gKpaEWw4orOrzPFb3yM?usp=sharing) for running quantized models on a GPT2 model. The GPT2-1.5B model checkpoint is in FP32 which uses 6GB of memory. After quantization, it uses 1.6GB with 8-bit modules and 1.2GB with 4-bit modules. accelerate-1.14.0/docs/source/usage_guides/sagemaker.md000066400000000000000000000172151521253476100230560ustar00rootroot00000000000000 # Amazon SageMaker Hugging Face and Amazon introduced new [Hugging Face Deep Learning Containers (DLCs)](https://github.com/aws/deep-learning-containers/blob/master/available_images.md#huggingface-training-containers) to make it easier than ever to train Hugging Face Transformer models in [Amazon SageMaker](https://aws.amazon.com/sagemaker/). ## Getting Started ### Setup & Installation Before you can run your Accelerate scripts on Amazon SageMaker you need to sign up for an AWS account. If you do not have an AWS account yet learn more [here](https://docs.aws.amazon.com/sagemaker/latest/dg/gs-set-up.html). After you have your AWS Account you need to install the `sagemaker` sdk for Accelerate with: ```bash pip install "accelerate[sagemaker]" --upgrade ``` Accelerate currently uses the DLCs, with `transformers`, `datasets` and `tokenizers` pre-installed. Accelerate is not in the DLC yet (will soon be added!) so to use it within Amazon SageMaker you need to create a `requirements.txt` in the same directory where your training script is located and add it as dependency: ``` accelerate ``` You should also add any other dependencies you have to this `requirements.txt`. ### Configure Accelerate You can configure the launch configuration for Amazon SageMaker the same as you do for non SageMaker training jobs with the Accelerate CLI: ```bash accelerate config # In which compute environment are you running? ([0] This machine, [1] AWS (Amazon SageMaker)): 1 ``` Accelerate will go through a questionnaire about your Amazon SageMaker setup and create a config file you can edit. Accelerate is not saving any of your credentials. ### Prepare a Accelerate fine-tuning script The training script is very similar to a training script you might run outside of SageMaker, but to save your model after training you need to specify either `/opt/ml/model` or use `os.environ["SM_MODEL_DIR"]` as your save directory. After training, artifacts in this directory are uploaded to S3: ```diff - torch.save('/opt/ml/model`) + accelerator.save('/opt/ml/model') ``` SageMaker doesn’t support argparse actions. If you want to use, for example, boolean hyperparameters, you need to specify type as bool in your script and provide an explicit True or False value for this hyperparameter. [[REF]](https://sagemaker.readthedocs.io/en/stable/frameworks/pytorch/using_pytorch.html#prepare-a-pytorch-training-script). ### Launch Training You can launch your training with Accelerate CLI with: ``` accelerate launch path_to_script.py --args_to_the_script ``` This will launch your training script using your configuration. The only thing you have to do is provide all the arguments needed by your training script as named arguments. **Examples** If you run one of the example scripts, don't forget to add `accelerator.save('/opt/ml/model')` to it. ```bash accelerate launch ./examples/sagemaker_example.py ``` Outputs: ``` Configuring Amazon SageMaker environment Converting Arguments to Hyperparameters Creating Estimator 2021-04-08 11:56:50 Starting - Starting the training job... 2021-04-08 11:57:13 Starting - Launching requested ML instancesProfilerReport-1617883008: InProgress ......... 2021-04-08 11:58:54 Starting - Preparing the instances for training......... 2021-04-08 12:00:24 Downloading - Downloading input data 2021-04-08 12:00:24 Training - Downloading the training image.................. 2021-04-08 12:03:39 Training - Training image download completed. Training in progress.. ........ epoch 0: {'accuracy': 0.7598039215686274, 'f1': 0.8178438661710037} epoch 1: {'accuracy': 0.8357843137254902, 'f1': 0.882249560632689} epoch 2: {'accuracy': 0.8406862745098039, 'f1': 0.8869565217391304} ........ 2021-04-08 12:05:40 Uploading - Uploading generated training model 2021-04-08 12:05:40 Completed - Training job completed Training seconds: 331 Billable seconds: 331 You can find your model data at: s3://your-bucket/accelerate-sagemaker-1-2021-04-08-11-56-47-108/output/model.tar.gz ``` ## Advanced Features ### Distributed Training: Data Parallelism Set up the accelerate config by running `accelerate config` and answer the SageMaker questions and set it up. To use SageMaker DDP, select it when asked `What is the distributed mode? ([0] No distributed training, [1] data parallelism):`. Example config below: ```yaml base_job_name: accelerate-sagemaker-1 compute_environment: AMAZON_SAGEMAKER distributed_type: DATA_PARALLEL ec2_instance_type: ml.p3.16xlarge iam_role_name: xxxxx image_uri: null mixed_precision: fp16 num_machines: 1 profile: xxxxx py_version: py10 pytorch_version: 2.5.0 region: us-east-1 transformers_version: 4.17.0 use_cpu: false ``` ### Distributed Training: Model Parallelism *currently in development, will be supported soon.* ### Python packages and dependencies Accelerate currently uses the DLCs, with `transformers`, `datasets` and `tokenizers` pre-installed. If you want to use different/other Python packages you can do this by adding them to the `requirements.txt`. These packages will be installed before your training script is started. ### Local Training: SageMaker Local mode The local mode in the SageMaker SDK allows you to run your training script locally inside the HuggingFace DLC (Deep Learning container) or using your custom container image. This is useful for debugging and testing your training script inside the final container environment. Local mode uses Docker compose (*Note: Docker Compose V2 is not supported yet*). The SDK will handle the authentication against ECR to pull the DLC to your local environment. You can emulate CPU (single and multi-instance) and GPU (single instance) SageMaker training jobs. To use local mode, you need to set your `ec2_instance_type` to `local`. ```yaml ec2_instance_type: local ``` ### Advanced configuration The configuration allows you to override parameters for the [Estimator](https://sagemaker.readthedocs.io/en/stable/api/training/estimators.html). These settings have to be applied in the config file and are not part of `accelerate config`. You can control many additional aspects of the training job, e.g. use Spot instances, enable network isolation and many more. ```yaml additional_args: # enable network isolation to restrict internet access for containers enable_network_isolation: True ``` You can find all available configuration [here](https://sagemaker.readthedocs.io/en/stable/api/training/estimators.html). ### Use Spot Instances You can use Spot Instances e.g. using (see [Advanced configuration](#advanced-configuration)): ```yaml additional_args: use_spot_instances: True max_wait: 86400 ``` *Note: Spot Instances are subject to be terminated and training to be continued from a checkpoint. This is not handled in Accelerate out of the box. Contact us if you would like this feature.* ### Remote scripts: Use scripts located on Github *undecided if feature is needed. Contact us if you would like this feature.*accelerate-1.14.0/docs/source/usage_guides/tracking.md000066400000000000000000000206301521253476100227140ustar00rootroot00000000000000 # Experiment trackers There are a large number of experiment tracking APIs available, however getting them all to work in a multi-processing environment can oftentimes be complex. Accelerate provides a general tracking API that can be used to log useful items during your script through [`Accelerator.log`] ## Integrated Trackers Currently `Accelerate` supports eight trackers out-of-the-box: - TensorBoard - WandB - Trackio - CometML - Aim - MLFlow - ClearML - DVCLive To use any of them, pass in the selected type(s) to the `log_with` parameter in [`Accelerate`]: ```python from accelerate import Accelerator from accelerate.utils import LoggerType accelerator = Accelerator(log_with="all") # For all available trackers in the environment accelerator = Accelerator(log_with="wandb") accelerator = Accelerator(log_with=["wandb", LoggerType.TENSORBOARD]) ``` At the start of your experiment [`Accelerator.init_trackers`] should be used to setup your project, and potentially add any experiment hyperparameters to be logged: ```python hps = {"num_iterations": 5, "learning_rate": 1e-2} accelerator.init_trackers("my_project", config=hps) ``` When you are ready to log any data, [`Accelerator.log`] should be used. A `step` can also be passed in to correlate the data with a particular step in the training loop. ```python accelerator.log({"train_loss": 1.12, "valid_loss": 0.8}, step=1) ``` Once you've finished training, make sure to run [`Accelerator.end_training`] so that all the trackers can run their finish functionalities if they have any. ```python accelerator.end_training() ``` A full example is below: ```python from accelerate import Accelerator accelerator = Accelerator(log_with="all") config = { "num_iterations": 5, "learning_rate": 1e-2, "loss_function": str(my_loss_function), } accelerator.init_trackers("example_project", config=config) my_model, my_optimizer, my_training_dataloader = accelerator.prepare(my_model, my_optimizer, my_training_dataloader) device = accelerator.device my_model.to(device) for iteration in range(config["num_iterations"]): for step, batch in enumerate(my_training_dataloader): my_optimizer.zero_grad() inputs, targets = batch inputs = inputs.to(device) targets = targets.to(device) outputs = my_model(inputs) loss = my_loss_function(outputs, targets) accelerator.backward(loss) my_optimizer.step() accelerator.log({"training_loss": loss}, step=step) accelerator.end_training() ``` If a tracker requires a directory to save data to, such as `TensorBoard`, then pass the directory path to `project_dir`. The `project_dir` parameter is useful when there are other configurations to be combined with in the [`~utils.ProjectConfiguration`] data class. For example, you can save the TensorBoard data to `project_dir` and everything else can be logged in the `logging_dir` parameter of [`~utils.ProjectConfiguration`: ```python accelerator = Accelerator(log_with="tensorboard", project_dir=".") # use with ProjectConfiguration config = ProjectConfiguration(project_dir=".", logging_dir="another/directory") accelerator = Accelerator(log_with="tensorboard", project_config=config) ``` ## Implementing Custom Trackers To implement a new tracker to be used in `Accelerator`, a new one can be made through implementing the [`GeneralTracker`] class. Every tracker must implement three functions and have three properties: - `__init__`: - Should store a `run_name` and initialize the tracker API of the integrated library. - If a tracker stores their data locally (such as TensorBoard), a `logging_dir` parameter can be added. - `store_init_configuration`: - Should take in a `values` dictionary and store them as a one-time experiment configuration - `log`: - Should take in a `values` dictionary and a `step`, and should log them to the run - `name` (`str`): - A unique string name for the tracker, such as `"wandb"` for the wandb tracker. - This will be used for interacting with this tracker specifically - `requires_logging_directory` (`bool`): - Whether a `logging_dir` is needed for this particular tracker and if it uses one. - `tracker`: - This should be implemented as a `@property` function - Should return the internal tracking mechanism the library uses, such as the `run` object for `wandb`. Each method should also utilize the [`state.PartialState`] class if the logger should only be executed on the main process for instance. A brief example can be seen below with an integration with Weights and Biases, containing only the relevant information and logging just on the main process: ```python from accelerate.tracking import GeneralTracker, on_main_process from typing import Optional import wandb class MyCustomTracker(GeneralTracker): name = "wandb" requires_logging_directory = False @on_main_process def __init__(self, run_name: str): self.run_name = run_name run = wandb.init(self.run_name) @property def tracker(self): return self.run.run @on_main_process def store_init_configuration(self, values: dict): wandb.config(values) @on_main_process def log(self, values: dict, step: Optional[int] = None): wandb.log(values, step=step) ``` When you are ready to build your `Accelerator` object, pass in an **instance** of your tracker to [`Accelerator.log_with`] to have it automatically be used with the API: ```python tracker = MyCustomTracker("some_run_name") accelerator = Accelerator(log_with=tracker) ``` These also can be mixed with existing trackers, including with `"all"`: ```python tracker = MyCustomTracker("some_run_name") accelerator = Accelerator(log_with=[tracker, "all"]) ``` ## Accessing the internal tracker If some custom interactions with a tracker might be wanted directly, you can quickly access one using the [`Accelerator.get_tracker`] method. Just pass in the string corresponding to a tracker's `.name` attribute and it will return that tracker on the main process. This example shows doing so with wandb: ```python wandb_tracker = accelerator.get_tracker("wandb") ``` From there you can interact with `wandb`'s `run` object like normal: ```python wandb_tracker.log_artifact(some_artifact_to_log) ``` Trackers built in Accelerate will automatically execute on the correct process, so if a tracker is only meant to be ran on the main process it will do so automatically. If you want to truly remove Accelerate's wrapping entirely, you can achieve the same outcome with: ```python wandb_tracker = accelerator.get_tracker("wandb", unwrap=True) if accelerator.is_main_process: wandb_tracker.log_artifact(some_artifact_to_log) ``` ## When a wrapper cannot work If a library has an API that does not follow a strict `.log` with an overall dictionary such as Neptune.AI, logging can be done manually under an `if accelerator.is_main_process` statement: ```diff from accelerate import Accelerator + import neptune accelerator = Accelerator() + run = neptune.init_run(...) my_model, my_optimizer, my_training_dataloader = accelerate.prepare(my_model, my_optimizer, my_training_dataloader) device = accelerator.device my_model.to(device) for iteration in config["num_iterations"]: for batch in my_training_dataloader: my_optimizer.zero_grad() inputs, targets = batch inputs = inputs.to(device) targets = targets.to(device) outputs = my_model(inputs) loss = my_loss_function(outputs, targets) total_loss += loss accelerator.backward(loss) my_optimizer.step() + if accelerator.is_main_process: + run["logs/training/batch/loss"].log(loss) ``` accelerate-1.14.0/docs/source/usage_guides/training_zoo.md000066400000000000000000000416111521253476100236160ustar00rootroot00000000000000 # Example Zoo Below contains a non-exhaustive list of tutorials and scripts showcasing Accelerate. ## Official Accelerate Examples: ### Basic Examples These examples showcase the base features of Accelerate and are a great starting point - [Barebones NLP example](https://github.com/huggingface/accelerate/blob/main/examples/nlp_example.py) - [Barebones distributed NLP example in a Jupyter Notebook](https://github.com/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_nlp_example.ipynb) - [Barebones computer vision example](https://github.com/huggingface/accelerate/blob/main/examples/cv_example.py) - [Barebones distributed computer vision example in a Jupyter Notebook](https://github.com/huggingface/notebooks/blob/main/examples/accelerate_examples/simple_cv_example.ipynb) - [Using Accelerate in Kaggle](https://www.kaggle.com/code/muellerzr/multi-gpu-and-accelerate) ### Feature Specific Examples These examples showcase specific features that the Accelerate framework offers - [Automatic memory-aware gradient accumulation](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/automatic_gradient_accumulation.py) - [Checkpointing states](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/checkpointing.py) - [Cross validation](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/cross_validation.py) - [DeepSpeed](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/deepspeed_with_config_support.py) - [Fully Sharded Data Parallelism](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/fsdp_with_peak_mem_tracking.py) - [Gradient accumulation](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/gradient_accumulation.py) - [Memory-aware batch size finder](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/memory.py) - [Metric Computation](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/multi_process_metrics.py) - [Using Trackers](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/tracking.py) - [Using Megatron-LM](https://github.com/huggingface/accelerate/blob/main/examples/by_feature/megatron_lm_gpt_pretraining.py) ### Full Examples These examples showcase every feature in Accelerate at once that was shown in "Feature Specific Examples" - [Complete NLP example](https://github.com/huggingface/accelerate/blob/main/examples/complete_nlp_example.py) - [Complete computer vision example](https://github.com/huggingface/accelerate/blob/main/examples/complete_cv_example.py) - [Very complete and extensible vision example showcasing SLURM, hydra, and a very extensible usage of the framework](https://github.com/yuvalkirstain/PickScore) - [Causal language model fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_clm_no_trainer.py) - [Masked language model fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/language-modeling/run_mlm_no_trainer.py) - [Speech pretraining example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/speech-pretraining/run_wav2vec2_pretraining_no_trainer.py) - [Translation fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/translation/run_translation_no_trainer.py) - [Text classification fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/text-classification/run_glue_no_trainer.py) - [Semantic segmentation fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/semantic-segmentation/run_semantic_segmentation_no_trainer.py) - [Question answering fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/question-answering/run_qa_no_trainer.py) - [Beam search question answering fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/question-answering/run_qa_beam_search_no_trainer.py) - [Multiple choice question answering fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/multiple-choice/run_swag_no_trainer.py) - [Named entity recognition fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/token-classification/run_ner_no_trainer.py) - [Image classification fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/image-classification/run_image_classification_no_trainer.py) - [Summarization fine-tuning example](https://github.com/huggingface/transformers/blob/main/examples/pytorch/summarization/run_summarization_no_trainer.py) - [End-to-end examples on how to use AWS SageMaker integration of Accelerate](https://github.com/huggingface/notebooks/blob/main/sagemaker/22_accelerate_sagemaker_examples/README.md) - [Megatron-LM examples for various NLp tasks](https://github.com/pacman100/accelerate-megatron-test) ## Integration Examples These are tutorials from libraries that integrate with Accelerate: > Don't find your integration here? Make a PR to include it! ### Amphion - [Training Text-to-Speech Models with Amphion](https://github.com/open-mmlab/Amphion/blob/main/egs/tts/README.md) - [Training Singing Voice Conversion Models with Amphion](https://github.com/open-mmlab/Amphion/blob/main/egs/svc/README.md) - [Training Vocoders with Amphion](https://github.com/open-mmlab/Amphion/blob/main/egs/vocoder/README.md) ### Catalyst - [Distributed training tutorial with Catalyst](https://catalyst-team.github.io/catalyst/tutorials/ddp.html) ### DALLE2-pytorch - [Fine-tuning DALLE2](https://github.com/lucidrains/DALLE2-pytorch#usage) ### Diffusers - [Performing textual inversion with diffusers](https://github.com/huggingface/diffusers/tree/main/examples/textual_inversion) - [Training DreamBooth with diffusers](https://github.com/huggingface/diffusers/tree/main/examples/dreambooth) ### fastai - [Distributed training from Jupyter Notebooks with fastai](https://docs.fast.ai/tutorial.distributed.html) - [Basic distributed training examples with fastai](https://docs.fast.ai/examples/distributed_app_examples.html) ### GradsFlow - [Auto Image Classification with GradsFlow](https://docs.gradsflow.com/en/latest/examples/nbs/01-ImageClassification/) ### imagen-pytorch - [Fine-tuning Imagen](https://github.com/lucidrains/imagen-pytorch#usage) ### Kornia - [Fine-tuning vision models with Kornia's Trainer](https://kornia.readthedocs.io/en/latest/get-started/training.html) ### PyTorch Accelerated - [Quickstart distributed training tutorial with PyTorch Accelerated](https://pytorch-accelerated.readthedocs.io/en/latest/quickstart.html) ### PyTorch3D - [Perform Deep Learning with 3D data](https://pytorch3d.org/tutorials/) ### Stable-Dreamfusion - [Training with Stable-Dreamfusion to convert text to a 3D model](https://colab.research.google.com/drive/1MXT3yfOFvO0ooKEfiUUvTKwUkrrlCHpF?usp=sharing) ### Tez - [Leaf disease detection with Tez and Accelerate](https://www.kaggle.com/code/abhishek/tez-faster-and-easier-training-for-leaf-detection/notebook) ### trlx - [How to implement a sentiment learning task with trlx](https://github.com/CarperAI/trlx#example-how-to-add-a-task) ### Comfy-UI - [Enabling using large Stable Diffusion Models in low-vram settings using Accelerate](https://github.com/comfyanonymous/ComfyUI/blob/master/comfy/model_management.py#L291-L296) ## In Science Below contains a non-exhaustive list of papers utilizing Accelerate. > Don't find your paper here? Make a PR to include it! * Yuval Kirstain, Adam Polyak, Uriel Singer, Shahbuland Matiana, Joe Penna, Omer Levy: “Pick-a-Pic: An Open Dataset of User Preferences for Text-to-Image Generation�, 2023; [arXiv:2305.01569](http://huggingface.co/papers/2305.01569). * Lei Wang, Wanyu Xu, Yihuai Lan, Zhiqiang Hu, Yunshi Lan, Roy Ka-Wei Lee, Ee-Peng Lim: “Plan-and-Solve Prompting: Improving Zero-Shot Chain-of-Thought Reasoning by Large Language Models�, 2023; [arXiv:2305.04091](http://huggingface.co/papers/2305.04091). * Arthur Câmara, Claudia Hauff: “Moving Stuff Around: A study on efficiency of moving documents into memory for Neural IR models�, 2022; [arXiv:2205.08343](http://huggingface.co/papers/2205.08343). * Ying Sheng, Lianmin Zheng, Binhang Yuan, Zhuohan Li, Max Ryabinin, Daniel Y. Fu, Zhiqiang Xie, Beidi Chen, Clark Barrett, Joseph E. Gonzalez, Percy Liang, Christopher Ré, Ion Stoica, Ce Zhang: “High-throughput Generative Inference of Large Language Models with a Single GPU�, 2023; [arXiv:2303.06865](http://huggingface.co/papers/2303.06865). * Peter Melchior, Yan Liang, ChangHoon Hahn, Andy Goulding: “Autoencoding Galaxy Spectra I: Architecture�, 2022; [arXiv:2211.07890](http://huggingface.co/papers/2211.07890). * Jiaao Chen, Aston Zhang, Mu Li, Alex Smola, Diyi Yang: “A Cheaper and Better Diffusion Language Model with Soft-Masked Noise�, 2023; [arXiv:2304.04746](http://huggingface.co/papers/2304.04746). * Ayaan Haque, Matthew Tancik, Alexei A. Efros, Aleksander Holynski, Angjoo Kanazawa: “Instruct-NeRF2NeRF: Editing 3D Scenes with Instructions�, 2023; [arXiv:2303.12789](http://huggingface.co/papers/2303.12789). * Luke Melas-Kyriazi, Christian Rupprecht, Iro Laina, Andrea Vedaldi: “RealFusion: 360° Reconstruction of Any Object from a Single Image�, 2023; [arXiv:2302.10663](http://huggingface.co/papers/2302.10663). * Xiaoshi Wu, Keqiang Sun, Feng Zhu, Rui Zhao, Hongsheng Li: “Better Aligning Text-to-Image Models with Human Preference�, 2023; [arXiv:2303.14420](http://huggingface.co/papers/2303.14420). * Yongliang Shen, Kaitao Song, Xu Tan, Dongsheng Li, Weiming Lu, Yueting Zhuang: “HuggingGPT: Solving AI Tasks with ChatGPT and its Friends in HuggingFace�, 2023; [arXiv:2303.17580](http://huggingface.co/papers/2303.17580). * Yue Yang, Wenlin Yao, Hongming Zhang, Xiaoyang Wang, Dong Yu, Jianshu Chen: “Z-LaVI: Zero-Shot Language Solver Fueled by Visual Imagination�, 2022; [arXiv:2210.12261](http://huggingface.co/papers/2210.12261). * Sheng-Yen Chou, Pin-Yu Chen, Tsung-Yi Ho: “How to Backdoor Diffusion Models?�, 2022; [arXiv:2212.05400](http://huggingface.co/papers/2212.05400). * Junyoung Seo, Wooseok Jang, Min-Seop Kwak, Jaehoon Ko, Hyeonsu Kim, Junho Kim, Jin-Hwa Kim, Jiyoung Lee, Seungryong Kim: “Let 2D Diffusion Model Know 3D-Consistency for Robust Text-to-3D Generation�, 2023; [arXiv:2303.07937](http://huggingface.co/papers/2303.07937). * Or Patashnik, Daniel Garibi, Idan Azuri, Hadar Averbuch-Elor, Daniel Cohen-Or: “Localizing Object-level Shape Variations with Text-to-Image Diffusion Models�, 2023; [arXiv:2303.11306](http://huggingface.co/papers/2303.11306). * Dídac Surís, Sachit Menon, Carl Vondrick: “ViperGPT: Visual Inference via Python Execution for Reasoning�, 2023; [arXiv:2303.08128](http://huggingface.co/papers/2303.08128). * Chenyang Qi, Xiaodong Cun, Yong Zhang, Chenyang Lei, Xintao Wang, Ying Shan, Qifeng Chen: “FateZero: Fusing Attentions for Zero-shot Text-based Video Editing�, 2023; [arXiv:2303.09535](http://huggingface.co/papers/2303.09535). * Sean Welleck, Jiacheng Liu, Ximing Lu, Hannaneh Hajishirzi, Yejin Choi: “NaturalProver: Grounded Mathematical Proof Generation with Language Models�, 2022; [arXiv:2205.12910](http://huggingface.co/papers/2205.12910). * Elad Richardson, Gal Metzer, Yuval Alaluf, Raja Giryes, Daniel Cohen-Or: “TEXTure: Text-Guided Texturing of 3D Shapes�, 2023; [arXiv:2302.01721](http://huggingface.co/papers/2302.01721). * Puijin Cheng, Li Lin, Yijin Huang, Huaqing He, Wenhan Luo, Xiaoying Tang: “Learning Enhancement From Degradation: A Diffusion Model For Fundus Image Enhancement�, 2023; [arXiv:2303.04603](http://huggingface.co/papers/2303.04603). * Shun Shao, Yftah Ziser, Shay Cohen: “Erasure of Unaligned Attributes from Neural Representations�, 2023; [arXiv:2302.02997](http://huggingface.co/papers/2302.02997). * Seonghyeon Ye, Hyeonbin Hwang, Sohee Yang, Hyeongu Yun, Yireun Kim, Minjoon Seo: “In-Context Instruction Learning�, 2023; [arXiv:2302.14691](http://huggingface.co/papers/2302.14691). * Shikun Liu, Linxi Fan, Edward Johns, Zhiding Yu, Chaowei Xiao, Anima Anandkumar: “Prismer: A Vision-Language Model with An Ensemble of Experts�, 2023; [arXiv:2303.02506](http://huggingface.co/papers/2303.02506). * Haoyu Chen, Zhihua Wang, Yang Yang, Qilin Sun, Kede Ma: “Learning a Deep Color Difference Metric for Photographic Images�, 2023; [arXiv:2303.14964](http://huggingface.co/papers/2303.14964). * Van-Hoang Le, Hongyu Zhang: “Log Parsing with Prompt-based Few-shot Learning�, 2023; [arXiv:2302.07435](http://huggingface.co/papers/2302.07435). * Keito Kudo, Yoichi Aoki, Tatsuki Kuribayashi, Ana Brassard, Masashi Yoshikawa, Keisuke Sakaguchi, Kentaro Inui: “Do Deep Neural Networks Capture Compositionality in Arithmetic Reasoning?�, 2023; [arXiv:2302.07866](http://huggingface.co/papers/2302.07866). * Ruoyao Wang, Peter Jansen, Marc-Alexandre Côté, Prithviraj Ammanabrolu: “Behavior Cloned Transformers are Neurosymbolic Reasoners�, 2022; [arXiv:2210.07382](http://huggingface.co/papers/2210.07382). * Martin Wessel, Tomáš Horych, Terry Ruas, Akiko Aizawa, Bela Gipp, Timo Spinde: “Introducing MBIB -- the first Media Bias Identification Benchmark Task and Dataset Collection�, 2023; [arXiv:2304.13148](http://huggingface.co/papers/2304.13148). DOI: [https://dx.doi.org/10.1145/3539618.3591882 10.1145/3539618.3591882]. * Hila Chefer, Yuval Alaluf, Yael Vinker, Lior Wolf, Daniel Cohen-Or: “Attend-and-Excite: Attention-Based Semantic Guidance for Text-to-Image Diffusion Models�, 2023; [arXiv:2301.13826](http://huggingface.co/papers/2301.13826). * Marcio Fonseca, Yftah Ziser, Shay B. Cohen: “Factorizing Content and Budget Decisions in Abstractive Summarization of Long Documents�, 2022; [arXiv:2205.12486](http://huggingface.co/papers/2205.12486). * Elad Richardson, Gal Metzer, Yuval Alaluf, Raja Giryes, Daniel Cohen-Or: “TEXTure: Text-Guided Texturing of 3D Shapes�, 2023; [arXiv:2302.01721](http://huggingface.co/papers/2302.01721). * Tianxing He, Jingyu Zhang, Tianle Wang, Sachin Kumar, Kyunghyun Cho, James Glass, Yulia Tsvetkov: “On the Blind Spots of Model-Based Evaluation Metrics for Text Generation�, 2022; [arXiv:2212.10020](http://huggingface.co/papers/2212.10020). * Ori Ram, Yoav Levine, Itay Dalmedigos, Dor Muhlgay, Amnon Shashua, Kevin Leyton-Brown, Yoav Shoham: “In-Context Retrieval-Augmented Language Models�, 2023; [arXiv:2302.00083](http://huggingface.co/papers/2302.00083). * Dacheng Li, Rulin Shao, Hongyi Wang, Han Guo, Eric P. Xing, Hao Zhang: “MPCFormer: fast, performant and private Transformer inference with MPC�, 2022; [arXiv:2211.01452](http://huggingface.co/papers/2211.01452). * Baolin Peng, Michel Galley, Pengcheng He, Chris Brockett, Lars Liden, Elnaz Nouri, Zhou Yu, Bill Dolan, Jianfeng Gao: “GODEL: Large-Scale Pre-Training for Goal-Directed Dialog�, 2022; [arXiv:2206.11309](http://huggingface.co/papers/2206.11309). * Egil Rønningstad, Erik Velldal, Lilja Øvrelid: “Entity-Level Sentiment Analysis (ELSA): An exploratory task survey�, 2023, Proceedings of the 29th International Conference on Computational Linguistics, 2022, pages 6773-6783; [arXiv:2304.14241](http://huggingface.co/papers/2304.14241). * Charlie Snell, Ilya Kostrikov, Yi Su, Mengjiao Yang, Sergey Levine: “Offline RL for Natural Language Generation with Implicit Language Q Learning�, 2022; [arXiv:2206.11871](http://huggingface.co/papers/2206.11871). * Zhiruo Wang, Shuyan Zhou, Daniel Fried, Graham Neubig: “Execution-Based Evaluation for Open-Domain Code Generation�, 2022; [arXiv:2212.10481](http://huggingface.co/papers/2212.10481). * Minh-Long Luu, Zeyi Huang, Eric P. Xing, Yong Jae Lee, Haohan Wang: “Expeditious Saliency-guided Mix-up through Random Gradient Thresholding�, 2022; [arXiv:2212.04875](http://huggingface.co/papers/2212.04875). * Jun Hao Liew, Hanshu Yan, Daquan Zhou, Jiashi Feng: “MagicMix: Semantic Mixing with Diffusion Models�, 2022; [arXiv:2210.16056](http://huggingface.co/papers/2210.16056). * Yaqing Wang, Subhabrata Mukherjee, Xiaodong Liu, Jing Gao, Ahmed Hassan Awadallah, Jianfeng Gao: “LiST: Lite Prompted Self-training Makes Parameter-Efficient Few-shot Learners�, 2021; [arXiv:2110.06274](http://huggingface.co/papers/2110.06274). accelerate-1.14.0/examples/000077500000000000000000000000001521253476100155115ustar00rootroot00000000000000accelerate-1.14.0/examples/README.md000066400000000000000000000333221521253476100167730ustar00rootroot00000000000000 # In this folder we showcase various full examples using 🤗 Accelerate ## Simple NLP example The [nlp_example.py](./nlp_example.py) script is a simple example to train a Bert model on a classification task ([GLUE's MRPC](https://www.microsoft.com/en-us/download/details.aspx?id=52398)). Prior to running it you should install 🤗 Dataset and 🤗 Transformers: ```bash pip install datasets evaluate transformers ``` The same script can be run in any of the following configurations: - single CPU or single GPU - multi CPUs - multi GPUs (using PyTorch distributed mode) - (multi) TPUs - fp16 (mixed-precision) or fp32 (normal precision) To run it in each of these various modes, use the following commands: - single CPU: * from a server without GPU ```bash python ./nlp_example.py ``` * from any server by passing `cpu=True` to the `Accelerator`. ```bash python ./nlp_example.py --cpu ``` * from any server with Accelerate launcher ```bash accelerate launch --cpu ./nlp_example.py ``` - single GPU: ```bash python ./nlp_example.py # from a server with a GPU ``` - with fp16 (mixed-precision) * from any server by passing `mixed_precison=fp16` to the `Accelerator`. ```bash python ./nlp_example.py --mixed_precision fp16 ``` * from any server with Accelerate launcher ```bash accelerate launch --mixed_precision fp16 ./nlp_example.py - multi CPUs (requires Open MPI, Intel MPI, or MVAPICH) * With Accelerate config and launcher, execute the following from node 0: ```bash accelerate config # Select to have accelerate launch mpirun accelerate launch ./nlp_example.py # This will run the script on each server ``` * With Intel MPI: ```bash export CCL_WORKER_COUNT=1 export MASTER_ADDR=xxx.xxx.xxx.xxx #node0 ip mpirun -f hostfile -n 16 -ppn 4 python ./nlp_example.py ``` - multi GPUs (using PyTorch distributed mode) * With Accelerate config and launcher ```bash accelerate config # This will create a config file on your server accelerate launch ./nlp_example.py # This will run the script on your server ``` * With traditional PyTorch launcher (`python -m torch.distributed.run` can be used instead of `torchrun`) ```bash torchrun --nproc_per_node 2 ./nlp_example.py ``` - multi GPUs, multi node (several machines, using PyTorch distributed mode) * With Accelerate config and launcher, on each machine: ```bash accelerate config # This will create a config file on each server accelerate launch ./nlp_example.py # This will run the script on each server ``` * With PyTorch launcher only (`python -m torch.distributed.run` can be used instead of `torchrun`). Run this command on each node: ```bash torchrun \ # python -m torch.distributed.run --nproc_per_node 2 \ --nnodes 2 \ --rdzv_id 2299 \ # A unique job id --rdzv_backend c10d \ --rdzv_endpoint master_node_ip_address:29500 \ ./nlp_example.py ``` - (multi) TPUs * With Accelerate config and launcher ```bash accelerate config # This will create a config file on your TPU server accelerate launch ./nlp_example.py # This will run the script on each server ``` * In PyTorch: Add an `xmp.spawn` line in your script as you usually do. ## Simple vision example The [cv_example.py](./cv_example.py) script is a simple example to fine-tune a ResNet-50 on a classification task ([Oxford-IIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/)). The same script can be run in any of the following configurations: - single CPU or single GPU - multi CPUs - multi GPUs (using PyTorch distributed mode) - (multi) TPUs - fp16 (mixed-precision) or fp32 (normal precision) Prior to running it you should install timm and torchvision: ```bash pip install timm torchvision ``` and you should download the data with the following commands: ```bash wget https://www.robots.ox.ac.uk/~vgg/data/pets/data/images.tar.gz tar -xzf images.tar.gz ``` To run it in each of these various modes, use the following commands: - single CPU: * from a server without GPU ```bash python ./cv_example.py --data_dir path_to_data ``` * from any server by passing `cpu=True` to the `Accelerator`. ```bash python ./cv_example.py --data_dir path_to_data --cpu ``` * from any server with Accelerate launcher ```bash accelerate launch --cpu ./cv_example.py --data_dir path_to_data ``` - single GPU: ```bash python ./cv_example.py # from a server with a GPU ``` - with fp16 (mixed-precision) * from any server by passing `mixed_precison=fp16` to the `Accelerator`. ```bash python ./cv_example.py --data_dir path_to_data --mixed_precison fp16 ``` * from any server with Accelerate launcher ```bash accelerate launch --mixed_precison fp16 ./cv_example.py --data_dir path_to_data - multi CPUs (requires Open MPI, Intel MPI, or MVAPICH) * With Accelerate config and launcher, run the following from node 0: ```bash accelerate config --config_file config.yaml # Select to have accelerate launch mpirun accelerate launch ./cv_example.py --data_dir path_to_data # This will run the script on each server ``` * With Intel MPI, execute mpirun from node 0: ```bash export CCL_WORKER_COUNT=1 export MASTER_ADDR=xxx.xxx.xxx.xxx #node0 ip mpirun -f hostfile -n 16 -ppn 4 python ./cv_example.py --data_dir path_to_data ``` - multi GPUs (using PyTorch distributed mode) * With Accelerate config and launcher ```bash accelerate config --config_file config.yaml # This will create a config file on your server to `config.yaml` accelerate launch --config_file config.yaml ./cv_example.py --data_dir path_to_data # This will run the script on your server ``` * With traditional PyTorch launcher (`python -m torch.distributed.run` can be used instead of `torchrun`) ```bash torchrun --nproc_per_node 2 ./cv_example.py --data_dir path_to_data ``` - multi GPUs, multi node (several machines, using PyTorch distributed mode) * With Accelerate config and launcher, on each machine: ```bash accelerate config --config_file config.yaml # This will create a config file on your server to `config.yaml` accelerate launch --config_file config.yaml ./cv_example.py --data_dir path_to_data # This will run the script on each server ``` * With PyTorch launcher only (`python -m torch.distributed.run` can be used instead of `torchrun`). Run this command on each node: ```bash torchrun \ # python -m torch.distributed.run --nproc_per_node 2 \ --nnodes 2 \ --rdzv_id 2299 \ # A unique job id --rdzv_backend c10d \ --rdzv_endpoint master_node_ip_address:29500 \ ./cv_example.py --data_dir path_to_data ``` - (multi) TPUs * With Accelerate config and launcher ```bash accelerate config --config_file config.yaml # This will create a config file on your server to `config.yaml` accelerate launch --config_file config.yaml ./cv_example.py --data_dir path_to_data # This will run the script on each server ``` * In PyTorch: Add an `xmp.spawn` line in your script as you usually do. ### Simple vision example (GANs) - [huggan project](https://github.com/huggingface/community-events/tree/main/huggan) ### Using AWS SageMaker integration - [Examples showcasing AWS SageMaker integration of 🤗 Accelerate.](https://github.com/pacman100/accelerate-aws-sagemaker) ## Configuration zoo In [/config_yaml_templates](./config_yaml_templates/) we have a variety of *minimal* `config.yaml` templates and examples to help you learn how to create your own configuration files depending on the scenario. ## SLURM Scripts In [/slurm/submit_multigpu.sh](./slurm/submit_multigpu.sh) and [/slurm/submit_multinode.sh](./slurm/submit_multinode.sh) we present two scripts for running the examples on a machine with [SLURM](https://slurm.schedmd.com/documentation.html) workload manager. In [/slurm/submit_multigpu.sh](./slurm/submit_multigpu.sh) the only parameter in the launcher that needs to be modified is `--num_processes`, which determines the number of GPUs we will use. In this case, using the environment variable `$SLURM_GPUS`, we indicate that we want to utilize all the GPUs available on the node we have requested. In [/slurm/submit_multinode.sh](./slurm/submit_multinode.sh) we must specify the number of nodes that will be part of the training (`--num_machines`), how many GPUs we will use in total (`--num_processes`), the [`backend`](https://pytorch.org/docs/stable/elastic/run.html#note-on-rendezvous-backend), `--main_process_ip` which will be the address the master node and the `--main_process_port`. In [/slurm/submit_multicpu.sh](./slurm/submit_multicpu.sh) we must specify the number of nodes that will be part of the training (`--num_machines`), how many CPU processes we will use in total (`--num_processes`), the [`backend`](https://pytorch.org/docs/stable/elastic/run.html#note-on-rendezvous-backend), `--main_process_ip` which will be the address the master node and the `--main_process_port`. `mpirun_hostfile` specifies to run the job using MPIRun. In both scripts, we run `activateEnvironment.sh` at the beginning. This script should contain the necessary instructions to initialize the environment for execution. Below, we show an example that loads the necessary libraries ([Environment modules](https://github.com/cea-hpc/modules)), activates the Python environment, and sets up various environment variables, most of them to run the scripts in offline mode in case we don't have internet connection from the cluster. ```bash # activateEnvironment.sh module purge module load anaconda3/2020.02 cuda/10.2 cudnn/8.0.5 nccl/2.9.9 arrow/7.0.0 openmpi source activate /home/nct01/nct01328/pytorch_antoni_local export HF_HOME=/gpfs/projects/nct01/nct01328/ export HF_LOCAL_HOME=/gpfs/projects/nct01/nct01328/HF_LOCAL export HF_DATASETS_OFFLINE=1 export TRANSFORMERS_OFFLINE=1 export PYTHONPATH=/home/nct01/nct01328/transformers-in-supercomputers:$PYTHONPATH export GPUS_PER_NODE=4 ``` ## Simple Multi-GPU Hardware Launcher (using an external platform) [multigpu_remote_launcher.py](./multigpu_remote_launcher.py) is a minimal script that demonstrates launching accelerate on multiple remote GPUs, and with automatic hardware environment and dependency setup for reproducibility. You can easily customize the training function used, training arguments, hyperparameters, and type of compute hardware, and then run the script to automatically launch multi GPU training on remote hardware. This script uses [Runhouse](https://github.com/run-house/runhouse) to launch on self-hosted hardware (e.g. in your own cloud account or on-premise cluster) but there are other options for running remotely as well. Runhouse can be installed with `pip install runhouse`, and you can refer to [hardware setup](https://runhouse-docs.readthedocs-hosted.com/en/latest/api/python/cluster.html#hardware-setup) for hardware setup instructions, or this [Colab tutorial](https://colab.research.google.com/drive/1qVwYyLTCPYPSdz9ZX7BZl9Qm0A3j7RJe) for a more in-depth walkthrough. ## Simple fine-tuning script that works on TPU [finetune_lm_tpu.py](./finetune_lm_tpu.py) is a classical language modeling generation fine tuning script that has been adapted to run best on TPUs. It has been successfully run and tested on a TPU v5 litepod-8, and it shows how it is possible to perform a fine-tuning task on such hardware thanks to accelerate and FSDPv2, using transformers and Torch XLA. ## Finer Examples While the first two scripts are extremely barebones when it comes to what you can do with accelerate, more advanced features are documented in two other locations. ### `by_feature` examples These scripts are *individual* examples highlighting one particular feature or use-case within Accelerate. They all stem from the [nlp_example.py](./nlp_example.py) script, and any changes or modifications is denoted with a `# New Code #` comment. Read the README.md file located in the `by_feature` folder for more information. ### `complete_*` examples These two scripts contain *every* single feature currently available in Accelerate in one place, as one giant script. New arguments that can be passed include: - `checkpointing_steps`, whether the various states should be saved at the end of every `n` steps, or `"epoch"` for each epoch. States are then saved to folders named `step_{n}` or `epoch_{n}` - `resume_from_checkpoint`, should be used if you want to resume training off of a previous call to the script and passed a `checkpointing_steps` to it. - `with_tracking`, should be used if you want to log the training run using all available experiment trackers in your environment. Currently supported trackers include TensorBoard, Weights and Biases, and CometML. accelerate-1.14.0/examples/alst_ulysses_sequence_parallelism/000077500000000000000000000000001521253476100245205ustar00rootroot00000000000000accelerate-1.14.0/examples/alst_ulysses_sequence_parallelism/README.md000066400000000000000000000015041521253476100257770ustar00rootroot00000000000000# Deepspeed's ALST/Ulysses sequence parallelism This is an example of the use of Ulysses Sequence Parallelism, which uses attention head parallelism and is part of the Arctic Long Sequence Training project at [ArcticTraining](https://github.com/snowflakedb/ArcticTraining). [This paper](https://arxiv.org/abs/2506.13996) goes into the details of this protocol. For nuances of usage please refer to the main HF Accelerate tutorial on [Context Parallelism](https://huggingface.co/docs/accelerate/en/concept_guides/context_parallelism). You need to use at least `2` gpus to enable ALST/Ulysses sequence parallelism. To run the example with `4` gpus: ```bash bash ./sp-alst.sh ``` Change `4` to the desired sequence parallelism degree in these 2 files: ``` sp-alst.accelerate-config.yml:num_processes: 4 sp-alst.py: sp_size=4, ``` accelerate-1.14.0/examples/alst_ulysses_sequence_parallelism/sp-alst.accelerate-config.yml000066400000000000000000000004361521253476100321630ustar00rootroot00000000000000compute_environment: LOCAL_MACHINE deepspeed_config: deepspeed_config_file: sp-alst.ds-config.json zero3_init_flag: false distributed_type: DEEPSPEED machine_rank: 0 main_training_function: main num_machines: 1 num_processes: 4 rdzv_backend: static same_network: true use_cpu: falseaccelerate-1.14.0/examples/alst_ulysses_sequence_parallelism/sp-alst.ds-config.json000066400000000000000000000004141521253476100306450ustar00rootroot00000000000000{ "bf16": { "enabled": true }, "zero_optimization": { "stage": 3 }, "gradient_accumulation_steps": 1, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "seq_parallel_communication_data_type": "bf16" }accelerate-1.14.0/examples/alst_ulysses_sequence_parallelism/sp-alst.py000066400000000000000000000124031521253476100264550ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import torch from deepspeed.runtime.utils import move_to_device from transformers import AutoModelForCausalLM, AutoTokenizer from accelerate import Accelerator from accelerate.utils import ParallelismConfig, set_seed from accelerate.utils.dataclasses import DeepSpeedSequenceParallelConfig set_seed(42) model_name = "TinyLlama/TinyLlama-1.1B-Chat-v1.0" # to run the example faster switch to the random model # model_name = "hf-internal-testing/tiny-random-LlamaForCausalLM" micro_batch_size = 1 parallelism_config = ParallelismConfig( sp_backend="deepspeed", sp_size=4, sp_handler=DeepSpeedSequenceParallelConfig( sp_seq_length=256, sp_seq_length_is_variable=True, sp_attn_implementation="sdpa", ), ) accelerator = Accelerator( parallelism_config=parallelism_config, # log_with="wandb", # enable to log into wandb ) accelerator.init_trackers( project_name="ulysses-accelerate", config={}, init_kwargs={"wandb": dict(entity="yak", name="deepspeed")}, ) tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained(model_name) # 2 quick rough datasets to demonstrate the workings if 1: # real dataset from datasets import load_dataset ds = load_dataset("HuggingFaceH4/ultrachat_200k", split="train_sft[:12]") # this is a quick example, it should be made more efficient to be used in real application def convert(ex): texts = tokenizer.apply_chat_template(conversation=ex["messages"], tokenize=False) tokenized_dict = tokenizer(texts, max_length=256, padding=True, truncation=True) return tokenized_dict ds = ds.map(convert, batched=False, remove_columns=["prompt", "prompt_id", "messages"]) def collate_fn(batch): input_ids = torch.tensor(batch[0]["input_ids"]).unsqueeze(0) attention_mask = torch.tensor(batch[0]["attention_mask"]).unsqueeze(0) position_ids = torch.arange(input_ids.shape[1]).unsqueeze(0) return dict( input_ids=input_ids, position_ids=position_ids, labels=input_ids, attention_mask=attention_mask, ) dl = torch.utils.data.DataLoader( ds, batch_size=micro_batch_size, collate_fn=collate_fn, drop_last=True, shuffle=False ) else: # fake dataset samples = 16 seqlen = 256 input_ids = torch.arange(1, seqlen * samples + 1).view(-1, seqlen) + 100 position_ids = torch.arange(seqlen * samples).view(-1, seqlen) ds = torch.utils.data.TensorDataset(input_ids, position_ids) def collate_fn(batch): input_ids, position_ids = batch[0] return dict( input_ids=input_ids.unsqueeze(0), position_ids=position_ids.unsqueeze(0), labels=input_ids.unsqueeze(0), ) dl = torch.utils.data.DataLoader(ds, batch_size=micro_batch_size, collate_fn=collate_fn) optimizer = torch.optim.Adam(model.parameters(), lr=1e-5) rank = torch.distributed.get_rank() if rank == 0: print(f"DL orig: {len(dl)} samples") model, optimizer, dl = accelerator.prepare(model, optimizer, dl) if rank == 0: print(f"DL w/ adapter: {len(dl)} samples") sp_size = parallelism_config.sp_size if parallelism_config else 1 if sp_size > 1: sp_group = accelerator.torch_device_mesh["sp"].get_group() sp_world_size = parallelism_config.sp_size unwrapped_model = accelerator.unwrap_model(model) # Normal training loop for iter, batch in enumerate(dl): optimizer.zero_grad() if rank == 0: print(f"batch {iter}: seqlen: {len(batch['input_ids'][0])}") batch = move_to_device(batch, model.device) # The model automatically receives shift_labels via **kwargs and uses it for loss computation. # Both standard transformer models and Liger-patched models handle this correctly. outputs = model(**batch) loss = outputs.loss if sp_size > 1: # differentiable weighted per-shard-loss aggregation across ranks losses_per_rank = torch.distributed.nn.functional.all_gather(loss, group=sp_group) # special dealing with SFT that has prompt tokens that aren't used in loss computation good_tokens = (batch["shift_labels"] != -100).view(-1).sum() good_tokens_per_rank = torch.distributed.nn.functional.all_gather(good_tokens, group=sp_group) total_loss = sum(losses_per_rank[rank] * good_tokens_per_rank[rank] for rank in range(sp_world_size)) total_good_tokens = sum(good_tokens_per_rank) loss = total_loss / max(total_good_tokens, 1) if rank == 0: accelerator.print(f"{iter}: {loss=}") accelerator.log(dict(train_loss=loss, step=iter)) accelerator.backward(loss) optimizer.step() accelerator.end_training() accelerate-1.14.0/examples/alst_ulysses_sequence_parallelism/sp-alst.sh000077500000000000000000000004721521253476100264450ustar00rootroot00000000000000export MASTER_ADDR=localhost export MASTER_PORT=9998 python -u -m accelerate.commands.launch \ --rdzv_conf "rdzv_backend=c10d,rdzv_endpoint=$MASTER_ADDR:$MASTER_PORT" \ --main_process_ip $MASTER_ADDR \ --main_process_port $MASTER_PORT \ --config_file sp-alst.accelerate-config.yml \ sp-alst.py accelerate-1.14.0/examples/by_feature/000077500000000000000000000000001521253476100176365ustar00rootroot00000000000000accelerate-1.14.0/examples/by_feature/README.md000066400000000000000000000136731521253476100211270ustar00rootroot00000000000000# What are these scripts? All scripts in this folder originate from the `nlp_example.py` file, as it is a very simplistic NLP training example using Accelerate with zero extra features. From there, each further script adds in just **one** feature of Accelerate, showing how you can quickly modify your own scripts to implement these capabilities. A full example with all of these parts integrated together can be found in the `complete_nlp_example.py` script and `complete_cv_example.py` script. Adjustments to each script from the base `nlp_example.py` file can be found quickly by searching for "# New Code #" ## Example Scripts by Feature and their Arguments ### Base Example (`../nlp_example.py`) - Shows how to use `Accelerator` in an extremely simplistic PyTorch training loop - Arguments available: - `mixed_precision`, whether to use mixed precision. ("no", "fp16", or "bf16") - `cpu`, whether to train using only the CPU. (yes/no/1/0) All following scripts also accept these arguments in addition to their added ones. These arguments should be added at the end of any method for starting the python script (such as `python`, `accelerate launch`, `python -m torch.distributed.run`), such as: ```bash accelerate launch ../nlp_example.py --mixed_precision fp16 --cpu 0 ``` ### Checkpointing and Resuming Training (`checkpointing.py`) - Shows how to use `Accelerator.save_state` and `Accelerator.load_state` to save or continue training - **It is assumed you are continuing off the same training script** - Arguments available: - `checkpointing_steps`, after how many steps the various states should be saved. ("epoch", 1, 2, ...) - `output_dir`, where saved state folders should be saved to, default is current working directory - `resume_from_checkpoint`, what checkpoint folder to resume from. ("epoch_0", "step_22", ...) These arguments should be added at the end of any method for starting the python script (such as `python`, `accelerate launch`, `python -m torchrun`), such as: (Note, `resume_from_checkpoint` assumes that we've ran the script for one epoch with the `--checkpointing_steps epoch` flag) ```bash accelerate launch ./checkpointing.py --checkpointing_steps epoch output_dir "checkpointing_tutorial" --resume_from_checkpoint "checkpointing_tutorial/epoch_0" ``` ### Cross Validation (`cross_validation.py`) - Shows how to use `Accelerator.free_memory` and run cross validation efficiently with `datasets`. - Arguments available: - `num_folds`, the number of folds the training dataset should be split into. These arguments should be added at the end of any method for starting the python script (such as `python`, `accelerate launch`, `python -m torchrun`), such as: ```bash accelerate launch ./cross_validation.py --num_folds 2 ``` ### Experiment Tracking (`tracking.py`) - Shows how to use `Accelerate.init_trackers` and `Accelerator.log` - Can be used with Weights and Biases, TensorBoard, or CometML. - Arguments available: - `with_tracking`, whether to load in all available experiment trackers from the environment. These arguments should be added at the end of any method for starting the python script (such as `python`, `accelerate launch`, `python -m torchrun`), such as: ```bash accelerate launch ./tracking.py --with_tracking ``` ### Gradient Accumulation (`gradient_accumulation.py`) - Shows how to use `Accelerator.no_sync` to prevent gradient averaging in a distributed setup. - Arguments available: - `gradient_accumulation_steps`, the number of steps to perform before the gradients are accumulated and the optimizer and scheduler are stepped + zero_grad These arguments should be added at the end of any method for starting the python script (such as `python`, `accelerate launch`, `python -m torchrun`), such as: ```bash accelerate launch ./gradient_accumulation.py --gradient_accumulation_steps 5 ``` ### LocalSGD (`local_sgd.py`) - Shows how to use `Accelerator.no_sync` to prevent gradient averaging in a distributed setup. However, unlike gradient accumulation, this method does not change the effective batch size. Local SGD can be combined with gradient accumulation. These arguments should be added at the end of any method for starting the python script (such as `python`, `accelerate launch`, `python -m torchrun`), such as: ```bash accelerate launch ./local_sgd.py --local_sgd_steps 4 ``` ### DDP Communication Hook (`ddp_comm_hook.py`) - Shows how to use DDP Communication Hooks to control and optimize gradient communication across workers in a DistributedDataParallel setup. - Arguments available: - `ddp_comm_hook`, the type of DDP communication hook to use. Choose between `no`, `fp16`, `bf16`, `power_sgd`, and `batched_power_sgd`. These arguments should be added at the end of any method for starting the python script (such as `accelerate launch`, `python -m torch.distributed.run`), such as: ```bash accelerate launch ./ddp_comm_hook.py --mixed_precision fp16 --ddp_comm_hook power_sgd ``` ### Profiler (`profiler.py`) - Shows how to use the profiling capabilities of `Accelerate` to profile PyTorch models during training. - Uses the `ProfileKwargs` handler to customize profiling options, including activities, scheduling, and additional profiling options. - Can generate and save profiling traces in JSON format for visualization in Chrome's tracing tool. Arguments available: - `--record_shapes`: If passed, records shapes for profiling. - `--profile_memory`: If passed, profiles memory usage. - `--with_stack`: If passed, profiles stack traces. - `--with_flops`: If passed, profiles floating point operations (FLOPS). - `--output_trace_dir`: If specified, saves the profiling trace to the given dir in JSON format. - `--cpu`: If passed, trains on the CPU instead of GPU. These arguments should be added at the end of any method for starting the Python script (such as `python`, `accelerate launch`, `python -m torchrun`), such as: ```bash accelerate launch ./profiler.py --record_shapes --profile_memory --with_flops --output_trace_dir "profiler" ``` accelerate-1.14.0/examples/by_feature/automatic_gradient_accumulation.py000066400000000000000000000233551521253476100266270ustar00rootroot00000000000000# Copyright 2022 The HuggingFace Team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os # New Code # import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator from accelerate.utils import find_executable_batch_size ######################################################################## # This is a fully working simple example to use Accelerate, # specifically showcasing how to combine both the gradient accumulation # and automatic batch size finder utilities of Accelerate to perfrom # automatic gradient accumulation # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # New additions from the base script can be found quickly by # looking for the # New Code # tags # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 # Initialize accelerator accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) observed_batch_size = int(config["batch_size"]) metric = evaluate.load("glue", "mrpc") # New Code # # We use the `find_executable_batch_size` decorator, passing in the desired observed batch size # to train on. If a device OOM error occurs, it will retry this loop cutting the batch size in # half each time. From this, we can calculate the number of gradient accumulation steps needed # and modify the Accelerator object as a result @find_executable_batch_size(starting_batch_size=int(observed_batch_size)) def inner_training_loop(batch_size): # Since we need to modify the outside accelerator object, we need to bring it # to the local scope nonlocal accelerator # We can calculate the number of gradient accumulation steps based on the current # batch size vs the starting batch size num_gradient_accumulation_steps = observed_batch_size // batch_size # And then set it in the Accelerator directly: accelerator.gradient_accumulation_steps = num_gradient_accumulation_steps # Next we need to free all of the stored model references in the Accelerator each time accelerator.free_memory() # And set the seed so our results are reproducable each reset set_seed(seed) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs), ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now we train the model for epoch in range(num_epochs): model.train() for step, batch in enumerate(train_dataloader): # And perform gradient accumulation with accelerator.accumulate(model): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) # New Code # # And call it at the end with no arguments # Note: You could also refactor this outside of your training loop function inner_training_loop() accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") args = parser.parse_args() # New Code # # We modify the starting batch size to be an observed batch size of 256, to guarantee an initial device OOM config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 256} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/checkpointing.py000066400000000000000000000333341521253476100230430ustar00rootroot00000000000000# Copyright 2021 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup from accelerate import Accelerator, DataLoaderConfiguration, DistributedType from accelerate.utils import set_seed ######################################################################## # This is a fully working simple example to use Accelerate, # specifically showcasing the checkpointing capability, # and builds off the `nlp_example.py` script. # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To help focus on the differences in the code, building `DataLoaders` # was refactored into its own function. # New additions from the base script can be found quickly by # looking for the # New Code # tags # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 # Initialize accelerator dataloader_config = DataLoaderConfiguration(use_stateful_dataloader=args.use_stateful_dataloader) accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision, dataloader_config=dataloader_config) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) # New Code # # Parse out whether we are saving every epoch or after a certain number of batches if hasattr(args.checkpointing_steps, "isdigit"): if args.checkpointing_steps == "epoch": checkpointing_steps = args.checkpointing_steps elif args.checkpointing_steps.isdigit(): checkpointing_steps = int(args.checkpointing_steps) else: raise ValueError( f"Argument `checkpointing_steps` must be either a number or `epoch`. `{args.checkpointing_steps}` passed." ) else: checkpointing_steps = None set_seed(seed) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) metric = evaluate.load("glue", "mrpc") # If the batch size is too big we use gradient accumulation gradient_accumulation_steps = 1 if batch_size > MAX_GPU_BATCH_SIZE and accelerator.distributed_type != DistributedType.XLA: gradient_accumulation_steps = batch_size // MAX_GPU_BATCH_SIZE batch_size = MAX_GPU_BATCH_SIZE # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs) // gradient_accumulation_steps, ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # New Code # # We need to keep track of how many total steps we have iterated over overall_step = 0 # We also need to keep track of the stating epoch so files are named properly starting_epoch = 0 # We need to load the checkpoint back in before training here with `load_state` # The total number of epochs is adjusted based on where the state is being loaded from, # as we assume continuation of the same training script if args.resume_from_checkpoint: if args.resume_from_checkpoint is not None or args.resume_from_checkpoint != "": accelerator.print(f"Resumed from checkpoint: {args.resume_from_checkpoint}") accelerator.load_state(args.resume_from_checkpoint) path = os.path.basename(args.resume_from_checkpoint) else: # Get the most recent checkpoint dirs = [f.name for f in os.scandir(os.getcwd()) if f.is_dir()] dirs.sort(key=os.path.getctime) path = dirs[-1] # Sorts folders by date modified, most recent checkpoint is the last # Extract `epoch_{i}` or `step_{i}` training_difference = os.path.splitext(path)[0] if "epoch" in training_difference: starting_epoch = int(training_difference.replace("epoch_", "")) + 1 resume_step = None else: resume_step = int(training_difference.replace("step_", "")) starting_epoch = resume_step // len(train_dataloader) resume_step -= starting_epoch * len(train_dataloader) # Now we train the model for epoch in range(starting_epoch, num_epochs): model.train() # New Code # if args.resume_from_checkpoint and epoch == starting_epoch and resume_step is not None: # We need to skip steps until we reach the resumed step only if we are not using a stateful dataloader if not args.use_stateful_dataloader: active_dataloader = accelerator.skip_first_batches(train_dataloader, resume_step) else: active_dataloader = train_dataloader overall_step += resume_step else: # After the first iteration though, we need to go back to the original dataloader active_dataloader = train_dataloader for step, batch in enumerate(active_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) outputs = model(**batch) loss = outputs.loss loss = loss / gradient_accumulation_steps accelerator.backward(loss) if step % gradient_accumulation_steps == 0: optimizer.step() lr_scheduler.step() optimizer.zero_grad() # New Code # overall_step += 1 # New Code # # We save the model, optimizer, lr_scheduler, and seed states by calling `save_state` # These are saved to folders named `step_{overall_step}` # Will contain files: "pytorch_model.bin", "optimizer.bin", "scheduler.bin", and "random_states.pkl" # If mixed precision was used, will also save a "scalar.bin" file if isinstance(checkpointing_steps, int): output_dir = f"step_{overall_step}" if overall_step % checkpointing_steps == 0: if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True` (the default). batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) # New Code # # We save the model, optimizer, lr_scheduler, and seed states by calling `save_state` # These are saved to folders named `epoch_{epoch}` # Will contain files: "pytorch_model.bin", "optimizer.bin", "scheduler.bin", and "random_states.pkl" # If mixed precision was used, will also save a "scalar.bin" file if checkpointing_steps == "epoch": output_dir = f"epoch_{epoch}" if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") parser.add_argument( "--checkpointing_steps", type=str, default=None, help="Whether the various states should be saved at the end of every n steps, or 'epoch' for each epoch.", ) parser.add_argument( "--output_dir", type=str, default=".", help="Optional save directory where all checkpoint folders will be stored. Default is the current working directory.", ) parser.add_argument( "--resume_from_checkpoint", type=str, default=None, help="If the training should continue from a checkpoint folder.", ) parser.add_argument( "--use_stateful_dataloader", action="store_true", help="If the dataloader should be a resumable stateful dataloader.", ) args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/cross_validation.py000066400000000000000000000264641521253476100235670ustar00rootroot00000000000000# Copyright 2022 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import evaluate import numpy as np import torch from datasets import DatasetDict, load_dataset # New Code # # We'll be using StratifiedKFold for this example from sklearn.model_selection import StratifiedKFold from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator, DistributedType ######################################################################## # This is a fully working simple example to use Accelerate, # specifically showcasing how to perform Cross Validation, # and builds off the `nlp_example.py` script. # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To help focus on the differences in the code, building `DataLoaders` # was refactored into its own function. # New additions from the base script can be found quickly by # looking for the # New Code # tags # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 # New Code # # We need a different `get_dataloaders` function that will build dataloaders by index def get_fold_dataloaders( accelerator: Accelerator, dataset: DatasetDict, train_idxs: list[int], valid_idxs: list[int], batch_size: int = 16 ): """ Gets a set of train, valid, and test dataloaders for a particular fold Args: accelerator (`Accelerator`): The main `Accelerator` object train_idxs (list of `int`): The split indices for the training dataset valid_idxs (list of `int`): The split indices for the validation dataset batch_size (`int`): The size of the minibatch. Default is 16 """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = DatasetDict( { "train": dataset["train"].select(train_idxs), "validation": dataset["train"].select(valid_idxs), "test": dataset["validation"], } ) def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) test_dataloader = DataLoader( tokenized_datasets["test"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader, test_dataloader def training_function(config, args): # New Code # test_predictions = [] # Download the dataset datasets = load_dataset("nyu-mll/glue", "mrpc") # Create our splits kfold = StratifiedKFold(n_splits=int(args.num_folds)) # Initialize accelerator accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) metric = evaluate.load("glue", "mrpc") # If the batch size is too big we use gradient accumulation gradient_accumulation_steps = 1 if batch_size > MAX_GPU_BATCH_SIZE and accelerator.distributed_type != DistributedType.XLA: gradient_accumulation_steps = batch_size // MAX_GPU_BATCH_SIZE batch_size = MAX_GPU_BATCH_SIZE set_seed(seed) # New Code # # Create our folds: folds = kfold.split(np.zeros(datasets["train"].num_rows), datasets["train"]["label"]) test_references = [] # Iterate over them for i, (train_idxs, valid_idxs) in enumerate(folds): train_dataloader, eval_dataloader, test_dataloader = get_fold_dataloaders( accelerator, datasets, train_idxs, valid_idxs, ) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs) // gradient_accumulation_steps, ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now we train the model for epoch in range(num_epochs): model.train() for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) outputs = model(**batch) loss = outputs.loss loss = loss / gradient_accumulation_steps accelerator.backward(loss) if step % gradient_accumulation_steps == 0: optimizer.step() lr_scheduler.step() optimizer.zero_grad() model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) # New Code # # We also run predictions on the test set at the very end fold_predictions = [] for step, batch in enumerate(test_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) fold_predictions.append(predictions.cpu()) if i == 0: # We need all of the test predictions test_references.append(references.cpu()) # Use accelerator.print to print only on the main process. test_predictions.append(torch.cat(fold_predictions, dim=0)) # We now need to release all our memory and get rid of the current model, optimizer, etc model, optimizer = accelerator.free_memory(model, optimizer) # New Code # # Finally we check the accuracy of our folded results: test_references = torch.cat(test_references, dim=0) preds = torch.stack(test_predictions, dim=0).sum(dim=0).div(int(args.num_folds)).argmax(dim=-1) test_metric = metric.compute(predictions=preds, references=test_references) accelerator.print("Average test metrics from all folds:", test_metric) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") # New Code # parser.add_argument("--num_folds", type=int, default=3, help="The number of splits to perform across the dataset") args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/ddp_comm_hook.py000066400000000000000000000217601521253476100230200ustar00rootroot00000000000000# Copyright 2021 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator, DistributedType from accelerate.utils import DDPCommunicationHookType, DistributedDataParallelKwargs ######################################################################## # This is a fully working simple example to use Accelerate # and perform ddp communication hook # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 # New Code # ddp_comm_hook_type = DDPCommunicationHookType(args.ddp_comm_hook) ddp_comm_wrapper = DDPCommunicationHookType(args.ddp_comm_wrapper) ddp_kwargs = DistributedDataParallelKwargs(comm_hook=ddp_comm_hook_type, comm_wrapper=ddp_comm_wrapper) # Initialize accelerator accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision, kwargs_handlers=[ddp_kwargs]) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) metric = evaluate.load("glue", "mrpc") set_seed(seed) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs), ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now we train the model for epoch in range(num_epochs): model.train() for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) # We use the new `accumulate` context manager to perform gradient accumulation with accelerator.accumulate(model): output = model(**batch) loss = output.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) # New Code # parser.add_argument( "--ddp_comm_hook", type=str, default="no", choices=["no", "fp16", "bf16", "power_sgd", "batched_power_sgd"], help="DDP Communication hook to use. Choose between `no`, `fp16`, `bf16`, `power_sgd`, and `batched_power_sgd`.", ) # New Code # parser.add_argument( "--ddp_comm_wrapper", type=str, default="no", choices=["no", "fp16", "bf16"], help="DDP Communication wrapper to use. Choose between `no`, `fp16`, and `bf16`.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/deepspeed_with_config_support.py000077500000000000000000000736551521253476100263450ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2022 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Fine-tuning the library models for causal language modeling (GPT, GPT-2, CTRL, ...) on a text file or a dataset without using HuggingFace Trainer. Here is the full list of checkpoints on the hub that can be fine-tuned by this script: https://huggingface.co/models?filter=text-generation """ # You can also adapt this script on your own causal language modeling task. Pointers for this are left as comments. import argparse import json import logging import math import os import random from itertools import chain from pathlib import Path import datasets import torch import transformers from datasets import load_dataset from huggingface_hub import HfApi from torch.utils.data import DataLoader from tqdm.auto import tqdm from transformers import ( CONFIG_MAPPING, MODEL_MAPPING, AutoConfig, AutoModelForCausalLM, AutoTokenizer, SchedulerType, default_data_collator, get_scheduler, ) from transformers.utils.versions import require_version from accelerate import Accelerator, DistributedType from accelerate.logging import get_logger from accelerate.utils import DummyOptim, DummyScheduler, set_seed logger = get_logger(__name__) require_version("datasets>=1.8.0", "To fix: pip install -r examples/pytorch/language-modeling/requirements.txt") MODEL_CONFIG_CLASSES = list(MODEL_MAPPING.keys()) MODEL_TYPES = tuple(conf.model_type for conf in MODEL_CONFIG_CLASSES) def parse_args(): parser = argparse.ArgumentParser(description="Finetune a transformers model on a causal language modeling task") parser.add_argument( "--dataset_name", type=str, default=None, help="The name of the dataset to use (via the datasets library).", ) parser.add_argument( "--dataset_config_name", type=str, default=None, help="The configuration name of the dataset to use (via the datasets library).", ) parser.add_argument( "--train_file", type=str, default=None, help="A csv or a json file containing the training data." ) parser.add_argument( "--validation_file", type=str, default=None, help="A csv or a json file containing the validation data." ) parser.add_argument( "--validation_split_percentage", default=5, help="The percentage of the train set used as validation set in case there's no validation split", ) parser.add_argument( "--model_name_or_path", type=str, help="Path to pretrained model or model identifier from huggingface.co/models.", required=False, ) parser.add_argument( "--config_name", type=str, default=None, help="Pretrained config name or path if not the same as model_name", ) parser.add_argument( "--tokenizer_name", type=str, default=None, help="Pretrained tokenizer name or path if not the same as model_name", ) parser.add_argument( "--use_slow_tokenizer", action="store_true", help="If passed, will use a slow tokenizer (not backed by the 🤗 Tokenizers library).", ) parser.add_argument( "--per_device_train_batch_size", type=int, default=8, help="Batch size (per device) for the training dataloader.", ) parser.add_argument( "--per_device_eval_batch_size", type=int, default=8, help="Batch size (per device) for the evaluation dataloader.", ) parser.add_argument( "--learning_rate", type=float, default=5e-5, help="Initial learning rate (after the potential warmup period) to use.", ) parser.add_argument("--weight_decay", type=float, default=0.0, help="Weight decay to use.") parser.add_argument("--num_train_epochs", type=int, default=3, help="Total number of training epochs to perform.") parser.add_argument( "--max_train_steps", type=int, default=None, help="Total number of training steps to perform. If provided, overrides num_train_epochs.", ) parser.add_argument( "--gradient_accumulation_steps", type=int, default=1, help="Number of updates steps to accumulate before performing a backward/update pass.", ) parser.add_argument( "--lr_scheduler_type", type=SchedulerType, default="linear", help="The scheduler type to use.", choices=["linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup"], ) parser.add_argument( "--num_warmup_steps", type=int, default=0, help="Number of steps for the warmup in the lr scheduler." ) parser.add_argument("--output_dir", type=str, default=None, help="Where to store the final model.") parser.add_argument("--seed", type=int, default=None, help="A seed for reproducible training.") parser.add_argument( "--model_type", type=str, default=None, help="Model type to use if training from scratch.", choices=MODEL_TYPES, ) parser.add_argument( "--block_size", type=int, default=None, help=( "Optional input sequence length after tokenization. The training dataset will be truncated in block of" " this size for training. Default to the model max input length for single sentence inputs (take into" " account special tokens)." ), ) parser.add_argument( "--preprocessing_num_workers", type=int, default=None, help="The number of processes to use for the preprocessing.", ) parser.add_argument( "--overwrite_cache", type=bool, default=False, help="Overwrite the cached training and evaluation sets" ) parser.add_argument( "--no_keep_linebreaks", action="store_true", help="Do not keep line breaks when using TXT files." ) parser.add_argument("--push_to_hub", action="store_true", help="Whether or not to push the model to the Hub.") parser.add_argument( "--hub_model_id", type=str, help="The name of the repository to keep in sync with the local `output_dir`." ) parser.add_argument("--hub_token", type=str, help="The token to use to push to the Model Hub.") parser.add_argument( "--checkpointing_steps", type=str, default=None, help="Whether the various states should be saved at the end of every n steps, or 'epoch' for each epoch.", ) parser.add_argument( "--resume_from_checkpoint", type=str, default=None, help="If the training should continue from a checkpoint folder.", ) # New Code # # Whether to load the best model at the end of training parser.add_argument( "--load_best_model", action="store_true", help="Whether to load the best model at the end of training", ) parser.add_argument( "--with_tracking", action="store_true", help="Whether to enable experiment trackers for logging.", ) parser.add_argument( "--report_to", type=str, default="all", help=( 'The integration to report the results and logs to. Supported platforms are `"tensorboard"`,' ' `"wandb"`, `"comet_ml"`, `"dvclive"`, and `"swanlab"`. Use `"all"` (default) to report to all integrations.' "Only applicable when `--with_tracking` is passed." ), ) args = parser.parse_args() # Sanity checks if args.dataset_name is None and args.train_file is None and args.validation_file is None: raise ValueError("Need either a dataset name or a training/validation file.") else: if args.train_file is not None: extension = args.train_file.split(".")[-1] assert extension in ["csv", "json", "txt"], "`train_file` should be a csv, json or txt file." if args.validation_file is not None: extension = args.validation_file.split(".")[-1] assert extension in ["csv", "json", "txt"], "`validation_file` should be a csv, json or txt file." if args.push_to_hub: assert args.output_dir is not None, "Need an `output_dir` to create a repo when `--push_to_hub` is passed." return args # New Code # def evaluate(args, model, eval_dataloader, accelerator, eval_dataset): model.eval() losses = [] for step, batch in enumerate(eval_dataloader): with torch.no_grad(): outputs = model(**batch) loss = outputs.loss losses.append(accelerator.gather_for_metrics(loss.repeat(args.per_device_eval_batch_size))) losses = torch.cat(losses) try: eval_loss = torch.mean(losses) perplexity = math.exp(eval_loss) except OverflowError: perplexity = float("inf") return perplexity, eval_loss def main(): args = parse_args() # Initialize the accelerator. We will let the accelerator handle device placement for us in this example. # If we're using tracking, we also need to initialize it here and it will by default pick up all supported trackers # in the environment # when using DeepSpeed, the `gradient_accumulation_steps` is properly set from the DeepSpeed plugin/config # or from `accelerate launch` via `--gradient_accumulation_steps` else # defaulting to the passed `args.gradient_accumulation_steps` accelerator = ( Accelerator( log_with=args.report_to, project_dir=args.output_dir, gradient_accumulation_steps=args.gradient_accumulation_steps, ) if args.with_tracking else Accelerator(gradient_accumulation_steps=args.gradient_accumulation_steps) ) # Make one log on every process with the configuration for debugging. logging.basicConfig( format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", datefmt="%m/%d/%Y %H:%M:%S", level=logging.INFO, ) logger.info(accelerator.state, main_process_only=False) if accelerator.is_local_main_process: datasets.utils.logging.set_verbosity_warning() transformers.utils.logging.set_verbosity_info() else: datasets.utils.logging.set_verbosity_error() transformers.utils.logging.set_verbosity_error() # If passed along, set the training seed now. if args.seed is not None: set_seed(args.seed) # Handle the repository creation if accelerator.is_main_process: if args.push_to_hub: api = HfApi(token=args.hub_token) # Create repo (repo_name from args or inferred) repo_name = args.hub_model_id if repo_name is None: repo_name = Path(args.output_dir).absolute().name repo_id = api.create_repo(repo_name, exist_ok=True).repo_id with open(os.path.join(args.output_dir, ".gitignore"), "w+") as gitignore: if "step_*" not in gitignore: gitignore.write("step_*\n") if "epoch_*" not in gitignore: gitignore.write("epoch_*\n") elif args.output_dir is not None: os.makedirs(args.output_dir, exist_ok=True) accelerator.wait_for_everyone() # Get the datasets: you can either provide your own CSV/JSON/TXT training and evaluation files (see below) # or just provide the name of one of the public datasets available on the hub at https://huggingface.co/datasets/ # (the dataset will be downloaded automatically from the datasets Hub). # # For CSV/JSON files, this script will use the column called 'text' or the first column if no column called # 'text' is found. You can easily tweak this behavior (see below). # # In distributed training, the load_dataset function guarantee that only one local process can concurrently # download the dataset. if args.dataset_name is not None: # Downloading and loading a dataset from the hub. raw_datasets = load_dataset(args.dataset_name, args.dataset_config_name) if "validation" not in raw_datasets.keys(): raw_datasets["validation"] = load_dataset( args.dataset_name, args.dataset_config_name, split=f"train[:{args.validation_split_percentage}%]", ) raw_datasets["train"] = load_dataset( args.dataset_name, args.dataset_config_name, split=f"train[{args.validation_split_percentage}%:]", ) else: data_files = {} dataset_args = {} if args.train_file is not None: data_files["train"] = args.train_file if args.validation_file is not None: data_files["validation"] = args.validation_file extension = args.train_file.split(".")[-1] if extension == "txt": extension = "text" dataset_args["keep_linebreaks"] = not args.no_keep_linebreaks raw_datasets = load_dataset(extension, data_files=data_files, **dataset_args) # If no validation data is there, validation_split_percentage will be used to divide the dataset. if "validation" not in raw_datasets.keys(): raw_datasets["validation"] = load_dataset( extension, data_files=data_files, split=f"train[:{args.validation_split_percentage}%]", **dataset_args, ) raw_datasets["train"] = load_dataset( extension, data_files=data_files, split=f"train[{args.validation_split_percentage}%:]", **dataset_args, ) # See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at # https://huggingface.co/docs/datasets/loading_datasets.html. # Load pretrained model and tokenizer # # In distributed training, the .from_pretrained methods guarantee that only one local process can concurrently # download model & vocab. if args.config_name: config = AutoConfig.from_pretrained(args.config_name) elif args.model_name_or_path: config = AutoConfig.from_pretrained(args.model_name_or_path) else: config = CONFIG_MAPPING[args.model_type]() logger.warning("You are instantiating a new config instance from scratch.") if args.tokenizer_name: tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_name, use_fast=not args.use_slow_tokenizer) elif args.model_name_or_path: tokenizer = AutoTokenizer.from_pretrained(args.model_name_or_path, use_fast=not args.use_slow_tokenizer) else: raise ValueError( "You are instantiating a new tokenizer from scratch. This is not supported by this script." "You can do it from another script, save it, and load it from here, using --tokenizer_name." ) if args.model_name_or_path: model = AutoModelForCausalLM.from_pretrained( args.model_name_or_path, from_tf=bool(".ckpt" in args.model_name_or_path), config=config, ) else: logger.info("Training new model from scratch") model = AutoModelForCausalLM.from_config(config) model.resize_token_embeddings(len(tokenizer)) # Preprocessing the datasets. # First we tokenize all the texts. column_names = raw_datasets["train"].column_names text_column_name = "text" if "text" in column_names else column_names[0] def tokenize_function(examples): return tokenizer(examples[text_column_name]) with accelerator.main_process_first(): tokenized_datasets = raw_datasets.map( tokenize_function, batched=True, num_proc=args.preprocessing_num_workers, remove_columns=column_names, load_from_cache_file=not args.overwrite_cache, desc="Running tokenizer on dataset", ) if args.block_size is None: block_size = tokenizer.model_max_length if block_size > 1024: logger.warning( f"The tokenizer picked seems to have a very large `model_max_length` ({tokenizer.model_max_length}). " "Picking 1024 instead. You can change that default value by passing --block_size xxx." ) block_size = 1024 else: if args.block_size > tokenizer.model_max_length: logger.warning( f"The block_size passed ({args.block_size}) is larger than the maximum length for the model" f"({tokenizer.model_max_length}). Using block_size={tokenizer.model_max_length}." ) block_size = min(args.block_size, tokenizer.model_max_length) # Main data processing function that will concatenate all texts from our dataset and generate chunks of block_size. def group_texts(examples): # Concatenate all texts. concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()} total_length = len(concatenated_examples[list(examples.keys())[0]]) # We drop the small remainder, we could add padding if the model supported it instead of this drop, you can # customize this part to your needs. if total_length >= block_size: total_length = (total_length // block_size) * block_size # Split by chunks of max_len. result = { k: [t[i : i + block_size] for i in range(0, total_length, block_size)] for k, t in concatenated_examples.items() } result["labels"] = result["input_ids"].copy() return result # Note that with `batched=True`, this map processes 1,000 texts together, so group_texts throws away a remainder # for each of those groups of 1,000 texts. You can adjust that batch_size here but a higher value might be slower # to preprocess. # # To speed up this part, we use multiprocessing. See the documentation of the map method for more information: # https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map with accelerator.main_process_first(): lm_datasets = tokenized_datasets.map( group_texts, batched=True, num_proc=args.preprocessing_num_workers, load_from_cache_file=not args.overwrite_cache, desc=f"Grouping texts in chunks of {block_size}", ) train_dataset = lm_datasets["train"] eval_dataset = lm_datasets["validation"] # Log a few random samples from the training set: for index in random.sample(range(len(train_dataset)), 3): logger.info(f"Sample {index} of the training set: {train_dataset[index]}.") # DataLoaders creation: train_dataloader = DataLoader( train_dataset, shuffle=True, collate_fn=default_data_collator, batch_size=args.per_device_train_batch_size ) eval_dataloader = DataLoader( eval_dataset, collate_fn=default_data_collator, batch_size=args.per_device_eval_batch_size ) # Optimizer # Split weights in two groups, one with weight decay and the other not. no_decay = ["bias", "LayerNorm.weight"] optimizer_grouped_parameters = [ { "params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], "weight_decay": args.weight_decay, }, { "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], "weight_decay": 0.0, }, ] # New Code # # Creates Dummy Optimizer if `optimizer` was specified in the config file else creates Adam Optimizer optimizer_cls = ( torch.optim.AdamW if accelerator.state.deepspeed_plugin is None or "optimizer" not in accelerator.state.deepspeed_plugin.deepspeed_config else DummyOptim ) optimizer = optimizer_cls(optimizer_grouped_parameters, lr=args.learning_rate) # On TPU, the tie weights in our model have been disconnected, so we need to restore the ties. if accelerator.distributed_type == DistributedType.XLA: model.tie_weights() # Scheduler and math around the number of training steps. num_update_steps_per_epoch = math.ceil(len(train_dataloader) / accelerator.gradient_accumulation_steps) overrode_max_train_steps = False if args.max_train_steps is None: args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch overrode_max_train_steps = True else: args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch) # New Code # # Creates Dummy Scheduler if `scheduler` was specified in the config file else creates `args.lr_scheduler_type` Scheduler if ( accelerator.state.deepspeed_plugin is None or "scheduler" not in accelerator.state.deepspeed_plugin.deepspeed_config ): lr_scheduler = get_scheduler( name=args.lr_scheduler_type, optimizer=optimizer, num_warmup_steps=args.num_warmup_steps, num_training_steps=args.max_train_steps, ) else: lr_scheduler = DummyScheduler( optimizer, total_num_steps=args.max_train_steps, warmup_num_steps=args.num_warmup_steps ) # Prepare everything with our `accelerator`. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # We need to recalculate our total training steps as the size of the training dataloader may have changed. num_update_steps_per_epoch = math.ceil(len(train_dataloader) / accelerator.gradient_accumulation_steps) if overrode_max_train_steps: args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch # Afterwards we recalculate our number of training epochs args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch) # Figure out how many steps we should save the Accelerator states checkpointing_steps = args.checkpointing_steps if checkpointing_steps is not None and checkpointing_steps.isdigit(): checkpointing_steps = int(checkpointing_steps) # We need to initialize the trackers we use, and also store our configuration. # The trackers initializes automatically on the main process. if args.with_tracking: experiment_config = vars(args) # TensorBoard cannot log Enums, need the raw value experiment_config["lr_scheduler_type"] = experiment_config["lr_scheduler_type"].value accelerator.init_trackers("clm_no_trainer", experiment_config) # Train! total_batch_size = ( args.per_device_train_batch_size * accelerator.num_processes * accelerator.gradient_accumulation_steps ) logger.info("***** Running training *****") logger.info(f" Num examples = {len(train_dataset)}") logger.info(f" Num Epochs = {args.num_train_epochs}") logger.info(f" Instantaneous batch size per device = {args.per_device_train_batch_size}") logger.info(f" Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}") logger.info(f" Gradient Accumulation steps = {accelerator.gradient_accumulation_steps}") logger.info(f" Total optimization steps = {args.max_train_steps}") # Only show the progress bar once on each machine. progress_bar = tqdm(range(args.max_train_steps), disable=not accelerator.is_local_main_process) completed_steps = 0 starting_epoch = 0 best_metric = None best_metric_checkpoint = None # Potentially load in the weights and states from a previous save if args.resume_from_checkpoint: accelerator.load_state(args.resume_from_checkpoint) accelerator.print(f"Resumed from checkpoint: {args.resume_from_checkpoint}") path = os.path.basename(args.resume_from_checkpoint) training_difference = os.path.splitext(path)[0] if "epoch" in training_difference: starting_epoch = int(training_difference.replace("epoch_", "")) + 1 resume_step = None completed_steps = starting_epoch * num_update_steps_per_epoch else: resume_step = int(training_difference.replace("step_", "")) starting_epoch = resume_step // num_update_steps_per_epoch resume_step -= starting_epoch * num_update_steps_per_epoch completed_steps = resume_step # update progress bar if resumed from checkpoint progress_bar.update(completed_steps) for epoch in range(starting_epoch, args.num_train_epochs): model.train() if args.with_tracking: total_loss = 0 # skip new `skip_first_batches` to skip the batches when resuming from ckpt if args.resume_from_checkpoint and epoch == starting_epoch and resume_step is not None: # We need to skip steps until we reach the resumed step active_dataloader = accelerator.skip_first_batches(train_dataloader, resume_step) else: # After the first iteration though, we need to go back to the original dataloader active_dataloader = train_dataloader for step, batch in enumerate(active_dataloader): # In particular, DeepSpeed handles `gradient_accumulation` via `DeepSpeedEngine`. # Below, we use `accelerator.accumulate` if the user # wants to switch to other approaches such as plain DDP, PyTorch FSDP ... # This avoids having to change any code as things are all handled across different distributed setups. with accelerator.accumulate(model): outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() if accelerator.sync_gradients: progress_bar.update(1) completed_steps += 1 # We keep track of the loss at each epoch if args.with_tracking: step_loss = accelerator.reduce(loss.detach().clone()).item() total_loss += step_loss if isinstance(checkpointing_steps, int): if completed_steps % checkpointing_steps == 0: output_dir = f"step_{completed_steps}" if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) if completed_steps >= args.max_train_steps: break perplexity, eval_loss = evaluate(args, model, eval_dataloader, accelerator, eval_dataset) logger.info(f"epoch {epoch}: perplexity: {perplexity} eval_loss: {eval_loss}") if args.with_tracking: accelerator.log( { "perplexity": perplexity, "eval_loss": eval_loss, "train_loss": total_loss / len(train_dataloader), "epoch": epoch, "step": completed_steps, }, step=completed_steps, ) if isinstance(checkpointing_steps, str) and checkpointing_steps == "epoch": accelerator.save_state(os.path.join(args.output_dir, f"epoch_{epoch}")) # New Code # # Tracks the best checkpoint and best metric if best_metric is None or best_metric > perplexity: best_metric = perplexity best_metric_checkpoint = os.path.join(args.output_dir, "best_checkpoint") accelerator.save_state(best_metric_checkpoint) accelerator.print(f"New best metric: {best_metric} at epoch {epoch}") accelerator.print(f"best_metric_checkpoint: {best_metric_checkpoint}") # New Code # # Loads the best checkpoint after the training is finished if args.load_best_model: accelerator.load_state(best_metric_checkpoint) # New Code # # Evaluates using the best checkpoint perplexity, eval_loss = evaluate(args, model, eval_dataloader, accelerator, eval_dataset) logger.info(f"Best model metrics: perplexity: {perplexity} eval_loss: {eval_loss}") if perplexity != best_metric: raise AssertionError( f"Best metric {best_metric} does not match the metric {perplexity} of the loaded best model." ) if args.output_dir is not None: accelerator.wait_for_everyone() unwrapped_model = accelerator.unwrap_model(model) # New Code # # Saves the whole/unpartitioned fp16 model when in ZeRO Stage-3 to the output directory if # `stage3_gather_16bit_weights_on_model_save` is True in DeepSpeed Config file or # `zero3_save_16bit_model` is True in DeepSpeed Plugin. # For Zero Stages 1 and 2, models are saved as usual in the output directory. # The model name saved is `pytorch_model.bin` unwrapped_model.save_pretrained( args.output_dir, is_main_process=accelerator.is_main_process, save_function=accelerator.save, state_dict=accelerator.get_state_dict(model), ) if accelerator.is_main_process: tokenizer.save_pretrained(args.output_dir) if args.push_to_hub: api.upload_folder( repo_id=repo_id, folder_path=args.output_dir, commit_message="End of training", ) with open(os.path.join(args.output_dir, "all_results.json"), "w") as f: json.dump({"perplexity": perplexity, "eval_loss": eval_loss.item()}, f) accelerator.end_training() if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/early_stopping.py000066400000000000000000000221741521253476100232550ustar00rootroot00000000000000# Copyright 2021 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator, DistributedType ######################################################################## # This is a fully working simple example to use Accelerate # specifically showcasing how to perform early stopping, # and builds off the `nlp_example.py` script # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size, drop_last=True ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE, drop_last=(accelerator.mixed_precision == "fp8"), ) return train_dataloader, eval_dataloader # New code class EarlyStoppingCallback: "A callback class that helps with early stopping" def __init__(self, min_delta=0, patience=5): self.min_delta = min_delta self.patience = patience self.counter = 0 self.lowest_loss = float("inf") def check_early_stopping(self, eval_loss): delta = self.lowest_loss - eval_loss if delta >= self.min_delta: self.lowest_loss = eval_loss self.counter = 0 else: self.counter += 1 if self.counter >= self.patience: return True return False callback = EarlyStoppingCallback() def training_function(config, args): # Initialize accelerator accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) metric = evaluate.load("glue", "mrpc") # If the batch size is too big we use gradient accumulation gradient_accumulation_steps = 1 if batch_size > MAX_GPU_BATCH_SIZE and accelerator.distributed_type != DistributedType.XLA: gradient_accumulation_steps = batch_size // MAX_GPU_BATCH_SIZE batch_size = MAX_GPU_BATCH_SIZE set_seed(seed) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs) // gradient_accumulation_steps, ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now we train the model for epoch in range(num_epochs): model.train() for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) outputs = model(**batch) loss = outputs.loss loss = loss / gradient_accumulation_steps accelerator.backward(loss) if step % gradient_accumulation_steps == 0: optimizer.step() lr_scheduler.step() optimizer.zero_grad() # New code # Check if we should stop the training on any processes if callback.check_early_stopping(loss.item()): accelerator.set_trigger() # If so, we break the loop if accelerator.check_trigger(): break model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/fsdp_with_peak_mem_tracking.py000066400000000000000000000436751521253476100257360ustar00rootroot00000000000000# Copyright 2021 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import gc import os import threading import evaluate import psutil import torch from datasets import load_dataset from torch.distributed.fsdp.fully_sharded_data_parallel import FullOptimStateDictConfig, FullStateDictConfig from torch.utils.data import DataLoader from transformers import ( AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed, ) from accelerate import Accelerator, DistributedType, FullyShardedDataParallelPlugin from accelerate.utils import is_npu_available, is_xpu_available ######################################################################## # This is a fully working simple example to use Accelerate # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # - FSDP # # This example also demonstrates the checkpointing and sharding capabilities # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 # New Code # # Converting Bytes to Megabytes def b2mb(x): return int(x / 2**20) # New Code # # This context manager is used to track the peak memory usage of the process class TorchTracemalloc: def __enter__(self): gc.collect() if torch.cuda.is_available(): torch.cuda.empty_cache() torch.cuda.reset_max_memory_allocated() # reset the peak gauge to zero self.begin = torch.cuda.memory_allocated() elif is_xpu_available(): torch.xpu.empty_cache() torch.xpu.reset_max_memory_allocated() # reset the peak gauge to zero self.begin = torch.xpu.memory_allocated() elif is_npu_available(): torch.npu.empty_cache() torch.npu.reset_max_memory_allocated() # reset the peak gauge to zero self.begin = torch.npu.memory_allocated() self.process = psutil.Process() self.cpu_begin = self.cpu_mem_used() self.peak_monitoring = True peak_monitor_thread = threading.Thread(target=self.peak_monitor_func) peak_monitor_thread.daemon = True peak_monitor_thread.start() return self def cpu_mem_used(self): """get resident set size memory for the current process""" return self.process.memory_info().rss def peak_monitor_func(self): self.cpu_peak = -1 while True: self.cpu_peak = max(self.cpu_mem_used(), self.cpu_peak) # can't sleep or will not catch the peak right (this comment is here on purpose) # time.sleep(0.001) # 1msec if not self.peak_monitoring: break def __exit__(self, *exc): self.peak_monitoring = False gc.collect() if torch.cuda.is_available(): torch.cuda.empty_cache() self.end = torch.cuda.memory_allocated() self.peak = torch.cuda.max_memory_allocated() elif is_xpu_available(): torch.xpu.empty_cache() self.end = torch.xpu.memory_allocated() self.peak = torch.xpu.max_memory_allocated() elif is_npu_available(): torch.npu.empty_cache() self.end = torch.npu.memory_allocated() self.peak = torch.npu.max_memory_allocated() self.used = b2mb(self.end - self.begin) self.peaked = b2mb(self.peak - self.begin) self.cpu_end = self.cpu_mem_used() self.cpu_used = b2mb(self.cpu_end - self.cpu_begin) self.cpu_peaked = b2mb(self.cpu_peak - self.cpu_begin) # print(f"delta used/peak {self.used:4d}/{self.peaked:4d}") # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 # New Code # # Pass the advanced FSDP settings not part of the accelerate config by creating fsdp_plugin fsdp_plugin = FullyShardedDataParallelPlugin( state_dict_config=FullStateDictConfig(offload_to_cpu=False, rank0_only=False), optim_state_dict_config=FullOptimStateDictConfig(offload_to_cpu=False, rank0_only=False), ) # Initialize accelerator if args.with_tracking: accelerator = Accelerator( cpu=args.cpu, mixed_precision=args.mixed_precision, log_with="wandb", project_dir=args.logging_dir, fsdp_plugin=fsdp_plugin, ) else: accelerator = Accelerator(fsdp_plugin=fsdp_plugin) accelerator.print(accelerator.distributed_type) if hasattr(args.checkpointing_steps, "isdigit"): if args.checkpointing_steps == "epoch": checkpointing_steps = args.checkpointing_steps elif args.checkpointing_steps.isdigit(): checkpointing_steps = int(args.checkpointing_steps) else: raise ValueError( f"Argument `checkpointing_steps` must be either a number or `epoch`. `{args.checkpointing_steps}` passed." ) else: checkpointing_steps = None # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) # We need to initialize the trackers we use, and also store our configuration if args.with_tracking: experiment_config = vars(args) accelerator.init_trackers("fsdp_glue_no_trainer", experiment_config) tokenizer = AutoTokenizer.from_pretrained(args.model_name_or_path) datasets = load_dataset("nyu-mll/glue", "mrpc") metric = evaluate.load("glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") # If the batch size is too big we use gradient accumulation gradient_accumulation_steps = 1 if batch_size > MAX_GPU_BATCH_SIZE and accelerator.distributed_type != DistributedType.XLA: gradient_accumulation_steps = batch_size // MAX_GPU_BATCH_SIZE batch_size = MAX_GPU_BATCH_SIZE def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) set_seed(seed) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained( args.model_name_or_path, return_dict=True, low_cpu_mem_usage=True ) no_decay = ["bias", "LayerNorm.weight"] optimizer_grouped_parameters = [ { "params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], "weight_decay": 0.003, }, { "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], "weight_decay": 0.0, }, ] optimizer = torch.optim.AdamW(params=optimizer_grouped_parameters, lr=lr, weight_decay=2e-4) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=10, num_training_steps=(len(train_dataloader) * num_epochs) // gradient_accumulation_steps, ) model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) overall_step = 0 # Potentially load in the weights and states from a previous save if args.resume_from_checkpoint: if args.resume_from_checkpoint is not None or args.resume_from_checkpoint != "": accelerator.print(f"Resumed from checkpoint: {args.resume_from_checkpoint}") accelerator.load_state(args.resume_from_checkpoint) path = os.path.basename(args.resume_from_checkpoint) else: # Get the most recent checkpoint dirs = [f.name for f in os.scandir(os.getcwd()) if f.is_dir()] dirs.sort(key=os.path.getctime) path = dirs[-1] # Sorts folders by date modified, most recent checkpoint is the last # Extract `epoch_{i}` or `step_{i}` training_difference = os.path.splitext(path)[0] if "epoch" in training_difference: num_epochs -= int(training_difference.replace("epoch_", "")) resume_step = None else: resume_step = int(training_difference.replace("step_", "")) num_epochs -= resume_step // len(train_dataloader) # If resuming by step, we also need to know exactly how far into the DataLoader we went resume_step = (num_epochs * len(train_dataloader)) - resume_step # Now we train the model for epoch in range(num_epochs): # New Code # # context manager to track the peak memory usage during the training epoch with TorchTracemalloc() as tracemalloc: model.train() if args.with_tracking: total_loss = 0 for step, batch in enumerate(train_dataloader): # We need to skip steps until we reach the resumed step if args.resume_from_checkpoint and epoch == 0: if resume_step is not None and step < resume_step: pass # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) outputs = model(**batch) loss = outputs.loss # We keep track of the loss at each epoch if args.with_tracking: total_loss += loss.detach().float() accelerator.backward(loss) if step % gradient_accumulation_steps == 0: optimizer.step() lr_scheduler.step() optimizer.zero_grad() # accelerator.print(lr_scheduler.get_lr()) overall_step += 1 if isinstance(checkpointing_steps, int): output_dir = f"step_{overall_step}" if overall_step % checkpointing_steps == 0: if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) # New Code # # Printing the GPU memory usage details such as allocated memory, peak memory, and total memory usage accelerator.print(f"Memory before entering the train : {b2mb(tracemalloc.begin)}") accelerator.print(f"Memory consumed at the end of the train (end-begin): {tracemalloc.used}") accelerator.print(f"Peak Memory consumed during the train (max-begin): {tracemalloc.peaked}") accelerator.print( f"Total Peak Memory consumed during the train (max): {tracemalloc.peaked + b2mb(tracemalloc.begin)}" ) # Logging the peak memory usage of the GPU to the tracker if args.with_tracking: accelerator.log( { "train_total_peak_memory": tracemalloc.peaked + b2mb(tracemalloc.begin), }, step=epoch, ) # New Code # # context manager to track the peak memory usage during the evaluation with TorchTracemalloc() as tracemalloc: model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) if args.with_tracking: accelerator.log( { "accuracy": eval_metric["accuracy"], "f1": eval_metric["f1"], "train_loss": total_loss.item() / len(train_dataloader), }, step=epoch, ) if checkpointing_steps == "epoch": output_dir = f"epoch_{epoch}" if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) # New Code # # Printing the GPU memory usage details such as allocated memory, peak memory, and total memory usage accelerator.print(f"Memory before entering the eval : {b2mb(tracemalloc.begin)}") accelerator.print(f"Memory consumed at the end of the eval (end-begin): {tracemalloc.used}") accelerator.print(f"Peak Memory consumed during the eval (max-begin): {tracemalloc.peaked}") accelerator.print( f"Total Peak Memory consumed during the eval (max): {tracemalloc.peaked + b2mb(tracemalloc.begin)}" ) # Logging the peak memory usage of the GPU to the tracker if args.with_tracking: accelerator.log( { "eval_total_peak_memory": tracemalloc.peaked + b2mb(tracemalloc.begin), }, step=epoch, ) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") parser.add_argument( "--checkpointing_steps", type=str, default=None, help="Whether the various states should be saved at the end of every n steps, or 'epoch' for each epoch.", ) parser.add_argument( "--resume_from_checkpoint", type=str, default=None, help="If the training should continue from a checkpoint folder.", ) parser.add_argument( "--with_tracking", action="store_true", help="Whether to load in all available experiment trackers from the environment and use them for logging.", ) parser.add_argument( "--output_dir", type=str, default=".", help="Optional save directory where all checkpoint folders will be stored. Default is the current working directory.", ) parser.add_argument( "--logging_dir", type=str, default="logs", help="Location on where to store experiment tracking logs`", ) parser.add_argument( "--model_name_or_path", type=str, help="Path to pretrained model or model identifier from huggingface.co/models.", required=True, ) args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/gradient_accumulation.py000066400000000000000000000215061521253476100245550ustar00rootroot00000000000000# Copyright 2021 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator, DistributedType ######################################################################## # This is a fully working simple example to use Accelerate # and perform gradient accumulation # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 # New Code # gradient_accumulation_steps = int(args.gradient_accumulation_steps) # Initialize accelerator accelerator = Accelerator( cpu=args.cpu, mixed_precision=args.mixed_precision, gradient_accumulation_steps=gradient_accumulation_steps ) if accelerator.distributed_type == DistributedType.XLA and gradient_accumulation_steps > 1: raise NotImplementedError( "Gradient accumulation on TPUs is currently not supported. Pass `gradient_accumulation_steps=1`" ) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) metric = evaluate.load("glue", "mrpc") set_seed(seed) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs), ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now we train the model for epoch in range(num_epochs): model.train() for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) # New code # # We use the new `accumulate` context manager to perform gradient accumulation # We also currently do not support TPUs nor advise it as bugs were found on the XLA side when running our tests. with accelerator.accumulate(model): output = model(**batch) loss = output.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) # New Code # parser.add_argument( "--gradient_accumulation_steps", type=int, default=1, help="The number of minibatches to be ran before gradients are accumulated.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/gradient_accumulation_for_autoregressive_models.py000066400000000000000000000335721521253476100321230ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import contextlib import math import os import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForCausalLM, AutoTokenizer, get_constant_schedule, set_seed from accelerate import Accelerator, DistributedType ######################################################################## # This is a fully working simple example to use Accelerate # and perform gradient accumulation on samples of variable size # # This example trains a SmolLM base model on WikiText-2 v1 # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16, max_training_samples=500): """ Creates a set of `DataLoader`s for the `Salesforce/wikitext` dataset, using "HuggingFaceTB/SmolLM-360M" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("HuggingFaceTB/SmolLM-360M") tokenizer.pad_token = tokenizer.eos_token with accelerator.local_main_process_first(): datasets = load_dataset("Salesforce/wikitext", "wikitext-2-v1") datasets["train"] = datasets["train"].select(range(max_training_samples)) def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["text"], truncation=True, max_length=None, return_attention_mask=False) return outputs # Filter out empty texts with accelerator.main_process_first(): datasets = datasets.filter( lambda x: len(x) > 0, input_columns="text", ) # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["text"], ) # Filter out empty samples with accelerator.main_process_first(): tokenized_datasets = tokenized_datasets.filter( lambda x: len(x) > 0, input_columns="input_ids", ) def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = ( 128 if accelerator.distributed_type == DistributedType.XLA else max([len(e["input_ids"]) for e in examples]) ) # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None batch = tokenizer.pad( examples, padding="max_length", max_length=max_length + 1, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) batch["labels"] = batch["input_ids"][:, 1:] batch["input_ids"] = batch["input_ids"][:, :-1] if "attention_mask" in batch: batch["attention_mask"] = batch["attention_mask"][:, :-1] batch["labels"] = torch.where(batch["labels"] == tokenizer.pad_token_id, -100, batch["labels"]) return batch # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=False, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders_for_autoregressive_models get_dataloaders = mocked_dataloaders_for_autoregressive_models # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 gradient_accumulation_steps = int(args.gradient_accumulation_steps) # Initialize accelerator if args.with_wandb_tracking: accelerator = Accelerator( cpu=args.cpu, mixed_precision=args.mixed_precision, gradient_accumulation_steps=gradient_accumulation_steps, log_with="wandb", ) else: accelerator = Accelerator( cpu=args.cpu, mixed_precision=args.mixed_precision, gradient_accumulation_steps=gradient_accumulation_steps ) if accelerator.distributed_type == DistributedType.XLA and gradient_accumulation_steps > 1: raise NotImplementedError( "Gradient accumulation on TPUs is currently not supported. Pass `gradient_accumulation_steps=1`" ) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) max_grad_norm = config["max_grad_norm"] # We need to initialize the trackers we use, and also store our configuration if args.with_wandb_tracking: run = os.path.split(__file__)[-1].split(".")[0] run_name = f"{accelerator.num_processes}GPU-grad{gradient_accumulation_steps}-bs{batch_size}" accelerator.init_trackers( run, config, init_kwargs={"wandb": {"name": run_name}}, ) set_seed(seed) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForCausalLM.from_pretrained("HuggingFaceTB/SmolLM-360M") # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_constant_schedule( optimizer=optimizer, ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) num_samples_in_epoch = len(train_dataloader) remainder = num_samples_in_epoch % gradient_accumulation_steps remainder = remainder if remainder != 0 else gradient_accumulation_steps total_gradient_updates = math.ceil(num_samples_in_epoch / gradient_accumulation_steps) total_batched_samples = 0 # Now we train the model for epoch in range(num_epochs): model.train() training_iterator = iter(train_dataloader) for update_step in range(total_gradient_updates): # In order to correctly the total number of non-padded tokens on which we'll compute the cross-entropy loss # we need to pre-load the full local batch - i.e the next per_device_batch_size * accumulation_steps samples batch_samples = [] num_batches_in_step = ( gradient_accumulation_steps if update_step != (total_gradient_updates - 1) else remainder ) for _ in range(num_batches_in_step): batch_samples += [next(training_iterator)] # get local num items in batch local_num_items_in_batch = sum([(batch["labels"].ne(-100)).sum() for batch in batch_samples]) # to compute it correctly in a multi-device DDP training, we need to gather the total number of items in the full batch. num_items_in_batch = accelerator.gather(local_num_items_in_batch).sum().item() losses = [] for i, batch in enumerate(batch_samples): # if we perform gradient accumulation in a multi-devices set-up, we want to avoid unecessary communications when accumulating # cf: https://muellerzr.github.io/blog/gradient_accumulation.html ctx = ( model.no_sync if (i < len(batch_samples) - 1 and accelerator.num_processes > 1) else contextlib.nullcontext ) with ctx(): total_batched_samples += 1 outputs = model(**batch, use_cache=False, num_items_in_batch=num_items_in_batch) loss = outputs.loss # We multiply by num_processes because the DDP calculates the average gradient across all devices whereas dividing by num_items_in_batch already takes into account all devices # Same reason for gradient_accumulation_steps, but this times it's Accelerate that calculate the average gradient across the accumulated steps # Because the loss is already divided by `num_items_in_batch` in the `transformers` code, we don't need to do it again loss = loss * gradient_accumulation_steps * accelerator.num_processes accelerator.backward(loss) losses.append(loss.detach()) # Sync gradients and perform optimization steps once every gradient_accumulation_steps grad_norm = accelerator.clip_grad_norm_(model.parameters(), max_grad_norm) optimizer.step() lr_scheduler.step() optimizer.zero_grad() losses = accelerator.gather(sum(losses)).sum().item() / ( accelerator.num_processes * gradient_accumulation_steps ) grad_norm = grad_norm.detach().item() if isinstance(grad_norm, torch.Tensor) else grad_norm accelerator.print( f"epoch {epoch} - update step {update_step}:: grad norm: {grad_norm} ::train loss: {losses}" ) if args.with_wandb_tracking: accelerator.log( { "train/grad_norm": grad_norm, "train/epoch": epoch, "train/loss": losses, }, step=update_step + total_gradient_updates * epoch, ) model.eval() losses = [] for step, batch in enumerate(eval_dataloader): with torch.no_grad(): outputs = model(**batch, use_cache=False) eval_loss = outputs.loss losses.append(accelerator.gather_for_metrics(loss.repeat(EVAL_BATCH_SIZE))) losses = torch.cat(losses) try: eval_loss = torch.mean(losses) perplexity = math.exp(eval_loss) except OverflowError: perplexity = float("inf") # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:: eval perplexity: {perplexity} eval_loss: {eval_loss}") if args.with_wandb_tracking: accelerator.log( { "eval/perplexity": perplexity, "eval/loss": eval_loss, "eval/epoch": epoch, }, step=update_step + total_gradient_updates * epoch, ) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument( "--gradient_accumulation_steps", type=int, default=1, help="The number of minibatches to be ran before gradients are accumulated.", ) parser.add_argument( "--per_device_batch_size", type=int, default=2, help="The size of each minibatch", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") parser.add_argument( "--with_wandb_tracking", action="store_true", help="Whether to load in wandb from the environment and use them for logging.", ) args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": args.per_device_batch_size, "max_grad_norm": 1.0} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/local_sgd.py000066400000000000000000000223221521253476100221400ustar00rootroot00000000000000# Copyright 2023 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator, DistributedType from accelerate.local_sgd import LocalSGD ######################################################################## # This is a fully working simple example to use Accelerate # with LocalSGD, which is a method to synchronize model # parameters every K batches. It is different, but complementary # to gradient accumulation. # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 # New Code # gradient_accumulation_steps = int(args.gradient_accumulation_steps) local_sgd_steps = int(args.local_sgd_steps) # Initialize accelerator accelerator = Accelerator( cpu=args.cpu, mixed_precision=args.mixed_precision, gradient_accumulation_steps=gradient_accumulation_steps ) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) metric = evaluate.load("glue", "mrpc") set_seed(seed) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs), ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now we train the model for epoch in range(num_epochs): model.train() with LocalSGD( accelerator=accelerator, model=model, local_sgd_steps=local_sgd_steps, enabled=local_sgd_steps is not None ) as local_sgd: for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) # New code # # We use the new `accumulate` context manager to perform gradient accumulation # We also currently do not support TPUs nor advise it as bugs were found on the XLA side when running our tests. with accelerator.accumulate(model): output = model(**batch) loss = output.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() # LocalSGD-specific line local_sgd.step() model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) # New Code # parser.add_argument( "--gradient_accumulation_steps", type=int, default=1, help="The number of minibatches to be ran before gradients are accumulated.", ) parser.add_argument( "--local_sgd_steps", type=int, default=8, help="Number of local SGD steps or None to disable local SGD" ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/megatron_lm_gpt_pretraining.py000066400000000000000000001000501521253476100257640ustar00rootroot00000000000000#!/usr/bin/env python # Copyright 2021 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Fine-tuning the library models for causal language modeling (GPT, GPT-2, CTRL, ...) on a text file or a dataset without using HuggingFace Trainer. Here is the full list of checkpoints on the hub that can be fine-tuned by this script: https://huggingface.co/models?filter=text-generation """ # You can also adapt this script on your own causal language modeling task. Pointers for this are left as comments. import argparse import json import logging import math import os import random from itertools import chain from pathlib import Path import datasets import torch import transformers from datasets import load_dataset from huggingface_hub import HfApi from torch.utils.data import DataLoader from tqdm.auto import tqdm from transformers import ( CONFIG_MAPPING, MODEL_MAPPING, AutoConfig, AutoModelForCausalLM, AutoTokenizer, SchedulerType, default_data_collator, get_scheduler, ) from transformers.utils import check_min_version, send_example_telemetry from transformers.utils.versions import require_version from accelerate import Accelerator, DistributedType, init_empty_weights from accelerate.logging import get_logger from accelerate.utils import MegatronLMDummyScheduler, set_seed # Will error if the minimal version of Transformers is not installed. Remove at your own risks. check_min_version("4.23.0.dev0") logger = get_logger(__name__) require_version("datasets>=1.8.0", "To fix: pip install -r examples/pytorch/language-modeling/requirements.txt") MODEL_CONFIG_CLASSES = list(MODEL_MAPPING.keys()) MODEL_TYPES = tuple(conf.model_type for conf in MODEL_CONFIG_CLASSES) def parse_args(): parser = argparse.ArgumentParser(description="Finetune a transformers model on a causal language modeling task") parser.add_argument( "--dataset_name", type=str, default=None, help="The name of the dataset to use (via the datasets library).", ) parser.add_argument( "--dataset_config_name", type=str, default=None, help="The configuration name of the dataset to use (via the datasets library).", ) parser.add_argument( "--train_file", type=str, default=None, help="A csv or a json file containing the training data." ) parser.add_argument( "--validation_file", type=str, default=None, help="A csv or a json file containing the validation data." ) parser.add_argument( "--validation_split_percentage", default=5, help="The percentage of the train set used as validation set in case there's no validation split", ) parser.add_argument( "--model_name_or_path", type=str, help="Path to pretrained model or model identifier from huggingface.co/models.", required=False, ) parser.add_argument( "--config_name", type=str, default=None, help="Pretrained config name or path if not the same as model_name", ) parser.add_argument( "--tokenizer_name", type=str, default=None, help="Pretrained tokenizer name or path if not the same as model_name", ) parser.add_argument( "--use_slow_tokenizer", action="store_true", help="If passed, will use a slow tokenizer (not backed by the 🤗 Tokenizers library).", ) parser.add_argument( "--per_device_train_batch_size", type=int, default=8, help="Batch size (per device) for the training dataloader.", ) parser.add_argument( "--per_device_eval_batch_size", type=int, default=8, help="Batch size (per device) for the evaluation dataloader.", ) parser.add_argument( "--learning_rate", type=float, default=5e-5, help="Initial learning rate (after the potential warmup period) to use.", ) parser.add_argument("--weight_decay", type=float, default=0.0, help="Weight decay to use.") parser.add_argument("--num_train_epochs", type=int, default=3, help="Total number of training epochs to perform.") parser.add_argument( "--max_train_steps", type=int, default=None, help="Total number of training steps to perform. If provided, overrides num_train_epochs.", ) parser.add_argument( "--gradient_accumulation_steps", type=int, default=1, help="Number of updates steps to accumulate before performing a backward/update pass.", ) parser.add_argument( "--lr_scheduler_type", type=SchedulerType, default="linear", help="The scheduler type to use.", choices=["linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup"], ) parser.add_argument( "--num_warmup_steps", type=int, default=0, help="Number of steps for the warmup in the lr scheduler." ) parser.add_argument("--output_dir", type=str, default=None, help="Where to store the final model.") parser.add_argument("--seed", type=int, default=None, help="A seed for reproducible training.") parser.add_argument( "--model_type", type=str, default=None, help="Model type to use if training from scratch.", choices=MODEL_TYPES, ) parser.add_argument( "--block_size", type=int, default=None, help=( "Optional input sequence length after tokenization. The training dataset will be truncated in block of" " this size for training. Default to the model max input length for single sentence inputs (take into" " account special tokens)." ), ) parser.add_argument( "--preprocessing_num_workers", type=int, default=None, help="The number of processes to use for the preprocessing.", ) parser.add_argument( "--overwrite_cache", action="store_true", help="Overwrite the cached training and evaluation sets" ) parser.add_argument( "--no_keep_linebreaks", action="store_true", help="Do not keep line breaks when using TXT files." ) parser.add_argument("--push_to_hub", action="store_true", help="Whether or not to push the model to the Hub.") parser.add_argument( "--hub_model_id", type=str, help="The name of the repository to keep in sync with the local `output_dir`." ) parser.add_argument("--hub_token", type=str, help="The token to use to push to the Model Hub.") parser.add_argument( "--checkpointing_steps", type=str, default=None, help="Whether the various states should be saved at the end of every n steps, or 'epoch' for each epoch.", ) parser.add_argument( "--resume_from_checkpoint", type=str, default=None, help="If the training should continue from a checkpoint folder.", ) parser.add_argument( "--initial_megatron_lm_checkpoint", type=str, default=None, help="If the training should start from a Megatron-LM checkpoint.", ) parser.add_argument( "--with_tracking", action="store_true", help="Whether to enable experiment trackers for logging.", ) parser.add_argument( "--report_to", type=str, default="all", help=( 'The integration to report the results and logs to. Supported platforms are `"tensorboard"`,' ' `"wandb"`, `"comet_ml"`, and `"dvclive"`, and `"swanlab"`. Use `"all"` (default) to report to all integrations.' "Only applicable when `--with_tracking` is passed." ), ) args = parser.parse_args() # Sanity checks if args.dataset_name is None and args.train_file is None and args.validation_file is None: raise ValueError("Need either a dataset name or a training/validation file.") else: if args.train_file is not None: extension = args.train_file.split(".")[-1] assert extension in ["csv", "json", "txt"], "`train_file` should be a csv, json or txt file." if args.validation_file is not None: extension = args.validation_file.split(".")[-1] assert extension in ["csv", "json", "txt"], "`validation_file` should be a csv, json or txt file." if args.push_to_hub: assert args.output_dir is not None, "Need an `output_dir` to create a repo when `--push_to_hub` is passed." return args def main(): args = parse_args() # Sending telemetry. Tracking the example usage helps us better allocate resources to maintain them. The # information sent is the one passed as arguments along with your Python/PyTorch versions. send_example_telemetry("run_clm_no_trainer", args) # Initialize the accelerator. We will let the accelerator handle device placement for us in this example. # If we're using tracking, we also need to initialize it here and it will by default pick up all supported trackers # in the environment accelerator_log_kwargs = {} if args.with_tracking: accelerator_log_kwargs["log_with"] = args.report_to accelerator_log_kwargs["project_dir"] = args.output_dir accelerator = Accelerator(gradient_accumulation_steps=args.gradient_accumulation_steps, **accelerator_log_kwargs) # Make one log on every process with the configuration for debugging. logging.basicConfig( format="%(asctime)s - %(levelname)s - %(name)s - %(message)s", datefmt="%m/%d/%Y %H:%M:%S", level=logging.INFO, ) logger.info(accelerator.state, main_process_only=False) if accelerator.is_local_main_process: datasets.utils.logging.set_verbosity_warning() transformers.utils.logging.set_verbosity_info() else: datasets.utils.logging.set_verbosity_error() transformers.utils.logging.set_verbosity_error() # If passed along, set the training seed now. if args.seed is not None: set_seed(args.seed) # Handle the repository creation if accelerator.is_main_process: if args.push_to_hub: api = HfApi(token=args.hub_token) # Create repo (repo_name from args or inferred) repo_name = args.hub_model_id if repo_name is None: repo_name = Path(args.output_dir).absolute().name repo_id = api.create_repo(repo_name, exist_ok=True).repo_id with open(os.path.join(args.output_dir, ".gitignore"), "w+") as gitignore: if "step_*" not in gitignore: gitignore.write("step_*\n") if "epoch_*" not in gitignore: gitignore.write("epoch_*\n") elif args.output_dir is not None: os.makedirs(args.output_dir, exist_ok=True) accelerator.wait_for_everyone() # Get the datasets: you can either provide your own CSV/JSON/TXT training and evaluation files (see below) # or just provide the name of one of the public datasets available on the hub at https://huggingface.co/datasets/ # (the dataset will be downloaded automatically from the datasets Hub). # # For CSV/JSON files, this script will use the column called 'text' or the first column if no column called # 'text' is found. You can easily tweak this behavior (see below). # # In distributed training, the load_dataset function guarantee that only one local process can concurrently # download the dataset. if args.dataset_name is not None: # Downloading and loading a dataset from the hub. raw_datasets = load_dataset(args.dataset_name, args.dataset_config_name) if "validation" not in raw_datasets.keys(): raw_datasets["validation"] = load_dataset( args.dataset_name, args.dataset_config_name, split=f"train[:{args.validation_split_percentage}%]", ) raw_datasets["train"] = load_dataset( args.dataset_name, args.dataset_config_name, split=f"train[{args.validation_split_percentage}%:]", ) else: data_files = {} dataset_args = {} if args.train_file is not None: data_files["train"] = args.train_file if args.validation_file is not None: data_files["validation"] = args.validation_file extension = args.train_file.split(".")[-1] if extension == "txt": extension = "text" dataset_args["keep_linebreaks"] = not args.no_keep_linebreaks raw_datasets = load_dataset(extension, data_files=data_files, **dataset_args) # If no validation data is there, validation_split_percentage will be used to divide the dataset. if "validation" not in raw_datasets.keys(): raw_datasets["validation"] = load_dataset( extension, data_files=data_files, split=f"train[:{args.validation_split_percentage}%]", **dataset_args, ) raw_datasets["train"] = load_dataset( extension, data_files=data_files, split=f"train[{args.validation_split_percentage}%:]", **dataset_args, ) # See more about loading any type of standard or custom dataset (from files, python dict, pandas DataFrame, etc) at # https://huggingface.co/docs/datasets/loading_datasets.html. # Load pretrained model and tokenizer # # In distributed training, the .from_pretrained methods guarantee that only one local process can concurrently # download model & vocab. if args.config_name: config = AutoConfig.from_pretrained(args.config_name) elif args.model_name_or_path: config = AutoConfig.from_pretrained(args.model_name_or_path) else: config = CONFIG_MAPPING[args.model_type]() logger.warning("You are instantiating a new config instance from scratch.") if args.tokenizer_name: tokenizer = AutoTokenizer.from_pretrained(args.tokenizer_name, use_fast=not args.use_slow_tokenizer) elif args.model_name_or_path: tokenizer = AutoTokenizer.from_pretrained(args.model_name_or_path, use_fast=not args.use_slow_tokenizer) else: raise ValueError( "You are instantiating a new tokenizer from scratch. This is not supported by this script." "You can do it from another script, save it, and load it from here, using --tokenizer_name." ) if args.model_name_or_path: # if we are using Megatron-LM, we can use init_empty_weights to load the model without initializing the weights # since the weights are loaded later. if args.resume_from_checkpoint is not None or args.initial_megatron_lm_checkpoint is not None: assert config is not None, "config should not be None for Megatron-LM" with init_empty_weights(): model = AutoModelForCausalLM.from_config(config) else: model = AutoModelForCausalLM.from_pretrained( args.model_name_or_path, from_tf=bool(".ckpt" in args.model_name_or_path), config=config, ) else: logger.info("Training new model from scratch") model = AutoModelForCausalLM.from_config(config) model.resize_token_embeddings(len(tokenizer)) # Preprocessing the datasets. # First we tokenize all the texts. column_names = raw_datasets["train"].column_names text_column_name = "text" if "text" in column_names else column_names[0] def tokenize_function(examples): return tokenizer(examples[text_column_name]) with accelerator.main_process_first(): tokenized_datasets = raw_datasets.map( tokenize_function, batched=True, num_proc=args.preprocessing_num_workers, remove_columns=column_names, load_from_cache_file=not args.overwrite_cache, desc="Running tokenizer on dataset", ) if args.block_size is None: block_size = tokenizer.model_max_length if block_size > 1024: logger.warning( f"The tokenizer picked seems to have a very large `model_max_length` ({tokenizer.model_max_length}). " "Picking 1024 instead. You can change that default value by passing --block_size xxx." ) block_size = 1024 else: if args.block_size > tokenizer.model_max_length: logger.warning( f"The block_size passed ({args.block_size}) is larger than the maximum length for the model" f"({tokenizer.model_max_length}). Using block_size={tokenizer.model_max_length}." ) block_size = min(args.block_size, tokenizer.model_max_length) # Main data processing function that will concatenate all texts from our dataset and generate chunks of block_size. def group_texts(examples): # Concatenate all texts. concatenated_examples = {k: list(chain(*examples[k])) for k in examples.keys()} total_length = len(concatenated_examples[list(examples.keys())[0]]) # We drop the small remainder, we could add padding if the model supported it instead of this drop, you can # customize this part to your needs. if total_length >= block_size: total_length = (total_length // block_size) * block_size # Split by chunks of max_len. result = { k: [t[i : i + block_size] for i in range(0, total_length, block_size)] for k, t in concatenated_examples.items() } result["labels"] = result["input_ids"].copy() return result # Note that with `batched=True`, this map processes 1,000 texts together, so group_texts throws away a remainder # for each of those groups of 1,000 texts. You can adjust that batch_size here but a higher value might be slower # to preprocess. # # To speed up this part, we use multiprocessing. See the documentation of the map method for more information: # https://huggingface.co/docs/datasets/package_reference/main_classes.html#datasets.Dataset.map with accelerator.main_process_first(): lm_datasets = tokenized_datasets.map( group_texts, batched=True, num_proc=args.preprocessing_num_workers, load_from_cache_file=not args.overwrite_cache, desc=f"Grouping texts in chunks of {block_size}", ) train_dataset = lm_datasets["train"] eval_dataset = lm_datasets["validation"] # Log a few random samples from the training set: for index in random.sample(range(len(train_dataset)), 3): logger.info(f"Sample {index} of the training set: {train_dataset[index]}.") # DataLoaders creation: train_dataloader = DataLoader( train_dataset, shuffle=True, collate_fn=default_data_collator, batch_size=args.per_device_train_batch_size ) eval_dataloader = DataLoader( eval_dataset, collate_fn=default_data_collator, batch_size=args.per_device_eval_batch_size ) # Optimizer # Split weights in two groups, one with weight decay and the other not. no_decay = ["bias", "layer_norm.weight"] optimizer_grouped_parameters = [ { "params": [p for n, p in model.named_parameters() if not any(nd in n for nd in no_decay)], "weight_decay": args.weight_decay, }, { "params": [p for n, p in model.named_parameters() if any(nd in n for nd in no_decay)], "weight_decay": 0.0, }, ] optimizer = torch.optim.AdamW(optimizer_grouped_parameters, lr=args.learning_rate) # Scheduler and math around the number of training steps. overrode_max_train_steps = False num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps) if args.max_train_steps is None: args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch overrode_max_train_steps = True # New Code # For Megatron-LM, we need to use `MegatronLMDummyScheduler` instead of regular schedulers if accelerator.distributed_type == DistributedType.MEGATRON_LM: lr_scheduler = MegatronLMDummyScheduler( optimizer=optimizer, total_num_steps=args.max_train_steps, warmup_num_steps=args.num_warmup_steps, ) else: lr_scheduler = get_scheduler( name=args.lr_scheduler_type, optimizer=optimizer, num_warmup_steps=args.num_warmup_steps * args.gradient_accumulation_steps, num_training_steps=args.max_train_steps * args.gradient_accumulation_steps, ) # Prepare everything with our `accelerator`. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # On TPU, the tie weights in our model have been disconnected, so we need to restore the ties. if accelerator.distributed_type == DistributedType.XLA: model.tie_weights() # We need to recalculate our total training steps as the size of the training dataloader may have changed. num_update_steps_per_epoch = math.ceil(len(train_dataloader) / args.gradient_accumulation_steps) if overrode_max_train_steps: args.max_train_steps = args.num_train_epochs * num_update_steps_per_epoch # Afterwards we recalculate our number of training epochs args.num_train_epochs = math.ceil(args.max_train_steps / num_update_steps_per_epoch) # Figure out how many steps we should save the Accelerator states checkpointing_steps = args.checkpointing_steps if checkpointing_steps is not None and checkpointing_steps.isdigit(): checkpointing_steps = int(checkpointing_steps) # We need to initialize the trackers we use, and also store our configuration. # The trackers initializes automatically on the main process. if args.with_tracking: experiment_config = vars(args) # TensorBoard cannot log Enums, need the raw value experiment_config["lr_scheduler_type"] = experiment_config["lr_scheduler_type"].value accelerator.init_trackers("clm_no_trainer", experiment_config) # Train! # New Code # For Megatron-LM, we need to get `global_batch_size` from megatron_lm_plugin # as it handles the specifics related to data parallelism, tensor model parallelism and pipeline parallelism if accelerator.distributed_type == DistributedType.MEGATRON_LM: total_batch_size = accelerator.state.megatron_lm_plugin.global_batch_size else: total_batch_size = ( args.per_device_train_batch_size * accelerator.num_processes * args.gradient_accumulation_steps ) logger.info("***** Running training *****") logger.info(f" Num examples = {len(train_dataset)}") logger.info(f" Num Epochs = {args.num_train_epochs}") logger.info(f" Instantaneous batch size per device = {args.per_device_train_batch_size}") logger.info(f" Total train batch size (w. parallel, distributed & accumulation) = {total_batch_size}") logger.info(f" Gradient Accumulation steps = {args.gradient_accumulation_steps}") logger.info(f" Total optimization steps = {args.max_train_steps}") # Only show the progress bar once on each machine. progress_bar = tqdm(range(args.max_train_steps), disable=not accelerator.is_local_main_process) completed_steps = 0 starting_epoch = 0 # Potentially load in the weights and states from a previous save if args.resume_from_checkpoint: if args.resume_from_checkpoint is not None or args.resume_from_checkpoint != "": accelerator.print(f"Resumed from checkpoint: {args.resume_from_checkpoint}") accelerator.load_state(args.resume_from_checkpoint) path = os.path.basename(args.resume_from_checkpoint) else: # Get the most recent checkpoint dirs = [f.name for f in os.scandir(os.getcwd()) if f.is_dir()] dirs.sort(key=os.path.getctime) path = dirs[-1] # Sorts folders by date modified, most recent checkpoint is the last # Extract `epoch_{i}` or `step_{i}` training_difference = os.path.splitext(path)[0] if "epoch" in training_difference: starting_epoch = int(training_difference.replace("epoch_", "")) + 1 resume_step = None else: # need to multiply `gradient_accumulation_steps` to reflect real steps resume_step = int(training_difference.replace("step_", "")) * args.gradient_accumulation_steps starting_epoch = resume_step // len(train_dataloader) resume_step -= starting_epoch * len(train_dataloader) if args.initial_megatron_lm_checkpoint: assert accelerator.distributed_type == DistributedType.MEGATRON_LM, ( "initial_megatron_lm_checkpoint should only be used with Megatron-LM" ) assert args.resume_from_checkpoint is None, ( "resume_from_checkpoint should not be provided when initial_megatron_lm_checkpoint is provided" ) accelerator.print( f"Loading Megatron-LM checkpoint from the initial checkpoint (directly from the release directory converted using megatron bridge): {args.initial_megatron_lm_checkpoint}" ) checkpoint_dir = args.initial_megatron_lm_checkpoint latest_iter_file = os.path.join(checkpoint_dir, "latest_checkpointed_iteration.txt") assert os.path.isfile(latest_iter_file), f"{latest_iter_file} does not exist in {checkpoint_dir}" with open(latest_iter_file) as f: contents = f.read().strip() assert contents == "0", ( f"latest_checkpointed_iteration.txt in {checkpoint_dir} must contain only '0' (found '{contents}'), please mannually change it to '0' and rename the directory release to iter_0000000, also make sure megatron_lm_no_load_optim is set to true in the config file" ) # Also assert iter_0000000 directory exists iter0_dir = os.path.join(checkpoint_dir, "iter_0000000") assert os.path.isdir(iter0_dir), ( f"{iter0_dir} directory does not exist in {checkpoint_dir}, please rename the release directory to iter_0000000" ) accelerator.load_state(args.initial_megatron_lm_checkpoint) # update the progress_bar if load from checkpoint progress_bar.update(starting_epoch * num_update_steps_per_epoch) completed_steps = starting_epoch * num_update_steps_per_epoch for epoch in range(starting_epoch, args.num_train_epochs): model.train() if args.with_tracking: total_loss = 0 for step, batch in enumerate(train_dataloader): # We need to skip steps until we reach the resumed step if args.resume_from_checkpoint and epoch == starting_epoch: if resume_step is not None and step < resume_step: if step % args.gradient_accumulation_steps == 0: progress_bar.update(1) completed_steps += 1 continue with accelerator.accumulate(model): outputs = model(**batch) loss = outputs.loss # We keep track of the loss at each epoch if args.with_tracking: total_loss += loss.detach().float() accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() # Checks if the accelerator has performed an optimization step behind the scenes if accelerator.sync_gradients: progress_bar.update(1) completed_steps += 1 if isinstance(checkpointing_steps, int): if completed_steps % checkpointing_steps == 0: output_dir = f"step_{completed_steps}" if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) if completed_steps >= args.max_train_steps: break model.eval() losses = [] for step, batch in enumerate(eval_dataloader): with torch.no_grad(): outputs = model(**batch) loss = outputs.loss # New Code # For Megatron-LM, the losses are already averaged across the data parallel group if accelerator.distributed_type == DistributedType.MEGATRON_LM: losses.append(loss) else: losses.append(accelerator.gather_for_metrics(loss.repeat(args.per_device_eval_batch_size))) try: if accelerator.distributed_type == DistributedType.MEGATRON_LM: losses = torch.tensor(losses) else: losses = torch.cat(losses) eval_loss = torch.mean(losses) perplexity = math.exp(eval_loss) except OverflowError: perplexity = float("inf") logger.info(f"epoch {epoch}: perplexity: {perplexity} eval_loss: {eval_loss}") if args.with_tracking: accelerator.log( { "perplexity": perplexity, "eval_loss": eval_loss, "train_loss": total_loss.item() / len(train_dataloader), "epoch": epoch, "step": completed_steps, }, step=completed_steps, ) if args.push_to_hub and epoch < args.num_train_epochs - 1: accelerator.wait_for_everyone() unwrapped_model = accelerator.unwrap_model(model) unwrapped_model.save_pretrained( args.output_dir, is_main_process=accelerator.is_main_process, save_function=accelerator.save ) if accelerator.is_main_process: tokenizer.save_pretrained(args.output_dir) api.upload_folder( repo_id=repo_id, folder_path=args.output_dir, commit_message=f"Training in progress epoch {epoch}", run_as_future=True, ) if args.checkpointing_steps == "epoch": output_dir = f"epoch_{epoch}" if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) # this is causing some issue with Megatron-LM when using `wandb` at the end of the main function. # Everything works fine inspite of commenting this out. (wandb finishes/closes the run without error) # if args.with_tracking: # accelerator.end_training() if args.output_dir is not None: accelerator.wait_for_everyone() # New Code # For Megatron-LM, we need to save the model using `accelerator.save_state` if accelerator.distributed_type == DistributedType.MEGATRON_LM: accelerator.save_state(args.output_dir) else: unwrapped_model = accelerator.unwrap_model(model) unwrapped_model.save_pretrained( args.output_dir, is_main_process=accelerator.is_main_process, save_function=accelerator.save ) if accelerator.is_main_process: tokenizer.save_pretrained(args.output_dir) if args.push_to_hub: api.upload_folder( repo_id=repo_id, folder_path=args.output_dir, commit_message="End of training", ) with open(os.path.join(args.output_dir, "all_results.json"), "w") as f: json.dump({"perplexity": perplexity}, f) accelerator.end_training() if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/memory.py000066400000000000000000000222361521253476100215250ustar00rootroot00000000000000# Copyright 2022 The HuggingFace Team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os # New Code # import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator, DistributedType from accelerate.utils import find_executable_batch_size ######################################################################## # This is a fully working simple example to use Accelerate, # specifically showcasing how to ensure out-of-memory errors never # interrupt training, and builds off the `nlp_example.py` script. # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # New additions from the base script can be found quickly by # looking for the # New Code # tags # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 # Initialize accelerator accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) metric = evaluate.load("glue", "mrpc") # New Code # # We now can define an inner training loop function. It should take a batch size as the only parameter, # and build the dataloaders in there. # It also gets our decorator @find_executable_batch_size(starting_batch_size=batch_size) def inner_training_loop(batch_size): # And now just move everything below under this function # We need to bring in the Accelerator object from earlier nonlocal accelerator # And reset all of its attributes that could hold onto any memory: accelerator.free_memory() # Then we can declare the model, optimizer, and everything else: set_seed(seed) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs), ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now we train the model for epoch in range(num_epochs): model.train() for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) outputs = model(**batch) loss = outputs.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) # New Code # # And call it at the end with no arguments # Note: You could also refactor this outside of your training loop function inner_training_loop() accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/multi_process_metrics.py000066400000000000000000000231161521253476100246310ustar00rootroot00000000000000# Copyright 2022 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator, DistributedType ######################################################################## # This is a fully working simple example to use Accelerate, # specifically showcasing how to properly calculate the metrics on the # validation dataset when in a distributed system, and builds off the # `nlp_example.py` script. # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To help focus on the differences in the code, building `DataLoaders` # was refactored into its own function. # New additions from the base script can be found quickly by # looking for the # New Code # tags # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 # Initialize accelerator accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) metric = evaluate.load("glue", "mrpc") # If the batch size is too big we use gradient accumulation gradient_accumulation_steps = 1 if batch_size > MAX_GPU_BATCH_SIZE and accelerator.distributed_type != DistributedType.XLA: gradient_accumulation_steps = batch_size // MAX_GPU_BATCH_SIZE batch_size = MAX_GPU_BATCH_SIZE set_seed(seed) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs) // gradient_accumulation_steps, ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now we train the model for epoch in range(num_epochs): model.train() for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) outputs = model(**batch) loss = outputs.loss loss = loss / gradient_accumulation_steps accelerator.backward(loss) if step % gradient_accumulation_steps == 0: optimizer.step() lr_scheduler.step() optimizer.zero_grad() model.eval() samples_seen = 0 for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather((predictions, batch["labels"])) # New Code # # First we check if it's a distributed system if accelerator.use_distributed: # Then see if we're on the last batch of our eval dataloader if step == len(eval_dataloader) - 1: # Last batch needs to be truncated on distributed systems as it contains additional samples predictions = predictions[: len(eval_dataloader.dataset) - samples_seen] references = references[: len(eval_dataloader.dataset) - samples_seen] else: # Otherwise we add the number of samples seen samples_seen += references.shape[0] # All of this can be avoided if you use `Accelerator.gather_for_metrics` instead of `Accelerator.gather`: # accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/profiler.py000066400000000000000000000227261521253476100220430ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator, DistributedType from accelerate.utils import ProfileKwargs ######################################################################## # This is a fully working simple example to use Accelerate # and perform profiling # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single device (CUDA GPU, Intel XPU etc.) # - multi devices (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 # New Code # profile_kwargs = ProfileKwargs( record_shapes=args.record_shapes, profile_memory=args.profile_memory, with_flops=args.with_flops, output_trace_dir=args.output_trace_dir, ) # Initialize accelerator accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision, kwargs_handlers=[profile_kwargs]) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) metric = evaluate.load("glue", "mrpc") set_seed(seed) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs), ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now we train the model for epoch in range(num_epochs): model.train() # New Code # with accelerator.profile() as prof: for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) # We use the new `accumulate` context manager to perform gradient accumulation with accelerator.accumulate(model): output = model(**batch) loss = output.loss accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() # New Code # accelerator.print( prof.key_averages().table( sort_by="self_cpu_time_total" if args.cpu else f"self_{accelerator.device.type}_time_total", row_limit=-1, ) ) model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU or an Intel XPU.", ) # New Code # parser.add_argument( "--record_shapes", action="store_true", default=False, help="If passed, will record shapes for profiling.", ) # New Code # parser.add_argument( "--profile_memory", action="store_true", default=False, help="If passed, will profile memory.", ) # New Code # parser.add_argument( "--with_flops", action="store_true", default=False, help="If passed, will profile flops.", ) # New Code # parser.add_argument( "--output_trace_dir", type=str, default=None, help="If passed, will save a json trace to the specified path.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/schedule_free.py000066400000000000000000000206631521253476100230140ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import evaluate import torch from datasets import load_dataset from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, set_seed from accelerate import Accelerator, DistributedType from accelerate.utils import is_schedulefree_available if is_schedulefree_available(): import schedulefree else: raise ImportError( "This example requires the `schedulefree` library. Please install it with `pip install schedulefree`" ) ######################################################################## # This is a fully working simple example to use Accelerate and Facebook's # scheduler-free optimizer: https://github.com/facebookresearch/schedule_free/ # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # For Torchxla, it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size, drop_last=True ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE, drop_last=(accelerator.mixed_precision == "fp8"), ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # Initialize accelerator accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) metric = evaluate.load("glue", "mrpc") # If the batch size is too big we use gradient accumulation gradient_accumulation_steps = 1 if batch_size > MAX_GPU_BATCH_SIZE and accelerator.distributed_type != DistributedType.XLA: gradient_accumulation_steps = batch_size // MAX_GPU_BATCH_SIZE batch_size = MAX_GPU_BATCH_SIZE set_seed(seed) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer with warmup steps optimizer = schedulefree.AdamWScheduleFree( model.parameters(), lr=lr, warmup_steps=100, ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader ) # Now we train the model for epoch in range(num_epochs): model.train() optimizer.train() for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) outputs = model(**batch) loss = outputs.loss loss = loss / gradient_accumulation_steps accelerator.backward(loss) if step % gradient_accumulation_steps == 0: optimizer.step() optimizer.zero_grad() model.eval() optimizer.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/by_feature/tracking.py000066400000000000000000000247541521253476100220260ustar00rootroot00000000000000# Copyright 2021 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator, DistributedType ######################################################################## # This is a fully working simple example to use Accelerate, # specifically showcasing the experiment tracking capability, # and builds off the `nlp_example.py` script. # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To help focus on the differences in the code, building `DataLoaders` # was refactored into its own function. # New additions from the base script can be found quickly by # looking for the # New Code # tags # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def get_dataloaders(accelerator: Accelerator, batch_size: int = 16): """ Creates a set of `DataLoader`s for the `glue` dataset, using "bert-base-cased" as the tokenizer. Args: accelerator (`Accelerator`): An `Accelerator` object batch_size (`int`, *optional*): The batch size for the train and validation DataLoaders. """ tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) return train_dataloader, eval_dataloader # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": from accelerate.test_utils.training import mocked_dataloaders get_dataloaders = mocked_dataloaders # noqa: F811 def training_function(config, args): # For testing only if os.environ.get("TESTING_MOCKED_DATALOADERS", None) == "1": config["num_epochs"] = 2 # Initialize Accelerator # New Code # # We pass in "all" to `log_with` to grab all available trackers in the environment # Note: If using a custom `Tracker` class, should be passed in here such as: # >>> log_with = ["all", MyCustomTrackerClassInstance()] if args.with_tracking: accelerator = Accelerator( cpu=args.cpu, mixed_precision=args.mixed_precision, log_with="all", project_dir=args.project_dir ) else: accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) set_seed(seed) train_dataloader, eval_dataloader = get_dataloaders(accelerator, batch_size) metric = evaluate.load("glue", "mrpc") # If the batch size is too big we use gradient accumulation gradient_accumulation_steps = 1 if batch_size > MAX_GPU_BATCH_SIZE and accelerator.distributed_type != DistributedType.XLA: gradient_accumulation_steps = batch_size // MAX_GPU_BATCH_SIZE batch_size = MAX_GPU_BATCH_SIZE # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs) // gradient_accumulation_steps, ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # New Code # # We need to initialize the trackers we use. Overall configurations can also be stored if args.with_tracking: run = os.path.split(__file__)[-1].split(".")[0] accelerator.init_trackers(run, config) # Now we train the model for epoch in range(num_epochs): model.train() # New Code # # For our tracking example, we will log the total loss of each epoch if args.with_tracking: total_loss = 0 for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) outputs = model(**batch) loss = outputs.loss # New Code # if args.with_tracking: total_loss += loss.detach().float() loss = loss / gradient_accumulation_steps accelerator.backward(loss) if step % gradient_accumulation_steps == 0: optimizer.step() lr_scheduler.step() optimizer.zero_grad() model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True` (the default). batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) # New Code # # To actually log, we call `Accelerator.log` # The values passed can be of `str`, `int`, `float` or `dict` of `str` to `float`/`int` if args.with_tracking: accelerator.log( { "accuracy": eval_metric["accuracy"], "f1": eval_metric["f1"], "train_loss": total_loss.item() / len(train_dataloader), "epoch": epoch, }, step=epoch, ) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") parser.add_argument( "--with_tracking", action="store_true", help="Whether to load in all available experiment trackers from the environment and use them for logging.", ) parser.add_argument( "--project_dir", type=str, default="logs", help="Location on where to store experiment tracking logs` and relevent project information", ) args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/complete_cv_example.py000066400000000000000000000334431521253476100221050ustar00rootroot00000000000000# Copyright 2021 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import re import numpy as np import PIL import torch from timm import create_model from torch.optim.lr_scheduler import OneCycleLR from torch.utils.data import DataLoader, Dataset from torchvision.transforms import Compose, RandomResizedCrop, Resize, ToTensor from accelerate import Accelerator, DataLoaderConfiguration from accelerate.utils import is_xpu_available ######################################################################## # This is a fully working simple example to use Accelerate # # This example trains a ResNet50 on the Oxford-IIT Pet Dataset # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## # Function to get the label from the filename def extract_label(fname): stem = fname.split(os.path.sep)[-1] return re.search(r"^(.*)_\d+\.jpg$", stem).groups()[0] class PetsDataset(Dataset): def __init__(self, file_names, image_transform=None, label_to_id=None): self.file_names = file_names self.image_transform = image_transform self.label_to_id = label_to_id def __len__(self): return len(self.file_names) def __getitem__(self, idx): fname = self.file_names[idx] raw_image = PIL.Image.open(fname) image = raw_image.convert("RGB") if self.image_transform is not None: image = self.image_transform(image) label = extract_label(fname) if self.label_to_id is not None: label = self.label_to_id[label] return {"image": image, "label": label} def training_function(config, args): # Initialize accelerator dataloader_config = DataLoaderConfiguration(use_stateful_dataloader=args.use_stateful_dataloader) if args.with_tracking: accelerator = Accelerator( cpu=args.cpu, mixed_precision=args.mixed_precision, log_with="all", project_dir=args.project_dir, dataloader_config=dataloader_config, ) else: accelerator = Accelerator( cpu=args.cpu, mixed_precision=args.mixed_precision, dataloader_config=dataloader_config ) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) image_size = config["image_size"] if not isinstance(image_size, (list, tuple)): image_size = (image_size, image_size) # Parse out whether we are saving every epoch or after a certain number of batches if hasattr(args.checkpointing_steps, "isdigit"): if args.checkpointing_steps == "epoch": checkpointing_steps = args.checkpointing_steps elif args.checkpointing_steps.isdigit(): checkpointing_steps = int(args.checkpointing_steps) else: raise ValueError( f"Argument `checkpointing_steps` must be either a number or `epoch`. `{args.checkpointing_steps}` passed." ) else: checkpointing_steps = None # We need to initialize the trackers we use, and also store our configuration if args.with_tracking: run = os.path.split(__file__)[-1].split(".")[0] accelerator.init_trackers(run, config) # Grab all the image filenames file_names = [os.path.join(args.data_dir, fname) for fname in os.listdir(args.data_dir) if fname.endswith(".jpg")] # Build the label correspondences all_labels = [extract_label(fname) for fname in file_names] id_to_label = list(set(all_labels)) id_to_label.sort() label_to_id = {lbl: i for i, lbl in enumerate(id_to_label)} # Set the seed before splitting the data. np.random.seed(seed) torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed_all(seed) elif is_xpu_available(): torch.xpu.manual_seed_all(seed) # Split our filenames between train and validation random_perm = np.random.permutation(len(file_names)) cut = int(0.8 * len(file_names)) train_split = random_perm[:cut] eval_split = random_perm[cut:] # For training we use a simple RandomResizedCrop train_tfm = Compose([RandomResizedCrop(image_size, scale=(0.5, 1.0)), ToTensor()]) train_dataset = PetsDataset( [file_names[i] for i in train_split], image_transform=train_tfm, label_to_id=label_to_id ) # For evaluation, we use a deterministic Resize eval_tfm = Compose([Resize(image_size), ToTensor()]) eval_dataset = PetsDataset([file_names[i] for i in eval_split], image_transform=eval_tfm, label_to_id=label_to_id) # Instantiate dataloaders. train_dataloader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size, num_workers=4) eval_dataloader = DataLoader(eval_dataset, shuffle=False, batch_size=batch_size, num_workers=4) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = create_model("resnet50d", pretrained=True, num_classes=len(label_to_id)) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Freezing the base model for param in model.parameters(): param.requires_grad = False for param in model.get_classifier().parameters(): param.requires_grad = True # We normalize the batches of images to be a bit faster. mean = torch.tensor(model.default_cfg["mean"])[None, :, None, None].to(accelerator.device) std = torch.tensor(model.default_cfg["std"])[None, :, None, None].to(accelerator.device) # Instantiate optimizer optimizer = torch.optim.Adam(params=model.parameters(), lr=lr / 25) # Instantiate learning rate scheduler lr_scheduler = OneCycleLR(optimizer=optimizer, max_lr=lr, epochs=num_epochs, steps_per_epoch=len(train_dataloader)) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # We need to keep track of how many total steps we have iterated over overall_step = 0 # We also need to keep track of the starting epoch so files are named properly starting_epoch = 0 # Potentially load in the weights and states from a previous save if args.resume_from_checkpoint: if args.resume_from_checkpoint is not None or args.resume_from_checkpoint != "": accelerator.print(f"Resumed from checkpoint: {args.resume_from_checkpoint}") accelerator.load_state(args.resume_from_checkpoint) path = os.path.basename(args.resume_from_checkpoint) else: # Get the most recent checkpoint dirs = [f.name for f in os.scandir(os.getcwd()) if f.is_dir()] dirs.sort(key=os.path.getctime) path = dirs[-1] # Sorts folders by date modified, most recent checkpoint is the last # Extract `epoch_{i}` or `step_{i}` training_difference = os.path.splitext(path)[0] if "epoch" in training_difference: starting_epoch = int(training_difference.replace("epoch_", "")) + 1 resume_step = None else: resume_step = int(training_difference.replace("step_", "")) starting_epoch = resume_step // len(train_dataloader) resume_step -= starting_epoch * len(train_dataloader) # Now we train the model for epoch in range(starting_epoch, num_epochs): model.train() if args.with_tracking: total_loss = 0 if args.resume_from_checkpoint and epoch == starting_epoch and resume_step is not None: # We need to skip steps until we reach the resumed step active_dataloader = accelerator.skip_first_batches(train_dataloader, resume_step) overall_step += resume_step else: # After the first iteration though, we need to go back to the original dataloader active_dataloader = train_dataloader for batch in active_dataloader: # We could avoid this line since we set the accelerator with `device_placement=True`. batch = {k: v.to(accelerator.device) for k, v in batch.items()} inputs = (batch["image"] - mean) / std outputs = model(inputs) loss = torch.nn.functional.cross_entropy(outputs, batch["label"]) # We keep track of the loss at each epoch if args.with_tracking: total_loss += loss.detach().float() accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() overall_step += 1 if isinstance(checkpointing_steps, int): output_dir = f"step_{overall_step}" if overall_step % checkpointing_steps == 0: if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) model.eval() accurate = 0 num_elems = 0 for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch = {k: v.to(accelerator.device) for k, v in batch.items()} inputs = (batch["image"] - mean) / std with torch.no_grad(): outputs = model(inputs) predictions = outputs.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["label"])) accurate_preds = predictions == references num_elems += accurate_preds.shape[0] accurate += accurate_preds.long().sum() eval_metric = accurate.item() / num_elems # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}: {100 * eval_metric:.2f}") if args.with_tracking: accelerator.log( { "accuracy": 100 * eval_metric, "train_loss": total_loss.item() / len(train_dataloader), "epoch": epoch, }, step=overall_step, ) if checkpointing_steps == "epoch": output_dir = f"epoch_{epoch}" if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument("--data_dir", required=True, help="The data folder on disk.") parser.add_argument("--fp16", action="store_true", help="If passed, will use FP16 training.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") parser.add_argument( "--checkpointing_steps", type=str, default=None, help="Whether the various states should be saved at the end of every n steps, or 'epoch' for each epoch.", ) parser.add_argument( "--output_dir", type=str, default=".", help="Optional save directory where all checkpoint folders will be stored. Default is the current working directory.", ) parser.add_argument( "--resume_from_checkpoint", type=str, default=None, help="If the training should continue from a checkpoint folder.", ) parser.add_argument( "--use_stateful_dataloader", action="store_true", help="If the dataloader should be a resumable stateful dataloader.", ) parser.add_argument( "--with_tracking", action="store_true", help="Whether to load in all available experiment trackers from the environment and use them for logging.", ) parser.add_argument( "--project_dir", type=str, default="logs", help="Location on where to store experiment tracking logs` and relevent project information", ) args = parser.parse_args() config = {"lr": 3e-2, "num_epochs": 3, "seed": 42, "batch_size": 64, "image_size": 224} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/complete_nlp_example.py000066400000000000000000000317461521253476100222720ustar00rootroot00000000000000# Copyright 2021 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import evaluate import torch from datasets import load_dataset from torch.optim import AdamW from torch.utils.data import DataLoader from transformers import AutoModelForSequenceClassification, AutoTokenizer, get_linear_schedule_with_warmup, set_seed from accelerate import Accelerator, DataLoaderConfiguration, DistributedType ######################################################################## # This is a fully working simple example to use Accelerate # # This example trains a Bert base model on GLUE MRPC # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # This example also demonstrates the checkpointing and sharding capabilities # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## MAX_GPU_BATCH_SIZE = 16 EVAL_BATCH_SIZE = 32 def training_function(config, args): # Initialize accelerator dataloader_config = DataLoaderConfiguration(use_stateful_dataloader=args.use_stateful_dataloader) if args.with_tracking: accelerator = Accelerator( cpu=args.cpu, mixed_precision=args.mixed_precision, dataloader_config=dataloader_config, log_with="all", project_dir=args.project_dir, ) else: accelerator = Accelerator( cpu=args.cpu, mixed_precision=args.mixed_precision, dataloader_config=dataloader_config ) if hasattr(args.checkpointing_steps, "isdigit"): if args.checkpointing_steps == "epoch": checkpointing_steps = args.checkpointing_steps elif args.checkpointing_steps.isdigit(): checkpointing_steps = int(args.checkpointing_steps) else: raise ValueError( f"Argument `checkpointing_steps` must be either a number or `epoch`. `{args.checkpointing_steps}` passed." ) else: checkpointing_steps = None # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) # We need to initialize the trackers we use, and also store our configuration if args.with_tracking: run = os.path.split(__file__)[-1].split(".")[0] accelerator.init_trackers(run, config) tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") datasets = load_dataset("nyu-mll/glue", "mrpc") metric = evaluate.load("glue", "mrpc") def tokenize_function(examples): # max_length=None => use the model max length (it's actually the default) outputs = tokenizer(examples["sentence1"], examples["sentence2"], truncation=True, max_length=None) return outputs # Apply the method we just defined to all the examples in all the splits of the dataset # starting with the main process first: with accelerator.main_process_first(): tokenized_datasets = datasets.map( tokenize_function, batched=True, remove_columns=["idx", "sentence1", "sentence2"], ) # We also rename the 'label' column to 'labels' which is the expected name for labels by the models of the # transformers library tokenized_datasets = tokenized_datasets.rename_column("label", "labels") # If the batch size is too big we use gradient accumulation gradient_accumulation_steps = 1 if batch_size > MAX_GPU_BATCH_SIZE and accelerator.distributed_type != DistributedType.XLA: gradient_accumulation_steps = batch_size // MAX_GPU_BATCH_SIZE batch_size = MAX_GPU_BATCH_SIZE def collate_fn(examples): # On TPU it's best to pad everything to the same length or training will be very slow. max_length = 128 if accelerator.distributed_type == DistributedType.XLA else None # When using mixed precision we want round multiples of 8/16 if accelerator.mixed_precision == "fp8": pad_to_multiple_of = 16 elif accelerator.mixed_precision != "no": pad_to_multiple_of = 8 else: pad_to_multiple_of = None return tokenizer.pad( examples, padding="longest", max_length=max_length, pad_to_multiple_of=pad_to_multiple_of, return_tensors="pt", ) # Instantiate dataloaders. train_dataloader = DataLoader( tokenized_datasets["train"], shuffle=True, collate_fn=collate_fn, batch_size=batch_size ) eval_dataloader = DataLoader( tokenized_datasets["validation"], shuffle=False, collate_fn=collate_fn, batch_size=EVAL_BATCH_SIZE ) set_seed(seed) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = AutoModelForSequenceClassification.from_pretrained("bert-base-cased", return_dict=True) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Instantiate optimizer optimizer = AdamW(params=model.parameters(), lr=lr) # Instantiate scheduler lr_scheduler = get_linear_schedule_with_warmup( optimizer=optimizer, num_warmup_steps=100, num_training_steps=(len(train_dataloader) * num_epochs) // gradient_accumulation_steps, ) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # We need to keep track of how many total steps we have iterated over overall_step = 0 # We also need to keep track of the stating epoch so files are named properly starting_epoch = 0 # Potentially load in the weights and states from a previous save if args.resume_from_checkpoint: if args.resume_from_checkpoint is not None or args.resume_from_checkpoint != "": accelerator.print(f"Resumed from checkpoint: {args.resume_from_checkpoint}") accelerator.load_state(args.resume_from_checkpoint) path = os.path.basename(args.resume_from_checkpoint) else: # Get the most recent checkpoint dirs = [f.name for f in os.scandir(os.getcwd()) if f.is_dir()] dirs.sort(key=os.path.getctime) path = dirs[-1] # Sorts folders by date modified, most recent checkpoint is the last # Extract `epoch_{i}` or `step_{i}` training_difference = os.path.splitext(path)[0] if "epoch" in training_difference: starting_epoch = int(training_difference.replace("epoch_", "")) + 1 resume_step = None else: resume_step = int(training_difference.replace("step_", "")) starting_epoch = resume_step // len(train_dataloader) resume_step -= starting_epoch * len(train_dataloader) # Now we train the model for epoch in range(starting_epoch, num_epochs): model.train() if args.with_tracking: total_loss = 0 if args.resume_from_checkpoint and epoch == starting_epoch and resume_step is not None: # We need to skip steps until we reach the resumed step if not args.use_stateful_dataloader: active_dataloader = accelerator.skip_first_batches(train_dataloader, resume_step) else: active_dataloader = train_dataloader overall_step += resume_step else: # After the first iteration though, we need to go back to the original dataloader active_dataloader = train_dataloader for step, batch in enumerate(active_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) outputs = model(**batch) loss = outputs.loss loss = loss / gradient_accumulation_steps # We keep track of the loss at each epoch if args.with_tracking: total_loss += loss.detach().float() accelerator.backward(loss) if step % gradient_accumulation_steps == 0: optimizer.step() lr_scheduler.step() optimizer.zero_grad() overall_step += 1 if isinstance(checkpointing_steps, int): output_dir = f"step_{overall_step}" if overall_step % checkpointing_steps == 0: if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) model.eval() for step, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch.to(accelerator.device) with torch.no_grad(): outputs = model(**batch) predictions = outputs.logits.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["labels"])) metric.add_batch( predictions=predictions, references=references, ) eval_metric = metric.compute() # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}:", eval_metric) if args.with_tracking: accelerator.log( { "accuracy": eval_metric["accuracy"], "f1": eval_metric["f1"], "train_loss": total_loss.item() / len(train_dataloader), "epoch": epoch, }, step=epoch, ) if checkpointing_steps == "epoch": output_dir = f"epoch_{epoch}" if args.output_dir is not None: output_dir = os.path.join(args.output_dir, output_dir) accelerator.save_state(output_dir) accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") parser.add_argument( "--checkpointing_steps", type=str, default=None, help="Whether the various states should be saved at the end of every n steps, or 'epoch' for each epoch.", ) parser.add_argument( "--resume_from_checkpoint", type=str, default=None, help="If the training should continue from a checkpoint folder.", ) parser.add_argument( "--use_stateful_dataloader", action="store_true", help="If the dataloader should be a resumable stateful dataloader.", ) parser.add_argument( "--with_tracking", action="store_true", help="Whether to load in all available experiment trackers from the environment and use them for logging.", ) parser.add_argument( "--output_dir", type=str, default=".", help="Optional save directory where all checkpoint folders will be stored. Default is the current working directory.", ) parser.add_argument( "--project_dir", type=str, default="logs", help="Location on where to store experiment tracking logs` and relevent project information", ) args = parser.parse_args() config = {"lr": 2e-5, "num_epochs": 3, "seed": 42, "batch_size": 16} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/config_yaml_templates/000077500000000000000000000000001521253476100220565ustar00rootroot00000000000000accelerate-1.14.0/examples/config_yaml_templates/README.md000066400000000000000000000007211521253476100233350ustar00rootroot00000000000000# Config Zoo This folder contains a variety of minimal configurations for `Accelerate` achieving certain goals. You can use these direct config YAML's, or build off of them for your own YAML's. These are highly annoted versions, aiming to teach you what each section does. Each config can be run via `accelerate launch --config_file {file} run_me.py` `run_me.py` will then print out how the current environment is setup (the contents of the `AcceleratorState`)accelerate-1.14.0/examples/config_yaml_templates/deepspeed.yaml000066400000000000000000000014741521253476100247060ustar00rootroot00000000000000# Similar to FSDP, we set the distributed type as DEEPSPEED distributed_type: DEEPSPEED # With DeepSpeed, we utilize a deepspeed config file for the entire configuration deepspeed_config: # Can also be any of the config json's in accelerate/examples/deepspeed_config_templates deepspeed_config_file: ../deepspeed_config_templates/zero_stage1_config.json # If using ZeRO-3 and wanting to load big models in, this should be set to `true` so # `transformers` uses the right `init` function zero3_init_flag: false # true # Finally we need to specify the number of accelerators to use num_processes: 2 # Optionally we can set the mixed precision now instead of in the deepspeed config file, # however this requires the `fp16` and `bf16` options to be set to `auto` in the deepspeed config file # mixed_precision: "bf16" accelerate-1.14.0/examples/config_yaml_templates/fp8.yaml000066400000000000000000000014351521253476100234420ustar00rootroot00000000000000# This config template simply setups up the TransformersEngine config (and a config for a single GPU), # this can interop with the other configs in this folder distributed_type: "NO" mixed_precision: "fp8" # Then we specify the fp8 configuration: fp8_config: backend: TE # Can be TE | MS-AMP # The following are TE specific arguments. # See https://docs.nvidia.com/deeplearning/transformer-engine/user-guide/api/common.html#common-api for more details amax_history_len: 1024 fp8_format: E4M3 interval: 1 margin: 0 override_linear_precision: [false, false, false] # Generally this should always be set to `false` to have the most realistic fp8 eval performance use_autocast_during_eval: false # If using MS-AMP, we ignore all of the prior and set a opt_level #opt_level: O1 accelerate-1.14.0/examples/config_yaml_templates/fsdp.yaml000066400000000000000000000013561521253476100237030ustar00rootroot00000000000000# Since we are doing FSDP (even though it's multi-accelerator), we need to specify the distributed type as FSDP distributed_type: FSDP # Can be one of "no", "fp16", or "bf16" (see `transformer_engine.yaml` for `fp8`, but it works for FSDP as well) mixed_precision: 'bf16' # Specify the number of accelerators to use num_processes: 2 # Then we can specify the FSDP config fsdp_config: fsdp_activation_checkpointing: false fsdp_auto_wrap_policy: TRANSFORMER_BASED_WRAP fsdp_backward_prefetch: BACKWARD_PRE fsdp_cpu_ram_efficient_loading: true fsdp_forward_prefetch: false fsdp_offload_params: false fsdp_sharding_strategy: FULL_SHARD fsdp_state_dict_type: SHARDED_STATE_DICT fsdp_sync_module_states: true fsdp_use_orig_params: true accelerate-1.14.0/examples/config_yaml_templates/multi_gpu.yaml000066400000000000000000000003561521253476100247530ustar00rootroot00000000000000# Specify distributed_type as `MULTI_GPU` for DDP distributed_type: "MULTI_GPU" # Can be one of "no", "fp16", or "bf16" (see `transformer_engine.yaml` for `fp8`) mixed_precision: "bf16" # Specify the number of GPUs to use num_processes: 2accelerate-1.14.0/examples/config_yaml_templates/multi_node.yaml000066400000000000000000000013771521253476100251110ustar00rootroot00000000000000# This config template is for a multi-node setup. This assumes DDP, but can be interop'd with the other configs in this folder # Generally it's recommended to look at the SLURM config template for a more robust multi-node setup distributed_type: MULTI_GPU # We need to specify the current machine's rank machine_rank: 0 # We then need to specify the IP address and port of the main process main_process_ip: '1234' main_process_port: 9999 # We need to specify the number of machines num_machines: 2 # We need to specify the *total* number of processes num_processes: 8 # And then we need to specify how rdvz comms will be handled rdzv_backend: static # or c10d # If the compute nodes are on the same network (cloud will more than likely be false) same_network: false accelerate-1.14.0/examples/config_yaml_templates/multi_xpu.yaml000066400000000000000000000003571521253476100247750ustar00rootroot00000000000000# Specify distributed_type as `MULTI_XPU` for DDP distributed_type: "MULTI_XPU" # Can be one of "no", "fp16", or "bf16" (see `transformer_engine.yaml` for `fp8`) mixed_precision: "bf16" # Specify the number of XPUs to use num_processes: 2 accelerate-1.14.0/examples/config_yaml_templates/run_me.py000066400000000000000000000017431521253476100237220ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ A base script which outputs the accelerate config for the given environment """ from accelerate import Accelerator accelerator = Accelerator() accelerator.print(f"Accelerator state from the current environment:\n{accelerator.state}") if accelerator.fp8_recipe_handler is not None: accelerator.print(f"FP8 config:\n{accelerator.fp8_recipe_handler}") accelerator.end_training() accelerate-1.14.0/examples/config_yaml_templates/single_accelerator.yaml000066400000000000000000000003041521253476100265640ustar00rootroot00000000000000# Since this is single GPU/XPU, we don't need distributed training distributed_type: "NO" # Can be one of "no", "fp16", or "bf16" (see `transformer_engine.yaml` for `fp8`) mixed_precision: "bf16" accelerate-1.14.0/examples/cv_example.py000066400000000000000000000203261521253476100202110ustar00rootroot00000000000000# Copyright 2021 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import argparse import os import re import numpy as np import PIL import torch from timm import create_model from torch.optim.lr_scheduler import OneCycleLR from torch.utils.data import DataLoader, Dataset from torchvision.transforms import Compose, RandomResizedCrop, Resize, ToTensor from accelerate import Accelerator from accelerate.utils import set_seed ######################################################################## # This is a fully working simple example to use Accelerate # # This example trains a ResNet50 on the Oxford-IIT Pet Dataset # in any of the following settings (with the same script): # - single CPU or single GPU # - multi GPUS (using PyTorch distributed mode) # - (multi) TPUs # - fp16 (mixed-precision) or fp32 (normal precision) # # To run it in each of these various modes, follow the instructions # in the readme for examples: # https://github.com/huggingface/accelerate/tree/main/examples # ######################################################################## # Function to get the label from the filename def extract_label(fname): stem = fname.split(os.path.sep)[-1] return re.search(r"^(.*)_\d+\.jpg$", stem).groups()[0] class PetsDataset(Dataset): def __init__(self, file_names, image_transform=None, label_to_id=None): self.file_names = file_names self.image_transform = image_transform self.label_to_id = label_to_id def __len__(self): return len(self.file_names) def __getitem__(self, idx): fname = self.file_names[idx] raw_image = PIL.Image.open(fname) image = raw_image.convert("RGB") if self.image_transform is not None: image = self.image_transform(image) label = extract_label(fname) if self.label_to_id is not None: label = self.label_to_id[label] return {"image": image, "label": label} def training_function(config, args): # Initialize accelerator accelerator = Accelerator(cpu=args.cpu, mixed_precision=args.mixed_precision) # Sample hyper-parameters for learning rate, batch size, seed and a few other HPs lr = config["lr"] num_epochs = int(config["num_epochs"]) seed = int(config["seed"]) batch_size = int(config["batch_size"]) image_size = config["image_size"] if not isinstance(image_size, (list, tuple)): image_size = (image_size, image_size) # Grab all the image filenames file_names = [os.path.join(args.data_dir, fname) for fname in os.listdir(args.data_dir) if fname.endswith(".jpg")] # Build the label correspondences all_labels = [extract_label(fname) for fname in file_names] id_to_label = list(set(all_labels)) id_to_label.sort() label_to_id = {lbl: i for i, lbl in enumerate(id_to_label)} # Set the seed before splitting the data. set_seed(seed) # Split our filenames between train and validation random_perm = np.random.permutation(len(file_names)) cut = int(0.8 * len(file_names)) train_split = random_perm[:cut] eval_split = random_perm[cut:] # For training we use a simple RandomResizedCrop train_tfm = Compose([RandomResizedCrop(image_size, scale=(0.5, 1.0)), ToTensor()]) train_dataset = PetsDataset( [file_names[i] for i in train_split], image_transform=train_tfm, label_to_id=label_to_id ) # For evaluation, we use a deterministic Resize eval_tfm = Compose([Resize(image_size), ToTensor()]) eval_dataset = PetsDataset([file_names[i] for i in eval_split], image_transform=eval_tfm, label_to_id=label_to_id) # Instantiate dataloaders. train_dataloader = DataLoader(train_dataset, shuffle=True, batch_size=batch_size, num_workers=4) eval_dataloader = DataLoader(eval_dataset, shuffle=False, batch_size=batch_size, num_workers=4) # Instantiate the model (we build the model here so that the seed also control new weights initialization) model = create_model("resnet50d", pretrained=True, num_classes=len(label_to_id)) # We could avoid this line since the accelerator is set with `device_placement=True` (default value). # Note that if you are placing tensors on devices manually, this line absolutely needs to be before the optimizer # creation otherwise training will not work on TPU (`accelerate` will kindly throw an error to make us aware of that). model = model.to(accelerator.device) # Freezing the base model for param in model.parameters(): param.requires_grad = False for param in model.get_classifier().parameters(): param.requires_grad = True # We normalize the batches of images to be a bit faster. mean = torch.tensor(model.default_cfg["mean"])[None, :, None, None].to(accelerator.device) std = torch.tensor(model.default_cfg["std"])[None, :, None, None].to(accelerator.device) # Instantiate optimizer optimizer = torch.optim.Adam(params=model.parameters(), lr=lr / 25) # Instantiate learning rate scheduler lr_scheduler = OneCycleLR(optimizer=optimizer, max_lr=lr, epochs=num_epochs, steps_per_epoch=len(train_dataloader)) # Prepare everything # There is no specific order to remember, we just need to unpack the objects in the same order we gave them to the # prepare method. model, optimizer, train_dataloader, eval_dataloader, lr_scheduler = accelerator.prepare( model, optimizer, train_dataloader, eval_dataloader, lr_scheduler ) # Now we train the model for epoch in range(num_epochs): model.train() for step, batch in enumerate(train_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch = {k: v.to(accelerator.device) for k, v in batch.items()} inputs = (batch["image"] - mean) / std outputs = model(inputs) loss = torch.nn.functional.cross_entropy(outputs, batch["label"]) accelerator.backward(loss) optimizer.step() lr_scheduler.step() optimizer.zero_grad() model.eval() accurate = 0 num_elems = 0 for _, batch in enumerate(eval_dataloader): # We could avoid this line since we set the accelerator with `device_placement=True`. batch = {k: v.to(accelerator.device) for k, v in batch.items()} inputs = (batch["image"] - mean) / std with torch.no_grad(): outputs = model(inputs) predictions = outputs.argmax(dim=-1) predictions, references = accelerator.gather_for_metrics((predictions, batch["label"])) accurate_preds = predictions == references num_elems += accurate_preds.shape[0] accurate += accurate_preds.long().sum() eval_metric = accurate.item() / num_elems # Use accelerator.print to print only on the main process. accelerator.print(f"epoch {epoch}: {100 * eval_metric:.2f}") accelerator.end_training() def main(): parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument("--data_dir", required=True, help="The data folder on disk.") parser.add_argument( "--mixed_precision", type=str, default=None, choices=["no", "fp16", "bf16", "fp8"], help="Whether to use mixed precision. Choose" "between fp16 and bf16 (bfloat16). Bf16 requires PyTorch >= 1.10." "and an Nvidia Ampere GPU.", ) parser.add_argument("--cpu", action="store_true", help="If passed, will train on the CPU.") args = parser.parse_args() config = {"lr": 3e-2, "num_epochs": 3, "seed": 42, "batch_size": 64, "image_size": 224} training_function(config, args) if __name__ == "__main__": main() accelerate-1.14.0/examples/deepspeed_config_templates/000077500000000000000000000000001521253476100230525ustar00rootroot00000000000000accelerate-1.14.0/examples/deepspeed_config_templates/zero_stage1_config.json000066400000000000000000000021441521253476100275160ustar00rootroot00000000000000{ "fp16": { "enabled": true, "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": "auto", "weight_decay": "auto", "torch_adam": true, "adam_w_mode": true } }, "scheduler": { "type": "WarmupDecayLR", "params": { "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto", "total_num_steps": "auto" } }, "zero_optimization": { "stage": 1, "allgather_partitions": true, "allgather_bucket_size": 2e8, "overlap_comm": true, "reduce_scatter": true, "reduce_bucket_size": "auto", "contiguous_gradients": true }, "gradient_accumulation_steps": 1, "gradient_clipping": "auto", "steps_per_print": 2000, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "wall_clock_breakdown": false }accelerate-1.14.0/examples/deepspeed_config_templates/zero_stage2_config.json000066400000000000000000000021441521253476100275170ustar00rootroot00000000000000{ "fp16": { "enabled": true, "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": "auto", "weight_decay": "auto", "torch_adam": true, "adam_w_mode": true } }, "scheduler": { "type": "WarmupDecayLR", "params": { "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto", "total_num_steps": "auto" } }, "zero_optimization": { "stage": 2, "allgather_partitions": true, "allgather_bucket_size": 2e8, "overlap_comm": true, "reduce_scatter": true, "reduce_bucket_size": "auto", "contiguous_gradients": true }, "gradient_accumulation_steps": 1, "gradient_clipping": "auto", "steps_per_print": 2000, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "wall_clock_breakdown": false }accelerate-1.14.0/examples/deepspeed_config_templates/zero_stage2_offload_config.json000066400000000000000000000023121521253476100312060ustar00rootroot00000000000000{ "fp16": { "enabled": true, "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": "auto", "weight_decay": "auto", "torch_adam": true, "adam_w_mode": true } }, "scheduler": { "type": "WarmupDecayLR", "params": { "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto", "total_num_steps": "auto" } }, "zero_optimization": { "stage": 2, "offload_optimizer": { "device": "cpu", "pin_memory": true }, "allgather_partitions": true, "allgather_bucket_size": 2e8, "overlap_comm": true, "reduce_scatter": true, "reduce_bucket_size": "auto", "contiguous_gradients": true }, "gradient_accumulation_steps": 1, "gradient_clipping": "auto", "steps_per_print": 2000, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "wall_clock_breakdown": false }accelerate-1.14.0/examples/deepspeed_config_templates/zero_stage3_config.json000066400000000000000000000023151521253476100275200ustar00rootroot00000000000000{ "fp16": { "enabled": true, "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": "auto", "weight_decay": "auto" } }, "scheduler": { "type": "WarmupDecayLR", "params": { "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto", "total_num_steps": "auto" } }, "zero_optimization": { "stage": 3, "overlap_comm": true, "contiguous_gradients": true, "reduce_bucket_size": "auto", "stage3_prefetch_bucket_size": "auto", "stage3_param_persistence_threshold": "auto", "sub_group_size": 1e9, "stage3_max_live_parameters": 1e9, "stage3_max_reuse_distance": 1e9, "stage3_gather_16bit_weights_on_model_save": "auto" }, "gradient_accumulation_steps": 1, "gradient_clipping": "auto", "steps_per_print": 2000, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "wall_clock_breakdown": false }accelerate-1.14.0/examples/deepspeed_config_templates/zero_stage3_offload_config.json000066400000000000000000000026251521253476100312160ustar00rootroot00000000000000{ "fp16": { "enabled": true, "loss_scale": 0, "loss_scale_window": 1000, "initial_scale_power": 16, "hysteresis": 2, "min_loss_scale": 1 }, "optimizer": { "type": "AdamW", "params": { "lr": "auto", "weight_decay": "auto" } }, "scheduler": { "type": "WarmupDecayLR", "params": { "warmup_min_lr": "auto", "warmup_max_lr": "auto", "warmup_num_steps": "auto", "total_num_steps": "auto" } }, "zero_optimization": { "stage": 3, "offload_optimizer": { "device": "cpu", "pin_memory": true }, "offload_param": { "device": "cpu", "pin_memory": true }, "overlap_comm": true, "contiguous_gradients": true, "reduce_bucket_size": "auto", "stage3_prefetch_bucket_size": "auto", "stage3_param_persistence_threshold": "auto", "sub_group_size": 1e9, "stage3_max_live_parameters": 1e9, "stage3_max_reuse_distance": 1e9, "stage3_gather_16bit_weights_on_model_save": "auto" }, "gradient_accumulation_steps": 1, "gradient_clipping": "auto", "steps_per_print": 2000, "train_batch_size": "auto", "train_micro_batch_size_per_gpu": "auto", "wall_clock_breakdown": false }accelerate-1.14.0/examples/finetune_lm_tpu.py000066400000000000000000000131141521253476100212600ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. # Example of fine-tuning a model on a TPU using FSDPv2, TRL and PEFT. # # Run the script with: # python finetune_lm_tpu.py [--model_id MODEL_ID] [--dataset_id DATASET_ID] # # This script has been tested on a TPU v5 litepod-8. import argparse import torch import torch_xla.runtime as xr from datasets import load_dataset from peft import LoraConfig from transformers import AutoModelForCausalLM, AutoTokenizer from trl import SFTConfig, SFTTrainer # FSDPv2 requires SPMD to be enabled. xr.use_spmd() def format_dolly(example, tokenizer): """Format Dolly dataset examples using the tokenizer's chat template.""" user_content = example["instruction"] if len(example["context"]) > 0: user_content += f"\n\nContext: {example['context']}" messages = [ { "role": "system", "content": "You are a helpful assistant", }, {"role": "user", "content": user_content}, {"role": "assistant", "content": example["response"]}, ] return tokenizer.apply_chat_template(messages, tokenize=False) def train(model_id, dataset): # Load model with low_cpu_mem_usage to avoid loading full model into CPU memory # FSDPv2 will handle sharding across TPUs model = AutoModelForCausalLM.from_pretrained( model_id, use_cache=False, torch_dtype=torch.bfloat16, low_cpu_mem_usage=True, device_map=None, # Let FSDP handle device placement ) tokenizer = AutoTokenizer.from_pretrained(model_id) if tokenizer.pad_token is None: if model.config.model_type == "llama": # Vanilla Llama models have a finetune gith pad id token tokenizer.pad_token = "<|finetune_right_pad_id|>" elif tokenizer.eos_token is not None: tokenizer.pad_token = tokenizer.eos_token else: raise ValueError(f"Cannot get or guess pad token for model {model_id}.") if tokenizer.chat_template is None: # Set chat template for Llama 3.1 format tokenizer.chat_template = ( "{% for message in messages %}" "{% if message['role'] == 'system' %}" "<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n{{ message['content'] }}<|eot_id|>" "{% elif message['role'] == 'user' %}" "<|start_header_id|>user<|end_header_id|>\n\n{{ message['content'] }}<|eot_id|>" "{% elif message['role'] == 'assistant' %}" "<|start_header_id|>assistant<|end_header_id|>\n\n{{ message['content'] }}<|eot_id|>" "{% endif %}" "{% endfor %}" "{% if add_generation_prompt %}" "<|start_header_id|>assistant<|end_header_id|>\n\n" "{% endif %}" ) # Try to guess the DecoderLayer class name, based on common model architectures transformer_layer_cls_to_wrap = model.model.layers[0].__class__.__name__ # Get FSDP training arguments fsdp_training_args = { "fsdp": "full_shard", "fsdp_config": { "transformer_layer_cls_to_wrap": [transformer_layer_cls_to_wrap], "xla": True, "xla_fsdp_v2": True, "xla_fsdp_grad_ckpt": True, }, } # Set up PEFT LoRA for fine-tuning. lora_config = LoraConfig( r=32, lora_alpha=128, lora_dropout=0.05, target_modules=["q_proj", "k_proj"], task_type="CAUSAL_LM", ) sft_config = SFTConfig( gradient_checkpointing=False, # Required on TPU, not supported max_length=1024, per_device_train_batch_size=4, num_train_epochs=3, max_steps=-1, output_dir="./output", optim="adafactor", logging_steps=1, dataloader_drop_last=True, # Required for FSDPv2. dataset_text_field="text", packing=True, **fsdp_training_args, ) # Set up the trainer trainer = SFTTrainer( model=model, train_dataset=dataset, args=sft_config, peft_config=lora_config, processing_class=tokenizer, formatting_func=lambda example: format_dolly(example, tokenizer), ) trainer.train() # ============================================================================= # Main Function # ============================================================================= if __name__ == "__main__": parser = argparse.ArgumentParser(description="Simple example of training script.") parser.add_argument( "--model_id", "-m", type=str, default="meta-llama/Llama-3.2-1B", help="Model id to use for training." ) parser.add_argument( "--dataset_id", "-d", type=str, default="databricks/databricks-dolly-15k", help="Dataset id to use for training.", ) args = parser.parse_args() # NOTE: this section can be adapted to load any dataset you want. dataset_id = args.dataset_id dolly_dataset = load_dataset(dataset_id, split="train") train( model_id=args.model_id, dataset=dolly_dataset, ) accelerate-1.14.0/examples/inference/000077500000000000000000000000001521253476100174475ustar00rootroot00000000000000accelerate-1.14.0/examples/inference/distributed/000077500000000000000000000000001521253476100217715ustar00rootroot00000000000000accelerate-1.14.0/examples/inference/distributed/README.md000066400000000000000000000011211521253476100232430ustar00rootroot00000000000000# Distributed inference examples This folder contains a variety of tutorials for running distributed inference with the following strategy: Load an entire model onto each GPU and sending chunks of a batch through each GPU’s model copy at a time ## Installation ```bash pip install accelerate torch ``` ## Running code You can either use `torchrun` or the recommended way of `accelerate launch` (without needing to run `accelerate config`) on each script: ```bash accelerate launch --num_processes {NUM_GPUS} phi2.py ``` Or: ```bash torchrun --nproc-per-node {NUM_GPUS} phi2.py ``` accelerate-1.14.0/examples/inference/distributed/distributed_image_generation.py000066400000000000000000000073541521253476100302530ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. """ Originally by jiwooya1000, put together together by sayakpaul. Documentation: https://huggingface.co/docs/diffusers/main/en/training/distributed_inference Run: accelerate launch distributed_image_generation.py --batch_size 8 # Enable memory optimizations for large models like SD3 accelerate launch distributed_image_generation.py --batch_size 8 --low_mem """ import os import time import fire import torch from datasets import load_dataset from diffusers import DiffusionPipeline from tqdm import tqdm from accelerate import PartialState from accelerate.utils import gather_object START_TIME = time.strftime("%Y%m%d_%H%M%S") DTYPE_MAP = {"fp32": torch.float32, "fp16": torch.float16, "bf16": torch.bfloat16} def get_batches(items, batch_size): num_batches = (len(items) + batch_size - 1) // batch_size batches = [] for i in range(num_batches): start_index = i * batch_size end_index = min((i + 1) * batch_size, len(items)) batch = items[start_index:end_index] batches.append(batch) return batches def main( ckpt_id: str = "PixArt-alpha/PixArt-Sigma-XL-2-1024-MS", save_dir: str = "./evaluation/examples", seed: int = 1, batch_size: int = 4, num_inference_steps: int = 20, guidance_scale: float = 4.5, dtype: str = "fp16", low_mem: bool = False, ): pipeline = DiffusionPipeline.from_pretrained(ckpt_id, torch_dtype=DTYPE_MAP[dtype]) save_dir = save_dir + f"_{START_TIME}" parti_prompts = load_dataset("nateraw/parti-prompts", split="train") data_loader = get_batches(items=parti_prompts["Prompt"], batch_size=batch_size) distributed_state = PartialState() if low_mem: pipeline.enable_model_cpu_offload(gpu_id=distributed_state.device.index) else: pipeline = pipeline.to(distributed_state.device) if distributed_state.is_main_process: if not os.path.exists(save_dir): os.makedirs(save_dir) print(f"Directory '{save_dir}' created successfully.") else: print(f"Directory '{save_dir}' already exists.") count = 0 for _, prompts_raw in tqdm(enumerate(data_loader), total=len(data_loader)): input_prompts = [] with distributed_state.split_between_processes(prompts_raw) as prompts: generator = torch.manual_seed(seed) images = pipeline( prompts, num_inference_steps=num_inference_steps, guidance_scale=guidance_scale, generator=generator ).images input_prompts.extend(prompts) distributed_state.wait_for_everyone() images = gather_object(images) input_prompts = gather_object(input_prompts) if distributed_state.is_main_process: for image, prompt in zip(images, input_prompts): count += 1 temp_dir = os.path.join(save_dir, f"example_{count}") os.makedirs(temp_dir) prompt = "_".join(prompt.split()) image.save(f"image_{prompt}.png") if distributed_state.is_main_process: print(f">>> Image Generation Finished. Saved in {save_dir}") if __name__ == "__main__": fire.Fire(main) accelerate-1.14.0/examples/inference/distributed/distributed_speech_generation.py000066400000000000000000000200001521253476100304170ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import json import os import pathlib import queue from concurrent.futures import ThreadPoolExecutor from typing import Union import fire import scipy.io.wavfile import torch from datasets import load_dataset from transformers import AutoTokenizer, VitsModel from accelerate import PartialState from accelerate.utils import tqdm """ Requirements: transformers accelerate fire scipy datasets pip install transformers accelerate fire scipy datasets Example usage: accelerate launch distributed_speech_generation.py --output_path outputs --batch_size 8 --num_workers 2 --dataset_split train """ """ To run the speech generation import scipy.io.wavfile import numpy as np from IPython.display import Audio sample_rate, audio_data = scipy.io.wavfile.read('path_to_you_wav_file.wav') audio_data = audio_data.astype(np.float32) / 32762.0 Audio(audio_data, rate=sample_rate) """ def load_pokemon_data(split: str, max_text_length: int): """Load Pokemon descriptions from the dataset""" ds = load_dataset("svjack/pokemon-blip-captions-en-zh", split=split) # Create dataset of dictionaries dataset = [] for idx, text in enumerate(ds["en_text"]): if len(text.strip()) > 0: # Skip empty descriptions dataset.append( { "id": f"pokemon_{idx:06d}", "text": text.strip()[:max_text_length], # Truncate long descriptions "original_text": text.strip(), # Keep original for metadata } ) return dataset class ExistsFilter: def __init__(self, output_dir: Union[pathlib.Path, str]): current_files = [f.split(".wav")[0] for f in os.listdir(output_dir) if f.endswith(".wav")] self.processed_files = set(current_files) print(f"Existing audio files found: {len(self.processed_files)}.") def __call__(self, x): return x["id"] not in self.processed_files def preprocess_fn(sample, tokenizer, max_text_length: int): inputs = tokenizer(sample["text"], padding=False, truncation=True, max_length=max_text_length, return_tensors="pt") return { "input_ids": inputs["input_ids"][0].tolist(), "attention_mask": inputs["attention_mask"][0].tolist(), "id": sample["id"], "text": sample["text"], "original_text": sample["original_text"], } def collate_fn(examples, tokenizer): """Collate batch of examples with proper padding""" # Find max length in this batch max_length = max(len(example["input_ids"]) for example in examples) # Pad sequences to max_length input_ids_list = [] attention_mask_list = [] for example in examples: # Get current lengths curr_len = len(example["input_ids"]) padding_length = max_length - curr_len # Pad sequences padded_input_ids = example["input_ids"] + [tokenizer.pad_token_id] * padding_length padded_attention_mask = example["attention_mask"] + [0] * padding_length input_ids_list.append(padded_input_ids) attention_mask_list.append(padded_attention_mask) # Convert to tensors input_ids = torch.tensor(input_ids_list, dtype=torch.long) attention_mask = torch.tensor(attention_mask_list, dtype=torch.long) ids = [example["id"] for example in examples] texts = [example["text"] for example in examples] original_texts = [example["original_text"] for example in examples] return { "input_ids": input_ids, "attention_mask": attention_mask, "ids": ids, "texts": texts, "original_texts": original_texts, } def create_dataloader(dataset, batch_size, distributed_state, tokenizer): """Create dataloader with preprocessing""" processed_dataset = [preprocess_fn(item, tokenizer, max_text_length=200) for item in dataset] # Split dataset for distributed processing if distributed_state.num_processes > 1: chunk_size = len(processed_dataset) // distributed_state.num_processes start_idx = distributed_state.process_index * chunk_size end_idx = ( start_idx + chunk_size if distributed_state.process_index < distributed_state.num_processes - 1 else len(processed_dataset) ) processed_dataset = processed_dataset[start_idx:end_idx] # Create batches batches = [] for i in range(0, len(processed_dataset), batch_size): batch = processed_dataset[i : i + batch_size] batches.append(collate_fn(batch, tokenizer)) return batches def save_results(output_queue: queue.Queue, output_dir: pathlib.Path, sampling_rate: int): while True: try: item = output_queue.get(timeout=5) if item is None: break waveforms, ids, texts, original_texts = item # Save each audio file and its metadata for waveform, file_id, text, original_text in zip(waveforms, ids, texts, original_texts): # Save audio wav_path = output_dir / f"{file_id}.wav" scipy.io.wavfile.write(wav_path, rate=sampling_rate, data=waveform.cpu().float().numpy()) # Save metadata with both truncated and original text metadata = { "text_used": text, "original_text": original_text, "model": "facebook/mms-tts-eng", "sampling_rate": sampling_rate, } metadata_path = output_dir / f"{file_id}_metadata.json" with metadata_path.open("w") as f: json.dump(metadata, f, indent=4) except queue.Empty: continue def main( output_path: str = "speech_data", batch_size: int = 8, num_workers: int = 2, dataset_split: str = "train", model_name: str = "facebook/mms-tts-eng", max_text_length: int = 200, ): output_dir = pathlib.Path(output_path) output_dir.mkdir(parents=True, exist_ok=True) distributed_state = PartialState() # Load model and tokenizer model = VitsModel.from_pretrained( model_name, device_map=distributed_state.device, torch_dtype=torch.float32, ) tokenizer = AutoTokenizer.from_pretrained(model_name) # Load and filter data dataset = load_pokemon_data(dataset_split, max_text_length) exist_filter = ExistsFilter(output_dir) dataset = [item for item in dataset if exist_filter(item)] distributed_state.print(f"Processing {len(dataset)} Pokemon descriptions") # Create dataloader batches = create_dataloader(dataset, batch_size, distributed_state, tokenizer) # Setup output queue and save thread output_queue = queue.Queue() save_thread = ThreadPoolExecutor(max_workers=num_workers) save_future = save_thread.submit(save_results, output_queue, output_dir, model.config.sampling_rate) try: for batch in tqdm(batches, desc="Generating Pokemon descriptions"): with torch.no_grad(): outputs = model( input_ids=batch["input_ids"].to(distributed_state.device, dtype=torch.long), attention_mask=batch["attention_mask"].to(distributed_state.device, dtype=torch.long), ).waveform output_queue.put((outputs, batch["ids"], batch["texts"], batch["original_texts"])) finally: output_queue.put(None) save_thread.shutdown(wait=True) save_future.result() if __name__ == "__main__": fire.Fire(main) accelerate-1.14.0/examples/inference/distributed/florence2.py000066400000000000000000000160251521253476100242260ustar00rootroot00000000000000# Copyright 2024 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import json import os import pathlib import queue from concurrent.futures import ThreadPoolExecutor from functools import partial from typing import Union import fire import torch import webdataset as wds from huggingface_hub.utils import insecure_hashlib from PIL import Image from tqdm import tqdm from transformers import AutoModelForCausalLM, AutoProcessor from accelerate import PartialState """ Additional requirements: flash_attn einops timm webdataset fire tqdm huggingface_hub pip install flash_attn einops timm webdataset fire tqdm huggingface_hub Example: accelerate launch --num_processes=2 florence2.py --data_path "https://huggingface.co/datasets/pixparse/cc3m-wds/resolve/main/cc3m-train-0000.tar" --output_path outputs --batch_size 12 --num_workers 1 --prompt "" """ def main( data_path: str, output_path: str, batch_size: int, num_workers: int, prompt: str = "", model_name: str = "microsoft/Florence-2-large", max_new_tokens: int = 1024, num_beams: int = 3, ): output_dir = pathlib.Path(output_path) distributed_state = PartialState() if distributed_state.is_main_process: output_dir.mkdir(exist_ok=True) model = AutoModelForCausalLM.from_pretrained( model_name, device_map=distributed_state.device, torch_dtype=torch.float16, trust_remote_code=True, ) processor = AutoProcessor.from_pretrained(model_name, trust_remote_code=True, clean_up_tokenization_spaces=True) class ExistsFilter: def __init__(self, output_dir: Union[pathlib.Path, str]): current_training_img_hashes = [f.split(".jpg")[0] for f in os.listdir(output_dir) if f.endswith(".jpg")] self.current_training_img_hashes = set(current_training_img_hashes) if distributed_state.is_main_process: print(f"Existing images found: {len(self.current_training_img_hashes)}.") def __call__(self, x): if len(self.current_training_img_hashes) > 0: if x["img_hash"] in self.current_training_img_hashes: return False else: return True else: return True def preprocess_fn(sample, processor): image: Image.Image = sample["jpg"].convert("RGB") img_hash = insecure_hashlib.sha1(image.tobytes()).hexdigest() inputs = processor( text=prompt, images=image, return_tensors="pt", ) return { "input_ids": inputs["input_ids"], "pixel_values": inputs["pixel_values"], "image": image, "img_hash": img_hash, "original_caption": sample["txt"], } def collate_fn(examples): input_ids = torch.cat([example["input_ids"] for example in examples]) pixel_values = torch.cat([example["pixel_values"] for example in examples]) images = [example["image"] for example in examples] img_hashes = [example["img_hash"] for example in examples] captions = [example["original_caption"] for example in examples] return { "input_ids": input_ids, "pixel_values": pixel_values, "images": images, "img_hashes": img_hashes, "original_captions": captions, } exist_filter = ExistsFilter(output_dir) dataset = ( wds.WebDataset( data_path, handler=wds.warn_and_continue, nodesplitter=None, shardshuffle=False, empty_check=False, ) .decode("pil", handler=wds.warn_and_continue) .map(partial(preprocess_fn, processor=processor), handler=wds.warn_and_continue) ) if len(exist_filter.current_training_img_hashes) > 0: dataset = dataset.select(exist_filter) dataset = dataset.batched( batch_size, partial=False, collation_fn=collate_fn, ) dataloader = wds.WebLoader( dataset, batch_size=None, num_workers=num_workers, pin_memory=True, persistent_workers=True, ) def save_results(output_queue: queue.Queue, output_dir: pathlib.Path, processor): while True: try: item = output_queue.get(timeout=5) if item is None: break original_captions, predictions, images, img_hashes = item predicted_captions = processor.batch_decode( predictions, skip_special_tokens=False, ) for caption, pred_caption, image, img_hash in zip( original_captions, predicted_captions, images, img_hashes ): processed_caption = processor.post_process_generation( pred_caption, task=prompt, image_size=(image.width, image.height) )[prompt] img_path = output_dir.joinpath(f"{img_hash}.jpg") image.save(img_path) caption_dict = {"original": caption, "predicted": processed_caption} with output_dir.joinpath(f"{img_hash}_caption.json").open("w") as f: json.dump(caption_dict, f, indent=4) except queue.Empty: continue output_queue = queue.Queue() save_thread = ThreadPoolExecutor(max_workers=num_workers) save_future = save_thread.submit(save_results, output_queue, output_dir, processor) try: for _, batch_raw in tqdm( enumerate(dataloader), disable=not distributed_state.is_main_process, ): with distributed_state.split_between_processes(batch_raw) as batch: outputs = model.generate( input_ids=batch["input_ids"].to(distributed_state.device), pixel_values=batch["pixel_values"].to(distributed_state.device, model.dtype), max_new_tokens=max_new_tokens, num_beams=num_beams, ) output_queue.put( ( batch["original_captions"], outputs, batch["images"], batch["img_hashes"], ) ) finally: output_queue.put(None) save_thread.shutdown(wait=True) save_future.result() if __name__ == "__main__": fire.Fire(main) accelerate-1.14.0/examples/inference/distributed/llava_next_video.py000066400000000000000000000150311521253476100256660ustar00rootroot00000000000000# Copyright 2025 The HuggingFace Inc. team. All rights reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import json import os import pathlib import queue import time from concurrent.futures import ThreadPoolExecutor import av import fire import numpy as np import torch from huggingface_hub import snapshot_download from tqdm import tqdm from transformers import LlavaNextVideoForConditionalGeneration, LlavaNextVideoProcessor from accelerate import PartialState START_TIME = time.strftime("%Y%m%d_%H%M%S") DTYPE_MAP = {"fp32": torch.float32, "fp16": torch.float16, "bf16": torch.bfloat16} """ Example: accelerate launch llava_next_video.py """ def save_results(output_queue: queue.Queue, output_dir: pathlib.Path): count = 0 while True: try: item = output_queue.get(timeout=5) if item is None: break prompt, video, generated_text = item example_file = f"example_{count}" temp_dir = os.path.join(output_dir, example_file) metadata = {"prompt": prompt, "video": video, "generated_text": generated_text} with open(temp_dir, "w") as f: json.dump(metadata, f, indent=4) count += 1 except queue.Empty: continue def get_batches(processed_videos, batch_size): num_batches = (len(processed_videos) + batch_size - 1) // batch_size batches = [] for i in range(num_batches): start_index = i * batch_size end_index = min((i + 1) * batch_size, len(processed_videos)) batch = processed_videos[start_index:end_index] batches.append(batch) return batches def read_video_pyav(container, indices): """ Decode the video with PyAV decoder. Args: container (`av.container.input.InputContainer`): PyAV container. indices (`List[int]`): List of frame indices to decode. Returns: result (np.ndarray): np array of decoded frames of shape (num_frames, height, width, 3). """ frames = [] container.seek(0) start_index = indices[0] end_index = indices[-1] for i, frame in enumerate(container.decode(video=0)): if i > end_index: break if i >= start_index and i in indices: frames.append(frame) return np.stack([x.to_ndarray(format="rgb24") for x in frames]) def get_video_paths(video_dir): """Get paths to all video files in the directory and its subdirectories.""" video_extensions = (".mp4", ".avi", ".mov", ".mkv") # Add more extensions if needed video_paths = [] for root, _, files in os.walk(video_dir): for file in files: if file.lower().endswith(video_extensions): video_paths.append(os.path.join(root, file)) return video_paths def process_videos(video_paths, processor, prompt, frames_per_video): """Process a batch of videos and prepare them for the model.""" batch_inputs = [] for video_path in video_paths: try: with av.open(video_path) as container: total_frames = container.streams.video[0].frames indices = np.arange(0, total_frames, total_frames / frames_per_video).astype(int) clip = read_video_pyav(container, indices) processed = processor(text=prompt, videos=clip, return_tensors="pt") batch_inputs.append( { "input_ids": processed["input_ids"], "pixel_values_videos": processed["pixel_values_videos"], "video": video_path, } ) except Exception as e: print(f"Error processing video {video_path}: {str(e)}") continue return batch_inputs def main( model_name: str = "llava-hf/LLaVA-NeXT-Video-7B-hf", save_dir: str = "./evaluation/examples", prompt: str = "USER: