pax_global_header00006660000000000000000000000064151653223230014514gustar00rootroot0000000000000052 comment=78ed30837a607deab7cf0a12dca072bf3f63417a jupyter-nbconvert-5db0bfc/000077500000000000000000000000001516532232300157635ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/.git-blame-ignore-revs000066400000000000000000000001071516532232300220610ustar00rootroot00000000000000# Initial pre-commit reformat 68b496b7fcf4cfbffe9e1656ac52400a24cacc45 jupyter-nbconvert-5db0bfc/.github/000077500000000000000000000000001516532232300173235ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/.github/ISSUE_TEMPLATE/000077500000000000000000000000001516532232300215065ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000007701516532232300242040ustar00rootroot00000000000000______________________________________________________________________ ## name: Bug report about: Create a report to help us improve **Nbconvert version:** jupyter-nbconvert-5db0bfc/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000005561516532232300252410ustar00rootroot00000000000000______________________________________________________________________ ## name: Feature Request about: Suggest an idea for this project jupyter-nbconvert-5db0bfc/.github/ISSUE_TEMPLATE/question.md000066400000000000000000000004061516532232300236770ustar00rootroot00000000000000______________________________________________________________________ ## name: Question about: If you need some help labels: question If you have a question, you can file an issue here or preferably ask on [Jupyter Discourse](https://discourse.jupyter.org/). jupyter-nbconvert-5db0bfc/.github/dependabot.yml000066400000000000000000000004301516532232300221500ustar00rootroot00000000000000version: 2 updates: # Set update schedule for GitHub Actions - package-ecosystem: "github-actions" directory: "/" schedule: # Check for updates to GitHub Actions every weekday interval: "weekly" groups: actions: patterns: - "*" jupyter-nbconvert-5db0bfc/.github/workflows/000077500000000000000000000000001516532232300213605ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/.github/workflows/docs.yml000066400000000000000000000023231516532232300230330ustar00rootroot00000000000000name: Docs on: push: branches: [main] pull_request: concurrency: group: docs-${{ github.ref }} cancel-in-progress: true jobs: generate-docs: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.10", "3.14"] steps: - name: Check out repository code uses: actions/checkout@v6 - name: Install dependencies run: | sudo apt-get update sudo apt-get install texlive-plain-generic inkscape texlive-xetex latexmk enchant-2 # pandoc is not up to date in the ubuntu repos, so we install directly wget https://github.com/jgm/pandoc/releases/download/3.1.2/pandoc-3.1.2-1-amd64.deb && sudo dpkg -i pandoc-3.1.2-1-amd64.deb - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Install run: pip install -v ".[all]" - name: List installed packages run: | pip freeze pip check - name: Build HTML docs run: | cd docs make html SPHINXOPTS="-W" - name: Upload HTML uses: actions/upload-artifact@v7 with: name: html-${{ github.job }}-${{ strategy.job-index }} path: build/sphinx/html jupyter-nbconvert-5db0bfc/.github/workflows/enforce-label.yml000066400000000000000000000005001516532232300245740ustar00rootroot00000000000000name: Enforce PR label on: pull_request: types: [labeled, unlabeled, opened, edited, synchronize] jobs: enforce-label: runs-on: ubuntu-latest permissions: pull-requests: write steps: - name: enforce-triage-label uses: jupyterlab/maintainer-tools/.github/actions/enforce-label@v1 jupyter-nbconvert-5db0bfc/.github/workflows/prep-release.yml000066400000000000000000000027201516532232300244700ustar00rootroot00000000000000name: "Step 1: Prep Release" on: workflow_dispatch: inputs: version_spec: description: "New Version Specifier" default: "next" required: false branch: description: "The branch to target" required: false post_version_spec: description: "Post Version Specifier" required: false since: description: "Use PRs with activity since this date or git reference" required: false since_last_stable: description: "Use PRs with activity since the last stable git tag" required: false type: boolean jobs: prep_release: runs-on: ubuntu-latest permissions: contents: write steps: - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Prep Release id: prep-release uses: jupyter-server/jupyter_releaser/.github/actions/prep-release@v2 with: token: ${{ secrets.GITHUB_TOKEN }} version_spec: ${{ github.event.inputs.version_spec }} post_version_spec: ${{ github.event.inputs.post_version_spec }} target: ${{ github.event.inputs.target }} branch: ${{ github.event.inputs.branch }} since: ${{ github.event.inputs.since }} since_last_stable: ${{ github.event.inputs.since_last_stable }} - name: "** Next Step **" run: | echo "Optional): Review Draft Release: ${{ steps.prep-release.outputs.release_url }}" jupyter-nbconvert-5db0bfc/.github/workflows/publish-release.yml000066400000000000000000000036511516532232300251740ustar00rootroot00000000000000name: "Step 2: Publish Release" on: workflow_dispatch: inputs: branch: description: "The target branch" required: false release_url: description: "The URL of the draft GitHub release" required: false steps_to_skip: description: "Comma separated list of steps to skip" required: false jobs: publish_release: runs-on: ubuntu-latest environment: release permissions: id-token: write steps: - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - uses: actions/create-github-app-token@v3 id: app-token with: app-id: ${{ vars.APP_ID }} private-key: ${{ secrets.APP_PRIVATE_KEY }} - name: Populate Release id: populate-release uses: jupyter-server/jupyter_releaser/.github/actions/populate-release@v2 with: token: ${{ steps.app-token.outputs.token }} target: ${{ github.event.inputs.target }} branch: ${{ github.event.inputs.branch }} release_url: ${{ github.event.inputs.release_url }} steps_to_skip: ${{ github.event.inputs.steps_to_skip }} - name: Finalize Release id: finalize-release env: NPM_TOKEN: ${{ secrets.NPM_TOKEN }} uses: jupyter-server/jupyter-releaser/.github/actions/finalize-release@v2 with: token: ${{ steps.app-token.outputs.token }} target: ${{ github.event.inputs.target }} release_url: ${{ steps.populate-release.outputs.release_url }} - name: "** Next Step **" if: ${{ success() }} run: | echo "Verify the final release" echo ${{ steps.finalize-release.outputs.release_url }} - name: "** Failure Message **" if: ${{ failure() }} run: | echo "Failed to Publish the Draft Release Url:" echo ${{ steps.populate-release.outputs.release_url }} jupyter-nbconvert-5db0bfc/.github/workflows/tests.yml000066400000000000000000000142401516532232300232460ustar00rootroot00000000000000name: Tests on: push: branches: [main] pull_request: schedule: - cron: "0 8 * * *" concurrency: group: tests-${{ github.ref }} cancel-in-progress: true defaults: run: shell: bash -eux {0} jobs: run-tests: runs-on: ${{ matrix.os }} env: NBFORMAT_VALIDATOR: jsonschema strategy: matrix: os: ["ubuntu-22.04", "macos-latest", "windows-latest"] python-version: ["3.12", "3.13", "3.14", "3.14t"] include: - os: "macos-latest" python-version: "3.10" - os: "ubuntu-22.04" python-version: "3.11" fail-fast: false steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Install Linux dependencies if: startsWith(runner.os, 'Linux') run: | sudo apt-get update sudo apt-get install texlive-plain-generic inkscape texlive-xetex latexmk sudo apt-get install xvfb x11-utils libxkbcommon-x11-0 libxcb-xinerama0 python3-pyqt5 # pandoc is not up to date in the ubuntu repos, so we install directly wget https://github.com/jgm/pandoc/releases/download/3.1.2/pandoc-3.1.2-1-amd64.deb && sudo dpkg -i pandoc-3.1.2-1-amd64.deb - name: Run tests on Linux if: ${{ startsWith(runner.os, 'linux') }} run: | # cov: is not installable on free-threaded yet if [[ "${{ matrix.python-version }}" == *t ]]; then target="test:test" else target="cov:test" fi xvfb-run --auto-servernum hatch run $target - name: Run tests on other platforms if: ${{ !startsWith(runner.os, 'linux') }} run: | if [[ "${{ matrix.python-version }}" == *t ]]; then target="test:nowarn" else target="cov:nowarn" fi hatch run $target - uses: jupyterlab/maintainer-tools/.github/actions/upload-coverage@v1 coverage: runs-on: ubuntu-latest needs: - run-tests steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/report-coverage@v1 test_lint: name: Test Lint runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Run Linters run: | hatch run typing:test hatch run lint:build pipx run interrogate -v . pipx run doc8 --max-line-length=200 --ignore-path=docs/source/other/full-config.rst check_release: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - run: pip install -e . - uses: jupyter-server/jupyter_releaser/.github/actions/check-release@v2 with: version_spec: 10.10.10 token: ${{ secrets.GITHUB_TOKEN }} check_links: runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - uses: jupyterlab/maintainer-tools/.github/actions/check-links@v1 with: ignore_links: ^https://ipywidgets.readthedocs.io/en/latest/examples/Output ^https://nbviewer.jupyter.org test_minimum_versions: name: Test Minimum Versions timeout-minutes: 20 runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Base Setup uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 with: dependency_type: minimum - name: Install dependencies run: | sudo apt-get update sudo apt-get install texlive-plain-generic inkscape texlive-xetex latexmk sudo apt-get install xvfb x11-utils libxkbcommon-x11-0 libxcb-xinerama0 python3-pyqt5 # pandoc is not up to date in the ubuntu repos, so we install directly wget https://github.com/jgm/pandoc/releases/download/2.9.2.1/pandoc-2.9.2.1-1-amd64.deb && sudo dpkg -i pandoc-2.9.2.1-1-amd64.deb - name: Run tests run: | # Attempt to work around https://github.com/pypa/pip/issues/12781 PIP_CONSTRAINT= hatch env run -e test -- pip install 'pip>=24.2' xvfb-run --auto-servernum hatch run test:nowarn test_mistune_30: name: Test Mistune 3.0 timeout-minutes: 20 runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: Base Setup uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - name: Install dependencies run: | sudo apt-get update sudo apt-get install texlive-plain-generic inkscape texlive-xetex latexmk sudo apt-get install xvfb x11-utils libxkbcommon-x11-0 libxcb-xinerama0 python3-pyqt5 # pandoc is not up to date in the ubuntu repos, so we install directly wget https://github.com/jgm/pandoc/releases/download/2.9.2.1/pandoc-2.9.2.1-1-amd64.deb && sudo dpkg -i pandoc-2.9.2.1-1-amd64.deb - name: Run tests run: | hatch env run -e test -- pip install 'mistune~=3.0.0' xvfb-run --auto-servernum hatch run test:nowarn test_prereleases: name: Test Prereleases runs-on: ubuntu-latest timeout-minutes: 20 steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 with: dependency_type: pre python_version: "3.14" - name: Run the tests run: | export NBFORMAT_VALIDATOR=jsonschema hatch run test:nowarn make_sdist: name: Make SDist runs-on: ubuntu-latest timeout-minutes: 10 steps: - uses: actions/checkout@v6 - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - uses: jupyterlab/maintainer-tools/.github/actions/make-sdist@v1 test_sdist: runs-on: ubuntu-latest needs: [make_sdist] name: Install from SDist and Test timeout-minutes: 20 steps: - uses: jupyterlab/maintainer-tools/.github/actions/base-setup@v1 - uses: jupyterlab/maintainer-tools/.github/actions/test-sdist@v1 jupyter-nbconvert-5db0bfc/.gitignore000066400000000000000000000013741516532232300177600ustar00rootroot00000000000000MANIFEST build dist _build docs/man/*.gz docs/source/api/generated docs/source/config/options docs/source/interactive/magics-generated.txt docs/gh-pages docs/source/CHANGELOG.md nbconvert/resources/style.min.css tests/files/*.html *.py[co] __pycache__ *.egg-info *~ *.bak .ipynb_checkpoints .tox .DS_Store \#*# .#* .coverage* htmlcov .cache docs/source/*.tpl docs/source/*.j2 docs/source/example.html docs/source/mytemplate/* docs/source/config_options.rst .venv # Eclipse pollutes the filesystem .project .pydevproject .settings # VSCode *.code-workspace .history .vscode # Downloaded theme files share/templates/lab/static/index.css share/templates/lab/static/theme-dark.css share/templates/lab/static/theme-light.css share/templates/classic/static/style.css jupyter-nbconvert-5db0bfc/.mailmap000066400000000000000000000250661516532232300174150ustar00rootroot00000000000000A. J. Holyoake ajholyoake Aaron Culich Aaron Culich Aron Ahmadia ahmadia Benjamin Ragan-Kelley Benjamin Ragan-Kelley Min RK Benjamin Ragan-Kelley MinRK Barry Wark Barry Wark Ben Edwards Ben Edwards Bradley M. Froehle Bradley M. Froehle Bradley M. Froehle Bradley Froehle Brandon Parsons Brandon Parsons Brian E. Granger Brian Granger Brian E. Granger Brian Granger <> Brian E. Granger bgranger <> Brian E. Granger bgranger Christoph Gohlke cgohlke Cyrille Rossant rossant Damián Avila damianavila Damián Avila damianavila Damon Allen damontallen Darren Dale darren.dale <> Darren Dale Darren Dale <> Dav Clark Dav Clark <> Dav Clark Dav Clark David Hirschfeld dhirschfeld David P. Sanders David P. Sanders David Warde-Farley David Warde-Farley <> Doug Blank Doug Blank Eugene Van den Bulke Eugene Van den Bulke Evan Patterson Evan Patterson Evan Patterson Evan Patterson Evan Patterson epatters Evan Patterson epatters Ernie French Ernie French Ernie French ernie french Ernie French ernop Fernando Perez Fernando Perez Fernando Perez Fernando Perez fperez <> Fernando Perez fptest <> Fernando Perez fptest1 <> Fernando Perez Fernando Perez Fernando Perez Fernando Perez <> Fernando Perez Fernando Perez Frank Murphy Frank Murphy Gabriel Becker gmbecker Gael Varoquaux gael.varoquaux <> Gael Varoquaux gvaroquaux Gael Varoquaux Gael Varoquaux <> Ingolf Becker watercrossing Jake Vanderplas Jake Vanderplas Jakob Gager jakobgager Jakob Gager jakobgager Jakob Gager jakobgager Jason Grout Jason Grout Jason Gors jason gors Jason Gors jgors Jens Hedegaard Nielsen Jens Hedegaard Nielsen Jens Hedegaard Nielsen Jens H Nielsen Jens Hedegaard Nielsen Jens H. Nielsen Jez Ng Jez Ng Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic Jonathan Frederic jon Jonathan Frederic U-Jon-PC\Jon Jonathan March Jonathan March Jonathan March jdmarch Jörgen Stenarson Jörgen Stenarson Jörgen Stenarson Jorgen Stenarson Jörgen Stenarson Jorgen Stenarson <> Jörgen Stenarson jstenar Jörgen Stenarson jstenar <> Jörgen Stenarson Jörgen Stenarson Juergen Hasch juhasch Juergen Hasch juhasch Julia Evans Julia Evans Kester Tong KesterTong Kyle Kelley Kyle Kelley Kyle Kelley rgbkrk Laurent Dufréchou Laurent Dufréchou Laurent Dufréchou laurent dufrechou <> Laurent Dufréchou laurent.dufrechou <> Laurent Dufréchou Laurent Dufrechou <> Laurent Dufréchou laurent.dufrechou@gmail.com <> Laurent Dufréchou ldufrechou Lorena Pantano Lorena Luis Pedro Coelho Luis Pedro Coelho Marc Molla marcmolla Martín Gaitán Martín Gaitán Matthias Bussonnier Matthias BUSSONNIER Matthias Bussonnier Bussonnier Matthias Matthias Bussonnier Matthias BUSSONNIER Matthias Bussonnier Matthias Bussonnier Michael Droettboom Michael Droettboom Nicholas Bollweg Nicholas Bollweg (Nick) Nicolas Rougier Nikolay Koldunov Nikolay Koldunov Omar Andrés Zapata Mesa Omar Andres Zapata Mesa Omar Andrés Zapata Mesa Omar Andres Zapata Mesa Pankaj Pandey Pankaj Pandey Pascal Schetelat pascal-schetelat Paul Ivanov Paul Ivanov Pauli Virtanen Pauli Virtanen <> Pauli Virtanen Pauli Virtanen Pierre Gerold Pierre Gerold Pietro Berkes Pietro Berkes Piti Ongmongkolkul piti118 Prabhu Ramachandran Prabhu Ramachandran <> Puneeth Chaganti Puneeth Chaganti Robert Kern rkern <> Robert Kern Robert Kern Robert Kern Robert Kern Robert Kern Robert Kern <> Robert Marchman Robert Marchman Satrajit Ghosh Satrajit Ghosh Satrajit Ghosh Satrajit Ghosh Scott Sanderson Scott Sanderson smithj1 smithj1 smithj1 smithj1 Steven Johnson stevenJohnson Steven Silvester blink1073 S. Weber s8weber Stefan van der Walt Stefan van der Walt Silvia Vinyes Silvia Silvia Vinyes silviav12 Sylvain Corlay Sylvain Corlay sylvain.corlay Ted Drain TD22057 Théophile Studer Théophile Studer Thomas Kluyver Thomas Thomas Spura Thomas Spura Timo Paulssen timo vds vds2212 vds vds Ville M. Vainio Ville M. Vainio ville Ville M. Vainio ville Ville M. Vainio vivainio <> Ville M. Vainio Ville M. Vainio Ville M. Vainio Ville M. Vainio Walter Doerwald walter.doerwald <> Walter Doerwald Walter Doerwald <> W. Trevor King W. Trevor King Yoval P. y-p jupyter-nbconvert-5db0bfc/.pre-commit-config.yaml000066400000000000000000000046131516532232300222500ustar00rootroot00000000000000ci: autoupdate_schedule: monthly autoupdate_commit_msg: "chore: update pre-commit hooks" repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v6.0.0 hooks: - id: check-case-conflict - id: check-ast - id: check-docstring-first - id: check-executables-have-shebangs - id: check-added-large-files - id: check-case-conflict - id: check-merge-conflict - id: check-json - id: check-toml - id: check-yaml - id: debug-statements - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/python-jsonschema/check-jsonschema rev: 0.37.1 hooks: - id: check-github-workflows - repo: https://github.com/hukkin/mdformat rev: 1.0.0 hooks: - id: mdformat - repo: https://github.com/pre-commit/mirrors-prettier rev: "v4.0.0-alpha.8" hooks: - id: prettier types_or: [yaml, html, json] - repo: https://github.com/adamchainz/blacken-docs rev: "1.20.0" hooks: - id: blacken-docs additional_dependencies: [black==23.7.0] - repo: https://github.com/codespell-project/codespell rev: "v2.4.2" hooks: - id: codespell args: ["-L", "sur,nd,assertin"] - repo: https://github.com/pre-commit/mirrors-mypy rev: "v1.20.0" hooks: - id: mypy files: "^nbconvert" stages: [manual] args: ["--install-types", "--non-interactive"] additional_dependencies: [ "traitlets>=5.13", "jupyter_core>=5.3", "jinja2", "nbformat", "markupsafe", "mistune", "nbclient>=0.9", "defusedxml", "ipython", "packaging", "pandocfilters", "jupyterlab_pygments", ] - repo: https://github.com/pre-commit/pygrep-hooks rev: "v1.10.0" hooks: - id: rst-backticks - id: rst-directive-colons - id: rst-inline-touching-normal - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.15.9 hooks: - id: ruff-check types_or: [python, jupyter] args: ["--fix", "--show-fixes"] - id: ruff-format types_or: [python, jupyter] - repo: https://github.com/scientific-python/cookie rev: "2026.04.04" hooks: - id: sp-repo-review additional_dependencies: ["repo-review[cli]"] jupyter-nbconvert-5db0bfc/.prettierignore000066400000000000000000000000231516532232300210210ustar00rootroot00000000000000tests/files/*.html jupyter-nbconvert-5db0bfc/.readthedocs.yaml000066400000000000000000000005511516532232300212130ustar00rootroot00000000000000# .readthedocs.yml # Read the Docs configuration file # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details # Required version: 2 sphinx: configuration: docs/source/conf.py formats: all python: install: - method: pip path: . extra_requirements: - docs build: os: ubuntu-22.04 tools: python: "3.11" jupyter-nbconvert-5db0bfc/CHANGELOG.md000066400000000000000000003343221516532232300176030ustar00rootroot00000000000000# Changes in nbconvert ## 7.17.1 This is a security release, fixing two CVEs: - [CVE-2026-39377](https://github.com/jupyter/nbconvert/security/advisories/GHSA-4c99-qj7h-p3vg) - [CVE-2026-39378](https://github.com/jupyter/nbconvert/security/advisories/GHSA-7jqv-fw35-gmx9) (full advisories will be published seven days after release, on 2026-04-14). ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.17.0...b3b6ec01f872e9af8fd1769eb9cf1889c720ecf3)) ### Enhancements made - Allow configureable WebPDF JavaScript processing timeout [#2250](https://github.com/jupyter/nbconvert/pull/2250) ([@timkpaine](https://github.com/timkpaine), [@Carreau](https://github.com/Carreau)) ### Bugs fixed - Fix `PermissionError` when checking template paths on shared filesystems [#2252](https://github.com/jupyter/nbconvert/pull/2252) ([@ctcjab](https://github.com/ctcjab), [@krassowski](https://github.com/krassowski)) - Tweak webpdf template logic to fix duplicate extension problem [#2249](https://github.com/jupyter/nbconvert/pull/2249) ([@timkpaine](https://github.com/timkpaine), [@Carreau](https://github.com/Carreau)) ### Maintenance and upkeep improvements - specify python version for pre [#2276](https://github.com/jupyter/nbconvert/pull/2276) ([@minrk](https://github.com/minrk), [@krassowski](https://github.com/krassowski)) ### Contributors to this release The following people contributed discussions, new ideas, code and documentation contributions, and review. See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports). ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2026-01-29&to=2026-04-08&type=c)) @akhmerov ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aakhmerov+updated%3A2026-01-29..2026-04-08&type=Issues)) | @bollwyvl ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abollwyvl+updated%3A2026-01-29..2026-04-08&type=Issues)) | @Carreau ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ACarreau+updated%3A2026-01-29..2026-04-08&type=Issues)) | @ctcjab ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Actcjab+updated%3A2026-01-29..2026-04-08&type=Issues)) | @davidbrochart ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Adavidbrochart+updated%3A2026-01-29..2026-04-08&type=Issues)) | @Ken-B ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AKen-B+updated%3A2026-01-29..2026-04-08&type=Issues)) | @krassowski ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Akrassowski+updated%3A2026-01-29..2026-04-08&type=Issues)) | @mgeier ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Amgeier+updated%3A2026-01-29..2026-04-08&type=Issues)) | @minrk ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aminrk+updated%3A2026-01-29..2026-04-08&type=Issues)) | @mpacer ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ampacer+updated%3A2026-01-29..2026-04-08&type=Issues)) | @MSeal ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AMSeal+updated%3A2026-01-29..2026-04-08&type=Issues)) | @SylvainCorlay ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ASylvainCorlay+updated%3A2026-01-29..2026-04-08&type=Issues)) | @takluyver ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Atakluyver+updated%3A2026-01-29..2026-04-08&type=Issues)) | @timkpaine ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Atimkpaine+updated%3A2026-01-29..2026-04-08&type=Issues)) ## 7.17.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.16.6...c9ac1d1040459ed1ff9eb34e9918ce5a87cf9d71)) ### Enhancements made - Add support for arbitrary browser arguments [#2227](https://github.com/jupyter/nbconvert/pull/2227) ([@shreve](https://github.com/shreve), [@Carreau](https://github.com/Carreau), [@krassowski](https://github.com/krassowski)) ### Bugs fixed - Fix QtPNGExporter returning empty bytes on macOS [#2264](https://github.com/jupyter/nbconvert/pull/2264) ([@h3pdesign](https://github.com/h3pdesign), [@Carreau](https://github.com/Carreau), [@QuLogic](https://github.com/QuLogic)) - Fix CVE-2025-53000: Secure Inkscape Windows path (registry first + block CWD) [#2261](https://github.com/jupyter/nbconvert/pull/2261) ([@h3pdesign](https://github.com/h3pdesign), [@krassowski](https://github.com/krassowski), [@mberlanda](https://github.com/mberlanda), [@minrk](https://github.com/minrk), [@salmankadaya](https://github.com/salmankadaya), [@th3gowtham](https://github.com/th3gowtham)) - Fix get_export_names and get_exporter default args [#2228](https://github.com/jupyter/nbconvert/pull/2228) ([@shreve](https://github.com/shreve), [@krassowski](https://github.com/krassowski)) - PyPA-Compliant Summary [#2226](https://github.com/jupyter/nbconvert/pull/2226) ([@hackowitz-af](https://github.com/hackowitz-af), [@Carreau](https://github.com/Carreau)) ### Maintenance and upkeep improvements - avoid cov environment on free-threaded Pythons [#2267](https://github.com/jupyter/nbconvert/pull/2267) ([@minrk](https://github.com/minrk)) - update pre-commit, and fix all issues. [#2238](https://github.com/jupyter/nbconvert/pull/2238) ([@Carreau](https://github.com/Carreau)) - Drop test on 3.9, test on 3.13, 3.14, 3.14t [#2237](https://github.com/jupyter/nbconvert/pull/2237) ([@Carreau](https://github.com/Carreau)) - Bump the actions group across 1 directory with 2 updates [#2231](https://github.com/jupyter/nbconvert/pull/2231) ([@Carreau](https://github.com/Carreau), [@krassowski](https://github.com/krassowski)) - Replace `@flaky.flaky` decorate with pytest marker [#2229](https://github.com/jupyter/nbconvert/pull/2229) ([@mgorny](https://github.com/mgorny), [@Carreau](https://github.com/Carreau)) - update to mermaid 11.10.0 [#2224](https://github.com/jupyter/nbconvert/pull/2224) ([@bollwyvl](https://github.com/bollwyvl), [@krassowski](https://github.com/krassowski)) - Drop support for Python 3.8, fix the CI tests [#2221](https://github.com/jupyter/nbconvert/pull/2221) ([@shreve](https://github.com/shreve), [@minrk](https://github.com/minrk)) ### Documentation improvements - Use `intersphinx_registry` [#2232](https://github.com/jupyter/nbconvert/pull/2232) ([@Carreau](https://github.com/Carreau), [@krassowski](https://github.com/krassowski)) ### Contributors to this release The following people contributed discussions, new ideas, code and documentation contributions, and review. See [our definition of contributors](https://github-activity.readthedocs.io/en/latest/use/#how-does-this-tool-define-contributions-in-the-reports). ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2025-01-28&to=2026-01-29&type=c)) @bollwyvl ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abollwyvl+updated%3A2025-01-28..2026-01-29&type=Issues)) | @Carreau ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ACarreau+updated%3A2025-01-28..2026-01-29&type=Issues)) | @h3pdesign ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ah3pdesign+updated%3A2025-01-28..2026-01-29&type=Issues)) | @hackowitz-af ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ahackowitz-af+updated%3A2025-01-28..2026-01-29&type=Issues)) | @krassowski ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Akrassowski+updated%3A2025-01-28..2026-01-29&type=Issues)) | @mberlanda ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Amberlanda+updated%3A2025-01-28..2026-01-29&type=Issues)) | @mgorny ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Amgorny+updated%3A2025-01-28..2026-01-29&type=Issues)) | @minrk ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aminrk+updated%3A2025-01-28..2026-01-29&type=Issues)) | @MSeal ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AMSeal+updated%3A2025-01-28..2026-01-29&type=Issues)) | @QuLogic ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AQuLogic+updated%3A2025-01-28..2026-01-29&type=Issues)) | @salmankadaya ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Asalmankadaya+updated%3A2025-01-28..2026-01-29&type=Issues)) | @shreve ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ashreve+updated%3A2025-01-28..2026-01-29&type=Issues)) | @th3gowtham ([activity](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ath3gowtham+updated%3A2025-01-28..2026-01-29&type=Issues)) ## 7.16.6 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.16.5...01c6ab25ec81277ab4d8585747f904c89a8c02b0)) ### Bugs fixed - Prevent leading whitespace in markdown code blocks from being stripped [#2203](https://github.com/jupyter/nbconvert/pull/2203) ([@peytondmurray](https://github.com/peytondmurray)) - Fix bullet list parsing in markdown [#2177](https://github.com/jupyter/nbconvert/pull/2177) ([@douglas-raillard-arm](https://github.com/douglas-raillard-arm)) - Fix crash when running with optimization [#2160](https://github.com/jupyter/nbconvert/pull/2160) ([@QuLogic](https://github.com/QuLogic)) ### Maintenance and upkeep improvements - remove any twitter mention [#2206](https://github.com/jupyter/nbconvert/pull/2206) ([@Carreau](https://github.com/Carreau)) - Update base.tex.j2 for macro compatibility with newer versions of Pandoc [#2196](https://github.com/jupyter/nbconvert/pull/2196) ([@PetalAdrift](https://github.com/PetalAdrift)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2025-01-02&to=2025-01-28&type=c)) [@Carreau](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ACarreau+updated%3A2025-01-02..2025-01-28&type=Issues) | [@douglas-raillard-arm](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Adouglas-raillard-arm+updated%3A2025-01-02..2025-01-28&type=Issues) | [@gabemorris12](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Agabemorris12+updated%3A2025-01-02..2025-01-28&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Akrassowski+updated%3A2025-01-02..2025-01-28&type=Issues) | [@PetalAdrift](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3APetalAdrift+updated%3A2025-01-02..2025-01-28&type=Issues) | [@peytondmurray](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apeytondmurray+updated%3A2025-01-02..2025-01-28&type=Issues) | [@QuLogic](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AQuLogic+updated%3A2025-01-02..2025-01-28&type=Issues) ## 7.16.5 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.16.4...18e10f6484afdfee39105248c28abe5ef0835b22)) ### Enhancements made - Add support for mistune 3.1.0 [#2199](https://github.com/jupyter/nbconvert/pull/2199) ([@fcollonval](https://github.com/fcollonval)) - Allow including `text/x-rst` outputs in rst conversion, transition away from `text/restructuredtext` [#2167](https://github.com/jupyter/nbconvert/pull/2167) ([@takluyver](https://github.com/takluyver)) ### Bugs fixed - Do not display mathjax overlay [#2181](https://github.com/jupyter/nbconvert/pull/2181) ([@timkpaine](https://github.com/timkpaine)) - Work around pip 24.1 bug which prevents installing pandocfilters 1.4.1 [#2168](https://github.com/jupyter/nbconvert/pull/2168) ([@takluyver](https://github.com/takluyver)) - Don't die if template path cannot be read [#2162](https://github.com/jupyter/nbconvert/pull/2162) ([@stuaxo](https://github.com/stuaxo)) - Fix markdown2asciidoc function for pandoc >= 3.0 (closes #2017) [#2152](https://github.com/jupyter/nbconvert/pull/2152) ([@thomasjm](https://github.com/thomasjm)) ### Maintenance and upkeep improvements - enhancement dep-chain: directly depend on bleach[css], instead of pulling in tinycss2. [#2166](https://github.com/jupyter/nbconvert/pull/2166) ([@xiacunshun](https://github.com/xiacunshun)) - chore: update pre-commit hooks [#2146](https://github.com/jupyter/nbconvert/pull/2146) ([@pre-commit-ci](https://github.com/pre-commit-ci)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2024-04-29&to=2025-01-02&type=c)) [@bollwyvl](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abollwyvl+updated%3A2024-04-29..2025-01-02&type=Issues) | [@fcollonval](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Afcollonval+updated%3A2024-04-29..2025-01-02&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Akrassowski+updated%3A2024-04-29..2025-01-02&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2024-04-29..2025-01-02&type=Issues) | [@stuaxo](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Astuaxo+updated%3A2024-04-29..2025-01-02&type=Issues) | [@t-makaro](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3At-makaro+updated%3A2024-04-29..2025-01-02&type=Issues) | [@takluyver](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Atakluyver+updated%3A2024-04-29..2025-01-02&type=Issues) | [@thomasjm](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Athomasjm+updated%3A2024-04-29..2025-01-02&type=Issues) | [@timkpaine](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Atimkpaine+updated%3A2024-04-29..2025-01-02&type=Issues) | [@xiacunshun](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Axiacunshun+updated%3A2024-04-29..2025-01-02&type=Issues) ## 7.16.4 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.16.3...71fde294f623083f364bf68e14f07459dee952e6)) ### Bugs fixed - rst exporter: Re-enable coalescing streams [#2142](https://github.com/jupyter/nbconvert/pull/2142) ([@mgeier](https://github.com/mgeier)) ### Maintenance and upkeep improvements - Revert "Set all min deps" [#2138](https://github.com/jupyter/nbconvert/pull/2138) ([@blink1073](https://github.com/blink1073)) - Set all min deps [#2136](https://github.com/jupyter/nbconvert/pull/2136) ([@blink1073](https://github.com/blink1073)) - chore: update pre-commit hooks [#2134](https://github.com/jupyter/nbconvert/pull/2134) ([@pre-commit-ci](https://github.com/pre-commit-ci)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2024-03-21&to=2024-04-29&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2024-03-21..2024-04-29&type=Issues) | [@mgeier](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Amgeier+updated%3A2024-03-21..2024-04-29&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2024-03-21..2024-04-29&type=Issues) ## 7.16.3 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.16.2...9019037e300dfdbac5a8cb330d0b09eb82e12f62)) ### Maintenance and upkeep improvements - Remove pytest pin [#2129](https://github.com/jupyter/nbconvert/pull/2129) ([@blink1073](https://github.com/blink1073)) - Add Compatibility with Pandoc 2.9.2 [#2128](https://github.com/jupyter/nbconvert/pull/2128) ([@blink1073](https://github.com/blink1073)) - Pin to Pytest 7 [#2124](https://github.com/jupyter/nbconvert/pull/2124) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2024-03-04&to=2024-03-21&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2024-03-04..2024-03-21&type=Issues) ## 7.16.2 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.16.1...8dac97afa73d59e6afcad04ca076355576b6eb51)) ### Bugs fixed - [HTMLExporter] Initialize resources before widget filtering [#2118](https://github.com/jupyter/nbconvert/pull/2118) ([@yuvipanda](https://github.com/yuvipanda)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2024-02-19&to=2024-03-04&type=c)) [@yuvipanda](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ayuvipanda+updated%3A2024-02-19..2024-03-04&type=Issues) ## 7.16.1 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.16.0...443b30703078e6f7d5b1044f25fb77e219136aac)) ### Maintenance and upkeep improvements - Fix permissions for prep release workflow [#2112](https://github.com/jupyter/nbconvert/pull/2112) ([@blink1073](https://github.com/blink1073)) - Update publish workflow [#2111](https://github.com/jupyter/nbconvert/pull/2111) ([@blink1073](https://github.com/blink1073)) - fix for tests/ dir not in sys.path, closes #2066 [#2108](https://github.com/jupyter/nbconvert/pull/2108) ([@ivanov](https://github.com/ivanov)) ### Documentation improvements - Update project description [#2107](https://github.com/jupyter/nbconvert/pull/2107) ([@ivanov](https://github.com/ivanov)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2024-02-07&to=2024-02-19&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2024-02-07..2024-02-19&type=Issues) | [@ivanov](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aivanov+updated%3A2024-02-07..2024-02-19&type=Issues) ## 7.16.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.15.0...87db94d2d31d77ad16eef2285bb764e97a6f3c11)) ### Enhancements made - Add a toggle to skip the svg encoding of images [#2106](https://github.com/jupyter/nbconvert/pull/2106) ([@gwincr11](https://github.com/gwincr11)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2024-02-06&to=2024-02-07&type=c)) [@gwincr11](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Agwincr11+updated%3A2024-02-06..2024-02-07&type=Issues) ## 7.15.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.14.2...dff141e8c8b392b89eed0adbf035f33810706750)) ### Enhancements made - Support configurable width and height of reveal presentations [#2104](https://github.com/jupyter/nbconvert/pull/2104) ([@franzhaas](https://github.com/franzhaas)) ### Maintenance and upkeep improvements - chore: update pre-commit hooks [#2105](https://github.com/jupyter/nbconvert/pull/2105) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - handle xhtml void elements in mermaid diagrams [#2103](https://github.com/jupyter/nbconvert/pull/2103) ([@bollwyvl](https://github.com/bollwyvl)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2024-01-16&to=2024-02-06&type=c)) [@bollwyvl](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abollwyvl+updated%3A2024-01-16..2024-02-06&type=Issues) | [@franzhaas](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Afranzhaas+updated%3A2024-01-16..2024-02-06&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2024-01-16..2024-02-06&type=Issues) ## 7.14.2 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.14.1...9d8a7a8771d0349e49328efb7fc2b8fb99c7cc1f)) ### Maintenance and upkeep improvements - update to mermaid 10.7.0 [#2098](https://github.com/jupyter/nbconvert/pull/2098) ([@bollwyvl](https://github.com/bollwyvl)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2024-01-11&to=2024-01-16&type=c)) [@bollwyvl](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abollwyvl+updated%3A2024-01-11..2024-01-16&type=Issues) ## 7.14.1 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.14.0...dedd81acdde7c96204d01f1392af896d2e6dbe1b)) ### Bugs fixed - Fix broken image scaling in case a custom width or height is provided for the image [#2094](https://github.com/jupyter/nbconvert/pull/2094) ([@AndSte01](https://github.com/AndSte01)) ### Maintenance and upkeep improvements - Allow pre-fetch of css files without attempting download [#2095](https://github.com/jupyter/nbconvert/pull/2095) ([@AlexanderRichert-NOAA](https://github.com/AlexanderRichert-NOAA)) - Bump the actions group with 1 update [#2091](https://github.com/jupyter/nbconvert/pull/2091) ([@dependabot](https://github.com/dependabot)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2024-01-01&to=2024-01-11&type=c)) [@AlexanderRichert-NOAA](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AAlexanderRichert-NOAA+updated%3A2024-01-01..2024-01-11&type=Issues) | [@AndSte01](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AAndSte01+updated%3A2024-01-01..2024-01-11&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Adependabot+updated%3A2024-01-01..2024-01-11&type=Issues) ## 7.14.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.13.1...0f17b3069d320565af12a4a12da7d9ce3c18dac4)) ### Enhancements made - Convert `coalescese_streams` function to `CoalesceStreamsPreprocessor` [#2089](https://github.com/jupyter/nbconvert/pull/2089) ([@ryan-williams](https://github.com/ryan-williams)) ### Maintenance and upkeep improvements - chore: update pre-commit hooks [#2090](https://github.com/jupyter/nbconvert/pull/2090) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Fix webpdf test on Python 3.12 [#2088](https://github.com/jupyter/nbconvert/pull/2088) ([@blink1073](https://github.com/blink1073)) - Clean up import [#2087](https://github.com/jupyter/nbconvert/pull/2087) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-12-21&to=2024-01-01&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-12-21..2024-01-01&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2023-12-21..2024-01-01&type=Issues) | [@ryan-williams](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aryan-williams+updated%3A2023-12-21..2024-01-01&type=Issues) ## 7.13.1 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.13.0...15b2bc2e215bc3d0ab37508eeeb624ede5da0d36)) ### Bugs fixed - Restore removed import [#2086](https://github.com/jupyter/nbconvert/pull/2086) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-12-18&to=2023-12-21&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-12-18..2023-12-21&type=Issues) ## 7.13.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.12.0...c72ad76251d50c9cf3139e23922e9ef3441e9860)) ### Enhancements made - Add table, td, tr to allowed list of tags [#2083](https://github.com/jupyter/nbconvert/pull/2083) ([@yuvipanda](https://github.com/yuvipanda)) ### Maintenance and upkeep improvements - Remove twitter links that cause linkcheck to fail [#2084](https://github.com/jupyter/nbconvert/pull/2084) ([@yuvipanda](https://github.com/yuvipanda)) - Update ruff config [#2079](https://github.com/jupyter/nbconvert/pull/2079) ([@blink1073](https://github.com/blink1073)) - chore: update pre-commit hooks [#2076](https://github.com/jupyter/nbconvert/pull/2076) ([@pre-commit-ci](https://github.com/pre-commit-ci)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-12-04&to=2023-12-18&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-12-04..2023-12-18&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2023-12-04..2023-12-18&type=Issues) | [@yuvipanda](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ayuvipanda+updated%3A2023-12-04..2023-12-18&type=Issues) ## 7.12.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.11.0...4f6ab6583de771e74874e72ec88c7fe09a5d4b6b)) ### Enhancements made - Allow to load config from env. [#2075](https://github.com/jupyter/nbconvert/pull/2075) ([@Carreau](https://github.com/Carreau)) ### Maintenance and upkeep improvements - Use ruff on notebooks and update typings [#2068](https://github.com/jupyter/nbconvert/pull/2068) ([@blink1073](https://github.com/blink1073)) ### Documentation improvements - update Python version support in docs [#2037](https://github.com/jupyter/nbconvert/pull/2037) ([@minrk](https://github.com/minrk)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-11-06&to=2023-12-04&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-11-06..2023-12-04&type=Issues) | [@Carreau](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ACarreau+updated%3A2023-11-06..2023-12-04&type=Issues) | [@gnestor](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Agnestor+updated%3A2023-11-06..2023-12-04&type=Issues) | [@minrk](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aminrk+updated%3A2023-11-06..2023-12-04&type=Issues) | [@mpacer](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ampacer+updated%3A2023-11-06..2023-12-04&type=Issues) ## 7.11.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.10.0...422dd2a1697b191dc8e11806ddeca314df66c282)) ### Enhancements made - Support es modules in js includes [#2063](https://github.com/jupyter/nbconvert/pull/2063) ([@timkpaine](https://github.com/timkpaine)) ### Maintenance and upkeep improvements - Clean up lint handling and list generics [#2065](https://github.com/jupyter/nbconvert/pull/2065) ([@blink1073](https://github.com/blink1073)) - Remove not needed pytest-dependency test requirement [#2062](https://github.com/jupyter/nbconvert/pull/2062) ([@danigm](https://github.com/danigm)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-10-30&to=2023-11-06&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-10-30..2023-11-06&type=Issues) | [@danigm](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Adanigm+updated%3A2023-10-30..2023-11-06&type=Issues) | [@timkpaine](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Atimkpaine+updated%3A2023-10-30..2023-11-06&type=Issues) ## 7.10.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.9.2...48599a4bba00819e4e626fe098eb204977590ee4)) ### Enhancements made - Update to mermaid 10.6.0, docs keyboard navigation [#2058](https://github.com/jupyter/nbconvert/pull/2058) ([@bollwyvl](https://github.com/bollwyvl)) ### Maintenance and upkeep improvements - Fix typing for traitlets 5.13 [#2060](https://github.com/jupyter/nbconvert/pull/2060) ([@blink1073](https://github.com/blink1073)) - Adopt ruff format [#2059](https://github.com/jupyter/nbconvert/pull/2059) ([@blink1073](https://github.com/blink1073)) - Update typings and remove dead link [#2056](https://github.com/jupyter/nbconvert/pull/2056) ([@blink1073](https://github.com/blink1073)) ### Documentation improvements - Update to mermaid 10.6.0, docs keyboard navigation [#2058](https://github.com/jupyter/nbconvert/pull/2058) ([@bollwyvl](https://github.com/bollwyvl)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-10-05&to=2023-10-30&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-10-05..2023-10-30&type=Issues) | [@bollwyvl](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abollwyvl+updated%3A2023-10-05..2023-10-30&type=Issues) ## 7.9.2 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.9.1...8e85303e530013f9e6d29be85f25e9602a443194)) ### Bugs fixed - Restore ResourcesDict to the public API [#2055](https://github.com/jupyter/nbconvert/pull/2055) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-10-04&to=2023-10-05&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-10-04..2023-10-05&type=Issues) ## 7.9.1 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.9.0...6d679efebf8b6b7c65c4ab0dcb0dec97f6d389b9)) ### Maintenance and upkeep improvements - Include tests in sdist [#2053](https://github.com/jupyter/nbconvert/pull/2053) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-10-04&to=2023-10-04&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-10-04..2023-10-04&type=Issues) ## 7.9.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.8.0...0e36347f31ee0b06d461aaa845e458eb7c9f8fc0)) ### Maintenance and upkeep improvements - Update to mermaidjs 10.5.0 [#2051](https://github.com/jupyter/nbconvert/pull/2051) ([@bollwyvl](https://github.com/bollwyvl)) - Update typing for traitlets 5.11 [#2050](https://github.com/jupyter/nbconvert/pull/2050) ([@blink1073](https://github.com/blink1073)) - chore: update pre-commit hooks [#2049](https://github.com/jupyter/nbconvert/pull/2049) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Fixup typings [#2048](https://github.com/jupyter/nbconvert/pull/2048) ([@blink1073](https://github.com/blink1073)) - Remove redundant link check in CI [#2044](https://github.com/jupyter/nbconvert/pull/2044) ([@blink1073](https://github.com/blink1073)) - Bump actions/checkout from 3 to 4 [#2042](https://github.com/jupyter/nbconvert/pull/2042) ([@dependabot](https://github.com/dependabot)) - Adopt sp-repo-review [#2040](https://github.com/jupyter/nbconvert/pull/2040) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-08-29&to=2023-10-04&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-08-29..2023-10-04&type=Issues) | [@bollwyvl](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abollwyvl+updated%3A2023-08-29..2023-10-04&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Adependabot+updated%3A2023-08-29..2023-10-04&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2023-08-29..2023-10-04&type=Issues) ## 7.8.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.7.4...9e8d252f2bf5b4177bbbeb007fd1a489356926ec)) ### Enhancements made - MermaidJS 10.3.1, accessibility features, handle MIME [#2034](https://github.com/jupyter/nbconvert/pull/2034) ([@bollwyvl](https://github.com/bollwyvl)) ### Bugs fixed - Fix: Prevent error from all whitespace lang string [#2036](https://github.com/jupyter/nbconvert/pull/2036) ([@Adamtaranto](https://github.com/Adamtaranto)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-08-16&to=2023-08-29&type=c)) [@Adamtaranto](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AAdamtaranto+updated%3A2023-08-16..2023-08-29&type=Issues) | [@bollwyvl](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abollwyvl+updated%3A2023-08-16..2023-08-29&type=Issues) ## 7.7.4 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.7.3...bbb095ba24c005ce26f0e8b47f4ddf19a5debe68)) ### Bugs fixed - Give main tag a height of 100% in css for reveal html [#2032](https://github.com/jupyter/nbconvert/pull/2032) ([@lkeegan](https://github.com/lkeegan)) ### Maintenance and upkeep improvements ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-07-25&to=2023-08-16&type=c)) [@Carreau](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ACarreau+updated%3A2023-07-25..2023-08-16&type=Issues) | [@lkeegan](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Alkeegan+updated%3A2023-07-25..2023-08-16&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2023-07-25..2023-08-16&type=Issues) ## 7.7.3 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.7.2...73fd3b9eb5e364bc86f9407e027d5577c5c8db9e)) ### Bugs fixed - Restore pauses during webpdf render [#2025](https://github.com/jupyter/nbconvert/pull/2025) ([@jstorrs](https://github.com/jstorrs)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-07-19&to=2023-07-25&type=c)) [@jstorrs](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ajstorrs+updated%3A2023-07-19..2023-07-25&type=Issues) ## 7.7.2 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.7.1...1cbb0a46d97f9f0b2a6a0d359ebf9b4b50178c25)) ### Bugs fixed - Show a warning if an image has no alternative text [#2024](https://github.com/jupyter/nbconvert/pull/2024) ([@brichet](https://github.com/brichet)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-07-17&to=2023-07-19&type=c)) [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abrichet+updated%3A2023-07-17..2023-07-19&type=Issues) ## 7.7.1 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.7.0...86cebfc16920fcdddef557620a7b8a23d84072d6)) ### Bugs fixed - Restore 'media=print' option [#2022](https://github.com/jupyter/nbconvert/pull/2022) ([@brichet](https://github.com/brichet)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-07-17&to=2023-07-17&type=c)) [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abrichet+updated%3A2023-07-17..2023-07-17&type=Issues) ## 7.7.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.6.0...f2fc3e13fe8e8836324550dac5286bbb0e4315bb)) ### Enhancements made - [Accessibility] some accessibility improvements [#2021](https://github.com/jupyter/nbconvert/pull/2021) ([@brichet](https://github.com/brichet)) - Adopt playwright [#2013](https://github.com/jupyter/nbconvert/pull/2013) ([@brichet](https://github.com/brichet)) - Update to Jupyterlab 4 [#2012](https://github.com/jupyter/nbconvert/pull/2012) ([@brichet](https://github.com/brichet)) ### Bugs fixed - html: write image/svg+xml data as base64 and skip clean_html [#2018](https://github.com/jupyter/nbconvert/pull/2018) ([@jstorrs](https://github.com/jstorrs)) - Remove HTML escaping JSON-encoded widget state [#1934](https://github.com/jupyter/nbconvert/pull/1934) ([@manzt](https://github.com/manzt)) ### Maintenance and upkeep improvements - Fix lint error [#2010](https://github.com/jupyter/nbconvert/pull/2010) ([@blink1073](https://github.com/blink1073)) - Support Python 3.8-3.12 [#2008](https://github.com/jupyter/nbconvert/pull/2008) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-06-19&to=2023-07-17&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-06-19..2023-07-17&type=Issues) | [@brichet](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abrichet+updated%3A2023-06-19..2023-07-17&type=Issues) | [@jstorrs](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ajstorrs+updated%3A2023-06-19..2023-07-17&type=Issues) | [@maartenbreddels](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Amaartenbreddels+updated%3A2023-06-19..2023-07-17&type=Issues) | [@manzt](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Amanzt+updated%3A2023-06-19..2023-07-17&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AmartinRenou+updated%3A2023-06-19..2023-07-17&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2023-06-19..2023-07-17&type=Issues) ## 7.6.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.5.0...60af6d897c083444586829c636f278d84ae81962)) ### Maintenance and upkeep improvements - Update to Mistune v3 [#1820](https://github.com/jupyter/nbconvert/pull/1820) ([@TiagodePAlves](https://github.com/TiagodePAlves)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-06-13&to=2023-06-19&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-06-13..2023-06-19&type=Issues) | [@kloczek](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Akloczek+updated%3A2023-06-13..2023-06-19&type=Issues) | [@TiagodePAlves](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ATiagodePAlves+updated%3A2023-06-13..2023-06-19&type=Issues) ## 7.5.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.4.0...3dd3a67bf16474042efac25519ef257d708a8d7b)) ### Enhancements made - Add mermaidjs 10.2.3 [#1957](https://github.com/jupyter/nbconvert/pull/1957) ([@bollwyvl](https://github.com/bollwyvl)) ### Bugs fixed - Fix pdf conversion with explicitly relative paths [#2005](https://github.com/jupyter/nbconvert/pull/2005) ([@tuncbkose](https://github.com/tuncbkose)) - Ensure TEXINPUTS is an absolute path [#2002](https://github.com/jupyter/nbconvert/pull/2002) ([@tuncbkose](https://github.com/tuncbkose)) ### Maintenance and upkeep improvements - bump pandoc max version [#1997](https://github.com/jupyter/nbconvert/pull/1997) ([@tuncbkose](https://github.com/tuncbkose)) - exclude bleach 5.0.0 from dependencies resolution [#1990](https://github.com/jupyter/nbconvert/pull/1990) ([@karlicoss](https://github.com/karlicoss)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-05-08&to=2023-06-13&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-05-08..2023-06-13&type=Issues) | [@bollwyvl](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Abollwyvl+updated%3A2023-05-08..2023-06-13&type=Issues) | [@karlicoss](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Akarlicoss+updated%3A2023-05-08..2023-06-13&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2023-05-08..2023-06-13&type=Issues) | [@tuncbkose](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Atuncbkose+updated%3A2023-05-08..2023-06-13&type=Issues) ## 7.4.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.3.1...32fcf7b26462f5d51d577f8beda9d49cd3a0f441)) ### Enhancements made - Add ExtractAttachmentsPreprocessor [#1978](https://github.com/jupyter/nbconvert/pull/1978) ([@tuncbkose](https://github.com/tuncbkose)) ### Bugs fixed - Moved ensure_dir_exists to FilesWriter [#1987](https://github.com/jupyter/nbconvert/pull/1987) ([@tuncbkose](https://github.com/tuncbkose)) - Tweak exporter default_config merging behavior [#1981](https://github.com/jupyter/nbconvert/pull/1981) ([@tuncbkose](https://github.com/tuncbkose)) - Revert unintended effects of #1966 [#1974](https://github.com/jupyter/nbconvert/pull/1974) ([@tuncbkose](https://github.com/tuncbkose)) ### Maintenance and upkeep improvements - Fix test_errors_print_traceback test [#1985](https://github.com/jupyter/nbconvert/pull/1985) ([@blink1073](https://github.com/blink1073)) - Ensure toml support in coverage reporting [#1984](https://github.com/jupyter/nbconvert/pull/1984) ([@blink1073](https://github.com/blink1073)) - Use local coverage [#1976](https://github.com/jupyter/nbconvert/pull/1976) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-04-10&to=2023-05-08&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-04-10..2023-05-08&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Akrassowski+updated%3A2023-04-10..2023-05-08&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2023-04-10..2023-05-08&type=Issues) | [@tuncbkose](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Atuncbkose+updated%3A2023-04-10..2023-05-08&type=Issues) ## 7.3.1 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.3.0...3860152ecea3d9833540eebe279ff603b3d47cea)) ### Bugs fixed - Remove overwriting of default KernelManager [#1972](https://github.com/jupyter/nbconvert/pull/1972) ([@tuncbkose](https://github.com/tuncbkose)) ### Maintenance and upkeep improvements ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-04-03&to=2023-04-10&type=c)) [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2023-04-03..2023-04-10&type=Issues) | [@tuncbkose](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Atuncbkose+updated%3A2023-04-03..2023-04-10&type=Issues) ## 7.3.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.10...056dc4ecc8f9f3e9249f0dbddf1221c65228b961)) ### Enhancements made - Allow pattern in output_base [#1967](https://github.com/jupyter/nbconvert/pull/1967) ([@JeppeKlitgaard](https://github.com/JeppeKlitgaard)) - Make date configurable in latex/PDF [#1963](https://github.com/jupyter/nbconvert/pull/1963) ([@achimgaedke](https://github.com/achimgaedke)) - Update jupyterlab CSS [#1960](https://github.com/jupyter/nbconvert/pull/1960) ([@martinRenou](https://github.com/martinRenou)) ### Maintenance and upkeep improvements - Update ci badge [#1968](https://github.com/jupyter/nbconvert/pull/1968) ([@blink1073](https://github.com/blink1073)) - More detailed release instructions [#1959](https://github.com/jupyter/nbconvert/pull/1959) ([@Carreau](https://github.com/Carreau)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-03-14&to=2023-04-03&type=c)) [@achimgaedke](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aachimgaedke+updated%3A2023-03-14..2023-04-03&type=Issues) | [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-03-14..2023-04-03&type=Issues) | [@Carreau](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ACarreau+updated%3A2023-03-14..2023-04-03&type=Issues) | [@JeppeKlitgaard](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AJeppeKlitgaard+updated%3A2023-03-14..2023-04-03&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AmartinRenou+updated%3A2023-03-14..2023-04-03&type=Issues) ## 7.2.10 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.9...acf41acf6d83cb725f3a2c48686c828eff7b24d8)) ### Enhancements made - Add cell-id anchor for cell identification [#1897](https://github.com/jupyter/nbconvert/pull/1897) ([@krassowski](https://github.com/krassowski)) ### Bugs fixed - Do not import pyppeteer for installation check [#1947](https://github.com/jupyter/nbconvert/pull/1947) ([@krassowski](https://github.com/krassowski)) ### Maintenance and upkeep improvements - Clean up license [#1949](https://github.com/jupyter/nbconvert/pull/1949) ([@dcsaba89](https://github.com/dcsaba89)) - Add more linting [#1943](https://github.com/jupyter/nbconvert/pull/1943) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-01-24&to=2023-03-14&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-01-24..2023-03-14&type=Issues) | [@dcsaba89](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Adcsaba89+updated%3A2023-01-24..2023-03-14&type=Issues) | [@krassowski](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Akrassowski+updated%3A2023-01-24..2023-03-14&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2023-01-24..2023-03-14&type=Issues) ## 7.2.9 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.8...14b1d7aa75485ea754c2d0ffc67cc528e3984a99)) ### Bugs fixed - Fix handling of css sanitizer [#1940](https://github.com/jupyter/nbconvert/pull/1940) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2023-01-16&to=2023-01-24&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2023-01-16..2023-01-24&type=Issues) ## 7.2.8 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.7...73f7b1b93a4526d7e9d987f5a5b207eaed8171f2)) ### Bugs fixed - always pass relax_add_props=True when validating [#1936](https://github.com/jupyter/nbconvert/pull/1936) ([@minrk](https://github.com/minrk)) ### Maintenance and upkeep improvements - Update codecov link [#1935](https://github.com/jupyter/nbconvert/pull/1935) ([@blink1073](https://github.com/blink1073)) - Fix types and add lint to automerge [#1932](https://github.com/jupyter/nbconvert/pull/1932) ([@blink1073](https://github.com/blink1073)) - Add type checking [#1930](https://github.com/jupyter/nbconvert/pull/1930) ([@blink1073](https://github.com/blink1073)) - Add spelling and docstring enforcement [#1929](https://github.com/jupyter/nbconvert/pull/1929) ([@blink1073](https://github.com/blink1073)) - Add scheduled ci run [#1926](https://github.com/jupyter/nbconvert/pull/1926) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2022-12-19&to=2023-01-16&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2022-12-19..2023-01-16&type=Issues) | [@maartenbreddels](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Amaartenbreddels+updated%3A2022-12-19..2023-01-16&type=Issues) | [@martinRenou](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AmartinRenou+updated%3A2022-12-19..2023-01-16&type=Issues) | [@minrk](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aminrk+updated%3A2022-12-19..2023-01-16&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2022-12-19..2023-01-16&type=Issues) ## 7.2.7 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.6...a32c3c1063e081d7e639b7f1670788d220b93810)) ### Bugs fixed - Fix Hanging Tests on Linux [#1924](https://github.com/jupyter/nbconvert/pull/1924) ([@blink1073](https://github.com/blink1073)) ### Maintenance and upkeep improvements - Adopt ruff and handle lint [#1925](https://github.com/jupyter/nbconvert/pull/1925) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2022-12-05&to=2022-12-19&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2022-12-05..2022-12-19&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2022-12-05..2022-12-19&type=Issues) ## 7.2.6 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.5...788dd3c4de1b6333e807250d0f33b59b80d5b202)) ### Maintenance and upkeep improvements - Include all templates in sdist [#1916](https://github.com/jupyter/nbconvert/pull/1916) ([@blink1073](https://github.com/blink1073)) - clean up workflows [#1911](https://github.com/jupyter/nbconvert/pull/1911) ([@blink1073](https://github.com/blink1073)) - CI Cleanup [#1910](https://github.com/jupyter/nbconvert/pull/1910) ([@blink1073](https://github.com/blink1073)) ### Documentation improvements - Fix docs build and switch to PyData Sphinx Theme [#1912](https://github.com/jupyter/nbconvert/pull/1912) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2022-11-14&to=2022-12-05&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2022-11-14..2022-12-05&type=Issues) ## 7.2.5 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.4...e5fefbb17b0bf3d6b5bbeb9a2ee62412d75ab0d8)) ### Bugs fixed - Fix for webpdf print margins [#1907](https://github.com/jupyter/nbconvert/pull/1907) ([@JWock82](https://github.com/JWock82)) ### Maintenance and upkeep improvements - Bump actions/upload-artifact from 2 to 3 [#1904](https://github.com/jupyter/nbconvert/pull/1904) ([@dependabot](https://github.com/dependabot)) - Bump actions/checkout from 2 to 3 [#1903](https://github.com/jupyter/nbconvert/pull/1903) ([@dependabot](https://github.com/dependabot)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2022-11-09&to=2022-11-14&type=c)) [@dependabot](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Adependabot+updated%3A2022-11-09..2022-11-14&type=Issues) | [@JWock82](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3AJWock82+updated%3A2022-11-09..2022-11-14&type=Issues) ## 7.2.4 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.3...90ca66ccf02abc59052f4f38dcc657b0d2c34a07)) ### Maintenance and upkeep improvements - Handle jupyter core warning [#1905](https://github.com/jupyter/nbconvert/pull/1905) ([@blink1073](https://github.com/blink1073)) - Add dependabot [#1902](https://github.com/jupyter/nbconvert/pull/1902) ([@blink1073](https://github.com/blink1073)) - Add Py-typed marker. [#1898](https://github.com/jupyter/nbconvert/pull/1898) ([@Carreau](https://github.com/Carreau)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2022-10-27&to=2022-11-09&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2022-10-27..2022-11-09&type=Issues) | [@Carreau](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3ACarreau+updated%3A2022-10-27..2022-11-09&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2022-10-27..2022-11-09&type=Issues) ## 7.2.3 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.2...04180fdb015c56ac320d5062a81da065791c5726)) ### Bugs fixed - clean_html: allow SVG tags and SVG attributes [#1890](https://github.com/jupyter/nbconvert/pull/1890) ([@akx](https://github.com/akx)) ### Maintenance and upkeep improvements ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2022-10-19&to=2022-10-27&type=c)) [@akx](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Aakx+updated%3A2022-10-19..2022-10-27&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2022-10-19..2022-10-27&type=Issues) ## 7.2.2 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.1...a9566befb6e457b51373b61debffc78050d41273)) ### Bugs fixed - Fix default config test [#1885](https://github.com/jupyter/nbconvert/pull/1885) ([@blink1073](https://github.com/blink1073)) ### Maintenance and upkeep improvements - Add ensure label workflow [#1884](https://github.com/jupyter/nbconvert/pull/1884) ([@blink1073](https://github.com/blink1073)) - Add release workflows [#1883](https://github.com/jupyter/nbconvert/pull/1883) ([@blink1073](https://github.com/blink1073)) - Maintenance cleanup [#1881](https://github.com/jupyter/nbconvert/pull/1881) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2022-10-06&to=2022-10-19&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2022-10-06..2022-10-19&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Apre-commit-ci+updated%3A2022-10-06..2022-10-19&type=Issues) ## 7.2.1 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/v7.2.0...5cfa5893e3e8fe830eec2b8abf791199a52aad07)) ### Bugs fixed - Fix version handling [#1878](https://github.com/jupyter/nbconvert/pull/1878) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2022-10-06&to=2022-10-06&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2022-10-06..2022-10-06&type=Issues) ## 7.2.0 ([Full Changelog](https://github.com/jupyter/nbconvert/compare/7.1.0...e4e85b60c4c130f33db02c4ce209cc4704c7001a)) ### Maintenance and upkeep improvements - Prep for jupyter releaser [#1877](https://github.com/jupyter/nbconvert/pull/1877) ([@blink1073](https://github.com/blink1073)) - Add support for jupyter_client 8 [#1867](https://github.com/jupyter/nbconvert/pull/1867) ([@blink1073](https://github.com/blink1073)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/jupyter/nbconvert/graphs/contributors?from=2022-10-03&to=2022-10-06&type=c)) [@blink1073](https://github.com/search?q=repo%3Ajupyter%2Fnbconvert+involves%3Ablink1073+updated%3A2022-10-03..2022-10-06&type=Issues) ## 7.1.0 - Fix markdown table not render bug by @Neutree in [#1853](https://github.com/jupyter/nbconvert/pull/1853) - Replace lxml.html.clean_html with bleach; drop lxml dependency by @akx in [#1854](https://github.com/jupyter/nbconvert/pull/1854) - Remove CircleCI badge from README by @akx in [#1857](https://github.com/jupyter/nbconvert/pull/1857) - Added support for section (slide) "data-\*" attributes by @bouzidanas in [#1861](https://github.com/jupyter/nbconvert/pull/1861) ## 7.0.0 - Update to Mistune 2.0.2 by @TiagodePAlves in [#1764](https://github.com/jupyter/nbconvert/pull/1764) - Add qtpdf and qtpng exporters by @davidbrochart in [#1611](https://github.com/jupyter/nbconvert/pull/1611) - Add recursive flag for glob notebook search by @paoloalba in [#1785](https://github.com/jupyter/nbconvert/pull/1785) - Encode SVG image data as UTF-8 before calling lxml cleaner by @emarsden in [#1837](https://github.com/jupyter/nbconvert/pull/1837) - Fix lab template output alignment by @dakoop in [#1795](https://github.com/jupyter/nbconvert/pull/1795) - Handle nbformat 5.5 by @blink1073 [#1841](https://github.com/jupyter/nbconvert/pull/1841) - Remove downloaded CSS from repository by @martinRenou [#1827](https://github.com/jupyter/nbconvert/pull/1827) - Switch from entrypoints to importlib-metadata by @konstin in [#1782](https://github.com/jupyter/nbconvert/pull/1782) - Updates for sphinx 5.0 support by @blink1073 in [#1788](https://github.com/jupyter/nbconvert/pull/1788) - Fixed unique div ids in lab template, fixed #1759 by @veghdev in [#1761](https://github.com/jupyter/nbconvert/pull/1761) - WebPDFExporter: Emulate media print by @martinRenou in [#1791](https://github.com/jupyter/nbconvert/pull/1791) - Fix fonts overridden by user stylesheet by inheriting styles by @dakoop in [#1793](https://github.com/jupyter/nbconvert/pull/1793) - Fix lab template output alignment by @dakoop in [#1795](https://github.com/jupyter/nbconvert/pull/1795) - Clean up markdown parsing by @blink1073 in [#1774](https://github.com/jupyter/nbconvert/pull/1774) - Switch to hatch build backend by @blink1073 in [#1777](https://github.com/jupyter/nbconvert/pull/1777) ## 6.5.0 - Support bleach 5, add packaging and tinycss2 dependencies by @bollwyvl in [#1755](https://github.com/jupyter/nbconvert/pull/1755) - Drop dependency on testpath. by @anntzer in [#1723](https://github.com/jupyter/nbconvert/pull/1723) - Adopt pre-commit by @blink1073 in [#1744](https://github.com/jupyter/nbconvert/pull/1744), [#1746](https://github.com/jupyter/nbconvert/pull/1746), [#1748](https://github.com/jupyter/nbconvert/pull/1748), [#1749](https://github.com/jupyter/nbconvert/pull/1749), [#1757](https://github.com/jupyter/nbconvert/pull/1757) - Add pytest settings and handle warnings by @blink1073 in [#1745](https://github.com/jupyter/nbconvert/pull/1745) - Update cli example by @leahecole in [#1753](https://github.com/jupyter/nbconvert/pull/1753) - Clean up workflows by @blink1073 in [#1750](https://github.com/jupyter/nbconvert/pull/1750) ## 6.4.4 - HTMLExporter: Respect the embed_images flag for HTML blocks [#1721](https://github.com/jupyter/nbconvert/pull/1721) ## 6.4.3 - Remove ipython genutils [#1727](https://github.com/jupyter/nbconvert/pull/1727) - Add section to customizing showing how to use template inheritance [#1719](https://github.com/jupyter/nbconvert/pull/1719) ## 6.4.2 - Adding theme support for WebPDF exporter [#1718](https://github.com/jupyter/nbconvert/pull/1718) - Add option to embed_images in Markdown cells [#1717](https://github.com/jupyter/nbconvert/pull/1717) - HTMLExporter: Add theme alias and docs [#1716](https://github.com/jupyter/nbconvert/pull/1716) - Add basic support for federated labextensions themes [#1703](https://github.com/jupyter/nbconvert/pull/1703) - Always hide the collapser element [#1712](https://github.com/jupyter/nbconvert/pull/1712) - Raise pyppeteer requirement to >=1,\<1.1 [#1711](https://github.com/jupyter/nbconvert/pull/1711) ## 6.4.1 - Handle needs_background cell metadata [#1704](https://github.com/jupyter/nbconvert/pull/1704) - Fix styling regression [#1708](https://github.com/jupyter/nbconvert/pull/1708) - Fix DOM structure of markdown cells in lab template [#1709](https://github.com/jupyter/nbconvert/pull/1709) - CodeMirror style bleed fix [#1710](https://github.com/jupyter/nbconvert/pull/1710) ## 6.4.0 The full list of changes can be seen on the [6.4.0 milestone](https://github.com/jupyter/nbconvert/milestone/23?closed=1) - Allow passing extra args to code highlighter [#1683](https://github.com/jupyter/nbconvert/pull/1683) - Prevent page breaks in outputs when printing [#1679](https://github.com/jupyter/nbconvert/pull/1679) - Add collapsers to template [#1689](https://github.com/jupyter/nbconvert/pull/1689) - Optionally speed up validation [#1672](https://github.com/jupyter/nbconvert/pull/1672) ## 6.3.0 The full list of changes can be seen on the [6.3.0 milestone](https://github.com/jupyter/nbconvert/milestone/22?closed=1) - Update state filter [#1664](https://github.com/jupyter/nbconvert/pull/1664) - Add slide numbering [#1654](https://github.com/jupyter/nbconvert/pull/1654) - Fix HTML templates mentioned in help docs [#1653](https://github.com/jupyter/nbconvert/pull/1653) ## 6.2.0 The full list of changes can be seen on the [6.2.0 milestone](https://github.com/jupyter/nbconvert/milestone/21?closed=1) - Add the ability to fully customize `widget_renderer_url` [#1614](https://github.com/jupyter/nbconvert/pull/1614) - Enable users to customize MathJax URLs [#1609](https://github.com/jupyter/nbconvert/pull/1609) - Add CLI configuration for disable-chromium-sandbox [#1625](https://github.com/jupyter/nbconvert/pull/1625) - Enables webpdf to be rendered with templates [#1601](https://github.com/jupyter/nbconvert/pull/1601) - Adds dejavu [#1599](https://github.com/jupyter/nbconvert/pull/1599) ## 6.1.0 This release is mostly a long list of bug fixes and capability additions. Thanks to the many contributors for helping Improve nbconvert! The following 31 authors contributed 81 commits. - Adolph - Alessandro Finamore - Angus Hollands - Atsuo Ishimoto - Bo - David Brochart - Frédéric Collonval - Jeremy Howard - Jim Zwartveld - José Ignacio Romero - Joyce Er - joyceerhl - Kyle Cutler - Leah E. Cole - Leah Wasser - Nihiue - Matthew Seal - Michael Adolph - Mohammad Mostafa Farzan - Okky Mabruri - Pill-GZ - ptcane - Raniere Silva - Ryan Moe - Stefan Lang - Sylvain Corlay - Tobin Jones - txoof - Yuvi Panda ### Significant Changes - Dropped Python 3.6 and added Python 3.9 [#1542](https://github.com/jupyter/nbconvert/pull/1542) and [#1556](https://github.com/jupyter/nbconvert/pull/1556) - Convert execute preprocessor wrapper to resemble papermill [#1448](https://github.com/jupyter/nbconvert/pull/1448) ### Comprehensive notes - Feature: support static widgets in Reveal.js slides [#1553](https://github.com/jupyter/nbconvert/pull/1553) - Feature: add speaker notes to Reveal.js template [#1543](https://github.com/jupyter/nbconvert/pull/1543) - Add correct output mimetype to WebPDF exporter [#1534](https://github.com/jupyter/nbconvert/pull/1534) - Set mimetype for webpdf correctly [#1514](https://github.com/jupyter/nbconvert/pull/1514) - Fix docstring issue and a broken link [#1576](https://github.com/jupyter/nbconvert/pull/1576) - Add CLI example for removing cell tag syntax [#1504](https://github.com/jupyter/nbconvert/pull/1504) - Include output of stdin stream in lab template [#1454](https://github.com/jupyter/nbconvert/pull/1454) - Don't use a shell to call inkscape [#1512](https://github.com/jupyter/nbconvert/pull/1512) - JupyterLab export as HTML with widgets fails to load widgets [#1474](https://github.com/jupyter/nbconvert/pull/1474) - Move note inside Reveal.js HTML slideshow [#1510](https://github.com/jupyter/nbconvert/pull/1510) - fix issue 1507: broken command line option --CSSHTMLHeaderPreprocessor.style= [#1548](https://github.com/jupyter/nbconvert/pull/1548) - Fix order of template paths [#1496](https://github.com/jupyter/nbconvert/pull/1496) - Changed documentation of external_exporters [#1582](https://github.com/jupyter/nbconvert/pull/1582) - Fix template precedence when using a custom template (#1558) [#1577](https://github.com/jupyter/nbconvert/pull/1577) - add pip to docs envt [#1571](https://github.com/jupyter/nbconvert/pull/1571) - Fix CI By Adding PIP to conda envt for docs build [#1570](https://github.com/jupyter/nbconvert/pull/1570) - Explicitly install pip in docs environment.yml [#1569](https://github.com/jupyter/nbconvert/pull/1569) - small update to docs hide cell [#1567](https://github.com/jupyter/nbconvert/pull/1567) - Allow child templates to override mathjax [#1551](https://github.com/jupyter/nbconvert/pull/1551) - Allow get_export_names to skip configuration check [#1471](https://github.com/jupyter/nbconvert/pull/1471) - Update docs: Tex Live package on Ubuntu [#1555](https://github.com/jupyter/nbconvert/pull/1555) - Test jupyter_client [#1545](https://github.com/jupyter/nbconvert/pull/1545) - Update jupyterlab css [#1539](https://github.com/jupyter/nbconvert/pull/1539) - Webpdf: Use a temporary file instead of an URL [#1489](https://github.com/jupyter/nbconvert/pull/1489) - Applied patch for marking network changes [#1527](https://github.com/jupyter/nbconvert/pull/1527) - Change webpdf display name [#1515](https://github.com/jupyter/nbconvert/pull/1515) - Allow disabling pyppeteer sandbox [#1516](https://github.com/jupyter/nbconvert/pull/1516) - Make pagination configurable in webpdf [#1513](https://github.com/jupyter/nbconvert/pull/1513) - Fix Reveal.js version in documentation [#1509](https://github.com/jupyter/nbconvert/pull/1509) - Fix dangling reference to get_template_paths() [#1463](https://github.com/jupyter/nbconvert/pull/1463) - Solved svg2pdf conversion error if Inkscape is installed into the default path on a windows machine [#1469](https://github.com/jupyter/nbconvert/pull/1469) - fix typo [#1499](https://github.com/jupyter/nbconvert/pull/1499) - Update version dependency of traitlets [#1498](https://github.com/jupyter/nbconvert/pull/1498) - Update execute.py [#1457](https://github.com/jupyter/nbconvert/pull/1457) - Fix code output indentation when running nbconvert --no-input [#1444](https://github.com/jupyter/nbconvert/pull/1444) - fix issue (i'd call it a BUG) #1167 [#1450](https://github.com/jupyter/nbconvert/pull/1450) - #1428 add docstring [#1433](https://github.com/jupyter/nbconvert/pull/1433) - Update nbconvert_library.ipynb [#1438](https://github.com/jupyter/nbconvert/pull/1438) - Supports isolated iframe when converting to HTML [#1593](https://github.com/jupyter/nbconvert/pull/1593) ## 6.0.7 Primarily a release addressing template extensions issues reported since 6.0 launched. ### Comprehensive notes - Comment typo fix [#1425](https://github.com/jupyter/nbconvert/pull/1425) - Documented updated to default conversion changes from 6.0 [#1426](https://github.com/jupyter/nbconvert/pull/1426) - Allow custom template files outside of the template system to set their base template name [#1429](https://github.com/jupyter/nbconvert/pull/1429) - Restored basic template from 5.x [#1431](https://github.com/jupyter/nbconvert/pull/1431) - Added proper support for backwards compatibility templates [#1431](https://github.com/jupyter/nbconvert/pull/1431) ## 6.0.6 A range of bug fixes for webpdf exports ### Comprehensive notes - Removed CSS preprocessor from default proprocessor list (fixes classic rendering) [#1411](https://github.com/jupyter/nbconvert/pull/1411) - Fixed error when pickling TemplateExporter [#1399](https://github.com/jupyter/nbconvert/pull/1399) - Support for fractional height html / webpdf exports [#1413](https://github.com/jupyter/nbconvert/pull/1413) - Added short wait time for fonts and rendering in webpdf [#1414](https://github.com/jupyter/nbconvert/pull/1414) - Updated template documentation - Minor fixes to the webpdf exporter [#1419](https://github.com/jupyter/nbconvert/pull/1419) - Fixup use with a running event loop within webpdf [#1420](https://github.com/jupyter/nbconvert/pull/1420) - Prevent overflow in input areas in lab template [#1422](https://github.com/jupyter/nbconvert/pull/1422) ## 6.0.5 - Revert networkidle2 change which caused custom cdn-fetched widgets in webpdf ## 6.0.4 ### Comprehensive notes #### Fixing Problems - The webpdf exporters does not add pagebreaks anymore before reaching the maximum height allowed by Adobe [#1402](https://github.com/jupyter/nbconvert/pull/1402) - Fixes some timeout issues with the webpdf exporter [#1400](https://github.com/jupyter/nbconvert/pull/1400) ## 6.0.3 Execute preprocessor no longer add illegal execution counts to markdown cells [#1396](https://github.com/jupyter/nbconvert/pull/1396) ## 6.0.2 A patch for a few minor issues raised out of the 6.0 release. ### Comprehensive notes #### Fixing Problems - Added windows work-around fix in CLI for async applications [#1383](https://github.com/jupyter/nbconvert/pull/1383) - Fixed pathed template files to behave correctly for local relative paths without a dot [#1381](https://github.com/jupyter/nbconvert/pull/1381) - ExecuteProcessor now properly has a `preprocess_cell` function to overwrite [#1380](https://github.com/jupyter/nbconvert/pull/1380) #### Testing, Docs, and Builds - Updated README and docs with guidance on how to get help with nbconvert [#1377](https://github.com/jupyter/nbconvert/pull/1377) - Fixed documentation that was referencing `template_path` instead of `template_paths` [#1374](https://github.com/jupyter/nbconvert/pull/1374) ## 6.0.1 A quick patch to fix an issue with get_exporter [#1367](https://github.com/jupyter/nbconvert/pull/1367) ## 6.0 The following authors and reviewers contributed the changes for this release -- Thanks you all! - Ayaz Salikhov - bnables - Bo - David Brochart - David Cortés - Eric Wieser - Florian Rathgeber - Ian Allison - James Wilshaw - Jeremy Tuloup - Joel Ostblom - Jon Bannister - Jonas Drotleff - Josh Devlin - Karthikeyan Singaravelan - Kerwin.Sun - letmerecall - Luciano Resende - Lumír 'Frenzy' Balhar - Maarten A. Breddels - Maarten Breddels - Marcel Stimberg - Matthew Brett - Matthew Seal - Matthias Bussonnier - Matthias Geier - Miro HronÄ�ok - Phil Austin - Praveen Batra - Ruben Di Battista - Ruby Werman - Sang-Yun Oh - Sergey Kizunov - Sundar - Sylvain Corlay - telamonian - Thomas Kluyver - Thomas Ytterdal - Tyler Makaro - Yu-Cheng (Henry) Huang ### Significant Changes Nbconvert 6.0 is a major release of nbconvert which includes many significant changes. - Python 2 support was dropped. Currently Python 3.6-3.8 is supported and tested by nbconvert. However, nbconvert 6.0 provides limited support for Python 3.6. nbconvert 6.1 will drop support for Python 3.6. Limited support means we will test and run CI on Python 3.6.12 or higher. Issues that are found only affecting Python 3.6 are not guaranteed to be fixed. We recommend all users of nbconvert use Python 3.7 and higher. - Unlike previous versions, nbconvert 6.0 relies on the [nbclient](https://github.com/jupyter/nbclient/) package for the execute preprocessor, which allows for asynchronous kernel requests. - `template_path` has become `template_paths`. If referring to a 5.x style `.tpl` template use the full path with the `template_file` argument to the file. On the command line the pattern is `--template-file=`. - Nbconvert 6.0 includes a new "webpdf" exporter, which renders notebooks in pdf format through a headless web browser, so that complex outputs such as HTML tables, or even widgets are rendered in the same way as with the HTML exporter and a web browser. - The default template applied when exporting to HTML now produces the same DOM structure as JupyterLab, and is styled using JupyterLab's CSS. The pygments theme in use mimics JupyterLab's codemirror mode with the same CSS variables, so that custom JupyterLab themes could be applied. The classic notebook styling can still be enabled with ```bash jupyter nbconvert --to html --template classic ``` - Nbconvert 6.0 includes a new system for creating custom templates, which can now be installed as packages. A custom "foobar" template is installed in Jupyter's data directory under `nbconvert/templates` and has the form of a directory containing all resources. Templates specify their base template as well as other configuration parameters in a `conf.json` at the root of the template directory. - The "slideshow" template now makes use of RevealJS version 4. It can now be used with the HTML exporter with ```bash jupyter nbconvert --to html --template reveal ``` The `--to slides` exporter is still supported for convenience. - Inkscape 1.0 is now supported, which had some breaking changes that prevented 5.x versions of nbconvert from converting documents on some systems that updated. ### Remaining changes We merged 105 pull requests! Rather than enumerate all of them we'll link to the github page which contains the many smaller impact improvements. The full list can be seen [on GitHub](https://github.com/jupyter/nbconvert/issues?q=milestone%3A6.0+) ## 5.6.1 The following authors and reviewers contributed the changes for this release -- Thanks you all! - Charles Frye - Chris Holdgraf - Felipe Rodrigues - Gregor Sturm - Jim - Kerwin Sun - Ryan Beesley - Matthew Seal - Matthias Geier - thuy-van - Tyler Makaro ### Significant Changes #### RegExRemove applies to all cells RegExRemove preprocessor now removes cells regardless of cell outputs. Before this only cells that had outputs were filtered. ### Comprehensive notes #### New Features - Add support for alt tags for jpeg and png images [#1112](https://github.com/jupyter/nbconvert/pull/1112) - Allow HTML header anchor text to be HTML [#1101](https://github.com/jupyter/nbconvert/pull/1101) - Change RegExRemove to remove code cells with output [#1095](https://github.com/jupyter/nbconvert/pull/1095) - Added cell tag data attributes to HTML exporter [#1090](https://github.com/jupyter/nbconvert/pull/1090) and [#1089](https://github.com/jupyter/nbconvert/pull/1089) #### Fixing Problems - Update svg2pdf.py to search the PATH for inkscape [#1115](https://github.com/jupyter/nbconvert/pull/1115) - Fix latex dependencies installation command for Ubuntu systems [#1109](https://github.com/jupyter/nbconvert/pull/1109) #### Testing, Docs, and Builds - Added Circle CI builds for documentation [#1114](https://github.com/jupyter/nbconvert/pull/1114) [#1120](https://github.com/jupyter/nbconvert/pull/1120), and [#1116](https://github.com/jupyter/nbconvert/pull/1116) - Fix typo in argument name in docstring (TagRemovePreprocessor) [#1103](https://github.com/jupyter/nbconvert/pull/1103) - Changelog typo fix [#1100](https://github.com/jupyter/nbconvert/pull/1100) - Updated API page for TagRemovePreprocessor and TemplateExporter [#1088](https://github.com/jupyter/nbconvert/pull/1088) - Added remove_input_tag traitlet to the docstring [#1088](https://github.com/jupyter/nbconvert/pull/1088) ## 5.6 The following 24 authors and reviewers contributed 224 commits -- Thank you all! - 00Kai0 - Aidan Feldman - Alex Rudy - Alexander Kapshuna - Alexander Rudy - amniskin - Carol Willing - Dustin H - Hsiaoming Yang - imtsuki - Jessica B. Hamrick - KrokodileDandy - Kunal Marwaha - Matthew Seal - Matthias Geier - Miro HronÄ�ok - M Pacer - Nils Japke - njapke - Sebastian Führ - Sylvain Corlay - Tyler Makaro - Valery M - Wayne Witzel The full list of changes they made can be seen [on GitHub](https://github.com/jupyter/nbconvert/issues?q=milestone%3A5.6+) ### Significant Changes #### Jupter Client Pin The `jupyter_client` dependency is now pinned to `>5.3.1`. This is done to support the Parallel NBConvert below, and future versions may require interface changes from that version. #### Parallel NBConvert NBConvert `--execute` can now be run in parallel via threads, multiprocessing, or async patterns! This means you can now parallelize nbconvert via a bash loop, or a python concurrency pattern and it should be able to execute those notebooks in parallel. Kernels have varying support for safe concurrent execution. The ipython kernel (ipykernel version 1.5.2 and higher) should be safe to run concurrently using Python 3. However, the Python 2 ipykernel does not always provide safe concurrent execution and sometimes fails with a socket bind exception. Unlike ipykernel which is maintained by the project, other community-maintained kernels may have varying support for concurrent execution, and these kernels were not tested heavily. Issues for nbconvert can be viewed here: [#1018](https://github.com/jupyter/nbconvert/pull/1018), and [#1017](https://github.com/jupyter/nbconvert/pull/1017) #### Execute Loop Rewrite This release completely rewrote the execution loop responsible for monitoring kernel messages until cell execution is completed. This removes an error where kernel messages could be dropped if too many were posted too quickly. Furthermore, the change means that messages are not buffered. Now, messages can be logged immediately rather than waiting for the cell to terminate. See [#994](https://github.com/jupyter/nbconvert/pull/994) for exact code changes if you're curious. ### Comprehensive notes #### New Features - Make a default global location for custom user templates [#1028](https://github.com/jupyter/nbconvert/pull/1028) - Parallel execution improvements [#1018](https://github.com/jupyter/nbconvert/pull/1018), and [#1017](https://github.com/jupyter/nbconvert/pull/1017) - Added `store_history` option to `preprocess_cell` and `run_cell` [#1055](https://github.com/jupyter/nbconvert/pull/1055) - Simplify the function signature for preprocess() [#1042](https://github.com/jupyter/nbconvert/pull/1042) - Set flag to not always stop kernel execution on errors [#1040](https://github.com/jupyter/nbconvert/pull/1040) - `setup_preprocessor` passes kwargs to `start_new_kernel` [#1021](https://github.com/jupyter/nbconvert/pull/1021) #### Fixing Problems - Very fast stream outputs no longer drop some messages [#994](https://github.com/jupyter/nbconvert/pull/994) - LaTeX errors now properly raise exceptions [#1053](https://github.com/jupyter/nbconvert/pull/1053) - Improve template whitespacing [#1076](https://github.com/jupyter/nbconvert/pull/1076) - Fixes for character in LaTeX exports and filters [#1068](https://github.com/jupyter/nbconvert/pull/1068), [#1039](https://github.com/jupyter/nbconvert/pull/1039), [#1024](https://github.com/jupyter/nbconvert/pull/1024), and [#1077](https://github.com/jupyter/nbconvert/pull/1077) - Mistune pinned in preparation for 2.0 release [#1074](https://github.com/jupyter/nbconvert/pull/1074) - Require mock only on Python 2 [#1060](https://github.com/jupyter/nbconvert/pull/1060) and [#1011](https://github.com/jupyter/nbconvert/pull/1011) - Fix selection of mimetype when converting to HTML [#1036](https://github.com/jupyter/nbconvert/pull/1036) - Correct a few typos [#1029](https://github.com/jupyter/nbconvert/pull/1029) - Update `export_from_notebook` names [#1027](https://github.com/jupyter/nbconvert/pull/1027) - Dedenting html in ExtractOutputPreprocessor [#1023](https://github.com/jupyter/nbconvert/pull/1023) - Fix backwards incompatibility with markdown2html [#1022](https://github.com/jupyter/nbconvert/pull/1022) - Fixed html image tagging [#1013](https://github.com/jupyter/nbconvert/pull/1013) - Remove unnecessary css [#1010](https://github.com/jupyter/nbconvert/pull/1010) #### Testing, Docs, and Builds - Pip-install nbconvert on readthedocs.org [#1069](https://github.com/jupyter/nbconvert/pull/1069) - Fix various doc build issues [#1051](https://github.com/jupyter/nbconvert/pull/1051), [#1050](https://github.com/jupyter/nbconvert/pull/1050), [#1019](https://github.com/jupyter/nbconvert/pull/1019), and [#1048](https://github.com/jupyter/nbconvert/pull/1048) - Add issue templates [#1046](https://github.com/jupyter/nbconvert/pull/1046) - Added instructions for bumping the version forward when releasing [#1034](https://github.com/jupyter/nbconvert/pull/1034) - Fix Testing on Windows [#1030](https://github.com/jupyter/nbconvert/pull/1030) - Refactored `test_run_notebooks` [#1015](https://github.com/jupyter/nbconvert/pull/1015) - Fixed documentation typos [#1009](https://github.com/jupyter/nbconvert/pull/1009) ## 5.5 The following 18 authors contributed 144 commits -- Thank you all! - Benjamin Ragan-Kelley - Clayton A Davis - DInne Bosman - Doug Blank - Henrique Silva - Jeff Hale - Lukasz Mitusinski - M Pacer - Maarten Breddels - Madhumitha N - Matthew Seal - Paul Gowder - Philipp A - Rick Lupton - Rüdiger Busche - Thomas Kluyver - Tyler Makaro - WrRan The full list of changes they made can be seen [on GitHub](https://github.com/jupyter/nbconvert/issues?q=milestone%3A5.5+) ### Significant Changes #### Deprecations Python 3.4 support was dropped. Many of our upstream libraries stopped supporting 3.4 and it was found that serious bugs were being caught during testing against those libraries updating past 3.4. See [#979](https://github.com/jupyter/nbconvert/pull/979) for details. #### IPyWidget Support Now when a notebook executing contains [Jupyter Widgets](https://github.com/jupyter-widgets/ipywidgets/), the state of all the widgets can be stored in the notebook's metadata. This allows rendering of the live widgets on, for instance nbviewer, or when converting to html. You can tell nbconvert to not store the state using the `store_widget_state` argument: ``` jupyter nbconvert --ExecutePreprocessor.store_widget_state=False --to notebook --execute mynotebook.ipynb ``` This widget rendering is not performed against a browser during execution, so only widget default states or states manipulated via user code will be calculated during execution. `%%javascript` cells will execute upon notebook rendering, enabling complex interactions to function as expected when viewed by a UI. If you can't view widget results after execution, you may need to select `File --> Trust Notebook` in the menu. See [#779](https://github.com/jupyter/nbconvert/pull/779), [#900](https://github.com/jupyter/nbconvert/pull/900), and [#983](https://github.com/jupyter/nbconvert/pull/983) for details. #### Execute Preprocessor Rework Based on monkey patching required in [papermill](https://github.com/nteract/papermill/blob/0.19.1/papermill/preprocess.py) the `run_cell` code path in the ExecutePreprocessor was reworked to allow for accessing individual message parses without reimplementing the entire function. Now there is a `process_message` function which take a ZeroMQ message and applies all of its side-effect updates on the cell/notebook objects before returning the output it generated, if it generated any such output. The change required a much more extensive test suite covering cell execution as test coverage on the various, sometimes wonky, code paths made improvements and reworks impossible to prove undamaging. Now changes to kernel message processing has much better coverage, so future additions or changes with specs over time will be easier to add. See [#905](https://github.com/jupyter/nbconvert/pull/905) and [#982](https://github.com/jupyter/nbconvert/pull/982) for details #### Out Of Memory Kernel Failure Catches When running out of memory on a machine, if the kernel process was killed by the operating system it would result in a timeout error at best and hang indefinitely at worst. Now regardless of timeout configuration, if the underlying kernel process dies before emitting any messages to the effect an exception will be raised notifying the consumer of the lost kernel within a few seconds. See [#959](https://github.com/jupyter/nbconvert/pull/959), [#971](https://github.com/jupyter/nbconvert/pull/971), and [#998](https://github.com/jupyter/nbconvert/pull/998) for details #### Latex / PDF Template Improvements The latex template was long overdue for improvements. The default template had a rewrite which makes exports for latex and pdf look a lot better. Code cells in particular render much better with line breaks and styling the more closely matches notebook browser rendering. Thanks t-makaro for the efforts here! See [#992](https://github.com/jupyter/nbconvert/pull/992) for details ### Comprehensive notes #### New Features - IPyWidget Support [#779](https://github.com/jupyter/nbconvert/pull/779), [#900](https://github.com/jupyter/nbconvert/pull/900), and [#983](https://github.com/jupyter/nbconvert/pull/983) - A new ClearMetadata Preprocessor is available [#805](https://github.com/jupyter/nbconvert/pull/805) - Support for pandoc 2 [#964](https://github.com/jupyter/nbconvert/pull/964) - New, and better, latex template [#992](https://github.com/jupyter/nbconvert/pull/992) #### Fixing Problems - Refactored execute preprocessor to have a process_message function [#905](https://github.com/jupyter/nbconvert/pull/905): - Fixed OOM kernel failures hanging [#959](https://github.com/jupyter/nbconvert/pull/959) and [#971](https://github.com/jupyter/nbconvert/pull/971) - Fixed latex export for svg data in python 3 [#985](https://github.com/jupyter/nbconvert/pull/985) - Enabled configuration to be shared to exporters from script exporter [#993](https://github.com/jupyter/nbconvert/pull/993) - Make latex errors less verbose [#988](https://github.com/jupyter/nbconvert/pull/988) - Typo in template syntax [#984](https://github.com/jupyter/nbconvert/pull/984) - Improved attachments +fix supporting non-unique names [#980](https://github.com/jupyter/nbconvert/pull/980) - PDFExporter "output_mimetype" traitlet is not longer 'text/latex' [#972](https://github.com/jupyter/nbconvert/pull/972) - FIX: respect wait for clear_output [#969](https://github.com/jupyter/nbconvert/pull/969) - address deprecation warning in cgi.escape [#963](https://github.com/jupyter/nbconvert/pull/963) - Correct inaccurate description of available LaTeX template [#958](https://github.com/jupyter/nbconvert/pull/958) - Fixed kernel death detection for executions with timeouts [#998](https://github.com/jupyter/nbconvert/pull/998): - Fixed export names for various templates [#1000](https://github.com/jupyter/nbconvert/pull/1000), [#1001](https://github.com/jupyter/nbconvert/pull/1001), and [#1001](https://github.com/jupyter/nbconvert/pull/1001): #### Deprecations - Dropped support for python 3.4 [#979](https://github.com/jupyter/nbconvert/pull/979) - Removed deprecated `export_by_name` [#945](https://github.com/jupyter/nbconvert/pull/945) #### Testing, Docs, and Builds - Added tests for each branch in execute's run_cell method [#982](https://github.com/jupyter/nbconvert/pull/982) - Mention formats in --to options more clearly [#991](https://github.com/jupyter/nbconvert/pull/991) - Adds ascii output type to command line docs page, mention image folder output [#956](https://github.com/jupyter/nbconvert/pull/956) - Simplify setup.py [#949](https://github.com/jupyter/nbconvert/pull/949) - Use utf-8 encoding in execute_api example [#921](https://github.com/jupyter/nbconvert/pull/921) - Upgrade pytest on Travis [#941](https://github.com/jupyter/nbconvert/pull/941) - Fix LaTeX base template name in docs [#940](https://github.com/jupyter/nbconvert/pull/940) - Updated release instructions based on 5.4 release walk-through [#887](https://github.com/jupyter/nbconvert/pull/887) - Fixed broken link to jinja docs [#997](https://github.com/jupyter/nbconvert/pull/997) ## 5.4.1 [5.4.1 on Github](https://github.com/jupyter/nbconvert/milestones/5.4.1) Thanks to the following 11 authors who contributed 57 commits. - Benjamin Ragan-Kelley - Carol Willing - Clayton A Davis - Daniel Rodriguez - M Pacer - Matthew Seal - Matthias Geier - Matthieu Parizy - Rüdiger Busche - Thomas Kluyver - Tyler Makaro ### Comprehensive notes #### New Features - Expose pygments styles [#889](https://github.com/jupyter/nbconvert/pull/889) - Tornado 6.0 support -- Convert proxy handler from callback to coroutine [#937](https://github.com/jupyter/nbconvert/pull/937) - Add option to overwrite the highlight_code filter [#877](https://github.com/jupyter/nbconvert/pull/877) #### Fixing Problems - Mathjax.tpl fix for rendering Latex in html [#932](https://github.com/jupyter/nbconvert/pull/932) - Backwards compatibility for empty kernel names [#927](https://github.com/jupyter/nbconvert/pull/927) [#924](https://github.com/jupyter/nbconvert/pull/924) #### Testing, Docs, and Builds - DOC: Add missing language specification to code-block [#882](https://github.com/jupyter/nbconvert/pull/882) ## 5.4 [5.4 on Github](https://github.com/jupyter/nbconvert/milestones/5.4) ### Significant Changes #### Deprecations Python 3.3 support was dropped. The version of python is no longer common and new versions have many fixes and interface improvements that warrant the change in support. See [#843](https://github.com/jupyter/nbconvert/pull/843) for implementation details. #### Changes in how we handle metadata There were a few new metadata fields which are now respected in nbconvert. `nb.metadata.authors` metadata attribute will be respected in latex exports. Multiple authors will be added with `,` separation against their names. `nb.metadata.title` will be respected ahead of `nb.metadata.name` for title assignment. This better matches with the notebook format. `nb.metadata.filename` will override the default `output_filename_template` when extracting notebook resources in the `ExtractOutputPreprocessor`. The attribute is helpful for when you want to consistently fix to a particular output filename, especially when you need to set image filenames for your exports. The `raises-exception` cell tag (`nb.cells[].metadata.tags[raises-exception]`) allows for cell exceptions to not halt execution. The tag is respected in the same way by [nbval](https://github.com/computationalmodelling/nbval) and other notebook interfaces. `nb.metadata.allow_errors` will apply this rule for all cells. This feature is toggleable with the `force_raise_errors` configuration option. Errors from executing the notebook can be allowed with a `raises-exception` tag on a single cell, or the `allow_errors` configurable option for all cells. An allowed error will be recorded in notebook output, and execution will continue. If an error occurs when it is not explicitly allowed, a 'CellExecutionError' will be raised. If `force_raise_errors` is True, `CellExecutionError` will be raised for any error that occurs while executing the notebook. This overrides both the `allow_errors` option and the `raises-exception` cell tags. See [#867](https://github.com/jupyter/nbconvert/pull/867), [#703](https://github.com/jupyter/nbconvert/pull/703), [#685](https://github.com/jupyter/nbconvert/pull/685), [#672](https://github.com/jupyter/nbconvert/pull/672), and [#684](https://github.com/jupyter/nbconvert/pull/684) for implementation changes. #### Configurable kernel managers when executing notebooks The kernel manager can now be optionally passed into the `ExecutePreprocessor.preprocess` and the `executenb` functions as the keyword argument `km`. This means that the kernel can be configured as desired before beginning preprocessing. This is useful for executing in a context where the kernel has external dependencies that need to be set to non-default values. An example of this might be a Spark kernel where you wish to configure the Spark cluster location ahead of time without building a new kernel. Overall the ExecutePreprocessor has been reworked to make it easier to use. Future releases will continue this trend to make this section of the code more inheritable and reusable by others. We encourage you read the source code for this version if you're interested in the detailed improvements. See [#852](https://github.com/jupyter/nbconvert/pull/852) for implementation changes. #### Surfacing exporters in front-ends Exporters are now exposed for front-ends to consume, including classic notebook. As an example, this means that latex exporter will be made available for latex 'text/latex' media type from the Download As interface. See [#759](https://github.com/jupyter/nbconvert/pull/759) and [#864](https://github.com/jupyter/nbconvert/pull/864) for implementation changes. #### Raw Templates Template exporters can now be assigned raw templates as string attributes by setting the `raw_template` variable. ```python class AttrExporter(TemplateExporter): # If the class has a special template and you want it defined within the class raw_template = """{%- extends 'rst.tpl' -%} {%- block in_prompt -%} raw template {%- endblock in_prompt -%} """ exporter_attr = AttrExporter() output_attr, _ = exporter_attr.from_notebook_node(nb) assert "raw template" in output_attr ``` See [#675](https://github.com/jupyter/nbconvert/pull/675) for implementation changes. #### New command line flags The `--no-input` will hide input cells on export. This is great for notebooks which generate "reports" where you want the code that was executed to not appear by default in the extracts. An alias for `notebook` was added to exporter commands. Now `--to ipynb` will behave as `--to notebook` does. See [#825](https://github.com/jupyter/nbconvert/pull/825) and [#873](https://github.com/jupyter/nbconvert/pull/873) for implementation changes. ### Comprehensive notes #### New Features - No input flag (`--no-input`) [#825](https://github.com/jupyter/nbconvert/pull/825) - Add alias `--to ipynb` for notebook exporter [#873](https://github.com/jupyter/nbconvert/pull/873) - Add `export_from_notebook` [#864](https://github.com/jupyter/nbconvert/pull/864) - If set, use `nb.metadata.authors` for LaTeX author line [#867](https://github.com/jupyter/nbconvert/pull/867) - Populate language_info metadata when executing [#860](https://github.com/jupyter/nbconvert/pull/860) - Support for `\mathscr` [#830](https://github.com/jupyter/nbconvert/pull/830) - Allow the execute preprocessor to make use of an existing kernel [#852](https://github.com/jupyter/nbconvert/pull/852) - Refactor ExecutePreprocessor [#816](https://github.com/jupyter/nbconvert/pull/816) - Update widgets CDN for ipywidgets 7 w/fallback [#792](https://github.com/jupyter/nbconvert/pull/792) - Add support for adding custom exporters to the "Download as" menu. [#759](https://github.com/jupyter/nbconvert/pull/759) - Enable ANSI underline and inverse [#696](https://github.com/jupyter/nbconvert/pull/696) - Update notebook css to 5.4.0 [#748](https://github.com/jupyter/nbconvert/pull/748) - Change default for slides to direct to the reveal cdn rather than locally [#732](https://github.com/jupyter/nbconvert/pull/732) - Use "title" instead of "name" for metadata to match the notebook format [#703](https://github.com/jupyter/nbconvert/pull/703) - Img filename metadata [#685](https://github.com/jupyter/nbconvert/pull/685) - Added MathJax compatibility definitions [#687](https://github.com/jupyter/nbconvert/pull/687) - Per cell exception [#684](https://github.com/jupyter/nbconvert/pull/684) - Simple API for in-memory templates [#674](https://github.com/jupyter/nbconvert/pull/674) [#675](https://github.com/jupyter/nbconvert/pull/675) - Set BIBINPUTS and BSTINPUTS environment variables when making PDF [#676](https://github.com/jupyter/nbconvert/pull/676) - If `nb.metadata.title` is set, default to that for notebook [#672](https://github.com/jupyter/nbconvert/pull/672) #### Deprecations - Drop support for python 3.3 [#843](https://github.com/jupyter/nbconvert/pull/843) - Default conversion method on the CLI was removed (`--to html` now required) #### Fixing Problems - Fix api break [#872](https://github.com/jupyter/nbconvert/pull/872) - Don't remove empty cells by default [#784](https://github.com/jupyter/nbconvert/pull/784) - Handle attached images in html converter [#780](https://github.com/jupyter/nbconvert/pull/780) - No need to check for the channels already running [#862](https://github.com/jupyter/nbconvert/pull/862) - Update `font-awesome` version for slides [#793](https://github.com/jupyter/nbconvert/pull/793) - Properly treat JSON data [#847](https://github.com/jupyter/nbconvert/pull/847) - Skip executing empty code cells [#739](https://github.com/jupyter/nbconvert/pull/739) - Ppdate log.warn (deprecated) to log.warning [#804](https://github.com/jupyter/nbconvert/pull/804) - Cleanup notebook.tex during PDF generation [#768](https://github.com/jupyter/nbconvert/pull/768) - Windows unicode error fixed, nosetest added to setup.py [#757](https://github.com/jupyter/nbconvert/pull/757) - Better content hiding; template & testing improvements [#734](https://github.com/jupyter/nbconvert/pull/734) - Fix Jinja syntax in custom template example. [#738](https://github.com/jupyter/nbconvert/pull/738) - Fix for an issue with empty math block [#729](https://github.com/jupyter/nbconvert/pull/729) - Add parser for Multiline math for LaTeX blocks [#716](https://github.com/jupyter/nbconvert/pull/716) [#717](https://github.com/jupyter/nbconvert/pull/717) - Use defusedxml to parse potentially untrusted XML [#708](https://github.com/jupyter/nbconvert/pull/708) - Fixes for traitlets 4.1 deprecation warnings [#695](https://github.com/jupyter/nbconvert/pull/695) #### Testing, Docs, and Builds - A couple of typos [#870](https://github.com/jupyter/nbconvert/pull/870) - Add python_requires metadata. [#871](https://github.com/jupyter/nbconvert/pull/871) - Document `--inplace` command line flag. [#839](https://github.com/jupyter/nbconvert/pull/839) - Fix minor typo in `usage.rst` [#863](https://github.com/jupyter/nbconvert/pull/863) - Add note about local `reveal_url_prefix` [#844](https://github.com/jupyter/nbconvert/pull/844) - Move `onlyif_cmds_exist` decorator to test-specific utils [#854](https://github.com/jupyter/nbconvert/pull/854) - Include LICENSE file in wheels [#827](https://github.com/jupyter/nbconvert/pull/827) - Added Ubuntu Linux Instructions [#724](https://github.com/jupyter/nbconvert/pull/724) - Check for too recent of pandoc version [#814](https://github.com/jupyter/nbconvert/pull/814) [#872](https://github.com/jupyter/nbconvert/pull/872) - Removing more nose remnants via dependencies. [#758](https://github.com/jupyter/nbconvert/pull/758) - Remove offline statement and add some clarifications in slides docs [#743](https://github.com/jupyter/nbconvert/pull/743) - Linkify PR number [#710](https://github.com/jupyter/nbconvert/pull/710) - Added shebang for python [#694](https://github.com/jupyter/nbconvert/pull/694) - Upgrade mistune dependency [#705](https://github.com/jupyter/nbconvert/pull/705) - add feature to improve docs by having links to prs [#662](https://github.com/jupyter/nbconvert/pull/662) - Update notebook CSS from version 4.3.0 to 5.1.0 [#682](https://github.com/jupyter/nbconvert/pull/682) - Explicitly exclude or include all files in Manifest. [#670](https://github.com/jupyter/nbconvert/pull/670) ## 5.3.1 [5.3.1 on Github](https://github.com/jupyter/nbconvert/milestones/5.3.1) - MANIFEST.in updated to include `LICENSE` and `scripts/` when creating sdist. [#666](https://github.com/jupyter/nbconvert/pull/666) ## 5.3 [5.3 on Github](https://github.com/jupyter/nbconvert/milestones/5.3) ### Major features #### Tag Based Element Filtering For removing individual elements from notebooks, we need a way to signal to nbconvert that the elements should be removed. With this release, we introduce the use of tags for that purpose. Tags are user-defined strings attached to cells or outputs. They are stored in cell or output metadata. For more on tags see the [nbformat docs on cell metadata](https://nbformat.readthedocs.io/en/latest/format_description.html#cell-metadata). **Usage**: 1. Apply tags to the elements that you want to remove. For removing an entire cell, the cell input, or all cell outputs apply the tag to the cell. For removing individual outputs, put the tag in the output metadata using a call like `display(your_output_element, metadata={tags=[]})`. _NB_: Use different tags depending on whether you want to remove the entire cell, the input, all outputs, or individual outputs. 2. Add the tags for removing the different kinds of elements to the following traitlets. Which kind of element you want to remove determines which traitlet you add the tags to. The following traitlets remove elements of different kinds: - `remove_cell_tags`: removes cells - `remove_input_tags`: removes inputs - `remove_all_outputs_tag`: removes all outputs - `remove_single_output_tag`: removes individual outputs ### Comprehensive notes - new: configurable `browser` in ServePostProcessor [#618](https://github.com/jupyter/nbconvert/pull/618) - new: `--clear-output` command line flag to clear output in-place [#619](https://github.com/jupyter/nbconvert/pull/619) - new: remove elements based on tags with `TagRemovePreprocessor`. [#640](https://github.com/jupyter/nbconvert/pull/640), [#643](https://github.com/jupyter/nbconvert/pull/643) - new: CellExecutionError can now be imported from `nbconvert.preprocessors` [#656](https://github.com/jupyter/nbconvert/pull/656) - new: slides now can enable scrolling and custom transitions [#600](https://github.com/jupyter/nbconvert/pull/600) - docs: Release instructions for nbviewer-deploy - docs: improved instructions for handling errors using the `ExecutePreprocessor` [#656](https://github.com/jupyter/nbconvert/pull/656) - tests: better height/width metadata testing for images in rst & html [#601](https://github.com/jupyter/nbconvert/pull/601) [#602](https://github.com/jupyter/nbconvert/pull/602) - tests: normalise base64 output data to avoid false positives [#650](https://github.com/jupyter/nbconvert/pull/650) - tests: normalise ipython traceback messages to handle old and new style [#631](https://github.com/jupyter/nbconvert/pull/631) - bug: mathjax obeys `\\(\\)` & `\\[\\]` (both nbconvert & pandoc) [#609](https://github.com/jupyter/nbconvert/pull/609) [#617](https://github.com/jupyter/nbconvert/pull/617) - bug: specify default templates using extensions [#639](https://github.com/jupyter/nbconvert/pull/639) - bug: fix pandoc version number [#638](https://github.com/jupyter/nbconvert/pull/638) - bug: require recent mistune version [#630](https://github.com/jupyter/nbconvert/pull/630) - bug: catch errors from IPython `execute_reply` and `error` messages [#642](https://github.com/jupyter/nbconvert/pull/642) - nose completely removed & dependency dropped [#595](https://github.com/jupyter/nbconvert/pull/595) [#660](https://github.com/jupyter/nbconvert/pull/660) - mathjax processing in mistune now only uses inline grammar [#611](https://github.com/jupyter/nbconvert/pull/611) - removeRegex now enabled by default on all TemplateExporters, does not remove cells with outputs [#616](https://github.com/jupyter/nbconvert/pull/616) - validate notebook after applying each preprocessor (allowing additional attributes) [#645](https://github.com/jupyter/nbconvert/pull/645) - changed COPYING.md to LICENSE for more standard licensing that GitHub knows how to read [#654](https://github.com/jupyter/nbconvert/pull/654) ## 5.2.1 [5.2 on GitHub](https://github.com/jupyter/nbconvert/milestones/5.2) ### Major features In this release (along with the usual bugfixes and documentation improvements, which are legion) we have a few new major features that have been requested for a long time: #### Global Content Filtering You now have the ability to remove input or output from code cells, markdown cells and the input and output prompts. The easiest way to access all of these is by using traitlets like TemplateExporter.exclude_input = True (or, for example HTMLExporter.exclude_markdown = True if you wanted to make it specific to HTML output). On the command line if you just want to not have input or output prompts just use --no-prompt. #### Execute notebooks from a function You can now use the executenb function to execute notebooks as though you ran the execute preprocessor on the notebooks. It returns the standard notebook and resources options. #### Remove cells based on regex pattern This removes cells based on their matching a regex pattern (by default, empty cells). This is the RegexRemovePreprocessor. #### Script exporter entrypoints for nonpython scripts Now there is an entrypoint for having an exporter specific to the type of script that is being exported. While designed for use with the IRkernel in particular (with a script exporter focused on exporting R scripts) other non-python kernels that wish to have a language specific exporter can now surface that directly. ### Comprehensive notes - new: configurable ExecutePreprocessor.startup_timeout configurable [#583](https://github.com/jupyter/nbconvert/pull/583) - new: RemoveCell preprocessor based on cell content (defaults to empty cell) [#575](https://github.com/jupyter/nbconvert/pull/575) - new: function for executing notebooks: `executenb` [#573](https://github.com/jupyter/nbconvert/pull/573) - new: global filtering to remove inputs, outputs, markdown cells (&c.), this works on all templates [#554](https://github.com/jupyter/nbconvert/pull/554) - new: script exporter entrypoint [#531](https://github.com/jupyter/nbconvert/pull/531) - new: configurable anchor link text (previously ¶) `HTMLExporter.anchor_link_text` [#522](https://github.com/jupyter/nbconvert/pull/522) - new: configurable values for slides exporter [#542](https://github.com/jupyter/nbconvert/pull/542) [#558](https://github.com/jupyter/nbconvert/pull/558) - improved releases (how-to documentation, version-number generation and checking) [#593](https://github.com/jupyter/nbconvert/pull/593) - doc improvements [#593](https://github.com/jupyter/nbconvert/pull/593) [#580](https://github.com/jupyter/nbconvert/pull/580) [#565](https://github.com/jupyter/nbconvert/pull/565) [#554](https://github.com/jupyter/nbconvert/pull/554) - language information from cell magics (for highlighting) is now included in more formats [#586](https://github.com/jupyter/nbconvert/pull/586) - mathjax upgrades and cdn fixes [#584](https://github.com/jupyter/nbconvert/pull/584) [#567](https://github.com/jupyter/nbconvert/pull/567) - better CI [#571](https://github.com/jupyter/nbconvert/pull/571) [#540](https://github.com/jupyter/nbconvert/pull/540) - better traceback behaviour when execution errs [#521](https://github.com/jupyter/nbconvert/pull/521) - deprecated nose test features removed [#519](https://github.com/jupyter/nbconvert/pull/519) - bug fixed: we now respect width and height metadata on jpeg and png mimetype outputs [#588](https://github.com/jupyter/nbconvert/pull/588) - bug fixed: now we respect the `resolve_references` filter in `report.tplx` [#577](https://github.com/jupyter/nbconvert/pull/577) - bug fixed: output metadata now is removed by ClearOutputPreprocessor [#569](https://github.com/jupyter/nbconvert/pull/569) - bug fixed: display id respected in execute preproessor [#563](https://github.com/jupyter/nbconvert/pull/563) - bug fixed: dynamic defaults for optional jupyter_client import [#559](https://github.com/jupyter/nbconvert/pull/559) - bug fixed: don't self-close non-void HTML tags [#548](https://github.com/jupyter/nbconvert/pull/548) - buf fixed: upgrade jupyter_client dependency to 4.2 [#539](https://github.com/jupyter/nbconvert/pull/539) - bug fixed: LaTeX output through md→LaTeX conversion shouldn't be touched [#535](https://github.com/jupyter/nbconvert/pull/535) - bug fixed: now we escape `<` inside math formulas when converting to html [#514](https://github.com/jupyter/nbconvert/pull/514) ### Credits This release has been larger than previous releases. In it 33 authors contributed a total of 546 commits. Many thanks to the following individuals who contributed to this release (in alphabetical order): - Adam Chainz - Andreas Mueller - Bartosz T - Benjamin Ragan-Kelley - Carol Willing - Damián Avila - Elliot Marsden - Gao, Xiang - Jaeho Shin - Jan Schulz - Jeremy Kun - Jessica B. Hamrick - John B Nelson - juhasch - Livia Barazzetti - M Pacer - Matej Urbas - Matthias Bussonnier - Matthias Geier - Maximilian Albert - Michael Scott Cuthbert - Nicholas Bollweg - Paul Gowder - Paulo Villegas - Peter Parente - Philipp A - Scott Sanderson - Srinivas Reddy Thatiparthy - Sylvain Corlay - Thomas Kluyver - Till Hoffmann - Xiang Gao - YuviPanda ## 5.1.1 [5.1.1 on GitHub](https://github.com/jupyter/nbconvert/milestones/5.1.1) - fix version numbering because of incomplete previous version number ## 5.1 [5.1 on GitHub](https://github.com/jupyter/nbconvert/milestones/5.1) - improved CSS (specifically tables, in line with notebook) [#498](https://github.com/jupyter/nbconvert/pull/498) - improve in-memory templates handling [#491](https://github.com/jupyter/nbconvert/pull/491) - test improvements [#516](https://github.com/jupyter/nbconvert/pull/516) [#509](https://github.com/jupyter/nbconvert/pull/509) [#505](https://github.com/jupyter/nbconvert/pull/505) - new configuration option: IOPub timeout [#513](https://github.com/jupyter/nbconvert/pull/513) - doc improvements [#489](https://github.com/jupyter/nbconvert/pull/489) [#500](https://github.com/jupyter/nbconvert/pull/500) [#493](https://github.com/jupyter/nbconvert/pull/493) [#506](https://github.com/jupyter/nbconvert/pull/506) - newly customizable: output prompt [#500](https://github.com/jupyter/nbconvert/pull/500) - more python2/3 compatible unicode handling [#502](https://github.com/jupyter/nbconvert/pull/502) ## 5.0 [5.0 on GitHub](https://github.com/jupyter/nbconvert/milestones/5.0) - Use `xelatex` by default for latex export, improving unicode and font support. - Use entrypoints internally to access Exporters, allowing for packages to declare custom exporters more easily. - New ASCIIDoc Exporter. - New preprocessor for sanitised html output. - New general `convert_pandoc` filter to reduce the need to hard-code lists of filters in templates. - Use pytest, nose dependency to be removed. - Refactored Exporter code to avoid ambiguity and cyclic dependencies. - Update to traitlets 4.2 API. - Fixes for Unicode errors when showing execution errors on Python 2. - Default math font matches default Palatino body text font. - General documentation improvements. For example, testing, installation, custom exporters. - Improved link handling for LaTeX output - Refactored the automatic id generation. - New kernel_manager_class configuration option for allowing systems to be set up to resolve kernels in different ways. - Kernel errors now will be logged for debugging purposes when executing notebooks. ## 4.3 [4.3 on GitHub](https://github.com/jupyter/nbconvert/milestones/4.3) - added live widget rendering for html output, nbviewer by extension ## 4.2 [4.2 on GitHub](https://github.com/jupyter/nbconvert/milestones/4.2) - `Custom Exporters` can be provided by external packages, and registered with nbconvert via setuptools entrypoints. - allow nbconvert reading from stdin with `--stdin` option (write into `notebook` basename) - Various ANSI-escape fixes and improvements - Various LaTeX/PDF export fixes - Various fixes and improvements for executing notebooks with `--execute`. ## 4.1 [4.1 on GitHub](https://github.com/jupyter/nbconvert/milestones/4.1) - setuptools fixes for entrypoints on Windows - various fixes for exporters, including slides, latex, and PDF - fixes for exceptions met during execution - include markdown outputs in markdown/html exports ## 4.0 [4.0 on GitHub](https://github.com/jupyter/nbconvert/milestones/4.0) jupyter-nbconvert-5db0bfc/CONTRIBUTING.md000066400000000000000000000045261516532232300202230ustar00rootroot00000000000000# Contributing We follow the [Jupyter Contribution Workflow](https://jupyter.readthedocs.io/en/latest/contributing/content-contributor.html) and the [IPython Contributing Guide](https://github.com/ipython/ipython/blob/master/CONTRIBUTING.md). ## Testing In order to test all the features of nbconvert you need to have `pandoc` and `TexLive` installed. In your environment `pip install -e '.[all]'` will be needed to be able to run all of the tests and to test all of the features. If you only want to run some of the tests run `pip install -e '.[test]'`. ## Documentation NbConvert includes a substantial amount of both user and API documentation. We use sphinx to build the API documentation. Much of the user documentation is written in Jupyter Notebooks and converted on the fly with nbsphinx. To build nbconvert's documentation you need to have `pandoc` and `TexLive` installed. If you want to build the docs you will need to install the docs dependencies in addition to the standard dependencies. You can get all of the dependencies by running `pip install -e '.[all]'` and if you want only those needed to run the docs you can access them with `pip install -e '.[docs]'`. Full build instructions can be found at [docs/README.md](docs/README.md). ## Code Styling `nbconvert` has adopted automatic code formatting so you shouldn't need to worry too much about your code style. As long as your code is valid, the pre-commit hook should take care of how it should look. `pre-commit` and its associated hooks will automatically be installed when you run `pip install -e ".[test]"` To install `pre-commit` manually, run the following: ```bash pip install pre-commit pre-commit install ``` You can invoke the pre-commit hook by hand at any time with: ```bash pre-commit run ``` which should run any autoformatting on your code and tell you about any errors it couldn't fix automatically. You may also install [black integration](https://github.com/psf/black#editor-integration) into your text editor to format code automatically. If you have already committed files before setting up the pre-commit hook with `pre-commit install`, you can fix everything up using `pre-commit run --all-files`. You need to make the fixing commit yourself after that. Some of the hooks only run on CI by default, but you can invoke them by running with the `--hook-stage manual` argument. jupyter-nbconvert-5db0bfc/LICENSE000066400000000000000000000030641516532232300167730ustar00rootroot00000000000000BSD 3-Clause License - Copyright (c) 2001-2015, IPython Development Team - Copyright (c) 2015-, Jupyter Development Team All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. jupyter-nbconvert-5db0bfc/README.md000066400000000000000000000073731516532232300172540ustar00rootroot00000000000000# nbconvert ### Jupyter Notebook Conversion [![Build Status](https://github.com/jupyter/nbconvert/actions/workflows/tests.yml/badge.svg?query=branch%3Amain++)](https://github.com/jupyter/nbconvert/actions/workflows/tests.yml/badge.svg?query=branch%3Amain++) [![Documentation Status](https://readthedocs.org/projects/nbconvert/badge/?version=latest)](https://nbconvert.readthedocs.io/en/latest/?badge=latest) The **nbconvert** tool, `jupyter nbconvert`, converts notebooks to various other formats via [Jinja] templates. The nbconvert tool allows you to convert an `.ipynb` notebook file into various static formats including: - HTML - LaTeX - PDF - Reveal JS - Markdown (md) - ReStructured Text (rst) - executable script ## Usage From the command line, use nbconvert to convert a Jupyter notebook (_input_) to a a different format (_output_). The basic command structure is: ``` $ jupyter nbconvert --to ``` where `` is the desired output format and `` is the filename of the Jupyter notebook. ### Example: Convert a notebook to HTML Convert Jupyter notebook file, `mynotebook.ipynb`, to HTML using: ``` $ jupyter nbconvert --to html mynotebook.ipynb ``` This command creates an HTML output file named `mynotebook.html`. ## Dev Install Check if pandoc is installed (`pandoc --version`); if needed, install: ``` sudo apt-get install pandoc ``` Or ``` brew install pandoc ``` Install nbconvert for development using: ``` git clone https://github.com/jupyter/nbconvert.git cd nbconvert pip install -e . ``` Running the tests after a dev install above: ``` pip install nbconvert[test] py.test --pyargs nbconvert ``` ## Documentation - [Documentation for Jupyter nbconvert](https://nbconvert.readthedocs.io/en/latest/) - [nbconvert examples on GitHub](https://github.com/jupyter/nbconvert-examples) - [Documentation for Project Jupyter](https://jupyter.readthedocs.io/en/latest/index.html) ## Technical Support - [Issues and Bug Reports](https://github.com/jupyter/nbconvert/issues): A place to report bugs or regressions found for nbconvert - [Community Technical Support and Discussion - Discourse](https://discourse.jupyter.org/): A place for installation, configuration, and troubleshooting assistannce by the Jupyter community. As a non-profit project and maintainers who are primarily volunteers, we encourage you to ask questions and share your knowledge on Discourse. ## Jupyter Resources - [Jupyter mailing list](https://groups.google.com/forum/#!forum/jupyter) - [Project Jupyter website](https://jupyter.org) ## About the Jupyter Development Team The Jupyter Development Team is the set of all contributors to the Jupyter project. This includes all of the Jupyter subprojects. The core team that coordinates development on GitHub can be found here: https://github.com/jupyter/. ## Our Copyright Policy Jupyter uses a shared copyright model. Each contributor maintains copyright over their contributions to Jupyter. But, it is important to note that these contributions are typically only changes to the repositories. Thus, the Jupyter source code, in its entirety is not the copyright of any single person or institution. Instead, it is the collective copyright of the entire Jupyter Development Team. If individual contributors want to maintain a record of what changes/contributions they have specific copyright on, they should indicate their copyright in the commit message of the change, when they commit the change to one of the Jupyter repositories. With this in mind, the following banner should be used in any source code file to indicate the copyright and license terms: ``` # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. ``` [jinja]: http://jinja.pocoo.org/ jupyter-nbconvert-5db0bfc/RELEASE.md000066400000000000000000000031201516532232300173610ustar00rootroot00000000000000# Making an NBConvert Release ## Using `jupyter_releaser` The recommended way to make a release is to use [`jupyter_releaser`](https://github.com/jupyter-server/jupyter_releaser) from this repository. - Run the ["Step 1: Prep Release"](https://github.com/jupyter/nbconvert/actions/workflows/prep-release.yml) workflow with the appropriate inputs. - You can usually use the following values for the workflow: - branch : 'main' when releasing from the main branch - "Post Version Specifier" empty unless you do a beta or rc release - keep `since_last_stable` unchecked - "Use PRs with activity since this date or git reference" - Review the changelog in the [draft GitHub release](https://github.com/jupyter/nbconvert/releases) created in Step 1. - You will need the URL to the created draft release in the form `https://github.com/jupyter/nbconvert/releases/tag/-` for next step. - Run the ["Step 2: Publish Release"](https://github.com/jupyter/nbconvert/actions/workflows/publish-release.yml) workflow to finalize the release. ## Manual Release To create a manual release, perform the following steps: ### Set up ```bash pip install pipx git pull origin $(git branch --show-current) git clean -dffx ``` ### Update the version and apply the tag ```bash echo "Enter new version" read new_version pipx run hatch version ${new_version} git tag -a ${new_version} -m "Release ${new_version}" ``` ### Build the artifacts ```bash rm -rf dist pipx run build . ``` ### Publish the artifacts to pypi ```bash pipx run twine check dist/* pipx run twine upload dist/* ``` jupyter-nbconvert-5db0bfc/SECURITY.md000066400000000000000000000004711516532232300175560ustar00rootroot00000000000000# Security Policy ## Reporting a Vulnerability All IPython and Jupyter security are handled via security@jupyter.org. You can find more information on the Jupyter website. https://jupyter.org/security ## Tidelift You can report security concerns for IPython via the [Tidelift platform](https://tidelift.com). jupyter-nbconvert-5db0bfc/check_requirements.py000066400000000000000000000013321516532232300222140ustar00rootroot00000000000000"""Verify that the "all" reqs are in sync.""" import sys from tomli import load with open("pyproject.toml", "rb") as fid: data = load(fid) all_reqs = data["project"]["optional-dependencies"]["all"] remaining_all = all_reqs.copy() errors = [] for key, reqs in data["project"]["optional-dependencies"].items(): if key == "all": continue for req in reqs: if req not in all_reqs: errors.append(req) elif req in remaining_all: remaining_all.remove(req) if errors: print('Missing deps in "all" reqs:') print(list(errors)) if remaining_all: print('Reqs in "all" but nowhere else:') print(list(remaining_all)) if errors or remaining_all: sys.exit(1) jupyter-nbconvert-5db0bfc/docs/000077500000000000000000000000001516532232300167135ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/Makefile000066400000000000000000000164441516532232300203640ustar00rootroot00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) $(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/) endif # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source # the i18n builder cannot share the environment and doctrees with the others I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " applehelp to make an Apple Help Book" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" @echo " text to make text files" @echo " man to make manual pages" @echo " texinfo to make Texinfo files" @echo " info to make Texinfo files and run them through makeinfo" @echo " gettext to make PO message catalogs" @echo " changes to make an overview of all changed/added/deprecated items" @echo " xml to make Docutils-native XML files" @echo " pseudoxml to make pseudoxml-XML files for display purposes" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" @echo " coverage to run coverage check of the documentation (if enabled)" clean: rm -rf $(BUILDDIR)/* rm source/config_options.rst html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/nbconvert.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/nbconvert.qhc" applehelp: $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp @echo @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." @echo "N.B. You won't be able to view it unless you put it in" \ "~/Library/Documentation/Help or install it in your application" \ "bundle." devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/nbconvert" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/nbconvert" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." $(MAKE) -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." latexpdfja: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through platex and dvipdfmx..." $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." texinfo: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." @echo "Run \`make' in that directory to run these through makeinfo" \ "(use \`make info' here to do that automatically)." info: $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo @echo "Running Texinfo files through makeinfo..." make -C $(BUILDDIR)/texinfo info @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." gettext: $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale @echo @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." coverage: $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage @echo "Testing of coverage in the sources finished, look at the " \ "results in $(BUILDDIR)/coverage/python.txt." xml: $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml @echo @echo "Build finished. The XML files are in $(BUILDDIR)/xml." pseudoxml: $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml @echo @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." jupyter-nbconvert-5db0bfc/docs/README.md000066400000000000000000000027421516532232300201770ustar00rootroot00000000000000# Documenting nbconvert [Documentation for `nbconvert`](https://nbconvert.readthedocs.io/en/latest/) is hosted on ReadTheDocs. ## Build Documentation locally 1. Change directory to documentation root: ``` $ cd docs ``` 1. Create conda env (and install relevant dependencies): ``` $ conda env create -f environment.yml ``` 1. Activate the newly built conda environment `nbconvert_docs` ``` $ source activate nbconvert_docs ``` 1. Create an editable install for nbconvert with doc dependencies using ``` $ pip install -e '..[docs]' ``` or if you want, `cd ..` and `pip install . -e`. But then you will need to `cd docs` before continuing to the next step. 1. Build documentation using Makefile for Linux and OS X: ``` $ make html ``` or on Windows: ``` $ make.bat html ``` 1. Display the documentation locally by navigating to `build/html/index.html` in your browser: Or alternatively you may run a local server to display the docs. In Python 3: ``` $ python -m http.server 8000 ``` In your browser, go to `http://localhost:8000`. ## Developing Documentation ### Helpful files and directories - `conf.py` - Sphinx build configuration file - `source` directory - source for documentation - `source/api` directory - source files for generated API documentation - `autogen_config.py` - Generates configuration of ipynb source files to rst - `index.rst` - Main landing page of the Sphinx documentation jupyter-nbconvert-5db0bfc/docs/api_examples/000077500000000000000000000000001516532232300213625ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/000077500000000000000000000000001516532232300242115ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/make_html.py000066400000000000000000000013501516532232300265230ustar00rootroot00000000000000""" this script builds html files with either classic or classic_clone templates Note: nbconvert 6.0 changed ``template_path`` to ``template_paths`` """ import nbformat from traitlets.config import Config from nbconvert import HTMLExporter nbfile = "quiz_notebook.ipynb" the_ipynb = nbformat.read(nbfile, as_version=4) c = Config() c.TemplateExporter.template_paths = [".", "./project_templates"] for template in ["classic", "classic_clone"]: c.HTMLExporter.template_name = template html_exporter = HTMLExporter(config=c) (body, resources) = html_exporter.from_notebook_node(the_ipynb) with open(f"{template}.html", "w") as outfile: outfile.write(body) print(f"\n{'*' * 20}\n{template} succeeds\n{'*' * 20}\n") jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/media/000077500000000000000000000000001516532232300252705ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/media/image1.png000066400000000000000000001077351516532232300271560ustar00rootroot00000000000000‰PNG  IHDR› B6а ¯iCCPICC Profilexœ•–TSiÇ¿÷^z¡%D:¡7A:¤× ÒÁFH „B ¨Ø•ÁQTDÀ†E ƒˆX° ìdP×Á‚ •}ÀvvÏîžýçÜ|¿wsß}÷}ùî9Ê}ŽH” +�&̇úy2£cb™x)€�-Ðåp3E!!AÕÌúW}¸‡F£ºm>™ëßÿ¯Rä%dr€BPŽçerÓP>�ZW$ÎA è­ÈMr)Êt1Z ÊÇ&™?Íí“?Íw¦bÂC½P€@ápÄ|ÈïQ?3›ËGóPè([ y!ÊÞ(»r“8<”sQž›––>É'P6Žÿ§<ü¿äŒ—åäpø2ž~—)¼™¢TΪÿs;þ·ÒR%3ÏÐE�’$öEWºg5)é�2Æ/ žao*~Š“$þ3ÌÍôŠ�aÇ;p†%)3ÌÏÞ+Èb‡Ï°8=T–_˜º0H–?�-ã„LŸ°Nø²g8') ý0A°F;É 5´ª¬„•“gx¥‹V‰ü¤,¦Ú5 L¶�k1—imieÀdNÿÅïîOõÄ ÌúxrX_C�ú³¾dô¼¶Ú í„�õ«¢×. \‰8{Ú‡™üÂ�t  ´€0æh}öÀ¸£€`bÀ2ÀI ˆÁ °ly l»A8ƒpœM \WÀ Ð î‚G@ ÁK0 >€q‚ð¢Aª�6d™AÖ r…|  (Š�â >$„$Ðh3TCeÐ!¨ú: ]€®A=Ш�ÞB_`¦ÀtX6„çÁ,Ø„Ãá¥0΀sà\x\ WÂÇàFø|¾ Ká—ð2Â@ts„…x!ÁH,’ˆˆ‘uH>R‚T"õH Ò‰ÜF¤È+ä3‡¡a˜sŒ3Æ�áb20ë0…˜2L ¦s sÓ�Å|ÇR±X3¬–��Æò±+°yØlö ö2ö.vû‡Ã1pF8œ?.—Œ[�+ÄíÃ5àÚq=¸Ü�WÅ›á]ðÁx> Ÿ‡ß‹?†?�ïÅâ?Èm‚5Á—K6JG m„^Âaœ¨@4 :ƒ‰<â*bñ±…x‹8H')’ŒH.¤pR2i#©”TOºLzLzG&“uÉŽäEdy¹”|‚|•ÜOþLQ¢˜R¼(K(Ê6J5¥�ò€òŽJ¥RÝ©±Ô,ê6j-õ"õ)õ“MÎBŽ-Ç“[/W.×(×+÷Zž(o ï!¿L>G¾Dþ”ü-ùW DC/ŽÂ:…r…³ } cŠ4E+Å`Å4ÅBÅ£Š×‡•ðJ†J>J<¥\¥ÃJ•hM�æEãÒ6ÓŽÐ.Óé8º�MO¦Ð�Ó»è£ÊJʶʑÊ+•Ë•Ï)KÃ�Áf¤2Š'÷_æhÎñ˜“0gëœú9½s>ª¨«¸«$¨ä«4¨ÜUù¢ÊTõQMQݡڤúD £fª¶Hm…Ú~µËj¯ÔéêÎê\õ|õ“ê5` S�P�Õ‡5njŒijiúiŠ4÷j^Ô|¥ÅÐr×JÖÚ¥Õ¦5¢MÓvÕhïÒ>¯ý‚©Ìô`¦2K™—˜£::þ:�C:]:ãºFºº›ttŸè‘ôXz‰z»ô:ôFõµõè¯Ñ¯Óh@4`$ì1è4øhhde¸Å°ÉpØHňm”cTgôؘjìfœa\i|ÇgÂ2I1ÙgÒm ›Ú™&™–›Þ2ƒÍìÍfûÌzæbç:ÎέœÛgN1÷0Ï6¯3ï·`XYl²h²x=O^ì¼ó:ç}·´³Lµê<<ßh~Âü#ó\t]8.‡\¤®L×8׃®R77Ž[¥Û3w=wž{•û�‡‰G²Ç1�מ–žbÏ3ž½œ¼Özµ{#Þ~ÞùÞ]>J>>e>O}u}ù¾u¾£~v~«ýÚý±þ�þ;üûØšl.»–=à°6àR %0,°,ðY�i�8¨e¼ `ÁÎ�,.l Áìà�ÁOBŒB2B~]„[²¨|ÑóP«Ð5¡�a´°åaGÃ>„{†…?Š0Ž�DtDÊG.‰¬�üåU%�ž½6úFŒZŒ ¦9[;¶ØgñîŃKì–ä-¹·ÔhéÊ¥×–©-K]vn¹ürÎòSqظ¨¸£q_9ÁœJÎX<;¾"~”ëÅÝÃ}Ésçíâ�$¸$' %º$'ó]ø;ù#InI%I¯^‚2Á›dÿäÉS‚SªS&R£RÒiqig…JÂá¥t­ô•é="3QžHšá”±;cT(®Ê„2—f6gÑÑaç¦ÄXòƒ¤?Û5»<ûӊȧV*®®¼¹ÊtÕÖUC9¾9?¯Æ¬æ®îX£³fãšþµk­ƒÖůëX¯·>wýà¿ 5IS6þ¶ÉrSñ¦÷›£6·äjænÈøÁ<¹WÔFjËm›8Ÿs~¬]ÔþêÿÂ@ÇòŽG£/Þ¹´èR×åÀËW¯ø^¹ØéÑyþªËÕÖkN×Î^g]oºa£ñ¦ÝÍ3¿Ùýv¦Ë¾«ñ–íænÇî–žù=m½n½n{ß¾r‡}çÆÝ…w{îEܻ߷¤OzŸwøAêƒ7³Ž?Úðû8ÿ‰Â“’§O+7ù½Aj/=×ïÝóYسGÜ�—dþñu0÷9õyÉ�öPí°õpëˆïH÷‹Å/_Š^Ž¿Êû›âß*^¿>ý§ûŸ7G£G߈ßL¼-|§ú®ú½íûޱ�±§Ò>ŒÌÿ¤ú©æ3ësç—¨/Cã+¾â¿–~3ùÖò=ðû㉴‰ GÌ™ÔàÄDÞV@�€Ö InzFž4=×OøO<=GO �\ªÝˆh µŠ ¡×ò(‡ k¸;€mldöe&ÚXOç"7¡£IÉÄÄ;t6Ä›ð­obb¼ibâ[ZìCÚ?LÏæ“R@çÿƒ•¬�˜ ž7Û6€Ñß³`ßõ帛„éIDATxœì�wxÅúÇ?³»§ä¤'„л‚ `AT@ÅÞ;vÔk¹–ëµ×ëÕŸ]ïõ^{ï½^{Á.(JUzo ¤�¾»3¿?6ç�@€d>ÏsžÀžÝÙÙræ;ó¾ï¼#”R �F£Ñhšc[W@£Ñh4;>Zl4�FÓäh±Ñh4M“£ÅF£Ñh4MŽ�F£Ñ49Zl4�FÓäXÛºš–�”²ÎíB„[¹6kIEþ7F¤”Ʀûo©{Qs_¥TƒëPW9©²¤”(¥0 £^uÒhš¡çÙh45ÅBJÙ$BX—¨lŽÐlèøº¯©®E£iZl4MŽRŠ3fPYY‰Ïç#�H$H&“´nÝšîÝ»§÷M5ˆ5_ËšÛ„uŽFê»ÿºûÍ�;—¬¬,Š‹‹k•U— ¬[~ÍíJ)æÌ™CÇŽÉÈÈØ¨€L�:Û¶0`J)LÓdÅŠašæFïcÍ:üôÓOäååѳgÏZ׉Døé§Ÿ(--e—]v¡oß¾,S£ÙZèñµ¦ÉH5€®ërï½÷rÕUWqá…2räH.½ôR®ºê*žyæ™´Ôì�§zâBˆ´¹¨æ~5·×w×uÓÿv€û￟O?ý€{ï½—òòr„<üðÃÌ›7/]ÿºÊ¯y^)%ãÇ�göìÙés×u/*++3f S§NÅ0 LÓäñÇgàÀ�¬X±¢Ö¾5�­y.ÇqPJñí·ßr衇’H$Ò×9aÂÈÀé§ŸNÿþý9묳ˆÇã(¥Ö+[£Ùj(�f+�H$”ëºjÒ¤Iª}ûöjÑ¢Eʶm•L&U,SJ)UUU¥ÇIÿ{éÒ¥éã]×U‰DB)¥TII‰ª¨¨¨U~UU•š7ož²m[)¥Òe+¥TiiiºÜòòrU^^ž>nÁ‚ª¬¬LÍ�;WõèÑCMœ8QUVVª~ýú©W^y%]žëºjÉ’%Êu]¥”RRÊt+V¬P¶m«aÆ©_~ùE)¥T2™¬µOêüW\q…ÊËËS‘HD}öÙgj¿ýöSB¨ùóç§Ï庮’RÖ*#‹©x<žþÿòåËU0TwÜq‡RJ©Å‹«üü|Õ±cGõÑG©ßÿ]]qÅ P7Þxc­zh4[ PªžNãúî×\©¯C»1ðù|!ðûýø|>ü~?–å½~g�u~¿ŸY³fñꫯòâ‹/òâ‹/RPP@0äž{î¡sçÎŒ7Žœœ/^ÌŸþɵ×^ËgœÁ'Ÿ|Â-·ÜBFFáp˜‡~˜N�:qòÉ'Ó­[7¾ûî;Z·nÍ�È;ï¼Ãòå˹öÚk9묳¸çž{Øk¯½X¸p!‹/æ� OŸ>,^¼˜{ï½—±cÇ2}út.½ôÒ´Óýî»ïfÈ�!Ìž=›ñãÇã8�:ubÅŠiÚa‡Æ•W^ÉÈ‘#q]Ó4©¬¬äÑGå¸ãŽ#  0`&LH¿Gë>“p8Ìí·ß΋/¾H"‘`Ô¨QÜ~ûí´oßž1cÆðÀpÕUWñòË/SVVÆSO=ÅèÑ£¸ë®»Øc�=ÈÍÍب™N£iR¶­Ö5/ÖíI*åõ2åö­ëß+«9²µêè8Ž’Rªß~ûMuîÜY-[¶,}î.]º¨ƒ>XÍ�;W-Y²DvØajîܹJ)¥F�­.»ì2¥”RݺuSãÆ�S¥¥¥êÑGU PJ)5dÈuà 7(¥”z衇Ôý÷߯ªªªT~~¾ºùæ›Õ’%KÔ�!CTß¾}ÕÂ… Õã�?®úöí«”RêàƒV÷Üs�*++S»ì²‹úå—_TUU•:t¨zóÍ7•mÛj÷ÝwW�?þ¸RJ©—_~Y 0@Åb15vìXõ—¿üE­Y³F½üòËÊ0 5{öl%¥T¯¾úªZ¸paúÚ•Rj„ P/¼ðB­ûþÏþSjÑ¢EJ)¥¢Ñ¨ª¨¨P«W¯V®ëªo¿ýVê†nPŸþ¹êÞ½{ºŒ{ï½WjÉ’%êÌ3ÏTBµ|ùrå8Žúúë¯Õ¿þõ/õÚk¯©¯¿þz»x5;.zdS�ªá3¨¨¨¥ÈÍËK÷2k~Ÿú÷¬?ÿ¤´´”=÷Ú+½]U�všk¸iªî3fÌ`õêÕì³Ï>[e„SÓçQóÿ™™™\rÉ%tëÖ €Gy„×_�Å‹³hÑ¢tï¿°°�ñãÇSXXȨQ£¸÷Þ{±m›C9„—^z‰•+WrÌ1ÇpÀ°páB:vìȹçžK›6mØe—]èС�:ubï½÷æÎ;ï  áóùÈÉÉÁï÷“——GVV–eѾ}{fϞͬY³X²d ·ß~;‰D‚ ðý÷ß³jÕ*~øaòóó9þøã¹çž{‡Ã!8öØc×»óçÏGAQQB‰¦i‡Ï7på•WòÒK/!¥ä†nà /ä€àÍ7ߤ  €9sæ�L&Bжm[„Ì›7/ý Sþ¨7ÞxƒG}”x}øý÷ß1Ms‹£ß4šÍ¡y¶ˆ[™Ô�oþüù<øàƒ<þØc<ùä“<òÈ#Ì™3‡7ßx#í,N9jçÍŸÏ‹/¾Haaa-Gtj^CUUåååÛöÂ6€RŠÎ�;óÕ—_òÕW_aÆçÁ4ë6tYYY˜¦‰”’©S§2|øp,XÀÈ‘#4hPÚ!žj(•Rض�aTTTpà 7ð /���Í•W^É%—\‚ÏçK_WM‡¾”’x<¾^�R t͈5Ã0҂о}{ èÖ­�=ö¹¹¹„Ãaâñ8RÊ´©lc×ë÷ûÓå¦þZ–…išµÄw÷Ýwç¸ãŽãøã�§gÏž¬X±‚U«V‘��M(ÖšpS÷Äï÷³û”b„ ˜¦É<ÀÊ•+iÛ¶-YYYͶ¤i´ø·/%ßL˜ÀÝwÝEß¾}9ÿ‚ 8ÿ‚ ØmÀ®½æ^~åòóó¯áˆÇã<ûôÓ Ûgzöê• Õ«W3eÊ^}åN;õT¾þúëô9š 5Gç�ÏË/½ÄòeËjEY5%J)’Éd­{�ÇqÃ0øá‡ˆÅbÜ}÷Ý >œ_ý5Ý‹O&“é{-¥Äq‰Gy$Žãp×]wqÉ%—¤ËH‰”aض�>@2™¨µ=‹±zõêô¨cñâÅtïÞ�üü|:wîÌøñãéÞ½;¯½ö½{÷&33“gŸ}Ã0øâ‹/øñÇÓ>›o¿ý–’’’ô5ì´ÓN(¥X±bE­Qpªž©g3nÜ8þóŸÿðßÿþ—ƒ>˜·ß~›)S¦0nÜ8FŒA×®]¹æškPJ±dÉÚµkDZÇKûöí9ýôӹ뮻øàƒ8ꨣX¾|ùVïPìÔ|Fš-§E‹Mê¾xñb|ðA;ì0FŽ™vÞ:”»íÆN=zPPP�Þÿ“�>"™L2räÈZ�Ä3g2a–.[Æœ9sÒ½åmum)‡öº¤Â€[·nÍ AƒxôÑG·šYÅçóѦM›Z£€Ö­[“‘‘ÀرcéÔ©|0gŸ}6£G�æÇdΜ9tîÜŸÏx£„‚‚ŠŠŠ8ðÀ9ãŒ38ù䓹çž{¸öÚkÉÍÍ¥   „�ŸŸONNNº©y5………é`…¡C‡rùå—#¥dôèÑÜtÓM!xà�¸üòË9î¸ã¸ä’K8æè£ …BÜwß}¼÷Þ{sÌ1<ûì³ ><}MãÇ�ç§Ÿ~ªuí}úô¡mÛ¶|óÍ7µîwNNN­96Žã`ÛvZ\�?þxŽ:ê(®¹æ†J»ví7nB¾úê+z÷îM»ví(((àƒ>`ðàÁüíocìØ±dddpÍ5×�••ÕØ�r‡&õ»ÖæÆF¤I=BÍœ”Ãô±ÇS‡Ž«‰„J&“ʶítøé‹/¾¨^}õÕÔ*‰¨¿\x¡zÿý÷•R* [³¼ùóç«a{ï­ÞxýõZÛ·Ö5Õä°nS¡µË—/W‡Ž›3nêºJ)× ¿M¤Î�ÇÓŽz¥”Z¶l™ŠF£é:¯{œR^ØïgŸ}¦V¬XQçyRÏsÝïÇ©uV®\™.³¤¤$>]VV¦¾þz‚JV‡_§Ž©¬¬T“&Mª"]©ó]{íµªM›6*§¯ÙuÝôñ£¼¼\•””¤ÿ_ZZª233Õ< ”RµÊX´hQú^¬û�f㤟ÿš5*�*µ�û4wZôÈ&ÕkY¹bË–-cÑ¢Eø|>,ËÂ0 „ôîÝ›Aƒy#!˜={6kÊÊÒ³²×�M®”¢ªª*íìÝšÔœø·`Á¦OŸžöm¨u´SÛ´iCaa!ŸöYúš!Äz¾�š> ¥�@€�’••…”’¶mÛ’‘‘‘~&ë§”¢C‡ì¿ÿþ§ïCÍóÔÌVó;Ó4kù2Z·n�>G«V­ðù|H)ÉËËcøð}ø¿»ïáŸwþ_Ú4—��Í AƒÒ#¨ ùERÏફ®Â²,ž|òÉ´90å»Ù©÷*77—V­Záº.RJxà:vìÈ\�öi¥Le;v¤¸¸8}ìÆÊ׬%õþWE£œ6ú@n¾ò X'ó„fóhÑb“úaöÛuW-\ȸÓOç_ÿú“&M¢ªª !  [·né—mÚ´iäçåÕJoR“T�@CH5õùl¬ Ã0X²t)·Ývü13¦Oç–›ofÚÔ©éF¹*®å÷èÝ»7?ÿüsƒêÜT¤ê™ºÖšB¹©cj&ŸÜ\jž«¦@K))¯ óÛg¯2ëëרŒ&°,+}Þú\—‚ììl¾úê+öÝwßôõÕ÷ØÔ}I äGÁ'Ÿ|’’šï^j_m j©ßÆÍ7ÜÀQs¦À Oðô˯`Î6è@îH´h±Iý€8à.¾ôR/^Ìß®¼’QÀAcÆðÖ›o®×È/˜?Ÿìœ‚Á`ºŒÆ¨G}?u‘jTfÏžÍÙgžI÷nÝ8ï¼ó8ö¸ãè½Ë.\õ÷¿‡Yµjo¿ùæzÇwîÜ™¥K—¦{ÙÛº·îµÖç§Ú-}u�7u_>úükŽlWÂ>y+ùüKo¦j`ظRŠîÝ»³ë®»®w¾úÔ­æþ¤cÇŽu†2k‘i8©ˆÂ—Þ|‹Øã1º}1'·Êá£ë®bú¼ùX5FŽš†ÓâÅFA(âºë®ãó/¾àé§ŸæäSOeñâÅ\wíµL�2¥Ö�¶¢²’¬ÌL qLN¶mSQQ±ÉOyy9Ñhtƒ×�ǹô’KèÓ§'žtRº—à�²dɦN�ÊÌ™3),,L Jêºòòó‰D£,¿¥cš øþ½gÞ=Äè�|ñæSHÏ²Ú R£¤Æh´RåhQÙr¤”˜¦É ñÖÕWpna6å®$#à¤ðJî¼èâÉ$èµÍ¦Er¥”$ �†aУGzôèÁqÇÏ�À_/»Œ_'Of×þýÓ£ Û¶ VGNmé¹ Ãà·ß~ãÉ'ŸL‡ßÖõ"§Âr÷ÜcÎ9÷ÜZóR½±ÞŸ?fÎäÖÛnK�Æ ÃÀï÷“™™ÉäÉ“ÉÉÉáÐCjÏ'ÉÊÌDº.¶moñuíhH)†Á�“~'wÕOt\ˆr!ÿ×™øÛ4†ìÖw£slꢱæ»èy3�ˆR8Jqç¥q|ÙR²Š‹Û)PÔŠéß}Î=÷ÝǵW]Õàç­ñh‘b“j¨—,Y¤I“8ôÐCkMB0xÈÚ·kG0Hc>Ÿ�X“Jª¡Øm·Ý¸ûî»ëuLj ÔpôW—óí·ßÒ¾Cºw゙ %à÷ó¿>àÖÛn#77w½Œ±xÓ4ñi'r(ðá›/rpg„…ðÁˆvq>yç†îÖW�,¶sRâq÷ý÷ÓõËܱ kl‡”œ”Ù.ǵ-ä¶»nã“=÷bÔð}´àlMÖ5J9N×ý4'æÎ™Ã²¥Kñù|éè±”vÖ¬Ydee1dèÐôv€ÜÜ\¢‘H�åÕtR×´÷olØmY™™™õúª…¯&©f.‹Ñ¶]»t—ª¾×YYY8ŽCÿÝvcÀn»ë÷ˆËËËÉÌÌ$TmÔxx “ËJOyŸÝw.ÂM88q‡}{²râ;,+)×#ŒíY-_þð#Ón¿™“Ú´¢Üq©)#EÒ097ÓäñË.fùš²fáÛÜÞh²_IÍÔ-5?͉?þü“÷ÞŸ’U«Ò>>Ÿ�ÊÊJ^|þyŽ<ê¨t$ZJ<ºtéByY±X¬–) Ö†Ñúý~lÇAl…ëN�¿ÿþ„ÃátLË"‘Hðå_°bùrúU‡j¯ZµªÖ±Jy‹~µoßÃ0Òk·hH ö{o½Êykð…¸ª:â-bX~ o½ñ*À6 u×l©ÎïÊòrþû׋8' qLÖ$\—6994ÿøÛ[-ãÆŽD£ÛMR óŠ+˜9s&ùùùV—–âóû0`�@`›&L9Ô.X@Ÿ>}xìñÇé¹óÎtêÔ‰ÕkÖðñG1pÐ Î>ûìõz/»ì² ~ð«V­¢sçεÂc§OŸÎwß~Ë3g©ªâÍ7Þ`ñ¢Eô0€áÇ7Éõ !@)N>å.ZÄÃÿþ7C‡eõêÕ,]²„^»ìÂù^Èwß}‡ëºtîÒ…Ö­[ך“3{Ö,öÝo¿F¯ÛöŒR aª"1f~õ§ï–ƒJHL!P€JJè™Í-_½NdÜ82ƒ¾m]eMIY1þyíµìÿçïtìØ†ò¤M]Æ1¨°mF¶-búëÏóø~#8û”S´9­4ú²Ð)™9s&Ÿ}ú)|ð -âÄO¤gÏžŒ;–ÌÌÌmžy63{ölvÛm7/^ÌŸNEE™YYì±ÇôéÓ§ÎLÏ‘H„+¯¸‚ƒ9„±cÇÖò¬^½šåË—ãóù…B$ bÑ(……´o߾ɯÉu]~ûí7***ÈÍÍ¥{÷îäååðÍ7ß�›“îýû×Ð+Vpî9çðÈ£�Ò®]»mþ\š ©FäÍ÷?fñ§sÉÁ�±#6Fõ­q¥ÂŸåã®÷Óû//2vÔˆ­º>�fË�®‹aš<÷ÚëürÎ)üµ}!e®¬Shj"„ÀpnIZüý“/г§~îõ¤ÑÅj§ã?ü°Ãp]—÷?ø ±OÓ¤ÔÕ覶½õæ›Lš4‰[n» c�ùÛŠ ‰Ä†~©í�>ò‹–,á¶[oÕ?š¤2F\~îIœ_ø#=:µÂI8i±Q€å·˜½ „—ïÃý�<‹”.†¡{¹Í�Ô{>cîa·ÖE„§A ¡ ”ÙG·mÅ’ÿ�>ÿÂÝÑØ(Mj3ùé§Ÿh]\Lÿþý�Í75¥'Ö÷S_QkHN²š#)%]»uãˆ#�dÅŠµÂ¦›û'°`Á8ð@FŒ‘Þ¶µFaÍ™”ÓxñŠ5TüöC{záÎF¯®i€ó —ýô+WW`:ics%•%à“o¾eÎÝÿà¸6…”Õ˜OÓ„R$ Á¹Ùž¾ì"–””êpèMÐd¶msÐA‘Ÿ—Ç«¯½¶YB“*kÑ¢E|3aÂ&÷Bà¸.]ºtaذaÚÿP¼>¼&E*0àáÿ>BÞ77sÒˆ$«Ì ¼JR�/äãù¯ùÆŸ}&Žãè,ËÍŒt”ìš2.:p—•.$?+DÒ•›ýþ»@ŽÏâÛ¥+ùá°ø÷ÓÏ"Ó²ôoªš,ôyéÒ¥Ì�3‡óÏ??“¾¹�¿cÛTVUmú �ã8^ޝMh¨ëºžCp ÌJy³ËEu8ìö„`m*–šÛ´Ø†2åËŠÅLýâuîØ5 —¨¾g¶dTÏlnûâu¢§žF†m:!ͶG)…t]„eqÛUWrÐüé´éÐ–Š„�¹�È*m‡í‹™ñΫ<úäÆŸy†‡ÞMÖªüþûïTTT0xðàõ¾«é¼®9ßc]RÛºuïÎù矿ÅuJ5J)Þ|ã ¾üâ üÕs~Z:O€C™™Ürë­Û|.Ô¶@J‰i|üÅvNL%·¸Ɉ³ÑI°“.­ÛåÑnÒd&|÷=cF× 2›)?ÍãÏ?Oðõç9 CÖ$·LhR˜@¹#9½U·\w%»ÌîýúêÈÎ:h2±ùî»ï(**¢ÿ€ÀZá¨éH‡ú%LÔW è³gQ3 `øðáôí×ϳ³Ö«Ô€R˜ÕY`Û‡som Ã!øæ�g9§WÊQõ2‡(ïíç±×žfÌÈá ßªfAÊOóû¬Y|zõÜP˜M¥ã6ª³Z*‰ðsf´’{ÿz1ÿ}ÿC²ýþ×YÛ�*6)1°m›I'2`Àòóó�µ‘\B*+*øìóÏÓ+Ž1‚ŒŒŒõN:ªí·ßxâñÇ7ùÃB�´mÈ™g�µQsPq›6·i³Å׬Ù1HõD�:ß’ïéÕ?'!ë X¸I—Þ� |ô ¿MŸÅ€]vÒ½ÛmLªýˆÙw]rãd0�h£Ï6…D—� òüó×ÜyËÍüãöjßÝ:4ê�H�XV­ZÅüùó9ñä“kE9†Áüùó¹û®»8ô°Ã8p Ï?ÿc—Îí)k$óÙº˜@¹msdÇ6üó±ñö~#8bÔ(Ýá¨A£ˆMª±léRfΜÉÇÌÊ•+Y¶t)'N¤_¿~’É$×_={î±cÆŒ`ï=÷äæ[náâ‹/& Õ9ôÌÌ̤ÇN;5FUÓ4·µ¹Õ§%‘ w^²ªœÕ¿¼ÃБE¸q»^£š¦nÔa¿>…¼óå›”V\L«Ü즫´f£Èj¡yÿ‹/Yúðý\Ó±˜rgãþ·-EQçdYÜyñ…ìöÅ:·m£§šF½kÖ¬á�?þ [÷îüûßÿ¦uQ³gÍJgžÍmÔR*++Y°`Á¶®F‹D)oð‡ï¾Éàì‚YA\·áï�«�ìC³–óö›o{ÛôD¿­Nj©î%%¥úè#Î>ûl|>ß{;òÌìÔ5ß{Ï=H×å–ê•6wÔëmnx÷Ú š°ùíÓW¸­o&*¡6î¼! @Ù0ªgˆ~þ Ñ“NÔaÐÛ…×fÜvå¾b>­ÛQi7®ŸfCxáÐ{·bê;/óï‡÷ââ .Ðþš @`ÝYè)¡PJ±ÛÀ�ìÀ¼ôÒKôìÙ“¯¾ü’ÓÇ�c졇nsE,î�×Ï!¼1”‚€ß$3´é8û”ÐüøÃ¼øâ‹œtÒI[vrMƒI…;ñõ·t‹O¡ ¸#v´îŒ›B°mÛçS<é¾ûq"î»Rj±ÙZ¸Õ“*ÿóøãä¼ñûÔ^usk`ŽËií ¹õö›øaïaìÙ×oNk’� aš&W\qS§N%‰pÞøñ´iÓf›õüRÁÂ%œzÜpúì”EÍÏÓ¦óÍ-×qCÛ*ÖYusk¡”ŸŸ3(ç� ÇÓçãOÉ®#â¶%±MÆuýj˜ÚšƒÚ¯)O°{Ï÷]Ó™% ¬Íô"º®¢¸(Ä=�-fUi¸û»|ñå—ô0€Ï>û Ƕ7뼚Í#õîý6c6æÂoØelNÂݢѭ!¼0è¾�ó1?þš©Σ_ÏnÍâ=ß‘IYS‰÷]tãœ0¦?�D#Ï©©/szäç1lúDþqó-Üùw¶èìÛäí¯+þ¶Ä0®òQTF�-úTD¶ëDz6|]©ÞÍĉ edзo_bÑh­Ô1š¦'îüú‹ŒnË�j„ɘ®” ²oQÿ{ûµÔÙ¶¸\͆I‰ù·ÞÊ�ÉßÓ«°€È6š^8´ÃØv­©|ìA^}÷]LÓl±A#ÛäYlíÔûõAà9…ã#„Ú`JJhV•”0}útöÝwßí2·ÚöN*ÜyYi9%“ÞaÏ^­pãΖ¤ÊKcsÙ· ¾{�5U1 ÃÜ.£$·R£…·þ÷?J¾�#Ú·¦Ì®{yç­�" ÎÉñÚß.cö’¥˜fË|tWz+“ –øúË/Ùm·ÝÈÉÉ!™Lêÿ[™ÔšGï¿ûýËðgeOJ\©pj|êó4”¢Ö1®TÄm_fˆ�%¼õÖ[€ƒn Réh­\Å¿‚ 3q,AËÂW��¹™Ö!D½ÊXÂ0(ÊÍ唪UÜ}ÅeÞñ4¿‰åMMËŽÅÛʤF5“&M"''‡�Þ¤UÓ4ñù|Íj´·£â™o±„ÍüoßàŸ{·‚ ?™þuúÂR¢"6rcm‚ËX!í â ð[ŒÛ#Ÿ[¾‹èñÇ’á·Z´ƒ¸)BI$¹rÜiì=mÑâ+ÊË79ªÞBˆ9™™ jø…خ˪ÒÒzuF°hï³0_y•zöâæ›nBI‰hAþ-6[‰T#“H$øè£�0M“ "•±m–.]Ší8üç?ÿaذaµ‚(4�Kª7üå×_2é«y<œG2±´†Vx‹-ƒAŽ܆�O Õúëþ(†%XRfóñ׋q§Z˜ªÙSà ˜|óãL&Ÿy {ÙMgƒnDR¿©Ò•+0礓˜¡À`ÃfìšÇB0}æüuÕ\úæfq7íãq�\%ù{•KΨcð 6ÞI!ÀB)JW®$™L¶¸ÌêZl¶©Êç÷3îôÓY½fMÚ”S^^@»ví2dÅÅÅÛªš-‚TPÊîýûrù£Ÿµ Ò>|Çu°L‹§ž~†¾ >cp¿Ž¸ÑäzþW)¬L?Ÿ|½�‰ÝþÊèýöÄqjDU/tÍy}vîRëÜš-'õ›êÜ©O½ðâf•q׃QzõÅø ò fN!Ž�ÀWЊÇ6óœë–×RÐb³•1„ c§NtìÔ©Ööììl:uîÌ Aƒ¶QÍZ©xëâbÆlDØçMŸ„3÷ÃM,°'Êáà{qؘ�\SM}H-A‚RkWܶãà³,á0–ÑÐXA��’òd’,CÔÿàTÝ„h‘ÙZÞ7R#)%ŸöŸþ9sçÎ%‹!€±cÇÒ·oßm[É@*ç޺ض�Ïç£2­gÏSP^Y…ëºLKbF‹êÅnMÄf4Þ °|>ĬgeZ>¬-M9Ò‚Ðb³ H™R„têÜ™±‡ÊI'ŸŒã8D"Zµjµ�kØ2BÔ9Á.åÓiˆÉ+µ`_*¤Z£ÑÔF‹Í6DAïÞ½éÝ»÷¶®ŠF£Ñ4)Zl¶1©%jššµÉE£Ñìhh±ÙÆèè$�FÓÐ-�F£Ñhš-6�F£ir´Øh4�¦ÉÑb£Ñh4š&§A;Z–Òº–±ÞžÊ×4 ›ûÌôóÞ~hŒçä•ÑHÚAØXmƒÄfG ÇMM¾kŠÔ©ðå–˜–b{Dz,„ žÔ™zÞ;ÚïdGdsžñze˜ÆzÉY5¦Þ-¡”’X,Ö”uÙê¤V÷ ‡«µ\!±X”H$Ò¢—�Ý^I¥«IÄãõŽšÏ{Céj4Í‹Ô3Ž×ó¯‹RŠªª0J§«Icü~“¿ŠTc9yòdFŒ±Ã-kjY‚dÒåì£ ½ [8,v‡ÜÜ\Î;ûd.¹Ð‡ãêqööJ2™äÌ¿uÛÞðN¶C~^'œsW^èéW¾yMs@‰d’×Ûboì×@JE0dÙâeôhßK@Kÿ‰§4a×]wåÛo¿Mwâ×¥Þ]0×u ‡Ã�.6µí¦[¿—`Z×Q@a£•éõtãØvÇiáoâöŠ·”b½G6ñX '™Ð�‹í!Rkâä4øX¥áp£¾ëÙ4ªßéôÉܛ҄h4ºÑýê-6Žã ”Âqœ-®Üº¤–DÞâaÅfà6�xQi¡Ùž©~tBlÚ¦ŸúÑ:îú¤5ÍÕ€g\ !PRjû¨ñN7îô)M(++Ûè~››Ô©]»vœ{î¹5„aËH µ>ÿü æÎ�Ã>‡OV^.®#Ùz#…?`P²²Ô÷�R¢ÉDœ~ûŒ¡ëÎ�ˆEõÊŒÛJI&3'þB"VFØ€�Þóî3l4ÝwîL,æ6¼ñÒlu”’3Lfüú‰•3Áœz-ž†é8dde3∣ ±]˜ÑRïô´~dÁÌ)~øáoÐäÕRšÐ¡C‡ôÿëb“b“ªH—.]xä‘G¶¨Ruqæ™g1wîÎÿçÃtÝ¥€X¶ÖoU)È Á¤ŸËøó¡]¥LÃ0ˆG#:þ:Ž=ioÖ„ÁÐñÛ®…Ùpßõw]}­� Œè ƒX¤ŠƒÆ_ÍÉ'ïËê0èx�æ�ë@«lxàÖ‡ˆþßÅ­òë½R§›L’�WÈù�>F¾¹}ølRïô�—ÝÀ‚™S¸ãÎ;éÕ³g“œk³Å&Ec›ÐRÑ );_yÉJJWd“ˆ:ˆ­”œR)IÛ®c£T€X¸ª^ò5”–Û”­Nbš:­¹ã:6¨ÑpeÃ;·B ¥KÙÊ8Ê4p·ƒÉ6®c£‹„())¡{·n�-»©©õþU!ðù|�R©>Ÿ/=r2- ËçñÄVËga6Å<Ó»ÓB‹ÍvˆUãݬ†iV?o¥Åf;Á{Æ›ûÛ˜–Ó4Ø^fvÖ|§-ËJ·¿[kj†6.k4�¦ÉÑb£Ñh4š&G‹�F£Ñhš-6�F£ir´Øh4�¦ÉÑb£Ñh4š&G‹�F£Ñhš-6�F£ir´Øh4�¦ÉÑb£Ñh4š&G‹�F£Ñhš-6�F£ir´Øh4�¦ÉÑb£Ñh4š&G‹�F£Ñhš-6�F£ir´Øh4�¦ÉÑb£Ñh4š&G‹�F£Ñhš½XºF³„a`˜&˜&†ibˆÚßB¥¿BÔ]ˆF£´Øh4u"$cQbá5$+ °£ñõÄÆ‘ %2ˆV¬Á±“h½Ñh6Œ�f„ØIEçž}øÇ'# þÀu\ÖÕ…´,*éÈþ]:�+=ÂÑh6€M‹A)(¼?*½ÝÓ� ˜¦I¤B2úÄSuÚ)( ë)MºP0Mpã�ˆ¸˜†J¡RçIÿM�K¤N¨…IÓ¢Ðb£Ù¡Pé–]�JýU ¦ea™ÓÓÃô¾vܵ)Á•Þ!å…”²º(O4 O’<ÍH †ašXÕ~Ãð>–¹öƒé‚ë€ã€ë(\×I× Dµ i!Òì˜h±Ñl×(¥PJ¢¤Â0–χey£ (”ðøÊò$ek¨ZSJUÙj"‘(ñh7ZŽ ¯AEV£bˆD%*†de'PÊE¹¤‹RÒ;±a` a_ü™ˆ`r¡\È,@d`†ò†2ÉÊÊ$;¯€ì‚"róóÉÎócY $åÉŒëzuul)ÂahñÑl÷h±ÑlW()QÊÃ0°|&–ßÄ @"«Kc”••S^VFÅÒy„—̤jñŸ$*×�%äSN¡SBªÈIB~ƒì�Ÿœ Ev2²Á“ Ï è3ð[†!0…À0H›ÀP )®©IWOJâ¶$f»ÄmEÕj¨\êPMI*¢*@9ÙÌ2[±FäV2r ÉîØ“ÌŽ½ÉkÛ•Ü‚| òó)h$;N\G"¥ôH„¡g-h¶/´Øhš5)? Êkdƒ!‹@b Ç dñJ–ÿñËçL'R²Œ¼Š?É)ÿƒ,¡W¾Ÿ®Ù.� Zw¶ðû}ø}Ÿ ¾Üjû •÷©>UêßÞ¨iífGyF4¨6¡™0¿€l!¼™k¢Ú$& mWKÙël•¬ i¯&™L²*ì°`ÙG,øÓbIY’F&ÓòzQ‘·3¡¢ö´ëÑ—v½Pغˆ¬ ƒŒjQMÄïÞT›àôÈGÓÜÑb£i–(%‘®Äðã÷¦'0LŸÃü?§ž÷ÈJ”Ò''ʈP ·Ë$/7 ‚y )ªÿz#©ÊU(ÇE)g­F¬�H7Û5ÚoQãS£’i!Zû�ôŸµ.#Tµ�§Ú$fñù�LAv!t7CyÂK²¦âOJÊeñ¢$³þÈfÚ‹!"Á"Ì�ö#«Ûntï݇Î=»ò.$�L&1L!ôˆGÓ<Ñb£i6(¥PRbšÁ ++WÄ™7y6‹~ú�ò?ÐÕ™Ç@k½ÚfÒgpY90òÀ,òF$ŽÄv]d•ƒHG˜QkLúÿ�0uügým5·x£4¥À”³v0 Ó0)ÈË¡ U= 8Àu@:TV,eú²ÇùãÓ(3?êÈ7Vg vÙ›N{L·�zк8€ƒdÂÅu¥çGÒ£M3B‹�f›“ŸÏGF®Ie~Ÿ<ƒi_¼‹1ç+ºF§qLƒ¡»úÈÍÍ‚Pp%*)IÚ �’évÝŒug`6SRbh¤EIá¸^hÜÚ’Evv6{öËcÏ"1Ê*¦òÓâ_ùáÁûù8«?²Ç¾ìºÿáìÔ§99&Ѱ±-:šfƒÍ6Eº.~¿�@¦ÉÊ•q>}÷¬šðÊãÌúÈ%¿¨­RfƒãºÈª$©é*æØŽ¦tgí¥)\©�1/ Û0,ò S c+Ö¬šËo åÃ{ç—ü�´Ù÷d†ŒMQQ€xlÛöÒîh4Û-6šm‚”Crò},[æ»g_¤òÛçÙ7ð'—÷ΦS»0 Á–$"nZX`¶@·„ ZX€7G'5M§ ?‡‘EyŒ”6 –Nâ£�¾âÝ÷z“?üTö>üÚ´Î$\éxSzt›f¡ÅF³Õ‘®K(ÓGÒ…wž{�UÞÏØœ¹½w…]À–$.!ÀÒíc�¤ÄÇq\”í™Ýº´+`|çVœZºœ×']Ë»_>MÛC/〣ŽÄ‹:-Q­5ÛýÖi¶*ÒuÉÉóñǬùX†Àq]Ü0ìÚ³-�¶©ä’ÿœÊU�pÄÉG©°-�raú’(%a‡Žù~º· ¢l‰Û€òžÏ+I�Êâ‰}\ôòy|ô1æèèªh¹>!ÀNDyw�ßj!Ѥ½Éûªd80+3ÉaBhÁiZl4MŠ’’P¦Å´ßçPòÊõ®yqûî”ÅéË�ÉZóžTÕ£,À‘kçʤ&fú2,>ý½œ·§–óÜYÝq¢N�ךªKÍr|–`~I’ó_YÄ—sª�ü–`Ü�î=ª>S4XÀ,CàÚ6†/À½G¶áŒç®äÏ]úÓ½GÇ­¶Oj>UŠm™ãÍ0-ª*£Ž=�?íÍÒúÚc¬ É^VІ²î}¨Ï9 £þ#PUãZšSô¡M“"¸~zñA®Ú5ŒÌÇŽ$©ïo@*ðù æ-�ñõÜ0 WñÁ´ NÝ»€5Q‡,¿WX$)Éɲp“Ò3cYQ‡ )„LܸôÌn– ¼Ê!ä3𠜄ô¢Þ,�…×�—D¼PaW*Ž$3Ó+W¾ �—¸R ™È¤DJ¯žv²Zð AIØá “Y‡I-U—ÔPÅ4ÊVD.G>>—iËbÜ{TvíâÍÉe<4¡Ã2—iËâŒî�Ã�G´#šT\ÿÖb~XA 8i÷þ2²˜ŠˆÃ__\œUql gìQȹ£ŠùtR¯L.#’� î¢}®�×~+ãýiü±*ÎéC ¹â€b„�~]³?­A¡8 g×�i‹Ï/xí—5ÜýùJºHºŠ Ÿ~ƒ·ªàÝi%Y¹ùìüéÈMø%¥”2,̘ÁGÏ=B #Ä¡g_JAq1޽íG‹�¦éP ÄU‹æÒ%ÛŸ�LÊ F›Õ…!ÒV¼3¥‚ÖŽÝ:„ø÷7¥L_¥O�,~[ãƒñ=ÈŒ¼»uÈ (Ëâ¥_˘k?f/�qù[K8kXW¿³Œ’*‡WÆ÷`öÒ'>=ŸÁ]2BðÄ«yàè;¬ç>1Ÿå/�Ó�ÕeIyd.ûgáHŽ_¬âÝ󺓗mqÜ£séø£�CúærÉëKøïqÙ¹S&§?1� Ï»Ðy~öêšå5xA� “W(åöOVpï‘í±¥âÎOWrtÿ\f¯ö2$ìÛ#7)™µ(«âô*�0IÚ ¿%¶ ÚM�å§_vËfM§KÇa$«$†hš`é:dçúyë?ÏóÔ­W¦·÷è7ˆ»>øà  ¤Ü&iu„0h¢Ë^¥þÌøù;ž¸é²z—ת5ž4ÎËy·Á{ä�H©xäÚ‹˜òݦɾGŸJQûâf1ºÑb£irœDŒP`­ù¤¾H©ðM~œfîêS–ÆX“¬¨²ùߌJvé�CUBrî^­°s‚cwËç‹YUüýÀblWqé+‹Ø¿g6ïžÛ� %ø`FO�Ø™¶y~ÚÜ)Äç3*Ù£k&;·rñè6à3@Áøa­èÙ)m3Ó;‡/fWQvÈü¼(‚Ë|4³W*†uËâ°¡`üexÏO\IÉ�Î!†öÈÂMz¦CTR2¼{}Úfðí¼ìSļ›û’�iRñýjï(ÀgðÖ” ®}� üüze/‚> GªÍŒ(!#II"–JÉÖ$(¦i©L2ñÓ÷1M Ó²�ÒeÁS™?m:½"•ˆ­Õê7€”ÿC¥V~]/±j*›w�äBR®·ê{¥ÀòûÓþ*Ïw#ªÉk�¯Îö ¤KfNÞ&ë麒œ<ï<ú8S¿ÿ’Ví:©(Ã4›Oß|j¢Ùñ^ï;·¸#‹×$ ŒÞQ¦à­)åeZü²4ÆÄÅQvïâÕÉe\qh;L!¼ô5¶B E†O°²R²S·,~½²'}SÊCJ¸û‹Uz¶  L^ePŸ®:°˜ó‡±Ïý³ˆÙ²Þ�y0æÆ²)jß×nºe¨•’Cü2“?ý)]Ü„ƒJI¾ûßëôÝkP³œ¸"¥Ä0 !axf7U‡ë$™éÊôè!²0Ìj«¤ò–OÆÁu‰¸bà~£¹õÕ/Ò÷\ÿºü,–ÍŸ À±_ÃÐQc‰Ç†�Âu6Äá�˜LV-)åéü�ÃϽœ…3§0ù›O¶‰?lCh±Ñ4B@2©èÔµ#¿‡z±fÕ|rórQŽ»É�|–A¤Òæ•_Ëxá´®ì½[HEéò}þ9“óÂdš¼ù{;° VÀࣙ•\0¬ˆ—'”ðçŠ8w�×Jt»~*³K´Éõñþ´ †ÈcõÒ¿/�ñ÷ÛPsq«#Ö0ѤË;S*8{D1eI¾š]Åø½[ñ£/Â+ã\9¶ø·¾´ˆe6ôÌæ¤g°¦Â¦°moÿ^NYÔSPq'$] ü@u“ßà?ß–0kU‚Ÿ¯èIv†IߦråþÅ7´€Û>YÁ_^[ŒT°W×Lÿ~5ÓWÄØ¥MÆÍ)R Ë`õê*æ=²sw/5P“ùL¦?}üv2�0 î7Š™?G,æç�ßãÄ¿^�ÏôBÌ·¤u¬±¸]}ØØ¹¤”3,’IŬ_gáŸÓ¨\]B«öÉÈÌF)oÉn%%]ûìF~ëb”T˜–`þŒ?˜;åÊKW‘‘•Eûî=é5p(�ŒÉ¸KaÛ¶wj›>—a@FvNúÿ�{÷c÷ý÷$Rå}§$ãPJÌ4¹ÿâ+±|>޹èoÜvúáa ]·Y˜Ð@‹�¦I8¶C«|?…£ÎçÉ÷ÏåŠ# HTºX›hS¤TXA“&—Q”e1°cÉ5IGQXàgP‡ÏO,£U–7æ´gç³:ìÒµ0À¸½ ™±4Î�,cÞê«#.½‹ƒŒè™Mq¶�Óž[À² ›™«âÒ'‡½vÍåµ %S•rmsýL^åø‡ç°¤"ɘÞ9 í–Ißv|úgßõ¿AiØá¤Ý è^`tï}t.=[XXfÓ6×>Á¿•óè÷«™xEÏê�iÏŒvÖ…ü¼0Êè‡ç�°½ÚÙ£k&9!‹×ÏìÆ9¯,ä¼—°K› çïÓŠæG¶hà*d<òA�Ž»ˆœ�AU¥ÓdK2†I¤"Îÿ{³úÿÇ_z#ÏÞ~Óú†eóf1ý§ïÙcÌ„+lÌuœî©0áú,•`Z&ÂÜ´©Vá�P\§î\J…?h±tÞlþ{Í¥üòŇ-ï²½À!ãNbÍŠ(ÏÜ~5=÷Ž�¬µOß=†sÉýOÑ®kWq'¹¶–kÍiv"A,"‰Gl„azë/Õè Ô¼' fZüòùw|ùæsܸ܇têY„+]„då`ùD³-6š&Å0M•£Ž<‚Ç¿Ÿ]¿}›QÃw&Qßh‚MÓ¸ —{f3¦W�j‡¸áȤäåq]q¤Â2Ù§ˆÙ%qÊc.{vÍD)èß1ƒ.ëɳªÈ ˜ìÛ#‹ e°{—ß\²3ßÌ sA~ƒ:‡pªé“Ëþ;gã: —�î@Ð'˜¶,†«`H×LWò Þ;·;_ή"áHF÷ÊŰÀqOŸÒ™o愆vÎ$jKÜr›qC 9a`~zž�i€LJöê‘ÍO—÷dQ™°sQa8Q‡Ý»eòÓ彘¹"†”Ч]~SPvÈ š¸›á¯q$rü¼ÿõ\&u8‘³ÆD¤Êm2¡q]—¬\?ý�esgй׮ ØgO~0„é?}ƒëØLüô=†Œ:`=1‘®Äò[C&É8ØÉºÃ¤¥t eùøâÕWùñã·±|~T]ö.¼€×¶Ùm¿QŒ:ùtQg½†Ü0([UÂuÇ�aå¢yøƒ!²rrY³j¹WO!ÈÌÎ%¿u²ó ðùáóWžæý'BAfN;ï6„²’•,˜ñ;Ó~œÀÿ�?‘;ßž€iùPR¥£ÿÖ�ÄB`Â0ÖûNº_À"�áÝ“D,‰?/ßw3ÁP«–,ä…ÿ{˜ÊÒU(¥øäÅÇ}Ê9dçÔiÜšh±Ñ49 À•ãCAÈo¥MT¹&J)uó"Þœ¤·Ÿ #ûxf™”8võ|"W±OÏl¯N¶$·Z2|‚PÀª=ÏF€mK2|‚^mƒ€@º×–C`'%>úwÊôÊs¼ú·Ê¶œÇ3Orý¼ùÅlþ›8˜so½Ë[›êe±›C”„Ÿ?};™ ÿ°‘dd¹ ~ o?r?~ô&§^õ2²²�®[íëSäZ̘8�go¿š±gü…¡cF ¯&­”Â燙¿üÀ„·_ªWÝ|?‡œq:ñHíìJ), ^¹ï6V.š‡» Æy·=HNa.ßðOÜx)®ë „àÊÿ¼B§ž½¨*ƒ_¿þÄ ~p]®}ê†8œ5+ÃÜó—S˜?ý7ÊV-gɼÙtïÛ—dÜmð]OÝ“)ßOæ¥{nâг.f·}Gâ:ÞÈDZ“üûoçÖ:æ…ÿ»ž^»ïÍnûŽh’‚ ¡ùL/Õì°a�´9¡ Æ=ðGäÑfcùÁç÷áÊ OÞv¥J MMœêíŽT¸Ê;!Ó&&!ÀqvÌõ&`ªµÙ‘ÓÛ«'s"R+J«Zå» œ„Wnêü©À-;.±ã’TìêýÝåIå�|ÖŨžÏéØ Ç®]Vê;;)±“^yPw9›”ê5¬–OñØûòŒu4çÞó¡ ÇiºÀÏWcQQæÇjšeù~äI8¶É®Ãö§}÷ž”.[Âä ÌôF)B(æL™Éã7\ÊÄÏÞgÉÜ?±|lpÄ¢ddfá †2ñ‚u~‚™ø2²rêHêªðù,ÊK«øé£·B`ù}œyý=ôݳ?…mºpÜ%2hÿƒ¨*_Ãìß& ù@@÷~q¥ó§ÿÆÊE%ø\õèkÜÿÉo<ôùÚvîŽ�ÜLß”�Ìþ}�]1?ò.KçÍÂÄÂ.çÝö/þùæþõåtîûx2]ûôÇòù¸ñ¹é3dâÑDƒæ·5zd£Ù*† ‘tú,.zøe^û÷½üþú\:Ô`§®­!)I$½´.ëþ ëúY®·­Ž•JZ¹Áíuý»®rÙðüÇ Y¤6´‘´=O}Ú(…'Ò¿~ƒ?æ®äþ‰‚äð9gü%)I$Ü&�HéJIF–É�}Ϊ% (l×Ëò1câLü~‹î}²tîŸüøÑÛìwÔQ ¤t¹ü Ý™?c à™b ËÚ`‡Ä ­–sÑÕqîeé{P©ÛgùýÄÂr½‰™†•«KX³jEõH¢5]ûô§¢ÔAº.–Ï¢÷�½ùù“w˜ýûϘæ™ÄÂ6'\v¦åã͇ïä±.áù;¯£Ãν¹ååOÉ.ÈCVwì?^ Â…ûî²ùsÒ÷Ä´¼æ[º’Ž;õðÒÚ˜`ǽ|„ŽmÓa§^„r2¨*‹nóõ:´Øh¶†aà8 !$§^q÷ÜŸ«ž¼™a3¾çäA9·Éƒ$ض×;Üòß–…çÇøü–V¬(ç¹I•ü܇!WÞÀà½ú®t=ßWwsEuž¸ï?| z”³ŠëމR Ã0I&ã†�”’ß&|ÊòùËiݱ‰¸Í¡g_Šc'øù“÷˜ôù‡bãõUÊ9Á¦GkJy£®õÚ|åùÁâÑ®c`ù|žÐI…0¼ûf¤q’v:wYé²Å”—¬Àu¼õ‚b‘*ìD%J® ¥n0Õ‰`�%¦ Þy�ß¿ù¬Ö=I&¼ßŒ%—Üÿ ñH˜œ‚"QÙ ÜjM…ÍVETO>¨*³4´?½û¿É×ï½ÍÅþ›½ÌiÛ'H»ö… Lœ„›ŽÒiHjý–B*Ù(xâáÏ4Aº,YRÂëÓ|G?:�½�Ó=Œ�*Ël Ólò¹RJAKç-ã· Ÿà:®ã�FÖÛß0 ÊKV2åû/sÊÉ$b0æÔ3ÈÊ…ÒeK™ôù‡S®Dxí¡óÉK�yHt)„�ã$Ù÷ˆ9éÊ«‰VÚkG7B ]È+jCFV6±páò5T®.!¿u+âËçcyõè uÇ.^W'É?Ï>š9¿Oàðs/c�1cÉÌ)$#3 ×u…t73Ì\9ó\ò añì?ùý›Ï5ÄF#ý\… ½Ä0 ¥aI?›-6šm€À0M"aÏl6öÄ#X=ú~þì.þìúüú#;I†÷ÈAde&2ac»Ê[½³ OJ`¤ò²C~(ŽðåŒ ¾\l13wOºz2Çî?†Â<‘*—pR58—×–ÔÒòô¢¼dBò‹Ú°ÿ §¥''*¥°|S¿ÿ†™“¾!˜ðöKŒ:é@ '+X°ñ³ysy–ÏŸÍ™SëUÃ%}P×ípIna.Ýû bú�_®¨à�GïeüíwÊ òç¯ðݯ§Gd=í‰aÀÊÅ Y2{&†i’‘™Í¸ëþ�¢öž°ñÚç†aÔûžl‹Ä¦›B‹�f›c˜&R)o!/a°ç°Ý2l7JJ¯eÚwŸqï”}óÕrön'éWlQ˜—�?;£:4Lâ:Êk”kâSÎ÷æ®CÕî�ÚNm!0„Àò /W›Y¥¤´ŠßW¹|·Ô`©ÙžH·#éxè^ŒÚkZ·òcѰCUÂó‹líž­”.Á��™“~ãçOÞKo:úpÖ¬rˆU‡.+¥ˆ„M:÷êCvA+*JWQ±º„ o¿Àé×\G¬ªÖÍØè9 Ã$Z%9윋8òü‹êUO×�xx}ŠašD+]†Ž9„3n¸‹çï¼;gê÷_ÔÚ¯ß^#¸ðŽa�Œ»äfsÖ�÷ðÐåg‹„ùâÕgøâÕgjsØ9—²ç!‡�®œQU¶:íëI&bõè<5÷·z}´Øhš )'f¸ÊAù™~FuÎᇰ|ÅÕ,žó'/þô•s§Ó1ö'�ìyìÔ:HïÖ>:ð|à €izv&W"‰]=J™ßjF€m­ŸlJHRZXÓßâ3 Ÿðºü†® v™H2oE’+“Ì)M²ÈêÌ’Œ]ÉëÚ�އŽaïî;Ѧ8Ë„X•"Ve£ð&nËØ ÃPD«*qÌi¹­ŠéÒ{W¤kbùj'œ,(nÍq_ÇÜ©“AFf±ˆªµzh½F­줋�¨g¤×:É3k}eì„É—]A¯�{òÓÇo³|á<âÑ­Úv`§ƒyì鄲ƒÄ£.¦e�ºìwôqtéÝŸÏ_}Š•‹PUV‚åPض{Ž9’Á£ò²¬“‘V)Å~G�LÉR/j¯ãN½qì�‡Go�#y-6šfGª×çJEe™ƒÐ:?“¶{dÏý‹ÃâyKX²`ÌŸÆk³¾#9um}zúWÐ%#NQn�¢œE9AÙþê,Š”A:×*£¯òÖ QÕ¹µjþ­�Âk¼på Q=—§¦³I��^È–T$«b¬*MPR™ ´"ÆüX³’­Yfç,îF`ç½ÈÝ—�ºtaD×ödÁM€ãà Œòzä©Ô&ÛÃ0‰EöΞ ¼D”ár…tk7 B$’c/¾Ÿ—6; Ñ*¹^c\R3û! ÂýöÞ›ÁîM"vÂ3ý¹Žg¢LÔX‡G HD:÷êÉwÞ�kC¤ÊÅò™dd�“„XÄ›¼®ˆ(¥8ç–[H%hކS‹ÊmØÖÒÏ4-6šfMÊ dÛ.I[¡"CtíÖ�ž½:à¸ÃH¸ã‰Å<'í¼ÙÓøaÉBìò—ÎÃ?åO|±RZeZ]Úf$)AëLA†ßÄïóá÷™ø}&–ey£"ÓXûI¥î…µö.)Ak'Õ8®wœ+«?.¸ÇvHÚnõÇ&–tXQ¬ˆ –Çý¬Œ¬ŽJ’¡"’IäwÃ×½˜6�ºÒ©GwìDF‚–W•d1‡ªhu®0D³˜uq§ºqiD]û†ËíôdM!<¿„! ’qÅ�'žEÏ�{УÿîÄ£j«†ð†A"ê Ëtê˜ò§V:™Z×b$.ñ¨——Ì0MÛ¥¢Ô­3õLM*Ö$ÓC]Ã0ëŒX3 “xDqÐiçÓoï‘ìÔw1Õ,ý3u¡ÅF³} „׸V›Wq‡xLyÛ„ ÁN;uf—¾�±|�C8¬G¢T…#T–¬`^ÉR¦®ZHdå"*KÖ œ82N†¬"Ë)#éÄçFð©>eãÃÁž]ß4 C`¡ñxœDÒÆ0 Š[å1éj\Ã�møHŠŽ jå±ò‰™ÙÄD¬Ù­ÈìÔ‰ÌâÎdµ§{Q1ÙY™d…2ÉÊ‚`Ð[.ÙN€“t‘qET±vädˆí ñ‡æÆ’ßÕÀëP¬#"B E§�w¦Ç®;{#‹äÖ_`MT?{ªççlt±VXUõü˜MÔkÝ!Ž­è²KovÞ­7ñ(¸vÓ­°ÚØh±Ñl—ÔœW �D oÒ AÀ4ÈÈϤMa&¢kk„±+˜Þ á�¢E,%�’ˆ†I&ØÉ$‘d’¤íà8Ž·˜•ëÍÉú™9c&mÛw '?›dÂå÷5+(ÝŸiá÷ûÉôûñB™„B™d„Bdd ü¼@ ¸Þ_U=’®$–D+åZQ©6 µØPoáMVŒÇ¼I‰Ûb%ÏÚõiØù›¢¾B@2æ�ˆJoT»­ïIÐb£ÙaXw‰_©@Ú.Þ\p/Ü˳u{¾aL“ŒÜLÌüL„Yä…QW[ÏR!Õ ÏNŸ“>ŸFö„»°w=˜ýþñ/‚â ðù=뚪©@¹k…ÄŽ8$«R½Ðj»}u¤‚÷GÔîEk€ê’Ùt÷D)…ðb‘v4á@g{Ý®‹ÍŽ�HåZu†A+©p¤‹µÂ¦k.Ãå:.9¹A¾ú|:?ßt$/äƒÉ¯ðïK λãAìx’HD¤jž»úÌ^/´¤ ѬE)ðùM\ŸI}i§&ÿò3<—{Æf°üHG6(C‰iUIÒ‘S��yòÖk±‚¦—Z ަ…£ÅFÓ¢‘®$3ÓǼ+ùòö3¹g„M~nNÒasæhZ$«’œ¸_'\öÏÝs/¡\+�ÕX£i©h±Ñ´X¤”‚&«Ëü}íiÜÑ �Ú’Œ&·heC€uùËA�ÙùçÛxýѧÉ-ð¥WbÔhZ"Zl4-¥>K�p^¼úl®ê8…¾½Ú“Œ$Ö qn(¢z�4'7Ñÿ{WñÑk’×JÏÁÑ´\´ØhZJ)„P˜“g®¿œ3_²ï�.$Ãk'mn)@J¤2¹ûðb–?ù¾ÿògró}¸zަ¢ÅFÓòP.™ÙÏÜùOF­y™£÷ëB²2ÑhB“Bo‰0ÈýcüürïyL›6�ìl=GÓòÐb£iQH×!'ßÏK�>Cï©÷sÁ˜N$ÃMµdŠa€“p(,Ìåî½*øäæq,^¶šPÈBê”'š„M‹A:.¹~ÞõC²?¼ŠǶÃN€¹‰I›[Ša@2–¤{—ÖÜÒ{¯_}‘8~¿žô©i9h±Ñ´\Ç!§ÀÇ7ŸýHùSçrÇaE¸ÊBl¥Ñ…iáƒúuä’Ö¿ðÜÕç"…�iê98š–�Í�t%Ù¹~¦þ:‹i÷�ã®Cr2�¶ÓÐeå·Ë$ªŒÞ« Ç©�yêæ«ð‡,=éSÓ"Ðb£Ù¡‘R Y,\¸‚Oo=�ÿÛOR˜Ÿ…“°·h.Íæ’šôyêþ]¶ôiž»ïA2õ¤OM @‹�f‡EJIÀoPVáõëÏáý—ѵCÉØ¶š†;âpÙAèüÃ?xýéWªC¢õ¤OÍŽ‹Í‰R ËØ ž½îB®l3‘½Û’ '=Ĺ¡@ pmÁm‡µÅ|ã>~ç3òòõ¤OÍŽ‹Íއòs_†É37]Á8Þgÿ¡]<¡1·uå<„ð|IJø¸ëÐV,}äl~úö=éS³Ã²CŠ�À 7­ïÇ4<ÓF£�_T—Ù€óëõÌ©²r-žû¿;ØÅ37²{õˆf[׬6†×vÈÈ qßè ?Þy&̘KV–ÍŽ‡µ­+Ðø($&Ñ(›Œ4R 0¡2*ˆ%–N~CI[R…HÂ1cc­œ%Á€À“´e¸®C^�ŸWyŠ“ï壻‘Œ8laº³&Ã0vܦ¨(—»ö*åÒ›Îáø{_§¸(ŸXÜÅØœÔÓM3d‡)%¡l‹Ÿ?ýš7¾=²‰' ÁFpËÄ¢Iöí“EÒV[$8B@xãc|^ÏÍGw WÍ\ÂMC�ŒÚìÜ­ˆ"³¹éúó8ë¾ ù lG!¶f|¶FÓDì0bcA2ê²Ë»3¹çÎ\pÀúöiG4jot]¥À0BH‘GE•³E Cޏì=¨€ƒ\×ݨx)–eRYQÅ•�e0xÔ$!to¶¡xsi||ýå¯,â|9<�¤k )ªG±@àuHL!}Þ�«ª²ñN�¢• öèÛŽ *¾æ?×^Àyw?†i8¸-8šížFlÇ•dge²ÏY÷pß}‡rO'‰«‚ äÆ�" ²Qü6B@2)‰+!6>:q%äù-îyq)Ý}œ®;S±ÆÆh.^ìíU=ª�?{1+;›ç�ÍÂÈσ„ †¯ž…(ˆÚ¸®j<šÐý~f~ ‡Üããxç�›8æo7;h¯žf{gÇÀ0 ÂU6ýwïÆ{]ÆsoÝÈ…§õdM¹»qçp#ÿŽ… ÚG°á¾¬”Š‚Üÿû|+²�áÜ# ¢L MCQJaù V-+áÞSFpF›¹¼ûkkbÑÅõ ÀòûØ«WŠr,¤³eæT¯^`X‚ŸfW°hY ê�%ÀUÂ[=ôé›y5³5'^|UúÝÐlçìPb`š&á —ƒO?“Ç/ÿŒ=ÿ�¾}Ú‰lÜœ¶5Q |>‹•+Ëyù§¶sÛµ8 …¡Íg›‰©8âŠ;YêšÌ·�z›�”tÉαøî뉌ÿý NÝ »"�µ…jã–áró7.­Ozœl?8õN @ ÜÓ ]§ŽÄ£ Ñ\^^�f3ÙáÄÀu¡ Á�çÞÆ#÷½=⦵qÃýVD*ÿ÷x }Žxœ�ò©Ô=×ÍB�ã(ò[·fÔ‰Gcˆê(Äz>jéB~˜�BÄ›ÿ¡±†¹ŽC›V¹9îhòžÙ´ž£”÷ž$�Jí³Ñl÷ì�bc˜‘°MŸAÝ™¶ç•<óÆ�\pZOÖT4þY Å•�—íç£/ç³4ûxÎ=b”6‘l!B€c»”¯nøÜé:H姪¢œ¦°§:ŽKY©� ¨ú‹M aèQ�f‡`‡}‹=sšÃ¡ãÎàû’½øõ÷åd…ülËåCà÷›¬\UÁKß·áð ®ÅMÈMOÒl!¦imÞDzš4ÔÜØÜz™–ÍÃý&K >ŸÁ¨ñÿäÑ$ÉDÌ›$·�GJ࿯®¤ÏQ7Ñ®S‰¸Ô ŠF£ÙáÙ¡[9Ã0ˆV›Ó²_É3o-!7ÛÂݾ›´ùì«Å,Î:žGŒ"\no<»€F£Ñì ìð-�iD*l=ãt~,Ù“_&/%+Ó�ÜŠö4¥Àï3Y¹ªœ—¾/∠¯ÃI¸ £Ï4M ¡´vW ~‹ýϽ�G?$ñ­šs*}öß×JésÄ-´ï”G2®#Œ4MË¡ˆ�gN‹„mvݽyC.ã™7‘›íck$Ö•R‘—ãç£/²$óF9Šªr}¦ÑhZ-Bl`ídÏCÆ�Í«‡ñë”edeú�M¸ojò檕å¼ôc1‡]pNBió™F£iq´¨VÏuõdÏwv2Ѥ˧Ìg¿ZBŸÃo¦Cç|ñúÏn×h4š…zOêTJá8�·FºmÛ€·4€ë88¶�ë8M \Yž¤÷®Ý™2èž|õ&þ2®e•�¿T°ëBnŽŸ?�Å¢àQœ;ö@ÊJb¦�[ÿ¼%š&FºŽ-�nã½ÛµP ×±qÍ͛ԩi\ÇÆ± ¤Ü\[zõsUÆ6‰nm(k¯×{ ÇÁ¶m\×MoÛR„XÖ†%¥Þb#„Àç«gÝz�*+ �WTL«6>b›H–¼ùÔx'Nÿûùüç¯Óù}Æ×ôÞ©±¸Óhs+àó””TðÁìþœqÇäæCFf†¶ 53¤  2ó Qª‘Õ@) ÓG~±Ÿü`ÒÕhš×Ð*BY¹4ø±+…ašäÉ·¼e$š;® 022³(**Âçó5j›¾)6)6RJ Ã`É’%<üðÆÑ(J˜*÷§Ÿ~à¹;®!§°Çnú(-)%!‹…‹Öp×ô•8ŸDØÁÚB³ª#�lÞ5ƒÏfE©†š¦àƒîÅìä3ˆ*µI'¶£ •Ïä”ù«˜µ·Jý¶:wîÌ‚ Ò‰u©·ÍçóaY¦iâ6b̰ëº(¥0L ±‰%œo¹…ëºÜõĆ ʧs» ñ„Ü쥔ËTE]nù×0`Ë–-k”Ê��æóù8ÿüóyë­·xᾫéÖ±˜X,Ù¤áÈëâJInvˆßû†§Þø‰ NîÊšr›†Î¹LMÞüß7ˈÄ{1ñ­«‰Dã:̹YãJIan&¯|ú •«>³ØòÈ4!Ø6m[ðÁÕד:@ áH—¢¼\îþ=Ê?ý«m+°7ýÜ áµ]E¹¼ÿß+É5·�h4ÇuiU�Ëíÿy…—ßÿ’wß}‡Ýwœv“4©H´ egi�­¸¸¸Q*U“T4ZëÂ\Ú¶.$M`l¡ß¤A(ï:û¸ÑÜpÿ<~™VJßžD£n½Íiž/ØdEI„·?ƒKÏ<’¢ür²BzNM3Çu$­ ²ÈÍÉF­ll3𗛝¸U¹ZlšŽãÒ¦0�ìÌ dÅB¦aP\T@žµ�ˆ�íR\”Gf(@qqq“´ç£Af´Æ´i§F6)“\ÒvH&m’¶�ánÝZJEV(À‰‡Îo<Æ]WæV�®êw½RAf†Á]�/gø�£èÜ.�5aL½t@³Çu%‰¤Ý¨sÈj¢$m›¤©Å¦9Ḯ÷Ü7Ó% ¨~®r;Ç»Þt{›L¢ª}Ö�5²6Ú¹n�Ø4f/]Q«¼Ôÿ×ݾ50MA8š`÷¾]˜4užyû.8©kÊ“˜›e¹.äåX|øõ2"‰^ºÿ Ê+#X:÷ÙvÁÖxçÖž£ÉN¡i ég²�ËØZ4‡öVw½«1MƒÊH„“Áï¶æ×é«ÉÊômÔè­¼i°ª4Æ›Ÿ Æ=ÛNjÓ™F£Ñ¬ƒ›H A¿ÁI‡ÎoT�´m„)¡ Á^Yƈ=FÓ¥}ñ¤Î}¦Ñh4ë¢Å¦†„#ž9­K§á<÷Î2r³­:Z“r³ý|üÍ Â±^Œ¹;åUí§Ñh4š:Ð-ã:˜¦Ae8Ê©‡ïÇo¶â—i¥d…j Ž·ò¦ÁÊÒ0¯êræ1c±m›íÃz«Ñh4[-6uàJEÀopâØÃyê­*lÇ©;.•"#(xôÕì;ô :·Ï'ž°µùL£Ñh6€›:0 Ïœ6¸_:wØ›gÞ^J^õÊžR*ò³ý|ôÍ *#½8ü€Ý)¯Œaê$›�F³At ¹LÓ "å”ÃG2eVk~™^BfÈÄ4 V”Fxë38ó˜±$“IÒªÑh4›@‹ÍF�R’08aì¡<ñF%IÛ!;Ë⿯,gŸ!cèÒ!ŸxBGŸi4Û)Õf|¶,ùêæ�SÕpÔhФΖ†aTE îוŸ§ ãÍO~¢k‡UÑž¶ÿ Ê+£Ú|¦ÑlcLà ôaŠúçÅt\—¼Ì!¿¯ÁÉ8` Anf°A¹Ñ «?±x²ñ³Œ7s´Ølo²g”ÓŽÜŸëî™Ák¯âžkÎ'i'Ñö3�fÛ¡ÔÚßç¢9¥T*U­›nÄ]))ÌÉfʲú™f½37+À‚’„ÍçSç�cÖñ4ø ƒL=:·Çg[”tz{C‹M=p¥"œyìÑ”WEh]˜åetÖsj4šmŠiªb þ~Ý}ŒNÄÈøp¥Úô$(Å®–E�ÂbŽS¯‰ ° “ÄͼïN³I$² fUFYØs'ž¹ëÊ%4 Å¦^B�%Ù¹[;,à Mh¡Ñh¶1B@"iÓ£C1þåT*yž¿¶Í£Üu©ofB¥ Üqq¨ß’ðWŠƒs‚øó½Œõ›:NQ�‹Ìq¹)”É—ŸAÐï#šhY©­´ØÔÃ$6ñêUú4ͶÇ0 ªÂ1Ûnü}&Ï~û#£ÛPn;˜õœd�òõÔTH…ªçŠÅ.P`<°²‚6çœD¿î)¯Œ´8o˺Ú-D¡…F£inpIþrÖ1|Ü®ËÂ1²,S€U�ÏæŒ-LêY¶€BŸÉ—+Ë)ßswÆ�هʪ–XÔò®X£©�·–¼#ŽLýÝÒÏv³bðv�‚„ãÐ6'‹cÏ=�G"6†ënó ƒe‘ï¶.æ¼³�űíÍS·mFÓ´x^HެlË5¼å[·ø$–P-μ-0 ƒŠH”‘z3õØCxá•w8«m«w›6r¦”<Nrø%ÇÓ!?‡ŠH¬Å&ëÕb£Ù.QJ‘ŠrMu`7×ÙjKÈËòñää߯^Šßò‰º 0„bÎ?!¿Ñे“Ô|ŽÝmš&á(g=Šë§Ïá§?ÿ``«\ÂŽ»ÕM8.�ï3ynY­Ž>„QƒúPÖý45Ñb£Ù®PÊ›�mY&>ËD�”Þò¶¶ëb4påÁT–ï}õ¢w�›IØ�k~9!ÃÂ2ÖÝ4tBßæ …ªh‚1s]¢çœwÿ¾îºÇ>œú„C7Z Ë2ùµ´’ß{÷äæcÇP‰U/5ßrÑb£Ùn�Rá³L2³ƒ¬©¨bÙªÕ$m‡P0@nv&¹Y$’‰¤Ýà¶!L:¶ÊZ;JÚºªê2©p\Yk»i,Ó‚M,)ì�Ü<�°mÕ@�R Ó4IÚ6®+ñù,Œ|tcA$‘¤w‡bö;ãX»ï þÖÆG%[ÏUb‚H<ÉsþçŒ?� à b;Zl¶u4šú ¥$3deI9ÿ~þ=¾Ÿ<ƒEËV�%ÈËÉ¢¨0—]wîʸcFѹ]k¢±Dƒ~Ü å�j›ÑNR*2C~�6‡‡_|Ã0PÊ"¥j›»RkÛ+¥hU�ËegEnv&ŽãÖk”#•"0eÖ|ný× $m‡«ÇÏÐþ½‰Åvo¶7Là<á¨}sÛ´Ù¼ûÅ×Ѧ€2Û©÷ü›ÍŲܽ&Ì^ŸI¿Îí(« cšM}ææ�M³Çk¤3˜4eWÝõ󗬨õ}$géÊR~›1—÷¿ú‰þr G¸'•áhƒBÕ›ºÓ¯”ÂgY,/YÃ?üVïã²B\pÊ¡ä5 ‚^t�äîÇ_ç×és(« ïÐ"S!±Xœñ§Î-³ç³KÉr:çdwÝ&á¸@žÏäƒåeÄG ãØC)¯Šj¡©F‹�¦Y#¥"ð1kÞ.¸é_”–U� 0x×�éÑ©%kÊ™4u6ËKÖ°¦¼Š«ï~‚âVy é·3ÑDr«šŽ¼LÂÞ$`„@IYë;ÛvÈÍ Ñ©]kodSý}iy%ñD€¼ì,r²BžJ)Úµ.ÀgšõŽjs¥$/;“gßþœßfÌ¥ïN�™1w1V jô„Ø®Ka(ÈIçžÀc7?ÀÍŽƒ0Œ'Þ¬È0 æWDø´}{®=ã( ½üHM´Øhš9 !·ÿ÷eJË*°LƒâVÜyå™ì;tWlÛÁ²,–®,åŠ>Êw¿Î Orϯóê×n¼ä4:õ1]¹R’ÊÀg™é¬¾þŒ€w¬Z[΀>=xéþ«Ó¦2Ã\~û£|ûËtN9|ÆŸt0«Ë*1 Ó4ÈÌ⺛6¡)¥ðû,V––sÇ_fÜÑRVaÚì…;|4Úº†Ae$Æ^}z0íÄÃyöéWß®€2§þélê‹\—GãŠãÎ=�â¬Ñ–æ\Zl4Í)™™üðëL¾Ÿ<!Ž+ùûyÇ1r¯¬Z]�i\WÒ®u!Þø/â‰$áHœùKVÒ±]ÉdÝKv[¦Y½=åÎß0n=Ö>ÉÍÊä‡ßf2ñ÷?™»h9¶ãкU>ËB)O4 !8ëØÑ´.ÈÅv¼è9Ãø|kŠA?¹Ù¸®Ä2MÞ¨¨&J©êú„X+†Jy&Ç›|¥çŸ4–kîy:}?[ZZ{/:Âé‡îÇõSÿ`”©ì]”Ge# Ž ä›�//§ËÉG3|מ”UVióÙ:h±Ñ4[¤’øM“Ÿ~ÿÇñœ÷ý{uc¿¡»RVÆ2�t ¡ªH”nÛðòW“´„€œ¬�;Ô+#QlÛÅ0Ä&,+ŠPF¿ÏWwc­À²Lî}âuþûò‡$’öF¯ë˜ƒö!/' §:TÛP¢V¹R)×Å©‘{+u RJLÓÄï³°,¥¶ã’L:Õõ òí¤i¼öáî¹æûžÓ�:�P0€R ·z^ONfˆÜ¬™¡`‹ÍÔ…#%ÙÁ§]pOÝp7Û6¦e¦;1õA!ÓdFYßvîÄM'�%Óéh6…M³ÅëÑûéѹ-à5ÎÓf/ ¬2LÀï#a'),Èá�ëÆãJEV(ÈI½“å%Þ(ccNC~�6‡Ê´fÃ;+©èÜ¡˜Vù9u:• C¤�V¨ê{ùеC¬-Ë%©?žiEÉ~˜<Ë29åðBP‰¡´ïöÝ ”—Χfä\e8Ê5çŸÀßÇ�eš;|ö€MaU±ƒ»wdúI‡óÄ#ÏsI»ÊQõ6§™Bà8O*§œ2¹A?U±$f ¾¯õA‹�¦Ù"„ ‘´Ùkà.<ôì;8ŽËìKyê�OøûyljÆ= Ð*?‹W>üš_¦ÏÆ4 \¹á= p÷ã¯1iúLSl0I¥¨6£Ýú×Ó9zô0*Ö5•(h[T�þïÜEË©G Ã3óý9o1à…Z·/n…½Ž9ncx¹ÔL*ª¢”U„).* 7'%%‘hŒ·>ùŽx<�ÏgáóYŒÜs­òªE±ú~¿!RáÒõ;翉pÒ˜áÜ8c.Ÿýø3´Î£¼áÐ.�oZQNß³Of�ž]XÓ³9×-6šf‹a¢±»íÒƒƒöÌ;Ÿý€Ï²xø…÷(«¨âäÃFR�—M"éð»_ð¯çßM›ØêÃÊÕåDcñzíÙ@�A4ž w�ÎtíPÌ‚¥«˜³p=û.ç�p¶+y䥘¿d%BºulCŸ�;O$½ì ¸©% O50M“Õå•üã?/aÛNz¿^Ý:Ò¶U>v��o-2u Ž�äü3�æŽÙóéYUA«Ì l¹áph/ÌùËÒ Vì5”óÙ·:�šú ÅFÓ¬’¶ÍÕãO`Öü¥Ìœ»!Ͻý9/½÷…yÙ„cñê¹#УS;–®*Ŷ7>ÛÞ•’ãÇîËÂ%«°¬º};é}]Iïî�H$mD ÁB`;mŠò9ïÄCøû]O¢”â¿/½Ï›Ÿ|‹+%«Ë*¯Á¿àä±äçdUGÎÕn LÃH§“©6+ªÏŸ—�I^v%kÊ)¯]æåðØm—`WßýdÚO¤Ù4Bâ¶C‡ül?ïD¹ýßÜ’ØÕb¾.©U7W„£¼•[À•gƒ´mÔf.+ÝÑb£iÖ!°m‡Â¼lûÇ¥ÜüÐó|úݯ8®ËÊÕåé}Gí3�ËÎ<š#Ï¿Çukõî×-Óu%çwPµeS•€p$î�HÖ)Ï4 ªÂQŽ5 Ûqyàé·(-«dU�zµ.Ìã¯gÉÁ#†ŽÄê 2¨GÒ“8£ñs`ª¯¿u«|öØ­M˜Äc¯ü��ÚѵCzuïÈóoβUkÈô¦xÙ¡cŒ´ Ó�ÃK¯½Ëií 7˜ÎƧ�FÆ^t�[åQ^c®—fÓh±Ñ4{ à ž°i]˜Ç¿n¼�ï~™Î�¿Ídþ’•(¥hÛº�¡z1r�þBpÿuã© ÇèÓ£ÓFâeaÏ‘ž %Ûfu¶‚ºB�´mN;böèß‹?æ/aá’às»ÖôîÞ‰î�ÛŽÄk•‘ú—RŠ‹O;"-P½»w"\½|°À ±˜�v8?LžÉÿ¾žÈœ…KÔw'V””ñÕOSeH&m-6 Ä4 ª"1Î>v4×ϘÃ/óæ°k~6‘«{º@¾eò²Õäy é×âWÝÜ´Øh¶ ÃkÐFî5€ýöèŸöUX–‰e„£q)3|0¦a‰Å±í /ñܘ�…‚Šp”ΊéÕ½#nµíß0 bñd�¦³JÁðÁý¼QO$kÍð7 A,ž¤g·Ì-äüqG‘L$ê�ËNS7Úg£Ñh4Õ˜† K0xçNTÜpíŠ (ÊÌ ׿³-E‹�F£ÑÔÀ0‘X’1{ô'i;DµŸ¦QÐb£Ñh4ë`‚òp4½”·fËÑb£Ñh4u ƒ}75�FÓäh±Ñh4M“£ÅF£Ñh4MŽ�F£Ñ49Zl4�FÓäh±Ñh4M“£ÅF£Ñh4MŽ�F£Ñ49Zl4�FÓäh±Ñh4M“£ÅF£Ñh4MŽÎ�¦Ù¦(ðüRÞz"ëæ<\w1°M­Ù"SK+ Áº{*¥ê<¾æv¥Ôy,µêV³^õYGfCçÞÔ~;.õ�JU°j]WÛ5š­…Í6CJ‰a~I;½-…ak~R*\WV/ -j•%„AÆ&ʪk%ËšÛSÿ^·‘7 ‘ÞG"U/®+‘R­W§ �cc¬»Ÿi¸®\¯\¥¦i¤…Ú¨#idZÈYÿ>Ö§ÎMc¢ÅF³MPJ‘�"–Hðçü%(¥èÞ©¡Œ‘h<Ýc¯¹Ô±RŠŒ`€üœ,"±8‰¤�)½²lÇaö‚¥(¥èÚ±-Y¡ ª"±ôˆ$i;˜¦±^Êø¤í`™†·R£mã³,LÓÄuÝZK.†�i GâH�'@9Y!2‚ª"1Ç©³ñ®yŽ�‘´ü– €+%ñ„CfFWIO=ª±,“H4�Ï2A@2-H©{å�^|–‰RФí¬sï3e«ëì®7¢Ôh-6š­NJ4Þøø[þûÒ(¥ˆÄø}W�{,£‡ Âv\V®.ãïw=IyUÓ0…!…ù9\|ÚáôëÙ•h,ANVˆ×þ÷ �½ú?œj�0 ƒcÎéG€”ŠÊp„ó®�KN?‚}vïK$'à÷±º¼’³®¹Ÿ\v:»tïÄ_n{üŸ|û ¡@Wº(½ºwäÒqGR\˜GÒ^+8B¤Rœrù�\~Öьأ?•áh­ôõR*²BA>š0‰ûž~“¿Ž;’ƒöB,–àÆŸÇ4 îüÛ™D¢q�›ⶇ_bî¢åüç–‹¸ó‘W™0q*>Ÿå�ðH%ÉËÎâ‰^ƲU«¹øÖÿT Oõ²Ò† [Ƕ\:îHÚ¶.À¶ëI�¦±Ðb£Ùª¸R’›âå¾æê»Ÿâ¯gɨa© GùhÂ$.¸ñ_<ú�K»ß.[ÅôÙ 9ù°‘ íß‹h<�”’ßû’ñ7<Èû�ÞJ›¢|ž|ýcnzð9Î?éPÙo†!˜0q*ÿøÏ‹¬.«àšóOdMy%Sÿ˜OEU$½ê¢Çq™9g!‘h¥ —®dÞ’<ÿöçüåÔ訊"Ìš¿„�:µ#à÷1kÞb¤+ùû¹Ç±¦2LU$Ê+|ÍiWÜÅ‹÷]E~N6Ž”µü>Óf- ¼*‚U×)»//¾ÿs.ã�ÏdÄž»á÷û8bÿ=9íow1jØ@ößk®+™4m6�½ò?î½ú\r³BL›½€œÌãOKEeÓ0�Já÷ùüDbqþœ·˜ÿûÛÙäçfá¸.ñD’ÿ¼ø>»óqž½ë !�^U4š&A‹�f«¡ø,“Uk*¸ëñ×¹üÌ£¹zü ¬ZS†i ²+UÑ?ü:ƒƒ÷ŒaBAöЋƒ÷ByU˜‚¼lúõìÂè3®eþÒ•X–É]�¿Á_N;œ[.>�’5€bÈ®=ÉÊ qí=OqìAû�Ÿ›MF0€eÖnì…X–…ix#�P(È�{ïÆc¯ü�}‡îJ¯n‰Dãdýø|ÞÏÅ4MºulÃØ‘{°ruY¡ ÛOFŸq5ÿ~þ=îüÛY¬.¯ª5z üX¦Áº^©?Óf/dáÒ\áIÜ÷Ô[,YQBûÖ­¹×N?ê@ný÷‹ì=p‚Á·<ôË•²Î -)% oeƪp”ÃØ‹a»÷妟«v {¦®š¾£DÒ¦2!‰±lÕj ò²µÏî|ûËtâÕkÖ×tôË�œ;”à�O¿§M«N9|²B|ðåÏde)¯ sù™GO$xþ�/x糘½p×]p"±X¢ÚE#(Y]ÁŒÙ ùcþbþœ·„é³²dEiÚ4&¥$™º�®ËÊ’2~œü'Ý;µ%3”�+¥M“¢G6š­†R Ÿe²tÕj,Ó$?7Ó,/«ä†ž#žHb­òs¸ê¼ã0ªð=û.¯~8W*JË*ø}æ+J˪ƒ6 ¦ðœô7^t2ÃN¸œ×þ÷ Ç<וµöB`†÷Ç¥mQR*Ö”‡ÉÎÊÀqÜMžËï³(Y]Á·¿L缦G×2bÿ›0‘ N‹”’œìLnºä4®½çi¤”\sþ tj[DYE˜P(HFÀÏG&2yÆœê@“x"Éɇ�äÚóOL‹ÞUw>ŽßïC‹——0oÉ žºãr2ü~¢ñx�mMc¡ÅF³Õxf¿!ª#Í¿eÒ¥}1†!˜>{!O½ñ W�w|Ú�л{GvÙ©3ñ„�ã:Äã ¾øñwÎ:n ÙY!’I{�°bÕç*«¨¢¨ …Â2­uF*ýo«:Ì‚X"A÷NíøëGqÇ_aß!ýüé9<ë’ “ŽÆâC�™@Êz›”A~ž2‹Ù –òË´Ù\|Ë¿™·h9³,cÊŸóÙm—î”WF8tÄP^xçsV•–sòa#©G=¡‚x"ÉÁûáú¿œä™ïLÏŒ–ôK$Ó£›Áýv&+3„”’~=»òê‡øfâTöÐKhš-6𭆂D2ÉN]ÚS^aᲕ´)* 7;“‹O;Œâ¢|æm¾þyJ:�ÿ}=‘Ûÿó2_Ý?…Â_ýÝ·¿ü{wÅupü?3;û‰?pŒ� ØÆ&RÐTm¤¼P)­*¤´EHM«¢< UU)IÔªU ©ÚªUú€ˆJª ¢ˆ‡TmB?””*�F¤° ˜”PØ^{¿gî½}˜Ýeׯ!Ö¦p~Ò¾Œw÷άÖ÷ì=÷Ü;Çééh§¡>ÁÕá Ó¿c ìºìùÓ~èžÇŒxŒK—GèšÛʬþAÞøç{<Ü׋1š°¢å¾F”ÖÄcQ’©L¹Ø@ÃŒ1îŸ×F]"^n×óTU^ÿµÇiŸ5“lΣ©1A$ìòòÞ¿²qý¸n¥�ˆš‘q³˜2¶m‘ÉXö`7}½]lýí+$ÇRÄ¢´†·aûŽ=„]õŽ?�Í1<š"9–âÊð(‰x„Æú—‡FXÖ×Ö/fóö—¸xù*uñ(õ‰/³yÛNÖ<¶‚EÝóˆ†Ã,_ÜÞ?ÿƒ‘Ñ õq,,v½ú:Ú[hk™‰WLA•Ê•mËbË÷Öó÷‡9yæãòˆÅ.¦ÐB!‡�ã`ÛÛvü�w�œbÃ××�Ë{劷Ƕƒ‡<,Ë"�pþâ§¼{ô$×?Á Ï~—ŸmzŠŸ?·�u_YÍk;@6—/§KóFz\¥›m[mð|¿êQ9s›Ñ± #åÏqŒÙ³šPJa[6`ÝL–Qˆ[&#1¥JAdûæïðôO~×ÖmfÕ’…ä=�óŸ|Ê—W¯äí÷Ž‘/¦Æ’©4Jëb§tÒ±H˜‘Ñ4ïŸ8C_ïýlýÁS<³m'�~ó‡¬X²DZ9ôA?«ZÈÖï‹B!XCòÜÓO²áÇ¿fõúgXÞ×Ãé³NŽñâ–�$â1†GÆKg(xŽã�LeXÖׯ'×ð«]{ƒU÷&¸‚7á‹ßØD¾à‘΋PŸßômþL/Ù\¾*-¥”Fiͳ/¼Äö�{PJãû>‹{»x°»Ï÷ylÅ.\º‚¯4ã«–òËßíåõý‡øêãŸÃ`Èæò¤ÒÕs+F´6¼òÇ79pøÃ`¡+” ^Û±Û²Š»pmžÉ¶©Kĸ<”dàã‹ô-èD)…?‹Z±ÌÍì¡Qžçáº.ëÖ­c÷îݼ±ëyz:ÛÉdó~Š»‹Ö†h4L&›ã­ƒGé¼ÀœÖf>»¸›ùsÛ8>0È‚Îv”¯8qæ<]sZij¨ÃW Û¶)x>GO~DóÌzæw´a[6žïsàý|pê!Çaé¢ù¬\²˶ðŠ«ç#a—d*Í¿ŸâôÙÿ0§µ™•K{™;{¹|€ãýƒ´µ4ÑÒÔXnÏó}ø�í-´·ÜÇÀà.]©˜s ± «�¹³›Ë»T2ÆpôÔY2Ù`�PI<¥.Ãâ•üÊר9§ ô^ Pðéëí,/µ,‹�ÁO¸2<ŠïûUíZ–Ū‡Àó|Ž�>ÇÒEÝ„ÝZ[ݤ³9Ž�>Gg{ m-MÅ�äïnäûŠ–æF~ô‹—Ùõê>Þyçmyäó(¥pgJÎA‚�˜ZBŽM"Jó9¹|�x4RžØŽG#ä |_—;b˲HÄ¢x¾_¶¼Wé›c ¤2Ù ›l†‡x,R|V0‡T™öŠÇ"<Ï :~CP4�ˆEÉ< žG4¬¹)Í+icÈ烒ëÉ*º±hÕ>d† Y© %–7*½ÆóùBp�±häZ!BÅs£‘0nÈ™ä€T:Sü£¤³¹ª9ÛŽ—®KÍÝëN6’FÓ¶-”ÖŒŒ¥Ëi˲°-‹tñ‡1†±bg9~'äd*�]q\kM²ø^%–]½™eYøJMl³âÇM*�­jÏ"&•íeó2¹|õõçq&3–ÎL˜ 6ò´À˜ë¾vüµgrù⦛ÕA!“Í—Ó“ã9Å�=“©tÕ"S¥'~ŽBÔÊl”ÒøJ© #_ü{I©›4ÆPJ2éÊ%*“ ¾ÕuŽWQ“¯s¹^›·ÒÞÍüí†çP|�žì\¯ó¾úÆËwªøïëOÒÆ­œ»øÿRê['+ߟ wL°i¬ŸAóÌ2‘œ¤Ñ„â6ò|Ŭ¦†ò-8¦Ã´Çqp]—×÷âßÇ‚¼· é…â¶QZS_gàüq]wZÎaÚƒÍÐОçñÓ?ݧ"„÷„ܸ9Ç©0mÕh¥»(îÛ·�þþ~ÜPè¦îd(„âXÁ¥Ršµk×ÒÖÖvÓ·+¿-ÍOW°Bqï˜ö4šRªj¡›BˆÚ …BS^î.#!„5'q !„¨9 6B!jN‚�Bˆš“`#„¢æ$Ø!„¨9 6B!jîpK’-%�iIEND®B`‚jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/media/image2.png000066400000000000000000005303771516532232300271610ustar00rootroot00000000000000‰PNG  IHDRåXmdäÉ ¯iCCPICC Profilexœ•–TSiÇ¿÷^z¡%D:¡7A:¤× ÒÁFH „B ¨Ø•ÁQTDÀ†E ƒˆX° ìdP×Á‚ •}ÀvvÏîžýçÜ|¿wsß}÷}ùî9Ê}ŽH” +�&̇úy2£cb™x)€�-Ðåp3E!!AÕÌúW}¸‡F£ºm>™ëßÿ¯Rä%dr€BPŽçerÓP>�ZW$ÎA è­ÈMr)Êt1Z ÊÇ&™?Íí“?Íw¦bÂC½P€@ápÄ|ÈïQ?3›ËGóPè([ y!ÊÞ(»r“8<”sQž›––>É'P6Žÿ§<ü¿äŒ—åäpø2ž~—)¼™¢TΪÿs;þ·ÒR%3ÏÐE�’$öEWºg5)é�2Æ/ žao*~Š“$þ3ÌÍôŠ�aÇ;p†%)3ÌÏÞ+Èb‡Ï°8=T–_˜º0H–?�-ã„LŸ°Nø²g8') ý0A°F;É 5´ª¬„•“gx¥‹V‰ü¤,¦Ú5 L¶�k1—imieÀdNÿÅïîOõÄ ÌúxrX_C�ú³¾dô¼¶Ú í„�õ«¢×. \‰8{Ú‡™üÂ�t  ´€0æh}öÀ¸£€`bÀ2ÀI ˆÁ °ly l»A8ƒpœM \WÀ Ð î‚G@ ÁK0 >€q‚ð¢Aª�6d™AÖ r…|  (Š�â >$„$Ðh3TCeÐ!¨ú: ]€®A=Ш�ÞB_`¦ÀtX6„çÁ,Ø„Ãá¥0΀sà\x\ WÂÇàFø|¾ Ká—ð2Â@ts„…x!ÁH,’ˆˆ‘uH>R‚T"õH Ò‰ÜF¤È+ä3‡¡a˜sŒ3Æ�áb20ë0…˜2L ¦s sÓ�Å|ÇR±X3¬–��Æò±+°yØlö ö2ö.vû‡Ã1pF8œ?.—Œ[�+ÄíÃ5àÚq=¸Ü�WÅ›á]ðÁx> Ÿ‡ß‹?†?�ïÅâ?Èm‚5Á—K6JG m„^Âaœ¨@4 :ƒ‰<â*bñ±…x‹8H')’ŒH.¤pR2i#©”TOºLzLzG&“uÉŽäEdy¹”|‚|•ÜOþLQ¢˜R¼(K(Ê6J5¥�ò€òŽJ¥RÝ©±Ô,ê6j-õ"õ)õ“MÎBŽ-Ç“[/W.×(×+÷Zž(o ï!¿L>G¾Dþ”ü-ùW DC/ŽÂ:…r…³ } cŠ4E+Å`Å4ÅBÅ£Š×‡•ðJ†J>J<¥\¥ÃJ•hM�æEãÒ6ÓŽÐ.Óé8º�MO¦Ð�Ó»è£ÊJʶʑÊ+•Ë•Ï)KÃ�Áf¤2Š'÷_æhÎñ˜“0gëœú9½s>ª¨«¸«$¨ä«4¨ÜUù¢ÊTõQMQݡڤúD £fª¶Hm…Ú~µËj¯ÔéêÎê\õ|õ“ê5` S�P�Õ‡5njŒijiúiŠ4÷j^Ô|¥ÅÐr×JÖÚ¥Õ¦5¢MÓvÕhïÒ>¯ý‚©Ìô`¦2K™—˜£::þ:�C:]:ãºFºº›ttŸè‘ôXz‰z»ô:ôFõµõè¯Ñ¯Óh@4`$ì1è4øhhde¸Å°ÉpØHňm”cTgôؘjìfœa\i|ÇgÂ2I1ÙgÒm ›Ú™&™–›Þ2ƒÍìÍfûÌzæbç:ÎέœÛgN1÷0Ï6¯3ï·`XYl²h²x=O^ì¼ó:ç}·´³Lµê<<ßh~Âü#ó\t]8.‡\¤®L×8׃®R77Ž[¥Û3w=wž{•û�‡‰G²Ç1�מ–žbÏ3ž½œ¼Özµ{#Þ~ÞùÞ]>J>>e>O}u}ù¾u¾£~v~«ýÚý±þ�þ;üûØšl.»–=à°6àR %0,°,ðY�i�8¨e¼ `ÁÎ�,.l Áìà�ÁOBŒB2B~]„[²¨|ÑóP«Ð5¡�a´°åaGÃ>„{†…?Š0Ž�DtDÊG.‰¬�üåU%�ž½6úFŒZŒ ¦9[;¶ØgñîŃKì–ä-¹·ÔhéÊ¥×–©-K]vn¹ürÎòSqظ¨¸£q_9ÁœJÎX<;¾"~”ëÅÝÃ}Ésçíâ�$¸$' %º$'ó]ø;ù#InI%I¯^‚2Á›dÿäÉS‚SªS&R£RÒiqig…JÂá¥t­ô•é="3QžHšá”±;cT(®Ê„2—f6gÑÑaç¦ÄXòƒ¤?Û5»<ûӊȧV*®®¼¹ÊtÕÖUC9¾9?¯Æ¬æ®îX£³fãšþµk­ƒÖůëX¯·>wýà¿ 5IS6þ¶ÉrSñ¦÷›£6·äjænÈøÁ<¹WÔFjËm›8Ÿs~¬]ÔþêÿÂ@ÇòŽG£/Þ¹´èR×åÀËW¯ø^¹ØéÑyþªËÕÖkN×Î^g]oºa£ñ¦ÝÍ3¿Ùýv¦Ë¾«ñ–íænÇî–žù=m½n½n{ß¾r‡}çÆÝ…w{îEܻ߷¤OzŸwøAêƒ7³Ž?Úðû8ÿ‰Â“’§O+7ù½Aj/=×ïÝóYسGÜ�—dþñu0÷9õyÉ�öPí°õpëˆïH÷‹Å/_Š^Ž¿Êû›âß*^¿>ý§ûŸ7G£G߈ßL¼-|§ú®ú½íûޱ�±§Ò>ŒÌÿ¤ú©æ3ësç—¨/Cã+¾â¿–~3ùÖò=ðû㉴‰ GÌ™ÔàÄDÞV@�€Ö InzFž4=×OøO<=GO �\ªÝˆh µŠ ¡×ò(‡ k¸;€mldöe&ÚXOç"7¡£IÉÄÄ;t6Ä›ð­obb¼ibâ[ZìCÚ?LÏæ“R@çÿƒ•¬�˜ ž7Û6€Ñß³`ßõ帛IDATxœì�w|ÅúÆ¿³åô“J �Bh ½7A@ ö^¯^»^½v½öÞ{/W½öÞ+¨ ‚ ½÷�„’ÞNÛ2¿?ö¤Ñëïšçó�s²gwvvwvÞyßyÞg„”RÒŠV´¢­hE+þëPþÛhE+ZÑŠV´¢´ÿvZÑŠ_�†àŽ»þfÛÎö–~Ûöö¸–ê&%({ïJ  Ùço=ïŸ -ß®oOÏîÏù_zN;ßÏÿ�÷®¿¢5|ÝŠÿ�Ò1œŠ²c§Ô°­­hE+þÐj”[ñçÇΊa‚-Á­ï¸[m-rÃD»¶ˆ6i4y¢?ƒp{Ý:Dz[DzÚo«ê¶mȲ2Dçί·å�ìøõ4TíVóÿdü¿–¼9ËÂ.,D( "'çÏ7˜’Òy6ênêµ§çô{K·c/\Œ¬®AéßÑ9÷÷9O+þh _·âÏ�¸A–ÛK‘³~À^»¹±b¢m:";uÒ�’Œœ¿óªKÑ.¼qÚYñŽRÝ}ÙñŽT®]ƒuÁ9(§Ÿƒú÷³ö®ƒ�c½û.òƒ·Ðyò šÊŠ_‡ýá‡Øóç�"À²œOÓ† íÜ 9ù¿&Ý[4<£µk°Þ|,L³q:@FÂhG…è?ëžÛ@s£Ý÷ "üs]«ib½ðõ´ÓÁëmj#sÂzÿ}”cŽEé? i{e%Ö Ï#²2QO8ißÕ¥Ù4ˆ\º¹±üA¬ÛoB½ø D¿¾®{׊}†V£ÜŠ?/:ûÍŘwÜ?þ9�n�Ó•cÏ™‡2r4"%ÙñrB!ˆÅv-§¡k 57º¶ågÛMaò†}wžgn,‹¸W¸SY–áxY-\‹ýÃLì¯?FéššîbYHjªwóAAósµ4ç½óµí¼Oõ4«Cãß;×±¡Œ†Aį_ìZnÑ&äÛoBf;DR²s_Badù„¢@$:ìàr6¿§´p­ õl~Ÿw7wßœðsÏjçû¨éÈ% ±.B™0Ñ);^¦Äúî[ä;¯b§¥9F9ÞŽäÚuXÿù7ÚI'5�‡¶µÓýo¸Ï-Õ¯ùqÍ®_ì?uÿ±XËa/˜�Új”ÿgÑj”[ñçDƒA^¸óª+!5õ®#G ü~gÃ@ÖÕ"‚ ÎßB€ªîjDšwð;w�ÎF縆ß5m×}›ßø½Ù9‹jVVKðx‰‰h=YãÞ²Bi*¯ùñ;Ÿ«…{Ôâµ5|ß¹£oŽ– TK×¹óï»3.íø“QÎ8 £éZY[º¾ãõ5Öæe6¿¯B쾞-Õc7†íg§¤t¢†ÁœŸ�›7:FYQ�[·"çÍEvÌ…E œœÏç¶f"9FÐr¹»»ÿ»<»fDz>Hg Äårö/+GnØ€rÔ±?s1­øÿŒV£ÜŠ?/L ëõW¡¼õ–[Q† Ýñw·áv;†­Í d¼£•¥¥°z%veÂ@tÎCdw¤É}">GíAVV çÍ…HѶ¢[˓ś¡h²¦Ö9vgDçœ]Ï»;H»ÉóÛ¡cŽOXZ6rÕJȹ?aWW£¤¤@Ï‚¦�/8ƒ–²rX¹ YU ÁDDAoDjŠó{,Š\¾‘›‡ E� ç!zæ#:t["׬BnX¶�èÑ‘œŠ\¿ѽÔÖ ×BN."-­©®¡rÅ2h“ŽÈÎÞéÚ¤ã7DZ¼~¹ãýQˆȕˑ%Å %¢CGç¾ë˜&rÕ p{¹¹�FLnÝ[· ò{9† A._æð :v„H¹l)²lè.DVD^×=z—JŸ>H·Ž\¹ Fîçl,Þ•e(‡À²ȲRDÇlç.Z‚HmƒÒ³Gã3iD]rÍjD^7dMr餪¢tí�è�UÕØK"ëëQ:tDtï ª‚]T„ýÞ‰ |ÊÀ ¬wÞD&§¡ôjõ’ÿ‡Ñj”[ñçCC¨wÍjì™ß#8Ø1È»K[Ú%¤ÿT5ìo¿Áºÿ.ˆÙЫ¬^ µµ(§ýõïwö³mðx�_�ùù‡àO+ËAßAhwÜ�HOGnÛŽuã ŽÓ¯üø=TU£^+ÊãÝ5z}-{€Ñ(æÃ@y9´Í@®]ƒp°·"†�B½ñvDZªs™s~¼õ&¤Ç�2h ò»iŸõ–Û½ ª ëšË‘}ÁêÈÂB´{î‡±î½ ûƒwr!-žx‚ÉPUŠöïW¡¸ãÌÓQN:íº�{¤ªXŸ}†}Ç (7Ý�š�ÝB˜p»�kÛÓ¼|ü8YR‚uÏ�È9³ W?ˆÅ�«—£ Šzù5ˆvm±~{s ®×߆ä$çð{ïÁž1õ¾ÇPö唵dÆùg£]w3J»ö˜w܆ýÝ7ˆ±ã¡p="1 íñÇZ®O¼ )]»b¥d /hªêwÓ�ÉmP'LÄœ5eñDÇldéväòňþC‰‰Må4Dy¶mżîJèܶlä¶-Øí3PN8ûÓO ¼¬(veÊiç ^|!J»vˆŽËB´IÖSO"CaôÇâõo5Êÿ³h5Ê­øÂñåæÍ -DÏgsƒAŽFÃ(‰T·ãA6Ÿï+)ÆzáY¤Û‹vã (ýú"W­Äºïvì×^B2Ñ«O¼ƒ“ØÛ6¡žp:êñ' ëë°_{ë�W°ßÿõ¼s A”“OCtíŠè�…\}4æµ—c¿ýÊèýœ0ãÏA8/ûõÿ@R²ãå›&ätAëv`Ï™…’•…öèÓàvc=ó$òë/±çþ„:q"²¢ó©'!�€~û]ˆÜÎÈñb]ýO¬·Þ@ë™ïÔÇãENŸŠºßþpñeˆAƒ�S¿Ãþ蔑cP/¹ Ñ&û³�±¾‘ÖLѳ'Ê !Èó‘Õ5ˆÄ'R°p>2-¥oß› nrѤǖéÜ[1ö'<Ü|.ض±_~ 9g&ÊÿD=ä0¤mc½ú2öKÏ#²sQ/½Ñ{ bÙ‹Èâ"DrrûvìíÛ�¶@Î� q£l/X„HL@6¹j%rÊW¨§œŽzáE°e+vmÍî YÃv¿Ñ£'rýdE%"%¹r9Jûöˆ=ÀçE®^Š\·j«QösŽÝy>Yw!Ü.äÒù¨¿qàDäô°ëÙ§P†�F½õN¨©ÂzàNì)Ÿ¡w "#ÑÑ×XŒýîÛX/½„zúYØo¿‹(è‰èÙ³Õ0ÿ�âO–“ЊVÐäéVT8¡Õô6Îß¶¦¶>|ãØÃ1Ï>óü3±^}µÅì>F®^‰vÝ (Cƒ®!z÷F½òzÀÆz÷]gwUƒúzÔ±ï9@´m‹zþ?ù}‘ß|µµàó¡Œëä²rd]‘™�ܲ¹iSüÔ?Ÿa(¥Äþ~ö§Ÿ`ù9ö'c/Yâü¨d4ŠÈÉA½æzD·®ˆNÙ¨çœi)Øsç8e̘ëV£Þ|"·3ØÑ¿?}<ö·ß!×o¯ #:tD½õvÔ±c.7Ö›¯9eÞ|¢c纎=1î 0bÎ\°Ï‹˜0Y´ÙpÎ EÈ9³Qö?‘ÝyW¢•”·û§1~ã±G0|óßÏ#kkw$¯¹\È�±>ÿ&†zÊ©�œ„HMA»øR”~±¿úêjQÆ�)°fü¿öã&`Ï›‹¬¬)±§~ ½úC»ö ƒAn)†ú´k‹ÒµëžLœ ¯ôé…\Sˆ\±Y^Ž]¼‘×Ñ®-j^gìe‹�– ç€îAôé¿»�ŒÆ“ŽF9õtDF:Ê1GA÷|” õòË�;!úöE9êdäú�°jµs¬ÐX&df¡Þz+dg9-[mõ¥þ—Ñút[ñçCÃè?5¡*ÈMÅq¯ÀéÔ•¾ç_Œ¬«Á~î)deåÎ8› !�ŸCµ½4ѱ¢MrE¼Tâd¢ÔŒ¦ùPE8xŸ>È)_:¹ÇÁ ö¬YÈ/>ÆÞ¶JË�eÛ AˆîÄøÞ¤Dhê­wAÇNãZ„Û÷$qÎ :d¢#Ÿ�àx¾áöºµHia=ÿ¶Ûí짪ÈõëVêªAd:såé™Î¼«m#+*�ë7¢ô.@Ž!j¸ß‰ÉÐ,ÇX6û…$ì/¾D7¹| ²¾uÄ(§®Í™Åà�¢BaÔ#NBL: ÂaçÚ\.DJ 2mb+ vq1Â4P vd½+ të…«± ×£tî™`éBÇø.[ŒHNE™4 óº+`ý:dJغõ˜œò»õD}"òÓ1·mCì7å°ÃII»÷0¶uéá ¶l·Ñ¢¯ã ËÎÝ�Ÿ}†\»{cœ Ö®}ãõïð¨q˜Õ"-cÖºðû�.—Cxkx¾^�ó݈6µI!@ÕP† o¹-µzÉÿ“h5Ê­øÓBtΘ=Î>Ûé„lÛñ»uEVV`¿öŸ&¶ôΰc ©NêQót(MoJûi<™â‹š68£¦;†ËçGΜ‰yÕe(½Ñλ‘–†ùÒ¿‘Ó¾Û3㺥kKJ„€ðï¦îö®F¯¹gZU…p»Q† �§qŽV ‰ðx ·+D£Î54c@cÙ‰î*�¡4c7ÎìlĸœAÉÆ"¬iS�²›w»ᄾ33Qztßõšd¤Ù®ÂñÈmáríZ–Ûí|Æ øPöÞ1¹¹¹`Êñ'¢ôéƒ ö²¥݃”1` s\À�vù؈õòóÈï†ùsPo¿ü¾– süÞŠ^½�²�kV;÷9! ¥¿c”E¿ˆOÞ‡¹?a¯Z‹2z B×öœÛn™;²Ú ôu»gˆïI¶´ÿsh _·âχO-+1zö²%Ø}èx}�!Pœœ×ïIJ:C]-ríÚ&LìU«‘Û¶"zç;û5ÀòòÓªjë�óç!Ú¤!’“±'…pk¨×^�èÛ2; ¼þ_²þ-÷¡Ù†Fã«tÎ…H%?õÐÃP'îü›x0Êþc<Ü/vèüEr¢käúuÈíÛ�k�ßSY´‘�-ƒ:fˆF±ßyV¯BŒÚ¿)E§Eo“FcÛøÙœ‡´mDV¸ÜØ ÆO¯K$ Ë!Qâ oÑwÒ°°?û¡¨(½û8ó¿£Æ`O›Ž½lJv6¢}VÓI\.”�Ñî~åèã±~˜�½vm¼»yfR"ñA‚Ò©øýXÓ§"Âu(Ƶ\Î÷ä7Ð.Eó­øŸE«QnÅŸñyGõœóíÛcÝ|Öc;†$‚XQ[ÑÈŽb!Í:,å ‰· ûÑ¡¬ÔI¯)+Ãþ÷ÓŽA›0ÑÙѲÀïÃþúSäôïÏh ëÍ7� çÂØƒÀ¥#ëêâ \˜rÕ*ìï¾u:ì�s•÷¡@M Ô×AUÔTCu•3�Øp|Ke4ónÅð‘H݃u÷íÈ-[C�A]ÔÖ´\Û¿åàC‘+Vb?ò TUB$„ýúÈŸf5\p"Ù}û!:wÆz÷MˆDPG�nz>-^›h5ÿ×üwE�XÌ‘Úì?ûËO±§Ms¼b#†õöØ3§;ä°4‡O F$±^|ºtAätvžñÈQÈ•K�³DŒãD;¤tÒ‘¶oƒpáñ ’SÁ´“=!~]JÿˆâBX»eð ÆßDzdæÀ‚ÙHBÉÍÛõ>7GóÄÎ÷¨¥{׊¿îD”SOo,K¤¤@�^°l)Jïþ�!ѧ"³l/AŒÛx�íÙ³°ºüÉNÄ ¦ õÄÝ÷PÿæuíÑ ’R sÜðÚ6x=(}{c}ûʤM²¨»C8äL4ƒ4 ˆ»îkÄvÂnÅ_­F¹^4æÎ�Ñn¿Ë ;ÿð=²t«C€iß1dJçg÷®y(W^ ›<åàCù½±ÞyËI©8õð£�;5¥Nee¡œy.Ê1Ç W¯Æz÷m„i FŸ…:ñàÆT±ßþ¨)騼 ±¨£uÜ&ëë/(cF#“’ ]fÓ54ûT;:f‚�ñ…)/Ú·UA9æx‡¾¦´ü~”3ΆìNM×6v"¯ÖG8é9º†1eDÜ›õùQξ‘™¹ã=ué¨gŸƒ>{ú4DZ:ê¤Ã1{ØÑXöÅÒ�¶c˜‚àõ¡0Ñ™£ß9tÝH�ê‚rõµ0dX‹×Ž×ƒ8îd„®ƒß9‡Èî„v×ýXˆýÓ,Ð]¨ã& ŒÛ¿ñ:�'ÐN:»S'ÄøqM§ÎHG=çd}J§œ¦íý¢œxš“Â…@{&Êă[je;¢!ÌŸÛåŸW;¡ì¹Í†g8î@$*êè1ÎýØÍ|²’’ŠüÛ¹(}úí¸}ÒQPQéäª7œ6¿Ê•×:7h$5¶â¯‡ÖU¢ZñçGsÍà_‹t¤a Ç_zþf¢ìÃúÈÒ2Ì3NAdwD{ä‰F•,¹r%æÅç ú Ýó@“zÖ¾º»»†_úÌ÷æ9¶¢b4zÊV dŒV´âO)iž²ãüÝÀZÎo�o³Î·a®V`µÔÙ7;N²cù�e³Ó6šŒ|ósîPÇÝ›=ÌÇ6–±siy{£'©8åÚ;íÓü˜¥©’-Øï¾�’›ééÈPû�·�Û‹Q/½ KU!Â^´ëáûÁ°ÐN: KÓvL¡j ?gøötm )a¿ÖPÿ–2÷„= ~Ë aOõý…uB þ_ 0dœpÞê*вÇg×ê)·¢5H ï¾ ß|ÅÅ�˜ƒÀ�¡{�¦ý®ø§C »þhÛî¿VÝV´â¯!¥”†aðöÛoSQQ‰¢©ñÁü¾µÕg„ w¤oE+~�ª Ëúëµ!D<Jî�Ôu bÃFDyø|Ø�;;‹`ÔÕ6œeþì6iÈݵµ­¡ßÿ2$ **µu5l(Ü€iˆÿ'Ì0USÈh׎´´td3½ô†·ù�¸Šæ³Wÿ E! qÐAQ�ßÓI l�‹ TWWsãõÿâ¸3/àãןà’#4Ú¦±böo¾ )%^¿Î´Ù[˜¼ÔÇ©—ßDÄò"äÏ„ÁZÑ $6:¶ÃŠG±ŒÚû±Mùß}»þ@¨šBEu=¼krØ9ÿ"µM±˜�òs©={BCØ?¿/Rs„/D4æˆ\R›v;ðP‡ÍA õÿY¸ô¶m“�ä£>!Û]ÉQ“Æ® ý¶¶ð;BJé„ÙUxîõ¯‰&Er·¶„CaDƒƒÖ ¿wû’2>¨ý/µc—K'æ‹b{’£-©4hx؉œú·S)Ù¼†¾ùK<>jcΜL¦ÃšO—íì¸4ß.¥óÐé�—JñS¥ìÀX2²œÌ•_0Ó|$õ‹öo6]ó{ß{;>´Óì¤3EÉÏ×ù·ð—þ*0�\±”—oxŠ�’˜pdÔìÔ.ÿW!%ø]¬šUDÿ­=8ý‚¿ãÖ‘3ë·�—›ÞgØñ�n€ílÓU°öÕ9[±WhèW|*Ì›ö 'OgÜ ‡BeÍ®êlØ\:±òr¾�WÄi\Hçì6„MÛUƒž¢Ö®ýis4؃_ûê7£ §?±ÿKíØ­8uiöîn¢5ü�F±� FòùÔoØ?³Ö@UšÞ[MU@ȘÝFTU�pÇ)�Ù˜†�ªÄ·©L‰]#=ÍG‚²�é“§0ö˜S©©ˆ ì¦15œOUUTUC0MË4w{!Ð4 —KFÌÄ0Œ_uóixCÆï™®ë˜¦‰mÛ8ÁU§æº®#Ë´°,³åõéÝåBÚ6¦Ñp]½Ðìž %ÍEMù—L™QÌ?Ïì…UÆ®3þ÷½6ÏH2l>�º•Œ¼SP�,ž·†m[6Ógð°8?M6ÙÕf#o§“�Û�mMí«a_÷š% ¡ñ¦v¬ Ìýa:u"+§3±h !Dü];ðÉÏ眠ՀïCHéôo[ÃuTÒ.£Öæ­„C”_`¥ZäÆÿÛ…o¶›í¿¶-ñ&˜5keõ‚@B�-Û#Ø–�?ècíºu|ùþÛDBõŒ:èPúJ}m¸±M6ð.";ªª ¹\DãšêÎOÍÚ\³cš·uUU‰EÂ,ž;›n½ú��”‚iš ÔÐÛqã¥ïÃvìöhX ø=*~}÷©Föµ¤PèÑ·“¿õb‡¢è.½i½Tʪ£,ZQEÏÎ ´Ëð"¥$²˜úÃªë Æ H§};/¡z“¹ ÊXQTCÏì†ôIÅåwS�`ýª¥hŠŠ¢©» »4^cÑåU5 -’RSq¹X–¹ëÒ óUW–³lþ\,Ó$¯ 7í;`ïn±õ–ÎÛŒøºçý–eR¸j9™YøAì¸Z�¢*ÔT–®“�œŒÛão‘q¨¨ ×®&˜¤MF; ÃD´æ&6ƒÄ–*A½ž’¢eø| ];ùQM‰P•¿FtA5X¹Ð�.X³|ß~ò!†G(.¤´ÑâÚßF,ÖÈQu -Î1 Û²Ñ].„*°-Ó0�ªi$ª¦bšÒ¶Ñ]:–%±,Û¶øéû)¨Ú8ºäws¿ª†¢ ÃĶ)OEh.$X¶�´ì_õîµbÏ�Râöè¬/ÜJ›7m3Ú€”hšú³T‰tXR6†”¥”qc.§¢™‘k`v7ß¾7ÂFÕUÖlÜJJûNünª+Cøƒ>f}û5¾òy½HHNæõ§¢xátÌIqî„À²,„(ªŠ¢ªÊËØ¸v5}‡ Lj9mÕåv–Kµ, ‰ÀŽgZè.Цa‚P¨«®dîôoÉì˜MZ»¶(QUsÊ5bfc[UT]×âÊ»N–û¨+ªÊϳæ­€‚X,F·üîT+�ØTT…Ð,K"t…mÛ#œsó<Ž¿f?.,� ªà²ûñÞ7Ŭ(¬å´æ`Ø’ï”òÂû…Ô×›œwÇ^øp=xUú$±eíbêjëQT•–ã½—žåá¯qö�ßT)厃†mñŠ"P¥ñá4ì¿óq¶e¡( ‘P-Ýp5› W;# xùô�W8ÿ¨ƒ¹äÄ#xæžÛPUGEÉŽ—Õð Ý�gï½�é_‚?¨b™fãï F\6«û_ ‰%4’ÅFVÎ[Eç¬$’SÜØ†ý—0ÈN”@aëÖ:6W'Ñ¥G>±¸g‹FP…ªÒí„êjX2wËæþ„_uHséÄ"õü0ù+~šö-F4†ÇçfëæõLûü*J·âr»±-‹Ò-›©­ª`支)ÝRŒª*üøÍdV/]„¦ë((wæ9ä÷Deiµ•”l\Ï_A$BU5!�XüøÍ×,Ÿ?‡ªòRª++þ´s�ÿ!¥DwÁºUËÈjã'%5™Xl÷‘Ã!ðø¼¸Ü.Ü>�3€“—Û…ËíÆåÒñx=�çpé:n¯ÇÙßíB¶ÐGÿr0-–¯-¦k|•-UÓ©®(ãßÝÏ!'ÏÅ7^Ëy×\ÎY—]Á³÷Ý͆ÕËÕV³­d3Šª`1J6¬' ñ雯rï5—²rá<¢¡·‹¥sç0{êêj«¨Ø¶¸=.6®fÚçŸRSUŽª*ø‚‰}ÆÙ¤·Ï¢º¼’Úš*6®]Å�ßNÁˆ9ÑUS1b¦õ…+–R]^J}MuÜVýqh2Ê€iZ$$¹Hê�ÏÜ55àŠ‡,I‚Oç–0¨wᨅ5ëj),®ã¦‹ò¹õŸ½h›âáóoK=¬-_Û�Ë..à¢S»ðíÌR¨3éž�„ÙÎÖÍq»t¤ÝòwFr6ÅEEœxÖYüçý÷ÉéÖƒçî»�x|^‚ ‚ nÜ^/Á•Å?ýîîIö;h"Ѩã5¸Ü.‰A7þ §ñ¾ ‡`¢_ÀMb²›’¢ ¯<ñI©n W-ã²S�ç»Ï>dö´o©¯«áƒW^âÖ\Àâ9³¸ä„£˜9åK‚‰î¿î2n¹ä<¦ý7ž&w\~3§NáÎË.`êgHÐyøÆëX8kÅ›Ösñ ‡ó̽·ñú3�sógaY–mpãygò雯ðåïpΡ0cògx|Z«·¼!%l.\OFjTe�³ÁÑG¢Üþà+ô;àl&žpë6ãNðÍôù~Æõ ?ü|æ]\ºŽÇãfÑŠuó÷›{Ìå|øõL<Ï^9RJt]£²¼’-!²s»‹J<^�•‹æãöx8rÕ•eQòòûÓ±SgÖ._Î×¼Ë[Ï=�? Q]UÊã·ßÀŠE‹X±h>Û·óù;oa[1žð.¹åZæÍ˜ÎÅÇNâ?�ÝOBŠ‹—}€»®¼”…³frù)dzdî,TÅæ±[o¤tkëW/ç‚£&òÊãñÜ}wpÏU—âñêÔT”sõßNâ›OÞç�Ÿå¼£&²jé||>ÛúãÚq“̦H[¢)ЩG_Îþ€cM¡¤%ñ4z¥'áÖ'DæRXº¶†œÌ™i„®�Ÿ“Àœ••~D'tC‚ ±ˆEJ’ ¤MRª�´„zV.^Fçî=�åV÷P9¯ÛMfnúädÓgð >zíu4UaÙ‚y|ÿåçDÂa†�OÁÀ~|þö[®ZÁkÿ~ðâóËP¸ª�)@MU=úôeì¡G’o?ý˜ÙS¿CÓtÆO:’o?ý��^{‰H8ÄÑgœ…Ëåæówߢ¶¦†Æ3jÂ!DBaÞ|ö߬[¾‚ô¬v„CõŽ7 A(Ë4Õ×LL¦{Ï<ªë 50bÞxå W­&!)‘CŽ?™.=óœ0£¦™¼üè£m$-=�#O;B"¿ñ.ÕåÔUWsòÿÀíñ5†tþ×!¥‚®ZÄJV°zc “&æ‚eïóyÊ} ;ÎÚÛaý†8³¤aήAü@ì´ßï!›e«êéØs �ê,ú„@JgA¥ÊòR’Ú¤síÝwðáoóùÛoqÒ9gòÖ³OÒ5?Ÿ ¯¿ÃPˆÔ×òÑk/qòy—pÐ1‡ñüýA>ûuï7ŒªòrÆv$§�÷w.<áL#ÆõwÜÊ=7Ý”ßæàc&Q]YA,&� …8ã’+ðúÜ\}Ö¬Y:Ÿ­›7S]YÉÏþ—ËÍâÙ3©ª(g7Á°Vì„&®fÂØð ’¡œô©ɉ®¾ütfÏ^ÂM¼Ìó�\CrÐωG�G¨*O=ÿ>ƒûu£w~.·<ð cÇ $%%�'^ø�ŒÔ$†éM´®þWE>¤”hn�õË‹ á&»sgbQ‚‹Š²rüÁšËƒeZ€DQI©ÉTUTÕQW]…@bÛÛ·”�”’ÈøIGPºµ„ ¯»Žm%Ûùñ»)\ð¯›0l05•TU”±y} Ó¾üŒs¯º†ãÇòà¿näýŸåš{¤¢l;–e‰Dˆ†ÃœuÙUÔÖTrïÕWR¼a=?Lþ·×ÇÕ÷ÞGUy gÏ$TW‡òÇ:Ê;­%=ù}²j‹‡šÊz-¾‹-1Bæ¹’UõAŸŽ*¶�B}ÔDÆl4ŸÊ–¢ZÞüb§ÚÁ9À¥Ó'GcżY{|Y��™ÓùLûò îxü>zý5NÿÇålÛRÂã·ÝÈàÃ8ôè£xîþ»(Ù°‘ü~}ÉÈÌbðða€trÂÂ!¼áÚeµãÔ¿ŸÁG¯½Ìì©“ùñÛ/yîÞ»8ðˆ#9øØã騹3Ý{õ¡Cç.ŒŸt(ª¦pÏUÿ¤[·®œxÆ©¼ñôc,š=“¯?|‡¯>x‡Î:�¤ä$¶—£¹\áP„®½úqÐQÇqÁQ‡rýEÿ¤º¢‚Äd�º›E³gqÚ¹ga÷_{Òrê(mEQ4b$g]xÅÖòòczxõ‰‡øñ›/yàhš iË¿„AvR¡üz=›WÏǶ5ºu@ÌFÙ‡×/�âU±Ý% 9m=Þ.¥Õ£¡µÆ‘£âQPtÏï–uòQf(Ê¢�P0pxÜ Çë-â†YÓé5`0é)ItÍï�®»Ø²q…+—1î°£IJI 19Àö-[ðx¼Œ:è4]ãàcO¤¾¾ž­‹HJN¦k~_ƒ>2³;Ó)·I>7rº‰„°L‰ÛãAÕt,Ó"»KWr{äÓ.;‡Œö™TW–³ø§é3d8�rÚÑ>3…î½ûÆÛêïz›þ2�R¢iÕ••Dª·“Ý>=¾æT¡„À0MÒR“¸àôIœpÂD®ûç)¬\WÌ–ÍÛ8¨€ŽŸÀÄ1ƒHJð£¹4fÎYŠË¥ó�‹Nä”sO¤wϾœ:Å­ÿji Çqs±|Åü)™¤´IÄ0M¤„¤6IT”•ƒ´p»Ýè. P\´‰ô¶iHiãñùÐu�ÇëÃíñ én�·ÇCFF2«–.!½]{†ŽÞ�„€‡þ#GàóûX»l)mÒ6ö@\n�±“ŽbûÖ-TWÕâóû�wDzÉËïEv^.9ݺ“Ö¶U¥[Y³tCF�¥]zÙ];“—ß+Ιøc±Cï"„ÀˆAÇœØIÝY±ºtµ1dèÌ»Æ9ë6d¶ñ°½"‚�Óa•×d¥ú>•uEuÜðÈ2.95�‘£Úb…M0mzuK¦bóRÊËkÐu­åЈÇýÛ°(-.&5èÞ»€¥óæ°eskV,gÞÌ™Ø6Ô×ÔÒ¡cGÚd´§ {.‰ËåfÝŠ5¬_½’â�™úÕd4Ueó†�|÷Ù§L<æXF°Ýzõ¥]Ç ²rrIJIeШєmÝBáªl,\ÇÌo¿Ã²l6®[Ëü™?0éÄS0¨ã;ŠÌìbÑh\;^bšÇœu.wÿûUj««xà_W²©p+KçÍáÈÓN§ O'œs.õõu®Z�Çãuˆ:ªÅæ ëù~ÊdjkjØV¼ #Cw¹9¾ßš³bÿ °QI´KX¼h5�:ñ5ä>ÊO–„*¨®‰ñìëk¸úþEÜõär¶–†šÀ¶%ŠWá›[¹óñe„¢B¬]_Ë}O-çï7#\Êï§�#]¥¤¸–m±¶té–K,f4†®ÈŽ–eד’h8L4%!%…ÌìfLù‚Pm˜Úª:’Û¤ ‡ùéûo°£S>ú0HFVBõõD#!L)‰E"D#a )‰D"Nô@#fÄyñóD¢Ä"1¢ÑAÁ€A,úéG ×Q¸v+/DÓ}GÞŠ–á„‚UJ·nÁ-#¤§§`ÇÌ_<è …"Pâƒ�¿§w�²²2¨¯©ãÙgÞãØ3o ))H¿þ=h“”@YE5S¾šÁ’çQX´ÍáÓìE.œl‹¶’ݽ—³D9‚HȤ ÿP¼~?o<û±h ÒŽðÙÛ¯ ‘ = —ËÅÆµ«©,¯¤påRJ·” âÒ”uÕÕ”–V‘Û£'[61kê÷”n+ã§©ßaÙ]ò¨,/eÁì˜áÓ¾ü”´víHH  Gïg$"µˆE"NF�ªÑ%¿s¦}KqñV.\ÊÚåKÑÿ íx‡U¢Ó”$&zÉè2�y+–0dÄŽO£>lbš ›¾=“¸í¹|;§”œŽ~~ZVÎ#WöcËÆ:N¼j6ã¥1nXÅêHOr¡6]:%âŠldã†"úö+ˆ³ãv Û¶Ð]. Aê"v<ñý/âzH‰PîÐ*–­,e¿!íAØRî;OYêC‰>� NëÆuw/â¡WÖpϵýP”WD¹þÑe”UG9÷¸\üªàµO7ðÊç›9td{Ž8¨Cá™û.Ãëuª 1iÂpúôÎ㎇^åçrüI5¤€ ¯~˜Aýº³rmŒФþkê«*uõl*­cÿCóã’éc?)%™¿_~5·\|.k–.Æë°tû>R3Ò¾þèCzôíE$™m‘¶M,uBé¦EMU=ûå“Ù)‡¯?ú�ác÷£¶Þ ÿ°QL8êXÞ|æ ’SSP5=z¤mV&uÕÕ¼ûâ+ô:ŒöÙÙ|õÁ»ô6ˆHT2pÄ(FŽ?ˆ÷^|ž„€‹µ«×Q¼aª¦a[Nnò–¢õLŸüéíÚ±vùÚuèHßaƒX¶h¯>õ±P-ß|þm³:Ð¥gj«ª�¦A4T‡Û­³~årÌúÓtÖZ�†Ã±Ønó¹ÿW!Qðª…ó(«ª£O�d؇¬k!@š6í3¼p6õBÒ5'€WW‘BQ‹{ž_ÅøÁé,\Séc’kþÑ‹äT6„œr~·A’ãe,-Œ‘×o.Ô#‡LúM^~jk-Ž>ã\*«-rºpÍ}�"Ýûà¡×Þ£på |þÁÄdŽ?ûB†ŒÏö’N½èRÚ´Í$T劻"19•Š‹“/¸ MÓ(­±}Ða ÞoB!“Ëïz€„¤$TMãÒ[�*\tÃí‰Emn|ä)¶o݆ÏçbËÆ ¤¤µm¼”Vüv¨ o\Kçö©¸½^µõ?›Ÿì¨)z™5{ ÷=õÝv‡ö&ZQ�Ë¥Ñ6%ƒ¶}º“ÿÕ ¾›±€ã�;€[®>“k.=…/§Í¥dkÃåcGc¿êÝ“Râr»Y½¦S �“וhØá' !¨¯‹‘ßoÏ}2™u+V`Û6ç\u=)iTUDéܵ�¼ñE…ëÈÎë† �@0Ƚ/½EÅöm˜–Íé_Ê�GƒÛçåͧDzmLSrÆ¥W1æ�é,-åo—]CjzÑp„+ï|€ÔŒ RRÛsñM9˜1 ]óqþu·��’ŠîrsÏ‹¯QQZ†”1¶nÞD01Ù™:úÛñ.FY…XÔ kϾ�¤Pº½žôvIØQ aÁ­8J?a )àÐ2™°_[, ¯†¬59ñÐŽœ|D6†icKP¨lËFU5úäyøhÕGÕk'{ã8ß�Ú�Œ¬ŽÔ™ÐwÈH'¯7)™ ®»…‡o¾–w^|ŽþÃÇ0`Ä~tèœK¿¡ÃˆСK¡H·ÇÇ%·ÜŃ7\Å—¼M·‚¾dwîÆa'žH¨¶–gï¹ �ßÇ%7ßÍ�Ñ#uàA¼ñÜãô0€+î¸�»®ø½þú N—sÖ9lÙ\Ä]×^Í�GϧžŽÛãöd£ ÂÂÙÓY·| ™�ºpÉÍwáõ%pÂÙóÂwpûUWÒø~\vÛ½X¶ `à@’Ò24j¦}ñwÝx#C÷‡?ÀˆÙ =–ä6˜±ß_‚îÏ�ÄD' –±uí*<7íÛyÁø¥Ò.¿ NÊ‘`ÖÜRna%µ1Þyp«òŧ%xÝ —ž”Ç WÏ"1AÅIþ—V)lŸUe(šÀª‹²~«ÊÐÃûcÎó·-›@b" É)˜±m2Ú�˜†‰Ç Cn"–a‹:¿µÍÊĶœð³iZätïI—üž˜†ÄŒÅ@(duÊŲ,̘EÛÌ,$#j’˜Ú†ä´tLà +'× _#É &:9Î2³;!…êŠR>yíeÚvìĪ%‹Ð\.�C8ôÛò\[á@�iBå¶búuH�KZíù}°¥Äív±vÝ&Îüç½ôî™KUe-/¿ø!ŽȼE«šŠPæÎ[Áù§OÓfá’5¬X»‰'ÿý'1–~½»©ýõ$/áÒY¹f#zBimÕFuž…€XÌ ˜”Ê ýöÀ4e£0�iZ´íЉ¬Î9˜FØ–‰‹AÄ;»fxÃwM×±-«)5I6°ÌÅn�i8Oóï *];ìoÛUÁ¶,V.œGQáJ‚I)ô2ªI5©Õ(ÿf8aVÁ½ÿ<›K�êÃÐ!} ÿ ZJ‰Ë¥³|M“\„KW‰DbèºÆ1�`}Ñ6fÏ_RÒ¿w£`Kɇ_Π¨¤Œ±#úл{¦ùë‰N¶mãMrÃmOaåŒâo_@eyxÇ|ß%ºfRcÍÛJãÂEñm;´Ñ8ñmÚ•¬\<UÓÉï7˜öÙ�6·)íÆ¼Êݵõ¦ïÙÖˆÅX6w[6¯'%½½ÇÆ—5þííØíQ±A— E»Víê)ãZ�Úæ°líWL’ÍX¯;Í-(qæ5ÈöqŒ�l:qÃÙ ›¶mƒxŒB6­ßDfû4"Ñ–Yņa7æ2KE8†QG>S(ŃeKõ'¸aX¶žTTÅÙרª˶A,CQ5Û©,¦a*BàÆø9:?¤$fHáÆ4vm¬¶ea[ „ Ã�Hi4*ã1‰P܆ը µRbJBLjš�÷ª‘ø÷—ê×BH\õëX»¾œöÏùe2k¿M!-'@Ú€T:—ܾˆ�ƒäå%°puµ5&µ&ó–TrÚ„ŽèñT¨}ÉoºÂÚÂZ´¤>$§ú¨«jò2Eàz‰†RI4ŒX Ø1š¢Ä™ýµU¥x¼ATM� óìÄßhö÷¯þOT�þ#G2tÜH,"!«Õ ï#42¯«k°"õ´i“ô³Ìkhƒ2ÈïšMAÿ4ÎJ0kêhß¶ #Föuv6,¢¡0Ç1tÂ¢ÑØ^Ô×Ñ_ˆÖ׳®¸Œcóâ¢�;¶!ÍåÂ4Íݪe9+£íz� Û-Û&·g=û ;Šv §BÙåí¾M+qqCÇ�Cw�ƒpØj ÿ‘ØÅ(ƒãáÆ¢ÐgÈ>šúUÛkIJ `-{{Ú&vÚfY6Z‚›>b,šõ=CGößídº×ïÁë#žráºH# ì¸lÁÃÖ|uÕî¸ZM,Ýå¡Hi9F?>šR5 —K%ŽÑ E--»ÙÅÄõ‚í=¯¦áüÞT·ÆY|�ø]ê,š÷WîÈ$¶Tð»"”.ýžŠ‹�Ý“!ºoà¶-Q½*ßÏÚ·SKè”àëﷲ߀T9 “ÃȯÊÚ¥Uœxõlîøg^¯Ã«ˆÄ,ê#-H½î#(б³WÅÈ4ÒáØÄ„BQ‘¶ÅÓ÷ÜÅš¥Kq{\L8êFp ‘úHcû´m‰Ë㦶®–».¿”³¯úyùù„êÂŽ±¦iÕ†A¯øò»ƒD®‹ª¥±Ý·ä}‡y­P¶}3.´OKÁ0Ì_5rÖ4ˆa‡#4ï‰UUÁ¨£„£€ãÙ6xÝáºPcêåÞD¦ãæfÕšBjL¹]»�8Ä͆F}m5o<ó�=žŽ¹]ˆFŒÆˆŒ´› \šhšm‡Â„ꚦ’EmÌPhÞ¾›—Óù Žx“ç¬( õµ,Ëv2�âS’ >Á¥PײQ‚X̤Snu"“µÊ8(i˜¿™Ü"ãÿäøaöB!µ¥e¼ÁÚe‹Y»b1¦aЭ׺æ÷&‰5…6œÊ6cÛŽpUi)Ÿ¿õã�8†íű¥$3»3¦i4— GSR[UÁö’Mdçõ@UµFÉKÁNáçdñz¶ð v×!ý\GõïÈ•€(cͪU¸¼:mÚ¸a,!ºÃyâ/½?à°Ž WÕ04?™ó�ïŒbJ¬¨�jH¼gÑ ÂáQD-FôJ¡G‡`|Ž{ßBŠ*W‡(ªô1± Ë 1lì÷k|ýþÇÌúf2gþór¢‘ IIX¦£kí¨�£hÔ™")Û¾�X,ŠË#Ðu_ãûW_CÓ4Ü^M…X ¡_Gèi¡(­€ÎE…òÒR‚ŸßG$büâç$„pˆºÍ ¥D×4jãÞqÐëÅŠG !âó{‰D¸4 ×oÆ—ÒžôvmãºþMS†eîSyÀhšB¤ÙT‹ß¯8mX@]µã<áð�¤ õu1,Kâõyq{œ®XQ �çø«Nûv$Dêê „„`‚‡HÄÆã�Ïm+P_k¢k*º[PWãœ/)ÉGÌ�X–�ßï¼SRB¨6ú‡ôÑ-eGDÄ M›íº fæ¢78´ƒ3 ÷ë¤Q‹�©D>XBÉær:w$Š6Žnœ‘�äá›®§]û zöÂ}×^Á„£ŽåØ3ÿN4báö8¢áшb‘Ò™kNLVÙ°º”—}€ŸÄ“¿D"8õ¢ !ìÄõ ¢‘(^Ÿ›�kÖ6ýº±bÁj>~ó5.¹ùN4Ÿ†ªi¸=*¦ÑDBÐ4 '/ÞI¥ŠEþ˜õW€” Ot= Ñ7/áV1#–ÃgØGB £6òSÐ? ¢6¸›HÃQ’¦$½�‡óNɃ¨3å@X2r`ºc$cû~>YÚ|*Ë–VóæÒ­g"Ù"²%š [Š6âöx8ðÈCpeÕNgº½d3=ù›7n Ï ÁœzÑ娪7¼V.ZÎK�ÜOUe%CÇŒå¤s/¤¨°�YßNfóúBÚ´mÇiÿ³Y”¨H„Û6—�•žš†”{ÿŒä7…ªrÛïrИÁ8n0Ư$síŠÂÂU騵~¿›êª0J3Y,!>EÓœwÞ–xü¶mäåGïcËæMô2”3.¹ŠêÊr>xù¢Ñ(ßý9ƒ†ïÇ—^E ÁâÙ?ñâÃ÷HH '¯]zöD(‚­›7sÒ¹ç°tÞ"~˜ü%ÇŸ}ÁË�<Á°ñ2íËO™?ãÒÛgré­w±háV-YÊIç_‚"$o<÷�»æ“Ó½;�Ýr?e¥ ½?‡œpÆ^„ôõíÛyCã°t<Éžƒ†²¦X…pl¦ôÞ@g¾7µM€ìäz6¬[‹æÚ‘=æœ_®«gÜ!‡pÕ…gÔ„ƒøúýw°L‹Êò2æLŸÎê¥KñÎZ×u¶obÎ÷?QW[KBR2†a2xôxŒ…“l+ÙÌìiSÙ´n .—F8TËßǯ¾À¦¢2²²9äØÑ]îFáô9ßÏ–ME�«‘TU”Q_[ÍÒ¹sذf%ª®ýuò‡gHÀ¥B´b5+7n§g×D°~§dWvÔÆªŽaE-¬švsqátVÈlšÒ`Çl¬èï¾–ª`Õúz’;ô )).C'ú„ê-ÆM:š@bÿ8þTÞ}ý=lÛ!<>qÇÍ„CõŒ;x3¾ù†O^ÿ>_�¡Ò«ÿFŽΧ¯¿Ê¢ŸfbÛÏÜsÛ·m!'¯;Ö¨ïÛŠ_‡²­%´I ‚öÛ´K¥t¦6>ÿî'^|ãKŠ·•9:Úûè5S;fÓ¶Zrzt‹Ÿt×ýì8¿GJCÚ�ß~¦e2þЃ˜ñõWLùð4Mòö¿ŸeͲ%Œ>`<“?þ�9?|K4TÇs÷ÝMFûv 1”ÏÞy“¹?LEðÅ»ï`Y1æÍ˜Î«O>NéÖb¶l*dÚ—ŸãryHËhÇÁ‡ÊöÍøàåÐ4½ö*¶—PSSÍG¯½‚i„yã©Çðù¼Œ?–¯?x—Ÿ¾›ŒÇ§ÿîzî-zÊN¢ ±éÝ3_Ogcq5ÙÛ`ÅGî¿¶-QÜ.†åëÌ[4—q�kѰ©ºJmme†E¨®–ÌN�±m‹O^‰h$̲…ó6f<ç]u)Ÿ¾ó ÏÝwCÆŒeõâETWVàOHä£×^%“Óµ;¾ò"H‹Åsâø³Î¦c—<æÌ˜N è'§[/2;eóî‹ÏqËÀA,œõ=ÏÜs=û dÉÜÙL:é4Ž>ã4ø×m®XNÇ®=X6wg_yu4õµ‘ÖUq~$6 zU…ó¨ útK„¨õ»«D³yÿݹ½;Ï«9É¿O}! f²´Ð û�Ã�¦ArƒðBzf7=ö ³¿›ÂË�>Èö-[è7dÛŠ7òØÛïÓ)=‘Ôöyçùyà\ºŽaäõÌgîSY»¶�Ò­[ظj9ƒF�!%-�Ýÿ iíÒ©,omÃ6(ŠJ$lS]¶•ö}“‹=ƶ%n�›m¥UüëÎ穪­§¨d{ ì7ÂÉOv±uÛvÊëmr»åÇç“[nSŽ:��Û§1ÿÇÙ”lÜÀóŸ}C»d�ôÌ<Þþ÷Sôê×›6m9éÜ 9hÔ@¶o¯dõâ¹`Yx¼^nxø‚:l+)£²lCÇÀ«O=ÉÒ9 ؾu =úôcá¬YH)ÉËïIÏ^�Ù¾e Ó>Ÿšª*æþð§^ø2;å0oÆ÷$$&’Ñ®ÉmÚòÅûo3jü ײuó&fLù’Qà÷fÞ¶¾Æé| àm»¼íz²|ÍL²»¤#Ãû¦NÂ’ôï‘Äç_̧ª²¯ËW©ijwŠ|öÞûÌúa[‹6pÕ½¢¨:ã&M¢¾.L8fúWŸsÔi'3ùÃ÷8ø¸ã9㢋xç¥ÿðòc!AMU%õµu\L8ê(Âõ6­_ÇG¯½Â³D¿¡#Èì˜Å‰;•o¾šÌ¶’bꪫy則uàDκôÞyé%>|åEÆL<ˆÊ²ídduäÖîåñûîcòGï3î°ÃPUÕa¶†þö uOÅ'·±bõb2Ú�¥Ã ¯” ¸T*Êj)ªNdp·Äb;6'‡±oHrʉG"m‹÷ÿóÝ úâñù1MƒzÛŽë Ü�'︅ҭÅwú)lܰ_B4��àð)jþ÷ùÿb”J8\G¨º‚Œ6ÀÜ»ôœxv6’‡ž}—¥«6 „`õÚÍXáhœ×óÛº/)%Š®³fݦx~rÓ|òÎP¯×‹×¯8œt�Ó4©³tlltÝ…”΢=RJJMU(ßGÚ @8CÕ\±1#FBP'§k7>}û-’RÓ8ö¬³˜þÕר¶ÍøÃgæÔ™ Í­3`äþøAlÓDÓ]x¼^êkëyîþ{øð•çÑ]:‘H¡€ËåÂë÷ã×A �`�í[¶±­¸„�8¡ FO<­[GBR“’è§kA_¢á0±˜ÃìnUÜ{4$Ïù")\]ÌÀü6 ‰¿ŒT£³T£Báú*¢îdul�5hxV«ÆŠEó™õíd–¬Yϼ™?�‘™Iß¡ý©(ÝÎ'¯½Æ¶Í[xûùçÉíÖ�ä6éÔÕÖ�m²láÝz÷fúW_²àÇÙ,Ÿ?—›y„acÆ�ÆHËh‹¦ëÌùþT–Í›M]M Šªb™&^¯›o?ù˜h8ÂmO=I^Ïž1ÃÉi¶,êkkpf Áý”ôT““™5m. æLŸR’Ù)‡p(ìÈ_JI4Á–­ªEûR‚ÛuÅsÙP\àü0þ*«bÅ!à§•µ¤w@0èÆ´v• ÑH˜¯Þ—{ÿuþ„ ç_wªî㺧dó&î¿éV†ì?–“/¸”XÄ`Ô�ð'¤rΕױjÙR^{æ>æXÚwÊÅí°ÿÄCÐt·£RÖŠ?âÂLUUõhX|>'­çW#q¹uJ¶”qã½/‰�ƒ°-ÛÊ).)EÛÝâ@¿ª¢`E",ß°�œ®ùŽs¶Ó>¶máöøè?l³¦Ná­ãƒÿ­p擵z¶®[FUÈ »£Œ¿ñȉ¬Ü(É=¢oÃÖ~�F ŒÍ ýöÃ4,\.�XÌ&\¥g¿� ˆ3q¹5¢ Û¶8ïÚë‰FLÒÚeÑ{ÐlËÆåQ‰FllËæÂo!rV�úK €þÀI‘ƒºêj<|ž½"ãI šÇÍ/~Èü¥kPÑHVÚ²­‚â-eôî�÷›¢RRJ\ºNeE5[*ÂŒïÚ…¸„#D<‹Àåöò�›ïd£�‹E-4MçšûÁŒèn�hÄDÕuνÆiõ5�=T–Gi“žÎ9—ÿ“h}„©_|ÁG�eBrZWß÷‘�EUyŒ#O? U@}}Œ„¤T.¾é6Œ˜�Ëå¬ LjF N:ïbÂõÃ:·{Wßû ±h MU1MËhY}r_âg�²i˜¤¤øiÓe ßÏ}�^:`‡$j ³m‰ÔxíÍMlØ\Ï×õCFœáÒλ+ˆÚŒèÛ†O^[ÊÖ’rRS’ˆÅÌx²àê{%)5…²›Aû�%»Kw:ääpËÿfóúµtêÚÃ0ˆEM&s2yù}¨Ø¾�ÃO9 Ã00Mɧž…eÛ´ë�Åõ=AEYÇžu!±X”Úª({Y9]ðdåtæÊ»Ä–‚ý&F§¼îl*\ËÁÇžHÇÜ<êªc\xÃmx½>ʪ-ŒM×^}½E�YJÙ8²m=iÅÎ $/¹–¯¢}FÞ€ŽUûýÕ³þh˜OÞ¶­š-áT(èE¬•;!%:;¾Vq,b:kB+ Ñp´Q$T�ï/Õ9S+–Ù´-5qRm¡ºŸ7Æ \‰ÖöûÇCU¡²¢ ¯* üDeÊšmÛx>>úb:�¿ðŠ"ÉcâN—a°f}1cj�Ó†uÖ®ß ¾6dvÈ!ÖÌ#ßq_I]M¸Q¼£A¨$jFÿ6ZhÃBÄS`¥³”å“'³vÅR„"9a"q õµŽ.{]u4žÛ,ˆ„¢�z¦)1MEQvxOÂ;ý‹F1çýŠÅl~kxÿ—b�Fâ£5¹ƒYüî�æÏ°am¨­1yâ­�ì?0�I:bÕ·0ºP€˜MNÇD¼æF ×ÒnÔ ¢Q)�}sºvò,Œ˜…Ç ·»vîØ¹ �»uÁˆáäTÇœŽªgß~(*ñÔa#£M»öFÔ [ᄄ1gþÒˆÅBqDÑmˆÅL²»$aÄb˜¦Iv^7òò»aÆh”œë�ÓÛ¶‰ÅL’’IJMň»>/)Ñ]:¾€â$¼×š¿;•þÿ+H(¢®�Uk7Rн�“’´;qØÿ1H)iÍ�5(I=hŸÙ@�Ùu_UU $h躣í^WkbÛVcj`sM_Ø‘]îr¹�¶Ä´LÜGÒuws~Ò¶Y³ŸÛ’N;ÿ <�? ¤#pQ]±�” ¡ëÈPñ ¨”Ýí¢¬¬’»y�šºP\Ñ-Î݉ zl(ÞWbû�•ÕTVn&­CÁõÍ¡Ø� #ü!%„ê!iÚw·m8.á©éFÌä„sÿN$Ŷl|A/¡zËlrŽœÁ¤Ódu— USvеØuÐÛòßt¿ý³F •ôèÕ‹o¶§b[ ©© Ø-‰'(LIyU Âóï\B‡¶>úõmƒUgì�^"˶Q|ôhfÅ‚¹Œ;h†X4i´u¶%‰ÆCl‘p;$›�²œ‡ª 7Ê¥5ŒìMÃh<_¨.ŒŒkt7z®Rª‹Ä½Y�1ãÇ: %ÞQ60mM™¦ æ®SÚUSÙº¹ˆ)½‹×çgâ±'áñ°­]×�þ«CJ�ÛeÙ¸�ò ƒ¡½R�T¨?À4Ì¥6ŒÄÿkP WÖÒ1(~ŸFmõNš”(ªJmMß}þ-Û‹‹HMoÇÈÅL ׿n®X×Û¶q{u¾ýø}‚‰Iô>‚%?Í&»KW¼þ £S 4é <^Ñh �`Ùü¹“ÈÌÎÁ0ÌÆó4¯_ã<[Cg×ÚÆ÷ $P]º•Î2Ñš_z\ü9h.�ûžz‡YóWƧòv50ж`Eb�âM{BÃ`åÚ:<Ui¦y±Ã~NÝ~ú~*k–.DÓuŒGn÷î„CцÊïÒ†¥m£»4JŠ62{ê·vâI,™»„`0‘vÙ9TW„šE#�Á†îq侤m³­x3•åÛÉ+è ¶�ÝlÁ‹]Ô[8ÿ‰Ÿr5›·ÍÊ !³€µ…Õ 7�¶Ñ�ê&m¶VD@IY”ž\AUUEß5A]Æ]¡‚.^¶®[D4º# T( >ŸЃ¿á Éï)m|$&{ÑT­±\�ÏK0ч¢©�7´ñSQHHö’ÒÆ‡Çëmª/ŽG«j* P4—Ë… B(hš—©kÞy‹]¾7]h.�„d�P]-‘pS>|—YßNÆëW�ÆÐŠf�ØRůֳiíRt·NN–bö>«Ù„5 ¡ú4GÅë¿ôhEAFb,ß 9Ýò�2Râöh¬\4Ÿ§î¸�‹—òù;oóøí7P_W‹¦©¸Ün|ªÚ$[+¥Äãõ�Tùþ«OY2÷GŒhŸ¼ñ*e[q¹5<^¿§1o[Éæ ëÐT—Gç³·^cáìÑÝNÚŸÇëÆë÷4–¯UUÑuÝ)§ÙÜVüzÄíµåe´o›Ú¬ÏúyH n·‹Ï¾šÉ3¯|°Kß#„ó÷ú¢mÔÕ†P÷’�ß�ºU[[GqEˆœn=1Zª48L‘pˆç铿fþ¬Ù|?5•å;,m§»t,#Æ·ßÆ¥'Ï‚YÓñÜ¡‹Åxä¦kY·b)Á�’¢"n¿ô-HJ.•’ÍÕ”Ô§‘—ß�XÔnYLG…ÚªJr{ôà¡×^âá×ÞdåÂyÌœò^¿ÆŠ…ó˜úùç„Cu¸Ün!ðx\Ì™>•‹W“˜’Цê“9ì¤ÓHIkG$b°pöLfLžŒe[¸=:³¾ýŠ;þy³§M¦ª¢œÃO9ƒ¾C†cš_ÀËâ¹³™5m*ªªàö¸Õ×R_[Ké¶-̘2ËŒár»Z óo€³…NeyáêRºwé†ñ‹…kÅq¦V¯ÛD—N™ý¾]ž‡WËÛ²½œ-Ûú̽««æÖÙ°¡˜:ÛMvçÎÄb-G…P0b4MãÊ;ïã¥7þC—žÝxñ¡{ðøJ·•ðÍ'Ÿ°qí*<^‡Dzؾµ˜i_N%fÄ&%a˜u<}†ŽÂ0`û–b¾ýôS6o(ÄðPSYÁ×^ÁË�ÝÏú5E È!Ç�‚mÚø‚nJ·óÝ_P]UA èÁ´,ª++ˆF£Ìž6•í%›ñúÜÿ•6ü‹Â×g™ÁŽy]™ü‰À¬‹¢*Ú®ÉÈêB&ÕõNÈØŽë¬¾þe1c‡¦qü¤lÌZÓY™x(#f‘• ͽ‰ÂÕ+ÈÊሆ{Ü,™7‡×ž~œŠmÛ3ñ0’)ÙXÄs÷ßIJJ ëV,çÕ'á’›naõÒ¼öÔc,™3›áã$-£m#Ñ@Ú¯=ý(kW,%5½ /?ò ÉIté^€¢zY:6r:3tD?Ö.[ÄG¯¿ÌÐýÇÒ¯_WæÍü�õ«Wâú1b6B¸t=N°q¶´AÓ�åĤđrk›�Äâ‰ÇLdÈè1„ë[v�CÂGÔ­dý¦RöÚdË¡¯}vJ)Á¥2ouw¿PH›Ä"†öJ攃:püÄ,ì_á‘쓺h‚å…ÕèɽIià(ì.»AU±-‹ºjƒÊò2<>?iíÚ³nÅj¾þàmjª*™=õN»èŸ¤µkÏ+O<ÌÂÙ3éÜ­' fÎààc�#ªçË÷Þâ¤óΣdÃz¾~ÿm"áz–-˜Ãñ?‡ù?Î`õ²ÅLþèR3Ú2cÊ×´i›EN×μþÌS¬X¸Ë²˜?cg]v9[Š‹xíÉGIoÛŽUK1oæ÷üí’+q{|X­¬î½CÜû¬(ݱ:Ú·MÃ4Ì_Õ0m[rÖ 9ü |óã"þuÇs”–WNtFSb†IEe ë6m¥{· Ê^µ~EaMá&|)¼„ëvOHkˆ0Ö××Q³0 ƒö;©7ùæÃ÷(*\Ë7¿ÏQ§�ÉÐÑ£øé‡¼ýÂÓ$$§®¯#áñx™úÅ'´ïØ‘¶íÛóù[¯Qºµ˜o?~Ÿ“/ü†a°bÁ<6m(¤`à`RÓÚ0cÊ·\zs?Ìü‘�_Û¶™öÙ‡wÖ¹té™ÏÓ�?Ò¦²¼œúÚjοö&ºôÌ'‰ýâyü}�_t&!шEçnݨ�X¾¶áVwðfRœjêLʪ–s¼ÈºˆÍEw-áÇ9¥hA»AÏX8Ií½äµ�1ÿ‡é¨šÓ$ Ã$'/—³/»‚Ôô ,ÓÄçƒ/ß{“ĤdyþiîxößÌžö Ë,"»KGιòj:ææaÎ**¶mã ¸X0s&Ó¿úŒ›†Gž|‚.ù¼ùÌ“(šÀÔè?l$+Í'&aÕ’…ô<œe æ³aþÌ 9 _ÀIƒª«®à½—žãõgç”qÃùâ�7Y2g6§8Š®»‚X4Jׂ~œõå¬[¾œ¯Þ{‡P] ~üq—ÕZZ·fQ»aåµäwK‚è$¥$Lý©!µŸþPÊ¢uÕàÕ—3ü#à.ÀÔ9UäôAÀ¯aÙ-ÏëÙ6x<Í™ÍY‡ÈÉãöãàãNdÐ~£ÈÈÌäì˯àð“ÿÆÌo'3çû¯Y0ó¾ýìcn}âiνúJ‚I‰Ø¶�iÄX³t1µU•äèÍ9W]ÍØIGòá«/±jñbŽ<í4º÷îÇ9W^E~¿¾,›?—PmÓ¿šÂ7¿Çå·ßÍ-O>ÉšåKyã™§Á¶™7ã{&{¾ú*?Mý–¿�‚/ !e+¹qoàDø`ݪuøƒÄ”Ä_½FµàritîÒ‘ÑCûìplÏ®ùúíûxÿ…[øûI�ìíPX–ÍŒù«èÔ­º&v»NrƒBWUE9·]zã{õ¦|{)—Þr'¦)9öo§súÅ—¡é.Þ{ùyª+Kyöž;:f,w<ù0GŒÀ4-tM¥pårŠ7’”êåÄóÎáÔ‹.%T_Ç+O<°Qƒ(4˜?’N:†­›·°qÍ ª++¸ÿ_W2ö�C¹ïßOÓ¹{ž¼óf�6KæÎ&-#ƒŸŠ6é¼ýÂ3èºòG‘®ñ‹�²i˜$%Ië2€Å+«ASv­«€úˆIu}“`¿”ÿ«¬ÚàºG–±¥¤áVš ºlÈïäakábêjc¨šêä§§LJÁ2M„¢`™P¼a=¹= ¨ŒY¸Ü^ÒÒÛ²¥h#)É’ÓÚ:ä«f�TÝÉG«*ÝNeÌYC¹¦¢ËÓ„®ù½)ݺ•õk6S^º�ý™Ä–¢"6n¢¶º‚œn=‰E�uµ†u+×ðûÉJ÷"c6ûpQ¨Ï(AÑêkb,XYÓžòºÆ Iû}Nº‡º¨ªB¤&†2¹=z±24ДQ�Ý9— ¯¼‚ƒ�>–e ç�´Y6>�Ür3«Í')%#£pÕJºå÷!5#•`0@—îùÎ X\nn·Îì©SyìÖ[Ù\¸–@B"‘h]w¡ª.�¡9ûê.«—.¦`À@Ú´KÁëuÓoÈ0Ö¯Y�eÛdfg“Ý¥3 I‰d´oO}mµ3®’­í}¯ï'J6®£mŠÜ{'ðbK‰4-V­Ù@UM}cÿÓ¥S&£‡÷åÈÃFsïõg3nxbáè¯^C¹i�ä:жÖй{W,“ݪ©X¿?Èñ§ŸÁyW^A}]%›Ö‰ÔóÜòÅ{oáóûPã*ަi2päþ˜–$¯Go<^–iâr»ñú¼Tl/ç©;ïâë÷ßÅ -GGCS5gq!U‰g-$²iýTE¥ï°¡Dc6ƒGí�mK*+ªHLJ¡G¿>xÝ.:wËLjŜ÷ñî³±OnK‰Ë%è5x ³WFÁ4Pwf ¨«2¨ Y; ª"˜:¿’ëZŠ¢)¨q E!D,òó’5«Ø¸¡ØY‘IJŒX< #i;ìg·ËB (*ª¦cZ&¦t–WÜáâ…P]”~Æ1tì\xÌá\~Æ™LûâSRÚ¦£é Yô€¢ªÌ˜2E(ìèDc¦=™ÄäTºôèI$l:! ¾@�ƒ�;™sÏ;›ŒöYtÌÍåœ3Ncظ ,˜5UuáÉidåäÑ­w_RÓÛµ¦Dµ‰Šß.á‡Ù éÜ)Íÿ{Ï'K„¦PXTÇ¢5N(϶%™énzuIrfÐK(¥D¸UŠ6VQ¥v k~WŒèîÏ/„£GŸœšÆ¸Ãᔋ.gÞôé®\ÉË�>H÷ü\tù…¤¦e`Ä¢¤e´eÓÆBd\.yãº5HìÆi§êÊJž½÷.&{g^ú<§³³,›˜Å¥«hŒ˜�eZ´ÍÌbÝò嘨¬Z²˜ö:€”D#¢‘(FL�F[%gBT4j²qÕbºç´ÿMÞšP6m%3É\�;µGZ6¡ªZ\ºŽÏ³wó§iJ£xËvª �¼ž}ˆE÷ì|ØÒBÓ4ú�ÍYÿ��o?þ€©Ÿ~ĺK¹æÆ«é7l±h”„”dLÓ¤¨p‰ª dózBuõ(šJ4Åçõð髯°aÝZ®¹ñº÷éM, �"°qãð}"á0i„ÃõoØHŠKaÅâ…ŽrdB€hÄYOÁ”޲£mïa„ü;â—Í)ã8´fLÒ­ ŸYoµ¡r{É) H£™«€måQbFó³éxÛ–¨Šà­)[èÿŸÕœb®ã I�†MZF�ÎI›Y½d)=òs“Û…p–­“R¢ê�Ñ>“’Mëñë UÑ0ÕU¤·ÍĶ…“êÔ@oUuÒLøÛ%—1lÿý©©¬¤tëVú6˜†AZû,ÚfeñíÇï3dÌX:æd‘Ñ>“¯?x—A£Æ�˜’B¸>ꬥ,�t'Û²©2-\n7ºî¢Â²ÏGÓé6 £é&´Š/ì Š*Ñ«–°¹¸ŽQ“r�Üï ®¨¦²ÖBS¦%é×-‘”iÚl.®¦°lM5©ÙCHIM"Þ½b�”àöxð”–E$éÖ»7ÖÒkÐæÎœÉãÒY¢TÕ\ 7�Ïߟ»®¼œôÌŽT–WLHBJðƒøý údòG°jñŒX EÑhס#�@�‡oº�ó®¹�¤Ô,ÓbÌ¡3}òçÍÆµkX¹d1I))Ø6Q4�ܼn|ýég<ñÈãÌ�9ƒ„Äd,úÎWï½A÷Þ}HH  i:í:´çð“Oç…ïç§X0{Gžv&.·�Ï�ËåÆ�ÏG ˜à8Ž{wkö¿Ü(+ ѨA‡œŽèm X¶n!#Û&!cÎ~íeN¿är|~�¼ž½xÿå8ûÊ«P5¥1�@"‰E£HÛFUUbÑ(¦Ñ Ãf4æE­ùš{„ÄFàÑ ª7Î"3(è’{ð÷E€ióÃâòÆ�Höë“‚æÕ1k Ôß+v¾„`›ÌY¥Ûˆ‘¸]*‘P EìÊ=PA8dÒwðr» QP�‹o¼)%#ÆM`Îôix~ö›xH�Ç›À�=ÅÜ™ÓIoŸÉ„#�!Pu?\w3iíÚsÎÕùüøÝ7ddf2vÒÑè.šîáŠ;ïgù¢…ÍÍ™ÿ¼UÕp{ƒÜðð“,˜5˲9õ¢ËðÐt/WÜùªê#29÷ê›ð‚„êÍFQ“æ�-䈶¢ RJ\.…Í7TbôÌËÆˆþz²‘”UU©�DY½a3àðl¡�›Ý®q¿ßò´V­ÙDçžýp»Ñ�Ý¢’—˲ðùƒ\ð¯[HIK§ªN2ñØÓ(Û¾…œ¼n\vë=o*bÿINjƈElN8ç"ú ÎÖ’ö?ô(bÑ‘˜à´‹/Gw¹ÉÈlÇeÁÊKK¹ê�#1c&••1Ž;ó\r»õÄH¡kïÎdçõ$19ñÜ‹0b?6®+äòIGѾc'¡(—Þ|‰©©TU[ìèQÑÆnXäMm˜}NûÅF±ŸG¡}—Þ,X9�‘#¡qá$)SWï²vòxzuösôØvŒÖ–¼¤!ã:¬LI·Î>ÿz µµV|^Yâ÷'УÏÜuµ}‡ç¸3Ïå®+¯$)9• ®¹ —Ç�aXhº‹‚þðú‚T——²zé"\nŸ¾õŸ¿ýûM˜Èá'ŸŽ-�*A,*Éï?˜?†9¹D¢Ð£o:úx²:u%µëuÝCÏ~ð˜1èÖ«m;d³!«c>¯×™SiÅÏÂF%(Ê(Z·�Ì ?mRÝ¿«§*%(º ¶Ú`þr'tm˜6>·  G"ü‘N²EXu16•{8¨k—x»Ù] ½â@b )©˜†RNo—Ù(ç:lÜxÀ!„Ù¶M$Åã²ÿ¡‡!-°¤DZ6–eÑ¡sŒ8qhÿCÛ™¢²-›H8FZ»ŒëØ‘XÔŒw°’h(Ц»>î$`Æ,"¡þ`�„äd̘3 ÎêÔ˲w«§ír»Ñ40 ‰Ùª¶+¤DÓ hÝ*2Óø‚DêÃ{5€QU…PM-[·UNÄ2-5�¶iÉ`Ùü–›ßÀ‰ˆ…ìÙTÆÀ‘}ø¹ˆ¯“«¬Ò!'Ó41c¾@€œ¤±¹= È+(À¶$¶t¢�ÑhŒ}ûÓ£o¤Ý´½mV6H›h8F÷>ýŠ#2eÛ8ÕŠÂбã±m‰eZø;'bFcD#1ºô¡[¯>X„CŽŒg‡Ü.X¦I,f‘Ò& ¡8\ª–à¬{ `[Mj�û ¿Ê(`C�ƒ™÷ÂÓõQ4UE6„?LIñ6GU+%¨3%õ'¬ëÖ®<3�“�È0l¤Õ$ÈAÌ&?' wt›Ö¯§k×\‘ií;pæåWáöø±L EQ˜tò Úo4¾@)m2œ¹d_€³.¿—ÇKM•É€£)0Ð1î@†ŒÞŸ¶YÙHéÌU7„Ç#“®½úqÅ]âòz ÕšäöèÅ•÷<„ÇãÇ4œŽÉ4 |ÁdþvéU¸=^êêLN:墨NeµÉÈ ‘¶MägÂ7­�¡â‹­fÞÂUäwIEõhX5±_M6ù¥pä,5­+cͦúÆí¹™~ò;'‚ñÇñl)Q]k ËëéØ9—hÔüÙQ·e9)$ õ4 GuK‘p¤1w^Q”x§b8¾qñ D£˜mÛ„â 77Lÿ8‚AQbQGE̲¬FÏÖ4-LÃlš^RlÛÆŠF›Tïâeïªtg£h*ëW¯dSáZºô, mV,£Uå®9§ŠV¯dHn&èNF€P= KÑT¶—V±yKiãö¶i)¤§§ÆM{_O‰D×]m*¦´Î$§K®“6ú �F"�êq¦é ÂáP|G[Ç Õ…œÈ 4¶eÓh2†áúøqB4 MY¶�UEAšÔ¥l|Wʃ¸Öµh¦ÖH mX:šñU奬X¼€Ô´tòò{áÐ…öÍ|ͯò»1{›¼ž=) §²yk ¥ƥÙÀ6œ…Ó�›Î‡� æŒI™Žw¢Â1›u…õ€ Vg MÙ¬\° ‹`?mƒU¬\²ÝãÐê…ªâ $4êm[–…eÙdåä‘”’F4mrÖ…ÀHh\[ÓÝ“’±m›Ôôv´ÍêD,k4È��UÑðúñÎFU|¾à.ãHE|� Š¢"¥�/Äír;«ï¸=x|þ]ó·[± ¤N~rõ –¯.¡K^âï~ß$€ —VQ]o5æË*H$­�ÛÜû¹µ½ª‹¦°|M5ÁÌž¤¦ø0w£wÝü UÓ½<øLj7†�”�¼Žw+AÑ4‰>܇Ùt�¦i¼“|øƒ^„ª4þîr»ðø¼�ûº¼Ü^w£!öx=è.½±j;k·Ô1{\.�ù3¿çów^çÑ›¯Á¶�¦õ�qÐ�2TW¦ls!½ºucïR�t;•-¥U”UT7†”ÓÓ’H ú áo¨,Â¥³¶p¦–@z»tgÀø ¼o�ÏK ÁiÇ®¸°’¦ë||ø^„¢Æ½q•@¢�@‚¯ßÛØ¶š·ù`’�„$gŸ†ëTT·ß‹¢ªH)ÐtoÀÿ]A×]¸½ž&JT¼¼†ï-µa]w‘˜ìbÅâùÌž6…¯¿’%sÄç×÷‘÷WyÊB àMj€`V_.™JNn:Ð^Ü}yo<š‚;ÙM}½É3ïnŠ¿pßÎ/ã’ʉ>Ý雕íä9kôËÑ™²xæ ‡7¾¬ÍEÆ>£áH‹sRÍÓŽ¤”ñŽÎ©wóãw†Ä Ý5ë¬ý¹ËH °Í¦í–e5Žàæ½[½äŸƒÄFÁ¯…Ùºf1µa�YøÖæo:c<Ô­�1cQEã6EÀCÓAuVÏiiô÷€¢ì˜ÉüÕ1rG Þ­VðǨ‚p] ó~˜Çö’2;åÐ{ÐP¤ ¶´Ñ]*ÛJŠ)ÙPH÷>ýñx½F”¹?Ì"˜˜BN×®X¦³Ú�ª*Ô×V3gú|J·”Ð!§3ù† ¥�ÛëbÁ�3)ß¶•±‡� ?Lþ‚h8̘CŽ@US?ý�„”6 9‚H(.ò_MªÁ«†¸‘‰/Ÿ:û»hºÎIçžC^Ïî¼ö䘱ºË�ͯ_'øRârk,_º ·UGn玘±ØÞ �pë‹¶ŽCa]²3ñyÜ„#Ñß¾ ›"X´ºˆö¹]q»áZågô„¬_½œ• "T��#÷#5=�šŠ –/œGÙ¶ídwÉ£GŸ~¨šJ$bÞ?QUQI—žÝéÔµ'–iÅs¹5JŠ Y¹hÒ¶ñ'$Ðwè¼>¥[Š™5õFŒŸ@zÛ Ö®\ÅìißpÐQ'�š–ÂòE Y¿rã?:~¿d“amÖ†Œš®³vÅR¶—l¦Ï�aŒ?ŽëÎþ¡ºº}* ü«‹’ÒFw)tê9�YËëÁ²v7&zu\Š‚]gÒ'/‘vm\4\çª�u”l ;9Î-�Œ-I�.AÊ7-£¶&Šª5xá»6œÝ-…¸»•>v7òù%Çîi¿Æ� óW«Aþ…°¥Š_©aÙ’…´Iõ�œäBþ^žªpøRo 3{™c”m[’ÔÐ#ù�a}ÇÑ�+][bY±Jׂ‚]֞ݶm£»uV/[ÂkO>Êœ¦r×ñÓôïp{�QºÏ§ñÔ�7róE§¶º—Gãý—žçìCÇóÙ›ÿÁíÑâóÏ�Ggõ²E¼ôØýÌ›ù=·^z> gMÇåvár ŠÖ­æ?O<ˆm™ènÁÏ<Æ Ü…*$RÚ¼õÂ3”lZ�Û#°- Ýåv¼îD )^<^�D‰)^Ü^7–eQT¸–òíÛ(Û¶�÷^z‰‰Çœ@RjB\ì§õ½ÇŽê.X³l)muRÒR‹½‚€�Å[wØÔ©Cèêo–�T" ‹JéÜ#G'f÷õ”R¢¨ ‘POÝuŸ½ýÏßwÝp.—ÂÒùóxõ©G™óý7ÜxÁßX:6 ‰*¯?ý/ƒxìÍ÷i—êãÒ³Îgþ�Ó>~,‘°¤Ï�¡|ðŸ—(Þ´ ·Ç�¦éø“(Ù´.¾¦/ 5†P�…ËãfÕâ”lZOéÖ­Ô×Ô0æàCY¶p>…+WrÐÑÇÒ­ /‡Ÿr&É3wߊiFŒ²­•xýÁVa�8œµ`Í¢9Œí™ª£œ¨îÅ|²ª*uaÖ:éPv|[^nØò7E&l)q»\l*ÙÆöZ‹ ½ú;k€ïáý‰Fi.—Ýv/©ém¨*߯�œÏOßÏ`Èþû3xô~d¤zùûQDZrñbúÂŒ)_sñ 70iâxŽŸt ~œN�Þ=‰„"!›Š²J®¾ó~Ž<ã*+BH© ÇhŸ�EN·î¬\²˜±‡@ñ†�ô4”%óg1`ø@Ö­XÁG…"œ4­úÚ¦}ñŠ*X:w.Gì‡?1‘é_~NV§NtìI =Ž‘È”÷ßgÞŒè?|k–­ c^WÌØ¾‘QþÕ¦]FÔ$;7—ˆ»#…ŵΪQ²�´åü³l‰æQéÛ=©q»-aîŠ D ¡wÇ Ûø½tHv–rÔtøÃ5ÎZñ‡@SÁ¬XÁ¦’*zwOù]=Õ?ÜÀ‹ï²vu%3–VÄI§ÎËÓ;/—WÃli)Òߺ`yQˆÄÌ’’}˜æÏ%iÛx|^JŠŠxꑧؼaq .]°rÉBæü0•cÎø;.�§qî·`@>mÚ·‹+y5+KJ<>/Å6òÔ#OR²i#c>¼Q°§]Ç’RÛ°aÕÖ¯XJFfG2Úe²q]!kV,#��HFf¢Q�WeÁ�Óyð_WQYº•S>ã¶K.`êel\³œ§ï¾•X4‰rÐ1'pÊy—�™ÝUÓw û«¡aµ¥ÊŠÊ7¯§g×lø d,US© E(ÙV†';ù}:¶OÿísøR¢¸tÖnÂÔ´ËÊjZÖs�‡9 `mÚ¶Çåñâñgå?�×ÅÆµkyê�G©­©eð¨1¸½nú Ægo½Á ÿþBÀ Qû ;ar#jP[UÉÌiÓxãÙ—©©ªFw¹#<]zP¼~-eÛÊ©©®fÄøƒX½t)Û·UPSYA^~¢Ðu�p}-�Ýv=S>|�Úêr¼ñ*>xùyBõUüûá{™?cn�J¸.J^AνæFz ‚7�àdnì£6üëýíx®Y0¨“7h ‹V†ZŽXHÀ”Œ�JÀ£bÆ™Ös–TS]Fma)Ç8+ŒAù~V/ø‘˜ÁoŸóhÅŸ  �€ZGñŠ…¸]]²ýÈßAIKBÌ]UÅ™·/føÑßñüÛ�A£eãÒㆧ¡$¹Ðƒú6Ÿ,"1Ö+ô:â—÷�Â!?V”–QQQ�Ë­SYVFéÖJ¾ñ:Æ: —[§|Û6*ËJã™c§” Ër¤f¥mQ^ZFeY��Ò­%ν1-‚ ºö*`Á�3Y0k&}"¿_?ÿ4‡¥óæQ0`º¤e!0M“~Æqã]·ò÷˯ƴLοözîxöGÂvõ t·†ªiätíAÏ~É0ÝõßY‰çÏ)m<�勿TÂôÈ퀎ö/.Ë1ð%[JY·¡Äa"[6é©I´OOÁ6ã2o{[W]eÉÊõ¤fåêX¿`` `[Ò2QÉc·ÞH÷Þ}é5páº(•¥eTWÖàñz)/ÛŽ$§¶!TbÙÂÅk[Z€ÃضlÉ gŸÏAGź•K¸åâ³�Uu# Q[SÍ�S¦àúwèa”oßÎôÉ_‘‘™Efv‡xöŽSï„äθäJî~þÚfe3pÔ(yò1ö?äfLùUiK2³sèÞ«/ý†'-£-–¹ïÔ¿ö*Þ +è?”¥lÌpEݱ(E`HútI$»�§qûÚÍõ¬)ÚÑ»n@CZUß. D¶¯¤ºª¦QE«ÿÄ¥5ÙÆêåËhß6¢«Q¯vŸBª ;Ó@iµIU�Õ|±¥äÃ)[xã?kùiQ9u!ƒßMt»¡Jñùäʲ%Õzôî‹ýež¢CVÓ²ÿHn¹å_L<úÞ|îIÖ¯.$ ±bÑBÞ{ùe¶•lbæ7_cÆb¨ZSŠ8ïXb²3Ï«(:ÃÆ�â–Û®gÂQGñæ3O:ó—Š3`îÙ·kV¬dýÚuôìÓ�.={±zùbŠ7®§`À lsÇÊ“p6)$¥¤bY –åä%F,ΓÄb1¢Ñ(ÑH´õÝnG§–ΟKçv‰ø“1-k¯LgÃ’»‰çŸq8§=žý‡÷á€ý�””€õß7E0M6”TÐ1¯JüÙþØå¾ ›WžxŒêŠrξê� ª¦3jÂþÜ|ûõŒ9ø¾|÷-Ö®XÁ´Ï?ã²Ûîæ�Gï'«S'ÞûÏK5A/šæ¢ß°�L˜4‘Ën½ƒÊÒ26®]ƒÛ«�Xäv뎦{˜6y ²sÈíÑ—ÛÃô/?#¯g>>¿Ër²lÛÆëñâö G%¾`_ �°”¸=^¬†$ì8q8�‰D±Ì_·z×Ïá×ç)O�ŠØtÍïÎ畉l.ª¦SnVØhœlH‘JIó0¨WËÖ×£©‚òj“Ù +دñ!À°Èê�@f`=Ö®§ÿà>Äj[‰ ÿ+hÈós…Ö°låõmqå·}ýˆeœ^�‘â›!Ó‚W>/á•ÏKèÖÁËg�#7Á…±·\i[J·ÊŠ5T‰\:f·'¶sŠÞn®åÿØ;ë8+Êï�¿§îÜØî`wÙ–îTÅÀîî»°;¾vw'¶¨` �ô ,]ËöÞœz~ÌÝ%¾_~òñuÕ{w晹sgžóœs>çsTMeÉ‚yX¦IQ»b*fÍ"!)‰]˹ë™W�e‡ÊyTÎ�ÉCöw½PÇÕË6�£èðîsÏQÖ©+©Y475STVBÅÌddg¡ÄE=¢Ay÷¾¬Y~3yEÅ–u$%3‹%óç‘_Ô–N=º�ÚH²ä>¶†A8tåx-ƒPSà–HÆÂaWs;ŽÝÏòWߊEVTÌâ¼Ëù‡öÝZ[›¼œtn¹îL0m"Á01ÃD•]!šú;@UBu Ô»vÁ4¶âw®X”6\#Sú�Ën¹“KªÈÈÎu£;B"¯¨ 3g�šžŽªiF”…sç‘”–Bc]]JJ˜ûëI)^r xÿ¥ç8uø¥Øöƪ!¡`sœí. …\éYI"‰`Æb¿)ŸÚ1øgFW” #39¥=sÿJÛòlˆl¾�+Ö Ó¿s¯|ººõó së¹0æN|›–�H¸Š,Z@§[‘ĂٳèÝ¿û?ûf»ñ? �Œ®X+gQ½Á {Y ˜;VZ3=É_ ÿþoªâ²çO<8Ÿ¶… 8ñžÙ; Rü_3IÎëˆ? ÓPkÿe‰Ž”Y½¼Š ß~ƒ7 vÃzN~o€Ì\�„DË„îý÷ ·°!�mAN~þ@"ŽãåÉ?ŒÃç`š1¾xïS¨­®æ´á—#I*`c[é™Y 2”ì6…xt•äÔ zÜ‹‚âR““ 6Ç�$W[>;¯ ÈÆĔtÚwé È(ŠFy·žøýI[¼þ»áBºGcõʵ(F];—" “muÁ,ËÁ¨oF’@QešwÛ¾�ª{˜»`1ŽžD›¢bŒ?�£ÜޝæaõòÅTü:�œ6…|ÿÙhš›š8ùüó©«©eÂ÷ßá hjhà¸s.¤°´ŒCŽ?™¯>x›©?ÿ€?)™#O9•É?ý̯~¡c÷ž|óỀ`ýÚµœ|á¥dää »íƒ% ºõéOMõ: Š‹±,èÑo K.¤°¤¦¹Q­Ñ£ëtèүϋcCiÇN¤¤g`8�_XD$œö§]ܶ$!„ذaû ÌË|Œ^Ð�X$ú—ônÇvHNóòÒ/£Î½�»¯íŒÝl³énŽ#P|*s*ê8pøDÖÖ¸¹­’¿‡ú Õ›É-,dŒXáXhš—P¨‘¦º dä´!�”H$Ûä;JHÂÆv,Ńˆ÷ Ž�$«›�—ÛŒ¹ÏŽ,c™Q$YAQYø4›®ŠÝÜnJ‚Âã#ºQ�Ÿ€³w¬Afc}òœªFÔôr ‹Û3Ì¿.7b‘PÔ5€[8éß2AÛÙLRѲ,„°ãcÅZÇÚË×m,álòÞv•»~÷ÝìÖc!6;Û²v«hþ ÜF755uT/]@ß®en«Æ�P ×ȶ�´Éo¤ª šö{ŸM�¦(476±t]…e±,þ!D8+Îs0b1ŒX Çq£eF,F4�·“tÇ”eÓ0ˆ†¢ 6ñjãúÔ¦i E[{#léœ7½…[”ÄïÕø{÷¾ußÙŽ½í²¤[‰> I`Y6ÉI¹íú1c^¨ðÃAß.©8B`;Ù©Â!'²eI8tÝKU*gÍr/Òn'y—‡ƒŒO5©_>‡º&“žRÀ°wXÙ›„[ð*¤'ÅÉ^q6¯Gæ�Ë;³÷YØ! y;z$÷ñv˜S¥ c|^þQ~¯¥ykçâüN…n3�ß¿ëwûnqÛ-ãÎg76ƒ›Ï”™3}:…i…móâel;öº9Žƒ–èã»ñ3õÜGh'N,«o RSßô»ùYPu�ª¥«°´dŠŠÛûíV[î«-Ý_[º[>ßô’l¦Öø'÷ð¦ÛþÑû-}¾5zî;Ûæ�,A»ný˜¶ÄËüÝJÅ-�rèÝ.…CöLç–³KùâñþÜ>¼#Ò,ïoB¶4�y –’”Û–ô¬Ìm“Ý�ßaÛŒ²$�8´ïÚ‘êh&ëW4"ýFD’@ÄŠòý¼÷ðnÞ…ÞÝÒñûÔ?\J’†MYi*Jh1«W®ÅãÑØ­îµ+C dl)KTÒ½s:x¤mg‚þ Ü05x¼ éÉW�Î í—Æ�—wÁ±œÖg;$�ÂÊ•�Ô‹|Úu(ÃØ� 8vc×@KèzÃúzÖ-žÍ€~]†¹ÃƒŽ#ðø¼,ª\Ášµ5sÐ œpEQpL“…‹WÐ&?dù7³®[Æ0oÉŠË» ë2ÎN ëþ[°MFY–ݼr~›|äÔL_Pž-7›�% ¿¢âØ;j·jdo ’ävbJË �©×Rµ¨�.í&ŠìÊ (àÔW²rEý:¥ƒ-vxZBÄUâ2S= ?SçÞ+»�“À‰9;M1NºÌü% h©eää¤oÖy7þ�Ž@÷É,^0—D9B‡²"̘ñ�T¼þÖqȺ‡±ãg�˜ ¯(—XÔÀ£©4Ö5 GèØ®Lk³VŒŠ"c‡Â¬ZßDiyG·Dh÷=¼]±Í¿¼ã¼:”t݃ñ³šâ1‘?ÞV‚xóê¿M£k©J嬩»}ä]n«ÆÍbÕÂ)lhŠÐ±, g«z¯nÓ‘Ý:$²Òt¼‰‡®îLïXMæßùß&Ä ¥'Í�Pܹ7šöÏòÉ»ñÿ ’,!üúó�ì¿Gg4ŸÏmα�)xT…P}?MœÅ¡C€ã` �¢kT.[ƒ®i”äg·ŠÎ¸û 4�‡ªUk /E¥í1w€<î¿Ûe9æØPÚ¹;UÕ:V8†"o9ÿûw~; Àt* P³l>Áf7¯¼;±¼kÂA%AªeÙÂÅøü^R=nOí�ñ<ËàÈœrP'\€²v\ Ö „Û Ùnޱ¼Z¥¸cçÝÆn¸FNU©ÝPÏŠù³Ø«W„iïðûBÕ«3«b ŽpÔ¿««±-ªÂ¼ùUd¦'ãO Äå8¥Öó•<*‹—®BOÉ$5#sw>y»c›�²$ID£å]:"Rº²ri=è['„ðWã³éÑ! «~>‹.@÷j8»�ò. ’Œ7º�¹s*èZž²´S~KE– dqÂþy·LÛvÇv1Ê–e‘š–HFQ¦/heËyå¿7.Ë!1ÕOZ HÕÂÅx<Òv÷”/„ð§#WÏwgxì[:¯]1¯.âùd£f)Õ‚ôè�¦³}Â4[s|K�“í'%ÑÖŽÏcÿîøÐdæ-j$!»œ´ô$,{·‡ño‡$IØ6Ì›6‘Þ�Û"{tìlä!ðx4V¯^ϲ•ëÙk@WDÌ 4U¡vCK–­¡}I°6†Ñ.‡ÈŠFYº¶ž‚Òö»y·;Ûe^Ž@S }ϾŒý5¶µ] ßm7ùAŸ™Esg¸nωL€¢((Šò—ÆÙm¤ ãKðâx‘¶RñCUÓ6¯•CBUÕ]l28B&à±Y±`¦-ѳC*ÎÎsW%·9Šó_0È/ tlf-1i×s Ïî|ò¿ÂqÐu«V¬ fÑ,Ž:hOœhlÇ…@öyùèËñæeÒ¾}±h̾òêŒ�8˲i_Vˆ36Î5BàÑTÖ­YÏúF‹²òv˜Æî>Ø;ÛÅ(»ê^‚¢²¬jL¢®:„¬ÊÛg%e :•&©©"²Q¶+QrKelÓÀ± ü :ê& 6›é–vcŽmòëÄ ü:ᢡà&7ä– úoÇ›¶(r?üƒýÜí7¬]M,q'uI¶Mj«×a›F똻’XOÕ‚…dçøÑ“]É»�ù<ÿ¡æÅ†›O–1ÂÔDSi×¹3»¥ÜwC]bίÓ)ÌòQض æN�V…pc�ÉÓ+Øoï^®tK'* ÆŽŸAfz ©‰.álÓ|²¦²`ñ <É™¤gfa»£=;ÛÉ(ƒ³hSTé]™ZQúoóÿàä$ ¢6]Ú§ëX^µ�WÛöÐ8 ª÷]w9}{לqÕkV¡yÔ¸~¯ëA;Žƒ¢ª˜Ñ0÷]{ß|ðo<õ(ÏÜ'ºOÃql$IFùMßgoŦ¨*ðè|IV©ÕóV”ßï§y4Ûä¾ë.gIůx}Š¢P_»ž§îº� ëWá xZ·ß¢>íÿÊÃ�]¢ó˜_±’ÜÚÇ•£èQX´¬‘XJiYFl÷döo‡,Ë1‡é?|˰½z «ÚŽ];ZÀÇ„©sA’ØgPÌxÓ MS6™üë|zuk‡¢{°íßœ�,1}ö"²KÚáè;Mvò߆íãvJ’Û9ħRÚu3*‚ m{xÒ­WvHM÷‘�ØLŬ™x<Û¡^Y’Áœ©Ó°ï>\}ãÛá­§G¡ª�†eÆ0ba4MÃçW˜:~,kV,çª[o¥ßà}X·r€Û³V8DÃÍhš§õºWÇ4#DÃÍè>•% æòò£ÿÁˆ6µ†¦…ccDCx<žøiI¨šŠmljk0bQâ‹Xl˦¡®Y–ˆEBHhš†³ÉŠ6ÎÅÀÿ+Œ„¦@ÓšÙT×5б,̯Vô¿·}©Ä„9õ¤t!9Õ‹eí6Êÿf8ŽƒîÕXPQAlÃ2úõBײ$áØ6ßü8•ýöê…×ïÊ7V=ÓgU²tÅ:zumÇoWÍ’$ã&ó«ÖRÚ±Ûî|òÄ?îõ[ˆxg�žƒö䛇ŸÂnŽ¡È®·¼-·š;©)”æ Æþ:�cO>j»¤…$¥¤ÐgÏý8öÀÁ¬©i`ô›o¢iK+«xûÙ'ˆDœxÎEäòîóϲ¢j1_ú%¯×‹¦ÁÚ•køè•Y½b)C�8†Á†‚_¾û†Oßz E–8ñüá|üúK|óÑ{¬ªZ̩ï$!1�·žy‚ ëÖqÐ1'0p¿‘døúƒwùòý·éسŽc£j7œMÜh{å“7_á¬Ë¯ ¯ �õ«W¡iñÖyB z4Ö®\ÎêåUœuÅUDB!»ý&’|öÎ45Ô³zYß¼ÿ6é™Ynú࿜w(øä ¦,¢° o¢†½{ÿ/A�5…ºêfV‡Ò)îÐ 3ö?”ZØ��!�‡ ëêY>{2‡îßaZìxi;�T•·F�¥w·dg¥cÄ\˪ÅÙØßþ2—~½º�™–Œµ)óZd�Ʋåkð¥å�“—�iZ»ëìw¶«Q6 “ôÌdR »3qn=hÛj–$Àp(-J@3W³bé <º²BØîͶ~Í*Æ7†æÆfúÌÔŸ~dáœYTÌšÉ̉X·f5 µ(ëÐ�ÜÂ"ztk‡,KhºÎÂYóX8w«–/å—oÇÐØÐHÅÌ™üüåW|ÜñtÔ0º÷H›â<Š;t 5#“½ÜŸê5+¨˜1�Åóç1ýç©«Ù@ÅŒ™üüõ—ì±Ï¾ìwÀ>pôqä•‹Åpy^î""+'�£Î8‹^ý{pþu7³hî\ ‹ËÈÎkÃŒ_Æ1wÚ$ JÛÓ¡[9±ðŽ—ëû3!ð¨P]fÜÔ ¼Gο*ìåFydW5 ¥t °° Fl÷döo†[›,3mârü&½zvÂŒDwèBÍ]¨TW×2iZG°Gëb]�âÑøyò\šm/ýzwÄŸàÅv~ÃUQdæÎ_JA».$&6#�íÆöÅv�± ÊPܱ•ËbàlŸ¼²0mÒSý¦YT-ªb›{SHRœˆ¥rØI§ðô;¯“‘�×e¢ÈäæpĉÇ1ôè#yü�÷è7xõõ� bB $ EQ‰F¤gfsÈ1G1ôˆÃ¸óég8ä„ã©­^OBb2´ÅH8Œã4"‘éYÙ~üñ 9ìzíM9áhj7¬Ã—�ˆ (²â²®ãßS‚x —ŠÇëE<ºŽ ûôèß�±_~Íœé¿2`È�8ƒû¿[Øï8‚Äd™/>þ–n…={dâ„Í�ª¦õß…ªÄ¼ª&rJº��èÛ�Oþ—CŠ·¸œ¨ÊîÉìß á8øü¿Nþ•ðÚE Ù³×N!x)ŠB$âóo'qäAƒP=*¶í¸½‘}:3f-dYƒ ;#•6¹i¸“k‹' ªªÐÔÐ@ÕšŠÛ·ÃÞ]Ò·C±}gm âmiMrK–ÖƒgÛCÍ-Íê;”è¬[^A8âls½²ЮK7’ÓÒi¶ Ï^Cðúüäärú¥Wòä}wsá‘GñÚ“£5EÈÊͧm»˜6dæä‘_TLzVÝx;cF¹‡ÎÓ÷ÞÉú5Õuæ¹tíÓŸ›Î?—û¯»œÅó+èÖ·�zôâ�WáÑu†ßt¯?÷ çyÏÝw/ëW¯ç”‹‡SX\Ê%'œÀô_Æ3ø CÐ}Z*„€ÁBsc—œ|2+—.áâo:u+#=+‹ÒŽ�È+ÌÀØ 5�[‚„p�è>²|µ¼ýàU n×Dy—LìÈ¿ÇKdU&ÜfUce�º`˜â¿ºPÚ�ÿ.!ðd¾ùèz§�ß¶0î±î¸gÂq<~/³æU±fm-ûêÑ.oÉÿ8i6Éùíñˆ(yÙiˆÍê“TMcùšjšL•ì¼6˜æîÐõŽ„$„6l`ŸÁƒyùƒ�Ñ :‹Dÿ1P8 I^ž¸ç>:†_á’³;ã„­m ϸ„™šFƒ‹Ÿ08åÆç()-"ÝÃ#� ¡¨:Š/OŠ…Ñ<~4M£¹©†H8ˆ?�Œ/�„e8Ž…G`™1„m¡êU!j ¹©¯/_ Y‘A84Ô®I&1)Mó‹…ˆ„šð'¦£ë^‚Íu„ƒ�x}‰øIÈŠŠmÅh¨[ObR†;2²ªµJ|"l� ¡v=‰Ééxý‰XV”Ïßy�Ÿ¾þš«ï¾Ÿ‚’bÑÿƒ#,¡�PðÖüÈÛ�ßÇúeŒ¼ª)>þ%/pC÷J‚‡ “Wðè÷e\7ê5dÇù}®n7þpõjª×óøupÏ%‡Ñ±S;báÈe]È�ï|Ž’¢\.:çh"Í®ð‘¦{Xµr-·=óö9–y_½Âswž�¦ë­9cÛqð'%òÞ_óɬ&®pFÔÜÍ‹øн Ž,Qà‘HS%·¢f Ûm÷»¡Å+îØ«?SZˆˆ�oOöOáæ•©é¾FV-_‰ö}›·þDA÷'¹Y¸ t_ˆ I™ää—âKHqC8šŽîMpYКŽÇ—,ÓÄëO&§MI)YH’„c;d2rŠÈÈ.@Q5LÓ5èiY¨ª†išÓÈiSJbJH2¶m#+²óKðx¨ª%n�dEAV=ÈŠNv›TÝ�¬H,]´ˆ^z‘Î=Ÿ²Ží‰†w~ÞR8¶¤“žªaV}ÂמÁŒ)“¹ã’®¤%j`í\¯ÿ ( *›IoÛ•Ä5ž;ü·]„Ýw‘¨|ûégtÌ Ð¹{GŒð?w~¶ö˜¯NÕÒÕ̬X ‰÷ðv„@ñ{ùzÜDHnƒß+“‘¨âONØŒÄ÷—™W¹‚âŽÝÑ=òî¦@;ÛýŽ�d™X̦¼kÖÇr©ZÕ¸]ºF9¸õÊ�ó-æÏúu»Lð¶eµvÇqP™ä/)©>$ LÓÀëUã7±Óª`#„À¶-`cCŽX4Š—¿”$ „ƒ‹aDÝPQB¢Çq0¢ÑV.Ë4‰E£X¦ÙºŸpbÑ(¶ma;öïÔ¾ÇÁqlbÑ(Âq0 ‹‚¶%¼üÕX 9�¦ÆXÜÃÞYضƒ¢{ÉÔVóãs—ðÀURÞ>•w݇ôT'jo-ô] ²"c£L_"èÜk ÎÿŠ–Ënìt!Ðu•5«j˜öÝ'œxø`„e»Ú[¹¿Ûâï>CI×øü»‰ôíYN^A¶«s x4�Æê¾�TÉžJÕ‚t//YA8-²À ª*á¦f–®k¤C·X»ïãŽío”% Ë´ÈÉÉ$1¿ s«šAÛ«+·X—>�¨œ9žÆúf4uÛê•7õZ‰^ꪙ:þG¦�ÿ‘ºÚõ4540áûï0Í�+Ú ëÍ4a% I’[ó4ñÑ�U…¦†z&�‹eÈqYÍßî·éØÄš›Ž·ù>î~î{651öLŒMäw„ƒeK¼ø# øè¡‹x÷…ç8÷¸v\x~9ª8¦ãžþE$U¦ºº™åM‰”t(Ã4Å¿F0e76‡p>¿Ê÷_~NqŠD·nܼîVxÉŽí i*šª‹m}ºN�¦iÔ¯«å×™•3l/„å´þMõy™4u1oÝzõbõâùt+/ÛA’]UC�@ÓÜRª&C¦¨¸ËÜ�~ÙÑØ!ÓeKéO·�û1·2êv�Ú¥Qa“Ý Iõ™<~ºoÛHdîžMå�gŸáÎË.bÌÇŸòÉ›o3cÂV/]ÂSwßN$Ô„,+È’„îÓ7Ó¹Vec¨G’PâÝ£Z hRªÆºUËyú¾»ƒ(ª‚æÑðèúﮉª(è~/j|±!²ìŽïÑ7?®[Ò%“œ¦±`ÎLž»ÿ..‘hg0|…pÃÕÙé*K¾ŒN>�puo�:�ýfc¬ »Æ)^.±Õ)Œ]=:&„¯BÅ’&ÔÔŽääìüÓnüO@�×çaõÊuüôá«\yîQ€är þb_Ûvð¥$°¾¦�ëî|–ªåkðx´­ê0&„@ øøà‹ŸIJJ w¯ŽÄBwŽ’elÓà£o§2ôØShj a4®§¨m>B‚á(?MšãrXt�ŠÊåø3 HËÌÀ4vßÇ;;Ä(»¡_A§ž½X°ÞGSmEݶÒ(IrËž½^‡žS˜öË/ÛìwÇÁŸ 1þ»¯ýæ+sÖÙ\sϸæî‡|ð0ÇF÷zðxd Ë`IÅ\BM è^!¡`3¦i Ë2¦aÝ6gºN8ÔÌ’y‹qlŸÏ�$K¨ªÄÚåËXµd¶µ‘'Ë2Áæ&Ï�CcÝ÷á±h¬ªZD°±ÍãqÅt�†º–-\†¢(è~ÿ6^�­¾j8¶�¬yIU×3î•yûÑ;¶g·ÞÔ—Œ|/ÈàIÖ�•8Iϧ"'kÈ~åOvŽ#pìúe·¤¤r…A~ûx½ ŽíìÖ%ü7B<ºÌ·£?¢Wq2�»´ÇˆDÿ4Ý’¦ò¼Ì­XÊE×?ÊŸ|OrjRœÿò—EUB�Íü0qCöì’„ïf§ù¼Ìœ5ŸU�{î7„% æ“îWHIIFRÞÿâGž}ã3×Á�$T­"·mº.»½äweì þí¦}½9$Œ˜IIY!�r ­¢ï€d„¹�ôI3Ä Þ%|ýÜBêñè‰ÿX]Æ Ãè7_ã°“Nã�c£º:Ь($$ê¸ùR_ ÀüY3uû-ddg±nõ*N~{|0w_uû~4‡s(_�Ã7}ÄÝϾÀŒ‰“xô¶ë)n߉u«– …ðú<¼óìL7–ä´tN8ç"Ê{ôĶê«7ðÊ£÷‰†X»rç^s=ýöÞ‹[¯½”†ºz„Ô®_ÃUw?ÈžûíɘÑ_óƒwÓ®KÏŸKRrJ<<ºï:!°…LbŠŽ´ögn¿âr´èr¸¥FÈäœ+ÆcZš*‘•êåÂcK(j›È‹o/æí1«8v¿<.<¡Ât6c¶xÔJ@ì&IH»dØÛmÕ(!‚Q¯UéuÚ^8ì’_f7¶ Žãè,˜»� £ßæ­G.ƶ¬?ßGYÆ“œÈ[oɵ#ŸeÍúZ†ìÙ“ôÔdW|æ/ŽkÛ=ÅǸï&cÛ6‡ì?3n­‡–‰7?K§�CÉKó±hÞLÊ 2PÓS˜öÓtnº÷EJ s1LO$ÊÂ¥Õô8öx—ñçï–èÝÛË–â‚L[›Ïß;ë;ì OY²m•ìâîüZù�àg\ æÐ)_ÁçÓX·j ^¯úÏVoñÖŠá I4¡ ¸”`ØŠ©l[´¶_Œ›yã©QtîÙƒ›z€}=Œ×žx„¦ºjÖ¯^IS}ª,56R»~-‘p„Wˆ=†ìψûî¤ÿ¾ûã8ÑhŒ1H—^}¸ê®»ÉoÛË´Ž �”ÀÑg�Éñç^DRJ Ÿ¿ó&]aqÅò ÛpçcÓ¦¸ŒqŸH8æÍ§ãðSN㪑·Òµw?LÓˆ“©vÄ #p!k¤'X,úöIî¾äºäÖóðM{P˜@=Š’PžNŠ_çËÖ£zdžk ?LÛÀÉGµå§iu¼ôa’_i g;ÈÉ#óËÄÕ\pý®5KñÐ÷ø:;B$�ÂÒÕM¬�¥SÒ®=±Ø¿§+Ön´ÀM_9>zõyöïÛ–üÂü?­K¶mÝ£ŽÜûàË\vó¬Y_‹,Ëäe¥ã÷ëØÁào!„9–ÍØ_f2dÏ^ø“°l!@Óu-\Æ‚µ1† ;„†¨`Ãê•téØ'jpÏcoRߤ¾)H}s�uÕµlZ–´Ç0þy>YSU¼>�Mç§MûÍï,Ø–‰óY—^¯¾Y'À…¸|—À�Îý÷â×EÄÌmfàJ€cCz`û–7óì£O"„ƒG÷ü}¥¨xY€®+8ŽMcC=~¿Ë´–eEqIVº×˪%•¬ZZŧ�EJf:‡‘`3U••“Ñu^¿Ÿ¤Ô4Ö­ZÚ•+9æŒ3ÈÌJgï†áOHDUκò:Æ~ù)OÝ=UÕâ§"‹ExëÙ§ùìí×Ðu�`c#¶éàOLdà�(/)¢[ß=ˆ…CT-XH(䈓O%+'“}>�¦í˜Ð’8B›à#C]ÅË·œÌã·�à¢cÓ¹ñ²Þ¤'©Ø íJ“¹ô¼\|e:'rôÐ<ÒÒu^ùt)לÖ�³/ëʹ'3zìjbÍ’,!«2JŠÆªÕuwé<ôM‚ û°¡6‚ǯn•Öÿ<2óÔa'”��“Œiî–Öü·Á¶IÉ:ú…šù¹â‚ã0Ñ-Þ-ÆÉŸšÄúšzN¸`$7Þû"µõM­=ÝËŠó�Uå/ ³ÂqÐ}:‹­`QÕ*?`ìÖ…€@ñë¼ññXŠ{íEûÎŬ][K¸v-½z”óÈcoòñWã‘$‰Úº&ê‚*—®ÂÖ“ÈÍÏÅ4þ¾Þ„^Ÿ‡Š™ÓyóÉÇplEv•ý¼>Ý«·æÈ[®Ã–^¿½Vöù�¥yTž{ðn~øê|~Û¶ÿpûߎ«¨ c>þ€Š™Óðèš[öÚ²Ýv^Xì0£,I±¨MÇ®]Ø`f³tE²®lIáO!Ë8¡fÎ;ȦD™À£w܆mEÑ<?ßáJAÊôÝ{o>}ó5*+ÇsÅn9H˜†AJfþ„DæÍ˜†*ÁÂÙ¿") ù8ŽMõÚ•V/[J¨¹™ä”d<ºÆ‚9sXºp>á`3Ž ÷?€û_x‘ÕË–ñÞ OãñhÆ|ô«—-çòëGЮKglj×<ÛDÂa¢ŽÀˆFqAZf&Âq¨Z°X4oÎ!`ÇAÈ*‰>›õ3>汫NÁX7•ÇnÀ =Úà„LS +–ac›Kgl૟×rê°B$) ¦/h`Íüz–¯Ñv0¢6r‚Fu}ˆÇ_XÈu/K´;ò~®ûÏ“å%1 s(ê.YÙÚªqqŒüÒ¨ª{wãß·„B]m#_¾þ,ž¸?‰)ÉX[Xœ¹¥˜ Ц2ú³8êœÛóãôVçÀ¶m<šJ»â6¿ëqüG�T…¿O—ò¶ääfbW+éÂ¥üº¸–ý�8 „`ù’JU I’?i6Yé)46‡X¹r‹¯$³°þ€/ Ýú9F�$+XfŒ/Þ{ƒ—}€ŠÓPuÝ«3yÜXfO™@b’Žx¼®‘Ö½:�¶Éÿ{ZÇÓ6ý\÷´ju]ÇßV’%4�'¾�Ž×§·rW,YDS}->¿Œîó¢(nÔNQw‘ ëxã=dYÆ£{ðútdY¡zÝÂÍM ¹Þç×Ñ<ª¦mõ5Ùì œrÜ(…Ù¨�˜9o<Ååوȶ §J¸¢V©>™'olÇÙ7¿Ï3z¹úŽ›p°,g«ëù$I"ÔdrêÅ—³¬²’K�;Š}9’`S]z÷¥°¤‘h˜¬‚"†q4/?òµk×1î«ÏÙ÷�#(.+¢Gÿ=øèÕi¨«gÊ�ß“ž™EFNC?š§îÉêeËùyÌW€D$æ“Ç^&àØ©YYØ6¤efjnàƒ·ÞâÛÑ£ÉÎmƒp$$dIF’ݾ§‘p„¶Åmè·÷¾ƒö¤¨};V/[I$Ü̆ukHLNc(2¡hˆŸ¾ù�u«VÒ{ÐÞ”uì‚iniãf”ÁõTJºíÁŒ9c9JlŸæö’¶)�1ybD.àUº9Æe·ÜHؖتP¹$I8Žƒ¬¨ÜøÈ“TÌø•e• н>:õìKrZ:×Üó0ŽP8ôÄÓ(íØ…¥ +¸øæ;èÜ£75u&'œ)ºô ¹©‘CO: Ë4 6Þ%tèÚ‹š ë¸âŽû°m›¤Ô4z Ü‹e• 8ÄmtîÝ—XÌ€˜Ä>ÃŽ"%-‹úºZn}ì9‚PØäŠ‘�™›GM³Ã�ÃŽbÀ�ý©k´8皘öóÄ"n{âÛFÉ-‹Ú&MS[($TB+Æóò³÷°~ɯ<3r½»eâ4›Glf�…EWXSÕÄÏÓj¸å‚r„áàDmÚ'—~½2h¨‹1ê­*½‚Ç_[Ìw‹Ûrøˆ»4d0ÂDC6ËæWàut+k±]O_W8| ••�DÕ6”•·Ãˆî]ÿ›à8 I:SÆOcæ·ñøÍ§bn˜tÓÆ�%‰ŠÊåÜûÄ[¼;úW„G–±ã‘•NEZjmrÒqLûOx’äê"¼ðÆç Ý»7�: †A’ðè–.YÍ/óÖsù½7c²*±jÉúç"« ~¿—Õ««9é¨ý8çÜ£Ù°|5ßL^Bïò˜1þöâRðx`ÊOc)-/ç˜3Îâîk¯¤¶ºËŒ`Û±H˜HSkÂAn½ø<Ž:ítš¹ô¤£ØûÀƒð'¸ïº+¸õÑ' $%q÷՗ѽo4ÝíŸÃí£žfþŒé¼ûòKzü Ô®_Efv:\mÛµgÏ!CøìíW˜öóÜðÐX¦ÅØÏ?å�c�á›ÑŸ°nõrN¾ðžy;i©)´ëØ‘Go»�+GÞÍš•+xð†ëèÙ¿?ÇŸs¯=þ0�zö&§ÍIÜ|þY••QÔ®= µ5°­óî&Ø¡FI² S�ž|ûSVCUqÃÛbc=kën Ya:øu…Ç®oÏ™7¼Ì÷¸êö„ƒ†Ûak’$WÞRVèµÇ@úì5!ÀŒ ËrIT1ÛvèÒ§/Ýû÷űÝîQ¨ŠÊ ¡ É`™nˆÅ2M$$úï³’ ¶å~7Ë4éÞzÚÛ#f´\„€¾ƒ÷EQZ¶˜¦IÇž½±-‹XÔ"·°Y–1bªêaŸa‡€¶éŽß¢(öOá8’ª“�¨žõ÷_3œ6é‚gîè�æSqB&ünÁã�ìSyùãe¤$iô铉Ód"+õ5QÖ7™|>n Ÿ�­"/;�¬>‡qó³÷x cØ–MJšŸe•sIOŽ’”áßf½ôÿ€&1oI3 ¹{�™�B¨)Š´›yý¯�$�ªI¼ÿÒ³:°Œò o¨kÕ/€�ß‚¡×Þù,_Ž�ßWj5ÈñÑAvfÙé©XÖ/TGà ø˜3w1­à•Q7àX"îá*>/Ÿ~7…²>{QÞ­¡ ‰µ©[»’ö½;ºN@S�å+×qäQT…5몱µD ŠJ0 «uQ!âd�ߊI›| )2FÌaÆ„_((.&ÔØH݆fO�ưÃö§¬s7JÚ•pð�ûòÙWcñ'$pòE—â8&?�ÃÀ!û2d¿Á̘<…9Ó'aš6ŠªrÁõ#ði°pö¾ýè]2²s66Ò³_?ʺvdåÒ5D#Q=ñ$?ô@ŠÊ;sË…ç²bÉ2<ºÎCöãê+.EÿíXºõÈÄqßrÅ­w�_Pˆ®{™0î{ KÚHL⪻î%-;•—G…¼ŒûâEæºûÀ`–ñç¬ú¿ƒ:[H’D4bСc{HìÀìù5àý}^YV]‹,{d·œd+£$’,aÇüš‡çïèŽgåkÜ}Í$Låoˆh·ö6ŠjŒjŠbŽÄ¢±Vò|,%Ü%Ž¶Ö :Â!r?7b1LÈ)ˆ„¢„ƒQbÑF,†‚X$F¨)cÓk¦aƈE¢®Á`Dc8–ËÞµL#‹×l;„ƒQwûX ÈmÝwÝòÀ²¼~/‰f%=pÏÜ2œ N(âé‘Ñ$ ;hºFr s‚"Kˆ IYAלÞa À‘$šmÞø¨Š—>\DÛ^qú=ïqë#� J Á¦(�Ua Ï™BϲDÐvŽÊö†$I`ÚÌ]lÒ®ç(» {|7þ9Û!)ÙË«O>G5\xαÄê›�•Íe†[ôñ^/w_ÃÏ:‚ܬÔVÃö[d¡û<.óz Çm ÇbÜûäÛœ|äòr2ˆEݹH÷êT-YÅ—rô©g‹ÙhšÊºÕ«‘£ ´o×Xµf^�‡vÅyÛaêô RóŠHNuû€WÔ}^TMm=¶®ë$&{Qµ� ‹Žãà÷{X0k«—/YaÊ„ñddd0áÛ¯°X†HظQ& (DB1’AV‰8>Û²h¨©&¯ Èu€€ìü6¬^µš#Î8“³®¼‚ÇヒÇn»Ç6ð'$�–™EHIËÀç÷†Ñt�¤Ô4š�æñ¢{}›1cÖ¬aÖ¯Óè¿ï>ìuÀPBM!ròóQõDÂA�ªiH²Dͺ5äµÅ£C4lmu®k±Ã�²eÚ¤¤z ä´gZE=¨)„kXƒ!“^^Äë.UB’¥­fSË2Ø1›äD�û¯*§©âCÞ}å-’’ã�•þrV”ð'z]‘IB’eäMä-7[ùÉrëkãÞ.!C’å߯e¹UFsSÕ/I–6Ï/ÅÃè†�ÿ]Þl{6Ýw³q6Žý�C'ÂÁrd’“½(õ³xý® ùqô{Ü>¼3‡Ð'fãØâ¯óô¶à„#ÛÒµc "⮪ŸF A © ö:�›žx…Á Áˆ™X¶Ó*]*Ë Ñ¦Fê×.¦Ci²Û@{ƒ¸cc˜e >J;tä/JRwãÿ!ðx=¬YU͸_ãÔáûýØ–ý‡ ;G8ôèÚŽ'¸Š!{öÜçZ–$eã�Ÿ“šÊi8ŽÀð1î§é›#wľXñÅ;B {u>þf2m;RÒ¾˜H(†Ç+±zEé…ìÌ4ª–­!+3…ôô$ÓdÁ’5¤çµiíîØ<4Ô®!jv V^�šêÕ̘8™h¤Oœ$åæ“aâ¸ïÉÌÍå†ûïä’k¯àŒË¯dú„ñl¨iBóh¬[µ’pÄ@·=Âmÿ …plE–‰„B˜¦Ey÷>Ìš2‘•UËY·j-³§M¢¼[wBÍ�ìwØ!}æéŒùø}"¡fb‘3'M ÖfÂwcP�6Åù„š1b.Æ6-‚M�ä��”LAY Çžu&C�<’’òv†I4ŽÖ$b‘FÔ SÏžLÿ3óg- i¢¡¾v»ÞK;>®&¹ÅÚí{ dr…�‰!Ë®º—ïYÅL1ŒIΉ\>r:’¨®0úÖ@–Á‰Ød‡7ïïBã´G¹é’$$yãÇúýÍ,„ˆ³ î¿îj¾ûìC|�•e“¼ñZZW"Ò­]¶[©ð¶moF©6ÙÆnu‘6ݶå}k-´ec[^ŸÆü™ÓyìÖ뉄š@к=¸á"Ûv6;^ËN¼ÙòoÏokàØ6Žâ¥ %Ää7Gp뙇Qš^ÃGO@YÛDìzƒMÖ ì�…¶�½*r‚ʨg§sÆ)û?Â-�¿Hjj: uÑÍ®:™ÂÊEsQ�jÚ—¦Â£íä6¢EZ³rI1_)%íKˆmKkÑÝØe „@‘%Õá±Û®çü£ú1hϾD›Pþ¤9ŒG8|7v ßü0m“ÏÜ&/B¸¤¯¶mrâ^ê–ÇнÖ¯¯åù7¾äÆËOÅï÷bšn³=àeμ*F�›Ëé 'µ[Ÿéå• (-ÌÀ“@X&¿üZAÏ.íP~jªkYQ¦¬cW £EýPgÒ¸1»G~üê 2R5¾|ïM¼þj¦ý<Žg�Jåìx}*H‘ˆ{þGœr6¡�ÃÚêºö¦÷ ½Y¹t9§\x ë׬çý·? +?�¾ƒ‡ $ EÕ°Ïþ$¥¤5¡{ßþ¤g·aÐpÌçòƒñÄ�÷rè §pø)g2sÊLîºâ¾ý—Ý~‰É©¨�å‹«¸ÿö;©œ7—ŒÂŸ�J§½),iGÔ†œ6E”wíA›’®y_~ø ·\x ¯<ú85ëšÈ-lK×¾@¸ Ÿ.}ú‘’‘MïA9îœóyùÑGy|ämÌûuª¦nõ¼ûWر9å8LJÚw`œ‘ÎúuÍäå¦ Œ¸Ñ‘aC£AûN]8ù¼3¸ìÄÙ<øì®Þ 'âÄ­J Ë´Iô«Üz^>Ž|“Wž(åÌKÎ'2âãl^¸îÑ*çÌãã×^dÃÚÕì;ìP¼^�h4Ê×~Æþ‡²† ª {Á² vHH”‘$hª·ZÅ“¼è^0-hn4ŽƒG× ¸]ijtW~šGBV@÷@0Š,67°¬r!�Dišq;ºÄÃE¾€;F°ÙÁ6Mü/’ šM þ€Ÿß=¿`“Ï©ÿÑÕrIø>üÆRÞx$cG¿ÏG·ç˜£J¡ÙÄ1ldåï”?¸!(-ÕG}u3�¿¾�ñ«Ê9mÄÝ Ü»' u–°×ÁJà:‹æÎ"3Á 9ŇÙ5Å6„"1oiˆÔüŽ$%û5F�ämï�¶ÿÛpAb¢Îç~Œ\¿„��ù'"!-Pd˲yñ­/©©kDQlÛ¦G—2Šò²=fy`oÙCŽ›/~ïÕOÉÍNgÀÞ½ˆÕÖ#Ë2Ží {½|úýt :ö¤¤}1õu®b¡i@õÊåôïš ²L8¡jÙ†í·¨2«W­ÃPüä´ÁˆÚxt�uõ|ööè>?†ÃràëÞeïƒæ¢Ë/âÜãOæ›ß¡[ÿžD‹X~ò™x�ÖÅ€î pÞµ7ƒɩɌxàQ„ddesÖ×" �7ÀYW\‡Çç%Ølqô™ç!Ë FÌæ˜3ϤǀAnív§Ä".ï'5-U×éйŒ•U+@À°O$11…@RY9é„‚GŸq.²ªÒØdѱgÚuéŽsè7xoÊ:ueù’%dfç ûü´ïÜ�ÒòÎ.¿'fqÄ)g"+ á�É çžC¿Áûll¤MÛb7"²K½pk½bQƒ¢¶ùøÛôaÚì_8¼8³Ü`Œ#‘�¬1yÝ*TEæö§žåá›ndø�óäÝý1 ao]/^I–°Ãy™ ¼ùPO.y/÷­Y͵wÞN,jµÖþ‚›U5‰¯?|ŸcϺ€•K—P1s&=ú÷ã…ïæ�§F1á„9møUlX·–†ºz¦�Kaqûq�>ý¶eqÎÕ7‘–™�c >~í5Æû»÷æ„ó.ÅŸà£rî\Þ~ö1t¯�s®¾�Úêõ¬X¼„šêµLŸ0Žƒ�=�ÃN:YRð|üÚËü:iN8çb2sóù雯0b1*çÎà¬Ë¯eÂw?0fôû´-ëÀ±g]ˆîób™[¸Qâ�$2Ó%ÖN|ž{î}ˆ’Œ�ßµ7Eù~ìúØß‡ Ç•–”SuF4Ÿ§>3èuÔõŒ¼ãd’’¨©Ž ¨ÊÆtJÂv˜3eƒË¼ )ˆÿB?èm…$IH–ÅÔù¥‡ôC‘AˆÝ}¡þ¿Ãq“¼TÎ_ÈOÜÇK÷ž‡×ë%Žüi¯dÛvð''ðÉ?ñÉ׿´FôTUáþÏcÿýûóö{ßðþg?’Ÿ“ ö搜ãàMôóëô ¾;…Glɿ̠sY!ª¢à x™=s)?Í\ɵ>A8l�šªQ_[K¤~-K÷`ùê D£eE9àæ,¨"5¿ŒŒì,Œ¨…îóðÐM·3øÀƒHÍHG’`iÕ McðÁÃÛ‚aÇŸÂû/=K(h¸õ¿B��œ²1rO zý$ Œ’�_€eZø“ñŇ?1 G8ÇÁ븼ˡ¹)JQ»v¨*£ IȲJIÇÎ8¶C¨ÙBVTr ‹PUe�ÛÑÔ`ÒÜävúó\¹`ÛAQ=hšŽã847FñéÚ§¶å`™šÇƒ&éq�±ñ<ASC”Ü6…ÈE¦amW-‚�B µm›€_£¸S_f/�›�´•Hc-a’¸ôö;©RöçÑçç#©ü ÂŒ,KØ‹DŸ‡û¯î@㬗yÿ•×ð4$6*¶¨šFíú:–-ZÈqgŸGÛ²öÌœ<UÍë'!1B �€ÎW¼Í‡/?Gv^ß}ö �Ý~é™™,®˜Ë{/>ƒ? 0ú�—øvô‡tèTÎÌI¿ðæÓ�â8ž{àn$I&+'Y‚Eófóð­#hª¯¥MQ1¯<ö¦ü0‰ÄäD–,XÀêe+Qd�§ï¿‹¦ú ,žWÁ{/YÖd꫃¬ &QÜ®VlkìÆ®Œ–˜‹òÞsOqòÝéÔµÃ_dhšBsc�çßü‚hÌ@ŽóJ܇AýºàD N9þ¿s8mÛdaÅÌßñ:ZØÚý3ý{–óî‡ßñÁg?àõ{¡h¼òáXÚ”w¥mY>ѨKrP=2kW¯FµBääd‚ –¬$=5™´äD°,æ/]GaY<šŒG×ø~ôG4Ôl`ØqGjnF’ ¹¾UUñè^,<ºË4±L«•'ã8v\öÝ] Ê’ÜšŽ“Óˆa[&ª*#,§už·-³ÕÐ9¶�ã®ÈGCM-‹ç-tõóeW4*‰“sA !…‹n¼�Ü6Å4Õn�øïᎷ?ŽhMʲŒmÙDCQLÃlý}�MÒˆŽm·r�ZÅÂÑͶÙØ9µñÒ¨®ýúRU�€ÕÚX"`;ääú‰5®%¶‰Ec$'%sï /ðýšþÜñè4äDI‘þˆçÄçñ¿ËŠ„6ÉKõóƃݙóÑÍ~Ÿ3/»†[«î~ˆ1Ÿ|Èêª*"¡flÛáÄó.¦¤$—H8B~a!Ão¾�{~ˆ=öÂG¯½Œi:¤gesÎU×1ê­WÑ=ógÏæË÷ßbÉ‚yxý $¦¤óËwß²lÑB$as؉§rÍÍ×ñÙÛoQ[]�/1d…Ño½BSC]k H„À þD/é±I®¹° 7]ÕaÙX! åo†«% ”T�…‹7pÈ%ù%t7¿4šãO=’Úê–ùûpõæc<šÂºåUø¥jÚµMÙ%ë“!@W™YQ‹(¡¸¤ðQd Yb÷ëÿé É)^züIX7‡K‡ŸD´1ø9ÞÚ6àçÝ�¿ç›±S[k““üÜråi^ŒXŒpSˆ¼ì ¾x©ÔÆç¶¼I üøÓtÆŒ›Æ/Sçqë¯P˜—åzÉ~/“f,bÚ¢ œzÞ…„ƒîó-KníðâóÉLTIIIËbNE�ËÛ¢ú½D›Y¾¶‘v�:!K‹43ú�—YYµ˜kÎ:‹_¾Ã/=ÏŠ%Ë‘e‰Ps3~�D}m5þ@Ÿ×ƒ (Œºu3&þBJŠF}í:n¿ô–.˜KJЇ•KðâîåÓ7_áÑ[®CÕ$EBÂušYFBÄŸ#�„ 1Y£röT¼ájl#†ªÈ®˜GCU𿡤]|>ŸUd)>_É2Š,»¿¡ÌfϨ"»»ß~¶ÙÿËüéöö’ZþûóÉNÉ)Ë’D,fѶ´”°VÈü¥Õtíâ‡� †CI^"Zt ëV¯£¸8�p(ŠÏ¯sÕ=÷óðˆKxò… .:¥ƒk¶�+•IsW`Žåz(²,aE-u¸¢Œ[ž|Š×žLℳÏ&êX8&þð=mÛ·'ŒÐ¦m)S~Ë¢ŠEX–�ešDC!,‘Œ¢¨è¾uñzæäÔ4êlÓ²ñx½„‚ÍȲBjFµ†Àçó£iŽ€[{‚÷^|žÏ?“Ën» ]÷�”š†$A£ I©)T¯]ƒm[$§¥!€`Ð"�˜€mÙDB!²sóñ&$’SØ– o¸™ô¬<Û!·°-M1›h8B›¶ÅÈš‡®}ú±çЃPT¯+¼.BÑHÒšY=þM>|éiR<�}é¹g/¦þ2žÅ æÓwÈAÈz€ˆáà Pd 3DÑt ¶e¡h*Že …¢D,›Æ††…âHØH„šÑô’¤`Å $ït‘$W2 Ijéë¾ó'G‘±%°þÂùÙ)FIÂ2-ÒÓü$ö`ÚìwèÚ+Â`›6é9‰äø2kÚ$Ê;C$ ѨAzV6·=ù לvëk¦2ò¦�Ø 1—6/m ®[fÕº0½º§¡T0Ýüƒ,KØÍe¥i¼8ÒÏq×ÜFMM#åKÖ2õ§¹uÔôÝ{8pÍ™ç0æ£w9âÔÓhnldýÊeçaD£Ñ(ª¢`1"¡PüA² 56’צˆ”´ >xåYnº÷^¾þðm’RRÉÈ-$ rùmwpÉqG1áûïÉ/.fÆÄ T̘E~Q>ß~ò1GŸvš&lnŠÓïe¡ŽmÒkà Þy~.½íIbr2¦a¡{ý„C!¢¡0]¡S¯Þ¬ªZ̾ÃÆ4m!£i^·�¢×K–²Œ/¿’—^úœ/îÆ €˜…Ù` é2Þù`)š"sÌáEØAy Þª®‰Q"Á×Þ?ƒÖž\}ÿÔ”µ!ØdG·Ê »·…ŒäÀ¼é9 ]É£aGc¿ Óý¯C‘e0 f¬T(:rÍQhŽZÈ»I^ÿl©ݶ÷¨Ûd,á ytj××óÌ=·pçÙûQÞ­œpmýf"![ÞW |¼ñÒÇL™±Y–±l›ÜìtF ?U’±œ�Š„[Š9ŽÀ›’ÀsO¾Ãè¯]2˜,Ë$'úÉÊLCJðóÍÓ™¾¨–›®<‘55[ In˜5Xg°rÑBN8¦3È2k×n@’%:´/ rñ2´´6hI™Ô6G™œö=É—e|ûÅ7´íÜ_f‡œq!Ïß}#ï½ü¥�ºsੱ®>‚³� ¼ï^Ì›2žuM0sÚ4:÷ÈŠJÖÖÃÔ “hß«7²ßGuu5M†ÅWo½‚e˜Lüö rŠÚræµ#IËÌ¢fõZž¿káæf² ŠP½>š °#&ï>ý0“¿û’¶í:rÎ�÷°tþ,fþò#§]së—/ã«·_äȳ/%1%•wŸz�^{íOyÏþÑðNö‰  Cþ¤ÙÔN;£¡]÷~̬²q"¦+:áÐ4º–È,˜ú ¦éÞ�², ÇÐýnõ$s›ðØ“³P|CÕÂ$&i<þNû�;ž7?ZÊêê0²&!{\ÍèX“�ß§óÌ-�iøõ9Þxîm¢áFzÚ‹Â’rêkbD£C=‚˜a‘’–Í�Ã�äùÇcÅ’tëÛ�¼Â"¢Ž ¯¨„òn=1,ArZ:�zõE’u.¸þLÓæ†K.gõŠU\{ßBâ�'ç¦óϧ¸}';éTBÍ!2rrùnôGÜ}õµì9ô †�p*=�®}ú¡(šK¿ïÕ¯?Àþ‡ÎÞă×_Ë�W\Æ×ᅦ„DǽIËÌ"œxÞÅä·-áÖáùﺫÿÍ—HªJ’O ¯ø„QWÏì)“yù¾½9‶8A3j£ùB&·=8‡óïšÍu�Ícúô (íw/N|¢P¿L^Íé·-Aêr)w<ùù4ÖG\ÉÒ¿ݵÞqU£ÆÚjÖ/« ¤8a—Í'KšLýºfšE6…íʈ· Ù¿íeÙ6–eaÙîËÎVíg;–mo—s[ùÙ?yÙB´Î?o<|÷Èâ€ö&Rßð—Ùq¯NÅÜE<÷ÆçqB¥û·³Ž?�â¶yDÿbQê�ׯ3î"~œ<›ç½Ž÷íëÎýäf& Y¼üáìqð’R0M·!…í8(šJ͆u¨F#%EùˆP„ü¼Lî½ñ\|^°**W’֦ͣćP0HSc#Õk›9ú‚+é½ÏPÖ¯ Ñ®g?F<þ —ßÿÝñ^¦åÊ�F AÛŽ]65²lÁV/[Â^‡ECÍz–ÌŸMcm5å½±tÁ¦ŒûMW˜8æ *¦O⌷±aÕJ>{íY$^}ðv2rÛpö�#‰„‚„ƒMè~o<|7«–TrŃ�“˜šÎ³w^‹æÓ˜ôý×Ô׬aÑÜé|ùÆK¬X4Ÿš5«˜þ÷$&§âG°SŸ [¸SÜ_Ír;ÇSÆM󛆠CçNüüz2õµAÒÓ“À±Àôí˜Âë¿Lgýú:ÒÒR1 Y‘‰„cdrÕýOrýÇ£Ê3>¼vm °M‡@º—½úfpÞÈÙü0­ŽâÂúšÂ�HØb¯aÐþ#\zë]„ƒM¨ªÎÉ_…‚ õ&C= ‰†“ÒòÎ\1ò~l˦¨¬=×?ð(Á¦F IH²Ši\xý-Äb|þRÒ<4Öד�—Ë¥·ÞB}m3 )©X¦E»ÎÝéе'¶í‹Ú\xî ˆ §_~5áæ&lÛF÷ú°L› FÜŠ#‚A“¤”t†ß<’PS¶#áML%Íbå·wrÛM£< —»oï�&KXAE‘ÐR4–U51ü®|9Á-~oÛ\|ÏL>5�¬t/ÂrS¶-P< ,ž}eÏ�M䢻^eоý‰„,ÂáØß÷ …ÛIgŲŨÁ5´oSÆ®—OB€Gaæ‚Z¤´=È-,$ [¯L÷ÿÝ@õl¼b¡(¶e¶êü’»°öx}(ŠB4Ü(Ü#Ë­lW×PmŽ!�ªi.¡§¥ŒHMó`Yæßoñú›±mÓ$#7•÷_x…ðüq\ÿòH옱uç&ŠWçé×>cá’U¨ª‚eÙtlWÈð³ŽÀ6-$éÏ}zId]gÔ 1°OgνäD*æWáÑ’~ ò²ùhì,Ö…$Î9â8BÁ’$·’2UMcíÊ¥¤dÚäfa&^�‡ŸËv°cs—®£øÐZy:B¸Q-÷´Éi™8ŽÀ±-lÓ!3¯�ÜÂb±ØfMŒHŒÂvñ'$1í§ï°,‹ÞûÀÌ ã˜ôÝ·xŠ;vgÝÊåh½õüö<ìÛ“Êèœ3�Ås+Xºp#_ýˆ6%¹lXw ï=±‚šuk˜3y<§_w�z÷ )%ƒ‘çœhä¶¥rÎTÖ,]L—~Y0}2õªÉ-*¥MY{W¨„�¯¸·5‡ÛyFY–ˆÅLò óñfueö‚Ùì»O R DÔ¢mq*ÅIK˜7cû‚sËedE&Ü%)#‹Ûž|‘§ï¼óñ\qNWœ˜…$€ˆÍ!{æÐ£ÝRf.jféš(#_ÈÓ.gè€LÛ;—={¥“ìWIÍ ðÌõeÜöìÝlÃAQ$Ôd�3WñÔûuØÇ0òå‹)*iKs£+í¹µÞñ¦¸µß3¦Ó>ß&�äæ“w1›LKzjÊÜf2Ëzâñ(4‡�ø"åßc•EV˜úýW¬X´YUé7ä 2ó‹°,—Â#�%y½dðè^ΘBs}-Ý Aózpl#CVt¿�X$Ï×J[ÔZB´žÃè§C¯tèÝˈ …øàµÿ°÷áǓզ-–é.""ž Û8üQ!›c;$$'3áûñ,úîmºýt]'ù딋ã8øýL�2‡wGÿ@K3MS¹æÂãÉËË$ ÿé³äؾ”DÞyï6Ô5òØ=—ñØ]Ï Gyï…‘Ä‚AÖ69<÷î÷zÚùhº—p(ˆ,¹ÜG�d–/œOi›TTŸ—h0ìÊ!&^]gÝÚõl ö*)%�ál¡ó\,flv�¢Ñèf¿‡»¨’0ŒIi™´)mÏØߤ×à¡ä´)"»M1?|üý†#)#Ãpdzw?a;4‡Üȉªjñ…›;Ë*DBalËYEH‹ÅP=�D1M‹„ä4zíµ/?|ò ¹ù~yûe–.šOÿý†áiEÁ�÷ŒÚŽÀA´^Ÿ?ÂNUÊw‡@@£¨sf.»V ÛvГ|t/v˜?c¿ óËŠL4£M»2†ßöïMÉæ��*‘}š–‰Ùäæ8z¿—a§H8ªVGyöÕuÕ.9ƒï~ZËú5AÊ:gðÈÕLzóVF¿ý]i•äÜT•¥EG6þv-Jd-oã²c-²™¦i¶ÖC·Pÿ-ˉka[ ÜïοîFba3¾ªÜ$o´Ù¸îÁZþn™¦a¶{sõ�%T” ±Š×xö¦søuò$' ÉGŠ9X†ƒæuÃÕ÷=¿€3o�7Èî±m[лc/ÜÞ“^ÝÓ1CЦ yÆþ°Šë¯%¡÷å\{ÿµ%Ü\™ëïB’dÓfiůôlŸàÖ'og Ù�E‘±"1æ­�hÓ®K¼[×FYÂÏ dUã£çå›w^dÁô‰Ì™ôÍ� ¨š†,+x¼®Ö°#ªGÇÄ÷SY4wÓú=!ÀŠÅ ©^³’DZY4w&ŽpP5¶m£êº[ë*+­Êv’$ã $àñùøõ籬]¹ EÕBÂ0 ¦|÷ÁÆÉ>4]ÇvdYEVU×ëYU‘e¥5ܽéËí&'ÓÔÐÀGOÞÇ ûu¢s¯.DÃÑ¿4Èwá�Œzé6Ô6 È2Ž#è×£œcÝÛ%'ýɳ$EUh†yû“±œ}Ò0ÖW×óÉ78÷ÔCñz’33xåÓ‰Z½öÜ—H¨%b³q^3-›õËÓ¹86Q;”��5•EU+1=)¤eåºÆRH¿»-'´éûß6§p• ЦQЮ# ¦O¦¬koT]¦ }G–WÎ¥¤SwTÕ­Q¶ãŽ�mµˆ1É8¶M8ØL~i;rŠJøüµ˜;e&“¿û†X$Lrf&í»÷åû÷ßdΔé|ýö+ä“]XByŸAÌ�ø>_=÷ ’Ä’¹³èÜoÏÖ~;ûqpe²ÿj–Ûéík„ í»vgñj'j¸ªQp SûDj–Wޏ4øÍNT‘ijŠ�[\ÄM=ÉýoG÷ãRÔT½5ÿyÐ^Ù¤l[l¤¢Ë¦ o}»Ž¡Nä¤k§ðí×+HLMäµ»:ñþƒ—ñÝ—ß‘‘åý�¡Û2Éâ÷�PTÝ«¢ë*^Ÿ†×¯#„«Äåõj(ªC Á‹$K8BBÅ]iþ ƒ¶%(Åû ÕKNR˜ðä;¹þ‚‹ÈL÷ññËCÉJö`5¸ù$5I£>hrÉ¿rÛ3•вxqÜ1†öOãÓQØk�lÌ�‰–àAÒžzm߈pÚ�orñµlŒ�Dÿ‘wÜ!Ü|r¸9HÍê*º´OGìr~¥ ©25‚¬‹¦‘ݦÀm<ñ|Õ¿ç%âQ$YõpÁȇxìó¹ë­�(éÒ“¦†zLÃdÝŠ¥¬_¹ �z-«/@VT¢‘ƒ?‘¯¸™h¸‰×¸�¯ß|�h´‰ªŠY<{ó•,ž=•h$„Çç§nÝZ–WÎòLUCV5lÇaù‚¹Ô­_ƒ/!EU]Æm|ÁàOJFX¾p!µëÖ¸dÉæ&"¡`|A- ‡›áw¿Ÿk”“RyëÉGé—/qÆ)GÙPÿ§2š­÷‰#Ð}:³fWòáç?´vƒ:ëăHNMÂ0þ\0DZ<)‰¼ùî7äg§3ìÈ!ŒüÏ« Û¯?½ûtÆ GXYcðîÇß3ôØS’«Æ&ßA’d‚ÁѺuåº�Ü7ž%(23æU‘”[„Ç«·ÖðþÓ{ Là ¼ ƒ�:‰¼’öDB6mË»°ß±§SØ¡ á CZN>¥]zbYPÖ­7É9D£�UЖ¢ò®(ªÆÉWÝÆüé“5âj J;Ðÿ€Ãˆ#Éõ$¦¥s÷¹çP¿¡šón˶ÉÈkC¿¡‡Ñ¡Ï@$E¦çÞCé7ôPÒ2Z»éíìg'þß¿ÀN _ƒkXŒ˜Miy9cŒl–¯l¢¸8Év fÓ£,ÏWKX¾¤Š²vÅD£¬( ¡PŒÂN�¹ááyð¡«1Å2\ˆ¶èÞ!�CöÌæ�¯×@œhƒˆ{›ñ÷ã¦×3³r·œÛž+/èÌs·–qÿk· É‚¡Ã$ؼõÇ5¼¦üð=¾ÿ]÷3¢¤edqÊÅ—³lÑB¾ý!¡`í»ô`ßC�@’ÔÍ”Åþ9 G%Á Þúq|þä£Ì˜<…S�(§º.FeE¥…‰Èª„¤H|þí*î}¡’‰sZBl[�™ªqÅIÅœ| Iì��–¨³`~5O\Gcò0îí JÚ•ÐPsCVÛÊŽ®xÂ’ùUx�uƒ¹=®ÉÎ…4…ù ðäô 53�˜a¶®Âÿ]8 ÊÍ™4¯?@$¥C�þüøé{Ìžð%»±dÞ ² JHLMeù‚ÙdäqÖÍwóË—³rÑt«–,¤±®†_¾ø† kVP½z9ã>~Í—ÈŠÊ Ö-[ŒðÓT×È‘ç]†c[¼ùŸ‘h^/IÉi,[0—½?Ûq°…Ûf0�ðí{¯’š�MåÌiì{ôɤ¤gñíû¯sÁÈG@–yúæ+z™t´‘àÆzcÇqð%øêƒ�–OâúÛÏqÛ³nåí*ËfÌ ¬m>�ŽÎë|Ë/Sç±ÿ^½8â A˜‘È_’»tŸÎ¢ùU|üåÏÂAÕ=¬[¶9ZOn^6Î&Š’$!,‹ùUkÉë»H`9YÞ¶û8‰�]Ж³o}MÕ5É,(áÔëîDU5‚”÷@û}‰FL=ûRdE¡¾¶‰nƒ†Ðe�}6ÉÈkÃU£^ÁŒFHLMÇ4 $EAVUNºòV=s8 É)h�X4Š$+œ|ÍíÈŠBCM}† £Ï�ƒÝnz­_iç>£Žh _ÿùv;ÕS–$ ôÈÎNEI/§bA=hñß´IÎN$7¡†9¿þŠî•·(]&É‘¨Eßý÷æ¤+â¦'«ùuÖZ” Í«pÂAùn¯eDkÔ^ÄWŠ-e>»§rúQE8Aƒ¾ýó¹úÁ+·]À/?N 5Ýû·ZÛ!9-ƒ¶íÊ騣7uÕÕLùq,Uðà W°ÿ‘ÇòÚãÿaÊßHжqÂá`á%=Qà_ýO_w ß}õ�ÜÞ�Â|?W><�û^XˆâW�U‰§Þ^Ì1WMaÂì†x)™Z*Îóòâí=¸ñÊ®d$x@’QUÆþ¸”ÓïXޝ÷µ\ÿÈã·+%އ׶ƒá¸šÝ‹+æP�%5Ý�cîzùd $Á„¹�dµëƒÏçÅ´ì�ÞÕ¿éÕ–eƼõ OÞto<4’ÆÚ 4Ö®'ÜÜÄ™7ݾG�Ä´ï¿ààSÏᤫneÒ7£Y¿r±h„ÕKÑ}P?ÚõèÀƒ�dØ'ÓÿÀÃ(h߉¯¸‰ÔÌ\>yþ1:õß“O>‹5U•Lúæc&�M$ØÌe>ÅagGÓõ8kØ� IˆF)íÚ“ ƒN=�/_ž”ÌljÖ¬`iÅÖ.^ÈÊÊ Ú´ëˆiñh‡À²,|�k–-ç³Q·1â¼CÈ+ÌÈþ>ÜüGϵ®ØGR¢ŸóÏ9Š¯ßº�›/?…«/8ŽŒÌÔ-ËánzŸ �âÓyò¥OØw¯^äçfòðïpÁ金‘ž‚¦*Ì^ÑÄgã¦qÈiç!É®—¼é}h;YÕX±h!Y‰Ì´Œ8)K�ªª„B!VÔ„)h× 3f¸Ü•mº/Üã $T�ŽØÂ�ˆ)G8H²‚âÑq„@ñxâ*]6’¢ háö–÷øü$¦gbÙ¶Ûî7]ˆ$‘’•‹¤j¦»(vµ4ìøX’²1Uñß|µ.þÀ ìTOZB—оÇü4u ‡ìÖÄ:B $™~å>>�9 ãäcÿÐc•e‰úÚ}öÌ#ŸãÆÇ®æ–³ƒö,d@�ttNfœFdyc HIro�ƒfðÚýýHók8–Àª�²G¿Bž¡p÷† ?Èþ‡ìOScä/Å’$a6e�ºÒ¥W¢QƒoG¿Ïiï`á¼ ‚M œqù5ä¥y˜zÌqüüí7 9ì°\/)á¶YT4�|©‚)o=Ä'ïIï®Ü{C"aƒ�‹$Á;cÖÐéÉùT­ ñ̇+4U´Š ÇÍáîK;SZ”H¬&†ž¤S³!ȳÏ/eJu.yäiú èG°Áíû¼-áê-]7ÇrX^1ƒ¾íýñÜÖ.¨w­JØ¡(³WªtÒËnñ’ÿÛgö߀„XŽÃY·ÜǾǞDc]# IiX¦MnÛRl|Éét脬ùQ �X±p.½Kr�½DS)Þ±OÕTV-Y†HÈ$3¯ÀåÓðŒùǶ7#Ðmú^�À%Ðnü\Úìspy5Ÿ?ÄÆÏmÇÁŽÅZÉg-ßû÷c‰?$ñí ˆÖþ;Ý(Ø&tìÞ�7?òlˆ��èG6’%èZžÌËfP³¡‰”äÄÍ(ö›BVš›# 9ò@ê6ÔqÓã×ðb†—ÒnÙ²W6æ4¶þ8nd(Îü”qU¿T g[Aƒ� ¹Þ\Êw\„î{…}†¢®&òǺÍ-�Àˆx}>~þæKBMÍ :`(•sæ�D˜?s*v§ö¬]¹œPsÇæy›’pˆ �¤€LjðG¾~Ï¿3ƒk/ìÉá€åðä+Uü<«I’ˆÄ׎šßº¿ª¸Ù§I\qj ÷\Ñ�±¢zš—%•¸ùñ%„rç–§&�¨Œ‹¸oO[é.ÊTB�MÔ®¨ ×±©`íz"^B€¬)¬]ÕÀ#“¼’R·©¼�Ø~Òô»„ãêÜ IE’=H’ ÈØ¶�‹á8n¥€�ºžœea™fÜ“´ãzÇVÌÀ¶,dUÆqÀ4bÇ-ÅÑ<†{m;µ#´Q4…Y?}ÇŠ…s‘5‰æõ ¬[¾IV[½5I’‰›XUµˆNz2kBF,JbJ6ÝîÏó·^�æõrêuwaYn­´H’‚¦ûxÿñ›iïoàäSŽ R׸™BàñhÈ^�hSÐm� /ã’ñ&%n ÒÐ"9àÃëÕ‘�•+Ö’™–ŒÏ§Ý‚× qF»ª …yüå�8턃?q+W¯çögbFbè‰ |ñó"&N«àægo ‹!�¶hÕx–Ýò ÃdÝâù”ÑŽÍŸ8ªBå’•$f“˜œB,'‰m·»ã·cýÑû?ۮňoùó8™þosçÂq$œ­(•ÜéFÙíeRZÞ)µóªVÑ¿_"Äl„aSZ”Bž§ŠÙÓ§2ôàý1 ñ‡”¬(ÔÔD9ì´“HJNàœ;®àáëLÎ=¾”g?\ÎÊõ1×;ÐÂdþb| Ã.ú…çïèE÷N©­šÏvm„½úðÂ�näB¢‘Qtø¾ÔÕFþT@·¶.ÜfÌGräégPTVÎ9W]Ç[Ï>My÷Þ,Y°�n} x@]1ö­ƒ» 7$/eI«¨ó(w>öJ’øä顤'k8Q‹³kyð�ª–ÛÖ½>n2ÇX¶`ïž©Üza9ûí‘…qP½ª_æ?OLcìâB:ÿö9p(¦a·äí !ºGaþ¬%YA»¶%`ØÛž§ÞÉpÙºs4âk³7)i)Ñ0ü�î)ÿ¯à†"“RÒøúµg˜ùÓwÄ"a>í<RS‰F"X6(ŠŠ?)ŽD’Lbr*HªÇ‹/!Ë„.÷áËמ&9#›½Ž<žÜ¶e<5âBN»þn†/Üq-é9ùxvæp:ý"^¿ïFºô,Ò²óÑ}T݇mÙ­áÊÌ6EÌž0–Ó'²¦jCN8 _R2…I)d´)ÄqlJºö  ¹†\¼>o=zé‘%<~Ïe8�õ ÉqË}.5MeÕÚ <ñòh–®XË=7žCYa–í`Z6�<ú:3f/bPß.\|ö‘¬¯®ãÞQo¢È2Áp”óN9„¾½; ÿþy¶ƒ'%‰gŸx‡´”$Ž8xOž|ön¸ôdR°£V7i¼òùdN¹êFÒó ¨ß°YQ�e•Ä”TjrÙÞuuP¢µtl·?ÂÜ™’$›©s—�×þP·Ûžc#I»é¶'œx:àÓS¶m’R¼vêOÅ¢…ôïï~îØZ’‡ò"‰Ù“'rÀ°ýÿr,Y–hÅØïèÃØP½�›½�ï,çôà ¹ë…EÚæè¬®1\V¶,1µ¢‰á#gðöCý)ÈõaG·‰EȤgï?)™¹X¦²Ìž‡�ˆc;„›šIÏ-dè)‹„65Ñe�}é±÷�ئI,& ‘–Ó†ƒÎŽiÄ\5/áŠOH²ŒªyÈjSŒ>ýbÌX Û6iª­áÙ."¿¬#½‡B8„¸wh )éœqÃ}(é9L¨�‘ '“a5S¬n @­Å¯Ø1‡�Kxð¶ ™}âuØ– ~~üâG¾;…cÌf‘:ÔGVv:?L˜É]7ŸO^§v ?ëpιêAV­\OqA6‘ˆ»¨náp(ªÂÝ�½É€ÞéÚ«œpu=Šª3\Ùà©Ë"¼õÎg <üXªÖ×0î¶+9ÿ®Q¤åðòW“ž›O4bÆ�ßrùc¯±¢ríÛ¤ãOL ŠÄLª®²|åjÖ4Úì“ÓÆùW*ÒíXlm�òÅ(K’„a8´ïÔž1‘TÖ­i¢ ("˜K’H”Ö³jå*JJK°¬ØŸ“€$ I@S³Áá'Ÿ@íÚÕ<ñÁ#œr`WœÞžv¥)Œ8¯#u /Œ^å‰_f70|äLFÝÔƒ‚?vÌv›X„LìQÄ u•<òÀåèžÇé= ŸÒý�a–$‰P(Ê�ÃŽaï#¶ãÚÝÐÜØ@8lpäég1ôˆã\‘¿$!�¬’¯.dÕwÏðø«ïâóz¸iD_ró|Xu†ÛBÌ£ÐPå‘×—‰9n.KltÄ%$â‘)F>_IÏ®ét-KäÉç+ø®2—aG#¶£;Ø ÓJ(©¯­§vÕ<Ê÷MËÙåòÉ @“Yº°‰µ±l†´É'fÄb×û&Û±h„h$Œæñb; !„›>r,W[’\ŽG4q›/ØÐ†`ScÂß¾;Ãnº§ÉࡱŸÓ°aõ5¨[¿–óï{Šh8Ä#ŸÌÂéiª^ÉàâÜ8 Ìý®�¤i,¬Z…š’K )Ëtû ÿ›˜;ŽãæÿIOÙ­W6ÈÉMCJíÄŒŠ‰´Ë†ˆ‰c:¤døéQ¸–ÙÓfСc)‘ÈV BÐŒqÖ5Wñ~j:?¿r-Yi*Dl’½ OÞÑŸOá±·—#áŠg|òS5µMSxû�~äç°ƒ²"aÕG9dX{2Ó–qõ�çpö]/³çà>ÔÕF[™—®4¥M )…ãÏuå:-ÓŽ7>·Øó€CzäáH47ñWÚκ.Q}�7ºŸÏÆ,àòsºqð�|ˆYX�f«è‡Pxí­EŒ›^_a‹MdîÜð5ñꮦ�ŽOÏ$•Iîu.WŽºž¬¬š݉ìÏúo/!Ðu™ùK«ðD—Ó¥´Ó.Ù?Y T‰)óÐr÷'11‘p°)®1ü/ŸÉ$!Á/�¢ }gº>�X8WôòaD#­‚"ÎópD ŇV’U¼®ÛqKå„,µ.hEÜè­ãÙ]îÚqÆr寓÷îËœrý=x|~Ûr÷“]㜜™ÃAg^B4Ĉ+j9NKižÔ*2AË3%9x°1…ÅvUR R”RÑLºX„"ƒŠ2T×6°GïN ¿ì$@â‹ïâ��¾gä­rß}/ñêëŸ#É2)I ¤§%ÆU¬â5ɺ‡ºšžzõSF ?�ìÜ " AdEÆq¼‰I¼5a?O›ÇÑw=ÎO¯¾ÆÜѯSÖ³�ìÅ»ßA»^ýÑôªÇOayWfMø�ÐúåtÜ¿'XK>Ý+&˜·`¥]Ñta#Úº8Ù�í!ZrÊ-óó– ®ÿ£ q® íº`úü9ܶ ^%Ë2½Ëý¼=s±ã�Þêüf‹AjsÖi4Önàâ{Ÿäá«Û“›éGv·^Ü™º“7¿^ÓÊþyfgß<�ÇoîAû¶‰ØÛee7Dé·G[®oXÌ“^�Gù=û÷§¹9ê¶ëÛøe[Vé/³mš45¸&²¢ü¡ñ‘âÂ Ž¤‘®,Ǫx‹‡^x™šº0Ü8€n]Rpš]–j«AÖͯçé–µ ˆxüTU =ÉC~¶ÎÀžéôë”Æ‚%õLXšÆÀã/æèÓNÁ£yh¬ß vùö„( ¬¨\@Y�žäÅ Y»\>¹…晕¤áD0,ë_*²9„ã û,™=•ïß~�²ýè4`0²ª …˜2æºï}Þ@Bœ]­¶.d„c#É ²$ÅYØ6H2ª¦»U’„mšn™‹¢º½�%p,!$dEu5ž%À2ARˆƒ¬[V‰¬((/ˆáØ8Eó€„Û"ÕÙ(•Û2ר¦‰¢zZŸYÛ¶Zu$T\múF[gn,4Ø^êœlK¢Cq_-[M°¶ U‘1L›´ÔDü/7_}:U«Öóàãoqà¾}IL�‡“q²Gã™W?¥{§ö؃hÜKvxXÒ¨óÂ[_°÷°#hŸ•É2ÕKBqG«×R½z…û}d·Ù…ªÇÆիH6ÈÏÉŒ7¾p¿—¢(ÄÂa¬¨¥`¿®ñ|²Ø�OÞppëùÿ'Ã×àPÓ„Î}ûñå:áú0~¿Û´Á²éÒ!‰5ŸN§¶¦�´´”?,�ÚÒ¸B‚!“ oº†Çn¿�7êO‚_'- ñâÝ}�•i¼úùä¸Üä˜)µ\r×L>5ÀƒÓb˜ë£2¬ Ÿºˆk®<‡žû�î=:P_·yþu‹IÚb_âÍáêVËšB©:�ÅŸßÆÕwŒá؃K¹óªàì&·–»E\’%P$n}r> –…[GJ Èôî˜ÄÑûæ1t`Ú'#0¹áž_™ÖЇ›^xŠ‚¢|B�‘HlçdÜkd™°ªr6{—Zµww5OY’Kе, çóù4Ô7‘˜àÅ4w½Zëí G€ìÑ™>öK:ôD$ØÌŠÊy´íÒ›I_½Æ/¡­ÝÇØNG0qîi$Ÿ{:½æ2>zá)Rs غr1ªË�èêÂ0-ÒâeÒR’†)=ít.•ºÚ:jÚ4úö*E×t;3ø2ù°Ã²öRÒ~¾»PQY&Ð)-+Eó–±¾¢\Š­qh‚Ü4iî6­ ³{} -$21¶¶¹ô¦k)žv=—Þ±‘æöB–‘üñçC¸h^.H¶Ö£(ï/kaþÍËٹۇ쒣š©Ñdê”bî¼ÀÍã?ÿ ?þœ¸8O”ö›A€°Ð-•gYõóì¯/ä‘§—sÛu#¸î‚>ˆ��0lM8<×[–@v+|üyk*:™2"…›Î/æÍÿɪg§ðÊÿ�áÊsÊ(ï—Ì’å üðg•t_íÿ�Œô,:Ú‚˜akÄÑ„�>â ¹±™Öš�Œè—a2:rm9ô¬%;‡VìW_ZÝ$3'žÒävUT ¨N;ºRð_¹Ù.•®–f«¶3ë¼+((ïÏšOÞE–U„�PN„‡ËÃg¯ü�çïÿñÉ),~ãEþtÍÙÈŠJåúüû‘{qÇÆñÙKOñú£¿#³W +Þ{�çw –ÏÞýSº;ÛIHËÂÐuvnZÃã?»”Æ]UÄ&&ó÷_ÿ„ÍËâ�O¤fÛf*–/$è÷ó䯮¢cO#;7®åß�ü–œÒ>4ìÜÁ ¿ÿHþó1ž¹óLScýçðÚÃ÷�ß»?UWñâ·"«Îè¤}ndÛÿìöpî/~OZ^U]2ËÀq?}”>³~Èø©Syê7ãVQ™1Ãúñç{®ã®Ÿ^Âî[’dóûûýAyò5.:{6ٹ鄂!äðâÕårññÖ º„¹?º�Âö5ËiZ»˜ÊE«h¬©&5;Ÿâ!£©ÝQÁš�Þ`Ù»¯ÐÕÖBbR}òSÁé$RDG�äTÙVUCÈ™HRJ:šnØSÓÿ¶#¶“>e[™ “äT7±9X³i-£& L�ï``‘–µë˜1çà©Q_¸~8`$²¸ä?ãæöGxòþ±8•x·Ä£·¥½Kç¥�‘e E‘xíÓ=´w.çí‡Çáq©X¦]ÃðiÌ>¾ÕªàÆ/áμIyïBÚZ¾¾ XÂÂ*–¬’ç®Æ¹ù®ÿÙ³è8yøÖá$§y°ºì`‹ý9qeY šÄ8^h %½â@‘ìCØö-Éä©§×rÇspÕ=âøy3ðw™‚úQÆ!p¸djªª1:«ÈÉ-ý»¡Ù�Õ°¹ßüòÑa �â�‘Ý0,DÐ$L…aX8âÝŒ*‘ycýJ�mûCÅAFÜ(„eáˆñ²kóZ:››Ðu K6/ù„\ý+úŒ�ÊŠ÷_cì¼ùdáko¡WÿaÌþñ¹tµ·³þ³÷˜rÖ…d–ò¯‡î¢vÇÖ}öSμˆQsN$§| �Þx!�;+èêh!13‡ÁSŽ'>%…U¾IF~“ϼˆØ¤8ZêkXñî¿:óDÒ2™rÖ�IÉÊç7çLg×–õl_³”PÀ�7>‘„Ô –½ó2Óêtû2s'\z¿»`>²¢à‰K >9��_ü+³.¸o|†¾/Ù‡IV)4S×–NД�½dNœ�K2Ø-Õãñí&;%–Sç�K"Ôí‚’�&êMKâ±Ç_ÆårpΩ3 ùá`, Eèø=9üîÏ�“SÚ�Þ£'ÒÑÚŠ÷^cÝ‚÷–Å I³~ÜÉxââ™vÖ�yù�wâp{øÁ•¿`ã'¯Sœ“BÏ|BªÂ–Ê:¼é½pz<øÚÑ:ÖÿÃá…)D˜fô«ßíw&”#0 4j ë_yüÁhI3LÁŒIÜýÖ*ÚÛ|8aNê¯YYɲ]]×Üz Ïü)ŽK~õ(÷ßÔ›„XÂ_´…ã¦sêŒÜ³SûJ‚z 98 ¡[X~�8ܬY]ÇŸ_mFä�Ä_¹‚¼Â|:¢¹Çß­iUU`ËÚåôJ âŒsavG•3IJ@ñ*¬ÚÐF[[ˆ©ã3Áhëd‡ªBkS€�VÕ�›äaô�”¨ —L>(‰§žþ„ö¶sp:ä½�Jÿe°M¬2ë>{�˜Äxv¬[‰h!?Õ[7¢(*‘òu†)P.Üžº}IVðÄÅ „°8<^º;;1M“ÄŒ\B o|ŠjW€»ð7�³à•§yâg—2ë‚kPœNb“P.t¼‰Ét··`™&no,  tã‰�Ç0tB~ªS¥»³WL§\w;žøD$I"%3�î.‹�¿›„ÔLº:ÚˆMIç´ëï@q¸0 #ú¼û"ˆ–q<Èqß©P¶S£åýû³ò…T:öøHHM´žt“ò¢ÌÎ�Ôî®§¬w)ÿ×÷ÙE³¤ª\pãÍÜvyw>ø"¿½e’)‘šìâþ›ÒÐâ�ÅÍÌ?>›{¯ë�Ó)cibŸ5€"�å×™25�úúõÉMïÌëW¯¦ÿ RüþoÆ‘,…#7Ââ¦{Ãã¿qñ㛟á¡[‡âÒc�üå×Ãø`a'LÉÆéP±´û;%YÂhÓ˜Z⪸çò38û¦ßE FÌže…½‚VU™˜xŠd²ýó²è_�ÐR³�¢‚Tž ©ÉnÌ–R¸¤â¡Â2j¼‹ö¿h+Á‘œ{çCŒ7 _G(Éþ]#BEÚÒØBwã&ÆLM�pNøÑ„¢H˜~�5[ü,ÙhÒÒÐMJ¢gŸ U‘Èöš¦×ü~Mívtø§«ZØQÕEiI,;ÿÛ°p%xSf°~ÅBŠû”Gýƒuý'ÁH•¶Æ:ÊGŒ'³¸/{v7¡: Ÿu UëWàŽM`ÐäÙ|òÂS$fæS2l.O ŸNZn!ú�ÑhZol"%ÃÆ¡8ÝÌ8ïj>å)^ùýœrý¸¼±|öÒ_i­¯!93—q'ŸÇæ%#Ë*k?y‹¶úʆO`Èô“¨¯ÚJß±SAR0 �²aãñÄ%ÒâñøÚÛxé¾Ûpy¼ôÊ�éó(6ŽÄŒºZL:ób¿ö^ºïvT—‹^ý†1xÚ‰¶Pâà‘ š¦), EQðÆÅâPU,]$³X*ÀháøÔZÞ|õ|�—]t2Z§/œÇ  :YÜóð;Ä'&1tưL“æú:>åi<¡Jó2è“™FÁÄž@rR±qqx<^‚ÁsN˜GŸ’$\7�Ž®0ëŸ]ʱbm5M~˜˜W€¦…ÂÚœthÏø?|-XaMù˜õ)G`š^�LFÑ@Vnz“y'„û²’*è_ìàÃ�ëÐ�Ó¿UêŒ$ˆ‰Ëíå²_ÝÉ-W´q÷Ãïóë† B‚ìçÎ/�n#¬ÞPËôi½ìb(=ëÊêű (Ià“•­ÈŠDC‹Î²Mí”öMÂò›(DrWe¦ Žãý÷áœmkÉÖÙ„&IèZˆ¤Ì\N¸â Ùù´º¢tè8 ûÃ2-Ž»ðzÚëpÇ$0zîY!èhn£xÈXЇŒ%äï&)#‡™?º„EFA §^{vW’œ™‹ÃéD Êù´75�œ‘M|jÝïý‹œòþL;÷*ZëkHÏë… �–׋Y^o[䂦ýð Û„nYÿãh®Ý…©k$¦gaè!¦ý𠛜¤«ƒ¸ä4æ^ösöì®DX iYèzhïg=„5—eš¶0NLÂ×ÑÁ¶‹i«ß�ÞÝi/H= ôíׇ}ϾúW]rñqÞhå(aY¨/lîäÃwÞá‡7ÞŽÃÃî-ëxÿñßÒ7ÍË•×^Éàa#¾´ Ûwì ¡¾–§�…hFw¸0ƒ"S¹»‘•‹Qö黌œu¾ö6dË OÂß¶cüû §rL›¯Á.š iÐ{ðpÞýÐCwK71¦nAÈdT¿^XºžºÝu¤gd¢i‡–uÀ{É2Z0„âP¹ãOrï�×sí¯ÿÅïo†$)­!åª"Iv»�– çÎDïòZžzæJ>xn(EC&RPÒ!õ»+Ù½­³méòvʳº8ïÊ””'�fb4‡�e©gìÅAakr*¨ðÈ_ÖðæÚÆžq'œúLC|!U똀8Uغn-½24œ‰¬.ãk=÷·o‚—ÂÆ­-˜ Ã>i&ï/»…éSöµˆØ¬Sž8'Ç�Kã£-ȶ`¼¿hgÎÉ�. $I‚�Á þéľ²ŽÝU;éUÒËf©’ö¦ÍüçÃ)•SÂ¥Ð@LKGR˜–… —š�0MLaÙ+×03@Ônj³‡ø‘$HÌÌE× ´P„ÕK!%»=Äïë"&)•˜Ä@">-‹îÎNö©ý^ÄÚy>–n ··áMJE’"%ET³EHh¡¡`�Ø” $¤°/Yp¨ßTX&žØ8ü>ï=v?�Úmô-ȤOr"éùÉöü°§–=­âG¾Áèa}™4kþšFÛ× 8ÁÆ`�üõ†N˜F^ÿtwuñþ_~ÏE'Nå‚K. ¿6[�ø³#¤FŠ¢°bå*ºÚ[>¨7B×£­—%›Eméš fϘŠoÕÛ¼¾{'³~t_§ý=£ôПûør˜–À´8ö½�$´�IQIw/*+[08t4AQ®›X¨Ø°‰¼‚lB¡o—×jçÊ(.'×ýæn~ñãV~÷ÄJn¾´ŠC —”:´ë+²„ÑbäˆlwóÄËŸ²æ³Oi[šŠe�›v2�>F÷OäÄ)…82ŠÀ§cvØ~^åkiÇöàS½ZÛüùŸ•|PUί¿…IÓGÒÒdss™ð;75ÛÖs\±ÛÎO>(Ý耫5œ©¥” ÃÂ÷chkð‘”»� K0yXqÞmtL°x}Õµ>zåÅÙ”¬’„©›$¤Å2 £“Ý›×RÔ»ËêWûÔ9…DIDAT/S5¬p¾G˜oÂÿfTóÒu½Çw/ûO©Çulé‚`jZ”åKX¦íç•$B�%ÃÆÓkÀB� ’)ÑvàEÚcõ¸§$c†ùÊ%Â)‡‘±/…Ï‘$ÛÛó˜Cø¦Â2qyc©Þ¶™ÿ~šLÑÁù§ÌfÞɧ!«ûN¹O?ý4ï½÷�!•7ž›¹3ÇÙB§Û“Áß^YCSC=s.û)¦e²}ÃjJÒãøáùì[šq¿q¯„ÉŠV­ZEJb,…9é=ò“Y!ÐígSÅ.®¸ñô-cþy°¾¨”ASç t£‡zÆ£ü—õå#ë âØÆw.”%IB×tÒ2É(âõgÀÈ\ðÛ¦mG¢‡ë–­à¸yÓK¨¾,Ë„Bªêáþ<Í�W_Íu¿~•?þz,"d§ÊªÜW ³SÃírqå%#@7  ÙƒÝ� n'tM›³úkúR#óŠšêæƒw«¸åÑÆ�ùsîûÍE8UM G™™ëk R´£½¹›ŽÚ ˜šúÑ7ïJ² ~�mõ*i#�ž�MWÌ@>]±–“NLø‚ ›�ÅÀò&KæõM(ŠÄÖj?Ÿ,o¦WQ„Ó£ì-3kt2¿Y´�À¬“lªÉÿÖ¢ÊÈìÙsß~5mÅ�þ½ÿ5¤ýŠ}ìí<¦iáôÄ€'Î.7ø…B hÏ~×Ù{mi¿ßtÌWÃ2 RÒYðúsl|åÏÜý«ŸsÜœ¹û´×æ�–hܳ‡�?þ˜Ÿ–ظ®¹êJV¬«à¶›/Bhžß />õWæýø:œ±‰˜†Åòןåê“§àpºöFgïÿxB„ƒh5V®XÉ��exãÂþd;»Åár°}ËntÉCqQ/z•ð·ÇÿÌ´YsYòž˜W:h8F(ôµ2^þ‡/‡°ìußÁDØw„ÝHE†ÞC†²¥V��n“´˜&Ãz{i­ßA·Ï@>Lš ,˺‰%d®¾ýNv«3¸óÁuHd)ÊÇ{hײ#¼�¶ ¦ß.òޤb,Œ–fg!,EúZZ¾À&®�� †$ñ‡‡7ðÇ78í¦G¹àªËÀ’èö�Y� €8œ •[*ˆ äeÅ�fU-Y�2M{º¨¤�YXŒ° Òû�å“U]ûšP ›°- w¬ƒãFgØû¿}¸d�Mè¢HáÅ’mÂ>0WÇjwíDu:1-KˆÿmGa3MÓÔGížV�mßv¸bãX»ðª?z�ûïþ5ÇÍ™kÿÖjEFUUE!1!�›o¾™>}úP�ŸË|�5;|<ûÜ›ìr–ð÷¼Lqß�ô6ÓÐØU±Gg-“&OÆ6/x EÒµêêêØ¶}z÷eoÑ !8lض‹Ô´,JKŠ1 ƒ§ÿþ g�z2ÍÎηþÊ–e P=Þÿõåô‰ÛWá˜Ê’, Zô4”z_ Í ]ÈÙž¸C:Ãú&à Õ³³²—Ûå ý¶�™`P'&!‰[þô+»&qÝ ‘=Ší×ùJ¹$ÙZ³�þ`›Í"žß$ÊXÛŠ¦&9©ièâÄ«–²°c?ùÃsÌþÁlº}! Ã<*…$¾ àpÀºå‹ÉM àIôbÖQ]|[–·ÊªMʹʽHÍÎ!Ðí£xØXÖ4$ÑÖìCqìû½…„ĸ)Äzló;ÀÇË[¨ªñ!9#¡`j Ù‰ôI¬§bùB‡­Å=!ñß½…‡Û›H£[VT@EïÞgš—›=5Õ|òØ�Üù³Ÿ0yêt»Ð®OîõzéÝ»wX{µÈÏÏãÏþ3O¿¿…Kù'Ú›ê™uñO‘U’â⃧þÈgžBNn¦ùås`dÒß°qzÈÏà~%Ѓ}02ö¶lÛEIYoœN'›7ofóæÍÜvûí\vÅœ8u,>9œ_þ¿¾|˜úÓ!ä›3º„„¦dd¥£¤ôaÕ–›™ �¥ RÓ�ä&u±fùrœÎÃ[çS–eBA ‡ÓŵwÜCµ:‹_Ý¿Mä簾¨i d‡ŒåTxáµ]\û°�!§ÞÁ�wÞIjZ ív ѱ�|0È’„¡[ìÜ´ŠÅî0£ÐÑ}©‘¥õ[ý82Jq8BÁ©YÙ�1„õ›ZNeŸ¬,IͤY¢±MgÙ†vPåèSX‡ÄÑV±_·IVˆÔNýßvd7+¼‰k›aa  ºÜ¸¼q(7BV@q º½¸¼±v³$ñù �qái'2aòÔh°ÕW�ÓHŸ“eÓ4ÉÌÌäŒÓÎàçÆÒü¬|û9<ó oýé6&”e3ÿœ{}Æ_¥u­]»ž„X¥Åy͈T˲ŒRÓÐÎðáÃÈËËã�Àëõbš&S¦ÏDnÝÍŽõ+pxb0-ë;ÿÎÿ [¤Ÿ~¾sŸ2X¦E|¼Lnïa¬Þô!3gÚM·,P�‚ò<™7–,áŒsϰ 2FÈŠL  ‘”’Æ/|Œ__q¿¾ÿîüÅX„Ï@X‡îcþ6°Ç—@�sâó…¸õÁ-,¬-ㆻïcÀ�Þtwøý¡c2˜ë@°ó“U:Û»ðíÙÂà“À8úŒW²"#ëªeR'öÃ2LtÃ"6ÖMZ¿‰|¸ì&NÜ/ .…ï`ÎÄL¬mG–l6ªO–51ÿ„|»L )ìuFÐ`âðL}wµ»ª)(."�Âþ¾�–…âpàôxÑB!ö46ÒVWMÝ–5tì©Åé�!9»�ÔÂ2òÊú³gÛb:k¹ü*;¯úP8ö§ëܺu+‹?ÿŒysgqÞ¹ç"Â,[PŒ?äö_ß�×ëeÒ¤I 8�„„„¨9r 9L“¹|ù sÒé•›‰Ò¢¹\N'u�Í4u4h ‰‰‰$&&FÛTZÞ›©#°|õRz ‰eùŽî¸�,6Žàø9ÚÅpLËÞ¦èB9 C‡ÞC†óá7¡ö.‡Ã0!d2¤ÌË?VR_[GJê·K�:dY& âr;¹ñÞßñÐ-w>ð?½¼Š!! ë°/z²„]§ÙíàÓÅ <öFˆ¤ðÛ_ÿ˜ä´T:Ú‚H’tL��*ì*4 ëv’ám';»ÀŽª?ŠAÛŸÜX×F½–ÁÀ¢R´pðŠ®Éé=ˆÅyì(ìä˜/Fa›0}T‰On££Û6~²²™]»}ôŠ·#…ƒfÈ")3Ž‘E»Xµf)½ÊÊìòƒò÷cõ?ô„m®uÇÄÑÕÖʪ�Þ £j "@NJ³ËKÈœÔ-è§¶®Ž­+ÿÅâO_aãÖíÜpΉ¸=Þ/ Â:àÝ¡±±‘|�á#Fpúg�=æíwÞañÒeLš4‰¶¶6Þzë-þö·¿qæ™g2cÆŒ}Œ$I455Q¹c;³'öGñ¸Ð:´pî³]„¢bÇ.bâ“ÉÉΊ¶!"Ð#ÿÎÌÌ‚m�hºVL"4‘=Ó¥/ì 8Åá$¬%3'$IBu¹04íàRò0A 8”'9f„²N�*.+æe+‡ÝÕ”ôÎ@2ì|åâ<qr[7mcòÌoŸu ȲL( ŸœÂµ÷<ÀOæŸNÂ_7pÕ%ƒ~{å|$VV–)P<*B‘xî�jîü{7ó¯»�3Ï?•®v“@wð{%Œ{BU`ûÆuôÎ1‰Ið`ùÍ£êO¶ƒZd6WuŠ@bz:ºì\Ô”¬,š�e¬Ú¼“iSãH$RZGŸ^±,^ß�$Kl¯ °pm ±én6¬n¥º¦›Óf梨.&òòÁ‹ Ïéë þÇ„@’%œÞXvmÝÈêמBÝSÁÏ:ƒÓÏœO\BâOûüÓO¸þÆè׿ÿAyöG¤¿¥¥¥q÷Ýw ØþêHîôØ1c˜uÜqûÌ?¯¾ú*÷ÝweeeD…©$Iìܹ“šÝ»:p^$e|/T•Í;ªÉ/(ÁívGûÏmvV˜„+&] ÙÙ0’€P°»Çñ‡g@ aáty’„¯½Ë2q{bíÚÙâÐSUmñ�޵÷Û¹éÍ�Ä$¦|-î—]çP�ÝwŸe‰pôõW÷�cJ(ëºNJJ"™å#øpùK”ôÏÀ4,âTF•;X»|SgM:bí�™€?ˆÛÃïžþ÷üäZ:þ°”Ÿ_ÞÉ�æaÌÂÎ]Sl©èâþgê錟ȽÏ\GqY -Mv•˜H§ééög?FM¤²ls›oYµ˜sÆ€"c åh·W‚å›|ÄôŠËíÂßiû|…iáq;È>‹OVüži“L$Ÿáå´Y9,ÝÐ ð¹ëñ­Üó×m¬ßæcêðdΙW€è6>0�ä77S½£Š^¥…Á#jaù„I’QU'ŸüãO°k57œ;Ÿy'?íV¤DaËŒŸ4™ÅK—c™æ7Ž÷p:�8�N¬ðâ?º—$ìû÷ÐO:é$êêê¸ë®»¸êª«0`@ô÷¥K—¢*‚å½!}Ÿ…&šÆŽªFFN›~î}…D¤ý �{™^VøoªW|„Ûá$ ëŸJùȉ„ÝQ—Û·5 !p8½Ôn]Ǫ·ŸGówc:éù%Œ:åT—Ë4öÎ…–ˆŽ«È½#Ïa›ém!n¯i"ûmzQ§ËCkíNÞýÓíÌ»é~âRÒе�=×J=ÍÚÒ~®�F¾°¼�<¿Ô#Vfï9r4ý-rŠˆõå8f„2بªP2`k^û'6ë“eÉ€Æ�>nT�ßoQÍÑþÒ‰KNåæþÈÏÏ;“ħ6så…0»uäÃà‹°,;æIq;Y½¡“›¬#yÀøù]·"«*��½Ï(¦eáp¨8\BA �ðƸÐB&ºþÝ•dü2ØùÉ í­í´ìÚ@¯¹1߉?Y’e¬�ÎæH™R†iX–��%†An¿a¬Xᥳµ›øø½&lIE•hÚãÇé”Qe -œÃ¾©²;z�”DGxõmŸË ÌJVlZEQŸr,Ë�Ć »%È&, WlK_†ÀúùëOЫ¸8üSXPöd ë!²$}�äë"ê>Àþ¹¯®¸â *++QÃ÷�ÌK«W¯%'#…ܬ4LÈ6YQº:ºhhñQZZ¶Ï9=ïßÑÑÎç‹—RÕ%lü˜§ŽgààÁ,]¼ˆÿþ;$ÅA^ŸÁ˜†Ž¬((ŠÓ°ç¥oðÐ(ªƒ®–FÞþÓ¯IÎ)dä)!,‹@W›­]"!;\ö\h訦¡ƒ$¡( †BVHŠŒ©k¨N¦®ÛõçN;Ý0PT»¶·ešh¡ ’êIFV�ð݈‘…‘(ª‚¡iöb@–°ÌaKX{—${Ž1 dYÁ2 ‡ƒH"YqbÒ^ŸòA^Ç1%”%YBAYÿA,ø{]�Aâb<Íͤ_¡³³ŽºšZróó µo-¿ ²"ã÷ˆOLâÖ‡çúsÎÀí\ÇE?‚ÙqÀ±yPa¯ò�.…§_iàοµrém÷2ïŒhm!‚²$£¨*.·‚e�Ë �€É‡¯¿Æ‚wßÂáp0nÆ,FOžŽÇë&à?¶LÜvQv•Í•ÛñX ¤Ùõ“�¦V/ÈN™=Íìö§Ð7;C×=˜™4-DZN+ÈcËöFŽIÀ …P2¾.�ŸÛÎ?ÞªaKµŸH6CdŬH†%ˆ�Sí<!@VÕ?†w?]Œ¦Ÿæ®84Qñ§õ|»Vïaú®ÂBð £öÃ)û´åp·ï;„°,ÜÞv¬_Á®÷ÿÁ+Ïþƒ^Åvþ®ª([M­§Pí©¡*¾ìØ/ÛoYEEEÑûɲŒa¬]¿Žâ‚,bã¼hÁ‘jy.�“-;vaࢰ0ÿ ׎ÿwß}€Çî¼™!C‡‘˜”ÀqsNdÌ„w¸â†ŸáÌ,&.1™¤ŒlJFM#µ ÔÖ8¿fX8].¿ü8±)œò«GÐݸ¼1a¡üìÞ¸ŠPw'5WÒwÊ\¼qI,{åILCcèܳIÍ/!ÔÝŦ÷_§¶b Å#&Ógâšwm£±r3–¡±}éÇ œyec¦…*Û½KÍÆ•”�ŸEñÈ)È’DGc Ë_ýz(Àйg“Ûw(ÕVÐR½�>“æ‚ë>x™¬Ò�d”ôeý¯²uÑ»”��Aÿ§âkidÕ›Ïàokaðì³È,±ã‡8[B›†/7?—ØÜ!lÙ^Áˆá± Y]�“®’—`ãêu• Ùè9EQøC¤åæq×_žâÉ»n&ôçµ\2¿’)°ÌC+³„sªC�'[·vñÐóu4¹Çp÷ß.§¬?ÚšCÑ7ár;éîîäz CÓÈÈ/`òŤ¸.>ãdLÓàƒ�>fÁ›ÿâôK®¤|à`‚ÝÁcj‚”¨X»–â,w‚8ºùÉBpÈlßÞA··œ¸”tM › Ã¦&ÝÄK\Ùx¬}’‘c¬°YJ ºeš:46íò#KRñ*D2?“㜩ð29 •¤wÖS³m;ÙEyèAí +8I’PöêÞn›@uºm·N(x8ÞªÓ € ~½¥('ªê@ ú{\Ï…$+èA?ßwndI’ j:«^~œ_\ ½ŠK0M3ª�Ú5¤ý̨a“wO:ÌÃŒH`쨻««©­©aÞäéHNÓ@‘ÃæU‡ÂÆ-U$¥f�œ”¸O;{þ;>>ž›nº‰)Ó¦G¯¹þŒãfñni55»ikoç¥çžã­‡qÖožFqº1Â1‡»žvÀ×IýÖõ šy:†¡ÓÞXCí¦Õ8Üz GÍæÕ,õIF�r¾–f>ùÛý 9~>!>q/Ç]q«ÞxIQ:÷\>}ê>„�HÊÊãÃÇîb؉ç‘Ýwï?ö¼‰)¸bâi©©¢³µ™ÌòA|øÄ½¸SðÄ&òæ}71xÖÈïüéVf^vmõÕ¬}ï%úL:�XýöóÄ$gм{+þý4“ο‡ÛC[ýn>xôNúLœKNßá|úÔýŒ›%Ùåƒ0L ÓÚû½¾ô›~�ïä!I†I\œ‹Â~£Y½¹佩Q’K0¸ÈæÕkŽÚ Ë2¿Fay9WÞýÏ.ÉáþÇÖ Ç9�UÓ_¼'„MBnY6+—šìA3B¼óÁN.¾»–¦„¹Üxï(ï?€@·M͉‡SÅïïâ�_ýŒŽÊM”¥Å±ô_Ï1ªO1ýñ7ë8fÏ™Ãý÷ýžÙÇrÿÏo¤¡¶§ÛùµƒLŽ$IÂ4;6®dTo(êQz ©Y¹¥gf\.'†ùÅ|KË0Èî?†%2þ6?ª*c™·[厫û1eXRXKÜÿöóÄǨÑ9ÈÒLÒsâ�ÞζÕKPœž¯Îñ¶iÎ4-ºZš0MÓÖÄMÕ۩ݺd%JFms8ö+÷…– «ìÙ¹�ƪ $E ·o;,Ëf¨ÚçÝX( í 5ìÞ°$©Gûv°{ãÊíÛÛŽèµ_¸æ±¶Ùe Ýì®XO®Çज º�Œ¹ššÞÿý¨pöù|ƒáŠma‚�#�ý[·m'àëdpÿ²ýœ˜¶ŸtcÅNŠŠË˜çÊ“'OfêÔ©ûãH0˜‚^EEŒ3–eËW°rõœZËž��k— )»?pï_Øí2 -Äáö"I �-M,ío¼ú›«Ù½e-H™Å}™vñÍÔV¬¥³©– ¯-ÐM ³�­K>d÷¦•(ªƒöÆZdY¦vËj4-DljƒçžÃ˜3¯ >-‹Ú-k@LR*ƒ�?“Qg\Fbv>�•l[òž„dÍ™Ïà9g“ZPΦÏÞBvº@’mò˜pV…e TO A¿_ËrûŽ`÷Æì©ÜŒ¡ t¶ÓÙTGí¦ÕȪ ˘=?Ç—à˜Ò”!ü¡,è7|>`q¡/„¢¨6!�n0¼¯ƒWŸYOsS+11‰èÆáM�:dEÆ×$1=�ßüå%à?IR¾” [XΘX¶~þï>t 3®¸�òqÇ£¨*›?}“¶Ú�œ|ëch~¦®©Çª¨dÕ�©‡ìþ ,Õ‰¬ª¡`8F$„%p'$²áÃW05�㯻‡`w¦ÚÛg¨n/–a`‘œV IQñ&¤±þ½Wغð]N¹ý L3„3&†ŠÏߥvÓJÎúí³èÁ†f_OVÓ°…7öß–iîÏ{Ø  «T¯_Î)S'£:í ôë0ñ !p8<õÔSTUUÑÒÒBKKK”Sàä“OfÔ¨QGè lDË–-ÃíRè[V€Ð4"k U‘ uu³i{—žpQ´Ýš+Ün÷WÞK�®ëœüƒ“™3g°qÍJ}éq2Jáò¸Ñ‚$Y9Ȱ·«t9¼ñ¤÷êÖÏߡߌÓÈé3Œ }—gn<ƒ�¿YqâML%è×Ñ‚~ÅElZ6zÐÏÔKoËdí;/›–�+.‘!'üˆ”‚RZª·áp¹1u� ¯ Y §ZYÕåA× ‚]]ÈŠI’1´ŠÓ²Š$«v_/2-ÓÀ›ˆ½Ü—vw1䄟žÃª×Ÿf÷†å¤õêƒâpŸž‹eL»ô62r vûP*–Yˆ|ÅwüêŸ�>ì(l“‚â^4øS©©ïG¸™šAI¾—ÑÂöŠ8œòÁŸð["R�î‰Y\ú«{¨Ð&ñ“{Ö³zM²¢ &¹QÓ<¨©nÔ8Y2ijîàÃ�vðÈãkøÅ_Úø÷Ža :ë~®ýÍ$§$°øÓelX½†šê*ÚÚZ ü¨.•e àÒüô§?EQ”½B¸Gôu„ `âÄ ´4ÔðkáêDß1„Àé�Ù½s'qV¹¹ñ¶?ù(ó]ã�ilöSÙ‘@j~¡�o)Ùï‘M ÐMO¬gî0¬í„°â+ÉfÈ¢WQ<¿ÿI?Òöd½ßc$Ä9¢æ`I2>0�eõ»«QLaaö¸¯…°Ù¢$0Mƒ+>Eu¹©^»ÃÔ1±Hœ1qtµ5Ѹ³Â®$)('¾öfê·o ìFª;†®öf*7!d ÙáD74 CÇ05:[ö€$áp{èlÙCSõV$Å��d�$UeOÕf|mM(./¦°P\^|­M4VU ;vLø­YÂDRdœÞ8|í-4TnYAþÎV̰vl ‹îÎV Ë 3o‰cp“Ð “îæ:ÊJŠÃýçеڈö˜‘‘ÁI'�ÄÕW_MCCóçÏgΜ9„B!î¸ã>úè£ðµÿœÕ3yíºu”f“—‘Š¡D¢ˆU‡ÊîºFšÚ|ãûDàõz:tÁ;ï¼ÃžÖv:ëv±ú“7 j:ªÇ „YѾêý �i™ôŸy ;6ñÉ_ï¥fó**W/¤­n’,ah‚~†i’?p ¦¡òûˆËÈEVR ËIÊ.¤¥z;qiÙ¨n7î¸x,aôua °$ =@×5LaêêÄVx¿-à£pØöTnfËço³é³7©Ù¸Œ¼�£‰OË¡£±–uï¿Ìú_¡i×V‡“†më14�ü�chضžÔÂ2ܱ øÚö—‘‹Ãƒ363b…:„oÌiÊvÕ(ƒääDz fÙ†”¥!‚&¦ ñý dV,üœQãG 8r ˜Ý‘x¼2²l—‰ÕuHÌJ㡟áÍ×ÞåÊÿûŽŽ·ÉÏö› àv¹p9cñ‡¼´…âq§ '3¯„WNg䤡,xç}n8û4zåæãÅ0tü¡Á�Žaš¸<^–.ZÀ¹§Ÿ�è#+àý2E¡¾¾Žëo¸‘1óN'))Žn_è;OÁ€ì°ó“˳M¼qnLŸnG®­6„ýÉ»:Ñ{›˜„®…öþ¶ß±Z(DáˆÉ¬}ûß„šºpy<ˆp̀ѡ3iB÷ßÐ�ÿz-AÍÌ…ÙãÜ[¦Q’$,Í$1=Ž‘½jycÙòŠÎÅ öYéq_‡ËCËî*Úêv2íòÛYñÊ_h­©"³|0²ÃEõú%,~þaZwoÇéò2㪻¨Ù¸‚µï>‡+&ž¼þ#é?ã–¿ü5–áŽM èë`Ò7ãp{ùä‰ßèl£lÂlž8*>{!Ë´ìÚŠËÇÔËnÅÐu–>÷îØD:vS8|"ýgœÊš7þÁæ�_#£t»×/#69 ˲c#LÓBq¸©ßºŽ%Ïþ‰öÆÝ(ª“‰çßÈgOþ–Þ“N ÏäX÷Îóì^¿”)ÿË<5á;‚¦kH¦�Çk ’¯kiŠıcÇrÿý÷sþùçãñx˜8q" ,`Íš5L™2åˆZ±ÚÚÚXµj§ÌŠ3ÆMÐç�¦I.+ÖV «.ÒÒÓ¢íþ:ز,‹ÜÜ\¦OŸŽËí¦ÿ€�üë­wYðŸàÈ*fô©Û”³á|Ö‚2J2ûúß³éÓ×ÙðÁ+H’Lé¸ãI-ìƒ�dÜ É:ÛÈî;œ1ó¯fë¢÷�$‰ÔÂÞ$f÷bì¹?a͛ϰäù‡qx¼x“ÒˆK˦|Ò\� ]§dìq¤ä£:=ô�þ‡ C×({ñ¹¤— bü¹×³céGa1æìkÈ4a™Œ:ãr*¼Izq?Fžv ‰Ù…tµîaÓ‡¯"É £ç_Cvߌ?ï6ú:;×,&)§}S2qyÔpžòÁ©›�9¡ ¶Êá�è=d,ëW¾Ïif8@HH€Æàr7O~¾žPðÈ¥FY–ÀívÑÚÜÄ¢�–ðûðzãˆOJÂårS¿{'Í u䣲'†ú¶&V/]E›?ļsȼ3N§¤¸·‚ì‚­vðÔý÷sΩ'2ïäSp;]è†NWg]]]t´·á÷˜8t.�‡x€ùóç“‘‘±_¾œýUÛZ[¹íö;È2’¹gœM0¨ñ6vpÔmÛÀ¬R/DÊçõ¶ ¶V‰-„êP † „HhÁ ™½JX©–±rCcÇ÷Âò™È²]PÄôÌ?¡€-;º¸ç©ˆp’¢,C¼Waª!I ïíæï¯|Ž?p:B–±Ä¾ñU–8TÕë—âŠM §ßHV¾ú$»7,'»ÿHÛÜ®”Oœ‹,«¼yïÕT­þœúÍ«1‚¦\ò+„€¦�[Y÷ÎsŒ:ëJò�åÍ»¯fÝ»/0üÔ‹Ù¾ô#úÏ8•²ñ³YþÒc†NÙ„¹ˆq&oýþ'l_ö1¡î.vldÎ °ùã±êßO‘œ_Âê7ÿÁ€™§S>ùDÚêv¢k!„$‡5~»š†FÉøãqÇ%òú]—SµrªËÃÖEïQ:~6;–~HJA9²Óƒæë8¦2zBûö&<¾ ‘±™��Íå—_ìM£B0aÂ&L˜pØÚ»?"óæM›h¨¯£ù)výé}ÌÓK–o .!™ø¸¸¨¿¸g`ÚW i]×ioogV¸HHH@QòòòÈËË‹7}Ú}ö wÝ{+û2`ò\ºÛ[‘®iAÒJ0µ÷PºZꉘ¤4 =DvÿÈ’B(!(=“¼Áãuwá�OÂ04âÒs™|ñ/ñ57àŠ‰G–LSgð‰?Â2tt]£ßŒS–]>sè.²÷k:}§ŸŒ°_'¥f“?xpÇ%ôu I2f�IéøÙ¸¼± +èÁn’œ.’óK‘%gl�äÔ´è¹­-ͬ]·Ž‡ÿü(ÿ|¸Šknû îØ4ºÚ<ðË›8ï¬Ó8ÿ‚ ö¹_rJêÛ`Y<ùä“ttt�‘‘qÀwÔÖÖÊšõ¹ûé[q:�tw�¿cZLj?¹µ¹…ŽÚu ›‘dç'åT(E‘ÑýAo·HŸ0Ë0±È´JJ¦IL¢²Gðöç‹;±×Þ_# º†àöëúÓÐâ/ÿ®A’$\*ÄyÔ}¢7$IB ˜ �FæK›¨Ù¶�Âòr‚ÿ¾BIH˜†AÕÊ4n]ÃÛ¿û �ÛÖ£8] ;õL]'ð82ˆ IeO z͆�|!ïýßÍüë×—0çæ?†Ífå”�ŸƒÃåeèIç³î­gñ··‘’_ÂàDLj6z0@éØãÉ(ˆ$É”�ŸÍΕŸa˜šÆ’!ÔÕNJ~9U+àòÆÓwúi¸bã)w<[>{ÝÎÓ´$Z(HVŸádõŽ$Ëô™|"»Ö,bȼóùüÉ{ضè}Úëw3îG7£ƒ ¤c³Î´(n¦¬ÒÝÝÞõÍ„óþ�Q°W‹>c`ñâÅ8U‰AýKÀ0£m’e#¨±|Ý6FL˜ <;”ER¤í»víâ¶Ûn# ÑÖÖÆgœ�Ûí&++‹ñãÇãtÚ�¦nO,ÓfÍ%6>‘óo¼�¬ò!$¥f ü_\ôH=�ZÁn·Íjèê´ß›$a Íöóª ¡€ÍàôÆ£i!@ Ñ‚œÞ,ÓÄ4M{H‹ÞÇ0�½A™=÷kFx Kø;:¢%‚ým6Ñ�|>dÕA( B5ª‚H²�ìèìD’e¾.$YÆåMD×õð“IX‘ Çƒô­cR(èšFnA6R\Û*+>ÂöKbXd¤J”å*lÛ´•‚^ù‡O ³ó]lÝ´…>ø{~~ý5œ|êiH’Dww77ßt#'Î�ÃÏñ rss¢¯²,“œ’Ê”)S),(ä…_äþ›®eÒÜXñùB†õ)ãìsα˹`UÚ3µAQ.¼ðÂæ:FyQq gžr/<ñWüò6Ží×�û“«wTâ äd„ù®�rC ÕmloO ON.ºn§BYˆ}ŒìÑCAÒ˲ì_±´6t‘œè݇HÄ2Š*sûå}©¬íæã•mx=ª}½�P¶™ÀR¼Lìïn\NA¿¾û°A a¡:Ý´ÖíÄ×ÚȤ‹EbV%ÕÛXõ¯¿ÐV»Åå¡cO-ºn³ µîÞNRn1‰yÅÌùéC,{á>ûë½ œ}]Í t¶î!9·˜ºŠ5¸’QÜ„e tÛAX²BGÃ.t]GX&Í»·‘Þ«þöf—›±çÞ€æï“�Bý¦•lùäßtµ4âJL¡­¾Ó0Â~bÛެÐÝÖhç`º½4ïÚŽ79�ôÒ�Ħç²äÙ?’ZÔwB z(xÀhßc"œ¿íNJ§®¾á[EI™¶y¤räúËW¬$3-‘Üì4LÝ‚€Ëé`wC3 ÍÑ"²,S]]ÍgŸ}†ÇãaÒ¤I¤¦~QAˆ\;77—[n¹‡ÃÁ’%KxöÙg7nk×®¥½½�SO=5šÎg&£ÆŽçâSŽãÙWcÈÉãpºpºm“~D›¦µ(„of¯#¥&#ÖAËBqº°L�Î= ž„dd%,Â"«=I²¯½“H´¡$ÂÆ¬HZ@ä~=ƤÝ.û73Ê–Ø#åL’z”Ì /´Ø—YQ^@,S�>©inǰ ǤPް#%¦xHé5˜›V3|Œ�ènZÅi2¬Deá’…LŸ3ý°uøˆ9èæw?½ž‹çŸÎ)§�}é]]]Œ7žSO=õÀtxì])÷**âæ›oæ­7ßäò+¯ä§7ßÌ%—\ü•‚ó@Bú`Ïvê©§pÙµ7ÐÒ¸‡Ää4týÈG£ Š [ׯ£$5€#ÁƒÙ¡s4­–¶?YbÝÖZ•>$$'¡ºÃ¾öL˜Èh¡9¥eT(½Y¹f3f•!´Pô}ʲ„2ÉÉ‹åÏ· fâùŸÔM¼qjtð÷lƒ�e¦ŒHà™ÇÞ&pü©(+BÓ*@uº©Zö.oå“NÄ4tR‹û±é£W¨\þ1Θ8ê6¯äÓÇîÀ×ÒH{íNÆ�w+^|”îÖF:váôÄ’;p,ÎWÿÂ;÷^CjQ*—~Ȭë4wô ‡“êÕ ùøÏ·âk®§£¾šÉߊ¿½™7ï¹’½O\‰9…ô�v2I¹E¼y÷厜ʖ�þEr^I¸O‚@ :œ4WUðÉ£¿FhªÜȬþ‡ËMñ¨i¼~祌:ûÚ°Kp€œ²cÂþ¿äüR/ý€ |‰½û;Îb8TDÚÙÙÙÁºuë).È!51žP¸ð –…äpP±uÍ­>ú÷ë À›o¾Ém·ÝƉ'žˆÏçÃãñ0{ö쯌È.// ¨¨ˆ9sæ���@ @Ó4`¯`’…––v×Ö±á�§0ª×p&2ùÊ»Áá´‰’Ll\<ª,Gm¶!roÛç%„…ÃÃXð—»ÑÝXºFÞ ±L¾ôW¶ö¦#¶YÅìá(+*²¢`†¸'@q8ì(k]³ûq�}¦¡Gïy ¯þe=áË�•~àpL eÀ^mÐgØH6½ø4¦/h›, �Áe*Ï?½‰–=­ÄÄ%`Æ·@²ðÄ(¼÷Ì¿)ÉÎàÌùgcšf4?/##ƒùóçÛÇŠÓáEVʆa ( Õ»wsÖgp饗FÏ;ÔvîTq {&%%㥹©�Ôô 4í»�HYÆß­³sã2N+‹µM–GÛ¡žˆVUH(l›²ÅA´IBX&Þ˜XÒNãÝ•k™1ý‹}J–%Ìn�²ÒD¸i÷þ¥¡îûMH2RP£WQ.£¦Á0,œª²7J[V0C~rú'»÷ô€C×PNÆÌ¿ÅáÄáö2ï–Çðw´hoaäé—›œNVù@ê·¬!9§ˆü!ã†ÎÔËn§fÃR´n}nú?Ò‹ûòw3ñ¢Ÿ›˜‚æï¢tÜ, ‡ŒÃ×Ò@ «9g_‹+&—7–ã®û�[×#É)ù% `Âù7³kõdEeæµ÷ÚÔ‚V˜N0¢`ÈÒ‹úìlÅ×ÚÄ�Ï#)3Ë4ñ··P4r*Ù½‡`j¡ïÜ­òU�d# ¯÷`V-þ7Ïýó¦Ï8Ž”Ô”ïºi‡„ÈœRYYI]] gÏ=T+`§uEÈm—®ÙBVN.………ø|>n»í¶h„ø¡pé÷´tDø¸=O4¨-rŒ,ˬ]»–õë7òËŸý”ž}þéa^½ç2FŒ‰,�®…ØÒæ§`êéd–ôÇÔBû]„µQ—;†êµ‹XúÏ?0höÙd–ÀÐíc¥°ù9ÐÙ‚ešÄ$¦"°ÝW!¿Íï߈¢8� �Îv,]#&9aÙõ®]혺†'>)LŸyd¬9RøÃ1+”%IBÓ,Êú÷ç“¿&RSÛIAA*fЀ�Aï¼X„¿–ÝÕ»8tÈaÑeE!´Ø±q#§Ÿz*Š¢„ý{Û‡&X#L@+V¬àÄyó¢EÏ¿ ö'ˆÀ0MtÃÄét7±T=°×ŸÜF[õzÏMÝúB Ñ‘mƒ-8 ˆ Õ�9sI>EMF˜yF²ì /­{ºHNŽÇÒ÷­l%É"hrÖœ|2ã¸$ aÚf1 P$ ä ­¡4þ­�MÚÄa`°Ø—€Ä² ÒKûÚ+÷`À΋µ 2ˆaI¹½ì¾&ËXºŽ©É,HvŸ¡v •®a!b’Óè;ý”°9ÍÄq¸ÝŸˆ©…° �”übdUE’e[3_$2Ë’Ýg¦©c„BÄ$§2ðø³ló®ËÄÔ5;nÏ2HÊ) %¿¸ÇõlÚÛŠO^eù‹�püõ¿Çå�!ÔÝ�t e�° �Œü"Ôü\uíµ<ÿìsL�6ík•`ü®±aã&º:;2°Œ½ôa¦9ÃdñÊ�”——“’b/6Î8ãŒè¹.—ë�îq JÎý]l‘÷5iÒ$&Mš„¢(457³tÙrŽчßÿîÖèq¯¼ø<¿~âÿ˜qÓƒ8T‡MÌÑô,ÉBl|ïyÊÆLjÓ.Atãp{±Âýtû’÷YñòãèA?g�ÅÀÙgáokâó§î£vÃR†œp.#ϸœ�«°â¥G vw1hîé;å$ê6­`Ñ? »µ‰ çßLá°‰h�î#ÂŒqƒq0ÙqØï|˜` e�ÌÌdýY¶~!å鈠VãÕPädíò• 1ä°ÜSX’ qññá(�fï@ù@¾ß¡@|\Ü—žwÐ6‰½¥Ø:::4h`GBªU•U’BFV.z4Xá»�•)Sµm IÎ=æô¶K!Õüd�ìRÙ±¥…-‹AE˜†Ž$Éo‡,¡ki9ÙTd�eáÊEœ07¡í«1K`»«BSÆf‚j�6EUÀ2ðk–tO`…1�fµ’Ö&tÙo K–¦ƒ°pº½QÊÊˆÆ , +²Ø ¯¸"hÁhkdIÆ2t,}oô}ä^F0Ö(ä01ˆ¾_zg¿AÛ%>^Ó»öYéEŸAâ‹×6!ƒeL¾èçd…-’¬ I„À^L¹¼1,~é R[+xíÕW>bä—ZÃŽ5DúæŠ+ÉH‰§Oq.B·ç!N§ƒš†fÖnÜÎåWý JÍI•êIÕùesÔ�‘Èß_vNDBÐÚÒÂ%—\ÂŒ™3íèå0N?û<Þøh»7¯¡|ÄBþîè8Ø$9ÁÎ6|-{Èê3=ÐMýæUì^»Åé¤÷¤y¤÷ê͘ùWÑ\UÁÊWŸ ð¶/~['üì!< )4T¬eÅ‹¦ÿÌÓqzbùìo¿%.9ƒµoÆoucÇÙ‘Äß'²°,V¬XAŸò²3S1 Ó¶š�ìt°µj7m† =öå@8e㛘v%I¢¼¼œ³Î:‹Ô””è5"NÒÒ’ ù:ÃýþÀßI˜²"£8èÁnZk+Yø÷èj®Cv8Ùµv!MU›vµÓÕTGfÙ@ºöÔ²sõâÒ²hز––Ý;hضžª•Ÿ¢uwákm ³lõ[Öв³‚Ø”t@¹þÊW§œEpÌjÊ`Ì�GŽä“éh­>œ7¦a�n0º¯—¿}TM]m=Ù¹¹vÕ¨o „¨ŠB0ØÍÿýêB{êÈ/(à…^ ¡¡�¢¢"®¹æÜn÷>/µçJº¥¥…ØØØ¨(2XfÍšµÏó|]D®?gÎJKKyî¹ç¸îºë8û쳩ªªdKý®»ó‚~ó]ÿpBVºýu«9k@B8¯üèÕeIÃdÙ6�Ä’á8T ƒC÷³ÛÁ\ ú fõgìÚÖBA¯¬Ð¾&lK‡ÂŽm]<úüfxÙéÏ ±©–ñ7öÇè\Èš7ÿ�7)“î–zÍ9‡¬òAá—Z·$#!øøÑÛiªÚÌ™¿{�¸´ldIfOå&<ñI$d壺má¨:ìÒ¢~§ ÕéF ú±LÃŽÚWœžx-Ð�/�ÞÕikâ¦�ªØ´e§CÙfpŸ¾AbF.ùGáokŽúîœn»à¼} ‡Ã (ªÓ>ß4ðÆÆ#-à ?ß±+Ø„°p{¼4TU°ëí¿òäŸÿDiŸ~ßÊÍô]aWu5[*¸ðôÉxb<»ý¶…$ ¼pÉ:œn/åe¥‡|ÍžÚq{{;‰‰‰DÌÕ_÷»öLë©a aðp$Ù‹OIÚ;<$ „i›”JZ¯r6¼û<¹}‡Q:ö8ŠFNáÙëjÐý]|öêäÍØ³®âå_œ‹ð3`Öi¤õ*gÁß~Ç{ÜDÑÈ©xS0ótUaØIçãôÄ“œFÉèi|øÈí4n]Ǥÿœ�¯óˆ0I2HBâ`¯î˜ÊZР¸¼˜÷Ýl«¬¦ß€\0,ÐMr2d’Ô.¶mÞBaqÞ7®%, o‚‹ßz�Ú�«yþùçq…¹_ Ã`Á‚hš†ÇãÙ§CJ’ÄÆ�yíµ×¨««#99™’’† €ìk¦NY–éÝ»7·Ýv ,à•—_æãEK¹çoÿ$95_gYùî 3YSc�õ›éBâwSªQ‘1ºƒlit“6¤/Â4öèƒ$ɆFjVÁÔ¡¼¿ä.*OC÷3aK2B ,rrû5£Yä8�'?4©~çy’S“ùןIFéN½ënþqõå¬yóä�¡‡¢mÂÂኡqûL-d“åo\΀ãΤ­¶Š�»“ì>CvÒ��$„À×¶= «l�Mµt4Ô�^ԇǃí× Q½v!Šê$½¨’ª Ë*ÍU[ðµî!µ WLA¿a™ì®ÞNBz6‰Ù½0u ‡Ë�¡…عú3œ.‰Ù…áš¹šª6êî"µ° WL<�Î6dY¦³©oB ÞÄ궬²LR ËQN»0ý1j¼–$I‘Yñòc\yü.3ótµch!Ž»ö*¼ÁÎUŸŸ–‰¢¨$çñƽבZXFlR*‹ÿñý¦ÿÍïcã/“œÓ‹êµ‹÷Ãë(3“¥Ï=ŒðáŽK`Ã{/0ñ‚›¨^³ˆå/?AZQÎ:ƒõï<‡ÃíÁ4 *>{“qg_‹êv#Lóë½ÿ£aYxbãYûñ”¸œwáÅûæË~ϰrå*ÜN™~}ŠÀ°ótàp8¨mlaí¦Lž>·ÛsÐù(òûŽ;¸ýöÛ9r$çŸ>Ë—/ç—¿ü%÷Üs¹¹¹‡e^‹˜²UÝ×­†¤(A?™e9åÎ'©\ú5ëÛ´–g\Nvï!¸bâ¨øìm\žX¦^ö+RòŠènka×ÊÏQ]n&]pñ©YL¿ôWl]ô.UË?!>=›¬’~èµë—’š_Jù„Ù˜Zж¶�~}¶ƒ\û˜Ê€=AyeƒXó²�aß`ÒÛ˧o݇ÃáŽs|HHXÓ$.L?§„ ›U„Óéäúë¯g̘1 0€éÓ§³gÏ^{íµÃZ/IR´@ELL,ª*Gí~ç9•6—•›×Q”¢¡x]m!”£¸X°Y•ÙTÙ‰7ˆø¤ô]¤#™œßw ¿YÆ–Šú ÌBø �dd4|"†…¡©|8áÉ aõ{èºFñèéXºF¯¡cÙòéë,|æAŒPˆñçþI²ýUȶ/SRUÌ`€š�+è=áx<±ñ4Wm¥­f½'ÍaÓG¯RHÈßÅØùW²gÇ&ž½é,ÆÎ¿‚ŒÒ<ö£Ét6î¦zíôP€WÞAWsÏÝ<ŸÝk±§r3–¡3þÜŸ º<4UUàoo¦pÈùŒøÁÙ|üø}¬{çyÊ'�Ù½3ãÊ[xé?¦bÁ[d–ögÝ»Ï1á¼ëI-,eåkO±mÑû8\.ümÍ̸âvê7¯bË‚·˜uí] )¼~Ï5 Kï ³ tµSu¾aoÀZÃÆ¥\3÷x¼^ï÷N(G™º ƒ+W’�žBAv†nìU*•»ê¨®kbĈÑóå9%I⢋.bâĉ :”¾}ûF- ‡C ˲Š×ã¦ÕïÛëÐs΀,a™:Éy½È,½!¬0!‡ äë"»|ùG#,!z(@Rn½†Ž·‰HB~ô`7)%L,ÎY„ü>úMýýgžŠ°ZÀg[vŽ�ÅQ’¥C2_[#å�$¡¼vu§²»ºÙždCÃKÆòŠ(.ªÂ’U›QnF�yH×�ÌWEEELœ81¼±ÒeeeRÛ"óâ�~‹* ímm¨áÀUYÚ,ö“Z�@G3¡®6‚�ö&!0B~‚-„ºÚÑ|SÇ vìl%ÔÙΓ—1{œêjG¡î‚­„ºÚìñ)¹¾*qhsâ±/”eMÓÈÎË"&³?·¶�Ón¶e â“LrR,¶¬ßˆê`Ê´C†°é-Jú `Ñ’e†ÕH…°K‹}a wÒžy̲,ÛfÎðï_}Kñ�À=WìÑèÃð~EQhinæ‘Çgö™gãö¸ìê;ß¡ßNXvêWcýôÖJ–&€vôýÉŠ*ÓÑÚÍúz7½Ê†Ž,Éö@ûZ›= ºFѰ1,¨Œ£¹¶ÓÃÇÁ¹¼<ŸZ«7Ü^•«âïh¡xÄ$ŒPah´5ÔàŽM$1#‘„ô�mHÂÖ”å0‘‰ª¨T®ø„ì>ƒ™rÑOÿÃktÜT¯^ˆeh` „¥£ºlÍÚÔu$ #ËDÆö©ÉŠBj~»Ö.F–emMì©ÜLJ~ .�—㮺ƒÒ13Xóú3H’Œ¯u-»¶â��£z휱I)˜!;§Y,]Ç2 ³òP]n �fÌY—1úŒKÈë?"œÿ¬c:)9v>uÙØ™Œ>ó2FŸq)ù%Xš†Ž?–6IÜ.7–⤱±ñ¨õÓ#�ªª�ÔÕÖ0 _ (ò �¢ÈXA�õ›*ÉÎÎ&?\4âPÇeO¢Èv¨‹I’¢šoO¥%Ê ®(~÷›;©ªŽ¡Q¾b¼*²‚ª¨(’Œ"˨ŠݯÈ2ŠbÏ¿JÏ}áM–Ÿ¯Øç+vŸT”ȹJô¸#Þ÷2WóBÀ4Lâ✔�ÄÒMÝØ3XBÙ`TŸvlÙŒið�Ìd²¢àëÔ˜xÜL O_tííÑNuÀ—î¤3wDpîŸjp D:fWW���{ÓüÃX–e~¾€)“'ñÀ}¿§£½=º¿¾®–sÏ;�¬~C˜6g6Ý]Ç@©FaárËlÛ¼…¹�¼Ä~ÑÊG¾ \*U•íìe’QPˆah Ë{—¨‡¼I¶/+"« ¥üî~Ùàí:Þ �C@Š'FöƒâÀ4L–¿ø}'ŸHRfz ›˜ä4Fžr!Ÿ=õ{ùáq¬çÆÿðj—Ë&â�%‡�¹såg”M8ޏÔLܱ ô�z"�Mµ´ÕTQ÷tšw�dkw ^%ˆMj¯´…®1éGד”•‡ì¶-%¦ÁÀi? %»€Öº]d÷!£¸ŸM£É E`ÉÓ/ý‰™yh¾N„$dd3çúß⎉£ßäpybIÊ) !-‹ô^}0BâS³8îÊÛˆMJAX&Ç_s±I©8œnŽ¿æNª×-Åé‰!ð$ lÜLÒ³qÇÆS2z­5•Ä¥f0òä ø:IÎ.°© CA¦ýø§Ä$¥ÑÝÚBŸÉs)9­»ƒÁÇŸNJn/ºšë‰INÇárÓgâlz Ÿ€ò£È2ãϾŠü#ñw¶‘�™‹êp!‰Ã„(öáGþ†×�e -HÉ�±¬}ö·Ô×Õ’‘™õ½! é‰5k×’•–@I¯\,C�*²CeóÖ]Ô6¶3ÿ¼áÈa†Â#].IñññhšÆÿøGZ[[9餓X²h!ï|ðUÍ]´ù'^NïÑ“PNt-Øc¬#“ÚaÆÞ@¶¯>î{!”%Y"4(éÝ›W•|¶U5Ñ@޽*Ô Êò=¤¸ZÙ´n-ÓŽŸ�HÊ×û°’$¡ii9\yË­Ôí®¥¾¦š=µõÔ·¶ ´½¤ †¡Ñº£†Ö= 4Õ×ÐÖXG¿òrΞ#GŽ$..·Çû¥«ï]»vñË_þ’wÞy‡€¿›M›7cšÕ»ªY±z5IYù\pÃÏ5aþn¨¯ÝͶ�iiÜÃÉ—ý„Ò¾¥twß(¨íH@–etê¶­fÖ`/¶æh“~J`ê¬Ýi‘R: Ån÷h‚„„ejħg‘�•ƒ¥ù¶G8|„@Vdrú ÁÔ‚X–¦´ûJáб�œˆ©ièAÿ¾® ªÓINßÁZa…+‡!“Ý{ †¦� šu †Â2LbSÒЃœn7Yeìó„EVi?LCCv›’Æ Ù§#, Íß�i„H/*#»÷À01¿À ·/½¨œÔ‚2‚¾ŒPI‘È(郩ëz€øô¬p^²Í V =ø½[}#D´æƒàû!”‘0 “„7Ye#X½ñYúɵËÈY2O�Òl“5KV0ýøéßx"¶³†¦AzFÙ¹9X"JbEØ­‡išütu´³k{%o.üŒg^ù71NÙY™äçæ�’œL|B<^�Y–Ù³§‘§Ÿy–þ“frò•7ÑXW‹¯Û�Š`pß‘ñµdçåãòÄÐÜ@’e2³óÈÎÍCÛ,ÕÙ´M¬Ç€@Žä'7Ôµ@÷NÊJA;º¥…Ù!ÓÝÔÍîÎxòÊû!tÛŸümmè6!a ;W¸çoØÂUø�$Y’£K�@ówí¥Ç S÷‰¯8—è¾0÷®Àf‘í0ݰӻ=h#K’ýï°ŸÌ24‚¡°¹Ìö§™Á zÀ€¢¨$¤f2å›pº½t·6Úî”È=‚;Ê_¶¯eê„Û"к;÷>»,cB'šr&,‹�¯ãKŸù[}öŠwa†PdÕ6߇ofõ°H „蹊\aïß"|Å΀Nß9çòÒÿ 5+›N˜‡×ë9hpæw-D".°mÛ¶³kgç�<Õ¥ÃY¡@ˆë¶‘››­î´ÿsˆÔãpµÏ²,†ÊCüç_qSnx€Â¾ƒ ù}v –á>ª�¥Û±Y’PþS4e°’ª@qÿá¬xíI~¨È2X–fˆ�½Ü¼ûú&º}~TÅ…i}3-2rN("´Ùpx•ð~¯7�¸ødò ‹7}:þn�uulX¹Š%[6±§n!­Íø»»�°ËçÍ9ãNýÑ … ´ÿ€èGŠ{]3CÑBÛÁ@hÅóXJ/±…²LÕ¶¤¨Íæ~7|×N…Õ4‘Gya!¦¦íT¨/Ã>y“ûÿ†´O …ô%ûtþ�ŽÙgŸ´ï·þ²kGkÊ’¤ì-z™p‡ì°¯ —›Œ¢ÞXẳ=ÍË=ß™¶xØi*2Âê‘zö½íós:No<¦as<ûM+ÜëL!á·Ô°‘[  ™ µ÷¹‚B%dÉHX¦w~Í£&pñ…pÜ친}öÙÌ�;UÝ7›#"Œ¿)«Õ‘ÀÖmÛèloað€r@&Là…ªª45·³µ²†¼¼^îsÞWe—ìÜ7Y„D|ÈBF�Ë´‰ãéìlÇ4 Ý›=¯øÝ¿É#�ˆÛû`øÞe[‹ôПϟIcO]'éé Í„�É€nÚ¨ØXÁ€aCñw;èCIò¶°Iù C·-¥’ŒCuSPTFaq†®c:¦0ì‰Eq 8=t¶‡¢¬;¸ù¾‚@’Žé^++°véBÊs,¤F‡vTó“m¾k‰kÛ m&q±^­‡M(!,›·Ú‡ à÷u ,�,+xbãpºÝ¶‰9Ä4 $IÞG8 ËBu8qz¼„~ MÃí�Aq8ù»í"Gqq(„ÀérQµf)™Íë˜�5C«³”"šo�ã÷ûCìóç¾Ú»)$Î:g·Ì~’Ëú{*¶nç$UŲ̰0²¯±¤=ð +3ƒsÎ9çk˜aw ˜“¯ºæ>çI‹/!&ÆÅð�¥víoy¯?¹¢ª–Ú†6fÎ>I’0£Å'ö.4;»ºXøùç¸Ý&NœðÆÂC]„|™ð–$ ] ÙA—–�ºy¤³ŽyDeÊW?ü÷G(ZH'+'9¡„Í;¶�ž›š‰ÐM²ÓU Re6oØÀÐQC�Z›¢/9üž ÃÄ0öM“’'2®°¢"ÐCÚ÷:Ú³'dÙ^,Õl]Çq#ö‚â(Û¢"|×kwéÄ÷+CQˆF;þ·AÂ.’âòx0 �MK?¥qËj|�»Á²�U±¹$æ—’’[DZNñ‰‰h?z0ž¸x|íml^ö)m;· üx’ÓHíÕ—¼²~xcãºí—aAíׇó„­õ›W3³_>¸=„‚ºt¡Ò—üìR›B˜ö.dþ¦ñÞ²õ4·´’š’ Ø…qZÛÚ©ohàßÿz…{~sW_{½�ûº_iמmô¨Š¢|+K^«V®"73�¼¬tL=R„P6m­Æ QVb§«)Ñï†bÛ–-ÜûÛß±eÛ6nùå-_ iÏ=÷<ýúöeøða_$©4IŠ´1ò¬¾®NvÔ4ÐgZ–i „sþé±8úo0_KŠGí{#”‘$LÓ".ÖIñ� ¼¿l “&íM�R”c8ù׊•h?<û;óù|Ñgc±Êò‚0[›r¹�ÔT×¢·na@I„¬£š¢eû“ºöøØÖžLQ¹],=âoýoC„>²rírV>÷³Çá”ÉÉÌž�SUÑ4�úú:jëÙ¸xïn«ÆJÎað´)ì? EUp8|öâߨ³ä-æMKßCð¸=457±µr ïþö1R‡MeÔ‰g øP�nœN·íg†®Ùe-Óf.û–cQ�ª:vwc5W2lÀTÐ ¾N�½¯žô%„Á¦VN�3 Óü”_Üp9ª+6¬! 4º×Òt†,!'+�§_}›E«7¢÷(†¢™‚€+‘]Í!’ÓøàãOyÿÃ�ðzcIJI¡®¦†¶æ:6nXGSS+wÜý;~xÎüpp©,î„Í›7S½kÇ Ï‹/¼ˆätÑ¿W.MÝAtáÀBB–Šd‡NÚöˆ0aÒ±lüˆp&¬×~„r‚²Cxï}ÝBUU,C=À Ò8þþQ M{šINIûF©Q‡ÿ¹¦�ÀᔩÜVIš»…¬ŒRпš4åð7B€C¦²ºŸ3—ÔœlÌßõ!EAYûÚ“œ:v7ÝòË/=6èïæõ½Ê+ÿ~�í¯=FKÅ0bÒs©«ÚŽoݧüôŠ ™sÒ)_8opùËÜñÀÃÔöBñàQÔïÚN{C=ZÐ�Ãå"!5o|"ž˜8ÛäðÛù§ß”5KÅá µ¾ž8ÉOa^&–n^E\ 'ºÉ2ç�y<ƒûlbÇ®YÁãvS˜›Iii’ê Sò÷¿<È®Ê rò HJL&=#ƒ¬¬ p»\QSm�`�ÚÚzV­ZÅÂÏ>¢qw‡ 9!Ó´hëðQ»MeåÂwÉÈ)¤¥µÙC\B-íí´wvã i´wk„DQß�Œ3’’üTPíˆôh ‘%ÈËH¤ ¼ ÏįHš]+X O\½Ž`°¢jýJÞ{÷_×¿Íø1ƒÙµÙÂíV™>z —ž6šÊ]5üí¯��›—Ç”IöyoŠ¢P]½›k®¹§ÓEL\ååeÄÅÅ",Á†�›yõÕ—øÉ�Ob`b5;1hµ¼t˜.:-~á (TL$Âëdiÿ¾à‚ø>¶©¼Ó~¯„²$Ih!‹âò2®|ê}äç§ØìšEI¦ƒ$w»vl#3;M;6‚1þ“¡(P¹y=}²Î87¦Ï8¤ùÛïZbUE'ÎÌéÄÇÅìîŒF3ÿ7Á²,ܱq,ï5ú¥ÇpÓ-·aYÂæ %lÓ¡ÛÃióÏá´ùç°«j¿¾íVž»ïgŒ9’GþðGú6ÏJa+µ=-Î>雸ë›Ïêîdý¿Ÿ_ *–¤ Ä$âJJÇ•–Kïñ3IÉη‹Çñ(,�êPioØM¯ô8â0Ž@‘ Ó>?ƒú—3hH¿pô¥@èZHÇ „�€ù§ÍbÒ˜Á¼úæÇ¼õâ»ì®o!&.™”´LÒ32HMM'..ž„Ä ä­­•†ú:*¶lÄß±‡‹çÏâäŸÿ ÙãŽÞ éðùY¹j×Þõ.ù'\A~Y=±¤eàr{qy<ÈNin‹}ùYé‘�rû} �ìt²y{5�R3fÎE g×GîeY&ºÄ’ÝŒšs2]{ê˜8Â˵¿¸Z;À¡†SNuFONlŒ‡[~v=×ßüKF�EzZ*�`��›6ó»{î¢0MÆá�ùùMWRÞ{i陸º:Ù°~=³&ôæ¸IÐ}5d$ÚîÍRðNZ  z ͦ‡ÓM·e i…O¡$Ù.†½Úôá‰è?ÚˆQý瘯±ÊÐuRÓÈ,ÅúÍo�_d³ÔX&xcƒô+TÙ°j c'�ÿŽ[ûŸY– † ÛW3cP,Hr4åhA’$0 –Wh¤�‚¢D|zG­ Ç„‰Óí¡kO=òózÐ-îëŒíD8ˆ‘eò{SÚ§?=4•ýèü¨pÿs#ô²ÓŽ›Å}�éÁØÁð½Ê`—w8dJŒ`áÇÏ3g–‰,…)71QÃãŸo&´9w­h¢Äÿp8!„ÀáPhiîÀh«¢¬0të¨ò¶Fø®ývvÄQÚ«aê¶Ùð¿L* !ˆIH¢³¥‘ŠåŸÓodYTðî�}xÕÃB×0 ®¸â âââ¢×;PÔmÄ/š˜”ÄÀÞ¥\{íµŒ=:ú{¬ÓIi|¥å½™8y •Õ—³gw%åéøCÁ½´›_¶¶ÜQ[IÑøLöNÃGî,S’ì²²š®‡óOe2ÒSÉÎLÕ¦?µgáðˆ0M0-„a¢ë‰/Òñš¦Í½kg ݦ �ÛM°»+ê›@ÜnÝ;vë”ÉÏͰyÑ¥ˆ •šÎöÝÍ$—L@UlJàý}û¶¯^Å×Õ…ìo¥´h4R¸<©½à‰<¿D ;È€>Åüá7W±qC›+ªHJÌgìÈð$ÄhïB’ 1.ŽÔÁIQw…¥h_âj0ÅÞëK8Uƒ4U'ÃÕ� –ŒßTi5Ü4ë^š,/­¦‹náÄÕ¨m ƒ]ô!2ÿ›Út4®à Ç}ï„2€¡Ù”›OüÃMG‹Ÿ„/hhƒJ]_¯¥ºr7ÅE„‚Ú1�Nô}…—Keû–M¤¨�ôŠä'Ea(„§BÕÆvü±ådäå¢kºˆò_òÑmëªÀåñ°üíWØýé«Ì˜ÏäÉ“�½8"\wîÜÉSO=Åe—]Fzzzt¿ªªÄÅÅE«�èÜž•Ëbcc¹ýŽ;ÈÎÊÚ‡YN’¤h:€Ûí¡¹³ƒØ¤X@"&1‘$é�Ô�@QT‚þn´æÝäçO±ÍbÇzN°–°°tAˆ<\O²˜h|IØŒyàk‚¤ªTÕ4 $¤á�‹%ØÕió‘‡/fZàu(ì¬ÜDnv* I º|Ñ®‡ƒ¶–V*›Ïꃡ…@R¾0&ì˜- ÄZ]ddgØ9Ähš,K!¤`ˆ¾eEôë[ÂB †´wFûŒaè†}ðˆ…á€ÏºßßBH¶��2ܪI®ÃG¾§ KHB"`:ð™:L7­†›ÃM›å¥]¸K’ÂÁcYŠø¦#Néè_ßÁ !õؾß;¡lû• 2sr0cŠÙTÙÀ˜Qq YÝ$#Y!3Vcýª”ö)&øŸ_ùˆ@Ø‹ámë×S�a y]˜]ÆQæ»¶—Èk¶vàÉíG\\ _çW�—eáòz©Þ¼Žoþ�_^{9sO:9úóþ‚µ¥¥…ÿûßœsÎ9ûå"UÎ$Iâý÷ßGÁÌ™3¿�£( e¥¥_hŽYQxùå—éÓ§S§MåwO<ÿ+7’;h4eÃÇ¡‡Â&ÛC–T§Jks#­ƒŒ”$,ýØ —í ¢š¬ýŸoÑ>IPYÛLLÚTEA’Ä>é­2NB´Õì`lI¨{-B‡JuuÂKJfV4 iÿ&É–@×ÑXCN²›Ø¸X‚ÝÁ/}·wA(¤!‚!ìE†´Ïx‹.T¾áãï™Dÿeˆ½/IëÐHp†È¥ Ó’  –“vÓK‹é¡ÍpÑi¹è i]²Et$€L„«µmÈr¸Ô’Oì�nš&ñ nòL`ź'3&XBFqÖÇËÇ‹—qÒYgüwú�dE"¨™TmZÁô!¾ ¾kY¶ýÉŸo ’1eXxÒÿ]ß\‡ËÅ–EqÂô‰Ì=éä¯,: ª* ûhÃÁ`�{ï½— лwo~ûÛß²hÑ"N?ýtœN'\pwß}7/½ô/½ôIIIüò—¿$55•Ç{ EQxá…9r$¿ýíoùûßÿÎ%—\BVV]t�ÞõsªwîâÁGÿÌ–%3ïê[Ð�hû¿B ¨*í�uÄ«)‰ña¯ÿDH² ºÁî†â‡ä‡óy{<®HªÉßJ ¥žþsƒ¾_éVUa}ERb± ñ¶¦}€…ª�ìT[íN榀Ã�%ü( ’<Ú ûßÉRØôm�w‡j‘.ùÉÀo3ºY!KÁo9è2�4^š /{ÌÚ„ ÕãŲ, -ttŸCÚ»}¾—*E„޲ÿðQl®•Ñ»Cá t�a½ci­ßE[‹]<ûûXÀüXFÄDÖÔØ†Þº�’°?ùèš®AR%ÚötSÙGfQ ¦¡!Kò>9¡ÿ ›ešt5¸ÄX_ùÞ¾XëÛ²,È…^Èž={xðÁ)**bÈ�! :”)S¦ðî»ïòæ›orî¹ç’ššÊïÿ{ºººxá…X½z5óçÏgÙ²e<ýôÓ 8�þýû3nÜ8ÆŒCï¾ý™9{¸ï·Ä6naõ{ÿÂG”Âó+6$›F´½¡†ÂŒDT—Ó&¨8‚}뻂"”ÕE‹ß )#Ë4mñ‚ÐátjªÆ‰Nn^VO“³$�e±qG=Iù¥öâLâ€ïV–4-„ÖÞ@qAXâ¨ÿ|ì5GÌÁ2º�Ñ„Œ%I¸T“g€^žv†Æ409~ÇÇmã””jÄâ°sÕb\nO˜‰ñèŒSq1ó½ʶ Û¤ßà4„2ØS׉ä kºÅ€B™xG€]•;p¹•ÿ åà !ÂùÉÛ+I¢–ü¼„~tý|òúmt¸‹IͲƒ]ä0SÒá²Rd#ä'99 UU©4_D8›¦‰×ë%==�E‹±cÇ-ZDQQ£G�füøñÌœ9“W^y…-[¶°téRªªªøàƒ¨ªª"))‰óÎ;�‹/¾˜yóæñÞ{ï1hÐ ̼yó˜ßOÁq0!� UÕuXî¼qqXbß>�$£è4Wm!?'ÅåÀ [>„Õ¡R[ßH»á"#¿3LòÅ>§ƒÖÆzb„Ÿ¬ôTLCÿòÆ}ÏÐS›0ÅAÞv*;,²K{GSôŽúø=H÷ý^ eË´p¹ez ÍÒÍ$É��И0ÀæիöF‚þ‡²$¡kP[±Že�䣞((Ëè&k« rúC‘�þà:ú›dWyr:qÇÄÒÞÚĺïó·Ÿ]Fdž¥¬ß°ž‹/¾˜íÛ·|ÁL öÄßÒÒÂÒ¥KY¹r%[¶laõêÕÆŽKss3H’DLL ëׯ§££ƒqãÆQSSCyy9cÆŒ¡ÿþÄÇÇÓÙÙ‰®ë¨ªJ0Äï÷#Ë2N§“µk×ÒÞÞND3“e™¤”$'­ u¸cb LlràÉK ¨2Z(„ÑÙDQ~¦zü !U¥jW=R\1q1`™á?›éJÈ n£‹ÖÝÛ)++Üÿ H;ªj 9›Ä´4,ËkÚû¿_ ‡ËEsÝ.: )IèÇ`ÝaƒÕá º¦?^â“S°L#Z㨠åƒà{è…$¡} æ½cèjôçÅÔ-Ђ”z ´ÖR[½“ü^E„Ú÷Ö4s,Á.Õ¨Ò´§™Pó6—$ÁQO…Ù©ÐÚÔAƒ‘ÁÐÒ²hÕ¢ÿØI›×Úã¥}O#K_yOW#%¹™üä´Y ösbbãäää|!* ##ƒ©S§òÉ'Ÿ Ë2)))œqÆø|>î»ï>ÊËËfòúÑ�~ÄÿýßÿñÖ[oqòÉ' y衇�e™qãÆqÜqÇ1wî\²³³ŠcY„ù®·U¶ˆHzn¦æÿ�N…–…ÛãÅ×ÑÁ‹wßÄØü$î½ï·ÄÄ'Òù‘É6;;›ûï¿ÿ ¿ÿâ¿øÂ¾Þ½{óç?ÿ9ú÷E]ô…cn¼ñÆè¿�?þøè¿G�ŨQ£¾p!]| Ÿ~|&ËÞ|‰yW^NgKdK×Ñ´ ÒނШª_{ NAb|Ü>U™þÓ I˜‚� ­$ŽÌ�/èùîÜ.'m;·àR!73£“—,˘ºÎ†ÊF2¦�¦¥ç �FÌlK˜Ùqfhš´·MÚ’âmïMor _o™™Û´išBÒ& 7Œ˜YÙ’,‹yøàþþ8#ÙYŽ%ÇNú>ÏÄÊhthÎÙkïµÞõ¾®¾«#P’¬˜›ËÎ-Û°¬cwªù7\ˆÌvnÝL]± /¶}¼}]És;DjæáójÈŒщòb\ð�ÿ?ôuèïŽô’ÒÁ0:ÔÏí_ù(ל·‚Ÿüü—„"Ù8Žœ�¾ ÏÿÌ¡ŒlÇq 9ôç—J‡¿ÔçŸOÈ'# !x÷5ïfßÚ'XÿØãì\óû6<ÃPOg¦Fž¹6¸Šmñ‘Ar|Ê gꧯ½ÕÜx·žH0š’ä–V"¥}ø}<‚ÎÝÛ©,/&bg¬ÝŽ�Á¾Aºc6ÅÕ5Ø–ñâéYܲ@*‘À‰PsœËª¢à÷y'zâ§›¸'¥;a1Ó:íýc”Ìl@¼üer)ì“:RI)A�ºùKÙÑ%\;·ñ3¶L–7‡éܽƒÑ¡Q<ÿn�š¸“›´îжc=sêÜz²<Îe¡Ð-Z:lŠêg»dqp&új¿¤ã (*ŠªM¬</¯�ׇæñº¿›ÌöpY²–có÷oÿ/o2HAvÍç}M§¯5Ueld”” ¿¸Dzi‡… :}m­Ô×V <®3d�Gc_ûbÉ-*ű¬g^ �ªj$¢chúU•eÈ ƒ{º!„ mXôGÑ- ¿ß‹ßç}åb“‚ËJe0…åÕnÉD9Î퓌+¹½üu>iÓ×à¦`ô”üE ÙzgC�cä—æ`ë6è&sk%š1HëÎ],[µâß®QÇ)ÁçóÐÕÕG²k Þœ†}\Õq\•®žÚœZç²(Õ¡ž,!çeÆ2L|¡ ŽeìsëÞ€P5á,<~ÿÙÄðúý<ý—ßð–SæòñO||ÂHþùçûüÕ졟Oû\';IuS�nêeÿF21A_ª&¥„ÌŠ° ¨ˆ¿Ýü'šQT¯×Ë©�<ÄÿûÁ7ˆ|ö{UT¡'“ 9ÜGYa6ðB-î× ¤ESéêÀôe“SPˆ´¶3!AÕ<¨ñ~T#NcÓ 0¬CêÉ4…5›w“U9‹`(H:{щ”Ì�Gú»ÉÑLJ‹ °¬©µÂ|18ŽC âî‡ç3ßø-5Eæesñ9+xÛgaêÓcµ;®rÖÕÝG\É+):üÚ'q0Óør8¹ƒ²†IYe)žüFÖí|’ jò‘º�cK²"6õe*{ZZ8åŒ'‡•È éH¼>Á�ö½ä)ýT”ÌFšÇwå"%àUÙÛE7QP\èör åÕÍjJ2y'ɆÝÎÓÿøsϾˆÓ¯z/c½<ñ×ß2x  ÈØ`?K.z+ßôÒ‰øK¥#ñù}ôuí'¹g#×ýähšg"ð Ç~~�ò¸–µvˆ„™ñ›>ìï9qýs‘p„p}xÇë�+%RpœÃæTâpÍìñçÍ�‹¢¸ÌjÛ4I$“œuîùlÚ¸‰Ö­k)›Q�‘J"¤FÈŸULï‚êŒëñ´%¨*í�}r‹ñX©Cœ°¤Äçõ�lo%äT•—fL(Ü_ EAš;Z»)X|ªz0mýÂ=I4�‡‘Þ”æÈŠ„I§ŽÉKìÞ×Ië¾´î;@A^ï¸òŒô+·÷<"4•®î¼¹ÅÃaÌdú¸’¼Àõ'9ò:ù$O_ƒÛôCEã"žÜ4Æx=J¢€L²ja6{wìÈ´F�ô§û*C¢(°oÇVfׂôâØÇw¦#2õäõ;“äÖ/'ò»~Á‡Ôk^­—¢(X¦ŽeèÄGèm݉ª¹©ëå—½• ßÿ1θêŒDŒ¬üü‰V——~I¼>[¹—³jñ‡BX–5±"vqEQ¸å–[øïÿþo>ÿùÏÓÚÚŠªª$ ¾üå/ó¶·½�[o½�Ç3!èaš¦û³m¡ë:ªªòÔSOñÕ¯~˲°- ˶ùÖ·¾Éšµk]qŠtzâo ÃÀ4 ÃÀ²L CG×u ])±, =�v_º>ñstlŒááÉ$©tšT*ÅàÐ+WžBª¯=�Bóh˜º‰LÆ(.Îû8I¨Jðx4|^ïqØÙÁ}¢ Z;z»<‰Cz”!ŸBOËFÊ‹ó(ÈÏ>L4Ä£©Œ �²o IeäeM¤½_pŸf"C´§“Ê’ðyqœéŽEÁ6LÚ:{Q„ÀëÑP…Í3@LóšIÀÞýDÊjñjÞÔë�Û1‰û÷ä�RB`™PÓ0—Ö^©Ñ$ʸ䦑fÁ¬,ƒûéêìÀëÕþ]W>(ªB2åÐß¶ƒe�Y Ç;ý T�Lé´ôª”7ÎEL \¯r-9£»­y¼œñö«˜¹h[[TM£¼®‰ÆK‰��QPYKó©gc¤S‡©5=ÿ¥ª*–i0´o'Ë–,q5Ëž tÙ–55UåñÇçÆo¤¹¹™¾¾>¾öõ¯£ë:?þÑ�ضmÍÍÍüüç?çñÇÇãñd©…• ̦a ( `õêÕ�Û¶,žyöY:;;'ˆE–e¹Çà8¤Ói$�ÖulËÁ4LTMã±Çç†ßý�×K:�Ó™—nºîþœJ‘N§IÄx=^„žÄHÇñx½˜z a%)ÌÍqí§9(K)Q}v¶vòÌúh^Ïñ¹Ã†EwÿÙÅ¥çG÷>P„¡PLìj¡¢¢áñLR)qM(:»1ü9–W`ÛÖ„…éó_Šªà8’ôp3*Š]yÍi¿®î3ª§uÚö÷âH‰iÙx4…Êò"˜ÆI�ËA1茑W^ƒ@¾äµ™Î—*@åÈA÷¤N_C†8�¶™ÕÜÀþvíîcÁâJ°L¤3˲½q¶®ßÄÌúZÒi!þÝu´p­½ôôôëÙʼËó^µþä�î1zRœÑ؈­(BåÕÍ]„"Ò1›t"�7p;)± “Ø Écú5§\ñ6¡ñ‘±—¶ÉÔ^SÉN2FEF=˲-„#2qk´¶mxnÍrrrøð‡?Ì÷?À7¾ù öíÝË�wÞÉ ¿ÿ=ÍÍÍèé47þñ�¬X±C×'VZ°Ms⽬¬¬‰íK  "wå{ÓM7ñøc�áóûyÏ{ÞÃìæÙüô'?áñ'žÀãñð©O~ ŸßÇÇ>ö1º{zX»nÿøÇÉÍÉÅ4�ñÓsÓá™T¸“©[«šF^8ˆ¡§Ñrò1ôd*JQ~ŽeO»%§”-àÇ¿ÿ'ºn²ò”y˜ºqdÊì1îSU,C§s0F}IŽå¸D¤Lï±P½xRÃôw¶1ãì¹à؇’McÇ®vBå³ÈÉÍCO%/f,!%Šª¡'â˜#=̨Zœa^O÷óã’­†F¢´wöNœwa~.åe…`ÛÓrRº%�t"E×P’ºšZ¤móêØ»N.}Ò¯”ÝY»I^~„҆ŬÝe¼Ù‘ ´�•-[¶`Y΋ߨÿÆáö' Zwµ–½ä…‘ÖñUWrõ®6ïÃÊ©#¯¨Û±ªpÓ×'ÈKQTÕ}èE¦Î̳õ‘{PU•9§Ÿ‹žJ¡jÊ·¥©!Ò™U­aicÃ002«ÙX4Ê/»Œx<ε×^Ë÷¾÷]>ð�000€P¼^©TŠªª*F††Â0M’©©tštæßD"�¶oßÎ'>þq>ñÉOòñO|œM7¸ãŽ;¸ïÞ{yó›ßLee%ßùÎwèï§¶¶–«®¼Šââb~ùË_àóúX¼d MMMœ{Î9X¦E,:F"‘ ��Ç2ÿƉÅâÄ¢1R©í$,IÀÑQŠM$œT»×±À‘n û¦]ÜýÀ3lÙ±—¡�<Úôë竪ÊðX”˜¥’]P„t2jS $>Ÿ‡doŽ©S]Q슆d¢²nMǾnŠêšðxTÜN‰ÞO(�×ÃØð3NQA^&Õ=­§ç45�®þa†F'Þ/*È¡¸0Ûš® ¾DÓ4ú‡I8>òŠŠÝ1C9þc†›ý8$&¿Äéžô+epI*š� —²ö–›x¿a¢(Û`¦Y1'‡GÿÞÂèÈ�`6–5=,¿×:T Z·obf‘�ôa �»sH¶ïŽªœM0 KÉL¹âÄÀ8ßK:¶Û%AUÛdõmbÉEW�SP@lt Uy™Œ�®¤¦Ï�2Ðß�iºu_å�Õ-0á$Ôºg¦apî¹çrûí·óä“OrÁ`&éT ˶1M“d"�PìŒfµÌÔ½^/ñxœÂÂB.½ôRÈìk÷Î]$ yä:öïçÑG¥··—mÛ¶ÑÝÓM8æÎ;ï¢c©T DZ™5kñxœU§žJ_?z:宊qÅP&ÚŽDJ¯ßÏ­ÿø'¹g¿‰‚²¤ F*AÄ¯à ø'XçÓ!%ŠÏË/o¼‹î¾!¢ñ$;vwpÚÊùfrÚö-%¨šJÿ–7‹¬œÛΈ€¼*#m-dg),ÌÅ4­ÌwŠªbÄìí£öœYHÇ]u¾ØòCJ·Ånlp� 0É-ÈÅ´¦_�EJ@Uéê"O¡�#%ed‡CXÓÔ'-‰ðzèì í ’�—�c™¨¯Öø?‰•òk"( ¡ ë’†¹óyòæz{b””æ Òtƒ¹u^Âê(ûvïaÑŠe˜±×f[ÅtBQñ„CßÞ-œ;' ö´fô^w0QÐG“l=à¡êÍKÜžUåø¶5L BÈÊBó�ü¡0[{€p^!‹Î¿=•FUÔ#·›�ðPT[ÏX4F:•"‘H i®X È ²—ªiÜüç?³`áB®¾újÊËÊøôg>Ã)§œ‚ =ÝÝT–W°{×nrrs‘@|lì06µeÙ¨ªF2™$ Q__Râ ‡ÃÄãq)©¯«ã̳Î"‹óŽ«¯¦½½�ßþö·¼ûÝï&™Lqë­·0ÐßÏÐà Éd’Þž^Æ¢Q¤tÉiãAØÉx°ºûUصv -�=œíñ°áž;ñB´··‘ëUñø¼¤usÚŽŽ#ñü¬_·�Ûî}!‰dŠç6íä´U §™õí2¯{zP#dEÂXFÆ °…JPµÙÕÚBc} þ`€tÌefK\Ñ�ý=½ [^N©ªÅ¶¬Ãú̓(šÂÐ�v*ò‚øý~ôéd=Ü- ikïvïWU[2³¦ÍëÁŒ§¦… =n»¼¿³_nþ€—TÔxUĤ”IÜG¯� ¬Lݤ´¼ OA[÷­§¤:™¶±-IQ¾ÃÌÉÎí;YvÚ²inTíAJ‰×硯w�t r_…z²�‡íƒì‹çsé¬zLÝW8®³ƒ#@�‘68ërÓÎI!%ÅÕ3yó§¾L +×u§™ä à8sϺ�}ëïgil Äc®fïD0µmTE¡¸¨˜5kÖðøã�óðÃ#„ ©±‘ââ"þô§?‘H$xâ‰Ç¹æškI&’Dc1÷82LnÛ²PU…X,ÆØè(Ý==nï±t#‹ÓØÐÈ�7þ�‘¡a²"Y†É@ÿƒƒø}~Ö¯_ÏÐÐ0Ѩ»í°uÛ6²³#8ÒÉ(�I�.YMc£c ’H$XPWCò™{ñ(‚�{vóÔÚÍ|î?ß>2¥Oã`*Q¼~ûçûèîFÓT,Ëfõš­|Ü| ªªdÈJÓ±o7§ÙÑ5@Vqª×‹9‘žvM(¼f‚�ýûXqö¢‰bb%ØÚÞƒ ��_ˆe¼ÌuE�áî Ÿ'‘vƒä4Bd2?­í]ÿ\’—ª±_ÿï7³ÍŽ®AÂE‹ÐT�¯âD~»}Mep¯ O0kÑilÜþç�™éŸ•*8Q–ÍsǶ­¤Æ¿[£ŽÒqðûvnÝL��’ÒºãÞŸìªh¶îC)\EQI>–n žˆ&#Ò!¿¤ئŠBEã,Ìt†á¬N²ÿClÓ |f=O®yœë¿ðEÞw͵•”0:661¹”R’L$¸äÒKüüñÆñüׇ>D:•æê·¿�zˆ¿ýí.¿ü fÕ×Óu sbÕêBK&Säää°|Å FGF@‚#–.Y‚PUUÉùç�Ï<€P5Õ5Ì™;—sÎ:›ÞqÅÅŬZu*½½=ÔVWÓ0k�>ö(§®<pû¦¥<( *¥Ä0 TE% ã÷ðzÝm)Q5�‘‘zFÓ,./Dzqkñ¯ÂØ/ɤÓ�€×LPv[£,fÔÕr‡g»÷ŒÐ4»RÒp¨-5ɤؾyTU¡§ÿ]Wž,U!•– ìÛÄf¹ÌŽ�£ÌÁcØÑCAæ\¸¯# ªÊ kÇ)‰æ÷a§ctÿñ{ÌìÜÆ¾®Khzó5øQ2šÅ“9vw%¤8ÿõÕï³á¡{ùËý÷’§8ÔTWQRRBaQ‘Û>•2#�166æÚÓ:£##$‰Œðˆ3!>âõøðü!ðx44Õã*} &¥m[˜†AÚбm›T"ÎÈÈ(ñx ÅãòlâqW•, "„Ȥ^ ¶tðhB@:•Ʊmt]Ç4܉„i™•úx[ŽÀÎô@ç‰d±t~ÃøU�ä5›‹º…›6qÁe¾Ú‡{Ò@J‰×£Ñß?†Œ·1kfäU°jŧұwˆ%¬œßD¶bcÕªž îe‘ŽDQ=(ŠÃ³þMÛ¹è¼ÅüñÉG^?ƒ•g�C2–FQ•Ée±ÉÔÔ…`ÖÛ¯ ÿôUÜýÇß²fûäÆM” &ÒÏ–i06:Âàà=½}¤ ƒ`8‹PV99¹(ªŠ¬tŠ‘¡A,ÓDQU„”HÇÆ±mTM#�••…ªi8¶M,e,žB·Lf6ÏañÊÓ‰ääaÙ6šÇCn~!ŠŒºýΙTÊx¯íØÈ¶i‘HDIÆãئI4:‚”�J¤�¢ Ë&+'Bu}‘õÏÒ0³|Ú¾/U(ØŽÃ�·ÞÏhÔ­ÕO¨[e&ϬßN|,ŽÏëÁž¡ UU�ÆÑ…ÙåEdi3 º»W<øÓ}ô´îbÙÂP•ƒú߯FgWiéaÑŒ2|ª�xñçB:¡°JlOÙ‡¼Üö42¯¥„Öý½hBP]UJWï #£QEÁqª+ŠÉÎÎB7­qu‘©?�FWï ¡p.ÍÅyîdS}uÆ ŸOà(‚°öòû~ÍeÈ´˜½ütžúÛ­\kZ¤£€•ä”Ù|ÿÎ�Œ�ÆñxüÓÞ÷øZ€”Ÿ_eûæM”†)¯¨ÆÑ�¯ …#%ŠOå¹MƒKWPUšE|,�v¦®¥”(~ !-žýÅ·™7¸�3W,ÄL˜¼u~57þë÷ìÌËcáâ…$¢é£ .¹ÂMQ�“Ë?û9R ƒ®ýmtwìÅ6-¹ëž{â1.[Niãê (¯¨¤´º‚`8—Hv.^_ÀÐ… ™ˆÒßÓ‰mèØVšGî¾�¬œ<ÂYa:ÛÚèéì 6<Œ°\bÚyo¿–E§.g°w�ÇÇ9—�G2îÖÊ$E™^*y!2LX1Þ«)Ž�™Î,„dž@†‡Ò|ó¿¯ÁïÕ¦EñÉqY!xø9n»÷©L-ùàïÇÞ¶³��;öqÚò¹XÉÔ”jH)šJGÏ9¥äG²qÇ%$IÕ«ßßÁÐà s/Ód¢žœ :»Ú{((ŸAQn˜D,�ç%ž zaø@%¹A¡étzÚV�Ÿ—¯~ÿ�¬^³�Y3*‰bÙj枯*/"�qÓ×i=­Oi°t“Q í݃–W‘—í#:’~ÕJ^>Õ Ê¯›•2¸«eÛ„ú¦9<–Êet$EN$„mØ`4Vzƽ0£¡ÑeÆž éÏ„ {·o£ªÀB z±FŒãÚŸ,2)Ü]ûÓÍiDU2�úüê¤hÒfóm7QÒµ‰³VÌs�èm Èe5n}è ΘAØIJ�¦÷V Õí5ŽZ¨ŠBM] sP5È/)ãÒ·½‹²ê•—‘—­’0a¬§Ÿì¢"Ò)û°Îƒ@°˜Ò —�ò�×Á²,Î>÷TFmƆ‡èe°¯›¶Ý»8ç’Ëhhª¡m_�Ýw7½ÝQ¼Þƒ“Ûñ³8ªð9¾(Uþ,ËôÒß;ˆm¤‰DÂHÛf*Ó3. H%�Òùãß$™ÒQUû°ú¦+Ç�%Ù¸u§­Z0å’›nÿ®ÆàÐ�œ<¼•D,cA+B‘ôuwaXee…ØæA¡·Dàp g˜¢ŠÙ¨ØŽä%Eâ2ÿö÷tS^” š:mŒrÇqP}y9ZÛ»imï>ø»Ì=øØÓ›ùÒ—Iqa.§-�CSC5ÖTZHffxƒÃqJªæd: ŽòþœBH&·ïo©qŒ0L‹ÒŠR´üFö´��×=Ei *òmÊs-víØ�ÇÃq÷>¡(C—t¶l¦±ÒˆãÛŸŒ[Oviö ú¨i˜í’÷NÀ¯N:þ€—½kžfó­¿§¹² Ëp¡PfZGó‡Q÷lä¹Ý‹×ïyEíyB¸ö‹ÐSiƆS ÷§h^°„%§ŸAaiÒ´‰E~yç]|úç?¢¿­�GÅ4MÇv빆I<š&6’bpȤ¬º–½-;Ø·„[�+,*æüË.`ùigòÌ£3/Ûvìã‰g·H[8Áñš ÊãuåHÄGÃ’³xnÓéÞŒR€–bYs;6¬�vu ×Ü�ËÃ�Ýèƒ[™Sã8_7 «ÒÑ>B\­fVS=zÚ~Ušÿ�¡(X†Mvõ –~þ‡Üç­c$GS¤¢€ep[—Žÿ]ŸeþÒe¤Óæ1Ÿ‡PUEQUô´N2žBX6«òÿý‘¥Núc×ñ�î¢oçBYGNˆä+Š‚ª©8¶CAqÅå•´lZO ¤áÁ;och0AmCÁîí[ jëëÙÛ²#ãd4µ÷Cf<'66†p ²²‚/˜Ç EQ° “ʲþôóÿåö¿Ê�?½žY3*w,QU……sëhª«¤«{€ÁÁ<ž© Ø6í]ƒTÎhÈ�ÌE†! ¦å°'sª>ÏÄ*Óe4kôö1”‚YMó0ô—&¯J)QU•x"Ml°›êŠb8¤µjÊ!˦¡®’¬pÓ²_ÿÇÓØ_üø;¹â g�ާ_Ôÿù•ÀuÎÒa,íP^UƒË';ñÇüod›H,dS8I1îe,¨ÒßÕÆèКæù·kÔË@^¯BÛîV |Ôg�1ýN=‡ƒ”àQظ{ŒHi#…y˜Æô°5§–e“WRÎìKÉ--ǶÝ�O pl›`$‡æ¥+)«�‰3Å�F𢠅¼üñ©‡yP˜_r)9Å%ôžyxòb½xý¾ò)X–C]Ólº÷w02¥¼¦ŠHN�ûÚ†=4Ì[@ûžÝ¤Ó653I§Ò õ z—!.Ua_[7�œBÂY>lû¥Û›Æ{…{:»jù9‘L¿üT�ËáBÁ4LÊ ó¨«)sßË< ®Þ‰»ª¿þ#o£ª¦ =™š²U2dJ“šÊ�î~Ô@ÙÙalû8k¿B¼&ƒ²eZäåe.kfÓî(x„kMgA(èP_æa˺µÇWüâ$„"©´¤¿m+Íuá üãz ª@�§Ù?`FÃl¦©¥qJ1ž~©R¼Ìï^ $�>7>ñ0�ÛiŠ/¼¡h®M�¢`ë¹MÍl]0‡[þu'N<Šò‚T¬Äv iîBú»ºˆEuJ++1õ4]øƒåÕ3عy#†nSS7‹¾îèé©q‘¸ îTšê«Ÿ÷;W1íò‹VñÆ Wa&SÓSŽÒ:»ú åáõ)'M·Ík2,9RâÕ yùÙ¬Û–Ûq%Î|q–ÍÏ¥eó&Ò†éj¾þ{±üHéZ¼õ÷aídö¬0Žs+”#^•®c$}µÔÖ×aè'Çl×Uï÷ù‡™?LÝ~$¾l?¼ã¯Ü¤æêw C‡‹2( R7È?÷\î�UËM·ÝBXUPÕƒ¶„BQÐSµ� (ªB˦-䄘5g;6¬Á4¡iá"¢#cìØ´�Ú†ZÂYzöwàõMa)Hº5åT"J(ìM�––¨Ãw(‰K¦&¾±’¢\BÁÀ”®âÛ¯¦ÐÚÑ�'”K(+4”]U1سm+å!Ôâ|öíïå=Ÿü½ý#x>ôx’ýý1*jë&¥T)twtP^’ƒðx\Ýìi8«CO!˜×ìÊ[ÚŽ“éQ–”æò•Ï\K$+„5 &¶¤£g˜üÒjT…i#µM5^“AÀ0$Móç³o$ÂØP);öŒa% Îðã$‡é=Ð…×ë¦Æþ�Ãáªÿ(´íÙMApŒ¢‚àñ×»Ð;÷DɯžMNnF¢ò8ÂQAº•1M¯eLh6 iÓÂмx§h@tpµtM¯‡ßä*~ÕÌj¤£ué¤ÉŒ†ô´Îpÿ þ€—æ… iÛÝ‚#ªëêÙ»«Åu욢oF(`Ù�N¤È�„ŽÏ¤Y(ôô¡ëæD.ÌÏÁðeÄD¦ã®s¹.û»ˆ¡iL¬æÅ­'uµÓ0£ ;mð£ßÝÆÚM;‰¥ÓàÑ‹M;”WWb¼ìd5Cò¦¯s?Uå…™Ó™Þ +2tï™5¥D²‚Ç¡* ï¿úšê«HOqÚzŠ"°õ4£)J**3òšS¾›iÁk2(»ue‹ºYµDÕv·Ž U>û“­<ôT/u�Pšë°sk ¯ø÷Bù% hвi#�ZØ—!¹?¸ªEÏl�R?o~ŸË>1WÊî Xx¼‚>‚ÛVc>{7ª¦fÒ±‚XÚ@÷ðûµ …®W¾7Ð$ø²|üô‰¸}¨—Êk¯E …q¬—Î&H!–CöÞÀŸ�87Ýùw²#>ÈØ?FÇFY¿úiæÍG×uöíÚGqYEÅìÚº Ç�9K–b™&ûvî¥~ö\ºÚÛBõ¨S²ZBÁ4ÝôuAnÖ´…–ŽQFœ2*ªk0ô)Tû™B¨š†â÷ÐþÄ}Üýû‰ìyŽ«N�ËüÚ ¤-ñú¼`¥Yß— R?M¼ò�^š#>nXý0wvì¦üª·¡ø}8ö$û·…À‘€Â·¾•ßm_ÏŸ×?M0è!7'Bym-;6®göÂ…$Æ¢ôuõQ5£¯ßOÛž] aÖœyÄÆ¢ìoëdîÒe´íÞ‰©»ÚÇ‚ñ ‚mY©$¹Ùái®'ƒPÒ4éîÜ{O‚Š’—Ü8-{•hªJ4ž`$nRY3·{η°oçjŠ#Ürû£lݱÏ%ìÙ-­ }#I<Á0¡, ûe‚ޔգ02„/BAa1–9=¶›Ó�×lPB §mæÎaØ,fÃöAÒ¦DS¿½³“ßþµÍ¢}ï.¼¾©I»½V ¥Ä«)ìÞ¾“²à0……a·ž|¼DlÙ¥`Æ|"‘ öqšÝOãi²þž.žýÉWð>úÞJ#«æ7¢ØËvÐ|*�}ýܼ½Î¾ŠÆÙsH§ŒWÄ6Oƒ§pøá½÷òpl˜šw½ GÓÜþÕ£¹6ªŠ%$Òë¥êÝ×ðÏŽV~½u#QK2{þ"FGGIÆ4/\ÄÖµk@�†¹ 8ж=màõùh^¸�uO=NQi)�@€®ýmŽÆ±=KŠ"0 KO’›‚)Vó:ãZ†iÑÕç:I)ñû¼äåç0>¹ŸòýJ74<ÅÀC~Q1ã‹]¡ºYªþÎ}ÔUó?ÿùV~û½O°`ö Î^µ�HVâ ¢)I0+!_8Éw‡ª@Ï�.*‹² üÓʼ>ì8ÁŒš2*J øŸ÷½ DZ'ú­§eŸÍëŽÎ>rKËñx9h2rà5” â¼,%·ŽŸë¡ØÀ²% °zMªL±og ŠÊIÃÌ;nP eÓzf•:x‚ÞÌC|üv/„G²­5ɬù+ðzÄ[>Ž7 zTZÖ<ÍÜh+-®§(' U´€!6ì=Àï:LœËÿ‹åo¸á¼r‰)%Ÿ‡­m­"99H)hë¦u`Û±x¼O'çü«¸àão¦0ËC2j#¥ƒ»¨×Ÿü•U„ ¥›Ì+¯æÿó¿`[x¥ä«å¹ÚB558†yÄà,}÷nÞÔ5Äi§œF<•D�]„¶è4²4qÝ¡qî|ž{ü1¬XA}ó\¶¬y†ó¯¸„ª™õ´l\OYU5>_�Æù xê¡9ó’Ëðxú1¦ ¥tï¿DáØøü¾iŸŒ©ª`4š`h$š¶€œHˆ¢üìŒÆtíX¡g`_8›¬H�tÒUäòh‚¶=» ©µ5å�LòÔ3›©©*EõxxMÆ:Ýà –Ìj‘‚‘Á~Bá^ŸÈË�ö†ziš¿Uõ¢ý�í,šY<îdÁÔ)“Iw%šÑxOK;ŽK~Lœ̮«dnC5éd:óYç°ÏNÆ3N:ÍÀXй•5œ$íÉxÍ®”·vfCuã<¹åüä³³ùîçæ {Èò+œ>/ÄPw½Ý½S’v{-`\Swdxcx/�µx5H^…ýbX�*k+0¦Ò=fŠ!%®š’m“ Më¬ëè%ðQ©Ñúཬ{j �ýH¯ŸpÄOÀïC*ÒqŽê¾“Râõ(¬¬"¿fÅuu„ �ú˜…"È-¯ ¤®‚¢Ú™×Î$§¸X†Eie5>Ÿ—}»v1ùrú`l8E]S3C öö �êº{zègÖÜfœc bãº×©DEÚ|Ó”ÝA\e`xŒá‘ø+++D^NØU°›>Ù+úF çâñ¸ú "SÃnkÝCY^€¼‚<ŒXŠ–ÖNæ7Ïé (‚Ξa’– aÎl¶®Ýȧß}%­-Ûg{زö9~ù�/óû~‡›þ#,ËÀ²$C=�”—ºV‰S ^¯‡`~6Á’|áàÄýåÈÏÁïó¢àf‚y÷³Y¡©;ŽCHSU‰ciIQY9Ö‘ç©'^Ó+e!ÒI“Y õ„Jç°ug;ó—T"m…--Ã,9µœÂ°Å®íÛ¨›UC*)3:Ù¯_Œ÷'wìm£<Þ²b®[ÄslC»Ø½yŽF"TȦPñürrk©«›A^NÓS7&½p‘ÒÁ4l$`ª ŽýòšÇ/Û41 ‰iM#™ˆ³é¹§YrêéøB^êgÏeËšg™ý�÷RTVÆÖuk9ý‚Ó©¨®fç–�••„˜¿b%›ž}š’ŠJ·Éø¡¨�ˆÇQ°ð…üXÓj‚âÖâÉA¿—QÅ•q ‡„Óç¹.2ÍØÝý#”Ì\0q,B(X–¤­e+g×–@0Ⱦ];éc^óLì´� °~û Ê«1Ó1þø“ïÓ×}€dlŒtRçg_ýo~×5,;ó4>úö·“_TÈùo¾ŠÔè EEySfƒ)¥Dóh´wöq˽OÐÕ;È¥g¯à‚Ó‘Ò þõðs<ðäFòrÂ\óæó(++¤¯oˆ[oº›=í]œµb>o8wÒq˜J'MUÆR|RÛ±µo¼¦WÊn ENn�âºÅlÜÇñP”çaËÞ(øMæÎ±·¥™ñ¬ø7öîØÎ‚Z5è�VRÆ‹B0,v¶;Ìhž7®˜{|�a’P˜¶CWwŽ‘BQÝZ¸£›i V ëk8¿¹‚+ŠÎ�m§rã=¤îÿ#;î¾…'îû]ûÛPµ£{Ç]žÜ—’±¼`Ò/å)PW=J’•“M2eÿ¾= ¼fR z»hœ»€ö=;‰Euš.f°¿Ÿx4Ší8Ìš=ÃÐèíÆsÌö{nOp"ž@ÅFõx§5ƒ%„À4LgTð›ï}œ_÷“|éS×ðÁw\|˜FóÔïlÃ``$Faiù„Ú›¦©  2ÚÓAÝŒrÐTöìí$ðPVZ€iš€ÊöÖnjêøÛïn ¨¬”%«ÎÀ‘­;vb[6§œs•Uå,=í,Z6®et°¿bQ˜Éô4OÁIH×Þ³µ½›½mÝ$’:ßüÉÍlÙÙ†PÖlÜI2­óä³[øú�ÿŒãÑèî¦eW;ºiñÍŸü…{]ƒ7蟲1FJÀ£ÑÝÕ�?»€H$'c sòà5”� ½æÙKOaË>@7hž•ÍæÝqУœ¾(BWëNF‡¢SnËvòA¢ª É´ÅžÍO±°1 ¤8®×DJP½*Ãà :FBÌš3Ó8q{É-ÓbΊSé:å­ü耗Ÿ¬ná©MÛˆÅÆðzT¯‚´ì´�%<ÔV”ó kùÐÌ o±[™»í.ö>r¶òÊ{| ËB0Ä$^@ZJLË¬Ü £D( s/¥eóRñY‘uÍͬ}ê ªë+ ÃìÜ´•ÊÅääå³kÛf<¯?ÈŒY�lX½í('/„[kO§„ƒ¾iWžBàØ¹ÙY\xö ÞûÎKùŸ}/o{Ó¹ÓÆØ•R¢¨ ©d’±¤é2¯-@JTMб·͈Ò<³ L‹í­û™ÓX‹'èG MÑ3œf÷¶-HÇá³ßú6ÉXŒH$›�žý„²²ðø|–$'¯€d<Á�Ž"•pV¶55¥ ‘é³>cù\~ó»ÿÇ 7‡Â¼lÖmÙƒ?âúëÞÆ/ÿ¾~ýûY»y‰±8ókøÅO®ç×øM³ªxjÍvðy§�h+AUhëê#»¨œPØ?-2žÓ‰×tú2,lÝafã,Õ ècn]<Õ�1œd~]!ŠÞCë®],\ºô0ñ×d¦>ÔÓÓ‡1°‡êªðq¯'�[5î툡û+)+/Æ4¦ÏÍæ˜ ¶å�WPDÞÅWзø FºöÑÞÝNWw+lßKŽ� >/BQ~6AŸp0’nÝ57èeA¶Ænl7ctáGJ¡P“_HýSÏàÙºc©I—õëôôQ2{V¦3Æu‰2(«®F}FcïÎæ.YBÕÌz¶­_ËðÀM ²sËFæ-[D]S3›Ÿ{sé2¤T©›=‡][·Ð³¿ƒ¢ò* Ýxå÷�€dÂ?îz‚h<Ég¯»;‘šPQ;vpÚ:û)š17SM9¹Z¯“ lRVVŒšÛÀ–mϱò”ZtäwP§ªI§(b²eÖ®\zL3¶ñ™õAfíôáÅÒjÇšjsECûÛÚˆÐKiQŽ9]-!/E°}ç(¹5�•å#:6uæçS !À4L„%¹Ù”—,ÁY¼„x<…>6‚ÝÝÆúõO2¸n[gùÌ šªK°ÓŽ-I˜Žç•î[`Ú6+–�ÂÒxlò bž†'BO›n}·•FÓ¼4-XÌîm[h^°˜ìÜ|J+«Ø¼æ9θø|¶­[CÛî½ÌlªgÓsÏоg3gãõ‡™ÑØÀÆgŸæ¢·T½²:‰è(Ù>/®‘Çô*z‘Ùú´8½\2›ÂèXÅ ;'Çv3– {[¶²¬¶5'BûºíDcI7ס'Óø²Ã<³a'¥•|ô‹ÿ�ÑÑ1ôd’'¸�ê™õ,:åTnúéé=ÐNeùB6¯y†3.¼ŒÁžf•ås°?h VÊ™ô¾t ±®’¡ås¹ã_«Ù×v€âÂ9^V-�Í�Î^ž[¿ƒkßzHImE g¬œÇ�»Ÿ-;öÒ8« ™žš‰‚€e±o?ËN+A¸Î0Ǿáãˆ×|Pp¤ƒ×+¨�³œÕÛãì TÊ‹‚ìkKR5;ÅÂY!ؾ…dBGU5$΄9Bd´„åÄàõ|ŒÃ`ȇ”`èæQ§|�6 jÇ>è8$„«,åØÇ¦'+hݶ™Æ ‰ðzpÇo•*qÛ¬„κ}’¦Ë–�s\!7�,MøU�@Q ž²2Šç/eÇs«iùëoÞ¼‹þxŠ•u(HTE9¦ ‡”M¨„Ž’�-%è†qØ}*A:eR;k­;¶Ò¶guM�4Í[ȳ�=Œž2˜ÙØÌÎM™Ù8“™M³Ù¹e3µ Íè)‹†y‹èhÝKï�NŠJ+0ŒWÞ•NÆ)x§e‰ìHyØäû°N¬ÇÑÆ[~\›Ç©Xbâö(�áÏÊÃc[6šªK2Ö»Ÿ…g.Uaí¦�deÉ.È&�ãØ [wígÞ)0oñ\’:8¦Í}¿…†¹ ¨©/çÒ+¯æ�?ù÷ÜRDQi§�7þð»\pFSîÌ Áçó°pq3 Ï^Îàh”?Þz?§,ŸGYq>e µ,š?‹+ÞõyÖoÞÅŠSæ3gvsÎ\JJ7¹ùñ¦‹W¡ª®µâ±.*TMetdŒhÚ!¿°ËšÚÓ=x]eØ4.\Ƚy–ÅìÙìÞŸàLCgùì\þödý=ý””Wbè:Á°Û2pl›`¶C'“’;|ËR‚¦yÐTÁ�öV4U%¯° Éd´¢ÎXE9Š•Ž$�J ©>Õ5<�Ž�®§P=¾—œ<éHE ’»6ñ®Ù!7B�Üá!!¼ £}1ö ¹`N3–1ý«¤©Â8i $¶mãUUlÏ®YG÷­¿åó‹ÉÍžIKk)Ó" €­“6¼’s”¸ðˆ É‘ãâ—9ÈLMSÓ¨Ô|d[Îa—Ž�?ä§¢f&Û7n`fc#%•øZwì¡yÑ"6­y–ýûÐ4o;7m :2@VvY‘,ªëf±{ÛV*j«ÐõW–¹"cÛXàs™tSÌiü )&¨�žÒÝ÷C~ðh¸3,=­»Ù#MC úAJ¬dûÙ šJoÿª?H0ä%Õ …|´µvà±̪«�”ÎŽ=ûiª«Bx4<ªÂðhŠþÑo˜7Ÿ±˜$•p½ˆÿû _Æë1:lrÕþ‹=-[aÁò$“ Fû:©¬ZŒkH~ì×pâ\´ìÙ�Ïï#œ“ÅžÖ4×W‘Œ'Ù±»�Úšr6lÞE2¥ST˜Ëþ¶Ä“:EÑ"6nk%/'ŒÇ£‘6�}©,%x4�þ‘1R¶F~Q¦yâòQ^ ¯‹ <îU[_�©§eûW¾¡ŠtÜDŽéÔUz(Ívرe35u•$“7|ï‡ öõŒd£¢pñ•ï ¬º#mº­9 Ø–�׫�Žpã�¿‡×£Ò¾·•ú9óùÏÏ~–è¨kK¦( ¶m2#·Q!bÓpWéBQ\#EL�P×>Çqðx½¤R)¾wý§yë{?HóÂ…86hïàßø2üÌÿRS×H2c‰æŠ;S”/µ"—¯ÏC_ï ÖÈ^šgå€ùêÔ“wí�áÍo ¤¬ cºDë§ Žã © ZÈGÇÞ½ôwü�¦EåP±M‹P¾NS•ÆŽM›¸ìÊK±LƒG·¾ïœyΙ|ò}ïgdh€ë¿ÿTUsÓ\Žƒ×ëÅëƒÕ?ˮ훹ù_÷𓯇›6¡ªà÷ûŠÀ²,Â?ɤ²"tÝÁ¶,!/û÷îãÉÝË›¯ýBQQ½^·e²¼¤’®Vr(ìöÀç÷ÑÝÙN2G(ထN±ß4�Šæ�`(à> RâñxÑÓî¾}/¦a½@ºÐ Qè9ÐGˆ>JJªÀœ~ÑúÃŽ@�Ýí)Jê’ñ=qëÉχt~?†�lݰž}û%WæÌjªÃÁ´<>†žbíÞ.ÖsYôÁÏRSUF*¡¿²A^JÃÃøN[F¨ºúÈŠ^IÆÑ§W“r[¸™ áÞ¯‘ÜåUÕlß°†êº*kg°cÓ:zô±`Ù)Üvãïè¡®yÿ¼é,\± �×G8;‹’Š öíl¡zFÝQŸŽÛ¢Ži †Æ…Œ�þº¼è¶Ýí?³±…T*ÍðXŒOý·Üú«/QZ”ËÏÿp'¯‡¼œ0Ù‘0šG#™Jóùoÿž»;xã§¢* Çj¿îºR9 ÇÈ«ž?qý…Û7¬gIu!Z(HrxŒÚÊlÇqKž«×µP^[Gv^˜ÑÁÔ„ˆ‘vûÜÇï¡t"�ã8dçè'â…¼HÖ”YmÛæòóOá’s–ºæ¡ V*�”ð©¿•d2MÀïChz<ÁéËç±jÙ\ Ó"! ãØH�‡@h*�Ýd• úI§Œ“ªG^'AŽ;s–¬bÝãÊ¤Ž°¡‚>ÊÊyÖܵ�ᡚæ!”•Eyõ –̨bÕ±þ©ÇQUÁš'gËšg1t�…+Naöâ¥Üó×?Ñßu€»ÿq'†éàóûñh°eûfž}ìaÒ©$5õ œsÙ›±-“»þòwZ6oÄpîÞÌ]ý#÷ß~+£ÃC\þÎk‰��ñÔƒ÷aê:�óæsÚ—`èûõïélk%¿¨„t2‰Çã9^‹Uñz}<øÏÛH%Ӻλÿû£ìÞ¾•Þ®\ööw¡§tnûý�Ì^´˜Æù H'õÃÈ-ª­;6Q“›ÂòcÇLŽç"Õ­'§ÙÝ¥2ïòUÇ<ø/Héº ùÃ~vïÚCç÷S?°‹�5å‡1’ª¦âñ©lÙ·Ÿµ©Úò·pÞ©çòHÅÓÇD2RUEÊI÷7*€šIa¿„¤“6 óðà?ÿÁ@<κør„¢âó{©�ÕÀ–5ÏpÎ/¦¼º†-kžá”sÎ'ÓY¸â4Là �>ÊÁVºd'ô0õYáR°§V¸Æ2-þëš7àÍÍfk'›[ÚˆÆîä7­ó׿� !­cÛ’üúïà_øõÕåçg“N¿Â TB°†ãÔ­(Üg<š¦{Ïæ½ë”‰óÖ ·õV%3ظ}W¼ÿÒø?Ÿ½,!AQ}]û)Î ¢øýØzuŠ'¹zÚ@(U(¤¢‰‰É�žÒñh*†nâ¤Üɵ®(Š‚¦(¤cñ “•©€Û=çÐÑ3LqåJ4�ÀIÊ)ÛþñÂɱ™À4¡®¹‘ö‘0±á$Š'£eXÌ®ö!Ì´ïÇëóaÛŸ]ÍÍ÷=ÊÆgVsñ[¯d ·—ß|÷”VVR?{¿úö×꣠¤˜@0HAq±«é*ܙ믾õUüþKO;ƒ›~ú#ö¶lfÃÓ�ñËo}•ºæfšæ/Æ �_XL$;‡êºzR‰¿ýî×ÈÊÎfÁŠ•üö{ߢ§skˆ¿þú§ÌY¼˜D<ÆþÖ]h/RŽ+ëxéíêd÷öí,Y¹’íë×pó¯~ŒžŠñ—_ý ÓHÑ×ÝÎmüŠâ>ănJ;­;lúA–4€ãÝŸ,Q<*}ý ÚFBÔ75bê'¾ê¸,©ðzØ´f ëù NÚÌÅó« üº�×ïű V·´ñ×A‘+¯cùe—áU½è†y̬_)åÑ¿œÃÉN‡ÂM!›ääåPZ^Á®­[Ð<*Þ@�׋i:Ô5ͦ¯ëɸNóÂÅ N¬xTÍC >úó`<«eb›:¡@`JëÉýÁ)�?ßt×\÷u6ÕÒ¼°��ÁQ Óâÿ}ã¾ü•_308J"žäáÕŠÂ/nø'ïýطر«ŸÏûŠ¥?¥”>ÊqÃ&'¯ÛÍë¡¿·+6À¬š —08ÎQ�àñzhë&–v¨žY�a¼0¿nw#½T–N 5CfŽã`Û®è¡Ï¬›š–Ù.·œær.Ü…ÒÔ”¢(HÃb`4IieÍÉÖ 5�×ÍJY( º®SZ^Ч`.ÏnÚÈ…çgƒaãX…yµE’ Ï=C}c=Ò�ÑáA6¯_G<:Æò3ÏæÑ{î£ÿ@'­­X¦E"gth�ùK—“N$8cÕržzða|� ›Önd÷¶ÍTάcdhUUÙøÌ3l]ûï¾îã¼ý×02lŠh ô-gÃ3Oñ¦w¿�{où'[ׯ£jF=ƒ½½˜¦É¶õyæÑ‡xç}„·¼óJºzlzv5z:…P@q–a�_X̵ýK—ϧ¸¼Œë?ð^Þô®k)¯®bõCÑÕÑNãüùÌ^¼�ØØA?SË´(, ñçßÝBvt5çžÕŒŒ›¨Çq™,%àSÙ±k=0—’Ò\ôä‰í�êd]öÓrËoXêôqÅ‚BBÁz,�ª©xÃ>ÖmÝÍcz6e翇˗¬À§y‰ §!†„¢ ø¨B |Þ#~^T¿O¾ÌFzÚ¢yÑî»õ¯4ΛO8’ƒe9˜†I~q1Ŭyì1Vžwg\ô† ûȉ ÿ NÍuw3pLƒìHØ�*S–¾éðòŠÞþ–óxô‰ l|n+Í µÜôãÏa ùÙïÿÉç¿uŸþðU$Si.>ïÎ9c1¿¾áv¾ø½¹ùçŸGU” #ûè�CUUGF°¹ÅX&x½°gÇ.f”fSRVä¶ÙMl\‚ÏÇêõ»¨ªo ¸¬„têÈ«u—¸ £}=Ì\V ŽœÒ¸,3ÁÖUN”ñÂRÃK£ŸGò�)‘2WC‹Ç Duά*Ç9¾Õ·)Ãë&(ƒÛò h”Ö/`íö'¸ð‚ÌûR )³«}<Ú²Ë0Ð<g^|ŸW>·š§zEQÈÊÉeþ²¥Äc1®\ÉÌæ¹ìܺ)%i9Þ6¡bš&€¹K–’¹KS5³�'ï¿0ˆB¦/RB:™ï’À4tÁ s—,Æ4,æ-[ʬÙó¹ÿö¿‡QqÉ*ŠªMÌ¢%îËãñâø€×ëÃ2M‚á,–œz:�ßw7z:Åé^ât¡ª8¶CV$Ä@ÿ�ÿãw|ì‚ Þ�{LVÛÛSäU4áó)¤âÎDÍì„„”(^…½žcÎÐvÎXµ+a€ãàË b'<²©�gE µW]Ëüù³IÇM óØWÇãpIŒ:Ã;¶‘Æ1�À®•îªldo+f¤ô%?êÖ–m²óòÉ+,bïÎ,=ýt¬˜ lG2£¡‰§øfZÇç>¸¾Â[GÛ6°Í4A¿ù ßKÁA’�ŸÍg/㌬³yâ™-<øÄ®ZH•ß 9\�ó•oÿ3m�Ÿ›ÍÂyõË‹9mÙ<îxàYtÃ$èÑx%ŠÍR‚ª*$’) [ÉqÉBöïÝͬš<�©h|âùŽ`ÛîýÔÏ9�W%u„ ëD�ŠÆ0c”ÕÁi^�ãièº�”Š„±tÝ]é Ëttö ’�ôcO¡OU5ÆF�j€ìÜ>Û¶]õ¯ªjŠJËÙ»k�óNjõvÄcS‰x¯*ø}8SD,�€ªRºÅÍ·ÝMEq>cqvíÙχ®¾„�«7³u{+ÕU¥|ç—·°tÞ,ê΢©¾ŠÏþ߯øà5oä{?ý g¯\@V$„O¾òsU†‡¢¨þ¡�„$­KöïÜÊ9gÍäà4[dTöTzìïã‚k—`GNûŽ—U†;{±“£TUcCßøó·íõyùÁ¯ÿÁ3ë¶“¢ù<|ùï¦0/]×�¼;@Ü·ëí¬bØ×ów\}ÅÙ\xÞ)¤£qŽ”p÷ßn¡´²Š«?üQ ᪮’Â’2¯:�¼ü,†ÓH$YÙèåW_þ8׬<À5ož‹4¦6Å5HG¢øTúû¢ŒšyÔ55aÎ ”…iZ˦47BW,IÿÀ0Á@Îþ=<32DNÍlªgTöƒ4ÁÐ-,Ë:Hty%ý¼€iÙÌ™9“SçÎ<ºò«€Ñ¤^†´$„À´,r Š©¬©#::FqyÛ¶]R–P˜ÙØÄ†gž¢~öücðÇë­©DUS«E/%H�&±DŠû[‡®|àê‹9eÙžxzë·µ²ak+‹çÔóþ«/F&yÏåüê¦{¸õ¶‡˜×<“÷_}1Ž~,æÞ…‘Ñ(¡ì<4OEQ&Ö×ICÝ*¤iM<ƒR:(Þ ;Úöƒ7@yU º>¹`£jÐßÓ�OsÈÊ cÙÇ®Î'„K,}jÍV*Ê ¹òm—ð³Ÿü™üúV¾õ…ô…Áï$2š@Ï´5ús" ¹™/gpŒîÞ!bñÂç!œ—�O›Þ¸¢ÐÙÓO(§¯O#•H¿"͆W¯» l™&ùù k²kïÌh(v‰ ¶ 1©-ìÚÖÂõ_ù }C:cQ“9‹—²`ùRR “s/{§�ÑÑ1ròr0t‡E+Océi§3µXuÞ…¨Š`dÄ`ñ©«X´âT†‡†ÉÎ�`[îñ¡ë?Ëð@,3ðø±mÁ?÷RñŠêaáŠæ-YÆÈð9¹9˜¦ƒP®ûâ—‰‰DP5H&LLÝMWñž�Íü�Äqlþõ÷;Bpá›ÞB2i#¥Äð0:2Ì¿ðÎŸÙÆ~` ΘáÖ�ŽáÁu�ÍÝ3ÙÕ¶ð*ìÞEÉ™CYE¦aœ4¬I—ܤáØòz9wn( v"ΦÍw±-)*¬Á˜ÑŒZZ�§ „üâròr¨ô´õŠëjªªÒßÛÇ–¾.&“š€x…ÒòüÁÒyù´¦c;,X¹ Çv°Æ[j2òµÅåU¤S)zö·SV]ƒ¡ÛjLQ@×Sx‰GU§Ì=H‘iTùŸÿ| cÃchšJ(' =šà´óX¾d6©Dšœ¢<œT#–¤ª¼ˆ¯áŒ �‘�Ÿƒ£ǤT6~’ÃcQ¼Á�Š" »s/Y‹ŠÒB,Ó:8I“4›ZöSV]C(Ë?¹6A)QUèëê&âSP}>ÌcYÝ¿>/+ÏfÕ9²cÓNybHÉ#�­eÛî‚~Ÿ½ŒÂâ<¤ióàϰ£u?yÙœuê|^>¿—ØXœ{î}’sV-$7Á~ÅàñÉBW÷¹…³ÝÞïã¨{4•x]ep%ö<^…Ù+Îà±ûoç¢ -\·=Nœ•ósùÝc»Ž B8˜†ã¦Œ1¡ÃŽä¢ë®ËŽeÙXåÓ´133þDlü³9˜†ËBDJƆ-|þ H‰m; %F <^׿5žù»¬ì\ Ã݇cYÄ£&>�dRŸhKÑ4³HÄRø>öîjáοü™k>ò J«jˆÇR„³Dc1®ï»yss ×½o!öˆîêÿÃM,5KsÕ’tôÉI~JU°q{ŒÒúńÂѡ¼žœ�P �J‘Š�¢xËP„†cX&ª‡ÅóšY,$¤Ótw¯¦}ïãD½¹ì³6X€§¤Šùó����}”n6RJ¼ªÂ£Ï=ÍÝ~A°¤Ç2y¹+�ÍCt{ ïŽÆ¸på*â ëe'PŽ”¡¢yÔÃV®Žãø˜·t9[ÖMd9OáÈêHI:– ð!¥$5s[uÒîj.ò“�º$ôAv®~Œw_÷ufÔ”òƒ_ýƒëþó?X° ‘={0<ÅÐMj+‹ax KwÇÓ²È ‹ÓÚv€Ù³ª_¡M«DSUú‡†KÙ—•Nd.OFœø#ß4À±~…Šæ¥lÛ‡Ì`èH�ÐÒ4U vnÙŠ= v¿ �Ç«áØI¤�žˆ?àűÉ¡j'Z.zý^nøþ7ùòu`óšg¦¦_ìó‡ûC�éåŽo\àÂôòû$þ}¿â{ŸŸ‡¦(`»FuJØÃ†Í=¼õs;yóWcüèæ½àW'å % )<º~€á˜9¡0vÆ¢<*ÊÃØGh¹‘HPáÑ £”7.'+âÖ›NªY®X¶C:¥“Š¥ñ A}ó–¼ñ-4¾ûc”ÿ×W }ðüuÀË7þùOîì@õ¸¾¶Š˜Bïíqy¥#¾¦.Ò¹ m“¼Â| ŠKؾq�úŠö1~ô¤N$àgR¹ø“î V!‘H‘0²²# eÃsÌ,�àË O¤þÝV(�Áá­�ƒ,Y¹Ó1‰!Ûu¶ ö÷á•eE™RرŸƒ€q /æ7ÕrïƒÏòÁë¾EoÏ _ù̵\tÖRV,nâ=ÿý †G8}å<<¾ö™kI¦t®ýØwøáoo#‘LqÊ’f²³‚\ÿ?WS]QÌ#O®Ãëõr´ù¢q׭ή~ÔPÙ9‘£ægœHxÝ¥¯a\5ÈfVC÷EtwŨžQ)·5jf‰�lÏûv·²pù2LóÅÙ–ŽãÎòñÐ]wñÜã�ðѯ| =mRTV‰c;x2r�HÐ<$Dz3†E�á�~Ö?ýŸøÚ×Y´ò,l[¢ªEñ`Û6Žm#ŸÏƒ•1µ-MÓ\©ÌLkŠe¼PxÝÕdU•üøÿ¾Bµþ_ùØ"¤ Žå’°´°—Í›ú¸þI®øä¯Øµq5�á›AU‘ÒzÙT�” j#a±vëèÄ{š+äM*]¦¨ NÚdo�`ѳ‘'i-èP΀-%V"‰ª*h>CôÜ÷Î˗̺üL¤éš‘h~?ª"°¬cË ¸D9Õý®<êÓ×.5~êdT'ž§9óxì¾»‰Ž.ÃtzŽ:H7óàóiß8“„*bñ$Rñ e‘0 ·­•ËçÏÌ´™¹Ÿ“ÒAñØÞÒMÚQ¨©«G×­I÷Ý** õõ�ñ I§§NÏm-5ùл/ãÍo8ETåøp‡Ïþ×Uô�Q^”‡e9¨ªÀ ðÍëßÇþÞA"¡¹Y|ìo£iXºÁ?úÒ¦‰ù Ì)D¦'º{p”‚ÒJ4UàHç óÙI†×oPÖMÊÊ ñÎaóîÕT7A ¤))È1˜Ubë†�,[µìe·¥yí»vâõy¸ø²‹q€X º÷àÉÝËùoz 9ù9Ml4Î_ý ’É8oz÷û¨knv &ÆëQÒmÜÏÉóðåO~µåçüþ{ËAѰ£†Ë”{ŠòÑïîã’Oþ–K/?Ÿgïþ=/Îr™°G¸Ž®^µÆ�Ž(wŽM¼W�çaå¼°^¾®ãÖ“††¢ šEÔ56c'o-\¥4UQðfIZ�Þyâ‘¿rUSe•¹¡‚ª€�Ä£#ܳaéÓâÕ\w¤£GÆø©£�=ŠQVŠc¹¦¬x½$·nC›5ŠRØS·(­ª ’“CëŽ-,>õ4¦ytmm™‘žNú_K±ÈÜïªÂX<‰ƒFVv.}½ƒÄz;X~Í[‘‡$)%xý¬Ý²—pN.ù…®¾€¢Nâ‘¡@Oe…Ùàõ Sú”ò4)ÉÎ ‘Ÿ› €iš†Ëüø½ÔU•b˜šæ2ö ÓÂëÑhšY‰ã8˜¦EV(ˆãH,ËÆçóà÷{Ýn”£Äøê½£{ˆ’æåîí×=^—AÜ›JQ qñJ6îxœË,%Ó¥b°j^Y»�TÊríÚ^dB’q›‹þãJÚvµðÁ+ßÁ™¿� ÞtÑ‘!î¸ù÷œ~ÁÅø+sYýÐý••Ѽp.7üà›T×Õsù;®a°¯�HN.õ³çàõû)(*ä o{'wÿífþø“ïrÝç?ÏϾñuº:Ú¸è?®"Ñ{`?7üà{œuÑ¥HEá§_ù<ùÒW¨mhFOºnŠ"Ð4É�¿ú=íâ›_\ľŽw?ÔÉû®˜A0ÛGo_”ë´�•ïø—½é¶lÙCz •93rÁ˜dúGlÚ9Æþ>W–Óq$³gdQ^Dš/ÿ`H xZ÷FÉ«ZBqqž›¾{Eßè«‹qr_ è'¡ìxî¢Ï=Ä¢X;KW …°‰ª)ô�°½{ˆ¡·~Œe‹WbORâP!0‡sW�ÅÜÁ”IÖãà,;‹ÒòJRé)²ò`ê6 W¬bthÓ´_ÁJÅ­sëÉ�ˆçØ�鄃Ua,žÀ ‘Ül6=³š¢,…òòâÃX뚪`¤¶íÚOÃÒ32¥¤É!¶ C=ÝÔçº<‚ÉáÄ~Ž\V±,Ó´'d3Ç+o¶í`Yã w’-„Àv¬”žùÜ8>ó»L0~%÷¢¢*X©#qƒšª²Œ\úÉ8ЏxÝeE(˜¦dÞÒü뱩‘�`еD3S,œ•Í/ïÚOOÅ¥¥®ŠÎó¾h·/Ù¢ ´ŠÏÿèçÜ~ÓïùÞõŸÂ0Ò,\±¡ªaUÓ&z…Px×”+±aýNŠ+ª8ý¢K¨¨­`ld�më7’LÄiÙ´�ö½{yâþ{ùÒO~ÆœE ÐTøÛïþÈÎ-YqֹضMWG;-›6Ñ8o6©¸�ª©D"^~ú�Ÿ³÷¾oò�Ÿ.CõùxÿçÖ3§.‹`¡+eòñ¯oÆ¿à:Þù¡àHس}9Þ!JKÊ�Æ$-óxvÛ0–-ñh®Hÿ’¦\|a/Ö˜ñ²¦"ó÷k[ƨh\D0ì=©ü“…?àÇÐ30ÀÆûþIpÍÝ\=¿ŠÜ² ¤-AU1Œíºxpß�±ø?Þ… `ƒxˆe;”–—3£²ü¨j°B…¸!]—ª)À\a›üâR KÊ2G¹ ˜H_‡>�SCF;¡ (Äâ ¤C »¶leöÌb<áP¦gZàHð{U:¢ô ÆxÃüy:“ 4®–J*e‘ za¥Ë¼ž$TE d4ñ-Û~ÙgQ‡ðxÝP2ÞBzðPÅ‹~~üÿ_ìç£Á¸œèèÈ(q]RZVuÒgÛ^·AÙe�šÌ¬¯%é›Á¦�mœrJÒt�¦IY¾MI¶MËÖÍTÖ”“N¿ø-(áý臉äärןobÞâàHA?UÁ¶í‰p Fóˆ¦n`gzž»çþò«Ÿñ‘Ï~ËÐÙðÌãX†‰"T|>ÿ�Ç6m� •µUèºÎÿ~ÿÇ”UÕ‘ˆY¨šŠ/àãWßÿ9O~—_}}1JÀϧ¿ºž¦™Y|ács‰Gu>ÿÝmD–|„ÿüìgˆ�¥ˆäصu3�å ¼8cÆËN°Ç[¡ôQƒ5[F°l‰ß«°rA.“a‰ U`'ÒlØëpúEs]ÿä“l¸§º¯mý›žEnš‹B:³Ï˜‡”P°…ͶÝûصˆUÍaѧ®'»f&¦n¢ÇÓ/Ùw>xT•mÛ¶²«¿Íç›T�X(3‘dÁ¬&jË+1¦Êø^¸=òÎ1lK H¥|¯½ô5€¤iBYÙ¤&í;6rÁùu™À™©ŸK‰ðùغ{7¾¬ªëÑ�¢&¬ª*ccädž(/YæäjûBtÃ$–L  e…0Rúï)UUèêBJIyq>ŠX¶ý’’™‡Šƒx4Õm�²_™Ä- hô �bà%¿°$cyòâu”ɤOr ½d•ÏaÃöMœ²Ê¥ 8ނכbvm€–-;8ïÒ‹_|4�Ê®m›襤4�õ«Ÿ¤¢v%e嘦ɣwý��Å‹X÷Ôã\ôW"‡èè–i ª Ž´IÆãhªJûžÝ8ŽMiYí­»ê離®�âòrþüË_ð¶¼)TêfÏFóyI%ãÔÔÏ$•´ˆdç`[‘\?·Þx+ëoý2·~o>3røá�¶ÒÕ—âOß_ˆêQøîÏ·²I?ƒŸ~á1u·dêCûw0gy˜‰|ÔËŒŠãþÇ­mQv¶Ç'Þ«(ô³ 1Lçey¢R‚âUèÙŸ '‘CUíL Ý9©䥔x|^v¬_Ö?ÿŒK"«fÏÕÃøµëfs{7›’^–¾ó¿˜{ÊJ’ Ç­ÿÃ1¹E¹Ýd‚ç¶nä„«K‘/Bø{ÞA£ú|ô<ý ïݧÒT[3e«e8Æ~^!�X¦�Ïï9é&h“…i˜h=]=è#=4Í:ç�ï@J4/ÛwwRVSCV¶ŸèHzr÷ŠtK$CèNšÜ¼llÛyyã°Ìj³§oˆïüâVÒºN8àÂ3—rÖÊùØŽÄoßÄû�ƒb+ž Ÿ?ýýA„ªò‘÷¿‰ÿê\õÆ3©,+D?¤N.„kóèõxÐu_ÀÇ_n„‚¼œ½Œäód@•‰ý¾Ò?|õî2K»zð…s †CØÆÑ“ÅN$¼~ƒrŽ M —²á–?aÇÓ¨ªŠm 0“,Ÿ�Ç£·ndh`ˆP8Çí!<äË–HU�JÄYýàý†AyU5½õj‚Y\÷ůòÐí·2Ð7ÌÛ>ð!jšPU/—^y59¹ùèiIv~!—]ý.*—¼õjâcQ~óóß2£¡‘†¹ó°,‡�õÛÜqó�Üò»)©¬æŠw¾›ë¾ð+Ï>EUðø@O9˜†Í5ÿó?¤Ré¤IAq ïøð‘Œ›¨šÊ?w=FÚ$˜åÁ6!×)*­àº/~žØ˜Ž×çÁ4Ÿz‹O=�d"…ßïÇãÜó÷»yø_béLÍëaÍÓ=üîöv¾õ©y”Öfó£nàÑî9|é—ÿ‡Ï •rIa^�¾�[) E)/.Äy’—â€À2l,ÝbíÖœÌ@pÊÜ\¨8QóeET\ˆÃŽÖÕM‹ñùLý$|˜2ín  Dz)/Êã®õ-ôù x÷׿NN}5±Q+•RLmfV:Ç4°¥œûZx=ئyB1T¥tÓê¶e£ ñ{½'ÔñM 2_‹i9xƒZ6nàÔú2„׋L¹ŽFR‚OÓèŽ3O3£¾7ù1ù;FQ ¿û¹a/ªß‡1–˜´ QEiK—Íai$Ì º‡ý=ƒ �Ƹ馻‹±°y&žµ¿ÏËæí{¹ç¡ç(*Îc_{55ex4•ü¼þ€�=»;¸ãÁg‹Å9uñÎ;k)úÇC|ëgcd,ÎûÞq)¥%®Kœ¦±mû^|rÉTš¥ 9ÿ´Åtv÷³vónlÛföVV-�Ãg,v�ÊȘޘ]}#äW4M"Çwâã$§BºAeMÁ²<³c|îƒá˜6…¹&u%vmÛÆKö´ H%u’ )at$�iE�¥1 ‹tRgl(�ž6‘R�ê8Ù;ÇvˆGu$®Äf2®c;06œ&×3= Ñ‘4ŠP0t )ñ4©„ë[ þô»?óȯ>‡.‹ð»{9ëêGùê/ZøêÿÌeñieüàÛÏr×¾…|ùW7’‰�JÛš-×Q]&!ä}I‰M¡6íaëÎa´|¶éðÔ¦!l[ *,Ÿ—ö‘Yתªb&tvt)Ì^² Ç9ɳ•Âý�cÛäü|ú�gðî%µ<}Ã�øã�~A[w/¾œÁl?�Ç<‘9öý‹£�`P2Ï£�6Á€Ÿ#/ûOB8ŸÏK_ƒí;X¹d6:‘’áóÒÚÖ�ê RZQŽu” wŽ„žý­Ô”àê‚MNHÓTöíï忹�O\÷ ÊŠó¹ä¬e˜Ñóæ7pÁ…«øñooãÁ§6p w�}ö‡ääeS[]ή½ðû}ÄâI®ÿæ ´îïÃç÷±bÙ<–¯\À·ñW¶¶ìcFM9¥Åy̬)'§8Ÿ_Ý|÷<º†î¡1þó3? +dáÂF¾ôí?ðØ3[ˆ'R|üK¿ §˜¦YÕ|é»`KK^¿Û‘(ŠŠžÖi;0@qyõÑpÚNX¼®WÊàÖE¼¨™³ˆm[à-ÏQ‰2ÍÒÙ9¬îhC7yÉtìD-èùböã? ÷o'j+ÛÉ´(â°í�é1>lûÂ5­xEÁ¶l"Ùî¿ëa6Üöu¾]9¾wÛrض/ÁXÒ";âá¶?íàþ¶>þ­o’—ŸG,êö;ŽŽ'“={·qÙJ¿Ë´y‘gØq$jPå¡5}üêÖÎ[QŒß§Ðz ™Q ’Ì­‹Ð03 GŸD„Õz;â¤Ô jfVc™'™Š×!°L!m„σbÛ˜C�Å%aÊ䛺ž#~[kó*¡|&Eus()/Á§iHË™ðU~¥Â59¼W^öó0a>"Ám�±Á±ñx´“|–ö�y¹9ìÞò8§Í¯¤¶ºS?Ô¦ÔM;µ¶ ·¨”pV�Xt’õdܮ˂è`?ÅK ÜíMò:Žë7 ³vC g¯ZDii!ñhŒá¡ÆZc �ÅØß;Äh,IIA.¾ö2È qÿƒO“L먊BvVMUÈ/Ìåñ5[‰ŽÆŽÑ×?ÌÒ…�åçpÁYKÈ++DSUò²Ã¬Y»�’¢|Þ÷ÎË býú}z#oºø4j*‹yç›Ï%wF÷<ø Ûv·³hI32.Ñ| ƒÃ£Ät‡¢Òblë}+'^÷AÙU§�yKWq÷ÃAR£Iþ€Û¥Ç8enw­ßGoç KÊ1ÒÆK×J_d�_ )Šâö²*î!ÜY줭ÊùŒc;–¸çŸ�ò§/½‡›¾ZCiq„<°qâ´,xï§C¯ä‹¿º�Šªr¢Ñ4ê„�Dózé=Љ1´›¦êlx)²•TAv–�Ö®4­ÿè˜ø•ªl Ù”°i©¿¸þ¸^öÆ�ÄÊÎ¥¨(ŸTB?á‚Ä‘ !%9Õõüù±;¹ph#Kê*ñg…ÁiCII U(8ñÝÑmŒlßÎî§oç^Û�R¿˜Ù«Î¤¦²Ûx壉n$MÅ2'•¾ö¨�2Ò®O÷+ÞëÔà *®%¤”Çæí}¢Ámù’ääÐ×¾“3ß>þH˜ähì�g {÷¶Q^&Š–a+Obûã2žñX=6JEiXöä®a¦½sfu_üÔµ\qái¼ç“ßå}o¿˜›þþ í]}|ôÓ×rÿckq¤dx,N^^ÄU’3mBA?–ãL¤ŽÓRò±ÿý1¥Eù¼íÝ—ñÈêMX¶C4‘Â0m7ShÛã˱ÙÙ!·nm˜äæFèêîÇt‚A8g4ŠßëÅ:d9¬hýCÄL•âÒÒ“zr?Ž×}PF 䪦3«ž]{;X°0œq�r¨-„Õ(-[·QQ]�ž–“vwIŠª¸²Š^/¦e‚¯Ï‡m™(Š ´rœ Ç!òðø«yà7Ÿç*dÖ¼2nø} {»“Ô–ú¹üœ2"^›Õ�å¼ûó?¤²ºœX4…zˆG±”àñ ö¶ì 2+JAQ)r\ à×É=¡üˆUqû ¥ÄeffÒÝ�¬â ×=KÓÌ,>te- sq^¬ßY�[öéT7ÍCÓÜ•¸2^¯Çî„ÎbæÜ…hþ"»vo£­o/9ý½ÔûŠ#ArlS"½A*ŠCTICN‚ÙC£ôv¯¦÷/ëØ4ï,æ_ðFœ#9<½¡PWXÂàÆmx÷íGÉ H‚Pªûú™5k.º}âôtޝ”Íë™\Úõ$‚Û0©.+âkŸ~g¬˜‹•Ö«÷*Š‚�J1<e~Y©Û&xS'UU‰GûÁˆSZ”�sÐRJ Ë"1§®®‚H(ÀÆm­ �ňd…ñØ6]½ƒi�óN_Ìíw<Æ�w=NEyO¬ÙÆ™«"ËqÐM“žþæ4ÏÄŒ'èìêCJIv$ˆmÛ<òÔ&®¬*EI"•æÜs—ó››ïâî;§°(—û~ŽëÞs9�J8™kcZÖÄBGºu0zFP²sr±mkÊ�7Ž7^÷AÙ=°ÈÏPP½�g·lbÁò*H¸„C(FM¡ÅÖu¹à² '½ÝñÔp"å�ÛoeËsϰꂋ9ÿŠ·`YkŸ|”Gîº�¬ì\Þ|íû).-ǘ•ß±mró¬_³•o}ø*~û¹bV�=“ToŒ=ÙÃUç•òó¯-¥eGü^‚ë}sæ702tx@‡ªÂ®-k˜W%ðfù±£/ÓŸlKŠs¼ø<‚¤þÂ`K:<¹y„öÞ$_ø`ËuÜçHÁJè´v«œ{Õ"7åt²>GÒe 7Í™‹=w.IÝd¤·—Û½ŸÄš97G²¤®Âe£�¢ ùƒ4VeÑèÕíêä–ý{°¤@}ñÊÁKB†eqÚÊÓ9Û¶Ž¢>-QT AúEDq^-Œó'„´ñüîjê5„q�•â¼~ïXºŽ}X+”DÓ4c ºC~q¦Û±8)ÈL;Ô`_Y>…üœÖ¤úÒ¶ÉÏ�púÿgï¬ã,©Î¼ÿ=§ìj»÷ô¸0Œî4 ’÷l6žÝÈÆ=ÛÈF‰A’M !H‚3è #Œ[÷´L»\/;çý£îíî˜Av�—çó¹Ý×êÔ©ºUç±ßó{Ž_†ÒŠd,Æ+^xE×ã½oºŒw|ø?ùâ~Â…çœ@GK+V-æÃïz%ßüï?°h^/>ÿ$Ú[›0„àô–3¯¹žO¼ï5üÛ—ÂÞ==\~Ñi¤âu µ¼îeçñ“ßÜÀ1«�â¤c—bhX¸h6Ÿþ××ñ�Ÿ]G©ärå+Î炜̖‡wqöÉ+1 (NXµ˜ÙmÍQí5€!éeñ¸E.æžÍòÿ½R†HQhó—¯dó:ï!¥ T¼"ÇUËOnÝÎØHËNFÖØã,dZ먆yÃz&F†Yqâ‰\õ/ |—‹_ùú»»YyâÉlßøßü÷ñ‰o}ŸX"M<úØa¨H¦bÜw×Z®ùÚøÎ¿¶pê 3 GJÈ>ñ¶ÅÌŸ_ú‡ùÒ¯ïøü�X¸hã�ª�%…BÈ`çV柔*§Ÿ»¨ ¶Æ&—܃{FGa¨öF›Ÿ|z3:R¨Ü# ô£ÐµdOW–¬l§cö¼Çé$õl�B¾„b†¤cF ¯x=C§ŸMßžün×F˜í‰›ŠYÕid"”"0L3þ„÷+„`<—e¢�=�‚št ñÃè‚ö¿&¼’‹iˆÉZØçœ”ÆÏå©ÐON)×¥hRÉ*TxÈk­1LØßGCu '‘À?Œt)¾ç1wf+ïºòÅØ–…W,òêËÏF+M"îðÓo~)¡*™Äó}¼ñ ž}«—/À²LjÒ J%KJ>öîWaÛíMu\õí�‹Ù$cžàg ¼þeçñ¢œDU:ÉœÖF¼Ñ ÎwEÈy-%*bH�iI–�Ôʦ5ûxûçûxï7¯æŒóNdt¸ˆ<„B®´tÂÞÉÑó«Á½�€”&UeR•6(?"â½þðæsÞyí„£Þ£—aX’í;ÇqΠ±)M!ûìË',`^¨!(¹B0£c³çb\tûûÇùöW?GÏ?ÿÄ×^qKg¶*]æÌ~bJQkM̶øë?oã7»·`¥«@=¾g$¤Aql”·žu1—¬\M¶ð  6-s'rY⎉i¨gбð‹àФ1;•ÁàÈéšš#£_-cü†úúhi¨B:ªô÷áAû6¤ÀŒÙ(¥£Ö‘VÔçÛj£&5A5�ÐJãy>MõÕh­ C…mG^<�„!Mõ5|®TÔ½©¥¡ö€Ü°Öåk]U !À-§rL)±bFyNljHe":Q %—¡±—püÑ�)Úõ¹k‰…Ç�Tn¢�¬›Ð³@Â0IJ \O±uͽxïâ5u%f½þb’–Aàû¶ƒc›¾÷Äv"„!9Ï#qÙe$;:Їô2‡¾{Ö�ÍLI¯‚§Y"P—﹘RbùÜ«S~‰¢H&»»úHÔ6‘J§£ûaÞBHTÃ}]¬šÛÈoíác`Ô´^æšÌ Çù:Ô媺©÷+Eô„ý9pµk¥›hÔ›{êû‡œSyß•P6—g´pÂÜ…åʲgÿ:òŒ¹%ÿ¯%TŠD }ѱlØžŸ<3‰4ó,�ë°só–# '-Î5õ1þñ—kÙºaç_ö2 y�e9,^q,G¯XÍÆûïe|dÓ4J ƒ�t:Îþ¾¾ú¡÷rñÑû8ÿEó rÞ”B®vèÙ7ÊG¿ÓÃñ¯øç^xÙÌ£+dDÔsuÏÖÍÌm·Q�S_Œ†D̤¾Ê® �ØkÙ¼ó"bŽ�P‡FÍê2Ȩ˜)²µÏ`ÞÑ‹Ÿ% ÓE…!¶e¯Š3”™à®ë~OßU_ã’ ‹³æ60·¡–†t Ó¶ÊgýÞJVÓOX†��H`'“X©ªÇÄ㘱ø3ÊÒD×R.—%3±-óð«žKbHzû†HÔÔOGä)GMvƇ÷ÓÖ\÷„v 9Ò”}W µ ´ù‚?˜`é�=ÚÏá�ý�˜Ï FF'(… �­Ásƒð¼§\ATB´üø¹iM ÞDÛt"¥áf8þè&þü@'ý½Ô64V®FkM]Cœ›þøgîºùo|ýª_2gQã#3çµ±`aç_v¯>óLÖÝ{/¸ôR&F=DY™†aHMMœ�;÷ò½�½�ÿxi–K/\NÐ_Ä0a¨1Ó6ë×÷ñ©ÿç5Ÿü)ç]tƒ‡Î!OŸ—aò=;ÖrÙ©ér‡¡G·ª…ˆ,çxÌ ©Æʹ¨@3¯=ÎUŸ?†Æ†a1|ôp™Ö`ìîÍR°f1wþ<ïÙE­ùh¢””’Tmœ½ÝCì¸õêºÖs¶•gÉÙË0¤‰WôRbÅLvwvsÛ˜@­¾œcμð@‰#­5: Ëÿ§ù€ÖhÚl5ùŒAà3U°÷œˆF¶ˆrä£op‚Æy«' fçþˆ0,&c£ãPÌÑØX‡öŸýX�G­5Â6ééÙV‚šÚÔEžÉò¼R®ˆxnÀÜsQ©tuö²à¨x!‹ÚM’F‘=;wsR{3žûØ7‹V'nsÓÿÌ¿½í�\úš7°}ÓöìèdÑÒeÜ~ÃmÔ7Õѽ· „dƬyø®ž\PÃ0ªÏëííçý/9z/—^¾5æcÈ(Œc¦m†²|ì;ݬxùg¹øò qÛC.‹e™ìß?ˆ;º‹ùsªà1BדǤAZuå^·åhÿö–¬\UOø8ÔšJG4�Ûº ÔuœLM]ŠbîÙŸOÖZ“JÅÈ<¾û~†nÿ †·rñ²¹‰vB×Ç<옾ËÛû¸3¨¡þ’WpüéÇS˜Ê!¿ÿ­ óŒ Kå”cަ‰~!Ãÿ7$RÊŠ¡‰îäȸxä“-ËâÞû`âþ[˜?¾—‹,'tü¢‡�;gמ.þ>bžòBŽ?ëBj“qrÃEÄ“e×’/‡£ûñ¿ˆx �Ë?ñ}>M¢Â 2ì„øÿÊUÖ:¢Œ,åòä]hli>ÌÞÛôwwR3©N% ‚g?‘Æ£Iå¸:ûF¨oYŽQsÁ³zÍóJù‰X¶`æ¢e¬»Æ?DHÐJBXdÅü?¿s…œ‡!åãbf}/äůy5Ž]öx>òŠ+ßÿnJy�¨re²R Û1™çëû /˜·ƒ+¯X�Ê…“Œ@†c0‘uùð·öÒzÚ»xÙë^AvÂ}ÔüÍ!EÀö °h†@Ƭ²—{xÛ5Ö9h g¬ªão\„DDíæ+r Á0 2£9öŒ$¸hùj|ÿ𘊞©¢µÆv,¶oXÇÀµ?áÒfÉ⥭hWá܈1ѶŸ{¶îeMXOÕ /çäÓOÂËò¥ÉTÅ!ЮÇÄÚu¸­­èàñо5²ñ·n#Qßñ̡瘆¾®· 0�Ç.Ï{Ši �Ž‚§®±� 8²ûÃ0¡·k7MµI ËÂ÷Ýç#Út}Cã4Íoþ¿žÎS*Ï+åi"dT5ïèåÜœi`_–Öæ*7/ϱ‹ªùï¿îgï®�Ì_|4Å‚ûØ¥$2ã¥2Mž¨tnC ÁØPé/U9#QJ‹YxAÀgÞó.šýï{ëJÂ\€(‡eÌd<ëòº�o`ÉeŸå ︒ÌDÔ‚ï°sO†A¡Ò½ù~^uaÕãæ“§6 �•4˜Ñhó½_A]�óØyäiûÅ1صaœ¡ …™sÛñŸåùd`Hwnáò&Í¢9íÆsÄ,˜I‡�¾~~µ}„Äy¯äijΧ&™ 0^Œ¼Û' }€§5g{"óú¹ \]õ8ª¶è!Û0wö\Šnø_U!(÷7àÿ3ôµ¤i042†2Ô74�ƒ8x }]]¬h®�Âÿºø¬'Ò8”T01Ål†‰BÈÊ™3ËDÏÞµdº<¯”ßiii"Ö¼˜í»·ÐÚQn¾¢µ^Ò\¥Ù¸vG¯\B!ÿø‹Æ£-xJI!e9$Õñ]—¯~ô#W{ï{ó*t1Dh�Ö"ò� ïúâVšO|;¯}ËëÉf£rš#Qn†e0Ð?€QèâèYµå|òão/à+æ´$øÚ¿,aÉ¢Ôa(äI1aóžé椒ىg?ûŽÖàØ6~¨ÐZ³g`„‘¼Ë«²fã¶+®dÙqÇ¡Ü�|¾tX9ÿÄ̞5‹åGÍ:"&Œå4ÅgHCxUÜáKQNY?ý¢´Ò *%9brMWªRvÃ×v¥«WÔû©ž QŽ´˜DUŽ'ðü挔2jC›¤ãèÑÉ|‹aHFGsäÌZƒ4%¥±{‡’¼èÄñ\ž37Zc›š¦d’K�?šw÷°_šhúåÅÓp¼¶”Üu÷m\Û�$ÙÚ†òƒÇK)cØý7òæúaœr*^þð[>�¢O#‚Vk�mYôìâ«?ü=Ûvt±xál>ý¯WP]“Æs=þí ?æîû7ñ‚3ŽåCïxJ+âék×må ß¹šÅó;ø·÷½£œrz*# ݽÃÔÎ_‚mCþŒVÃ4èÀP.mÍ èð0»C= EGtclÛÓKª¾™tu:êÞ÷9àÿû;ñ&B|7dæ¼ÙdE+ûz³`K@€ërÔ I•Ò¹k–-Ÿop¥%[,fð“oþ'‰îßóïo; K(¿Ì' 0->÷ã.rõóÖ~ŠIÖœ#ÜcDÞQ èÞ±‘%óR Å#ŽAÆ¢ïä²þT±¾ÒH[hMWW–lY‘KGâ!ããÞ£¦2£›H²£;ƒŸÉŒÙ³ñýgw>¦/”§o4†ÀW Ái+qI2Ã?ýƒ##8Žý´Ôk¥�JÓ°x) K—Ó°b +V?Æc�K–Q7g2ðŸ1Δà±TÈ“*·ê{:DH�ëzÌhmàòËÏagg/Wýþïé$_ÿÁïÙÛ=ÀË_~÷¬ÝÊÏw3NM5ýÛÝ|ㇿgÙâYœpìÑ“§í©º†…àûŒN䨮kˆÝÃeâÒÓ„‘�aªãÕÕU‘çø\)èë&]WOÌ“ìcÏy^)$Q§Ÿ––Z’+xpóØFD÷4Ôx,h·X{ï�ضx¢´Å“аºÎᛟù£w}•Ÿ|a9­Í)‚_Îqid2Æ{¿ð0ëÆOâ³ßû.ɪ*J%ÿ …A£ºb‹�þQFö<È¢ùÕ�È' Cð«k;Yñª[øîïvƒ%Q¡FV[Üzï§_y;þÏMtõå!að�»û9ñŠÛùànÄÓªL§wÐ~,ƒ�[Æ©�µ‚††Ás@) !ðK>«Îyw4¬à>Œ�´Ñ¼ñKf4óºªQîúöçÉåˆÅ�#ã2>¬IBú>¡ÖÑÿÇ{hÕ°>Óο&¢p|-)"JÝY-|äƒoàï«–/`dD)ẺsÆk߯†ŽùÛúÝh¡0m·ä2«½� ’îýÙ·Ëdqì§Þcž¤@<’Ï'9’ˆ7ƒR1Oܱ'K¤ž‰ZÜþÏûxûk?Â=÷oâ5—Ÿƒ)$éDœµ›w1Ú»�½]û •bÍý³¯g€‡·îá3ßü%ÿúáo22–=$-îœRJr…_Q]WOx„t¾#ý=t4Õ‚!ŸSžãÁ"¥@{>ƒcyZ;žWÊÿ¿ˆïÃòcNd}oœ‘¡Ò2ÐPå”eU ÷õ°ýá‡I¤ì#²˜µŽª/këcÜò—›¸ågÿÆ·>ØAǬ¼‡�)5²&ɧ~ÔÇ-»çð‰o}—†æŠE?êŒòDEk¤ {¶¬g~{€‘pÁw-4œÿ™¼øô–2:5ZÀ¿}Õ.ê«-‚bÈßnë "€“ÎlåÕv ¥8ä":=Ÿ¼{$Å¢%ËxEMŸ´!ðJ>Õ‰$g¿íýl^ö"~}ÿvtèã86žësüâ¹\âî⮟}‡|âÄœ§´]b†x<À“âñ€+4Á3Šj3J£¾‹íXOïž„@!óf·qÅk.báÜ~ÿ—ÛIÔ¤yÿÛ^Æç¾ñKÞø–Oñ‡ëï �ŒÓ³ˆ9³Úxí«/æóŸx+¶ìáO7Þ�™Nÿþeˆ@‘Éù�m­Z;6�ÆfÒ>³Ï}†NŸ„)ðüK)Îzá¥<˜Œó‹»þ‡‹g$iJ'ñ³y–Ï›AfóîúáW8á5o'�®.çýž H´!H&Õk7ïê‹ÈCR´‘´mZ·ï¦aæ|B¥#>l=URòd–sQù£'zÿQ޵| *¥ ‚óÉžG 3f¶2㘥„%�Oý¼op”]x*˗ͧ§oˆoýðœtüRLÃ`óŽ.ÚM[s=¹bé)›‡ÖaJÆÆ2H;A*GnN¸¬¤ 9�RfŒ–ÖÙðy†ÉèÈØIšê¢FÏ¡~^)B„A@M}œ¦ù'ðÐŽmœr”Ù3¥~Þù¢E¼øƒ›¸í¦›¹ðò‹("�GÒ%êi ^2CðÇ_üš?ûýüô3‹Xº¬™0Õ¶$4ŸøÖNî\Ê×ò]ìX’báÉ×¶j ¶m1<8Dqp+/­ƒàÐüÝRD½UEùE¾¢�·¼t.KÏhaVK‚7|üAz ÌZXC…ñÐûÕ`Á›Ç¨™ùjê’ä&ž¦þ½‡ Î8”‚©³˜Üd*" +6Êt+cÚ÷bjL=Y^Š)MB¥0•âÌK/âÁÖV~tÕr|:GHÄNU•¬!wÿ?¸-YÏËÞþvŠÙ(U!å\S4(¡xá¹çpáøè!É6”èr°:"®)³ËµÏƪ©§ ,Ç¡â©F=y˾×äœÄÔ¹œLQˆ©s§õä®+š�Ѿ&O–à1ÂöѾ ÀÍeH&âh¥*COnÿT,»Zkœ˜ÃCw°·g€ù fò›koaéÂÙ¤Ò)úúãWÿ�’çñº—žÇ@ÿ¿¸ú&~÷›¿wlötöñ�·½ízO�.0 FGlj%«H$b¸¥ÃÃ\h"/{b|77N{Kãs¼àoÿNº–êšçÇ÷óJùÑDÂVžx"{¯½•/!¤�@µñN>ý–f>ñ½ÿ$™®á´sNfbÜ%,“HT꘥i�Y ›ÖoáÏ?ÿÎÀ�üîëË™ÝQM˜ñ£2•¸I¶àóïßÝÍPÕ…|ù‡ŸÂ0c‘B~ X”O–ìÛ³‡:s˜ú–ùà?º5ê¨%#¾¢µ!Μ¶w>4ÌÒcêÙ´c‚†j‹šªˆ?Té¨[Ô£�G|ÅC;=æ\² ¡U´àN—•‹�§”Ý£„¦¯F þ¤[6}í—ScNû_Qº¨¥4JëˆÆQ¤4Q:*[ª`d…Fµ¢tÐh¥ð‹E” �B•Kw®[ ðC¬xš\ �m‹¨zç—ðÜaLS¢…ɘ–ÿb‰O‘›ðÑ:ÚW±¤ B=©<6%„8˜á@ŸVÊ2ÙQþdŠjUk�%Ó# 5ùl‘ìØ¶†!º?B@©ä#t€íØ–Mà„3�/4RDØò0 ‰mƒ!A&B˜ÓD †‰ïyeãÆi”µDš†!Ñ”V¢^Üh…4L Ã@H�%C„©°Íp µ T¥+Ç6u‰p~GyW~SÃ2Y·ywÝ»‘EófðêKÏF°so/¿ÿóíœ|ì.½àd mM|û³ïâWú'Z)¾öÉ·³ü¨9x�ÇèwØ]ÿýCãT74G×Þá¶­ÔÃ’Œõ7BêkªžkýP ¦ÁŽÎ>ªÛp‹¼÷ì'!š.Ï+åG!n)dÙªUÜõËzövŽ1w~3ªuB >gçÒÛòÍ{/�úÇžt<ñ¤�iür™"Û·uqßm·ñÏß|“—Ÿç£Ÿ]¨R€V3eQ(”xϬ£8óµ|êk_ÅuCRx…V,åê´&ðJ„A€ C¼b¸Œâ” Ÿmû«Ø_h ]02œÁu�u5i�* ­/¥(ú}‡±¢A¸åH„$ïÚ(­1¥[Ž:H(«h�À %Ë5ôD9ì­+M¿è!$Jø~TžfYskó,«ï¡ÎìF†›ði©ö™p“”|“Öê9ׯ.mµ%�&yº&šqƒ8¡ ÐHªì�2(…¡2H;%LCcX6©¸&“X¦ÆŽY¡ >&.ñd˒ئ$U�ÆtLÓ@&!ZÆP2F,žÀÇ$ð5£a=ý¹4ª(0B35IÛ3£ìÅ+¡UVØJ”�É2¥mÙh™TÞDF‹ëz,[8›ÿ¶hÒŠ%¼\‘ÓŽ[ʧJ]‚0D…!Ë�žËWW]€^€ëzOm"SÃàX–ªºùýáäÃ(ßc& ôR“´H&âxO’;á°¦[!ÌÓß‹ft¨h!´)&zÚ€Ç1‚Q†³1vö„´…y=AÜ °�©:;Dw¦ž»ÆÛ-ÕPPMh#ž€Ö*—YuyÔg˜U›gV}Ž–t‰dLS IŶ)IØ`HaÄ,…4˜åD¹"ò¾•@«È.SeÏdùØË¢¦Ùi§Ž .„@™‚GGMMÙ€˜ò0ñý© £\|#ý½,hª™ºXŸ<²&šX¶Íøx–xÌ!wpK.Žc!Ù\‘Úš4a!±˜C6›G’d:‰[xâ9­Á0ùB‘þÑ< Í‘R~®ÉóJù1DJI±à³ð¨Yœ÷ú�ò‰¾‡ß|¥;f–¤qR‡9ô8çìùœóLùù JÁ¸‡¬Xަ�¬³øÓ6óÝëM.~×¹èÒ ÈŒ?F·§ƒoÐéß)‡}!âVž,O*E…Št•dÓcû½Ì™±|…|„.?ÊÏ+KO ð‹7d]›¬c¼˜ [Œá‡&n`R LJ¾EÉ7)¡2 ´A¨¢¼aľ©°’ùs5žïNZÏ¡ïø. p ÙÉãBb91Ðß�êr#¤ÄtbX@Jh”¶y¬ÅGôdêÈL8K¢Ba…)£ÿÓpE‘²ÓQS-Ðȸqº'êñ‹úD†Úxž‚'±Œ�˜ Œ€t\ÑÕ¹›x²†Þñ*Ü¿ˆ[úùݶ<˜¬1›Ÿ½?ÆŸîrø�ë/¦©nŒ”UbÜ·É»IZêºyíÒ»hŒg)†¾2pKVtÄBc …ËðB‹|!dÕª¹4´Ìåª_þ×uyË›ßHSs XU,X´”n¸�‰‰ ¯zÕ+Y±t1ÃÃw3ãB!…Â1@ã‡cÅŽôHYEÓ£²ØWòàH=ZoHfpLŸ±RŒ[ö®`ëÀ<´/V1’¯¦6–Ç bH+Om¬@K<Ëq�»HÙ%ºÆ›èÉÖ2èÖÓ?`ÐÝßDçC¯„Ý-$­1ªœ"–âU±,õÉ V$z0Ä>�%ßÄ ÆJ vt§¹mKa¡ A:^$f‡¤�”b[q[a™°°­�T"¤.PŸôiIù´TE�ú”GU<¤&�N†`bõW"òÄC œó®¤o"€Ó >=qÀu)¥¤Tô(úŠªT2¢²�ÙH9eV@oJi´žÔÚHià{>ƒ½û8ÿô™eÎë§^*¯çú|áÛ¿¥³{?c9®|å…¼øÒ³¹Íz~ð«ëqK.©T‚O¾ÿµ´µ5ñíÿ‘×o'_,qÑ9'påËÏÇóü'äÝV<ô½ƒÃ„f‚º†&ÂG«>›åy¥ü8"¥ —õ¸ð²òð½·óùïý™�¾{ñ”M˜÷©äPB¥Ð9÷`ŒNY9ŠÉZB#aã\~ñÓ\sO —às¼àâ³)NzuS9¨xsQ®5§‚V� ! |T ŸÀs'¾ïz^±@"fñàM×2³1ÀJYø™€@ J¡EÞw(ú6^`ây’B`Dž�k‘ó ¾ƒX}?4ËŠ!:")tTW�B�%¶-`•S¡uÔGZlH0¥p§6˜‚Ü apÀ -ƒÁBÍ´÷`VÙ ºŒ:Ž”XEB%)¥ nœœC 1„&Ô‚Rhc EµU^`0\La¾–ŒStT�àkÉ@¶ž„]*ÿÎz³–ä·Ÿ“ìk媇.$Ô14¸š·^á`ø¯¿ú %ƒM *2`Ø1ÚFŸ“§)ž# j9”(%Y?4“17JCŒj)”›Ü*„œ~êq¸®Ç®—›×†¼à¤Y(22ÔG&›£P(ÐÐØ@ÌÒX†?éqë²^¹Î¤Tå3,B7°IØ¥É3[¹FýÐ@iÁ¼ÚAΜ³‘ÎÑv ¾ƒmL°?ÓÈþá™Ñ¥Ÿá³q`ÍÉ µÉ1Õíg™Ù�ja»SM¦fãÞ8×ÂSGFøõý™œ‰˜82 +QÏ‘¶JH qŸ˜Q ?…b5Y·Žl †tYy**¨±©K§BÔ#5˜3¦HÆZS>�i�ú¤OC•OU<À65q[Q“HÇCªbÕ±�j'$íåï(S‘°Qš+ºe¡’(*Ä-)Bk0AÉ¥Xô-²sÃNüR‰Fƪ°,AÌ ± ÓŽaØ1¤a¢„‰i'(Æñrã47­ŠXžFQZ3oNçŸ{×Þx?ÿÝß8ÿ‚SH$Î9usç´óþO~�¿þó~ÞúæËimªãÊW_ĶÝûøÎ�ÿÈùgG[SÝRÌ�°LúF°R5¤ª«¢PùsK'?¯”WDÄ«*”æ_ø ÿõÅj^ôöïò‰7Îæô³gE@_Gš¢Œê�®'¤QÒÇ`Â-7ïäK¿êcÖïæÓ¿x/ �µLŒûX¶)Þ2ͶÖD¹Qâ»^1�[(àr”òYÜ|¯�Ç÷<Š"ö=TD¡Þ°’G�,kÛ2yhÍ�»l ׯ_ÍȘ‡§l|%ñB“ Œ<܉V²ŒpVȲB ©0 ï€{`J?V WQÎî§ñ¢+¶Å£¨ÖÇV¸�%:T’bà0VLÒ_¨f8_M¾š¬›Àó㸡E1°)ú6V´x#¢|®U`VS'g´ï 1™!žr‰Y>7Îp¦žÝ#3Ù40Ÿ¢ßfzè_kO™xA@è%1ã Jf%øÖ›~}GÀÇqA¨C0"/XKEïx3}ù*’±s“ãØ¦�ZŒæ«IÄ tM4R*ÔFyS!!€½®æã„æBÌ8¤mŽƒ§Ó<ãŒ@³fßUdVMŽ™µY ~�‰iÚŒÓä\‡›žÑîÒdo¢mC¡ò4§s8ŽÃÞÑ:¶ Ö¡°©KiJ»Ô&-ÕEÚš£Ãƒx™aZZPþóBODyt‹×¾ò°,Ö­ßA.›GúG/œÅÒU‹££¥‘ºê4ø/{Ñ™�JP¸¶H{[#1Û~rÄ&RÒÛ3HUc Éd·øôïÿ¥<¯”C„~ˆãX¼íCá-müàÖ?qßÎn–Î1XØæP['·ˆÙ&eNN êÏœ™pÙº7Ë=[<6Ìᘗ¿“—¾þuX¦ÉHÿ(Z)Bß%pKøn1z”\üRùuù¿W*zn„V~Ô´¢â‰O>äÔsÓªø3 «Ž=•XºžÍ½õ„¡…p…ž ãZ†ÆÁÁ¶²Ò,gm+a¹§@Ô$Z;òʤxbíæ"Ã@LÓ‰‘·(ƒÑb 7°¸·w>[ÆZÉ« TÅôhå…ZJ…�!Uñóö1§z€æT†b`±k¬×wèžhbW¦·˜Ž·ˆÎ�°Jåü´˜,㉛­�2’6R,¡Ò¼ü,¥áª¿û)Ж!¯‘‘b†éS+!0éÊ43QL�Ÿ(+ •óe…"r�Þ|¾Åâ’ãÿ%‡eÁ]_Kqñ)5ܹ-àý¦É}ÇQÈÏãSv‚õ] ÖtÏcQËI«ˆc(-'Cõ^h–S–•¨…Æ–ÁÊ»rî u µ$ëÅ& 8CFÆ\µS$a•0 E $^`QðmŠ�M¶”`‹ã)I!°éËÖpû¾…x�Á¼ÚAlÃ'í”°�C†$m—*§ˆ¬AÍÊ–Ý|‡œc¼”$ë;ä½8… ÆXÉ!ïÅð‚ãn’B)‰ZÊ%'Ó5SYX=Y_–Û™1™Ö:Ê«KÅ¢ÉètÅ]¹Ñ ÛÁˆ%ó,ª¤!5NCÎh±šÑbФ]d<§�žËÈ�¦T=„ÊäÚ¿—T2Fªª†PU¹ú€¹–oŒ'åTFm_-¶mÙËo¯ý'×ým ïÛK±ʼn7Ý|øËíŒ�g9~ÕQ ]ûöó»¿ÜÁµ»‹‹Ï=‘††jJ…ÒR¤•-zúGhj[�aˆÈ{~޹ÊÏ+åÔ¨‰x€i˜¼é½oclü lx`¿ýÛ_Øó‡;Ém`Q¬šŸ £9Žcô y`ë;õ³Oàœ½šË.[†©Jløû_)f&P�Oè{„�ÕW–¦¹�BP_ËIl†ñH:B=ýÏdí¯F‡°`Á|” QaËÓ6˜òry •n42JN†�ü$òÀ&óÚGpsiĤ‚2„FÊprT)#ÅÃù*’Y²^Œ}ÙJÅÌÐ$4¼IÅY dH¨ ÚjúYÑÔI®–wKÑKxå¿2B˜ ¡@“sѺŒô-ÏAkÐB�ˆ�cGã®Áì¹ÿñ*›_ÝpÇ= #¡o eE9ÌÄýƒÅÚò©*{w†?9_�(²UòÝš‚'0LÁËNµÍ�ihÇþú@@¦¤øÖ[cìnÇq ¾sSš®vZ“v&¸dÁZŽŸ±k27ª´@i£ B�Žë`…<ýôU>©x¡Ñö’@IоÃx)A•S¤èÛ¤�"UN‘êX�öô(RF¥m¢¼]¨ž2-¤éËÔÓ;a°¨©‡¸PxJ¹ªÑ¥P$m—´SdFÕ†Œ"C¾ “P üP¢¥CÖMpÕÃ'£Ð„~ŒþñV´6*?[¤¼” BfÍÔ¦%¶†“„)‡‚uT�Óå3DÅ?eØJÀ¡Tг¡§i2|o™Q­»e˜W;Ac|œ~JìÉÌ`(L1¿fBj,CpÚÌíT9Eú²µäÝ8Jf× Òž'Ô’Ôì6V-]ÀÚÝ%kÔ¤b$mEÜ Ëi%U®é©2ÄÉ+õðEˆèÜ´·5ðŽ·¾”SŽ_ÆùN=~ófµrÊñË8îÄe|㛿áG¿þ+Ÿûø›©¯­æu¯¹ˆ³O[Ň>ýN?q§ž°·L´15ž> Çûhr°¡P!Š0Eˆa(´”‹¼Ÿ à9Œ•Rôç«ÍWcÊ�a/Ážá\79 È6µÀF9 („ çê¹)Óˆ å/•=ár.µ’’œ"ú˜<êƒNøžæ†û6ìV LаlŽàk¾s�Wy ´‰)3{éH9�S$º¢°!Jƒ°?½Á'aiÎ_mâûš�þÌãÇ rðÚ¯¸¼ý“¶ZÍë¿æqÇ:‰°¢l´„Q/rÅt%ý–Â,Gš”‰ïEµ[J²!× aø‡‰8¯��±:�Ûôx(9NÚ.2T¬¢äÛý »È)›YÞÔEMÜ%ÈjF6î&éÄb&é„E:£*'•pHÅ-â¶AÌX†Æåµ£BŒ3Í8åðà_\ˆˆgÝ1 Ò�u¤ ƒ¯þ×5ìfÎì6êÒ Œ–ΟÁík6 ýˆ2µ¹®šæš4 èÜ×Ï©§¬:bÃ_SÄeóä\MSk+Ásy ´Özhhˆ3Ï8ƒŸýáO8‹p‹O â3R¦´îô E�!Á2Á2¢´� CBߥ0‘e o�ÑÁaÆF x… ÃÀ8ÂÊü°œÓ¶,kRAû~äåUæ{à¾ÊJœŠAR JE¢%ÃÉ©Ö(ƒ‚ïЛ©çÁþÙìkcÜs8¡y/ã^œ-} Ê­VÈ 2Ú#'[ÿLJù;ž0G¼‚<†Q[>Í�í`àêIìÁÚgX§ìÔã•÷a>ѸbÚó¨ä::ßÚ€Ð(G4¶Yä¬ùk9oöF*eWO…L‡ú �¯LnܹоLsëûÊW‚Õ-{™SÛOÜòȺq,3@kAÌô'•³!Áw³œxÒ)œrÚ¹Üyç=„a�\&Æ-� Ø>ÒÂ@¦‘7E>49ª¡›z+Ïý-`XÌ®çšO-d$ïpÑ¿1”iÆŒG�D/[±äˆ{q�aAè.Ǹ•ïæï8éU90ã¦î·È{7@KªUR‘�fzXv‰„á‘°óT9EâÌL3#=ŒcXFHÜ ˆÛ’štœêê*êkÒ4T'H'Lªœ˜iˆòZ£J+Â2!ˤ ­5ñ˜ÍÃÛ;ùéoo`ùâyÜxÛ8–É�¿ýQþð§[ز£“™mMü×/ÿÂÇÞój.:÷¾ðÍ_3kF[vîcýæ]\󃧹¡öˆû©GŒ„6ÃCüýs¿å�_þ�Míx®÷¬ñ”�˜�’‚[PgN3€’ÿ?<åiaÜÉüƒˆP‘¢Œ¬ŠœÏˆ‡Ø Äó5Ù �kö� †FGó í¥˜ÏÓnu2#ÕMѳÐJ3=âVˆRC¹8]ÙìÏÕ"•&e{ÔÄ xÊ–>)»T^˜Bª­^`Ñ9ÖT®$L—ºDÇô1¤šTÈJ)âñ8óçÏÇ÷}z{{ñ<—šš:–¯XÁî];éííŲ¬ÉîU•³žæY?Ö{aRUUÅÒ¥KÙ½{7†ñˆñ¢S;µ½”ß÷™3gmmm¬[÷ÅR”?:æ˜cØ´iSt圛)A…$Ä2^`„K†øÊ äÛô“ôåj.V1\L3TŠa#i‰¨ILprë.ÖõÏaãÀG]åç RÖÓ�ßH�†ŒxuÑ •B©È]QAˆR ø¨  P<Üç¾&÷*ºûBr™JQ1w8¦­›¹ º¨�ÐepËp¡Š�ý­¬œÁ@¾š\1ES2Ãé³6³´©›êXCèò"]�†PøÊ`¼˜DÊHã˜>–¢´$,—rL?– èèèàÅ/~1Åb‘k®¹†žžª«ÓœxÂñLŒ�±uëVR©Ô¤§êû>A™z϶m„xž7ɰcÛ‘k庱G©T¢­­�“O>™ÑÑQvîÜI"‘˜/ ÃÉP¸mWê)®ë’Éæ¢mO:‰-[Æ+e‘V®\�Rš{ï»4Ô¤$JÃXN`˜1Ü0ÍHÖb÷D q:RcìÍÖÓ3Ñ@ïD A®YSÃÄí jûYÙÜÉP1Í`!M,ž£w¢%ò*DˆW¬šº$T¥¦¹rA�ªüè}õ’±¼¦6%Ø;¨ùý]>?ÿ‡w|Çãšk}Dµ˜¬œT9š+Í2 Œl<]a¿ÔSû¨„=•O„®.{§ªìÕJ+ú?·]ò?ŸŠñН»\ƒ�0E´�䱬j TêÄ"­�0$¦”=Z·Áé9c!*°y ÷(Nž±�öªq ž]NG<•¨ƒE ËõÒÑ|–‹Ð�ÈÒ˜Èpóžeäý§tlgNÍ ƒùj$š‘B;†g0’w¨ÚØÅ꣛9唓Yµj%ùË_¤¥m&þ–›ú Ìîhæ�l5÷ô×ó¹Å-d ‚ëî/ñÀÍÀ¸`8 nµ((Íß 9f¶à½/ŒñχBö�h>÷Z›ÏüÖã·„”Bøæ[mz‡4¿¿-àOŸŽ³»Oó�«<¤%8ì.Œ• èà·�󘄧•+#¦´¶À÷,|GšEæÄrÔÇ $l7j‰ÄC†EÆ' †G%¡RòA‚± �ÐhÆI¶³¬ÃgqK–öš" I�¸¥hltxñKNŒ<÷TÞ§TpY0§ƒ£ŽšyòJá£òÐsÎ<†IL×§ä>A´´Ö`t÷¯®'žLâÜg�—|$òœQʺûB"ËÄö}·�ÃÍgqsYJ¹Åì8^±BÜ"�ëúQ­o±›™È§˜)B6‡Ì^�¡!™Ã2} â6{&šì‹<·\)†cDa¿úD†…uý,¬dv͆T圗ÁÁ4ñ¾ŽNu¬0¹Ð)•~À¡ŸÓ4™;w.ccc8ŽÃ¼yóØ·¯ ¥4a’N§9î¸ãÃ�½{÷MMMtttP(Ø»w/¾ï3kÖ,ššš¦»»Ã0˜7o¥R Û¶1 ƒB¡09žçyìÛ·×u©ªªbåÊ•(¥Ø½{7ÅüÂpX¸è(â¤S)²y—}ãõ �ؤŸb)À4aåÒùÄ þþ@‰œŸàè¹5üðζ÷Vsþ±c1Ƀ›ÊGZ fÔîgñœõÄÌ›çÐ;ÖÎÐD3·ï]EÉ�:U@_Á}ˆUQDLHwmÑ,Ÿ«yóy7<pÏÃ!¾]O…’&Ù(,p3åÝ„0£C�/jƆ@X`¦ÁÏA,MÄÉm@P€šFA&¯Q9hm NhÂb4NªZPŸ†}C]œÂ´²Z[ã¿pˆC*–áÀY'4¤AH�ëÁ­d&¢§Ò”1eocš÷^Á*H9Í�€2£”@š>®›æûk/áeGßÁª¦.B-)…VÙ@yz”s…x£–F ePÏñÒ£ïc¤˜&PIÛ£5=ŠÖ‚‘BšÖô+['�ºÈ5×tÒÒÒÌ…^ÈYg�ŵ×^‡ëzÔŨ‹�xL” z µäKðé_¹|ÿWÔ'Ûz5ý{CÞ÷› VKîߦÈ¡*.˜±XÒ3¬ùÌo|T—fÎ) gŒLœ¾\ò·FsÃK>Pžˆ‚™")™>Œ0|&òµÜÓU…%Cl«H}"C[Õµñ :ªF˜U5Jm¢Ý Jâ„%Òá^”Ú˺޹ücÝBºssvŒ¥í–·NÐZ«™Yç²°±ÀŒ—–ê�DJƒ*‚[Àa(ÊÖ'rÑ_ÉS’kÿNOwß0Õ�³° MQi¤ñ¼R~FHå"œ Ç"Êûj­üB7—'ŸÉ2>9Ωí;YÚØ�múQšN |màQý/p茦˜ ªÓ�»‡ºÌ*^rUUííí¬[·ŽÙ³g3kÖ¬ˆ¶|÷/Z´ˆ… RWWÇu×]Çþýû¹è¢‹°m›¡¡!z{{™={6ç�wžçaÛ6ÿûßéêêâ‚ .@A6›å�@ÁÒ¥KBPSSÃõ×_ÏŽ;8묳¨©©EH“í­|÷×ë8fõ2.ÑvôCsµI¾¤¹a÷ñô NpúÌÝ�¦­µ‘Ö£.fѬ;|�ïÜ(øÊÇ-v—v�üò#1¾v­âÁó47MP£&>N{Õ1#äo{V1<Ú!XqÊ'&ê6TÑˇuý”ó¹Å‚æ{?ñhY(yÉI&ßú³Ç?® Xu¦�ÖðÚsL>ü ‹í½šù¾‹_„+.2yå)EÍg~ë³a¯æÛo·ÍhZk?¾9àug›Œà쥒[7+ví×|øR“ßÜò™ÿöX¾XòþKMªâ‚îQÍ'î„‘Rt}¨m|òJ‹•s$Y«øÆÕ>B´îŠrØ;)øþ»æ5 FršL^óÂφŒu+HEsÅÀ€Ð-d „¡�<åÐ&¯}JŠñ‰:þ»x/9ú~æ×õÑ–œ@�F4©SÀ §NI‹þGãZ"�æä¡øÊœÜgc2ƒ”àzŠŽ™³©®®ftt” °m› ‚€Y³f°bÅ,넉™ŠT¬|ß 0MHÅ!aƒH >p™Å–}Š› ùä�v`G§bFƒà}/¶¸w}È ¯éQüùž�7(îÛ®@Š#TÊO�TªÂÀ"Ħä&ÈäØÛ_ÎMÛEŽnÚËò¦}$—Z'KS"KÊvQΟ·‰sgoæáÁìmeßHŠŸîhÂË·€%h¬÷8ªÍcå¬"sšŠ,¬/ÐQëÒ˜ö¨‰X B‡(4S$desë@²Ç!"+ºhœŽcOÇ´¢µÂ•òXícŸmò¬PÊS¹”HL©#–;RÈÙœOww‘¾žz÷v36’GyY’rœÆd„��iZV…äA8þ´'ÅÐ@4È×[‡ÚéËW# Mkz”Úw2¯f�êXÛ ðB/4qÝ©ÓÝäú°ªÃ¹ž‚  ¹¹™ššÒé4†aÐØØHmm-A`Û¶mãž{îáU¯zÇ{,kÖ¬¡©©‰={öpß}÷áû>§Ÿ~:===\wÝu¼ð…/ä”SNapp�0 )•JÜpà “áê-[¶ðàƒòš×¼†¥K—bÛ6Gµ˜ 뤾ÚbÉÒ£išepò Gqí=yÞýÅQ>ü޼òTÇðyÑ¢u,iì%_ɦ}6gükÀKÏ)ñó�qí]ܲÖâ 瀭ÆpDÎÈÝ\q é¸A×x#»GÛ¸§k9±Hþdè®ò+>ÑuO2%¨O L ©¤ÀHG?Ûh!øÛZÅç^gsãÚSÂwÞæðṜwŒÁ/?çø�yÁ*‹†|øÇ.Ù"¼òt“{w(nyXñ‘—Ú\{wÀMë©Åß Ù۩ذ'äøEï~¡Íà¨æêÛ, CyÍåç[üËeŸøy‰>ðØ MAŽßû«Ï7®öЦ ¼æe÷lUìÙ£¸ä\ƒÑ,ììQ¼ôT‹Æ*¸~mȺuŠÆ6ÁIK$;÷k.Zm°¡3ä÷)tÉZxù%5IøÕ­iþç�s‰×L°ªe/Ç´í`~ͦ¨(T©;º<èÊïí+Y6^§öh‰A9ZtÒI'!¥ddd„;3Lf‚»ÖÜÇ©'ŸÈ_>Œ;2H>[M¾”æÖ‡CzF5Ú îÝ®èÒhWó¹«=ÞùB‹w¿Èâú†²š¿ÞðÑ«o:ßä•g¼þ«.oøšÇ¿½Æâ o°ÈhvíóÉ(ýÄA{O•Tj±Ë¿‰(G’U`³¥w1[zÃɳ v�ºX–PK‚T<ËÌê!–4ö2³:Ž#6”f€Ò õ'íç^Ë¥-åÑR­˜ÓPdAK�Ú”EmÚ¡*iS�´I82¢³©•æ 0é®<Ö(„$t}öõ�Ò2¨èë¡¡ÁÁqü@ãúQW>U”UŒ¬g£<ó”²>°¤G…ß,+BBƒ`&ŠInܵгs5”<—z¢VÅbçÍy€Î]iÎ[¹Œ\òpgÀÎn_×ð—‹éœ]ŒaxÜÀÑ/ñä%TÑCëJér(Í�®÷¸åÁ�½Ä¢­N0«Q"%¿Ø •䊚¤Ñ›_}»Ï¯òh_jàðã›}þ¶6ä—Ùüü>nyý¹&õÕ¯Mpñqã04¡™Õ(Êå&PÜóPÀ=[L^rªÅî~�M{ËéÆCˆÑb´d–ä’SMÆŠ°fkÈWÞhóû;>þs�Ÿ¿?Æ·®õQZsÎ*ƒÆ*ÁÎ3¹ô³.põ‡c<¸3¤¥^Д¶¸ä?J<°Eñ“q8a¡�çËNP¼üK%†º«X3¼š5{çpæÜÕ´�êXž”å’°\lCMzÐRD(z­+êS#‡Œ$ ±m‹-[¶²o_7Žã0>1Ž[r±m‹‡7m¢·§—R1K¨·uKoÿ ^üy� ¤!¥ÞóC?Z',Á�þpõ½!ÙLäíFYøÊÏ<¾w£�eÆG4C^´-¤©E0‘Õ¸€u¤áë§O¦ÈÊo”Kî*ç2ôlÛ?ŸÊî4`y |œX�Žô0§Î¿)5¡–,¬íç¤;˨y� Ü¢dû.@œ˜M"– ¦*AM:FMʦ:i‘Ž$Iܘ¢Rq¯Ê¼Þ•ûºÈ�&mš&¹ =C!7ý½‰;{ –,0˜Ñ³Z53› ® ‰”æQ*é`üij!ýÌPÊÓÑ¿†�4ÍÉü–�/ÀºÝšµ[íôÉ�O�¨1ú¨³Ghˆg˜ŸpYÖ¡ˆÛ¦"ë]ËIËý / Š�Ca’a°ì¥•™§Ë+˜.•Ðu*•bÉ’%ôôôpÍ5×P]]Íë_ÿz–-[ÆÚµkBpê©§²páBæÍ›Ç-·ÜBCCäҞ7oBvíÚÅqÇG2™dñâŬ_¿ž\.G2™$‹Mæ”mÛæ¬³ÎbÙ²eÌ™3‡[n½•®=Û9ãä%˜†Ç|Æò×ÜcqÉ)š/¼Öá¬E'.‘Ig¦•9NÕ±"¦œt´ÁÝÿUGG{ ›»4?¹{.E‡•«N[2“üÊå—wž "@Zî$0î©[Òu~Á¶ ’ž"2k’3Ed¼¶ö)lKðà®�ïÿ]Q(ÁØ„¦:-FBà˜`›�v UӈƩM  4Ÿy­Cs�àãW9ÿ¸Ää:h™Û‚þ1Í»¾_â#/±ùù‡bܶ¹Àþ}úõä܉nŸ¦*ÁÒ’¬¿ùgÀî9s™Á‹O2° øí�>ƒ#š®¡�ö:“9­—œdð»{B,þ´&à‡ô¹ý{IÞz¡ÅŒ¦�Wœf±èmyÆrðð÷â¼î\“’o9WrßÎÞþýZnÛ³’X¼@Ìô¨²ŠÓ¾“³fmF MÑ·q,[|‡Pɧô~™îaM­µÓ€B~‚\ )q¥A&ã# kùÝ–Óèš�!þ„žBÄks•d{´þdú£×B”ñt&B�.Ÿ| 2û»¢×Oãå:)•ãÖL)ÛÊnç,Çaz�˜¶Ö¡mÜ‚CWàðÂë8¶m÷$5íx)~À\L3zè0$›Í011A'Qó Ó0±m“xÌ&•p¨­ŠÑX›¢6íP“²ˆaäéˆ"XiM¨¢&>ÙÌ;ë›1#³•[o³Ø3ш6kh¨5©JÌh38u…ÁŠù’9íQ©ÌÇ9|AˆªÄÒáéNÿß)åÊI‘aD”*p'ÆÉŽ PÌfÜ"C¹[;Mú†J šU–¶ÔÍé< ©"¦Ym�’(±÷xÚÆ” K†p*°0ä'j¯45(OüÉù˲غu+½½½„aH6›åÎ;ïIJ,J¥kÖ¬Á÷}Y³f 6l ¶¶˲p]—›nº‰®®.†††p]—ºº:î»ï>zè!Â0díÚµ `š&¹\޻׬Áó|›¸gÍ�lÙ¼…Ýý&oûÆsæÍgF­ÇÞQ…Tšû¹G÷°&nÁÿÜRŸöI£ìδ²o¼�ÏýÑ¢:ÒT³ˆtBó«¸lïl4=ÊîøûÚW3 C=ƒÔS*\O³£W‘-åš]ØÑ«™(h‚¶w+¼þtKÀ s=^~ºÉ‹N‚kï X¿K±g¿¢\"ð|ØÙ«Ëiò.ìêSŒä5Yv÷… å4?û§Ç¯°ùÀå6[»B†'4Å Únÿ˜æÄUŸ}™E1„/]í12•Ö 5­t´ðüæÖ�O~×…8P‚¿­ xù©o»ÐâÁ�!»z4?ýW‡Us$ßþ³ÏŒ&�cF�¼B{ök C0–ÓX$(ú0<®+B¦IK°n»âÚ{{†4¶öñ´¤T¨¢¤ãZ²o¼™�#mœ1ëaæÕ²¦k^Œ“gì¢&žÃ MT%üü$´¦L S. „aÄBbbD r!Ä —˜jI X7ÐHçðLÀ ƒÉzmUFËOçÖQºò-áD<†åITÂÁååETÒÿÂ2¡uäÙOÖ¢3•ê{"FÁ£Qèj(}/Á�Ö]À�=�ߺ›öô( Ë�ÀxÓæTF gVâ,s¸x^‰|A24¬ÙgšØ¶MܱI'Ò ‹š”Cu9ô�Š؆&fÚôô� ¥Ïêô¤G˜WWâÒä&\Ï`¸£P2É÷$Ø8n1¶Y°­É¡­5Fks ÓŒÚŦê›pâ �&Z©¨—ú3LAÿ¯’‡LÖÃJµ/”ßõ Û»“üàFÇ\¼R  u9_%H8Š˜­° ð•�FŠx h‘˜RáÝ ¬éYÄúÁÙ,mìâ²Ekâ‰+ægŠ„aH¥™¸Özòµ”’ ¢Ðr¹¦¸ò� ]†˜¦9¹�a“ÿ¥”“c i ´F¨S¸Ø– ïZÜѳ„ÛöO>‹V. ðEô?`êâöÄC„Ú‹GÀD„ ÒŠ@`&5ß~—Ã;.±yÅWJüîúÃáðKHž"1 ¨«Lä5^Lj«™l”«j¬Jšü8ƒŽf‰cÂð¸b< õu×Õä²`˜P[#È4®m;‘Õø>4Ô F3šÀ‡öæH�—<�J»±V06¡‘´7JüPÓ½_G¤ ÝŽ¢Œ¯ªlý~œš´àán…mÂG~ìqûº�»þ3Ʊ M®øJ‰_Ýpï�â´¦áúûCÞù"›/þÎãg·lÿ^‚-Ý!Ûº/9ÅâÕ_/qëÚ� ß‹Ó;¢ËkVÏ38ùCE¶®‹ª @¼Ø™æ¦i‰LÌXž%Í{hK��qtçj8¹m7ǵï"i»¸¡‰Xåc9²\ MÜtÙ1ÒÆ�û“pæ6ÌoÊ×ü~ÃL¶ …! 4�Œg¨‹gÉ”’,ªïå„ö]øÊàºmDZpÑ"Æs‚{¶†¼ãb“ëîWtîVHkJ1W°ITR V-œp”ÁÏn q z2W;ùýƒ~«C½ÿ¤DA2 æH†Æ½=ÑüNX)¹ò|“ÏÿƧ·G#¬©ÆQÕí4Ï‘)€Ô!ß+Á1«%ï¼Äâ“¿pÙß« M ÂÃ1B†ÏÙ ä¬Ù[)xædú®">ñÄ Ã�{ï½!¦irÊ)§0::ÊÆ�Ë\ aDÿ©@©¨¶PJiHË$æXT%lf´7±qãÃÜóàf–®<žlI¢”$e—¨rJQ§:©ËޏžÀó£¶-#B} °IUuÔϘE}Ç’uõ!Qaˆ C´.÷ñzô3‡<¤Bµ(%†eGÉ|ž‘}ÝŒôöàNìGر?É?ö,dfu†;ö`Z‘÷l•ÃÄ¡6(úPð§”ðtVkAÜô)¦ùËŽ3èmc$[à s7páü ÄL­%…ÀÂ’a9×5<€EŠÿ[lÆc‰a“¤À¤’…)¶¬Šbž.•÷´ÖÑoQ~ý/Gá +ê«+=l3d¢”ä¡¡<<ÔÎh®žÞL=�ç`Ä"E¯ô…°¨> PÚD+&CÐ�°§¡Qe„îí×¼ë.º5DX�^CûtJÀÐ€Ž¼ �?íµ(?—L¢•»»Ô”—dÀHùsd4Öpåµ€Áýzҋ쟳·{*DZ �N~®aÏn}nqÈ:劢(5ÿþ�Ù�ѹ—úÆ4n>z•ϱ B®0 ïü®ËëÏ1éÔ¼ç¿]îݳ [Ðܱ1¤è•ß*ñçÛòy¸èS.—�b³à“¿öÙºS!«¢ÎgZO-ö“©…²›&-�À�±aß¶Çs3c+/;êÆ‹IþºkƒnŠÓÚv²¢©OYx¡9Y»ÿX Zk�i„Œ“ülëytO43>VÍEçH>|¥…!<Sš—˜¼õÛ&™Lt��×ÒkDÏ»†;ØØw+Û6ñŠÅwòŽ75ñ�ÍõôŒÀ箈1”/йC£Måñ &kÎ[µ)رYqá±x±ÅukŠô碚õ°ìµJ9EÎ"d„’Gƒ4žšëÛ�–àŠóM¾ú‡»¶†\ú™î(,n¼ñ<“ïü9 ;§¡ŠJu:(ÏÑŒR€òˆŒ gj®*ˆêçuA3§ÝàÊs-¾û‡=Y�h,E¸�bÂÊc„ŠE¦­K¥2aМ9sPJqï½÷N®; , »»›ûî»o’õO…‘ÇjZBDtÀ*¨À'Ÿ/0:&è–/_ޤDC"$*•“ä}{ò:¬èaBÜ¢ (›êÞWœ§0>Êx7=[6�¨®%ÝÔD]ûlª[°�J)B?rp"]ó¿ëA?=J¹¬ˆ…HËBJ‰W(0ÑßCfx€‘¾^ò#}Pa _̓ƒKX;°ˆ*§ÄñUû'‘"`Öä qhË@EÆ�s{×bÖîYÑ¢+ÅÌU³q°ƒáBË÷ÑQ3ŒÐåVtZ „ZbЍ)A  ¤ ŸÖ´PÌðDÊH¦óQ?Úsˆ¼j?ˆ(&MÓ,“§ˆi` IDå©pŒ(˜÷6 ÏbëH ûFkÙ72T*:Ÿ"DÈ�PMåò*‹ÌÔ˜L.Î0‚žöÖ´ Âg~åC‰é=þ÷EDFÅæÀ×ÂtØSH`]6H`JQ¼í¡žWض*R§2†tÌ>Ú¼ý"üì�Á�?€!À�ÞòÏ;ƒ¨ÌÉ„uëëö¢Ò' ø‚O–¤âpÃý×ßBLL†p×®Y»!({‰Ñ˜J—‰OœFt åÿJ  ajJ¥ww-% -ªã9²^Œ˜ ¹¥s)kûçrBÛ.æÔDÝ mà‡Fyí8T a4vÜ @(Æ ÕHé3·Éba‡àÕ_…™�U|õ�&W¯)rýÍñFAc º‡4Ú�rÁý#�Ü!NgÜkæå…+[{Y’ØÅû~p2÷lÀ H¦#PÒþ1…ÊA¬ ~ü›ý£šwìvùÍ�Û{ÃãzÒ@in‰jÑU¡|M8 ]p�Áø0`|PG.Z�“„sV˜Lä‹Ú%§epËmJÃDêÒpò‰’ÎQM_otá¶¶V/léÖìÝõb_´P0£ApÏÊBÌ*˜Ý$×Ô6FU …$S6§ž Û$CûËÝÑl8su-1�]Ýc“Q·Y³fEF»RÁ�ì A†!3fÌ ‹Ñ××GUUÉd’‘‘´Ö´··S*Éd²Ft§iU¶l„$Ôš0,GY˜°�v³èéÐM¬œæ¸2£dGÞ·‹þ]Û©nj¡¦yUMÍ$k°ª¨îdDöé_¤žb¥¬�rhÚ4|Ÿ‘î½ wî"3Õ {¥"qÓ£¨’ü³óLÜ·”L(xùÒ;8¶e7¶à�äG~¬=šR1œ¯âžî…ìm¡­i7óêú™Q=Œ~³ùTF³ h›û7]¤P˜¦ D=c•60DHšÛ±�Ó;¶â*ë )ÍGÎñ‘ÊW �!T¹›Î“û¡§÷¤©<ó<�ººZfÏžƒV!=Ý]d3˜Ve. ÛPJ�q<<ØÁ¦Á9¸¾Ck²�ަÿúúÅlï•|êçE”…tÂéíéÄ”7Y3^6œ$ä ñ™ þ_"UÞ÷ô×úÀ{�éåyG´íô|Û!ŽõÀÏ3^#ʬ`ÓQéåùI32û*¥'Ò.+ÿXD'«töi>ôs�­=H;Jh�—*ŒrÒžòŒuÞâà÷EÔI+t¸w÷1Ñšê9¡} êúØ7ÑÈuÛŽÇ‚Yµ½œ8c'U#@„9ø¾hB%©rŠ\vÔöŽ7“­!5c9Í?Ö¬žâzc9X¹Úà˯·ñ�ã>ñ �{×+>ýNÁ+O޳üZ›áæûa0yÿÙ»†mÒ1ÅWÞ‚ˆÒömßuYÔ!xÑI…’f÷ bs—æÍç[ܲQQ×ß}—CkMT7ûÑŸ{üý¾�o¼ÅfÙ,IMJ�Ž >ýk—«o ‘O""$(f.¬ž#yã·K|ì¥6—žjpË-hHÅ_¹ÒÆ4 :!yùK$b‚ÿz—ÍîÞ�5Ûßìøô¯8ͤäiJ�àU_.! øýGcØ&¬ÝrÛFM̆/^é³!‹sÅWJtj~ñ¡zŠ¥³˜ÛâÑ>k·Ü~'çž{‹-b||œææf:;;ˆì…aÈÂ… ©¯¯§±±‘uëÖ188È\Àu×]G©Tâ%/y ·Þz+##›°m{Ú}ÝÓÌü#–鎋aZ¦�FSÊŒ“¢çœDŠDu-5m4Î^HUCBˆÉ7¦�§Iž¼R®xÅ2Ê(�e¬·‹±þ^&û(f2h¢„"n°®1ww.cçð jœ/_rgÍÜLÖ�Qôí#.-RZb+š;9¦mI»D]2©„ß ÊCô(ÚÛ[9ë¬s©J'†ÉM·:léÞL C _9ì«Áu«/U±c¨•D<Çê–íd¼$¹¤�å‹Lþò@€Ht…`B”�/"²ØuÅ.7;PÞÔk!CÑŠÿ›�õ3Vdˆ$"xPa¹äãÜ�N›yè׺âíZÐ߯ùÆÏýˆ‹Åš,Á�ϧçù+HÛJÚÃ(ót«2¯÷�-¤Òr£}+“{÷¬$Q5Ê‚šA»ÈΡÙìœÅ–Á¹Ì¯ígAã>ÕíÇ6|”–xͪۤ6Và䎭Üö‡Ýè±v‹Ë²wÆ€- Î\ã²m]\skž;î`ñ Ák�“¼ë‹/ü.¤gXÓ3¨¸ã^ÅiÇ\pŒ‰c»|êÕ+fI>ðm—w¾Ìæ ¯·Ø¸'dÕlÉ1 >y•Ë»^hóÞÚ\óÏbÎ~‚"4´¤.-&óÁ'/6�ÕQ)�)¿¾%dí¶�›¾ç•g™lëU¬˜kð›úüö¶�…³ï¿Ôæ«ð¸é�€ë?ç_.µøÖŸ}–Ï1¸}SÀÿÞ§u¶ ®¾5àÁ�!ÿür‚WžaÒ5¬¹ðÁ~ uŠwÝÝ]}ôÖ¯_ÇÖ­Û¹üòË‘F3 ƒ±±1n¾ùfN;í4V¬XÁu×]G±Xdîܹd2öïßÿ´—/M/�†�e˜h4^1O1;ÁØþvo§¶¥�º¶™T5·â$£)Z…e¬Îä¯ò”É“PÊQœM”»é0`dßnº7¯gbh?~©å +æ`É)|îíYÀoÖŸK©X•‚Žy‚_Àá“¿ñ¹íîé¨ÀCC„ú-ç[¿ón!5ïú¶�¦å0á/§––ŽG¡P͆\=˜nÔŠÑofp´•5]˘ÓÐÅ›VýƒšX/Œú"ÃÔä•–\¼à!bŒ‘¶Ï$SpøäïB>ðBÉÒ™+.8q©Á•çÚÜòÀ C£IVÌÌó¾sÕ ¾ô;ŸÞ�!o{±Bi‰¡}\/d÷P‚S–†¼þ¼×ÞU`Wwžç–h’{)ºËyh—æ¾5%Î8ÞfxÜ&fJŽ]hó§û}~ûK' ßywœöIÁƒÛVüçùÌn‘\x¬‰ŒA˜?LƒõÑDÂÇš¤‚/¿Á¡µVP�Ìœ)qC(ùšëîéÞ²}_È‚6ÁG�0‹üÇkŽYòÛ»Lþ¸&äá‡v‡,h‹¶øæ_|î¼Uñ²+#¤ù ìÙ©éP4Ö ÒIÈ4ËæšŒå<¾÷W3X„c vîÚÃÎ];Éd2!ðN… °}ûvfÍšÅìÙ³Éårlذ�c�=–|>Ïž={*{ÉÿK‹‡žj" ˰Ðh ã#äF†èÛ¾ +ž qöÚ-§ª± œŸRÏùÈ•ò$‚:jIã峌tw2°g™áA·ePW¥»¯ áþ¾yܱo1û3�(?Ɖóäø¶]OY�ªŒ£{*‡IÙj6¦õÓõCƒ\¹)ĽóéobÌO�)¦ÁwÊ+PXžþ£¤£Î+;‡fóÝb«;YÕÒ‰cy(äŠ1PYؤв\„¯ùÀf(_Íp¾Šáb;ÆZéžhÂ/&§y=ÂG:QW¨#ô’…Ð|‡­CóÙ0ØAo¶-}ÚÌ­e}ÿFÿÞʽ[ñ¡×Îç» ¸ù.ÅÊ£ ~ù‡þÐåoëCþñ ƒ÷ÿÈc{_È_>™ {´�?® è hHiŽ;ÊàüÕ¡†KO4˜Û$øÔË%¯ù¢ËHAóë�84¤›ö†¬Ý¥øà‹,¶ Š¼î “7}ÃeÿáuÊy^¢KCû6—�cà¹õüõŸ’dc†U�YÓµí§�ŠÉ2a€™ô¾BÅ$ Ê�0B&Qï•fºÒ˜H‰ç]0tô~ès@´§R*TÓJ•ç™Ü±A±mkH ‰æT¾Œ•G¤ÕMýöêàý „©ÀŒŒÝP—©he€04hƒ½Ã3¹qÏJN�±�¤]¤Êv©ô WåmB 'ÍØÎòùM OgOO–Ÿßlsãç«Yv”Í™Ë$qGrÇfÍ/0h®*‘"f-æã/·¹o¹Ï1ó;÷;ìÊÏÀ6ƒ¥jN]\G*.¹i½àÒSbXF‘9ÕÃèÀãU§…\sî8Y·…†jűÍ[¨åâÕ3¹ñoxA‚Í» ô TÅ4F•"�jÖŸL™¶z0Žà‚•&ß¿Áç ?qY½ÒàúOǸü“®��TLð­·Zì1Y>×ä.qâÑQ�×–.Ūù’/]£Y¿WñÕ7ÚÜ»5äØE&ïû�KÂÛ†tR LÖìõ-ýcšÙÍ’OýÒà àugZd š­Ýš®1‹û·ÍåÌ .9ÿ4ŽZ8—öÖfºöõ0 $„Öš pùå—³xñb˜˜˜`ïÞ½üñ466r÷Ýw3½‹ÝÿºLSÐQˆ;š·WÈÓ»uÃ�»©i�AóÜEÔ´¶c9ñr“#õ”x÷G¤”+ž¯a¸Å<½Û6Ò³ù!J¹L¤÷ òËy7M¨!e—Ø3ÞÈï>¯”UÕýœ>s;…À!P²ÌütD£âŠëVó¾M¾§'SÇ�û3˜¯#ç%Ð~,J– R!Œ ¬DûdU<å049kæfNœ±U& ™<~ʵ‘†šœs $7AçX[FÚÙ6ÔÁD±´JRéƒ*Œ)tŒÐ¥Mjœ13 Èà ã*-H˜íŸÍ¯¼¨ ÀR,›±™æäôÏ¡¢v Fs._½Òæ¦ÏÆù—–¸}S@MÒ •4 N™µƒå5£4ԜŗÿP⛿õ‰W >ö2ÅŸï øÃ?ÚfJ–Ï•,œa°lŽÁ)K$5iÁÑ’£ÞRd|Pqá&o|�ÅoðÈà“¯q8÷¸€_þÁ?²N9ÿŸŠ‘â:eµä'i¯Mg¯ËXP�¨J°jQ!aÿ¨äÜ’@ n^0´:s ã N_"¹ymHg§ NZ-9f�äÚ{C†ÇáØ‚®!ÍÙ+ º‡5·Ü20 ùüï<ÖïÕ̘-¨­‚AÒ‚]}šŸ` %üíÁ�ý}š÷¼Øâ«WÚ|÷/>_Êiþûo>ŽSîjœ{Šda{´Ï¾.MªŽY$éÖœ³Â`}§bí§ÉdEDy¸{÷1ܽwU‰ V·ìf~Í uñ, ÉLÔGY´©HˆL·�ÏŸýWº‡FÏá'3Ò5BÝÉÇòÕ7Bfbœbѧo?ûç\zò)Ìh”üi�¢gÄdÜÓlêÝ�«þîsÁÊ8Ÿ¹"Iç fx¢Š÷·ð—Ûöð¦—,å˜e1¶÷h¶õ@ÉüèÛyÛ+ãüø#�lïÖ|â§=ŒgÓìLÓ’E$GÙ34‹ýꀔÀ uiÁÍúü÷�û{57!ÿù'� Ôì‚/\í2ž‡ËN2x×÷KüöÆ€ O7¸âl‹�qÍ¿ÿÚ硇¯øb‰Ï¾ÖâÜÕ’·}·Ä57†4¶ ®ú‡Ç¶n…² o0ätéѼò4“·}×å·EkÙ+D‰w^drìBÁÏn î1xÅW‹|ýMí¬ïlæº-.ÍëÆ” ?ŒÖÑ]»vQ*•èèè ¿¿Ÿ»îº‹0 &ŸÏ“Ïçéìì< ªäÿRÎAk…·vm¥÷VªZ˜½âçÌômTD ´'¡œ«N9Š�K¤iPÌŒ3¸wý;·RAi…”Æ#¬­Á4ƒ¹*®Ý~Ûû碴À±‹\rÔ½œ:s+^hN¢çSªr3û¨>YiIÑ·éšhb¼”bÂM0RL’ ,ögñ½8nhxåNAR!P“ûáz ¢üÝT,ÇË—ßÊêæNÜ0šTØÀd¥<á&˜pãdJIúru¬œI®XMÑw;RÄeäwŰ¨ä’§ï«¹®‡Î_‡i„ìÏ40§v?³ª‡ñ•‘<ŠD�„ßæ7›NcÛÀü(š€.È�D:*³-¸÷kq†ÇŸø¥ÇMŸK𡟔X³9Ï}ßnà†¿ßÁþaŸw¾îlÎüH‘»ï IµJøVœ?ÞíóÉ«¡§¢e¬ ‡èõý˜×Ц�7�2¬ÈñU¹$+€xŠE¢H‰©dI)æ™ ‘86²å÷ŒˆÒØ€ Œ(�—L@>ÏT˜PA,yÒÙBŒÔ:B›û¾F'ÎÝÄKÝ…¥dDSªxÇᬳÎbþüùÜ|óÍlÛ¶ ˲þW”²YÆâTë06Š_)´ÒHÓ¤¦¹•¶…K©Ÿ9ˉúÞäw+ò”Õ)k­1Ì(þ8º¯“]÷ßÁÄPÒ0‘†�”ÑgŸ@�À!ûsµìnC)“dj„×.¿…ãZöâ)“¸é*‰¯ B%+%È”’”B›ÁBš}™zz'éku0"[3I¶.ÃÉ}´:LB£›Yuû9®u9?�$4JËrÉ�Ç­ûŽæŽ=+wÓø^,ºZ'QQNXâõÁÞ 4ÅRŠ?m9…‘\ŽSäÇ_OÜò0�§ŒC"¶!òè}ePå”xõ²;øôXA)M¥¯ªJ Þ~±É«O3Ù; YØ*ùÓš€=û5ûÇ4_xƒC×þÉXÀCû±aŸÁ{ AÌ“å0éÄ,°â‚­j–Ϥ¸ä÷w†|ø¥6·})Æ kC~}GÀC»MÕÆPV³»Gƒñ|JùpDpýÝ!Ý/W\¿6ä÷ÿðá÷Ø4×Àk¾ìòÏ{ J–tD‹æIG·P¢ÔWI>ñ›5qøÇ—Ìï�Ô§s›%ëv…Ü·^±d~DùyÍÝ>ßû¥Ç ߊóÆó,~ÿ`H,ýÞh¯—|ð'W_ï3wž¤w\2»)âמ×jðÓ\q¶Á~ëqïÝ!õo´ ;_ò–ó,^öe—?Ýä³ñç Þs©Åë¾íR“\»&ä‡7ùô\•ä¬e’ÛîˆÊõóœ 2B�ù¾�� XJ2–ibÇä²€á’r<Óe$ŸmQϲ¬y;ǶvÒ�Ìà%ÚÓ£¼xÖõ}­6°DˆahÆ‹16ÅgswÏR†öW—£PPЀLàº�˨Éò½‘¼ŽŠ†…A6£ÉŽ…`€”&Zi² ´DŬ¦¨õ�%Q•<ùá« R�^…É«,�;ís¢áйè^–åU>—�vUa,F/”Êi�òÆ~©<�2æ@„ÑË|¦ü½òT…¥<”Ê`-"äæ)+.ͽ{3«º—3fl§¨m¼@ …$Bd9RRáð¿ýöÛÙºuëÿžB‚ÐÀW ËCŠÈ|\™Vò+L‰V!#=�ŒôtÒ<ï(æ¬:‘tC3*žPHûq”²Ær2Cýtm¸�¡ÎÝ„A€iÇ*.ߣ& ¥Ð”›cÚö�°]þgÓé\°è>Ú’îéYH_¡-4™bšL)Å„›d WCè;¨2g5NB£|aû‡\Ý'ñ”ŠçjX.Kš; ”1Y+ª”$a¹Jòç�Çñ÷Ç£Cë<6«¨ÐÛK&_Êâ¨ÿ×Þ›ÇÛU•÷ÿïµöÞg¼ó˜››yNH!adPA±ˆ¨ ¨µýj[ëômm­úkmÕj¥ŠÔªõëP§Rµ*hA�@!ó<ÜÜy:ãžÖúý±ö>÷Ü››�„óy½÷œ³ça}Öó<ŸçyÚ7²¬uî]H $ËÛ÷âX!^hUbíqýg! +À‘î;ƒÀË „"Öj#ùfõ&Em�"aÁOÿ­Ì/T”Gá�¿äqý+]ZÃgøö=ËØ¼Ë§=±“ø�fã¾$$$å’æoà±ó€¢<×|¶ÄågÙì:¨yïW]žØªØ¸)äÕŸ,ñš³mÊ>ôhÞüÙ2o½Ì¦­]²§Wó<…{ÙòÀ± &EeÐÊiîF3¥Cp÷gRüòÑ€¯ÿ&`Õ‚ØCù’fÿ�-BhÉ>û=—õûŸ{‚‹–)nþ¥‡ëjFK¦RœBªx�)UéX0”S¬~:$Q/¹ã3iÝðÃßù¼öl!Mmã¤#¨Éšg=ŒÖó z�ß+ã}”<Øß¯(å¡wäØÞØÊÒqó‚¨,æè4ùRš¼ ÍÛ8Zhâ¡Ýçñè¾U4Ö Ñš%㔩όҘ*`¡˜U?À¬†B-©Mº,ly”|˜æÑâ*¤Fƒ´Ö !5Âc»8 CEÅÓ¨¨�Ðh­°lm§úÄât†ø·£LÀ‡ Å„;– ÍG…hÂ2¦šž’‚8B #‚f’mÅy¹ÚeVLÔ†hM¥’™®ŒƒqëøÎ ~þôEìèŸÊ›–þ]�Àƒ†¬é%n[P›d³l*S%+ç[ؤp°W‘/Á?ÿI’§w˜ a[<³WñÛ'C>õÖ¯;Ëbj“à“ß÷HHÈ&#KÜ‚ºŒ «ï ‹'Êcä&¤éã6}Cíô vŒ±–P �u}\8k3z˜^;„p`v]/«(ß1^8¡MxAI´6®t)âŽFa{4&K¤,�9-{é+Ö2Xl¤9;DÑË2X¨'ŸkseŽ+v¡1ùƒæoi…ãÄ­‡½úðŸ+[�Ú._*Y0SR(Ã#ëC†‡5Ò+#Ed]Suˆ‘À﬒?»ÊáÖ~uwˆ“‰ëÒ�Ùd2b`,—ÝŠ>+-ðý �ï9ƒPÛ,iÝG&QdN}u©ZIÊ¡�ÒÛ²^P¯šÖ‚¬ã’iè¥k´ù9Õ‹ˆ-{i;øn‰k¤8:Èܳ/$SßDèyϲ…1LSöÊ.¶í°{Ý£ìzâaÂ00®cT)h ޲w¤…'zf“°2–GÒö™’!íxÔ%KXVÀ“Ýsx`×rºFÚ0ÒØµÏ»T lÛã/Îù%‹[ Ñôäëyªw&÷ï]Â@ßLd²tÂ$4Z[$E®\´š®‘6Ù·”e\é¡C[ýAVtnåò¹O‘°žî�Φ¾ä˵,Ôsp´ÅÌÆ#ç´"e-R“I�’pŠý$åbB9¤3Ã|äÜ_°g¸•ÿÝq:ÓjFèɵÐ3ÜŠ°Bdd�)m^¸Ø8DU�ª¾‡èec�–4‡/6q “CFáÜ9’k.²yðé�ÞAÍù‹%?¹/ÄÍk.X)¹ðt›ý~¨yd£&ÔšKϰøñƒ!Ù$\sžÅ­�‡œ6UréJ‹¾!Í�îò™1EðÛÏ¥ùÁï}ºz`ï€â§¿I¥oºÀâágB,KpÞbɯ6ƒ÷Ê¥’WŸeÓÕmÂ#«·*¶nU\zždÅ"›ŸÿÞgv»¤6 ·ÝÒÔo~¥Cs½àþ§Z«¨i\s¡ÅëCvÔ¼ù•;º5O>£^0eþø¦2cPÊ2Þ¸d‘Ëç¯aEÛ’vÀºÞ™<´{ýù&Ð+Y �(’/ÕAhô#í-{y󒇨K¸d%Ú³#ün×2%¹xörnšÞB›:£ zCn ~h1µfˆ¬í²m¨ƒ²oS ’ì>¸ÀLdXI‘<žË#»þÈæsœ wØÄÆßu“Ëã�EÞ†xbä‰èïªúÞ©&X÷µ »{5ŸøšËÚ�U¥ÜF» À¤Çy‘i�fntÔI£ÀZ£”mô‰2ó2£±›yÍLNºPòã2l^HØ2Äѹ¯Ÿ QÌ9p]²M-,8ïbZfÌŲ4Z ¦'�Sž„”à{Ý[ŸaóCwƒVHÛ9fBŽ¡1=‰SŽ‘fš�ÞB`ºêìiᙃs¸sÇ™(/‹°�œ|¢aR’t\Þ}Öí4¥sììŸÆS½ÓÉ& ´eòüvëÙøAýò±?hì›×-y€WLÛÂW_Ãàp;–í•CG8.W-ZMÑMóð�…s͵µ�á¤/k<ø(e� H× Ðê”é-ÕQ.ÕW‚†Ú~®^ð{†[ès3tÖ ±´� û– lÿ½§Pø˜AÍ1ž< Q,_W»"…0«ˆ–OGVdYCR˜íQS ÎZ)¸ûŸÓ\ÿ¯.·ÿ̇†¨¹ªZGGûK ³žËØ€+€„0å@ããHFƒ°‘ެ³RäIs2Yde]È)iSúóôT•÷E[ =Ò©Í`¿!ë 2~,9¶- |4‡zI✱'&ÔñÀ9¶ÏØ[¢« fËñëÆ^˜“Ñji÷1NkÛ�%4^•ã�|[*d$È„1=H¼�x‚»Ù-¡€Œ´*å Á¨—äɃsøý®e”J ãÚ‘«»’ö‰f⥔tºÞáËïM²fKÈ7~åñÝŸ¼þ56?ýd’s>jÊo>ð…$¯ÿT™ém’û‹$eWó×ßu™Õ,ùÄõIVoy÷—Ê\´Ì"aÃuÚ¤R‚ó>Râʳm¾ûÑ$Oí ¹ëñ�ÛÖüð¯RÜÿtÀ´VI6 ×ý“Kn#úŒ´2¾i ¡M"3ÊÒ¶�,jÞÏ’Ö4gr(-ñ;RFG¤J”­“kDÂÆ�®±­°Ò²·º_´?´ðÂx&8þŠ=_£��’Ð÷Hd²¬zíIÖ713kÓšvKÊcwZƒ´,rƒÃìYÿ¸1ÁŸ#!ÇqW�Éïµ-Åh9Ãúž™Üµó z:Vˆp\s_T"Ðøåd¢L_¡ž¬%ûF[)4��ëøâ™áœÖÝX¶OO¡ž¢›!p3ôõOã7ÛWò§+îæ/VÝÁºžÙ¬íZ@߈!gHÛxâÙcr²1wœRFP‚©¯dÕÔí,oß…$øýželê™�VN$HQäJuFh¦fr´g‡xèÀB MË?EÈ/2ÔªÎñVj,þW� £ôÑj]µ¬€ryT�µÏ¬òFV‡ŽfÕËOÿ“ AõöOʰFlI…`›D…|-D°·o–ñPYú¦ó“r†÷¥ÃŒºþC¬²@)sü�Õô0¶Ü8K´‘E;VÀÔš2-sžæ´–ýlœJ, Õ � ¹iöå)”êÑ¡ cU5c|ë}d¨yÇ«¾òç)¶ô”(xPö‰úBkŠ®¹'¡Û|ê[.ß½#äôyмÁákwlÞ¤˜5U²l¦©ï½pªdV‡àš ,(Þø�.Ã7¼ÅaÙlÉ/†šŒæ5+lN›)Yý„²Ǟ­1Q›FÚ^9Ë{–óÄ�ÌjêffÝ Óë»™ÓÐK]ªHÒ2M!â®P~à˜&B2$iûHRrSt8˜o`¤TG).¥!ã”Yѱ�9M½cMrt,Ú{îý­Œ§Ù/Ù¶æ!°’4œu­³g·Ô�ˆ1Ræw¯{”âЉt}œEZãY¡%4– q¬7°¹o÷b~·óL†‹õ&~¹IOWiTõKiÁ®ž¹ìêZRƒ6vûìР%®¼yîãÌmꥷXËÖ_ÌžžÙìʵ0ê%™Ù0ÀÂæƒ¤lŸ[×½ḓ<,ÂMÀLv¢—8]3ÈåóÖ2¿¹›¬S¦%�G;¦à†WLŠ�(´+Þȇ¶� VÔ³’ëÍÄOáåy”ݧþ€Q-$qqôn˜·Bc9.ù‘)Ü¿o1¼ì÷Ž×ËVBULjx¥ŨÀôúf7öEeFÇŽ1Pf™¡r-OœÃïw®@‡ Æ*ä}Á—¾ëó¥ŸìøA†?½ÌáÈ&–ǤæÜ F šïÿ>$61i¥�ÿ´¥·}"Å{þÍåÛ÷¬˜kòäkù2 ip¡¥Î„ß|_sçZÅí�‡l;¨Á>R�va&C´J°»w6»»ç‚í‘M©Ï± ñ ÁÎávFŠu¦5lTG²\„ ü %/‰ò“‘W’1�¬>°ˆ³:7ÑšÎ1Pªe¤œanS7+§î m{Æj> 5¶í=H©T¤´xNåûÉ„ÆÓ¯5Ò²(�æê:€´íвpò¨Åáöm–´£¼áR�`¨œeóÀTÖ÷ÎfÿàB?e�28yȸ‚*—° VpTJÈ#A#@* Lç»ë.gé”m\2} 7œñ;v�´ðо…Ü»û4ÎëÜI[v„z§D*•Ç ’¥ê˜DH&Y&mêÒ9ÎêÜFÚv™ÕØÃôº~l(›¢ŸÄ’Šûö-fûÁùH;D�S­š‰� ‘Î!‚ZK„ía[žŸ :[Ž‹ÍËq 'N.—ñÉ�ñ}¢Í{ ´$D±°s§·î!íîû4r³S/´qê]Äófµ �†T/3êúiHøÝŽ•¼Œ¯´)üñ©wÚœ97IÁ5n“Ÿ<°e¿¢kPó­¤88¬(”cW²‰EgS0Z•·lIðÊšWŸnEa �VðÝ;}þýÏ“Üñ…4k7‡ÜþdÀ£[+æY´Ö+6viúGõ8×õa¯u(–�° YÊ5JµtõwFÁòh\ª6’tmÕwºâ]œ·œåÁ+AQ8Q²±wOõÌá­§=@Kv„ <¶G ­MŸÛyÖô¨ÊOJIad·�GJIÚvQkÁr�8Ò6s“V€%CŠ~’‡÷Ïç‘}K(4à{i×´"¢«$ÍŸ¼ˆã' B(F ¬˜Æã]óxçÒ‡¸löӜѾ—¡R–¾B=¿Û¹Œ!/‰�(áú©J³t)4*pX6óiÞ¶äaö�6QŸ*ÒY;XIáòB;ª�FTìÄçÒ™è)ÔÓÕ7;3Ìâ¶Ý”¼ÃÅzBeÑQßG&Qà‰}KÑ^–Ù-ûø£…�pëÆóØÓ?éx(e¡üªûM¨LùÐÈmwH›Áç/}íNá¹câóztP¡v™ g®ç ‹#!O~>ñ“ö•6¿à+Y©epåü'É8.ÿõøë"€@…ð“‡ÀW ËÒüÓylØl¼Ÿoù|™ËVJîy<¤¡N°~Ÿf[wÈÀ×Ëô ip`G·æ=ßpyb›bÿÍUŸqyÅ2ÉO…üì‘€žAÍ3[ºÊ¼í‹}£šÕ›ôÿ•¹î2‹ém‚]}*NÃ>ê+^�¯-âÊ%ñ=«ª Qu)ÆÖåð®h!ÂhaËä² ß­¥+ïãXQ‹³ç“–&)²5Æù]B?@¢ð”Å][ÎdÇp;Méo˜ÿÙd‰PZÇQ4Ûç@®�5û²©wÝ…”—2B©"< âÆ/4K¹– HpçŽìnåâ™iËŽ�M”™R3Ä#æ#”i!¦•™¼ÄQäábƒn†%mp›‚Ÿ$nßKIà`T£÷n;‹¡b :¶Ò\3ÈÀH õ©"©º>úÊYóõtù&UA„ •³¬ë™No¾`y´ÖÓ’,R—%W¬ãÀH+#Åzœd?L¢ý¤qÇB”ªLQ%È8Z�ÃX¤éó99…çBS_ÛC¹Ü€ë¦á%mÇ­ÌhÙËë>¬ú~S¹J=¿„üìÇåOkÁïw/¡·XÇE Ö0äf)Öc£Ù»+Í?m΀Ÿ6gá“õ±uŠÇÖ©¨§ªùž½a¥ùHn~þóY8ðàš� ! ¢K ظIñ©Í±Kš¯ÿ8›ûDÐŽ‡ŒÏÕk9dÈÒö]4¦ó¸Áá#�èI�áPŒ³”­D!®²yôà<ò£mÔNÛHÂòk5J¡‘(¶MáGë_ÉÀà4cM‰aã‚éèÐZP.Õ’L¸¤E~¿å\Šõ\¿ô>j’.I;àŠ¹ë˜ÝÐ˯¶ŸISz”Í}s(•³$S9ööÍà�¿Žÿ{Î/hÊ䱤©ƒ§Q¹¸ÇÎæ–õ—–j‰o\¼š†d‰=#-H¡¹móYôŒN�Ø"C°†ÊiîÛ¿˜´°¨ÉŒšFóH.˜õ ËZ÷‘²=Ú¿€ÿzò |%©IæinÞÏâæ}ȵ°o¸ßO¢°ðC› °ÑA¤v”Qî%ú�ÓL„:*wZ9¦S8… -(y5„á!eÁ޼’WÎZϲ¶}ä¼JŸ,þ ó>µdFYܺŸöì0C¥Z´€”í1X¬cïH ëzg²¥wZI”xQ6ˆ� ñ}“s-mßÔ�â>òҮʈ*˜Å¬¡«¾�4h&àfGÅsOÖ�I,›mJ�’�X¢¢˜>` …]•~8TH¹P(ÐÜÔÀÁºrùn>|Öø¡¤.YıÓl|’ H4?}æ|Þ» ´�tÊ>EÄ“@†¸�Íö¾YXŽÏÓ] ¹©PÏ…36²¨åíÙ–´îgV}£^†Þ| ]�CCÍ ýʦP¨çûO_œ†>ÒN™´íá‡6IÛeZÝ!’{w-'t3HÛ£.�£$ðC‡ÞB+ÚwÒšÉs`ÈAÆ1s%ik8H)Là•²ÌmÝF•ÍÞá¾µö VtleÕÔíÔ'Ê\¹èæyõœ L¯ï-pC‡R� ä'( ‹µìÍ5ÒUhÀõ3 kèË7™2¥•4“ÂeJƒ†�¥½¦�@'È5bz ЍÁÇ)œÂ‰�Wª¥’Rt@"Q`ÛP;3ë{iHOOŽF …fvc/¡’ –k°„I B‹úTž™Q–¶íen# PôSôjñ•Mc¢Èö‘VvNcÿPJE“b¡ÐB�Wâ* ÿ}ü³®öŸ¤„ Ñq Í][Ïe0ßĹ361§¾w\gÀ�¦¤É•üðÈ úBk­‡††xÏ{ÞÃW¾ò¶mÛÁ£«ï'“M£B]É÷š­)Çcõþü×WDŠCuÒ<¬'?ÆDtZ[ Í ¹dæ3ÌjêfjÍûG›ùÒ£W�—‰ò�-CPq.e¬,Œ*Ùé‚Ð?…°å'™Ù¾›×Í[Ã×»’ flâ‚ùÍö3Y¿I%Æï8.h�ï'!R� ËG PAÐÈD¥lf6ícAC?�éMé<5ÉÙáJ{M)L·/'*t¢”E±–µÝ³ùýîÓÉ�0CÊ�l¢Œ#MÉÑym»™SßËÆþi<Ý=©!•,Q,g_´»ôb@Šñ 鉟Ÿ NtŽðñnOˆª\ì“xà–˜B<¯XðïZú Cåìóêâ<^Ll`S•xEœžeG‡D„J’�9/Åï÷,áÑ®…„¡CÞMãû©þD^ h@%pÒ£¼寙×Ü]é`x"6mE¹çÿ»í,6Lòµ�ÎäºKM'3Û:”/…6Àu]R©CÃ9þßîÂÍí¢.#ðÃÉÃ�#6ôNç®+Ù;Љ”êTŽëq`\.@:%:ë�BÑšdfCI0R®å`¾‰¼Ÿ¤)U cûtëØ—k èe£~Õ¦‡ZÔ¶EKH¸4Ö 04Ú AŠTÍ )Ûcx´«à㘰 Uò�ˆàA d¢Ls]}C�f¡ÒgùÔ­¼cÙÔ$\¼ÀÆ íJÑÇ É:el+¤'_O×h3ëz§óÐÞÓ˜Z;DC:‡%I©y¦o:¥R-Dét Úw0T®¡{°óËæøä:'94¦—ÅX ʸ#Ðaö/ *±L1îQÞ³E¨,j㹩x§ª©ûå e� —2Ê:´Ùq²ÅrÈœiYþòõ-4Ô×�°Í–'#dˆ,e R]ÄüžÚ°ƒÛýl�ÇI$M_H4E?…%C² ?´*µ]û‹µÜ·k)îY aÊX`Gyà±ÆXýÜü£…ˆ”ZY&�¬âª6>ˆ\ÖŽGʰeHÚöpCIÙO’°=²©R@àeH%óœÑ¾‡žB-ëºç›Ò�¡Ã̆..œ±‘'{gГo¢7ߌ“rŒÈê6õ¶…ù[Tß-MM:O)pðÝ4Ét�Îú>,Û%-ºsMôu—m¨dEÇÎïÜF_±†¾| §°s “ÀOOxnDe=óÉ4óH' ,nßŶ¡)ä ‘Es›\Ï)@y0cŽàÞϦ-õÿTfûN̓_OsÇŸý–6¦îtTDy°l‰dV;üê�˜M£�ú˜àž�!½ìøN†û6†¼ûïʦ¾uuÕÁ¸‘MÔÍIÇÖl¤¾Õ`”·–Ù¶��GoNћӼöÃQCßäØ!è :†$¦E ˆ¶9«.�¬¾1Å›?Wæ¶{”9—“�”cŒÅ,’þúüŸ3½n�RTà㥊87Ø’!Ç#Ô’§{fpÏîelï�Mz_ºçw´�B›ÒÄÉ"7¬¼ƒ9�ÝÚzÎl$¥¤T*ÑÑÑÁUW]EssóQ­WzÅ ÍqÖÓ—ÎÃsß}÷“Ë�â8‰JRûH)KÞKÑœÉa MZ´gG¸zñ£,kßÍÚîy¬Ù³,:ágwi›x™)'…—§ö‡ŠŠHN*aõ´–*§�—!ïšï†µˆLMQ †s­Ä¤f% Œ”k@±Xo¾W’|&ÃCû—°±gø)��Ia‹w¥‰ô(õ‰½£-`ù†ýÔ¸{4Zhˆ\Ù·\ÃÎbh‰•en}½–�Ô!4ùfî=�uç3½nË °„&鏸^f‚U<^�cDa7pØ5ÒJÙK#©5¡Êœà»p¬xîõ„-¨ÍæL•¼÷õûŠGkƒ ¹F CMª^ðšWXäJš{ŸP4¶¾úç ² èðxbKœæ  –Î�ììÖ<±ÉvÁ߇3–Kšš¿{JâMÂ%«$IGðÐEnX“m„‹–Zô�h߬,˜+.C&–†¡¼&_‚%‹�-f{Ê5VïÒŦ,ãoŸRô÷˜IæŒi‚ÓÎ46 † 'kÉÍC¡‰Ú¶zYVï[LÇâÕ/j:ÔsA\Ê! ; §XÇ={N£'׆ž™”‹ Æcõ2…ã�¡Ö¢Ò)¬­®�9�ÝQe¯ã—cã¶\.3kÖ.½ôš››M޲84­x"é§l6j^ªÓN[Jû”îýÝïØ²e Éd’lÂ#íx<Ñ5‡�Cí¬è؉-n`rö–¶™‚âÓêzùù¦W Ü¬IøžähÐs;¶Ñ–åáݧ£‚d”Rõy[_¾‡,†«ÝR:}³fü}è'ôÚÍgšß¬�ýÓ�ÂÙ¶‡V:ѤÀˆ÷\/ÁÂÎM\4k=Û¥­f”!7K9°)ùIVÀ#]sÙÛ3ŸØ‚—V€ö,l:ÀŸ­ºƒßî^Æ/7½¼”‰[KÅÐh+CÃS*çAÔ»öh®ˆRŽYW˜cœ¼gV¼¸8j¥ís‚ Œ ï98¿„€Ñ<²ÉçO/³ùÞï|†óàúP×,øïO&±4´5J~öhÈï7œ¿Ä&y•ÍûÿÍ£<sæ þöMxÅr‹›n ¸ùVŸ‚«yÛE6ó§ Θ-ùá½!ý—o|(Á™³%÷(ö j¼FÁÏ>•$õ?þÅ#!ùe��¼%ÁÅKM‹ÑøžÇH®XiSŸ…3g[ÜõTÈõÿäò§o°ù‹+ö÷*>ò&É;ÿ¥LÒüüÿKQvŽe&qÚÌKFÄòð®3˜ÕÐÃÙ�ÛMõ¼—ÐX¥µÀ¶Œg­k´‰û÷/bKÏúG›�FÄ ^ö ibq­-°]¦Ôw³jÚ6Îl߉ÒVä”<þñÂ÷}”RœsÎ9œþ¤RÉÃÖ¹ž “’2ÄĬiinæŠ+® ½½� ž!—Ë‘p$˧ì¥/_Ãh)Kmªˆ#� ï'±dÈ+gl¦%“ã¾½KÙÙ3“@Ù‡œ¦ÐZÌkèæÊ¹O²¸å�wÏakÏlJ^ú¸/Ê&–û³ê{¡"¿<!ý±xž$�Öºf5öГkâààT’‰2K[÷³¬u?¾²�R1Gô¢µÀš¡R–ßï^Š eÔX>ò~È�½£-ìË5ñÚ9Oa ÅCû–àz r¥z„Ô¦ðǓˮ£Éع¶ã£”Œ„tÇö²Å­=©žävGeSê´Ò™ëØ¡�”ß»7À¶áÞf\¤ÃEÍåçØ¼öL‡O}¿Ì9‹à¯¯qøÏ{|ÙhîëgÿÛÇ-Wóà0<¸1dé IC�௴ø�ßúØžÞ£øð�.ï{K‚·_lsÓíËfJR Á?°m·æ ïu˜Ò yíÇ‹¼æ›|G‚ÏýÂGÚ0­Yð¡oxÜ÷´â½¯ìîÕüõÍ×¼Úáï®Kðµ3}þòu¥²æwë¾ò�4×^dS›†æÁ¥ÿàröi_ù³äq]£BIv�´qÁô-c‰¢:Ì'3´$¬€Þbwo_ÉŽ¡)ô�6i`…‘~àåIÈ& Ó´„Ì$‹ÌkÝÅYS·3½n€¦tÑDpÂãs[ÇÖ±RŠÖÖVV­ZÅ’%K°mû˜Ž@ÊÕ;ª­­å¢‹.bÉ’%Ü}÷Ýìܹ‹„£˜ÑèáбÖaVä~ö´ÅÒÖ}œ3u?|æÜ»é|¤=¾‘¶}¦µìeqóB$§·ïáÌŽ�lîïä«k®„ œJ³:Q˜4µ-™ÅqãW/z€×Îz ¥¡–ôë�BS“(QL7]U×CÓûâé¹Mw®$Ñ¡QfçsÍܶå,ÞæÝ\2s¯˜¾™PYürËY<¸ý,DÔìãxrÚ�î¹ÔÕôá‡6¹ÑÖc³Ê´4„œ(š´g‹Y{ÂX°vœPJãXppþáÇ}>�jò÷hæO”˜ß)Èi~p·ÇÐ åÁ `Û6eú#šKWYüË Iþî».¿|8`Å<‰”`KÁê!ë ùý€w\j–áš¿wù��&ùÑߤxç�.�’õ»Bž|L‘×!Ÿy'4× ”‚5›C¾}«�H 6lÜòÔš�†6ɇޠY>CÐP#ðBX2Ûâ–ß{<³OñöWÚlÙòäŠ| (»U2à—´!}Öî_LM¢ÄÊ);™R3\¾žŒc•yÇiÛ%ç¥øîS—ÒÕ3ÛXÅ2@Eˆñ¥heƒå³dÊvÞ¸h 홤Tø¡�*<Ö‰UL¶žçaY«V­âÜsÏ%�6Få±2< )Ç;�ëu¶´´ðú׿žÝ»w³fͺv“p–e�[.>„¢ŸbÛ`FZ@ê±^š‘X§>;ÈûÎü-í™Qò~ 7ªã:¿©›×.xœ_?s!hkL`t ' q'¡ X5ë)f×õ³¸u�x¡ƒ%4íÙáŠ:3Zñ�;‘v<Î�¾•Å­õÒ —³Œ”²l˜Ê¦ƒó"!¸¡�D“°^?ÿqÒyþwë9&;r©OVñë¹A3˜kéÙïQçßÒ™a¦ÕõÒífÉåZ@ÛÏâhõÜt›–Ù$4×Àÿ>òëÇ}®:×!“<´1$ek\žÜ’w¡0ìc!xíª4~�Ã×@‹fZ4ÖJ,V-°H:¦Âb à½¯q(ZqÕ6Ûº£>\wžÅë®<;żé’ÛÖü÷ÇR|â/\rºEϰfËnEs� .éÚX$WŸkó/ŸLréJ›‘¼æP\}¾bn‡dÝö�º,<±E1¯]ñ…’Üôñ$KfJêk$v¾{‰ Ö4ËYîØr�î[BGv�Ó¦ìæì©Û_ìÇø=ŠE {§ñóMçÓ54™0Ež”>BhìeCÈ’ùÛxÍìõL¯ï#íx&m34¡¾ã!c­5žç¡µfÁ‚œqÆ̘1Çq*d|¬„ GAÊñ€aýšš–.]Ê”)Sزe [·ne``¥RJs°€EH)Lð½õ3:2Ëv+²só`+FòMüô™‹Xв—Å-ûhN”…Ø\:s)Ëç®+Éç‘2 Ößæ(yÙ?]'F¥,+íuTŒ¤£v�Kfm $ð•�:rç8•õ­¾¶©KiJç� &νrêvvNßLCªˆŠŠ˜mÚ$¢’¢5ŽË�;W0\¨G+ÛÌf¥2éaúh­á#@Kð“Æ§{ œ´$-ŸŒT¸ùGï>®ÃŒvœËk~ñHÀþA�.jþé¿K°£GóÀSŠ�~ÇãŠ3% ¦;Üõ„I»ù6�†† f˜ á~þ`Àª¹‚+VÚ<´Iá?ÜþxÀ#›a鋽ƒšú¾ÇhNsÎi’y’oßåqëýÝ}𹙯=Ûb §yßÍ.þ ¬Ý²-ž©JÈ=O…¬ÞªX4G2RÔ|úG½Ýš�ÿ§Ç‡ßèðÖKúG4·?æóíÛætÎZ,yd‹bOŸÇ�a^R¤\�P%Ì538ÒÆ3}³Ð.œ¾Å举®ìqm'…Æ‘!–PtêxhßbžèšÏh®a/{Ë8†ÄtöZ:}#ïXò ué"%?�i Žå>Uó ïû8ŽÃ¬Y³˜?>‹-"›Í²ìñ ’u´¨XÃÑNK¥à±ÇcÏž=h­±lÇ‚r�ä[O^Êξ™Qq Å6r`ûd’·ïàm§=Œc…ø¡EÊö8˜oä{O]Âþ¾YF,ôäÃ^Ô½HÚeT¹þ¸/ÈË‘‹ÚJå©uJL­ígvcmé�õý4¦òω'vÖ²¤"a(%©) + ï'ɹiú õ¬98‡õç%x$âÇU)N€ ©¯éÃóÓ”JuóÄMIsÍŽZ€vb œ(D`^“.§'`ÕA"!(4„|pê4JA¥KáCœa¬4„>f^Ò�Ž\yLá jjùœ6û±Ì¾õà¹@É,'ìÈ;ïWkYCR $èˆè¨0H¦N຺ڨÂet,9 �ãKG'5¦g|$h¨ïáÏVý†Öì(¡²NH5¨É÷XeÙŠñ‚$‰>í¨àÇö�îÝs;†:)æ£æ@áDùcÓ]K üs¦nåýgÞIÂRÆ['Ž>ù¶šˆÃ0$’É$§�vË–-£½½Û¶+Ë<2®ìóXI9ÆDr. tuu±eËöíÛG.ŸG+M9LÓ[n¤k¤�uÝ390ÚŒï§+¹§që?­,Š3flàªùk©O‘Ò”†,e¹w×rîß½ Ä�]ª[€S%�X¦ÅÚ)T 0—»®¦Ÿ‹:·²¨m/)+ .Q±,¢´sQŸ@(-*©t“A#°Eˆe… Á ìiaõ¾El˜Ê¨Ÿ�Z!Q¦HÙÑ*BS›%‘ÌÑh y)r­e}ýqÆ»ŸªÉÆj�þ†+ØÈ"ׯ Â±eÌqcr‚5ȱÈCå�0ÒÄíAãýØ‘x<Œj²ÄÛ�—«&„øX¥+82ÖnÔlOGD,âcÓæ¸¤urç%?dô\h ³±‹·,y˜¹�=”Cç„òø6†K¨JntÜ!JGLÉwÈ»¶Má±®ùôä)êAj¤ _ö½Ðã6—ZGa$+dQûN®[ò �é^hU^y5±†aˆR ˲hlldÞ¼yÌž=›ŽŽÇð̉"ãÊþ�—”cL$g­5ù|žmÛ¶ñôÓO3Ðß�P.AH’Q¿–Ç»æóÐÞ%äKu—¦YY µ$•,0µ¾—³;·°¼u�é‡Õ»O'œSm�!Ll÷�WÙ|çC)6í Y:Ëâcßsù×ÿô�I� !‘�ÿùT’K–ÚlïVœ>Gòžsùö�¬ÌK§êÖó!´Iñ²©K;¶rÕÂÇhL)ø x9Êcuï�J:)�«:<Ý;�_m9ÇdhY:ÓæTï7¶®_ü7÷ùŸ ’€úÌ0 ÛöðêÙOÑY;H¨�†%ŒÈ:f�jNRJZklÛ&�NÓÐÐÀüùóY°`���ãö9™Ñù¼�ßóAÊ1ª7]}2žï3ÐßKO׺ö°e¯ËÛk¹oÛl‡§›¼KaYqL�Š fL5ørôžTèHÀÔV3ÀÊŽL©ëg~c É"ž²ñ•…Öõì¢ÈKŒû­êûã üؽ­¡ÒrcÿTþgãô�LÁ¤:�B5âFÉZØð� ë·+®ýûÿùÿ¥xÕr‹³?Pb_—¹¨—¿Òâ7ÿ˜æÚÏ–ùé�>¿»9MC�àÜ”ð]žKÚõKfì‘ÚÔÔ rFÇ^1mSë ”E ä1[ÇãcĆˆ(‹¡R òõôYß;‹�}3@›‚ ¬D™Î–½\1÷ Vuì¤à%qCГò¡}�Ç&«B˜÷Ä‘ðC‹œ—¢¿ØÊ®¡)<²½¹6’F+Ca¥êâCWÔÓÚ2d,Cj3#´ÖörÙ¬ ,mÛG¨-Ü0]_eX)|?D)�”²b ×ÖÖÒÒÒ¼yó˜1c™ÌøzùÕñ IÄÕx^Iy"ªOrl"¨«o¢nÙ,Xï¾.Ï®.—í} 6°Ø³_ñà¶�'vh‚áˆ�£Þ²²J,|Ф� :ú¯�A$úlØ¿˜ ÒP;À¼ú^´ìåÌŽ]¤lOY•Y¾D“qüˆHÍK³w¤™ƒ¹F\mÓ›o ì¦¢™ª"›,’r\%fÔõ3¥v!u”+"£ "—õ¬éXÉ=Zΰ´e?K§ì`ÝÞ¥¦n÷óbÒuÔ‰/jòÂ!nÝ·fŒÝ¥Ú�€»ùÌ-.ùG¯:Ãbù,ÉÖƒŠ�æ]û@<ñÓZ¢“+?«m¯�¿–E­ÐJ2\Î1“L:’Ò²òôÚ"ĶÂJ娃¹Fv·ÒWh çÖ²k¤…Á\sT-N«ØöªâÁ/Ígî„ ®¨ç”¨ÏŒ°¤©›ÙM],kÛKSº€%ÀWÒpèáú0XJ`Û)Z›2Lio ©±�ºº:jkkinn¦±±ñˆÖð‹EÄÕxAI¹‡#ha×0gF sfÀkVšo÷÷+ÜrÏS!Û(º‡4»z5î(•ÜG¤tdUè%Ná8ÅՇǸ™¼ Áðh+�Oáñ®ô—×pnçVÒ¶GÒ6Dì‡6Û§PöH¡( îØ±‚D˜ˆ|žñ†#Š ˜ÒØÍySwÒYßË´ÚöŒLÁ‘!³úP¶O¨­ I�=&qoQ)nb~_$郲LQ¡�²ªéûIìBÔìïƒ�œff«@ihi”䊚Á!ÍÔY‚º:ÁæíŠO}Ýãû¿ 8gŽàô?KóÄ®XceÄË6¦»DÑ¥- ´Ö ³¼}7¯œ¹�¦tžRT^v¢eÇpK˜ò89/IÊö+)Sù É@±†ÑR-ò͇µ’I–+ž•’Ÿ`¨XU•ã�ÖË]!},Qˆ*S¥E³Ã¸žEÞ³qK)Ð6¢V³t&œ·(ÉŠù æwØLm’Li‚ÆìømN¤·“‘„'â¤$剈cÈ»/Çÿ^(k¶P<±K±ý ¦·O±¯W±nŸ¦oP£<Æ*I–©Ù ‘Û;úc¼t 9ouTÙª:­H†’£s …©ò&CЙ(b …令¯fiûnæ6ôÐY3LÆqA(2އØøÊ¦>YDiÉîá6nÙt.CSMsŒne²™¦Õö#-�™uCìè$Œ²û§Wð Þ뉀¹w`§à#orX2K²y¯âk¿òÉ ÃûÞdÓR/¹ñ�?¾Âæ§Y<³[ñÝ»úº´©Ìu2žØq`L— PÊ<Ëmõ=,j颹f€å­ûhËŽh‰:„JT ±Œ�pÌ'ñOÙ kÙ›kbÏH+k÷/FûIƨ%]ªÊÆšíœüÄð| ·ÅÄÏ‘+ 1žO Hmâ“ ‹émpútÁôv˜Ò*X2Mpúl‹¹¢’1›è˜í¾4¯óK‚”'"Ž‘ÅîK9ɵ/¹šÞÍ@NÓ= Y·;ä� Š ;û{5ãøtÕ“g_YÆÐŽ û¥w…N,&Z À q±ÅÕ²*íÁ¾²Œ5m{Ô¥Š82@H8%‚Ð! ÔeQ@ßH;¥ÐAÇ­>eÀ‰ïÅ-ÀMÓиŸë–>ÄܦƒØ"ä›ë.có�EHrô…ûž_Tæˆ=ûZa4íf÷LUB¦„%¼|û‡X¾Ty‰ž¡*¥�€Ú4dR‚t�`Z³`N‡ £E2µf´JæOÌh“¤S‡^K5æl0¶”8iÃç„—)O†ŠË»âÊ8ü,*¡èjF5{º�l ypKȦݚ®~M¹À˜[¥ú©‹½TÖØCRµËÊqœÂñ£)®¾wñÌXh,Ë'›ÊszûNf7tóÛݧs w6B'ÄM(¤bJmoZò+§îbÏp3_zä ŒŽ¶�åaE "Œ±¼0°RæJæ³LšÏaCNYSË:p«SŒ©±á0+¨©‡]í°HóŸ¿'MþrµršÈ5�P`ù4Ô ñÊÏ0¿é 5ÃÔ'KøJh“‡Ÿs3lìŸÊ¦¾tç›èn‡Ð¤$¡¤¹�V€êÐiÞ€;z¢Ž²2ßÓ‘fbCQõÏ�º:˜9E²|¶à‚…’3çZLo“4ÔHÒ‰Ã�É묿\¬à£ÁË–”'CµÛ;×kU—ÊÆýÝ7jÈz`Ĉ˞ާÙÙ§Ö¸eM¾¹‚Æ/cˆ[ú/ÞϸTà Öýóƒh‡'‹%÷|@ *µ¬�r$${î�5­l:Zöqõ‚ÕL«&T’[6¼‚MÝ °„:rü:JCêr;Ñ0‚.Í{ßìð'—Ùüñ�.ƒ#šïþU’„×~ÖcÑTøÚSüãO|þ÷.+Y¥ªŽˆ7n¡£çXÈèoÚf ._nñ¶‹-¾yOÀ­·/ª2»"”Š=)J"—úTžúš!NoÝÇÌS §! �ô–êÙ3ÜF¡Ž�r†áR #¥zº‹u…?„ *¾<,à˜E…� TãH·Úcš‘·2¨É2IA2ÒÞd±dªdñ4ÉÔfAKƒ ±V0¥^ÐT+pœI¬ßqûÑHiìm5�8î³=ÆR˜J©cN‰ÒZWjdÇm‹�ô}¼ŸøØdU@¼z�-%êÅÀá¬åj‹:ŽS§S‚™)ÁÌöÉ·Ut5ù’¦k@³iŸbýnÅæ½ŠÍ]šîaM±a¨ Cã  ªÊßcQq�O<¦‰zÌÄ-­Ò8×ñm„�D ‚Ę[ñ9B#@†t·ó�Ç_O[ÍÅ A.ß ðì‚2]å:yž!Àà(œ¿ØfñLŸM{o8×­uç-¶8k�Eÿ kÚ=Ò¤Qh'j^Y£=HÔ ‚P£ŠÐ¶{(å±Mžcb�˜óûdß+¥Æí'þÍàˆfdTSr¡7§éÏkJLïÙ�qÏdåŸ4n¬G«Nÿ=be3+ÀN©u<G›AÛœ²:9¥[=­lzÓ‘Ë|7æ‹ ­Kðôö�|Q3sŠD)Øß§IÚšÅ3%s¦Ivu‡lÝ«I]xóë,Þûj‡�݊׬²¹w]Àö.Í W8ìëUÜp³‹–v†óð¹?N�r`ã^‰ãiæ~X õ=ÌmìæœÎíL¯ï%!CÊ5lêŸJÁËÐ_¬gÓàú õè¨\fÉÍ ¢’¬¢JQ=yŬ“ßËTÓ­V2W¼pÊô@$`dº÷v3IfA)Âr€ÔÒk˜9§“ÚD@&#i¨—L©‡¹m0¯SÒÙjÑX+©Ï@Ú�lR`Ùñ¨hvü›;îàô+hkm3$UvŠlÇJj’±ͱjmj Ä­]×Ų,úúúX·nW\qE…¸G²±…9Ñòt]×T�L$ޏNüïÞ{拾³“ Bž“­/„ ¯¯�Ûn» )%o|ãill¬œç�ücJ¥o|ãihh@kSYlݺu<üðÜwÞy¬X±¢²­ÁÁA~þóŸ“N§ÿ°Ü×'‡\µ£h"eø�fw�bG�bG—bÇ~ÍžMJE�@Ùƒœ«Á<=¦Z”¢R0%¶¸'wÃÇY]yQ'=öSxVŒ]ɓϊŠ{'Û)xòëÖn ÙÛ§X:S’°aý.ÅÊù^ô±2Nü"üÅÛm¾úg)þç×Õ¼ýU Ûòà†€�¼9É~îñ·7yÂë.‘|êú–„/Üêó³_‡X©²Y…À²<¦Ô÷ñŠÏpÞ´­4$‹ •²måÁýóy¢k!^9cˆ'zd2Ç–}øÊbw¾‰ ÐijO'DäÆV¨ØË4Ñ‚è]®¨™CªTÍzÌ—XIEm6K2ÿξ/RW—aÿ滩¯Í°bÕ¹$dÀ üçŸ=—ºdÕ&qL‚04¶dÉbn¾ùßxõ«_jŽ;üI¾+ \ýõÜvÛmÜ}÷Ý|èCâ™gž©ü>QNü. C¤”äóyÞùÎwrË-·�N§Çíoâ:A`Û6—]vW]uúЇ*ßM†˜Ì7nÜÈÕW_Íå—_Žëº<øàƒÜ~ûíÌ™3‡k¯½–‘‘fϞͣ�>Êí·ßNGG?ÿùÏù›¿ù®ºê*n¿ýv>þñ�ó'ò'lÚ´‰+¯¼’‹/¾Û¶OYÊÇ‹IÝàUïúá^{YÙ³¦fM‘\\µn‚š8u¾dbÙ]Êž!èÉiŠyÈ4ù’¢TÓ=¨90G5ª ”‰‚4ñAê±€vLârLu;ñµ«>‡S>'#ÇÐÚxû‚aÍÃCVÍ,�iñ�{Bškà­Ú$‚¯ýÊ‹ FzJ®æ#ßðȤୗ$øê>ßÿ•Ïëα™Ú Lz`îX£¸ó±2–4Ï)‰¸{”¤%ÎêÜBʸw÷R¼ÐfS'{ûfšŠ\ažQ¡E«I¶÷Î%Ô¥ªÜLGÜXÒEZ^Xwtë“yá&ª–£]¢õÑVDTññ!HÌ œ‚DV0­ÚMÐT#Ȧ%5u‚Ú ´Õ ¦6 ¦4jë/ ™¼€¦xÇõïfZgÿúÅÏPÈ�¢½žÚ¼‹d2Å¢E‹(–ÊÜÿý477sÖª•(ù|Ïó�R°víZ–.]JGG H)xà�hhh`Ù²eãÈð�@kÍE]„‚r¹ÌÈÈaràÀX½z5O>ù$AÐÚÚJ?O>ù$Ë—/§½}|1¶<Ëesœ---œy晬^½šGy„µk×rÞyç�#a)%»wïfóæÍ´··³bÅ 2™Ì¤VõDÄûýö·¿Ík_ûZn¾ùfÞüæ7ó£ýˆ«®ºŠG}”={öð§ú§|ùË_æ‹_ü"ŸøÄ'øÂ¾À›Þô&®»î:ÞñŽwðÎw¾“ù—á‚ .à;ßùpÊ}}BQMÔG˜äúŽGV®cƒc 2IhkÌé€JI² (ºš¾EÏ�æà�fO¿¦w@Ó?ªé/@±å’ÆóMì{¤£EÍ`Á¸. õ˜¢<ž–ÇÙGqLIŒÅáÅaH|â9�ûþ¡¿°°fSÈ;.N†šõ;<¦¶H–̲Êi~»!wãçÕ’`GÆ¥Œ&nÕa�|ŵâ}�˜C>Œ¢:®•i-”ê¹õ™‹Œ%Úfi~‹óƒõÄuµÀâ‡÷(H¡ ‚´ÉéŽÖ™ìÝž81÷~ÄÖl,ŽŠuVUŸÇY-À$RÐ�Ôe¡!+H' áR5‚l Új ­I0µY0½Y2¥AÐÚ h®$ì#Ý Êl,]DùyT �oç{|ý_Çs]®¹æM|ðƒÉýÑ1gÎY¸p!ÿñÿÁO¬åøgœq###¬]»–ÿøÇ\xá…„aÈG>òN?ýtž~úiÞô¦7ñ©O}Š‘‘®»îºŠ úŸÿùŸùÙÏ~ÆÈÈ—]vÉd’d2É’%Kp]—ïÿû\qÅlß¾�w¿ûÝH)Y¿~=?üá9ï¼óÆ•ÇÜ´ioûÛ™={6}}},_¾œ¯~õ«üîw¿£X,ò£ýˆ•+W’N§ Ã˲øüç?ÏOúS/^Ìúõë¹è¢‹øêW¿J†‡Tÿš qÜ÷ŸøÙl–r¹L*•bxx˜ÎÎNzè!V®4õ¡ƒ àòË/ç›ßü&£££¸®Ë\@¬\¹!{÷¿Ÿ7¿ùÍ•}œ"åÕ3çjLFÖÆ wFÖöÌ6‹™m‡ßWj\F š¡¼f(§ÈC®¬É—¡?¯){šB G4ý#Šþa“¿=PÔ”Š†Àµ¯Ç\dÕÇ[ábàÕ±ñq§Ÿ|e‡{ ªÝe³’åÅ!KnËck�ÿk²ågO~È;Üyˆ#þz"¡£°ÆêÍŠ„»áéÊTIB³õ@ȶ½ªB¸ñá9Vô9"äX»àXb¼Ö¦*<òlcWEŒÅá®åØ3 u¼“È«°°¢#B�r ££3�´‚x­(&¬Á ¢šÒÙ²Šò'±RãíLöEÅcTUð"n%;F°züªCKŽ ‘�LÚk-u†D›êMu‚t j’’Æ Ô¤ !7e�µÐT'È&ÉÈ£.M¦1‰_9� mla› ��HË ÿår‰B>ÏúõëihhàÊ+¯¬�*À²e˸뮻èèè`ûöíÜzë­Ì›7�w½ë]|ãßà /dpp�k¯½–Ï}îsìÙ³‡U«Vñþ÷¿Ÿÿ÷'•Jqë­·ð¦7½‰o¼‘O~ò“lÛ¶�Ÿüä'¼á o §§‡Õ«Wóå/™Õ«W344Ä¿øE.\È 7ÜÀ׿þuÎ?ÿüŠ‹ZÁ‡?üa®½öZþöoÿ€ÓN;�»îº‹O}êSÜzë­|å+_!‘H µÆ²,Â0d``€_ÿú×´··³nÝ:.»ì2¾úÕ¯V–;Z477W\á_úҗضm×_=Ÿüä'iii¡ºO³çyôôô�H$H§Óض]9¦b±È…^ÈM7ÝÄë_ÿzòùü)R>Y0Y �Žß„ÛØdS‚©ÍÏrF‹ŠÑÈ¢ÈiúF4ƒyç)‚Ï5Ã%p�ïC¡¹’¦PÔÊ�+BÞӨ𫳠<� ´ÂôE39Žè_˜ÀœzÜo‡(f…šÁ\ËŠšD¹¬=i ¤¸\¨2Û¨¨¨Å\Ø1[æø„é¬5™hèDÕ>ÖìØ¯øÓ/•*ÂHΈ²ÞsS™�]·¤Á("!¸û‰€÷}UÑ3¢*Àûn.qÿz…þî?Ëô�h„¬²õ¸³­š7�¿i³'*çm_U�{Ü’P!¤¢6Q&a”‡Ràj�°|RV€:¡½Ó,¢Â„c˜r˜&°nW•÷k:ެb«5¾h“ ÄÕ·#&WÛx²jR‚š4Ô¦Íÿ³YcÁÚd‚ú´ñteR‚æhÊ šë¡¹VÐT+©IEð$Å1Žuè©:Áˆœ]‡{œ—}R.—9ï¼óhhhÀu]¶nÝJ¹\æ±ÇÃqJ¥Û¶m£©©‰Å‹3oÞ<Â0dÉ’%<ùä“€q_¿å-o!fΜɢE‹xôÑGÙºu+»víâšk®A)ž}û¨¯¯'—Ë1cÆ .¸à‚Š: CÊå2Åb‘E‹±páBÂ0dáÂ…<ñÄÀ˜ûØó<¶oßN†<üðÃ8ŽƒëºlÙ²…•+W¢”btt”–––Êz–eñ±�}Œ›nº‰­[·ÒÝÝM6›=äzÄÄ/¥—Ú4q˲øû¿ÿ{¾õ­oqç�w’J¥*ëÆ†!¶m“H$I™²m›‘‘>ö±�±~ýz.»ì2fΜyŠ”_Š˜,N5)yW½Ä“YÝ•U#ë».+©;ô=<4”÷øÂEëD%°4*›P[x�M "kÓͪ¤•@) 7´õ҄ʪü+‡ ´–ìjc[ÿ¬JG®85GÇâL*¾!2baiÚXÆ/;¥ÐZ(‰ ;ë‘M–(ø6�ŸŽž‹”ƒ”&2›ÎQ›.So—™’fÈ«aÔKâ…/”¤¬€BàPgû›ÁÜÚé#d€Z½tD¸!½Å:Êa‚À·ØZla¨T‹V6"Äô ð •BhMƒ“¡IZ©¨Eh�ã“´j×ô$ ¥Æ–`ÙK ² ÓƒXë4 'DZ’„-Ȧ‰„ƒeÙ¤ÓõY›¦ú4Muij3)GQ—uȦdÒé”sÜ©±•Û¤«Ÿ´ñOϤVí $ÚcA¡P \.W>»®K¡P¨¤½êU¯â–[nášk®¡««‹÷¼ç=üèG?²,FFF*䯆|>ó™Ïðÿþßÿã—¿ü%ÃÃÜ}öÙ\qÅÜxã�|ðƒ¤©©‰«¯¾šw¾ó�¼ímochh¨B˜©TŠƒ²víZ<Ï#ŸÏWöãy^e?Bˆ ù_zé¥ÜrË-\}õÕìÛ·�n¸�ïÿû,X°€®®.Ö¬YÃ\P±®{{{Ù²e ¿üå/™6mý×ÍîÝ»ÑZS(p]Sêîg?ûóçÏgùòåÜwß}$‰J<;&ä›o¾™›nº‰»ï¾› 6�Ëå˜;w.W]uŸÿüç¹çž{X¸p!7ÝtÿøÇ±m›ÓO?�O~ò“Üxã�|á _ ³³“™3gò¥/}‰[n¹…;35kÖœ"åS08Zë»Gr£ÇŸÇmBH,'I]}’ºúºg=&cI(”Vh¥Ñ‘$Uh�Ö* xžÂ�°B…Š²ë¢µÂu]<ÏC)E±X­)»e|ßG)ó;BeÜfñ XZk\×­ aN8>#“µ„‡e›ÏZi„„¬=<6!Ð*²Ä5q‹I…@¢9wJŠíƒÈ5á6û 윎´¤%‘ 3 akÚ2ƒÌnFâ¨~š“Ô&K&d!l+ -Ü0AÒöH;eÒ¶O€ è¥ZãX!åÀ1Ó©¨I”HHeH\(-QZ"¤@"µdSï4ÙH)H2R0½¥3އ&ÉÚ>�5£¸�C:á³Üê¡&Q&•dÒ6ŽH8!™TÛ±¥&•N’°C)ɤŒò5�N’pl,Ë"›I#„C&]ƒãØX–$•L"¥Ä¶m¤”8Ž�`ÙŽ‰»Æ³­X±6NèP­d¬¦Îª©Ûø¨ÈäÏòÄyÛ‹H°Ç‚˜ä–-[FsóXö±�ñWõW\pÁ“î'ÎGÖZóå/™�|ä#\uÕUŒŽŽòþÏÿáœsÎ! CÞñŽwðw÷wÜzë­•øïâÅ‹ùô§?Íõ×_O{{;_|1o{ÛÛØ¿?«V­bÚ´i€É1¾üòËY¾|9¿øÅ/â¼óΗNõÔSOqá…ò�ÿø�fÜQŠë®»Ž}èC|ík_ãÓŸþ4BÞúÖ·ò®w½ ¥ßüæ7ùà?È[ßúV’É$?øÁPJñþ÷¿ŸíÛ·sõÕW7÷©<åSx!aˆ\OøæÐÑìDµ]‹ÝcAš04n¶ )C…ˆ…APù^kM¹\®�r„aX9¶  UX‰^¡™Dg`¶­Á27¿j´€„ ±eHÑO¢µ` XÃΑœDºBN¶m!¤)R›T´f†©M‡Øj”R¾‹ ;$îA®”±ž¥$²Ö�û]�µÔB ªºLÚ2ÞmZJŒõmÛ6Ò„¡¤¯XO*•FJ×3U³Û'钶Ʊ¤ÐÔ$5¶-°D@Ê‘ØÉJƒ@’L¦ÑQYÇTÊXÖBšï˶ÂB bŽ­ôaå¾3~Òxèõ?ôÃIΩ/8Êå2ŽãS¹K×u+D[íÃß÷I¥RÏËq&‰£®Ê)‰]íG*ÉyÇw°wï^Þ÷¾÷UâÈGBõ¶J¥étú�eòù|ÅÝ]�B¡@6›åÿÁkÏîÂ(zIEND®B`‚jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/project_templates/000077500000000000000000000000001516532232300277355ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/project_templates/nbconvert/000077500000000000000000000000001516532232300317355ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/project_templates/nbconvert/templates/000077500000000000000000000000001516532232300337335ustar00rootroot00000000000000classic_clone/000077500000000000000000000000001516532232300364555ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/project_templates/nbconvert/templatesconf.json000066400000000000000000000001121516532232300402670ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/project_templates/nbconvert/templates/classic_clone{ "base_template": "base", "mimetypes": { "text/html": true } } index.html.j2000066400000000000000000000063721516532232300407740ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/project_templates/nbconvert/templates/classic_clone{%- extends 'base.html.j2' -%} {% from 'mathjax.html.j2' import mathjax %} {%- block header -%} {%- block html_head -%} {% set nb_title = nb.metadata.get('title', '') or resources['metadata']['name'] %} {{nb_title}} {%- block html_head_js -%} {%- block html_head_js_jquery -%} {%- endblock html_head_js_jquery -%} {%- block html_head_js_requirejs -%} {%- endblock html_head_js_requirejs -%} {%- endblock html_head_js -%} {% block jupyter_widgets %} {%- if "widgets" in nb.metadata -%} {%- endif -%} {% endblock jupyter_widgets %} {% block extra_css %} {% endblock extra_css %} {% for css in resources.inlining.css -%} {% endfor %} {% block notebook_css %} {{ resources.include_css("static/style.css") }} {% endblock notebook_css %} {% block custom_css %} {% endblock custom_css %} {{ mathjax(resources.mathjax_url) }} {%- block html_head_css -%} {%- endblock html_head_css -%} {%- endblock html_head -%} {%- endblock header -%} {# using the body block like this makes is difficult to be composable, added body_content/body_cells block for that#} {% block body_header %}
{% endblock body_header %} {% block body_footer %}
{% endblock body_footer %} {% block footer %} {% block footer_js %} {% endblock footer_js %} {{ super() }} {% endblock footer %} static/000077500000000000000000000000001516532232300377445ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/project_templates/nbconvert/templates/classic_clonestyle.css000066400000000000000000010076621516532232300416320ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/project_templates/nbconvert/templates/classic_clone/static/*! * * Twitter Bootstrap * */ /*! * Bootstrap v3.3.7 (http://getbootstrap.com) * Copyright 2011-2016 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ /*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ html { font-family: sans-serif; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%; } body { margin: 0; } article, aside, details, figcaption, figure, footer, header, hgroup, main, menu, nav, section, summary { display: block; } audio, canvas, progress, video { display: inline-block; vertical-align: baseline; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } a { background-color: transparent; } a:active, a:hover { outline: 0; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } h1 { font-size: 2em; margin: 0.67em 0; } mark { background: #ff0; color: #000; } small { font-size: 80%; } sub, sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 1em 40px; } hr { box-sizing: content-box; height: 0; } pre { overflow: auto; } code, kbd, pre, samp { font-family: monospace, monospace; font-size: 1em; } button, input, optgroup, select, textarea { color: inherit; font: inherit; margin: 0; } button { overflow: visible; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } button[disabled], html input[disabled] { cursor: default; } button::-moz-focus-inner, input::-moz-focus-inner { border: 0; padding: 0; } input { line-height: normal; } input[type="checkbox"], input[type="radio"] { box-sizing: border-box; padding: 0; } input[type="number"]::-webkit-inner-spin-button, input[type="number"]::-webkit-outer-spin-button { height: auto; } input[type="search"] { -webkit-appearance: textfield; box-sizing: content-box; } input[type="search"]::-webkit-search-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } fieldset { border: 1px solid #c0c0c0; margin: 0 2px; padding: 0.35em 0.625em 0.75em; } legend { border: 0; padding: 0; } textarea { overflow: auto; } optgroup { font-weight: bold; } table { border-collapse: collapse; border-spacing: 0; } td, th { padding: 0; } /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ @media print { *, *:before, *:after { background: transparent !important; box-shadow: none !important; text-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="#"]:after, a[href^="javascript:"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } .navbar { display: none; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table td, .table th { background-color: #fff !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } @font-face { font-family: "Glyphicons Halflings"; src: url("../components/bootstrap/fonts/glyphicons-halflings-regular.eot"); src: url("../components/bootstrap/fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../components/bootstrap/fonts/glyphicons-halflings-regular.woff2") format("woff2"), url("../components/bootstrap/fonts/glyphicons-halflings-regular.woff") format("woff"), url("../components/bootstrap/fonts/glyphicons-halflings-regular.ttf") format("truetype"), url("../components/bootstrap/fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: "Glyphicons Halflings"; font-style: normal; font-weight: normal; line-height: 1; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } .glyphicon-asterisk:before { content: "\002a"; } .glyphicon-plus:before { content: "\002b"; } .glyphicon-euro:before, .glyphicon-eur:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .glyphicon-cd:before { content: "\e201"; } .glyphicon-save-file:before { content: "\e202"; } .glyphicon-open-file:before { content: "\e203"; } .glyphicon-level-up:before { content: "\e204"; } .glyphicon-copy:before { content: "\e205"; } .glyphicon-paste:before { content: "\e206"; } .glyphicon-alert:before { content: "\e209"; } .glyphicon-equalizer:before { content: "\e210"; } .glyphicon-king:before { content: "\e211"; } .glyphicon-queen:before { content: "\e212"; } .glyphicon-pawn:before { content: "\e213"; } .glyphicon-bishop:before { content: "\e214"; } .glyphicon-knight:before { content: "\e215"; } .glyphicon-baby-formula:before { content: "\e216"; } .glyphicon-tent:before { content: "\26fa"; } .glyphicon-blackboard:before { content: "\e218"; } .glyphicon-bed:before { content: "\e219"; } .glyphicon-apple:before { content: "\f8ff"; } .glyphicon-erase:before { content: "\e221"; } .glyphicon-hourglass:before { content: "\231b"; } .glyphicon-lamp:before { content: "\e223"; } .glyphicon-duplicate:before { content: "\e224"; } .glyphicon-piggy-bank:before { content: "\e225"; } .glyphicon-scissors:before { content: "\e226"; } .glyphicon-bitcoin:before { content: "\e227"; } .glyphicon-btc:before { content: "\e227"; } .glyphicon-xbt:before { content: "\e227"; } .glyphicon-yen:before { content: "\00a5"; } .glyphicon-jpy:before { content: "\00a5"; } .glyphicon-ruble:before { content: "\20bd"; } .glyphicon-rub:before { content: "\20bd"; } .glyphicon-scale:before { content: "\e230"; } .glyphicon-ice-lolly:before { content: "\e231"; } .glyphicon-ice-lolly-tasted:before { content: "\e232"; } .glyphicon-education:before { content: "\e233"; } .glyphicon-option-horizontal:before { content: "\e234"; } .glyphicon-option-vertical:before { content: "\e235"; } .glyphicon-menu-hamburger:before { content: "\e236"; } .glyphicon-modal-window:before { content: "\e237"; } .glyphicon-oil:before { content: "\e238"; } .glyphicon-grain:before { content: "\e239"; } .glyphicon-sunglasses:before { content: "\e240"; } .glyphicon-text-size:before { content: "\e241"; } .glyphicon-text-color:before { content: "\e242"; } .glyphicon-text-background:before { content: "\e243"; } .glyphicon-object-align-top:before { content: "\e244"; } .glyphicon-object-align-bottom:before { content: "\e245"; } .glyphicon-object-align-horizontal:before { content: "\e246"; } .glyphicon-object-align-left:before { content: "\e247"; } .glyphicon-object-align-vertical:before { content: "\e248"; } .glyphicon-object-align-right:before { content: "\e249"; } .glyphicon-triangle-right:before { content: "\e250"; } .glyphicon-triangle-left:before { content: "\e251"; } .glyphicon-triangle-bottom:before { content: "\e252"; } .glyphicon-triangle-top:before { content: "\e253"; } .glyphicon-console:before { content: "\e254"; } .glyphicon-superscript:before { content: "\e255"; } .glyphicon-subscript:before { content: "\e256"; } .glyphicon-menu-left:before { content: "\e257"; } .glyphicon-menu-right:before { content: "\e258"; } .glyphicon-menu-down:before { content: "\e259"; } .glyphicon-menu-up:before { content: "\e260"; } * { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 10px; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; line-height: 1.42857143; color: #000; background-color: #fff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #337ab7; text-decoration: none; } a:hover, a:focus { color: #23527c; text-decoration: underline; } a:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } figure { margin: 0; } img { vertical-align: middle; } .img-responsive, .thumbnail > img, .thumbnail a > img, .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; max-width: 100%; height: auto; } .img-rounded { border-radius: 3px; } .img-thumbnail { padding: 4px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 2px; -webkit-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; display: inline-block; max-width: 100%; height: auto; } .img-circle { border-radius: 50%; } hr { margin-top: 18px; margin-bottom: 18px; border: 0; border-top: 1px solid #eeeeee; } .sr-only { position: absolute; width: 1px; height: 1px; margin: -1px; padding: 0; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } [role="button"] { cursor: pointer; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: inherit; font-weight: 500; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #777777; } h1, .h1, h2, .h2, h3, .h3 { margin-top: 18px; margin-bottom: 9px; } h1 small, .h1 small, h2 small, .h2 small, h3 small, .h3 small, h1 .small, .h1 .small, h2 .small, .h2 .small, h3 .small, .h3 .small { font-size: 65%; } h4, .h4, h5, .h5, h6, .h6 { margin-top: 9px; margin-bottom: 9px; } h4 small, .h4 small, h5 small, .h5 small, h6 small, .h6 small, h4 .small, .h4 .small, h5 .small, .h5 .small, h6 .small, .h6 .small { font-size: 75%; } h1, .h1 { font-size: 33px; } h2, .h2 { font-size: 27px; } h3, .h3 { font-size: 23px; } h4, .h4 { font-size: 17px; } h5, .h5 { font-size: 13px; } h6, .h6 { font-size: 12px; } p { margin: 0 0 9px; } .lead { margin-bottom: 18px; font-size: 14px; font-weight: 300; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 19.5px; } } small, .small { font-size: 92%; } mark, .mark { background-color: #fcf8e3; padding: 0.2em; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } .text-justify { text-align: justify; } .text-nowrap { white-space: nowrap; } .text-lowercase { text-transform: lowercase; } .text-uppercase { text-transform: uppercase; } .text-capitalize { text-transform: capitalize; } .text-muted { color: #777777; } .text-primary { color: #337ab7; } a.text-primary:hover, a.text-primary:focus { color: #286090; } .text-success { color: #3c763d; } a.text-success:hover, a.text-success:focus { color: #2b542c; } .text-info { color: #31708f; } a.text-info:hover, a.text-info:focus { color: #245269; } .text-warning { color: #8a6d3b; } a.text-warning:hover, a.text-warning:focus { color: #66512c; } .text-danger { color: #a94442; } a.text-danger:hover, a.text-danger:focus { color: #843534; } .bg-primary { color: #fff; background-color: #337ab7; } a.bg-primary:hover, a.bg-primary:focus { background-color: #286090; } .bg-success { background-color: #dff0d8; } a.bg-success:hover, a.bg-success:focus { background-color: #c1e2b3; } .bg-info { background-color: #d9edf7; } a.bg-info:hover, a.bg-info:focus { background-color: #afd9ee; } .bg-warning { background-color: #fcf8e3; } a.bg-warning:hover, a.bg-warning:focus { background-color: #f7ecb5; } .bg-danger { background-color: #f2dede; } a.bg-danger:hover, a.bg-danger:focus { background-color: #e4b9b9; } .page-header { padding-bottom: 8px; margin: 36px 0 18px; border-bottom: 1px solid #eeeeee; } ul, ol { margin-top: 0; margin-bottom: 9px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; margin-left: -5px; } .list-inline > li { display: inline-block; padding-left: 5px; padding-right: 5px; } dl { margin-top: 0; margin-bottom: 18px; } dt, dd { line-height: 1.42857143; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 541px) { .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #777777; } .initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 9px 18px; margin: 0 0 18px; font-size: inherit; border-left: 5px solid #eeeeee; } blockquote p:last-child, blockquote ul:last-child, blockquote ol:last-child { margin-bottom: 0; } blockquote footer, blockquote small, blockquote .small { display: block; font-size: 80%; line-height: 1.42857143; color: #777777; } blockquote footer:before, blockquote small:before, blockquote .small:before { content: "\2014 \00A0"; } .blockquote-reverse, blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #eeeeee; border-left: 0; text-align: right; } .blockquote-reverse footer:before, blockquote.pull-right footer:before, .blockquote-reverse small:before, blockquote.pull-right small:before, .blockquote-reverse .small:before, blockquote.pull-right .small:before { content: ""; } .blockquote-reverse footer:after, blockquote.pull-right footer:after, .blockquote-reverse small:after, blockquote.pull-right small:after, .blockquote-reverse .small:after, blockquote.pull-right .small:after { content: "\00A0 \2014"; } address { margin-bottom: 18px; font-style: normal; line-height: 1.42857143; } code, kbd, pre, samp { font-family: monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; background-color: #f9f2f4; border-radius: 2px; } kbd { padding: 2px 4px; font-size: 90%; color: #888; background-color: transparent; border-radius: 1px; box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25); } kbd kbd { padding: 0; font-size: 100%; font-weight: bold; box-shadow: none; } pre { display: block; padding: 8.5px; margin: 0 0 9px; font-size: 12px; line-height: 1.42857143; word-break: break-all; word-wrap: break-word; color: #333333; background-color: #f5f5f5; border: 1px solid #ccc; border-radius: 2px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { margin-right: auto; margin-left: auto; padding-left: 0px; padding-right: 0px; } @media (min-width: 768px) { .container { width: 768px; } } @media (min-width: 992px) { .container { width: 940px; } } @media (min-width: 1200px) { .container { width: 1140px; } } .container-fluid { margin-right: auto; margin-left: auto; padding-left: 0px; padding-right: 0px; } .row { margin-left: 0px; margin-right: 0px; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-left: 0px; padding-right: 0px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666667%; } .col-xs-10 { width: 83.33333333%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666667%; } .col-xs-7 { width: 58.33333333%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666667%; } .col-xs-4 { width: 33.33333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.66666667%; } .col-xs-1 { width: 8.33333333%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666667%; } .col-xs-pull-10 { right: 83.33333333%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666667%; } .col-xs-pull-7 { right: 58.33333333%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666667%; } .col-xs-pull-4 { right: 33.33333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.66666667%; } .col-xs-pull-1 { right: 8.33333333%; } .col-xs-pull-0 { right: auto; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666667%; } .col-xs-push-10 { left: 83.33333333%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666667%; } .col-xs-push-7 { left: 58.33333333%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666667%; } .col-xs-push-4 { left: 33.33333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.66666667%; } .col-xs-push-1 { left: 8.33333333%; } .col-xs-push-0 { left: auto; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666667%; } .col-xs-offset-10 { margin-left: 83.33333333%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666667%; } .col-xs-offset-7 { margin-left: 58.33333333%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666667%; } .col-xs-offset-4 { margin-left: 33.33333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.66666667%; } .col-xs-offset-1 { margin-left: 8.33333333%; } .col-xs-offset-0 { margin-left: 0%; } @media (min-width: 768px) { .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666667%; } .col-sm-10 { width: 83.33333333%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666667%; } .col-sm-7 { width: 58.33333333%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666667%; } .col-sm-4 { width: 33.33333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.66666667%; } .col-sm-1 { width: 8.33333333%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666667%; } .col-sm-pull-10 { right: 83.33333333%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666667%; } .col-sm-pull-7 { right: 58.33333333%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666667%; } .col-sm-pull-4 { right: 33.33333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.66666667%; } .col-sm-pull-1 { right: 8.33333333%; } .col-sm-pull-0 { right: auto; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666667%; } .col-sm-push-10 { left: 83.33333333%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666667%; } .col-sm-push-7 { left: 58.33333333%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666667%; } .col-sm-push-4 { left: 33.33333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.66666667%; } .col-sm-push-1 { left: 8.33333333%; } .col-sm-push-0 { left: auto; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666667%; } .col-sm-offset-10 { margin-left: 83.33333333%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666667%; } .col-sm-offset-7 { margin-left: 58.33333333%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666667%; } .col-sm-offset-4 { margin-left: 33.33333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.66666667%; } .col-sm-offset-1 { margin-left: 8.33333333%; } .col-sm-offset-0 { margin-left: 0%; } } @media (min-width: 992px) { .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666667%; } .col-md-10 { width: 83.33333333%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666667%; } .col-md-7 { width: 58.33333333%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666667%; } .col-md-4 { width: 33.33333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.66666667%; } .col-md-1 { width: 8.33333333%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666667%; } .col-md-pull-10 { right: 83.33333333%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666667%; } .col-md-pull-7 { right: 58.33333333%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666667%; } .col-md-pull-4 { right: 33.33333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.66666667%; } .col-md-pull-1 { right: 8.33333333%; } .col-md-pull-0 { right: auto; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666667%; } .col-md-push-10 { left: 83.33333333%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666667%; } .col-md-push-7 { left: 58.33333333%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666667%; } .col-md-push-4 { left: 33.33333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.66666667%; } .col-md-push-1 { left: 8.33333333%; } .col-md-push-0 { left: auto; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666667%; } .col-md-offset-10 { margin-left: 83.33333333%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666667%; } .col-md-offset-7 { margin-left: 58.33333333%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666667%; } .col-md-offset-4 { margin-left: 33.33333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.66666667%; } .col-md-offset-1 { margin-left: 8.33333333%; } .col-md-offset-0 { margin-left: 0%; } } @media (min-width: 1200px) { .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666667%; } .col-lg-10 { width: 83.33333333%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666667%; } .col-lg-7 { width: 58.33333333%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666667%; } .col-lg-4 { width: 33.33333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.66666667%; } .col-lg-1 { width: 8.33333333%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666667%; } .col-lg-pull-10 { right: 83.33333333%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666667%; } .col-lg-pull-7 { right: 58.33333333%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666667%; } .col-lg-pull-4 { right: 33.33333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.66666667%; } .col-lg-pull-1 { right: 8.33333333%; } .col-lg-pull-0 { right: auto; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666667%; } .col-lg-push-10 { left: 83.33333333%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666667%; } .col-lg-push-7 { left: 58.33333333%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666667%; } .col-lg-push-4 { left: 33.33333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.66666667%; } .col-lg-push-1 { left: 8.33333333%; } .col-lg-push-0 { left: auto; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666667%; } .col-lg-offset-10 { margin-left: 83.33333333%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666667%; } .col-lg-offset-7 { margin-left: 58.33333333%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666667%; } .col-lg-offset-4 { margin-left: 33.33333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.66666667%; } .col-lg-offset-1 { margin-left: 8.33333333%; } .col-lg-offset-0 { margin-left: 0%; } } table { background-color: transparent; } caption { padding-top: 8px; padding-bottom: 8px; color: #777777; text-align: left; } th { text-align: left; } .table { width: 100%; max-width: 100%; margin-bottom: 18px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.42857143; vertical-align: top; border-top: 1px solid #ddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #ddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #ddd; } .table .table { background-color: #fff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #ddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .table-striped > tbody > tr:nth-of-type(odd) { background-color: #f9f9f9; } .table-hover > tbody > tr:hover { background-color: #f5f5f5; } table col[class*="col-"] { position: static; float: none; display: table-column; } table td[class*="col-"], table th[class*="col-"] { position: static; float: none; display: table-cell; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table-hover > tbody > tr > td.active:hover, .table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th { background-color: #e8e8e8; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.info, .table > tbody > tr > td.info, .table > tfoot > tr > td.info, .table > thead > tr > th.info, .table > tbody > tr > th.info, .table > tfoot > tr > th.info, .table > thead > tr.info > td, .table > tbody > tr.info > td, .table > tfoot > tr.info > td, .table > thead > tr.info > th, .table > tbody > tr.info > th, .table > tfoot > tr.info > th { background-color: #d9edf7; } .table-hover > tbody > tr > td.info:hover, .table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th { background-color: #c4e3f3; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table-responsive { overflow-x: auto; min-height: 0.01%; } @media screen and (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 13.5px; overflow-y: hidden; -ms-overflow-style: -ms-autohiding-scrollbar; border: 1px solid #ddd; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; min-width: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 18px; font-size: 19.5px; line-height: inherit; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; max-width: 100%; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; line-height: normal; } input[type="file"] { display: block; } input[type="range"] { display: block; width: 100%; } select[multiple], select[size] { height: auto; } input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } output { display: block; padding-top: 7px; font-size: 13px; line-height: 1.42857143; color: #555555; } .form-control { display: block; width: 100%; height: 32px; padding: 6px 12px; font-size: 13px; line-height: 1.42857143; color: #555555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 2px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control::-moz-placeholder { color: #999; opacity: 1; } .form-control:-ms-input-placeholder { color: #999; } .form-control::-webkit-input-placeholder { color: #999; } .form-control::-ms-expand { border: 0; background-color: transparent; } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { background-color: #eeeeee; opacity: 1; } .form-control[disabled], fieldset[disabled] .form-control { cursor: not-allowed; } textarea.form-control { height: auto; } input[type="search"] { -webkit-appearance: none; } @media screen and (-webkit-min-device-pixel-ratio: 0) { input[type="date"].form-control, input[type="time"].form-control, input[type="datetime-local"].form-control, input[type="month"].form-control { line-height: 32px; } input[type="date"].input-sm, input[type="time"].input-sm, input[type="datetime-local"].input-sm, input[type="month"].input-sm, .input-group-sm input[type="date"], .input-group-sm input[type="time"], .input-group-sm input[type="datetime-local"], .input-group-sm input[type="month"] { line-height: 30px; } input[type="date"].input-lg, input[type="time"].input-lg, input[type="datetime-local"].input-lg, input[type="month"].input-lg, .input-group-lg input[type="date"], .input-group-lg input[type="time"], .input-group-lg input[type="datetime-local"], .input-group-lg input[type="month"] { line-height: 45px; } } .form-group { margin-bottom: 15px; } .radio, .checkbox { position: relative; display: block; margin-top: 10px; margin-bottom: 10px; } .radio label, .checkbox label { min-height: 18px; padding-left: 20px; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { position: absolute; margin-left: -20px; margin-top: 4px \9; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { position: relative; display: inline-block; padding-left: 20px; margin-bottom: 0; vertical-align: middle; font-weight: normal; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"].disabled, input[type="checkbox"].disabled, fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"] { cursor: not-allowed; } .radio-inline.disabled, .checkbox-inline.disabled, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .radio.disabled label, .checkbox.disabled label, fieldset[disabled] .radio label, fieldset[disabled] .checkbox label { cursor: not-allowed; } .form-control-static { padding-top: 7px; padding-bottom: 7px; margin-bottom: 0; min-height: 31px; } .form-control-static.input-lg, .form-control-static.input-sm { padding-left: 0; padding-right: 0; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm, select[multiple].input-sm { height: auto; } .form-group-sm .form-control { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; } .form-group-sm select.form-control { height: 30px; line-height: 30px; } .form-group-sm textarea.form-control, .form-group-sm select[multiple].form-control { height: auto; } .form-group-sm .form-control-static { height: 30px; min-height: 30px; padding: 6px 10px; font-size: 12px; line-height: 1.5; } .input-lg { height: 45px; padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 3px; } select.input-lg { height: 45px; line-height: 45px; } textarea.input-lg, select[multiple].input-lg { height: auto; } .form-group-lg .form-control { height: 45px; padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 3px; } .form-group-lg select.form-control { height: 45px; line-height: 45px; } .form-group-lg textarea.form-control, .form-group-lg select[multiple].form-control { height: auto; } .form-group-lg .form-control-static { height: 45px; min-height: 35px; padding: 11px 16px; font-size: 17px; line-height: 1.3333333; } .has-feedback { position: relative; } .has-feedback .form-control { padding-right: 40px; } .form-control-feedback { position: absolute; top: 0; right: 0; z-index: 2; display: block; width: 32px; height: 32px; line-height: 32px; text-align: center; pointer-events: none; } .input-lg + .form-control-feedback, .input-group-lg + .form-control-feedback, .form-group-lg .form-control + .form-control-feedback { width: 45px; height: 45px; line-height: 45px; } .input-sm + .form-control-feedback, .input-group-sm + .form-control-feedback, .form-group-sm .form-control + .form-control-feedback { width: 30px; height: 30px; line-height: 30px; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline, .has-success.radio label, .has-success.checkbox label, .has-success.radio-inline label, .has-success.checkbox-inline label { color: #3c763d; } .has-success .form-control { border-color: #3c763d; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #2b542c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168; } .has-success .input-group-addon { color: #3c763d; border-color: #3c763d; background-color: #dff0d8; } .has-success .form-control-feedback { color: #3c763d; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline, .has-warning.radio label, .has-warning.checkbox label, .has-warning.radio-inline label, .has-warning.checkbox-inline label { color: #8a6d3b; } .has-warning .form-control { border-color: #8a6d3b; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #66512c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b; } .has-warning .input-group-addon { color: #8a6d3b; border-color: #8a6d3b; background-color: #fcf8e3; } .has-warning .form-control-feedback { color: #8a6d3b; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline, .has-error.radio label, .has-error.checkbox label, .has-error.radio-inline label, .has-error.checkbox-inline label { color: #a94442; } .has-error .form-control { border-color: #a94442; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #843534; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483; } .has-error .input-group-addon { color: #a94442; border-color: #a94442; background-color: #f2dede; } .has-error .form-control-feedback { color: #a94442; } .has-feedback label ~ .form-control-feedback { top: 23px; } .has-feedback label.sr-only ~ .form-control-feedback { top: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #404040; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; width: auto; vertical-align: middle; } .form-inline .form-control-static { display: inline-block; } .form-inline .input-group { display: inline-table; vertical-align: middle; } .form-inline .input-group .input-group-addon, .form-inline .input-group .input-group-btn, .form-inline .input-group .form-control { width: auto; } .form-inline .input-group > .form-control { width: 100%; } .form-inline .control-label { margin-bottom: 0; vertical-align: middle; } .form-inline .radio, .form-inline .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .form-inline .radio label, .form-inline .checkbox label { padding-left: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .form-inline .has-feedback .form-control-feedback { top: 0; } } .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { margin-top: 0; margin-bottom: 0; padding-top: 7px; } .form-horizontal .radio, .form-horizontal .checkbox { min-height: 25px; } .form-horizontal .form-group { margin-left: 0px; margin-right: 0px; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; margin-bottom: 0; padding-top: 7px; } } .form-horizontal .has-feedback .form-control-feedback { right: 0px; } @media (min-width: 768px) { .form-horizontal .form-group-lg .control-label { padding-top: 11px; font-size: 17px; } } @media (min-width: 768px) { .form-horizontal .form-group-sm .control-label { padding-top: 6px; font-size: 12px; } } .btn { display: inline-block; margin-bottom: 0; font-weight: normal; text-align: center; vertical-align: middle; touch-action: manipulation; cursor: pointer; background-image: none; border: 1px solid transparent; white-space: nowrap; padding: 6px 12px; font-size: 13px; line-height: 1.42857143; border-radius: 2px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } .btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus { outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus, .btn.focus { color: #333; text-decoration: none; } .btn:active, .btn.active { outline: 0; background-image: none; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { cursor: not-allowed; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } a.btn.disabled, fieldset[disabled] a.btn { pointer-events: none; } .btn-default { color: #333; background-color: #fff; border-color: #ccc; } .btn-default:focus, .btn-default.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .btn-default:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { color: #333; background-color: #e6e6e6; border-color: #adadad; } .btn-default:active:hover, .btn-default.active:hover, .open > .dropdown-toggle.btn-default:hover, .btn-default:active:focus, .btn-default.active:focus, .open > .dropdown-toggle.btn-default:focus, .btn-default:active.focus, .btn-default.active.focus, .open > .dropdown-toggle.btn-default.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .btn-default:active, .btn-default.active, .open > .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled.focus, .btn-default[disabled].focus, fieldset[disabled] .btn-default.focus { background-color: #fff; border-color: #ccc; } .btn-default .badge { color: #fff; background-color: #333; } .btn-primary { color: #fff; background-color: #337ab7; border-color: #2e6da4; } .btn-primary:focus, .btn-primary.focus { color: #fff; background-color: #286090; border-color: #122b40; } .btn-primary:hover { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { color: #fff; background-color: #286090; border-color: #204d74; } .btn-primary:active:hover, .btn-primary.active:hover, .open > .dropdown-toggle.btn-primary:hover, .btn-primary:active:focus, .btn-primary.active:focus, .open > .dropdown-toggle.btn-primary:focus, .btn-primary:active.focus, .btn-primary.active.focus, .open > .dropdown-toggle.btn-primary.focus { color: #fff; background-color: #204d74; border-color: #122b40; } .btn-primary:active, .btn-primary.active, .open > .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled.focus, .btn-primary[disabled].focus, fieldset[disabled] .btn-primary.focus { background-color: #337ab7; border-color: #2e6da4; } .btn-primary .badge { color: #337ab7; background-color: #fff; } .btn-success { color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:focus, .btn-success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .btn-success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { color: #fff; background-color: #449d44; border-color: #398439; } .btn-success:active:hover, .btn-success.active:hover, .open > .dropdown-toggle.btn-success:hover, .btn-success:active:focus, .btn-success.active:focus, .open > .dropdown-toggle.btn-success:focus, .btn-success:active.focus, .btn-success.active.focus, .open > .dropdown-toggle.btn-success.focus { color: #fff; background-color: #398439; border-color: #255625; } .btn-success:active, .btn-success.active, .open > .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled.focus, .btn-success[disabled].focus, fieldset[disabled] .btn-success.focus { background-color: #5cb85c; border-color: #4cae4c; } .btn-success .badge { color: #5cb85c; background-color: #fff; } .btn-info { color: #fff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:focus, .btn-info.focus { color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .btn-info:hover { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { color: #fff; background-color: #31b0d5; border-color: #269abc; } .btn-info:active:hover, .btn-info.active:hover, .open > .dropdown-toggle.btn-info:hover, .btn-info:active:focus, .btn-info.active:focus, .open > .dropdown-toggle.btn-info:focus, .btn-info:active.focus, .btn-info.active.focus, .open > .dropdown-toggle.btn-info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .btn-info:active, .btn-info.active, .open > .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled.focus, .btn-info[disabled].focus, fieldset[disabled] .btn-info.focus { background-color: #5bc0de; border-color: #46b8da; } .btn-info .badge { color: #5bc0de; background-color: #fff; } .btn-warning { color: #fff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:focus, .btn-warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .btn-warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { color: #fff; background-color: #ec971f; border-color: #d58512; } .btn-warning:active:hover, .btn-warning.active:hover, .open > .dropdown-toggle.btn-warning:hover, .btn-warning:active:focus, .btn-warning.active:focus, .open > .dropdown-toggle.btn-warning:focus, .btn-warning:active.focus, .btn-warning.active.focus, .open > .dropdown-toggle.btn-warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .btn-warning:active, .btn-warning.active, .open > .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled.focus, .btn-warning[disabled].focus, fieldset[disabled] .btn-warning.focus { background-color: #f0ad4e; border-color: #eea236; } .btn-warning .badge { color: #f0ad4e; background-color: #fff; } .btn-danger { color: #fff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:focus, .btn-danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .btn-danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { color: #fff; background-color: #c9302c; border-color: #ac2925; } .btn-danger:active:hover, .btn-danger.active:hover, .open > .dropdown-toggle.btn-danger:hover, .btn-danger:active:focus, .btn-danger.active:focus, .open > .dropdown-toggle.btn-danger:focus, .btn-danger:active.focus, .btn-danger.active.focus, .open > .dropdown-toggle.btn-danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .btn-danger:active, .btn-danger.active, .open > .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled.focus, .btn-danger[disabled].focus, fieldset[disabled] .btn-danger.focus { background-color: #d9534f; border-color: #d43f3a; } .btn-danger .badge { color: #d9534f; background-color: #fff; } .btn-link { color: #337ab7; font-weight: normal; border-radius: 0; } .btn-link, .btn-link:active, .btn-link.active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #23527c; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #777777; text-decoration: none; } .btn-lg, .btn-group-lg > .btn { padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 3px; } .btn-sm, .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; } .btn-xs, .btn-group-xs > .btn { padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 1px; } .btn-block { display: block; width: 100%; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; -o-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } tr.collapse.in { display: table-row; } tbody.collapse.in { display: table-row-group; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition-property: height, visibility; transition-property: height, visibility; -webkit-transition-duration: 0.35s; transition-duration: 0.35s; -webkit-transition-timing-function: ease; transition-timing-function: ease; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px dashed; border-top: 4px solid \9; border-right: 4px solid transparent; border-left: 4px solid transparent; } .dropup, .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; list-style: none; font-size: 13px; text-align: left; background-color: #fff; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 2px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 8px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.42857143; color: #333333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { text-decoration: none; color: #262626; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #fff; text-decoration: none; outline: 0; background-color: #337ab7; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #777777; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); cursor: not-allowed; } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-menu-right { left: auto; right: 0; } .dropdown-menu-left { left: 0; right: auto; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.42857143; color: #777777; white-space: nowrap; } .dropdown-backdrop { position: fixed; left: 0; right: 0; bottom: 0; top: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0; border-bottom: 4px dashed; border-bottom: 4px solid \9; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 2px; } @media (min-width: 541px) { .navbar-right .dropdown-menu { left: auto; right: 0; } .navbar-right .dropdown-menu-left { left: 0; right: auto; } } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar { margin-left: -5px; } .btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { float: left; } .btn-toolbar > .btn, .btn-toolbar > .btn-group, .btn-toolbar > .input-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-top-right-radius: 0; } .btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-left: 8px; padding-right: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-left: 12px; padding-right: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group, .btn-group-vertical > .btn-group > .btn { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 2px; border-top-left-radius: 2px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-right-radius: 0; border-top-left-radius: 0; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, .btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; table-layout: fixed; border-collapse: separate; } .btn-group-justified > .btn, .btn-group-justified > .btn-group { float: none; display: table-cell; width: 1%; } .btn-group-justified > .btn-group .btn { width: 100%; } .btn-group-justified > .btn-group .dropdown-menu { left: auto; } [data-toggle="buttons"] > .btn input[type="radio"], [data-toggle="buttons"] > .btn-group > .btn input[type="radio"], [data-toggle="buttons"] > .btn input[type="checkbox"], [data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { position: absolute; clip: rect(0, 0, 0, 0); pointer-events: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group[class*="col-"] { float: none; padding-left: 0; padding-right: 0; } .input-group .form-control { position: relative; z-index: 2; float: left; width: 100%; margin-bottom: 0; } .input-group .form-control:focus { z-index: 3; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 45px; padding: 10px 16px; font-size: 17px; line-height: 1.3333333; border-radius: 3px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 45px; line-height: 45px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn, select[multiple].input-group-lg > .form-control, select[multiple].input-group-lg > .input-group-addon, select[multiple].input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn, select[multiple].input-group-sm > .form-control, select[multiple].input-group-sm > .input-group-addon, select[multiple].input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 13px; font-weight: normal; line-height: 1; color: #555555; text-align: center; background-color: #eeeeee; border: 1px solid #ccc; border-radius: 2px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 1px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 17px; border-radius: 3px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), .input-group-btn:last-child > .btn-group:not(:last-child) > .btn { border-bottom-right-radius: 0; border-top-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child), .input-group-btn:first-child > .btn-group:not(:first-child) > .btn { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; font-size: 0; white-space: nowrap; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -1px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:focus, .input-group-btn > .btn:active { z-index: 2; } .input-group-btn:first-child > .btn, .input-group-btn:first-child > .btn-group { margin-right: -1px; } .input-group-btn:last-child > .btn, .input-group-btn:last-child > .btn-group { z-index: 2; margin-left: -1px; } .nav { margin-bottom: 0; padding-left: 0; list-style: none; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eeeeee; } .nav > li.disabled > a { color: #777777; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #777777; text-decoration: none; background-color: transparent; cursor: not-allowed; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eeeeee; border-color: #337ab7; } .nav .nav-divider { height: 1px; margin: 8px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #ddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.42857143; border: 1px solid transparent; border-radius: 2px 2px 0 0; } .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #ddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; background-color: #fff; border: 1px solid #ddd; border-bottom-color: transparent; cursor: default; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 2px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 2px 2px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #fff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 2px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #fff; background-color: #337ab7; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { text-align: center; margin-bottom: 5px; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 2px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #ddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #ddd; border-radius: 2px 2px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #fff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; min-height: 30px; margin-bottom: 18px; border: 1px solid transparent; } @media (min-width: 541px) { .navbar { border-radius: 2px; } } @media (min-width: 541px) { .navbar-header { float: left; } } .navbar-collapse { overflow-x: visible; padding-right: 0px; padding-left: 0px; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 541px) { .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: visible; } .navbar-fixed-top .navbar-collapse, .navbar-static-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { padding-left: 0; padding-right: 0; } } .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 340px; } @media (max-device-width: 540px) and (orientation: landscape) { .navbar-fixed-top .navbar-collapse, .navbar-fixed-bottom .navbar-collapse { max-height: 200px; } } .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0px; margin-left: 0px; } @media (min-width: 541px) { .container > .navbar-header, .container-fluid > .navbar-header, .container > .navbar-collapse, .container-fluid > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 541px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 541px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; padding: 6px 0px; font-size: 17px; line-height: 18px; height: 30px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } .navbar-brand > img { display: block; } @media (min-width: 541px) { .navbar > .container .navbar-brand, .navbar > .container-fluid .navbar-brand { margin-left: 0px; } } .navbar-toggle { position: relative; float: right; margin-right: 0px; padding: 9px 10px; margin-top: -2px; margin-bottom: -2px; background-color: transparent; background-image: none; border: 1px solid transparent; border-radius: 2px; } .navbar-toggle:focus { outline: 0; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 541px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 3px 0px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 18px; } @media (max-width: 540px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 18px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 541px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 6px; padding-bottom: 6px; } } .navbar-form { margin-left: 0px; margin-right: 0px; padding: 10px 0px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); margin-top: -1px; margin-bottom: -1px; } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; width: auto; vertical-align: middle; } .navbar-form .form-control-static { display: inline-block; } .navbar-form .input-group { display: inline-table; vertical-align: middle; } .navbar-form .input-group .input-group-addon, .navbar-form .input-group .input-group-btn, .navbar-form .input-group .form-control { width: auto; } .navbar-form .input-group > .form-control { width: 100%; } .navbar-form .control-label { margin-bottom: 0; vertical-align: middle; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; margin-top: 0; margin-bottom: 0; vertical-align: middle; } .navbar-form .radio label, .navbar-form .checkbox label { padding-left: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { position: relative; margin-left: 0; } .navbar-form .has-feedback .form-control-feedback { top: 0; } } @media (max-width: 540px) { .navbar-form .form-group { margin-bottom: 5px; } .navbar-form .form-group:last-child { margin-bottom: 0; } } @media (min-width: 541px) { .navbar-form { width: auto; border: 0; margin-left: 0; margin-right: 0; padding-top: 0; padding-bottom: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { margin-bottom: 0; border-top-right-radius: 2px; border-top-left-radius: 2px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-btn { margin-top: -1px; margin-bottom: -1px; } .navbar-btn.btn-sm { margin-top: 0px; margin-bottom: 0px; } .navbar-btn.btn-xs { margin-top: 4px; margin-bottom: 4px; } .navbar-text { margin-top: 6px; margin-bottom: 6px; } @media (min-width: 541px) { .navbar-text { float: left; margin-left: 0px; margin-right: 0px; } } @media (min-width: 541px) { .navbar-left { float: left !important; float: left; } .navbar-right { float: right !important; float: right; margin-right: 0px; } .navbar-right ~ .navbar-right { margin-right: 0; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777; } .navbar-default .navbar-nav > li > a { color: #777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #ccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #ddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #ddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #888; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { background-color: #e7e7e7; color: #555; } @media (max-width: 540px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #ccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777; } .navbar-default .navbar-link:hover { color: #333; } .navbar-default .btn-link { color: #777; } .navbar-default .btn-link:hover, .navbar-default .btn-link:focus { color: #333; } .navbar-default .btn-link[disabled]:hover, fieldset[disabled] .navbar-default .btn-link:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:focus { color: #ccc; } .navbar-inverse { background-color: #222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #9d9d9d; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-text { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #fff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { background-color: #080808; color: #fff; } @media (max-width: 540px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu .divider { background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #9d9d9d; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #fff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #fff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #9d9d9d; } .navbar-inverse .navbar-link:hover { color: #fff; } .navbar-inverse .btn-link { color: #9d9d9d; } .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus { color: #fff; } .navbar-inverse .btn-link[disabled]:hover, fieldset[disabled] .navbar-inverse .btn-link:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:focus { color: #444; } .breadcrumb { padding: 8px 15px; margin-bottom: 18px; list-style: none; background-color: #f5f5f5; border-radius: 2px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { content: "/\00a0"; padding: 0 5px; color: #5e5e5e; } .breadcrumb > .active { color: #777777; } .pagination { display: inline-block; padding-left: 0; margin: 18px 0; border-radius: 2px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; line-height: 1.42857143; text-decoration: none; color: #337ab7; background-color: #fff; border: 1px solid #ddd; margin-left: -1px; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 2px; border-top-left-radius: 2px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-bottom-right-radius: 2px; border-top-right-radius: 2px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { z-index: 2; color: #23527c; background-color: #eeeeee; border-color: #ddd; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 3; color: #fff; background-color: #337ab7; border-color: #337ab7; cursor: default; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #777777; background-color: #fff; border-color: #ddd; cursor: not-allowed; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 17px; line-height: 1.3333333; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-bottom-right-radius: 3px; border-top-right-radius: 3px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; line-height: 1.5; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 1px; border-top-left-radius: 1px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-bottom-right-radius: 1px; border-top-right-radius: 1px; } .pager { padding-left: 0; margin: 18px 0; list-style: none; text-align: center; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eeeeee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #777777; background-color: #fff; cursor: not-allowed; } .label { display: inline; padding: 0.2em 0.6em 0.3em; font-size: 75%; font-weight: bold; line-height: 1; color: #fff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: 0.25em; } a.label:hover, a.label:focus { color: #fff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .btn .label { position: relative; top: -1px; } .label-default { background-color: #777777; } .label-default[href]:hover, .label-default[href]:focus { background-color: #5e5e5e; } .label-primary { background-color: #337ab7; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #286090; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; color: #fff; line-height: 1; vertical-align: middle; white-space: nowrap; text-align: center; background-color: #777777; border-radius: 10px; } .badge:empty { display: none; } .btn .badge { position: relative; top: -1px; } .btn-xs .badge, .btn-group-xs > .btn .badge { top: 0; padding: 1px 5px; } a.badge:hover, a.badge:focus { color: #fff; text-decoration: none; cursor: pointer; } .list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #337ab7; background-color: #fff; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding-top: 30px; padding-bottom: 30px; margin-bottom: 30px; color: inherit; background-color: #eeeeee; } .jumbotron h1, .jumbotron .h1 { color: inherit; } .jumbotron p { margin-bottom: 15px; font-size: 20px; font-weight: 200; } .jumbotron > hr { border-top-color: #d5d5d5; } .container .jumbotron, .container-fluid .jumbotron { border-radius: 3px; padding-left: 0px; padding-right: 0px; } .jumbotron .container { max-width: 100%; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron, .container-fluid .jumbotron { padding-left: 60px; padding-right: 60px; } .jumbotron h1, .jumbotron .h1 { font-size: 59px; } } .thumbnail { display: block; padding: 4px; margin-bottom: 18px; line-height: 1.42857143; background-color: #fff; border: 1px solid #ddd; border-radius: 2px; -webkit-transition: border 0.2s ease-in-out; -o-transition: border 0.2s ease-in-out; transition: border 0.2s ease-in-out; } .thumbnail > img, .thumbnail a > img { margin-left: auto; margin-right: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #337ab7; } .thumbnail .caption { padding: 9px; color: #000; } .alert { padding: 15px; margin-bottom: 18px; border: 1px solid transparent; border-radius: 2px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable, .alert-dismissible { padding-right: 35px; } .alert-dismissable .close, .alert-dismissible .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { background-color: #dff0d8; border-color: #d6e9c6; color: #3c763d; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #2b542c; } .alert-info { background-color: #d9edf7; border-color: #bce8f1; color: #31708f; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #245269; } .alert-warning { background-color: #fcf8e3; border-color: #faebcc; color: #8a6d3b; } .alert-warning hr { border-top-color: #f7e1b5; } .alert-warning .alert-link { color: #66512c; } .alert-danger { background-color: #f2dede; border-color: #ebccd1; color: #a94442; } .alert-danger hr { border-top-color: #e4b9c0; } .alert-danger .alert-link { color: #843534; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { overflow: hidden; height: 18px; margin-bottom: 18px; background-color: #f5f5f5; border-radius: 2px; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); } .progress-bar { float: left; width: 0%; height: 100%; font-size: 12px; line-height: 18px; color: #fff; text-align: center; background-color: #337ab7; -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-transition: width 0.6s ease; -o-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar, .progress-bar-striped { background-image: -webkit-linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-image: -o-linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-image: linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-size: 40px 40px; } .progress.active .progress-bar, .progress-bar.active { -webkit-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { background-image: -webkit-linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-image: -o-linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-image: linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); } .progress-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { background-image: -webkit-linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-image: -o-linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-image: linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); } .progress-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { background-image: -webkit-linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-image: -o-linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-image: linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); } .progress-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { background-image: -webkit-linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-image: -o-linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); background-image: linear-gradient( 45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent ); } .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media, .media-body { zoom: 1; overflow: hidden; } .media-body { width: 10000px; } .media-object { display: block; } .media-object.img-thumbnail { max-width: none; } .media-right, .media > .pull-right { padding-left: 10px; } .media-left, .media > .pull-left { padding-right: 10px; } .media-left, .media-right, .media-body { display: table-cell; vertical-align: top; } .media-middle { vertical-align: middle; } .media-bottom { vertical-align: bottom; } .media-heading { margin-top: 0; margin-bottom: 5px; } .media-list { padding-left: 0; list-style: none; } .list-group { margin-bottom: 20px; padding-left: 0; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #fff; border: 1px solid #ddd; } .list-group-item:first-child { border-top-right-radius: 2px; border-top-left-radius: 2px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; } a.list-group-item, button.list-group-item { color: #555; } a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading { color: #333; } a.list-group-item:hover, button.list-group-item:hover, a.list-group-item:focus, button.list-group-item:focus { text-decoration: none; color: #555; background-color: #f5f5f5; } button.list-group-item { width: 100%; text-align: left; } .list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus { background-color: #eeeeee; color: #777777; cursor: not-allowed; } .list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:hover .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading { color: inherit; } .list-group-item.disabled .list-group-item-text, .list-group-item.disabled:hover .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text { color: #777777; } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { z-index: 2; color: #fff; background-color: #337ab7; border-color: #337ab7; } .list-group-item.active .list-group-item-heading, .list-group-item.active:hover .list-group-item-heading, .list-group-item.active:focus .list-group-item-heading, .list-group-item.active .list-group-item-heading > small, .list-group-item.active:hover .list-group-item-heading > small, .list-group-item.active:focus .list-group-item-heading > small, .list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading > .small { color: inherit; } .list-group-item.active .list-group-item-text, .list-group-item.active:hover .list-group-item-text, .list-group-item.active:focus .list-group-item-text { color: #c7ddef; } .list-group-item-success { color: #3c763d; background-color: #dff0d8; } a.list-group-item-success, button.list-group-item-success { color: #3c763d; } a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading { color: inherit; } a.list-group-item-success:hover, button.list-group-item-success:hover, a.list-group-item-success:focus, button.list-group-item-success:focus { color: #3c763d; background-color: #d0e9c6; } a.list-group-item-success.active, button.list-group-item-success.active, a.list-group-item-success.active:hover, button.list-group-item-success.active:hover, a.list-group-item-success.active:focus, button.list-group-item-success.active:focus { color: #fff; background-color: #3c763d; border-color: #3c763d; } .list-group-item-info { color: #31708f; background-color: #d9edf7; } a.list-group-item-info, button.list-group-item-info { color: #31708f; } a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading { color: inherit; } a.list-group-item-info:hover, button.list-group-item-info:hover, a.list-group-item-info:focus, button.list-group-item-info:focus { color: #31708f; background-color: #c4e3f3; } a.list-group-item-info.active, button.list-group-item-info.active, a.list-group-item-info.active:hover, button.list-group-item-info.active:hover, a.list-group-item-info.active:focus, button.list-group-item-info.active:focus { color: #fff; background-color: #31708f; border-color: #31708f; } .list-group-item-warning { color: #8a6d3b; background-color: #fcf8e3; } a.list-group-item-warning, button.list-group-item-warning { color: #8a6d3b; } a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading { color: inherit; } a.list-group-item-warning:hover, button.list-group-item-warning:hover, a.list-group-item-warning:focus, button.list-group-item-warning:focus { color: #8a6d3b; background-color: #faf2cc; } a.list-group-item-warning.active, button.list-group-item-warning.active, a.list-group-item-warning.active:hover, button.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus, button.list-group-item-warning.active:focus { color: #fff; background-color: #8a6d3b; border-color: #8a6d3b; } .list-group-item-danger { color: #a94442; background-color: #f2dede; } a.list-group-item-danger, button.list-group-item-danger { color: #a94442; } a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading { color: inherit; } a.list-group-item-danger:hover, button.list-group-item-danger:hover, a.list-group-item-danger:focus, button.list-group-item-danger:focus { color: #a94442; background-color: #ebcccc; } a.list-group-item-danger.active, button.list-group-item-danger.active, a.list-group-item-danger.active:hover, button.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus, button.list-group-item-danger.active:focus { color: #fff; background-color: #a94442; border-color: #a94442; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 18px; background-color: #fff; border: 1px solid transparent; border-radius: 2px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 1px; border-top-left-radius: 1px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 15px; color: inherit; } .panel-title > a, .panel-title > small, .panel-title > .small, .panel-title > small > a, .panel-title > .small > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #ddd; border-bottom-right-radius: 1px; border-bottom-left-radius: 1px; } .panel > .list-group, .panel > .panel-collapse > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item, .panel > .panel-collapse > .list-group .list-group-item { border-width: 1px 0; border-radius: 0; } .panel > .list-group:first-child .list-group-item:first-child, .panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { border-top: 0; border-top-right-radius: 1px; border-top-left-radius: 1px; } .panel > .list-group:last-child .list-group-item:last-child, .panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { border-bottom: 0; border-bottom-right-radius: 1px; border-bottom-left-radius: 1px; } .panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .list-group + .panel-footer { border-top-width: 0; } .panel > .table, .panel > .table-responsive > .table, .panel > .panel-collapse > .table { margin-bottom: 0; } .panel > .table caption, .panel > .table-responsive > .table caption, .panel > .panel-collapse > .table caption { padding-left: 15px; padding-right: 15px; } .panel > .table:first-child, .panel > .table-responsive:first-child > .table:first-child { border-top-right-radius: 1px; border-top-left-radius: 1px; } .panel > .table:first-child > thead:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { border-top-left-radius: 1px; border-top-right-radius: 1px; } .panel > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, .panel > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { border-top-left-radius: 1px; } .panel > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, .panel > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, .panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, .panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { border-top-right-radius: 1px; } .panel > .table:last-child, .panel > .table-responsive:last-child > .table:last-child { border-bottom-right-radius: 1px; border-bottom-left-radius: 1px; } .panel > .table:last-child > tbody:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { border-bottom-left-radius: 1px; border-bottom-right-radius: 1px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { border-bottom-left-radius: 1px; } .panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, .panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, .panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, .panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { border-bottom-right-radius: 1px; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive, .panel > .table + .panel-body, .panel > .table-responsive + .panel-body { border-top: 1px solid #ddd; } .panel > .table > tbody:first-child > tr:first-child th, .panel > .table > tbody:first-child > tr:first-child td { border-top: 0; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:first-child > td, .panel > .table-responsive > .table-bordered > thead > tr:first-child > td, .panel > .table-bordered > tbody > tr:first-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, .panel > .table-bordered > thead > tr:first-child > th, .panel > .table-responsive > .table-bordered > thead > tr:first-child > th, .panel > .table-bordered > tbody > tr:first-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { border-bottom: 0; } .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { border-bottom: 0; } .panel > .table-responsive { border: 0; margin-bottom: 0; } .panel-group { margin-bottom: 18px; } .panel-group .panel { margin-bottom: 0; border-radius: 2px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse > .panel-body, .panel-group .panel-heading + .panel-collapse > .list-group { border-top: 1px solid #ddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #ddd; } .panel-default { border-color: #ddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; border-color: #ddd; } .panel-default > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ddd; } .panel-default > .panel-heading .badge { color: #f5f5f5; background-color: #333333; } .panel-default > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ddd; } .panel-primary { border-color: #337ab7; } .panel-primary > .panel-heading { color: #fff; background-color: #337ab7; border-color: #337ab7; } .panel-primary > .panel-heading + .panel-collapse > .panel-body { border-top-color: #337ab7; } .panel-primary > .panel-heading .badge { color: #337ab7; background-color: #fff; } .panel-primary > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #337ab7; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #3c763d; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse > .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading .badge { color: #dff0d8; background-color: #3c763d; } .panel-success > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #d6e9c6; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #31708f; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse > .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading .badge { color: #d9edf7; background-color: #31708f; } .panel-info > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #bce8f1; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #8a6d3b; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse > .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading .badge { color: #fcf8e3; background-color: #8a6d3b; } .panel-warning > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #a94442; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse > .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading .badge { color: #f2dede; background-color: #a94442; } .panel-danger > .panel-footer + .panel-collapse > .panel-body { border-bottom-color: #ebccd1; } .embed-responsive { position: relative; display: block; height: 0; padding: 0; overflow: hidden; } .embed-responsive .embed-responsive-item, .embed-responsive iframe, .embed-responsive embed, .embed-responsive object, .embed-responsive video { position: absolute; top: 0; left: 0; bottom: 0; height: 100%; width: 100%; border: 0; } .embed-responsive-16by9 { padding-bottom: 56.25%; } .embed-responsive-4by3 { padding-bottom: 75%; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 2px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-lg { padding: 24px; border-radius: 3px; } .well-sm { padding: 9px; border-radius: 1px; } .close { float: right; font-size: 19.5px; font-weight: bold; line-height: 1; color: #000; text-shadow: 0 1px 0 #fff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } .modal { display: none; overflow: hidden; position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1050; -webkit-overflow-scrolling: touch; outline: 0; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); -o-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } .modal-open .modal { overflow-x: hidden; overflow-y: auto; } .modal-dialog { position: relative; width: auto; margin: 10px; } .modal-content { position: relative; background-color: #fff; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 3px; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; outline: 0; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.42857143; } .modal-body { position: relative; padding: 15px; } .modal-footer { padding: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .modal-scrollbar-measure { position: absolute; top: -9999px; width: 50px; height: 50px; overflow: scroll; } @media (min-width: 768px) { .modal-dialog { width: 600px; margin: 30px auto; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } .modal-sm { width: 300px; } } @media (min-width: 992px) { .modal-lg { width: 900px; } } .tooltip { position: absolute; z-index: 1070; display: block; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-style: normal; font-weight: normal; letter-spacing: normal; line-break: auto; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; white-space: normal; word-break: normal; word-spacing: normal; word-wrap: normal; font-size: 12px; opacity: 0; filter: alpha(opacity=0); } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { margin-top: -3px; padding: 5px 0; } .tooltip.right { margin-left: 3px; padding: 0 5px; } .tooltip.bottom { margin-top: 3px; padding: 5px 0; } .tooltip.left { margin-left: -3px; padding: 0 5px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #fff; text-align: center; background-color: #000; border-radius: 2px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-left .tooltip-arrow { bottom: 0; right: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.top-right .tooltip-arrow { bottom: 0; left: 5px; margin-bottom: -5px; border-width: 5px 5px 0; border-top-color: #000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-left .tooltip-arrow { top: 0; right: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .tooltip.bottom-right .tooltip-arrow { top: 0; left: 5px; margin-top: -5px; border-width: 0 5px 5px; border-bottom-color: #000; } .popover { position: absolute; top: 0; left: 0; z-index: 1060; display: none; max-width: 276px; padding: 1px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-style: normal; font-weight: normal; letter-spacing: normal; line-break: auto; line-height: 1.42857143; text-align: left; text-align: start; text-decoration: none; text-shadow: none; text-transform: none; white-space: normal; word-break: normal; word-spacing: normal; word-wrap: normal; font-size: 13px; background-color: #fff; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 3px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { margin: 0; padding: 8px 14px; font-size: 13px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; border-radius: 2px 2px 0 0; } .popover-content { padding: 9px 14px; } .popover > .arrow, .popover > .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover > .arrow { border-width: 11px; } .popover > .arrow:after { border-width: 10px; content: ""; } .popover.top > .arrow { left: 50%; margin-left: -11px; border-bottom-width: 0; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); bottom: -11px; } .popover.top > .arrow:after { content: " "; bottom: 1px; margin-left: -10px; border-bottom-width: 0; border-top-color: #fff; } .popover.right > .arrow { top: 50%; left: -11px; margin-top: -11px; border-left-width: 0; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); } .popover.right > .arrow:after { content: " "; left: 1px; bottom: -10px; border-left-width: 0; border-right-color: #fff; } .popover.bottom > .arrow { left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); top: -11px; } .popover.bottom > .arrow:after { content: " "; top: 1px; margin-left: -10px; border-top-width: 0; border-bottom-color: #fff; } .popover.left > .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); } .popover.left > .arrow:after { content: " "; right: 1px; border-right-width: 0; border-left-color: #fff; bottom: -10px; } .carousel { position: relative; } .carousel-inner { position: relative; overflow: hidden; width: 100%; } .carousel-inner > .item { display: none; position: relative; -webkit-transition: 0.6s ease-in-out left; -o-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { line-height: 1; } @media all and (transform-3d), (-webkit-transform-3d) { .carousel-inner > .item { -webkit-transition: -webkit-transform 0.6s ease-in-out; -moz-transition: -moz-transform 0.6s ease-in-out; -o-transition: -o-transform 0.6s ease-in-out; transition: transform 0.6s ease-in-out; -webkit-backface-visibility: hidden; -moz-backface-visibility: hidden; backface-visibility: hidden; -webkit-perspective: 1000px; -moz-perspective: 1000px; perspective: 1000px; } .carousel-inner > .item.next, .carousel-inner > .item.active.right { -webkit-transform: translate3d(100%, 0, 0); transform: translate3d(100%, 0, 0); left: 0; } .carousel-inner > .item.prev, .carousel-inner > .item.active.left { -webkit-transform: translate3d(-100%, 0, 0); transform: translate3d(-100%, 0, 0); left: 0; } .carousel-inner > .item.next.left, .carousel-inner > .item.prev.right, .carousel-inner > .item.active { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); left: 0; } } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; left: 0; bottom: 0; width: 15%; opacity: 0.5; filter: alpha(opacity=50); font-size: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); background-color: rgba(0, 0, 0, 0); } .carousel-control.left { background-image: -webkit-linear-gradient( left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100% ); background-image: -o-linear-gradient( left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100% ); background-image: linear-gradient( to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100% ); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { left: auto; right: 0; background-image: -webkit-linear-gradient( left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100% ); background-image: -o-linear-gradient( left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100% ); background-image: linear-gradient( to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100% ); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { outline: 0; color: #fff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; margin-top: -10px; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; margin-left: -10px; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; margin-right: -10px; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; line-height: 1; font-family: serif; } .carousel-control .icon-prev:before { content: "\2039"; } .carousel-control .icon-next:before { content: "\203a"; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; margin-left: -30%; padding-left: 0; list-style: none; text-align: center; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; border: 1px solid #fff; border-radius: 10px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); } .carousel-indicators .active { margin: 0; width: 12px; height: 12px; background-color: #fff; } .carousel-caption { position: absolute; left: 15%; right: 15%; bottom: 20px; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #fff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -10px; font-size: 30px; } .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev { margin-left: -10px; } .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next { margin-right: -10px; } .carousel-caption { left: 20%; right: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after, .dl-horizontal dd:before, .dl-horizontal dd:after, .container:before, .container:after, .container-fluid:before, .container-fluid:after, .row:before, .row:after, .form-horizontal .form-group:before, .form-horizontal .form-group:after, .btn-toolbar:before, .btn-toolbar:after, .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after, .nav:before, .nav:after, .navbar:before, .navbar:after, .navbar-header:before, .navbar-header:after, .navbar-collapse:before, .navbar-collapse:after, .pager:before, .pager:after, .panel-body:before, .panel-body:after, .modal-header:before, .modal-header:after, .modal-footer:before, .modal-footer:after, .item_buttons:before, .item_buttons:after { content: " "; display: table; } .clearfix:after, .dl-horizontal dd:after, .container:after, .container-fluid:after, .row:after, .form-horizontal .form-group:after, .btn-toolbar:after, .btn-group-vertical > .btn-group:after, .nav:after, .navbar:after, .navbar-header:after, .navbar-collapse:after, .pager:after, .panel-body:after, .modal-header:after, .modal-footer:after, .item_buttons:after { clear: both; } .center-block { display: block; margin-left: auto; margin-right: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, .visible-sm, .visible-md, .visible-lg { display: none !important; } .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block, .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, .visible-md-block, .visible-md-inline, .visible-md-inline-block, .visible-lg-block, .visible-lg-inline, .visible-lg-inline-block { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } table.visible-xs { display: table !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (max-width: 767px) { .visible-xs-block { display: block !important; } } @media (max-width: 767px) { .visible-xs-inline { display: inline !important; } } @media (max-width: 767px) { .visible-xs-inline-block { display: inline-block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } table.visible-sm { display: table !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-block { display: block !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline { display: inline !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm-inline-block { display: inline-block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } table.visible-md { display: table !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-block { display: block !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline { display: inline !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md-inline-block { display: inline-block !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } table.visible-lg { display: table !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg-block { display: block !important; } } @media (min-width: 1200px) { .visible-lg-inline { display: inline !important; } } @media (min-width: 1200px) { .visible-lg-inline-block { display: inline-block !important; } } @media (max-width: 767px) { .hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: block !important; } table.visible-print { display: table !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } } .visible-print-block { display: none !important; } @media print { .visible-print-block { display: block !important; } } .visible-print-inline { display: none !important; } @media print { .visible-print-inline { display: inline !important; } } .visible-print-inline-block { display: none !important; } @media print { .visible-print-inline-block { display: inline-block !important; } } @media print { .hidden-print { display: none !important; } } /*! * * Font Awesome * */ /*! * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) */ /* FONT PATH * -------------------------- */ @font-face { font-family: "FontAwesome"; src: url("../components/font-awesome/fonts/fontawesome-webfont.eot?v=4.7.0"); src: url("../components/font-awesome/fonts/fontawesome-webfont.eot?#iefix&v=4.7.0") format("embedded-opentype"), url("../components/font-awesome/fonts/fontawesome-webfont.woff2?v=4.7.0") format("woff2"), url("../components/font-awesome/fonts/fontawesome-webfont.woff?v=4.7.0") format("woff"), url("../components/font-awesome/fonts/fontawesome-webfont.ttf?v=4.7.0") format("truetype"), url("../components/font-awesome/fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular") format("svg"); font-weight: normal; font-style: normal; } .fa { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } /* makes the font 33% larger relative to the icon container */ .fa-lg { font-size: 1.33333333em; line-height: 0.75em; vertical-align: -15%; } .fa-2x { font-size: 2em; } .fa-3x { font-size: 3em; } .fa-4x { font-size: 4em; } .fa-5x { font-size: 5em; } .fa-fw { width: 1.28571429em; text-align: center; } .fa-ul { padding-left: 0; margin-left: 2.14285714em; list-style-type: none; } .fa-ul > li { position: relative; } .fa-li { position: absolute; left: -2.14285714em; width: 2.14285714em; top: 0.14285714em; text-align: center; } .fa-li.fa-lg { left: -1.85714286em; } .fa-border { padding: 0.2em 0.25em 0.15em; border: solid 0.08em #eee; border-radius: 0.1em; } .fa-pull-left { float: left; } .fa-pull-right { float: right; } .fa.fa-pull-left { margin-right: 0.3em; } .fa.fa-pull-right { margin-left: 0.3em; } /* Deprecated as of 4.4.0 */ .pull-right { float: right; } .pull-left { float: left; } .fa.pull-left { margin-right: 0.3em; } .fa.pull-right { margin-left: 0.3em; } .fa-spin { -webkit-animation: fa-spin 2s infinite linear; animation: fa-spin 2s infinite linear; } .fa-pulse { -webkit-animation: fa-spin 1s infinite steps(8); animation: fa-spin 1s infinite steps(8); } @-webkit-keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } @keyframes fa-spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } .fa-rotate-90 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)"; -webkit-transform: rotate(90deg); -ms-transform: rotate(90deg); transform: rotate(90deg); } .fa-rotate-180 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)"; -webkit-transform: rotate(180deg); -ms-transform: rotate(180deg); transform: rotate(180deg); } .fa-rotate-270 { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)"; -webkit-transform: rotate(270deg); -ms-transform: rotate(270deg); transform: rotate(270deg); } .fa-flip-horizontal { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)"; -webkit-transform: scale(-1, 1); -ms-transform: scale(-1, 1); transform: scale(-1, 1); } .fa-flip-vertical { -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"; -webkit-transform: scale(1, -1); -ms-transform: scale(1, -1); transform: scale(1, -1); } :root .fa-rotate-90, :root .fa-rotate-180, :root .fa-rotate-270, :root .fa-flip-horizontal, :root .fa-flip-vertical { filter: none; } .fa-stack { position: relative; display: inline-block; width: 2em; height: 2em; line-height: 2em; vertical-align: middle; } .fa-stack-1x, .fa-stack-2x { position: absolute; left: 0; width: 100%; text-align: center; } .fa-stack-1x { line-height: inherit; } .fa-stack-2x { font-size: 2em; } .fa-inverse { color: #fff; } /* Font Awesome uses the Unicode Private Use Area (PUA) to ensure screen readers do not read off random characters that represent icons */ .fa-glass:before { content: "\f000"; } .fa-music:before { content: "\f001"; } .fa-search:before { content: "\f002"; } .fa-envelope-o:before { content: "\f003"; } .fa-heart:before { content: "\f004"; } .fa-star:before { content: "\f005"; } .fa-star-o:before { content: "\f006"; } .fa-user:before { content: "\f007"; } .fa-film:before { content: "\f008"; } .fa-th-large:before { content: "\f009"; } .fa-th:before { content: "\f00a"; } .fa-th-list:before { content: "\f00b"; } .fa-check:before { content: "\f00c"; } .fa-remove:before, .fa-close:before, .fa-times:before { content: "\f00d"; } .fa-search-plus:before { content: "\f00e"; } .fa-search-minus:before { content: "\f010"; } .fa-power-off:before { content: "\f011"; } .fa-signal:before { content: "\f012"; } .fa-gear:before, .fa-cog:before { content: "\f013"; } .fa-trash-o:before { content: "\f014"; } .fa-home:before { content: "\f015"; } .fa-file-o:before { content: "\f016"; } .fa-clock-o:before { content: "\f017"; } .fa-road:before { content: "\f018"; } .fa-download:before { content: "\f019"; } .fa-arrow-circle-o-down:before { content: "\f01a"; } .fa-arrow-circle-o-up:before { content: "\f01b"; } .fa-inbox:before { content: "\f01c"; } .fa-play-circle-o:before { content: "\f01d"; } .fa-rotate-right:before, .fa-repeat:before { content: "\f01e"; } .fa-refresh:before { content: "\f021"; } .fa-list-alt:before { content: "\f022"; } .fa-lock:before { content: "\f023"; } .fa-flag:before { content: "\f024"; } .fa-headphones:before { content: "\f025"; } .fa-volume-off:before { content: "\f026"; } .fa-volume-down:before { content: "\f027"; } .fa-volume-up:before { content: "\f028"; } .fa-qrcode:before { content: "\f029"; } .fa-barcode:before { content: "\f02a"; } .fa-tag:before { content: "\f02b"; } .fa-tags:before { content: "\f02c"; } .fa-book:before { content: "\f02d"; } .fa-bookmark:before { content: "\f02e"; } .fa-print:before { content: "\f02f"; } .fa-camera:before { content: "\f030"; } .fa-font:before { content: "\f031"; } .fa-bold:before { content: "\f032"; } .fa-italic:before { content: "\f033"; } .fa-text-height:before { content: "\f034"; } .fa-text-width:before { content: "\f035"; } .fa-align-left:before { content: "\f036"; } .fa-align-center:before { content: "\f037"; } .fa-align-right:before { content: "\f038"; } .fa-align-justify:before { content: "\f039"; } .fa-list:before { content: "\f03a"; } .fa-dedent:before, .fa-outdent:before { content: "\f03b"; } .fa-indent:before { content: "\f03c"; } .fa-video-camera:before { content: "\f03d"; } .fa-photo:before, .fa-image:before, .fa-picture-o:before { content: "\f03e"; } .fa-pencil:before { content: "\f040"; } .fa-map-marker:before { content: "\f041"; } .fa-adjust:before { content: "\f042"; } .fa-tint:before { content: "\f043"; } .fa-edit:before, .fa-pencil-square-o:before { content: "\f044"; } .fa-share-square-o:before { content: "\f045"; } .fa-check-square-o:before { content: "\f046"; } .fa-arrows:before { content: "\f047"; } .fa-step-backward:before { content: "\f048"; } .fa-fast-backward:before { content: "\f049"; } .fa-backward:before { content: "\f04a"; } .fa-play:before { content: "\f04b"; } .fa-pause:before { content: "\f04c"; } .fa-stop:before { content: "\f04d"; } .fa-forward:before { content: "\f04e"; } .fa-fast-forward:before { content: "\f050"; } .fa-step-forward:before { content: "\f051"; } .fa-eject:before { content: "\f052"; } .fa-chevron-left:before { content: "\f053"; } .fa-chevron-right:before { content: "\f054"; } .fa-plus-circle:before { content: "\f055"; } .fa-minus-circle:before { content: "\f056"; } .fa-times-circle:before { content: "\f057"; } .fa-check-circle:before { content: "\f058"; } .fa-question-circle:before { content: "\f059"; } .fa-info-circle:before { content: "\f05a"; } .fa-crosshairs:before { content: "\f05b"; } .fa-times-circle-o:before { content: "\f05c"; } .fa-check-circle-o:before { content: "\f05d"; } .fa-ban:before { content: "\f05e"; } .fa-arrow-left:before { content: "\f060"; } .fa-arrow-right:before { content: "\f061"; } .fa-arrow-up:before { content: "\f062"; } .fa-arrow-down:before { content: "\f063"; } .fa-mail-forward:before, .fa-share:before { content: "\f064"; } .fa-expand:before { content: "\f065"; } .fa-compress:before { content: "\f066"; } .fa-plus:before { content: "\f067"; } .fa-minus:before { content: "\f068"; } .fa-asterisk:before { content: "\f069"; } .fa-exclamation-circle:before { content: "\f06a"; } .fa-gift:before { content: "\f06b"; } .fa-leaf:before { content: "\f06c"; } .fa-fire:before { content: "\f06d"; } .fa-eye:before { content: "\f06e"; } .fa-eye-slash:before { content: "\f070"; } .fa-warning:before, .fa-exclamation-triangle:before { content: "\f071"; } .fa-plane:before { content: "\f072"; } .fa-calendar:before { content: "\f073"; } .fa-random:before { content: "\f074"; } .fa-comment:before { content: "\f075"; } .fa-magnet:before { content: "\f076"; } .fa-chevron-up:before { content: "\f077"; } .fa-chevron-down:before { content: "\f078"; } .fa-retweet:before { content: "\f079"; } .fa-shopping-cart:before { content: "\f07a"; } .fa-folder:before { content: "\f07b"; } .fa-folder-open:before { content: "\f07c"; } .fa-arrows-v:before { content: "\f07d"; } .fa-arrows-h:before { content: "\f07e"; } .fa-bar-chart-o:before, .fa-bar-chart:before { content: "\f080"; } .fa-facebook-square:before { content: "\f082"; } .fa-camera-retro:before { content: "\f083"; } .fa-key:before { content: "\f084"; } .fa-gears:before, .fa-cogs:before { content: "\f085"; } .fa-comments:before { content: "\f086"; } .fa-thumbs-o-up:before { content: "\f087"; } .fa-thumbs-o-down:before { content: "\f088"; } .fa-star-half:before { content: "\f089"; } .fa-heart-o:before { content: "\f08a"; } .fa-sign-out:before { content: "\f08b"; } .fa-linkedin-square:before { content: "\f08c"; } .fa-thumb-tack:before { content: "\f08d"; } .fa-external-link:before { content: "\f08e"; } .fa-sign-in:before { content: "\f090"; } .fa-trophy:before { content: "\f091"; } .fa-github-square:before { content: "\f092"; } .fa-upload:before { content: "\f093"; } .fa-lemon-o:before { content: "\f094"; } .fa-phone:before { content: "\f095"; } .fa-square-o:before { content: "\f096"; } .fa-bookmark-o:before { content: "\f097"; } .fa-phone-square:before { content: "\f098"; } .fa-facebook-f:before, .fa-facebook:before { content: "\f09a"; } .fa-github:before { content: "\f09b"; } .fa-unlock:before { content: "\f09c"; } .fa-credit-card:before { content: "\f09d"; } .fa-feed:before, .fa-rss:before { content: "\f09e"; } .fa-hdd-o:before { content: "\f0a0"; } .fa-bullhorn:before { content: "\f0a1"; } .fa-bell:before { content: "\f0f3"; } .fa-certificate:before { content: "\f0a3"; } .fa-hand-o-right:before { content: "\f0a4"; } .fa-hand-o-left:before { content: "\f0a5"; } .fa-hand-o-up:before { content: "\f0a6"; } .fa-hand-o-down:before { content: "\f0a7"; } .fa-arrow-circle-left:before { content: "\f0a8"; } .fa-arrow-circle-right:before { content: "\f0a9"; } .fa-arrow-circle-up:before { content: "\f0aa"; } .fa-arrow-circle-down:before { content: "\f0ab"; } .fa-globe:before { content: "\f0ac"; } .fa-wrench:before { content: "\f0ad"; } .fa-tasks:before { content: "\f0ae"; } .fa-filter:before { content: "\f0b0"; } .fa-briefcase:before { content: "\f0b1"; } .fa-arrows-alt:before { content: "\f0b2"; } .fa-group:before, .fa-users:before { content: "\f0c0"; } .fa-chain:before, .fa-link:before { content: "\f0c1"; } .fa-cloud:before { content: "\f0c2"; } .fa-flask:before { content: "\f0c3"; } .fa-cut:before, .fa-scissors:before { content: "\f0c4"; } .fa-copy:before, .fa-files-o:before { content: "\f0c5"; } .fa-paperclip:before { content: "\f0c6"; } .fa-save:before, .fa-floppy-o:before { content: "\f0c7"; } .fa-square:before { content: "\f0c8"; } .fa-navicon:before, .fa-reorder:before, .fa-bars:before { content: "\f0c9"; } .fa-list-ul:before { content: "\f0ca"; } .fa-list-ol:before { content: "\f0cb"; } .fa-strikethrough:before { content: "\f0cc"; } .fa-underline:before { content: "\f0cd"; } .fa-table:before { content: "\f0ce"; } .fa-magic:before { content: "\f0d0"; } .fa-truck:before { content: "\f0d1"; } .fa-pinterest:before { content: "\f0d2"; } .fa-pinterest-square:before { content: "\f0d3"; } .fa-google-plus-square:before { content: "\f0d4"; } .fa-google-plus:before { content: "\f0d5"; } .fa-money:before { content: "\f0d6"; } .fa-caret-down:before { content: "\f0d7"; } .fa-caret-up:before { content: "\f0d8"; } .fa-caret-left:before { content: "\f0d9"; } .fa-caret-right:before { content: "\f0da"; } .fa-columns:before { content: "\f0db"; } .fa-unsorted:before, .fa-sort:before { content: "\f0dc"; } .fa-sort-down:before, .fa-sort-desc:before { content: "\f0dd"; } .fa-sort-up:before, .fa-sort-asc:before { content: "\f0de"; } .fa-envelope:before { content: "\f0e0"; } .fa-linkedin:before { content: "\f0e1"; } .fa-rotate-left:before, .fa-undo:before { content: "\f0e2"; } .fa-legal:before, .fa-gavel:before { content: "\f0e3"; } .fa-dashboard:before, .fa-tachometer:before { content: "\f0e4"; } .fa-comment-o:before { content: "\f0e5"; } .fa-comments-o:before { content: "\f0e6"; } .fa-flash:before, .fa-bolt:before { content: "\f0e7"; } .fa-sitemap:before { content: "\f0e8"; } .fa-umbrella:before { content: "\f0e9"; } .fa-paste:before, .fa-clipboard:before { content: "\f0ea"; } .fa-lightbulb-o:before { content: "\f0eb"; } .fa-exchange:before { content: "\f0ec"; } .fa-cloud-download:before { content: "\f0ed"; } .fa-cloud-upload:before { content: "\f0ee"; } .fa-user-md:before { content: "\f0f0"; } .fa-stethoscope:before { content: "\f0f1"; } .fa-suitcase:before { content: "\f0f2"; } .fa-bell-o:before { content: "\f0a2"; } .fa-coffee:before { content: "\f0f4"; } .fa-cutlery:before { content: "\f0f5"; } .fa-file-text-o:before { content: "\f0f6"; } .fa-building-o:before { content: "\f0f7"; } .fa-hospital-o:before { content: "\f0f8"; } .fa-ambulance:before { content: "\f0f9"; } .fa-medkit:before { content: "\f0fa"; } .fa-fighter-jet:before { content: "\f0fb"; } .fa-beer:before { content: "\f0fc"; } .fa-h-square:before { content: "\f0fd"; } .fa-plus-square:before { content: "\f0fe"; } .fa-angle-double-left:before { content: "\f100"; } .fa-angle-double-right:before { content: "\f101"; } .fa-angle-double-up:before { content: "\f102"; } .fa-angle-double-down:before { content: "\f103"; } .fa-angle-left:before { content: "\f104"; } .fa-angle-right:before { content: "\f105"; } .fa-angle-up:before { content: "\f106"; } .fa-angle-down:before { content: "\f107"; } .fa-desktop:before { content: "\f108"; } .fa-laptop:before { content: "\f109"; } .fa-tablet:before { content: "\f10a"; } .fa-mobile-phone:before, .fa-mobile:before { content: "\f10b"; } .fa-circle-o:before { content: "\f10c"; } .fa-quote-left:before { content: "\f10d"; } .fa-quote-right:before { content: "\f10e"; } .fa-spinner:before { content: "\f110"; } .fa-circle:before { content: "\f111"; } .fa-mail-reply:before, .fa-reply:before { content: "\f112"; } .fa-github-alt:before { content: "\f113"; } .fa-folder-o:before { content: "\f114"; } .fa-folder-open-o:before { content: "\f115"; } .fa-smile-o:before { content: "\f118"; } .fa-frown-o:before { content: "\f119"; } .fa-meh-o:before { content: "\f11a"; } .fa-gamepad:before { content: "\f11b"; } .fa-keyboard-o:before { content: "\f11c"; } .fa-flag-o:before { content: "\f11d"; } .fa-flag-checkered:before { content: "\f11e"; } .fa-terminal:before { content: "\f120"; } .fa-code:before { content: "\f121"; } .fa-mail-reply-all:before, .fa-reply-all:before { content: "\f122"; } .fa-star-half-empty:before, .fa-star-half-full:before, .fa-star-half-o:before { content: "\f123"; } .fa-location-arrow:before { content: "\f124"; } .fa-crop:before { content: "\f125"; } .fa-code-fork:before { content: "\f126"; } .fa-unlink:before, .fa-chain-broken:before { content: "\f127"; } .fa-question:before { content: "\f128"; } .fa-info:before { content: "\f129"; } .fa-exclamation:before { content: "\f12a"; } .fa-superscript:before { content: "\f12b"; } .fa-subscript:before { content: "\f12c"; } .fa-eraser:before { content: "\f12d"; } .fa-puzzle-piece:before { content: "\f12e"; } .fa-microphone:before { content: "\f130"; } .fa-microphone-slash:before { content: "\f131"; } .fa-shield:before { content: "\f132"; } .fa-calendar-o:before { content: "\f133"; } .fa-fire-extinguisher:before { content: "\f134"; } .fa-rocket:before { content: "\f135"; } .fa-maxcdn:before { content: "\f136"; } .fa-chevron-circle-left:before { content: "\f137"; } .fa-chevron-circle-right:before { content: "\f138"; } .fa-chevron-circle-up:before { content: "\f139"; } .fa-chevron-circle-down:before { content: "\f13a"; } .fa-html5:before { content: "\f13b"; } .fa-css3:before { content: "\f13c"; } .fa-anchor:before { content: "\f13d"; } .fa-unlock-alt:before { content: "\f13e"; } .fa-bullseye:before { content: "\f140"; } .fa-ellipsis-h:before { content: "\f141"; } .fa-ellipsis-v:before { content: "\f142"; } .fa-rss-square:before { content: "\f143"; } .fa-play-circle:before { content: "\f144"; } .fa-ticket:before { content: "\f145"; } .fa-minus-square:before { content: "\f146"; } .fa-minus-square-o:before { content: "\f147"; } .fa-level-up:before { content: "\f148"; } .fa-level-down:before { content: "\f149"; } .fa-check-square:before { content: "\f14a"; } .fa-pencil-square:before { content: "\f14b"; } .fa-external-link-square:before { content: "\f14c"; } .fa-share-square:before { content: "\f14d"; } .fa-compass:before { content: "\f14e"; } .fa-toggle-down:before, .fa-caret-square-o-down:before { content: "\f150"; } .fa-toggle-up:before, .fa-caret-square-o-up:before { content: "\f151"; } .fa-toggle-right:before, .fa-caret-square-o-right:before { content: "\f152"; } .fa-euro:before, .fa-eur:before { content: "\f153"; } .fa-gbp:before { content: "\f154"; } .fa-dollar:before, .fa-usd:before { content: "\f155"; } .fa-rupee:before, .fa-inr:before { content: "\f156"; } .fa-cny:before, .fa-rmb:before, .fa-yen:before, .fa-jpy:before { content: "\f157"; } .fa-ruble:before, .fa-rouble:before, .fa-rub:before { content: "\f158"; } .fa-won:before, .fa-krw:before { content: "\f159"; } .fa-bitcoin:before, .fa-btc:before { content: "\f15a"; } .fa-file:before { content: "\f15b"; } .fa-file-text:before { content: "\f15c"; } .fa-sort-alpha-asc:before { content: "\f15d"; } .fa-sort-alpha-desc:before { content: "\f15e"; } .fa-sort-amount-asc:before { content: "\f160"; } .fa-sort-amount-desc:before { content: "\f161"; } .fa-sort-numeric-asc:before { content: "\f162"; } .fa-sort-numeric-desc:before { content: "\f163"; } .fa-thumbs-up:before { content: "\f164"; } .fa-thumbs-down:before { content: "\f165"; } .fa-youtube-square:before { content: "\f166"; } .fa-youtube:before { content: "\f167"; } .fa-xing:before { content: "\f168"; } .fa-xing-square:before { content: "\f169"; } .fa-youtube-play:before { content: "\f16a"; } .fa-dropbox:before { content: "\f16b"; } .fa-stack-overflow:before { content: "\f16c"; } .fa-instagram:before { content: "\f16d"; } .fa-flickr:before { content: "\f16e"; } .fa-adn:before { content: "\f170"; } .fa-bitbucket:before { content: "\f171"; } .fa-bitbucket-square:before { content: "\f172"; } .fa-tumblr:before { content: "\f173"; } .fa-tumblr-square:before { content: "\f174"; } .fa-long-arrow-down:before { content: "\f175"; } .fa-long-arrow-up:before { content: "\f176"; } .fa-long-arrow-left:before { content: "\f177"; } .fa-long-arrow-right:before { content: "\f178"; } .fa-apple:before { content: "\f179"; } .fa-windows:before { content: "\f17a"; } .fa-android:before { content: "\f17b"; } .fa-linux:before { content: "\f17c"; } .fa-dribbble:before { content: "\f17d"; } .fa-skype:before { content: "\f17e"; } .fa-foursquare:before { content: "\f180"; } .fa-trello:before { content: "\f181"; } .fa-female:before { content: "\f182"; } .fa-male:before { content: "\f183"; } .fa-gittip:before, .fa-gratipay:before { content: "\f184"; } .fa-sun-o:before { content: "\f185"; } .fa-moon-o:before { content: "\f186"; } .fa-archive:before { content: "\f187"; } .fa-bug:before { content: "\f188"; } .fa-vk:before { content: "\f189"; } .fa-weibo:before { content: "\f18a"; } .fa-renren:before { content: "\f18b"; } .fa-pagelines:before { content: "\f18c"; } .fa-stack-exchange:before { content: "\f18d"; } .fa-arrow-circle-o-right:before { content: "\f18e"; } .fa-arrow-circle-o-left:before { content: "\f190"; } .fa-toggle-left:before, .fa-caret-square-o-left:before { content: "\f191"; } .fa-dot-circle-o:before { content: "\f192"; } .fa-wheelchair:before { content: "\f193"; } .fa-vimeo-square:before { content: "\f194"; } .fa-turkish-lira:before, .fa-try:before { content: "\f195"; } .fa-plus-square-o:before { content: "\f196"; } .fa-space-shuttle:before { content: "\f197"; } .fa-slack:before { content: "\f198"; } .fa-envelope-square:before { content: "\f199"; } .fa-wordpress:before { content: "\f19a"; } .fa-openid:before { content: "\f19b"; } .fa-institution:before, .fa-bank:before, .fa-university:before { content: "\f19c"; } .fa-mortar-board:before, .fa-graduation-cap:before { content: "\f19d"; } .fa-yahoo:before { content: "\f19e"; } .fa-google:before { content: "\f1a0"; } .fa-reddit:before { content: "\f1a1"; } .fa-reddit-square:before { content: "\f1a2"; } .fa-stumbleupon-circle:before { content: "\f1a3"; } .fa-stumbleupon:before { content: "\f1a4"; } .fa-delicious:before { content: "\f1a5"; } .fa-digg:before { content: "\f1a6"; } .fa-pied-piper-pp:before { content: "\f1a7"; } .fa-pied-piper-alt:before { content: "\f1a8"; } .fa-drupal:before { content: "\f1a9"; } .fa-joomla:before { content: "\f1aa"; } .fa-language:before { content: "\f1ab"; } .fa-fax:before { content: "\f1ac"; } .fa-building:before { content: "\f1ad"; } .fa-child:before { content: "\f1ae"; } .fa-paw:before { content: "\f1b0"; } .fa-spoon:before { content: "\f1b1"; } .fa-cube:before { content: "\f1b2"; } .fa-cubes:before { content: "\f1b3"; } .fa-behance:before { content: "\f1b4"; } .fa-behance-square:before { content: "\f1b5"; } .fa-steam:before { content: "\f1b6"; } .fa-steam-square:before { content: "\f1b7"; } .fa-recycle:before { content: "\f1b8"; } .fa-automobile:before, .fa-car:before { content: "\f1b9"; } .fa-cab:before, .fa-taxi:before { content: "\f1ba"; } .fa-tree:before { content: "\f1bb"; } .fa-spotify:before { content: "\f1bc"; } .fa-deviantart:before { content: "\f1bd"; } .fa-soundcloud:before { content: "\f1be"; } .fa-database:before { content: "\f1c0"; } .fa-file-pdf-o:before { content: "\f1c1"; } .fa-file-word-o:before { content: "\f1c2"; } .fa-file-excel-o:before { content: "\f1c3"; } .fa-file-powerpoint-o:before { content: "\f1c4"; } .fa-file-photo-o:before, .fa-file-picture-o:before, .fa-file-image-o:before { content: "\f1c5"; } .fa-file-zip-o:before, .fa-file-archive-o:before { content: "\f1c6"; } .fa-file-sound-o:before, .fa-file-audio-o:before { content: "\f1c7"; } .fa-file-movie-o:before, .fa-file-video-o:before { content: "\f1c8"; } .fa-file-code-o:before { content: "\f1c9"; } .fa-vine:before { content: "\f1ca"; } .fa-codepen:before { content: "\f1cb"; } .fa-jsfiddle:before { content: "\f1cc"; } .fa-life-bouy:before, .fa-life-buoy:before, .fa-life-saver:before, .fa-support:before, .fa-life-ring:before { content: "\f1cd"; } .fa-circle-o-notch:before { content: "\f1ce"; } .fa-ra:before, .fa-resistance:before, .fa-rebel:before { content: "\f1d0"; } .fa-ge:before, .fa-empire:before { content: "\f1d1"; } .fa-git-square:before { content: "\f1d2"; } .fa-git:before { content: "\f1d3"; } .fa-y-combinator-square:before, .fa-yc-square:before, .fa-hacker-news:before { content: "\f1d4"; } .fa-tencent-weibo:before { content: "\f1d5"; } .fa-qq:before { content: "\f1d6"; } .fa-wechat:before, .fa-weixin:before { content: "\f1d7"; } .fa-send:before, .fa-paper-plane:before { content: "\f1d8"; } .fa-send-o:before, .fa-paper-plane-o:before { content: "\f1d9"; } .fa-history:before { content: "\f1da"; } .fa-circle-thin:before { content: "\f1db"; } .fa-header:before { content: "\f1dc"; } .fa-paragraph:before { content: "\f1dd"; } .fa-sliders:before { content: "\f1de"; } .fa-share-alt:before { content: "\f1e0"; } .fa-share-alt-square:before { content: "\f1e1"; } .fa-bomb:before { content: "\f1e2"; } .fa-soccer-ball-o:before, .fa-futbol-o:before { content: "\f1e3"; } .fa-tty:before { content: "\f1e4"; } .fa-binoculars:before { content: "\f1e5"; } .fa-plug:before { content: "\f1e6"; } .fa-slideshare:before { content: "\f1e7"; } .fa-twitch:before { content: "\f1e8"; } .fa-yelp:before { content: "\f1e9"; } .fa-newspaper-o:before { content: "\f1ea"; } .fa-wifi:before { content: "\f1eb"; } .fa-calculator:before { content: "\f1ec"; } .fa-paypal:before { content: "\f1ed"; } .fa-google-wallet:before { content: "\f1ee"; } .fa-cc-visa:before { content: "\f1f0"; } .fa-cc-mastercard:before { content: "\f1f1"; } .fa-cc-discover:before { content: "\f1f2"; } .fa-cc-amex:before { content: "\f1f3"; } .fa-cc-paypal:before { content: "\f1f4"; } .fa-cc-stripe:before { content: "\f1f5"; } .fa-bell-slash:before { content: "\f1f6"; } .fa-bell-slash-o:before { content: "\f1f7"; } .fa-trash:before { content: "\f1f8"; } .fa-copyright:before { content: "\f1f9"; } .fa-at:before { content: "\f1fa"; } .fa-eyedropper:before { content: "\f1fb"; } .fa-paint-brush:before { content: "\f1fc"; } .fa-birthday-cake:before { content: "\f1fd"; } .fa-area-chart:before { content: "\f1fe"; } .fa-pie-chart:before { content: "\f200"; } .fa-line-chart:before { content: "\f201"; } .fa-lastfm:before { content: "\f202"; } .fa-lastfm-square:before { content: "\f203"; } .fa-toggle-off:before { content: "\f204"; } .fa-toggle-on:before { content: "\f205"; } .fa-bicycle:before { content: "\f206"; } .fa-bus:before { content: "\f207"; } .fa-ioxhost:before { content: "\f208"; } .fa-angellist:before { content: "\f209"; } .fa-cc:before { content: "\f20a"; } .fa-shekel:before, .fa-sheqel:before, .fa-ils:before { content: "\f20b"; } .fa-meanpath:before { content: "\f20c"; } .fa-buysellads:before { content: "\f20d"; } .fa-connectdevelop:before { content: "\f20e"; } .fa-dashcube:before { content: "\f210"; } .fa-forumbee:before { content: "\f211"; } .fa-leanpub:before { content: "\f212"; } .fa-sellsy:before { content: "\f213"; } .fa-shirtsinbulk:before { content: "\f214"; } .fa-simplybuilt:before { content: "\f215"; } .fa-skyatlas:before { content: "\f216"; } .fa-cart-plus:before { content: "\f217"; } .fa-cart-arrow-down:before { content: "\f218"; } .fa-diamond:before { content: "\f219"; } .fa-ship:before { content: "\f21a"; } .fa-user-secret:before { content: "\f21b"; } .fa-motorcycle:before { content: "\f21c"; } .fa-street-view:before { content: "\f21d"; } .fa-heartbeat:before { content: "\f21e"; } .fa-venus:before { content: "\f221"; } .fa-mars:before { content: "\f222"; } .fa-mercury:before { content: "\f223"; } .fa-intersex:before, .fa-transgender:before { content: "\f224"; } .fa-transgender-alt:before { content: "\f225"; } .fa-venus-double:before { content: "\f226"; } .fa-mars-double:before { content: "\f227"; } .fa-venus-mars:before { content: "\f228"; } .fa-mars-stroke:before { content: "\f229"; } .fa-mars-stroke-v:before { content: "\f22a"; } .fa-mars-stroke-h:before { content: "\f22b"; } .fa-neuter:before { content: "\f22c"; } .fa-genderless:before { content: "\f22d"; } .fa-facebook-official:before { content: "\f230"; } .fa-pinterest-p:before { content: "\f231"; } .fa-whatsapp:before { content: "\f232"; } .fa-server:before { content: "\f233"; } .fa-user-plus:before { content: "\f234"; } .fa-user-times:before { content: "\f235"; } .fa-hotel:before, .fa-bed:before { content: "\f236"; } .fa-viacoin:before { content: "\f237"; } .fa-train:before { content: "\f238"; } .fa-subway:before { content: "\f239"; } .fa-medium:before { content: "\f23a"; } .fa-yc:before, .fa-y-combinator:before { content: "\f23b"; } .fa-optin-monster:before { content: "\f23c"; } .fa-opencart:before { content: "\f23d"; } .fa-expeditedssl:before { content: "\f23e"; } .fa-battery-4:before, .fa-battery:before, .fa-battery-full:before { content: "\f240"; } .fa-battery-3:before, .fa-battery-three-quarters:before { content: "\f241"; } .fa-battery-2:before, .fa-battery-half:before { content: "\f242"; } .fa-battery-1:before, .fa-battery-quarter:before { content: "\f243"; } .fa-battery-0:before, .fa-battery-empty:before { content: "\f244"; } .fa-mouse-pointer:before { content: "\f245"; } .fa-i-cursor:before { content: "\f246"; } .fa-object-group:before { content: "\f247"; } .fa-object-ungroup:before { content: "\f248"; } .fa-sticky-note:before { content: "\f249"; } .fa-sticky-note-o:before { content: "\f24a"; } .fa-cc-jcb:before { content: "\f24b"; } .fa-cc-diners-club:before { content: "\f24c"; } .fa-clone:before { content: "\f24d"; } .fa-balance-scale:before { content: "\f24e"; } .fa-hourglass-o:before { content: "\f250"; } .fa-hourglass-1:before, .fa-hourglass-start:before { content: "\f251"; } .fa-hourglass-2:before, .fa-hourglass-half:before { content: "\f252"; } .fa-hourglass-3:before, .fa-hourglass-end:before { content: "\f253"; } .fa-hourglass:before { content: "\f254"; } .fa-hand-grab-o:before, .fa-hand-rock-o:before { content: "\f255"; } .fa-hand-stop-o:before, .fa-hand-paper-o:before { content: "\f256"; } .fa-hand-scissors-o:before { content: "\f257"; } .fa-hand-lizard-o:before { content: "\f258"; } .fa-hand-spock-o:before { content: "\f259"; } .fa-hand-pointer-o:before { content: "\f25a"; } .fa-hand-peace-o:before { content: "\f25b"; } .fa-trademark:before { content: "\f25c"; } .fa-registered:before { content: "\f25d"; } .fa-creative-commons:before { content: "\f25e"; } .fa-gg:before { content: "\f260"; } .fa-gg-circle:before { content: "\f261"; } .fa-tripadvisor:before { content: "\f262"; } .fa-odnoklassniki:before { content: "\f263"; } .fa-odnoklassniki-square:before { content: "\f264"; } .fa-get-pocket:before { content: "\f265"; } .fa-wikipedia-w:before { content: "\f266"; } .fa-safari:before { content: "\f267"; } .fa-chrome:before { content: "\f268"; } .fa-firefox:before { content: "\f269"; } .fa-opera:before { content: "\f26a"; } .fa-internet-explorer:before { content: "\f26b"; } .fa-tv:before, .fa-television:before { content: "\f26c"; } .fa-contao:before { content: "\f26d"; } .fa-500px:before { content: "\f26e"; } .fa-amazon:before { content: "\f270"; } .fa-calendar-plus-o:before { content: "\f271"; } .fa-calendar-minus-o:before { content: "\f272"; } .fa-calendar-times-o:before { content: "\f273"; } .fa-calendar-check-o:before { content: "\f274"; } .fa-industry:before { content: "\f275"; } .fa-map-pin:before { content: "\f276"; } .fa-map-signs:before { content: "\f277"; } .fa-map-o:before { content: "\f278"; } .fa-map:before { content: "\f279"; } .fa-commenting:before { content: "\f27a"; } .fa-commenting-o:before { content: "\f27b"; } .fa-houzz:before { content: "\f27c"; } .fa-vimeo:before { content: "\f27d"; } .fa-black-tie:before { content: "\f27e"; } .fa-fonticons:before { content: "\f280"; } .fa-reddit-alien:before { content: "\f281"; } .fa-edge:before { content: "\f282"; } .fa-credit-card-alt:before { content: "\f283"; } .fa-codiepie:before { content: "\f284"; } .fa-modx:before { content: "\f285"; } .fa-fort-awesome:before { content: "\f286"; } .fa-usb:before { content: "\f287"; } .fa-product-hunt:before { content: "\f288"; } .fa-mixcloud:before { content: "\f289"; } .fa-scribd:before { content: "\f28a"; } .fa-pause-circle:before { content: "\f28b"; } .fa-pause-circle-o:before { content: "\f28c"; } .fa-stop-circle:before { content: "\f28d"; } .fa-stop-circle-o:before { content: "\f28e"; } .fa-shopping-bag:before { content: "\f290"; } .fa-shopping-basket:before { content: "\f291"; } .fa-hashtag:before { content: "\f292"; } .fa-bluetooth:before { content: "\f293"; } .fa-bluetooth-b:before { content: "\f294"; } .fa-percent:before { content: "\f295"; } .fa-gitlab:before { content: "\f296"; } .fa-wpbeginner:before { content: "\f297"; } .fa-wpforms:before { content: "\f298"; } .fa-envira:before { content: "\f299"; } .fa-universal-access:before { content: "\f29a"; } .fa-wheelchair-alt:before { content: "\f29b"; } .fa-question-circle-o:before { content: "\f29c"; } .fa-blind:before { content: "\f29d"; } .fa-audio-description:before { content: "\f29e"; } .fa-volume-control-phone:before { content: "\f2a0"; } .fa-braille:before { content: "\f2a1"; } .fa-assistive-listening-systems:before { content: "\f2a2"; } .fa-asl-interpreting:before, .fa-american-sign-language-interpreting:before { content: "\f2a3"; } .fa-deafness:before, .fa-hard-of-hearing:before, .fa-deaf:before { content: "\f2a4"; } .fa-glide:before { content: "\f2a5"; } .fa-glide-g:before { content: "\f2a6"; } .fa-signing:before, .fa-sign-language:before { content: "\f2a7"; } .fa-low-vision:before { content: "\f2a8"; } .fa-viadeo:before { content: "\f2a9"; } .fa-viadeo-square:before { content: "\f2aa"; } .fa-snapchat:before { content: "\f2ab"; } .fa-snapchat-ghost:before { content: "\f2ac"; } .fa-snapchat-square:before { content: "\f2ad"; } .fa-pied-piper:before { content: "\f2ae"; } .fa-first-order:before { content: "\f2b0"; } .fa-yoast:before { content: "\f2b1"; } .fa-themeisle:before { content: "\f2b2"; } .fa-google-plus-circle:before, .fa-google-plus-official:before { content: "\f2b3"; } .fa-fa:before, .fa-font-awesome:before { content: "\f2b4"; } .fa-handshake-o:before { content: "\f2b5"; } .fa-envelope-open:before { content: "\f2b6"; } .fa-envelope-open-o:before { content: "\f2b7"; } .fa-linode:before { content: "\f2b8"; } .fa-address-book:before { content: "\f2b9"; } .fa-address-book-o:before { content: "\f2ba"; } .fa-vcard:before, .fa-address-card:before { content: "\f2bb"; } .fa-vcard-o:before, .fa-address-card-o:before { content: "\f2bc"; } .fa-user-circle:before { content: "\f2bd"; } .fa-user-circle-o:before { content: "\f2be"; } .fa-user-o:before { content: "\f2c0"; } .fa-id-badge:before { content: "\f2c1"; } .fa-drivers-license:before, .fa-id-card:before { content: "\f2c2"; } .fa-drivers-license-o:before, .fa-id-card-o:before { content: "\f2c3"; } .fa-quora:before { content: "\f2c4"; } .fa-free-code-camp:before { content: "\f2c5"; } .fa-telegram:before { content: "\f2c6"; } .fa-thermometer-4:before, .fa-thermometer:before, .fa-thermometer-full:before { content: "\f2c7"; } .fa-thermometer-3:before, .fa-thermometer-three-quarters:before { content: "\f2c8"; } .fa-thermometer-2:before, .fa-thermometer-half:before { content: "\f2c9"; } .fa-thermometer-1:before, .fa-thermometer-quarter:before { content: "\f2ca"; } .fa-thermometer-0:before, .fa-thermometer-empty:before { content: "\f2cb"; } .fa-shower:before { content: "\f2cc"; } .fa-bathtub:before, .fa-s15:before, .fa-bath:before { content: "\f2cd"; } .fa-podcast:before { content: "\f2ce"; } .fa-window-maximize:before { content: "\f2d0"; } .fa-window-minimize:before { content: "\f2d1"; } .fa-window-restore:before { content: "\f2d2"; } .fa-times-rectangle:before, .fa-window-close:before { content: "\f2d3"; } .fa-times-rectangle-o:before, .fa-window-close-o:before { content: "\f2d4"; } .fa-bandcamp:before { content: "\f2d5"; } .fa-grav:before { content: "\f2d6"; } .fa-etsy:before { content: "\f2d7"; } .fa-imdb:before { content: "\f2d8"; } .fa-ravelry:before { content: "\f2d9"; } .fa-eercast:before { content: "\f2da"; } .fa-microchip:before { content: "\f2db"; } .fa-snowflake-o:before { content: "\f2dc"; } .fa-superpowers:before { content: "\f2dd"; } .fa-wpexplorer:before { content: "\f2de"; } .fa-meetup:before { content: "\f2e0"; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } .sr-only-focusable:active, .sr-only-focusable:focus { position: static; width: auto; height: auto; margin: 0; overflow: visible; clip: auto; } /*! * * IPython base * */ .modal.fade .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); -o-transform: translate(0, 0); transform: translate(0, 0); } code { color: #000; } pre { font-size: inherit; line-height: inherit; } label { font-weight: normal; } /* Make the page background atleast 100% the height of the view port */ /* Make the page itself atleast 70% the height of the view port */ .border-box-sizing { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } .corner-all { border-radius: 2px; } .no-padding { padding: 0px; } /* Flexible box model classes */ /* Taken from Alex Russell http://infrequently.org/2009/08/css-3-progress/ */ /* This file is a compatability layer. It allows the usage of flexible box model layouts accross multiple browsers, including older browsers. The newest, universal implementation of the flexible box model is used when available (see `Modern browsers` comments below). Browsers that are known to implement this new spec completely include: Firefox 28.0+ Chrome 29.0+ Internet Explorer 11+ Opera 17.0+ Browsers not listed, including Safari, are supported via the styling under the `Old browsers` comments below. */ .hbox { /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; } .hbox > * { /* Old browsers */ -webkit-box-flex: 0; -moz-box-flex: 0; box-flex: 0; /* Modern browsers */ flex: none; } .vbox { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; } .vbox > * { /* Old browsers */ -webkit-box-flex: 0; -moz-box-flex: 0; box-flex: 0; /* Modern browsers */ flex: none; } .hbox.reverse, .vbox.reverse, .reverse { /* Old browsers */ -webkit-box-direction: reverse; -moz-box-direction: reverse; box-direction: reverse; /* Modern browsers */ flex-direction: row-reverse; } .hbox.box-flex0, .vbox.box-flex0, .box-flex0 { /* Old browsers */ -webkit-box-flex: 0; -moz-box-flex: 0; box-flex: 0; /* Modern browsers */ flex: none; width: auto; } .hbox.box-flex1, .vbox.box-flex1, .box-flex1 { /* Old browsers */ -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; /* Modern browsers */ flex: 1; } .hbox.box-flex, .vbox.box-flex, .box-flex { /* Old browsers */ /* Old browsers */ -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; /* Modern browsers */ flex: 1; } .hbox.box-flex2, .vbox.box-flex2, .box-flex2 { /* Old browsers */ -webkit-box-flex: 2; -moz-box-flex: 2; box-flex: 2; /* Modern browsers */ flex: 2; } .box-group1 { /* Deprecated */ -webkit-box-flex-group: 1; -moz-box-flex-group: 1; box-flex-group: 1; } .box-group2 { /* Deprecated */ -webkit-box-flex-group: 2; -moz-box-flex-group: 2; box-flex-group: 2; } .hbox.start, .vbox.start, .start { /* Old browsers */ -webkit-box-pack: start; -moz-box-pack: start; box-pack: start; /* Modern browsers */ justify-content: flex-start; } .hbox.end, .vbox.end, .end { /* Old browsers */ -webkit-box-pack: end; -moz-box-pack: end; box-pack: end; /* Modern browsers */ justify-content: flex-end; } .hbox.center, .vbox.center, .center { /* Old browsers */ -webkit-box-pack: center; -moz-box-pack: center; box-pack: center; /* Modern browsers */ justify-content: center; } .hbox.baseline, .vbox.baseline, .baseline { /* Old browsers */ -webkit-box-pack: baseline; -moz-box-pack: baseline; box-pack: baseline; /* Modern browsers */ justify-content: baseline; } .hbox.stretch, .vbox.stretch, .stretch { /* Old browsers */ -webkit-box-pack: stretch; -moz-box-pack: stretch; box-pack: stretch; /* Modern browsers */ justify-content: stretch; } .hbox.align-start, .vbox.align-start, .align-start { /* Old browsers */ -webkit-box-align: start; -moz-box-align: start; box-align: start; /* Modern browsers */ align-items: flex-start; } .hbox.align-end, .vbox.align-end, .align-end { /* Old browsers */ -webkit-box-align: end; -moz-box-align: end; box-align: end; /* Modern browsers */ align-items: flex-end; } .hbox.align-center, .vbox.align-center, .align-center { /* Old browsers */ -webkit-box-align: center; -moz-box-align: center; box-align: center; /* Modern browsers */ align-items: center; } .hbox.align-baseline, .vbox.align-baseline, .align-baseline { /* Old browsers */ -webkit-box-align: baseline; -moz-box-align: baseline; box-align: baseline; /* Modern browsers */ align-items: baseline; } .hbox.align-stretch, .vbox.align-stretch, .align-stretch { /* Old browsers */ -webkit-box-align: stretch; -moz-box-align: stretch; box-align: stretch; /* Modern browsers */ align-items: stretch; } div.error { margin: 2em; text-align: center; } div.error > h1 { font-size: 500%; line-height: normal; } div.error > p { font-size: 200%; line-height: normal; } div.traceback-wrapper { text-align: left; max-width: 800px; margin: auto; } div.traceback-wrapper pre.traceback { max-height: 600px; overflow: auto; } /** * Primary styles * * Author: Jupyter Development Team */ body { background-color: #fff; /* This makes sure that the body covers the entire window and needs to be in a different element than the display: box in wrapper below */ position: absolute; left: 0px; right: 0px; top: 0px; bottom: 0px; overflow: visible; } body > #header { /* Initially hidden to prevent FLOUC */ display: none; background-color: #fff; /* Display over codemirror */ position: relative; z-index: 100; } body > #header #header-container { display: flex; flex-direction: row; justify-content: space-between; padding: 5px; padding-bottom: 5px; padding-top: 5px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } body > #header .header-bar { width: 100%; height: 1px; background: #e7e7e7; margin-bottom: -1px; } @media print { body > #header { display: none !important; } } #header-spacer { width: 100%; visibility: hidden; } @media print { #header-spacer { display: none; } } #ipython_notebook { padding-left: 0px; padding-top: 1px; padding-bottom: 1px; } [dir="rtl"] #ipython_notebook { margin-right: 10px; margin-left: 0; } [dir="rtl"] #ipython_notebook.pull-left { float: right !important; float: right; } .flex-spacer { flex: 1; } #noscript { width: auto; padding-top: 16px; padding-bottom: 16px; text-align: center; font-size: 22px; color: red; font-weight: bold; } #ipython_notebook img { height: 28px; } #site { width: 100%; display: none; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; overflow: auto; } @media print { #site { height: auto !important; } } /* Smaller buttons */ .ui-button .ui-button-text { padding: 0.2em 0.8em; font-size: 77%; } input.ui-button { padding: 0.3em 0.9em; } span#kernel_logo_widget { margin: 0 10px; } span#login_widget { float: right; } [dir="rtl"] span#login_widget { float: left; } span#login_widget > .button, #logout { color: #333; background-color: #fff; border-color: #ccc; } span#login_widget > .button:focus, #logout:focus, span#login_widget > .button.focus, #logout.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } span#login_widget > .button:hover, #logout:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } span#login_widget > .button:active, #logout:active, span#login_widget > .button.active, #logout.active, .open > .dropdown-togglespan#login_widget > .button, .open > .dropdown-toggle#logout { color: #333; background-color: #e6e6e6; border-color: #adadad; } span#login_widget > .button:active:hover, #logout:active:hover, span#login_widget > .button.active:hover, #logout.active:hover, .open > .dropdown-togglespan#login_widget > .button:hover, .open > .dropdown-toggle#logout:hover, span#login_widget > .button:active:focus, #logout:active:focus, span#login_widget > .button.active:focus, #logout.active:focus, .open > .dropdown-togglespan#login_widget > .button:focus, .open > .dropdown-toggle#logout:focus, span#login_widget > .button:active.focus, #logout:active.focus, span#login_widget > .button.active.focus, #logout.active.focus, .open > .dropdown-togglespan#login_widget > .button.focus, .open > .dropdown-toggle#logout.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } span#login_widget > .button:active, #logout:active, span#login_widget > .button.active, #logout.active, .open > .dropdown-togglespan#login_widget > .button, .open > .dropdown-toggle#logout { background-image: none; } span#login_widget > .button.disabled:hover, #logout.disabled:hover, span#login_widget > .button[disabled]:hover, #logout[disabled]:hover, fieldset[disabled] span#login_widget > .button:hover, fieldset[disabled] #logout:hover, span#login_widget > .button.disabled:focus, #logout.disabled:focus, span#login_widget > .button[disabled]:focus, #logout[disabled]:focus, fieldset[disabled] span#login_widget > .button:focus, fieldset[disabled] #logout:focus, span#login_widget > .button.disabled.focus, #logout.disabled.focus, span#login_widget > .button[disabled].focus, #logout[disabled].focus, fieldset[disabled] span#login_widget > .button.focus, fieldset[disabled] #logout.focus { background-color: #fff; border-color: #ccc; } span#login_widget > .button .badge, #logout .badge { color: #fff; background-color: #333; } .nav-header { text-transform: none; } #header > span { margin-top: 10px; } .modal_stretch .modal-dialog { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; min-height: 80vh; } .modal_stretch .modal-dialog .modal-body { max-height: calc(100vh - 200px); overflow: auto; flex: 1; } .modal-header { cursor: move; } @media (min-width: 768px) { .modal .modal-dialog { width: 700px; } } @media (min-width: 768px) { select.form-control { margin-left: 12px; margin-right: 12px; } } /*! * * IPython auth * */ .center-nav { display: inline-block; margin-bottom: -4px; } [dir="rtl"] .center-nav form.pull-left { float: right !important; float: right; } [dir="rtl"] .center-nav .navbar-text { float: right; } [dir="rtl"] .navbar-inner { text-align: right; } [dir="rtl"] div.text-left { text-align: right; } /*! * * IPython tree view * */ /* We need an invisible input field on top of the sentense*/ /* "Drag file onto the list ..." */ .alternate_upload { background-color: none; display: inline; } .alternate_upload.form { padding: 0; margin: 0; } .alternate_upload input.fileinput { position: absolute; display: block; width: 100%; height: 100%; overflow: hidden; cursor: pointer; opacity: 0; z-index: 2; } .alternate_upload .btn-xs > input.fileinput { margin: -1px -5px; } .alternate_upload .btn-upload { position: relative; height: 22px; } ::-webkit-file-upload-button { cursor: pointer; } /** * Primary styles * * Author: Jupyter Development Team */ ul#tabs { margin-bottom: 4px; } ul#tabs a { padding-top: 6px; padding-bottom: 4px; } [dir="rtl"] ul#tabs.nav-tabs > li { float: right; } [dir="rtl"] ul#tabs.nav.nav-tabs { padding-right: 0; } ul.breadcrumb a:focus, ul.breadcrumb a:hover { text-decoration: none; } ul.breadcrumb i.icon-home { font-size: 16px; margin-right: 4px; } ul.breadcrumb span { color: #5e5e5e; } .list_toolbar { padding: 4px 0 4px 0; vertical-align: middle; } .list_toolbar .tree-buttons { padding-top: 1px; } [dir="rtl"] .list_toolbar .tree-buttons .pull-right { float: left !important; float: left; } [dir="rtl"] .list_toolbar .col-sm-4, [dir="rtl"] .list_toolbar .col-sm-8 { float: right; } .dynamic-buttons { padding-top: 3px; display: inline-block; } .list_toolbar [class*="span"] { min-height: 24px; } .list_header { font-weight: bold; background-color: #eee; } .list_placeholder { font-weight: bold; padding-top: 4px; padding-bottom: 4px; padding-left: 7px; padding-right: 7px; } .list_container { margin-top: 4px; margin-bottom: 20px; border: 1px solid #ddd; border-radius: 2px; } .list_container > div { border-bottom: 1px solid #ddd; } .list_container > div:hover .list-item { background-color: red; } .list_container > div:last-child { border: none; } .list_item:hover .list_item { background-color: #ddd; } .list_item a { text-decoration: none; } .list_item:hover { background-color: #fafafa; } .list_header > div, .list_item > div { padding-top: 4px; padding-bottom: 4px; padding-left: 7px; padding-right: 7px; line-height: 22px; } .list_header > div input, .list_item > div input { margin-right: 7px; margin-left: 14px; vertical-align: text-bottom; line-height: 22px; position: relative; top: -1px; } .list_header > div .item_link, .list_item > div .item_link { margin-left: -1px; vertical-align: baseline; line-height: 22px; } [dir="rtl"] .list_item > div input { margin-right: 0; } .new-file input[type="checkbox"] { visibility: hidden; } .item_name { line-height: 22px; height: 24px; } .item_icon { font-size: 14px; color: #5e5e5e; margin-right: 7px; margin-left: 7px; line-height: 22px; vertical-align: baseline; } .item_modified { margin-right: 7px; margin-left: 7px; } [dir="rtl"] .item_modified.pull-right { float: left !important; float: left; } .item_buttons { line-height: 1em; margin-left: -5px; } .item_buttons .btn, .item_buttons .btn-group, .item_buttons .input-group { float: left; } .item_buttons > .btn, .item_buttons > .btn-group, .item_buttons > .input-group { margin-left: 5px; } .item_buttons .btn { min-width: 13ex; } .item_buttons .running-indicator { padding-top: 4px; color: #5cb85c; } .item_buttons .kernel-name { padding-top: 4px; color: #5bc0de; margin-right: 7px; float: left; } [dir="rtl"] .item_buttons.pull-right { float: left !important; float: left; } [dir="rtl"] .item_buttons .kernel-name { margin-left: 7px; float: right; } .toolbar_info { height: 24px; line-height: 24px; } .list_item input:not([type="checkbox"]) { padding-top: 3px; padding-bottom: 3px; height: 22px; line-height: 14px; margin: 0px; } .highlight_text { color: blue; } #project_name { display: inline-block; padding-left: 7px; margin-left: -2px; } #project_name > .breadcrumb { padding: 0px; margin-bottom: 0px; background-color: transparent; font-weight: bold; } .sort_button { display: inline-block; padding-left: 7px; } [dir="rtl"] .sort_button.pull-right { float: left !important; float: left; } #tree-selector { padding-right: 0px; } #button-select-all { min-width: 50px; } [dir="rtl"] #button-select-all.btn { float: right; } #select-all { margin-left: 7px; margin-right: 2px; margin-top: 2px; height: 16px; } [dir="rtl"] #select-all.pull-left { float: right !important; float: right; } .menu_icon { margin-right: 2px; } .tab-content .row { margin-left: 0px; margin-right: 0px; } .folder_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f114"; } .folder_icon:before.fa-pull-left { margin-right: 0.3em; } .folder_icon:before.fa-pull-right { margin-left: 0.3em; } .folder_icon:before.pull-left { margin-right: 0.3em; } .folder_icon:before.pull-right { margin-left: 0.3em; } .notebook_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f02d"; position: relative; top: -1px; } .notebook_icon:before.fa-pull-left { margin-right: 0.3em; } .notebook_icon:before.fa-pull-right { margin-left: 0.3em; } .notebook_icon:before.pull-left { margin-right: 0.3em; } .notebook_icon:before.pull-right { margin-left: 0.3em; } .running_notebook_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f02d"; position: relative; top: -1px; color: #5cb85c; } .running_notebook_icon:before.fa-pull-left { margin-right: 0.3em; } .running_notebook_icon:before.fa-pull-right { margin-left: 0.3em; } .running_notebook_icon:before.pull-left { margin-right: 0.3em; } .running_notebook_icon:before.pull-right { margin-left: 0.3em; } .file_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f016"; position: relative; top: -2px; } .file_icon:before.fa-pull-left { margin-right: 0.3em; } .file_icon:before.fa-pull-right { margin-left: 0.3em; } .file_icon:before.pull-left { margin-right: 0.3em; } .file_icon:before.pull-right { margin-left: 0.3em; } #notebook_toolbar .pull-right { padding-top: 0px; margin-right: -1px; } ul#new-menu { left: auto; right: 0; } #new-menu .dropdown-header { font-size: 10px; border-bottom: 1px solid #e5e5e5; padding: 0 0 3px; margin: -3px 20px 0; } .kernel-menu-icon { padding-right: 12px; width: 24px; content: "\f096"; } .kernel-menu-icon:before { content: "\f096"; } .kernel-menu-icon-current:before { content: "\f00c"; } #tab_content { padding-top: 20px; } #running .panel-group .panel { margin-top: 3px; margin-bottom: 1em; } #running .panel-group .panel .panel-heading { background-color: #eee; padding-top: 4px; padding-bottom: 4px; padding-left: 7px; padding-right: 7px; line-height: 22px; } #running .panel-group .panel .panel-heading a:focus, #running .panel-group .panel .panel-heading a:hover { text-decoration: none; } #running .panel-group .panel .panel-body { padding: 0px; } #running .panel-group .panel .panel-body .list_container { margin-top: 0px; margin-bottom: 0px; border: 0px; border-radius: 0px; } #running .panel-group .panel .panel-body .list_container .list_item { border-bottom: 1px solid #ddd; } #running .panel-group .panel .panel-body .list_container .list_item:last-child { border-bottom: 0px; } .delete-button { display: none; } .duplicate-button { display: none; } .rename-button { display: none; } .move-button { display: none; } .download-button { display: none; } .shutdown-button { display: none; } .dynamic-instructions { display: inline-block; padding-top: 4px; } /*! * * IPython text editor webapp * */ .selected-keymap i.fa { padding: 0px 5px; } .selected-keymap i.fa:before { content: "\f00c"; } #mode-menu { overflow: auto; max-height: 20em; } .edit_app #header { -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); } .edit_app #menubar .navbar { /* Use a negative 1 bottom margin, so the border overlaps the border of the header */ margin-bottom: -1px; } .dirty-indicator { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; width: 20px; } .dirty-indicator.fa-pull-left { margin-right: 0.3em; } .dirty-indicator.fa-pull-right { margin-left: 0.3em; } .dirty-indicator.pull-left { margin-right: 0.3em; } .dirty-indicator.pull-right { margin-left: 0.3em; } .dirty-indicator-dirty { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; width: 20px; } .dirty-indicator-dirty.fa-pull-left { margin-right: 0.3em; } .dirty-indicator-dirty.fa-pull-right { margin-left: 0.3em; } .dirty-indicator-dirty.pull-left { margin-right: 0.3em; } .dirty-indicator-dirty.pull-right { margin-left: 0.3em; } .dirty-indicator-clean { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; width: 20px; } .dirty-indicator-clean.fa-pull-left { margin-right: 0.3em; } .dirty-indicator-clean.fa-pull-right { margin-left: 0.3em; } .dirty-indicator-clean.pull-left { margin-right: 0.3em; } .dirty-indicator-clean.pull-right { margin-left: 0.3em; } .dirty-indicator-clean:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f00c"; } .dirty-indicator-clean:before.fa-pull-left { margin-right: 0.3em; } .dirty-indicator-clean:before.fa-pull-right { margin-left: 0.3em; } .dirty-indicator-clean:before.pull-left { margin-right: 0.3em; } .dirty-indicator-clean:before.pull-right { margin-left: 0.3em; } #filename { font-size: 16pt; display: table; padding: 0px 5px; } #current-mode { padding-left: 5px; padding-right: 5px; } #texteditor-backdrop { padding-top: 20px; padding-bottom: 20px; } @media not print { #texteditor-backdrop { background-color: #eee; } } @media print { #texteditor-backdrop #texteditor-container .CodeMirror-gutter, #texteditor-backdrop #texteditor-container .CodeMirror-gutters { background-color: #fff; } } @media not print { #texteditor-backdrop #texteditor-container .CodeMirror-gutter, #texteditor-backdrop #texteditor-container .CodeMirror-gutters { background-color: #fff; } } @media not print { #texteditor-backdrop #texteditor-container { padding: 0px; background-color: #fff; -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); } } .CodeMirror-dialog { background-color: #fff; } /*! * * IPython notebook * */ /* CSS font colors for translated ANSI escape sequences */ /* The color values are a mix of http://www.xcolors.net/dl/baskerville-ivorylight and http://www.xcolors.net/dl/euphrasia */ .ansi-black-fg { color: #3e424d; } .ansi-black-bg { background-color: #3e424d; } .ansi-black-intense-fg { color: #282c36; } .ansi-black-intense-bg { background-color: #282c36; } .ansi-red-fg { color: #e75c58; } .ansi-red-bg { background-color: #e75c58; } .ansi-red-intense-fg { color: #b22b31; } .ansi-red-intense-bg { background-color: #b22b31; } .ansi-green-fg { color: #00a250; } .ansi-green-bg { background-color: #00a250; } .ansi-green-intense-fg { color: #007427; } .ansi-green-intense-bg { background-color: #007427; } .ansi-yellow-fg { color: #ddb62b; } .ansi-yellow-bg { background-color: #ddb62b; } .ansi-yellow-intense-fg { color: #b27d12; } .ansi-yellow-intense-bg { background-color: #b27d12; } .ansi-blue-fg { color: #208ffb; } .ansi-blue-bg { background-color: #208ffb; } .ansi-blue-intense-fg { color: #0065ca; } .ansi-blue-intense-bg { background-color: #0065ca; } .ansi-magenta-fg { color: #d160c4; } .ansi-magenta-bg { background-color: #d160c4; } .ansi-magenta-intense-fg { color: #a03196; } .ansi-magenta-intense-bg { background-color: #a03196; } .ansi-cyan-fg { color: #60c6c8; } .ansi-cyan-bg { background-color: #60c6c8; } .ansi-cyan-intense-fg { color: #258f8f; } .ansi-cyan-intense-bg { background-color: #258f8f; } .ansi-white-fg { color: #c5c1b4; } .ansi-white-bg { background-color: #c5c1b4; } .ansi-white-intense-fg { color: #a1a6b2; } .ansi-white-intense-bg { background-color: #a1a6b2; } .ansi-default-inverse-fg { color: #ffffff; } .ansi-default-inverse-bg { background-color: #000000; } .ansi-bold { font-weight: bold; } .ansi-underline { text-decoration: underline; } /* The following styles are deprecated an will be removed in a future version */ .ansibold { font-weight: bold; } .ansi-inverse { outline: 0.5px dotted; } /* use dark versions for foreground, to improve visibility */ .ansiblack { color: black; } .ansired { color: darkred; } .ansigreen { color: darkgreen; } .ansiyellow { color: #c4a000; } .ansiblue { color: darkblue; } .ansipurple { color: darkviolet; } .ansicyan { color: steelblue; } .ansigray { color: gray; } /* and light for background, for the same reason */ .ansibgblack { background-color: black; } .ansibgred { background-color: red; } .ansibggreen { background-color: green; } .ansibgyellow { background-color: yellow; } .ansibgblue { background-color: blue; } .ansibgpurple { background-color: magenta; } .ansibgcyan { background-color: cyan; } .ansibggray { background-color: gray; } div.cell { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; border-radius: 2px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; border-width: 1px; border-style: solid; border-color: transparent; width: 100%; padding: 5px; /* This acts as a spacer between cells, that is outside the border */ margin: 0px; outline: none; position: relative; overflow: visible; } div.cell:before { position: absolute; display: block; top: -1px; left: -1px; width: 5px; height: calc(100% + 2px); content: ""; background: transparent; } div.cell.jupyter-soft-selected { border-left-color: #e3f2fd; border-left-width: 1px; padding-left: 5px; border-right-color: #e3f2fd; border-right-width: 1px; background: #e3f2fd; } @media print { div.cell.jupyter-soft-selected { border-color: transparent; } } div.cell.selected, div.cell.selected.jupyter-soft-selected { border-color: #ababab; } div.cell.selected:before, div.cell.selected.jupyter-soft-selected:before { position: absolute; display: block; top: -1px; left: -1px; width: 5px; height: calc(100% + 2px); content: ""; background: #42a5f5; } @media print { div.cell.selected, div.cell.selected.jupyter-soft-selected { border-color: transparent; } } .edit_mode div.cell.selected { border-color: #66bb6a; } .edit_mode div.cell.selected:before { position: absolute; display: block; top: -1px; left: -1px; width: 5px; height: calc(100% + 2px); content: ""; background: #66bb6a; } @media print { .edit_mode div.cell.selected { border-color: transparent; } } .prompt { /* This needs to be wide enough for 3 digit prompt numbers: In[100]: */ min-width: 14ex; /* This padding is tuned to match the padding on the CodeMirror editor. */ padding: 0.4em; margin: 0px; font-family: monospace; text-align: right; /* This has to match that of the the CodeMirror class line-height below */ line-height: 1.21429em; /* Don't highlight prompt number selection */ -webkit-touch-callout: none; -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; /* Use default cursor */ cursor: default; } @media (max-width: 540px) { .prompt { text-align: left; } } div.inner_cell { min-width: 0; /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; /* Old browsers */ -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; /* Modern browsers */ flex: 1; } /* input_area and input_prompt must match in top border and margin for alignment */ div.input_area { border: 1px solid #cfcfcf; border-radius: 2px; background: #f7f7f7; line-height: 1.21429em; } /* This is needed so that empty prompt areas can collapse to zero height when there is no content in the output_subarea and the prompt. The main purpose of this is to make sure that empty JavaScript output_subareas have no height. */ div.prompt:empty { padding-top: 0; padding-bottom: 0; } div.unrecognized_cell { padding: 5px 5px 5px 0px; /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; } div.unrecognized_cell .inner_cell { border-radius: 2px; padding: 5px; font-weight: bold; color: red; border: 1px solid #cfcfcf; background: #eaeaea; } div.unrecognized_cell .inner_cell a { color: inherit; text-decoration: none; } div.unrecognized_cell .inner_cell a:hover { color: inherit; text-decoration: none; } @media (max-width: 540px) { div.unrecognized_cell > div.prompt { display: none; } } div.code_cell { /* avoid page breaking on code cells when printing */ } @media print { div.code_cell { page-break-inside: avoid; } } /* any special styling for code cells that are currently running goes here */ div.input { page-break-inside: avoid; /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; } @media (max-width: 540px) { div.input { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; } } /* input_area and input_prompt must match in top border and margin for alignment */ div.input_prompt { color: #303f9f; border-top: 1px solid transparent; } div.input_area > div.highlight { margin: 0.4em; border: none; padding: 0px; background-color: transparent; } div.input_area > div.highlight > pre { margin: 0px; border: none; padding: 0px; background-color: transparent; } /* The following gets added to the if it is detected that the user has a * monospace font with inconsistent normal/bold/italic height. See * notebookmain.js. Such fonts will have keywords vertically offset with * respect to the rest of the text. The user should select a better font. * See: https://github.com/ipython/ipython/issues/1503 * * .CodeMirror span { * vertical-align: bottom; * } */ .CodeMirror { line-height: 1.21429em; /* Changed from 1em to our global default */ font-size: 14px; height: auto; /* Changed to auto to autogrow */ background: none; /* Changed from white to allow our bg to show through */ } .CodeMirror-scroll { /* The CodeMirror docs are a bit fuzzy on if overflow-y should be hidden or visible.*/ /* We have found that if it is visible, vertical scrollbars appear with font size changes.*/ overflow-y: hidden; overflow-x: auto; } .CodeMirror-lines { /* In CM2, this used to be 0.4em, but in CM3 it went to 4px. We need the em value because */ /* we have set a different line-height and want this to scale with that. */ /* Note that this should set vertical padding only, since CodeMirror assumes that horizontal padding will be set on CodeMirror pre */ padding: 0.4em 0; } .CodeMirror-linenumber { padding: 0 8px 0 4px; } .CodeMirror-gutters { border-bottom-left-radius: 2px; border-top-left-radius: 2px; } .CodeMirror pre { /* In CM3 this went to 4px from 0 in CM2. This sets horizontal padding only, use .CodeMirror-lines for vertical */ padding: 0 0.4em; border: 0; border-radius: 0; } .CodeMirror-cursor { border-left: 1.4px solid black; } @media screen and (min-width: 2138px) and (max-width: 4319px) { .CodeMirror-cursor { border-left: 2px solid black; } } @media screen and (min-width: 4320px) { .CodeMirror-cursor { border-left: 4px solid black; } } /* Original style from softwaremaniacs.org (c) Ivan Sagalaev Adapted from GitHub theme */ .highlight-base { color: #000; } .highlight-variable { color: #000; } .highlight-variable-2 { color: #1a1a1a; } .highlight-variable-3 { color: #333333; } .highlight-string { color: #ba2121; } .highlight-comment { color: #408080; font-style: italic; } .highlight-number { color: #080; } .highlight-atom { color: #88f; } .highlight-keyword { color: #008000; font-weight: bold; } .highlight-builtin { color: #008000; } .highlight-error { color: #f00; } .highlight-operator { color: #aa22ff; font-weight: bold; } .highlight-meta { color: #aa22ff; } /* previously not defined, copying from default codemirror */ .highlight-def { color: #00f; } .highlight-string-2 { color: #f50; } .highlight-qualifier { color: #555; } .highlight-bracket { color: #997; } .highlight-tag { color: #170; } .highlight-attribute { color: #00c; } .highlight-header { color: blue; } .highlight-quote { color: #090; } .highlight-link { color: #00c; } /* apply the same style to codemirror */ .cm-s-ipython span.cm-keyword { color: #008000; font-weight: bold; } .cm-s-ipython span.cm-atom { color: #88f; } .cm-s-ipython span.cm-number { color: #080; } .cm-s-ipython span.cm-def { color: #00f; } .cm-s-ipython span.cm-variable { color: #000; } .cm-s-ipython span.cm-operator { color: #aa22ff; font-weight: bold; } .cm-s-ipython span.cm-variable-2 { color: #1a1a1a; } .cm-s-ipython span.cm-variable-3 { color: #333333; } .cm-s-ipython span.cm-comment { color: #408080; font-style: italic; } .cm-s-ipython span.cm-string { color: #ba2121; } .cm-s-ipython span.cm-string-2 { color: #f50; } .cm-s-ipython span.cm-meta { color: #aa22ff; } .cm-s-ipython span.cm-qualifier { color: #555; } .cm-s-ipython span.cm-builtin { color: #008000; } .cm-s-ipython span.cm-bracket { color: #997; } .cm-s-ipython span.cm-tag { color: #170; } .cm-s-ipython span.cm-attribute { color: #00c; } .cm-s-ipython span.cm-header { color: blue; } .cm-s-ipython span.cm-quote { color: #090; } .cm-s-ipython span.cm-link { color: #00c; } .cm-s-ipython span.cm-error { color: #f00; } .cm-s-ipython span.cm-tab { background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAMCAYAAAAkuj5RAAAAAXNSR0IArs4c6QAAAGFJREFUSMft1LsRQFAQheHPowAKoACx3IgEKtaEHujDjORSgWTH/ZOdnZOcM/sgk/kFFWY0qV8foQwS4MKBCS3qR6ixBJvElOobYAtivseIE120FaowJPN75GMu8j/LfMwNjh4HUpwg4LUAAAAASUVORK5CYII=); background-position: right; background-repeat: no-repeat; } div.output_wrapper { /* this position must be relative to enable descendents to be absolute within it */ position: relative; /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; z-index: 1; } /* class for the output area when it should be height-limited */ div.output_scroll { /* ideally, this would be max-height, but FF barfs all over that */ height: 24em; /* FF needs this *and the wrapper* to specify full width, or it will shrinkwrap */ width: 100%; overflow: auto; border-radius: 2px; -webkit-box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8); box-shadow: inset 0 2px 8px rgba(0, 0, 0, 0.8); display: block; } /* output div while it is collapsed */ div.output_collapsed { margin: 0px; padding: 0px; /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; } div.out_prompt_overlay { height: 100%; padding: 0px 0.4em; position: absolute; border-radius: 2px; } div.out_prompt_overlay:hover { /* use inner shadow to get border that is computed the same on WebKit/FF */ -webkit-box-shadow: inset 0 0 1px #000; box-shadow: inset 0 0 1px #000; background: rgba(240, 240, 240, 0.5); } div.output_prompt { color: #d84315; } /* This class is the outer container of all output sections. */ div.output_area { padding: 0px; page-break-inside: avoid; /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; } div.output_area .MathJax_Display { text-align: left !important; } div.output_area .rendered_html table { margin-left: 0; margin-right: 0; } div.output_area .rendered_html img { margin-left: 0; margin-right: 0; } div.output_area img, div.output_area svg { max-width: 100%; height: auto; } div.output_area img.unconfined, div.output_area svg.unconfined { max-width: none; } div.output_area .mglyph > img { max-width: none; } /* This is needed to protect the pre formating from global settings such as that of bootstrap */ .output { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; } @media (max-width: 540px) { div.output_area { /* Old browsers */ display: -webkit-box; -webkit-box-orient: vertical; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: vertical; -moz-box-align: stretch; display: box; box-orient: vertical; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: column; align-items: stretch; } } div.output_area pre { margin: 0; padding: 1px 0 1px 0; border: 0; vertical-align: baseline; color: black; background-color: transparent; border-radius: 0; } /* This class is for the output subarea inside the output_area and after the prompt div. */ div.output_subarea { overflow-x: auto; padding: 0.4em; /* Old browsers */ -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; /* Modern browsers */ flex: 1; max-width: calc(100% - 14ex); } div.output_scroll div.output_subarea { overflow-x: visible; } /* The rest of the output_* classes are for special styling of the different output types */ /* all text output has this class: */ div.output_text { text-align: left; color: #000; /* This has to match that of the the CodeMirror class line-height below */ line-height: 1.21429em; } /* stdout/stderr are 'text' as well as 'stream', but execute_result/error are *not* streams */ div.output_stderr { background: #fdd; /* very light red background for stderr */ } div.output_latex { text-align: left; } /* Empty output_javascript divs should have no height */ div.output_javascript:empty { padding: 0; } .js-error { color: darkred; } /* raw_input styles */ div.raw_input_container { line-height: 1.21429em; padding-top: 5px; } pre.raw_input_prompt { /* nothing needed here. */ } input.raw_input { font-family: monospace; font-size: inherit; color: inherit; width: auto; /* make sure input baseline aligns with prompt */ vertical-align: baseline; /* padding + margin = 0.5em between prompt and cursor */ padding: 0em 0.25em; margin: 0em 0.25em; } input.raw_input:focus { box-shadow: none; } p.p-space { margin-bottom: 10px; } div.output_unrecognized { padding: 5px; font-weight: bold; color: red; } div.output_unrecognized a { color: inherit; text-decoration: none; } div.output_unrecognized a:hover { color: inherit; text-decoration: none; } .rendered_html { color: #000; /* any extras will just be numbers: */ } .rendered_html em { font-style: italic; } .rendered_html strong { font-weight: bold; } .rendered_html u { text-decoration: underline; } .rendered_html :link { text-decoration: underline; } .rendered_html :visited { text-decoration: underline; } .rendered_html h1 { font-size: 185.7%; margin: 1.08em 0 0 0; font-weight: bold; line-height: 1; } .rendered_html h2 { font-size: 157.1%; margin: 1.27em 0 0 0; font-weight: bold; line-height: 1; } .rendered_html h3 { font-size: 128.6%; margin: 1.55em 0 0 0; font-weight: bold; line-height: 1; } .rendered_html h4 { font-size: 100%; margin: 2em 0 0 0; font-weight: bold; line-height: 1; } .rendered_html h5 { font-size: 100%; margin: 2em 0 0 0; font-weight: bold; line-height: 1; font-style: italic; } .rendered_html h6 { font-size: 100%; margin: 2em 0 0 0; font-weight: bold; line-height: 1; font-style: italic; } .rendered_html h1:first-child { margin-top: 0.538em; } .rendered_html h2:first-child { margin-top: 0.636em; } .rendered_html h3:first-child { margin-top: 0.777em; } .rendered_html h4:first-child { margin-top: 1em; } .rendered_html h5:first-child { margin-top: 1em; } .rendered_html h6:first-child { margin-top: 1em; } .rendered_html ul:not(.list-inline), .rendered_html ol:not(.list-inline) { padding-left: 2em; } .rendered_html ul { list-style: disc; } .rendered_html ul ul { list-style: square; margin-top: 0; } .rendered_html ul ul ul { list-style: circle; } .rendered_html ol { list-style: decimal; } .rendered_html ol ol { list-style: upper-alpha; margin-top: 0; } .rendered_html ol ol ol { list-style: lower-alpha; } .rendered_html ol ol ol ol { list-style: lower-roman; } .rendered_html ol ol ol ol ol { list-style: decimal; } .rendered_html * + ul { margin-top: 1em; } .rendered_html * + ol { margin-top: 1em; } .rendered_html hr { color: black; background-color: black; } .rendered_html pre { margin: 1em 2em; padding: 0px; background-color: #fff; } .rendered_html code { background-color: #eff0f1; } .rendered_html p code { padding: 1px 5px; } .rendered_html pre code { background-color: #fff; } .rendered_html pre, .rendered_html code { border: 0; color: #000; font-size: 100%; } .rendered_html blockquote { margin: 1em 2em; } .rendered_html table { margin-left: auto; margin-right: auto; border: none; border-collapse: collapse; border-spacing: 0; color: black; font-size: 12px; table-layout: fixed; } .rendered_html thead { border-bottom: 1px solid black; vertical-align: bottom; } .rendered_html tr, .rendered_html th, .rendered_html td { text-align: right; vertical-align: middle; padding: 0.5em 0.5em; line-height: normal; white-space: normal; max-width: none; border: none; } .rendered_html th { font-weight: bold; } .rendered_html tbody tr:nth-child(odd) { background: #f5f5f5; } .rendered_html tbody tr:hover { background: rgba(66, 165, 245, 0.2); } .rendered_html * + table { margin-top: 1em; } .rendered_html p { text-align: left; } .rendered_html * + p { margin-top: 1em; } .rendered_html img { display: block; margin-left: auto; margin-right: auto; } .rendered_html * + img { margin-top: 1em; } .rendered_html img, .rendered_html svg { max-width: 100%; height: auto; } .rendered_html img.unconfined, .rendered_html svg.unconfined { max-width: none; } .rendered_html .alert { margin-bottom: initial; } .rendered_html * + .alert { margin-top: 1em; } [dir="rtl"] .rendered_html p { text-align: right; } div.text_cell { /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; } @media (max-width: 540px) { div.text_cell > div.prompt { display: none; } } div.text_cell_render { /*font-family: "Helvetica Neue", Arial, Helvetica, Geneva, sans-serif;*/ outline: none; resize: none; width: inherit; border-style: none; padding: 0.5em 0.5em 0.5em 0.4em; color: #000; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } a.anchor-link:link { text-decoration: none; padding: 0px 20px; visibility: hidden; } h1:hover .anchor-link, h2:hover .anchor-link, h3:hover .anchor-link, h4:hover .anchor-link, h5:hover .anchor-link, h6:hover .anchor-link { visibility: visible; } .text_cell.rendered .input_area { display: none; } .text_cell.rendered .rendered_html { overflow-x: auto; overflow-y: hidden; } .text_cell.rendered .rendered_html tr, .text_cell.rendered .rendered_html th, .text_cell.rendered .rendered_html td { max-width: none; } .text_cell.unrendered .text_cell_render { display: none; } .text_cell .dropzone .input_area { border: 2px dashed #bababa; margin: -1px; } .cm-header-1, .cm-header-2, .cm-header-3, .cm-header-4, .cm-header-5, .cm-header-6 { font-weight: bold; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } .cm-header-1 { font-size: 185.7%; } .cm-header-2 { font-size: 157.1%; } .cm-header-3 { font-size: 128.6%; } .cm-header-4 { font-size: 110%; } .cm-header-5 { font-size: 100%; font-style: italic; } .cm-header-6 { font-size: 100%; font-style: italic; } /*! * * IPython notebook webapp * */ @media (max-width: 767px) { .notebook_app { padding-left: 0px; padding-right: 0px; } } #ipython-main-app { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; height: 100%; } div#notebook_panel { margin: 0px; padding: 0px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; height: 100%; } div#notebook { font-size: 14px; line-height: 20px; overflow-y: hidden; overflow-x: auto; width: 100%; /* This spaces the page away from the edge of the notebook area */ padding-top: 20px; margin: 0px; outline: none; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; min-height: 100%; } @media not print { #notebook-container { padding: 15px; background-color: #fff; min-height: 0; -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); } } @media print { #notebook-container { width: 100%; } } div.ui-widget-content { border: 1px solid #ababab; outline: none; } pre.dialog { background-color: #f7f7f7; border: 1px solid #ddd; border-radius: 2px; padding: 0.4em; padding-left: 2em; } p.dialog { padding: 0.2em; } /* Word-wrap output correctly. This is the CSS3 spelling, though Firefox seems to not honor it correctly. Webkit browsers (Chrome, rekonq, Safari) do. */ pre, code, kbd, samp { white-space: pre-wrap; } #fonttest { font-family: monospace; } p { margin-bottom: 0; } .end_space { min-height: 100px; transition: height 0.2s ease; } .notebook_app > #header { -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); } @media not print { .notebook_app { background-color: #eee; } } kbd { border-style: solid; border-width: 1px; box-shadow: none; margin: 2px; padding-left: 2px; padding-right: 2px; padding-top: 1px; padding-bottom: 1px; } .jupyter-keybindings { padding: 1px; line-height: 24px; border-bottom: 1px solid gray; } .jupyter-keybindings input { margin: 0; padding: 0; border: none; } .jupyter-keybindings i { padding: 6px; } .well code { background-color: #ffffff; border-color: #ababab; border-width: 1px; border-style: solid; padding: 2px; padding-top: 1px; padding-bottom: 1px; } /* CSS for the cell toolbar */ .celltoolbar { border: thin solid #cfcfcf; border-bottom: none; background: #eee; border-radius: 2px 2px 0px 0px; width: 100%; height: 29px; padding-right: 4px; /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; /* Old browsers */ -webkit-box-pack: end; -moz-box-pack: end; box-pack: end; /* Modern browsers */ justify-content: flex-end; display: -webkit-flex; } @media print { .celltoolbar { display: none; } } .ctb_hideshow { display: none; vertical-align: bottom; } /* ctb_show is added to the ctb_hideshow div to show the cell toolbar. Cell toolbars are only shown when the ctb_global_show class is also set. */ .ctb_global_show .ctb_show.ctb_hideshow { display: block; } .ctb_global_show .ctb_show + .input_area, .ctb_global_show .ctb_show + div.text_cell_input, .ctb_global_show .ctb_show ~ div.text_cell_render { border-top-right-radius: 0px; border-top-left-radius: 0px; } .ctb_global_show .ctb_show ~ div.text_cell_render { border: 1px solid #cfcfcf; } .celltoolbar { font-size: 87%; padding-top: 3px; } .celltoolbar select { display: block; width: 100%; height: 32px; padding: 6px 12px; font-size: 13px; line-height: 1.42857143; color: #555555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 2px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; width: inherit; font-size: inherit; height: 22px; padding: 0px; display: inline-block; } .celltoolbar select:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } .celltoolbar select::-moz-placeholder { color: #999; opacity: 1; } .celltoolbar select:-ms-input-placeholder { color: #999; } .celltoolbar select::-webkit-input-placeholder { color: #999; } .celltoolbar select::-ms-expand { border: 0; background-color: transparent; } .celltoolbar select[disabled], .celltoolbar select[readonly], fieldset[disabled] .celltoolbar select { background-color: #eeeeee; opacity: 1; } .celltoolbar select[disabled], fieldset[disabled] .celltoolbar select { cursor: not-allowed; } textarea.celltoolbar select { height: auto; } select.celltoolbar select { height: 30px; line-height: 30px; } textarea.celltoolbar select, select[multiple].celltoolbar select { height: auto; } .celltoolbar label { margin-left: 5px; margin-right: 5px; } .tags_button_container { width: 100%; display: flex; } .tag-container { display: flex; flex-direction: row; flex-grow: 1; overflow: hidden; position: relative; } .tag-container > * { margin: 0 4px; } .remove-tag-btn { margin-left: 4px; } .tags-input { display: flex; } .cell-tag:last-child:after { content: ""; position: absolute; right: 0; width: 40px; height: 100%; /* Fade to background color of cell toolbar */ background: linear-gradient(to right, rgba(0, 0, 0, 0), #eee); } .tags-input > * { margin-left: 4px; } .cell-tag, .tags-input input, .tags-input button { display: block; width: 100%; height: 32px; padding: 6px 12px; font-size: 13px; line-height: 1.42857143; color: #555555; background-color: #fff; background-image: none; border: 1px solid #ccc; border-radius: 2px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 1px; box-shadow: none; width: inherit; font-size: inherit; height: 22px; line-height: 22px; padding: 0px 4px; display: inline-block; } .cell-tag:focus, .tags-input input:focus, .tags-input button:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } .cell-tag::-moz-placeholder, .tags-input input::-moz-placeholder, .tags-input button::-moz-placeholder { color: #999; opacity: 1; } .cell-tag:-ms-input-placeholder, .tags-input input:-ms-input-placeholder, .tags-input button:-ms-input-placeholder { color: #999; } .cell-tag::-webkit-input-placeholder, .tags-input input::-webkit-input-placeholder, .tags-input button::-webkit-input-placeholder { color: #999; } .cell-tag::-ms-expand, .tags-input input::-ms-expand, .tags-input button::-ms-expand { border: 0; background-color: transparent; } .cell-tag[disabled], .tags-input input[disabled], .tags-input button[disabled], .cell-tag[readonly], .tags-input input[readonly], .tags-input button[readonly], fieldset[disabled] .cell-tag, fieldset[disabled] .tags-input input, fieldset[disabled] .tags-input button { background-color: #eeeeee; opacity: 1; } .cell-tag[disabled], .tags-input input[disabled], .tags-input button[disabled], fieldset[disabled] .cell-tag, fieldset[disabled] .tags-input input, fieldset[disabled] .tags-input button { cursor: not-allowed; } textarea.cell-tag, textarea.tags-input input, textarea.tags-input button { height: auto; } select.cell-tag, select.tags-input input, select.tags-input button { height: 30px; line-height: 30px; } textarea.cell-tag, textarea.tags-input input, textarea.tags-input button, select[multiple].cell-tag, select[multiple].tags-input input, select[multiple].tags-input button { height: auto; } .cell-tag, .tags-input button { padding: 0px 4px; } .cell-tag { background-color: #fff; white-space: nowrap; } .tags-input input[type="text"]:focus { outline: none; box-shadow: none; border-color: #ccc; } .completions { position: absolute; z-index: 110; overflow: hidden; border: 1px solid #ababab; border-radius: 2px; -webkit-box-shadow: 0px 6px 10px -1px #adadad; box-shadow: 0px 6px 10px -1px #adadad; line-height: 1; } .completions select { background: white; outline: none; border: none; padding: 0px; margin: 0px; overflow: auto; font-family: monospace; font-size: 110%; color: #000; width: auto; } .completions select option.context { color: #286090; } #kernel_logo_widget .current_kernel_logo { display: none; margin-top: -1px; margin-bottom: -1px; width: 32px; height: 32px; } [dir="rtl"] #kernel_logo_widget { float: left !important; float: left; } .modal .modal-body .move-path { display: flex; flex-direction: row; justify-content: space; align-items: center; } .modal .modal-body .move-path .server-root { padding-right: 20px; } .modal .modal-body .move-path .path-input { flex: 1; } #menubar { box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; margin-top: 1px; } #menubar .navbar { border-top: 1px; border-radius: 0px 0px 2px 2px; margin-bottom: 0px; } #menubar .navbar-toggle { float: left; padding-top: 7px; padding-bottom: 7px; border: none; } #menubar .navbar-collapse { clear: left; } [dir="rtl"] #menubar .navbar-toggle { float: right; } [dir="rtl"] #menubar .navbar-collapse { clear: right; } [dir="rtl"] #menubar .navbar-nav { float: right; } [dir="rtl"] #menubar .nav { padding-right: 0px; } [dir="rtl"] #menubar .navbar-nav > li { float: right; } [dir="rtl"] #menubar .navbar-right { float: left !important; } [dir="rtl"] ul.dropdown-menu { text-align: right; left: auto; } [dir="rtl"] ul#new-menu.dropdown-menu { right: auto; left: 0; } .nav-wrapper { border-bottom: 1px solid #e7e7e7; } i.menu-icon { padding-top: 4px; } [dir="rtl"] i.menu-icon.pull-right { float: left !important; float: left; } ul#help_menu li a { overflow: hidden; padding-right: 2.2em; } ul#help_menu li a i { margin-right: -1.2em; } [dir="rtl"] ul#help_menu li a { padding-left: 2.2em; } [dir="rtl"] ul#help_menu li a i { margin-right: 0; margin-left: -1.2em; } [dir="rtl"] ul#help_menu li a i.pull-right { float: left !important; float: left; } .dropdown-submenu { position: relative; } .dropdown-submenu > .dropdown-menu { top: 0; left: 100%; margin-top: -6px; margin-left: -1px; } [dir="rtl"] .dropdown-submenu > .dropdown-menu { right: 100%; margin-right: -1px; } .dropdown-submenu:hover > .dropdown-menu { display: block; } .dropdown-submenu > a:after { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; display: block; content: "\f0da"; float: right; color: #333333; margin-top: 2px; margin-right: -10px; } .dropdown-submenu > a:after.fa-pull-left { margin-right: 0.3em; } .dropdown-submenu > a:after.fa-pull-right { margin-left: 0.3em; } .dropdown-submenu > a:after.pull-left { margin-right: 0.3em; } .dropdown-submenu > a:after.pull-right { margin-left: 0.3em; } [dir="rtl"] .dropdown-submenu > a:after { float: left; content: "\f0d9"; margin-right: 0; margin-left: -10px; } .dropdown-submenu:hover > a:after { color: #262626; } .dropdown-submenu.pull-left { float: none; } .dropdown-submenu.pull-left > .dropdown-menu { left: -100%; margin-left: 10px; } #notification_area { float: right !important; float: right; z-index: 10; } [dir="rtl"] #notification_area { float: left !important; float: left; } .indicator_area { float: right !important; float: right; color: #777; margin-left: 5px; margin-right: 5px; width: 11px; z-index: 10; text-align: center; width: auto; } [dir="rtl"] .indicator_area { float: left !important; float: left; } #kernel_indicator { float: right !important; float: right; color: #777; margin-left: 5px; margin-right: 5px; width: 11px; z-index: 10; text-align: center; width: auto; border-left: 1px solid; } #kernel_indicator .kernel_indicator_name { padding-left: 5px; padding-right: 5px; } [dir="rtl"] #kernel_indicator { float: left !important; float: left; border-left: 0; border-right: 1px solid; } #modal_indicator { float: right !important; float: right; color: #777; margin-left: 5px; margin-right: 5px; width: 11px; z-index: 10; text-align: center; width: auto; } [dir="rtl"] #modal_indicator { float: left !important; float: left; } #readonly-indicator { float: right !important; float: right; color: #777; margin-left: 5px; margin-right: 5px; width: 11px; z-index: 10; text-align: center; width: auto; margin-top: 2px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; display: none; } .modal_indicator:before { width: 1.28571429em; text-align: center; } .edit_mode .modal_indicator:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f040"; } .edit_mode .modal_indicator:before.fa-pull-left { margin-right: 0.3em; } .edit_mode .modal_indicator:before.fa-pull-right { margin-left: 0.3em; } .edit_mode .modal_indicator:before.pull-left { margin-right: 0.3em; } .edit_mode .modal_indicator:before.pull-right { margin-left: 0.3em; } .command_mode .modal_indicator:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: " "; } .command_mode .modal_indicator:before.fa-pull-left { margin-right: 0.3em; } .command_mode .modal_indicator:before.fa-pull-right { margin-left: 0.3em; } .command_mode .modal_indicator:before.pull-left { margin-right: 0.3em; } .command_mode .modal_indicator:before.pull-right { margin-left: 0.3em; } .kernel_idle_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f10c"; } .kernel_idle_icon:before.fa-pull-left { margin-right: 0.3em; } .kernel_idle_icon:before.fa-pull-right { margin-left: 0.3em; } .kernel_idle_icon:before.pull-left { margin-right: 0.3em; } .kernel_idle_icon:before.pull-right { margin-left: 0.3em; } .kernel_busy_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f111"; } .kernel_busy_icon:before.fa-pull-left { margin-right: 0.3em; } .kernel_busy_icon:before.fa-pull-right { margin-left: 0.3em; } .kernel_busy_icon:before.pull-left { margin-right: 0.3em; } .kernel_busy_icon:before.pull-right { margin-left: 0.3em; } .kernel_dead_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f1e2"; } .kernel_dead_icon:before.fa-pull-left { margin-right: 0.3em; } .kernel_dead_icon:before.fa-pull-right { margin-left: 0.3em; } .kernel_dead_icon:before.pull-left { margin-right: 0.3em; } .kernel_dead_icon:before.pull-right { margin-left: 0.3em; } .kernel_disconnected_icon:before { display: inline-block; font: normal normal normal 14px/1 FontAwesome; font-size: inherit; text-rendering: auto; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; content: "\f127"; } .kernel_disconnected_icon:before.fa-pull-left { margin-right: 0.3em; } .kernel_disconnected_icon:before.fa-pull-right { margin-left: 0.3em; } .kernel_disconnected_icon:before.pull-left { margin-right: 0.3em; } .kernel_disconnected_icon:before.pull-right { margin-left: 0.3em; } .notification_widget { color: #777; z-index: 10; background: rgba(240, 240, 240, 0.5); margin-right: 4px; color: #333; background-color: #fff; border-color: #ccc; } .notification_widget:focus, .notification_widget.focus { color: #333; background-color: #e6e6e6; border-color: #8c8c8c; } .notification_widget:hover { color: #333; background-color: #e6e6e6; border-color: #adadad; } .notification_widget:active, .notification_widget.active, .open > .dropdown-toggle.notification_widget { color: #333; background-color: #e6e6e6; border-color: #adadad; } .notification_widget:active:hover, .notification_widget.active:hover, .open > .dropdown-toggle.notification_widget:hover, .notification_widget:active:focus, .notification_widget.active:focus, .open > .dropdown-toggle.notification_widget:focus, .notification_widget:active.focus, .notification_widget.active.focus, .open > .dropdown-toggle.notification_widget.focus { color: #333; background-color: #d4d4d4; border-color: #8c8c8c; } .notification_widget:active, .notification_widget.active, .open > .dropdown-toggle.notification_widget { background-image: none; } .notification_widget.disabled:hover, .notification_widget[disabled]:hover, fieldset[disabled] .notification_widget:hover, .notification_widget.disabled:focus, .notification_widget[disabled]:focus, fieldset[disabled] .notification_widget:focus, .notification_widget.disabled.focus, .notification_widget[disabled].focus, fieldset[disabled] .notification_widget.focus { background-color: #fff; border-color: #ccc; } .notification_widget .badge { color: #fff; background-color: #333; } .notification_widget.warning { color: #fff; background-color: #f0ad4e; border-color: #eea236; } .notification_widget.warning:focus, .notification_widget.warning.focus { color: #fff; background-color: #ec971f; border-color: #985f0d; } .notification_widget.warning:hover { color: #fff; background-color: #ec971f; border-color: #d58512; } .notification_widget.warning:active, .notification_widget.warning.active, .open > .dropdown-toggle.notification_widget.warning { color: #fff; background-color: #ec971f; border-color: #d58512; } .notification_widget.warning:active:hover, .notification_widget.warning.active:hover, .open > .dropdown-toggle.notification_widget.warning:hover, .notification_widget.warning:active:focus, .notification_widget.warning.active:focus, .open > .dropdown-toggle.notification_widget.warning:focus, .notification_widget.warning:active.focus, .notification_widget.warning.active.focus, .open > .dropdown-toggle.notification_widget.warning.focus { color: #fff; background-color: #d58512; border-color: #985f0d; } .notification_widget.warning:active, .notification_widget.warning.active, .open > .dropdown-toggle.notification_widget.warning { background-image: none; } .notification_widget.warning.disabled:hover, .notification_widget.warning[disabled]:hover, fieldset[disabled] .notification_widget.warning:hover, .notification_widget.warning.disabled:focus, .notification_widget.warning[disabled]:focus, fieldset[disabled] .notification_widget.warning:focus, .notification_widget.warning.disabled.focus, .notification_widget.warning[disabled].focus, fieldset[disabled] .notification_widget.warning.focus { background-color: #f0ad4e; border-color: #eea236; } .notification_widget.warning .badge { color: #f0ad4e; background-color: #fff; } .notification_widget.success { color: #fff; background-color: #5cb85c; border-color: #4cae4c; } .notification_widget.success:focus, .notification_widget.success.focus { color: #fff; background-color: #449d44; border-color: #255625; } .notification_widget.success:hover { color: #fff; background-color: #449d44; border-color: #398439; } .notification_widget.success:active, .notification_widget.success.active, .open > .dropdown-toggle.notification_widget.success { color: #fff; background-color: #449d44; border-color: #398439; } .notification_widget.success:active:hover, .notification_widget.success.active:hover, .open > .dropdown-toggle.notification_widget.success:hover, .notification_widget.success:active:focus, .notification_widget.success.active:focus, .open > .dropdown-toggle.notification_widget.success:focus, .notification_widget.success:active.focus, .notification_widget.success.active.focus, .open > .dropdown-toggle.notification_widget.success.focus { color: #fff; background-color: #398439; border-color: #255625; } .notification_widget.success:active, .notification_widget.success.active, .open > .dropdown-toggle.notification_widget.success { background-image: none; } .notification_widget.success.disabled:hover, .notification_widget.success[disabled]:hover, fieldset[disabled] .notification_widget.success:hover, .notification_widget.success.disabled:focus, .notification_widget.success[disabled]:focus, fieldset[disabled] .notification_widget.success:focus, .notification_widget.success.disabled.focus, .notification_widget.success[disabled].focus, fieldset[disabled] .notification_widget.success.focus { background-color: #5cb85c; border-color: #4cae4c; } .notification_widget.success .badge { color: #5cb85c; background-color: #fff; } .notification_widget.info { color: #fff; background-color: #5bc0de; border-color: #46b8da; } .notification_widget.info:focus, .notification_widget.info.focus { color: #fff; background-color: #31b0d5; border-color: #1b6d85; } .notification_widget.info:hover { color: #fff; background-color: #31b0d5; border-color: #269abc; } .notification_widget.info:active, .notification_widget.info.active, .open > .dropdown-toggle.notification_widget.info { color: #fff; background-color: #31b0d5; border-color: #269abc; } .notification_widget.info:active:hover, .notification_widget.info.active:hover, .open > .dropdown-toggle.notification_widget.info:hover, .notification_widget.info:active:focus, .notification_widget.info.active:focus, .open > .dropdown-toggle.notification_widget.info:focus, .notification_widget.info:active.focus, .notification_widget.info.active.focus, .open > .dropdown-toggle.notification_widget.info.focus { color: #fff; background-color: #269abc; border-color: #1b6d85; } .notification_widget.info:active, .notification_widget.info.active, .open > .dropdown-toggle.notification_widget.info { background-image: none; } .notification_widget.info.disabled:hover, .notification_widget.info[disabled]:hover, fieldset[disabled] .notification_widget.info:hover, .notification_widget.info.disabled:focus, .notification_widget.info[disabled]:focus, fieldset[disabled] .notification_widget.info:focus, .notification_widget.info.disabled.focus, .notification_widget.info[disabled].focus, fieldset[disabled] .notification_widget.info.focus { background-color: #5bc0de; border-color: #46b8da; } .notification_widget.info .badge { color: #5bc0de; background-color: #fff; } .notification_widget.danger { color: #fff; background-color: #d9534f; border-color: #d43f3a; } .notification_widget.danger:focus, .notification_widget.danger.focus { color: #fff; background-color: #c9302c; border-color: #761c19; } .notification_widget.danger:hover { color: #fff; background-color: #c9302c; border-color: #ac2925; } .notification_widget.danger:active, .notification_widget.danger.active, .open > .dropdown-toggle.notification_widget.danger { color: #fff; background-color: #c9302c; border-color: #ac2925; } .notification_widget.danger:active:hover, .notification_widget.danger.active:hover, .open > .dropdown-toggle.notification_widget.danger:hover, .notification_widget.danger:active:focus, .notification_widget.danger.active:focus, .open > .dropdown-toggle.notification_widget.danger:focus, .notification_widget.danger:active.focus, .notification_widget.danger.active.focus, .open > .dropdown-toggle.notification_widget.danger.focus { color: #fff; background-color: #ac2925; border-color: #761c19; } .notification_widget.danger:active, .notification_widget.danger.active, .open > .dropdown-toggle.notification_widget.danger { background-image: none; } .notification_widget.danger.disabled:hover, .notification_widget.danger[disabled]:hover, fieldset[disabled] .notification_widget.danger:hover, .notification_widget.danger.disabled:focus, .notification_widget.danger[disabled]:focus, fieldset[disabled] .notification_widget.danger:focus, .notification_widget.danger.disabled.focus, .notification_widget.danger[disabled].focus, fieldset[disabled] .notification_widget.danger.focus { background-color: #d9534f; border-color: #d43f3a; } .notification_widget.danger .badge { color: #d9534f; background-color: #fff; } div#pager { background-color: #fff; font-size: 14px; line-height: 20px; overflow: hidden; display: none; position: fixed; bottom: 0px; width: 100%; max-height: 50%; padding-top: 8px; -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); /* Display over codemirror */ z-index: 100; /* Hack which prevents jquery ui resizable from changing top. */ top: auto !important; } div#pager pre { line-height: 1.21429em; color: #000; background-color: #f7f7f7; padding: 0.4em; } div#pager #pager-button-area { position: absolute; top: 8px; right: 20px; } div#pager #pager-contents { position: relative; overflow: auto; width: 100%; height: 100%; } div#pager #pager-contents #pager-container { position: relative; padding: 15px 0px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } div#pager .ui-resizable-handle { top: 0px; height: 8px; background: #f7f7f7; border-top: 1px solid #cfcfcf; border-bottom: 1px solid #cfcfcf; /* This injects handle bars (a short, wide = symbol) for the resize handle. */ } div#pager .ui-resizable-handle::after { content: ""; top: 2px; left: 50%; height: 3px; width: 30px; margin-left: -15px; position: absolute; border-top: 1px solid #cfcfcf; } .quickhelp { /* Old browsers */ display: -webkit-box; -webkit-box-orient: horizontal; -webkit-box-align: stretch; display: -moz-box; -moz-box-orient: horizontal; -moz-box-align: stretch; display: box; box-orient: horizontal; box-align: stretch; /* Modern browsers */ display: flex; flex-direction: row; align-items: stretch; line-height: 1.8em; } .shortcut_key { display: inline-block; width: 21ex; text-align: right; font-family: monospace; } .shortcut_descr { display: inline-block; /* Old browsers */ -webkit-box-flex: 1; -moz-box-flex: 1; box-flex: 1; /* Modern browsers */ flex: 1; } span.save_widget { height: 30px; margin-top: 4px; display: flex; justify-content: flex-start; align-items: baseline; width: 50%; flex: 1; } span.save_widget span.filename { height: 100%; line-height: 1em; margin-left: 16px; border: none; font-size: 146.5%; text-overflow: ellipsis; overflow: hidden; white-space: nowrap; border-radius: 2px; } span.save_widget span.filename:hover { background-color: #e6e6e6; } [dir="rtl"] span.save_widget.pull-left { float: right !important; float: right; } [dir="rtl"] span.save_widget span.filename { margin-left: 0; margin-right: 16px; } span.checkpoint_status, span.autosave_status { font-size: small; white-space: nowrap; padding: 0 5px; } @media (max-width: 767px) { span.save_widget { font-size: small; padding: 0 0 0 5px; } span.checkpoint_status, span.autosave_status { display: none; } } @media (min-width: 768px) and (max-width: 991px) { span.checkpoint_status { display: none; } span.autosave_status { font-size: x-small; } } .toolbar { padding: 0px; margin-left: -5px; margin-top: 2px; margin-bottom: 5px; box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box; } .toolbar select, .toolbar label { width: auto; vertical-align: middle; margin-right: 2px; margin-bottom: 0px; display: inline; font-size: 92%; margin-left: 0.3em; margin-right: 0.3em; padding: 0px; padding-top: 3px; } .toolbar .btn { padding: 2px 8px; } .toolbar .btn-group { margin-top: 0px; margin-left: 5px; } .toolbar-btn-label { margin-left: 6px; } #maintoolbar { margin-bottom: -3px; margin-top: -8px; border: 0px; min-height: 27px; margin-left: 0px; padding-top: 11px; padding-bottom: 3px; } #maintoolbar .navbar-text { float: none; vertical-align: middle; text-align: right; margin-left: 5px; margin-right: 0px; margin-top: 0px; } .select-xs { height: 24px; } [dir="rtl"] .btn-group > .btn, .btn-group-vertical > .btn { float: right; } .pulse, .dropdown-menu > li > a.pulse, li.pulse > a.dropdown-toggle, li.pulse.open > a.dropdown-toggle { background-color: #f37626; color: white; } /** * Primary styles * * Author: Jupyter Development Team */ /** WARNING IF YOU ARE EDITTING THIS FILE, if this is a .css file, It has a lot * of chance of beeing generated from the ../less/[samename].less file, you can * try to get back the less file by reverting somme commit in history **/ /* * We'll try to get something pretty, so we * have some strange css to have the scroll bar on * the left with fix button on the top right of the tooltip */ @-moz-keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } @-webkit-keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } } @-moz-keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } @-webkit-keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } } /*properties of tooltip after "expand"*/ .bigtooltip { overflow: auto; height: 200px; -webkit-transition-property: height; -webkit-transition-duration: 500ms; -moz-transition-property: height; -moz-transition-duration: 500ms; transition-property: height; transition-duration: 500ms; } /*properties of tooltip before "expand"*/ .smalltooltip { -webkit-transition-property: height; -webkit-transition-duration: 500ms; -moz-transition-property: height; -moz-transition-duration: 500ms; transition-property: height; transition-duration: 500ms; text-overflow: ellipsis; overflow: hidden; height: 80px; } .tooltipbuttons { position: absolute; padding-right: 15px; top: 0px; right: 0px; } .tooltiptext { /*avoid the button to overlap on some docstring*/ padding-right: 30px; } .ipython_tooltip { max-width: 700px; /*fade-in animation when inserted*/ -webkit-animation: fadeOut 400ms; -moz-animation: fadeOut 400ms; animation: fadeOut 400ms; -webkit-animation: fadeIn 400ms; -moz-animation: fadeIn 400ms; animation: fadeIn 400ms; vertical-align: middle; background-color: #f7f7f7; overflow: visible; border: #ababab 1px solid; outline: none; padding: 3px; margin: 0px; padding-left: 7px; font-family: monospace; min-height: 50px; -moz-box-shadow: 0px 6px 10px -1px #adadad; -webkit-box-shadow: 0px 6px 10px -1px #adadad; box-shadow: 0px 6px 10px -1px #adadad; border-radius: 2px; position: absolute; z-index: 1000; } .ipython_tooltip a { float: right; } .ipython_tooltip .tooltiptext pre { border: 0; border-radius: 0; font-size: 100%; background-color: #f7f7f7; } .pretooltiparrow { left: 0px; margin: 0px; top: -16px; width: 40px; height: 16px; overflow: hidden; position: absolute; } .pretooltiparrow:before { background-color: #f7f7f7; border: 1px #ababab solid; z-index: 11; content: ""; position: absolute; left: 15px; top: 10px; width: 25px; height: 25px; -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); -ms-transform: rotate(45deg); -o-transform: rotate(45deg); } ul.typeahead-list i { margin-left: -10px; width: 18px; } [dir="rtl"] ul.typeahead-list i { margin-left: 0; margin-right: -10px; } ul.typeahead-list { max-height: 80vh; overflow: auto; } ul.typeahead-list > li > a { /** Firefox bug **/ /* see https://github.com/jupyter/notebook/issues/559 */ white-space: normal; } ul.typeahead-list > li > a.pull-right { float: left !important; float: left; } [dir="rtl"] .typeahead-list { text-align: right; } .cmd-palette .modal-body { padding: 7px; } .cmd-palette form { background: white; } .cmd-palette input { outline: none; } .no-shortcut { min-width: 20px; color: transparent; } [dir="rtl"] .no-shortcut.pull-right { float: left !important; float: left; } [dir="rtl"] .command-shortcut.pull-right { float: left !important; float: left; } .command-shortcut:before { content: "(command mode)"; padding-right: 3px; color: #777777; } .edit-shortcut:before { content: "(edit)"; padding-right: 3px; color: #777777; } [dir="rtl"] .edit-shortcut.pull-right { float: left !important; float: left; } #find-and-replace #replace-preview .match, #find-and-replace #replace-preview .insert { background-color: #bbdefb; border-color: #90caf9; border-style: solid; border-width: 1px; border-radius: 0px; } [dir="ltr"] #find-and-replace .input-group-btn + .form-control { border-left: none; } [dir="rtl"] #find-and-replace .input-group-btn + .form-control { border-right: none; } #find-and-replace #replace-preview .replace .match { background-color: #ffcdd2; border-color: #ef9a9a; border-radius: 0px; } #find-and-replace #replace-preview .replace .insert { background-color: #c8e6c9; border-color: #a5d6a7; border-radius: 0px; } #find-and-replace #replace-preview { max-height: 60vh; overflow: auto; } #find-and-replace #replace-preview pre { padding: 5px 10px; } .terminal-app { background: #eee; } .terminal-app #header { background: #fff; -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.2); } .terminal-app .terminal { width: 100%; float: left; font-family: monospace; color: white; background: black; padding: 0.4em; border-radius: 2px; -webkit-box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.4); box-shadow: 0px 0px 12px 1px rgba(87, 87, 87, 0.4); } .terminal-app .terminal, .terminal-app .terminal dummy-screen { line-height: 1em; font-size: 14px; } .terminal-app .terminal .xterm-rows { padding: 10px; } .terminal-app .terminal-cursor { color: black; background: white; } .terminal-app #terminado-container { margin-top: 20px; } /*# sourceMappingURL=style.min.css.map */ jupyter-nbconvert-5db0bfc/docs/api_examples/template_path/quiz_notebook.py000066400000000000000000000041751516532232300274620ustar00rootroot00000000000000# --- # jupyter: # jupytext: # cell_metadata_filter: all # formats: ipynb,py:percent # notebook_metadata_filter: all,-language_info,-toc,-latex_envs # text_representation: # extension: .py # format_name: percent # format_version: '1.3' # jupytext_version: 1.3.2 # kernelspec: # display_name: Python 3 # language: python # name: python3 # latex_metadata: # chead: Quiz questions, January 18, 2020 # lhead: E340 Day 5 # pdf_metadata: # text1: html header success # --- # %% [markdown] ctype="question" qnum="1" # 1. Suppose we have a one layer atmosphere with ε=1 above a black # surface as in Dessler Fig. 4.6. Does adding a second opaque (ε=1) # layer (Dessler Figure 4.7) increase the greenhouse effect, decrease # the greenhouse effect, or leave the greenhouse effect unchanged? # # A. increase # # B. decrease # # C. no change # %% [markdown] ctype="question" qnum="2" # 2. Suppose a planet's average surface temperature is about 320 K. In the one-layer # semi-transparent atmosphere shown below (and seen in your reading), # what would the approximate long-wave atmospheric emissivity ε need to be in # order for $T_g$=320 K, if the average shorwave flux was $I_0=400\ W\,m^{-2}$. (Hint, look at equations 5-6 in the reading). # # A. 0.54 # # B. 0.65 # # C. 0.77 # # D. 0.88 # # E. 0.95 # %% [markdown] ctype="question" qnum="2" # ![fig1](media/image1.png) # %% [markdown] ctype="question" qnum="3" # 3. Given a one-layer atmosphere like problem 2, but with $\epsilon=0.8$, $T_G$=306 K, $T_1$=258 K, $I_0$ = 300 $W\,m^{-2}$, calculate the greenouse effect. (choose the closest number) # # A. -121 $W\,m^2$ # # B. +121 $W\,m^2$ # # C. +197 $W\,m^2$ # # D. +221 $W\,m^2$ # # E. +324 $W\,m^2$ # %% [markdown] ctype="question" qnum="4" # 4. According to the figure in Trenberth et al. 2009 below, how big is the Earth's greenhouse effect? # # A. 85 $W\,m^{-2}$ # # B. 157 $W\,m^{-2}$ # # C. 254 $W\,m^{-2}$ # # D. 285 $W\,m^{-2}$ # # E. 333 $W\,m^{-2}$ # %% [markdown] ctype="question" qnum="3" # ![fig2](media/image2.png) jupyter-nbconvert-5db0bfc/docs/autogen_config.py000066400000000000000000000042631516532232300222610ustar00rootroot00000000000000""" autogen_config.py Create config_options.rst, a Sphinx documentation source file. Documents the options that may be set in nbconvert's configuration file, jupyter_nbconvert_config.py. """ import os.path from nbconvert.nbconvertapp import NbConvertApp header = """\ .. This is an automatically generated file. .. do not modify by hand. Configuration options ===================== Configuration options may be set in a file, ``~/.jupyter/jupyter_nbconvert_config.py``, or at the command line when starting nbconvert, i.e. ``jupyter nbconvert --Application.log_level=10``. The most specific setting will always be used. For example, the LatexExporter and the HTMLExporter both inherit from TemplateExporter. With the following config .. code-block:: python c.TemplateExporter.exclude_input_prompt = False # The default c.PDFExporter.exclude_input_prompt = True input prompts will not appear when converting to PDF, but they will appear when exporting to HTML. CLI Flags and Aliases --------------------- The dynamic loading of exporters can be disabled by setting the environment variable ``NBCONVERT_DISABLE_CONFIG_EXPORTERS``. This causes all exporters to be loaded regardless of the value of their ``enabled`` attribute. When using Nbconvert from the command line, a number of aliases and flags are defined as shortcuts to configuration options for convenience. """ try: indir = os.path.dirname(__file__) except NameError: indir = os.path.dirname(os.getcwd()) destination = os.path.join(indir, "source/config_options.rst") with open(destination, "w") as f: app = NbConvertApp() f.write(header) f.write(app.document_flag_help()) f.write(app.document_alias_help()) f.write(app.document_config_options()) # Workaround until https://github.com/jupyter/nbclient/pull/216 is released with open(destination) as f: data = f.read() data = data.replace("`CellExecutionError`", "``CellExecutionError``") data = data.replace("`cell`", "``cell``") data = data.replace("`cell_index`", "``cell_index``") data = data.replace("`cell_allows_errors`", "``cell_allows_errors``") data = data.replace("`notebook`", "``notebook``") with open(destination, "w") as f: f.write(data) jupyter-nbconvert-5db0bfc/docs/make.bat000066400000000000000000000161331516532232300203240ustar00rootroot00000000000000@ECHO OFF REM Command file for Sphinx documentation if "%SPHINXBUILD%" == "" ( set SPHINXBUILD=sphinx-build ) set BUILDDIR=build set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% source set I18NSPHINXOPTS=%SPHINXOPTS% source if NOT "%PAPER%" == "" ( set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% ) if "%1" == "" goto help if "%1" == "help" ( :help echo.Please use `make ^` where ^ is one of echo. html to make standalone HTML files echo. dirhtml to make HTML files named index.html in directories echo. singlehtml to make a single large HTML file echo. pickle to make pickle files echo. json to make JSON files echo. htmlhelp to make HTML files and a HTML help project echo. qthelp to make HTML files and a qthelp project echo. devhelp to make HTML files and a Devhelp project echo. epub to make an epub echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter echo. text to make text files echo. man to make manual pages echo. texinfo to make Texinfo files echo. gettext to make PO message catalogs echo. changes to make an overview over all changed/added/deprecated items echo. xml to make Docutils-native XML files echo. pseudoxml to make pseudoxml-XML files for display purposes echo. linkcheck to check all external links for integrity echo. doctest to run all doctests embedded in the documentation if enabled echo. coverage to run coverage check of the documentation if enabled goto end ) if "%1" == "clean" ( for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i del /q /s %BUILDDIR%\* goto end ) REM Check if sphinx-build is available and fallback to Python version if any %SPHINXBUILD% 2> nul if errorlevel 9009 goto sphinx_python goto sphinx_ok :sphinx_python set SPHINXBUILD=python -m sphinx.__init__ %SPHINXBUILD% 2> nul if errorlevel 9009 ( echo. echo.The 'sphinx-build' command was not found. Make sure you have Sphinx echo.installed, then set the SPHINXBUILD environment variable to point echo.to the full path of the 'sphinx-build' executable. Alternatively you echo.may add the Sphinx directory to PATH. echo. echo.If you don't have Sphinx installed, grab it from echo.http://sphinx-doc.org/ exit /b 1 ) :sphinx_ok if "%1" == "html" ( %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/html. goto end ) if "%1" == "dirhtml" ( %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. goto end ) if "%1" == "singlehtml" ( %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml if errorlevel 1 exit /b 1 echo. echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. goto end ) if "%1" == "pickle" ( %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the pickle files. goto end ) if "%1" == "json" ( %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can process the JSON files. goto end ) if "%1" == "htmlhelp" ( %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run HTML Help Workshop with the ^ .hhp project file in %BUILDDIR%/htmlhelp. goto end ) if "%1" == "qthelp" ( %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp if errorlevel 1 exit /b 1 echo. echo.Build finished; now you can run "qcollectiongenerator" with the ^ .qhcp project file in %BUILDDIR%/qthelp, like this: echo.^> qcollectiongenerator %BUILDDIR%\qthelp\nbconvert.qhcp echo.To view the help file: echo.^> assistant -collectionFile %BUILDDIR%\qthelp\nbconvert.ghc goto end ) if "%1" == "devhelp" ( %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp if errorlevel 1 exit /b 1 echo. echo.Build finished. goto end ) if "%1" == "epub" ( %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub if errorlevel 1 exit /b 1 echo. echo.Build finished. The epub file is in %BUILDDIR%/epub. goto end ) if "%1" == "latex" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex if errorlevel 1 exit /b 1 echo. echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdf" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf cd %~dp0 echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "latexpdfja" ( %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex cd %BUILDDIR%/latex make all-pdf-ja cd %~dp0 echo. echo.Build finished; the PDF files are in %BUILDDIR%/latex. goto end ) if "%1" == "text" ( %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text if errorlevel 1 exit /b 1 echo. echo.Build finished. The text files are in %BUILDDIR%/text. goto end ) if "%1" == "man" ( %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man if errorlevel 1 exit /b 1 echo. echo.Build finished. The manual pages are in %BUILDDIR%/man. goto end ) if "%1" == "texinfo" ( %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo if errorlevel 1 exit /b 1 echo. echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. goto end ) if "%1" == "gettext" ( %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale if errorlevel 1 exit /b 1 echo. echo.Build finished. The message catalogs are in %BUILDDIR%/locale. goto end ) if "%1" == "changes" ( %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes if errorlevel 1 exit /b 1 echo. echo.The overview file is in %BUILDDIR%/changes. goto end ) if "%1" == "linkcheck" ( %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck if errorlevel 1 exit /b 1 echo. echo.Link check complete; look for any errors in the above output ^ or in %BUILDDIR%/linkcheck/output.txt. goto end ) if "%1" == "doctest" ( %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest if errorlevel 1 exit /b 1 echo. echo.Testing of doctests in the sources finished, look at the ^ results in %BUILDDIR%/doctest/output.txt. goto end ) if "%1" == "coverage" ( %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage if errorlevel 1 exit /b 1 echo. echo.Testing of coverage in the sources finished, look at the ^ results in %BUILDDIR%/coverage/python.txt. goto end ) if "%1" == "xml" ( %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml if errorlevel 1 exit /b 1 echo. echo.Build finished. The XML files are in %BUILDDIR%/xml. goto end ) if "%1" == "pseudoxml" ( %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml if errorlevel 1 exit /b 1 echo. echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. goto end ) :end jupyter-nbconvert-5db0bfc/docs/source/000077500000000000000000000000001516532232300202135ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/source/_static/000077500000000000000000000000001516532232300216415ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/source/_static/empty.txt000066400000000000000000000000001516532232300235260ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/source/_static/exporter_inheritance.png000066400000000000000000001101531516532232300265710ustar00rootroot00000000000000‰PNG  IHDRÜ£æÍþgAMA±� üa pHYsÃÃÇo¨dtEXtSoftwarepaint.net 4.1.6ýN è�éIDATx^íý{¸,g}zæßyæ–ÌóGÎäLrxÆO<™dâIÆ'g|r’8'¶ÃIlƒïvblcîæŽ’�¶!Ùæ"ƒ�ÄÅhÇØHa$ÃÛ lldH€2زbsÙF\v¸Ø‚rjÖwɯTªýë^ݽjuWwöó|ž½Ö[ÕoUW½¿®êo×êúk]×ÇT6Ë)€å”�ÀrÊF`9e#°œ²XNÙ,§l–S6Ë)€å”�ÀrÊF`9e#°œ²XNÙ,§l–S6Ë)€å”�ÀrÊF`9e#°œ²VqöìÙîÖ[oíΜ9ÓÝtÓMLHöËÝwß}°›ê}_Ù˸÷Þ{»n¸¡»ü²K\Ò]~鳘”‹\|°ožÝ]{íµÝ¹sçv[½/€Õ•�°¨„·W]ùüîª+.ïÞó®ßèþ×/ýy÷¿Ýû™®»÷³LÈ×þâÓÝg>ñ±îæép Ý`|e#,êðÊöK/ê>ý§X½LÏ;ãW»Ó§Oì¾zŸ«)`ùÎö|MÉmï~Gì2]¯ûÅÓ¾ÓFV6À"r#Î|7ø?óŸÊP—é:û§wÞHu¸O€Õ•�°ˆ›nºéð¦œÿÛ_úÎömsïþÄá�n‡ûX]Ù‹h�{è2}wWÙ‹¸o7�;Œ«l€EÜ·›ÀÆU6À"îÛMàã*`÷í&p€q•�°�ûv¸À¸ÊFX„À}» Ü`\e#,Bà¾Ýî0®²!pßnwWÙ‹¸o7�;Œ«l€EÜ·›ÀÆU6À"Æ Ü¿õ_}óÁ™é_›ë§žª|ì”e�³îïzû¯—Ó7Màã*`÷ùî°_ÊFXÄØ�ûTƒéU Ü`¿”�°ˆMî-Äþ¾ï~ØyÓ>ðžß>œö�ÿ?ÿðþ¶Ö÷g?ù±îq�þÑîoüõ¿~øûCþ»¿Ý½ù¦×=èñMÚÓGækýUóöõácæ]µßï#�ÍsiÓ²^ÕÕü™–>‡Ï£šwQwWÙ‹ØÔî-Øî‡à ¢V'ˆ¾ë#ï¿¿½õÝê¡a�~Ãk^UÎ?ó©š·îý ½Y$pŸ·¬„êýe¥­=¿þ|w˜Ž²±©ïpO žà¹®' Î|ýõ�ÿûÓ^þ³/:lOˆÝÚÒWÚÒoÂðÖžŸ[Ð�«è[{ Ü3-?'ôoÓúÓ«Ús^=Ÿþ[€ß_V~�<�E?˜8ŠÀÆU6À"6yÓÔ„ÔioAz~^�­ïa{Z ¶[@>\V´«ÑûËhóCþáô* o�ÿjü¦ÿýõÈï âûó—ÀÆU6À"6}ÓÔvUû¼0z^à> ÄÛ¼Už«×3-ó´¶y�úQÓûßÛ>Ë0pï/{ wWÙ‹ØtàÞ®�YW™¯¸çk2m¬À½-kžþ²†¿�Aàã*`S»Â}øêÑú¶Ç¬À}W¸Ï[¯ÊpÙc¸À¸ÊFXÄ&÷þwª·ïCO?œo^°�¦fZ Ø[@žÿ‡óÎû÷U÷6-ë>œVɼw˜¶²±©À=ùßøëýAßÛÞúH0ÞŸ·ßÞ®€ÏãÛw¨÷Cìö5é»ßO~N[¦µ¬ÆQ�{û Ë^}ß–é§…þ‘þÚ ­-ó Ü`ÚÊFXÄØ�û< ¥Ûü Ú€÷ÃïÂG?¼ž×÷pÞhW²WúW·ÇQ�{?TïkÓç-+úÏ9¿ Ü`ÚÊFXÄ&÷„Þù½ú*–Ü85Óª+ßóøö2 Úóõ3Õw¾GúI™·õWÝ”õ¨À=†} Có<6WÀg�úóäùõׯzìq Ü`\e#,b¬Àý$µÀ½š¶ïî0®²!pßnwWÙ‹¸o7�;Œ«l€EÜ·›ÀÆU6À"¶!pg6�;Œ«l€EÜ·›ÀÆU6À"îÛMàã*`÷í&p€q•�°�ûv¸À¸ÊFX„À}» Ü`\e#,Bà¾Ýî0®²!pßnwWÙ‹¸o7�;Œ«l€Eœ9sFà¾Åò�ÉpŸ«+`·ÜrKwùe—t_ýÂÙ2ÐeºÎþé�]>0îS`ue#,âÎ;ïì.¿ìÙݼï]e¨ËtÝü†ë»ì¿á>VW6À¢®½öÚï•ùòçþ¬ v™žÿø{¿Õ]{Í5ݽ÷Þ{° ëý ,¯l€E�;w®»üÔe‡¡û‡Þû;¾^f¢þë_ÞÓ�;{W÷[o¹©»êÊçwwß}÷Áî«÷)°š²–qöìÙîðJ÷Ë.é.¿ô¢îòg_Ø]õ¼Ë&âÒîö÷¼³ ¡OJ–W¯Ëæî—ƒýsúºëºì¯á>ޝl€Uä;Ás#Õn¸a2®ºòÊ.¡{ŒŸ”Ó¯ú¹Ã«È«õÙ”ì—\Õîkdàä”�°+Μ9Ó]~éÅÝÝx[Ž�-ËÉÕä ¸‡ëì¶²vE®èÎwÌßôú×”ùزœËO]êk[`•�°Knºé¦Ãï•?÷çw•!ùXî=÷Éîª+N~…Ëp€ÝW6À.Éw—_~Ù³»[û­eP>–[Þö«‡7&ÍwÙר}e#ìš«_üâ¿yêµ?ûÂ.ËqcRØOe#ìš[o½õðêóÛßóÎ2,?®;?pÐÿ¥»Y*ì±²vÍ}7O=Õ�~åÏ–�ùqÝðšWÞ,õܹs‹«×Øme#ì¢Ã›§^ú¬ÑožšþÜ,(`�={öðæ©g~õ—Ëà|U÷Ý,õÙn– {®l€]uõÕWwW=ï²28_ÕÕ/x~wí5×t_/Øe#ìªÛo¿}Ô›§Þ,õ ?7KÊFØUíæ©×¾ô…e€¾¬Ü,õª+Ÿïf©€À€ýsßÍS/>öÍSÏþ§�ôs‘›¥‡ÊFØe¹ýòË.ínzýkÊ }Q÷Ý,õÒîî»ï>è¶^°?ÊFØuǽyê½ç>éf©Àƒ”�°ëŽ{óT7K†ÊFØu¹yêÕ/~qwõ ®(õ£œ~åÏÞ,5ý ûöSÙûàÌ™3+Ý<µÝ,57_ö 쯲öA®N¿üÔeKß<ÕÍR€JÙûâôéÓ‡7O]ô*÷Ü,5óçqþ€ýV6À¾¸ïæ©Ïînýí·–ûPæ;¼ÙêÁã†}û­l€}’›§^õ¼KË€}èô«~ÎÍR€RÙûäÍ¿öÆî²‹žÖÝý‡·•!{“é—]ôôî–[n9xXݰ¿ÊFØu_úømÝçî<ÓÝsûë»�¿çúîÂ'üà‘7OÍôg=é݇ßþêƒÇÝØ}öÃoêþâž�tW/Ø/e#좯}å‹Ýçþð7»OüöKºO¿ïµÝg>ø+÷û…«/<¼Ê}ÖÍSs³Ô矺°{åO=õA�‹ô÷Ù�¼õ`õr€ýP6À®ùò§îèÎþþ«Ï Ú›ÛÎ\Û]ü”›yóÔ[Þö«Ý%O{L÷î›_Z>>Òÿç?ööƒÅÕëì¶²vÅ×¾ò¥î3º¹ ȇ®xæ#»+Ÿ{I¸_ó’Ÿ:œþ‰ÿøºò±} õ‡ëì¾²vÁW¾ð©îž"ŸåÌ/^Õ]òŒÇu·¿ç� ÛïüÀ­Ý³/x|wó«Ÿ[>®’ï†ÿêάF½nÀî)`ÛåÊö„ÞU>K®^¿à1ßÓ�~åÏ>(p¿á5¯:¼YêÿîkÊÇÍ’«f=†ë즲¶Ý2W¶ÇÇßyuwǫֽèÇÿnwÉÓuÿÍSóÿsŸõ„îÊ÷wº�¼æº»Ï\^>~–{>pãÁêÔëì–²¶Ùÿì½eø]IÐþ¡W<´{ß ÿÑ¡·�úÝS~ðìÎüê/î¹Yj~Ã3ÿÞýódþ?ýÍ«Êþ*çîz×ÁjÕë 쎲¶Y®*¯‚ï¡»Þô¬î¶—|ÓýAzó´ïø[ÝÏ~Êaàþ¢«.ëžñð‡œ7O,zµ»«Ü`?”�°­¾ü©;ÊÐ{(W¨Wa{\ÿ´¯ï.øño?üîöüÿŠÇ}]9_,z¥û¹?zçÁêÕë 솲¶Õç?úö2ðÊ÷µWz¼û'¿¡{ì¿þÛÝåÏ~f÷ÔïùûÝ-Ïû‡å|ñ�—}sÙÿÐçîts /"_éGÐDÙû$ß·~î®wuŸý𛺳ï9Ý}âw^zèì{þC÷©ß{y÷gïxAwö½¯9œž¯ŒÉÍX}m 0T6À¾úò'?Ø}èåßvžÿü'¿w0¹~ @”�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�°¯îÀªÊFØWw`Ue#ì+�;°ª²ö•ÀXUÙûJପl€}%pVU6À¾¸«*`_ Ü€U•�LÇÙ³g»[o½µ;sæLwÓM7qÂnxõÕÝÏ<öÎóÚ—_UÎÏø2Þï¾ûîƒá_×LUÙÀæÝ{ï½Ý 7ÜÐ�zö…Ýå=¥;õÌDZ—=ãQÝ%Oüþó\öô/çg\—?ë‰ãýÉÝ©K.讽öÚîܹsåP×LMÙÀf%d¼êùÏë®:õôî÷ßr]÷ÕOün÷_ÏÞÚýoþû°óþË'ßÝÝó‘·v7ý ë@èÀ¶(جÃ+Û/|B÷çwœ)IØï¸éåÝéÓ§Ê¢®˜’²€ÍÉw¶çë4Þÿ›¯)HØ7ù^}ßéÀ6(ØœÜ02ßaý…?~G>¾ùÔœ9¼‘ê°V`jÊF6禛n:¼y¤ïl‡ûüåú�Ãk¦¦l`sZà^�°¯îlƒ²€Í¸Ãùîlƒ²€Í¸Ãùîlƒ²€Í¸Ãùîlƒ²€Í¸Ãùîlƒ²€Í¸Ãùîlƒ²€Í¸Ãùîlƒ²€Í¸Ãùîlƒ²€Í¸Ãùîlƒ²€Í¸Ãùîlƒ²€Í¸Ÿï[ÿÅ?98sýkå4öƒÀ€mP6°9Ç ÜçW_qN/ê'/}BÙÏ”7poÛdŒçÚÖežmئCYç¬{¶U5}Óîlƒ²€Í¸ŸOà~òîp|e#›s_)3f༠S ܧL¯JàÇW6°9›Ü3ýû¾ã>œ'ò·ÿ›rÞ6ÿñ{~¥{Ü�<¼ûÿçÿãýóÿúk_|8Oþï_ž~oû/>¨Ÿ~¸›Ÿóøüžþæ-·ß6\N´õþÌ�o»¾¶¬J?\^vô;K[vúNË6É´üÿþúûÛZßYÿYÛw(íé#óµþªyÛºd½‡�nǾ~׿üy -+ÓÒçðyTÛsQw¶AÙÀæ¬;pOˆÚÔ¡„¥ýy[0ÛÔ¡YÁm‚Ù~?-ü�ÕÏÅOþ‘Íßúí·µ>*™‘ùZh¾Ê6X$p�P÷ƒéÑ ÑóüóáEk?jûÃíyë=܆m;ôófÖ~‹öøl‡jzd=úËJ[{~ýùªñ·(�;Û l`sÖ¸'ìM(:¼R9W_·`¶uz f¦¶�µ]ÅÜBÕþíé?óûiáoë§]‘žõl!mD·ßgÉã«åÍzþ±ê6˜§¿œÖ´çÔ¶×0@o}çÿþ´kúÂÃö<·Ö–¾Ò–~û�w~nÛ°Úæ™–ŸÛ6N¯>HȺdÚð¯ÒÞž[þÌyU«¸° ÊF6g��{ rûávÓÝþcZ < k¶€µßU�;/ÜmÓ²n­­-·?ß,Uß³ž¬º æ.§ÖylûyxzÌ{žmZ ¼Ûó¬žSB÷á2Úüý ¿¯M¯öI‚ö‡ôÂþ¾¶¬þãò{>¬èÏw\w¶AÙÀæ¬3pïgù,ýÇÌ „ÓžéÃöäöû™îVë:k¹™7¡r¦·«Ñ›~ß³ž¬º ªuŸ§ÿW³ÂèyÛw¸ÍÚ¼Õù@$Ó2Ok›·Í�šÞ®˜Ÿ§ÿ¸üÞ_öîlƒ²€ÍYgàÞBÛyúÁi›¿ßG3œ·iAnÙóÂÝj]«åÎûNñè÷=ëùǪ۠Z÷yÚÕò1ë*óêy6Ãm6oÞÈ´þzÏÛæGMOûQúÛ6¿÷—=�;Û l`s6¸÷Ûæ™7ÿ¬�µ¹ýeÏ w«u.·}-K®¼ÎWÂä1íknª¾g=ÿXuTë>Ïð ÷á×òļu>¯6ï:®pöu”eç_„À€mP6°9ë Ü[ÈÚÿ¾ôyæ³BÖ¶Œþ²ç…»-˜îßt¸ÜöøêJñªïYÏ?ÚüËnƒjÝgé§zûÎø<Ïá|ó¶o¾C=ÓZÀÞÖ»zNó¾Ã}ÖzÏ›ÞÖ«ÃÔy2o5ŽCàÀ6(Øœuîý¯9É´þÕÒyL ˆ[Û¼@xVÈÚ‚Üþ²[[úoËÌUÙ­=W®÷¯.·…Öùþõ6_þOÐÜ‚é~pÜnêšiÃ+ÂWÝU0]Iy>ýïmo}ô?T¶·ç•Ç·ï™ïoß¶Þé»ßO~nß¹ÞÈÛ¶�µÞÕ6mÒgYýmž=òáA¿ßÌÛ_×1ÜØe#›³ÎÀ=Z˜:Kÿ1-î?¾I{²¶ ·ßOk›exåúp¹ z[¨<ÔÚ‡ÁòCþ*ˆïkó¬² æéÏŸ =ëÔ¿[ý€^ßÃycÞz÷¯n�¶Ígî-ÀjÓ—ùÎüü^�…㸰 ÊF6gÝ�{›ž+›[XÝÓ\õÜ¿Úy|÷Í Y[ÐÛ_vkK(œ@:?GÖ¡úÚ’j¹™¯µG~NP?+XÎüíJñÈrûËZvÌÓžkž_~ï_!ߴ®|ÏãòWd}v÷ס/ýô·a~~`³¶Kß°¯¬OzþþóϺe›¥½?_õØã¸° ÊF6ç$÷©Y$üÝG-Ì®¦í;�;Û l`sîûKà>›À€mP6°9÷ý%pŸMàÀ6(Ø�ûþ¸Ï&p`”�lÎ>î°,�;Û l`sîp>�;Û l`sîp>�;Û l`sîp>�;Û l`sîp>�;Û l`sîp>�;Û l`sîp>�;Û l`sîp>�;Û l`sîp>�;Û l`sΜ9#p‡�|5¬˜š²€Í¹å–[ºË/zJ÷•�¿« aß|êÎtù jX+05e#›sç�wv§.¹ ûÐ;¯/ÃGØ77ÿâK»ÔŰV`jÊF6ëÚk¯=üZ™/ýÉ-e ûâ=oû…îÚk^ÖÝ{ï½¥Q× LEÙÀf�;w®»ü²g†î¼åµ¾^†½òµO½»ûüÇ~«ûÍ7\Ó]õüçuwß}÷AYÔµSR6°ygÏží¯t¿øéÝåÏzbwê™�í®|ö“XÖ%Oènû­×”ÁîIÉòÊua!‡ãý`ÜŸ¾îÕ]ê`X0Ue#Ó‘ï®Î�To¸áVpÕ•Ï﮼äñe0~R®{É©Ã+³«õáh﹪Ý×ȰmÊFØgΜé.¿èÉÝŸ¼÷¦2[–“+´×Øme#ìŠ\%�ïÃãéŸ*ò±e9§.½ÈW¡À*`—ÜtÓM‡ß�ÿù�þf’�å/ÿôwº+/}òá×¢ ר}e#ì’|ø©K.èÞýæŸ/ƒò±¼ã�×t—_ü´.ß»?\`÷•�°k®~ñ‹º+/yB”�嚟~V—å¸Ù'ì§²vÍ­·ÞÚ]~ÑSºÛ~ë5eX~\ùÝ_>¼9«›¥Àþ*`×Þ<õÔeÝu/¹´ Ì�ëú—?ïðf©çÎ�;X\½Àn+`ÝwóÔÇ�~óÔôçf©@Ù»èìÙ³‡7O}Ëõ?Sç«ÊÍRÓ¯›¥À~+`W]}õÕÝ•Ï~Rœ¯êÅÏ{Zwí5/;è¾^&°ÊFØU·ß~û¨7O½ïf©Oq³T@àÀ~i7O½æ§žYèËÊÍR¯ºâ9n– ÜØ?¹yêå=ùØ7OýÔ‡ÞÜ]þ¬'ºY*p¨l€]–«ÑO=ûÂî�§ª Òux³Ôƒ~î¾ûîƒnëeû£l€]wÜ›§þåŸþŽ›¥R6À®;¼yêÅO[ù橇7K=x¼›¥MÙ».7O½úÅ/ê^üܧ”�úQ®{É¥ÝUÏ^—~†}û©l€}pæÌ™•nžÚn–š›¯ûöWÙû W§_~éÅKß<ÕÍR€JÙûâôéÓ‡7O]ô*÷Ü,5óçqþ€ýV6À¾ÈÍSO]rA÷î7ÿ|°e¾Ü,5�öì·²öInžzå%�/ö¡ë^rÊÍR€RÙûäÍ¿öÆî²g<¦û“÷ÞT†ìM¦_öŒGw·ÜrËÁÃê¾€ýU6À®ûÒÇoë>÷‡gº{>ðúîãï¹¾»ð ßäÍS3ýY?ñƒÝ‡ßñêƒÇÝØ}öÃoêþâ3;è®^°_ÊFØE_ûÊ»Ï}ô7»OüÎKºO¿ÿµÝg>ô+÷û…Ÿ¹°»ìé�œyóÔÜ,õЋӽò§Ÿú ÇEúûì�o=XD½\`?”�°k¾ü©;º³ïyõyA{sÛ[¯í.zâ¿›yóÔw¼ñšî’'ÿp÷î_}iùøHÿŸÿØÛW¯°ÛÊFØ_ûÊ—ºÏüÁÍe@>tÅ3¬»òâÇ•�û5?yÁáôO¼÷uåcûêר}e#삯|ñSÝ=E >Ë™_ºêð*öÛ~ë5 Û?ò»¿Ü=û)�èn~õsËÇUòÝð_ýâÙƒÕ¨× Ø=e#l»\ٞл ÃgÉÕë<æ»»ë^réƒ÷ë_þ¼Ã›¥þñヲ|Ü,¹±jÖc¸nÀn*`Û-se{|ü·¯îî8ý°îE?þw»‹â{ï¿yjþÎÓ~¨»òßÿ�î#¿øÝÝo»¼|ü, ݇ë즲¶Ùÿì½eø]IÐþ¡W=´{ß‹ÿÑ¡·=çtOþþoìÞrýÏî¹Yj~óþÞýódþ?}ûUe•sò®ƒÕª×Øe#l³\U^ßCwýú³ºÛ^úM÷éÍÓ¾óouÏ»àG÷�zB÷Œ‡ÿwçÍ‹^íî*wØe#l«/êŽ2ôÊêUØ×?ýë» ~ä_~w{þÅã¿®œ/½ÒýÜ¿ó`õêuvCÙÛêó{{xåûÚ«=ÞýÓßÐ=ö¡ÿmwê?Þ=õ»¿¾»åùÿ°œ/>pÍ7—ý}îϬ^½ÎÀn(`[}æn.ï¡*<ï{á�>¤{Ò÷|ÃáÍR«é}Ÿ~ÿkËeôå&®ÃuvKÙÛèk_ýr÷éÛ®/ï¾äUpÞ—«Úý­³ûµgÿýrzßÙ÷\W.§ï¿û²îÏß÷‹Ý—?õÁî«_üóƒÕ­Ÿ°½ÊF˜²ëùÙ»ºÿ|÷ï†Øw½é‚îÎë¸ûÐ+¿­»ë×/,ï¡|Lž÷-ruû‡^õвÿ¡»ßzÙáúõÝý¶çtç‹ñ°#ÊF˜Š„ë £?ó7uŸ|÷Ë»�ýÊã»;þÃw�^èßÚ}ðÚÙýá ?RÞC¹Ùi ÷å»Ü«ö¾»~ýYeÿCù¥ìÞÿ’ÿ¾»ýçþi÷�kþE÷ÁW~ëùÏá¯â`;•�° –ûW­Ï ×ÿJö¼ìŸu·½ôènû™oìÞÿ3ÿßCgßsº ½‡>ú†Ç•!ú¢òøªß¡¬O‚ö¶~÷»?€ÿçsøFÓV6ÀIj_ óù�þÆü«Ö‡^ñ­Ý®ýæîöŸû°Ýùº-ƒïJ®P_äëeún{é7-|e{üñÍO-×ó|߸Tßäà A<l^Ùcé%LBá…Ãõø«¯‰iW±×!uí“¿wM~ϲHð~Çé‡Η›®V}T²Yÿj�Ö à_þ¯êm4‡ Ö«l€eU72]8XïI°œ€ùö—þÿæ^Åþ`ߨÝöÒÒÝþsÿÓÁcÿÙaÀ}û�E¿Z¦/az¾ßýî·]~®ÇÇûê¥üH_xù¿<\ÇÃÐ<\ó/î[¿<¿—ü“Áó8ÊñøF'£l€y¾‘é"ú_³ÈUì/ùï»Û~ö›õ¾ü_ÏíëWò{‚÷õ·ÌsÇ/|Owö?þ‡2 ?igÿãéT÷ÁW|ËaÈ~øî/ù'‡?·ÁêAü7n‹ãðMö£ VW6@3¼j=¡lÖ.lð51³¯boW­?pE÷¬ï5ÿƒŸÿ_§§ÏÃàù`mÚ¯þ·Ý'ÞõÒ2?)YÞ¿0ãˆ<ÿƒÿïzÓ3�ü�bù ~ܾÄÀbÊFöOûJ˜Q®Z8 ï™÷51 ×ÿ‡î¾¯„ùsÃõ&ë÷Ÿ~ã9ÝÝô”ì³äÆ¥gßs]��å¿ûsÝŸ¾ý'Cþj†î¼þ‡»Ï~øMºyl5ßÐ}Ûs± þ$ø&ë÷ÛžsÄçCA<û®l`·%\O@šp=�é˜áú¡ÁUìÀ÷]µþ௄ù–º��¬_®°O¸{î�û0 ^t�ó¸|˜�çþÙ�¼åðûÙ«À|Uù~÷{n]÷µ¯|ñp¹ 4¼Š½z® Î}~éo™ ½’-ª¾³½‡ó.kÌà½o¬¾éñpÝÃ÷ù:øFÀ¶)˜†Çk½j½'Ëùã_{F÷G7?¥ûÃ×ýX÷¡Wû±Âõ&Ï!Ïåð*ñ9Áxž÷¢òA{s’�{sRÁ{3vß$ˆÿè¯<ápLüÑÍO½ÿEõƒølA<SQ6°~¹±d‚ÒvÕúºÂÌ„ÕYVÌO½çÕÝŸ¿ÿ—º?{ûO޶üôß¾&f‘`tÙ ýãï|Ѩ7å\GàÞd›œdðÞ´quc*û67�͸É2²?Nb9‹Ä°ie#''Wa'L ¸‰«Öæg¹¹"üËgïè¾ø§ï¹?Œc=Ú2ÒçQW±÷%èNXZõYÉ2N"P]gàÞ¬+xoúìTýG ¼³û"M)ˆÏº · Œ¡l`ý¯„Ià·®p=ËȲ†ágþåÿ¶>c­K–•?ËYök]šç±‹®ËIíMžCµÜ“ Ü›uïͺøöoÄŸÄr!ˆ`le#ËiW­÷ƒËuë‘ådyíªõÞUå‡ÿZèŸõë ã¶Ìô¹jø�õZ6h_Gè½ÉÀ½É~ÜDðÞ¬;€oÿñl»²€ÙZ€�P4�qÂÎu…ëý 0ë0+ìN{æk݆û_úç-wËíyÎÙÖÇYæ2¦¸7›Þ›5ðåòñl‹²€úªõ±®?JÂè,«¸j}æºf=FŽþ§Ÿ„‹ Ç»ÓÇ2r–¿Î ½™RàÞ¬¼Ÿäúök¢Zþq,À7‚x¦¦lØ7 u’%Ø\÷Uë-ØÎr.ry[ß|c­kúH`™>³ÃeGÖuÑ+6´7Y×j½6¸7ËïÙŸëXï“àS˄؂x6¥lØeý0.AܺÂõ,#Ëê_Á»L¨œ<�kÖy¬õÍú´0ó$îô»LОp4ûgØÏ:e�«õ›BàÞ¬¼¯3ì�Zßâ8ie#À.H€œ�:�Ö&®ZO˜—å&]äªõ¡ÌŸp°­{µœee½ôe›Œ}{_ÄeÂÌÌ{’볌mÜ›eƒ÷ìûM| q’|«³ã„Ö‚xÆR6l›„Ó §@&0[W¸žedY-$Ë:¬h¶ç�~ÆZÿü§ÏUBÿee ?«u©L)ho²ªu�bàÞdÜWë<˦‚÷fê|3µ >ÏK0me#ÀT%0N@ÛìÖ¬G ¯z­zÕúPŸ-aÞXÏ#a} O:`o²œ,sÑç�í8Õ{÷fÛ‚÷fü˜û¯ñí¾“XïE⦧l˜‚„¸ �j%PZ×UëÑÿj‡¬ÃXW‡·ç”~ó|ªe/«}�>×}µø²A{žsöçÛò¤lsàÞlkðÞ´0û¤ø±Çáƒø¬‹ `}ÊF€u^µ>V}”ÅYV±Scë}é3}�õ�Á0`ßDx�eæ9-ú|2_æŸrÐÞìBàÞd›WÏe–©ïͶðM?ˆÏ²ñ»«l8) ´Z�Ðg¬z-¨ÎrÛMCO"`KŸ ×â'àªÖeYY÷eYïM†ÖYvBºE?Ù¦ ½Ù¥À½É>¨žÓ,»S Þ›ì£<§m àA<Àî)ÆÐ‚ç8 sÖ®gYV–Ù¾æ$ƒ³B·¯‰ã9¦�„o›øš˜Yò— ÚÞM9´�%ϳzNÛ¸7»¼7Ùgíu¦zÇ‘0z]|3• >u,ˆXNÙ°Œ„P …µ¯„#t^D ¦[ ´®¯XiWé�ù\fçy$ÔZW°·ˆ¬Ï2�_æ�ʇ«ØåÀ½ÉØ­žã,—ÛôáÉIðù bm’åM5ˆŸÒkÀ&•�³$TiaV–u]µëÖ×ê¶çÝ®b¯ÖoY-´j_o3\æ¦e�²�«u¯l{ÐÞd?WÏo—÷&ã¹z®³l[ð޴׬ÔÛØ¯W› à›©ñ‘mœí!ˆöUÙ��$áiÿªõ±¾�ü( ÄÚÕÞ m²ëm²¼~À>FH—>²Óç&žÓ¢²^Ùö‹>ç<§l«a?ÛjŸ÷ÈþN@Z=çY¶5xoN2€O-pžB�gÜæÃ€Ä�ý|%ˆöEÙì—-€J(³Î«Ö³œ1YnÖa“At–›p*¡ÐXÏ¿}p° SÖ/ëºèsÏs›J¨8¦ì«êùîjàÞd?î[ðÞä9¬#€ŸÒ_€L-ˆÏ‘‚x`”�ÀîJ°” ¥]µžÐ´ AÆ–0'ËJ¸2•+³ü¬G»Š½Zïeåyö¯b.sв²¾‹n™oƒöf_÷&¯û¼7ûÀ7-ˆoLj±Ÿÿ¢ñÀ¶*€í—p"aN»‚1�òº‚“,'AM–›åoòªõ¡¬K‚®1·G?`ߦP(ëšpmѯ ÊöÚå ½Ù÷À½¼? Ï)¯eÙc¿Ž¦¿)ðÍTƒø]oÀv+€í’4ÁC»"s]áz–Ñ®ZŸjøÑBå4c^Åžçœði[Ãçì«E·Gžï®©�ûƒe¿ Þ,Ï­}˜9ökm{}™zß ƒøuÝëcHLEÙLSÂÝ0 8Ö}•a–Ó®ZoAÐÃæöáC¶ÏX<´çž>·!›g™ =ò¼·ý9/Kà^Ë8X%xö³‹òº#€0A<°¯ÊF`óZpœ�%!ÎXáñ"²¬„- ˜zÈ“õËvóˆlƒl÷<ÿ)~°°¬eÃÒ} Ú�û|ËŽ¥Ø—à½éðË|Àµ¨m àA<°ëÊF`}Ì$4é_µ~M%át –§|ÕúPû0"Ûk¬mÕ®"M´KAs¶Uöï¢DdüeÛûÙ'÷ÅÞ·Ž>¯‡ÛüÚ%ˆvEÙœŒoâªõ(g¹ 6¶%\�aÀ>Æ6K uZHµ-ÛbQy>ËíÙ®—Ã~ö‘À}9‚÷å¥>3žðGÄÛ¦lŽ/oÆ´�`]áz–‘eµÀ%ÁÀ6†É-�JÀ1ÖvKPÓ>pص€½ÉóÊ~_t›e¾í»º=V!p_�à}uíõî¤øŒíá²·U¶— ˜¢²X\‚’Mý¯ XG°YN‚†,w›¾¦’õNX‘Ðb¬À©mŸô¹ WzÎÓ»EC'Aûl÷ã¼�C¿A<°ie#Pk¡p‚ʼ‘^W¸žedYý�dÞ¼'˜Ë¶L(2ÖvÌvjû¾„É‹†rÙÎÙ>‚öÙ²=«m'p_Žà}\©]üj¦ÄgÙ‚xØme#컄‘ ‹ZÀ1f |”,'ËÛ…«Ö‡ò<²MÛ‡Õó_V¶W¢)û"/´g\ wŽ&pײÁ{ÆjêyØ&€Gž£ SÙû$!mÞÜ&Ün¾¿®p=oìûÁÆ®]•ݶm …ÆØ®-8NŸÙ^Ãeîƒ<jûT²½öu[­"c¶ÚŽ÷㼟¬þÄÕö<Ž} à›Žlße>0¼¯F2òœ§Ä·s A<LOÙÛ.Ád ~×}Õz–“7áYnÞ”ïr¸yny³Ÿ7ýc}€‘m˜@§}81\æ¾Y6hÏ~P®.ã¹Ú®÷qe;/¼'Ø4®W'€?Y9V â€(`›$ŒL��p6oú×®gYV?hØå`½ìclëô‘€"}îúËÈvÈ6Ytg¾Ô�íw<ßÕö¸ŸŒlïeÂIÁû8ðëÑâ³]6Äg¹m¿dß âàä”�0E óƵŒö.¢¹ʸ]u½O¡fžk¶{®šk›§ŸöWâkÛ{Ñ`FÐ>.�ûf,3æÃ_rŒ«l­¶÷qàÏ—À»msA<ì–²6-ÁaÞ˜'D\÷W ¯ZO¸>\¿]×¶¶A¶Gµ�–Õ>´HŸû¸M•í¾è6Ï6Íö´�+û ÚÞ÷õ¼OÃIð9¶§Ö†ËÝwS â·`qe#¬K‚ÂáUëëzs™°2A;^µ>”çŸí�}0Ö‡پٯû¾m±lО Ä•ˆ'Cà> ÙÞ‚÷éè§«íø£ ƒøE�cÄÀÑÊF8 íªéM\µÞÊ,·½AÜ÷8Ï?Û"_3Ö÷¶�}MÌâRÙfÕö¬$ìpœ,�û´d» Þ§'û夸ô)€_Œ ¦§l€ãê¿Ìçu½Là›eµ7}y³.ø½OûÀ#Û%ÛhŒ;ÒGöoúô!ÆrR# ”Ý‚öõ¸OSBtÁût­#€Wƒ‹ëŸ‡�ùÁú²úA|êÑq €}P6À¢°æÍSÞDmâªõö&ÜWÂÔ²MNâkbÚ•‡¶÷ò²Í– Ú…†ë'pŸ6ÁûvH½´ãOµ_ŽC¿:A<œ¼²* Då tû³åu„ëYF–Õ¿j=o‡ëÇùW±WÛsYÙþÙöíC�á2YLöMöË¢5“ù²Í}¨±~÷í�ú¼o�uð^3W3 âOb?-bÄçõx¸®0ue#û-oV¬¶7^yÓµŽ`=²œöƹ¼Þ<Ï×ØÇØOm¤OÛÿø²ý–¹"Wоy÷í"xßN©3üô â`ye#û#oDÛ›Þ¼9+´]DÿÍSÖÁÕÓ‹É>˛߼ñk_¥Ÿô—7±Â‰ñd\/ú—Ù©Ûó²ßª}$pŸ6Áûvkç"'èf\àÇ%ˆ€ÙÊFvOÞ`¯Z_4<®‰YVÞ�åÍ´«¦—“m•7�Ùocí³ì“Œ�ô郎ñ-´',ð5IÓ!pßn«ïöíô´>¯�Õ~;üÉÄ€À`'µ€6oT×}Õz rÛYáúj²ÝÚ•~cí»Œƒìûää¤î– ‡²}à1=÷ݰlðžz´�§«À�}N“q⯼N– €}R6°=úo`òæe]áz–‘eµ7-yÃâMêê²í²ó&4ÛµÚæËÊ>ÊþÉJWOŸ¬lß|˜±hí Ú§Mà¾[V ÞÕçô­#€OÿÎmN– €]T60=y× o6yÕzÞ|ºBúø²ýòf.oìÆÚ—m?¥Oûh=²�— Ú³¯…¶Ó'pßMËï ß|X¹=N2€OøõİÍÊF6«…±yc×®xûÍc%ËȲÚ‹¬ƒ«üÆ“7�c‡Ù_ |³¯„ë³lОù5Û#õTíG�ûnH-VûwÁûv:‰cn“þZïû| A|ÖE°ÊF“04oœÚÉúXW5/"ËÉ›ƒv¥Œp}=²�ófè$¯b.“ÍÈ~ΛàjŸU²í¿Ý pßo‚w"ÇûÀ/ú5bËÀO“ €1”�œ/o¼Ú xN€×®gYV–™@6'Ü‚õõjªäM×Xû<û4o¢|P2=y³�}³è¾´ï�;‘×ýjÌ"xßmý>Çðj ‡~Úñ,£lØgyC•7;9©n_ ³Ž`=²œ,¯�D c7#Û<ûÌ7ÕÙ·yƒÔþa¸L6/û=û|™ ]»›îô-¼çuDð¾ûÖÀûË·ék猛âÛyfÖA°ye#À¾ÈIrNHÛIrÞ0­+\ϲڛ©¬ƒ7T›ÓÆAöÅXc }äMW{³œe —Ë4dߤþÝﹺ,¯öéî¸SÉëD5.fÉü‚÷ý‘cÂØÖ÷õχËfzÚxÄì§²`×ä¤7¡gN|óf%'½'ñ}œ•œèæ�W;ѾNCöAöǘ7;mû9ofìãékc`ÑׂŒ“Ìoßî>�;³¤þsܨÆÇ,9.Þ÷OÆŠžJÆEû눼'ëÞYU;‡À3O â³?§Ä·qå<`¶²`jrB—€³sªu�l¶�5ËÍ•‚ÖéÊ~É›’¼ë+ƒ²ÿó#cÏ~ß^yc˜ýXíãJjÞ_-ì/�;˼3<ËÄLWÙ°I9IËÉZÂíœÀ­+\Ï2²¬þo„§­�•öætŒq’>úW±—ÉvÉ>L¨µèØ´y]©Æ‡À�£¬¼û�h|ŽMÕØ9üîñëºoÕÐ0ˆ÷¾ Ø'e#À:$,M°Õ3±Ž`=Z¨êªõí“}•}6æxIXŸ±�7ÆÁnÈ~\6h¦ÒÜ9®«ïŒMÏqâÖ§l[»9AiÞP®ëªõÈÉdÿM„«W·K;mÜTûxY{yÓa<ì–eƒö¼>äuÉ-ôå5§/w–%xç$ àƒ `|e#ÀªZåÍeÿ ÀX!éQ°eY9QsÕúöj{ÆÏX̤�ŒÅôi\ì¦ìÓÔý¢o3&íÌ"pgl‚wÖAϘñ«+Ñ‚ÑM\µÞÔ,7'ƒBÔí–}—úœL�5†23>2F��Ý–}¼è{‚v‘1U��;Ç%xg�ðœA<ÀÑÊF€¡œÀôOÚ×®gYVÿ¤^P¶ý²³/³O J�Ò>„IŸ 4†Ëd÷d -´çM™7c,"c«GwÆ"xgN:€o: —Ë~Ä< löW‚м ÌÉRNš×¬G L³\_ ³{²?³_ÇSÀÝXÙyó´LX�y3F†ýÀ,wÖ%¯M‚w6EÏ:â�}T6û¡]eœ4'ë ׳Œ,«Õº0l÷d|å»�­j,,+c'ã&'íöý“׉¼y¯ÆFEÐΪà�)8É>} àéÄ»¬lvK‚ɼ‘ëŸD¯#X�vrN°]µ¾ÛÚ8c'uûp™ì‡Œ­¼†,:¦2f£‡À�MY6xÏëb«a?0†uð^WÊ1x A|–-ˆVU6Û«…ž ·s»®«Ö#'Cëօë»-û8c-'¤c�³ŒÙv”ñ³ß– Úó”ñhÜp\yý©Æ˜`ˆu¼3Ey lç}Õ8<u_G°YN»J$'Á®2ÞoÙ÷9ÉË8\4ð�KNBÆUNø«ñW´3uwv�à�}ÔàOâja<›$ˆ‡i)aêr²”™v@ÉÁä$Nš* /³¬ÄÚ UÖg¸Ž°¨Œ¡Œ¥Œã±> êìÆ''%ck™«Æ2.�t³ îì‹eƒ÷¼Ž«v…ž} ˆ‡Í(aJr"”㜬¬ûªõvep–›ƒ”ð’1d e<å„g¬“ûŒÕœÀääÅå¤eŒ-´gœç5|ØL•À�}#x‡õð킘á²aÝñp²ÊFØ”þ‹~^ð×®gYV{¡Ï‹¼Ð’±d,eLel�5¦ÓGj$}:ig]2–3æÙ/!Ž×S¶�À�}µJðžó÷a?° rþ’×ý“àŒL‰ ÆQ6ÂIËÉKBÂþc„�‹hAe–›7®Zç$d\e|e¬�5¶S'·>bÝÚÎECA;ÛNàξ[6xO("xg×µó!<ûHË)aL91É‹`NÜÛWh¬+\ϲú'.®椴qž±6Ö xê$ã7'Æ.›’q½è˜Î˜Í›PA;Û.ã¾ãwöMÎß«Z˜EðξÀ³ï¦ħñLAÙ«HÀ’P°½ØŽyeïQ²W­³ný€}Œ±ÞÆqú4†Ù´e‚öÈØõÁ»Bà&x‡Å´÷Âxö� ž}W6ÂQÚÕ¼9ùnŸè¯+\ïÿ QÖA0ɺdœå¤!' c�÷ŒçÔPú5Ž™‚¼¦æ5¶¯A;»Hà5Á;,§Ž'6 àÙF-ˆÏñDÏ.+¡/AJÿDá$>­¯$Ð̲ò"ìªu6¡}°”±?Ö¸^Å>\&lJÆ{N8ý0)ãØ‰)»Jàó-¼ç|^ðx˜eŠA|ÖE=±ª²‘ý”°%`^TÖ}Õz !Û§‹Âu6¥Õ@ÆãXã?µÔvãš©Y6hÏxN� û�]"p‡ÅäxPÕÊ,‚wx0<Ì'ˆg[•�ì¾,íE+/ë ׳Œ,«ðwÒÍ&µZÈÁ;c³·ËÊ8ÏχGv¦*c3¯Ã‹¾ög¾3Œiö�À–³lðžÀÂ{8ŸÓâsLÙTßÞû â*Ù FrUmÿÀ½h¸r\YN–×^x\ÝËd æ ˜z냦6ÖÓ§qÎÔe|æ˜�«4ªñ<”ñ-hgßÜa5‚w—–#ˆg*ÊF¶S Û Ëº®Z�áUë ‡ë›’ƒnê"ct¬šÈ˜O�e¼ "Ù¯‹þ%Gj%¯éÆ7û(µRÕ…À“s¤ª†fÉü‚w8ÚIðíýÍp¹°í¦Äç/ì[ïýÖn*™¶ãðªõE¯T<®¼8´ 1/®æeŠ2&sàJ},.¥Û¸.¦lÙ =c]ðÁ>¸Ãñå|,�BUK³Þa9x8ž«¦ć ~·”�LG [ñ'0IRçØZè’åæH¸Î”e|¶€}ŒI9ئOcŸm•ãG^Ç«1^ɘ÷�ÜaL9‡¼Ãzàa9vM-ˆOm â·GÙÈf´?qiȱ®Ì=J‚Å,+E¬€Ùí˜ÏXB¥Ÿôçf§l»Orb¸hmä˜ãÍ<@àã˱Iðëu’|úÀ³�RWÉ Z?V±,Aü´•�œ¼B+Ðu_µÞŒí«1%Û ã4‘LÆú0ªÕCútU/» u’×÷E�)©¥‹†ýÀ¾¸ÃÉ¼Ãæ¬#€w¬d_M1ˆ—÷mNÙ¸¬{ï½·»óÎ;»[n¹¥»é¦›XÀ ×]ÝýÌã¿áļäIÿCwÍ…ÿº{Å©èN¿ð)‡Ë»ñúÓåºl«Œ·Œ»Œ¿á˜ÜêêÁƪ™ÔÅ«ò±Ý/¿æåݯÜxC¹¬m´«õ —1�×þjÜe¾_xɳvªŽc×�'ÍÙ³g»[o½µ;sæL¹xÀ¬cÎk_qU9?–qv÷Ýw »z,N™ãÎúä½ÉÏ_ñ£e­Í’c]Õë1åã¥cÜjr\Ë9áË/ùβæVåx¹~Ûzì݇ãnêá_vùa6—Z[ô=ÛÔâñç¸W6.ãöÛoï®|ޥݩ Û�zÊu§žôý,ಟøîî’G}ëH¾­{öcþ—îÒÇ}GwéãvÐ÷÷,ãûÎ[æÎyê#ÇÝå—^|xpŽÍm¦®Î·zÍÔÇcÿMwÙÞ�zâ÷–}u°œÅjäÛ�{qŒXÆO"'ˆ7ÜpCwꢧt§žñ¨zð ³êé²'|W9?=©§§ýXwêÂ'v×^{mwîܹƒaX�Í©qÜÙŒ¼w¹ô±ß^ÖÜ�ܰ /ãÆ•˹bò…ª¥V×lK�½û~ÜM�$§¸ôqßùW5÷mçÕÒq©Åc:Æq¯l\T’þSÏ||wÓÏ=µ»÷öWvÿå^Ýý×;®ƒµøÚÁxûÂ{®éÞ~ú™‡ã0'ZÃ1º�Ô«hõðÖW>m'êA°N»V?}yÃuÕÏé®|Ö�w·Þpi÷•¼ªûZ± `Lÿë‡~¾»ç]/éÞø²§Ž¿mxãï¸G›ÚñÒ1°mÇ^Ç]¶ÁqŽ{eã"ò§*ùù}7ž*W ÖéC7=÷p<æO=†cu›¨+ÆÐêa[ÿœ_°IÛ^?C9)ÌCŸúíŸ)Ÿ/œ´wü‡‹ºÓ§O ÇzŒN�ã,o ÇKÇ8¨MýØë¸Ë6Zö¸W6."·öiåJÀ&Ü|ÍS·þªDuÅXn|É“&p̢شm®Ÿ¾|Ÿmþ´ø}7^^>OX—ë_vé¤?ÄrÜ�ÕlòxéóMùØë¸Ë¶Zæ¸W6.âêþd÷Ÿ~ãå À&|þÖŸ;üÓ©áXÝ&ꊱls=¨6mŽ'‘ïÌ÷yæÏ «ç ëòÉß~é¤ï�หÙäñÒ1æ›ò±×q—mµÌq¯l�;{Ià¸Ãêî0.�;ì&�;L—ÀÆ'pg/ ÜáwX�ÀÆ%p_Ÿß~ÍEïòþZ÷“Oûžrú¢¾å›þ_‡ý¤¿j:„À}½R×S©Ë¬G^'ªiLƒÀ}|íØXMc?lMàþGoý©î±ß÷/º‡ü­ÿëá m2ˆ/zÔ¿énû•ç”�;ŽvzÜ"iëYMkE8ÏqO‚7aJøŠÀý¾qYɘüõkf÷¿h-.2¶ûò˜6næ™UKS6ÖÚ“²Ï�{WÕ´Umj«ŸÍ¸? ½îÏ;ö·±˜ŸÛ¾]Tí÷‡ú}÷]ÿ‚Çœ÷¸¦µ÷Û*‹Ǧ:.çi¯óöÓ&ízàÞ¶dœVóDÿ<«š>†±^_©ý)ÙÕÚnÏ«š6Û¸÷k7ÛºšgŒZ˜×ÿ2¦ôZ¿ÌsjÛpžm¬Ï)í�Ê.îÕ˜úÿ§ÿ}÷½ßö�ÇÚylúš5Ûr«iëÖýšeŒ×�u›z]mEàž/1}'18ZE5}QóÖ¯*þ!”ñ Üf©ÆÝ2µ¸ÈØîËcvõ@pÔÁxÓîãžmj«ŸÍ¸? ½îÏ;ö·±˜ŸÛ¾]Tý¶Y�e?¬Ž�ÖÞo«,r›ê¸œ§½VÌÛO›´O�û¬�úE5ÏÆz}]¤ö§dWk»=¯jÚìRàÕx£òøôSM[Æ”^ë—yN»ZŸSÚ•} Üûæ}ø=Oöe?k<¶åVÓÖmøúUãugݦ^W[¸·7Mùª%û=¿ûÒà ›«jsÅmÿ1S2oð¶"œêYÕ® ü):É 1W¯÷_ŒScýéÇ­Å£:mÙù¿š¾­²m¦ü¼îãžmj«ŸÍ¸?`‘sšL�jZ,²¿[9&U�e룭ϰ¯öø~[Å9ÚfìKàÞΩª7ú{müÅpúX©·El[­ìjm·çUM›‚] Üó^'ÿg{çclÍê{YSz­_æ9�± §È±wycîýmßþj?í¹ p˜{,"ýåñ³Ž¡m¹Õ´ukãoÖºn«©×Õä÷„zÙ€ÿøïýírú<­ˆÚ¹ÕŸ�¤=…�ëÏÛb›Þæ�V8ÃÇäĹÿU­+­ÿªøgiƒ)Ïa8­ÚN‹®g_ÚÓGækýUóööð1m¹•~ylžK›–õjÛ¥/ÓÒç¬}´ �û}Û5ªimöÇåqj±ic£šm\-²o[}eÜ �ù=í+yH[ÌæçLÏï™gÖòòœ£m]2mø˜ŒÙöóPûV¯Wù}øÜúÛ°ÿ<ÒÞŸo÷£O„²²�Ûþ‰¶�Ú‹ì“6}hÙý½ê¯ÆèЪ}çqýq—yf-Oýl�m ÜÛUÀÃÀ2ë‘cUú¨új�ï·Uy>M[VÆïpZuüló§ïü¼HMMñ­õ—ŸûÏ#íÃyµ/�{Û^ÑŸÞj û.ÿ·íÛ¤}¸Ûþ¾æµ¾2møúšiýéýÇ¥Ÿ6n†õuíe?|ÿ~ÎxMŸí÷ôן7ý,òÚÜ–ÕokíyLÕÞßnm{¤ß¶]ó{þÏúöÛŸ¸¾•6oÕOÚ2-œ´¶þºôŸ{Ö¥ª×Öi~®æm}ççþólí•Lë÷‘ý¹È²Úc‡Ïc8V–±+�{þÏ6ÉÏÃ1ÔöÅ*µÐê±Òßó´õM¿ù¹�—Ìßï¯oÑs·¦ßoä±éc8_¦ Çb´í˜ÿ[Û¬mXióN½>Û´J¿�MÖç¾îMÛÞ™Öj°?ûÚyg¶säçJ[N[nöSLäÿjÌÆ¢ã­-?Ëê�›Œ…ŒùY¯ù¿ß^ió¦ž‡ÓÆ:§]ôµ¦ß÷pÛ,ZWyì"ËjýåçþóHûpÞEM>pÏ%O2;k8hæÉl/<•6_~ΆÎÛv@~nà¶#fõß ";¶š­ÿÖWæí/c–6ÀúE—íÒžC GbÑõlÚ H¥ Š6ðû¾iË­,²¬á \Úæí£UÜïÛ®QMk/.ýñ´j-öµ±QM‹6®Ý·—™8>Û jŒ·¾gÕð�y¯!ýL´Z¯ê!ãyØÖ´º?jYýíݶápYioó,Kà>{L6ó^Ïû5ÑÆYe•ý½ÊW?P?‹ÙÖÀ=?çxÕßíñ9ϘUýÇϳÈóékãj‘s´ekjªçh­¿1kjŸ÷¶­ûc,Û.c&?·íÙ¦E{|e¸Ý[=Tc!ÓÚôôÙ\{íÍúUí³ôŸGÆ~µÜÖC;åõ¼µµóÎÖTÚúcqÖ8lú�ïÏß_ßY²Yßá:g]ÓG–ÙŸ¿õ=«¶‡ë²LmÏzž­½’iíñóößp_§mWÞ�DàÞÆEûFÛ«ÔB«ÇJÛîËœó´õ�5ÿqÎÝbÞxŽó´ ·UûýZŽjβ-õÙ¦UÚã7]Ÿû¸§e»æ÷þxΛi­¾*­¯6ÿ¬ú?ÎxkËŸÕ÷¬ù#­ßþ:ŽuN»Ìkͼç¹H]ÍÛ¦³^{†ËJ{¾eL>p�6èóD³Ã«Á?Ô“�ØæÏÉÏ´6_#VXmà¶#Úú´öö)j¿ÿ¨úhZ_óô‹"Ï%ƒ³?ÈÛ‹ó°`—YÏô•¶ôÛAÏÏ­R­½_Tù¹pïO¯¶i{ÈýõJÿmp÷—•ß#Ï£êo÷¶k¿-Û½…mÕ˜]¥ûÚ˜¬¦E7ó ׫�™6–ڋꬃLžCæic6cª�ñþóiϵ?¾3o[^ÿSé´§-ú¯9Ãéé«ßÞ¤ÏV{mYé£ÕvYm¶çÑÚ�Cà>{LΓ}ÔöG5ÆØßmþ´/:ÆçQ?ê§2vྈêñqÔþŽ~Ù¿ù9�ËïÙïÙ¿ù¹�Ûa_ýÇϳÈóé÷�q—±m·qØ?߉¶n‹ÔTþÏïmœ·>òs›wSçh'QSû¸ç÷lïöÚÜöuÛ–ù9Úcgɾl¯»ýýÓê)}}mcv¸?3ÒžõŽ�¶ìþ˜jýä¼²?–Ûyfþoó¶¾û¯×Y~[^ÿ˜ÔÖ¹¿~³ÆaÛÖmû矧¿MÚú¥ò{jª{†Û´õ�ÿûÛ©½Ve[[Ûßé§¿Þù9m™¶L½µéÃöhÏ!Û½ßgÚ³¬èÏŸy#}ö÷ëqìRàÞÿ½¿ŸÛ>Xµ"mé§ßÖ,sÎÓÖ¯�—yÇ™huœÇõçm¯ýU}fZ{®yL[f5žúÏ©=>ëÝŸ/Ú6œ§íƒØ–úlÛ¦ª§)Ôç¾îmÜ·im,ôÇXd¿¤½_¯yL5o3kL´±�é­mÙñÖúÈ´üܯٴG›·?ÿ<Ãõic¯ÕQ{�é×N´¾ÛóóµfÖóNoû¯¯=‡ôÛ_çlǶ¬ejx[¸g#´�ÒdÃeƒd÷w^›?óôÌ,™¯½8Wª~ÚŽè· §õwܼuióÏ“çØL{AÎcÛÏÃp$–YÏ6P‡ËŠ ¶á2ÚüÃbN¯~{î·HÛp=òû¼}´ �û}Ûu–lïá‹Y,[‹CóÆd´q3Oúè?¦½�FÖ¯½¨öç‰yc²Mk/î™§ZV´1Ú_F›¿ªÃþôþ¸nÚëÕ¬õlïþz´mXíŸU Üg�É£TûvÌýËŽñyÔ�ú©lsàž}™q›e·ñÕÆC›Ã¾ú�Ÿg‘ç3ì{Ñs´¶n‹ÔÔ¬ç›>G;‰šÚ·À½¿?òf6¯[mÞ´Gû}žj¿¶zZôõ5óå÷ê5µ…ƒÕ¸iã ?-¿§6«±ÑÎ%Û´üŸßûá[–ÃmÒžgŒÎ‡i�~Û*µÝ¶MÚÛÏU�µ¾‡íýi9vå÷ö\†ËŠª¶ç=ÏþôjZ¶e;öµe ÷_u>p»¸g?dŒ÷·kÛ«ÖBä÷ôÓŸ/–=çië[Õl›¶ê¹[õ<›*”ë÷ÝŽ�ýzïk}Ï3¬™m¨ÏÖ_µÍ¦PŸû¸g?·ãZÛgÿ Û¢�ë~ù9mÕ‰yc"íÑ~_v¼µùç�óþº¶ùçÉãúý´ZM{û¹¿M뻿¼á´U_kæ=ÏþôjÙS8§ÝŠÀ½ÉFÎΆÈA+£éx†;užÌWí즚ÞvD¿­©vø¼e´¾ª2O+ø˜õb»Ìz¶y«ÁØ^túÏaÞÀ>jz{a›'�oóç÷YÛoU÷û¶k%û§š¿oÑZš7&£�›þþ_D;EÖ§ÇóÆdÚúËmóÎz.©¹Lo¿?4oz;ÌÓÿGmÃUÜÛžWÙ‡Ùm?4ý};æþn–ãÕrçQ?Ç#p@Û¾Õ8iÚ~©¦ÅQã!†}´1—±ÕƒÔÚ‡} ?Ë"ϧ²È9Z[·ªïá6hë1Ås´“¨©} ܳóÚÛ^û¯�m›·ß›ì»vÖ×ô÷ëp, õ§·cÁ¬y³ŽQMÖJëwV –uïÏÃúÍô¬S[¯‚UÁÔ¼qXM®ï"²ŸúÛº bÞº´}ß–Ûæ]´¶çõó¦gßeÚ<ýí‘ßûËîîý¶V·m´m™ÿóû2µ�ß«m¿ì9Ïp¼õµõjÏeø<†ÚØo¿çça6-˜ëo§üžuKg,Î[Ãm¸ˆm¨Ïyûc õ¹�{%Û¾_šv×BÞvœŽùa ÍÃií÷1Îõªi­mÖºÎ2ö9m›wÑךy}5} ç´[¸e0¶ mpµSú2_àUÓçíˆjÙó–ÑúZd]ûò\ó¸˜õiÏ2ë9oÞÈ´þs8jϛޖ5OYÃßÇ p¿o»Fû=šü^tŽ2«‡Žg­�ü_MŸ'À€ˆá6\ÔÔësÞ6NûQ†Û³¿ì1ì[àžñ˜qXåm ·mÜ>ìÊÿÕ|ý}Ó7oL §Í›72­­OÌOÕ´Ö6k]gûœvÞ¼1ÜGÍ?ozëkžþ6=j¬b«÷¦m˜¶‘ÛFŸuÂØ7ÜÈCÕôy;¢Úáó–1\÷E ?iª*ˬg›·zÁi'ºýç0ÆÀ¶Ï2\öî÷m×á~h'*9Í:Q™§íÛYãâ¨}߯Mþ¯¦ÏÒ?Áʉ\õ�Á¼1™¶þrÛ¼³^C†Ÿ¼?4oú¼õª,[?‹¸Ïßží50ò†?ûª½VVûvÌýÝ,3Æ«åΣ~ŽGàþ€£Ž‘éóöÁQã!ª>r^”ñÛ?vµñ1ì«z|e‘çSYämÞØnƒ¶Slã«Ú¯Ã±4Ô¦GúK¿³Ž™§…ŠCÃZiýÎ ÕZ¸Þ_×öÜò—ÚiÓr•Z~oÛix|™7«iÃõ]D¶s;~Ŭç6o]†û¨Í»hmÏë;æMöu”eç_Ä.îýöŒË¶ŽS ù½ÚöÃñs”yó·õjÏ¥ÿ†óÆðÜ-?Ïz=hµÜúŽüÙmÍZÖp.bêsÞþöu”eç_Ä>îËŒ©Œï<&û¿ýÜŽ·Í°Ž†æ�‰á´öû¢ãmÞxª¦µ¶Yë:Kj)�‹ÔØpļun£65óú>jú¼í_YvþEìdàÞvj@ÎrÔ|Õôy;¢_˜­mÞ2Z_³P%ƒ3�ɺ}ÚVT–YÏ6P[!ôõ—×ÚŽ3ðÛ´á'„³dÞYÛoU÷û¶k ÛÛ‹ê*Ûü¨ñ~‘ç3´è9Z[·ªïaMÍz±és´“¨©} ÜgÉ|ýíÛ[]eVí×üN-ÌÚö­^=çië[�óãž»Uϳé×Jkë?>ϵ½žÌ«¡ªïY¶¡>çí�öØMÖ§ÀýÁÚñ¦�ÕŒ±á<­nª1óÆÄpÚ²ãmÞxª¦Íë–þrÇ:§mÛ¬¿Õkͼ¾�šÞ¦mòœvò�{6\žx6Òp#æ©mÄáA¬½`f·ÍLώδ6_æ©vvSMo;"}µefíÅ}8Ö-íÕ h}Í@CYNú«xmWíG­gÜé»ßO~nëß?5ð[AfYýýmY‘~ò{›–þZA·¶Ì7ܦÇ%p¿o»Æ°=û«Xú/êÙ7ÙËÖb_“Õ´h}äÿjz%ëše¶qÔú Z{žS›7ë9k½ÛkH¦·ö<ï¶múc4ímÞÖÖ—í“éé³?Þ›¶¬ÔK¿Îòs–Ó.GmÃUÜçoÏYû/'õmô÷ý˜û;–ã³ÆaEýŸÀýmû�}™>o5â¨>š6>‡}-úøEžO_Ægj!ã¼µµ>†çhmÝ©©LomS;G;‰š¸? í‹ö{µïòÆB{-ìï÷£ê©šžc[Ú2Žû㣭wÚÛ¸Èÿ­=úËÎkoÚ²®ýùó{koó6혔éý1�Ç¥-Ó¢ÿ˜˜7«iËÖvÛ&í¼8Û¥­K=£_ómûõŸw¦·yûÏk‘Úž÷<£-£Úß鳿¬þøÉóËþêo�ÌÛ_×1ìjàÞŸÖ§Ú¾¯Æç2çÔöÛpß�µ¿ÇãqR}«�{´íÛöM¥í—jZ,2Žê£iãvØW{ü,mÌ´ç3O¿ïŒíŒÅŒÉÖ6ë­­Û,ÚšwÞ´És´“¨)�ûÚ6o¿çÍä¬×»ÖÞßïGÕÓ¬ém dL·7°ù¿z-ŽjÙ™¿O††õдãR–3œÖú†“1oVÓ–©íVÃým©ÑÌ—öÖóú®ž÷2µ}T½U}å1mzõž´¯¿ÿò{ÿ±cØåÀ}X›Ç©…yÙÁ2çÏ6ÖgúöÑŸÓõ)p?_Û'Õ1©™÷eÞ˜¨¦-3ÞZ}WÏ©švÔëAôÇTjgX›­Þ†µr’¯5óžgUWó¶i¤ÿ6ï¼ýµªÉî‘”Áž�ßß8ÜxÃÆ&;2�k;3ÿç÷þÎJ{` UÓÛŽÈÎiÖúî¿Ð7ië¯G“ßïkž6ÚIhÿS˜¦:¨,»ž‘~úÛ9? $Žø1ìk¸óØœ4·íÒæÉóë¯_õØã¸ß·]£šÙ?™žýÓ^hW­Å¦�ÉjZ´q5O mÌWo¼ªƒAë;ëÙ_ÿ<¾ éK{¦·yó<[=öµmUMk†}eúËÍzfÛ¶Zmó ·ëQÛp÷ÙÚxk¯ã­=û&û{Ö¾c¯:ÆçQ?ê§"p°V'íùÌÓúÎXË£µu[¦¦ÒOÞüœ¶á|­ïyûaØW{ÎM›uÉë@žá9ZÛFýÇ—ÀýmÛ÷Û2>úc3?gVûý¨zš7½�é¼¶¶¶¼žö_‹ósúhëÓ_v ßåÿü>ï}HæË²‡Ó2ö2­ª±yã°šÖß~³´mÒꤪ˶�úëÛúÎãÛ1i‘ç½HmÏ{žÍp¹Ãm™÷ ýçŸy²Û{Ó&Ó2_¿í¸v9p�~°sœZΛýÙß?‹žó´õMûðõ~¸~Íð|+˘õ|£?Þ"�­j¥-wØÞj>ë×¶E|ÎÒÖ©=¯m©Ïa_Ãm²Éú¸ŸoÞq§ÖLöo�óÆÄ¬i‹Ž·VßÕsª¦µ¶yÚ˜jµS=ï¬K¦e½Z[ë{øZ3ëõ †ÛmÖkͼçÙUWyl–Õ^SÛ�;{Ià¸Ãêî0.�;ì&�;L—ÀÆ'pg/ ÜáwX�ÀÆ%p‡Ý$p‡é¸Ãøîì%�;<@૸øî0]w߉î÷Þ{ïa�|õƒ¯*›’�Ÿðá˜Ýꊱmc=¨¦b›�'Í™3g„LF±á�Ç8žM/ãàhS<ö:î²í=î•�‹¸êùWtþ;?S.6á³ïþÙîª+žs0<ë1» ÔcÙæzPlÚ.Oâ–[néN=ãQݽ·¿²|ž°.Ÿüí—v džct*w`5›<^:ÆÁ|S>ö:î²­–9î•�‹8}útwãKýÓñÖW=£»öÚk†g=f·�ºb,Û\ê€MÛ…ãIÜyç�‡W`|ðæç•ÏÖå�¯xv—ñ8£SḫÙäñÒ1æ›ò±×q—mµÌq¯l\ÄÝwßÝ�ºøéÝ�¿~e¹°Nò/èN=óñ“~3·uÅëáà ȶփ:`“¶½~†rB˜?¹ÿÒ{_^>_8iïyýs»k_ö³]þ„|8>§Âq–7…ã¥cÔ¦~ìuÜe-{Ü+•0$ä|ûégvñþW”+'åk2îÞ÷†çŽÃ©~7è²Ô«ØµzP¬Ó®O"ß/xù¥¸é9þôžµø/ðêîó·þ\÷×]tøg·yc=›Sã¸G›ÚñÒ1°mÇ^Ç]¶ÁqŽ{eã2n½õÖîÔ³/ìN]ðØîÔS~¨»òé?¸Ÿžö}Ýûßpy¹ƒNJ–W®Ë¾xæ�~oߕϻ´Ë8œò•SËÚ‹ºR3ãÚÁzØûã‹YŸ>žDî¢xàÁIâ©§>¢;õÄï©·Ã.SOku8ÎÆÛéW¿ªËøŽÉ©ÚûãÎIRƒ»a‚ÇKǸ‘©Õ­µ�Ç^ÇÝ9Ôâ4ã¸W6.+Ÿ,ß~ûí‡7dȧTû(7}¸ò)ß]Ú“rÝ•�>üä²ZŸ}�ñ–¿Moä–±ëu¥fƵ«õ°ÏÇ5²>»~5ãQO°Yj¶ƒZ…iP‹Û¯ldyù1ß÷Æ—üD9xÇ–åä&»~5»KÍÀ|jÆ£ž`³Ô lµ Ó ·_ÙÈjòåùùθÏÝúsåK¾°ÿÊgüûÃ?o®l5ó©�z‚ÍRƒ°Ô*LƒZÜne#«É÷e�ºð‰Ýï½ö’r�å§ŸyxS‰|OÝp`›¨˜O�ÀxÔl–„í VaÔâv+YÝÕ/zááÝ„«A<–kNýh—åäOL†Ë‡m£f`>5ãQO°Yj¶ƒZ…iP‹Û«ldu¹{í©g<ª{ÿ./òq}øMÏ?¼q‚°+Ô Ì§F`<ê 6K ÂvP«0 jq{•�¬.Ÿ]~Ù¥ÝuW<²ÌÇuý sx#ƒsçÎ,®^Ø&jæS#0õ›¥a;¨U˜µ¸½ÊFŽçðÆOúþÑol�þÜÈ€]¤f`>5ãQO°Yj¶ƒZ…iP‹Û©läxΞ={xcƒ·¼ü©å ^Õá� úu#v�š�ùÔŒG=Áf©AØj¦A-n§²‘ã»úê«»+Ÿþƒå ^Õ‹/úwݵ/ûÙƒîëeÂ6S30Ÿ�ñ¨'Ø,5ÛA­Â4¨ÅíS6r|·ß~û¨768¼‘ÁAndÀ®R30Ÿ�ñ¨'Ø,5ÛA­Â4¨ÅíS6r|íÆ×\öÃåà^Vndpåó.u#v–š�ùÔŒG=Áf©AØj¦A-nŸ²‘qÞØài?vì|ò�Ww§žú72`穘O�ÀxÔl–„í VaÔâv)G>):uÑSº7¾ä'ÊA¾¨Ãôs÷Ýwt[/ v�š�ùÔŒG=Áf©AØj¦A-n—²‘ñ÷ÆñþW¸‘{EÍÀ|jÆ£ž`³Ô lµ Ó ·GÙÈxolpÁcW¾±Áá� ïFì 5ó©�z‚ÍRƒ°Ô*LƒZÜe#ãÉ� ®~Ñ »_øå`?ÊuW<²»êŠçtégØ7ì"5ó©�z‚ÍRƒ°Ô*LƒZÜe#ã:sæÌJ76h72È�†}Â.S30Ÿ�ñ¨'Ø,5ÛA­Â4¨ÅíP62®|rtêÙ.}c72`_©˜O�ÀxÔl–„í VaÔâv(ßéÓ§ol°è'P¹‘AæÏã†}Á>P30Ÿ�ñ¨'Ø,5ÛA­Â4¨Åé+ßá� .|b÷{¯½¤üC™/72Èã†}Á>P30Ÿ�ñ¨'Ø,5ÛA­Â4¨Åé+9¹±Á•Oùîrð]wå£ÝÈ€½§f`>5ãQO°Yj¶ƒZ…iP‹ÓV6r2Þükoì.}âvw½í§Ëh2ý²'~wË-·<¬î ö�š�ùÔŒG=Áf©AØj¦A-N[ÙÈx¾ôg·uŸûÈ™îžÛ^ß}ü=×w>ö{�¼±A¦?ëqßÓ}ø·^ÝÝsû�ÝgïxS÷÷|ì »z°KÔ Ì§F`<ê 6K ÂvP«0 jq{”�Ï×¾òÅîsø›Ý'Þù’îÓï{m÷™üÊý~áê »Kÿ�3ol�\ñ”ïé^ù“O}Ðã"ý}ö#o=XD½\ØVjæS#0õ›¥a;¨U˜µ¸�ÊFV÷åOÞÑ�½õÕçAsÛ[®í.zÜwϼ±Á;N?³»øqßÕ½û¦—–��ôÿù�½ý`qõ:À6IÍ|òw¯=ñš9÷G郞ÁcodðÇïzMù¸Yò‰pÖc¸n0EjæS#0õ›¥a;¨U˜µ¸;ÊF·Ì§Nññ[®îîxÕúýØßí.~俺ÿÆùÿ9�û×Ý•?øwº�ü‡èî~ËååãgIA × ¦HÍÀ|jÆ£ž`³Ô lµ Ó wGÙÈb¾ø§ï-f%Eð¡kÚ½ï§ÿÑ¡·]úº'×?èÞòò§Cnd�ßßðŒ¿wÿ<™ÿO㪲¿Ê¹»Þu°ZõºÂ¨˜O�ÀxÔl–„í VaÔân)YL>ñ©åÐ]¿ú¬î¶«¿éþAÞ<íßþ­îyOø7‡Åð ¾§{Æwþ�óæ‰E?‰ò S§f`>5ãQO°Yj¶ƒZ…iP‹»¥läh_þäå€ʧGU!ÄõOùúî?øO¿W)ÿ¿â1_W΋~ uî�Þy°zõ:Ã&©˜O�ÀxÔl–„í VaÔâî)9Úç?úör0å»”ªÁï¾òºÇ~ëßêN=þ;º§~ç×u·<ç–óÅ~ö›Ëþ‡>÷‘3«W¯3l’š�ùÔŒG=Áf©AØj¦A-îž²‘£}æƒ7—ƒq¨Ø}/|ÄCº'=ìÿyx#ƒjzß§ß÷Úr}¹ÁÂp]a Ô Ì§F`<ê 6K ÂvP«0 jq÷”�í³w¼©Œ}¼Õ îË'N�þW³ûµ‹þ~9½ïì­×•Ëy�ƒ"®+L�š�ùÔŒG=Áf©AØj¦A-îž²‘£åÏ*ÊÁ8�?Ó¨vß"Ÿ<ånÂUÿC)ÒáºÂ¨˜O�ÀxÔl–„í VaÔâî)9Úÿô½å`Ê�ªÁÝ—ïYªÚûrâªÿ¡¬×p]a Ô Ì§F`<ê 6K ÂvP«0 jq÷”�,æžÛo,äÐGùqå_T_õ;”õùÚW¾t°jõú¦©˜O�ÀxÔl–„í VaÔân)Y̹»ÞUÊJ>=ZäO?ún»ú›þÔ)ò'(Ãu„)Q30Ÿ�ñ¨'Ø,5ÛA­Â4¨ÅÝR6²¸{n{}90gY¤(îxÕÃçË ª>*YŸ<± Ô Ì§F`<ê 6K ÂvP«0 jqw”�,.pÑ?ûèË@Ïw/Ýý–Ë~|ü–«»O¾ëšrþy²ü¯~áìÁêÔëS¢f`>5ãQO°Yj¶ƒZ…iP‹»£ld9ùÙ»V*ˆ1üù{ÉM Ø:jæS#0õ›¥a;¨U˜µ¸ÊF–·ê§PÇ‘åùÔ‰m¥f`>5ãQO°Yj¶ƒZ…iP‹Û¯lduŸÿèÛ»³·^WÞ±äOB²œàpù°mÔ Ì§F`<ê 6K ÂvP«0 jq{•�ßg?ü–ÃïNªóªR÷Üöºƒ"øâÁ"êå¶R30Ÿ�ñ¨'Ø,5ÛA­Â4¨ÅíS62ž/üÉ»»Ï|ðærp/"ÒéG°Ô ̧F`<ê 6K ÂvP«0 jq{”�œŒ|Ò¹»ÞÕ}öŽ7uŸ~ÿëîè‡n{}wOÿ�LÏŸsäF þ¤ƒ}¦f`¾~�œýýÓÝ'ÞùÒCgÿ?tŸúÝ—wöötgÿãkÔ,@=Áf9ïƒí VaÔâ´•�Àvùò'?Ø}èšo;Ïþ“ß;˜\?¨©'`Ue#°]„0õ¬ªl¶‹€Æ£ž€U•�ÀvÂxÔ°ª²Ø.B�zVU6ÛE@ãQOÀªÊF`»a<ê XUÙl!ŒG=«*€í" „ñ¨'`Ue#°]„0õ¬ªl¶‹€Æ£ž€U•�ÀvÂxÔ°ª²Ø.B�zVU6ÛE@ãQOÀªÊF`»a<ê XUÙl!ŒG=«*€í" „ñ¨'`Ue#°]„0õ¬ªl¶‹€Æ£ž€U•�ÀvÂxÔ°ª²Ø.B�zVU6ÛE@ãQOÀªÊF`»a<ê XUÙl!ŒG=«*€í" „ñ¨'`Ue#°]„0õ¬ªl¶‹€Æ£ž€U•�ÀvÂxÔ°ª²Ø.B�zVU6ÛE@ãQOÀªÊF`»a<ê XUÙl!ŒG=«*€í" „ñ¨'`Ue#°]„0õ¬ªl¶‹€Æ£ž€U•�ÀvÂxÔ°ª²Ø.B�zVU6ÛE@ãQOÀªÊF`»a<ê XUÙl!ŒG=«*€í" „ñ¨'`Ue#°]„0õ¬ªl¶‹€Æ£ž€U•�ÀvÂxÔ°ª²Ø.B�zVU6ÛE@ãQOÀªÊF`»a<ê XUÙl!ŒG=«*€í" „ñ¨'`Ue#°]„0õ¬ªl¶‹€Æ£ž€U•�ÀvÂxÔ°ª²Ø.B�zVU6ÛE@ãQOÀªÊF˜º{ï½·»óÎ;»[n¹¥»é¦›öÞ ¯¾ºû™Ç|Ãy^ûò«Êù÷MÆIÆKÆÍp,íº³gÏv·ÞzkwæÌ™rÛp>õ4ŽŒ»»ï¾û`ÖcvQÙSvûí·wW^~IwêÉ?Ú�zôûS?þí{ï²û×Ý%?øOÏsÙ�~[9ÿÞyÜ÷Ž—Ë/yÖa8S»(.Üpà ݩ ~¢;õÄ_oJêi©¹'ü@wêé�í®½öÚîܹsò«°KÊF˜ª\©|ê©�ênºâݽgžÓý—߸¢û¯¿ ó}í`œ|á×.ëÞzÕ�ŽŸÑñµKn^õÜSÝ•Oþ¡îÖŸ}l÷•·>÷pTÛNÊÿú¶çu÷¼áâî�W<òp< ÝØe#LQ¾š Wë¾ïšÇ—á,âC¯zâá8Ú寺8¼²ýÑï>uã³ÊmëöŽ«Ó�>}ú`xÖcvEÙS”ñÆ+~´ s`7^þïv6üËw¶çk<Þw­¦˜–ëú)¾Ó€�W6À]ýÓWvÿéµ”A,ãó7?ûð+.†clä;êóÝÙù �ê¹Ã¦|ò —ìÍ=Ø_e#LM¾û÷Ô…Oé¾üæSe�Ëøê[Ÿ{xø.~§ôM7ÝtxÓʯýæóÊç›òo~ÎÎß?ÊF˜šÃÀý‚Ÿ(CXE÷|ýÊp¬m»¸WÏ6MàÀ®+`jîŒMàë'p`ו�05wÆ&p‡õ¸°ëÊF˜�;c¸Ãú ÜØue#L�À�± Üaýî캲¦FàÎØî°~wv]ÙS#pglwX?�;»®l€©¸36�;¬ŸÀ€]W6ÀÔÜ›ÀÖOàÀ®+`jîŒMàë'p`ו�05wÆ&pß·üãÿÇÁÙå_+§-*�?nL—À€]W6ÀÔŒ¸ÿä�ëý�^_‚Âë/þÞ󿝿ýÿ‡ÿÝáü×>ù;º{~åâó-xœç·¯~ÔÂóf½‡Ë˜º1Âד$p?ZÆwÆÞ?þºÿæAã1¿?öß~c÷ëÏÿáÍ_íóÖ¶èn˨¦�iW뮽Ƶח©¸°ëÊF˜š“Ü›„ˆýù«yú¾WAý"ažÀ}³îó%lí•þcª}ÞÚîë!p€Í*`jÆÜûAZ‚Å\­ÞB¶~PÕÚÚïñG¯yÚaÈÞìf]é»HèµÌ¼Û¤=¯jÚÜçˇOÙ ݇ã;c55“iýö1öy¿Žq³«u'p€Í*`jN2po.ú�vÞ´üýùúZ(™+Ýû_/sR�{›7açpZûРϣµµù³nY׬g~Èßü¿œ¢6iï_Ù\®ÑúÎÏÙfé3¿·öJ¦õûÈ‹,«=vø<ªý¸(�û|m÷ÇõQúc¢i57ßé7cµ?&[= ûˆ|ÐÕß÷ù?¿Wë×> h}åç,+}´yÚº.Rwí9|ï?ÿûçM»í?qÿ2Z[ëû$ꮿ=‡�iË­ôûØdÝ ÜØue#LÍ:÷jZ~�þ|C-äêµÌ2aÞ2ó&0Lèýð° ý¢õÝ‚²¡aÈ–çPÍý ?Zßýà.Z{%ÓÚãûáêP[FÚVŸÇq‚?�û|í”EÆeÓö}¿­ÕU¿Ÿ¸Ãq3Ôï#ã{ÖN?ýн}pVé�—¶®‹>¿¶¾ýšÉrÛ¸¬Âü“¨»¶=«í7¯öÚã7]wwv]ÙS³ŽÀ½Qýi-`êÏ7Ô®,Ïã[Û2aÞ¼�¬é¯Sº´%pËï-¼†~ÑúÎÿý�¯­s´֖Ǧ-ýôƒ·üÜ·Ÿ­½õ�>†A]ú°=ÚsÈÃý>ÓžeEþÌés™x�û|­Úþíï§Yª}Þj®¿ßZ(žq;ÜÿiöÑÆwÖ£…ë¯mÛ_|´1œuî÷›Ÿ³Ì6_´u�§_wé»�ÍVgmùýÚŠÖwþ»îÚöÌ´üÜÿ°¡?½ª“)Ô�À€]W6ÀÔœdàžÀ«µG Ó¢µµß+ ¢2OB©ÖvT˜×¯Žš7úë-°L{ûyúEë{ØÞŸÖ‚·jÛ4 ÿ2­µm{ü0ðN¯¦%ð뇎}mYým”ßÛ c¸Ï—ýZ�Í´eTlµÏÛ¸êÏßÂÝjì´å´ß3>ó{?ŒîË8Êrós›w‘±R=·¡a-´À:�m?÷k¢©¶ÃpÚªu׿¯ê½?½Ú?S¨;�;»®l€©;pŸeêµö~ÛPªÌÓB¿8*Ìë‡ZmÞ* ›%Ae‚°Ö_úżào̵yû84Y^¦Uϱ?_ß¼é [3mžað×_öî‹I0œ±’ퟰ¶¿�úÕÕ>޳ŠW߇­ïö{»*|žþØhë˜úȲ³Ü*ØoëºLÝE»ª½-£š§ÚÍqënøø¡yÓ§Pwwv]ÙSs’�{B¨„U@Õæ¶÷µ@°>.æ-3o_»"5ª@1ZßÕ´YÁßp¾&ÓúáÛQóÏ›žö£dýúó÷—=�ûj2Ö2öZxÛÿ�ªÚçÃq–ÿ‡û·/Óú}T5[ió'ÐoëÑ—úì×I›gÙºk_³®2Ÿ7ö�[wÃÇÍ›žö£ô÷K~ï/{ wv]ÙS³Žïp¯´ªšÖ´À¬  ó–™·IpØ¿Â}x¥qÓú®¦ ƒ¹6ï:®pöu”eç_„ÀýxªZªöùpœåÿü>kÌfZ¿�áã•1›Çäñíª÷U?ëKmSƒý¿™7ö‡Ï§Í»Ž+܇}eÙù!p`ו�05S Ü[ÃïEn!Ú"aÞ2ó6-ô˶¹:??¿'ZßÃöh!d úæm›v5}õîýùúæMoÓÚ÷X%óæ1Õ´U Ü�§/Õ>oóµñÝBäaÍ4™Öï#�Ëï³¾‚fó>0Z¦îúuPýeKSm‡æ¸u7ÜžCó¦·õÚdÝ ÜØue#LÍ”÷e º[xÃpk™0o™ycx³Æ„‰ùz�i­ïwíJܬ éûaZÚÓ–~úá}~n_Òï¿õÝ~j˘$¶eµuËÿy~ 1ûÛ#óö×u ÷ù gße?´ý'ý1ÑßOÕ˜¨à6_ösë;c«�™a-¤ÎôþÌÏ ¾[è�edžŒ¡þ:·šé�¡¶ýõš'Ï;Ϲÿ½í­�~½ ÛÛzŒUwÕöìkdYým鳿¬6=ÿ¯«îî캲¦fÓ�û, ®T ·L˜×æ�§­o?ô«ÅáMçõ�~Ò_þÈU†7fm}÷Ûúª¾úá]½áô¾“þîó ÷G%ánÿ1Õ˜¨âÈý~š0G¿�Ìߟ6ÔÆF–QMoúëÐÖužþëDj+ëп[=ki^ßÃyc™º«¶g_úömú¦ëNàÀ®+`j¦¸'0K•°qxiÓ·Y¡Xß2Á_B¿üÞýšs™ÖèZßy|»J8ëß¿²x(á}[Näçy* Ûû†Ë†‡ ûÏ?óäÊÜ´÷çË´Ì×o;.�û|cÙ_ÃñÙÆO5¶«1Ñjn8~oã¬õÙ‹ûóF¦ež6ž"�Ï:¶;czÖ˜.ø¼*­îZm ?`ˆêîÖ÷IÔݬíÙ7ì+ëÓŸ¾Éº¸°ëÊF˜š±÷}ÓBµjÚ¾¸sRÔÝlwv]ÙS#p_�ào6�;'EÝÍ&p`ו�05÷Õþf¸sRÔÝlwv]ÙS#p_�ào6�;'EÝÍ&p`ו�05wÆ&p‡õ¸°ëÊF˜�;c¸Ãú ÜØue#L�À�± Üaýî캲¦FàÎØî°~wv]ÙS#pglwX?�;»®l€©¸36�;¬ŸÀ€]W6ÀÔÜ›ÀÖOàÀ®+`jîŒMàë'p`ו�05wÆ&p‡õ¸°ëÊF˜š{ï½÷0pÿê[Ÿ[†8°¬îù g8Ö¶Ý™3gîLV>ŽYØ%e#LÑUÏ^÷ç7^T†8°ŒÏÞtIwÕsO «z¬m³[n¹¥;õÄßÝû–ç”Ï6å“o¸¤ËBÃ1 »¤l€):}útwãsQ9°Œ·þÔ#»k¯½ö`XÕcm›Ýyç�‡WïðUO,Ÿ;lÊ_ð¤.ãs8f`—”�0Ewß}wwê§twž~JæÀ"þä—žqHïrð—òµ2_zÓ©rÀº½çåOê®}ÙK»|=Øp¼À.)`ªrýSO}T÷ö<²û‹7_^;0ôµß¸âp¼¼ïåO:?»þ=ÒùnúË/yÖaèþ�W>Ñ×˰ÿå î>Ó³»ßxÑc¿Â)šÇ*ìš²¦ìÖ[oíN]ôŒîÔ“´;õè‡wW>öÛwÏ£Ú½ÿåO(C¬“’å•ë² ~â{¿×üÊË/é2~öá*Û³gÏ~mN>`8õ¸ƒçÿc­·Í>POq8îÆßéW¿²ËxŽQØEe#L]®à½ýöÛoÀ—«ÞwMn{å#¿¥ òNÊu~ßáU¨Õúl»Œ“íûúå«sr#Õj»ì õ´w¹ªÝ×ȰOÊF`³ŸzÂtwýÒÓË0olYN®FM@6\Øvê X—²ج\šïà~ãå?TzcËrrCZ_ûÀ.ROÀº”�ÀæåÆžùÞíÏÝôì2ÔKn&zåã~øÃu€]¡ž€u(€ÍËwŸzúc»ß{écÊ`o,ïxá#o@›ïú®ì õ¬CÙLÃÕ/zAwå£Z{c¹æ©ßÕe9nlÈ®SOÀI+€i¸õÖ[»SOü÷Ýû_þ„2Ü;®_÷äÛIº¹#û@='­l¦áðf�—=»»î‚‡—ßq]ñ÷ÞÜñܹs‹«×v…zNZÙLÇáÍüÛG¿ÙcússGö�zNRÙLÇÙ³goöø–+Q}«:¼¹ãA¿nîÈ>QOÀI*€i¹úê«»+ûíeзª?á;ºk_öÒƒîëe®ROÀI)€i¹ýöÛG½ÙãáÍússGö‘zNJÙLK»Ùã5OçªÜÜÜñÊË/qsGö’zNJÙLÏáÍŸðǾÙã'ùYÝ©Ç}¯›;²×ÔpÊF`zrõì© ~¢{ãå?T‹:¼¹ãA?wß}÷A·õ²`ש'à$”�À4÷f�ñæËÝÜþŠzÆV6Ótx³Ç'ÿèÊ7{<¼¹ãÁãÝÜÔ0¾²˜¦Üìñê½ {ñãZ€G¹î‚‡wW=÷T—~†}þQOÀØÊF`ºÎœ9³ÒÍÛÍs³ÈaŸ°¯Ô0¦²˜®\M{ê¢g,}³G7w„ó©'`Le#0m§OŸ>¼Ùã¢W忿ޙ?�öûN=c)€i;¼ÙãÓÛýÞKS‚C™/7wÌã†}Á¾SOÀXÊF`úr³Ç+ù-e 8tÝ…ßçæŽ0‡zÆP6Ó÷æ_}cwé£ÖÝõKO/CÁ&Ó/ûñïèn¹å–ƒ‡Õ}Á¾SOÀÊF`š¾ô'·uŸûÀ™îž[_ß}üw®ï.üñï>òf�™þ¬G>¼ûð[^}ð¸»Ï¾ÿMÝ_œýØAwõ2`_¨'`le#0_»÷‹Ýç>ô›Ý'μ¤ûôï¾¶ûÌ{~å~¿ðÓv—>â_ͼÙcnîxÅ£Ú½òЧ>èq‘þ>û�·,¢^.ì"õœ¤²˜†/ÿÙÝ'óÚó‚Áæ¶›¯í.ú±ï˜y³Çw¼ð‘ÝÅ?úo»wÿòKËÇÇÙ[^Ý�ûÈ;W¯ìŠÔSÆûI×ÓçïxûÁâêuv[ÙlÖ×îýR÷™÷Þ\zCW<åÝóü[Ë€ðeOþÎÃéŸx×ëÊÇöÝóû7,º^Øf›¨§„úÃõv_ÙlÎWÎ}ª»§ðf9ó꫺K~ôéÞÿò'<(üðuO>hhwóµÏ-WÉwYõÜÙƒÕ¨× ¶�zÖ©l6#Wâ&¤«Â»Yrµí?öðîº þ €ðú‹¿÷ðæŽü[¯)7Kn™õ®lõ¬[ÙlÆ2WâÆÇß|uwNjֽè{ÿnwñ÷Óý7{ÌÿÏù÷ÿSwåwü�î#/ý�îî//?‹¯—a¨'`ÝÊF`ý¾x×{˰®’`ðC?ùÐî}ý£Co{Ò?èžü¯¿¾{Ë•�8 ssÇüþ†Gÿ½ûçÉüzóUe•sw¾ë`µêu…©SOÀ&”�Àúå*Ø*¨ºëúgu·]öM÷ÍÓþç¿Õ=ïÿü0 |ác¾µ{Æ·üßÏ›'½:×U¹l3õlB٬חÿìŽ2¤ÊµU8×ÿØ×wÏøŽxø]Óùÿ?ôuå|±è•¹ç>ò΃իצJ=›R6ëõù;Þ^tCù~é*ð‹w_ð ÝcÿÙÿ­;õÃßÜ=õ[ÒÝòÔXÎxÞ7—ý}îgV¯^g˜*õlJÙ¬×gÞ{sÐ Ua_ß ¿ë!Ý“¾õëoîXMïûôï¾¶\F_n:9\W˜:õlJÙ¬×gßÿ¦2 ëK W}}¹ ÷Ñÿôov¿öø¿_Nï;{Ëuårä½7¬^½Î0Uê Ø”²X¯|ÕDÐ ä«+ª°¯o‘«q?ô“-ûJp9\W˜:õlJÙ¬×ïzoÐ åæŒUà×—ïž®ÚûîºþYeÿCY¯áºÂÔ©'`SÊF`ýî¹õÆ2¤úèÏ?® ý•ÇWýe}¾vï—V­^_˜2õlB٬߹;ßUu•\Q»È×aôÝvÙ7-|%näk9†ëÛB=›P6›qÏ­¯/úY ïxÑÃçËM"«>*YWã²íÔ°ne#° åý*Œ¾„ù>ê»o¼ü0 Œ�¿ùêî“¿qM9ÿ<÷üþ�ÝWÏ�=X�za[¨'`ÝÊF`sþòÓw­ŽáÏßõKnìÈNQOÀ:•�Àf^™ûûë ]‰Ë®ROÀº”�À4|þŽ·wgo¹® ôÆ’¯ÉÈr|Ç4»N='­l¦å³·¿åðû¤«€oU ïy÷뺯ÝûŃEÔË…]¤ž€“R6Óô…�½»ûÌ{o.¿Eäk."ýÙwê [ÙL_¾úÜ�ïê>ûþ7uŸ~÷ëîÿrƒÈ{n}}wOÁ™ž¯¸ÈÍ#}ÍÔÔ0†²XNÙ,§l–S6Ë)€å”�ÀrÊF`9e#°œ²XNÙ,§l–Ñýµÿ?“Ò)ñ�àIEND®B`‚jupyter-nbconvert-5db0bfc/docs/source/_static/preprocessor_inheritance.png000066400000000000000000002002761516532232300274550ustar00rootroot00000000000000‰PNG  IHDRŠ’6!Ï@gAMA±� üa pHYsÃÃÇo¨dtEXtSoftwarepaint.net 4.1.6ýN èÿŽIDATx^ìý Ø\E�÷ÿ{]ÿßïy~3ÏlΨϨãè ã6nàŠ "n ¸nbPY ²’B ��²±„°dc a¿Y$!²d!Y#[n H‘qF´þçsBuªëþö~ºût÷Ûëz]tWÕYûnû“ªSç¼Á9 `f!`f!`f!`f!`f!`f!`f!`f!`f!`f!€b7nt«V­r}}}2°iÓ¦ä«eßä‡Y`…Ãñ'�tãOú…›qú7oÚX3ì7~ܧ„Åß;ùaØgŸu²{fÝ5î/ýw¹¿< é÷i•»sù7zÄ×ßߟ|åìï!€ö2 ¸7L›zª{õ7· ü‘��$0Þ´hº›zÆéÉWÎþh/³èuêáXuÝ…É�Ùª�?n2óÂÃ7ºÑÃ�K¾vöw@{™…@¯[³f�ûí¯o4ØdçµÍ+ݘáƒÝÖ­[“¯žý}Ð>f!Ðë_ë§7h¾UE ÇÌB ×)(Ú?j²FPòË,zAh‚"�_f!ÐëŠ@ë�ü2 �^GPZ‡ ä—Yô:‚"Ð:E ¿ÌB ×�Ö!(ùe½Ž ´AÈ/³èuÍ Š#Žä~ø�¯šu½†s!(ùe½®‘ 8ã´Ü;ÿ埋„aèðAûº=vß¹h™fY}ÝütûŸÛyÇuW^xzɺrt, xV]­ê9Úgí»UWŽöÙ^VÇ�Æ�ü2 �^WoPTèú‡¿ÿ[·éž+Šrà7 ᦕAñö+g%ßò7¸ÿçÿùÿ¥¡1¬Û÷k»§u;¼ëíEå•hßu V]­ê9Úç…çžbÖ•£m}îÓ;}.û7MXÌ‚"�_f!Ðëê ŠêIT S‰ë^øõ î÷�ßš¾¶Â‘ïÝó´®°>¬“¸PíU®G¯}PzôAî»ßüR¡½Bã_ýÿÛøí=ÅßÜ{EѶÂÞP…*-§€åë} —‘r½˜žÖž «7ÖlÑ:u¾°M©ÏHuñþÇŸ¿Äë÷MÂ:ë܇õâ·-qok¼î¸><.Q™Ö§íêµµýrŠ@~™…@¯«'(îøÁw§Á˪ Å�åÊ '»7ÿÓ?¸Çï^VðÆøÛ´Ü·Ñ�oX¯p7òê'Ž:2 ©¿8ìû…6¿¼¯·>rSð|¨;þˆ܉G”îKÞþÖ·¸Ëg�/¬Gûê·µeãõi¯œŽÓ׿úÄíi]¥}Ô¶uœ·^1³ÐFë Ï…Žã¬S�+Ôëµ–ñÁä©5W¥Ç¶Q¹Ž3Ü'mC0<‡VPÔö´>½~tõ’ôõ?¿åŸ ëé¿ÿÚ´î ïî•ö ûrm_çɯG=œZ6<ÿÚŸ]>ñ¡B›RŸ‘΋¶žs}þ3O;±°¬^Çç.<–w½ã­EçdÐ÷÷N÷Ù×ë3Óçíëµ-í‡_÷ß÷ï…:yï¼³°¬>ðÞ{uìÚ¿;¯™�¶ÑçäëªAPòË,z]=AQ!`ÞY£ÌºPX>ö‘÷¥?Üaý¨ï÷µÝ ïãÞ¯ÿxû÷ ! j ra;õZÁE½Šú�WˆRxŒƒâ‰Gý0ݶrõEgzÝDû®åü{¯Ò>jÛZ÷ÿ<}g¡,>Ú'…'ÿ^¯µÿKæM,”é}<ô¬ý �]ÛP8òaHâmé<(�iŸôÞÅø³P�Sp ׯýÚÖ‹¶-ˆú ¶¹ï¦ ‹†üK}F íúlÂs®0¦xø÷z­²ðÜù« §åÃó¦më>Ìi?n¼|Z¡><_Gýô;i°ôu~–úì—ΟTx¯íèÜž=þ¸B™Ž=Þ¿Z�ü2 �^WOP´Œ% ,ú!×�¸z”Ô+ä)À„½:jׇO!$|ï…Aч‡ì»G!ÅAQÁNë·¥}Ó:|è(+í£¶}á9cŠ–‰Ã›¨+\O|^K�g…¶p9m/ÜO½V™¯W¯˜ÎƒÂ©ê}PÔ9óËÈÔS~‘~FáºEe“Ç�¶ñA1\N¡Ie—½ &¾îWIÀ©fÕ&<7»~òÃéûð\è<é|ù6:®8„,™7ÉýÝßüŸB•m^¿¼¨ì{ßüRÒ²Šòä}W 8>�#ÿ™ú Ök[Ú/¿ŽRŸ‘ιŽ;üüuît¾|½VY¼~ÕýÏÓ¿LÿîÂã÷õª“÷%!>¬S� ß·1C~šþ½ù:í‡þ´œêõyëó÷õú|Âz!(ÝË,z]½AQôêî�Â@XQàˆ— ‡qÕ>¬SpPxñõñ{OÛUû¸ÜÓ¾ÄËùàR»°MXç�­Ò>JxnTŸ ¿¿á:ôßð\Äm|yX¦uJ¸ßñ¶bþ¸ÃÏ*Ÿø:úx[¥>#±Ž;nãÏ…¯?¬‹ëµÝRuñz% �~nV½ÊÂϨVE ¿ÌB ×5Ñ{|P´êPAÈ/³èuEÔ‚ Ø‚"�_f!ÐëЍ…¿tÀªCeE ¿ÌB ×�Ö!(ùe½Ž ´AÈ/³èuE uŠ@~™…@¯#(­CPòË,zAh‚"�_f!ÐëŠ@ë�ü2 �^·qãF÷_OÞaþ¨ÈAÈ/³€{Æ_.2Ôdç÷�ßêÆŸ2*ùÊÙßCíepoX´p¾ùà #ýw¹—Mw+®½&ùÊÙßCíepoغõE·è¢™îÑ_-³äÔåµÍ+ÝË�õ¹eNu³Ï='ùºÙßAígØîÚk®tóÎ�âÎ:m ÚaÒ(÷Àí—˜�£×_>-Y÷Iö6ÑTçLï.œ{Ž»­ï¦ä+fïäƒYy±bÅ 7eÜñfث׫OÜî&Œ>ÎiÒR¼=Àvf!äÉèCÜ‹Ýh†¾z¬\>ÇM™|³æä©Û¦�ÞÐý?è&z¯Y'åfOëö;ñ~@¯3 �n b…´Ÿ¼†¢K]»X©GÑ �¢!gõ,Zuê…´Öç½ú£ɦî ô2³èº. 'š‰«,dCA/<¿ÕP@Ôã+MnQ½æÜ\—èEžÚ™…@7P CŠn·AýÃó[ŽBe­·Ë)7™E½Šµ„E…ÄrÃÎzZK¼}A],2å&O 6ÕÌxVïáS}gÔuk)7üì=vÍÐÂ-r,æï“¶)“@Êõ‰`3 �nÎxVh‰ëQ=y¥Ü$¡zzKyúŽi‚�E÷TÔ-s¹âؔ¡n‡S. Šê·>zk²){ûÐëÌB Ó©÷0 /º>1nƒúX·ª49¥ý«ç™!¯QêI|áÁk“MØÛÑ¥Ôë �ÆmP»x8_¡Qׂ6{Xˆ«Ò`g¾zh]ÚŽ·(f�.¾†®–'‚ÀžSõ¶cr�î¯ØH`äzD¨�Ytº¸ç‹Ï�Q­ï=lÆðr­ÔøüºEnóê¹f ô Ÿ½gAÚ6û �Æ,:]|3ž“÷ ýò“÷¸—~³:�˜¢ÿþþ™õî[Nªìö€ê˜…@§ C¢Bc\*3 �N¦!Æ0(j:n*3 �N?ºï™;ÏMŠí¶ 4³èdºN™È@}ÌB “ñè>²a�,œñÌ£û¨ŸYt*Ý@vÌB SézÄ0(2‘€ú™…@§âÑ}dÇ,:�î ;f!ЩxtÙ1 �N†D&²Ð³èD<º€l™…@'Š'²0ã€Æ˜…@'âÑ}dË,:�î [f!ЉxtÙ2 �NOdyìÊ!I±ÝTÇ,: �î {f!ÐixtÙ3 �NOdyå™uI±ÝTÇ,:Mü辸ÔÎ,:MytÙ0 �N¢aæ0(êÆÛqP;³è$ñD–gï¾()¶Û€ê™…@'áÑ}4‡YtÝ\; Š<º€l˜…@'Ñãú|HÔìç¸ÔÇ,:�î yÌB Sè ,aPäÑ}dÇ,:…f8‡A‘G÷�³èñ£û˜È@vÌB Sðè>šÇ,:EytÙ2 �NÀ£ûh.³èñ£ûô>nêg�€G÷Ð\f!Ð â‰,Ìx [f!Ð xtÍeyÇ£ûh>³È;Ý@ó™…@ÞÅ�îc" Ù3 �¼ãÑ}4ŸYä]8ãY“ZâzÐ8³È3õ†½‰<º€æ0 �<Ëã£ûúûûݪU«\__ÐóÖ¬Yãô�ˆ¿'­Àw½¬ß=³ȳøÑ}š·i}!/Y¸ÀM;Ì͘<ÒÍ›6èySÇwc†ë–-kÝc5ÓïâŹñ#�v3Nþ™›7á çL}„}ü!™~÷ÌB Ïâ‰,íœñ>¿[=# Ä?øÚÎé{¿|x¾Âuø2‰÷ÇïKx~Âs¶ Ï…?ñ9Ó>„ËúåÃ6á9Š?ãð¼H|n$¬×ñ„uñ¹ ëãc¯tÞªAPDÏÈÓ£û¼z‚âÎÿ Ûïk»›u¡8ôèGZIÓS€ ÃÀ¿¼õÍEõ;¼ëí…%z­�zÂÏ,´QÔ{õÄ…!ÑS½BÙ•NNßß~å¬ôý£«—ÚèµÊT§÷ko¹(}¯�é·£rßn_çb¯/íRX—ö´ß:½~éÑ[Òõj=~ Øå–U[½öûùþw¿«°ìÆ;/Oëœ~¼ÿ× åÚÆ‡ÿó? ë©fßK�_…DmsÖäa…r}vaXÔk}¾ ë¾Mx, gáùüÁ¾_) { n ž^ÛÒ~øuôCï-ÔÉÞûo…eµßa½?ö0,êØµË/ž’¶ÑgìëªÑ‰AQ=�w]2ª@mÂ� ï÷ÿûÛÜ’³~^h³ÿÞ;»¯ìúÁB+(.>sÛßä#×M*”)¨¼Ïg ë9åè}܇ßûŽB½Ö£p©ÿú6Ú?‡Yc~T(Ó¶Â ¡ ¡2¿�ú¯Þû tÇEÃÓõ†áIëïÿæ¯Òºp~òŽþÇÂ:DõñùÓyðçbáéÛ¾³ƒöùLaO÷MMët :^_®sA­ã-ÿøwiÀöm´áqú6á¹P�°Úh_}Ù¹I½>³ðxδ¼o£s4äÇ_Më¬Ïø£ïgaÛªϯìûå�Ö¯ãÐñø:µûöŸ(ÚvX¯×aX,wÞªEPDÏÈÓ£û¼z‚¢‚„~Ä­ºPzvûôN–S08`¿= ïãïãÿAü{…I¬¼oìùÙ4$…e!-3å”cÓ×ÕEÑûxèÙ‡­pû¿¼ú¼ôœøÞÈJAQÊ =‡Ë*è(�é<é½ßÏøc-ïÏ…œvüw ÛVè×çÖkY¿¯ú\^}�Úùmùm‡Ÿ»^‡Á½Ôy«A=#O�îóê ŠúÒÇʆ…õJù¡AQ {†Ô.®V¸³îš´ÞÚO™>qHz~Ãs'*ó¹š}/u~ÖÇžxhQÙM‹§§ë×gæ?_•…m¼ï|ã‹i˜ ÷MǦm¯ºvnÚFÁÎÿ}ÄÃÊ Æáò>\ŠB®Öóà//+ZFÿpÐvý{µ©æï¶”N Š *~¸OÔ3†>…™óÇÿ¤h+(ê‡?\�‚F¦�üá€6¢²)'î_XO8ãmù²¯ï¾cá½µ�z¯rÿþì᤽qþ½B�ÊôZç@û¡^µpßt.‚ü2Ú7•ùz½W¸ô�ÉßÞSïš¶®[=©j»ò’‘i£Ž+\NÇ ýòï­6~ßoœ;¤¨|ìÏ÷)~�{½°>¤ó¤c ÷Oïý¶×.;9}íëÂ^VQp÷ËÇÃÊ¥¶­2Õéu©óV ‚"zB<‘å±+‡$ÅvÛVª'(†½så„�)ì óÞïRÏ—ÂC8<©�TMPT(P¯b\î)Äø§¬ƒ¢„m Š Láùñ!QJE­_ŸK¸\¼|5û^êüªLuaYxKí—§ó¡Ekÿ|/¥zõ^í|XöÛT¡êô÷£íèïDõª³>O‰?‡ð8ëÑiAQ?ø ,á�¨z±ÔηIÏIòCîß‹õÃïס×ê¡ —‰Û„|b-A1,³ö1ê…Ó{³ïåò=sW�B_¼oa�«öMç'¬{Kí«zøÂåâå­¯Ïjã÷ý¶ ‡•‡çÒ:¯!-þ „T¯Bÿ^mµ.…Bß#¨¨NçÆJ?¬^jÛ*S�^—:oµ (¢'äíÑ}^=AQC€êé³êÔÓã‡:Ãjõ\)Ȩç+lò׆Óqp)d ÂaÌ�öGÿGµ®oAú^=Oz +èè},¬°¥m†ëWÏ[#A1^6T*�iÈÖ÷î…å¡jö½ÔùÕg®áß°L½�úLõÙÆ=“±áÇ*º„  7+ê ñ2 •ªÓu�ÚžzU¦×¾gÒÓ?´]ÿ^mz)(êµxX7þaW¸ó=~žÃe®Âkð–Ÿû‹´ÌµZ¬PQMPÔ1Äû¨÷*ËÖ4”¬!Y½öå BaW)ñù‹• <ÃýZÑp¾Å �ñ1Xmü¾kx8,×мzúô:iþzÅJ|`´Î—¿ê:}o®ÿÜÃv¢2Õé5A¨RÞÝçÕO~ÈõÅÿÔG?PT®@ö‘¼»ðc‡žÁ‡ÿÀ½ãíÿ·p=œ<µöjwô!ÛˆV8 -j_MPôפiûZ§/×>ýÇ¿ý‹;òÇßNÃŒÊ|¨ ¯_;ì }Ò²0€½= A'üü‡…÷b…--«mûõÏ?û¤m¡õõýÐããЭ֞ ©7(*,i÷&¦ˆ® ôÁ½š}/u~—�šû¿oþÇ¢ýÕyÕgêßë«Ì¿ÿÙþêúùi��”¬?®×ù ÿ<ÓÝvùhQ;_wW u,~¸yß½?ï¾¼Û' õ:f}Ú®/Sû^ Šžü@0´*ñÐóàA{¤eþý“·Lqoù§¿+eñ™?wÿ·UØžzÎÞž„‹½?÷‘¢vL8Ä]?{û5Šõų†'ÿ¿‘ì£öMïõ_½W¹o#KÏ>*Ý'í¿^‡uþ8}/™h=G¸=ìÖW_vRŒâeµn¿Ïq´ŽÁ Š¢}ÿ�Ý~Þt á1>ÿ˳Ósn_ë÷ïµ µ÷Ÿƒ·ïëÃÈágäéxæ¿>ÜïÛy ¸Úž^ûÏ=ܶ^«Ì÷¦�*ÅY^yf]Rl·m¥z‚¢¨÷F?Î ‹žB¹§-ôÆ¡GC 'Ÿx˜ûÏ÷ü[a»³O=®P¯`®Sᣚ (“Рõk�~y¿Oáð­¨LáÍ·Ó>èÿ̦¡j…#ßFe>lù2Ñ1jÛ~9¿Î�ß…·ø8ìÔÆŸ  ê Š¢Ÿ?£ÿ<ªÙ÷RçWû«s~v:¦ð¼êµÊâõ«NAT3áùôõªý#!¬ûÆžŸ+ì›zÃÏUû±dÞö[!é/êõôõúÜÃzѱ÷RP|ºoŠûÜ'Þë>ùá/8rÿâ¡gµQðõ zz_)(¾zß,wîè¥Ä ˜x{ C 2¥ÖSMPÔò'µ�ûÈûÞ‘®SÿÕ{¿^χ–0¤x:N-óþÞVØ7­' jõE�‹U G¦ç¯[t ªS½ë­cP+(jßõ¹ùeu :÷á1êÜ«W3\¿Ÿ€¢m¨½Â¦¯PÕ«ç/® ÷-þL?ý‘Šw¼m½ë Š@•âG÷ÅõíRoPý8ëÇ?¤@Ö‡!DZâe|�µë>Â^¬ø}ÌZ¸OžÊÂ6~¹°mÜFe>l…åñ1Jxn´¿Ö~‡môÚ—Yëó|ಎIâó'¾®š}/w~ãó¡¶q•…mâõ‡uq½¶[ª.^¯„!PÂóiÕ«,ü[«UÞƒ¢~œ*²¯>5 1žêÃqyìúÓ õªSX9xŸÏê­eäwIPñËø²x{âëJm[ËT*Sh ׇDOë·öUâuÄëÑrñù ùå­:‰×ƒB uXƒÚëØÃ2Oû.«s·Ñþ‡mÂõûÏ*ä�Õª —�?Sëü†ÛŽë+�·jÑÂ�˜‡G÷y�Å^äÖU—w�¼ïy�÷ Xý¨‡½h² ‡5‘�R½…¨A]OÃÌaPÔ�·ã6íBP¬ A±wucPÔlÚxH4ÖDãŠ�!(¢ëÅYž½û¢¤ØnÛjÅÚlyðz·rù³.ï:yß󠃢áÊ…#г÷ÀU§ºGK +£2‚"º^Ýç�êtcP:A]O7׃bÝç�ê�ö (¢ëéq}>$jös\ßNE :E =Šèjy}tŸGPªCPÚƒ ˆ®¦'°„A1/�îóŠ@uŠ@{ÑÕ4Ã9 ŠyytŸGPªCPÚƒ ˆ®?º/OYdæ9ÓÜŸž¹Óüa°]³ƒâÌigºÿY?Çü¡zA]-¯�îóV\{�{jÍÕæ#€mžZs�[³fMò•±¿GYX±üj÷Ô-¥!ô¢§n™šÉwÏ,ò ‰yztŸ·iÓ&7oú©æ�#€»Ò÷eÏpýýýÉWÆþeAߏ§gþX½H=ìËfŸœÉwÏ,Ú-Ï�î ]ÝunÙ…gºç¸Îü¡zÑkϬt¿{ôwÅÅç¸õëšÛ›è]ݵn錡î¹;Î28�^ð§$ ê AWÌãÖ¯½7ùjØß—Z˜…@»Å�îÓû¸M^¬[{Ÿ[|éEnÎôI‰‰ÈÚ´ñî¡•‹Ì@Òˆ[¯˜•®ÛÜ&2ÖT·ôò ÝC¿~0ùŠØß›fX·æ^·xÁ7ûŒánöéC‘•ÓŽw—�w¯%A$K}ŽHÖ?dàöP·ùgŸì–.8×=´ñ�ä+aOjeí–çG÷¡µV¬Xᦌ;Þ {õzõ‰ÛÝ„Ñǹ�7&›°· `›ô;8üGfV½þpï,7~èOùv³h·x"KÞf<£µF�â^|èF3ôÕcåò9N·7Š·À6úÄ£ÜoWM7C_=î¼x„Óm�âí ÌB Ýòüè>´Þ²¥‹ÝÒù“ÌÐW�“Gº¾¾¾dÕöö[¶d‘[zÖÏÍÐW�'ÿŒï`‡0 �vÊû£ûÐzžš0&›^Åy™3|°Ûºuk²j{{Šé;8~Øa™ô*>põ©nô�Ÿñìf!ÐNytÚcêäIé�±þj±pÖ©î’… ’UÚÛ`›rú©é�±þj±ðŒ#Ý%_”¬ÒÞòÅ,Ú)~tY ¦?òh3üU+�Ä2fÐuH¿ƒÇýÀ ÕJ'± ;Œï`1 �vÊû£ûÐ>šÔ¢¡c+Vã–¥3ÜŒiS“UÙëPž&µhèØ �Õ¸eþ nÆ™“UÙëGþ˜…@;…3ž5©%®GïjtRË”q'p=ЀF'µLñ¾ƒÆ,ÚE½‡aob݇öÑ£ÚÆ ;¶®I-ê‰òH.  ïàèã©kR‹z"ÇŸtßÁcíÒ)�îCûL�rF]“Z˜Ädcê“ëšÔÂ$–Îdí?ºO3 ã6èmkÖ¬qãGc†ÁRÔ©[â¨7$^€Ú¤ßÁãh†ÁRÔ©[âðì¯ï²Éîäc¾W5‰E=�Ü”|�edó�|;�Y´�îëñµ¤!ÕéyÝñ2õúÖ‡“:à z¡ñÃ)šÔ²tÞD7çôã̶¡§o?+ÙŒ½m ¯6]Ÿ|�°(ª{es†ßÁç“ïàÉwÐz¡ñC~T4©eÉYG¹9�5Û†ž¾•ï`Þ™…@«ñè¾Îâ¯W,Eõ ÿñrµê_]ºGPÔÓøÄÍܹƒwq§�<, ‰šÄ2æ˜ïºk&í�ühŽ1— õÿêüdSöö�¼ò×+–¢ú-÷gð\UºGPž»'ùÞ�|�I¾ƒƒ÷MC¢&±Œ9lwÍ„ä;xmò4– õßÅw0ÏÌB Õxt_g‰¯W,GÃÒº™z¼ŽJ~ûëf°ó×Îø‚»gÊÇÜÊÓvrÇ|ÿ“餖•Ëç¸aî”–©nýì½*öJn}üŽd“ö~y_¯Xކ¥ëú>˜|�`ç) ®�–|OK¾ƒã“ïà~N'µÜyñ7ì{HËT·~fò¬Ð+¹õ1¾ƒye­‹,'²èÿLÑñå•Ô:ùÅÏl¶¨§ð¾³wMƒ 7å�÷§“ZÎ}¨›uÄ{ŠêÔ¶\XÔ¶¬còL=†V0,¥ÖÉ/~f³E=…÷MM¾ƒIô¦ü¾tRË™Cöu³K¾ƒA�Ú– ‹ÚV¼}äƒY´R3ÝWîz:´O¥É/š•l:Ñpseñи~²§;î Ý\ß©;¨W>ïþ¹_3\�nTiò‹f%[�N4܇DY||ò|³æä©Û¦�ÞÐý?è&z¯Y'åfOo\ø#óèfšüb~J¾ƒF˜“§ú’ï`½¿ó>7ñ‡Å½‰!…Lk�¢ÛïÄû�ö3 �VjÖ£û4û6\/òC^CÑ¥®›ªÔ£h…@Ñ�³z­:õBZëó6œ¿¯ùC t£ ç'ßÁ«Ë|+ô(Z!P4䬞E«N½�Öú¼W·<šlzྠ½ÌB •âáárÃ!µˆ{*L´-dCç3<¿ÕP@ÔãKý8yª·Âœ§ *V,ç¡Å‡›ë’çÖ\ê6Ý�×õ@çPгB`9 ˆz`UßA#Ìyš b…Árº,ùë]£ÈS[òÉ,Z©Y�îS˜ C ·ÜÉV|~ËQ¨¬õv9å&³¨W±–°¨�XnØYOk‰·ä�¢- •µÞ.§Üdõ*ÖË ;ëi-ñö‘f!Ð*úWk(â6õâÙÑÍSÍŒg�s]VP©ç¢”rÃÏÞc× -Ü"Dzaþ>i›²!1 ¤z<`¼} Ϫ™ñ¬Þçnmà;XføÙ{ìÊä;øú-r,f'ßÁ¤MÙ�˜R®OÌ/³h•f=º¯™´×éÚO…Àðü†êé=,åé;¦ vÝSQ·ÌyäŠcS ‡ºN¹€(ªßúè­É¦ìíy¤'¯(ZáPêé=,åéÛ’ï îbº§¢n™óÈ’ä;˜P8ÔípÊDQýÖGøæ™Y´JÜ3•Õ£ûâõf9“º×Å7GGÄz{.Êé_=Ï y�ROâ ^›lÂÞ.�W&ßÁ(VšœÒˆþ»’ï ò¥žÄà;˜wf!Ð*ñunY='˜ë›#>¯ �šœ’Õ¤R¶l¸* vVે֥¡íx;@ÞÅ×%*4jrJÓ¿ƒ÷'ßÁ2×,ÖJëÒÐv¼ä�Y´JÜ;××+^o³ÿO´„½´ê=lGøÖý Œ\�ˆN^—¨ÞÃßmjÃwð¡ä;Ø@`äzÄÎc­†¹¬Ý_Ÿ˜å#{•zz}ïa3†¶j¥ÞÀç×-r›WÏ5¡§`øì= Ò¶yØo ^º.Ñ÷æâ;øDòLBßæUÉwЄžÚ<{wòLþËw°3™…@+Ä7ÄÖ Ù¸M=t�c¸^®Ol\Þ‡î_~ò÷ÒoV§Sôßß?³ÞýaËÃI•Ýè4íè=¬ÅËO¼þ|äõïàÓÉwðy¾ƒÝÀ,Z!žp¢Þª¸M=šõ¤z�Y´B³×'� ³hMˆÈ:Ðiá:¹>€ú™…@+„7mV/`\_õJ†A1«ëèEf!ÐlñÌ䬞œ¢ëÃõfuoz‘Y4[³f&7c8€^eÍÖ¬ž¿p�Y gЫÌB ÙâGÁeÑó_Ÿ¨mÄm@õÌB Ùâ[ØÄõõˆ{)uŸÆ¸ ¨žY4[貺…M3z)èef!ÐLÍzt_x»½Žë@mÌB ™âG÷e1Dßn‡ëhœY4S3Ý׬çFÐËÌB ™šñ,æøúĬž @/3 �fjÆ£ûÂðÉõ‰dÃ,š¥�îkÖãèuf!Ð,Íxt_|}bV� ×™…@³Ä7ÅÎâZB®O 9ÌB YšqSìfLŽE´XÖ“Nâë³zÊ (¢…ÔÓ—u¨kÆ5�`³h†f<º¯7ïÛ˜…@3ij“Õ·©×'ЮO 5ÌB Kñõ„�ÎxÎz}ÀfYÊúÑ}ñúâz� ³ÈRê�È_Ÿ˜ÅÄ`3 �¬d=ñ$¾>1‹'¼›Yd%ë`Çõ‰´ŽYd%ëG÷e}½#(Í,²÷6ì¸>€Ö2 �¬dù辬oÜ Ê3 �,Ä=€�]9$)¶ÛV#ëalPžYd!ë@®O µÌB Y?º/\×'Ð|f!�…x"Ë+ϬKŠí¶•Ľ“†ŽÛd­¿¿ß­ZµÊõõõh’5kÖ8}×âï_³lܸ‘ï5:Ú¦M›’?eûï»ÌB Y>jïÙ»/*ZW£½“åèGë’… Ü„±ÃÜŒÉ#ݼic4ÉÔñÃݘaǺeË–%_?û;™…Ãñ'çÆŸ0ÈÍsˆ›7á #�üc7~ìp§ôÄçÍ`Yƒ]£CÅYÞf§’™ÓÏt‹æNr¯lºÕý¥ÿ.çžÐ,ú޽ôØ-nþôSÜüys“¯ ý½l„BâŒSî~sÓîµ óÜŸ:Sú÷›øå‚anô‰Gµ¤7Þ,¥aæ0Ø5:T¬[ëøu5z›�rôƒrî”ÑîµÍwº¿èG칄þ  9^ÿŽý陕#š2¬vÖ„áî·«¦§?°@7P`¼~öqnêä‰ÉŸ¸ýwŸ³hT<‘ECÇq›jÅ¡³ÑçE—sÉź_¯\D@Z-ùÎÝwó‚ô¬ø{Ùõ¸ÜtÁhóÇèdÏÿòl7ú„æOì4 �FeyÏÃ,Cg%S&Op¯lºÍþ!ÐT/?zKæ×*¦“eî˜fþÐ�ìÖÏu£‡üÌmݺ5ùS·ÿþ³`�Ò͵Ãp×È5…ñõ‰Í¼Ñ¶‚âký«Ì1Í¥ï^3‚â¯�cþÐ�Ž ˆŽ^S¨ÙÏq}-²| `% ŠÖ€ÖhFP´~`�n@PDGÊòÑ}Y?°‚"Ð^E zEt$Ýã0 w�<º/¾>±ÑÇVBPÚ‹ T� ˆŽß»‘k [y}¢�ö"(Õ#(¢#eysì,ŸîR ‚"Ð^E zEt¤¬Â]|}b£Ow©Ah/‚"P=‚":Žz³ wY^ëX-‚"Ð^E zEtœ,Ý—åM»«EPÚ‹ T� ˆŽÏRÖû¸Mµâ!ìF®u¬V#AñÖe3Ý^_ÚµÈOø†Ù6¯F þ±;gâ�åñqy‹æŒ/Ôû×�@ÇYêXÐ^y Š÷_9Îíõ¹ rÕ�üÙ×ÝOöûÜ€åÄ/ëÛzÓG8`}—O=¢¨�ÞÇmªY�ÊÂ6q½”Ú_•[íý:«ÙÚƒ ˆŽ“U/`–Cص¨7(*xìô¡÷¸9S†»kœQpÄ�¿ÝQd�Ýwv‡Úw@ù’ÿ«r䋎MY½$­_wç^_Ú¥púÜÞ÷îws A±ïüݧ?²ƒ›8ø»îêÇ ùñWÝÉGí“¶™;îÇî¯ÿ¿ÿ5 Äɬ1ƒÜ[ßônË�ÛøÌ­SÓpõ­/~´h}³O>ؽïßÞš†N¿ìþ{‡ÛÔ¾h¾ÍϾ·»Ûé?ßY´®}ë?…·ô;›,¶ùÌGß“îG¼Ï;¼ã-nÐ>Ÿ)j+ë–�’ÖW³=´A'«^@Ìp=­¸>Qê Š·^1Ó½ùŸÞèfŸ1ܽ²éÖ¢ºGîZœ Ûîýå] ô>l?긟¤=zâÛ¨Ì׫ü§F/¥_οßpÛ%EÛ‰{ µŽEs'¤Ë…mtïü—.”i=j¯�…çžR´Ž�__X®[õáú6¯_^ôÞSYxNü{¿|xìá9’x]áö%<q Öç¶×wq»æcé{þüãåýþx¾\tüù(ÕFëÒþ…müþWú‘xÝá¾ùsëi;á²q½„ç®Üy³êúðsõõñö+ÉCPüñ~Ÿs;½ÿ�… ç=uË”$<�œ¾VÝ[ßô÷i( ÛÈîŸ|¿;bÿ/Þ´gº¾U—Œ,j÷û{ÎuW�sŒ;è›»ÊÔFåþ½¶©ïßµçþ¢P¦àö•]?Xx/ƒ¾õ÷ηýSá}ú�=ý°¢6Z·Ú}zÇÿ(*WPœ8ø;Ee¡JÛSˆÝ{·�¤Tÿ•‘?ûF¡­^ûr CGºŸ&ç[ÿ Ûøú°Í­œX¨×kÕ…eay¼|ØfúÈÕ‡uÚNXç�-m­+¬ �Ûª�½Òy«A'«G÷)†A±×'J=AQÃËýð{„Ę~ðwúÐ{Ó@yõEg¤ÿÕû0(À(¨MŸp|ÚFÞ|»áò³Ý_ÿÕÿWôîgµQ�Þ«n—O|¨°Ùùc(¬Cvx×ÛÝûÞý.7÷Ì‘…6ëo½8=&_ö¯oHÛW ŠZßÄQGÞ+üè{{ÖsñÌ“ÓuÜ~嬴þÑÕKŠÞ{ñvô^çHËk=7/9'-WxÙg¯ÏÖ?qäÏÓcÖ¹ðõ:—¾^tüz­žS½×qèµöKÛÞwïíÛÐùQ�BàïW(ôý½‹¬Îƒ>#ý×·Ñy “¶¥Ï,l£s]Í߈ŽMŸ�_Nt.T§ãWØÕùðu:Ö0ì©~È‘êõzÖäa…u—;o:†°^džEÿ¹ê³ðmîºvn¡¾yŠ nzÏ;̺� BaX¦ý¿þ«ÿån¿hxú^aàÍoü[7é¸ÒȦÏRÒïEú¬à¦ §vþ}¼Œ÷ðЉi�“/«'(†Û{äºIékP_ñ¡XÁGçÓ—ùñžn÷Om?gZ�ΗþëÛ(T‡�É·~è× m  Õö¼±ƒÒ2ýWïð¨ ö¾ka9QÏ®¯W8Ó>ùºý¾òñ¢mk_Ãz½öÿ8Ð9üÔ‡w(ÔIøw£m‡õþØ}X,wÞªEPDG‰og£û)Æmª¥¡æp]­¸>Qê ŠþÏÿHl­º�¥~X} Ôõ>¼ŽQ? jO¯½ºP¦÷ƒß¿°ŒBÇ)C+Ô_0}tQPýù�¿“îO\GÿÓBo™(iÛ>zV€ýŸ™‹ï%Š{ŠÂ ¨ ª䃕ÄÁ°– ‹Â�Ât@t::z¯à&>dJ|œÚg­SçIï}PT@õmD�í3ŸúHQ/±^‡á]çá­où§¢6 ä:'>ÈjÛÚß°�Tó7¢ýTôïÅŸ‹ÓG5àsÕ¶µŒ^kû:®{n8¿P¯¿5¿åΛ–Õ1\qÁi…:-§cõAÖ®ñþÕ"AñúÙǧÁÄ÷òH<\+ ƒjÖ�|Ô¾iXñ½‚«/;)='w/]hS … -¯`äËâà¦à¡0¤^>_¦e¬ (ê ýÅ�ö(¼WPÔòáñ†=k•¶çO6u^œÂ ¬ãÐö}˜Ó2z¯ëÛÌ9åÇi¸ö�Ê·‰µz~µþ\ë¿z¯rßF½žñ~ù0¦ ÷ÕÏ~¸èÜê³÷Û–ø³S[¿¯:‡ –¾NnšwBáµ¶}öðíÃóZVLøiú¾Ôy«A%ËÛÙ„ëi¤g²VõŸ7­ýÈêG;,ó¿·‚šÞû#9í¤£ ?ü¢¨2ÿ^ë‹C�Þ+Ìø6¥ö¹\PT€ð½DqOQ¸>õN)<ø:i$(Æ=™×^²íÿ¼Ãã·ÔÚWõºùºpyÑqêúzõ€iÐ}PÔ~†Ë�øÅ t;~9Om—Îß tt>Âå6Ü~IÚæW×ÍOßëkÂ6RéoDaTëÑúÂ6žzÿÂã›–QÐSðÔg£¿Õ…=�Rî¼ùó†vQpÖyÑëRŸk-òý�°(Hè˜Ôë£öÄ©�~ø}™ÂAØ{xÛ…ÃÒå |Y<\Zj¸Qí¬ £à¦0ã—W/•R¶´ÍRAQÁPëßkyÌžJÛó�GÇê—õ¼Å�[TvÖ°¤mtlÚ~¸œ¦Ö§�]ª�hŸt­hX¦÷*×k¿+äËöNþ 9¿á¾éØü¶õù* ªLu íáòºF3\Þ[)µmõ®j»z]ê¼Õ‚ ˆŽ’Õ£ûâë陬U=AQ?”> ”£ÿCˆC�Þ«Ü¿/ÃP¡0£eÔ‹£à ö@ª.užoSOPŒ÷=®Ï JYEάãó½˜êéÒ{�µUè ‡‡uœá»„ç°TPÔ¹QO`¸\¼|5Ç_*(–;^½.µ_ž¶«Ekÿ|ÀS¡Þë8|Xö—%”;oá~„¿™RŸk-òCêÅ C£zÒÂz…B…½V°Óñ‡=T>0„ת>\g<¬+Z—B¨BR|­¤‚›êü:$ ‰¢m– Š jáD…°r½Z•¶W*ðh� ZárñòVŒ×W*(ZǨ÷*×k+¤‡tÞuþ­ýóç\�Yïuü>ú,øÏQû§íø@©ºRÛÖ¹ôŸ7A='«G÷Å�S=•q›f©'(Ÿü¨¾ëo- +Æü�ðG?ô^wÖ©ƒ‹êô^åþ½Ô¬PñÕ/~:ùÿ¦7ô°ôuX§õ�øÅÁEe±fEõ€ýŸ¿ÞÞ{)q€Ph ß{ñv¬íjØTå~¨·œ§’ðvÕ…“ÝÄ‘G¦ûä?£RÇé• dºvôÍoÚÞl±‚¢zµ¾6n¶>S©ô7÷LƾýõÝÝûíaÖÅV];7=7úû‰—±Î›?ïñß¹.½ÐyÑën ŠçŒ*î9òN:â›éñ…eOÝrFZvëCÓÛÌ|õ³*ª÷½Ž¥nMOAä£ÿùN7áC¢XËÄ´OVPÔºU§ýöeÕÅrÛ+x®˜~´û?õ¿‹zÚbVôÃõþØKE�Wß3éé½ÊõÚ‡tß3;þ௺�?¼ƒY[¹p¤»29}¾?øÚ¶AOû©ºYc¥ÛÓvUfm[×Gj»zMPDÏ g*­;äÛ» ¨‹Cبÿ‘nGÁà ‰RoPTÖº@ÃòfEíÿ?¿éï“`õé¢r…Uk½¶Bà¾_þxQà.Õ›«ãñŸ“ÿŒüпBºÖ£õ…Ëéë¿·_4, ²ñ? T¯u)ðÅu z~–ºoçë|ÀõÃÍñ¶uÌú;Ðvõž ˆž’å}ÙÓ�ÎzÔå¦ÅÓ“Û½Ó°¨p( 2Çq`$ÕF?¦zïÛè¿zïd¥Ú ¨ž)-ñ½TžÖ§ž -ú}ÍÔõmJÅu} Ò~¿Œ?é�N•AQÎ;cXpüzFÿ“ta€X0clh}õJÅÛ)µ]õ†)0ùeEÇ{ÇUÛÖ¯žµ¸N=d~ùzƒ¢h=êE ׯpí?�‡ðŠöGçÖ¯£TP¬æoDë‰�Ï=íC|îEí}}xÎEËú}«tÞt޵߾^Û ë»%(Þ8wHÚ+õ…O½? Œ¢×ÇœüÛµÅC¼¢p¨À¡Pd…;?M|ðëó<Ô[åÛ*HèÆíÂ�YmPT¯d¸`+€6+(ŠÎå®}wÑ~(ÌùMmWç.¬×yZ»tûÄ•RAQëÐgâ?'ÿ…½¥ZO|Þ}ÐóŸË;ßö¦¢z«êtžâ:-ë÷M=ƒáßÈ.;ýGÚ«¨e­mëóë Šè)Y=º/^O+¯O”zƒ¢(êG3þÀ‹Þ—«×q(DïU–‰Â©Äå¢@nG|`-¾…Ëøð£×ñ¾†âõ©÷)\�œþ1œ„·ñç&ÜNü>¤ó./Zg©ºpYë<‡üùóë‹éxÃu‡Ÿƒ‚¢|X_íg*þ¯q}¹ºx½âë<íw©z¿mÿwS�¼\£è‡Ca )P¨^¡Èª÷âu†!Qâz/\·Ö/«´Ž�Ê­ìUÚž\VHë\ú:…@ì°Î1OûVjßõ™„ËZŸQ|Þãõ‡uk\.«ýŠë}ôâm‡õ•Î[5Šèñ£ûê½®0^�®WŒÛ4S#AÛi(4†×г†-K¯nb =£zy›Ì‚æ*Õ[ˆêÑ1âë ë�ñœÕzêEP̆†'¿øÙO¸¯ïñÙ”®ƒ[¹|ŽÙ¶ÛCPì-ÅÆÑ1²zt_VbêEP̆Bᕜ^Ð+!Q^µØÝ¸hšY‡Êнå! +Ï)?d�ÒŠèaH¬w"Küd—Ç®’Ûm›… ´A¨A!«G÷Å×'6òd—z�ö"(Õ#(¢#dõè¾v_Ÿ(E ½Š@õŠèºN/«ëAPÚ‹ T� ˆŽ÷ÖðâáëFnØÝ‚"Ð^E zEt„,f*g5|Ý(‚"Ð^E zEä^V�îËjøºQ3Ï™æ^Û¼ÒüÐ|YÅ�7º?®�mþÈ�Ž ˆÜS  ^½=�y¸>QV\{�{fÝ5æ€æÚ¼n¹S`ü½lÔC7L5d�NöʽçºñcNLþÄí¿û¬˜…@µ²zt_¸Žv]Ÿ(›6mr�;ÉüÐ<êÉ_~Ù,×ßߟ|íïg½®¹d†ùC t²›/åV,¿:ù·ÿî³bÕÊâ–6q¯¤†¡ã6­tÃõ×¹—Ït[6^oþ ÈŽâK�õ¹ëÏv÷¯Ë¾7Q~÷â îÆK&»§n¡g�íO÷Ïu¯Ü3ÓÝ|áInþ¹g%Þöß|–ÌB ZY ?{÷EE먷W2K듬+_ìÎ=Ó-œ3mtÉœÉîÑÕKÜŸûWejåµs“õŸ1`{h­Ë.˜î–/]èúõƒÉWÏþ>få–k»+æOp §�D-Îê½n’ûsR²´òÒÑná´áö6aºlæh·ôÂ3Ý·\ŸüIÛçY3 �j…¯Þ!c=ª/\O»®OD>­X±ÂMw¼ÙU¯WŸ¸ÝM}œÓD‡x{Š¥ßÁá?2{¸êõ‡{g¹ñCÊw°˜…@5²zt_¸õPÆõÀèCÜ‹Ýh†¾z¬\>ÇéVHñvØFŸx”ûíªéfè«Ç��pS&Õ÷›�Ö2 �jdñlæøúÄzÃ&ºÛ²¥‹ÝÒùÙM2š1y¤ëëëKVmo@±eK¹¥gýÜ }õ˜qòÏøv³¨F÷>Œ¯OÔû¸  á© c²éU|ð——¹1Ã7ýÞc@7Ñwpü°Ã2éU|àêS[rÿ?dÃ,ª‘Å£ûâu¼ò̺¤Øn‹Þ6uò¤tÈØ µX8ëTwÉÂÉ*íí°M9ýÔtÈØ µXxƑéèf!P�,ݧå]zƒ†©Æ�<Ú ÕJ'±ŒÂô@Òïàq?0Ã_µÒI,Ãã;ØAÌB ’x"‹f.Çm*Éj2 z‡&µhèØ �Õ¸eé 7cÚÔdUöú”§I-:¶B`5n™‚›qæÄdUöú‘?f!PI�î‹'Ãp}"*itRË”q'p=ЀF'µLñ¾ƒÆ,*ÉâÑ}ñõ‰õL†AoÑ#Ç ;¶®I-ê‰òH.  ïàèã©kR‹z"ÇŸtßÁc•d1 %‹kÑ{¦N9£®I-Lb²1õŒÉuMjaKg2 �JâG÷Åõ•Ä×'ÖûTôž5kÖ¸ñ£Ž1Ã`)ê�Ô-qÔ¯@mÒïàñ?4Ã`)ê�Ô-qøv³¨¤Ñ�—Åͺѻ4©å¾›.4C¡E“XfN?3YÔ^€ÚhR˽‹Ç˜¡Ð’Nb9{r²¨½>ä—Y”£aæ0äéÆÛq›J¸>�X¶l™›7m¬ cº%ÎÔñù€ÈPúœp„ cº%ΔÑGðìPf!PN³•ã¡ëznÖ�Þ¥‹á«�Ô’Nb9eT²˜½.µÓw°ÚI-é$–1'&‹ÙëB¾™…@9�>º�ë‘Mj©æV9êyÔmuâå4F“Zª¹UŽzu[�xyt³(G7׃^­½�º•N¸<×'¢º ^OY±Â¡·yýr&±M’Njv˜½gn�Ê$–gå„�ÝÓr\_I£=’€§!år“Z4‰eþÜÙIS{y�Ñ�r¹I-šÄ26��Ì,JÉâÑ}\ŸØytj=7Uo¶%çOqçL´{5‰eÜÐCÝÊvFç{öžä;øP¿ƒó§¸é£~d†DMb9åØï¹•7ðìdf!PJÃÆáò\ŸØ9ôYùϼ�áþ•ÍÜók¹-ë—¸§ï¾Ô�8æ sR‹zG”¶QÛ¸:Ùïþdöz�¼{xIòñò|;…Y”ßÿ°ÖÕÆA3�Ù(-ú^3{ÿøòf÷ܽ|^ßå“Ý)'R5‰E=�Ü2×\F6¯:/Y½½M ¯~·)ùaÑkf/ã_J¾ƒw'ßÁ(ðy}—Mv'ó½¢�¨I,êi|à¦ä;h,#›ïä;Ø ÌB ”FÝ×hÐDûÅŸaHuõ<÷»”?ly8 ¡3Ì ?ì�¢I-KçMtsN?Îlzúö³’ÍØÛòjÓõÉwЋ¢ºW6gø|>ùÞ‘|� ?äGE“Z–œu”›3ñX³mèé[ùæ�YXÒa� Ôs}a8cZ¯ãzt½b)ª×�ÙãåjÕ¿ºt� ¨§ñ‰›'¸sïâNyX5‰eÌ1ßu×LÚ;ùÑc.êÿÕùɦìíyå¯W,Eõ[îÏà;¸ªt� Æw0¯ÌBÀ?º¯Ö£,ýWý*²ž•Ô:ùÅÏl¶¨§ð¾³wMƒ 7å�÷§“ZÎ}¨›uÄ{ŠêÔ¶\XÔ¶¬còL=†V0,¥ÖÉ/~f³E=…÷MM¾ƒIô¦ü¾tRË™Cöu³K¾ƒA�Ú– ‹ÚV¼}äƒYX½Qv|m[–ײ•Rîz:´O¥É/š•l:Ñpseñи~²§;î Ý\ß©;¨W>ïþ¹_3\�nTiò‹f%[�N4܇DY||òºV ;�³…Á«Ö¡ãV_ŸÈ°3Ù1 O×”„A¯Ö¡ÜpÙf_Ÿ_Kɰ3�1 ¯‘G÷Å×'6;¸1ì @¶ÌBÀkäÃø±µÌ–®ÃÎdË,¼¸—®–k Y¶V ;�=³ðÂÉ(µöÒµ²‡�ag²gÒÈͲ㧹4»‡�ag²gOF©e"K<¬ëã6YaØ€æ0 iäÑ}­ fØ€æ0 i$€5rmc­Â}d؀옅€ÔûT•ø&Ý�]9$)¶Û6ŠagšÇ,$ `µLd‰Ã[-×6ÖŠagšÇ,yt_+Ã[¸†�È–Y4Ò+Xï�u­v ¹ÌB ÞG÷Å=‘µ Y׊agšË,âVm¯ n¡.×ÌëÃí0ì @öÌB ÞÛÛÔÛY«VN˜ W™…èm�ÜÞ¦U×'jŸÂí0ì @öÌBô6…®0„ÕÒ[.׬ëãgP3ì @s˜…èmñ°nµ�†¡ã6Y`Ø€Ö0 ÑÛâ‰,ŠŽÛXž½û¢¢åš5̰3­a¢·Åׯõ¥Ä®×'2ì @똅èma«å:Ãp9…͸> ;Ð:f!z×+Ϭ+ bÕ^g_ŸØ¬§¤0ì @똅è]q��®;ŒÛXâë«�S †�h-³½«Þf×û$—Z0ì @k™…è]õNHQïž_¦Y=} ;ÐZf!zWøª��?É¥×'ÆÛ`Ø€æ3 Ñ›ê}t_½×5Ö‚agZÏ,DoÒ”zÂX|}b3†„v õÌBô¦zŸ¬Þ »C ;Ðf!zS=3—ë®®Ãδ‡YˆÞTÏ£ûZâv =ÌBôžøfÖÕ>º¯Ù×'2ì @û˜…è=õ>º/î…ÌúFÛ ;Ð>f!zOÈô>n‹{ûªí…¬E<ì¬@·Ía¢÷Ôóè¾zo§S­8ˆV{p� ³½§ž!äzŸ ]­øv= ;ÐZf!zO=�îköõ‰ ;Ð^f!zK<Ä[í³šÃe²¾>‘agÚÏ,Do©çZC 3‡ËT;KºZ ;Ð~f!zK=�î‹—QØŒÛ4‚agÚÏ,Do©çÑ}q�ËòúD†�ȳ½%œ”Rí“OÂÉ/Y?-…agòÁ,DïPO`ʪ™”?Å¥ÚÉ/Õjõ°s¿[µj•ëëë�kÖ¬qúnÆßW­e¢wÄ¡¯šI)ñS\Ô·©W+žöâéGè’… Ü„±ÃÜŒÉ#ݼicäÄÔñÃݘaǺeË*?% @ó˜…èqè«fRJ|Mc–=~­vž9ýLwÙœ‰î÷�÷9÷ì]‰Õrã.÷»GnNBãÉnþ¼¹ÉWÖþh.³½#}ÕÌxnæõ‰êA ÷§YÃÎjžyÆh÷§Í+Ý_’¤¿ô'ô_ù�~'W»×žYé¦Nî6mÚ”|uíï3€æ1 Ñ;j}ºJ½7ç®F+‡�/¹øB÷À—�¼K¾£¿ºá‚ôºÅø{  ùÌBôŽZƒY3¯Olå°ó”ÉÜï¿Õþa�+[¹™k�61 Ñêé¬g¨ºZ­vÅ×6¯2”äËk›W�61 Ñêyt_h_·Çî;›uµRàÔñ„Zq ¨Œ ´‡Yˆî†³j†{km_�v ;K½AñŒ±Ç¸ÏïòQ7qä‘nîÔï¯@15ms׊¹n¯/íê†uPQ›CÚÇ�>ú¨¢u}nç‹Úȧ?þ¡¢@¹Ã»Þî&Ž:²ðÞS™êôz]ß‚¢u¼åMotßþúŠÊ^zôwû•³’oýÜßþÍ_­Gþø;i�_§øö�®^RÔ¶šúRû�µ,ƒ¢Ö³û®+œ3}Îßñý…ÏíCPÚÃ,Dw‹Z¥G÷Å×'j:nS�v ;K=AQðío}sºÂ:5Ñk®¾o×ÿµEm]½ÔÝyÍìôµzà´®ã�8 ¨�\wéYEËVc¥–ñÁN!2î9Ôþ($53(ê¼ÿ× âvâQ?,ª—°^âu¼ïÝïuÔŒ ¨P«`胀z:’šlÔörª·. -�ƒ¢„çÄï ïí]X·ÿÛBâ× å:Ÿ>€ŠÎ…zrõ_ß&>>m+ýÇHÐFÿhðçΓþ«÷á¹SpÓùôˉöAu jzörëXð§zõzûz½žw֨ºÕÞ׉Ω_VÇÖk]aXÔ߇Λ>ßFÿ òõÕ (ía¢»Õ:1¥Ö'¸T£�ÃÎROPTø;æÐï™u¡+.8- ¾çDžO?¦úa÷mÂPRH Ûy* C]¼L¹ ¨× XêUTˆP¯œÂc½Aу�E¾íw¾ñÅ4¨„Ëk9pÿÞ6ïäMƒ“¯ýÕ2aX×>‡AQmrÂ6ê¹õ½‚¢}ŽÛHõ¹éÜøž_¼ ˜¾�(°é’ß«,zñë\è’€°Í´ñǧǧÏ@ïµm…ǰ�è…Ç­ÿÆçNûŸ_Æ´¿jöTkÛZF¯µ}—®Sõõê÷û¡eã¿}ÿYiYÃEçŒ)Ôi9«²>(ÆûW ‚"Ðf!º[­ÁOOmñm«y‚K5Ú9ì,õÅRá+¦qßk¢0¦Hõ¤(<…½Zú1õíÔ& —>8ˆ¶«jßÖSY#AQ�V?ðc†’®KeõŰ÷ÎSPðû ãÑñùóà)ìÆ½¯a½zÍüþŠö÷¼)ËÚÇAQm´\¼mß·Ñ:ž{Já½§õ(<ùå´¿ ” Mª/u>tµÝp›¢¶W^xzÚFç"þ¼ÖßzqÚæž.HßÇÇâYÇ­÷*×k…Q­Gë Ûxêý‹ÿ±¡cÓ2úlô7ë¯kU]<¬¬�.ÖݸhZºž8t+8ë¼èµŠ:a›Z�ö0 ÑÝÂ!ßJÁO³�Ã@WézÆjµsØYê Šúárä�f])–ôÁI¡Q?¶V»0`é5ì±*ú¬àáUõî}Rظiñô´¬Þ hÕ‡ûàƒB<ÁG|ϔŽBHŠÒüþŠ^Ç/Wj£åÂmxa›RAQç$\ƇD)u¼Úõ†ËÅË[ŸW JEkõ^åz]ésÒv­lˆxúô^Çáòÿ‡�ÿG�ÿ”uï_ž†�… t‚"Ðf!ºO-÷DT( ÛfÑû—§ag!(�… ´‡YˆîSË5‡µ>毒¼ ; Aè,E =ÌBtŸxè·Ü5‡µ´­FÞ†�eæ9ÓÜk›Wš?Hò‡ ´‡Yˆîß<»ÜÐo-“^ª‘·agYqí5îÙ' už{à:·fÍšä«kŸ4�Yˆî‡µ¸>¶«4饒ø&ßyv–M›6¹ËæN6”ä‡zþ¯[2Ûõ÷÷'_]ûû  yÌBt—Z&§Ä×'ª'2nS‹<;{7Þp�»íª¹î·ßdþ@hŸ×úW¹ßoºÕÝvõùnÃzz�v1 Ñ]jyt_ì4 &nS‹<;‡î_·Æ­¸òRw噉È¡«.žîž¸÷J÷çþ»2uïM¹+/>ÇÜ&ÚïêËÎs7]}™{ø×&_Uûû  ùÌBt—øÑ}z·ñj¹–±’¸w2/ÃÎè,+V¬pSÆoö:ÕëÕ'nwFç6nܘlÂÞ.€ ØjyÊJxSn½Žëk‘çagt–Ñ#†¸ºÑ }õX¹|ŽÓ-’â튙…è.ÕÿÆ÷;lôúļ;£s,[ºØ-�?É }õ˜1y¤ëëëKVmo°�YˆîRí£ûâ!êFzvF–4D±\Ïc%Z6\ÃÎÈJ£“Z¦Œ;�I,P³Ý£Úáä,¯OdØÍ¢G/Žvl]“ZÔ9þä‘Lb€˜…è ha`+7œU¸cØÍ6uÊuMja ÔÎ,Dw¨öÑ}ñõ‰�„;†�ÑlkÖ¬qãGc†ÁRÔ©[â¨G2^ 4³Ý!¾î°Ôs›k™] ÃÎhMj¹ï¦ ÍPhÑ$–™ÓÏLµ×°™…èÕ^wXË#þÊaØ­²lÙ27oÚX3ÆtKœ©ã‡3‰ê`¢;TÛ»—U/ ÃÎhMH©vRK:‰å”QÉböº¥™…èah+×»Wm»JvF+iRK5·ÊQÏ£n«/¨Ì,Dç«öÑ}ñpq© /•Äë)µ= +šÔ¢§¬XáÐÛ¼~9“X f!:_µTâ'·”šðRI|�#ÃÎh )—›Ô¢I,óçÎNšÚËÊ3 Ñùª� ¢Gõ…íê.fع»)ø×û�ˆfZrþwÎD»WQ“XÆ =Ô­¼‘ag¨—YˆÎWí£ûÂ6 {q}5vî º~UŸ¯z§Ûù�W6opϯ]䶬_âž¾ûR7☃ÌI-êi=xPÚFm_xàêd¿û“UØë d¢ó…=|¥Ýß�»Þ€‡R†�»“Âaø9«7º•½ŒÛâåiè Mu˜9©eîÔ'hÿ|âå'ïNVio°�YˆÎÿ —šÉ_ŸXoÀcعwĽÇ^3{ÿøòf÷ܽ|^ßå“Ý)'R5‰E=�Ü2×\F6¯:/Y½½MÀ6f!:[üc^j"Kܨ™Òq›Jvî=ñßMHu꩎—©×¶<œüýÎ0ƒ^hü°CŠ&µ,�7ÑÍ9ý8³mèéÛÏJ6co@PìJÕ>ºOCÒ¾M©áéJvîMþzÅRT¯¿Ãx¹Zõ¯.Ý#(êi|âæ îÜÁ»¸ÓG–†DMbsÌwÝ5“öv›®c.êÿÕùɦìí@¯3 ÑÙâðfÍx®ö>‹•0ìÜ›âËÊQ�v=½Õ¿ýõ 3Øy ˆkg|ÁÝ3åcnåi;¹c¾ÿÉtRËÊåsܰwJËT·~ö^{%·>~G²I{? —™…èlÕ„·¸×±žžÀNvÖñ#{ñßP%µN~ñ3›-ê)¼ïì]Ó èM9äý餖3Gêfñž¢:µ-µ­xû‚bW œKMd©¦×±’xY 5fM½Yá>"*M~Ѭd+Љ†›ã�(‹‡~À�ð“=ÝqíæúNÝq@½z­õyš4ïô:³�«Ú!åjnŸSIx�£”ûáoíO¼�Èý}ZÃÒ/>|³æä©Û¦�ÞÐý?è&z¯Y'åfOëö;ñ~@¯3 ѹâá@kÆs&Kõ:–Ó ÃÎñSg� ðú|J]»X©GÑ �¢!gõ,Zuê…´Öç½ú£ɦî ô2³�«šG÷U&+Éû°sdL´ÏÈN=A\Ÿƒ®‡­4¹EõV˜ó4AÅ ƒå<´øps]¢kyj d¢sé<üa¶†ƒã6õ\Ÿ˜÷açøö-õ„a”ÿ•£PYë?&ÊMfQ¯b-aQ!±Ü°³žÖo@Pì:Õ\{Øè-mò>ì÷˜–:¨_|Ž-:ïêá®Ô{XJ¹ágï±k†n‘cÙ0Ÿ´MÙ�˜R®O›YˆÎ_{¨^œJmê¹>1îIÊÛ°sÜÛ™·ýëtzòJ|ŽCõô–òôÓ �®ÝSQ·ÌyäŠcS ‡ºN¹€(ªßúè­É¦ìí@¯3 Ñ™âž>k¸µš6•„!A¯ó4ì¬ã �Ï ËhLÜ#-ú;й®·÷°œþÕóÌ�×(õ$¾ðàµÉ&ìíŠ]%´nn\Íd—rò<ì¬�÷teùÜa ìMVhÔä”fÿcaˆ«Ò`g¾zh]ÚŽ·(f¢3Å?âVïN£×'ÆÛ¨5h6“z´Â}ËSˆíá?Dt®ÛñÙëþŠ�F®G€Ú˜…èLqŒë%¬¯çúļ;Ç=�Ú·f ƒö*õÌúÞÃ<œWõ>¿n‘Û¼z®=ÃgïY�¶åïjg¢3…AÉ �q˜Ò0tܦœ<;ǷéçÙÕ(-O=Ç–—Ÿ¼Ç½ô›ÕéÄý÷÷ϬwØòpRe·TÇ,DçQ�O”¬¨ð¶±®a,'¯ÃÎñµ™êMŒÛ€Ú™…è1�ÃÎapn‡@s˜…è,•Ý×ÈÐqÞ†�¹­c¢s¨÷0 NÖ£ûªyt)yvÖœ¸7‘ÛáбÃÎܧ˜~„/Y¸ÀM;Ì͘<ÒÍ›6È�©ã‡»1ÃŽuË–ñ¤$ —™…ȧr³šÃòj&‡„í[1ì�k›½~;œ™ÓÏt—ž7Áýþñ>÷—gW9÷Ü]@nèoòŇors§�ìæÏ››üÉÚǺ›Yˆ|Š{}¯aÂ*õÔµcØ™ÛáÓPóŒÉ'¹?m¾3ùAN~”ûWmû/�éßä*÷§gVº3Næ6mÚ”üéÚϺ—Yˆ| g<‡½€ñõ‰•f·zØ™Ûá tÉźûo½„€ˆüKþFW^;?½n1þ;ÐýÌBäO<‘%œ-\ª§±”°m³‡�¹ŽmÊä îåtÈÙøaræ·¿¾‘k�e"âáåp"KÄ*¿rbš�ÛáØÿ´™ÞDt†×žYIPz”Yˆü‰žï•+wËK<ó¸™ÃÎܧ4EëÈ+‚"ЛÌBäO<¼ìg DzÜ$ ‡m›=ìÌípJ#(¢Ó�Þd"âG÷ùòZ&¦´rØ9*W(­tíd/!(¢Ó�Þd"ÂÐ>º¯ÔLhK+‡�¹NyEt‚"ЛÌBäK|­Ÿn¼­òr3¡c­væv8•ÑiŠ@o2 ‘/¥®C¬e(¹UÃÎܧ:Et‚"ЛÌBäK©G÷Õr}b«†�¹NuŠè4E 7™…È—8äùI!ñ—R“EZ5ìÌípªGPD§!(½É,D¾„C¹¯_ï—Þ' dá—X«†�ã@ËípJ«'(®¹ù"7äÈMª³–i—z÷iö”áŽí–¥3̶h-‚"ЛÌBäG‰ +éuay¹ð׊ag­3܆Âm©NÔž{Jò�}ƒ›8òȸãRs™vÑ~j­ºröØ}g·óÇ>X8®~þC·Û.u}Ë‹íFPz“Yˆü(Ó™Ïay©ðÍf ;s;œÚ4­:OÁjÒ¨#‹Ê–Ο”–¿°ñ†B™Ú¨Ì Û‹zÃú9SG¤å�ß½,}®K¯U¦:½×ºµŸ_ßã³…åã¶ž_¯§ xø } ï_|øÆ48î»÷çÓ÷~ûþ¿¢ãóíË—¦êõßRm´.íSØÆW|N¬ÓxÝá¾U:ö¸^ü¶ÅŽ^¼¼Þ‡õa]øùúxùJŠ@o2 ‘ñ­f^„étX^ª÷®ÃÎܧvÍ Šê…û‡¿ÿÛBœÂÌNzO ºT¦°´ÿ¾_)ôÚ}õ‹ŸNËü:´¬y¾�œên¿rVº�®^Rh¯×*S�ÞŸ{úÐôýþûl߆ÊVýá·ÜÏ~´oÑzÃ0EÑûÞõöôµßþQ?ùna×_vVZWé¸&&¯unô_ßæ=;ükQ`Ò¶þí_ßVÔæÉû®JÏcxNô_½âŽC½Ÿ~9ùÞ7¿”ÖUsìªß?8gz}Ñ9cÒ:}&_üÜ' uòñ�¼¯°¬ŽAëóu:ví£¯÷ŸÑöÝ£Ðæ²óN-ÔWƒ ô&³ùÏlV |í¿_)*+w}b³‡�µ?ܧv�E€XX0XÔ{¤0£÷>$ªÝ'?ú·êÚ¹…öz­å{¯Ô{.#>TTEïã¡çyg�LŒ‚—/›4êçi�õïã ¨}RýáƒöKßûí�~x¡�Ts\ ÿôÆ¿+j£í+*Èé½¶­ð¶‘ã? ÝwNô_½W¹o£ýTôïÅŸ·JÇ®íë¸î¸jû9Ôå~?N<ê ·ç¶…uO�\ÿÕ²:†™§�X¨Ór:Vÿwá?£xÿjAPz“Yˆüˆ{õ¿øz@îX+†�ã!ðׯ¡4Ûb»f^£¨×®Uï‘þÖ�š,…Š8hj½W/8Ã)t(\-¿xja™P#AQ=b °ávµ�j냚‚¢ïõõ ­þ¬íK¥ãREß3é­½eAÚæ¾›.Lß+(jÂ6¢uû`æé½ÊõZaTëÑúÂ6^¥cWðT°S¯¢êžF9í¤m¡Ò/ëÏ—¨·Që ƒ½(8ë¼èµõÕŠ ô&³ùßÖæõžÃôú¿°¼T^³‡�¹Nýš5ôì)ð¨mØ;çËÕcV*lV �E…4õªYÛö!G!-œÌ"aÐ-+—ÚXA1Þ÷RAÑ:žðó(µ_^5Ç®à©÷: ý%:Õ©GPÛñ�Ru¥þ.ÂÞYë3ªAèMf!ò¡Ä£ûÒÛ΄奮OŒ‡�³qñúKõlb fE 7*hvÐ>éÃaéI'mj Û‡^|èÆt¾.æ{àÂ@d…½�ƒ•†NINX Ã�¥T «t\bEõ$j}~H¸TP|Ï¿ÿ«›qÚ Eez¯r½Ž{&cÕ»wéyãÜ„G¤�9^Fû©:Ý6HÛSO¦†«õú…äŒaÛ�äýéyÑk‚"€z™…ȇ¸GPïu}¢q_ÅËÆÃÎYO0áv8�iVPTXøÆŸußßç+i¨ÐõÞ‡ˆn¿4]ÇÜhÆë²ó'®åÛó ŸN— ë}{$—]pZ¡îŒ±Ç !F�¯#ôCµ}Ëf•kXÕ¿®7(Vs\VP<ú§ßM™_*(;f�ûü®-œGýWïU®÷:/Z�Ö.ç÷§Ò±kµ¯aÝ÷¾õ¥tØ]¯µž0ú€«€ªm+°êsðõÚŽ.!ÐyÑ{‚"€z™…Èë8q/c©›ZÇÃÓY;s;œÆ45±!¦^C õ"¦×%¾ô_…•û ¡)õ6…ËésŸ(ôª­ºvNÃú0èU:vÕ‡çK´¬ß·#Þ¯°m9`¿=Óõ)$ª^½�Úo_¯íè|¨NŠêe"¬[àĽŒ¥Z3‡�¹Nãê Š %úñ·¨N¡A¯Ãà#~(Ó‡ Ñ ÙpùpƬ(,†õZ‡¯S¨ ëü~ù@fµñå~Cáþj;ñþ‡üzÃc •;.Eõt†õñ¶ô><ÖP|þÃ�èiù°M¸þJÇ^®.þ<$>þsöÂ:¿íð3ªAèMf!òÁbp}¢›9ìÌíp²QOPDc¬¡gT� ô&³í‡½×‡˜‹Bš^«m¬™ÃÎÜ'ÅÖ#(6† ô&³íg=º¯Dx°l³†�ãë#³\w¯!(¶ÞÊåsÜŒIÅ3—Q=‚"ЛÌB´_Ü+¨‰,Õ\ŸØÌaç8€6ãq€½‚ ˆNCPz“Yˆö³î•—Y�ãkÖ°3·ÃÉA�† ô&³íÎx~ýZÄ´w0*°\³†�Ãm‹Õ›‰êÑiŠ@o2 Ñ^ê© C™îY)¿þ8¿¢åªiS�¸—2Ëáì^EPD§!(½É,D{Å“F4Ó¸šç67cØ™Ûá4A�† ô&³í‡B³j®OŒŸ–’Ű3·Ãi‚": AèMf!ÚË …ñ5‚ñD’f ;s;œæ™yÎ4÷Úæ•æ2�GE 7™…h¯8¾²yCÑ{+6cØ™Ûá4ÏŠk¯qÏ?x½ùƒ äÍ–_ßàÖ¬Y“üéÚϺ—Yˆö ÙBa|k+°e=ìÌípškÓ¦MnÉgš?Ê@ž¨çûæ+æ¹þþþäO×þ{нÌB´�õô•ø:ÁøúÄf ;s;œæ»ñ†ëÜ]×_è~÷ÈÍæ4ÐNNâ+¿¹-ù]ฟÞD W™…hëÑ}•®OÌzØ™Ûá´Îýëîs7-¿ÜÝ´l^b.,Kg»gÖ^ãþÜŸ„— m¸ýÒdÝsìmÂÝtÅùî¶ë¹Gz0ùSµÿ~t?³í÷¾øðÍEï­ÞÂ,‡�¹òfÅŠnʸãÍ^¯z½úÄínÂèãÜÆ�“MØÛs'žñüÂË‹Þ+H†í³væv8È£Ñ#†¸ºÑ }õX¹|ŽÓ-Šâ튙…hŸp˜Y={ñ0pÜ»×7r-!·ÃA^-[ºØ-�?É }õ˜1y¤ëëëKVmo°�YˆöаoÒÔ;÷0Æ×'¸•NÁŽÛá ¯4D­èzA½Ûg9ìO¢áv8È›©“'¥CÆVø«ÅÂY§ºK.HVio°�YˆöˆÝ׿jNÑ{õ.†í³væv8È; �y´þª•Nb3„I,P%³í3?yËä¢÷qxËjØ9œÜy¥I-:¶B`5nY:Ã͘65Y•½~@1³í¿Ç®Zô> ‚Y ;s;t’F'µLw“X f!Ú# k ~apŒ¯OÌjØ™Ûá “èчc†[פõDŽ?y$“X f!Z/î!|ôÊã‹ÞÇ.‹ag-®£Þõ­4uÊuMja ÔÎ,DëÅYYvlÑûðV5Y ;s;t¢5kÖ¸ñ£Ž1Ã`)ê�Ô-qÔ#¯PšYˆÖ‹‡€ZtdÑ{Ý:Ç·ÍbØ9¦ñÐ6�gšÔrßMš¡Ð¢I,3§Ÿ™,j¯`3 ÑzñŒç/Ø¿è}Ø6vVcX_�xõ^ã´Ã²eËܼicÍPÓ-q¦ŽÎ$¨ƒYˆÖ ƒÛý³¿Qâ¡å,†�ãIm;nä™&¤T;©%�Ärʨd1{]€ÒÌB´Vþ6.øQÑûðÚÁF‡�¹º…&µTs«õ<ê¶:ñò€ÊÌB´Vüè¾�*z^ŸØè°s|-dü´ ShR‹ž²b…CoóúåLb€˜…h­xbÉýs¾YôÞ?s¹Ñagn‡ƒn£!år“Z4‰eþÜÙIS{y@yf!Z+œÈ²næWܺ_.¼Ã`£ÃÎÜõÒßZ/QXrþwÎD»WQ“XÆ =Ô­¼‘ag¨—YØJz8ÿªU«Ò‰½ê‚_qs25çØ�’ÿ~¢ð~ñôÁf;¹îÊ…Eë)犹§-;ÿ„Ϲ›o\a¶­„a¼Þ¤´ø`ø^îvxeó÷üÚEnËú%îé»/u#Ž9ȜԢžÆÑƒ¥mÔö…®Nö»?Y…½^À@fa+(N8õ7aÜ7sÚnþìé½é¼énö´ñs¦M(z?ïÜ3Óvóf�]T>gú¤�ë*%ÙÆœé‹–Ÿ;£þs>fÔp7aü8§�®è^ ‡a�´z¨[Ù˸- ^ž†¾ÐäQ‡™“ZæN‘üéäíŸO¼üäÝÉ*íí¶3 ›M!ñì©§¹Ç¼Ç¹?¾àÜý�"ý¼^pwܼÜ�9i¤ë劉¦—į¼fö2þñåÍî¹{/ø¼¾Ë'»SN<¤($j‹z¸e®¹Œl^u^²z{›€mÌÂf›zÆé®ÿ7¤�èõ°¸âÊËœnQ¾ènñÍáCªËr‚Ô¶<œ„ÐfÐ �vHѤ–¥ó&º9§g¶ =}ûYÉfìmÚÕuÅ¢‹Ý_^�Â:Nÿ¦ݘ“F$«ýY£{ùëKQ½fóÇËÕªuéAQOã7OpçÞÅ�>ò°4$j˘c¾ë®™´·Ûtýs¹Pÿ¯ÎO6eoz�YØLº÷ÙS�Þot–?½ò\õ”ŒøsFw‹¯W,GÃÒõƒ§úΨëÖ8RnøÙ{ìš¡…[äX6Ìß'mS6$&�”ëÀf6A±»´#(–»ч“xdGç¿T®ÔÓ{XÊÓwLì,º§¢n™óÈǦu;œrQT¿õÑ[“MÙÛ€^g6A±»´:(Vf®·÷ Õ³zqõ™4ëü÷¯žg†¼F©'ñ…¯M6aoÐ!Añ—·\ëÆŒ<±È‚ùçšmÑZ­ ŠºQs©€¨àRË�œQ¿øºD�{MN)wOÄ,lÙpUì¬ÀW­KCÛñvÅÌÂfª'(N:u´{ãÿÁ�1¤à߉°˜ÍŠ•†™¹±uÂëÕ{ø»ÇïLŠí¶Í¢û+6¹jc6S½Aq‡WQÙOþ¡û�þͽØÿXú^½Œ÷ßûKwöÒ×ú¯o»|Ù%E½‘O<¼¶P§eü²a¿^Q�¦Ö¶ÑkÕ©]¸œ¶å—óâuÇ×ï³ÖIX'~Û÷¶†ÇmÕ‡Ç.*Óú¬óV�fEõPéZÃ0†TšÝ‹…íüÄ¡jnmÓ ê |~Ý"·yõ\3z †ÏÞ³ mËe P;³°™² Š—\8;Ùû7¸Ç¼7}¯×ßÞ÷nôˆÒÇ3'Ÿš–+¸}ÿ»ûz">h÷ãP‚~=Ç�Thóñ�íèÆŽÚØ´ý|ã?µ¹ÿž;ÒuóóÃÜ~ßúz¡ü+_Ú½(,*¨i¿Ž>âÐB›=¾ü…B½‚Ùw÷ûf¡îK_Ø­(¬éµÊ|½ö_û¡:¼/ñó…:ùÄÇv*›¶ÖûcÃb©óV­fÅr×!ªw±=Y½.ïçüå'ïq/ýfu:1Eÿýý3ëݶ<œTÙíÕ1 ›)« ø�}¿é>þÑÝ‹›Mß+ðìû­¯Þ‹“†¨/œ;£Pö›$$i]×,Ýæ|P¼zÉÅ…6j¯`è•úÛˆÖ¡u­OB£/|ôáé6ýûï}û[öËïφ$è)ØÝqóòB�^‡ÛÖë…Ì*Ôkÿý~œ;ýŒçEëöÛòÛöuZVçlæÙ§ʬóV‹,ƒ"·» _ÌÂfª7(*0�5´@�' n < }ár·ßtMZ.'²v±iÃåšT¶üŠKÓ÷VP•Ÿr°ûþwö)*[»úÖtY=Uí·5-êÔ¾Äûn[ÛýÉ ÒòxÈZ2\>ì),µíaCŽu{|i÷Â{m+>oµÈ"(jH°ÔÍ›5Í03­g6S#“YN~|AÜ»gÃåâå­ (áúJE !~èÁEe ײwÜ|MÑë°�§eµ^kÿ|/¥zõ^Á؇B"ÕC¨º£?$ÝŽ” ‰¥¶Kxœõh4(r»òË,l¦¬†žcVàñ=ŠaO[Ì Š Z*Óòz_jû‡ýtPzýcX¶öW·¥Ë*ÄÅ=“± §lëQ´êb ¶ …_Ü}·¢AÑv|Àôû­2…ëxÛêIÕu‹þ½Ú·#(–»Ý ÃÌäƒYØL­ Š KZN=ma¹® ¼³ïÚôµ§M�”.§åõ¾Ôö¯J›‚žÖçËŽÿÅ‘i`§ë)ý{ñCÈê5Ô¶ã!e…;?t×)èéºÆ°�¯ó×7g¿om[muýä9g�V(kuPäv7t³°™ZEC· nþ:>QxRÈS½Ša½†”ý„)µ}I ûj}~YõÖ…Ãâšœ¢°¯ß׫Pá­¨þK»z$ã:õ`ú}S�¤n–c�ú™ôÃýÓe­m«mX/­ Šf¶¢0Ì @þ˜…ÍTOPÔuvSNgÖy£†çÖß½}öqH¡Põ!ß[èƒbXwÁœsŠ–/·}­'\ÖÐ�–ÛÄë׺Ãúp[q]¸¬Ž7¬“ß(ê:Cžª@w1 ›‰ Ø]F�x¬»çüŸ” ˆêaŒÿ@g0 ›‰ Ø]†ò-wç”/‰ 3ÐùÌÂf"(v—ãúõ¢ ¨YÎzêJü¹€Îc6A±»ø Èuˆt³°™ŠÝEAqÍ£¹Ý ]È,l¦�7º?½òœ:ÐyF9ªâ“Y@g2 ›íéÇî7C:Ë¿´ÙM8u\ò‘ÚŸ3èlfa³õݸ è,«ï¸Á­¸öÚä#µ?gÐÙÌÂfûÝÖ­ní¯~é^xæa3€ ¿þò_[Ü·9ùüns .º ù8íÏt>³°UV¯¼Ý­þeŸ»ýæâZ÷ì¿NÓo3µqíJwÛ�W§Û¸ùªîÆ%³ ô~à~dç¶›–»¾‹Ý�Kçm· )ï»vÑööÉ9è»i…»óŽÛ“�Ðþ\@w0 a[±b…›zú©I¸³{Ûêñ_[Ÿq';Òi’�ƒÞ´Z·œyý¦ÕMùß+ϬKï{n3Ü6·» ·™…(mÌI#ÝÖg“ðf„¾z¬ºí:7ađ^HŸf†µ×—ùÿ^ûïWÒu‡Û ñT f!J[¶t©[vù…fè«ÇÙ‡»—/M{ï°¦=º,ÿç¢ÖnËSï¢z5“ÿ™Çz‹YˆÒ4D7ᔓÌðW-Mb9éØÝ}·_= 7Q½�þ¯Ò03×!€JÌBT¦I-:¶B`5ú®¿ÒM:áÀ½}zßèÿt�¡z%Ãõz 3€j™…¨¬ÑI-§�=Þ-ž~ü€×Èíp*]‡øú,jóxbf!*Û´i“sÒˆº&µ¨'rØ!{¹{/<¬(ÌÕ{;†™@3˜…¨ÎÔ)SêšÔ¢I,S±GQ˜SÈ«u‹Úk"L©€Èín@#ÌBTgÍš5n¸Ñf,E=�ÇÿôënÅ©»…ºZo‡Ãín@³™…¨ž&µ¬Y}« -šÄ2æ'»ºu3¿RvµÜ§Òín4ÌÌín@ÌBToÙ²enþìéf(Œé–8†êf½cQ¸«æv8Õ\‡øúzÌý¨•YˆêmݺµêI-šÄrÂAŸq«§~¾ðª¹Ž ·»­f¢6šÔRÍ­rfŸ}ª›zè‡ ÃÎ yån‡£€¨žÂ8úeŸê;CÍÌ}h”YˆÚl›Ô2Ö ‡^ÿotÇüUwÍè�Â^©Ûáp»�f!j7áÔqe'µhË)?ú°[;ý iØSŒ'°èý‹¿¾¡d@T9ÃÌ UÌBÔnÉùSÜ9S'˜!Q“XÆœp¨[<æ‹nݹÛîŸß‡ÛÝä_¿[µj•Ó³¾ÔG#0ú.Åß/ùd¢:¯lÞàž_»ÈmY·Ä=ý«K݈Á‡™“ZÔÓ8æøCÓ6jûäMÝ«/<ž¬bû0³…ÛÝ´Ÿ~Ô.Y¸ÀM;Ì͘<ÒÍ›6@�¦ŽîÆ ;ÖéŽñw @þ˜…(/ ˆk.OC_hò¨ÃÍI-sgNqWÌ=y@ûÍ+Ïs/:Ò ˆ÷—gïrP7}‡^|è&7笱nþ¼¹ÉWÌþÞȳ¶?¾´Ù=wÏÅŸ×wùdwʈc‹B¢&±¨§ñ�›çšËȦå# ‘aæ|ÑPó9§�rÿóô�é€lü)ùN�~ʉNÏÍ�¿wòÃ,Ä@xþa÷Ì/g˜A/4aÄE“Z–^:ßÍ™|‚Ù6´iùðôv7 3çË%_èÖÞ²Àü¡И;®ž�^·ïä‡Yˆ�úï*Ý#(êi|âÆ îÜ_ìâ&�–†ÄtËñ?q×LÚÛmZ1Æ\.Ô¿úüdSööÑS&Op/=v‹ù# 1[6ÞÀµŠ@Ι…(öÛ�+Ì`ç) ®=ç îžÉs+'îäŽýÁgÒI-«n»Î ?è“i™êÖÏÚ«b¯äÖÇîH6iïZOAñOϬ4ä4æO›W�œ3 QÌÏl¶¨§ð¾³vMƒ 7å§H'µœ5~¨›uø{ŠêÔ¶\XÔ¶âí£}­8Ù (ùfb»—Ÿ¼Û t¢áæ8$Êâ>àNøÙ~÷t}§ì8 ^½�ÖúïÕ-�&›¶÷­EPš‹ ä›Yˆí^}á13Ìyš b…Árºüps]¢kÿû%o•E ¹Š@¾™…(öüšÒ“YÔ«XKXTH,7ìü|"Þ>Ú‡ 4AÈ7³ÅÊ ?{�]=´p‹ˆ¹û¤mʆĵ‹¸>1gŠ@s�|3 1ÐÓ·O3Ã]L÷TÔ-sYzlJáP·Ã)Eõ/<°<Ù”½}´Ah.‚"�of!lý«ç™!¯QÏÝ»Ðýú’§Ïz~æÎs“MÙÛGëÕŸZs•;í¤£Lw­˜k.c9ïŒa5µo„ßç¾É¬¿|ÎøÇbµ«¤ÒvuÃåg§û—ë\Æûÿà—h‡Ö#(ùf¢´-®rå®Y¬ÕÓ·Ÿíºô�4$†¶¬çÿ<ó ž xû•³’oÖÜ!~ÓÄEnYz޹Œe‡w½ÝMu¤Y—5¿Ï�®^2 N¡êSý@ÑqìøÁw§å ~qûrÊm' ‡Ú×í±ûÎÊu.?÷é� û¿ÿ>_q?ØwÂb�|3 Q™î¯ØH`ô×#*Æ!Ñ{xÑîÅ_ß�lÎÞ4_#A±\RÈR/WX¦Þ0•«·M½bÿôÆ¿w{}i—´Ì—û¹°×RË…ïÃòpý¢ʸ�Ö{ø ýÒ}>ñ¨ƒÒrß+§úøû¿qFQ´ž%ó&¦aqØ1?*”iÝñ1)ˆi}z]i;z­ÿú}‹×åëÃ2¿œ^kûŸþø‡Ü{wø×Â:|ŒC÷c¿ZêÞõ¯os#Ž=8}_ê¼úö¾L¬Ï­Ú}Ûø^Õø3Ñ>„ËJ¸œ„=ÍZOXçχgýmøm‹Ú‡uÚV¸¼ŽÅ×ÅÇUé¼Uƒ ä›Yˆêi¢‹ãæ»æš�ÐÓ5ˆOß:ÕmZ>Êm¼øàdÑíëøï—ŸuOõ�a†EyìÊ!NmÂeÐÍ ŠÇ~@W¯˜—¾ð——¥!ç§|ÃmÙx}úƒü÷7îsŸÞ1m+*÷ë~Ì Bù’yÒò?ðîB™Ö£õi½~›úWðômäû~%]ï÷¿õåt½ZNå>|õ‹Ÿvûìµ[a¡³NœÃÖ×C‡‚˜YØfá¹§¤ëÕërÛQOà{ÿã�îÔa?+ì›Ö†õª�ï—ó=ˆ7/9'=ïzÇ[ ë¸ï¦ Ó:«wVËùeK�WÕ�>ú(·÷—w-”ñ³w‹ælÿ»¨vßõy„mt>ôù‡Ÿ‰ÎÏ; ^W–Õ¶ô9ø6rä�¿�ÖéÜ=úGér¾NÛòÛV½ÖÖëoꎫÏKëÕNí}�h[~۳Ϟ¯¯Ók•ùúrç­ZE ßÌBÔïå'ïq/ýfµ{~ý2·aþwÒ[çøÇüÝ{Æ'ܺ™_IßÕS¨{6n\pЀ èqýbë5õ®�òÁP> ØoÏô½Âƒ¯·Â�_÷‰Gý°¨\=dá´Ö£ÀtZ²M_¦ ¢Ààß‹j~½q¸Uœ1é„¢2O!Lˬ½eAú¾RP”RÛQØÒþú`'}w¯tŸý{šrAÑzïÅçRZánôñ?Mß—:¯ú¼>Ãýš{æˆtY�«Ý÷x=òƒýöH?wÿ^Ÿ£Ú�7yÛç¢mh[ñ~ùÏíÒYãÒà§å|�ŽÉo[Ÿ�Ž+¬W öû¡(üôÀoêdüˆÃÓÿêïRŸøw¥×*óA¶Ôy«AÈ7³ÙXsönîž3>îîÕ-rNß×NÛ- }æíW²—PÃѪ�ƒ¢Çptë4}¯YH?Ò¾�~¬ Ôãc…ˆrAÑê­Tø C©†Vúa×rñ6¼RëU™Â^X橭구Þ7ã€wõEg¤m} k4(*”ûs£`®ÐìT©ýRÏ�BWx^õµõ¹Þ}W�B—Ú†å ]¾WO=ZOøˆ�Ú…Ç%ú{òÛÖñ鵯 ÿ¡" ‰áòa�B¨zµÃ2Q™êôºÜßcµŠ@¾™…ÈÆýs÷Iá‚b*y}ß”OŸ†›ãeBêA bˆë[£YCÏžÂƒÚÆ!Bj ŠBTø éz¹üz+íS©z…‚s'-*ó|o•ŸYŸ­¶âå¬õˆö+Æ—°—­Ô~i] ñárñòõî»êÔFmÃòð<Æç/f—çÃ¥¯ÏÒ‡BI‚þá¢:õjj;ªóCËÖç)*ó—¥Î[-Š@¾™…ÈÆS·OKÃa:ì¬^Å$$†ÃÏRéÚC G—»~Qu\¿Ø<Í ŠþºDõlé¿áõ„þ {¥Ö­ž%†°ç) ' sZÎ÷‚ÅJ­Wפix4,ó4<ªðá·©!ê8X4—/œZ´þï~óKÂV¼œµ±Îe¨Ô~©Ç-¼fÏR;‡Ÿ…§:µQÛ°|ø±ƒÒó®×qÏdLíüõŠ•hHY¡0¾$Aô÷¡:ý-úëN/ûñBQ/�ê >»óŽihQ¹"2øg?°œ¶¥rD¯µŽ#“ðèÛ)k}›RÛÑ~†Ç*j^Ó©×:&_¯cÔ9 CšÚ(Èø6¾—¶Þ ¨ýÕq†çV´MÕ©M5û^*(ª�Úúåtî¾\;)úlµ|¸~?Eí~òƒo¤CÇa½>/Õß²tÆ€:…S¿oñçªÏEÇë·}êðÃÝ^_üt¡^¯Uæë Š@÷3 ‘�µÓ¿°}øYAñ¬m=Šáð³®7Œ—«¤Üp´ÖWKøDiõEýxëÇÖ¢h>Â0& *÷Ä·óôÞ¯Û· …mµ.‰·¡÷a»°^û._n9 ë½p¢·µ¶£¥èËŇ™�?G~YíW¼¯ 2¾�â*³Öç•;¯â×ç…Û¬fßý¾†e^|ÎÂ�è…Ç-áúã¿ñÛ²êÂe«ù\Ãó†D©tÞªAPòÍ,Dv¼èÀmA1~þxÚ›¸îÜ=ІŸE½�ñ²•pýbóÕQ;…­°g°“tò¾çAÈ7³ÙÑͲs0ü¼m2ËÚ_. u6Ž—­–B&×/6A±5н‹ ä›Yˆì(¤ùëýM·×Nû|Ú«øàûºF¯/äúÅì[ÃBî�¼ïy@PòÍ,DvÔÛç¯SÔг¿NQáí‘¥GsñòõàúÅì�æ"(ùf"[ê=LƒbjÛuŠ m † na�Ëj˜Xa0^wHÛáúÅÊŠ@s�|3 ‘-Â{§|êõ^Åí×)*°m}¤o@ˆË2Ài¸™ëëGPš‹ ä›YˆliBËöû)jøyÛuŠ j&ÖM·ÃðVíM¸kQîúEõÎmܸ1Ù„½]A±¥® 5ì¬×êYôÁË?‹® ôåq]«i8ºÜõ‹ºAx/^¿ˆÖ=bˆ{ñ¡ÍÐW�•Ëç8Ýú(Þ ˜YˆæÐ�rx�¢^‡×)†ÃÏþ–:¡fÝ„»ZêñäúE´Ã²¥‹ÝÒù“ÌÐW�“Gº¾¾¾dÕööÛ˜…hÿ¨>�âº_N_ûë%¼wbÜ‹§^F_×Nån§£°Ëp4²¦!â c²éU|ð——¹1û­[·&«¶·ØÆ,Dsø -šñ¬ ¨ç=køyÝ9_,­xˆÙ—{; w-Ê GëúÅv÷€¢»L�<)2¶Â_-Î:Õ]²pA²J{;€íÌB4‡Ÿ¤â¯ST`Ôðsx�b8ü,íº wµ*]¿¨:®_D4T<~äÑfø«V:‰eÌ&±@•ÌB4�“¿NqÍ™»¤aêþó¾V®â^ÃøºÀ<íjŸ¹~ͦI-:¶B`5nY:Ã͘65Y•½~@1³ÍãïMxï”OMd ÅÃÏí¾ w-¸~ÍÔ褖)ãN` ÔÀ,DóøÛÞøë×ÍüJÚÃ^§hÁ¸·®7á®×/¢ôHÅ1ÃŽ­kR‹z"ÇŸ<’I,P³Íão`½æìmOfñ7Ü~ðŠÂTÜóæ¯oô&ó~íŸÂ Ba¸ß!� ®_D­¦N9£®I-Lb€Ú™…høüuŠ~"ËC—Z¢âág‰C—Õ&�z¹~YY³f�?ê3 –¢HÝG=’ñú¥™…h.�t�¢å§×÷Ïݧ(¿>ãùñkG…¥R·Á‰{ä4l·éŽ.wý¢êãeѤ–jn•£žGÝV'^P™Yˆæò×êmŸÐòùô½‚a<´\êº=µ­¦]§(wý¢z¹~1MjÑSV¬pèm^¿œI,гÍ¥¡b‚t�¢ŸÐ"ϯYTx-¥†ŸœÂv¥z;I¥Çê”\¿ˆ�†”ËMjÑ$–ùsg'Míåå™…h>~Öœý¹¢ -ÏÝwiáµ” €�vîj)0r;�|ÑßV{u—œ?Å�3ÑîUÔ$–qCu+odØêe¢ù|ò×)ú -zŽ{ÕJý@wâM¸k¡áèxˆ=ÄptkùÉGí¾Qú+›7¸ç×.r[Ö/qOß}©qÌAæ¤õ4Ž<(m£¶/ úë×Íørú^Á(V.5ü,ñÌárm;•ŸücáúÅÖQ8 Ͻ.hå¹ß/OC_hò¨ÃÌI-s§ŽpWÌ=y@ûç/?yw²J{;€íÌB4Ÿ†òüî}Sw.Lh‘Wûxáµ”~îô›pW«Òõ‹ê‰íÆãΛ¸Ûkf/ã_Þìž»÷â�Ïë»|²;åÄCŠB¢&±¨§ñ�[æšËÈæUç%«·· ØÆ,Dó…?¸ºNqÍYŸ)¼×�kµÃÏÒ 7á®–&qýb{Åo!Õey_Ï?ly8ùLg y±ñÃ)šÔ²tÞD7çôã̶¡§o?+ÙŒ½mA±­ü�«®SÔìçðÇ6~®þ¶¢¸¸M7)w;?|/ƒì”»Yº¨^ŸQ¼\­úW—îõ4>qówîà]Üé#KC¢&±Œ9æ»îšI{»M×�1— õÿêüdSöö ×™…h ?QC×)†3ŸUþÚ¿RxïËâåCq¤zÝâ6ݨÜp´ÂJ'>µ¦Ä×+–£^ÞzþáòÛ_¯0ƒ�§€¸vÆÜ=S>æVž¶“;æûŸL'µ¬\>Ç ;p§´LuëgïU±Wrëãw$›´÷z™YˆÖÐdÿczï”O¹u3¿Rx¯âZ†Ÿ%l[Mûn¡Rn8TçQmtN‘�r½º–Z'¿ø™ÍõÞwö®iô¦òþtRË™£u³ŽxOQ�Ú– ‹ÚV¼}A±­ÂÙ¼ºN1œÐ¢Tñï¥Òðs8AF*õBv�¯r×/"?*M~Ѭd+Љ†›ã�(‹‡~À�ð“=ÝqíæúNÝq@½z­õyš4ïô:³­NhÑuŠk§íVx¯^°Z‡Ÿ%J½Ò«ªµ§ í£üXÃÒ/>|³æä©Û¦�ÞÐý?è&z¯Y'åfOëö;ñ~@¯3 Ñ:þS×)†�ò{=Ö<ü÷BöZ¯b¨Üõ‹h/ý]j(ºÔµ‹•z­(rVÏ¢U§^Hk}Þ«/<šlzà¾@/3 Ñ:úÁô?ž÷MÝ¥èÇT=е?K/Ü„»Z ":~�7d+¼Æ¶Zú{×%¥¢§z+Ìyš b…ÁrZ|¸¹.Ñ5Š<µ2 Ñ:a¨ÓuŠá„ß{èßK5=„šé.#å®ê¡°ÿ�•¢PYëírÊMfQ¯b-aQ!±Ü°³žÖo@Pl»pB‹®S\wÎ ïýÍ£k~–øG\ïã6@½ª¹Tÿ¨Ñßn¥ÞÃRÊ ?{�]3´p‹ˆùû¤mʆÄ$�r}"ØÌB´N8´¬ëÙϾ÷0~lZ5¡O=ˆá2Rï6R�uxÉD¬žÞÃRž¾cÚ€`gÑ=uËœG®86¥p¨Ûá” ˆ¢ú­�ÞšlÊÞ>ô:³­£ðþÈ® zÅ· ËÂòrâžH sÇm€ZY· Rp,79¥ý«ç™!¯QêI|áÁk“MØÛs!üÁ];}÷¢`ÿd‘z†Ÿ%\FÔ;·ª_ҠШÉ);vˆ«Ò`g¾zh]ÚŽ·(f¢µÂš4(ÎÜ£ð^?ÂjSÏð³ôúM¸‘�ðºDõ¶ãº¿b#�‘ë 6f!Z+œÐ¢ëà -a ôež/¯„›p£QêÙö½‡y¸ÖU½�ϯ[ä6¯žkBOÁðÙ{¤m¹Fjg¢µâ^¿ð9âÛÕ;üN˜zQ«¼_²ðò“÷¸—~³:�˜¢ÿþþ™õî[Nªìö€ê˜…h­xXù�ó¿[ôÞ_§Xïð³Ä½ŠþÖ;¥˜…h½0ÄÝ?ûëE¡Î_§(ñmIª�DÀM¸@­ÌB´^ØãwÿÜ}Š]Øs?×r¿ºxÆj-=’ ÷˜…h½ø¹¹÷ÏþFáuxMa#ÃÏÜ„ÔÂ,Dë…3ŸåÁ (zºz‡Ÿ…›p€j™…h½¸§ð‘¥Ç½‡˜~–pYÉûŒVÐf!Ú# o-:²(Ì…CÌq¨Ô°µ¯«F|;]·0 Ñá�²^ÇïKµ•Zg0snP‰Yˆöˆ'´<²äè¢÷altø™›p€JÌB´G<¡å7ןRô> ƒ�?KܫޯÀ,D{ ¸õMã[á4:üoOë«u {™…h…´0¸=~í¨¢÷ñðp£ÃÏwk�qЛÌB´OÚ uŸÃ°,ìñËbø9§B¯"³íçoŸVô>î5Œ¯3¬'äÅ=“õNÐ}ÌB´O<¡åÙ»½�¯SŒÛ×3ü,á:D½•qÐ[ÌB´O|3ìçî»´è}|�b<ü\ï#ùâÀÉM¸€Yˆö0óùº±ih Ëâáå,†Ÿ%^7á ·™…h¯0¬©±ÒðrVÃÏÜ„„ÌB´Wܳ÷2Æ·°yå™uEõõ?K¼mn @ï2 Ñ^ñ½ ß¿¡è½ÕÓ—ÕðsJµ-n—@o2 Ñ^ñ„ %W ‚Y ?K|‹n @o2 Ñ^q¯žB`ã‰&ñð³‚eX_‹W_x¬h]B¯"½Ç,Dû…!M3Ÿ+]§(Y ?‹¶®+¾#è~f!ÚO×ú�¦×¯ý÷+EÁͺN1Ëág ×%굌ۀîe¢ýâ -êŒ{ ãeâ!ãF†Ÿ%~´_£ë�Å,DûY×$VºNQ²~–°gS¸ 7½Ã,DûÅ×$j&t|Clë‡Y?kùp}Ö�7èNf!ò! hšLRÍuŠñðsÁ.î¥ä&Üô³ù†³×_Åë%ëágn @o2 ‘ñ�¯Õ£O0±f"g=ü,Ü„€Þc"âÀ§PXÍuŠêí Ûd1üÌM¸è=f!ò!žH¢÷ñuŠ¥n„�õð³pnz‹Yˆ|ˆ¯ |=˜¥=„¾¬Toa3†ŸãžJQOcÜt³ù†2?¡¥šë›1ü,ñ¶uíbÜt³ù!kèY×%†e¥z ›1ü,á:E=ŸqÐùÌBäG܃§¡Þj¯SlÆð³ÄA5«ÞJ�/f!ò£DïaU×)6køYâÞJí@÷1 ‘ñ„–×ï_è»rHQy©I%Í~ŽoÓC¯"ÝÇ,D¾„�LQÿ«ö:ÅxøÙºïb½¸ 7ÝÍ,D¾ÃÌé’0¤•»§aØ.Ëž?Ͷ×-YõX€ö3 ‘/ñ0³caY¹Ø¬ágá&Üt/³ùRjör©kæð³¶®[¸ 7ÝÁ,D¾ÄÃÌ>èÕrû›°]ÖO¸ 7ÝÉ,Dþ„AÌïÖr�b3‡Ÿ%\·pn:ŸYˆü1&´¤åa8+×S÷>ê}ܦñ,ì¬{-@ë™…ÈŸøV4¾G°T¹%l׌ ×É7áîïïw«V­r}}}ÚlÍš5NßÉø{  õÌBäOÜ#¨[ÓXåå®Slöðs'Þ„[?F—,\à&ŒæfLéæM  Í¦ŽîÆ ;Ö-[VúÿÏ´†Yˆü‰C˜„µ\§Øìág‰Ãh–3¬›aæô3ÝÅçŽs/?z³ûsÿ]îÏÏh»ä»øBòÿy³ÏíæÏ››|Uíï/€æ3 ‘?ñÍ­Ã@–WêÅ«¥m=âà*Y÷\fECÍÓNáþç™;Ý_ž»Ëý%ù��ÿóô/ݤ±CܦM›’¯¬ý=Ð\f!ò) _aÈ«eH¹ÙÃÏ¢n#¯�ö»äâ ݽ7^hþ@ȇ[¯˜•^·´†Yˆ|ŠCž/¯å:Åxvr3BœÂg¸ ÉãM¸§Lžà~÷è-æ�€|xî�\«´‘Yˆ|*5¡%î­þ¶͚pß„[O‘‰Û´›‚b:ìlü8ȇ?%ßQ‚"Ð>f!ò)î {ÃòJá¯ÃÏnCòvnEë‡ @¾�ö1 ‘Oåf8×þZ1ü,ñv´�q›v"(�� ´�Yˆü*¼âaéJ7»Û6køYâ›§›p�Î@PÚÇ,D~)ÔY¯Öë[5üœç›p�Î@PÚÇ,D~iRH¼Â€–W dº¾1l߬ág‰Ci^nÂMP:Ah³ùUîV8q ó奄m›ÙÓ÷vj[ÍêÁ¬Aè E }ÌBäWºÂÞ¹R·Ï)%–•Ú7âáEGm«™=˜Õ"(�� ´�Yˆ| W8ó9¾°Òo+‡ŸÕƒnKÚÝ«˜Ç xÃåÓܪås̺JÎ?û$÷د–šuÕxvÊt/qrä Ah³ù¦¡[¶â!ã0ˆ©/¬³„í›9ü, ¢áöÚ}îz‚b¹0µdÞD·þÖ‹ ïú$lSÉ»ïì´¯Yç)HZë}Còu^xî)ékí_­Áñö+g¥ëxtõ³^üzuÂrmGåÖ~霔ªk”ÖžóFèóÓúB�od‡ ´�Yˆ|‹‡qÞ¹Z¯SŒÛ7û¦Øá¶Z±½rê ŠåÂÔïz»›8êÈÂûÓN:*¶©¤š ¨zµ‹Ëਠ÷Ãï|Õ­¬¡w²š ¨:µQÛ°\ÛUù‡Þ¿ƒ{é±âý“¾‘ÖYûÜ(ãÕ Î0ëj¥Ïï£~oºNÙöYìç¿{™Ù­CPÚÇ,D¾•»1tÝa<\ÝìkãýSP�Û´J³ƒâªkçº÷¢)t\0mtÁÒùÓv¾ÞE•ù6á:î¿m¡ûÂg?ž2_öËE ë>ßñ¹¶>�0ð—;oq}|ì~Ýá6âíWBPÚÇ,D¾•›ÐRëuжoöð³Ä½˜íº w³ƒbÜó§nõPù+ÙñƒïIÛù6j¯ 8zÈO m ý³zÏÆ`|½ï5Œƒbü^?à{~açÂr‹?¶‰#�,Ô«‡M¡Ð¯cŸ½>Ÿ¶Ñ~ªþ¸ÃH˵ÿ´ Ç¥ûïC†BÖ~_Û=mž mKÇá·£õj¹0Üè˜ÕéÛH|Žã÷ KßÜósEË{Ø÷ uŸýÔG åÚ¦¯³Ö%á~ëuìçLRX‡ïÍTøùìÎ;ʵ�0j:¾ã�8°Ð&ü\Ã6ág¯p¥6ßýæ— ej§ÏDu~Y}¶*÷mtlgžò‹´NíÔ^e¾^çÈo[Ÿ•êÃåõ¹ßµb^Z_é¼iÛa½^‡aÑú»:ÿìQ…új�ö1 ‘o¯¾ðXQÐ '´H¹:K«‡ŸórîF‚¢zÖ|ïˆ÷–7½±lP<áç?LÄ/ª�ƒ¢T8d¬÷£ÿ¸ð>^¯§ý*}Ï^8L‡^ÿþ°ƒö)´¹dÖ¶päƒ_¹¡g­_¡D!V½Šz½Ë'>”‹ö7ÜgõÖ…aÁ/çÃ�øpäßK¹ ¨}Tø ÷_üð¿öE!Ì—k›á¥ñºuδ>…;½÷A1¾œ@�+þ̘µ¬?oþsÕqû6 c Âþ½õÙ‹Ú„7Z‡ÚéoNïuúÛ ÷Keþü*Øjy•ùz…w¿mõ ë¸Â}Ó߉ß�rçÍo;ü,õZe~{ÖßU­Š@û˜…È¿rAKïk a­~–8œ¶ã&Ü�ŰwÆÓÐk© ¨À Ï+.8½P/ª�ƒbø^ôþ‡ßÙ³è½_oHûU*(*€©÷Ò×I© ö–ú`¨0¾/õZÁJ=c ( $*ÓþÆû¬ m+ì ÚÎ=7œ_´L¹ ¨0-¢�zºÔ£«mÅã¢u)œúýQ[í³P>(ÆË©wMÇë—?DïÏ›õ¹N›p|ú7áß[mJýÝäi¯ ^kŽþöÂúжóºí¸=½÷ÛÖñi_}]ØË)åÎ[©m«Luzmý]ÕŠ ´�Yˆü‹ƒVX?½E=�a½%lߊ¾xø\ÛlõírZ9ô\*`ÅáÀ áz¬÷žÖ_*(ZËÄÇb[¼ß¥Ž# Š êT@ñ½RÚv¸}]£¦ðn-ã�ÝÚ)K9O=]ÚŽzò’|Âáa­Ku~$ìe+µ~—zøÂåâåÕ&þ\ãõYmJ�o³?ßák‹–‡ÅC¾�¯€çò¿  Üy+µíðs)õYÖ‚ ´�Yˆü+7¡E½sa]øô–Râ™Ô­˜�Üî›p·2(ú²ë.=«P/q8°ÂB¸ë½§õû`¿W”†}�ÄÇb[Tâ÷ž¶†ÃÞÏíô¡÷ÞkÃ}þÖW?—Ö‡½á±ß}Ãùévî½G΋Ïqø^½nZæåׇ{KѰê�ßþªû̧vLÂìÊãuÇJÅ}oïôxâòPxlÞì)Ópü¦²mt~Þâ¿]Šð™O}$}÷LÆ´�3ÇmÒ/ç¸Ã�žkë¼Í=s¤¹m•©N¯Ë}gªEPÚÇ,Dþ• ƒ•®a´´cø9ÞOie¯b«'³¼g‡M¯Sôïôƒ†+,ÄëQè ާý*Î:%ýñ'‹œ3ñ„¢c©&(úÀ뇽8(ª'1¼RûÃŽ|wÑu—ñ¹Ð{…í£o£}×1” ŠÛz2ß”ìËÉ…z¹iÑôô¿KçO**WP ‡Më ŠþÜÞµ¢x&¯¶ëCkü¹ªü{ßúR¨}™õÙ‹& ´Ó¹ùâg?î&�úyú^çZÇn_ë÷ïµ µ?{ñçCåñp³þQ¡¿³°�ž7�óxÛz­2ß›JP:›Yˆü‹‡nã0XëuŠ®¯ÃÏ¢ý·[M¨ÍJ«ƒâü³F¥éÂé£S A 6a8°ÂB¼0ýûõø ý*.¾òùm�Ã/§ž°ðXª Š¢%…­Ã‡ˆ8(Æ´ÿá1L:éçixñûb� µQ`ñmÔÃ¥ã.ý2ÚŽ_Ftœª Ͻh2‡zÐJ­+V*(êܪ§-<Ñ~¨Nmô:¬Ÿ<æèô<†WÔ&þìEŸ·z_ý²#qpúY†Ãâ:õj†ë}ü¶ (ÚFüÙ‹¨êo¸üìÂçÖù _é¼ÅÛÖë°ž t6³�! Xq°«ç:Åx™Vݶ&ܦ4ó™Ó¡z‚¢~œ |éÇ1ìES0Tp Ûè½–j|Ï�¯×rá2Öz´-¿6Â×Ö{¿ïž†õî�Å:6‚ÂP¢uúuø@ ²0Ä´ÿñ1øuˆ¯��=f!:C<ó9î5 ëª }ñ5ƒ­~Ö¾‡ÛmEHmuPTOØûíY¤U!Qÿlÿ¢mÏ?kÛ¬Ô¼ºê¢ÉEû+V»N ‰'y?ßyFPÚÇ,Dgˆ{ ã›VÇ=ŽÕÌ(n×ð³´ú&Ü­ŠêCPÚÇ,DçƒU<¼\©Ç±”p™V?·ú&ÜE 3�ö1 Ñ9¦J…ºz¯Sl×ð³´ò&ÜE 3�ö1 Ñ9* /‡uÕö¶sø¹•7á&(�� ´�YˆÎ/ǽq]µ¡+\¦•ÃÏ÷hVÛZ+‚"Њ@û˜…è•&´Ô{�b|oÃV?+̆ۖjn^+‚"Њ@û˜…èq¨Š{ßê½N1~nV¯^)qPUÏhܦQ3Ï™æþÜ¿Êüa�E }ÌBt–0PYÃÄ•êK©w¹¬„Û…Þ¸M#V\{�ÛúÐMæ€|xùÑ>·fÍšä+k�4—YˆÎ_‡×Ç÷'¬ö:Åv?Kü¬Ãê¦M›Üu‹fš?NÚO=þ+¯[àúûû“¯¬ý=Ð\f!:K|â+ϬKŠK×WøÚ=ü,qÈÍ:¬Þ|ãuîá»–ºW6ÝjþPh½??»Êýדw¸ï\ê6Þ_òUµ¿¿šÏ,Dg‰{Þâ +ñuеÜî&\®ÃÏqXmÆ>ü`òµ¿·ZÃ,Dg©fÂJX_KØj÷ð³´ò&ÜÈŸ+V¸)ãŽ7{žêõê·» £�s7nL6ao@Pìa�²‚`<„×—’‡ág ¥‡û ͺ 7òiôˆ!îŇn4C_=V.Ÿãt{¤x;€bf!:O¥ XïuŠ.׎ágQ@ ÷£�í³léb·tþ$3ôÕcÆä‘®¯¯/Yµ½=À6f!:O¤âTWº1w9y~nÕM¸‘O"ž0&›^Åy™3|°Ûºuk²j{{€mÌBtžJZ$¬¯¥g0ÃÏÖfÜ„ù5uò¤tÈØ µX8ëTwÉÂÉ*íí¶3 Ñyª™Ù\ïuŠ.×®ág ÷C²¾ 7òKCÅãGm†¿j¥“XÆ a TÉ,Dg ÔcWIŠŠëã¹ø~‹åäaøYš}nä›&µhèØ �Õ¸eé 7cÚÔdUöúÅÌBt&…¦r*B®å:ÅjnÁÓ*; 7ò«ÑI-SÆ�À$¨�YˆÎ¤^Ä0@Y·� ëk {á²×·JxéUìzìâ˜aÇÖ5©E=‘ãOÉ$¨�YˆÎßÇšÐR©×±œ¼ ?KÜ«XKï(:ÛÔ)gÔ5©…I,P;³�©š[à4r�bž†Ÿã}Qèå&ܽaÍš5nü¨cÌ0XŠz uKõHÆë”f¢s…áÉ rÕÜF§œpY‰ë[)j·fz£;iRË}7]h†B‹&±Ìœ~f²¨½>€Í,Dç ƒS©¡å°M­½‚y~æ&ܽkÙ²enÞ´±f(Œé–8SÇg ÔÁ,DçÒM¨Ãà×K#×)æiøYâàjÝÝGRª�Ô’Nb9eT²˜½.@if!:W<¡Åº1²­µ. šÒîkÃ}…Ù¸ º�&µTs«õ<ê¶:ñò€ÊÌBt.]s†&ëÄF¯SŒ{ñj]>kññhFtÜÝG“Zô”+z›×/g 4À,DçRbš¬¡áF‡�ó6ü,Ü„»7iH¹Ü¤Mb™?wvÒÔ^PžYˆÎ¦j&´Ôz�¢ämø™›p7—zmó¾—œ?Å�3ÑîUÔ$–qCu+odØêe¢³Å½kq½Tó—rò6ü,Ü„»¹üD)]Ûμ²yƒ{~í¢äon‰{úîK݈c2'µ¨§qôàAiµ}á�«“ýîOVa¯0�YˆÎ‡8k²J5Oq)'~ÎÃlãxŸÔ«ØîžÎn¢sž_}æ­ìeÜ/OC_hò¨ÃÌI-s§ŽpWÌ=y@ûç/?yw²J{;€íÌBt¶j&«dq�aÞ†Ÿ%¾=�BsÜõ‹ÿn¼fö2þñåÍî¹{/ø¼¾Ë'»SN<¤($j‹z¸e®¹Œl^u^²z{›€mÌBt¶jC`ئžkúò8ü¬ÞÓpŸ„^Åléï)>Çžêjy,d%ØòpBg y±ñÃ)šÔ²tÞD7çôã̶¡§o?+ÙŒ½mA±k…?Þêe‹ë%î}«5PåqøYâ “—ýê&ñßNLõYüáuéAQOã7OpçÞÅ�>ò°4$j˘c¾ë®™´·Ûtýs¹Pÿ¯ÎO6eoz�YˆÎ —ê-lô:EÉãð³„û$ µqÔOŸs|ŽKÑßY=�Vüí¯W u!ĵ3¾àî™ò1·ò´�Ü1ßÿd:©eåò9nØ�;¥eª[?{¯Š½’[¿#Ù¤½ÐËÌBt¾jf5gq�b‡Ÿ%Þ/͈Ö9@vôY‡ç¸’Z'¿ø™ÍõÞwö®iô¦òþtRË™£u³ŽxOQ�Ú– ‹ÚV¼}A±kUÛ[¶©ç:Å8l–æn‡¸·ùQiò‹f%[�N4܇DY<ôìéŽ;h7×wêŽêÕûh­ÏÓ¤™x? ×™…è|q€+uOÁøÞƒå~¼KÉbÍß„ù£^lkXúŇo6ÜÜ\—èEžÚ™…èÕÞþ&lS*PV’×ág4�Âbø™—£PYkOs¹É,êU¬%,*$–vÖÓZâíŠ]-.u#ä,B^ž‡Ÿ‘=}¾áçmÑ?:ÔC]Ï­q¤Üð³÷Ø5C ·È±l˜¿OÚ¦lHL)×'€Í,Dwˆ's” oqÈ«çù½ ¡á:ò4üŒlé³/kˆÕÓ{XÊÓwL+ u¥èžŠºeÎ#W›R8ÔípÊDQýÖGoM6eoz�Yˆî žœð\C…qÉâ:Eaø¹7X„ËMNiDÿêyfÈk”z_xðÚdövÅ®ÿ˜Çõ^µíÊaø¹ûÅ×%*4jrJ³ÿQ°eÃUi°³_=´. mÇÛ3 Ñ=âÞŸ¸Þ«¶]9ñð³Ö·Aç ¯KTï¡z¢ã6ͦû+6¹jc¢{T;¡%‹ë%œ ?wýÝøÞÃf /×J½�ϯ[ä6¯žkBOÁðÙ{¤mó°ßÐiÌBtý°‡Á­Ôpp<ñ¥Ô“\*aø¹;µ£÷°/?y�{é7«Ó‰)úïïŸYïþ°åá¤Ên¨ŽYˆîOT)5¡EÂvõ^§O aø€Îe¢»TÜâa㸾Z ?ÐÌBt—0¸•ë)Ômq€WêzÆJ~ ;˜…è.ñ3yK]ÔŸÕuŠñðs½ÃØ ½ÌBt—ZzøÂvå®g¬„ág:ŸYˆîOh)×S¨Þ?ß®‘ž@†Ÿè|f!ºOÚÊõfu�"ÃÏt>³ݧڞÂjï»X †Ÿèlf!ºO<¡¥\h Û5r�"ÃÏt6³Ý'måž´‘ÕuŠ £á6~ ³˜…è>µLh©öv:Õ`ø€Îe¢ûĽ{冔³¼N‘ág:—Yˆî¶rÃÀµ<º†Ÿè\f!ºÓËŽ( mq}(l×h¸cø€Îd¢;ÅÃÀåî‘XË,éJâíÖûh@ÐZf!ºS-×f}ma¸.†Ÿè f!ºS-×fy�¢0ü @ç1 ѽ°V©g¯–¶•üÿÛ»óx¹Ê:Ïã¾^³ô2ã´íÚ6=j·¶h»"v»½Ð»GÜÚÑ[mÌà6q ƒ�$$²ÜÙ€hXCh:!��°_�¶Œ\ˆ„!¹‘Ĥ !JOÃ3ç{2Oå©çþªnÕ©sªNU}þx¿¸õ;ÏyN-7Þ¯ÏrŠégº�YDïŠGöâã¡xóK«£€a_L?P~f½KSÈa`«w3í¼×)2ý @w1‹è]ÍlhÉ{�b<õ8nÊÃ,¢wÅáo´°¶Ícº8ïþ@qÌ"z[Öt¿Äøx(ïéb¦Ÿèf½M#y>¨�6ªOï|øÆ¤l·mÓÏt³ˆÞÖÌ·®ÄSÕ›g%e»m£Âþ˜~ ¼Ì"z[³£„aÛ<‚ÓÏt³ˆÞ�Žvó뼃]¼ó:�QJ�?³ˆÞµÑn{“÷:E ûcú€r2‹è}͵fo©Ó¦Ÿ(?³ˆÞ=_|<¶Íc�égÊÏ,¢÷ÅÓÉ{¶¬KÊv[‰GããY„ý1ý @ù˜Eô>}u_ÔFûçfƒe#âðYï{§@û™Eô¾f¿ÇYXÂö£í”nDV™~ \Ì"úCÒ™ú Û�,öÉô3åbÑš]wXÄ:ŸÏ<¦´@>Ì"úƒ¦zÃ�6ÚÁ¸}¡ŽégÊË,¢?Ä·¨mCKë%ì“égÊÃ,¢?ÄZÍ ÛçµN1ž~ÖóŠÛ€ö3‹èa@ÓM¸ãã1�øùöy�þÅ#•L?�444äV¯^í�\lÚ´)ùÕ²ßÀ3‹èÍ¿�Ë'T…º¼î}öÉôó~ ‡'Ov'}×Í›1É]<÷@.¦�0Î œ:Íéÿ„Ä¿wà™Eô�8ø�ö�ËÍ®klÓÏ#)$Î>m¢{èΟ¸†W»ç·ùÐïÓ Û~æn[~ž›:i‚N~åìßCýÍ,¢Ä߸2ZðköFÝ�búy¤3§Os�®Y’þAa8¡ÿy~Ÿ®þ—™nάɯœý{ ¿™Eô�8ø5²“¹ˆuŠ>�~Ÿ~ÖÏ¥çžîžßºoä(D7?ðS7õÄñɯ�ý» ¿™Eô—0 52BØìtu£âég�2ÆmúÅÚµkÝ£w/³ÿ¸9znó�nډǹ]»v%¿zöï#€þeÑ_š!,j�"ÓÏû)(îyüvó;�'�ZÔbÑ_t[œ0 �6BXÔ:E ûíçégEë�:P‚"€ZÌ"úK¼¡¥‘¯æ Ûçèâií~�~&(¢�Šj1‹è/ñ”o#SÉÍŽB6Šéç}Šh'‚"€ZÌ"ú‹FÃpÖÈTr³·ÕiFØo¿N?ÑNEµ˜EôŸfÃY‘ëÕWØw?N?ÑNEµ˜EôŸøÖ4ñqKØ>Ï‘?¦Ÿ Šh/‚"€ZÌ"úO– -q¸Ìk�¢„ýöãô3AíDPP‹YDÿÉroÄ"×)öûô3AíDPP‹YDÿɲæ0>'Ï)â~Ÿ~Î÷lºÍ]ûãÙî×É{goÄšë/v?¿}‘y¬UƒKæ¥Ï/´eÝ5f[´A@-fý) fšVŽ�[Âsòž".²ï²Ë]sUò/úEnåòóÍã�øè‡ßëŽ9ò³æ±V½þu¸ßðZ÷±�¼?õÞƒßêŽÿÖ— ‹%@PP‹YD ×6ÌŠ\§ØÏÓÏEE?âÒ¢?®‘Äw½ýMîûþÊñptRmÃsÕ_ØoØWØÞ?VP<}Ê7+�~ûeîå/{‰›1õÛécFµ×5ý5ôš|{_�Núºø‘Ðð9ZÏGmÄ·ñ¯A×ñ5±Feþ% ¸ás–xTÖ¿¶Px<m _w|<~í£½o� (¨Å,¢?Åߊ²wÇÆ¤l·õâuŠy†¹xú9Ï[ð”]AQÇ_þÒ—¸Ã}_ÅÁI0ô¡bîôï¥Ç_sÀ«*Ç}à¹ûúî3ÿP¥þŽ·ü¥›ÖäôØÖ¯uzßAi_><©O=V[=–8(ŠF0E?/:ï”ôù/8{Jå:W\xZzìºEsÒkúú{Þõ–ô9…ý|âï>àÆ~ås•6ák Ûœxì‘•6zîjó•/~²R{ϻޚ†×_?|SåÜÁ¥ç¦çû6z½?:}BzLíÔ^5üð¿?´rmÿþ·ÇT×{ìû×ëÐëñÇÔnÂ·Ž¨ºvx\?«æ�×{ßEPP‹YDʲ9¥ÈuŠöÝOÓÏEE…¢IßýJUM�% % CñÔ³Í!ï}g$}MAåÿà÷+ÁP}kZY�Hí¼¸|{‰ƒ¢ÎU˜S¸Ócxâç¨×¥ç†£3OúVz®ÔóV›p$OÏç›_Ý×wØ&ìGÔF!Ô?Vjwùû–^Ï«_õ²ªç¥×ëß4�¯š?®°æ¯}ãsÓ÷*<®sýsÕ{«ðê�…Ÿ“¿vøÞëgÕ|Ьõ¾5ƒ  ³ˆþ‡>턎ÛXÂsòs žaÿý2ý\ÔE… �ÎyaS€òÇ­ ¸üÒ™i0 ÏÕü¨¢hK#’]SH‹§_ ýù • “¾�<á9¢ «ç^[×UÛ_¬¼,mc=ï³N;.}Žþ±ÕFASm–,8£ª~Ü?}1ÔÏzý záñ�«^KøüôØ_ûÚäqøþùpíi„П‡ØZ×VMÇôs­÷­Eµ˜Eô¯0”5:Õ›åfÝ�ê×é碦žâÎü¥FÎF ŠT0ñç„â)N�¯çO1‹ßÌž†ÉZ�G}êy†çÅç[Ï;îÏjSë=Óó×ó�¶èüpZ<¤ã!ô�ÕÖ‡B?"¨BÓ{㥟V¯umÕü{LPP$³ˆþ¥AÊ,r�¢„}÷ËôsAQ#s \a8SpR€ò�­0uþ̉i€ñÓ¼µèú]SÕÈ¡B^n,µÏ—>ûÑÊè^-ÖóÖ¨£F8ëµQˆSÖôpXŸ:áëéHŸ~ŽG&cº†_¯8ÃAO¡[Ç:õ>ªæßû°�¨¦cú™  HfýkÃâ±U¡¯‘]Ìñ¨_£SÖ�êÇéç"‚¢6£üŸøD层_<õ¬6q(ûùm‹Ò`ó“óO­ªo¼{‰Û²nߺ»_?r“ûê—>•†+µãë_ãfLýNUû¬Añ’sNJƒÑúÿ?ÍìÝsª5ŠaT]Ïç«_üT¥fEùÐûJGùüc½½/'ÿèô±vëõ‡×Wÿþ±®¡öþ½ðn[¶o9|Ÿ<½а�wqpu=ýìßûðÚúY5Óc‚"€"™Eô¯xtPëã6–ðœ¼Gýúqú¹• ¨€¶â²³ª(¨ÌŸnœð5¿xêYmb|…&Õ¿ò…Oº·½ùõ•º(ˆ)D©�®©pèÃËåž–†µó}g ŠõÓsT ¯¯šß WØÒÈ\x+™ZAQÏUÏÝŸ«×â¯o£×¯öï7 è~�¡?.  :~Þ̉#Ž…Ï-~_¿õµÏ¥×«umý'((’YDÿʺ¡¥ÈuŠöÝÓÏY‚¢TJ0|M?+†;n%ŽÛ„ôÃö1M/|ÞzìC¯†DQ{½Þ°æéy…ç†¯Û ß; û÷ïAÈ¿VëXxnü¾ê:þ˜^;>>ÚûÖ‚"€ZÌ"ú—î�†²FGïâéá=[Ö%e»mý6ýœ%(ö3%k´�!(¨Å,¢¿…�¬ÑÑ»¢×)öÛô3A±9ÅÖÔbÑß²N#‡çäÂþ{}ú™ ØœÇéΩ1­ŒÑÔbÑßâ -�N#+¼äúiú™ ˆv"(¨Å,¢¿iÚ8 d�|•Ÿ½N±Ÿ¦Ÿ Šh'‚"€ZÌ"ú[¼ó¹Ñ@–5`6#ì_â㽂 ˆv"(¨Å,akf9<¯ˆ¿~™~&(¢�Šj1‹@Ö -E¯SÌ:ÚÙmŠh'‚"€ZÌ"°qù„ª@¦û+Æm,YÏkFØ¿ÄÇ{AíDPP‹Y²®7lÇ:Å~˜~rÿ¾u•ùGÈA@-fˆ§xuËœ¸�¥SÃý2ý¼}hß÷,Eú·-«ÜÀ)S’_9û÷@3‹€„aLSÊññZÂóŠX§(áZHyn÷¶¤l·íVwߺÔüÃägµ[7¸È­¸îšäWÎþ=ÐßÌ" Y7¦Äë‹qñôsSÜ�ö¯;·»§~~ƒ{æ±ÛŒ?ð@vϯvÿ¶å.÷ø}W»+^”üºÙ¿ƒ`Éøâov)"ÄõËô³<¸æF÷øÚëÜ£w_Ý—6Þ½Üí~ôVç’€“§_­¿>éùˆëõƒ‡¶Ì­]¹ÔýìÎä}5~çÀ3‹€Ä�¯ÑM#í qý0ý ÷¢+V¸Ù§~ÏËjï+Ýô©ã�6 Å×ìg‰Ÿv4Çmj Ï+j�b?L?cŸ©“&¸��ä·¹gÕµ¹Ù3§']Û×ìc/ bÍŒ nX<¶*Ä1ÚÙf6Ü »,]r¥[²à 3ôe1oæd788˜tm_°�Y¼0ˆ532ØŽuŠÂôsÐñôiùŒ*>tçåÜ7d/Œ�×Ò®uŠL?÷�93ÏH§Œ­ð׌EçŸæ.[´0éÒ¾`?³xñÈàž-ë’²Ý6žWÔ:E¦Ÿû‡¦Š&Ç �J7±L›À&h�Y¼V¾’ohᘪs‹šfú¹hS‹¦Ž­؈[—ÌsóæÎIº²ûT3‹€×Êr»Ö)2ýÜ?ZÝÔ2ûÔãÙÄM0‹@( aÍL!Ç!S�.n“‡ø:ZW·AoØ´i“›v±™6µh$ràäÉlb€&˜E O!ÇÇë Ï+j�¢´kš�7gö¬L›ZØÄÍ3‹@HÓÍaÛ»ccR¶ÛÆÚàÚ5Í�Î[»v­˜2Î ƒµhR·ÄшdÜ 6³„ZÙÐ’õk›ÅôsѦ–ûo¾Ô …mb9÷‡g%§Úýlfµ²Ö°]ë…éçþ±téRwñܘ¡0¦[âÌ8‘M,��Ybakv´.<·ÈuŠL?÷mHitSKº‰å”)Éiv_€ÚÌ" ïUØlØke3L3t3ðð:ºnܽC›Z¹UŽFu[�ø|ÀèÌ"Ó7ž„!¬™iÝV¾Ý¥YL?÷mjÑ·¬XáÐÛúàµlb€˜E ÖÊ´®6°„çjsLÜ&/L?÷M)×ÛÔ¢M, æ_˜4µÏÔg�X¼)¥Ù°ž[äŽd¦Ÿ‹¡Ï»¨ë­¸ê’ÙîG§Û£ŠÚÄrêģݪ›˜v€¬Ì"` X3_å'íZ§(L?C_ï§Fm;ùžîÙºÞ=ýÀb·ýÁ«ÜS÷üÄM7ÆÜÔ¢‘ƩǙ¶QÛ¿øiò¼‡“.ì~#™EÀ†¯f7´ÄßÇ\ä:E¦Ÿ‹¡p¾¯Z·ÚÎQÆ}ñŠ4ô…fNù†¹©eþœInÙü“G´:±ûÉ{’.íëö3‹€Å�(yÍŒ*µs�"ÓÏʼn— xEŽ2þn÷V÷«û~<"ðyƒWÌt§|ÿ¨ª�¨M,iüÅ­óÍsdëê ’îíkö1‹€%©kvT0<·Ù©ëf1ý\œø+C:–çhñ³Û7$!tžôB'Uµ©eÉŧ»‹fŒ7Û†žZyvrûÚ‚"š )Ü04;¥Ûʽ›Åôs±âÑ嘎çñž¯©="(i|â–éî¼ãÞïfLþFµ‰eڸϻkÎø„ÛtÃ4ó¼ÐðÝ—$—²¯ýÎ,–xJ·ÙQÁv®SÜ»ccյЦý&^¯X�B»>�¸�Ñüúáf°ó˜w¨»wöÁnÕ™¹q_ø›tS˪k/r'qPZÓ±/üø¨£’»»#¹¤ý< Ÿ™E –04¾´.1<¿èQ¾xúYÁTùˆG˜GÓìæ¿³Ù¢‘ÂûÏù@½ÙG½9ÝÔrÖÔ£ÝùcßXuLmë…E]+¾>€ ˆ&µz››ðÜ¢×)ÆÓÏ(�Ñ6¿hW²èDÓÍqH”+'¾ÅÿµÃÜø1rƒ§½sÄq�>ZýyÚ4?èwf¨¥Õéãv®SŒ§ŸQ>ú? Ö´ôÎ ·˜aN6ß>gDô&~ñ­îô#4�I½ÝÓºýNü< ß™E –V§�ãïŒÎ²v­ñ(ÊAÿ'A¿ µ>ÿÑF­(šrÖÈ¢uL£�VÞÞ�&—ù\ Ÿ™E –ø>zÍN·{�¢ÖÄé9"qèo„¢~Fû?:n…9OT¬0XÏ#Wcö%Z£È·¶ÀHf¨'üÃßìͬ[ š(}vágY�Be³ÿ§ Þf�*6ëM;ëÛZâëŠÈ Õu†a€(z�"ŠÑÈŽg}¶ZÓšuyA½égoã5+·È±¬_ð™´MÝ�˜RÖ'€Í,õ´ºÎ0>¿ÞîW”�60…ÿg!–eô°–§î˜;"ØYtOEÝ2ç—ËŽM)êv8õ¢èø®GoK.e_ú�Yêiõ[OøÖ”îfmRpT@Ì:zXÏðš‹«Â]^4’¸ã¡ë’KØ×‘A¼ÎP›â6õ°N±{Åëõù=*¼}ýÕi°³_êKSÛñuÕÌ"0š0,d záù¬SìáºD�*ðÇmЦû+¶Y�Í1‹ÀhÂ5jY‚Þ†Åc+ç ëËMëýèaÓËÍÒhàÓë»­kæ›�ÐS0Üvï´mž7t³Œ¦Õ Ç:ÅîÒ‰ÑÃfì~ò^÷›ÇפSôßg¶<èžÝ¾!9d·4Æ,£‰ƒ^³A‚uŠ”ŸYF£o< ƒ^³Z$<ŸuŠ”�YF£õ^aÐË2"ßf…uŠ”‹Y†¼,#‚ñôµF)ã6 sÌ"ЈxD0>>šx�¢¾î-n:Ç,�ˆGu •¸ÍhÂóY§@¹˜E ÚÀ½,·¸iuTÇ,�Èã7¬S ¼Ì"Ш0äe™:ŽÃf–Ûì€b˜E QyL‡ç³N€ò0‹@£6.ŸP³|Ÿ.ë('³4*�ïlÖmqÂ>²ìžù3‹@£â5† Žq›Ñäñu€ fhFò²ì|–<úù2‹@3´Ň¼¬›QòèäË,͈7´<·{[R¶ÛÖÂ:EÊÇ,ÍÈã¦ÙÚö‘eS È—Yš‘×M³Ã>X§@ç™E šjÎ#ä±N€r1‹@³Â ˜5äåqón�³4kÃâ±U!/>ÞMY‡}°N€Î2‹@³â -Yv-ÇkY§@g™E Yy�²N€ò0‹@³ò Ì㞌 fÈ" xYGY§@y˜E ‹¡…cªB^|¼¬S <Ì"�…B]ò²ÞÞ&ìƒuŠtŽY²ÈkÚ8¾Õëè ³dOoœ•”í¶õÄ·Úa�"�a�¬Â€§ÌññF°N€r0‹@VyÝ1 ЬS 3Ì"�U^÷AŒwP³N€ö3‹@Vy­/d�"�g�¬âõ…Ú ·iD^c@vfhEðZÙˆöÃ:EÚÏ,­È+à±N€Î2‹@+òºav¼NqçÃ7&e»-ÈŸYZ¼=[Ö%e»m=¬S ³Ì"Ð íP^+;–Ã~:½NqhhÈ­^½Ú hÁ¦M›’Rö¿3åb�VäùÍ*ñ:Åøx;(œ<Ù œô]7oÆ$wñÜhÁ´ƹ�S§9ýŸ¯øß€r1‹@«Âp×ÊH`§×)*$Î<åx·þöEî…_ý̽° @K’Gϯv·-=×M�4Á 'ÿÔì:Ï,­Êk$PÁ0ì'ë}³:ã´©nÃê+í?xZ²üÒ™nάÉ?5û߀Î3‹@«´ñ$ xY7´HØO;×)j¤cþÜSÜóÃö9­yríÕnê‰ã“nö¿A�g�Viä/ x­lhéÔ:ŵk׺ ?[jþ�кç6ßé¦�xœÛµkWòOÎþw ³Ì"Ъ<7´ä9:Ù Åg»Íü u­'(åf�<„áN7áŽ�7ªSë­?nòCPÊÍ,yÐzBîZ][ÅVF'›APŠGPÊÍ,yظ|B%ÜI+ßÕœgèlA(A(7³ä!¾b+Z:±N‘ � ”›Yòohiemaž»¨EPŠGPÊÍ,y Ã]«k óì«E xE ÜÌ"�—<×¶{�"A(A(7³äE·ÅñáNZÙÐoŽÙ»ccR¶Ûæ� � ”›YòohieJ»×)f Š;†ntk®_0ÂoŸ\9¢mìÞx«ù|U·Úw«‡ïºbÄkÜúàµf[´A(7³ä%Ï›eçùm/�È�wJò¯êEî¯ßùæŠW¾ü�Ý’g˜í;måòóÓçûö¿zCåùþÙŸ¾Ò]0ó„Ò†Û,>úá÷¦Ÿƒ�z½ßúÚá„Å (åf�¼hz8ÏpöUô:ÅV‚bXûÁñG¥µx”nӽ˪F¸âã jáñuƒ SõÚhäÌSRM£œq{][�}P|tÍU•6—Ì=)­Å×òýya¿~d2QU=®Å4~ þ¹‰¿fØ^Ô&|­õÞQP<æÈÏVo^ûÓ48Žû¥ô±þþ¿>½¾.¾.zŽ:¿?aÿ|Ã6þóŽßŸð}õâ¾Ãç&á±Ñ~GÄ_[ÔWx,~ïô8<ó}‡ï[|þhŠ@¹™E Oy†»ùawä>YÕG­÷Aâ (zìßOÿü/ýáÔJþ=Z7øãô½÷u½§ªù~NŸòͤöŠô¿¾Í{ñq�¬Z\i£k½ïÝo«jsÿÍ—¦¯Kï£ÞOÕüû¾^½Žo}ýðÊy¢ßüîT½½í�U׎ß_ý|Ý¢³Òcú\õ~ûcò?Þÿ®Ê¹êGï�?¦×®ëùãú½Ñû¦ÏÙ·ÑH­?Þ‚"PnfÈÓÐÂ1Uá.>ÞŒk=Öµõ:Ã6¢×¥ç®÷S�õ_=_¯ž§B°,þwGŸ©ÞŸðý›6áë•k‹^×òKgVŽ«­'ÿè4Xúcòé�}0ý¯ÎU?ágªóôZ}�õA1~~Í (åf�<幡¥�ë[ Šuñ>÷©C«B¡¦ã6¢?Êúí6åwô?TΑ8(ª�\؇FvÔ·(¢ð£¾ã°'> iÔÉ÷¡PãÂ(ÅmDÆ�lY�Ó Íª)dùÇ“¾û÷÷=¤ªÍêëæ§çù 6éØ#«B—B”Fø|ûFÞE=ßð¸FÖ|À²ž¿h4T×ûµ½ùʦmâÏEükÐh²ë=ÕsÛˆúž}ò±U5=V]?û÷^ý…m<½áë}NþÚ ž vþ³ GYEÁ=Äz Îz_ô³ŠzÿÂ6Í (åf�<å½[9ì«ÈuŠ­E? §Q$…˜zmB~ôMÁC$? ?³øufAPÊÍ,yÊ{0Ï{3Ö“ÇÔ³‚”BN¸¦MÓ€jãGÌ,µñ£‹^H4e¨¥°�ůKý‹ƒˆ‚ª…ƒo£À¡6ñ&‰�h¬ ×4Ú®·¿¦3œJÖ¢ÖHú©ê07ò>X�4T+�iÄÍ�îÕbÅø5Ô Šz-—œS=­Çªëçxd2¦÷O#ªÖ±˜~ õ{¿_zž:¦ÿ3 ëéwÓÿž†ÿ§A´t@ï‹~&(½Ï,y ƒ]«£€íZ§˜×E�èhºÕo0PÈQÐôgØNë¾üHÏ—’?þñÈžF&Ã@â§dý9^J5Õ¨sE?‡Ó�V@²Â­Â…6Y„ÏGaÂ÷•5(jdP¯!ܼ¡ %ºžìÛé=Ô{ ÷&<ÖÈû�5(jÄMõpsˆèuû oÅø5Ô Šz-zMþ}ÕÃרßõ£þÂóüóñïK<¥¬ãê+üŒ<s?ÝïÛùc>à* úßÓpó‘Þc]Ï�¦�Þg�¼…ZZ ŠíZ§˜WP”·¾é/Ò0ã7«|ó«‡'à%écï´�©L©êñÉäeÿ<£r\�Ã@¢Q õûí¯¾ª¿9áñû–¥#N‡º? |ä�w§5ÓãZéÓ‡’ÞOQýýöÉ;ÜôIÇŒx>Ξ”†´Zý4FôôÚÃç¯ë…çùТs}HñF{$kP”ƒßþ¦t-ì[£x~´PAÑ¿W^üjE½–?ÍŸVÞWýW�Ãר~Ô_Ø¿zz_ôüô™†Çu-ÓsŒ�é\ÿÜt,þLõ^ê\×ï©úòÇõëzþ¹�Þg�¼åýõ{a_E­SÌõ>üCêù?èá1ý±ö5Ïÿ�–çœTuL�DSÒþ¸„ýz>øþÃ>Â6þqØÆóýùcñó–¬~¬÷ªůÁ?·˜BK|®÷÷£skõ+õÞQpûÖcLŸ‹F`ÃãñµôXÏ!¬yþ=ñÂ�èéü°MÜxLÂkÅÇÂs­Ï4~üûî…Çüûî² (åf�¼å=]ßr§ˆuŠY‚b^4Š·auõt§Fs¾ôÙÆÖ£¡}¬©g4Ž ”›YòO·òU~O}U`ܦU� ŠšÒóSÕ^<%‰r (¶† ”›YŠ»VׯÁsóତl·Íª“AÑšJ%$–“¦oéh4‡ ”›YŠ µ„>Øå±®0 ŠE¬SìdPúA(7³!ïïi.z�"A(A(7³!^W¨éã¸M3Š^§HPŠGPÊÍ,EÈ{CKÑë Š@ñŠ@¹™E šƒ]7ÊûË{�"A(A(7³%ï`¯SŒ�·‚ � ”›YвañØ\ƒ]¼NqÏ–uIÙnÛ¬¡¡!÷üÖUæ7ù (åf�¢äì´�%ì¯Õu�±]n1ÿ¸hÝ¿'ÿGlà”)É?5û߀Î3‹@QäÂ`×êWùIØ_ëC÷­\fþ�ЪÕný—»×]“üS³ÿýè<³%Þ©œG°+r�âovnw;¹Åýö‰;Œ?tš6¼Úýß­w¹mëW¸+ÍOþ™Ùÿö”ƒYІº<6´è¶8aŸy®Sôºç&·mèf·eýõh³­?¿Þ=ûøíî…_%!#G;y‹Û’ôm]Åybíµî¡Ÿ]íÖÜukòOËþ÷ <Ì"P¤¼G‹^§ˆÎZ±b…›}ê÷ìÑ©Œö>±ÒMŸ:ÞiÃR|=À~f(RüU~{wlLÊvÛF…ýå½N�7uÒ·ó‘›ÌЗŪk/r³gNOº¶¯ØÇ,E*bC‹¦°}yßx�·tÉ•nÉ‚3ÌЗż™“Ýàà`Òµ}=À>f(R_½WÄ(%ÊCSÄÓ§å3ªøÐ�—sï>h�YІ:…¼øx³Š¥D¹Ì™yF:el…¿f,:ÿ4wÙ¢…I—öuû™E hyOk1 ЬSì=š*˜ü3ü5*ÝÄ2m›X Af(ZmjÑÔ±që’ynÞÜ9IWvÿ€jf(ZüU~ºÅMܦYE„O”K«›ZfŸz<›X  f(Z¼¡%�{²N±÷mÚ´ÉM;áØL›Z49pòd6±@Ì"Ða¨ËcMa_ˆò™3{V¦M-lb€æ™E ÂP—ךÂ"úD¹¬]»Ö Lg†ÁZ4©[âhD2îP›YÚaÃⱕP'ññ,X§Ø´©åþ›/5C¡E›XÎýáYÉ©v›YÚ!Þвg˺¤l·mTÜ'ë{ÓÒ¥KÝÅs`†Â˜n‰3gàD6±@fh‡"6Ÿ°N±?hCJ£›ZÒM,§LIN³ûÔf�v(*Ô…}²N±wiSK#·ÊÑÈ£n«Ÿ�YÚ¥ˆP¯}d�boÒ¦}ËŠ½­^Ë&h�YÚehᘪPÏ‚uŠýCSÊõ6µhË‚ù&Míóõ™E ]6Ϊ uúÎæ¸M³â)m]#nƒæh=ißž“·«.™í~tº=ª¨M,§N<Ú­º‰igÈÊ,íRÔ·©„}²N1~J_#¶�œÎß³u½{ú�ÅÉïÊUî©{~â&�cnjÑHãÔãŽLÛ¨íŽ_ü4yÞÃIv¿€‘Ì"Ð.Emh‰§´Y§Ø:½‡á{ª{V¶s”q_@¼" }¡™S¾anj™?g’[6ÿäíŸNì~òž¤Kû:€ýÌ"ÐNaøÐ¨U|<‹x�b§M»Qì½"G·{«ûÕ}?ø¼Á+fºS¾TUHÔ&�4þâÖùæ9²uõI÷ö5û˜E �45ìG^ÓĬS,ŽF}Ã÷6¤cyÜ8Ý{vû†$„Î3ƒ^hà„£ª6µ,¹øtwÑŒñfÛÐS+ÏN.c_@PD õµ{aŸ¬SÌW| ¢˜Žç±ÞtxMíAÑHã·Lwç÷~7cò7Ò�¨M,ÓÆ}Þ]sÆ'ܦ¦™ç…†ï¾$¹”}}èwfh§¢ngSÄ­w°O¼^±}¾Yv³ÿúá#B]Hñ�y‡º{gìV�y�÷…¿I7µ¬ºö"wÂ¥5{ðÂ��:*¹ë±;’KÚÏú™YÚ)ž&ÖNè¸MVUÀA>ô~†ïïhšÝüâw6[4Rxÿ9Hƒ 7û¨7§›ZΚz´;쫎©m½°¨kÅ×Qa Èkçs­�è¼Ñ6¿hW²èDÓÍqH”+'¾ÅÿµÃÜø1rƒ§½sÄq�>ZýyÚ4?èwfh·"6´HNP>ú?Ö´ôÎ ·˜aN6ß>gDô&~ñ­îô#4�I½ÝÓºýNü< ß™E ÝŠú~æx�"ÊAÿg@SѵÖ.Ž6¢h…@Ñ”³F­c…´úóöîx4¹ôÈçýÌ,í¯'Ìë+ZG§Q+ä/Þ­ÞD­Ams‹Ž[aÎÓ+ Öóȕǘ}‰Ö(ò­-0’YÚM›Â@‘×ÎgGa1üÌêQ¨lö3­·™E£ŠÍ„E…ÄzÓÎú¶–øú‚"JB#ˆa°P‰Û <Ùñ¬ÑCÝè<Ë­q¤Þô³·ñš‰•[äXÖ/øLÚ¦nHL)ëÀf�NˆCF|å P¯Ï'ü¼BYFkyꎹ#‚�E÷TÔ-s~¹ìؔ¡n‡S/ ŠŽïzô¶äRöõ ß™E ¸Avw°6�¶9¥Ãk.6C^«4’¸ã¡ë’KØ×Q"EmhA~âu‰ �Úœ’×.õZ¶¯¿: vVàËB}ij;¾ šY:A�# !lh)—p]¢FuCó¸MÑtÅV#ë 9fè„ø›TØÐRÝõ£‡EL/7K£�O¯[ì¶®™oBOÁpÛ½ Ó¶exÞÐmÌ"Ð)aPT0‰�£3:1zØŒÝOÞë~óøštcŠþûÌ–ݳÛ7$‡ìö€Æ˜E SÂÝ´ì| ³Ì"Ð)ñ·}0]@ç˜E Sâ�Ïlh sÌ"Ð)ñ†mžˆÛ€ö0‹@'…A‘�ÏtŽY:‰ -”ƒY:iÃⱕ (Eë°™E “â -e¿‡½Ê,�ĆÊÁ,�¤{'†A‘ -t†Y:- Šlh 3Ì"Ðiúžç0,ÆÇ@ñÌ"Ðiñ†–=[Ö%e»-(†Y:MX ÈWùÐ~fè´xç3Zh?³”AÙÐ@û™E  ØÐ@g™E  6.ŸPuŸ (ŽYÊ Þù̆ÚË,eohQpŒÛ€â˜E , ¨©èø8(ŽYÊB»�}Pdç3íe�²ˆ7´<·{[R¶Û€|™E ,â -;¾1)Ûm@¾Ì"Pñ†}µ_ÜÃ,e¡©æ0(òU~´�YÊ$ Šlh }Ì"P&�­UŒ�€b˜E Lâ -{¶¬KÊv[�³”‰6°„A‘¯ò =Ì"P&ñÎg6´Ðf(›0(²¡€ö0‹@Ù -S5ªù3‹@Ùhº9 Š{wlLÊv[�³” Zh?³”M¼¡eóତl·ù0‹@…AQ7áŽ�€|™E Œ´ÛÙEv>P<³”ÑÆå*AQžÛ½-)Ûm@ëÌ"PFñWù±¡¥yCCCnõêÕnpp]jÓ¦MÉGi¾�7³”Q¼¡E;¡ã6°)œ<Ù œô]7oÆ$wñÜ KM;aœ8ušSè�?gÈ›YÊ* Š|•_cÏbûs€<˜E ¬Â È†–Æœ~ÚIî¡;/w/ Û¡Ýfub�[öÏ3ÜœY3’�ØþÜ f(+Ý' ‹lh©O#NçÍžæžV¸°BºÕã÷-wSOŸ|Ìögy0‹@YÅZölY—”í¶p/Z»v­Z}•4ÐÝ~·ù7íÄãÜ®]»’�Úþü Uf(+ítƒ";ŸëSPÜýØ 4ÐÝ4JLPP4³”•FàȆ–ú­��Þ@PP4³”YÙÐRA±·Í,e6´pLÕ¨b|û{A@ÑÌ"Pf›gUE6´ÔFPìmEE3‹@™éY Ȇ–Úн�  hf(³ø«üØÐRA±·Í,eE­YŒ�c‚bo#((šYÊN»�}PdçsmÅÞFPP4³”ÝÆå*AQöîØ˜”í¶ý,kP|æ±A÷Ø=KGø·§î2Ûgµ÷‰•i¿ú¯«ÿð±·}è·yíÕUµVìúåÍfáõýÏõ¨�§¾ô8~Þâۆdž~]úšÂvYÍ,e•ZlY‚¢ÂÏÙ§�w¼ú•îuÿýÕü’»uƒ?6ÏÉjÍõ Ò¾õ_=~tÍUÉÿ*½È­\~~U»ÉßýŠûàûªªµâô)ßt¯Ý#êáõ¿oÙˆ×ÿÿ㨪�{æ÷ÓóÔ—Î[qÙYUý)p«¿¦�~ø½î˜#?[Õ6 ‚"€¢™E ìâ -Ú ·A¶ 8) e/þ¯˜¥°®P䃑hDÌ�–Y£fáè\ØFáÉj£Ç·-;7 UW\8�Öý¨_8Xk¤/!ô£|^x¬‘ «uލ® yÄçKŸŸ¯Ï;ãøô½$(èVfèaPdç³-KP<ð ¯uGñióXHAçU¯x©{íŸýIê%ôbwÅE•ã>t©æÛ¼ü¥/qç Œ¯„©8˜ð'¯Hû~?øÞw¦õ0¤)ÀúþÄŸóŽ·üez\6?ðÓô±o£ç¦š?^DPœ9í;i(¼ÿæKÓÚo“ð«ú÷Æþãˆ> Šº…YºZF—%(~þÓ›NónºwYE8JæM:öÈÊ”±(*) é±] }¾ÍòKg¤µGV-®jãCT­ V/¤­ºæB÷¿ÿ{nޙǧ�Ÿyì¶4ìúÇ¢ŸýsSz¾F¹}ùyæõý9õ‚â¢óNIC¡Uüé¿Ìr¿ãMi_qŸEÝÂ,Ý`Ãⱕ (ÏíÞ–”í¶ý*KPTøó#q ` 9 P R aaÛmëWÔ YµBŸjƒKæ™mš Š;¾1}ž_>üc•Ú‚³§Œº^Wýi½¡�ž�Œ¯ïÏ-(ê½Ó{v÷ ÜGywŒÕWÜ'A@·0‹@7ˆ7´hÝbܦße Š!0¢ÒQ»3ö�Ò)|)ðÔ Yõ‚¢B•Õ¦™ ¨ÐªÑ»pÄRÀô\ýó )¸©M­ÐWëúÒHPÔÏ~DÖO…«¯¸O‚"€na�n°óá«‚"ZFÊ5JgÕ?ñw¨%Má*ü|ñ3ÿ³r¼ÑЧZ«AQS»šêÖÚÃpú[ŽýÆFÝ!]dPÔóÑh¥ŸúV_qŸEÝÂ,Ý@÷N ƒ"ZFÊ¿|øaîñû–WÕ~ûäÊ´þ®·˜>¾ëš Óðã×ÊÚ[.­ DY‚¢6ªèñM‹XuNÒV]{‘ûý`]bhÙ?ï[ù«õ+ªê¿N°^‡~.2(Ê!ïyGågõ÷IPÐ-Ì"Ð- Ȇ–‘²Å×ðªtDLaÑ[|ÑôtŠW!Lmè^öÒ?Jë¾Í·¿vxU ÊEýNüΘ´Ï§Ö]“ÖÂ�¦°§iä½ï Êµ=߇^ÃGùëªc_ùÂ'ÝšûF‹Š!õ÷© èy(·£!((šYº…¾ç9 ‹ññ~—u�¢FĶB>dy �áq�î…í&­óT gÜ&ì×�Ì©oÿ³Úúã1߇į!å û ÕzÎRëQÝ¿¦˜¾aŸGþ±ªç橞;‚"€¢™E [ÄZölY—”í¶ý¨ÕÍ,(7‚"€¢™E [hKù*¿jÅÞFPP4³t‹ø«üØÐR� ØÛŠŠf�nE6´T#(ö6‚"€¢™E ›°¡¥6‚bo#((šYºÉÆåª‚¢î¯·éWÅÞFPP4³t“xç3Zö#(ö6‚"€¢™E ›ÄZã6ýŠ ØÛŠŠf�nEv>ïGPìmEE3‹@·ÑngÙù¼ßÐÐ�{~Øè~EE3‹@·‰7´<·{[R¶Ûö›ÝÍ��îöüðj7pÊ”ä#¶?wȃYºM¼¡eçÃ7&e»m¿Yw×ÕfÐ@7[ã^}¥[qÝ5ÉGlî�³t›xC‹¾Ú/nÓ¯~³k»{fÓJ÷ÜSw�Ýæß‡W¹��Üì–üdAòñÚŸ9äÅ,ÝFSÍaPdCËH¿\{‹ÛýØíî_7v—G“�{§šZñìÉ{‘ôm^³¤ž~è&÷Ë{¯swßukò‘ÚŸ3äÉ,Ý( Šlhé+V¬p³Oýžö²ÚûÄJ7}êx§Í>ñõû™E mX<¶jT1>Žî5uÒ·ó‘›ÌЗŪk/r³gNOº¶¯ØÇ,Ý(Þвg˺¤l·EwYºäJ·dÁfèËbÞÌÉnpp0éÚ¾`³t#m` ƒ"_å×;4E<}Z>£ŠÝy9÷€™E Å;ŸÙÐÒ[æÌ<#�2¶Â_3�š»lѤKû:€ýÌ"Э Ȇ–Þ¢©â�Éß1Ã_£ÒM,Ó&°‰d�n5´pLÕ¨b|ÝM›Z4ul…ÀFܺdž›7wNÒ•Ý? šYº•¦›Ã ¸wÇÆ¤l·E÷iuSËìS�g 4Á,ÝŠ -½mÓ¦MnÚ ÇfÚÔ¢‘È�“'³‰š`�nohÙ<8+)ÛmÑ�æÌž•iS ›X yfèfaPÔM¸ããènk×®uSÆ™a°�@ê–8‘ŒûÔf�n¦ÝÎ>(²ó¹7iSËý7_j†B‹6±œûó’Síþ6³t³�Ë'T‚¢<·{[R¶Û¢;-]ºÔ]<÷f(Œé–8sNd d`�n•Zz�6¤4º©%ÝÄrÊ”ä4»/@mfèfñ†턎۠ûiSK#·ÊÑÈ£n«Ÿ�Yº]ù*¿Þ¤M-ú–+z[¼–M,гt»0(²¡¥wiJ¹Þ¦mbY0ÿ¤©}> >³t;Ý' ‹lhi�¦ïw>|cò£}¼S®ºd¶ûÑéö¨¢6±œ:ñh·ê&¦� +³t»xCËž-ë’²Ý�ñá[ïm'ƒ÷ž­ëÝÓ,vÛ¼Ê=uÏOܤqcÌM-iœzÜ‘iµÝñ‹Ÿ&Ï{8éÂî0’Yº�v:‡A‘�Ï­S8 ßS݆¨�£Œûâiè Íœò sSËü9“ܲù'�hÿtb÷“÷$]Ú×ìg�nï|fCK>â÷Õ+r”ñw»·º_Ý÷ã�ϼb¦;åûGU…DmbÑHã/n�ož#[W_�to_°�YzAdØÐ’…îð½ éXžÓüÏnß�„ÐyfÐ œpTÕ¦–%Ÿî.š1ÞlzjåÙÉeìkŠèaC ÇT…˜ø8²‹7 Åt<�éþá5µGE#�OÜ2Ý�wÜûÝŒÉßHC¢6±L÷ywÍŸp›n˜fž¾û’äRöõ ß™E lœU^ØÐ’Ÿx½b=š–Þ»ccršÝW-¿~x…ì<Äæêî�}°[uæAnÜþ&ÝÔ²êÚ‹Ü G”ÖtìÁ ?>ê¨ä®ÇîH.i?ègf躥KXôXùˆ7 �¦ÙÍ/~g³E#…÷Ÿó�4z³�zsº©å¬©G»óǾ±ê˜ÚÖ ‹ºV|}A=¬ÖÆ tÞh›_´+Ù t¢éæ8$Ê•ßâŽÿÚanü˜¹ÁÓÞ9â¸F­þlfjÑý(ë­ýÌ2zXËSwÌì,º§¢n™óËeǦu;œzQt|×£·%—²¯ýÎ,@-ñ7ÞÈh›SZ1¼æb3äµJ#‰;º.¹„}]A@âu‰ �þFæqÛýt¿xUf¾óôe¦¿ÝŸ™é>“·„@æÜ"È‹[yq‹ /näÅ-€¼¸E�·òâ@^Ü"È‹[yq‹ /näÅ-€¼¸E�·òâ�6›�� S»v…M/ ë'Ö¡b;¶_¦¦¦ÂÜÜ\gsøÛÀ|nh«ééé0ù��áûö„?¾ôtsÏ¡bzÝ{øî°ñâ‹ÂÌÌLg³øÛ À±Ü"ÐFúd¾ñâ Ãë/?ã ªõ‡ßφÉÍ—ñI(È-m´sçÎðëý÷ºá‚Åñ‹}{ƒ¾5I·€ùÜ"ÐF['·„¹#O¹Á‚ÅñÚ‹³Ýóéé¶0Ÿ[ÚHdy¡‚Å¥oNÒm`>·´�^O:PŒ[Úˆ@¯'(Æ-mD ×�ã�6"Ðë‰@Šq‹@èõD ŸE �ôz"Ð�bÜ"ÐFz=è@1nh#½žt ·´Ñ(�þ–Î.´cÛæcj'ÿ©n=®‰76õÁû@W|_ó‹Ç,Äí·ÞÔ]�Ô8—1n:PŒ[Úh”@÷÷mõÖnH*<­fAzàá{Ž;HY�¯‡n«vÞêåÇŒ­ (Æ-m4J +àvßÂQ!d:΂Z4ÞBV÷ízü˜‰ß$Øcu±åé{\·{½±ÐØt}mºxúxšxÞ&~Ü–eô|âÇ‹"Ð�bÜ"ÐF£º¸¤BN�lÿÚ¸ô“¶îkº4$ã@·q^z¿a°@N§õÝ«iúxÝ,¼mŒ7�–¥z¯ÇÓu.Š@Šq‹@�zQ\T 5ÝV�)ÐlŒn[ØI¯ VmP §oL¼ ­CðƂ֓ŽMiŒ…¼þõæo´~ñ4M/:PŒ[ÚhÔ@�CX�e¡j·-Dãi¼ –"�®ûqÇ,DzüÉY4>­{˱ùÛ–´nâÇRñ¸"t ·´Ñ¨�®0SP¥ŸÊˆ J‰CZèéüRú¨nÁ¬iÓéãÇÓº±73½ÆŽ‚@Šq‹@�èäiÐ*Ðt_°ñ4^PK‘@·7q-µ�@·çcáœ>×bZž=Ï^Ïo:PŒ[ÚhÔ@…™/n F/‹ºî{Á¬yÆãDcm9ú¦UÝîëvÞš_\Óý4ÜãÇõo:ñÖi(Æ-m´�@·ÀKƒÛ‚>®IÑ@MoâùÛ¼M–ƒ=•ŽMÇ¥�îÍ' ooŒæ�)‚@Šq‹@-$ÐQ(Æ-mD ×�ã�6"Ðë‰@Šq‹@èõD ŸE �ôz"Ð�bÜ"ÐFz=è@1nh#½žt ·´�^O:PŒ[Úˆ@¯'(Æ-mD ×�ã�6R ¿þò3n¨`ñè@1nh£­““aö7»¡‚Åñä�ÃÔÔTgóøÛ À›Ü"ÐF Ž+¾u¹,¨ÞŸçž W~{sØ¿góøÛ À›Ü"ÐFsssaíšUaÏ�ovÕùÓˇÃn¼:lÚxiÐvI·€ùÜ"ÐV333aýÄaíªÝÿtçÕÛjcú'?pÃo¡¦nø®»¼Å²uó%Ý×ëä–päÈ‘Îfñ·€c¹E Íô‰pß¾}Ýs·º «vìØV|íÌpäén(�jÿ}Óaíê³Ýe.½îzýùd Ç-¨}s0îOéúbÇöí�ÙûË�· ~¦§;Ÿ¦Ï9Ë æQèÓ¾>�ë4Cº,ùq‹êG_A¯8kYØwçmn@k÷-7„M/éÌÚ_€¼¸Eõ´óºëº_“{=¬õëֆݻwwfë/ @^Ü"€zš��í|J_ºà‹ãÞ¸î.<Ä-¨¯õݯ˽ .Š‹á€æq‹êKÒ¥¿Óö‚ºý¼­>ås1Ð,n@}-ôâ¸7.†»´3+þòäÔ›~€eÓŸ�ÝÏÜ‘ƒaýºsƒþ.�'€¼¹Eõ¦ŸDåâ¸7.†[ÅÅp@¹Eõ§‹ãôÛç^p÷¢ßIŸÚµ«3¹?Oùr‹êï�‹ãVºÁí±‹áô§oé¼äÏ-¨?}m¾~b]á‹ãvÿðÆîÿ`–Î@3¸EyÐÿL¶þüÕn€Çt1œþÔmÿþý�ÉüyÈ›[�‡7þ„mðÅqú_Ú¸h6· [''^·uóF~·h8· vqœ¾V÷Â|æ‘{ßøäHg¸?ùs‹êïõW^:ôPxö��aÕéŸé~­îúu;¶„Í_?¥;î•çt&õç on@})È�¸=Þwuxöþk»¾»qYX½bɼ0×§öU_ûJØ{ý†£cßwMwút¾òæÔ�‚üùýSÝ@¶p6OýüªpæÉŸîþ­yèúÝöµK¿Ð}<�Fov 9Ü"€zQ˜?sïüPŽm»hɼ‹ã.�X®ßr¶;ÞÌþüÛ�EøË�· >æ÷lrÃ8v÷�†¥_9þ蟰éwÛWžöùðØÛÜñ±'o›è,Ê_>€<¸EõqØ àØ3w_½ú„pïEï§}üÝG/Ž»ròâpîqï÷]ú�03µÂ�6öü/nê,Î_õçÔËOÜ冯9xÇÆn�ß½î}][¿ô®°jÙÉÝOéK¿ð±pã™ï9ú˜‚]áïÍGtnþµßñ;ï@®Ü"€zè÷é< sÙ{îß„“ÿëŸÂ¦ ëŠÏüÃ1�É PáÑ[;‹õ×@½¹Eõpxßü+ÚÍÃÛ>1/°eâ³Îøâ'Âå'¼Ã}üÀ÷Ïpç'z‘®€<¸Eõà…®yàò»�}Ëò÷†?ò—ÝOëÞã:ßîÍOô§lé:ȃ[Pñ�ǤÌ^`ˆϾݭËã?Zëίë�ë;‹õ×@½¹Eõ €uƒ·CçÂuNÜ í^ÚòѾçÐõÃ5é:ȃ[PºêÜ ^£pîõÕ{jP˜ë*wýÍ{ºòà,¾×_{)¼tðþ0³k¹À1}�®ÀNC\WÁ«®+â½éŒ‚^˽ðÈ;‹ö×@½¹E‹GA®`ýå5_\ö¡®ןâ±Gá¬ï÷i<¦q�ìøôÑeÉÁ=—­GºnêË-¨žô黾ö_ñ¿Ç„«9pãén /Ä3÷lŸæ1ûk/>ÝY=�Ô‡[P¦‚ó¡ÉÿpCUô˜Âþ·3{ÜÿmmXš‡èÿG×ÿ“ÞëM„™ùÁÊðÛ_ï鬮ÿ,>· |:?>(È´ Üôëï—=Ôý3/¬ûQˆëJvy_Ñóìmî4ƒ[êBA®r¿ ××êM¼b}zoE‚�óìÈ™[›‚\á4èü¸¾2%ÈßD ¦×dÐ×ñ ~½–é´@�¹E`±Øß rlÛv~¼½8γ£iÜ"P5�¿äúÔÔÆ ݆A �F}Õ¯÷„óì¨;·T¥è…ny1úÂpž9s‹@™ÌEƒœóãÃ!ÐÇ£èyv½H§‹[Ê`ºõû¤¯= òÑèãÅyväÄ-㤠/z¡Å…!ÐË£Oãñkëiòÿ€ús‹À8¹ÐM�q~||ôò9Ï®o™8ÏŽª¹E`!ä: õ r.t+�^½¶êãøõNqªä�a s¡›Æäå ЫÇyvÔ…[ŠR0ëH¿ ×'u9çËG /…u‘óì;Êâ�Aä �AW¬ë“ A^½8ÏŽÅà�^ôÉ‚+Öë‹@¯γ£JnH¹bÝ~hƒó㋇@¯'γ£ n0E/t#Èë�@¯7…uº�<;FáÑn æa®XO§Çâ!ÐóQä<»~¨†¯ãQ”[D;½Ð�+Öë‹@Ï�¶Ñ 7ÏœgGní¢ /z¡A^oz¾ômWÑóìé´€¸E´C‘ ÝôçÇóA ç� è0*·Xw³³³aj×MaÓ%†‰uk1¤¯¯üjXyâDzÏüsXzÜ?º–þCaÍ’ãÃç�ãÎc;®Ü¦¦¦ÂÜÜ\góùÛ´nrí±Õ§wÌv<÷¬“Üqu•c¯Ä´Þ»wï['·„õëÎsŸã0´žuü¿³MSÚ—µO{Ó£˜�;w†}ûöu6¡¿]sáëlzz:l¹ô¼ðàO¯ xêŽð秆šÓvúÕÏ® —^¸&ÌÌÌt6£¿më‚[<¹õJLa~Í›Ã�?üNxíIú&<¸'Ì>¸+\¸vi7ØÓíš·XWúÔtéĪîð6 êM¹ÉMëkýé‹«‡z%uãuW…¹'nwŸêïõC{Ö g½¡O·m.Üb]éÝÓcw]ïn äá¡Û¯©õC�ÕGÝ{%väÈ‘pïî«Üç�|<÷ÈÃÚU+;›ÔßÎuçëjë7/ ¯<þSwC ¯>y{÷iºmë‚«�º÷JlÿþýáȯnuŸòñ§Ùé°üÌS²½†Ã-Ö•.^ð6òRçóTôX½ärNSTyë�ü¬8ó+A߸¤Û8n±®8Ø6�Ž¢tT�@¯Ûf ÐQ�Žªèá`Û :Š"ÐQ5½"l›�@GQ:ªF W„ƒm3è(Š@GÕôŠp°mEè¨�^¶Í@ £(U#Ð+R‡ƒí[:/ÙöËÎqC1môŸÞpy·�»óZ÷q¼‰@/NÇ%õ•÷Š#Ð+2ÊÁÖš‡xè7.~®â½^º¯»î{ÓE Ï¯ûñk¬ín:ïqÝŽûRÛÛ·åÙ¿6Fãã¾Ð}=ž5Ÿ~Óõª÷zžÞ´E59Ðõº¤¯½GãâmmôÚ¦=o7{ým{ˆîÇóJ�C’ö^¿í�Óm­ƒý«ZÚv?^O£Z¯éŒ='=nµôõÑ}oÚ¢ôŠŒ;Э9lÃÇ�ht?nf�OÇh:Û)z5b<�-7~Ü›.^w{\·µ,kàt§²yÇ ïÕ{�Ós�×AÒehºô5FS=eÛ(ݶék¯qéAզѿñíxL,>kÛØíx{ªfë$º÷¶‰ûNz�óÖIëaÏ%}ž£hr ÛëóÆéµ�·›è~¼OJºÝâm�‰·¥æ‘ŽÑýxÞ½¶º}í¶ÆÛ<Óåéq�³žŒ©®ñýÆi½lŒI—á½^à Ð+Rv ëv/6�n§ ï½1žÎÛA¼é⚦µeÄ·õoܼöœ4­Õ¼º7Ζç‰×W÷Ó×`|B?v¼¶¡î{l½þVKÀ¢í¡Çt[�[OÄ·ãù‰×‡ÏK¼qö<Ö›éóE“=o_‰·“‹÷qÑkœöAºÝ¼éÒmâÍG÷mJ¯>ÍKËÕ|mL|[óŠçŸî 1›W¿qªõbc¼ç= ½"ãôô1ݶ†êÅïýѦóv�^ÓYsjÖ¤6V·Óit[5�±šW÷ÆõZ‡”Æ z�ú!ÐT{ÑXM+ñA+^†zÆ–¥í¤il™6^¼>M�õÆ¥ÏÁSdÌ m ô˜^ë8Pí�ñz&ÝnÞté6ñæϤWŸˆM¯1ñ|lš.>VÄ}j5£º�í5.Ó‹÷¼‡A WdÜ�® 7¡×Ü)¯¡4]Ü@ƒÑ[§^ l;—Ö5~Ìš6��ƨf;l¯z¯qEvM7h§ê‡@?v¼^o½îñ4ƒX_Ä5ëgÍÛj¶l-#ßk¹iö§1ýú`ÐëRDS]¯I¯ýLÛ)ÞVÞ>émÿt»iŒ¤câmé�IçÝkûÇ�i|Ü º¯ÇÒíoýhûB,î§^ã4ßt}SÞë5 ½"ã tÕÒ&µ±qcJ<.}ܦ‰›Vãã¦Óít:Ý�›ÎƤ ló—¸nãÓ�º×A4­Û“>WÛ ãõÐØx9Þtà Ðým‘¨ôšë1�÷Kk½zBý¨zz�Óýtë¹ô~úülyq=^×A¯KMt½6½ŽAÖ+¢í™nS{mãq¶�û�Ñý¸l·û6M¼¼^Û_l|ú¸Í7}~ö¼ãu2ªÇÇÝO{ÖÖ%'ñrt;�nzEè©^'‰×Ic½çY�^‘Q¶¹°FOwæ&jZ £ôÊ@_åË-¢\ºødíŠSÝÃc›4á·†1>ôÊ@_åË-¢\úZjbÝÚŸüxçeÝÿ}*�Ú�>Bè«|¹E”Oÿ«ÔΝº;HL›¬]~JÖÿG/ÊC¡ ôUžÜ"ʧwÁËϼtè¡ðìƒ;êS?ÙýÚÊÛa®Ý²&lþú—»ã^yî@gR~h'úe ¯òåQí(G~}{8|ßÕáÙ®íúî¦eaõ’ÏÏÛYô®xÕéŸ {oØptìáû®éNŸÎíB¡ ôUþÜ"ÆK;Êó�LuÞšßÚYžÙ7¿écÛ.:}ÞÅ'—¬=%\¿ålw¼™½ëÛ�EøËE³ÐG(}Õ,nã¡�åàÞMn³Çîþþ…aé‰ÿ}ôODô»È+OùdxlÏ6w|ìÉÛ&:‹ò—�f �PúªyÜ"Æã°Óà±gî¹2<ú½½ÞNûø;�^|rÅ%˹ǽ3Ü·ñaæ–î´±çæ7”›Œ>Bè«æq‹X¸Ÿ¸ËmnspÏÆîŽr÷Äûº¶žô®pΩÇuß/=þƒáÆeï9ú˜ví\Þ|Dç¾^{‘ßQn"úe ¯šÉ-báú½ûMwÙûõ¿ 'ýçß…�ç�V|êo�yLí4/üòÖÎbýuA¾è#”�¾j&·ˆ…ó®5çóv™øÜ»ÃÇ$\þ…w¸�¸é w~¢4]ä�>Bè«fr‹X8¯©Í›?ìî·¬|o8ñßßÚ}7ì=®óYÞüD*’®òçmkCaTÞ¶7ôU¾Ü"N ì5¶¨ñ½B6ÿv·.�ߺÖ�_׃×wë¯ òE¡ ôU3¹E,œØmì�kÒ9'o§èå¡­í{ŽJ? ‘®òG¡ ôU3¹E,œ®êôÛ¨ù{}µ•´³è|˜þ¦4]ä�>Bè«fr‹�gîÝî6xL_Si‡Hw]eªº®8õ¦3Ú‘žä–Îâüu@þè#”�¾j·ˆñyêöKÜF÷¨ùµƒô{·Ó¸§ïÞÖYŒ¿l4}„2ÐWÍâ1^úf_}�õÜû:³÷—‰æ¡�Púª9Ü"ÆO¿Ì¤&÷šš‡ðÿ·}„2ÐWÍàQž—=ÔýogèG;‰®eG�ÐG(}•7·ˆò½úâ¡pä±Û:;ÏÎ0ûóo…Cwn OßsEwÇÐm�«:4ý�pøþkº?›ÈU¢ðÐG(}•'·òâ@^Ü"È‹[yq‹ /näÅ-€¼¸E�·òâ@^Ü"È‹[yq‹ /näÅ-€¼¸E�·òâ@^Ü"ÈIxËÿ’аw̱“IIEND®B`‚jupyter-nbconvert-5db0bfc/docs/source/api/000077500000000000000000000000001516532232300207645ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/docs/source/api/exporters.rst000066400000000000000000000023311516532232300235500ustar00rootroot00000000000000Exporters ========= .. module:: nbconvert.exporters .. seealso:: :doc:`/config_options` Configurable options for the nbconvert application .. autofunction:: export .. autofunction:: get_exporter .. autofunction:: get_export_names Exporter base classes --------------------- .. autoclass:: Exporter .. automethod:: __init__ .. automethod:: from_notebook_node .. automethod:: from_filename .. automethod:: from_file .. automethod:: register_preprocessor .. autoclass:: TemplateExporter .. automethod:: __init__ .. automethod:: from_notebook_node .. automethod:: from_filename .. automethod:: from_file .. automethod:: register_preprocessor .. automethod:: register_filter Specialized exporter classes ---------------------------- The ``NotebookExporter`` inherits directly from ``Exporter``, while the other exporters listed here inherit either directly or indirectly from ``TemplateExporter``. .. autoclass:: NotebookExporter .. autoclass:: HTMLExporter .. autoclass:: SlidesExporter .. autoclass:: LatexExporter .. autoclass:: MarkdownExporter .. autoclass:: PDFExporter .. autoclass:: WebPDFExporter .. autoclass:: PythonExporter .. autoclass:: RSTExporter jupyter-nbconvert-5db0bfc/docs/source/api/filters.rst000066400000000000000000000025231516532232300231700ustar00rootroot00000000000000.. highlight:: none Filters ======= Filters are for use with the ``nbconvert.exporters.templateexporter.TemplateExporter`` exporter. They provide a way for you transform notebook contents to a particular format depending on the template you are using. For example, when converting to HTML, you would want to use the ``ansi2html()`` function to convert ANSI colors (from e.g. a terminal traceback) to HTML colors. .. seealso:: :doc:`/api/exporters` API documentation for the various exporter classes .. module:: nbconvert.filters .. autofunction:: add_anchor .. autofunction:: add_prompts .. autofunction:: ansi2html .. autofunction:: ansi2latex .. autofunction:: ascii_only .. autofunction:: citation2latex .. autofunction:: comment_lines .. autofunction:: escape_latex .. autoclass:: DataTypeFilter .. autofunction:: get_lines .. autofunction:: convert_pandoc .. autoclass:: Highlight2HTML .. autoclass:: Highlight2Latex .. autofunction:: html2text .. autofunction:: indent .. autofunction:: ipython2python .. autofunction:: markdown2html .. autofunction:: markdown2latex .. autofunction:: markdown2rst .. autofunction:: path2url .. autofunction:: posix_path .. autofunction:: prevent_list_blocks .. autofunction:: strip_ansi .. autofunction:: strip_dollars .. autofunction:: strip_files_prefix .. autofunction:: wrap_text jupyter-nbconvert-5db0bfc/docs/source/api/index.rst000066400000000000000000000003431516532232300226250ustar00rootroot00000000000000Python API for working with nbconvert ===================================== .. module:: nbconvert Contents: .. toctree:: :maxdepth: 2 nbconvertapp exporters preprocessors filters writers postprocessors jupyter-nbconvert-5db0bfc/docs/source/api/nbconvertapp.rst000066400000000000000000000007601516532232300242220ustar00rootroot00000000000000NbConvertApp ============ .. module:: nbconvert.nbconvertapp .. seealso:: :doc:`/config_options` Configurable options for the nbconvert application .. autoclass:: NbConvertApp .. automethod:: init_notebooks .. automethod:: convert_notebooks .. automethod:: convert_single_notebook .. automethod:: init_single_notebook_resources .. automethod:: export_single_notebook .. automethod:: write_single_notebook .. automethod:: postprocess_single_notebook jupyter-nbconvert-5db0bfc/docs/source/api/postprocessors.rst000066400000000000000000000005431516532232300246300ustar00rootroot00000000000000Postprocessors ============== .. module:: nbconvert.postprocessors .. seealso:: :doc:`/config_options` Configurable options for the nbconvert application .. autoclass:: PostProcessorBase .. automethod:: postprocess Specialized postprocessors -------------------------- .. autoclass:: ServePostProcessor .. automethod:: postprocess jupyter-nbconvert-5db0bfc/docs/source/api/preprocessors.rst000066400000000000000000000022411516532232300244260ustar00rootroot00000000000000Preprocessors ============= .. module:: nbconvert.preprocessors :noindex: .. seealso:: :doc:`/config_options` Configurable options for the nbconvert application .. autoclass:: Preprocessor .. automethod:: __init__ .. automethod:: preprocess .. automethod:: preprocess_cell Specialized preprocessors ------------------------- Converting and extracting figures ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: ConvertFiguresPreprocessor .. autoclass:: SVG2PDFPreprocessor .. autoclass:: ExtractOutputPreprocessor Converting text ~~~~~~~~~~~~~~~ .. autoclass:: LatexPreprocessor .. autoclass:: HighlightMagicsPreprocessor Metadata and header control ~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: ClearMetadataPreprocessor .. autoclass:: CSSHTMLHeaderPreprocessor Removing/Manipulating cells, inputs, and outputs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autoclass:: ClearOutputPreprocessor .. autoclass:: CoalesceStreamsPreprocessor .. autoclass:: RegexRemovePreprocessor .. autoclass:: TagRemovePreprocessor Executing Notebooks ~~~~~~~~~~~~~~~~~~~ .. autoclass:: ExecutePreprocessor :members: .. autoclass:: CellExecutionError jupyter-nbconvert-5db0bfc/docs/source/api/writers.rst000066400000000000000000000005421516532232300232160ustar00rootroot00000000000000Writers ======= .. module:: nbconvert.writers .. seealso:: :doc:`/config_options` Configurable options for the nbconvert application .. autoclass:: WriterBase .. automethod:: __init__ .. automethod:: write Specialized writers ------------------- .. autoclass:: DebugWriter .. autoclass:: FilesWriter .. autoclass:: StdoutWriter jupyter-nbconvert-5db0bfc/docs/source/architecture.rst000066400000000000000000000207001516532232300234260ustar00rootroot00000000000000.. _architecture: ========================= Architecture of nbconvert ========================= This is a high-level outline of the basic workflow, structures and objects in nbconvert. Specifically, this exposition has a two-fold goal: #. to alert you to the affordances available for customisation or direct contributions #. to provide a map of where and when different events occur, which should aid in tracking down bugs. A detailed pipeline exploration =============================== Nbconvert takes in a notebook, which is a JSON object, and operates on that object. This can include operations that take a notebook and return a notebook. For example, that operation could be to execute the notebook as though it were a continuous script; if it were executed ``--in-place`` then it would overwrite the current notebook. Or it could be that we wish to systematically alter the notebook, for example by clearing all output cells. Format agnostic operations on cell content that do not violate the nbformat spec can be interpreted as a notebook to notebook conversion step; such operations can be performed as part of the preprocessing step. But often we want to have the notebook's structured content in a different format. Importantly, in many cases the structure of the notebook should be reflected in the structure of the output, adapted to the output's format. For that purpose, the original JSON structure of the document is crucial scaffolding needed to support this kind of structured output. In order to maintain structure, it can be useful to apply our conversion programmatically on the structure itself. To do so, when converting to formats other than the notebook, we use the `jinja`_ templating engine. The basic unit of structure in a notebook is the cell. Accordingly, since our templating engine is capable of expressing structure, the basic unit in our templates will often be specified at the cell level. Each cell has a certain type; the three most important cell types for our purposes are code, markdown, and raw NbConvert. Code cells can be split further into their input and their output. Operations can also occur separately on input and output and their respective subcomponents. Markdown cells and raw NbConvert cells do not have analogous substructure. The template's structure then can be seen as a mechanism for selecting content on which to operate. Because the template operates on individual cells, this has some upsides and drawbacks. One upside is that this allows the template to have access to the individual cell's metadata, which enables intelligently transforming the appropriate content. The transformations occur as a series of replacement rules and filters. For many purposes these filters take the form of external calls to `pandoc`_, which is a utility for converting between many different document formats. One downside is that this makes operations that require global coördination (e.g., cross referencing across cells) somewhat challenging to implement as filters inside templates. Note that all that we've described is happening in memory. This is crucial in order to ensure that this functionality is available when writing files is more challenging. Nonetheless, the reason for using nbconvert almost always involves producing some kind of output file. We take the in-memory object and write a file appropriate for the output type. The entirety of heretofore described process can be described as part of an ``Exporter``. ``Exporter``\s often involves ``Preprocessor``\s, ``filters``, ``templates`` and ``Writer``\s. These classes and functions are described in greater detail below. Finally, one can apply a ``Postprocessor`` after the writing has occurred. For example, it is common when converting to slides to start a webserver and open a browser window with the newly created document (``--to slides --post serve``). Classes ======= .. _exporters: Exporters --------- The primary class in nbconvert is the ``nbconvert.exporters.exporter.Exporter``. Exporters encapsulate the operation of turning a notebook into another format. There is one Exporter for each format supported in nbconvert. The first thing an Exporter does is load a notebook, usually from a file via :mod:`nbformat`. Most of what a typical Exporter does is select and configure preprocessors, filters, and templates. If you want to convert notebooks to additional formats, a new Exporter is probably what you are looking for. .. seealso:: :ref:`Writing a custom Exporter ` Once the notebook is loaded, it is preprocessed... .. _preprocessors: Preprocessors ------------- A ``nbconvert.preprocessors.Preprocessor`` is an object that transforms the content of the notebook to be exported. The result of a preprocessor being applied to a notebook is always a notebook. These operations include re-executing the cells, stripping output, removing bundled outputs to separate files, etc. If you want to add operations that modify a notebook before exporting, a preprocessor is the place to start. .. seealso:: `Custom Preprocessors `_ Once a notebook is preprocessed, it's time to convert the notebook into the destination format. .. _templates_and_filters: Templates --------- Most Exporters in nbconvert are a subclass of ``nbconvert.exporters.templateexporter.TemplateExporter``, which make use of `jinja`_ to render a notebook into the destination format. Nbconvert templates can be selected from the command line with the ``--template`` option. For example, to use the ``reveal`` template with the HTML exporter .. sourcecode:: bash jupyter nbconvert --to html --template reveal .. note:: Since version 6.0, The HTML exporter defaults to the ``lab`` template which produces a DOM structure corresponding to the notebook component in JupyterLab. To produce HTML corresponding to the looks of the classic notebook, one can use the ``classic`` template by passing ``--template classic`` to the command line. The nbconvert template system has been completely revamped with nbconvert 6.0 to allow for greater extensibility. Nbconvert templates can now be installed as third-party packages and are automatically picked up by nbconvert. For more details about how to create custom templates, check out the :doc:`customizing` section of the documentation. Filters ------- Filters are Python callables which take something (typically text) as an input, and produce a text output. If you want to perform custom transformations of particular outputs, a filter may be the way to go. The following code snippet is an excerpt from the main default template of the HTML export. The displayed block determines how text output on ``stdout`` is displayed in HTML. .. sourcecode:: html {% block stream_stdout -%}
    {{- output.text | ansi2html -}}
    
{%- endblock stream_stdout %} In the ``{{- output.text | ansi2html -}}`` bit, we invoke the ``ansi2html`` filter to transform the text output. Typically, filters are pure functions. However, filters that require some configuration, may be implemented as Configurable classes. .. seealso:: - :doc:`customizing` - `More on Jinja Filters`_ Once it has passed through the template, an Exporter is done with the notebook, and returns the file data. At this point, we have the file data as text or bytes and we can decide where it should end up. When you are using nbconvert as a library, as opposed to the command-line application, this is typically where you would stop, take your exported data, and go on your way. .. _writers: Writers ------- A *Writer* takes care of writing the resulting file(s) where they should end up. There are two basic Writers in nbconvert: 1. stdout - writes the result to stdout (for pipe-style workflows) 2. Files (default) - writes the result to the filesystem Once the output is written, nbconvert has done its job. .. _postprocessors: Postprocessors -------------- A *Postprocessor* is something that runs after everything is exported and written to the filesystem. The only postprocessor in nbconvert at this point is the ``nbconvert.postprocessors.serve.ServePostProcessor``, which is used for serving `reveal.js`_ HTML slideshows. .. _jinja: https://jinja.palletsprojects.com/en/3.0.x/ .. _More on Jinja Filters: https://jinja.palletsprojects.com/en/3.0.x/templates/#filters .. _reveal.js: http://lab.hakim.se/reveal-js .. _pandoc: https://pandoc.org/ jupyter-nbconvert-5db0bfc/docs/source/conf.py000066400000000000000000000251271516532232300215210ustar00rootroot00000000000000# nbconvert documentation build configuration file, created by # sphinx-quickstart on Tue Jun 9 17:11:30 2015. # # This file is execfile()d with the current directory set to its # containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import os import shutil from datetime import datetime, timezone from intersphinx_registry import get_intersphinx_mapping HERE = os.path.dirname(__file__) # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. # sys.path.insert(0, os.path.abspath('.')) # Automatically generate config_options.rst with open(os.path.join(HERE, "..", "autogen_config.py")) as f: exec(compile(f.read(), "autogen_config.py", "exec"), {}) # noqa: S102 print("Created docs for config options") # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. # needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ "myst_parser", "sphinx.ext.autodoc", "sphinx.ext.extlinks", "sphinx.ext.intersphinx", "sphinx.ext.napoleon", "nbsphinx", "IPython.sphinxext.ipython_console_highlighting", ] try: import enchant # noqa: F401 extensions += ["sphinxcontrib.spelling"] except ImportError: pass myst_enable_extensions = ["html_image"] # Add any paths that contain templates here, relative to this directory. templates_path = ["_templates"] # The suffix(es) of source filenames. # You can specify multiple suffix as a list of string: # source_suffix = ['.rst', '.md'] source_suffix = [".rst"] # The encoding of source files. # source_encoding = 'utf-8-sig' # The master toctree document. master_doc = "index" # General information about the project. project = "nbconvert" year = datetime.now(tz=timezone.utc).date().year copyright = "2015-%s, Jupyter Development Team" % year author = "Jupyter Development Team" extlinks = {"ghpull": ("https://github.com/jupyter/nbconvert/pull/%s", "PR #%s")} linkcheck_ignore = [ "https://github.com/jupyter/nbconvert/pull/", ] # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # Get information from _version.py and use it to generate version and release _version_py = os.path.join(HERE, "../../nbconvert/_version.py") version_ns = {} exec(compile(open(_version_py).read(), _version_py, "exec"), version_ns) # noqa: SIM115, S102 # The short X.Y version. version = "%i.%i" % version_ns["version_info"][:2] # The full version, including alpha/beta/rc tags. release = version_ns["__version__"] # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # # This is also used if you do content translation via gettext catalogs. # Usually you set "language" from the command line for these cases. language = "en" # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: # today = '' # Else, today_fmt is used as the format for a strftime call. # today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] # The reST default role (used for this markup: `text`) to use for all # documents. default_role = "any" # If true, '()' will be appended to :func: etc. cross-reference text. # add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). # add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. # show_authors = False # The name of the Pygments (syntax highlighting) style to use. # pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. # modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. # keep_warnings = False # If true, `todo` and `todoList` produce output, else they produce nothing. todo_include_todos = False # -- Options for HTML output ---------------------------------------------- html_theme = "pydata_sphinx_theme" # otherwise, readthedocs.org uses their default theme, so no need to specify it # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_theme = 'sphinx_rtd_theme' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. html_theme_options = { # prefer browser defaults over custom JS keyboard event handlers "navigation_with_keys": False, } # Add any paths that contain custom themes here, relative to this directory. # html_theme_path = [sphinx_rtd_theme.get_html_theme_path()] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". # html_title = None # A shorter title for the navigation bar. Default is the same as html_title. # html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. # html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. # html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. # html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. # html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. # html_use_smartypants = True # Custom sidebar templates, maps document names to template names. # html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. # html_additional_pages = {} # If false, no module index is generated. # html_domain_indices = True # If false, no index is generated. # html_use_index = True # If true, the index is split into individual pages for each letter. # html_split_index = False # If true, links to the reST sources are added to the pages. # html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. # html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. # html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. # html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). # html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'h', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'r', 'sv', 'tr' # html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # Now only 'ja' uses this config value # html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. # html_search_scorer = 'scorer.js' # Output file base name for HTML help builder. htmlhelp_basename = "nbconvertdoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = {} # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ (master_doc, "nbconvert.tex", "nbconvert Documentation", "Jupyter Development Team", "manual"), ] # The name of an image file (relative to this directory) to place at the top of # the title page. # latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. # latex_use_parts = False # If true, show page references after internal links. # latex_show_pagerefs = False # If true, show URL addresses after external links. # latex_show_urls = False # Documents to append as an appendix to all manuals. # latex_appendices = [] # If false, no module index is generated. # latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [(master_doc, "nbconvert", "nbconvert Documentation", [author], 1)] # If true, show URL addresses after external links. # man_show_urls = False # -- Options for Texinfo output ------------------------------------------- # Grouping the document tree into Texinfo files. List of tuples # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ ( master_doc, "nbconvert", "nbconvert Documentation", author, "nbconvert", "One line description of project.", "Miscellaneous", ), ] # Documents to append as an appendix to all manuals. # texinfo_appendices = [] # If false, no module index is generated. # texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. # texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. # texinfo_no_detailmenu = False # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = get_intersphinx_mapping(packages={"python", "jinja", "nbformat"}) def setup(_): dest = os.path.join(HERE, "changelog.md") shutil.copy(os.path.join(HERE, "..", "..", "CHANGELOG.md"), dest) jupyter-nbconvert-5db0bfc/docs/source/customizing.rst000066400000000000000000000151401516532232300233210ustar00rootroot00000000000000Creating Custom Templates for nbconvert ======================================= Selecting a template -------------------- Most exporters in nbconvert are subclasses of ``TemplateExporter``, and make use of jinja to render notebooks into the destination format. Alternative nbconvert templates can be selected by name from the command line with the ``--template`` option. For example, to use the ``reveal`` template with the HTML exporter, one can type. .. sourcecode:: bash jupyter nbconvert --to html --template reveal Where are nbconvert templates installed? ---------------------------------------- Nbconvert templates are *directories* containing resources for nbconvert template exporters such as jinja templates and associated assets. They are installed in the **data directory** of nbconvert, namely ``/share/jupyter/nbconvert``. Nbconvert includes several templates already. For example, three HTML templates are provided in nbconvert core for the HTML exporter: - ``lab`` (The default HTML template, which produces the same DOM structure as JupyterLab) - ``classic`` (The HTML template styled after the classic notebook) - ``reveal`` (For producing slideshows). .. note:: Running ``jupyter --paths`` will show all Jupyter directories and search paths. For example, on Linux, ``jupyter --paths`` returns: .. code:: $ jupyter --paths config: /home//.jupyter //etc/jupyter /usr/local/etc/jupyter /etc/jupyter data: /home//.local/share/jupyter //share/jupyter /usr/local/share/jupyter /usr/share/jupyter runtime: /home//.local/share/jupyter/runtime Adding Additional Template Paths ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In order to add additional paths to be searched, you need to pass ``TemplateExporter.extra_template_basedirs`` config options indicating the extra directories to search for templates. Be careful not to override ``TemplateExporter.template_paths`` unless you intend to replace ALL paths and don't want the default locations included. When using the commandline the extra template paths are added by calling ``--TemplateExporter.extra_template_basedirs=path/you/want/included``. The content of nbconvert templates ---------------------------------- conf.json ~~~~~~~~~ Nbconvert templates all include a ``conf.json`` file at the root of the directory, which is used to indicate - the base template that it is inheriting from. - the mimetypes of the template. - preprocessors classes to register in the exporter when using that template. Inspecting the configuration of the reveal template we see that it inherits from the lab template, exports text/html, and enables two preprocessors called "100-pygments" and "500-reveal". .. code:: { "base_template": "lab", "mimetypes": { "text/html": true }, "preprocessors": { "100-pygments": { "type": "nbconvert.preprocessors.CSSHTMLHeaderPreprocessor", "enabled": true }, "500-reveal": { "type": "nbconvert.exporters.slides._RevealMetadataPreprocessor", "enabled": true } } } Inheritance ~~~~~~~~~~~ Nbconvert walks up the inheritance structure determined by ``conf.json`` and produces an aggregated configuration, merging the dictionaries of registered preprocessors. The lexical ordering of the preprocessors by name determines the order in which they will be run. Besides the ``conf.json`` file, nbconvert templates most typically include jinja templates files, although any other resource from the base template can be overridden in the derived template. For example, inspecting the content of the ``classic`` template located in ``share/jupyter/nbconvert/templates/classic``, we find the following content: .. code:: share/jupyter/nbconvert/templates/classic ├── static │ └── styles.css ├── conf.json ├── index.html.j2 └── base.html.j2 The ``classic`` template exporter includes a ``index.html.j2`` jinja template (which is the main entry point for HTML exporters) as well as CSS and a base template file in ``base.html.j2``. .. note:: A template inheriting from ``classic`` would specify ``"base_template": "classic"`` and could override any of these files. For example, one could make a "classiker" template merely providing an alternative ``styles.css`` file. Inheritance in Jinja ~~~~~~~~~~~~~~~~~~~~ In nbconvert, jinja templates can inherit from any other jinja template available in its current directory or base template directory by name. Jinja templates of other directories can be addressed by their relative path from the Jupyter data directory. For example, in the reveal template, ``index.html.j2`` extends ``base.html.j2`` which is in the same directory, and ``base.html.j2`` extends ``lab/base.html.j2``. This approach allows using content that is available in other templates or may be overridden in the current template. A practical example ~~~~~~~~~~~~~~~~~~~ Say you would like to modify the existing Markdown template to wrap each output statement in a fenced code block: .. code:: ```output (1, 2, 3) ``` Start by creating a new template directory, say ``mdoutput``. In it, you have the following files:: conf.json index.md.j2 The configuration file, ``conf.json`` states that your template applies to markdown files:: { "mimetypes": { "text/markdown": true } } The ``index.md.j2`` template entrypoint extends the existing markdown template, and redefines how output blocks are rendered: .. code:: {% extends 'markdown/index.md.j2' %} {%- block traceback_line -%} ```output {{ line.rstrip() | strip_ansi }} ``` {%- endblock traceback_line -%} {%- block stream -%} ```output {{ output.text.rstrip() }} ``` {%- endblock stream -%} {%- block data_text scoped -%} ```output {{ output.data['text/plain'].rstrip() }} ``` {%- endblock data_text -%} You can now convert your notebook to markdown using the new template:: jupyter nbconvert --execute notebook.ipynb --to markdown --template=mdoutput (If you put your template folder in a different location than your notebook, remember to add ``--TemplateExporter.extra_template_basedirs=path/to/template/parent``.) To further explore the possibilities of templating, take a look at the root of all templates: ``null.j2``. You can find it in the ``./nbconvert/templates/base`` subfolder of one of the data paths given by ``jupyter --paths``. jupyter-nbconvert-5db0bfc/docs/source/dejavu.rst000066400000000000000000000023471516532232300222310ustar00rootroot00000000000000.. highlight:: none Dejavu ====== Dejavu intends to be a tool to facilitate for Jupyter users to generate static outputs from their notebooks, mimicking the behavior of `voilà `_. Running dejavu -------------- Dejavu works exactly the same as nbconvert and you can use all command line options that you would with nbconvert. To run a default instance:: jupyter dejavu notebook.ipynb In case you want to show code in addition to its output use the flag ``--show-input``. Configuring the Notebook for slides presentations ------------------------------------------------- In case the user intends to do a slide presentation out of their Jupyter notebook it's recommended to use the ``reveal`` template. In orders to obtain a better result from it's advised to use the slides metadatas available in the cells: * In the notebook, select a cell and click on the "Property Inspector menu" .. tip:: The "Property Inspector menu" can be located in the right side bar, its symbol contains two gears. * Select a cell in the notebook * In the Property Inspector menu select the cell's slide type: * Slide * Sub-Slide * Fragment * Skip * Notes * Repeat the process for all cells jupyter-nbconvert-5db0bfc/docs/source/development_release.rst000066400000000000000000000075071516532232300250000ustar00rootroot00000000000000.. _nbconvert_release: Making an ``nbconvert`` release =============================== This document guides a contributor through creating a release of ``nbconvert``. Assign all merged PRs to milestones ----------------------------------- Go to GitHub and assign all PRs that have been merged to milestones. This will be helpful when you update the changelog. If you go to this `GitHub page `_ you will find all the PRs that currently have no milestones. .. _GitHub no milestones: https://github.com/jupyter/nbconvert/pulls?utf8=%E2%9C%93&q=is%3Amerged%20is%3Apr%20no%3Amilestone%20 Gather all PRs related to milestone ----------------------------------- `ghpro `_ can be used to extract the pull requests by call the following from nbconvert directory (will ask for an API token the first time): .. code:: bash github-stats --milestone=$VERSION --since-tag $LAST_VERSION --links .. _ghpro: https://github.com/mpacer/ghpro/tree/alternate_styling Manually categorize tickets --------------------------- Group the tickets by these general categories (or others if they are relevant). This usually a manual processes to evaluate the changes in each PR. #. New Features #. Deprecations #. Fixing Problems #. Testing, Docs, and Builds Collect major changes --------------------- From the tickets write up any major features / changes that deserve a paragraph to describe how they work. Update docs/source/changelog.rst -------------------------------- Copy these changes with the new version to the top of changelog.rst. Prior release changelogs can be used to pick formatting of the message. Check installed tools --------------------- Review ``CONTRIBUTING.md``, particularly the testing and release sections. Clean the repository -------------------- You can remove all non-tracked files with: .. code:: bash git clean -xfdi This would ask you for confirmation before removing all untracked files. Make sure the ``dist/`` and ``build/`` folders are clean and avoid stale builds from previous attempts. Create the release ------------------ #. Update the :doc:`changelog ` to account for all the PRs assigned to this milestone. #. Update version number in ``nbconvert/_version.py`` and remove ``.dev`` from dev_info. Note that the version may already be on the dev version of the number you're releasing. #. Commit and tag the release with the current version number: .. code:: bash git commit -am "release $VERSION" git tag $VERSION #. You are now ready to build the ``sdist`` and ``wheel``: .. code:: bash pip install build python -m build . #. You can now test the ``wheel`` and the ``sdist`` locally before uploading to PyPI. Make sure to use `twine `_ to upload the archives over SSL. .. code:: bash twine upload dist/* #. The conda-forge bot will automatically add a PR on your behalf to the `nbconvert-feedstock repo `_. You may want to review this PR to ensure conda-forge will be updated cleanly. .. _conda-forge-nbconvert: https://github.com/conda-forge/nbconvert-feedstock Release the new version ----------------------- Push directly on main, including --tags separately .. code:: bash git push upstream git push upstream --tags Return to development state --------------------------- If all went well, change the ``nbconvert/_version.py`` back by adding the ``.dev`` suffix and moving the version forward to the next patch release number. Email googlegroup with update letter ------------------------------------ Make sure to email jupyter@googlegroups.com with the subject line of "[ANN] NBConvert $VERSION -- ..." and include at least the significant changes, contributors, and individual PR notes (if not many significant changes). jupyter-nbconvert-5db0bfc/docs/source/execute_api.rst000066400000000000000000000173071516532232300232500ustar00rootroot00000000000000Executing notebooks =================== .. currentmodule:: nbconvert.preprocessors Jupyter notebooks are often saved with output cells that have been cleared. nbconvert provides a convenient way to execute the input cells of an .ipynb notebook file and save the results, both input and output cells, as a .ipynb file. In this section we show how to execute a ``.ipynb`` notebook document saving the result in notebook format. If you need to export notebooks to other formats, such as reStructured Text or Markdown (optionally executing them) see section :doc:`nbconvert_library`. Executing notebooks can be very helpful, for example, to run all notebooks in Python library in one step, or as a way to automate the data analysis in projects involving more than one notebook. Executing notebooks from the command line ----------------------------------------- The same functionality of executing notebooks is exposed through a :doc:`command line interface ` or a Python API interface. As an example, a notebook can be executed from the command line with:: jupyter nbconvert --to notebook --execute mynotebook.ipynb Executing notebooks using the Python API interface -------------------------------------------------- This section will illustrate the Python API interface. Example ~~~~~~~ Let's start with a complete quick example, leaving detailed explanations to the following sections. **Import**: First we import nbconvert and the ``ExecutePreprocessor`` class:: import nbformat from nbconvert.preprocessors import ExecutePreprocessor **Load**: Assuming that ``notebook_filename`` contains the path of a notebook, we can load it with:: with open(notebook_filename) as f: nb = nbformat.read(f, as_version=4) **Configure**: Next, we configure the notebook execution mode:: ep = ExecutePreprocessor(timeout=600, kernel_name='python3') We specified two (optional) arguments ``timeout`` and ``kernel_name``, which define respectively the cell execution timeout and the execution kernel. The option to specify **kernel_name** is new in nbconvert 4.2. When not specified or when using nbconvert <4.2, the default Python kernel is chosen. **Execute/Run (preprocess)**: To actually run the notebook we call the method :meth:`~ExecutePreprocessor.preprocess`:: ep.preprocess(nb, {'metadata': {'path': 'notebooks/'}}) Hopefully, we will not get any errors during the notebook execution (see the last section for error handling). Note that ``path`` specifies in which folder to execute the notebook. **Save**: Finally, save the resulting notebook with:: with open('executed_notebook.ipynb', 'w', encoding='utf-8') as f: nbformat.write(nb, f) That's all. Your executed notebook will be saved in the current folder in the file ``executed_notebook.ipynb``. Execution arguments (traitlets) ------------------------------- The arguments passed to ``ExecutePreprocessor`` are configuration options called `traitlets `_. There are many cool things about traitlets. For example, they enforce the input type, and they can be accessed/modified as class attributes. Moreover, each traitlet is automatically exposed as command-line options. For example, we can pass the timeout from the command-line like this:: jupyter nbconvert --ExecutePreprocessor.timeout=600 --to notebook --execute mynotebook.ipynb Let's now discuss in more detail the two traitlets we used. The ``timeout`` traitlet defines the maximum time (in seconds) each notebook cell is allowed to run, if the execution takes longer an exception will be raised. The default is 30 s, so in cases of long-running cells you may want to specify an higher value. The ``timeout`` option can also be set to ``None`` or ``-1`` to remove any restriction on execution time. The second traitlet, ``kernel_name``, allows specifying the name of the kernel to be used for the execution. By default, the kernel name is obtained from the notebook metadata. The traitlet ``kernel_name`` allows specifying a user-defined kernel, overriding the value in the notebook metadata. A common use case is that of a Python 2/3 library which includes documentation/testing notebooks. These notebooks will specify either a python2 or python3 kernel in their metadata (depending on the kernel used the last time the notebook was saved). In reality, these notebooks will work on both Python 2 and Python 3, and, for testing, it is important to be able to execute them programmatically on both versions. Here the traitlet ``kernel_name`` helps simplify and maintain consistency: we can just run a notebook twice, specifying first "python2" and then "python3" as the kernel name. Handling errors and exceptions ------------------------------ In the previous sections we saw how to save an executed notebook, assuming there are no execution errors. But, what if there are errors? Execution until first error ~~~~~~~~~~~~~~~~~~~~~~~~~~~ An error during the notebook execution, by default, will stop the execution and raise a ``CellExecutionError``. Conveniently, the source cell causing the error and the original error name and message are also printed. After an error, we can still save the notebook as before:: with open('executed_notebook.ipynb', mode='w', encoding='utf-8') as f: nbformat.write(nb, f) The saved notebook contains the output up until the failing cell, and includes a full stack-trace and error (which can help debugging). Handling errors ~~~~~~~~~~~~~~~ A useful pattern to execute notebooks while handling errors is the following:: from nbconvert.preprocessors import CellExecutionError try: out = ep.preprocess(nb, {'metadata': {'path': run_path}}) except CellExecutionError: out = None msg = 'Error executing the notebook "%s".\n\n' % notebook_filename msg += 'See notebook "%s" for the traceback.' % notebook_filename_out print(msg) raise finally: with open(notebook_filename_out, mode='w', encoding='utf-8') as f: nbformat.write(nb, f) This will save the executed notebook regardless of execution errors. In case of errors, however, an additional message is printed and the ``CellExecutionError`` is raised. The message directs the user to the saved notebook for further inspection. Execute and save all errors ~~~~~~~~~~~~~~~~~~~~~~~~~~~ As a last scenario, it is sometimes useful to execute notebooks which raise exceptions, for example to show an error condition. In this case, instead of stopping the execution on the first error, we can keep executing the notebook using the traitlet ``allow_errors`` (default is False). With ``allow_errors=True``, the notebook is executed until the end, regardless of any error encountered during the execution. The output notebook, will contain the stack-traces and error messages for **all** the cells raising exceptions. Widget state ------------ If your notebook contains any `Jupyter Widgets `_, the state of all the widgets can be stored in the notebook's metadata. This allows rendering of the live widgets on for instance nbviewer, or when converting to html. We can tell nbconvert to not store the state using the ``store_widget_state`` argument:: jupyter nbconvert --ExecutePreprocessor.store_widget_state=False --to notebook --execute mynotebook.ipynb This widget rendering is not performed against a browser during execution, so only widget default states or states manipulated via user code will be calculated during execution. ``%%javascript`` cells will execute upon notebook rendering, enabling complex interactions to function as expected when viewed by a UI. If you can't view widget results after execution, you may need to select :menuselection:`File --> Trust Notebook` in the menu. jupyter-nbconvert-5db0bfc/docs/source/external_exporters.rst000066400000000000000000000202561516532232300247070ustar00rootroot00000000000000.. _external_exporters: Customizing exporters ===================== .. versionadded:: 4.2 You can now use the ``--to`` flag to use custom export formats defined outside nbconvert. The command-line syntax to run the ``nbconvert`` script is:: jupyter nbconvert --to FORMAT notebook.ipynb This will convert the Jupyter document file ``notebook.ipynb`` into the output format designated by the ``FORMAT`` string as explained below. Extending the built-in format exporters --------------------------------------- A few built-in formats are available by default: ``html``, ``pdf``, ``webpdf``, ``script``, ``latex``. Each of these has its own *exporter* with many configuration options that can be extended. Having the option to point to a different *exporter* allows authors to create their own fully customized templates or export formats. A custom *exporter* must be an importable Python object. We recommend that these be distributed as Python libraries. .. _entrypoints: Registering a custom exporter as an entry point ----------------------------------------------- Additional exporters may be registered as named entry_points_. nbconvert uses the ``nbconvert.exporters`` entry point to find exporters from any package you may have installed. If you are writing a Python package that provides custom exporters, you can register the custom exporters in your package's :file:`setup.py`. For example, your package may contain two custom exporters, named "simple" and "detail", and can be registered in your package's :file:`setup.py` as follows: .. sourcecode:: python setup( # ... entry_points={ "nbconvert.exporters": [ "simple = mymodule:SimpleExporter", "detail = mymodule:DetailExporter", ], } ) Now people who have installed your Python package containing the two custom exporters can call the entry point name:: jupyter nbconvert --to detail mynotebook.ipynb instead of having to specify the full import name of the custom exporter. .. _entry_points: https://packaging.python.org/guides/ creating-and-discovering-plugins/#using-package-metadata Using a custom exporter without entrypoints ------------------------------------------- We encourage registering custom exporters as entry points as described in the previous section. Registering a custom exporter with an entry point simplifies using the exporter. If a custom exporter has not been registered with an entry point, the exporter can still be used by providing the fully qualified name of this exporter as the argument of the ``--to`` flag when running from the command line:: $ jupyter nbconvert --to notebook.ipynb For example, assuming a library ``tcontrib`` has a custom exporter name ``TExporter``, you would convert to this custom format using the following:: $ jupyter nbconvert --to tcontrib.TExporter notebook.ipynb A library can contain multiple exporters. Creators of custom exporters should make sure that all other flags of the command line behave the same for the custom exporters as for built-in exporters. Parameters controlled by an external exporter ============================================= An external exporter can control almost any parameter of the notebook conversion process, from simple parameters such as the output file extension, to more complex ones such as the execution of the notebook or a custom rendering template. All external exporters can expose custom options using the ``traitlets`` configurable API. Refer to the library that provides these exporters for details on how these configuration options works. You can use the Jupyter configuration files to configure an external exporter. As for any ``nbconvert`` exporters you can use either the configuration file syntax of ``c.MyExporter.config_option=value`` or the command line flag form ``--MyExporter.config_option=value``. Writing a custom ``Exporter`` ============================= Under the hood exporters are python classes that expose a certain interface. Any importable classes that expose this interface can be use as an exporter for nbconvert. For simplicity we expose basic classes that implement all the relevant methods that you have to subclass and overwrite just the relevant methods to provide a custom exporter. Below we show you the step to create a custom exporter that provides a custom file extension, and a custom template that inserts before and after each markdown cell. We will lay out files to be ready for Python packaging and distributing on PyPI, although the exact art of Python packaging is beyond the scope of this explanation. We will use the following layout for our package to expose a custom exporter:: mypackage ├── LICENSE.md ├── setup.py └── mypackage ├── __init__.py └── templates └── test_template.tpl If you wished to create this same directory structure you could use the following commands when you are at the directory under which you wish to build your ``mypackage`` package: .. code-block:: bash mkdir -p mypackage/mypackage/templates touch mypackage/LICENSE.md touch mypackage/setup.py touch mypackage/mypackage/__init__.py touch mypackage/mypackage/templates/test_template.tpl .. important:: You should not publish this package without adding content to your ``LICENSE.md`` file. For example, ``nbconvert`` follows the Jupyter Project convention of using a Modified BSD License (also known as New or Revised or 3-Clause BSD). For a guide on picking the right license for your use case, please see `choose a license `_. If you do not specify the license, your code may be `unusable by many open source projects`_. .. _`unusable by many open source projects`: http://choosealicense.com/no-license/ As you can see the layout is relatively simple, in the case where a template is not needed we would actually have only one file with an Exporter implementation. Of course you can change the layout of your package to have a more fine-grained structure of the subpackage. But lets see what a minimum example looks like. We are going to write an exporter that: - exports to html, so we will reuse the built-in html exporter - changes the file extension to ``.test_ext`` .. code-block:: python # file __init__.py import os import os.path from traitlets.config import Config from nbconvert.exporters.html import HTMLExporter # ----------------------------------------------------------------------------- # Classes # ----------------------------------------------------------------------------- class MyExporter(HTMLExporter): """ My custom exporter """ # If this custom exporter should add an entry to the # "File -> Download as" menu in the notebook, give it a name here in the # `export_from_notebook` class member export_from_notebook = "My format" def _file_extension_default(self): """ The new file extension is ``.test_ext`` """ return ".test_ext" @property def template_paths(self): """ We want to inherit from HTML template, and have template under ``./templates/`` so append it to the search path. (see next section) Note: nbconvert 6.0 changed ``template_path`` to ``template_paths`` """ return super().template_paths + [ os.path.join(os.path.dirname(__file__), "templates") ] def _template_file_default(self): """ We want to use the new template we ship with our library. """ return "test_template" # full And the template file, that inherits from the html ``full`` template and prepend/append text to each markdown cell (see Jinja2 docs for template syntax):: {% extends "full.tpl" %} {% block markdowncell -%} ## this is a markdown cell {{ super() }} ## THIS IS THE END {% endblock markdowncell %} Assuming you install this package locally, or from PyPI, you can now use:: jupyter nbconvert --to mypackage.MyExporter notebook.ipynb jupyter-nbconvert-5db0bfc/docs/source/highlighting.rst000066400000000000000000000035671516532232300234250ustar00rootroot00000000000000Customizing Syntax Highlighting =============================== Under the hood, nbconvert uses pygments to highlight code. pdf, webpdf and html exporting support changing the highlighting style. Using Builtin styles -------------------- Pygments has a number of builtin styles available. To use them, we just need to set the style setting in the relevant preprocessor. To change html and webpdf highlighting export with: .. code-block:: bash jupyter nbconvert --to html notebook.ipynb --CSSHTMLHeaderPreprocessor.style= To change pdf and latex highlighting export with: .. code-block:: bash jupyter nbconvert --to pdf notebook.ipynb --LatexPreprocessor.style= where ```` is the name of the pygments style. Available styles may vary from system to system. You can find all available styles with: .. code-block:: bash pygmentize -L styles from a terminal or .. code-block:: python from pygments.styles import get_all_styles print(list(get_all_styles())) from python. You can preview all the styles from an environment that can display html like jupyter notebook with: .. code-block:: python from pygments.styles import get_all_styles from pygments.formatters import Terminal256Formatter from pygments.lexers import PythonLexer from pygments import highlight code = """ import os def function(test=1): if test in [3,4]: print(test) """ for style in get_all_styles(): highlighted_code = highlight(code, PythonLexer(), Terminal256Formatter(style=style)) print(f"{style}:\n{highlighted_code}") Making your own styles ---------------------- To make your own style you must subclass ``pygments.styles.Style``, and then you must register your new style with Pygments using their plugin system. This is explained in detail in the `Pygments documentation `_. jupyter-nbconvert-5db0bfc/docs/source/index.rst000066400000000000000000000037651516532232300220670ustar00rootroot00000000000000============================================= nbconvert: Convert Notebooks to other formats ============================================= Using ``nbconvert`` enables: - **presentation** of information in familiar formats, such as PDF. - **publishing** of research using LaTeX and opens the door for embedding notebooks in papers. - **collaboration** with others who may not use the notebook in their work. - **sharing** contents with many people via the web using HTML. Overall, notebook conversion and the ``nbconvert`` tool give scientists and researchers the flexibility to deliver information in a timely way across different formats. Primarily, the ``nbconvert`` tool allows you to convert a Jupyter ``.ipynb`` notebook document file into another static format including HTML, LaTeX, PDF, Markdown, reStructuredText, and more. ``nbconvert`` can also add productivity to your workflow when used to execute notebooks programmatically. If used as a Python library (``import nbconvert``), ``nbconvert`` adds notebook conversion within a project. For example, ``nbconvert`` is used to implement the "Download as" feature within the Jupyter Notebook web application. When used as a command line tool (invoked as ``jupyter nbconvert ...``), users can conveniently convert just one or a batch of notebook files to another format. **Contents:** .. toctree:: :maxdepth: 2 :caption: User Documentation install usage nbconvert_library dejavu latex_citations removing_cells execute_api .. toctree:: :maxdepth: 2 :caption: Configuration config_options customizing external_exporters highlighting .. toctree:: :maxdepth: 2 :caption: Developer Documentation architecture api/index development_release .. toctree:: :maxdepth: 2 :caption: About nbconvert changelog .. toctree:: :maxdepth: 2 :caption: Questions? Suggestions? need_help Indices and tables ================== * :ref:`genindex` * :ref:`modindex` * :ref:`search` jupyter-nbconvert-5db0bfc/docs/source/install.rst000066400000000000000000000065561516532232300224270ustar00rootroot00000000000000.. highlight:: none Installation ============ .. seealso:: `Installing Jupyter `__ Nbconvert is part of the Jupyter ecosystem. Supported Python versions ------------------------- Currently Python 3.9-3.12 is supported and tested by nbconvert. Installing nbconvert -------------------- Nbconvert is packaged for both pip and conda, so you can install it with:: pip install nbconvert # OR conda install nbconvert The `Miniconda `_ and `Miniforge `_ distributions both provide a minimal conda installation. .. important:: To unlock its full capabilities, nbconvert requires Pandoc, TeX (specifically, XeLaTeX) and playwright. These must be installed separately. Installing Pandoc ----------------- For converting markdown to formats other than HTML, nbconvert uses `Pandoc `_ (1.12.1 or later). To install pandoc on Linux, you can generally use your package manager:: sudo apt-get install pandoc On other platforms, you can get pandoc from `their website `_. Installing TeX -------------- For converting notebooks to PDF (with ``--to pdf``), nbconvert makes use of LaTeX and the XeTeX as the rendering engine. .. versionadded:: 5.0 We use XeTeX as the rendering engine rather than pdfTeX (as in earlier versions). XeTeX can access fonts through native operating system libraries, it has better support for OpenType formatted fonts and Unicode characters. To install a complete TeX environment (including XeLaTeX and the necessary supporting packages) by hand can be tricky. Fortunately, there are packages that make this much easier. These packages are specific to different operating systems: * Linux: `TeX Live `_ * E.g. on Debian or Ubuntu:: sudo apt-get install texlive-xetex texlive-fonts-recommended texlive-plain-generic * macOS (OS X): `MacTeX `_. * Windows: `Latex Project `_. Because nbconvert depends on packages and fonts included in standard TeX distributions, if you do not have a complete installation, you may not be able to use nbconvert's standard tooling to convert notebooks to PDF. Installing Chromium ------------------- For converting notebooks to PDF with ``--to webpdf``, nbconvert requires the `playwright `_ Chromium automation library. Playwright makes use of a specific version of Chromium. If it does not find a suitable installation of the web browser, it can automatically download it if the ``--allow-chromium-download`` flag is passed to the command line. To install a suitable version of playwright, you can pip install ``nbconvert[webpdf]``. PDF conversion on a limited TeX environment ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ If you are only able to install a limited TeX environment, there are two main routes you could take to convert to PDF: 1. Using TeX by hand a. You could convert to ``.tex`` directly; this requires Pandoc. b. edit the file to accord with your local environment c. run ``xelatex`` directly. 2. Custom exporter a. You could write a :ref:`custom exporter ` that takes your system's limitations into account. jupyter-nbconvert-5db0bfc/docs/source/latex_citations.rst000066400000000000000000000011161516532232300241360ustar00rootroot00000000000000LaTeX citations =============== ``nbconvert`` now has support for LaTeX citations. With this capability you can: * Manage citations using BibTeX. * Cite those citations in Markdown cells using HTML data attributes. * Have ``nbconvert`` generate proper LaTeX citations and run BibTeX. For an example of how this works, please see the `citations example`_ in the nbconvert-examples_ repository. .. _nbconvert-examples: https://github.com/jupyter/nbconvert-examples .. _citations example: https://nbviewer.jupyter.org/github/jupyter/nbconvert-examples/blob/master/citations/Tutorial.ipynb jupyter-nbconvert-5db0bfc/docs/source/nbconvert_library.ipynb000066400000000000000000000426761516532232300250210ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Using nbconvert as a library\n", "\n", "In this notebook, you will be introduced to the programmatic API of nbconvert and how it can be used in various contexts. \n", "\n", "A great [blog post](http://jakevdp.github.io/blog/2013/04/15/code-golf-in-python-sudoku/) by [\\@jakevdp](https://github.com/jakevdp) will be used to demonstrate. This notebook will not focus on using the command line tool. The attentive reader will point-out that no data is read from or written to disk during the conversion process. This is because nbconvert has been designed to work in memory so that it works well in a database or web-based environment too." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Quick overview" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Credit: Jonathan Frederic (@jdfreder on github)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The main principle of nbconvert is to instantiate an `Exporter` that controls the pipeline through which notebooks are converted.\n", "\n", "First, download @jakevdp's notebook (if you do not have `requests`, install it by running `pip install requests`, or if you don't have pip installed, you can find it on PYPI):" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "from urllib.request import urlopen\n", "\n", "url = \"https://jakevdp.github.io/downloads/notebooks/XKCD_plots.ipynb\"\n", "response = urlopen(url).read().decode()\n", "response[0:60] + \" ...\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The response is a JSON string which represents a Jupyter notebook. \n", "\n", "Next, we will read the response using nbformat. Doing this will guarantee that the notebook structure is valid. Note that the in-memory format and on disk format are slightly different. In particular, on disk, multiline strings might be split into a list of strings." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "import nbformat\n", "\n", "jake_notebook = nbformat.reads(response, as_version=4)\n", "jake_notebook.cells[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The nbformat API returns a special type of dictionary. For this example, you don't need to worry about the details of the structure (if you are interested, please see the [nbformat documentation](https://nbformat.readthedocs.io/en/latest/)).\n", "\n", "The nbconvert API exposes some basic exporters for common formats and defaults. You will start by using one of them. First, you will import one of these exporters (specifically, the HTML exporter), then instantiate it using most of the defaults, and then you will use it to process the notebook we downloaded earlier." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "from traitlets.config import Config\n", "\n", "# 1. Import the exporter\n", "from nbconvert import HTMLExporter\n", "\n", "# 2. Instantiate the exporter. We use the `classic` template for now; we'll get into more details\n", "# later about how to customize the exporter further.\n", "html_exporter = HTMLExporter(template_name=\"classic\")\n", "\n", "# 3. Process the notebook we loaded earlier\n", "(body, resources) = html_exporter.from_notebook_node(jake_notebook)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The exporter returns a tuple containing the source of the converted notebook, as well as a resources dict. In this case, the source is just raw HTML:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "print(body[:400] + \"...\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you understand HTML, you'll notice that some common tags are omitted, like the `body` tag. Those tags are included in the default `HtmlExporter`, which is what would have been constructed if we had not modified the `template_file`.\n", "\n", "The resource dict contains (among many things) the extracted `.png`, `.jpg`, etc. from the notebook when applicable. The basic HTML exporter leaves the figures as embedded base64, but you can configure it to extract the figures. So for now, the resource dict should be mostly empty, except for a key containing CSS and a few others whose content will be obvious:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "print(\"Resources:\", resources.keys())\n", "print(\"Metadata:\", resources[\"metadata\"].keys())\n", "print(\"Inlining:\", resources[\"inlining\"].keys())\n", "print(\"Extension:\", resources[\"output_extension\"])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`Exporter`s are stateless, so you won't be able to extract any useful information beyond their configuration. You can re-use an exporter instance to convert another notebook. In addition to the `from_notebook_node` used above, each exporter exposes `from_file` and `from_filename` methods." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Extracting Figures using the RST Exporter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When exporting, you may want to extract the base64 encoded figures as files. While the HTML exporter does not do this by default, the `RstExporter` does:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "# Import the RST exproter\n", "from nbconvert import RSTExporter\n", "\n", "# Instantiate it\n", "rst_exporter = RSTExporter()\n", "# Convert the notebook to RST format\n", "(body, resources) = rst_exporter.from_notebook_node(jake_notebook)\n", "\n", "print(body[:970] + \"...\")\n", "print(\"[.....]\")\n", "print(body[800:1200] + \"...\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Notice that base64 images are not embedded, but instead there are filename-like strings, such as `output_3_0.png`. The strings actually are (configurable) keys that map to the binary data in the resources dict.\n", "\n", "Note, if you write an RST Plugin, you are responsible for writing all the files to the disk (or uploading, etc...) in the right location. Of course, the naming scheme is configurable.\n", "\n", "As an exercise, this notebook will show you how to get one of those images. First, take a look at the `'outputs'` of the returned resources dictionary. This is a dictionary that contains a key for each extracted resource, with values corresponding to the actual base64 encoding:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "sorted(resources[\"outputs\"].keys())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this case, there are 5 extracted binary figures, all `png`s. We can use the Image display object to actually display one of the images:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "from IPython.display import Image\n", "\n", "Image(data=resources[\"outputs\"][\"output_3_0.png\"], format=\"png\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that this image is being rendered without ever reading or writing to the disk." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Extracting Figures using the HTML Exporter" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As mentioned above, by default, the HTML exporter does not extract images -- it just leaves them as inline base64 encodings. However, this is not always what you might want. For example, here is a use case from @jakevdp:\n", "\n", "> I write an [awesome blog](http://jakevdp.github.io/) using Jupyter notebooks converted to HTML, and I want the images to be cached. Having one html file with all of the images base64 encoded inside it is nice when sharing with a coworker, but for a website, not so much. I need an HTML exporter, and I want it to extract the figures!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Some theory\n", "\n", "Before we get into actually extracting the figures, it will be helpful to give a high-level overview of the process of converting a notebook to a another format:\n", "\n", "1. Retrieve the notebook and it's accompanying resources (you are responsible for this).\n", "2. Feed the notebook into the `Exporter`, which:\n", " 1. Sequentially feeds the notebook into an array of `Preprocessor`s. Preprocessors only act on the **structure** of the notebook, and have unrestricted access to it. \n", " 2. Feeds the notebook into the Jinja templating engine, which converts it to a particular format depending on which template is selected.\n", "3. The exporter returns the converted notebook and other relevant resources as a tuple.\n", "4. You write the data to the disk using the built-in `FilesWriter` (which writes the notebook and any extracted files to disk), or elsewhere using a custom `Writer`.\n", "\n", "### Using different preprocessors\n", "\n", "To extract the figures when using the HTML exporter, we will want to change which `Preprocessor`s we are using. There are several preprocessors that come with nbconvert, including one called the `ExtractOutputPreprocessor`.\n", "\n", "The `ExtractOutputPreprocessor` is responsible for crawling the notebook, finding all of the figures, and putting them into the resources directory, as well as choosing the key (i.e. `filename_xx_y.extension`) that can replace the figure inside the template. To enable the `ExtractOutputPreprocessor`, we must add it to the exporter's list of preprocessors:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "# create a configuration object that changes the preprocessors\n", "from traitlets.config import Config\n", "\n", "c = Config()\n", "c.HTMLExporter.preprocessors = [\"nbconvert.preprocessors.ExtractOutputPreprocessor\"]\n", "\n", "# create the new exporter using the custom config\n", "html_exporter_with_figs = HTMLExporter(config=c)\n", "html_exporter_with_figs.preprocessors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can compare the result of converting the notebook using the original HTML exporter and our new customized one:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "(_, resources) = html_exporter.from_notebook_node(jake_notebook)\n", "(_, resources_with_fig) = html_exporter_with_figs.from_notebook_node(jake_notebook)\n", "\n", "print(\"resources without figures:\")\n", "print(sorted(resources.keys()))\n", "\n", "print(\"\\nresources with extracted figures (notice that there's one more field called 'outputs'):\")\n", "print(sorted(resources_with_fig.keys()))\n", "\n", "print(\"\\nthe actual figures are:\")\n", "print(sorted(resources_with_fig[\"outputs\"].keys()))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Custom Preprocessors" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "There are an endless number of transformations that you may want to apply to a notebook. In particularly complicated cases, you may want to actually create your own `Preprocessor`. Above, when we customized the list of preprocessors accepted by the `HTMLExporter`, we passed in a string -- this can be any valid module name. So, if you create your own preprocessor, you can include it in that same list and it will be used by the exporter.\n", "\n", "To create your own preprocessor, you will need to subclass from `nbconvert.preprocessors.Preprocessor` and overwrite either the `preprocess` and/or `preprocess_cell` methods." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Example" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The following demonstration adds the ability to exclude a cell by index. \n", "\n", "Note: injecting cells is similar, and won't be covered here. If you want to inject static content at the beginning/end of a notebook, use a custom template." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "from traitlets import Integer\n", "\n", "from nbconvert.preprocessors import Preprocessor\n", "\n", "\n", "class PelicanSubCell(Preprocessor):\n", " \"\"\"A Pelican specific preprocessor to remove some of the cells of a notebook\"\"\"\n", "\n", " # I could also read the cells from nb.metadata.pelican if someone wrote a JS extension,\n", " # but for now I'll stay with configurable value.\n", " start = Integer(0, help=\"first cell of notebook to be converted\").tag(config=True)\n", " end = Integer(-1, help=\"last cell of notebook to be converted\").tag(config=True)\n", "\n", " def preprocess(self, nb, resources):\n", " self.log.info(\"I'll keep only cells from %d to %d\", self.start, self.end)\n", " nb.cells = nb.cells[self.start : self.end]\n", " return nb, resources" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here a Pelican exporter is created that takes `PelicanSubCell` preprocessors and a `config` object as parameters. This may seem redundant, but with the configuration system you can register an inactive preprocessor on all of the exporters and activate it from config files or the command line. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "# Create a new config object that configures both the new preprocessor, as well as the exporter\n", "c = Config()\n", "c.PelicanSubCell.start = 4\n", "c.PelicanSubCell.end = 6\n", "c.RSTExporter.preprocessors = [PelicanSubCell]\n", "\n", "# Create our new, customized exporter that uses our custom preprocessor\n", "pelican = RSTExporter(config=c)\n", "\n", "# Process the notebook\n", "print(pelican.from_notebook_node(jake_notebook)[0])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Programmatically creating templates" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "jupyter": { "outputs_hidden": false } }, "outputs": [], "source": [ "from jinja2 import DictLoader\n", "\n", "dl = DictLoader(\n", " {\n", " \"footer\": \"\"\"\n", "{%- extends 'lab/index.html.j2' -%}\n", "\n", "{% block footer %}\n", "FOOOOOOOOTEEEEER\n", "{% endblock footer %}\n", "\"\"\"\n", " }\n", ")\n", "\n", "\n", "exportHTML = HTMLExporter(extra_loaders=[dl], template_file=\"footer\")\n", "(body, resources) = exportHTML.from_notebook_node(jake_notebook)\n", "for l in body.split(\"\\n\")[-4:]:\n", " print(l)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Real World Uses" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "@jakevdp uses Pelican and Jupyter Notebook to blog. Pelican [will use](https://github.com/getpelican/pelican-plugins/pull/21) nbconvert programmatically to generate blog post. Have a look a [Pythonic Preambulations](http://jakevdp.github.io/) for Jake's blog post." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "@damianavila wrote the Nikola Plugin to [write blog post as Notebooks](https://damianavila.github.io/blog/posts/one-line-deployment-of-your-site-to-gh-pages) and is developing a js-extension to publish notebooks via one click from the web app." ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.2" } }, "nbformat": 4, "nbformat_minor": 4 } jupyter-nbconvert-5db0bfc/docs/source/need_help.rst000066400000000000000000000020351516532232300226700ustar00rootroot00000000000000Need help? ========== Technical Support ----------------- - `GitHub Issues and Bug Reports `_. A place to report bugs or regressions found for nbconvert - `Community Technical Support and Discussion - Jupyter Discourse `_ : A place for installation, configuration, and troubleshooting assistance by the Jupyter community. As a non-profit project with maintainers who are primarily volunteers, we rely on the community for technical support. Please use Discourse to ask questions and share your knowledge. Documentation ------------- - `Documentation for Jupyter nbconvert `_ - `nbconvert examples repo on GitHub `_ - `Documentation for Project Jupyter `_ Jupyter Resources ----------------- - `Jupyter mailing list `_ - `Project Jupyter website `_ jupyter-nbconvert-5db0bfc/docs/source/removing_cells.rst000066400000000000000000000067041516532232300237640ustar00rootroot00000000000000Removing cells, inputs, or outputs ================================== .. currentmodule:: nbconvert.preprocessors When converting Notebooks into other formats, it is possible to remove parts of a cell, or entire cells, using preprocessors. The notebook will remain unchanged, but the outputs will have certain pieces removed. Here are two primary ways to accomplish this. Removing pieces of cells using cell tags ---------------------------------------- The most straightforward way to control which pieces of cells are removed is to use **cell tags**. These are single-string snippets of metadata that are stored in each cells "tag" field. The ``TagRemovePreprocessor`` can be used to remove inputs, outputs, or entire cells. For example, here is a configuration that uses a different tag for removing each part of a cell with the HTMLExporter. In this case, we demonstrate using the nbconvert Python API. .. code-block:: python from traitlets.config import Config import nbformat as nbf from nbconvert.exporters import HTMLExporter from nbconvert.preprocessors import TagRemovePreprocessor # Setup config c = Config() # Configure tag removal - be sure to tag your cells to remove using the # words remove_cell to remove cells. You can also modify the code to use # a different tag word c.TagRemovePreprocessor.remove_cell_tags = ("remove_cell",) c.TagRemovePreprocessor.remove_all_outputs_tags = ("remove_output",) c.TagRemovePreprocessor.remove_input_tags = ("remove_input",) c.TagRemovePreprocessor.enabled = True # Configure and run out exporter c.HTMLExporter.preprocessors = ["nbconvert.preprocessors.TagRemovePreprocessor"] exporter = HTMLExporter(config=c) exporter.register_preprocessor(TagRemovePreprocessor(config=c), True) # Configure and run our exporter - returns a tuple - first element with html, # second with notebook metadata output = HTMLExporter(config=c).from_filename("your-notebook-file-path.ipynb") # Write to output html file with open("your-output-file-name.html", "w") as f: f.write(output[0]) This additional example demonstrates using the CLI to remove cells with a certain cell tag .. code-block:: sh jupyter nbconvert mynotebook.ipynb --TagRemovePreprocessor.enabled=True --TagRemovePreprocessor.remove_cell_tags remove_cell Removing cells using Regular Expressions on cell content -------------------------------------------------------- Sometimes you'd rather remove cells based on their _content_ rather than their tags. In this case, you can use the ``RegexRemovePreprocessor``. You initialize this preprocessor with a single ``patterns`` configuration, which is a list of strings. For each cell, this preprocessor checks whether the cell contents match any of the strings provided in ``patterns``. If the contents match any of the patterns, the cell is removed from the notebook. For example, execute the following command to convert a notebook to html and remove cells containing only whitespace: .. code-block:: bash jupyter nbconvert --RegexRemovePreprocessor.patterns="['\s*\Z']" mynotebook.ipynb The command line argument sets the list of patterns to ``'\s*\Z'`` which matches an arbitrary number of whitespace characters followed by the end of the string. See https://regex101.com/ for an interactive guide to regular expressions (make sure to select the python flavor). See https://docs.python.org/library/re.html for the official regular expression documentation in python. jupyter-nbconvert-5db0bfc/docs/source/usage.rst000066400000000000000000000267471516532232300220710ustar00rootroot00000000000000.. highlight:: none Using as a command line tool ============================ The command-line syntax to run the ``nbconvert`` script is:: $ jupyter nbconvert --to FORMAT notebook.ipynb This will convert the Jupyter notebook file ``notebook.ipynb`` into the output format given by the ``FORMAT`` string. Default output format --------------------- In 5.x versions of nbconvert the default output format was html. In 6.0 the default was removed, requiring CLI calls to explicitly set a ``--to`` argument in order to execute. To mimic original 5.x behavior one should add ``--to=html`` to the ``jupyter nbconvert`` command. .. _supported_output: Supported output formats ------------------------ The currently supported output formats are: - :ref:`HTML `, - :ref:`LaTeX `, - :ref:`PDF `, - :ref:`WebPDF `, - :ref:`Reveal.js HTML slideshow `, - :ref:`Markdown `, - :ref:`Ascii `, - :ref:`reStructuredText `, - :ref:`executable script `, - :ref:`notebook `. Jupyter also provides a few templates for output formats. These can be specified via an additional ``--template`` argument and are listed in the sections below. .. _convert_html: HTML ~~~~ * ``--to html`` HTML Export. Note on backward compatibility: Be aware that if you were using custom copies of the old 5.x template files (i.e. ``--template``), you will now need to use ``--template-file path/to/old/file.tpl`` in order to use that file in compatibility mode as opposed to other options. - ``--template lab`` (default) A full static HTML render of the notebook. This looks very similar to the JupyterLab interactive view. The lab template supports the extra ``--theme`` option, which defaults to ``light``. This extra option not only allows you to use the default ``light`` or ``dark`` themes provided by JupyterLab, but it allows you to use custom themes. For example: ``pip install jupyterlab-miami-nights`` then ``--theme jupyterlab_miami_nights``. - ``--template classic`` Simplified HTML, using the classic jupyter look and feel. - ``--template basic`` Base HTML, rendering with minimal structure and styles. - ``--embed-images`` If this option is provided, embed images as base64 urls in the resulting HTML file. .. _convert_latex: LaTeX ~~~~~ * ``--to latex`` Latex export. This generates ``NOTEBOOK_NAME.tex`` file, ready for export. Images are output as .png files in a folder. - ``--template article`` (default) Latex article, derived from Sphinx's howto template. - ``--template report`` Latex report, providing a table of contents and chapters. Optionally you can specify ``authors``, ``title`` and ``date`` in the notebook's metadata. These will be used to render the header of the LaTeX document. .. code-block:: json { "authors": [ { "name": "Jane Doe" }, { "name": "John Doe" } ], "date": "January 2023", "title": "Annual Data Report 2022", "kernelspec": { }, "language_info": { } } If no date is specified, today's date will be used (i.e. the date when the document is re/compiled). Use an empty string to suppress the date. The values in the notebook can be overridden by the command line arguments ``--LatexPreprocessor.title``, ``--LatexPreprocessor.date`` and ``--LatexPreprocessor.author_names`` (specify this argument multiple times for each individual author name). .. note:: nbconvert uses pandoc_ to convert between various markup languages, so pandoc is a dependency when converting to latex or reStructuredText. .. _convert_pdf: PDF ~~~ * ``--to pdf`` Generates a PDF via latex. Supports the same templates as ``--to latex``. .. _convert_webpdf: WebPDF ~~~~~~ * ``--to webpdf`` Generates a PDF by first rendering to HTML, rendering the HTML Chromium headless, and exporting to PDF. This exporter supports the same templates as ``--to html``. The webpdf exporter requires the ``playwright`` Chromium automation library, which can be installed via ``nbconvert[webpdf]``. .. _convert_revealjs: Reveal.js HTML slideshow ~~~~~~~~~~~~~~~~~~~~~~~~ .. note:: In order to designate a mapping from notebook cells to Reveal.js slides, from within the Jupyter notebook, select menu item View --> Cell Toolbar --> Slideshow. That will reveal a drop-down menu on the upper-right of each cell. From it, one may choose from "Slide," "Sub-Slide", "Fragment", "Skip", and "Notes." On conversion, cells designated as "skip" will not be included, "notes" will be included only in presenter notes, etc. * ``--to slides`` This generates a Reveal.js HTML slideshow. Running this slideshow requires a copy of reveal.js (version 4.x). By default, this will include a script tag in the html that will directly load reveal.js from a public CDN. This means that if you include your slides on a webpage, they should work as expected. However, some features (specifically, speaker notes & timers) will not work on website because they require access to a local copy of reveal.js. Speaker notes require a local copy of reveal.js. Then, you need to tell ``nbconvert`` how to find that local copy. Timers only work if you already have speaker notes, but also require a local https server. You can read more about this in ServePostProcessorExample_. To make this clearer, let's look at an example of how to get speaker notes working with a local copy of reveal.js: SlidesWithNotesExample_. .. _SlidesWithNotesExample: Example: creating slides w/ speaker notes ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Let's suppose you have a notebook ``your_talk.ipynb`` that you want to convert to slides. For this example, we'll assume that you are working in the same directory as the notebook you want to convert (i.e., when you run ``ls .``, ``your_talk.ipynb`` shows up amongst the list of files). First, we need a copy of reveal.js in the same directory as your slides. One way to do this is to use the following commands in your terminal: .. code-block:: shell git clone https://github.com/hakimel/reveal.js.git cd reveal.js git checkout 3.5.0 cd .. Then we need to tell nbconvert to point to this local copy. To do that we use the ``--reveal-prefix`` command line flag to point to the local copy. .. code-block:: shell jupyter nbconvert your_talk.ipynb --to slides --reveal-prefix reveal.js This will create file ``your_talk.slides.html``, which you should be able to access with ``open your_talk.slides.html``. To access the speaker notes, press ``s`` after the slides load and they should open in a new window. Note: This does not enable slides that run completely offline. While you have a local copy of reveal.js, by default, the slides need to access mathjax, require, and jquery via a public CDN. Addressing this use case is an open issue and `PRs `_ are always encouraged. .. _ServePostProcessorExample: Serving slides with an https server: ``--post serve`` ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Once you have speaker notes working you may notice that your timers don't work. Timers require a bit more infrastructure; you need to serve your local copy of reveal.js from a local https server. Fortunately, ``nbconvert`` makes this fairly straightforward through the use of the ``ServePostProcessor``. To activate this server, we append the command line flag ``--post serve`` to our call to nbconvert. .. code-block:: shell jupyter nbconvert your_talk.ipynb --to slides --reveal-prefix reveal.js --post serve This will run the server, which will occupy the terminal that you ran the command in until you stop it. You can stop the server by pressing ``ctrl C`` twice. .. _convert_markdown: Markdown ~~~~~~~~ * ``--to markdown`` Simple markdown output. Markdown cells are unaffected, and code cells indented 4 spaces. Images are output as .png files in a folder. .. _convert_ascii: Ascii ~~~~~~~~ * ``--to asciidoc`` Ascii output. Images are output as .png files in a folder. .. _convert_rst: reStructuredText ~~~~~~~~~~~~~~~~ * ``--to rst`` Basic reStructuredText output. Useful as a starting point for embedding notebooks in Sphinx docs. Images are output as .png files in a folder. .. note:: nbconvert uses pandoc_ to convert between various markup languages, so pandoc is a dependency when converting to LaTeX or reStructuredText. .. _convert_script: Executable script ~~~~~~~~~~~~~~~~~ * ``--to script`` Convert a notebook to an executable script. This is the simplest way to get a Python (or other language, depending on the kernel) script out of a notebook. If there were any magics in an Jupyter notebook, this may only be executable from a Jupyter session. For example, to convert a Julia notebook to a Julia executable script:: jupyter nbconvert --to script my_julia_notebook.ipynb .. _convert_notebook: Notebook and preprocessors ~~~~~~~~~~~~~~~~~~~~~~~~~~ * ``--to notebook`` .. versionadded:: 3.0 This doesn't convert a notebook to a different format *per se*, instead it allows the running of nbconvert preprocessors on a notebook, and/or conversion to other notebook formats. For example:: jupyter nbconvert --to notebook --execute mynotebook.ipynb This will open the notebook, execute it, capture new output, and save the result in :file:`mynotebook.nbconvert.ipynb`. Specifying ``--inplace`` will overwrite the input file instead of writing a new file. By default, ``nbconvert`` will abort conversion if any exceptions occur during execution of a cell. If you specify ``--allow-errors`` (in addition to the ``--execute`` flag) then conversion will continue and the output from any exception will be included in the cell output. The following command:: jupyter nbconvert --to notebook --nbformat 3 mynotebook will create a copy of :file:`mynotebook.ipynb` in :file:`mynotebook.v3.ipynb` in version 3 of the notebook format. If you want to convert a notebook in-place, you can specify the output file to be the same as the input file:: jupyter nbconvert --to notebook mynb --output mynb Be careful with that, since it will replace the input file. .. note:: nbconvert uses pandoc_ to convert between various markup languages, so pandoc is a dependency when converting to latex or reStructuredText. .. _pandoc: https://pandoc.org/ The output file created by ``nbconvert`` will have the same base name as the notebook and will be placed in the current working directory. Any supporting files (graphics, etc) will be placed in a new directory with the same base name as the notebook, suffixed with ``_files``:: $ jupyter nbconvert notebook.ipynb $ ls notebook.ipynb notebook.html notebook_files/ For simple single-file output, such as html, markdown, etc., the output may be sent to standard output with:: $ jupyter nbconvert --to markdown notebook.ipynb --stdout Converting multiple notebooks ----------------------------- Multiple notebooks can be specified from the command line:: $ jupyter nbconvert notebook*.ipynb $ jupyter nbconvert notebook1.ipynb notebook2.ipynb or via a list in a configuration file, say ``mycfg.py``, containing the text: .. code-block:: python c = get_config() c.NbConvertApp.notebooks = ["notebook1.ipynb", "notebook2.ipynb"] and using the command:: $ jupyter nbconvert --config mycfg.py jupyter-nbconvert-5db0bfc/hatch_build.py000066400000000000000000000051321516532232300206040ustar00rootroot00000000000000"""Custom build script for hatch backend""" import os import sys from urllib.request import urlopen from hatchling.builders.hooks.plugin.interface import BuildHookInterface notebook_css_version = "5.4.0" notebook_css_url = "https://cdn.jupyter.org/notebook/%s/style/style.min.css" % notebook_css_version jupyterlab_css_version = "4.0.2" jupyterlab_css_url = ( "https://unpkg.com/@jupyterlab/nbconvert-css@%s/style/index.css" % jupyterlab_css_version ) jupyterlab_theme_light_version = "4.0.2" jupyterlab_theme_light_url = ( "https://unpkg.com/@jupyterlab/theme-light-extension@%s/style/variables.css" % jupyterlab_theme_light_version ) jupyterlab_theme_dark_version = "4.0.2" jupyterlab_theme_dark_url = ( "https://unpkg.com/@jupyterlab/theme-dark-extension@%s/style/variables.css" % jupyterlab_theme_dark_version ) template_css_urls = { "lab": [ (jupyterlab_css_url, "index.css"), (jupyterlab_theme_light_url, "theme-light.css"), (jupyterlab_theme_dark_url, "theme-dark.css"), ], "classic": [(notebook_css_url, "style.css")], } osp = os.path here = osp.abspath(osp.dirname(__file__)) templates_dir = osp.join(here, "share", "templates") def _get_css_file(template_name, url, filename): """Get a css file and download it to the templates dir""" directory = osp.join(templates_dir, template_name, "static") dest = osp.join(directory, filename) if osp.exists(dest): print("Already have CSS: %s, moving on." % dest) return if not osp.exists(directory): os.makedirs(directory) print("Downloading CSS: %s" % url) try: css = urlopen(url).read() # noqa: S310 except Exception as e: msg = f"Failed to download css from {url}: {e}" print(msg, file=sys.stderr) msg = "Need CSS to proceed." raise OSError(msg) from None return with open(dest, "wb") as f: f.write(css) print("Downloaded Notebook CSS to %s" % dest) def _get_css_files(): """Get all of the css files if necessary""" in_checkout = osp.exists(osp.abspath(osp.join(here, "..", ".git"))) if in_checkout: print("Not running from git, nothing to do") return for template_name, resources in template_css_urls.items(): for url, filename in resources: _get_css_file(template_name, url, filename) class CustomHook(BuildHookInterface): """A custom build hook for nbconvert.""" def initialize(self, version, build_data): """Initialize the hook.""" if self.target_name not in ["wheel", "sdist"]: return _get_css_files() jupyter-nbconvert-5db0bfc/nbconvert/000077500000000000000000000000001516532232300177635ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/nbconvert/__init__.py000066400000000000000000000025241516532232300220770ustar00rootroot00000000000000"""Utilities for converting notebooks to and from different formats.""" from ._version import __version__, version_info try: from . import filters, postprocessors, preprocessors, writers from .exporters import ( ASCIIDocExporter, Exporter, ExporterNameError, FilenameExtension, HTMLExporter, LatexExporter, MarkdownExporter, NotebookExporter, PDFExporter, PythonExporter, QtPDFExporter, QtPNGExporter, RSTExporter, ScriptExporter, SlidesExporter, TemplateExporter, WebPDFExporter, export, get_export_names, get_exporter, ) except ModuleNotFoundError: # We hit this condition when the package is not yet fully installed. pass __all__ = [ "ASCIIDocExporter", "Exporter", "ExporterNameError", "FilenameExtension", "HTMLExporter", "LatexExporter", "MarkdownExporter", "NotebookExporter", "PDFExporter", "PythonExporter", "QtPDFExporter", "QtPNGExporter", "RSTExporter", "ScriptExporter", "SlidesExporter", "TemplateExporter", "WebPDFExporter", "__version__", "export", "filters", "get_export_names", "get_exporter", "postprocessors", "preprocessors", "version_info", "writers", ] jupyter-nbconvert-5db0bfc/nbconvert/__main__.py000066400000000000000000000001111516532232300220460ustar00rootroot00000000000000"""nbconvert cli entry point.""" from .nbconvertapp import main main() jupyter-nbconvert-5db0bfc/nbconvert/_version.py000066400000000000000000000007241516532232300221640ustar00rootroot00000000000000"""nbconvert version info.""" import re # Version string must appear intact for versioning __version__ = "7.17.1" # Build up version_info tuple for backwards compatibility pattern = r"(?P\d+).(?P\d+).(?P\d+)(?P.*)" match = re.match(pattern, __version__) assert match is not None parts: list[object] = [int(match[part]) for part in ["major", "minor", "patch"]] if match["rest"]: parts.append(match["rest"]) version_info = tuple(parts) jupyter-nbconvert-5db0bfc/nbconvert/conftest.py000066400000000000000000000003021516532232300221550ustar00rootroot00000000000000"""pytest configuration.""" import asyncio import os if os.name == "nt": asyncio.set_event_loop_policy( asyncio.WindowsSelectorEventLoopPolicy() # type:ignore[attr-defined] ) jupyter-nbconvert-5db0bfc/nbconvert/exporters/000077500000000000000000000000001516532232300220165ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/nbconvert/exporters/__init__.py000066400000000000000000000021761516532232300241350ustar00rootroot00000000000000from .asciidoc import ASCIIDocExporter from .base import ExporterDisabledError, ExporterNameError, export, get_export_names, get_exporter from .exporter import Exporter, FilenameExtension, ResourcesDict from .html import HTMLExporter from .latex import LatexExporter from .markdown import MarkdownExporter from .notebook import NotebookExporter from .pdf import PDFExporter from .python import PythonExporter from .qtpdf import QtPDFExporter from .qtpng import QtPNGExporter from .rst import RSTExporter from .script import ScriptExporter from .slides import SlidesExporter from .templateexporter import TemplateExporter from .webpdf import WebPDFExporter __all__ = [ "ASCIIDocExporter", "Exporter", "ExporterDisabledError", "ExporterNameError", "FilenameExtension", "HTMLExporter", "LatexExporter", "MarkdownExporter", "NotebookExporter", "PDFExporter", "PythonExporter", "QtPDFExporter", "QtPNGExporter", "RSTExporter", "ResourcesDict", "ScriptExporter", "SlidesExporter", "TemplateExporter", "WebPDFExporter", "export", "get_export_names", "get_exporter", ] jupyter-nbconvert-5db0bfc/nbconvert/exporters/asciidoc.py000066400000000000000000000027721516532232300241560ustar00rootroot00000000000000"""ASCIIDoc Exporter class""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. from traitlets import default from traitlets.config import Config from .templateexporter import TemplateExporter class ASCIIDocExporter(TemplateExporter): """ Exports to an ASCIIDoc document (.asciidoc) """ @default("file_extension") def _file_extension_default(self): return ".asciidoc" @default("template_name") def _template_name_default(self): return "asciidoc" output_mimetype = "text/asciidoc" export_from_notebook = "AsciiDoc" @default("raw_mimetypes") def _raw_mimetypes_default(self): return ["text/asciidoc/", "text/markdown", "text/html", ""] @property def default_config(self): c = Config( { "NbConvertBase": { "display_data_priority": [ "text/html", "text/markdown", "image/svg+xml", "image/png", "image/jpeg", "text/plain", "text/latex", ] }, "ExtractOutputPreprocessor": {"enabled": True}, "HighlightMagicsPreprocessor": {"enabled": True}, } ) if super().default_config: c2 = super().default_config.copy() c2.merge(c) c = c2 return c jupyter-nbconvert-5db0bfc/nbconvert/exporters/base.py000066400000000000000000000116551516532232300233120ustar00rootroot00000000000000"""Module containing single call export functions.""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. import os import sys if sys.version_info < (3, 10): from importlib_metadata import entry_points # type:ignore[import-not-found] else: from importlib.metadata import entry_points from nbformat import NotebookNode from traitlets.config import get_config from traitlets.log import get_logger from traitlets.utils.importstring import import_item from .exporter import Exporter # ----------------------------------------------------------------------------- # Functions # ----------------------------------------------------------------------------- __all__ = [ "Exporter", "ExporterNameError", "export", "get_export_names", "get_exporter", ] class ExporterNameError(NameError): """An exporter name error.""" class ExporterDisabledError(ValueError): """An exporter disabled error.""" def export(exporter, nb, **kw): """ Export a notebook object using specific exporter class. Parameters ---------- exporter : ``Exporter`` class or instance Class or instance of the exporter that should be used. If the method initializes its own instance of the class, it is ASSUMED that the class type provided exposes a constructor (``__init__``) with the same signature as the base Exporter class. nb : :class:`~nbformat.NotebookNode` The notebook to export. config : config (optional, keyword arg) User configuration instance. resources : dict (optional, keyword arg) Resources used in the conversion process. Returns ------- tuple output : str The resulting converted notebook. resources : dictionary Dictionary of resources used prior to and during the conversion process. """ # Check arguments if exporter is None: msg = "Exporter is None" raise TypeError(msg) if not isinstance(exporter, Exporter) and not issubclass(exporter, Exporter): msg = "exporter does not inherit from Exporter (base)" raise TypeError(msg) if nb is None: msg = "nb is None" raise TypeError(msg) # Create the exporter resources = kw.pop("resources", None) exporter_instance = exporter if isinstance(exporter, Exporter) else exporter(**kw) # Try to convert the notebook using the appropriate conversion function. if isinstance(nb, NotebookNode): output, resources = exporter_instance.from_notebook_node(nb, resources) elif isinstance(nb, (str,)): output, resources = exporter_instance.from_filename(nb, resources) else: output, resources = exporter_instance.from_file(nb, resources) return output, resources def get_exporter(name, config=None): """Given an exporter name or import path, return a class ready to be instantiated Raises ExporterName if exporter is not found or ExporterDisabledError if not enabled """ if config is None: config = get_config() if name == "ipynb": name = "notebook" try: exporters = entry_points(group="nbconvert.exporters") items = [e for e in exporters if e.name == name or e.name == name.lower()] exporter = items[0].load() if getattr(exporter(config=config), "enabled", True): return exporter raise ExporterDisabledError('Exporter "%s" disabled in configuration' % (name)) except IndexError: pass if "." in name: try: exporter = import_item(name) if getattr(exporter(config=config), "enabled", True): return exporter raise ExporterDisabledError('Exporter "%s" disabled in configuration' % (name)) except ImportError: log = get_logger() log.error("Error importing %s", name, exc_info=True) # noqa: G201 msg = 'Unknown exporter "{}", did you mean one of: {}?'.format( name, ", ".join(get_export_names()) ) raise ExporterNameError(msg) def get_export_names(config=None): """Return a list of the currently supported export targets Exporters can be found in external packages by registering them as an nbconvert.exporter entrypoint. """ exporters = sorted(e.name for e in entry_points(group="nbconvert.exporters")) if os.environ.get("NBCONVERT_DISABLE_CONFIG_EXPORTERS"): get_logger().info( "Config exporter loading disabled, no additional exporters will be automatically included." ) return exporters if config is None: config = get_config() enabled_exporters = [] for exporter_name in exporters: try: e = get_exporter(exporter_name)(config=config) if e.enabled: enabled_exporters.append(exporter_name) except (ExporterDisabledError, ValueError): pass return enabled_exporters jupyter-nbconvert-5db0bfc/nbconvert/exporters/exporter.py000066400000000000000000000311151516532232300242410ustar00rootroot00000000000000"""This module defines a base Exporter class. For Jinja template-based export, see templateexporter.py. """ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. from __future__ import annotations import collections import copy import datetime import os import sys import typing as t import nbformat from nbformat import NotebookNode, validator from traitlets import Bool, HasTraits, List, TraitError, Unicode from traitlets.config import Config from traitlets.config.configurable import LoggingConfigurable from traitlets.utils.importstring import import_item class ResourcesDict(collections.defaultdict): # type:ignore[type-arg] """A default dict for resources.""" def __missing__(self, key): """Handle missing value.""" return "" class FilenameExtension(Unicode): # type:ignore[type-arg] """A trait for filename extensions.""" default_value = "" info_text = "a filename extension, beginning with a dot" def validate(self, obj, value): """Validate the file name.""" # cast to proper unicode value = super().validate(obj, value) # check that it starts with a dot if value and not value.startswith("."): msg = "FileExtension trait '{}' does not begin with a dot: {!r}" raise TraitError(msg.format(self.name, value)) return value class Exporter(LoggingConfigurable): """ Class containing methods that sequentially run a list of preprocessors on a NotebookNode object and then return the modified NotebookNode object and accompanying resources dict. """ enabled = Bool(True, help="Disable this exporter (and any exporters inherited from it).").tag( config=True ) file_extension = FilenameExtension( help="Extension of the file that should be written to disk" ).tag(config=True) optimistic_validation = Bool( False, help="Reduces the number of validation steps so that it only occurs after all preprocesors have run.", ).tag(config=True) # MIME type of the result file, for HTTP response headers. # This is *not* a traitlet, because we want to be able to access it from # the class, not just on instances. output_mimetype = "" # Should this converter be accessible from the notebook front-end? # If so, should be a friendly name to display (and possibly translated). export_from_notebook: str = None # type:ignore[assignment] # Configurability, allows the user to easily add filters and preprocessors. preprocessors: List[t.Any] = List( help="""List of preprocessors, by name or namespace, to enable.""" ).tag(config=True) _preprocessors: List[t.Any] = List() default_preprocessors: List[t.Any] = List( [ "nbconvert.preprocessors.TagRemovePreprocessor", "nbconvert.preprocessors.RegexRemovePreprocessor", "nbconvert.preprocessors.ClearOutputPreprocessor", "nbconvert.preprocessors.CoalesceStreamsPreprocessor", "nbconvert.preprocessors.ExecutePreprocessor", "nbconvert.preprocessors.SVG2PDFPreprocessor", "nbconvert.preprocessors.LatexPreprocessor", "nbconvert.preprocessors.HighlightMagicsPreprocessor", "nbconvert.preprocessors.ExtractOutputPreprocessor", "nbconvert.preprocessors.ExtractAttachmentsPreprocessor", "nbconvert.preprocessors.ClearMetadataPreprocessor", ], help="""List of preprocessors available by default, by name, namespace, instance, or type.""", ).tag(config=True) def __init__(self, config=None, **kw): """ Public constructor Parameters ---------- config : ``traitlets.config.Config`` User configuration instance. `**kw` Additional keyword arguments passed to parent __init__ """ with_default_config = self.default_config if config: with_default_config.merge(config) super().__init__(config=with_default_config, **kw) self._init_preprocessors() self._nb_metadata = {} @property def default_config(self): return Config() def from_notebook_node( self, nb: NotebookNode, resources: t.Any | None = None, **kw: t.Any ) -> tuple[NotebookNode, dict[str, t.Any]]: """ Convert a notebook from a notebook node instance. Parameters ---------- nb : :class:`~nbformat.NotebookNode` Notebook node (dict-like with attr-access) resources : dict Additional resources that can be accessed read/write by preprocessors and filters. `**kw` Ignored """ nb_copy = copy.deepcopy(nb) resources = self._init_resources(resources) if "language" in nb["metadata"]: resources["language"] = nb["metadata"]["language"].lower() # Preprocess nb_copy, resources = self._preprocess(nb_copy, resources) notebook_name = "" if resources is not None: name = resources.get("metadata", {}).get("name", "") path = resources.get("metadata", {}).get("path", "") notebook_name = os.path.join(path, name) self._nb_metadata[notebook_name] = nb_copy.metadata return nb_copy, resources def from_filename( self, filename: str, resources: dict[str, t.Any] | None = None, **kw: t.Any ) -> tuple[NotebookNode, dict[str, t.Any]]: """ Convert a notebook from a notebook file. Parameters ---------- filename : str Full filename of the notebook file to open and convert. resources : dict Additional resources that can be accessed read/write by preprocessors and filters. `**kw` Ignored """ # Pull the metadata from the filesystem. if resources is None: resources = ResourcesDict() if "metadata" not in resources or resources["metadata"] == "": resources["metadata"] = ResourcesDict() path, basename = os.path.split(filename) notebook_name = os.path.splitext(basename)[0] resources["metadata"]["name"] = notebook_name resources["metadata"]["path"] = path modified_date = datetime.datetime.fromtimestamp( os.path.getmtime(filename), tz=datetime.timezone.utc ) # datetime.strftime date format for ipython if sys.platform == "win32": date_format = "%B %d, %Y" else: date_format = "%B %-d, %Y" resources["metadata"]["modified_date"] = modified_date.strftime(date_format) with open(filename, encoding="utf-8") as f: return self.from_file(f, resources=resources, **kw) def from_file( self, file_stream: t.Any, resources: dict[str, t.Any] | None = None, **kw: t.Any ) -> tuple[NotebookNode, dict[str, t.Any]]: """ Convert a notebook from a notebook file. Parameters ---------- file_stream : file-like object Notebook file-like object to convert. resources : dict Additional resources that can be accessed read/write by preprocessors and filters. `**kw` Ignored """ return self.from_notebook_node( nbformat.read(file_stream, as_version=4), resources=resources, **kw ) def register_preprocessor(self, preprocessor, enabled=False): """ Register a preprocessor. Preprocessors are classes that act upon the notebook before it is passed into the Jinja templating engine. Preprocessors are also capable of passing additional information to the Jinja templating engine. Parameters ---------- preprocessor : `nbconvert.preprocessors.Preprocessor` A dotted module name, a type, or an instance enabled : bool Mark the preprocessor as enabled """ if preprocessor is None: msg = "preprocessor must not be None" raise TypeError(msg) isclass = isinstance(preprocessor, type) constructed = not isclass # Handle preprocessor's registration based on it's type if constructed and isinstance( preprocessor, str, ): # Preprocessor is a string, import the namespace and recursively call # this register_preprocessor method preprocessor_cls = import_item(preprocessor) return self.register_preprocessor(preprocessor_cls, enabled) if constructed and callable(preprocessor): # Preprocessor is a function, no need to construct it. # Register and return the preprocessor. if enabled: preprocessor.enabled = True self._preprocessors.append(preprocessor) return preprocessor if isclass and issubclass(preprocessor, HasTraits): # Preprocessor is configurable. Make sure to pass in new default for # the enabled flag if one was specified. self.register_preprocessor(preprocessor(parent=self), enabled) return None if isclass: # Preprocessor is not configurable, construct it self.register_preprocessor(preprocessor(), enabled) return None # Preprocessor is an instance of something without a __call__ # attribute. raise TypeError( "preprocessor must be callable or an importable constructor, got %r" % preprocessor ) def _init_preprocessors(self): """ Register all of the preprocessors needed for this exporter, disabled unless specified explicitly. """ self._preprocessors = [] # Load default preprocessors (not necessarily enabled by default). for preprocessor in self.default_preprocessors: self.register_preprocessor(preprocessor) # Load user-specified preprocessors. Enable by default. for preprocessor in self.preprocessors: self.register_preprocessor(preprocessor, enabled=True) def _init_resources(self, resources): # Make sure the resources dict is of ResourcesDict type. if resources is None: resources = ResourcesDict() if not isinstance(resources, ResourcesDict): new_resources = ResourcesDict() new_resources.update(resources) resources = new_resources # Make sure the metadata extension exists in resources if "metadata" in resources: if not isinstance(resources["metadata"], ResourcesDict): new_metadata = ResourcesDict() new_metadata.update(resources["metadata"]) resources["metadata"] = new_metadata else: resources["metadata"] = ResourcesDict() if not resources["metadata"]["name"]: resources["metadata"]["name"] = "Notebook" # Set the output extension resources["output_extension"] = self.file_extension return resources def _validate_preprocessor(self, nbc, preprocessor): try: nbformat.validate(nbc, relax_add_props=True) except nbformat.ValidationError: self.log.error("Notebook is invalid after preprocessor %s", preprocessor) raise def _preprocess(self, nb, resources): """ Preprocess the notebook before passing it into the Jinja engine. To preprocess the notebook is to successively apply all the enabled preprocessors. Output from each preprocessor is passed along to the next one. Parameters ---------- nb : notebook node notebook that is being exported. resources : a dict of additional resources that can be accessed read/write by preprocessors """ # Do a copy.deepcopy first, # we are never safe enough with what the preprocessors could do. nbc = copy.deepcopy(nb) resc = copy.deepcopy(resources) if hasattr(validator, "normalize"): _, nbc = validator.normalize(nbc) # Run each preprocessor on the notebook. Carry the output along # to each preprocessor for preprocessor in self._preprocessors: nbc, resc = preprocessor(nbc, resc) if not self.optimistic_validation: self._validate_preprocessor(nbc, preprocessor) if self.optimistic_validation: self._validate_preprocessor(nbc, preprocessor) return nbc, resc jupyter-nbconvert-5db0bfc/nbconvert/exporters/html.py000066400000000000000000000334741516532232300233470ustar00rootroot00000000000000"""HTML Exporter class""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. import base64 import json import mimetypes import os from pathlib import Path from typing import Any, Optional import jinja2 import markupsafe from bs4 import BeautifulSoup # type: ignore[import-not-found] from jupyter_core.paths import jupyter_path from traitlets import Bool, Dict, Unicode, default, validate from traitlets.config import Config if tuple(int(x) for x in jinja2.__version__.split(".")[:3]) < (3, 0, 0): from jinja2 import contextfilter # type:ignore[attr-defined] else: from jinja2 import pass_context as contextfilter from jinja2.loaders import split_template_path from nbformat import NotebookNode from nbconvert.filters.highlight import Highlight2HTML from nbconvert.filters.markdown_mistune import IPythonRenderer, MarkdownWithMath from nbconvert.filters.widgetsdatatypefilter import WidgetsDataTypeFilter from nbconvert.utils.iso639_1 import iso639_1 from .templateexporter import TemplateExporter def find_lab_theme(theme_name): """ Find a JupyterLab theme location by name. Parameters ---------- theme_name : str The name of the labextension theme you want to find. Raises ------ ValueError If the theme was not found, or if it was not specific enough. Returns ------- theme_name: str Full theme name (with scope, if any) labextension_path : Path The path to the found labextension on the system. """ paths = jupyter_path("labextensions") matching_themes = [] theme_path = None for path in paths: for dirpath, dirnames, filenames in os.walk(path): # If it's a federated labextension that contains themes if "package.json" in filenames and "themes" in dirnames: # TODO Find the theme name in the JS code instead? # TODO Find if it's a light or dark theme? with open(Path(dirpath) / "package.json", encoding="utf-8") as fobj: labext_name = json.loads(fobj.read())["name"] if labext_name == theme_name or theme_name in labext_name.split("/"): matching_themes.append(labext_name) full_theme_name = labext_name theme_path = Path(dirpath) / "themes" / labext_name if len(matching_themes) == 0: msg = f'Could not find lab theme "{theme_name}"' raise ValueError(msg) if len(matching_themes) > 1: msg = ( f'Found multiple themes matching "{theme_name}": {matching_themes}. ' "Please be more specific about which theme you want to use." ) raise ValueError(msg) return full_theme_name, theme_path class HTMLExporter(TemplateExporter): """ Exports a basic HTML document. This exporter assists with the export of HTML. Inherit from it if you are writing your own HTML template and need custom preprocessors/filters. If you don't need custom preprocessors/ filters, just change the 'template_file' config option. """ export_from_notebook = "HTML" anchor_link_text = Unicode("¶", help="The text used as the text for anchor links.").tag( config=True ) exclude_anchor_links = Bool(False, help="If anchor links should be included or not.").tag( config=True ) require_js_url = Unicode( "https://cdnjs.cloudflare.com/ajax/libs/require.js/2.1.10/require.min.js", help=""" URL to load require.js from. Defaults to loading from cdnjs. """, ).tag(config=True) mathjax_url = Unicode( "https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.7/latest.js?config=TeX-AMS_CHTML-full,Safe", help=""" URL to load Mathjax from. Defaults to loading from cdnjs. """, ).tag(config=True) mermaid_js_url = Unicode( "https://cdnjs.cloudflare.com/ajax/libs/mermaid/11.10.0/mermaid.esm.min.mjs", help=""" URL to load MermaidJS from. Defaults to loading from cdnjs. """, ) mermaid_layout_elk_js_url = Unicode( "https://cdnjs.cloudflare.com/ajax/libs/mermaid-layout-elk/0.1.9/mermaid-layout-elk.esm.min.mjs", help=""" URL to load MermaidJS ELK layout from. Defaults to loading from cdnjs. """, ) jquery_url = Unicode( "https://cdnjs.cloudflare.com/ajax/libs/jquery/2.0.3/jquery.min.js", help=""" URL to load jQuery from. Defaults to loading from cdnjs. """, ).tag(config=True) jupyter_widgets_base_url = Unicode( "https://unpkg.com/", help="URL base for Jupyter widgets" ).tag(config=True) widget_renderer_url = Unicode("", help="Full URL for Jupyter widgets").tag(config=True) html_manager_semver_range = Unicode( "*", help="Semver range for Jupyter widgets HTML manager" ).tag(config=True) @default("file_extension") def _file_extension_default(self): return ".html" @default("template_name") def _template_name_default(self): return "lab" theme = Unicode( "light", help="Template specific theme(e.g. the name of a JupyterLab CSS theme distributed as prebuilt extension for the lab template)", ).tag(config=True) sanitize_html = Bool( False, help=( "Whether the HTML in Markdown cells and cell outputs should be sanitized." "This should be set to True by nbviewer or similar tools." ), ).tag(config=True) skip_svg_encoding = Bool( False, help=("Whether the svg to image data attribute encoding should occur"), ).tag(config=True) embed_images = Bool( False, help="Whether or not to embed images as base64 in markdown cells." ).tag(config=True) output_mimetype = "text/html" lexer_options = Dict( {}, help=( "Options to be passed to the pygments lexer for highlighting markdown code blocks. " "See https://pygments.org/docs/lexers/#available-lexers for available options." ), ).tag(config=True) @property def default_config(self): c = Config( { "NbConvertBase": { "display_data_priority": [ "application/vnd.jupyter.widget-view+json", "application/javascript", "text/html", "text/markdown", "image/svg+xml", "text/vnd.mermaid", "text/latex", "image/png", "image/jpeg", "text/plain", ] }, "HighlightMagicsPreprocessor": {"enabled": True}, } ) if super().default_config: c2 = super().default_config.copy() c2.merge(c) c = c2 return c language_code = Unicode( "en", help="Language code of the content, should be one of the ISO639-1" ).tag(config=True) @validate("language_code") def _valid_language_code(self, proposal): if self.language_code not in iso639_1: self.log.warning( '"%s" is not an ISO 639-1 language code. ' 'It has been replaced by the default value "en".', self.language_code, ) return proposal["trait"].default_value return proposal["value"] @contextfilter def markdown2html(self, context, source): """Markdown to HTML filter respecting the anchor_link_text setting""" cell = context.get("cell", {}) attachments = cell.get("attachments", {}) path = context.get("resources", {}).get("metadata", {}).get("path", "") renderer = IPythonRenderer( escape=False, attachments=attachments, embed_images=self.embed_images, path=path, anchor_link_text=self.anchor_link_text, exclude_anchor_links=self.exclude_anchor_links, **self.lexer_options, ) return MarkdownWithMath(renderer=renderer).render(source) def default_filters(self): """Get the default filters.""" yield from super().default_filters() yield ("markdown2html", self.markdown2html) def from_notebook_node( # type:ignore[override] self, nb: NotebookNode, resources: Optional[dict[str, Any]] = None, **kw: Any ) -> tuple[str, dict[str, Any]]: """Convert from notebook node.""" langinfo = nb.metadata.get("language_info", {}) lexer = langinfo.get("pygments_lexer", langinfo.get("name", None)) highlight_code = self.filters.get( "highlight_code", Highlight2HTML(pygments_lexer=lexer, parent=self) ) resources = self._init_resources(resources) filter_data_type = WidgetsDataTypeFilter( notebook_metadata=self._nb_metadata, parent=self, resources=resources ) self.register_filter("highlight_code", highlight_code) self.register_filter("filter_data_type", filter_data_type) html, resources = super().from_notebook_node(nb, resources, **kw) soup = BeautifulSoup(html, features="html.parser") # Add image's alternative text missing_alt = 0 for elem in soup.select("img:not([alt])"): elem.attrs["alt"] = "No description has been provided for this image" missing_alt += 1 if missing_alt: self.log.warning("Alternative text is missing on %s image(s).", missing_alt) # Set input and output focusable for elem in soup.select(".jp-Notebook div.jp-Cell-inputWrapper"): elem.attrs["tabindex"] = "0" for elem in soup.select(".jp-Notebook div.jp-OutputArea-output"): elem.attrs["tabindex"] = "0" return str(soup), resources def _init_resources(self, resources): def resources_include_css(name): env = self.environment code = """""" % (env.loader.get_source(env, name)[0]) return markupsafe.Markup(code) # noqa:S704 def resources_include_lab_theme(name): # Try to find the theme with the given name, looking through the labextensions _, theme_path = find_lab_theme(name) with open(theme_path / "index.css") as file: data = file.read() # Embed assets (fonts, images...) for asset in os.listdir(theme_path): local_url = f"url({Path(asset).as_posix()})" if local_url in data: mime_type = mimetypes.guess_type(asset)[0] # Replace asset url by a base64 dataurl with open(theme_path / asset, "rb") as assetfile: base64_data = base64.b64encode(assetfile.read()) base64_str = base64_data.replace(b"\n", b"").decode("ascii") data = data.replace(local_url, f"url(data:{mime_type};base64,{base64_str})") code = """""" % data return markupsafe.Markup(code) # noqa:S704 def resources_include_js(name, module=False): """Get the resources include JS for a name. If module=True, import as ES module""" env = self.environment code = f"""""" return markupsafe.Markup(code) # noqa:S704 def resources_include_url(name): """Get the resources include url for a name.""" env = self.environment mime_type, _encoding = mimetypes.guess_type(name) try: # we try to load via the jinja loader, but that tries to load # as (encoded) text data = env.loader.get_source(env, name)[0].encode("utf8") except UnicodeDecodeError: # if that fails (for instance a binary file, png or ttf) # we mimic jinja2 pieces = split_template_path(name) for searchpath in self.template_paths: filename = os.path.join(searchpath, *pieces) if os.path.exists(filename): with open(filename, "rb") as f: data = f.read() break else: msg = f"No file {name!r} found in {searchpath!r}" raise ValueError(msg) data = base64.b64encode(data) data = data.replace(b"\n", b"").decode("ascii") src = f"data:{mime_type};base64,{data}" return markupsafe.Markup(src) # noqa:S704 resources = super()._init_resources(resources) resources["theme"] = self.theme resources["include_css"] = resources_include_css resources["include_lab_theme"] = resources_include_lab_theme resources["include_js"] = resources_include_js resources["include_url"] = resources_include_url resources["require_js_url"] = self.require_js_url resources["mathjax_url"] = self.mathjax_url resources["mermaid_js_url"] = self.mermaid_js_url resources["mermaid_layout_elk_js_url"] = self.mermaid_layout_elk_js_url resources["jquery_url"] = self.jquery_url resources["jupyter_widgets_base_url"] = self.jupyter_widgets_base_url resources["widget_renderer_url"] = self.widget_renderer_url resources["html_manager_semver_range"] = self.html_manager_semver_range resources["should_sanitize_html"] = self.sanitize_html resources["language_code"] = self.language_code resources["should_not_encode_svg"] = self.skip_svg_encoding return resources jupyter-nbconvert-5db0bfc/nbconvert/exporters/latex.py000066400000000000000000000074071516532232300235150ustar00rootroot00000000000000"""LaTeX Exporter class""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. import os from traitlets import default from traitlets.config import Config from nbconvert.filters.filter_links import resolve_references from nbconvert.filters.highlight import Highlight2Latex from nbconvert.filters.pandoc import ConvertExplicitlyRelativePaths from .templateexporter import TemplateExporter class LatexExporter(TemplateExporter): """ Exports to a Latex template. Inherit from this class if your template is LaTeX based and you need custom transformers/filters. If you don't need custom transformers/filters, just change the 'template_file' config option. Place your template in the special "/latex" subfolder of the "../templates" folder. """ export_from_notebook = "LaTeX" @default("file_extension") def _file_extension_default(self): return ".tex" @default("template_name") def _template_name_default(self): return "latex" output_mimetype = "text/latex" def default_filters(self): """Get the default filters.""" yield from super().default_filters() yield ("resolve_references", resolve_references) @property def default_config(self): c = Config( { "NbConvertBase": { "display_data_priority": [ "text/latex", "application/pdf", "image/png", "image/jpeg", "image/svg+xml", "text/markdown", "text/plain", ] }, "ExtractAttachmentsPreprocessor": {"enabled": True}, "ExtractOutputPreprocessor": {"enabled": True}, "SVG2PDFPreprocessor": {"enabled": True}, "LatexPreprocessor": {"enabled": True}, "SphinxPreprocessor": {"enabled": True}, "HighlightMagicsPreprocessor": {"enabled": True}, } ) if super().default_config: c2 = super().default_config.copy() c2.merge(c) c = c2 return c def from_notebook_node(self, nb, resources=None, **kw): """Convert from notebook node.""" langinfo = nb.metadata.get("language_info", {}) lexer = langinfo.get("pygments_lexer", langinfo.get("name", None)) highlight_code = self.filters.get( "highlight_code", Highlight2Latex(pygments_lexer=lexer, parent=self) ) self.register_filter("highlight_code", highlight_code) # Need to make sure explicit relative paths are visible to latex for pdf conversion # https://github.com/jupyter/nbconvert/issues/1998 nb_path = resources.get("metadata", {}).get("path") if resources else None texinputs = os.path.abspath(nb_path) if nb_path else os.getcwd() convert_explicitly_relative_paths = self.filters.get( "convert_explicitly_relative_paths", ConvertExplicitlyRelativePaths(texinputs=texinputs, parent=self), ) self.register_filter("convert_explicitly_relative_paths", convert_explicitly_relative_paths) return super().from_notebook_node(nb, resources, **kw) def _create_environment(self): environment = super()._create_environment() # Set special Jinja2 syntax that will not conflict with latex. environment.block_start_string = "((*" environment.block_end_string = "*))" environment.variable_start_string = "(((" environment.variable_end_string = ")))" environment.comment_start_string = "((=" environment.comment_end_string = "=))" return environment jupyter-nbconvert-5db0bfc/nbconvert/exporters/markdown.py000066400000000000000000000030411516532232300242100ustar00rootroot00000000000000"""Markdown Exporter class""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. from traitlets import default from traitlets.config import Config from .templateexporter import TemplateExporter class MarkdownExporter(TemplateExporter): """ Exports to a markdown document (.md) """ export_from_notebook = "Markdown" @default("file_extension") def _file_extension_default(self): return ".md" @default("template_name") def _template_name_default(self): return "markdown" output_mimetype = "text/markdown" @default("raw_mimetypes") def _raw_mimetypes_default(self): return ["text/markdown", "text/html", ""] @property def default_config(self): c = Config( { "ExtractAttachmentsPreprocessor": {"enabled": True}, "ExtractOutputPreprocessor": {"enabled": True}, "NbConvertBase": { "display_data_priority": [ "text/html", "text/markdown", "image/svg+xml", "text/latex", "image/png", "image/jpeg", "text/plain", ] }, "HighlightMagicsPreprocessor": {"enabled": True}, } ) if super().default_config: c2 = super().default_config.copy() c2.merge(c) c = c2 return c jupyter-nbconvert-5db0bfc/nbconvert/exporters/notebook.py000066400000000000000000000026171516532232300242160ustar00rootroot00000000000000"""NotebookExporter class""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import nbformat from traitlets import Enum, default from .exporter import Exporter class NotebookExporter(Exporter): """Exports to an IPython notebook. This is useful when you want to use nbconvert's preprocessors to operate on a notebook (e.g. to execute it) and then write it back to a notebook file. """ nbformat_version = Enum( list(nbformat.versions), default_value=nbformat.current_nbformat, help="""The nbformat version to write. Use this to downgrade notebooks. """, ).tag(config=True) @default("file_extension") def _file_extension_default(self): return ".ipynb" output_mimetype = "application/json" export_from_notebook = "Notebook" def from_notebook_node(self, nb, resources=None, **kw): """Convert from notebook node.""" nb_copy, resources = super().from_notebook_node(nb, resources, **kw) if self.nbformat_version != nb_copy.nbformat: resources["output_suffix"] = ".v%i" % self.nbformat_version else: resources["output_suffix"] = ".nbconvert" output = nbformat.writes(nb_copy, version=self.nbformat_version) if not output.endswith("\n"): output = output + "\n" return output, resources jupyter-nbconvert-5db0bfc/nbconvert/exporters/pdf.py000066400000000000000000000173741516532232300231550ustar00rootroot00000000000000"""Export to PDF via latex""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from __future__ import annotations import os import shutil import subprocess import sys from tempfile import TemporaryDirectory from traitlets import Bool, Instance, Integer, List, Unicode, default from nbconvert.utils import _contextlib_chdir from .latex import LatexExporter class LatexFailed(IOError): """Exception for failed latex run Captured latex output is in error.output. """ def __init__(self, output): """Initialize the error.""" self.output = output def __unicode__(self): """Unicode representation.""" return "PDF creating failed, captured latex output:\n%s" % self.output def __str__(self): """String representation.""" return self.__unicode__() def prepend_to_env_search_path(varname, value, envdict): """Add value to the environment variable varname in envdict e.g. prepend_to_env_search_path('BIBINPUTS', '/home/sally/foo', os.environ) """ if not value: return # Nothing to add envdict[varname] = value + os.pathsep + envdict.get(varname, "") class PDFExporter(LatexExporter): """Writer designed to write to PDF files. This inherits from `LatexExporter`. It creates a LaTeX file in a temporary directory using the template machinery, and then runs LaTeX to create a pdf. """ export_from_notebook = "PDF via LaTeX" latex_count = Integer(3, help="How many times latex will be called.").tag(config=True) latex_command = List( ["xelatex", "{filename}", "-quiet"], help="Shell command used to compile latex." ).tag(config=True) bib_command = List(["bibtex", "{filename}"], help="Shell command used to run bibtex.").tag( config=True ) verbose = Bool(False, help="Whether to display the output of latex commands.").tag(config=True) texinputs = Unicode(help="texinputs dir. A notebook's directory is added") writer = Instance("nbconvert.writers.FilesWriter", args=(), kw={"build_directory": "."}) output_mimetype = "application/pdf" _captured_output = List(Unicode()) @default("file_extension") def _file_extension_default(self): return ".pdf" @default("template_extension") def _template_extension_default(self): return ".tex.j2" def run_command(self, command_list, filename, count, log_function, raise_on_failure=None): """Run command_list count times. Parameters ---------- command_list : list A list of args to provide to Popen. Each element of this list will be interpolated with the filename to convert. filename : unicode The name of the file to convert. count : int How many times to run the command. raise_on_failure: Exception class (default None) If provided, will raise the given exception for if an instead of returning False on command failure. Returns ------- success : bool A boolean indicating if the command was successful (True) or failed (False). """ command = [c.format(filename=filename) for c in command_list] # This will throw a clearer error if the command is not found cmd = shutil.which(command_list[0]) if cmd is None: link = "https://nbconvert.readthedocs.io/en/latest/install.html#installing-tex" msg = ( f"{command_list[0]} not found on PATH, if you have not installed " f"{command_list[0]} you may need to do so. Find further instructions " f"at {link}." ) raise OSError(msg) times = "time" if count == 1 else "times" self.log.info("Running %s %i %s: %s", command_list[0], count, times, command) shell = sys.platform == "win32" if shell: command = subprocess.list2cmdline(command) # type:ignore[assignment] env = os.environ.copy() prepend_to_env_search_path("TEXINPUTS", self.texinputs, env) prepend_to_env_search_path("BIBINPUTS", self.texinputs, env) prepend_to_env_search_path("BSTINPUTS", self.texinputs, env) with open(os.devnull, "rb") as null: stdout = subprocess.PIPE if not self.verbose else None for _ in range(count): p = subprocess.Popen( # noqa: S603 command, stdout=stdout, stderr=subprocess.STDOUT, stdin=null, shell=shell, env=env, ) out, _ = p.communicate() if p.returncode: if self.verbose: # noqa: SIM108 # verbose means I didn't capture stdout with PIPE, # so it's already been displayed and `out` is None. out_str = "" else: out_str = out.decode("utf-8", "replace") log_function(command, out) self._captured_output.append(out_str) if raise_on_failure: msg = f'Failed to run "{command}" command:\n{out_str}' raise raise_on_failure(msg) return False # failure return True # success def run_latex(self, filename, raise_on_failure=LatexFailed): """Run xelatex self.latex_count times.""" def log_error(command, out): self.log.critical("%s failed: %s\n%s", command[0], command, out) return self.run_command( self.latex_command, filename, self.latex_count, log_error, raise_on_failure ) def run_bib(self, filename, raise_on_failure=False): """Run bibtex one time.""" filename = os.path.splitext(filename)[0] def log_error(command, out): self.log.warning( "%s had problems, most likely because there were no citations", command[0] ) self.log.debug("%s output: %s\n%s", command[0], command, out) return self.run_command(self.bib_command, filename, 1, log_error, raise_on_failure) def from_notebook_node(self, nb, resources=None, **kw): """Convert from notebook node.""" latex, resources = super().from_notebook_node(nb, resources=resources, **kw) # set texinputs directory, so that local files will be found if resources and resources.get("metadata", {}).get("path"): self.texinputs = os.path.abspath(resources["metadata"]["path"]) else: self.texinputs = os.getcwd() self._captured_outputs = [] with TemporaryDirectory() as td, _contextlib_chdir.chdir(td): notebook_name = "notebook" resources["output_extension"] = ".tex" tex_file = self.writer.write(latex, resources, notebook_name=notebook_name) self.log.info("Building PDF") self.run_latex(tex_file) if self.run_bib(tex_file): self.run_latex(tex_file) pdf_file = notebook_name + ".pdf" if not os.path.isfile(pdf_file): raise LatexFailed("\n".join(self._captured_output)) self.log.info("PDF successfully created") with open(pdf_file, "rb") as f: pdf_data = f.read() # convert output extension to pdf # the writer above required it to be tex resources["output_extension"] = ".pdf" # clear figure outputs and attachments, extracted by latex export, # so we don't claim to be a multi-file export. resources.pop("outputs", None) resources.pop("attachments", None) return pdf_data, resources jupyter-nbconvert-5db0bfc/nbconvert/exporters/python.py000066400000000000000000000012431516532232300237110ustar00rootroot00000000000000"""Python script Exporter class""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. from traitlets import default from .templateexporter import TemplateExporter class PythonExporter(TemplateExporter): """ Exports a Python code file. Note that the file produced will have a shebang of '#!/usr/bin/env python' regardless of the actual python version used in the notebook. """ @default("file_extension") def _file_extension_default(self): return ".py" @default("template_name") def _template_name_default(self): return "python" output_mimetype = "text/x-python" jupyter-nbconvert-5db0bfc/nbconvert/exporters/qt_exporter.py000066400000000000000000000056671516532232300247620ustar00rootroot00000000000000"""A qt exporter.""" import os import sys import tempfile import time from traitlets import default from .html import HTMLExporter class QtExporter(HTMLExporter): """A qt exporter.""" paginate = None format = "" @default("file_extension") def _file_extension_default(self): return ".html" def _check_launch_reqs(self): if sys.platform.startswith("win") and self.format == "png": msg = "Exporting to PNG using Qt is currently not supported on Windows." raise RuntimeError(msg) from .qt_screenshot import QT_INSTALLED # noqa: PLC0415 if not QT_INSTALLED: msg = ( f"PyQtWebEngine is not installed to support Qt {self.format.upper()} conversion. " f"Please install `nbconvert[qt{self.format}]` to enable." ) raise RuntimeError(msg) from .qt_screenshot import QtScreenshot # noqa: PLC0415 return QtScreenshot def _run_pyqtwebengine(self, html): ext = ".html" temp_file = tempfile.NamedTemporaryFile( # noqa: SIM115 suffix=ext, delete=False ) filename = f"{temp_file.name[: -len(ext)]}.{self.format}" with temp_file: temp_file.write(html.encode("utf-8")) try: QtScreenshot = self._check_launch_reqs() s = QtScreenshot() s.capture(f"file://{temp_file.name}", filename, self.paginate) finally: # Ensure the file is deleted even if pyqtwebengine raises an exception os.unlink(temp_file.name) # Prefer Qt's in-memory bytes, but fall back to reading the file on disk data = getattr(s, "data", b"") if (not data) and os.path.exists(filename): deadline = time.time() + 5.0 while time.time() < deadline: try: if os.path.getsize(filename) > 0: break except OSError: pass time.sleep(0.05) if os.path.exists(filename) and os.path.getsize(filename) > 0: with open(filename, "rb") as f: data = f.read() # Best-effort cleanup of the generated output file try: if os.path.exists(filename): os.unlink(filename) except OSError: pass return data def from_notebook_node(self, nb, resources=None, **kw): """Convert from notebook node.""" self._check_launch_reqs() html, resources = super().from_notebook_node(nb, resources=resources, **kw) self.log.info("Building %s", self.format.upper()) data = self._run_pyqtwebengine(html) self.log.info("%s successfully created", self.format.upper()) # convert output extension # the writer above required it to be html resources["output_extension"] = f".{self.format}" return data, resources jupyter-nbconvert-5db0bfc/nbconvert/exporters/qt_screenshot.py000066400000000000000000000063601516532232300252560ustar00rootroot00000000000000"""A qt screenshot exporter.""" import os try: from PyQt5 import QtCore # type:ignore[import-not-found] from PyQt5.QtGui import QPageLayout, QPageSize # type:ignore[import-not-found] from PyQt5.QtWebEngineWidgets import ( # type:ignore[import-not-found] QWebEngineSettings, QWebEngineView, ) from PyQt5.QtWidgets import QApplication # type:ignore[import-not-found] QT_INSTALLED = True except ModuleNotFoundError: QT_INSTALLED = False if QT_INSTALLED: APP = None if not QApplication.instance(): APP = QApplication([]) class QtScreenshot(QWebEngineView): # type:ignore[misc] """A qt screenshot exporter.""" def __init__(self): """Initialize the exporter.""" super().__init__() self.app = APP def capture(self, url, output_file, paginate): """Capture the screenshot.""" self.output_file = output_file self.paginate = paginate self.load(QtCore.QUrl(url)) self.loadFinished.connect(self.on_loaded) # Create hidden view without scrollbars self.setAttribute(QtCore.Qt.WA_DontShowOnScreen) self.page().settings().setAttribute(QWebEngineSettings.ShowScrollBars, False) self.data = b"" if output_file.endswith(".pdf"): self.export = self.export_pdf def cleanup(*args): """Cleanup the app.""" self.get_data() self.app.quit() # type:ignore[union-attr] self.page().pdfPrintingFinished.connect(cleanup) elif output_file.endswith(".png"): self.export = self.export_png else: msg = f"Export file extension not supported: {output_file}" raise RuntimeError(msg) self.show() self.app.exec() # type:ignore[union-attr] def on_loaded(self): """Handle app load.""" self.size = self.page().contentsSize().toSize() self.resize(self.size) # Wait for resize QtCore.QTimer.singleShot(1000, self.export) def export_pdf(self): """Export to pdf.""" if self.paginate: page_size = QPageSize(QPageSize.A4) page_layout = QPageLayout(page_size, QPageLayout.Portrait, QtCore.QMarginsF()) else: factor = 0.75 page_size = QPageSize( QtCore.QSizeF(self.size.width() * factor, self.size.height() * factor), QPageSize.Point, ) page_layout = QPageLayout(page_size, QPageLayout.Portrait, QtCore.QMarginsF()) self.page().printToPdf(self.output_file, pageLayout=page_layout) def export_png(self): """Export to png.""" self.grab().save(self.output_file, "PNG") self.get_data() self.app.quit() # type:ignore[union-attr] def get_data(self): """Get output data.""" if os.path.exists(self.output_file): with open(self.output_file, "rb") as f: self.data = f.read() os.unlink(self.output_file) jupyter-nbconvert-5db0bfc/nbconvert/exporters/qtpdf.py000066400000000000000000000014501516532232300235060ustar00rootroot00000000000000"""Export to PDF via a headless browser""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from traitlets import Bool from .qt_exporter import QtExporter class QtPDFExporter(QtExporter): """Writer designed to write to PDF files. This inherits from :class:`HTMLExporter`. It creates the HTML using the template machinery, and then uses pyqtwebengine to create a pdf. """ export_from_notebook = "PDF via HTML" format = "pdf" paginate = Bool( # type:ignore[assignment] True, help=""" Split generated notebook into multiple pages. If False, a PDF with one long page will be generated. Set to True to match behavior of LaTeX based PDF generator """, ).tag(config=True) jupyter-nbconvert-5db0bfc/nbconvert/exporters/qtpng.py000066400000000000000000000007371516532232300235300ustar00rootroot00000000000000"""Export to PNG via a headless browser""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from .qt_exporter import QtExporter class QtPNGExporter(QtExporter): """Writer designed to write to PNG files. This inherits from :class:`HTMLExporter`. It creates the HTML using the template machinery, and then uses pyqtwebengine to create a png. """ export_from_notebook = "PNG via HTML" format = "png" jupyter-nbconvert-5db0bfc/nbconvert/exporters/rst.py000066400000000000000000000033421516532232300232020ustar00rootroot00000000000000"""reStructuredText Exporter class""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. from traitlets import default from traitlets.config import Config from ..filters import DataTypeFilter from .templateexporter import TemplateExporter class RSTExporter(TemplateExporter): """ Exports reStructuredText documents. """ @default("file_extension") def _file_extension_default(self): return ".rst" @default("template_name") def _template_name_default(self): return "rst" @default("raw_mimetypes") def _raw_mimetypes_default(self): # Up to summer 2024, nbconvert had a mistaken output_mimetype. # Listing that as an extra option here maintains compatibility for # notebooks with raw cells marked as that mimetype. return [self.output_mimetype, "text/restructuredtext", ""] output_mimetype = "text/x-rst" export_from_notebook = "reST" def default_filters(self): """Override filter_data_type to use native rst outputs""" dtf = DataTypeFilter() dtf.display_data_priority = [self.output_mimetype, *dtf.display_data_priority] filters = dict(super().default_filters()) filters["filter_data_type"] = dtf return filters.items() @property def default_config(self): c = Config( { "CoalesceStreamsPreprocessor": {"enabled": True}, "ExtractOutputPreprocessor": {"enabled": True}, "HighlightMagicsPreprocessor": {"enabled": True}, } ) if super().default_config: c2 = super().default_config.copy() c2.merge(c) c = c2 return c jupyter-nbconvert-5db0bfc/nbconvert/exporters/script.py000066400000000000000000000061511516532232300236770ustar00rootroot00000000000000"""Generic script exporter class for any kernel language""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. import sys if sys.version_info < (3, 10): from importlib_metadata import entry_points # type:ignore[import-not-found] else: from importlib.metadata import entry_points from traitlets import Dict, default from .base import get_exporter from .templateexporter import TemplateExporter class ScriptExporter(TemplateExporter): """A script exporter.""" # Caches of already looked-up and instantiated exporters for delegation: _exporters = Dict() _lang_exporters = Dict() export_from_notebook = "Script" @default("template_file") def _template_file_default(self): return "script.j2" @default("template_name") def _template_name_default(self): return "script" def _get_language_exporter(self, lang_name): """Find an exporter for the language name from notebook metadata. Uses the nbconvert.exporters.script group of entry points. Returns None if no exporter is found. """ if lang_name not in self._lang_exporters: try: exporters = entry_points(group="nbconvert.exporters.script") exporter = [e for e in exporters if e.name == lang_name][0].load() # noqa: RUF015 except (KeyError, IndexError): self._lang_exporters[lang_name] = None else: # TODO: passing config is wrong, but changing this revealed more complicated issues self._lang_exporters[lang_name] = exporter(config=self.config, parent=self) return self._lang_exporters[lang_name] def from_notebook_node(self, nb, resources=None, **kw): """Convert from notebook node.""" langinfo = nb.metadata.get("language_info", {}) # delegate to custom exporter, if specified exporter_name = langinfo.get("nbconvert_exporter") if exporter_name and exporter_name != "script": self.log.debug("Loading script exporter: %s", exporter_name) if exporter_name not in self._exporters: exporter = get_exporter(exporter_name) # TODO: passing config is wrong, but changing this revealed more complicated issues self._exporters[exporter_name] = exporter(config=self.config, parent=self) exporter = self._exporters[exporter_name] return exporter.from_notebook_node(nb, resources, **kw) # Look up a script exporter for this notebook's language lang_name = langinfo.get("name") if lang_name: self.log.debug("Using script exporter for language: %s", lang_name) exporter = self._get_language_exporter(lang_name) if exporter is not None: return exporter.from_notebook_node(nb, resources, **kw) # Fall back to plain script export self.file_extension = langinfo.get("file_extension", ".txt") self.output_mimetype = langinfo.get("mimetype", "text/plain") return super().from_notebook_node(nb, resources, **kw) jupyter-nbconvert-5db0bfc/nbconvert/exporters/slides.py000066400000000000000000000156731516532232300236670ustar00rootroot00000000000000"""HTML slide show Exporter class""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. from copy import deepcopy from warnings import warn from traitlets import Bool, Unicode, default from nbconvert.preprocessors.base import Preprocessor from .html import HTMLExporter class _RevealMetadataPreprocessor(Preprocessor): # A custom preprocessor adding convenience metadata to cells def preprocess(self, nb, resources=None): nb = deepcopy(nb) for cell in nb.cells: # Make sure every cell has a slide_type try: slide_type = cell.metadata.get("slideshow", {}).get("slide_type", "-") except AttributeError: slide_type = "-" cell.metadata.slide_type = slide_type # Find the first visible cell for index, cell in enumerate(nb.cells): if cell.metadata.slide_type not in {"notes", "skip"}: cell.metadata.slide_type = "slide" cell.metadata.slide_start = True cell.metadata.subslide_start = True first_slide_ix = index break else: msg = "All cells are hidden, cannot create slideshow" raise ValueError(msg) in_fragment = False for index, cell in enumerate(nb.cells[first_slide_ix + 1 :], start=(first_slide_ix + 1)): previous_cell = nb.cells[index - 1] # Slides are
elements in the HTML, subslides (the vertically # stacked slides) are also
elements inside the slides, # and fragments are
s within subslides. Subslide and fragment # elements can contain content: #
#
# (content) #
(content)
#
#
# Get the slide type. If type is subslide or slide, # end the last slide/subslide/fragment as applicable. if cell.metadata.slide_type == "slide": previous_cell.metadata.slide_end = True cell.metadata.slide_start = True if cell.metadata.slide_type in {"subslide", "slide"}: previous_cell.metadata.fragment_end = in_fragment previous_cell.metadata.subslide_end = True cell.metadata.subslide_start = True in_fragment = False elif cell.metadata.slide_type == "fragment": cell.metadata.fragment_start = True if in_fragment: previous_cell.metadata.fragment_end = True else: in_fragment = True # The last cell will always be the end of a slide nb.cells[-1].metadata.fragment_end = in_fragment nb.cells[-1].metadata.subslide_end = True nb.cells[-1].metadata.slide_end = True return nb, resources class SlidesExporter(HTMLExporter): """Exports HTML slides with reveal.js""" # Overrides from HTMLExporter ################################# export_from_notebook = "Reveal.js slides" @default("template_name") def _template_name_default(self): return "reveal" @default("file_extension") def _file_extension_default(self): return ".slides.html" @default("template_extension") def _template_extension_default(self): return ".html.j2" # Extra resources ################################# reveal_url_prefix = Unicode( help="""The URL prefix for reveal.js (version 3.x). This defaults to the reveal CDN, but can be any url pointing to a copy of reveal.js. For speaker notes to work, this must be a relative path to a local copy of reveal.js: e.g., "reveal.js". If a relative path is given, it must be a subdirectory of the current directory (from which the server is run). See the usage documentation (https://nbconvert.readthedocs.io/en/latest/usage.html#reveal-js-html-slideshow) for more details. """ ).tag(config=True) @default("reveal_url_prefix") def _reveal_url_prefix_default(self): if "RevealHelpPreprocessor.url_prefix" in self.config: warn( "Please update RevealHelpPreprocessor.url_prefix to " "SlidesExporter.reveal_url_prefix in config files.", stacklevel=2, ) return self.config.RevealHelpPreprocessor.url_prefix return "https://unpkg.com/reveal.js@4.0.2" reveal_theme = Unicode( "simple", help=""" Name of the reveal.js theme to use. We look for a file with this name under ``reveal_url_prefix``/css/theme/``reveal_theme``.css. https://github.com/hakimel/reveal.js/tree/master/css/theme has list of themes that ship by default with reveal.js. """, ).tag(config=True) reveal_transition = Unicode( "slide", help=""" Name of the reveal.js transition to use. The list of transitions that ships by default with reveal.js are: none, fade, slide, convex, concave and zoom. """, ).tag(config=True) reveal_scroll = Bool( False, help=""" If True, enable scrolling within each slide """, ).tag(config=True) reveal_number = Unicode( "", help=""" slide number format (e.g. 'c/t'). Choose from: 'c': current, 't': total, 'h': horizontal, 'v': vertical """, ).tag(config=True) reveal_width = Unicode( "", help=""" width used to determine the aspect ratio of your presentation. Use the horizontal pixels available on your intended presentation equipment. """, ).tag(config=True) reveal_height = Unicode( "", help=""" height used to determine the aspect ratio of your presentation. Use the horizontal pixels available on your intended presentation equipment. """, ).tag(config=True) font_awesome_url = Unicode( "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css", help=""" URL to load font awesome from. Defaults to loading from cdnjs. """, ).tag(config=True) def _init_resources(self, resources): resources = super()._init_resources(resources) if "reveal" not in resources: resources["reveal"] = {} resources["reveal"]["url_prefix"] = self.reveal_url_prefix resources["reveal"]["theme"] = self.reveal_theme resources["reveal"]["transition"] = self.reveal_transition resources["reveal"]["scroll"] = self.reveal_scroll resources["reveal"]["number"] = self.reveal_number resources["reveal"]["height"] = self.reveal_height resources["reveal"]["width"] = self.reveal_width return resources jupyter-nbconvert-5db0bfc/nbconvert/exporters/templateexporter.py000066400000000000000000000661211516532232300260020ustar00rootroot00000000000000"""This module defines TemplateExporter, a highly configurable converter that uses Jinja2 to export notebook files into different formats. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from __future__ import annotations import html import json import os import typing as t import uuid import warnings from pathlib import Path from jinja2 import ( BaseLoader, ChoiceLoader, DictLoader, Environment, FileSystemLoader, TemplateNotFound, ) from jupyter_core.paths import jupyter_path from nbformat import NotebookNode from traitlets import Bool, Dict, HasTraits, List, Unicode, default, observe, validate from traitlets.config import Config from traitlets.utils.importstring import import_item from nbconvert import filters from .exporter import Exporter # Jinja2 extensions to load. JINJA_EXTENSIONS = ["jinja2.ext.loopcontrols"] ROOT = os.path.dirname(__file__) DEV_MODE = os.path.exists(os.path.join(ROOT, "../../.git")) default_filters = { "indent": filters.indent, "markdown2html": filters.markdown2html, "markdown2asciidoc": filters.markdown2asciidoc, "ansi2html": filters.ansi2html, "filter_data_type": filters.DataTypeFilter, "get_lines": filters.get_lines, "highlight2html": filters.Highlight2HTML, "highlight2latex": filters.Highlight2Latex, "ipython2python": filters.ipython2python, "posix_path": filters.posix_path, "markdown2latex": filters.markdown2latex, "markdown2rst": filters.markdown2rst, "comment_lines": filters.comment_lines, "strip_ansi": filters.strip_ansi, "strip_dollars": filters.strip_dollars, "strip_files_prefix": filters.strip_files_prefix, "html2text": filters.html2text, "add_anchor": filters.add_anchor, "ansi2latex": filters.ansi2latex, "wrap_text": filters.wrap_text, "escape_latex": filters.escape_latex, "citation2latex": filters.citation2latex, "path2url": filters.path2url, "add_prompts": filters.add_prompts, "ascii_only": filters.ascii_only, "prevent_list_blocks": filters.prevent_list_blocks, "get_metadata": filters.get_metadata, "convert_pandoc": filters.convert_pandoc, "json_dumps": json.dumps, # For removing any HTML "escape_html": lambda s: html.escape(str(s)), "escape_html_keep_quotes": lambda s: html.escape(str(s), quote=False), "escape_html_script": lambda s: s.replace("/", "\\/"), # For sanitizing HTML for any XSS "clean_html": filters.clean_html, "strip_trailing_newline": filters.strip_trailing_newline, "text_base64": filters.text_base64, } # copy of https://github.com/jupyter/jupyter_server/blob/b62458a7f5ad6b5246d2f142258dedaa409de5d9/jupyter_server/config_manager.py#L19 def recursive_update(target, new): """Recursively update one dictionary using another. None values will delete their keys. """ for k, v in new.items(): if isinstance(v, dict): if k not in target: target[k] = {} recursive_update(target[k], v) if not target[k]: # Prune empty subdicts del target[k] elif v is None: target.pop(k, None) else: target[k] = v return target # return for convenience # define function at the top level to avoid pickle errors def deprecated(msg): """Emit a deprecation warning.""" warnings.warn(msg, DeprecationWarning, stacklevel=2) class ExtensionTolerantLoader(BaseLoader): """A template loader which optionally adds a given extension when searching. Constructor takes two arguments: *loader* is another Jinja loader instance to wrap. *extension* is the extension, which will be added to the template name if finding the template without it fails. This should include the dot, e.g. '.tpl'. """ def __init__(self, loader, extension): """Initialize the loader.""" self.loader = loader self.extension = extension def get_source(self, environment, template): """Get the source for a template.""" try: return self.loader.get_source(environment, template) except TemplateNotFound: if template.endswith(self.extension): raise TemplateNotFound(template) from None return self.loader.get_source(environment, template + self.extension) def list_templates(self): """List available templates.""" return self.loader.list_templates() class TemplateExporter(Exporter): """ Exports notebooks into other file formats. Uses Jinja 2 templating engine to output new formats. Inherit from this class if you are creating a new template type along with new filters/preprocessors. If the filters/ preprocessors provided by default suffice, there is no need to inherit from this class. Instead, override the template_file and file_extension traits via a config file. Filters available by default for templates: {filters} """ # finish the docstring __doc__ = ( __doc__.format(filters="- " + "\n - ".join(sorted(default_filters.keys()))) if __doc__ else None ) _template_cached = None def _invalidate_template_cache(self, change=None): self._template_cached = None @property def template(self): if self._template_cached is None: self._template_cached = self._load_template() return self._template_cached _environment_cached = None def _invalidate_environment_cache(self, change=None): self._environment_cached = None self._invalidate_template_cache() @property def environment(self): if self._environment_cached is None: self._environment_cached = self._create_environment() return self._environment_cached @property def default_config(self): c = Config( { "RegexRemovePreprocessor": {"enabled": True}, "TagRemovePreprocessor": {"enabled": True}, } ) if super().default_config: c2 = super().default_config.copy() c2.merge(c) c = c2 return c template_name = Unicode(help="Name of the template to use").tag( config=True, affects_template=True ) template_file = Unicode(None, allow_none=True, help="Name of the template file to use").tag( config=True, affects_template=True ) raw_template = Unicode("", help="raw template string").tag(affects_environment=True) enable_async = Bool(False, help="Enable Jinja async template execution").tag( affects_environment=True ) _last_template_file = "" _raw_template_key = "" @validate("template_name") def _template_name_validate(self, change): template_name = change["value"] if template_name and template_name.endswith(".tpl"): warnings.warn( f"5.x style template name passed '{self.template_name}'. Use --template-name for the template directory with a index..j2 file and/or --template-file to denote a different template.", DeprecationWarning, stacklevel=2, ) directory, self.template_file = os.path.split(self.template_name) if directory: directory, template_name = os.path.split(directory) if directory and os.path.isabs(directory): self.extra_template_basedirs = [directory] return template_name @observe("template_file") def _template_file_changed(self, change): new = change["new"] if new == "default": self.template_file = self.default_template # type:ignore[attr-defined] return # check if template_file is a file path # rather than a name already on template_path full_path = os.path.abspath(new) if os.path.isfile(full_path): directory, self.template_file = os.path.split(full_path) self.extra_template_paths = [directory, *self.extra_template_paths] # While not strictly an invalid template file name, the extension hints that there isn't a template directory involved if self.template_file and self.template_file.endswith(".tpl"): warnings.warn( f"5.x style template file passed '{new}'. Use --template-name for the template directory with a index..j2 file and/or --template-file to denote a different template.", DeprecationWarning, stacklevel=2, ) @default("template_file") def _template_file_default(self): if self.template_extension: return "index" + self.template_extension return None @observe("raw_template") def _raw_template_changed(self, change): if not change["new"]: self.template_file = self._last_template_file self._invalidate_template_cache() template_paths = List(["."]).tag(config=True, affects_environment=True) extra_template_basedirs = List(Unicode()).tag(config=True, affects_environment=True) extra_template_paths = List(Unicode()).tag(config=True, affects_environment=True) @default("extra_template_basedirs") def _default_extra_template_basedirs(self): return [os.getcwd()] # Extension that the template files use. template_extension = Unicode().tag(config=True, affects_environment=True) template_data_paths = List( jupyter_path("nbconvert", "templates"), help="Path where templates can be installed too." ).tag(affects_environment=True) @default("template_extension") def _template_extension_default(self): if self.file_extension: return self.file_extension + ".j2" return self.file_extension exclude_input = Bool( False, help="This allows you to exclude code cell inputs from all templates if set to True." ).tag(config=True) exclude_input_prompt = Bool( False, help="This allows you to exclude input prompts from all templates if set to True." ).tag(config=True) exclude_output = Bool( False, help="This allows you to exclude code cell outputs from all templates if set to True.", ).tag(config=True) exclude_output_prompt = Bool( False, help="This allows you to exclude output prompts from all templates if set to True." ).tag(config=True) exclude_output_stdin = Bool( True, help="This allows you to exclude output of stdin stream from lab template if set to True.", ).tag(config=True) exclude_code_cell = Bool( False, help="This allows you to exclude code cells from all templates if set to True." ).tag(config=True) exclude_markdown = Bool( False, help="This allows you to exclude markdown cells from all templates if set to True." ).tag(config=True) exclude_raw = Bool( False, help="This allows you to exclude raw cells from all templates if set to True." ).tag(config=True) exclude_unknown = Bool( False, help="This allows you to exclude unknown cells from all templates if set to True." ).tag(config=True) extra_loaders: List[t.Any] = List( help="Jinja loaders to find templates. Will be tried in order " "before the default FileSystem ones.", ).tag(affects_environment=True) filters = Dict( help="""Dictionary of filters, by name and namespace, to add to the Jinja environment.""" ).tag(config=True, affects_environment=True) raw_mimetypes = List( Unicode(), help="""formats of raw cells to be included in this Exporter's output.""" ).tag(config=True) @default("raw_mimetypes") def _raw_mimetypes_default(self): return [self.output_mimetype, ""] # TODO: passing config is wrong, but changing this revealed more complicated issues def __init__(self, config=None, **kw): """ Public constructor Parameters ---------- config : config User configuration instance. extra_loaders : list[of Jinja Loaders] ordered list of Jinja loader to find templates. Will be tried in order before the default FileSystem ones. template_file : str (optional, kw arg) Template to use when exporting. """ super().__init__(config=config, **kw) self.observe( self._invalidate_environment_cache, list(self.traits(affects_environment=True)) ) self.observe(self._invalidate_template_cache, list(self.traits(affects_template=True))) def _load_template(self): """Load the Jinja template object from the template file This is triggered by various trait changes that would change the template. """ # this gives precedence to a raw_template if present with self.hold_trait_notifications(): if self.template_file and (self.template_file != self._raw_template_key): self._last_template_file = self.template_file if self.raw_template: self.template_file = self._raw_template_key if not self.template_file: msg = "No template_file specified!" raise ValueError(msg) # First try to load the # template by name with extension added, then try loading the template # as if the name is explicitly specified. template_file = self.template_file self.log.debug("Attempting to load template %s", template_file) self.log.debug(" template_paths: %s", os.pathsep.join(self.template_paths)) return self.environment.get_template(template_file) def from_filename( # type:ignore[override] self, filename: str, resources: dict[str, t.Any] | None = None, **kw: t.Any ) -> tuple[str, dict[str, t.Any]]: """Convert a notebook from a filename.""" return super().from_filename(filename, resources, **kw) # type:ignore[return-value] def from_file( # type:ignore[override] self, file_stream: t.Any, resources: dict[str, t.Any] | None = None, **kw: t.Any ) -> tuple[str, dict[str, t.Any]]: """Convert a notebook from a file.""" return super().from_file(file_stream, resources, **kw) # type:ignore[return-value] def from_notebook_node( # type:ignore[override] self, nb: NotebookNode, resources: dict[str, t.Any] | None = None, **kw: t.Any ) -> tuple[str, dict[str, t.Any]]: """ Convert a notebook from a notebook node instance. Parameters ---------- nb : :class:`~nbformat.NotebookNode` Notebook node resources : dict Additional resources that can be accessed read/write by preprocessors and filters. """ nb_copy, resources = super().from_notebook_node(nb, resources, **kw) resources.setdefault("raw_mimetypes", self.raw_mimetypes) resources.setdefault("output_mimetype", self.output_mimetype) resources["global_content_filter"] = { "include_code": not self.exclude_code_cell, "include_markdown": not self.exclude_markdown, "include_raw": not self.exclude_raw, "include_unknown": not self.exclude_unknown, "include_input": not self.exclude_input, "include_output": not self.exclude_output, "include_output_stdin": not self.exclude_output_stdin, "include_input_prompt": not self.exclude_input_prompt, "include_output_prompt": not self.exclude_output_prompt, "no_prompt": self.exclude_input_prompt and self.exclude_output_prompt, } # Top level variables are passed to the template_exporter here. output = self.template.render(nb=nb_copy, resources=resources) output = output.lstrip("\r\n") return output, resources def _register_filter(self, environ, name, jinja_filter): """ Register a filter. A filter is a function that accepts and acts on one string. The filters are accessible within the Jinja templating engine. Parameters ---------- name : str name to give the filter in the Jinja engine filter : filter """ if jinja_filter is None: msg = "filter" raise TypeError(msg) isclass = isinstance(jinja_filter, type) constructed = not isclass # Handle filter's registration based on it's type if constructed and isinstance(jinja_filter, (str,)): # filter is a string, import the namespace and recursively call # this register_filter method filter_cls = import_item(jinja_filter) return self._register_filter(environ, name, filter_cls) if constructed and callable(jinja_filter): # filter is a function, no need to construct it. environ.filters[name] = jinja_filter return jinja_filter if isclass and issubclass(jinja_filter, HasTraits): # filter is configurable. Make sure to pass in new default for # the enabled flag if one was specified. filter_instance = jinja_filter(parent=self) self._register_filter(environ, name, filter_instance) return None if isclass: # filter is not configurable, construct it filter_instance = jinja_filter() self._register_filter(environ, name, filter_instance) return None # filter is an instance of something without a __call__ # attribute. msg = "filter" raise TypeError(msg) def register_filter(self, name, jinja_filter): """ Register a filter. A filter is a function that accepts and acts on one string. The filters are accessible within the Jinja templating engine. Parameters ---------- name : str name to give the filter in the Jinja engine filter : filter """ return self._register_filter(self.environment, name, jinja_filter) def default_filters(self): """Override in subclasses to provide extra filters. This should return an iterable of 2-tuples: (name, class-or-function). You should call the method on the parent class and include the filters it provides. If a name is repeated, the last filter provided wins. Filters from user-supplied config win over filters provided by classes. """ return default_filters.items() def _create_environment(self): """ Create the Jinja templating environment. """ paths = self.template_paths self.log.debug("Template paths:\n\t%s", "\n\t".join(paths)) loaders = [ *self.extra_loaders, ExtensionTolerantLoader(FileSystemLoader(paths), self.template_extension), DictLoader({self._raw_template_key: self.raw_template}), ] environment = Environment( # noqa: S701 loader=ChoiceLoader(loaders), extensions=JINJA_EXTENSIONS, enable_async=self.enable_async, ) environment.globals["uuid4"] = uuid.uuid4 # Add default filters to the Jinja2 environment for key, value in self.default_filters(): self._register_filter(environment, key, value) # Load user filters. Overwrite existing filters if need be. if self.filters: for key, user_filter in self.filters.items(): self._register_filter(environment, key, user_filter) return environment def _init_preprocessors(self): super()._init_preprocessors() conf = self._get_conf() preprocessors = conf.get("preprocessors", {}) # preprocessors is a dict for three reasons # * We rely on recursive_update, which can only merge dicts, lists will be overwritten # * We can use the key with numerical prefixing to guarantee ordering (/etc/*.d/XY-file style) # * We can disable preprocessors by overwriting the value with None for _, preprocessor in sorted(preprocessors.items(), key=lambda x: x[0]): if preprocessor is not None: kwargs = preprocessor.copy() preprocessor_cls = kwargs.pop("type") preprocessor_cls = import_item(preprocessor_cls) if preprocessor_cls.__name__ in self.config: kwargs.update(self.config[preprocessor_cls.__name__]) preprocessor = preprocessor_cls(**kwargs) # noqa: PLW2901 self.register_preprocessor(preprocessor) def _get_conf(self): conf: dict[str, t.Any] = {} # the configuration once all conf files are merged for path in map(Path, self.template_paths): conf_path = path / "conf.json" try: conf_path_exists = conf_path.exists() except PermissionError: # for Python <3.14 pass else: if conf_path_exists: with conf_path.open() as f: conf = recursive_update(conf, json.load(f)) return conf @default("template_paths") def _template_paths(self, prune=True, root_dirs=None): paths = [] root_dirs = self.get_prefix_root_dirs() template_names = self.get_template_names() for template_name in template_names: for base_dir in self.extra_template_basedirs: path = os.path.join(base_dir, template_name) try: if not prune or os.path.exists(path): paths.append(path) except PermissionError: pass for root_dir in root_dirs: base_dir = os.path.join(root_dir, "nbconvert", "templates") path = os.path.join(base_dir, template_name) try: if not prune or os.path.exists(path): paths.append(path) except PermissionError: pass for root_dir in root_dirs: # we include root_dir for when we want to be very explicit, e.g. # {% extends 'nbconvert/templates/classic/base.html' %} paths.append(root_dir) # we include base_dir for when we want to be explicit, but less than root_dir, e.g. # {% extends 'classic/base.html' %} base_dir = os.path.join(root_dir, "nbconvert", "templates") paths.append(base_dir) compatibility_dir = os.path.join(root_dir, "nbconvert", "templates", "compatibility") paths.append(compatibility_dir) additional_paths = [] for path in self.template_data_paths: if not prune or os.path.exists(path): additional_paths.append(path) return paths + self.extra_template_paths + additional_paths @classmethod def get_compatibility_base_template_conf(cls, name): """Get the base template config.""" # Hard-coded base template confs to use for backwards compatibility for 5.x-only templates if name == "display_priority": return {"base_template": "base"} if name == "full": return {"base_template": "classic", "mimetypes": {"text/html": True}} return None def get_template_names(self): """Finds a list of template names where each successive template name is the base template""" template_names = [] root_dirs = self.get_prefix_root_dirs() base_template: str | None = self.template_name merged_conf: dict[str, t.Any] = {} # the configuration once all conf files are merged while base_template is not None: template_names.append(base_template) conf: dict[str, t.Any] = {} found_at_least_one = False for base_dir in self.extra_template_basedirs: template_dir = os.path.join(base_dir, base_template) if os.path.exists(template_dir): found_at_least_one = True conf_file = os.path.join(template_dir, "conf.json") if os.path.exists(conf_file): with open(conf_file) as f: conf = recursive_update(json.load(f), conf) for root_dir in root_dirs: template_dir = os.path.join(root_dir, "nbconvert", "templates", base_template) if os.path.exists(template_dir): found_at_least_one = True conf_file = os.path.join(template_dir, "conf.json") if os.path.exists(conf_file): with open(conf_file) as f: conf = recursive_update(json.load(f), conf) if not found_at_least_one: # Check for backwards compatibility template names for root_dir in root_dirs: compatibility_file = base_template + ".tpl" compatibility_path = os.path.join( root_dir, "nbconvert", "templates", "compatibility", compatibility_file ) if os.path.exists(compatibility_path): found_at_least_one = True warnings.warn( f"5.x template name passed '{self.template_name}'. Use 'lab' or 'classic' for new template usage.", DeprecationWarning, stacklevel=2, ) self.template_file = compatibility_file conf = self.get_compatibility_base_template_conf(base_template) self.template_name = t.cast(str, conf.get("base_template")) break if not found_at_least_one: paths = "\n\t".join(root_dirs) msg = f"No template sub-directory with name {base_template!r} found in the following paths:\n\t{paths}" raise ValueError(msg) merged_conf = recursive_update(dict(conf), merged_conf) base_template = t.cast(t.Any, conf.get("base_template")) conf = merged_conf mimetypes = [mimetype for mimetype, enabled in conf.get("mimetypes", {}).items() if enabled] if self.output_mimetype and self.output_mimetype not in mimetypes and mimetypes: supported_mimetypes = "\n\t".join(mimetypes) msg = f"Unsupported mimetype {self.output_mimetype!r} for template {self.template_name!r}, mimetypes supported are: \n\t{supported_mimetypes}" raise ValueError(msg) return template_names def get_prefix_root_dirs(self): """Get the prefix root dirs.""" # We look at the usual jupyter locations, and for development purposes also # relative to the package directory (first entry, meaning with highest precedence) root_dirs = [] if DEV_MODE: root_dirs.append(os.path.abspath(os.path.join(ROOT, "..", "..", "share", "jupyter"))) root_dirs.extend(jupyter_path()) return root_dirs def _init_resources(self, resources): resources = super()._init_resources(resources) resources["deprecated"] = deprecated return resources jupyter-nbconvert-5db0bfc/nbconvert/exporters/webpdf.py000066400000000000000000000155641516532232300236520ustar00rootroot00000000000000"""Export to PDF via a headless browser""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import asyncio import concurrent.futures import os import subprocess import sys import tempfile from importlib import util as importlib_util from traitlets import Bool, Int, List, Unicode, default from .html import HTMLExporter PLAYWRIGHT_INSTALLED = importlib_util.find_spec("playwright") is not None IS_WINDOWS = os.name == "nt" class WebPDFExporter(HTMLExporter): """Writer designed to write to PDF files. This inherits from :class:`HTMLExporter`. It creates the HTML using the template machinery, and then run playwright to create a pdf. """ export_from_notebook = "PDF via HTML" allow_chromium_download = Bool( False, help="Whether to allow downloading Chromium if no suitable version is found on the system.", ).tag(config=True) paginate = Bool( True, help=""" Split generated notebook into multiple pages. If False, a PDF with one long page will be generated. Set to True to match behavior of LaTeX based PDF generator """, ).tag(config=True) page_render_timeout = Int( 100, help=""" Time to wait for the page to render before converting to PDF, in milliseconds. Increase this value if your notebook has a lot of complex JavaScript output that needs more time to load. """, ).tag(config=True) @default("file_extension") def _file_extension_default(self): return ".pdf" @default("template_extension") def _template_extension_default(self): # NOTE: we use .html.j2 so that the HTMLExporter can find the template return ".html.j2" @default("template_name") def _template_name_default(self): return "webpdf" disable_sandbox = Bool( False, help=""" Disable chromium security sandbox when converting to PDF. WARNING: This could cause arbitrary code execution in specific circumstances, where JS in your notebook can execute serverside code! Please use with caution. ``https://github.com/puppeteer/puppeteer/blob/main@%7B2020-12-14T17:22:24Z%7D/docs/troubleshooting.md#setting-up-chrome-linux-sandbox`` has more information. This is required for webpdf to work inside most container environments. """, ).tag(config=True) browser_args = List( Unicode(), help=""" Additional arguments to pass to the browser rendering to PDF. These arguments will be passed directly to the browser launch method and can be used to customize browser behavior beyond the default settings. """, ).tag(config=True) def run_playwright(self, html): """Run playwright.""" async def main(temp_file): """Run main playwright script.""" try: from playwright.async_api import ( # type: ignore[import-not-found] # noqa: PLC0415, async_playwright, ) except ModuleNotFoundError as e: msg = ( "Playwright is not installed to support Web PDF conversion. " "Please install `nbconvert[webpdf]` to enable." ) raise RuntimeError(msg) from e if self.allow_chromium_download: cmd = [sys.executable, "-m", "playwright", "install", "chromium"] subprocess.check_call(cmd) # noqa: S603 playwright = await async_playwright().start() chromium = playwright.chromium args = self.browser_args if self.disable_sandbox: args.append("--no-sandbox") try: browser = await chromium.launch( handle_sigint=False, handle_sigterm=False, handle_sighup=False, args=args ) except Exception as e: msg = ( "No suitable chromium executable found on the system. " "Please use '--allow-chromium-download' to allow downloading one," "or install it using `playwright install chromium`." ) await playwright.stop() raise RuntimeError(msg) from e page = await browser.new_page() await page.emulate_media(media="print") await page.wait_for_timeout(100) await page.goto(f"file://{temp_file.name}", wait_until="networkidle") await page.wait_for_timeout(self.page_render_timeout) pdf_params = {"print_background": True} if not self.paginate: # Floating point precision errors cause the printed # PDF from spilling over a new page by a pixel fraction. dimensions = await page.evaluate( """() => { const rect = document.body.getBoundingClientRect(); return { width: Math.ceil(rect.width) + 1, height: Math.ceil(rect.height) + 1, } }""" ) width = dimensions["width"] height = dimensions["height"] # 200 inches is the maximum size for Adobe Acrobat Reader. pdf_params.update( { "width": min(width, 200 * 72), "height": min(height, 200 * 72), } ) pdf_data = await page.pdf(**pdf_params) await browser.close() await playwright.stop() return pdf_data pool = concurrent.futures.ThreadPoolExecutor() # Create a temporary file to pass the HTML code to Chromium: # Unfortunately, tempfile on Windows does not allow for an already open # file to be opened by a separate process. So we must close it first # before calling Chromium. We also specify delete=False to ensure the # file is not deleted after closing (the default behavior). temp_file = tempfile.NamedTemporaryFile( # noqa: SIM115 suffix=".html", delete=False ) with temp_file: temp_file.write(html.encode("utf-8")) try: pdf_data = pool.submit(asyncio.run, main(temp_file)).result() finally: # Ensure the file is deleted even if playwright raises an exception os.unlink(temp_file.name) return pdf_data def from_notebook_node(self, nb, resources=None, **kw): """Convert from a notebook node.""" html, resources = super().from_notebook_node(nb, resources=resources, **kw) self.log.info("Building PDF") pdf_data = self.run_playwright(html) self.log.info("PDF successfully created") return pdf_data, resources jupyter-nbconvert-5db0bfc/nbconvert/filters/000077500000000000000000000000001516532232300214335ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/nbconvert/filters/__init__.py000066400000000000000000000030521516532232300235440ustar00rootroot00000000000000from nbconvert.utils.text import indent from .ansi import ansi2html, ansi2latex, strip_ansi from .citation import citation2latex from .datatypefilter import DataTypeFilter from .highlight import Highlight2HTML, Highlight2Latex from .latex import escape_latex from .markdown import ( markdown2asciidoc, markdown2html, markdown2html_mistune, markdown2html_pandoc, markdown2latex, markdown2rst, ) from .metadata import get_metadata from .pandoc import ConvertExplicitlyRelativePaths, convert_pandoc from .strings import ( add_anchor, add_prompts, ascii_only, clean_html, comment_lines, get_lines, html2text, ipython2python, path2url, posix_path, prevent_list_blocks, strip_dollars, strip_files_prefix, strip_trailing_newline, text_base64, wrap_text, ) __all__ = [ "ConvertExplicitlyRelativePaths", "DataTypeFilter", "Highlight2HTML", "Highlight2Latex", "add_anchor", "add_prompts", "ansi2html", "ansi2latex", "ascii_only", "citation2latex", "clean_html", "comment_lines", "convert_pandoc", "escape_latex", "get_lines", "get_metadata", "html2text", "indent", "ipython2python", "markdown2asciidoc", "markdown2html", "markdown2html_mistune", "markdown2html_pandoc", "markdown2latex", "markdown2rst", "path2url", "posix_path", "prevent_list_blocks", "strip_ansi", "strip_dollars", "strip_files_prefix", "strip_trailing_newline", "text_base64", "wrap_text", ] jupyter-nbconvert-5db0bfc/nbconvert/filters/ansi.py000066400000000000000000000175521516532232300227510ustar00rootroot00000000000000"""Filters for processing ANSI colors within Jinja templates.""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import re import markupsafe __all__ = ["ansi2html", "ansi2latex", "strip_ansi"] _ANSI_RE = re.compile("\x1b\\[(.*?)([@-~])") _ANSI_COLORS = ( "ansi-black", "ansi-red", "ansi-green", "ansi-yellow", "ansi-blue", "ansi-magenta", "ansi-cyan", "ansi-white", "ansi-black-intense", "ansi-red-intense", "ansi-green-intense", "ansi-yellow-intense", "ansi-blue-intense", "ansi-magenta-intense", "ansi-cyan-intense", "ansi-white-intense", ) def strip_ansi(source): """ Remove ANSI escape codes from text. Parameters ---------- source : str Source to remove the ANSI from """ return _ANSI_RE.sub("", source) def ansi2html(text): """ Convert ANSI colors to HTML colors. Parameters ---------- text : unicode Text containing ANSI colors to convert to HTML """ text = markupsafe.escape(text) return _ansi2anything(text, _htmlconverter) def ansi2latex(text): """ Convert ANSI colors to LaTeX colors. Parameters ---------- text : unicode Text containing ANSI colors to convert to LaTeX """ return _ansi2anything(text, _latexconverter) def _htmlconverter(fg, bg, bold, underline, inverse): """ Return start and end tags for given foreground/background/bold/underline. """ if (fg, bg, bold, underline, inverse) == (None, None, False, False, False): return "", "" classes = [] styles = [] if inverse: fg, bg = bg, fg if isinstance(fg, int): classes.append(_ANSI_COLORS[fg] + "-fg") elif fg: styles.append("color: rgb({},{},{})".format(*fg)) elif inverse: classes.append("ansi-default-inverse-fg") if isinstance(bg, int): classes.append(_ANSI_COLORS[bg] + "-bg") elif bg: styles.append("background-color: rgb({},{},{})".format(*bg)) elif inverse: classes.append("ansi-default-inverse-bg") if bold: classes.append("ansi-bold") if underline: classes.append("ansi-underline") starttag = "" def _latexconverter(fg, bg, bold, underline, inverse): """ Return start and end markup given foreground/background/bold/underline. """ if (fg, bg, bold, underline, inverse) == (None, None, False, False, False): return "", "" starttag, endtag = "", "" if inverse: fg, bg = bg, fg if isinstance(fg, int): starttag += r"\textcolor{" + _ANSI_COLORS[fg] + "}{" endtag = "}" + endtag elif fg: # See http://tex.stackexchange.com/a/291102/13684 starttag += r"\def\tcRGB{\textcolor[RGB]}\expandafter" starttag += r"\tcRGB\expandafter{{\detokenize{{{},{},{}}}}}{{".format(*fg) endtag = "}" + endtag elif inverse: starttag += r"\textcolor{ansi-default-inverse-fg}{" endtag = "}" + endtag if isinstance(bg, int): starttag += r"\setlength{\fboxsep}{0pt}" starttag += r"\colorbox{" + _ANSI_COLORS[bg] + "}{" endtag = r"\strut}" + endtag elif bg: starttag += r"\setlength{\fboxsep}{0pt}" # See http://tex.stackexchange.com/a/291102/13684 starttag += r"\def\cbRGB{\colorbox[RGB]}\expandafter" starttag += r"\cbRGB\expandafter{{\detokenize{{{},{},{}}}}}{{".format(*bg) endtag = r"\strut}" + endtag elif inverse: starttag += r"\setlength{\fboxsep}{0pt}" starttag += r"\colorbox{ansi-default-inverse-bg}{" endtag = r"\strut}" + endtag if bold: starttag += r"\textbf{" endtag = "}" + endtag if underline: starttag += r"\underline{" endtag = "}" + endtag return starttag, endtag def _ansi2anything(text, converter): r""" Convert ANSI colors to HTML or LaTeX. See https://en.wikipedia.org/wiki/ANSI_escape_code Accepts codes like '\x1b[32m' (red) and '\x1b[1;32m' (bold, red). Non-color escape sequences (not ending with 'm') are filtered out. Ideally, this should have the same behavior as the function fixConsole() in notebook/notebook/static/base/js/utils.js. """ fg, bg = None, None bold = False underline = False inverse = False numbers = [] out = [] while text: m = _ANSI_RE.search(text) if m: if m.group(2) == "m": try: # Empty code is same as code 0 numbers = [int(n) if n else 0 for n in m.group(1).split(";")] except ValueError: pass # Invalid color specification else: pass # Not a color code chunk, text = text[: m.start()], text[m.end() :] else: chunk, text = text, "" if chunk: starttag, endtag = converter( fg + 8 if bold and fg in range(8) else fg, # type:ignore[operator] bg, bold, underline, inverse, ) out.append(starttag) out.append(chunk) out.append(endtag) while numbers: n = numbers.pop(0) if n == 0: # Code 0 (same as empty code): reset everything fg = bg = None bold = underline = inverse = False elif n == 1: bold = True elif n == 4: underline = True elif n == 5: # Code 5: blinking bold = True elif n == 7: inverse = True elif n in (21, 22): bold = False elif n == 24: underline = False elif n == 27: inverse = False elif 30 <= n <= 37: fg = n - 30 elif n == 38: try: fg = _get_extended_color(numbers) except ValueError: numbers.clear() elif n == 39: fg = None elif 40 <= n <= 47: bg = n - 40 elif n == 48: try: bg = _get_extended_color(numbers) except ValueError: numbers.clear() elif n == 49: bg = None elif 90 <= n <= 97: fg = n - 90 + 8 elif 100 <= n <= 107: bg = n - 100 + 8 else: pass # Unknown codes are ignored return "".join(out) def _get_extended_color(numbers): n = numbers.pop(0) if n == 2 and len(numbers) >= 3: # 24-bit RGB r = numbers.pop(0) g = numbers.pop(0) b = numbers.pop(0) if not all(0 <= c <= 255 for c in (r, g, b)): raise ValueError() elif n == 5 and len(numbers) >= 1: # 256 colors idx = numbers.pop(0) if idx < 0: raise ValueError() if idx < 16: # 16 default terminal colors return idx if idx < 232: # 6x6x6 color cube, see http://stackoverflow.com/a/27165165/500098 r = (idx - 16) // 36 r = 55 + r * 40 if r > 0 else 0 g = ((idx - 16) % 36) // 6 g = 55 + g * 40 if g > 0 else 0 b = (idx - 16) % 6 b = 55 + b * 40 if b > 0 else 0 elif idx < 256: # grayscale, see http://stackoverflow.com/a/27165165/500098 r = g = b = (idx - 232) * 10 + 8 else: raise ValueError() else: raise ValueError() return r, g, b jupyter-nbconvert-5db0bfc/nbconvert/filters/citation.py000066400000000000000000000071561516532232300236300ustar00rootroot00000000000000"""Citation handling for LaTeX output.""" # ----------------------------------------------------------------------------- # Copyright (c) 2013, the IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Imports # ----------------------------------------------------------------------------- from html.parser import HTMLParser # ----------------------------------------------------------------------------- # Functions # ----------------------------------------------------------------------------- __all__ = ["citation2latex"] def citation2latex(s): """Parse citations in Markdown cells. This looks for HTML tags having a data attribute names ``data-cite`` and replaces it by the call to LaTeX cite command. The transformation looks like this:: (Granger, 2013) Becomes :: \\cite{granger} Any HTML tag can be used, which allows the citations to be formatted in HTML in any manner. """ parser = CitationParser() parser.feed(s) parser.close() outtext = "" startpos = 0 for citation in parser.citelist: outtext += s[startpos : citation[1]] outtext += "\\cite{%s}" % citation[0] startpos = citation[2] if len(citation) == 3 else -1 outtext += s[startpos:] if startpos != -1 else "" return outtext # ----------------------------------------------------------------------------- # Classes # ----------------------------------------------------------------------------- class CitationParser(HTMLParser): """Citation Parser Replaces html tags with data-cite attribute with respective latex \\cite. Inherites from HTMLParser, overrides: - handle_starttag - handle_endtag """ # number of open tags opentags = None # list of found citations citelist = None # type:ignore[var-annotated] # active citation tag citetag = None def __init__(self): """Initialize the parser.""" self.citelist = [] self.opentags = 0 HTMLParser.__init__(self) def get_offset(self): """Get the offset position.""" # Compute startposition in source lin, offset = self.getpos() pos = 0 for _ in range(lin - 1): pos = self.data.find("\n", pos) + 1 return pos + offset def handle_starttag(self, tag, attrs): """Handle a start tag.""" # for each tag check if attributes are present and if no citation is active if self.opentags == 0 and len(attrs) > 0: for atr, data in attrs: if atr.lower() == "data-cite": self.citetag = tag self.opentags = 1 self.citelist.append([data, self.get_offset()]) return if tag == self.citetag: # found an open citation tag but not the starting one self.opentags += 1 # type:ignore[operator] def handle_endtag(self, tag): """Handle an end tag.""" if tag == self.citetag: # found citation tag check if starting one if self.opentags == 1: pos = self.get_offset() self.citelist[-1].append(pos + len(tag) + 3) self.opentags -= 1 # type:ignore[operator] def feed(self, data): """Handle a feed.""" self.data = data HTMLParser.feed(self, data) jupyter-nbconvert-5db0bfc/nbconvert/filters/datatypefilter.py000066400000000000000000000030241516532232300250250ustar00rootroot00000000000000"""Filter used to select the first preferred output format available. The filter contained in the file allows the converter templates to select the output format that is most valuable to the active export format. The value of the different formats is set via NbConvertBase.display_data_priority """ # ----------------------------------------------------------------------------- # Copyright (c) 2013, the IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Classes and functions # ----------------------------------------------------------------------------- from warnings import warn from nbconvert.utils.base import NbConvertBase __all__ = ["DataTypeFilter"] class DataTypeFilter(NbConvertBase): """Returns the preferred display format""" def __call__(self, output): """Return the first available format in the priority. Produces a UserWarning if no compatible mimetype is found. `output` is dict with structure {mimetype-of-element: value-of-element} """ for fmt in self.display_data_priority: if fmt in output: return [fmt] warn( f"Your element with mimetype(s) {output.keys()} is not able to be represented.", stacklevel=2, ) return [] jupyter-nbconvert-5db0bfc/nbconvert/filters/filter_links.py000066400000000000000000000030241516532232300244710ustar00rootroot00000000000000"""A pandoc filter used in converting notebooks to Latex. Converts links between notebooks to Latex cross-references. """ import re from pandocfilters import RawInline, applyJSONFilters, stringify # type:ignore[import-untyped] def resolve_references(source): """ This applies the resolve_one_reference to the text passed in via the source argument. This expects content in the form of a string encoded JSON object as represented internally in ``pandoc``. """ return applyJSONFilters([resolve_one_reference], source) def resolve_one_reference(key, val, fmt, meta): """ This takes a tuple of arguments that are compatible with ``pandocfilters.walk()`` that allows identifying hyperlinks in the document and transforms them into valid LaTeX \\hyperref{} calls so that linking to headers between cells is possible. See the documentation in ``pandocfilters.walk()`` for further information on the meaning and specification of ``key``, ``val``, ``fmt``, and ``meta``. """ if key == "Link": text = stringify(val[1]) target = val[2][0] m = re.match(r"#(.+)$", target) if m: # pandoc automatically makes labels for headings. label = m.group(1).lower() label = re.sub(r"[^\w-]+", "", label) # Strip HTML entities text = re.sub(r"_", r"\_", text) # Escape underscores in display text return RawInline("tex", rf"\hyperref[{label}]{{{text}}}") return None # Other elements will be returned unchanged. jupyter-nbconvert-5db0bfc/nbconvert/filters/highlight.py000066400000000000000000000146011516532232300237560ustar00rootroot00000000000000""" Module containing filter functions that allow code to be highlighted from within Jinja templates. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. # pygments must not be imported at the module level # because errors should be raised at runtime if it's actually needed, # not import time, when it may not be needed. from html import escape from warnings import warn from traitlets import Dict, observe from nbconvert.utils.base import NbConvertBase MULTILINE_OUTPUTS = ["text", "html", "svg", "latex", "javascript", "json"] __all__ = ["Highlight2HTML", "Highlight2Latex"] class Highlight2HTML(NbConvertBase): """Convert highlighted code to html.""" extra_formatter_options = Dict( {}, help=""" Extra set of options to control how code is highlighted. Passed through to the pygments' HtmlFormatter class. See available list in https://pygments.org/docs/formatters/#HtmlFormatter """, config=True, ) def __init__(self, pygments_lexer=None, **kwargs): """Initialize the converter.""" self.pygments_lexer = pygments_lexer or "ipython3" super().__init__(**kwargs) @observe("default_language") def _default_language_changed(self, change): warn( "Setting default_language in config is deprecated as of 5.0, " "please use language_info metadata instead.", stacklevel=2, ) self.pygments_lexer = change["new"] def __call__(self, source, language=None, metadata=None): """ Return a syntax-highlighted version of the input source as html output. Parameters ---------- source : str source of the cell to highlight language : str language to highlight the syntax of metadata : NotebookNode cell metadata metadata of the cell to highlight """ from pygments.formatters import HtmlFormatter # noqa: PLC0415 if not language: language = self.pygments_lexer return _pygments_highlight( source if len(source) > 0 else " ", # needed to help post processors: HtmlFormatter( cssclass=escape(f" highlight hl-{language}"), **self.extra_formatter_options ), language, metadata, ) class Highlight2Latex(NbConvertBase): """Convert highlighted code to latex.""" extra_formatter_options = Dict( {}, help=""" Extra set of options to control how code is highlighted. Passed through to the pygments' LatexFormatter class. See available list in https://pygments.org/docs/formatters/#LatexFormatter """, config=True, ) def __init__(self, pygments_lexer=None, **kwargs): """Initialize the converter.""" self.pygments_lexer = pygments_lexer or "ipython3" super().__init__(**kwargs) @observe("default_language") def _default_language_changed(self, change): warn( "Setting default_language in config is deprecated as of 5.0, " "please use language_info metadata instead.", stacklevel=2, ) self.pygments_lexer = change["new"] def __call__(self, source, language=None, metadata=None, strip_verbatim=False): """ Return a syntax-highlighted version of the input source as latex output. Parameters ---------- source : str source of the cell to highlight language : str language to highlight the syntax of metadata : NotebookNode cell metadata metadata of the cell to highlight strip_verbatim : bool remove the Verbatim environment that pygments provides by default """ from pygments.formatters import LatexFormatter # noqa: PLC0415 if not language: language = self.pygments_lexer latex = _pygments_highlight( source, LatexFormatter(**self.extra_formatter_options), language, metadata ) if strip_verbatim: latex = latex.replace(r"\begin{Verbatim}[commandchars=\\\{\}]" + "\n", "") return latex.replace("\n\\end{Verbatim}\n", "") return latex def _pygments_highlight( source, output_formatter, language="ipython", metadata=None, **lexer_options ): """ Return a syntax-highlighted version of the input source Parameters ---------- source : str source of the cell to highlight output_formatter : Pygments formatter language : str language to highlight the syntax of metadata : NotebookNode cell metadata metadata of the cell to highlight lexer_options : dict Options to pass to the pygments lexer. See https://pygments.org/docs/lexers/#available-lexers for more information about valid lexer options """ from pygments import highlight # noqa: PLC0415 from pygments.lexers import get_lexer_by_name # noqa: PLC0415 from pygments.util import ClassNotFound # noqa: PLC0415 # If the cell uses a magic extension language, # use the magic language instead. if language.startswith("ipython") and metadata and "magics_language" in metadata: language = metadata["magics_language"] lexer = None if language == "ipython2": try: from IPython.lib.lexers import IPythonLexer # noqa: PLC0415 except ModuleNotFoundError: warn("IPython lexer unavailable, falling back on Python", stacklevel=2) language = "python" else: lexer = IPythonLexer() elif language == "ipython3": try: from IPython.lib.lexers import IPython3Lexer # noqa: PLC0415 except ModuleNotFoundError: warn("IPython3 lexer unavailable, falling back on Python 3", stacklevel=2) language = "python3" else: lexer = IPython3Lexer() if lexer is None: try: lexer = get_lexer_by_name(language, **lexer_options) except ClassNotFound: warn( "No lexer found for language %r. Treating as plain text." % language, stacklevel=2, ) from pygments.lexers.special import TextLexer # noqa: PLC0415 lexer = TextLexer() return highlight(source, lexer, output_formatter) jupyter-nbconvert-5db0bfc/nbconvert/filters/latex.py000066400000000000000000000034331516532232300231250ustar00rootroot00000000000000"""Latex filters. Module of useful filters for processing Latex within Jinja latex templates. """ # ----------------------------------------------------------------------------- # Copyright (c) 2013, the IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Imports # ----------------------------------------------------------------------------- import re # ----------------------------------------------------------------------------- # Globals and constants # ----------------------------------------------------------------------------- LATEX_RE_SUBS = ((re.compile(r"\.\.\.+"), r"{\\ldots}"),) # Latex substitutions for escaping latex. # see: http://stackoverflow.com/questions/16259923/how-can-i-escape-latex-special-characters-inside-django-templates LATEX_SUBS = { "&": r"\&", "%": r"\%", "$": r"\$", "#": r"\#", "_": r"\_", "{": r"\{", "}": r"\}", "~": r"\textasciitilde{}", "^": r"\^{}", "\\": r"\textbackslash{}", } # ----------------------------------------------------------------------------- # Functions # ----------------------------------------------------------------------------- __all__ = ["escape_latex"] def escape_latex(text): """ Escape characters that may conflict with latex. Parameters ---------- text : str Text containing characters that may conflict with Latex """ text = "".join(LATEX_SUBS.get(c, c) for c in text) for pattern, replacement in LATEX_RE_SUBS: text = pattern.sub(replacement, text) return text jupyter-nbconvert-5db0bfc/nbconvert/filters/markdown.py000066400000000000000000000065071516532232300236370ustar00rootroot00000000000000"""Markdown filters This file contains a collection of utility filters for dealing with markdown within Jinja templates. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import re from packaging.version import Version from nbconvert.utils.pandoc import get_pandoc_version try: from .markdown_mistune import markdown2html_mistune except ImportError as e: _mistune_import_error = e def markdown2html_mistune(source: str) -> str: """mistune is unavailable, raise ImportError""" msg = f"markdown2html requires mistune: {_mistune_import_error}" raise ImportError(msg) from .pandoc import convert_pandoc __all__ = [ "markdown2asciidoc", "markdown2html", "markdown2html_mistune", "markdown2html_pandoc", "markdown2latex", "markdown2rst", ] _MARKDOWN_FMT = "markdown+lists_without_preceding_blankline" def markdown2latex(source, markup=_MARKDOWN_FMT, extra_args=None): """ Convert a markdown string to LaTeX via pandoc. This function will raise an error if pandoc is not installed. Any error messages generated by pandoc are printed to stderr. Parameters ---------- source : string Input string, assumed to be valid markdown. markup : string Markup used by pandoc's reader default : pandoc extended markdown (see https://pandoc.org/README.html#pandocs-markdown) Returns ------- out : string Output as returned by pandoc. """ return convert_pandoc(source, markup, "latex", extra_args=extra_args) def markdown2html_pandoc(source, extra_args=None): """ Convert a markdown string to HTML via pandoc. """ extra_args = extra_args or ["--mathjax"] return convert_pandoc(source, _MARKDOWN_FMT, "html", extra_args=extra_args) def markdown2asciidoc(source, extra_args=None): """Convert a markdown string to asciidoc via pandoc""" # Prior to version 3.0, pandoc supported the --atx-headers flag. # For later versions, we must instead pass --markdown-headings=atx. # See https://pandoc.org/releases.html#pandoc-3.0-2023-01-18 atx_args = ["--atx-headers"] pandoc_version = get_pandoc_version() if pandoc_version and Version(pandoc_version) >= Version("3.0"): atx_args = ["--markdown-headings=atx"] extra_args = extra_args or atx_args asciidoc = convert_pandoc(source, _MARKDOWN_FMT, "asciidoc", extra_args=extra_args) # workaround for https://github.com/jgm/pandoc/issues/3068 if "__" in asciidoc: asciidoc = re.sub(r"\b__([\w \n-]+)__([:,.\n\)])", r"_\1_\2", asciidoc) # urls / links: asciidoc = re.sub(r"\(__([\w\/-:\.]+)__\)", r"(_\1_)", asciidoc) return asciidoc # The mistune renderer is the default, because it's simple to depend on it markdown2html = markdown2html_mistune def markdown2rst(source, extra_args=None): """ Convert a markdown string to ReST via pandoc. This function will raise an error if pandoc is not installed. Any error messages generated by pandoc are printed to stderr. Parameters ---------- source : string Input string, assumed to be valid markdown. Returns ------- out : string Output as returned by pandoc. """ return convert_pandoc(source, _MARKDOWN_FMT, "rst", extra_args=extra_args) jupyter-nbconvert-5db0bfc/nbconvert/filters/markdown_mistune.py000066400000000000000000000454371516532232300254100ustar00rootroot00000000000000"""Markdown filters with mistune Used from markdown.py """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import base64 import mimetypes import os from collections.abc import Iterable from html import escape from re import Match from typing import TYPE_CHECKING, Any, ClassVar, Optional, Protocol import bs4 # type: ignore[import-not-found] from pygments import highlight from pygments.formatters import HtmlFormatter from pygments.lexer import Lexer from pygments.lexers import get_lexer_by_name from pygments.util import ClassNotFound from nbconvert.filters.strings import add_anchor if TYPE_CHECKING: try: from mistune.plugins import Plugin except ImportError: class Plugin(Protocol): # type: ignore[no-redef] """Mistune plugin interface.""" def __call__(self, markdown: "Markdown") -> None: """Apply the plugin on the markdown document.""" ... try: # for Mistune >= 3.0 from mistune import ( # type:ignore[attr-defined] BlockParser, BlockState, HTMLRenderer, InlineParser, InlineState, Markdown, import_plugin, ) MISTUNE_V3 = True MISTUNE_V3_ATX = "atx_heading" in BlockParser.SPECIFICATION except ImportError: # for Mistune >= 2.0 import re from mistune import ( # type: ignore[attr-defined] PLUGINS, BlockParser, HTMLRenderer, InlineParser, Markdown, ) MISTUNE_V3 = False MISTUNE_V3_ATX = False def import_plugin(name: str) -> "Plugin": # type: ignore[misc] """Simple implementation of Mistune V3's import_plugin for V2.""" return PLUGINS[name] # type: ignore[no-any-return] class InvalidNotebook(Exception): """An invalid notebook model.""" def _dotall(pattern: str) -> str: """Makes the '.' special character match any character inside the pattern, including a newline. This is implemented with the inline flag `(?s:...)` and is equivalent to using `re.DOTALL`. It is useful for LaTeX environments, where line breaks may be present. """ return f"(?s:{pattern})" if MISTUNE_V3: # Parsers for Mistune >= 3.0.0 class MathBlockParser(BlockParser): """This acts as a pass-through to the MathInlineParser. It is needed in order to avoid other block level rules splitting math sections apart. It works by matching each multiline math environment as a single paragraph, so that other rules don't think each section is its own paragraph. Inline is ignored here. """ ATX_HEADING_WITHOUT_LEADING_SPACES = ( r"^ {0,3}(?P#{1,6})(?!#+)(?P[ \t]*(.*?)?)$" if MISTUNE_V3_ATX else r"^ {0,3}(?P#{1,6})(?!#+)(?P[ \t]*(.*?)?)$" ) MULTILINE_MATH = _dotall( # Display math mode, old TeX delimiter: $$ \sqrt{2} $$ r"(?[a-z]*\*?)\}.*?\\end\{(?P=math_env_name)\}" ) SPECIFICATION = { **BlockParser.SPECIFICATION, ( "atx_heading" if MISTUNE_V3_ATX else "axt_heading" ): ATX_HEADING_WITHOUT_LEADING_SPACES, "multiline_math": MULTILINE_MATH, } # Multiline math must be searched before other rules DEFAULT_RULES: ClassVar[Iterable[str]] = ("multiline_math", *BlockParser.DEFAULT_RULES) # type: ignore[assignment] def parse_multiline_math(self, m: Match[str], state: BlockState) -> int: """Send mutiline math as a single paragraph to MathInlineParser.""" matched_text = m[0] state.add_paragraph(matched_text) return m.end() class MathInlineParser(InlineParser): r"""This interprets the content of LaTeX style math objects. In particular this grabs ``$$...$$``, ``\\[...\\]``, ``\\(...\\)``, ``$...$``, and ``\begin{foo}...\end{foo}`` styles for declaring mathematics. It strips delimiters from all these varieties, and extracts the type of environment in the last case (``foo`` in this example). """ # Display math mode, using older TeX delimiter: $$ \pi $$ BLOCK_MATH_TEX = _dotall(r"(?.*?)(?.*?)(?.+?)(?.*?)(?[a-z]*\*?)\}" r"(?P.*?)" r"\\end\{(?P=math_env_name)\}" ) SPECIFICATION = { **InlineParser.SPECIFICATION, "block_math_tex": BLOCK_MATH_TEX, "block_math_latex": BLOCK_MATH_LATEX, "inline_math_tex": INLINE_MATH_TEX, "inline_math_latex": INLINE_MATH_LATEX, "latex_environment": LATEX_ENVIRONMENT, } # Block math must be matched first, and all math must come before text DEFAULT_RULES: ClassVar[Iterable[str]] = ( "block_math_tex", "block_math_latex", "inline_math_tex", "inline_math_latex", "latex_environment", *InlineParser.DEFAULT_RULES, ) # type: ignore[assignment] def parse_block_math_tex(self, m: Match[str], state: InlineState) -> int: """Parse older TeX-style display math.""" body = m.group("math_block_tex") state.append_token({"type": "block_math", "raw": body}) return m.end() def parse_block_math_latex(self, m: Match[str], state: InlineState) -> int: """Parse newer LaTeX-style display math.""" body = m.group("math_block_latex") state.append_token({"type": "block_math", "raw": body}) return m.end() def parse_inline_math_tex(self, m: Match[str], state: InlineState) -> int: """Parse older TeX-style inline math.""" body = m.group("math_inline_tex") state.append_token({"type": "inline_math", "raw": body}) return m.end() def parse_inline_math_latex(self, m: Match[str], state: InlineState) -> int: """Parse newer LaTeX-style inline math.""" body = m.group("math_inline_latex") state.append_token({"type": "inline_math", "raw": body}) return m.end() def parse_latex_environment(self, m: Match[str], state: InlineState) -> int: """Parse a latex environment.""" attrs = {"name": m.group("math_env_name"), "body": m.group("math_env_body")} state.append_token({"type": "latex_environment", "attrs": attrs}) return m.end() else: # Parsers for Mistune >= 2.0.0 < 3.0.0 class MathBlockParser(BlockParser): # type: ignore[no-redef] """This acts as a pass-through to the MathInlineParser. It is needed in order to avoid other block level rules splitting math sections apart. """ MULTILINE_MATH = re.compile( # Display math mode, old TeX delimiter: $$ \sqrt{2} $$ r"(? dict[str, str]: """Pass token through mutiline math.""" return {"type": "multiline_math", "text": m.group(0)} class MathInlineParser(InlineParser): # type: ignore[no-redef] r"""This interprets the content of LaTeX style math objects. In particular this grabs ``$$...$$``, ``\\[...\\]``, ``\\(...\\)``, ``$...$``, and ``\begin{foo}...\end{foo}`` styles for declaring mathematics. It strips delimiters from all these varieties, and extracts the type of environment in the last case (``foo`` in this example). """ # Display math mode, using older TeX delimiter: $$ \pi $$ BLOCK_MATH_TEX = _dotall(r"(? tuple[str, str]: """Parse block text math.""" # sometimes the Scanner keeps the final '$$', so we use the # full matched string and remove the math markers text = m.group(0)[2:-2] return "block_math", text def parse_block_math_latex(self, m: Match[str], state: Any) -> tuple[str, str]: """Parse block latex math .""" text = m.group(1) return "block_math", text def parse_inline_math_tex(self, m: Match[str], state: Any) -> tuple[str, str]: """Parse inline tex math.""" text = m.group(1) return "inline_math", text def parse_inline_math_latex(self, m: Match[str], state: Any) -> tuple[str, str]: """Parse inline latex math.""" text = m.group(1) return "inline_math", text def parse_latex_environment(self, m: Match[str], state: Any) -> tuple[str, str, str]: """Parse a latex environment.""" name, text = m.group(1), m.group(2) return "latex_environment", name, text class IPythonRenderer(HTMLRenderer): """An ipython html renderer.""" def __init__( self, escape: bool = True, allow_harmful_protocols: bool = True, embed_images: bool = False, exclude_anchor_links: bool = False, anchor_link_text: str = "¶", path: str = "", attachments: Optional[dict[str, dict[str, str]]] = None, **lexer_options, ): """Initialize the renderer.""" super().__init__(escape, allow_harmful_protocols) self.embed_images = embed_images self.exclude_anchor_links = exclude_anchor_links self.anchor_link_text = anchor_link_text self.path = path self.lexer_options = lexer_options if attachments is not None: self.attachments = attachments else: self.attachments = {} def block_code(self, code: str, info: Optional[str] = None) -> str: """Handle block code.""" lang: Optional[str] = "" lexer: Lexer if info: if info.startswith("mermaid"): return self.block_mermaidjs(code) try: if info.strip().split(None, 1): lang = info.strip().split(maxsplit=1)[0] lexer = get_lexer_by_name(lang, **self.lexer_options) except ClassNotFound: code = f"{lang}\n{code}" lang = None if not lang: return super().block_code(code, info=info) formatter = HtmlFormatter() return highlight(code, lexer, formatter) def block_mermaidjs(self, code: str) -> str: """Handle mermaid syntax.""" return ( """""" ) def block_html(self, html: str) -> str: """Handle block html.""" if self.embed_images: html = self._html_embed_images(html) return super().block_html(html) def inline_html(self, html: str) -> str: """Handle inline html.""" if self.embed_images: html = self._html_embed_images(html) return super().inline_html(html) def heading(self, text: str, level: int, **attrs: dict[str, Any]) -> str: """Handle a heading.""" html = super().heading(text, level, **attrs) if self.exclude_anchor_links: return html return str(add_anchor(html, anchor_link_text=self.anchor_link_text)) def escape_html(self, text: str) -> str: """Escape html content.""" return escape(text, quote=False) def block_math(self, body: str) -> str: """Handle block math.""" return f"$${self.escape_html(body)}$$" def multiline_math(self, text: str) -> str: """Handle mulitline math for older mistune versions.""" return text def latex_environment(self, name: str, body: str) -> str: """Handle a latex environment.""" name, body = self.escape_html(name), self.escape_html(body) return f"\\begin{{{name}}}{body}\\end{{{name}}}" def inline_math(self, body: str) -> str: """Handle inline math.""" return f"${self.escape_html(body)}$" def image(self, text: str, url: str, title: Optional[str] = None) -> str: """Rendering a image with title and text. :param text: alt text of the image. :param url: source link of the image. :param title: title text of the image. :note: The parameters `text` and `url` are swapped in older versions of mistune. """ if MISTUNE_V3: url = self._embed_image_or_attachment(url) else: # for mistune v2, the first argument is the URL text = self._embed_image_or_attachment(text) return super().image(text, url, title) def _embed_image_or_attachment(self, src: str) -> str: """Embed an image or attachment, depending on the configuration. If neither is possible, returns the original URL. """ attachment_prefix = "attachment:" if src.startswith(attachment_prefix): name = src[len(attachment_prefix) :] if name not in self.attachments: msg = f"missing attachment: {name}" raise InvalidNotebook(msg) attachment = self.attachments[name] # we choose vector over raster, and lossless over lossy preferred_mime_types = ("image/svg+xml", "image/png", "image/jpeg") for mime_type in preferred_mime_types: if mime_type in attachment: return f"data:{mime_type};base64,{attachment[mime_type]}" # otherwise we choose the first mimetype we can find default_mime_type = next(iter(attachment.keys())) return f"data:{default_mime_type};base64,{attachment[default_mime_type]}" if self.embed_images: base64_url = self._src_to_base64(src) if base64_url is not None: return base64_url return src def _src_to_base64(self, src: str) -> Optional[str]: """Turn the source file into a base64 url. :param src: source link of the file. :return: the base64 url or None if the file was not found. """ src_path = os.path.join(self.path, src) resolved = os.path.abspath(src_path) allowed_base = os.path.abspath(self.path) if not resolved.startswith(allowed_base + os.sep) and resolved != allowed_base: return None if not os.path.exists(src_path): return None with open(src_path, "rb") as fobj: mime_type, _ = mimetypes.guess_type(src_path) base64_data = base64.b64encode(fobj.read()) base64_str = base64_data.replace(b"\n", b"").decode("ascii") return f"data:{mime_type};base64,{base64_str}" def _html_embed_images(self, html: str) -> str: parsed_html = bs4.BeautifulSoup(html, features="html.parser") imgs: bs4.ResultSet[bs4.Tag] = parsed_html.find_all("img") # Replace img tags's sources by base64 dataurls for img in imgs: src = img.attrs.get("src") if src is None: continue base64_url = self._src_to_base64(img.attrs["src"]) if base64_url is not None: img.attrs["src"] = base64_url return str(parsed_html) class MarkdownWithMath(Markdown): """Markdown text with math enabled.""" DEFAULT_PLUGINS = ( # "abbr", (see https://github.com/jupyter/nbconvert/pull/1853) # "footnotes", "strikethrough", "table", "url", "task_lists", "def_list", ) def __init__( self, renderer: HTMLRenderer, block: Optional[BlockParser] = None, inline: Optional[InlineParser] = None, plugins: Optional[Iterable["Plugin"]] = None, ): """Initialize the parser.""" if block is None: block = MathBlockParser() if inline is None: if MISTUNE_V3: inline = MathInlineParser(hard_wrap=False) else: inline = MathInlineParser(renderer, hard_wrap=False) # type: ignore[arg-type,misc] if plugins is None: plugins = (import_plugin(p) for p in self.DEFAULT_PLUGINS) super().__init__(renderer, block, inline, plugins) def render(self, source: str) -> str: """Render the HTML output for a Markdown source.""" return str(super().__call__(source)) def markdown2html_mistune(source: str) -> str: """Convert a markdown string to HTML using mistune""" return MarkdownWithMath(renderer=IPythonRenderer(escape=False)).render(source) jupyter-nbconvert-5db0bfc/nbconvert/filters/metadata.py000066400000000000000000000007351516532232300235720ustar00rootroot00000000000000"""filters for metadata""" def get_metadata(output, key, mimetype=None): """Resolve an output metadata key If mimetype given, resolve at mimetype level first, then fallback to top-level. Otherwise, just resolve at top-level. Returns None if no data found. """ md = output.get("metadata") or {} if mimetype and mimetype in md: value = md[mimetype].get(key) if value is not None: return value return md.get(key) jupyter-nbconvert-5db0bfc/nbconvert/filters/pandoc.py000066400000000000000000000054631516532232300232610ustar00rootroot00000000000000""" Convert between any two formats using pandoc, and related filters """ import os from pandocfilters import Image, applyJSONFilters # type:ignore[import-untyped] from nbconvert.utils.base import NbConvertBase from nbconvert.utils.pandoc import pandoc __all__ = ["ConvertExplicitlyRelativePaths", "convert_pandoc"] def convert_pandoc(source, from_format, to_format, extra_args=None): """Convert between any two formats using pandoc. This function will raise an error if pandoc is not installed. Any error messages generated by pandoc are printed to stderr. Parameters ---------- source : string Input string, assumed to be valid in from_format. from_format : string Pandoc format of source. to_format : string Pandoc format for output. Returns ------- out : string Output as returned by pandoc. """ return pandoc(source, from_format, to_format, extra_args=extra_args) # When converting to pdf, explicitly relative references # like "./" and "../" doesn't work with TEXINPUTS. # So we need to convert them to absolute paths. # See https://github.com/jupyter/nbconvert/issues/1998 class ConvertExplicitlyRelativePaths(NbConvertBase): """A converter that handles relative path references.""" def __init__(self, texinputs=None, **kwargs): """Initialize the converter.""" # texinputs should be the directory of the notebook file self.nb_dir = os.path.abspath(texinputs) if texinputs else "" self.ancestor_dirs = self.nb_dir.split("/") super().__init__(**kwargs) def __call__(self, source): """Invoke the converter.""" # If this is not set for some reason, we can't do anything, if self.nb_dir: return applyJSONFilters([self.action], source) return source def action(self, key, value, frmt, meta): """Perform the action.""" # Convert explicitly relative paths: # ./path -> path (This should be visible to the latex engine since TEXINPUTS already has .) # ../path -> /abs_path # assuming all relative references are at the start of a given path if key == "Image": # Image seems to have this composition, according to https://github.com/jgm/pandoc-types attr, caption, [filename, typedef] = value if filename[:2] == "./": filename = filename[2:] elif filename[:3] == "../": n_up = 0 while filename[:3] == "../": n_up += 1 filename = filename[3:] ancestors = "/".join(self.ancestor_dirs[:-n_up]) + "/" filename = ancestors + filename return Image(attr, caption, [filename, typedef]) # If not image, return "no change" return None jupyter-nbconvert-5db0bfc/nbconvert/filters/strings.py000066400000000000000000000165421516532232300235060ustar00rootroot00000000000000"""String filters. Contains a collection of useful string manipulation filters for use in Jinja templates. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import base64 import os import re import textwrap import warnings from urllib.parse import quote from xml.etree.ElementTree import Element import bleach # defusedxml does safe(r) parsing of untrusted XML data from defusedxml import ElementTree from nbconvert.preprocessors.sanitize import _get_default_css_sanitizer __all__ = [ "add_anchor", "add_prompts", "ascii_only", "clean_html", "comment_lines", "get_lines", "html2text", "ipython2python", "path2url", "posix_path", "prevent_list_blocks", "strip_dollars", "strip_files_prefix", "strip_trailing_newline", "text_base64", "wrap_text", ] def wrap_text(text, width=100): """ Intelligently wrap text. Wrap text without breaking words if possible. Parameters ---------- text : str Text to wrap. width : int, optional Number of characters to wrap to, default 100. """ split_text = text.split("\n") wrp = map(lambda x: textwrap.wrap(x, width), split_text) # noqa: C417 wrpd = map("\n".join, wrp) return "\n".join(wrpd) def html2text(element): """extract inner text from html Analog of jQuery's $(element).text() """ if isinstance(element, (str,)): try: element = ElementTree.fromstring(element) except Exception: # failed to parse, just return it unmodified return element text = element.text or "" for child in element: text += html2text(child) text += element.tail or "" return text def clean_html(element): """Clean an html element.""" element = element.decode() if isinstance(element, bytes) else str(element) kwargs = {} css_sanitizer = _get_default_css_sanitizer() if css_sanitizer: kwargs["css_sanitizer"] = css_sanitizer return bleach.clean( element, tags=[*bleach.ALLOWED_TAGS, "div", "pre", "code", "span", "table", "tr", "td"], attributes={ **bleach.ALLOWED_ATTRIBUTES, "*": ["class", "id"], }, **kwargs, ) def _convert_header_id(header_contents): """Convert header contents to valid id value. Takes string as input, returns string. Note: this may be subject to change in the case of changes to how we wish to generate ids. For use on markdown headings. """ # Valid IDs need to be non-empty and contain no space characters, but are otherwise arbitrary. # However, these IDs are also used in URL fragments, which are more restrictive, so we URL # encode any characters that are not valid in URL fragments. return quote(header_contents.replace(" ", "-"), safe="?/:@!$&'()*+,;=") def add_anchor(html, anchor_link_text="¶"): """Add an id and an anchor-link to an html header For use on markdown headings """ try: h = ElementTree.fromstring(html) except Exception: # failed to parse, just return it unmodified return html link = _convert_header_id(html2text(h)) h.set("id", link) a = Element("a", {"class": "anchor-link", "href": "#" + link}) try: # Test if the anchor link text is HTML (e.g. an image) a.append(ElementTree.fromstring(anchor_link_text)) except Exception: # If we fail to parse, assume we've just got regular text a.text = anchor_link_text h.append(a) return ElementTree.tostring(h).decode(encoding="utf-8") def add_prompts(code, first=">>> ", cont="... "): """Add prompts to code snippets""" new_code = [] code_list = code.split("\n") new_code.append(first + code_list[0]) for line in code_list[1:]: new_code.append(cont + line) return "\n".join(new_code) def strip_dollars(text): """ Remove all dollar symbols from text Parameters ---------- text : str Text to remove dollars from """ return text.strip("$") files_url_pattern = re.compile(r'(src|href)\=([\'"]?)/?files/') markdown_url_pattern = re.compile(r"(!?)\[(?P.*?)\]\(/?files/(?P.*?)\)") def strip_files_prefix(text): """ Fix all fake URLs that start with ``files/``, stripping out the ``files/`` prefix. Applies to both urls (for html) and relative paths (for markdown paths). Parameters ---------- text : str Text in which to replace 'src="files/real...' with 'src="real...' """ cleaned_text = files_url_pattern.sub(r"\1=\2", text) cleaned_text = markdown_url_pattern.sub(r"\1[\2](\3)", cleaned_text) return cleaned_text # noqa: RET504 def comment_lines(text, prefix="# "): """ Build a Python comment line from input text. Parameters ---------- text : str Text to comment out. prefix : str Character to append to the start of each line. """ # Replace line breaks with line breaks and comment symbols. # Also add a comment symbol at the beginning to comment out # the first line. return prefix + ("\n" + prefix).join(text.split("\n")) def get_lines(text, start=None, end=None): """ Split the input text into separate lines and then return the lines that the caller is interested in. Parameters ---------- text : str Text to parse lines from. start : int, optional First line to grab from. end : int, optional Last line to grab from. """ # Split the input into lines. lines = text.split("\n") # Return the right lines. return "\n".join(lines[start:end]) # re-join def ipython2python(code): """Transform IPython syntax to pure Python syntax Parameters ---------- code : str IPython code, to be transformed to pure Python """ try: from IPython.core.inputtransformer2 import TransformerManager # noqa: PLC0415 except ImportError: warnings.warn( "IPython is needed to transform IPython syntax to pure Python." " Install ipython if you need this functionality.", stacklevel=2, ) return code else: isp = TransformerManager() return isp.transform_cell(code) def posix_path(path): """Turn a path into posix-style path/to/etc Mainly for use in latex on Windows, where native Windows paths are not allowed. """ if os.path.sep != "/": return path.replace(os.path.sep, "/") return path def path2url(path): """Turn a file path into a URL""" parts = path.split(os.path.sep) return "/".join(quote(part) for part in parts) def ascii_only(s): """ensure a string is ascii""" return s.encode("ascii", "replace").decode("ascii") def prevent_list_blocks(s): """ Prevent presence of enumerate or itemize blocks in latex headings cells """ out = re.sub(r"(^\s*\d*)\.", r"\1\.", s) out = re.sub(r"(^\s*)\-", r"\1\-", out) out = re.sub(r"(^\s*)\+", r"\1\+", out) out = re.sub(r"(^\s*)\*", r"\1\*", out) return out # noqa: RET504 def strip_trailing_newline(text): """ Strips a newline from the end of text. """ if text.endswith("\n"): text = text[:-1] return text def text_base64(text): """ Encode base64 text """ return base64.b64encode(text.encode()).decode() jupyter-nbconvert-5db0bfc/nbconvert/filters/widgetsdatatypefilter.py000066400000000000000000000054041516532232300264200ustar00rootroot00000000000000"""Filter used to select the first preferred output format available, excluding interactive widget format if the widget state is not available. The filter contained in the file allows the converter templates to select the output format that is most valuable to the active export format. The value of the different formats is set via NbConvertBase.display_data_priority """ # ----------------------------------------------------------------------------- # Copyright (c) 2013, the IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Classes and functions # ----------------------------------------------------------------------------- import os from warnings import warn from nbconvert.utils.base import NbConvertBase __all__ = ["WidgetsDataTypeFilter"] WIDGET_VIEW_MIMETYPE = "application/vnd.jupyter.widget-view+json" WIDGET_STATE_MIMETYPE = "application/vnd.jupyter.widget-state+json" class WidgetsDataTypeFilter(NbConvertBase): """Returns the preferred display format, excluding the widget output if there is no widget state available""" def __init__(self, notebook_metadata=None, resources=None, **kwargs): """Initialize the filter.""" self.metadata = notebook_metadata self.notebook_path = "" if resources is not None: name = resources.get("metadata", {}).get("name", "") path = resources.get("metadata", {}).get("path", "") self.notebook_path = os.path.join(path, name) super().__init__(**kwargs) def __call__(self, output): """Return the first available format in the priority. Produces a UserWarning if no compatible mimetype is found. `output` is dict with structure {mimetype-of-element: value-of-element} """ metadata = self.metadata.get(self.notebook_path, {}) widgets_state = ( metadata["widgets"][WIDGET_STATE_MIMETYPE]["state"] if metadata.get("widgets") is not None else {} ) for fmt in self.display_data_priority: if fmt in output: # If there is no widget state available, we skip this mimetype if ( fmt == WIDGET_VIEW_MIMETYPE and output[WIDGET_VIEW_MIMETYPE]["model_id"] not in widgets_state ): continue return [fmt] warn( f"Your element with mimetype(s) {output.keys()} is not able to be represented.", stacklevel=2, ) return [] jupyter-nbconvert-5db0bfc/nbconvert/nbconvertapp.py000077500000000000000000000602521516532232300230460ustar00rootroot00000000000000#!/usr/bin/env python """NbConvert is a utility for conversion of .ipynb files. Command-line interface for the NbConvert conversion utility. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from __future__ import annotations import asyncio import glob import logging import os import sys import typing as t from textwrap import dedent, fill from jupyter_core.application import JupyterApp, base_aliases, base_flags from traitlets import Bool, DottedObjectName, Instance, List, Type, Unicode, default, observe from traitlets.config import Configurable, catch_config_error from traitlets.utils.importstring import import_item from nbconvert import __version__, exporters, postprocessors, preprocessors, writers from nbconvert.utils.text import indent from .exporters.base import get_export_names, get_exporter from .utils.base import NbConvertBase from .utils.exceptions import ConversionException from .utils.io import unicode_stdin_stream # ----------------------------------------------------------------------------- # Classes and functions # ----------------------------------------------------------------------------- class DottedOrNone(DottedObjectName): """A string holding a valid dotted object name in Python, such as A.b3._c Also allows for None type. """ default_value = "" def validate(self, obj, value): """Validate an input.""" if value is not None and len(value) > 0: return super().validate(obj, value) return value nbconvert_aliases = {} nbconvert_aliases.update(base_aliases) nbconvert_aliases.update( { "to": "NbConvertApp.export_format", "template": "TemplateExporter.template_name", "template-file": "TemplateExporter.template_file", "theme": "HTMLExporter.theme", "sanitize_html": "HTMLExporter.sanitize_html", "writer": "NbConvertApp.writer_class", "post": "NbConvertApp.postprocessor_class", "output": "NbConvertApp.output_base", "output-dir": "FilesWriter.build_directory", "reveal-prefix": "SlidesExporter.reveal_url_prefix", "nbformat": "NotebookExporter.nbformat_version", } ) nbconvert_flags = {} nbconvert_flags.update(base_flags) nbconvert_flags.update( { "execute": ( {"ExecutePreprocessor": {"enabled": True}}, "Execute the notebook prior to export.", ), "allow-errors": ( {"ExecutePreprocessor": {"allow_errors": True}}, ( "Continue notebook execution even if one of the cells throws " "an error and include the error message in the cell output " "(the default behaviour is to abort conversion). This flag " "is only relevant if '--execute' was specified, too." ), ), "stdin": ( { "NbConvertApp": { "from_stdin": True, } }, "read a single notebook file from stdin. Write the resulting notebook with default basename 'notebook.*'", ), "stdout": ( {"NbConvertApp": {"writer_class": "StdoutWriter"}}, "Write notebook output to stdout instead of files.", ), "inplace": ( { "NbConvertApp": { "use_output_suffix": False, "export_format": "notebook", }, "FilesWriter": {"build_directory": ""}, }, """Run nbconvert in place, overwriting the existing notebook (only relevant when converting to notebook format)""", ), "clear-output": ( { "NbConvertApp": { "use_output_suffix": False, "export_format": "notebook", }, "FilesWriter": {"build_directory": ""}, "ClearOutputPreprocessor": {"enabled": True}, }, """Clear output of current file and save in place, overwriting the existing notebook. """, ), "coalesce-streams": ( { "NbConvertApp": {"use_output_suffix": False, "export_format": "notebook"}, "FilesWriter": {"build_directory": ""}, "CoalesceStreamsPreprocessor": {"enabled": True}, }, """Coalesce consecutive stdout and stderr outputs into one stream (within each cell).""", ), "no-prompt": ( { "TemplateExporter": { "exclude_input_prompt": True, "exclude_output_prompt": True, } }, "Exclude input and output prompts from converted document.", ), "no-input": ( { "TemplateExporter": { "exclude_output_prompt": True, "exclude_input": True, "exclude_input_prompt": True, } }, """Exclude input cells and output prompts from converted document. This mode is ideal for generating code-free reports.""", ), "allow-chromium-download": ( { "WebPDFExporter": { "allow_chromium_download": True, } }, """Whether to allow downloading chromium if no suitable version is found on the system.""", ), "disable-chromium-sandbox": ( { "WebPDFExporter": { "disable_sandbox": True, } }, """Disable chromium security sandbox when converting to PDF..""", ), "show-input": ( { "TemplateExporter": { "exclude_input": False, } }, """Shows code input. This flag is only useful for dejavu users.""", ), "embed-images": ( { "HTMLExporter": { "embed_images": True, } }, """Embed the images as base64 dataurls in the output. This flag is only useful for the HTML/WebPDF/Slides exports.""", ), "sanitize-html": ( { "HTMLExporter": { "sanitize_html": True, } }, """Whether the HTML in Markdown cells and cell outputs should be sanitized..""", ), } ) class NbConvertApp(JupyterApp): """Application used to convert from notebook file type (``*.ipynb``)""" version = __version__ name = "jupyter-nbconvert" aliases = nbconvert_aliases flags = nbconvert_flags @default("log_level") def _log_level_default(self): return logging.INFO classes: list[type] = List() # type: ignore[assignment] @default("classes") def _classes_default(self): classes: list[type[t.Any]] = [NbConvertBase] for pkg in (exporters, preprocessors, writers, postprocessors): for name in dir(pkg): cls = getattr(pkg, name) if isinstance(cls, type) and issubclass(cls, Configurable): classes.append(cls) return classes description = Unicode( """This application is used to convert notebook files (*.ipynb) to various other formats. WARNING: THE COMMANDLINE INTERFACE MAY CHANGE IN FUTURE RELEASES.""" ) output_base = Unicode( "{notebook_name}", help="""Overwrite base name use for output files. Supports pattern replacements '{notebook_name}'. """, ).tag(config=True) use_output_suffix = Bool( True, help="""Whether to apply a suffix prior to the extension (only relevant when converting to notebook format). The suffix is determined by the exporter, and is usually '.nbconvert'.""", ).tag(config=True) output_files_dir = Unicode( "{notebook_name}_files", help="""Directory to copy extra files (figures) to. '{notebook_name}' in the string will be converted to notebook basename.""", ).tag(config=True) examples = Unicode( f""" The simplest way to use nbconvert is > jupyter nbconvert mynotebook.ipynb --to html Options include {get_export_names()}. > jupyter nbconvert --to latex mynotebook.ipynb Both HTML and LaTeX support multiple output templates. LaTeX includes 'base', 'article' and 'report'. HTML includes 'basic', 'lab' and 'classic'. You can specify the flavor of the format used. > jupyter nbconvert --to html --template lab mynotebook.ipynb You can also pipe the output to stdout, rather than a file > jupyter nbconvert mynotebook.ipynb --stdout PDF is generated via latex > jupyter nbconvert mynotebook.ipynb --to pdf You can get (and serve) a Reveal.js-powered slideshow > jupyter nbconvert myslides.ipynb --to slides --post serve Multiple notebooks can be given at the command line in a couple of different ways: > jupyter nbconvert notebook*.ipynb > jupyter nbconvert notebook1.ipynb notebook2.ipynb or you can specify the notebooks list in a config file, containing:: c.NbConvertApp.notebooks = ["my_notebook.ipynb"] > jupyter nbconvert --config mycfg.py """ ) # Writer specific variables writer = Instance( "nbconvert.writers.base.WriterBase", help="""Instance of the writer class used to write the results of the conversion.""", allow_none=True, ) writer_class = DottedObjectName( "FilesWriter", help="""Writer class used to write the results of the conversion""", ).tag(config=True) writer_aliases = { "fileswriter": "nbconvert.writers.files.FilesWriter", "debugwriter": "nbconvert.writers.debug.DebugWriter", "stdoutwriter": "nbconvert.writers.stdout.StdoutWriter", } writer_factory = Type(allow_none=True) @observe("writer_class") def _writer_class_changed(self, change): new = change["new"] if new.lower() in self.writer_aliases: new = self.writer_aliases[new.lower()] self.writer_factory = import_item(new) # Post-processor specific variables postprocessor = Instance( "nbconvert.postprocessors.base.PostProcessorBase", help="""Instance of the PostProcessor class used to write the results of the conversion.""", allow_none=True, ) postprocessor_class = DottedOrNone( help="""PostProcessor class used to write the results of the conversion""" ).tag(config=True) postprocessor_aliases = {"serve": "nbconvert.postprocessors.serve.ServePostProcessor"} postprocessor_factory = Type(None, allow_none=True) @observe("postprocessor_class") def _postprocessor_class_changed(self, change): new = change["new"] if new.lower() in self.postprocessor_aliases: new = self.postprocessor_aliases[new.lower()] if new: self.postprocessor_factory = import_item(new) export_format = Unicode( # type:ignore[call-overload] allow_none=False, help=f"""The export format to be used, either one of the built-in formats {get_export_names()} or a dotted object name that represents the import path for an ``Exporter`` class""", ).tag(config=True) notebooks = List( Unicode(), help="""List of notebooks to convert. Wildcards are supported. Filenames passed positionally will be added to the list. """, ).tag(config=True) from_stdin = Bool(False, help="read a single notebook from stdin.").tag(config=True) recursive_glob = Bool( False, help="set the 'recursive' option for glob for searching wildcards." ).tag(config=True) @catch_config_error def initialize(self, argv=None): """Initialize application, notebooks, writer, and postprocessor""" # See https://bugs.python.org/issue37373 :( if sys.platform.startswith("win"): asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy()) self.init_syspath() super().initialize(argv) if hasattr(self, "load_config_environ"): self.load_config_environ() self.init_notebooks() self.init_writer() self.init_postprocessor() def init_syspath(self): """Add the cwd to the sys.path ($PYTHONPATH)""" sys.path.insert(0, os.getcwd()) def init_notebooks(self): """Construct the list of notebooks. If notebooks are passed on the command-line, they override (rather than add) notebooks specified in config files. Glob each notebook to replace notebook patterns with filenames. """ # Specifying notebooks on the command-line overrides (rather than # adds) the notebook list patterns = self.extra_args if self.extra_args else self.notebooks # Use glob to replace all the notebook patterns with filenames. filenames = [] for pattern in patterns: # Use glob to find matching filenames. Allow the user to convert # notebooks without having to type the extension. globbed_files = glob.glob(pattern, recursive=self.recursive_glob) globbed_files.extend(glob.glob(pattern + ".ipynb", recursive=self.recursive_glob)) if not globbed_files: self.log.warning("pattern %r matched no files", pattern) for filename in globbed_files: if filename not in filenames: filenames.append(filename) self.notebooks = filenames def init_writer(self): """Initialize the writer (which is stateless)""" self._writer_class_changed({"new": self.writer_class}) if self.writer_factory: self.writer = self.writer_factory(parent=self) if hasattr(self.writer, "build_directory") and self.writer.build_directory != "": self.use_output_suffix = False def init_postprocessor(self): """Initialize the postprocessor (which is stateless)""" self._postprocessor_class_changed({"new": self.postprocessor_class}) if self.postprocessor_factory: self.postprocessor = self.postprocessor_factory(parent=self) def start(self): """Run start after initialization process has completed""" super().start() self.convert_notebooks() def _notebook_filename_to_name(self, notebook_filename): """ Returns the notebook name from the notebook filename by applying `output_base` pattern and stripping extension """ basename = os.path.basename(notebook_filename) notebook_name = basename[: basename.rfind(".")] notebook_name = self.output_base.format(notebook_name=notebook_name) return notebook_name # noqa: RET504 def init_single_notebook_resources(self, notebook_filename): """Step 1: Initialize resources This initializes the resources dictionary for a single notebook. Returns ------- dict resources dictionary for a single notebook that MUST include the following keys: - config_dir: the location of the Jupyter config directory - unique_key: the notebook name - output_files_dir: a directory where output files (not including the notebook itself) should be saved """ notebook_name = self._notebook_filename_to_name(notebook_filename) self.log.debug("Notebook name is '%s'", notebook_name) # first initialize the resources we want to use resources = {} resources["config_dir"] = self.config_dir resources["unique_key"] = notebook_name output_files_dir = self.output_files_dir.format(notebook_name=notebook_name) resources["output_files_dir"] = output_files_dir return resources def export_single_notebook(self, notebook_filename, resources, input_buffer=None): """Step 2: Export the notebook Exports the notebook to a particular format according to the specified exporter. This function returns the output and (possibly modified) resources from the exporter. Parameters ---------- notebook_filename : str name of notebook file. resources : dict input_buffer : readable file-like object returning unicode. if not None, notebook_filename is ignored Returns ------- output dict resources (possibly modified) """ try: if input_buffer is not None: output, resources = self.exporter.from_file(input_buffer, resources=resources) else: output, resources = self.exporter.from_filename( notebook_filename, resources=resources ) except ConversionException: self.log.error("Error while converting '%s'", notebook_filename, exc_info=True) # noqa: G201 self.exit(1) return output, resources def write_single_notebook(self, output, resources): """Step 3: Write the notebook to file This writes output from the exporter to file using the specified writer. It returns the results from the writer. Parameters ---------- output : resources : dict resources for a single notebook including name, config directory and directory to save output Returns ------- file results from the specified writer output of exporter """ if "unique_key" not in resources: msg = "unique_key MUST be specified in the resources, but it is not" raise KeyError(msg) notebook_name = resources["unique_key"] if self.use_output_suffix and self.output_base == "{notebook_name}": notebook_name += resources.get("output_suffix", "") if not self.writer: msg = "No writer object defined!" raise ValueError(msg) return self.writer.write(output, resources, notebook_name=notebook_name) def postprocess_single_notebook(self, write_results): """Step 4: Post-process the written file Only used if a postprocessor has been specified. After the converted notebook is written to a file in Step 3, this post-processes the notebook. """ # Post-process if post processor has been defined. if hasattr(self, "postprocessor") and self.postprocessor: self.postprocessor(write_results) def convert_single_notebook(self, notebook_filename, input_buffer=None): """Convert a single notebook. Performs the following steps: 1. Initialize notebook resources 2. Export the notebook to a particular format 3. Write the exported notebook to file 4. (Maybe) postprocess the written file Parameters ---------- notebook_filename : str input_buffer : If input_buffer is not None, conversion is done and the buffer is used as source into a file basenamed by the notebook_filename argument. """ if input_buffer is None: self.log.info("Converting notebook %s to %s", notebook_filename, self.export_format) else: self.log.info("Converting notebook into %s", self.export_format) resources = self.init_single_notebook_resources(notebook_filename) output, resources = self.export_single_notebook( notebook_filename, resources, input_buffer=input_buffer ) write_results = self.write_single_notebook(output, resources) self.postprocess_single_notebook(write_results) def convert_notebooks(self): """Convert the notebooks in the self.notebooks traitlet""" # no notebooks to convert! if len(self.notebooks) == 0 and not self.from_stdin: self.print_help() sys.exit(-1) if not self.export_format: msg = ( "Please specify an output format with '--to '." f"\nThe following formats are available: {get_export_names()}" ) raise ValueError(msg) # initialize the exporter cls = get_exporter(self.export_format) self.exporter = cls(config=self.config) # strip duplicate extension from output_base, to avoid Basename.ext.ext if getattr(self.exporter, "file_extension", False): base, ext = os.path.splitext(self.output_base) if ext == self.exporter.file_extension: self.output_base = base # convert each notebook if not self.from_stdin: for notebook_filename in self.notebooks: self.convert_single_notebook(notebook_filename) else: input_buffer = unicode_stdin_stream() # default name when conversion from stdin self.convert_single_notebook("notebook.ipynb", input_buffer=input_buffer) input_buffer.close() def document_flag_help(self): """ Return a string containing descriptions of all the flags. """ flags = "The following flags are defined:\n\n" for flag, (cfg, fhelp) in self.flags.items(): flags += f"{flag}\n" flags += indent(fill(fhelp, 80)) + "\n\n" flags += indent(fill("Long Form: " + str(cfg), 80)) + "\n\n" return flags def document_alias_help(self): """Return a string containing all of the aliases""" aliases = "The following aliases are defined:\n\n" for alias, longname in self.aliases.items(): aliases += f"\t**{alias}** ({longname})\n\n" return aliases def document_config_options(self): """ Provides a much improves version of the configuration documentation by breaking the configuration options into app, exporter, writer, preprocessor, postprocessor, and other sections. """ categories = { category: [c for c in self._classes_inc_parents() if category in c.__name__.lower()] for category in ["app", "exporter", "writer", "preprocessor", "postprocessor"] } accounted_for = {c for category in categories.values() for c in category} categories["other"] = [c for c in self._classes_inc_parents() if c not in accounted_for] header = dedent( """ {section} Options ----------------------- """ ) sections = "" for category, value in categories.items(): sections += header.format(section=category.title()) if category in ["exporter", "preprocessor", "writer"]: sections += f".. image:: _static/{category}_inheritance.png\n\n" sections += "\n".join(c.class_config_rst_doc() for c in value) return sections.replace(" : ", r" \: ") class DejavuApp(NbConvertApp): """A deja vu app.""" def initialize(self, argv=None): """Initialize the app.""" self.config.TemplateExporter.exclude_input = True self.config.TemplateExporter.exclude_output_prompt = True self.config.TemplateExporter.exclude_input_prompt = True self.config.ExecutePreprocessor.enabled = True self.config.WebPDFExporter.paginate = False self.config.QtPDFExporter.paginate = False super().initialize(argv) if hasattr(self, "load_config_environ"): self.load_config_environ() @default("export_format") def _default_export_format(self): return "html" # ----------------------------------------------------------------------------- # Main entry point # ----------------------------------------------------------------------------- main = launch_new_instance = NbConvertApp.launch_instance dejavu_main = DejavuApp.launch_instance jupyter-nbconvert-5db0bfc/nbconvert/postprocessors/000077500000000000000000000000001516532232300230735ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/nbconvert/postprocessors/__init__.py000066400000000000000000000004031516532232300252010ustar00rootroot00000000000000from .base import PostProcessorBase # protect against unavailable tornado try: from .serve import ServePostProcessor except ImportError: ServePostProcessor = None # type:ignore[misc,assignment] __all__ = ["PostProcessorBase", "ServePostProcessor"] jupyter-nbconvert-5db0bfc/nbconvert/postprocessors/base.py000066400000000000000000000022021516532232300243530ustar00rootroot00000000000000""" Basic post processor """ # ----------------------------------------------------------------------------- # Copyright (c) 2013, the IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Imports # ----------------------------------------------------------------------------- from nbconvert.utils.base import NbConvertBase # ----------------------------------------------------------------------------- # Classes # ----------------------------------------------------------------------------- class PostProcessorBase(NbConvertBase): """The base class for post processors.""" def __call__(self, input_): """ See def postprocess() ... """ self.postprocess(input_) def postprocess(self, input_): """ Post-process output from a writer. """ msg = "postprocess" raise NotImplementedError(msg) jupyter-nbconvert-5db0bfc/nbconvert/postprocessors/serve.py000066400000000000000000000103651516532232300245760ustar00rootroot00000000000000"""PostProcessor for serving reveal.js HTML slideshows.""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. from __future__ import annotations import os import threading import typing as t import webbrowser from tornado import gen, httpserver, ioloop, log, web from tornado.httpclient import AsyncHTTPClient from traitlets import Bool, Int, Unicode from .base import PostProcessorBase class ProxyHandler(web.RequestHandler): """handler the proxies requests from a local prefix to a CDN""" @gen.coroutine def get(self, prefix, url): """proxy a request to a CDN""" proxy_url = "/".join([self.settings["cdn"], url]) client = self.settings["client"] response = yield client.fetch(proxy_url) for header in ["Content-Type", "Cache-Control", "Date", "Last-Modified", "Expires"]: if header in response.headers: self.set_header(header, response.headers[header]) self.finish(response.body) class ServePostProcessor(PostProcessorBase): """Post processor designed to serve files Proxies reveal.js requests to a CDN if no local reveal.js is present """ open_in_browser = Bool(True, help="""Should the browser be opened automatically?""").tag( config=True ) browser = Unicode( "", help="""Specify what browser should be used to open slides. See https://docs.python.org/3/library/webbrowser.html#webbrowser.register to see how keys are mapped to browser executables. If not specified, the default browser will be determined by the `webbrowser` standard library module, which allows setting of the BROWSER environment variable to override it. """, ).tag(config=True) reveal_cdn = Unicode( "https://cdnjs.cloudflare.com/ajax/libs/reveal.js/3.5.0", help="""URL for reveal.js CDN.""" ).tag(config=True) reveal_prefix = Unicode("reveal.js", help="URL prefix for reveal.js").tag(config=True) ip = Unicode("127.0.0.1", help="The IP address to listen on.").tag(config=True) port = Int(8000, help="port for the server to listen on.").tag(config=True) def postprocess(self, input): """Serve the build directory with a webserver.""" dirname, filename = os.path.split(input) handlers: list[tuple[t.Any, ...]] = [ (r"/(.+)", web.StaticFileHandler, {"path": dirname}), (r"/", web.RedirectHandler, {"url": "/%s" % filename}), ] if "://" in self.reveal_prefix or self.reveal_prefix.startswith("//"): # reveal specifically from CDN, nothing to do pass elif os.path.isdir(os.path.join(dirname, self.reveal_prefix)): # reveal prefix exists self.log.info("Serving local %s", self.reveal_prefix) else: self.log.info("Redirecting %s requests to %s", self.reveal_prefix, self.reveal_cdn) handlers.insert(0, (r"/(%s)/(.*)" % self.reveal_prefix, ProxyHandler)) app = web.Application( handlers, cdn=self.reveal_cdn, client=AsyncHTTPClient(), ) # hook up tornado logging to our logger log.app_log = self.log http_server = httpserver.HTTPServer(app) http_server.listen(self.port, address=self.ip) url = "http://%s:%i/%s" % (self.ip, self.port, filename) print("Serving your slides at %s" % url) print("Use Control-C to stop this server") if self.open_in_browser: try: browser = webbrowser.get(self.browser or None) b = lambda: browser.open(url, new=2) # noqa: E731 threading.Thread(target=b).start() except webbrowser.Error as e: self.log.warning("No web browser found: %s.", e) browser = None try: ioloop.IOLoop.instance().start() except KeyboardInterrupt: print("\nInterrupted") def main(path): """allow running this module to serve the slides""" server = ServePostProcessor() server(path) if __name__ == "__main__": import sys main(sys.argv[1]) jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/000077500000000000000000000000001516532232300226745ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/__init__.py000066400000000000000000000023771516532232300250160ustar00rootroot00000000000000# Class base Preprocessors # Backwards compatibility for imported name from nbclient.exceptions import CellExecutionError from .base import Preprocessor from .clearmetadata import ClearMetadataPreprocessor from .clearoutput import ClearOutputPreprocessor from .coalescestreams import CoalesceStreamsPreprocessor from .convertfigures import ConvertFiguresPreprocessor from .csshtmlheader import CSSHTMLHeaderPreprocessor from .execute import ExecutePreprocessor from .extractattachments import ExtractAttachmentsPreprocessor from .extractoutput import ExtractOutputPreprocessor from .highlightmagics import HighlightMagicsPreprocessor from .latex import LatexPreprocessor from .regexremove import RegexRemovePreprocessor from .svg2pdf import SVG2PDFPreprocessor from .tagremove import TagRemovePreprocessor __all__ = [ "CSSHTMLHeaderPreprocessor", "CellExecutionError", "ClearMetadataPreprocessor", "ClearOutputPreprocessor", "CoalesceStreamsPreprocessor", "ConvertFiguresPreprocessor", "ExecutePreprocessor", "ExtractAttachmentsPreprocessor", "ExtractOutputPreprocessor", "HighlightMagicsPreprocessor", "LatexPreprocessor", "Preprocessor", "RegexRemovePreprocessor", "SVG2PDFPreprocessor", "TagRemovePreprocessor", ] jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/base.py000066400000000000000000000053511516532232300241640ustar00rootroot00000000000000"""Base class for preprocessors""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from traitlets import Bool from nbconvert.utils.base import NbConvertBase class Preprocessor(NbConvertBase): """A configurable preprocessor Inherit from this class if you wish to have configurability for your preprocessor. Any configurable traitlets this class exposed will be configurable in profiles using c.SubClassName.attribute = value You can overwrite `preprocess_cell()` to apply a transformation independently on each cell or `preprocess()` if you prefer your own logic. See corresponding docstring for information. Disabled by default and can be enabled via the config by 'c.YourPreprocessorName.enabled = True' """ enabled = Bool(False).tag(config=True) def __init__(self, **kw): """ Public constructor Parameters ---------- config : Config Configuration file structure `**kw` Additional keyword arguments passed to parent """ super().__init__(**kw) def __call__(self, nb, resources): """Apply the preprocessor.""" if self.enabled: self.log.debug("Applying preprocessor: %s", self.__class__.__name__) return self.preprocess(nb, resources) return nb, resources def preprocess(self, nb, resources): """ Preprocessing to apply on each notebook. Must return modified nb, resources. If you wish to apply your preprocessing to each cell, you might want to override preprocess_cell method instead. Parameters ---------- nb : NotebookNode Notebook being converted resources : dictionary Additional resources used in the conversion process. Allows preprocessors to pass variables into the Jinja engine. """ for index, cell in enumerate(nb.cells): nb.cells[index], resources = self.preprocess_cell(cell, resources, index) return nb, resources def preprocess_cell(self, cell, resources, index): """ Override if you want to apply some preprocessing to each cell. Must return modified cell and resource dictionary. Parameters ---------- cell : NotebookNode cell Notebook cell being processed resources : dictionary Additional resources used in the conversion process. Allows preprocessors to pass variables into the Jinja engine. index : int Index of the cell being processed """ msg = "should be implemented by subclass" raise NotImplementedError(msg) jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/clearmetadata.py000066400000000000000000000072641516532232300260460ustar00rootroot00000000000000"""Module containing a preprocessor that removes metadata from code cells""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from traitlets import Bool, Set from .base import Preprocessor class ClearMetadataPreprocessor(Preprocessor): """ Removes all the metadata from all code cells in a notebook. """ clear_cell_metadata = Bool( True, help=("Flag to choose if cell metadata is to be cleared in addition to notebook metadata."), ).tag(config=True) clear_notebook_metadata = Bool( True, help=("Flag to choose if notebook metadata is to be cleared in addition to cell metadata."), ).tag(config=True) preserve_nb_metadata_mask = Set( [("language_info", "name")], help=( "Indicates the key paths to preserve when deleting metadata " "across both cells and notebook metadata fields. Tuples of " "keys can be passed to preserved specific nested values" ), ).tag(config=True) preserve_cell_metadata_mask = Set( help=( "Indicates the key paths to preserve when deleting metadata " "across both cells and notebook metadata fields. Tuples of " "keys can be passed to preserved specific nested values" ) ).tag(config=True) def current_key(self, mask_key): """Get the current key for a mask key.""" if isinstance(mask_key, str): return mask_key if len(mask_key) == 0: # Safeguard return None return mask_key[0] def current_mask(self, mask): """Get the current mask for a mask.""" return {self.current_key(k) for k in mask if self.current_key(k) is not None} def nested_masks(self, mask): """Get the nested masks for a mask.""" return { self.current_key(k[0]): k[1:] for k in mask if k and not isinstance(k, str) and len(k) > 1 } def nested_filter(self, items, mask): """Get the nested filter for items given a mask.""" keep_current = self.current_mask(mask) keep_nested_lookup = self.nested_masks(mask) for k, v in items: keep_nested = keep_nested_lookup.get(k) if k in keep_current: if keep_nested is not None: if isinstance(v, dict): yield k, dict(self.nested_filter(v.items(), keep_nested)) else: yield k, v def preprocess_cell(self, cell, resources, cell_index): """ All the code cells are returned with an empty metadata field. """ if self.clear_cell_metadata and cell.cell_type == "code": # noqa: SIM102 # Remove metadata if "metadata" in cell: cell.metadata = dict( self.nested_filter(cell.metadata.items(), self.preserve_cell_metadata_mask) ) return cell, resources def preprocess(self, nb, resources): """ Preprocessing to apply on each notebook. Must return modified nb, resources. Parameters ---------- nb : NotebookNode Notebook being converted resources : dictionary Additional resources used in the conversion process. Allows preprocessors to pass variables into the Jinja engine. """ nb, resources = super().preprocess(nb, resources) if self.clear_notebook_metadata and "metadata" in nb: nb.metadata = dict( self.nested_filter(nb.metadata.items(), self.preserve_nb_metadata_mask) ) return nb, resources jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/clearoutput.py000066400000000000000000000016421516532232300256200ustar00rootroot00000000000000"""Module containing a preprocessor that removes the outputs from code cells""" # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from traitlets import Set from .base import Preprocessor class ClearOutputPreprocessor(Preprocessor): """ Removes the output from all code cells in a notebook. """ remove_metadata_fields = Set({"collapsed", "scrolled"}).tag(config=True) def preprocess_cell(self, cell, resources, cell_index): """ Apply a transformation on each cell. See base.py for details. """ if cell.cell_type == "code": cell.outputs = [] cell.execution_count = None # Remove metadata associated with output if "metadata" in cell: for field in self.remove_metadata_fields: cell.metadata.pop(field, None) return cell, resources jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/coalescestreams.py000066400000000000000000000025511516532232300264260ustar00rootroot00000000000000"""Preprocessor for merging consecutive stream outputs for easier handling.""" import re # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from nbconvert.preprocessors import Preprocessor CR_PAT = re.compile(r".*\r(?=[^\n])") class CoalesceStreamsPreprocessor(Preprocessor): """ Merge consecutive sequences of stream output into single stream to prevent extra newlines inserted at flush calls """ def preprocess_cell(self, cell, resources, cell_index): """ Apply a transformation on each cell. See base.py for details. """ outputs = cell.get("outputs", []) if not outputs: return cell, resources last = outputs[0] new_outputs = [last] for output in outputs[1:]: if ( output.output_type == "stream" and last.output_type == "stream" and last.name == output.name ): last.text += output.text else: new_outputs.append(output) last = output # process \r characters for output in new_outputs: if output.output_type == "stream" and "\r" in output.text: output.text = CR_PAT.sub("", output.text) cell.outputs = new_outputs return cell, resources jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/convertfigures.py000066400000000000000000000030031516532232300263070ustar00rootroot00000000000000"""Module containing a preprocessor that converts outputs in the notebook from one format to another. Converts all of the outputs in a notebook from one format to another. """ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. from traitlets import Unicode from .base import Preprocessor class ConvertFiguresPreprocessor(Preprocessor): """ Converts all of the outputs in a notebook from one format to another. """ from_format = Unicode(help="Format the converter accepts").tag(config=True) to_format = Unicode(help="Format the converter writes").tag(config=True) def __init__(self, **kw): """ Public constructor """ super().__init__(**kw) def convert_figure(self, data_format, data): """Convert the figure.""" raise NotImplementedError() def preprocess_cell(self, cell, resources, cell_index): """ Apply a transformation on each cell, See base.py """ # Loop through all of the datatypes of the outputs in the cell. for output in cell.get("outputs", []): if ( output.output_type in {"execute_result", "display_data"} and self.from_format in output.data and self.to_format not in output.data ): output.data[self.to_format] = self.convert_figure( self.from_format, output.data[self.from_format] ) return cell, resources jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/csshtmlheader.py000066400000000000000000000063741516532232300261060ustar00rootroot00000000000000"""Module that pre-processes the notebook for export to HTML.""" # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. import hashlib import os from jupyterlab_pygments import JupyterStyle # type:ignore[import-untyped] from pygments.style import Style from traitlets import Type, Unicode, Union from .base import Preprocessor try: from notebook import DEFAULT_STATIC_FILES_PATH # type:ignore[import-not-found] except ImportError: DEFAULT_STATIC_FILES_PATH = None class CSSHTMLHeaderPreprocessor(Preprocessor): """ Preprocessor used to pre-process notebook for HTML output. Adds IPython notebook front-end CSS and Pygments CSS to HTML output. """ highlight_class = Unicode(".highlight", help="CSS highlight class identifier").tag(config=True) style = Union( [Unicode("default"), Type(klass=Style)], help="Name of the pygments style to use", default_value=JupyterStyle, ).tag(config=True) def __init__(self, *pargs, **kwargs): """Initialize the preprocessor.""" Preprocessor.__init__(self, *pargs, **kwargs) self._default_css_hash = None def preprocess(self, nb, resources): """Fetch and add CSS to the resource dictionary Fetch CSS from IPython and Pygments to add at the beginning of the html files. Add this css in resources in the "inlining.css" key Parameters ---------- nb : NotebookNode Notebook being converted resources : dictionary Additional resources used in the conversion process. Allows preprocessors to pass variables into the Jinja engine. """ resources["inlining"] = {} resources["inlining"]["css"] = self._generate_header(resources) return nb, resources def _generate_header(self, resources): """ Fills self.header with lines of CSS extracted from IPython and Pygments. """ from pygments.formatters import HtmlFormatter # noqa: PLC0415 header = [] formatter = HtmlFormatter(style=self.style) pygments_css = formatter.get_style_defs(self.highlight_class) header.append(pygments_css) # Load the user's custom CSS and IPython's default custom CSS. If they # differ, assume the user has made modifications to his/her custom CSS # and that we should inline it in the nbconvert output. config_dir = resources["config_dir"] custom_css_filename = os.path.join(config_dir, "custom", "custom.css") if os.path.isfile(custom_css_filename): if DEFAULT_STATIC_FILES_PATH and self._default_css_hash is None: self._default_css_hash = self._hash( os.path.join(DEFAULT_STATIC_FILES_PATH, "custom", "custom.css") ) if self._hash(custom_css_filename) != self._default_css_hash: with open(custom_css_filename, encoding="utf-8") as f: header.append(f.read()) return header def _hash(self, filename): """Compute the hash of a file.""" md5 = hashlib.md5() # noqa: S324 with open(filename, "rb") as f: md5.update(f.read()) return md5.digest() jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/execute.py000066400000000000000000000107701516532232300247150ustar00rootroot00000000000000# Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. """Module containing a preprocessor that executes the code cells and updates outputs""" from __future__ import annotations import typing as t from warnings import warn from jupyter_client.manager import KernelManager from nbclient.client import NotebookClient from nbclient.client import execute as _execute # Backwards compatibility for imported name from nbclient.exceptions import CellExecutionError # noqa: F401 from nbformat import NotebookNode from .base import Preprocessor def executenb(*args, **kwargs): """DEPRECATED.""" warn( "The 'nbconvert.preprocessors.execute.executenb' function was moved to nbclient.execute. " "We recommend importing that library directly.", FutureWarning, stacklevel=2, ) return _execute(*args, **kwargs) # We inherit from both classes to allow for traitlets to resolve as they did pre-6.0. # This unfortunately makes for some ugliness around initialization as NotebookClient # assumes it's a constructed class with a nb object that we have to hack around. class ExecutePreprocessor(Preprocessor, NotebookClient): """ Executes all the cells in a notebook """ def __init__(self, **kw): """Initialize the preprocessor.""" nb = kw.get("nb") if nb is None: nb = NotebookNode() Preprocessor.__init__(self, nb=nb, **kw) NotebookClient.__init__(self, nb, **kw) def _check_assign_resources(self, resources): if resources or not hasattr(self, "resources"): self.resources = resources def preprocess( self, nb: NotebookNode, resources: t.Any = None, km: KernelManager | None = None ) -> tuple[NotebookNode, dict[str, t.Any]]: """ Preprocess notebook executing each code cell. The input argument *nb* is modified in-place. Note that this function recalls NotebookClient.__init__, which may look wrong. However since the preprocess call acts line an init on execution state it's expected. Therefore, we need to capture it here again to properly reset because traitlet assignments are not passed. There is a risk if traitlets apply any side effects for dual init. The risk should be manageable, and this approach minimizes side-effects relative to other alternatives. One alternative but rejected implementation would be to copy the client's init internals which has already gotten out of sync with nbclient 0.5 release before nbconvert 6.0 released. Parameters ---------- nb : NotebookNode Notebook being executed. resources : dictionary (optional) Additional resources used in the conversion process. For example, passing ``{'metadata': {'path': run_path}}`` sets the execution path to ``run_path``. km: KernelManager (optional) Optional kernel manager. If none is provided, a kernel manager will be created. Returns ------- nb : NotebookNode The executed notebook. resources : dictionary Additional resources used in the conversion process. """ NotebookClient.__init__(self, nb, km) self.reset_execution_trackers() self._check_assign_resources(resources) with self.setup_kernel(): assert self.kc info_msg = self.wait_for_reply(self.kc.kernel_info()) assert info_msg self.nb.metadata["language_info"] = info_msg["content"]["language_info"] for index, cell in enumerate(self.nb.cells): self.preprocess_cell(cell, resources, index) self.set_widgets_metadata() return self.nb, self.resources def preprocess_cell(self, cell, resources, index): """ Override if you want to apply some preprocessing to each cell. Must return modified cell and resource dictionary. Parameters ---------- cell : NotebookNode cell Notebook cell being processed resources : dictionary Additional resources used in the conversion process. Allows preprocessors to pass variables into the Jinja engine. index : int Index of the cell being processed """ self._check_assign_resources(resources) cell = self.execute_cell(cell, index, store_history=True) return cell, self.resources jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/extractattachments.py000066400000000000000000000117131516532232300271570ustar00rootroot00000000000000""" Module that extracts attachments from notebooks into their own files """ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. import os from base64 import b64decode from traitlets import Bool, Unicode from .base import Preprocessor class ExtractAttachmentsPreprocessor(Preprocessor): """ Extracts attachments from all (markdown and raw) cells in a notebook. The extracted attachments are stored in a directory ('attachments' by default). https://nbformat.readthedocs.io/en/latest/format_description.html#cell-attachments """ attachments_directory_template = Unicode( "{notebook_name}_attachments", help="Directory to place attachments if use_separate_dir is True", ).tag(config=True) use_separate_dir = Bool( False, help="Whether to use output_files_dir (which ExtractOutput also uses) or " "create a separate directory for attachments", ).tag(config=True) def __init__(self, **kw): """ Public constructor """ super().__init__(**kw) # directory path, self.path_name = "" # will be set in self.preprocess, needs resources # Where extracted attachments are stored in resources self.resources_item_key = ( "attachments" # Here as a default, in case someone doesn't want to call preprocess ) # Add condition and configurability here def preprocess(self, nb, resources): """ Determine some settings and apply preprocessor to notebook """ if self.use_separate_dir: self.path_name = self.attachments_directory_template.format( notebook_name=resources["unique_key"] ) # Initialize resources for attachments resources["attachment_files_dir"] = self.path_name resources["attachments"] = {} self.resources_item_key = "attachments" else: # Use same resources as ExtractOutput self.path_name = resources["output_files_dir"] self.resources_item_key = "outputs" # Make sure key exists if not isinstance(resources[self.resources_item_key], dict): resources[self.resources_item_key] = {} nb, resources = super().preprocess(nb, resources) return nb, resources def preprocess_cell(self, cell, resources, index): """ Extract attachments to individual files and change references to them. E.g. '![image.png](attachment:021fdd80.png)' becomes '![image.png]({path_name}/021fdd80.png)' Assumes self.path_name and self.resources_item_key is set properly (usually in preprocess). """ if "attachments" in cell: for fname in cell.attachments: self.log.debug("Encountered attachment %s", fname) # Sanitize: use only the basename to prevent path traversal safe_fname = os.path.basename(fname) if not safe_fname: self.log.warning( "Attachment filename '%s' is invalid (empty basename), skipping", fname, ) continue if safe_fname != fname: self.log.warning( "Attachment filename '%s' contained path components, using basename '%s'", fname, safe_fname, ) # Add file for writer # Right now I don't know of a situation where there would be multiple # mime types under same filename, and I can't index into it without the mimetype. # So I only read the first one. for mimetype in cell.attachments[fname]: # convert to bytes and decode data = cell.attachments[fname][mimetype].encode("utf-8") decoded = b64decode(data) break # FilesWriter wants path to be in attachment filename here new_filename = os.path.join(self.path_name, safe_fname) if new_filename in resources[self.resources_item_key]: self.log.warning( "Attachment filename '%s' (from '%s') overwrites a previous " "attachment with the same name", safe_fname, fname, ) resources[self.resources_item_key][new_filename] = decoded # Edit the reference to the attachment # os.path.join on windows uses "\\" separator, # but files like markdown still want "/" if os.path.sep != "/": new_filename = new_filename.replace(os.path.sep, "/") cell.source = cell.source.replace("attachment:" + fname, new_filename) return cell, resources jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/extractoutput.py000066400000000000000000000144551516532232300262120ustar00rootroot00000000000000"""A preprocessor that extracts all of the outputs from the notebook file. The extracted outputs are returned in the 'resources' dictionary. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. import json import os import sys from binascii import a2b_base64 from mimetypes import guess_extension from textwrap import dedent from traitlets import Set, Unicode from .base import Preprocessor def guess_extension_without_jpe(mimetype): """ This function fixes a problem with '.jpe' extensions of jpeg images which are then not recognised by latex. For any other case, the function works in the same way as mimetypes.guess_extension """ ext = guess_extension(mimetype) if ext == ".jpe": ext = ".jpeg" return ext def platform_utf_8_encode(data): """Encode data based on platform.""" if isinstance(data, str): if sys.platform == "win32": data = data.replace("\n", "\r\n") data = data.encode("utf-8") return data class ExtractOutputPreprocessor(Preprocessor): """ Extracts all of the outputs from the notebook file. The extracted outputs are returned in the 'resources' dictionary. """ output_filename_template = Unicode("{unique_key}_{cell_index}_{index}{extension}").tag( config=True ) extract_output_types = Set({"image/png", "image/jpeg", "image/svg+xml", "application/pdf"}).tag( config=True ) def preprocess_cell(self, cell, resources, cell_index): """ Apply a transformation on each cell, Parameters ---------- cell : NotebookNode cell Notebook cell being processed resources : dictionary Additional resources used in the conversion process. Allows preprocessors to pass variables into the Jinja engine. cell_index : int Index of the cell being processed (see base.py) """ # Get the unique key from the resource dict if it exists. If it does not # exist, use 'output' as the default. Also, get files directory if it # has been specified unique_key = resources.get("unique_key", "output") output_files_dir = resources.get("output_files_dir", None) # Make sure outputs key exists if not isinstance(resources["outputs"], dict): resources["outputs"] = {} # Loop through all of the outputs in the cell for index, out in enumerate(cell.get("outputs", [])): if out.output_type not in {"display_data", "execute_result"}: continue if "text/html" in out.data: out["data"]["text/html"] = dedent(out["data"]["text/html"]) # Get the output in data formats that the template needs extracted for mime_type in self.extract_output_types: if mime_type in out.data: data = out.data[mime_type] # Binary files are base64-encoded, SVG is already XML if mime_type in {"image/png", "image/jpeg", "application/pdf"}: # data is b64-encoded as text (str, unicode), # we want the original bytes data = a2b_base64(data) elif mime_type == "application/json" or not isinstance(data, str): # Data is either JSON-like and was parsed into a Python # object according to the spec, or data is for sure # JSON. In the latter case we want to go extra sure that # we enclose a scalar string value into extra quotes by # serializing it properly. if isinstance(data, bytes): # We need to guess the encoding in this # instance. Some modules that return raw data like # svg can leave the data in byte form instead of str data = data.decode("utf-8") data = platform_utf_8_encode(json.dumps(data)) else: # All other text_type data will fall into this path data = platform_utf_8_encode(data) ext = guess_extension_without_jpe(mime_type) if ext is None: ext = "." + mime_type.rsplit("/")[-1] if out.metadata.get("filename", ""): filename = out.metadata["filename"] if not filename.endswith(ext): filename += ext else: filename = self.output_filename_template.format( unique_key=unique_key, cell_index=cell_index, index=index, extension=ext ) # On the cell, make the figure available via # cell.outputs[i].metadata.filenames['mime/type'] # where # cell.outputs[i].data['mime/type'] contains the data if output_files_dir is not None: filename = os.path.join(output_files_dir, filename) out.metadata.setdefault("filenames", {}) out.metadata["filenames"][mime_type] = filename if filename in resources["outputs"]: msg = ( "Your outputs have filename metadata associated " "with them. Nbconvert saves these outputs to " "external files using this filename metadata. " "Filenames need to be unique across the notebook, " f"or images will be overwritten. The filename {filename} is " "associated with more than one output. The second " "output associated with this filename is in cell " f"{cell_index}." ) raise ValueError(msg) # In the resources, make the figure available via # resources['outputs']['filename'] = data resources["outputs"][filename] = data return cell, resources jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/highlightmagics.py000066400000000000000000000061751516532232300264120ustar00rootroot00000000000000"""This preprocessor detect cells using a different language through magic extensions such as `%%R` or `%%octave`. Cell's metadata is marked so that the appropriate highlighter can be used in the `highlight` filter. """ # Copyright (c) Jupyter Development Team. # Distributed under the terms of the Modified BSD License. import re from traitlets import Dict from .base import Preprocessor class HighlightMagicsPreprocessor(Preprocessor): """ Detects and tags code cells that use a different languages than Python. """ # list of magic language extensions and their associated pygment lexers default_languages = Dict( { "%%R": "r", "%%bash": "bash", "%%cython": "cython", "%%javascript": "javascript", "%%julia": "julia", "%%latex": "latex", "%%octave": "octave", "%%perl": "perl", "%%ruby": "ruby", "%%sh": "sh", "%%sql": "sql", } ) # user defined language extensions languages = Dict( help=( "Syntax highlighting for magic's extension languages. " "Each item associates a language magic extension such as %%R, " "with a pygments lexer such as r." ) ).tag(config=True) def __init__(self, config=None, **kw): """Public constructor""" super().__init__(config=config, **kw) # Update the default languages dict with the user configured ones self.default_languages.update(self.languages) # build a regular expression to catch language extensions and choose # an adequate pygments lexer any_language = "|".join(self.default_languages.keys()) self.re_magic_language = re.compile(rf"^\s*({any_language})\s+") def which_magic_language(self, source): """ When a cell uses another language through a magic extension, the other language is returned. If no language magic is detected, this function returns None. Parameters ---------- source: str Source code of the cell to highlight """ m = self.re_magic_language.match(source) if m: # By construction of the re, the matched language must be in the # languages dictionary return self.default_languages[m.group(1)] return None def preprocess_cell(self, cell, resources, cell_index): """ Tags cells using a magic extension language Parameters ---------- cell : NotebookNode cell Notebook cell being processed resources : dictionary Additional resources used in the conversion process. Allows preprocessors to pass variables into the Jinja engine. cell_index : int Index of the cell being processed (see base.py) """ # Only tag code cells if cell.cell_type == "code": magic_language = self.which_magic_language(cell.source) if magic_language: cell["metadata"]["magics_language"] = magic_language return cell, resources jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/latex.py000066400000000000000000000053001516532232300243610ustar00rootroot00000000000000"""Module that allows latex output notebooks to be conditioned before they are converted. """ # ----------------------------------------------------------------------------- # Copyright (c) 2013, the IPython Development Team. # # Distributed under the terms of the Modified BSD License. # # The full license is in the file COPYING.txt, distributed with this software. # ----------------------------------------------------------------------------- # ----------------------------------------------------------------------------- # Imports # ----------------------------------------------------------------------------- from traitlets import List, Unicode from .base import Preprocessor # ----------------------------------------------------------------------------- # Classes # ----------------------------------------------------------------------------- class LatexPreprocessor(Preprocessor): """Preprocessor for latex destined documents. Populates the ``latex`` key in the resources dict, adding definitions for pygments highlight styles. Sets the authors, date and title of the latex document, overriding the values given in the metadata. """ date = Unicode( None, help=("Date of the LaTeX document"), allow_none=True, ).tag(config=True) title = Unicode(None, help=("Title of the LaTeX document"), allow_none=True).tag(config=True) author_names = List( Unicode(), default_value=None, help=("Author names to list in the LaTeX document"), allow_none=True, ).tag(config=True) style = Unicode("default", help="Name of the pygments style to use").tag(config=True) def preprocess(self, nb, resources): """Preprocessing to apply on each notebook. Parameters ---------- nb : NotebookNode Notebook being converted resources : dictionary Additional resources used in the conversion process. Allows preprocessors to pass variables into the Jinja engine. """ # Generate Pygments definitions for Latex from pygments.formatters import LatexFormatter # noqa: PLC0415 resources.setdefault("latex", {}) resources["latex"].setdefault( "pygments_definitions", LatexFormatter(style=self.style).get_style_defs() ) resources["latex"].setdefault("pygments_style_name", self.style) if self.author_names is not None: nb.metadata["authors"] = [{"name": author} for author in self.author_names] if self.date is not None: nb.metadata["date"] = self.date if self.title is not None: nb.metadata["title"] = self.title return nb, resources jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/regexremove.py000066400000000000000000000047021516532232300256010ustar00rootroot00000000000000""" Module containing a preprocessor that removes cells if they match one or more regular expression. """ # Copyright (c) IPython Development Team. # Distributed under the terms of the Modified BSD License. from __future__ import annotations import re from traitlets import List, Unicode from .base import Preprocessor class RegexRemovePreprocessor(Preprocessor): """ Removes cells from a notebook that match one or more regular expression. For each cell, the preprocessor checks whether its contents match the regular expressions in the ``patterns`` traitlet which is a list of unicode strings. If the contents match any of the patterns, the cell is removed from the notebook. To modify the list of matched patterns, modify the patterns traitlet. For example, execute the following command to convert a notebook to html and remove cells containing only whitespace:: jupyter nbconvert --RegexRemovePreprocessor.patterns="['\\s*\\Z']" mynotebook.ipynb The command line argument sets the list of patterns to ``'\\s*\\Z'`` which matches an arbitrary number of whitespace characters followed by the end of the string. See https://regex101.com/ for an interactive guide to regular expressions (make sure to select the python flavor). See https://docs.python.org/library/re.html for the official regular expression documentation in python. """ patterns = List(Unicode()).tag(config=True) def check_conditions(self, cell): """ Checks that a cell matches the pattern. Returns: Boolean. True means cell should *not* be removed. """ # Compile all the patterns into one: each pattern is first wrapped # by a non-capturing group to ensure the correct order of precedence # and the patterns are joined with a logical or pattern = re.compile("|".join("(?:%s)" % pattern for pattern in self.patterns)) # Filter out cells that meet the pattern and have no outputs return not pattern.match(cell.source) def preprocess(self, nb, resources): """ Preprocessing to apply to each notebook. See base.py for details. """ # Skip preprocessing if the list of patterns is empty if not self.patterns: return nb, resources # Filter out cells that meet the conditions nb.cells = [cell for cell in nb.cells if self.check_conditions(cell)] return nb, resources jupyter-nbconvert-5db0bfc/nbconvert/preprocessors/sanitize.py000066400000000000000000000125271516532232300251030ustar00rootroot00000000000000""" NBConvert Preprocessor for sanitizing HTML rendering of notebooks. """ import warnings from bleach import ALLOWED_ATTRIBUTES, ALLOWED_TAGS, clean from traitlets import Any, Bool, List, Set, Unicode from .base import Preprocessor _USE_BLEACH_CSS_SANITIZER = False _USE_BLEACH_STYLES = False try: # bleach[css] >=5.0 from bleach.css_sanitizer import ALLOWED_CSS_PROPERTIES as ALLOWED_STYLES from bleach.css_sanitizer import CSSSanitizer _USE_BLEACH_CSS_SANITIZER = True _USE_BLEACH_STYLES = False except ImportError: try: # bleach <5 from bleach import ALLOWED_STYLES # type:ignore[attr-defined, no-redef] _USE_BLEACH_CSS_SANITIZER = False _USE_BLEACH_STYLES = True warnings.warn( "Support for bleach <5 will be removed in a future version of nbconvert", DeprecationWarning, stacklevel=2, ) except ImportError: warnings.warn( "The installed bleach/tinycss2 do not provide CSS sanitization, " "please upgrade to bleach >=5", UserWarning, stacklevel=2, ) __all__ = ["SanitizeHTML"] class SanitizeHTML(Preprocessor): """A preprocessor to sanitize html.""" # Bleach config. attributes = Any( config=True, default_value=ALLOWED_ATTRIBUTES, help="Allowed HTML tag attributes", ) tags = List( Unicode(), config=True, default_value=ALLOWED_TAGS, # type:ignore[arg-type] help="List of HTML tags to allow", ) styles = List( Unicode(), config=True, default_value=ALLOWED_STYLES, # type:ignore[arg-type] help="Allowed CSS styles if {% endfor %} {% block notebook_css %} {{ resources.include_css("static/style.css") }} {% endblock notebook_css %} {%- block html_head_js_mathjax -%} {{ mathjax(resources.mathjax_url) }} {%- endblock html_head_js_mathjax -%} {%- block html_head_css -%} {%- endblock html_head_css -%} {%- endblock html_head -%} {%- endblock header -%} {% block body_header %}
{% endblock body_header %} {% block body_footer %}
{% endblock body_footer %} {% block footer %} {% block footer_js %} {% endblock footer_js %} {{ super() }} {% endblock footer %} jupyter-nbconvert-5db0bfc/share/templates/compatibility/000077500000000000000000000000001516532232300237345ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/share/templates/compatibility/display_priority.tpl000066400000000000000000000002051516532232300300600ustar00rootroot00000000000000{{ resources.deprecated("This template is deprecated, please use base/display_priority.j2") }} {%- extends 'display_priority.j2' -%} jupyter-nbconvert-5db0bfc/share/templates/compatibility/full.tpl000066400000000000000000000001741516532232300254210ustar00rootroot00000000000000{{ resources.deprecated("This template is deprecated, please use classic/index.html.j2") }} {%- extends 'index.html.j2' -%} jupyter-nbconvert-5db0bfc/share/templates/lab/000077500000000000000000000000001516532232300216215ustar00rootroot00000000000000jupyter-nbconvert-5db0bfc/share/templates/lab/base.html.j2000066400000000000000000000236731516532232300237460ustar00rootroot00000000000000{%- extends 'display_priority.j2' -%} {% from 'celltags.j2' import celltags %} {% from 'cell_id_anchor.j2' import cell_id_anchor %} {% block codecell %} {%- if not cell.outputs -%} {%- set no_output_class="jp-mod-noOutputs" -%} {%- endif -%} {%- if not resources.global_content_filter.include_input -%} {%- set no_input_class="jp-mod-noInput" -%} {%- endif -%} {%- endblock codecell %} {% block input_group -%} {% endblock input_group %} {% block input %} {%- endblock input %} {% block output_group %} {% endblock output_group %} {% block outputs %} {% endblock outputs %} {% block in_prompt -%} {%- endblock in_prompt %} {% block empty_in_prompt -%} {%- endblock empty_in_prompt %} {# output_prompt doesn't do anything in HTML, because there is a prompt div in each output area (see output block) #} {% block output_prompt %} {% endblock output_prompt %} {% block output_area_prompt %} {% endblock output_area_prompt %} {% block output %} {%- if output.output_type == 'execute_result' -%}