pax_global_header00006660000000000000000000000064146745356060014532gustar00rootroot0000000000000052 comment=c2b76d8c8d9c12c6f36196ead8b9e25aa5dc1e76 MyST-NB-1.1.2/000077500000000000000000000000001467453560600126645ustar00rootroot00000000000000MyST-NB-1.1.2/.github/000077500000000000000000000000001467453560600142245ustar00rootroot00000000000000MyST-NB-1.1.2/.github/dependabot.yml000066400000000000000000000011651467453560600170570ustar00rootroot00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates version: 2 updates: - package-ecosystem: "pip" directory: "/" schedule: interval: "monthly" - package-ecosystem: "github-actions" directory: "/" schedule: interval: "monthly" groups: actions: patterns: - "*" labels: - "github_actions" MyST-NB-1.1.2/.github/workflows/000077500000000000000000000000001467453560600162615ustar00rootroot00000000000000MyST-NB-1.1.2/.github/workflows/tests.yml000066400000000000000000000062771467453560600201620ustar00rootroot00000000000000name: continuous-integration on: push: branches: [master] tags: - 'v*' pull_request: jobs: tests: strategy: fail-fast: false matrix: os: [ubuntu-latest] python-version: ["3.9", "3.10", "3.11", "3.12"] sphinx: [">=5,<9"] # Newest Sphinx (any) myst-parser: [">=1,<3"] # Newest MyST Parser (any) include: # Just check the other platforms once - os: windows-latest python-version: "3.12" sphinx: "~=8.0" myst-parser: "~=4.0" - os: macos-latest python-version: "3.12" sphinx: "~=8.0" myst-parser: "~=4.0" # Oldest known-compatible dependencies - os: ubuntu-latest python-version: "3.9" sphinx: "==5.0.0" myst-parser: "==1.0.0" # Mid-range dependencies - os: ubuntu-latest python-version: "3.11" sphinx: "==7.0.0" myst-parser: "==2.0.0" # Newest known-compatible dependencies - os: ubuntu-latest python-version: "3.12" sphinx: "==8.0.2" myst-parser: "==4.0.0" runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: pip - name: Install myst-nb with Sphinx ${{ matrix.sphinx }} run: | pip install --upgrade pip pip install --upgrade "Sphinx${{ matrix.sphinx }}" "myst-parser${{ matrix.myst-parser }}" -e .[testing] - name: Run pytest run: pytest --durations=10 coverage: needs: [tests] runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: "3.11" cache: pip - name: Install dependencies run: | pip install --upgrade pip pip install -e .[testing] - name: Run pytest run: pytest --durations=10 --cov=myst_nb --cov-report=xml --cov-report=term-missing - name: Create cov run: coverage xml # for some reason the tests/conftest.py::check_nbs fixture breaks pytest-cov's cov-report outputting # this is why we run `coverage xml` afterwards (required by codecov) # TEMPORARY FIX: Disable codecov until we can get it working again - name: Upload to Codecov uses: codecov/codecov-action@v4 if: false with: name: myst-nb-pytests flags: pytests files: ./coverage.xml publish: name: Publish to PyPi needs: [tests] if: github.event_name == 'push' && startsWith(github.event.ref, 'refs/tags') runs-on: ubuntu-latest steps: - name: Checkout source uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: "3.10" - name: install flit run: | pip install flit~=3.4 - name: Build and publish run: | flit publish env: FLIT_USERNAME: __token__ FLIT_PASSWORD: ${{ secrets.PYPI_KEY }} MyST-NB-1.1.2/.gitignore000066400000000000000000000035401467453560600146560ustar00rootroot00000000000000# Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] *$py.class # C extensions *.so # Distribution / packaging .Python build/ develop-eggs/ dist/ downloads/ eggs/ .eggs/ lib64/ parts/ sdist/ var/ wheels/ pip-wheel-metadata/ share/python-wheels/ *.egg-info/ .installed.cfg *.egg MANIFEST # PyInstaller # Usually these files are written by a python script from a template # before PyInstaller builds the exe, so as to inject date/other infos into it. *.manifest *.spec # Installer logs pip-log.txt pip-delete-this-directory.txt # Unit test / coverage reports htmlcov/ .tox/ .nox/ .coverage .coverage.* .cache nosetests.xml coverage.xml *.cover *.py,cover .hypothesis/ .pytest_cache/ (PosixPath('/* # Translations *.mo *.pot # Django stuff: *.log local_settings.py db.sqlite3 db.sqlite3-journal # Flask stuff: instance/ .webassets-cache # Scrapy stuff: .scrapy # Sphinx documentation docs/_build/ # PyBuilder target/ # Jupyter Notebook .ipynb_checkpoints # IPython profile_default/ ipython_config.py # pyenv .python-version # pipenv # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. # However, in case of collaboration, if having platform-specific dependencies or dependencies # having no cross-platform support, pipenv may install dependencies that don't work, or not # install all needed dependencies. #Pipfile.lock # PEP 582; used by e.g. github.com/David-OConnor/pyflow __pypackages__/ # Celery stuff celerybeat-schedule celerybeat.pid # SageMath parsed files *.sage.py # Environments .env .venv env/ venv/ ENV/ env.bak/ venv.bak/ # Spyder project settings .spyderproject .spyproject # Rope project settings .ropeproject # mkdocs documentation /site # mypy .mypy_cache/ .dmypy.json dmypy.json # Pyre type checker .pyre/ # Jupyter Cache .jupyter_cache # OSX .DS_Store .vscode/ todos.md _archive/ MyST-NB-1.1.2/.pre-commit-config.yaml000066400000000000000000000023051467453560600171450ustar00rootroot00000000000000# Install pre-commit hooks via # pre-commit install exclude: > (?x)^( \.vscode/settings\.json| tests/commonmark/commonmark\.json| .*\.xml| tests/.*\.txt )$ ci: autoupdate_schedule: 'monthly' repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.5.0 hooks: - id: check-json - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - id: check-added-large-files - id: check-case-conflict - id: check-merge-conflict - id: mixed-line-ending - id: trailing-whitespace - repo: https://github.com/astral-sh/ruff-pre-commit rev: v0.1.4 hooks: - id: ruff args: ["--fix", "--show-fixes"] - id: ruff-format - repo: https://github.com/pre-commit/mirrors-mypy rev: v1.6.1 hooks: - id: mypy args: [--config-file=pyproject.toml] additional_dependencies: - importlib_metadata - myst-parser~=2.0.0 - "sphinx~=7.3.7" - nbclient - types-PyYAML files: > (?x)^( myst_nb/.+\.py| )$ - repo: https://github.com/codespell-project/codespell rev: v2.2.6 hooks: - id: codespell args: ["-S", "*.ipynb"] MyST-NB-1.1.2/.readthedocs.yml000066400000000000000000000004031467453560600157470ustar00rootroot00000000000000version: 2 build: os: ubuntu-22.04 tools: python: "3.11" python: install: - method: pip path: . extra_requirements: - rtd - requirements: docs/requirements.txt sphinx: builder: html fail_on_warning: true MyST-NB-1.1.2/CHANGELOG.md000066400000000000000000001126201467453560600144770ustar00rootroot00000000000000# Change Log ## v1.1.1 - 2024-06-27 ([full changelog](https://github.com/executablebooks/MyST-NB/compare/v1.1.0...6ce30cd41fa82543e0f315ac8bbee82669b0cc82)) ### Bugs fixed - FIX: output metadata overwrites image size for all following images [#609](https://github.com/executablebooks/MyST-NB/pull/609) ([@aeisenbarth](https://github.com/aeisenbarth)) - FIX: remove incorrect license classifier [#603](https://github.com/executablebooks/MyST-NB/pull/603) ([@agoose77](https://github.com/agoose77)) ### Maintenance and upkeep improvements - MAINT: bump version [#614](https://github.com/executablebooks/MyST-NB/pull/614) ([@agoose77](https://github.com/agoose77)) - MAINT: appease mypy [#612](https://github.com/executablebooks/MyST-NB/pull/612) ([@agoose77](https://github.com/agoose77)) - MAINT: fix specs for CI matrix [#611](https://github.com/executablebooks/MyST-NB/pull/611) ([@agoose77](https://github.com/agoose77)) - MAINT: bump version [#592](https://github.com/executablebooks/MyST-NB/pull/592) ([@agoose77](https://github.com/agoose77)) ### Documentation improvements - DOCS: set printoptions to disable modern scalar printing [#613](https://github.com/executablebooks/MyST-NB/pull/613) ([@agoose77](https://github.com/agoose77)) - DOCS: extra comma forgotten [#606](https://github.com/executablebooks/MyST-NB/pull/606) ([@jeertmans](https://github.com/jeertmans)) - DOCS: update shown code to match source [#598](https://github.com/executablebooks/MyST-NB/pull/598) ([@OriolAbril](https://github.com/OriolAbril)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/executablebooks/MyST-NB/graphs/contributors?from=2024-04-12&to=2024-06-27&type=c)) [@aeisenbarth](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aaeisenbarth+updated%3A2024-04-12..2024-06-27&type=Issues) | [@agoose77](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aagoose77+updated%3A2024-04-12..2024-06-27&type=Issues) | [@jeertmans](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Ajeertmans+updated%3A2024-04-12..2024-06-27&type=Issues) | [@OriolAbril](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3AOriolAbril+updated%3A2024-04-12..2024-06-27&type=Issues) | [@sstroemer](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Asstroemer+updated%3A2024-04-12..2024-06-27&type=Issues) | [@welcome](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Awelcome+updated%3A2024-04-12..2024-06-27&type=Issues) ## v1.1.0 - 2024-04-12 ([full changelog](https://github.com/executablebooks/MyST-NB/compare/v1.0.0...9943ec214c35844c4535d0184f7840574fc7ab03)) ### Enhancements made - ENH: pass-through image metadata [#588](https://github.com/executablebooks/MyST-NB/pull/588) ([@flying-sheep](https://github.com/flying-sheep)) ### Maintenance and upkeep improvements - MAINT: bump version [#592](https://github.com/executablebooks/MyST-NB/pull/592) ([@agoose77](https://github.com/agoose77)) - MAINT: use `findall` instead of `traverse` [#585](https://github.com/executablebooks/MyST-NB/pull/585) ([@agoose77](https://github.com/agoose77)) - MAINT: restore default line length [#577](https://github.com/executablebooks/MyST-NB/pull/577) ([@agoose77](https://github.com/agoose77)) ### Other merged PRs - build(deps): bump actions/setup-python from 4 to 5 [#576](https://github.com/executablebooks/MyST-NB/pull/576) ([@dependabot](https://github.com/dependabot)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/executablebooks/MyST-NB/graphs/contributors?from=2023-11-08&to=2024-04-12&type=c)) [@agoose77](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aagoose77+updated%3A2023-11-08..2024-04-12&type=Issues) | [@cisaacstern](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Acisaacstern+updated%3A2023-11-08..2024-04-12&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Adependabot+updated%3A2023-11-08..2024-04-12&type=Issues) | [@flying-sheep](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aflying-sheep+updated%3A2023-11-08..2024-04-12&type=Issues) | [@ma-sadeghi](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Ama-sadeghi+updated%3A2023-11-08..2024-04-12&type=Issues) | [@peytondmurray](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Apeytondmurray+updated%3A2023-11-08..2024-04-12&type=Issues) | [@PhilipVinc](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3APhilipVinc+updated%3A2023-11-08..2024-04-12&type=Issues) | [@sphuber](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Asphuber+updated%3A2023-11-08..2024-04-12&type=Issues) | [@welcome](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Awelcome+updated%3A2023-11-08..2024-04-12&type=Issues) ## v1.0.0 - 2023-11-08 ([full changelog](https://github.com/executablebooks/MyST-NB/compare/e8fd165...48edb5d852eb73b09eae962c7518045f836633d5)) ### New features added - FEAT: allow any value for expr [#429](https://github.com/executablebooks/MyST-NB/pull/429) ([@agoose77](https://github.com/agoose77)) ### Bugs fixed - FIX: update tests for newer matplotlib [#559](https://github.com/executablebooks/MyST-NB/pull/559) ([@agoose77](https://github.com/agoose77)) - FIX: remove warnings for 3.11+ [#547](https://github.com/executablebooks/MyST-NB/pull/547) ([@agoose77](https://github.com/agoose77)) - FIX: Show traceback before raising ExecutionError [#531](https://github.com/executablebooks/MyST-NB/pull/531) ([@paugier](https://github.com/paugier)) ### Maintenance and upkeep improvements - MAINT: uncap nbformat [#568](https://github.com/executablebooks/MyST-NB/pull/568) ([@agoose77](https://github.com/agoose77)) - MAINT: unpin jupyer-cache [#567](https://github.com/executablebooks/MyST-NB/pull/567) ([@agoose77](https://github.com/agoose77)) - MAINT: bump minimum Python version [#566](https://github.com/executablebooks/MyST-NB/pull/566) ([@agoose77](https://github.com/agoose77)) - MAINT: enable ruff formatter [#565](https://github.com/executablebooks/MyST-NB/pull/565) ([@agoose77](https://github.com/agoose77)) - MAINT: test wider matrix [#552](https://github.com/executablebooks/MyST-NB/pull/552) ([@agoose77](https://github.com/agoose77)) - MAINT: update linting [#551](https://github.com/executablebooks/MyST-NB/pull/551) ([@agoose77](https://github.com/agoose77)) - MAINT: Patch `file_regression` fixture for Sphinx backwards compatibility [#536](https://github.com/executablebooks/MyST-NB/pull/536) ([@je-cook](https://github.com/je-cook)) - MAINT: remove python=3.7 as EOL is June 2023 [#516](https://github.com/executablebooks/MyST-NB/pull/516) ([@mmcky](https://github.com/mmcky)) ### Documentation improvements - DOCS: Fix broken pytest fixture [#546](https://github.com/executablebooks/MyST-NB/pull/546) ([@peytondmurray](https://github.com/peytondmurray)) - ๐Ÿ“š DOCS: Fix typos and add codespell pre-commit hook [#475](https://github.com/executablebooks/MyST-NB/pull/475) ([@kianmeng](https://github.com/kianmeng)) ### API and Breaking Changes - UPGRADE: Support Sphinx 7 [#524](https://github.com/executablebooks/MyST-NB/pull/524) ([@LecrisUT](https://github.com/LecrisUT)) - UPGRADE: myst-parser 1.0 [#479](https://github.com/executablebooks/MyST-NB/pull/479) ([@aleivag](https://github.com/aleivag)) ### Other merged PRs - [pre-commit.ci] pre-commit autoupdate [#564](https://github.com/executablebooks/MyST-NB/pull/564) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - [pre-commit.ci] pre-commit autoupdate [#561](https://github.com/executablebooks/MyST-NB/pull/561) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - [pre-commit.ci] pre-commit autoupdate [#556](https://github.com/executablebooks/MyST-NB/pull/556) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Update readthedocs Config File to fix Test Error [#554](https://github.com/executablebooks/MyST-NB/pull/554) ([@michaelweinold](https://github.com/michaelweinold)) - [pre-commit.ci] pre-commit autoupdate [#553](https://github.com/executablebooks/MyST-NB/pull/553) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - build(deps): update ipython requirement from <=8.16.0 to <=8.16.1 [#550](https://github.com/executablebooks/MyST-NB/pull/550) ([@dependabot](https://github.com/dependabot)) - [pre-commit.ci] pre-commit autoupdate [#549](https://github.com/executablebooks/MyST-NB/pull/549) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - build(deps): update ipython requirement from !=8.1.0,<8.16 to !=8.1.0,<8.17 [#548](https://github.com/executablebooks/MyST-NB/pull/548) ([@dependabot](https://github.com/dependabot)) - [pre-commit.ci] pre-commit autoupdate [#542](https://github.com/executablebooks/MyST-NB/pull/542) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - build(deps): bump actions/checkout from 3 to 4 [#539](https://github.com/executablebooks/MyST-NB/pull/539) ([@dependabot](https://github.com/dependabot)) - build(deps): update ipython requirement from !=8.1.0,<8.15 to !=8.1.0,<8.16 [#538](https://github.com/executablebooks/MyST-NB/pull/538) ([@dependabot](https://github.com/dependabot)) - Update copyright year to 2023 [#537](https://github.com/executablebooks/MyST-NB/pull/537) ([@GlobalMin](https://github.com/GlobalMin)) - build(deps-dev): update jupytext requirement from <1.15.0,>=1.11.2 to >=1.11.2,<1.16.0 [#534](https://github.com/executablebooks/MyST-NB/pull/534) ([@dependabot](https://github.com/dependabot)) - [pre-commit.ci] pre-commit autoupdate [#529](https://github.com/executablebooks/MyST-NB/pull/529) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - build(deps-dev): update coconut requirement from <2.3.0,>=1.4.3 to >=1.4.3,<3.1.0 [#527](https://github.com/executablebooks/MyST-NB/pull/527) ([@dependabot](https://github.com/dependabot)) - [pre-commit.ci] pre-commit autoupdate [#526](https://github.com/executablebooks/MyST-NB/pull/526) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Update ipython requirement from !=8.1.0,<8.5 to !=8.1.0,<8.15 [#521](https://github.com/executablebooks/MyST-NB/pull/521) ([@dependabot](https://github.com/dependabot)) - [pre-commit.ci] pre-commit autoupdate [#518](https://github.com/executablebooks/MyST-NB/pull/518) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Update coconut requirement from <2.3.0,>=1.4.3 to >=1.4.3,<3.1.0 [#517](https://github.com/executablebooks/MyST-NB/pull/517) ([@dependabot](https://github.com/dependabot)) - [pre-commit.ci] pre-commit autoupdate [#515](https://github.com/executablebooks/MyST-NB/pull/515) ([@pre-commit-ci](https://github.com/pre-commit-ci)) - Update ipykernel requirement from ~=5.5 to >=5.5,<7.0 [#512](https://github.com/executablebooks/MyST-NB/pull/512) ([@dependabot](https://github.com/dependabot)) - Update sphinx-book-theme requirement from ~=0.3.0 to >=0.3,<1.1 [#510](https://github.com/executablebooks/MyST-NB/pull/510) ([@dependabot](https://github.com/dependabot)) - Update jupytext requirement from ~=1.11.2 to >=1.11.2,<1.15.0 [#509](https://github.com/executablebooks/MyST-NB/pull/509) ([@dependabot](https://github.com/dependabot)) ### Contributors to this release ([GitHub contributors page for this release](https://github.com/executablebooks/MyST-NB/graphs/contributors?from=2023-04-24&to=2023-11-29&type=c)) [@agoose77](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aagoose77+updated%3A2023-04-24..2023-11-29&type=Issues) | [@aleivag](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aaleivag+updated%3A2023-04-24..2023-11-29&type=Issues) | [@choldgraf](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Acholdgraf+updated%3A2023-04-24..2023-11-29&type=Issues) | [@chrisjsewell](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Achrisjsewell+updated%3A2023-04-24..2023-11-29&type=Issues) | [@cisaacstern](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Acisaacstern+updated%3A2023-04-24..2023-11-29&type=Issues) | [@codecov](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Acodecov+updated%3A2023-04-24..2023-11-29&type=Issues) | [@dependabot](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Adependabot+updated%3A2023-04-24..2023-11-29&type=Issues) | [@GlobalMin](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3AGlobalMin+updated%3A2023-04-24..2023-11-29&type=Issues) | [@je-cook](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aje-cook+updated%3A2023-04-24..2023-11-29&type=Issues) | [@joeldodson](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Ajoeldodson+updated%3A2023-04-24..2023-11-29&type=Issues) | [@kianmeng](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Akianmeng+updated%3A2023-04-24..2023-11-29&type=Issues) | [@kloczek](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Akloczek+updated%3A2023-04-24..2023-11-29&type=Issues) | [@LecrisUT](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3ALecrisUT+updated%3A2023-04-24..2023-11-29&type=Issues) | [@michaelweinold](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Amichaelweinold+updated%3A2023-04-24..2023-11-29&type=Issues) | [@mmcky](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Ammcky+updated%3A2023-04-24..2023-11-29&type=Issues) | [@paugier](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Apaugier+updated%3A2023-04-24..2023-11-29&type=Issues) | [@peytondmurray](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Apeytondmurray+updated%3A2023-04-24..2023-11-29&type=Issues) | [@PhilipVinc](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3APhilipVinc+updated%3A2023-04-24..2023-11-29&type=Issues) | [@pre-commit-ci](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Apre-commit-ci+updated%3A2023-04-24..2023-11-29&type=Issues) | [@rowanc1](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Arowanc1+updated%3A2023-04-24..2023-11-29&type=Issues) | [@sphuber](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Asphuber+updated%3A2023-04-24..2023-11-29&type=Issues) | [@tupui](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Atupui+updated%3A2023-04-24..2023-11-29&type=Issues) | [@WarrenWeckesser](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3AWarrenWeckesser+updated%3A2023-04-24..2023-11-29&type=Issues) | [@welcome](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Awelcome+updated%3A2023-04-24..2023-11-29&type=Issues) | [@Yoshanuikabundi](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3AYoshanuikabundi+updated%3A2023-04-24..2023-11-29&type=Issues) ## v0.17.2 - 2023-04-21 This is primarily a maintenance release to support newer versions of dependencies and fix a few bugs. ### Maintenance and upkeep improvements - MAINT: Create dependabot.yml [#499](https://github.com/executablebooks/MyST-NB/pull/499) ([@choldgraf](https://github.com/choldgraf)) - MAINT: Fix codecov jobs and update pre-commit [#460](https://github.com/executablebooks/MyST-NB/pull/460) ([@choldgraf](https://github.com/choldgraf)) - UPDATE: jupyter-cache v0.6.0 [#498](https://github.com/executablebooks/MyST-NB/pull/498) ([@choldgraf](https://github.com/choldgraf)) ### Documentation improvements - DOCS: Hint to avoid Extension error in sphinx-build [#494](https://github.com/executablebooks/MyST-NB/pull/494) ([@kolibril13](https://github.com/kolibril13), [@choldgraf](https://github.com/choldgraf)) - DOCS: fix link to gallery [#483](https://github.com/executablebooks/MyST-NB/pull/483) ([@michaelaye](https://github.com/michaelaye), [@choldgraf](https://github.com/choldgraf), [@agoose77](https://github.com/agoose77)) - Add note about how to use cell tags [#490](https://github.com/executablebooks/MyST-NB/pull/490) ([@kolibril13](https://github.com/kolibril13), [@choldgraf](https://github.com/choldgraf)) - Update quickstart.md to include docs folder [#489](https://github.com/executablebooks/MyST-NB/pull/489) ([@kolibril13](https://github.com/kolibril13), [@choldgraf](https://github.com/choldgraf)) - docs: update to latest `sphinx-design` [#486](https://github.com/executablebooks/MyST-NB/pull/486) ([@agoose77](https://github.com/agoose77), [@choldgraf](https://github.com/choldgraf)) ### Bug fixes - fix: use jsdelivr CDN for ipywidgets [#491](https://github.com/executablebooks/MyST-NB/pull/491) ([@agoose77](https://github.com/agoose77), [@choldgraf](https://github.com/choldgraf)) - Add ipywidgets javascript [#469](https://github.com/executablebooks/MyST-NB/pull/469) ([@OriolAbril](https://github.com/OriolAbril), [@agoose77](https://github.com/agoose77)) ### 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/#how-does-this-tool-define-contributions-in-the-reports). ([GitHub contributors page for this release](https://github.com/executablebooks/MyST-NB/graphs/contributors?from=2022-09-30&to=2023-04-21&type=c)) @agoose77 ([activity](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aagoose77+updated%3A2022-09-30..2023-04-21&type=Issues)) | @choldgraf ([activity](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Acholdgraf+updated%3A2022-09-30..2023-04-21&type=Issues)) | @chrisjsewell ([activity](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Achrisjsewell+updated%3A2022-09-30..2023-04-21&type=Issues)) | @dependabot ([activity](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Adependabot+updated%3A2022-09-30..2023-04-21&type=Issues)) | @kolibril13 ([activity](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Akolibril13+updated%3A2022-09-30..2023-04-21&type=Issues)) | @michaelaye ([activity](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Amichaelaye+updated%3A2022-09-30..2023-04-21&type=Issues)) | @OriolAbril ([activity](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3AOriolAbril+updated%3A2022-09-30..2023-04-21&type=Issues)) | @pre-commit-ci ([activity](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Apre-commit-ci+updated%3A2022-09-30..2023-04-21&type=Issues)) ## v0.17.1 - 2022-30-09 [Full changelog](https://github.com/executablebooks/MyST-NB/compare/v0.17.0...v0.17.1) - ๐Ÿ‘Œ IMPROVE: `hide-output` button (#450) This now uses the same margin color as the cell source and, when the cell source is present, is "connected" to that, to form a single element. See [Hide cell contents](docs/render/hiding.md) for more information. ## v0.17.0 - 2022-29-09 [Full changelog](https://github.com/executablebooks/MyST-NB/compare/v0.16.0...v0.17.0) - ๐Ÿ‘Œ IMPROVE: Replace sphinx-togglebutton with built-in functionality (#446) This allows for tighter integration with myst-nb: - Nicer rendering of the hidden content buttons - Customisation of the hide/show prompts See [Hide cell contents](docs/render/hiding.md) for more information. - ๐Ÿ› FIX: Inline exec variables with multiple outputs (#440) Previously, it was assumed that a variable evaluation would only ever create 0 or 1 outputs. Multiple are now allowed. - ๐Ÿ‘Œ IMPROVE: cache bust changes to CSS (#447) - ๐Ÿ‘Œ IMPROVE: Move CSS colors to variables (#448) ## v0.16.0 - 2022-06-13 [Full changelog](https://github.com/executablebooks/MyST-NB/compare/v0.15.0...v0.16.0) - โฌ†๏ธ UPGRADE: Sphinx v5 and drop v3 (see [changelog](https://www.sphinx-doc.org/en/master/changes.html)), myst-parser v0.18 (see [changelog](https://myst-parser.readthedocs.io/en/latest/develop/_changelog.html)) - โฌ†๏ธ UPGRADE: Add Python 3.10 support ## v0.15.0 - 2022-05-05 [Full changelog](https://github.com/executablebooks/MyST-NB/compare/v0.14.0...v0.15.0) โœจ NEW: Add `inline` execution mode and `eval` role/directive, for inserting code variables directly into the text flow of your documentation! See [Inline variable evaluation](docs/render/inline.md) for more information. ## v0.14.0 - 2022-04-27 [Full changelog](https://github.com/executablebooks/MyST-NB/compare/v0.13.2...v0.14.0) This release encompasses a **major** rewrite of the entire library and its documentation, primarily in [#380](https://github.com/executablebooks/MyST-NB/pull/380) and [#405](https://github.com/executablebooks/MyST-NB/pull/405). ### Breaking Changes โ€ผ๏ธ #### Configuration A number of configuration option names have been changed, such that they now share the `nb_` prefix. Most of the deprecated names will be auto-converted at the start of the build, emitting a warning such as: ``` WARNING: 'jupyter_execute_notebooks' is deprecated for 'nb_execution_mode' [mystnb.config] ``` `nb_render_priority` has been removed and replaced by `nb_mime_priority_overrides`, which has a different format and is more flexible. See [Outputs MIME priority](docs/render/format_code_cells.md) for more information. As per the changes in [`myst_parser`](inv:myst#develop/_changelog), the `dollarmath` syntax extension is no longer included by default. To re-add this extension, ensure that it is specified in your `conf.py`: `myst_enable_extensions = ["dollarmath"]`. For cell-level configuration the top-level key `render` has now been deprecated for `mystnb`. For example, replace: ````markdown ```{code-cell} --- render: image: width: 200px --- ... ``` ```` with: ````markdown ```{code-cell} --- mystnb: image: width: 200px --- ... ``` ```` `render` will currently still be read, if present, and will issue a `[mystnb.cell_metadata_key]` warning. The `jupyter_sphinx_require_url` and `jupyter_sphinx_embed_url` configuration options are no longer used by this package, and are replaced by `nb_ipywidgets_js`. See the [configuration section](docs/configuration.md) for more details. #### Dependencies The [ipywidgets](https://ipywidgets.readthedocs.io) package has been removed from the requirements. If required, please install it specifically. #### AST structure and rendering plugins The structure of the docutils AST and nodes produced by MyST-NB has been fully changed, for compatibility with the new [docutils only functionality](docs/docutils.md). See [the API documentation](docs/reference/api.rst) for more details. The renderer plugin system (used by the `myst_nb.renderers` entry point) has also been completely rewritten, so any current existing renderers will no longer work. There is also now a new `myst_nb.mime_renderers` entry point, to allow for targeted rendering of specific code-cell output MIME types. See [Customise the render process](docs/render/format_code_cells.md) for more information. #### Glue functionality By default, `glue` roles and directives now only work for keys within the same document. To reference glued content in a different document, the `glue:any` directive allows for a `doc` option and `glue:any`/`glue:text` roles allow the (relative) doc path to be added, for example: ````markdown ```{glue:any} var_text :doc: other.ipynb ``` {glue:text}`other.ipynb::var_float:.2E` ```` This cross-document functionality is currently restricted to only `text/plain` and `text/html` output MIME types, not images. See [Embedding outputs as variables](docs/render/glue.md) for more details. ### Dependency changes โฌ†๏ธ - Removed: - `ipywidgets` - `jupyter_sphinx` - `nbconvert` - Updated: - `Python`: `3.6+ -> 3.7+` - `myst_parser`: [`0.15 -> 0.17`](inv:myst#develop/_changelog) - `jupyter-cache`: [`0.4 -> 0.5`](https://github.com/executablebooks/jupyter-cache/blob/master/CHANGELOG.md) - `sphinx-togglebutton`: [`0.1 -> 0.3`](https://sphinx-togglebutton.readthedocs.io/en/latest/changelog.html) ### New and improved โœจ The following is a non-exhaustive list of new features and improvements, see the rest of the documentation for all the changes. - Multi-level configuration (global (`conf.py`) < notebook level metadata < cell level metadata) - Plus new config options including: `nb_number_source_lines`, `nb_remove_code_source`, `nb_remove_code_outputs`, `nb_render_error_lexer`, `nb_execution_raise_on_error`, `nb_kernel_rgx_aliases` - See the [configuration section](docs/configuration.md) for more details. - Added `mystnb-quickstart` and `mystnb-to-jupyter` CLI commands. - MyST text-based notebooks can now be specified by just: ```yaml --- file_format: mystnb kernelspec: name: python3 --- ``` as opposed to the alternative jupytext top-matter. See [Text-based Notebooks](docs/authoring/text-notebooks.md) for more details. - docutils API/CLI with command line tools, e.g. `mystnb-docutils-html` - Includes `glue` roles and directives - See [single page builds](docs/docutils.md) for more details. - Parallel friendly (e.g. `sphinx-build -j 4` can execute four notebooks in parallel) - Page specific loading of ipywidgets JavaScript, i.e. only when ipywidgets are present in the notebook. - Added raw cell rendering, with the `raw-cell` directive. See [Raw cells authoring](docs/authoring/jupyter-notebooks.md) for more details. - Added MIME render plugins. See [Customise the render process](docs/render/format_code_cells.md) for more details. - Better log info/warnings, with `type.subtype` specifiers for warning suppression. See [Warning suppression](docs/configuration.md) for more details. - Reworked jupyter-cache integration to be easier to use (including parallel execution) - Added image options to `glue:figure` - New `glue:md` role/directive includes nested parsing of MyST Markdown. See [Embedding outputs as variables](docs/render/glue.md) for more details. - Improved `nb-exec-table` directive (includes links to documents, etc) ### Additional Pull Requests - ๐Ÿ‘Œ IMPROVE: Update ANSI CSS colors by @saulshanabrook in [#384](https://github.com/executablebooks/MyST-NB/pull/384) - โœจ NEW: Add `nb_execution_raise_on_error` config by @chrisjsewell in [#404](https://github.com/executablebooks/MyST-NB/pull/404) - ๐Ÿ‘Œ IMPROVE: Add image options to `glue:figure` by @chrisjsewell in [#403](https://github.com/executablebooks/MyST-NB/pull/403) ## v0.13.2 - 2022-02-10 This release improves for cell outputs and brings UI improvements for toggling cell inputs and outputs. It also includes several bugfixes. - Add CSS support for 8-bit ANSI colours [#379](https://github.com/executablebooks/MyST-NB/pull/379) ([@thiippal](https://github.com/thiippal)) - Use configured `nb_render_plugin` for glue nodes [#337](https://github.com/executablebooks/MyST-NB/pull/337) ([@bryanwweber](https://github.com/bryanwweber)) - UPGRADE: sphinx-togglebutton v0.3.0 [#390](https://github.com/executablebooks/MyST-NB/pull/390) ([@choldgraf](https://github.com/choldgraf)) ## 0.13.1 - 2021-10-04 โœจ NEW: `nb_merge_streams` configuration [[PR #364](https://github.com/executablebooks/MyST-NB/pull/364)] If `nb_merge_streams=True`, all stdout / stderr output streams are merged into single outputs. This ensures deterministic outputs. ## 0.13.0 - 2021-09-02 ### Upgraded to `sphinx` v4 โฌ†๏ธ The primary change in this release is to update the requirements of myst-nb from `sphinx>=2,<4` to `sphinx>=3,<5` to support `sphinx>=4` [[PR #356](https://github.com/executablebooks/MyST-NB/pull/356)]. - ๐Ÿ‘Œ IMPROVE: Allows more complex suffixes in notebooks [[PR #328](https://github.com/executablebooks/MyST-NB/pull/328)] - โฌ†๏ธ UPDATE: myst-parser to `0.15.2` [[PR #353](https://github.com/executablebooks/MyST-NB/pull/353)] - โฌ†๏ธ UPGRADE: nbconvert 6 support [[PR #326](https://github.com/executablebooks/MyST-NB/pull/326)] - โฌ†๏ธ UPGRADE: markdown-it-py v1.0 [[PR #320](https://github.com/executablebooks/MyST-NB/pull/320)] - ๐Ÿ”ง MAINT: Pin ipykernel to ~v5.5 [[PR #347](https://github.com/executablebooks/MyST-NB/pull/347)] - ๐Ÿ”ง MAINT: Make a more specific selector for no-border [[PR #344](https://github.com/executablebooks/MyST-NB/pull/344)] Many thanks to @akhmerov, @bollwyvl, @choldgraf, @chrisjsewell, @juhuebner, @mmcky ## 0.12.1 - 2021-04-25 - โฌ†๏ธ UPDATE: jupyter_sphinx to `0.3.2`: fixes `Notebook code has no file extension metadata` warning) - โฌ†๏ธ UPDATE: importlib_metadata to `3.6`: to use new entry point loading interface - Official support for Python 3.9 (`0.12.2` and `0.12.3` fix a regression, when working with the entry point loading interface) ## 0.12.0 - 2021-02-23 This release adds an experimental MyST-NB feature to enable loading of code from a file for `code-cell` directives using a `:load: ` option. Usage information is available in the [docs](https://myst-nb.readthedocs.io/en/latest/use/markdown.html#syntax-for-code-cells) ## 0.11.1 - 2021-01-20 Minor update to handle MyST-Parser `v0.13.3` and `v4.5` notebooks. ## 0.11.0 - 2021-01-12 This release updates MyST-Parser to `v0.13`, which is detailed in the [myst-parser changelog](https://myst-parser.readthedocs.io/en/latest/develop/_changelog.html). The primary change is to the extension system, with extensions now all loaded *via* `myst_enable_extensions = ["dollarmath", ...]`, and a number of extensions added or improved. ## 0.10.2 - 2021-01-12 Minor fixes: - ๐Ÿ› FIX: empty myst file read - ๐Ÿ› FIX: remove cell background-color CSS for cells - ๐Ÿ”ง MAINTAIN: Pin jupyter-sphinx version ## 0.10.1 - 2020-09-08 โฌ†๏ธ UPGRADE: myst-parser v0.12.9 : Minor bug fixes and enhancements / new features ## 0.10.0 - 2020-08-28 โฌ†๏ธ UPGRADE: jupyter-sphinx v0.3, jupyter-cache v0.4.1 and nbclient v0.5. : These upgrades allow for full Windows OS compatibility, and improve the stability of notebook execution on small machines. ๐Ÿ‘Œ IMPROVE: Formatting of stderr is now similar to stdout, but with a slight red background. ๐Ÿงช TESTS: Add Windows CI ## 0.9.2 - 2020-08-27 โฌ†๏ธ UPGRADE: myst-parser patch version : to ensure a few new features and bug fixes are incorporated (see its [CHANGELOG.md](https://github.com/executablebooks/MyST-Parser/blob/master/CHANGELOG.md)) ## 0.9.1 - 2020-08-24 More configuration! - โœจ NEW: Add stderr global configuration: `nb_output_stderr` (see [removing stderr](https://myst-nb.readthedocs.io/en/latest/use/formatting_outputs.html#removing-stdout-and-stderr)) - โœจ NEW: Add `nb_render_key` configuration (see [formatting outputs](https://myst-nb.readthedocs.io/en/latest/use/formatting_outputs.html#images)) - ๐Ÿ› FIX: `auto` execution not recognising (and skipping) notebooks with existing outputs ## 0.9.0 - 2020-08-24 This versions see's many great changes; utilising the โฌ†๏ธ upgrade to `myst-parser=v0.12` and accompanying โฌ†๏ธ upgrade to `sphinx=v3`, as well as major refactors to the execution ([#236](https://github.com/executablebooks/MyST-NB/commit/2bc0c11cedbad6206f70546819fad85d779ce449)) and code output rendering ([#243](https://github.com/executablebooks/MyST-NB/commit/04f3bbb928cf1794e140de6a919fb58578753300)). Plus much more configuration options, to allow for a more configurable workflow (the defaults work great as well!). Below is a summary of the changes, and you can also check out many examples in the documentation, , and the MyST-Parser Changelog for all the new Markdown parsing features available: . ### New โœจ - Custom notebook formats: Configuration and logic has been added for designating additional file types to be converted to Notebooks, which are then executed & parsed in the same manner as regular Notebooks. See [Custom Notebook Formats](https://myst-nb.readthedocs.io/en/latest/examples/custom-formats.html) for details. - Allow for configuration of render priority (per output format) with `nb_render_priority`. - The code cell output renderer class is now loaded from an entry-point, with a configurable name, meaning that anyone can provide their own renderer subclass. See [Customise the render process](https://myst-nb.readthedocs.io/en/latest/use/formatting_outputs.html#customise-the-render-process) for details. - Assignment of metadata tags `remove-stdout` and `remove-stderr` for removal of the relevant outputs ([see here](https://myst-nb.readthedocs.io/en/latest/use/formatting_outputs.html#removing-stdout-and-stderr)) - Render `text/markdown` MIME types with an integrated CommonMark parser ([see here](https://myst-nb.readthedocs.io/en/latest/use/formatting_outputs.html#markdown)). - Add code output image formatting, *via* cell metadata, including size, captions and labelling ([see here](https://myst-nb.readthedocs.io/en/latest/use/formatting_outputs.html#images)). - Notebook outputs ANSI lexer which is applied to stdout/stderr and text/plain outputs, and is configurable *via* `nb_render_text_lexer` ([see here](https://myst-nb.readthedocs.io/en/latest/use/formatting_outputs.html#ansi-outputs)). - Capture execution data in sphinx env, which can be output into the documentation, with the `nb-exec-table` directive. See [Execution statistics](https://myst-nb.readthedocs.io/en/latest/use/execute.html#execution-statistics) for details. ### Improved ๐Ÿ‘Œ - Standardise auto/cache execution Both now call the same underlying function (from `jupyter-cache`) and act the same. This improves `auto`, by making it output error reports and not raising an exception on an error. Additional config has also been added: `execution_allow_errors` and `execution_in_temp`. As for for `timeout`, `allow_errors` can also be set in the notebook `metadata.execution.allow_errors` This presents one breaking change, in that `cache` will now by default execute in a the local folder as the CWD (not a temporary one). ### Fixed ๐Ÿ› - Code cell source code is now assigned the correct lexer when using custom kernels ([39c1bb9](https://github.com/executablebooks/MyST-NB/commit/39c1bb99e73b35812474366f2f1760850fe40a57)) ### Documented ๐Ÿ“š - Add example of using kernels other than Python ([676eb2c](https://github.com/executablebooks/MyST-NB/commit/676eb2c46b1ca605980180479c845b43ec64c5fb)) ### Refactored โ™ป๏ธ - Add more signature typing and docstrings - Move config value validation to separate function - Rename functions in cache.py and improve their logical flow - Rename variable stored in sphinx environment, to share same suffix: - `path_to_cache` -> `nb_path_to_cache` - `allowed_nb_exec_suffixes` -> `nb_allowed_exec_suffixes` - `excluded_nb_exec_paths` -> `nb_excluded_exec_paths` - Initial Nb output rendering: - Ensure source (path, lineno) are correctly propagated to `CellOutputBundleNode` - Capture cell level metadata in `CellOutputBundleNode` - New `CellOutputRenderer` class to contain render methods - Simplify test code, using sphinx `get_doctree` and `get_and_resolve_doctree` methods ## 0.8.5 - 2020-08-11 ### Improved ๐Ÿ‘Œ - Add configuration for traceback in stderr (#218) ### Fixed ๐Ÿ› - MIME render priority lookup ### Upgrades โฌ†๏ธ - myst-parser -> 0.9 - jupyter-cache to v0.3.0 ### Documented ๐Ÿ“š - More explanation of myst notebooks (#213) - Update contributing guide ## Contributors for previously releases Thanks to all these contributors ๐Ÿ™: [@AakashGfude](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3AAakashGfude+updated%3A2020-03-28..2020-08-11&type=Issues) | [@akhmerov](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aakhmerov+updated%3A2020-03-28..2020-08-11&type=Issues) | [@amueller](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aamueller+updated%3A2020-03-28..2020-08-11&type=Issues) | [@choldgraf](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Acholdgraf+updated%3A2020-03-28..2020-08-11&type=Issues) | [@chrisjsewell](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Achrisjsewell+updated%3A2020-03-28..2020-08-11&type=Issues) | [@codecov](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Acodecov+updated%3A2020-03-28..2020-08-11&type=Issues) | [@consideRatio](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3AconsideRatio+updated%3A2020-03-28..2020-08-11&type=Issues) | [@jstac](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Ajstac+updated%3A2020-03-28..2020-08-11&type=Issues) | [@matthew-brett](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Amatthew-brett+updated%3A2020-03-28..2020-08-11&type=Issues) | [@mmcky](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Ammcky+updated%3A2020-03-28..2020-08-11&type=Issues) | [@phaustin](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aphaustin+updated%3A2020-03-28..2020-08-11&type=Issues) | [@rossbar](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Arossbar+updated%3A2020-03-28..2020-08-11&type=Issues) | [@rowanc1](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Arowanc1+updated%3A2020-03-28..2020-08-11&type=Issues) | [@seanpue](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Aseanpue+updated%3A2020-03-28..2020-08-11&type=Issues) | [@stefanv](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Astefanv+updated%3A2020-03-28..2020-08-11&type=Issues) | [@TomDonoghue](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3ATomDonoghue+updated%3A2020-03-28..2020-08-11&type=Issues) | [@tonyfast](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Atonyfast+updated%3A2020-03-28..2020-08-11&type=Issues) | [@welcome](https://github.com/search?q=repo%3Aexecutablebooks%2FMyST-NB+involves%3Awelcome+updated%3A2020-03-28..2020-08-11&type=Issues) MyST-NB-1.1.2/LICENSE000066400000000000000000000027711467453560600137000ustar00rootroot00000000000000BSD 3-Clause License Copyright (c) 2020, ExecutableBookProject 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. MyST-NB-1.1.2/README.md000066400000000000000000000027331467453560600141500ustar00rootroot00000000000000# MyST-NB [![Github-CI][github-ci]][github-link] [![Coverage Status][codecov-badge]][codecov-link] [![Documentation Status][rtd-badge]][rtd-link] [![PyPI][pypi-badge]][pypi-link] [![Conda Version][conda-badge]][conda-link] A collection of tools for working with Jupyter Notebooks in Sphinx. The primary tool this package provides is a Sphinx parser for `ipynb` files. This allows you to directly convert Jupyter Notebooks into Sphinx documents. It relies heavily on the [`MyST` parser](https://github.com/executablebooks/myst-parser). For more information, [see the MyST-NB documentation](https://myst-nb.readthedocs.io/en/latest/) ## Contributing We welcome all contributions! See the [Contributing Guide](https://myst-nb.readthedocs.io/en/latest/reference/contributing.html) for more details. [github-ci]: https://github.com/executablebooks/MyST-NB/workflows/continuous-integration/badge.svg?branch=master [github-link]: https://github.com/executablebooks/MyST-NB [rtd-badge]: https://readthedocs.org/projects/myst-nb/badge/?version=latest [rtd-link]: https://myst-nb.readthedocs.io/en/latest/?badge=latest [codecov-badge]: https://codecov.io/gh/executablebooks/MyST-NB/branch/master/graph/badge.svg [codecov-link]: https://codecov.io/gh/executablebooks/MyST-NB [pypi-badge]: https://img.shields.io/pypi/v/myst-nb.svg [pypi-link]: https://pypi.org/project/myst-nb [conda-badge]: https://img.shields.io/conda/vn/conda-forge/myst-nb.svg [conda-link]: https://anaconda.org/conda-forge/myst-nb MyST-NB-1.1.2/codecov.yml000066400000000000000000000002421467453560600150270ustar00rootroot00000000000000coverage: status: project: default: target: 80% threshold: 0.5% patch: default: target: 80% threshold: 0.5% MyST-NB-1.1.2/docs/000077500000000000000000000000001467453560600136145ustar00rootroot00000000000000MyST-NB-1.1.2/docs/_static/000077500000000000000000000000001467453560600152425ustar00rootroot00000000000000MyST-NB-1.1.2/docs/_static/custom.css000066400000000000000000000005101467453560600172620ustar00rootroot00000000000000/** Add a counter before subsections **/ h1 { counter-reset: subsection; } h2 { counter-reset: subsubsection; } h2::before { counter-increment: subsection; content: counter(subsection) ". "; } h3::before { counter-increment: subsubsection; content: counter(subsection) "." counter(subsubsection) ". "; } MyST-NB-1.1.2/docs/_static/logo-square.svg000066400000000000000000000021231467453560600202170ustar00rootroot00000000000000logo-square MyST-NB-1.1.2/docs/_static/logo-wide.svg000066400000000000000000000063611467453560600176570ustar00rootroot00000000000000 MyST-NB-1.1.2/docs/authoring/000077500000000000000000000000001467453560600156145ustar00rootroot00000000000000MyST-NB-1.1.2/docs/authoring/basics.md000066400000000000000000000065171467453560600174130ustar00rootroot00000000000000 (authoring/intro)= # The basics ## Default file formats As well as writing in the Sphinx default format, [RestructuredText](https://www.sphinx-doc.org/en/master/usage/restructuredtext/basics.html) (`.rst`), loading `myst_nb` will also parse: - Markdown files (`.md`) - Jupyter notebooks (`.ipynb`) - MyST-NB text-based notebooks (`.md` + top-matter) ## Custom file extensions You can change which file extensions are parsed by MyST-NB using the [source_suffix](https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-source_suffix) option in your `conf.py`, e.g.: ```python extensions = ["myst_nb"] source_suffix = { '.rst': 'restructuredtext', '.ipynb': 'myst-nb', '.myst': 'myst-nb', } ``` ## Other notebook formats See the [](write/custom_formats) section, for how to integrate other Notebook formats into your build, and integration with [jupytext](https://github.com/mwouts/jupytext). ## MyST Markdown For all file formats, Markdown authoring is the backbone of MyST-NB. By default, the MyST flavour of Markdown is enabled, which extends [CommonMark](https://commonmark.org/) with RST inspired syntaxes to provide the additional functionality required for technical writing. In particular MyST adds targets, roles and directives syntax, allowing you to utilise all available Docutils/Sphinx features: ::::{grid} 2 :gutter: 1 :::{grid-item-card} RestructuredText ``` .. _target: Header ------ :role-name:`content` .. directive-name:: argument :parameter: value content ``` ::: :::{grid-item-card} MyST Markdown ```` (target)= # Header {role-name}`content` ```{directive-name} argument :parameter: value content ``` ```` ::: :::: :::{seealso} See the [](authoring/jupyter-notebooks) section, for more details on how to author Jupyter notebooks. ::: ## Text-based notebooks MyST-NB text-based notebooks are a special format for storing Jupyter notebooks in a text file. They map directly to a Notebook file, without directly storing the code execution outputs. To designate a Markdown file as a text-based notebook, add the following top-matter to the start of the file: ```yaml --- file_format: mystnb kernelspec: name: python3 --- ``` The `kernelspec.name` should relate to a [Jupyter kernel](https://github.com/jupyter/jupyter/wiki/Jupyter-kernels) installed in your environment. MyST-NB will also recognise [jupytext](https://jupytext.readthedocs.io) top-matter, such as: ```yaml --- kernelspec: name: python3 display_name: python3 jupytext: text_representation: extension: .md format_name: myst format_version: '0.13' jupytext_version: 1.13.8 --- ``` Code cells are then designated by the `code-cell` directive: ````markdown ```{code-cell} :tags: [my-tag] print("Hello world!") ``` ```` and Markdown can be split into cells by the `+++` break syntax: ```markdown Markdown cell 1 +++ {"tags": ["my-tag"]} Markdown cell 2, with metadata tags ``` :::{seealso} See the [](authoring/text-notebooks) section, for more details on text-based notebooks, and integration with [jupytext](https://jupytext.readthedocs.io). ::: ## Configuration MyST-NB parsing, execution and rendering can be configured at three levels of specificity; globally, per file, and per notebook cell, with the most specific configuration taking precedence. See the [](config/intro) section, for more details on how to configure MyST-NB. MyST-NB-1.1.2/docs/authoring/custom-formats.Rmd000066400000000000000000000054531467453560600212520ustar00rootroot00000000000000--- author: "Marc Wouts" date: "June 16, 2018" jupyter: kernelspec: display_name: Python language: python name: python3 --- (write/custom_formats)= # Custom Formats You can designate additional file types to be converted to Notebooks, and then executed / parsed in the same manner as regular Notebooks, by adding the following configuration to your `conf.py`: ```python nb_custom_formats = { ".mysuffix": "mylibrary.converter_function" } ``` - The string should be a Python function that will be loaded by `import mylibrary.converter_function` - The function should take a file's contents (as a `str`) and return an [nbformat.NotebookNode](inv:nbformat#api) If the function takes additional keyword arguments, then you can specify these as dictionary in a second argument. For example this is what the default conversion would look like: ```python nb_custom_formats = { '.ipynb': ['nbformat.reads', {'as_version': 4}], } ``` :::{important} By default, Markdown cells in the Notebook will be parsed using the same MyST parser configuration as for other Markdown files ([see available configuration options](config/intro)). But, if this is incompatible with your file format, then you can specify for the Markdown to be parsed as **strictly CommonMark**, using a third argument: ```python nb_custom_formats = { '.ipynb': ['nbformat.reads', {'as_version': 4}, True], } ``` ::: Finally, for text-based formats, MyST-NB also searches for an optional `source_map` key in the output Notebook's metadata. This key should be a list mapping each cell to the starting line number in the original source file, for example for a notebook with three cells: ```json { "metadata": { "source_map": [10, 21, 53] } } ``` This mapping allows for "true" error reporting, as described in [](myst/error-reporting). ## Using Jupytext A common conversion tool is [jupytext](https://github.com/mwouts/jupytext), which has been used to convert this very `.Rmd` file to a notebook! The configuration looks like: ```python nb_custom_formats = { ".Rmd": ["jupytext.reads", {"fmt": "Rmd"}] } ``` :::{important} For full compatibility with `myst-nb`, `jupytext>=1.11.2` should be used. ::: For example: ``` \```{python echo=TRUE} import pandas as pd series = pd.Series({'A':1, 'B':3, 'C':2}) pd.DataFrame({"Columne A": series}) \``` ``` ```{python echo=TRUE} import pandas as pd series = pd.Series({'A':1, 'B':3, 'C':2}) pd.DataFrame({"Columne A": series}) ``` ``` \```{python bar_plot, echo=FALSE, fig.height=5, fig.width=8} series.plot(kind='bar', title='Sample plot') \``` ``` ```{python bar_plot, echo=FALSE, fig.height=5, fig.width=8} series.plot(kind='bar', title='Sample plot') ``` ## Acknowledgements Thanks to [nbsphinx](https://nbsphinx.readthedocs.io), for providing the initial implementation which this was built on. MyST-NB-1.1.2/docs/authoring/index.md000066400000000000000000000002131467453560600172410ustar00rootroot00000000000000# Authoring Create content in one or more formats. ```{toctree} :maxdepth: 1 basics jupyter-notebooks text-notebooks custom-formats ``` MyST-NB-1.1.2/docs/authoring/jupyter-notebooks.md000066400000000000000000000111161467453560600216410ustar00rootroot00000000000000--- file_format: mystnb kernelspec: name: python3 --- (authoring/jupyter-notebooks)= # Jupyter Notebooks This notebook is a demonstration of directly-parsing Jupyter Notebooks into Sphinx using the MyST parser.[^download] [^download]: This notebook can be downloaded as **{nb-download}`jupyter-notebooks.ipynb`** and {download}`jupyter-notebooks.md` ## Markdown :::{seealso} For more information about what you can write with MyST Markdown, see the [MyST Parser documentation](inv:myst#intro/get-started). ::: ### Configuration The MyST-NB parser derives from [the base MyST-Parser](inv:myst#intro/get-started), and so all the same configuration options are available. See the [MyST configuration options](inv:myst#sphinx/config-options) for the full set of options, and [MyST syntax guide](inv:myst#syntax/core) for all the syntax options. To build documentation from this notebook, the following options are set: ```python myst_enable_extensions = [ "amsmath", "colon_fence", "deflist", "dollarmath", "html_image", ] myst_url_schemes = ("http", "https", "mailto") ``` :::{note} Loading the `myst_nb` extension also activates the [`myst_parser`](inv:myst#index) extension, for enabling the MyST flavour of Markdown. It is not required to add this explicitly in the list of `extensions`. ::: ### Syntax As you can see, markdown is parsed as expected. Embedding images should work as expected. For example, here's the MyST-NB logo: ```md ![myst-nb logo](../_static/logo-wide.svg) ``` ![myst-nb logo](../_static/logo-wide.svg) By adding `"html_image"` to the `myst_enable_extensions` list in the sphinx configuration ([see here](inv:myst#syntax/images)), you can even add HTML `img` tags with attributes: ```html logo ``` logo Because MyST-NB is using the MyST-markdown parser, you can include rich markdown with Sphinx in your notebook. For example, here's a note admonition block: :::::{note} **Wow**, a note! It was generated with this code ([as explained here](inv:myst:std:label#syntax/admonitions)): ````md :::{note} **Wow**, a note! ::: ```` ::::: If you wish to use "bare" LaTeX equations, then you should add `"amsmath"` to the `myst_enable_extensions` list in the sphinx configuration. This is [explained here](inv:myst:std:label#syntax/amsmath), and works as such: ```latex \begin{equation} \frac {\partial u}{\partial x} + \frac{\partial v}{\partial y} = - \, \frac{\partial w}{\partial z} \end{equation} \begin{align*} 2x - 5y &= 8 \\ 3x + 9y &= -12 \end{align*} ``` \begin{equation} \frac {\partial u}{\partial x} + \frac{\partial v}{\partial y} = - \, \frac{\partial w}{\partial z} \end{equation} \begin{align*} 2x - 5y &= 8 \\ 3x + 9y &= -12 \end{align*} Also you can use features like **equation numbering** and referencing in the notebooks: ```md $$e^{i\pi} + 1 = 0$$ (euler) ``` $$e^{i\pi} + 1 = 0$$ (euler) Euler's identity, equation {math:numref}`euler`, was elected one of the most beautiful mathematical formulas. You can see the syntax used for this example [here in the MyST documentation](inv:myst:std:label#syntax/math). ## Code cells and outputs You can run cells, and the cell outputs will be captured and inserted into the resulting Sphinx site. ### `__repr__` and HTML outputs For example, here's some simple Python: ```{code-cell} ipython3 import matplotlib.pyplot as plt import numpy as np data = np.random.rand(3, 100) * 100 data[:, :10] ``` This will also work with HTML outputs ```{code-cell} ipython3 import pandas as pd df = pd.DataFrame(data.T, columns=['a', 'b', 'c']) df.head() ``` as well as math outputs ```{code-cell} ipython3 from IPython.display import Math Math(r"\sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6}") ``` This works for error messages as well: ```{code-cell} ipython3 :tags: [raises-exception] print("This will be properly printed...") print(thiswont) ``` ### Images Images that are generated from your code (e.g., with Matplotlib) will also be embedded. ```{code-cell} ipython3 fig, ax = plt.subplots() ax.scatter(*data, c=data[2]) ``` ## Raw cells The [raw cell type](https://nbformat.readthedocs.io/en/latest/format_description.html#raw-nbconvert-cells) can be used to specifically render the content as a specific [MIME media type](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types). ````markdown ```{raw-cell} :format: text/html

My cat is very grumpy.

``` ```` ```{raw-cell} :format: text/html

My cat is very grumpy.

``` MyST-NB-1.1.2/docs/authoring/text-notebooks.md000066400000000000000000000146611467453560600211330ustar00rootroot00000000000000--- file_format: mystnb kernelspec: name: python3 --- (authoring/text-notebooks)= # Text-based Notebooks MyST Markdown notebooks allow you to write your Jupyter Notebook entirely in markdown, utilising the MyST Markdown notebook format. This allows you to store notebook metadata, Markdown, and cell inputs in a text-based format that is easy to read and use with text-based tools. MyST notebooks have a 1-to-1 mapping with Jupyter notebook, so can be [converted to `.ipynb` files](converting-ipynb) and [opened as notebooks in Jupyter interfaces](myst-nb/jupyter-interfaces) (with jupytext installed). When used with `myst_nb`, MyST notebooks are also integrated directly into the {ref}`Execution and Caching ` machinery.[^download] [^download]: This notebook can be downloaded as **{nb-download}`text-notebooks.ipynb`** and {download}`text-notebooks.md` ## The MyST notebook Structure MyST Markdown Notebooks (or MyST notebooks for short) have four main types of content: - **cell/notebook level metadata** that are written as YAML wrapped in `---` - **markdown cells** that can be written as CommonMark or MyST Markdown - **code cells** that are written with the MyST Markdown `code-cell` directive syntax - **raw cells** that are written with the MyST Markdown `raw-cell` directive syntax ### Notebook-level metadata Begin a MyST notebook file with YAML top-matter metadata, containing at least the `file_format: mystnb` signifier. This will be used as **notebook-level metadata** for the resulting Jupyter Notebook. This metadata takes the following form: ```yaml --- file_format: mystnb kernelspec: name: python3 otherkey1: val1 otherkey2: val2 --- # Notebook title ... ``` The kernel that your code cells use is determined by the `kernelspec.name` field, and should relate to a [Jupyter kernel](https://github.com/jupyter/jupyter/wiki/Jupyter-kernels) installed in your environment and registered with Jupyter. If no kernel is given, then the default kernel will be used. ### Syntax for Markdown Anything in-between code cells will be treated as Markdown. You can use any Markdown that is valid MyST. If you are using MyST notebooks with the `myst_nb` Sphinx extension, you can write Sphinx directives and roles. However, note that most Jupyter notebook environments may not be able to render MyST Markdown syntax. **To denote a break between two markdown cells**, use the following syntax: ``` Some markdown +++ {"optionalkey": "val"} More markdown ``` This will result in two markdown cells in the resulting notebook. The key:val pairs specified in the `{}` brackets will be cell-level metadata in the second markdown cell. ### Syntax for code cells When writing MyST notebooks, use the following syntax to define a code cell: ````md ```{code-cell} ipython3 a = "This is some" b = "Python code!" print(f"{a} {b}") ``` ```` The argument after `{code-cell}` (above, `ipython3`) is optional, and is used for readability purposes. The content inside `{code-cell}` makes up the content of the cell, and will be executed at build time. This will result in the following output after building your site: ```{code-cell} ipython3 a = "This is some" b = "Python code!" print(f"{a} {b}") ``` ### Cell-level metadata You can begin `code-cell` blocks with top-matter metadata. These will be used as **cell-level metadata** in the resulting notebook cell. The same metadata tags can be used as you would in a normal notebook, for example those discussed in {ref}`use/hiding/code`: ````md ```{code-cell} ipython3 --- tags: [hide-output] --- for i in range(20): print("Millhouse did not test cootie positive") ``` ```` Yields the following: ```{code-cell} ipython3 --- tags: [hide-output] --- for i in range(20): print("Millhouse did not test cootie positive") ``` There is also an **alternative short-hand syntax** for cell-level metadata. This takes the following form: ````md ```{code-cell} :key: val print("hi") ``` ```` For example, the following syntax adds a `raises-exception` tag to the cell, which means our code will execute without halting the kernel: ````md ```{code-cell} ipython3 :tags: [raises-exception] raise ValueError("oopsie!") ``` ```` ```{code-cell} ipython3 :tags: [raises-exception] raise ValueError("oopsie!") ``` (converting-ipynb)= ## Convert between MyST notebooks and `.ipynb` MyST notebooks can be converted to Jupyter notebooks using the `mystnb-to-jupyter` CLI command. ```console $ mystnb-to-jupyter path/to/text-notebook.md Wrote notebook to: path/to/text-notebook.ipynb ``` MyST notebooks can also be converted back-and-forth from `ipynb` files using [jupytext](https://jupytext.readthedocs.io), a Python library for two-way conversion of `ipynb` files with many text-based formats. To let jupytext know the format of the notebook, add the notebook top-matter similar to: ```yaml --- kernelspec: name: python3 display_name: python3 jupytext: text_representation: extension: .md format_name: myst format_version: '0.13' jupytext_version: 1.13.8 --- ``` Then you can run: - To convert `.ipynb` to a MyST notebook, run: `jupytext notebook.ipynb --to myst` - To convert a MyST notebook to `.ipynb`, run: `jupytext mystfile.md --to ipynb` :::{seealso} For more information, see the [Jupytext Documentation](https://jupytext.readthedocs.io), and specifically the [MyST Markdown format](https://jupytext.readthedocs.io/en/latest/formats.html#myst-markdown). ::: (myst-nb/jupyter-interfaces)= ## MyST notebooks in Jupyter interfaces You can use MyST notebooks in Jupyter interfaces by using Jupytext extensions. This allows you to open a MyST Markdown Notebook as a "regular" Jupyter Notebook in Jupyter Lab and the Classic Notebook interface. For more information, see [the Jupytext documentation](https://jupytext.readthedocs.io). (myst-nb/jupyter-book)= ## MyST notebooks in Jupyter Book In addition to using MyST notebooks with Sphinx, you may also use them with the Jupyter Book project. See {doc}`jb:file-types/myst-notebooks`. ## Code from Files ```{warning} This is an experimental feature that is **not** part of the core `MyST` markup specification, and may be removed in the future. Using `:load:` will also overwrite any code written into the directive. ``` `myst_nb` provides a convenience feature for importing executable code into a `{code-cell}` from a file. This can be useful when you want to share code between documents. To do this you specify a `load` metadata attribute such as: ````md ```{code-cell} ipython3 :load: ``` ```` MyST-NB-1.1.2/docs/computation/000077500000000000000000000000001467453560600161565ustar00rootroot00000000000000MyST-NB-1.1.2/docs/computation/coconut-lang.md000066400000000000000000000040671467453560600211000ustar00rootroot00000000000000--- file_format: mystnb kernelspec: name: coconut --- # Jupyter kernels A Jupyter Notebook can utilise any program kernel that implements the [Jupyter messaging protocol](http://jupyter-client.readthedocs.io/en/latest/messaging.html) for executing code. There are kernels available for [Python](http://ipython.org/notebook.html), [Julia](https://github.com/JuliaLang/IJulia.jl), [Ruby](https://github.com/minad/iruby), [Haskell](https://github.com/gibiansky/IHaskell) and [many other languages](https://github.com/jupyter/jupyter/wiki/Jupyter-kernels). In this notebook we demonstrate executing code with the [Coconut Programming Language](http://coconut-lang.org), a variant of Python built for *simple, elegant, Pythonic functional programming*. In the first example we will define a recursive `factorial` function, a fundamentally functional approach that doesnโ€™t involve any state changes or loops: ```{code-cell} coconut def factorial(n): """Compute n! where n is an integer >= 0.""" case n: match 0: return 1 match x is int if x > 0: return x * factorial(x-1) else: raise TypeError("the argument to factorial must be an integer >= 0") 3 |> factorial |> print ``` Although this example is very basic, pattern-matching is both one of Coconutโ€™s most powerful and most complicated features. In the second example, we implement the quick sort algorithm. This quick_sort algorithm works using a bunch of new constructs: ```{code-cell} coconut def quick_sort(l): """Sort the input iterator using the quick sort algorithm.""" match [head] :: tail in l: tail = reiterable(tail) yield from quick_sort(left) :: [head] :: quick_sort(right) where: left = (x for x in tail if x < head) right = (x for x in tail if x >= head) # By yielding nothing if the match falls through, we implicitly return an empty iterator. [3,0,4,2,1] |> quick_sort |> list |> print ``` Finally, we see that exceptions are raised as one would expect: ```{code-cell} coconut :tags: [raises-exception] x ``` MyST-NB-1.1.2/docs/computation/execute.md000066400000000000000000000175111467453560600201470ustar00rootroot00000000000000--- file_format: mystnb kernelspec: name: python3 --- (execute/intro)= # Execute and cache MyST-NB can automatically run and cache notebooks contained in your project using [jupyter-cache]. Notebooks can either be run each time the documentation is built, or cached locally so that re-runs occur only when code cells have changed. Execution and caching behaviour is controlled with configuration at a global or per-file level, as outlined in the [configuration section](config/intro). See the sections below for a description of each configuration option and their effect. (execute/modes)= ## Notebook execution modes To trigger the execution of notebook pages, use the global `nb_execution_mode` configuration key, or per-file `execution_mode` key: | Mode | Description | | -------- | -------------------------------------------------------------------- | | `off` | Do not execute the notebook | | `force` | Always execute the notebook (before parsing) | | `auto` | Execute notebooks with missing outputs (before parsing) | | `cache` | Execute notebook and store/retrieve outputs from a cache | | `inline` | Execute the notebook during parsing (allows for variable evaluation) | By default this is set to: ```python nb_execution_mode = "auto" ``` This will only execute notebooks that are missing at least one output. If a notebook has *all* of its outputs populated, then it will not be executed. To force the execution of all notebooks, regardless of their outputs, change the above configuration value to: ```python nb_execution_mode = "force" ``` To cache execution outputs with [jupyter-cache], change the above configuration value to: ```python nb_execution_mode = "cache" ``` See {ref}`execute/cache` for more information. To execute notebooks inline during parsing, change the above configuration value to: ```python nb_execution_mode = "inline" ``` This allows for the use of `eval` roles/directives to embed variables, evaluated from the execution kernel, inline of the Markdown. See {ref}`render/eval` for more information. To turn off notebook execution, change the above configuration value to: ```python nb_execution_mode = "off" ``` ## Exclude notebooks from execution To exclude certain file patterns from execution, use the following configuration: ```python nb_execution_excludepatterns = ['list', 'of', '*patterns'] ``` Any file that matches one of the items in `nb_execution_excludepatterns` will not be executed. (execute/cache)= ## Cache execution outputs As mentioned above, you can cache the results of executing a notebook page by setting: ```python nb_execution_mode = "cache" ``` In this case, when a page is executed, its outputs will be stored in a local database. This allows you to be sure that the outputs in your documentation are up-to-date, while saving time avoiding unnecessary re-execution. It also allows you to store your `.ipynb` files (or their `.md` equivalent) in your `git` repository *without their outputs*, but still leverage a cache to save time when building your site. :::{tip} You should only use this option when notebooks have deterministic execution outputs: - You use the same environment to run them (e.g. the same installed packages) - They run no non-deterministic code (e.g. random numbers) - They do not depend on external resources (e.g. files or network connections) that change over time ::: When you re-build your site, the following will happen: - Notebooks that have not seen changes to their **code cells** or **metadata** since the last build will not be re-executed. Instead, their outputs will be pulled from the cache and inserted into your site. - Notebooks that **have any change to their code cells** will be re-executed, and the cache will be updated with the new outputs. By default, the cache will be placed in the parent of your build folder. Generally, this is in `_build/.jupyter_cache`, and it will also be specified in the build log, e.g. ``` Using jupyter-cache at: ./docs/_build/.jupyter_cache ``` You may also specify a path to the location of a jupyter cache you'd like to use: ```python nb_execution_cache_path = "path/to/mycache" ``` The path should point to an **empty folder**, or a folder where a **jupyter cache already exists**. Once you have run the documentation build, you can inspect the contents of the cache with the following command: ```console $ jcache notebook -p docs/_build/.jupyter_cache list ``` See [jupyter-cache] for more information. [jupyter-cache]: https://github.com/executablebooks/jupyter-cache "the Jupyter Cache Project" ## Execute with a different kernel name If you require your notebooks to run with a different kernel, to those specified in the actual files, you can set global aliases with e.g. ```python nb_kernel_rgx_aliases = {"oth.*": "python3"} ``` The mapping keys are [regular expressions](https://www.regular-expressions.info/) so, for example `oth.*` will match any kernel name starting with `oth`. ## Executing in temporary folders By default, the command working directory (cwd) that a notebook runs in will be the directory it is located in. However, you can set `nb_execution_in_temp=True` in your `conf.py`, to change this behaviour such that, for each execution, a temporary directory will be created and used as the cwd. (execute/timeout)= ## Execution timeout The execution of notebooks is managed by {doc}`nbclient `. The `nb_execution_timeout` sphinx option 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. This global value can also be overridden per notebook by adding this to you notebooks metadata: ```json { "metadata": { "execution": { "timeout": 30 } } ``` (execute/allow_errors)= ## Raise errors in code cells In some cases, you may want to intentionally show code that doesn't work (e.g., to show the error message). You can achieve this at "three levels": Globally, by setting `nb_execution_allow_errors=True` in your `conf.py`. Per notebook (overrides global), by adding this to you notebooks metadata: ```json { "metadata": { "execution": { "allow_errors": true } } ``` Per cell, by adding a `raises-exception` tag to your code cell. This can be done via a Jupyter interface, or via the `{code-cell}` directive like so: ````md ```{code-cell} :tags: [raises-exception] print(thisvariabledoesntexist) ``` ```` Which produces: ```{code-cell} --- tags: [raises-exception] --- print(thisvariabledoesntexist) ``` (execute/raise_on_error)= ## Error reporting: Warning vs. Failure When an error occurs in a context where `nb_execution_allow_errors=False`, the default behaviour is for this to be reported as a warning. This warning will simply be logged and not cause the build to fail unless `sphinx-build` is run with the [`-W` option](https://www.sphinx-doc.org/en/master/man/sphinx-build.html#cmdoption-sphinx-build-W). If you would like unexpected execution errors to cause a build failure rather than a warning regardless of the `-W` option, you can achieve this by setting `nb_execution_raise_on_error=True` in your `conf.py`. (execute/statistics)= ## Execution statistics As notebooks are executed, certain statistics are stored in a dictionary, and saved on the [sphinx environment object](https://www.sphinx-doc.org/en/master/extdev/envapi.html#sphinx.environment.BuildEnvironment) in `env.metadata[docname]`. You can access this in a post-transform in your own sphinx extensions, or use the built-in `nb-exec-table` directive: ````md ```{nb-exec-table} ``` ```` which produces: ```{nb-exec-table} ``` MyST-NB-1.1.2/docs/computation/index.md000066400000000000000000000001321467453560600176030ustar00rootroot00000000000000# Computations Execute code and cache its output. ```{toctree} execute coconut-lang ``` MyST-NB-1.1.2/docs/conf.py000066400000000000000000000243651467453560600151250ustar00rootroot00000000000000# Configuration file for the Sphinx documentation builder. # https://www.sphinx-doc.org/en/master/usage/configuration.html import os # -- Project information ----------------------------------------------------- project = "MyST-NB" copyright = "2023, Executable Book Project" author = "Executable Book Project" master_doc = "index" # -- General configuration --------------------------------------------------- # 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_nb", "sphinx_copybutton", "sphinx_book_theme", "sphinx.ext.intersphinx", "sphinx.ext.autodoc", "sphinx.ext.viewcode", "sphinx_design", ] # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. # This pattern also affects html_static_path and html_extra_path. exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "**.ipynb_checkpoints"] myst_enable_extensions = [ "amsmath", "colon_fence", "deflist", "dollarmath", "html_image", ] nb_custom_formats = {".Rmd": ["jupytext.reads", {"fmt": "Rmd"}]} nb_execution_mode = "cache" nb_execution_show_tb = "READTHEDOCS" in os.environ nb_execution_timeout = 60 # Note: 30 was timing out on RTD nb_ipywidgets_js = { "https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js": { "integrity": "sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=", "crossorigin": "anonymous", }, "https://cdn.jsdelivr.net/npm/@jupyter-widgets/html-manager@*/dist/embed-amd.js": { "data-jupyter-widgets-cdn": "https://cdn.jsdelivr.net/npm/", "crossorigin": "anonymous", }, } # nb_render_image_options = {"width": "200px"} # application/vnd.plotly.v1+json and application/vnd.bokehjs_load.v0+json suppress_warnings = ["mystnb.unknown_mime_type"] intersphinx_mapping = { "python": ("https://docs.python.org/3.8", None), "jb": ("https://jupyterbook.org/", None), "myst": ("https://myst-parser.readthedocs.io/en/latest/", None), "markdown_it": ("https://markdown-it-py.readthedocs.io/en/latest", None), "nbclient": ("https://nbclient.readthedocs.io/en/latest", None), "nbformat": ("https://nbformat.readthedocs.io/en/latest", None), "sphinx": ("https://www.sphinx-doc.org/en/master", None), } intersphinx_cache_limit = 5 # ignore these type annotations nitpick_ignore = [ ("py:class", klass) for klass in [ "Path", "docutils.nodes.document", "docutils.nodes.Node", "docutils.nodes.Element", "nodes.Element", "docutils.nodes.container", "docutils.nodes.system_message", "DocutilsNbRenderer", "SphinxNbRenderer", "nbformat.notebooknode.NotebookNode", "nbf.NotebookNode", "NotebookNode", "pygments.lexer.RegexLexer", "LoggerType", "ExecutionResult", "MdParserConfig", "NbParserConfig", "NbReader", # Literal values are not supported "typing_extensions.Literal", "typing_extensions.Literal[show, remove, remove - warn, warn, error, severe]", "off", "force", "auto", "cache", "commonmark", "gfm", "myst", ] ] # -- Options for HTML output ------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. # html_title = "" html_theme = "sphinx_book_theme" html_logo = "_static/logo-wide.svg" html_favicon = "_static/logo-square.svg" html_theme_options = { "github_url": "https://github.com/executablebooks/myst-nb", "repository_url": "https://github.com/executablebooks/myst-nb", "repository_branch": "master", "home_page_in_toc": True, "path_to_docs": "docs", "show_navbar_depth": 1, "use_edit_page_button": True, "use_repository_button": True, "use_download_button": True, "launch_buttons": { "binderhub_url": "https://mybinder.org", "notebook_interface": "classic", }, "navigation_with_keys": False, } # 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"] html_css_files = ["custom.css"] copybutton_selector = "div:not(.output) > div.highlight pre" def setup(app): """Add functions to the Sphinx setup.""" import subprocess from typing import cast from docutils import nodes from docutils.parsers.rst import directives from myst_parser.config.main import MdParserConfig from sphinx.application import Sphinx from sphinx.util.docutils import SphinxDirective from myst_nb.core.config import NbParserConfig, Section app = cast(Sphinx, app) # this is required to register the coconut kernel with Jupyter, # to execute docs/examples/coconut-lang.md subprocess.check_call(["coconut", "--jupyter"]) class _ConfigBase(SphinxDirective): """Directive to automate printing of the configuration.""" @staticmethod def table_header(): return [ "```````{list-table}", ":header-rows: 1", "", "* - Name", " - Type", " - Default", " - Description", ] @staticmethod def field_default(value): default = " ".join(f"{value!r}".splitlines()) if len(default) > 20: default = default[:20] + "..." return default @staticmethod def field_type(field): ctype = " ".join(str(field.type).splitlines()) ctype = ctype.replace("typing.", "") ctype = ctype.replace("typing_extensions.", "") for tname in ("str", "int", "float", "bool"): ctype = ctype.replace(f"", tname) return ctype class MystNbConfigDirective(_ConfigBase): required_arguments = 1 option_spec = { "sphinx": directives.flag, "section": lambda x: directives.choice( x, ["config", "read", "execute", "render"] ), } def run(self): """Run the directive.""" level_name = directives.choice( self.arguments[0], ["global_lvl", "file_lvl", "cell_lvl"] ) level = Section[level_name] config = NbParserConfig() text = self.table_header() count = 0 for name, value, field in config.as_triple(): # filter by sphinx options if "sphinx" in self.options and field.metadata.get("sphinx_exclude"): continue # filter by level sections = field.metadata.get("sections") or [] if level not in sections: continue # filter by section if "section" in self.options: section = Section[self.options["section"]] if section not in sections: continue if level == Section.global_lvl: name = f"nb_{name}" elif level == Section.cell_lvl: name = field.metadata.get("cell_key", name) description = " ".join(field.metadata.get("help", "").splitlines()) default = self.field_default(value) ctype = self.field_type(field) text.extend( [ f"* - `{name}`", f" - `{ctype}`", f" - `{default}`", f" - {description}", ] ) count += 1 if not count: return [] text.append("```````") node = nodes.Element() self.state.nested_parse(text, 0, node) return node.children class MystConfigDirective(_ConfigBase): option_spec = { "sphinx": directives.flag, } def run(self): """Run the directive.""" config = MdParserConfig() text = self.table_header() count = 0 for name, value, field in config.as_triple(): # filter by sphinx options if "sphinx" in self.options and field.metadata.get("sphinx_exclude"): continue name = f"myst_{name}" description = " ".join(field.metadata.get("help", "").splitlines()) default = self.field_default(value) ctype = self.field_type(field) text.extend( [ f"* - `{name}`", f" - `{ctype}`", f" - `{default}`", f" - {description}", ] ) count += 1 if not count: return [] text.append("```````") node = nodes.Element() self.state.nested_parse(text, 0, node) return node.children class DocutilsCliHelpDirective(SphinxDirective): """Directive to print the docutils CLI help.""" has_content = False required_arguments = 0 optional_arguments = 0 final_argument_whitespace = False option_spec = {} def run(self): """Run the directive.""" import io from docutils import nodes from docutils.frontend import OptionParser from myst_nb.docutils_ import Parser as DocutilsParser stream = io.StringIO() OptionParser( components=(DocutilsParser,), usage="mystnb-docutils- [options] [ []]", ).print_help(stream) return [nodes.literal_block("", stream.getvalue())] app.add_directive("myst-config", MystConfigDirective) app.add_directive("mystnb-config", MystNbConfigDirective) app.add_directive("docutils-cli-help", DocutilsCliHelpDirective) MyST-NB-1.1.2/docs/configuration.md000066400000000000000000000115731467453560600170140ustar00rootroot00000000000000 (config/intro)= # Configuration MyST-NB can be configured at three levels of specificity; globally, per file, and per notebook cell, with the most specific configuration taking precedence. ## Global configuration Overriding the default configuration at the global level is achieved by specifying variables in the Sphinx `conf.py` file. All `myst_nb` configuration variables are prefixed with `nb_`, e.g. ```python nb_execution_timeout = 60 ``` ### Reading Control how files are read. ```{mystnb-config} global_lvl :sphinx: :section: read ``` ### Execution This configuration is used to control how Jupyter Notebooks are executed at build-time. ```{mystnb-config} global_lvl :sphinx: :section: execute ``` ### Rendering These configuration options affect the look and feel of notebook parsing and output rendering. ```{mystnb-config} global_lvl :sphinx: :section: render ``` ## File level configuration Overriding the default configuration at a per-file level is achieved by specifying variables in the files metadata, under the `mystnb` key. In Jupyter notebooks, this is added in the notebook-level metadata, e.g. ```json { "metadata": { "mystnb": { "execution_timeout": 60 } } } ``` In text-based notebooks, this is added in the YAML top-matter, e.g. ```yaml --- file_format: mystnb mystnb: execution_timeout: 60 --- ``` ### Execution This configuration is used to control how Jupyter Notebooks are executed at build-time. ```{mystnb-config} file_lvl :sphinx: :section: execute ``` ### Rendering These configuration options affect the look and feel of notebook parsing and output rendering. ```{mystnb-config} file_lvl :sphinx: :section: render ``` ## Cell level configuration Overriding the default configuration at a per-cell level is achieved by specifying variables in the cell metadata, under the `mystnb` key. In Jupyter notebooks, this is added in the cell-level metadata, e.g. ```json { "cell_type": "code", "source": ["print('hello world')"], "metadata": { "mystnb": { "number_source_lines": true } } } ``` In text-based notebooks, this is added in the code cell YAML, e.g. ````markdown ```{code-cell} ipython3 --- mystnb: number_source_lines: true --- print('hello world') ``` ```` ```{mystnb-config} cell_lvl :sphinx: ``` ### Cell tags As a convenience for users in Jupyter interfaces, some cell level configuration can be achieved by specifying tags in the cell metadata. Tags are a list of strings under the `tags` key in the cell metadata, e.g. ```json { "cell_type": "code", "source": ["print('hello world')"], "metadata": { "tags": ["my-tag1", "my-tag2"] } } ``` Tag | Description --------------- | --- `remove-cell` | Remove the cell from the rendered output. `remove-input` | Remove the code cell input/source from the rendered output. `remove-output` | Remove the code cell output from the rendered output. `remove-stderr` | Remove the code cell output stderr from the rendered output. Additionally, for code execution, these tags are provided (via `nbclient`): Tag | Description ------------------ | --- `skip-execution` | Skip this cell, when executing the notebook `raises-exception` | Expect the code cell to raise an Exception (and continue execution) ## Markdown parsing configuration The MyST-NB parser derives from {ref}`the base MyST-Parser `, and so all the same configuration options are available. As referenced in {ref}`MyST configuration options `, the full set of global options are: ```{myst-config} :sphinx: ``` (myst/error-reporting)= ## Warning suppression When Sphinx encounters and error or raises a warning, it will print the location and source file of the text that generated that error. This works slightly differently depending on whether you use markdown files or Jupyter Notebook files. For markdown (`.md`) files, Sphinx will correctly report the line number that the error or warning is associated with: ``` source/path:4: (WARNING/2) Unknown mime type: 'xyz' [mystnb.unknown_mime_type] ``` For Jupyter Notebook (`.ipynb`) files, these errors also correspond to a cell index. To allow for this, we use a special format of line number corresponding to: ` * 10000 + LINE_NUMBER`. For example, the following error corresponds to **Cell 1, line 4**: ``` source/path:10004: (WARNING/2) Unknown mime type: 'xyz' [mystnb.unknown_mime_type] ``` In general, if your build logs any warnings, you should either fix them or raise an Issue if you think the warning is erroneous. However, in some circumstances if you wish to suppress the warning you can use the Sphinx [`suppress_warnings`](https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-suppress_warnings) configuration option. All myst-nb warnings are prepended by their type, and can be suppressed by e.g. ```python suppress_warnings = ["mystnb.unknown_mime_type"] ``` MyST-NB-1.1.2/docs/docutils.md000066400000000000000000000053241467453560600157700ustar00rootroot00000000000000(render/single-page)= # Single page builds ```{versionadded} 0.14.0 ``` Sphinx, and thus MyST-NB, is built on top of the [Docutils](https://docutils.sourceforge.io/docs/) package. MyST-NB offers a renderer, parser and CLI-interface for working directly with Docutils, independent of Sphinx, as described below. :::{note} Since these tools are independent of Sphinx, this means they cannot parse any Sphinx or Sphinx extensions specific roles or directives. ::: On installing MyST-NB, the following CLI-commands are made available: - `mystnb-docutils-html`: converts notebooks to HTML - `mystnb-docutils-html5`: converts notebooks to HTML5 - `mystnb-docutils-latex`: converts notebooks to LaTeX - `mystnb-docutils-xml`: converts notebooks to docutils-native XML - `mystnb-docutils-pseudoxml`: converts notebooks to pseudo-XML (to visualise the AST structure) Each command can be piped stdin or take a file path as an argument: ```console $ mystnb-docutils-html --help $ mystnb-docutils-html --nb-execution-mode="off" hello-world.ipynb $ mystnb-docutils-html --nb-read-as-md="yes" hello-world.md ``` The commands are based on the [Docutils Front-End Tools](https://docutils.sourceforge.io/docs/user/tools.html), and so follow the same argument and options structure, included many of the MyST NB specific options detailed in the [](config/intro) section. :::{dropdown} Shared Docutils CLI Options ```{docutils-cli-help} ``` ::: The CLI commands can also utilise the [`docutils.conf` configuration file](https://docutils.sourceforge.io/docs/user/config.html) to configure the behaviour of the CLI commands. For example: ```ini # These entries affect all processing: [general] nb_execution_mode: off # These entries affect specific HTML output: [html writers] embed-stylesheet: no [html5 writer] stylesheet-dirs: path/to/html5_polyglot/ stylesheet-path: minimal.css, responsive.css ``` You can also use the {py:class}`myst_nb.docutils_.Parser` class programmatically with the [Docutils publisher API](https://docutils.sourceforge.io/docs/api/publisher.html): ```python from docutils.core import publish_string from nbformat import writes from nbformat.v4 import new_notebook from myst_nb.docutils_ import Parser source = writes(new_notebook()) output = publish_string( source=source, writer_name="html5", settings_overrides={ "nb_execution_mode": "off", "embed_stylesheet": False, }, parser=Parser(), ) ``` Finally, you can include MyST Markdown files within a RestructuredText file, using the [`include` directive](https://docutils.sourceforge.io/docs/ref/rst/directives.html#include): ```rst .. include:: include.ipynb :parser: myst_nb.docutils_ ``` ```{important} The `parser` option requires `docutils>=0.17` ``` MyST-NB-1.1.2/docs/index.md000066400000000000000000000050221467453560600152440ustar00rootroot00000000000000--- sd_hide_title: true --- # Overview ::::{grid} :reverse: :gutter: 3 4 4 4 :margin: 1 2 1 2 :::{grid-item} :columns: 12 4 4 4 ```{image} _static/logo-square.svg :width: 200px :class: sd-m-auto ``` ::: :::{grid-item} :columns: 12 8 8 8 :child-align: justify :class: sd-fs-5 ```{rubric} Jupyter Notebook Publishing ``` A Sphinx and Docutils extension for compiling Jupyter Notebooks into high quality documentation formats. ```{button-ref} quickstart :ref-type: doc :color: primary :class: sd-rounded-pill Get Started ``` ::: :::: ---------------- ::::{grid} 1 2 2 3 :gutter: 1 1 1 2 :::{grid-item-card} {material-regular}`edit_note;2em` Write :link: authoring/intro :link-type: ref Mix Jupyter notebooks with text-based notebooks, Markdown and RST documents.\ Use MyST Markdown syntax to support technical authoring features such as cross-referencing, figures, and admonitions. +++ [Learn more ยป](authoring/intro) ::: :::{grid-item-card} {material-regular}`published_with_changes;2em` Compute :link: execute/intro :link-type: ref Generate dynamic outputs using Jupyter kernels, with configurable execution handling.\ Cache execution outputs, for fast re-builds. +++ [Learn more ยป](execute/intro) ::: :::{grid-item-card} {material-regular}`preview;2em` Render :link: render/code-cells :link-type: ref Convert Jupyter execution outputs to rich embedded content.\ Insert computed variables within the document flow.\ Build single or collections of documents into multiple formats (HTML, PDF, ...). +++ [Learn more ยป](render/code-cells) ::: :::: ---------------- MyST-NB is a module within the [Executable Books Project](https://executablebooks.org), an international collaboration to build open source tools that facilitate publishing computational narratives using the Jupyter ecosystem. It is also a core component of [Jupyter Book](inv:jb#intro). Check out the [Gallery of Jupyter Books](https://executablebooks.org/en/latest/gallery), for inspiration from across the community. See also, the [MyST-Markdown VS Code extension](https://marketplace.visualstudio.com/items?itemName=ExecutableBookProject.myst-highlight) and [jupyterlab-myst](https://github.com/executablebooks/jupyterlab-myst), for editor tools to author your notebooks. ```{toctree} :hidden: :maxdepth: 2 quickstart ``` ```{toctree} :caption: Guides :hidden: :maxdepth: 2 authoring/index computation/index render/index configuration docutils ``` ```{toctree} :caption: Reference :hidden: :titlesonly: :maxdepth: 1 reference/api reference/changelog reference/contributing ``` MyST-NB-1.1.2/docs/quickstart.md000066400000000000000000000031371467453560600163340ustar00rootroot00000000000000# Get Started `myst-nb` is distributed as a Python package and requires no non-Python dependencies. Use pip to install `myst-nb`: ```bash pip install myst-nb ``` You can use the `mystnb-quickstart` CLI to quickly create an example Sphinx + MyST-NB project: ```bash mystnb-quickstart my_project/docs/ ``` or simply add `myst_nb` to your existing Sphinx configuration: ```python extensions = [ ..., "myst_nb" ] ``` By default, MyST-NB will now parse both markdown (`.md`) and notebooks (`.ipynb`). ```{button-ref} authoring/intro :ref-type: myst :color: primary Begin authoring your content {material-regular}`navigate_next;2em` ``` Once you have finished authoring your content, you can now use the [sphinx-build CLI](https://www.sphinx-doc.org/en/master/man/sphinx-build.html) to build your documentation, e.g. ```bash sphinx-build -nW --keep-going -b html docs/ docs/_build/html ``` :::{tip} MyST-NB is parallel-friendly, so you can also distribute the build (and execution of notebooks) over *N* processes with: `sphinx-build -j 4` ::: ```{admonition} The execution environment is the same as your Sphinx environment Your Sphinx build shares the same environment with the notebooks you execute during a build. Ensure that you call the correct `sphinx-build` command when building your documentation, or the environment needed to run the notebooks may not be correct. This often happens if you see an `Extension error` in the build log, or an error from `jupyter-cache`. ``` :::{seealso} Check out [Read the Docs](https://docs.readthedocs.io) for hosting and *continuous deployment* of documentation ::: MyST-NB-1.1.2/docs/reference/000077500000000000000000000000001467453560600155525ustar00rootroot00000000000000MyST-NB-1.1.2/docs/reference/api.rst000066400000000000000000000044521467453560600170620ustar00rootroot00000000000000.. _api/main: Python API ========== The parsing of a notebook consists of a number of stages, with each stage separated into a separate module: 1. The configuration is set (from a file or CLI) 2. The parser is called with an input string and source 3. The parser reads the input string to a notebook node 4. The notebook is converted to a Markdown-It tokens syntax tree 5. The notebook code outputs are potentially updated, via execution or from a cache 6. The syntax tree is transformed to a docutils document AST (calling the renderer plugin) 7. The docutils document is processed by docutils/sphinx, to create the desired output format(s) Configuration ------------- .. autoclass:: myst_nb.core.config.NbParserConfig :members: Parsers ------- .. autoclass:: myst_nb.docutils_.Parser :members: .. autoclass:: myst_nb.sphinx_.Parser :members: Read ---- .. autoclass:: myst_nb.core.read.NbReader :members: .. autofunction:: myst_nb.core.read.create_nb_reader .. autofunction:: myst_nb.core.read.is_myst_markdown_notebook .. autofunction:: myst_nb.core.read.read_myst_markdown_notebook Execute ------- .. autofunction:: myst_nb.core.execute.create_client .. autoclass:: myst_nb.core.execute.base.NotebookClientBase :members: .. autoclass:: myst_nb.core.execute.direct.NotebookClientDirect .. autoclass:: myst_nb.core.execute.cache.NotebookClientCache .. autoclass:: myst_nb.core.execute.inline.NotebookClientInline .. autoexception:: myst_nb.core.execute.base.ExecutionError .. autoexception:: myst_nb.core.execute.base.EvalNameError .. autoclass:: myst_nb.core.execute.base.ExecutionResult :members: Render plugin ------------- .. autoclass:: myst_nb.core.render.MimeData :members: .. autoclass:: myst_nb.core.render.NbElementRenderer :members: .. autoclass:: myst_nb.core.render.MimeRenderPlugin :members: :undoc-members: .. autoclass:: myst_nb.core.render.ExampleMimeRenderPlugin :members: :undoc-members: Lexers ------ .. autoclass:: myst_nb.core.lexers.AnsiColorLexer :members: :undoc-members: :show-inheritance: Loggers ------- .. autoclass:: myst_nb.core.loggers.DocutilsDocLogger :members: :undoc-members: :show-inheritance: .. autoclass:: myst_nb.core.loggers.SphinxDocLogger :members: :undoc-members: :show-inheritance: MyST-NB-1.1.2/docs/reference/changelog.md000066400000000000000000000000721467453560600200220ustar00rootroot00000000000000```{include} ../../CHANGELOG.md :relative-docs: docs/ ``` MyST-NB-1.1.2/docs/reference/contributing.md000066400000000000000000000123771467453560600206150ustar00rootroot00000000000000# Contribute to MyST-NB [![Github-CI][github-ci]][github-link] [![Coverage Status][codecov-badge]][codecov-link] [![Documentation Status][rtd-badge]][rtd-link] [![Code style: black][black-badge]][black-link] We welcome all contributions! See the [EBP Contributing Guide](https://executablebooks.org/en/latest/contributing.html) for general details, and below for guidance specific to MyST-NB. ## Installation To install `MyST-NB` for package development (you will need a recent version of pip (>=22.0)): ```bash git clone https://github.com/executablebooks/MyST-NB cd MyST-NB git checkout master pip install -e .[code_style,testing,rtd] ``` ## How the Jupyter Notebook parser works MyST-NB is built on top of the MyST markdown parser. This is a flavor of markdown designed to work with the Sphinx ecosystem. It is a combination of CommonMark markdown, with a few extra syntax pieces added for use in Sphinx (for example, roles and directives). MyST-NB will do the following: * Check for any pages in your documentation folder that end in `.ipynb`. For each one: * Loop through the notebook's cells, converting cell contents into the Sphinx AST. * If it finds executable code cells, include their outputs in-line with the code. * If it finds markdown cells, use the MyST parser to convert them into Sphinx. Eventually, it will also provide support for writing pure-markdown versions of notebooks that can be executed and read into Sphinx. ## Code Style Code style is tested using [ruff](https://docs.astral.sh/ruff), with the configuration set in `pyproject.toml`, and code formatted with [black](https://github.com/ambv/black). Installing with `myst-nb[code_style]` makes the [pre-commit](https://pre-commit.com/) package available, which will ensure this style is met before commits are submitted, by reformatting the code and testing for lint errors. It can be setup by: ```shell >> cd MyST-NB >> pre-commit install ``` Optionally you can run `black` and `ruff` separately: ```shell >> black . >> ruff . ``` Editors like VS Code also have automatic code reformat utilities, which can adhere to this standard. All functions and class methods should be annotated with types and include a docstring. The preferred docstring format is outlined in `MyST-NB/docstring.fmt.mustache` and can be used automatically with the [autodocstring](https://marketplace.visualstudio.com/items?itemName=njpwerner.autodocstring) VS Code extension. ## Testing For code tests, MyST-NB uses [pytest](https://docs.pytest.org)): ```shell >> cd MyST-NB >> pytest ``` You can also use [tox](https://tox.readthedocs.io), to run the tests in multiple isolated environments (see the `tox.ini` file for available test environments): ```shell >> cd MyST-NB >> tox ``` For documentation build tests: ```shell >> cd MyST-NB >> tox ``` or ```shell >> cd MyST-NB/docs >> make clean >> make html-strict ``` ## Unit Testing Testing is one of the most important aspects of your PR. You should write test cases and verify your implementation by following the testing guide above. If you modify code related to existing unit tests, you must run appropriate commands and confirm that the tests still pass. Note that we are using [pytest](https://docs.pytest.org/en/latest/) for testing, [pytest-regression](https://pytest-regressions.readthedocs.io/en/latest/) to self-generate/re-generate expected outcomes of test and [pytest-cov](https://pytest-cov.readthedocs.io/en/latest/) for checking coverage. To run tests along with coverage: ``` pytest -v --cov=myst_nb ``` To run tests along with generation of an html coverage report: ``` pytest -v --cov=myst_nb --cov-report=html ``` ### Test File and Directory Naming Conventions Tests are found in the [tests](https://github.com/executablebooks/MyST-NB/tree/master/tests) directory. In order for `pytest` to find the test scripts correctly, the name of each test script should start with `test_` prefix. ### How to Write Tests There are many examples of unit tests under the [tests](https://github.com/executablebooks/MyST-NB/tree/master/tests) directory, so reading some of them is a good and recommended way. Prefer using the `fixtures` and the classes defined in [conftest.py](https://github.com/executablebooks/MyST-NB/blob/master/tests/conftest.py) as much as possible. If using [pytest-regression](https://pytest-regressions.readthedocs.io/en/latest/), a new directory with `test_` prefix is expected to be created in the first test run. This will store your expected output against which subsequent test outputs will be compared. ### Code Coverage report [pytest-cov](https://pytest-cov.readthedocs.io/en/latest/) is used to generate code coverage report. Make sure that your test cases cover most of the code written by you. [github-ci]: https://github.com/executablebooks/MyST-NB/workflows/continuous-integration/badge.svg?branch=master [github-link]: https://github.com/executablebooks/MyST-NB [codecov-badge]: https://codecov.io/gh/executablebooks/MyST-NB/branch/master/graph/badge.svg [codecov-link]: https://codecov.io/gh/executablebooks/MyST-NB [rtd-badge]: https://readthedocs.org/projects/myst-nb/badge/?version=latest [rtd-link]: https://myst-nb.readthedocs.io/en/latest/?badge=latest [black-badge]: https://img.shields.io/badge/code%20style-black-000000.svg [black-link]: https://github.com/ambv/black MyST-NB-1.1.2/docs/render/000077500000000000000000000000001467453560600150735ustar00rootroot00000000000000MyST-NB-1.1.2/docs/render/format_code_cells.md000066400000000000000000000275561467453560600211000ustar00rootroot00000000000000--- file_format: mystnb kernelspec: name: python3 --- (render/code-cells)= # Format code cells Code cell rendering behaviour is controlled with configuration at a global, per-file, or per-cell level, as outlined in the [configuration section](config/intro). See the sections below for a description of these configuration option and their effect. (render/input/number)= ## Number source lines You can control whether the number of source lines is displayed for code cells, globally with `nb_number_source_lines = True`, per-file with `number_source_lines` in the notebook metadata, or per-cell with `number_source_lines` in the cell metadata. For example: ````markdown ```{code-cell} ipython3 --- mystnb: number_source_lines: true --- a = 1 b = 2 c = 1 ``` ```` ```{code-cell} ipython3 --- mystnb: number_source_lines: true --- a = 1 b = 2 c = 1 ``` (render/output/stdout-stderr)= ## stdout and stderr outputs (render/output/stderr)= ### Remove stdout or stderr In some cases you may not wish to display stdout/stderr outputs in your final documentation, for example, if they are only for debugging purposes. You can tell MyST-NB to remove these outputs, per cell, using the `remove-stdout` and `remove-stderr` [cell tags](https://jupyter-notebook.readthedocs.io/en/stable/changelog.html#cell-tags), like so: ````md ```{code-cell} ipython3 :tags: [remove-input,remove-stdout,remove-stderr] import pandas, sys print("this is some stdout") print("this is some stderr", file=sys.stderr) # but what I really want to show is: pandas.DataFrame({"column 1": [1, 2, 3]}) ``` ```` ```{code-cell} ipython3 :tags: [remove-input,remove-stdout,remove-stderr] import pandas, sys print("this is some stdout") print("this is some stderr", file=sys.stderr) # but what I really want to show is: pandas.DataFrame({"column 1": [1, 2, 3]}) ``` Alternatively, you can configure how stdout is dealt with at a global configuration level, using the `nb_output_stderr` configuration value. This can be set to: - `"show"` (default): show all stderr (unless a `remove-stderr` tag is present) - `"remove"`: remove all stderr - `"remove-warn"`: remove all stderr, but log a warning to sphinx if any found - `"warn"`, `"error"` or `"severe"`: log to sphinx, at a certain level, if any found. (render/output/group-stderr-stdout)= ### Group into single streams Cells may print multiple things to `stdout` and `stderr`. For example, if a cell prints status updates throughout its execution, each of these is often printed to `stdout`. By default, these outputs may be split across multiple items, and will be rendered as separate "chunks" in your built documentation. If you'd like each of the outputs in `stderr` and `stdout` to be merged into a single stream for each, use the following configuration: ```python nb_merge_streams = True ``` This will ensure that all `stderr` and `stdout` outputs are merged into a single group. This also makes cell outputs more deterministic. Normally, slight differences in timing may result in different orders of `stderr` and `stdout` in the cell output, while this setting will sort them properly. (render/output/priority)= ## Outputs MIME priority When Jupyter executes a code cell it can produce multiple outputs, and each of these outputs can contain multiple [MIME media types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types), for use by different output formats (like HTML or LaTeX). MyST-NB stores a base priority dictionary for most of the common [Sphinx builder names](https://www.sphinx-doc.org/en/master/usage/builders/index.html), mapping MIME types to a priority number (lower is higher priority): ```{code-cell} ipython3 :tags: [hide-output] import yaml from myst_nb.core.render import base_render_priority print(yaml.dump(base_render_priority())) ``` Items in this dictionary can be overridden by the `nb_mime_priority_overrides` configuration option, in your `conf.py`. For example, the following configuration applies in order: - Sets `text/plain` as the highest priority for `html` output. - Disables `image/jpeg` for `latex` output - Adds a custom MIME type `customtype` for all builders (`*` applies to all builders) ```python nb_mime_priority_overrides = [ ('html', 'text/plain', 0), ('latex', 'image/jpeg', None), ('*', 'customtype', 20) ] ``` ```{versionchanged} 0.14.0 `nb_mime_priority_overrides` replaces `nb_render_priority` ``` :::{seealso} [](render/output/customise), for a more advanced means of customisation. ::: (render/output/images)= ## Images and Figures With the default renderer, for any image types output by the code, we can apply formatting *via* cell metadata. The top-level metadata key can be set using `nb_cell_metadata_key` in your `conf.py`, and is set to `mystnb` by default. Then for the image we can apply all the variables of the standard [image directive](https://docutils.sourceforge.io/docs/ref/rst/directives.html#image): - **width**: length or percentage (%) of the current line width - **height**: length - **scale**: integer percentage (the "%" symbol is optional) - **align**: "top", "middle", "bottom", "left", "center", or "right" - **classes**: space separated strings - **alt**: string Units of length are: 'em', 'ex', 'px', 'in', 'cm', 'mm', 'pt', 'pc' You can also wrap the output in a [`figure`](https://docutils.sourceforge.io/docs/ref/rst/directives.html#figure), that can include: - **align**: "left", "center", or "right" - **caption**: a string, which must contain a single paragraph and is rendered as MyST Markdown (subsequent paragraphs are added as a legend) - **caption_before**: a boolean, if true, the caption is rendered before the figure (default is false) - **name**: by which to reference the figure - **classes**: space separated strings ````md ```{code-cell} ipython3 --- mystnb: image: width: 300px alt: fun-fish classes: shadow bg-primary figure: caption: | Hey everyone its **party** time! (and I'm a legend) name: fun-fish-ref --- from IPython.display import Image Image("images/fun-fish.png") ``` ```` ```{code-cell} ipython3 --- mystnb: image: width: 300px alt: fun-fish classes: shadow bg-primary figure: caption: | Hey everyone its **party** time! (and I'm a legend) name: fun-fish-ref --- from IPython.display import Image Image("images/fun-fish.png") ``` Now we can link to the image from anywhere in our documentation: [swim to the fish](fun-fish-ref) You can create figures for any mime outputs, including tables: ````md ```{code-cell} ipython3 --- mystnb: figure: align: center caption_before: true caption: This is my table caption, above the table --- import pandas df = pandas.DataFrame({"column 1": [1, 2, 3]}) df = df.style.set_table_attributes('class="dataframe align-center"') df ``` ```` ```{code-cell} ipython3 --- mystnb: figure: align: center caption_before: true caption: This is my table caption, above the table --- import pandas df = pandas.DataFrame({"column 1": [1, 2, 3]}) df = df.style.set_table_attributes('class="dataframe align-center"') df ``` (render/output/markdown)= ## Markdown The format of output `text/markdown` can be specified by `render_markdown_format` configuration: - `commonmark` (default): Restricted to the [CommonMark specification](https://commonmark.org/). - `gfm`: Restricted to the [GitHub-flavored markdown](https://github.github.com/gfm/). - Note, this requires the installation of the [linkify-it-py package](https://pypi.org/project/linkify-it-py) - `myst`: Uses [the MyST parser](https://myst-parser.readthedocs.io/en/latest/) with the same configuration as the current document. CommonMark formatting will output basic Markdown syntax: ```{code-cell} ipython3 from IPython.display import display, Markdown display(Markdown('**_some_ markdown** and an [a reference](https://example.com)!')) ``` and even internal images can be rendered! ```{code-cell} ipython3 display(Markdown('![figure](../_static/logo-wide.svg)')) ``` But setting the Markdown format to `myst` will allow for more advanced formatting, such as including internal references, tables, and even other directives, either using: - `myst_render_markdown_format = "myst"` in the `conf.py` to set globally, or - `markdown_format` in the cell metadata to set per-cell. `````md ````{code-cell} ipython3 --- mystnb: markdown_format: myst --- display(Markdown('**_some_ markdown** and an [internal reference](render/output/markdown)!')) display(Markdown(""" | a | b | c | |---|---|---| | 1 | 2 | 3 | """)) display(Markdown(""" ```{note} A note admonition! ``` """)) ```` ````` The parsed Markdown is integrated into the wider documentation, and so it is possible, for example, to include internal references: ````{code-cell} ipython3 --- mystnb: markdown_format: myst --- display(Markdown('**_some_ markdown** and an [internal reference](render/output/markdown)!')) display(Markdown(""" | a | b | c | |---|---|---| | 1 | 2 | 3 | """)) display(Markdown(""" ```{note} A note admonition! ``` """)) ```` (render/output/ansi)= ## ANSI Outputs By default, the standard output/error streams and text/plain MIME outputs may contain ANSI escape sequences to change the text and background colors. ```{code-cell} ipython3 import sys print("BEWARE: \x1b[1;33;41mugly colors\x1b[m!", file=sys.stderr) print("AB\x1b[43mCD\x1b[35mEF\x1b[1mGH\x1b[4mIJ\x1b[7m" "KL\x1b[49mMN\x1b[39mOP\x1b[22mQR\x1b[24mST\x1b[27mUV") ``` This uses the built-in {py:class}`~myst_nb.core.lexers.AnsiColorLexer` [pygments lexer](https://pygments.org/). You can change the lexer used in the `conf.py`, for example to turn off lexing: ```python nb_render_text_lexer = "none" ``` The following code[^acknowledge] shows the 8 basic ANSI colors it is based on. Each of the 8 colors has an โ€œintenseโ€ variation, which is used for bold text. [^acknowledge]: Borrowed from [nbsphinx](https://nbsphinx.readthedocs.io/en/0.7.1/code-cells.html#ANSI-Colors)! ```{code-cell} ipython3 text = " XYZ " formatstring = "\x1b[{}m" + text + "\x1b[m" print( " " * 6 + " " * len(text) + "".join("{:^{}}".format(bg, len(text)) for bg in range(40, 48)) ) for fg in range(30, 38): for bold in False, True: fg_code = ("1;" if bold else "") + str(fg) print( " {:>4} ".format(fg_code) + formatstring.format(fg_code) + "".join( formatstring.format(fg_code + ";" + str(bg)) for bg in range(40, 48) ) ) ``` :::{note} ANSI also supports a set of 256 indexed colors. This is currently not supported, but we hope to introduce it at a later date (raise an issue on the repository if you require it!). ::: (render/output/customise)= ## Customise the render process The render process is governed by subclasses of {py:class}`~myst_nb.core.render.NbElementRenderer`, which dictate how to create the `docutils` AST nodes for elements of the notebook. Implementations are loaded *via* Python [entry points](https://packaging.python.org/guides/distributing-packages-using-setuptools/#entry-points), in the `myst_nb.renderers` group. So it is possible to inject your own subclass to fully override rendering. For example, the renderer loaded in this package is: ```toml [project.entry-points."myst_nb.renderers"] default = "myst_nb.core.render:NbElementRenderer" ``` You can then select the renderer plugin in your `conf.py`: ```python nb_render_plugin = "default" ``` Plugins can also override rendering of particular output MIME types, using the `myst_nb.mime_renderers` entry point group to supply functions with signature: {py:class}`~myst_nb.core.render.MimeRenderPlugin`. For example {py:class}`myst_nb.core.render.ExampleMimeRenderPlugin`, is loaded in this package: ```toml [project.entry-points."myst_nb.mime_renderers"] example = "myst_nb.core.render:ExampleMimeRenderPlugin" ``` Meaning we can now render `custommimetype` in all output formats: ```{code-cell} ipython3 from IPython.display import display display({"custommimetype": "Some text"}, raw=True) ``` MyST-NB-1.1.2/docs/render/glue.md000066400000000000000000000333031467453560600163530ustar00rootroot00000000000000--- file_format: mystnb kernelspec: name: python3 --- (glue/main)= # Saving variables to embed (glue) The `glue` submodule allows you to store variables in the notebooks outputs, by keys, then reference those keys to embed the outputs inline of your text content.[^download] [^download]: This notebook can be downloaded as **{nb-download}`glue.ipynb`** and {download}`glue.md` :::{versionchanged} 0.14.0 The `glue` roles and directives now only identify keys in the same notebook, by default. To glue keys from other notebooks, see {ref}`glue/crossdoc`. ::: +++ (glue/gluing)= ## Save variables in code cells You can use `myst_nb.glue()` to assign the output of a variable to a key of your choice. `glue` will store all of the information that is normally used to display that variable (that is, whatever happens when you display the variable by putting it at the end of a cell). Choose a key that you will remember, as you will use it later. The following code glues a variable inside the notebook: ```{code-cell} ipython3 from myst_nb import glue a = "my variable!" glue("my_variable", a) ``` You can then insert it into your text like so: {glue}`my_variable`. That was accomplished with the following code: `` {glue}`my_variable` ``. ### Saving different variable types You can glue anything in your notebook and display it later with `{glue}`. Here we'll show how to glue and paste **numbers and images**. We'll simulate some data and run a simple bootstrap on it. We'll hide most of this process below, to focus on the glueing part. +++ ```{code-cell} ipython3 :tags: [hide-cell] # Simulate some data and bootstrap the mean of the data import numpy as np np.set_printoptions(legacy="1.25") import pandas as pd import matplotlib.pyplot as plt n_points = 10000 n_boots = 1000 mean, sd = (3, .2) data = sd*np.random.randn(n_points) + mean bootstrap_indices = np.random.randint(0, n_points, n_points*n_boots).reshape((n_boots, n_points)) ``` In the cell below, `data` contains our data, and `bootstrap_indices` is a collection of sample indices in each bootstrap. Below we'll calculate a few statistics of interest, and `glue()` them into the notebook. ```{code-cell} ipython3 # Calculate the mean of a bunch of random samples means = data[bootstrap_indices].mean(0) # Calculate the 95% confidence interval for the mean clo, chi = np.percentile(means, [2.5, 97.5]) # Store the values in our notebook glue("boot_mean", means.mean()) glue("boot_clo", clo) glue("boot_chi", chi) ``` By default, `glue` will display the value of the variable you are gluing. This is useful for sanity-checking its value at glue-time. If you'd like to **prevent display**, use the `display=False` option. Note that below, we also *overwrite* the value of `boot_chi` (but using the same value): ```{code-cell} ipython3 glue("boot_chi_notdisplayed", chi, display=False) ``` You can also glue visualizations, such as matplotlib figures (here we use `display=False` to ensure that the figure isn't plotted twice): ```{code-cell} ipython3 # Visualize the histogram with the intervals fig, ax = plt.subplots() ax.hist(means) for ln in [clo, chi]: ax.axvline(ln, ls='--', c='r') ax.set_title("Bootstrap distribution and 95% CI") # And a wider figure to show a timeseries fig2, ax = plt.subplots(figsize=(6, 2)) ax.plot(np.sort(means), lw=3, c='r') ax.set_axis_off() glue("boot_fig", fig, display=False) glue("sorted_means_fig", fig2, display=False) ``` The same can be done for DataFrames (or other table-like objects) as well. ```{code-cell} ipython3 bootstrap_subsets = data[bootstrap_indices][:3, :5].T df = pd.DataFrame(bootstrap_subsets, columns=["first", "second", "third"]) glue("df_tbl", df) ``` ```{tip} Since we are going to paste this figure into our document at a later point, you may wish to remove the output here, using the `remove-output` tag (see {ref}`use/removing`). ``` +++ (glue/pasting)= ## Embedding variables in the page Once you have glued variables into a notebook, you can then **paste** those variables into your text in your book anywhere you like (even on other pages). These variables can be pasted using one of the roles or directives in the `glue:` *family*. +++ ### The `glue` role/directive The simplest role and directive are `glue` (also known as `glue:any`), which paste the glued output inline or as a block respectively, with no additional formatting. Simply add: ````md ```{glue} your-key ``` ```` For example, we'll paste the plot we generated above with the following text: ````md ```{glue} boot_fig ``` ```` Here's how it looks: ```{glue} boot_fig ``` Or we can paste inline objects like so: ```md Inline text; {glue}`boot_mean`, and figure; {glue}`boot_fig`. ``` Inline text; {glue}`boot_mean`, and figure; {glue}`boot_fig`. ```{tip} We recommend using wider, shorter figures when plotting in-line, with a ratio around 6x2. For example, here's is an in-line figure of sorted means from our bootstrap: {glue}`sorted_means_fig`. It can be used to make a visual point that isn't too complex! For more ideas, check out [how sparklines are used](https://en.wikipedia.org/wiki/Sparkline). ``` Next we'll cover some more specific pasting functionality, which gives you more control over how the outputs look in your pages. +++ ## Controlling the output format You can control the pasted outputs by using a sub-command of `{glue}`. These are called like so: `` {glue:subcommand}`key` ``. These subcommands allow you to control more of the look, feel, and content of the pasted output. ```{tip} When you use `{glue}` you are actually using a short-hand for `{glue:any}`. This is a generic command that doesn't make many assumptions about what you are gluing. ``` +++ ### The `glue:text` role The `glue:text` role, is specific to `text/plain` outputs. For example, the following text: ```md The mean of the bootstrapped distribution was {glue:text}`boot_mean` (95% confidence interval {glue:text}`boot_clo`/{glue:text}`boot_chi`). ``` Is rendered as: The mean of the bootstrapped distribution was {glue:text}`boot_mean` (95% confidence interval {glue:text}`boot_clo`/{glue:text}`boot_chi`) ```{note} `glue:text` only works with glued variables that contain a `text/plain` output. ``` With `glue:text` we can add formatting to the output, by specifying a format spec string after a `:`: `` {glue:text}`mykey:` `` The `` should be a valid [Python format specifier](https://docs.python.org/3/library/string.html#format-specification-mini-language). This is particularly useful if you are displaying numbers and want to round the results. For example, the following: ``My rounded mean: {glue:text}`boot_mean:.2f` `` will be rendered like this: My rounded mean: {glue:text}`boot_mean:.2f` (95% CI: {glue:text}`boot_clo:.2f`/{glue:text}`boot_chi:.2f`). ````{warning} As of NumPy 2.0, the `text/plain` representation of [NumPy objects has changed](https://numpy.org/devdocs/release/2.0.0-notes.html#representation-of-numpy-scalars-changed). Using text formatting with NumPy>=2.0 will give warnings like: ``` sphinx.errors.SphinxWarning: :257:Failed to format text/plain data: could not convert string to float: 'np.float64(0.9643970836113095)' [mystnb.glue] ``` This can be resolved by either formatting the number before glueing or by setting NumPy to use legacy print options, as shown below. ```python var = np.float(1.0) # Format the variable before glueing glue("var_glue", f"{var:.2f}") # Or set NumPy legacy print options np.setprintoptions(legacy="1.25") glue("var_glue", var) ``` ```` +++ ### The `glue:figure` directive With `glue:figure` you can apply more formatting to figure like objects, such as giving them a caption and referenceable label: :::{table} `glue:figure` directive options | Option | Type | Description | | ------ | ---- | ----------- | | alt | text | Alternate text of an image | | height | length | The desired height of an image | | width | length or percentage | The width of an image | | scale | percentage | The uniform scaling factor of an image | | class | text | A space-separated list of class names for the image | | figwidth | length or percentage | The width of the figure | | figclass | text | A space-separated list of class names for the figure | | align | text | left, center, or right | | name | text | referenceable label for the figure | ::: ````md ```{glue:figure} boot_fig :alt: "Alternative title" :figwidth: 300px :name: "fig-boot" This is a **caption**, with an embedded `{glue:text}` element: {glue:text}`boot_mean:.2f`! ``` ```` ```{glue:figure} boot_fig :alt: "Alternative title" :figwidth: 300px :name: "fig-boot" This is a **caption**, with an embedded `{glue:text}` element: {glue:text}`boot_mean:.2f`! ``` ```md Here is a {ref}`reference to the figure ` ``` Here is a {ref}`reference to the figure ` +++ Here's a table: ````md ```{glue:figure} df_tbl :figwidth: 300px :name: "tbl:df" A caption for a pandas table. ``` ```` ```{glue:figure} df_tbl :figwidth: 300px :name: "tbl:df" A caption for a pandas table. ``` +++ ### The `glue:math` directive The `glue:math` directive, is specific to latex math outputs (glued variables that contain a `text/latex` mimetype), and works similarly to the [sphinx math directive](https://www.sphinx-doc.org/en/1.8/usage/restructuredtext/directives.html#math). :::{table} `glue:math` directive options | Option | Type | Description | | ------ | ---- | ----------- | | nowrap | flag | Prevent any wrapping of the given math in a math environment | | class | text | A space-separated list of class names | | label or name | text | referenceable label for the figure | ::: ```{code-cell} ipython3 import sympy as sym f = sym.Function('f') y = sym.Function('y') n = sym.symbols(r'\alpha') f = y(n)-2*y(n-1/sym.pi)-5*y(n-2) glue("sym_eq", sym.rsolve(f,y(n),[1,4])) ``` ````md Insert the equation here: ```{glue:math} sym_eq :label: eq-sym ``` Which we reference as Equation {eq}`eq-sym` ```` Insert the equation here: ```{glue:math} sym_eq :label: eq-sym ``` Which we reference as Equation {eq}`eq-sym`. ```{note} `glue:math` only works with glued variables that contain a `text/latex` output. ``` ### The `glue:md` role/directive With `glue:md`, you can output `text/markdown`, that will be integrated into your page. ````{code-cell} ipython3 from IPython.display import Markdown glue("inline_md", Markdown( "inline **markdown** with a [link](glue/main), " "and a nested glue value: {glue}`boot_mean`" ), display=False) glue("block_md", Markdown(""" #### A heading Then some text, and anything nested. ```python print("Hello world!") ``` """ ), display=False) ```` The format of the markdown can be specified as: - `commonmark` (default): Restricted to the [CommonMark specification](https://commonmark.org/). - `gfm`: Restricted to the [GitHub-flavored markdown](https://github.github.com/gfm/). - Note, this requires the installation of the [linkify-it-py package](https://pypi.org/project/linkify-it-py) - `myst`: The MyST parser configuration for the the current document. For example, the following role/directive will glue inline/block MyST Markdown, as if it was part of the original document. ````md Here is some {glue:md}`inline_md:myst`! ```{glue:md} block_md :format: myst ``` ```` Here is some {glue:md}`inline_md:myst`! ```{glue:md} block_md :format: myst ``` +++ (glue/crossdoc)= ## Embedding outputs from other pages Certain `glue` roles and directives can be used to paste content from other notebooks, by specifying the (relative) path to them. :::{tip} Sometimes you'd like to use variables from notebooks that are not meant to be shown to users. In this case, you should bundle the notebook with the rest of your content pages, but include `orphan: true` in the metadata of the notebook. ::: For example, the following example pastes glue variables from {ref}`orphaned-nb`: ````markdown - A cross-pasted `any` role: {glue}`orphaned_nb.ipynb::var_text` - A cross-pasted `text` role: {glue:text}`orphaned_nb.ipynb::var_float:.2E` A cross-pasted `any` directive: ```{glue} var_text :doc: orphaned_nb.ipynb ``` ```` - A cross-pasted `any` role: {glue}`orphaned_nb.ipynb::var_text` - A cross-pasted `text` role: {glue:text}`orphaned_nb.ipynb::var_float:.2E` A cross-pasted `any` directive: ```{glue} var_text :doc: orphaned_nb.ipynb ``` +++ ## Advanced use-cases Here are a few more specific and advanced uses of the `glue` submodule. ### Embedding into tables In addition to pasting blocks of outputs, or in-line with text, you can also paste directly into tables. This allows you to compose complex collections of structured data using outputs that were generated in other notebooks. For example the following table: ````md | name | plot | mean | ci | |:-------------------------------:|:---------------------------:|---------------------------|----------------------------------------------------| | histogram and raw text | {glue}`boot_fig` | {glue}`boot_mean` | {glue}`boot_clo`-{glue}`boot_chi` | | sorted means and formatted text | {glue}`sorted_means_fig` | {glue:text}`boot_mean:.3f`| {glue:text}`boot_clo:.3f`-{glue:text}`boot_chi:.3f`| ```` Results in: | name | plot | mean | ci | |:-------------------------------:|:---------------------------:|---------------------------|---------------------------------------------------| | histogram and raw text | {glue}`boot_fig` | {glue}`boot_mean` | {glue}`boot_clo`-{glue}`boot_chi` | | sorted means and formatted text | {glue}`sorted_means_fig` | {glue:text}`boot_mean:.3f` | {glue:text}`boot_clo:.3f`-{glue:text}`boot_chi:.3f` | MyST-NB-1.1.2/docs/render/hiding.md000066400000000000000000000107021467453560600166570ustar00rootroot00000000000000--- file_format: mystnb kernelspec: name: python3 --- # Hide cell contents You can use Jupyter Notebook **cell tags** to control some of the behavior of the rendered notebook.[^download] If you are using cell tags for the first time, you can read more about them in this tutorial [^download]: This notebook can be downloaded as **{nb-download}`hiding.ipynb`** and {download}`hiding.md` (use/hiding/code)= ## Hide code cells You can use **cell tags** to control the content hidden with code cells at the cell level. Add the following tags to a cell's metadata to control what to hide in code cells: * **`hide-input`** tag to hide the cell inputs * **`hide-output`** to hide the cell outputs * **`hide-cell`** to hide the entire cell For example, we'll show cells with each below. ```{code-cell} ipython3 :tags: [remove-cell] import matplotlib.pyplot as plt import numpy as np data = np.random.rand(2, 100) * 100 ``` Here is a cell with a `hide-input` tag. ```{code-cell} ipython3 :tags: [hide-input] # This cell has a hide-input tag fig, ax = plt.subplots() points =ax.scatter(*data, c=data[0], s=data[0]) ``` Here's a cell with a `hide-output` tag: ```{code-cell} ipython3 :tags: [hide-output] # This cell has a hide-output tag fig, ax = plt.subplots() points =ax.scatter(*data, c=data[0], s=data[0]) ``` Here's a cell with both `hide-input` and `hide-output` tags: ```{code-cell} ipython3 :tags: [hide-input, hide-output] # This cell has a hide-output tag fig, ax = plt.subplots() points =ax.scatter(*data, c=data[0], s=data[0]) ``` Here's a cell with a `hide-cell` tag: ```{code-cell} ipython3 :tags: [hide-cell] # This cell has a hide-cell tag fig, ax = plt.subplots() points =ax.scatter(*data, c=data[0], s=data[0]) ``` Finally, a cell with both `remove-input` (see below) and `hide-output` tags: ```{code-cell} ipython3 :tags: [remove-input, hide-output] fig, ax = plt.subplots() points = ax.scatter(*data, c=data[0], s=data[0]) ``` You can control the hide/show prompts by using the `code_prompt_show` and `code_prompt_hide` configuration options. The optional `{type}` placeholder will be replaced with `content`, `source`, or `outputs`, depending on the hide tag. See the {ref}`config/intro` section for more details. ````markdown ```{code-cell} ipython3 :tags: [hide-cell] :mystnb: : code_prompt_show: "My show prompt for {type}" : code_prompt_hide: "My hide prompt for {type}" print("hallo world") ``` ```` ```{code-cell} ipython3 :tags: [hide-cell] :mystnb: : code_prompt_show: "My show prompt for {type}" : code_prompt_hide: "My hide prompt for {type}" print("hallo world") ``` (use/hiding/markdown)= ## Hide markdown cells You cannot hide an entire markdown cell, but you can hide sections of markdown **content** by using roles and directives. For information on how to hide / toggle markdown content in Sphinx, see either [the `sphinx-togglebutton` documentation](https://sphinx-togglebutton.readthedocs.io/en/latest/) or the [`sphinx-design` dropdowns documentation](https://sphinx-design.readthedocs.io/en/latest/dropdowns.html). (use/removing)= ## Remove parts of cells Sometimes, you want to entirely remove parts of a cell so that it doesn't make it into the output at all. To do this at the global level, use the `nb_remove_code_source` or `nb_remove_code_outputs` configuration options, or at a per-file level, e.g. ```yaml --- mystnb: remove_code_source: true remove_code_outputs: true --- ``` See the [configuration section](config/intro) for more details. At a per-cell level you can use the same tag pattern described above, but with the word `remove_` instead of `hide_`. Use the following tags: * **`remove-input`** tag to remove the cell inputs * **`remove-output`** to remove the cell outputs * **`remove-cell`** to remove the entire cell +++ Here is a cell with a `remove-input` tag. The inputs will not make it into the page at all. ```{code-cell} ipython3 :tags: [remove-input] fig, ax = plt.subplots() points =ax.scatter(*data, c=data[0], s=data[0]) ``` Here's a cell with a `remove-output` tag: ```{code-cell} ipython3 :tags: [remove-output] fig, ax = plt.subplots() points = ax.scatter(*data, c=data[0], s=data[0]) ``` And the following cell has a `remove-cell` tag (there should be nothing below, since the cell will be gone). ```{code-cell} ipython3 :tags: [remove-cell] fig, ax = plt.subplots() points = ax.scatter(*data, c=data[0], s=data[0]) ``` MyST-NB-1.1.2/docs/render/images/000077500000000000000000000000001467453560600163405ustar00rootroot00000000000000MyST-NB-1.1.2/docs/render/images/fun-fish.png000066400000000000000000002636661467453560600206100ustar00rootroot00000000000000‰PNG  IHDR๔^V” IDATxœ์wœีูวฟg๎ฝห.m้‚;ุมWลฒ ฦ$ฦฤ๕%Fปฐ`/1ฑฝฑkLิXˆ`AมJ+Hpูฅ์.ปlน{หฬy?ๆฮนe)ฒ ‹๎ฯr๏9ๅ)็yฮsฮœ9บะ9 ซ*ฒhคXห+$ๆPh|(_:ช>ฃฃ !PV๐ั&บๆญๆฬ–*1u‡ีืน˜๏็L*=%_tิhzฒDฤด:ฌพNล<ุšึ+ŸึW[bZไœ:รืQuu:ๆ}ฮUbjฤด`๋อ}๏ธv฿๑]8,‹—6w˜ฃsะ้4ะcN”LoๅฐMหv…ึ2xรทญฒ์ะe๒ฉำี~งำฦ'–/ํซ๙๏”ฌ๔๔ะ ™๔P๛=๐๊šฎฒฒร$เ๏จ‚ดึ%_…BŽ้ฑš ฯxชƒ๊๋Tšฏปฅฎ&ทŠ9u=ys}_t์Ÿ่Ž1}ี!ฅ@TF"า”ฑ ๆ—๒Yrh€ำคVk8ฐiํ4ฬ‹ˆ1ซนูช1M๖,ฉคลjuš=ญด2ŽqํNkงฑ๙ฯZ^ู๋ญ’^ภ๔šิZู/n`ุฅ฿ู฿าพ๖ตาNฃ๙๙--RkY๔+XM˜0AZyถฒ?5ฺขฦฒจต,พ:ด]้ํ4ฬ/b‘ฌl,ฃฦ4้qั:๒^จKh๖A‚œวyํJoปถฃฉ/*๒}fšๆVๅำฺป (XMฏฟ5๓ๅƒ%ผถfžฏ“Hwๅzhkด=ษํอ;ฎฟ>z•<๓ กล‹#ูmฆ_ FƒZ๛‹๒พGฃm}ซVžฌ…ZำคึฒุhY(เ›]wm7š;ฌู‡B!๚๔้3ไฒห6,๕^Ÿ6ะœ9แ์ฬฬL๗ฺ7|#uMฉตLjL“ JJะZฃ”Mžˆ`ใo‰?aY–{ภ0Œฤห63Ÿ™้Ÿrํตๆษ?4วฃ๏:ผฺ๐฿ธ€ต3ืrไ‘Gฺฤy˜wPWWG๗๎สPJQUUE฿พ}wœ ‡ร\y%RQaMš„œr 2๚pไำ็๋3DฯEd."๓์ฟ๗E>ๅฦFQJ‰ˆˆึZDDฮ:๋,QJ‰ึฺฝvห-ทˆึZxใ ้ืฏŸ{]DคฌฌlซBAeš&~ถw๗YYY๒ฉะ้อณAHำคฒT์ซุi nzวีoืsL^žD)W๋oฟ6J)Fˆ$x๓อ79๘ใ฿–eฉ-ๅวศสสพฉข9ไีบต ๗๏฿?ซ01็"ญs‰๓๛๑ขำสๅ฿–‡‚{มลใ,๎<ถภeฬiๆำฆM#‰D\กุŸP3ŠŠŠH๎Y~ำ–าoฬœ9}"ภ 'H–ำ\srr~ตฉL"ย‹๗"+_พต~&e73๙ี$นัลpศ1“’๒ว๏็?3ไ'ฺ๖uื]—P_โ'”dA๔ฦ๔<Ÿ/>วฉ”สูRๆ•ึšI“Œ6mๅ†ฬไf$znR!e“lWwU/bkH(›ฤไGŸโ๗ๅหํ …ๅw(ชzW้m฿J)~ƒโ๒ŸวสVvKš6ฦ\ ษสส:*‰ฬj‹Ÿg–}?ซ๖0bDz4มอ7๛ฅข9๏<ฌn๙ˆฬณ™ฒ Š1ˆเ6rOำ@๕ผ 0ุMฏ๒`๒›žบ ป{Lถi๏o็๓๒ShŽ3ํ@ฯ‹7ณํฎเฑ‡oหLbฮM(พ_ป.ษแูM เ‡>%ฮ5๐ ศBๅ8"’๐๗์]Šฮฦํ1::”]†aหบ‡]1จวwo์)Žvฃดo6{f’_ ฟ ๓™ธ1G‰Tฌํ-1ษ:Œใ4wP*Yำ*8๗$qฏMš‚aŒgฦ 0Zแๅ๛กศJเ›Oฦณ๑#˜:#^—( ิg>B ฒCม}W+.'ๆ(Oษ‚๖\P{๐^๛ๆหบฐA๗>Y\ฒXQา'@qฏ, Ÿ"k}˜u฿ทzฦ๓ุ@ฃง$ภฒโน•ฦ€nๆ๖PM๕a”๖๙ะ5ฃถ๓็ฺ๘xบๅยž์๔w= >+^Y€žkำกวง’ุ—ฌlอโŸ์ †ย0`ฏใSF)~๑dๅ๙1 ศฬ๑แ๗†ยˆ๙žxณoŒ5%Vkกqํ8D8M๘5G๓TœภAม?^…KOทพ๓โฉOy๊@ c8nูแœฝด1œI๋Fะ{p.}็า{๙‡ชzฮๅŸร"<‘W‰ถ ฆ*Hหฦ(‘ฐFฑ™PขงงโŸg๕g<’wส๐๐ฝกvdย˜€{๎††Yฑข}x็ฅ‹P}ฦ๐ํ.ฯ)๕;_๕<๛‹1โžฦn!n4<^„ึ–q๕''Dพขฐๆ›น๕„[-š7F)๎‘ฉ>hง‹mrฐลโ4v฿rFBห์8โ0ํภ%Rx๓ฮฅLš >ƒWo†คzN๔D=.„Cง_ปํๆ €ผZ๗H[9ญn๔ ซฆฦR02ฮ8€a๘4เธw๑๙ฏฌบhšVยญ_<๘ญOœyฆฒ†•Dฯ‰ ภp ‚๑ใQบuหจ{ท>Œ'ฦ‰ีฝ&\+›dST=>ื+>๖uฉ“^๚๒ผ- น% ๘Ldผ-xลž2๏ฏ_+ฅ”อฺ /ณRReุŒ+จ๑ใํ‚๋๋๋#ฦ(cฺกั5Q/pI‰œ่S คฬรค๒ไ๕T๎ฝค<xไยภ–00žo”?w฿}ืฏ“9LO˜ะfก>c*๋ฐŒ+นุCค๓็*๐๒?+๘˜ๅ^Yฤ๊ฆพXžล๒รc7,„รaฒฒฒฮPJ ƒหว#กO‘ะH๋'ศฺYศEurฤˆaุภญu‡>N๛AZL˜€ค ำำขขb๛ะฬฤ‰ˆึ0gŽ2gฬก‘Hde pM ์f๎ป‡gฮžAค#iูแศฮฮv'L รธGำณ““3ๆค“Tว.ต๘1@D:ีบ‡^sทD฿_š๏f‰ี1n SIVe๔วชป!ัุฒ%F-ัuu*ฦEขH๕Sflfึาoนฐ#๊๊TŒ%g*1-ฤ4i~ถg‡.2๎tะZำ:e 4=Yา๎ัeง†ˆ๘ซฃQYXธลOX~:USXํ๚…๏G7 อัดlWฌ‹Feใ๓eaBัึOไ- ๑ƒ๐๏cข4๖ƒ9พ9f็Š๑%๋ƒŸ™gืนศdๆฌผX=ครฺ๊nCย-AM4*3š›ูณ[ฅปชjcๆฦO Ÿฒ ฝ๋๊4ธฉK„™5ฝ๙โžnh4ฐ~GิืiVSnฌฒ๚ำ&๖/&ฬ‹kz3๗WปQcY0 ๋๋4M}ํŸึสผŠljM“ฝปฏt›z MFำิณ๔Y'ตg}ฆฉื฿[ฯเย*,ฅ˜พพSช#hมะฦ‰ํ]_งi๊ต(อ๛žƒ‹ซ d๎อนณr/{ษธeA;;๘NัิฟV_ทZef-}ซ„ำb’e)kf›2›ช/_\ึ^uถ[Sท,‹oDŽ:๊จญ/๓ไœฌภ'Q๖(ชฦBxs@^ฎพK 6๚ดญะท,‹›o๖‰๘pว๙eMMMี›สณฐฅEjดฆojB„ไฃ[ ๙๔7๎zYSค๓ฏ• …Bdff&L)ƒp๒ก‡z๏ถfอš%ฮต}๗ฺ—}/ฉl์Kญeั๏ไ5L=๔I๎ธใภ๎฿?๛์3^>๐eJ)๘ฮ>wRUUๅ–Y^^Nฯž=}O=๕ิV๖ฬ๘ 7 ฒุฒ๗>/1๊{"ฃŠGSSWๅ.r–9฿ รภ4M รHYVๆ๓๙ดˆl๑ ยํช๑์์ฌ[ฎบ*ไฎ๒‹D`ฦ;0๚ธ๒่{&๖ณดH๏คU43ึsภซSVDฟ๒ส+œrส)n_}๕ร† #77—††€+จ{๏ฝW]~๙ๅํษาฆ“ผิฬŽ/๚ีžภ sใ๗C!8Yฤ7$,๔‰HฆM›&ฟ๘ล/{W]u•{๏šš7Oฏ^ฝถx4ง**lบ?๚่˜ภoฯฺุGฑข็~‘NมฑULช็Uฐ๎ฮ6ห*แๅ™๐—ฟ[๎‚@ญ5>Ÿiำฆนiหหหํr•‚๙ 5ฆNŠRŠ๒๒rฏ9lQ+VษON- nบiณ&ธ<ดฯDจž+‘ฤeAจชลONหเ์ฑw%Uุ‚ฬƒ—…*ฅ\ฦฆ{2?NŸมฒJํอทEŒง๔น>Ÿนข)+3Vy๏๕ํ=?‰ieW๘ _โชwฅ ฝฤหปผ์œ nฐ๓ ฿A๐฿™pๆ™gฦAkMyyy ำZ๋๘‚`ูซภ|ŸฯG8$ณ{~๗w?wH€‘ฒzูƒ฿N๗๗ฌŽ> ๒ีีโํ ”e"ภ˜ำฏI†‡X๏*Wฝ'2๑B๐๛์๔รz+มไ?>Ÿ/พ๐ f^Jž+deeตษห>๏* Yชฉ์ื}.7RบขFฯ๗Pkห{ม๙ล=ŽVฅื• ยพ=พPะใน%ถL8ฑฺ v^m—uoh“pงz๒ษ'‘y๑๒ขbซญd^โRP—๖ท~]Z–Ci฿l๒บศหฮ›๑แ‡I&Q€ฝ&ฮ@#TTเฺฌฤ่ฌU1ฎNํ,™)›ไฆCjอwตคœ(โฐnCผะ‡‘”๕ฏถ†ap๖ฐsล‡ฮงณึYNb~ข{ู9์บaศฬณคOฅ}ฒ),ษpgutผ๎‘ฟ‡>ƒบฑ๒ๅ๚˜ํ]—๋ฝ>โŸ{€R”๔ษย0ภ0}‡ๆแ๗T.mbีโ&ิ‡ฮฮy๛ํ‘- นmว mฉƒ;/‰œผ&-ฆ-วฉ ๑ลฟ›ย„ํ7&]zO=6i œG EDษ฿O`‚–e(”‚W #ญQฮช๊fฏw๕) Š3ศศ4X๕mซ5arศแAขุอ๙sึlล*๘[/5$P็ะๆฌX๒ี~›e\ธq0 ง]Kยj(7M์š#lAvO`Œ€ณ—ŽHํ ๚าgp.}ๅาgp—l์ฮฃฝ),ษไ™!-vฯ`c]˜ ๋ร„‚ัˆถ๋I่หฝn<ฺํ‘ ๛ณฤe]5ฏn๐Rz)J˜๔ศ„f#ธศ1bi๛L"Z5ž)ำแ้i๐฿ฟฅ6็Aฤ๊้?*ืyฎวž(เญ ร@D๘ำ‚ƒG๙ฬข๗|๙A–)lฌ‹Pฟ.œ4ใ,๔uœrfX๏ƒwฟ†ฃ๖"กY{ืฎจ@ –2xํ8้WP5<๗‰ ชzผ๋ไˆ่3‘Sภ-Oฺšิ๓Ÿo 1_t๒hdแ+H๋ืHhา๐ฒโไƒ็;„tหฏoํัฃวAํM(ฒอร0ิUใวห[’๖ฮ;sฎƒทv4MะŒ๔ธโŠฦuJม}๗ๅzใ(๚฿3Ÿm&็ย ๎u&J”g๑๙Jญท่TWญ€ ทFW/฿gฯ~ํF`;ขS+= ร8นขBOัibdŸžžะš5ลปUWฏ๙{,ะๆฐˆEj@‹Gฉeฟจ!kFซkมcK-ต)o฿3๘I|ญkZ)อฃ—)รo ต&''็oแp๘r๏›ฦJ)ฒฒฒ^nii๙ๅ๖\,ธC”>xฐ!ว#ไๆŠฮสยศสJzร๓„บะ`ๆL" ตaร†ใN–๗XqId}ศyิ*S,๙บAญน็ฌณX๙็TVV&ฎcM +Q๙oฝ๕cสวp;ทsฅyeยฑ*’•/"์ฝ๗,Zดhึ๚ภm็ดmt*K4h`฿=Vญ*/oM>๗€~hn†ๅหaษจฌ„_๕G)/g่~๛Sk‚0้dOฮๆ๓ฯ๗”‘ ‘ไ๋เ๗๛ill$777!]๒Q4ผซWฏf๐เมณLำ<ช]…เิื…ถLำ$//ฏW$๙Vk]แ‡‡o‚฿‹๛:.เพธ•ภH๒›_ฮ5๏-ญax็x๖ ธ๑โ:ZFgิš_ L๚๕m*ธ-W์=H)๙จหฒาZ|QQ๕๕๕›ชงuคJK๙ดำุ็ฑวฒ๗nmmชฝ+ุขั(yyy ‡รgŒ S#Œิื—๔\ƒ๘;›ษ๏zฉฤ์nู`๏4PU3็มผo์๏wฯ\ฮGฯ~ฤgœ+7n™๗ยปw๏ฮำO?ยOย๖18(xแl™เ”;fฬ˜—oY~ฟ—ภห›โVBร+*H๗*<˜ณvm๋ศ๖8คฮAฯž=๛ฏ[ทnีM€‹N๔Xl๑Yผ๓A5ฃ๗ฐ๊Q’F้1ŠSš~๛4ฐเช๑ไ8;˜จฤ‡cYS฿†,š บ.บ>๙*q๛ˆ[ฑcๅŽา8๗วŽ›๐นท๗mL์:๐$จ\ง˜:uชซt'ญง>๗ค‘๖‚ …B~{ึ-… ั{๏}}เๆ›oูโ9fร0๊๗U-x6็u.๔™„ (R5>มrฝษผด@์~Ÿ‰;4,Oav=ฟxห @ู<๗ฤ$ฮ8~Yแ๒๛ภ ร=ืุG?อš –Fžeฅธpฏห>๙ไ“น๐ย ฤ‘GI^^๚อYE„Œ€A๔ใ4]‘‡cผ๘โ‹Œ7ฮอgฦ {š,?mฟขป)`แพ๎้๓มwๆNjhhœเธฑฒฒฒโ๊๊ช:๋ำXE*1"Opรชl’[๔’๏พgทฌGใŠ„ีใ๏=ฮณˆ๐ีท฿2,น„4J@สnฑ‰แ•พษ)}„๏@{๏ƒ_]cœz จ๑3“#์ถะึ}ฅ}๛๖ฅ๒ี*7–Hๆว9งPร!??Ÿ††•.ุv?ohญgจ ~๗ิช\งพ”ท๊\Xุ ชา5M๏ห๋Iจจ™kี^M๖ญฮฝ’sŒจุEหWฑGึc‰ozฒ&ฌlRŠ(xu<ๅ%zTูD@นืs็ฉ‰ฐฆ.…ใตำ๎าอ}ื;ฅO๗"9O๗=;;›เœ*Yพ^–&ศtx6F$Hlณ๔5ฝส J ร>X+ถตX˜ฆ&0๘มEสจซkฃฬุ†7๎~ฤ%๎|6ฑM|>.=.~Pฤ[ฎฤ˜HC€Œฑ"ํmUv)eUy๚~็ปงst&N~่ส๖ผ๛SdŽ%ฺ้ƒ![(๏ฮƒ‘๛ล‹๛.๖œEๆมบ๗ ือoJแ๛Ž๕qว ชhŠ+ารC:ำค‘y•‰l๎t๒่ว๛„ญ๙รeท}KJJ๚dQฺ7‡าฒlJzgำญG&ูน~ฬˆๆ ฟ์mซdภVs7YjWน) H<,,z!้บ7=ฉn€˜ตพ๘๒๋œz๐')U—žJ}œwv9็ž}0ูU7ฺe๚B้9<๖๘3œWพ,U$G๐}nB\o ฐfฟผ ~}d๘แาปเฏŠืท็ุk@ขG9๙ฯ0๕=˜5kฃFJq๛กPˆผผ< ฅ‰|œไาEาฦE‘–gรญ5}Nํ5ฎฐฐเลผข2b ฦaฆG฿l2ณ}dd๙0ฃš–ฦ(Mขlacm3*. 'WT0%Eฺอ€&ตeฆ้ œ~4 )Mๅ1y+Žd&ำvุI‘-oฤธZh ™™P] ๋+แ…ุๆjxผO67wl"ษi{sb’‡“้†ŠRบจ4้Bข8ตaถ‰y)#ฃไfg`ีทPพ —‚n1๏ bˆ)ŠJ3ศฮ๕SX’Aฐษคก&LCm˜†š ตaZ›-ปพP(d~{VชHM ˜DY:Nb๗f<””,ฉ3๖ถ”๒ฺ่e ๗Dn~l้ๆทrแฒฃโŠ2FุงYž–ค๘๖„มฝ=}lty‡`^e฿kp_กดุพธผส๔e(v[ฦ.ว๕แ…›P†ซก™ณjzบu{ไฤuO๖ภฒ™อม็WRXG‰Ž๒ฟม(ฅศฬ6ˆ„4™9>ฌจะฒ1Jใ† uถฅ‡[ญ8;›เ“–Mแ:ฦ๘ฤ{์~(ห+ภ6‡n้เ+—" nšB ร@k!jl2iฎาิฅG฿์-Pzฒฒ๛X฿pวฮ๗|ธใ๘v*๔-๔\—8#Bšผ’หpNก9ๆžงำ๏Mข<ธโษฯ‘=Iุ็ห)หeฅ็_#ฅ`† ๔h;ฦ๘Ÿaแhi…•ำ ท3BNใฅ’-=ฅŽ$๖ZLศ?$~ุรแญ{ำืั๋xhๅ๖liiYŸ–ao="๐๙q}†ฟเ‹ุ๊ฐ.d๏ั„‚&ญอ& ศ/๖r้ป๚j$;SŠใ์ำ ฝ'ฉ{‡lอ@l~"ถ™๊ฃƒส8๙ซ$(>Ek.๑[”Mb๒ฃs~๙สx ˜\d๎%gธ #dฌ™ะภ๚^@bวูบี:y9ฟล3 ๐ไฦ(ทY‡JemSuไอณํ.g๔่ั้ำง ƒQŽฌุGPฐvU+€"'ฯฯ%ๅW๚~7๚<ํฒ4l๕ใฦQดูา’๖U๓โแ‡{๖[ปv๊t๗|>฿าฬ€5คyv<‚฿”ปw๋ŽaำX‘‹>ม3—๊๑iQผpb#งฎุŽ_#šฺฟปๅฝึฆtํ >ŠK_hs8์ข็‰&ฆ๐„<*ฑQzหTรcว”oชŽMภ[‡1rssห ฅzsc๑๖‚[SO=iฌXq๖&EทšqR$™ฺ„ˆ>Ÿ๏5ญ๕‰zมฒiHง|muœi>,S@•MBD๘tๆอS–'Ÿkๅ*ัชฝi&=@p.dซค:<Ÿ^w @Hhi%x;ิํWt–eqำMพ๑t“๏–eทษJ„i𔕕ฐaร†7ขัh `ด} 1 {hฉRญN<_\แCโˆรนไํ_“๚Z๏ฐS4Oพ— มV;กฯ็{๓จฃŽ๛แ‡žเ๗๛ฺุุธkฌ!7›ZZZ๎๓๙|โEˆ9ee๙๏ …ฬ?๎(bถ……ฏ\~yไ”๖XVๅลฺต่ปphCรฦ๏ฺทไƒvฯ๖Evv๖จkฎi}ฏญqปD"่7฿Tฦษ'หญฑ{่!ตธช*บG{ฎ!่lุ้”๎๓1ุฐ}ฮ›?มBeปี6ำšฆษอ7๛ำ6‰๚zx๕ี.]บlAFFF‡ัฑำ)} ัwย*`๊Ÿ ิ~๛mจgg้SปะŽศศศธ?++๓๋‡>™้Bผ5ด6;๏ j[๙rŸ+ด6ฑ>*+า5ำ,sึ>V่๕!?เqO็B—า€^๚3‹รชฌˆ!‘ZDk|e?w_ kš\$๕wg=ฑใจa่RzPN3‡|น๙๔๘]_€ึ๖ฝหะกzD F@ฝƒIjt)ฝ-๘๒1œCnืZ :๎ู[žู๓ั‚่ฯw)ฝ Hd5สศEด6$ด>๑€/|ข‘m]สณะฅ๔ถฐqฺd Bด`~ดฟ%แZํXzหิc2ะb[~ฤ?gSบี่RzPC{ฉ่J h ฬ๐Jั–}๚ๅ†/ยข5ข…ขซัดn-บ””แƒบ๖ด•ซA,Z|พL\+ื‚๒๙w:ฅ๔MภQฝžHร๏q6-8Ž /ธSNc๏”DooD์=F[9ำt(‚ดFฐB ฮฏ๏’"’ทบ พุW–๎๕rืฤOอasิšHDV‡รฒ์ภeขอฎO@WŸพhญึ;๋g๚šํ๗ึ6พ฿›y้ฝ›ฯู…"Rิ8ฅQšg4หบชฌ ‡ๅuu;฿4œ]–พฌkŠŒ๑ๅ(ฅศ]dR๘b e~?3?ซiืSuE ›€ึฺXX†๗ย4ฟีLํำต„›ย„Cกะa๚๐ฒ„y[ฑำถึํ„‚<{฿พ;ฬ‡ไ DƒQ,,ฤ~ฃoงD—{฿Ÿk^„ˆ฿„CฬXUสŒ๏๚เฌ–ŸูcๆจM—ะ9ัฅ๔6 ต&ฒ$๒<DnฏงYkD)ฬ<ลิตxฅzำŸ่Žฆ๓‡ K้m@)•ใ—gXuๆ= ^ฒA‹ ญu๛fbv=Z๑ fM๘ ู#@ร!tƒF‹๐?ฅี฿๓{๕ฑงmJqฮโ๏g์hZท]ั{ˆ+>kถr‡es[[1žmfภล i7๓ๅNุฉไุe้้‘Qeิฏกๆืูผ_ื๑๏ฺฺน\|—าำ@‡t/ฃะภ?r %mBฐ฿”™ฑพŒืk`:กL๑Mูธฃi์Tni{aI}๋šโGZzี\W†E˜Qำร>สรs|G Bๆ7A๖นฃ’?L?fง‘ๅNC่๖‚ึฺXcšึ๊h”U๎๕(Qฬฌ(Sพ๏GซฅiัšV็ญ6ตกํ—์ืฐI฿bt)= ขฅ *ูธ8ฆY„Šช!%ˆำF„W^@ีฐLZMMณึผ7x๐N!ฯฎiุ$TŸU}vtY๋๎ˆ ๊zaญ2ูg๊„~าŠ๒–'4„eฆฆ+KBไปศฝก!๚ฌFฐwImํg0ณฆŒฏ๎+N‰ฝž-{vำ๛๋vt)= ฟฮFขถj๗(ZCฏ๛šํ่จ:-ik๓าบกDKU๊๐ญJVmช์ฮ‚ขฺ^> ลธณผ‰๎๕(QๆงU#3hI>gUkš|B$hbT‡x๏†uz™vzท'6ถ,28(Bจึbเ jLL"D์ฯ\“ฏฺล>>บyŽๅ4>ฉ;jม™ฯฺฑœl]J๗`‹คกนŸmม–}&๚%ีDญิ๓TiุPw“ู—๕bม/ปณ1[1`๑ !Zฎšธํ +bฑ$c‰ฌn,ฃีฑ`ZะVผ‚ศ&ี๕6„s"็(F็uช@ฮฒ,Š‹‹wศž1‹๚,ฺี ฬส V๘ฺŒMฟ h˜พ~oฎLค‘ต Ÿ่๛ัญ@งด๔~๚นเ‚ีK็ฯW๚wฒฯlll๚๗9ฑhk๐YK0š™ปา๏dณ๋zฺV๏nฑปอ ‡ืqภอ+‰ๅ๖๙Žล_ย%RถะI•๎ Wฏ^9gœฑถฅ ถ ๑ท฿*^=าบบ ด๗ๆ~Ÿท%*Bn*ผb‰ลTQX/๕ํ4Gi;ภ~พห.*ฐOJtjฅ;Xตj•q๕ีฌw_สJฅŸ~ฺwskk๋„m9K][ย—แV‰ฤ”ู}Ÿj+์'iษw$;ส ฿์Jณฯc๙ฑ ฏUkW้ฝๆิ๎น‡ธอฬwv ฅ;0M“‘#ัใO>u๋O<๘ฟฆฆๆ‹ทfศoฒฟฃ–;-๘hww๘ี‚ฐWaU‚าg1‹kน6ํ}๛v?Œณ‹.$ฐถ ‹+นR\๕Yทzkˆไ$ŸVXXธGCCรโvะbงRz( ##ƒAƒ|u็œ#ลmฅ†x์ฑฌ฿xใ„3ฏพ๚ฺ6W:,b‘ฝซwฌ][–่ฒรย3}Nโc๕1กPˆ@ r่žฃ๘๎ปำP฿ภ฿๙;Qข\ธ๖ัh๔>๘€C=4ํ1ฺUUU๔๋ืฅิ›"RพอBฺlwฅgff~t๊ฉัCŠ‹Egdูู>_โ6้6๘ึE †ษ“3=๚”๒็Ÿมiฦ7|c)ฮYฏหjz๔ฎ๛œโb"‘~ฟ?ํัฺvู‰ส7 ƒ[ธ…ำฟ8Aรฅแ%๕ˆNำ4‰yงืษต๔’’’!๛๎[ทtไศ๗jุ๗ณ๐ฝีญ๛๙ฒW€G๑{ฐ‡{ๆ*คWV[ื๚๖ํห๑ฝ/ใมู—‘™™™ถKH—ื0 "‘ˆ๊ศMŠ;{‡รNพ์ฒะ๙™™ํ_พึุฃj5ฌX‹ฟ…โs๊y็ฐ๏!‡2hL6ReขP์ม๖ŠWR’ฮN็ฎ“โฌฌฌคw๏ ปU'ู™œ_)…išชฃถ๏4J๗"‰0pเภ’โโตซฦำ9่๒ รฝv-,_ซVยศฝแˆร์“๖Crๆxผ็ฐH4‡u`๖ฟฦฎ ห้วฮษ฿JซาU€G9ฆi’““ƒiš๔๊ี‹๊๊j7Mrฏ”" ‘™™‰ึš๖oฟ–๑ใวsuื%ไ๑ึำ็ฆป4vDกํำ4ษฯฯฟญตต๕*ภ8xx็Qศ3bGoxNRr‘|‹I็บˆภส5๐๘๘๕_ำฺ8ะ‡Ÿ\ZJ8l,›l•'œpoฝ๕V ฝUUU๔้ำ'ๅ๚๛๏ฟOii)๗฿?=”z.’๗ศn/สหห9ๅ”S|]tQป/ตํTJ฿c=๚,^ผธRDŒหฯ†ฟ^ฒ๙yโJ(-๏y-โQธ๗Œ–ตu๐โtxo>6s ž)โ–wฏfสฃบVšž —ห/ฟœcŽ9€—^z‰วM๋EบฐWฏ^<๓ฬ3nษ^%-หสŒถชขy๘aโ๊๊ศฦ˜A:๓3{์ฑฐˆฐ๔ ุฅt‰ฝ๖žฤDb๋MwvฉYii…‹แฝ๐ํJ๘ๅง๓๓บs]E{0x๐`VฌXภิฉSSลqว‡ำ{ƒถdนN›6-!Myyyฺ๘ –ฏ ำะ.บศ}า$CฦGฒฒ2ัŸsžŒำ๓เุ}cJ้3ษ=้‰ืฝสฃ4ืjr ฎrฒฺบ๕x”aฬฝ๛ ่–{ํฃ‚ใsสLŒฺe{ฏฝีŒ€%#YINฟ๕ฏQ†Mำ๗ู๙๚{ฦŽหoผAnnn‚gp๒]tัEุ่ดํ‰ด])0@Œsฯญฌœ0ูcีบญึ๏๓๙f๘ CฌOฅุ๚”ฦพฤ3zOL™˜Qำwาz๔„ขผ<>Z”˜7แlตw"*ฑA\yฟ}vzv. ์;ดm๚E„K/ฝฐงปŸQb]]]ผ‘ฦ๊๎k[ํฟ{ร0XบtiJฆiฆŒใฦ๊ี›๎2”‚ำN“ฌ›n๒ษคIˆR๊)'ฒfškญ็ล๛X็hh`Aฬฅ=๙ฮ๘=oฺ4Ÿช๘W๎๗CNธ๓~^†ี e7ลM_เžงเ๔ใ!s„}vzAnข‹ต๙W ฟตึ็?OฐHญ5cวŽMศ—Ÿโ๎ป๏F,›.งซq๘ศU sakปน่ิ๗ะCั‡ ‹ษช5L˜ ฟฝํถLนโ คจจ`๘ฆ€aŸ๏>`cXๆ฿ฑlใฎ.ˆ g๎ฌDKNv๓xฌU๘‹pิซL35hs๓ุa;KŽเร%p๔ˆ๘๘_)P>'Œ+4M8fฬ˜1”——S^^ฮุฑct้,๗฿‡n<ํฮแOม้Gฺ–o•••ˆ6lุRีคล€฿๔}ฉ๏ฏ{฿•์- ล฿ม†![UZ#ภๅ—7ฮฝ๕ึLFRf^^y๖๋ฏฟ๎=!V๊ๆh cณ‰ฎลฆ™[—ฬ!$๗พ๎‘ู฿ฤ๛้„xB\o‚)|์ี๏pฤ™๐๏เฉฉ๐ะตvฒOพ‚ฯง@MM ฅฅฅi๛u›–ฤฯไF‘?{ปPg๘จฤรฑ‡1™‡ŸิŸ}ฝร0jฝำภ[Šฟ)๋Ÿ“™ฝJbRู]lZฆ๒๛์‘…๑ล^฿๊R๖ุ๊ส8๚h๑tะ๋ัŠ คธุ zpŸ0\๒ธvๅ\{ฮ[กฺ|๏ฦuืซ๗6–ฦ2ุudธปRฐเป8ฏลฑE•k`๏2; K็โ!Qม.]I3w|ฃFยtN`๖vižฎสแษ)แƒGaX๗‡‘้้%ั6Žปfดฟธ8UfŽŸ@F์)‚ร.ุร%0 ใฅ6Khjใบ“ฝ1๕VCƒy˜ฬิ\=ึํŒŸ฿.%ฎฬข๑K^ม$๛n[Pฑ†โ6๚mP˜ธdํใ/Š‹SžF$0ํa๘๐ร๔ฺ๋zา– วส็ฬ™ƒฒโ|;tนmวก1nแ๘ๅqrzNNฮฐ-ชGยlิีัœ;rWJัดrBBoฃ๓ถ:ap)X:ฉŠXโฅ+p๋yะฟw&‡rHสฤ‰SV๒ตูณgป w*HŠ']๚ุT‰๔$ [EาNะhญ9๐/ปึ?mEซY฿ฬ'„์\?น๙r d็๙ษส๑‘™ๅ#iฏTylฦC0ฒฒฒ6ฤ l๏่5ใz+์ฺƒDEงqห^% 2:DึNˆ7๓Xš;ฝŽ…๓ฎšย~GŸIe}ยIY V๕x๒3bGNฤซ๛ัวžNๅO%นขภšทแƒ‡>A)ล Aƒฐ,+ญ๒/พ๘b รภZ9สVธโ ุœQˆ$ัšะ0=@8๐ภ๛๓าฦ ฿๖[บ๛yCๅ่›๗—‚‚์’ฬๅsW—GVŽœ|?นqืศ4๐g( +;p฿ฉฤUT“#(! ๛ษฎIjG่(ะ'๊$Aษ?D4฿ฏ]Oy0๎™=Vpอ`vหšว๔็ลณ (5ญแป๏เฃ ุg–รž{›๕๓ป‚ต€๓ว,O`กคะ~๖๎m(โฑ:๐Yถี‹ฌโีษฮปšm>8gป๒ฤ๕KxเRฝโKถุ๊oฮต]ฤสะ†Fซ๖ตoฮ}”๎ฅ๙๘|*คู(Y9~|EvžŸO!แ …? ๐๛ํBณ23์z+*าtปhNฆ”DŽ<œฝ?ฆ{{™NHทQŽ7_B ื=Yฉชท"๖3ฬŸSฦUžy#บ๔๋ฟ๖>ปมnา“žาจ“ฎ%4‰๑†Gน’&฿3฿๕เฑozลหT0X…Dข|ฟฆ…?ี–b๘œูBปฌข’L”a2 jร4ิDbŸ๖๗^r์ฑฯ)ำษqทยFฅpใฺŠM3ถ%!็^ย„ q8n5 n฿Rn™Z“Jใภไ8เ€ธk็$0Fภ ทCS0ับ>_W:บQ‡$]O๎]๗”>Mทำp’ผVYŠ฿X=Šผย] ”R™ถ-๖หึd็๙cสVn—jฤ๔hY่8๏Ž.”Rถา๋๋i$LM6™Cุeะ>0<Bฺ!m’๋๒ถ|ฯ‡+!ฅ@บŸฮŠลั่<ถn€‰h5 @ล#PqAb’’ั๓ำฑา$7ํ|๏}—6ฺKณ”‚ผ^Yzัฎd๗ฬๆลฝ‚H(ย™+‹@Aทb\วaๅ*ีีญŒษlแ–~dfšžm=฿6 —^ˆ@4lัฺlb๘‘ฦ25–%8๑บˆุJ_พ\๔๛aะ‚;บI$”"๔๏%GBฬนฅ~R฿๏zyฏHŽฅ#ƒ7ช)šตŸ7Zแ์+|Jปณโ›&jย(Ca™šPะ"ุdาล็W|๑ะ"ๅศศศ๘DR•.ฤงYRธ๓ปVQjxL๑ึ&—'ษ_<ญร๕สžข}๋e8ฉ‚ฑ—DฯคŒ9W‘ฉa‰mฤ•ฎpYY\2v ว นฦ9Š'๎mH๊’’๙HŽพ:œ๘{ลLเ {bศž๏๑"ฎ{ทหษ8 ฎpŸaOH”—]ะ\๛ใЇ๖ษ๓UedDBฆ)hS‡,B-"Pุ=Ÿแณ๛๔ใŽ;๖U˜–*ษfฯ๗|ฯw็A‹Cl _&Nด๏ฮJฅŒซฬค:“’ฟุmoพ\มมคฉZร}๗ย’นืS’›แ>XXทh<= ใ–˜2็เยพ๘่”ฮ?9ˆžฦ6ƒแ—ๅ`xF-้ฦ›ฏƒ/i~ ื< >˜x> ใูf|ว์kw‘พ@kญถtฑ๊=|T จ๋ŽฎYฟบตคฑบหฒ;3*ไ๚ ฃ# ถย๘ีWง„RJi&ง{๎}๘’K|XW€;Oฏ5”–๚#<}ผwุเศฦ+DฏyLIŠฯD>ฬ58แ๛F?Œ'ร†ธ wฒyB O์>ฮ ๔Žณ'0ํq„}_pXŸ‚az่k#kณ•ะ๋%ไปํ"[แสcวL฿„€-Vธท๎7ฝt—๒๖ฯ- ZˆF4…%hญY๘๗o็A์ษตišฉน๓ฺ(ีkษท๐่dU]U%eNฟเ;€ฆ# o๖#๑1ฃJ ืR’OPw?สŠ?bW ฮ9หrgE๐๋ธะ“ใ ๛ob฿ํล‘`8ัb=4$Œ4’F้šภ7—ท4u๘bซx.นษ_ๆ›ฉาr<8๚…o-˜ๆปแนซข†Ouu๓–=Z9ยน๏ศสสา[Xb)o ˆภ3ฯจฺeหฌา‰SZgg฿ๆfจแ-แำa`aญงrIฎ]ฝถฬšsฑ"W๑๑ยๆ}%#zฤ+wปOโห ํปก ธ‰ำ—ษืฺ๊‘๊pุH“8นผื>Aiญ-_{ฝ{pc|-สญa‹วฟI4=๗œj?R฿}'ฅmาาิ.วๅjฌnภํำใ+`าHŽE๘=มmf๎r%ย๐I้Zฝs๙v^IฐŸeฆธb๏"๏ƒขคžjuคzฒtuด ์b…ˆด›ย7ท–-\โbสน๑FK-Y"ถt ญ๕›€ฺฅ๊H้่๕(9œ ฉํงรแVx๕ศฆ๖๊™=๓7"ŽzY>//ฏoKKห*DŒง"ม‡ถ%Oฬ”๘รใK7\ˆฏ ี๓B647ำmใฉ8VWบLyา` ‡ƒ๗‹็OศCjู๓Wยˆq››;ดฅฅeY;‰oซเฎ;ญฌDœ๚’่งŸขงNี>ร0่ศš››W ฟ๊*๖Yถ ิS–ฏฃwhVD"ฃจจhH4ฝ6žํต ฅ ร{†Fย!ภม{BQ7?จ(`‚… ญQh รฦhl‚ล+แ“/เใ๙ฐไ๛๘ฎJแ<žผ๑ดำNป๏น็žk์์2j ฎา๓๒rฏ๛รp๛wตs2รตื^ใ‡oค™4ฺV<๐€oแบu‘wV%'cปGŽํ ำ49๛lฟ ูบณ6 ˜1C™3gFฒegลNญ๔QฃฐŽ>:%"๖nR_~ฉ๔[o —_พ๙ฏkkแแ‡๛›ฆนฐฉํ<ุ้”ฎตf่PอYg้งฏญฉAO™ขš~—พ๘โž=เ€ตใŠณณy๏๊ซi๓œsร€oฯธณฑ1xuGmแีูฐS)=++kJVV`ฎฯธg๕๊ช`vv๖&ำ๗๏Oอน็R’๎#๘—UUE‡n้ปi?&h9>๊(ไศ#ใฟEเำOa๘๐|7t๓Nฌถ~”J?๗\ค์„ดึVx่กc›ฑTuกรp๕ีศฤ‰Hvถ๑DG์ืา…Nญ5C†k^}๋๗X๘ฉแG้ปฐ ฺB๖HIฏŸ!f *ธhCKHิl”hx–Xซณ^ตd“๛“ลŽ˜า…๚ฮ5ž ฌ IDATลG7ษา_ˆ,:DDว๖N^๛LŽฎส.€hณ!*รภศ*•ฑฤkไ"Bำฃยt[ื๐ืฬ_ํ0F~B่2๔.l๔ื๗ง%‹^Wๅก ”‘U“์‰ฬžฟ IคูธZ Zhk$s์wW'bEม็ห้adg<ฟ๑+ฒbzW[์@4fšปะnPYC๖‘ฬ!(ซ17 DะuS๊EG๓ม4Lใ+1ฐ,ะUHรH|Lู๔DqTัดF,1Zžูkภุรี]^ด [#๗+$Šจ P>D Šœ<=oฟซ”ah ฎPB๋@ัZg๙:a ญ5 ต-ฤ4ฒฃX๚) หะปฐu๐+Uำ{&พ\”ฟิ๎ตต daฮ4ฮศ?๘xยตˆD"๑7~ตึ4O.xร_์์…#ฺvE7F;ๅ‘ด?tzถ ส๐#๙#ณU$c{1น‚ซuํฬw$ดแ]ดฺย025€Ž4|ฆdฃสศผHดkเ 5บษxgXdcFืใต. hณ‰†h1-ฤดภดะฑO1-tห†k1๒nริnš„ฟ 9ตตั“v4??vtzถ ๆGŽFฯHkฤŽมGำ฿ำอึำลื†ทฃy๘) หะปะ.ˆฮ(๛จ‚gโ†ฌำS†ny >dฎ7บํฺ3ทŸํhฒ2่2๔.ดDk#๚ลc๔๊พ&>j!กึ/ศ<"7ŸGv4]่B~ D-าห`kด*‘๊hDพ_–๊฿Wษข๎‹dAฮ‚#v4?etMuvกฝPPwKํ_{Tใ7”B ๘Šญ๗wง๚ห>d๚ณ—ŒZ’ตฃ‰ฉขke\ถ"’aฎ3๔ Œ๓ฏฒPซ4อ๚ั9Š ฅ่[œษาส,ŠDZtฑ๖พฎe{ฃหะปฐM๚WU†fv๏ๅ9y๓MD ‘"…หฯเŒ ย`Zน~•ถ๔€.c฿พ่šŒ๋ย6ADŠพin_œ้์ 9ŸFQ(D VƒExi˜ะโ‘uยMQฆ฿Sภ๊nr๓]ป๕ฝqGำSB—กwแCD2ชึ…~+Œษ™ฑใS4˜มšาBำ›M„–…0ƒ&–Xh4๖gฦ^๙รฟผน:บะ>่2๔. ˆˆะฟ๖ๆฺฑษQX"4kอสH„ีฆI0lqศk1ชอ#ทฐฐ”ล‘#”่ แทบ ฝ ?Z๋‚u—ฌ๛ ๗ุaพ–!Tโgy$ฬzห",BT„ˆึDมn@—šุ็†๕จZ“จ?Z}T๋Qe]ฦ๑่2๔.l5Dฤ_๗a๓฿7ๆ”ภ b แ/ย4>HSศไำปีbธึDE\cwb๗ฬz๓๖ษ{ผvณ๔ฃG—กwaซ "ˆHฏ๏ฬศšBๅ#cAsN+ŸH๘ซ0bู;rj4ั"อ์w{ะว ŠN0๖`ฦœภ>฿๊ฒ?ŽPฝC๛‘ฃหะปฐU‘g๏ฬใค(๎ฎ๎žc๏X–EAะ ‚xkผ5ฤ๓๑Ž>1๑gโHŒ1yŒๆ๑xbŒIŒฦ๛Šโ ˆ€ Š —ศ}ป,{อฮ๔Q๕๛ฃงgzfgv—s๚รk™๎๊๊๚VU๗งพ฿ช๚VutICห[e…กัะเ8ฌฐ,Š.ฌกไฅ™็๕ษ3Ž…ƒc8l>0ฤ7gณ์ไถ๔1๘{u/aKUwข่0ค”šนฤุz๓B.+ก9ชXiYlฒํTŸnQŒk=าฬCto0ฮw.‘˜ย\qjิฝดH@๖ VtJ)ขด๖wตŸ…๖ กฟƒำพฅๅ“8คฆึœ(L]Wอ๛›z๐N]o6žM}ฌZกศŒs๏Ÿฆด/พtvงp7G ัtRJฃfBอลกพกGE‘ ้๙&šnB5นคต๚ >W…mหึoฉม7…ฉ}^ว‰‰ด^๗Žz฿+2Ÿรƒn;ัด‹ไ\ี*ห๚ถ@7oฆๅัzœzว๕‚Cฅ~%งH2mVฑ* “ค๗บg7 qฅฬ7๛๔‹่F`l๎HDะ.”Rแe฿ถปจา8กมqXoฤคค๐oอtE}:žGtœฌ~นCP™ชขv`VX๘ฆคฬhิบ๘?฿9b :ญภป!ขhž6฿๔ซM฿6L*cฃcำ์อ'งษ,Nฏฅhj"ัŒs‡ฺม!VŽ,f๙‘% ๘2^q๓Œฺาูๅ฿]=@›PREWณrฑัล่›รูdณfiO„Ktฟ)ž<๎๒\3ฏ„ฃTNฒที๘lXh ฟC=@›X2ฃ๑“ ไf‰ำ่d\“5ๆ/่ŽฅงM๐์>ทฉ M‚รด}ญี!‚{ืโแ๘ŒKฬKŽ่œ’๏^ˆ /คT|)[A่†อDr›๙฿ฬ}ญ‚šรยXสGx|ฤฯ๒{ืjmxp=]Kxm•ขปG๚x—–\Q{ๅฬฮชƒัไลœ?ฅH{2=hฆะ฿lกธฒ_lฌpXณb>MSf ผฅศ๎๓7 คGไM๓๖G่"xUทAํศ ้HŽ^ฎโoUป#ไIฆVฃก่ย& fูyGs™ใJwX{LŸ\_ลทC F ฿ข—d# ํU๓† ๊ Vนm3ขศ‰ฏJพบY4Šปฬ๑l๙K—„L†๕œด…๗5เดำฯ็@]KEหฑืึ];ฅskๅ๛‹€่ZAฺR[Z์$ปเ)จ"ล๒๕ฝฑ}}nฐ=3ืkดLงฃ2ฟ๚ืฟ8๏ผ๓šnนๅ–ฒป๎บ๋{;.ฐ›ฟโƒmhšFaaแ…UUึฤฑc๛๎ ถฝ๛7์&ญ‚9s๕หโG ฎเXŽอŒ—œX?Ÿ๓™รฆNสQG•W[ถ/ทu|ฺ6;ผชชŠššๆฯ_Hฯž)**ย0ŒV„฿q}}=ๅๅๅ1 จC…๛Žaxท–e๑ฯ>มืu'ท?j”5๐เƒฆนs?๙„p๋ค„xjj`ำ&จฏwcMะง+๔้Uีpะ่ื*ปC2จLพšJ‚๎ฏ#ก)k6‚<๎[DaIJถ“2หฺฟcTิ๕m1ˆ#F0kึ, S;vTฃ็"_[๗ไ“ฑeห***8๒ศ#yๅ•W())ม0ŒT<ฟผถduด๗฿?ื]wšฆ‘RNž็ปซ};เ8oผ1™qใฦฺ๋5|_฿พ[FืึBm-ฤb`Y`™๎ิฺฝแำแใ w5I“Z๐ฟ‡ษฏ‘ Aฺ1อ;Wคž˜ภwž*yH{๗งnJž',ุธ|Ÿ.„cŸ‹โEGBิVห๐mWŠบ๙ษ€ผ๕ึ[๑nrm˜วฉโ$ใLœ8‘‰'ถ7‰ฐn:*++s0ยแ0บฎSWWG4EมoฟอI'ิๆฝใฦใ้งŸชrX–E$Aื๕‡ZZZฎูU3"‹€่€eYŒ7.๖o_‹ล”บปขBU%๔4ธแ? บRsBยGฦฌ๓7“ต๏ใo ‰„Mซึ๗fวษ‹J๘าN^P &lฌƒ๙ห\ข/Y๋5๔๑Bœ5๊g๗ภJzฝ ]็ุข"^yๅN;ํด6อl<๔ะC\sอ5[S€ˆz#๔ํษHz(าทo_๎น็ฦฟUฒ๚๗๏ฯ7฿|S†ฟั0M“H$B4E<`ซ„uD8,๊u=๚๓ฆฆฆ่๚žํZh6 ่ฝvํฺวMำ<\B w_c†ุJ“=›ฤสงญณษจิVคฅอ3ฟElX๐5 (ืtoh‚ีaั Xฒา5ใ๋ 1œ๑B TDrJ๏žฝXพ|น+#้›.ฃ{ํ‰'žเย /l•๕^ฝz๑—ฟ)smy๗Ÿ|๒ษํส๐ŸwdZ์ษ'Ÿคฌฌ,g9N9ๅ”vex็๏พ๛.ว}~าา๒จRชX๘มA๐ฤ๏aฏฎiz2ตจไjลlR„diX฿๕฿@UแWt-๑Yุูฆบžd`ถ•ะ*rฎcแ๖ำmš[`ำXท ึn„ ตPณถ4BS ่›๛๑๗™+ฉซซฃผผผ]7•ลค–อŽ?y๒ไผid7ร‡งชชชM9~?x๐`V|ณบ๐ปฟรคu4€#F0iา$lฮ?ๆ˜cศๅ@“oเ.‰ ”ši๖:T)Q]์+ฏ๖…๖ธ‹มณฯŠ ๅใ7mช๙ภถํœ•๒]„RŠ๊๊๊ช7~ฌ”ฺเฌcแŸ๗@งE= ใoฏ6sั๑‹ัผi)า$ฮ๕›–ำNผฺื;Qฝ&!pฟ>๚ีGw0tŸฬฦ&%ƒแ^~บBdล!xI ฆ ฑ846ป฿เni„ว }!Rฆtฎม5WF๋มฏ^ฝzฑ~๚T๘ำO?Mqqqป๗yแวwกP(olย>๕ิSœwyจ9€ฬ๊ึh๐าt8๏WO€ฎ๋xใŒ5*•ๆI'”aดื=น๒หy์ฑวˆลbzAAมwZซ‹‚‚‚žทาฒึฮใX ฆLฬš๏“N:้–gžyฮ๔F=;ฝz๕*_ทnBฅTตกรหย)‡ฆต*ไQv=&นsฦž~฿Œ๕IซธมฒViจศ ๋%$=oอx‘ži2็6ณต&๗ง›ซฏฌูฝปถฮcซqฺกะฃ+ฌž์๚๑˜๒ะฏ~||บPค|๒9d๗ฝp8Bxใ ์ไ‹–ฯ™ลCii)GqDป2ฒๆฯŸฯ!Cฐ>]ถ]W(ˆ๋0r<ฬ_๊†?๑ฤผyFล฿ธ๒—ฟ”๑x\ฎ+=ญฉฉiCK ิู6Œญธแ†–wะA/%~๓Cq๊ชซPUUฦ>}๚์๋lญฟ็6ยถmt]ฟ๗9ชหฮZ[็|ขชีง`ฮ‚๊ฦK๕[=๖(฿‹ _UŒ?็TœžwRืโž •&‹_๙ยRZณ-^ฟ๙]v|ซ๒œ{ึ)ผนเธŒFB$ตฑ'/ใ}๗ษ๊=t"๔žฤร/ฆง|yP†Kr€น4'%๙ญ—ย wŒ๙Wดถmห%๛\Jษ AƒPJ1}๚๔Œถ์_GqG‘{Oศ|H!SฆLAะiฟฎ„€จ๓ž๕ ศO`Lฏ (ˆjhšฦเมƒScน๒+„`๎นš”๒;๏3+ฮ9uะA;OˆRฎ‰๘๚๋ฤ,฿0rไa|๘แ‡r{}Š•R\วฎ ˜๓ ้EบO์3mS„ษ๎s+Ÿึ+<สOO^)-`J ๋๏ ไล๓ฅปี2|๙Oiฺ^“p˜L๕ฌ”โลง๎ไœฃฬu:f:พ—`จช๋ๅฉ|9šฦ๚yทาปยUK“น{ผพ๑1< t12ศ ๛ัq B  ๓็ฯgฐฯgท-ณ6ื9ภฦy๖ูgู{๏ฝ34ค”’}๖ู‡AƒๅMง#2JJJ(5ณ๑Rmึ™ ตืECญรgรโ0hะ ,XะสฌOv+ฆ8Ž“้Y๔„0M“กCฃึ๘๑r็ฺ{์ซ`Mƒ%Koผzณ  ๋Eห—ฏุุ‘yษ๗฿?ผpแยz ๚๊ƒp๊ศฌพ2ญอใถ๚ฮฉ฿žn?ูŸ€kฦ ž}๎%ฦ1w๛ed๕๋Qช็„๔K›"น›๎”ฉ3;`rซ)ดVSg^ชoD้…n9 ้ธ ŸLนƒ๛๖=พY ฯ.๙h”kข๏ื๎ผ2ฟ€’8h<,^i`š๎'ัrMฏๅ ๗ฎๅ2ฟฝ๘ูqฒใuTฦ๔้ำ=z4[fA™มบ๒=?ฏ๊๑žงHZAย ฒ๒Hwเ๒๘็Ÿ>O<๑]t?ฐณŸl—๕ฯฏ#บnฌ฿ฐVำดQผ24วcฌ~rํุ\๗ €ฒฒะ+ื]gพำsู$r@)ทฏ๘ฬ3ขiๅJc|KK|ฒoฺo_`i$-ณpฝผ|ส๎“๙Uh๊!๛5ฃฏฏั๋@kM^`sS•MฟOY๖,รฏIจฒำE#่ฉ6&้l*๓พZศ๒ฅอ2eฅดwาkข?')Yฆฑ๎vjcะs4บ?*9๓uแํฎอs๗ธค๗ฬK๖*๔0d่Pๆฮ›ท์f9?ฉ๓๛ใท…|๗x๓ฺผ ๋์ฬGทฎ๒ษศพ'ซ%๘ยๆž†รแณLำ|นํw O.,ปŸz๏Er…๒š—ฌ๗0nล7,วŠBคงห“+นส^ส3ฅ™นปiC—๔9d แ๒wž*พ๙f๋๕I“tuวnฏ6fฉœ๑I9ฆคœH ึ\ˆ4ั”/nF๖P0ฅ4๏rfžฒŽทY†/,•๏ข‘iย O0sฺดŒBxIญใ5rเšํส%€Rn&]r(ยJ๑๔ไใ~แFฝํ2๗Hศ%๙i-็๕o5 š’~ฮg๐ล_ฐฯ>๛$ำW)โu”ดน๚็๘ูใ‘QSSC$แึซเบsาฯขบR๎ฑืฎyศkP]คLy๗งŸฟใj0M๓ฅH$r{ซ‚๎@ุŽอ€ุ|@๚‚"‚b‚bƒข’ล‘จ†๒i8…ี๛_6H๚ท›RVบpิQฃฆ๛f1:ดเถ‘Ž_#“5อ@S่Jม฿w[fBห W‹C๚กy๘IŸggู{ธฉ‘s๏aVžื/๖ˆ"Pฉ4฿}-pถS†J—K)Wc %3หฏึu.๚แšTฅ ฟLš]~โk(TฒัI A)็ใ/x๒รฤS>uฯ?9๗3xcj2_า}มํ–ๅhš–=ฯ˜หๅำ๎‘8iณ๏ฯืวฯ>?๋ฌณ่ึญ฿ผ “.๕ี{G๊ ฿ซ˜ณž1d’`ย% ?…ายฤD@๕่ัc‡ศI)yไ=ฟ8๐สUuŸ"ฃ ุ ฐฤ จ4DQ‰AaฉAQฉAa’๐ัBps)…ฎ ^ž๕‚๕ดg4Hล_:ฝ\{+P”โVFcึ_.โg7&ษ(eาgaา$hโพ`eFษr ฃ%วงe}8%ทีนฬhอ!น0S€…ไฌ#ฟุ2’๗x•Ÿž’แE๐ฬKฅiฌ™s ษsu2สฏงไ Ÿช๒ึ——nฦ‘ฎS”Wฮ๋฿ชสVูL•ฏลJŸฏ๚7ิฮpหKKK}๑r/\ษEา๖|ห๓yรyแฏฟ:šฆQฟ๎eไ'ะฟ’ ากบ๒‚U&แณฃงžญŸนพ}^}ึฏ_๏D"‘๓ชƒRา2cะ2gึ0๕‡– ้ปOE>’—–†(,qร J —่E.ูCaทฝql…ฎ &๋ๆMŽt\ข›ฆษ7฿ˆmP(ฒ‡๒<ย7เjmdณ๙tู•‚;๏„ž`ำ;™œัลwอŸคJ?hแ3{Sidว/žฯ5_ีุ–”4/OธwD}๏ๆฑื"ฉRJึŸ†Q|X:-ฯคU0k๎w๘๕ ๚ฃn?Hฝs˜๊ต๒}+ฌs์;๐ห้qYฺยฏ–M’ธ ฤ5ำ‹S&{R“D t"แจN8โjuอp3ึhำdึฟ•*cฏ^ฅ^vYรh!p‰™tq7T๒‰ไoF'' Mคงำฺ0ŸZUฎกม„†฿ฟ฿Žœศ={d>ใบะ๋Ž”mฆ€G~˜ซฮXŸWlถ )`ะx๘้yษข$_ ว–ุผVฎ„5k`ใทP…nส9|ไ ztq`ืiu” +พ;้ด:T่^w๚lQฏฐฐฉพ’ฆ{‰&›๑7็ภษWภ/~ GœžZำ4๘ื]้๚ษ.ฃฆมูcฯR ๕คฏ๙ร๎*9๗~ฝ{3z๔hHyy9อออิึึ2mฺ4–.]J]]]ช8p_xแะ-ฬญ|/ถ้พ*จ๊Vศโiw2bZy๔้#2x๓่๏}๗p๐~d<ใxฦ1าZ7ู h๊\‘๖ญOึc๊š—พtฏ…๚R"ร ฯ๕g„gๅซ=้Dา๏ ะ`iC”I3{ฑคฎฯŸFะผ{ฌํๆฯvP “ฑณKัยRƒpDK[4ูึ๛ไ IDATB2U4B)ำ<ึ ฬธGl๏/I๐f;#\)จ๎[.†ฎ๋L˜เ,ุ๊i6‹ด๖oUsพp|ื๒…ใพะSฆภoฎƒQ๛ฅใ‰ฌ๔rถูฒ}ฒ๒5ไ9!‘ปํสะ‡‡โฌณr๊$TมตcIuy„€ฺ8t=*Kแแ›x—้:„ฆต6๓ฯ*x2Rƒ‚พผคช.๋zF7Hewฆ X&ฏ้ยำหชX฿!”\้”๎โ๘vึ๓eไ๕#l๔ยh2–@6ล‘ฑg}ขR#UฉญตนHฅ]RBTŠhก๎š้Q)‰–$น›ณ‰žyŽ‚ ำYSJi&Kำถฑฏnใฮ๛]๓œ็>L-q๘่ฏ™มyืั‹ิ†˜= _@ถfhWFัจ<žรOป•SNษ#tฃข~>ถ5ฆ}c.„~=เ๗ืบๅ“[ถ–ำ๚๑œu\า—œ๕@Ž{r(ฦœํฝb*ฮVส๐OทB๋W@h€Xต๛ ค@Y6—ญชคQ ฿่บศ”—AJ74c<##žเฒ๎-ืีคL ูb๒hmS…a-9ุ่โ ะ“Z'špTGiฤ›mW›G4Œ๋šm[ณE’๐i๖ ๒'Myฅ ็^…™u|ษ%จพ}ษ ˆ“vrษ๛คhษๆC2ŽฆปZงgภeงไืฤƒ๕ทฬูแ^\๏ ร๔๒%œM๖\iต+ฃื M้yๆญœpB;ๅ๐4บ|ณ^ฐwลสอฐื `่๐ิ]ny.ธอ]ถ๚7CEi๋2Eแ”#ฒ๊#ป^ศ rฝ6นฬgฒำNิใ$๘ถถceœ๙ฟรณดฆ ซแp฿^ ดHๅHWใ6วyฃ!ฬsNEฆษ qVฺ/™v๋{ผxขี=ท”ิั7๊Fฆj1๙0ๆyฝ›&Aื ›Mยw4]ำŠvๅ’=๎`ฦ}๔–$้c–้๖ั{๔/J๛ทK)9fด.๛V)-chุ๛๕Ž5฿1Y๑ผBไT•8๗๒โภ‘Gย=†โB๘๑ั™I๚ลฆˆ๋ซ|ธ๏ye,Fษx™| z#ช*GZmสPB™ฎูoKฆฟ|GŸ{ วำบ|ป ฉ 2ซz๏แฟi๒ษ์7pๆฬ$4ฦOL‚ฝWช*เOฟ๖sห‹ƒาา็๙ฦ/๕yฝ๏e7พฉ4ณdlx+๗๓•pฅP[Ÿฃ๐.๘็จ ญ๋ฅBๅฤPถ†’ž 3K*)F†ๆฮตฯธๆO7KF.‹ภฯŒK๚DZQิํะ7'ถdLข‰ื ซS๑ทXHฉˆ5ู!อตFๅ€mKlSb&?หtlKbฎF.* ั๛&CYv๏ไg?3‡็จถ๖แMๅkฒฮฅูs… ธใ^บฬ'™•ž์V ๛ฒสjsลWไcญC2Šฦ JอŒั9แวทpไ‘mไ{;ก”๋2ผjผ๓t/†;ฎ…น๊ฬ€iฏM%เล''ข:œ•ฺํ๙{฿ฺ-๒๘ใแ์cาi•ยIฃhน๊Žสํฏ๋ฬ{&<ฯฟํ^?๛8xแา[6ๅฒไฒส—ฏTŽญกt่~Œปž!`ฺ“0j@d๘ปzžj บบz๐† พj-u๛ก”โ†นGŽ+ะKžB0็M jึลSืฅi+ื„ทถ)Se๎R!aZๆ์{พŠ่บฺ`š0ีฎFIG4\Bทตฌง๕s™๐:ญฟ}แ๗}/ฅ๔'w๏๔_\๗œ-nŽ2_/<ป?฿สขTค๚œ9e*9&ugMC#๋ๆ7C๗Iหˆ)ธ๘๗PVoผซเทฟ„ัC„(@๕ธ‘H<2j‚ๆๅทQฮRgไ?ซ!Mฯ\„=oฅK’2ž๚ืstฬ—ญฆโ„ฉ๙xผ2ฮ8"— 2ปH9๒่ฏฟm+วฮ—1c)๑๘๗C๐ร‘ฐฉบqฏUTTtฏซซุZ๚ฮร sผ๗ณษMฟิ4w ฎf]สๅ?\ำสยู*ะz7—imW9vขŒัWภ๔ไFBBˆoฎพ๚๊>๘เwn‡WวqXด๖+ํ‡wื_Iไ๒ฟฎ_แ(‡ž{ฝyซบ้;ฒ๐ฒหƒvHnlZฏjหฏโŸxBl^ท.rH,ึฒj[[Nถ‰Fฃ๛:Ž๓ฅR*ฺฝาํ_v๓vดI>ุ\sด)ำžิศูrู/Y๗lŒข็อฉ>พ['๎๚3ฅ fฝs‡๛E๖็'JHY0 „๊uk2_™2 … แ๋(/ุ:หQWYŠ๙;%cณ ]ŽMำšjkkห***พsไดขกe•ผซTbะฑP๒ำุฯ?/šVฌ(>คฑฑ๑๋ไ ฮ๖˜Gษํฆฟฦ9`Cญขฐฐ๐ง---OZ4o> ฃhML/o<อ–%แ‹็๗fสvนฬn0๒สจ8+ฉฑ„/\0๓ำฯ9ฌื‹ถŽ—SไศHง้ๅ#eQ” „o'†ิRQพ~;cูNษ€์งท๗้0|<3)wฺ+ร_7นุถdดE#c]ืหวiจจจ`wC.F=q"๏wxไฝƒะ4x๕U์/พ1MsFg๕uค”TUUUืีีฝใ8ฮ{๕„๗หกฉ;€”6๑™ํ*Ox6”ย ๗\•โฉง_d˜/าใ›t•ฏa๑หศ—O๛๕t๗ซOลV.+l!ุดเvz”๏๘๊,ซqป์w๐ื\๚M‚ฐwฐ _ํ–Cม;Ÿร‰—ป]8ฎH$พ1๙ญ^ฟ๛_ผ"‚ฺŽ&,เwฐ็ฬ)<นกกแ๏ส‡rมถmz๖์YU__ฐišgชไๆqcFภใ“ Wฺ}ฉ’ง9ฏทj0|J่ฬูt‹>{™Ÿœdบ ๗ๅ0STw/[>ฆ<อ†wฌ!zMH&•tธ‚žธƒsqvŒ, šงu&๔ฆ}{ภ’ื œตˆf{eไ,0eœp™ป4W๑ฌ”r|gฎํ*ด*ๅ๑วหพง’฿ก๋xBfฬภž>ฝ๐'Mฯo๏žํ฿ุถญํณฯ>ฅ555“š››/!9œh่0vL๚Œ„;แ‡Oํ๘๛็/$ไ61ณ3‘Geh6ฒNP๚C(‰‚ฟ=๖W.๎<.a€™€i เ๓/aส'๐ๅB๗;pYfŠLฦยแ๐ณRส'~๋_ฯผํถโ†aะ–ถ5MMำ๐=o?๗ํ#็๋‰๐๘7r๑ส•๐ไ“ฺoMำน%hw.‰กPำ4 ‡รฺ„ ขฟํo{‡รฮวW\AฅฎปD๓iZ๎๓์^SพG—"ฒOญม:o6ๅณฯ„œ2ล๘GEE๕/VญZีผ;œO wงธ‚ึrืขฎn3ฝ{W?xแ…ๆีUU[ฉฅ;ฑผ๐‚ถฑฎฎ์๒้ำงฟ6`ภ@ฺุ๊๘ŽฟJป7’‹_~z๊ฉโษแรทBuถ™ๆŽo tๆอƒW^ัž:tุEณfอŽํƒญ{ข๏B$ฟ>pศ5๗œs(lk>ฅ?ร)‘+W m๑b%Wญ2ึฌ]kO๎ืฏ฿+‡:l๓ฯฟธฮฒ,สสŠŸธ๑F๓ํ๑๐๎}ๆaฎYSx^}}ร๓มXฬ๎€่;RJ๚๕๋[๊8๋ๆ^~น[จฏG.]*ดฏฟ5ฑXษ็ซVีฟพื^{ฝ6z๔‘k๏q€ญั–UU๚าซฏv๖š|yZ้Rxํ5ํ^ฝ๖ป่‹/พุ˜ป/ข๏Dุถๆ(๒ถb๔่ัZ}ิฤ™gbดgฆ+ๅฮ#๛฿4-Z๙ฤ‰qร ฟ’ฆณ{„ž={–~๘บ๚!Cr_–-ผ๚ช>ฅOŸA|๑ลผuA_:D^@qเฯฎพฌ๔>„จฒW_rม‚่๕ฟ๘ลตLš๔›`ฤ;@€๏’59a๊ส+Q••๚g•••Mำl๏ึZ!ะ่v(”ดP่€ภ‘B ฌŒ๏ขุf(ว†š5ัภ๙tุญJ๏zZ—จl\Žj^+Q‘E2๐v๔๔uื mฯ[L๒]A0R`› —ž^ศขร—ฉ๚๗R;ผ+ฝ๘ั‚Bัๅ กi่E†Bˆt๊’w.ขุjจ‡\&0š1ส๗zQ\“] EEธ+ชe5X)ฏŸศ ŸึŸ lxดขนแกข›_9)xw‚JฐUP_ผ_๕(ลG๛ก…PJฺ8 T๓b๗ปZJก์ฤt ๛d๘ …& ัั๖š้Vรc๛๏แNFPม: %-0z\,JOศBD/2‘ŒalPv$6ฆ๖ข#ๅt Ÿ* ก๓์ู'ฅืุ*ๆd'{ahฑBi~ำ]ูRช_ข ฐใh๔†ะB`ožฉ” zนoG[ไ Ÿขl”Y+URS+jตีฃฌ_ŒHถ)ญžะfkFt—fฯB@๔[-๚ฌoz\ล์i๏ะ ฌฦฯQ๎ท”…ะ3,Fงk0Bง ยgบ+iYลูS=ภVA๕lŠˆ}*•^ "ไ๋gkš๓แ^ฅฌ๚‰H;นSdค8uŸRฤ^JŠจิ—TBNน๓Jดg z€ญ‚ฆ้’ุœษX฿‚(J๗ณ(ฝไ>ํ9วส‰ ๗๎kk๔ก‡Nฯ˜VCกโลใŸหF€Œ`0.ภึฃ์”3hžํ( Ÿ้žณcตJ9^฿ฝฏ’อOv…ฝ‡ ๗วoQญ้แN.ะ๎@ฃุztฟ^าฒ๔Jฌอ๖คOjฺ )=}aD>J™๘ž้žผG฿๋ฐ‰]œ=ม2ีฅr๎ะ…ส ยvP9RแVvธDูNLอ(ฟกˆ@ฃ๏|=ภ6A>lHซษoพ+Ÿ†๗knฏŸฝ็1ษw ขุ.ˆŠ“สPถT&<ว๎{zJ ฅP jLู…ณ‚Aธ]„€่ถ ๚ภ฿Kัํ์าฑyึเ\ึŸR ฌะทตLํ์ผ๏I๚่vœšฉุŸ]XซคQ้๖อ%าถ๑Ž•ๅ LณA9แ>eืิ6tv~๗4Dฐร ฅ,ฟ=dฅ0›หrาฒฅJ8ง_V;9ุgพsิz€)ฅT/๓Iน]<0eช[๋๗โ๋ห>ธฆ๔Šบ€ไ|฿!ฅŒฎnJ\ฑ"‘P๋MSญฑLU๓pƒZ6b™๚2๔eBZม๊ดฮDะฤุn(ฅˆา:!๏ B )hธ$BxXญD /ธ ผณ๓น'# z€Mกชz%ึU๓}๕1$5๗U8ฑk๕๏Nฬ฿€่ถJฉhรS 'ี%ำำŸŒ@ฑฆฑแ‘.|๒qQา–ม๛ึI*>ภvม3_&&h%BBษGฆปฆ AWCG฿+ฌ๏๋k~ฺฉ™ƒ=ภ๖BSRU‡๚…JE(iถ;Šฒ, !ฅบNWร ๙ะ๐cา ๅ:ัl”Rั%‰ฤ5zก ๎nBAล4 a)Wซ๋:ฅQ#ฦไ ม \' z€m†t7n-w—˜ฃ"€ปุE(‘3NQ๒f แ[P 4ู๛๓dงfzE@๔#‘= uM“5Trgg…B%ึ*‹ุ๔ๆC›้~๒ZบON…~’ vvๅ\`l3ค”…Kkใ—? DQ๒ก‰ดๆื&อำš‰อan2q,ถq,ำˆ5ฺxณ7/}ป/๏Lํวฦใ ะ…D%‡‚=-๏4:๊ฤ"๎ึFด ฅ”ึฒฦXWชฟง้ี&š^kB6คืšƒ 1@ใใ™]ฑฅt็ษฝ_ฅRsๆf๊šย4@hS1ฟ‰๊)๕๔œบ…๓ž,4#ะ?;ัด ฅT๘›ีฑ๛ŠชCW[k์:ืAฦษŒ็M™ญ(_พxY๊จŸ€ฺ่ƒถnqlด† Eสิzs€Eซ{ะpzคMว)ƒoญแŒK9ท็"Nต„}ŸูŒั$qB๎œ"ีœ๙๒—?ตEดฺ„R*ผๆ5Ÿ่?/๒ํHƒ:ว!‘์O{&ธพศๆ lยฮ๋ใฺ5๕+$›–2มบƒ X1ถ˜e โ/่ ะ;ป๘ป ขhา‘ๅ๋/X_Gjz 6บุLƒิ`›ฉ–€}.Lล อํ’=;^ฺ“™sz ‹Zปตๆsy๕‡e^๓o$ šิย๚Qxว”nฯD@๔ญ`ญฑ&f†ช๗^Gัอญ`?dต IDATพŸ–๚่ฃ๓ม๒~ผฟธ/‰^"‹บm๏›๏šw๙รŸi'uA@๔6PRRrm$™t๚้งWY–ีููู%ฆD$ฤ%Šึ*ฏฉฃฯฑ›Pษ-žIN“e’^a— ฌ?ฏื์ร๒kสัhํณ-๏?ึšดหำi7@วฝ 466>๐์ณฯNx๏ฝื๏?๛์ฐณิ7|๘๐jำ41Mณณณธรก4p(ˆ”œ8๒™อe๋(œmฆอx‘๊๑^ุ0ึnผดv/ฝ+R๊๎Jวฬ๛Œ}฿•ฆ}pๅม๛บใ:ฅ……ั{ฮ8#๑8mร๘่#ฝa๑bŸGuิ]๗฿ภบAƒ๖Gำพ฿๏โผn:XR87Tน‘ty2ŽI†ศ๎‚Y๓บa้ษ=แr์๚๊๗„ณqงๆT|ฺฤเ‡ืำ๋ํอ˜2<ผ?,ก%๘ฅๅ/:กZพ๗ˆพ•RRRR๔ŸGrˆhJฎCm-r๚tb฿|S๘bืฎ='3๚๋G๙3†atv–ท sW7พกuัO’1EดJR›ฏ'แ๗u๗ešฬ~ซ หภ$rขทฺ๒9ylKEBs ฝฦขhmŒ๒๙M„kLยM Z tbBฌRสฆ>…๒หก๛้ฦ๗ผ1ํ D฿FH)้ึญ๋้ƒี=wย *,ฅkม*š0}บ[ฒ$๔jAAๅ]๓Ÿฟ:๙ไSไwYใKG๑EKL‰dTPา}ข9w|…สะพf7ลฬ—ปSฟฏัš่~mO๎=฿ณ}เe†,wฅ๋/ืŠขหฦ๎น5ฑ๛! ๚vยq๚๔้3ฌผ|๛ใฦฉRฅ2บฌx็๑8r๚t์eหŠ•ฒhโธqใg฿w฿}฿)/ฅโห– Rไ+=vฦ,3ง)Ÿk+(…d๕OŠ๘ฮฎฤ‹–’™s๏ดฑํณฏQศยKiZ™?zhเ<ณ•ˆพƒ`6ี=zศฯ.บศ้ฉi™„๗เ_J˜6Mศ… ฃSš›๕ป>xฦิ8ฐS5็‹๋ฯคO่%T’่)R*ดiqบpSช—.y^วJุฌ;ฑ9ฟ๎Fอ Žฅu๋IทืŒ ‹๐้ฏดบŸxB`*ลข„‘ซrไEP[;J)๚๔้Sฏ๘๒หยแ„OวO_ฮœ _~‹E๎พ๊ช+'ๆ7w …vY„ๆhokดŠœjS‡~รพ%ผฤI”ท7€ๆเ ฃณ‘|ษ|–‰ฏ˜?,NMw‡P—.D๛๕ฃ๔ฐร(8๐ภด้žิ่๎‡ž๐–พ! าฟ๛ŠศY—wสรqํฌณฮ oธqะฬ™3‹u]7***šŽ<๒ศ5/ฝ๔า)%บพ็xฺD฿‰8๔ะCยK—ฮ{๋าKฃKK&|6ค„9s„ไ“๐ฬบ:y฿—_ฮ{qเภAR์$M&ษ"}‘€นนV$ซ์3ตลb‹ฐฉี.1_“ILb SZษ๒สเ-WI Pช`|ีล )‰ำ’@ฤ,"5ฎ/ฝ…ยA’ˆ$~sSโฆŒgl&žข”บEJyx2=อ//KฆBฌ*))นoฦŒ;pเ@น+ี]๏๎ศะn€ฯ>›k648c<๐QcํฺTWณ]h ฎดซฎJŒบ๙f๋น'Ÿ฿9็แt๏š[TTtแeY;์๙Yห-M $ย•+a•ำzy๒/1ะเ“šj–ฃ’L7˜ล,F3šฑŒๅ}๑>|0ฯ?< 8Žƒ”วqRวRJlfแย…\sอ54ฺ[xtํ}|๑Oxpี]ึ€ƒ†ํ—drณด{GUจiฺ\ร0”mฏK)G{์ฑฺ3ฯ<ฃญXฑวqฐmหฒp‡ฺฺZ{๏=.ฝ๔RMJูฟพพมƒ;‘Hคฎชชj˜”ป็†”F฿Iˆว๕ฺJ) ร@ืuึญ[ซํตื^“ฮ>พyท-]๑bมิฉฦW7:๗tะฟอ™3วvg›4ำBXกRŸ-@์ฟ+hบฒ8cตZฎั๒’7cDฮ›ล8ฦ!‘”••๑{๏1lุฐ”ถnK‹๛ใ(ฅฐ,‹;๎ธƒ฿๎w(ฅฤ “ฤฦ๖ฌ๙X๑cE‹›/VJ๕Bp๕ื3qโD Reส'รŸฅO=๕—^zฉ็eจฏฏŸ๗](^์1DOOะuร0คeY,^ผP3Mำธ๏พั>๘เCmอš5`šB๋฿ฟ_yIIIy$ฎิ4ญrึฌO 5โโโยŠฒฒ’ย๚๚บBหJT AนฆQ)ๅัจf ฃจH jแp˜ฐm[FAF4ŠQP ้ัชชถฟ\๑•‚ฏฟFNชฏฉญ ง๋กฟึีี5(ฅ:ิฯšฏZXƒผy๒”WZOต {b“9*๎  9ภ„รgราฅ”——ณdษบvํบU๗เ๋]ป๛๎ปนๅ–[๘%ฟคฝH^ใ5ฆiำxแ…8ใŒ3๒ฆ๏7฿|ร!‡Bcc#BˆUีีี๛ฌ_ฟฦG๓ยnO๔h4zฑeY๗wœ*๏ีKi‘D"HMSZ(”๎?็)๗~=RๅCg{yVฎ|๐ถqๅJ็พ๎{u๕๊ี5Jฉlฏ 4ํ+ๆ'@dtาฮ1ŠURwN๋—ิๆMg(ฅx๕ีW9๕ิS$v๖yพธูฟถm3`ภVฎ\ษ`sabrCโ รศ่ƒoซ =๏ผ๓'žx"บu;dำฆMŸo๓๙Ž`ท':ธฮ-‹-า~๘ร“\ฟ~ี}cวr๔๐แJ]=Ž้:ฌ^|}aฎY๚ฃ”}๚ฐ~z€ €nKWฐG=ŽใฐlูRm่ะCฎ๊=qำqวฉž๚)อถ;_#๏ (๕ู;๏0+ชณฮฬญwYXค7AzSECฤ‚ุ[{Fh๔3ัDฃFSŒ-%&‚ุ, Mคื…]ถ6sพ?ฮฬ3s๏6@Eณ๏๓;3งฝงฝๅผงA8 +Vภ๋ฏ“ุ๊aโฌzฯธN}zb”.C$‚ฺ๋๑-{฿ศ๘ฦ๑tํฺ•+Vdรคง๎Vทฆ๒ญทbย„ ”Pฬรฏพรฤ{‹ล0MณYษz9&L˜ภ[oฝ…išg&“ษฟ|WวํบeHงำฦุฑczอ™๓๑ใฦqพ๛J#๒?tฬmC(kืย;๏› ๛๘~bAUพตํ }ƒจจจ`ใฦ9c^šฃ7ฏ)pรพ๗{Œ;–๒C๘๔ๅ”••Fฝ E;‡}ภ๐๒ห/๒ฬ~ ะษd๘๒ห%ฦ่ั{SPP{ำ๛‹>ƒI#nH{)ีฯ4ี “†šZุฐ๊ถยฦฐ~ฝZ_S๛c๚๕๋C๗Aƒ่Xู‰N]ปP4งˆยc7๙Vย f0–PำcA‚สๆก้๑ฐ๋ŸOš6EŒ๙p<๔ะCœvฺi๖ทฟๅ๔ำOงธธ˜p8ผCq่R~ื]weษ’%๔๏฿?ผpแย๏œ๎;ะuฟ]ศd2 4ฐหโล‹/:”K>Xช]k_แปฤ*„๚…BŠhSIุZง$oอุT ๋ึAizVA‡0 ์ึ vฉ€สJุฅ"!ฐ%คฅาNฅac ,[ำ›’>อZ…ะ6ข@ๅ•หU‡?๓xืุดiๅๅๅ@“‹Qš%4ถ}iF‹ใ็ €}๖ู‡w฿}—ๅห—ำกCbฑBˆญ๎ญลก‡qงIฅ” หฒโ฿ตUuํ„Hงำฬ™3ว˜4iาแp&ˆQ#GJร]cแ๖๒ญฟ†๚ถ,จญ…๊Mฐ~46@๕F›ะฏ+t*…`pู่สJ ฌ LตkTุ๘o8ถq็.CฝUฅG{Zaๅ๘t1 ซkCๅ— 'rQ†’=ฒgf/ฎป๎:ฎฝ๖ฺœบiJrซฒ+๗ทz‹“O>™•+Wz~†apุa‡๑๘ใ‰Dšิ๒แฐm›P(DUU_|๑………†แ…illd๊ิฉ<๙ไ“lผ™X,ฦจQฃธ็ž{8p`ซp่ๅ๘๊ซฏ่ป7กP่ฒL&s{‹f'‚vB฿HงำLœธ_ูป๏พ{Vฯž๖Mๅๅ„6n„-[ V8cA‡Rุo œzŒ U…€ํPอVไ1—0มGฤ€ธั\"๕}kD/ศ~lm€/Wรœ๙๐๙g•ด๏\2ื—#E๎% ))9ฆ[7R ่Gjตdนv๊๋๋้ิฉ อ๏.=๓ฬ3น๏พ๛rโ7‡ใ7`โฤ‰ฬŸ?Ÿ~๚ …ฐm›#F๐ษ'Ÿ4‰+‰ฐpแBz๔่ัช)@P?~x~๛ml;๓–ใ ดzAJษ]wบ้ฆ›๖[ทnM†aŒฒm;Šธ:w€c„sŽƒพ ไŽๆ\‚ำ้ภญ|nyฅิผƒแ‚-™!8ฑ`k=,^ ณ?ƒน กร‚ร9e๋‘\ะ”๐ฏ€[ฟr%'ฤ‹/พศ๘รfj'ชซซ้ะกCซร2„y๓ๆตษx‹ล(,,d๚๕X–EAAญ]ส๚ิSOqิQGต—ซE˜ฆyปeY—ต*โNํ„ ฐ,หุ่ฑใn‰Dโฆ†††รg`์ธ๔t8โ`4fวีฅ?้|ฅnV฿VNปR]๗vU๏`&โธ้้ธh–u ฐt•’่sมŠuฐข_pภ๊ำh˜ั™ฤaOu๑่ัฌZผุ#žๆVกฉผdี฿p8์๎&k5L:•[oฝตี8ฆOŸฮ!‡B2™$‹ๅh-มŠ+่ึญ[ณ8tทI“&๑ฺkฏู้tฺฎLท}7r๙ C:f๋ึญF=Žฏซซปห4อ P„3f0\qพะ rIภศ/œ…๖”ศ>โีผคCุ.ธ๋“์:“Pธ‡[ฯfเ3 ˆEกคสŠกฆ^๊s+“&ŸBผปษบOป`‚U‹sูe—ๅงึŸA๗K/ฝดI"๏ัฃฟ๏‰h๓˜Bjkkน๐ย น้ฆ›|sใอแ>๐ภBPYYู*"?๘ใ9ํดำ0M)%Ÿ}๖]ปvmU๙„<๖ุcTUU]ปv๘ E„;ˆโb๓ฅ]wzย์ูs6~ื,‰;‰‘H„X,vN:”ฒ dยฅ?…ซ~Eฆ฿า.5)”บžU>ŸZ๘$ฒฎ ธะZจ“[B"ถภ’0K%ืoV*ภตGp๊7#€OYมžŸL:nำi8ฎ•:Ÿ ว?‘^ฝz59ฯ-ฅค[ทn >ผUx ภขE‹š ;fฬฎป๎บผฬ`โฤ‰พ 1-แ3M“x„ญoย้)ฒฤฅตf-ยฤ @V๚ๆW๚ -์ŸžŽgq8?ฏI?n฿ป›ฆศ~๋Lภe"Aฮ`:ช{E tญ‚] O่Q]*กจr=Wฐ+o‹7้฿ฟฟoฺJ'H•™C<ฮqLš4ษูๆฦำŸ๎xะญ)๚๗ภ‚0๏Yุ_&Lศมกรๆอ›๓โp!o๊ิฉ๖นsฟฆwฃถ6{Ÿ‹ม 'd*/บจ๚™๛๎•๎ุ1๒Qฯž=zดี ฒ3B&“กดดt?ำ4kfอšต)'{ ิผฏ$๗…G@FSf\"ึม#hMฒJฟแK”ิ:Žs.๘%ผ6Xห…fิ“Z>ด1ถ›†$ฉใัŸz฿vฟ#a()„ชr่ั๚t…พกwW๕ฝdคอฤ‰ต:พNฏ?uBศ'อ/ฟr฿wSใ๏ฆƒ8t๗‚‚^y†v…ฯž๋C๘็PS„9eส๎ป๏พผฺ‰nh โศ‡sฟ๖0FŒั/oๆw206lMrคฮ1.บศ๑“Ÿ,๊๐รCVqqไฯC‡-๚ฎฝeY„BกKยแฐUSS๓Zq,y๕!ฐ>€วo„ว4!$4t๘%ณค7dญๆš~žำ=5Iฌวrาr“pร=Bp๒‰ว๒ฯท†g™Gษํโัlžฟnำ!O~…PR=า"จช€๎‘๗๋ฎ~}ปฉฐ๛๎ปoณาฮ‡ส!„ฎ]ป๚‹‹‹}s๐A•ธฉ_s8๔ด9ํwๆj ึ†cวมึท ๆ=?ž{๎9:่ .พ๘b2™Œ‡'ุะา๔ž›ท>}๚ŒiพFv0ึญ“อ๊ๆn็}wi\zi๊ŒฃŽ๚d๋่ักFร0ฮ˜1ใ’ษไ7•ื6ƒ”’‚‚‚[Mำด2™ฬƒ๛Jc๓ปฐๅuุo`–XฒใlAYaœ'ศด๗DJาิ}x]B8ฦ8m,Ÿุƒ๊7Cิๆ!8ุฃ๘ำ3eŠašz.ณนn ๔ฦ๙๊-]ฬˆc}/„ส2ฅส๗E๙ฎ=Tธ:ไจีอฃ”’x<๎#–!C†4i|ำต๗ืซW/ฎ|8‚ci!7ๅึ(f๚Ÿิะ์บ `ษ’%~๘แœ~๚้คำi_G0มaฦ๒ๅหs#๎„`lุภ๚ึvีฦ#ސฑซฏถาKสฝฃซโ๑๘๎;“Qย™ฟฝD!ฆNุ#=ๆ=ฅ๎!QB๖[Q [rเ170oiVM๗ฌ้d;OฮSfฟ๕x>š~ํ๖u่hชณž}มe,Zํิษฝ๔ศบ{—บaต่ำrnฟM‡ะhxež’์EEฐัpฤฅะต“Z~ PRRโซฆ–Ž๊BN<๑Dฯ฿ตh7?ƒnUทู๔Rษf๊J€iรตงƒ๕ืPฝi#Gy$SฆL!‘Hไเpำื฿…3ถm—ถX˜Œอ›ร[ถ…F…Pใฬ3้rลณ?^ศยยะ3C†์V๖mฉ๖ฮ”ฮB™Nง๏=Rมk๗€้ž์JSbo„pจวฐm:พ”ดศOฃ?๓… †']_†*|SH›5ฉ)4ด๘๎So7Oฒ‡บ๐๎สฃจOk้นูะ่ห6เ ็ีษ{)5คซิ๗a๛ฉต๕•ๅ*ŠkXห'‰๕๗ ณ่ก‡ผ0_~๙ฅฏš‹WUUๅrฺ\ุ`zEฅดบฎ~r dfร]Wม‚ (((เิSOmา่ง!mสษะN†a,ž„P๛™„Ÿ…ฮผญT{ฐ;•—๒๗็{zMฅC3~98ค[Jภฮ€ฮPB๕ฬ๑ใ๖d~๖L_œ €๗แ-ลุ‡ณ9r[S~›€๔kี๓Œ#`๕jฐB๐๔หสmฬ ฅฮวใ*ปK—.uส”+‰ƒา.H˜‹/กทFš›ฆษจQฃZCฯ—”’=uา\]นpม`gyไ ร`ฺดi9ณ ๙†/K›-ะNF"‘๙pG%ๆŽ็'M’ฦิฉ‰›~๙KS\ธฆSงNX–๕ตLC8†˜K็ฮk ่าP*”„๔0Ÿณขฬ๑‘nฮ8า >;ฐŸ|่กjEฝžŽื‡Oฯ„ูAiภะ}๙๛ด>~Jp๗ำ๊๕'ฮชš:x๖๕>ะแ-ต ช ;–ร‡~ุ,‘ตปwวถm’ษคท]O/‰ฐ๛ณ๏พ๛6)ญ[‚E‹!ฅdQดพฎ๔๖p^ขภW… +Wฌ  ๑ๆ›ozx|ฟ๐ย ๖๙๓—ท*ƒ฿2ˆยยย—_^ั7LJ%-fฮ™™3ร์ูณ๏s็ฮKด๕๒ฦฦFz๔่1jร† sๆ<#{h4Ž๎ƒต†vฟsž]opฺ‘ZจKึWoขS๒[ถบ+™‚,ใtFฉ‰ ย ณ๊jยณ๐:-ด(ฒ๋ Z%R|๐๊ี์1 ›ืุXHeเษ[ี๗‡ เ–ฟร๑ภQ๛ซp]ซ`์ธoœ{-9‡Ex8D๎๑ๆฆล๒Yฏu|iดวcz๐A2ณณฺRณuฅ๙9มณ*(;Fฟ)j;๏ไษ“™>}บ—Ÿqใฦ1sๆฬo|ปชm์u๑๎‘U๋ื\j†Œ“€E‘โ>๙หgำš[ยn๔๊ีs้ื!ัs •ญ์ฝ๗–กŸฯฺุถMii้6l˜ำฅค?„QฮธL'๋ ์=eเM•Q5ลๅHOำน€N•Y_ณ#pเMฟy๎ตN&ฒใIgอ๊าUY|ฝ—,NOPนšˆ)ุ’๚่กž=ฯŽ)"๏Tฎl+Rย๏k~ไ์@•ภสต๊$ตเŒื_=‡8๓วt‹xS›BงnpkjE\kq<๚่ฃ ์ญ Vื•๓็ถฎ Jภฐaษฟแ๗ฟ‚3fPYY้ฉ๒3gฮค  เลo’ศฅ”t?ฑ[ต [“ลEEฟ)ˆ )ˆ์gึ๓ฯ์o๕=ตื ฆโ'Nฬ|#3cI`k๖Su<าัGหขK/๚ุK/juํ^F5ทึ0Œ—RฉิU'L•ฯƒiฦ ๘ฟ=mุ‘ถ,ณŒลฝธภkx7…L†น‹wM๔…YŽซ›gมไ฿ธ1O๙Dvl้uP „{"…p๒๏Ž๛%ฦํษWTœ฿]ฅqษ‰ู6H$ี3“ัˆภแ8EN?>๙ไ“ตrไn฿ บ็ฐM-om-Ž๕๋ื“ษdx๐ึ6ิ•๓:Cบ;i\t,~Qํญ‡รฬ;€P(t6฿ุถMฏSบอ-.,็บIk „‡?๋pLูa๙โ;vf ใ&*Sต~gแpิŠ 8๏<๚]uU๒ณcศขขศฃ:u*ัๆ+B|L๚๓ ๐่ตd-พ๑Iี •[บ/ †iซ,เžT1 6ฎ๘ฺZPืMrย;าŸ gœํึฺำEเJ(71Y0้ธnu:‚m๓า;ๅHเއ”WgจณพZ='๏•[Ÿ Iๅv๗ตฐz๕j’ษคะthj๊-ธF๗ † ฆีRJ;L๕ํั}ฺPW.ณลบQUoธพะ8Gๅaไศ‘!์๊๊๊e| ฅควษ]f … ฬฦ๘œ?แุy:–vwีัU‚iื^{]WG๋Žใุp‡‚bืมฒ`ฤธ์ฒิ‰็Ÿฟพfฏฝ ‰D/‰Fฃณฅ”ƒฆ~z9ๅ}j ่๕wc4๗้c‘ฎ่ี—=ื\นฆญ๐๖ใผKBS6ณ‰ปy‚*ํฺ&ทjAฒ ื้ิูฑ›‡Aฃ&"%ฌจโุNงuถ zศ8 แณล๊y๎แสi๘๑ูlฎฉฑv6๏~ ฿Tœๆๆ้๓๙%“Ifอšลี็แฃฺ๋Jwพuฆ๊}“e่1ฉึฯ‡LR๛๗/ศ)่ืฝNํ~GeeูกˆA("… ยQƒP8{ฮŸาVTaKKŠV †eYFuunร4 ย\Bw+~kSธฤr๐ม0`@๒Žt:ฝ๛cwภไŽฟึ+จ๛žํ็^cน„่ฅญว—€ˆzœQ8ญ์Zฅ”ฤย้€ร‡p‡—ฎ–ฐDาป‹–Ž๐ง“3|0+uUฮ‹$% ถ+ฒXล๏X–Mว%๔.ณ €ซ._๋”ษ†.„ูณgณn:ญ4ึPฯ[R[๓ร† เบŸ:๕ำฺบายyา^๓ >ร†คSgK—.ญoi๖Bลัฅ'WV_Žxฟจ๖‹ธfทอMำ ๛ษ]ิำ1,หฒืฌm#]%•ฒฬ\บˆkลa๑b๘ไธ|8ฮ‘:M’สฌ„uAฎ1F:\ภงŽษlืM`i๙“ืฒS‡ฟtA‚ˆ๕pธ†?w| ฐไห๊"c“น8< ฒ›–W@wฌ^Z\ส–-สmมx„PSง ใ1 IDAT‚ฆาน หถ๑ฎ:Mน๕์ูณY•:Ÿญ9iิบ๗ ไร1{๖l-Zฤ3w)๔๊ธฅบารiแพD๐้ห$ๆจ๏๛o๚บ–9sเจŽฅŽฤLBGŸN๔ฑKภ0ๅลฅง.^5,ถmS_ฎks.JP„Z‚ื*ฺƒtเ;<๒ ๋WŸžu“Nzž๑K๛šป/ผK”n6d๖‰C’•เตธK$„B ๋ป847—กศ‚aYยK— Wฆ+/€‡@บx) ๑(๕Ux็ฬWฏƒ๛fURหฮ•vบV’สd=–ฝฉTŠ)Sฆ๘คj[${[$~s82™ {๎น']:ยแ{๙๓฿r]iaถะสภำุ‚ำUํฃพ˜Rส ร0๎ัฤพโhŸโpfNYวกˆ"์Hิ$5inzDr~.eา3,˜8u฿;๔ €ๅหำอŒš›BTโ.ม7w0V‰พึhF…w ๙๘1mผค@“ๆ๙คดะ// ฤ;_x,\—)๋6ฌงc้vโyยšลZ<้@‰4 Ž™ด9+๔2juแ&/#=QdตถUาตฮ”Yว2ฃŽ1H ๘li6l๗2ธๅR˜6m๓Ÿ•{†5งK๖|’ฟ)- )ใ@QQBภ๒ฒ]ชีuฅป๋า_c^\ิ๔๏gRสณ wภ%ุ 6>WุฏS๗^K^=ุ"R"จ๋"Gิx=^ณ3’าโขKƒcŒX,F]ฝl›’Iv์ Jo‰เ’P้นม-‚T ๏ t7zWฮใ๎ถจ$7ž๗๎„๑aš๔pฆnศJื็ž|Bๅa{p+ูฅLg%8ย‰ฃ$๒|Š…rz๏2O™ใร~ฮ<ผ๋ฟnใชฝ-ษJ0้| ญƒ๋Dฑlฅ๗ิเ‡{รูgŸอฟoŸไลญ3ศq๚๋ašš^หงH))//'™Lฒแญฌส๎‹R]iแผบฟฆาm'็]d๐๗ขahllbGH๕ oฺซฌ๓€EF4Bฝ"1Gแจ™Uฝ๑นฉป2า g%e:m‰†zมภเH๔ŠŠฮ~sนขถ9‚wYช7€"๏XัGีฑFซฒ๑๔ำW<"rฝ…ŸƒCถat7c ญมข=|ขฺ'aLƒcธถี8คiไมกN‚ ขแ’ู4$-›Cฦ|์ฉ‰"‘ลฃซื๑<:ย™`๖ง„œLุ<น gtข›๏Œkผี๐ฮ๘ŒGqทr‹^ฒ&%ตJณ้๑xs’Nงำ˜ฆIMM ห_ฑ€ไmm]eซว'ษ= Hkgoไpsญ๚H˜๕H)หยแ๐vBQJ๗ซ* อwXB&nˆ:Dฌซ๋YiŽ ว /… L็ฉส"Xฒ๑&p}ลŠuKถ'ƒแg™nMบ*ฝพเ-ŸDwร:เ์`ณฦ๐ESั_™บj™ฎž้่<ต"์*ฝZึ”dฟžป)ต‡0ส˜ต๚h๊3šT‘*G’ปZzื&ฝ๐ไE๙ ผ{฿nžBๅŽิZX๕-‘l๘๒M*œmๅ —;๙kL๚%:๘‰รึ˜ฒหๆ<?:ฎผ๒JFŒัข๔nn๚-฿<บ๎'ฅdฮœ9D"ค”TฟKผ,ๅญŸf๋J๚R๏W9 ูmCM-Z ํ1ฐm{zN%ด.y ปคฯดYrฃฬdฉ ุ6๏l O=ื-ํ3ฌิv3l(beL%,bฑ่‰+ฃ}๘๐aŸ77i'ทvZs%ผฦ!st)‡ะฅ„ฟ]๓ๅ๎@ำU*ศช[๚Oh๎z๒าแ๒n>=•Udี2‰ๅ ิญฺฐ‰3_ในด G|({ŽNmมElM9้‹lำไ่R๔๎ฅVฎำส*•ิถฝฤ ี|บงAiๅ๘็๐฿มผy๓0 รทLถ9ห|kT}๗ถmฦว๎ป๏Nวrฐ?‚ฒˆVZŸkU]สแ…uะํš›/Žๆ๏ถซฟlฎhํ 1–mƒ/้๑ห๗ฟ)‹ †๗šภnLa5$ฑ“iถ ำGไYี๔แก Œภ S ค “ฒ)ˆHว(ษ'Ÿnก„ษ๖ทฦsj]๓ืฟpiตำถแๆK้๋โ[‹โค๎ฎฟkฬ!ˆ_ภ,r8ณ๔$,ห๏ฤ”-เ Kฅ †’.•X-‚ญํ>๓Iห๘ฐฌ‡`šwืญœsTm~ $฿ปซ-hR\?ึ}>่G`xๅ6ฯ!\)มpl,fSํ/`ษJ-๏๘หqยจ›ๅล๊l๔าาR๏่ไๆฟ฿๓ฉ๑gœqฆi๒ฮ;๏๐ป_ภบAXผดนฎ๒—Cwำ‡?z8t==‡์ฅ งาdฌ ™L†๒ฃK&๕:ฅ๛ฬ ืŽฐ*Jส~ใJใFa๐รืL๕ฅลรKก ข79tแเLGŠ›ฆ๚ฆ"xW}7Lษ1ทT0 ฃvภึั"ฒซt5^'ๆf:ฐvณ๚< แ—ๆ> r\\๙ฆFdงใt5-พ ฮXV ๎{ลkูgH+pˆ์quภbพ/ฐฯ=:ด+ใFwๅำsโ?Cคฒqล`P ๕ืVobแ๛เ์ฃ4 ^ ท^ฅR‘ธ;ํt&' ’Žž‡๊„_€9Ÿใ1ต๎Uฐlตฺžส๘›วล‘Jk๘ดŠumlzf~OสฐaรBp๖ูgs๛ํทF๓Zฮƒห\-หโw฿ๅิSOeูฒeผ/<๗ฟัM๏.3ou]IMซ ”#XwคฒC/ญy~–๊iหบ๘?Pง†aŒ:Xมฆฺ๊;v๛ษฎง†รแHUY{xฬ'๛T u•:าฌฒ‹ต.’Uหm „ฐ‘lKbeCpฅนiาฎ–ฎ_ผป˜3gVไน็ฦ$=cD 5ฎ6๒‚,.’WฝๅญA^~fพญNhmฒ’]‚อ—•ผŽอdทรiˆh_๕.%kชทPปไtหฆีŽ›†L…าD๔)ดT jjิดึŠฐbน:Nบดv4ˆฝ๖่ฦ๚%๏r๙[)-…Bงq‚7ฌ6y'%‡Bแ9•ภ}w฿ฬูG$Tฑ!ดงชว'ฺ๋sเž'แฦsกฯNŽƒโจ4#๕uœo„c.†Oบjพ ฌฌŒ]w•}๗—สสJ ฉฉฉaแย…ผ๑ฦฌ\นา;ฬ!†_ Wžฎง4Ymi๋6๖‹mSฎ…Gžวถm;ผY}FX–็x,:Jรง‡(*uT`ญฟdŸŠhห;E‘ขqำY๒ชด’ค“6ฉคEฒั"ู`‘pŸ ‰† ‰ †’Š0uษ-ฟW QJ.ปLX%%๘๗I %์ƒ•”oL็2}๐“ODไวoฺ‹๐มgy0Oำt้โrdg–ข‡ีณ"wนP๓ึ๛ห_9e๒2"ม‡-เ 8N<ฑyยt…—Fลชซaๅ XฝVญiAq์3†ฝCฏฎ๊”ึจ {G: v๙ˆBฏnคƒ์ฑวล >๑ FŸ -€วoVg$Rp๊50|W๘ีOuฃรเ]aPO}ๆ+ชO3`}-๚WuLีšj/ƒ;ฦu๋ฒผฤ`๐ภ๎ ํต…หNฉกOUV๊6‡ร+W }ผบ๘๎‹ฯ—^ซq+—๔ฒฺnyฉ„'WvฦŒ˜c์Uhณด!;-TtŽeำึคนว „#ฅ"ุ6ฤโ&‘˜ฒบd2’tย"ูh“lฬ8ฤญyฝbVF/ QXz=L&-[„QR ^ZŠุ๔า5ฎŠ•SZ 2สŠT๚ปcdOUำ8€ซฒๆ]ญฆ;:ภๆ๚ž}โŸLู๛K~zP‰ึ67INsSฉ๙˜€”CU•๚ึ]จ7เต/ก๑sXฟ^i+Wยฦ L@๗ฎฑฯž9บฃvb—.ๅผ๛ฺtŽ๛ม'J3ำฺโ†‹แะsaฦ{pะwฌ๛sๅgDn}-Z{jEo†Bผi,ชŠแŽKเ๖‹ต๔Œ์;VnดูฅำWj๚OดG0Lพฐยw๛N›pไ "%ค…เ +นwnฆPซใล*๕ร2Lุ่`'<ฐฬเั5q@rวะฎDืธCฅชฑ•:Vsๅ†ฉ*ึส „!œŸชWตฯ?[V+cƒ ‡—D๎ตญƒ$ู้ฐ › T–ฏ–Zก>ฝ๓ผ;j^ฯ“~Slต *™ฎ (ถKหๆ‰ึเ0`๐IpqญฯหŽw๖ภฝƒ`๋VXตJ ฆ฿ฆvHคs„บฅๅแTงผ๚O๐ล2x๐:ˆว๔„ณ’ื–plSWฃTๆqoชษ๒5ํN‡ร0`~Mœ{ๆua๖ฦ"bฆห‡๓์‘<>DศหยNคฑ๋๔I)P\ž;uืQdwชไย“โ๒0ฉคMผะ$V`+  ’ถ'น]5๛ีgผg&-1C‚ŠชX"j cฯ=:”9ญeˆ:? 4ม+ mJช็ˆฺ,ฤbjกŒ”๘๊๋BผFิ‡yะ[jYs$๐ˆ<ะ rhป%6LทB,nVชเฺk๒โq่ืO ™า๊๊ฅฅซ cCุ„Ÿ็ ืท\ไ”I:M่ิ‰Rึฬ`qข5ญ๎๊@ๆึ๙ทŽร€Euq_า‰WVW6ฒ„]Rˆงš๘$2p\ฯ F$„‹`ง2ˆŒ !ƒ‰ikŒc†’n\แ•วUแอ›ผ{ H)ฑํfYUD6œ!P๗WW‡RRfš7ไ$†ZŠุษ_ูA‚oŠํ;Cm-ˆHื“'พ+iผฑ๘n.qUmฦ|}A๚‚^…mล๑ปNe๗ƒฎแ๐ร[จทoดN,ผ๖๔\s/|พšu6ZศP]๒ฉฦKWยฎด๚sz [:€€œ~ๅึญ{ย‹Oe็[ภคผฑพœ้ซ*™ทฅ˜ˆ)=…qศฑฑธu์Nsฎฮ่'วf{ิ#B$žG๎F๔†:Z:ฎZ.mถฤถ$™ดบ8ยสHl]"œญ#m3j๙ณฃ)์@4ฅช*ฒจ`[@โ—๊9ิขืjžธู2SYฉึนoj€ั@R๙Jไ๚๛Pใ๔Z›๘ 8n็ษนNฉ8„-9xw„๘เ—๊ญทsu/Q–ํ%+ีล ถ„ŸŸฟ}~๓wธTญศA-X บๅ๚ๅร‘Ojๆญ“ฆ์vเv๖;วd$@˜`ีWb5T -›Okแ๚eสํP[aA6oบดv๒2‡H฿จ79?U‡mKฐmd&–อฺpŒ(jบ,KิBuš—ฆยa+ฃ~้”aธSjRL@ัu–่=โG({ฌ๔N?"๚1ค†ไiŠ\จ1บพอT#จ&%w>iH7Q™ี]๐งหณั‚kฑ›Kฺ—'ž๋4ฦyMๆf'_ฑšฤ!ism‡ณ๗แpะAนๆ‚`] ๏=#„‹nƒ;.ƒ1ƒ•๛ฮป๚ด= บฒึTณzadnLซษ:๏า€แวย๒5)รญi*fี„M[ ฎัIรI$5จZN๏q•”๔("1ฑ$ษน2…2†Šฟีบฎc6y$us„๏ำœฑผ„;ซ6S(mถคl.ญํB4ฆา5œyสก4WoQฤšJ35ต u˜r—1ZI&e{รYVาฒl,KI{v~ม 5ฑ#๔ตkท6}ใ„"์ ไณZมVห4C0K฿f#Iz†ท&ดฯ2/šE™4<-โ•!Q๗ถ๕๏9ร๘xง”๊จKม๐njชn๕F๘j ๔ฺnป~๘๑๕๐๗๋Txฏœn'“`z-แƒฌ๖ค๗‚ื˜Jพฎ๓ีF๘T;คsSM3x%|๋Š:ล|๓ำ8ฏk ‹!BvB 26b„3fVจๆHkแ#drย˜๐ณšJo๘‰‹lzNมีกaFก‚ณWsพ่…้Œ3mKำ2i[! %ล3i‡ุ3ก[Ž&c+F 5อ‘˜ม–๚๊๗๔ใ์ู๎6jผ]๋๊ษyS ซ๎˜!HYญaภ่ัชพ ฿!`๓พัO ]Ÿtึ|จ๒Pฝ—ฆ๓โSใ[ยQ0{เฮฃ™1#7o |ๅถมฎบ‚รr็ ฆฉwชฅฐ;ซ‹๐ส,mXCถร/_็Oทฉ&•Zฯ_W‡GŸ|h‚ศเฝสaร0จoหe.่กCBขq“Hฬ๔ž‘˜’˜ย4แย0็F6\$ชวqพ๕wธW—ล๒ฅŠL)h@Dร…1ŒXAศd€™P{หร–%‰DM2i›tส&ฒH'mาI›LZ”Zฏ$ป+]u 5ฑ,k†G่ƒt_.Rจ (๎ิY5ไฮหนซใtะ[บ))๏†ำรไ#v'ŒaจF?ไ,ฒkิ๓€ะใjาภ[<กก๕๙ๅษ–o'ฒแZ#6ะQ๑$ฆmำฅrศทฎบK-฿^™ร](‰ลบ฿|๔ฉเ๗W*็_ฏสtปณวเพงกพ1—~ถ(๐%‡‘ๆanธ`kQผpyq ถฆ~๚8dๆยOnบ์ฃŽ๏™CฐัธA$n0'ฦNฅฑ“ศŒ–MRJbqƒHฬ 3|„™Dโัธ๋gจt=ยW~ืฯ๑๗๐{q”_ฌภ$rๆ™ชรชำ…Mิ๚๖ฐ"4–‘‘[{ฑ๋า]f‰œI?๛ะ#๒Ž=ึš@ ต-Žฒจ:ฟ"ํWŒ:JชD{Z'ุb4แ–็[ุgีภฟผG}{ ƒภw +š;†s่’7_ถ<&ยตGค ๎xNมc๗วkฏ๑‚ซ^WWร“Oยใวwa€(กฦnRฒวืpไxบ+lญ‡V;ู๊ฒ๚“๐ท€ฃ๖74Qง:ด6“๘Aeฯ ใ1L้ฏ๓ผ8„บ๗/Wจ๋Ÿ๚Dดป๖fป˜XaฎtŽฦLขœบฦ4vC;‘ยNeธชจo@R>m (ั#qC{ฯ ็#๖@ธXกษK”`ง2ุ d*ํ1œ/ใEŽDฤ ”4ฯค%ฏู_:e“Iนฤ๎จ๐šdW=Q"m8{๒ลu^๓œvฺฉฑ>}jฆqฅ ธงฮ้ิกƒฮš๓Šิ\งgภผฯ`ำLจˆhแƒo˜ i~Tพ8บท™E3แu]nฬFr›ž0{OX๔ตีmYh๔œ{"\๙c(‹ส๎Bีล๊เ}~๒ล"†”=L| $ำฐp๖Q๊tุ๛žV‚ๆษ[ฅซNYžFพ๚ta[4™ฆาk%)แ%0dHk3@ร์FAyฤฑ€Ko kฅl’ ั˜ก1!ฑRBJ^“ฤ’!$a,แH!Y’าd฿sC$ฅaOผฃ ธYRRํิ)-{ ่g‘.Bะว&SQ[!CmfPใ์]kทrขฝYMร%ำก +๋ยฮฮ ทU‹๋I&ิbรž&ฉฌ๑H9ฤŸฐH&,R 5ืPXBD2‰๗nž๗UืUW!Cฮุ*ž8—‡ ๒t>ะbpฝsnœ5 6E i็] Az’^_าว่-แฐAvปๅกJ…—’ดap่้W3vlep—ฬ~9ผ2์น\{Œ์"ํ/Ÿ^.W•]oDuถ์ฮฑ๛๎พ™ณI]อก๏3.:๙"<š"๖'nuN…ฦŽ€n•อเะ๊(g–C/ >พ่ต‰^ทmล!%<*œ๖‹6T*ฐKGX5o‹#oืu>ฮฟ๎๙Dฃั=’ษไMฅmูi ย’iึ'–ท/8ต_,ซฎฑแ”0…“llสฦ้ท๖ร’Oj1C‚M๋’˜†›)‰mƒe)ižqT๙TRน•Qตึฉ[œบ††+>ผm๑-^•ฺถmœwž‘๎9gVohนŽ/>๎ธHK0€Cวใ๚O๛9"‘ศ=ษd๒|p[–6 ฒ/›5ฎi†๎Žš๑ฝrW7ฒqu‚šM)lKfื~ุ(5=ฃTxOช'7*ชbŒํ?!ำ˜๑ˆ:“ษุ๋ึต๑ยธz|ใตHฐS‡ศญ5฿๙มYกuมj็ำˆณxšj๘ผ้;nRๆ ิ"ุ1›ยโB:Hค“ภ‰“j๘ I^Ÿ'›Nบ–oผw1BbหD๚tแำ‡a๙แ๘๑Šศqฐว€๒‡๋๎9ุšUฯโxœวg ๏C็jสํ๘+ีล‹w‰J็ง7ยc3 ถ.[98๒ี‘๎x๗w[สั † +งม…'5]ืBภโ้pว…~ทเl&ล˜[ขˆ4อฯ๋๋๋ท™ศL#l !ธ}ฯ™Koƒฎ๖ŒHัpงป9ฅช{้”MQiุง{๘”c˜sriหgyU”†Dข๎7'‘อ†n[ถดแ–~U:Hฌaฒ†บอ/(%[:ภ้งรผ…0สน๋ฯํฒห[D\ใ>๔~ฆงแsฆีŽ‚|)ปa฿œux5ี+๒tP Žดh{`ึฬ8๎เŸ๑สc7ฒ~ฏธ๙็)๎ฐ‹ว๘ะ๒ช—I๊D“ฯ=า wฉr—nŽ)ํ:I•ู†ี3ิมถ '_ ำgยช7ีย”g_‡Sฎ5อใv฿}๊น๓หgmS9Z‹Cภ—ภณwๆึ๙๐๚vฬ2–&qk๕ตฯ`์๑ …–Y–5ธญW~ทQ3ฮ|๓โอฉตแ”ZnKต=ฒ E ozอ•้ค;N—ะ*R{ึ…Ca% †/h<แ;–7:่ฦ77‰"๎–5'Ÿึย‚Ÿเ ”e_’=ดBh้ก`ู2x๐A%qVฟH–น$o^€๎Ÿd€ตา—ืฆptqฦฝš฿ด_ใ aฏ#$d 8๖uงœ[รP7ฅพ๘"iธj๊8ๆศ‰„3ฮ Qว<๕Kฝ๛9๎>›ƒ๏%เP|๏‰w ง–Vc&Mผ๚ืjฝ„ใพดขŒ[‰9ช9บ^œ ‡4ค^}๙ิuถง€cS๖>Iโ๘฿?Aืbฟฤ1๛ 2 ฅ„fภOฏ‚P(ด0NุIRrูGc/ —?๖ ๋lZ›ภฮHอ —]4ฃ4JAyง‰Dชaฮ๏บwฆ{ฆทX,FU๋-ๆ@'๒0j*ฎ9hฺ๊s‰"pฦ8Š1๘rง:B๏pัEp็`ކญณ ะแฆIบเŽ57mทIํ[๏๏Az๖ˆ฿ํ„๙pxCฌy}โฌรVyaC6ฌZ ƒ+๋๘วsเ“เถ3แง ฆฐ:๏กถ“แ|ฮP_›ล"4ฉจU๛ข—ร“tˆ๏๊ไIxv7ญx,ฮๆญPฯโ่Sษwแูทิอ$ ŽzbAi„‡ึ^แhๅ๐ๅw[หฑ 8*cฐ๐ir €ฝOUร'๋ๅwฤTx๎5Bผ™ษd&|DธซํํSž๎=ค~๋ขk#ฅ6ฎI`ฅี’Wห๒: R ส:Fฐา’ลบปD>R‚PจไCจmžะkษnSmuŽษUูMฒ‡Z่เjB‰`๎,]Š œ)แฏEc`๚0ydถั๕ถฮ1ะˆภท๓๎ฉkŸqHทบC8ภ“ๆ+ึฎgแ์ป9๋Pผ€.Ž™‡๙+แ†c@dœด,Eไภ(™Q›gแ}z๋าฆึ๋~ำrUจ#ธำEA–ล†j(๏š‹ใˆ์%ชH ินŽCฯS0ƒยOL\ŽฏวG_ช๕ถ•`หVˆD"—งRฉ฿๒ รฯ>œฒฅ8gศXก%2i›อ๋“HKข ุ$Q๓๎5u5ืฮ็ีz>RZทฎ~qsำ!€sท฿A)žยd y๓`ฦŒ‚๓kjj๏ …BH)fฦ’ƒฮ’}๖o„c3๐Wฃ]‚้ญไ?พmจฮ‹;.๖…uq„ซxๅอYl^9ฃ`ำcด–˜†#,aXWM:้้ศŒO8ฝOj u๊ฐ!๛ฅi,๚t”.กƒRRฅbiงฤๆโฐฒYุYIšwIซิvBุใX๕ฺป„Fฉ๗H$28•J}ฮท†0Ryyฟ๗ "๑1(ํU+เlตN๙ึ‡yี โ~?๛ฝo฿พ_Hนpว.tว|EmธQZJXฐž~:ty*•ญ‚3ั๏œ ฺ7Ÿ3๓รฤฝๆh˜๓$Œ่้ฤu†ˆโ:ยxawŸF(aศฌc~ฯC?C]ทGศ—_๕ิิษ{d๓ใหƒึ๛uซณวคผสTาง๛a& IDATj8„  `เ๚ จ?๚|๗ฮˆใ7ช;ฑ์w2!VŽ1ข็G}ด-—…๏PpT๙=๛Ÿืํไาxษร‘ซ9uปบถz๒Šืฟœ๗ฤ]#‰์~ๅ•ฉู;,g’ฌqญˆu๒อภขEุO?ฝบพพ๑fรh>โธqใboฟ๖* bท0๏ieฒ’X:xKฐรไัdrด›@ž€ุ^ฑะแ$-พ{ดrxๅอ๗ูฟ๏๓€–.ไŸŸGK@„บCง3›ฤ!M“ิWฟ""ถGะMๆi๗s'ฤฑี‚’=ณ฿ฆiNงŸnฉ}Nง{๙ศŠ 5บŒ้?vๅcSŸฺ2›V“}=•JU›๊˜ซ 4=oพžyฆ๐ื55uWซนฤ–+๙ํท฿NH);˜ฆyโ‚/ํ‡##1ฮ;x™ึ˜ฎสๆr๛€่ฌืt),jŸศ&)ต๏mฦฎ˜€ใ/<.ขŒfแบ‘‹Žš๓-๙Œ๑ฅฤฑzํZบ˜dฏฺjศอoLpgภ•ใ4ล{งŸ~๚พ<๐@fg$rgZฏจŠgy๒Šๆฦย{อ5Wญo†)ดโดšศ—/‡_Z~ุa2kk๋ฏnซUSmธ่ข‹ยฆi>qฯ?ภ]ฉb๚5::กนu่‚8(ฉมIKKว็พ-8โป:…w๊K=%/ฟ6๛ŽศE‹็๛๖{ๅˆ+่9q %ฏผ๐’wc์6ใะœdเ้ cถท_`SิEc-ห๛ภOBNƒะ/ฟu‰Dอด)๕\ึฌ_ฺ๘ำ–-G‰LF^v๔ัวl;๏ผำฮd2ว 4(lšกwฎผŒัp๕฿ศnทล฿๐9†ฬG šŸgีีUศถเ0 =pfIfX็s:wpอพžจ>ล$uฏpฅ็ฆใ7ฺญ๋‚ํวกนyาWเiฆตw8ณถ‡„SnPทื„รแ{Yฅ๘๖€ฏDแpุุบU|ํฅ”ึญƒ[n ํ๎ป3"“ฑฯ}๚้<“œB>๓L&“ู็ฤO ›ฆ๙ฮM๗‚1 Nนา๎}hh๊ดิฎƒคึid6ฌo,ˆ๋S[‹CชรืฅŽะผ๐ฏจrg9œแƒซ!hฺ๋บส๊ p;t&ปNjsๆ~สปํz=9~๓W*F 5œ;N}znญฤpม๏แั€โๅt:}>฿S๐u,ณืฌi*่๖ƒ”j5ุo~c>๒‡?คD2™ih›ถหต๑d,หฺ็Wฟ๚•FŸ}ไ?}ƒkณ ฎfkH'T๏ฉKwำ%๐&qˆ˜†รํ•‚Gz‡ ศ1ภo,|ขn–šhsำB`m|ยG$„#๐t฿;;วฐํซ๔U;Gพ4Zยp์ฏเžGxฯถํฆNญ^€ะฅ”l(w๘4‚”๊ฒn3Ÿํฺ๕f3•ฒN‰ธท |CpำM7ูษd๒HหฒฬX,v๑ฒต‚Sภ.#X๚‰ณYz๓ซๅ4=ึsผŸศผqน๛ญใˆ๖RS…Nาๆ•_ร)Zูฉ.7}้ใžj๊{’‡HW๐pศl|)๙๓aฬn;‡ฬฦั๋ฃ" [฿W฿&ยร/ํxพ0ญ)‡ =ฆภฟ^เ…t:=๖›X้๖m‚ฏtฉTŠ1cb๒ˆ#v ญK ‰๑โล]w~ศวผำ8,หขจจจW:O&“j ๆoงย™G‚Hi๊ตK”RSหq5ีั›v <‘ิทงษ–ƒŒรเ=ร”1Rโแ2w‘‹ิ฿$๓๔O7ฏž_๑มPด—OM‘~ใz>l'Ž<\o ุ&”๏ซNฒๆKญ๑฿‘8Zช+ ,Xƒฆx)\ ไู๒๒ŸDD"lHuS[ .฿uWไอ—^ญฏ—“w&"0M“ฦฦฦe™Lfh&“‘Hไศบถœs˜รก๒p็ำ iา$ ™๓I“`ว“2V_’๋ :ฃ<๘–ฮนšวHiL C6M๔๗€V ใ๖-๛u ‚ะnfฮฝบ[ดฐ#p8/2O|ฺ6Z๓†ฺ๗ูbu-ิƒ/kuบp4WŽŒ ฃOUD.„ฐ๎9ไแ•ฝz•ผq๚้ตใ๓n ค„d๎นวxงคd—,]๚eโ›Vัทlๆsฯ =๚่ฃง744jvจ{สŽ ฟ๙t)agUz]`Kอ!(ูƒ๎ lœc™ศี tCเำผo‘ลญฦฺท›ว.7#eฺ"<๐ภรœ6yฦŽฤแJWํ;_9ค„:zLR๋วC&<๕G8t‡C/Gฦ€Sฏ‚วงซoำ4ฏซซ;!oi'ึ๗ r]ธๆNoหEJu๕๏ฝ๗ณ :๏ปrๅสิw}ŠB]%}™qื]w`Yึ๏ค”ปI) €๒˜z&œqTฤ4ยฯGเ๘ขGh฿ข~9ฯƒฃ๋๕€เหUkXมŸ๘แrวโ๙ฃถ„cๆ0้ว๊ฌ:!เฌมS!ๆmฦaภข๕pศูฐxน๒2 ใำฒฒฒัีีีฉ<%๚Cพfผไškธฃ5t*ฅบุ๏{C๓๖ูg๒ฯ=๗฿ิ๗ัจa9Kว_4gฮœซ-ห:+N—ชภp.<ฮ๔„ถ-ื•NA‰Y†šฤาคzpxฏKท|_ื*„ฦยdฺ'ใฐทผมaP*ฤฦกoู๕$,ญว1s!่"Xป)[Gว~yŒ่ซ)–†ำeš.พlMยฟ^ƒ[๏Uฤํๆม4อ‡~่ฌYณR_๗ ฯฮ 9TูณgO?}๙๔ๆ่UJตL๖{ล‚แรว|๕ี7M‡A*ฅ„ย Aƒzmฺด้g›7o>YQ&ฅ๔.1ฺฮ:ุ๚u้๗ผju;ฉฎšบ๎ QEV] พ็Hผเำ๕ึŠฦ!A†•4ํ๘30ํMhLz)ุ€กkH๎5L Vฑmฉหง9 0Œm™mo~ฯถ@N-tํฺuุูgฏšk็1ผป~๏ฝbYMMtx"‘ž๚? ฉTŠ#<2๖ฮ;๏ัะะpf*•ฺ0ิๆฆผ&ŒQว%๏?ช:€H€ดี‰3๚84ยัˆหฃyhPc&>ษ๚ ใaฅ๙ฝ9๛6ผ๑6|ผะW}6@(Z-ฅ|hฤˆฮž={มไษ“{ฝ๑ฦS€รำ้๔(!D™mg{ฆa™โโโๅ555o=3v์ุiำงOท—%wSC่วstล๐แOm nl1 ธ~cตmwพ|๙๒ํ•ู๛์ณO%p์^{5ๅ*้ฎิs๏ฆs ฆ๎ท๎็BSอœ†า!฿ฌAkภ^}โ ฑeบ๘q›6Uฟ‹ลพ๕ฺ!ก'“Iฃ{๗๘†ฺฺศศฦฦฦv†มถmสหหGํบkอฬ)Sh๙DoM=/ฝ$}พ๖˜cŽนก‡ูi๗qฏB^*vฅK;|s ฅคฐฐฐGทnŸt’,ฒํ6ŽฃฟARis็b?ผ๑Diiๅืญ[—h ;/ดทฬท ฉTŠ=zT†ร๋?;๓LปSพูŽ ึญƒGๅใHคร6lุธธธฟะJ฿"TUUล2™ s.ธภด#่ฅอึ๔Vฆ™Jม3ฯ[–. ดพพ้};I;|ะN่฿\uฦmท๘า๙็[๛วbm'Nw6DXณFุK—ย_ศ๊]vก๒€ถ?RB(/ฟ,˜3งเ†>๚่๚พ}๛ูํใ๎๏.ด๚7ถmF>็œ๔ษอธ+#ุฒEุ๓็KcแB#SWW๐๊š5 ฯวใฑ7ว?๏?๙/๛ํ7ก ขbๆึ‘#ทOขฬŸำฆ…งu่ะํว .Z฿พ^โ๛ํ„ ภาฅKtาI้_๖p๎มังฐLSฉว‹,^,_~i}^[š …Ÿู}๗ฟ๖ฺkuกPศN&“9๓ฯกPจ๓I'eึ๔๎๖|นำg55๐๘ใ,kl,=z๓ๆอถK๎๏ด๚ืRJJK‹/8่ บป ‚tึฌ|นL,Ybฌnh=gฑ”––|บbลส๕ฉTสRฺญ]LวGœuVใGๅๅmอ—ฺซ๐์ณขvแย๐๙d2™๖E,฿ch'๔ฏ &NœX๔ึ[o}‹7Mณ๐ฅบบบi็cต‡zธ‡ํT*ตอ„ๅ\พp๐W๐|k“p5ˆ™3ษผ๑†q็ AC๕แ‡%ฺฅ๗ด๚ื๙Tํํ)%‘H๘œ+ฎศ5 XผX๐๔ำแWGŽs๔›oพตฅ}J์ฺ[;RJŠŠ o:ตajKหSkjเฉงBหVฏๆ„d2๙žนCoๆh‡๏ด๚wB!y๕ี๚๔Gd,ˆ_XSS๛'!ํะN่฿(,ไฉSู+xคq8 3gย+ฏ˜๗ะโ?4ัNํ„vB฿ษ!Nำนsxษ…าฒ’{ๅJ๘๗ฟCณjkอ‰ฤา๖qw;4ํฝc'† ฦ+Wพต๙”Sd จ#ด\l\ป6zB}}หํ’ปฺแ;{๏ฝwhิ(ัxํตศฑcฦฒฒ’K<๒ˆฝณ๏zi‡vh‡ึมATPY)า๑x่แ๎ปธ‡QถC;l+ดซ๎ํะํฐำ”)%ฌบ;fื~ลปw–ตU’X‘ษ J๖XOองีึฦู)ณวi"eฉะเ›l)%ํ‹ภฺแฺz;ดC;|ฃ „ต…Xฐ_ฒX2ีC—#Œฌmู๚ฤ2’+พ‘žDด˜ejVร—ุตŸ#“ี~ [‚-‘ถฬ4.ว(;๘ำียh฿tู{ะ๋กฺแkN#6? ko‹๙๛%Œุ()LCศŒจnR ญ4๖ƒBDบ–‰‚ˆขQH†๚ลศิFศlUง—;็’J)‘™†ตฤ:NzK>a.ฅคๆŽhD„ฃ}dbkสฌ˜ ๕žฐ66๎ŒDด๊แ{ํฝฺกพVห/‰ฐ`฿›dจ †‡„YV-คV€Lู2ณqภ\เEา5ถ wฑ…tŒˆฉjจ๛ูธฌ„#ฬQO;]'ํฦษ๑Iณท่ฃ EึฟAa…!ญตค>FjฃถlH=W}}ไ”ฒซu†ู.ุแป ํฝทฺกพ6ซnจค๑‹E๎๙sQvDH”ั~ S™a ์บ“YV$Œฤz@v2SLฎF6.‡Lƒ#ฤีูRJ์tอ…ฑร6ฬkN˜ uSh/คT—ž: ">ย(5ทึ^0^Zํ ำฺแป ํฝฺกพVฺ แƒ.˜ลˆ…่1ศฌ‡ฬFš$?น›ดำูศM`ง—ส๔dz3$ื!ำ[ถฅL์ F่v๊Cณ๓!-ฬ™K+cˆHว‘`ช๛@]s=J9†ร~rห๏Ÿฝ3“ข8ปบ{ฮ=ุ‹eๅFPTnDEEQใใ•xจIิ˜hิ$jŒฦ๓Sฃ๑Š_cŒ๑ˆฤ[Qขxแ‚€€หน์๎์5gwี๏ž™™ู]Žฤz๓fบปบซซgถ?<๕ิS๗ัhz-่ฆw |ปUc–กฬ> LP”ำ„R1TายVย*E‰Tใฟำ๗#sุฯฃุแ…ฤ ๎Š9Nกdฺีฎค”2rฃwŸ๛บ5ซใ‹์%;ๅค๕*๕ŽJM%Xฅขัณ”ด{๕ฒh4ฝ…tFำ+( „ŠYA0|(Jู  $"•MIภ:–•—}#%ฆR& ๘œŠ7Hข๋มn%H๗”uํDBึเS_L ๐y8qo_ณ†œHฦฉฯขรb7„?Lก#ไ4_M๔Wฃั๔ศศFTยJบcd…‰‘t›ซไ”`%J๏๎9R91ช๛๑๚M*ถeทƒ”™b,Q|ไ™๘งFaxป> aJษ_ ,#+˜.#Jๅž.พšQ‰ฎงั์คhAืh4ฝ‚ax%ESW([Šl$?ส(”งEมๆฦ3rลU^00G.NขๅTผ์๖d๙ไœ Jเ๛ •่๒ฆคM๋'aGน~าอŸu:D]สต ๙„a๚t>FอW-่ฆืPUgตง๙โซมiแC˜• ‚ Dถ ])”ŒR๕zy็€b””8๊6โQ์0*•๗X%#แจ๊bF2ๅุด7p”๐๗ T๋ผฃ]8”]๔ลฺฟ*M๏ ]ฃั๔ค*?แท*ัZbKAลQVส*ฬ๔๐1RยฌสŽW๑ะ์ื‡ญC>_๛ ND",Aยฒ ฅบTŽM๋_ซ'#โ`˜A๒Xๅ™/UQฃrฏ„Nžฉ๙ ฃ]ฃั๔ย0ๅวว…ำ๒MฺๆGE๔Swฝูืย–vy'฿มyแKลk/ิ๎%œrตŠ7ถ!จT”ป”aWยำษ=ฎ”C}e ำxaำyแณ^Q๎J!p~Wzฮ››„ู้ฎืGฃู–่วQFำ๋(้ภgำ๖วช~(”๒@d *ถๅ$ษ|์n^vŽL/o~\)๓m„F%ฅป]JT<ผึช˜4ะ{ศณ€ซ๑ํํทป00ฌZคD9ษฒษ}ศฉGI 1๙™wฬัใ‚G?†o_)fหั‚ฎัhถ JJ๘l฿•(zฃขBูH„PN<ุJp’๏ส๘ดุ'Z9v[jTMYเิฝr&†yฃfEฎ€ป“ธdŠ{ย‰#ฝใส.k๙ฌซLsอW-่fปกdต๔[^[๓๘ยฑณ,่มอฐฌฮ–ต+ศๅH‰ยP9Yวฬkฅ+”ใุ**ฟY~EYก‡žkvด k4šํŽR6๒๗ม(๚ทRfu'๋ƒYfต‰แ7าฉฏ„„โlWุ๗4I๔ค์ Aนiบฎxฅp*ฉxใ๙˜๕Lร€’ำ|-ะ(FณรRข”ฒ”nl‰OŒlJิ3ฤƒQlธJ๔!บNv}dS6ฯฦ๗ฅƒnะ\ะ0จ0M๚Zๅฆ‰งฟgฦซื;R๊๛œๆkvนk4š‚r}็†Rชล€E‘่sE†1ธโตฆ%fฦํI‘uทJ๎‹’ ว‚ึ-ข• Gา"%๕ถํบ฿Gฒ<๖ํหฆ|4 น=งัloด k4šBสีฎ”ชYฺ…0ฮ  ~hcถ(I๑$Cw•Pจ˜ยispZ’ฏ6Qlœhฑ๊@/ ^IศvhŽ๑š5j๓'๕_a้ 9อ.ŒtFณI&๑*Eีฺฆุa-u_‰i!Hzั17HKœQ— โ ู&ฑ7ูุ๋lโuqุ๋6NซƒŒKค|El้ะ4าdีมพE{‡ฌIS๎ุ-jjQื์ข่ 8Fณ]ษpตe\U5›๒ฦ"ำ4,‘oฎ\บ]mาาืภ™ตV"%ฮz‡๘ส8๑eqโซใ$6&pZœ˜ƒฒRนsจ+’ŸQ”ผkณ็ปั1qห†ฑ%฿มอืhz mกk4šํJ2œจ๙โ“๖_จั3ƒBธึENFธt[bพล_ั/b$ึ$\7{A:ฎp็“dฏ—Bทโgv๐้Lrš]-่fป!ฅฐขชๅ๑ึ"๓ย™วYr?๚f”)ๆ ฅh—’ใะไ84I +ŒaEoลฒ{!ฯ\'…lsฮิ้ ำ-๊š] ํrืh4…dฟน"(cฒ"R๛๕1^หำจP$ˆMHNqชˆ)E›”49ŽCซใUŠฤƒwŸชฤ@ปค๖พ6฿ัŠตฮNoK‘๔Œล„๙ืชVํ่จwอ.…ถะ5อv!i๛๊๚ห๋l ฝป{1ส „%ภDฦ{H!ชญI!9mRS p’‚Ÿ๕ฎภ6@JEู›Qฃ•šงa‰ จซ=!9ิ9๔{ยะท@อฎƒ5k4š^'รี^ึ๖\ไถงํŸไทฌ แwƒแ”Tจจ"ช$kfxhTฎ˜ทKI<ู—๎ะัฏ^่=๕Y*p$L๐lฐฉx?ยภ'[้๗Ržๆ1แœrhโฐฆvฝkv ด k4š^G)ๅบฺใrภ†lxุ7ฦ73ฤƒQb€ HQ‰ณั!พ8N๔ƒ(อฆdัŸJ‰T 7+โk™งญ๔Œuนeา3ห+EยฅŸDงฟYร†uอW+ึh4ฝJr˜šช์‹ ัsโ?,oV›ˆ"แ$จจยู๓๗ฃฤ—ฦ๑พcจLดw‡มIฮฒฆ’ณณAว lddKEสง–™ามvฉLA04ย๓ะOณขx๛] ฆ๗ะบFฃ้5’ฎvDY๋สุุต๒ฅ’€ix…ภทุฦ(QQ…]o4Nta”๘’8ฮ&S้์p้๏€ข๎T?_\TLx€‰” )`ฉ“วŠฯต๔ฤํฟฟ็เำด•ฎ๙ชฃ]ฃั๔I๋8จbชๆ๓ึ่ร>ึdŸ˜I+Zฺ ๓?œทขD฿KŠyฝ+ๆ) [ Iร’4L๓๒ล™ลิ๏็#Ze ์nDœlมทาฉ‹}๏}†฿k่|๏šฏ0Zะ5Mฏ!ฅด@T|ั๙ฎ,6ฎ/2’้]…/—’V)i ;”žฑ ๏‹Qdา2Wจ,1๏~ฌนJ๎#QBาผ—‡๚‰>&๙hใฅeˆ‡HฉT๎ค.าI๖ท ˆ&คฝ[ใ—ำ†,3uœๆ+ŠtFำ+$3ยทGๅ๐:•๘_ฑe๘}†‘๊6'ฎmŽC(™8&,%qฉ่u ีททป!๊ะญ w•H&ฟ่K๗ „[*Vi้ฅฑRผ;ฝฌtฺุว๋๙ำ5_Iด k4šmNา]๎EQต๖œตื{†{ฯไฌŒJ$’IcBŽCsฮะ4้บม๑œ`๔ู!ผKํ๒ฝ˜๖๛ู๛ืG6๙3ำk๎ุ จัlZะ5อ6%ี.) ฺ?๒Nไ_ษ~หำ฿ƒ*„'xh๗)BI๋ผ]JJa่ใv๔y1สn—†๐ฌr6ห*๏”ฯฝปe!eผ2>ุ๕วพa่Yู4_1ด k4šmŠ”*GUญ;{“พ=|ใฝ#ผˆ" K์U6ํ_ฤX}^ๆA‚xf8ฅp„ศŸ4F)Cเ]‘`ฤošฉz&ŒŠv/า=ติSŸำYญ๚ช)วฌ>fฃแีขฎ๙๊ ]ฃัl3Rฎv%Uู†‹6œm๘Œ๋}{๙0ซLTB‘๘2A์ฃ‡าช{ IDATัข$Vฺ8RRwKBวฒ‡Ÿ)……สH๎:ŠC๎nฆใmMRmฝ >H<~l๋ฑวk+]๓UB บFฃูfH) (n๛o๐–ฟทผโŸไ/๓ ๒€๖z›ุ‡1b cฤ—วqB$’; Eหแ>Vฺ‡Xต‘%ุ๒ถw๕ุ‚Ÿวฉ}ผ…š็[)๚<1‰ณ}้J(bžุ๗Ol?๑vแัทIอWKีh4„ดuฎ([พ2|Oษหฑฃ>ฃศภฉwˆ-Ž}7J|Yงัsฅกiะ1LM˜ŠugYyE1‰ฃ’ษc(œทฝห๑ๆJแ(H๘สVฅ฿‚6*฿Sบ$JpM3d2` QุยŽ:~9แ„๖ใ>3 $งู๙ั‚ฎัhถ ษajฅkWDfว๚›<†ๅ‰‚๙\˜๘;1bD‰/Žใ48ศธDจŽOJฬSŸำ’MGx๙ŠRZวXnา‘‘—=้–ฯ›วœํไ ธK–‘2้เฐ„;K[}lลฯE๗๖%{F=ํ~ื์hAืh4[M2#œ?–U_Fใฯ๙JฬฝผB ฐ”ด48๘ฮฉวx)ŠŠw$ŽI‘kฅ็๋็VHœbXwB€ๅ”ะ:ยBูyRฟ๖d๒{พm€จ‹ฬดQ฿7…tอฮtFณU$ลJW๙ฎdไOZขษLp-R•’D\Q~U3}noCัYศำว์ฆฏ;ตŒ!iCฑAVWL๋"*]7ฝ่บฏ=eัง—้U/˜^ ๙ภ™ใž5uพwอNŒtFณUH) !„?ผ>>|]Pื๏7˜BSŠVวกMJยฉqๆษlวkQž฿„U'ำถzฆภoษXs‰r3ภym#,6L ฐ~ งhซ4Qค-‘dธ๊ Dืgบ๑ใง๎OทN๚ษOฦoดtjXอNŠtFณU(ฅ,ฅTลบ3ึ]!O,บุ8๊n+#>ภฤ‘9ฎ๗|ั่ไFŸป3ซ:(*_ 3์ฮ&ส฿ ง‡ฐmk|ง๕Bฤ/=ฝ๙๔฿™pFณ๓ ]ฃัlR*ใรP๘B๋นศ-‹ 2.tฎIWtŒ+ฯ–& h=ิวช฿๕!2ุtะDถฅž7๊œ<}๐ l D›ค๏Km z,D฿Wฺ1ูษUฟeมtู๋แฤ"gส™ก3?า้š-่f‹๘่ณ–*งฟ๙กด x~ฺˆ๏ญ'\>a๏XEtw“U—•ฐแx*ั‘0ฆซฬo…ฦŽปหเ…m‚ตักlq˜maเKอญŽแศิฑณใ๊{jษย^4๛…ู{ึ\ƒuอฮ€tFณูH)…›ยื%ฦeŽTFฺšN€๊&‚jGdนSค„=฿rZ0ฝ’ะV\RJใT/*™š5od<9y3—ษ3T.#7ผmธหFปƒoS‚โ*> Sฒ:Jษ๚(มU1›bฉ@J๗ฅ\A—B3ืพ้ฬ_๘Š<ฝzฝ5šž ]ฃัlR*–|ู>2Z)S‚าผ"ซ ๐—VJBD 3+\มใ"ำ๏โ–ค}คษ฿+aํQEฤ๚ˆ๎Eพะ.™n|eศqํ+า–|ฎห?๊(9tA๓๔gฟ3้ ENณฃั‚ฎัh6‹5ขl0ํŒ ๘N‡ุๅŠ ยIfcซ๚}ง๏Gv—ยพนรศ๐(ZGYฌ<ฉ„5Gั6ภrฃๆWz^k=_t}W๏tๅ€xK|ลO:{Ÿ>wฏฐGGพkv Zะ5M‘ถb๙๏7Žj›X"†Zcหก“f ขt๛ฒ๛ำN๕ฏZ0$ไ๔ญoNv~mก@I„) ๖ฒ๊˜ึO าธ›h™rดฏŽiฑฯ+tแฎฯวต๖ฅw]๔๎—ฦŒ8ฟช*จณศivZะ5M‘ ษโ๒ลํฦษฮqขwU!ฝขร๕Gะ;นภH๚ฺJอ๏ญn๚ถ#๕พ$แƒฦq~ึ R?>@ใPกม^"}LฆGนcๅ•Bสไ”ชฉ๓ฯM„ qํรถรŸ๚ึ๘ต•ฎูQhAืh4=BF%Ÿ?ืTๆkB ฏk]C%„UŽcๅฑr ๔Qง3ล%ท•=e่U!ฌ:'-ร"ฝ๋ๆํง’๘๎ใ…๎[์ ฤJ "ฅ‰€A, ˆ๛ l ’Cูb‰•‡VVํ}ศ?gด™^=>]ณั‚ฎัhzฤš ืXก?†ž1ค1+s}Zุ บปู้3˜ัูŸ)่้์ค[ณสฆ๖O-ิ฿ŠŒ็Ÿyญ7ำปnอƒAฬˆ๑ไwOa฿‰}ท๓ทฃัhAืh4=@:’ล%๊ล“B‰.|ส {ŒEร}UD๗ฐฒๆ๏vb–ฌ๗ไดฆŸ'จฝณ™ถขฺ๒9าทฏhwUงƒƒ ชCฮk9๏UำาVบf๛ข]ณE8Žร์ูณฝๅๅๅ๒ก‡ฒวAวฃวใ๎Š|yฬ—Vหำ-๏)ฦg&† $Œ,h9ฃˆ๚_๕ม ŠผtวำูŠw”ย1@4K๚พะฮเฟ6Qบ0‚Œž?ฝงขฝ5น๋VbYล^Sๆ,œฺพ฿’ๆ๋Žtอ3t่Pบu๋๖M$—†qPi)qวฑ—ฺถ๗uฏ7๘JssหGงžz๊ฆ๛๏ฟ฿6MSฺถeY;๚ด5›‰tคฑธt๑I",Da@๖ะณ”ฐg’™,FชXะp~๋\‚ใหฑึ3อบ๖N)`SCใ„Bลๅ S๛Tˆ~/ถb5ุ(Gm3k~s๗‹cท_บ๐๛บ/]ณ=ั‚ฎู&$ พ๏๗sฯ(ำไGร†qย๛;C†@Cƒ+V(VฎัPศปขพ~9(~อ0ฤยรŸU๗ทฟ–RJฏืปฃ›ขษภq$ฑ/ึRObuUSตyO+…n)+ฝณต.ฒJแ…๚ำƒฌ๙q1ั# ฆวเ่ย}Ÿสงถ)Žขxy”/4S๓J eK"X ถืMŽ๗ญqKCฺN?็๐ฎ๚แหZิ5 -่š^!ceeeแp๘ผš๓œ}๗M c๐x š๕๕ศUซ+Wbฌ[วg--ๆ|Ÿฏ่•––ึ๗ฯ8ใดw฿}oT”R[๘้H>\ั๖ฃึบ ฤๆy›0ูNWIbr…<ำ=ŸฝN(X๙ำึŸภฑ ๙ฮ;œฎฟไ‹ช—ฉ„0>c@puŒาฯ"T,kง์๓0}–DnŒโmN ยa;(‘ฦFgซ?ตJHwชWดVฑด~ฺ )ท๓›-๒;ัh ก]ณ]ˆลbx<fฮ<ิ๚๋oœุ็Ožฬ>“&)JJภq\qPIฎ™4lB!ม๊ีŠ•+…lh๐ฎจซ‹ฟฯ+**zwส”ษŸ<๘6 วม็๓ํ๖ํช,zพฑ:>ษ๗ž๐‹ฺิB*…ใ€uC฿Mอ(ป๐ูฎ๗ฮŸkๅ‚$ZkPwN1uงญ4PถJsฯGฯฒป๕X๘;ฅ…uทฉŒ:ั๑ู} I~@!T๊srƒ!Pก๘_?šฐว\=6]ณ=ะ‚ฎูaุถอฑวmผ๐ยK3,หนh๗ๅ์๖SVฟ~`ŸKฎเ77รบuBฎ\‰QWวฒ ŒOโWZ[[tำo^tั%qำ4ฅใ8ฺย฿ คT,\ั๚+s u% C%/|z˜YR(—ขŸฝ Q/๓บ!เœ{ฌ๎ฺX’ฆฉ^พ<ฉ„บcЉ—ˆหŽ„/๔ะjฯ฿ญๅŸ๏X๋vt}uภ6>i:bัฑS^…~ะอ6Bย4; Žใp5.บ่โcฑ๐Eƒห๏x มแรU—ŸKฆเ+ํํฐ~=ฌ^-ไฺตบeหb‹‚มโืjj๚ฝ1rไศO?Œ-„Žใ่>$าQ|9ฏฅบq‚นฐŒโิBัE?wDQtS %ฟkF)ัๅd,๕C๎ืv“พ $‘&๕๚Yud)๋g‘๐ ˆสยy3>o‘๕žฑ.+ Pฉ.ž>Aต%–Nxyใ”ฟไ`ํzื๔*Zะ5;-RJค” T; j:ฝข")S0vฌ2 ฃ๋๛hWค?59V$›6!Wฎฌ\ษ๚u๋Œ†แ}นต5๒ๆฬ™‡-จฌฌl{่กุ‰DยBHฅิ./R*>น๘ห_ษk+ฏฤ# !:ผษ๕k;%U—6R๔๏(ุูAr[hึ“‡Hข} ษฆ ~ึPย†ษAZ๛H๘ ื}ฎ2๚ิ•ย‘ฒณhCg|F;URิำ??!:~XฉฯB ”ำภX๔ปŽ˜๔Sำ4ถYฎ๗h4 €eY˜ฆI"‘Ho๓zฝH)I$$ใM ชjอNŠtอW†”หwภ€ฅณƒม๘ใฦฑื>๛(ซจศฝ‡nฉศwิั๑Y๗CCƒธWWg„VญrV |ู๏/žืาา๒๎ษ'Ÿx๛ํทG รฤใ๑ว๑๛[ฺู‡ŒK>ํiัd,J”ษ9EุทW)Pข€k:ฏ‚#@ตK*_+UiO็m‡อŸ]-w@%Juผว{ผฯ๛,g9ํด%Ši๎๕ผ$Xx<˜fq1มwงฯ๛S2m‡‚้!a€m*lงH๖=ฅ0…s๐‡โ6ล ิวจ\ฺBๅอ๔YŠง95ฌ่๔KW_ถภ๔u๕žc!‡zจwม‚~ฟŸD"1^)5,‰Œ5Mณฺ4อbภฒm, ีYoถวใฑฅ”๑D"ั,-//_‹ล>๏ท๏๋ํํํซ฿xใ–แร‡Kร0R๎๒ชป:Zะ5_YRฟnปy๋๋๋๗M$ฺ~˜D่ฯพณโ;ฟ2x•••ยแ๐™๑x๛@Mฆp{<ฦŒรQGลa‡ฦพ๛๎‹วใAัฉนmN{>าRฒ~z^~๙ež~๚iๆอ›ว† ฒ`„ฐ…ฏ7๎ฝ๗ฏ.\ธ0ฎ๛vn๔ทฃู*R7ทไ ๋q4M<๗FวS›าๅ”R้ •Rฒ fฯ>œ@ `†แตmkY–WJ้UJz•Rถถv๏๙ณ"‘ˆAา่๕zฝ%%%~  …~TVๆ๐oภˆ๔2l6™{†--ศ•+1VญrใFkํฦjพใXฏy<ึ‚™3๛์‘GkK๕…๖ฆ…_F™๑!ำN๛้7g{สฝ>๗๔ฒ"~„Ÿๆ[*ฐš…ฃร๓๔ต็'โ™[ofํwโ(']฿!C8๗s9็œsจชชJฏฯฏ|b–O€2ผ;,ดฝฑฑ‘ป๏พ›;๎ธƒ•+WฆืLg:ณ™_'AยทpKZึŽJ๏cŒ7Ž๓ฮ;9sๆ  žวถjGพ๒ฉใ,Zดˆnป‡~˜P(+{mิ4อฟ”––ดiำฆ:ำิ sv6ด ๏ŒjI ˜ื๋ z<ฟวc๙Mำ Z–0 ร๏8Nฐฎn๐–iโต,ร๋๓Y~ฏืฒผ^ำ๒๙,#i๕:Nkš๘M“ฬwฏaเ7 ผB`xฝ,‹๔{ฦg™๚{7 Wธ, L#U.นŒa(in9หr฿ ร4;zๆBO•ษ|ฯ]—r•๏ฬd พะาkื นjฦš5ิ54x฿๗๙J็ีืืฟuำMฟ]xษ%?omz]0žแ™‘ปณ๛’1๗<ศCžนœๅ๒ยงi๘U‰j”ฎ๕ๅrฯ`ฆคไ?๚ํo‰‡ร€ไu๑วsํตืฒnปนว๏ฦขฮถอ็ํ[RวŠ+ธ๊ชซxไ‘Gามi<ฬb3˜‘%๊ซXลSตOq๙ๅ—๓๏~Ÿฯ—ฎ{Gท#ท ภ’%Kธๆškx๔ัGqœ๔ƒV0Œ{'L˜๐ำw฿}ทE[๎;๚[ุˆลb<๙ไ“ฦน็ž;8๎k๊๐ฒฒุŒ!Cฤเ#`ศ…฿๏Žํ.ไrึ_-2#๕…€pธch^]นq๕j๙‰Ržื,หzkๆฬC฿z์ฑตI)ษกoค฿ฦโ๙m9ืn<ส|.šJ–ฯBฯ}๏(ฌˆ๎็aร5eดํ๋A9ครคฤผฅพž฿Ÿ~:ห~;ฝ‘GษmทฦะกCรt๓ฃ,ไ:ฯœ+\›+<[Rว๊ีซ๙ั~ฤฟ๕ฏ๔~ƒฤ\ๆRDถฐ9์๖ร{ฦX ำภ4อNฎ๔กนๅ๊๋๋น๒ส+น๏พ๛าั๓Bˆ๕Jฉ9ฑX์eุiวขoใป0Žใ ”2.ธเxc€eห–Wสžูฟฟ็จชชุเQฃ„5l˜’EE)ฑ-๎ปน‚‰ค#๕/พPWฏfi,ฦ|ฅ˜'๓Q"๚โoํ฿wฦžฯHSxEL`^€qWkzผZ>+=]_AKd™ แŒ k/(bmhฟ>แx6}๙%EEEsฯ=œxโ‰ฌิBŸ}บฒDทGJ){์1ฮ:๋ฌt@Zeœอู๔ญฌๆ;oฮกค –วยฒฌt@กX€ีŽBu|๚้ง}๔ั้.!Dิ4อ+ฮ;๏ผ?vmR[ํ}ลฟ†คาฐ*ฅ˜7๏uใ฿>นสq์1ฑXไp'2{ะ cิ๐แา?b„2JJ๒ปฌ5_mrปโqhj‚•+ ก2†ฐ๗”˜ท|Oสdnuผ๗{{์ฑฌYณฯจ‘œtฝผ๗,Ÿฏื‹วใม4อN~;K; •ijjโ๔ำO็™gžIซM)u–ฯ็๛g,CณะทfM'‰†a๐็?฿ฮuื]_f‰Q--อณJJŒ#๚๖ตGฉช†Wฒผ_Kzดะ๏`๒j™฿I๊ณHF๛Kู๑ƒm 6ฤขŠึ6hk…h$^bq๋ึ๛ 5›”5๓‹๘ฯู‡}ใๅธ฿310ธ‘น๛(--ๅมไศ#ฬ8ฏฮBััฆ๋SR๛็งะ๛Žชเ๙็Ÿ็”SNกฉฉ €SO=•๋ฎปŽ`0H ภ๋๕vฒึwถvZ฿ะะภ‘Gษ‚ Ruญ‡„Bกz|๛๖A฿‚5=&cš&RJ>pก1sๆ,๏ภ†๙าYBุG dŽ>ฉ6L}๛บnj${๙*ฒ9โš*ฏ”;IM"แพl}F u๛ษ[š!‘, $86H”•@฿r๗UV ล~(+ƒ>•P]}K—ฯ๋;…ถ04…ผ|ฃvBบ_4ur"๙žสช–ŠP— ’ขห๑=†y๛๋จใ8Žฃื|๖ูgs็w์+ฮGกํ=u5๏Œu(ฅ๘แศŸg”R๓ุc1v์X‚ม`'Q๏๎}+ฬsž๙Jึ_w๚AB<แ(ดดCc34ดีาo๖<Œš๊ผ.WESš*q(พต™า?ด"Zƒgx†๓cภํ'๏ฝ๗5jTA r[“)8›6mb๑โล,^ผ˜E‹ัธใูGลž{๎ษ่ัฃ0`@>์:ฟๅห—3iาคด๐tำMœqฦY–zW็“jฃR๎x๙ตkืาิิ”๖ฐ๙|>๚๕๋Geee๚ป์ญถๅ๋f8ๅ”Sx๘แ‡0 ca ˜ึึึึ}๋ฝ‡พฒšํ†m(ฅ0M“ษ“'ิ.]บเp8|๘!ž}๛๗1Bตต บbŸ)ดRบฏ”‹A4๊พวbฎจฆ^ํํฎะฦbnู€ส‚PฺJ‚0ฐ๚U@E)”๘กO)””CE Tป/ ้š&๙ pึIŠkR0๓Y™ไ่j๖๚”ๆˆŒ‚ษ๗ิƒŽส\ฟuธข์>œDใฎeุ š`]=ฌ ฦพx+ƒ4๛” ›ึ4yะฬษL ฮ`ฆ4แณ.็‘‡o`๘๑ผ๖ฺk”””dๆบsป`ฎ๙๓็sอ5ื๐โ‹/ง+&OžฬUW]ลQG•>ืฎฦถดJ)ฺฺฺ8ไCx๏ฝ๗8๋ฌณธ๙ๆ›ำ}๊นVบRŠึึV๎ฝ๗^๘ว?ฒ|๙๒n-๐ฬs5k_|1ณfอสkoi;๒C)ลw฿อน็ž €a›,หš‡W่Y{-่šํNสu/„เ๐ร/{๛ํท'‡รแ‰Rสi>Ÿo๗H$2’œ$5"Ÿ+rี0~7ุmLF †C฿R7ณIrฟ๛RfPXฆ ว\ฒ๖ษ฿ฬใe.gœ~+ู–uคฌ๓„ ั4ทมฆfXฟ ๊6ยบMฐกฌ {pFฬ(ฦพฃ/๔7 Z็นณ”!w_y%v3gฮไ้งŸฮLิmŸm!q่๒:)EKK งŸ~:O=๕T๗๋ ๛๏ฟ??0ฬ:ฏmูŽx<ฮqว—*;๏ผ๓ธ๕ึ[1M“T๒ถ๙อo~รuื]—™ iซจญญๅo๛tP๚\ทค๙สd๎ฺkฏ1{๖lbฑBˆFร0ฆฤb1-๊ฝ€tอ6'Eo6วผ๗ูgŸว็๓œH$ฑm{ Pƒ›ฎSJ8ำ€กเ€I0m ์=† „๊าคxูษ‚ข๐ทงขผนไŠfฎจๆ=J$-ๅ ‹ปซs๏:๒ zศ๒” ol„P+ดDแภUgs๊หpผ6ฮ9%ฤ~UŽใูi^•ย"=ท๘ใทส_ฎพ”b๚๔้ผ๘โ‹้ทž[ๅsv็r>ใŒ3xเ \ัmรa‡ฦOฐtีŽ|ั๐นวx๕ีW™1cFjฦaร†ํ๑ูgŸmิมr-่šอ&‹aYJ)xเใ’K.๑{<ž}fณ•R#ฅ”ล™๛\หูcมฤแ ฉ0s?=j๚€! ฏBฎๅ,b† :Sธบห{R†ซ˜Œjษ\—QฏสYŸ๛9Ÿ—ฝSู^จC)ืๅžฐ!‡ึ044ป"พถึ7ธŸ›Zm‘ฤl‹ใVŒCืฯมม†€ ๖"ฺ^ŽSŒ.ภ‘’e|ภ๗>€แร‡๓๎ป๏ฆ'B๒ŠBO„ PY€ตkื2eสึญ[—็์!>Ÿฑcว2aยLyy9–e‹ลhlld๙๒ๅ|๐ม|๖ูg$ ~?oฟ6{๏ฝwึqถฆ™ŸCกSงNๅ๓ฯ?ว0 ๏Ÿ็Yฉeทำ4๑๛ 6Œชช*ผ^/‰D‚ๆๆf๖฿๐‡?dตmsฺั•เฬ;7u๓O>๙ไ้๗{ฏญ“ัlฆค่ IDAT;ฤฐaร†ะ๕ซฏพfงฦ@j4)’s’s็ฮ5^yๅ•uuu3ผ^๏ทว™(ฅฌฮ์ป€iAU8h ฬžM„•เ5็ฌยdksz9วญ ไต\๓ํ_๐˜[XGฎ๐wัํี฿ีอนๆาu(ๅพlว๕pิตาSขพฑ ๊› ฑล]฿v๛ฺc ˆ;&3ฟ<Ÿ#๋.่่๗ท ~ฆ_–ั62ฮนภฺๅห๑zฝฬŸ?Ÿ‰'vิ฿…+7s{ึ9wั_ญ”b๚๕Lš4iณฤ็๓1w๎\fฯžฮระ]xjaดทท๓ศ#pๅ•W2v์ุญnG&ฉ2~๘!SฆLมถํNeถ„>}๚pฺiงqศ!‡ฒG1ไ9วพ}๛2y๒ไN็ธ-โ”R|๗ป฿ๅ๛๏ภ4อ฿ฌ[ท๎Š๊๊๊-nŸ&1p kN;Ÿ}&ไG‰ฦ†๏ำ†แฐถถvม‚๏ด๙~๑็k@"‘ภฒ,ž~๚icฮœ9ีฆiฮhjj๚ถa+ฅŠUึŽะง&์Gฯ€c†}มKาส†,ัI“t ฃ’›๓XสYVfึzjฎ#_ Z–สฆสง\jUj}๎nนOฝX‡R๎:)]Q' IFบทธฏ†fืBตBk;ดE\๗|4แ–0 y2g.-ๅ‘ธap‚‡xˆkนpƒบ๎บ๋ฎไ5ํพฑ9ึm )%sๆฬแ๘Gทวwr—nธ>}๚ไต2ป บหwEEEtะAy๛Œ7ง๙๖•R๒ƒ€;๎ธฃ“€๖ร08๊จฃ8๏ผ๓าว่.จ/ต]Jษ˜1c6lXํYแulฺด‰ฝ๗› 6 „ฐลŠ›๔D/1xpูKsๆ„f๘|.G!ื๊ีฐp!v]มฦัkkkŸพเ‚ ๊.ฝ๔2ฉ”ฺ้็uึไ'5๒™gži=๕ิSปททท[Jy:P›ฏ]^๛އoŽž}‚ ๚’๋&ฮgัŠฌคEทะ\๎ๅ:ะุA?๘ญœ}s,แฬ:ญฬcwZฑŽ”•žŠv%\มn‹ธๆพBmฎะท…ก=โZ๓‘XาZO s ฆฌร1ห/azโPiคธธ˜๗฿Ÿ‘#Gv+v๙"ฅ{ฒ^)73Yฟ~บตb-หโฺkฏeธqลฉ:RไๅฌฏH)วa๚๔้”––fํณ%ํหw+V0y๒dBกEธ๎bxไ?ฐpฑ;tฒ+™;v,7pCท๕:?p‡๓|๐ม้ๅ๎ฺ‘ฏŽB๕J)น๙ๆ›น์ฒหd0ผปนน๙|หฒ๔๕m€(* yๆ™‘ณซช0บz VสE+‚O>|1๋7l4M๋มYณ่ษ'ŸŒฺeฟ’ ฆฉชช‡O‹ลb็™eLF …9วภ‰ณ`ทA ข"ั'M–ป7ฉ0นFฆสณพำพ;ช TŸESฌœ๖฿{{#k่W๎q:‰hฮ!s๋ฯ,—้.9ๅ{ฃŽTมดจ;ย‰นยN |ธCะฃIQบn๘hฏ๛8…ฯ็ใฮ;๏คชชชว=ํPJ1qโD ฐลํศ–[วฌYณx้ฅ—0„โฉแˆIษc >Xฐ~๕<ฌZ฿aŒฅ่฿ฟ?฿๚ึท8๐ภ)//O?tu™~เRTTดUํ(๔ ฐaรFŽI{{;ฆi.c=ฆ~๒ษ'hถ1jิn?ุoฟeท ขุ\-Vสัถแ๓ฯแใE๘‹/Œ—m|ฐบบ฿๓+Vฌhิ๒—ิMn๒ไษฅŸ~๚้ ถmŸ/ฅœ˜iy&์฿๙œp˜วM*๛˜ศvืึ‡หx๔yล43คšŽนฎn๒[้cfpฒ๊ [|2ทm๗:D)ิ…‰@แ˜|่Q†T~ศ{าแ†ฯฅ wyสBฮu…งฮ ๒Ÿgฏึก:^Ž์ˆ~'€นHต#I!ว:ฌ๔”จว’๋๓บวพๅ–[ธ๐ย 1 ฃG–h!ซฎ;ัจฏฏง] ๚๕ื_ฯธqใz์R฿วแ€Hmi;Rห๙ฤ๏๖o็?๘BภOƒ[/ข#7@ๆwž:ด>[ x๑4,]}ฮฆi2qโDพ๙อo2qโฤผฎ๘ิปeYtะA๘ตฃป.…๋"ฅdึฌYผ๒ห”””ธqใฦ7~๗_ำ%ึ_ฌ\8x0$ปL6 !>9ร€ัฃa๔hTส9J็(ร๘’‹.๒๐้ง‚๊jkaK‹๕TeeลCoผ๑ๆากC‡Jwอ๛Cาt&lR[[[ณiำฆsMำ–๋Š—Iซq -ว_O†๏็Šx")๘ถ ็\ —บ7๔๙๓็3u๊ิdู–hแs)œๅฌซmห–-cส”)477wฺ็ะCๅว?qบซฉ+ืvO,่ฬeฅ๛ํทY=V[Ž|u,Zดˆฑcว"ฅd๚Dx๑.ฐิ–็˜ฐฑ๑ธ้nXSŸฝyะ Aœxโ‰๒—ฟฬrท๗ด…สไ{ธ้ฆ›ธโŠ+คโท‘Hไ =|m๋1nธแ๚๕MMพMฝ™ด'u“’าM๋น๗0gŽ]sีUœ|แ…ฯํณฯb_\ไL›ๆ‰”–šณ,๓ยššš็ž{Ž%ฅ์๖Gดซใ8ตตต^ำ4ฟWWWซO>๙คูqœ_ขœ๛๎ ฯข๏‚๓.|๐ ฬ9J-า7ด‘*2ฌ<:ฌฟิ:‘QFx๚้๖Aฆ^†R5{&u5w=Yห๚ๆŒถคŽT‘ฝ.]&sฌร‚8•แ wบ‘1ฃF0๋๘หน๋_E$r nู”เfžs๊ผD๖น‹sสx8ษG ?พ>žผ-’ูถฎฅ`};Œ8ž|๐7่wฬ[ไvกy,๐z`ล&},๏cธแ>s"ด'ษ_j*a`_7O}Šิ bน–xWฏฬ๒น๋ปฺไศ‘ผ๖ฺk„G)•9)H'๑N•ษ–[oๆนd–•Rฒฯ>๛PQQฑอฺ‘ฏ @cccบnฬญฮ…$๔+‚‹Ž‡/Ÿ๙4ฟ๗เfYฌซ๛’›oพ™’’,หโภไีW_M?uีŽBื3฿5I]ห l`f`\xแล-6$ึGฃศํญ›ฉ›‹aภภ๐oเฟไน๏ฯ๎๓ืฏ)-ฝ+qิQฆ3h๑e0h9 ๎ปื^{ว้ตฌI;‰Dฅ•••ต†aišf{]]]ฬqœวู}๔P๘๋ ะบ `ฝ0{brุื5หภUŸกใแ>]&็ปW Tp๎TZึ‰J9|ยเœ๓พวส๖o๑โ{๎๎›]Gๆ*•g =ญร?™ngJ˜;Ž๏จJ~ๆœ#๎{ฒ ว ฃ?2ž6ฒฯ!ํ9ศ(’r‰gž‹ส(—v.(0{2็”ใ™}ต|๙.y"HSnด๓fิฑdŒ†›P oy%์ทGว๏็ล0๙$7๚`๘@๘๋5ฐ็7~i—ภภฺŽ‘๚๚๚๔๕ƒl1ํธึชG่™‚ชฒ~๛Ž;– 60mฺดฌ}?๘cำ๛ไ sๆฑs]ล…}>3gฮคo฿พฮkkฺQศkฐrๅส๔r฿ช!ฯbk~Wธฟญฮ˜ Ksฦ7แ†K _ฅไอ7฿dฦŒx<๚๖ํห๕ื_Ÿ~ะศ|ๅถทะuษl๓บu๋าหปํถšX,ฆญถ†išFyyลขถ6ฑS\ะด•ข ธ๖ูGgฅj/ฝิ>๏ง? ๏ธใ>iŸ;ืR&Xํ••—ŠŠ‚ง:คV)ีeฬฮŽR ถ { !œ†††/ฅ”็๚}O9Vผฮ{ฐ๘๗ฐ8็หฝ|หไ,งฤ1๋?ฝ@๘๗ศY'ฒฌbคb฿)>\}ษฃ๓Mค๋:2ฮQ>๏ญkG๊P ‚ใ;iŸ‹ฌBnRฺฮงศใแค3ฮๅ›้Œ๓™utœ`ว9e^—ิอYeอฒะ3ืสA(ล#†r๎—ำผ€ปžNt|ุ๋‹-ๅ๖™mOวaศ!ี๋ึญปษqœ๏ด๓สŠแ๚Kเฌcม๋๑—ฺ๑วœEๆ๚Œฟยฬฒ…p;3๗Xฅ฿€’@ษŽ›XฺPiมƒไM ๘๏Ko0ด๘yF*pป=ฉPม)P~LF‹p(D๒!&๙เ’y,1%๙๋ไภฮจ#็Žู้†š๑9}:.uม)PM”’้ปkว๗แxSs+Ovฮ:.Œp:ืฆ๏/r—ƒ~๘๓nT{ช|†‹็fŒwFป.ห~H’&ํ#๚'Oำ ฿ <๚‚๛;ธ๓ฮ;9๛์ณณ.}๎ =s}!—m!!,dีชC)wŠาM›6 …ˆลb้i|-หย็๓QZZJUU}๚๔Igsุ๊–ํPJ๑ภ0w๎\”R{Z’๓ปeH( ๊๊\k~้Rใ–๑HUUีŸ}ถxYII)ฝ๙รrำ4๎"™ุลcม๗O…kํB/๔ฤœต=ื$อูŸฬsหไญC ่ย ข2๓ซf๊|CR–ล_๐[ฮ:ถK์ํ่IJ ชฮ฿ฐด"ณ๗†–aIeZ๎†ม#=วA{ผIฟ’<—(]Gแmฯlฝ ่๛]”oˆ[of้ว๗ˆqเ?ย™฿ 0ณ๋P.ปnพว]opอ๗`ิเŽkjpหƒ๐ฦ‡๎ฒฯ ๏b7.ืฒ๓{แศ้ค#?Y๛œไZm555ฌZต*=ej!K=_v๚šุึqv…:ภNVWW‡eย{ยต๎…฿fฟซnถmN Xื \~นรณ3rไH|๐AฆL™’ีถ5kึฐว{ะึึ†"|๙ๅ—๗ฝๆškยปr„๛ฬKfธ๚ƒฝ~ฯ ร˜ํ๓๘;ฝRF๊KAยNศธ_”p7t์ฝฯ๚…๘ๆ ดด4X^๚ๅนชขปvzะ†k๓ +ŸCฆศ77ราฅ‚?6๋ึญ3œ3็ิืoปํถ.žื๋-v็ฯIk€qฃเ๏7ร™๑tL'๎N.ิd[3ŸชEr]–ซŽ?ผืa €~ขT<"$ี‡ฎ2Ž“-4ฏพ๙6ีๆณŒผดฃGuxaภี์ด ็บฺsI ฉY๘4>สไ;ืมg๏ผใญ(ฮฦ=ๅ๖{้p้‚ ˆŠ ข ขh4V,[์ัK5j_bโ›ข)ฦ^๓ฃFลFbD ‚PŠH‘nฟ็œ๙1[f๗์น\:(ฯ็s>ปgvfžyfgŸ2๓ฬ3z›ฒB Lจอค]nr1zย๏!}a_Ÿษ๐๘รแ’ำjC–๚GKเ€Sƒ6? .<;ภ๕๑p๋#A3.<Ž;4ิ$„^UบcภO๏€?>ชž_rษ%!F^ศโmimฝตฬ์›‚รqฎธโ ๎ฟ~~8๎๘1กwนuฦUXQ.dกo )Aš๐Ÿแ๋a™๋piY7฿|37x#–eq์ฑว๚Gฤ&“ษซ๒Mตฮ‡]=ดำ’UKžOงІ๚]ฆ[_ำ;V๋์ๆl๓ื6œป๒ฉ5oYf๋ถก €๋ฎ๛i๒™g๎{{์ฺุก฿ˆ3็๋ปXค…{คTB>›…ฅKaฦ Qท`5ฃฉ‰G{๖์๙ย•W^ฑ~ธซœM2คหŒ3žอๅrC,ฎฟnพRฺ!&! Rำˆ๕—+ค๛7ข^kr+TFz›Œฃโ(ิ•g๚E๒ฌๅๅซW๓›wq๒แ2ฏMŽึเ(>QuRป&B‚Hง];้Dธ๕2็ 6|๙8ร๖ำ๚$jีxสˆ๗™>rBํrD๑P5 คƒืš€>ฏ=o•ใซeห˜9้>F๎ึcย๑ใเีwิ฿สR๘หuสื™๖u…_ซ๛แ๗ใ‚>๓›คๅ/)‚๏lง’ieฅ0[=์ฑว;vฌ฿ŸA๙‚pcืธ: ั]วSO=ลูgŸ ภภ>0๓90šƒ๗ฐUฦ„ ฅo!ฝพ ธVx๚%O ๔๎›๙๓็`šๆ ‹-:ตบบšo8าaศ•ƒ+Wึ,ฅดจxhดc$.’๑บ‘yษeVohุpj}cไฆต|~๐๛฿฿–YธฐvAS“ฦ4ตจ๐ฆญ ฯ"–=zภฉงสาkฏอ~ำMู‡วŽปfแยk์cŽ1ณ:๓S)๋ถสสส9ไค”’l6KuuuW!ฤ'๏ฟา\.7ดผvd ฟบา๎K๓ฌศธ—˜ง&h๙‰ๆ—‘2šๆทษ8H@ัžn?ˆpFแฅฉŸ$ฒWŠหหY_SไฟƒFGkqBJ;D‡ว€|*D˜‘‰€š ๕”บ'ฟ{1฿u%รS,hu๎8fŠิฺVด/าพยๆ2h“ื^฿I=ชซi๛ณถค3พ€7ฆxF€ขค๛…ฒถ?šs!`๔ศ๘~ี๛ฑฆ–ฌ๒: D๋^่ึI=ฟเ‚ xๆ™g‚n4๊/ูDฎzพBqœqL˜0sฯ=P๛๛_พ_ๆ[{\‰€ฯ‹่u3p่เq‡Šใะ<nพ,S๚ยX›Jฅ.ุ้ฑcZvMุ๗โ}าวT?ูLšสŠากVาภJจŸ™00,i LC๘Žจ ค+{dจ“Vฒ]๛๒๖๏tจ่๘ฯ.ฟธฅC‰ ฏB)๙dบoศึ] ๋=ำ„ฒ7ใจa™UVยa‡I๋๒หe๏nศไškึฯ<๊จฉอฃG ™J%๊—.]บXJนOE)ผ๔ฌฮŠช&|9ชทEไcั>&ฉงน Gำอย‘์f[ ‰๗๑ Mู๓˜š&mcWŒ๖ฟ้h ฃ ’ี!ํัแั*ฅฆไJยa0wW๔๎ิ}ท^B:…–!TF๏7ฃR}%& Aฝฟ๎Ux q8dุุ€$<๘ฌŠ๚jซู‘ƒƒuNคฒิ_žดงฌ†๎ซ5Ž˜{ิš๛ฌน!I… Z2ใY่PฅEฮ:๋,ž|๒ษXงxN>ๆ–ขeขๅwEฯ>๛,งvน\Ž6ๅ0๓yจ. ฯญ6ฎ็‰อฟ‰8ผ๏%Z‡`9pหEะ8 |ฝ๒ฺ444ฌ(//ธWฏ^ปtD™œ“ใ…)ฯพื๎ฦฌัTกSๅYษ”a$’ฯJจk2i’Hš$R‰”้>˜–ZJ๗8จ฿็พ๒จ~ล้โืิฏY:เ’~ฃใอ ›อีี]fญZตOQ‘@สb.คโm hiIฦkC–ทA๒Sฆภ๘๑เ8ง*๚าฺทแปƒ…^๕šฦ๋Mky้yižFั’}z:"mัษ๑ว‹.๚ฯห#‘Dยวํ?s/๔ย{ zTWณhฅš%y๑ญ€ฝ{ซ€0žR$Q‡ฐ|2/ศ3t ึžP็i„เั‹Whดh›„9/ม€=”เ;v,W^ye(F„.์ผ๛ญ;๋๙ •ีห์ 8วแškฎa๔่ั8ŽCž๐ลหะ.…qดตฦUL™-ล๙i:ูB€)aP?M-;ฃกกแย/ฟฒร. ฯ๊pโผfC‡vmo-ซLY‰„•TฟDา ‘2Hฆ Wˆ$ด๛ค'ุS*ฟi „Aธ๓ุฐi JŠา•6ฮ็ฯ๎pPœP7LำtฒูืซV‰†m๊Ÿ €bk-Pใ^ทถ€7ะFnฟ๗“.๎,› Rยฺต๐›฿ภฤ‰*ํœ“U8ล๓CฃIDส๙–b„iz–—ฯจe๐฿๛(้2y๗"’ถฉ8QดŸ+ิ>ฅ๎แOณ{yf}>พ=u}‡ะัD๑พ‚M:— HWลค{าS8์ บะŒว๕rย+เ)(๙คŠ T0wJ'šWD/—Tฯ หฃ„Oภบ *๎l1๒Šฯ^X๐CจXํ่(<3Lkˆ”j฿๚ฌyส)NoKU>|.ฅา๎ฝ๗^๚๕๋ว’%K ฎI{ใึ˜ใTโฆฐ ีนณแR๒๕ื_3`ภ๎ธใฮ>>~ฺฆ‚ฑฎ“-W๚๛Œษปู8tt2@‘'๐$$ๆ2X=ซ8@Iเqร0fw่ะกรฦฮธ฿ภvสO(ํำ}lืฏฺ–ต๙gIIชดฌ2ฉ,nW'S&‰ด้ lSื…ธfม'4แŸHธ‚ๅ?^:ุ9‰™0Hง“้ŠาฒทปŸy฿hฤTิ‡zศยตkEMฬธ๚สฆ๋šQ๓ึ๐‚x๏vฉผ|๎oSQx๏=ธ๓Nhj‚6๐๑๘ฯ5‡7ฝ=Z_@ก}dž{๗าอซ ถจ๖์็‘lŽDคYเฎ้ซphQฐ|i™|๑ัd๚v฿มtด‡‘Fฆz‡G‡๗OFzLJ_.^Bvํ$๖่‚o๑ฦAจmฎR;[ๆตK‚0หฉnม3< ˆฆ ๕พิ‚dฮ|u*šฝบ„๛EXบRSzPมf˜‘)h^_ หW‡`ฺ๐ศอ๐๚Cjฯ๛๙๓้ฝ;ทrKมฐอัi้จSZ\By •ั8lๆทฟ-ีีี|๙็ฅเฅ๛แ๑[ภาcOxๅ ตหปู”qๅๅฺู8ttๆbžชL๛?x.ตไ8N•+W.ถ,๋ฤ–วŽ)พGบwรฟบ}พ๒Šsgœnv?ผ*ฺฅฐ’+!มœสึษ”~อฃY๗Vยภ05"๏อ4;˜ฆ •Jฅ_๐ƒ=eฒมGn๑ย /ฎ^ถ,Wใ3าm (Ey Cภ-แฏญU IDAT!_ภทา™-…ึั=ตQOห๕ญรแ}๛ผ๖šJyฌ๘์ำ90๐|’4m[7t}‹Xณ…๑iL6๏'ร๕„xฉะpn*Žโ}ไบ ๗k-z–ป‡รE๐ส+9๊เLูŽํAวฦpHE๛2UNqฎจm์yฯ/[ฝ†๗งŒyห:žEฃ—ื จBŸfา.>ทroŒ๙ กนน หจgฝf E้ OฝPดฑธRฉ0ฏoB ัlš๐ู<ย!o ๐ฝl˜ งญา๑‹_PRRย๘๑ใรŠก oŒ›โฮ๋ซ๒rRQ8^|๑Eสสสธ๑ฦ8้HX?พ{D[i\…‡าVว‘—“ฯ๛๖๔ฑuสมฐd"๔T็E&&‰?e2™ vHiณ๒ๅโ๎M“๖ผ}u฿๙ฉฒŠ=E2AYฑEช*๊คI2e„ฌ๑dฺiำ๋ษd฿๊บ W‚](g:หใOยn›mLKP\Tิล–ูฟ๊[ช ัาศf™QSณใ’(k=:t&โyฉื }kผG™ฎ(ด„รfฃ๋๊ž0ฟ็u,ภ—มw+‹$”Wh ’gyVO่ฟ–ŠA๚้š‚ 5…มฃษ๛ C๕l*’๎ใๆAล!.–2`เBฅฯžทjคo‰ฑ#่h @œ<:คภ๗๗๋ Qฯๆ.\ฬ;/฿ลูวๅ๒Pีpx๗่4‰€๘ื™จD ‹๖Aโyาคฆไๅ 6ภy ้ญั?Xิ–ษTฬ–ิ†ๆC2ก๒๙ึ\”Žศึm€k sำ†gซ&ร{Ass3ฃGฆฒฒ’'Ÿ|2ดพ๒qฃฯโœาtˆ ใํ‰รqžz๊)*++5j ุVฝ/ QV„vม–Žซm‹CŸลาЇาB4eดmพ๘œx„z”หๅฎ.**z่ฃก‘Kฅe๕›Žo๏ 5m;๘*Y^ตงH'ฉ$-[ŸbV6้{ฒ{kแสฮ ๏TฯJŠะzปบพฃœ๚‰` ^ƒๆFร‚’โขใ๛_๓ฌœญ–*หfณ$%_ฌ_ฟi(ก๎๎ ™Xz็ญ๐fค‘<:]่ท ิ…€„+ิ_n‚__‚๘! Q๋ษG)CใบE S็!กดHCๅd TดGขXm}+8ฏ t฿ฉ‡ภ kW‹™๓c?Lฦึฟฅtุ2มำ๏เ•ฉ‚œฬ"›Œรฌ@$ปนy‚xkฬƒŒึ!ม0๙ืหoฐห‡8๓h;x‡ร“‘1 iPึ๎ฝ๕สผgF1"ู+ศฉ.H่HผŽa0ํษ4@Rฅ,šหASŒฟHYQ0NššU์…่,H^#"`๐้\ิ7'ษ{‡}ปL –ผ ‡๎555Œ;–T*ล%—\Bmmญ‹W๘ื8วณ่ณBๅ…,๏9ฝm))% \yๅ•คR)ฮ:๋,jjjฒ|๕o๘ไ)hW๎›_pว์VW‡7ˆ|6ฉC–7S)ิrร „‹NWฯl3qโฤวฆNบไ‘wTwฏKซK็๖๗gง์gWท})a&`มก.แฯฎN’N _0GwR[?Oz{า ฏ™' ืทย฿โฆ๎–&ิฝ”Rb็rYI"a้T๚7ว|d:kgn†SRR>w‡n]Kกฆแฃ c๎ฝัไ ถฃ้>KเeBqL)š/Fจ›&<ด 4สS๓‡๎เหำz#ŒุไBำ’e€ึ๛๏iฟ~>ํcฺ/ค-๋u@XฃลjฯณJ“.Nื2qำซ œๆ3i*+>ˆSGุ๎`๚t˜ฉ^œyๆXพ{๚-,ฒ/แ็KX[ŸŸฟี8R"้ฮžŸV!UD6ฟฏ\š/_มรw฿ย1๛พรเ~๘ŒะซV?]{†~‘€L๏f˜4œ>nWก’*ฤŒ—wฦฬุณหŠ-h.ฬจk๋5F๋ึUYเhl†z-…>[บ %ฌ^+ื†iŒผพ๊R“„ฺi๐ฃsภ วร?Lyy9•••y็ิืืทh-วฅฺึšzถŽ๚๚z๎ป๏>*++)--ๅ{๏Eใ๒ณ fผ๗W่Vฉ๕ะ๎ ๔ีVWGh@ฯซ๑ึธ6่ผำpเŸรq๎iธน\nฬฐaรn–ŽrŽใเ8๛\ีฃ๛€ซ{=ไ๚ฝ;ถฉช}eUูฅa8ูNsูะŒำะŒlฮโdmV4Hพhถ)rOH็ญ“๛^ํf์ฺนg{S์–ehบpฆ)0Lก)N‚ๆร%{.]? RณะsนฉTjฦŠล1ฎ(กž ฬMโ8K\šƒrrซuŸ๋ยZhฃ#4ZodMฃ`–{ฐลwƒ_]Žšฆ—šฆชก๑n„–าศฝ,รZsศชั๓ไA†ต-6‡€ข}kยชฝ"าnแjฬeน๏๎;ุทำ+ ธ ้จฃM,H‡=บuๅฒ+ฏ'S5Ž๛ž-ฆฎ9ศ฿*ˆโ€gน}ฅ*Yฒr๗๙[ส๎แข“3คตฑ๏\F่ˆ<๗๓ศtVภ=*5่ร ๑^ย๏ทด[๖ซฅ_๓ีง/p่~ ฯ~{ชธ๋^Wฬ๙JHฉขยZc-รŸีั!ใi๒ฎ–้Z้^h฿\ก๏ฃิ„;ฎ‚ฆi0u1๊jk7nฅฅฅคำi.ธเfฯžํOหทf ™,ฮบnM=-=ำ…_|มE]DQQฅฅฅ\qลิีึp๘0๗Uhž๗สด@"กwšพฺาqตญq|ฏั๔A$L„‘…'o‡พฎOจ”๒W;vง#ekมถmวมvln{ๆถไW๔์=๐ฺท๙YU‡ฯ~vEY๙Wmส+ฏHฅฌด•ค’‚?n2z’เ“UrM8Mศฦ 4e˜ธฮ๔งษ}‹ฺณิ๕๕r}šถf๎ s๏jX–ภLLำนŒฦฐ”@ฺ‹•R’iถU~ำบrม๒นV๔ต๋฿Ÿ/ฯ>›า–‹ถุจ=ใบ`๖ฎŒIxtD. ค้‡รYู uิิ(๙ษ‹ฐ‡fxkŽz;t๋XDฺ้๕ญ^F'มo‚lวFฎ›„#ฺู_„ฤAD+ั*Rb มณใ'ะฝ|:Cี2๔ั!%`ภoBบ:–Ae””Ce*าiD๕ด*+ฅŠŒ"รเiPณไŽ=4ุ&ุb_eะ้'*ƒt้๒ธ™T‘oพ9‰๕Kรจ‘)O@…_oจN/,f(ปถ!Z^LT!;!ดำUvJ8๏)ํC๘ ฐl๕j|แNฦž 1ค"Mร€aฮ—*Oฏj๘๓ƒฃ/‘*โ˜›o๘a๛มOฮU๔wฆ5%tีŸKฉฮฮnW๔ูฆ๔•๗Yฟปเ๑ชYLำไไ“OๆsฯๅฐรฃmถณธmbQุ”๔8๏๖ตkื2y๒d{์1^|๑Etห1„ณO„[~ีe ะฦy๔ูถWG‹ผศ๛รซ๕Yต^˜g\ญ>uร0&ŸvฺiGŒ?พลูc)%ŽT<์๐Ÿ +ŸฟxมfBžฐ’วHGM&“ลฆaU’XI#OแPท"@กั๎ฒ+ช:คฐยPtxดi Cิโu@ธใ€t$ถ-qluตsj๚ฮI์ฌ$—sยืฌšZWS์ฝ๚ภ%`˜‚6Rdฒนฆฺ†ฺƒCM9๒จโูณ฿y็าKณไฝ0๏EไŽํจi๔B|S`SสJ ˜ณžzJ%๕ฝวže่ .O–]ซ๕˜p J‡/k)ฺวยS฿FqTœŒ(=0๒=ช;ojฝ1“แู๑/าป'๊ ๒Mยัภฺ&tœp*TWCc#ิืCmญ:8งกA)T6จ4๏y.'จ,KS^Hžะฉด๏=ฺC๗vP^m+ M%”'!Y~0ฒjHแ8 ๊x{โปฌj2'™ฃ]Yกul๏ฦ๕น›zกบๅ(‚ฌ: a5)[ฆพ?ƒฆ•/pไ(G= ว/[๎Q%-x tlะešpืS๐Ÿ้๊: ไฦzะtฺVภ‘ใGE’พ’I๘x>แเล7UศY„”••1lุ0† ฦ!‡B๗๎ุ้ฑ#%%%~žh™่ิ9@CC+Vฌ`ัขEL:•w฿}—ษ“'ณaร†<ฺหŠแคฃเ'ภ}ฬfผs–๗ีŽฤ!๕๗A4?(C8ฟืVYOY๓ม0Œ\›6m/[ถ์CG:Xฆ…f-๚ฬ๚๎อG๏is„i˜฿5 qT:Y”vฏ&ž4ค†!hื%ญฦƒŽ˜q.<˜฿~a ช:$•ะ้ศEm˜žPื+V๑„yฮ่Y%ฬ๓xึ!—๓ซ4Y DKช:คNาL4DฦงŸ~l rเ๓ใฦeOLฅZ˜zฯกlN{‰ั7้บ)?ฝฌšoiT่๘ h‹ก:)๐\ซร4แษ 0๋s•๔ฺร0r ๖žดAŸง,D>Žธ็ymŽท๔lS๊,XO:ณ<ฏlรเฝ๗ฆ3{ฦŒู@;ฯฟa“qดŽŽ5อฐ๏ฉpย)Jจทf้Gท…~ฆป‡3—SŽ^MMPWKpาYœภัก`*$Œ[ๆQ…F`!ัฒnšaภ“`๒ 5?|๖์ฎGŸ’‰cช:กiJ๏‹ำ~%ม–ชZ3แชƒ•p}-โHtƒ—ƒฬA"มW‹3้?๏’ศ~ฦศCrด/'8usqด’$,ญUงv ;โ์†่Œ‚แugO9๐„ฦFu]ฟ^)ฏก^ฬhWกฯฺTB๛Nะฝƒ๚ตญ‚ฮ บด/ƒ’’œ.ƒ ‡ศ9๎ฒ‚D:๎tฐฯqิฒว๘๑คG๙ีฒ‡DŽ~ง กขธ]๓'ธ๓1W ๘หOี9็;0 ๘ฃ๐gช\I๎นาnิฒธo$4 yก->(hPˆ‘{}K}็ม–฿ๅeกŠคยPห‹ืยฒๅฐb ิ6ร†Z๕[ฏ้ฉ,ƒŠRจ(ƒา4tj ษสnฌ\3€ี_ฯข"5ƒ๖สัฃ#๖ฤํAวฎˆ#ŽF็ฑ]๓Fiยช‹IKส๘ฯโr>YULCฮภิํ=ถ„ำป;œอฆg‘rfอูณkเฏ “L[oa๊ H™””'Vไ-ฝ่\“๎qบA2ePZ™ภ0ิ ™'ะ}ฏtฯฉอแ:จH Žg‰วXไ๚5O€g๒-u;็9h า%mS89๙qจฉMMMTVVŽ9้คๆว ศืV7$สŠฯQŸ†จภ.t%rWžH^ศีญม3’…€w5เห%๐ม?กWiภ่์๚Gข pะวเYtฺ-‰(ฤิฏีอS‡4เญส๘zYŽพฝ้ื*‹)8ผ986•€•ะDsดoฮณซ@ิุ๓h๐vพ8Ž๚ๅrJ)hnVณ์มฺต๊Z[ ต5วIPV’คดฤ"—Yฯภjๆ _7ธ{`ๆี”*o,6ํ†๋ั}ปม๏ฦฉฏ^ž up้ญA{‡๏ืŽ ๒„‰sq ›quดjฅ7>2ร™๗-„ึไใ่ˆ๗๚8ฎฬ–เ 2.ทŽํAวvวƒT๊้R ํf[๐แ๊&}]มGซJ๘ช6‰-พ7—ฮ{#7ถ„ {œ฿[‚0‚†H™s9™ณqฒ9~น ˜๗j’~ู’Š–ฎ\่•‹H๓…v‰H๕dส คB˜ei'ซ‰ภs]sd๓ึห[ฺY๗>,่ํXžหJท%ษคA›Ni[ฎ…šHงำKVญ"#ษVฮV๒VOhi%02S๖hWฝ๏โนˆน/$ฬใ๒ย‡S‚aB"Ueฐ" kRM j'1‚อ]๛ึ๓{• "8wQจBฝฮ˜2qH8jP- ่ศ{็[Šc้@@‡"˜  ฃฯ†6mv=ก^จฝZ „Pc+แ~ํชM"e๕ัe…YBศ๓8Ž™ง%<~;œ>Nฝ‹น‹แฏร#%ซข.= xN•™๒!์ฟ'~@8๖‡ w_๚<>ˆะห1xZqt่ ๎}\o)Žจ๓ึถภฑ=ุ่^8ขขมบ&‹ื•2uE9Ÿญ)aUณ…#ฆศว•๒"…Fาฃ Bpd{›๓๚„•@Xฆšn’€mใdm„aเ!%ฟ๊]ฯe ,อชตทTJ)กq\gtํ\แ๎๕ur}2:๏gธH„๎4ผ'‚ ผo:T‰วจ๕D]๓Rmuๅเ8”‡บm}๔ศ/Vญšิ`Nr w ฤƒ@ (ŠควMู๋etำ”/Yผg๚๓BสIœ"กีePQห—C๗ฮ0y์฿ฒ‘z#[B๙(ขำ๑:/ฟพž*c๊๒ตa๏ู.ˆC่ถ˜๗฿บ„ร๏แผ๓ณปคP฿šGป”มQจพะี#๏j5 nบ ~}ŸJ~๚ ่ะฦw๋8v(ฬ ๓Jบ๋i•ง_x!iฟQ๊๙ฒUฐฎช“่t%Vo^๔พ%:<^—Ÿ{n7Žญ‹#4%.MGŽษ๒ฦฎ+ๅร5e|^SLMF‰_ ฎ,•ฮtๆ=หK1ทBRาฟ\ maˆ„‰H˜เHd„#‘ŽƒฐR๚–9ฌjL"Pษผ6F‘„ฺ ด‹'z4ืNย=AJ๗Xc๗›t\ovท'qต|ๆล๐(x@lj“จข-€<ว?a๙wฟ;ธฦถฉ,ค™o0PeRZšgษ{๎ััืRผหป‘t)กKXถL2๑ฺ[pษ( ‰๕EM`…f"8|2DผNโ Lเz&ฏZฉG๛X}ปซโHuงkป๖L๛๗8;nฮำDUีท[จทBสฃงH9๐‹Kแซฏแฑ ู๊=ฯจHqƒ๚ซW’sเŠ3aๅz๘ฬ m๋‡แึ+ {งฐข&tFX@โฬž‡jgซิฉฅ;T"b้ 2ฦ+–ปqด‡cagА9 „ƒH4๒ตm0ทพ˜/jJ˜]Sสโ๚4๕ถ‰†ิ^ญVน ฉขcAOŠfhA˜ฐฏีค8ถC#iก,M™sP~&าV?\กน2g0]–๘3V"ะ|ขVบˆiทฮงT>!S(g7ฯแอ@๕'R:ุF๐พผญjžงป_ฮฮ&%เ(a/47]บ•x ๐œfMำ๏คšผ>mjj2์๖ฺ่ัซN$ไถe ฅ๖ูจ้๗ธuv=oK7†'šทP๙้3f*g';?<F“mcmt‡ึง4S$NกŠฎว{๙ฃ๋€ykำป@V†โ % –ืqภˆ?sัลYสหw uชJเ‡Gƒa‡‚>ฮ|f/œx฿AWކแ[†7 _, ๒๒่฿ฃ0…{iŽวฆœฮ™ธ1โ)}‘ฑPˆ},BXipHภ„&VืBƒ{ชcย‚าbๅ4i` |'ฎfšrะุu๕Pื๕uฐขj•ƒ_]ฃขืภ_J6ดŸ0Pป.R Jฺ$)n—F”ณค!อIๅ‚}ŠMํ]Iฐ5hฆ>๋pใชถฌtซ;Zฦ๊6N2็ ศ๘๚Dลc ธพC{kžบR*žณ‘นo5คyดฑ2tเf(บFTJ8์—hf?ซ™"lึุ&ฺiๆศ4า}™"L‰„แNปCํ๚,†)T`}๋šป~๎}žะw-kบ—ปqx‹zปQฯ๗\pvCq™Eeป$vNฮˆ่TT”แย k;v,ค'ถํดN ธxไZZ›ฏฅบ7&ศcžKฉœ–}Wmcil‚ ๗Bปt0ฆB ส$6แ ๑u่.Œ0› mก ;=) หฯ๑ฌH`ึ—๋8คป9‚B]‡<ฎ ึเ6๔lใn‡{ž ๊9๕H8็ปแณั(LŸญ๎pู้0rH๐๎๒ฤ@u8d?6บฮmk!: Šๆูั8ค„้sa๘๙ฺ๔[ฺํYฦเ ๗ ธ*‰Ud"mplวo„>ฝ,ึญŽฮiฐL„ฉฤฒlmdึFfs๊šษ๑ปบถฬqRA๙B๏8*ใ{$ฝ`}yŠ‚ ถ กไRBาหสQ"ึ:‹์„VทศซOวูส๑“ฒ๕ค #Pฺ ถญ๚$›cENp]hฺษ‡G$••a ๊kr8ถฤ๔ห˜มปฎJGYถพ]๗zฯIMx‡ƒษDทฐ9np-‰คฒ}Šโ’๕M O่‡Œ๐๋_–ฝ๛๖ๅ๘ถmi้dA%ฐฝ=้M๎ฏูySๅ97Ÿทoำ— haภไ}9…พ*>Znc P9๗ึด ธVญR OผœŽ %ช•อCซืมšjv๋๗~™h{ด~ ้!"จžhฺฎ„#ีJนย^ej_•ๆธใ2๎วำ4ศมฒv uP๛ๆ‡๔&ปom๖บ#x๖ี ดoืDU ? *ชเตษ๊๙œ…๐ม,8โ@0่WG Mฅ>}6ฬ_ขขษ๙Œ*2–ฃณ1ต๕j/สาฺใ}'z^-ฝัผธ๙ข–๔NC@u{8`?˜๔฿€8[ ž‹ก๏AบฬยJ˜*‰ฉ,D/”จ้ํถ‹Žฏฬb$)ub˜‘0/ฝŸ))1>0หฐ,ฯ๒tร’Zมฯฒผ#>ร?Lนp}๙ๅยu oทe…q'†eฐมฐXm$จท,฿ปtรจZยPำำ’Y~ZQC2•ภHYˆ”…HXJษ1 ฝ— 9ส^วฤDxBฺุ ฆะฝaิ`cรujKll'ฐสํศีษฉ{'งkQไ‚i๚`ส๖"eบํฌh›ย–6•%Uwๅฑฤl6g 2xh๛๖ฝs่มŽ!<กํS จhซยF4วy๊€–ู aฯž๐ฺŒx.็แำญT{/\ป$!‡ฃ-ƒhฺ%qH ๊,(๎wิ€ิ๒ฬœปŠ‘งรล—ุ”ฦไ๓-B‚ฑšUlB๕-H™#ใ8<๗์ชหf2|˜๓5 ญeM๎† `ฟพAฟฯ] 7฿Xๆ%Epหๅะอท„ไ2zVรเฝctๅ–,ไ8:"cPท†Cห?; `@}^yx› ๛œ\อเ๓z…์"gDห๕๘M‘^ต+i) Rำ๎ž5*3ฎ…žษ"39žu*˜hT†๐ผํ™ˆy bฒฌOPเo(s|}"œ^‡““ไษ˜d-‡e1ยํ‰“อ!39ีอ9œl‘ษ๐hข#'สB•J)iจอ๙Šิบ•อ๊@6ฯ2wญ๓ _0๙๏P๎ฮu่k…:S‹ฆทˆยห[เิ2(เ0นkโล*r(*PฆฮZมqง=ภธqนoฅฎwแZะ+Wอ๐—ซภศDŽg)JE๛A›ัํŒ๕œŒ๚y๚uœษ^}เผaA๙ีJh'\ทูœญไfไ9p/ธ๎ ‹พv-ด{™#ฎ๎‡๔ผจ๓ๅhlz{รๆ๚ิZ’ฆแOนใ่๋ฯjบuQฮ+ษ6˜:ฃŠบ18ผ>ศoP๋„n^]1ธ ใhฉ>…?ำ์ฐ—lไโTฒส-w?นDั๏-;ds8™dฒฟ๒4f0ดz๋7ไศfฬจูกaCV[;Wฑฃขฦsv 9าู >โฎ€๗๎ฝ`Sา‘TuL“JNMCฤ7nžvL,+<๋ฌ3|๘แKำฦŽญ๏ณMถฎตYT$Œ8ก[่K ็~ญ[ –/‡‡ก]2oํŸ/ bฏz[๔๖๚๑Hi…๐%pค๚# 2ธaOฃ•Jษดู+8๖ด{๙ม$้๔ฎ/ิC~๎ตฉ /†y๓เห/๕ƒ‘รเ่ƒกW5”%Q‘ฬโS๏ฺ๖|H๗ฅ กข\mhhไ‰G๎ๆผ“j˜ฟ พsฑ:ีƒร€+FซbBจฉ๙ฌ๔v IDATซ:;ทบS‚ณพSxผ=บภเ๘JzhM=ขค#ช4ฤ”ั๏J8ผŽห ˜0ผ2I;H'fย`ำปqะู=H—Yพ ช<ๆ]*ฑ9ฦฉaoูHยฑq$ฌ“ฬถJ(‘ฎE p‰OWC‘ฟ*Whผใ~UBhญYJG:าAMฯn[tณาฺ‡ฟ”็ท|คก ASƒM_ป‘๏‹u˜†กขนI|oyr6Nฮฆ.+นงขŒDl฿:ถdๅ’Fต}อ€ k28ถ๔f๑—3ดw์yฐ=์๎[่พ€w\aฎึัฅ ่M$m;งษๅงฎก๖„™ท}๙j,แฏไ๛๏๙ฯอ7ห›c™mHTฌ๖hุX" ]ฝถญฦฮ—_ย_ภชะฆ ูއ R๑ใSD๏฿“Zz Ppฌ Qแฮx$R;ุลํC!Ž<๓ฬ๊๕_zuG^‚:&8~8œ{‚บ7 x๎-x๊๕ภขฮ;ม/๓฿…p์p(Mโ ยMข#ฺ‡ไ+ 8๓พฑ]*n๛ณแฦ?ม”™ส€ุ(ด๖;hทฅเฏ…žฆ๔ฉ]ใ๊‘z{bž7฿นD1Bผ7x๐เ‘S฿›า ‘‰๋ฑf !OHพฒไฃัฎM:าNฮX๗บQ“[“์_~pๅข๚Y]$Nw[ๆ:%ŒtgหH๎™ฑบ›"QiVฉ@”ƒ0์,Nฆู1สคอมูZ๚ุค› >K”03UNฮล%t:o|ฏ_ีฤ†5Yึlสf5n Œ๗RฅKทใoMำบ8สๅ vืb๗gห%H$ํ:ง1Lƒฆๆฆทฮ<๔czสฯsฑฏะ๏ฟ๖Z..+็ฃ{Žtะ๚มธ1ˆ`- ศอจ_ฆภHรoภdืนจคฦŽ=ภล%.o.*่d๐ฤYฏฝะH‘e…Xแป3ใภ„.7w|จฏ อJ๗ฆ๎”๕0qๆRN;็AฎธB’H์xกฎ+3BจซW++{๎\จฏ>แจ!0r8  D6ฬ8Bก6i…ชๅ๕H"=ฺœN ){ŒE๗ภUตผ๕๖ปT๑*ƒ๚ช๐|~๖gฅxx0ฐ\3Fmปx˜0)<ูWm…KhJ–”ฐGw8 _ 6‰ปี๚fซ๖ีNŒรƒ5อ๊<๚‚ หป5Aต#แฑ Waฅค5tx๕่•F๘ญ”€ yฎฏ:BˆKŽ>๚่Gxใ ถ6ไ์,B กœm'k€แ<97ึคeOŸcVปbณดL บ ุ฿4] !ฺ˜†๖ธi~|9ซVMฝ ศfjืd5tฏ?ผพ๑ึั=w}๊=lฉ{Vบท *@yU’TฑI6›kXบv้_ปfzยLฤ‹ถL&c๔้ณว#F,ฝณW/g1Ie•ว 8ม7ย‰”‰K'๒ผ%q๙ แHE๊57รC)ๆ ฐGWxํA่>ภ๗่๕E…`A}Dš-ฆมฎ…#ัv,ธkฝ9ฏ9(-ยR žzi&W\๗ณ 1Vdป๓ฉฑgฅ{Z †ษฟ๕:ฺOขoงใ'มล7…=ต‹Rpแ)0โ@…๚๕๗เ‘ a ฒผ~๔=ตLเธžฟงŽ„„*:ถG_ํb8๊ ฃ๓o€ผŒษอ๊p๏/เฤC-พซ้ฒจ[l;‹B\7sD)s—$ฬ๔9–Hv ”`—^ฉถ ~6mญ๚Z6ใPใ ๕HJ K_จ๛GชjBw”sืึี4ปย(‘—Y—%lจฏ๛้วšwปi('ฎXึ็Z่วsŒ๑โ๐แŽตMฆ๕3ฮ7&X†i๙ผ{K๛ ยึ>ญฌ7GฌบI๗Bุjy–,วWnดผpt)Ue๕ฺวแUฏ๕uŸŒCฝY2œาEvจ๚ฒxo๔ฯ@j7ยไำŒใ๐๗Gฮ‘ฬc๖B๛3๘ัAป%เตื4ี๊ี๐ีWJ`/Y"่าก-‡๋ล1‡๗a๘ม=ฺ่น ™ณŽเ‘๛;cF~Nฺฟ๏@1ก •ยํOA,ƒ(Œ#่๒37AไePย"ด~‰m<๚เœuฬbŠ-ํ0k œ#|๐Yธ ]ฺร'ม #ิ๑…7ภผลแ<}ปม๙'มI‡++ำุ่}ต‹โชฯ๏|~v;4ทrฯ{Q ฎปnผvห฿๚F้ˆไ‚0ใK8แ2u๚€išsสหหOXทn‚ึตxวƒm็ธjฦA{[ฟLฉQฆๅ1ฒ†บ,ŸฯX๊{สๅ$๋W5็+bบ@—A”8]จvpnบฎ8€คคmS/C๗…{žƒ›๕แ<:มชcˆ[Eว๖่ซoฆอƒณฏQ!~ฃ,ฐผฎฝฎƒŠวfัแีฉ}หq4J^žcฏ Yไ_งำ้S๊๋๋ง๚นฤปH)นแร]ฦ๏,#1ฦฆัP—ใำwื๘๛ิึฏสห:กr€๒vืzฤI.๚๒ค„ŠvIตV๏ภบบ ฏๅข๛N8fะwฯ:wณ†ฎ]ฉฟ์2Šทšง{=๑ัโ๔ึ$P‚ฒ%ม]๊ด๚tโซฯห็ ๑hoY ฎ\4๖| |5๏ะเN(U”ย]?‡1฿แ:ฯ ญ}กฉ.ยยQจผ<ญใ๒์๔8’ ๙, k‹JSอฯ? bG,1bpŒ.5\u•็|ข„{"กม๙J`/Z™Fๅล*ๆxฟnNˆชK ัฯ'ฬ่<รLื็{ฎ@ั ํส4š5๐๓j๕F๛K๏ƒh๋}ํ๗c\นถ็"ำ}๐ฝZC‡”`Y8xŸคQ๔ฐ‘K ™9i•t\k}eณZ7‡ภRwค @ใx‡ท’Sž๐/*ต\ซ\ๅPW๓ศษŸvูํ฿KžEA‘้8ํS/ฟœก‰Dก\ญo+šลญGีะง๐!_„`ิzPHˆGAX๋^=ฅ/๋}ภuupฯ=ยihจด‡nN%๑ํ:œลาฃตฑP–ู๊)pด9าGป#เ#>|๏uNQKต๋ฌS‡€ว฿„ห EEPQฌถx}8ดtiฃโA‹Jช0ซฎE’เv@t๘™ฝt%๋฿3r.)ƒ0งŒ(•พgด^Ÿz™(พฅ @”Bงkยฤ฿1ะZ: มฟ๙ƒzLฆบmL…่ˆy–ื< h#tDq่y แˆซk7Ž-ฦ!jY๋ฏจว๛๔™ฯ‚™ ๘t œs|น_ƒ#„xบจจ่ฒบบบš]ู"o H)นfฦม–egฮŸžน{2ปR๏{้@๚ ต9s“2๚ผฉuร””%0-#•ฐฯๅr™uu๋ฯ^๘ะŠ็ …pตbS\.g˜fลœ๚๚šก›yH‹'M Œ๐ภฺšเ…Ÿƒจ€oญึ‘tัO€6|๒ ฮดiึ‚•+฿๔่ัc|mํผšฒฒ2+›อŽหfณฟื”v9าI๘ษEpP๊ฮๅม‚…RS=rEไ6wงม!RศT_Xดไkyk")9Ÿฃ†f9ธ3<*ฺ-โ0v$Œเ YA’ผ€E!:Š๖Qe"sžฑS ž†ฃYภu$r_‘T‡X…ญฝผ—ฆต+oVC/#bฎR+ล‘ฺ)R€Yุ8HIYU5uะตm 8โ่`#tฤัำq8ถv_ํฦั2 YNฟ ๕ถzดwox็1Xต~{xๆีภ!า0Œๅ†aเ๘ใaย„ 444๐Mๆ€7ฃ—žp๙ฤ1ฟท็๚š†—Š“%{ƒZ7O—XคK,เศภ ฮญ@๑8ํฤต\ึมqp๊›ฑGว=พแ_dฤร……Wม'ŽใNxฮ9™_uํ*w๗็)ฏƒ@ ๑Dกะ๘œ90i’˜ทfธปOŸ=z๋ญทฺ๊ถmK*•?/___Oeee'เOูl๖ \ๅชชnธฎ<Š EOž ำ้Aim-]'ภtฐ#pH`Rƒ๗>1ุoฏ}บบลœp™ํFG‡Bข=ม>ฝˆ 0๛•y๛น%๐๏ท&ัฝ๔฿์Yดgcฎ^eกซ๎ธต๏ผ๑฿๎๛๊tฒOl๋่x๋w้’x•ฝบภฑ=ุ่c‡ใ๊8โ|˜9GU9จ  }Z‹U Dpื^{ํ๕หฯ>๛ฌกๅC@พ= ฅdภีฺ˜ยผ#(>ห4 หS’ิ5 ซฆโƒูlถฎ1ำt[าJ~ึฝ šZำงs455ฝ{๗>๎ ƒ–ฝ4hะ6>FuK@_—๗` q} ๑ผถXธj•yฯž=๏š4้บ:`šygด‹/ฆWฏ^{wไrนฃฝ๔T~r!\sดIRVtมUhxZ5๕“[ƒร๊ฏ,าฺฅ>Lฏ_ฑpม๛0Woุภkฯลุใ3!_ฑ(Tฦm›—เ?Ž)สฏ=“q๙ 5.…ๅUเmXO?9žฃ๖ŸIป’Hวn;ว‡‹เ๏๔žฯY–๕Dฏ^ฝฎ์ณฯ–[–๕ญฐฤ7ค#น๚‘หฉชฅ๑ลQIฃ่tำ๛"E;)e1ˆ:G:+›š3๏7gŸง็^ี๋ฮฆ*Fหฝฯ!ฬ<แถอึต-o‹šG…7พ @%ภงN5—/Z$๎ํทฯ=Ÿ}6k5ฐUq.—ฃฌฌฌg&“๙“m'ข-‹sr ํšุ1/P๛Pc_ฎ็หK‹~ุ฿&ฅ# โ(7ั3Y‚{_ภKpลี~x)ษHษwœผŽคศ+"ค3”วHฃecš›ๆ๗E๑ศชQช๚M C ~N:านs็Ÿ/ZดhํnK|็‚฿FIII‡๖ํ๋{ษ%tฯnฃ3}7ผฉ๖m`‰Kฉ๖ฯŸSงš๋—,IWZZz๗๒ๅ+–จ}†g;ŽCuuuๅ๊ีซœหๅ~(ฅฌ๔žต)‡+ฮ†+ว@ว2ยณq‚๐ฝ๑บi.•S >๑K๙MลaB๛K!ั)\ฑ/่ดdญ@ณใ๐ศ}๗๑“—“Šs]้Š%#RฏNƒŽร/y‡C‚h{2'ฺUฅรซ๋ฉ3(ท_`ฟ^แฎt์ฦฑCpH ณWภศ๓a๙ฏฑ2™L<•JmํฺตM–Uะ๕j7์`hQ2M:ู:๘ฃฆ]{mๆ€œๅ๊๎,#‹มฤ‰4,X J&ำwิืื/ุžผๅ6JŽ;๎8๋7.„๘•m‡โ/ ๔๎ OคQž$oสWF๊‹†ึนม”8H๘&เ0ช ำาŽ*ทฯ๘ยา}บถฎ–gv฿•!แก๗งํ*5ztฎ‡#nไตˆƒb่|;sเจกลลลกื7gxๆั฿sษY นุ้cปโ@ฃ„๏5ษOฮ%‰ซฒู์=1Mฺ ;!ด(ฉl6ฺดฉ|ๆส+kG%!ฆ๛vฉ›ฆ:1mโDัฐpก๙!Rฟป๖ๆ]z้eฮฆฎoohnn&‘Hะฟโeห–XWW๗€RJ_ภwlcN‚ซฯƒฎmP{ษืฮ}~'ๅโก †ฟ‘;=Žารกโ„๏m€๔ต `šL˜๐ าS:ๅฤaฒ4ฟN@Œย์าส„ขsต„ฃxTyฑ๕ ๙t่ ญRBFJน๏.:y% ก €Aว&เภ•pว฿แwืhมw†๗ฑณใr&p'๙Qะ‚ˆMฮF… ปด(ข›ššhืฎํgŸpk—.;ฑcF@J\dี*˜W\\uธqใ>ฝแ†œฤoด฿ฑเ8น\ŽกC‡ฆ?๘ใฃŸๆrนกhษ„ q้๗เิPj>ูŽศ7แ๛๚lฦ0ช‡๋<Z…Š‹Jิ@š๙ั'|๚฿็8๛ธ\เเร|ฃSฃบ‘งคxeยUถพโp8@ป !ธซใ๎๖=ขร?m ๕฿‚‡๎ฝ“1วญRGฒ๎H:Z‹Cœs#<๑ >œ~,<๐?P•*€{gฃcเRน๔W๐๘„เิ<ร0>,**:fอš5ซำ้4ปaื‚ึˆ่1งœยใƒm๓ถl5๐๘š50eŠh๘์3๙2คwะA}8qโฤ7} (“ษ`YW_}ตu฿}๗ํ \–อfฯ:่V|i1 ?.:ŽUiํbร B0ภ–”บ‘ ็ื[จพร์ˆ่๐^๔d๕<๐vท…`า;๏ฑ|kœ~ดMRฤ Œด…Hฟ .]:SŽKำihQŽ์tB$๚ย0้โn’kื๑๒๘๛นเ”Fp'ฺ?›ŽMฤ!š,œs=ผ๔N0N๚v‡ฟ๗}โegฅc{เภUp๖aฦฌPuo%“ษ๏577ฏ–wรๆA‹oฮqฺตkฟ_ฟuŸw†ŒŽจ<พ~=L™BำงŸZฏ74ไn=์ฐแ3&Mz'์๋เ;วมถmชซซ“ถmจฏฏฟจนน๙( ิ^lา‚ฝแผSแ๘ร o0ฝ„oํบ\"jฦZยC V=V๛vลศาฃ โHาMWKร`ฮ๙Lz%?p{uว !KสฝŽฐPœn=]WRฤดMย!AUงโ- D!oรs„เ๙็ษํห}\\;šŽ-ภ!ฅš>ีC๐๛‡ ู#mp๑๐๋qะ6.ฟ3าฑตq  ฮ†;‡[๏‡ฆเ๐ช\2™ผ/“ษ,—หี}ำ oด(ๅ2™ ]ta๚ฝ๗žจ=็œmtฺ๊f€'ภkj`๊T‘™1CLLงหนz๕๊w รุฝrภqค”TWW_ฝz๕๗ฅ”฿ฑmป šร`™p์กpสwเศƒ GGWะ;aๆจƒ&‹CC}\93ฉm‚ร1‰Ž`,_ตŠ)“cํฒ้sˆMฯฮ„b`วีฉ[H…šฅ#๏ดฮMล!ฒนˆิ~Ž:ีŒƒ#“งNgลrฺHGลk; [ ฬZ  ำ>ž™Œ= ๗*่R?~wV:6จต9xไE๘๙*†พ KKKฯฏซซ›ฤn๘FมFอึ;๎๘ณ๕ภท|vฦk๗QFฎ'ภ๋๋aฺ4œ้ำล$วI๎ๅ—_z}ุฐแN2น6Ÿ กนนหฒp‡^ฝzuXตjี‰Rสั™Lfธขุ›ฒ๗„จeยAเธ#`ฤ`า)~ฉ|ญKเ<๋#ยฤBำ‰.xลฃฮ&ใฐกัเ™ื-๖ฺ#รภ=ีAžโ๔๐„j™D w๖๙k„+ขk๓q$]G5M๔ฌtฏxVJ^y้udTN< ^ูฉุ่บ8ค๐ึ ธv๘`V๘๙เ}เ๚Kเ„aŒ๘C๎Ltl ‡” ๐๑ตwนืมv๔:ฤสT*u๛๏ทฉSงnrภ’ฐkภF฿๊O<ม~pม3—]–9ฃธx{4)เออ๐๛0}บ๙^]ธํฌณพ7แo{,ท฿เyึtํฺตK]]แ๕๕๕งJ)vง~  จUœVŽx‡ ยA{Ci ˆfŽzว…@บก+1šฐ•หfSql Be"๏ึ‚‚8ŠAฯป]eร`๚๔™๙k7ฌŽž!ฮ‘ง c;เภ„OมฯฏNV!›=0 8x \<NmJlแvํP: ศ๐ฦ{๐ศs๐๒ฤhn†aผŸH$~ุุ๘บ”r“#X๎†]Z;๔n๛มธถC‡mณuอ๛ฆMƒ3ฬOkkฟ้฿ฟ฿ 3fฬl€ญm7l=๐๐ค” ><๛๏๗O$#ว๙n6›้Nwฦ5๕ูฝ์ีFƒ๗‡ก{A24ฃœ๓Œฐ †xa[๐yิBrฏqCธPฑ3ัฺL@žrัBพ8b6 ‡ฺ^้^H+มผน๓x๛ญwจL-เˆƒlฺปSหฎ–Ž€#gยฤแท๗รG๓7Pฐ``_8v8Œ<Žุ฿UD›ฯ อ&mM:d0ป 0g!ผ๔6Lx >œ ต‘อdฎB='‘HVRR2~ํฺต฿๘ำอvC>lT<็r9ฃSงŽguิฺว๛๗฿:‡ด่ัเฬœ™\ฐzต๘ี{๔~แำO?ซ›อออธ> ฦฉงžjฬž=ป๛ย… ๗Ž•RŽฐmปง”2้2ฃ`อลเ*Kกบƒ๚CยA๛ยภPRIคภ"tษ฿CXจว nอยŠ*Q†*Gวิš๒_฿ฆโhศย5ุณทCื๖๊p›จoร–โุt์0R{nมาx~2u?ฬ]DAHZะฅtํ {๏กN ๋^ ฝปAว (M‘B6ฉƒ ™จi‚5ตฐtฬ]sพTฟฅห`้สเเo%gฦืภpย _<๚่ฃ9ร0พ๕ฮฟ฿vุ่ฯd2คำ้ก‡ส;วณyŽqžทm๘๔Sœ)Sฤย5kŒา้๔๋ืฏฏุี๗‚๏†MƒL&ƒadณY,ห2nผ๑F๋๘C›N:ํฝvํฺแูl๖)ๅ@น”2ํN็‡ดYg๓H์ดๆ0y Šจk‡@H"ฅB(สƒ?’Šข5"NีVQีJ๊?‘ช* Q(ขHJ„ Hิ•"&‰š†‡_แaฮศถใ{๘|ถ๏ฮปณ3coรี„เ๐Œแ๗‘Vwพณฯใวํogๆ7ฟแp_าบฎงLำ์Bษ็๓‘Hไฟน\nh๕๊ีcoฟถดm›3ฦคใ8๐ ฎุถ )% รเœs๙โ‹/๊ฬ>๘@‡รๆขE‹f๖๖๖ฮุŽ—_๕ฑอ›lišF๙6„L’)ฐmฑX"‘ๅJฉ฿†รbฃชช;๎ ๘•๒ๆผฝ˜2;ฆฤ๙๓พOำiนฝดดดuK—.•ผ น:tŠ"ท-วq`Y๊๋๋‰Dน@ภ๚}cฃฌkhืดขLl2%ลม{l ่่`ขซ ‰tฺท4gmX๛ภภ@–๖[ ไ๚ ำนm2ฺ๑เƒ˜]]ฬšๅผ~฿}โฅK•๎๓๘^œฑ]œ4ๆev~ฟ;งCRผห”ภนs วŽฉl,fKงํs็ฮณpแ‚ป๗JฅMฯrƒP@'ท4ฅZZ^แถm{ภqฦุะ V57+฿ตNd›ผ•ซw+ฅป'A6 คำษ$็๑8ฒูฌ‘Žลฌt>ฏฮ–”๘;s9ซ7‰๔ G‡†^[พ\bู2๐›=ิ๏]ไ0ŒŽ_}ลdg'๏O$ดบ^๚^ ๘ฯ๒ตตตฐm›–}rQ@'ทฏM จ"ฟ้ฎปœ๕ห—รBL-8๗œฝeS๎kป9“art|pH&U&•า๚‡‡Y‚s_T)tdณูพŠŠŠฮw฿}็l,v>ฟjี*sฯ=RJ !„WฬJ)˜ฆ้eฮ‡fฬะv<๙คXต`Aaํ๕ ๆmŠไ8@?p8๒]]ศฤ>ฌซป๋[ทnM477ห Yๆ„zW’iอ Œ~ฟ?dYึ†9sTKS“ อŸ๏pO๑บf!€‰ †‘`dD!•‚L$ธฬdx"“ัฮ N jšึY^^qฦฒฌณ?ิ“หๅ๛Z[-วแJ)ฉ”โRJ้U ปRีีี๓๒๙}O?ปซซฏ๒—1E‹ฆนฝ๎“''๔ก^๖qyyูฮว{์“ํ. UะnLฃ!W:™v”RXณfoฯž=๋สห๑›๛๏—‘y๓Q2™RblŒEm{F_2™๏ ƒ'“ษิ !Dssำู7x#ตx๑8Ž#KJJ ฅ„ใ87zธ๘กš์zๆิื๏›xCๆœฑะัมไ™3H:อw๚ฅปSฉแจRJJ)iธœiŽ:™vZZZะฺฺzg$I์ฺตkLJษm†aฒฐ™ะอnโทJ&จฌ ญฉฏวถตk0Œk?‡ฏ๋@>tw,;0 ๏ฮ็ๅ๛O=๕ณƒ~๘Q†’ินuQ@'ไ:ฒm 6๐X,๖ป{๏อฟ๘ใnนุ+ ไล๓๛š|5p๔(งOซž๑๑า๗ถ๛อ7zj๚ ยqจr#!ท ่„\J)ิิิ๘โ๑wVฌภ ห–฿ญ‡‹ืuOLงO3?ฮR๑ธ๑ษ๘ธQS3๛`4MQ’! €Nศ5‰DBƒƒ=;ŸxB<‰Lmy\๑Ž…ษ$ะฮฌ๎nDGGต๗KJllIฯฝ[RJH)QRRrc~BศดAk 0‡ฉจภฎgŸECUีฅ ีxหรr9 ฏแห/Ujpะ4“™ุV_ใึM›6e_z้W๎พฎTQ2Eะ น Ÿ}๖๚puตุ๙sจ๒๛/ {eval}`v1` If we update the variable, we can see the change reflected in subsequent evaluation: ```{code-cell} ipython3 v1 = "My new variable" ``` `` {eval}`v1` `` -> {eval}`v1` :::{important} Variable names must match the regex `[a-zA-Z][a-zA-Z0-9_]*` ::: ## Inserting different output types Any variable type can be inserted into the text flow using the `eval` role, and the most suitable output type will be used, based on the output format (see {ref}`render/output/priority` for more information). For example: ```{code-cell} ipython3 import ipywidgets as widgets slider = widgets.IntSlider(value=5, min=0, max=10) ``` An inline slider (`` {eval}`slider` ``): {eval}`slider` You can also use the `eval` directive to insert variables as blocks: ```{code-cell} ipython3 import matplotlib.pyplot as plt myplot, ax = plt.subplots(figsize=(6, 2)) mean = 2.0 ax.plot([1,2,3]) ax.grid() plt.close() ``` using: ````markdown ```{eval} myplot ``` ```` gives: ```{eval} myplot ``` ## Embedding outputs in figures The `eval:figure` directive allows you to embed outputs in a figure, with an optional caption and other formatting options. For example, we can embed the output of the above plot in a figure: `````markdown ```{eval:figure} myplot :name: myplot My plot with a mean value of {eval}`mean`. ``` ````` which gives: ```{eval:figure} myplot :name: myplot My plot with a mean value of {eval}`mean`. ``` That can be referenced with `` {ref}`myplot` ``: {ref}`myplot` The following directive options are available: :::{table} `eval:figure` directive options | Option | Type | Description | | ------ | ---- | ----------- | | figwidth | length or percentage | The width of the figure | | figclass | text | A space-separated list of class names for the figure | | name | text | referenceable label for the figure | | alt | text | Alternate text of an image | | height | length | The desired height of an image | | width | length or percentage | The width of an image | | scale | percentage | The uniform scaling factor of an image | | class | text | A space-separated list of class names for the image | | align | text | left, center, or right | ::: MyST-NB-1.1.2/docs/render/interactive.md000066400000000000000000000113741467453560600177400ustar00rootroot00000000000000--- file_format: mystnb kernelspec: name: python3 --- # Widgets and interactive outputs Jupyter Notebooks have support for many kinds of interactive outputs. These should all be supported in MyST-NB by passing the output HTML through automatically. This page has a few common examples.[^download] [^download]: This notebook can be downloaded as **{nb-download}`interactive.ipynb`** and {download}`interactive.md` First off, we'll download a little bit of data and show its structure: ```{code-cell} ipython3 import plotly.express as px data = px.data.iris() data.head() ``` ## Plotting libraries ### Altair Interactive outputs will work under the assumption that the outputs they produce have self-contained HTML that works without requiring any external dependencies to load. See the [`Altair` installation instructions](https://altair-viz.github.io/getting_started/installation.html#installation) to get set up with Altair. Below is some example output. ```{code-cell} ipython3 import altair as alt alt.Chart(data=data).mark_point().encode( x="sepal_width", y="sepal_length", color="species", size='sepal_length' ) ``` ### Plotly Plotly is another interactive plotting library that provides a high-level API for visualization. See the [Plotly JupyterLab documentation](https://plotly.com/python/getting-started/#jupyterlab-support-python-35) to get started with Plotly in the notebook. Below is some example output. ```{code-cell} ipython3 import plotly.io as pio import plotly.express as px import plotly.offline as py df = px.data.iris() fig = px.scatter(df, x="sepal_width", y="sepal_length", color="species", size="sepal_length") fig ``` :::{important} You may need to supply the `require.js` for plotly to display; in your `conf.py`: ```python html_js_files = ["https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js"] ``` ::: ### Bokeh Bokeh provides several options for interactive visualizations, and is part of the PyViz ecosystem. See [the Bokeh with Jupyter documentation](https://docs.bokeh.org/en/latest/docs/user_guide/jupyter.html#userguide-jupyter) to get started. Below is some example output. ```{code-cell} ipython3 from bokeh.plotting import figure, show, output_notebook output_notebook() ``` ```{code-cell} ipython3 from bokeh.plotting import figure, show, output_notebook output_notebook() p = figure() p.circle(data["sepal_width"], data["sepal_length"], fill_color=data["species"], size=data["sepal_length"]) show(p) ``` ## ipywidgets :::{note} IPyWidgets uses a special JS package `@jupyter-widgets/html-manager` for rendering Jupyter widgets outside notebooks. `myst-nb` loads a specific version of this package, which may be incompatible with your installation of IPyWidgets. If this is the case, you might need to specify the appropriate `nb_ipywidgets_js` config value, e.g. for `0.20.0` ```yaml sphinx: recursive_update: true config: nb_ipywidgets_js: # Load IPywidgets bundle for embedding. "https://cdn.jsdelivr.net/npm/@jupyter-widgets/html-manager@0.20.0/dist/embed-amd.js": "data-jupyter-widgets-cdn": "https://cdn.jsdelivr.net/npm/" "crossorigin": "anonymous" ``` To determine which version of `@jupyter-widgets/html-manager` is required, find the `html-manager` JS package in the [`ipywidgets` repo](https://github.com/jupyter-widgets/ipywidgets), and identify its version. ::: You may also run code for Jupyter Widgets in your document, and the interactive HTML outputs will embed themselves in your side. See [the ipywidgets documentation](https://ipywidgets.readthedocs.io/en/latest/user_install.html) for how to get set up in your own environment. ```{admonition} Widgets often need a kernel Note that `ipywidgets` tend to behave differently from other interactive viz libraries. They interact both with Javascript, and with Python. Some functionality in `ipywidgets` may not work in rendered pages (because no Python kernel is running). You may be able to get around this with tools for remote kernels, like [thebelab](https://thebelab.readthedocs.org). ``` Here are some simple widget elements rendered below. ```{code-cell} ipython3 import ipywidgets as widgets widgets.IntSlider( value=7, min=0, max=10, step=1, description='Test:', disabled=False, continuous_update=False, orientation='horizontal', readout=True, readout_format='d' ) ``` ```{code-cell} ipython3 tab_contents = ['P0', 'P1', 'P2', 'P3', 'P4'] children = [widgets.Text(description=name) for name in tab_contents] tab = widgets.Tab() tab.children = children for ii in range(len(children)): tab.set_title(ii, f"tab_{ii}") tab ``` You can find [a list of possible Jupyter Widgets](https://ipywidgets.readthedocs.io/en/latest/examples/Widget%20List.html) in the jupyter-widgets documentation. MyST-NB-1.1.2/docs/render/orphaned_nb.ipynb000066400000000000000000000022201467453560600204110ustar00rootroot00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "(orphaned-nb)=\n", "\n", "# An orphaned notebook\n", "\n", "This defines a variable that we'll re-use in another notebook." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'My orphaned variable!'" ] }, "metadata": { "scrapbook": { "mime_prefix": "", "name": "orphaned_var" } }, "output_type": "display_data" } ], "source": [ "from myst_nb import glue\n", "glue(\"var_text\", \"My orphaned variable!\")\n", "glue(\"var_float\", 1.0/3.0)" ] } ], "metadata": { "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.7.6" }, "orphan": true }, "nbformat": 4, "nbformat_minor": 4 } MyST-NB-1.1.2/docs/requirements.txt000066400000000000000000000000621467453560600170760ustar00rootroot00000000000000# this is only required by coconut kernel ipython MyST-NB-1.1.2/myst_nb/000077500000000000000000000000001467453560600143375ustar00rootroot00000000000000MyST-NB-1.1.2/myst_nb/__init__.py000066400000000000000000000021471467453560600164540ustar00rootroot00000000000000"""A docutils/sphinx parser for Jupyter Notebooks.""" __version__ = "1.1.2" def setup(app): """Sphinx extension setup.""" # we import this locally, so sphinx is not automatically imported from .sphinx_ext import sphinx_setup return sphinx_setup(app) def glue(name: str, variable, display: bool = True) -> None: """Glue a variable into the notebook's cell metadata. Parameters ---------- name: string A unique name for the variable. You can use this name to refer to the variable later on. variable: Python object A variable in Python for which you'd like to store its display value. This is not quite the same as storing the object itself - the stored information is what is *displayed* when you print or show the object in a Jupyter Notebook. display: bool Display the object you are gluing. This is helpful in sanity-checking the state of the object at glue-time. """ # we import this locally, so IPython is not automatically imported from myst_nb.ext.glue import glue return glue(name, variable, display) MyST-NB-1.1.2/myst_nb/_compat.py000066400000000000000000000003351467453560600163340ustar00rootroot00000000000000from docutils.nodes import Element def findall(node: Element): # findall replaces traverse in docutils v0.18 # note a difference is that findall is an iterator return getattr(node, "findall", node.traverse) MyST-NB-1.1.2/myst_nb/cli.py000066400000000000000000000120441467453560600154610ustar00rootroot00000000000000"""A basic CLI for quickstart of a myst_nb project.""" from __future__ import annotations import argparse from pathlib import Path from textwrap import indent import nbformat from .core.config import NbParserConfig from .core.read import read_myst_markdown_notebook def quickstart(args: list[str] | None = None): """Quickstart myst_nb project.""" namespace = create_quickstart_cli().parse_args(args) path = Path(namespace.path).resolve() verbose: bool = namespace.verbose overwrite: bool = namespace.overwrite if path.exists(): if not overwrite: raise FileExistsError(f"{path} already exists.") if verbose: print(f"Overwriting existing files in: {path}") # create directory path.mkdir(parents=True, exist_ok=True) # write .gitignore (path / ".gitignore").write_text(".ipynb_checkpoints\n_build\n", encoding="utf-8") # write conf.py (path / "conf.py").write_text(generate_conf_py(), encoding="utf-8") # write index.md (path / "index.md").write_text( generate_index(["notebook1", "notebook2"]), encoding="utf-8" ) # write notebook1.ipynb (path / "notebook1.ipynb").write_text(generate_jupyter_notebook(), encoding="utf-8") # write notebook2.md (path / "notebook2.md").write_text(generate_text_notebook(), encoding="utf-8") print(f"Created myst_nb project at: {path}") def create_quickstart_cli(): cli = argparse.ArgumentParser(description="Create a basic myst_nb project.") cli.add_argument( "path", metavar="PATH", type=str, help="Directory to output the project." ) cli.add_argument( "-o", "--overwrite", action="store_true", help="Overwrite existing files." ) cli.add_argument("-v", "--verbose", action="store_true", help="Increase verbosity.") return cli def generate_conf_py() -> str: """Generate `conf.py` content.""" content = ( """\ # outline for a myst_nb project with sphinx # build with: sphinx-build -nW --keep-going -b html . ./_build/html # load extensions extensions = ["myst_nb"] # specify project details master_doc = "index" project = "MyST-NB Quickstart" # basic build settings exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", "**.ipynb_checkpoints"] nitpicky = True ## myst_nb default settings """.rstrip() + "\n" ) settings = "" config = NbParserConfig() for name, value, field in config.as_triple(): if field.metadata.get("sphinx_exclude"): continue if field.metadata.get("help"): settings += f'{field.metadata.get("help")}\n' settings += f"nb_{name} = {value!r}\n\n" content += "\n" + indent(settings, "# ").rstrip() + "\n" return content def generate_index(children: list[str]) -> str: """Generate `index.md` content.""" children_str = "\n".join(children) content = ( f"""\ # MyST-NB Quickstart ```{{toctree}} {children_str} ``` """.rstrip() + "\n" ) return content def generate_jupyter_notebook() -> str: """Generate `notebook.ipynb` content.""" nb = nbformat.v4.new_notebook() nb["metadata"] = { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3", }, } nb["cells"] = [ nbformat.v4.new_markdown_cell("# Jupyter Notebook"), nbformat.v4.new_code_cell("print('Hello, World!')"), ] return nbformat.writes(nb) def generate_text_notebook() -> str: """Generate `notebook.md` content.""" content = ( """\ --- file_format: mystnb kernelspec: name: python3 --- # Text-based Notebook ```{code-cell} print("Hello, World!") ``` """.rstrip() + "\n" ) return content def md_to_nb(args: list[str] | None = None): namespace = create_md_to_nb_cli().parse_args(args) path = Path(namespace.inpath).resolve() if namespace.outpath: outpath = Path(namespace.outpath).resolve() else: outpath = path.with_suffix(".ipynb") verbose: bool = namespace.verbose overwrite: bool = namespace.overwrite if outpath.exists(): if not overwrite: raise FileExistsError(f"{outpath} already exists.") if verbose: print(f"Overwriting existing file: {outpath}") nb = read_myst_markdown_notebook(path.read_text("utf8"), path=path) with outpath.open("w", encoding="utf8") as handle: nbformat.write(nb, handle) print(f"Wrote notebook to: {outpath}") def create_md_to_nb_cli(): cli = argparse.ArgumentParser( description="Convert a text-based notebook to a Jupyter notebook." ) cli.add_argument( "inpath", metavar="PATH_IN", type=str, help="Path to Markdown file." ) cli.add_argument( "outpath", metavar="PATH_OUT", nargs="?", type=str, help="Path to output to.", ) cli.add_argument( "-o", "--overwrite", action="store_true", help="Overwrite existing files." ) cli.add_argument("-v", "--verbose", action="store_true", help="Increase verbosity.") return cli MyST-NB-1.1.2/myst_nb/core/000077500000000000000000000000001467453560600152675ustar00rootroot00000000000000MyST-NB-1.1.2/myst_nb/core/__init__.py000066400000000000000000000012071467453560600174000ustar00rootroot00000000000000"""Modules for core functionality. The parsing of a notebook consists of a number of stages, with each stage separated into a separate module: 1. The configuration is set (from a file or CLI) 2. The parser is called with an input string and source 3. The parser reads the input string to a notebook node 4. The notebook is converted to a Markdown-It tokens syntax tree 5. The notebook code outputs are potentially updated, via execution or from a cache 6. The syntax tree is transformed to a docutils document AST (calling the renderer plugin) 7. The docutils document is processed by docutils/sphinx, to create the desired output format(s) """ MyST-NB-1.1.2/myst_nb/core/config.py000066400000000000000000000527651467453560600171250ustar00rootroot00000000000000"""Configuration for myst-nb.""" import dataclasses as dc from enum import Enum from typing import Any, Callable, Dict, Iterable, Literal, Optional, Sequence, Tuple from myst_parser.config.dc_validators import ( ValidatorType, deep_iterable, deep_mapping, in_, instance_of, optional, validate_fields, ) from myst_nb.warnings_ import MystNBWarnings def custom_formats_converter(value: dict) -> Dict[str, Tuple[str, dict, bool]]: """Convert the custom format dict.""" if not isinstance(value, dict): raise TypeError(f"`nb_custom_formats` must be a dict: {value}") output: Dict[str, Tuple[str, dict, bool]] = {} for suffix, reader in value.items(): if not isinstance(suffix, str): raise TypeError(f"`nb_custom_formats` keys must be a string: {suffix}") if isinstance(reader, str): output[suffix] = (reader, {}, False) elif not isinstance(reader, Sequence): raise TypeError( f"`nb_custom_formats` values must be a string or sequence: {reader}" ) elif len(reader) == 2: output[suffix] = (reader[0], reader[1], False) elif len(reader) == 3: output[suffix] = (reader[0], reader[1], reader[2]) else: raise TypeError( f"`nb_custom_formats` values must be a string, of sequence of length " f"2 or 3: {reader}" ) if not isinstance(output[suffix][0], str): raise TypeError( f"`nb_custom_formats` values[0] must be a string: {output[suffix][0]}" ) # TODO check can be loaded as a python object? if not isinstance(output[suffix][1], dict): raise TypeError( f"`nb_custom_formats` values[1] must be a dict: {output[suffix][1]}" ) if not isinstance(output[suffix][2], bool): raise TypeError( f"`nb_custom_formats` values[2] must be a bool: {output[suffix][2]}" ) return output def ipywidgets_js_factory() -> Dict[str, Dict[str, str]]: """Create a default ipywidgets js dict.""" # see: https://ipywidgets.readthedocs.io/en/7.6.5/embedding.html return { # Load RequireJS, used by the IPywidgets for dependency management "https://cdnjs.cloudflare.com/ajax/libs/require.js/2.3.4/require.min.js": { "integrity": "sha256-Ae2Vz/4ePdIu6ZyI/5ZGsYnb+m0JlOmKPjt6XZ9JJkA=", "crossorigin": "anonymous", }, # Load IPywidgets bundle for embedding. "https://cdn.jsdelivr.net/npm/@jupyter-widgets/html-manager@1.0.6/dist/embed-amd.js": { "data-jupyter-widgets-cdn": "https://cdn.jsdelivr.net/npm/", "crossorigin": "anonymous", }, } def has_items(*validators) -> ValidatorType: """ A validator that performs validation per item of a sequence. :param validators: Validator to apply per item """ def _validator(inst, field: dc.Field, value, suffix=""): if not isinstance(value, Sequence): raise TypeError(f"{suffix}{field.name} must be a sequence: {value}") if len(value) != len(validators): raise TypeError( f"{suffix}{field.name!r} must be a sequence of length " f"{len(validators)}: {value}" ) for idx, (validator, member) in enumerate(zip(validators, value)): validator(inst, field, member, suffix=f"{suffix}[{idx}]") return _validator class Section(Enum): """Config section tags.""" global_lvl = "global" """Global level configuration.""" file_lvl = "notebook" """File level configuration.""" cell_lvl = "cell" """Cell level configuration.""" config = "config" """Meta configuration.""" read = "read" """Configuration for reading files.""" execute = "execute" """Configuration for executing notebooks.""" render = "render" """Configuration for rendering notebook elements.""" @dc.dataclass() class NbParserConfig: """Global configuration options for the MyST-NB parser. Note: in the docutils/sphinx configuration, these option names are prepended with ``nb_`` """ def __post_init__(self): self.custom_formats = custom_formats_converter(self.custom_formats) validate_fields(self) # file read options custom_formats: Dict[str, Tuple[str, dict, bool]] = dc.field( default_factory=dict, metadata={ "help": "Custom formats for reading notebook; suffix -> reader", "omit": ["docutils"], "sections": (Section.global_lvl, Section.read), }, ) # docutils does not support the custom formats mechanism read_as_md: bool = dc.field( default=False, metadata={ "validator": instance_of(bool), "help": "Read as the MyST Markdown format", "sphinx_exclude": True, }, repr=False, ) # configuration override keys (applied after file read) # TODO previously we had `nb_render_key` (default: "render"), # for cell.metadata.render.image and cell.metadata.render.figure`, # and also `timeout`/`allow_errors` in notebook.metadata.execution # do we still support these or deprecate? # (plus also cell.metadata.tags: # nbclient: `skip-execution` and `raises-exception`, # myst_nb: `remove_cell`, `remove-cell`, `remove_input`, `remove-input`, # `remove_output`, `remove-output`, `remove-stderr` # ) # see also: # https://nbformat.readthedocs.io/en/latest/format_description.html#cell-metadata metadata_key: str = dc.field( default="mystnb", metadata={ "validator": instance_of(str), "help": "Notebook level metadata key for config overrides", "sections": (Section.global_lvl, Section.config), }, ) cell_metadata_key: str = dc.field( default="mystnb", metadata={ "validator": instance_of(str), "help": "Cell level metadata key for config overrides", "legacy_name": "nb_render_key", "sections": (Section.global_lvl, Section.file_lvl, Section.config), }, ) # notebook execution options kernel_rgx_aliases: Dict[str, str] = dc.field( default_factory=dict, metadata={ "validator": deep_mapping(instance_of(str), instance_of(str)), "help": "Mapping of kernel name regex to replacement kernel name" "(applied before execution)", "omit": ["docutils"], "sections": (Section.global_lvl, Section.execute), }, ) eval_name_regex: str = dc.field( default=r"^[a-zA-Z_][a-zA-Z0-9_]*$", metadata={ "validator": instance_of(str), "help": "Regex that matches permitted values of eval expressions", "sections": (Section.global_lvl, Section.file_lvl, Section.execute), }, ) execution_mode: Literal["off", "force", "auto", "cache", "inline"] = dc.field( default="auto", metadata={ "validator": in_( [ "off", "auto", "force", "cache", "inline", ] ), "help": "Execution mode for notebooks", "legacy_name": "jupyter_execute_notebooks", "sections": (Section.global_lvl, Section.file_lvl, Section.execute), }, ) execution_cache_path: str = dc.field( default="", # No default, so that sphinx can set it inside outdir, if empty metadata={ "validator": instance_of(str), "help": "Path to folder for caching notebooks (default: )", "legacy_name": "jupyter_cache", "sections": (Section.global_lvl, Section.file_lvl, Section.execute), }, ) execution_excludepatterns: Sequence[str] = dc.field( default=(), metadata={ "validator": deep_iterable(instance_of(str)), "help": "Exclude (POSIX) glob patterns for notebooks", "legacy_name": "execution_excludepatterns", "omit": ["docutils"], "sections": (Section.global_lvl, Section.execute), }, ) execution_timeout: int = dc.field( default=30, metadata={ "validator": instance_of(int), "help": "Execution timeout (seconds)", "legacy_name": "execution_timeout", "sections": (Section.global_lvl, Section.file_lvl, Section.execute), }, ) execution_in_temp: bool = dc.field( default=False, metadata={ "validator": instance_of(bool), "help": "Use temporary folder for the execution current working directory", "legacy_name": "execution_in_temp", "sections": (Section.global_lvl, Section.file_lvl, Section.execute), }, ) execution_allow_errors: bool = dc.field( default=False, metadata={ "validator": instance_of(bool), "help": "Allow errors during execution", "legacy_name": "execution_allow_errors", "sections": (Section.global_lvl, Section.file_lvl, Section.execute), }, ) execution_raise_on_error: bool = dc.field( default=False, metadata={ "validator": instance_of(bool), "help": "Raise an exception on failed execution, " "rather than emitting a warning", "sections": (Section.global_lvl, Section.file_lvl, Section.execute), }, ) execution_show_tb: bool = dc.field( default=False, metadata={ "validator": instance_of(bool), "help": "Print traceback to stderr on execution error", "legacy_name": "execution_show_tb", "sections": (Section.global_lvl, Section.file_lvl, Section.execute), }, ) # pre-processing options merge_streams: bool = dc.field( default=False, metadata={ "validator": instance_of(bool), "help": "Merge stdout/stderr execution output streams", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) # render options render_plugin: str = dc.field( default="default", metadata={ "validator": instance_of(str), "help": "The entry point for the execution output render class " "(in group `myst_nb.output_renderer`)", "sections": (Section.global_lvl, Section.file_lvl, Section.render), }, ) remove_code_source: bool = dc.field( default=False, metadata={ "validator": instance_of(bool), "help": "Remove code cell source", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) remove_code_outputs: bool = dc.field( default=False, metadata={ "validator": instance_of(bool), "help": "Remove code cell outputs", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) code_prompt_show: str = dc.field( default="Show code cell {type}", metadata={ "validator": instance_of(str), "help": "Prompt to expand hidden code cell {content|source|outputs}", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) code_prompt_hide: str = dc.field( default="Hide code cell {type}", metadata={ "validator": instance_of(str), "help": "Prompt to collapse hidden code cell {content|source|outputs}", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) number_source_lines: bool = dc.field( default=False, metadata={ "validator": instance_of(bool), "help": "Number code cell source lines", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) # we cannot directly obtain a sphinx builder name from docutils, # so must set it manually builder_name: str = dc.field( default="html", metadata={ "validator": instance_of(str), "help": "Builder name, to select render priority for mime types", "sphinx_exclude": True, }, repr=False, ) mime_priority_overrides: Sequence[Tuple[str, str, Optional[int]]] = dc.field( default=(), metadata={ "validator": deep_iterable( has_items( instance_of(str), instance_of(str), optional(instance_of(int)) ), ), "help": "Overrides for the base render priority of mime types: " "list of (builder name, mime type, priority)", # TODO how to allow this in docutils? "omit": ["docutils"], "sections": (Section.global_lvl, Section.file_lvl, Section.render), }, repr=False, ) output_stderr: Literal[ "show", "remove", "remove-warn", "warn", "error", "severe" ] = dc.field( default="show", metadata={ "validator": in_( [ "show", "remove", "remove-warn", "warn", "error", "severe", ] ), "help": "Behaviour for stderr output", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) render_text_lexer: str = dc.field( default="myst-ansi", # TODO allow None -> "none"? # TODO check it can be loaded? metadata={ "validator": optional(instance_of(str)), "help": "Pygments lexer applied to stdout/stderr and text/plain outputs", "cell_key": "text_lexer", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) render_error_lexer: str = dc.field( default="ipythontb", # TODO allow None -> "none"? # TODO check it can be loaded? metadata={ "validator": optional(instance_of(str)), "help": "Pygments lexer applied to error/traceback outputs", "cell_key": "error_lexer", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) render_image_options: Dict[str, str] = dc.field( default_factory=dict, # see https://docutils.sourceforge.io/docs/ref/rst/directives.html#image metadata={ "validator": deep_mapping(instance_of(str), instance_of((str, int))), "help": "Options for image outputs (class|alt|height|width|scale|align)", "omit": ["docutils"], # TODO backward-compatible change to "image_options"? "cell_key": "image", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) render_figure_options: Dict[str, str] = dc.field( default_factory=dict, # see https://docutils.sourceforge.io/docs/ref/rst/directives.html#figure metadata={ "validator": deep_mapping(instance_of(str), instance_of((str, int))), "help": "Options for figure outputs (classes|name|caption|caption_before)", "omit": ["docutils"], "cell_key": "figure", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) render_markdown_format: Literal["commonmark", "gfm", "myst"] = dc.field( default="commonmark", metadata={ "validator": in_(["commonmark", "gfm", "myst"]), "help": "The format to use for text/markdown rendering", "cell_key": "markdown_format", "sections": ( Section.global_lvl, Section.file_lvl, Section.cell_lvl, Section.render, ), }, ) # TODO jupyter_sphinx_require_url and jupyter_sphinx_embed_url (undocumented), # are no longer used by this package, replaced by ipywidgets_js # do we add any deprecation warnings? ipywidgets_js: Dict[str, Dict[str, str]] = dc.field( default_factory=ipywidgets_js_factory, metadata={ "validator": deep_mapping( instance_of(str), deep_mapping(instance_of(str), instance_of(str)) ), "help": "Javascript to be loaded on pages containing ipywidgets", "omit": ["docutils"], "sections": (Section.global_lvl, Section.render), }, repr=False, ) # write options for docutils output_folder: str = dc.field( default="build", metadata={ "validator": instance_of(str), "help": "Folder for external outputs (like images), skipped if empty", "sphinx_exclude": True, # in sphinx we always output to the build folder }, ) append_css: bool = dc.field( default=True, metadata={ "validator": instance_of(bool), "help": "Add default MyST-NB CSS to HTML outputs", "sphinx_exclude": True, }, ) metadata_to_fm: bool = dc.field( default=False, metadata={ "validator": instance_of(bool), "help": "Convert unhandled metadata to frontmatter", "sphinx_exclude": True, }, ) @classmethod def get_fields(cls) -> Tuple[dc.Field, ...]: return dc.fields(cls) def as_dict(self, dict_factory=dict) -> dict: return dc.asdict(self, dict_factory=dict_factory) def as_triple(self) -> Iterable[Tuple[str, Any, dc.Field]]: """Yield triples of (name, value, field).""" fields = {f.name: f for f in dc.fields(self.__class__)} for name, value in dc.asdict(self).items(): yield name, value, fields[name] def copy(self, **changes) -> "NbParserConfig": """Return a copy of the configuration with optional changes applied.""" return dc.replace(self, **changes) def __getitem__(self, field: str) -> Any: """Get a field value by name.""" if field in ("get_fields", "as_dict", "as_triple", "copy"): raise KeyError(field) try: return getattr(self, field) except AttributeError: raise KeyError(field) def get_cell_level_config( self, field_name: str, cell_metadata: Dict[str, Any], warning_callback: Callable[[str, MystNBWarnings], Any], ) -> Any: """Get a configuration value at the cell level. Takes the highest priority configuration from: `cell > document > global > default` :param field: the field name to get the value for :param cell_metadata: the metadata for the cell :param warning_callback: a callback to use to warn about issues (msg, subtype) :raises KeyError: if the field is not found """ field: dc.Field = self.__dataclass_fields__[field_name] cell_key = field.metadata.get("cell_key", field.name) if ( self.cell_metadata_key not in cell_metadata and "render" in cell_metadata and isinstance(cell_metadata["render"], dict) and cell_key in cell_metadata["render"] ): warning_callback( f"Deprecated `cell_metadata_key` 'render' " f"found, replace with {self.cell_metadata_key!r}", MystNBWarnings.CELL_METADATA_KEY, ) cell_meta = cell_metadata["render"] else: cell_meta = cell_metadata.get(self.cell_metadata_key, None) if cell_meta: try: if cell_key in cell_meta: value = cell_meta[cell_key] if "validator" in field.metadata: if isinstance(field.metadata["validator"], list): for validator in field.metadata["validator"]: validator(self, field, value) else: field.metadata["validator"](self, field, value) return value except Exception as exc: warning_callback( f"Cell metadata invalid: {exc}", MystNBWarnings.CELL_CONFIG, ) # default/global/file level should have already been merged return getattr(self, field.name) MyST-NB-1.1.2/myst_nb/core/execute/000077500000000000000000000000001467453560600167315ustar00rootroot00000000000000MyST-NB-1.1.2/myst_nb/core/execute/__init__.py000066400000000000000000000053401467453560600210440ustar00rootroot00000000000000from __future__ import annotations from pathlib import Path, PurePosixPath from typing import TYPE_CHECKING from .base import ExecutionError, ExecutionResult, NotebookClientBase # noqa: F401 from .cache import NotebookClientCache from .direct import NotebookClientDirect from .inline import NotebookClientInline if TYPE_CHECKING: from nbformat import NotebookNode from myst_nb.core.config import NbParserConfig from myst_nb.core.loggers import LoggerType def create_client( notebook: NotebookNode, source: str, nb_config: NbParserConfig, logger: LoggerType, read_fmt: None | dict = None, ) -> NotebookClientBase: """Create a notebook execution client, to update its outputs. This function may execute the notebook if necessary, to update its outputs, or populate from a cache. :param notebook: The notebook to update. :param source: Path to or description of the input source being processed. :param nb_config: The configuration for the notebook parser. :param logger: The logger to use. :param read_fmt: The format of the input source (to parse to jupyter cache) :returns: The updated notebook, and the (optional) execution metadata. """ # path should only be None when using docutils programmatically, # e.g. source="" try: path = Path(source) if Path(source).is_file() else None except OSError: path = None # occurs on Windows for `source=""` # check if the notebook is excluded from execution by pattern if path is not None and nb_config.execution_excludepatterns: posix_path = PurePosixPath(path.as_posix()) for pattern in nb_config.execution_excludepatterns: if posix_path.match(pattern): logger.info(f"Excluded from execution by pattern: {pattern!r}") return NotebookClientBase(notebook, path, nb_config, logger) # 'auto' mode only executes the notebook if it is missing at least one output missing_outputs = ( len(cell.outputs) == 0 for cell in notebook.cells if cell["cell_type"] == "code" ) if nb_config.execution_mode == "auto" and not any(missing_outputs): logger.info("Skipped execution in 'auto' mode (all outputs present)") return NotebookClientBase(notebook, path, nb_config, logger) if nb_config.execution_mode in ("auto", "force"): return NotebookClientDirect(notebook, path, nb_config, logger) if nb_config.execution_mode == "cache": return NotebookClientCache(notebook, path, nb_config, logger, read_fmt=read_fmt) if nb_config.execution_mode == "inline": return NotebookClientInline(notebook, path, nb_config, logger) return NotebookClientBase(notebook, path, nb_config, logger) MyST-NB-1.1.2/myst_nb/core/execute/base.py000066400000000000000000000127511467453560600202230ustar00rootroot00000000000000"""Module for executing notebooks.""" from __future__ import annotations from pathlib import Path from typing import Any from nbformat import NotebookNode from typing_extensions import TypedDict, final from myst_nb.core.config import NbParserConfig from myst_nb.core.loggers import LoggerType from myst_nb.core.nb_to_tokens import nb_node_to_dict from myst_nb.ext.glue import extract_glue_data class ExecutionResult(TypedDict): """Result of executing a notebook.""" mtime: float """POSIX timestamp of the execution time""" runtime: float | None """runtime in seconds""" method: str """method used to execute the notebook""" succeeded: bool """True if the notebook executed successfully""" error: str | None """error type if the notebook failed to execute""" traceback: str | None """traceback if the notebook failed""" class ExecutionError(Exception): """An exception for failed execution and `execution_raise_on_error` is true.""" class EvalNameError(Exception): """An exception for if an evaluation variable name is invalid.""" class NotebookClientBase: """A base client for interacting with Jupyter notebooks. This class is intended to be used as a context manager, and should only be entered once. Subclasses should override the `start_client` and `close_client` methods. """ def __init__( self, notebook: NotebookNode, path: Path | None, nb_config: NbParserConfig, logger: LoggerType, **kwargs: Any, ): """Initialize the client.""" self._notebook = notebook self._path = path self._nb_config = nb_config self._logger = logger self._kwargs = kwargs self._glue_data: dict[str, NotebookNode] = {} self._exec_metadata: ExecutionResult | None = None # get or create source map of cell to source line # use 1-based indexing rather than 0, or pseudo base of the cell index _source_map: list[int] = notebook.metadata.get("source_map", None) self._source_map = [ (_source_map[i] if _source_map else ((i + 1) * 10000)) + 1 for i, _ in enumerate(notebook.cells) ] @final def __enter__(self) -> NotebookClientBase: """Enter the context manager.""" self.start_client() # extract glue data from the notebook self._glue_data = extract_glue_data( self.notebook, self._source_map, self.logger ) return self @final def __exit__(self, exc_type, exc_val, exc_tb): """Exit the context manager.""" self.close_client(exc_type, exc_val, exc_tb) def start_client(self): """Start the client.""" def finalise_client(self): """Finalise the client. This is called before final rendering and should be used, for example, to finalise the widget state on the metadata. """ def close_client(self, exc_type, exc_val, exc_tb): """Close the client.""" @property def notebook(self) -> NotebookNode: """Get the notebook.""" return self._notebook @property def path(self) -> Path | None: """Get the notebook path.""" return self._path @property def nb_config(self) -> NbParserConfig: """Get the notebook configuration.""" return self._nb_config @property def logger(self) -> LoggerType: """Get the logger.""" return self._logger @property def glue_data(self) -> dict[str, NotebookNode]: """Get the glue data.""" return self._glue_data @property def exec_metadata(self) -> ExecutionResult | None: """Get the execution metadata.""" return self._exec_metadata @exec_metadata.setter def exec_metadata(self, value: ExecutionResult): """Set the execution metadata.""" self._exec_metadata = value def cell_line(self, cell_index: int) -> int: """Get the source line number of a cell.""" return self._source_map[cell_index] @property def nb_metadata(self) -> dict[str, Any]: """Get the notebook level metadata.""" return nb_node_to_dict(self.notebook.get("metadata", {})) def nb_source_code_lexer(self) -> str | None: """Get the lexer for the notebook source code.""" metadata = self.notebook.get("metadata", {}) langinfo = metadata.get("language_info") or {} lexer = langinfo.get("pygments_lexer") or langinfo.get("name", None) if lexer is None: lexer = (metadata.get("kernelspec") or {}).get("language", None) return lexer def code_cell_outputs( self, cell_index: int ) -> tuple[int | None, list[NotebookNode]]: """Get the outputs of a cell. :returns: a tuple of the execution_count and the outputs :raises IndexError: if the cell index is out of range """ cells = self.notebook.get("cells", []) cell = cells[cell_index] return cell.get("execution_count", None), cell.get("outputs", []) def eval_variable(self, name: str) -> list[NotebookNode]: """Retrieve the value of a variable from the kernel. :param name: the name of the variable, must match the regex `[a-zA-Z][a-zA-Z0-9_]*` :returns: code cell outputs :raises NotImplementedError: if the execution mode does not support this feature :raises EvalNameError: if the variable name is invalid """ raise NotImplementedError MyST-NB-1.1.2/myst_nb/core/execute/cache.py000066400000000000000000000106741467453560600203560ustar00rootroot00000000000000"""Execute a notebook from the cache.""" from __future__ import annotations from contextlib import nullcontext, suppress from datetime import datetime import os from tempfile import TemporaryDirectory from typing import ContextManager from jupyter_cache import get_cache from jupyter_cache.base import CacheBundleIn from jupyter_cache.cache.db import NbProjectRecord from jupyter_cache.executors.utils import single_nb_execution from .base import ExecutionError, NotebookClientBase class NotebookClientCache(NotebookClientBase): """A notebook client that retrieves notebook outputs from the cache, or executes the notebook and adds them to the cache, on entrance of the context. """ def start_client(self): # setup the cache cache = get_cache(self.nb_config.execution_cache_path or ".jupyter_cache") # TODO config on what notebook/cell metadata to hash/merge # attempt to match the notebook to one in the cache cache_record = None with suppress(KeyError): cache_record = cache.match_cache_notebook(self.notebook) # use the cached notebook if it exists if cache_record is not None: self.logger.info(f"Using cached notebook: ID={cache_record.pk}") _, self._notebook = cache.merge_match_into_notebook(self.notebook) self.exec_metadata = { "mtime": cache_record.created.timestamp(), "runtime": cache_record.data.get("execution_seconds", None), "method": self.nb_config.execution_mode, "succeeded": True, "error": None, "traceback": None, } return if self.path is None: raise ValueError( "Input source must exist as file, if execution_mode is 'cache'" ) # attempt to execute the notebook read_fmt = self._kwargs.get("read_fmt", None) if read_fmt is not None: stage_record = cache.add_nb_to_project(str(self.path), read_data=read_fmt) else: stage_record = cache.add_nb_to_project(str(self.path)) # TODO do in try/except, in case of db write errors NbProjectRecord.remove_tracebacks([stage_record.pk], cache.db) cwd_context: ContextManager[str] = ( TemporaryDirectory() # type: ignore if self.nb_config.execution_in_temp else nullcontext(str(self.path.parent)) ) with cwd_context as cwd: cwd = os.path.abspath(cwd) self.logger.info( "Executing notebook using " + ("temporary" if self.nb_config.execution_in_temp else "local") + " CWD" ) result = single_nb_execution( self.notebook, cwd=cwd, allow_errors=self.nb_config.execution_allow_errors, timeout=self.nb_config.execution_timeout, meta_override=True, # TODO still support this? ) # handle success / failure cases # TODO do in try/except to be careful (in case of database write errors? if result.err is not None: msg = f"Executing notebook failed: {result.err.__class__.__name__}" if self.nb_config.execution_show_tb: msg += f"\n{result.exc_string}" self.logger.warning(msg, subtype="exec") if self.nb_config.execution_raise_on_error: raise ExecutionError(str(self.path)) from result.err NbProjectRecord.set_traceback(stage_record.uri, result.exc_string, cache.db) else: self.logger.info(f"Executed notebook in {result.time:.2f} seconds") cache_record = cache.cache_notebook_bundle( CacheBundleIn( self.notebook, stage_record.uri, data={"execution_seconds": result.time}, ), check_validity=False, overwrite=True, ) self.logger.info(f"Cached executed notebook: ID={cache_record.pk}") self.exec_metadata = { "mtime": datetime.now().timestamp(), "runtime": result.time, "method": self.nb_config.execution_mode, "succeeded": False if result.err else True, "error": f"{result.err.__class__.__name__}" if result.err else None, "traceback": result.exc_string if result.err else None, } MyST-NB-1.1.2/myst_nb/core/execute/direct.py000066400000000000000000000046271467453560600205660ustar00rootroot00000000000000"""Execute a notebook directly.""" from __future__ import annotations from contextlib import nullcontext from datetime import datetime import os from tempfile import TemporaryDirectory from typing import ContextManager from jupyter_cache.executors.utils import single_nb_execution from .base import ExecutionError, NotebookClientBase class NotebookClientDirect(NotebookClientBase): """A notebook client that executes the notebook directly, on entrance of the context. """ def start_client(self): # setup the execution current working directory cwd_context: ContextManager[str] if self.nb_config.execution_in_temp: cwd_context = TemporaryDirectory() else: if self.path is None: raise ValueError( "Input source must exist as file, if execution_in_temp=False" ) cwd_context = nullcontext(str(self.path.parent)) # execute in the context of the current working directory with cwd_context as cwd: cwd = os.path.abspath(cwd) self.logger.info( "Executing notebook using " + ("temporary" if self.nb_config.execution_in_temp else "local") + " CWD" ) result = single_nb_execution( self.notebook, cwd=cwd, allow_errors=self.nb_config.execution_allow_errors, timeout=self.nb_config.execution_timeout, meta_override=True, # TODO still support this? ) if result.err is not None: if self.nb_config.execution_raise_on_error: raise ExecutionError(str(self.path)) from result.err msg = f"Executing notebook failed: {result.err.__class__.__name__}" if self.nb_config.execution_show_tb: msg += f"\n{result.exc_string}" self.logger.warning(msg, subtype="exec") else: self.logger.info(f"Executed notebook in {result.time:.2f} seconds") self.exec_metadata = { "mtime": datetime.now().timestamp(), "runtime": result.time, "method": self.nb_config.execution_mode, "succeeded": False if result.err else True, "error": f"{result.err.__class__.__name__}" if result.err else None, "traceback": result.exc_string if result.err else None, } MyST-NB-1.1.2/myst_nb/core/execute/inline.py000066400000000000000000000167221467453560600205710ustar00rootroot00000000000000"""Execute a notebook inline.""" from __future__ import annotations import asyncio from datetime import datetime import re import shutil from tempfile import mkdtemp import time import traceback from nbclient.client import ( CellControlSignal, CellExecutionError, CellTimeoutError, DeadKernelError, NotebookClient, ensure_async, run_sync, ) import nbformat from nbformat import NotebookNode from myst_nb.ext.glue import extract_glue_data_cell from .base import EvalNameError, ExecutionError, NotebookClientBase class NotebookClientInline(NotebookClientBase): """A notebook client that executes the notebook inline, i.e. during the render. This allows for the client to be called in-between code cell executions, in order to extract variable state. """ def start_client(self): self._tmp_path = None if self.nb_config.execution_in_temp: self._tmp_path = mkdtemp() resources = {"metadata": {"path": self._tmp_path}} else: if self.path is None: raise ValueError( "Input source must exist as file, if execution_in_temp=False" ) resources = {"metadata": {"path": str(self.path.parent)}} self.logger.info("Starting inline execution client") self._time_start = time.perf_counter() self._client = ModifiedNotebookClient( self.notebook, record_timing=False, resources=resources, allow_errors=self.nb_config.execution_allow_errors, timeout=self.nb_config.execution_timeout, ) self._client.reset_execution_trackers() if self._client.km is None: self._client.km = self._client.create_kernel_manager() if not self._client.km.has_kernel: self._client.start_new_kernel() self._client.start_new_kernel_client() # retrieve the the language_info from the kernel assert self._client.kc is not None msg_id = self._client.kc.kernel_info() info_msg = self._client.wait_for_reply(msg_id) if info_msg is not None and "language_info" in info_msg["content"]: self.notebook.metadata["language_info"] = info_msg["content"][ "language_info" ] else: self.logger.warning("Failed to retrieve language info from kernel") self._last_cell_executed: int = -1 self._cell_error: None | Exception = None self._exc_string: None | str = None def finalise_client(self): try: self._client.set_widgets_metadata() except Exception as exc: self.logger.warning(f"Failed to set widgets metadata: {exc}") def close_client(self, exc_type, exc_val, exc_tb): self.logger.info("Stopping inline execution client") if self._client.owns_km: self._client._cleanup_kernel() del self._client _exec_time = time.perf_counter() - self._time_start self.exec_metadata = { "mtime": datetime.now().timestamp(), "runtime": _exec_time, "method": self.nb_config.execution_mode, "succeeded": False if self._cell_error else True, "error": f"{self._cell_error.__class__.__name__}" if self._cell_error else None, "traceback": self._exc_string, } if not self._cell_error: self.logger.info(f"Executed notebook in {_exec_time:.2f} seconds") else: msg = f"Executing notebook failed: {self._cell_error.__class__.__name__}" if self.nb_config.execution_show_tb: msg += f"\n{self._exc_string}" self.logger.warning(msg, subtype="exec") if self._tmp_path: shutil.rmtree(self._tmp_path, ignore_errors=True) def code_cell_outputs( self, cell_index: int ) -> tuple[int | None, list[NotebookNode]]: cells = self.notebook.get("cells", []) # ensure all cells up to and including the requested cell have been executed while (not self._cell_error) and cell_index > self._last_cell_executed: self._last_cell_executed += 1 try: next_cell = cells[self._last_cell_executed] except IndexError: break try: self._client.execute_cell( next_cell, self._last_cell_executed, execution_count=self._client.code_cells_executed + 1, ) except (CellExecutionError, CellTimeoutError) as err: if self.nb_config.execution_raise_on_error: raise ExecutionError(str(self.path)) from err self._cell_error = err self._exc_string = "".join(traceback.format_exc()) for key, cell_data in extract_glue_data_cell(next_cell): if key in self._glue_data: self.logger.warning( f"glue key {key!r} duplicate", subtype="glue", line=self.cell_line(self._last_cell_executed), ) self._glue_data[key] = cell_data cell = cells[cell_index] return cell.get("execution_count", None), cell.get("outputs", []) def eval_variable(self, name: str) -> list[NotebookNode]: if not re.match(self.nb_config.eval_name_regex, name): raise EvalNameError(name) return self._client.eval_expression(name) class ModifiedNotebookClient(NotebookClient): async def async_eval_expression(self, name: str) -> list[NotebookNode]: """Evaluate an expression in the kernel. This is a modified version of `async_execute_cell`, which executed a single cell, with `name` as the source and returns the result. """ assert self.kc is not None self.log.debug(f"Evaluating expression: {name}") parent_msg_id = await ensure_async( self.kc.execute( str(name), store_history=False, stop_on_error=False, ) ) cell = nbformat.v4.new_code_cell(source=str(name)) exec_timeout = self._get_timeout(cell) cell_index = -1 self.clear_before_next_output = False task_poll_kernel_alive = asyncio.ensure_future(self._async_poll_kernel_alive()) task_poll_output_msg = asyncio.ensure_future( self._async_poll_output_msg(parent_msg_id, cell, cell_index) ) self.task_poll_for_reply = asyncio.ensure_future( self._async_poll_for_reply( parent_msg_id, cell, exec_timeout, task_poll_output_msg, task_poll_kernel_alive, ) ) try: await self.task_poll_for_reply except asyncio.CancelledError: # can only be cancelled by task_poll_kernel_alive when the kernel is dead task_poll_output_msg.cancel() raise DeadKernelError("Kernel died") except Exception as e: # Best effort to cancel request if it hasn't been resolved try: # Check if the task_poll_output is doing the raising for us if not isinstance(e, CellControlSignal): task_poll_output_msg.cancel() finally: raise return cell.outputs eval_expression = run_sync(async_eval_expression) MyST-NB-1.1.2/myst_nb/core/lexers.py000066400000000000000000000125701467453560600171500ustar00rootroot00000000000000"""Pygments lexers""" from __future__ import annotations import re # this is not added as an entry point in ipython, so we add it in this package from IPython.lib.lexers import IPythonTracebackLexer # noqa: F401 import pygments.lexer import pygments.token _ansi_code_to_color = { 0: "Black", 1: "Red", 2: "Green", 3: "Yellow", 4: "Blue", 5: "Magenta", 6: "Cyan", 7: "White", } def _token_from_lexer_state( bold: bool, faint: bool, fg_color: str | None, bg_color: str | None ): """Construct a token given the current lexer state. We can only emit one token even though we have a multiple-tuple state. To do work around this, we construct tokens like "Bold.Red". """ components: tuple[str, ...] = () if bold: components += ("Bold",) if faint: components += ("Faint",) if fg_color: components += (fg_color,) if bg_color: components += ("BG" + bg_color,) if len(components) == 0: return pygments.token.Text else: token = pygments.token.Token.Color for component in components: token = getattr(token, component) return token class AnsiColorLexer(pygments.lexer.RegexLexer): """Pygments lexer for text containing ANSI color codes. Adapted from https://github.com/chriskuehl/pygments-ansi-color """ name = "ANSI Color" aliases = ("myst-ansi",) flags = re.DOTALL | re.MULTILINE def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.reset_state() def reset_state(self): self.bold = False self.faint = False self.fg_color = None self.bg_color = None @property def current_token(self): return _token_from_lexer_state( self.bold, self.faint, self.fg_color, self.bg_color, ) def process(self, match): """Produce the next token and bit of text. Interprets the ANSI code (which may be a color code or some other code), changing the lexer state and producing a new token. If it's not a color code, we just strip it out and move on. Some useful reference for ANSI codes: * http://ascii-table.com/ansi-escape-sequences.php """ # "after_escape" contains everything after the start of the escape # sequence, up to the next escape sequence. We still need to separate # the content from the end of the escape sequence. after_escape = match.group(1) # TODO: this doesn't handle the case where the values are non-numeric. # This is rare but can happen for keyboard remapping, e.g. # '\x1b[0;59;"A"p' parsed = re.match( r"([0-9;=]*?)?([a-zA-Z])(.*)$", after_escape, re.DOTALL | re.MULTILINE, ) if parsed is None: # This shouldn't ever happen if we're given valid text + ANSI, but # people can provide us with utter junk, and we should tolerate it. text = after_escape else: value, code, text = parsed.groups() if code == "m": # "m" is "Set Graphics Mode" # Special case \x1b[m is a reset code if value == "": self.reset_state() else: try: values = [int(v) for v in value.split(";")] except ValueError: # Shouldn't ever happen, but could with invalid ANSI. values = [] while len(values) > 0: value = values.pop(0) fg_color = _ansi_code_to_color.get(value - 30) bg_color = _ansi_code_to_color.get(value - 40) if fg_color: self.fg_color = fg_color elif bg_color: self.bg_color = bg_color elif value == 1: self.bold = True elif value == 2: self.faint = True elif value == 22: self.bold = False self.faint = False elif value == 39: self.fg_color = None elif value == 49: self.bg_color = None elif value == 0: self.reset_state() elif value in (38, 48): try: five = values.pop(0) color = values.pop(0) except IndexError: continue else: if five != 5: continue if not 0 <= color <= 255: continue if value == 38: self.fg_color = f"C{color}" else: self.bg_color = f"C{color}" yield match.start(), self.current_token, text tokens = { "root": [(r"\x1b\[([^\x1b]*)", process), (r"[^\x1b]+", pygments.token.Text)], } MyST-NB-1.1.2/myst_nb/core/loggers.py000066400000000000000000000122041467453560600173020ustar00rootroot00000000000000"""This module provides equivalent loggers for both docutils and sphinx. These loggers act like standard Python logging.Logger objects, but route messages via the docutils/sphinx reporting systems. They are initialised with a docutils document, in order to provide the source location of the log message, and can also both handle ``line`` and ``subtype`` keyword arguments: ``logger.warning("message", line=1, subtype="foo")`` """ import logging from typing import Union from docutils import nodes DEFAULT_LOG_TYPE = "mystnb" class SphinxDocLogger(logging.LoggerAdapter): """Wraps a Sphinx logger, which routes messages to the docutils document reporter. The document path and message type are automatically included in the message, and ``line`` is allowed as a keyword argument, as well as the standard sphinx logger keywords: ``subtype``, ``color``, ``once``, ``nonl``. As per the sphinx logger, warnings are suppressed, if their ``type.subtype`` are included in the ``suppress_warnings`` configuration. These are also appended to the end of messages. """ def __init__(self, document: nodes.document, type_name: str = DEFAULT_LOG_TYPE): from sphinx.util import logging as sphinx_logging docname = document.settings.env.docname self.logger = sphinx_logging.getLogger(f"{type_name}-{docname}") # default extras to parse to sphinx logger # location can be: docname, (docname, lineno), or a node self.extra = {"docname": docname, "type": type_name} def process(self, msg, kwargs): self.extra: dict kwargs["extra"] = self.extra if "type" in kwargs: # override type self.extra["type"] = kwargs.pop("type") subtype = ("." + kwargs["subtype"]) if "subtype" in kwargs else "" if kwargs.get("line", None) is not None: # add line to location # note this will be overridden by the location keyword self.extra["location"] = (self.extra["docname"], kwargs.pop("line")) else: self.extra["location"] = self.extra["docname"] if "parent" in kwargs: # TODO ideally here we would append a system_message to this node, # then it could replace myst_parser.SphinxRenderer.create_warning self.extra["parent"] = kwargs.pop("parent") return f"{msg} [{self.extra['type']}{subtype}]", kwargs class DocutilsDocLogger(logging.LoggerAdapter): """A logger which routes messages to the docutils document reporter. The document path and message type are automatically included in the message, and ``line`` is allowed as a keyword argument. The standard sphinx logger keywords are allowed but ignored: ``subtype``, ``color``, ``once``, ``nonl``. ``type.subtype`` are also appended to the end of messages. """ KEYWORDS = [ "type", "subtype", "location", "nonl", "color", "once", "line", "parent", ] def __init__(self, document: nodes.document, type_name: str = DEFAULT_LOG_TYPE): self.logger: logging.Logger = logging.getLogger( f"{type_name}-{document.source}" ) # docutils handles the level of output logging self.logger.setLevel(logging.DEBUG) if not self.logger.handlers: self.logger.addHandler(DocutilsLogHandler(document)) # default extras to parse to sphinx logger # location can be: docname, (docname, lineno), or a node self.extra = {"type": type_name, "line": None, "parent": None} def process(self, msg, kwargs): kwargs["extra"] = self.extra subtype = ("." + kwargs["subtype"]) if "subtype" in kwargs else "" for keyword in self.KEYWORDS: if keyword in kwargs: kwargs["extra"][keyword] = kwargs.pop(keyword) etype = "" if not self.extra else self.extra.get("type", "") return f"{msg} [{etype}{subtype}]", kwargs class DocutilsLogHandler(logging.Handler): """Handle logging via a docutils reporter.""" def __init__(self, document: nodes.document) -> None: """Initialize a new handler.""" super().__init__() self._document = document reporter = self._document.reporter self._name_to_level = { "DEBUG": reporter.DEBUG_LEVEL, "INFO": reporter.INFO_LEVEL, "WARN": reporter.WARNING_LEVEL, "WARNING": reporter.WARNING_LEVEL, "ERROR": reporter.ERROR_LEVEL, "CRITICAL": reporter.SEVERE_LEVEL, "FATAL": reporter.SEVERE_LEVEL, } def emit(self, record: logging.LogRecord) -> None: """Handle a log record.""" levelname = record.levelname.upper() level = self._name_to_level.get(levelname, self._document.reporter.DEBUG_LEVEL) node = self._document.reporter.system_message( level, record.msg, **({"line": record.line} if record.line is not None else {}), # type: ignore ) if record.parent is not None: # type: ignore record.parent.append(node) # type: ignore LoggerType = Union[DocutilsDocLogger, SphinxDocLogger] MyST-NB-1.1.2/myst_nb/core/nb_to_tokens.py000066400000000000000000000126361467453560600203350ustar00rootroot00000000000000"""Module for parsing notebooks to Markdown-it tokens.""" from __future__ import annotations from typing import Any from markdown_it.main import MarkdownIt from markdown_it.rules_core import StateCore from markdown_it.token import Token from nbformat import NotebookNode from myst_nb.core.loggers import LoggerType def nb_node_to_dict(node: NotebookNode) -> dict[str, Any]: """Recursively convert a notebook node to a dict.""" return _nb_node_to_dict(node) def _nb_node_to_dict(item: Any) -> Any: """Recursively convert any notebook nodes to dict.""" if isinstance(item, NotebookNode): return {k: _nb_node_to_dict(v) for k, v in item.items()} return item def notebook_to_tokens( notebook: NotebookNode, mdit_parser: MarkdownIt, mdit_env: dict[str, Any], logger: LoggerType, ) -> list[Token]: # disable front-matter, since this is taken from the notebook mdit_parser.disable("front_matter", ignoreInvalid=True) # this stores global state, such as reference definitions # Parse block tokens only first, leaving inline parsing to a second phase # (required to collect all reference definitions, before assessing references). block_tokens = [Token("nb_initialise", "", 0, map=[0, 0])] for cell_index, nb_cell in enumerate(notebook.cells): # skip empty cells if len(nb_cell["source"].strip()) == 0: continue # skip cells tagged for removal tags = nb_cell.metadata.get("tags", []) if ("remove_cell" in tags) or ("remove-cell" in tags): continue # generate tokens tokens: list[Token] if nb_cell["cell_type"] == "markdown": # https://nbformat.readthedocs.io/en/5.1.3/format_description.html#markdown-cells # TODO if cell has tag output-caption, then use as caption for next/preceding cell? tokens = [ Token( "nb_cell_markdown_open", "", 1, hidden=True, meta={ "index": cell_index, "metadata": nb_node_to_dict(nb_cell["metadata"]), }, map=[0, len(nb_cell["source"].splitlines()) - 1], ), ] with mdit_parser.reset_rules(): # enable only rules up to block rules = mdit_parser.core.ruler.get_active_rules() mdit_parser.core.ruler.enableOnly(rules[: rules.index("inline")]) tokens.extend(mdit_parser.parse(nb_cell["source"], mdit_env)) tokens.append( Token( "nb_cell_markdown_close", "", -1, hidden=True, ), ) elif nb_cell["cell_type"] == "raw": # https://nbformat.readthedocs.io/en/5.1.3/format_description.html#raw-nbconvert-cells tokens = [ Token( "nb_cell_raw", "code", 0, content=nb_cell["source"], meta={ "index": cell_index, "metadata": nb_node_to_dict(nb_cell["metadata"]), }, map=[0, 0], ) ] elif nb_cell["cell_type"] == "code": # https://nbformat.readthedocs.io/en/5.1.3/format_description.html#code-cells # we don't copy the outputs here, since this would # greatly increase the memory consumption, # instead they will referenced by the cell index tokens = [ Token( "nb_cell_code", "code", 0, content=nb_cell["source"], meta={ "index": cell_index, "metadata": nb_node_to_dict(nb_cell["metadata"]), }, map=[0, 0], ) ] else: pass # TODO create warning # update token's source lines, using either a source_map (index -> line), # set when converting to a notebook, or a pseudo base of the cell index smap = notebook.metadata.get("source_map", None) start_line = smap[cell_index] if smap else (cell_index + 1) * 10000 start_line += 1 # use base 1 rather than 0 for token in tokens: if token.map: token.map = [start_line + token.map[0], start_line + token.map[1]] # also update the source lines for duplicate references for dup_ref in mdit_env.get("duplicate_refs", []): if "fixed" not in dup_ref: dup_ref["map"] = [ start_line + dup_ref["map"][0], start_line + dup_ref["map"][1], ] dup_ref["fixed"] = True # add tokens to list block_tokens.extend(tokens) block_tokens.append(Token("nb_finalise", "", 0, map=[0, 0])) # Now all definitions have been gathered, run the inline parsing phase state = StateCore("", mdit_parser, mdit_env, block_tokens) with mdit_parser.reset_rules(): rules = mdit_parser.core.ruler.get_active_rules() mdit_parser.core.ruler.enableOnly(rules[rules.index("inline") :]) mdit_parser.core.process(state) return state.tokens MyST-NB-1.1.2/myst_nb/core/read.py000066400000000000000000000341541467453560600165630ustar00rootroot00000000000000"""Module for reading notebook formats from a string input.""" from __future__ import annotations import dataclasses as dc from functools import partial import json from pathlib import Path from typing import Callable, Iterator from docutils.parsers.rst import Directive from markdown_it.renderer import RendererHTML from myst_parser.config.main import MdParserConfig from myst_parser.parsers.mdit import create_md_parser import nbformat as nbf import yaml from myst_nb.core.config import NbParserConfig from myst_nb.core.loggers import DocutilsDocLogger, SphinxDocLogger NOTEBOOK_VERSION = 4 """The notebook version that readers should return.""" @dc.dataclass() class NbReader: """A data class for reading a notebook format.""" read: Callable[[str], nbf.NotebookNode] """The function to read a notebook from a (utf8) string.""" md_config: MdParserConfig """The configuration for parsing markdown cells.""" read_fmt: dict | None = dc.field(default=None) """The type of the reader, if known.""" def standard_nb_read(text: str) -> nbf.NotebookNode: """Read a standard .ipynb notebook from a string.""" return nbf.reads(text, as_version=NOTEBOOK_VERSION) def create_nb_reader( path: str, md_config: MdParserConfig, nb_config: NbParserConfig, content: None | str | Iterator[str], ) -> NbReader | None: """Create a notebook reader, given a string, source path and configuration. Note, we do not directly parse to a notebook, since jupyter-cache functionality requires the reader. :param path: Path to the input source being processed. :param nb_config: The configuration for parsing Notebooks. :param md_config: The default configuration for parsing Markown. :param content: The input string (optionally used to check for text-based notebooks) :returns: the notebook reader, and the (potentially modified) MdParserConfig, or None if the input cannot be read as a notebook. """ # the import is here so this module can be loaded without sphinx from sphinx.util import import_object # get all possible readers readers = nb_config.custom_formats.copy() # add the default reader readers.setdefault(".ipynb", (standard_nb_read, {}, False)) # type: ignore # we check suffixes ordered by longest first, to ensure we get the "closest" match iterator = sorted(readers.items(), key=lambda x: len(x[0]), reverse=True) for suffix, (reader, reader_kwargs, commonmark_only) in iterator: if Path(path).suffix == suffix: if isinstance(reader, str): # attempt to load the reader as an object path reader = import_object(reader) if commonmark_only: # Markdown cells should be read as Markdown only md_config = dc.replace(md_config, commonmark_only=True) return NbReader(partial(reader, **(reader_kwargs or {})), md_config) # type: ignore # a Markdown file is a special case, since we only treat it as a notebook, # if it starts with certain "top-matter" if content is not None and is_myst_markdown_notebook(content): return NbReader( partial( read_myst_markdown_notebook, config=md_config, add_source_map=True, path=path, ), md_config, {"type": "plugin", "name": "myst_nb_md"}, ) # if we get here, we did not find a reader return None def is_myst_markdown_notebook(text: str | Iterator[str]) -> bool: """Check if the input is a MyST Markdown notebook. This is identified by the presence of a top-matter section, containing either:: --- file_format: mystnb --- or:: --- jupytext: text_representation: format_name: myst --- :param text: The input text. :returns: True if the input is a markdown notebook. """ if isinstance(text, str): if not text.startswith("---"): # skip creating the line list in memory return False text = (line for line in text.splitlines()) try: if not next(text).startswith("---"): return False except StopIteration: return False top_matter = [] for line in text: if line.startswith("---") or line.startswith("..."): break top_matter.append(line.rstrip() + "\n") try: metadata = yaml.safe_load("".join(top_matter)) assert isinstance(metadata, dict) except Exception: return False if "file_format" in metadata and metadata["file_format"] == "mystnb": return True if ( metadata.get("jupytext", {}) .get("text_representation", {}) .get("format_name", None) != "myst" ): return False return True # TODO move this to reader, since not strictly part of function objective # or just allow nbformat/nbclient to handle the failure # if "name" not in metadata.get("kernelspec", {}): # raise IOError( # "A myst notebook text-representation requires " "kernelspec/name metadata" # ) # if "display_name" not in metadata.get("kernelspec", {}): # raise IOError( # "A myst notebook text-representation requires " # "kernelspec/display_name metadata" # ) def myst_nb_reader_plugin(uri: str) -> nbf.NotebookNode: """Read a myst notebook from a string. Used as plugin for jupyter-cache. """ return read_myst_markdown_notebook( Path(uri).read_text("utf8"), add_source_map=True, path=uri ) def read_myst_markdown_notebook( text, config: MdParserConfig | None = None, code_directive="{code-cell}", raw_directive="{raw-cell}", add_source_map=False, path: str | Path | None = None, ) -> nbf.NotebookNode: """Convert text written in the myst format to a notebook. :param text: the file text :param code_directive: the name of the directive to search for containing code cells :param raw_directive: the name of the directive to search for containing raw cells :param add_source_map: add a `source_map` key to the notebook metadata, which is a list of the starting source line number for each cell. :param path: path to notebook (required for :load:) :raises MystMetadataParsingError if the metadata block is not valid JSON/YAML NOTE: we assume here that all of these directives are at the top-level, i.e. not nested in other directives. """ config = config or MdParserConfig() # parse markdown file up to the block level (i.e. don't worry about inline text) inline_config = dc.replace( config, disable_syntax=(list(config.disable_syntax) + ["inline"]) ) parser = create_md_parser(inline_config, RendererHTML) tokens = parser.parse(text + "\n") lines = text.splitlines() md_start_line = 0 # get the document metadata metadata_nb = {} if tokens[0].type == "front_matter": metadata = tokens.pop(0) md_start_line = metadata.map[1] if metadata.map else 0 try: metadata_nb = yaml.safe_load(metadata.content) except (yaml.parser.ParserError, yaml.scanner.ScannerError) as error: raise MystMetadataParsingError(f"Notebook metadata: {error}") # add missing display name to the metadata, as required by the nbformat schema: # https://github.com/jupyter/nbformat/blob/f712d60f13c5b168313222cbf4bee7face98a081/nbformat/v4/nbformat.v4.5.schema.json#L16 if ( "kernelspec" in metadata_nb and "name" in metadata_nb["kernelspec"] and "display_name" not in metadata_nb["kernelspec"] ): metadata_nb["kernelspec"]["display_name"] = metadata_nb["kernelspec"]["name"] # create an empty notebook nbf_version = nbf.v4 kwargs = {"metadata": nbf.from_dict(metadata_nb)} notebook = nbf_version.new_notebook(**kwargs) source_map = [] # this is a list of the starting line number for each cell def _flush_markdown(start_line, token, md_metadata): """When we find a cell we check if there is preceding text.o""" endline = token.map[0] if token else len(lines) md_source = _strip_blank_lines("\n".join(lines[start_line:endline])) meta = nbf.from_dict(md_metadata) if md_source: source_map.append(start_line) notebook.cells.append( nbf_version.new_markdown_cell(source=md_source, metadata=meta) ) # iterate through the tokens to identify notebook cells nesting_level = 0 md_metadata: dict = {} for token in tokens: nesting_level += token.nesting if nesting_level != 0: # we ignore fenced block that are nested, e.g. as part of lists, etc continue token_map = token.map or [0, 0] if token.type == "fence" and token.info.startswith(code_directive): _flush_markdown(md_start_line, token, md_metadata) options, body_lines = _read_fenced_cell(token, len(notebook.cells), "Code") # Parse :load: or load: tags and populate body with contents of file if "load" in options: body_lines = _load_code_from_file( path, options["load"], token, body_lines ) meta = nbf.from_dict(options) source_map.append(token_map[0] + 1) notebook.cells.append( nbf_version.new_code_cell(source="\n".join(body_lines), metadata=meta) ) md_metadata = {} md_start_line = token_map[1] elif token.type == "fence" and token.info.startswith(raw_directive): _flush_markdown(md_start_line, token, md_metadata) options, body_lines = _read_fenced_cell(token, len(notebook.cells), "Raw") meta = nbf.from_dict(options) source_map.append(token_map[0] + 1) notebook.cells.append( nbf_version.new_raw_cell(source="\n".join(body_lines), metadata=meta) ) md_metadata = {} md_start_line = token_map[1] elif token.type == "myst_block_break": _flush_markdown(md_start_line, token, md_metadata) md_metadata = _read_cell_metadata(token, len(notebook.cells)) md_start_line = token_map[1] _flush_markdown(md_start_line, None, md_metadata) if add_source_map: notebook.metadata["source_map"] = source_map return notebook class MystMetadataParsingError(Exception): """Error when parsing metadata from myst formatted text""" class _LoadFileParsingError(Exception): """Error when parsing files for code-blocks/code-cells""" def _strip_blank_lines(text): text = text.rstrip() while text and text.startswith("\n"): text = text[1:] return text class _MockDirective: option_spec = {"options": True} required_arguments = 0 optional_arguments = 1 has_content = True def _read_fenced_cell(token, cell_index, cell_type): from myst_parser.parsers.directives import parse_directive_text result = parse_directive_text( directive_class=_MockDirective, first_line="", content=token.content, validate_options=False, ) if result.warnings: raise MystMetadataParsingError( "{} cell {} at line {} could not be read: {}".format( cell_type, cell_index, token.map[0] + 1, result.warnings[0] ) ) return result.options, result.body def _read_cell_metadata(token, cell_index): metadata = {} if token.content: try: metadata = json.loads(token.content.strip()) except Exception as err: raise MystMetadataParsingError( "Markdown cell {} at line {} could not be read: {}".format( cell_index, token.map[0] + 1, err ) ) if not isinstance(metadata, dict): raise MystMetadataParsingError( "Markdown cell {} at line {} is not a dict".format( cell_index, token.map[0] + 1 ) ) return metadata def _load_code_from_file( nb_path: None | str | Path, file_name: str, token, body_lines: list[str] ): """load source code from a file.""" if nb_path is None: raise _LoadFileParsingError("path to notebook not supplied for :load:") file_path = Path(nb_path).parent.joinpath(file_name).resolve() if len(body_lines): pass # TODO this would make the reader dependent on sphinx # line = token.map[0] if token.map else 0 # msg = ( # f"{nb_path}:{line} content of code-cell is being overwritten by " # f":load: {file_name}" # ) # LOGGER.warning(msg) try: body_lines = file_path.read_text().split("\n") except Exception: raise _LoadFileParsingError(f"Can't read file from :load: {file_path}") return body_lines class UnexpectedCellDirective(Directive): """The `{code-cell}`` and ``{raw-cell}`` directives, are special cases, which are picked up by the MyST Markdown reader to convert them into notebooks. If any are left in the parsed Markdown, it probably means that they were nested inside another directive, which is not allowed. Therefore, we log a warning if it is triggered, and discard it. """ optional_arguments = 1 final_argument_whitespace = True has_content = True def run(self): """Run the directive.""" message = ( "Found an unexpected `code-cell` or `raw-cell` directive. " "Either this file was not converted to a notebook, " "because Jupytext header content was missing, " "or the `code-cell` was not converted, because it is nested. " "See https://myst-nb.readthedocs.io/en/latest/use/markdown.html " "for more information." ) document = self.state.document if hasattr(document.settings, "env"): logger = SphinxDocLogger(document) else: logger = DocutilsDocLogger(document) # type: ignore logger.warning(message, line=self.lineno, subtype="nbcell") return [] MyST-NB-1.1.2/myst_nb/core/render.py000066400000000000000000001347171467453560600171350ustar00rootroot00000000000000"""Module for rendering notebook components to docutils nodes. Note, this module purposely does not import any Sphinx modules at the top-level, in order for docutils-only use. """ from __future__ import annotations from binascii import a2b_base64 from contextlib import contextmanager import dataclasses as dc from functools import lru_cache import hashlib import json from mimetypes import guess_extension import os from pathlib import Path import re from typing import TYPE_CHECKING, Any, ClassVar, Iterator, Sequence, Union from docutils import nodes from docutils.parsers.rst import directives as options_spec from importlib_metadata import entry_points from myst_parser.config.main import MdParserConfig from myst_parser.mdit_to_docutils.base import token_line from myst_parser.parsers.mdit import create_md_parser from nbformat import NotebookNode from typing_extensions import Protocol from myst_nb.core.config import NbParserConfig from myst_nb.core.execute import NotebookClientBase from myst_nb.core.loggers import LoggerType # DEFAULT_LOG_TYPE, from myst_nb.core.utils import coalesce_streams from myst_nb.warnings_ import MystNBWarnings, create_warning if TYPE_CHECKING: from markdown_it.tree import SyntaxTreeNode from myst_nb.docutils_ import DocutilsNbRenderer, DocutilsRenderer from myst_nb.sphinx_ import SphinxNbRenderer, SphinxRenderer SelfType = Union["MditRenderMixin", DocutilsRenderer, SphinxRenderer] WIDGET_STATE_MIMETYPE = "application/vnd.jupyter.widget-state+json" WIDGET_VIEW_MIMETYPE = "application/vnd.jupyter.widget-view+json" RENDER_ENTRY_GROUP = "myst_nb.renderers" MIME_RENDER_ENTRY_GROUP = "myst_nb.mime_renderers" _ANSI_RE = re.compile("\x1b\\[(.*?)([@-~])") _QUOTED_RE = re.compile(r"^([\"']).*\1$") class MditRenderMixin: """Mixin for rendering markdown-it tokens to docutils nodes. This has shared methods for both the `DocutilsRenderer` and `SphinxRenderer` """ # required by mypy md_options: dict[str, Any] document: nodes.document render_children: Any add_line_and_source_path: Any add_line_and_source_path_r: Any current_node: Any current_node_context: Any create_highlighted_code_block: Any @property def nb_config(self: SelfType) -> NbParserConfig: """Get the notebook element renderer.""" return self.md_options["nb_config"] @property def nb_client(self: SelfType) -> NotebookClientBase: """Get the notebook element renderer.""" return self.md_options["nb_client"] @property def nb_renderer(self: SelfType) -> NbElementRenderer: """Get the notebook element renderer.""" return self.document["nb_renderer"] def get_cell_level_config( self: SelfType, field: str, cell_metadata: dict[str, Any], line: int | None = None, ) -> Any: """Get a configuration value at the cell level. Takes the highest priority configuration from: `cell > document > global > default` :param field: the field name from ``NbParserConfig`` to get the value for :param cell_metadata: the metadata for the cell """ def _callback(msg: str, subtype: MystNBWarnings): create_warning(self.document, msg, line=line, subtype=subtype) return self.nb_config.get_cell_level_config(field, cell_metadata, _callback) def render_nb_initialise(self, token: SyntaxTreeNode) -> None: """Run rendering at the start of the notebook.""" def render_nb_finalise(self, token: SyntaxTreeNode) -> None: """Run rendering at the end of the notebook.""" self.nb_client.finalise_client() self.nb_renderer.render_nb_finalise(self.nb_client.nb_metadata) def render_nb_cell_markdown(self: SelfType, token: SyntaxTreeNode) -> None: """Render a notebook markdown cell.""" # TODO this is currently just a "pass-through", but we could utilise the metadata # it would be nice to "wrap" this in a container that included the metadata, # but unfortunately this would break the heading structure of docutils/sphinx. # perhaps we add an "invisible" (non-rendered) marker node to the document tree, self.render_children(token) def render_nb_cell_raw(self: SelfType, token: SyntaxTreeNode) -> None: """Render a notebook raw cell.""" line = token_line(token, 0) _nodes = self.nb_renderer.render_raw_cell( token.content, token.meta["metadata"], token.meta["index"], line ) self.add_line_and_source_path_r(_nodes, token) self.current_node.extend(_nodes) def render_nb_cell_code(self: SelfType, token: SyntaxTreeNode) -> None: """Render a notebook code cell.""" cell_index = token.meta["index"] cell_line = token_line(token, 0) or None tags = token.meta["metadata"].get("tags", []) exec_count, outputs = self._get_nb_code_cell_outputs(token) classes = ["cell"] for tag in tags: classes.append(f"tag_{tag.replace(' ', '_')}") # TODO do we need this -/_ duplication of tag names, or can we deprecate one? hide_cell = "hide-cell" in tags remove_input = ( self.get_cell_level_config( "remove_code_source", token.meta["metadata"], line=cell_line ) or ("remove_input" in tags) or ("remove-input" in tags) ) hide_input = "hide-input" in tags remove_output = ( self.get_cell_level_config( "remove_code_outputs", token.meta["metadata"], line=cell_line ) or ("remove_output" in tags) or ("remove-output" in tags) ) hide_output = "hide-output" in tags # if we are remove both the input and output, we can skip the cell if remove_input and remove_output: return hide_mode = None if hide_cell: hide_mode = "all" elif hide_input and hide_output: hide_mode = "input+output" elif hide_input: hide_mode = "input" elif hide_output: hide_mode = "output" # create a container for all the input/output cell_container = nodes.container( nb_element="cell_code", cell_index=cell_index, # TODO some way to use this to allow repr of count in outputs like HTML? exec_count=exec_count, cell_metadata=token.meta["metadata"], classes=classes, ) if hide_mode: cell_container["hide_mode"] = hide_mode code_prompt_show = self.get_cell_level_config( "code_prompt_show", token.meta["metadata"], line=cell_line ) code_prompt_hide = self.get_cell_level_config( "code_prompt_hide", token.meta["metadata"], line=cell_line ) cell_container["prompt_show"] = code_prompt_show cell_container["prompt_hide"] = code_prompt_hide self.add_line_and_source_path(cell_container, token) with self.current_node_context(cell_container, append=True): # render the code source code if not remove_input: cell_input = nodes.container( nb_element="cell_code_source", classes=["cell_input"] ) self.add_line_and_source_path(cell_input, token) with self.current_node_context(cell_input, append=True): self._render_nb_cell_code_source(token) # render the execution output, if any if outputs and (not remove_output): cell_output = nodes.container( nb_element="cell_code_output", classes=["cell_output"] ) self.add_line_and_source_path(cell_output, token) with self.current_node_context(cell_output, append=True): self._render_nb_cell_code_outputs(token, outputs) def _get_nb_source_code_lexer( self: SelfType, cell_index: int, warn_missing: bool = True, line: int | None = None, ) -> str | None: """Get the lexer name for code cell source.""" lexer = self.nb_client.nb_source_code_lexer() if lexer is None and warn_missing: # TODO this will create a warning for every cell, but perhaps # it should only be a single warning for the notebook (as previously) # TODO allow user to set default lexer? create_warning( self.document, f"No source code lexer found for notebook cell {cell_index + 1}", # wtype=DEFAULT_LOG_TYPE, subtype=MystNBWarnings.LEXER, line=line, append_to=self.current_node, ) return lexer def _render_nb_cell_code_source(self: SelfType, token: SyntaxTreeNode) -> None: """Render a notebook code cell's source.""" cell_index = token.meta["index"] line = token_line(token, 0) or None node = self.create_highlighted_code_block( token.content, self._get_nb_source_code_lexer(cell_index, line=line), number_lines=self.get_cell_level_config( "number_source_lines", token.meta["metadata"], line=line, ), source=self.document["source"], line=token_line(token), ) self.add_line_and_source_path(node, token) self.current_node.append(node) def _get_nb_code_cell_outputs( self, token: SyntaxTreeNode ) -> tuple[int | None, list[NotebookNode]]: """Get the outputs for a code cell and its execution count.""" cell_index = token.meta["index"] line = token_line(token, 0) or None exec_count, outputs = self.nb_client.code_cell_outputs(cell_index) if self.get_cell_level_config("merge_streams", token.meta["metadata"], line): # TODO should this be saved on the output notebook outputs = coalesce_streams(outputs) return exec_count, outputs def _render_nb_cell_code_outputs( self, token: SyntaxTreeNode, outputs: list[NotebookNode] ) -> None: """Render a notebook code cell's outputs.""" # for display_data/execute_result this is different in the # docutils/sphinx implementation, # since sphinx delays MIME type selection until a post-transform # (when the output format is known) # TODO how to output MyST Markdown? # currently text/markdown is set to be rendered as CommonMark only, # with headings disallowed, # to avoid "side effects" if the mime is discarded but contained # targets, etc, and because we can't parse headings within containers. # perhaps we could have a config option to allow this? # - for non-commonmark, the text/markdown would always be considered # the top priority, and all other mime types would be ignored. # - for headings, we would also need to parsing the markdown # at the "top-level", i.e. not nested in container(s) raise NotImplementedError @dc.dataclass() class MimeData: """Mime data from an execution output (display_data / execute_result) e.g. notebook.cells[0].outputs[0].data['text/plain'] = "Hello, world!" see: https://nbformat.readthedocs.io/en/5.1.3/format_description.html#display-data """ mime_type: str """Mime type key of the output.data""" content: str | bytes """Data value of the output.data""" cell_metadata: dict[str, Any] = dc.field(default_factory=dict) """Cell level metadata of the output""" output_metadata: dict[str, Any] = dc.field(default_factory=dict) """Output level metadata of the output""" cell_index: int | None = None """Index of the cell in the notebook""" output_index: int | None = None """Index of the output in the cell""" line: int | None = None """Source line of the cell""" @property def string(self) -> str: """Get the content as a string.""" try: return self.content.decode("utf-8") # type: ignore except AttributeError: return self.content # type: ignore class NbElementRenderer: """A class for rendering notebook elements.""" def __init__( self, renderer: DocutilsNbRenderer | SphinxNbRenderer, logger: LoggerType ) -> None: """Initialize the renderer. :params output_folder: the folder path for external outputs (like images) """ self._renderer = renderer self._logger = logger @property def renderer(self) -> DocutilsNbRenderer | SphinxNbRenderer: """The renderer this output renderer is associated with.""" return self._renderer @property def config(self) -> NbParserConfig: """The notebook parser config""" return self._renderer.nb_config @property def logger(self) -> LoggerType: """The logger for this renderer. In extension to a standard logger, this logger also for `line` and `subtype` kwargs to the `log` methods. """ # TODO the only problem with logging here, is that we cannot generate # nodes.system_message to append to the document. return self._logger @property def source(self): """The source of the notebook.""" return self.renderer.document["source"] def write_file( self, path: list[str], content: bytes, overwrite=False, exists_ok=False ) -> str: """Write a file to the external output folder. :param path: the path to write the file to, relative to the output folder :param content: the content to write to the file :param overwrite: whether to overwrite an existing file :param exists_ok: whether to ignore an existing file if overwrite is False :returns: URI to use for referencing the file """ output_folder = self.config.output_folder filepath = Path(output_folder).joinpath(*path) if not output_folder: pass # do not output anything if output_folder is not set (docutils only) elif filepath.exists(): if overwrite: filepath.write_bytes(content) elif not exists_ok: # TODO raise or just report? raise FileExistsError(f"File already exists: {filepath}") else: filepath.parent.mkdir(parents=True, exist_ok=True) filepath.write_bytes(content) if self.renderer.sphinx_env: # sphinx expects paths in POSIX format, relative to the documents path, # or relative to the source folder if prepended with '/' filepath = filepath.resolve() if os.name == "nt": # Can't get relative path between drives on Windows return filepath.as_posix() # Path().relative_to() doesn't work when not a direct subpath return "/" + os.path.relpath(filepath, self.renderer.sphinx_env.app.srcdir) else: return str(filepath) def add_js_file(self, key: str, uri: str | None, kwargs: dict[str, str]) -> None: """Register a JavaScript file to include in the HTML output of this document. :param key: the key to use for referencing the file :param uri: the URI to the file, or None and supply the file contents in kwargs['body'] """ if "nb_js_files" not in self.renderer.document: self.renderer.document["nb_js_files"] = {} # TODO handle duplicate keys (whether to override/ignore) self.renderer.document["nb_js_files"][key] = (uri, kwargs) def render_nb_finalise(self, metadata: dict) -> None: """Finalise the render of the notebook metadata.""" # add ipywidgets state JavaScript, # The JSON inside the script tag is identified and parsed by: # https://github.com/jupyter-widgets/ipywidgets/blob/32f59acbc63c3ff0acf6afa86399cb563d3a9a86/packages/html-manager/src/libembed.ts#L36 # see also: https://ipywidgets.readthedocs.io/en/7.6.5/embedding.html ipywidgets = metadata.get("widgets", None) ipywidgets_mime = (ipywidgets or {}).get(WIDGET_STATE_MIMETYPE, {}) if ipywidgets_mime.get("state", None): self.add_js_file( "ipywidgets_state", None, { "type": "application/vnd.jupyter.widget-state+json", "body": sanitize_script_content(json.dumps(ipywidgets_mime)), }, ) for i, (path, kwargs) in enumerate(self.config.ipywidgets_js.items()): self.add_js_file(f"ipywidgets_{i}", path, kwargs) def render_raw_cell( self, content: str, metadata: dict, cell_index: int, source_line: int ) -> list[nodes.Element]: """Render a raw cell. https://nbformat.readthedocs.io/en/5.1.3/format_description.html#raw-nbconvert-cells :param content: the raw cell content :param metadata: the cell level metadata :param cell_index: the index of the cell :param source_line: the line number of the cell in the source document """ mime_type = metadata.get("format") if not mime_type: # skip without warning, since e.g. jupytext saves raw cells with no format return [] return self.render_mime_type( MimeData( mime_type, content, metadata, cell_index=cell_index, line=source_line ) ) def render_stdout( self, output: NotebookNode, cell_metadata: dict[str, Any], cell_index: int, source_line: int, ) -> list[nodes.Element]: """Render a notebook stdout output. https://nbformat.readthedocs.io/en/5.1.3/format_description.html#stream-output :param output: the output node :param metadata: the cell level metadata :param cell_index: the index of the cell containing the output :param source_line: the line number of the cell in the source document """ if "remove-stdout" in cell_metadata.get("tags", []): return [] lexer = self.renderer.get_cell_level_config( "render_text_lexer", cell_metadata, line=source_line ) node = self.renderer.create_highlighted_code_block( output["text"], lexer, source=self.source, line=source_line ) node["classes"] += ["output", "stream"] return [node] def render_stderr( self, output: NotebookNode, cell_metadata: dict[str, Any], cell_index: int, source_line: int, ) -> list[nodes.Element]: """Render a notebook stderr output. https://nbformat.readthedocs.io/en/5.1.3/format_description.html#stream-output :param output: the output node :param metadata: the cell level metadata :param cell_index: the index of the cell containing the output :param source_line: the line number of the cell in the source document """ if "remove-stderr" in cell_metadata.get("tags", []): return [] output_stderr = self.renderer.get_cell_level_config( "output_stderr", cell_metadata, line=source_line ) msg = f"stderr was found in the cell outputs of cell {cell_index + 1}" outputs = [] if output_stderr == "remove": return [] elif output_stderr == "remove-warn": self.logger.warning(msg, subtype="stderr", line=source_line) return [] elif output_stderr == "warn": self.logger.warning(msg, subtype="stderr", line=source_line) elif output_stderr == "error": self.logger.error(msg, subtype="stderr", line=source_line) elif output_stderr == "severe": self.logger.critical(msg, subtype="stderr", line=source_line) lexer = self.renderer.get_cell_level_config( "render_text_lexer", cell_metadata, line=source_line ) node = self.renderer.create_highlighted_code_block( output["text"], lexer, source=self.source, line=source_line ) node["classes"] += ["output", "stderr"] outputs.append(node) return outputs def render_error( self, output: NotebookNode, cell_metadata: dict[str, Any], cell_index: int, source_line: int, ) -> list[nodes.Element]: """Render a notebook error output. https://nbformat.readthedocs.io/en/5.1.3/format_description.html#error :param output: the output node :param metadata: the cell level metadata :param cell_index: the index of the cell containing the output :param source_line: the line number of the cell in the source document """ traceback = strip_ansi("\n".join(output["traceback"])) lexer = self.renderer.get_cell_level_config( "render_error_lexer", cell_metadata, line=source_line ) node = self.renderer.create_highlighted_code_block( traceback, lexer, source=self.source, line=source_line ) node["classes"] += ["output", "traceback"] return [node] def render_mime_type(self, data: MimeData) -> list[nodes.Element]: """Render a notebook mime output, as a block level element.""" # try plugin renderers for renderer in load_mime_renders(): nodes = renderer.handle_mime(self, data, False) if nodes is not None: return nodes # try default renderers if data.mime_type == "text/plain": return self.render_text_plain(data) if data.mime_type in { "image/png", "image/jpeg", "application/pdf", "image/svg+xml", "image/gif", }: return self.render_image(data) if data.mime_type == "text/html": return self.render_text_html(data) if data.mime_type == "text/latex": return self.render_text_latex(data) if data.mime_type == "application/javascript": return self.render_javascript(data) if data.mime_type == WIDGET_VIEW_MIMETYPE: return self.render_widget_view(data) if data.mime_type == "text/markdown": return self.render_markdown(data) return self.render_unhandled(data) def render_unhandled(self, data: MimeData) -> list[nodes.Element]: """Render a notebook output of unknown mime type.""" self.logger.warning( f"skipping unknown output mime type: {data.mime_type}", subtype="unknown_mime_type", line=data.line, ) return [] def render_markdown(self, data: MimeData) -> list[nodes.Element]: """Render a notebook text/markdown mime data output.""" fmt = self.renderer.get_cell_level_config( "render_markdown_format", data.cell_metadata, line=data.line ) return self._render_markdown_base(data, fmt=fmt, inline=False) def render_text_plain(self, data: MimeData) -> list[nodes.Element]: """Render a notebook text/plain mime data output.""" lexer = self.renderer.get_cell_level_config( "render_text_lexer", data.cell_metadata, line=data.line ) node = self.renderer.create_highlighted_code_block( data.string, lexer, source=self.source, line=data.line ) node["classes"] += ["output", "text_plain"] return [node] def render_text_html(self, data: MimeData) -> list[nodes.Element]: """Render a notebook text/html mime data output.""" return [ nodes.raw(text=data.string, format="html", classes=["output", "text_html"]) ] def render_text_latex(self, data: MimeData) -> list[nodes.Element]: """Render a notebook text/latex mime data output.""" # TODO should we always assume this is math? return [ nodes.math_block( text=strip_latex_delimiters(data.string), nowrap=False, number=None, classes=["output", "text_latex"], ) ] def render_image(self, data: MimeData) -> list[nodes.Element]: """Render a notebook image mime data output.""" # Adapted from: # https://github.com/jupyter/nbconvert/blob/45df4b6089b3bbab4b9c504f9e6a892f5b8692e3/nbconvert/preprocessors/extractoutput.py#L43 # ensure that the data is a bytestring if data.mime_type in { "image/png", "image/jpeg", "image/gif", "application/pdf", }: # data is b64-encoded as text data_bytes = a2b_base64(data.content) elif isinstance(data.content, str): # ensure correct line separator data_bytes = os.linesep.join(data.content.splitlines()).encode("utf-8") # create filename extension = ( guess_extension(data.mime_type) or "." + data.mime_type.rsplit("/")[-1] ) # latex does not recognize the '.jpe' extension extension = ".jpeg" if extension == ".jpe" else extension # ensure de-duplication of outputs by using hash as filename # TODO note this is a change to the current implementation, # which names by {notbook_name}-{cell_index}-{output-index}.{extension} data_hash = hashlib.sha256(data_bytes).hexdigest() filename = f"{data_hash}{extension}" # TODO should we be trying to clear old files? uri = self.write_file([filename], data_bytes, overwrite=False, exists_ok=True) image_node = nodes.image(uri=uri) # apply attributes to the image node # TODO backwards-compatible re-naming to image_options? image_options = self.renderer.get_cell_level_config( "render_image_options", data.cell_metadata, line=data.line ).copy() # Overwrite with metadata stored in output image_options.update( { key: str(value) for key, value in data.output_metadata.get(data.mime_type, {}).items() if key in {"width", "height"} } ) for key, spec in [ ("classes", options_spec.class_option), ("alt", options_spec.unchanged), ("height", options_spec.length_or_unitless), ("width", options_spec.length_or_percentage_or_unitless), ("scale", options_spec.percentage), ("align", lambda a: options_spec.choice(a, ("left", "center", "right"))), ]: if key not in image_options: continue try: image_node[key] = spec(image_options[key]) except Exception as exc: msg = f"Invalid image option ({key!r}; {image_options[key]!r}): {exc}" self.logger.warning(msg, subtype="image", line=data.line) return [image_node] def render_javascript(self, data: MimeData) -> list[nodes.Element]: """Render a notebook application/javascript mime data output.""" content = sanitize_script_content(data.string) mime_type = "application/javascript" return [ nodes.raw( text=f'', format="html", ) ] def render_widget_view(self, data: MimeData) -> list[nodes.Element]: """Render a notebook application/vnd.jupyter.widget-view+json mime output.""" # TODO note ipywidgets present? content = sanitize_script_content(json.dumps(data.string)) return [ nodes.raw( text=f'', format="html", ) ] def render_mime_type_inline(self, data: MimeData) -> list[nodes.Element]: """Render a notebook mime output, as an inline level element.""" # try plugin renderers for renderer in load_mime_renders(): nodes = renderer.handle_mime(self, data, True) if nodes is not None: return nodes # try built-in renderers if data.mime_type == "text/plain": return self.render_text_plain_inline(data) if data.mime_type in { "image/png", "image/jpeg", "application/pdf", "image/svg+xml", "image/gif", }: return self.render_image_inline(data) if data.mime_type == "text/html": return self.render_text_html_inline(data) if data.mime_type == "text/latex": return self.render_text_latex_inline(data) if data.mime_type == "application/javascript": return self.render_javascript_inline(data) if data.mime_type == WIDGET_VIEW_MIMETYPE: return self.render_widget_view_inline(data) if data.mime_type == "text/markdown": return self.render_markdown_inline(data) return self.render_unhandled_inline(data) def render_unhandled_inline(self, data: MimeData) -> list[nodes.Element]: """Render a notebook output of unknown mime type.""" self.logger.warning( f"skipping unknown output mime type: {data.mime_type}", subtype="unknown_mime_type", line=data.line, ) return [] def render_markdown_inline(self, data: MimeData) -> list[nodes.Element]: """Render a notebook text/markdown mime data output.""" fmt = self.renderer.get_cell_level_config( "render_markdown_format", data.cell_metadata, line=data.line ) return self._render_markdown_base(data, fmt=fmt, inline=True) def render_text_plain_inline(self, data: MimeData) -> list[nodes.Element]: """Render a notebook text/plain mime data output.""" content = data.string if data.output_metadata.get("strip_text_quotes", False) and _QUOTED_RE.match( content ): content = content[1:-1] node = nodes.inline(data.string, content, classes=["output", "text_plain"]) return [node] def render_text_html_inline(self, data: MimeData) -> list[nodes.Element]: """Render a notebook text/html mime data output.""" return self.render_text_html(data) def render_text_latex_inline(self, data: MimeData) -> list[nodes.Element]: """Render a notebook text/latex mime data output.""" # TODO should we always assume this is math? return [ nodes.math( text=strip_latex_delimiters(data.string), nowrap=False, number=None, classes=["output", "text_latex"], ) ] def render_image_inline(self, data: MimeData) -> list[nodes.Element]: """Render a notebook image mime data output.""" return self.render_image(data) def render_javascript_inline(self, data: MimeData) -> list[nodes.Element]: """Render a notebook application/javascript mime data output.""" return self.render_javascript(data) def render_widget_view_inline(self, data: MimeData) -> list[nodes.Element]: """Render a notebook application/vnd.jupyter.widget-view+json mime output.""" return self.render_widget_view(data) def _render_markdown_base( self, data: MimeData, *, fmt: str, inline: bool ) -> list[nodes.Element]: """Base render for a notebook markdown mime output (block or inline).""" pseudo_element = nodes.Element() # element to hold the parsed markdown current_parser = self.renderer.md current_md_config = self.renderer.md_config try: # potentially replace the parser temporarily if fmt == "myst": # use the current configuration to render the markdown pass elif fmt == "commonmark": # use an isolated, CommonMark only, parser self.renderer.md_config = MdParserConfig(commonmark_only=True) self.renderer.md = create_md_parser( self.renderer.md_config, self.renderer.__class__ ) elif fmt == "gfm": # use an isolated, GitHub Flavoured Markdown only, parser self.renderer.md_config = MdParserConfig(gfm_only=True) self.renderer.md = create_md_parser( self.renderer.md_config, self.renderer.__class__ ) else: self.logger.warning( f"skipping unknown markdown format: {fmt}", subtype="unknown_markdown_format", line=data.line, ) return [] with self.renderer.current_node_context(pseudo_element): self.renderer.nested_render_text( data.string, data.line or 0, inline=inline, ) finally: # restore the parser self.renderer.md = current_parser self.renderer.md_config = current_md_config return pseudo_element.children class EntryPointError(Exception): """Exception raised when an entry point cannot be loaded.""" @lru_cache(maxsize=10) def load_renderer(name: str) -> type[NbElementRenderer]: """Load a renderer, given a name within the ``RENDER_ENTRY_GROUP`` entry point group """ all_eps = entry_points() if hasattr(all_eps, "select"): # importlib_metadata >= 3.6 or importlib.metadata in python >=3.10 eps = all_eps.select(group=RENDER_ENTRY_GROUP, name=name) found = name in eps.names else: eps = {ep.name: ep for ep in all_eps.get(RENDER_ENTRY_GROUP, [])} # type: ignore found = name in eps if found: klass = eps[name].load() if not issubclass(klass, NbElementRenderer): raise EntryPointError( f"Entry Point for {RENDER_ENTRY_GROUP}:{name} " f"is not a subclass of `NbElementRenderer`: {klass}" ) return klass raise EntryPointError(f"No Entry Point found for {RENDER_ENTRY_GROUP}:{name}") class MimeRenderPlugin(Protocol): """Protocol for a mime renderer plugin.""" mime_priority_overrides: ClassVar[Sequence[tuple[str, str, int | None]]] = () """A list of (builder name, mime type, priority).""" @staticmethod def handle_mime( renderer: NbElementRenderer, data: MimeData, inline: bool ) -> None | list[nodes.Element]: """A function that renders a mime type to docutils nodes, or returns None to reject.""" class ExampleMimeRenderPlugin(MimeRenderPlugin): """Example mime renderer for `custommimetype`.""" mime_priority_overrides = [("*", "custommimetype", 1)] @staticmethod def handle_mime( renderer: NbElementRenderer, data: MimeData, inline: int ) -> None | list[nodes.Element]: if not inline and data.mime_type == "custommimetype": return [ nodes.paragraph( text=f"This is a custom mime type, with content: {data.content!r}", classes=["output", "text_plain"], ) ] return None @lru_cache def load_mime_renders() -> list[MimeRenderPlugin]: all_eps = entry_points() if hasattr(all_eps, "select"): # importlib_metadata >= 3.6 or importlib.metadata in python >=3.10 return [ep.load() for ep in all_eps.select(group=MIME_RENDER_ENTRY_GROUP)] return [ep.load() for ep in all_eps.get(MIME_RENDER_ENTRY_GROUP, [])] # type: ignore def strip_ansi(text: str) -> str: """Strip ANSI escape sequences from a string""" return _ANSI_RE.sub("", text) def sanitize_script_content(content: str) -> str: """Sanitize the content of a ``", r"<\/script>") def strip_latex_delimiters(source): r"""Remove LaTeX math delimiters that would be rendered by the math block. These are: ``\(โ€ฆ\)``, ``\[โ€ฆ\]``, ``$โ€ฆ$``, and ``$$โ€ฆ$$``. This is necessary because sphinx does not have a dedicated role for generic LaTeX, while Jupyter only defines generic LaTeX output, see https://github.com/jupyter/jupyter-sphinx/issues/90 for discussion. """ source = source.strip() delimiter_pairs = (pair.split() for pair in r"\( \),\[ \],$$ $$,$ $".split(",")) for start, end in delimiter_pairs: if source.startswith(start) and source.endswith(end): return source[len(start) : -len(end)] return source @contextmanager def create_figure_context( self: DocutilsNbRenderer | SphinxNbRenderer, figure_options: dict[str, Any] | None, line: int, ) -> Iterator: """Create a context manager, which optionally wraps new nodes in a figure node. A caption may also be added before or after the nodes. """ if not isinstance(figure_options, dict): yield return # note: most of this is copied directly from sphinx.Figure # create figure node figure_node = nodes.figure() figure_node.line = line figure_node.source = self.document["source"] # add attributes to figure node if figure_options.get("classes"): # TODO change to class? figure_node["classes"] += str(figure_options["classes"]).split() if figure_options.get("align") in ("center", "left", "right"): figure_node["align"] = figure_options["align"] # add target name if figure_options.get("name"): name = nodes.fully_normalize_name(str(figure_options.get("name"))) figure_node["names"].append(name) self.document.note_explicit_target(figure_node, figure_node) # create caption node caption = None if figure_options.get("caption", ""): node = nodes.Element() # anonymous container for parsing with self.current_node_context(node): self.nested_render_text(str(figure_options["caption"]), line) first_node = node.children[0] legend_nodes = node.children[1:] if isinstance(first_node, nodes.paragraph): caption = nodes.caption(first_node.rawsource, "", *first_node.children) caption.source = self.document["source"] caption.line = line elif not (isinstance(first_node, nodes.comment) and len(first_node) == 0): create_warning( self.document, "Figure caption must be a paragraph or empty comment.", line=line, # wtype=DEFAULT_LOG_TYPE, subtype=MystNBWarnings.FIG_CAPTION, ) self.current_node.append(figure_node) old_current_node = self.current_node self.current_node = figure_node if caption and figure_options.get("caption_before", False): figure_node.append(caption) if legend_nodes: figure_node += nodes.legend("", *legend_nodes) yield if caption and not figure_options.get("caption_before", False): figure_node.append(caption) if legend_nodes: figure_node += nodes.legend("", *legend_nodes) self.current_node = old_current_node def base_render_priority() -> dict[str, dict[str, int | None]]: """Create a base render priority dict: name -> mime type -> priority (ascending).""" # See formats at https://www.sphinx-doc.org/en/master/usage/builders/index.html # generated with: # [(b.name, b.format, b.supported_image_types) for b in app.registry.builders.values()] return { "epub": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, "html": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, "dirhtml": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, "singlehtml": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, "applehelp": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/png": 40, "image/gif": 50, "image/jpeg": 60, "image/tiff": 70, "image/jp2": 80, "image/svg+xml": 90, "text/markdown": 100, "text/latex": 110, "text/plain": 120, }, "devhelp": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/png": 40, "image/gif": 50, "image/jpeg": 60, "text/markdown": 70, "text/latex": 80, "text/plain": 90, }, "htmlhelp": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/png": 40, "image/gif": 50, "image/jpeg": 60, "text/markdown": 70, "text/latex": 80, "text/plain": 90, }, "json": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, "pickle": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, "qthelp": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, # deprecated RTD builders # https://github.com/readthedocs/readthedocs-sphinx-ext/blob/master/readthedocs_ext/readthedocs.py "readthedocs": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, "readthedocsdirhtml": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, "readthedocssinglehtml": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, "readthedocssinglehtmllocalmedia": { "application/vnd.jupyter.widget-view+json": 10, "application/javascript": 20, "text/html": 30, "image/svg+xml": 40, "image/png": 50, "image/gif": 60, "image/jpeg": 70, "text/markdown": 80, "text/latex": 90, "text/plain": 100, }, "changes": {"text/latex": 10, "text/markdown": 20, "text/plain": 30}, "dummy": {"text/latex": 10, "text/markdown": 20, "text/plain": 30}, "gettext": {"text/latex": 10, "text/markdown": 20, "text/plain": 30}, "latex": { "application/pdf": 10, "image/png": 20, "image/jpeg": 30, "text/latex": 40, "text/markdown": 50, "text/plain": 60, }, "linkcheck": {"text/latex": 10, "text/markdown": 20, "text/plain": 30}, "man": {"text/latex": 10, "text/markdown": 20, "text/plain": 30}, "texinfo": { "image/png": 10, "image/jpeg": 20, "image/gif": 30, "text/latex": 40, "text/markdown": 50, "text/plain": 60, }, "text": {"text/latex": 10, "text/markdown": 20, "text/plain": 30}, "xml": {"text/latex": 10, "text/markdown": 20, "text/plain": 30}, "pseudoxml": {"text/latex": 10, "text/markdown": 20, "text/plain": 30}, } def get_mime_priority( builder: str, overrides: Sequence[tuple[str, str, int | None]] ) -> list[str]: """Return the priority list for the builder. Takes the base priority list, overrides from the config, then sorts by priority in ascending order. """ base = base_render_priority().get(builder, {}) overrides = list(overrides) for plugin in load_mime_renders(): overrides = list(getattr(plugin, "mime_priority_overrides", [])) + overrides for override in overrides: if override[0] == "*" or override[0] == builder: base[override[1]] = override[2] sort = sorted( ((k, p) for k, p in base.items() if p is not None), key=lambda x: x[1] ) return [k for k, _ in sort] MyST-NB-1.1.2/myst_nb/core/utils.py000066400000000000000000000040761467453560600170100ustar00rootroot00000000000000"""Shared utilities.""" from __future__ import annotations import re from nbformat import NotebookNode _RGX_CARRIAGERETURN = re.compile(r".*\r(?=[^\n])") _RGX_BACKSPACE = re.compile(r"[^\n]\b") def coalesce_streams(outputs: list[NotebookNode]) -> list[NotebookNode]: """Merge all stream outputs with shared names into single streams. This ensure deterministic outputs. Adapted from: https://github.com/computationalmodelling/nbval/blob/master/nbval/plugin.py. """ if not outputs: return [] new_outputs = [] streams: dict[str, NotebookNode] = {} for output in outputs: if output["output_type"] == "stream": if output["name"] in streams: out = output["text"].strip() if out: streams[output["name"]]["text"] += f"{out}\n" else: output["text"] = output["text"].strip() + "\n" new_outputs.append(output) streams[output["name"]] = output else: new_outputs.append(output) # process \r and \b characters for output in streams.values(): old = output["text"] while len(output["text"]) < len(old): old = output["text"] # Cancel out anything-but-newline followed by backspace output["text"] = _RGX_BACKSPACE.sub("", output["text"]) # Replace all carriage returns not followed by newline output["text"] = _RGX_CARRIAGERETURN.sub("", output["text"]) # We also want to ensure stdout and stderr are always in the same consecutive order, # because they are asynchronous, so order isn't guaranteed. for i, output in enumerate(new_outputs): if output["output_type"] == "stream" and output["name"] == "stderr": if ( len(new_outputs) >= i + 2 and new_outputs[i + 1]["output_type"] == "stream" and new_outputs[i + 1]["name"] == "stdout" ): stdout = new_outputs.pop(i + 1) new_outputs.insert(i, stdout) return new_outputs MyST-NB-1.1.2/myst_nb/core/variables.py000066400000000000000000000145121467453560600176140ustar00rootroot00000000000000"""Utilities for rendering code output variables.""" from __future__ import annotations from ast import literal_eval import dataclasses as dc from typing import Any from docutils import nodes from myst_nb._compat import findall from myst_nb.core.loggers import DocutilsDocLogger, SphinxDocLogger from myst_nb.core.render import MimeData, NbElementRenderer, get_mime_priority def is_sphinx(document: nodes.document) -> bool: """Return True if we are in sphinx, otherwise docutils.""" return hasattr(document.settings, "env") def create_warning( message: str, document: nodes.document, line: int, subtype: str ) -> nodes.system_message: """Create a warning.""" logger: DocutilsDocLogger | SphinxDocLogger if is_sphinx(document): logger = SphinxDocLogger(document) else: logger = DocutilsDocLogger(document) logger.warning(message, line=line, subtype=subtype) return nodes.system_message( message, type="WARNING", level=2, line=line, source=document["source"], ) def set_source_info(node: nodes.Node, source: str, line: int) -> None: """Set the source info for a node and its descendants.""" for _node in findall(node)(include_self=True): _node.source = source _node.line = line class RetrievalError(Exception): """An error occurred while retrieving the variable output.""" @dc.dataclass() class VariableOutput: """A class to store display_data/execute_result output for a variable.""" data: dict[str, Any] """the mime-bundle: mime-type -> data""" metadata: dict[str, Any] nb_renderer: NbElementRenderer vtype: str """The variable type (for use in warnings).""" index: int = 0 """The index of the output.""" def render_variable_outputs( outputs: list[VariableOutput], document: nodes.document, line: int, source: str, *, inline: bool = False, render: dict[str, Any] | None = None, ) -> list[nodes.Node]: """Given output data for a variable, return the docutils/sphinx nodes relevant to this data. :param outputs: The output data. :param document: The current docutils document. :param line: The current source line number of the directive or role. :param source: The current source path or description. :param inline: Whether to render the output as inline (or block). :param render: Cell-level render metadata. :returns: the docutils/sphinx nodes """ _nodes = [] for output in outputs: _nodes.extend( _render_variable_output( output, document, line, source, inline=inline, render=render, ) ) return _nodes def _render_variable_output( output: VariableOutput, document: nodes.document, line: int, source: str, *, inline: bool = False, render: dict[str, Any] | None = None, ) -> list[nodes.Node]: cell_metadata = {} if render: cell_metadata[output.nb_renderer.config.cell_metadata_key] = render if is_sphinx(document): _nodes = _render_output_sphinx( output, cell_metadata, source, line, inline, ) else: _nodes = _render_output_docutils( output, cell_metadata, document, line, inline, ) # TODO rendering should perhaps return if it succeeded explicitly, # and whether system_messages or not (required for roles) return _nodes def _render_output_docutils( output: VariableOutput, cell_metadata: dict[str, Any], document: nodes.document, line: int, inline=False, ) -> list[nodes.Node]: """Render the output in docutils (select mime priority directly).""" mime_priority = get_mime_priority( output.nb_renderer.config.builder_name, output.nb_renderer.config.mime_priority_overrides, ) try: mime_type = next(x for x in mime_priority if x in output.data) except StopIteration: if output.data: return [ create_warning( "No output mime type found from render_priority " f"(output<{output.index}>)", document, line, output.vtype, ) ] return [] else: mime_data = MimeData( mime_type, output.data[mime_type], cell_metadata=cell_metadata, output_metadata=output.metadata, line=line, ) if inline: return output.nb_renderer.render_mime_type_inline(mime_data) return output.nb_renderer.render_mime_type(mime_data) def _render_output_sphinx( output: VariableOutput, cell_metadata: dict[str, Any], source: str, line: int, inline=False, ) -> list[nodes.Node]: """Render the output in sphinx (defer mime priority selection).""" mime_bundle = nodes.container(nb_element="mime_bundle") set_source_info(mime_bundle, source, line) for mime_type, content in output.data.items(): mime_container = nodes.container(mime_type=mime_type) set_source_info(mime_container, source, line) mime_data = MimeData( mime_type, content, cell_metadata=cell_metadata, output_metadata=output.metadata, line=line, ) if inline: _nodes = output.nb_renderer.render_mime_type_inline(mime_data) else: _nodes = output.nb_renderer.render_mime_type(mime_data) if _nodes: mime_container.extend(_nodes) mime_bundle.append(mime_container) return [mime_bundle] def format_plain_text(text: str, fmt_spec: str) -> str: """Format plain text for display in a docutils node.""" # literal eval, to remove surrounding quotes try: value = literal_eval(text) except (SyntaxError, ValueError): value = text if fmt_spec == "": return str(value) type_char = fmt_spec[-1] if type_char == "s": value = str(value) elif type_char in ("b", "c", "d", "o", "x", "X"): value = int(value) elif type_char in ("e", "E", "f", "F", "g", "G", "n", "%"): value = float(value) return format(value, fmt_spec) MyST-NB-1.1.2/myst_nb/docutils_.py000066400000000000000000000364241467453560600167070ustar00rootroot00000000000000"""The docutils parser implementation for myst-nb.""" from __future__ import annotations from dataclasses import dataclass, field from functools import lru_cache, partial from importlib import resources as import_resources import os from typing import Any from docutils import nodes from docutils.core import default_description, publish_cmdline from docutils.parsers.rst.directives import _directives from docutils.parsers.rst.roles import _roles from markdown_it.token import Token from markdown_it.tree import SyntaxTreeNode from myst_parser.config.main import MdParserConfig, merge_file_level from myst_parser.mdit_to_docutils.base import DocutilsRenderer, token_line from myst_parser.parsers.docutils_ import Parser as MystParser from myst_parser.parsers.docutils_ import create_myst_config, create_myst_settings_spec from myst_parser.parsers.mdit import create_md_parser import nbformat from nbformat import NotebookNode from pygments.formatters import get_formatter_by_name from myst_nb import static from myst_nb.core.config import NbParserConfig from myst_nb.core.execute import create_client from myst_nb.core.loggers import DocutilsDocLogger # DEFAULT_LOG_TYPE, from myst_nb.core.nb_to_tokens import nb_node_to_dict, notebook_to_tokens from myst_nb.core.read import ( NbReader, UnexpectedCellDirective, read_myst_markdown_notebook, standard_nb_read, ) from myst_nb.core.render import ( MditRenderMixin, MimeData, NbElementRenderer, create_figure_context, get_mime_priority, load_renderer, ) from myst_nb.ext.eval import load_eval_docutils from myst_nb.ext.glue import load_glue_docutils from myst_nb.warnings_ import MystNBWarnings, create_warning DOCUTILS_EXCLUDED_ARGS = list( {f.name for f in NbParserConfig.get_fields() if f.metadata.get("docutils_exclude")} ) @dataclass class DocutilsApp: roles: dict[str, Any] = field(default_factory=dict) directives: dict[str, Any] = field(default_factory=dict) @lru_cache(maxsize=1) def get_nb_roles_directives() -> DocutilsApp: app = DocutilsApp() app.directives["code-cell"] = UnexpectedCellDirective app.directives["raw-cell"] = UnexpectedCellDirective load_eval_docutils(app) load_glue_docutils(app) return app class Parser(MystParser): """Docutils parser for Jupyter Notebooks, containing MyST Markdown.""" supported: tuple[str, ...] = ("mystnb", "ipynb") """Aliases this parser supports.""" settings_spec = ( "MyST-NB options", None, create_myst_settings_spec(NbParserConfig, "nb_"), *MystParser.settings_spec, ) """Runtime settings specification.""" config_section = "myst-nb parser" def parse(self, inputstring: str, document: nodes.document) -> None: # register/unregister special directives and roles app = get_nb_roles_directives() for name, directive in app.directives.items(): _directives[name] = directive for name, role in app.roles.items(): _roles[name] = role try: return self._parse(inputstring, document) finally: for name in app.directives: _directives.pop(name, None) for name in app.roles: _roles.pop(name, None) def _parse(self, inputstring: str, document: nodes.document) -> None: """Parse source text. :param inputstring: The source string to parse :param document: The root docutils node to add AST elements to """ document_source = document["source"] # get a logger for this document logger = DocutilsDocLogger(document) # get markdown parsing configuration try: md_config = create_myst_config(document.settings) except (TypeError, ValueError) as error: logger.error(f"myst configuration invalid: {error.args[0]}") md_config = MdParserConfig() # get notebook rendering configuration try: nb_config = create_myst_config(document.settings, NbParserConfig, "nb_") except (TypeError, ValueError) as error: logger.error(f"myst-nb configuration invalid: {error.args[0]}") nb_config = NbParserConfig() # convert inputstring to notebook # note docutils does not support the full custom format mechanism if nb_config.read_as_md: nb_reader = NbReader( partial( read_myst_markdown_notebook, config=md_config, add_source_map=True, ), md_config, {"type": "plugin", "name": "myst_nb_md"}, ) else: nb_reader = NbReader(standard_nb_read, md_config) notebook = nb_reader.read(inputstring) # update the global markdown config with the file-level config warning = lambda wtype, msg: create_warning( # noqa: E731 document, msg, line=1, append_to=document, subtype=wtype ) nb_reader.md_config = merge_file_level( nb_reader.md_config, notebook.metadata, warning ) # Update mystnb configuration with notebook level metadata if nb_config.metadata_key in notebook.metadata: overrides = nb_node_to_dict(notebook.metadata[nb_config.metadata_key]) try: nb_config = nb_config.copy(**overrides) except Exception as exc: logger.warning( f"Failed to update configuration with notebook metadata: {exc}", subtype="config", ) else: logger.debug( "Updated configuration with notebook metadata", subtype="config" ) # Setup the markdown parser mdit_parser = create_md_parser(nb_reader.md_config, DocutilsNbRenderer) mdit_parser.options["document"] = document mdit_parser.options["nb_config"] = nb_config mdit_renderer: DocutilsNbRenderer = mdit_parser.renderer # type: ignore mdit_env: dict[str, Any] = {} # load notebook element renderer class from entry-point name # this is separate from DocutilsNbRenderer, so that users can override it renderer_name = nb_config.render_plugin nb_renderer: NbElementRenderer = load_renderer(renderer_name)( mdit_renderer, logger ) # we temporarily store nb_renderer on the document, # so that roles/directives can access it document.attributes["nb_renderer"] = nb_renderer # we currently do this early, so that the nb_renderer has access to things mdit_renderer.setup_render(mdit_parser.options, mdit_env) # type: ignore # parse notebook structure to markdown-it tokens # note, this does not assume that the notebook has been executed yet mdit_tokens = notebook_to_tokens(notebook, mdit_parser, mdit_env, logger) # open the notebook execution client, # this may execute the notebook immediately or during the page render with create_client(notebook, document_source, nb_config, logger) as nb_client: mdit_parser.options["nb_client"] = nb_client # convert to docutils AST, which is added to the document mdit_renderer.render(mdit_tokens, mdit_parser.options, mdit_env) # save final execution data if nb_client.exec_metadata: document["nb_exec_data"] = nb_client.exec_metadata if nb_config.output_folder: # write final (updated) notebook to output folder (utf8 is standard encoding) content = nbformat.writes(notebook).encode("utf-8") nb_renderer.write_file(["processed.ipynb"], content, overwrite=True) # if we are using an HTML writer, dynamically add the CSS to the output if nb_config.append_css and hasattr(document.settings, "stylesheet"): css_paths = [] css_paths.append( nb_renderer.write_file( ["mystnb.css"], (import_resources.files(static) / "mystnb.css").read_bytes(), overwrite=True, ) ) fmt = get_formatter_by_name("html", style="default") css_paths.append( nb_renderer.write_file( ["pygments.css"], fmt.get_style_defs(".code").encode("utf-8"), overwrite=True, ) ) css_paths = [os.path.abspath(path) for path in css_paths] # stylesheet and stylesheet_path are mutually exclusive if document.settings.stylesheet_path: document.settings.stylesheet_path.extend(css_paths) if document.settings.stylesheet: document.settings.stylesheet.extend(css_paths) # TODO also handle JavaScript # remove temporary state document.attributes.pop("nb_renderer") class DocutilsNbRenderer(DocutilsRenderer, MditRenderMixin): """A docutils-only renderer for Jupyter Notebooks.""" def render_nb_initialise(self, token: SyntaxTreeNode) -> None: metadata = self.nb_client.nb_metadata special_keys = ["kernelspec", "language_info", "source_map"] for key in special_keys: # save these special keys on the document, rather than as docinfo if key in metadata: self.document[f"nb_{key}"] = metadata.get(key) if self.nb_config.metadata_to_fm: # forward the remaining metadata to the front_matter renderer special_keys.append("widgets") top_matter = {k: v for k, v in metadata.items() if k not in special_keys} self.render_front_matter( Token( # type: ignore "front_matter", "", 0, map=[0, 0], content=top_matter, # type: ignore[arg-type] ), ) def _render_nb_cell_code_outputs( self, token: SyntaxTreeNode, outputs: list[NotebookNode] ) -> None: """Render a notebook code cell's outputs.""" cell_index = token.meta["index"] metadata = token.meta["metadata"] line = token_line(token) # render the outputs mime_priority = get_mime_priority( self.nb_config.builder_name, self.nb_config.mime_priority_overrides ) for output_index, output in enumerate(outputs): if output.output_type == "stream": if output.name == "stdout": _nodes = self.nb_renderer.render_stdout( output, metadata, cell_index, line ) self.add_line_and_source_path_r(_nodes, token) self.current_node.extend(_nodes) elif output.name == "stderr": _nodes = self.nb_renderer.render_stderr( output, metadata, cell_index, line ) self.add_line_and_source_path_r(_nodes, token) self.current_node.extend(_nodes) else: pass # TODO warning elif output.output_type == "error": _nodes = self.nb_renderer.render_error( output, metadata, cell_index, line ) self.add_line_and_source_path_r(_nodes, token) self.current_node.extend(_nodes) elif output.output_type in ("display_data", "execute_result"): # Note, this is different to the sphinx implementation, # here we directly select a single output, based on the mime_priority, # as opposed to output all mime types, and select in a post-transform # (the mime_priority must then be set for the output format) try: mime_type = next(x for x in mime_priority if x in output["data"]) except StopIteration: if output["data"]: create_warning( self.document, "No output mime type found from render_priority " f"(cell<{cell_index}>.output<{output_index}>", line=line, append_to=self.current_node, # wtype=DEFAULT_LOG_TYPE, subtype=MystNBWarnings.MIME_TYPE, ) else: figure_options = ( self.get_cell_level_config( "render_figure_options", metadata, line=line ) or None ) with create_figure_context(self, figure_options, line): _nodes = self.nb_renderer.render_mime_type( MimeData( mime_type, output["data"][mime_type], cell_metadata=metadata, output_metadata=output.get("metadata", {}), cell_index=cell_index, output_index=output_index, line=line, ), ) self.current_node.extend(_nodes) self.add_line_and_source_path_r(_nodes, token) else: create_warning( self.document, f"Unsupported output type: {output.output_type}", line=line, append_to=self.current_node, # wtype=DEFAULT_LOG_TYPE, subtype=MystNBWarnings.OUTPUT_TYPE, ) def _run_cli( writer_name: str, builder_name: str, writer_description: str, argv: list[str] | None ): """Run the command line interface for a particular writer.""" publish_cmdline( parser=Parser(), writer_name=writer_name, description=( f"Generates {writer_description} from standalone MyST Notebook sources.\n" f"{default_description}\n" "External outputs are written to `--nb-output-folder`.\n" ), # to see notebook execution info by default settings_overrides={"report_level": 1, "nb_builder_name": builder_name}, argv=argv, ) def cli_html(argv: list[str] | None = None) -> None: """Cmdline entrypoint for converting MyST to HTML.""" _run_cli("html", "html", "(X)HTML documents", argv) def cli_html5(argv: list[str] | None = None): """Cmdline entrypoint for converting MyST to HTML5.""" _run_cli("html5", "html", "HTML5 documents", argv) def cli_latex(argv: list[str] | None = None): """Cmdline entrypoint for converting MyST to LaTeX.""" _run_cli("latex", "latex", "LaTeX documents", argv) def cli_xml(argv: list[str] | None = None): """Cmdline entrypoint for converting MyST to XML.""" _run_cli("xml", "xml", "Docutils-native XML", argv) def cli_pseudoxml(argv: list[str] | None = None): """Cmdline entrypoint for converting MyST to pseudo-XML.""" _run_cli("pseudoxml", "html", "pseudo-XML", argv) MyST-NB-1.1.2/myst_nb/ext/000077500000000000000000000000001467453560600151375ustar00rootroot00000000000000MyST-NB-1.1.2/myst_nb/ext/__init__.py000066400000000000000000000000001467453560600172360ustar00rootroot00000000000000MyST-NB-1.1.2/myst_nb/ext/download.py000066400000000000000000000020271467453560600173210ustar00rootroot00000000000000import os from pathlib import Path from docutils import nodes from sphinx.addnodes import download_reference from sphinx.util.docutils import ReferenceRole from myst_nb.sphinx_ import SphinxEnvType class NbDownloadRole(ReferenceRole): """Role to download an executed notebook.""" def run(self): """Run the role.""" # get a path relative to the current document self.env: SphinxEnvType path = Path(self.env.mystnb_config.output_folder).joinpath( *(self.env.docname.split("/")[:-1] + self.target.split("/")) ) reftarget = ( path.as_posix() if os.name == "nt" else ("/" + os.path.relpath(path, self.env.app.srcdir)) ) node = download_reference(self.rawtext, reftarget=reftarget) self.set_source_info(node) title = self.title if self.has_explicit_title else self.target node += nodes.literal( self.rawtext, title, classes=["xref", "download", "myst-nb"] ) return [node], [] MyST-NB-1.1.2/myst_nb/ext/eval/000077500000000000000000000000001467453560600160665ustar00rootroot00000000000000MyST-NB-1.1.2/myst_nb/ext/eval/__init__.py000066400000000000000000000175561467453560600202150ustar00rootroot00000000000000"""Roles/directives for evaluating variables in the notebook.""" from __future__ import annotations from functools import partial from typing import TYPE_CHECKING, Any from docutils import nodes from docutils.parsers.rst import directives as spec from myst_nb.core.execute.base import EvalNameError from myst_nb.core.render import NbElementRenderer from myst_nb.core.variables import ( RetrievalError, VariableOutput, create_warning, render_variable_outputs, ) from myst_nb.ext.utils import DirectiveBase, RoleBase try: from sphinx.domains import Domain except ImportError: # for docutils only use Domain = object # type: ignore if TYPE_CHECKING: from sphinx.application import Sphinx from myst_nb.docutils_ import DocutilsApp eval_warning = partial(create_warning, subtype="eval") def retrieve_eval_data(document: nodes.document, key: str) -> list[VariableOutput]: """Retrieve the glue data from a specific document.""" if "nb_renderer" not in document: raise RetrievalError("This document does not have a running kernel") element: NbElementRenderer = document["nb_renderer"] # evaluate the variable try: outputs = element.renderer.nb_client.eval_variable(key) except NotImplementedError: raise RetrievalError("This document does not have a running kernel") except EvalNameError: raise RetrievalError( f"The expression {key!r} is not valid according to the configured pattern" ) except Exception as exc: raise RetrievalError(f"variable evaluation error: {exc}") if not outputs: raise RetrievalError(f"expression {key!r} does not return any outputs") # the returned outputs could be one of the following: # https://nbformat.readthedocs.io/en/latest/format_description.html#code-cell-outputs for output in outputs: if output.get("output_type") == "error": msg = f"{output.get('ename', '')}: {output.get('evalue', '')}" raise RetrievalError(msg) return [ VariableOutput( data=output.get("data", {}), metadata=output.get("metadata", {}), nb_renderer=element, vtype="eval", index=i, ) for i, output in enumerate(outputs) ] class EvalRoleAny(RoleBase): """A role for evaluating value outputs from the kernel, using render priority to decide the output mime type. """ def run(self) -> tuple[list[nodes.Node], list[nodes.system_message]]: try: data = retrieve_eval_data(self.document, self.text) except RetrievalError as exc: return [], [eval_warning(str(exc), self.document, self.line)] # for text/plain, we want to strip quotes from strings for output in data: output.metadata["strip_text_quotes"] = True _nodes = render_variable_outputs( data, self.document, self.line, self.source, inline=True, ) return _nodes, [] class EvalDirectiveAny(DirectiveBase): """A directive for evaluating value outputs from the kernel, using render priority to decide the output mime type. """ required_arguments = 1 # the key final_argument_whitespace = False has_content = False def run(self) -> list[nodes.Node]: """Run the directive.""" try: data = retrieve_eval_data(self.document, self.arguments[0]) except RetrievalError as exc: return [eval_warning(str(exc), self.document, self.line)] return render_variable_outputs( data, self.document, self.line, self.source, inline=False, ) class EvalFigureDirective(DirectiveBase): """A directive for pasting code outputs from notebooks, wrapped in a figure. Mirrors: https://github.com/docutils-mirror/docutils/blob/9649abee47b4ce4db51be1d90fcb1fb500fa78b3/docutils/parsers/rst/directives/images.py#95 """ required_arguments = 1 # the key final_argument_whitespace = False has_content = True def align(argument): return spec.choice(argument, ("left", "center", "right")) def figwidth_value(argument): return spec.length_or_percentage_or_unitless(argument, "px") option_spec = { # note we don't add converters for image options, # since this is handled in `NbElementRenderer.render_image` "alt": spec.unchanged, "height": spec.unchanged, "width": spec.unchanged, "scale": spec.unchanged, "class": spec.unchanged, "figwidth": figwidth_value, "figclass": spec.class_option, "align": align, "name": spec.unchanged, } def run(self): try: data = retrieve_eval_data(self.document, self.arguments[0]) except RetrievalError as exc: return [eval_warning(str(exc), self.document, self.line)] render: dict[str, Any] = {} for key in ("alt", "height", "width", "scale", "class"): if key in self.options: render.setdefault("image", {})[ key.replace("classes", "class") ] = self.options[key] mime_nodes = render_variable_outputs( data, self.document, self.line, self.source, render=render ) # note: most of this is copied directly from sphinx.Figure # create figure node figure_node = nodes.figure("", *mime_nodes) self.set_source_info(figure_node) # add attributes figwidth = self.options.pop("figwidth", None) figclasses = self.options.pop("figclass", None) align = self.options.pop("align", None) if figwidth is not None: figure_node["width"] = figwidth if figclasses: figure_node["classes"] += figclasses if align: figure_node["align"] = align # add target self.add_name(figure_node) # create the caption and legend if self.content: node = nodes.Element() # anonymous container for parsing self.state.nested_parse(self.content, self.content_offset, node) first_node = node[0] if isinstance(first_node, nodes.paragraph): caption = nodes.caption(first_node.rawsource, "", *first_node.children) caption.source = first_node.source caption.line = first_node.line figure_node += caption elif not (isinstance(first_node, nodes.comment) and len(first_node) == 0): error = eval_warning( "Figure caption must be a paragraph or empty comment.", self.document, self.lineno, ) return [figure_node, error] if len(node) > 1: figure_node += nodes.legend("", *node[1:]) return [figure_node] class NbEvalDomain(Domain): """A sphinx domain for defining eval roles and directives. Note, the only reason we use this, is that sphinx will not allow for `:` in a directive/role name, if it is part of a domain. """ name = "eval" label = "NotebookEval" # data version, bump this when the format of self.data changes data_version = 1 directives = {"figure": EvalFigureDirective} roles: dict = {} def merge_domaindata(self, *args, **kwargs): pass def resolve_any_xref(self, *args, **kwargs): return [] def load_eval_sphinx(app: Sphinx) -> None: """Load the eval domain.""" app.add_role("eval", EvalRoleAny(), override=True) app.add_directive("eval", EvalDirectiveAny, override=True) app.add_domain(NbEvalDomain) def load_eval_docutils(app: DocutilsApp) -> None: app.roles["eval"] = EvalRoleAny() app.directives["eval"] = EvalDirectiveAny app.directives["eval:figure"] = EvalFigureDirective MyST-NB-1.1.2/myst_nb/ext/execution_tables.py000066400000000000000000000124231467453560600210500ustar00rootroot00000000000000"""Sphinx elements to create tables of statistics on executed notebooks. The `nb-exec-table` directive adds a placeholder node to the document, which is then replaced by a table of statistics in a post-transformation (once all the documents have been executed and these statistics are available). """ from __future__ import annotations from datetime import datetime import posixpath from typing import Any, Callable, DefaultDict from docutils import nodes from sphinx.addnodes import pending_xref from sphinx.application import Sphinx from sphinx.transforms.post_transforms import SphinxPostTransform from sphinx.util import logging from sphinx.util.docutils import SphinxDirective from myst_nb._compat import findall from myst_nb.sphinx_ import NbMetadataCollector, SphinxEnvType SPHINX_LOGGER = logging.getLogger(__name__) METADATA_KEY = "has_exec_table" def setup_exec_table_extension(app: Sphinx) -> None: """Add the Sphinx extension to the Sphinx application.""" app.add_node(ExecutionStatsNode) app.add_directive("nb-exec-table", ExecutionStatsTable) app.connect("env-updated", update_exec_tables) app.add_post_transform(ExecutionStatsPostTransform) class ExecutionStatsNode(nodes.General, nodes.Element): """A placeholder node, for adding a notebook execution statistics table.""" class ExecutionStatsTable(SphinxDirective): """Add a notebook execution statistics table.""" has_content = True final_argument_whitespace = True def run(self): """Add a placeholder node to the document, and mark it as having a table.""" self.env: SphinxEnvType NbMetadataCollector.set_doc_data(self.env, self.env.docname, METADATA_KEY, True) return [ExecutionStatsNode()] def update_exec_tables(app: Sphinx, env: SphinxEnvType): """If a document has been re-executed, return all documents containing tables. These documents will be updated with the new statistics. """ if not NbMetadataCollector.new_exec_data(env): return None to_update = [ docname for docname, data in NbMetadataCollector.get_doc_data(env).items() if data.get(METADATA_KEY) ] if to_update: SPHINX_LOGGER.info( f"Updating {len(to_update)} file(s) with execution table [mystnb]" ) return to_update class ExecutionStatsPostTransform(SphinxPostTransform): """Replace the placeholder node with the final table nodes.""" default_priority = 8 # before ReferencesResolver (10) and MystReferenceResolver(9) def run(self, **kwargs) -> None: """Replace the placeholder node with the final table nodes.""" self.env: SphinxEnvType for node in findall(self.document)(ExecutionStatsNode): node.replace_self( make_stat_table( self.env.docname, NbMetadataCollector.get_doc_data(self.env) ) ) _key2header: dict[str, str] = { "mtime": "Modified", "method": "Method", "runtime": "Run Time (s)", "succeeded": "Status", } _key2transform: dict[str, Callable[[Any], str]] = { "mtime": lambda x: datetime.fromtimestamp(x).strftime("%Y-%m-%d %H:%M") if x else "", "method": str, "runtime": lambda x: "-" if x is None else str(round(x, 2)), "succeeded": lambda x: "โœ…" if x is True else "โŒ", } def make_stat_table( parent_docname: str, metadata: DefaultDict[str, dict] ) -> nodes.table: """Create a table of statistics on executed notebooks.""" # top-level element table = nodes.table() table["classes"] += ["colwidths-auto"] # self.set_source_info(table) # column settings element ncols = len(_key2header) + 1 tgroup = nodes.tgroup(cols=ncols) table += tgroup colwidths = [round(100 / ncols, 2)] * ncols for colwidth in colwidths: colspec = nodes.colspec(colwidth=colwidth) tgroup += colspec # header thead = nodes.thead() tgroup += thead row = nodes.row() thead += row for name in ["Document"] + list(_key2header.values()): row.append(nodes.entry("", nodes.paragraph(text=name))) # body tbody = nodes.tbody() tgroup += tbody for docname in sorted(metadata): data = metadata[docname].get("exec_data") if not data: continue row = nodes.row() tbody += row # document name doclink = pending_xref( refdoc=parent_docname, reftarget=posixpath.relpath(docname, posixpath.dirname(parent_docname)), reftype="doc", refdomain="std", refexplicit=True, refwarn=True, classes=["xref", "doc"], ) doclink += nodes.inline(text=docname) paragraph = nodes.paragraph() paragraph += doclink row.append(nodes.entry("", paragraph)) # other rows for name in _key2header.keys(): paragraph = nodes.paragraph() if name == "succeeded" and data[name] is False: paragraph += nodes.abbreviation( text=_key2transform[name](data[name]), explanation=(data["error"] or ""), ) else: paragraph += nodes.Text(_key2transform[name](data[name])) row.append(nodes.entry("", paragraph)) return table MyST-NB-1.1.2/myst_nb/ext/glue/000077500000000000000000000000001467453560600160735ustar00rootroot00000000000000MyST-NB-1.1.2/myst_nb/ext/glue/__init__.py000066400000000000000000000100771467453560600202110ustar00rootroot00000000000000"""Functionality for storing special data in notebook code cells, which can then be inserted into the document body. """ from __future__ import annotations from typing import TYPE_CHECKING, Any import IPython from IPython.display import display as ipy_display from nbformat import NotebookNode from myst_nb.core.loggers import LoggerType if TYPE_CHECKING: from sphinx.application import Sphinx from myst_nb.docutils_ import DocutilsApp GLUE_PREFIX = "application/papermill.record/" def load_glue_sphinx(app: Sphinx) -> None: """Load the eval domain.""" from .directives import PasteAnyDirective from .domain import NbGlueDomain from .roles import PasteRoleAny app.add_directive("glue", PasteAnyDirective, override=True) app.add_role("glue", PasteRoleAny(), override=True) app.add_domain(NbGlueDomain) def load_glue_docutils(app: DocutilsApp) -> None: from .directives import ( PasteAnyDirective, PasteFigureDirective, PasteMarkdownDirective, PasteMathDirective, ) from .roles import PasteMarkdownRole, PasteRoleAny, PasteTextRole for name, role in [ ("glue", PasteRoleAny()), ("glue:", PasteRoleAny()), ("glue:any", PasteRoleAny()), ("glue:text", PasteTextRole()), ("glue:md", PasteMarkdownRole()), ]: app.roles[name] = role for name, directive in [ ("glue", PasteAnyDirective), ("glue:", PasteAnyDirective), ("glue:any", PasteAnyDirective), ("glue:figure", PasteFigureDirective), ("glue:math", PasteMathDirective), ("glue:md", PasteMarkdownDirective), ]: app.directives[name] = directive def glue(name: str, variable: Any, display: bool = True) -> None: """Glue a variable into the notebook's cell metadata. Parameters ---------- name: string A unique name for the variable. You can use this name to refer to the variable later on. variable: Python object A variable in Python for which you'd like to store its display value. This is not quite the same as storing the object itself - the stored information is what is *displayed* when you print or show the object in a Jupyter Notebook. display: bool Display the object you are gluing. This is helpful in sanity-checking the state of the object at glue-time. """ mimebundle, metadata = IPython.core.formatters.format_display_data(variable) mime_prefix = "" if display else GLUE_PREFIX metadata["scrapbook"] = dict(name=name, mime_prefix=mime_prefix) ipy_display( {mime_prefix + k: v for k, v in mimebundle.items()}, raw=True, metadata=metadata ) def extract_glue_data( notebook: NotebookNode, source_map: list[int], logger: LoggerType, ) -> dict[str, NotebookNode]: """Extract all the glue data from the notebook.""" # note this assumes v4 notebook format data: dict[str, NotebookNode] = {} for index, cell in enumerate(notebook.cells): if cell.cell_type != "code": continue for key, cell_data in extract_glue_data_cell(cell): if key in data: logger.warning( f"glue key {key!r} duplicate", subtype="glue", line=source_map[index], ) data[key] = cell_data return data def extract_glue_data_cell(cell: NotebookNode) -> list[tuple[str, NotebookNode]]: """Extract glue data from a single cell.""" outputs = [] data = [] for output in cell.get("outputs", []): meta = output.get("metadata", {}) if "scrapbook" not in meta: outputs.append(output) continue key = meta["scrapbook"]["name"] mime_prefix = len(meta["scrapbook"].get("mime_prefix", "")) output["data"] = {k[mime_prefix:]: v for k, v in output["data"].items()} data.append((key, output)) if not mime_prefix: # assume that the output is a displayable object outputs.append(output) cell.outputs = outputs return data MyST-NB-1.1.2/myst_nb/ext/glue/crossref.py000066400000000000000000000104531467453560600202760ustar00rootroot00000000000000"""Sphinx only cross-document gluing. Note, we restrict this to a only a subset of mime-types and data -> nodes transforms, since adding these nodes in a post-transform will not apply any transforms to them. """ from __future__ import annotations from functools import lru_cache import json from pathlib import Path from typing import Any, Sequence from docutils import nodes from sphinx.transforms.post_transforms import SphinxPostTransform from sphinx.util import logging as sphinx_logging from myst_nb._compat import findall from myst_nb.core.loggers import DEFAULT_LOG_TYPE from myst_nb.core.render import get_mime_priority from myst_nb.core.variables import format_plain_text from .utils import PendingGlueReference SPHINX_LOGGER = sphinx_logging.getLogger(__name__) @lru_cache(maxsize=3) def read_glue_cache(folder: str, docname: str) -> dict[str, Any]: """Read a glue cache from the build folder, for a particular document.""" docpath = docname.split("/") path = Path(folder).joinpath(*docpath[:-1]).joinpath(f"{docpath[-1]}.glue.json") if not path.exists(): return {} with path.open("r") as f: return json.load(f) class ReplacePendingGlueReferences(SphinxPostTransform): """Sphinx only cross-document gluing. Note, we restrict this to a only a subset of mime-types and data -> nodes transforms, since adding these nodes in a post-transform will not apply any transforms to them. """ default_priority = 5 def apply(self, **kwargs): """Apply the transform.""" cache_folder = self.env.mystnb_config.output_folder # type: ignore bname = self.app.builder.name priority_list = get_mime_priority( bname, self.config["nb_mime_priority_overrides"] ) node: PendingGlueReference for node in list(findall(self.document)(PendingGlueReference)): data = read_glue_cache(cache_folder, node.refdoc) if node.key not in data: SPHINX_LOGGER.warning( f"Glue reference {node.key!r} not found in doc {node.refdoc!r} " f"[{DEFAULT_LOG_TYPE}.glue_ref]", type=DEFAULT_LOG_TYPE, subtype="glue_ref", location=node, ) node.parent.remove(node) continue output = data[node.key] if node.gtype == "text": _nodes = generate_text_nodes(node, output) else: _nodes = generate_any_nodes(node, output, priority_list) if _nodes: node.replace_self(_nodes) else: node.parent.remove(node) def ref_warning(msg: str, node) -> None: """Log a warning for a reference.""" SPHINX_LOGGER.warning( f"{msg} [{DEFAULT_LOG_TYPE}.glue_ref]", type=DEFAULT_LOG_TYPE, subtype="glue_ref", location=node, ) def generate_any_nodes( node: PendingGlueReference, output: dict[str, Any], priority_list: Sequence[str] ) -> list[nodes.Element]: """Generate nodes for a cell, according to the highest priority mime type.""" data = output["data"] for mime_type in priority_list: if mime_type not in data: continue if mime_type == "text/plain": if node.inline: return [nodes.literal(data[mime_type], data[mime_type])] else: return [nodes.literal_block(data[mime_type], data[mime_type])] if mime_type == "text/html": return [ nodes.raw( text=data[mime_type], format="html", classes=["output", "text_html"] ) ] ref_warning( f"No allowed mime type found in {node.key!r}: {list(output['data'])}", node ) return [] def generate_text_nodes(node: PendingGlueReference, output: dict[str, Any]): """Generate nodes for a cell, for formatted text/plain.""" data = output["data"] if "text/plain" not in data: ref_warning(f"No text/plain found in {node.key!r}", node) return [] try: text = format_plain_text(data["text/plain"], node["fmt_spec"]) except Exception as exc: ref_warning(f"Failed to format text/plain: {exc}", node) return [] return [nodes.inline(text, text, classes=["pasted-text"])] MyST-NB-1.1.2/myst_nb/ext/glue/directives.py000066400000000000000000000223101467453560600206040ustar00rootroot00000000000000"""Directives which can be used by both docutils and sphinx. We intentionally do no import sphinx in this module, in order to allow docutils-only use without sphinx installed. """ from typing import TYPE_CHECKING, Any, Dict, List from docutils import nodes from docutils.parsers.rst import directives as spec from myst_nb.core.render import MimeData, strip_latex_delimiters from myst_nb.core.variables import RetrievalError, is_sphinx, render_variable_outputs from myst_nb.ext.utils import DirectiveBase from .utils import ( PendingGlueReferenceError, create_pending_glue_ref, glue_warning, retrieve_glue_data, ) if TYPE_CHECKING: from sphinx.domains.math import MathDomain from sphinx.environment import BuildEnvironment class PasteAnyDirective(DirectiveBase): """A directive for pasting code outputs from notebooks, using render priority to decide the output mime type. """ required_arguments = 1 # the key final_argument_whitespace = True has_content = False option_spec = {"doc": spec.unchanged} def run(self) -> List[nodes.Node]: """Run the directive.""" key = self.arguments[0] if "doc" in self.options: try: ref = create_pending_glue_ref( self.document, self.source, self.line, self.options["doc"], key ) except PendingGlueReferenceError as exc: return [ glue_warning( str(exc), self.document, self.line, ) ] return [ref] try: data = retrieve_glue_data(self.document, key) except RetrievalError as exc: return [ glue_warning( f"{exc} (use 'doc' option, to glue from another document)", self.document, self.line, ) ] return render_variable_outputs([data], self.document, self.line, self.source) def md_fmt(argument): return spec.choice(argument, ("commonmark", "gfm", "myst")) class PasteMarkdownDirective(DirectiveBase): """A directive for pasting markdown outputs from notebooks as MyST Markdown.""" required_arguments = 1 # the key final_argument_whitespace = True has_content = False option_spec = { "format": md_fmt, } def run(self) -> List[nodes.Node]: """Run the directive.""" key = self.arguments[0] try: result = retrieve_glue_data(self.document, key) except RetrievalError as exc: return [glue_warning(str(exc), self.document, self.line)] if "text/markdown" not in result.data: return [ glue_warning( f"No text/markdown found in {key!r} data", self.document, self.line, ) ] # TODO this "override" feels a bit hacky cell_key = result.nb_renderer.config.cell_metadata_key mime = MimeData( "text/markdown", result.data["text/markdown"], cell_metadata={ cell_key: {"markdown_format": self.options.get("format", "commonmark")}, }, output_metadata=result.metadata, line=self.line, ) _nodes = result.nb_renderer.render_markdown(mime) self.set_source_info(_nodes) return _nodes class PasteFigureDirective(DirectiveBase): """A directive for pasting code outputs from notebooks, wrapped in a figure. Mirrors: https://github.com/docutils-mirror/docutils/blob/9649abee47b4ce4db51be1d90fcb1fb500fa78b3/docutils/parsers/rst/directives/images.py#95 """ required_arguments = 1 # the key final_argument_whitespace = True has_content = True def align(argument): return spec.choice(argument, ("left", "center", "right")) def figwidth_value(argument): return spec.length_or_percentage_or_unitless(argument, "px") option_spec = { # note we don't add converters for image options, # since this is handled in `NbElementRenderer.render_image` "alt": spec.unchanged, "height": spec.unchanged, "width": spec.unchanged, "scale": spec.unchanged, "class": spec.unchanged, "figwidth": figwidth_value, "figclass": spec.class_option, "align": align, "name": spec.unchanged, } def run(self): try: data = retrieve_glue_data(self.document, self.arguments[0]) except RetrievalError as exc: return [glue_warning(str(exc), self.document, self.line)] render: Dict[str, Any] = {} for key in ("alt", "height", "width", "scale", "class"): if key in self.options: render.setdefault("image", {})[ key.replace("classes", "class") ] = self.options[key] paste_nodes = render_variable_outputs( [data], self.document, self.line, self.source, render=render ) # note: most of this is copied directly from sphinx.Figure # create figure node figure_node = nodes.figure("", *paste_nodes) self.set_source_info(figure_node) # add attributes figwidth = self.options.pop("figwidth", None) figclasses = self.options.pop("figclass", None) align = self.options.pop("align", None) if figwidth is not None: figure_node["width"] = figwidth if figclasses: figure_node["classes"] += figclasses if align: figure_node["align"] = align # add target self.add_name(figure_node) # create the caption and legend if self.content: node = nodes.Element() # anonymous container for parsing self.state.nested_parse(self.content, self.content_offset, node) first_node = node[0] if isinstance(first_node, nodes.paragraph): caption = nodes.caption(first_node.rawsource, "", *first_node.children) caption.source = first_node.source caption.line = first_node.line figure_node += caption elif not (isinstance(first_node, nodes.comment) and len(first_node) == 0): error = glue_warning( "Figure caption must be a paragraph or empty comment.", self.document, self.lineno, ) return [figure_node, error] if len(node) > 1: figure_node += nodes.legend("", *node[1:]) return [figure_node] class PasteMathDirective(DirectiveBase): """A directive for pasting latex outputs from notebooks as math.""" required_arguments = 1 # the key final_argument_whitespace = True has_content = False option_spec = { "class": spec.class_option, "nowrap": spec.flag, # these are equivalent "label": spec.unchanged, "name": spec.unchanged, } def run(self) -> List[nodes.Node]: """Run the directive.""" key = self.arguments[0] try: result = retrieve_glue_data(self.document, key) except RetrievalError as exc: return [glue_warning(str(exc), self.document, self.line)] if "text/latex" not in result.data: return [ glue_warning( f"No text/latex found in {key!r} data", self.document, self.lineno, ) ] latex = strip_latex_delimiters(str(result.data["text/latex"])) label = self.options.get("label", self.options.get("name")) node = nodes.math_block( latex, latex, nowrap="nowrap" in self.options, label=label, number=None, classes=["pasted-math"] + (self.options.get("class") or []), ) self.add_name(node) self.set_source_info(node) if is_sphinx(self.document): return self.add_target(node) return [node] def add_target(self, node: nodes.math_block) -> List[nodes.Node]: """Add target to the node.""" # adapted from sphinx.directives.patches.MathDirective env: "BuildEnvironment" = self.document.settings.env node["docname"] = env.docname # assign label automatically if math_number_all enabled if node["label"] == "" or (env.config.math_number_all and not node["label"]): seq = env.new_serialno("sphinx.ext.math#equations") node["label"] = "%s:%d" % (env.docname, seq) # no targets and numbers are needed if not node["label"]: return [node] # register label to domain domain: "MathDomain" = env.get_domain("math") # type: ignore domain.note_equation(env.docname, node["label"], location=node) node["number"] = domain.get_equation_number_for(node["label"]) # add target node node_id = nodes.make_id("equation-%s" % node["label"]) target = nodes.target("", "", ids=[node_id]) self.document.note_explicit_target(target) return [target, node] MyST-NB-1.1.2/myst_nb/ext/glue/domain.py000066400000000000000000000022411467453560600177130ustar00rootroot00000000000000"""A domain to register in sphinx. This is required for any directive/role names using `:`. """ from sphinx.domains import Domain from .directives import ( PasteAnyDirective, PasteFigureDirective, PasteMarkdownDirective, PasteMathDirective, ) from .roles import PasteMarkdownRole, PasteRoleAny, PasteTextRole class NbGlueDomain(Domain): """A sphinx domain for defining glue roles and directives. Note, the only reason we use this, is that sphinx will not allow for `:` in a directive/role name, if it is part of a domain. """ name = "glue" label = "NotebookGlue" # data version, bump this when the format of self.data changes data_version = 1 roles = { "": PasteRoleAny(), "any": PasteRoleAny(), "text": PasteTextRole(), "md": PasteMarkdownRole(), } directives = { "": PasteAnyDirective, "any": PasteAnyDirective, "figure": PasteFigureDirective, "math": PasteMathDirective, "md": PasteMarkdownDirective, } def merge_domaindata(self, *args, **kwargs): pass def resolve_any_xref(self, *args, **kwargs): return [] MyST-NB-1.1.2/myst_nb/ext/glue/roles.py000066400000000000000000000134161467453560600175760ustar00rootroot00000000000000"""Roles which can be used by both docutils and sphinx. We intentionally do no import sphinx in this module, in order to allow docutils-only use without sphinx installed. """ from __future__ import annotations from docutils import nodes from myst_nb.core.render import MimeData from myst_nb.core.variables import ( RetrievalError, format_plain_text, render_variable_outputs, ) from myst_nb.ext.utils import RoleBase from .utils import ( PendingGlueReferenceError, create_pending_glue_ref, glue_warning, retrieve_glue_data, ) class PasteRoleAny(RoleBase): """A role for pasting inline code outputs from notebooks, using render priority to decide the output mime type. """ def run(self) -> tuple[list[nodes.Node], list[nodes.system_message]]: # check if this is a pending reference doc_key = self.text.split("::", 1) if len(doc_key) == 2: doc, key = doc_key try: ref = create_pending_glue_ref( self.document, self.source, self.line, doc, key, inline=True ) except PendingGlueReferenceError as exc: return [], [ glue_warning( str(exc), self.document, self.line, ) ] return [ref], [] try: data = retrieve_glue_data(self.document, self.text) except RetrievalError as exc: return [], [glue_warning(str(exc), self.document, self.line)] paste_nodes = render_variable_outputs( [data], self.document, self.line, self.source, inline=True, ) return paste_nodes, [] class PasteTextRole(RoleBase): """A role for pasting text/plain outputs from notebooks. The role content should follow the format: ``:::``, where: - ```` (optional) is the relative path to another notebook, defaults to local. - ```` is the key - ```` (optional) is a format specifier, defined in: https://docs.python.org/3/library/string.html#format-specification-mini-language, it must end in the type character. """ def run(self) -> tuple[list[nodes.Node], list[nodes.system_message]]: # check if we have both key:format in the key key_format = self.text.rsplit(":", 1) if len(key_format) == 2: key, fmt_spec = key_format else: key = key_format[0] fmt_spec = "s" # check if this is a pending reference doc_key = key.split("::", 1) if len(doc_key) == 2: doc, key = doc_key try: ref = create_pending_glue_ref( self.document, self.source, self.line, doc, key, inline=True, gtype="text", fmt_spec=fmt_spec, ) except PendingGlueReferenceError as exc: return [], [ glue_warning( str(exc), self.document, self.line, ) ] return [ref], [] # now retrieve the data try: result = retrieve_glue_data(self.document, key) except RetrievalError as exc: return [], [ glue_warning( f"{exc} (use `path::key`, to glue from another document)", self.document, self.line, ) ] if "text/plain" not in result.data: return [], [ glue_warning( f"No text/plain found in {key!r} data", self.document, self.line ) ] try: text = format_plain_text(result.data["text/plain"], fmt_spec) except Exception as exc: return [], [ glue_warning( f"Failed to format text/plain data: {exc}", self.document, self.line ) ] node = nodes.inline(text, text, classes=["pasted-text"]) self.set_source_info(node) return [node], [] class PasteMarkdownRole(RoleBase): """A role for pasting markdown outputs from notebooks as inline MyST Markdown.""" def run(self) -> tuple[list[nodes.Node], list[nodes.system_message]]: # check if we have both key:format in the key parts = self.text.rsplit(":", 1) if len(parts) == 2: key, fmt = parts else: key = parts[0] fmt = "commonmark" # TODO - check fmt is valid # retrieve the data try: result = retrieve_glue_data(self.document, key) except RetrievalError as exc: return [], [glue_warning(str(exc), self.document, self.line)] if "text/markdown" not in result.data: return [], [ glue_warning( f"No text/markdown found in {key!r} data", self.document, self.line, ) ] # TODO this feels a bit hacky cell_key = result.nb_renderer.renderer.nb_config.cell_metadata_key mime = MimeData( "text/markdown", result.data["text/markdown"], cell_metadata={ cell_key: {"markdown_format": fmt}, }, output_metadata=result.metadata, line=self.line, ) _nodes = result.nb_renderer.render_markdown_inline(mime) for node in _nodes: self.set_source_info(node) return _nodes, [] MyST-NB-1.1.2/myst_nb/ext/glue/utils.py000066400000000000000000000051511467453560600176070ustar00rootroot00000000000000"""Utilities for working with docutils and sphinx. We intentionally do no import sphinx in this module, in order to allow docutils-only use without sphinx installed. """ from __future__ import annotations from functools import partial from typing import TYPE_CHECKING, Any from docutils import nodes from myst_nb.core.render import NbElementRenderer from myst_nb.core.variables import ( RetrievalError, VariableOutput, create_warning, is_sphinx, ) if TYPE_CHECKING: from sphinx.environment import BuildEnvironment glue_warning = partial(create_warning, subtype="glue") class PendingGlueReference(nodes.Element): """A glue reference to another document.""" @property def refdoc(self) -> str: return self.attributes["refdoc"] @property def key(self) -> str: return self.attributes["key"] @property def inline(self) -> bool: return self.attributes.get("inline", False) @property def gtype(self) -> str | None: return self.attributes.get("gtype", None) class PendingGlueReferenceError(Exception): """An error occurred while resolving a pending glue reference.""" def create_pending_glue_ref( document: nodes.document, source: str, line: int, rel_doc: str, key: str, inline: bool = False, gtype: str | None = None, **kwargs: Any, ) -> PendingGlueReference: """Create a pending glue reference.""" if not is_sphinx(document): raise PendingGlueReferenceError( "Pending glue references are only supported in sphinx." ) env: BuildEnvironment = document.settings.env _, filepath = env.relfn2path(rel_doc, env.docname) refdoc = env.path2doc(filepath) if refdoc is None: raise PendingGlueReferenceError( f"Pending glue reference document not found: {filepath!r}." ) ref = PendingGlueReference( refdoc=refdoc, key=key, inline=inline, gtype=gtype, **kwargs ) ref.source = source ref.line = line return ref def retrieve_glue_data(document: nodes.document, key: str) -> VariableOutput: """Retrieve the glue data from a specific document.""" msg = f"No key {key!r} found in glue data for this document." if "nb_renderer" not in document: raise RetrievalError(msg) element: NbElementRenderer = document["nb_renderer"] glue_data = element.renderer.nb_client.glue_data if key not in glue_data: raise RetrievalError(msg) return VariableOutput( data=glue_data[key]["data"], metadata=glue_data[key].get("metadata", {}), nb_renderer=element, vtype="glue", ) MyST-NB-1.1.2/myst_nb/ext/utils.py000066400000000000000000000046211467453560600166540ustar00rootroot00000000000000"""Extension utilities for extensions. We intentionally do no import sphinx in this module, in order to allow docutils-only use without sphinx installed. """ from __future__ import annotations from typing import Any from docutils import nodes from docutils.parsers.rst import Directive from docutils.parsers.rst.states import Inliner from docutils.utils import unescape from myst_nb._compat import findall def set_source_info(node: nodes.Node, source: str, line: int) -> None: """Set the source info for a node and its descendants.""" for _node in findall(node)(include_self=True): _node.source = source _node.line = line class RoleBase: """A base class for creating a role.""" @property def document(self) -> nodes.document: """Get the document.""" return self.inliner.document def set_source_info(self, node: nodes.Node) -> None: """Set the source info for a node and its descendants.""" set_source_info(node, self.source, self.line) def __call__( self, name: str, rawtext: str, text: str, lineno: int, inliner: Inliner, options=None, content=(), ) -> tuple[list[nodes.Node], list[nodes.system_message]]: self.text: str = unescape(text) self.inliner = inliner self.rawtext = rawtext source, line = inliner.reporter.get_source_and_line(lineno) self.source: str = source self.line: int = line return self.run() def run(self) -> tuple[list[nodes.Node], list[nodes.system_message]]: """Run the role.""" raise NotImplementedError class DirectiveBase(Directive): """A base class for creating a directive.""" @property def document(self) -> nodes.document: return self.state.document def __init__(self, *args, **kwargs) -> None: self.arguments: list[str] self.options: dict[str, Any] self.content: str super().__init__(*args, **kwargs) source, line = self.state_machine.get_source_and_line(self.lineno) self.source: str = source self.line: int = line def set_source_info(self, node: nodes.Node) -> None: """Set source and line number to the node and its descendants.""" nodes = node if isinstance(node, (list, tuple)) else [node] for _node in nodes: set_source_info(_node, self.source, self.line) MyST-NB-1.1.2/myst_nb/sphinx_.py000066400000000000000000000562541467453560600163750ustar00rootroot00000000000000"""The sphinx parser implementation for myst-nb.""" from __future__ import annotations from collections import defaultdict from html import escape import json from pathlib import Path import re from typing import Any, DefaultDict, cast from docutils import nodes from markdown_it.token import Token from markdown_it.tree import SyntaxTreeNode from myst_parser.config.main import MdParserConfig, merge_file_level from myst_parser.mdit_to_docutils.base import token_line from myst_parser.mdit_to_docutils.sphinx_ import SphinxRenderer from myst_parser.parsers.mdit import create_md_parser from myst_parser.parsers.sphinx_ import MystParser import nbformat from sphinx.application import Sphinx from sphinx.environment import BuildEnvironment from sphinx.environment.collectors import EnvironmentCollector from sphinx.transforms.post_transforms import SphinxPostTransform from sphinx.util import logging as sphinx_logging from sphinx.util.docutils import SphinxTranslator from myst_nb._compat import findall from myst_nb.core.config import NbParserConfig from myst_nb.core.execute import ExecutionResult, create_client from myst_nb.core.loggers import DEFAULT_LOG_TYPE, SphinxDocLogger from myst_nb.core.nb_to_tokens import nb_node_to_dict, notebook_to_tokens from myst_nb.core.read import create_nb_reader from myst_nb.core.render import ( MditRenderMixin, MimeData, NbElementRenderer, create_figure_context, get_mime_priority, load_renderer, ) from myst_nb.warnings_ import MystNBWarnings, create_warning SPHINX_LOGGER = sphinx_logging.getLogger(__name__) class SphinxEnvType(BuildEnvironment): """Sphinx build environment, including attributes set by myst_nb.""" myst_config: MdParserConfig mystnb_config: NbParserConfig nb_metadata: DefaultDict[str, dict] nb_new_exec_data: bool class Parser(MystParser): """Sphinx parser for Jupyter Notebook formats, containing MyST Markdown.""" supported = ("myst-nb",) translate_section_name = None config_section = "myst-nb parser" config_section_dependencies = ("parsers",) env: SphinxEnvType def parse(self, inputstring: str, document: nodes.document) -> None: """Parse source text. :param inputstring: The source string to parse :param document: The root docutils node to add AST elements to """ assert self.env is not None, "env not set" document_path = self.env.doc2path(self.env.docname) # get a logger for this document logger = SphinxDocLogger(document) # get markdown parsing configuration md_config: MdParserConfig = self.env.myst_config # get notebook rendering configuration nb_config: NbParserConfig = self.env.mystnb_config # create a reader for the notebook nb_reader = create_nb_reader(document_path, md_config, nb_config, inputstring) # If the nb_reader is None, then we default to a standard Markdown parser if nb_reader is None: return super().parse(inputstring, document) notebook = nb_reader.read(inputstring) # update the global markdown config with the file-level config warning = lambda wtype, msg: create_warning( # noqa: E731 document, msg, line=1, append_to=document, subtype=wtype ) nb_reader.md_config = merge_file_level( nb_reader.md_config, notebook.metadata, warning ) # potentially replace kernel name with alias kernel_name = notebook.metadata.get("kernelspec", {}).get("name", None) if kernel_name is not None and nb_config.kernel_rgx_aliases: for rgx, alias in nb_config.kernel_rgx_aliases.items(): if re.fullmatch(rgx, kernel_name): logger.debug( f"Replaced kernel name: {kernel_name!r} -> {alias!r}", subtype="kernel", ) notebook.metadata["kernelspec"]["name"] = alias break # Update mystnb configuration with notebook level metadata if nb_config.metadata_key in notebook.metadata: overrides = nb_node_to_dict(notebook.metadata[nb_config.metadata_key]) overrides.pop("output_folder", None) # this should not be overridden try: nb_config = nb_config.copy(**overrides) except Exception as exc: logger.warning( f"Failed to update configuration with notebook metadata: {exc}", subtype="config", ) else: logger.debug( "Updated configuration with notebook metadata", subtype="config" ) # Setup the parser mdit_parser = create_md_parser(nb_reader.md_config, SphinxNbRenderer) mdit_parser.options["document"] = document mdit_parser.options["nb_config"] = nb_config mdit_renderer: SphinxNbRenderer = mdit_parser.renderer # type: ignore mdit_env: dict[str, Any] = {} # load notebook element renderer class from entry-point name # this is separate from SphinxNbRenderer, so that users can override it renderer_name = nb_config.render_plugin nb_renderer: NbElementRenderer = load_renderer(renderer_name)( mdit_renderer, logger ) # we temporarily store nb_renderer on the document, # so that roles/directives can access it document.attributes["nb_renderer"] = nb_renderer # we currently do this early, so that the nb_renderer has access to things mdit_renderer.setup_render(mdit_parser.options, mdit_env) # type: ignore # parse notebook structure to markdown-it tokens # note, this does not assume that the notebook has been executed yet mdit_tokens = notebook_to_tokens(notebook, mdit_parser, mdit_env, logger) # open the notebook execution client, # this may execute the notebook immediately or during the page render with create_client( notebook, document_path, nb_config, logger, nb_reader.read_fmt ) as nb_client: mdit_parser.options["nb_client"] = nb_client # convert to docutils AST, which is added to the document mdit_renderer.render(mdit_tokens, mdit_parser.options, mdit_env) # save final execution data if nb_client.exec_metadata: NbMetadataCollector.set_exec_data( self.env, self.env.docname, nb_client.exec_metadata ) if nb_client.exec_metadata["traceback"]: # store error traceback in outdir and log its path reports_file = Path(self.env.app.outdir).joinpath( "reports", *(self.env.docname + ".err.log").split("/") ) reports_file.parent.mkdir(parents=True, exist_ok=True) reports_file.write_text( nb_client.exec_metadata["traceback"], encoding="utf8" ) logger.warning( f"Notebook exception traceback saved in: {reports_file}", subtype="exec", ) # write final (updated) notebook to output folder (utf8 is standard encoding) path = self.env.docname.split("/") ipynb_path = path[:-1] + [path[-1] + ".ipynb"] content = nbformat.writes(notebook).encode("utf-8") nb_renderer.write_file(ipynb_path, content, overwrite=True) # write glue data to the output folder, # and store the keys to environment doc metadata, # so that they may be used in any post-transform steps if nb_client.glue_data: glue_path = path[:-1] + [path[-1] + ".glue.json"] nb_renderer.write_file( glue_path, json.dumps(nb_client.glue_data, cls=BytesEncoder).encode("utf8"), overwrite=True, ) NbMetadataCollector.set_doc_data( self.env, self.env.docname, "glue", list(nb_client.glue_data.keys()) ) # move some document metadata to environment metadata, # so that we can later read it from the environment, # rather than having to load the whole doctree for key, (uri, kwargs) in document.attributes.pop("nb_js_files", {}).items(): NbMetadataCollector.add_js_file( self.env, self.env.docname, key, uri, kwargs ) # remove temporary state document.attributes.pop("nb_renderer") class SphinxNbRenderer(SphinxRenderer, MditRenderMixin): """A sphinx renderer for Jupyter Notebooks.""" def render_nb_initialise(self, token: SyntaxTreeNode) -> None: env = cast(BuildEnvironment, self.sphinx_env) metadata = self.nb_client.nb_metadata special_keys = ["kernelspec", "language_info", "source_map"] for key in special_keys: if key in metadata: # save these special keys on the metadata, rather than as docinfo # note, sphinx_book_theme checks kernelspec is in the metadata env.metadata[env.docname][key] = metadata.get(key) # forward the remaining metadata to the front_matter renderer special_keys.append("widgets") top_matter = {k: v for k, v in metadata.items() if k not in special_keys} self.render_front_matter( Token( # type: ignore "front_matter", "", 0, map=[0, 0], content=top_matter, # type: ignore[arg-type] ), ) def _render_nb_cell_code_outputs( self, token: SyntaxTreeNode, outputs: list[nbformat.NotebookNode] ) -> None: """Render a notebook code cell's outputs.""" line = token_line(token, 0) cell_index = token.meta["index"] metadata = token.meta["metadata"] # render the outputs for output_index, output in enumerate(outputs): if output.output_type == "stream": if output.name == "stdout": _nodes = self.nb_renderer.render_stdout( output, metadata, cell_index, line ) self.add_line_and_source_path_r(_nodes, token) self.current_node.extend(_nodes) elif output.name == "stderr": _nodes = self.nb_renderer.render_stderr( output, metadata, cell_index, line ) self.add_line_and_source_path_r(_nodes, token) self.current_node.extend(_nodes) else: pass # TODO warning elif output.output_type == "error": _nodes = self.nb_renderer.render_error( output, metadata, cell_index, line ) self.add_line_and_source_path_r(_nodes, token) self.current_node.extend(_nodes) elif output.output_type in ("display_data", "execute_result"): # Note, this is different to the docutils implementation, # where we directly select a single output, based on the mime_priority. # Here, we do not know the mime priority until we know the output format # so we output all the outputs during this parsing phase # (this is what sphinx caches as "output format agnostic" AST), # and replace the mime_bundle with the format specific output # in a post-transform (run per output format on the cached AST) figure_options = ( self.get_cell_level_config( "render_figure_options", metadata, line=line ) or None ) with create_figure_context(self, figure_options, line): mime_bundle = nodes.container(nb_element="mime_bundle") with self.current_node_context(mime_bundle): for mime_type, data in output["data"].items(): mime_container = nodes.container(mime_type=mime_type) with self.current_node_context(mime_container): _nodes = self.nb_renderer.render_mime_type( MimeData( mime_type, data, cell_metadata=metadata, output_metadata=output.get("metadata", {}), cell_index=cell_index, output_index=output_index, line=line, ) ) self.current_node.extend(_nodes) if mime_container.children: self.current_node.append(mime_container) if mime_bundle.children: self.add_line_and_source_path_r([mime_bundle], token) self.current_node.append(mime_bundle) else: create_warning( self.document, f"Unsupported output type: {output.output_type}", line=line, append_to=self.current_node, # wtype=DEFAULT_LOG_TYPE, subtype=MystNBWarnings.OUTPUT_TYPE, ) class SelectMimeType(SphinxPostTransform): """Select the mime type to render from mime bundles, based on the builder and its associated priority list. """ default_priority = 4 # TODO set correct priority def run(self, **kwargs: Any) -> None: """Run the transform.""" # get priority list for this builder # TODO allow for per-notebook/cell priority dicts? bname = self.app.builder.name priority_list = get_mime_priority( bname, self.config["nb_mime_priority_overrides"] ) def condition(node): return ( isinstance(node, nodes.container) and node.attributes.get("nb_element", "") == "mime_bundle" ) # remove/replace_self will not work with an iterator for node in list(findall(self.document)(condition)): # get available mime types mime_types = [node["mime_type"] for node in node.children] if not mime_types: node.parent.remove(node) continue # select top priority index = None for mime_type in priority_list: try: index = mime_types.index(mime_type) except ValueError: continue else: break if index is None: mime_string = ",".join(repr(m) for m in mime_types) SPHINX_LOGGER.warning( f"No mime type available in priority list for builder {bname!r} " f"({mime_string}) [{DEFAULT_LOG_TYPE}.mime_priority]", type=DEFAULT_LOG_TYPE, subtype="mime_priority", location=node, ) node.parent.remove(node) elif not node.children[index].children: node.parent.remove(node) else: node.replace_self(node.children[index].children) class NbMetadataCollector(EnvironmentCollector): """Collect myst-nb specific metadata, and handle merging of parallel builds.""" @staticmethod def set_doc_data(env: SphinxEnvType, docname: str, key: str, value: Any) -> None: """Add nb metadata for a docname to the environment.""" if not hasattr(env, "nb_metadata"): env.nb_metadata = defaultdict(dict) env.nb_metadata.setdefault(docname, {})[key] = value @staticmethod def get_doc_data(env: SphinxEnvType) -> DefaultDict[str, dict]: """Get myst-nb docname -> metadata dict.""" if not hasattr(env, "nb_metadata"): env.nb_metadata = defaultdict(dict) return env.nb_metadata @classmethod def set_exec_data( cls, env: SphinxEnvType, docname: str, value: ExecutionResult ) -> None: """Add nb metadata for a docname to the environment.""" cls.set_doc_data(env, docname, "exec_data", value) # TODO this does not take account of cache data cls.note_exec_update(env) @classmethod def get_exec_data(cls, env: SphinxEnvType, docname: str) -> ExecutionResult | None: """Get myst-nb docname -> execution data.""" return cls.get_doc_data(env)[docname].get("exec_data") def get_outdated_docs( # type: ignore[override] self, app: Sphinx, env: SphinxEnvType, added: set[str], changed: set[str], removed: set[str], ) -> list[str]: # called before any docs are read env.nb_new_exec_data = False return [] @staticmethod def note_exec_update(env: SphinxEnvType) -> None: """Note that a notebook has been executed.""" env.nb_new_exec_data = True @staticmethod def new_exec_data(env: SphinxEnvType) -> bool: """Return whether any notebooks have updated execution data.""" return getattr(env, "nb_new_exec_data", False) @classmethod def add_js_file( cls, env: SphinxEnvType, docname: str, key: str, uri: str | None, kwargs: dict[str, str], ): """Register a JavaScript file to include in the HTML output.""" if not hasattr(env, "nb_metadata"): env.nb_metadata = defaultdict(dict) js_files = env.nb_metadata.setdefault(docname, {}).setdefault("js_files", {}) # TODO handle whether overrides are allowed js_files[key] = (uri, kwargs) @classmethod def get_js_files( cls, env: SphinxEnvType, docname: str ) -> dict[str, tuple[str | None, dict[str, str]]]: """Get myst-nb docname -> execution data.""" return cls.get_doc_data(env)[docname].get("js_files", {}) def clear_doc( # type: ignore[override] self, app: Sphinx, env: SphinxEnvType, docname: str, ) -> None: if not hasattr(env, "nb_metadata"): env.nb_metadata = defaultdict(dict) env.nb_metadata.pop(docname, None) def process_doc(self, app: Sphinx, doctree: nodes.document) -> None: pass def merge_other( # type: ignore[override] self, app: Sphinx, env: SphinxEnvType, docnames: set[str], other: SphinxEnvType, ) -> None: if not hasattr(env, "nb_metadata"): env.nb_metadata = defaultdict(dict) other_metadata = getattr(other, "nb_metadata", defaultdict(dict)) for docname in docnames: env.nb_metadata[docname] = other_metadata[docname] if other.nb_new_exec_data: env.nb_new_exec_data = True class BytesEncoder(json.JSONEncoder): """A JSON encoder that accepts b64 (and other *ascii*) bytestrings.""" def default(self, obj): if isinstance(obj, bytes): return obj.decode("ascii") return json.JSONEncoder.default(self, obj) class HideCodeCellNode(nodes.Element): """Node for hiding cell input.""" @classmethod def add_to_app(cls, app: Sphinx): app.add_node(cls, html=(visit_HideCellInput, depart_HideCellInput)) def visit_HideCellInput(self: SphinxTranslator, node: HideCodeCellNode): classes = " ".join(node["classes"]) self.body.append(f'
\n') self.body.append('\n') self.body.append(f'\n') self.body.append(f'{escape(node["prompt_hide"])}\n') self.body.append("\n") def depart_HideCellInput(self: SphinxTranslator, node: HideCodeCellNode): self.body.append("
\n") class HideInputCells(SphinxPostTransform): """Hide input cells in the HTML output.""" default_priority = 199 formats = ("html",) def run(self, **kwargs): for node in findall(self.document)(nodes.container): if ( node.get("nb_element") == "cell_code" and node.get("hide_mode") and node.children ): hide_mode = node.get("hide_mode") has_input = node.children[0].get("nb_element") == "cell_code_source" has_output = node.children[-1].get("nb_element") == "cell_code_output" if has_input and hide_mode == "all": # wrap everything and place a summary above the input wrap_node = HideCodeCellNode( prompt_show=node["prompt_show"].replace("{type}", "content"), prompt_hide=node["prompt_hide"].replace("{type}", "content"), ) wrap_node["classes"].append("above-input") wrap_node.extend(node.children) node.children = [wrap_node] if has_input and has_output and hide_mode in ("output", "input+output"): node.children[0]["classes"].append("above-output-prompt") if has_input and hide_mode in ("input", "input+output"): # wrap just the input and place a summary above the input wrap_node = HideCodeCellNode( prompt_show=node["prompt_show"].replace("{type}", "source"), prompt_hide=node["prompt_hide"].replace("{type}", "source"), ) wrap_node["classes"].append("above-input") code = node.children[0] wrap_node.append(code) node.replace(code, wrap_node) if has_input and has_output and hide_mode in ("output", "input+output"): # wrap just the output and place a summary below the input wrap_node = HideCodeCellNode( prompt_show=node["prompt_show"].replace("{type}", "output"), prompt_hide=node["prompt_hide"].replace("{type}", "output"), ) wrap_node["classes"].append("below-input") output = node.children[-1] wrap_node.append(output) node.replace(output, wrap_node) if ( (not has_input) and has_output and hide_mode in ("all", "input+output", "output") ): # wrap just the output and place a summary above the output wrap_node = HideCodeCellNode( prompt_show=node["prompt_show"].replace("{type}", "outputs"), prompt_hide=node["prompt_hide"].replace("{type}", "outputs"), ) wrap_node["classes"].append("above-output") output = node.children[-1] wrap_node.append(output) node.replace(output, wrap_node) MyST-NB-1.1.2/myst_nb/sphinx_ext.py000066400000000000000000000213371467453560600171100ustar00rootroot00000000000000"""Setup for the myst-nb sphinx extension.""" from __future__ import annotations import contextlib import hashlib from importlib import resources as import_resources import os from pathlib import Path import sys from types import ModuleType from typing import Any, Iterator, cast from myst_parser.sphinx_ext.main import setup_sphinx as setup_myst_parser from sphinx.application import Sphinx from sphinx.util import logging as sphinx_logging from sphinx.util.fileutil import copy_asset_file from myst_nb import __version__, static from myst_nb.core.config import NbParserConfig from myst_nb.core.loggers import DEFAULT_LOG_TYPE from myst_nb.core.read import UnexpectedCellDirective from myst_nb.ext.download import NbDownloadRole from myst_nb.ext.eval import load_eval_sphinx from myst_nb.ext.glue import load_glue_sphinx from myst_nb.ext.glue.crossref import ReplacePendingGlueReferences from myst_nb.sphinx_ import ( HideCodeCellNode, HideInputCells, NbMetadataCollector, Parser, SelectMimeType, SphinxEnvType, ) SPHINX_LOGGER = sphinx_logging.getLogger(__name__) OUTPUT_FOLDER = "jupyter_execute" # used for deprecated config values, # so we can tell if they have been set by a user, and warn them _UNSET = "--unset--" def sphinx_setup(app: Sphinx): """Initialize Sphinx extension.""" # note, for core events overview, see: # https://www.sphinx-doc.org/en/master/extdev/appapi.html#sphinx-core-events # Add myst-parser configuration and transforms (but does not add the parser) setup_myst_parser(app) # add myst-nb configuration variables for name, default, field in NbParserConfig().as_triple(): if not field.metadata.get("sphinx_exclude"): # TODO add types? app.add_config_value(f"nb_{name}", default, "env", Any) # type: ignore[arg-type] if "legacy_name" in field.metadata: app.add_config_value( f"{field.metadata['legacy_name']}", _UNSET, "env", Any, # type: ignore[arg-type] ) # Handle non-standard deprecation app.add_config_value("nb_render_priority", _UNSET, "env", Any) # type: ignore[arg-type] # generate notebook configuration from Sphinx configuration # this also validates the configuration values app.connect("builder-inited", create_mystnb_config) # add parser and default associated file suffixes app.add_source_parser(Parser) app.add_source_suffix(".md", "myst-nb", override=True) app.add_source_suffix(".ipynb", "myst-nb") # add additional file suffixes for parsing app.connect("config-inited", add_nb_custom_formats) # ensure notebook checkpoints are excluded from parsing app.connect("config-inited", add_exclude_patterns) # add collector for myst nb specific data app.add_env_collector(NbMetadataCollector) # TODO add an event which, if any files have been removed, # all jupyter-cache stage records with a non-existent path are removed # (just to keep it "tidy", but won't affect run) # add directive to ensure all notebook cells are converted app.add_directive("code-cell", UnexpectedCellDirective, override=True) app.add_directive("raw-cell", UnexpectedCellDirective, override=True) # add directive for downloading an executed notebook app.add_role("nb-download", NbDownloadRole()) # add directive for evaluating glue and kernel variables load_eval_sphinx(app) load_glue_sphinx(app) # add post-transform for selecting mime type from a bundle app.add_post_transform(SelectMimeType) app.add_post_transform(ReplacePendingGlueReferences) # setup collapsible content app.add_post_transform(HideInputCells) HideCodeCellNode.add_to_app(app) # add HTML resources add_css(app) app.connect("build-finished", add_global_html_resources) # note, this event is only available in Sphinx >= 3.5 app.connect("html-page-context", add_per_page_html_resources) # Note lexers are registered as `pygments.lexers` entry-points # and so do not need to be added here. # setup extension for execution statistics tables # import here, to avoid circular import from myst_nb.ext.execution_tables import setup_exec_table_extension setup_exec_table_extension(app) return { "version": __version__, "parallel_read_safe": True, "parallel_write_safe": True, } def add_nb_custom_formats(app: Sphinx, config): """Add custom conversion formats.""" for suffix in config.nb_custom_formats: app.add_source_suffix(suffix, "myst-nb", override=True) def create_mystnb_config(app): """Generate notebook configuration from Sphinx configuration""" # Ignore type checkers because the attribute is dynamically assigned from sphinx.util.console import bold values = {} for name, _, field in NbParserConfig().as_triple(): if not field.metadata.get("sphinx_exclude"): values[name] = app.config[f"nb_{name}"] if "legacy_name" in field.metadata: legacy_value = app.config[field.metadata["legacy_name"]] if legacy_value != _UNSET: legacy_name = field.metadata["legacy_name"] SPHINX_LOGGER.warning( f"{legacy_name!r} is deprecated for 'nb_{name}' " f"[{DEFAULT_LOG_TYPE}.config]", type=DEFAULT_LOG_TYPE, subtype="config", ) values[name] = legacy_value if app.config["nb_render_priority"] != _UNSET: SPHINX_LOGGER.warning( "'nb_render_priority' is deprecated for 'nb_mime_priority_overrides'" f"{DEFAULT_LOG_TYPE}.config", type=DEFAULT_LOG_TYPE, subtype="config", ) try: app.env.mystnb_config = NbParserConfig(**values) SPHINX_LOGGER.info( bold("myst-nb v%s:") + " %s", __version__, app.env.mystnb_config ) except (TypeError, ValueError) as error: SPHINX_LOGGER.critical("myst-nb configuration invalid: %s", error.args[0]) raise # update the output_folder (for writing external files like images), # and the execution_cache_path (for caching notebook outputs) # to a set path within the sphinx build folder output_folder = Path(app.outdir).parent.joinpath(OUTPUT_FOLDER).resolve() exec_cache_path: None | str | Path = app.env.mystnb_config.execution_cache_path if not exec_cache_path: exec_cache_path = Path(app.outdir).parent.joinpath(".jupyter_cache").resolve() app.env.mystnb_config = app.env.mystnb_config.copy( output_folder=str(output_folder), execution_cache_path=str(exec_cache_path) ) SPHINX_LOGGER.info(f"Using jupyter-cache at: {exec_cache_path}") def add_exclude_patterns(app: Sphinx, config): """Add default exclude patterns (if not already present).""" if "**.ipynb_checkpoints" not in config.exclude_patterns: config.exclude_patterns.append("**.ipynb_checkpoints") def _get_file_hash(path: Path): """Get the hash of a file.""" return hashlib.sha256(path.read_bytes()).hexdigest() @contextlib.contextmanager def _import_resources_path(package: ModuleType, resource: str) -> Iterator[Path]: if sys.version_info < (3, 9): with import_resources.path(package, resource) as path: yield path else: with import_resources.as_file( import_resources.files(package).joinpath(resource) ) as path: yield path def add_css(app: Sphinx): """Add CSS for myst-nb.""" with _import_resources_path(static, "mystnb.css") as source_path: hash = _get_file_hash(source_path) app.add_css_file(f"mystnb.{hash}.css") def add_global_html_resources(app: Sphinx, exception): """Add HTML resources that apply to all pages.""" # see https://github.com/sphinx-doc/sphinx/issues/1379 if app.builder is not None and app.builder.format == "html" and not exception: with _import_resources_path(static, "mystnb.css") as source_path: hash = _get_file_hash(source_path) destination = os.path.join( app.builder.outdir, "_static", f"mystnb.{hash}.css" ) copy_asset_file(str(source_path), destination) def add_per_page_html_resources( app: Sphinx, pagename: str, *args: Any, **kwargs: Any ) -> None: """Add JS files for this page, identified from the parsing of the notebook.""" if app.env is None or app.builder is None or app.builder.format != "html": return js_files = NbMetadataCollector.get_js_files(cast(SphinxEnvType, app.env), pagename) for path, kwargs in js_files.values(): app.add_js_file(path, **kwargs) # type: ignore[arg-type] MyST-NB-1.1.2/myst_nb/static/000077500000000000000000000000001467453560600156265ustar00rootroot00000000000000MyST-NB-1.1.2/myst_nb/static/__init__.py000066400000000000000000000000001467453560600177250ustar00rootroot00000000000000MyST-NB-1.1.2/myst_nb/static/mystnb.css000066400000000000000000001147041467453560600176630ustar00rootroot00000000000000/* Variables */ :root { --mystnb-source-bg-color: #f7f7f7; --mystnb-stdout-bg-color: #fcfcfc; --mystnb-stderr-bg-color: #fdd; --mystnb-traceback-bg-color: #fcfcfc; --mystnb-source-border-color: #ccc; --mystnb-source-margin-color: green; --mystnb-stdout-border-color: #f7f7f7; --mystnb-stderr-border-color: #f7f7f7; --mystnb-traceback-border-color: #ffd6d6; --mystnb-hide-prompt-opacity: 70%; --mystnb-source-border-radius: .4em; --mystnb-source-border-width: 1px; } /* Whole cell */ div.container.cell { padding-left: 0; margin-bottom: 1em; } /* Removing all background formatting so we can control at the div level */ .cell_input div.highlight, .cell_output pre, .cell_input pre, .cell_output .output { border: none; box-shadow: none; } .cell_output .output pre, .cell_input pre { margin: 0px; } /* Input cells */ div.cell div.cell_input, div.cell details.above-input>summary { padding-left: 0em; padding-right: 0em; border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; background-color: var(--mystnb-source-bg-color); border-left-color: var(--mystnb-source-margin-color); border-left-width: medium; border-radius: var(--mystnb-source-border-radius); } div.cell_input>div, div.cell_output div.output>div.highlight { margin: 0em !important; border: none !important; } /* All cell outputs */ .cell_output { padding-left: 1em; padding-right: 0em; margin-top: 1em; } /* Text outputs from cells */ .cell_output .output.text_plain, .cell_output .output.traceback, .cell_output .output.stream, .cell_output .output.stderr { margin-top: 1em; margin-bottom: 0em; box-shadow: none; } .cell_output .output.text_plain, .cell_output .output.stream { background: var(--mystnb-stdout-bg-color); border: 1px solid var(--mystnb-stdout-border-color); } .cell_output .output.stderr { background: var(--mystnb-stderr-bg-color); border: 1px solid var(--mystnb-stderr-border-color); } .cell_output .output.traceback { background: var(--mystnb-traceback-bg-color); border: 1px solid var(--mystnb-traceback-border-color); } /* Collapsible cell content */ div.cell details.above-input div.cell_input { border-top-left-radius: 0; border-top-right-radius: 0; border-top: var(--mystnb-source-border-width) var(--mystnb-source-border-color) dashed; } div.cell div.cell_input.above-output-prompt { border-bottom-left-radius: 0; border-bottom-right-radius: 0; } div.cell details.above-input>summary { border-bottom-left-radius: 0; border-bottom-right-radius: 0; border-bottom: var(--mystnb-source-border-width) var(--mystnb-source-border-color) dashed; padding-left: 1em; margin-bottom: 0; } div.cell details.above-output>summary { background-color: var(--mystnb-source-bg-color); padding-left: 1em; padding-right: 0em; border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; border-radius: var(--mystnb-source-border-radius); border-left-color: var(--mystnb-source-margin-color); border-left-width: medium; } div.cell details.below-input>summary { background-color: var(--mystnb-source-bg-color); padding-left: 1em; padding-right: 0em; border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; border-top: none; border-bottom-left-radius: var(--mystnb-source-border-radius); border-bottom-right-radius: var(--mystnb-source-border-radius); border-left-color: var(--mystnb-source-margin-color); border-left-width: medium; } div.cell details.hide>summary>span { opacity: var(--mystnb-hide-prompt-opacity); } div.cell details.hide[open]>summary>span.collapsed { display: none; } div.cell details.hide:not([open])>summary>span.expanded { display: none; } @keyframes collapsed-fade-in { 0% { opacity: 0; } 100% { opacity: 1; } } div.cell details.hide[open]>summary~* { -moz-animation: collapsed-fade-in 0.3s ease-in-out; -webkit-animation: collapsed-fade-in 0.3s ease-in-out; animation: collapsed-fade-in 0.3s ease-in-out; } /* Math align to the left */ .cell_output .MathJax_Display { text-align: left !important; } /* Pandas tables. Pulled from the Jupyter / nbsphinx CSS */ div.cell_output table { border: none; border-collapse: collapse; border-spacing: 0; color: black; font-size: 1em; table-layout: fixed; } div.cell_output thead { border-bottom: 1px solid black; vertical-align: bottom; } div.cell_output tr, div.cell_output th, div.cell_output td { text-align: right; vertical-align: middle; padding: 0.5em 0.5em; line-height: normal; white-space: normal; max-width: none; border: none; } div.cell_output th { font-weight: bold; } div.cell_output tbody tr:nth-child(odd) { background: #f5f5f5; } div.cell_output tbody tr:hover { background: rgba(66, 165, 245, 0.2); } /** source code line numbers **/ span.linenos { opacity: 0.5; } /* Inline text from `paste` operation */ span.pasted-text { font-weight: bold; } span.pasted-inline img { max-height: 2em; } tbody span.pasted-inline img { max-height: none; } /* Font colors for translated ANSI escape sequences Color values are copied from Jupyter Notebook https://github.com/jupyter/notebook/blob/52581f8eda9b319eb0390ac77fe5903c38f81e3e/notebook/static/notebook/less/ansicolors.less#L14-L21 Background colors from https://nbsphinx.readthedocs.io/en/latest/code-cells.html#ANSI-Colors */ div.highlight .-Color-Bold { font-weight: bold; } div.highlight .-Color[class*=-Black] { color: #3E424D } div.highlight .-Color[class*=-Red] { color: #E75C58 } div.highlight .-Color[class*=-Green] { color: #00A250 } div.highlight .-Color[class*=-Yellow] { color: #DDB62B } div.highlight .-Color[class*=-Blue] { color: #208FFB } div.highlight .-Color[class*=-Magenta] { color: #D160C4 } div.highlight .-Color[class*=-Cyan] { color: #60C6C8 } div.highlight .-Color[class*=-White] { color: #C5C1B4 } div.highlight .-Color[class*=-BGBlack] { background-color: #3E424D } div.highlight .-Color[class*=-BGRed] { background-color: #E75C58 } div.highlight .-Color[class*=-BGGreen] { background-color: #00A250 } div.highlight .-Color[class*=-BGYellow] { background-color: #DDB62B } div.highlight .-Color[class*=-BGBlue] { background-color: #208FFB } div.highlight .-Color[class*=-BGMagenta] { background-color: #D160C4 } div.highlight .-Color[class*=-BGCyan] { background-color: #60C6C8 } div.highlight .-Color[class*=-BGWhite] { background-color: #C5C1B4 } /* Font colors for 8-bit ANSI */ div.highlight .-Color[class*=-C0] { color: #000000 } div.highlight .-Color[class*=-BGC0] { background-color: #000000 } div.highlight .-Color[class*=-C1] { color: #800000 } div.highlight .-Color[class*=-BGC1] { background-color: #800000 } div.highlight .-Color[class*=-C2] { color: #008000 } div.highlight .-Color[class*=-BGC2] { background-color: #008000 } div.highlight .-Color[class*=-C3] { color: #808000 } div.highlight .-Color[class*=-BGC3] { background-color: #808000 } div.highlight .-Color[class*=-C4] { color: #000080 } div.highlight .-Color[class*=-BGC4] { background-color: #000080 } div.highlight .-Color[class*=-C5] { color: #800080 } div.highlight .-Color[class*=-BGC5] { background-color: #800080 } div.highlight .-Color[class*=-C6] { color: #008080 } div.highlight .-Color[class*=-BGC6] { background-color: #008080 } div.highlight .-Color[class*=-C7] { color: #C0C0C0 } div.highlight .-Color[class*=-BGC7] { background-color: #C0C0C0 } div.highlight .-Color[class*=-C8] { color: #808080 } div.highlight .-Color[class*=-BGC8] { background-color: #808080 } div.highlight .-Color[class*=-C9] { color: #FF0000 } div.highlight .-Color[class*=-BGC9] { background-color: #FF0000 } div.highlight .-Color[class*=-C10] { color: #00FF00 } div.highlight .-Color[class*=-BGC10] { background-color: #00FF00 } div.highlight .-Color[class*=-C11] { color: #FFFF00 } div.highlight .-Color[class*=-BGC11] { background-color: #FFFF00 } div.highlight .-Color[class*=-C12] { color: #0000FF } div.highlight .-Color[class*=-BGC12] { background-color: #0000FF } div.highlight .-Color[class*=-C13] { color: #FF00FF } div.highlight .-Color[class*=-BGC13] { background-color: #FF00FF } div.highlight .-Color[class*=-C14] { color: #00FFFF } div.highlight .-Color[class*=-BGC14] { background-color: #00FFFF } div.highlight .-Color[class*=-C15] { color: #FFFFFF } div.highlight .-Color[class*=-BGC15] { background-color: #FFFFFF } div.highlight .-Color[class*=-C16] { color: #000000 } div.highlight .-Color[class*=-BGC16] { background-color: #000000 } div.highlight .-Color[class*=-C17] { color: #00005F } div.highlight .-Color[class*=-BGC17] { background-color: #00005F } div.highlight .-Color[class*=-C18] { color: #000087 } div.highlight .-Color[class*=-BGC18] { background-color: #000087 } div.highlight .-Color[class*=-C19] { color: #0000AF } div.highlight .-Color[class*=-BGC19] { background-color: #0000AF } div.highlight .-Color[class*=-C20] { color: #0000D7 } div.highlight .-Color[class*=-BGC20] { background-color: #0000D7 } div.highlight .-Color[class*=-C21] { color: #0000FF } div.highlight .-Color[class*=-BGC21] { background-color: #0000FF } div.highlight .-Color[class*=-C22] { color: #005F00 } div.highlight .-Color[class*=-BGC22] { background-color: #005F00 } div.highlight .-Color[class*=-C23] { color: #005F5F } div.highlight .-Color[class*=-BGC23] { background-color: #005F5F } div.highlight .-Color[class*=-C24] { color: #005F87 } div.highlight .-Color[class*=-BGC24] { background-color: #005F87 } div.highlight .-Color[class*=-C25] { color: #005FAF } div.highlight .-Color[class*=-BGC25] { background-color: #005FAF } div.highlight .-Color[class*=-C26] { color: #005FD7 } div.highlight .-Color[class*=-BGC26] { background-color: #005FD7 } div.highlight .-Color[class*=-C27] { color: #005FFF } div.highlight .-Color[class*=-BGC27] { background-color: #005FFF } div.highlight .-Color[class*=-C28] { color: #008700 } div.highlight .-Color[class*=-BGC28] { background-color: #008700 } div.highlight .-Color[class*=-C29] { color: #00875F } div.highlight .-Color[class*=-BGC29] { background-color: #00875F } div.highlight .-Color[class*=-C30] { color: #008787 } div.highlight .-Color[class*=-BGC30] { background-color: #008787 } div.highlight .-Color[class*=-C31] { color: #0087AF } div.highlight .-Color[class*=-BGC31] { background-color: #0087AF } div.highlight .-Color[class*=-C32] { color: #0087D7 } div.highlight .-Color[class*=-BGC32] { background-color: #0087D7 } div.highlight .-Color[class*=-C33] { color: #0087FF } div.highlight .-Color[class*=-BGC33] { background-color: #0087FF } div.highlight .-Color[class*=-C34] { color: #00AF00 } div.highlight .-Color[class*=-BGC34] { background-color: #00AF00 } div.highlight .-Color[class*=-C35] { color: #00AF5F } div.highlight .-Color[class*=-BGC35] { background-color: #00AF5F } div.highlight .-Color[class*=-C36] { color: #00AF87 } div.highlight .-Color[class*=-BGC36] { background-color: #00AF87 } div.highlight .-Color[class*=-C37] { color: #00AFAF } div.highlight .-Color[class*=-BGC37] { background-color: #00AFAF } div.highlight .-Color[class*=-C38] { color: #00AFD7 } div.highlight .-Color[class*=-BGC38] { background-color: #00AFD7 } div.highlight .-Color[class*=-C39] { color: #00AFFF } div.highlight .-Color[class*=-BGC39] { background-color: #00AFFF } div.highlight .-Color[class*=-C40] { color: #00D700 } div.highlight .-Color[class*=-BGC40] { background-color: #00D700 } div.highlight .-Color[class*=-C41] { color: #00D75F } div.highlight .-Color[class*=-BGC41] { background-color: #00D75F } div.highlight .-Color[class*=-C42] { color: #00D787 } div.highlight .-Color[class*=-BGC42] { background-color: #00D787 } div.highlight .-Color[class*=-C43] { color: #00D7AF } div.highlight .-Color[class*=-BGC43] { background-color: #00D7AF } div.highlight .-Color[class*=-C44] { color: #00D7D7 } div.highlight .-Color[class*=-BGC44] { background-color: #00D7D7 } div.highlight .-Color[class*=-C45] { color: #00D7FF } div.highlight .-Color[class*=-BGC45] { background-color: #00D7FF } div.highlight .-Color[class*=-C46] { color: #00FF00 } div.highlight .-Color[class*=-BGC46] { background-color: #00FF00 } div.highlight .-Color[class*=-C47] { color: #00FF5F } div.highlight .-Color[class*=-BGC47] { background-color: #00FF5F } div.highlight .-Color[class*=-C48] { color: #00FF87 } div.highlight .-Color[class*=-BGC48] { background-color: #00FF87 } div.highlight .-Color[class*=-C49] { color: #00FFAF } div.highlight .-Color[class*=-BGC49] { background-color: #00FFAF } div.highlight .-Color[class*=-C50] { color: #00FFD7 } div.highlight .-Color[class*=-BGC50] { background-color: #00FFD7 } div.highlight .-Color[class*=-C51] { color: #00FFFF } div.highlight .-Color[class*=-BGC51] { background-color: #00FFFF } div.highlight .-Color[class*=-C52] { color: #5F0000 } div.highlight .-Color[class*=-BGC52] { background-color: #5F0000 } div.highlight .-Color[class*=-C53] { color: #5F005F } div.highlight .-Color[class*=-BGC53] { background-color: #5F005F } div.highlight .-Color[class*=-C54] { color: #5F0087 } div.highlight .-Color[class*=-BGC54] { background-color: #5F0087 } div.highlight .-Color[class*=-C55] { color: #5F00AF } div.highlight .-Color[class*=-BGC55] { background-color: #5F00AF } div.highlight .-Color[class*=-C56] { color: #5F00D7 } div.highlight .-Color[class*=-BGC56] { background-color: #5F00D7 } div.highlight .-Color[class*=-C57] { color: #5F00FF } div.highlight .-Color[class*=-BGC57] { background-color: #5F00FF } div.highlight .-Color[class*=-C58] { color: #5F5F00 } div.highlight .-Color[class*=-BGC58] { background-color: #5F5F00 } div.highlight .-Color[class*=-C59] { color: #5F5F5F } div.highlight .-Color[class*=-BGC59] { background-color: #5F5F5F } div.highlight .-Color[class*=-C60] { color: #5F5F87 } div.highlight .-Color[class*=-BGC60] { background-color: #5F5F87 } div.highlight .-Color[class*=-C61] { color: #5F5FAF } div.highlight .-Color[class*=-BGC61] { background-color: #5F5FAF } div.highlight .-Color[class*=-C62] { color: #5F5FD7 } div.highlight .-Color[class*=-BGC62] { background-color: #5F5FD7 } div.highlight .-Color[class*=-C63] { color: #5F5FFF } div.highlight .-Color[class*=-BGC63] { background-color: #5F5FFF } div.highlight .-Color[class*=-C64] { color: #5F8700 } div.highlight .-Color[class*=-BGC64] { background-color: #5F8700 } div.highlight .-Color[class*=-C65] { color: #5F875F } div.highlight .-Color[class*=-BGC65] { background-color: #5F875F } div.highlight .-Color[class*=-C66] { color: #5F8787 } div.highlight .-Color[class*=-BGC66] { background-color: #5F8787 } div.highlight .-Color[class*=-C67] { color: #5F87AF } div.highlight .-Color[class*=-BGC67] { background-color: #5F87AF } div.highlight .-Color[class*=-C68] { color: #5F87D7 } div.highlight .-Color[class*=-BGC68] { background-color: #5F87D7 } div.highlight .-Color[class*=-C69] { color: #5F87FF } div.highlight .-Color[class*=-BGC69] { background-color: #5F87FF } div.highlight .-Color[class*=-C70] { color: #5FAF00 } div.highlight .-Color[class*=-BGC70] { background-color: #5FAF00 } div.highlight .-Color[class*=-C71] { color: #5FAF5F } div.highlight .-Color[class*=-BGC71] { background-color: #5FAF5F } div.highlight .-Color[class*=-C72] { color: #5FAF87 } div.highlight .-Color[class*=-BGC72] { background-color: #5FAF87 } div.highlight .-Color[class*=-C73] { color: #5FAFAF } div.highlight .-Color[class*=-BGC73] { background-color: #5FAFAF } div.highlight .-Color[class*=-C74] { color: #5FAFD7 } div.highlight .-Color[class*=-BGC74] { background-color: #5FAFD7 } div.highlight .-Color[class*=-C75] { color: #5FAFFF } div.highlight .-Color[class*=-BGC75] { background-color: #5FAFFF } div.highlight .-Color[class*=-C76] { color: #5FD700 } div.highlight .-Color[class*=-BGC76] { background-color: #5FD700 } div.highlight .-Color[class*=-C77] { color: #5FD75F } div.highlight .-Color[class*=-BGC77] { background-color: #5FD75F } div.highlight .-Color[class*=-C78] { color: #5FD787 } div.highlight .-Color[class*=-BGC78] { background-color: #5FD787 } div.highlight .-Color[class*=-C79] { color: #5FD7AF } div.highlight .-Color[class*=-BGC79] { background-color: #5FD7AF } div.highlight .-Color[class*=-C80] { color: #5FD7D7 } div.highlight .-Color[class*=-BGC80] { background-color: #5FD7D7 } div.highlight .-Color[class*=-C81] { color: #5FD7FF } div.highlight .-Color[class*=-BGC81] { background-color: #5FD7FF } div.highlight .-Color[class*=-C82] { color: #5FFF00 } div.highlight .-Color[class*=-BGC82] { background-color: #5FFF00 } div.highlight .-Color[class*=-C83] { color: #5FFF5F } div.highlight .-Color[class*=-BGC83] { background-color: #5FFF5F } div.highlight .-Color[class*=-C84] { color: #5FFF87 } div.highlight .-Color[class*=-BGC84] { background-color: #5FFF87 } div.highlight .-Color[class*=-C85] { color: #5FFFAF } div.highlight .-Color[class*=-BGC85] { background-color: #5FFFAF } div.highlight .-Color[class*=-C86] { color: #5FFFD7 } div.highlight .-Color[class*=-BGC86] { background-color: #5FFFD7 } div.highlight .-Color[class*=-C87] { color: #5FFFFF } div.highlight .-Color[class*=-BGC87] { background-color: #5FFFFF } div.highlight .-Color[class*=-C88] { color: #870000 } div.highlight .-Color[class*=-BGC88] { background-color: #870000 } div.highlight .-Color[class*=-C89] { color: #87005F } div.highlight .-Color[class*=-BGC89] { background-color: #87005F } div.highlight .-Color[class*=-C90] { color: #870087 } div.highlight .-Color[class*=-BGC90] { background-color: #870087 } div.highlight .-Color[class*=-C91] { color: #8700AF } div.highlight .-Color[class*=-BGC91] { background-color: #8700AF } div.highlight .-Color[class*=-C92] { color: #8700D7 } div.highlight .-Color[class*=-BGC92] { background-color: #8700D7 } div.highlight .-Color[class*=-C93] { color: #8700FF } div.highlight .-Color[class*=-BGC93] { background-color: #8700FF } div.highlight .-Color[class*=-C94] { color: #875F00 } div.highlight .-Color[class*=-BGC94] { background-color: #875F00 } div.highlight .-Color[class*=-C95] { color: #875F5F } div.highlight .-Color[class*=-BGC95] { background-color: #875F5F } div.highlight .-Color[class*=-C96] { color: #875F87 } div.highlight .-Color[class*=-BGC96] { background-color: #875F87 } div.highlight .-Color[class*=-C97] { color: #875FAF } div.highlight .-Color[class*=-BGC97] { background-color: #875FAF } div.highlight .-Color[class*=-C98] { color: #875FD7 } div.highlight .-Color[class*=-BGC98] { background-color: #875FD7 } div.highlight .-Color[class*=-C99] { color: #875FFF } div.highlight .-Color[class*=-BGC99] { background-color: #875FFF } div.highlight .-Color[class*=-C100] { color: #878700 } div.highlight .-Color[class*=-BGC100] { background-color: #878700 } div.highlight .-Color[class*=-C101] { color: #87875F } div.highlight .-Color[class*=-BGC101] { background-color: #87875F } div.highlight .-Color[class*=-C102] { color: #878787 } div.highlight .-Color[class*=-BGC102] { background-color: #878787 } div.highlight .-Color[class*=-C103] { color: #8787AF } div.highlight .-Color[class*=-BGC103] { background-color: #8787AF } div.highlight .-Color[class*=-C104] { color: #8787D7 } div.highlight .-Color[class*=-BGC104] { background-color: #8787D7 } div.highlight .-Color[class*=-C105] { color: #8787FF } div.highlight .-Color[class*=-BGC105] { background-color: #8787FF } div.highlight .-Color[class*=-C106] { color: #87AF00 } div.highlight .-Color[class*=-BGC106] { background-color: #87AF00 } div.highlight .-Color[class*=-C107] { color: #87AF5F } div.highlight .-Color[class*=-BGC107] { background-color: #87AF5F } div.highlight .-Color[class*=-C108] { color: #87AF87 } div.highlight .-Color[class*=-BGC108] { background-color: #87AF87 } div.highlight .-Color[class*=-C109] { color: #87AFAF } div.highlight .-Color[class*=-BGC109] { background-color: #87AFAF } div.highlight .-Color[class*=-C110] { color: #87AFD7 } div.highlight .-Color[class*=-BGC110] { background-color: #87AFD7 } div.highlight .-Color[class*=-C111] { color: #87AFFF } div.highlight .-Color[class*=-BGC111] { background-color: #87AFFF } div.highlight .-Color[class*=-C112] { color: #87D700 } div.highlight .-Color[class*=-BGC112] { background-color: #87D700 } div.highlight .-Color[class*=-C113] { color: #87D75F } div.highlight .-Color[class*=-BGC113] { background-color: #87D75F } div.highlight .-Color[class*=-C114] { color: #87D787 } div.highlight .-Color[class*=-BGC114] { background-color: #87D787 } div.highlight .-Color[class*=-C115] { color: #87D7AF } div.highlight .-Color[class*=-BGC115] { background-color: #87D7AF } div.highlight .-Color[class*=-C116] { color: #87D7D7 } div.highlight .-Color[class*=-BGC116] { background-color: #87D7D7 } div.highlight .-Color[class*=-C117] { color: #87D7FF } div.highlight .-Color[class*=-BGC117] { background-color: #87D7FF } div.highlight .-Color[class*=-C118] { color: #87FF00 } div.highlight .-Color[class*=-BGC118] { background-color: #87FF00 } div.highlight .-Color[class*=-C119] { color: #87FF5F } div.highlight .-Color[class*=-BGC119] { background-color: #87FF5F } div.highlight .-Color[class*=-C120] { color: #87FF87 } div.highlight .-Color[class*=-BGC120] { background-color: #87FF87 } div.highlight .-Color[class*=-C121] { color: #87FFAF } div.highlight .-Color[class*=-BGC121] { background-color: #87FFAF } div.highlight .-Color[class*=-C122] { color: #87FFD7 } div.highlight .-Color[class*=-BGC122] { background-color: #87FFD7 } div.highlight .-Color[class*=-C123] { color: #87FFFF } div.highlight .-Color[class*=-BGC123] { background-color: #87FFFF } div.highlight .-Color[class*=-C124] { color: #AF0000 } div.highlight .-Color[class*=-BGC124] { background-color: #AF0000 } div.highlight .-Color[class*=-C125] { color: #AF005F } div.highlight .-Color[class*=-BGC125] { background-color: #AF005F } div.highlight .-Color[class*=-C126] { color: #AF0087 } div.highlight .-Color[class*=-BGC126] { background-color: #AF0087 } div.highlight .-Color[class*=-C127] { color: #AF00AF } div.highlight .-Color[class*=-BGC127] { background-color: #AF00AF } div.highlight .-Color[class*=-C128] { color: #AF00D7 } div.highlight .-Color[class*=-BGC128] { background-color: #AF00D7 } div.highlight .-Color[class*=-C129] { color: #AF00FF } div.highlight .-Color[class*=-BGC129] { background-color: #AF00FF } div.highlight .-Color[class*=-C130] { color: #AF5F00 } div.highlight .-Color[class*=-BGC130] { background-color: #AF5F00 } div.highlight .-Color[class*=-C131] { color: #AF5F5F } div.highlight .-Color[class*=-BGC131] { background-color: #AF5F5F } div.highlight .-Color[class*=-C132] { color: #AF5F87 } div.highlight .-Color[class*=-BGC132] { background-color: #AF5F87 } div.highlight .-Color[class*=-C133] { color: #AF5FAF } div.highlight .-Color[class*=-BGC133] { background-color: #AF5FAF } div.highlight .-Color[class*=-C134] { color: #AF5FD7 } div.highlight .-Color[class*=-BGC134] { background-color: #AF5FD7 } div.highlight .-Color[class*=-C135] { color: #AF5FFF } div.highlight .-Color[class*=-BGC135] { background-color: #AF5FFF } div.highlight .-Color[class*=-C136] { color: #AF8700 } div.highlight .-Color[class*=-BGC136] { background-color: #AF8700 } div.highlight .-Color[class*=-C137] { color: #AF875F } div.highlight .-Color[class*=-BGC137] { background-color: #AF875F } div.highlight .-Color[class*=-C138] { color: #AF8787 } div.highlight .-Color[class*=-BGC138] { background-color: #AF8787 } div.highlight .-Color[class*=-C139] { color: #AF87AF } div.highlight .-Color[class*=-BGC139] { background-color: #AF87AF } div.highlight .-Color[class*=-C140] { color: #AF87D7 } div.highlight .-Color[class*=-BGC140] { background-color: #AF87D7 } div.highlight .-Color[class*=-C141] { color: #AF87FF } div.highlight .-Color[class*=-BGC141] { background-color: #AF87FF } div.highlight .-Color[class*=-C142] { color: #AFAF00 } div.highlight .-Color[class*=-BGC142] { background-color: #AFAF00 } div.highlight .-Color[class*=-C143] { color: #AFAF5F } div.highlight .-Color[class*=-BGC143] { background-color: #AFAF5F } div.highlight .-Color[class*=-C144] { color: #AFAF87 } div.highlight .-Color[class*=-BGC144] { background-color: #AFAF87 } div.highlight .-Color[class*=-C145] { color: #AFAFAF } div.highlight .-Color[class*=-BGC145] { background-color: #AFAFAF } div.highlight .-Color[class*=-C146] { color: #AFAFD7 } div.highlight .-Color[class*=-BGC146] { background-color: #AFAFD7 } div.highlight .-Color[class*=-C147] { color: #AFAFFF } div.highlight .-Color[class*=-BGC147] { background-color: #AFAFFF } div.highlight .-Color[class*=-C148] { color: #AFD700 } div.highlight .-Color[class*=-BGC148] { background-color: #AFD700 } div.highlight .-Color[class*=-C149] { color: #AFD75F } div.highlight .-Color[class*=-BGC149] { background-color: #AFD75F } div.highlight .-Color[class*=-C150] { color: #AFD787 } div.highlight .-Color[class*=-BGC150] { background-color: #AFD787 } div.highlight .-Color[class*=-C151] { color: #AFD7AF } div.highlight .-Color[class*=-BGC151] { background-color: #AFD7AF } div.highlight .-Color[class*=-C152] { color: #AFD7D7 } div.highlight .-Color[class*=-BGC152] { background-color: #AFD7D7 } div.highlight .-Color[class*=-C153] { color: #AFD7FF } div.highlight .-Color[class*=-BGC153] { background-color: #AFD7FF } div.highlight .-Color[class*=-C154] { color: #AFFF00 } div.highlight .-Color[class*=-BGC154] { background-color: #AFFF00 } div.highlight .-Color[class*=-C155] { color: #AFFF5F } div.highlight .-Color[class*=-BGC155] { background-color: #AFFF5F } div.highlight .-Color[class*=-C156] { color: #AFFF87 } div.highlight .-Color[class*=-BGC156] { background-color: #AFFF87 } div.highlight .-Color[class*=-C157] { color: #AFFFAF } div.highlight .-Color[class*=-BGC157] { background-color: #AFFFAF } div.highlight .-Color[class*=-C158] { color: #AFFFD7 } div.highlight .-Color[class*=-BGC158] { background-color: #AFFFD7 } div.highlight .-Color[class*=-C159] { color: #AFFFFF } div.highlight .-Color[class*=-BGC159] { background-color: #AFFFFF } div.highlight .-Color[class*=-C160] { color: #D70000 } div.highlight .-Color[class*=-BGC160] { background-color: #D70000 } div.highlight .-Color[class*=-C161] { color: #D7005F } div.highlight .-Color[class*=-BGC161] { background-color: #D7005F } div.highlight .-Color[class*=-C162] { color: #D70087 } div.highlight .-Color[class*=-BGC162] { background-color: #D70087 } div.highlight .-Color[class*=-C163] { color: #D700AF } div.highlight .-Color[class*=-BGC163] { background-color: #D700AF } div.highlight .-Color[class*=-C164] { color: #D700D7 } div.highlight .-Color[class*=-BGC164] { background-color: #D700D7 } div.highlight .-Color[class*=-C165] { color: #D700FF } div.highlight .-Color[class*=-BGC165] { background-color: #D700FF } div.highlight .-Color[class*=-C166] { color: #D75F00 } div.highlight .-Color[class*=-BGC166] { background-color: #D75F00 } div.highlight .-Color[class*=-C167] { color: #D75F5F } div.highlight .-Color[class*=-BGC167] { background-color: #D75F5F } div.highlight .-Color[class*=-C168] { color: #D75F87 } div.highlight .-Color[class*=-BGC168] { background-color: #D75F87 } div.highlight .-Color[class*=-C169] { color: #D75FAF } div.highlight .-Color[class*=-BGC169] { background-color: #D75FAF } div.highlight .-Color[class*=-C170] { color: #D75FD7 } div.highlight .-Color[class*=-BGC170] { background-color: #D75FD7 } div.highlight .-Color[class*=-C171] { color: #D75FFF } div.highlight .-Color[class*=-BGC171] { background-color: #D75FFF } div.highlight .-Color[class*=-C172] { color: #D78700 } div.highlight .-Color[class*=-BGC172] { background-color: #D78700 } div.highlight .-Color[class*=-C173] { color: #D7875F } div.highlight .-Color[class*=-BGC173] { background-color: #D7875F } div.highlight .-Color[class*=-C174] { color: #D78787 } div.highlight .-Color[class*=-BGC174] { background-color: #D78787 } div.highlight .-Color[class*=-C175] { color: #D787AF } div.highlight .-Color[class*=-BGC175] { background-color: #D787AF } div.highlight .-Color[class*=-C176] { color: #D787D7 } div.highlight .-Color[class*=-BGC176] { background-color: #D787D7 } div.highlight .-Color[class*=-C177] { color: #D787FF } div.highlight .-Color[class*=-BGC177] { background-color: #D787FF } div.highlight .-Color[class*=-C178] { color: #D7AF00 } div.highlight .-Color[class*=-BGC178] { background-color: #D7AF00 } div.highlight .-Color[class*=-C179] { color: #D7AF5F } div.highlight .-Color[class*=-BGC179] { background-color: #D7AF5F } div.highlight .-Color[class*=-C180] { color: #D7AF87 } div.highlight .-Color[class*=-BGC180] { background-color: #D7AF87 } div.highlight .-Color[class*=-C181] { color: #D7AFAF } div.highlight .-Color[class*=-BGC181] { background-color: #D7AFAF } div.highlight .-Color[class*=-C182] { color: #D7AFD7 } div.highlight .-Color[class*=-BGC182] { background-color: #D7AFD7 } div.highlight .-Color[class*=-C183] { color: #D7AFFF } div.highlight .-Color[class*=-BGC183] { background-color: #D7AFFF } div.highlight .-Color[class*=-C184] { color: #D7D700 } div.highlight .-Color[class*=-BGC184] { background-color: #D7D700 } div.highlight .-Color[class*=-C185] { color: #D7D75F } div.highlight .-Color[class*=-BGC185] { background-color: #D7D75F } div.highlight .-Color[class*=-C186] { color: #D7D787 } div.highlight .-Color[class*=-BGC186] { background-color: #D7D787 } div.highlight .-Color[class*=-C187] { color: #D7D7AF } div.highlight .-Color[class*=-BGC187] { background-color: #D7D7AF } div.highlight .-Color[class*=-C188] { color: #D7D7D7 } div.highlight .-Color[class*=-BGC188] { background-color: #D7D7D7 } div.highlight .-Color[class*=-C189] { color: #D7D7FF } div.highlight .-Color[class*=-BGC189] { background-color: #D7D7FF } div.highlight .-Color[class*=-C190] { color: #D7FF00 } div.highlight .-Color[class*=-BGC190] { background-color: #D7FF00 } div.highlight .-Color[class*=-C191] { color: #D7FF5F } div.highlight .-Color[class*=-BGC191] { background-color: #D7FF5F } div.highlight .-Color[class*=-C192] { color: #D7FF87 } div.highlight .-Color[class*=-BGC192] { background-color: #D7FF87 } div.highlight .-Color[class*=-C193] { color: #D7FFAF } div.highlight .-Color[class*=-BGC193] { background-color: #D7FFAF } div.highlight .-Color[class*=-C194] { color: #D7FFD7 } div.highlight .-Color[class*=-BGC194] { background-color: #D7FFD7 } div.highlight .-Color[class*=-C195] { color: #D7FFFF } div.highlight .-Color[class*=-BGC195] { background-color: #D7FFFF } div.highlight .-Color[class*=-C196] { color: #FF0000 } div.highlight .-Color[class*=-BGC196] { background-color: #FF0000 } div.highlight .-Color[class*=-C197] { color: #FF005F } div.highlight .-Color[class*=-BGC197] { background-color: #FF005F } div.highlight .-Color[class*=-C198] { color: #FF0087 } div.highlight .-Color[class*=-BGC198] { background-color: #FF0087 } div.highlight .-Color[class*=-C199] { color: #FF00AF } div.highlight .-Color[class*=-BGC199] { background-color: #FF00AF } div.highlight .-Color[class*=-C200] { color: #FF00D7 } div.highlight .-Color[class*=-BGC200] { background-color: #FF00D7 } div.highlight .-Color[class*=-C201] { color: #FF00FF } div.highlight .-Color[class*=-BGC201] { background-color: #FF00FF } div.highlight .-Color[class*=-C202] { color: #FF5F00 } div.highlight .-Color[class*=-BGC202] { background-color: #FF5F00 } div.highlight .-Color[class*=-C203] { color: #FF5F5F } div.highlight .-Color[class*=-BGC203] { background-color: #FF5F5F } div.highlight .-Color[class*=-C204] { color: #FF5F87 } div.highlight .-Color[class*=-BGC204] { background-color: #FF5F87 } div.highlight .-Color[class*=-C205] { color: #FF5FAF } div.highlight .-Color[class*=-BGC205] { background-color: #FF5FAF } div.highlight .-Color[class*=-C206] { color: #FF5FD7 } div.highlight .-Color[class*=-BGC206] { background-color: #FF5FD7 } div.highlight .-Color[class*=-C207] { color: #FF5FFF } div.highlight .-Color[class*=-BGC207] { background-color: #FF5FFF } div.highlight .-Color[class*=-C208] { color: #FF8700 } div.highlight .-Color[class*=-BGC208] { background-color: #FF8700 } div.highlight .-Color[class*=-C209] { color: #FF875F } div.highlight .-Color[class*=-BGC209] { background-color: #FF875F } div.highlight .-Color[class*=-C210] { color: #FF8787 } div.highlight .-Color[class*=-BGC210] { background-color: #FF8787 } div.highlight .-Color[class*=-C211] { color: #FF87AF } div.highlight .-Color[class*=-BGC211] { background-color: #FF87AF } div.highlight .-Color[class*=-C212] { color: #FF87D7 } div.highlight .-Color[class*=-BGC212] { background-color: #FF87D7 } div.highlight .-Color[class*=-C213] { color: #FF87FF } div.highlight .-Color[class*=-BGC213] { background-color: #FF87FF } div.highlight .-Color[class*=-C214] { color: #FFAF00 } div.highlight .-Color[class*=-BGC214] { background-color: #FFAF00 } div.highlight .-Color[class*=-C215] { color: #FFAF5F } div.highlight .-Color[class*=-BGC215] { background-color: #FFAF5F } div.highlight .-Color[class*=-C216] { color: #FFAF87 } div.highlight .-Color[class*=-BGC216] { background-color: #FFAF87 } div.highlight .-Color[class*=-C217] { color: #FFAFAF } div.highlight .-Color[class*=-BGC217] { background-color: #FFAFAF } div.highlight .-Color[class*=-C218] { color: #FFAFD7 } div.highlight .-Color[class*=-BGC218] { background-color: #FFAFD7 } div.highlight .-Color[class*=-C219] { color: #FFAFFF } div.highlight .-Color[class*=-BGC219] { background-color: #FFAFFF } div.highlight .-Color[class*=-C220] { color: #FFD700 } div.highlight .-Color[class*=-BGC220] { background-color: #FFD700 } div.highlight .-Color[class*=-C221] { color: #FFD75F } div.highlight .-Color[class*=-BGC221] { background-color: #FFD75F } div.highlight .-Color[class*=-C222] { color: #FFD787 } div.highlight .-Color[class*=-BGC222] { background-color: #FFD787 } div.highlight .-Color[class*=-C223] { color: #FFD7AF } div.highlight .-Color[class*=-BGC223] { background-color: #FFD7AF } div.highlight .-Color[class*=-C224] { color: #FFD7D7 } div.highlight .-Color[class*=-BGC224] { background-color: #FFD7D7 } div.highlight .-Color[class*=-C225] { color: #FFD7FF } div.highlight .-Color[class*=-BGC225] { background-color: #FFD7FF } div.highlight .-Color[class*=-C226] { color: #FFFF00 } div.highlight .-Color[class*=-BGC226] { background-color: #FFFF00 } div.highlight .-Color[class*=-C227] { color: #FFFF5F } div.highlight .-Color[class*=-BGC227] { background-color: #FFFF5F } div.highlight .-Color[class*=-C228] { color: #FFFF87 } div.highlight .-Color[class*=-BGC228] { background-color: #FFFF87 } div.highlight .-Color[class*=-C229] { color: #FFFFAF } div.highlight .-Color[class*=-BGC229] { background-color: #FFFFAF } div.highlight .-Color[class*=-C230] { color: #FFFFD7 } div.highlight .-Color[class*=-BGC230] { background-color: #FFFFD7 } div.highlight .-Color[class*=-C231] { color: #FFFFFF } div.highlight .-Color[class*=-BGC231] { background-color: #FFFFFF } div.highlight .-Color[class*=-C232] { color: #080808 } div.highlight .-Color[class*=-BGC232] { background-color: #080808 } div.highlight .-Color[class*=-C233] { color: #121212 } div.highlight .-Color[class*=-BGC233] { background-color: #121212 } div.highlight .-Color[class*=-C234] { color: #1C1C1C } div.highlight .-Color[class*=-BGC234] { background-color: #1C1C1C } div.highlight .-Color[class*=-C235] { color: #262626 } div.highlight .-Color[class*=-BGC235] { background-color: #262626 } div.highlight .-Color[class*=-C236] { color: #303030 } div.highlight .-Color[class*=-BGC236] { background-color: #303030 } div.highlight .-Color[class*=-C237] { color: #3A3A3A } div.highlight .-Color[class*=-BGC237] { background-color: #3A3A3A } div.highlight .-Color[class*=-C238] { color: #444444 } div.highlight .-Color[class*=-BGC238] { background-color: #444444 } div.highlight .-Color[class*=-C239] { color: #4E4E4E } div.highlight .-Color[class*=-BGC239] { background-color: #4E4E4E } div.highlight .-Color[class*=-C240] { color: #585858 } div.highlight .-Color[class*=-BGC240] { background-color: #585858 } div.highlight .-Color[class*=-C241] { color: #626262 } div.highlight .-Color[class*=-BGC241] { background-color: #626262 } div.highlight .-Color[class*=-C242] { color: #6C6C6C } div.highlight .-Color[class*=-BGC242] { background-color: #6C6C6C } div.highlight .-Color[class*=-C243] { color: #767676 } div.highlight .-Color[class*=-BGC243] { background-color: #767676 } div.highlight .-Color[class*=-C244] { color: #808080 } div.highlight .-Color[class*=-BGC244] { background-color: #808080 } div.highlight .-Color[class*=-C245] { color: #8A8A8A } div.highlight .-Color[class*=-BGC245] { background-color: #8A8A8A } div.highlight .-Color[class*=-C246] { color: #949494 } div.highlight .-Color[class*=-BGC246] { background-color: #949494 } div.highlight .-Color[class*=-C247] { color: #9E9E9E } div.highlight .-Color[class*=-BGC247] { background-color: #9E9E9E } div.highlight .-Color[class*=-C248] { color: #A8A8A8 } div.highlight .-Color[class*=-BGC248] { background-color: #A8A8A8 } div.highlight .-Color[class*=-C249] { color: #B2B2B2 } div.highlight .-Color[class*=-BGC249] { background-color: #B2B2B2 } div.highlight .-Color[class*=-C250] { color: #BCBCBC } div.highlight .-Color[class*=-BGC250] { background-color: #BCBCBC } div.highlight .-Color[class*=-C251] { color: #C6C6C6 } div.highlight .-Color[class*=-BGC251] { background-color: #C6C6C6 } div.highlight .-Color[class*=-C252] { color: #D0D0D0 } div.highlight .-Color[class*=-BGC252] { background-color: #D0D0D0 } div.highlight .-Color[class*=-C253] { color: #DADADA } div.highlight .-Color[class*=-BGC253] { background-color: #DADADA } div.highlight .-Color[class*=-C254] { color: #E4E4E4 } div.highlight .-Color[class*=-BGC254] { background-color: #E4E4E4 } div.highlight .-Color[class*=-C255] { color: #EEEEEE } div.highlight .-Color[class*=-BGC255] { background-color: #EEEEEE } MyST-NB-1.1.2/myst_nb/warnings_.py000066400000000000000000000060101467453560600166750ustar00rootroot00000000000000"""Central handling of warnings for the myst-nb extension.""" from __future__ import annotations from enum import Enum from typing import Sequence from docutils import nodes from myst_parser.warnings_ import MystWarnings from myst_parser.warnings_ import create_warning as myst_parser_create_warnings __all__ = [ "MystWarnings", "MystNBWarnings", "create_warning", ] class MystNBWarnings(Enum): """MySTNB warning types.""" LEXER = "lexer" """Issue resolving lexer""" FIG_CAPTION = "fig_caption" """Issue resoliving figure caption""" MIME_TYPE = "mime_type" """Issue resolving MIME type""" OUTPUT_TYPE = "output_type" """Issue resolving Output type""" CELL_METADATA_KEY = "cell_metadata_key" """Issue with a key in a cell's `metadata` dictionary.""" CELL_CONFIG = "cell_config" """Issue with a cell's configuration or metadata.""" def _is_suppressed_warning( type: str, subtype: str, suppress_warnings: Sequence[str] ) -> bool: """Check whether the warning is suppressed or not. Mirrors: https://github.com/sphinx-doc/sphinx/blob/47d9035bca9e83d6db30a0726a02dc9265bd66b1/sphinx/util/logging.py """ if type is None: return False subtarget: str | None for warning_type in suppress_warnings: if "." in warning_type: target, subtarget = warning_type.split(".", 1) else: target, subtarget = warning_type, None if target == type and subtarget in (None, subtype, "*"): return True return False def create_warning( document: nodes.document, message: str, subtype: MystNBWarnings | MystWarnings, *, line: int | None = None, append_to: nodes.Element | None = None, ) -> nodes.system_message | None: """Generate a warning, logging if it is necessary. If the warning type is listed in the ``suppress_warnings`` configuration, then ``None`` will be returned and no warning logged. """ # Pass off Myst Parser warnings to that package if isinstance(subtype, MystWarnings): myst_parser_create_warnings( document=document, message=message, subtype=subtype, line=line, append_to=append_to, ) wtype = "myst-nb" # figure out whether to suppress the warning, if sphinx is available, # it will have been set up by the Sphinx environment, # otherwise we will use the configuration set by docutils suppress_warnings: Sequence[str] = [] try: suppress_warnings = document.settings.env.app.config.suppress_warnings except AttributeError: suppress_warnings = document.settings.myst_suppress_warnings or [] if _is_suppressed_warning(wtype, subtype.value, suppress_warnings): return None kwargs = {"line": line} if line is not None else {} message = f"{message} [{wtype}.{subtype.value}]" msg_node = document.reporter.warning(message, **kwargs) if append_to is not None: append_to.append(msg_node) return msg_node MyST-NB-1.1.2/pyproject.toml000066400000000000000000000076671467453560600156200ustar00rootroot00000000000000 [build-system] requires = ["flit_core >=3.4,<4"] build-backend = "flit_core.buildapi" [project] name = "myst-nb" dynamic = ["version"] description = "A Jupyter Notebook Sphinx reader built on top of the MyST markdown parser." authors = [{name = "ExecutableBookProject", email = "chrisj_sewell@hotmail.com"}] maintainers = [{name = "Angus Hollands", email = "goosey15@gmail.com"}] readme = "README.md" license = {file = "LICENSE"} classifiers = [ "Development Status :: 5 - Production/Stable", "Framework :: Sphinx :: Extension", "Intended Audience :: Developers", "Programming Language :: Python :: 3", "Programming Language :: Python :: 3 :: Only", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", "Programming Language :: Python :: Implementation :: CPython", "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Software Development :: Libraries :: Python Modules", "Topic :: Text Processing :: Markup", ] keywords = [ "markdown", "lexer", "parser", "jupyter", "docutils", "sphinx", ] requires-python = ">=3.9" dependencies = [ "importlib_metadata", "ipython", "jupyter-cache>=0.5", "nbclient", "myst-parser>=1.0.0", "nbformat>=5.0", "pyyaml", "sphinx>=5", "typing-extensions", # ipykernel is not a requirement of the library, # but is a common requirement for users (registers the python3 kernel) "ipykernel", ] [project.urls] Homepage = "https://github.com/executablebooks/myst-nb" Documentation = "https://myst-nb.readthedocs.io" [project.entry-points."myst_nb.renderers"] default = "myst_nb.core.render:NbElementRenderer" [project.entry-points."myst_nb.mime_renderers"] example = "myst_nb.core.render:ExampleMimeRenderPlugin" [project.entry-points."pygments.lexers"] myst-ansi = "myst_nb.core.lexers:AnsiColorLexer" ipythontb = "myst_nb.core.lexers:IPythonTracebackLexer" [project.entry-points."jcache.readers"] myst_nb_md = "myst_nb.core.read:myst_nb_reader_plugin" [project.optional-dependencies] code_style = ["pre-commit"] rtd = [ "alabaster", "altair", "bokeh", "coconut>=1.4.3", "ipykernel>=5.5", "ipywidgets", "jupytext>=1.11.2", "matplotlib", "numpy", "pandas", "plotly", "sphinx-book-theme>=0.3", "sphinx-copybutton", "sphinx-design", "sphinxcontrib-bibtex", "sympy", ] testing = [ "coverage>=6.4", "beautifulsoup4", "ipykernel>=5.5", # for issue with 8.1.0 see https://github.com/ipython/ipython/issues/13554 "ipython!=8.1.0", "ipywidgets>=8", "jupytext>=1.11.2", # Matplotlib outputs are sensitive to the matplotlib version "matplotlib==3.7.*", "nbdime", "numpy", "pandas", "pyarrow", "pytest", "pytest-cov>=3", "pytest-regressions", "pytest-param-files", "sympy>=1.10.1", ] [project.scripts] mystnb-quickstart = "myst_nb.cli:quickstart" mystnb-to-jupyter = "myst_nb.cli:md_to_nb" mystnb-docutils-html = "myst_nb.docutils_:cli_html" mystnb-docutils-html5 = "myst_nb.docutils_:cli_html5" mystnb-docutils-latex = "myst_nb.docutils_:cli_latex" mystnb-docutils-xml = "myst_nb.docutils_:cli_xml" mystnb-docutils-pseudoxml = "myst_nb.docutils_:cli_pseudoxml" [tool.flit.module] name = "myst_nb" [tool.flit.sdist] exclude = [ "docs/", "tests/", ] [tool.mypy] show_error_codes = true check_untyped_defs = true strict_equality = true no_implicit_optional = true warn_unused_ignores = true [[tool.mypy.overrides]] module = ["myst_nb.*"] # can only follow these imports when more of the code is typed follow_imports = "skip" [[tool.mypy.overrides]] module = ["docutils.*", "nbformat.*", "jupyter_cache.*", "IPython.*", "pygments.*"] ignore_missing_imports = true [tool.ruff.lint] ignore = [ "E203", # Whitespace before punctuation ] [tool.ruff.lint.isort] force-sort-within-sections = true MyST-NB-1.1.2/tests/000077500000000000000000000000001467453560600140265ustar00rootroot00000000000000MyST-NB-1.1.2/tests/conftest.py000066400000000000000000000224271467453560600162340ustar00rootroot00000000000000import json import os from pathlib import Path import re import uuid import bs4 from docutils.nodes import image as image_node from nbconvert.filters import strip_ansi from nbdime.diffing.notebooks import ( diff_notebooks, set_notebook_diff_ignores, set_notebook_diff_targets, ) from nbdime.prettyprint import pretty_print_diff import nbformat as nbf import pytest import sphinx from sphinx import version_info as sphinx_version_info from sphinx.util.console import nocolor pytest_plugins = "sphinx.testing.fixtures" # -Diff Configuration-# NB_VERSION = 4 set_notebook_diff_ignores({"/nbformat_minor": True}) set_notebook_diff_targets(metadata=False) TEST_FILE_DIR = Path(__file__).parent.joinpath("notebooks") @pytest.fixture(autouse=True, scope="session") def build_matplotlib_font_cache(): """This is to mitigate errors on CI VMs, where you can get the message: "Matplotlib is building the font cache" in output notebooks """ from matplotlib.font_manager import FontManager FontManager() @pytest.fixture() def get_test_path(): def _get_test_path(name): return TEST_FILE_DIR.joinpath(name) return _get_test_path class SphinxFixture: """A class returned by the ``sphinx_run`` fixture, to run sphinx, and retrieve aspects of the build. """ def __init__(self, app, filenames): self.app = app self.env = app.env self.files = [os.path.splitext(ff) for ff in filenames] self.software_versions = ( f".sphinx{sphinx.version_info[0]}" # software version tracking for fixtures ) # self.nb_file = nb_file # self.nb_name = os.path.splitext(nb_file)[0] def build(self): """Run the sphinx build.""" # TODO reset streams before each build, # but this was wiping the warnings of a build self.app.build() def status(self): """Return the stdout stream of the sphinx build.""" return self.app._status.getvalue().strip() def warnings(self): """Return the stderr stream of the sphinx build.""" return self.app._warning.getvalue().strip() def invalidate_files(self): """Invalidate the files, such that it will be flagged for a re-read.""" for name, _ in self.files: self.env.all_docs.pop(name) def get_resolved_doctree(self, docname=None): """Load and return the built docutils.document, after post-transforms.""" docname = docname or self.files[0][0] doctree = self.env.get_and_resolve_doctree(docname, self.app.builder) doctree["source"] = docname return doctree def get_doctree(self, docname=None): """Load and return the built docutils.document.""" docname = docname or self.files[0][0] doctree = self.env.get_doctree(docname) doctree["source"] = docname return doctree def get_html(self, index=0): """Return the built HTML file.""" name = self.files[index][0] _path = self.app.outdir / (name + ".html") if not _path.exists(): pytest.fail("html not output") return bs4.BeautifulSoup(_path.read_text(), "html.parser") def get_nb(self, index=0): """Return the output notebook (after any execution).""" name = self.files[index][0] _path = self.app.srcdir / "_build" / "jupyter_execute" / (name + ".ipynb") if not _path.exists(): pytest.fail("notebook not output") return _path.read_text(encoding="utf-8") def get_report_file(self, index=0): """Return the report file for a failed execution.""" name = self.files[index][0] _path = self.app.outdir / "reports" / (name + ".err.log") if not _path.exists(): pytest.fail("report log not output") return _path.read_text() @pytest.fixture() def sphinx_params(request): """Parameters that are specified by 'pytest.mark.sphinx_params' are passed to the ``sphinx_run`` fixture:: @pytest.mark.sphinx_params("name.ipynb", conf={"option": "value"}) def test_something(sphinx_run): ... The first file specified here will be set as the master_doc """ markers = request.node.iter_markers("sphinx_params") kwargs = {} if markers is not None: for info in reversed(list(markers)): kwargs.update(info.kwargs) kwargs["files"] = info.args return kwargs @pytest.fixture() def sphinx_run(sphinx_params, make_app, tmp_path): """A fixture to setup and run a sphinx build, in a sandboxed folder. The `myst_nb` extension is added by default, and the first file will be set as the masterdoc """ assert len(sphinx_params["files"]) > 0, sphinx_params["files"] conf = sphinx_params.get("conf", {}) buildername = sphinx_params.get("buildername", "html") confoverrides = { "extensions": ["myst_nb"], "master_doc": os.path.splitext(sphinx_params["files"][0])[0], "exclude_patterns": ["_build"], "nb_execution_show_tb": True, } confoverrides.update(conf) current_dir = os.getcwd() if "working_dir" in sphinx_params: base_dir = Path(sphinx_params["working_dir"]) / str(uuid.uuid4()) else: base_dir = tmp_path srcdir = base_dir / "source" srcdir.mkdir(exist_ok=True) os.chdir(base_dir) (srcdir / "conf.py").write_text( "# conf overrides (passed directly to sphinx):\n" + "\n".join( ["# " + ll for ll in json.dumps(confoverrides, indent=2).splitlines()] ) + "\n" ) for nb_file in sphinx_params["files"]: nb_path = TEST_FILE_DIR.joinpath(nb_file) assert nb_path.exists(), nb_path (srcdir / nb_file).parent.mkdir(exist_ok=True) (srcdir / nb_file).write_text( nb_path.read_text(encoding="utf-8"), encoding="utf-8" ) nocolor() # For compatibility with multiple versions of sphinx, convert pathlib.Path to # sphinx.testing.path.path here. if sphinx_version_info >= (7, 2): app_srcdir = srcdir else: from sphinx.testing.path import path app_srcdir = path(os.fspath(srcdir)) app = make_app( buildername=buildername, srcdir=app_srcdir, confoverrides=confoverrides ) yield SphinxFixture(app, sphinx_params["files"]) # reset working directory os.chdir(current_dir) def empty_non_deterministic_outputs(cell): if "outputs" in cell and len(cell.outputs): for item in cell.outputs: if "data" in item and "image/png" in item.data: item.data["image/png"] = "" if "filenames" in item.get("metadata", {}): item["metadata"]["filenames"] = { k: os.path.basename(v) for k, v in item["metadata"]["filenames"].items() } if "traceback" in item: item["traceback"] = [strip_ansi(line) for line in item["traceback"]] @pytest.fixture() def check_nbs(): def _check_nbs(obtained_filename, expected_filename): obtained_nb = nbf.read(str(obtained_filename), nbf.NO_CONVERT) expect_nb = nbf.read(str(expected_filename), nbf.NO_CONVERT) obtained_nb.nbformat_minor = 5 expect_nb.nbformat_minor = 5 for cell in expect_nb.cells: empty_non_deterministic_outputs(cell) cell.id = "none" for cell in obtained_nb.cells: empty_non_deterministic_outputs(cell) cell.id = "none" diff = diff_notebooks(obtained_nb, expect_nb) filename_without_path = str(expected_filename)[ str(expected_filename).rfind("/") + 1 : ] if diff: raise AssertionError( pretty_print_diff(obtained_nb, diff, str(filename_without_path)) ) return _check_nbs @pytest.fixture() def clean_doctree(): def _func(doctree): if os.name == "nt": # on Windows file paths are absolute findall = getattr(doctree, "findall", doctree.traverse) for node in findall(image_node): # type: image_node if "candidates" in node: node["candidates"]["*"] = ( "_build/jupyter_execute/" + os.path.basename(node["candidates"]["*"]) ) if "uri" in node: node["uri"] = "_build/jupyter_execute/" + os.path.basename( node["uri"] ) return doctree return _func # comparison files will need updating # alternatively the resolution of https://github.com/ESSS/pytest-regressions/issues/32 @pytest.fixture() def file_regression(file_regression): return FileRegression(file_regression) class FileRegression: ignores = ( # TODO: Remove when support for Sphinx<=6 is dropped, re.escape(" translation_progress=\"{'total': 0, 'translated': 0}\""), # TODO: Remove when support for Sphinx<7.2 is dropped, r"original_uri=\"[^\"]*\"\s", ) def __init__(self, file_regression): self.file_regression = file_regression def check(self, data, **kwargs): return self.file_regression.check(self._strip_ignores(data), **kwargs) def _strip_ignores(self, data): for ig in self.ignores: data = re.sub(ig, "", data) return data MyST-NB-1.1.2/tests/nb_fixtures/000077500000000000000000000000001467453560600163565ustar00rootroot00000000000000MyST-NB-1.1.2/tests/nb_fixtures/basic.txt000066400000000000000000000117141467453560600202040ustar00rootroot00000000000000Markdown Cell: . cells: - cell_type: markdown metadata: {} source: | # A Title . A Title . Code Cell (no output): . cells: - cell_type: code metadata: {} execution_count: null source: | a=1 print(a) outputs: [] . <document nb_kernelspec="{'name': 'python3', 'display_name': 'Python 3', 'language': ''}" source="<string>"> <container cell_index="0" cell_metadata="{}" classes="cell" exec_count="True" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block classes="code" xml:space="preserve"> a=1 print(a) . Code Cell (with lexer): . metadata: language_info: name: python pygments_lexer: ipython3 cells: - cell_type: code metadata: {} execution_count: null source: a=1 outputs: [] . <document nb_kernelspec="{'name': 'python3', 'display_name': 'Python 3', 'language': ''}" nb_language_info="{'name': 'python', 'pygments_lexer': 'ipython3'}" source="<string>"> <container cell_index="0" cell_metadata="{}" classes="cell" exec_count="True" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block classes="code ipython3" xml:space="preserve"> <inline classes="n"> a <inline classes="o"> = <inline classes="mi"> 1 . Code Cell (simple output): . cells: - cell_type: code metadata: {} execution_count: 1 source: | a=1 print(a) outputs: - name: stdout output_type: stream text: "1" . <document nb_kernelspec="{'name': 'python3', 'display_name': 'Python 3', 'language': ''}" source="<string>"> <container cell_index="0" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block classes="code" xml:space="preserve"> a=1 print(a) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="code myst-ansi output stream" xml:space="preserve"> 1 . Raw Cell . cells: - cell_type: raw metadata: {"format": "text/html"} source: | <div> <h1>A Title</h1> </div> . <document nb_kernelspec="{'name': 'python3', 'display_name': 'Python 3', 'language': ''}" source="<string>"> <raw classes="output text_html" format="html" xml:space="preserve"> <div> <h1>A Title</h1> </div> . Mixed Cells: . cells: - cell_type: markdown metadata: {} source: | # A Title - cell_type: code metadata: {} execution_count: null source: | a=1 print(a) outputs: [] - cell_type: markdown metadata: {} source: | b . <document ids="a-title" names="a\ title" nb_kernelspec="{'name': 'python3', 'display_name': 'Python 3', 'language': ''}" source="<string>" title="A Title"> <title> A Title <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="True" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block classes="code" xml:space="preserve"> a=1 print(a) <paragraph> b . Reference definitions defined in different cells: . cells: - cell_type: markdown metadata: {} source: | [a]: before - cell_type: markdown metadata: {} source: | [a] [b] - cell_type: markdown metadata: {} source: | [b]: after . <document nb_kernelspec="{'name': 'python3', 'display_name': 'Python 3', 'language': ''}" source="<string>"> <paragraph> <reference refuri="before"> a <reference refuri="after"> b . Footnote definitions defined in different cells: . cells: - cell_type: markdown metadata: {} source: | [^a]: before - cell_type: markdown metadata: {} source: | [^a] [^b] - cell_type: markdown metadata: {} source: | [^b]: after . <document nb_kernelspec="{'name': 'python3', 'display_name': 'Python 3', 'language': ''}" source="<string>"> <paragraph> <footnote_reference auto="1" ids="footnote-reference-1" refid="a"> 1 <footnote_reference auto="1" ids="footnote-reference-2" refid="b"> 2 <transition classes="footnotes"> <footnote auto="1" backrefs="footnote-reference-1" ids="a" names="a"> <label> 1 <paragraph> before <footnote auto="1" backrefs="footnote-reference-2" ids="b" names="b"> <label> 2 <paragraph> after . ����������������������������������������������������MyST-NB-1.1.2/tests/nb_fixtures/reporter_warnings.txt�����������������������������������������������0000664�0000000�0000000�00000002255�14674535606�0022675�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������Unknown Role: . cells: - cell_type: markdown metadata: {} source: | a - cell_type: markdown metadata: {} source: | {unknown}`a` . <string>:20002: (WARNING/2) Unknown interpreted text role "unknown". [myst.role_unknown] . Unknown directive: . cells: - cell_type: markdown metadata: {} source: | a ```{xyz} ``` . <string>:10003: (WARNING/2) Unknown directive type: 'xyz' [myst.directive_unknown] . Directive parsing error: . cells: - cell_type: markdown metadata: {} source: | ```{class} ``` . <string>:10002: (ERROR/3) Directive 'class': 1 argument(s) required, 0 supplied . Directive run error: . cells: - cell_type: markdown metadata: {} source: | ```{date} x ``` . <string>:10002: (ERROR/3) Invalid context: the "date" directive can only be used within a substitution definition. . Duplicate reference definition: . cells: - cell_type: markdown metadata: {} source: | [a]: b - cell_type: markdown metadata: {} source: | d [a]: c . <string>:20004: (WARNING/2) Duplicate reference definition: A [myst.duplicate_def] . ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14674535606�0016031�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/basic_failing.ipynb���������������������������������������������������0000664�0000000�0000000�00000001526�14674535606�0021652�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "source": [ "raise Exception('oopsie!')" ], "outputs": [] } ], "metadata": { "test_name": "notebook1", "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/basic_nometadata.md���������������������������������������������������0000664�0000000�0000000�00000000253�14674535606�0021631�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# a title this was created using `jupytext --to myst tests/notebooks/basic_unrun.ipynb` but with the jupytext metadata removed. ```{code-cell} ipython3 a=1 print(a) ``` �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/basic_relative.ipynb��������������������������������������������������0000664�0000000�0000000�00000001757�14674535606�0022062�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Test reading a relative file to make sure relative paths work\n", "from PIL import Image\n", "\n", "image = Image.open(\"./example.jpg\")" ] } ], "metadata": { "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.5" }, "test_name": "notebook1", "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 4 } �����������������MyST-NB-1.1.2/tests/notebooks/basic_run.ipynb�������������������������������������������������������0000664�0000000�0000000�00000001736�14674535606�0021050�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "source": [ "a=1\n", "print(a)" ], "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ] } ], "metadata": { "test_name": "notebook1", "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������MyST-NB-1.1.2/tests/notebooks/basic_stderr.ipynb����������������������������������������������������0000664�0000000�0000000�00000002277�14674535606�0021550�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "source": [ "import sys\n", "print('hallo', file=sys.stderr)" ], "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "hallo\n" ] } ] }, { "cell_type": "code", "execution_count": 1, "metadata": {"tags": ["remove-stderr"]}, "source": [ "import sys\n", "print('hallo', file=sys.stderr)" ], "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "hallo\n" ] } ] } ], "metadata": { "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/basic_unrun.ipynb�����������������������������������������������������0000664�0000000�0000000�00000001525�14674535606�0021407�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "source": [ "a=1\n", "print(a)" ], "outputs": [] } ], "metadata": { "test_name": "notebook1", "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/basic_unrun.md��������������������������������������������������������0000664�0000000�0000000�00000000366�14674535606�0020670�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- file_format: mystnb kernelspec: display_name: Python 3 language: python name: python3 author: Chris --- # a title this was created using `jupytext --to myst tests/notebooks/basic_unrun.ipynb` ```{code-cell} ipython3 a=1 print(a) ``` ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/complex_outputs.ipynb�������������������������������������������������0000664�0000000�0000000�00000321050�14674535606�0022347�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "init_cell": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import sympy as sym\n", "sym.init_printing(use_latex=True)\n", "import numpy as np\n", "from IPython.display import Image, Latex" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "# Markdown" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## General" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "Some markdown text.\n", "\n", "A list:\n", "\n", "- something\n", "- something else\n", "\n", "A numbered list\n", "\n", "1. something\n", "2. something else\n", "\n", "non-ascii characters TODO" ] }, { "cell_type": "markdown", "metadata": { "ipub": {} }, "source": [ "This is a long section of text, which we only want in a document (not a presentation)\n", "some text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true, "slideonly": true } }, "source": [ "This is an abbreviated section of the document text, which we only want in a presentation\n", "\n", "- summary of document text" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## References and Citations" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "References to \\cref{fig:example}, \\cref{tbl:example}, =@eqn:example_sympy and \\cref{code:example_mpl}.\n", "\n", "A latex citation.\\cite{zelenyak_molecular_2016}\n", "\n", "A html citation.<cite data-cite=\"kirkeminde_thermodynamic_2012\">(Kirkeminde, 2012)</cite> " ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## Todo notes" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "\\todo[inline]{an inline todo}\n", "\n", "Some text.\\todo{a todo in the margins}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Text Output" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ipub": { "text": { "format": { "backgroundcolor": "\\color{blue!10}" } } } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "This is some printed text,\n", "with a nicely formatted output.\n", "\n" ] } ], "source": [ "print(\"\"\"\n", "This is some printed text,\n", "with a nicely formatted output.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Images and Figures" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ipub": { "figure": { "caption": "A nice picture.", "label": "fig:example", "placement": "!bh" } } }, "outputs": [ { "data": { "image/jpeg": "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////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAADhCSU0EAAAAAAAAAgApOEJJTQQCAAAAAACGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNBDAAAAAAAEMBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADhCSU0ELQAAAAAABgABAAAANjhCSU0ECAAAAAAATAAAAAEAAAJAAAACQAAAAAwAAAAAAQAAQgAB//+cAAAAACJAAQAAH8AB///KQAD//84AAP///EAAAAAAAAAAAC5AAP//x4AB///9gAE4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAANjAAAABgAAAAAAAAAAAAAA/gAAAXIAAAAXADEAMgAuADEANQAtAGgAbwBtAGUAcABhAGcAZQAtAGMAdQByAGEAdABpAG8AbgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABcgAAAP4AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAP4AAAAAUmdodGxvbmcAAAFyAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNP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cAAgAEMAQwAgADIAMAAxADUAAAABADhCSU0EBgAAAAAABwAGAAAAAQEA/+Ea52h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdGVEYXRlPSIyMDE1LTEwLTA4VDEyOjM4OjExLTA0OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxNS0xMi0xN1QxMDo1OTo0NS0wNTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxNS0xMi0xN1QxMDo1OTo0NS0wNTowMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoTWFjaW50b3NoKSIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0iVkEyNzAzIFNlcmllcyBDYWxpYnJhdGVkIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmUyYmQwYjU5LTU2YjEtNDNiZi1iN2UyLTMyNzQzYjFhOTNjMCIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjk2MWFlZWE0LWU1NjUtMTE3OC04NGExLWVmNTVlNWVmOTVhZiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjY1MjRlZTYyLTQwNDAtNDQ4Ni05NzMwLWNjNDgyZDBiNmRjNCI+IDxwaG90b3Nob3A6VGV4dExheWVycz4gPHJkZjpCYWc+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0iUG9wdWxhciBJbGx1c3RyYXRpb24gQ2F0ZWdvcmllcyIgcGhvdG9zaG9wOkxheWVyVGV4dD0iUG9wdWxhciBJbGx1c3RyYXRpb24gQ2F0ZWdvcmllcyIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IlBvcHVsYXIgVmVjdG9yIENhdGVnb3JpZXMiIHBob3Rvc2hvcDpMYXllclRleHQ9IlBvcHVsYXIgVmVjdG9yIENhdGVnb3JpZXMiLz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSJQb3B1bGFyIFBob3RvIENhdGVnb3JpZXMiIHBob3Rvc2hvcDpMYXllclRleHQ9IlBvcHVsYXIgUGhvdG8gQ2F0ZWdvcmllcyIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IkJpZ3N0b2NrIFBpY2tzIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSJCaWdzdG9jayBQaWNrcyIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IldpbnRlciBDb2xsZWN0aW9uIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSJXaW50ZXIgQ29sbGVjdGlvbiIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IkJpZ3N0b2NrIFZpZGVvIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSJCaWdzdG9jayBWaWRlbyIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IkltYWdlcyBhbmQgVmlkZW8gZm9yIGV2ZXJ5b25lLiIgcGhvdG9zaG9wOkxheWVyVGV4dD0iSW1hZ2VzIGFuZCBWaWRlbyBmb3IgZXZlcnlvbmUuIi8+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0iT3ZlciAzMCBtaWxsaW9uIHN0b2NrIHBob3RvcywgdmlkZW9zLCBhbmQgdmVjdG9ycy4iIHBob3Rvc2hvcDpMYXllclRleHQ9Ik92ZXIgMzAgbWlsbGlvbiBzdG9jayBwaG90b3MsIHZpZGVvcywgYW5kIHZlY3RvcnMuIi8+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6VGV4dExheWVycz4gPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHJkZjpCYWc+IDxyZGY6bGk+MjMzOEI4RTQxMjc0MDA4QTkwQzhCRDI1NDc5NjBCQjM8L3JkZjpsaT4gPHJkZjpsaT4yREU0NDA2QzEwQjczNDIyQjRFRTZEOEIwRDMyNUZBODwvcmRmOmxpPiA8cmRmOmxpPjMxOTc2NTBFRTkzRjc5OEQ2QTJCQUYyMUFENjIyNzJCPC9yZGY6bGk+IDxyZGY6bGk+M0YyOTgxMzJFRjVERjdCRDFFN0U3OUM1MjVDMENBODY8L3JkZjpsaT4gPHJkZjpsaT41QUFBMDQ2RjFCRUQ1NTA3QjRGRTU4MkVEMTI1OTFBNDwvcmRmOmxpPiA8cmRmOmxpPjY1NjUzQUYxMEE1MUQ5MEZBMDdFQ0U2MzMyNjA4NEFBPC9yZGY6bGk+IDxyZGY6bGk+NzZFNDE3RTVFNDAxN0Q3ODU4MkI3OTFCOTYzQzlGM0I8L3JkZjpsaT4gPHJkZjpsaT44RjQwMDNDMUU1MzE4REU2MzVDODM0OTBENTE0ODMwQTwvcmRmOmxpPiA8cmRmOmxpPkExNDc0Q0I1QTEwRTM2RDQ2ODcwRjA0NDZFMDdEM0UwPC9yZGY6bGk+IDxyZGY6bGk+QTRENUQzQzczOTc4NTBERkZDQThDNjM2QTZEMkFBOUU8L3JkZjpsaT4gPHJkZjpsaT5BODE4NjdBREIyRDIwMzc2Q0FGMjNDNkM0NDU1QTYxRjwvcmRmOmxpPiA8cmRmOmxpPkMzMDkzMjZBRjJEMkUzQTE1QThBMjI0RUUwMjQ2NDQyPC9yZGY6bGk+IDxyZGY6bGk+QzRBQUJERDU3MUY5NkU5MjQ1QUYzMjU1REFDQkU5MDI8L3JkZjpsaT4gPHJkZjpsaT5DNTk3RkREMkRGMjlDRUUzQTA4OTA2REVGODIzNUZBMzwvcmRmOmxpPiA8cmRmOmxpPkQwRTQxMTkzRDBEODdBQkY2OUQzQTI3NDM1RkQ5Q0U2PC9yZGY6bGk+IDxyZGY6bGk+RDQ5M0IzODIwMDhERDAyMDA1ODk0Rjg0QUI4QUNEQTU8L3JkZjpsaT4gPHJkZjpsaT5EQjFBQzlEMjZCMUY0MEM5QTVBMTFCN0E2QURDM0ExMjwvcmRmOmxpPiA8cmRmOmxpPkU2NEU5NTJBQ0UyOTAwMkVCNjhGMUJDRDAxQjg5MTFCPC9yZGY6bGk+IDxyZGY6bGk+RTY4ODU2ODVDQkRGMjMyNEU3MTE1OEJGMjE3NkUxRkU8L3JkZjpsaT4gPHJkZjpsaT5GNUU3NTc3QTZCM0EzNDFBNTFDQUFBQzVFM0E1OUIxMTwvcmRmOmxpPiA8cmRmOmxpPkZEMUQ3RTMxQzc1MTJCRTBBODkxQ0RBQTVDNzdERTk1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2NDk0NmNiOC00MTFhLTRiMDAtOTk2MS1jODJkZmZjNTQ2NGM8L3JkZjpsaT4gPC9yZGY6QmFnPiA8L3Bob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NjUyNGVlNjItNDA0MC00NDg2LTk3MzAtY2M0ODJkMGI2ZGM0IiBzdEV2dDp3aGVuPSIyMDE1LTEwLTMwVDE0OjI2OjM1LTA0OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGltYWdlL3BuZyB0byBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBpbWFnZS9wbmcgdG8gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NjQ5NDZjYjgtNDExYS00YjAwLTk5NjEtYzgyZGZmYzU0NjRjIiBzdEV2dDp3aGVuPSIyMDE1LTEwLTMwVDE0OjI2OjM1LTA0OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NjM0NGY3MWMtNDhiZC00MGU4LWFhM2YtZjcyYTEwNmJjZTlhIiBzdEV2dDp3aGVuPSIyMDE1LTEyLTE3VDEwOjU5OjQ1LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1ldGVycz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplMmJkMGI1OS01NmIxLTQzYmYtYjdlMi0zMjc0M2IxYTkzYzAiIHN0RXZ0OndoZW49IjIwMTUtMTItMTdUMTA6NTk6NDUtMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MzQ0ZjcxYy00OGJkLTQwZTgtYWEzZi1mNzJhMTA2YmNlOWEiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpjYTc1NGM2MC1iZmMwLTExNzgtYjgwYy1lNWFjMmFiZWU0MjgiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2NTI0ZWU2Mi00MDQwLTQ0ODYtOTczMC1jYzQ4MmQwYjZkYzQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iKWhJQ0NfUFJPRklMRQABAQAAKVhhcHBsAhAAAG1udHJSR0IgWFlaIAffAAkACgAPABcAGGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAc2RzY20AAAHEAAAATGNwcnQAAAIQAAAAI3d0cHQAAAI0AAAAFHJYWVoAAAJIAAAAFGdYWVoAAAJcAAAAFGJYWVoAAAJwAAAAFHJUUkMAAAKEAAAIDGFhcmcAAAqQAAAAIHZjZ3QAAAqwAAAG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", "text/plain": [ "<IPython.core.display.Image object>" ] }, "execution_count": 3, "metadata": { "image/jpeg": { "height": 400 } }, "output_type": "execute_result" } ], "source": [ "Image('example.jpg',height=400)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Displaying a plot with its code" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "fig:example_mpl" } }, "source": [ "A matplotlib figure, with the caption set in the markdowncell above the figure." ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_mpl" } }, "source": [ "The plotting code for a matplotlib figure (\\cref{fig:example_mpl})." ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "a", "label": "code:example_mpl", "widefigure": false }, "figure": { "caption": "", "label": "fig:example_mpl", "widefigure": false } } }, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "image/png": { "width": 432, "height": 288 }, "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plt.scatter(np.random.rand(10), np.random.rand(10), \n", " label='data label')\n", "plt.ylabel(r'a y label with latex $\\alpha$')\n", "plt.legend();" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Tables (with pandas)" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_pd" } }, "source": [ "The plotting code for a pandas Dataframe table (\\cref{tbl:example})." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "", "label": "code:example_pd", "placement": "H", "widefigure": false }, "table": { "alternate": "gray!20", "caption": "An example of a table created with pandas dataframe.", "label": "tbl:example", "placement": "H" } } }, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>a</th>\n", " <th>b</th>\n", " <th>c</th>\n", " <th>d</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>$\\delta$</td>\n", " <td>l</td>\n", " <td>0.391</td>\n", " <td>0.607</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>x</td>\n", " <td>m</td>\n", " <td>0.132</td>\n", " <td>0.205</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>y</td>\n", " <td>n</td>\n", " <td>0.969</td>\n", " <td>0.726</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/latex": [ "\\begin{tabular}{lllrr}\n", "\\toprule\n", "{} & a & b & c & d \\\\\n", "\\midrule\n", "0 & \\$\\textbackslash delta\\$ & l & 0.391 & 0.607 \\\\\n", "1 & x & m & 0.132 & 0.205 \\\\\n", "2 & y & n & 0.969 & 0.726 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n" ], "text/plain": [ " a b c d\n", "0 $\\delta$ l 0.391 0.607\n", "1 x m 0.132 0.205\n", "2 y n 0.969 0.726" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = pd.DataFrame(np.random.rand(3,4),columns=['a','b','c','d'])\n", "df.a = [r'$\\delta$','x','y']\n", "df.b = ['l','m','n']\n", "df.set_index(['a','b'])\n", "df.round(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Equations (with ipython or sympy)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "ipub": { "equation": { "label": "eqn:example_ipy" } } }, "outputs": [ { "data": { "text/latex": [ "$$ a = b+c $$" ], "text/plain": [ "<IPython.core.display.Latex object>" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Latex('$$ a = b+c $$')" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_sym" } }, "source": [ "The plotting code for a sympy equation (=@eqn:example_sympy)." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "", "label": "code:example_sym", "placement": "H", "widefigure": false }, "equation": { "environment": "equation", "label": "eqn:example_sympy" } } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAa8AAAA/CAYAAABXekf2AAAACXBIWXMAAA7EAAAOxAGVKw4bAAAToklEQVR4Ae2d7bXdtBKGD1kUEHIruKED4FaQ0AFwKwA6gJV//MuCDsKtIEAHQAUBOoASQjrIfR8fzcbbxx+SJcuyz2gtb39Jo9E7Go1GkrXfefv27Y2H8gh88803L0T1T52/K0/dKY4hIKwf6/nPOj7U9ZuxOP7MEYhBwPU3BqWycVL190HZ7J0aCEgIX+j0kc5uuCpWCeH9l7Kj0/BjxWw9q5Mh4Pq7j0BT9deNV2E5SQAfiOS3Oj4tTNrJRSAg/LsOg87IwIMjkISA628SXMUjp+ivG6+C8Av4hyL3q46vdY0X4GEfBOg4fCEZfLJP9p7rERFw/W1GalH6+47PeZUTmCo/Q1YMF35Yjuo5KQkjPNTfY0un+O/ExiWe4mO4/qfj37r2+S9A8TCLgOqJ6+8sQv+8FFa76++7/7DjVzkIBGEy1+WGKw5IhvVYWPFHXPS0WKL7kw7y4PgyLbXHvm8IuP4mS3x3/fVhw2SZTSagl0+DuUljPJnrAV+EhuKmAlZfCx6GDx8fECZnuS4Crr+ReLeiv268IgU2F03CZIgKN5rG0sMyAs8UhZ5bF0wZ7J6znj3UkWV0lP4nkaIzwXCQB0dgFAHVE9ffUWQmHzahvz5sOCmfpBc0xL9ICZIWaSg+Bo9l3c19lyTeMBxmjD/S9Wvu9TzLswx0H+v8i+hZ+FX3LHYx2lwTJodgFf8rvX9f56UhweeK96PifaDD6EPbgyNgCLj+GhILZ+kQ7UIT+uvGa0FYS69pFBGmDmvoZ5MoPg0zQxQYA4xClneh9MVDqKDf6nxZ7q9rFPx3nT/W0Tc8qfmD0xArsOAASzoAeEzPlc/cQguMFvFmg2gwlAsd4i8Zulla/vJ8CKhuuP6mibUZ/XXjlSa4sdi40Dc0kmMvh89CQ9oZBV3jPaA8rQUM1ed9psQrXhcLUvAU3+u/i71Wegw3qzGHRuQPPbsYyhh6iv9+TLwQ5wed4X2YbwIJj3pSBFx/IwXbmv4+iOT7NNEkADwKJvG/4toKpmsa1qQQ0jBe/n1SwvYjPxWLf49ggseVMxcF3s93KH6344bKgwHzcGAEJEPX32X53Qv9nTVeqigvWlN48UPjyfDVGmPzp+T+Umm/18FODIzd4v0Q1jRsn90mPd2CAIzUX8KG4baxsAZ70jwVzSgPdSzTtc+UJ+WhLIfyvMR3c/q3VgaWTmVy/TUwtjvfC/2dHDZEcYTtI52b8irEzxsdDGkxyf+E+5g6oHiUh+Gp/qT9z3r2ZXjWfx5Dkjg2/LcmbWwe1eMJj6khvG6Ic4BhLH8Mz1w83WEi0aTzYEaRIUEa7itcdc974vE+ddPjbuhQNOiwJC2sUV7Vg3hsUv9ygVC5XH9zQVxIL4zvhf6Oel4qPA0EcxNTICzAt+1r8UWjhnKnbMCKl/RywBmN2GMdaxch4J7Tyzl9EOaTE9t694kOsJgLxJnqCGGUftD77zh0jZHDux7SfBbeI3eMYUqgo0IY0rx92tCvyti0/uVCpfK5/uaCmJhemJ9Of+8Yr1BIGo8nifhUjS4+u4ZQZxv2W8qfBvKqJ6/71zp4njwPo3ytERzSFLlTBgyGDbdeChjwZ/XknFeFjOhsjAbRoPPwxl7qmk4FnYJLGj2jk/EqxKFTleo9mZw+DjSaPKmcNDLN618ueCqn628uiGnpT6e/d4yX8KAhopG6NCZpGFWNzRwGE7g0bEuBxusST2kwWv8lEWUN99zGBvNKrUcfm+5w8YQNRoTv2K7mjHQPnjRCHHxH1Q0r6noYGJrFo0oJnVcc8iDda13bfBmeycsUYkoLPeq0dTpSkteMeyT9y8XF9TcXwYj0qvun1N93+2VXIe1L86Jel+jSqGEoYr2kG6VZ3IhVcVhUQMOJcJZ61BgblnvT4OJxMffBPRPI8EXjZo2jLhcD32gRfrs9nfNX2GAobnS+MlzhWef96N1z3YPhMx1m1IlCOtIjn9Gg9xh/5lanPkimkwGdrjOlM3WU0PXcby+jf5HVU9FA5h296JQVIoayoStF9S+XdfHl+psL4k7pJbvT6u+V8RK+DFcw71BasaGLoRh+nFpCpNBm8n52Il7vaWjHGuA7zyKZQqHnVuRFkmk3mjDDUFztYgHOcBzw7JjXNZ4rxuQLnYdyQOZThon0dALoTAzDIx6Ing332XsMpH14bM9izxhKPC+OlI5KLP3ceFvpXwm+XH9zUaycXrpzav19YHiqoDTGNEz0oouFQPdG52EjVCQP0cUoMT+y1ggl86E8uwZcCTvPI5nAARKojNSH/+g87HCgEGPGhoaXcImvtMRdMjQMUbN6cBgwMFeLYRQPLwy+XhJZ95YntzHB5LXkpcfQKhpHZdlE/3KZDHyBtetvLpgV0we5nVp/L8ZLuNKjZV6jtNcF3dRGJlXMTEZ27nFqwpXxaWgI1hje3p3kV3UA4wymDK+xZN0OnjF/daeO6Jl1IvC+MDIEZL/UGepod7HDj9Lb8PLVEKRe46Xd6D0GER75bi8lmLys85GSduu4W+lfLt+uv7kIVk4fdOP0+tsfNqSXXNR7CSAyjDTsQd/ZJFVxaPCY+7AGJkXk0KehZTl2jeEga/xSG8+uTOKxq1i66RpjnVkWTs/2lc6pCxs6moV/4I8yjnUI5nrgdFLwmDBgyPE3ne8YOj2/BOLpYNHNi/Dwkc54dnf+RFJx6FxxYNxsqDIkizpZ3TL5RSWqFKm4/uXyLZzByfV3AKRwcf0NmAiL3fS3M15iwDyJKyMzkNmaW4aQLsNIPQJJu4iLPxqrq7mXHq2bACANE8NBNYyXDXNZY9hnZ/Fa/A49isU0NSOIv7k5qklWlA7DgnGjtw42UeVUGuJGdZwUd/WQn9Ji8JRVZ5g5NxHE01b6l1s+198RBCWvqHo9krTKI/F3L/T3QUDThmNWNcZjEhGAeFJ86DxmEOlZkxdKSzwMztzfgtCwzfbg9Z58zJPR5abBeu7F8NqU27rEGSZEpvTIWsSnq0ehftZFZjq34vo3nVXcG9ffOJxOGOsw+mvDhvRm54aD1siIISSAGAtJu4hLkczTGaNlzxjCGxvmsvclzwxtEZYM6m2se/QrWTEfhdEa87hbQMI6TcgwS34qJ0OkDKutWbbfx2IL/evTX3Pt+rsGtYw0BevTai7Ew2H01zwvlLBYL1kA0PN+ChCrUUxP2PGvPG0IJp1CfArzvPAgPQwQkAwY4i1Wnwbkc29NZibDHHrUc47cUFT/cpmR7Fx/c0Fcl75UfVqXe0h1FP014wVoJRubGiuUhgIy/ks0SkPaw/uuwZKQ3wxf+H3zCJjMOhk2wi28WP1tgSXX3xak4DyMIXDRXxs2JFLUyjk12KyKYuJ7bC7LMmPV3+xQn94zxGcNCHFZMn0ZutQ174jDu5gdxE35bUhPyTw4AodBIEr/cksjvXL9zQXR0zeBwANVZvNUbDhlkjHFZdUfe69NfrcV4tiy5ylaGKalXcSfiRbLxlmWSk9wNijuxSLPRvSX9x0Bq+dNdHJUb6P1L1dwQTddf3OB9PR7InDRX4YNzfuZZSgoGRPTHFmbsIrW7C7iIa9XgSGWpZpXFR7Nnv41+zbzpXiLwiszG09+fxCoUp9cf28rlOvveRSLYUPrgZrnMlo6Cb0zIDqzghAPDG/o6nsHvWOYb8nrUpTRAH0WedATHe4gnrJyrUpjIB5n8RotYaGHwogy/qojpayfKt1lWLYQK0ckY3KLxk64UadZVDEMne7o/ZfDF7qPXVEbq39ZMhePrr/XQrJ6cP20wt3G9alCCXbNwuT2EONlbliUMgt429mAXRRYJtz3ijAysx/IKf7iLuJGU2fG5wm5S5Fvqez8q/K8jWVBcSd31dc7BDiLc2w+w3gpPA7T7nk/h1cuX6I9Zpxu9Jz6iQ7k7IoSpX/Ko4jMoaMDfXL9TawYwq2U/m5Wn1J4TCz+ptHF92R7N5Vxf8HGVJyx58x54WVhrDpBKHMUmW8EzDLqdjR8pKemsP0I1ovtewd4dzE0b5SvGd8qE999xmOvxWOygGJpl4p3BB5LlfUe03H9XSH8I+jGEXhcAf1oEua8zNjY8MVoxP5DAYS3xWpDem9mNDA0z/vxJq6jdhEPdD8QjZfQ0f3kIpGQj/Fv5QmPy57Eh9G3cpfNwKltjYDJzeS4dX5L9I0Pq79L8bPfqw67/qYNuWdj7gSKIXDRX4yXeUH2MDYXMyYYMLyu33oN+xyN2F3E8dBuRBPPi3mwJY/K+LfyzPHg7xyBVhCw+mr1txZfrr+1kPZ8NkGApfJvRJlj9rusYe5Kh+fFEB8eF4cpgy6ng9LR6+t2Edc1hoyl8OR9tYt4oG87iLOQY2ney3qulMWDIzCFgNUTMxpT8ao8V71epX+5zAX9cv3NBdLT10bgor8254VBwbtJDQwTYnySNmGV4pDf6KRlnwHFS9lB3Pj/rU9jo2sanIcb0T4NWcmv9F/flMCmRbmt1b9cPFx/cxE8cfrW9deMFw3+Z6lyUOEY0kPxUpayp2YTG5/VdxhRDMvWgV77Q+XFkZyf0mBoDTNbwMLfrNMTPlNI+uubygWn3uYGZJ8s/5FMV+nfCJ2kR6pvrr9t6W+p+pRUD2YiN62/Zrx+VwG6xRepjbHiJw03zgCV++qpCNRq/K2njAub1HgJLwwXw6aXb+R0zZArf0jJx9tz224p2qECRp7jAx1gxkbNz1XGJMyUpmQwDz2bh4KyWq1/ucCoDK6/CSAKr830t2B9SijRbNSm9deM1w8qwgsdGAAamEMFCf2hGO4qVSXGrddOnnYdmzWG6vN+ZPGP18WnBwzBvtd/d/Dr2A91axazGzMX3qly25LHQ+tfLjCuv7kIbpa+af19QLFVeeiF0uNPmWMiaSsBo0uo5bVYrx3jlRrg9e+gsP208M4w5BqafTp+PY8AHR2T33zMSm9PoH+5SLn+5iJ4f9Jf9LczXqHc9PqT570awaz7Mz81ArV607Zsf82QC0Zqbm4O4XjYAIFex4DhkNbCkfUvF0vX31wE70H6of6+2ytzN3ShCCxLr+XB9LLPusToXg3FZVFbTmxGMtlLEraXua5BNswL3ej9H4Pnh75VeRgONYOMsb/665vKhTN5tYjxkfUvV4yuv7kIbpS+Zf29eF5ikqGU73REfa+1EVbJZMX3VyTSueZcHavDCNYY3t6t/BXvGC5o2QrElZSaS4bRWvrrm5pMm7xe1cw0Ji/VgUPqX0zZ5uKo3K6/cwDt+65p/b0YLzBSRaLxZKPRzgvYF7fo3PlAuqbXBU40NHhfpXBiyIhts+g8nCaoPLN/fbNDQW0z4yZHFoTXEfUvV4yuv7kIbpS+df29Ml4BAxSIP6xrPghcem3MH9X0ugyXrgFU3tabt+dJZ6VnlSc7iSx+tJ1EuN3IGH06SFm4rSyebTnW4rChFekw+mcMrz2rDrj+rgVvv3TN6O8d46UK1W3DFCrWfhAt5BwaP3ptU3NICxSyX/NtDsFWSt3eJfyqDMwH3eh8OsOlMv2swzAaQ4UhidoBT9nmK2vnHZWfMDuE/kUVZiaSyknnxfV3BqM9Xx1Bf+8YrwDYE52/DBVsTwxH8xZfNHz8L9jnut6rMbKhJxuKGuV16qH4ZjPj93W+GC5d7+WRTLGZ8xwvZ8xAPYKoylrV+1F+NsS7h5eeimPT+pdamGF8ycL1dwhKe/fN6++o8VLleiMsWb76Y6horUHLHBG7VOzWEClvjCY4JXteSktD+h+dGSLqBwza6/6DA19H/fVNxfKZnF5WzHNVVqoXrevfqnL1Ern+9sBo9LJ5/R01XoApBaJxZkgO976ZIL7otWG4lnaZr8EzPOAtwVNUUFzwRHn5ILn7e5hw5hneLg3XGULsX9/UKiudsTfCt6rHt7Zw4rNJ/VtbHkuncrn+Ghhtn5vX3/53XnegDAp05/meD8QTjbsN2e3JCnmz2IJJZ+auYlcKYqQwYN18l879cIiGtc/w1DV1R0f31zchDsOFeJVXf30zlb7kc/FBg4nntZunvqY8YLgmXctpVCbX35YFFHij7uloWn/fefv27QGgbJdFCbhblKDzqrmvdkt2Hs4kGzoKdDQ+1PVpOgjnkdB+JXH93Q/72Jyn9Hdy2DCWsMfrGkX+t6qp4VWXyxUCLIqhJ+mG6woWvxECdGpcf9uuCqP668YrX2hs60O4rBq8vfXfFhAInQoWyBxq55gWsLsnPLj+NizoOf1145UpOIHLGD4LN8bmsDKpe/ICCHSdCsmphQU+BYrjJEoi4PpbEs1NaE3qrxuvMniz5J3Vg90+bWVIOpVcBCQPFmogk+EnCbmkPf25EHD9bVCeS/rrxquA0ELvDQVgxwAP7SDAUCFzXbErQdvh3DmphoDrbzWoUzOa1V83XqlwTsQPDeRrnd37msCo5mPJ4bHyYyjX5yJrAn/QvFx/2xJcjP668SorMxpKvo2g4fSwLwL02n6SLFr5JnBfNDz3GARcf2NQqhNnUX/deBUURGgoGaLiQ2QPOyEgOeBx8VFy1b/K2am4nm0hBFx/CwGZSSZWf/0j5Uygx5ILfDYNZld1n2sZA2jDZ8Icr5cPx5/o2r/r2hDrs5J2/d1Psin6657XNnJiT0j2KbSdzLfJxamOIYDX+7UbrjFo/FkkAq6/kUBtEC1af914bYC+Gk6+/WIjWPbz81AJAeHO0ngMl3/TVQnzM2bj+ruPVFP19/8PVQ3F1sRV/AAAAABJRU5ErkJggg==", "text/latex": [ "$\\displaystyle \\left(\\sqrt{5} i\\right)^{\\alpha} \\left(\\frac{1}{2} - \\frac{2 \\sqrt{5} i}{5}\\right) + \\left(- \\sqrt{5} i\\right)^{\\alpha} \\left(\\frac{1}{2} + \\frac{2 \\sqrt{5} i}{5}\\right)$" ], "text/plain": [ " \\alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž \\alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž\n", "(โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ - โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ + (-โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ + โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ\n", " โŽ2 5 โŽ  โŽ2 5 โŽ " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = sym.Function('y')\n", "n = sym.symbols(r'\\alpha')\n", "f = y(n)-2*y(n-1/sym.pi)-5*y(n-2)\n", "sym.rsolve(f,y(n),[1,4])" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "**_some_ markdown**" ], "text/plain": [ "<IPython.core.display.Markdown object>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import display, Markdown\n", "display(Markdown('**_some_ markdown**'))" ] } ], "metadata": { "celltoolbar": "Edit Metadata", "hide_input": false, "ipub": { "bibliography": "example.bib", "biboptions": [ "super", "sort" ], "bibstyle": "unsrtnat", "language": "portuges", "listcode": true, "listfigures": true, "listtables": true, "pandoc": { "at_notation": true, "use_numref": true }, "sphinx": { "bib_title": "My Bibliography" }, "titlepage": { "author": "Authors Name", "email": "authors@email.com", "institution": [ "Institution1", "Institution2" ], "logo": "logo_example.png", "subtitle": "Sub-Title", "supervisors": [ "First Supervisor", "Second Supervisor" ], "tagline": "A tagline for the report.", "title": "Main-Title" }, "toc": { "depth": 2 } }, "jupytext": { "metadata_filter": { "notebook": "ipub" } }, "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.7.7" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "example.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": true }, "nav_menu": {}, "toc": { "colors": { "hover_highlight": "#DAA520", "navigate_num": "#000000", "navigate_text": "#333333", "running_highlight": "#FF0000", "selected_highlight": "#FFD700", "sidebar_border": "#EEEEEE", "wrapper_background": "#FFFFFF" }, "moveMenuLeft": true, "nav_menu": { "height": "161px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": false, "toc_section_display": "block", "toc_window_display": true, "widenNotebook": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/complex_outputs_unrun.ipynb�������������������������������������������0000664�0000000�0000000�00000022225�14674535606�0023600�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "init_cell": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import sympy as sym\n", "sym.init_printing(use_latex=True)\n", "import numpy as np\n", "from IPython.display import Image, Latex" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "# Markdown" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## General" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "Some markdown text.\n", "\n", "A list:\n", "\n", "- something\n", "- something else\n", "\n", "A numbered list\n", "\n", "1. something\n", "2. something else\n", "\n", "non-ascii characters TODO" ] }, { "cell_type": "markdown", "metadata": { "ipub": {} }, "source": [ "This is a long section of text, which we only want in a document (not a presentation)\n", "some text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true, "slideonly": true } }, "source": [ "This is an abbreviated section of the document text, which we only want in a presentation\n", "\n", "- summary of document text" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## References and Citations" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "References to \\cref{fig:example}, \\cref{tbl:example}, =@eqn:example_sympy and \\cref{code:example_mpl}.\n", "\n", "A latex citation.\\cite{zelenyak_molecular_2016}\n", "\n", "A html citation.<cite data-cite=\"kirkeminde_thermodynamic_2012\">(Kirkeminde, 2012)</cite> " ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## Todo notes" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "\\todo[inline]{an inline todo}\n", "\n", "Some text.\\todo{a todo in the margins}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Text Output" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ipub": { "text": { "format": { "backgroundcolor": "\\color{blue!10}" } } } }, "outputs": [], "source": [ "print(\"\"\"\n", "This is some printed text,\n", "with a nicely formatted output.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Images and Figures" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Displaying a plot with its code" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "fig:example_mpl" } }, "source": [ "A matplotlib figure, with the caption set in the markdowncell above the figure." ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_mpl" } }, "source": [ "The plotting code for a matplotlib figure (\\cref{fig:example_mpl})." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Tables (with pandas)" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_pd" } }, "source": [ "The plotting code for a pandas Dataframe table (\\cref{tbl:example})." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "", "label": "code:example_pd", "placement": "H", "widefigure": false }, "table": { "alternate": "gray!20", "caption": "An example of a table created with pandas dataframe.", "label": "tbl:example", "placement": "H" } } }, "outputs": [], "source": [ "np.random.seed(0) \n", "df = pd.DataFrame(np.random.rand(3,4),columns=['a','b','c','d'])\n", "df.a = [r'$\\delta$','x','y']\n", "df.b = ['l','m','n']\n", "df.set_index(['a','b'])\n", "df.round(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Equations (with ipython or sympy)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ipub": { "equation": { "label": "eqn:example_ipy" } } }, "outputs": [], "source": [ "Latex('$$ a = b+c $$')" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_sym" } }, "source": [ "The plotting code for a sympy equation (=@eqn:example_sympy)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "", "label": "code:example_sym", "placement": "H", "widefigure": false }, "equation": { "environment": "equation", "label": "eqn:example_sympy" } } }, "outputs": [], "source": [ "y = sym.Function('y')\n", "n = sym.symbols(r'\\alpha')\n", "f = y(n)-2*y(n-1/sym.pi)-5*y(n-2)\n", "sym.rsolve(f,y(n),[1,4])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Interactive outputs\n", "\n", "## ipywidgets" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import ipywidgets as widgets\n", "widgets.Layout(model_id=\"1337h4x0R\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from IPython.display import display, Markdown\n", "display(Markdown('**_some_ markdown**'))" ] } ], "metadata": { "celltoolbar": "Edit Metadata", "hide_input": false, "ipub": { "bibliography": "example.bib", "biboptions": [ "super", "sort" ], "bibstyle": "unsrtnat", "language": "portuges", "listcode": true, "listfigures": true, "listtables": true, "pandoc": { "at_notation": true, "use_numref": true }, "sphinx": { "bib_title": "My Bibliography" }, "titlepage": { "author": "Authors Name", "email": "authors@email.com", "institution": [ "Institution1", "Institution2" ], "logo": "logo_example.png", "subtitle": "Sub-Title", "supervisors": [ "First Supervisor", "Second Supervisor" ], "tagline": "A tagline for the report.", "title": "Main-Title" }, "toc": { "depth": 2 } }, "jupytext": { "notebook_metadata_filter": "ipub" }, "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.7.3" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "example.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": true }, "nav_menu": {}, "toc": { "colors": { "hover_highlight": "#DAA520", "navigate_num": "#000000", "navigate_text": "#333333", "running_highlight": "#FF0000", "selected_highlight": "#FFD700", "sidebar_border": "#EEEEEE", "wrapper_background": "#FFFFFF" }, "moveMenuLeft": true, "nav_menu": { "height": "161px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": false, "toc_section_display": "block", "toc_window_display": true, "widenNotebook": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false } }, "nbformat": 4, "nbformat_minor": 4 } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/custom-formats.Rmd����������������������������������������������������0000664�0000000�0000000�00000000617�14674535606�0021464�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- title: "Test chunk options in Rmd/Jupyter conversion" author: "Marc Wouts" date: "June 16, 2018" jupyter: kernelspec: display_name: Python language: python name: python3 --- # Custom Formats ```{python echo=TRUE} import pandas as pd x = pd.Series({'A':1, 'B':3, 'C':2}) ``` ```{python bar_plot, echo=FALSE, fig.height=5, fig.width=8} x.plot(kind='bar', title='Sample plot') ``` �����������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/example.jpg�����������������������������������������������������������0000664�0000000�0000000�00000160761�14674535606�0020201�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������ุแzExif��MM�*������������������b�������j(�������1����$���r2�������–‡i�������ฌ���ุ� €��'� €��'Adobe Photoshop CC 2015 (Macintosh)�2015:12:17 10:59:45���� ������ ������r ���������������������������&������.(�������������6������<�������H������H���ุํ� Adobe_CM�๎�Adobe�d€����„�            ภ��n� "��� ฤ?���������� ��������� � 3�!1AQa"q2‘กฑB#$Rมb34r‚ัC%’S๐แ๑cs5ขฒƒ&D“TdEยฃt6าUโe๒ณ„รำuใ๓F'”ค…ด•ฤิไ๔ฅตลีๅ๕Vfv†–ฆถฦึๆ๖7GWgw‡—งทวื็๗�5�!1AQaq"2‘กฑB#มRั๐3$bแr‚’CScs4๑%ขฒƒ&5ยาD“TฃdEU6teโ๒ณ„รำuใ๓F”ค…ด•ฤิไ๔ฅตลีๅ๕Vfv†–ฆถฦึๆ๖'7GWgw‡—งทวฺ� ��?�๋BIBpชถO $…'H'„’ด$ฅ $ฅก:p 0“ cgcชซ€ึไZำต๗jk‡าe{ค=ฟ๎๔ใRL!)šˆทa%ฯWŸิํี๙L `๛˜ปNv[@๏Twไ๎Cˆ2KวP]DะฃMฬน›› คำศ*i14,RR„ะŠ–L$”ฒe$ษ)ะ๋“ฆ ีVย้$%( œฌlJลนVฒ†8รKฬn#๓kh๗ู† ๕>ฃWMย~U๙ัLวฉkพ…s๛ž฿R็�กbๆjmูWœฌว›ฒ,ะุt�vฎถjoๆTฤ™qa3ิšˆ|žƒ๖๏O'ู๊ผ~๐ฎๆ?Šณ‰’เสlรลnฏ?ีkพŸmbใUK๋k๋x{_ซ^ุ- ๗oาDป ถVAแซOซKOๆน7‹U็=#ล7ึŽกf& 1จqe๙ลฬ9m-ด9ฟบ๛wฒ†ืWzืM้๗7๛ฅฐXูmc๙zzนิ3๒๚ํuง๔๘ตŒag;œcะๆคจฯQฟฟZกGีผWR๚l.uฎ๗ฯำฮ๏ลM ๕ ‚1ภF<Z™Hํแงก๕z^ฑs[Xn๓a#nุฟwัูท๓”:oึN‡ิ3~รq}฿เๆฒรซ‹){ฝฮณh๖W๊�๕ฦ๚ฝ‡“า*้yต๘์ ม\ํงswB~ซ๕_*จม มฟ ‡เภfทƒ๊{ญ–1ึ{์�S๔ช01๋d๏ก่?ฌณ$คM _ขํำ ฝ›>X~ํอ�คีmeŸF]^ณ ึดI0>‹ปํQZศฒM56ฆบlvฟๆ3ŠlNŒrล9@าทu’Yด๕ รซร,ท๑bปFK/c๔ซw ~๓O็ฑ % Gม"e"™ซ&N™%?ั๋‚’„ฉUฐบp”)04ธhู๗๙ษ!ไพฒe›๚qZfผ รcเ.ธ�[า๛=K/๋Oู๚-ยN๋@ฉ (๛ฟ๐6ฝ66Kณ2/ฯณC•k๎?ธบถ�e›^_ี๎ง๚ญ๗ัhืiู๎ที๔๗�a< 4H]7ˆฤ!b$ฤโ๊tj~ษาqฃช†ธ�›๋;ฉ๊…ืไt&ไ_cญฒ๛ฎy/$ฤปฺฦฯๆ-กC/ฅีฤตํ-;uรn…ช?งc๔ผ 0qร…็™q$›็ป๎๕1•า �าถ"u�ฑ_โ๐ผv]_Fsjvห,ตํk†‘�1\y[ฯGึบ‡๐n๗์๚ปฺๆ�Uuธ-๕kžwZ๗}๎rื=7&ฑ^ELตฃณฺฏ’–9„.2dๆq๑DŒd4ัไ1ธu๊€ส^�แ๕4ฯฮงVŠ฿ญ฿Z3/ธbง\ใตR7Yฮตึถถท๓์ะ]/ุ่รŽsแ๎๛M฿ตส�ูq0q๖cTส+h>ฺฺ4ฏาฺ'6.˜ล๘Mxใ๋3๔ๆณzงูฉสฯศeฌ-ฅl†นอNษ๚5๚พญŸ๑h}๋UA˜}CTrF๚ูฤตฎk๗{]ตfuG‘ำฑฏ-ฦ,{O}B฿ษS}[n_Tุ๋๙7๕แปิ{ภญ€๏J–ว๏ุ๏๋ง q๖ไH๏ฏj๙YsฮC(€'๔} ~้wญห๋]Gญไ๔—”๐kk฿nภ๗X๗mฺอฎŸั๎wฌZW๚ฎ^oฺ1ณชn?V้ฏ ผ3F8;wงc[๙ป๖น–ณ่7eฮlฏ๋Gี๎ฃ๋ี:f๗ท%™”U"ศhoฝญauvlgฉS=๊ฯิŽ—ŠฬฌฬสŸIษmuิdXๆฐนฮs˜�}u็ฉ๏ณ๚‰’8ฌดk๗๘�I‹ˆ๑Uฟแ่๖mp{Z๖๐แ#ๆ’#งงภผ}ฮr*‰Œ่H์ฒd้‘Sา๋ก8 $ชณฒ —]ษ8ฝ>๐aโ‡1‡๙vฦ3?้\ฎ…๕โ�OฃSD๋••[H๑mM~Cฟ๐FาŒEบ"ๅโ๓-›j h๚"ๅณฑ~ฯ™~3ฎ%ฃฑkฝ์#๙;Wgาšาั๘+นฝฉVั’ยม์ฑ‡k<฿ป‡ฉ!˜Bf๖-ฎfqb6|ฝญac!#ถGษvฟS0mล้YŽk˜วะวk`;-๔Kc฿้ป๓้Fม๚™ัจฐYc’Fกท;s4ใ}- e›–ถ๓If%†uุL’ฯฬ ว†7ฎไฐbฤc!dš<็Dุด“I๙ญึ๛@๐ ขZ>อD~ใ"{ดC ๘U็๓]dฑภฬ u7ฦฝฅ&<�7K|œ!T๋y!ธvkห{!ภ[๚ว›‰ำห๐™Ukši+ฆcใัHe k+@d?๔VG%ดRx–5ฌ~ฅา2,ศ้ีœผษฒ์=ลฏcฯนึbฝา฿w๚%4…’.ปฑ]—`kqำwฏฅรgร…Q[ฮฑgHฎ_}4ข็ˆฺฯs*+ฝVุฑGื!h๛7OภศPถบ๎hkใ }›Isุื&ฟ๘K+Z]กษฦต๗v~S™w๒\โw๚mw๚=วji‡<ZัตซืGk๙ˆ๐{ฟ,�d 3์ฐx:~๑�˜ฃ 6 r๙Šล2r’(ำ๋าI:ชุ\.Ka_ฑ"ข`=ู/๙ตธ์o[—Z2*ณ'/งSWำช‹mวำฑฌ�ั ๘พq~?’…ุ1Fฌบcšื Guขฑำฑ๒ฑ๐๎ฝญษษ U^ฆI;Yนอต๏wถฟQpธcจ`U๕หƒNอย it{^ลป๕;.:žFHษ๊n.qจ–นีด๛=GU๔ท~o๚:*90ืคt้รีฒsฦdฟ้q~ˆ�พ{ธH<!u  ฌ:†ึใ๘fRะะˆ๘Bฃ๕†ท~ษหุใฅ/๐๐๑Uภิyช5ฤ<>‹„แP‘ฃค๖]Xภ0FึŸ ‰Y2K๒@ ตxฮD“lนdnป2mV —|–7ึc๖cฑำก5[ใ^Vo[ช<y jAf2xรา๊ดy4~ ฃฃVถt๐ฎsฃธJว„Rทฑ์๖†ƒจ‚vO˜๙ฒฯX'RทkฬฮŸ!ูล็pอ้y๏วฟงHq๔^l-uแ+%ซ๛Š๖?ื๎†๚œ๛‘Ž๖7vว0?qสํฉฮgฝ่#์ไ Dlฆคฅ"๕?๔žŸอ๕ญฎ}X๘๒—ฒU•อSษ๊G33ฌeำ๖j2ฉฎฌ O"–=ึบืqฟิ}Ÿฮ�…�๚Mt‰W˜คl฿u’N™%?ิ๋ำ„ม:ชฮศ.7๋COฌกŸ่1hgอๆ�๔kWbู:NpYู+๋Qศnฌ9ฆVV�็”่๕๒fภ.G7๋&3…]ฌ*tูไ?ูr'ีŸซ๘Jช๓}|Šoกๅถ \C‡ะuVํ๕+รนoU‰VE.ฎภ]-sOptrตะบF?Iร8ิ?sฝK๓๎.:WkX‰อXฬA"W๘/ษŒ{œZ6?ผ๋ฐžช}vbๆว๚EqคBงืไl฿๘‡�ิ•^;4Gๆaอ้ฟอ3ศZ`๗ํยส้ฎ“'ภ-FQ;–lŸ1l4๖Y`N3วŒEwิ�ฤ๒จuƒธ?‘(๎C็5าEžƒ uœ#ฟาw‚ Z<@.3�Ed๔_s�๊œบ*=ฑุr!I”๚›1—คy๚ัิ_Cjยe&์œญXืณ{@ฯัิๆน๖_ป่,Z:^GO๊9น๕†6ห(บฦZ[ฃnอ–U๎๗{}์^…๖zฬ‡ึรmsุ้Z ?Oำฐ๛™ป๙+#๋ี›:พN6N3UฬsYsNตo–7่๚•8ฝ฿๐ชLYข�๔ƒ|Rje‰‘โซ†?›ำา2F๓$‡4b๏ชาช_๚v?‰ฐicทฌ• vY=ŠL’dๅฏี๋‚p˜'UYึฟ%ธxืf;่โิ๛mฎฐาj๓ސรฐoี็W3ซ�้.๋Aด}\๊“w[EžUื๖‹?ณVๅวtธ฿๓ืม>?,›<ถไฝFึฦƒม^ฉโ}ฝ•ฉv'U\ฏžํ†:UNทฏGฮ�ˆณคฃิ]Oศช๕ฒ�ู9ฐ4๔,�ฉ(วqๆฐP๓sบ{@ฉšžZ็ƒฦบฌฮžl5ณHะDู๋^wญ"#ฬ?&๔eนgศ5ตQ?ลQ๋DŠ<A๓EงํAฤงY?ช๕ƒ`ฦt‰1ฏ�2J?0[S‡ :):๐๗๚RบZ\น~‡ปcฃ#�*้ฑghž๓|วอ'ไnถ?น‚u๎ชึNใฆŠหIž<9Q0ษš4;๗K]๗U็ OลQถ=7nะAŸน]ดnัะ$yฦฉั๊ล>‹สE2zวูํฺPhotoshop 3.0�8BIM�����?Z�%GZ�%GZ�%GZ�%GZ�%GZ�%GZ�%G�����8BIM%�����iูเ๕๊ฎ๑ฉs $(X8BIM:�����ๅ����������� printOutput�������PstSbool����Inteenum����Inte����Clrm���printSixteenBitbool���� printerNameTEXT��������printProofSetupObjc��� �P�r�o�o�f� �S�e�t�u�p����� proofSetup�������Bltnenum��� builtinProof��� proofCMYK�8BIM;����-�����������printOutputOptions�������Cptnbool�����Clbrbool�����RgsMbool�����CrnCbool�����CntCbool�����Lblsbool�����Ngtvbool�����EmlDbool�����Intrbool�����BckgObjc���������RGBC�������Rd doub@oเ���������Grn doub@oเ���������Bl doub@oเ���������BrdTUntF#Rlt������������Bld UntF#Rlt������������RsltUntF#Pxl@R��������� vectorDatabool����PgPsenum����PgPs����PgPC����LeftUntF#Rlt������������Top UntF#Rlt������������Scl UntF#Prc@Y���������cropWhenPrintingbool����cropRectBottomlong������� cropRectLeftlong������� cropRectRightlong������� cropRectToplong�����8BIMํ������H�����H����8BIM&���������������?€��8BIM ��������8BIM��������8BIM๓����� ���������8BIM'����� ��������8BIM๕�����H�/ff��lff�������/ff��ก™š�������2����Z���������5����-��������8BIM๘�����p��่����่����่����่��8BIM�������)8BIM�����†��������������������������������������������������������������������������������������������������������������������������������������8BIM0�����C�8BIM-���������68BIM�����L�����@��@��� ������B�œ����"@��ภส@�ฮ��@��������.@�ว€€8BIM���������8BIM����c����������������r����1�2�.�1�5�-�h�o�m�e�p�a�g�e�-�c�u�r�a�t�i�o�n��������������������������������r�����������������������������������������������null������boundsObjc���������Rct1�������Top long��������Leftlong��������Btomlong�������Rghtlong��r���slicesVlLs���Objc��������slice������sliceIDlong�������groupIDlong�������originenum��� ESliceOrigin��� autoGenerated����Typeenum��� ESliceType����Img ���boundsObjc���������Rct1�������Top long��������Leftlong��������Btomlong�������Rghtlong��r���urlTEXT���������nullTEXT���������MsgeTEXT��������altTagTEXT��������cellTextIsHTMLbool���cellTextTEXT�������� horzAlignenum���ESliceHorzAlign���default��� vertAlignenum���ESliceVertAlign���default��� bgColorTypeenum���ESliceBGColorType����None��� topOutsetlong������� leftOutsetlong������� bottomOutsetlong������� rightOutsetlong�����8BIM(����� ���?๐������8BIM��������ื8BIM ����X������ ���n��เ��ฮ@��<��ุํ� Adobe_CM�๎�Adobe�d€����„�            ภ��n� "��� ฤ?���������� ��������� � 3�!1AQa"q2‘กฑB#$Rมb34r‚ัC%’S๐แ๑cs5ขฒƒ&D“TdEยฃt6าUโe๒ณ„รำuใ๓F'”ค…ด•ฤิไ๔ฅตลีๅ๕Vfv†–ฆถฦึๆ๖7GWgw‡—งทวื็๗�5�!1AQaq"2‘กฑB#มRั๐3$bแr‚’CScs4๑%ขฒƒ&5ยาD“TฃdEU6teโ๒ณ„รำuใ๓F”ค…ด•ฤิไ๔ฅตลีๅ๕Vfv†–ฆถฦึๆ๖'7GWgw‡—งทวฺ� ��?�๋BIBpชถO $…'H'„’ด$ฅ $ฅก:p 0“ cgcชซ€ึไZำต๗jk‡าe{ค=ฟ๎๔ใRL!)šˆทa%ฯWŸิํี๙L `๛˜ปNv[@๏Twไ๎Cˆ2KวP]DะฃMฬน›› คำศ*i14,RR„ะŠ–L$”ฒe$ษ)ะ๋“ฆ ีVย้$%( œฌlJลนVฒ†8รKฬn#๓kh๗ู† ๕>ฃWMย~U๙ัLวฉkพ…s๛ž฿R็�กbๆjmูWœฌว›ฒ,ะุt�vฎถjoๆTฤ™qa3ิšˆ|žƒ๖๏O'ู๊ผ~๐ฎๆ?Šณ‰’เสlรลnฏ?ีkพŸmbใUK๋k๋x{_ซ^ุ- ๗oาDป ถVAแซOซKOๆน7‹U็=#ล7ึŽกf& 1จqe๙ลฬ9m-ด9ฟบ๛wฒ†ืWzืM้๗7๛ฅฐXูmc๙zzนิ3๒๚ํuง๔๘ตŒag;œcะๆคจฯQฟฟZกGีผWR๚l.uฎ๗ฯำฮ๏ลM ๕ ‚1ภF<Z™Hํแงก๕z^ฑs[Xn๓a#nุฟwัูท๓”:oึN‡ิ3~รq}฿เๆฒรซ‹){ฝฮณh๖W๊�๕ฦ๚ฝ‡“า*้yต๘์ ม\ํงswB~ซ๕_*จม มฟ ‡เภfทƒ๊{ญ–1ึ{์�S๔ช01๋d๏ก่?ฌณ$คM _ขํำ ฝ›>X~ํอ�คีmeŸF]^ณ ึดI0>‹ปํQZศฒM56ฆบlvฟๆ3ŠlNŒrล9@าทu’Yด๕ รซร,ท๑bปFK/c๔ซw ~๓O็ฑ % Gม"e"™ซ&N™%?ั๋‚’„ฉUฐบp”)04ธhู๗๙ษ!ไพฒe›๚qZfผ รcเ.ธ�[า๛=K/๋Oู๚-ยN๋@ฉ (๛ฟ๐6ฝ66Kณ2/ฯณC•k๎?ธบถ�e›^_ี๎ง๚ญ๗ัhืiู๎ที๔๗�a< 4H]7ˆฤ!b$ฤโ๊tj~ษาqฃช†ธ�›๋;ฉ๊…ืไt&ไ_cญฒ๛ฎy/$ฤปฺฦฯๆ-กC/ฅีฤตํ-;uรn…ช?งc๔ผ 0qร…็™q$›็ป๎๕1•า �าถ"u�ฑ_โ๐ผv]_Fsjvห,ตํk†‘�1\y[ฯGึบ‡๐n๗์๚ปฺๆ�Uuธ-๕kžwZ๗}๎rื=7&ฑ^ELตฃณฺฏ’–9„.2dๆq๑DŒd4ัไ1ธu๊€ส^�แ๕4ฯฮงVŠ฿ญ฿Z3/ธbง\ใตR7Yฮตึถถท๓์ะ]/ุ่รŽsแ๎๛M฿ตส�ูq0q๖cTส+h>ฺฺ4ฏาฺ'6.˜ล๘Mxใ๋3๔ๆณzงูฉสฯศeฌ-ฅl†นอNษ๚5๚พญŸ๑h}๋UA˜}CTrF๚ูฤตฎk๗{]ตfuG‘ำฑฏ-ฦ,{O}B฿ษS}[n_Tุ๋๙7๕แปิ{ภญ€๏J–ว๏ุ๏๋ง q๖ไH๏ฏj๙YsฮC(€'๔} ~้wญห๋]Gญไ๔—”๐kk฿nภ๗X๗mฺอฎŸั๎wฌZW๚ฎ^oฺ1ณชn?V้ฏ ผ3F8;wงc[๙ป๖น–ณ่7eฮlฏ๋Gี๎ฃ๋ี:f๗ท%™”U"ศhoฝญauvlgฉS=๊ฯิŽ—ŠฬฌฬสŸIษmuิdXๆฐนฮs˜�}u็ฉ๏ณ๚‰’8ฌดk๗๘�I‹ˆ๑Uฟแ่๖mp{Z๖๐แ#ๆ’#งงภผ}ฮr*‰Œ่H์ฒd้‘Sา๋ก8 $ชณฒ —]ษ8ฝ>๐aโ‡1‡๙vฦ3?้\ฎ…๕โ�OฃSD๋••[H๑mM~Cฟ๐FาŒEบ"ๅโ๓-›j h๚"ๅณฑ~ฯ™~3ฎ%ฃฑkฝ์#๙;Wgาšาั๘+นฝฉVั’ยม์ฑ‡k<฿ป‡ฉ!˜Bf๖-ฎfqb6|ฝญac!#ถGษvฟS0mล้YŽk˜วะวk`;-๔Kc฿้ป๓้Fม๚™ัจฐYc’Fกท;s4ใ}- e›–ถ๓If%†uุL’ฯฬ ว†7ฎไฐbฤc!dš<็Dุด“I๙ญึ๛@๐ ขZ>อD~ใ"{ดC ๘U็๓]dฑภฬ u7ฦฝฅ&<�7K|œ!T๋y!ธvkห{!ภ[๚ว›‰ำห๐™Ukši+ฆcใัHe k+@d?๔VG%ดRx–5ฌ~ฅา2,ศ้ีœผษฒ์=ลฏcฯนึbฝา฿w๚%4…’.ปฑ]—`kqำwฏฅรgร…Q[ฮฑgHฎ_}4ข็ˆฺฯs*+ฝVุฑGื!h๛7OภศPถบ๎hkใ }›Isุื&ฟ๘K+Z]กษฦต๗v~S™w๒\โw๚mw๚=วji‡<ZัตซืGk๙ˆ๐{ฟ,�d 3์ฐx:~๑�˜ฃ 6 r๙Šล2r’(ำ๋าI:ชุ\.Ka_ฑ"ข`=ู/๙ตธ์o[—Z2*ณ'/งSWำช‹mวำฑฌ�ั ๘พq~?’…ุ1Fฌบcšื Guขฑำฑ๒ฑ๐๎ฝญษษ U^ฆI;Yนอต๏wถฟQpธcจ`U๕หƒNอย it{^ลป๕;.:žFHษ๊n.qจ–นีด๛=GU๔ท~o๚:*90ืคt้รีฒsฦdฟ้q~ˆ�พ{ธH<!u  ฌ:†ึใ๘fRะะˆ๘Bฃ๕†ท~ษหุใฅ/๐๐๑Uภิyช5ฤ<>‹„แP‘ฃค๖]Xภ0FึŸ ‰Y2K๒@ ตxฮD“lนdnป2mV —|–7ึc๖cฑำก5[ใ^Vo[ช<y jAf2xรา๊ดy4~ ฃฃVถt๐ฎsฃธJว„Rทฑ์๖†ƒจ‚vO˜๙ฒฯX'RทkฬฮŸ!ูล็pอ้y๏วฟงHq๔^l-uแ+%ซ๛Š๖?ื๎†๚œ๛‘Ž๖7vว0?qสํฉฮgฝ่#์ไ Dlฆคฅ"๕?๔žŸอ๕ญฎ}X๘๒—ฒU•อSษ๊G33ฌeำ๖j2ฉฎฌ O"–=ึบืqฟิ}Ÿฮ�…�๚Mt‰W˜คl฿u’N™%?ิ๋ำ„ม:ชฮศ.7๋COฌกŸ่1hgอๆ�๔kWbู:NpYู+๋Qศnฌ9ฆVV�็”่๕๒fภ.G7๋&3…]ฌ*tูไ?ูr'ีŸซ๘Jช๓}|Šoกๅถ \C‡ะuVํ๕+รนoU‰VE.ฎภ]-sOptrตะบF?Iร8ิ?sฝK๓๎.:WkX‰อXฬA"W๘/ษŒ{œZ6?ผ๋ฐžช}vbๆว๚EqคBงืไl฿๘‡�ิ•^;4Gๆaอ้ฟอ3ศZ`๗ํยส้ฎ“'ภ-FQ;–lŸ1l4๖Y`N3วŒEwิ�ฤ๒จuƒธ?‘(๎C็5าEžƒ uœ#ฟาw‚ Z<@.3�Ed๔_s�๊œบ*=ฑุr!I”๚›1—คy๚ัิ_Cjยe&์œญXืณ{@ฯัิๆน๖_ป่,Z:^GO๊9น๕†6ห(บฦZ[ฃnอ–U๎๗{}์^…๖zฬ‡ึรmsุ้Z ?Oำฐ๛™ป๙+#๋ี›:พN6N3UฬsYsNตo–7่๚•8ฝ฿๐ชLYข�๔ƒ|Rje‰‘โซ†?›ำา2F๓$‡4b๏ชาช_๚v?‰ฐicทฌ• vY=ŠL’dๅฏี๋‚p˜'UYึฟ%ธxืf;่โิ๛mฎฐาj๓ސรฐoี็W3ซ�้.๋Aด}\๊“w[EžUื๖‹?ณVๅวtธ฿๓ืม>?,›<ถไฝFึฦƒม^ฉโ}ฝ•ฉv'U\ฏžํ†:UNทฏGฮ�ˆณคฃิ]Oศช๕ฒ�ู9ฐ4๔,�ฉ(วqๆฐP๓sบ{@ฉšžZ็ƒฦบฌฮžl5ณHะDู๋^wญ"#ฬ?&๔eนgศ5ตQ?ลQ๋DŠ<A๓EงํAฤงY?ช๕ƒ`ฦt‰1ฏ�2J?0[S‡ :):๐๗๚RบZ\น~‡ปcฃ#�*้ฑghž๓|วอ'ไnถ?น‚u๎ชึNใฆŠหIž<9Q0ษš4;๗K]๗U็ OลQถ=7nะAŸน]ดnัะ$yฦฉั๊ล>‹สE2zวู8BIM!�����]�������A�d�o�b�e� �P�h�o�t�o�s�h�o�p����A�d�o�b�e� �P�h�o�t�o�s�h�o�p� �C�C� �2�0�1�5����8BIM����������แ็http://ns.adobe.com/xap/1.0/�<?xpacket begin="๏ปฟ" id="W5M0MpCehiHzreSzNTczkc9d"?> <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c067 79.157747, 2015/03/30-23:40:42 "> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:photoshop="http://ns.adobe.com/photoshop/1.0/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" xmp:CreateDate="2015-10-08T12:38:11-04:00" xmp:ModifyDate="2015-12-17T10:59:45-05:00" xmp:MetadataDate="2015-12-17T10:59:45-05:00" xmp:CreatorTool="Adobe Photoshop CC 2015 (Macintosh)" dc:format="image/jpeg" photoshop:ColorMode="3" photoshop:ICCProfile="VA2703 Series Calibrated" xmpMM:InstanceID="xmp.iid:e2bd0b59-56b1-43bf-b7e2-32743b1a93c0" xmpMM:DocumentID="adobe:docid:photoshop:961aeea4-e565-1178-84a1-ef55e5ef95af" xmpMM:OriginalDocumentID="xmp.did:6524ee62-4040-4486-9730-cc482d0b6dc4"> <photoshop:TextLayers> <rdf:Bag> <rdf:li photoshop:LayerName="Popular Illustration Categories" photoshop:LayerText="Popular Illustration Categories"/> <rdf:li photoshop:LayerName="Popular Vector Categories" photoshop:LayerText="Popular Vector Categories"/> <rdf:li photoshop:LayerName="Popular Photo Categories" photoshop:LayerText="Popular Photo Categories"/> <rdf:li photoshop:LayerName="Bigstock Picks" photoshop:LayerText="Bigstock Picks"/> <rdf:li photoshop:LayerName="Winter Collection" photoshop:LayerText="Winter Collection"/> <rdf:li photoshop:LayerName="Bigstock Video" photoshop:LayerText="Bigstock Video"/> <rdf:li photoshop:LayerName="Images and Video for everyone." photoshop:LayerText="Images and Video for everyone."/> <rdf:li photoshop:LayerName="Over 30 million stock photos, videos, and vectors." photoshop:LayerText="Over 30 million stock photos, videos, and vectors."/> </rdf:Bag> </photoshop:TextLayers> <photoshop:DocumentAncestors> <rdf:Bag> <rdf:li>2338B8E41274008A90C8BD2547960BB3</rdf:li> <rdf:li>2DE4406C10B73422B4EE6D8B0D325FA8</rdf:li> <rdf:li>3197650EE93F798D6A2BAF21AD62272B</rdf:li> <rdf:li>3F298132EF5DF7BD1E7E79C525C0CA86</rdf:li> <rdf:li>5AAA046F1BED5507B4FE582ED12591A4</rdf:li> <rdf:li>65653AF10A51D90FA07ECE63326084AA</rdf:li> <rdf:li>76E417E5E4017D78582B791B963C9F3B</rdf:li> <rdf:li>8F4003C1E5318DE635C83490D514830A</rdf:li> <rdf:li>A1474CB5A10E36D46870F0446E07D3E0</rdf:li> <rdf:li>A4D5D3C7397850DFFCA8C636A6D2AA9E</rdf:li> <rdf:li>A81867ADB2D20376CAF23C6C4455A61F</rdf:li> <rdf:li>C309326AF2D2E3A15A8A224EE0246442</rdf:li> <rdf:li>C4AABDD571F96E9245AF3255DACBE902</rdf:li> <rdf:li>C597FDD2DF29CEE3A08906DEF8235FA3</rdf:li> <rdf:li>D0E41193D0D87ABF69D3A27435FD9CE6</rdf:li> <rdf:li>D493B382008DD02005894F84AB8ACDA5</rdf:li> <rdf:li>DB1AC9D26B1F40C9A5A11B7A6ADC3A12</rdf:li> <rdf:li>E64E952ACE29002EB68F1BCD01B8911B</rdf:li> <rdf:li>E6885685CBDF2324E71158BF2176E1FE</rdf:li> <rdf:li>F5E7577A6B3A341A51CAAAC5E3A59B11</rdf:li> <rdf:li>FD1D7E31C7512BE0A891CDAA5C77DE95</rdf:li> <rdf:li>xmp.did:64946cb8-411a-4b00-9961-c82dffc5464c</rdf:li> </rdf:Bag> </photoshop:DocumentAncestors> <xmpMM:History> <rdf:Seq> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:6524ee62-4040-4486-9730-cc482d0b6dc4" stEvt:when="2015-10-30T14:26:35-04:00" stEvt:softwareAgent="Adobe Photoshop CC 2015 (Macintosh)" stEvt:changed="/"/> <rdf:li stEvt:action="converted" stEvt:parameters="from image/png to application/vnd.adobe.photoshop"/> <rdf:li stEvt:action="derived" stEvt:parameters="converted from image/png to application/vnd.adobe.photoshop"/> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:64946cb8-411a-4b00-9961-c82dffc5464c" stEvt:when="2015-10-30T14:26:35-04:00" stEvt:softwareAgent="Adobe Photoshop CC 2015 (Macintosh)" stEvt:changed="/"/> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:6344f71c-48bd-40e8-aa3f-f72a106bce9a" stEvt:when="2015-12-17T10:59:45-05:00" stEvt:softwareAgent="Adobe Photoshop CC 2015 (Macintosh)" stEvt:changed="/"/> <rdf:li stEvt:action="converted" stEvt:parameters="from application/vnd.adobe.photoshop to image/jpeg"/> <rdf:li stEvt:action="derived" stEvt:parameters="converted from application/vnd.adobe.photoshop to image/jpeg"/> <rdf:li stEvt:action="saved" stEvt:instanceID="xmp.iid:e2bd0b59-56b1-43bf-b7e2-32743b1a93c0" stEvt:when="2015-12-17T10:59:45-05:00" stEvt:softwareAgent="Adobe Photoshop CC 2015 (Macintosh)" stEvt:changed="/"/> </rdf:Seq> </xmpMM:History> <xmpMM:DerivedFrom stRef:instanceID="xmp.iid:6344f71c-48bd-40e8-aa3f-f72a106bce9a" stRef:documentID="adobe:docid:photoshop:ca754c60-bfc0-1178-b80c-e5ac2abee428" stRef:originalDocumentID="xmp.did:6524ee62-4040-4486-9730-cc482d0b6dc4"/> </rdf:Description> </rdf:RDF> </x:xmpmeta> <?xpacket end="w"?>โ)hICC_PROFILE���)Xappl��mntrRGB XYZ ฿� � ���acspAPPL��������������������������๖ึ�����ำ-appl�����������������������������������������������desc��P���sdscm��ฤ���Lcprt�����#wtpt��4���rXYZ��H���gXYZ��\���bXYZ��p���rTRC��„�� aarg�� ��� vcgt�� ฐ��ndin��ฤ��>chad��)���,mmod��)0���(bTRC��„�� gTRC��„�� aabg�� ��� aagg�� ��� desc�������VA2703 Series Calibrated��������������������������������������������������������������������������������mluc���������� enUS���0����V�A�2�7�0�3� �S�e�r�i�e�s� �C�a�l�i�b�r�a�t�e�dtext����Copyright Apple Inc., 2015��XYZ ������๓ุ����XYZ ������l��8ฉ��—XYZ ������b6��ทr��XYZ ������(‘��ๅ��พ—curv����������� �����#�(�-�2�6�;�@�E�J�O�T�Y�^�c�h�m�r�w�|��†�‹��•�š�Ÿ�ฃ�จ�ญ�ฒ�ท�ผ�ม�ฦ�ห�ะ�ี��เ�ๅ�๋�๐�๖�๛ %+28>ELRY`gnu|ƒ‹’šกฉฑนมษัูแ้๒๚ &/8AKT]gqz„Ž˜ขฌถมหีเ๋๕� !-8COZfr~Š–ขฎบวำเ์๙ -;HUcq~Œšจถฤำแ๐ +:IXgw†–ฆตลีๅ๖'7HYj{Œฏภัใ๕+=Oat†™ฌฟาๅ๘ 2FZn‚–ชพา็๛  % : O d y  ค บ ฯ ๅ ๛  ' = T j  ˜ ฎ ล ๓ " 9 Q i € ˜ ฐ ศ แ ๙  * C \ u Ž ง ภ ู ๓ & @ Z t Ž ฉ ร ๘.Id›ถา๎ %A^z–ณฯ์ &Ca~›นื๕1OmŒชษ่&Ed„ฃรใ#Ccƒคลๅ'Ij‹ญฮ๐4Vx›ฝเ&Ilฒึ๚Ae‰ฎา๗@eŠฏี๚ Ek‘ท*Qwžล์;cŠฒฺ*R{ฃฬ๕Gp™ร์@j”พ้>i”ฟ๊  A l ˜ ฤ ๐!!H!u!ก!ฮ!๛"'"U"‚"ฏ"# #8#f#”#ย#๐$$M$|$ซ$ฺ% %8%h%—%ว%๗&'&W&‡&ท&่''I'z'ซ'( (?(q(ข(ิ))8)k))ะ**5*h*›*ฯ++6+i++ั,,9,n,ข,ื- -A-v-ซ-แ..L.‚.ท.๎/$/Z/‘/ว/050l0ค011J1‚1บ1๒2*2c2›2ิ3 3F33ธ3๑4+4e4ž4ุ55M5‡5ย5676r6ฎ6้7$7`7œ7ื88P8Œ8ศ99B99ผ9๙:6:t:ฒ:๏;-;k;ช;่<'<e<ค<ใ="=a=ก=เ> >`> >เ?!?a?ข?โ@#@d@ฆ@็A)AjAฌA๎B0BrBตB๗C:C}CภDDGDŠDฮEEUEšEF"FgFซF๐G5G{GภHHKH‘HืIIcIฉI๐J7J}JฤK KSKšKโL*LrLบMMJM“MN%NnNทO�OIO“OP'PqPปQQPQ›QๆR1R|RวSS_SชS๖TBTTU(UuUยVV\VฉV๗WDW’WเX/X}XหYYiYธZZVZฆZ๕[E[•[ๅ\5\†\ึ]']x]ษ^^l^ฝ__a_ณ``W`ช`aOaขa๕bIbœb๐cCc—c๋d@d”d้e=e’e็f=f’f่g=g“g้h?h–h์iCiši๑jHjŸj๗kOkงklWlฏmm`mนnnknฤooxoัp+p†pเq:q•q๐rKrฆss]sธttptฬu(u…uแv>v›v๘wVwณxxnxฬy*y‰y็zFzฅ{{c{ย|!||แ}A}ก~~b~ย#„ๅ€G€จ kอ‚0‚’‚๔ƒWƒบ„„€„ใ…G…ซ††r†ื‡;‡Ÿˆˆiˆฮ‰3‰™‰ŠdŠส‹0‹–‹ŒcŒส1˜ŽfŽฮ6žnึ‘?‘จ’’z’ใ“M“ถ” ”Š”๔•_•ษ–4–Ÿ— —u—เ˜L˜ธ™$™™šhšี›B›ฏœœ‰œ๗dาž@žฎŸŸ‹Ÿ๚ i ุกGกถข&ข–ฃฃvฃๆคVควฅ8ฅฉฆฆ‹ฆงnงเจRจฤฉ7ฉฉชชซซuซ้ฌ\ฌะญDญธฎ-ฎกฏฏ‹ฐ�ฐuฐ๊ฑ`ฑึฒKฒยณ8ณฎด%ดœตตŠถถyถ๐ทhทเธYธันJนยบ;บตป.ปงผ!ผ›ฝฝพ พ„พฟzฟ๕ภpภ์มgมใย_ยรXริฤQฤฮลKลศฦFฦรวAวฟศ=ศผษ:ษนส8สทห6หถฬ5ฬตอ5อตฮ6ฮถฯ7ฯธะ9ะบั<ัพา?ามำDำฦิIิหีNีัึUึุื\ืเุdุู่lู๑ฺvฺ๛€Š–ข฿)฿ฏเ6เฝแDแฬโSโใcใ๋ไsไๅ„ๆ ๆ–็็ฉ่2่ผ้F้ะ๊[๊ๅ๋p๋๛์†ํํœ๎(๎ด๏@๏ฬ๐X๐ๅ๑r๑๒Œ๓๓ง๔4๔ย๕P๕๖m๖๛๗Š๘๘จ๙8๙ว๚W๚็๛w˜)บKmpara��������ff��๒ง�� Y��ะ�� vcgt��������������”�โoฐDุvฑWกGํ — F ๏ › K ๛ ฏaษ‚:๒ญh%ใคf'ํฐzC ุฅuD๋ ม!˜"r#K$)% %้&ห'ฎ(”){*d+O,<-*./ /0๒1็23ี4ฬ5ฤ6ผ7ด8ญ9จ:ค;ก< =ก>ฃ?ง@ญAตBพCสDืEๆF๘H I!J8KRLnM‹NฌOฮP๓RSCToUVอX�Y5Zl[ฆ\เ^_]`a฿c!ddeจfํh0iujธkm=n}oปp๘r2sitžuะvx(yNzr{|ฌ}ร~ีไ€๎๖‚„�…†‡ˆ‰Š‹�‹Œ๘๒Ž์ๅ‘ึ’อ“ล”ป•ฒ–ฉ—Ÿ˜•™‹š›wœndž[ŸR IกAข:ฃ3ค,ฅ&ฆ!งจฉชซฌญฎฏ%ฐ-ฑ6ฒBณOด]ตlถ{ท‹ธนฎบภปำผ็ฝ๛ฟภ&ม=ยTรkฤ„ลœฦถวะศ๊สห!ฬ>อZฮwฯ•ะณัาา๑ิี0ึPืqุ’ูณฺี๖:฿\เแกโฤใ็ๅ ๆ.็S่w้œ๊ย๋่ํ๎7๏_๐ˆ๑ฒ๒๔๕5๖c๗’๘ย๙๓๛&Zฦ���”"ฏB๐ฅB๒จ]ฟw 3 ํ ช g $ ็ ฆh)๎ถyB ำŸk5ำขrC๋ภ“kC  ๒!อ"ง#„$_%>&&'(ฟ) *ƒ+f,J-1../ๅ0ฮ1ท2 3Š4u5`6M798$99:๋;ุ<ล=ณ>ก?Ž@}AlB[CJD;E-F GH HI๗J๐K์L๊M้N๊O๐P๘RST%U<VSWmX‡YฃZภ[฿\^_A`daˆbฌcาd๗fgChii‘jทkmn)oOpsq–rธsูt๙vw4xOyhz{”|ง}ธ~ศื€็๖ƒ„…#†1‡?ˆM‰[Ši‹vŒ„’ŽŸฌธ‘ล’า“”๋•๘—˜™š(›4œ@LžWŸc oกzข†ฃ‘คฅจฆดงฟจสฉึชแซ์ฌ๘ฎฏฐฑ&ฒ1ณ<ดFตOถVท]ธcนhบlปpผsฝvพyฟ{ภ~ม€ยƒร…ฤ‰ลŒฦว”ศ™ษ สฆหฎฬทอมฮอฯะ๊ั๛ำิ#ี;ึUืsุ“ูธฺ'M฿tเ›แยโ๊ไๅ>ๆj็—่ล้๕๋(์[ํ‘๎ษ๐๑B๒‚๓ฦ๕๖Y๗ช๘๚X๛ทŠ���”"ฏA๐„-ึ-ŒA๓ ช a  ิ  Eร‡C วŽSโฉr>ึคsE่ปf >!!๎"ส#ฅ$ƒ%_&>''(โ)ฤ*จ+,t-\.C/,011์2ู3ล4ฒ5ก6Ž7~8l9\:K;<<.=!>??@๔A์BๅCDูEีFำGะHะIะJาKีLูMNไO์P๔QS TU"V0W?XPYaZs[‡\š]ฏ^ล_`๑bcd7eOffgh–iฎjลkl๓n op3qGrYskt{uŠv—wคxฏyทzพ{ฤ|ศ}ฬ~ฯำ€ีุ‚ƒ„…฿†เ‡แˆโ‰โŠใ‹ใŒใใŽใใใ‘โ’โ“โ”โ•โ–โ—โ˜โ™ใšไ›ๅœๆ่ž้Ÿ๋ ๎ก๐ข๔ฃ๗ค๛ฆ�งจ ฉชซ ฌ)ญ2ฎ;ฏEฐOฑXฒ_ณfดnตtถzทธ†นŒบ’ป˜ผŸฝฅพฌฟดภผมลยฯรฺฤๅล๒ว�ศษ!ส4หIฬ`อzฮ•ฯณะีั๙ำ!ิMี}ึฑืๆฺูQˆพ๖฿.เgแกโไๅYๆš็้"๊i๋ดํ๎S๏ฉ๑๒a๓ฤ๕.๖ž๘๙–๛ฑQ��ndin������6��ฃ€��Vภ��O���ž€��(������P@��T@�๊๒�๊r�อฦ����������������� � �������!�%�)�-�1�6�:�?�E�J�O�U�[�a�h�n�u�|�ƒ�Š�’�™�ก�ฉ�ฒ�บ�ร�ฬ�ี��็�๑�๛$.9DP[gs‹—คฐฝสืๅ๒�*9GVetƒ’ขฒมัโ๒$5FWhzŒžฐยิๆ๙ 1DXk’ฆบฮโ๖ 4I^sˆณศ๔  6Lcyฆฝิ๋1H`xงฟุ๐ 9Rjƒœตฮ็   4 M g  › ต ฯ ้   8 S m ˆ ฃ พ ู ๔  * F a } ™ ต ะ ์ % A ^ z — ณ ะ ํ ' E b   ป ุ ๖3QoŽฌห๊ (Gg†ฆฦๆ&Fg‡จศ้ +KmŽฏะ๑4Vx™ป!Ceˆชฬ๏4Wyœฟโ(Kn’ตุCfŠฎา๖=b†ชฮ๒;_„จอ๒;`…ชฯ๔>cˆญำ๘ChŽณู$Jp•ปแ-SyŸล์8^…ซั๘Ek’น฿  - S z ก ศ ๏!!=!d!‹!ฒ!ู"�"'"N"v""ฤ"์##:#b#‰#ฑ#ุ$�$($O$w$Ÿ$ว$๏%%?%g%%ท%฿&&/&X&€&จ&ั&๙'"'J's'œ'ล'ํ((?(h(‘(ป(ไ) )6)`)‰)ณ)**0*Z*„*ฎ*ุ++,+W++ฌ+ึ,,,,W,‚,ญ,ุ--.-Z-…-ฑ-. .5.a..น.ๆ//?/l/™/ฦ/๓0!0N0|0ช0ื1141b1‘1ฟ1๎22L2{2ซ2ฺ3 3:3j3›3ห34-4^44ม4๒5$5V5ˆ5ป5ํ6 6S6‡6บ6๎7"7V7‹7ภ7๕8*8_8•8ห9989n9ฅ9::L:„:ฝ:๖;/;h;ข;<<Q<‹<ว==>=z=ท=๔>1>o>ญ>๋?*?i?ฉ?่@)@i@ช@๋A,AmAฏA๑B3BuBธB๛C>CCฤDDLDDิEE^EฃE่F.FsFนG�GFGGำHHbHฉH๑I9IIสJJ[JคJํK7KKหLL_LชL๔M?M‹MึN"NnNบOOROŸO์P9P†PิQ"QoQพR RZRฉR๘SGS–SๆT6T†TึU&UvUวVViVบW W]WฏXXSXฅX๘YJYY๐ZDZ—Z๋[>[’[ๆ\:\\ใ]8]]โ^7^^โ_8_Ž_ไ`:``็a=a”a๋bBb™b๑cHc c๗dOdงdeXeฐf fafบgglgลhhxhัi+i„ij8j’j์kGkกk๛lVlฐm mfmมnnwnาo-oˆoไp?p›p๖qRqฎr rerมssysีt1tt้uFuขuvZvทwwpwฬx)x…xโy>y›y๗zTzฐ{ {i{ฦ|"||}8}•}๑~N~ชcฟ€€x€ิ1๊‚G‚คƒƒ^ƒป„„u„า…0……๋†H†ฆ‡‡b‡ภˆˆ|ˆฺ‰8‰—‰๕ŠTŠฒ‹‹p‹ฯŒ.ŒŒ์KชŽ ŽiŽศ(‡็Gง‘‘g‘ว’'’ˆ’่“H“ฉ” ”j”ห•,••๎–O–ฐ——s—ิ˜6˜˜˜๙™[™ฝšššใ›E›จœ œlœฯ2”๗žZžฝŸ ŸƒŸๆ J ญกกtกุข<ข ฃฃgฃฬค0ค”ค๘ฅ]ฅมฆ&ฆ‹ฆ๏งTงนจจ„จ้ฉNฉดชชชไซJซฐฌฌ|ฌโญIญฏฎฎ|ฎใฏIฏฐฐฐ~ฐๅฑLฑดฒฒ‚ฒ๊ณRณนด!ด‰ด๑ตYตยถ*ถ’ถ๛ทdทฬธ5ธžนนpนฺบCบฌปปป้ผSผฝฝ'ฝ‘ฝ๛พfพะฟ;ฟฆภภ{ภๆมQมฝย(ย“ยรkรืฤCฤฏลล‡ล๔ฦ`ฦอว:วฆศศ€ศ๎ษ[ษศส6สฃหหหํฬ[ฬษอ7อฆฮฮƒฮ๑ฯ`ฯฯะ>ะญัั‹ั๚าjาูำIำธิ(ิ˜ีีxี่ึXึศื9ืฉุุŠุ๛ูlฺูMฺพ/ ƒ๔eืHบ฿,฿เเเ๓แeแืโIโปใ-ใ ไไ„ไ๗ๅiๅๆNๆม็4็ฆ่่Œ่้r้ๅ๊X๊ห๋>๋ฑ์$์—ํ ํ}ํ๑๎d๎ื๏K๏พ๐1๐ฅ๑๑Œ๑๒s๒ๆ๓Z๓อ๔A๔ต๕(๕œ๖๖ƒ๖๗๗j๗๘R๘ล๙9๙ญ๚ ๚”๛๛{๛๏bึJฝ1ค‹��������������� � ��������!�$�(�+�/�3�7�<�@�E�J�O�T�Y�_�d�j�p�v�|�ƒ�‰��—�ž�ฅ�ญ�ด�ผ�ฤ�ฬ�ิ��ๅ�๎�๖�%/9CMWblw‚Ž™คฐผศิเ์๙-:GUcq›ชธวึๅ๔#3CSct„•ฆทศู๊1DVh{ ณฦูํ�(<Pdxกถหเ๕  5Kawฃนะๆ+BZqˆ ธะ่�1Ib{”ญฦเ๙  - F ` { • ฏ ส ไ  5 P l ‡ ฃ พ ฺ ๖  . K g „   ฝ ฺ ๗  2 O m ‹ ฉ ว ๅ  " @ _ ~  ผ ๚:Yy™บฺ๚<]~Ÿภโ%Gi‹ฎะ๓8\ขฦ้ 1Uzžย็ 1V{ ฦ๋7]ƒฉะ๖Cj‘ธ฿.U}คฬ๔Dl•ฝๅ7_ˆฑฺ,Uจั๛$Nwกห๕Hrœฦ๐Do™รํBl–ภ๊?i“พ่<fบไ  8 b Œ ถ แ! !5!`!Š!ต!เ" "5"`"‹"ถ"แ# #7#c#Ž#น#ๅ$$<$h$“$ฟ$๋%%C%o%›%ว%๔& &M&y&ฆ&า&','Y'†'ณ'เ( (;(h(•(ร(๐))L)z)จ)ึ**2*`**ฝ*์++I+x+ง+ึ,,4,c,“,ย,๒-"-Q--ฑ-แ..B.r.ฃ.ำ//5/f/—/ศ/๙0+0\0Ž0ภ0๑1#1V1ˆ1บ1ํ22R2…2ธ2๋33R3…3น3ํ4!4U4‰4พ4๒5'5\5‘5ฦ5๛616g6œ6า7 7?7u7ฌ7ใ88Q8ˆ8ภ8๘909h9 9ู::J:ƒ:ฝ:๖;0;j;ค;<<S<Ž<ษ==@=|=ธ=๕>1>n>ซ>่?&?d?ข?เ@@]@œ@AAYA™AุBBXB—BุCCXC™CูDD[DœDEE`EขEไF&FhFชF์G/GrGดG๗H:H~HมIIHIŒIะJJXJJแK&KkKฐK๕L:LLลM MPM–MN#NiNฐN๖O=O„OหPPZPกP้Q1QyQมR RRRšRใS,SuSพTTQTšTไU.UxUยV VWVกV์W7W‚WอXXdXฐX๛YGY“Y฿Z,ZxZล[[^[ซ[๙\F\“\แ]/]}]ห^^g^ถ__S_ข_๑`@``฿a/aaฯbbobฟccacฑddSdฅd๖eHe™e๋f=ffแg4g†gูh,hhาi%ixiฬj jtjวkkpkฤllmlยmmlmยnnmnยoonoฤppqpวqquqฬr#rzrาs)ssูt1t‰tแu:u’u๋vDvv๖wOwจxx\xตyyiyฤzzyzำ{.{‰{ไ|?|›|๖}R}ฎ~ ~e~ยzื€4€‘€๎Lช‚‚f‚ฤƒ#ƒ‚ƒแ„A„ก……a…ม†"†ƒ†ไ‡F‡งˆ ˆkˆอ‰0‰“‰๖ŠYŠผ‹ ‹ƒ‹่ŒLŒฐz฿ŽDŽฉuAง‘‘u‘’C’ช““y“แ”I”ฑ••‚•๊–S–ผ—%—Ž—๗˜a˜ห™4™žššsš›G›ฒœœ‡œ๒]ษž4žŸŸ ŸvŸโ N บก&ก’กขjขึฃCฃฏคคˆค๕ฅaฅฮฆ;ฆจงง‚ง๏จ\จษฉ6ฉฃชช~ช๋ซXซลฌ3ฌ ญ ญ{ญ่ฎUฎยฏ0ฏฐ ฐwฐๅฑRฑฟฒ,ฒ™ณณsณเดMดนต&ต“ตถlถุทEทฑธธ‰ธ๕นaนอบ9บคปป{ปๆผQผผฝ'ฝ’ฝพgพัฟ;ฟฅภภxภโมLมถย ยŠย๕ร_รสฤ5ฤ ล ลvลแฦLฦทว#วŽว๚ศfศัษ=ษฉสสสํหZหฦฬ2ฬŸอ อxอๅฮQฮพฯ+ฯ˜ะะrะ฿ัLันา&า“ำ�ำmำิHิตี#ีีึkึุืEืณุ ุŽุ๛ูiูึฺCฺฑŒ๙fิAฎ‰๖฿c฿ะเ=เชแแ„แ๑โ^โสใ7ใคไไ}ไ้ๅVๅยๆ.ๆš็็r็่I่ต้!้Œ้๗๊c๊ฮ๋9๋ฃ์์y์ใํNํธ๎"๎Œ๎๕๏_๏ษ๐2๐›๑๑m๑ี๒>๒ฆ๓๓v๓๔F๔ญ๕๕{๕โ๖H๖ฏ๗๗{๗แ๘F๘ซ๙๙u๙ฺ๚>๚ข๛๛i๛อ0“๕Wน|>Ÿ�������������� � � ��������#�&�*�.�2�6�;�?�D�I�N�S�Y�^�d�j�p�v�}�ƒ�Š�‘�˜�Ÿ�ง�ฏ�ถ�พ�ฦ�ฯ�ื�เ�้�๒�๛ !+5?IT_ju€‹—ฃฏปวำเ์๙ .;IWes‚Ÿฎฝฬ๊๚ *:JZk|žฏภาใ๕+=Pbuˆ›ฎมี่$8L`u‰žณศ๓3I_u‹กธฮๅ*AYpˆŸทฯ็0Iaz“ฌฦ฿๘  , E _ y ” ฎ ศ ใ  3 N i …   ป ื ๓  + G c € œ น ี ๒  , J g „ ข ภ  8 V u ” ฒ ั ๐/NnŽญอํ.Ooฑา๓6Xy›ฝ฿$Fh‹ฎะ๓9]€ฃว๋2Vzžร็ 0Uyžร่ 3X}ฃษ๎:`†ญำ๙ Fm”ปโ 0Wฆฮ๕Em•ฝๅ 5^†ฏุ�)R{คฮ๗ Jsว๐Dn˜รํBl—ยํBm™ฤ๏  F q  ษ ๔! !L!x!ค!ั!")"V"‚"ฏ"##5#b##ผ#้$$D$r$Ÿ$อ$๚%(%V%„%ฒ%แ&&=&l&š&ษ&๘'&'U'„'ณ'ใ((A(q(ก(ะ)�)0)`))ภ)๑*!*R*‚*ณ*ไ++F+w+จ+ฺ, ,=,n, ,า--7-i-›-ฮ.�.3.f.™.ฬ/�/3/g/š/ฮ0060j0Ÿ0ำ11<1q1ฆ122F2|2ฒ2็33T3Š3ม3๗4.4e4œ4ำ5 5B5z5ฒ5๊6#6[6”6อ77?7x7ฒ7๋8%8_8š8ิ99J9…9ภ9๛:7:s:ฏ:๋;(;d;ก;<<Y<—<ี==R=‘=ะ>>N>Ž>ฮ??N??ะ@@R@”@ึAAYAœAB!BcBฆB้C,CpCณC๗D;DDรEELE‘EึFF`FฅF๋G1GvGผHHIHHึIIdIซI๓J:J‚JสKKZKฃK๋L4L}LฦMMXMขM๋N5NNษOO^OฉO๔P?PŠPีQ QlQธRRPRœR่S5S‚SฯTTiTถUUQUŸUํV;V‰VุW&WuWฤXXbXฒYYQYกY๐ZAZ‘Zแ[2[‚[ำ\$\u\ว]]j]ป^ ^_^ฑ__V_ฉ_`N`ก`๕aHa›a๏bCb–b๊c?c“c็d<ddๅe:eeไf:ffๅg;ggๆh=h“h้i@i–iํjDj›j๒kIkกk๘lPlงlmWmฏnn`nธoojoยpptpอq'q€qูr3rrๆs@sšs๔tOtฉuu^uธvvnvษw$wwฺx5x‘x์yHyคyz[zท{{o{ห|(|„|เ}=}š}๖~S~ฐ jว€$€€฿=›๙‚W‚ถƒƒtƒำ„2„’„๒…R…ฒ††s†ิ‡5‡—‡๘ˆZˆป‰‰€‰โŠEŠง‹ ‹m‹ะŒ4Œ—Œ๛_รŽ'ŽŒŽ๐Uบ„๊‘O‘ต’’€’ๆ“M“ณ””€”็•M•ด––ƒ–๊—Q—น˜!˜ˆ˜๐™X™ภš(š‘š๙›a›สœ2œ›mึž?žจŸŸzŸใ M ถกก‰ก๒ข\ขฦฃ/ฃ™คคlคึฅ@ฅชฆฆ~ฆ่งQงปจ%จจ๙ฉcฉอช7ชกซ ซtซฌHฌฒญญ…ญ๏ฎXฎยฏ,ฏ•ฏฐhฐัฑ:ฑฃฒ ฒuฒณGณฐดดด๊ตRตบถ"ถŠถ๒ทZทยธ)ธธ๘น_นฦบ-บ“บ๚ป`ปฦผ,ผ’ผ๘ฝ]ฝยพ(พŒพ๑ฟVฟบภภ‚ภๆมKมฏยยxยรBรงฤ ฤqฤืล<ลกฦฦmฦาว8วžศศjศะษ6ษสสiสะห6หฬฬjฬัอ8อŸฮฮlฮำฯ:ฯกะะpะืั>ัฅา าsาำBำฉิิxิ฿ีFีฎึึ|ึไืKืฒุุุู่Oูถฺฺ„ฺ๋Rน ‡๎Uป"‰๏฿V฿ผเ"เˆเ๏แUแปโ!โ†โ์ใRใทไไ‚ไ็ๅLๅฑๆๆ{ๆ฿็D็จ่ ่q่ิ้8้œ้๊c๊ฦ๋)๋Œ๋๎์Q์ณํํwํู๎:๎œ๎๏^๏ฟ๐๐๐เ๑?๑Ÿ๑๒^๒ฝ๓๓z๓ุ๔6๔”๔๑๕O๕ซ๖๖d๖ม๗๗x๗ำ๘.๘‰๘ใ๙=๙—๙๐๚I๚ข๚๛๛S๛ซYฐ\ฒ\ฑYฌ��sf32����� ท��–๓W��)��ื๛ทฆ��ฺ��ภ๖mmod������Zc��b*����อ‰ €����������������๎�Adobe�d@����„�      ภ��r���/ฤข������������ ��������� �s�!1AQa"q2‘กฑB#มRัแ3b๐$r‚๑%C4S’ขฒcsย5D'“ฃณ6Tdtราโ&ƒ „”EFคดVำU(๒ใ๓ฤิไ๔eu…•ฅตลีๅ๕fv†–ฆถฦึๆ๖7GWgw‡—งทวื็๗8HXhxˆ˜จธศุ่๘)9IYiy‰™ฉนษู้๙*:JZjzŠšชบสฺ๊๚�m�!1AQa"q‘2กฑ๐มัแ#BRbr๑3$4C‚’S%ขcฒยsา5โDƒT“ &6E'dtU7๒ฃณร()ำใ๓„”คดฤิไ๔eu…•ฅตลีๅ๕FVfv†–ฆถฦึๆ๖GWgw‡—งทวื็๗8HXhxˆ˜จธศุ่๘9IYiy‰™ฉนษู้๙*:JZjzŠšชบสฺ๊๚ฺ� ��?�๚aฐฮJํ่•*มzแ\)vมj๎ฝ@ฏ|! ๏๔แU๋ธฤ-;ทŽ>Jุ๎:๘œT*ี๗รฎฆ๔}ฑCt๔๊qK€ ‘แ฿็UN›w8ซt๚1Vo Rทˆ'ๅ฿.ง~๑Jํ๋๓ํŠฏQใŠฏ�aBเพุM๑WqรHถ๘โถธ kH฿ญNVฉ-ำ๛FhPƒMŽhึตlUข�†*ดŽ›๋…V๏ึ˜กiทใŠV๗โ‚ี7ญw๏Іkพocซ@Sฆิ๐ล[$แŠอ7>--�Gหj? Uขsพ*ถžิฎ-ญ:ลZฉศ๎ฏะ๚${t๗ฮ<=*oPส™0V—๑#ทห ำ`Wzb†้ถปaUรฆ(wj}๛b•ภ ปbx๋Šฏ้เ;โ•ิ'ง_แŠฎ�ึ๐+‡๙Š[๖๙โ†ภงlRบV*เปP}Jฅ?ฎ*ธ๗vภช€h8กu1Eธ +nงlVืŠ-ิลmิลmชbถี1MดF๘๊bญqลmiจล+H?†XGOรฉำทแ†’1C@oO Jธฏq�Vฟ‰๏…+h|:wฦะ๊t๐๑ล]ว่ฏCZn›๘aCGว}บ\Uož*kืk๓?Ž?ั๚ช@ก็ ั*Ž”ํ’ จ (zž๛~Sk‡_ &‘kฉ๏ำ|*ฺฏ‡l บ€ะ๘โUx_ุฅบSถุซ~;“ํp*?HUฐ ๋๔โซฉN0+tถฆใฎ Nฃc… ำ้ภซภล]@?†*ธํย†้Šb‡{ใJนAbAf= โ‚”jพ`ะ4-ตnหM’•O2‰H๖Œ฿†09–Z|นพˆ“๎ :_อฟ ฦ#ีๅบ=+ ปฐำ sDt.|{W/เฏŠตทๆ’๎FทืL0้มใวอ์}Twแ๛YvŸฌ้ฒ†ำต(.‰฿ำ G�jœrF\‹…—L_\HL่FฤSฤdšZ8ฒถฟVjŸํโญZโ•ฌ>ุm+)*ฐรVำฏพ5JoMN*ัญ:ำวZ &๛xb‡Sถ*Wฎ*?๘Uฎ ๑Uค}๚โซ้ย˜ซ\zžฑE5ภxŽ”รiา๚ใoฦrDn๔n”ฆู%ฅเwฏQพ(\ฃวถ! œNฤqJ๐:ุช๊Ÿพ)l฿yภญx๛tชเ6ฅzvลWธUP ลqUสฟN(oŽ็฿จล6ผถ% ำถ้ŠLUบb‹n˜i์U‹yวฮX๒’5Ÿ5jkam)+cjƒินบ~ฤ๔ฮ!อษาh๒๊งมˆY๋=ๅ๑‡›�็ |ๅๆ๙eณะCyC@bTAlฏฅ_ง‚G์ฆุN3ิฝถƒูฬ8}Y=r๓๚Gร๕ฐ WžFšiZๆvbežbd’พ,ํRN๙ Pไ๏x#@WนXXCท0?  ๖?Ncศ—$ˆไหฌmกxฉโw^DrฎTAไแไ‘๊ษmใŽ01ฒำ”‹ิ~ฌ‹‰8™lYึ‰็_Le‡Pฎฉ`)ศ9๒ƒฟศๅอ(y‡Uช์ฌy7‡คdำ๕ =Vา+๋ ฤ๖๒w่สีืฑ™‰ ;—ฑK†BŠ/$มฌ ๊aKGJฺตŠญ#๎ภ•œkพhŒUgผ=๑W U๔๊;โฎv*1Uฃw๊ฎ*ถพ;๑B฿ท๐ลVq๗ฦ•ำ๚"ิc\ไžฐ6ฎI[ใ› i ิWaำ฿ €oต1Uเtง~ธฅvิ๗ฤซฉถXkZ๗ลW๘ชขŽ•?Fซ(ฤกTtล‰u1[wพ(ov*[ฆCรVภรJ๓อOฬํ๒ฃหฏ๊จ/ต+ฒะyo@ ล๏ฎ@ฉ๕Xาตv๐ุnpˆ™ฯ๑ปู๚ ๋r๐G`9žแ๚๛Ÿ™Zฟ˜ม็�1yฏอืฯ}ฉ]’*•‚ึ~ Œž(‹ะSฏ}๓ ฤc>}๏ฆhดX๔ธฤ1ŠŽ}ๅ–h๚z3r/@)ะP๛f,ไไNT‹aวธ d+�jj;:๙Žwq&m˜้๑ฃ„5้Z๕สธyIYUต‚ž๐ชจู?ฆ@ธrษIชฺPช€ฐฅh?ฮพ๘ผKGวk$ช 7Uงแ^ธi”€Nt›ญ๑/ญC…ฟต;,ฉ฿n•Ž0‘ฐแjpว<xO>‡นํัKฤ1\@โH'A$2๊ŒุƒbfQ1$a~*ท๋-b—๖๐กิภ•ฟIฆฌ#รญง‡ั…V‘๚๑Vฉ๘โฎฆ฿ำปqถJั๋แŠญ๖ฦ•ววถ*ฑถ๙b†ถ๖๑๋Š_ิ๚+ฤ จ์NrFนEh๛x฿ฝผ0ชเฃ}ฑU๊>Šฏ~XฅฟŸ฿Šญcฑzwภซ|6>็ ฏP6ภชกqU`0กS Šถ=?,Uwง'๒7ฐƒ๒ล“ฐ„/๏ะaUาหokลๅไ๋ieg^]>ห1)y“เ โv ‘�nNฯศoฬo?๊›พzิ<ฯvฒGข[–ณ๒ฎ›ฺฺย6<6้ฮOถวน>ู™xq๓?Š๘>›ูzฃย!ิ๏#gGZฦ"ƒฤา†งs๎Rlป.-ู›<Fต‰$<iQR?Uwส$ VA.o@ำdI•I`ชzž4ฐฉง๘ วq2ดqF]๙l๒งSถ”ŒฎœIH๕dบzz, ƒ๊t v4๖Zคำl8yglยฺ$‘RŸ Ÿ„ฐฅiส›œๆแJD&๐ภคสผ aต~œ Fj’ูj;๒|G†<{ฒ&ำฎ,ŽZlลPลr|C๎5ฬญ1ธ‘๊๛FK๙รํeน{ฏถฑK_Fท…]แА{m’ฮƒZ|:œJVŸุช�†WSตฝGo*ึ*ืฬโญWต†ฝฉพ*Zง๔้†�ี๚-ฺณ”z%โ”ญ1K`๕้ล฿…qV๋_ž)_ฝ~{โซปUm^ฝฑVย๘tํŠฎ ๗๘โช๊1B ล‰H|ำๆฟ.y'H“\๓Vญ‘ง ัsสiง!_ๅ๑ร}:ถ้ดู53เว?Ž}ฯ–ตฟ๙สMBVท๒G”…ฌ%ธGชk,ZCเ๋o ๙Œขzš๛^ฏK์ ็žถq๙—๙ญ๚‡šgถŠSOชุฦถ๑�ย 9Lจ๙ป\}ฃลสๆwWตี<ฯ๕“_ิชรfYไb=ศฎT@Lด˜๙3 ;๓ฯzqัึๅฝ@ฟ^"ฬฆž$€E~x7‹ƒ—ฒ4ู?†ฝฯJ๒�็Ž—$ัXyยศ่wOฒ๊p๖d๖ๆฤŸ=ฦ[‡ฎ๎ŸW์H,'Œwuฏyถ’˜ บถ–;›[”[ฤมใ‘Bฌ*ฬ€op๓า&Žฤ>q�œฐ๓k๙{๒ม<ฝi9†�ฯw‚ม๘Ÿ‹๊05ศ …k–cฬyo๘๘ป฿g4พ6งŒ /โvฮอ4วn:*…ลh�๗Y•!ฤ๚ x_ๆgๆ,š–ฆH๎X7ื504JDฒ฿จ๋›ญgDŽ9ž'ฺi'ง‘มง#‹ฌนื๓๛ž ข๙฿อšญนงk๗Ÿค”’ํq3อภš”š6n,ฆ›๔๖ฆmฒi๑ไข)โดซชำๅ๑ก’\^dศx/ำŸษ=ู`๙~ฯWHRฅ&Nฬฑ&)` พี}฿ลvŽŒ้๒p๔่|ŸOัvŒuบaš^ฤwHsฃึๆ+;w–Vแk๊)rฅU@ฅkั@vklต™ู๑Oๆทๅฦ•จ\y๒ๆส๒[vh๕ z๑ขYfXแ<UจGVุ์T็M ์1ล˜Ÿ ?Iyฮำํฬzixx@œว2~˜๛ปฯุ๙ืหฟ๓�^Z๓Cyบ/9]๊7ื‘V๋Jีืึฐบต/ษW๊ๆŠ‹_ฑ${ญkVบหูL˜>��๊9ƒ๏ะูี‰๑NV๐‘Q#ห๔‚šึะ8<›g็ 6ดq)ฒื4Y7–ฦ๚5 $$๗R$n๊|Aฮ_ฃž)ว=๚ƒ;�_qz,Yกžx๙˜=ว๖ฝw…(Œป�™ฬ.L๊ส๏%ษๆ5˜4’7 ๊ฏAทศๅบc๊>็ดว๎เ|หัˆฬืLี0Rต‚–L & b•6ร งNฃ Z ๔้พjŸ†o๐=๑UปV‡กลZ5ฬUoห๎ลV๘ ด๔๙*ึ๘กึ๚, M3•ไ๔Aพ[๒{เU@)Oใ‰VุT~บโ–ล*qB๑gฎxลZ4ฏsqUใ—Ž*ช@qA^1A/"ใเาฟ)tKi ๊mื,๙y˜…pป5ีษ]ึ;xน๘Gs“„ อ์v™ูณืdกดG3๚›๓๚ๆ็ฬ~}ืŸฬqีฅึu‰ซมไ<b+อผcแ‰‚žJRŒE๔m.““1CํgบnŽPz`m_Oc้ฬYM2ศ~™gยPL<YI๔ไo„ํ๛;๘ๅ2“–[seฐ้ๅ‰๐’ *ปž�:ํป ษhิด–�ึƒ‹RGˆ฿ๅ‘ถ&t”jž^3C 4Eบ๕› �L”eMธต4R_#g฿Skึ๖ฃ5ื๕‹”T…ุŸั๏#q๚ิ๖Bืใ^„oื31ู9�ต‡i๖<u๘ฬแถP6—‘Œฮ\๋็Tืาผฟ ซ-—–4 wR„2<šn ƒเSe้ภ หฟfฏe4ฦ:c3ฮR?์v|i๙…ๆkŸ-๙Vhl#าZ“z6๏๒eจื—a๗œh0 นn\ƒgด:้้tไร๊;'ƒy3๒ฺ�ฬR_[Žhแ–R๑@็ƒLภี™ช+Bvพnu:ธโ๔วŸ๑ฝุี“›=€MืYw“ๅ๗ฒฏ>M๊6ึฃ^๒ƒ\Gาt#โ1๖–5H4จr/hFG‚fœพ๖rC๗บqdsˆ๛วŸ“ฺ็ผฏ็?[๓|š•ฦŸคญcŽฮๆ#{ฝJŒ„f†•๊+พูฎํุๅ�A;๒่?ตณูอ.ฃK(1‰ฏIœ>>ฤึ๒œใไ‹๏/๙Fๆ;N#๓ศๅKBOวศๆŽ* Txนฃะgว‡0žA`~>วiจษวŠpŒธdE๗Ÿ?)ฟ็.นY๋?™w*ัX‰`๒ตธ!.VBง?ฒh‚ฦฤๆ๏Yํ ƒ#Ÿ๑ž็šำvF งŒƒศ}>Wืแษ๔?ๆ�ไ—ผๅวฑ๚”ZอŠะตKhี ป*(ฅ�ข6฿ (GašญidำOˆ˜๏พn๛(ลฎ‡‡˜mะ�B<‡X๒ญŸ�ฮ+๋lฆ›๒ปฬฐ4๓ฒ6Ÿช้๎รƒ^[ฤา้๗pทCฬ+%Gฺ‰f๓ถแ‹Wฃแฟใv/7 ว—Gช–›/9l‡”ƒ๕’iุฤผWจ%wฆรฉ๖กฮ ‡z่Ÿห๙~ฑฎ๊์7๔์ิ9๗/ฐหด฿Q๗8ฌ+}๏Y‘V(žy]a‚0L“ศB"v43Nมั อlPษ๒6œ๏๋ัฬ›4(ำต|*ขŸŽTrว์1v^ง'(<๖I๓sห@Ž:‹ฦv๕8  dq\ุนฯP›ู~c๙V๑•{‹&~†x๓e&˜Dzดไ์ญD:๎,ฦึ๎าqcuไ'R >šn>œดHK–๎แ(ขฏ†˜ญ# VRธk_Ÿำ…+Npยญw๑๑ลV“๚ฑ*ทZ{ํ_| ฐ�ต…ล_ื๚$คบg)อ่U}ชOQ$Qถ<1U้ŠทNํŠWS^ฟk|N*ผํลUTS‡อพjั|ๅoฮa”วคh6ๆyัOว4‡แ†/•ศU๛๛a�“C™gƒ๓ไแฬ-๙Iuฏ๋฿™mึ<๏ๆ?Tึๅ bcด~-aฏDv� อO|ษษXฃยํ};Aฅ†—„ทผ^กคiโำคE˜๖,ร0'+nœญ่VNผ a้1!„4จzxุ}4๎ršpฆ,ะ–ุ้J=h&‚hE~,ŠlOห!(ื7 ?ู–˜ฉรaVp j\‹ƒ+VŽ2OแUป์ ’1)โtAทC@~*ืzmฟPE;{`bd๙ฯ๓ƒJŽท1(VปrSQ๚y›ฅ—ฉ้;'๒–‰uwชอ-ๅ๕ไื๗A<ฮ]8Wำ*wโˆ ุ HŠ;)ย0บŸ$ ฺ๒๒sK%ฒ“Jp็Wฑ็„f1uqsB;ฬฆ฿J†&โ84f๘h๗*~}|rฉd%ฌ=Mาญ็ณ D�UไCPจ-ฐcแ_oฏLลžBใ™pสณๅ`เˆ5ช๓่ฤ“๏๙�#1rJdษ?ฉ๎š5ดd#7๏Ÿ#ฉ]…iน์ฃlฌŸฯ.Ÿวฬธลt‡NT ฏsถฤxำ$แ‹%&ธท…ชA*ง‘มnDIyFง๙cไญ_ฮ:๕=ฏ3๙Xท่PU^.@š5>ื ๒Z“ำ-œฑว,q•F\ว{•) p’”n‰ๆ/น“yƒXทาl๎.'—า!'•*6ฏว166–` ๅอํ;E๒๎ตyงช฿๙ซXปYย่} ku3สิัPu=vหแŽ๛ห—ฏ์I็อ-ฑDY=I๎ญ‡k>b๓7š%•ตอZ๎๒%฿ะgใo๛1ญ๏9๓อำ่ฐiซ‚ ทๆฎbxํ!–xใฯaRฝ7๙เMฤสŠoG๎Š3๐Ž;‹A&$๕d6ฺq #n€ึƒฆEฦžKLb‚๎ฦUนำฎๆฐบV๘n#bฆŸG_‘ภ|šeร1S�‡ง๙kฯ2Lšg™Q-ฎ˜…ถีTqŠBz GEcใำว.วจฅ๓tšฮอเxทGQ๎zQTง2]H+i•ฉ‘…+iใŠV‘๚๚bซM|7๑ล]ฟค`U•?ำhพธชร๗PแUด๖{b‡ะ๚$ >Œๅ‰PทlPUTm๎1J จ๖๖ฦ’ุ๗ช๑ใ๗ŒUpแŠถ:โซ… ช1 ๓๓rฯ-ฎ๙ทFฏำ๎ฟ_•j>hD? บยๆ=ฏญFlหม๚Sื{7ฃ๔œฤnv๏ฺ๒ฺ[๐AถฬvE*z~™ญ–แ๊vณม *นTr…@cหฝ#๐๙˜๔Ipๅdี>N�œ˜หื๔ดฏ/๙~ํ์_†๒-VโI%ฟCพๆ›ิ๛ ่ปE „ฮb๘jฝ๏;ํ7heัa„1š98ฏผ ญผ๗ๆ๖฿๙ฤ›J_สm,jว๗q]รฃsec๕hศ�์_[—ยhษฬ>฿ŒFค๐๓ _ฝฏฑ็’Z๏ฮฝXล0`dRํฤSˆฤิำ4|.\…>^ั�œžOหฯฬ] ษ1่oฌฺNm\–W™คใ@ดe-วrฎ>"@ไ3yก์Sฉร,†Uฮปwธ:อ~-&Xbณ1ฯ๙ถh{฿fBฆh–FีไTE2๑•9Ep Q€ุ€N�eLัStถ5๘}ฝ๏ ็‡u๛ษV7,Fี๘kพ]ฆ๚รพ์3๛วล^J‰…œrŠฏ:๓jnI?Žnณsง{/ขm๙‘๙ญจ๙3Z‹Hะฌเkษ Žkน็ิ#๎ส”ปvอž‡ณใš<S&ž+ฺOh'กษข จO^cชD�œƒื‘uํ{{`‚k)ฅFภ‡FโOัc–ๅ์}ฝ๙บูc2>."|M›=็A�œŒธน‰Lบฃiฌฏด7Pฒs๊Œ�aF;าพ9ญษุนมุ_ธป ~ะ่r๎gร๏>ˆ๒‡ๆoตเ{8i0บฉ จใ-ษWํ H้Bพk3hณ@๚ ~Mาิแฮ.‰๘‡ะzšด{บ -^ย๔…,โๆzr;;ๆล(๓ไ๋ฒแ'pห฿Y‡ˆY'ˆบ3ศด,>ั"•Pmำ"ะ0žt“๙‡OตF–๋Qณ…Is รbjฬ:S็‡„ž@นยK ?™พEž๖ืDฒ๓v•ซฬmญ๔๛;คšG˜|LŸป,ฅ7&™dดู@ณ}2„,๓1ำ๕<๓ƒฬื:…๎—ๅห ›T”l+n'ฤฤ|๋Ž ๆz=wc้†8„rไ‚ำฌฃด†ยˆะQย…+‘$–Yฒ“l’๋Qดท6๊8~>ฅฅJฃŒ— �›,๖šๆั#˜š้F*HงฟทZm•ส.ธศFVŸAd…ต’Š{lkพ‰e!๙‡๓ ส~JW›ฬีพ—n"Ipิ2ษOฐ€]ฐ๙3'“&cPฑ˜‡ศˆ๓@๙๓๒ซฯทื:F‡ๆ›Xต[d-…๑[7™Iโ}/UจลOฺ�ิuo–j{/Q€qN;w8ๆ†IpยbGธ�oม์Ri‚t1:ะ ˆก๏ิsZbฬf1,็สฬฟร๚„†IaRtซฆ;ษ๕„“ิจ๛>vฬŒ?„NฟL๏aศ๓วฝำ2jำ๎>Œ –ำฎ+kz๔แJา?Uฤ bช}ศ๛ฐ+Duฺงญ#ฆ฿N(k๚Ÿฟ_ั๚#S9GกUA\Rฎ6ฎ)^Ezbญึ*zฌUx8ซ‡฿*ข๘๕ลV]๊z5ตจ2วง่ึณ_฿3Jฺ6•ฏˆZcัˆ‰™ษงโญถณ{ๆฝwZ๓M…๏หจjw^งฺ-q!p=ธฉ ๔fื$"#Rั` "9Obั"rัz|iCะซะ์i}ณY2ๅOaป8&(`fะฐ<ฯ๓wชฑ๛$๔'ญ6ๅ1ธคv~r~{yuŸฬฉ!,สบmดZs\#จX๙ท)|ˆU�G‘วdโ๐๔เ๗›|๏ฺฝ@žธcก/๚ฦห๔›๒gG6—พVŽุ‰"m>'๓Feซ)D‘)?ภสzžCดgวžd๗ฝd8a‡!\�>๐>/bdŠTโ#‡เฆˆร’ัำ๎ฬ0ๅD๗{฿•บZ๙ฟr˜วy?ญ`|ูgh๚U4พ™<–›H„ษํถp๖v๘ ๙ผพง‡?l€Nั ฅ_?์~ล[ทย@หBV๋ฑ…iพี๑๘จO]์์“วใg‚~zฑ_+j“–)ท•ถŸ„59v^P๏๛3}ฯ•<ƒe]ษง8A๖;Vค๖งŽmตฉปฉš€|๑๙ำไ๋๛ษฯ˜ฌmab†;ธขน7,~i›หิ€8 ็ษเฏ์นๆญF1f#ิ:๏๘>rŽHูจq๖ึ‡‘ุGZว7‚Fฌึศ‘ •h‚ „ P“ฮ›๕<ฐ$&–ำฤ์โ$๕„ไ#ำๅJ†vvR‹ึฃถ,…"lญญ—ฤM-ฉ–Xํฆ๚‹˜ฅ"A*Hิg๏ิwยM์YGmมฏwล=M_TXAๆ @ส‹ยœ?v’Q˜” ‡f ฆG‚?อ ัิeiŸท๑ะ1ซ›วธŒD๗อ้ษ๊,rศ์ก€"ฟ$|˜ฆ™e‘gๆY็ๅn—ๆ?3yพรG๒่|ฮห>กญ"ฝ- ƒ4ฌcฤ*JŸ–av†Xbฤe=วA]ทbaอชิcกิหธw€:พฺตป:วŸ๕[ษ*mดคŠยิmZP ภtฮ/$xq฿ป์น=ซใ๓J?<?3ๆ๒‘ฎ’ฌฺๆค œตถ๘jf ฉ$ท‰ฬฎษ์๑ฉห้o“ศ๖ฯk~Gs5/้w๘j๓๓Oฯ—w‘\อๆ‹ลxH1ช0 ฃตU@ฟŽu‘ัแˆก�๐sํlฅฤr—ฺ�๓�๓šณซ,yะJyBถฏ*ฌlI4N›฿๏พ ํฤ‹4ญูPวใ๔า๏ป/ดฒkoOจnเGน๗ฝซ.—ฅ๊ฏ->ญ :…ŠY€ถฮw>)W{ทม)žOศK3ๆ๙ศอ{MMRxRผนฯ'JวO™คhใ^™Jšฑ"ตฆw‡ระiฬ€ไฤผ~L™;SYยdDA5G๔ฝƒ๓Wq:๗ษš;kพKนน๓zบ–™rฃ๋ƒำ3Zผaj@ฅงู9‡กํฑ–\9�ิr๗/Uุ0แโำd?„ฯœH๋ๅ๒{Wโไนจ๊V”|ฟ—US„งๅ็˜'๘ฅไึฬw0DN่AFุŠ`๖๏eB9๑ ฏจพงๆวณตำฬx2nz๚ๆ›๔:๎ฺN\ยอซฌึาŠŽ.ปŠœไไ)ฺยCpyง้บ„zฅ…ถกโ.ฒGฒ)ฃฏะs2โ้2โ8ฆbz#<rLVŸวถ)ZqJฺ~ฌ ัY…V๛i ํะโUช{vฆ4า๚!๚ฮrDผ5*‰ฃjšn+ŠWฉ๏ืวT๛qV้^ธซฉž๘ช๑ำ฿TQำฮ฿๓–>go-G๙†ึ 8_yส๎ำห๖ฃนŠw๕nH๙E๛๓#K,ฑ๒฿ไ์; ษฉ๙ปงๆ�•ฌฯย( ฃzึ›‡2๕๔ผ5รป4UU‰ต ~3๛ nw?EO๖ ึอr'ทั;B@B hTŠ…j€jM;ถหโr8ฮํ |Ÿ™7>N๓?˜?3nผธtูงึ๕maกIŒO41—2ฮWˆ H 4_๖#;ุj1ใำŒ—้{ๅšžฯิgํ)ใ”MสgิA1Ÿ-โรฃ๖ฯส๚4–:VŸjม=;khใข‹UPˆMว*v๘›ฤ-3ฮ๒OŠD๗ฝ†ง(35๘ 'Z•ณGg?฿”jvŒ0(zš,EUOอ˜๘เkม rFฯ3๘็๛฿•V’๙—rG†0ณฯๆ{น.&iPE#ศ2๕ebU*ว`รฎwฺา1hO”Cฬ้dgฺฒ—tคO็ํ:Zฐˆืก๛,j�ถ๛o†yแุป�ห็/๙ศ“ฟ’5Jิ ห๏(ฟy๏™!๛ุปล7)'ฯPฒhดH#5 Dลi๗อฯ?Ywนฦเ#“@†˜!ลุ๚จีบื๛0G?๖ใd$<รฮ_๓ŒบW˜ƒ๊:4ขjŠต!Mดท๗Іี_ใ›m'mส™Ž!๖ผ‡jv›TLฃ่Ÿxไ}ใ๔‡อz฿ไwๆ—ฅฌ]“PทADฝฒ"TbณP.เ R3{‹ดด๙9Jฝ๏%Ÿฐ5˜ัฤ;ใปปะษm๊G.™s !ญฅ‘)8O�UFb:t9•<ˆu๓าg‡ี ๓Qททบšxmcฐ–K“)ู�Lฎ„ศ๊Tl๖p>ๅ9a /ฃยD€"oปซ"ัผฅๆ1Zูh^\ีต;^(ฆฒx!‘TœŸFWb84/F5$qp@+ษจวˆ)�7#‡6R!+"๛ถ๏๎ฏธพŒ๒ฯแ฿ž๕Xกo0\Eๅหk„ 72“จชจhฌย ’ฃ4ู๛ >ล๗;ผฯ?{:๗n_]ู[yc๒ฏษ๗~Vำฏ5Sจ]ศึnˆZN ๖Glๆตฬš™ฯปธ{žวฒฐbว!‹@ฺ|ษ๊๙๋ษฎZฯQิฎ_K2ฒยซP?†_จ๚€๎M˜พTฝฟ๓GๆE™�ษกgฆD W‘qพภฑ3ช์ฬcœหไ~ัฮzŽะ8‡J๘๏7ฌh—&ๅฝBยh่ฝปz์•%œฏฉ-ะR‚™‰“Y)d=—ฒ๐โภqP6 žงฯ๕>u๒>ญqๅฟ:๙{Qตik}N+h๘ณ "YDg•,ธ$๛GถmuฦLR‰ไCฤ่3>ฆ%_3Oุฟฬ.๊๗๒๛_X"๚ฬ็J™Pไ•ZตR ฟ†pzIš>๐๗~%JQ๗‡ๆGใ?™ฌผง๙ฑง2GcชGqc$๏ฤ2๒ซจVช�I>9ู๖ถ—N@ๆ7x๎ฤส!ฉ1p#๔‡พe�œฐจาฏgะมฝืัV5MKLZŒ‘"že(c>|็ฐ๖&ฆqฝฃ๏ๆ๎๒v–Ÿ ภใณๅฝ|_]๋๚=ง็›ๆ_&ป>˜<อcจ่ึw12„š[”๕b1!ไ575จฮœb‘าœy9๐~NQŸื ˜Nฦ@๒๊~ญŸฝ’76zิ’vฏ^ี'<ำฃฟขS%สBk'uทธIข=ฉ*_Šๅ๘ฤ8}กใ.๑๗3\ผบ๕‡MxbซHv)ZiLUo๐ภซฮธญญ>๛bญPxb—ำ๚M�<ไ'ขiฟ,)D‡ฏำึ™ ถชง๑ยจ…†*ฉวผ(u=พxผtล ภฤ1%๙ฯ�9ฟๆ—ป๓ๅ๏ hš|ฺ๎ก; ‹็๔`,=ขŒ๙ฒะCiL๛ฟIzOg๑ื๛อ|žๅศKzB อ]ูˆโชi๗œŽc๗8่E์šbฌnช๔!BrP)ต+]๓_=ฺฆvู–Zร �“ัPXtQZ‡ฺ=฿|ญลœ‰3ห:xฟ‹Sต๋Fc’็ˆๆั๒ฒ[m�ส#ถ d‘{8:T„LŽฟ'ถi‹ ฃฉตMi_ผำ๐๐สtYnัW๚rภับกWRผJ†ไ:QTšNLlวco ฟ�œu๒?‘<้๙ฃG<šลํดึฺ}ฌฯ๊[ฺ%ึไลหใ>ตไ”“พl5ง›>ŠG`~uหไ‰Grห,cR—3๗ืฟ›่9Y–><y๒†ฬ6;ฟ~jค˜€Kไ฿๙ษษยyA-ภโnๅŠ(ฮ�iคฏzœษ์๑๛เ๕…3๗<ทห๐SJjBชRN‚›tฏฟož]–^งw›iณN ร†ฆหZ ํ๘ๆ4ฆแๆŸ{ุtํ5cท Dฯลvย‚ฆ„๏ฐLf]Yู๎M ๒๚ฯŸ่๐ฬส ำr;wฎOฤงYธO2ˆ*Z˜สษcm<LX๐=I๊*ฆ๊อ๔dฃ˜ŽLFฆ]ๅ ท-ไ7w^_ำeพ‡šลจข๕@Z ๒Rภ=๒แจpูฎ๋Yg—>พํูถ›ฃXย"ตตŽ$ขคจTฅk@ช�RๅHฅw\ฆR๊\yๅ”ถ'๑๘จป4‚@ฎ„8n>วฎ๘ ˜ใ•—s%ฏ•ต˜ฆKvt yุjปM๊ศัv4O‹ไ๙สโ๒ํ‰Z‚๑+นEฎํVจ'ภๆำ/ึ๎งfŸ&j๐h_™^bีต๛ธQwjpฅEw๎GNูีโ‡ฤw>IชิวOฺ™rK&ฟC๓žษๆ+ฦ™ต ‹+Pกc…PP3q#“๕หqเ†1@:ํoj็ีJฬŒG@ ฺSฟสŸ.\๙ร๓/ษ:J@”W—๎฿Ž V๕คv~๓•๋s 8'3๖˜๖^ŸUŽ=ฦฯบ;—๎๘ำ"ธำMฌƒีŠd`ั(A �ว<๐บS>'›๑ห๓ซ๒kฬ฿•`ีo_Ixฅชอีิ(Y_ฌ? UYjEZmแ�f๖Œ50`n?Kอ๖—gห ŽHW;WK้๘ๆ๐y9sE)่Aฆูฒt—e๋”vฯ๙›ๅ-mKj7ัEฆiสจยi‹W“sญBฒปfhำฮอ ;๙;žส1ิI฿ธ~พ๊ๆเHŒ,m)ฤKšิฑฅ@ฏSžn^„J;ษื๓ฉใีฐI๗I๐9<Wมวํ๊'อ้g๕ๆKฉZp%m<>Œ)ZO_ีŠV๕ฎ*ท฿พ*ทร๎8iฎ็ถ*๏๋แŠิ๚ื๘Œไฉ่š‰#ษ*ส™0„J~)E UVฟF(l Vื๔b…DR์จขฌฤฤแ K๑ซ๓๏ฬcอ฿๓_˜w้/ซeค๊่š{ิ่้ฑฌ? ้N|๓qฆl฿ฑฑ˜bˆ#๐S} EEd*ิj๊Xํเ~์มสlฝ9ๆ—ๆ˜ผ‘คฎฅg่uฎ‚๚’FอฏVN"ƒ‘๑ํ๗f_g่แจJ๊Gm๖‡ไtพ$+Šภข-ไๅwžฌu8ฎuฝMึ4ฅe๕ฌํฮ � $คฒ“ทF3k“ฐp˜ิ ฟŸุ๑Xฎฮe๛ฬq1๎oง›�9๙i{<6ฺฆซๅ2๕{wžh)W’hJื๖zถjณvx๏%๖ตฬ‡oi3lx |ล˜}!กฮB~RjvัMe๙ข4“ฉเ“\z-^ฉZHpุ๘fท'e๊`Mใ—ษธfม’ธrD๋๒zฝทๆ”ีu๓6‘๕?ณัพทTd ฃแbใrง1ฮŸ 5ยoXœD๕๙ค฿๒บ?)ํฎMฅวๆ?—Vqp‹ู่ธPp, aB>Ygไณ‘cพE…G—ฟxg฿ค,uX๎๔๛ุoํ%'ำนถ‘eŒ•bฏละ•4jƒN‡lรศ;์˜š<฿!ฮQ^+iZ!H๚ฦซฎ๛|$ทู๑ฎe๖pผ„๙ฉ์8ิe๐๛ุ‡–ใ‘์า3Qห์๗ฏBiํ}ฐfุป}M [ีt,ษTEBAจ,<`d›ฉิd๛^ฉc 5vซ~ษ(W๑สมt๙%{ฒXฺ2x+๑zิธoM้ใZdญล1=Q Ž$ไ”5“J๕โโธAcทU0ชซฤŠ8†%”ืญ;ŽฝฦJ2ฆภ[9ฃTใ5�–ฏQุ1ุŽใ%อชp=ิ˜zdS‚ญ)ฤัNวjx…ศ_๓zยลๅn_ีุ’็ฎ฿@ๆ~‚ช์Œ|"S๎๎x/–’บŽผ@Wทˆ†ก&ฅFว3๒š™v'xƒไ$~t๙n๏I๓]๖ฒษ4–ฑ–d!a.ฟ E‡รPฮu˜OQ๖๙พQํNŠXต'6ๆ3๋[sษlmงพบทำ๔๛y/oฎ\-เS$ธUjHฉ9œHˆณฐyผp–IภY=ๅ๚Q�8ฯ๙%qไ๚yง^ทใๆ{ฺุ3nรต1_๒ภZž3‘ํŽัฟw่iA๔ส์ก ลว“๛ู ?ั๓ืไ าW’E›ŠV•ฏ๙>ร ฯ^์s ไงๆ๏#yฯZ=ๆ;ตๅกตtฉSษY�9)฿วภๅ๘sฯฤ h‡2กD\O0yว{๓ืฮ฿๓‚:ํว˜nฎผ‹ๆ}>วหื<d[-Qg’โี�l+ >ขซZ7bM3ฆำ{F+,I๊*๊uZŽศล’|X็ภB ฏ‹้ศ฿๙ฦ?)P‘ญศรฬw“’�‰g€ตI‹ลiO�รซฑ๑งํึหซ๔0oฟฟ๎s4๚L:a่Gœ?p๎ง$Fแ) ? “wอAoo's>pน$+ฆสด=5฿'‡๊๘0ํ๎ฝ๋Y’]*ธฒ[ืญ#ญ?ซฉšท‰W}ลZ8Uoั_ี๚W92‰พ4๚qฅTT?vD งlRฌฟซฆ*ผฃU|๑ATลŠQี`ะtฝ[_น`–๚ …ึฃ3ž€Zยา%i‡˜คยr๏4ะ็—Sฝ›Rธ$อซ\หrMI\ศำ=A๋ปf�(แwl๚.‡‡'ับ‡XYEx�8๔ƒ้๏ใšŒœดน<็๓ำL]Wษบ‡0ตดQ=น$Ž%>"XŽภฯุ๖D๘r7Cํ—C’'˜|?๘.CDฤŽ%ฎuม๒Pฏ5ณHป'.|ถ ๎(รc๓ยBำ0ฐM:YXผกบ7ืVใ ia๔Q:G +ทNธ7œˆˆ“๓๛ฉจX\วcq๕hฺโ้`I!ˆŒข',๊wุฉ๖ย,lสR฿๚ฉ sง\ฤ4๖ข#ณงEZŒzG—€+_ž&VฤภŠ<ฟc๕ืqWGปั'๔ษdพŽๆว_บบีt‹xM`Š๊JฐE$•ฌก๋S๔gŸ๖ๆA=Iฺˆ�x{m4pรpnอ้o_ฮK](ิผ›`ิิbฤ'ำ_ฺ?NูGgฌ๙=cW๙ฑGหB–ั๒ขu๎+ถูNnnรSฬฝ“BฆV<#฿ฦ ฎ๙ฏ™า๊dz%ฝcDxžอื‰๋ฟธ?†ษีหr˜[ป).AซzlGJ๛Žบa,d&RวˆfจŽ ืฎม๎:ƒŠQ๖๎ฒT0.i฿โmพ๊ำ๏XHR.Pวƒฑ�’Aซo•4'ฺตรlf:„ฑ… H๔ฃe๘@sทjแeŽ&฿ �ฮCLใOพ #๑pฤ6็๘๏3qู€qฌาmฆ‘๒,ษrา๔ุอTวmWฤS =2H๕*ฝฯ5?-ุ๋QวIrฒฒ,ึ๎ก’ESTๆด"ชIสฑj%Œ์iึฯM‰�Gq'พKฑ๒ึ‰47v:]ฅฅC 8ึ‹ศoAะoพGQฎษQ$‡ใล€“Š&นFŸIhถฦQ–ŒCธ๛Bฟ<ึฮV]~\„ณ[1บ–cอIุ† l>œ2แไ6ฝง)#4r ‰+ถวjw๑ห๎่IwjkAิ๗ล ลซ r‡นภYU‹\เHงฝ7F๗ฏQ•คฟสผ—อุ๋Iipะrxฉ๑๛ˆzษฬย่ึœ ใŠฌ"ปŒ X@งL)S๊qWR˜ ดpซ[เฅึ๚+รqโ{็(๔+ย๕ ช…๛๚เJแOคtล+บ|ผ1Uเ๗้ŠชƒพT ๐_๙สO0.~@aฬ’˜ฎuh4&„ษจLจิ?๑[24ฑโห็-ฮฯฦgž>[ฟ$ผฝ๏bXุ*จฏฺง†m๓ŸCาG๏]†fTerฉษ”‘๒'๕ๆฃ)ข์2Iงš<ฟ๚SIปฑธS$sฤcก๘นs‘๙6๖ษiณ๐LแdŒrฤฦ\ŽฯฬcGบ๒ฟ}กjJaบาฎฝ&ทแศj๏ี9bศ2ฤLr/j๔ฒาๆ–)๓‰๛:’ุส0†Vd๛J\†%จ ฑn>4ฎ]n:6 !6๗5’._ r(bณžช]v#Šฒฉ#฿d9สฺุรn$๔w˜ŽHู’@ ญ[qxฐฃE{W-‘� y‡ก~Xyฬ฿›žl‹ษš3ดถw ฏๆ}X€!ณฒW˜๘@8Š๒๚s[ซ†“น๔็ป๔นฺ4ตS1ฟH๚pผŸถšf‘e iNiŽ—คฺวmee „Xใ‰Dh59ๆูg)“)nIฒ๕๖ แ๎|5�9ฌr๒tm&า\ฬโคะ(`lป4๚&๕ฝ™?ญ๚_•แT‚Uุ -O๋˜Yฅป•ฉ;’๖ฝ#*9*ิ€Vปtกํพ`“nS+,ั8z\OญBŽžิ>#ซfOM@#~ŒตกzWรฆ@YXณ…ญXทP‡ํ|ˆ่N,๘-9ำฅ2";๑ํว๖ˆฏJ6ว๏ลง,h์iร?๎พ6งย6$Ÿ“n)๓ยึ#•๊Dฌ,hVŸš5๊hON™&ฬ|฿ฮAฆ^Q95๖Žวตk›พหฉ๊"x4ณ<๖aพLวoo HใZ๒ท\ฟT,—.41€๗m=Cว AwW–ปb)A|๓Y.nM‰/Bัง{V•[Ÿ฿EตA4qQ๎7Tๆ๋ณ๎,=cJ�๒แฤ"๏น๑ฎU'Q˜งสDœPYพnงโ@i#fae!๔ฯ@Zv๋_Cˆpๆ,ฃgธGจHQ@M|�๋๘dƒWG็วๅฏไ5๏”bศ~Dี}4Fท:ๆฃn9KamZค`„“ฟ‚๓ก์Nหฯ‰zภwŸิ>๖ฎะึG๖[Žผ1๏ฎ๓ำๆ๛ ๒ปQิuŸห_"๊บน‰๕-SAดนปšgะ|Jอนจฅ}๋š \3N1ไ$C—#ฤoพ–โู~ƒHีฅ7:™d๛ใ9N๋ zฝ๐Kเ๕Œอt-b–ผp%oใแ…*dืฎงแพoุผp*™N*ี}๐ซื๚9แQ\ๅ‰ฟ–๔ล-ืฝ{bญ Uก๔Tbซม ใJชง่#พ*ฎ1`_ ฮy๋ย%~]yI7›]ืงี.�&ข :h:ƒ$ูฐ์่B{‡ํป–B{ฉ๐๏–ํœ˜‘ˆ`ฦญZv์Oพdg“่Zzr๚ห–Œฉร4ํšŒฒNIwฝ0้ๆ8ร N*ิWโ`h)_~c œ.ผๅ�ผ๓‹๒ำฮึ๒้‘‹/0ูฌ†ย๕�แ3ญฦโ‚ฅHญQ›ฮอํS€ิทQ๎tซู˜ปF}9)~‰wต๐Ÿ˜�/ผ้ๅซฝ'X๒๕โ-ตั† ˜ผW€ศR ›”l~‘ใf fัธศwื_‹รj{#Wง‘‰"๖#p}ษEถ…ๆ=n่ฎŸกj:ะเาฌฯศฑ^!ฉฤQ]ว๙†[<ฐ€ณ >.>=ฃ4ช8ไOธฝำ๒๓qำ๓7ฯท|฿ข&๒ฮ,‘ ฿0๊1„ ฦd„๏"€U”€sšํ_li๔เ๏ฤ{‡๋่ํ4‡štr~์y๓>แ฿๏~ง~QRyS๒Ÿห฿ก|ต+›‡kบฬด77sำgsะ(ฉ ซ๐€~œใ5ฺ์šฉ๑L๛‡@์1Cx1ŠฺOyl๕ปฟตXQWˆoฃnนญ”™ฤY~z~~\z฿˜~SจV;ฦ+ัˆพ=๓kูร๗S/iู F๗Ÿน™yrPชˆงt‡ $“˜yEท๊{N‹*˜Q… ;|@]๚ๆ Ž๎8›*„Œ@ฉ@@ญz€l“vP—’( งฺ ฤ๖›ึฟF ฆ์Q6„ŽT%c.ซ๋^๘ช=”๏L[Œkt8…@W†โคฒo๔Šah๊ฺHฌ†&aธฅ9)#๏ลลส(ึnc‰eฉๅฑDmฉJT(Iศร_�ฮ@_ฌึาฦฟšถ$aL่;*;ฝ_F’^i_–M,ฌd็๑zhBบA\ž~eหฤ=!๎zD์cศ!ˆiZšิฺฃ5ณธ™b๙๓_อ_˜?–�šๆ‹Id/๋ K Œ๒ฺส๐3Fฅ oฟมNo?g`มฉำxg๊๏฿ซฤ๖ๆทYฺูธ็†๘d�ฃสว0›.๏'Ÿ”_š๚Wๆ–ด[Nญฤก;๋T?ผขฃ‹ƒC^โฝณึ่ฅฆศbGปอุยx๕XฦlGำ/˜=วธฝ๋Oธ‚๋ำๅ‘U`เห•4๗|ยง 1๓fะฬ=%’ฆ54‚ิu5Vลzxภ<้ไŸฟ™zwๅง‘ตo0Mx‘]ฌM‡ ฃˆธปq๐ขกธ๕้ฬอ”๊rŒcใไใœ1—/ำรK๒ง๒g๒—_๗๓ลแืonžัๅ:‡š<ห$m#ค๎‹Ÿ‡ีจ)Aื ฮหด5ะะb�_(ำ๎‹Iฅ–ฒrฯœšป๗๏๔฿้ฏดฒตฐฒตำmaXญด๘"ตตทŽŠ�งEฆy์›<หบโณhKIฝ {Eœฉ าซฑ๋Gช}=r5 ฯ4xฐฬy=„Š;ƒLุ<๊ w๐ลVปJ-ื็ืV๗=ฦ*ปถุฅLํ๔b†ซ๓๋…/ะ๚7^�†rDู๐qV‡า)Šถ }ฑUห๘RฉJำUQฺธชธฐ/หO๙ฮquฮ/*y}dค~U๒ผm:�yฉNำป*นถ์่ิ${ฯ‹ฑ#Qพ๒๑?,๎‘ž$�j[ฝ>CถG?7ทมT๚3สม Q%1h๕n|3K™ฏ3ืlbg๔ ญF๛ ฟ€1DTศฬM1šช‚x�8ธ฿ลOL"nศฃwๅ:๐0นตŠแXซ?ชŠ๊Tะ‚  žN9ˆ6 (๊$6ต/'i6๒ m๔ธ#•ฦhโ[ิเฌ:_ไฮywณžฎdo#๘nฯlฌ‘c5๋๑FภPWปๆI›9Y~=ษ๕ขง&ชำe4่ ดไ’_ช0XdRฆดุSฝ{๛ไ gˆYอฯฯ ™พ_52งฅpม< +R;ๆ๓ณ€๐$๖z#ถ?‹7๒๒7ฆc$lK๎6v๊s(r๓DSฺ<ป|]š‰$ญ�๎6=ฉ˜9#\&ซม่__2B๊ถrปงb๎|+•n๋†*6Hb๓jบฝผ–๊„๓~ U'q๖OLย‡;Tดื,šoNwE2…˜jzupW&š`XdฑKhแL�’๊% 5ศ‡Q˜ๆ>ฤีnชฅ”ซxRฟGLqฅ?ฑ„y‹RAฆฤ…จwo Pvห -ฯาใ6)๙๑๙}๋-ยWแงภkP๋L้๛2ํ{N\:BT๋ห+]2ยต๘aŒปxฃวง\ง?ิ\ฬ;cธ=ซAbฐฦฅ‰aCนุSททLึไjอ›y—ศ๚Oœt›3UถŽใOิ"แ7#๑ฟโย„0`H#prZ}TฐHJ&ˆuyใ4,‘โŒถ#๑หษ๑uืๅงๆฟไว˜ฟฤ—บ…ี๎ŸซถI 3Tญๅฑ•*H3ซวฎำkaม˜�|�A่๑™๛Yูำ94r3‡w๑{ฅRcwธyGs>๒ย2๒w7–;‰tษย5P…w0MN ถววร0ณ๛={โŸฯ๕†0ํs›‰๋_จ๎๔ฝCsษQiท่~^ึuKด‘c6๗ ผQ˜ไนc2Iส๎ญฟJฦ‡ณูฬชRˆ?ฦฆ]ฉคซR;mU๗๔ฝ‹็ฉ—๓/r_ฯ:tฺผKu%ค\ํดปE˜YุลNN‘ผ฿W๖˜3;m›kมู˜O3ิีŸวุร)๋e–ฃ๏ตืํ>{฿G้ๅ?ๅ–๙oๅ›ะป*'ีe+C,ํBิ'ฐํœ†ณS-FC9|=ฮร6P@„EDrงทงล‚ำฺ ำq฿0ฅ&ธ?|ๆ#ภก๔ๆŽFจโภิlูบ"มOob‹Ž๑์wณๆ๓!gแ.?~*ฯสธฒ m๗ Rxำฎ๚k๏…V‘ฑ๑ลV๏แ6�ั๚5ZSožrD฿q_ฃhํลix๙๔ล+วUp“ํŠซ ล\~ผ 0/ล๙ษอIต/๙ษ_อ6yึUำ/-4ุ•z*ZฺD8 5อŠ5ฆ™'ํzNส �<’Ÿ+ W Esว…jkิmsR-ํ4ไS่,ิ'มศญBƒุWญOži๓Y@{ฆˆภFœธณฉ๔j.ิ<ฉZŽ๙ฏ%า๊์ึาๅ€ฉะ7ูญGC๑w์G|œใ ดLณ๏ทฆฦœI Zะ๎+ำj#…ัw[dh~{๘ŠtฦะQ–๒„c‹ษซQุิx‰๙ใlLzงPสช6<นTื฿๔8Dฃiฑ๑#๑€SAิื๚`nรฑ~cฮBอ%—ๆg–ูซWK‚ไํE๎:็Gู#‹Q‡-/ธ2?+๊J๑[คWcธ๑ลฯŽŽแe…‡ทhzํซกŽำีJเ €sqซงิใŒถ&ž™gญ\LA*์"(๙Œว"d๔๑๑„แ‹8%ญธำ๖]jkํํ‚ฺ†Š$ุุจW’F n+เzโืโฯกV4s๔$–Q๐03฿ ‹อฬ—ฯํ)t…H5'ฏ฿MŽŒ—G˜yสๆ+i#~%ุ”'‘๙ƒๆFrvบ( ฐูป’[‹ก๖)คG ฮซAทŒT;žฃๅ9iysฑทˆšw%@้šํH๕—g„“Ž7>็ฌ่ˆ†Hcซ�H.ŒhE?ฺฅ3e9viั,ฌไ"ง19TWฏz|3 ศบMDไ>)šUดฌฑ๒โ@Vโhv๚; œfโŒฒg—๙qฏศ~sบ{KOืsi็๊๒Kฑ�1‹ษจฌู`ํŒ๘F[wMT4ฺ๓c=^u๏`Zgแw—ำV22jยPฑีแส€94‚Š๊ิะฎไfi๖‹)p‹p“tX๊@K็๗žถ๛๒ใ๒฿ห_—v:w–์ฮ;ฉ={ษ๐yœ’yธ†ี ใALา๊u3ฮnfสsLH�๎๏WBกYซZำฏ†c[ŠASž>Q3PB„ ‰1;ฑ Rlไ5'๗lNีงัrแ/Sุฌค๕ฌฌe�~[B{ อ”~๓YH2ˆล‹Gฉีล’ำ๓ภ•‡ธ๛๑Uร๏ลVื ตŠฟา๚6s๔g(^…ิ‚ป๘โ•ภ{โ–ฦิ่ล ‡ŠUWฏ๑ํชธล‰E[ ’โฯํศซ๗2Lฯ็ๆ&ฒฺฯ็็ไฅL’yWFZ๒งฃ9‰h{์™ีbวรฆฦ?ขวegโ™ฦž‘ไๅข+อ(@ฏZ\ิjถ{ญ$ฝ6๚G)nฑฌAฝ2ภ๑ฉ$ฐ๎H๐์ir m‘โz๎™~ย8+›) ะwุ๘}๙„E:ฬฐe๑อKU�Oว_Cพฎษ•ฤnB2ปฐ†G!น๙ถDตไ‰ ฆ9"“Šญ)วu4$KS๏โ๎&$๘*k@ ^ิV} •ใcฬธ€6?ฺ+‹ษ ฉช‹w ีภ฿ภž+Œู~fxซ~j่๖๑ก˜ฺฮ์ฃj|akCใf<yz,?บ๒ฬ‡หบ๛4k ชึซ๊TƒAฺค วฯ–=Kถษš6Kt{-rฃ?Uข]ฤhj ็ร0d`].yโ•๎๖2-be"PX)RฤP๔ ๐A“$ฑGชaqฃj์OŒี…xƒO๒บเฆ๕8ย์5UR‰HศA^lHo–ฤไCw‹™%9ฐฒีc„s๔คg๘”T์OQ^™7.\DํjrhS\ฺ๎๙ว~‹Zศ&™ ฬฤWyŸ๔mF+"ะญนทŠ6-(ฉ‘˜ƒ๖ˆ ๅ๘$h5'{ฒ๊ะำgInไธธ๕\ฏู]ฉเ>Œ๊๔S gPใฦMฝWษ,GำkIG\ึj‡ฌ๛ฎšW†5>็ฐh๋๑‚jU๘Tu=js'$ไ–ฯmะ๎Ÿ๊๋7ฉ!ฏ"�ฤŽ`ศ]>ฃป'fe้น†$)5,+พ็งŽ!ภฐสญQ„H€MA๏}}ฒN$ศฝำธUcj,9๒ฐ*Fฤืฑ๗่p๑4ำ๘‚ธ4ฅ(F฿EF6ำ ‰#•+ฐฏSMว†๘ฑT,ฬงแฏnป`,h$–ัN„Tทฎศƒๅนพฑๅ zSิฒo5_แ› @tš‘Yd<ำœ“JำŠV6ุฒYฟ†ตM๋…["ƒXwลVํใ฿๑วuำ๚:ปŒๅ^…ณRG๋ภ—~oวocŠ[ฅ6;bดฌฝ†*ฌงถ,Jcฆำ๔…‘&€O$๔�0฿r,C๙}ิ5๖ƒ๓+ฯ7rฯ๊รจ๙ฃYฬ„ั™ต สฐ'z๏aŽ๐ฤD}ฮ.—Sเ็$๒'๔พ๒NฝผDฮ SR7>๗|ัk0“ั๔พฮิFqพ ั5;i/ึสVฑตE6้ฐฮ&2:;ณะฌ5ฉmนGตc๘Z‡๏้˜๒ลm91‰>H๘�œ›๓—3y;๒แ,ตHˆmgอV๒‹‡ด�ิ[๕OQ‡&ผFร|่ป+ฐใ!โf:Gฟฬ๙w<Ÿn๖ฤt’๐tฤ�ถ<>Cงwฝžฮ ba๙ƒN๓G๘ฺโ๓Xะ-f†/+๊ืeŒ฿Xซ˜R]ีA–ญีฬohtธ1J'‘๚€๎่[{&ซY‚sสn ิdjฯ๓‡w|Xู๊Œฎ ิ0J|น/แœมnM= dั|<Wิข๏ลใ&คŽต^ŸvEล1]oq<ฒฑe44^'้่pขq�%๚ีโ%คค๐Ššํฐ๐ล8 LŸ›~ku/ฮ{ถ4ููฦj9 e4๛๓ ม้า๛หฺ้€:ˆ}ๅ๔–-˜ษ *>.5 #5ฅณ‹ฉ•๕ฝ67๘ N<ฉE+ตS”้๒อlKวษy(ฆภ…?Žp2 L…ยป(64@ฏMkQ‹W"๙EฤไWฉ ง0Yี"ธ3ฉaZช}ฒBTฤฦะ๗ศิู˜ฟ-Œkฐ ฎ+e‡˜yสบณ’>„Ž@๑งฯฆYŒัvz3ร+~}~qZDŸX:ด(6ฆโ™าv|๎ฏื€ฆพA2Mค้๏<`ืnTพ์วึ ™๗นy‰b‰๒jัๆ(LaxQ€J๘wญv๛ณ]1k”=sหP1R•YŸยฝŽู…“b๊๕VŒnส˜ูhKr'Ž๕ญ?ฯlธ\™7qฤ ๓จFnว~›๘xธ๒…ง+๐jทฤค(O‡|-&$2;y ขืณF฿ŽฆI%(€<_ฟk!Xธ์ทj}๘X1อf๊ํ฿ิ“‚าค8ุxื�ž(™Ke฿พkท๓ฏๅ/–|มkหj–ญG+Bx ๊A้›|ธ p•๖€]>ชbyฅ!สํฟCื2–†๙œRฯห่ล“^ฑVทืด~์Uoำ๏LUn6ฏิ๚:ด๐๋ิ็*๔;;๘โ—xฆoฆ)^7<UUqUu้ถ, �XZวqv฿fา ฎส(ูฯ๊ฦ_IX๓๗๒ลๆ[)#ิฏ๕ผ:ฅํอสํะอ3ษoฺฯAย}�w๗8BzSO/y๏Wะ!ล/mใ`}7๘^Ÿ๋w๚rt๑ษอษะ๖ฦm&ริ;๋}9ไ/ฮ /Vž;Ao%ผีฌKฤPŸๅvฏlำjป6@]vwoแีžb]ฦพฮ๕/อ฿ฮ‹๋KIฏๅ‰Rา๒�ทzŒ$ฃC(๘—ฝ$e;xuษve ๑'ำฃƒฝฟ๙ppa>ฒ7?อ๑๛?๙9๙'ๆoอMUํดษMฏ—tยฟงตX๊ฤ?ยXq37RNหิๆหด;B:8ูG'ษๅ;'ฒฟ;?Qแฤ>ฉu๗Gพ_w7์G˜žMะ4 Nะใำ์ดธ’ @Tฬค’I$ฑ๊O\๓Vyๆ™œ’๗“–ฦ0ฦjใซี์ดํMใผศยดˆ๗tฬRIๅวึ%-–ถ\p‘\ Vใภwํำ#Ec<TŠ[ J๕ #mป5c๗oƒ„๓j–HKgŸyน๕ซ<qย#b…ฅ*w>dG=Žˆbป%๙ืฆH๗_›~lž`ฦHe†:ฉE/ห:L‚ดฑ๊0โd๒๛Ÿ[ye$’สฉ๛@^ป็?™ื๊ชžฏjcJ๎H@(kB~yH;:Y ำ๘}SษฉJtฏ€๎rmlฎqSJ’์วงC๏€rGฤCจ!E�‹Q†%งจภ;4^?งl6ื#ั(้หŸ ฤWฟLmC๓#ฉศฎ*MR:‡sฟŽ[;MSเฮ›vŒว‰A๋น^ิ:ฮ<ž‹&๚s๎Sด—ิะ๔ฦญV8#FฏR|iื ™๗ณาŸยปžงFก•๏]ล+ำq๒อtห9[ัtiคˆฌJ�RA-ฐ$ปx˜“ํยฮฮ!œก ณRยต#ว ฏืdำ๔{อOTป‡Nฐฑ…คฟฟ™ี#†%/#>น<xฅ#ย“ัล[“ฐ฿}žwa�9๙=4ัYฏๆ6‹๕‚jก๎BVดฌ๔#พgKฒต@_‡/“‹-FšRกš�Y๎ž_๓VŸฌย“้ืp๊6๎ Cqk"ส฿œE†`ไฦ`jBฝ๛1หฆ Xynลฝุ•W๗‚€t ญQ๔ไ]|ถE5ย‚์Yx๛ฏเ8DZหแ�๙ส�๙ศป/!้—B๒อย^y฿Zฒd&$iPศ๕๎;9a:ึo๛ฒฮขC$‡๎ม�Mไ<ปหFฏ[?ุ7๚G๔ฏ|�œทšำq๒๎ ฬฅฅ“QปOT๒<.ฎžEง€=i๏jLKW—ศ๖UŽ8ก}c2_Xf&ฐ%i๋ํแŠV๔ล-bซO฿ŠVŸปYทถ*�ี๚9ำ9Wกlถ๑๋ใŠทแM1Vภ}1J๐�ฅUFุXbภฑ=๊)คyฯบฌ“}^=?หzฌอ?๒ชH๛ศษฤ@๏#๏g„\โ<฿ฯฮ™ๅXuญ"ึ คHj฿ฯวrN๙ึหQแหg}ŸF:“ ึฟ)๕‹e–ใK�J…jV^[v2ฑka-Žลัj{,,ใ๕๎ฏ0hn์nศ’YBี๘ชŽฌ;ืc™œฃ(J‚>+™eน”ษqv=Iไฌ๗สGซuvZ˜FฬdLŽ็sฬฟP็5�)4I๒ฏ›ฌ๔๋”เ!ฒ˜ ?ึžM™ฺY‚ฌŽ็ฎ๛gฺบ-L๒ฆ$-๖{ฝ.ฏI,Pร†cา9‰?ฅ๗ญŒœ€hก•ˆ(ํ8ญŠ์=ณ›‘ถbถ?s(€ri Vโ,ฟาTำ+"ฺ/ЉšฟผผF *oN€`อ2Hฉ%เผROQˆฅ ํ˜mฌ ๆG˜bนธ†BกTPีบ๛wํ.fšQ‰๙ซihถŸšx‘—๊๒Žต]๓)^š็ทมธ‘๏๛ŸOhtHCฦ$d ำb;œัๅp3๎^ฆศ&Œท*žq‚คSตj2‚๊ณG„ฒVพฃ6หMฟQ7~Jะ72€6๗๋€"B‚ea>.*Aฉฅ๙"ิeiดL Aฤr ๏B 8$ก'ยˆwbผ^ใ| ๆX/˜Bตตะ�*JH๎iJeฐst๖| ๙ฮดY๓!ฯ]‰๑:ฯๆ๔’#ย,g๒พb4{*[АฝkUcฝ2อx๕hI๐#๎{“ป ่S‘`)าป‚)sT[คฬฌฎขAF’ฎฆŽTฟ๎ส%\y‚อ4ซ“q'EJญ 5zžB[ 4xEผ๓รศฺๆ'u�,iW0jล๕i็fzสฒ—ˆ? ฅ37ณ5qำgŽI รึi�3ฅษ‚๘L†ฤ๒๏~Myซศพh๒6ข๚Oš4ฉN4SDVki”šV9)ลพ[แŸS<xฑ›oฤ>sฎ์ฺ9pๆ_#ฮ'G4›Nฝิดi’m#Rฝั%ซ–SOjU่ธrูDOi�}โlyg‹่‘ธ๚+สŸ๓–Ÿ~Yx๓ญฟš-ห=–ฝWยขชfใ‹์Cmšฌฝ‡ฃษส<'๚&พฮNวljc๕1ๆ7๙Šzฟ™�็8ผฏ๙rM+D๒ลฏ”ผร=D๚2ุข€ƒV‚&�ฌž ีถbแ๖w's‘”{นo็ไๅOท=ป‡ ๛ษโแ฿๏ูไ?’‘o๒๓้;•ธ‹ส์๙ปฮ๗ัปษv๊k,า9ฌำHvb6Nค๔ฺ]งCืzb:yžแ๗ธz ๕s๑2_๎O9yืศ?t�)4หสฃCำ-–วNาm>ล>ฤ0ว ชข‚๏๏œ>)™™JFษ6}๎฿ด€ ๗=;-uํ`Jำ฿ญ8ฅoหaUi#ญ์vฦีฏฃฟใŠำึ๚6=๚vฮU่B๊{|๑Uิล+†*ชขฟืT_๓8x๚bฤผ[rORm+q�๓v้Y%๒๛ูฦz๏u4p๔๙1ห๔ร‹4๔ƒv”^PŒ๒•œ&u% „๘@Qาƒนอถข{—ถำใท •ด‹2ห�dxซรฝsฤ!ศ๐y์๙›๓ืK†ฦฯIš+$ฎฅ๔Œผy0P*ดeุW฿:หศebKฺl"ใ*๋W๛_5[ว$๓ˆธH็Š’BŠำ`Nmž:1โ4:ฃ.ดmZะ_iWQ˜mึYขž!bsล\‚(‰ 8ฦc˜-“ำd‰@๒พ];฿h�ฮ<~h�ฮEh๚๗–ผณeๅฝGฯ>Li>ฉwคj‹ี,ขeŠI ิ$![ึผXฐ4ใœ๗kh๔2„ฒJB็cฉ๓›าv~^ะ&0ษ Kฺฯง„้uฎใvxต—”TYชกจœRœ;_œ1;;IFคแศ€ฤ�1ขํ๏‹ ถ€&B(hดฆคŽธŽh<’อQ#6าw(hj“‰e๊~b4Š�›พ{(ฒ!มTš๐Z๔3{�!a๎{7๗|๚น๔†š(ถแ่Fผฉนงoฟฆiฒprž๔,E@ผxฒ�Tํ๔f16]^se”<Šช*yN๛ๅฎ ฉ-(€ฯวsใˆD‚uŸl’๗้ฝ~˜ธไ&ฑVฐ_ ํฤŠž›SVฉuPœq…4ฏ#๎:๕Qอ‚kT{k™/5่&‚‚™dC„Q๐o็HŒ‹ฤ9 vj{๓อ๗f’๔•x{๖yฯๅผฺ๊,kศJVฏcณนฏNู™ญ6=๊ภ?^๏คปH7ˆ†PGZžว๘fซ$@นrˆฆqi=ส+ชี4งสs€\L”ห๔๋๔toJ์ฝ:†ง…:S*˜โฮ—{'#w่ณถšeR*ZุŒช.1ล๚ž;็}'หždฒ{/2๙r=Bาเ๖ท–^]y k›-\˜ๅp•"zhfฦqไฉวธฟ>5ต๙kๅKฉ,t [๑ซจด‚ํคท…Oy9†+แวฎvzน๒วŠ|ฝผ'n่ดCมŒ3ะ฿๎ๆ๑%1!ูป+€ิ๐ฉ66๓ก?็?/tฬอ;/๙วL“Pะฮ›y~๚tRตนธ–‡c Szฒ๗ซํVM6œฯฉXnำฒtะอ˜Œ‚ภ‰?พ~็ํ–—eฆhฺuญ…Œ1YXYฤฐYi๖ศ(ฃ�6ณฯฅ2I$ู?kำHJE˜yศŸWทซhกœ“ษ’ŸvYฆ;— ดcดOผ=ๆYuฎ‡ๅ“Uฆ*ฐŸzโ•„๏ำญจžฃuzvซพŠฟื๚6?็Lๅ‰Qz|ปโญ๔๗๖ยซ‡ำ*ƒจ๐ล ฃผPธbฏ–?็4ตe๙ซู‰ Mฎฺ๋=Œ1ผ€Nfu�Žน™ ž>V~ว/ณโe—n็็•โ‚แ!S Zท์ึ šžƒ2๕ห`=ŸNด๘ส5[>Jตษิ“šูK๏rŒh|^๙๑ๅฃฌy\]ซซiN.ฃ๘Y๙ •ยฦ”$ำพ๔อฯdgแษGฎฮ‡ฺ-ฯค$sโ๏๗์:พ#๔š ™ะ๒ŽH•ธฅI]NนำพlbAฎE๚—๙}กy๛๒๛หฏ}ao-ฉ}+[ถhัหKj�œึก…3‰ํˆฯOจ4Mวล๔ŽหีFŽ3๊ ๗ลพสะ4[-6ฮึวNถŽึั–8"โŠ5MOพhrd36w(ห”’m[ฤ‰6$ส*ฤš€7ฬrโHูLึCฑhXr4ภŽ~cิ`ช"”๖ฏ๊ร{ฐญ’S“[]R‹๛บ ตzbSŽฌ?/Ÿญฯฬc—UเZด่ช>�|่?ไ4=ฯ{ฅฃyl>็า^fเงณกQ]‡ยk\าๅฃwจX?7Œญ}?†’�7ฅsฎซ(ญ“๚ฌภTญ~[๗#&ใ๒_ษc, (ผรoธ$ำ้…iุ•b!•y œ”๗ ๘๔ฤธ$ฆฮทbสŽ)ศoM†EฎQๆิณ8…xศจR7nตไwW&Gv ญ3}^VฅWEส๕ษ9ุF๏‡?9ะ ‚ลศ—fN…)ึตง\๖o7ขปฤz์๒ห›FนำD€(h็‘xิ;{}9Ÿญ•IฏณปญŸฝํz]™ถฎB”;.ฮฦปฦ๙ฌษ.!ษฯ&๙ณ๋+m^QH‡๘น)ไ@ˆLb\|†;ณ;หืำมl๓๊;„! ฉ๓สe”^มมžช1&ฃฒ.(ใถนo5Ie๘k๖‚Ž๘เฐ(&Dฮ#†!๒—ไ‡็Žงๅk8<ฃๅจึ W[‚Idีไฉ6v๊}2ัึW=@7๋b๖trŸ|‡N๓๚žwท๛B]Ÿยd฿๓G+}ฯฯ ~ณ}rญึญw}pYฤ์gป’CN<ทbฮ{็]` ;๒ŸฤฮจสD๒๋"๖ฟ=~Uy—ศ\๒ผ๓้3K\ธ“๋‘*ŽP:[ก#ใeOsำ0ดบ๘j'!ด๎ต‘-&s‘๕ฝmฐฏF�œDำ๏t�ฯO.ห}yซฯgจXEhfฑ{ˆOข”ฅPƒฝFa๖๐2ัสปม๛Qุะ0ฮLฟšv๊ถฐXเ#๔ั๊=IX๒m๓‚#gy,–wM<ซี5หˆพตีฃ๓ฉญDnzm฿,ำํ?ƒฎ—1 ะฮf:ฐฆI5ค๛แU•์>์UฃlUa�onต๙bญ'๛`ค?ะ๚2๙ำ9GกT๙}Š[ลWำท†ช๖๋Šช)ฎTฑ/ƒฟ็<๕ตO.WyEO๏5}f๏VG_Jฮ Sๆ๒œฯ์่IKบ?yvฝ“ ™>แ๚_๙zmํ฿™ไฐฐใ-~0ุณ9์๐G“ุ,PH๑LJ}ป5>ะก$๘Ž๙ฎ%พ@ข๎t(/ํอค–ยๆ —ำ—ใ;๒YhNีi“†SwEฌัุ๕~s~o๙._&๙รSถŽิi—ฒศ๚JLฤยค.ํN:็i ิ๘๘Dฎศ็๏|ำทด•ิ’B{วซ์O๙มป/#๓UแŽhmc๔฿นtท’H” ‘์๎ภ€ิณŸ๖žB๑Žป๛วณ็‡I3ฟช@raฬงฝ๚S`ษอj8•Bฏ]๗กฮD—; ู8Šฏ"ก�€์ีญ;�ฆCซ_DภฦR„ะ฿�šS|%J๑ŽL์คl*vป o€ ๕' o%>จกw9"S ห๒เK�+oฯอ5U�Jนเw๘Jญ6๋ถo�ไ4=ฯ}ฅ฿๙น๔^"ฌP†$$d3�ร`v้ใšlฎฟQฬฝ/MxTฏ Qzi˜๗W—‰#FI1=jอ^ฆน&Š=UYDŽŸcƒฝ|i‡ฃh2ชแE ษT‘฿ฟ|K{ขญUBC+0zqU]ล฿cˆ fy…ณ1S๛^ญN•=<0†1aฺื 4ๆใศ=hGQำ}ฒNf๒|-๙อ+ๆ€ฦ@j•jt�ิง7œ:ฝ$G๎‹ฮ�(’9๔๓ƒ—;ฉ6ํU}ษ๑ฬžั5/ƒWg_™๛฿Ni๚tHf‚ู#uฌc๏šiL‹aŠfฺuŒา–InVJ‚Uw ๚uฬYศ8ูf#ศnสtํฮ)J<qnNv9J๙ธy52#aLตtM7๊๒ˆฌ•ฺฅจ@aSืํoˆ•๊2ผŸ ฮA�ฮ>yใ๓3ฬ.ญๅ94ฎqผ1^ณ[ฒฤว~\X5ฐ฿:^สํl:Xไฝอํป=Ÿ=xฦa l๎=฿ฉ๏_‘฿๓žTฝั4ึฟัฌ๕5YสืRkท ญ/ฎสcfŠต๔ภRB~น…ฏํi๊dw"=^}์q้q่เ!r9สท'ฟหบžG�9ฝy}eๅฟ'‹8nxGซผ‹qnึ ”ปิ๋PG†l}œฃ–ี.kq ( x‡!ส๗>$ด๓Žญm๙ซ๙kฌอชOywcๆ;Šk•SX็•Q๊ไ๕`ฤ็GญลiฒFชโ]‡Q9jq’oz฿ธฟUx;�8˜ะีฯ2ฒCัžmXสmลฃ7-ฎ$’ดจi๘Œ–S yฃxฅๅปา™ฮจ)ธฒXw*ท่wลV’~ŽุซŽjฟ…]ศ๘ŸUั๚0*3•z^0'’เ@ธซc็๒๑ลWืฝwล*ŠiŠซ ๑C๒ซss_]c๓ฏห^ŽOR$๙n๎"์.5)ๅืnf฿ณฃXฅ.๓๗;ฮษว@2๒�/;(H(ข*Qภ'sต)ุ๗9Np๖8`K4UŽYญŠD‘FVŠ ำo–k2ถR•ฅZE๔ษAZ๕๙๕้”œLน(+็oษฝ๓ำOƒQŒFึ๗~ข8ชญโ€ฝ9Rvฬ/iOJIPโja‡Q ขภ฿๐^ูไ?'i~Fั์๔ุY้–Š์-ฃZจ.ล›ˆฺพ๙…ฉิK<ฬๆl—\"11€ไกo"+ฤXWแ�“ฑฉYŠyธฒ‰ข[ฐ,eกb่ฝzo฿฿"๖ึFิŽwf$P:rDฒผcเ-A^5พ'ฆุPN้nซศภvP๎kJo]†ห๕?-.ฆ�ฟ็เh๕G๋Z*Šo:?มa๎{ญ,ฎศน๔g—dT๔›€P ซ‚*i^๙ฆสMN๏VฒนQ2น,„€ิฉ�ใ1DใบlฬY(  ๏L-G’,L…โ๘๊xฒจฅ a‹ Nจ?‰h๙Ÿ้ RฤŸˆY/ˆWญ+ิšSIูT•๙2รjNงก>ฃ&ภฆ'ญrŽาW„ะ๎Nฦู'+n๘O๓•ๅ1\3ฒ>Š–4พo{8=',&žq๙73-›ทํ ้…+J“LสํAฟมว์ญ๔็๚ล๕ๆ•7$$ซีจผE+๐๕฿ฆs๓g’4YตผrI •#โP‚ŽzP(clโ™ ฆ]`VC[‹žHGjญ?ŽEยส*ูD2�PPัิl}xˆb€ตฒrแ่H ฒ‚@ N๕๋†'-™$0$hภQvุ‘แ๎;เทEƒ~`yRฯอซงOkะนดธ‰ิสH™+Cำฏlศำๆ8ๆ$"ไiฒpO)l}ล๙;ไO๙วฏ?อ.๙WVำ[IŽฦqซkf็ณž:hๅฒ+Wุ]=๓บีvฦฆ–Hฝซ‘๕~ง™รุ9p๊€ษด#rƒ\‡‘>o„c$†RฅCŽEcิŠ็ŸAฺHู)e฿Uฟา๎จŽ๖&Z€ฐ่฿ ~ ž(Hy=~AFaุ3d]T p3Xฬโซ{bซIqVพŸป ดM;}๘ ญๅŠฟา๚)Qใท|ๅ^†•ปฆ*ิu๑ภ–้ฟฯUฆ}8ฅJ Un‚YbŒš` ภษ๙  ฟ 2<ัฟ92<ี œํu0\‹sนทถaoะD{ ่p@รOžu๗๎๕]Ÿ†ฃไฬt_M˜6™x2†44฿ทQเ33ำโ^อๅน.-=(˜ยฬ*OZŠošตบrยG›ฺ4ฅ*-YมRฑŠWsZํCำพ`JV]VmษfV๛คค&Fcห`ด�'!n$ๅั“ZFTV‚ผAฅ8 ฯQลœ“5o๎๘๐ๆ๎�ขไ๗=2%ฎ“๙�“๖Yrkพ�ไB=‹d-ิำjฑ๖งa†˜hขฦซา”ข๔#%ษ4ฃR ึ“…`8๑ฏ฿ื3‡ิ—บชชo~a€ีUีถ�x~ผ่a+shฯ “>็ฟhฅ„Qำโข~์@hsS‘วฮ๔:แˆ๛ํ๎ฏทjๆ1๋2Dkn~สะเt=ฦ๔ฆ GuHgUŠP I้ศเ%+ิwถ)1ฒ‹มŒaร—งฦข+ถ(๐ึ3\’UDeA 7=ฯN˜ฒ!8Dhะ—™I`kืถุ\I›;ๆ9˜ฤ“�TžEG`{๏ใ“อำG}฿ rLๆRŒ/ํ�#ฅs ์ุป›b/4ธuฒผŒ” /ฅOลJำน•ฺq{œ^ล$แ7โ๚็@‘ฺ(ม๘๙’ฎหะ ็ฒŠsณ ฅขป5ฐฉ๘ƒoศšฏี˜’บฬโคŸฺสษ#=AT&ƒ๑ฉศ4N6ศๅ.โฉFVดลฃ†“0แ#rฃ๖จAุะ๕ยำVSXeiLQฉฏยยZ|ชFMRZ0๐ ฅ€SR7งใ„บต]:ูcx“ต)ถฒW{ฐห#ษ>ๆผŠ(ิ฿กฉ๘KE1ฯ1 X™(ฤ้"Ž”โAศถแำฺUDŠQธ–4pึPŽl๚:[,aฑล+ญ"›ƒฉUi๏๚ฑVฟฉยฎก๑๖๋Šฟำ๚ ฮR…x5=7#  ชฉ฿ว ญฑงพ*จ1J๐:bฌ;๓+อ)ไ_ห=๙ยNบ‡w=ธ๑ใ1B๛7a9w0รŽ`? |ณciุ<’๋Hซ;nฤsZ็Iœ์๖8๕/ก4Kx“ƒย@Z+xoAเ{ำe—{ผฦonjะmึ‘2!ไฐฤ๖๏Z๘ๆณ,˜d•=Nยgˆ„eUJ}ชะWo–a—]’[3{]R=‹ีท1p2ำeoRŒฎภข(Pw๛๐5U"=Q๋ฦ91E%น};‘ื่ภB8vN-ค‹’0?eŠ๗j๘ฆ@ฆ~ปXА(I B๔๖ษ[P หศฉV'—๓l*<vภCIe๋k*‘ศ๒cฝjvณ‡ิฤิญฺOอ๏ฬ๙๘๊ŒJŽ ๐Zต ia๎{!๔|๗ ื‚AVgwPxิIพ๓Uธ๙ฅอ้šT|�Pfen•๎Fxๆ3ซฬo}™ ฝัŒ0wd<ิฉ4ฺฟ>๘F๎<กjโ๊ํ๋l๎W†ฦ‡น[+e/\+…!- เMvฏQ๒ฆ4ูWvžฤฃ_ ‚C�Dดไ˜หภง4‘ีSํัมุ0ด€m็~bxใ‚s๑3€ๅ๖ฎๆ›m–Aุiม$>฿šF‚ŽผIRหฟPqgถc๛ข๒฿ส9\EฉBš-๏>'jUGF๋™}ค9'ฐฅXๆ:q>มะฺT‚�ั€›ธ4ฉจ ็'V์ฒ€Kีดน O“Wช(ุŸ˜Rบฬฃีป!ถ_Pชะ45$t=j2.<๖dvซง!0 88฿์๕๙tภโศ›GชJ#‘"”๙t1c#Iฌ"8ฝ9˜KZžฤp5;zp‘ิน–kฑ้ถ4ึv „a“ำ�€…บƒพ&“บfจอซ๎ญแธyฐด—[ทgq•ง‰>ูโ—ฉ้บ4žฎ‹คIZ๓ณ‹uPฟร6P๚Cคส+$ฝๅ0?ํไุ,๙ ปเJ™ฟ *ฐŽ„ญ>4ลZ๑l*๊ Uิ๚นฮNํ่iSยฒKk…E?VVS^ธฅYMkŠซ.๕๗ล/”็5ผห>ƒ๙ ๚=ฌๆ ๏ฎY้3P^า.W71š๖`Š 33A,ย๚YN^‚<Y/ธ}๏ห] }9ฃpUiฐฏ๊ อถca๋ดฐงฝ่ด‘ฦผX๑ฉuงา~yฆฬhปƒtH‡:T…Bทส„šwอvG!4๕}?โJ๒ WAญwฬ7Y’ูฅฐTŸด#<นทxธRG*Qน* ณาขผi@>X– ๊#๕ฮๆ4 ล!P+ะtศขฯ ผNCฬลZ„P€+ำH&ฑบ‚IPv๊j=๐Aม%7& ฝ+˜ฐคำณภI๘|>xYDzŸ™ืณ~q~bI"าšฅiQ๑+o–‡นํ๔ƒ๗~T>็ฟhฬHคujฦ›S5Y9S”X,๎าgคTŒ>"=่Fc๒u๙#อ4 jP•bฮŒEj:Wว'ะJฌM$หศฅ'–รภษ�ƒD„T3ี‹อzrโ ฅ+•“ž “›‘‹‰M”qRA่:Šไmง ’nัฐ›†ฃpPxแ?บyw›šeๆฑข?5ฑ (‰ฅGs™ู้i�|S๙ฒeXๆ%V*N๛Tา™ะh–S๛ข๒OสY—X๎หtฅ�่>‡็™ค6็ู๓c%�;๔>บาnใ0PHชาฉE#ฃํะg7’.๋$wz–‘p‘G"%ษชฎฯO–๙‰0๋sDše๖mHŒZณ๕ฎ๒—vC%‚`ัฑโV†„€|\SึU‚ำโฃ�๊p0!ปม�๘iเุฐ)$จŠฅAZะฎใ]ๅ1ˆsY�จ๘ฆภVปo…จฃd� UชM†ŠQFh˜7J}<<N%ๆห|ฃ(—หzh _Gี‡ๅ้ศยŸvgเ>€๊๕‚ณI‘P\นวYโ1Jฦ๋๚†*ฆ~์UoัZ๛ฝ๑Vซํ กี๚ s”ๆ๔%R›ึตย…๊E๙œRV„b•d;{โ”B๘`(~vฮ|k†[�ส(กิu˜฿ิvKX‰q@™ณ์มผๅไ้v™ŒI๏|GฅBห(tˆต6๔๋ึพ9›”์๕˜#ไ๗฿,e„: จ‘A๛#ญ6๋š|๎สCmๅฃ„ฏมVJoฑก๏_ณW—“‰—“า์Pคpzh(า๎ ๛lNcบ้›%˜DDlชอๆ”้|\Sบa‡Fฎ็*MIvี!บ`VœOnž8†มัk,dq4$ิ๕๘€แ,& xŽ…j๚ ำพ็"ใ›Ds]ถYˆฉ้แิไฉˆ+ฟนUŒงจ�!ฉ^พNฬq฿š๚ตะ�•ร๙ƒ*“มต%โ๛ํ๛ตงั›๘G็ณามGธ}ฯpั๎เ)น {ๆฏ$i†Le่uๅจ@ฏpชrUจจฬR ƒ—บE๕๋y”:ศ(�า€ฝทฆ#g โๆฯา0ซOง>gิ` ต่zไ๋kl‰ฅ uิŽโิ(ใ> *:0-๐ำษ,5_Y„แรขต8๑5ฏb<2\\ธ8vM๎5>#…Vฏฟ* z q†+`๚›ม9V>ซFK’  ~™~739X|Y๙ฉ!ญนฌjสUUw๑&นัh†xึ#๎yๅs„ธื˜72ว๑lงOlฮํด]`ีไ๗‡ึ๚ Abชง‹lŽ4ฮk(ไ!้บ4สฬ์ศJ$ษ๙f&G]š<ži"z11VD ๑Sฆ+๏”เHnศh\37_‡ไv้‘qืZฬฏHคc'~ตFุโC)ก”มฦ…้^u๐\9&JZI"`ดVค์Aฏ†-\L ( m๛;๏๐šy5SQVC๐า€ฟซ%l๋ โ�ใำฝ0i9๒<„iท๖fœฌฏŸทiT6f้ลภํ๛ภ{ร2'2mยXO๙œRฐšULพŒ ถฃ ตโO}ฯหทฟแŠฟึ๚"žูสE่U–›dี�:เK›ฎ๘ชช{๕๗ล(ตญ:`R‹�œห}Eฟ็ ต?า0ษฌzšZซ%จF,้M…e,๋Q›พฮไื>#๘๙;ฎฯก๘๊๐ํžฅA<y|kฟZd๓rz?=ž้ๅƒ๑ล๐Ž\TDืๆsQฯ/kฑ,)ลIoƒˆ'n5๛ณ]7Uี๊[3Bกใhฯ=ฺ jPœลuy…™<…‡งอ\ธ]‰ฆ�Ž-m ภณVด)แึŸ<Sฒi.x(Kv"„$R•๕ภส _4สษฅŠFY Š๘S|-s๙งVฯqUฌ'กแB:ำพ๘‡`wขนษ้ƒ้7:ญA"”๙ื/›ฟbผฬq™' ธ&€๏ฝ+1r!๖?5๕9/ๆ็žKAยCฉ`ฐ4<””ฆtุภด=ฯSคฎ":Pฏ“4C?ฤ�”{Szๆฏ%[vZงฅZ6”ญJ‘ษ-Xุั~Dณ\N ธศ4Ž-h๐ฬฐE A Œฤ๑๐ -k๔dhุถบ"ษ)u•ข7้–‚•Ž8eZิ|_)"Ÿ,บGnLฅ’t.h@]Z~ไฆจEวฎE)4ฎ•ฐ_“•Šrnีญ>ฺV‘+จM�zQk์คeg…ฃ,ลmamn‹:�งด้ึž™ฏ*๔๘€ํ•]–dฆพ,cอณ,r%ฝˆx‚฿3 cQถมซทห2ฑ๙ถ่ใd๏‡2Eแk‡๘ฦWxEH็JgIกชูฮืv{ฉ็?–พทฎ^ƒOๅ4ฬฎะๅ‹ฌ์ ผพ๑๗>ชะ…drcBWฅ+๖EO‡ถsู์ผžทก‹žu๊H่@ Oู๚s%S…Ÿ†ทg๚{Oย‚1ยฃิbGฺ๔�๗ฬw_”Kt\ฦxชคd|]้๖i๘๘`qqีกํKrN oฬ1^ฃnป`-ฒไสํŒเFzฏฦรกฏถ.$ฉ1Vœ…๘8ย•5ฎำรีAk_Yx๒งวืท฿๏ƒซ ๒=‡— มญ>/ Z%J’ื~ƒแ<ซึ˜–(Ÿ&>ฝฏ_๔zBK๖๕wจ๙ำ2tทฟs‹ฎช‡~�&v~์ฬuแiํทหรฌ?ŽฉTชฦญ7๚qB฿พ~8ซพ, ปู���������������MyST-NB-1.1.2/tests/notebooks/file_level_config.ipynb�����������������������������������������������0000664�0000000�0000000�00000000670�14674535606�0022532�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "id": "be9f2c4c", "metadata": {}, "source": [ "# Title\n", "\n", "name\n", ": definition" ] } ], "metadata": { "file_format": "mystnb", "kernelspec": { "display_name": "python3", "name": "python3" }, "myst": { "enable_extensions": [ "deflist" ] }, "mystnb": { "execution_mode": "off" } }, "nbformat": 4, "nbformat_minor": 5 } ������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/file_level_config.md��������������������������������������������������0000664�0000000�0000000�00000000243�14674535606�0022005�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- file_format: mystnb kernelspec: name: python3 myst: enable_extensions: - "deflist" mystnb: execution_mode: "off" --- # Title name : definition �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/hide_cell_content.ipynb�����������������������������������������������0000664�0000000�0000000�00000003756�14674535606�0022551�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Hide Code Cell Content" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": [ "hide-input" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hide-input\n" ] } ], "source": [ "print(\"hide-input\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "tags": [ "hide-output" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hide-output\n" ] } ], "source": [ "print(\"hide-output\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "hide-cell" ] }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hide-cell\n" ] } ], "source": [ "print(\"hide-cell\")" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "tags": [ "hide-cell" ], "mystnb": { "code_prompt_show": "My show message", "code_prompt_hide": "My hide message" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "hide-cell custom message\n" ] } ], "source": [ "print(\"hide-cell custom message\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.8.13", "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.13" }, "orig_nbformat": 4, "vscode": { "interpreter": { "hash": "321f99720af1749431335326d75386e6232ab33d0a78426e9f427a66c2c329a4" } } }, "nbformat": 4, "nbformat_minor": 2 } ������������������MyST-NB-1.1.2/tests/notebooks/ipywidgets.ipynb������������������������������������������������������0000664�0000000�0000000�00000052612�14674535606�0021272�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "init_cell": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import sympy as sym\n", "sym.init_printing(use_latex=True)\n", "import numpy as np\n", "from IPython.display import Image, Latex" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "# Markdown" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## General" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "Some markdown text.\n", "\n", "A list:\n", "\n", "- something\n", "- something else\n", "\n", "A numbered list\n", "\n", "1. something\n", "2. something else\n", "\n", "non-ascii characters TODO" ] }, { "cell_type": "markdown", "metadata": { "ipub": {} }, "source": [ "This is a long section of text, which we only want in a document (not a presentation)\n", "some text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true, "slideonly": true } }, "source": [ "This is an abbreviated section of the document text, which we only want in a presentation\n", "\n", "- summary of document text" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## References and Citations" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "References to \\cref{fig:example}, \\cref{tbl:example}, =@eqn:example_sympy and \\cref{code:example_mpl}.\n", "\n", "A latex citation.\\cite{zelenyak_molecular_2016}\n", "\n", "A html citation.<cite data-cite=\"kirkeminde_thermodynamic_2012\">(Kirkeminde, 2012)</cite> " ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## Todo notes" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "\\todo[inline]{an inline todo}\n", "\n", "Some text.\\todo{a todo in the margins}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Text Output" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ipub": { "text": { "format": { "backgroundcolor": "\\color{blue!10}" } } } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "This is some printed text,\n", "with a nicely formatted output.\n", "\n" ] } ], "source": [ "print(\"\"\"\n", "This is some printed text,\n", "with a nicely formatted output.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Images and Figures" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Displaying a plot with its code" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "fig:example_mpl" } }, "source": [ "A matplotlib figure, with the caption set in the markdowncell above the figure." ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_mpl" } }, "source": [ "The plotting code for a matplotlib figure (\\cref{fig:example_mpl})." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Tables (with pandas)" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_pd" } }, "source": [ "The plotting code for a pandas Dataframe table (\\cref{tbl:example})." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "", "label": "code:example_pd", "placement": "H", "widefigure": false }, "table": { "alternate": "gray!20", "caption": "An example of a table created with pandas dataframe.", "label": "tbl:example", "placement": "H" } } }, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>a</th>\n", " <th>b</th>\n", " <th>c</th>\n", " <th>d</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>$\\delta$</td>\n", " <td>l</td>\n", " <td>0.603</td>\n", " <td>0.545</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>x</td>\n", " <td>m</td>\n", " <td>0.438</td>\n", " <td>0.892</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>y</td>\n", " <td>n</td>\n", " <td>0.792</td>\n", " <td>0.529</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/latex": [ "\\begin{tabular}{lllrr}\n", "\\toprule\n", "{} & a & b & c & d \\\\\n", "\\midrule\n", "0 & \\$\\textbackslash delta\\$ & l & 0.603 & 0.545 \\\\\n", "1 & x & m & 0.438 & 0.892 \\\\\n", "2 & y & n & 0.792 & 0.529 \\\\\n", "\\bottomrule\n", "\\end{tabular}\n" ], "text/plain": [ " a b c d\n", "0 $\\delta$ l 0.603 0.545\n", "1 x m 0.438 0.892\n", "2 y n 0.792 0.529" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(0) \n", "df = pd.DataFrame(np.random.rand(3,4),columns=['a','b','c','d'])\n", "df.a = [r'$\\delta$','x','y']\n", "df.b = ['l','m','n']\n", "df.set_index(['a','b'])\n", "df.round(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Equations (with ipython or sympy)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ipub": { "equation": { "label": "eqn:example_ipy" } } }, "outputs": [ { "data": { "text/latex": [ "$$ a = b+c $$" ], "text/plain": [ "<IPython.core.display.Latex object>" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Latex('$$ a = b+c $$')" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_sym" } }, "source": [ "The plotting code for a sympy equation (=@eqn:example_sympy)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "", "label": "code:example_sym", "placement": "H", "widefigure": false }, "equation": { "environment": "equation", "label": "eqn:example_sympy" } } }, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle \\left(\\sqrt{5} i\\right)^{\\alpha} \\left(\\frac{1}{2} - \\frac{2 \\sqrt{5} i}{5}\\right) + \\left(- \\sqrt{5} i\\right)^{\\alpha} \\left(\\frac{1}{2} + \\frac{2 \\sqrt{5} i}{5}\\right)$" ], "text/plain": [ " \\alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž \\alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž\n", "(โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ - โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ + (-โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ + โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ\n", " โŽ2 5 โŽ  โŽ2 5 โŽ " ] }, "execution_count": 5, "metadata": { "filenames": { "image/png": "/private/var/folders/_w/bsp9j6414gs4gdlnhhcnqm9c0000gn/T/pytest-of-matthewmckay/pytest-37/test_complex_outputs_unrun_cac0/source/_build/jupyter_execute/complex_outputs_unrun_22_0.png" } }, "output_type": "execute_result" } ], "source": [ "y = sym.Function('y')\n", "n = sym.symbols(r'\\alpha')\n", "f = y(n)-2*y(n-1/sym.pi)-5*y(n-2)\n", "sym.rsolve(f,y(n),[1,4])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Interactive outputs\n", "\n", "## ipywidgets" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1337h4x0R", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Layout()" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import ipywidgets as widgets\n", "widgets.Layout(model_id=\"1337h4x0R\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "**_some_ markdown**" ], "text/plain": [ "<IPython.core.display.Markdown object>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import display, Markdown\n", "display(Markdown('**_some_ markdown**'))" ] } ], "metadata": { "celltoolbar": "Edit Metadata", "hide_input": false, "ipub": { "bibliography": "example.bib", "biboptions": [ "super", "sort" ], "bibstyle": "unsrtnat", "language": "portuges", "listcode": true, "listfigures": true, "listtables": true, "pandoc": { "at_notation": true, "use_numref": true }, "sphinx": { "bib_title": "My Bibliography" }, "titlepage": { "author": "Authors Name", "email": "authors@email.com", "institution": [ "Institution1", "Institution2" ], "logo": "logo_example.png", "subtitle": "Sub-Title", "supervisors": [ "First Supervisor", "Second Supervisor" ], "tagline": "A tagline for the report.", "title": "Main-Title" }, "toc": { "depth": 2 } }, "jupytext": { "notebook_metadata_filter": "ipub" }, "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.10" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "example.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": true }, "nav_menu": {}, "toc": { "colors": { "hover_highlight": "#DAA520", "navigate_num": "#000000", "navigate_text": "#333333", "running_highlight": "#FF0000", "selected_highlight": "#FFD700", "sidebar_border": "#EEEEEE", "wrapper_background": "#FFFFFF" }, "moveMenuLeft": true, "nav_menu": { "height": "161px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": false, "toc_section_display": "block", "toc_window_display": true, "widenNotebook": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "1337h4x0R": { "model_module": "@jupyter-widgets/base", "model_module_version": "1.2.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "1.2.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "1.2.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "overflow_x": null, "overflow_y": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 4 } ����������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/kernel_alias.md�������������������������������������������������������0000664�0000000�0000000�00000000152�14674535606�0021002�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- file_format: mystnb kernelspec: name: other --- # a title ```{code-cell} ipython3 print("hi") ``` ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/latex_build/����������������������������������������������������������0000775�0000000�0000000�00000000000�14674535606�0020325�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/latex_build/index.ipynb�����������������������������������������������0000664�0000000�0000000�00000001142�14674535606�0022475�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# MyST: An example project\n", "\n", "```{toctree}\n", "other\n", "```" ] } ], "metadata": { "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.7.6" } }, "nbformat": 4, "nbformat_minor": 4 } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/latex_build/other.ipynb�����������������������������������������������0000664�0000000�0000000�00000001656�14674535606�0022521�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "(title_ref)=\n", "# Title\n", "\n", "```{contents}\n", "---\n", "depth: 2\n", "---\n", "```\n", "\n", "Content\n" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "print(1)" ] } ], "metadata": { "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.1" } }, "nbformat": 4, "nbformat_minor": 4 } ����������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/merge_streams.ipynb���������������������������������������������������0000664�0000000�0000000�00000003365�14674535606�0021740�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": 1, "source": [ "import sys\n", "print('stdout1', file=sys.stdout)\n", "print('stdout2', file=sys.stdout)\n", "print('stderr1', file=sys.stderr)\n", "print('stderr2', file=sys.stderr)\n", "print('stdout3', file=sys.stdout)\n", "print('stderr3', file=sys.stderr)\n", "1" ], "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "stdout1\n", "stdout2\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "stderr1\n", "stderr2\n" ] }, { "output_type": "stream", "name": "stdout", "text": [ "stdout3\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "stderr3\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "1" ] }, "metadata": {}, "execution_count": 1 } ], "metadata": {} } ], "metadata": { "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 } ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/merge_streams_parallel.ipynb������������������������������������������0000664�0000000�0000000�00000006136�14674535606�0023613�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-09-19T21:44:29.809012Z", "iopub.status.busy": "2024-09-19T21:44:29.808809Z", "iopub.status.idle": "2024-09-19T21:44:29.978481Z", "shell.execute_reply": "2024-09-19T21:44:29.977891Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "0" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "0" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "from concurrent.futures import ProcessPoolExecutor\n", "\n", "with ProcessPoolExecutor() as executor:\n", " for i in executor.map(print, [0] * 10):\n", " pass" ] } ], "metadata": { "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.12.3" } }, "nbformat": 4, "nbformat_minor": 4 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/metadata_figure.ipynb�������������������������������������������������0000664�0000000�0000000�00000362170�14674535606�0022226�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Formatting code outputs" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "myst": { "figure": { "caption": "Hey everyone its **party** time!\n", "name": "fun-fish" } } }, "outputs": [ { "output_type": "execute_result", "data": { "image/png": "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\n", "text/plain": "<IPython.core.display.Image object>" }, "metadata": {}, "execution_count": 1 } ], "source": [ "from IPython.display import Image\n", "Image(\"fun-fish.png\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Link: [swim to the fish](fun-fish)" ] } ], "metadata": { "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.7.1" } }, "nbformat": 4, "nbformat_minor": 4 } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/metadata_image.ipynb��������������������������������������������������0000664�0000000�0000000�00000362010�14674535606�0022020�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Formatting code outputs" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "myst": { "image": { "alt": "fun-fish", "classes": "shadow bg-primary", "width": "300px" } } }, "outputs": [ { "output_type": "execute_result", "data": { "image/png": "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\n", "text/plain": "<IPython.core.display.Image object>" }, "metadata": {}, "execution_count": 1 } ], "source": [ "from IPython.display import Image\n", "Image(\"fun-fish.png\")" ] } ], "metadata": { "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.7.1" } }, "nbformat": 4, "nbformat_minor": 4 } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/metadata_image_output.ipynb�������������������������������������������0000664�0000000�0000000�00000231601�14674535606�0023441�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Output metadata" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "tags": ["skip-execution"] }, "outputs": [ { "output_type": "execute_result", "data": { "image/jpeg": "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////////A+gAAAAA/////////////////////////////wPoAAAAAP////////////////////////////8D6AAAAAD/////////////////////////////A+gAADhCSU0EAAAAAAAAAgApOEJJTQQCAAAAAACGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4QklNBDAAAAAAAEMBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBADhCSU0ELQAAAAAABgABAAAANjhCSU0ECAAAAAAATAAAAAEAAAJAAAACQAAAAAwAAAAAAQAAQgAB//+cAAAAACJAAQAAH8AB///KQAD//84AAP///EAAAAAAAAAAAC5AAP//x4AB///9gAE4QklNBB4AAAAAAAQAAAAAOEJJTQQaAAAAAANjAAAABgAAAAAAAAAAAAAA/gAAAXIAAAAXADEAMgAuADEANQAtAGgAbwBtAGUAcABhAGcAZQAtAGMAdQByAGEAdABpAG8AbgAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAABcgAAAP4AAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAQAAAAAAAG51bGwAAAACAAAABmJvdW5kc09iamMAAAABAAAAAAAAUmN0MQAAAAQAAAAAVG9wIGxvbmcAAAAAAAAAAExlZnRsb25nAAAAAAAAAABCdG9tbG9uZwAAAP4AAAAAUmdodGxvbmcAAAFyAAAABnNsaWNlc1ZsTHMAAAABT2JqYwAAAAEAAAAAAAVzbGljZQAAABIAAAAHc2xpY2VJRGxvbmcAAAAAAAAAB2dyb3VwSURsb25nAAAAAAAAAAZvcmlnaW5lbnVtAAAADEVTbGljZU9yaWdpbgAAAA1hdXRvR2VuZXJhdGVkAAAAAFR5cGVlbnVtAAAACkVTbGljZVR5cGUAAAAASW1nIAAAAAZib3VuZHNP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cAAgAEMAQwAgADIAMAAxADUAAAABADhCSU0EBgAAAAAABwAGAAAAAQEA/+Ea52h0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwNjcgNzkuMTU3NzQ3LCAyMDE1LzAzLzMwLTIzOjQwOjQyICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdGVEYXRlPSIyMDE1LTEwLTA4VDEyOjM4OjExLTA0OjAwIiB4bXA6TW9kaWZ5RGF0ZT0iMjAxNS0xMi0xN1QxMDo1OTo0NS0wNTowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAxNS0xMi0xN1QxMDo1OTo0NS0wNTowMCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoTWFjaW50b3NoKSIgZGM6Zm9ybWF0PSJpbWFnZS9qcGVnIiBwaG90b3Nob3A6Q29sb3JNb2RlPSIzIiBwaG90b3Nob3A6SUNDUHJvZmlsZT0iVkEyNzAzIFNlcmllcyBDYWxpYnJhdGVkIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOmUyYmQwYjU5LTU2YjEtNDNiZi1iN2UyLTMyNzQzYjFhOTNjMCIgeG1wTU06RG9jdW1lbnRJRD0iYWRvYmU6ZG9jaWQ6cGhvdG9zaG9wOjk2MWFlZWE0LWU1NjUtMTE3OC04NGExLWVmNTVlNWVmOTVhZiIgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSJ4bXAuZGlkOjY1MjRlZTYyLTQwNDAtNDQ4Ni05NzMwLWNjNDgyZDBiNmRjNCI+IDxwaG90b3Nob3A6VGV4dExheWVycz4gPHJkZjpCYWc+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0iUG9wdWxhciBJbGx1c3RyYXRpb24gQ2F0ZWdvcmllcyIgcGhvdG9zaG9wOkxheWVyVGV4dD0iUG9wdWxhciBJbGx1c3RyYXRpb24gQ2F0ZWdvcmllcyIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IlBvcHVsYXIgVmVjdG9yIENhdGVnb3JpZXMiIHBob3Rvc2hvcDpMYXllclRleHQ9IlBvcHVsYXIgVmVjdG9yIENhdGVnb3JpZXMiLz4gPHJkZjpsaSBwaG90b3Nob3A6TGF5ZXJOYW1lPSJQb3B1bGFyIFBob3RvIENhdGVnb3JpZXMiIHBob3Rvc2hvcDpMYXllclRleHQ9IlBvcHVsYXIgUGhvdG8gQ2F0ZWdvcmllcyIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IkJpZ3N0b2NrIFBpY2tzIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSJCaWdzdG9jayBQaWNrcyIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IldpbnRlciBDb2xsZWN0aW9uIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSJXaW50ZXIgQ29sbGVjdGlvbiIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IkJpZ3N0b2NrIFZpZGVvIiBwaG90b3Nob3A6TGF5ZXJUZXh0PSJCaWdzdG9jayBWaWRlbyIvPiA8cmRmOmxpIHBob3Rvc2hvcDpMYXllck5hbWU9IkltYWdlcyBhbmQgVmlkZW8gZm9yIGV2ZXJ5b25lLiIgcGhvdG9zaG9wOkxheWVyVGV4dD0iSW1hZ2VzIGFuZCBWaWRlbyBmb3IgZXZlcnlvbmUuIi8+IDxyZGY6bGkgcGhvdG9zaG9wOkxheWVyTmFtZT0iT3ZlciAzMCBtaWxsaW9uIHN0b2NrIHBob3RvcywgdmlkZW9zLCBhbmQgdmVjdG9ycy4iIHBob3Rvc2hvcDpMYXllclRleHQ9Ik92ZXIgMzAgbWlsbGlvbiBzdG9jayBwaG90b3MsIHZpZGVvcywgYW5kIHZlY3RvcnMuIi8+IDwvcmRmOkJhZz4gPC9waG90b3Nob3A6VGV4dExheWVycz4gPHBob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHJkZjpCYWc+IDxyZGY6bGk+MjMzOEI4RTQxMjc0MDA4QTkwQzhCRDI1NDc5NjBCQjM8L3JkZjpsaT4gPHJkZjpsaT4yREU0NDA2QzEwQjczNDIyQjRFRTZEOEIwRDMyNUZBODwvcmRmOmxpPiA8cmRmOmxpPjMxOTc2NTBFRTkzRjc5OEQ2QTJCQUYyMUFENjIyNzJCPC9yZGY6bGk+IDxyZGY6bGk+M0YyOTgxMzJFRjVERjdCRDFFN0U3OUM1MjVDMENBODY8L3JkZjpsaT4gPHJkZjpsaT41QUFBMDQ2RjFCRUQ1NTA3QjRGRTU4MkVEMTI1OTFBNDwvcmRmOmxpPiA8cmRmOmxpPjY1NjUzQUYxMEE1MUQ5MEZBMDdFQ0U2MzMyNjA4NEFBPC9yZGY6bGk+IDxyZGY6bGk+NzZFNDE3RTVFNDAxN0Q3ODU4MkI3OTFCOTYzQzlGM0I8L3JkZjpsaT4gPHJkZjpsaT44RjQwMDNDMUU1MzE4REU2MzVDODM0OTBENTE0ODMwQTwvcmRmOmxpPiA8cmRmOmxpPkExNDc0Q0I1QTEwRTM2RDQ2ODcwRjA0NDZFMDdEM0UwPC9yZGY6bGk+IDxyZGY6bGk+QTRENUQzQzczOTc4NTBERkZDQThDNjM2QTZEMkFBOUU8L3JkZjpsaT4gPHJkZjpsaT5BODE4NjdBREIyRDIwMzc2Q0FGMjNDNkM0NDU1QTYxRjwvcmRmOmxpPiA8cmRmOmxpPkMzMDkzMjZBRjJEMkUzQTE1QThBMjI0RUUwMjQ2NDQyPC9yZGY6bGk+IDxyZGY6bGk+QzRBQUJERDU3MUY5NkU5MjQ1QUYzMjU1REFDQkU5MDI8L3JkZjpsaT4gPHJkZjpsaT5DNTk3RkREMkRGMjlDRUUzQTA4OTA2REVGODIzNUZBMzwvcmRmOmxpPiA8cmRmOmxpPkQwRTQxMTkzRDBEODdBQkY2OUQzQTI3NDM1RkQ5Q0U2PC9yZGY6bGk+IDxyZGY6bGk+RDQ5M0IzODIwMDhERDAyMDA1ODk0Rjg0QUI4QUNEQTU8L3JkZjpsaT4gPHJkZjpsaT5EQjFBQzlEMjZCMUY0MEM5QTVBMTFCN0E2QURDM0ExMjwvcmRmOmxpPiA8cmRmOmxpPkU2NEU5NTJBQ0UyOTAwMkVCNjhGMUJDRDAxQjg5MTFCPC9yZGY6bGk+IDxyZGY6bGk+RTY4ODU2ODVDQkRGMjMyNEU3MTE1OEJGMjE3NkUxRkU8L3JkZjpsaT4gPHJkZjpsaT5GNUU3NTc3QTZCM0EzNDFBNTFDQUFBQzVFM0E1OUIxMTwvcmRmOmxpPiA8cmRmOmxpPkZEMUQ3RTMxQzc1MTJCRTBBODkxQ0RBQTVDNzdERTk1PC9yZGY6bGk+IDxyZGY6bGk+eG1wLmRpZDo2NDk0NmNiOC00MTFhLTRiMDAtOTk2MS1jODJkZmZjNTQ2NGM8L3JkZjpsaT4gPC9yZGY6QmFnPiA8L3Bob3Rvc2hvcDpEb2N1bWVudEFuY2VzdG9ycz4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NjUyNGVlNjItNDA0MC00NDg2LTk3MzAtY2M0ODJkMGI2ZGM0IiBzdEV2dDp3aGVuPSIyMDE1LTEwLTMwVDE0OjI2OjM1LTA0OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGltYWdlL3BuZyB0byBhcHBsaWNhdGlvbi92bmQuYWRvYmUucGhvdG9zaG9wIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJkZXJpdmVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJjb252ZXJ0ZWQgZnJvbSBpbWFnZS9wbmcgdG8gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NjQ5NDZjYjgtNDExYS00YjAwLTk5NjEtYzgyZGZmYzU0NjRjIiBzdEV2dDp3aGVuPSIyMDE1LTEwLTMwVDE0OjI2OjM1LTA0OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0ic2F2ZWQiIHN0RXZ0Omluc3RhbmNlSUQ9InhtcC5paWQ6NjM0NGY3MWMtNDhiZC00MGU4LWFhM2YtZjcyYTEwNmJjZTlhIiBzdEV2dDp3aGVuPSIyMDE1LTEyLTE3VDEwOjU5OjQ1LTA1OjAwIiBzdEV2dDpzb2Z0d2FyZUFnZW50PSJBZG9iZSBQaG90b3Nob3AgQ0MgMjAxNSAoTWFjaW50b3NoKSIgc3RFdnQ6Y2hhbmdlZD0iLyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY29udmVydGVkIiBzdEV2dDpwYXJhbWV0ZXJzPSJmcm9tIGFwcGxpY2F0aW9uL3ZuZC5hZG9iZS5waG90b3Nob3AgdG8gaW1hZ2UvanBlZyIvPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iZGVyaXZlZCIgc3RFdnQ6cGFyYW1ldGVycz0iY29udmVydGVkIGZyb20gYXBwbGljYXRpb24vdm5kLmFkb2JlLnBob3Rvc2hvcCB0byBpbWFnZS9qcGVnIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplMmJkMGI1OS01NmIxLTQzYmYtYjdlMi0zMjc0M2IxYTkzYzAiIHN0RXZ0OndoZW49IjIwMTUtMTItMTdUMTA6NTk6NDUtMDU6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE1IChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo2MzQ0ZjcxYy00OGJkLTQwZTgtYWEzZi1mNzJhMTA2YmNlOWEiIHN0UmVmOmRvY3VtZW50SUQ9ImFkb2JlOmRvY2lkOnBob3Rvc2hvcDpjYTc1NGM2MC1iZmMwLTExNzgtYjgwYy1lNWFjMmFiZWU0MjgiIHN0UmVmOm9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo2NTI0ZWU2Mi00MDQwLTQ0ODYtOTczMC1jYzQ4MmQwYjZkYzQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD94cGFja2V0IGVuZD0idyI/Pv/iKWhJQ0NfUFJPRklMRQABAQAAKVhhcHBsAhAAAG1udHJSR0IgWFlaIAffAAkACgAPABcAGGFjc3BBUFBMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD21gABAAAAANMtYXBwbAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEWRlc2MAAAFQAAAAc2RzY20AAAHEAAAATGNwcnQAAAIQAAAAI3d0cHQAAAI0AAAAFHJYWVoAAAJIAAAAFGdYWVoAAAJcAAAAFGJYWVoAAAJwAAAAFHJUUkMAAAKEAAAIDGFhcmcAAAqQAAAAIHZjZ3QAAAqwAAAG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", "text/plain": [ "<IPython.core.display.Image object>" ] }, "metadata": { "image/jpeg": { "height": 100, "width": 500 } }, "execution_count": 1 } ], "source": [ "# Outputs included with width/height in output metadata,\n", "# cell is not executed\n", "from IPython.display import Image\n", "Image(filename=\"./example.jpg\", width=500, height=100)" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# No outputs, cell is executed, image should have original size (370, 254)\n", "from IPython.display import Image\n", "Image(filename=\"./example.jpg\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "mystnb": { "execution_mode": "force" }, "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 4 } �������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/mystnb_codecell_file.md�����������������������������������������������0000664�0000000�0000000�00000000356�14674535606�0022524�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- jupytext: text_representation: extension: .md format_name: myst kernelspec: display_name: Python 3 language: python name: python3 author: Matt --- # a title ```{code-cell} ipython3 :load: mystnb_codecell_file.py ``` ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/mystnb_codecell_file.py�����������������������������������������������0000664�0000000�0000000�00000000043�14674535606�0022545�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# flake8: noqa import numpy as np ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/mystnb_codecell_file_warnings.md��������������������������������������0000664�0000000�0000000�00000000400�14674535606�0024422�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- jupytext: text_representation: extension: .md format_name: myst kernelspec: display_name: Python 3 language: python name: python3 author: Aakash --- # a title ```{code-cell} ipython3 :load: mystnb_codecell_file.py i = 10 print(i) ``` ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/nb_exec_table.md������������������������������������������������������0000664�0000000�0000000�00000000622�14674535606�0021125�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- jupytext: text_representation: extension: .md format_name: myst format_version: '0.8' jupytext_version: 1.4.1+dev kernelspec: display_name: Python 3 language: python name: python3 author: Chris --- # Test the `nb-exec-table` directive ```{code-cell} ipython3 print("hi") ``` This directive should generate a table of executed notebook statistics. ```{nb-exec-table} ``` ��������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/sleep_10.ipynb��������������������������������������������������������0000664�0000000�0000000�00000001322�14674535606�0020502�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "init_cell": true }, "outputs": [], "source": [ "import time\n", "time.sleep(10)" ] } ], "metadata": { "celltoolbar": "Edit Metadata", "hide_input": false, "execution": {}, "jupytext": {}, "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.6.10" } }, "nbformat": 4, "nbformat_minor": 2 } ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/sleep_10_metadata_timeout.ipynb���������������������������������������0000664�0000000�0000000�00000001350�14674535606�0024111�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "init_cell": true }, "outputs": [], "source": [ "import time\n", "time.sleep(10)" ] } ], "metadata": { "celltoolbar": "Edit Metadata", "hide_input": false, "execution": { "timeout": 1 }, "jupytext": {}, "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.6.10" } }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/unknown_mimetype.ipynb������������������������������������������������0000664�0000000�0000000�00000001523�14674535606�0022505�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "source": [ "a=1\n", "print(a)" ], "outputs": [ { "output_type": "display_data", "metadata": {}, "data": { "unknown": "" } } ] } ], "metadata": { "test_name": "notebook1", "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.6.1" } }, "nbformat": 4, "nbformat_minor": 2 } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/with_eval.md����������������������������������������������������������0000664�0000000�0000000�00000003657�14674535606�0020350�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������--- file_format: mystnb kernelspec: name: python3 mystnb: execution_mode: 'inline' --- # Inline evaluation ```{code-cell} ipython3 a = 1 ``` Evaluated inline variable: {eval}`a` ```{eval} a ``` ```{code-cell} ipython3 import base64 from IPython.display import Image string = "iVBORw0KGgoAAAANSUhEUgAAAHQAAAB0CAYAAABUmhYnAAAEd0lEQVR4Xu2c0ZLjIAwEk///6GzVvZlspWtWksNRnVcwiGmNwHaS5+v1ej38HKPAU6DHsPy3EIGexVOgh/EUqEBPU+Cw9biHCvQwBQ5bjg4V6GEKHLYcHSrQwxQ4bDk6VKCHKXDYcnSoQA9T4LDllB36fD5vlWR9fUvz0+ve9fp0/O7FU7w0n0CXhBSoDiXTRO06FBKKBLLkLvlGgkTp+UvndPzu/ul46Xq7x2/fQ8kR0wtOBaL+1J6uZ+3fPb5Aw0PRtxOWEkigAr3mCJUMuk9cM45uG3ZvJwel8dN4byW8+r1cgWYPVgRaLIlpwqWCT1cgHbr8skOgYUqkgtHwVYfQKZTiTW8rdCgQFWjtt2Pjty3TGdztOB0aHlosuVcHpglJ+h3nUFow7bE6dDOHCjRN2fBty917qEAF+jEHaI+bTlhK0Nsf/aUBpXtYdXy6noDS9dTePf74oYgWRO3dC6b57k6o7vUJFAh3Cz6dMAIV6FWB9FCQlry1f/ejQXLgt9eX6tXu0DSAtL9APysm0OYHI2mCUgVKxxOoQNOcubc/7XnF5yj3LuYPs5Ud+oc5Ry8R6GEpK1CBjlaMuwcvl1xyBC2I8im9T0xva6pPbtL1V+MjPQW6KEQJRAlAggs0vK2oCibQ4g9+LbnXb96THlQBvl5y0yclqYNQAKgAVGIJQHWPpfjf4uv+bUsagECvClCCkL46VIdecyQtKZRhlKGW3OG3LekeQ0DSBOk+1VLCdbdTAqfzlUuuQFPJe/fM9kORQAV6UYBKJslF11NJS0s8xZO2U3zpeO0lNw2g2+HV8dLbKJov1aMKWKDFfyITKKRsegqmjE7H06FpTRHoRwUoQUnu9pJLh4z0EFMdjwRI46ESWwVC8VK7QMN/TRHookDqCB1Knry261AdmmXMdG86xabzd49H83fP1+5QWkB3e7sg4eu06nra46++4K4uqHp9uyACrSKpXS/Q5kMRnUJruN6vnr7Po/VMn9KrepX3UBKgGmD1UVw6P61HoKmi0F+HfhZIhy766NDhU2F66CEgzQXjQRUjjb8aX7tDaYFpwKkgAi0SSAUXaO0Pjkk/HUoKFQ9p0wm/hjcONC2B6W3B24KKv1ZLx0vzgfQoFsyHQJe3LQINHUEZrUNre6wO1aHLw+AvO5QOHdReLbE0/vSeedyhKBWUDh00XpoAAg2/EkIAqD0FlPYXqEDp3Pix/b8/FKUOIMem7fR6j8Yr0fvlYoEWK4JAw0dplOE6dLnrqH5JrCp4NcMFejPQ6h7RnTAUT/eTKkpYiidtH99D04C6bwvS+QX65W8sUMkVaKgAlcRwuLfuNL5Ah/fQKkC6Pi2JKXB6NEjxUTslKF1P7e17KE1YbRfoZwUFuuijQ4v/l5s6VocOOzQFYv9ZBcoldzY8R08VEGiq2Ob9Bbo5oDQ8gaaKbd5foJsDSsMTaKrY5v0FujmgNDyBpopt3l+gmwNKwxNoqtjm/QW6OaA0PIGmim3eX6CbA0rDE2iq2Ob9Bbo5oDS8H8eCMw7yCzx+AAAAAElFTkSuQmCC" img = Image(base64.b64decode(string)) ``` ```{eval:figure} img A caption ``` ���������������������������������������������������������������������������������MyST-NB-1.1.2/tests/notebooks/with_glue.ipynb�������������������������������������������������������0000664�0000000�0000000�00000100523�14674535606�0021064�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Glue Tests\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "from myst_nb import glue" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'text1'" ] }, "metadata": { "scrapbook": { "mime_prefix": "", "name": "key_text1" } }, "output_type": "display_data" }, { "data": { "text/plain": [ "3.14159" ] }, "metadata": { "scrapbook": { "mime_prefix": "", "name": "key_float" } }, "output_type": "display_data" } ], "source": [ "glue(\"key_text1\", \"text1\")\n", "glue(\"key_float\", 3.14159)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "application/papermill.record/text/plain": "'undisplayed'" }, "metadata": { "scrapbook": { "mime_prefix": "application/papermill.record/", "name": "key_undisplayed" } }, "output_type": "display_data" } ], "source": [ "glue(\"key_undisplayed\", \"undisplayed\", display=False)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>header</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>1</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>2</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>3</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " header\n", "0 1\n", "1 2\n", "2 3" ] }, "metadata": { "scrapbook": { "mime_prefix": "", "name": "key_df" } }, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "df = pd.DataFrame({\"header\": [1, 2, 3]})\n", "glue(\"key_df\", df)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "application/papermill.record/image/png": "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\n", "application/papermill.record/text/plain": "<Figure size 432x288 with 1 Axes>" }, "metadata": { "scrapbook": { "mime_prefix": "application/papermill.record/", "name": "key_plt" } }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "<Figure size 432x288 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "plt.plot([1, 2, 3])\n", "glue(\"key_plt\", plt.gcf(), display=False)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Referencing the figs\n", "\n", "{glue:any}`key_text1`, {glue:}`key_plt`\n", "\n", "```{glue:any} key_df\n", "```\n", "\n", "and {glue:text}`key_text1` inline...\n", "\n", "and formatted {glue:text}`key_float:.2f`\n", "\n", "```{glue:} key_plt\n", "```\n", "\n", "and {glue:text}`key_undisplayed` inline...\n", "\n", "\n", "```{glue:figure} key_plt\n", ":name: abc\n", "\n", "A caption....\n", "```", "## A test title {glue:any}`key_text1`\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Math" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/latex": [ "$\\displaystyle \\left(\\sqrt{5} i\\right)^{\\alpha} \\left(\\frac{1}{2} - \\frac{2 \\sqrt{5} i}{5}\\right) + \\left(- \\sqrt{5} i\\right)^{\\alpha} \\left(\\frac{1}{2} + \\frac{2 \\sqrt{5} i}{5}\\right)$" ], "text/plain": [ "(sqrt(5)*I)**\\alpha*(1/2 - 2*sqrt(5)*I/5) + (-sqrt(5)*I)**\\alpha*(1/2 + 2*sqrt(5)*I/5)" ] }, "metadata": { "scrapbook": { "mime_prefix": "", "name": "sym_eq" } }, "output_type": "display_data" } ], "source": [ "import sympy as sym\n", "f = sym.Function('f')\n", "y = sym.Function('y')\n", "n = sym.symbols(r'\\alpha')\n", "f = y(n)-2*y(n-1/sym.pi)-5*y(n-2)\n", "glue(\"sym_eq\", sym.rsolve(f,y(n),[1,4]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{glue:math} sym_eq\n", ":label: eq-sym\n", "```" ] } ], "metadata": { "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.7.6" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_ansi_lexer.py��������������������������������������������������������������0000664�0000000�0000000�00000006150�14674535606�0017572�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������from pygments.token import Text, Token import pytest from myst_nb.core import lexers @pytest.mark.parametrize( ("bold", "faint", "fg_color", "bg_color", "expected"), ( (False, False, False, False, Text), (True, False, False, False, Token.Color.Bold), (True, False, "Red", False, Token.Color.Bold.Red), (True, False, "Red", "Blue", Token.Color.Bold.Red.BGBlue), (True, True, "Red", "Blue", Token.Color.Bold.Faint.Red.BGBlue), ), ) def test_token_from_lexer_state(bold, faint, fg_color, bg_color, expected): ret = lexers._token_from_lexer_state(bold, faint, fg_color, bg_color) assert ret == expected def _highlight(text): return tuple(lexers.AnsiColorLexer().get_tokens(text)) def test_plain_text(): assert _highlight("hello world\n") == ((Text, "hello world\n"),) def test_simple_colors(): assert _highlight( "plain text\n" "\x1b[31mred text\n" "\x1b[1;32mbold green text\n" "\x1b[39mfg color turned off\n" "\x1b[0mplain text after reset\n" "\x1b[1mbold text\n" "\x1b[43mbold from previous line with yellow bg\n" "\x1b[49mbg color turned off\n" "\x1b[2mfaint turned on\n" "\x1b[22mbold turned off\n" ) == ( (Text, "plain text\n"), (Token.Color.Red, "red text\n"), (Token.Color.Bold.Green, "bold green text\n"), (Token.Color.Bold, "fg color turned off\n"), (Text, "plain text after reset\n"), (Token.Color.Bold, "bold text\n"), (Token.Color.Bold.BGYellow, "bold from previous line with yellow bg\n"), (Token.Color.Bold, "bg color turned off\n"), (Token.Color.Bold.Faint, "faint turned on\n"), (Text, "bold turned off\n"), ) def test_highlight_empty_end_specifier(): ret = _highlight("plain\x1b[31mred\x1b[mplain\n") assert ret == ((Text, "plain"), (Token.Color.Red, "red"), (Text, "plain\n")) def test_ignores_unrecognized_ansi_color_codes(): """It should just strip and ignore any unrecognized color ANSI codes.""" assert _highlight( # unknown int code "\x1b[99m" "plain text\n" # invalid non-int code "\x1b[=m" "plain text\n" ) == ( (Text, "plain text\n"), (Text, "plain text\n"), ) def test_ignores_valid_ansi_non_color_codes(): """It should just strip and ignore any non-color ANSI codes. These include things like moving the cursor position, erasing lines, etc. """ assert _highlight( # restore cursor position "\x1b[u" "plain " # move cursor backwards 55 steps "\x1b[55C" "text\n" ) == ( # Ideally these would be just one token, but our regex isn't smart # enough yet. (Text, "plain "), (Text, "text\n"), ) def test_ignores_completely_invalid_escapes(): """It should strip and ignore invalid escapes. This shouldn't happen in valid ANSI text, but we could have an escape followed by garbage. """ assert _highlight("plain \x1b[%text\n") == ( (Text, "plain "), (Text, "%text\n"), ) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_cli.py���������������������������������������������������������������������0000664�0000000�0000000�00000003027�14674535606�0016210�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Test the quickstart CLI""" import os from pathlib import Path import nbformat from sphinx import version_info as sphinx_version_info from myst_nb.cli import md_to_nb, quickstart def test_quickstart(tmp_path: Path, make_app): """Test the quickstart CLI builds a valid sphinx project.""" project_path = tmp_path / "project" quickstart([str(project_path)]) assert {p.name for p in project_path.iterdir()} == { ".gitignore", "conf.py", "index.md", "notebook1.ipynb", "notebook2.md", } # For compatibility with multiple versions of sphinx, convert pathlib.Path to # sphinx.testing.path.path here. if sphinx_version_info >= (7, 2): app_srcdir = project_path else: from sphinx.testing.path import path app_srcdir = path(os.fspath(project_path)) app = make_app(srcdir=app_srcdir, buildername="html") app.build() assert app._warning.getvalue().strip() == "" assert (project_path / "_build/html/index.html").exists() def test_md_to_nb(tmp_path: Path): """Test the md_to_nb CLI.""" path = tmp_path / "notebook.md" outpath = path.with_suffix(".ipynb") path.write_text( """\ --- kernelspec: name: python3 --- # Title +++ next cell """, "utf-8", ) md_to_nb([str(path)]) assert path.exists() with outpath.open("r") as handle: nb = nbformat.read(handle, as_version=4) assert nb.metadata == {"kernelspec": {"display_name": "python3", "name": "python3"}} assert len(nb.cells) == 2 ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_codecell_file.py�����������������������������������������������������������0000664�0000000�0000000�00000005574�14674535606�0020223�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Test notebooks containing code cells with the `load` option.""" import pytest from sphinx.util.fileutil import copy_asset_file @pytest.mark.sphinx_params( "mystnb_codecell_file.md", conf={"nb_execution_mode": "cache", "source_suffix": {".md": "myst-nb"}}, ) def test_codecell_file(sphinx_run, file_regression, check_nbs, get_test_path): asset_path = get_test_path("mystnb_codecell_file.py") copy_asset_file(str(asset_path), str(sphinx_run.app.srcdir)) sphinx_run.build() assert sphinx_run.warnings() == "" assert set(sphinx_run.env.metadata["mystnb_codecell_file"].keys()) == { "jupytext", "author", "source_map", "wordcount", "kernelspec", "language_info", } assert set(sphinx_run.env.nb_metadata["mystnb_codecell_file"].keys()) == { "exec_data", } assert sphinx_run.env.metadata["mystnb_codecell_file"]["author"] == "Matt" assert sphinx_run.env.metadata["mystnb_codecell_file"]["kernelspec"] == { "display_name": "Python 3", "language": "python", "name": "python3", } try: file_regression.check( sphinx_run.get_nb(), check_fn=check_nbs, extension=".ipynb", encoding="utf-8", ) finally: file_regression.check( sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8" ) @pytest.mark.sphinx_params( "mystnb_codecell_file_warnings.md", conf={"nb_execution_mode": "force", "source_suffix": {".md": "myst-nb"}}, ) def test_codecell_file_warnings(sphinx_run, file_regression, check_nbs, get_test_path): asset_path = get_test_path("mystnb_codecell_file.py") copy_asset_file(str(asset_path), str(sphinx_run.app.srcdir)) sphinx_run.build() # assert ( # "mystnb_codecell_file_warnings.md:14 content of code-cell " # "is being overwritten by :load: mystnb_codecell_file.py" # in sphinx_run.warnings() # ) assert set(sphinx_run.env.metadata["mystnb_codecell_file_warnings"].keys()) == { "jupytext", "author", "source_map", "wordcount", "kernelspec", "language_info", } assert set(sphinx_run.env.nb_metadata["mystnb_codecell_file_warnings"].keys()) == { "exec_data", } assert ( sphinx_run.env.metadata["mystnb_codecell_file_warnings"]["author"] == "Aakash" ) assert sphinx_run.env.metadata["mystnb_codecell_file_warnings"]["kernelspec"] == { "display_name": "Python 3", "language": "python", "name": "python3", } try: file_regression.check( sphinx_run.get_nb(), check_fn=check_nbs, extension=".ipynb", encoding="utf-8", ) finally: file_regression.check( sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8" ) ������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_codecell_file/�������������������������������������������������������������0000775�0000000�0000000�00000000000�14674535606�0017636�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_codecell_file/test_codecell_file.ipynb�������������������������������������0000664�0000000�0000000�00000001672�14674535606�0024517�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "id": "77fd61dd", "metadata": {}, "source": [ "# a title" ] }, { "cell_type": "code", "execution_count": 1, "id": "2e32aa7d", "metadata": { "load": "mystnb_codecell_file.py" }, "outputs": [], "source": [ "# flake8: noqa\n", "\n", "import numpy as np\n" ] } ], "metadata": { "author": "Matt", "jupytext": { "text_representation": { "extension": ".md", "format_name": "myst" } }, "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.10" }, "source_map": [ 11, 15 ] }, "nbformat": 4, "nbformat_minor": 5 } ����������������������������������������������������������������������MyST-NB-1.1.2/tests/test_codecell_file/test_codecell_file.xml���������������������������������������0000664�0000000�0000000�00000000771�14674535606�0024175�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="mystnb_codecell_file"> <section ids="a-title" names="a\ title"> <title> a title <container cell_index="1" cell_metadata="{'load': 'mystnb_codecell_file.py'}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> # flake8: noqa import numpy as np �������MyST-NB-1.1.2/tests/test_codecell_file/test_codecell_file_warnings.ipynb����������������������������0000664�0000000�0000000�00000001674�14674535606�0026431�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "id": "daa53dc3", "metadata": {}, "source": [ "# a title" ] }, { "cell_type": "code", "execution_count": 1, "id": "d218bd29", "metadata": { "load": "mystnb_codecell_file.py" }, "outputs": [], "source": [ "# flake8: noqa\n", "\n", "import numpy as np\n" ] } ], "metadata": { "author": "Aakash", "jupytext": { "text_representation": { "extension": ".md", "format_name": "myst" } }, "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.10" }, "source_map": [ 11, 15 ] }, "nbformat": 4, "nbformat_minor": 5 } ��������������������������������������������������������������������MyST-NB-1.1.2/tests/test_codecell_file/test_codecell_file_warnings.xml������������������������������0000664�0000000�0000000�00000001002�14674535606�0026071�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="mystnb_codecell_file_warnings"> <section ids="a-title" names="a\ title"> <title> a title <container cell_index="1" cell_metadata="{'load': 'mystnb_codecell_file.py'}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> # flake8: noqa import numpy as np ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_docutils.py����������������������������������������������������������������0000664�0000000�0000000�00000005226�14674535606�0017272�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Run parsing tests against the docutils parser.""" from io import StringIO import json from pathlib import Path from docutils.core import publish_doctree, publish_string import pytest import sphinx import yaml from myst_nb.docutils_ import Parser FIXTURE_PATH = Path(__file__).parent.joinpath("nb_fixtures") @pytest.mark.param_file(FIXTURE_PATH / "basic.txt") def test_basic(file_params): """Test basic parsing.""" if ( "Footnote definitions defined in different cells" in file_params.title and sphinx.version_info[0] < 5 ): pytest.skip("footnote definition ids changes") dct = yaml.safe_load(file_params.content) dct.update({"nbformat": 4, "nbformat_minor": 4}) dct.setdefault("metadata", {}) dct["metadata"].setdefault( "kernelspec", {"name": "python3", "display_name": "Python 3", "language": ""} ) report_stream = StringIO() doctree = publish_doctree( json.dumps(dct), parser=Parser(), settings_overrides={ "nb_execution_mode": "off", "nb_output_folder": "", "myst_all_links_external": True, "warning_stream": report_stream, }, ) assert report_stream.getvalue().rstrip() == "" file_params.assert_expected(doctree.pformat(), rstrip=True) @pytest.mark.param_file(FIXTURE_PATH / "reporter_warnings.txt") def test_reporting(file_params): """Test that warnings and errors are reported as expected.""" dct = yaml.safe_load(file_params.content) dct.update({"metadata": {}, "nbformat": 4, "nbformat_minor": 4}) report_stream = StringIO() publish_doctree( json.dumps(dct), parser=Parser(), settings_overrides={ "nb_execution_mode": "off", "nb_output_folder": "", "warning_stream": report_stream, }, ) file_params.assert_expected(report_stream.getvalue(), rstrip=True) def test_html_resources(tmp_path): """Test HTML resources are correctly output.""" report_stream = StringIO() result = publish_string( json.dumps({"cells": [], "metadata": {}, "nbformat": 4, "nbformat_minor": 4}), parser=Parser(), writer_name="html", settings_overrides={ "nb_execution_mode": "off", "nb_output_folder": str(tmp_path), "warning_stream": report_stream, "output_encoding": "unicode", "embed_stylesheet": False, }, ) assert report_stream.getvalue().rstrip() == "" assert "mystnb.css" in result assert "pygments.css" in result assert tmp_path.joinpath("mystnb.css").is_file() assert tmp_path.joinpath("pygments.css").is_file() ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_eval.py��������������������������������������������������������������������0000664�0000000�0000000�00000001013�14674535606�0016361�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Test the `eval` directives and roles.""" import pytest @pytest.mark.sphinx_params("with_eval.md", conf={"nb_execution_mode": "inline"}) def test_sphinx(sphinx_run, clean_doctree, file_regression): """Test a sphinx build.""" sphinx_run.build() # print(sphinx_run.status()) # print(sphinx_run.warnings()) assert sphinx_run.warnings() == "" doctree = clean_doctree(sphinx_run.get_resolved_doctree("with_eval")) file_regression.check( doctree.pformat(), encoding="utf-8", ) ���������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_eval/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14674535606�0016014�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_eval/test_sphinx.txt�������������������������������������������������������0000664�0000000�0000000�00000005745�14674535606�0021140�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="with_eval"> <section ids="inline-evaluation" names="inline\ evaluation"> <title> Inline evaluation <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> a = 1 <paragraph> Evaluated inline variable: <inline classes="output text_plain"> 1 <literal_block classes="output text_plain" language="myst-ansi" linenos="False" xml:space="preserve"> 1 <container cell_index="3" cell_metadata="{}" classes="cell" exec_count="2" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import base64 from IPython.display import Image string = "iVBORw0KGgoAAAANSUhEUgAAAHQAAAB0CAYAAABUmhYnAAAEd0lEQVR4Xu2c0ZLjIAwEk///6GzVvZlspWtWksNRnVcwiGmNwHaS5+v1ej38HKPAU6DHsPy3EIGexVOgh/EUqEBPU+Cw9biHCvQwBQ5bjg4V6GEKHLYcHSrQwxQ4bDk6VKCHKXDYcnSoQA9T4LDllB36fD5vlWR9fUvz0+ve9fp0/O7FU7w0n0CXhBSoDiXTRO06FBKKBLLkLvlGgkTp+UvndPzu/ul46Xq7x2/fQ8kR0wtOBaL+1J6uZ+3fPb5Aw0PRtxOWEkigAr3mCJUMuk9cM45uG3ZvJwel8dN4byW8+r1cgWYPVgRaLIlpwqWCT1cgHbr8skOgYUqkgtHwVYfQKZTiTW8rdCgQFWjtt2Pjty3TGdztOB0aHlosuVcHpglJ+h3nUFow7bE6dDOHCjRN2fBty917qEAF+jEHaI+bTlhK0Nsf/aUBpXtYdXy6noDS9dTePf74oYgWRO3dC6b57k6o7vUJFAh3Cz6dMAIV6FWB9FCQlry1f/ejQXLgt9eX6tXu0DSAtL9APysm0OYHI2mCUgVKxxOoQNOcubc/7XnF5yj3LuYPs5Ud+oc5Ry8R6GEpK1CBjlaMuwcvl1xyBC2I8im9T0xva6pPbtL1V+MjPQW6KEQJRAlAggs0vK2oCibQ4g9+LbnXb96THlQBvl5y0yclqYNQAKgAVGIJQHWPpfjf4uv+bUsagECvClCCkL46VIdecyQtKZRhlKGW3OG3LekeQ0DSBOk+1VLCdbdTAqfzlUuuQFPJe/fM9kORQAV6UYBKJslF11NJS0s8xZO2U3zpeO0lNw2g2+HV8dLbKJov1aMKWKDFfyITKKRsegqmjE7H06FpTRHoRwUoQUnu9pJLh4z0EFMdjwRI46ESWwVC8VK7QMN/TRHookDqCB1Knry261AdmmXMdG86xabzd49H83fP1+5QWkB3e7sg4eu06nra46++4K4uqHp9uyACrSKpXS/Q5kMRnUJruN6vnr7Po/VMn9KrepX3UBKgGmD1UVw6P61HoKmi0F+HfhZIhy766NDhU2F66CEgzQXjQRUjjb8aX7tDaYFpwKkgAi0SSAUXaO0Pjkk/HUoKFQ9p0wm/hjcONC2B6W3B24KKv1ZLx0vzgfQoFsyHQJe3LQINHUEZrUNre6wO1aHLw+AvO5QOHdReLbE0/vSeedyhKBWUDh00XpoAAg2/EkIAqD0FlPYXqEDp3Pix/b8/FKUOIMem7fR6j8Yr0fvlYoEWK4JAw0dplOE6dLnrqH5JrCp4NcMFejPQ6h7RnTAUT/eTKkpYiidtH99D04C6bwvS+QX65W8sUMkVaKgAlcRwuLfuNL5Ah/fQKkC6Pi2JKXB6NEjxUTslKF1P7e17KE1YbRfoZwUFuuijQ4v/l5s6VocOOzQFYv9ZBcoldzY8R08VEGiq2Ob9Bbo5oDQ8gaaKbd5foJsDSsMTaKrY5v0FujmgNDyBpopt3l+gmwNKwxNoqtjm/QW6OaA0PIGmim3eX6CbA0rDE2iq2Ob9Bbo5oDS8H8eCMw7yCzx+AAAAAElFTkSuQmCC" img = Image(base64.b64decode(string)) <figure ids="id1"> <image candidates="{'*': '_build/jupyter_execute/20d976ca74932f09b2e705bb1f2c57e10e6117b273b301c48a4fbfd32dc1a69b.png'}" uri="_build/jupyter_execute/20d976ca74932f09b2e705bb1f2c57e10e6117b273b301c48a4fbfd32dc1a69b.png"> <caption> A caption ���������������������������MyST-NB-1.1.2/tests/test_execute.py�����������������������������������������������������������������0000664�0000000�0000000�00000032030�14674535606�0017077�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Test sphinx builds which execute notebooks.""" import os from pathlib import Path from IPython import version_info as ipy_version import pytest from myst_nb.core.execute import ExecutionError from myst_nb.sphinx_ import NbMetadataCollector def regress_nb_doc(file_regression, sphinx_run, check_nbs): try: file_regression.check( sphinx_run.get_nb(), check_fn=check_nbs, extension=".ipynb", encoding="utf-8", ) finally: doctree_string = sphinx_run.get_doctree().pformat() # TODO this is a difference in the hashing on the CI, # with complex_outputs_unrun.ipynb equation PNG, after execution # sympy doctree_string = doctree_string.replace( "91b3db0f47514d451e7c0f5a501d31c4e101b7112050634ad0788405f417782a", "e2dfbe330154316cfb6f3186e8f57fc4df8aee03b0303ed1345fc22cd51f66de", ) doctree_string = doctree_string.replace( "438c56ea3dcf99d86cd64df1b23e2b436afb25846434efb1cfec7b660ef01127", "e2dfbe330154316cfb6f3186e8f57fc4df8aee03b0303ed1345fc22cd51f66de", ) if os.name == "nt": # on Windows image file paths are absolute doctree_string = doctree_string.replace( Path(sphinx_run.app.srcdir).as_posix() + "/", "" ) file_regression.check(doctree_string, extension=".xml", encoding="utf-8") @pytest.mark.sphinx_params("basic_unrun.ipynb", conf={"nb_execution_mode": "auto"}) def test_basic_unrun_auto(sphinx_run, file_regression, check_nbs): sphinx_run.build() # print(sphinx_run.status()) assert sphinx_run.warnings() == "" assert "test_name" in sphinx_run.app.env.metadata["basic_unrun"] regress_nb_doc(file_regression, sphinx_run, check_nbs) assert NbMetadataCollector.new_exec_data(sphinx_run.env) data = NbMetadataCollector.get_exec_data(sphinx_run.env, "basic_unrun") assert data assert data["method"] == "auto" assert data["succeeded"] is True @pytest.mark.sphinx_params("basic_unrun.ipynb", conf={"nb_execution_mode": "cache"}) def test_basic_unrun_cache(sphinx_run, file_regression, check_nbs): """The outputs should be populated.""" sphinx_run.build() assert sphinx_run.warnings() == "" assert "test_name" in sphinx_run.app.env.metadata["basic_unrun"] regress_nb_doc(file_regression, sphinx_run, check_nbs) assert NbMetadataCollector.new_exec_data(sphinx_run.env) data = NbMetadataCollector.get_exec_data(sphinx_run.env, "basic_unrun") assert data assert data["method"] == "cache" assert data["succeeded"] is True @pytest.mark.sphinx_params("basic_unrun.ipynb", conf={"nb_execution_mode": "inline"}) def test_basic_unrun_inline(sphinx_run, file_regression, check_nbs): """The outputs should be populated.""" sphinx_run.build() assert sphinx_run.warnings() == "" assert "test_name" in sphinx_run.app.env.metadata["basic_unrun"] regress_nb_doc(file_regression, sphinx_run, check_nbs) assert NbMetadataCollector.new_exec_data(sphinx_run.env) data = NbMetadataCollector.get_exec_data(sphinx_run.env, "basic_unrun") assert data assert data["method"] == "inline" assert data["succeeded"] is True @pytest.mark.sphinx_params("basic_unrun.ipynb", conf={"nb_execution_mode": "cache"}) def test_rebuild_cache(sphinx_run): """The notebook should only be executed once.""" sphinx_run.build() assert NbMetadataCollector.new_exec_data(sphinx_run.env) sphinx_run.invalidate_files() sphinx_run.build() assert "Using cached" in sphinx_run.status() @pytest.mark.sphinx_params("basic_unrun.ipynb", conf={"nb_execution_mode": "force"}) def test_rebuild_force(sphinx_run): """The notebook should be executed twice.""" sphinx_run.build() assert NbMetadataCollector.new_exec_data(sphinx_run.env) sphinx_run.invalidate_files() sphinx_run.build() assert NbMetadataCollector.new_exec_data(sphinx_run.env) @pytest.mark.sphinx_params( "basic_unrun.ipynb", conf={ "nb_execution_mode": "cache", "nb_execution_excludepatterns": ["basic_*"], }, ) def test_exclude_path(sphinx_run, file_regression): """The notebook should not be executed.""" sphinx_run.build() assert not NbMetadataCollector.new_exec_data(sphinx_run.env) assert "Executing" not in sphinx_run.status(), sphinx_run.status() file_regression.check( sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8" ) @pytest.mark.skipif(ipy_version[0] < 8, reason="Error message changes for ipython v8") @pytest.mark.sphinx_params("basic_failing.ipynb", conf={"nb_execution_mode": "cache"}) def test_basic_failing_cache(sphinx_run, file_regression, check_nbs): sphinx_run.build() # print(sphinx_run.warnings()) assert "Executing notebook failed" in sphinx_run.warnings() regress_nb_doc(file_regression, sphinx_run, check_nbs) data = NbMetadataCollector.get_exec_data(sphinx_run.env, "basic_failing") assert data assert data["method"] == "cache" assert data["succeeded"] is False sphinx_run.get_report_file() @pytest.mark.skipif(ipy_version[0] < 8, reason="Error message changes for ipython v8") @pytest.mark.sphinx_params("basic_failing.ipynb", conf={"nb_execution_mode": "auto"}) def test_basic_failing_auto(sphinx_run, file_regression, check_nbs): sphinx_run.build() assert "Executing notebook failed" in sphinx_run.warnings() regress_nb_doc(file_regression, sphinx_run, check_nbs) data = NbMetadataCollector.get_exec_data(sphinx_run.env, "basic_failing") assert data assert data["method"] == "auto" assert data["succeeded"] is False assert data["traceback"] sphinx_run.get_report_file() @pytest.mark.skipif(ipy_version[0] < 8, reason="Error message changes for ipython v8") @pytest.mark.sphinx_params("basic_failing.ipynb", conf={"nb_execution_mode": "inline"}) def test_basic_failing_inline(sphinx_run, file_regression, check_nbs): sphinx_run.build() assert "Executing notebook failed" in sphinx_run.warnings() regress_nb_doc(file_regression, sphinx_run, check_nbs) data = NbMetadataCollector.get_exec_data(sphinx_run.env, "basic_failing") assert data assert data["method"] == "inline" assert data["succeeded"] is False assert data["traceback"] sphinx_run.get_report_file() @pytest.mark.skipif(ipy_version[0] < 8, reason="Error message changes for ipython v8") @pytest.mark.sphinx_params( "basic_failing.ipynb", conf={"nb_execution_mode": "cache", "nb_execution_allow_errors": True}, ) def test_allow_errors_cache(sphinx_run, file_regression, check_nbs): sphinx_run.build() # print(sphinx_run.status()) assert not sphinx_run.warnings() regress_nb_doc(file_regression, sphinx_run, check_nbs) @pytest.mark.skipif(ipy_version[0] < 8, reason="Error message changes for ipython v8") @pytest.mark.sphinx_params( "basic_failing.ipynb", conf={"nb_execution_mode": "auto", "nb_execution_allow_errors": True}, ) def test_allow_errors_auto(sphinx_run, file_regression, check_nbs): sphinx_run.build() # print(sphinx_run.status()) assert not sphinx_run.warnings() regress_nb_doc(file_regression, sphinx_run, check_nbs) @pytest.mark.sphinx_params( "basic_failing.ipynb", conf={"nb_execution_raise_on_error": True, "nb_execution_mode": "force"}, ) def test_raise_on_error_force(sphinx_run): with pytest.raises(ExecutionError, match="basic_failing.ipynb"): sphinx_run.build() @pytest.mark.sphinx_params( "basic_failing.ipynb", conf={"nb_execution_raise_on_error": True, "nb_execution_mode": "cache"}, ) def test_raise_on_error_cache(sphinx_run): with pytest.raises(ExecutionError, match="basic_failing.ipynb"): sphinx_run.build() @pytest.mark.sphinx_params( "complex_outputs_unrun.ipynb", conf={"nb_execution_mode": "cache"} ) def test_complex_outputs_unrun_cache(sphinx_run, file_regression, check_nbs): sphinx_run.build() # print(sphinx_run.status()) assert sphinx_run.warnings() == "" regress_nb_doc(file_regression, sphinx_run, check_nbs) # Widget view and widget state should make it into the HTML scripts = sphinx_run.get_html().select("script") assert any( "application/vnd.jupyter.widget-view+json" in script.get("type", "") for script in scripts ) assert any( "application/vnd.jupyter.widget-state+json" in script.get("type", "") for script in scripts ) @pytest.mark.sphinx_params( "complex_outputs_unrun.ipynb", conf={"nb_execution_mode": "auto"} ) def test_complex_outputs_unrun_auto(sphinx_run, file_regression, check_nbs): sphinx_run.build() # print(sphinx_run.status()) assert sphinx_run.warnings() == "" regress_nb_doc(file_regression, sphinx_run, check_nbs) # Widget view and widget state should make it into the HTML scripts = sphinx_run.get_html().select("script") assert any( "application/vnd.jupyter.widget-view+json" in script.get("type", "") for script in scripts ) assert any( "application/vnd.jupyter.widget-state+json" in script.get("type", "") for script in scripts ) @pytest.mark.sphinx_params("basic_unrun.ipynb", conf={"nb_execution_mode": "off"}) def test_no_execute(sphinx_run, file_regression, check_nbs): sphinx_run.build() # print(sphinx_run.status()) assert sphinx_run.warnings() == "" regress_nb_doc(file_regression, sphinx_run, check_nbs) @pytest.mark.sphinx_params("basic_unrun.ipynb", conf={"nb_execution_mode": "cache"}) def test_jupyter_cache_path(sphinx_run, file_regression, check_nbs): sphinx_run.build() assert "Cached executed notebook" in sphinx_run.status() assert sphinx_run.warnings() == "" regress_nb_doc(file_regression, sphinx_run, check_nbs) # Testing relative paths within the notebook @pytest.mark.sphinx_params("basic_relative.ipynb", conf={"nb_execution_mode": "cache"}) def test_relative_path_cache(sphinx_run): sphinx_run.build() assert "Execution Failed" not in sphinx_run.status(), sphinx_run.status() @pytest.mark.sphinx_params("basic_relative.ipynb", conf={"nb_execution_mode": "force"}) def test_relative_path_force(sphinx_run): sphinx_run.build() assert "Execution Failed" not in sphinx_run.status(), sphinx_run.status() @pytest.mark.sphinx_params( "kernel_alias.md", conf={"nb_execution_mode": "force", "nb_kernel_rgx_aliases": {"oth.+": "python3"}}, ) def test_kernel_rgx_aliases(sphinx_run): sphinx_run.build() assert sphinx_run.warnings() == "" @pytest.mark.sphinx_params( "sleep_10.ipynb", conf={"nb_execution_mode": "cache", "nb_execution_timeout": 1}, ) def test_execution_timeout(sphinx_run): """execution should fail given the low timeout value""" sphinx_run.build() # print(sphinx_run.warnings()) assert "Executing notebook failed" in sphinx_run.warnings() @pytest.mark.sphinx_params( "sleep_10_metadata_timeout.ipynb", conf={"nb_execution_mode": "cache", "nb_execution_timeout": 60}, ) def test_execution_metadata_timeout(sphinx_run): """notebook timeout metadata has higher preference then execution_timeout config""" sphinx_run.build() # print(sphinx_run.warnings()) assert "Executing notebook failed" in sphinx_run.warnings() @pytest.mark.sphinx_params( "nb_exec_table.md", conf={"nb_execution_mode": "auto"}, ) def test_nb_exec_table(sphinx_run, file_regression): """Test that the table gets output into the HTML, including a row for the executed notebook. """ sphinx_run.build() # print(sphinx_run.status()) assert not sphinx_run.warnings() file_regression.check( sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8" ) # print(sphinx_run.get_html()) rows = sphinx_run.get_html().select("table.docutils tr") assert any("nb_exec_table" in row.text for row in rows) @pytest.mark.sphinx_params( "custom-formats.Rmd", conf={ "nb_execution_mode": "auto", "nb_custom_formats": {".Rmd": ["jupytext.reads", {"fmt": "Rmd"}]}, }, ) def test_custom_convert_auto(sphinx_run, file_regression, check_nbs): sphinx_run.build() # print(sphinx_run.status()) assert sphinx_run.warnings() == "" regress_nb_doc(file_regression, sphinx_run, check_nbs) assert NbMetadataCollector.new_exec_data(sphinx_run.env) data = NbMetadataCollector.get_exec_data(sphinx_run.env, "custom-formats") assert data assert data["method"] == "auto" assert data["succeeded"] is True @pytest.mark.sphinx_params( "custom-formats.Rmd", conf={ "nb_execution_mode": "cache", "nb_custom_formats": {".Rmd": ["jupytext.reads", {"fmt": "Rmd"}]}, }, ) def test_custom_convert_cache(sphinx_run, file_regression, check_nbs): """The outputs should be populated.""" sphinx_run.build() assert sphinx_run.warnings() == "" regress_nb_doc(file_regression, sphinx_run, check_nbs) assert NbMetadataCollector.new_exec_data(sphinx_run.env) data = NbMetadataCollector.get_exec_data(sphinx_run.env, "custom-formats") assert data assert data["method"] == "cache" assert data["succeeded"] is True ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/�������������������������������������������������������������������0000775�0000000�0000000�00000000000�14674535606�0016527�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_allow_errors_auto.ipynb���������������������������������������0000664�0000000�0000000�00000002540�14674535606�0024374�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "Exception", "evalue": "oopsie!", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moopsie!\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "\u001b[0;31mException\u001b[0m: oopsie!" ] } ], "source": [ "raise Exception('oopsie!')" ] } ], "metadata": { "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.10.12" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_allow_errors_auto.xml�����������������������������������������0000664�0000000�0000000�00000001726�14674535606�0024060�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_failing"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> raise Exception('oopsie!') <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output traceback" language="ipythontb" xml:space="preserve"> --------------------------------------------------------------------------- Exception Traceback (most recent call last) Cell In[1], line 1 ----> 1 raise Exception('oopsie!') Exception: oopsie! ������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_allow_errors_cache.ipynb��������������������������������������0000664�0000000�0000000�00000002540�14674535606�0024467�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "Exception", "evalue": "oopsie!", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moopsie!\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "\u001b[0;31mException\u001b[0m: oopsie!" ] } ], "source": [ "raise Exception('oopsie!')" ] } ], "metadata": { "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.10.12" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_allow_errors_cache.xml����������������������������������������0000664�0000000�0000000�00000001726�14674535606�0024153�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_failing"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> raise Exception('oopsie!') <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output traceback" language="ipythontb" xml:space="preserve"> --------------------------------------------------------------------------- Exception Traceback (most recent call last) Cell In[1], line 1 ----> 1 raise Exception('oopsie!') Exception: oopsie! ������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_failing_auto.ipynb��������������������������������������0000664�0000000�0000000�00000002540�14674535606�0024434�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "Exception", "evalue": "oopsie!", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moopsie!\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "\u001b[0;31mException\u001b[0m: oopsie!" ] } ], "source": [ "raise Exception('oopsie!')" ] } ], "metadata": { "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.10.12" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_failing_auto.xml����������������������������������������0000664�0000000�0000000�00000001726�14674535606�0024120�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_failing"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> raise Exception('oopsie!') <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output traceback" language="ipythontb" xml:space="preserve"> --------------------------------------------------------------------------- Exception Traceback (most recent call last) Cell In[1], line 1 ----> 1 raise Exception('oopsie!') Exception: oopsie! ������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_failing_cache.ipynb�������������������������������������0000664�0000000�0000000�00000002540�14674535606�0024527�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "Exception", "evalue": "oopsie!", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moopsie!\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "\u001b[0;31mException\u001b[0m: oopsie!" ] } ], "source": [ "raise Exception('oopsie!')" ] } ], "metadata": { "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.10.12" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_failing_cache.xml���������������������������������������0000664�0000000�0000000�00000001726�14674535606�0024213�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_failing"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> raise Exception('oopsie!') <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output traceback" language="ipythontb" xml:space="preserve"> --------------------------------------------------------------------------- Exception Traceback (most recent call last) Cell In[1], line 1 ----> 1 raise Exception('oopsie!') Exception: oopsie! ������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_failing_inline.ipynb������������������������������������0000664�0000000�0000000�00000002540�14674535606�0024742�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "ename": "Exception", "evalue": "oopsie!", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mException\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[1], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mException\u001b[39;00m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124moopsie!\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", "\u001b[0;31mException\u001b[0m: oopsie!" ] } ], "source": [ "raise Exception('oopsie!')" ] } ], "metadata": { "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.10.12" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_failing_inline.xml��������������������������������������0000664�0000000�0000000�00000001726�14674535606�0024426�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_failing"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> raise Exception('oopsie!') <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output traceback" language="ipythontb" xml:space="preserve"> --------------------------------------------------------------------------- Exception Traceback (most recent call last) Cell In[1], line 1 ----> 1 raise Exception('oopsie!') Exception: oopsie! ������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_unrun_auto.ipynb����������������������������������������0000664�0000000�0000000�00000001510�14674535606�0024166�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "a=1\n", "print(a)" ] } ], "metadata": { "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.10.12" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_unrun_auto.xml������������������������������������������0000664�0000000�0000000�00000001223�14674535606�0023646�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_unrun"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> a=1 print(a) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> 1 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_unrun_cache.ipynb���������������������������������������0000664�0000000�0000000�00000001510�14674535606�0024261�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "a=1\n", "print(a)" ] } ], "metadata": { "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.10.12" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_unrun_cache.xml�����������������������������������������0000664�0000000�0000000�00000001223�14674535606�0023741�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_unrun"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> a=1 print(a) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> 1 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_unrun_inline.ipynb��������������������������������������0000664�0000000�0000000�00000001510�14674535606�0024474�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "a=1\n", "print(a)" ] } ], "metadata": { "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.10.12" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_basic_unrun_inline.xml����������������������������������������0000664�0000000�0000000�00000001223�14674535606�0024154�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_unrun"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> a=1 print(a) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> 1 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_complex_outputs_unrun_auto.ipynb������������������������������0000664�0000000�0000000�00000044023�14674535606�0026365�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "init_cell": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import sympy as sym\n", "sym.init_printing(use_latex=True)\n", "import numpy as np\n", "from IPython.display import Image, Latex" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "# Markdown" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## General" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "Some markdown text.\n", "\n", "A list:\n", "\n", "- something\n", "- something else\n", "\n", "A numbered list\n", "\n", "1. something\n", "2. something else\n", "\n", "non-ascii characters TODO" ] }, { "cell_type": "markdown", "metadata": { "ipub": {} }, "source": [ "This is a long section of text, which we only want in a document (not a presentation)\n", "some text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true, "slideonly": true } }, "source": [ "This is an abbreviated section of the document text, which we only want in a presentation\n", "\n", "- summary of document text" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## References and Citations" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "References to \\cref{fig:example}, \\cref{tbl:example}, =@eqn:example_sympy and \\cref{code:example_mpl}.\n", "\n", "A latex citation.\\cite{zelenyak_molecular_2016}\n", "\n", "A html citation.<cite data-cite=\"kirkeminde_thermodynamic_2012\">(Kirkeminde, 2012)</cite> " ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## Todo notes" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "\\todo[inline]{an inline todo}\n", "\n", "Some text.\\todo{a todo in the margins}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Text Output" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ipub": { "text": { "format": { "backgroundcolor": "\\color{blue!10}" } } } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "This is some printed text,\n", "with a nicely formatted output.\n", "\n" ] } ], "source": [ "print(\"\"\"\n", "This is some printed text,\n", "with a nicely formatted output.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Images and Figures" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Displaying a plot with its code" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "fig:example_mpl" } }, "source": [ "A matplotlib figure, with the caption set in the markdowncell above the figure." ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_mpl" } }, "source": [ "The plotting code for a matplotlib figure (\\cref{fig:example_mpl})." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Tables (with pandas)" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_pd" } }, "source": [ "The plotting code for a pandas Dataframe table (\\cref{tbl:example})." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "", "label": "code:example_pd", "placement": "H", "widefigure": false }, "table": { "alternate": "gray!20", "caption": "An example of a table created with pandas dataframe.", "label": "tbl:example", "placement": "H" } } }, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>a</th>\n", " <th>b</th>\n", " <th>c</th>\n", " <th>d</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>$\\delta$</td>\n", " <td>l</td>\n", " <td>0.603</td>\n", " <td>0.545</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>x</td>\n", " <td>m</td>\n", " <td>0.438</td>\n", " <td>0.892</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>y</td>\n", " <td>n</td>\n", " <td>0.792</td>\n", " <td>0.529</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " a b c d\n", "0 $\\delta$ l 0.603 0.545\n", "1 x m 0.438 0.892\n", "2 y n 0.792 0.529" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(0) \n", "df = pd.DataFrame(np.random.rand(3,4),columns=['a','b','c','d'])\n", "df.a = [r'$\\delta$','x','y']\n", "df.b = ['l','m','n']\n", "df.set_index(['a','b'])\n", "df.round(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Equations (with ipython or sympy)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ipub": { "equation": { "label": "eqn:example_ipy" } } }, "outputs": [ { "data": { "text/latex": [ "$$ a = b+c $$" ], "text/plain": [ "<IPython.core.display.Latex object>" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Latex('$$ a = b+c $$')" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_sym" } }, "source": [ "The plotting code for a sympy equation (=@eqn:example_sympy)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "", "label": "code:example_sym", "placement": "H", "widefigure": false }, "equation": { "environment": "equation", "label": "eqn:example_sympy" } } }, "outputs": [ { "data": { "image/png": "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", "text/latex": [ "$\\displaystyle \\left(\\sqrt{5} i\\right)^{\\alpha} \\left(\\frac{1}{2} - \\frac{2 \\sqrt{5} i}{5}\\right) + \\left(- \\sqrt{5} i\\right)^{\\alpha} \\left(\\frac{1}{2} + \\frac{2 \\sqrt{5} i}{5}\\right)$" ], "text/plain": [ " \\alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž \\alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž\n", "(โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ - โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ + (-โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ + โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ\n", " โŽ2 5 โŽ  โŽ2 5 โŽ " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = sym.Function('y')\n", "n = sym.symbols(r'\\alpha')\n", "f = y(n)-2*y(n-1/sym.pi)-5*y(n-2)\n", "sym.rsolve(f,y(n),[1,4])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Interactive outputs\n", "\n", "## ipywidgets" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1337h4x0R", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Layout()" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import ipywidgets as widgets\n", "widgets.Layout(model_id=\"1337h4x0R\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "**_some_ markdown**" ], "text/plain": [ "<IPython.core.display.Markdown object>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import display, Markdown\n", "display(Markdown('**_some_ markdown**'))" ] } ], "metadata": { "celltoolbar": "Edit Metadata", "hide_input": false, "ipub": { "bibliography": "example.bib", "biboptions": [ "super", "sort" ], "bibstyle": "unsrtnat", "language": "portuges", "listcode": true, "listfigures": true, "listtables": true, "pandoc": { "at_notation": true, "use_numref": true }, "sphinx": { "bib_title": "My Bibliography" }, "titlepage": { "author": "Authors Name", "email": "authors@email.com", "institution": [ "Institution1", "Institution2" ], "logo": "logo_example.png", "subtitle": "Sub-Title", "supervisors": [ "First Supervisor", "Second Supervisor" ], "tagline": "A tagline for the report.", "title": "Main-Title" }, "toc": { "depth": 2 } }, "jupytext": { "notebook_metadata_filter": "ipub" }, "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.10.12" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "example.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": true }, "nav_menu": {}, "toc": { "colors": { "hover_highlight": "#DAA520", "navigate_num": "#000000", "navigate_text": "#333333", "running_highlight": "#FF0000", "selected_highlight": "#FFD700", "sidebar_border": "#EEEEEE", "wrapper_background": "#FFFFFF" }, "moveMenuLeft": true, "nav_menu": { "height": "161px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": false, "toc_section_display": "block", "toc_window_display": true, "widenNotebook": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "1337h4x0R": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 4 } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_complex_outputs_unrun_auto.xml��������������������������������0000664�0000000�0000000�00000033224�14674535606�0026045�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="complex_outputs_unrun"> <container cell_index="0" cell_metadata="{'init_cell': True, 'slideshow': {'slide_type': 'skip'}}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> import matplotlib.pyplot as plt import pandas as pd import sympy as sym sym.init_printing(use_latex=True) import numpy as np from IPython.display import Image, Latex <section ids="markdown" names="markdown"> <title> Markdown <section ids="general" names="general"> <title> General <paragraph> Some markdown text. <paragraph> A list: <bullet_list bullet="-"> <list_item> <paragraph> something <list_item> <paragraph> something else <paragraph> A numbered list <enumerated_list enumtype="arabic" prefix="" suffix="."> <list_item> <paragraph> something <list_item> <paragraph> something else <paragraph> non-ascii characters TODO <paragraph> This is a long section of text, which we only want in a document (not a presentation) some text some more text some more text some more text some more text some more text some more text some more text some more text <paragraph> This is an abbreviated section of the document text, which we only want in a presentation <bullet_list bullet="-"> <list_item> <paragraph> summary of document text <section ids="references-and-citations" names="references\ and\ citations"> <title> References and Citations <paragraph> References to \cref{fig:example}, \cref{tbl:example}, =@eqn:example_sympy and \cref{code:example_mpl}. <paragraph> A latex citation.\cite{zelenyak_molecular_2016} <paragraph> A html citation. <raw format="html" xml:space="preserve"> <cite data-cite="kirkeminde_thermodynamic_2012"> (Kirkeminde, 2012) <raw format="html" xml:space="preserve"> </cite> <section ids="todo-notes" names="todo\ notes"> <title> Todo notes <paragraph> \todo[inline]{an inline todo} <paragraph> Some text.\todo{a todo in the margins} <section ids="text-output" names="text\ output"> <title> Text Output <container cell_index="11" cell_metadata="{'ipub': {'text': {'format': {'backgroundcolor': '\\color{blue!10}'}}}}" classes="cell" exec_count="2" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> print(""" This is some printed text, with a nicely formatted output. """) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> This is some printed text, with a nicely formatted output. <section ids="images-and-figures" names="images\ and\ figures"> <title> Images and Figures <section ids="displaying-a-plot-with-its-code" names="displaying\ a\ plot\ with\ its\ code"> <title> Displaying a plot with its code <paragraph> A matplotlib figure, with the caption set in the markdowncell above the figure. <paragraph> The plotting code for a matplotlib figure (\cref{fig:example_mpl}). <section ids="tables-with-pandas" names="tables\ (with\ pandas)"> <title> Tables (with pandas) <paragraph> The plotting code for a pandas Dataframe table (\cref{tbl:example}). <container cell_index="18" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': '', 'label': 'code:example_pd', 'placement': 'H', 'widefigure': False}, 'table': {'alternate': 'gray!20', 'caption': 'An example of a table created with pandas dataframe.', 'label': 'tbl:example', 'placement': 'H'}}}" classes="cell" exec_count="3" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> np.random.seed(0) df = pd.DataFrame(np.random.rand(3,4),columns=['a','b','c','d']) df.a = [r'$\delta$','x','y'] df.b = ['l','m','n'] df.set_index(['a','b']) df.round(3) <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> a b c d 0 $\delta$ l 0.603 0.545 1 x m 0.438 0.892 2 y n 0.792 0.529 <container mime_type="text/html"> <raw classes="output text_html" format="html" xml:space="preserve"> <div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>a</th> <th>b</th> <th>c</th> <th>d</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>$\delta$</td> <td>l</td> <td>0.603</td> <td>0.545</td> </tr> <tr> <th>1</th> <td>x</td> <td>m</td> <td>0.438</td> <td>0.892</td> </tr> <tr> <th>2</th> <td>y</td> <td>n</td> <td>0.792</td> <td>0.529</td> </tr> </tbody> </table> </div> <section ids="equations-with-ipython-or-sympy" names="equations\ (with\ ipython\ or\ sympy)"> <title> Equations (with ipython or sympy) <container cell_index="20" cell_metadata="{'ipub': {'equation': {'label': 'eqn:example_ipy'}}}" classes="cell" exec_count="4" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> Latex('$$ a = b+c $$') <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <IPython.core.display.Latex object> <container mime_type="text/latex"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> a = b+c <paragraph> The plotting code for a sympy equation (=@eqn:example_sympy). <container cell_index="22" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': '', 'label': 'code:example_sym', 'placement': 'H', 'widefigure': False}, 'equation': {'environment': 'equation', 'label': 'eqn:example_sympy'}}}" classes="cell" exec_count="5" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> y = sym.Function('y') n = sym.symbols(r'\alpha') f = y(n)-2*y(n-1/sym.pi)-5*y(n-2) sym.rsolve(f,y(n),[1,4]) <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> \alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž \alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž (โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ - โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ + (-โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ + โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ โŽ2 5 โŽ  โŽ2 5 โŽ  <container mime_type="image/png"> <image candidates="{'*': '_build/jupyter_execute/9bc81205a14646a235d284d1b68223d17f30f7f1d3d8ed3e52cf47830b02e3bb.png'}" uri="_build/jupyter_execute/9bc81205a14646a235d284d1b68223d17f30f7f1d3d8ed3e52cf47830b02e3bb.png"> <container mime_type="text/latex"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> \displaystyle \left(\sqrt{5} i\right)^{\alpha} \left(\frac{1}{2} - \frac{2 \sqrt{5} i}{5}\right) + \left(- \sqrt{5} i\right)^{\alpha} \left(\frac{1}{2} + \frac{2 \sqrt{5} i}{5}\right) <section ids="interactive-outputs" names="interactive\ outputs"> <title> Interactive outputs <section ids="ipywidgets" names="ipywidgets"> <title> ipywidgets <container cell_index="24" cell_metadata="{}" classes="cell" exec_count="6" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> import ipywidgets as widgets widgets.Layout(model_id="1337h4x0R") <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> Layout() <container mime_type="application/vnd.jupyter.widget-view+json"> <raw format="html" xml:space="preserve"> <script type="application/vnd.jupyter.widget-view+json">{"version_major": 2, "version_minor": 0, "model_id": "1337h4x0R"}</script> <container cell_index="25" cell_metadata="{}" classes="cell" exec_count="7" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> from IPython.display import display, Markdown display(Markdown('**_some_ markdown**')) <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <IPython.core.display.Markdown object> <container mime_type="text/markdown"> <paragraph> <strong> <emphasis> some markdown ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_complex_outputs_unrun_cache.ipynb�����������������������������0000664�0000000�0000000�00000044023�14674535606�0026460�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "init_cell": true, "slideshow": { "slide_type": "skip" } }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import pandas as pd\n", "import sympy as sym\n", "sym.init_printing(use_latex=True)\n", "import numpy as np\n", "from IPython.display import Image, Latex" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "# Markdown" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## General" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "Some markdown text.\n", "\n", "A list:\n", "\n", "- something\n", "- something else\n", "\n", "A numbered list\n", "\n", "1. something\n", "2. something else\n", "\n", "non-ascii characters TODO" ] }, { "cell_type": "markdown", "metadata": { "ipub": {} }, "source": [ "This is a long section of text, which we only want in a document (not a presentation)\n", "some text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n", "some more text\n" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true, "slideonly": true } }, "source": [ "This is an abbreviated section of the document text, which we only want in a presentation\n", "\n", "- summary of document text" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## References and Citations" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "References to \\cref{fig:example}, \\cref{tbl:example}, =@eqn:example_sympy and \\cref{code:example_mpl}.\n", "\n", "A latex citation.\\cite{zelenyak_molecular_2016}\n", "\n", "A html citation.<cite data-cite=\"kirkeminde_thermodynamic_2012\">(Kirkeminde, 2012)</cite> " ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "## Todo notes" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "slide": true } }, "source": [ "\\todo[inline]{an inline todo}\n", "\n", "Some text.\\todo{a todo in the margins}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Text Output" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "ipub": { "text": { "format": { "backgroundcolor": "\\color{blue!10}" } } } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "This is some printed text,\n", "with a nicely formatted output.\n", "\n" ] } ], "source": [ "print(\"\"\"\n", "This is some printed text,\n", "with a nicely formatted output.\n", "\"\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Images and Figures" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Displaying a plot with its code" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "fig:example_mpl" } }, "source": [ "A matplotlib figure, with the caption set in the markdowncell above the figure." ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_mpl" } }, "source": [ "The plotting code for a matplotlib figure (\\cref{fig:example_mpl})." ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "# Tables (with pandas)" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_pd" } }, "source": [ "The plotting code for a pandas Dataframe table (\\cref{tbl:example})." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "", "label": "code:example_pd", "placement": "H", "widefigure": false }, "table": { "alternate": "gray!20", "caption": "An example of a table created with pandas dataframe.", "label": "tbl:example", "placement": "H" } } }, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border=\"1\" class=\"dataframe\">\n", " <thead>\n", " <tr style=\"text-align: right;\">\n", " <th></th>\n", " <th>a</th>\n", " <th>b</th>\n", " <th>c</th>\n", " <th>d</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>0</th>\n", " <td>$\\delta$</td>\n", " <td>l</td>\n", " <td>0.603</td>\n", " <td>0.545</td>\n", " </tr>\n", " <tr>\n", " <th>1</th>\n", " <td>x</td>\n", " <td>m</td>\n", " <td>0.438</td>\n", " <td>0.892</td>\n", " </tr>\n", " <tr>\n", " <th>2</th>\n", " <td>y</td>\n", " <td>n</td>\n", " <td>0.792</td>\n", " <td>0.529</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " a b c d\n", "0 $\\delta$ l 0.603 0.545\n", "1 x m 0.438 0.892\n", "2 y n 0.792 0.529" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "np.random.seed(0) \n", "df = pd.DataFrame(np.random.rand(3,4),columns=['a','b','c','d'])\n", "df.a = [r'$\\delta$','x','y']\n", "df.b = ['l','m','n']\n", "df.set_index(['a','b'])\n", "df.round(3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Equations (with ipython or sympy)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "ipub": { "equation": { "label": "eqn:example_ipy" } } }, "outputs": [ { "data": { "text/latex": [ "$$ a = b+c $$" ], "text/plain": [ "<IPython.core.display.Latex object>" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Latex('$$ a = b+c $$')" ] }, { "cell_type": "markdown", "metadata": { "ipub": { "caption": "code:example_sym" } }, "source": [ "The plotting code for a sympy equation (=@eqn:example_sympy)." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "ipub": { "code": { "asfloat": true, "caption": "", "label": "code:example_sym", "placement": "H", "widefigure": false }, "equation": { "environment": "equation", "label": "eqn:example_sympy" } } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAcMAAAAaCAYAAADLwDeNAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/OQEPoAAAACXBIWXMAABJ0AAASdAHeZh94AAALKElEQVR4nO2deawdVR3HPw8KLRRqK0GIhFWkgGhrBUUqaxVaKZSyhERQEGLEBLDIomz58lMWQYg1UYSI0lJbDVHEsFRUKBaCSFgegogsUhGxIFtZFSnPP85cet+82efMnXne+SYv8+6cc36/35zz+96zzO+cOzA0NEQUzGwt4ERJ8yMzxMDMogUWhKSBkPzZwMOSHvOpp0v+AcDrkm6uQn6/wMzGA6/6khf2A98ws48C75b0qyr15EVRHnrSXSmXAx2V8bnlsj/0whd8ogifBxI6wwuARZIeymHAR4BdJF2WtUxemNkA8CPgJEkveZa9A3CqpGN8yu039MIPqoCZXQJcJen+um3poAgPPentSRtWxeeWy/7QL3xeK0bIdGDdAgTcH7ghZ5lckDQEfA/4hk+5wQj8B8AZPuX2KSr3g4rwdeBSM1u7bkOgFA99oCdtWAWfWy57R1/wObIzBC4AriigfAtJfy9QLhck3Q3samZbeRR7FPCUpJUeZfYreuIHviFpFfAgcHTNpnRQlIc+0LM2rIDPLZf9oi/4PKIzNLP9gHGS/pxHsZltAvTS+X4KnOVDULBUczpuuaZFCdTgB77xQ8DMbFydRhTloSfddbShFz63XPaLfuJz1MzwGODWAkpnATcWKFcUy4HDzWx9D7L2ArYAbvEgq9/Raz/wCkl3AesBB9ZsSlEe+kAdbeiLz3vRctkn+obPY7o/BGurM4HjCuj9GHBVgXJF8QDuIfcEloYTg5e+FwG7Af/AfblsCnxZ0vRQ9kOBByS9VanF/YFe+0EVuA/nE1fXobwkD32gjjaM5XPL5VrRN3wOzwx3AiYAuaLpzGwdYLWkt/OUyyH/K2Y2ZGaf6dyT9G/gERxBwvl3AW4DlgEfAu4EDDgTODtCxZ64CmtRAnX4QUW4F+cTdaEQD32grjaM43PL5frQb3weE/o8Obj+K6eyTwC3xyWa2Qpgy5jkZyRtmiJ/5+B6d+j+c8B2EfkvAa6TdG6gfwlwHbBc0rDlEzNbF9gBWJJg/6G4ypwKTAE2BBZLOjLF7s6a+9PApbgvt/2BDwKbAW/iRsRXAldW5XQp9m0EzPVkV11+MKyeJZ1QUt/fgPeY2SaSnkmxqQoU5aEP1NaGRPO5qVw+B3+88QLPXIaafMEzlyEjn8Od4WbB9eUEwVHYD7gwJc8qYH7E/Swbs7+GC5N9NHT/ZdbYDICZbQrsDuzddftN3Cw4aiS5ZZC2KkH/WTjivAo8BWyfweYO5gTyH8KFe/8TN8p9EtgEOBgXMTjLzA4LQs17icOA73uyqy4/gDX1fI0HfR1f2BqoozMsykMfqLMNh/G5wVy+Br+88QXfNtXlCz653CkHKXwOd4bjgTcl/Scqc7B/Z62I9fhJkl5MMeglSeek5ImEpCdjklYR6gxxI0MYPtqYDPxFUtQoZ1JwTfriOQlHnMdwo8pliQYPx1zgedwS0IHADd2jMzM7A7gLOATntD/PIdsHctvVQD+ANfW83IO+ji9MzFkOADM7GjcS31vSrQVEJPLQBxrahmE+N5XLy4EBKuBzSd8p9B3TQF/wyWXIyOdwZ/g28RvxJwE/Cf4Wdt3fBni8gIGZYGZ74yLDLpZ0aih5DLA6dG8iMNS5b2Yb4t4vxIUHjw2ur8fZIOkdwphZVtMxswnAPsCSuCOhJK00s8uA83CRcD3tDMNLTWl2NdEPQvUc9oci6PhCXdsrYnnoA01swwBhPk+kmVxeTUy0ap18zstlaJ4vVMBlyMjncGf4CjDGzNaXFHaoD+CmmLPpqrTgc5bTCcaa2ZG4sOfXgD/i1v3THnhacL03Im1CYHM3BnGjttPNbDHwLdyywbZm9n5J4Sn5G8F1gwzPkBezgXWBX6Tk+29wbVoEXJRdTfSDpHouoq/jC28k5KkSSTz0gSa2IYzk8yCjj8vQTD7H2dQ0X/DNZcjI5/DoszNtnRDOGCxLnAvsG0QZdbCjpD+lGAMuFHoRbnQyHzcqeNTM0qJ80jrDYVNtSU/gRo9fwgWsvAJ8EncSwR0RMl7okuUbc3GN9uu4DGY2Bvhc8LExh0TH2dVQP0iq5yL6Or7wfIpNVSGWhz7Q0DaEEJ9HG5ehmXxOsqmBvuCby5CRz+HOsPPw4fdwAAQjsZXAHvDOLxO8lmIIuDXwGbiHGY+LdLoc2ApYamZTEspOw70gfSQi7b1dNnfbeb6kjSWNk3SEpBclTZe0cYSMJ3GjpXdleI7MCE48mAksDcLG4/BNXCj9jZJu8mlDScTa1SQ/SKnnovo6vlDZMlEKEnnoA01qwy6M4PMo4zI0k8+JNjXFFyriMmTk87BlUkmPmdlK4MPAPTFlrsdNZW/GjdJ+m6QgkBtenH8QOM7MXgVOZk2Y8jAEjbIdcEc4AsrMJuIq4rY0/Sm2vWVmDwLblpETgU/hpuexyypmdiLu+R8GPptFaEqIcRQyhY0XsKsRfkBCPRfVh/OFFRmCB9LaY1nEe6mFko5OkpnGQ48+0JQ29MLnOrkM+flche+UsKkJvlAFlyEjn8PvDAGuZc0UNgrX43rkk3AvY09PUpCCy3APskdM+hTc7DVqWWUqbi/KH0ro72AZzgF84mBcGHjkuruZHQ98B7flYoakF6LyReBxIG102o2nc+TNY1dT/CCxngvqm0b2KMP5jIxSm4oLD18IrAilDWaUey3xPPTlA01pQ/DH555zGQrzeT7V+E4Rm5rgC1VwGTLyOaozvBz4mZkNxOxHuQ23gXEyMDbDskESOpuKx8ekd74Mok6UmAlckXMTaRyuBk4ws/UklQ6aMHec1gHALXInp4fT5wHfxo1uZkh6NqtsSTPK2heHnHbV7gdp9VxEXxBmPgX3HiUVivjR3SA8fg6woODWCkjgoUcfqL0Nu+CLzz3lcpBnHgX4XKHvFLGpVl+ogsuB3Mx8HhG+LWkQtyclsqcN9qLchNu8OpjF2gTsGlz/GpMe+ZI1eMBZuNMpSkPSnbjlqE/7kIeru42ImO6b2VdxTjqI20uUuSOsEnntaoIfkFDPJfTtAzxLhmWiKpHGQ086mtCGXvncSy5DM/lcxKYG+EIVXIYcfI7by3Qm8IWEctcDR5DhNHMz2yFYIw7f3wr4bvDxxzHFp+GWg8I/bjoH9wvGPk/oOA34vCdZc3F7xX7ZfdPMzsa9zL4HN1p7zpO+UihhV91+EFnPJfUdA5zncY9TGaTx0AfqbkPwz+fKuQzN5HNJm+r0hSq4DDn4HLVMiqQnzGypmc2SNOIXIXCVdZ+kp9IUAIcDJ5vZctwZca8A78OdnzcukHVxuJCZjQV2BAbVdTKCmW0A7Ascn0F3ZkhabmbzovYvmdlBwEHBx84ZeB83swXB/89JOiXIOxDk/b26zsEzs6NwRw+txi1JnBjxgnyFpAXhm1WipF11+kFkPZfRZ2ab4SIaF9IAZOChD9TWhkGadz5XzeUgrXF89mBTLb5QBZcDubn4HNkZAkhabGaHxaQ9b2aHZFGAe3E5GRcZNx23tvsS7gDYRcCimHeTOwHrMHJZZTfgtIpG7l8ELjSzY0M2TcX9enY3tgn+wDXQKcH/OwObM/IMva2D69rAvBj9vwMW5LS5LArbVbMfxNVzGX0XAMd6eg/tBUk89CS/zjaE6vhcJZehmXwuZVONvlAFlyEnnweGhnp9LnSzYWbbA5tL+k3B8ufjIrG2kds03KIC+K5nM9sdGKOu47pajG60XB4dqKKei/C5svMPRyskPUy54Im5wP0teSqH73q+ve0I/7/QcnnUoIp6zs3ndmbYokWLFi36Hu3MsEWLFi1a9D3+B4gv68zv5KiRAAAAAElFTkSuQmCC", "text/latex": [ "$\\displaystyle \\left(\\sqrt{5} i\\right)^{\\alpha} \\left(\\frac{1}{2} - \\frac{2 \\sqrt{5} i}{5}\\right) + \\left(- \\sqrt{5} i\\right)^{\\alpha} \\left(\\frac{1}{2} + \\frac{2 \\sqrt{5} i}{5}\\right)$" ], "text/plain": [ " \\alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž \\alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž\n", "(โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ - โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ + (-โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ + โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ\n", " โŽ2 5 โŽ  โŽ2 5 โŽ " ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y = sym.Function('y')\n", "n = sym.symbols(r'\\alpha')\n", "f = y(n)-2*y(n-1/sym.pi)-5*y(n-2)\n", "sym.rsolve(f,y(n),[1,4])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Interactive outputs\n", "\n", "## ipywidgets" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "1337h4x0R", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Layout()" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import ipywidgets as widgets\n", "widgets.Layout(model_id=\"1337h4x0R\")" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/markdown": [ "**_some_ markdown**" ], "text/plain": [ "<IPython.core.display.Markdown object>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from IPython.display import display, Markdown\n", "display(Markdown('**_some_ markdown**'))" ] } ], "metadata": { "celltoolbar": "Edit Metadata", "hide_input": false, "ipub": { "bibliography": "example.bib", "biboptions": [ "super", "sort" ], "bibstyle": "unsrtnat", "language": "portuges", "listcode": true, "listfigures": true, "listtables": true, "pandoc": { "at_notation": true, "use_numref": true }, "sphinx": { "bib_title": "My Bibliography" }, "titlepage": { "author": "Authors Name", "email": "authors@email.com", "institution": [ "Institution1", "Institution2" ], "logo": "logo_example.png", "subtitle": "Sub-Title", "supervisors": [ "First Supervisor", "Second Supervisor" ], "tagline": "A tagline for the report.", "title": "Main-Title" }, "toc": { "depth": 2 } }, "jupytext": { "notebook_metadata_filter": "ipub" }, "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.10.12" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autocomplete": true, "bibliofile": "example.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": true }, "nav_menu": {}, "toc": { "colors": { "hover_highlight": "#DAA520", "navigate_num": "#000000", "navigate_text": "#333333", "running_highlight": "#FF0000", "selected_highlight": "#FFD700", "sidebar_border": "#EEEEEE", "wrapper_background": "#FFFFFF" }, "moveMenuLeft": true, "nav_menu": { "height": "161px", "width": "252px" }, "navigate_menu": true, "number_sections": true, "sideBar": true, "threshold": 4, "toc_cell": false, "toc_section_display": "block", "toc_window_display": true, "widenNotebook": false }, "varInspector": { "cols": { "lenName": 16, "lenType": 16, "lenVar": 40 }, "kernels_config": { "python": { "delete_cmd_postfix": "", "delete_cmd_prefix": "del ", "library": "var_list.py", "varRefreshCmd": "print(var_dic_list())" }, "r": { "delete_cmd_postfix": ") ", "delete_cmd_prefix": "rm(", "library": "var_list.r", "varRefreshCmd": "cat(var_dic_list()) " } }, "types_to_exclude": [ "module", "function", "builtin_function_or_method", "instance", "_Feature" ], "window_display": false }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": { "1337h4x0R": { "model_module": "@jupyter-widgets/base", "model_module_version": "2.0.0", "model_name": "LayoutModel", "state": { "_model_module": "@jupyter-widgets/base", "_model_module_version": "2.0.0", "_model_name": "LayoutModel", "_view_count": null, "_view_module": "@jupyter-widgets/base", "_view_module_version": "2.0.0", "_view_name": "LayoutView", "align_content": null, "align_items": null, "align_self": null, "border_bottom": null, "border_left": null, "border_right": null, "border_top": null, "bottom": null, "display": null, "flex": null, "flex_flow": null, "grid_area": null, "grid_auto_columns": null, "grid_auto_flow": null, "grid_auto_rows": null, "grid_column": null, "grid_gap": null, "grid_row": null, "grid_template_areas": null, "grid_template_columns": null, "grid_template_rows": null, "height": null, "justify_content": null, "justify_items": null, "left": null, "margin": null, "max_height": null, "max_width": null, "min_height": null, "min_width": null, "object_fit": null, "object_position": null, "order": null, "overflow": null, "padding": null, "right": null, "top": null, "visibility": null, "width": null } } }, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 4 } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_complex_outputs_unrun_cache.xml�������������������������������0000664�0000000�0000000�00000033224�14674535606�0026140�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="complex_outputs_unrun"> <container cell_index="0" cell_metadata="{'init_cell': True, 'slideshow': {'slide_type': 'skip'}}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> import matplotlib.pyplot as plt import pandas as pd import sympy as sym sym.init_printing(use_latex=True) import numpy as np from IPython.display import Image, Latex <section ids="markdown" names="markdown"> <title> Markdown <section ids="general" names="general"> <title> General <paragraph> Some markdown text. <paragraph> A list: <bullet_list bullet="-"> <list_item> <paragraph> something <list_item> <paragraph> something else <paragraph> A numbered list <enumerated_list enumtype="arabic" prefix="" suffix="."> <list_item> <paragraph> something <list_item> <paragraph> something else <paragraph> non-ascii characters TODO <paragraph> This is a long section of text, which we only want in a document (not a presentation) some text some more text some more text some more text some more text some more text some more text some more text some more text <paragraph> This is an abbreviated section of the document text, which we only want in a presentation <bullet_list bullet="-"> <list_item> <paragraph> summary of document text <section ids="references-and-citations" names="references\ and\ citations"> <title> References and Citations <paragraph> References to \cref{fig:example}, \cref{tbl:example}, =@eqn:example_sympy and \cref{code:example_mpl}. <paragraph> A latex citation.\cite{zelenyak_molecular_2016} <paragraph> A html citation. <raw format="html" xml:space="preserve"> <cite data-cite="kirkeminde_thermodynamic_2012"> (Kirkeminde, 2012) <raw format="html" xml:space="preserve"> </cite> <section ids="todo-notes" names="todo\ notes"> <title> Todo notes <paragraph> \todo[inline]{an inline todo} <paragraph> Some text.\todo{a todo in the margins} <section ids="text-output" names="text\ output"> <title> Text Output <container cell_index="11" cell_metadata="{'ipub': {'text': {'format': {'backgroundcolor': '\\color{blue!10}'}}}}" classes="cell" exec_count="2" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> print(""" This is some printed text, with a nicely formatted output. """) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> This is some printed text, with a nicely formatted output. <section ids="images-and-figures" names="images\ and\ figures"> <title> Images and Figures <section ids="displaying-a-plot-with-its-code" names="displaying\ a\ plot\ with\ its\ code"> <title> Displaying a plot with its code <paragraph> A matplotlib figure, with the caption set in the markdowncell above the figure. <paragraph> The plotting code for a matplotlib figure (\cref{fig:example_mpl}). <section ids="tables-with-pandas" names="tables\ (with\ pandas)"> <title> Tables (with pandas) <paragraph> The plotting code for a pandas Dataframe table (\cref{tbl:example}). <container cell_index="18" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': '', 'label': 'code:example_pd', 'placement': 'H', 'widefigure': False}, 'table': {'alternate': 'gray!20', 'caption': 'An example of a table created with pandas dataframe.', 'label': 'tbl:example', 'placement': 'H'}}}" classes="cell" exec_count="3" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> np.random.seed(0) df = pd.DataFrame(np.random.rand(3,4),columns=['a','b','c','d']) df.a = [r'$\delta$','x','y'] df.b = ['l','m','n'] df.set_index(['a','b']) df.round(3) <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> a b c d 0 $\delta$ l 0.603 0.545 1 x m 0.438 0.892 2 y n 0.792 0.529 <container mime_type="text/html"> <raw classes="output text_html" format="html" xml:space="preserve"> <div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>a</th> <th>b</th> <th>c</th> <th>d</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>$\delta$</td> <td>l</td> <td>0.603</td> <td>0.545</td> </tr> <tr> <th>1</th> <td>x</td> <td>m</td> <td>0.438</td> <td>0.892</td> </tr> <tr> <th>2</th> <td>y</td> <td>n</td> <td>0.792</td> <td>0.529</td> </tr> </tbody> </table> </div> <section ids="equations-with-ipython-or-sympy" names="equations\ (with\ ipython\ or\ sympy)"> <title> Equations (with ipython or sympy) <container cell_index="20" cell_metadata="{'ipub': {'equation': {'label': 'eqn:example_ipy'}}}" classes="cell" exec_count="4" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> Latex('$$ a = b+c $$') <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <IPython.core.display.Latex object> <container mime_type="text/latex"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> a = b+c <paragraph> The plotting code for a sympy equation (=@eqn:example_sympy). <container cell_index="22" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': '', 'label': 'code:example_sym', 'placement': 'H', 'widefigure': False}, 'equation': {'environment': 'equation', 'label': 'eqn:example_sympy'}}}" classes="cell" exec_count="5" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> y = sym.Function('y') n = sym.symbols(r'\alpha') f = y(n)-2*y(n-1/sym.pi)-5*y(n-2) sym.rsolve(f,y(n),[1,4]) <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> \alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž \alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž (โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ - โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ + (-โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ + โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ โŽ2 5 โŽ  โŽ2 5 โŽ  <container mime_type="image/png"> <image candidates="{'*': '_build/jupyter_execute/9bc81205a14646a235d284d1b68223d17f30f7f1d3d8ed3e52cf47830b02e3bb.png'}" uri="_build/jupyter_execute/9bc81205a14646a235d284d1b68223d17f30f7f1d3d8ed3e52cf47830b02e3bb.png"> <container mime_type="text/latex"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> \displaystyle \left(\sqrt{5} i\right)^{\alpha} \left(\frac{1}{2} - \frac{2 \sqrt{5} i}{5}\right) + \left(- \sqrt{5} i\right)^{\alpha} \left(\frac{1}{2} + \frac{2 \sqrt{5} i}{5}\right) <section ids="interactive-outputs" names="interactive\ outputs"> <title> Interactive outputs <section ids="ipywidgets" names="ipywidgets"> <title> ipywidgets <container cell_index="24" cell_metadata="{}" classes="cell" exec_count="6" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> import ipywidgets as widgets widgets.Layout(model_id="1337h4x0R") <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> Layout() <container mime_type="application/vnd.jupyter.widget-view+json"> <raw format="html" xml:space="preserve"> <script type="application/vnd.jupyter.widget-view+json">{"version_major": 2, "version_minor": 0, "model_id": "1337h4x0R"}</script> <container cell_index="25" cell_metadata="{}" classes="cell" exec_count="7" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> from IPython.display import display, Markdown display(Markdown('**_some_ markdown**')) <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <IPython.core.display.Markdown object> <container mime_type="text/markdown"> <paragraph> <strong> <emphasis> some markdown ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_custom_convert_auto.ipynb�������������������������������������0000664�0000000�0000000�00000033143�14674535606�0024737�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "raw", "id": "28b0321f", "metadata": {}, "source": [ "---\n", "title: \"Test chunk options in Rmd/Jupyter conversion\"\n", "author: \"Marc Wouts\"\n", "date: \"June 16, 2018\"\n", "---" ] }, { "cell_type": "markdown", "id": "58a3e81a", "metadata": {}, "source": [ "# Custom Formats" ] }, { "cell_type": "code", "execution_count": 1, "id": "be1f1414", "metadata": { "echo": true }, "outputs": [], "source": [ "import pandas as pd\n", "x = pd.Series({'A':1, 'B':3, 'C':2})" ] }, { "cell_type": "code", "execution_count": 2, "id": "64b71941", "metadata": { "fig.height": 5, "fig.width": 8, "name": "bar_plot", "tags": [ "remove_input" ] }, "outputs": [ { "data": { "text/plain": [ "<Axes: title={'center': 'Sample plot'}>" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x.plot(kind='bar', title='Sample plot')" ] } ], "metadata": { "jupytext": { "text_representation": { "extension": ".Rmd", "format_name": "rmarkdown" } }, "kernelspec": { "display_name": "Python", "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.10.12" } }, "nbformat": 4, "nbformat_minor": 5 } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_custom_convert_auto.xml���������������������������������������0000664�0000000�0000000�00000003152�14674535606�0024413�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="custom-formats"> <section ids="custom-formats" names="custom\ formats"> <title> Custom Formats <container cell_index="2" cell_metadata="{'echo': True}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> import pandas as pd x = pd.Series({'A':1, 'B':3, 'C':2}) <container cell_index="3" cell_metadata="{'name': 'bar_plot', 'tags': ['remove_input'], 'fig.height': 5, 'fig.width': 8}" classes="cell tag_remove_input" exec_count="2" nb_element="cell_code"> <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <Axes: title={'center': 'Sample plot'}> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <Figure size 640x480 with 1 Axes> <container mime_type="image/png"> <image candidates="{'*': '_build/jupyter_execute/a2e637020dfe58f670ba2c942d7a55e49ba48bed09312569ee15a84f5ac680cb.png'}" uri="_build/jupyter_execute/a2e637020dfe58f670ba2c942d7a55e49ba48bed09312569ee15a84f5ac680cb.png"> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_custom_convert_cache.ipynb������������������������������������0000664�0000000�0000000�00000033143�14674535606�0025032�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "raw", "id": "4a49bac4", "metadata": {}, "source": [ "---\n", "title: \"Test chunk options in Rmd/Jupyter conversion\"\n", "author: \"Marc Wouts\"\n", "date: \"June 16, 2018\"\n", "---" ] }, { "cell_type": "markdown", "id": "df9ab2eb", "metadata": {}, "source": [ "# Custom Formats" ] }, { "cell_type": "code", "execution_count": 1, "id": "65052f1a", "metadata": { "echo": true }, "outputs": [], "source": [ "import pandas as pd\n", "x = pd.Series({'A':1, 'B':3, 'C':2})" ] }, { "cell_type": "code", "execution_count": 2, "id": "d7e1dd06", "metadata": { "fig.height": 5, "fig.width": 8, "name": "bar_plot", "tags": [ "remove_input" ] }, "outputs": [ { "data": { "text/plain": [ "<Axes: title={'center': 'Sample plot'}>" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "x.plot(kind='bar', title='Sample plot')" ] } ], "metadata": { "jupytext": { "text_representation": { "extension": ".Rmd", "format_name": "rmarkdown" } }, "kernelspec": { "display_name": "Python", "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.10.12" } }, "nbformat": 4, "nbformat_minor": 5 } �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_custom_convert_cache.xml��������������������������������������0000664�0000000�0000000�00000003152�14674535606�0024506�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="custom-formats"> <section ids="custom-formats" names="custom\ formats"> <title> Custom Formats <container cell_index="2" cell_metadata="{'echo': True}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> import pandas as pd x = pd.Series({'A':1, 'B':3, 'C':2}) <container cell_index="3" cell_metadata="{'name': 'bar_plot', 'tags': ['remove_input'], 'fig.height': 5, 'fig.width': 8}" classes="cell tag_remove_input" exec_count="2" nb_element="cell_code"> <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <Axes: title={'center': 'Sample plot'}> <container nb_element="mime_bundle"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <Figure size 640x480 with 1 Axes> <container mime_type="image/png"> <image candidates="{'*': '_build/jupyter_execute/a2e637020dfe58f670ba2c942d7a55e49ba48bed09312569ee15a84f5ac680cb.png'}" uri="_build/jupyter_execute/a2e637020dfe58f670ba2c942d7a55e49ba48bed09312569ee15a84f5ac680cb.png"> ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_exclude_path.xml����������������������������������������������0000664�0000000�0000000�00000000722�14674535606�0022756�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_unrun"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="True" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> a=1 print(a) ����������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_jupyter_cache_path.ipynb��������������������������������������0000664�0000000�0000000�00000001510�14674535606�0024467�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "a=1\n", "print(a)" ] } ], "metadata": { "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.10.12" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_jupyter_cache_path.xml����������������������������������������0000664�0000000�0000000�00000001223�14674535606�0024147�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_unrun"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> a=1 print(a) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> 1 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_nb_exec_table.xml���������������������������������������������0000664�0000000�0000000�00000001535�14674535606�0023066�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="nb_exec_table"> <section ids="test-the-nb-exec-table-directive" names="test\ the\ nb-exec-table\ directive"> <title> Test the <literal> nb-exec-table directive <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> print("hi") <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> hi <paragraph> This directive should generate a table of executed notebook statistics. <ExecutionStatsNode> �������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_no_execute.ipynb����������������������������������������������0000664�0000000�0000000�00000001342�14674535606�0022767�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# a title\n", "\n", "some text\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a=1\n", "print(a)" ] } ], "metadata": { "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.6.1" }, "test_name": "notebook1" }, "nbformat": 4, "nbformat_minor": 2 } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_execute/test_no_execute.xml������������������������������������������������0000664�0000000�0000000�00000000722�14674535606�0022447�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_unrun"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="True" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> a=1 print(a) ����������������������������������������������MyST-NB-1.1.2/tests/test_glue.py��������������������������������������������������������������������0000664�0000000�0000000�00000006202�14674535606�0016373�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Test the `glue` directives and roles.""" from IPython.core.displaypub import DisplayPublisher from IPython.core.interactiveshell import InteractiveShell import nbformat import pytest from myst_nb.ext.glue import extract_glue_data, glue class MockDisplayPublisher(DisplayPublisher): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.publish_calls = [] def publish(self, data, **kwargs): kwargs["data"] = data self.publish_calls.append(kwargs) @pytest.fixture() def mock_ipython(): """A mock IPython shell for testing notebook cell executions.""" shell = InteractiveShell.instance() # type: InteractiveShell shell.display_pub = MockDisplayPublisher() yield shell.display_pub InteractiveShell.clear_instance() def test_glue_func_text(mock_ipython): glue("a", "b") assert mock_ipython.publish_calls == [ { "metadata": {"scrapbook": {"name": "a", "mime_prefix": ""}}, "data": {"text/plain": "'b'"}, } ] def test_glue_func_obj(mock_ipython): class Obj: def __repr__(self): return "repr" def _repr_html_(self): return "<p>repr</p>" glue("a", Obj()) assert mock_ipython.publish_calls == [ { "metadata": {"scrapbook": {"name": "a", "mime_prefix": ""}}, "data": {"text/html": "<p>repr</p>", "text/plain": "repr"}, } ] def test_glue_func_obj_no_display(mock_ipython): class Obj: def __repr__(self): return "repr" def _repr_html_(self): return "<p>repr</p>" glue("a", Obj(), display=False) assert mock_ipython.publish_calls == [ { "metadata": { "scrapbook": { "name": "a", "mime_prefix": "application/papermill.record/", } }, "data": { "application/papermill.record/text/html": "<p>repr</p>", "application/papermill.record/text/plain": "repr", }, } ] def test_extract_glue_data(get_test_path): path = get_test_path("with_glue.ipynb") with open(path) as handle: notebook = nbformat.read(handle, as_version=4) data = extract_glue_data(notebook, [], None) assert set(data) == { "key_text1", "key_float", "key_undisplayed", "key_df", "key_plt", "sym_eq", } @pytest.mark.sphinx_params("with_glue.ipynb", conf={"nb_execution_mode": "off"}) def test_parser(sphinx_run, clean_doctree, file_regression): """Test a sphinx build.""" # TODO test duplicate warning in docutils sphinx_run.build() # print(sphinx_run.status()) # print(sphinx_run.warnings()) assert sphinx_run.warnings() == "" assert sphinx_run.env.nb_metadata["with_glue"]["glue"] == [ "key_text1", "key_float", "key_undisplayed", "key_df", "key_plt", "sym_eq", ] doctree = clean_doctree(sphinx_run.get_resolved_doctree("with_glue")) file_regression.check( doctree.pformat(), encoding="utf-8", ) ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_glue/����������������������������������������������������������������������0000775�0000000�0000000�00000000000�14674535606�0016021�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_glue/test_parser.txt�������������������������������������������������������0000664�0000000�0000000�00000020500�14674535606�0021112�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="with_glue"> <section ids="glue-tests" names="glue\ tests"> <title> Glue Tests <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> from myst_nb import glue <container cell_index="2" cell_metadata="{}" classes="cell" exec_count="2" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> glue("key_text1", "text1") glue("key_float", 3.14159) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output text_plain" language="myst-ansi" linenos="False" xml:space="preserve"> 'text1' <literal_block classes="output text_plain" language="myst-ansi" linenos="False" xml:space="preserve"> 3.14159 <container cell_index="3" cell_metadata="{}" classes="cell" exec_count="3" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> glue("key_undisplayed", "undisplayed", display=False) <container cell_index="4" cell_metadata="{'scrolled': True}" classes="cell" exec_count="4" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import pandas as pd df = pd.DataFrame({"header": [1, 2, 3]}) glue("key_df", df) <container classes="cell_output" nb_element="cell_code_output"> <raw classes="output text_html" format="html" xml:space="preserve"> <div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>header</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>1</td> </tr> <tr> <th>1</th> <td>2</td> </tr> <tr> <th>2</th> <td>3</td> </tr> </tbody> </table> </div> <container cell_index="5" cell_metadata="{}" classes="cell" exec_count="5" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import matplotlib.pyplot as plt plt.plot([1, 2, 3]) glue("key_plt", plt.gcf(), display=False) <container classes="cell_output" nb_element="cell_code_output"> <image candidates="{'*': '_build/jupyter_execute/8b394c6cdc09dc10c73e2d5f785aedc8eee615a4d219218f09d6732f7f8ef150.png'}" uri="_build/jupyter_execute/8b394c6cdc09dc10c73e2d5f785aedc8eee615a4d219218f09d6732f7f8ef150.png"> <section ids="referencing-the-figs" names="referencing\ the\ figs"> <title> Referencing the figs <paragraph> <inline classes="output text_plain"> โ€˜text1โ€™ , <image candidates="{'*': '_build/jupyter_execute/8b394c6cdc09dc10c73e2d5f785aedc8eee615a4d219218f09d6732f7f8ef150.png'}" uri="_build/jupyter_execute/8b394c6cdc09dc10c73e2d5f785aedc8eee615a4d219218f09d6732f7f8ef150.png"> <raw classes="output text_html" format="html" xml:space="preserve"> <div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>header</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>1</td> </tr> <tr> <th>1</th> <td>2</td> </tr> <tr> <th>2</th> <td>3</td> </tr> </tbody> </table> </div> <paragraph> and <inline classes="pasted-text"> text1 inlineโ€ฆ <paragraph> and formatted <inline classes="pasted-text"> 3.14 <image candidates="{'*': '_build/jupyter_execute/8b394c6cdc09dc10c73e2d5f785aedc8eee615a4d219218f09d6732f7f8ef150.png'}" uri="_build/jupyter_execute/8b394c6cdc09dc10c73e2d5f785aedc8eee615a4d219218f09d6732f7f8ef150.png"> <paragraph> and <inline classes="pasted-text"> undisplayed inlineโ€ฆ <figure ids="abc" names="abc"> <image candidates="{'*': '_build/jupyter_execute/8b394c6cdc09dc10c73e2d5f785aedc8eee615a4d219218f09d6732f7f8ef150.png'}" uri="_build/jupyter_execute/8b394c6cdc09dc10c73e2d5f785aedc8eee615a4d219218f09d6732f7f8ef150.png"> <caption> A captionโ€ฆ. ```## A test title <inline classes="output text_plain"> โ€˜text1โ€™ <section ids="math" names="math"> <title> Math <container cell_index="8" cell_metadata="{}" classes="cell" exec_count="6" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import sympy as sym f = sym.Function('f') y = sym.Function('y') n = sym.symbols(r'\alpha') f = y(n)-2*y(n-1/sym.pi)-5*y(n-2) glue("sym_eq", sym.rsolve(f,y(n),[1,4])) <container classes="cell_output" nb_element="cell_code_output"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> \displaystyle \left(\sqrt{5} i\right)^{\alpha} \left(\frac{1}{2} - \frac{2 \sqrt{5} i}{5}\right) + \left(- \sqrt{5} i\right)^{\alpha} \left(\frac{1}{2} + \frac{2 \sqrt{5} i}{5}\right) <target refid="equation-eq-sym"> <math_block classes="pasted-math" docname="with_glue" ids="equation-eq-sym" label="eq-sym" nowrap="False" number="1" xml:space="preserve"> \displaystyle \left(\sqrt{5} i\right)^{\alpha} \left(\frac{1}{2} - \frac{2 \sqrt{5} i}{5}\right) + \left(- \sqrt{5} i\right)^{\alpha} \left(\frac{1}{2} + \frac{2 \sqrt{5} i}{5}\right) ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_parser.py������������������������������������������������������������������0000664�0000000�0000000�00000007763�14674535606�0016750�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Test parsing of already executed notebooks.""" import os from pathlib import Path import pytest @pytest.mark.sphinx_params("basic_run.ipynb", conf={"nb_execution_mode": "off"}) def test_basic_run(sphinx_run, file_regression): sphinx_run.build() # print(sphinx_run.status()) assert sphinx_run.warnings() == "" assert set(sphinx_run.env.metadata["basic_run"].keys()) == { "test_name", "wordcount", "kernelspec", "language_info", } assert set(sphinx_run.env.nb_metadata["basic_run"].keys()) == set() assert sphinx_run.env.metadata["basic_run"]["test_name"] == "notebook1" assert sphinx_run.env.metadata["basic_run"]["kernelspec"] == { "display_name": "Python 3", "language": "python", "name": "python3", } file_regression.check( sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8" ) filenames = { p.name for p in Path( os.fspath(sphinx_run.app.srcdir / "_build" / "jupyter_execute") ).iterdir() } assert filenames == {"basic_run.ipynb"} @pytest.mark.sphinx_params("complex_outputs.ipynb", conf={"nb_execution_mode": "off"}) def test_complex_outputs(sphinx_run, file_regression): sphinx_run.build() assert sphinx_run.warnings() == "" assert set(sphinx_run.env.metadata["complex_outputs"].keys()) == { "ipub", "hide_input", "nav_menu", "celltoolbar", "latex_envs", "jupytext", "toc", "varInspector", "wordcount", "kernelspec", "language_info", } assert set(sphinx_run.env.nb_metadata["complex_outputs"].keys()) == set() assert sphinx_run.env.metadata["complex_outputs"]["celltoolbar"] == "Edit Metadata" assert sphinx_run.env.metadata["complex_outputs"]["hide_input"] == "False" assert sphinx_run.env.metadata["complex_outputs"]["kernelspec"] == { "display_name": "Python 3", "language": "python", "name": "python3", } doctree_string = sphinx_run.get_doctree().pformat() if os.name == "nt": # on Windows image file paths are absolute doctree_string = doctree_string.replace( Path(sphinx_run.app.srcdir).as_posix() + "/", "" ) file_regression.check(doctree_string, extension=".xml", encoding="utf-8") filenames = { p.name.replace(".jpeg", ".jpg") for p in Path( os.fspath(sphinx_run.app.srcdir / "_build" / "jupyter_execute") ).iterdir() } # print(filenames) assert filenames == { "16832f45917c1c9862c50f0948f64a498402d6ccde1f3a291da17f240797b160.png", "a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg", "8c43e5c8cccf697754876b7fec1b0a9b731d7900bb585e775a5fa326b4de8c5a.png", "complex_outputs.ipynb", } @pytest.mark.sphinx_params( "latex_build/index.ipynb", "latex_build/other.ipynb", conf={"nb_execution_mode": "off"}, buildername="latex", ) def test_toctree_in_ipynb(sphinx_run, file_regression): sphinx_run.build() print(sphinx_run.status()) print(sphinx_run.warnings()) file_regression.check( sphinx_run.get_doctree("latex_build/other").pformat(), extension=".xml" ) assert sphinx_run.warnings() == "" @pytest.mark.sphinx_params("ipywidgets.ipynb", conf={"nb_execution_mode": "off"}) def test_ipywidgets(sphinx_run): """Test that ipywidget state is extracted and JS is included in the HTML head.""" sphinx_run.build() # print(sphinx_run.status()) assert sphinx_run.warnings() == "" assert "js_files" in sphinx_run.env.nb_metadata["ipywidgets"] assert set(sphinx_run.env.nb_metadata["ipywidgets"]["js_files"]) == { "ipywidgets_state", "ipywidgets_0", "ipywidgets_1", } head_scripts = sphinx_run.get_html().select("head > script") assert any("require.js" in script.get("src", "") for script in head_scripts) assert any("embed-amd.js" in script.get("src", "") for script in head_scripts) �������������MyST-NB-1.1.2/tests/test_parser/��������������������������������������������������������������������0000775�0000000�0000000�00000000000�14674535606�0016361�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_parser/test_basic_run.xml��������������������������������������������������0000664�0000000�0000000�00000001221�14674535606�0022103�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_run"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> a=1 print(a) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> 1 �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_parser/test_complex_outputs.xml��������������������������������������������0000664�0000000�0000000�00000036551�14674535606�0023426�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="complex_outputs"> <container cell_index="0" cell_metadata="{'init_cell': True, 'slideshow': {'slide_type': 'skip'}}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> import matplotlib.pyplot as plt import pandas as pd import sympy as sym sym.init_printing(use_latex=True) import numpy as np from IPython.display import Image, Latex <section ids="markdown" names="markdown"> <title> Markdown <section ids="general" names="general"> <title> General <paragraph> Some markdown text. <paragraph> A list: <bullet_list bullet="-"> <list_item> <paragraph> something <list_item> <paragraph> something else <paragraph> A numbered list <enumerated_list enumtype="arabic" prefix="" suffix="."> <list_item> <paragraph> something <list_item> <paragraph> something else <paragraph> non-ascii characters TODO <paragraph> This is a long section of text, which we only want in a document (not a presentation) some text some more text some more text some more text some more text some more text some more text some more text some more text <paragraph> This is an abbreviated section of the document text, which we only want in a presentation <bullet_list bullet="-"> <list_item> <paragraph> summary of document text <section ids="references-and-citations" names="references\ and\ citations"> <title> References and Citations <paragraph> References to \cref{fig:example}, \cref{tbl:example}, =@eqn:example_sympy and \cref{code:example_mpl}. <paragraph> A latex citation.\cite{zelenyak_molecular_2016} <paragraph> A html citation. <raw format="html" xml:space="preserve"> <cite data-cite="kirkeminde_thermodynamic_2012"> (Kirkeminde, 2012) <raw format="html" xml:space="preserve"> </cite> <section ids="todo-notes" names="todo\ notes"> <title> Todo notes <paragraph> \todo[inline]{an inline todo} <paragraph> Some text.\todo{a todo in the margins} <section ids="text-output" names="text\ output"> <title> Text Output <container cell_index="11" cell_metadata="{'ipub': {'text': {'format': {'backgroundcolor': '\\color{blue!10}'}}}}" classes="cell" exec_count="2" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> print(""" This is some printed text, with a nicely formatted output. """) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> This is some printed text, with a nicely formatted output. <section ids="images-and-figures" names="images\ and\ figures"> <title> Images and Figures <container cell_index="13" cell_metadata="{'ipub': {'figure': {'caption': 'A nice picture.', 'label': 'fig:example', 'placement': '!bh'}}}" classes="cell" exec_count="3" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> Image('example.jpg',height=400) <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="image/jpeg"> <image candidates="{'*': '_build/jupyter_execute/a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg'}" height="400" uri="_build/jupyter_execute/a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <IPython.core.display.Image object> <section ids="displaying-a-plot-with-its-code" names="displaying\ a\ plot\ with\ its\ code"> <title> Displaying a plot with its code <paragraph> A matplotlib figure, with the caption set in the markdowncell above the figure. <paragraph> The plotting code for a matplotlib figure (\cref{fig:example_mpl}). <container cell_index="17" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': 'a', 'label': 'code:example_mpl', 'widefigure': False}, 'figure': {'caption': '', 'label': 'fig:example_mpl', 'widefigure': False}}}" classes="cell" exec_count="4" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> plt.scatter(np.random.rand(10), np.random.rand(10), label='data label') plt.ylabel(r'a y label with latex $\alpha$') plt.legend(); <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="image/png"> <image candidates="{'*': '_build/jupyter_execute/16832f45917c1c9862c50f0948f64a498402d6ccde1f3a291da17f240797b160.png'}" height="288" uri="_build/jupyter_execute/16832f45917c1c9862c50f0948f64a498402d6ccde1f3a291da17f240797b160.png" width="432"> <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <Figure size 432x288 with 1 Axes> <section ids="tables-with-pandas" names="tables\ (with\ pandas)"> <title> Tables (with pandas) <paragraph> The plotting code for a pandas Dataframe table (\cref{tbl:example}). <container cell_index="20" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': '', 'label': 'code:example_pd', 'placement': 'H', 'widefigure': False}, 'table': {'alternate': 'gray!20', 'caption': 'An example of a table created with pandas dataframe.', 'label': 'tbl:example', 'placement': 'H'}}}" classes="cell" exec_count="5" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> df = pd.DataFrame(np.random.rand(3,4),columns=['a','b','c','d']) df.a = [r'$\delta$','x','y'] df.b = ['l','m','n'] df.set_index(['a','b']) df.round(3) <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/html"> <raw classes="output text_html" format="html" xml:space="preserve"> <div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>a</th> <th>b</th> <th>c</th> <th>d</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>$\delta$</td> <td>l</td> <td>0.391</td> <td>0.607</td> </tr> <tr> <th>1</th> <td>x</td> <td>m</td> <td>0.132</td> <td>0.205</td> </tr> <tr> <th>2</th> <td>y</td> <td>n</td> <td>0.969</td> <td>0.726</td> </tr> </tbody> </table> </div> <container mime_type="text/latex"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> \begin{tabular}{lllrr} \toprule {} & a & b & c & d \\ \midrule 0 & \$\textbackslash delta\$ & l & 0.391 & 0.607 \\ 1 & x & m & 0.132 & 0.205 \\ 2 & y & n & 0.969 & 0.726 \\ \bottomrule \end{tabular} <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> a b c d 0 $\delta$ l 0.391 0.607 1 x m 0.132 0.205 2 y n 0.969 0.726 <section ids="equations-with-ipython-or-sympy" names="equations\ (with\ ipython\ or\ sympy)"> <title> Equations (with ipython or sympy) <container cell_index="22" cell_metadata="{'ipub': {'equation': {'label': 'eqn:example_ipy'}}}" classes="cell" exec_count="6" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> Latex('$$ a = b+c $$') <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/latex"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> a = b+c <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <IPython.core.display.Latex object> <paragraph> The plotting code for a sympy equation (=@eqn:example_sympy). <container cell_index="24" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': '', 'label': 'code:example_sym', 'placement': 'H', 'widefigure': False}, 'equation': {'environment': 'equation', 'label': 'eqn:example_sympy'}}}" classes="cell" exec_count="7" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> y = sym.Function('y') n = sym.symbols(r'\alpha') f = y(n)-2*y(n-1/sym.pi)-5*y(n-2) sym.rsolve(f,y(n),[1,4]) <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="image/png"> <image candidates="{'*': '_build/jupyter_execute/8c43e5c8cccf697754876b7fec1b0a9b731d7900bb585e775a5fa326b4de8c5a.png'}" uri="_build/jupyter_execute/8c43e5c8cccf697754876b7fec1b0a9b731d7900bb585e775a5fa326b4de8c5a.png"> <container mime_type="text/latex"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> \displaystyle \left(\sqrt{5} i\right)^{\alpha} \left(\frac{1}{2} - \frac{2 \sqrt{5} i}{5}\right) + \left(- \sqrt{5} i\right)^{\alpha} \left(\frac{1}{2} + \frac{2 \sqrt{5} i}{5}\right) <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> \alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž \alpha โŽ›1 2โ‹…โˆš5โ‹…โ…ˆโŽž (โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ - โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ + (-โˆš5โ‹…โ…ˆ) โ‹…โŽœโ”€ + โ”€โ”€โ”€โ”€โ”€โ”€โŽŸ โŽ2 5 โŽ  โŽ2 5 โŽ  <container cell_index="25" cell_metadata="{}" classes="cell" exec_count="7" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> from IPython.display import display, Markdown display(Markdown('**_some_ markdown**')) <container classes="cell_output" nb_element="cell_code_output"> <container nb_element="mime_bundle"> <container mime_type="text/markdown"> <paragraph> <strong> <emphasis> some markdown <container mime_type="text/plain"> <literal_block classes="output text_plain" language="myst-ansi" xml:space="preserve"> <IPython.core.display.Markdown object> �������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_parser/test_toctree_in_ipynb.xml�������������������������������������������0000664�0000000�0000000�00000001733�14674535606�0023502�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="latex_build/other"> <target refid="title-ref"> <section ids="title title-ref" names="title title_ref"> <title refid="id1"> Title <topic classes="contents" ids="contents" names="contents"> <title> Contents <bullet_list> <list_item> <paragraph> <reference ids="id1" refid="title"> Title <paragraph> Content <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="3" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> print(1) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> 1 �������������������������������������MyST-NB-1.1.2/tests/test_render_outputs.py����������������������������������������������������������0000664�0000000�0000000�00000016456�14674535606�0020535�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������"""Tests for rendering code cell outputs.""" import pytest from myst_nb.core.render import EntryPointError, load_renderer from sphinx.util.fileutil import copy_asset_file def test_load_renderer_not_found(): """Test that an error is raised when the renderer is not found.""" with pytest.raises(EntryPointError, match="No Entry Point found"): load_renderer("other") # TODO sometimes fails in full tests # def test_load_renderer_not_subclass(monkeypatch): # """Test that an error is raised when the renderer is not a subclass.""" # from importlib_metadata import EntryPoint # monkeypatch.setattr(EntryPoint, "load", lambda self: object) # with pytest.raises(EntryPointError, match="Entry Point .* not a subclass"): # load_renderer("default") @pytest.mark.sphinx_params("basic_run.ipynb", conf={"nb_execution_mode": "off"}) def test_basic_run(sphinx_run, file_regression): sphinx_run.build() assert sphinx_run.warnings() == "" doctree = sphinx_run.get_resolved_doctree("basic_run") file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8") @pytest.mark.sphinx_params("file_level_config.md") def test_file_level_config_md(sphinx_run, file_regression): sphinx_run.build() assert sphinx_run.warnings() == "" doctree = sphinx_run.get_resolved_doctree("file_level_config") file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8") @pytest.mark.sphinx_params("file_level_config.ipynb") def test_file_level_config_ipynb(sphinx_run, file_regression): sphinx_run.build() assert sphinx_run.warnings() == "" doctree = sphinx_run.get_resolved_doctree("file_level_config") file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8") @pytest.mark.sphinx_params("complex_outputs.ipynb", conf={"nb_execution_mode": "off"}) def test_complex_outputs(sphinx_run, clean_doctree, file_regression): sphinx_run.build() assert sphinx_run.warnings() == "" doctree = clean_doctree(sphinx_run.get_resolved_doctree("complex_outputs")) file_regression.check( doctree.pformat().replace(".jpeg", ".jpg"), extension=".xml", encoding="utf-8" ) @pytest.mark.sphinx_params( "complex_outputs.ipynb", conf={"nb_execution_mode": "off"}, buildername="latex", ) def test_complex_outputs_latex(sphinx_run, clean_doctree, file_regression): sphinx_run.build() assert sphinx_run.warnings() == "" doctree = clean_doctree(sphinx_run.get_resolved_doctree("complex_outputs")) file_regression.check( doctree.pformat().replace(".jpeg", ".jpg"), extension=".xml", encoding="utf-8" ) @pytest.mark.sphinx_params( "basic_stderr.ipynb", conf={"nb_execution_mode": "off", "nb_output_stderr": "remove"}, ) def test_stderr_remove(sphinx_run, file_regression): """Test configuring all stderr outputs to be removed.""" sphinx_run.build() assert sphinx_run.warnings() == "" doctree = sphinx_run.get_resolved_doctree("basic_stderr") file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8") @pytest.mark.sphinx_params("basic_stderr.ipynb", conf={"nb_execution_mode": "off"}) def test_stderr_tag(sphinx_run, file_regression): """Test configuring stderr outputs to be removed from a single cell, using `remove-stderr` in the `cell.metadata.tags`. """ sphinx_run.build() assert sphinx_run.warnings() == "" doctree = sphinx_run.get_resolved_doctree("basic_stderr") file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8") @pytest.mark.sphinx_params( "merge_streams.ipynb", conf={"nb_execution_mode": "off", "nb_merge_streams": True}, ) def test_merge_streams(sphinx_run, file_regression): """Test configuring multiple concurrent stdout/stderr outputs to be merged.""" sphinx_run.build() assert sphinx_run.warnings() == "" doctree = sphinx_run.get_resolved_doctree("merge_streams") file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8") @pytest.mark.sphinx_params( "merge_streams_parallel.ipynb", conf={"nb_execution_mode": "off", "nb_merge_streams": True}, ) def test_merge_streams_parallel(sphinx_run, file_regression): """Test configuring multiple concurrent stdout/stderr outputs to be merged.""" sphinx_run.build() assert sphinx_run.warnings() == "" doctree = sphinx_run.get_resolved_doctree("merge_streams_parallel") file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8") @pytest.mark.sphinx_params( "metadata_image.ipynb", conf={"nb_execution_mode": "off", "nb_cell_metadata_key": "myst"}, ) def test_metadata_image(sphinx_run, clean_doctree, file_regression): """Test configuring image attributes to be rendered from cell metadata.""" sphinx_run.build() assert sphinx_run.warnings() == "" doctree = clean_doctree(sphinx_run.get_resolved_doctree("metadata_image")) file_regression.check( doctree.pformat().replace(".jpeg", ".jpg"), extension=".xml", encoding="utf-8" ) @pytest.mark.sphinx_params( "metadata_image_output.ipynb", conf={"nb_execution_mode": "force"}, ) def test_metadata_image_output( sphinx_run, clean_doctree, file_regression, get_test_path ): """Test configuring image attributes to be rendered from cell metadata.""" asset_path = get_test_path("example.jpg") copy_asset_file(str(asset_path), str(sphinx_run.app.srcdir)) sphinx_run.build() assert sphinx_run.warnings() == "" doctree = clean_doctree(sphinx_run.get_resolved_doctree("metadata_image_output")) file_regression.check( doctree.pformat().replace(".jpeg", ".jpg"), extension=".xml", encoding="utf-8" ) @pytest.mark.sphinx_params( "metadata_figure.ipynb", conf={"nb_execution_mode": "off", "nb_cell_metadata_key": "myst"}, ) def test_metadata_figure(sphinx_run, clean_doctree, file_regression): """Test configuring figure attributes to be rendered from cell metadata.""" sphinx_run.build() assert sphinx_run.warnings() == "" doctree = clean_doctree(sphinx_run.get_resolved_doctree("metadata_figure")) doctree_string = doctree.pformat() # change, presumably with new docutils version doctree_string = doctree_string.replace( '<figure ids="fun-fish" names="fun-fish">', '<figure align="default" ids="fun-fish" names="fun-fish">', ) file_regression.check( doctree_string.replace(".jpeg", ".jpg"), extension=".xml", encoding="utf-8" ) @pytest.mark.sphinx_params("unknown_mimetype.ipynb", conf={"nb_execution_mode": "off"}) def test_unknown_mimetype(sphinx_run, file_regression): """Test that unknown mimetypes provide a warning.""" sphinx_run.build() warning = "skipping unknown output mime type: unknown [mystnb.unknown_mime_type]" assert warning in sphinx_run.warnings() doctree = sphinx_run.get_resolved_doctree("unknown_mimetype") file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8") @pytest.mark.sphinx_params("hide_cell_content.ipynb", conf={"nb_execution_mode": "off"}) def test_hide_cell_content(sphinx_run, file_regression): """Test that hiding cell contents produces the correct AST.""" sphinx_run.build() assert sphinx_run.warnings() == "" doctree = sphinx_run.get_resolved_doctree("hide_cell_content") file_regression.check(doctree.pformat(), extension=".xml", encoding="utf-8") ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/������������������������������������������������������������0000775�0000000�0000000�00000000000�14674535606�0020147�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_basic_run.xml������������������������������������������0000664�0000000�0000000�00000001261�14674535606�0023675�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_run"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> some text <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> a=1 print(a) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve"> 1 �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_complex_outputs.xml������������������������������������0000664�0000000�0000000�00000027125�14674535606�0025211�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="complex_outputs"> <container cell_index="0" cell_metadata="{'init_cell': True, 'slideshow': {'slide_type': 'skip'}}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import matplotlib.pyplot as plt import pandas as pd import sympy as sym sym.init_printing(use_latex=True) import numpy as np from IPython.display import Image, Latex <section ids="markdown" names="markdown"> <title> Markdown <section ids="general" names="general"> <title> General <paragraph> Some markdown text. <paragraph> A list: <bullet_list bullet="-"> <list_item> <paragraph> something <list_item> <paragraph> something else <paragraph> A numbered list <enumerated_list enumtype="arabic" prefix="" suffix="."> <list_item> <paragraph> something <list_item> <paragraph> something else <paragraph> non-ascii characters TODO <paragraph> This is a long section of text, which we only want in a document (not a presentation) some text some more text some more text some more text some more text some more text some more text some more text some more text <paragraph> This is an abbreviated section of the document text, which we only want in a presentation <bullet_list bullet="-"> <list_item> <paragraph> summary of document text <section ids="references-and-citations" names="references\ and\ citations"> <title> References and Citations <paragraph> References to \cref{fig:example}, \cref{tbl:example}, =@eqn:example_sympy and \cref{code:example_mpl}. <paragraph> A latex citation.\cite{zelenyak_molecular_2016} <paragraph> A html citation. <raw format="html" xml:space="preserve"> <cite data-cite="kirkeminde_thermodynamic_2012"> (Kirkeminde, 2012) <raw format="html" xml:space="preserve"> </cite> <section ids="todo-notes" names="todo\ notes"> <title> Todo notes <paragraph> \todo[inline]{an inline todo} <paragraph> Some text.\todo{a todo in the margins} <section ids="text-output" names="text\ output"> <title> Text Output <container cell_index="11" cell_metadata="{'ipub': {'text': {'format': {'backgroundcolor': '\\color{blue!10}'}}}}" classes="cell" exec_count="2" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> print(""" This is some printed text, with a nicely formatted output. """) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve"> This is some printed text, with a nicely formatted output. <section ids="images-and-figures" names="images\ and\ figures"> <title> Images and Figures <container cell_index="13" cell_metadata="{'ipub': {'figure': {'caption': 'A nice picture.', 'label': 'fig:example', 'placement': '!bh'}}}" classes="cell" exec_count="3" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> Image('example.jpg',height=400) <container classes="cell_output" nb_element="cell_code_output"> <image candidates="{'*': '_build/jupyter_execute/a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg'}" height="400" uri="_build/jupyter_execute/a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg"> <section ids="displaying-a-plot-with-its-code" names="displaying\ a\ plot\ with\ its\ code"> <title> Displaying a plot with its code <paragraph> A matplotlib figure, with the caption set in the markdowncell above the figure. <paragraph> The plotting code for a matplotlib figure (\cref{fig:example_mpl}). <container cell_index="17" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': 'a', 'label': 'code:example_mpl', 'widefigure': False}, 'figure': {'caption': '', 'label': 'fig:example_mpl', 'widefigure': False}}}" classes="cell" exec_count="4" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> plt.scatter(np.random.rand(10), np.random.rand(10), label='data label') plt.ylabel(r'a y label with latex $\alpha$') plt.legend(); <container classes="cell_output" nb_element="cell_code_output"> <image candidates="{'*': '_build/jupyter_execute/16832f45917c1c9862c50f0948f64a498402d6ccde1f3a291da17f240797b160.png'}" height="288" uri="_build/jupyter_execute/16832f45917c1c9862c50f0948f64a498402d6ccde1f3a291da17f240797b160.png" width="432"> <section ids="tables-with-pandas" names="tables\ (with\ pandas)"> <title> Tables (with pandas) <paragraph> The plotting code for a pandas Dataframe table (\cref{tbl:example}). <container cell_index="20" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': '', 'label': 'code:example_pd', 'placement': 'H', 'widefigure': False}, 'table': {'alternate': 'gray!20', 'caption': 'An example of a table created with pandas dataframe.', 'label': 'tbl:example', 'placement': 'H'}}}" classes="cell" exec_count="5" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> df = pd.DataFrame(np.random.rand(3,4),columns=['a','b','c','d']) df.a = [r'$\delta$','x','y'] df.b = ['l','m','n'] df.set_index(['a','b']) df.round(3) <container classes="cell_output" nb_element="cell_code_output"> <raw classes="output text_html" format="html" xml:space="preserve"> <div> <style scoped> .dataframe tbody tr th:only-of-type { vertical-align: middle; } .dataframe tbody tr th { vertical-align: top; } .dataframe thead th { text-align: right; } </style> <table border="1" class="dataframe"> <thead> <tr style="text-align: right;"> <th></th> <th>a</th> <th>b</th> <th>c</th> <th>d</th> </tr> </thead> <tbody> <tr> <th>0</th> <td>$\delta$</td> <td>l</td> <td>0.391</td> <td>0.607</td> </tr> <tr> <th>1</th> <td>x</td> <td>m</td> <td>0.132</td> <td>0.205</td> </tr> <tr> <th>2</th> <td>y</td> <td>n</td> <td>0.969</td> <td>0.726</td> </tr> </tbody> </table> </div> <section ids="equations-with-ipython-or-sympy" names="equations\ (with\ ipython\ or\ sympy)"> <title> Equations (with ipython or sympy) <container cell_index="22" cell_metadata="{'ipub': {'equation': {'label': 'eqn:example_ipy'}}}" classes="cell" exec_count="6" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> Latex('$$ a = b+c $$') <container classes="cell_output" nb_element="cell_code_output"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> a = b+c <paragraph> The plotting code for a sympy equation (=@eqn:example_sympy). <container cell_index="24" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': '', 'label': 'code:example_sym', 'placement': 'H', 'widefigure': False}, 'equation': {'environment': 'equation', 'label': 'eqn:example_sympy'}}}" classes="cell" exec_count="7" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> y = sym.Function('y') n = sym.symbols(r'\alpha') f = y(n)-2*y(n-1/sym.pi)-5*y(n-2) sym.rsolve(f,y(n),[1,4]) <container classes="cell_output" nb_element="cell_code_output"> <image candidates="{'*': '_build/jupyter_execute/8c43e5c8cccf697754876b7fec1b0a9b731d7900bb585e775a5fa326b4de8c5a.png'}" uri="_build/jupyter_execute/8c43e5c8cccf697754876b7fec1b0a9b731d7900bb585e775a5fa326b4de8c5a.png"> <container cell_index="25" cell_metadata="{}" classes="cell" exec_count="7" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> from IPython.display import display, Markdown display(Markdown('**_some_ markdown**')) <container classes="cell_output" nb_element="cell_code_output"> <paragraph> <strong> <emphasis> some markdown �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_complex_outputs_latex.xml������������������������������0000664�0000000�0000000�00000024435�14674535606�0026407�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="complex_outputs"> <container cell_index="0" cell_metadata="{'init_cell': True, 'slideshow': {'slide_type': 'skip'}}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import matplotlib.pyplot as plt import pandas as pd import sympy as sym sym.init_printing(use_latex=True) import numpy as np from IPython.display import Image, Latex <section ids="markdown" names="markdown"> <title> Markdown <section ids="general" names="general"> <title> General <paragraph> Some markdown text. <paragraph> A list: <bullet_list bullet="-"> <list_item> <paragraph> something <list_item> <paragraph> something else <paragraph> A numbered list <enumerated_list enumtype="arabic" prefix="" suffix="."> <list_item> <paragraph> something <list_item> <paragraph> something else <paragraph> non-ascii characters TODO <paragraph> This is a long section of text, which we only want in a document (not a presentation) some text some more text some more text some more text some more text some more text some more text some more text some more text <paragraph> This is an abbreviated section of the document text, which we only want in a presentation <bullet_list bullet="-"> <list_item> <paragraph> summary of document text <section ids="references-and-citations" names="references\ and\ citations"> <title> References and Citations <paragraph> References to \cref{fig:example}, \cref{tbl:example}, =@eqn:example_sympy and \cref{code:example_mpl}. <paragraph> A latex citation.\cite{zelenyak_molecular_2016} <paragraph> A html citation. <raw format="html" xml:space="preserve"> <cite data-cite="kirkeminde_thermodynamic_2012"> (Kirkeminde, 2012) <raw format="html" xml:space="preserve"> </cite> <section ids="todo-notes" names="todo\ notes"> <title> Todo notes <paragraph> \todo[inline]{an inline todo} <paragraph> Some text.\todo{a todo in the margins} <section ids="text-output" names="text\ output"> <title> Text Output <container cell_index="11" cell_metadata="{'ipub': {'text': {'format': {'backgroundcolor': '\\color{blue!10}'}}}}" classes="cell" exec_count="2" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> print(""" This is some printed text, with a nicely formatted output. """) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve"> This is some printed text, with a nicely formatted output. <section ids="images-and-figures" names="images\ and\ figures"> <title> Images and Figures <container cell_index="13" cell_metadata="{'ipub': {'figure': {'caption': 'A nice picture.', 'label': 'fig:example', 'placement': '!bh'}}}" classes="cell" exec_count="3" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> Image('example.jpg',height=400) <container classes="cell_output" nb_element="cell_code_output"> <image candidates="{'*': '_build/jupyter_execute/a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg'}" height="400" uri="_build/jupyter_execute/a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg"> <section ids="displaying-a-plot-with-its-code" names="displaying\ a\ plot\ with\ its\ code"> <title> Displaying a plot with its code <paragraph> A matplotlib figure, with the caption set in the markdowncell above the figure. <paragraph> The plotting code for a matplotlib figure (\cref{fig:example_mpl}). <container cell_index="17" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': 'a', 'label': 'code:example_mpl', 'widefigure': False}, 'figure': {'caption': '', 'label': 'fig:example_mpl', 'widefigure': False}}}" classes="cell" exec_count="4" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> plt.scatter(np.random.rand(10), np.random.rand(10), label='data label') plt.ylabel(r'a y label with latex $\alpha$') plt.legend(); <container classes="cell_output" nb_element="cell_code_output"> <image candidates="{'*': '_build/jupyter_execute/16832f45917c1c9862c50f0948f64a498402d6ccde1f3a291da17f240797b160.png'}" height="288" uri="_build/jupyter_execute/16832f45917c1c9862c50f0948f64a498402d6ccde1f3a291da17f240797b160.png" width="432"> <section ids="tables-with-pandas" names="tables\ (with\ pandas)"> <title> Tables (with pandas) <paragraph> The plotting code for a pandas Dataframe table (\cref{tbl:example}). <container cell_index="20" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': '', 'label': 'code:example_pd', 'placement': 'H', 'widefigure': False}, 'table': {'alternate': 'gray!20', 'caption': 'An example of a table created with pandas dataframe.', 'label': 'tbl:example', 'placement': 'H'}}}" classes="cell" exec_count="5" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> df = pd.DataFrame(np.random.rand(3,4),columns=['a','b','c','d']) df.a = [r'$\delta$','x','y'] df.b = ['l','m','n'] df.set_index(['a','b']) df.round(3) <container classes="cell_output" nb_element="cell_code_output"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> \begin{tabular}{lllrr} \toprule {} & a & b & c & d \\ \midrule 0 & \$\textbackslash delta\$ & l & 0.391 & 0.607 \\ 1 & x & m & 0.132 & 0.205 \\ 2 & y & n & 0.969 & 0.726 \\ \bottomrule \end{tabular} <section ids="equations-with-ipython-or-sympy" names="equations\ (with\ ipython\ or\ sympy)"> <title> Equations (with ipython or sympy) <container cell_index="22" cell_metadata="{'ipub': {'equation': {'label': 'eqn:example_ipy'}}}" classes="cell" exec_count="6" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> Latex('$$ a = b+c $$') <container classes="cell_output" nb_element="cell_code_output"> <math_block classes="output text_latex" nowrap="False" number="True" xml:space="preserve"> a = b+c <paragraph> The plotting code for a sympy equation (=@eqn:example_sympy). <container cell_index="24" cell_metadata="{'ipub': {'code': {'asfloat': True, 'caption': '', 'label': 'code:example_sym', 'placement': 'H', 'widefigure': False}, 'equation': {'environment': 'equation', 'label': 'eqn:example_sympy'}}}" classes="cell" exec_count="7" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> y = sym.Function('y') n = sym.symbols(r'\alpha') f = y(n)-2*y(n-1/sym.pi)-5*y(n-2) sym.rsolve(f,y(n),[1,4]) <container classes="cell_output" nb_element="cell_code_output"> <image candidates="{'*': '_build/jupyter_execute/8c43e5c8cccf697754876b7fec1b0a9b731d7900bb585e775a5fa326b4de8c5a.png'}" uri="_build/jupyter_execute/8c43e5c8cccf697754876b7fec1b0a9b731d7900bb585e775a5fa326b4de8c5a.png"> <container cell_index="25" cell_metadata="{}" classes="cell" exec_count="7" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> from IPython.display import display, Markdown display(Markdown('**_some_ markdown**')) <container classes="cell_output" nb_element="cell_code_output"> <paragraph> <strong> <emphasis> some markdown �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_file_level_config_ipynb.xml����������������������������0000664�0000000�0000000�00000000523�14674535606�0026564�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="file_level_config"> <section ids="title" names="title"> <title> Title <definition_list classes="simple myst"> <definition_list_item> <term> name <definition> <paragraph> definition �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_file_level_config_md.xml�������������������������������0000664�0000000�0000000�00000000523�14674535606�0026043�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="file_level_config"> <section ids="title" names="title"> <title> Title <definition_list classes="simple myst"> <definition_list_item> <term> name <definition> <paragraph> definition �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_hide_cell_content.xml����������������������������������0000664�0000000�0000000�00000006635�14674535606�0025404�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="hide_cell_content"> <section ids="hide-code-cell-content" names="hide\ code\ cell\ content"> <title> Hide Code Cell Content <container cell_index="1" cell_metadata="{'tags': ['hide-input']}" classes="cell tag_hide-input" exec_count="1" hide_mode="input" nb_element="cell_code" prompt_hide="Hide code cell {type}" prompt_show="Show code cell {type}"> <HideCodeCellNode classes="above-input" prompt_hide="Hide code cell source" prompt_show="Show code cell source"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> print("hide-input") <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve"> hide-input <container cell_index="2" cell_metadata="{'tags': ['hide-output']}" classes="cell tag_hide-output" exec_count="2" hide_mode="output" nb_element="cell_code" prompt_hide="Hide code cell {type}" prompt_show="Show code cell {type}"> <container classes="cell_input above-output-prompt" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> print("hide-output") <HideCodeCellNode classes="below-input" prompt_hide="Hide code cell output" prompt_show="Show code cell output"> <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve"> hide-output <container cell_index="3" cell_metadata="{'tags': ['hide-cell']}" classes="cell tag_hide-cell" exec_count="4" hide_mode="all" nb_element="cell_code" prompt_hide="Hide code cell {type}" prompt_show="Show code cell {type}"> <HideCodeCellNode classes="above-input" prompt_hide="Hide code cell content" prompt_show="Show code cell content"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> print("hide-cell") <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve"> hide-cell <container cell_index="4" cell_metadata="{'tags': ['hide-cell'], 'mystnb': {'code_prompt_show': 'My show message', 'code_prompt_hide': 'My hide message'}}" classes="cell tag_hide-cell" exec_count="5" hide_mode="all" nb_element="cell_code" prompt_hide="My hide message" prompt_show="My show message"> <HideCodeCellNode classes="above-input" prompt_hide="My hide message" prompt_show="My show message"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> print("hide-cell custom message") <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve"> hide-cell custom message ���������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_merge_streams.xml��������������������������������������0000664�0000000�0000000�00000002266�14674535606�0024573�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="merge_streams"> <container cell_index="0" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import sys print('stdout1', file=sys.stdout) print('stdout2', file=sys.stdout) print('stderr1', file=sys.stderr) print('stderr2', file=sys.stderr) print('stdout3', file=sys.stdout) print('stderr3', file=sys.stderr) 1 <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve"> stdout1 stdout2 stdout3 <literal_block classes="output stderr" language="myst-ansi" linenos="False" xml:space="preserve"> stderr1 stderr2 stderr3 <literal_block classes="output text_plain" language="myst-ansi" linenos="False" xml:space="preserve"> 1 ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_merge_streams_parallel.xml�����������������������������0000664�0000000�0000000�00000002136�14674535606�0026443�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="merge_streams_parallel"> <container cell_index="0" cell_metadata="{'execution': {'iopub.execute_input': '2024-09-19T21:44:29.809012Z', 'iopub.status.busy': '2024-09-19T21:44:29.808809Z', 'iopub.status.idle': '2024-09-19T21:44:29.978481Z', 'shell.execute_reply': '2024-09-19T21:44:29.977891Z'}}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> from concurrent.futures import ProcessPoolExecutor with ProcessPoolExecutor() as executor: for i in executor.map(print, [0] * 10): pass <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" linenos="False" xml:space="preserve"> 0 0 0 0 0 0 0 0 0 0 ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_metadata_figure.xml������������������������������������0000664�0000000�0000000�00000002521�14674535606�0025051�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="metadata_figure"> <section ids="formatting-code-outputs" names="formatting\ code\ outputs"> <title> Formatting code outputs <container cell_index="1" cell_metadata="{'myst': {'figure': {'caption': 'Hey everyone its **party** time!\n', 'name': 'fun-fish'}}}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> from IPython.display import Image Image("fun-fish.png") <container classes="cell_output" nb_element="cell_code_output"> <figure align="default" ids="fun-fish" names="fun-fish"> <image candidates="{'*': '_build/jupyter_execute/3eacaf6adad1a4305807616181bbee897bb29177e79e2092ddd0264b848ddb4e.png'}" uri="_build/jupyter_execute/3eacaf6adad1a4305807616181bbee897bb29177e79e2092ddd0264b848ddb4e.png"> <caption> Hey everyone its <strong> party time! <paragraph> Link: <reference internal="True" refid="fun-fish"> <inline classes="std std-ref"> swim to the fish �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_metadata_image.xml�������������������������������������0000664�0000000�0000000�00000001735�14674535606�0024660�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="metadata_image"> <section ids="formatting-code-outputs" names="formatting\ code\ outputs"> <title> Formatting code outputs <container cell_index="1" cell_metadata="{'myst': {'image': {'alt': 'fun-fish', 'classes': 'shadow bg-primary', 'width': '300px'}}}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> from IPython.display import Image Image("fun-fish.png") <container classes="cell_output" nb_element="cell_code_output"> <image alt="fun-fish" candidates="{'*': '_build/jupyter_execute/3eacaf6adad1a4305807616181bbee897bb29177e79e2092ddd0264b848ddb4e.png'}" classes="shadow bg-primary" uri="_build/jupyter_execute/3eacaf6adad1a4305807616181bbee897bb29177e79e2092ddd0264b848ddb4e.png" width="300px"> �����������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_metadata_image_output.xml������������������������������0000664�0000000�0000000�00000003451�14674535606�0026275�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="metadata_image_output"> <section ids="output-metadata" names="output\ metadata"> <title> Output metadata <container cell_index="1" cell_metadata="{'tags': ['skip-execution']}" classes="cell tag_skip-execution" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> # Outputs included with width/height in output metadata, # cell is not executed from IPython.display import Image Image(filename="./example.jpg", width=500, height=100) <container classes="cell_output" nb_element="cell_code_output"> <image candidates="{'*': '_build/jupyter_execute/a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg'}" height="100" uri="_build/jupyter_execute/a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg" width="500"> <container cell_index="2" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> # No outputs, cell is executed, image should have original size (370, 254) from IPython.display import Image Image(filename="./example.jpg") <container classes="cell_output" nb_element="cell_code_output"> <image candidates="{'*': '_build/jupyter_execute/a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg'}" uri="_build/jupyter_execute/a4c9580c74dacf6f3316a3bd2e2a347933aa4463834dcf1bb8f20b4fcb476ae1.jpg"> �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_stderr_remove.xml��������������������������������������0000664�0000000�0000000�00000001570�14674535606�0024613�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_stderr"> <container cell_index="0" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import sys print('hallo', file=sys.stderr) <container classes="cell_output" nb_element="cell_code_output"> <container cell_index="1" cell_metadata="{'tags': ['remove-stderr']}" classes="cell tag_remove-stderr" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import sys print('hallo', file=sys.stderr) <container classes="cell_output" nb_element="cell_code_output"> ����������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_render_outputs/test_stderr_tag.xml�����������������������������������������0000664�0000000�0000000�00000001774�14674535606�0024077�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_stderr"> <container cell_index="0" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import sys print('hallo', file=sys.stderr) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stderr" language="myst-ansi" linenos="False" xml:space="preserve"> hallo <container cell_index="1" cell_metadata="{'tags': ['remove-stderr']}" classes="cell tag_remove-stderr" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> import sys print('hallo', file=sys.stderr) <container classes="cell_output" nb_element="cell_code_output"> ����MyST-NB-1.1.2/tests/test_render_outputs/test_unknown_mimetype.xml�����������������������������������0000664�0000000�0000000�00000000635�14674535606�0025344�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="unknown_mimetype"> <container cell_index="0" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" linenos="False" xml:space="preserve"> a=1 print(a) <container classes="cell_output" nb_element="cell_code_output"> ���������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_text_based.py��������������������������������������������������������������0000664�0000000�0000000�00000004334�14674535606�0017565�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import pytest @pytest.mark.sphinx_params( "basic_unrun.md", conf={"nb_execution_mode": "cache", "source_suffix": {".md": "myst-nb"}}, ) def test_basic_run(sphinx_run, file_regression, check_nbs): sphinx_run.build() # print(sphinx_run.status()) assert sphinx_run.warnings() == "" assert set(sphinx_run.env.metadata["basic_unrun"].keys()) == { "file_format", "author", "source_map", "wordcount", "kernelspec", "language_info", } assert set(sphinx_run.env.nb_metadata["basic_unrun"].keys()) == { "exec_data", } assert sphinx_run.env.metadata["basic_unrun"]["author"] == "Chris" assert sphinx_run.env.metadata["basic_unrun"]["kernelspec"] == { "display_name": "Python 3", "language": "python", "name": "python3", } file_regression.check( sphinx_run.get_nb(), check_fn=check_nbs, extension=".ipynb", encoding="utf-8" ) file_regression.check( sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8" ) @pytest.mark.sphinx_params( "basic_unrun.md", conf={"nb_execution_mode": "off", "source_suffix": {".md": "myst-nb"}}, ) def test_basic_run_exec_off(sphinx_run, file_regression, check_nbs): sphinx_run.build() # print(sphinx_run.status()) assert set(sphinx_run.env.metadata["basic_unrun"].keys()) == { "file_format", "author", "source_map", "wordcount", "kernelspec", } assert set(sphinx_run.env.nb_metadata["basic_unrun"].keys()) == set() assert sphinx_run.env.metadata["basic_unrun"]["author"] == "Chris" file_regression.check( sphinx_run.get_nb(), check_fn=check_nbs, extension=".ipynb", encoding="utf-8" ) file_regression.check( sphinx_run.get_doctree().pformat(), extension=".xml", encoding="utf-8" ) @pytest.mark.sphinx_params( "basic_nometadata.md", conf={"nb_execution_mode": "off", "source_suffix": {".md": "myst-nb"}}, ) def test_basic_nometadata(sphinx_run): """A myst-markdown notebook with no jupytext metadata should raise a warning.""" sphinx_run.build() # print(sphinx_run.status()) assert "Found an unexpected `code-cell`" in sphinx_run.warnings() ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_text_based/����������������������������������������������������������������0000775�0000000�0000000�00000000000�14674535606�0017207�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_text_based/test_basic_run.ipynb��������������������������������������������0000664�0000000�0000000�00000002172�14674535606�0023260�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "id": "f0dc5a7d", "metadata": {}, "source": [ "# a title\n", "\n", "this was created using `jupytext --to myst tests/notebooks/basic_unrun.ipynb`" ] }, { "cell_type": "code", "execution_count": 1, "id": "49a06520", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "a=1\n", "print(a)" ] } ], "metadata": { "author": "Chris", "jupytext": { "text_representation": { "extension": ".md", "format_name": "myst", "format_version": "0.8", "jupytext_version": "1.4.1+dev" } }, "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.10" }, "source_map": [ 13, 19 ] }, "nbformat": 4, "nbformat_minor": 5 } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_text_based/test_basic_run.xml����������������������������������������������0000664�0000000�0000000�00000001374�14674535606�0022742�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_unrun"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> this was created using <literal> jupytext --to myst tests/notebooks/basic_unrun.ipynb <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="1" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="ipython3" xml:space="preserve"> a=1 print(a) <container classes="cell_output" nb_element="cell_code_output"> <literal_block classes="output stream" language="myst-ansi" xml:space="preserve"> 1 ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_text_based/test_basic_run_exec_off.ipynb�����������������������������������0000664�0000000�0000000�00000001412�14674535606�0025112�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "cells": [ { "cell_type": "markdown", "id": "f1b10cf9", "metadata": {}, "source": [ "# a title\n", "\n", "this was created using `jupytext --to myst tests/notebooks/basic_unrun.ipynb`" ] }, { "cell_type": "code", "execution_count": null, "id": "9daa25c2", "metadata": {}, "outputs": [], "source": [ "a=1\n", "print(a)" ] } ], "metadata": { "author": "Chris", "jupytext": { "text_representation": { "extension": ".md", "format_name": "myst", "format_version": "0.8", "jupytext_version": "1.4.1+dev" } }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "source_map": [ 13, 19 ] }, "nbformat": 4, "nbformat_minor": 5 } ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tests/test_text_based/test_basic_run_exec_off.xml�������������������������������������0000664�0000000�0000000�00000001071�14674535606�0024572�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������<document source="basic_unrun"> <section ids="a-title" names="a\ title"> <title> a title <paragraph> this was created using <literal> jupytext --to myst tests/notebooks/basic_unrun.ipynb <container cell_index="1" cell_metadata="{}" classes="cell" exec_count="True" nb_element="cell_code"> <container classes="cell_input" nb_element="cell_code_source"> <literal_block language="python" xml:space="preserve"> a=1 print(a) �����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������MyST-NB-1.1.2/tox.ini�������������������������������������������������������������������������������0000664�0000000�0000000�00000002333�14674535606�0014200�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������# To use tox, see https://tox.readthedocs.io # Simply pip or conda install tox # If you use conda, you may also want to install tox-conda # then run `tox` or `tox -- {pytest args}` # To run in parallel using `tox -p` (this does not appear to work for this repo) # To rebuild the tox environment, for example when dependencies change, use # `tox -r` # Note: if the following error is encountered: `ImportError while loading conftest` # then then deleting compiled files has been found to fix it: `find . -name \*.pyc -delete` [tox] envlist = py311-sphinx7 [testenv] usedevelop = true [testenv:py{39,310,311,312}-sphinx{5,6,7,8}] extras = testing deps = sphinx5: sphinx>=5,<6 sphinx6: sphinx>=6,<7 sphinx7: sphinx>=7,<8 sphinx8: sphinx>=8,<9 commands = pytest {posargs} [testenv:docs-{update,clean}] extras = rtd deps = ipython setenv = BUILDER = {env:BUILDER:html} whitelist_externals = echo rm commands = clean: rm -rf docs/_build sphinx-build {posargs} -nW --keep-going -b {env:BUILDER} docs/ docs/_build/{env:BUILDER} commands_post = echo "open file://{toxinidir}/docs/_build/{env:BUILDER}/index.html" [pytest] markers = sphinx_params: Specify parameters to pass to the sphinx_run fixture �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������